ZGlmZiAtLWdpdCBhL2J1aWxkLnhtbCBiL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FiZWEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzxwcm9qZWN0IG5hbWU9IlNoYWRvd0pkdENvcmUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdldC50YWciPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWciIHZhbHVlPSJSMl8wIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS5yb290IiB2YWx1ZT0iOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovaG9tZS9lY2xpcHNlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlbXAuZGlyIiB2YWx1ZT0iL3RlbXAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibmV3LmRpciIgdmFsdWU9Ii4iLz4KKworICAgIDx0YXJnZXQgbmFtZT0iZ2V0LmFzcGVjdGoiPgorICAgICAgICA8Y3ZzIGN2c1Jvb3Q9IjpleHRzc2g6amh1Z3VuaW5AZGV2LmVjbGlwc2Uub3JnOi9ob21lL3RlY2hub2xvZ3kiIHBhY2thZ2U9Im9yZy5hc3BlY3RqIiBkZXN0PSIuIi8+CisgICAgPC90YXJnZXQ+CisKKyAKKworICAgIDx0YXJnZXQgbmFtZT0iZ2V0LnRhZyI+CisgICAgICAgIDxkZWxldGU+CisgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke25ldy5kaXJ9LyR7cGFja2FnZX0iLz4KKyAgICAgICAgPC9kZWxldGU+CisgICAgICAgIDxkZWxldGU+CisgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RlbXAuZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJubyIvPgorICAgICAgICA8L2RlbGV0ZT4KKworICAgICAgICA8Y3ZzIGN2c1Jvb3Q9IiR7ZWNsaXBzZS5yb290fSIgcGFja2FnZT0iJHtwYWNrYWdlfSIgZGVzdD0iJHt0ZW1wLmRpcn0iIHRhZz0iJHt0YWd9Ii8+CisKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7bmV3LmRpcn0iPgorICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZW1wLmRpcn0iLz4KKyAgICAgICAgPC9jb3B5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21taXQudGFnIj4KKyAgICAgICAgPGN2cyBkZXN0PSIke25ldy5kaXJ9IiBjb21tYW5kPSJjb21taXQiLz4KKyAgICAgICAgPGN2cyBkZXN0PSIke25ldy5kaXJ9IiBjb21tYW5kPSJ0YWcgJHt0YWd9Ii8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0OTdkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5jbGFzc3BhdGgKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iYW50YWRhcHRlciIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImJhdGNoIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29kZWFzc2lzdCIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbXBpbGVyIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZG9tIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXZhbCIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZvcm1hdHRlciIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZGVsIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VhcmNoIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5hcGFjaGUueGVyY2VzIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+CisgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuYXBhY2hlLmFudCIvPgorICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZjlhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucwpAQCAtMCwwICsxLDM4IEBACisjIFR1cm4gb24gZGVidWcgdHJhY2luZyBmb3Igb3JnLmVjbGlwc2UuamR0LmNvcmUgcGx1Z2luDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWc9dHJ1ZQ0KKw0KKyMgUmVwb3J0cyBiYWNrZ3JvdW5kIGluZGV4ZXIgYWN0aXZpdHk6IGluZGV4aW5nLCBzYXZpbmcgaW5kZXggZmlsZSwgaW5kZXggcXVlcmllcw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2luZGV4bWFuYWdlcj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBjb21waWxlciBhY3Rpdml0eQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyPWZhbHNlDQorDQorIyBSZXBvcnRzIEphdmEgbW9kZWwgZWxlbWVudHMgb3BlbmluZy9jbG9zaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsPWZhbHNlDQorDQorIyBSZXBvcnRzIHNoYXJlZCB3b3JraW5nIGNvcHkgdXNlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2hhcmVkd29ya2luZ2NvcHk9ZmFsc2UNCisNCisjIFJlcG9ydHMgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLCBhbmQgY2xhc3NwYXRoIGNvbnRhaW5lciByZXNvbHV0aW9uDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uPWZhbHNlDQorDQorIyBSZXBvcnRzIGFjY2VzcyB0byB6aXAgYW5kIGphciBmaWxlcyB0aHJvdWdoIHRoZSBKYXZhIG1vZGVsDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzPWZhbHNlDQorDQorIyBQcmludCBub3RpZmllZCBKYXZhIGVsZW1lbnQgZGVsdGFzDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhPWZhbHNlDQorDQorIyBSZXBvcnQgdHlwZSBoaWVyYXJjaHkgY29ubmVjdGlvbnMsIHJlZnJlc2hlcyBhbmQgZGVsdGFzDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5PWZhbHNlDQorDQorIyBSZXBvcnRzIGluY3JlbWVudGFsIGJ1aWxkZXIgYWN0aXZpdHkgOiBuYXR1cmUgb2YgYnVpbGQsIGJ1aWx0IHN0YXRlIHJlYWRpbmcsIGluZGljdG1lbnQgcHJvY2Vzcw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXI9ZmFsc2UNCisNCisjIFJlcG9ydHMgY29kZWFzc2lzdCBjb21wbGV0aW9uIGFjdGl2aXR5IDogcmVjb3ZlcmVkIHVuaXQsIGluZmVycmVkIGNvbXBsZXRpb25zDQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGxldGlvbj1mYWxzZQ0KKw0KKyMgUmVwb3J0cyBvcGVuIG9uIHNlbGVjdGlvbiBhY3Rpdml0eSA6IHJlY292ZXJlZCB1bml0LCBpbmZlcnJlZCBzZWxlY3Rpb24NCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWxlY3Rpb249ZmFsc2UNCisNCisjIFJlcG9ydHMgamF2YSBzZWFyY2ggYWN0aXZpdHkNCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2g9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzhmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS8ucHJvamVjdApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCQk8cHJvamVjdD5vcmcuYXBhY2hlLmFudDwvcHJvamVjdD4KKwkJPHByb2plY3Q+b3JnLmFwYWNoZS54ZXJjZXM8L3Byb2plY3Q+CisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTQzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisKKzxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCis8aDM+TGljZW5zZTwvaDM+Cis8cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8aDM+Q29udHJpYnV0aW9uczwvaDM+CisKKzxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQorbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAorQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgorCis8cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKK290aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCitob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCit0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbworcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKK3RoZSBDUEwuPC9wPgorCis8aDM+RGlzYXNzZW1ibGVyPC9oMz4KKzxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBhIGJ5dGVjb2RlIGRpc2Fzc2VtYmxlciAoJnF1b3Q7RGlzYXNzZW1ibGVyJnF1b3Q7KSB0aGF0IGNhbiBwcm9kdWNlIGEgbGlzdGluZyBvZiB0aGUgSmF2YSBhc3NlbWJsZXIgbW5lbW9uaWNzICgmcXVvdDtBc3NlbWJsZXIgTW5lbW9uaWNzJnF1b3Q7KSBmb3IgYSBKYXZhIG1ldGhvZC4gIElmIHlvdSAKK3VzZSB0aGUgRGlzYXNzZW1ibGVyIHRvIHZpZXcgdGhlIEFzc2VtYmxlciBNbmVtb25pY3MgZm9yIGEgbWV0aG9kLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IGRvaW5nIHNvIHdpbGwgbm90IHZpb2xhdGUgdGhlIHRlcm1zIG9mIGFueSBsaWNlbnNlcyB0aGF0IGFwcGx5IHRvIHlvdXIgdXNlIG9mIHRoYXQgbWV0aG9kLCBhcworc3VjaCBsaWNlbnNlcyBtYXkgbm90IHBlcm1pdCB5b3UgdG8gcmV2ZXJzZSBlbmdpbmVlciwgZGVjb21waWxlLCBvciBkaXNhc3NlbWJsZSBtZXRob2QgYnl0ZWNvZGVzLjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvSkRUQ29tcGlsZXJBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0pEVENvbXBpbGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NGFlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0pEVENvbXBpbGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVycy5EZWZhdWx0Q29tcGlsZXJBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworLyoqCisgKiBBbnQgY29tcGlsZXIgYWRhcHRlciBmb3IgdGhlIEVjbGlwc2UgSmF2YSBjb21waWxlci4gVGhpcyBhZGFwdGVyIHBlcm1pdHMgdGhlCisgKiBFY2xpcHNlIEphdmEgY29tcGlsZXIgdG8gYmUgdXNlZCB3aXRoIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4gdGFzayBpbiBBbnQgc2NyaXB0cy4gSW4gb3JkZXIKKyAqIHRvIHVzZSBpdCwganVzdCBzZXQgdGhlIHByb3BlcnR5IDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBhcyBmb2xsb3dzOgorICogPHA+CisgKiA8Y29kZT4mbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLyZndDs8L2NvZGU+CisgKiA8L3A+CisgKiA8cD4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEFudCBjaGVjayBvdXQgdGhlIHdlYnNpdGUgYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQvIC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSkRUQ29tcGlsZXJBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXBpbGVyQ2xhc3MgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4iOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBKRFQgYmF0Y2ggY29tcGlsZXIgCisJICovCisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCWF0dHJpYnV0ZXMubG9nKFV0aWwuYmluZCgiYW50LmpkdGFkYXB0ZXIuaW5mby51c2luZ0pkdENvbXBpbGVyIiksIFByb2plY3QuTVNHX1ZFUkJPU0UpOyAvLyROT04tTkxTLTEkCisJCUNvbW1hbmRsaW5lIGNtZCA9IHNldHVwSmF2YWNDb21tYW5kKCk7CisKKwkJdHJ5IHsKKwkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKGNvbXBpbGVyQ2xhc3MpOworCQkJTWV0aG9kIGNvbXBpbGUgPSBjLmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nW10uY2xhc3MgfSk7IC8vJE5PTi1OTFMtMSQKKwkJCWNvbXBpbGUuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IGNtZC5nZXRBcmd1bWVudHMoKX0pOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihVdGlsLmJpbmQoImFudC5qZHRhZGFwdGVyLmVycm9yLm1pc3NpbmdKRFRDb21waWxlciIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCQorCXByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cEphdmFjQ29tbWFuZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCUNvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworCQkKKwkJLyoKKwkJICogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBuZXZlciBleGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFudCB0YXNrLiAKKwkJICovCisJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm9FeGl0Iik7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEVjbGlwc2UgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IGJvb3RjbGFzc3BhdGggZGlyICgtYm9vdGNsYXNzcGF0aCkuCisgICAgICAgICAqIEl0IGlzIGVtdWxhdGVkIHVzaW5nIHRoZSBjbGFzc3BhdGguIFdlIGFkZCBib290Y2xhc3NwYXRoIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICAgICogdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwgJiYgYm9vdGNsYXNzcGF0aC5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChib290Y2xhc3NwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBObyBib290Y2xhc3NwYXRoLCB3ZSB3aWxsIGFkZCBvbmUgdGhyb3VnaHQgdGhlIEpSRV9MSUIgdmFyaWFibGUKKyAgICAgICAgICAgICAqLworCQkJSVBhdGgganJlX2xpYiA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKCJKUkVfTElCIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChqcmVfbGliID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVXRpbC5iaW5kKCJhbnQuamR0YWRhcHRlci5lcnJvci5taXNzaW5nSlJFTElCIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQljbGFzc3BhdGguYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwganJlX2xpYi50b09TU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEVjbGlwc2UgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IC1leHRkaXJzLgorICAgICAgICAgKiBJdCBpcyBlbXVsYXRlZCB1c2luZyB0aGUgY2xhc3NwYXRoLiBXZSBhZGQgZXh0ZGlycyBlbnRyaWVzIGFmdGVyIHRoZSAKKyAgICAgICAgICogYm9vdGNsYXNzcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIGFkZEV4dGRpcnMoZXh0ZGlycywgY2xhc3NwYXRoKTsKKworCQkvKgorCQkgKiBUaGUgamF2YSBydW50aW1lIGlzIGFscmVhZHkgaGFuZGxlZCwgc28gd2Ugc2ltcGx5IHdhbnQgdG8gcmV0cmlldmUgdGhlCisJCSAqIGFudCBydW50aW1lIGFuZCB0aGUgY29tcGlsZSBjbGFzc3BhdGguCisJCSAqLworCQlpbmNsdWRlSmF2YVJ1bnRpbWUgPSBmYWxzZTsKKyAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChnZXRDb21waWxlQ2xhc3NwYXRoKCkpOworCisJCS8qCisJCSAqIFNldCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgRWNsaXBzZSBjb21waWxlci4KKwkJICovCisJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjbGFzc3BhdGgpOworCisJCS8qCisJCSAqIEhhbmRsZSB0aGUgbm93YXJuIG9wdGlvbi4gSWYgbm9uZSwgdGhlbiB3ZSBnZW5lcmF0ZSBhbGwgd2FybmluZ3MuCisJCSAqLwkJCisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldE5vd2FybigpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vd2FybiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0gZWxzZSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgKKwkJCQkiLXdhcm46Y29uc3RydWN0b3JOYW1lLHBhY2thZ2VEZWZhdWx0TWV0aG9kLG1hc2tlZENhdGNoQmxvY2tzLGRlcHJlY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorCisJCS8qCisJCSAqIGRlcHJlY2F0aW9uIG9wdGlvbi4KKwkJICovCQkKKwkJaWYgKGRlcHJlY2F0aW9uKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRlcHJlY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8qCisJCSAqIGRlc3REaXIgb3B0aW9uLgorCQkgKi8JCQorCQlpZiAoZGVzdERpciAhPSBudWxsKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyLmdldEFic29sdXRlRmlsZSgpKTsKKwkJfQorCisJCS8qCisJCSAqIHRhcmdldCBvcHRpb24uCisJCSAqLwkJCisJCWlmICh0YXJnZXQgIT0gbnVsbCkgeworCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10YXJnZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0KTsKKwkJfQorCisJCS8qCisJCSAqIGRlYnVnIG9wdGlvbgorCQkgKi8KKwkJaWYgKGRlYnVnKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWciKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJLyoKKwkJICogdmVyYm9zZSBvcHRpb24KKwkJICovCisJCWlmICh2ZXJib3NlKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcmJvc2UiKTsgLy8kTk9OLU5MUy0xJAorCQkJLyoKKwkJCSAqIGV4dHJhIG9wdGlvbiBhbGxvd2VkIGJ5IHRoZSBFY2xpcHNlIGNvbXBpbGVyCisJCQkgKi8KKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbG9nIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQkvKgorCQkgKiBmYWlsbm9lcnJvciBvcHRpb24KKwkJICovCisJCWlmICghYXR0cmlidXRlcy5nZXRGYWlsb25lcnJvcigpKSB7CisJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXByb2NlZWRPbkVycm9yIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8qCisJCSAqIGV4dHJhIG9wdGlvbiBhbGxvd2VkIGJ5IHRoZSBFY2xpcHNlIGNvbXBpbGVyCisJCSAqLworCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXRpbWUiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8qCisJCSAqIGV4dHJhIG9wdGlvbiBhbGxvd2VkIGJ5IHRoZSBFY2xpcHNlIGNvbXBpbGVyCisJCSAqLworCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vSW1wb3J0RXJyb3IiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8qCisJCSAqIHNvdXJjZSBvcHRpb24KKwkJICovCisJCVN0cmluZyBzb3VyY2UgPSBhdHRyaWJ1dGVzLmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHNvdXJjZSk7CisgICAgICAgIH0KKworCQkvKgorCQkgKiBlbmNvZGluZyBvcHRpb24KKwkJICovCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGVuY29kaW5nKTsKKyAgICAgICAgfQorCisJCS8qCisJCSAqIEVjbGlwc2UgY29tcGlsZXIgZG9lc24ndCBoYXZlIGEgLXNvdXJjZXBhdGggb3B0aW9uLiBUaGlzIGlzCisJCSAqIGhhbmRsZWQgdGhyb3VnaCB0aGUgamF2YWMgdGFzayB0aGF0IGNvbGxlY3RzIGFsbCBzb3VyY2UgZmlsZXMgaW4KKwkJICogc3JjZGlyIG9wdGlvbi4KKwkJICovICAgICAgICAKKyAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKwkJcmV0dXJuIGNtZDsKKwl9CisJCisgICAgLyoqCisgICAgICogRW11bGF0aW9uIG9mIGV4dGRpcnMgZmVhdHVyZSBpbiBqYXZhID49IDEuMi4KKyAgICAgKiBUaGlzIG1ldGhvZCBhZGRzIGFsbCBmaWxlcyBpbiB0aGUgZ2l2ZW4KKyAgICAgKiBkaXJlY3RvcmllcyAoYnV0IG5vdCBpbiBzdWItZGlyZWN0b3JpZXMhKSB0byB0aGUgY2xhc3NwYXRoLAorICAgICAqIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gc3BlY2lmeSB0aGVtIGFsbCBvbmUgYnkgb25lLgorICAgICAqIEBwYXJhbSBleHRkaXJzIC0gUGF0aCB0byBhcHBlbmQgZmlsZXMgdG8KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRXh0ZGlycyhQYXRoIGV4dGRpcnMsIFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmIChleHRkaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBleHRQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGlmIChleHRQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRkaXJzID0gbmV3IFBhdGgoY2xhc3NwYXRoLmdldFByb2plY3QoKSwgZXh0UHJvcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGRpcnMgPSBleHRkaXJzLmxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGRpciA9IGNsYXNzcGF0aC5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZGlyc1tpXSk7CisgICAgICAgICAgICBpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7CisgICAgICAgICAgICAgICAgZnMuc2V0RGlyKGRpcik7CisgICAgICAgICAgICAgICAgZnMuc2V0SW5jbHVkZXMoIioiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRGaWxlc2V0KGZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZWI3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGlyZWN0b3J5IGltcGxlbWVudHMgRmlsZVN5c3RlbS5DbGFzc3BhdGggeworCitTdHJpbmcgcGF0aDsKK0hhc2h0YWJsZSBkaXJlY3RvcnlDYWNoZTsKK1N0cmluZ1tdIG1pc3NpbmdQYWNrYWdlSG9sZGVyID0gbmV3IFN0cmluZ1sxXTsKK1N0cmluZyBlbmNvZGluZzsKK3B1YmxpYyBpbnQgbW9kZTsgLy8gYWJpbGl0eSB0byBvbmx5IGNvbnNpZGVyIG9uZSBraW5kIG9mIGZpbGVzIChzb3VyY2UgdnMuIGJpbmFyaWVzKSwgYnkgZGVmYXVsdCB1c2UgYm90aAorCitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT1VSQ0UgPSAxOworcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gMjsKKworQ2xhc3NwYXRoRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgZW5jb2RpbmcsIGludCBtb2RlKSB7CisJdGhpcy5tb2RlID0gbW9kZTsKKwl0aGlzLnBhdGggPSBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCk7CisJaWYgKCFwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKKwkJdGhpcy5wYXRoICs9IEZpbGUuc2VwYXJhdG9yOworCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKDExKTsKKwl0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7Cit9CisKK0NsYXNzcGF0aERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGVuY29kaW5nKSB7CisJdGhpcyhkaXJlY3RvcnksIGVuY29kaW5nLCBTT1VSQ0UgfCBCSU5BUlkpOyAvLyBieSBkZWZhdWx0IGNvbnNpZGVyIGJvdGggc291cmNlcyBhbmQgYmluYXJpZXMKK30KKworU3RyaW5nW10gZGlyZWN0b3J5TGlzdChTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlTdHJpbmdbXSBkaXJMaXN0ID0gKFN0cmluZ1tdKSBkaXJlY3RvcnlDYWNoZS5nZXQocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCWlmIChkaXJMaXN0ID09IG1pc3NpbmdQYWNrYWdlSG9sZGVyKSByZXR1cm4gbnVsbDsgLy8gcGFja2FnZSBleGlzdHMgaW4gYW5vdGhlciBjbGFzc3BhdGggZGlyZWN0b3J5IG9yIGphcgorCWlmIChkaXJMaXN0ICE9IG51bGwpIHJldHVybiBkaXJMaXN0OworCisJRmlsZSBkaXIgPSBuZXcgRmlsZShwYXRoICsgcXVhbGlmaWVkUGFja2FnZU5hbWUpOworCW5vdEZvdW5kIDogaWYgKGRpciAhPSBudWxsICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisJCS8vIG11c3QgcHJvdGVjdCBhZ2FpbnN0IGEgY2FzZSBpbnNlbnNpdGl2ZSBGaWxlIGNhbGwKKwkJLy8gd2FsayB0aGUgcXVhbGlmaWVkUGFja2FnZU5hbWUgYmFja3dhcmRzIGxvb2tpbmcgZm9yIGFuIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnLycKKwkJaW50IGluZGV4ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGVuZ3RoKCk7CisJCWludCBsYXN0ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwkJd2hpbGUgKC0taW5kZXggPiBsYXN0ICYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UocXVhbGlmaWVkUGFja2FnZU5hbWUuY2hhckF0KGluZGV4KSkpIHt9CisJCWlmIChpbmRleCA+IGxhc3QpIHsKKwkJCWlmIChsYXN0ID09IC0xKSB7CisJCQkJaWYgKCFkb2VzRmlsZUV4aXN0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCAiIikpICAvLyROT04tTkxTLTEkIAorCQkJCQlicmVhayBub3RGb3VuZDsKKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcXVhbGlmaWVkUGFja2FnZU5hbWUuc3Vic3RyaW5nKGxhc3QgKyAxKTsKKwkJCQlTdHJpbmcgcGFyZW50UGFja2FnZSA9IHF1YWxpZmllZFBhY2thZ2VOYW1lLnN1YnN0cmluZygwLCBsYXN0KTsKKwkJCQlpZiAoIWRvZXNGaWxlRXhpc3QocGFja2FnZU5hbWUsIHBhcmVudFBhY2thZ2UpKQorCQkJCQlicmVhayBub3RGb3VuZDsKKwkJCX0KKwkJfQorCQlpZiAoKGRpckxpc3QgPSBkaXIubGlzdCgpKSA9PSBudWxsKQorCQkJZGlyTGlzdCA9IG5ldyBTdHJpbmdbMF07CisJCWRpcmVjdG9yeUNhY2hlLnB1dChxdWFsaWZpZWRQYWNrYWdlTmFtZSwgZGlyTGlzdCk7CisJCXJldHVybiBkaXJMaXN0OworCX0KKwlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIG1pc3NpbmdQYWNrYWdlSG9sZGVyKTsKKwlyZXR1cm4gbnVsbDsKK30KK2Jvb2xlYW4gZG9lc0ZpbGVFeGlzdChTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworCVN0cmluZ1tdIGRpckxpc3QgPSBkaXJlY3RvcnlMaXN0KHF1YWxpZmllZFBhY2thZ2VOYW1lKTsKKwlpZiAoZGlyTGlzdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIG1vc3QgY29tbW9uIGNhc2UKKworCWZvciAoaW50IGkgPSBkaXJMaXN0Lmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoZmlsZU5hbWUuZXF1YWxzKGRpckxpc3RbaV0pKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoY2hhcltdIHR5cGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSkgeworCWlmICghaXNQYWNrYWdlKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkgcmV0dXJuIG51bGw7IC8vIG1vc3QgY29tbW9uIGNhc2UKKworCVN0cmluZyBmaWxlTmFtZSA9IG5ldyBTdHJpbmcodHlwZU5hbWUpOworCWJvb2xlYW4gYmluYXJ5RXhpc3RzID0gKCh0aGlzLm1vZGUgJiBCSU5BUlkpICE9IDApICYmIGRvZXNGaWxlRXhpc3QoZmlsZU5hbWUgKyAiLmNsYXNzIiwgcXVhbGlmaWVkUGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCisJYm9vbGVhbiBzb3VyY2VFeGlzdHMgPSAoKHRoaXMubW9kZSAmIFNPVVJDRSkgIT0gMCkgJiYgZG9lc0ZpbGVFeGlzdChmaWxlTmFtZSArICIuamF2YSIsIHF1YWxpZmllZFBhY2thZ2VOYW1lKTsgLy8kTk9OLU5MUy0xJAorCWlmIChzb3VyY2VFeGlzdHMpIHsKKwkJU3RyaW5nIGZ1bGxTb3VyY2VQYXRoID0gcGF0aCArIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZygwLCBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZS5sZW5ndGgoKSAtIDYpICArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKCFiaW5hcnlFeGlzdHMpCisJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihuZXcgQ29tcGlsYXRpb25Vbml0KG51bGwsIGZ1bGxTb3VyY2VQYXRoLCB0aGlzLmVuY29kaW5nKSk7CisKKwkJU3RyaW5nIGZ1bGxCaW5hcnlQYXRoID0gcGF0aCArIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lOworCQlsb25nIGJpbmFyeU1vZGlmaWVkID0gbmV3IEZpbGUoZnVsbEJpbmFyeVBhdGgpLmxhc3RNb2RpZmllZCgpOworCQlsb25nIHNvdXJjZU1vZGlmaWVkID0gbmV3IEZpbGUoZnVsbFNvdXJjZVBhdGgpLmxhc3RNb2RpZmllZCgpOworCQlpZiAoc291cmNlTW9kaWZpZWQgPiBiaW5hcnlNb2RpZmllZCkKKwkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKG5ldyBDb21waWxhdGlvblVuaXQobnVsbCwgZnVsbFNvdXJjZVBhdGgsIHRoaXMuZW5jb2RpbmcpKTsKKwl9CisJaWYgKGJpbmFyeUV4aXN0cykgeworCQl0cnkgeworCQkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IENsYXNzRmlsZVJlYWRlci5yZWFkKHBhdGggKyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7CisJCQlpZiAocmVhZGVyICE9IG51bGwpIHJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHJlYWRlcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAvLyB0cmVhdCBhcyBpZiBmaWxlIGlzIG1pc3NpbmcKKwl9CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJcmV0dXJuIGRpcmVjdG9yeUxpc3QocXVhbGlmaWVkUGFja2FnZU5hbWUpICE9IG51bGw7Cit9CitwdWJsaWMgdm9pZCByZXNldCgpIHsKKwl0aGlzLmRpcmVjdG9yeUNhY2hlID0gbmV3IEhhc2h0YWJsZSgxMSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiQ2xhc3NwYXRoRGlyZWN0b3J5ICIgKyBwYXRoOyAvLyROT04tTkxTLTEkCit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmJmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoSmFyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoSmFyIGltcGxlbWVudHMgRmlsZVN5c3RlbS5DbGFzc3BhdGggeworCQorWmlwRmlsZSB6aXBGaWxlOworSGFzaHRhYmxlIHBhY2thZ2VDYWNoZTsKK2Jvb2xlYW4gY2xvc2VaaXBGaWxlQXRFbmQ7CisKK3B1YmxpYyBDbGFzc3BhdGhKYXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMobmV3IFppcEZpbGUoZmlsZSksIHRydWUpOworfQorcHVibGljIENsYXNzcGF0aEphcihaaXBGaWxlIHppcEZpbGUsIGJvb2xlYW4gY2xvc2VaaXBGaWxlQXRFbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhpcy56aXBGaWxlID0gemlwRmlsZTsKKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG51bGw7CisJdGhpcy5jbG9zZVppcEZpbGVBdEVuZCA9IGNsb3NlWmlwRmlsZUF0RW5kOworfQkKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKGNoYXJbXSB0eXBlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKKwlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpIHJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCisKKwl0cnkgeworCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoemlwRmlsZSwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpOworCQlpZiAocmVhZGVyICE9IG51bGwpIHJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHJlYWRlcik7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IC8vIHRyZWF0IGFzIGlmIGNsYXNzIGZpbGUgaXMgbWlzc2luZworCXJldHVybiBudWxsOworfQorcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworCWlmIChwYWNrYWdlQ2FjaGUgIT0gbnVsbCkKKwkJcmV0dXJuIHBhY2thZ2VDYWNoZS5jb250YWluc0tleShxdWFsaWZpZWRQYWNrYWdlTmFtZSk7CisKKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG5ldyBIYXNodGFibGUoNDEpOworCXBhY2thZ2VDYWNoZS5wdXQoIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwluZXh0RW50cnkgOiBmb3IgKEVudW1lcmF0aW9uIGUgPSB6aXBGaWxlLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7CisJCVN0cmluZyBmaWxlTmFtZSA9ICgoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpOworCisJCS8vIGFkZCB0aGUgcGFja2FnZSBuYW1lICYgYWxsIG9mIGl0cyBwYXJlbnQgcGFja2FnZXMKKwkJaW50IGxhc3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLycpOworCQl3aGlsZSAobGFzdCA+IDApIHsKKwkJCS8vIGV4dHJhY3QgdGhlIHBhY2thZ2UgbmFtZQorCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJaWYgKHBhY2thZ2VDYWNoZS5jb250YWluc0tleShwYWNrYWdlTmFtZSkpCisJCQkJY29udGludWUgbmV4dEVudHJ5OworCQkJcGFja2FnZUNhY2hlLnB1dChwYWNrYWdlTmFtZSwgcGFja2FnZU5hbWUpOworCQkJbGFzdCA9IHBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCcvJyk7CisJCX0KKwl9CisJcmV0dXJuIHBhY2thZ2VDYWNoZS5jb250YWluc0tleShxdWFsaWZpZWRQYWNrYWdlTmFtZSk7Cit9CitwdWJsaWMgdm9pZCByZXNldCgpIHsKKwlpZiAoemlwRmlsZSAhPSBudWxsICYmIGNsb3NlWmlwRmlsZUF0RW5kKSB7CisJCXRyeSB7IHppcEZpbGUuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQorCX0KKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG51bGw7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiQ2xhc3NwYXRoIGZvciBqYXIgZmlsZSAiICsgemlwRmlsZTsgLy8kTk9OLU5MUy0xJAorfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFjNzgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXQgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0IHsKKwlwdWJsaWMgY2hhcltdIGNvbnRlbnRzOworCXB1YmxpYyBjaGFyW10gZmlsZU5hbWU7CisJcHVibGljIGNoYXJbXSBtYWluVHlwZU5hbWU7CisJU3RyaW5nIGVuY29kaW5nOworCQorcHVibGljIENvbXBpbGF0aW9uVW5pdChjaGFyW10gY29udGVudHMsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVuY29kaW5nKSB7CisJdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzOworCWlmIChGaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCWlmIChmaWxlTmFtZS5pbmRleE9mKCJcXCIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gdGhlIGZpbGUgc2VwYXJhdG9yIGlzIFwKKwkJaWYgKGZpbGVOYW1lLmluZGV4T2YoJy8nKSAhPSAtMSkgeworCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwkJfQorCX0KKwl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWUudG9DaGFyQXJyYXkoKTsKKworCWludCBzdGFydCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIikgKyAxOyAvLyROT04tTkxTLTEkCisJaWYgKHN0YXJ0ID09IDAgfHwgc3RhcnQgPCBmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSkgLy8kTk9OLU5MUy0xJAorCQlzdGFydCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCJcXCIpICsgMTsgLy8kTk9OLU5MUy0xJAorCisJaW50IGVuZCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZW5kID09IC0xKQorCQllbmQgPSBmaWxlTmFtZS5sZW5ndGgoKTsKKworCXRoaXMubWFpblR5cGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRvQ2hhckFycmF5KCk7CisJdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworfQorcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwlpZiAoY29udGVudHMgIT0gbnVsbCkKKwkJcmV0dXJuIGNvbnRlbnRzOyAgIC8vIGFuc3dlciB0aGUgY2FjaGVkIHNvdXJjZQorCisJLy8gb3RoZXJ3aXNlIHJldHJpZXZlIGl0CisJdHJ5IHsKKwkJcmV0dXJuIFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KG5ldyBGaWxlKG5ldyBTdHJpbmcoZmlsZU5hbWUpKSwgZW5jb2RpbmcpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwl9CisJcmV0dXJuIG5ldyBjaGFyWzBdOworfQorcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gZmlsZU5hbWU7Cit9CitwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwlyZXR1cm4gbWFpblR5cGVOYW1lOworfQorcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCXJldHVybiBudWxsOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIkNvbXBpbGF0aW9uVW5pdFsiICsgbmV3IFN0cmluZyhmaWxlTmFtZSkgKyAiXSI7ICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlRmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWU5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIEZpbGVGaW5kZXIgeworCXByaXZhdGUgZmluYWwgaW50IElOSVRJQUxfU0laRSA9IDEwOworCXB1YmxpYyBTdHJpbmdbXSByZXN1bHRGaWxlcyA9IG5ldyBTdHJpbmdbSU5JVElBTF9TSVpFXTsKKwlwdWJsaWMgaW50IGNvdW50ZXIgPSAwOworcHVibGljIHZvaWQgZmluZChGaWxlIGYsIFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIHZlcmJvc2UpIHsKKwlpZiAodmVyYm9zZSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oTWFpbi5iaW5kKCJzY2FubmluZy5zdGFydCIsZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkCisJfQorCWZpbmQwKGYsIHBhdHRlcm4sIHZlcmJvc2UpOworCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0RmlsZXMsIDAsIChyZXN1bHRGaWxlcyA9IG5ldyBTdHJpbmdbY291bnRlcl0pLCAwLCBjb3VudGVyKTsKK30KK3B1YmxpYyB2b2lkIGZpbmQwKEZpbGUgZiwgU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gdmVyYm9zZSkgeworCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKwkJU3RyaW5nW10gZmlsZXMgPSBmLmxpc3QoKTsKKwkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlGaWxlIGN1cnJlbnQgPSBuZXcgRmlsZShmLCBmaWxlc1tpXSk7CisJCQlpZiAoY3VycmVudC5pc0RpcmVjdG9yeSgpKSB7CisJCQkJZmluZDAoY3VycmVudCwgcGF0dGVybiwgdmVyYm9zZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdXJyZW50LmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKHBhdHRlcm4pKSB7CisJCQkJCWludCBsZW5ndGg7CisJCQkJCWlmICgobGVuZ3RoID0gcmVzdWx0RmlsZXMubGVuZ3RoKSA9PSBjb3VudGVyKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdEZpbGVzLCAwLCAocmVzdWx0RmlsZXMgPSBuZXcgU3RyaW5nW2xlbmd0aCAqIDJdKSwgMCwgbGVuZ3RoKTsKKwkJCQkJfQorCQkJCQlyZXN1bHRGaWxlc1tjb3VudGVyKytdID0gY3VycmVudC5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQkJaWYgKHZlcmJvc2UgJiYgKGNvdW50ZXIgJSAxMDApID09IDApCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCcuJyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVTeXN0ZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4ZjJlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlU3lzdGVtLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgRmlsZVN5c3RlbSBpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnQgIHsKKwlDbGFzc3BhdGhbXSBjbGFzc3BhdGhzOworCVN0cmluZ1tdIGtub3duRmlsZU5hbWVzOworCisJaW50ZXJmYWNlIENsYXNzcGF0aCB7CisJCU5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoY2hhcltdIHR5cGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7CisJCWJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSk7IAorCQkvKioKKwkJICogVGhpcyBtZXRob2QgcmVzZXRzIHRoZSBlbnZpcm9ubWVudC4gVGhlIHJlc3VsdGluZyBzdGF0ZSBpcyBlcXVpdmFsZW50IHRvCisJCSAqIGEgbmV3IG5hbWUgZW52aXJvbm1lbnQgd2l0aG91dCBjcmVhdGluZyBhIG5ldyBvYmplY3QuCisJCSAqLworCQl2b2lkIHJlc2V0KCk7CisJfQorLyoKKwljbGFzc1BhdGhOYW1lcyBpcyBhIGNvbGxlY3Rpb24gaXMgU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZ1bGwgcGF0aCBvZiBlYWNoIGNsYXNzIHBhdGgKKwlpbml0aWFsRmlsZU5hbWVzIGlzIGEgY29sbGVjdGlvbiBpcyBTdHJpbmdzLCB0aGUgdHJhaWxpbmcgJy5qYXZhJyB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIG5vdCBhbHJlYWR5LgorKi8KKworcHVibGljIEZpbGVTeXN0ZW0oU3RyaW5nW10gY2xhc3NwYXRoTmFtZXMsIFN0cmluZ1tdIGluaXRpYWxGaWxlTmFtZXMsIFN0cmluZyBlbmNvZGluZykgeworCXRoaXMoY2xhc3NwYXRoTmFtZXMsIGluaXRpYWxGaWxlTmFtZXMsIGVuY29kaW5nLCBudWxsKTsKK30KK3B1YmxpYyBGaWxlU3lzdGVtKFN0cmluZ1tdIGNsYXNzcGF0aE5hbWVzLCBTdHJpbmdbXSBpbml0aWFsRmlsZU5hbWVzLCBTdHJpbmcgZW5jb2RpbmcsIGludFtdIGNsYXNzcGF0aERpcmVjdG9yeU1vZGVzKSB7CisJaW50IGNsYXNzcGF0aFNpemUgPSBjbGFzc3BhdGhOYW1lcy5sZW5ndGg7CisJY2xhc3NwYXRocyA9IG5ldyBDbGFzc3BhdGhbY2xhc3NwYXRoU2l6ZV07CisJU3RyaW5nW10gcGF0aE5hbWVzID0gbmV3IFN0cmluZ1tjbGFzc3BhdGhTaXplXTsKKwlpbnQgcHJvYmxlbXNPY2N1cmVkID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aFNpemU7IGkrKykgeworCQl0cnkgeworCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY29udmVydFBhdGhTZXBhcmF0b3JzKGNsYXNzcGF0aE5hbWVzW2ldKSk7CisJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKKwkJCQkJaWYgKGNsYXNzcGF0aERpcmVjdG9yeU1vZGVzID09IG51bGwpeworCQkJCQkJY2xhc3NwYXRoc1tpXSA9IG5ldyBDbGFzc3BhdGhEaXJlY3RvcnkoZmlsZSwgZW5jb2RpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2xhc3NwYXRoc1tpXSA9IG5ldyBDbGFzc3BhdGhEaXJlY3RvcnkoZmlsZSwgZW5jb2RpbmcsIGNsYXNzcGF0aERpcmVjdG9yeU1vZGVzW2ldKTsKKwkJCQkJfQorCQkJCQlwYXRoTmFtZXNbaV0gPSAoKENsYXNzcGF0aERpcmVjdG9yeSkgY2xhc3NwYXRoc1tpXSkucGF0aDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGNsYXNzcGF0aE5hbWVzW2ldLmVuZHNXaXRoKCIuamFyIikgfCAoY2xhc3NwYXRoTmFtZXNbaV0uZW5kc1dpdGgoIi56aXAiKSkpIHsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJY2xhc3NwYXRoc1tpXSA9IHRoaXMuZ2V0Q2xhc3NwYXRoSmFyKGZpbGUpOyAvLyB3aWxsIHRocm93IGFuIElPRXhjZXB0aW9uIGlmIGZpbGUgZG9lcyBub3QgZXhpc3QKKwkJCQlwYXRoTmFtZXNbaV0gPSBjbGFzc3BhdGhOYW1lc1tpXS5zdWJzdHJpbmcoMCwgY2xhc3NwYXRoTmFtZXNbaV0ubGFzdEluZGV4T2YoJy4nKSk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWNsYXNzcGF0aHNbaV0gPSBudWxsOworCQl9CisJCWlmIChjbGFzc3BhdGhzW2ldID09IG51bGwpCisJCQlwcm9ibGVtc09jY3VyZWQrKzsKKwl9CisJaWYgKHByb2JsZW1zT2NjdXJlZCA+IDApIHsKKwkJQ2xhc3NwYXRoW10gbmV3UGF0aHMgPSBuZXcgQ2xhc3NwYXRoW2NsYXNzcGF0aFNpemUgLSBwcm9ibGVtc09jY3VyZWRdOworCQlTdHJpbmdbXSBuZXdOYW1lcyA9IG5ldyBTdHJpbmdbY2xhc3NwYXRoU2l6ZSAtIHByb2JsZW1zT2NjdXJlZF07CisJCWZvciAoaW50IGkgPSAwLCBjdXJyZW50ID0gMDsgaSA8IGNsYXNzcGF0aFNpemU7IGkrKykKKwkJCWlmIChjbGFzc3BhdGhzW2ldICE9IG51bGwpIHsKKwkJCQluZXdQYXRoc1tjdXJyZW50XSA9IGNsYXNzcGF0aHNbaV07CisJCQkJbmV3TmFtZXNbY3VycmVudCsrXSA9IHBhdGhOYW1lc1tpXTsKKwkJCX0KKwkJY2xhc3NwYXRoU2l6ZSA9IG5ld1BhdGhzLmxlbmd0aDsKKwkJY2xhc3NwYXRocyA9IG5ld1BhdGhzOworCQlwYXRoTmFtZXMgPSBuZXdOYW1lczsKKwl9CisKKwlrbm93bkZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbaW5pdGlhbEZpbGVOYW1lcy5sZW5ndGhdOworCWZvciAoaW50IGkgPSBpbml0aWFsRmlsZU5hbWVzLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCVN0cmluZyBmaWxlTmFtZSA9IGluaXRpYWxGaWxlTmFtZXNbaV07CisJCVN0cmluZyBtYXRjaGluZ1BhdGhOYW1lID0gbnVsbDsKKwkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKKwkJCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOyAvLyByZW1vdmUgdHJhaWxpbmcgIi5qYXZhIgorCisJCWZpbGVOYW1lID0gY29udmVydFBhdGhTZXBhcmF0b3JzKGZpbGVOYW1lKTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc3BhdGhTaXplOyBqKyspCisJCQlpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aChwYXRoTmFtZXNbal0pKQorCQkJCW1hdGNoaW5nUGF0aE5hbWUgPSBwYXRoTmFtZXNbal07CisJCWlmIChtYXRjaGluZ1BhdGhOYW1lID09IG51bGwpCisJCQlrbm93bkZpbGVOYW1lc1tpXSA9IGZpbGVOYW1lOyAvLyBsZWF2ZSBhcyBpcy4uLgorCQllbHNlCisJCQlrbm93bkZpbGVOYW1lc1tpXSA9IGZpbGVOYW1lLnN1YnN0cmluZyhtYXRjaGluZ1BhdGhOYW1lLmxlbmd0aCgpKTsKKwl9Cit9CitwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworCWZvciAoaW50IGkgPSAwLCBtYXggPSBjbGFzc3BhdGhzLmxlbmd0aDsgaSA8IG1heDsgaSsrKQorCQljbGFzc3BhdGhzW2ldLnJlc2V0KCk7Cit9Citwcml2YXRlIFN0cmluZyBjb252ZXJ0UGF0aFNlcGFyYXRvcnMoU3RyaW5nIHBhdGgpIHsKKwlyZXR1cm4gRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJworCQk/IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCisJCSA6IHBhdGgucmVwbGFjZSgnLycsICdcXCcpOworfQorcHJpdmF0ZSBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgY2hhcltdIHR5cGVOYW1lKXsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25GaWxlTmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5lcXVhbHMoa25vd25GaWxlTmFtZXNbaV0pKQorCQkJcmV0dXJuIG51bGw7IC8vIGxvb2tpbmcgZm9yIGEgZmlsZSB3aGljaCB3ZSBrbm93IHdhcyBwcm92aWRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbgorCisJU3RyaW5nIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSA9CisJCXF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpID09IHR5cGVOYW1lLmxlbmd0aAorCQkJPyAiIiAvLyROT04tTkxTLTEkCisJCQk6IHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZygwLCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKSAtIHR5cGVOYW1lLmxlbmd0aCAtIDEpOworCVN0cmluZyBxcDIgPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nID8gcXVhbGlmaWVkUGFja2FnZU5hbWUgOiBxdWFsaWZpZWRQYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwlpZiAocXVhbGlmaWVkUGFja2FnZU5hbWUgPT0gcXAyKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc3BhdGhzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gY2xhc3NwYXRoc1tpXS5maW5kQ2xhc3ModHlwZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7CisJCQlpZiAoYW5zd2VyICE9IG51bGwpIHJldHVybiBhbnN3ZXI7CisJCX0KKwl9IGVsc2UgeworCQlTdHJpbmcgcWIyID0gcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc3BhdGhzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlDbGFzc3BhdGggcCA9IGNsYXNzcGF0aHNbaV07CisJCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gKHAgaW5zdGFuY2VvZiBDbGFzc3BhdGhKYXIpCisJCQkJPyBwLmZpbmRDbGFzcyh0eXBlTmFtZSwgcXVhbGlmaWVkUGFja2FnZU5hbWUsIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKQorCQkJCTogcC5maW5kQ2xhc3ModHlwZU5hbWUsIHFwMiwgcWIyKTsKKwkJCWlmIChhbnN3ZXIgIT0gbnVsbCkgcmV0dXJuIGFuc3dlcjsKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CisJaWYgKGNvbXBvdW5kTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gZmluZENsYXNzKAorCQkJbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpKSwKKwkJCWNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCXJldHVybiBudWxsOworfQorcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW10gdHlwZU5hbWUsIGNoYXJbXVtdIHBhY2thZ2VOYW1lKSB7CisJaWYgKHR5cGVOYW1lICE9IG51bGwpCisJCXJldHVybiBmaW5kQ2xhc3MoCisJCQluZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYWNrYWdlTmFtZSwgdHlwZU5hbWUsICcvJykpLAorCQkJdHlwZU5hbWUpOworCXJldHVybiBudWxsOworfQorcHVibGljIENsYXNzcGF0aEphciBnZXRDbGFzc3BhdGhKYXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiBuZXcgQ2xhc3NwYXRoSmFyKG5ldyBaaXBGaWxlKGZpbGUpLCB0cnVlKTsKK30KK3B1YmxpYyBib29sZWFuIGlzUGFja2FnZShjaGFyW11bXSBjb21wb3VuZE5hbWUsIGNoYXJbXSBwYWNrYWdlTmFtZSkgeworCVN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgcGFja2FnZU5hbWUsICcvJykpOworCVN0cmluZyBxcDIgPSBGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nID8gcXVhbGlmaWVkUGFja2FnZU5hbWUgOiBxdWFsaWZpZWRQYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwlpZiAocXVhbGlmaWVkUGFja2FnZU5hbWUgPT0gcXAyKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc3BhdGhzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKGNsYXNzcGF0aHNbaV0uaXNQYWNrYWdlKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRocy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJQ2xhc3NwYXRoIHAgPSBjbGFzc3BhdGhzW2ldOworCQkJaWYgKChwIGluc3RhbmNlb2YgQ2xhc3NwYXRoSmFyKSA/IHAuaXNQYWNrYWdlKHF1YWxpZmllZFBhY2thZ2VOYW1lKSA6IHAuaXNQYWNrYWdlKHFwMikpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZmFlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKKworcHVibGljIGNsYXNzIE1haW4gaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcyB7CisKKwlwdWJsaWMgYm9vbGVhbiBub1dhcm4gPSBmYWxzZTsKKworCXB1YmxpYyBQcmludFdyaXRlciBvdXQ7CisJcHVibGljIGJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IHRydWU7CisJcHVibGljIGJvb2xlYW4gcHJvY2VlZE9uRXJyb3IgPSBmYWxzZTsKKworCXB1YmxpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKwlwdWJsaWMgYm9vbGVhbiBwcm9kdWNlUmVmSW5mbyA9IGZhbHNlOworCXB1YmxpYyBib29sZWFuIHRpbWVyID0gZmFsc2U7CisJcHVibGljIGJvb2xlYW4gc2hvd1Byb2dyZXNzID0gZmFsc2U7CisJcHVibGljIGxvbmcgdGltZSA9IDA7CisJcHVibGljIGxvbmcgbGluZUNvdW50OworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmU7CisKKwlwdWJsaWMgSGFzaHRhYmxlIG9wdGlvbnM7CisJcHVibGljIFN0cmluZ1tdIGZpbGVuYW1lczsKKwlwdWJsaWMgU3RyaW5nW10gZW5jb2RpbmdzOworCXB1YmxpYyBTdHJpbmdbXSBjbGFzc3BhdGhzOworCXB1YmxpYyBTdHJpbmcgZGVzdGluYXRpb25QYXRoOworCXB1YmxpYyBTdHJpbmcgbG9nOworCXB1YmxpYyBpbnQgcmVwZXRpdGlvbnM7CisJcHVibGljIGludCBnbG9iYWxQcm9ibGVtc0NvdW50OworCXB1YmxpYyBpbnQgZ2xvYmFsRXJyb3JzQ291bnQ7CisJcHVibGljIGludCBnbG9iYWxXYXJuaW5nc0NvdW50OworCXB1YmxpYyBpbnQgZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlcjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIENMQVNTX0ZJTEVfRVhURU5TSU9OID0gIi5jbGFzcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRV9RVU9URVMgPSAiJyciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTSU5HTEVfUVVPVEUgPSAiJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBidW5kbGVOYW1lID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5tZXNzYWdlcyI7IAkvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgeworCQlyZWxvY2FsaXplKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcHJvY2VlZCA9IHRydWU7CisKKwlwdWJsaWMgTWFpbihQcmludFdyaXRlciB3cml0ZXIsIGJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgeworCisJCXRoaXMub3V0ID0gd3JpdGVyOworCQl0aGlzLnN5c3RlbUV4aXRXaGVuRmluaXNoZWQgPSBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkOworCQlleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyID0gMDsKKwkJb3B0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsCisJCQlDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsCisJCQlDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZUZpbGVBdHRyaWJ1dGUsCisJCQlDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwsCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU1JWkVfT1VUKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVucmVhY2hhYmxlQ29kZSwKKwkJCUNvbXBpbGVyT3B0aW9ucy5FUlJPUik7CisJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SW52YWxpZEltcG9ydCwgQ29tcGlsZXJPcHRpb25zLkVSUk9SKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwKKwkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUsCisJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sIENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssCisJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQlvcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyLAorCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCW9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sCisJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwsCisJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIsCisJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsCisJCQlDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOworCQlvcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlLAorCQkJQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKKwkJb3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLAorCQkJQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8xKTsKKwl9CisKKwkvKgorCSAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nW10gYXJndikgeworCisJCS8vIGRlY29kZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisJCXRyeSB7CisJCQljb25maWd1cmUoYXJndik7CisJCQlpZiAocHJvY2VlZCkgeworCQkJCWlmIChzaG93UHJvZ3Jlc3MpCisJCQkJCW91dC5wcmludChNYWluLmJpbmQoInByb2dyZXNzLmNvbXBpbGluZyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwZXRpdGlvbnM7IGkrKykgeworCQkJCQlnbG9iYWxQcm9ibGVtc0NvdW50ID0gMDsKKwkJCQkJZ2xvYmFsRXJyb3JzQ291bnQgPSAwOworCQkJCQlnbG9iYWxXYXJuaW5nc0NvdW50ID0gMDsKKwkJCQkJbGluZUNvdW50ID0gMDsKKworCQkJCQlpZiAocmVwZXRpdGlvbnMgPiAxKSB7CisJCQkJCQlvdXQuZmx1c2goKTsKKwkJCQkJCW91dC5wcmludGxuKAorCQkJCQkJCU1haW4uYmluZCgKKwkJCQkJCQkJImNvbXBpbGUucmVwZXRpdGlvbiIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoaSArIDEpLAorCQkJCQkJCQlTdHJpbmcudmFsdWVPZihyZXBldGl0aW9ucykpKTsKKwkJCQkJfQorCQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQkvLyByZXF1ZXN0IGNvbXBpbGF0aW9uCisJCQkJCXBlcmZvcm1Db21waWxhdGlvbigpOworCQkJCQlpZiAodGltZXIpIHsKKworCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOworCQkJCQkJaWYgKGxpbmVDb3VudCAhPSAwKSB7CisJCQkJCQkJb3V0LnByaW50bG4oCisJCQkJCQkJCU1haW4uYmluZCgKKwkJCQkJCQkJCSJjb21waWxlLmluc3RhbnRUaW1lIiwgCS8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YobGluZUNvdW50KSwKKwkJCQkJCQkJCQlTdHJpbmcudmFsdWVPZih0aW1lKSwKKwkJCQkJCQkJCQlTdHJpbmcudmFsdWVPZigoKChpbnQpICgobGluZUNvdW50ICogMTAwMDAuMCkgLyB0aW1lKSkgLyAxMC4wKSl9KSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW91dC5wcmludGxuKE1haW4uYmluZCgiY29tcGlsZS50b3RhbFRpbWUiLCBTdHJpbmcudmFsdWVPZih0aW1lKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGdsb2JhbFByb2JsZW1zQ291bnQgPiAwKSB7CisJCQkJCQlpZiAoZ2xvYmFsUHJvYmxlbXNDb3VudCA9PSAxKSB7CisJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVQcm9ibGVtIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW91dC5wcmludCgKKwkJCQkJCQkJTWFpbi5iaW5kKCJjb21waWxlLnNldmVyYWxQcm9ibGVtcyIsIFN0cmluZy52YWx1ZU9mKGdsb2JhbFByb2JsZW1zQ291bnQpKSk7IAkvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCQlvdXQucHJpbnQoIiAoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA+IDApIHsKKwkJCQkJCQlpZiAoZ2xvYmFsRXJyb3JzQ291bnQgPT0gMSkgeworCQkJCQkJCQlvdXQucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLm9uZUVycm9yIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJb3V0LnByaW50KAorCQkJCQkJCQkJTWFpbi5iaW5kKCJjb21waWxlLnNldmVyYWxFcnJvcnMiLCBTdHJpbmcudmFsdWVPZihnbG9iYWxFcnJvcnNDb3VudCkpKTsgCS8vJE5PTi1OTFMtMSQKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoZ2xvYmFsV2FybmluZ3NDb3VudCA+IDApIHsKKwkJCQkJCQlpZiAoZ2xvYmFsRXJyb3JzQ291bnQgPiAwKSB7CisJCQkJCQkJCW91dC5wcmludCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCQlpZiAoZ2xvYmFsV2FybmluZ3NDb3VudCA9PSAxKSB7CisJCQkJCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUub25lV2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCW91dC5wcmludCgKKwkJCQkJCQkJCU1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsV2FybmluZ3MiLCBTdHJpbmcudmFsdWVPZihnbG9iYWxXYXJuaW5nc0NvdW50KSkpOyAJLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCW91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlpZiAoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciAhPSAwCisJCQkJCQkmJiAodGhpcy5zaG93UHJvZ3Jlc3MgfHwgdGhpcy50aW1lciB8fCB0aGlzLnZlcmJvc2UpKSB7CisJCQkJCQlpZiAoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciA9PSAxKSB7CisJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVDbGFzc0ZpbGVHZW5lcmF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJb3V0LnByaW50KAorCQkJCQkJCQlNYWluLmJpbmQoCisJCQkJCQkJCQkiY29tcGlsZS5zZXZlcmFsQ2xhc3NGaWxlc0dlbmVyYXRlZCIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCVN0cmluZy52YWx1ZU9mKGV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIpKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHNob3dQcm9ncmVzcykKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCQl9CisJCQlpZiAoc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgeworCQkJCW91dC5mbHVzaCgpOworCQkJCVN5c3RlbS5leGl0KGdsb2JhbEVycm9yc0NvdW50ID4gMCA/IC0xIDogMCk7CisJCQl9CisJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQlvdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisJCQlvdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCXByaW50VXNhZ2UoKTsKKwkJCWlmIChzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkKSB7CisJCQkJU3lzdGVtLmV4aXQoLTEpOworCQkJfQorCQl9IGNhdGNoIChUaHJlYWREZWF0aCBlKSB7IC8vIGRvIG5vdCBzdG9wIHRoaXMgb25lCisJCQl0aHJvdyBlOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeyAvLyBpbnRlcm5hbCBjb21waWxlciBlcnJvcgorCQkJaWYgKHN5c3RlbUV4aXRXaGVuRmluaXNoZWQpIHsKKwkJCQlvdXQuZmx1c2goKTsKKwkJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkgeworCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQl9CisJCQkJU3lzdGVtLmV4aXQoLTEpOworCQkJfQorCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGZpbmFsbHkgeworCQkJb3V0LmZsdXNoKCk7CisJCQlpZiAodGhpcy5sb2cgIT0gbnVsbCkgeworCQkJCW91dC5jbG9zZSgpOworCQkJfQorCQl9CisJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA9PSAwKXsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoKKwkgKiBJbnRlcm5hbCBJREUgQVBJCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nIGNvbW1hbmRMaW5lKSB7CisKKwkJcmV0dXJuIGNvbXBpbGUoY29tbWFuZExpbmUsIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSk7CisJfQorCisJLyoKKwkgKiBJbnRlcm5hbCBJREUgQVBJIGZvciB0ZXN0IGhhcm5lc3MgcHVycG9zZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlKFN0cmluZyBjb21tYW5kTGluZSwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisKKwkJcmV0dXJuIG5ldyBNYWluKHdyaXRlciwgZmFsc2UpLmNvbXBpbGUodG9rZW5pemUoY29tbWFuZExpbmUpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKFN0cmluZyBjb21tYW5kTGluZSkgeworCisJCWludCBjb3VudCA9IDA7CisJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbMTBdOworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb21tYW5kTGluZSwgIiBcIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyB0b2tlbiA9ICIiLCBsYXN0VG9rZW47IC8vJE5PTi1OTFMtMSQKKwkJYm9vbGVhbiBpbnNpZGVRdW90ZXMgPSBmYWxzZTsKKwkJYm9vbGVhbiBzdGFydE5ld1Rva2VuID0gdHJ1ZTsKKworCQkvLyB0YWtlIGNhcmUgdG8gcXVvdGVzIG9uIHRoZSBjb21tYW5kIGxpbmUKKwkJLy8gJ3h4eCAiYWFhIGJiYiI7Y2NjIHl5eScgLS0tPiAgeyJ4eHgiLCAiYWFhIGJiYjtjY2MiLCAieXl5IiB9CisJCS8vICd4eHggImFhYSBiYmI7Y2NjIiB5eXknIC0tLT4gIHsieHh4IiwgImFhYSBiYmI7Y2NjIiwgInl5eSIgfQorCQkvLyAneHh4ICJhYWEgYmJiIjsiY2NjIiB5eXknIC0tLT4gIHsieHh4IiwgImFhYSBiYmI7Y2NjIiwgInl5eSIgfQorCQkvLyAneHh4LyJhYWEgYmJiIjsiY2NjIiB5eXknIC0tLT4gIHsieHh4L2FhYSBiYmI7Y2NjIiwgInl5eSIgfQorCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworCQkJbGFzdFRva2VuID0gdG9rZW47CisJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKworCQkJaWYgKHRva2VuLmVxdWFscygiICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoaW5zaWRlUXVvdGVzKSB7CisJCQkJCWFyZ3VtZW50c1tjb3VudCAtIDFdICs9IHRva2VuOworCQkJCQlzdGFydE5ld1Rva2VuID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RhcnROZXdUb2tlbiA9IHRydWU7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoIlwiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlmICghaW5zaWRlUXVvdGVzICYmIHN0YXJ0TmV3VG9rZW4pIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoY291bnQgPT0gYXJndW1lbnRzLmxlbmd0aCkKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCAoYXJndW1lbnRzID0gbmV3IFN0cmluZ1tjb3VudCAqIDJdKSwgMCwgY291bnQpOworCQkJCQlhcmd1bWVudHNbY291bnQrK10gPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlpbnNpZGVRdW90ZXMgPSAhaW5zaWRlUXVvdGVzOworCQkJCXN0YXJ0TmV3VG9rZW4gPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGluc2lkZVF1b3RlcykgeworCQkJCQlhcmd1bWVudHNbY291bnQgLSAxXSArPSB0b2tlbjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodG9rZW4ubGVuZ3RoKCkgPiAwICYmICFzdGFydE5ld1Rva2VuKSB7CisJCQkJCQlhcmd1bWVudHNbY291bnQgLSAxXSArPSB0b2tlbjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChjb3VudCA9PSBhcmd1bWVudHMubGVuZ3RoKQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCAoYXJndW1lbnRzID0gbmV3IFN0cmluZ1tjb3VudCAqIDJdKSwgMCwgY291bnQpOworCQkJCQkJYXJndW1lbnRzW2NvdW50KytdID0gdG9rZW47CisJCQkJCX0KKwkJCQl9CisJCQkJc3RhcnROZXdUb2tlbiA9IGZhbHNlOworCQkJfQorCQl9CisJCVN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW2NvdW50XSwgMCwgY291bnQpOworCQlyZXR1cm4gYXJndW1lbnRzOworCX0KKworCS8qCisJRGVjb2RlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIAorCSAqLworCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShTdHJpbmdbXSBhcmd2KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkJCisJCWlmICgoYXJndiA9PSBudWxsKSB8fCAoYXJndi5sZW5ndGggPT0gMCkpCisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLm5vU291cmNlRmlsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBpbnQgSW5zaWRlQ2xhc3NwYXRoID0gMTsKKwkJZmluYWwgaW50IEluc2lkZURlc3RpbmF0aW9uUGF0aCA9IDI7CisJCWZpbmFsIGludCBUYXJnZXRTZXR0aW5nID0gNDsKKwkJZmluYWwgaW50IEluc2lkZUxvZyA9IDg7CisJCWZpbmFsIGludCBJbnNpZGVSZXBldGl0aW9uID0gMTY7CisJCWZpbmFsIGludCBJbnNpZGVTb3VyY2UgPSAzMjsKKwkJZmluYWwgaW50IEluc2lkZURlZmF1bHRFbmNvZGluZyA9IDY0OworCQlmaW5hbCBpbnQgRGVmYXVsdCA9IDA7CisJCWludCBERUZBVUxUX1NJWkVfQ0xBU1NQQVRIID0gNDsKKwkJYm9vbGVhbiB3YXJuT3B0aW9uSW5Vc2UgPSBmYWxzZTsKKwkJYm9vbGVhbiBub1dhcm5PcHRpb25JblVzZSA9IGZhbHNlOworCQlpbnQgcGF0aENvdW50ID0gMDsKKwkJaW50IGluZGV4ID0gLTEsIGZpbGVzQ291bnQgPSAwLCBhcmdDb3VudCA9IGFyZ3YubGVuZ3RoOworCQlpbnQgbW9kZSA9IERlZmF1bHQ7CisJCXJlcGV0aXRpb25zID0gMDsKKwkJYm9vbGVhbiB2ZXJzaW9uSURSZXF1aXJlZCA9IGZhbHNlOworCQlib29sZWFuIHByaW50VXNhZ2VSZXF1aXJlZCA9IGZhbHNlOworCisJCWJvb2xlYW4gZGlkU3BlY2lmeUNvbXBsaWFuY2UgPSBmYWxzZTsKKwkJYm9vbGVhbiBkaWRTcGVjaWZ5U291cmNlTGV2ZWwgPSBmYWxzZTsKKwkJYm9vbGVhbiBkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nID0gZmFsc2U7CisJCWJvb2xlYW4gZGlkU3BlY2lmeVRhcmdldCA9IGZhbHNlOworCisJCVN0cmluZyBjdXN0b21FbmNvZGluZyA9IG51bGw7CisJCVN0cmluZyBjdXJyZW50QXJnID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCQl3aGlsZSAoKytpbmRleCA8IGFyZ0NvdW50KSB7CisKKwkJCWlmIChjdXN0b21FbmNvZGluZyAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUudW5leHBlY3RlZEN1c3RvbUVuY29kaW5nIiwgY3VycmVudEFyZywgY3VzdG9tRW5jb2RpbmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQljdXJyZW50QXJnID0gYXJndltpbmRleF0udHJpbSgpOworCisJCQljdXN0b21FbmNvZGluZyA9IG51bGw7CisJCQlpZiAoY3VycmVudEFyZy5lbmRzV2l0aCgiXSIpKSB7IC8vJE5PTi1OTFMtMSQgCisJCQkJLy8gbG9vayBmb3IgZW5jb2Rpbmcgc3BlY2lmaWNhdGlvbgorCQkJCWludCBlbmNvZGluZ1N0YXJ0ID0gY3VycmVudEFyZy5pbmRleE9mKCdbJykgKyAxOworCQkJCWludCBlbmNvZGluZ0VuZCA9IGN1cnJlbnRBcmcubGVuZ3RoKCkgLSAxOworCQkJCWlmIChlbmNvZGluZ1N0YXJ0ID49IDEpIHsKKwkJCQkJaWYgKGVuY29kaW5nU3RhcnQgPCBlbmNvZGluZ0VuZCkgeworCQkJCQkJY3VzdG9tRW5jb2RpbmcgPSBjdXJyZW50QXJnLnN1YnN0cmluZyhlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0VuZCk7CisJCQkJCQl0cnkgeyAvLyBlbnN1cmUgZW5jb2RpbmcgaXMgc3VwcG9ydGVkCisJCQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSksIGN1c3RvbUVuY29kaW5nKTsKKwkJCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLnVuc3VwcG9ydGVkRW5jb2RpbmciLCBjdXN0b21FbmNvZGluZykpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJY3VycmVudEFyZyA9IGN1cnJlbnRBcmcuc3Vic3RyaW5nKDAsIGVuY29kaW5nU3RhcnQgLSAxKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjdXJyZW50QXJnLmVuZHNXaXRoKCIuamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoZmlsZW5hbWVzID09IG51bGwpIHsKKwkJCQkJZmlsZW5hbWVzID0gbmV3IFN0cmluZ1thcmdDb3VudCAtIGluZGV4XTsKKwkJCQkJZW5jb2RpbmdzID0gbmV3IFN0cmluZ1thcmdDb3VudCAtIGluZGV4XTsKKwkJCQl9IGVsc2UgaWYgKGZpbGVzQ291bnQgPT0gZmlsZW5hbWVzLmxlbmd0aCkgeworCQkJCQlpbnQgbGVuZ3RoID0gZmlsZW5hbWVzLmxlbmd0aDsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWZpbGVuYW1lcywKKwkJCQkJCTAsCisJCQkJCQkoZmlsZW5hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGggKyBhcmdDb3VudCAtIGluZGV4XSksCisJCQkJCQkwLAorCQkJCQkJbGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWVuY29kaW5ncywKKwkJCQkJCTAsCisJCQkJCQkoZW5jb2RpbmdzID0gbmV3IFN0cmluZ1tsZW5ndGggKyBhcmdDb3VudCAtIGluZGV4XSksCisJCQkJCQkwLAorCQkJCQkJbGVuZ3RoKTsKKwkJCQl9CisJCQkJZmlsZW5hbWVzW2ZpbGVzQ291bnRdID0gY3VycmVudEFyZzsKKwkJCQllbmNvZGluZ3NbZmlsZXNDb3VudCsrXSA9IGN1c3RvbUVuY29kaW5nOworCQkJCWN1c3RvbUVuY29kaW5nID0gbnVsbDsKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLWxvZyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAobG9nICE9IG51bGwpCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVMb2ciLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gSW5zaWRlTG9nOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcmVwZWF0IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChyZXBldGl0aW9ucyA+IDApCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVSZXBlYXQiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gSW5zaWRlUmVwZXRpdGlvbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXNvdXJjZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gSW5zaWRlU291cmNlOworCQkJCWRpZFNwZWNpZnlTb3VyY2VMZXZlbCA9IHRydWU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1lbmNvZGluZyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gSW5zaWRlRGVmYXVsdEVuY29kaW5nOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItMS4zIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChkaWRTcGVjaWZ5Q29tcGxpYW5jZSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlQ29tcGxpYW5jZSIsIGN1cnJlbnRBcmcpKTsvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWRpZFNwZWNpZnlDb21wbGlhbmNlID0gdHJ1ZTsKKwkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi0xLjQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGRpZFNwZWNpZnlDb21wbGlhbmNlKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVDb21wbGlhbmNlIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWRpZFNwZWNpZnlDb21wbGlhbmNlID0gdHJ1ZTsKKwkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1kIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChkZXN0aW5hdGlvblBhdGggIT0gbnVsbCkKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZU91dHB1dFBhdGgiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gSW5zaWRlRGVzdGluYXRpb25QYXRoOworCQkJCWdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItY2xhc3NwYXRoIikgLy8kTk9OLU5MUy0xJAorCQkJCXx8IGN1cnJlbnRBcmcuZXF1YWxzKCItY3AiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlpZiAocGF0aENvdW50ID4gMCkKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUNsYXNzcGF0aCIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNsYXNzcGF0aHMgPSBuZXcgU3RyaW5nW0RFRkFVTFRfU0laRV9DTEFTU1BBVEhdOworCQkJCW1vZGUgPSBJbnNpZGVDbGFzc3BhdGg7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcm9ncmVzcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQlzaG93UHJvZ3Jlc3MgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcHJvY2VlZE9uRXJyb3IiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJcHJvY2VlZE9uRXJyb3IgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGltZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQl0aW1lciA9IHRydWU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi12ZXJzaW9uIikgLy8kTk9OLU5MUy0xJAorCQkJCXx8IGN1cnJlbnRBcmcuZXF1YWxzKCItdiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXZlcnNpb25JRFJlcXVpcmVkID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgiLWRlcHJlY2F0aW9uIi5lcXVhbHMoY3VycmVudEFyZykpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdhcm5PcHRpb25JblVzZSA9IHRydWU7CisJCQkJaWYgKG5vV2Fybk9wdGlvbkluVXNlKQorCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQJCQkJCisJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItaGVscCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwcmludFVzYWdlUmVxdWlyZWQgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItbm9JbXBvcnRFcnJvciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSW1wb3J0LAorCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1ub0V4aXQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IGZhbHNlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdmVyYm9zZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQl2ZXJib3NlID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLXJlZmVyZW5jZUluZm8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJcHJvZHVjZVJlZkluZm8gPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiLWciKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJU3RyaW5nIGRlYnVnT3B0aW9uID0gY3VycmVudEFyZzsKKwkJCQlpbnQgbGVuZ3RoID0gY3VycmVudEFyZy5sZW5ndGgoKTsKKwkJCQlpZiAobGVuZ3RoID09IDIpIHsKKwkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsCisJCQkJCQlDb21waWxlck9wdGlvbnMuR0VORVJBVEUpOworCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTGluZU51bWJlckF0dHJpYnV0ZSwKKwkJCQkJCUNvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlLAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChsZW5ndGggPiAzKSB7CisJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLkRPX05PVF9HRU5FUkFURSk7CisJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLkRPX05PVF9HRU5FUkFURSk7CisJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlLAorCQkJCQkJQ29tcGlsZXJPcHRpb25zLkRPX05PVF9HRU5FUkFURSk7CisJCQkJCWlmIChsZW5ndGggPT0gNyAmJiBkZWJ1Z09wdGlvbi5lcXVhbHMoIi1nOm5vbmUiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJY29udGludWU7CisJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPQorCQkJCQkJbmV3IFN0cmluZ1Rva2VuaXplcihkZWJ1Z09wdGlvbi5zdWJzdHJpbmcoMywgZGVidWdPcHRpb24ubGVuZ3RoKCkpLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ2YXJzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisJCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibGluZXMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTGluZU51bWJlckF0dHJpYnV0ZSwKKwkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKKwkJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzb3VyY2UiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwKKwkJCQkJCQkJQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uIiwgZGVidWdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCS8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uIiwgZGVidWdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiLW5vd2FybiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlub1dhcm5PcHRpb25JblVzZSA9IHRydWU7CisJCQkJbm9XYXJuID0gdHJ1ZTsKKwkJCQlpZiAod2Fybk9wdGlvbkluVXNlKQorCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi13YXJuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdhcm5PcHRpb25JblVzZSA9IHRydWU7CisJCQkJaWYgKG5vV2Fybk9wdGlvbkluVXNlKQorCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQlTdHJpbmcgd2FybmluZ09wdGlvbiA9IGN1cnJlbnRBcmc7CisJCQkJaW50IGxlbmd0aCA9IGN1cnJlbnRBcmcubGVuZ3RoKCk7CisJCQkJaWYgKGxlbmd0aCA9PSAxMCAmJiB3YXJuaW5nT3B0aW9uLmVxdWFscygiLXdhcm46bm9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbm9XYXJuID0gdHJ1ZTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChsZW5ndGggPCA2KQorCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZFdhcm5pbmdDb25maWd1cmF0aW9uIiwgd2FybmluZ09wdGlvbikpOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9CisJCQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIod2FybmluZ09wdGlvbi5zdWJzdHJpbmcoNiwgd2FybmluZ09wdGlvbi5sZW5ndGgoKSksICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbnQgdG9rZW5Db3VudGVyID0gMDsKKworCQkJCW9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQkJb3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQkJb3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sIAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrLAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwgCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQkJCW9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQkJb3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uLAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsLAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRBc3NlcnRJZGVudGlmaWVyLAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQsCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCisJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJCQl0b2tlbkNvdW50ZXIrKzsKKwkJCQkJaWYgKHRva2VuLmVxdWFscygiY29uc3RydWN0b3JOYW1lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInBhY2thZ2VEZWZhdWx0TWV0aG9kIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QsCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibWFza2VkQ2F0Y2hCbG9ja3MiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiZGVwcmVjYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCAKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRMb2NhbHMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsLCAKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRBcmd1bWVudHMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlciwKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRJbXBvcnRzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQsCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygic3ludGhldGljQWNjZXNzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibmxzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsLAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoImFzc2VydElkZW50aWZpZXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIsCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZyIsIHRva2VuKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodG9rZW5Db3VudGVyID09IDApCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ09wdGlvbiIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGFyZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRpZFNwZWNpZnlUYXJnZXQgPSB0cnVlOworCQkJCW1vZGUgPSBUYXJnZXRTZXR0aW5nOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItcHJlc2VydmVBbGxMb2NhbHMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJb3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUHJlc2VydmVVbnVzZWRMb2NhbCwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLlBSRVNFUlZFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChtb2RlID09IFRhcmdldFNldHRpbmcpIHsKKwkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuMSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8xKTsKKwkJCQl9IGVsc2UgaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCIxLjIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMik7CisJCQkJfSBlbHNlIGlmIChjdXJyZW50QXJnLmVxdWFscygiMS4zIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOworCQkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuNCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLnRhcmdldEpESyIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChtb2RlID09IEluc2lkZUxvZykgeworCQkJCWxvZyA9IGN1cnJlbnRBcmc7CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobW9kZSA9PSBJbnNpZGVSZXBldGl0aW9uKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmVwZXRpdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGN1cnJlbnRBcmcpOworCQkJCQlpZiAocmVwZXRpdGlvbnMgPD0gMCkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5yZXBldGl0aW9uIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLnJlcGV0aXRpb24iLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobW9kZSA9PSBJbnNpZGVTb3VyY2UpIHsKKwkJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuMyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CisJCQkJfSBlbHNlIGlmIChjdXJyZW50QXJnLmVxdWFscygiMS40IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLnNvdXJjZSIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChtb2RlID09IEluc2lkZURlZmF1bHRFbmNvZGluZykgeworCQkJCWlmIChkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVEZWZhdWx0RW5jb2RpbmciLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJdHJ5IHsgLy8gZW5zdXJlIGVuY29kaW5nIGlzIHN1cHBvcnRlZAorCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSwgY3VycmVudEFyZyk7CisJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS51bnN1cHBvcnRlZEVuY29kaW5nIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fRW5jb2RpbmcsIGN1cnJlbnRBcmcpOworCQkJCWRpZFNwZWNpZnlEZWZhdWx0RW5jb2RpbmcgPSB0cnVlOworCQkJCW1vZGUgPSBEZWZhdWx0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG1vZGUgPT0gSW5zaWRlRGVzdGluYXRpb25QYXRoKSB7CisJCQkJZGVzdGluYXRpb25QYXRoID0gY3VycmVudEFyZzsKKwkJCQltb2RlID0gRGVmYXVsdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChtb2RlID09IEluc2lkZUNsYXNzcGF0aCkgeworCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRBcmcsIEZpbGUucGF0aFNlcGFyYXRvcik7CisJCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJaW50IGxlbmd0aDsKKwkJCQkJaWYgKChsZW5ndGggPSBjbGFzc3BhdGhzLmxlbmd0aCkgPD0gcGF0aENvdW50KSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCWNsYXNzcGF0aHMsCisJCQkJCQkJMCwKKwkJCQkJCQkoY2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbbGVuZ3RoICogMl0pLAorCQkJCQkJCTAsCisJCQkJCQkJbGVuZ3RoKTsKKwkJCQkJfQorCQkJCQljbGFzc3BhdGhzW3BhdGhDb3VudCsrXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQl9CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvL2RlZmF1bHQgaXMgaW5wdXQgZGlyZWN0b3J5CisJCQljdXJyZW50QXJnID0gY3VycmVudEFyZy5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwkJCWlmIChjdXJyZW50QXJnLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKKwkJCQljdXJyZW50QXJnID0KKwkJCQkJY3VycmVudEFyZy5zdWJzdHJpbmcoMCwgY3VycmVudEFyZy5sZW5ndGgoKSAtIEZpbGUuc2VwYXJhdG9yLmxlbmd0aCgpKTsKKwkJCUZpbGUgZGlyID0gbmV3IEZpbGUoY3VycmVudEFyZyk7CisJCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKQorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCisJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmRpcmVjdG9yeU5vdEV4aXN0IiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQlGaWxlRmluZGVyIGZpbmRlciA9IG5ldyBGaWxlRmluZGVyKCk7CisJCQl0cnkgeworCQkJCWZpbmRlci5maW5kKGRpciwgIi5KQVZBIiwgdmVyYm9zZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5JT0Vycm9yIiwgY3VycmVudEFyZykpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlsZW5hbWVzICE9IG51bGwpIHsKKwkJCQkvLyBzb21lIHNvdXJjZSBmaWxlcyB3ZXJlIHNwZWNpZmllZCBleHBsaWNpdGx5CisJCQkJU3RyaW5nIHJlc3VsdHNbXSA9IGZpbmRlci5yZXN1bHRGaWxlczsKKwkJCQlpbnQgbGVuZ3RoID0gcmVzdWx0cy5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJZmlsZW5hbWVzLAorCQkJCQkwLAorCQkJCQkoZmlsZW5hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGggKyBmaWxlc0NvdW50XSksCisJCQkJCTAsCisJCQkJCWZpbGVzQ291bnQpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWVuY29kaW5ncywKKwkJCQkJMCwKKwkJCQkJKGVuY29kaW5ncyA9IG5ldyBTdHJpbmdbbGVuZ3RoICsgZmlsZXNDb3VudF0pLAorCQkJCQkwLAorCQkJCQlmaWxlc0NvdW50KTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHMsIDAsIGZpbGVuYW1lcywgZmlsZXNDb3VudCwgbGVuZ3RoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWVuY29kaW5nc1tmaWxlc0NvdW50ICsgaV0gPSBjdXN0b21FbmNvZGluZzsKKwkJCQl9CisJCQkJZmlsZXNDb3VudCArPSBsZW5ndGg7CisJCQkJY3VzdG9tRW5jb2RpbmcgPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlmaWxlbmFtZXMgPSBmaW5kZXIucmVzdWx0RmlsZXM7CisJCQkJZmlsZXNDb3VudCA9IGZpbGVuYW1lcy5sZW5ndGg7CisJCQkJZW5jb2RpbmdzID0gbmV3IFN0cmluZ1tmaWxlc0NvdW50XTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzQ291bnQ7IGkrKykgeworCQkJCQllbmNvZGluZ3NbaV0gPSBjdXN0b21FbmNvZGluZzsKKwkJCQl9CisJCQkJY3VzdG9tRW5jb2RpbmcgPSBudWxsOworCQkJfQorCQkJbW9kZSA9IERlZmF1bHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChub1dhcm4pIHsKKwkJCS8vIGZpbHRlciBvcHRpb25zIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBhc3Npc3QgY29tcG9uZW50CisJCQlPYmplY3RbXSBlbnRyaWVzID0gb3B0aW9ucy5lbnRyeVNldCgpLnRvQXJyYXkoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllc1tpXTsKKwkJCQlpZiAoIShlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFN0cmluZykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpLmVxdWFscyhDb21waWxlck9wdGlvbnMuV0FSTklORykpIHsKKwkJCQkJb3B0aW9ucy5wdXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBTdGFuZGFsb25lIG9wdGlvbnMKKwkJICovCisJCWlmICh2ZXJzaW9uSURSZXF1aXJlZCkgeworCQkJb3V0LnByaW50bG4oTWFpbi5iaW5kKCJjb25maWd1cmUudmVyc2lvbiIsIE1haW4uYmluZCgiY29tcGlsZXIudmVyc2lvbiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJb3V0LnByaW50bG4oKTsKKwkJCXByb2NlZWQgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChwcmludFVzYWdlUmVxdWlyZWQpIHsKKwkJCXByaW50VXNhZ2UoKTsKKwkJCXByb2NlZWQgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChmaWxlc0NvdW50ICE9IDApCisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWZpbGVuYW1lcywKKwkJCQkwLAorCQkJCShmaWxlbmFtZXMgPSBuZXcgU3RyaW5nW2ZpbGVzQ291bnRdKSwKKwkJCQkwLAorCQkJCWZpbGVzQ291bnQpOworCQlpZiAocGF0aENvdW50ID09IDApIHsKKwkJCVN0cmluZyBjbGFzc1Byb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkRFRkFVTFRfQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICgoY2xhc3NQcm9wID09IG51bGwpIHx8IChjbGFzc1Byb3AubGVuZ3RoKCkgPT0gMCkpIHsKKwkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbmZpZ3VyZS5ub0NsYXNzcGF0aCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNsYXNzUHJvcCA9ICIuIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQcm9wLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworCQkJY2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQljbGFzc3BhdGhzW3BhdGhDb3VudCsrXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCX0KKwkJfQorCisJCWlmIChjbGFzc3BhdGhzID09IG51bGwpCisJCQljbGFzc3BhdGhzID0gbmV3IFN0cmluZ1swXTsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWNsYXNzcGF0aHMsCisJCQkwLAorCQkJKGNsYXNzcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhDb3VudF0pLAorCQkJMCwKKwkJCXBhdGhDb3VudCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjbGFzc3BhdGhzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjbGFzc3BhdGhzW2ldKTsKKwkJCWlmICghZmlsZS5leGlzdHMoKSkgLy8gc2lnbmFsIG1pc3NpbmcgY2xhc3NwYXRoIGVudHJ5IGZpbGUKKwkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGgiLCBjbGFzc3BhdGhzW2ldKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoZGVzdGluYXRpb25QYXRoID09IG51bGwpIHsKKwkJCWdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICgibm9uZSIuZXF1YWxzKGRlc3RpbmF0aW9uUGF0aCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJZGVzdGluYXRpb25QYXRoID0gbnVsbDsKKwkJfQorCisJCWlmIChmaWxlbmFtZXMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUubm9Tb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBjaGVjayBhbmQgc2V0IGNvbXBsaWFuY2Uvc291cmNlL3RhcmdldCBjb21wYXRpYmlsaXRpZXMKKwkJaWYgKCFkaWRTcGVjaWZ5Q29tcGxpYW5jZSl7CisJCQkJaWYgKG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KSl7CisJCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKwkJCQl9IGVsc2UgeworCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CisJCQkJfQorCQl9CisJCVN0cmluZyBjb21wbGlhbmNlID0gKFN0cmluZylvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpOworCQlpZiAoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80LmVxdWFscyhjb21wbGlhbmNlKSl7CisJCQkKKwkJCS8vIGRlZmF1bHQgMS40IHNldHRpbmdzCisJCQlpZiAoIWRpZFNwZWNpZnlTb3VyY2VMZXZlbCl7CisJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7CisJCQl9CisJCQlpZiAoIWRpZFNwZWNpZnlUYXJnZXQpeworCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7CisJCQl9CisJCX0gZWxzZSBpZiAoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zLmVxdWFscyhjb21wbGlhbmNlKSl7CisKKwkJCS8vIGRlZmF1bHQgMS40IHNldHRpbmdzCisJCQlpZiAoIWRpZFNwZWNpZnlTb3VyY2VMZXZlbCl7CisJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CisJCQl9CisJCQlpZiAoIWRpZFNwZWNpZnlUYXJnZXQpeworCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMSk7CisJCQl9CisJCX0KKwkJLy8gY29tcGxpYW5jZSBtdXN0IGJlIDEuNCBpZiBzb3VyY2UgaXMgMS40CisJCWlmIChvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkKKwkJCQkmJiAhb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KSl7IAorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclNvdXJjZTE0IiwgKFN0cmluZylvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJLy8gdGFyZ2V0IG11c3QgYmUgMS40IGlmIHNvdXJjZSBpcyAxLjQKKwkJaWYgKG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJCSYmICFvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KSl7IAorCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlVGFyZ2V0Rm9yU291cmNlMTQiLCAoU3RyaW5nKW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0pKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8vIHRhcmdldCBjYW5ub3QgYmUgMS40IGlmIGNvbXBsaWFuY2UgaXMgMS4zCisJCWlmIChvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJCSYmICFvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKXsgCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yVGFyZ2V0MTQiLCAoU3RyaW5nKW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlpZiAobG9nICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgZmFsc2UpKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmNhbm5vdE9wZW5Mb2ciKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNob3dQcm9ncmVzcyA9IGZhbHNlOworCQl9CisKKwkJaWYgKHJlcGV0aXRpb25zID09IDApIHsKKwkJCXJlcGV0aXRpb25zID0gMTsKKwkJfQorCX0KKwlwdWJsaWMgTWFwIGdldE9wdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbnM7CisJfQorCS8qCisJICogQW5zd2VyIHRoZSBjb21wb25lbnQgdG8gd2hpY2ggd2lsbCBiZSBoYW5kZWQgYmFjayBjb21waWxhdGlvbiByZXN1bHRzIGZyb20gdGhlIGNvbXBpbGVyCisJICovCisJcHVibGljIElDb21waWxlclJlcXVlc3RvciBnZXRCYXRjaFJlcXVlc3RvcigpIHsKKwkJcmV0dXJuIG5ldyBJQ29tcGlsZXJSZXF1ZXN0b3IoKSB7CisJCQlpbnQgbGluZURlbHRhID0gMDsKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCQkJCWlmIChjb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zICE9IG51bGwpIHsKKwkJCQkJaW50IHVuaXRMaW5lQ291bnQgPSBjb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zLmxlbmd0aDsKKwkJCQkJbGluZUNvdW50ICs9IHVuaXRMaW5lQ291bnQ7CisJCQkJCWxpbmVEZWx0YSArPSB1bml0TGluZUNvdW50OworCQkJCQlpZiAoc2hvd1Byb2dyZXNzCisJCQkJCQkmJiBsaW5lRGVsdGEgPiAyMDAwKSB7IC8vIGluIC1sb2cgbW9kZSwgZHVtcCBhIGRvdCBldmVyeSAyMDAwIGxpbmVzIGNvbXBpbGVkCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCcuJyk7CisJCQkJCQlsaW5lRGVsdGEgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChjb21waWxhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpKSB7CisJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPSBjb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCQlpbnQgY291bnQgPSBwcm9ibGVtcy5sZW5ndGg7CisJCQkJCWludCBsb2NhbEVycm9yQ291bnQgPSAwOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJCWlmIChwcm9ibGVtc1tpXSAhPSBudWxsKSB7CisJCQkJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudCsrOworCQkJCQkJCWlmIChsb2NhbEVycm9yQ291bnQgPT0gMCkKKwkJCQkJCQkJb3V0LnByaW50bG4oIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW91dC5wcmludCgKKwkJCQkJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudAorCQkJCQkJCQkJKyAiLiAiICAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkKKwkJCQkJCQkJCQk/IE1haW4uYmluZCgicmVxdWVzdG9yLmVycm9yIikgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQk6IE1haW4uYmluZCgicmVxdWVzdG9yLndhcm5pbmciKSkpOyAgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWlmIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkpIHsKKwkJCQkJCQkJZ2xvYmFsRXJyb3JzQ291bnQrKzsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlnbG9iYWxXYXJuaW5nc0NvdW50Kys7CisJCQkJCQkJfQorCQkJCQkJCW91dC5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJb3V0LnByaW50KAorCQkJCQkJCQlNYWluLmJpbmQoInJlcXVlc3Rvci5pbiIsIG5ldyBTdHJpbmcocHJvYmxlbXNbaV0uZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJb3V0LnByaW50bG4oCisJCQkJCQkJCQkoKERlZmF1bHRQcm9ibGVtKSBwcm9ibGVtc1tpXSkuZXJyb3JSZXBvcnRTb3VyY2UoCisJCQkJCQkJCQkJY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0KSk7CisJCQkJCQkJCW91dC5wcmludGxuKHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7CisJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJb3V0LnByaW50bG4oCisJCQkJCQkJCQlNYWluLmJpbmQoInJlcXVlc3Rvci5ub3RSZXRyaWV2ZUVycm9yTWVzc2FnZSIsIHByb2JsZW1zW2ldLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCQlvdXQucHJpbnRsbigiLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSkKKwkJCQkJCQkJbG9jYWxFcnJvckNvdW50Kys7CisJCQkJCQl9CisJCQkJCX07CisJCQkJCS8vIGV4aXQ/CisJCQkJCWlmIChzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkICYmICFwcm9jZWVkT25FcnJvciAmJiAobG9jYWxFcnJvckNvdW50ID4gMCkpIHsKKwkJCQkJCW91dC5mbHVzaCgpOworCQkJCQkJU3lzdGVtLmV4aXQoLTEpOworCQkJCQl9CisJCQkJfQorCQkJCW91dHB1dENsYXNzRmlsZXMoY29tcGlsYXRpb25SZXN1bHQpOworCQkJfQorCQl9OworCX0KKwkvKgorCSAqICBCdWlsZCB0aGUgc2V0IG9mIGNvbXBpbGF0aW9uIHNvdXJjZSB1bml0cworCSAqLworCXB1YmxpYyBDb21waWxhdGlvblVuaXRbXSBnZXRDb21waWxhdGlvblVuaXRzKCkKKwkJdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJCWludCBmaWxlQ291bnQgPSBmaWxlbmFtZXMubGVuZ3RoOworCQlDb21waWxhdGlvblVuaXRbXSB1bml0cyA9IG5ldyBDb21waWxhdGlvblVuaXRbZmlsZUNvdW50XTsKKwkJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25GaWxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoZmlsZUNvdW50KTsKKworCQlTdHJpbmcgZGVmYXVsdEVuY29kaW5nID0gKFN0cmluZykgb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9FbmNvZGluZyk7CisJCWlmICgiIi5lcXVhbHMoZGVmYXVsdEVuY29kaW5nKSkgLy8kTk9OLU5MUy0xJAorCQkJZGVmYXVsdEVuY29kaW5nID0gbnVsbDsgLy8kTk9OLU5MUy0xJAorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUNvdW50OyBpKyspIHsKKwkJCWNoYXJbXSBjaGFyTmFtZSA9IGZpbGVuYW1lc1tpXS50b0NoYXJBcnJheSgpOworCQkJaWYgKGtub3duRmlsZU5hbWVzLmdldChjaGFyTmFtZSkgIT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJ1bml0Lm1vcmUiLCBmaWxlbmFtZXNbaV0pKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlrbm93bkZpbGVOYW1lcy5wdXQoY2hhck5hbWUsIGNoYXJOYW1lKTsKKwkJCX0KKwkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lc1tpXSk7CisJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoInVuaXQubWlzc2luZyIsIGZpbGVuYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGluZ3NbaV07CisJCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKKwkJCQllbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZzsKKwkJCXVuaXRzW2ldID0gbmV3IENvbXBpbGF0aW9uVW5pdChudWxsLCBmaWxlbmFtZXNbaV0sIGVuY29kaW5nKTsKKwkJfQorCQlyZXR1cm4gdW5pdHM7CisJfQorCS8qCisJICogIExvdy1sZXZlbCBBUEkgcGVyZm9ybWluZyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uCisJICovCisJcHVibGljIElFcnJvckhhbmRsaW5nUG9saWN5IGdldEhhbmRsaW5nUG9saWN5KCkgeworCisJCS8vIHBhc3NlcyB0aGUgaW5pdGlhbCBzZXQgb2YgZmlsZXMgdG8gdGhlIGJhdGNoIG9yYWNsZSAodG8gYXZvaWQgZmluZGluZyBtb3JlIHRoYW4gb25jZSB0aGUgc2FtZSB1bml0cyB3aGVuIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gpCQorCQlyZXR1cm4gbmV3IElFcnJvckhhbmRsaW5nUG9saWN5KCkgeworCQkJcHVibGljIGJvb2xlYW4gc3RvcE9uRmlyc3RFcnJvcigpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBwcm9jZWVkT25FcnJvcnMoKSB7CisJCQkJcmV0dXJuIHByb2NlZWRPbkVycm9yOyAvLyBzdG9wIGlmIHRoZXJlIGFyZSBzb21lIGVycm9ycyAKKwkJCX0KKwkJfTsKKwl9CisJLyoKKwkgKiAgTG93LWxldmVsIEFQSSBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgY29tcGlsYXRpb24KKwkgKi8KKwlwdWJsaWMgRmlsZVN5c3RlbSBnZXRMaWJyYXJ5QWNjZXNzKCkgeworCisJCVN0cmluZyBkZWZhdWx0RW5jb2RpbmcgPSAoU3RyaW5nKSBvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0VuY29kaW5nKTsKKwkJaWYgKCIiLmVxdWFscyhkZWZhdWx0RW5jb2RpbmcpKSAvLyROT04tTkxTLTEkCisJCQlkZWZhdWx0RW5jb2RpbmcgPSBudWxsOyAvLyROT04tTkxTLTEkCQorCQlyZXR1cm4gbmV3IEZpbGVTeXN0ZW0oY2xhc3NwYXRocywgZmlsZW5hbWVzLCBkZWZhdWx0RW5jb2RpbmcpOworCX0KKwkvKgorCSAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbgorCSAqLworCXB1YmxpYyBJUHJvYmxlbUZhY3RvcnkgZ2V0UHJvYmxlbUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpOworCX0KKwkvKgorCSAqIEV4dGVybmFsIEFQSQorCSAqLworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgeworCQluZXcgTWFpbihuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIHRydWUpLmNvbXBpbGUoYXJndik7CisJfQorCS8vIER1bXAgY2xhc3NmaWxlcyBvbnRvIGRpc2sgZm9yIGFsbCBjb21waWxhdGlvbiB1bml0cyB0aGF0IHdoZXJlIHN1Y2Nlc3NmdWxsLgorCisJcHVibGljIHZvaWQgb3V0cHV0Q2xhc3NGaWxlcyhDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KSB7CisKKwkJaWYgKCEoKHVuaXRSZXN1bHQgPT0gbnVsbCkgfHwgKHVuaXRSZXN1bHQuaGFzRXJyb3JzKCkgJiYgIXByb2NlZWRPbkVycm9yKSkpIHsKKwkJCUVudW1lcmF0aW9uIGNsYXNzRmlsZXMgPSB1bml0UmVzdWx0LmNvbXBpbGVkVHlwZXMuZWxlbWVudHMoKTsKKwkJCWlmICghdGhpcy5nZW5lcmF0ZVBhY2thZ2VzU3RydWN0dXJlKSB7CisJCQkJd2hpbGUgKGNsYXNzRmlsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQkJdGhpcy5kZXN0aW5hdGlvblBhdGggPSBleHRyYWN0RGVzdGluYXRpb25QYXRoRnJvbVNvdXJjZUZpbGUodW5pdFJlc3VsdCk7CisJCQkJCS8vIHJldHJpZXZlIHRoZSBrZXkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZmlsZQorCQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgY2xhc3NGaWxlcy5uZXh0RWxlbWVudCgpOworCQkJCQljaGFyW10gZmlsZW5hbWUgPSBjbGFzc0ZpbGUuZmlsZU5hbWUoKTsKKwkJCQkJaW50IGxlbmd0aCA9IGZpbGVuYW1lLmxlbmd0aDsKKwkJCQkJY2hhcltdIHJlbGF0aXZlTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDZdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVuYW1lLCAwLCByZWxhdGl2ZU5hbWUsIDAsIGxlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoQ0xBU1NfRklMRV9FWFRFTlNJT04sIDAsIHJlbGF0aXZlTmFtZSwgbGVuZ3RoLCA2KTsKKwkJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHJlbGF0aXZlTmFtZSwgJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworCQkJCQl0cnkgeworCQkJCQkJQ2xhc3NGaWxlLndyaXRlVG9EaXNrKAorCQkJCQkJCWdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsCisJCQkJCQkJZGVzdGluYXRpb25QYXRoLAorCQkJCQkJCW5ldyBTdHJpbmcocmVsYXRpdmVOYW1lKSwKKwkJCQkJCQljbGFzc0ZpbGUuZ2V0Qnl0ZXMoKSk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IGRlc3RpbmF0aW9uUGF0aCArIG5ldyBTdHJpbmcocmVsYXRpdmVOYW1lKTsKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWFpbi5iaW5kKCJvdXRwdXQubm9DbGFzc0ZpbGVDcmVhdGVkIiwgZmlsZU5hbWUpKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChkZXN0aW5hdGlvblBhdGggIT0gbnVsbCkgeworCQkJCXdoaWxlIChjbGFzc0ZpbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJCS8vIHJldHJpZXZlIHRoZSBrZXkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZmlsZQorCQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgY2xhc3NGaWxlcy5uZXh0RWxlbWVudCgpOworCQkJCQljaGFyW10gZmlsZW5hbWUgPSBjbGFzc0ZpbGUuZmlsZU5hbWUoKTsKKwkJCQkJaW50IGxlbmd0aCA9IGZpbGVuYW1lLmxlbmd0aDsKKwkJCQkJY2hhcltdIHJlbGF0aXZlTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDZdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVuYW1lLCAwLCByZWxhdGl2ZU5hbWUsIDAsIGxlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoQ0xBU1NfRklMRV9FWFRFTlNJT04sIDAsIHJlbGF0aXZlTmFtZSwgbGVuZ3RoLCA2KTsKKwkJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHJlbGF0aXZlTmFtZSwgJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworCQkJCQl0cnkgeworCQkJCQkJQ2xhc3NGaWxlLndyaXRlVG9EaXNrKAorCQkJCQkJCWdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsCisJCQkJCQkJZGVzdGluYXRpb25QYXRoLAorCQkJCQkJCW5ldyBTdHJpbmcocmVsYXRpdmVOYW1lKSwKKwkJCQkJCQljbGFzc0ZpbGUuZ2V0Qnl0ZXMoKSk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IGRlc3RpbmF0aW9uUGF0aCArIG5ldyBTdHJpbmcocmVsYXRpdmVOYW1lKTsKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWFpbi5iaW5kKCJvdXRwdXQubm9DbGFzc0ZpbGVDcmVhdGVkIiwgZmlsZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIrKzsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiAgTG93LWxldmVsIEFQSSBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgY29tcGlsYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBwZXJmb3JtQ29tcGlsYXRpb24oKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKworCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0TGlicmFyeUFjY2VzcygpOworCQlDb21waWxlciBiYXRjaENvbXBpbGVyID0KKwkJCW5ldyBDb21waWxlcigKKwkJCQllbnZpcm9ubWVudCwKKwkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAorCQkJCWdldE9wdGlvbnMoKSwKKwkJCQlnZXRCYXRjaFJlcXVlc3RvcigpLAorCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOworCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IGJhdGNoQ29tcGlsZXIub3B0aW9uczsKKworCQkvLyBzZXQgdGhlIG5vbi1leHRlcm5hbGx5IGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCQlvcHRpb25zLnNldFZlcmJvc2VNb2RlKHZlcmJvc2UpOworCQlvcHRpb25zLnByb2R1Y2VSZWZlcmVuY2VJbmZvKHByb2R1Y2VSZWZJbmZvKTsKKwkJYmF0Y2hDb21waWxlci5jb21waWxlKGdldENvbXBpbGF0aW9uVW5pdHMoKSk7CisKKwkJLy8gY2xlYW51cAorCQllbnZpcm9ubWVudC5jbGVhbnVwKCk7CisJfQorCXB1YmxpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisJCW91dC5wcmludGxuKE1haW4uYmluZCgibWlzYy51c2FnZSIsIE1haW4uYmluZCgiY29tcGlsZXIudmVyc2lvbiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlvdXQuZmx1c2goKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgTkxTIGNhdGFsb2cgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbG9jYWxpemUoKSB7CisJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKwl9CisKKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkKSB7CisJCXJldHVybiBiaW5kKGlkLCAoU3RyaW5nW10pIG51bGwpOworCX0KKworCS8qKgorCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCisJICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmdbXSBiaW5kaW5ncykgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElmIHdlIGdvdCBhbiBleGNlcHRpb24gbG9va2luZyBmb3IgdGhlIG1lc3NhZ2UsIGZhaWwgZ3JhY2VmdWxseSBieSBqdXN0IHJldHVybmluZworCQkJLy8gdGhlIGlkIHdlIHdlcmUgbG9va2luZyBmb3IuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgc2VtaS1pbmZvcm1hdGl2ZSBzbyBpcyBub3QgdG9vIGJhZC4KKwkJCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgaWQgKyAiIGluOiAiICsgYnVuZGxlTmFtZTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNZXNzYWdlRm9ybWF0IHdoaWNoIGVsaW1pbmF0ZXMgZG91YmxlIHF1b3RlcyBpbiBvcmlnaW5hbCBtZXNzYWdlCisJCWNoYXJbXSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzID0KKwkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXNzYWdlLnRvQ2hhckFycmF5KCksIERPVUJMRV9RVU9URVMsIFNJTkdMRV9RVU9URSk7CisJCW1lc3NhZ2UgPSBuZXcgU3RyaW5nKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMpOworCisJCWlmIChiaW5kaW5ncyA9PSBudWxsKQorCQkJcmV0dXJuIG1lc3NhZ2U7CisKKwkJaW50IGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoKCk7CisJCWludCBzdGFydCA9IC0xOworCQlpbnQgZW5kID0gbGVuZ3RoOworCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7CisJCXdoaWxlICh0cnVlKSB7CisJCQlpZiAoKGVuZCA9IG1lc3NhZ2UuaW5kZXhPZigneycsIHN0YXJ0KSkgPiAtMSkgeworCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKKwkJCQlpZiAoKHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKCd9JywgZW5kKSkgPiAtMSkgeworCQkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCkpOworCQkJCQkJb3V0cHV0LmFwcGVuZChiaW5kaW5nc1tpbmRleF0pOworCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOworCQkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpICsgIn0iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGxlbmd0aCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmcgYmluZGluZykgeworCQlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHsgYmluZGluZyB9KTsKKwl9CisKKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcxLCBTdHJpbmcgYmluZGluZzIpIHsKKwkJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcxLCBiaW5kaW5nMiB9KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4dHJhY3REZXN0aW5hdGlvblBhdGhGcm9tU291cmNlRmlsZShDb21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSByZXN1bHQuY29tcGlsYXRpb25Vbml0OworCQlpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKKwkJCWNoYXJbXSBmaWxlTmFtZSA9IGNvbXBpbGF0aW9uVW5pdC5nZXRGaWxlTmFtZSgpOworCQkJaW50IGxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsIGZpbGVOYW1lKTsKKwkJCWlmIChsYXN0SW5kZXggPT0gLTEpIHsKKwkJCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlyZXR1cm4gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGZpbGVOYW1lLCAwLCBsYXN0SW5kZXgpKTsKKwkJfQorCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDliNGVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMDggQEAKKyMjIyBKYXZhQmF0Y2hDb21waWxlciBtZXNzYWdlcy4KKworIyMjIGNvbXBpbGVyIHZlcnNpb24gaWQKK2NvbXBpbGVyLnZlcnNpb24gPSAwLjI2NAorIyMjIHNjYW5uaW5nCitzY2FubmluZy5zdGFydCA9IENvbGxlY3Rpbmcgc291cmNlIGZpbGVzIGluc2lkZSB7MH0KKworIyMjIHByb2dyZXNzCitwcm9ncmVzcy5jb21waWxpbmcgPSBDb21waWxpbmcKKworIyMjIGNvbXBpbGUKK2NvbXBpbGUucmVwZXRpdGlvbiA9IFJlcGV0aXRpb24gezB9L3sxfQorY29tcGlsZS5pbnN0YW50VGltZSA9IENvbXBpbGVkIHswfSBsaW5lcyBpbiB7MX0gbXMgKHsyfSBsaW5lcy9zKQorY29tcGlsZS50b3RhbFRpbWUgPSBUb3RhbCBjb21waWxhdGlvbiB0aW1lOiB7MH0KK2NvbXBpbGUub25lUHJvYmxlbSA9IDEgcHJvYmxlbQorY29tcGlsZS5zZXZlcmFsUHJvYmxlbXMgPSB7MH0gcHJvYmxlbXMKK2NvbXBpbGUub25lRXJyb3IgPSAxIGVycm9yCitjb21waWxlLnNldmVyYWxFcnJvcnMgPSB7MH0gZXJyb3JzCitjb21waWxlLm9uZVdhcm5pbmcgPSAxIHdhcm5pbmcKK2NvbXBpbGUuc2V2ZXJhbFdhcm5pbmdzID0gezB9IHdhcm5pbmdzCitjb21waWxlLm9uZUNsYXNzRmlsZUdlbmVyYXRlZCA9IDEgLmNsYXNzIGZpbGUgZ2VuZXJhdGVkCitjb21waWxlLnNldmVyYWxDbGFzc0ZpbGVzR2VuZXJhdGVkID0gezB9IC5jbGFzcyBmaWxlcyBnZW5lcmF0ZWQKKworIyMjIGNvbmZpZ3VyZQorY29uZmlndXJlLm5vU291cmNlRmlsZSA9IG5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZAorY29uZmlndXJlLmR1cGxpY2F0ZUxvZyA9IGR1cGxpY2F0ZSBsb2cgc3BlY2lmaWNhdGlvbjogezB9Citjb25maWd1cmUuZHVwbGljYXRlUmVwZWF0ID0gZHVwbGljYXRlIHJlcGVhdCBzcGVjaWZpY2F0aW9uOiB7MH0KK2NvbmZpZ3VyZS5kdXBsaWNhdGVDb21wbGlhbmNlID0gZHVwbGljYXRlIGNvbXBsaWFuY2Ugc2V0dGluZyBzcGVjaWZpY2F0aW9uOiB7MH0KK2NvbmZpZ3VyZS5zb3VyY2UgPSBpbnZhbGlkIHNvdXJjZSBvcHRpb24sIHNvdXJjZSBpcyBlaXRoZXIgJycxLjMnJyBvciAnJzEuNCcnOiB7MH0KK2NvbmZpZ3VyZS5qY2sgPSBpbnZhbGlkIGpjayBvcHRpb24sIGpjayBjb21wbGlhbmNlIGxldmVsIGlzIGVpdGhlciAnJzEuMycnIG9yICcnMS40Jyc6IHswfQorY29uZmlndXJlLmR1cGxpY2F0ZU91dHB1dFBhdGggPSBkdXBsaWNhdGUgb3V0cHV0IHBhdGggc3BlY2lmaWNhdGlvbjogezB9Citjb25maWd1cmUuZHVwbGljYXRlQ2xhc3NwYXRoID0gZHVwbGljYXRlIGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0KK2NvbmZpZ3VyZS5pbnZhbGlkRGVidWdPcHRpb24gPSBpbnZhbGlkIGRlYnVnIG9wdGlvbjogezB9Citjb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24gPSBkdXBsaWNhdGUgdXNhZ2Ugb2Ygd2FybmluZyBjb25maWd1cmF0aW9uCitjb25maWd1cmUuaW52YWxpZFdhcm5pbmdDb25maWd1cmF0aW9uID0gaW52YWxpZCB3YXJuaW5nIGNvbmZpZ3VyYXRpb246IHswfQorY29uZmlndXJlLmludmFsaWRXYXJuaW5nID0gaW52YWxpZCB3YXJuaW5nOiB7MH0KK2NvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ09wdGlvbiA9IGludmFsaWQgd2FybmluZyBvcHRpb246IHswfQorY29uZmlndXJlLnRhcmdldEpESyA9IHRhcmdldCBKREsgc2hvdWxkIGJlIGNvbXByaXNlZCBpbiBiZXR3ZWVuICcnMS4xJycgYW5kICcnMS40Jyc6IHswfQorY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZTE0ID0gJycxLjQnJyBzb3VyY2UgbW9kZSByZXF1aXJlcyAnJy10YXJnZXQgMS40JycgOiB7MH0KK2NvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlMTQgPSAnJzEuNCcnIHNvdXJjZSBtb2RlIHJlcXVpcmVzICcnLTEuNCcnIGNvbXBsaWFuY2UgbW9kZTogezB9Citjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclRhcmdldDE0ID0gJycxLjQnJyB0YXJnZXQgbW9kZSByZXF1aXJlcyAnJy0xLjQnJyBjb21wbGlhbmNlIG1vZGU6IHswfQorY29uZmlndXJlLnJlcGV0aXRpb24gPSByZXBldGl0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyOiB7MH0KK2NvbmZpZ3VyZS5kaXJlY3RvcnlOb3RFeGlzdCA9IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogezB9Citjb25maWd1cmUuSU9FcnJvciA9IGkvbyBlcnJvciA6IHVuYWJsZSB0byByZXRyaWV2ZSAuSkFWQSBmaWxlcyBpbiBkaXJlY3Rvcnk6IHswfQorY29uZmlndXJlLnZlcnNpb24gPSBFY2xpcHNlIEphdmEgQ29tcGlsZXIgezB9LCBDb3B5cmlnaHQgSUJNIENvcnAgMjAwMC0yMDAyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorY29uZmlndXJlLm5vQ2xhc3NwYXRoID0gbm8gY2xhc3NwYXRoIGRlZmluZWQsIHVzaW5nIGRlZmF1bHQgZGlyZWN0b3J5IGluc3RlYWQKK2NvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGggPSBpbmNvcnJlY3QgY2xhc3NwYXRoOiB7MH0KK2NvbmZpZ3VyZS5ub1NvdXJjZSA9IG5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZAorY29uZmlndXJlLmNhbm5vdE9wZW5Mb2cgPSBjYW5ub3Qgb3BlbiAubG9nIGZpbGUKK2NvbmZpZ3VyZS51bmV4cGVjdGVkQ3VzdG9tRW5jb2RpbmcgPSB1bmV4cGVjdGVkIGN1c3RvbSBlbmNvZGluZyBzcGVjaWZpY2F0aW9uOiB7MH1bezF9XQorY29uZmlndXJlLnVuc3VwcG9ydGVkRW5jb2RpbmcgPSB1bnN1cHBvcnRlZCBlbmNvZGluZyBmb3JtYXQ6IHswfQorY29uZmlndXJlLmR1cGxpY2F0ZURlZmF1bHRFbmNvZGluZyA9IGR1cGxpY2F0ZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9uOiB7MH0KKworIyMjIHJlcXVlc3RvcgorcmVxdWVzdG9yLmVycm9yID0gRVJST1IKK3JlcXVlc3Rvci53YXJuaW5nID0gV0FSTklORworcmVxdWVzdG9yLmluID0gaW4gezB9CityZXF1ZXN0b3Iubm90UmV0cmlldmVFcnJvck1lc3NhZ2UgPSBDYW5ub3QgcmV0cmlldmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHswfQorCisjIyMgdW5pdAordW5pdC5tb3JlID0gRmlsZSB7MH0gaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlCit1bml0Lm1pc3NpbmcgPSBGaWxlIHswfSBpcyBtaXNzaW5nCisKKyMjIyBvdXRwdXQKK291dHB1dC5ub0NsYXNzRmlsZUNyZWF0ZWQgPSBObyAuY2xhc3MgZmlsZSBjcmVhdGVkIGZvciBmaWxlIG5hbWVkIHswfSBiZWNhdXNlIG9mIGFuIElPRXhjZXB0aW9uLgorCisjIyMgbWlzY2VsbGFuZW91cworbWlzYy51c2FnZSA9IEVjbGlwc2UgSmF2YSBDb21waWxlciB7MH1cblwKKwkJQ29weXJpZ2h0IElCTSBDb3JwIDIwMDAtMjAwMi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuXAorCQlVc2FnZTogPG9wdGlvbnM+IDxzb3VyY2UgZmlsZXMgfCBkaXJlY3Rvcmllcz5cblxuXAorCQl3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG5cCisJCS1oZWxwCQkJZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZVxuXAorCQktdmVyc2lvbgkJY29tcGlsZXIgdmVyc2lvbiBudW1iZXJcblwKKwkJLWNsYXNzcGF0aAkJPGRpciAxPjs8ZGlyIDI+Oy4uLjs8ZGlyIFA+XG5cCisJCS1kIDxkaXI+CQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGlmIG9taXR0ZWQgbm8gcGFja2FnZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIGNyZWF0ZWQpXG5cCisJCSAgIFx0LWQgbm9uZQkJCW5vIGNsYXNzZmlsZSBpcyBnZW5lcmF0ZWRcblwKKwkJLXRhcmdldCA8dmVyPgkJY2xhc3NmaWxlIHRhcmdldCBzZXR0aW5nICgxLjEgb3IgMS4yLCBkZWZhdWx0IGlzIDEuMSlcblwKKwkJLTEuMyAJCQlzZXQgY29tcGxpYW5jZSBsZXZlbCB0byAxLjMgKGRlZmF1bHQpXG5cCisJCS0xLjQgCQkJc2V0IGNvbXBsaWFuY2UgbGV2ZWwgdG8gMS40XG5cCisJCS1zb3VyY2UgPHZlcj4JCWFzc2VydGlvbnMgdG9nZ2xlICgxLjMgb3IgMS40LCBkZWZhdWx0IGlzIDEuMyBpbiAtMS4zIG1vZGUgYW5kIDEuNCBpbiAtMS40IG1vZGUpXG5cCisJCS1ub3dhcm4JCQlubyB3YXJuaW5nIChlcXVpdmFsZW50IHRvICcnLXdhcm46bm9uZScnKVxuXAorCQktd2FybjogPGxldmVsPgkJc2V0IHdhcm5pbmcgbGV2ZWwgKGUuZy4gJyctd2Fybjp1bnVzZWRMb2NhbHMsZGVwcmVjYXRpb24nJylcblwKKwkJXHRjb25zdHJ1Y3Rvck5hbWUJCXdhcm4gbWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZVxuXAorCQlcdHBhY2thZ2VEZWZhdWx0TWV0aG9kCXdhcm4gYXR0ZW1wdCB0byBvdmVycmlkZSBwYWNrYWdlLWRlZmF1bHQgbWV0aG9kXG5cCisJCVx0ZGVwcmVjYXRpb24JCXdhcm4gdXNhZ2Ugb2YgZGVwcmVjYXRlZCB0eXBlIG9yIG1lbWJlclxuXAorCQlcdG1hc2tlZENhdGNoQmxvY2tzCXdhcm4gaGlkZGVuIGNhdGNoIGJsb2NrXG5cCisJCVx0dW51c2VkTG9jYWxzCQl3YXJuIG9uIHVudXNlZCBsb2NhbCB2YXJpYWJsZSAobmV2ZXIgcmVhZClcblwKKwkJXHR1bnVzZWRBcmd1bWVudHMJCXdhcm4gb24gdW51c2VkIG1ldGhvZCBhcmd1bWVudCAobmV2ZXIgcmVhZClcblwKKwkJXHR1bnVzZWRJbXBvcnRzCQl3YXJuIG9uIHVudXNlZCBpbXBvcnRzXG5cCisJCVx0c3ludGhldGljQWNjZXNzCQl3YXJuIHdoZW4gcGVyZm9ybWluZyBzeW50aGV0aWMgYWNjZXNzIGZvciBpbm5lcmNsYXNzXG5cCisJCVx0YXNzZXJ0SWRlbnRpZmllcgl3YXJuIG9jY3VycmVuY2Ugb2YgJydhc3NlcnQnJyB1c2VkIGFzIGlkZW50aWZpZXJcblwKKwkJLWRlcHJlY2F0aW9uCQllcXVpdmFsZW50IHRvIC13YXJuOmRlcHJlY2F0aW9uLlxuXAorCQktZ1s6PGxldmVsPl0JCWRlYnVnIGF0dHJpYnV0ZXMgbGV2ZWxcblwKKwkJCVx0LWcJCQlhbGwgZGVidWcgaW5mbyAoJyctZzpsaW5lcyx2YXJzLHNvdXJjZScnKVxuXAorCQkJXHQtZzpub25lCQkJbm8gZGVidWcgaW5mb1xuXAorCQkJXHQtZzpbbGluZXMsdmFycyxzb3VyY2VdCXNlbGVjdGl2ZSBkZWJ1ZyBpbmZvXG5cCisJCS1wcmVzZXJ2ZUFsbExvY2Fscwljb2RlIGdlbiBwcmVzZXJ2ZSBhbGwgbG9jYWwgdmFyaWFibGVzIChmb3IgZGVidWcgcHVycG9zZSlcblwKKwkJLW5vSW1wb3J0RXJyb3IJCW5vIGVycm9ycyBmb3IgdW5yZXNvbHZlZCBpbXBvcnRzXG5cCisJCS1lbmNvZGluZwkJc3BlY2lmeSBkZWZhdWx0IHNvdXJjZSBlbmNvZGluZyBmb3JtYXQgKGN1c3RvbSBlbmNvZGluZyBjYW4gYWxzbyBiZSBzcGVjaWZlZCBvblxuXAorCQlcdFx0XHRhIHBlciBmaWxlIGJhc2lzIGJ5IHN1ZmZpeGluZyBlYWNoIGlucHV0IHNvdXJjZSBmaWxlL2ZvbGRlciBuYW1lIHdpdGggJ1tlbmNvZGluZ10nKVxuXAorCQktbG9nIDxmaWxlbmFtZT4JCXNwZWNpZnkgYSBsb2cgZmlsZVxuXAorCQktcHJvY2VlZE9uRXJyb3IJCWtlZXAgY29tcGlsaW5nIHdoZW4gZXJyb3IsIGR1bXBpbmcgY2xhc3MgZmlsZXMgd2l0aCBwcm9ibGVtIG1ldGhvZHNcblwKKwkJLXZlcmJvc2UJCXByaW50IGFjY2Vzc2VkL3Byb2Nlc3NlZCBjb21waWxhdGlvbiB1bml0cyBcblwKKwkJLXJlZmVyZW5jZUluZm8JCWNvbXB1dGUgcmVmZXJlbmNlIGluZm9cblwKKwkJLXByb2dyZXNzCQlzaG93IHByb2dyZXNzIChvbmx5IGluIC1sb2cgbW9kZSlcblwKKwkJLXRpbWUJCQlkaXNwbGF5IHNwZWVkIGluZm9ybWF0aW9uXG5cCisJCS1ub0V4aXQJCQlkbyBub3QgY2FsbCBTeXN0ZW0uZXhpdChuKSBhdCBlbmQgb2YgY29tcGlsYXRpb24gKG49MCBpZiBubyBlcnJvcilcblwKKwkJLXJlcGVhdCA8bj4JCXJlcGVhdCBjb21waWxhdGlvbiBwcm9jZXNzIDxuPiB0aW1lcyAocGVyZiBhbmFseXNpcylcbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4NTI4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgICouamFyLFwKKyAgICAgICAgICAgICAgIC5vcHRpb25zCitqYXZhZG9jLnBhY2thZ2VzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuKixcCisgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKixcCisgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC4qLFwKKyAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLiosXAorICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qLFwKKyAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKgorc291cmNlLmpkdGNvcmUuamFyID0gYmF0Y2gvLFwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGVhc3Npc3QvLFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyLyxcCisgICAgICAgICAgICAgICAgICAgICBldmFsLyxcCisgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIvLFwKKyAgICAgICAgICAgICAgICAgICAgIGRvbS8sXAorICAgICAgICAgICAgICAgICAgICAgbW9kZWwvLFwKKyAgICAgICAgICAgICAgICAgICAgIHNlYXJjaC8KK3NvdXJjZS5qZHRDb21waWxlckFkYXB0ZXIuamFyID0gYW50YWRhcHRlci8KK2phcnMuY29tcGlsZS5vcmRlcj1qZHRjb3JlLmphcixqZHRDb21waWxlckFkYXB0ZXIuamFyCitqYXJzLmV4dHJhLmNsYXNzcGF0aD0uLi9vcmcuYXBhY2hlLmFudC9hbnQuamFyCitzcmMuaW5jbHVkZXM9YWJvdXQuaHRtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVjMTBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCkBAIC0wLDAgKzEsNDMzOSBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5KRFQvQ29yZSBSZWxlYXNlIE5vdGVzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgR001IC0gMjd0aCBKdW5lIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjY0Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Q2hhbmdlZCBBU0NJSS9iaW5hcnkgcHJvcGVydHkgZm9yICdhYm91dC5odG1sJyBmaWxlIHRvIEFTQ0lJLjwvbGk+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIEdNNCAtIDI2dGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTMiPjIwNTUzPC9hPiAgCitEb2MgLSBKYXZhZG9jcyBvZiAyLjAgY2xhc3NlcyBtdXN0IHNwZWNpZnkgaWYgdGhlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudC4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDQyIj4yMDQ0MjwvYT4gIAorRG9jIC0gSmF2YWRvYyBtaXNzaW5nIGluIElDb2RlU25pcHBldFJlcXVlc3RvciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTAiPjIwNTUwPC9hPiAKK0RvYyAtIGZpZWxkcyBvZiBDb3JyZWN0aW9uRW5naW5lIHNob3VsZCBub3QgYmUgQVBJCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NzIiPjIwODcyPC9hPiAgCitEb2MgLSB0aGUgamF2YWRvYyBpcyBub3QgY29ycmVjdCBmb3IgSUNvZGVBc3Npc3QjY29kZVNlbGVjdAorPGJyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkzNiI+MjA5MzY8L2E+ICAKK251bGxwb2ludGVyIGV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkphdmFCdWlsZGVyCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyNCAtIDI0dGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlVwZGF0ZWQgYWJvdXQuaHRtbCBmaWxlLgorPC9saT4KKzwvdWw+IAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MjEgLSAyMXN0IEp1bmUgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzwvdWw+IAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjkzIj4yMDY5MzwvYT4gIAorRmluZGluZyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBkb2VzIG5vdCBmaW5kIGFsbCBvY2N1cmFuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwMTEiPjIwMDExPC9hPiAgCitTZWFyY2hpbmcgZm9yIElubmVyIENsYXNzZXMgZ2l2ZXMgYmFkIHNlYXJjaCByZXN1bHRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1MjAiPjIwNTIwPC9hPiAgCitSZWZhY3RvciAtIGV4cHJlc3Npb24gZGV0ZWN0aW9uIGluY29ycmVjdAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY0MyI+MjA2NDM8L2E+ICAKK0phdmEgUHJvamVjdHMgZGlzYXBwZWFyCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyMCAtIDIwdGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1MzIiPjIwNTMyPC9hPiAgCitEZWNsYXJhdGlvbiBvZiBtZW1iZXIgYmluYXJ5IHR5cGUgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTc5OSI+MTk3OTk8L2E+ICAKK01vcmUgcHJvYmxlbXMgd2l0aCBpbXBvcnRpbmcuICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE0MCI+MTYxNDA8L2E+CitOb24tamF2YSBwcm9qZWN0IGdldHMgLmNsYXNzcGF0aAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY1OSI+MjA2NTk8L2E+ICAKK0NvbXBpbGUvcmVidWlsZCBhbmFseXNpczogd2hpdGUgc3BhY2UgY2F1c2VzIGxhcmdlIHJlYnVpbGQKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjE4IC0gMTh0aCBKdW5lIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU5Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+VXBkYXRlZCBhYm91dC5odG1sIGZpbGUgd2l0aCByZWZlcmVuY2UgdG8gQ1BMIDEuMC4KKzwvbGk+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjE3IC0gMTd0aCBKdW5lIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU4Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmVtb3ZlZCBkZXByZWNhdGVkIDIuMCB0ZW1wb3JhcnkgQVBJOiA8Y29kZT5JV29ya2luZ0NvcHkjZmluZFNoYXJlZFdvcmtpbmdDb3B5KCk8L2NvZGU+IHdoaWNoIHdhcyBubyBsb25nZXIgdXNlZCBhbnl3YXkuIFByb3BlciBBUEkgaXMgdGFraW5nIAorYSA8Y29kZT5JQnVmZmVyRmFjdG9yeTwvY29kZT4gaW4gYXJndW1lbnQuPC9saT4KKzwvdWw+IAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDI3Ij4yMDQyNzwvYT4KK0o5YyBuZWVkcyBpbnRlcm5hbCBiYXRjaCBjb21waWxlciBtZXRob2RzIHRvIGJlIHB1YmxpYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzA5Ij4yMDMwOTwvYT4KK2Nhbm5vdCBjb2RlIHJlc29sdmUgb24gYmluYXJ5IG1ldGhvZCB3aXRoIG1lbWJlciB0eXBlIGFyZ3VtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTU4Ij4yMDE1ODwvYT4KK0Nsb3NlIGFuZCByZW9wZW4gYSBwcm9qZWN0IGRvZXMgbm90IHJlbW92ZSBlcnJvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyNSI+MjAzMjU8L2E+CitDUCBWYXJpYWJsZSAtIHNob3VsZCBub3QgcGVyc2lzdCAiaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MiIHZhbHVlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxNzMiPjIwMTczPC9hPgorT3BlbiB0eXBlIGZyb20gYSBqYXIgbG9jYXRlZCBpbnNpZGUgYSBjbG9zZWQgcHJvamVjdC4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEzNSI+MjAxMzU8L2E+CisyLjAgZGVwcmVjYXRlZCBtZXRob2QKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzNTkiPjIwMzU5PC9hPgorY2xhc3NwYXRoIHZhcmlhYmxlIEVDTElQU0VfSE9NRSBub3QgaW5pdGlhbGl6ZWQgb24gc3RhcnR1cAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjYxIj4yMDI2MTwvYT4KK2N5Y2xlIGluIGNsYXNzcGF0aCBkZXRlY3Rpb24gc2VlbXMgb3ZlcnplYWxvdXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgyNiI+MTk4MjY8L2E+CitsaXZlbG9jayBkdXJpbmcgaW5kZXhpbmc/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwNDgiPjIwMDQ4PC9hPgorTWluaW1pemUgcmVjb21waWxhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDUzIj4yMDA1MzwvYT4KK2ludGVyZmFjZSB3aXRoIHNhbWUtbmFtZWQgbWV0aG9kIGdlbmVyYXRlcyBjb21waWxlIGVycm9yCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxMiAtIDEydGggSnVuZSAyMDAyIC0gRlJFRVpFIDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU3Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUzNyI+MTk1Mzc8L2E+CitJbnRlcm5hbCBlcnJvciBzYXZpbmcgZmlsZSAoanplbnRyeSA9PSAwKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTE3Ij4xOTkxNzwvYT4KK0NvZGUgQXNzaXN0IGluY29ycmVjdCBmb3IgaGlkZGVuIGludGVyZmFjZSBmaWVsZHMKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MTYiPjE5OTE2PC9hPgorRXJyb3IgYWNjZXNzaW5nIHZhbHVlIGZyb20gdW5pbml0aWFsaXplZCBsb2NhbHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NjYiPjE5NTY2PC9hPgorSW52YWxpZCBDbGFzc0Nhc3RFeGNlcHRpb24gdGhyb3duIGF0IHJ1bnRpbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA2Ij4zMzA2PC9hPgorQ2FuJ3QgY29tcGlsZSBKREsgc3JjCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NTEiPjE5ODUxPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIHJlZmFjdG9yLWV4dHJhY3QgbWV0aG9kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNzIiPjcyNzI8L2E+CitPcGVuIG9uIHNlbGVjdGlvbiBub3Qgd29ya2luZyBpbiBleHRlcm5hbCBKQVJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMTkiPjE0MjE5PC9hPgorRU9GIGV4Y2VwdGlvbiBhZnRlciBidWlsZGluZyBpbiBpbXBvcnRlZCBwbHVnaW4gd2l0aCBleHRyYWN0ZWQgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyOTAiPjE4MjkwPC9hPgorSW5jb3JyZWN0IGVycm9ycyByZXBvcnRlZCBkdXJpbmcgcmVjb25jaWxpbmcKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjExIC0gMTF0aCBKdW5lIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBBZGRlZCBwcm90ZWN0aW9uIGFyb3VuZCBsaXN0ZW5lciBjYWxsYmFjayBpbnZvY2F0aW9ucyAodXNpbmcgPGNvZGU+SVNhZmVSdW5uYWJsZTwvY29kZT4pLiA8L2xpPgorPGxpPiBSZW1vdmVkIDIgdW51c2VkIGRlcHJlY2F0ZWQgY29uc3RhbnRzIG9uIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzPC9jb2RlPjogUkVBRF9SRUZFUkVOQ0VTIGFuZCBXUklURV9SRUZFUkVOQ0VTLgorVGhleSB3ZXJlIGFubm90ZWQgd2l0aCBpbnRlbnRpb24gdG8gZGlzY2FyZCBiZWZvcmUgMi4wIHNpbmNlIHdlcmUgdGVtcG9yYXJpbHkgaW50cm9kdWNlZCBhbmQgZGVwcmVjYXRlZCAoZHVlIHRvIGJhZCBuYW1pbmcpLgorPHByZT4KKwkvKiogCisJICogQGRlcHJlY2F0ZWQgLSB1c2UgV1JJVEVfQUNDRVNTRVMgaW5zdGVhZCAod2lsbCBiZSBkaXNjYXJkZWQgYmVmb3JlIDIuMCkKKwkgKiBAc2luY2UgMi4wCisJICovCisJaW50IFdSSVRFX1JFRkVSRU5DRVMgPSBXUklURV9BQ0NFU1NFUzsKKwk8L3ByZT48L2xpPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk3MTQiPjE5NzE0PC9hPgorRWNsaXBzZSBjcmFzaGVzOiBEcmFnICYgRHJvcAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5Nzk0Ij4xOTc5NDwvYT4KK01ldGhvZCBib2R5IGNoYW5nZSBtYXkgcmVzdWx0IGluIG1hc3NpdmUgcmVjb21waWxhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTgzIj4xODk4MzwvYT4KK1JlcGxhY2luZyBiaW5hcnkgcHJvamVjdCBkb2Vzbid0IHRyaWdnZXIgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk1MyI+MTg5NTM8L2E+CitQYWNrYWdlIGRpc2FwZWFycyB3aGVuIGRpc2Nvbm5lY3RlZCBmcm9tIENWUyByZXBvcHNpdG9yeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NjM4Ij4xOTYzODwvYT4KK09wZW4gVHlwZSBIaWVyYXJjaHkgY2FuIHN0YXJ0IGluZmluaXRlIHByb2dyZXNzIG1vbml0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTY4NyI+MTk2ODc8L2E+CitQcmVmZXJlbmNlcyBub3Qgd29ya2luZyB3aXRoIGltcG9ydC9leHBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUxMiI+MTk1MTI8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZCBkdXJpbmcgaW5jcmVtZW50YWwgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODkyMiI+MTg5MjI8L2E+CitTY3JhcGJvb2sgZG9lcyBub3QgY29tZSBiYWNrIHdoZW4gZXJyb3JzIGluIHNuaXBwZXQgIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgwOCI+MTk4MDg8L2E+Citjb3JlIENsYXNzQ2FzdEV4Y2VwdGlvbiBleGNlcHRpb24gaW4gbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4ODIiPjE5ODgyPC9hPgorbWF5YmUgYSBjdSdzIHNpbmdsZSB0eXBlIGNhbiBiZSBpdHMgcHJvaW1hcnkgdHlwZSB0b28KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU4NiI+MTk1ODY8L2E+CitKYXZhIHByb2plY3QgcmVtb3ZlZCBmcm9tIFByb2plY3RzIHZpZXcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk3MiI+MTU5NzI8L2E+CitKQVIgZmlsZSBmcm9tIGNsYXNzcGF0aCBub3QgaW5kZXhlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjgwIj4xODY4MDwvYT4KK0NsYXNzcGF0aCBMb29wCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYwNiAtIDZ0aCBKdW5lIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlJlbW92ZWQgZGVwcmVjYXRlZCBBUEkgb24gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4gVGhlc2Ugd2VyZSBub3QgaW4gMS4wLCBhbmQgc2hvdWxkbid0IGhhdmUgYmVlbgoraW50cm9kdWNlZCAoaW5jb3JyZWN0bHkgcmVzdXJyZWN0ZWQgZnJvbSAwLjkpLgorICA8dWw+CisJPGxpPjxjb2RlPklKYXZhUHJvamVjdCNnZXRDbGFzc3BhdGgoLi4uKSAtLSZndDsgSUphdmFQcm9qZWN0I2dldFJhd0NsYXNzcGF0aCguLi4pIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5JSmF2YVByb2plY3Qjc2V0Q2xhc3NwYXRoKC4uLikgLS0mZ3Q7IElKYXZhUHJvamVjdCNzZXRSYXdDbGFzc3BhdGgoLi4uKSA8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+SUphdmFQcm9qZWN0I25ld1Byb2plY3RFbnRyeSguLi4pIC0tJmd0OyBKYXZhQ29yZSNuZXdQcm9qZWN0RW50cnkoLi4uKSA8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+SUphdmFQcm9qZWN0I25ld0xpYnJhcnlFbnRyeSguLi4pIC0tJmd0OyBKYXZhQ29yZSNuZXdMaWJyYXJ5RW50cnkoLi4uKSA8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+SUphdmFQcm9qZWN0I25ld1NvdXJjZUVudHJ5KC4uLikgLS0mZ3Q7IEphdmFDb3JlI25ld1NvdXJjZUVudHJ5KC4uLikgPC9jb2RlPjwvbGk+CisgIDwvdWw+Cis8L2xpPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkzMDMiPjE5MzAzPC9hPiAgCitPcGVuIHR5cGUgZG9lcyBub3Qgc2hvdyBhbGwgdHlwZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEwOSI+MTQxMDk8L2E+ICAKK0RlYWRsb2NrIGJldHdlZW4gUHJvYmxlbVRyZWVWaWV3ZXIgcmVmcmVzaCBhbmQgcmVjb25jaWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjU0Ij4xOTI1NDwvYT4gIAorU29tZSBsb2NhbCB2YXJpYWJsZSBjb21wbGV0aW9uIHByb3Bvc2FscyBhcmUgbWlzc2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkxMzEiPjE5MTMxPC9hPiAgCitOUEUgd2hlbiByZW1vdmluZyBhIHByb2plY3QgY29udGFpbmluZyBtaXNzaW5nIGNsYXNzZmlsZSBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTA1OCI+MTkwNTg8L2E+ICAKK0Nsb3Npbmcgbm9uLWphdmEgcHJvamVjdCBkb2Vzbid0IHJlbW92ZSByb290IGZyb20gamF2YSBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU4NCI+MTg1ODQ8L2E+ICAKK05ldyAyLjAgQVBJcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBzaG91bGQgYmUgcmVtb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Njk4Ij4xODY5ODwvYT4gIAorU2VlaW5nIG5vbi1qYXZhIHByb2plY3RzIGluIHBhY2thZ2UgdmlldworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTIwIj4xODkyMDwvYT4gIAorTlBFIHNlYXJjaGluZyBmb3IgcmVmZXJlbmNlcyB0byBhIG1lc3NhZ2UgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NzQ5Ij4xODc0OTwvYT4KK01pc3NpbmcgamF2YSBkb2MgZm9yIElDb25zdGFudFBvb2xFbnRyeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTgzIj4xODU4MzwvYT4gIAorTmV3IGNvbnN0YW50cyBub3QgdGFnZ2VkIHdpdGggQHNpbmNlIDIuMCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3MDgiPjE4NzA4PC9hPgorRE9NIEFTVCAtIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvcmdhbml6aW5nIGltcG9ydHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODAzOSI+MTgwMzk8L2E+CitPcGVuaW5nIC5jbGFzcyBmaWxlIGZhaWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2MjEiPjE4NjIxPC9hPgorUXVlcnkgYWxsIHR5cGVzIHdoZW4gcHJvamVjdCBpcyBjbG9zZWQgcHJldmVudHMgcmVpbmRleGluZyB3aGVuIHByb2plY3QgaXMgb3BlbiAgCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjcxIj4xOTI3MTwvYT4gICAgCitJT0V4Y2VwdGlvbiB3aGVuIHNlYXJjaGluZyBmb3IgcGFja2FnZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MTYiPjc5MTY8L2E+ICAKK0NvZGUgYXNzaXN0IGRvZXMgbm90IGZpbmQgY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQyNCI+MTk0MjQ8L2E+ICAKK0pEVCBwcm9jZXNzaW5nIGRlbHRhcyBmb3Igbm9uLWphdmEgZmlsZXMgaW4gbm9uLWphdmEgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYzMyI+MTg2MzM8L2E+ICAKK0J1aWxkIGZhaWxlZDogQ2FuIG5vdCBmaW5kIHRoZSBjbGFzcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Jbml0aWFsaXplcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTc1Ij4xODE3NTwvYT4gIAorUXVpY2tmaXggZmFsc2UgcG9zaXRpdmVzIGZvciBub24tcHVibGljIGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI5MyI+MTkyOTM8L2E+ICAKK2NhbmNlbGxpbmcgY29tcGlsaW5nIGRvZXMgbm90IGFsd2F5cyBjYW5jZWwKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUzOSI+MTg1Mzk8L2E+ICAKK3VuYWJsZSB0byBydW4gSkRCQyBwcm9ncmFtLCBjbGFzcyBub3QgZm91bmQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjkyIj4zMjkyPC9hPiAgCitBZGRpbmcgbmV3IGNsYXNzIHRha2VzIHZlcnkgbG9uZyAoPjIwcykgKDFHRVVHRlEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzMyI+MzMzMzwvYT4gIAorSmF2YUNvcmUgZG9lcyBub3QgcmVjb2duaXplIGRvdCBub3RhdGlvbiBmb3IgaW5uZXIgY2xhc3NlcyAoMUdJN0daRykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTA3Ij4xODUwNzwvYT4KK292ZXJ3cml0dGluZyBleGl0aW5nIGZpbGUgZG9lcyBub3Qgd29yaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDE0Ij4xODQxNDwvYT4KK05MUyBUb29sczogRmluZCBzdHJpbmdzIGFuZCBjb21waWxlciB3YXJuaW5nIG91dCBvZiBzeW5jaCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjA1Ij41NjA1PC9hPiAgICAKK05QRSByZXN0YXJ0aW5nIHdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTIiPjMyNTI8L2E+ICAgIAorQ29kZSBhc3Npc3QgbGlzdCBjb3VsZCBiZSBuYXJyb3dlciBpbiB0aHJvd3MgY29tcGxldGlvbiAoMUdEMDc0QykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODcyNCI+MTg3MjQ8L2E+ICAgIAorQ29kZSBmb3IgdGhlIHN0YXRpYyBpbml0aWFsaXplciBpcyBleGNlZWRpbmcgdGhlIDY1NTM1IGJ5dGVzIGxpbWl0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3MiI+MzI3MjwvYT4gICAgCitDb2RlQ29tcGxldGlvbiAtIHNob3VsZCBvbmx5IHJlc29sdmUgaW50ZXJmYWNlcyAoMUdFNUI4WCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjU5Ij42MjU5PC9hPiAgICAKK0RDUjogSUNsYXNzcGF0aEVudHJ5IHdpdGggSmF2YURvYyBsb2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDA3Ij4xMDAwNzwvYT4gICAgCitOUEUgYW5kIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIHJlbmFtaW5nIGNsYXNzIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIyIj4zMjIyPC9hPiAgICAKK0pNIC0gUmVtaW5kZXIgLSByZS1lbmFibGUgdHJhbnNpZW50IHJlY29uY2lsaW5nIG1hcmtlciAgKDFHQUo5RlEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2NyI+MzI2NzwvYT4gICAgCitEZWFkbG9jayB3aGlsZSByZWZyZXNoaW5nIGZvcm0gbG9jYWwgKDFHRFRVU0QpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU4MyI+NTU4MzwvYT4gICAgCitnZXROb25KYXZhUmVzb3VyY2VzIGRvZXMgbm90IHJldHVybiAuY2xhc3MgZmlsZXMgZm9yIHNvdXJjZSBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzEiPjE2MzcxPC9hPiAgICAKK0phdmEgTW9kZWwgRXhjZXB0aW9uIHVzaW5nIGNvZGUgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MjYiPjE3NjI2PC9hPiAgICAKK0F1dG8tZm9ybWF0IHNvdXJjZSByZW1vdmVkIG5ld2xpbmUgYXQgZW5kIG9mIHJhbmdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg2MyI+ODg2MzwvYT4gICAgCisuY2xhc3NwYXRoIGdldHMgb3ZlcndyaXR0ZW4gaWYgdGhlcmUncyBhbiBYTUwgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM1Ij4zMzM1PC9hPiAgICAKK0phdmEgRWxlbWVudCBEZWx0YXM6IFBlcmZvcm1hbmNlIGlzc3VlcyB3aXRoIGRlbHRhcyBmcm9tIFdvcmtpbmcgQ29weSAoMUdJRTM2SikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUzIj4zMjUzPC9hPiAgICAKK1NFVkVSRTogTm90IGFsbCBleHRlcm5hbCBKQVJzIHNob3cgdXAgaW4gcGFja2FnZXMgdmlldyAoMUdEMEpaTykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM0Ij4xODM0PC9hPiAgICAKK0NhbmNlbCBidWlsZCB3aXRoIDEwMDAwKyBwcm9ibGVtcyB0YWtlcyBmb3JldmVyIHRvIHVwZGF0ZSAoMUcyUTlZWikKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjAxIC0gMXN0IEp1bmUgMjAwMiAtIEZSRUVaRSAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSByZXNvdXJjZSBjb3B5IGV4Y2x1c2lvbiBmaWx0ZXIgbm93IHRvbGVyYXRlcyB3aGl0ZXNwYWNlcyBpbnNpZGUgdGhlIGZpbHRlciBwYXR0ZXJuLCB0aGV5IHdpbGwgYmUgdHJpbW1lZAord2hlbiB1c2VkLiBlLmcuICIgIC4qICAgLCAgZm9vLyAiIGlzIG5vdyBhY2NlcHRlZC48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ0NiI+MTg0NDY8L2E+ICAKK0phdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciBvbiBub3QgeWVzdCBjcmVhdGVkIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQxMSI+MTg0MTE8L2E+ICAKK0V4dGVybmFsIEpBUiByZWZyZXNoIC0gY2FjaGluZyBwcm9ibGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0NTMiPjE4NDUzPC9hPiAgCitEZWxldGluZyBwcm9qZWN0IGRvZXNuJ3QgcmVtb3ZlIHBrZyBmcmFnbWVudCByb290IGluIGFub3RoZXIgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMzEiPjE4MzMxPC9hPiAgICAKK0phdmEgTW9kZWwgbm90IGZsdXNoZWQgd2hlbiB1cGdyYWRpbmcgYmluYXJ5IHByb2plY3RzICAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MzEgLSAzMXN0IE1heSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTMKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5DaGFuZ2luZyAyLjAgQVBJIGZvciByZWZyZXNoaW5nIGV4dGVybmFsIEpBUnMgc28gYXMgdG8gcGFzcyBpbiBhIGNvbGxlY3Rpb24gb2YgKmVsZW1lbnRzKiB0byByZXN0cmFpbiB0aGUgc2NvcGUKK29mIHRoZSB1cGRhdGUgKHNlZSA8Y29kZT5JSmF2YU1vZGVsI3JlZnJlc2hFeHRlcm5hbEFyY2hpdmVzKElKYXZhRWxlbWVudFtdLElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4gRWxlbWVudHMgCitjYW4gZWl0aGVyIGJlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMsIHByb2plY3RzIG9yIEphdmEgbW9kZWwuPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MTgiPjE4NDE4PC9hPiAgCisgc2VhcmNoOiBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyByZXBvcnRzIGltcG9ydCBkZWNsYXJhdGlvbnMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Mjg3Ij4xODI4NzwvYT4gIAorJmx0O0NsaW5pdCZndDsgY2hhbmdlIGlzIHRyZWF0ZWQgYXMgYSBzdHJ1Y3R1cmFsIGNoYW5nZSBieSBpbmNyZW1lbnRhbCBidWlsZGVyCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzY2Ij4xNzc2NjwvYT4KK1N0cmFuZ2UgZXJyb3Igd2hlbiBsYXVuY2hpbmcgRWNsaXBzZSBmcm9tIGluc2lkZSBFY2xpcHNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Mzk2Ij4xODM5NjwvYT4KK2FudCBqYXZhYyB0YXJnZXQgaWdub3JlcyBzb3VyY2U9IjEuNCIgc2V0dGluZyBpbnNpZGUgZWNsaXBzZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE4NyI+MTQxODc8L2E+ICAKK2Vycm9yIHJlYnVpbGRpbmcgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjA3Ij4xNDYwNzwvYT4gIAorUmVmYWN0b3I6IHJlbmFtZSBpc24ndCB1cGRhdGluZyByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzIiPjE2MTcyPC9hPiAgCitOYW1lbG9va3VwIHNsb3cgdG8gcmV0cmlldmUgcGFja2FnZSBmcmFnbWVudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNTciPjE4MTU3PC9hPiAgICAKK0ludGVybmFsIEVycm9yIHdoZW4gZGVsZXRpbmcgcHJvamVjdCAgCisgPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjU5Ij4xODI1OTwvYT4gIAorY2hhbmdpbmcgY2xhc3NwYXRoIGNhdXNlcyBzaWduaWZpY2FudCByZWNvbXBpbGF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzOTQiPjEwMzk0PC9hPiAgCitzeW1ib2xpYyBsaW5rcyB1cHNldCBKUkUgcGF0aCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTMwMiI+OTMwMjwvYT4KK0FuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhcyBiZWVuIGRldGVjdGVkIGluIG5hdGl2ZSBjb2RlIG91dHNpZGUgdGhlIFZNCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUzMCAtIDMwdGggTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1MgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkNvbXBpbGVyIGNhbiBub3cgb3B0aW9uYWxseSByZXBvcnQgdW51c2VkIGltcG9ydHMuIFNlZSBvcHRpb24gbmFtZWQgIiIgb24gPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+IGNvbW1lbnQKKzxwcmU+CisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIEltcG9ydAorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgaW1wb3J0IAorCSAqICAgIHJlZmVyZW5jZSAKKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkiaWdub3JlIgorPC9wcmU+CitOb3RlIHRoYXQgaWYgaW1wb3J0IHByb2JsZW1zIChzZXBhcmF0ZSBzZXR0aW5ncykgYXJlIGRpc2FibGVkLCB1bnVzZWQgaW1wb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCBlaXRoZXIuCitUaGlzIG9wdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB0byB0aGUgYmF0Y2ggY29tcGlsZXIgKCItd2Fybjp1bnVzZWRJbXBvcnRzIikuIEltcGxlbWVudGF0aW9ucyBvZiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4KK2NhbiBpZGVudGlmeSB0aGlzIG5ldyBwcm9ibGVtIHRocm91Z2ggaXRzIElEIDxjb2RlPklQcm9ibGVtI1VudXNlZEltcG9ydDwvY29kZT4uCis8L2xpPgorPGxpPkFkZGVkIEFQSSBvbiBJVHlwZSBzbyBhcyB0byB0ZWxsIHdoZXRoZXIgYSB0eXBlIGlzIGFub255bW91cywgbG9jYWwgb3IgbWVtYmVyLjwvbGk+Cis8bGk+Q2hhbmdpbmcgMi4wIEFQSSBmb3IgcmVmcmVzaGluZyBleHRlcm5hbCBKQVJzIHNvIGFzIHRvIHBhc3MgaW4gYSBjb2xsZWN0aW9uIG9mIHByb2plY3RzIHRvIHJlc3RyYWluIHRoZSBzY29wZQorb2YgdGhlIHVwZGF0ZSAoc2VlIDxjb2RlPklKYXZhTW9kZWwjcmVmcmVzaEV4dGVybmFsSkFScyhJSmF2YVByb2plY3RbXSxJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4uIDwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTA2Ij4xNzkwNjwvYT4KK1JlbmFtZSBwYWNrYWdlIGZhaWxzIHdoZW4gaW5uZXIgY2xhc3NlcyBhcmUgaW1wb3J0ZWQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjU1Ij4xODI1NTwvYT4KK05QRSBkdXJpbmcgT3JnYW5pemUgaW1wb3J0cy4uLi4gU2VlIHRlc3Q1IGluIFVJIHRlc3RzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTY5Ij4xODE2OTwvYT4KK2FzdDogaW5jb3JyZWN0IGxlbmd0aCBvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGZvciBzb21lIGFycmF5IGRlY2xhcmF0aW9ucyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzOCI+MTgxMzg8L2E+CitSZXNvbHZpbmcgZmFpbHVyZSBpbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEzNSI+MTgxMzU8L2E+CitpbXBvcnRpbmcgcGx1Z2lucyByZXN1bHRlZCBpbiA5TUIgb2YgZXJyb3JzIGFkZGVkIHRvIGxvZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTkwIj4xODE5MDwvYT4KK2FkZCBhIG5ldyBQYWNrYWdlRnJhZ21lbnRSb290IGRvZXMgbm90IHVwZGF0ZSB0aGUgbmFtZSBsb29rdXAgb2YgZGVwZW5kZW50IHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NDEiPjE1NDQxPC9hPgorSW1wb3J0YW50OiBQcm9ibGVtIGhpZ2hsaWdodCBpcyBvdXQgb2Ygc3luYyB3aXRoIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2NDkiPjEyNjQ5PC9hPgorTWlzc2luZyBpbXBvcnQgYWZ0ZXIgbW92ZSAgCisgICAKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDQyIj4xODA0MjwvYT4KK0FTVDogUmVzb2x2aW5nIGZhaWxlcyB3aXRoIHNlbWljb2xvbiB3aGlsZSBsb29wIGJvZHkgCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyOSAtIDI5dGggTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1MQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA3OCI+MTgwNzg8L2E+CittZW1vcnkgbGVhayAtIGRlc3Ryb3kgYSBXb3JraW5nQ29weSByZW1vdmUgYW5kIHJlLWFkZCBoaXMgYnVmZmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxODciPjE2MTg3PC9hPgorUHJvYmxlbXMgb2NjdXJlZCBidWlsZGluZyBzZWxldGVkIHJlc291cmNlcy4gTWVtYmVyVHlwZUJpbmRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODAyOSI+MTgwMjk8L2E+CitkaXNhc3NlbWJsZWQgY29kZSB2aWV3ZXIgaGFuZGxlcyBcbiBpbmNvcnJlY3RseSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkyMiI+MTc5MjI8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gb24gcmVuYW1lIHRlbXAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNTQiPjE4MDU0PC9hPgorSkRUL0NvcmUgaXMgdXNpbmcgdGhlIHBsYXRmb3JtIGVuY29kaW5nIGluc3RlYWQgb2YgdGhlIGVuY29kaW5nIHNldCBpbiB0aGUgVUkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkyMyI+MTc5MjM8L2E+CitDYW4ndCBmaW5kIHJlZnMgdG8gYmluYXJ5IGZpZWxkcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjMiPjExODIzPC9hPgorbnBlIHdoZW4gdHJ5aW5nIHRvIHNldCBzb3VyY2UgdG8gcnQuamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MDkiPjE3NjA5PC9hPgorZGVsZXRpbmcgYSByZXNvdXJjZSByZXN1bHRzIGRvZXMgbm90IGNoYW5nZSBsb2NhbCBoaXN0b3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMjAiPjE2MTIwPC9hPgorU2VsZWN0aW9uUGFyc2VyIGJ1aWxkIHdyb25nIEFTVCBmb3IgaW5zdGFuY2VvZiBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ2OCI+MTQ0Njg8L2E+CitGMyBkb2Vzbid0IHdvcmsgb24gRGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNzMiPjE0MzczPC9hPgorTnVtYmVyIG9mIHNwYWNlcyByZXByZXNlbnRpbmcgYSB0YWIgaXMgYWx3YXkgNCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTY5Ij42MTY5PC9hPgorQ3JlYXRpbmcgdGhlIHRhc2tzIHZpZXcgaGFuZ3MgdGhlIFVJIHRocmVhZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDcwIj4xODA3MDwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZyBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzMiPjkxNzM8L2E+CitFeGNlcHRpb24gYWJvdXQgbWlzc2luZyBvcmcuZWNsaXBzZS5jb3JlLmJvb3RcLmNsYXNzcGF0aCBmaWxlPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjAyIj4xNTYwMjwvYT4KK091dE9mTWVtb3J5RXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMSI+MTUzMTE8L2E+CitJbXBvcnRpbmcgZXh0ZXJuYWwgcGx1Zy1pbnMgZnJvbSBmaWxlIHN5c3RlbSBmYWlscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODUyIj4xMzg1MjwvYT4KK0Nhbm5vdCBnZW5lcmF0ZSBFSkIgaW5oZXJpdGFuY2UgZGVwbG95ZWQgY29kZSB3aXRob3V0IGRlYnVnIGluZm8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA0NiI+MTcwNDY8L2E+CitJbm5lciBjbGFzcyByZWZlcmVuY2UgdG8gT3V0ZXIgY2xhc3MgbWV0aG9kIG5vdCByZWNvZ25pemVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NTMiPjE3OTUzPC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBjb21waWxpbmcgY29jb29uMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTMwIj4xNzkzMDwvYT4KK01vdmluZyBzZWNvbmRhcnkgdHlwZXMgaXMgZm9vbGluZyB0aGUgamF2YSBpbmNyZW1lbnRhbCBidWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NzMiPjE3ODczPC9hPgorU3luY2hyb25pemUgQ29tcGFyaXNvbiBkb2VzIHBvb3Igam9iIG9uIC5jbGFzc3BhdGggZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjczNiI+MTY3MzY8L2E+CitDb21tZW50IGJlZm9yZSBwYWNrYWdlIHN0YXRlbWVudCBub3QgYXNzb2NpYXRlZCB3aXRoIGl0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUxIj4xMjU1MTwvYT4KK1NlYXJjaCBmaW5kcyBzb21lIGJ1dCBub3QgYWxsIG1ldGhvZCByZWZzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI1NCI+MTcyNTQ8L2E+CitDb3VsZCBub3QgZmluZCAuY2xhc3NwYXRoLgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MjcgLSAyN3RoIE1heSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTAKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBBUEkgdG8gcmV0cmlldmUgY2FjaGVkIGZsYWdzIG9uIHR5cGUgaGllcmFyY2hpZXMgKHNlZSA8Y29kZT5JVHlwZUhpZXJhcmNoeSNnZXRDYWNoZWRGbGFncyhJVHlwZSk8L2NvZGU+KS4gTm90ZSB0aGF0IHRoZXNlCitmbGFncyBjYW4gaGVscCBhbnN3ZXJpbmcgYm90aCBpc0NsYXNzL2lzSW50ZXJmYWNlIHF1ZXJpZXMgYXMgd2VsbCAoc2VlIDxjb2RlPkZsYWdzLmlzSW50ZXJmYWNlKGludCk8L2NvZGU+PC9saT4KKzxsaT5BZGRlZCBBUEkgdG8gdHJpZ2dlciBhIEphdmEgbW9kZWwgcmVmcmVzaCB3aXRoIHJlc3BlY3QgdG8gZXh0ZXJuYWwgSkFSczogPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxKQVJzPC9jb2RlPi4gPC9saT4KKzxwcmU+CisvKioKKyAqIFRyaWdnZXJzIGFuIHVwZGF0ZSBvZiB0aGUgSmF2YU1vZGVsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlZCBleHRlcm5hbCBKQVJzLgorICogVGhpcyBvcGVyYXRpb24gd2lsbCBpc3N1ZSBhIEphdmFNb2RlbCBkZWx0YSBkZXNjcmliaW5nIHRoZSBkaXNjb3ZlcmVkIGNoYW5nZXMsIGluIHRlcm0KKyAqIG9mIEphdmEgZWxlbWVudCBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGFkZGVkLCByZW1vdmVkIG9yIGNoYW5nZWQuCisgKiAKKyAqIEBwYXJhbSBtb25pdG9yIC0gYSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpbiBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2l0dWF0aW9uOgorICogICAgLSBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBwcm9qZWN0IHJlc291cmNlcyAKKyAqIAorICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorICogQHNpbmNlIDIuMAorICovCit2b2lkIHJlZnJlc2hFeHRlcm5hbEpBUnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworPC9wcmU+Cis8bGk+QWRkZWQgZmxhZyBmb3Igbm90aWZ5aW5nIGEgSkFSIGNvbnRlbnQgY2hhbmdlIGR1cmluZyBKYXZhIGRlbHRhIG5vdGlmaWNhdGlvbjogPGNvZGU+SUphdmFFbGVtZW50RGVsdGEjRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRDwvY29kZT48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA5NyI+MTcwOTc8L2E+CitTZWFyY2hpbmcgZm9yICIqIiBpbiBqYXZhIGdpdmVzIGEgY3J5cHRpYyBlcnJvciBtZXNzYWdlIGRpYWxvZy4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTYyIj4xNTE2MjwvYT4KK0Fzc2VydGlvbiBmYWlsdXJlIGR1cmluZyBzaHV0ZG93biAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxNDUiPjE3MTQ1PC9hPgorTlBFICB3aGlsZSBjb21waWxpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzgwNyI+MTc4MDc8L2E+CitJbmNyZW1lbnRhbCBidWlsZCBwcm9ibGVtcyBkZWxldGluZyBzZWNvbmRhcnkgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU2NCI+MTc1NjQ8L2E+CitSZWdpc3RlciBqYXZhIGZpbGUgdHlwZXMgd2l0aCB0aGUgdGVhbSBwbHVnaW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyMiI+MTc0MjI8L2E+CitKRFQgQ29tcGlsZXIgQWRhcHRlciBhbmQgY29tcGF0aWJpbGl0eSB3aXRoIEFudCAxLjUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDEiPjE3MTAxPC9hPgorQXNzZXJ0aW9uIGZhaWx1cmUgZHVyaW5nIHNodXRkb3duICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU2MiI+MTc1NjI8L2E+CitSYWNlIGNvbmRpdGlvbiBvbiBzdGFydHVwIGxlYWRzIHRvIDIgSmF2YU1vZGVsIGluc3RhbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mzk1Ij4xNTM5NTwvYT4KK0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIG5ldyBKYXZhIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Nzk3Ij4xNzc5NzwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MjciPjE3ODI3PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gYXQgIENvbXBpbGF0aW9uUmVzdWx0LmNvbXB1dGVQcmlvcml0eQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzYxIj4xNjc2MTwvYT4KK05QRSB3aGVuIGRvaW5nIFByb2plY3QgLT4gUmVidWlsZCBBbGwKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI5Ij4zMzI5PC9hPgorU3BlY2lmaWNhdGlvbiBmb3IgSUphdmFFbGVtZW50RGVsdGEgbmVlZGVkICgxR0hWVzVNKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTMiPjE2NzUzPC9hPgorRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNTkiPjEyMTU5PC9hPgorQ29kZSBGb3JtYXQgaXMgZ2VuZXJhdGluZyBib2d1cyBvdXRwdXQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTEiPjE2NzUxPC9hPgorUmVuYW1pbmcgYSBjbGFzcyBkb2Vzbid0IHVwZGF0ZSBhbGwgcmVmZXJlbmNlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3ODkiPjE2Nzg5PC9hPgorSW5jb21wbGV0ZSBwcm9qZWN0IGVsZW1lbnQgaWYgLmNsYXNzcGF0aCBmaWxlIGlzbid0IHJlYWRhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNzkiPjE2Mjc5PC9hPgorY29tcGlsZXIgY3JlYXRlcyBjb2RlIHRoYXQgY2F1c2VzIHZlcmlmaWVyIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTMiPjE0MTEzPC9hPgorU2hvdWxkIGxpc3RlbiB0byBGX1NPVVJDRUFUVEFDSEVEIGFuZCBGX1NPVVJDRURFVEFDSEVEIGphdmEgZGVsdGFzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI1MCI+MTUyNTA8L2E+CitOZWVkIGEgYmV0dGVyIG1hcHBpbmcgZm9yIHRoZSBtZXRob2QgZnJlZSByZXR1cm4gb3Bjb2RlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDkxIj4xNjA5MTwvYT4KK05lZWQgd2F5IHRvIHJlZnJlc2ggSkFSIGZpbGVzCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzU0Ij4xNjM1NDwvYT4KK0NvZGUgQXNzaXN0IGhhcyB0b28gbWFueSBpdGVtcyBhZnRlciB0aHJvd3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg2MyI+MTY4NjM8L2E+Cit0eXBlIGhpZXJhcmNoeSBtaXNzZXMgdHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODkyIj4xNDg5MjwvYT4KK0ZhaWxlZCBwYWNrYWdlIGltcG9ydCBsZWFkcyB0byBPdXRPZk1lbW9yeSBlcnJvcnMgYXQgY29tcGlsZSB0aW1lICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE5NyI+MTcxOTc8L2E+CitGMSAtICJBZGQgSmFycyIgdG8gYnVpbGQgcGF0aCBsb2NrcyB1cCBlY2xpcHNlIC0gd2luMmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTIxMSI+MTUyMTE8L2E+CitOUEUgd2hpbGUgc2VhcmNoaW5nIGZvciBhIGZpZWxkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ5NCI+MTY0OTQ8L2E+CituZXdTdXBlclR5cGVIaWVyYXJjaHkgb24gYmluYXJ5IHR5cGUgcmV0dXJucyBlbXB0eSBoaWVyYXJjaHkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTI3Ij4xNzEyNzwvYT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBTaW1wbGVOYW1lLnNldElkZW50aWZpZXIoU2ltcGxlTmFtZS5qYXZhOjEzNikgaW4gTTUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NTciPjE2ODU3PC9hPgorRW1wdHkgZm9sZGVyIGNyZWF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMDkiPjE2MjA5PC9hPgorU3VwcG9ydCBkZWNsYXJlZCBwYWNrYWdlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBkaXJlY3RvcnkgbG9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDY4Ij42MDY4PC9hPgorV2Fsa2JhY2sgZHVyaW5nIHBsdWdpbiBpbXBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk4NSI+MTI5ODU8L2E+CitVbmV4cGVjdGVkIGZ1bGwgYnVpbGQgaW4gaW5jcmVtZW50YWwgbW9kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDIyIj4xMTAyMjwvYT4KK1VuZXhwZWN0ZWQgZnVsbCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDM2Ij4xNjQzNjwvYT4KK0NvcmVFeGNlcHRpb24gaW1wb3J0aW5nIG9yZy5lY2xpcHNlLnVpLndpbjMyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1MjAiPjEyNTIwPC9hPgorSkRUQ29tcGlsZXJBZGFwdGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgLWV4dGRpcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA0NyI+MTAwNDc8L2E+CitKRFRDb21waWxlckFkYXB0ZXIgIGlnbm9yZXMgLW5vd2FybiBhbmQgZGVwcmVjYXRpb24gb2ZmLgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MjEgLSAyMXN0IE1heSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDkgLSBNSUxFU1RPTkUgNiAvIEZSRUVaRSAxCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Jy5jbGFzc3BhdGgnIGZpbGUgaXMgbm93IHdyaXR0ZW4gdXNpbmcgcGxhdGZvcm0gbGluZSBkZWxpbWl0ZXJzICh1c2VkIHRvIGJlIG9ubHkgdXNpbmcgTEZzKS4gSXQgaXMgcmVjb21tYW5kZWQgdG8gY29udmVydCBpdCB0byAndGV4dCcgZm9ybWF0CitzbyBhcyB0byBhdm9pZCBzdXJmYWNpbmcgZGVsaW1pdGVyIGRpZmZlcmVuY2VzIGluIGJldHdlZW4gaW5jb21wYXRpYmxlIHBsYXRmb3Jtcy4gPC9saT4KKzxsaT5UaGUgc2V0dGluZyBhbGxvd2luZyBmb3IgZmlsdGVyaW5nIHJlc291cmNlIGNvcHkgbm93IGFsc28gc3VwcG9ydHMgZm9sZGVyIGZpbHRlcmluZy4gRm9sZGVyIG5hbWVzIGFyZQorcmVjb2duaXplZCBieSB0aGVpciAnLycgc3VmZml4LCBlLmcuICJNRVRBLUlORi8iIHNwZWNpZmllcyBmaWx0ZXJpbmcgb3V0IGFsbCBmb2xkZXIgbmFtZWQgJ01FVEEtSU5GJyAoYW5kIHRoZWlyIGNvbnRlbnRzKTwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDQiPjMyNDQ8L2E+CitDbGFzc3BhdGggaXMgbm90IHNhdmVkIHVzaW5nIFVURjggKDFHQ1Y0NjcpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NzgiPjEzODc4PC9hPgorUmVxdWVzdCB0byBzdXBwb3J0IGZvbGRlcnMgZm9yIHJlc291cmNlIGNvcHkgZmlsdGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTM1Ij4xNjEzNTwvYT4KK1VuZXhwZWN0ZWQgZXJyb3JzIHdoaWxlIHJlY29uY2lsaW5nCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE4IC0gMTh0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ4Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+PGxpPkFkZGVkIDxjb2RlPlRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoSUNsYXNzRmlsZSBjbGFzc2ZpbGUsIGludCBkZWNvZGluZ0ZsYWcpPC9jb2RlPiBhcyBhbiBoZWxwZXIgbWV0aG9kIHRvCisJY3JlYXRlIGEgY2xhc3NmaWxlIHJlYWRlciBmb3IgY2xhc3NmaWxlIGVsZW1lbnRzLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTMwIj4xNjEzMDwvYT4KK2J1aWxkIHhlcmNlcy9wbHVnaW4ucHJvcGVydGllcyBzbG93Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzUiPjE2MTc1PC9hPgorTlBFIGluIEluZGV4TWFuYWdlciNjaGVja0luZGV4Q29uc2lzdGVuY3kgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTYzIj4xNTU2MzwvYT4KK0NvbXBsZXRpb25FbmdpbmUgZG9lcyBub3QgcmVwb3J0IHR5cGUgcGFja2FnZXMgb2YgbG9jYWwgdmFyaWFibGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNzQiPjEyMzc0PC9hPgorTlBFIGluIFJlc3VsdENvbGxlY3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTc3Ij4xNTk3NzwvYT4KK05QRSBpbiBDb2RlIEFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDM3Ij4xNDAzNzwvYT4KK0ludGVybmFsIEVycm9yIGRvaW5nIGphdmEgc2VhcmNoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTI2Ij4xNjEyNjwvYT4KK0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcgY29tcGlsYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzIiPjE2MTMyPC9hPgorRXJyb3Igb24gRXh0cmFjdCBNZXRob2QgUmVmYWN0b3JpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNTIiPjE2MDUyPC9hPgorTlBFIHdoZW4gc2VhcmNoIHJlZmVyZW5jZSBvZiBhIGNvbnN0cnVjdG9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk0NSI+MTU5NDU8L2E+CitDcmVhdGluZyBuZXcgY2xhc3MgY2F1c2VzIG1vc3QgcHJvamVjdHMgdG8gYmUgcmVjb21waWxlZAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjQ0Ij45MjQ0PC9hPgorU2VhcmNoIEdlbmVyYXRlcyBPdXRPZk1lbW9yeUVycm9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQyMyI+MTU0MjM8L2E+CitKUkVfTElCIHNvdXJjZSBhdHRhY2htZW50IHZpYSBwcm9wZXJ0aWVzIGRvZXMgbm90IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkzMSI+MTU5MzE8L2E+CitQcm9wb3NlZCByZXN1bHRzIHRvIGxpbWl0ZWQvaW52YWxpZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTMxIj4xNjEzMTwvYT4KK0phdmEgc2VhcmNoIGZhaWxzIHRvIGZpbmQgYWxsIHJlZmVyZW5jZXMgdG8gc3RhdGljIGZpbmFsIE1CX0FERElUSU9OUworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTkyIj4xNTE5MjwvYT4KK1BhY2thZ2VGcmFnbWVudDo6Y29weSBuZXZlciBvdmVyd3JpdGVzCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUxNSAtIDE1dGggTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0NworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorICAgIDxsaT4gTmV3IGNvbXBpbGVyIG9wdGlvbiBhZGRlZCB0byBjb250cm9sIG1heCBudW1iZXIgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgb24gYSB1bml0LiBEZWZhdWx0IGlzIDEwMC4gU2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zKCk8L2NvZGU+IDwvbGk+CisgICAgPHByZT4KKwkgKiBDT01QSUxFUiAvIE1heGltdW0gbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIHBlciBjb21waWxhdGlvbiB1bml0CisJICogICAgU3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgb24gZWFjaCBjb21waWxhdGlvbiB1bml0LgorCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgkiPG4+IiB3aGVyZSA8bj4gaXMgemVybyBvciBhIHBvc2l0aXZlIGludGVnZXIgKGlmIHplcm8gdGhlbiBhbGwgcHJvYmxlbXMgYXJlIHJlcG9ydGVkKS4KKwkgKiAgICAgLSBkZWZhdWx0OgkJCSIxMDAiCisgICAgPC9wcmU+CisgICAgPGxpPkJ5IGRlZmF1bHQsIHRoZSBKYXZhIGJ1aWxkZXIgaXMgbm93IGFib3J0aW5nIGJ1aWxkIHByb2Nlc3Mgb24gcHJvamVjdHMgd2l0aCBjbGFzc3BhdGggcHJvYmxlbXMuIFRoaXMgb3B0aW9uIGNhbiBiZSBkaXNhYmxlZCB0aHJvdWdoIHRoZSBKYXZhIHByZWZlcmVuY2VzOgorICAgIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0J1aWxkZXImZ3Q7PC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNTEiPjE2MDUxPC9hPgorRE9NL0FTVDogd3JvbmcgcG9zaXRpb24gaW4gaWYgc3RhdGVtZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Nzg4Ij4xNTc4ODwvYT4KK1dhbGtiYWNrcyBhdCBzdGFydHVwICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAyMSI+MTYwMjE8L2E+CitJbmZpbml0ZSBsb29wIGluIEphdmFDb3JlLmlzUmVmZXJlbmNlZEJ5KC4uLikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ2NyI+MTQ0Njc8L2E+CitPdXRsaW5lciBkb2Vzbid0IGhpZ2hsaWdodCBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjAxNyI+MTYwMTc8L2E+CitKYXZhQnVpbGRlciByZXBvcnRzICBidWlsZCBmYWlsdXJlcyBvbiBkZXBlbmRlbmNpZXMgb250byBpbnRlcm5hbCBKQVJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NjgiPjE1NTY4PC9hPgorV2F0Y2hwb2ludHMsIG1ldGhvZCBicmVha3BvaW50cyBpbiBpbnRlcmVzdGluZyBsb2NhdGlvbnMgbm90IHNob3dpbmcgaW4gZWRpdG9yIHJ1bGVyCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODAxIj4xNjgwMTwvYT4KK0NvbXBpbGVyIHByb2JsZW0gd2hlbiAqLyBhcHBlYXJzIGluIGNvbW1lbnRlZCBTdHJpbmcuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NTUiPjEyOTU1PC9hPgorUHJvYmxlbSB3aXRoIFR5cGUgRGlhbG9nIGFuZCBIaWVyYXJjaHlTY29wZXMgLSBidWlsZCAyMDAyMDIxNCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMTYiPjE2MDE2PC9hPgorT3BlbmluZyBhIHByb2plY3QgYWZ0ZXIgc3RhcnRpbmcgRWNsaXBzZSBtaXNzZXMgcHJvamVjdCBpbmRleGVzIChvciBvdGhlciBpbnRlcm5hbCBzdHVmZikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE5MCI+MTUxOTA8L2E+CitKYXZhIEJ1aWxkIGVycm9ycyBhZnRlciBzYXZlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMDgiPjE2MDA4PC9hPgorSGFuZyBkdXJpbmcgc2h1dGRvd24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM5MiI+MTIzOTI8L2E+CitQcm9ibGVtcyB0byBhZGQgUHJvamVjdCBmcm9tIHJlcG9zaXRvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTEwMyI+MTUxMDM8L2E+CitTZWFyY2ggcmVzdWx0cyBhcmUgbWlzc2luZyBxdWFsaWZpY2F0aW9uCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUxNCAtIDE0dGggTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0NgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorICAgIDxsaT5KYXZhIGNvbXBpbGVyIG5ldmVyIHJlY29yZCBtb3JlIHRoYW4gMTAwIG1hcmtlcnMgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW1zLiBBbGwgQVBJcyB1c2luZyBJUHJvYmxlbVJlcXVlc3RvciBzdGlsbAorICAgIAlzZWUgdGhlbSBhbGwuIFRoaXMgY2hhbmdlIGlzIGludGVuZGVkIHRvIHByZXZlbnQgdGhlIHRhc2sgbGlzdCBmcm9tIGJlaW5nIG92ZXJoZWxtZWQgd2l0aCB0b25zIG9mIHNlY29uZGFyeSBwcm9ibGVtcy4gPC9saT4KKwk8bGk+QWRkZWQgQVBJcyB0aGF0IGFsbG93IHRvIGNyZWF0ZSBhIHR5cGUgaGllcmFyY2h5IHdpdGggYSBzZXQgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlbmRlbmNlCisJICAgICAgb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0OgorCSAgICAgIDx1bD4KKwkgICAgICAJPGxpPjxjb2RlPklUeXBlLm5ld1N1cGVyVHlwZUhpZXJhcmNoeShJV29ya2luZ0NvcHlbXSwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKwkgICAgICAJPGxpPjxjb2RlPklUeXBlLm5ld1R5cGVIaWVyYXJjaHkoSVdvcmtpbmdDb3B5W10sIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPjwvbGk+CisJICAgICAgPC91bD4KKwkgICAgICBOb3RlIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgcmVmcmVzaGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZXNlIGhpZXJhcmNoaWVzLgorCTwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDUxIj4xNDA1MTwvYT4KK1RoZSBpbXBsZW1lbnRhdGlvbiBmb3IgSVR5cGUucmVzb2x2ZVR5cGUoU3RyaW5nKSBpcyBub3QgaW1wbGVtZW50ZWQgYXMgbm90ZWQgaW4gdGhlIEphdmFEb2Mgc3BlY3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMyMiI+MTUzMjI8L2E+CituZWVkIGEgd2F5IHRvIGNyZWF0ZSBhIHR5cGUgaGllcmFyY2h5IHRoYXQgY29uc2lkZXJzIHdvcmtpbmcgY29waWVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE0MiI+MTUxNDI8L2E+CitDQ0UgaW4gU291cmNlQ29uc3RydWN0b3JEZWNsYXJhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTM0OSI+MTUzNDk8L2E+CitKYXZhTW9kZWxFeGNlcHRpb24gb3V0IG9mIENvbnRlbnQgYXNzaXN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY3NyI+MTU2Nzc8L2E+CitFeGNlcHRpb24gY2FsbGluZyBzb3VyY2VUeXBlLmdldEZpZWxkcyBvbiB3b3JraW5nIGNvcHkgb2YgbmV3IGNsYXNzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY1NyI+MTU2NTc8L2E+CitJRE9NTWV0aG9kLmdldFJldHVyblR5cGUgcmV0dXJucyBudWxsIGZvciBhbGwgbWV0aG9kcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTgwNCI+MTU4MDQ8L2E+CitET00vQVNUOiB3cm9uZyBMZW5ndGggaW4gY2FzY2FkaW5nIGlmL3RoZW4vZWxzZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQwMCI+MTU0MDA8L2E+CitDb21waWxlciBnZW5lcmF0ZXMgd2F5IHRvbyBtYW55IGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODU3Ij4xNTg1NzwvYT4KK0RlYWRsb2NrIGluIHRoZSBpbmRleGVyLnNodXRkb3duKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc1NiI+MTU3NTY8L2E+CitPcmdhbml6aW5nIGltcG9ydHMgZG9lc24ndCBwaWNrIHVwIHRoZSByaWdodCB0eXBlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDMwIj4xNTQzMDwvYT4KK2hhbmcgdXAgZWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTY1Ij4xNDk2NTwvYT4KK1NlYXJjaCByZXN1bHRzIGluIC5jbGFzcyBmaWxlcyBkb24ndCBzZWxlY3QgcmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTAiPjE1NjkwPC9hPgorQ2xhc3NwYXRoIGJlaW5nIHNldCBpbiB3cm9uZyBub3RpZmljYXRpb24gbGlmZWN5Y2xlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4MTAiPjE1ODEwPC9hPgorQ2xhc3NwYXRoQ29udGFpbmVyIHF1ZXN0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MTciPjE1NzE3PC9hPgorSSBjYW50IGhvbGQgSkRLIENvbXBpbGVyIENvbXBsaWFuY2UgbGV2ZWwgc2V0dGluZy4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0OCI+MTU0NDg8L2E+CitpIGtlZXAgbG9vc2luZyBwcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTEzIj4xNTExMzwvYT4KK2V4dHJhY3QgbWV0aG9kOiBhc3NlcnRpb24gZmFpbHVyZSAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODEzNyI+ODEzNzwvYT4KK0NvZGUgYXNzaXN0IGZvciBhbm9ueW1vdXMgaW5uZXIgdHlwZSB0b28gbGF0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzYxIj4xNTc2MTwvYT4KK0xvZyBtZXNzYWdlIGFmdGVyIGltcG9ydGluZyBwbHVnaW5zIGZhaWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTIiPjE1ODUyPC9hPgorbmVlZCBzZXQgYXBpIG9uIElDbGFzc3BhdGhFbnRyeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTc5Ij4xNTU3OTwvYT4KK0luY29tcGxldGUgSmF2YSBFcnJvciBNZXNzYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NTYiPjEzNzU2PC9hPgorQ29kZSBDb21wbGV0aW9uICsgVHlwZSBJbnRyb3NwZWN0aW9uICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk4Ij4zMTk4PC9hPgorQ2FsbGVyIG9mIFNpZ25hdHVyZS50b1N0cmluZyhTdHJpbmcpIHNob3VsZCBiZSBhd2FyZSB0aGF0IGl0IHdvbid0IHdvcmsgZm9yICckJyBzZXBhcmF0ZWQgdG9wLWxldmVsIHR5cGVzICgxRzRRQjJTKSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMzMiI+MTUzMzI8L2E+CitQcm9ibGVtIHdpdGggIlxcIiBpbiBlZGl0b3IvY29tcGlsZXIgCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUwNyAtIDd0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkFkZGVkIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXNzYWdlI01lc3NhZ2UoU3RyaW5nLCBpbnQsIGludCkuIFRoaXMgbmV3IGNvbnN0cnVjdG9yIGFsbG93cyB0byBzZXQgdGhlIGxlbmd0aCBmaWVsZC4gVGhlIGNvbnN0cnVjdG9yCisJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lc3NhZ2UjTWVzc2FnZShTdHJpbmcsIGludCkgc3RpbGwgZXhpc3RzIGFuZCBzZXQgdGhlIGxlbmd0aCB0byAwLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgbmV3IGNvbnN0cnVjdG9yIGlmIHRoZSBsZW5ndGgKKwlpcyBuZXZlciB1c2VkLjwvbGk+CisJPGxpPlJlbmFtZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lc3NhZ2UjZ2V0U291cmNlUG9zaXRpb24oKSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNnZXRTdGFydFBvc2l0aW9uKCkuIFRoaXMKKwlpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgRE9NL0FTVCBBUEkuIFRoZSBvbGQgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGNsb3NlIGZ1dHVyZS48L2xpPgorCTxsaT5BZGRlZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNnZXRMZW5ndGgoKSBhbGxvd2luZyB0byByZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBub2RlIG9uIHdoaWNoCisJdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcmVwb3J0ZWQuPC9saT4KKwk8bGk+IEFkZGVkIDxjb2RlPkphdmFDb3JlI2dldFNoYXJlZFdvcmtpbmdDb3BpZXMoSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPiBhbGxvd2luZyB0byByZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCB3b3JraW5nCisJCWNvcGllcyBmb3IgYSBnaXZlbiBidWZmZXIgZmFjdG9yeS4gPC9saT4KKwk8bGk+IEphdmFCdWlsZGVyIG5vIGxvbmdlciBidWlsZCBwcm9qZWN0cyBmb3Igd2hpY2ggcHJlcmVxdWlzaXRlIHByb2plY3RzIGFib3J0ZWQgdGhlIGJ1aWxkIHByb2Nlc3MuIFRoaXMgY29uc2lkZXJhYmx5CisJCXJlZHVjZXMgdGhlIG51bWJlciBvZiBzZWNvbmRhcnkgZXJyb3JzIHdoZW4gZGVhbGluZyB3aXRoIHdvcmtzcGFjZSBzZXR1cCBwcm9ibGVtcy48L2xpPgorCTxsaT4gQWRkZWQgPGNvZGU+SVdvcmtpbmdDb3B5I3JlY29uY2lsZShib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTwvY29kZT4gYWxsb3dpbmcgdG8gZm9yY2UKKwkJcHJvYmxlbSByZWZyZXNoIGV2ZW4gaWYgd29ya2luZyBjb3B5IHdhcyBhbHJlYWR5IGNvbnNpc3RlbnQuCisgICAgPGxpPiBBZGRlZCA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiBuZXcga2luZCBjb25zdGFudCA8Y29kZT5LX0RFRkFVTFRfU1lTVEVNPC9jb2RlPiB0byBkZW5vdGUgc3lzdGVtIGxpYnJhcmllcyBpbXBsaWNpdGVseSBjb250cmlidXRlZAorICAgIAlieSBhIHJ1bnRpbWUuIDwvbGk+CisgICAgPGxpPiBDbGFzc3BhdGggY29udGFpbmVyIHBhdGggY2FuIGhhdmUgbW9yZSB0aGFuIDIgc2VnbWVudHMuIEZpcnN0IG9uZSBpcyBzdGlsbCB0aGUgY29udGFpbmVyIElELCB0aGUgcmVtYWluaW5nIG9uZXMgYXJlIGZvcm1pbmcgdGhlIGhpbnRzCisgICAgCXBhc3NlZCB0byB0aGUgcmVzb2x1dGlvbiBwaGFzZSAoPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IDwvbGk+CisgICAgPGxpPiBDbGFzc3BhdGggY29udGFpbmVycyBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gdmFyaWFibGUgZW50cmllcyA8L2xpPgorCTxsaT5KYXZhQ29yZSBub3cgcGVyc2lzdHMgaXRzIG9wdGlvbnMgKDxjb2RlPkphdmFDb3JlI2dldE9wdGlvbnM8L2NvZGU+KSB1c2luZyBpdHMgcGx1Z2luIHByb3BlcnR5IHN0b3JlLiBDbGllbnRzIG5vIGxvbmdlciBuZWVkIHRvIHNhdmUgdGhlbS4gPC9saT4KKwk8bGk+SmF2YUNvcmUgbm93IHByb3ZpZGVzIGNvbnN0YW50cyBmb3IgYWxsIHN1cHBvcnRlZCBvcHRpb24gSURzIGFuZCB2YWx1ZXMuPC9saT4KKwk8bGk+SmF2YUNvcmUgb3B0aW9uIGFkZGVkLCB0byBhbGxvdyBidWlsZCB0byBhYm9ydCBpbiBwcmVzZW5jZSBvZiBpbnZhbGlkIGNsYXNzcGF0aC4gCisJPGxpPkxldmVyYWdlZCBuZXcgZW5jb2Rpbmcgc3VwcG9ydCBmcm9tIFBsYXRmb3JtL0NvcmUuIFRoZSBKYXZhQ29yZSBvcHRpb24gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIiBpcyBub3cgZXF1aXZhbGVudCB0byA8Y29kZT5SZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTwvY29kZT4uCisJPHByZT4KKwkgKiBCVUlMREVSIC8gQWJvcnQgaWYgSW52YWxpZCBDbGFzc3BhdGgKKwkgKiAgICBBbGxvdyB0byB0b2dnbGUgdGhlIGJ1aWxkZXIgdG8gYWJvcnQgaWYgdGhlIGNsYXNzcGF0aCBpcyBpbnZhbGlkCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICB7ICJhYm9ydCIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAiaWdub3JlIgorCTwvcHJlPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQxNiI+MTU0MTY8L2E+CitDbGFzc3BhdGggY29udGFpbmVyIC0gbmVlZCB0byBzZXQgdmFsdWUgZXZlbiBpZiBub3QgcmVmZXJlbmNlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDE4Ij4xNTQxODwvYT4KK0NsYXNzcGF0aCBjb250YWluZXIgLSBtYXkgZ2V0IHRoZSBpbml0LWluLXByb2dyZXNzIHZhbHVlIGJhY2sKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMzNCI+MTUzMzQ8L2E+Cithc3Q6IE1lc3NhZ2Ugc2hvdWxkIGhhdmUgbGVuZ3RoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzY0Ij4xNTM2NDwvYT4KK3NlYXJjaCBmb3IgcmVmZXJlbmNlcyBvZiBEZWJ1Z1VJUGx1Z2luLnNldEF0dHJpYnV0ZXMoLi4uKSBmYWlscyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNzUiPjE1MTc1PC9hPgorTmVlZCBBUEkgdG8gcmV0cmlldmUgYWxsIHNoYXJlZCB3b3JraW5nIGNvcGllcyBmb3IgYSBidWZmZXIgZmFjdG9yeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MjU0Ij4xNTI1NDwvYT4KK0phdmFNb2RlbE1hbmFnZXIgdGhpbmtzIEphdmFQcm9qZWN0IGlzIGNsb3NlZCB3aGVuIGl0IGlzIG9wZW4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTYiPjMzNTY8L2E+CitBUEkgLSBzaG91bGQgcHJvdmlkZSBBUEkgZm9yIHJ1bm5pbmcgYmF0Y2ggY29tcGlsZXIgKDFHSklXRFApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDQiPjE1MjQ0PC9hPgorTlBFIGluIEpEVENvbXBpbGVyQWRhcHRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI4OSI+MTUyODk8L2E+CitXaHkgaXMgYW4gaW5jb3JyZWN0IHBhY2thZ2UgZGVjbGFyYXRpb24gbm90IHJlcG9ydGVkIGR1cmluZyByZWNvbmNpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjI1Ij4xMzIyNTwvYT4KK3F1aWNrIGZpeDogc2hvd3MgdXAgb25seSBhZnRlciBJIHNhdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA4MSI+MTUwODE8L2E+CitKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGggYWxsb3dzIG5lc3Rpbmcgc291cmNlIGZvbGRlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA0NCI+MTUwNDQ8L2E+CitVbmFibGUgdG8gdmlldyBzb21lIG5vbi1qYXZhIGZpbGVzIGluIGV4dGVybmFsIGphcnMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTc3Ij4xNTE3NzwvYT4KK0NsYXNzcGF0aCBtYXJrZXJzIG5vdCBjb3JyZWN0bHkgdXBkYXRlZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNjgiPjE1MTY4PC9hPgorY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU3Ij4xMzk1NzwvYT4KK0xhdW5jaGluZ1BsdWdpbiBzcGVjaWZpY2F0aW9uIG9mIHJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTc3Ij4xMjk3NzwvYT4KK0FkZGluZyBKYXZhIG5hdHVyZSB0byBhIHByb2plY3QgZG9lcyBub3QgYnJpbmcgaXQgdG8gbGlrZSBpbiBwYWNrYWdlIHZpZXcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTA3Ij4xNTEwNzwvYT4KK0ludGVybmFsIEVycm9yIG9yZ2FuaXppbmcgaW1wb3J0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAzMCI+MTUwMzA8L2E+CitOUEUgdHJ5aW5nIHRvIG9wZW4gb3IgZWRpdCBzb3VyY2UgZmlsZXMgdGhhdCByZWZlcmVuY2UgamJ1aWxkZXIuamFyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODM4Ij4xNDgzODwvYT4KK1NjcmFwYm9vayBlZGl0b3I6IGJhZCBoYW5kbGluZyBvZiAvLyBjb21tZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTQzIj4xMjU0MzwvYT4KK0NvZGUgYXNzaXN0IHRvIGluc2VydCBtZXRob2QgZG9lcyBub3Qgd29yayB3aGVuIHRoZXJlIGFyZSBleHRyYSB0b3AtbGV2ZWwgc3RhdGVtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDYxIj4xNTA2MTwvYT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBBU1ROb2RlLnNldFNvdXJjZVJhbmdlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDM2Ij4xNTAzNjwvYT4KK0FTVFZpc2l0b3IucHJlVmlzaXQgYW5kIEFTVFZpc2l0b3IucG9zdFZpc2l0IG5vdCBjYWxsZWQgY29ycmVjdGx5IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTMiPjMxOTM8L2E+CitKTSAtIElTb3VyY2VNYW5pcHVsYXRpb24uZGVsZXRlIHNlbmQgcmVwbGFjZS1CdWZmZXJDaGFuZ2VkRXZlbnQgKDFGWUU4WEkpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA5MSI+MTUwOTE8L2E+CitUb28gbWFueSBjeWNsZSBtYXJrZXJzIGdlbmVyYXRlZCB3aGVuIGN5Y2xlIGlzIGRldGVjdGVkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc1NCI+MTQ3NTQ8L2E+CitDb2RlQXNzaXN0IC0gRHVwbGljYXRlIG1ldGhvZCBkZWNsYXJhdGlvbiBwcm9wb3NhbCBpbnNpZGUgYW5vbnltb3VzIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA1MSI+MTUwNTE8L2E+CitTeW50aGV0aWMgYWNjZXNzIG1ldGhvZHMgYXJlIG5vdCByZXBvcnRlZCB0byBiZSBzeW50aGV0aWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU5Ij4zMDU5PC9hPgorSlJFX0xJQiBub3QgYXBwZW5kZWQgdG8gYnVpbGRQYXRoICgxR0Y3VEFaKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDUwIj4xNTA1MDwvYT4KK0NsZWFudXAgSmF2YWRvYyBAZXhjZXB0aW9uIHRhZ3MgaW4gRE9NL0FTVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxIj4xNDE1MTwvYT4KK1RoZSBjb2RlIGZvcm1hdHRlciBkb2VzIG5vdCByZXNwZWN0IHRoZSAibWF4aW11bSBsaW5lIGxlbmd0aCIgcHJvcGVydHkgd2hlbiB0aGUgaW5kZW50YXRpb24gaXMgc2V0IHRvIHRhYnVsYXRpb24uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTc0Ij4xNDk3NDwvYT4KK0JhZCBnZW5lcmF0ZWQgY29kZSBmb3IgJys9JyBhbmQgJy09JyBvcGVyYXRvcnMKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MTkiPjE1NzE5PC9hPgorRXJyb3JzIGR1cmluZyBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDg3Ij4xNTA4NzwvYT4KK05QRSB3aGVuIG1ldGhvZHMgZnJvbSB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBjbGFzcyBpcyBpbnZva2VkIGluIGEgYW5vbnltb3VzIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNTciPjEzMDU3PC9hPgorTlBFIGluIEphdmFFbGVtZW50UmVxdWVzdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTUiPjExMTU1PC9hPgorQXJyYXlJbmRleE91dE9mQm91bmRzIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB3b3JrYmVuY2ggdG8gZnJlZXplCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MjEiPjEyOTIxPC9hPgorQnVpbGQgc29tZXRpbWVzIGJ1aWxkcyBmaWxlcyB0aGF0IGhhdmUgbm90IGNoYW5nZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk2MiI+MTQ5NjI8L2E+CitKRFQgU2VhcmNoIHJldHVybmluZyBpbXByb3BlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MjkiPjE0OTI5PC9hPgorRXh0ZXJuYWwgTG9jYXRpb25zIGZvciBPdXRwdXQgRmlsZXMKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDMwIC0gMzB0aCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDMKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKwk8bGk+UHJpb3JpdHkgb2YgdGhlIGJhY2tncm91bmQgaW5kZXhlciBoYXMgYmVlbiBsb3dlcmVkIHNvIHRoYXQKKwkgICAgaXQgZG9lc24ndCBpbnRlcmZlciB3aXRoIG90aGVyIHRocmVhZHMgKGUuZy4gd2hlbiBzd2l0Y2hpbmcgSlJFCisJICAgIHRoZSBpbmRleGluZyB3aWxsIG5vdCBzdGFydCBiZWZvcmUgdGhlIHN3aXRjaCBoYXMgY29tcGxldGVkKQorCTwvbGk+CisJPGxpPlJldmlzZWQgQ2xhc3NwYXRoIENvbnRhaW5lciBwcm9wb3NhbCAoYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9+Y2hlY2tvdXR+L29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvY2xhc3NwYXRoJTIwY29udGFpbmVyL2NsYXNzcGF0aENvbnRhaW5lci5odG1sIj5ub3RlczwvYT4pOgorCTx1bD4KKwk8bGk+PGNvZGU+Y2xhc3NwYXRoQ29udGFpbmVyQ2hhbmdlZCgpPC9jb2RlPiBnb3QgcmVwbGFjZWQgd2l0aCBzZXR0ZXIgbWV0aG9kIDxjb2RlPkphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3RbXSBhZmZlY3RlZFByb2plY3RzLCBJQ2xhc3NwYXRoQ29udGFpbmVyIHJlc3BlY3RpdmVDb250YWluZXJzKSA8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVyUmVzb2x2ZXI8L2NvZGU+IGdvdCByZW5hbWVkIGludG8gPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+PC9saT4KKwk8bGk+IENvbnRhaW5lciBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gYW55IDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGVudHJ5LgorCTxsaT4gYWRkZWQgY29udGFpbmVyIGludGVyZmFjZSA8Y29kZT4gSUNsYXNzcGF0aENvbnRhaW5lciA8L2NvZGU+IGluIG9yZGVyIHRvIGFsbG93IGNvbnRhaW5lcnMgdG8gYmUgcHJlc2VudGVkIGluIGEgVUkuCisJCSAgPHVsPgorCQkgIDxsaT5JQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgPC9saT4KKwkJICA8bGk+U3RyaW5nIGdldERlc2NyaXB0aW9uKCkgPC9saT4KKwkJICA8bGk+aW50IGdldEtpbmQoKSA8L2xpPgorCQkgIDxsaT5QYXRoIGdldFBhdGgoKSA8L2xpPgorCQkgPC91bD4KKwk8L3VsPgorCTwvbGk+CisJPGxpPklmIHRoZSBjb21wbGV0aW9uIGlzIGluc2lkZSBhIHN1cGVyIHR5cGUgaW4gdHlwZSBkZWNsYXJhdGlvbiBoZWFkZXIgdGhlbiB0aGUgcmVsZXZhbmNlIGdyb3cKKwkJd2hlbiB0aGUgdHlwZSBoYXZlIHRoZSBjb3JyZWN0IG5hdHVyZSA6CisJCTx1bD4KKwkJCTxsaT4gQWZ0ZXIgPGNvZGU+ZXh0ZW5kczwvY29kZT4ga2V5d29yZCBvZiBhIGNsYXNzIGhlYWRlciB0aGUgcmVsZXZhbmNlIGdyb3cgaWYgdGhlIHR5cGUgaXMgYSBjbGFzcy4KKwkJCTwvbGk+CisJCQk8bGk+IEFmdGVyIDxjb2RlPmltcGxlbWVudHM8L2NvZGU+IGtleXdvcmQgb2YgYSBjbGFzcyBoZWFkZXIgdGhlIHJlbGV2YW5jZSBncm93IGlmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZS4KKwkJCTwvbGk+CisJCQk8bGk+IEFmdGVyIDxjb2RlPmV4dGVuZHM8L2NvZGU+IGtleXdvcmQgb2YgYW4gaW50ZXJmYWNlIGhlYWRlciB0aGUgcmVsZXZhbmNlIGdyb3cgaWYgdGhlIHR5cGUgaXMgYW4gaW50ZXJmYWNlLgorCQkJPC9saT4KKwkJPC91bD4KKwk8L2xpPgorCTxsaT4gSWYgdGhlIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgdHlwZSBpbiBhIGNhdGNoIG9yIHRocm93cyBjbGF1c2UgdGhlIHJlbGV2YW5jZSBncm93IHdoZW4gdGhlIHR5cGUgaXMgYW4gZXhjZXB0aW9uCisJCShpZiB0aGUgbmFtZSBvZiB0aGUgdHlwZSBjb250YWluIDxjb2RlPmV4Y2VwdGlvbjwvY29kZT4gb3IgPGNvZGU+ZXJyb3I8L2NvZGU+KS4KKwk8L2xpPgorCTxsaT4gSWYgdGhlIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgdGhyb3cgc3RhdGVtZW50IHRoZSByZWxldmFuY2UgZ3JvdyB3aGVuIHRoZSBwcm9wb3NhbCBpcyBhbiBleGNlcHRpb24uCisJPC9saT4KKwk8bGk+VGhlIGJhY2tncm91bmQgaW5kZXhlciBub3cgcmVjb3ZlcnMgZnJvbSBpbnRlcm5hbCBjcmFzaC4gSWYgdGhpcyBoYXBwZW5zLCAKKwkgICAgYSBuZXcgdGhyZWFkIGlzIGNyZWF0ZWQgYW5kIGEgY29uc2lzdGVuY3kgY2hlY2sgaXMgZG9uZSBvbiBhbGwgaW5kZXhlcy4KKwk8L2xpPgorCTxsaT5BbiBpbnRlcm5hbCBidWZmZXIgZmFjdG9yeSBpcyBub3cgdXNlZCB0byBjcmVhdGUgYnVmZmVycyB3aGVuCisJICAgIGNsaWVudHMgZG9uJ3QgcHJvdmlkZSBvbmUuCisJPC9saT4KKwk8bGk+U3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgZm9ybWF0dGVyIGZvciAvLyROT04tTkxTLSBjb21tZW50cyBpbiB0aGUgc291cmNlLiBXaGVuIGEgbGluZSBjb250YWlucyBzdWNoIGNvbW1lbnRzCisJaXQgaXMgbm90IGZvcm1hdHRlZCBhbnltb3JlLiBUaGUgdXNlciB3aWxsIG5lZWQgdG8gbWFudWFsbHkgZm9ybWF0IGl0LiBTZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzODciPjE0Mzg3PC9hPiBhbmQKKwk8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTQwIj4xMjU0MDwvYT4uCisJPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MzMiPjE0OTMzPC9hPgorQVNUOiBObyBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBmb3IgdW5yZWFjaGFibGUgY29kZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkyMSI+MTQ5MjE8L2E+CitObyBlcnJvciBtZXNzYWdlIGZyb20gaW5uZXIgdHlwZSBpbnN0YW50aWF0aW9uIGluIHN0YXRpYyBjb250ZXh0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MTkiPjEzOTE5PC9hPgorRGVjbGFyYXRpb24gZm9yIHBhY2thZ2Ugbm90IGZvdW5kIGlmIHNjb3BlIGlzIG5vdCBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg1MiI+MTQ4NTI8L2E+CitPcmdhbml6ZSBJbXBvcnQ6IG1pc3NpbmcgaW1wb3J0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTMxIj4xMzUzMTwvYT4KK0phdmEgaW5kZXhpbmcgdGhyZWFkIGZpbmRzICJCb25qb3VyLCBsZSBtb25kZSEiIHRvbyBpbnRlcmVzdGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODc4Ij4xNDg3ODwvYT4KK3N0YXRpYyBmaW5hbCBjaGFyIE5lZ1RocmVlPSAoY2hhciktMywgLTMgPT0gTmVnVGhyZWUgcmV0dXJucyB0cnVlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMzEiPjE0MzMxPC9hPgorSUNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQgZG9zIG5vdCBmaW5kIGltcG9ydCBkZWNsICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAzOCI+MTQwMzg8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gZHVyaW5nIEphdmFSZWNvbmNpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDExIj4xNDAxMTwvYT4KK0FTVE5vZGUuY2hlY2tOZXdDaGlsZChBU1ROb2RlLCBBU1ROb2RlLCBib29sZWFuLCBDbGFzcykgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1NzciPjEzNTc3PC9hPgorUHJvYmxlbSBoaWdobGlnaHRlciBpcyB1bmFibGUgdG8gaW1wb3J0IGZyb20gSmF2YTNEIGxpYnJhcnkuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzEiPjE0ODMxPC9hPgorTlBFIHdpdGggaGllcmFyY2h5IHNlYXJjaCBvZiBhIGxvY2FsIHZhcmlhYmxlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDI0MyI+MTQyNDM8L2E+CitBcHBsZXQgVmlld2VyIEludGVncmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNDAiPjE0MTQwPC9hPgorQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9wZW4gSmF2YSBlZGl0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzNCI+MTQ4MzQ8L2E+CitzbWFsbHRhbGstaXNoIGVycm9yIG1lc3NhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MSI+MTE2NTE8L2E+CitBdXRvLWNvbXBsZXRlIHNob3dzIGFsbCBPYmplY3Qgc3ViY2xhc3NlcyBhZnRlciAidGhyb3dzIiBrZXl3b3JkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk3MCI+NDk3MDwvYT4KK0F1dG9tYXRpYyBDb2RlIEFzc2lzdCBuZWVkcyB0byBiZSBzbWFydGVyICM2Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY1MSI+ODY1MTwvYT4KK0NvZGUgYXNzaXN0IHNob3VsZCBvZmZlciBleGNlcHRpb24gaW5zdGVhZCBvZiBhbnkgY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc2NyI+MTQ3Njc8L2E+CitidWcgaW4gSUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjQyIj4xNDY0MjwvYT4KK1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHZpZXcgc29tZSBjbGFzc2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTU4Ij4xNDU1ODwvYT4KK0FkZGluZyBiaW5hcnkgcHJvamVjdCBkb2Vzbid0IGZpeCBjbGFzc3BhdGggcHJvYmxlbXMuICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU4OCI+MTQ1ODg8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBVdGlsLmVxdWFsQXJyYXlzT3JOdWxsICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQ5MiI+MTM0OTI8L2E+CitTaG91bGQgaGFuZGxlIEphdmFNb2RlbEV4Y2VwdGlvbnMgdGhhdCBjb250YWlucyBDb3JlRXhjZXB0aW9uIG1vcmUgZ3JhY2VmdWxseSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NDAiPjEyNTQwPC9hPgorQ29kZSBmb3JtYXR0ZXIgc2hvdWxkIGxlYXZlIGNvbW1lbnRzIGF0IGVuZCBvZiBsaW5lIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzg3Ij4xNDM4NzwvYT4KK0Zvcm1hdHRlciBpc24ndCAvLyROT04tTkxTLTEkIGF3YXJlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMTMiPjE0MzEzPC9hPgorRENSOiBBU1QgaW4gbWV0aG9kcyB3aXRoIG1pc3NpbmcgcmV0dXJuIHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwOTQiPjE0MDk0PC9hPgorSW5kZXhlcjogRGVhZGxvY2sgb24gZGVsZXRlIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTk0Ij4xNDU5NDwvYT4KKyJPcGVuIHR5cGUiIGRvZXNuJ3QgZmluZCB0eXBlcyBpbiBwcm9qZWN0IHdpdGggSmF2YSBuYXR1cmUgYWRkZWQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjAyIj4xNDYwMjwvYT4KK2FzdDogbGVuZ3RoIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTkyIj4xNDU5MjwvYT4KK0lUeXBlI2dldFR5cGVzIGFuZCBJVHlwZSNnZXREZWNsYXJpbmdUeXBlIGFyZSBub3QgY29oZXJlbnQgd2l0aCBIYXN0YWJsZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg2OCI+MTM4Njg8L2E+CitKYXZhIE1vZGVsIG5vdCB1cGRhdGVkIHByb3Blcmx5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzNCI+MTMyMzQ8L2E+CitDYW4ndCBvcGVuIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mjk2Ij45Mjk2PC9hPgorSGFuZyBvbiBvcGVuIHR5cGUgZHVyaW5nIGluZGV4aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MTYiPjEzOTE2PC9hPgorYXBpOiBJU2Nhbm5lciAtIFNjYW5uZXIubGluZVB0cgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTI2Ij4xNDUyNjwvYT4KK05QRSB3aGVuIHJlc29sdmluZyBhIFNpbXBsZU5hbWUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjkiPjExNTI5PC9hPgorYXN0OiBtaXNzaW5nICg/KSBiaW5kaW5nIG9uIHNpbXBsZU5hbWUgaW4gVmFyaWFibGVEZWNsYXJhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ1MyI+MTQ0NTM8L2E+CitSZW1vdmUgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLklOU1RBTkNFT0Ygb3BlcmF0b3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0OTAiPjE0NDkwPC9hPgorUG9zc2libGUgY29uY3VycmVuY3kgaG9sZSB3aGVuIHNhdmluZyBpbmRleCBiZWZvcmUgcXVlcnkgIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg0NCI+MTQ4NDQ8L2E+CitOUEUgY3JlYXRpbmcgYmluYXJ5IHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MDgiPjE0OTA4PC9hPgorMTAwJSBDUFUgdXRpbGl6YXRpb24sIGhhbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDczMyI+MTQ3MzM8L2E+CitOUEUgc2V0dGluZyBtYXJrZXIgYXR0cmlidXRlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNzQzIj4xMzc0MzwvYT4KKyhOUEUpIEVjbGlwc2UgZnJvemUgZHVyaW5nICJvcGVuIHR5cGUiCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNzQiPjE0MDc0PC9hPgorU2VhcmNoOiBOb3QgYWxsIHJlZnMgdG8gVHdvUGFuZUVsZW1lbnRTZWxlY3RvciBjb25zdHJ1Y3RvciBmb3VuZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4ODkiPjE0ODg5PC9hPgorYnVnIGluIElKYXZhUHJvamVjdC5maW5kVHlwZShTdHJpbmcsIFN0cmluZykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQzOSI+MTI0Mzk8L2E+CithdXRvIGNvbXBsZXRpb24gZG9lc24ndCBjb25zaXN0ZW50bHkgd29yaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODE4Ij4xNDgxODwvYT4KK25vIG1lc3NhZ2UgZm9yIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0cnkgYmxvY2sgd2hlbiByZXR1cm4gaW4gZmluYWxseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODEwIj4xMzgxMDwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBpbmRleGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1MjciPjEzNTI3PC9hPgorTlBFICsgR1Agc3dpdGNoaW5nIEpSRQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDk2Ij4xNDA5NjwvYT4KK0lXb3JraW5nQ29weS5maW5kRWxlbWVudHMgc2hvdWxkIG5vdCByZXR1cm4gbnVsbCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NDMiPjEzOTQzPC9hPgorRWNsaXBzZSBjcmFzaGVzIHdoZW4gZG9pbmcgYSAicmVidWlsZCBhbGwiCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NDAiPjE0NDQwPC9hPgorUG9zc2libGUgYnVnIGluIGNvbXBpbGluZyBpbm5lciBjbGFzc2VzCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUwOC1NNXBhdGNoIiAtIDh0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQyYgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorCTxsaT5KYXZhIGJ1aWxkZXIgaXMgbG9nZ2luZyBpdHMgaW50ZXJuYWwgZXJyb3JzIDwvbGk+Cis8L3VsPgorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDIzIC0gMjNyZCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDJhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkphdmEgbW9kZWwgQVBJIGFkZGl0aW9uczoKKwkJPHVsPgorCQkJPGxpPjxjb2RlPklKYXZhUHJvamVjdC5maW5kVHlwZShTdHJpbmcpPC9jb2RlPjwvbGk+CisJCQk8bGk+PGNvZGU+SUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklNZXRob2QuaXNNYWluTWV0aG9kKCk8L2NvZGU+PC9saT4KKwkJCTxsaT48Y29kZT5JTWV0aG9kLmlzU2ltaWxhcihJTWV0aG9kKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIpPC9jb2RlPjwvbGk+CisJCTwvdWw+CisJPC9saT4KKwk8bGk+QVBJIGNoYW5nZTogPGNvZGU+SVdvcmtpbmdDb3B5LmZpbmRTaGFyZWRXb3JraW5nQ29weSgpPC9jb2RlPiBpcyBub3cgdGFraW5nIGFuIGV4dHJhIGFyZ3VtZW50OiB0aGUgYnVmZmVyIGZhY3RvcnkgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBUaGlzIGVuc3VyZXMgdGhhdAorCQl3b3JraW5nIGNvcGllcyBjYW4gb25seSBiZSByZXVzZWQgZm9yIHRoZSBzYW1lIGJ1ZmZlciBmYWN0b3JpZXMuCisJPC9saT4KKwk8bGk+IEphdmFNb2RlbE9wZXJhdGlvbnMgbm93IGd1YXJhbnRlZSB0aGUgSmF2YU1vZGVsIGlzIHVwIHRvIGRhdGUgd2hlbiBub3RpZnlpbmcgdGhlIEphdmEgbW9kZWwgY2hhbmdlIGxpc3RlbmVycy4gSW4gcGFydGljdWxhciwKKwlhIGJ1aWxkZXIgcnVubmluZyBhZnRlciB0aGUgSmF2YSBidWlsZGVyIHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUgSmF2YSBtb2RlbCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNoYW5nZXMgaW50cm9kdWNlZCB0aHJvdWdoIEphdmEgbW9kZWwKKwlvcGVyYXRpb25zIChleGNlcHQgZm9yIGluZGV4IHF1ZXJpZXMpLiBUaGlzIHdhcyBuZXZlciBndWFyYW50ZWVkIGluIDEuMCwgYnV0IGluZGlyZWN0bHkgb2NjdXJyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHByZXZpb3VzIEphdmEKKwlidWlsZGVyIGltcGxlbWVudGF0aW9uIGRpZCBmb3JjZSB0byByZWZyZXNoIHRoZSBKYXZhIG1vZGVsIHdoaWxlIGJ1aWxkaW5nLiA8L2xpPgorCTxsaT5DbGFzc3BhdGggQ29udGFpbmVyIEVuaGFuY2VtZW50IChhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9jbGFzc3BhdGglMjBjb250YWluZXIvY2xhc3NwYXRoQ29udGFpbmVyLmh0bWwiPm5vdGVzPC9hPik6CisJPGJyPkFkZGVkIG5ldyB0eXBlIG9mIGNsYXNzcGF0aCBlbnRyeSAoPGNvZGU+Q1BFX0NPTlRBSU5FUjwvY29kZT4pLCAoc2VlIHByb3Bvc2FsIGhlcmUpIHNvIGFzIHRvIGJldHRlciBlbmNhcHN1bGF0ZSBjbGllbnQgZGVmaW5lZCBsaWJyYXJpZXMuCisJVHlwaWNhbGx5LCBWTSBpbnN0YWxscyB3b3VsZCB1c2UgY2xhc3NwYXRoIGNvbnRhaW5lcnMgaW5zdGVhZCBvZiBjbGFzc3BhdGggdmFyaWFibGVzICg8Y29kZT5KUkVfTElCPC9jb2RlPikgc28gYXMgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjb3JyZXNwb25kaW5nCisJc2V0IG9mIGxpYnJhcmllcyAoaW5jbHVkaW5nIGV4dGVuc2lvbiBkaXJzKSB0byBiZSBwbGFjZWQgb24gdGhlIGJ1aWxkIHBhdGguIAorCTxwPk5ldyBBUElzIGFkZGVkIHRvIHJlZmxlY3QgdGhpcyBhZGRpdGlvbjoKKwk8dWw+CisJPGxpPjxjb2RlPkphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KElQYXRoIGNvbnRhaW5lclBhdGgpPC9jb2RlPjwvbGk+CisJPGxpPjxjb2RlPkphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KElQYXRoIGNvbnRhaW5lclBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCk8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+SmF2YUNvcmUuY2xhc3NwYXRoQ29udGFpbmVyQ2hhbmdlZChJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YUVsZW1lbnQgc2NvcGUpIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5DbGFzc3BhdGhDb250YWluZXJSZXNvbHZlciA8L2NvZGU+PC9saT4KKwk8L3VsPgorCTwvbGk+CisJPGxpPkRPTS9BU1Q6PGJyPkEgbmV3IHR5cGUgb2Ygbm9kZSBoYXMgYmVlbiBhZGRlZCB0byBoYW5kbGUgcHJvcGVybHkgdGhlIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4gU28gdGhlIG5ldyBJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlIAorCXJlcGxhY2VkIHRoZSB1c2FnZSBvZiBJbmZpeEV4cHJlc3Npb24gd2l0aCB0aGUgb3BlcmF0b3IgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLklOU1RBTkNFT0YuIFRoaXMgb3BlcmF0b3IgaGFzIGJlZW4KKwlkZXByZWNhdGVkIGFuZCBpcyBleHBlY3RlZCB0byBiZSByZW1vdmVkIGZvciB0aGUgbmV4dCBpbnRlZ3JhdGlvbiBidWlsZC4gU2VlIGJ1ZyA8QSBIUkVGPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDUzIj4xNDQ1MzwvYT4uPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDciPjEzODA3PC9hPgorbnVsbCBiaW5kaW5nIHJldHVybmVkIGZvciBmdWxseSBxdWFsaWZpZWQgYXJyYXkgZGVjbGFyYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MDMiPjE0NDAzPC9hPgorYXN0OiBleGNlcHRpb24gb24gY3JlYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjkiPjE0MjI5PC9hPgorRmFpbHVyZSB3cml0aW5nIHRvIGEgcmVhZCBvbmx5IC5wcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MDUiPjEzOTA1PC9hPgorY2hhbmdlcyB0byByZWFkLW9ubHkgLmNsYXNzcGF0aCBmaWxlIGFyZSBub3QgdGhyb3duIG91dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjUiPjYxNjU8L2E+CitoYW5kbGUgcmVhZC1vbmx5IGNsYXNzIHBhdGggZmlsZSBpbiBhIGdyYWNlZnVsIHdheQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzIyIj4xNDMyMjwvYT4KK0FTVC9ET00gOiBJVmFyaWFibGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkgZm9yICdsZW5ndGgnIGZpZWxkIG9mIGFuIGFycmF5IHJldHVybiBudWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzQzIj4xNDM0MzwvYT4KK0NsYXNzRmlsZVJlYWRlci5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpIHNob3VsZCByZXR1cm4gbnVsbCBmb3IgYW5vbnltb3VzIHR5cGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MyI+MTIzNjM8L2E+CitCZXR0ZXIgaW50ZWdyYXRpb24gb2YgdGhlIGJhdGNoIGNvbXBpbGVyIHdpdGggYW50IGphdmFjIHRhc2sgb3B0aW9uIC1leHRkaXJzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjE3Ij4xNDIxNzwvYT4KK0RPTS9BU1Q6IHdyb25nIHN0YXJ0IHBvc2l0aW9uIGZvciBleHByZXNzaW9uIHN0YXRlbWVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEwNiI+MTQxMDY8L2E+CitEZWNsYXJhdGlvbnMgaW4gSGllcmFyY2h5IGRvZXMgbm90IGZpbmQgZGVjbGFyYXRpb25zIGluIGhpZXJhcmNoeSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNjAiPjEzMDYwPC9hPiAKK1R5cGUgaGllcmFyY2h5IG9uIHJlZ2lvbiBwb3B1bGF0ZXMgSmF2YSBNb2RlbCBjYWNoZSBmb3IgdHlwZXMgaW4gdGhlIHJlZ2lvbiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTciPjE0MTE3PC9hPgorTlBFIGltcG9ydGluZyBiaW5hcnkgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE3MiI+MTQxNzI8L2E+CitCdWlsZGVyIGlzIHNldHRpbmcgc291cmNlIHJlc291cmNlcyBhcyBkZXJpdmVkIQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjYiPjMyNjY8L2E+CitDaGFuZ2luZyBraW5kIG9mIGNsYXNzcGF0aCBlbnRyeSByZXBvcnRzIDEgZGVsdGEgKDFHRFRSVFApICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMSI+MTMyMzE8L2E+CitRdWljayBGaXg6IHdyb25nIHByb3Bvc2FsIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE0MSI+MTQxNDE8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBkdXJpbmcgc2VhcmNoICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgzMSI+MTM4MzE8L2E+CitOUEUgaW4gUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkxNCI+MTI5MTQ8L2E+CitDb21waWxlciBjYW5ub3QgcmVzb2x2ZSBqYXZheC5uZXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk2NCI+MTM5NjQ8L2E+CitFeGNlcHRpb24gb24gc3RhcnR1cAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTk4Ij4xNDE5ODwvYT4KK0FTVDogQ2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCkgaXMgbnVsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTM5Ij4xMzkzOTwvYT4KK0RCQ1M6IG5vIGVycm9yIG1lc3NhZ2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgaW4gamF2YSBzb3VyY2UgCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTggLSAxOHRoIEFwcmlsIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0MWEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKwk8bGk+Q2hhbmdpbmcgdGhlIHNvdXJjZSBhdHRhY2hlbWVudCBvZiBhIGphciB3aWxsIG5vdyBjb3JyZWN0bHkgZmlyZSBzb3VyY2UKKwkJYXR0YWNobWVudCBqYXZhIGRlbHRhcy4gVGhlIGZsYWdzIG9mIHRoZXNlIGRlbHRhcyBhcmU6CisJCTx1bD4KKwkJCTxsaT48Y29kZT5JSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRUFUVEFDSEVEPC9jb2RlPiBpZiBhIHNvdXJjZQorCQkJCWhhcyBiZWVuIGF0dGFjaGVkIHRvIGEgamFyIGFuZCBubyBzb3VyY2UgcHJldmlvdXNseSBleGlzdGVkLgorCQkJPC9saT4KKwkJCTxsaT48Y29kZT5JSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEPC9jb2RlPiBpZiBhIHNvdXJjZQorCQkJCWhhcyBiZWVuIGRldGFjaGVkIGZyb20gYSBqYXIgYW5kIG5vIG90aGVyIHNvdXJjZSBoYXMgYmVlbiBhdHRhY2hlZC4KKwkJCTwvbGk+CisJCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VERVRBQ0hFRCB8IEphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VBVFRBQ0hFRDwvY29kZT4gCisJCQkJaWYgYW4gYXR0YWNoZWQgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisJCQk8L2xpPgorCQk8L3VsPgorCTwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMjMiPjE0MDIzPC9hPgorTlBFIGluIGJ1aWxkIG5vdGlmaWVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTUiPjE0MTE1PC9hPgorQ2hhbmdpbmcgc291cmNlIGF0dGFjaG1lbnQgc2hvdWxkIG5vdCBmaXJlIGEgRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIIGRlbHRhICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA1NSI+MTQwNTU8L2E+CitOUEUgaW4gSmF2YU1vZGVsTWFuYWdlci5nZXRWYXJpYWJsZUFzWE1MU3RyaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMDciPjE0MDA3PC9hPgorU3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUgZG9lcyBub3QgZG8gVW5pY29kZSBlc2NhcGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxMyI+MTQwMTM8L2E+CitDb21waWxlciBzaG91bGQgbm90IGNvbnNpZGVyICd0aGlzLkNPTlNUJyBhcyBjb25zdGFudCBleHByZXNzaW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMDgiPjE0MDA4PC9hPgorVmFyaWFibGVCaW5kaW5nLmdldFZhcmlhYmxlSWQgY29udGFpbnMgc3VzcGljaW91cyBjb2RlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTg5Ij4xMzk4OSA8L2E+CitQYWNrYWdlIHZpZXcgZG9lc24ndCByZWZyZXNoIGFmdGVyIEpSRSBzd2l0Y2hpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjU4OCI+MTI1ODg8L2E+CitHb29kIG1hdGNoIG1hcmtlZCBhcyBwb3RlbnRpYWwgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMTQzIj4xMzE0MzwvYT4KK0JpbmFyeSBjb25zdHJ1Y3RvciBzZWFyY2ggZG9lcyBub3Qgd29yayAocmVmICYgZGVjbCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ij4xMzgwNzwvYT4KK251bGwgYmluZGluZyByZXR1cm5lZCBmb3IgZnVsbHkgcXVhbGlmaWVkIGFycmF5IGRlY2xhcmF0aW9uCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTAzIj4xNDEwMzwvYT4KK1RvbyBtYW55IGRlcGVuZGVudHMgZm91bmQgd2hlbiBpbmNyZW1lbnRhbGx5IHJlY29tcGlsaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4NCI+NDM4NDwvYT4KK1NldHRpbmcgY2xhc3NwYXRoIHZhcmlhYmxlcyBkb2VzIHR3byBidWlsZHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODUiPjMyODU8L2E+CitXaHkgZG9lcyBjaGFuZ2UgdGhlIHNvdXJjZSBhdHRhY2htZW50IHRyaWdnZXIgYSBidWlsZCAoMUdFSFhXMykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTA2Ij4xMzkwNjwvYT4KK0NvbXBpbGVyIGRpZCBub3QgZGV0ZWN0IHVuY2F1Z2h0IGV4Y2VwdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDE5Ij4xNDAxOTwvYT4KK05QRSB3aXRoIGNvZGUgYXNzaXN0IHdvcmtpbmcgaW4gYW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTI2MyI+OTI2MzwvYT4KK0NvZGUgYXNzaXN0IGNhbid0IHNlZSBvdGhlciBwcm9qZWN0J3MgY2xhc3MgZm9sZGVycyAgCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQxNiAtIDE2dGggQXByaWwgMjAwMiAtIE1JTEVTVE9ORSA1Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0MAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBDaGFuZ2VkIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNhY2hpbmcgcG9saWN5IHNvIGFzIHRvIGFjY29tb2RhdGUgbGFyZ2Ugd29ya3NwYWNlcy4gSXQgdXNlZCB0byBiZSBhbiBvdmVyZmxvd2luZyBMUlUgY2FjaGUgb2Ygc2l6ZSAxMDAwCitwYWNrYWdlIGZyYWdtZW50cy4gSXQgbm93IGlzIGEgc2ltcGxlIHRhYmxlLCB3aGljaCBpcyBuZXZlciBlbXB0aWVkIGltcGxpY2l0bHkgYW55IGxvbmdlci4gTWVtb3J5IG92ZXJoZWFkIGxvb2tzIG5lZ2xpZ2VhYmxlLCBhbmQgaXQgYWxsb3dzIHRvCitkZWFsIG11Y2ggYmV0dGVyIHdpdGggdmVyeSBsYXJnZSB3b3Jrc3BhY2VzLiBPdGhlciBzaW1pbGFyIGltcHJvdmVtZW50cyB3ZXJlIG1hZGUgb24gdGhlIHNhbWUgZnJvbnQgc28gYXMgdG8gaW1wcm92ZSBKUkUgc3dpdGNoaW5nIHdpdGggc3VjaAord29ya3NwYWNlcy4KKworPC9saT4KKzxsaT4gRWxlbWVudENoYW5nZWRFdmVudCBnb3QgYWRkZWQgbm90aW9uIG9mIHR5cGUgKHNpbWlsYXIgdG8gSVJlc291cmNlQ2hhbmdlRXZlbnQpLCBzbyBhcyB0byBiZXR0ZXIKK2FsbG93IGNsaWVudHMgdG8gcmVhY3QgdG8gSmF2YU1vZGVsIGNoYW5nZXM6IAorCTx1bD4gCisJCTxsaT4gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSA6ICAKKzxwcmU+CisJLyoqCisJICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCisJICogcmVwb3J0IG9mIGNyZWF0aW9ucywgZGVsZXRpb25zLCBhbmQgbW9kaWZpY2F0aW9ucworCSAqIHRvIG9uZSBvciBtb3JlIEphdmEgZWxlbWVudChzKSBleHByZXNzZWQgYXMgYSBoaWVyYXJjaGljYWwKKwkgKiBqYXZhIGVsZW1lbnQgZGVsdGEgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0RGVsdGE8L2NvZGU+LgorCSAqCisJICogTm90ZTogdGhpcyBub3RpZmljYXRpb24gb2NjdXJzIGR1cmluZyB0aGUgY29ycmVzcG9uZGluZyBQT1NUX0NIQU5HRQorCSAqIHJlc291cmNlIGNoYW5nZSBub3RpZmljYXRpb24sIGFuZCBjb250YWlucyBhIGZ1bGwgZGVsdGEgYWNjb3VudGluZyBmb3IKKwkgKiBhbnkgSmF2YU1vZGVsIG9wZXJhdGlvbiAgYW5kL29yIHJlc291cmNlIGNoYW5nZS4KKwkgKgorCSAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKwkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUV2ZW50CisJICogQHNlZSAjZ2V0RGVsdGEKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9DSEFOR0UgPSAxOworPC9wcmU+CisJCTwvbGk+CisKKwkJPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50LlBSRV9BVVRPX0JVSUxEIAorPHByZT4KKwkvKioKKwkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdCAKKwkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCisJICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAorCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCisJICoKKwkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIFBSRV9BVVRPX0JVSUxECisJICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4gVGhlIGRlbHRhIHdoaWNoIGlzIG5vdGlmaWVkIGhlcmUgb25seSBjb250YWlucworCSAqIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBKYXZhTW9kZWwgb3BlcmF0aW9ucyAoaS5lLiBpZ25vcmVzIHRoZQorCSAqIHBvc3NpYmxlIHJlc291cmNlcyB3aGljaCBoYXZlIGNoYW5nZWQgb3V0c2lkZSBKYXZhIG9wZXJhdGlvbnMpLiBJbgorCSAqIHBhcnRpY3VsYXIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIEphdmFNb2RlbCBiZSBpbmNvbnNpc3RlbnQgd2l0aCByZXNwZWN0IHRvCisJICogcmVzb3VyY2VzIHdoaWNoIGdvdCBtb2RpZmllZCBvdXRzaWRlIEphdmFNb2RlbCBvcGVyYXRpb25zIChpdCB3aWxsIG9ubHkgYmUKKwkgKiBmdWxseSBjb25zaXN0ZW50IG9uY2UgdGhlIFBPU1RfQ0hBTkdFIG5vdGlmaWNhdGlvbiBoYXMgb2NjdXJlZCkuCisJICogCisJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlRXZlbnQKKwkgKiBAc2VlICNnZXREZWx0YQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfQVVUT19CVUlMRCA9IDI7Cis8L3ByZT4KKwkJPC9saT4KKworCQk8bGk+IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUkVDT05DSUxFIAorPHByZT4KKwkvKioKKwkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdCAKKwkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCisJICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAorCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCisJICoKKwkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgYXMgYSByZXN1bHQgb2YgYSB3b3JraW5nIGNvcHkgcmVjb25jaWxlCisJICogb3BlcmF0aW9uLgorCSAqCisJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlRXZlbnQKKwkgKiBAc2VlICNnZXREZWx0YQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1JFQ09OQ0lMRSA9IDQ7CQorPC9wcmU+CisJCTwvbGk+CisJPC91bD4KKzwvbGk+CQorPGxpPgkKKwlBbHNvIGFkZGVkIGEgY29ycmVzcG9uZGluZyBBUEkgb24gSmF2YUNvcmUgc28gYXMgdG8gYWxsb3cgcmVnaXN0ZXJpbmcgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiB0eXBlIG9mIGV2ZW50LgorCTxwcmU+CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gSmF2YSBlbGVtZW50cy4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisJICogQWZ0ZXIgY29tcGxldGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIGdpdmVuIGxpc3RlbmVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBmb3IgZXhhY3RseSB0aGUKKwkgKiB0aGUgc3BlY2lmaWVkIGV2ZW50cy4gIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZm9yIG90aGVyIGV2ZW50cywgdGhleQorCSAqIHdpbGwgYmUgZGVyZWdpc3RlcmVkLiAgCisJICoKKwkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0bworCSAqIGphdmEgZWxlbWVudHMgaW4gdGhlIG1vZGVsLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUgCisJICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZXBsYWNlZCBvciByZW1vdmVkLiAKKwkgKiAKKwkgKiBMaXN0ZW5lcnMgY2FuIGxpc3RlbiBmb3Igc2V2ZXJhbCB0eXBlcyBvZiBldmVudCBhcyBkZWZpbmVkIGluIDxjb2RlPkVsZW1lbnRDaGFuZ2VFdmVudDwvY29kZT4uCisJICogQ2xpZW50cyBhcmUgZnJlZSB0byByZWdpc3RlciBmb3IgYW55IG51bWJlciBvZiBldmVudCB0eXBlcyBob3dldmVyIGlmIHRoZXkgcmVnaXN0ZXIKKwkgKiBmb3IgbW9yZSB0aGFuIG9uZSwgaXQgaXMgdGhlaXIgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZXkgY29ycmVjdGx5IGhhbmRsZSB0aGUKKwkgKiBjYXNlIHdoZXJlIHRoZSBzYW1lIGphdmEgZWxlbWVudCBjaGFuZ2Ugc2hvd3MgdXAgaW4gbXVsdGlwbGUgbm90aWZpY2F0aW9ucy4gIAorCSAqIENsaWVudHMgYXJlIGd1YXJhbnRlZWQgdG8gcmVjZWl2ZSBvbmx5IHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZXkgYXJlIHJlZ2lzdGVyZWQuCisJICoKKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisJICogQHBhcmFtIGV2ZW50TWFzayB0aGUgYml0LXdpc2UgT1Igb2YgYWxsIGV2ZW50IHR5cGVzIG9mIGludGVyZXN0IHRvIHRoZSBsaXN0ZW5lcgorCSAqIEBzZWUgSUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcgorCSAqIEBzZWUgRWxlbWVudENoYW5nZUV2ZW50CisJICogQHNlZSAjcmVtb3ZlRWxlbWVudENoYW5nZUxpc3RlbmVyCisJICoJQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgZXZlbnRNYXNrKQorCTwvcHJlPgorCis8L2xpPgkKKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM1MyI+MTIzNTM8L2E+CitEb2N1bWVudEFkYXB0ZXIgY2FuIG5ldmVyIGJlIGNsb3NlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MjgiPjk2Mjg8L2E+CitTd2l0Y2hpbmcgSlJFIGlzIHNsb3cKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU4NSI+MTE1ODU8L2E+CitMYXJnZSAjIG9mIHByb2plY3RzIGxvY2sgZXNzZW50aWFsIG9wZXJhdGlvbnMgaW4gdGhlIFdvcmtzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzkzIj4xMzM5MzwvYT4KK0V4dHJlbWVseSBwb29yIGphdmEgZWRpdG9yIHBlcmZvcm1hbmNlIGluIDIwMDIwNDB4Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzMiPjEzMjMzPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGluIGV2YWx1YXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MjUiPjEzNjI1PC9hPgorUmVtb3ZlIGRlcHJlY2F0ZWQgbWV0aG9kIGZyb20gQVNUL0RPTSAKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1OTMiPjEzNTkzPC9hPgorQ29kZSBGb3JtYXR0ZXIgZm9ybWF0cyBzeW5jaHJvbml6ZWQgaW5jb3JyZWN0bHkuIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTIxIj4xMjkyMTwvYT4KK0J1aWxkIHNvbWV0aW1lcyBidWlsZHMgZmlsZXMgdGhhdCBoYXZlIG5vdCBjaGFuZ2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1MjIiPjEzNTIyPC9hPgorTlBFIG9uIGFub255bW91cyBjbGFzcyBjb2RlIGFzc2lzdC4KKworCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTEgLSAxMXRoIEFwcmlsIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzOQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgZmlyc3QgcHJvcG9zYWwgZm9yIC5jbGFzcyBmaWxlIHJlYWRpbmcgQVBJcy4gVGhpcyBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1pZ2h0IGNoYW5nZSBzbGlnaHRseS4KK1NlZSBuZXcgQVBJIGluIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuCis8dWw+Cis8bGk+Qnl0ZUNvZGVWaXNpdG9yQWRhcHRlcjwvbGk+Cis8bGk+Q2xhc3NGb3JtYXRFeGNlcHRpb248L2xpPgorPGxpPkRlY29kaW5nRmxhZzwvbGk+Cis8bGk+SUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzPC9saT4KKzxsaT5JQnl0ZWNvZGVWaXNpdG9yPC9saT4KKzxsaT5JQ2xhc3NGaWxlQXR0cmlidXRlPC9saT4KKzxsaT5JQ2xhc3NGaWxlRGlzYXNzZW1ibGVyIGFuZCBUb29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlRGlzYXNzZW1ibGVyPC9saT4gCis8bGk+SUNsYXNzRmlsZVJlYWRlcjwvbGk+Cis8bGk+SUNvZGVBdHRyaWJ1dGU8L2xpPgorPGxpPklDb25zdGFudFBvb2w8L2xpPgorPGxpPklDb25zdGFudFBvb2xDb25zdGFudDwvbGk+Cis8bGk+SUNvbnN0YW50UG9vbEVudHJ5PC9saT4KKzxsaT5JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZTwvbGk+Cis8bGk+SUV4Y2VwdGlvbkF0dHJpYnV0ZTwvbGk+Cis8bGk+SUV4Y2VwdGlvblRhYmxlRW50cnk8L2xpPgorPGxpPklGaWVsZEluZm88L2xpPgorPGxpPklJbm5lckNsYXNzZXNBdHRyaWJ1dGU8L2xpPgorPGxpPklJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeTwvbGk+Cis8bGk+SUxpbmVOdW1iZXJBdHRyaWJ1dGU8L2xpPgorPGxpPklMb2NhbFZhcmlhYmxlQXR0cmlidXRlPC9saT4KKzxsaT5JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnk8L2xpPgorPGxpPklNZXRob2RJbmZvPC9saT4KKzxsaT5JTW9kaWZpZXJDb25zdGFudHM8L2xpPgorPGxpPklPcGNvZGVNbmVtb25pY3M8L2xpPgorPGxpPklTb3VyY2VBdHRyaWJ1dGU8L2xpPgorPGxpPk9wY29kZVN0cmluZ1ZhbHVlczwvbGk+Cis8L3VsPgorVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLiBBbnkgY29tbWVudCBpcyB3ZWxjb21lIGFuZCByZWxhdGVkIGJ1Z3MgCitzaG91bGQgYmUgZW50ZXJlZCBpbiBKRFQvQ29yZS4KKzxsaT5BZGRlZCBjaGFyIGFycmF5IGJhc2VkIEFQSXMgb24gU2lnbmF0dXJlLiBUaGlzIEFQSXMgYXZvaWQgY3JlYXRpbmcgbmVlZGxlc3MgU3RyaW5ncyBhbmQKKwlhcmUgdGh1cyBtdWNoIG1vcmUgcGVyZm9ybWFudCB0aGFuIHRoZWlyIFN0cmluZyBiYXNlZCBlcXVpdmFsZW50LgorCTx1bD4KKwkJPGxpPjxjb2RlPmNyZWF0ZUFycmF5U2lnbmF0dXJlKGNoYXJbXSwgaW50IGFycmF5Q291bnQpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKGNoYXJbXSwgYm9vbGVhbik8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmNyZWF0ZU1ldGhvZFNpZ25hdHVyZShjaGFyW11bXSwgY2hhcltdKSA8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmdldEFycmF5Q291bnQoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0RWxlbWVudFR5cGUoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UGFyYW1ldGVyQ291bnQoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UGFyYW1ldGVyVHlwZXMoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UXVhbGlmaWVyKGNoYXJbXSk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmdldFJldHVyblR5cGUoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0U2ltcGxlTmFtZShjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5nZXRTaW1wbGVOYW1lcyhjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b0NoYXJBcnJheShjaGFyW10sIGNoYXJbXSwgY2hhcltdW10sIGJvb2xlYW4sIGJvb2xlYW4pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b0NoYXJBcnJheShjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b1F1YWxpZmllZE5hbWUoY2hhcltdW10pPC9jb2RlPjwvbGk+CisJPC91bD4KKzwvbGk+Cis8bGk+UmVtb3ZlZCB0ZW1wb3JhcnkgMi4wIEFQSSB3aGljaCB3ZXJlIGRlcHJlY2F0ZWQgaW4gcHJldmlvdXMgYnVpbGRzOgorCTx1bD4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNnZXRTaGFyZWRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSk8L2NvZGU+LCB1c2UgQVBJIHdpdGggZXh0cmEgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNnZXRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSk8L2NvZGU+LCB1c2UgQVBJIHdpdGggZXh0cmEgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNyZWNvbmNpbGUoSVByb2JsZW1SZXF1ZXN0b3IpPC9jb2RlPiwgdXNlIEFQSSB3aXRoIG5vIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPjwvbGk+CisJPC91bD4KKzwvbGk+CQorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzYyIj4xMjc2MjwvYT4KK1BlcmZvcm1hbmNlIC0gU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRlcm0gb2YgY2hhcltdICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY4OCI+MTI2ODg8L2E+CitOUEUgd2l0aCBjb2RlIGFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDA4Ij4xMzQwODwvYT4KK1N1YmZvbGRlcnMgb2YgYnVpbGQgZm9sZGVyIGFyZSBub3QgbWFya2VkIGFzIGRlcml2ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM1NSI+MTMzNTU8L2E+CitOUEUgZHVyaW5nIGNvZGUgY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzkxIj4xMzM5MTwvYT4KK05QRSBkb2luZyBjb2RlIGFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDg3Ij4xMzQ4NzwvYT4KK05QRSBpbiBDb21wbGV0aW9uRW5pZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM5NSI+MTMzOTU8L2E+Citsb2FkaW5nIHN3dCtleGFtcGxlcyB3aXRoIGF1dG8tYnVpbGQgb24gY2F1c2VzIGRlYWRsb2NrIChvciB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDYzIj4xMzA2MzwvYT4KK05QRSBpbiBleHRyYWN0IG1ldGhvZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI0NyI+MTMyNDc8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQVNUIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzg2Ij4xMzM4NjwvYT4KKydub3QgaW1wbGVtZW50ZWQgeWV0JyBzdXJmYWNlZCBvbiBEaXNwbGF5IGluIGRlYnVnIAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYxNyI+MTI2MTc8L2E+Citjb2RlIGFzc2lzdDogUHJvcG9zYWxzIGluc2lkZSBtZXRob2QgcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzM4Ij4xMjMzODwvYT4KK1VubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24gd2hlbiBhZGRpbmcgcGFja2FnZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI2MiI+MTIyNjI8L2E+CitDb21waWxlciBCdWcgd2l0aCBpbXBvcnQgU3RhdGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MiI+NzA4MjwvYT4KK05QRSBkdXJpbmcgYnVpbGQKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDA5IC0gOXRoIEFwcmlsIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzOGEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRpbmcgYSBuZXcgZW1wdHkgc291cmNlIGZvbGRlciBubyBsb25nZXIgY2F1c2VzIGEgZnVsbCBidWlsZC4gT25seSBhbiBpbmNyZW1lbnRhbCBidWlsZCBpcyBuZWVkZWQgbm93LgorPC9saT4KKzxsaT5KYXZhIG1vZGVsIEFQSSBhZGRpdGlvbnM6CisJPHVsPgorCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50LmdldEFuY2VzdG9yKGludCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklKYXZhRWxlbWVudC5nZXRPcGVuYWJsZSgpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5JSmF2YUVsZW1lbnQuZ2V0UGF0aCgpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5JSmF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SUphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgoSUphdmFFbGVtZW50KTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SVR5cGUuZmluZE1ldGhvZHMoSU1ldGhvZCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weS5maW5kRWxlbWVudHMoSUphdmFFbGVtZW50KTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SVdvcmtpbmdDb3B5LmZpbmRQcmltYXJ5VHlwZSgpPC9jb2RlPjwvbGk+CisJPC91bD4KKzwvbGk+Cis8bGk+SUNvbXBsZXRpb25SZXF1ZXN0b3IgQVBJIGNoYW5nZSA6CisJPHVsPgorCQk8bGk+IEFkZGVkICNiZWdpblJlcG9ydGluZygpIGFuZCAjZW5kUmVwb3J0aW5nKCkgQVBJIG9uIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPi4gI2JlZ2luUmVwb3J0aW5nIGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlIHJlc3RhcnRpbmcgZXJyb3IgZGV0ZWN0aW9uLiAjZW5kUmVwb3J0aW5nIGlzIGFsd2F5cyBjYWxsZWQgYXQgdGhlCisJCQkJZW5kIG9mIGRldGVjdGlvbi4KKwkJPC9saT4KKwkJPGxpPiBBZGRlZCBBUEkgZm9yIHNldHRpbmcgbXVsdGlwbGUgY2xhc3NwYXRoIHZhcmlhYmxlcyBhdCBvbmNlICg8Y29kZT5KYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZXM8L2NvZGU+LCB0aGlzIGFsbG93cyB0byB1cGRhdGUKKwkJCWFsbCBhZmZlY3RlZCBwcm9qZWN0cyBleGFjdGx5IG9uY2UsIGluc3RlYWQgb2YgaXRlcmF0aW5nIG11bHRpcGxlIHRpbWVzIG9uIGVhY2ggcHJvamVjdCAoaWYgaXQgcmVmZXJlbmNlcyB0aGUgdmFyaWFibGUpLiBUaGlzIGNhbiBpbXByb3ZlIHBlcmZvcm1hbmNlCisJCQl3aGVuIHNldHRpbmcgSlJFIHZhcmlhYmxlcy4KKwkJPC9saT4KKwkJPGxpPiBBZGRlZCBhIG5ldyBwYXJhbWV0ZXIgPGNvZGU+cmVsZXZhbmNlPC9jb2RlPiB0byBiZSBhYmxlIHRvIHNvcnQgcHJvcG9zYWwgYnkgZGVncmVlIG9mIHJlbGV2YW5jZS4KKwkJPGNvZGU+cmVsZXZhbmNlPC9jb2RlPiBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKwkJdmFsdWUgaXMgaGlnaGVyLgorCQk8YnI+CisJCTxicj48dHQ+SUNvbXBsZXRpb25SZXF1ZXN0b3J7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdEFub255bW91c1R5cGUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdENsYXNzKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRFcnJvciguLi4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRGaWVsZCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0SW50ZXJmYWNlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRLZXl3b3JkKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRMYWJlbCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TG9jYWxWYXJpYWJsZSguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TWV0aG9kKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRNZXRob2REZWNsYXJhdGlvbiguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TW9kaWZpZXIoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdFBhY2thZ2UoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdFR5cGUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdFZhcmlhYmxlTmFtZSguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0Pn08L3R0PgorCQk8YnI+CisJCTxicj4KKwkJPC9saT4KKwkJPGxpPgorCQlJZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyIGFuZCBwcm9wb3NhbCBhcmUgZXF1YWwgYW5kIHRoZSBjYXNlIG1hdGNoIHRoZW4gdGhlIHByb3Bvc2FsIHJlbGV2YW5jZSBncm93LiBOb3RlIHRoYXQgdGhpcyBpc24ndCBhIDEuMCBicmVha2luZyBBUEkgY2hhbmdlLCBpdAorCQlvbmx5IGFmZmVjdHMgdGhlIDIuMCBuZXcgY29kZSBhc3Npc3QgQVBJIChpLmUuIHN0aWxsIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCAxLjAgY2xpZW50cykgd2hpY2ggaGFzbid0IHlldCByZWFjaGVkIHN0YWJpbGl0eSwgdGhvdWdoIGl0IHNob3VsZCBiZSBjbG9zZSB0byBub3cuCisJCTwvbGk+CisJPC91bD4KKzwvbGk+CQorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNjE0Ij4xMjYxNDwvYT4KK0luaXRpYWxpemluZyBKUkUgdmFyaWFibGVzIHNsb3cgb24gcGx1Zy1pbiBhY3RpdmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5ODYiPjEyOTg2PC9hPgorQ3JlYXRpbmcgYSB3b3JraW5nIGNvcHkgZG9lcyBub3QgaW52b2x2ZSB0aGUgcHJvYmxlbSByZXF1ZXN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg1OCI+MTI4NTg8L2E+CitDb21waWxlciBCdWcgOiBJbnZhbGlkIEJ5dGUgQ29kZTogCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzkiPjExNzM5PC9hPgorRGVhZCBicmFuY2hlcyBpbiBwYWNrYWdlL3Byb2plY3QgSGllcmFyY2h5IFZpZXcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODczIj4xMjg3MzwvYT4KK0NvZGVBc3Npc3QgOiBtaXNzaW5nICBwcm9wb3NhbCBvZiBtZXRob2QgZGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAwNyI+MTIwMDc8L2E+CitTb3VyY2UgZm9sZGVyIGVuZGluZyB3aXRoIC5qYXIgY29uc2lkZXJlZCBhcyBKQVIgYXJjaGl2ZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MDgiPjEyOTA4PC9hPgorQnVpbGQgYW5kIHNhdmUgYXR0ZW1wdCBmYWlsIHdpdGggTlBFIGFuZCB0cnlpbmcgaXQgbWFueSB0aW1lcyBjcmFzaHMgRWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjQ2Ij4xMjI0NjwvYT4KK1BhY2thZ2VzIHZpZXcgc2hvd3MgLmNsYXNzIGFuZCAuamF2YSBmaWxlcyB3aGVuIEpBUiBoYXMgc291cmNlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ5Ij4zMzQ5PC9hPgorTmVlZCBhIElKYXZhRWxlbWVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UgdGhhdCBkb2VzIG5vdCBkbyB0aGUgZXhpc3RzIHRlc3QgKDFHSjY5R1ApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NzUiPjEyOTc1PC9hPgoramFja3MgLSBxdWFsaWZpZWQgYXNzaWdubWVudCB0byBmaW5hbCBmaWVsZCBzaG91bGQgYmUgcmVqZWN0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk2OSI+MTI5Njk8L2E+CitqYWNrcyAtIHN5bmNocm9uaXplZCAodm9pZCBleHByZXNzaW9uKSBzaG91bGQgYmUgcmVqZWN0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjcwNSI+MTI3MDU8L2E+CitQcm9ncmVzcyBtb25pdG9yIGN1dHMgb2ZmIHBhY2thZ2UgbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzY3Ij4xMjc2NzwvYT4KK0FTVCBNZXRob2RCaW5kaW5nIHF1ZXN0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3OSI+OTE3OTwvYT4KK0RDUjogTmVlZCBJSmF2YVNlYXJjaFNjb3BlIGVxdWFscyBvciBlbmNsb3NlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDQiPjEyNDQ0PC9hPgorc3RyYW5nZSB0eXBlcyBuYW1lcyBpbiBSZW9yZGVyUGFyYW1ldGVycyBlcnJvciBkaWFsb2cgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3ODEiPjEyNzgxPC9hPgorQVNUIGluc3RhbmNlb2YtSW5maXhFeHByZXNzaW9uOiBDYW50IHJlc29sdmUgdHlwZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc3OCI+MTI3Nzg8L2E+CitUeXBvIGluIGNvbW1lbnQ6IEluZml4RXhwcmVzc2lvbi5SSUdIVF9TSElGVF9VTlNJR05FRCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc2OCI+MTI3Njg8L2E+CitJU2Nhbm5lciBkb2Vzbid0IGxldCB1c2VyIHN0YXRlIHdoZXRoZXIgbGluZSBzZXBhcmF0b3JzIGFyZSB0byBiZSByZWNvcmRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNjUxIj4xMjY1MTwvYT4KK05QRSBvdXQgb2YgdGhlIENvbXBsZXRpb25FbmdpbmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc2MSI+MTI3NjE8L2E+CitDbG9zaW5nIGEgdG9wIGxldmVsIGJpbmFyeSB0eXBlIGRvZXNuJ3QgY2xvc2UgdGhlIGNsYXNzIGZpbGVzIG9mIGl0cyBpbm5lciB0eXBlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjAiPjEyNzYwPC9hPgorVHlwZSBoaWVyYXJjaHkgbWlzc2luZyBhbm9ueW1vdXMgYmluYXJ5IHR5cGUgaWYgY2xvc2VkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY3NCI+MTI2NzQ8L2E+CitUb28gbWFueSBwcm9ibGVtcyB3aGlsZSByZWNvbmNpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzczIj4xMjM3MzwvYT4KK0Fzc2VydCRBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXJyb3Igd2hpbGUgcmVjb25jaWxpbmcKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA1OSI+MTMwNTk8L2E+CitpbmNvcnJlY3QgKD8pIGNvZGUgY29tcGlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg4MCI+MTI4ODA8L2E+CitTUUxKIFN1cHBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYwMyI+MTI2MDM8L2E+CitDb3VsZCBub3QgZGVsZXRlIGVtcHR5IGphdmEgZmlsZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTYwMCI+OTYwMDwvYT4KK0ZpZWxkIHJlZmVyZW5jZSBpbiB3b3JraW5nIGNvcHkgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk5NSI+MTI5OTU8L2E+CitUb29sRmFjdG9yeTo6Y3JlYXRlU2Nhbm5lciAtIGluY29ycmVjdCBqYXZhZG9jCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MzMiPjEyOTMzPC9hPgorIk5ldmVyIHVzZWQiIHZhcmlhYmxlIHdhcm5pbmdzIGNhbid0IGRldGVjdCBhY3Jvc3Mgc2NvcGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTM1Ij41MTM1PC9hPgorT3BlbiBKYXZhIGVkaXRvciBvbiBJUmVzb3VyY2UuY2xhc3MgZG8gYW4gZXJyb3IgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODA5Ij4xMjgwOTwvYT4KK1VuaW1wbGVtZW50ZWQgbWV0aG9kcyBzaG91bGQgbm90IHByZXZlbnQgY2xhc3MgZnJvbSBydW5uaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDIxIj4xMDQyMTwvYT4KK1dTQUQgaGFuZyB3aGlsZSBzZXR0aW5nIGJ1aWxkcGF0aCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1OTAiPjEyNTkwPC9hPgorUmV0dXJuaW5nIHRoZSB0eXBlIHdoZW4gbG9jYWwgdmFyIGlzIHNlbGVjdGVkIGJyZWFrcyByZWZhY3RvcmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzEwIj4xMjcxMDwvYT4KK0luY29uc2lzdGVudCBiZWhhdmlvciBmb3IgdGhlIG1ldGhvZCBJVHlwZS5jcmVhdGVGaWVsZCgpCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQwMiAtIDJuZCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzcKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5JbXByb3ZlZCBzcGVjaWZpY2F0aW9uIG9mIDxjb2RlPklCdWZmZXI8L2NvZGU+IGJ5IHNheWluZyB0aGF0OgorCTx1bD4KKwkJPGxpPiBKYXZhIG1vZGVsIG9wZXJhdGlvbnMgdGhhdCBtYW5pcHVsYXRlIGFuIDxjb2RlPklCdWZmZXI8L2NvZGU+IChlLmcuIAorCQkJPGNvZGU+SVR5cGUuY3JlYXRlTWV0aG9kKC4uLik8L2NvZGU+KSBlbnN1cmVzIHRoYXQgdGhlIHNhbWUgbGluZSBkZWxpbWl0ZXIgCisJCQkoaS5lLiBlaXRoZXIgPGNvZGU+IlxuIjwvY29kZT4gb3IgPGNvZGU+IlxyIjwvY29kZT4gb3IgPGNvZGU+IlxyXG4iPC9jb2RlPikgaXMgCisJCQl1c2VkIGFjY3Jvc3MgdGhlIHdob2xlIGJ1ZmZlci4gVGh1cyB0aGVzZSBvcGVyYXRpb25zIG1heSBjaGFuZ2UgdGhlIGxpbmUgZGVsaW1pdGVyKHMpIAorCQkJaW5jbHVkZWQgaW4gdGhlIHN0cmluZyB0byBiZSBhcHBlbmQsIG9yIHJlcGxhY2VkLgorCQkJSG93ZXZlciBpbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgb3RoZXIgY2xpZW50cyBvZiA8Y29kZT5JQnVmZmVyPC9jb2RlPgorCQkJbWlnaHQgbm90IGRvIHN1Y2ggdHJhbnNmb3JtYXRpb25zIGJlZm9yZWhhbmQuPC9saT4KKwkJPGxpPiA8Y29kZT5hZGRCdWZmZXJDaGFuZ2VkTGlzdGVuZXI8L2NvZGU+IGFuZCA8Y29kZT5yZW1vdmVCdWZmZXJDaGFuZ2VkTGlzdGVuZXI8L2NvZGU+CisJCQloYXZlIG5vIGVmZmVjdCBpZiB0aGUgYnVmZmVyIGlzIGFscmVhZHkgY2xvc2VkLjwvbGk+CisJCTxsaT4gT3RoZXIgb3BlcmF0aW9ucyB0aGF0IG1hbmlwdWxhdGUgdGhlIGJ1ZmZlciAobGlrZSA8Y29kZT5zZXRDb250ZW50PC9jb2RlPgorCQkJbWlnaHQgdGhyb3cgYSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPiBpZiBjYWxsZWQgYWZ0ZXIgdGhlIGJ1ZmZlcgorCQkJaGFzIGJlZW4gY2xvc2VkLjwvbGk+CisJPC91bD4KKzwvbGk+Cis8bGk+IElTY2FubmVyIEFQSSA6CisJPHVsPgorCQk8bGk+IGFkZGVkIDxjb2RlPklTY2FubmVyI2dldFNvdXJjZTwvY29kZT4gc28gYXMgdG8gcmV0cmlldmUgdGhlIHNjYW5uZXIgb3JpZ2luYWwgc291cmNlCisJCTxsaT4gcmVuYW1lZCA8Y29kZT5JU2Nhbm5lciNzZXRTb3VyY2VCdWZmZXI8L2NvZGU+IGludG8gPGNvZGU+SVNjYW5uZXIjc2V0U291cmNlPC9jb2RlPgorCTwvdWw+Cis8L2xpPgkKKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ1NCI+MTI0NTQ8L2E+CitBU1QvRE9NOiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZ2VuZXJhdGVkIGJ5IGJhZCBzb3VyY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQzMSI+MTI0MzE8L2E+CitVbmNsZWFyIGNvbXBpbGVyIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MTYiPjEyNDE2PC9hPgorU2VwYXJhdGUgY2FjaGluZyBvZiBwcm9qZWN0IGFuZCBwa2cgZnJhZ21lbnQgcm9vdCBmcm9tIGNhY2hpbmcgb2Ygb3BlbmFibGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ1NyI+MTI0NTc8L2E+CitOZWVkIHRvIHN5bmNocm9uaXplIEpvYk1hbmFnZXIuZGlzY2FyZEpvYnMoLi4uKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDUiPjEyNDQ1PC9hPgorQ29tcGlsZXIgRmFpbHVyZSBvbiByZWZlcmVuY2UgdG8gYWJzdHJhY3QgaW50ZXJmYWNlIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDE3Ij4xMjQxNzwvYT4KK2FwaTogSVNjYW5uZXIsIElUZXJtaW5hbFN5bWJvbHMgLSBubyB3YXkgdG8gZ2V0IHNvbWUgdG9rZW5zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MTkiPjEyNDE5PC9hPgorV2VpcmQgc2Vjb25kYXJ5IGVycm9yIGluIGNvbnN0cnVjdG9yIHJlY29uY2lsaWF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MTkiPjEyNDE5PC9hPgorYXBpOiBJU2Nhbm5lciAtIG1pc3NpbmcgKD8pIGdldFNvdXJjZUJ1ZmZlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzgwIj4xMjM4MDwvYT4KK0FTVC9ET006IHJlc29sdmVUeXBlQmluZGluZygpIG9uIHRoZSBzZWNvbmQgb3BlcmFuZCBvZiBhIGluc3RhbmNlb2YgZXhwcmVzc2lvbiByZXR1cm4gbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzkwIj45NzkwPC9hPgorQWRkIGNvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3MgaW5zZXJ0cyBpbiB3cm9uZyBwbGFjZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM4NyI+MTIzODc8L2E+CitPdXQgT2YgTWVtb3J5IGVycm9yIGltcG9ydGluZyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQyMyI+MzQyMzwvYT4KK05lZWQgSUNvbnN0YW50cyAoMUdLTTUxTykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU4MyI+MTE1ODM8L2E+CitJbmZpbml0ZSBsb29wIGluIE92ZXJmbG93aW5nTFJVQ2FjaGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM0NiI+MTIzNDY8L2E+CitMZWFraW5nIGNsb3NlZCBidWZmZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzEiPjExNDMxPC9hPgorU3RlcHBpbmcgZnJvbSBvbmUgY2FzZSBzdGF0ZW1lbnQncyBicmVhayBlbmRzIHVwIGluIG5leHQgY2FzZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjMyNiI+MTIzMjY8L2E+CitCYWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBDb21waWxhdGlvblVuaXQgd2l0aCBubyB0cmFpbGluZyBuZXdsaW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMyI+MzMxMzwvYT4KK1NldmVyZSAtIFBlcmZvcm1hbmNlIC0gSmF2YSBNb2RlbCByZWR1bmRhbmNpZXMgKDFHRktUVU4pICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ3MCI+MTI0NzA8L2E+CiswMjE0IC0gV2Fsa2JhY2sgZHVyaW5nIGVuY2Fwc3VsYXRlIG1ldGhvZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTc5Ij45MTc5PC9hPgorRENSOiBOZWVkIElKYXZhU2VhcmNoU2NvcGUgZXF1YWxzIG9yIGVuY2xvc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMDciPjEwMzA3PC9hPgorQ29kZSBhc3Npc3QgZmFpbGVkIHRvIHNlYXJjaCB3aG9sZSBjbGFzcyBwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA3OSI+NzA3OTwvYT4KK0NvZGUgZm9ybWF0dGluZyBmYWlscyB3aXRoIGphdmEubGFuZy5FcnJvciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU1Ij4zMjU1PC9hPgorUmVtaW5kZXIgLSByZS1lbmFibGUgdHJhbnNpZW50IG1hcmtlciBnZW5lcmF0aW9uIGR1cmluZyBjb2RlLWFzc2lzdCAoMUdEQ1hMQikKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDI2IC0gMjZ0aCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gUmVjb25jaWxpbmcgd2l0aCBlcnJvcnMgcHJvdmlkZSB0eXBlIGVycm9ycyBpbiBhZGRpdGlvbiB0byBzeW50YXggb25lcy4gVGhpcyBpcyBzdGlsbCBleHBlcmltZW50YWwsCisJYW5kIGNhbiBiZSBkaXNhYmxlZCBieSB1bmNoZWNraW5nIHRoZSBlZGl0b3IgcHJlZmVyZW5jZSBmb3IgdHJhbnNpZW50IHByb2JsZW1zLgorPC9saT4JCis8bGk+UGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgaW5kZXggcXVlcmllcyB3aXRoIHRoZSA8Y29kZT5XYWl0VW50aWxSZWFkeTwvY29kZT4gcG9saWN5LiAKKwlUaGUgYmFja2dyb3VuZCBpbmRleGVyIG5vdyB0YWtlcyBhbGwgdGhlIENQVSB3aGVuIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGl0IHRvIAorCWZpbmlzaCBpbmRleGluZy4KKyAgICBVc2VyIHdpbGwgbm90aWNlIHRoaXMgaW1wcm92ZW1lbnQgd2hlbiBkb2luZyBhIHNlYXJjaCBvciBvcGVuaW5nIGEgdHlwZSBhbmQgdGhlcmUgYXJlIAorICAgIHN0aWxsIGZpbGVzIHRvIGluZGV4LgorPC9saT4KKzxsaT5TY2FubmVyIEFQSQorCTx1bD4KKwkJPGxpPmRlZmluZWQgc2Nhbm5lciBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjwvY29kZT4pLiA8L2xpPgorCQk8bGk+YWRkZWQgdG9vbCBmYWN0b3J5IEFQSSAoc2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5I2NyZWF0ZVNjYW5uZXI8L2NvZGU+KSwgYWxsb3dpbmcgdG8gb2J0YWluCisJCQlhIHNjYW5uZXIgKGltcGxlbWVudGluZyA8Y29kZT5JU2Nhbm5lcjwvY29kZT4gQVBJKS4gPC9saT4KKwk8L3VsPgorPC9saT4KKzxsaT4gQ29kZSBmb3JtYXR0ZXIgQVBJCisJPHVsPgorCQk8bGk+ZGVmaW5lZCBjb2RlIGZvcm1hdHRlciBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUZvcm1hdHRlcjwvY29kZT4pLiA8L2xpPgorCQk8bGk+YWRkZWQgdG9vbCBmYWN0b3J5IEFQSSAoc2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXI8L2NvZGU+KSwgYWxsb3dpbmcgdG8gb2J0YWluCisJCQlhIGNvZGUgZm9ybWF0dGVyIChpbXBsZW1lbnRpbmcgPGNvZGU+SUNvZGVGb3JtYXR0ZXI8L2NvZGU+IEFQSSkuIE5vdGUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgd2FzIGFsc28gYWRkZWQKKwkJCXRvIGFsbG93IGNsaWVudCBjb2RlIHRvIGNvbnRyaWJ1dGUgYSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvZGUgZm9ybWF0dGVyIGV4dGVuc2lvbiBwb2ludCBpcyBuYW1lZAorCQkJPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlcjwvY29kZT4sIGFsc28gc2VlIGFzc29jaWF0ZSBjb21tZW50IGluIHBsdWdpbi54bWwuPC9saT4KKwkJPGxpPmFkZGVkIHRvb2wgZmFjdG9yeSBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcjwvY29kZT4pLCBhbGxvd2luZyB0byBvYnRhaW4KKwkJCWEgZGVmYXVsdCBjb2RlIGZvcm1hdHRlciAoaW1wbGVtZW50aW5nIDxjb2RlPklDb2RlRm9ybWF0dGVyPC9jb2RlPiBBUEkpLiA8L2xpPgorCTwvdWw+Cis8L2xpPgorPGxpPiBXb3JraW5nIENvcHkgQVBJIDogaW5zdGVhZCBvZiBwYXNzaW5nIGEgcHJvYmxlbSByZXF1ZXN0b3IgKDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPikgdG8gd29ya2luZyBjb3B5ICNyZWNvbmNpbGUoLi4uKQorb3BlcmF0aW9uLiBUaGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgcGFzc2VkIGFsb25nIGF0IGNyZWF0aW9uIHRpbWUuIAorCTx1bD4KKwk8bGk+YWRkZWQgSVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3Rvcik8L2xpPgorCTxsaT5hZGRlZCBJV29ya2luZ0NvcHkuZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKTwvbGk+CisJPC91bD4KKwlQcmV2aW91cyBBUEkgdGFraW5nIDxjb2RlPklCdWZmZXJGYWN0b3J5PC9jb2RlPiBnb3QgZGVwcmVjYXRlZCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IGJ1aWxkLgorPC9saT4JCis8bGk+U29tZSBpbnRlcm5hbCBjbGFzc2VzIGdvdCBkZXByZWNhdGVkIChhcyBjbGllbnQgY29kZSByZWxpZXMgb24gdGhlbSksIHNpbmNlIGJlaW5nIHN1cmZhY2VkOgorCTx1bD4KKwkJPGxpPiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuSW52YWxpZElucHV0RXhjZXB0aW9uPC9jb2RlPiA8YnI+PT0+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gPC9saT4KKwkJPGxpPiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuVGVybWluYWxTeW1ib2xzPC9jb2RlPiA8YnI+PT0+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM8L2NvZGU+IDwvbGk+CisJPC91bD4KKwlUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIHN1YnNlcXVlbnQgYnVpbGQuCis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MyI+MzM1MzwvYT4KK0FQSSAtIFNob3VsZCBwcm92aWRlIGFwaSBmb3IgZm9ybWF0dGluZyBzb3VyY2UgKDFHSklXQ0YpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3OSI+MzE3OTwvYT4KK0NvbXBpbGVyIC0gTEYgY2Fubm90IHJ1biBjbGFzc2VzIHRoYXQgbWlzcyBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gaW50ZXJmYWNlICgxRk5GVlk4KSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE5OSI+MTIxOTk8L2E+CitHZW5lcmF0ZWQgY2xhc3NmaWxlcyBzaG91bGQgYmUgdGFnZ2VkIGFzIGRlcml2ZWQgcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDAiPjExNjQwPC9hPgorQnVnIGluIHRoZSBjb2RlIGZvcm1hdHRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU0NCI+MTA1NDQ8L2E+CitJbnRlcm5hbCBlcnJvciBjcmVhdGluZyBsb25nIHBhY2thZ2UgbmFtZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE0MCI+MTIxNDA8L2E+Cit0eXBvIGluIElQYWNrYWdlRnJhZ21lbnRSb290OjpjcmVhdGVQYWNrYWdlRnJhZ21lbnQgamF2YWRvYyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQyMiI+MTE0MjI8L2E+CitBdHRhY2hpbmcgc291cmNlIHdoZW4gdXNpbmcgdmFyaWFibGVzIHRvIHBvaW50IHRvIGphcnMgdmVyeSB1bmludHVpdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDAwIj4xMjAwMDwvYT4KK01haW4uY29tcGlsZSBkb2VzIG5vdCBjbG9zZSBsb2cgZmlsZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTU4Ij42NTU4PC9hPgorTWlzc2luZyBjbGFzcyBwYXRoIGVudHJpZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhbiBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTQiPjMzNTQ8L2E+CitBUEkgLSBzaG91bGQgcHJvdmlkZSBhcGkgZm9yIFNjYW5uaW5nICgxR0pJV0NUKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0OTYiPjc0OTY8L2E+CitJbnRlcmZhY2Ugc2hvd3MgYXMgY2xhc3MgdW5kZXIgY29udGVudCBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ3NSI+MTE0NzU8L2E+CitDb2RlIHJlc29sdmUgcmVwb3J0cyB0eXBlcyBpbiBzZWN1cml0eSBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4OTkiPjEwODk5PC9hPgorQ2FuJ3Qgb3BlbiBvbiBzZWxlY3Rpb24gZm9yIG1lbWJlciB0eXBlIGluIGJpbmFyeSBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDEzIj4xMjAxMzwvYT4KK0phdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlIGZhaWxzIG9uIGVtcHR5IHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODQ1Ij4xMTg0NTwvYT4KK0ludGVybmFsIENvbXBpbGVyIEVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MjIiPjExOTIyPC9hPgoraXMgdGhpcyBjb2RlIHJlYWNoYWJsZSBvciBub3Q/CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMTkiPjEyMTE5PC9hPgorRWNsaXBzZSBidWlsZCBzbG93IG9uIG5ldHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODgxIj43ODgxPC9hPgorSVR5cGUubW92ZSgpIGNsb2JiZXJzIGVkaXRpbmcgYnVmZmVyIG9mIGRlc3RpbmF0aW9uIGVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDcwMyI+MTA3MDM8L2E+Cithc3Q6IG5vIEFQSSB0byBmaWd1cmUgb3V0IHRoZSBzb3VyY2UgcmFuZ2Ugb2YgJ3N1cGVyJyBrZXl3b3JkcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTgzIj4xMDk4MzwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIEphdmFCdWlsZGVyIGR1cmluZyBTYXZlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NSI+MzM1NTwvYT4KK0FQSSAtIHNob3VsZCBwcm92aWRlIEFQSSBmb3Igc291cmNlIGVsZW1lbnQgcGFyc2luZyAoMUdKSVdEOCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk1NSI+MTA5NTU8L2E+CitEQ1IgLSBzZWFyY2g6IHRvbyBsaW1pdGluZyBhcGkgb2YgSUphdmFTZWFyY2hTY29wZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgxOSI+ODgxOTwvYT4KK1NlbGYgaG9zdGluZyB0b29sIGRvZXNuJ3QgdXBkYXRlIHNlYXJjaCBpbmRleAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDk3Ij4xMTQ5NzwvYT4KK1JlbmFtaW5nIHByb2plY3QgZmFpbGVkIHdpdGggSmF2YSBNb2RlbCBFeGNlcHRpb246IEphdmEgTW9kZWwgU3RhdHVzIFtOYW1lIGNvbGxpc2lvbi5dCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNTkiPjEyMDU5PC9hPgorYXBpOiBKYXZhQ29yZTo6Z2V0T3B0aW9ucyBzaG91bGQgcmV0dXJuIE1hcCwgbm90IEhhc2h0YWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDQ0Ij4xMjA0NDwvYT4KK1NlYXJjaCBmb3IgZmllbGQgcmVmZXJlbmNlIGJyb2tlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA1Ij4xMTkwNTwvYT4KK0RDUiAtIHByb3ZpZGUgc2Nhbm5pbmcgQVBJCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMyMSAtIDIxc3QgTWFyY2ggMjAwMiAtIE1JTEVTVE9ORSA0Cis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNWEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDE0Ij4xMjAxNDwvYT4KK05vIGRlbHRhIHdoZW4gYWRkaW5nIHBhY2thZ2Ugd2hlcmUgc3JjPWJpbiBhbmQgc3JjIT1wcm9qICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc1NSI+MTE3NTU8L2E+CityZXNvdXJjZSBjb3B5IGZpbHRlciBhbmQgZHVwbGljYXRlZCByZXNvdXJjZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjQwIj4xMTY0MDwvYT4KK0J1ZyBpbiB0aGUgY29kZSBmb3JtYXR0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTg2MCI+MTE4NjA8L2E+CitDYW5ub3QgbW92ZSBhIGNvbXBpbGF0aW9uIHVuaXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYyNyI+MTE2Mjc8L2E+CitSZWZhY3RvcmluZzogQ0NFIGluIFB1bGx1cCBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTczNSI+MTE3MzU8L2E+CitOUEUgc2VsZWN0aW5nIEYzIGluIGVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODU0Ij4xMTg1NDwvYT4KK05QRSBvbiBzYXZlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MDUiPjExODA1PC9hPgorYnVpbGQgb3V0cHV0IGZpbHRlciBpcyBpZ25vcmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NjgiPjExNTY4PC9hPgorQ29kZSByZXNvbHZlIGRvZXMgbm90IHdvcmsgZm9yIGNoYW5nZWQgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1NiI+MTE2NTY8L2E+CitQbGVhc2UgYWRkIGEgSUNvbXBsZXRpb25SZXF1ZXN0b3JBZGFwdGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTI3MSI+OTI3MTwvYT4KK05QRSBpbnNwZWN0aW5nICJudWxsIiBpbiB0aGUgZXhwcmVzc2lvbnMgdmlldyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYzOCI+MTE2Mzg8L2E+Cithc3Q6IENvbXBpbGF0aW9uVW5pdDo6ZmluZERlY2xhcmluZ05vZGUgZmFpbHMgCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjcyIj4xMTI3MjwvYT4KK3Nsb3cgY29udGV4dCBhc3Npc3Qgb24gbWV0aG9kL2ZpZWxkLXJpY2ggY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzQwIj4xMTM0MDwvYT4KK29wZW4gb24gc2VsZWN0aW9uIGRvZXMgbm90IHdvcmsgZm9yIGJpbmFyeSB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjU0Ij4xMTY1NDwvYT4KK05QRSBkdXJpbmcgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1OSI+MTE2NTk8L2E+Cithc3Q6IENvbXBpbGF0aW9uVW5pdDo6ZmluZERlY2xhcmluZ05vZGUgZmFpbHMgIzIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwODYiPjExMDg2PC9hPgorQ2xhc3NGaWxlQ29tcGlsYXRpb25Vbml0IHNob3VsZCBpbXBsZW1lbnQgSUNsYXNzRmlsZQorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMTkgLSAxOXRoIE1hcmNoIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjM0Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IE5ldyBBUEkgb24gSVR5cGUgZm9yIGNvbXBsZXRlIHNuaXBwZXQgaW4gY3VycmVudCB0eXBlIGNvbnRleHQuIENvZGUgY29tcGxldGUgaXMgcGVyZm9ybWVkIGFnYWluc3QKKyBzb3VyY2UgKGlmIGF2YWlsYWJsZSkgb3IgYWdhaW5zdCB0eXBlIHN0cnVjdHVyZQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8dHQ+dm9pZCBjb2RlQ29tcGxldGUoPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBzbmlwcGV0LDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgaW5zZXJ0aW9uLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgcG9zaXRpb24sPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lcyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N0YXRpYyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOzwvdHQ+Cis8YnI+Jm5ic3A7Cis8L2xpPgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzE4Ij4xMDMxODwvYT4KK0ZlYXR1cmUgUmVxdWVzdDogbmV3IENvZGUgQXNzaXN0IEFQSSByZXF1aXJlZAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzE4IC0gMTh0aCBNYXJjaCAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzMworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBBZGRlZCBvcHRpb24gdG8gdHJhY2UgamF2YSBzZWFyY2ggYWN0aXZpdHkuCisgICAgVG8gZW5hYmxlIGl0LCBzZWUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBmaWxlOgorICAgIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaD10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+Q29ycmVjdGlvbkVuZ2luZSNjb21wdXRlQ29ycmVjdGlvbnMoSVByb2JsZW0sIElDb21waWxhdGlvblVuaXQsIElDb3JyZWN0aW9uUmVxdWVzdG9yKTwvY29kZT4sIGFsbG93aW5nLgordG8gY29tcHV0ZSByZXBsYWNlbWVudCBjb3JyZWN0aW9ucyBmb3IgSVByb2JsZW0ocykgZGV0ZWN0ZWQgd2hpbGUgcmVjb25jaWxpbmcuPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SVNvdXJjZVJlZmVyZW5jZSNleGlzdHMoKTwvY29kZT4sIGFsbG93aW5nLgordG8gY2hlY2sgZXhpc3RlbmN5IGJlZm9yZSBpbnZva2luZyA8Y29kZT5JU291cmNlUmVmZXJlbmNlPC9jb2RlPiBiZWhhdmlvci4gQWxsIGltcGxlbWVudGF0aW9ucyBkaWQgYWxyZWFkeSBwcm92aWRlCithbiA8Y29kZT5leGlzdHMoKTwvY29kZT4gbWV0aG9kIHNpbmNlIHRoZXkgYWxzbyBhcmUgaW1wbGVtZW50aW5nIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4uPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUyNCI+MTE1MjQ8L2E+CithcGk6IElXb3JraW5nQ29weTo6IGdldFdvcmtpbmdDb3B5KCkgamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExIj4xMTUxMTwvYT4KK0NvbXBpbGVyIDEuNCBmb29sZWQgYnkgZXh0cmEgaW50ZXJmYWNlIG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM4OSI+MTEzODk8L2E+CitVbnVzZWQgcGFyYW1ldGVycyBub3Qgc2hvd2luZyB1cCBhcyBjb21waWxlciB3YXJuaW5ncyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQxMCI+MTE0MTA8L2E+CitFeGNlcHRpb24gaW4gSmF2YSBCdWlsZGVyIHdoZW4gZGVidWcgb3B0aW9ucyB0dXJuZWQgb2ZmIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjg1Ij4xMTI4NTwvYT4KK1BvdGVudGlhbCBOUEUgaW4gQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24ucHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDQwIj4xMTQ0MDwvYT4KK25wZSBpbiByZW5hbWUgdGVtcCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ2OCI+MTE0Njg8L2E+CitOUEUgZGVsZXRpbmcgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzUiPjExNDM1PC9hPgorY29tcGlsZXIgYnVnOiBvdmVyd3JpdGluZyBpbXBsaWNpdGVseSBhYnN0cmFjdCBtZXRob2QgaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNTAiPjExMjUwPC9hPgorTlBFIGluIGxvZyBhZnRlciBpbXBvcnRpbmcgcGx1Z2lucyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzEiPjExMjcxPC9hPgorVW5hYmxlIHRvIGRlbGV0ZSBhIGJpbmFyeSBwcm9qZWN0IGluIEphdmEgcGVyc3BlY3RpdmUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjEwIj4xMTIxMDwvYT4KK1Jlc291cmNlRGVsdGFzIGFyZSBsb3N0IHdoZW4gbWVyZ2luZyBkZWx0YXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzcxIj4xMTM4MDwvYT4KK2FzdDogbWlzc2luZyBiaW5kaW5nIGZvciBDb25kaXRpb25hbEV4cHJlc3Npb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNzEiPjExMzcxPC9hPgorRE9NL0FTVDogbm9kZSBtaXNzaW5nIGZvciBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNDMiPjYyNDM8L2E+CithbiBJU291cmNlUmVmZXJlbmNlIEFQSSBpc3N1ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjk2Ij4xMTI5NjwvYT4KK05QRSBkdXJpbmcgYnVpbGQKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzOCI+MzQzODwvYT4KK09wZW5PblNlbGVjdGlvbiAtIHNob3VsZCBiZSBhYmxlIHRvIGxvY2F0ZSBtaXNzaW5nIG1ldGhvZCBieSBndWVzc2luZyAoMUdMMTg2UCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQwNiI+MTE0MDY8L2E+CitBY3Rpb25QZXJmb3JtZWQoKSBtZXRob2QgaW4gQWJzdHJhY3RBY3Rpb24gbm90IGZvdW5kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjEiPjMyMjE8L2E+CitKTSAtIERlYWRsb2NrIHdoaWxlIHNhdmluZyBpbiBFZGl0b3IgKDFHQUo2N1cpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMDEiPjExMjAxPC9hPgorQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBidWlsZCBwcm9jZXNzCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxNCAtIDE0dGggTWFyY2ggMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SURPTUZhY3RvcnkuY3JlYXRlSW50ZXJmYWNlKCk8L2NvZGU+IGFuZCA8Y29kZT5JRE9NRmFjdG9yeS5jcmVhdGVDbGFzcygpPC9jb2RlPi4KK1NlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4MCI+MTA5ODA8L2E+IGZvciBkZXRhaWxzLjwvbGk+Cis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU1Ij4xMTM1NTwvYT4KK09wZW5PblNlbGVjdGlvbiB1bmFibGUgdG8gcGVyZm9ybSBpbiBzaW5nbGUtdHlwZSBpbXBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjMyIj45MjMyPC9hPgorSUNvbXBpbGF0aW9uVW5pdC5kZWxldGUoKSBmYWlscyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNzYiPjExMTc2PC9hPgorT3JnYW5pemUgaW1wb3J0cyBtaXNzZXMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjQiPjMyMjQ8L2E+CitUZXN0cyAtIFJlLWVuYWJsZSByZWNvbmNpbGVyIHRlc3RzICgxR0FLWFpNKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTgwIj4xMDk4MDwvYT4KK0pEVCAvIGZhY3RvcnkgZm9yIG5ldyBpbnRlcmZhY2VzIHdvdWxkIGJlIG5pY2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5OTYiPjEwOTk2PC9hPgorY3JlYXRlQ29tcGlsYXRpb25Vbml0IGRvZXNuJ3QgYmVoYXZlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEyNSI+MTExMjU8L2E+CitET00vQVNUOiBBUEkgcmVxdWVzdCA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzciPjExMjc3PC9hPgorRGlmZmVyZW5jZSBpbiBiZXR3ZWVuIG91dGxpbmVyIGNvbnRlbnQgYW5kIHVuaXQgY29udGVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODMzIj4xMDgzMzwvYT4KK09wZW4gdHlwZSBkb2Vzbid0IHByb3Bvc2UgYWxsIHR5cGUgYWZ0ZXIgYSBjaGVja291dCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwNjciPjExMDY3PC9hPgorQWRkaW5nIHVzZWZ1bCB0b1N0cmluZygpIG1ldGhvZCBmb3IgZWFjaCBuZXcgRE9NL0FTVCBub2RlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTMzIj45OTMzPC9hPgorRm9ybWF0IGRvZXMgbm90IGhhbmRsZSBzeW5jaHJvbml6ZWQga2V5d29yZCBjb3JyZWN0bHkgCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NzUiPjg2NzU8L2E+CitEQ1IgLSBDb2RlIGNvcnJlY3Rpb24gY291bGQgc3VnZ2VzdCBuZXcgZWxlbWVudCBjcmVhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzQxIj4xMTM0MTwvYT4KK2luY29ycmVjdCBvdXRsaW5lIChpIHNlZSBvbmx5IGltcG9ydHMpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMTciPjExMjE3PC9hPgoraXMgZG91YmxlICI7ICIgb24gYSByZXR1cm4gc3RhdGVtZW50IGFuIGVycm9yPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDMxIj4xMDAzMTwvYT4KK1NFRiBDbGFzc0Nhc3RFeGNlcHRpb24gCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxMiAtIDEydGggTWFyY2ggMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6CisgICAgIDx1bD4KKyAgICAgCTxsaT4gU2VhcmNoIGRvZXNuJ3QgcG9wdWxhdGUgdGhlIEphdmEgTW9kZWwgYW55IGxvbmdlci4gVGh1cyB0aGUgbWVtb3J5CisgICAgIAkgICAgdXNlZCBieSBhIHNlYXJjaCBvcGVyYXRpb24gY2FuIGJlIHJlY2xhaW1lZCBhdCB0aGUgZW5kLiA8L2xpPgorICAgICAJPGxpPiBBY2Nlc3MgdG8gemlwIGFuZCBqYXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQsIHdoaWNoIHNob3VsZCByZXN1bHQKKyAgICAgCSAgICAgaW4gYmV0dGVyIHBlcmZvcm1hbmNlIG9uIGEgc2xvdyBuZXR3b3JrLiA8L2xpPgorICAgICA8L3VsPgorICAgICA8L2xpPgorPGxpPiBBZGRlZCBmbGFnIDxjb2RlPklKYXZhRWxlbWVudERlbHRhLkZfRklORV9HUkFJTkVEPC9jb2RlPiB0aGF0IGluZGljYXRlcworICAgICB0aGF0IGEgZmluZS1ncmFpbmVkIGRlbHRhIHdhcyBjb21wdXRlZCBmb3IgYSBnaXZlbiBkZWx0YS4KKyAgICAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgZmxhZyB0byBmaW5kIG91dCBpZiBhIGNvbXBpbGF0aW9uIHVuaXQgCisgICAgIHRoYXQgaGF2ZSBhIDxjb2RlPkZfQ09OVEVOVDwvY29kZT4gY2hhbmdlIHNob3VsZCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgCisgICAgIG5vIGZpbmVyIGdyYWluZWQgY2hhbmdlcyAoPGNvZGU+Rl9GSU5FX0dSQUlORUQ8L2NvZGU+IGlzIHNldCkgb3IgaWYgCisgICAgIGZpbmVyIGdyYWluZWQgY2hhbmdlcyB3ZXJlIG5vdCBjb25zaWRlcmVkICg8Y29kZT5GX0ZJTkVfR1JBSU5FRDwvY29kZT4gCisgICAgIGlzIG5vdCBzZXQpLiAKKyAgICAgPC9saT4KKzxsaT4gU3VyZmFjaW5nIElQcm9ibGVtICg8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTwvY29kZT4pIAorCTxicj5UaGlzIGFsbG93cyBzb21lIEphdmEgQVBJIHRvIHJlcG9ydCBmYWlsdXJlcyBpbiBhIGxpZ2h0ZXIgd2F5IHRoYW4gZ2VuZXJhdGluZyBtYXJrZXJzLiBNYXJrZXIgYmFzZWQgQVBJIGhhdmUgYmVlbgorCWRlcHJlY2F0ZWQgKG5vdGUgdGhhdCBkdWUgdG8gc29tZSBkZWFkbG9jayBpbiBjbGllbnQgY29kZSwgc29tZSBvZiB0aGVzZSBBUEkgZGlkIG5vdCBldmVuIHByb2R1Y2UgbWFya2VycywgZS5nLiByZWNvbmNpbGluZykuIEluIGFkZGl0aW9uIHRvCisJc3VyZmFjaW5nIHByb2JsZW0gZGVzY3JpcHRpb25zLCBJUHJvYmxlbSBleHBvc2VzIGFsbCB0aGUgSURzIGZvciB0aGUgSmF2YSBwcm9ibGVtIG1hcmtlcnMgKGF0dHJpYnV0ZSAiaWQiIG9uIG1hcmtlcnMgb2YgdHlwZSAib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSIpPC9saT4KKzxsaT4gQ2hhbmdlZCBlcnJvciByZXBvcnRpbmcgbWV0aG9kIGZvciA8Y29kZT5JQ29tcGxldGlvblJlcXVlc3RvcjwvY29kZT4gdG8gc3VyZmFjZSBJUHJvYmxlbXMgaW5zdGVhZCBvZiBJTWFya2Vycy48L2xpPgorPC91bD4KKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE5MSI+MTExOTE8L2E+CitTdHJhbmdlIGFub255bW91cyB0eXBlcyBpbiBvdXRsaW5lIHN0cnVjdHVyZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTUxIj4xMTE1MTwvYT4KK2FzdDogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9uIEFTVCBjcmVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDUzOCI+MTA1Mzg8L2E+CitQb3NzaWJsZSBtZW1vcnkgbGVhaz8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYxNiI+MTA2MTY8L2E+CitTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9wZW5pbmcgdHlwZSBzZWxlY3Rpb24gZGlhbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTIiPjExMTUyPC9hPgorQ29kZSBTZWxlY3QgLSBkb2VzIG5vdCB3b3JrIHdpdGggZW1wdHkgc2VsZWN0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMjkiPjExMTI5PC9hPgorRE9NL0FTVDogQ2FsbCByZXNvbHZlVHlwZUJpbmRpbmcoKSBvbiBhIENhc3RFeHByZXNzaW9uIG9iamVjdCB0aHJvd3MgYSBOdWxsUG9pdG5lckV4Y2VwdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU2Ij4zMjU2PC9hPgorU2VhcmNoYWJsZUVudmlyb25tZW50IC0gY29udmVydHMgY2hhcltdIHRvIFN0cmluZywgd2hpY2ggYWZmZWN0cyBwZXJmb3JtYW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTg0Ij4xMDk4NDwvYT4KK0RPTS9BU1Q6IENVIHdpdGggc3ludGF4IGVycm9ycyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwNiI+MTExMDY8L2E+CitET00vQVNUOiBkbyBzdGF0ZW1lbnQgZG9lc24ndCBjb250YWluIHRyYWlsaW5nIHNlbWljb2xvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwNCI+MTExMDQ8L2E+CitET00vQVNUOiBOdW1iZXJMaXRlcmFsIGNvbnRhaW5zIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNvbW1lbnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjEzIj4xMDIxMzwvYT4KK1NlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoKElKYXZhRWxlbWVudFtdKSBkb2VzIG5vdCB3b3JrIGZvciBiaW5hcnkgZWxlbWVudHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNDAiPjkyNDA8L2E+CitTZWFyY2ggZmluZHMgZGVsZXRlZCBjbGFzc2VzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTAxMSI+MTEwMTE8L2E+CitpbmNvcnJlY3QgJ3ZhcmlhYmxlIG5ldmVyIHVzZWQnIHdhcm5pbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTAyNSI+MTEwMjU8L2E+CitleHRyYWN0IG1ldGhvZDogaW5jb3JyZWN0bHkgZGlzYWxsb3dlZCBvbiBzb21lIGJvb2xlYW4gZXhwcmVzc2lvbnMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTciPjEwNjk3PC9hPgorUGVyZm9ybWFuY2UgLSBCaW5hcnkgbW9kZWwgc2hvdWxkIG5vdCBjYWNoZSB0aGUgY2xhc3NmaWxlIGJ5dGVzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDM3Ij4xMTAzNzwvYT4KK0RPTS9BU1Q6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGNyZWF0aW4gQVNUIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjM1Ij4xMDYzNTwvYT4KK092ZXJyaWRlIG1ldGhvZHMgbm90IHNob3dpbmcgbWlzc2luZyBtZXRob2RzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTMwIj43OTMwPC9hPgorQ29kZSBBc3Npc3QgLSBObyBjb21wbGV0aW9uIGluIHN3aXRjaCBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk3OSI+MTA5Nzk8L2E+CitKRE9NL2FkZCBzdXBlcmludGVyZmFjZSBmb3JtYXQgcHJvYmxlbSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4NiI+MTA5ODY8L2E+CitET00vQVNUOiBOUEUgd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBhIGJpbmRpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1ODAiPjEwNTgwPC9hPgordHlwZSBoaWVyYXJjaHkgaW5jb3JyZWN0IGZvciBuZXN0ZWQgdHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTM1Ij4xMDkzNTwvYT4KK0RPTS9BU1Q6IHdyb25nIGxlbmd0aCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTExIj42MTExPC9hPgorTWlzc2luZyBjb21wbGV0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODk4Ij4xMDg5ODwvYT4KK0RPTS9BU1Q6IE51bGxQb2ludGVyRXhjZXB0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjEiPjMyNjE8L2E+CitTZWFyY2ggLSBNZW1vcnkgcGVhayBkdXJpbmcgc2VhcmNoICgxR0VOMTdMKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NyI+NjY2NzwvYT4KK1NlYXJjaDogT3V0T2ZNZW1vcnlFcnJvciBzZWFyY2hpbmcgd2lsZGNhcmRlZCBmaWVsZCByZWYgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODc0Ij4xMDg3NDwvYT4KK0RPTS9BU1Q6IENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjb250YWlucyB0cmFpbGluZyBjb21tZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODgxIj4xMDg4MTwvYT4KK0RPTS9BU1Q6IFN3aXRjaENhc2UuaXNEZWZhdWx0IGFsd2F5cyByZXR1cm5zIGZhbHNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODY1Ij4xMDg2NTwvYT4KK0RPTS9BU1Q7IEFTVC5yZXNvbHZlV2VsbEtub3duVHlwZSgidm9pZCIpIHJldHVybnMgbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg2MSI+MTA4NjE8L2E+CitET00vQVNUOiBUeXBlTGl0ZXJhbC5yZXNvbHZlVHlwZUJpbmRpbmcgZG9lc24ndCByZXR1cm4gY2xhc3MgQ2xhc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTkiPjEwODE5PC9hPgorSW5jb21wbGV0ZSB0YXNrIGRlc2NyaXB0aW9uIGFmdGVyIGJ1aWxkIHdpdGggaW5jb21wbGV0ZSBjbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ2OCI+MTA0Njg8L2E+CitET00vQVNUOiBUeXBlRGVjbGFyYXRpb24jaXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBkb2Vzbid0IGNvbnNpZGVyIGFub255bW91cyB0eXBlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ5OSI+MTA0OTk8L2E+CitET00vQVNUOiBuZWVkIGEgd2F5IHRvIGFjY2VzcyB0aGUgSU1ldGhvZEJpbmRpbmcgb2YgYSBDbGFzc0luc3RhbmNlQ3JlYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0OTYiPjEwNDk2PC9hPgorRE9NL0FTVDogbmVlZCBmb3IgYSBub2RlIHRoYXQgaG9sZHMgdGhlIGJvZHkgc3RhdGVtZW50cyBvZiBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc4MSI+MTA3ODE8L2E+Cithc3Q6IGluY29ycmVjdCBwb3NpdGlvbiBhbmQgbGVuZ3RoIGZvciBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQzIj4xMDg0MzwvYT4KK0RPTS9BU1Q6IHdyb25nIHN0cnVjdHVyZSBmb3IgZm9yIHN0YXRlbWVudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NjMiPjEwNjYzPC9hPgorYXN0OiBleGNlcHRpb24gaW4gQVNUIGNvbnZlcnRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc1OSI+MTA3NTk8L2E+Cithc3Q6IGluY29ycmVjdCBsZW5ndGggb2YgU2ltcGxlTmFtZSAoc3Vic3Vibm9kZSBvZiBBcnJheVR5cGUpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTAwIj4xMDUwMDwvYT4KK1Nob3VsZG4ndCBpZ25vcmUgaW5oZXJpdGVkIG1ldGhvZCB3aXRoIHdyb25nIGFyZ3VtZW50IHR5cGVzCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjI3Ij4xMDYyNzwvYT4KK1JlYnVpbGQgRGVsZXRlcyBub24tQ2xhc3MgUmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMyI+MzIzMzwvYT4KK0pNIC0gQ3JlYXRlRWxlbWVudEluQ3VPcGVyYXRpb24gc2hvdWxkIG5vdCBzYXZlIHdvcmtpbmcgY29weSAoMUdCRUtBVykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDUiPjM0NDU8L2E+CitzZWFyY2g6IHR5cGUgaGllcmFyY2h5IHNjb3BlIGluY29ycmVjdCAoMUdMQzhWUykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTU0Ij4xMDk1NDwvYT4KK0lNZW1iZXI6OmdldEZsYWdzIHNlbWFudGljcyBvbiBpbnRlcmZhY2UgbWVtYmVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTUiPjMxOTU8L2E+CitVbm5lY2Vzc2FyeSBwcm9wb3NhbHMgaW4gT3BlbiBvbiBzZWxlY3Rpb24gd2hpdGggc3ludGF4IGVycm9yICgxRzBFSUJCKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTMzIj4xMDkzMzwvYT4KK0RPTS9BU1Q6IHBvc2l0aW9uIG9mIEFub255bW91c1R5cGVEZWNsYXJhdGlvbiBpcyBbLTEsMF0gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTUiPjEwODE1PC9hPgorRXJyb3IgbWVzc2FnZSBmb3IgImluY29tcGxldGUgcGF0aCIgbGFja3MgZGV0YWlscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTEzIj4xMDkxMzwvYT4KK0RPTS9BU1Q6IHJlc29sdmVCaW5kaW5nKCkgZm9yIHN0YXRpYyBmaWVsZCBhY2Nlc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTgiPjEwNjk4PC9hPgorRE9NL0FTVDogZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgQVNUIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NDYiPjQ5NDY8L2E+CitDcm9zcy1wcm9qZWN0IGJ1aWxkZXIgZWZmaWNpZW5jeSBpc3N1ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEzIj4zMjEzPC9hPgorTm8gY29tcGlsZSBlcnJvciBmb3IgYmFkIGludGVyZmFjZSAoMUc3RzZNMSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY2NyI+MTA2Njc8L2E+CitOUEUgaW4gc2VsZiBlbmNhcHN1bGF0ZSBmaWVsZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM4OSI+MTAzODk8L2E+CitFZGl0aW5nIG5vbi1KYXZhIGZpbGVzIGNhdXNlcyBhIHJlY29tcGlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzEzIj4xMDMxMzwvYT4KK0NhbiBub3QgY3JlYXRlIEphdmEgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZSAoMTAwMCsgSmF2YSBmaWxlcykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc5NCI+MTA3OTQ8L2E+CitOUEUgZnJvbSBzZWFyY2ggZHVyaW5nIHJlZmFjdG9yLCBwdWxsIHVwIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjk5Ij4xMDY5OTwvYT4KK2FzdDogbm90aGluZyBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBpcyBjcmVhdGVkIAorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMDUgLSA1dGggTWFyY2ggMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzAKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gQWRkZWQgQVBJIDxjb2RlPklDbGFzc0ZpbGUuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPgorCSBmb3IgY29uc2lzdGVuY2Ugd2l0aCA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+LgorICAgICBUaGUgcmV0dXJuZWQgd29ya2luZyBjb3B5IGlzIGp1c3QgYSB3cmFwcGVyIG9uIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyLgorICAgICBUaHVzIG9ubHkgdGhlIDxjb2RlPmdldEJ1ZmZlcigpPC9jb2RlPiBvcGVyYXRpb24gaXMgdmFsaWQgb24gdGhpcyB3b3JraW5nCisgICAgIGNvcHkuCis8L2xpPgorPGxpPiBBZGRlZCB0aGUgbm90aW9uIG9mIHNoYXJlZCB3b3JraW5nIGNvcGllcy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byBhbHdheXMKKyAgICAgZ2V0IHRoZSBzYW1lIDxjb2RlPklXb3JraW5nQ29weTwvY29kZT4gaW5zdGFuY2Ugd2hlbiBhc2tpbmcgZm9yIGEgd29ya2luZyBjb3B5LgorICAgICBTZWUgPGNvZGU+SVdvcmtpbmdDb3B5LmdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5KTwvY29kZT4sCisgICAgIDxjb2RlPklXb3JraW5nQ29weS5maW5kU2hhcmVkV29ya2luZ0NvcHkoKTwvY29kZT4KKyAgICAgYW5kIDxjb2RlPklXb3JraW5nQ29weS5kZXN0cm95KCk8L2NvZGU+IGZvciBtb3JlIGRldGFpbC4KKzwvbGk+Cis8bGk+IEFkZGVkIG9wdGlvbiB0byB0cmFjZSB1c2Ugb2Ygc2hhcmVkIHdvcmtpbmcgY29waWVzLgorICAgIFRvIGVuYWJsZSBpdCwgc2VlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUgb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMgZmlsZToKKyAgICA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zaGFyZWR3b3JraW5nY29weT10cnVlPC9jb2RlPgorPC9saT4KKzxsaT4gQWRkZWQgZXh0ZW5zaW9uIHBvaW50IHRvIGpkdGNvcmUgc28gYXMgdG8gYWxsb3cgY2xpZW50IHBsdWdpbnMgdG8gcmVnaXN0ZXIgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycy4KKyAgRXh0ZW5zaW9uIHBvaW50IGlzICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIi4KKyAgKGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvfmNoZWNrb3V0fi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlJTIwaW5pdC91bmluaXQtY2xhc3NwYXRoLXZhcnMuaHRtbCI+ZGVzaWduIG5vdGVzPC9hPikKKyAgTm90ZSB0aGF0IGVhY2ggY2xhc3NwYXRoIHZhcmlhYmxlLCBpZiB1bmJvdW5kLCB3aWxsIHRyaWdnZXIgaXRzIHJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXIgZXhhY3RseSBvbmNlIHBlciBzZXNzaW9uLiBJZiB1bnN1Y2Nlc3NmdWwsIGl0IHdpbGwgc3RheSB1bmJvdW5kLgorCis8L2xpPgorPGxpPiBBZGRlZCBvcHRpb24gdG8gdHJhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucy4KKyAgICBUbyBlbmFibGUgaXQsIHNlZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zIGZpbGU6CisgICAgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3B2YXJpYWJsZT10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5BZGRlZCBvcHRpb24gdG8gdHJhY2UgYWNjZXNzIHRvIHppcCBhbmQgamFyIGZpbGVzIGZyb20gdGhlIEphdmEgbW9kZWwuCisgICAgVG8gZW5hYmxlIGl0LCBzZWUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBmaWxlOgorICAgIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2Vzcz10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5SZXN1cnJlY3Qgc29tZSBjb2RlIGZvciBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQorCTx1bD4KKwk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25maWd1cmFibGVPcHRpb24gKGFsbCB0aGUgY2xhc3MpLgorCTxsaT4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyIChzb21lIG1ldGhvZHMpIDoKKwkJPHVsPgorCQk8bGk+IHB1YmxpYyBDb2RlRm9ybWF0dGVyKENvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzKQorCQk8bGk+IHByaXZhdGUgc3RhdGljIE1hcCBjb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncykKKwkJPGxpPiBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldERlZmF1bHRPcHRpb25zKExvY2FsZSBsb2NhbGUpCisJCTxsaT4gcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBzb3VyY2VTdHJpbmcsIGludCBpbml0aWFsSW5kZW50YXRpb25MZXZlbCwgQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucykKKwkJPC91bD4KKwk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuT3B0aW9ucy5wcm9wZXJ0aWVzIChhbGwgdGhlIGZpbGUpCisJPC91bD4KKzwvbGk+Cis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDMiPjMzMDM8L2E+CitNYW55IGVycm9ycyB3aGVuIGFkZGluZyBwcm9qZWN0cyBmcm9tIHJlcG9zaXRvcnkgaW4gYSBmcmVzaCBpbnN0YWxsICgxR0Y1UFU3KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyODUiPjUyODU8L2E+CitDb21waWxlIGVycm9ycyBvbiBsb2FkIHdoZW4gSmF2YSBQZXJzcGVjdGl2ZSBub3Qgb3BlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwODUiPjcwODU8L2E+CitCdWlsZCBlcnJvcnMgd2hlbiBhZGRpbmcgdGhlIEpVbml0IGV4YW1wbGUgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzAwIj4xMDcwMDwvYT4KK2FzdDogcmVzb2x2ZUJpbmRpbmcgcmV0dXJucyBudWxsIG9uIHBhcmFtZXRlciByZWZlcmVuY2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzYiPjEwNjc2PC9hPgorU3RyaW5nTGl0ZXJhbC5yZXNvbHZlVHlwZUJpbmRpbmcoKSByZXR1cm4gbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY3OSI+MTA2Nzk8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBjYWxsaW5nIHJlc29sdmVUeXBlQmluZGluZygpIHdpdGggYW4gZXJyb3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzQiPjEwNjM0PC9hPgorUHJvYmxlbSB3aXRoIGNvbXBpbGluZyBzb21lIGphdmEgY2xhc3NlczsgY2xhc3Mgbm90IHZpc2libGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM0MCI+MTAzNDA8L2E+CitOUEUgd2hlbiBzZWxlY3RpbmcgbXVsdGlwbGUgbWV0aG9kcyB0byAiUHVsbCB1cCIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjYyIj4xMDY2MjwvYT4KK0Nhc3RpbmcgdG8gQnVmZmVyIG1ha2VzIGl0IGltcG9zc2libGUgZm9yIGNsaWVudHMgdG8gaW1wbGVtZW50IElCdWZmZXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkyIj4xMDU5MjwvYT4gCithc3Q6IE5QRSBpbiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOjpyZXNvbHZlQmluZGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTgzIj45NTgzPC9hPgorRE9NIDogU2VsZiBlbmNhcHN1bGF0ZSBmaWVsZDogTlBFIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTcwIj4xMDU3MDwvYT4KK2FzdDogQ2F0Y2hDbGF1c2UgaGFzIGluY29ycmVjdCBzdGFydGluZ1BvaW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg3Ij4xMDU4NzwvYT4KK2FzdDogbWlzc2luZyBub2RlIGZvciBhIHZhcmlhYmxlIGJpbmRpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU4OCI+OTU4ODwvYT4KK0ludmFsaWQgZGVsdGEgd2hlbiByZXBsYWNpbmcgamFyIGFuZCBwcm9qPXNyYz1iaW4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDk1Ij4xMDQ5NTwvYT4KK3R5cG8gaW4gQVNUTm9kZTo6TUFMRk9STUVEIGphdmFkb2MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0NzIiPjEwNDcyPC9hPgorQ29kZUFzc2lzdCAtIE5vIGNvbXBsZXRpb24gYmV0d2VlbiBkb3QgYW5kIG51bWJlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjMiPjMzMjM8L2E+CitPcGVuT25TZWxlY3Rpb24gLSBubyBzZWxlY3Rpb24gaW5zaWRlIENvZGVGb3JtYXR0ZXJQcmVmZXJlbmNlUGFnZS5mVGV4dExpc3RlbmVyIGluaXRpYWxpemVyICgxR0dORDNTKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDY2Ij4xMDQ2NjwvYT4KKyJDYW5ub3QgcmVmZXJlbmNlIGEgZmllbGQgYmVmb3JlIGl0IGlzIGRlZmluZWQiIC0gY29tcGlsZXIgYnVnPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzg2Ij4xMDM4NjwvYT4KK05QRSBpbiBNYXRjaExvY2F0b3IubG9va3VwVHlwZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNzgiPjEwMzc4PC9hPgorcGVyZiBwcm9ibGVtIHdpdGggZXh0ZXJuYWwgSkFScyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5MyI+OTU5MzwvYT4KK1NlbGVjdGlvbkVuZ2luZSBnaXZlIG1vcmUgcmVzdWx0cyB0aGFuIGV4cGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk2OSI+OTk2OTwvYT4KK0NvZGVGb3JtYXR0ZXI6IEJ1ZyB3aGVuIGZvcm1hdHRpbmcgdHJ5L2NhdGNoIEJsb2NrIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzEiPjMyMzE8L2E+CisxLjQgLSB0YXJnZXQgaXMgbm93IDEuMiAoMUdIVzBERikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTk4Ij45OTk4PC9hPgorUGVyZm9ybWFuY2UgLSBCZXR0ZXIgcHJ1bmluZyBtZWFuaW5nbGVzcyBBU1Qgbm9kZXMgdXBvbiBjb21wbGV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDAiPjEwMjQwPC9hPgorSkRUQ29tcGlsZXJBZGFwdGVyIGRvZXNuJ3QgdW5kZXJzdGFuZCAiZGVwcmVjYXRpb24iIGZyb20gQW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc0Ij4xMDI3NDwvYT4KK0RPTS9BU1Q6IHdyb25nIGltcGxlbWVudGF0aW9uIG9mIFR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDEiPjEwMjQxPC9hPgorUmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gY29tLmlibSAKKzxoMz4gCitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzUzIj4xMDc1MzwvYT4KK0NvbXBpbGVyIGJhcmZzIG9uIGM6XHViaXplbiB3aXRoIGludmFsaWQgdW5pY29kZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc0OSI+MTA3NDk8L2E+CitCdWcgaXMgY29kZSBmb3JtYXR0ZXIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MDEiPjEwNzAxPC9hPgorVW5kZWZpbmVkIG1ldGhvZCB3aGVuIGNvbXBpbGluZyB1c2luZyBKREsgMS40Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzQiPjEwNjc0PC9hPgorQVNUIEFQSSByZXF1ZXN0IDogbWV0aG9kIGJpbmRpbmcgZm9yIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MyI+MTA1ODM8L2E+CitDYW4gbm90IHNhdmUgYW55IGphdmEgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc1Ij4xMDI3NTwvYT4KK1NlYXJjaDogcmVmZXJlbmNlIHRvIGNsYXNzIG5vdCBmb3VuZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNyI+MzQzNzwvYT4KK0NvZGUgQXNzaXN0IGZhaWxzIHdoZW4gbWV0aG9kIGhhcyB1bmtub3duIHJldHVybiB0eXBlICgxR0wxMkVHKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1NzkiPjk1Nzk8L2E+CitTZWFyY2g6IGRlY2xhcmF0aW9uIGluIGhpZXJhcmNoeSAtIHdyb25nIG1hdGNoZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDYwIj4xMDQ2MDwvYT4KK1RoZSBDb21waWxlciBjYW4gbm90IHJlc29sdmUgcGFja2FnZSBsZXZlbCBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjQ0Ij4xMDI0NDwvYT4KK0RPTS9BU1Q6IE1ldGhvZEludm9jYXRpb24gc2hvdWxkIGhhdmUgcmVzb2x2ZUJpbmRpbmcoKSBtZXRob2QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE1NyI+OTE1NzwvYT4KK015IGV4aXN0aW5nIC5jbGFzcyBmaWxlcyBhcmUgZGVsZXRlZCEKKyAKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIyNiAtIDI2dGggRmVicnVhcnkgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjkKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5KYXZhIHRvb2xpbmcgbm93IHBlcmZvcm1zIG5vcm1hbGx5IGluc2lkZSBtZXRob2QgYm9kaWVzIHdob3NlIHNpZ25hdHVyZSBjb3VsZCBub3QKK2JlIHJlc29sdmVkLgorPC9saT4KKzxsaT4gU3BlY2lmaWVkIHRoYXQgd2hlbiBhbiA8Y29kZT5JQnVmZmVyPC9jb2RlPiBpcyBjcmVhdGVkIHRocm91Z2ggYW4gCisgICAgIDxjb2RlPklCdWZmZXJGYWN0b3J5PC9jb2RlPiwgaXRzIGNvbnRlbnQgaXMgc2V0IHdpdGggdGhlIG9yaWdpbmFsCisgICAgIGVsZW1lbnQncyBjb250ZW50LgorPC91bD4KKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDExMCI+MTAxMTA8L2E+CitQcm9qZWN0IG5vdCBidWlsZCBzaW5jZSBpdCB3YXMgaW5jb25zaXN0ZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTY0MiI+OTY0MjwvYT4KK1NlYXJjaCAtIG1pc3NpbmcgaW5hY2N1cmF0ZSB0eXBlIG1hdGNoZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5OTIiPjk5OTI8L2E+CitNZW1iZXIgY2xhc3MgZGVjbGFyYXRpb24gbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIyMSI+MTAyMjE8L2E+CitObyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb24gb24gYXJyYXkgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTY2Ij4xMDE2NjwvYT4KK0ludGVyZmFjZSBoaWRlcyBPYmplY3QgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MzQiPjc5MzQ8L2E+CitCdWlsZGVyIGFsd2F5cyByZWJ1aWxkcyB3aGVuIHdvcmtiZW5jaCByZXN0YXJ0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDU2Ij43NDU2PC9hPgorRXJyb3IgbWVzc2FnZSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBpcyBjb25mdXNpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE1MiI+MTAxNTI8L2E+CitDb21wdXRpbmcgaGllcmFyY2h5IG9mIElSZXNvdXJjZSBpcyBzbG93ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODA5Ij44ODA5PC9hPgorQ29kZSBhc3Npc3Qgd2l0aCBjbGFzcyBmb2xkZXJzIGRvZXMgbm90IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzYzIj45NzYzPC9hPgorQ29kZSBhc3Npc3QgZmFpbHVyZSBkdWUgdG8gZXJyb3IgaW4gbWV0aG9kIHNpZ25hdHVyZToxR1JWTjVSCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk4NSI+OTk4NTwvYT4KK0J1aWx0IGluIGNvbXBpbGVyIHdpbGwgc29tZXRpbWVzIG5vdCBhbGxvdyBPYmplY3QgbWV0aG9kIGNhbGxzIG9uIEludGVyZmFjZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAwOCI+MTAwMDg8L2E+CitJbnRlcm5hbCBjb21waWxlciBlcnJvciB3aGVuIGNvbXBpbGluZyBzd2l0Y2ggc3RhdGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTkxMiI+OTkxMjwvYT4KK0JhdGNoIGNvbXBpbGVyIGRvZXNuJ3QgcHV0IGJpbmFyaWVzIGluIHRoZSByaWdodCBmb2xkZXIgd2hlbiAtZCBpcyBtaXNzaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNTkiPjYwNTk8L2E+CitOUEUgaW4gSmF2YU1vZGVsU3RhdHVzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNTEiPjkzNTE8L2E+CitDb3B5aW5nIGEgY29tcGlsYXRpb24gdW5pdCBvbnRvIGl0c2VsZiBkZXN0cm95cyBjb21waWxhdGlvbiB1bml0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MTMiPjk4MTM8L2E+CitWZXJpZnlFcnJvciB3aXRoIElubmVyIENsYXNzIGhhdmluZyBwcml2YXRlIGNvbnN0cnVjdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ5MiI+OTQ5MjwvYT4KK1dhbGtiYWNrIHdoaWxlIHNlYXJjaGluZyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgzNyI+OTgzNzwvYT4KK0luY29uc2lzdGVudCBiZWhhdmlvciB3aGVuIGNvbXBpbGluZyBmcm9tIHNvdXJjZSBvciB1c2luZyBiaW5hcmllcyBmb3IgY29uc3RhbnQgZXhwcmVzc2lvbnMKKworPGgzPiAKK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk1MSI+Njk1MTwvYT4KK0RDUiAtIEJ1aWxkZXIgc2hvdWxkIGlnbm9yZSBmaWx0ZXJlZCBvdXQgcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTgwOSI+NTgwOTwvYT4KK0R1cGxpY2F0ZSBjbGFzcyBuYW1lcyBpbiBzZXBhcmF0ZSBwYWNrYWdlIGltcG9ydHMgY2F1c2UgY29tcGlsZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4ODgiPjk4ODg8L2E+CitKQVIgZXhvcnRlciBwcm9ibGVtcyB3aXRoIE1FVEEtSU5GIGluIHByb2plY3RzIHdpdGggbm8gc291cmNlIGZvbGRlciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxMDQiPjEwMTA0PC9hPgorQ2FsY3VsYXRlZCBzZXJpYWxWZXJzaW9uSUQncyBhcmUgaW5jb21wYXRpYmxlIHdpdGggU3VuJ3MgSkRLCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIxNCAtIDE0dGggRmVicnVhcnkgMjAwMiAtIE1JTEVTVE9ORSAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyOAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ3OSI+OTQ3OTwvYT4KK2V4Y2VwdGlvbiBvbiBwYWNrYWdlIGNyZWF0aW9uIChkaXNjb3VyYWdlZCBuYW1lKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk5OSI+NTk5OTwvYT4KK0lUeXBlLnJlc29sdmVUeXBlIHJldHVybnMgbXVsdGlwbGUgbWF0Y2hlcyBhbHNvIHRoZSB0eXBlIGlzIHVuYW1iaWdpb3VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NSI+NzQ4NTwvYT4KK0lUeXBlIHJlc29sdmUgZmFpbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Nzg1Ij45Nzg1PC9hPiAgCitQcm9ibGVtIGluIElUeXBlLnJlc29sdmVUeXBlKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjM5Ij45MjM5PC9hPgorc2VhcmNoIGZvciBtZXRob2QgZGVjbGFyYXRpb24gLSBzdHJhbmdlIGJlaGF2aW9yICAKKworPGgzPiAKK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTY0NyI+NTY0NzwvYT4KK1NlYXJjaCByZXN1bHRzIGRpZmZlciB3aGVuIHVzaW5nIG91dGxpbmVyIGNvbnRleHQgbWVudSB2cy4gZGlhbG9nICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjM5Ij41MjM5PC9hPgorb3V0bGluZXIgZ2V0cyBvdXQgb2Ygc3luY2ggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwMjkiPjUwMjk8L2E+CitJbnRlcm5hbCBFcnJvciBzYXZpbmcgamF2YSBmaWxlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTg2Ij45NTg2PC9hPiAgCitKYXZhIDEuNCBmZWF0dXJlIGFzc2VydCBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTUwNCI+OTUwNDwvYT4gIAorMUdSVTFMMzpTZWFyY2ggcmVmZXJlbmNlIHdvcmtzIG9ubHkgaW4gb3V0bGluZSB2aWV3IGFuZCBub3QgaW4gZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTQ3NiI+OTQ3NjwvYT4gIAorQXJyYXlJbmRleE91dE9mQm91bmRzIGluIEphdmFCdWlsZGVyICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYyIj4zMjYyPC9hPgorU3RyYW5nZSBvdXRwdXQgZmlsZSBkZWxldGlvbiAoMUdEUzJJWCkKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjEyIC0gMTJ0aCBGZWJydWFyeSAyMDAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI3Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmVzb3VyY2UgY29weSBmaWx0ZXJzIDogQSBuZXcgc2V0dGluZyBhbGxvd3MgdG8gc3BlY2lmeSBleGNsdXNpb24gZmlsdGVycyBmb3IgcmVzb3VyY2UgYmVpbmcgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLi4KKwk8dWw+CisJPGxpPm9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXJzIgorCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIjxuYW1lPlssPG5hbWU+XSogfSB3aGVyZSA8bmFtZT4gaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAob25seSAqIHdpbGQtY2FyZHMgYWxsb3dlZCkKKwk8bGk+ZGVmYXVsdDoJCQkiIiAKKwk8L3VsPgorPC9saT4KKzxsaT5FbmNvZGluZyBzdXBwb3J0IDogQmF0Y2ggY29tcGlsZXIgY2FuIGJlIHNwZWNpZmllZCB0aGUgc291cmNlIGVuY29kaW5nIGZvcm1hdCB1c2luZyAnLWVuY29kaW5nIG15RW5jb2RpbmcnIGNvbW1hbmQgbGluZSBvcHRpb24uCitJbiBjYXNlIG9mIG5lY2Vzc2l0eSwgZWFjaCBpbmRpdmlkdWFsIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGN1c3RvbSBlbmNvZGluZworYnkgc3VmZml4aW5nIGl0cyBuYW1lIHdpdGggJ1tteUVuY29kaW5nXScgKGlmIGFwcGxpZWQgdG8gYSBmb2xkZXIsIHRoZW4gYWxsIGZpbGVzIGluIGl0IHdpbGwgYmUgc2hhcmluZyB0aGUgY3VzdG9tCitlbmNvZGluZykuIFdoZW4gbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGlzIHVzZWQgKGFzIGJlZm9yZSkuIFNpbWlsYXJpbHksIGEgSmF2YUNvcmUgb3B0aW9uIGdvdCBhZGRlZCB0bworY29udHJvbCB0aGUgZGVmYXVsdCBlbmNvZGluZyAobm8gc3VwcG9ydCB5ZXQgZm9yIHBlciBmaWxlIGN1c3RvbSBlbmNvZGluZykuCisJPHVsPgorCTxsaT5vcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIgorCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIiIgZm9yIHBsYXRmb3JtIGRlZmF1bHQsIG9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIGVuY29kaW5nIG5hbWUgfS4KKwk8bGk+ZGVmYXVsdDoJCQkiIiAKKwk8L3VsPgorPC9saT4KKzxsaT4gRml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTgzIj45MTgzPC9hPiByZXF1aXJlZCB0byBpbmNyZW1lbnQgdGhlIGluZGV4IHNpZ25hdHVyZSAKK3ZlcnNpb24gc28gYXMgdG8gdHJpZ2dlciBhdXRvbWF0aWMgcmVpbmRleGluZyBvbiB3b3Jrc3BhY2Ugc3RhcnR1cCAoYW5kIHRodXMgYWRkIHNvbW1lIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHdlcmUgcHJldmlvdXNseQorbWlzc2luZyBmcm9tIHRoZSBiaW5hcnkgaW5kZXggZmlsZXMpLiBTdWJzZXF1ZW50IHN0YXJ0dXBzIHdpbGwgbm90IHJlaW5kZXggYW55IGZ1cnRoZXIgKG9ubHkgaWYgaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZCwgCitlLmcuIHNpZ25hdHVyZSB2ZXJzaW9uIGlzIGRpZmZlcmVudCkuCis8L2xpPgorPGxpPiBUaGUgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+IHVzZWQgd2hlbiBjcmVhdGluZyBhbiA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+Cisoc2VlIDxjb2RlPklDb21waWxhdGlvblVuaXQuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5KTwvY29kZT4pCitpcyBub3cgcmVtZW1iZXJlZCBhbmQgd2lsbCBiZSByZXVzZWQgaWYgdGhlIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW4uCis8L2xpPgorPGxpPk9sZCBKYXZhIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZ290IHJlbW92ZWQ8L2xpPgorPGxpPlByb2plY3QgZGVwZW5kZW5jeSBjeWNsZSBkZXRlY3Rpb24gcmVlbmFibGVkPC9saT4KKzxsaT4gT3BlbiBvbiBzZWxlY3Rpb24gbm8gbG9uZ2VyIG5lZWQgYSBub24tZW1wdHkgc2VsZWN0aW9uIHRvIHBlcmZvcm0gKHdoZW4gZW1wdHkgaXQgd2lsbCB1c2UgdGhlIHRva2VuCitpbiB3aGljaCB0aGUgc2VsZWN0aW9uIHN0YXJ0IHBvc2l0aW9uIGlzIGxvY2F0ZWQpLgorPGxpPkltcHJvdmVkIHByb2dyZXNzIHJlcG9ydGluZyB3aGlsZSBzZWFyY2hpbmcgYWxsIHR5cGVzIGluIHRoZSB3b3Jrc3BhY2UuPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDUyIj45NDUyPC9hPiAgCitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBjcmVhdGluZyBhbiBBU1QgZm9yIFRlc3RDYXNlLmphdmEgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczOTAiPjczOTA8L2E+CitFZGl0aW5nIGFuZCBzYXZpbmcgcmVhZC1vbmx5IC5qYXZhIHNvdXJjZSBmaWxlIG1heSBjYXVzZSBsb3N0IG9mIGRhdGEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTI2Ij43OTI2PC9hPgorQ29kZSBBc3Npc3QgLSBObyBjb21wbGV0aW9uIGZvciBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBhZnRlciBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2MzYiPjc2MzY8L2E+CitDYW4ndCBkbyBjb2RlIGFzc2lzdCBhZnRlciBmaWVsZCB3aXRoIGxvY2FsIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM2OSI+ODM2OTwvYT4KK0NvZGUgYXNzaXN0IHN0b3BzIHRvIHdvcmsgYWZ0ZXIgYW5vbnltb3VzIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM5OCI+OTM5ODwvYT4KK0NvbXBpbGVyIGVycm9yIHdpdGggZG91YmxlIGFycmF5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM5NSI+OTM5NTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBkdXJpbmcgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTg1Ij45MTg1PC9hPgorU2V2ZXJlIHNodXRkb3duIHBlcmZvcm1hbmNlIHByb2JsZW0gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjciPjYxNjc8L2E+CitJbmRleGVyIG5vdCBzdG9wZWQgb24gZXhpdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjIiPjczNjI8L2E+CitPdmVycmlkZSBNZXRob2RzIGRvZXNuJ3QgaGFuZGxlIHVuaWNvZGVzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyOTUiPjcyOTU8L2E+CitJbmRlbmRhdGlvbiBpbiBnZW5lcmF0ZWQgZ2V0dGVycy9zZXR0ZXJzIG9mIGlubmVyIGNsYXNzZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3OCI+NjY3ODwvYT4KK0luY29ycmVjdCBvdXRwdXQgYWZ0ZXIgQWRkIFVuaW1wbGVtZW50ZWQgTWV0aG9kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3NTgiPjg3NTg8L2E+CitudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGluIGVjbGlwc2UgY29yZSB3aGlsZSBjb21waWxpbmcgSmF2YSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNiI+NjIzNjwvYT4KK1JlbmFtZWQgZmlsZSBpcyBub3QgZXhjbHVkZWQgZnJvbSBwcm9qZWN0IGJ1aWxkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njk2Ij44Njk2PC9hPgorQ29kZSBhc3Npc3QgZG9lc24ndCB3b3JrIGluIGluaXRpYWxpemVyIG9mIGFub255bW91cyBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNjQiPjYwNjQ8L2E+CitPcGVuIG9uIHNlbGVjdGlvbiBzaG91bGRuJ3QgcmVxdWlyZSBzZWxlY3Rpb24uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIyMyI+OTIyMzwvYT4KK0NvZGVBc3Npc3QgZmFpbHVyZSBpbiBpbm5lciB0eXBlIGZyb20gY2xhc3MgZmlsZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODQ3Ij42ODQ3PC9hPgorRENSIC0gRmlsdGVyaW5nIG91dHB1dCB0byBidWlsZCBkaXJlY3RvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzA5Ij45MzA5PC9hPgorRE9NL0FTVDogTlBFIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgYSBiaW5kaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMDgiPjkzMDg8L2E+CitET00vQVNUOiB0d28gZXF1YWwgaGFzaCB0YWJsZSBhY2Nlc3NlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTAxIj45MTAxPC9hPgorUGFyc2UgZXJyb3Igd2hpbGUgdHlwaW5nIGluIEphdmEgZWRpdG9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDMxIj45MDMxPC9hPgorTlBFIGluIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQgZHVyaW5nIHNlYXJjaCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4NCI+OTA4NDwvYT4KK05QRSBpbiBwYXJzZXIgZHVyaW5nIGJ1aWxkIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMDgiPjkwMDg8L2E+CitDb2RlIGFzc2lzdCBvbiBtZXRob2QgZGVjbGFyYXRpb24gZ2l2ZXMgd3JvbmcgdGhyb3cgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg3OCI+ODg3ODwvYT4KK0NvZGUgYXNzaXN0IHByb3ZpZGVzIGFyYml0cmFyeSwgaW52YWxpZCBjaG9pY2UgYWZ0ZXIgYSBzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxOTgiPjkxMjg8L2E+CitOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBzdGFydGluZyB3b3JrYmVuY2ggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMzUiPjkwMzU8L2E+CitJIGdvdCBhbiBOUEUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE4MyI+OTE4MzwvYT4KK0JpbmFyeUluZGV4ZXIgZG9lc24ndCBpbmRleCBhbGwgdHlwZSByZWZlcmVuY2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjEiPjMzMjE8L2E+CitBZGRpbmcgbWlzc2luZyBzb3VyY2UgZm9sZGVyIGRvZXNuJ3QgcmVtb3ZlIHdhcm5pbmcgKDFHR0NDNFApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxOSI+MzIxOTwvYT4KK0pNIC0gJ0N5Y2xlIGRldGVjdGVkJyBzaG91bGQgbm90IGJlIGEgbWFya2VyIGF0dHJpYnV0ZSAoMUc4VlRTQSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTY5Ij45MTY5PC9hPgorV3JvbmcgY29kZSBnZW5lcmF0aW9uIGZvciBjb21wYXJpc29uIG9mIHN0cmluZyBjb25zdGFudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY4NSI+ODY4NTwvYT4KK0V4Y2VwdGlvbiB3aGlsZSBkZWxldGluZyBhIG1ldGhvZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDAyMSI+NDAyMTwvYT4KK2pkdDogSmF2YSBlbGVtZW50cyBhbmQgcmVzb3VyY2VzOiBlcnJvciBpbiBzb3VyY2UgY29kZSAoMUdHODdTOSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4NzgiPjc4Nzg8L2E+CitPbiBQYWNrYWdlIGNyZWF0aW9uOiBObyB3YXJuaW5nIGZvciB1bmNvbnZlbnRpb25hbCBuYW1lcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MSI+OTA0MTwvYT4KK3NlYXJjaDogY2Fubm90IGNyZWF0ZSBhIHN1Yi1jdSBzY29wZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4OCI+OTA4ODwvYT4KK1VucmVhY2hhYmxlIGNhdGNoIGJsb2NrIHdoZW4gZXJyb3IgaW4gcmVmZXJlbmNlZCBjbGFzcydzIGZpZWxkcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk5Ij4zMjk5PC9hPgorQXV0b2J1aWxkIHByb2R1Y2VzIGVycm9ycyB3aGVuIHJlbmFtaW5nIHNvdXJjZSBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAwOSI+OTAwOTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBjcmVhdGluZyBhbiBpbnZhbGlkIG1ldGhvZCAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTkwIj4zMTkwPC9hPgorSk0gLSB1c2Ugb2YgIm9wZW4iIGluIGphdmEgbW9kZWwgaW5jb25zaXN0ZW50IHdpdGggY29yZSAoMUZXMkVZUSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY4Ij4zMjY4PC9hPgorY3JlYXRlKElQcm9qZWN0KSBzdHJhbmdlIGZvciBub3JtYWwgcHJvamVjdHMgKDFHRFZURVIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUyNyI+ODUyNzwvYT4KK0RlbGV0ZSBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzciPjMwMzc8L2E+CitDb3JlIGVycm9yIGNvbXBpbGluZyBhIGphdmEgY2xhc3MgKDFHRUpLOFEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM4NiI+OTM4NjwvYT4KK2Nhbm5vdCBpbXBvcnQgamFyIGZpbGVzIGludG8gcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5NzYiPjc5NzY8L2E+CitKRFQgbWlzc2VzIHRoZSBuZXcgSmF2YSBmaWxlcyBjcmVhdGVkIGJ5IFBERSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcxMyI+NTcxMzwvYT4KK05QRSB3aGVuIHNlYXJjaGluZyBmb3IgcmVmZXJlbmNlcyBpbiBhIEpBUiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3NyI+OTE3NzwvYT4KK0J1aWxkZXIgdHJlYXRzIGJ1aWxkIGVycm9ycyBhcyBKYXZhRXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MCI+ODA0MDwvYT4KK2phdmEgc291cmNlIHdpdGggJCBpbiByZWZlcmVuY2Ugd29uJ3QgY29tcGlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwMzYiPjUwMzY8L2E+Cithc3NlcnRpb24gZmFpbHMgb24gYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk4Ij44NDk4PC9hPgorZGVwcmVjYXRlZCBtZXRob2RzIGFyZSBub3QgZGlzcGxheWVkIGluIHRoZSB0YXNrIGNvbnNvbGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzEiPjMzNzE8L2E+CitBc3NlcnRpb24gZmFpbGVkIGV4Y2VwdGlvbiBkdXJpbmcgYnVpbGQgKDFHSzE4M08pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOSI+MzQxOTwvYT4KK2Fzc2VyaW9uIGZhaWxlZCBpbiBidWlsZCAoMUdLQjlDSCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODk1Ij43ODk1PC9hPgorV2llcmQgc3RhdGU6IFByb2plY3Qgbm90IGJ1aWx0IGJlY2F1c2UgaW5jb25zaXN0ZW50LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MzAiPjc4MzA8L2E+CitEZWxldGluZyBtb3JlIHRoYW4gb25lIG1ldGhvZCBjb25zZWN1dGl2ZWx5IGZyb20gdGhlIGhpZXJhcmNoeSB2aWV3IGNhdXNlcyB1bmV4cGVjdGVkIGNvcnJ1cHRpb24gb2Ygb3RoZSBtZXRob2RzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxOTAiPjkxOTA8L2E+CitSZW1vdmluZyBhIGxpYnJhcnkgZnJvbSBjbGFzc3BhdGggZ2l2ZXMgbm90IGEgcmVtb3ZlIGRlbHRhICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTA0Ij45MTA0PC9hPgorY29weSBwYWNrYWdlIHByb2dyZXNzIGRpYWxvZyBoYXMgbWlzc2luZyBzdHJpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcwNiI+NTcwNjwvYT4gIAorQ2Fubm90IGFkZCB0d28gZm9sZGVycyB3LyBzYW1lIG5hbWUgYnV0IGRpZmYgcHJvamVjdHMgdG8gYnVpbGQgcGF0aCBvZiBKYXZhIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMDMiPjkxMDM8L2E+CitTZWFyY2ggcmVwb3J0cyBubyByZWZlcmVuY2VzIHRvIFNXVC5IZWxwICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDE4Ij42NDE4PC9hPgorU2NyYXBib29rOiAiVW5leHBlY3RlZCBFbmQgT2YgRmlsZSIgZXhwZWN0ZWQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTEiPjMxOTE8L2E+CitKTSAtIG5vbi1leGlzdGluZyBleHRlcm5hbCBqYXJzIHdpbGwgbm90IGNvbWUgdG8gbGlmZSB3aGVuIGNyZWF0ZWQgKDFGV0k1QzQpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgwIj44OTgwPC9hPgorVW5wcmVkaWN0YWJsZSBlcnJvciBjYXRjaGluZyBvbiBvdmVycmlkZGVuIG1ldGhvZHMgd2l0aCBsZXNzIHZpc2liaWxpdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDI0Ij45MDI0PC9hPgorRG8gbm90IGZpbmQgcmVmZXJlbmNlIHRvIGFuIGludGVyZmFjZSBpbiBKQVIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MCI+OTA0MDwvYT4KK0RPTS9BU1Q6IHdoeSBpcyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBhbiBleHByZXNzaW9uIAorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAyMDUgLSA1dGggRmVicnVhcnkgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gVGhlIEphdmFNb2RlbCBubyBsb25nZXIgbm90aWZpZXMgY2hhbmdlcyBmb3IgZ2VuZXJhdGVkIGNsYXNzZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIHRoZXNlIAord2VyZSBuZXZlciBzdXBwb3NlZCB0byBiZSBzaWduYWxlZC4gPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ4Ij4zNDQ4PC9hPgorTm8gZXJyb3IgZm9yIHBhY2thZ2UgYW5kIHR5cGUgY29sbGlzaW9uIGluIGRlZmF1bHQgcGFja2FnZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMTYiPjkwMTY8L2E+CitET00vQVNUOiBQcm9ibGVtcyB3aXRoIGFycmF5Lmxlbmd0aCBhY2Nlc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAxNCI+OTAxNDwvYT4KK0RPTS9BU1Q6IE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcmVzb2x2aW5nIFN5c3RlbS5lcnIucHJpbnRsbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDE4Ij45MDE4PC9hPgorRE9NL0FTVDogd2h5IGRvZXMgdGhlIGtleSBvZiBhIHZhcmlhYmxlIGJpbmRpbmcgaW5jbHVkZSB0aGUgdHlwZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzU1Ij41MzU1PC9hPgorc2VhcmNoOiBOUEUgaW4gc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5MjgiPjg5Mjg8L2E+CitVbmFibGUgdG8gZmluZCByZWZlcmVuY2VzIG9yIGRlY2xhcmF0aW9ucyBvZiBtZXRob2RzIHRoYXQgdXNlIHN0YXRpYyBpbm5lciBjbGFzc2VzIGluIHRoZSBzaWduYXR1cmUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTEiPjMyOTE8L2E+CitFeGNlcHRpb24gYWRkaW5nIC5jbGFzcyBmaWxlIHRvIGZvbGRlciBpbiBwYWNrYWdlIHZpZXcgKDFHRVVGM0kpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTAwIj44OTAwPC9hPgorU2VhcmNoIGNhdXNpbmcgaW50ZXJuYWwgZXJyb3IgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4MTIiPjg4MTI8L2E+CitDaGFuZ2luZyBleHBvcnQgc3RhdGUgbm90IHByb3BhZ2F0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODU2Ij44ODU2PC9hPgorRE9NIEFTVDogcG9zaXRpb25zIGFuZCBiaW5kaW5ncyBtaXNzaW5nIG9uIFF1YWxpZmllZE5hbWUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0NiI+MzQ0NjwvYT4KK3R5cGUgaGllcmFyY2h5OiBpbmNvcnJlY3QgYmVoYXZpb3Igd3J0IHdvcmtpbmcgY29waWVzICgxR0xESE9BKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxMCI+MzIxMDwvYT4KK1NlYXJjaCAtIG1ldGhvZCBkZWNsYXJhdGlvbnMgd2l0aGluIFR5cGVIaWVyYXJjaHkgZ2l2ZXMgbm8gbWF0Y2hlcyAoMUc1NEJNUikgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNDUiPjgxNDU8L2E+CitUeXBlRGVjbGFyYXRpb24gc291cmNlRW5kIGNvbnRhaW5zIHRyYWlsaW5nIGNvbW1lbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgzMiI+ODgzMjwvYT4KK1Nhbml0eSBjaGVjayBlcnJvciAoaW50ZXJuYWwgZXJyb3IpIHdoZW4gdW51c2VkIHZhcmlhYmxlcyBpbnNpZGUgaW5pdGlhbGl6ZXJzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDc4Ij44MDc4PC9hPgorTWlzc2luZyByZXNvdXJjZSBpbiBjb3B5IENVIGRpYWxvZyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc2NCI+ODc2NDwvYT4KK05QRSB3aGlsZSBjbG9zaW5nIHByb2plY3RzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzU5Ij44MzU5PC9hPgorSW5kZXggb3V0IG9mIGRhdGUgd2hlbiByZXBsYWNpbmcgYSBKQVIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3NzMiPjg3NzM8L2E+IAorVmVyaWZ5RXJyb3IgOiBBIC5jbGFzcyBmaWxlIGV4cG9ydGVkIGZyb20gVkFKIGRvZXMgbm90IHJ1biBpbiBKREsgMS4yLjIgKDFHUFBFVDApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY5NyI+ODY5NzwvYT4gCisyIGNvbXBpbGVyIGJ1Z3M6IHRoZSBvcGVyYXRvciB1bmtvd24gb3BlcmF0b3IgaXMgdW5kZWZpbmVkIGFuZCBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzA2Ij44NzA2PC9hPiAKK0NvbXBpbGUgZXJyb3Igd2hlbiBjb21waWxpbmcgYW4gYW5vbnltb3VzIGNsYXNzIHdoaWNoIGV4dGVuZHMgamF2YS5hd3QuRnJhbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzA5Ij44NzA5PC9hPiAKK0Vycm9yIGNvbXBpbGluZyBKREsxLjQgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNDAiPjgzNDA8L2E+CitpbmFjY3VyYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiBkZXBlbmRlbnQgcHJvamVjdCBpcyBjbG9zZWQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDQiPjMzNDQ8L2E+CitKYXZhRWxlbWVudERlbHRhIHJlcG9ydHMgY2hhbmdlZCBjbGFzcyBmaWxlcyAoMUdJVjhJSykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzODQiPjgzODQ8L2E+IAorVW5leHBlY3RlZCBjb21waWxlIGVycm9ycyB3aGVuIGFic3RyYWN0IG1ldGhvZCBtaXNzaW5nIHJldHVybiB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc4OSI+ODc4OTwvYT4gCitDb21waWxlciBpbmNvcnJlY3RseSByZXBvcnRzIHRoYXQgYWJzdHJhY3QgbWV0aG9kIGhhcyBhIGJvZHkgIAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5ODciPjc5ODc8L2E+CitGaWVsZCByZWZlcmVuY2Ugc2VhcmNoIHNob3VsZCBkbyBsb29rdXAgaW4gMS40IG1vZGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NjMiPjg4NjM8L2E+CisuY2xhc3NwYXRoIGdldHMgb3ZlcndyaXR0ZW4gaWYgdGhlcmUncyBhbiBYTUwgZXJyb3IgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxNjIiPjcxNjI8L2E+CitKYXZhIE1vZGVsIEV4Y2VwdGlvbnMgaW4gbG9nIGZyb20gVHlwZUhpZXJhcmNoeUxpZmVDeWNsZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY5OSI+ODY5OTwvYT4gCitDb21waWxlciBlcnJvciBtZXNzYWdlIGluY29tcGxldGU6IFN5bnRheCBlcnJvciBvbiB0b2tlbiAnJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjQiPjMzMjQ8L2E+IAorQmFkIGNvbXBpbGVyIGVycm9yICgxR0hGMjVQKSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQxIj4zNDQxPC9hPiAgCitJbnRlcm5hbCBlcnJvciByZW5hbWluZyBhIGNsYXNzICgxR0wyWENXKSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODQxIj43ODQxPC9hPiAKK092ZXJyaWRlbiBtZXRob2RzIGluc2VydGVkIHBhc3QgdGhlIGVuZCBvZiBzb3VyY2UKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEyOSAtIDI5dGggSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBKYXZhIGNvbXBpbGVyIGlzIEpDSyAxLjQgY29tcGxpYW50LiBXaGVuIHRvZ2dsZWQgaW4gMS40IG1vZGUgKGJhdGNoOiAtMS40IC1zb3VyY2UgMS40KSwgdGhlIEphdmEgY29tcGlsZXIgaXMgZnVsbHkgSkNLIDEuNCBjb21wbGlhbnQgCithcyBvZiBKQ0sgMS40IDIwMDEtMTAtMDEgdXBkYXRlLiBXaGVuIGluIDEuMyBtb2RlIChkZWZhdWx0KSwgaXQgaXMgSkNLIDEuM2EgY29tcGxpYW50LgorPC9saT4KKzxsaT4gQnkgZGVmYXVsdCwgd2hlbiB0b2dnbGVkIGludG8gMS40IG1vZGUsIHRoZSBiYXRjaCBjb21waWxlciB3aWxsIGVuYWJsZSBhc3NlcnRpb24gc3VwcG9ydCAoZS5nLiAtc291cmNlIDEuNCkuIEl0IGNhbiBzdGlsbCBtYW51YWxseQorYmUgdG9nZ2xlZCBmb3IgMS4zIHNvdXJjZSBsZXZlbCBjb21wYXRpYmlsaXR5ICgtc291cmNlIDEuMykuCis8L2xpPgorPGxpPiBBZGRlZCBjb25zdHJ1Y3RvciA8Y29kZT5TZWFyY2hFbmdpbmUoSVdvcmtpbmdDb3B5W10pPC9jb2RlPgorICAgICB3aGljaCB0YWtlcyBhIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZSAKKyAgICAgb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgc3Vic2VxdWVudCBzZWFyY2ggCisgICAgIG9wZXJhdGlvbnMgb24gdGhpcyBzZWFyY2ggZW5naW5lLgorICAgICA8YnI+CisgICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIHNvbWUKKyAgICAgcGFydHMgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBGZWVkYmFjayBpcyB3ZWxjb21lLgorPC9saT4KKzxsaT4gTmV3IGZlYXR1cmUgdG8gYWNoaWV2ZSBwcm9ibGVtcyBjb3JyZWN0aW9ucyA6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvcnJlY3Rpb25FbmdpbmUuCisgICAgIENvcnJlY3Rpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3RvciAob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvcnJlY3Rpb25SZXF1ZXN0b3IpLgorPC9saT4KKzxsaT4gSmF2YUNvcmUgd2lsbCBubyBsb25nZXIgYWRkIGluZGlyZWN0bHkgcHJlcmVxJ2VkIHByb2plY3QgYW1vbmdzdCBwcm9qZWN0IHJlZmVyZW5jZXMuCis8L2xpPgorPGxpPiBOZXcgSkRPTSBBU1QgQVBJIGF2YWlsYWJsZSAoYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9+Y2hlY2tvdXR+L29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tJTIwYXN0L2FzdC5odG1sP3Jldj0xLjEmY29udGVudC10eXBlPXRleHQvaHRtbCI+ZGVzaWduCitub3RlPC9hPikuIFRoaXMgQVBJIGhhcyBub3QgeWV0IHJlYWNoZWQgZnVsbCBzdGFiaWxpdHksIGFuZCBmZWVkYmFjayBpcyB2ZXJ5IHdlbGNvbWUuCis8L2xpPgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NDEiPjg2NDE8L2E+CitDYW4ndCBmaW5kIHJlZmVyZW5jZXMgaW4gaGllcmFyY2h5IGluIGJpbmFyeSBwcm9qZWN0cyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY1OSI+ODY1OTwvYT4gIAorVW5leHBlY3RlZCBjaGFuZ2VzIGluIHByb2plY3QgcmVmZXJlbmNlcyAoLnZjbS1tZXRhKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1OCI+ODM1ODwvYT4KK1NlYXJjaDogZG9lc24ndCBmaW5kIHJlZmVyZW5jZSBhbHRob3VnaCB0aGVyZSBhcmUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3OTkiPjY3OTk8L2E+CitEdXBsaWNhdGUgdHlwZSBjb2xsaXNpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQxNCI+ODQxNDwvYT4KK0luY29ycmVjdCAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5nPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0ODQiPjg0ODQ8L2E+CitJbnRlcm5hbCBlcnJvciBzZWFyY2hpbmcgZm9yIHdyaXRlIGFjY2VzcyB0byBhIHZhcmlhYmxlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTM2Ij44NTM2PC9hPgorQnVnIG9uICJPcGVuIHR5cGUgaGllcmFyY2h5IiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODU3NSI+ODU3NTwvYT4KK1ZhcmlhYmxlIG5hbWUgY29kZSBjb21wbGV0aW9uIHNob3VsZCBoYW5kbGUgYXJyYXlzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMCI+ODUzMDwvYT4KK0ludGVybmFsIGVycm9yIHVzaW5nIGFzc2VydGlvbnMgKDEuNCBmZWF0dXJlKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MzEiPjg1MzE8L2E+CitWZXJpZnlFcnJvciBpbiBjb2RlIGNvbnRhaW5pbmcgYXNzZXJ0aW9ucworCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MDkiPjc1MDk8L2E+CisxR1E2RFVDOiBXU1dCOldJTjIwMDAgLSBDdHJsLXNwYWNlIENvZGUgQ29tcGxldGlvbiBkb2VzIG5vdCB3b3JrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA2MCI+ODA2MDwvYT4KK0hpZXJhcmNoeSBvbmx5IHNob3dzIE9iamVjdCB3aGVuIG9wZW5pbmcgdHlwZSBpbiBiaW5hcnkgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwOCI+MzQwODwvYT4KK0pDSyAxLjQgLSBOQU1FIC0gcXVhbGlmaWVkIEFtYmlndW91c05hbWUgYW5kIGFuIEV4cHJlc3Npb25OYW1lICgxR0s3TTlCKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1ODQiPjg1ODQ8L2E+CitJbnZhbGlkIHN5bnRheCBlcnJvciBnZW5lcmF0ZWQgYnkgY29tcGlsZXIKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTI0IC0gMjR0aCBKYW51YXJ5IDIwMDIgLSBNSUxFU1RPTkUgMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU0Ij4xMTM1NDwvYT4KK1VuYWJsZSB0byBlZGl0IEphdmEgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwMTYiPjgwMTY8L2E+CitnZXR0ZXIvc2V0dGVyIG91dGxpbmVyIHJlY29uY2lsaW5nIGJyb2tlbiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1MiI+ODM1MjwvYT4KK05vIGhpZXJhcmNoeSB3aGVuIHVzaW5nIEhpZXJhY2h5VHlwZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MiI+ODA0MjwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBob3ZlcmluZyBpbiBqYXZhIGVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMTYiPjgyMTY8L2E+CitJbmNvbXBsZXRlIHN1cGVyIHR5cGUgaGllcmFyY2h5IGZvciBiaW5hcmllcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODEyNSI+ODEyNTwvYT4KKydDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSB0eXBlIG5hbWUnIG1lc3NhZ2Ugb3BlbmluZyB0eXBlICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjIxIj43MjIxPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHJlbmFtaW5nIHBhY2thZ2UgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNDEiPjUzNDE8L2E+CitFcnJvciBtZXNzYWdlIHNob3VsZG4ndCBleHBvc2UgZXhjZXB0aW9uIGNsYXNzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDM4Ij44MDM4PC9hPgorTnVsbCBQb2ludGVyIEV4Y2VwdGlvbiBBZGRpbmcgVW5pbXBsZW1lbnRlZCAgCisKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTIzIC0gMjNyZCBKYW51YXJ5IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjIzCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgd29ya2Fyb3VuZCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2NCI+Nzc2NDwvYT4KK1VJIERlYWQgTG9jayAtIElERSBmcm96ZW4gIAorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDAiPjMyMDA8L2E+CitKYXZhQnVpbGRlciAtIEJ1aWxkIHByb2dyZXNzIG1lc3NhZ2UgY291bGQgYmUgc2hvcnRlbmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA4NyI+ODA4NzwvYT4KK05QRSB3aGVuIGhpZXJhcmNoeSB2ZXJib3NlIG9uIGFuZCBoaWVyYXJjaHkgb24gYSByZWdpb24gIAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMjIgLSAyMm5kIEphbnVhcnkgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gVGhlIHNlbGVjdGlvbiBlbmdpbmUgbm93IG9ubHkgc2VsZWN0cyBpZGVudGlmaWVyIGJldHdlZW4gc2VsZWN0aW9uIHN0YXJ0IGFuZCBzZWxlY3Rpb24gZW5kLgorUHJldmlvdXMgYmVoYXZpb3VyIHdhcyB0byBzZWxlY3QgaWRlbnRpZmllciBiZXR3ZWVuIHNlbGVjdGlvbiBzdGFydCBhbmQgaWRlbnRpZmllciBlbmQuCisoZS5nLiBpZiB5b3Ugc2VsZWN0IDxiPkZpbGU8L2I+IGluIDxiPkZpbGU8L2I+SW5wdXQsIG5vdyB0aGUgc2VsZWN0aW9uIGVuZ2luZSBzZWxlY3QgdGhlIGNsYXNzIEZpbGUgYW5kIG5vdCBGaWxlSW5wdXQpCis8bGk+IEZpeCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgzOSI+NjgzOTwvYT4gcmVxdWlyZWQgdG8gaW5jcmVtZW50IHRoZSBpbmRleCBzaWduYXR1cmUgCit2ZXJzaW9uIHNvIGFzIHRvIHRyaWdnZXIgYXV0b21hdGljIHJlaW5kZXhpbmcgb24gd29ya3NwYWNlIHN0YXJ0dXAgKGFuZCB0aHVzIGdldCByaWQgb2YgdW5kZXNpcmVkIGFub255bW91cyB0eXBlIGVudHJpZXMKK2luIHRoZSBpbmRleCBmaWxlcykuIFN1YnNlcXVlbnQgc3RhcnR1cHMgd2lsbCBub3QgcmVpbmRleCBhbnkgZnVydGhlciAob25seSBpZiBpbmNvbnNpc3RlbmN5IGlzIGRldGVjdGVkLCBlLmcuIHNpZ25hdHVyZSB2ZXJzaW9uCitpcyBkaWZmZXJlbnQpLgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5OTMiPjc5OTM8L2E+CitOUEUgd2hlbiBjcmVhdGluZyB0eXBlIGhpZXJhcmNoeSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNyI+MzQxNzwvYT4gCitKQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgbWV0aG9kIGlzIGEgc3RhdGljIChyZXNwZWN0aXZlbHkgaW5zdGFuY2UpIG1ldGhvZC4gKDFHSzdXQ1ApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNiI+MzQxNjwvYT4gCitKQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgbWV0aG9kIGlzIGxlc3MgYWNjZXNzaWJsZSB0aGFuIHRoZSBvbGQgb25lICgxR0s3VlhEKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTUiPjM0MTU8L2E+IAorSkNLIDEuNCAtIEJJTkMgLSB0aGUgbmV3IGZpZWxkIGlzIGEgc3RhdGljIChyZXNwZWN0aXZlbHkgaW5zdGFuY2UpIGZpZWxkICgxR0s3VlNOKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTQiPjM0MTQ8L2E+IAorSkNLIDEuNCAtIEJJTkMgLSB0aGUgbmV3IGZpZWxkIGlzIGxlc3MgYWNjZXNzaWJsZSB0aGFuIHRoZSBvbGQgb25lICgxR0s3Vk1EKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTMiPjM0MTM8L2E+IAorSkNLIDEuNCAtIEJJTkMgLSBkZXRlY3Rpb24gb2YgYW4gSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciAoMUdLN1ZDQSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDEyIj4zNDEyPC9hPiAKK0pDSyAxLjQgLSBCSU5DIC0gSW52b2tlIG92ZXJyaWRpbmcgY2xhc3MgbWV0aG9kcyAoMUdLN1VHUSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDEwIj4zNDEwPC9hPiAKK0pDSyAxLjQgLSBCSU5DIC0gQWRkaW5nIGEgU3RyaW5nIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBTdHJpbmcgZmllbGQgb2YgYSBzdXBlcmNsYXNzICgxR0s3TUhPKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MjAiPjc5MjA8L2E+CitKYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NyI+NzU5NzwvYT4KK1BhY2thZ2VGcmFnbWVudFJvb3Qgd2hpY2ggYXJlIGFyY2hpdmVzIGxvb3NlIGFzc29jaWF0ZWQgcmVzb3VyY2UgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MjciPjc4Mjc8L2E+CitudWxsIHJldHVybmVkIGZyb20gZ2V0T3JpZ2luYWwoSUphdmFFbGVtZW50IHdvcmtpbmdDb3B5RWxlbWVudCkgZm9yIElNUE9SVF9DT05UQUlORVIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxNDQiPjcxNDQ8L2E+CitIaWVyYXJjaHkgaW5jb3JyZWN0IHdoZW4gdXNpbmcgYmluYXJ5IHByb2plY3RzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDExIj4zNDExPC9hPgorSkNLIDEuNCAtIEJJTkMgLSBPdmVycmlkaW5nIGluc3RhbmNlIGFuZCBjbGFzcyBtZXRob2RzICgxR0s3VTZDKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOCI+MzQxODwvYT4KK0pDSyAxLjQgLSBFWFBSIC0gYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gcnVuIHRpbWUgKDFHSzdXSEEpICA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0MSI+NzQ0MTwvYT4KK09wZW4gYSB0eXBlIGlzIGV4dHJlbWVseSBzbG93ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjE2Ij43NjE2PC9hPgorVW5uZWNlc3NhcnkgaW5kZXhpbmcgd2hlbiBwcm9qZWN0IGlzIG9wZW5lZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyOSI+MzIyOTwvYT4KK09wZW5PblNlbGVjdGlvbiAtIHN0cmFuZ2UgYmVoYXZpb3VyIG9mIGNvZGUgcmVzb2x2ZSAoMUdBVkwwOCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTUzIj42OTUzPC9hPgorTm8gY29kZSBhc3Npc3QgcHJvcG9zYWxzIGZvciBpbnRlcmZhY2UgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTgzIj43NTgzPC9hPgorRE9NTm9kZSNnZXRDaGlsZChTdHJpbmcpIG5lZWRzIHRvIGhhbmRsZSBjaGlsZHJlbiB3aXRoIG51bGwgbmFtZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU4NCI+NzU4NDwvYT4KK0NvbW1lbnRzIG9uIElET01NZXRob2QjZ2V0UmV0dXJuVHlwZSgpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDciPjMyNDc8L2E+IAorU2VsZWN0aW9uRW5naW5lIG1vdmVzIHNlbGVjdGlvbiB0byBlbmNsb3NpbmcgdG9rZW4gKDFHQ1NEOEQpCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk1NiI+Nzk1NjwvYT4KK05vIHJlZmVyZW5jZSBmb3VuZCB0byBCbG9ja1Njb3BlLmFuYWx5c2lzSW5kZXggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODMiPjMyODM8L2E+IAorT3Blbk9uU2VsZWN0aW9uIC0gQ29kZSByZXNvbHZlIGRvZXNuJ3Qgd29yayBpbiBzb21lIHNpdHVhdGlvbnMgKDFHRUk1UVQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ1MyI+NTQ1MzwvYT4gCitEQ1I6IENvZGUgQXNzaXN0IGZvciBhbm9ueW1vdXMgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjE3Ij43NjE3PC9hPiAKK05QRSBpbiBCdWlsZGVyIHdpdGggZHVwbGljYXRlZCB0eXBlIG5hbWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ2NiI+NjQ2NjwvYT4gCitDb2RlIEZvcm1hdHRlciAgCisKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDExNSAtIDE1dGggSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBUaGUgY29tcGlsZXIgd2lsbCBub3cgZm9sbG93IEpMUyA4LjYgd2l0aCByZXNwZWN0IHRvIGFub255bW91cyBjbGFzcyAKK2NvbnN0cnVjdG9ycyAoaS5lLiBhbGxvdyB0aGVtIHRvIHRocm93IGFueSBleGNlcHRpb25zKS4KKzxsaT4gVGhlIGNvbXBpbGVyIG5vdyBlbmZvcmNlcyB0aGF0IGludGVyZmFjZSBtZXRob2RzIGJlIGNvbXBhdGlibGUgd2l0aCBPYmplY3Qgb25lcy4KKzxsaT4gVGhlIGJhdGNoIGNvbXBpbGVyIHdpbGwgbm8gbG9uZ2VyIGNyZWF0ZSBwYWNrYWdlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW55bW9yZSB3aGVuIHRoZSBjb21tYW5kIGxpbmUKK2FyZ3VtZW50ICctZCcgPHR0PjxkZXN0aW5hdGlvbj48L3R0PiBpcyBvbWl0dGVkIChjb21wbGlhbnQgd2l0aCBzdGFuZGFyZCBiYXRjaCBjb21waWxlcnMpLgorPGxpPiBBIHR5cGUgaGllcmFyY2h5IHRoYXQgbWlzc2VzIGEgc3VwZXIgdHlwZSBpcyBub3Qgcm9vdGVkIGF0IE9iamVjdCBhbnkgbG9uZ2VyLAorICAgICBidXQgdGhlIHN1YnR5cGUgKG9mIHRoZSBtaXNzaW5nIHR5cGUpIHdpbGwgYmUgYSByb290ICh0aGlzIGlzIHRoZSBiZWhhdmlvciBvZgorICAgICBWQS9KYXZhIGFuZCBWQU1FLikKKzxsaT4gQWRkaW5nIGEgdHlwZSB0aGF0IHdhcyBtaXNzaW5nIGZyb20gYSBoaWVyYXJjaHkgd2lsbCB1cGRhdGUgdGhlIGhpZXJhcmNoeSBjb3JyZWN0bHkuCis8bGk+IE5ldyBBUEkgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IgZm9yIHN1Z2dlc3QgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb246PC9saT4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPHR0PnZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZSg8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gc3VwZXJUeXBlTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBjb21wbGV0aW9uTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IG1vZGlmaWVycyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOzwvdHQ+Cis8YnI+Jm5ic3A7Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNSI+NzYyNTwvYT4KK05vIHR5cGVoaWVyYXJjaHkgaW4gd29ya2luZyBjb3B5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTk1Ij43NTk1PC9hPgorTmV3IGJ1aWxkZXIgcGVyZm9ybXMgaW50ZW1wZXN0aXZlIGZ1bGwgYnVpbGQgb24gbWV0aG9kIGJvZHkgY2hhbmdlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MjgiPjc1Mjg8L2E+CitJbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBwYXRoIGNhbm9uaWNhbGlzYXRpb24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMzQiPjcwMzQ8L2E+Citjb2RlIGFzc2lzdCBwZXJmb3JtYW5jZSBwcm9ibGVtIGluIHNjcmFwYm9vaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMTkiPjcxMTk8L2E+CitDb250ZW50IEFzc2lzdCBkb2VzIG5vdCBjb21wbGV0ZSBzb21lIGNvZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDAwIj43MDAwPC9hPgorU3dpdGNoIGFuZCBUcnkgc3RhdGVtZW50IGRvZXNuJ3QgaW5jbHVkZSB0cmFpbGluZyB9IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MzIiPjY5MzI8L2E+CitJbmNyZW1lbnQgc3RhdGVtZW50IGluIGZvciBsb29wIGNvbnRhaW5zIHRyYWlsaW5nIGNvbW1lbnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNDIiPjYzNDI8L2E+CitDb2RlIGFzc2lzdCBvbiBJbnRyZWZhY2UtJ0NvbnN0cnVjdG9ycycgaW5jb21wbGV0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNDQiPjczNDQ8L2E+CitTZWFyY2ggLSB3cml0ZSBhY2NlcyBnaXZlIHdyb25nIHJlc3VsdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NSI+NzQ1NTwvYT4gIAorQnVpbGQgcHJvYmxlbXMgd2hlbiBpbnN0YW5jZSB2YXJpYWJsZSBuYW1lIG1hdGNoZXMgY29uc3RydWN0b3IgcGFyYW1ldGVyIG5hbWUgYW5kIGFzc2lnbm1lbnQgdG8gdGhpcy5uYW1lIGluIHRyeSBibG9jayAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgzOSI+NjgzOTwvYT4KK0FsbFR5cGVzU2VhcmNoRW5naW5lIHJldHVybnMgYW5vbnltb3VzIGNsYXNzZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NSI+NzQ0NTwvYT4KK2NoYXIvc3RyaW5nIGNvbmNhdCBidWcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTIiPjMxOTI8L2E+CitJbnZhbGlkIHR5cGUgaGllcmFyY2h5IHdoZW4gbWlzc2luZyB0eXBlKHMpIGluIGhpZXJhcmNoeSAoMUdGNVJONCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDQiPjMzMDQ8L2E+CitIaWVyYXJjaHkgbm90IHVwZGF0ZWQgd2hlbiBjaGFuZ2luZyBjbGFzc3BhdGggKDFHRjVRU1cpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDIyIj43NDIyPC9hPgorTWlzc2luZyBwcm9qZWN0IHJlZmVyZW5jZXMgb24gc29tZSBpbXBvcnRlZCBKYXZhIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA2NyI+NTA2NzwvYT4KK0NvZGVBc3Npc3QgLSBubyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb24gZm9yIGJhc2UgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjMiPjczNjM8L2E+CitSZWJ1aWxkIFByb2plY3QgYWN0aW9uIGlzIG5vdCBjb21waWxpbmcgYWxsIEphdmEgc291cmNlIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMyNSI+NzMyNTwvYT4KK0J1aWxkIGNvbGxpc2lvbnMgc2hvdWxkIGJlIG5vbi1mYXRhbD8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzI0Ij43MzI0PC9hPgorQW1iaWd1b3VzIG11bHRpcGxlIHByb2JsZW0gZGVzY3JpcHRpb25zIHdoZW4gY29sbGlzaW9uIG9mIGJ1aWxkIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NSI+MzM4NTwvYT4KK0pDSyAxLjQgLSBJTlRGIC0gaWxsZWdhbCBtZXRob2QgZGVjbGFyYXRpb24gZm9yIGludGVyZmFjZSAoMUdLMkFXUykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE4Ij4zMzE4PC9hPgorSkRPTSAtIElEb21Ob2RlIHJlZGVmaW5lcyBjbG9uZSgpIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZSAoMUdGVlUyVikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTAxIj42MTAxPC9hPgorVW5leHBlY3RlZCBlcnJvciBpbiBpbm5lciBjbGFzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzMzIj43MzMzPC9hPgordHlwbyBpbiB0eXBlIG5hbWU6IFJlc2V0U2F0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzU0Ij43MzU0PC9hPgorQ29tcGF0aWJpbGl0eSB3aXRoIGphdmFjIHdoZW4gbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ3MyI+NjQ3MzwvYT4KK0phdmFDb252ZW50aW9ucyBzaG91bGQgdXNlIElXb3Jrc3BhY2UgdmFsaWRhdGUgbWV0aG9kcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyOSI+NzEyOTwvYT4KK1Byb2JsZW1zIHdpdGggcmVwbGFjaW5nIGEgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODYiPjMzODY8L2E+CitKQ0sgMS40IC0gRVhDUCAtIGNoZWNrZWQgZXhjZXB0aW9uIGluIHZhcmlhYmxlIGluaXRpYWxpemVyIG9mIGFub255bW91cyBjbGFzcyAoMUdLN0I1TCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY3Ij4zMzY3PC9hPgorSkNLIDEuNCAtIElDTFMgLSBBbiBpbnN0YW5jZSBpbml0aWFsaXplciBpbiBhbiBhbm9ueW1vdXMgY2xhc3MgbWF5IHRocm93IGFueSBleGNlcHRpb24gKDFHSzdMWUYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE4NCI+NzE4NDwvYT4KK0J1aWx0IGluIGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IGFub255bW91cyBjbGFzcyBpbml0aWFsaXplcnMgdG8gdGhyb3cgZXhjZXB0aW9ucyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTA0Ij42NTA0PC9hPgorVHlwZSBoaWVyYXJjaHk6IFN1YnR5cGVzIGluIGphciBvZiBhbm90aGVyIHByb2plY3Qgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM0Ij4zMzM0PC9hPgorVHlwZXMgaGllcmFyY2h5IHZpZXcgZG9lcyBub3Qgc2hvdyBhbGwgc3ViY2xhc3Nlcy4gKDFHSTkwMVEpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODY2Ij42ODY2PC9hPiAgCitDb2RlLUFzc2lzdCAoY3RybCtzcGFjZSkgdG8gc2xvdyB3aXRoIGpyZS1zcmMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDcxIj43MDcxPC9hPiAgCitBcnJheVN0b3JlRXhjZXB0aW9uIGdldHRpbmcgaG92ZXJoZWxwIGluIEphdmEgZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE2NSI+NzE2NTwvYT4gIAorZXJyb25lb3VzIHdhcm5pbmcgb2YgdW51c2VkIHZhcmlhYmxlcyAgCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNyI+MzIxNzwvYT4KK0pNIC0gZGVsZXRpbmcgZGVmYXVsdCBwYWNrYWdlICgxRzg0MTdaKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NSI+NzM3NTwvYT4KK25ldyBjbGFzc2VzIHdpdGggZnVubnkgbmFtZXMgZG9uJ3QgYXBwZWFyIGluIHBhY2thZ2UgdmlldyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMiI+NzMwMjwvYT4KK05lZWQgdmlzaWJpbGl0eSBpbiBzZWFyY2ggcmVzdWx0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzA1Ij43MzA1PC9hPgoraW50ZXJmYWNlIG1ldGhvZHMgYXJlIG1hcmtlZCBhYnN0cmFjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyOTAiPjcyOTA8L2E+CitQcm9qZWN0IHNpemUgbGltaXRhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMzIiPjYyMzI8L2E+CitCdWlsZCBwcm9ibGVtczogSW50ZXJuYWwgZXJyb3I6IG51bGwgd2hlbiBjb21waWxpbmcgSkRLIHNvdXJjZSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MCI+NzM4MDwvYT4KK1dyb25nIHNjb3BlIGZvciB0cmF2ZXJzZSBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEzNyI+NzEzNzwvYT4KK0ludmFsaWQgdHlwZSBub3QgZmxhZ2dlZCBieSBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MjQiPjY5MjQ8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBidWlsZCBwYXRoLgorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMDggLSA4dGggSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMGEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4KK0FkZGVkIG5ldyBjb21waWxlciBvcHRpb24gdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbGV2ZWwgKGNhbiBiZSBlaXRoZXIKKyIxLjMiIG9yICIxLjQiIC0gMS4zIGJlaW5nIHRoZSBkZWZhdWx0KSwgYW5kIGl0IHdpbGwgYWZmZWN0IHRoZSBiZWhhdmlvcgorb2YgdGhlIGNvbXBpbGVyIHdpdGggcmVzcGVjdCB0byBKTFMgOC4xLjUgKGluaGVyaXRlZCBtZW1iZXIgc2hhZG93cyBlbmNsb3NpbmcKK29uZSkuIE9wdGlvbiBpcyBsb2NhdGVkIG9uIDx0dD5KYXZhQ29yZSNnZXRPcHRpb25zKCk8L3R0PiBhbmQgbmFtZWQgPHR0PiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIjwvdHQ+CitBY2NvcmRpbmdseSwgdGhlIGJhdGNoIGNvbXBpbGVyIGFjY2VwdHMgYW4gZXh0cmEgY29tbWFuZCBsaW5lIGFyZ3VtZW50CisiLTEuMyIgb3IgIi0xLjQiICgxLjMgY29tcGxpYW5jZSBiZWluZyB0aGUgZGVmYXVsdCkuPC9saT4KKzwvdWw+Cis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzMCI+MzMzMDwvYT4gIAorSkNLIDEuNCAtIGlsbGVnYWwgc2ltcGxlIG5hbWUgaW1wb3J0cyAoMUdIVzBHMSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzAiPjcwNzA8L2E+Cittb3ZlZCBjbGFzc2VzIGxvc3QhICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Nzg1Ij42Nzg1PC9hPgorTlBFIGluIElUeXBlLnJlc29sdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Nzc5Ij42Nzc5PC9hPgorc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZWQgLSBtaXNzaW5nIGV4Y2VwdGlvbiB0eXBlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNSI+NzAzNTwvYT4gCitOZXcgYnVpbGRlciAtIGJ1aWxkZXIgZG9lcyBub3QgY2xvc2UgYWxsIEpBUnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDMzIj43MDMzPC9hPgorU3RhbGUgcGFja2FnZXMgdmlldyBhZnRlciBtb3ZpbmcgY29tcGlsYXRpb24gdW5pdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MjciPjY5Mjc8L2E+CitTdGF0aWMgaW5uZXIgY2xhc3Mgd29uJ3QgY29tcGlsZSAoZG9lc24ndCBtYXRjaCBKREsgYmVoYXZpb3IpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMCI+NzAzMDwvYT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiByZW5hbWluZyBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI5Ij43MDI5PC9hPgorUmVuYW1pbmcgYSBKYXZhIHByb2plY3QgZG9lc24ndCByZWZyZXNoIHRoZSBwYWNrYWdlcyB2aWV3ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI3Ij43MDI3PC9hPgorcHJvamVjdCBnb25lIGFmdGVyIHJlbmFtaW5nIGluIHRoZSBuYXZpZ2F0b3IgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMjYiPjcwMjY8L2E+Cit3YWxrYmFjayBvbiByZW5hbWUgcHJvamVjdCAtIGNvdWxkIG5vdCByZXByb2R1Y2UgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4ODkiPjY4ODk8L2E+CitObyB0eXBlaGllcmFyY2h5IGZvciBpbm5lciB0eXBlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MyI+MzM0MzwvYT4KK01pc3NpbmcgamF2YS5sYW5nLk9iamVjdCBzaG91bGQgcHJvZHVjZSBhIG1vcmUgcHJvbWluZW50IGNvbXBpbGVyIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk0OCI+Njk0ODwvYT4KK05ldyBidWlsZGVyIC0gYnVpbGRlciBkb2VzIG5vdCByZXVzZSBvcGVuZWQgSkFScworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTQiPjMzMTQ8L2E+CitSZXNvdXJjZXMgbm90IGFwcGVhcmluZyBpbiBKYXZhIHBlcnNwZWN0aXZlIG9yIEphciBleHBvcnQgd2l6YXJkICgxR0ZMMFFUKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MCI+Njg5MDwvYT4KK01FVEEtSU5GIGhpZGRlbiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk5MyI+Njk5MzwvYT4KK0phdmFNb2RlbCBpbmNvbnNpc3RlbmNpZXMgd2l0aCB1bml0cyBvdXRzaWRlIGNsYXNzcGF0aCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MCI+MzM2MDwvYT4gCitDb2RlIGFzc2lzdCBkb2VzIG5vdCB3b3JrIGluIGlubmVyIGNsYXNzZXMgKDFHSk9WVDYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MyI+Njg5MzwvYT4gCitMb2NhbFR5cGVEZWNsYXJhdGlvbiBpbmNsdWRlcyBwcmVjZWVkaW5nIGNvbW1lbnQgZXZlbiBpZiB0aGVyZSBhcmUgc3RhdGVtZW50cyBpbiBiZXR3ZWVuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MiI+MzM3MjwvYT4gCitNYXJrZXJzIGZvciBidWlsZCBwYXRoIG5vdCB1cGRhdGVkIG9uIChyZS0pIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQxMyI+NTQxMzwvYT4gCitpbmNvcnJlY3QgY2xhc3Mgc291cmNlIHJhbmdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQyOSI+NjQyOTwvYT4KK2RlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBpbmNvcnJlY3Qgb24gbG9jYWwgdmFyaWFibGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDMzIj42NDMzPC9hPgorZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGluY29ycmVjdCBvbiBsb2NhbCB2YXJpYWJsZSAjMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNSI+MzIzNTwvYT4KK1BhY2thZ2VGcmFnbWVudFJvb3QgZXhpc3RlbmN5IGNoZWNrIG5lZWQgdG8gYmUgcmV2aXNpdGVkICgxR0NVTk83KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NSI+Njg2NTwvYT4KK29wZW4gb24gc2VsZWN0aW9uIGluIEJ1aWxkTm90aWZpZXIgb25seSBmaW5kcyBjb250ZW50cyBvZiBydC5qYXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjAzNyI+NjAzNzwvYT4KK0phclBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgYWx3YXlzIHJldHVybnMgbnVsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc1MCI+Njc1MDwvYT4KK0JhdGNoIGNvbXBpbGVyIC0gQ2xhc3NwYXRoIGhhbmRsaW5nIGlzIHRvbyBzdHJpY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwOSI+MzQwOTwvYT4KK0pDSyAxLjQgLSBTVE1UIC0gbnVsbCBsaXRlcmFsIGluIHRocm93IHN0YXRlbWVudCAoMUdLN01FUSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MTUiPjQ5MTU8L2E+CitKQ0sgMS40IC0gbmVlZCBhIG1ham9yIGNvbXBpbGVyIHN3aXRjaCBmb3IgMS4zIC8gMS40IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NzgiPjY2Nzg8L2E+CitJbmNvcnJlY3Qgb3V0cHV0IGFmdGVyIEFkZCBVbmltcGxlbWVudGVkIE1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MSI+MzM2MTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHB1YmxpYyBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdMQUEpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MCI+MzM1MDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RFZKKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUxIj4zMzUxPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RFpWKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUyIj4zMzUyPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RUI5KSAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjIiPjMzNjI8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdMQ1gpICAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzYzIj4zMzYzPC9hPgorSkNLIDEuNCAtIElDTFMgLSBBbiBpbmhlcml0ZWQgdmFyaWFibGUgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xIUikgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NCI+MzM2NDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIG1ldGhvZCB0aGF0IHNoYWRvd3MgYSBuYW1lIGZyb20gYW4gZW5jbG9zaW5nIG5vbi1wYWNrYWdlIHNjb3BlICgxR0s3TEtWKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY1Ij4zMzY1PC9hPgorSkNLIDEuNCAtIElDTFMgLSBBbiBpbmhlcml0ZWQgY2xhc3MgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xUQSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NiI+MzM2NjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIGludGVyZmFjZSB0aGF0IHNoYWRvd3MgYSBuYW1lIGZyb20gYW4gZW5jbG9zaW5nIG5vbi1wYWNrYWdlIHNjb3BlICgxR0s3TFcyKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NSI+MzM3NTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RkxDKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NiI+MzM3NjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3Rk9UKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NyI+MzM3NzwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGVEEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc4Ij4zMzc4PC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdGWDcpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc5Ij4zMzc5PC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdHMkEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgwIj4zMzgwPC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0c1QSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODEiPjMzODE8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHByb3RlY3RlZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RzhFKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MiI+MzM4MjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdHQzEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgzIj4zMzgzPC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3R1FBKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NCI+MzM4NDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MuICgxR0s3Q1RWKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NyI+MzM4NzwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwdWJsaWMgZmllbGQgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0gwQikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODgiPjMzODg8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3QkdQKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4OSI+MzM4OTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0QyUCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTAiPjMzOTA8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdEN1EpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5MSI+MzM5MTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0RCRCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTIiPjMzOTI8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VSRSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTMiPjMzOTM8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VWQikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQiPjMzOTQ8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VaQikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTUiPjMzOTU8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RjRTKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5NiI+MzM5NjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0Y4TCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTciPjMzOTc8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGQ04pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk4Ij4zMzk4PC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGSEIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk5Ij4zMzk5PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIMlopCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAwIj4zNDAwPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHByb3RlY3RlZCBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3R1c2KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMSI+MzQwMTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIRUYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAyIj4zNDAyPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHByb3RlY3RlZCBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdISDEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAzIj4zNDAzPC9hPgorSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHJvdGVjdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdINVgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA0Ij4zNDA0PC9hPgorSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHVibGljIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIQkopCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA1Ij4zNDA1PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHB1YmxpYyBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdIS0UpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA2Ij4zNDA2PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIG5lc3RlZCBjbGFzcyAoMUdLN0hNTikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDciPjM0MDc8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwcm90ZWN0ZWQgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3TDc5KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MSI+NjA2MTwvYT4KK3VucmVhY2hhYmxlIGNvZGUvdW51c2VkIHRlbXAgPyAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NDMiPjY0NDM8L2E+CitJbmNyZW1lbnRhbCBqYXZhIGJ1aWxkZXIgZG9lc24ndCBoYW5kbGUgZm9sZGVyIGNyZWF0ZS9kZWxldGUgbmljZWx5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzE3Ij41MzE3PC9hPgorUmVwYXJlbnRpbmcgY2xhc3Mgc2hvdWxkIHJlZnJlc2ggaGllcmFyY2h5ICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NDAiPjY3NDA8L2E+CitQcm9ibGVtcyB3aXRoIGRlbGV0aW5nIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0OTEiPjY0OTE8L2E+CitOb24tamF2YSByZXNvdXJjZSBmb2xkZXIgZG9lc24ndCBhcHBlYXIgdW5kZXIgcGtnIGZyYWdtZW50IHJvb3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0NSI+MzI0NTwvYT4KK3N1YiBmb2xkZXJzIHdpdGggZG90IG5vdCB2aXNpYmxlIGluIHBhY2thZ2VzIHZpZXcgKDFHQ09IMTcpICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4MDYiPjY4MDY8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBtb3ZpbmcgZW5wdHkgY3Ugb3V0IG9mIGRlZmF1bHQgcGFja2FnZSAgCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDY1Ij43MDY1PC9hPgorTlBFIHdoZW4gc2F2aW5nIGEgSmF2YSBzb3VyY2UKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTYiPjY5NTY8L2E+CitpbmNvcnJlY3QgY29tcGlsZXIgZXJyb3IgcmVwb3J0ZWQgb24gZXh0cmFjdCBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzIiPjcwNzI8L2E+CitQcm90ZWN0ZWQgbWVtYmVyIGluIHN1cGVyY2xhc3Mgbm90IHZpc2libGUgaW4gc3ViY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNjYiPjcwNjY8L2E+CitTdWJjbGFzcyBjYW4ndCBzZWUgcHJvdGVjdGVkIGlubmVyIGNsYXNzIG9mIHN1cGVyY2xhc3MgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4NCI+MzI4NDwvYT4KK1Byb2plY3QgZG9lc24ndCBhbHdheXMgcmVidWlsZCBhZnRlciBjaGFuZ2luZyB0aGUgSmF2YSBidWlsZCBwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU3Ij42OTU3PC9hPgorQ0NFIGluIEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOjp0cmF2ZXJzZSAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTgiPjY5NTg8L2E+CitOUEUgaW4gRGVsdGFQcm9jZXNzb3IgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMCI+NjkwMDwvYT4KK1JlYnVpbGQgcHJvamVjdCBmYWlscyB3aXRoIGVycm9yICIxMDAwIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4MiI+NDM4MjwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIEphdmFCdWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk5Ij4zMTk5PC9hPgorTWlzc2luZyBjbGFzc3BhdGggdmFyaWFibGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODQ4Ij42ODQ4PC9hPgorSW5kZXggb3V0IG9mIHJhbmdlIGV4Y2VwdGlvbiB3aXRoIE5ldyBidWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTEzIj40OTEzPC9hPgorbnVsbCBhcmd1bWVudCBpbiBJbmNyZW1lbnRhbEltYWdlQnVpbGRlci5nZXRCdWlsZGVyVHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MCI+Njc2MDwvYT4KK3BhY2thZ2UgbmFtZXMgdHJ1bmNhdGVkIGluIGNvbXBpbGF0aW9uIGRpYWxvZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NSI+MzI5NTwvYT4KK0Vycm9ycyBmcm9tIG1pc3NpbmcgcmVmZXJlbmNlIHRvIGEgamFyIGRvIG5vdCBnbyBhd2F5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUwIj4zNDUwPC9hPgorQnVnIGluIEphdmFTZWFyY2hTY29wZSAoMUdMRTFHQykKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjE4IC0gMTh0aCBEZWNlbWJlciAyMDAxIC0gTUlMRVNUT05FIDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjE5YQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMTciPjYxMTc8L2E+CitDb2RlRm9ybWF0dGVyIC0gaW1wb3NzaWJsZSB0byBzZXQgaW5kZW50YXRpb24gbGV2ZWwgYW5kIHBvc2l0aW9uIG1hcHBpbmcgdy9vIGRlcHJlY2F0ZWQgbWV0aG9kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjcxOSI+NjcxOTwvYT4KK0xvY2FsVHlwZURlY2xhcmF0aW9uOjp0cmF2ZXJzZQorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQzMiI+NTQzMjwvYT4KK2NvbXBpbGVyIHN5bnRheCBlcnJvciBpcyBpbmNvcnJlY3QKKworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjExIC0gMTF0aCBEZWNlbWJlciAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxOAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8dWw+Cis8bGk+IEphdmEgZWxlbWVudCBkZWx0YXMgYXJlIGJhdGNoZWQuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBtb2RpZmllcworCSBhIHJlc291cmNlLCB0aGVuIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGFzIGFyZSBtZXJnZWQgYW5kIGZpcmVkIGR1cmluZyAKKwkgdGhlIHJlc291cmNlIGRlbHRhIHByb2Nlc3NpbmcuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBkb2Vzbid0IAorCSBtb2RpZnkgYW55IHJlc291cmNlIChlLmcuIElXb3JraW5nQ29weS5yZWNvbmNpbGUoKSksIHRoZW4gdGhlIGphdmEKKwkgZWxlbWVudCBkZWx0YSBpcyBmaXJlZCByaWdodCBhd2F5LgorPC91bD4KKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNSI+MzIxNTwvYT4KK0pNIC0gQ3JlYXRpbmcgYSBuZXcgY2xhc3Mgc2VuZHMgb3V0IG1hbnkgbm90aWZpY2F0aW9ucyAoMUdEMkdUMCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5NSI+NjY5NTwvYT4KK0NoYW5naW5nIEphdmEgcHJlZmVyZW5jZSBpbiBidWlsZCAyMDAxMTIwNiB0aHJvd3MgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWx0YVByb2Nlc3Nvci5pbml0aWFsaXplUm9vdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MSI+Njc2MTwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZyByZXBsYWNlICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTAiPjMyOTA8L2E+CitKYXZhQnVpbGRlciAtIE9sZCBjbGFzcyBmaWxlcyByZW1haW4gYWZ0ZXIgY2hhbmdlIG9mIG91dHB1dCBsb2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4OCI+MzE4ODwvYT4KK0phdmFCdWlsZGVyIC0gRGVsZXRpbmcgc291cmNlIGRvZXNuJ3QgZGVsZXRlIGJpbmFyeSBmb2xkZXJzICgxRlZQVFRLKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg1Ij4zMTg1PC9hPgorSmF2YUJ1aWxkZXIgLSBFcnJvcnMgZG9uJ3QgZGlzYXBwZWFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg5Ij4zMTg5PC9hPgorSmF2YUJ1aWxkZXIgLSBNaXNzaW5nIGxpYnJhcmllcyByZXN1bHRzIGluIGluc3VmZmljaWVudCBkZXBlbmRlbmN5IGluZm8KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDQiPjMyMDQ8L2E+CitJbWFnZUJ1aWxkZXIgc2hvdWxkIHNob3cgZXJyb3IgY291bnQgaW4gdGhlIHByb2dyZXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI3Ij4zMjI3PC9hPgorSkNMIGRldiAtIEJ1aWxkZXIgZGlkIG5vdCByZWZyZXNoIHByb2JsZW1zIGluIGV4Y2VwdGlvbiBoaWVyYXJjaHkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjgiPjMyMjg8L2E+CitEaXNjYXJkaW5nIHJ0LmphciBmcm9tIGJ1aWxkIHBhdGggdHJpZ2dlcnMgdG9vIG1hbnkgcmVjb21waWxhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMiI+MzIzMjwvYT4KK0luY3JlbWVudGFsIGJ1aWxkZXIgdW5hYmxlIHRvIGhhbmRsZSBlZmZpY2llbnRseSBtaXNzaW5nIHJ0LmphciBzY2VuYXJpbworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNCI+MzIzNDwvYT4KK0luY3JlbWVudGFsIGJ1aWxkZXIgZG9lcyBub3Qgbm90aWNlIGFkZGl0aW9uIG9mIGphdmEubGFuZy5PYmplY3QgaW5zaWRlIHNhbWUgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MSI+MzI0MTwvYT4KK0J1aWxkIGRvZXNuJ3QgaG9ub3IgY2FuY2VsCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYwIj4zMjYwPC9hPgorTlBFIHdoZW4gZG9pbmcgaW5jcmVtZW50YWwgcHJvamVjdCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3OCI+MzI3ODwvYT4KK0phdmFCdWlsZGVyIC0gUHJvYmxlbSBDb3VudCByYXJlbHkgdXBkYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4NyI+MzI4NzwvYT4KK0J1aWx0IHN0YXRlIGRvZXMgbm90IHJlbWVtYmVyIG9sZCBwa2cgZnJhZ21lbnQgcm9vdHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDEiPjMzMDE8L2E+CitJbmNyZW1lbnRhbCBidWlsZCBkb2Vzbid0IGRldGVjdCBkaXNhcHBlYXJhbmNlIG9mIGZpZWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA1Ij4zMzA1PC9hPgorSW5jcmVtZW50YWwgYnVpbGQgZG9lc24ndCBkZXRlY3QgYWJzdHJhY3QgbWV0aG9kIHRvIGltcGxlbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTEiPjMzMTE8L2E+CitwZXJmb3JtYW5jZTogdGFzayBsaXN0IHN0aWxsIGRvZXMgbm90IHNjYWxlIGF0IGFsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMiI+MzMxMjwvYT4KK0ludGVybmFsIGVycm9ycyBpbiBpbWFnZSBidWlsZGVyIGR1ZSB0byBkdXBsaWNhdGUgcGFja2FnZSBmcmFnbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxNyI+MzMxNzwvYT4KK0Z1bGxidWlsZCBhZnRlciBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIyIj4zMzIyPC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gZHVyaW5nIGJ1aWxkIGluIFN0YXRlSW1wbC5nZXRTb3VyY2VFbGVtZW50RW50cmllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNiI+MzMyNjwvYT4KK0luY3JlbWVudGFsIGJ1aWxkIGRvZXNuJ3Qgd29yayBpZiBiaW4gZGVsZXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MCI+MzM3MDwvYT4KK0luY3JlbWVudGFsIGNvbXBpbGVyIGlzIGNvbXBpbGluZyBwcm9qZWN0IHdoZW4gaXQgc2hvdWxkIG5vdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQyMiI+MzQyMjwvYT4KK05QRSBpbiBKYXZhIGJ1aWxkZXIgZHVyaW5nIGNhdGNodXAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjkiPjM0Mjk8L2E+CitJbmNyZW1lbnRhbCBjb21waWxhdGlvbiBidWcgb24gbmFtZXNwYWNlIGNoYW5nZSBpbiBwcml2YXRlIGxvY2FsIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ0Ij4zNDQ0PC9hPgorQnVpbGQgcHJvYmxlbXM6IE1hcmtlciBzZXQgb24gRm9sZGVyPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTAwNyI+NTAwNzwvYT4KK1Byb2plY3QgY2xhc3NwYXRoIHJlZmVyZW5jZXMgZG8gbm90IGZvbGxvdyBjbGFzcyBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTA5Ij41MTA5PC9hPgorQWRkaW5nIHByb2plY3QgZG9lc24ndCBmaXggYnVpbGQgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzIwIj41MzIwPC9hPgorTlBFIGR1cmluZyBjYXRjaHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjQxIj41NjQxPC9hPgorTlBFIG9uIHJlYnVpbGQgd2hlbiByZXBsYWNpbmcgaW50ZXJuYWwgamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTM4Ij42NTM4PC9hPgorc2VhcmNoRGVjbGFyYXRpb25zT2YqIGluY29ycmVjdCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2OTAiPjY2OTA8L2E+CitDb2RlQXNzaXN0IGZpbmRzIHR5cGVzIG91dHNpZGUgdGhlIGNsYXNzcGF0aCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2ODciPjY2ODc8L2E+CitXcm9uZyBKYXZhTW9kZWwgcmVmcmVzaCBhZnRlciBkcmFnIGFuZCBkcm9wIG91dHNpZGUgZm9sZGVyIHdpdGggZG90IGluIG5hbWUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5MyI+NjY5MzwvYT4KK0Fic3RyYWN0SW1hZ2VCdWlsZGVyLmNvbXBpbGUgdGhyb3dzIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBsaW5lIDE2NiBpbiBidWlsZCAyMDAxMTIwNgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MCI+NjY3MDwvYT4KK0NvZGUgQXNzaXN0OiBDYW5ub3QgcmVzb2x2ZSBpbiBtZXRob2QgYm9keQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NCI+NjY3NDwvYT4KK0Nhbm5vdCBhZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjI5Ij42NjI5PC9hPgorT3BlbiBPbiBTZWxlY3Rpb24gZG9lcyBub3Qgd29yayBvbiBMaW51eAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MiI+NTU0MjwvYT4KK1RvbyBtYW55IGRlbHRhcyBhcmUgZmlyZWQgb24gZWFjaCBKYXZhTW9kZWwgb3BlcmF0aW9uICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjkiPjMyNjk8L2E+IAorVXBkYXRpbmcgdGhlIEphdmEgcGFja2FnZXMgdmlldyBvbiBwcm9qZWN0IGNyZWF0aW9uICgxR0RXMFU5KSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjAyIj4zMjAyPC9hPgorRENSIC0gSk0gLSBNZXJnZSBKYXZhIEVsZW1lbnQgRGVsdGFzIHdpdGggUmVzb3VyY2UgRGVsdGFzICgxRzJCNjBaKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjIxIj42NjIxPC9hPgorTlBFIGluIERlbHRhIFByb2Nlc3NvciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4Ij4zMzY4PC9hPgorSkNLIDEuNCAtIElOVEYgLSBUaGUgZmllbGQgb2YgcHJvdGVjdGVkIGludGVyZmFjZSBpcyB1c2VkIGluIG90aGVyIHBhY2thZ2UgKDFHSzdNMjUpICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1OTYiPjY1OTY8L2E+CitKYXZhIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBpbnZhbGlkIGJ5dGVjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg2Ij42NTg2PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiByZXNvdXJjZSBtb2RpZmljYXRpb24gZG9uZSBiZWZvcmUgamF2YSBtb2RlbCBpcyBvcGVuCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTQyIj42NTQyPC9hPgorZXh0cmFjdCBtZXRob2Q6IGluY29ycmVjdCBlcnJvciBtZXNzYWdlICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NDUiPjY2NDU8L2E+CitCdWlsZC9SZWJ1aWxkIGRvZXMgbm90IHJlY29tcGlsZSBjb2RlICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NjkiPjY2Njk8L2E+CitTZWFyY2ggZG9lc24ndCBmaW5kIHJlZmVyZW5jZSB0byBhIGZpZWxkIHRoYXQgaXMgb25seSB1c2VkIGluIGFuIGluaXRpYWxpemF0aW9uICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzODUiPjUzODU8L2E+CitzZWFyY2g6IG5hbWUgc2VhcmNoRGVjbGFyYXRpb25zT2ZTZW50TWVzc2FnZXMgaXMgbm90IGdvb2QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MyI+MzE4MzwvYT4KK0pNIC0gQnVpbGRlcnMgYW5kIG5lc3RlZCBvcGVyYXRpb25zIHVzaW5nIEphdmEgbW9kZWwgY2FuIGdldCBpbmNvbnNpc3RlbnQgcmVzdWx0cyAoMUZVQlY5MCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MCI+MzI1MDwvYT4KK0phdmFQcm9qZWN0LnJldHJpZXZlUmVzb3VyY2UgcGlja3MgZmlyc3QgcmVtb3ZlZCBjaGlsZCBkZWx0YSAoMUdDVjdQUSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM3OCI+NjM3ODwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBpbm5lciBjbGFzcyBlbXVsYXRpb24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NyI+NjY3NzwvYT4KK1x1IGluIGNvbW1lbnQgZ2l2ZXMgSW52YWxpZCB1bmljb2RlIGVycm9yCisgICAKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTIwNiAtIDA2dGggRGVjZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTcKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NCI+NjU2NDwvYT4KK05ldyBidWlsZGVyIC0gSW5jcmVtZW50YWwgcmVjb21waWxhdGlvbiBkZXRlY3RlZCBwYWNrYWdlIHByb2JsZW1zIGluY29ycmVjdGx5ICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1NjMiPjY1NjM8L2E+CitQYWNrYWdlIHZpZXcgZG9lcyBub3QgcmVmcmVzaCBvayB3aGVuIGFkZGluZyBib3RoIHBhY2thZ2UgYW5kIHVuaXQgYXQgb25jZSAgCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQyIj4zMjQyPC9hPgorVHlwZVJlZi5nZXRUeXBlIGRvZXMgbm90IHdvcmsgZm9yIGlubmVyIHR5cGVzICgxR0NGVU5UKQorCis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMDQgLSA0dGggRGVjZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTZjCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IE5ldyBpbmNyZW1lbnRhbCBidWlsZGVyIGltcGxlbWVudGF0aW9uIGVuYWJsZWQgYnkgZGVmYXVsdCAoY2FuIHJlZW5hYmxlIHRoZSAKK29sZCBpbXBsZW1lbnRhdGlvbiBieSBjaGFuZ2luZyB0aGUgYnVpbGRlciBleHRlbnNpb24gaW4gdGhlIHBsdWdpbi54bWwpCis8bGk+IERlbHRhIHByb2Nlc3NpbmcgaW1wcm92ZW1lbnQ6CisJPHVsPgorCTxsaT4gTm8gbG9uZ2VyIGNyZWF0ZXMgdW5uZWNlc3NhcnkgSmF2YSBlbGVtZW50cyB3aGVuIHRyYXZlcnNpbmcgdGhlIHJlc291cmNlIGRlbHRhLgorCTxsaT4gSGFuZGxlcyBjaGFuZ2VzIGluIGJpbmFyeSBmb2xkZXIgbGlicmFyaWVzLgorCTxsaT4gUHJvamVjdHMgdGhhdCBzaGFyZSBsaWJyYXJpZXMgYXJlIG5vdGlmaWVkIGluZGl2aWR1YWxseS4KKwk8bGk+IERvZXNuJ3Qgbm90aWZ5IGVtcHR5IGRlbHRhcyBhbnkgbG9uZ2VyLgorCTwvdWw+Cis8bGk+IFNvdXJjZSBmb2xkZXIgcmVzb3VyY2UgY29weWluZyBubyBsb25nZXIgcGVyZm9tIGFueSBjb3BpZXMgYXMgc29vbiBhcworb25lIHNvdXJjZSBmb2xkZXIgY29pbmNpZGF0ZXMgd2l0aCB0aGUgb3V0cHV0IGxvY2F0aW9uLgorPGxpPiBPcGVuIG9uIHNlbGVjdGlvbiBpcyBtb3JlIGZhdWx0LXRvbGVyYW50OiB3aWxsIG5vdyB0cnkgdG8gbG9jYXRlIGEKK3NlbGVjdGVkIG1ldGhvZCBmb3Igd2hpY2ggYXJndW1lbnQgdHlwZXMgYXJlIGluY29ycmVjdC4KKzxsaT4gQ29tcGlsZXIgbm8gbG9uZ2VyIHJlamVjdHMgY29ycmVjdCBjb2RlIHdpdGggcmVzcGVjdCB0byBhY2Nlc3MgdG8gcHJvdGVjdGVkCittZW1iZXJzIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGVzICh3YXMgb25seSBhY2NlcHRpbmcgYSBzdWJzZXQgb2YgY29ycmVjdCBzY2VuYXJpaSkuCis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTI4Ij42NTI4PC9hPjoKK0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdHJ5aW5nIHRvIHNlYXJjaCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0OTQiPjY0OTQ8L2E+OgorTmV3IGJ1aWxkZXI6IEludmFsaWQgZXJyb3IgZm91bmQgKFRoZSBkZWNsYXJlZCBwYWNrYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBwYWNrYWdlKSAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NjEiPjY0NjE8L2E+OgorTmV3QnVpbGRlciAtIGRvZXNuJ3QgZGV0ZWN0IGluY29ycmVjdGx5IGxvY2F0ZWQgY29tcGlsYXRpb24gdW5pdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ1NiI+NjQ1NjwvYT46CitJbnZhbGlkIGVycm9yIHdoZW4gY29tcGlsaW5nIGFjY2VzcyB0byBwcm90ZWN0ZWQgbWVtYmVyIGluc2lkZSBpbm5lcmNsYXNzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1OCI+MzM1ODwvYT46CitQZXJmb3JtYW5jZTogaW5kZXhlciBkb2luZyB0b28gbXVjaCB3b3JrPyAoMUdKTERONykgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46IAorQ29kZUZvcm1hdHRlciBtYXBwZWQgcG9zaXRpb25zIGJyb2tlbiBmb3IgbXVsdGktbGluZSBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQzMSI+NjQzMTwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gdGhlIFNvdXJjZUluZGV4ZXIgcmVxdWVzdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDIyIj42NDIyPC9hPjoKK1Jlc291cmNlIGNvcHkgc2hvdWxkIG5vdCBvY2N1ciBhcyBzb29uIGFzIG9uZSBzb3VyY2UgZm9sZGVyIG92ZXJsYXAgdGhlCitiaW5hcnkgb3V0cHV0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDE2Ij42NDE2PC9hPjoKK0NvZGUgcmVzb2x2ZSBkb2Vzbid0IHdvcmsgb24gbWVzc2FnZSBzZW5kIHdoZW4gcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3MDUiPjU3MDU8L2E+OgorV3JvbmcgcG9zaXRpb25zIGZvciBDbGFzc0Nhc3RMaXRlcmFsCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQyMyI+NjQyMzwvYT46ICAKK1NlYXJjaCAtIGRvZXMgbm90IGZpbmQgZGVjbGFyYXRpb25zIG9mIG1ldGhvZCAidG8qU3RyaW5nIiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ2Ij4zMjQ2PC9hPjogCitDb2RlQ29tcGxldGlvbiAtIE5vIGNvbXBsZXRpb24gb24gbWVtYmVyIGFjY2VzcyBvbiBhbm9ueW1vdXMgY2xhc3MgKDFHRDNPR0EpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDU0Ij41NDU0PC9hPjoKK0NvZGUgQXNzaXN0IGFkZHMgcXVhbGlmaWVkIGNvZGUgaW5zaWRlIGlubmVyIGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MzciPjU4Mzc8L2E+OgorQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIGluZGV4IG1lcmdpbmcKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTEyNyAtIDI3dGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTVhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzx1bD4KKzxsaT4KK0JldHRlciBoaWdobGlnaHRpbmcgb2YgbXVsdGktbGluZSBtZXNzYWdlIHNlbmRpbmc8L2xpPgorCis8bGk+CitDb2RlIGFzc2lzdCBvbmx5IHF1YWxpZmllcyBpbXBsaWNpdCBtZW1iZXJzIHdoZW4gbmVjZXNzYXJ5PC9saT4KKworPGxpPgorTmV3IEFQSSBmb3Igc2V0dGluZyBib3RoIGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIGF0IHRoZSBzYW1lIHRpbWUKKyhhbGxvd2luZyB0byBhdm9pZCBjbGFzc3BhdGggdmFsaWRhdGlvbiBmYWlsdXJlcyBpbiBjYXNlIHRoZXJlIGlzIG5vIHdheQordG8gY2hhbmdlIGJvdGggaW5kZXBlbmRhbnRseSk6PC9saT4KKworPGJyPjx0dD5JSmF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGgKK25ld091dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC90dD48L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzM5Ij42MzM5PC9hPiBBc3NlcnRpb24KK2ZhaWxlZCBpbiBTb3VyY2VUeXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjE4Ij41NjE4PC9hPgorVW5jYXVnaHQgQ29tcGxldGlvbk5vZGVGb3VuZCBleGNlcHRpb24gZG9pbmcgY29kZSBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyOTQiPjYyOTQ8L2E+CitFeGNlcHRpb24gZHVyaW5nIHNldHRpbmcgdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjMwMiI+NjMwMjwvYT4KK0Fzc2VydGlvbkZhaWx1cmUgaW4gb3BlbiBvbiBzZWxlY3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwOTQiPjYwOTQ8L2E+CitTZWFyY2ggLSBkb2VzIG5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gSmF2YVByb2plY3Quc2V0UHJvamVjdCguLi4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIwIj4zMzIwPC9hPiIKK1NlYXJjaCAtIE1hdGNoIHRocm91Z2ggc3VwZXIgdHlwZSBub3QgZm91bmQgaWYgaW4gZGlmZmVyZW50IHByb2plY3QgKDFHR0FPRlQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTU4Ij42MTU4PC9hPiIKK1NlYXJjaCAtIFByZWZpeCBhbmQgcG9zdGZpeCBleHByZXNzaW9uIG5vdCBmb3VuZCBhcyB3cml0ZSByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzQiPjQ5NzQ8L2E+OgorU2V0IGNsYXNzcGF0aCAvIG91dHB1dCBsb2NhdGlvbiBzaG91bGQgYmUgb25lIG9wZXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE3NiI+NjE3NjwvYT46CitFY2xpcHNlIHRvb2xzIGluZGV4IG91dCBvZiBib3VuZHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjAiPjYxNjA8L2E+OgorSW5kZXggb3V0IG9mIGJvdW5kcyBpbiB1cGRhdGUgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE1MSI+NjE1MTwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gT2JqZWN0U2V0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTQzIj41OTQzPC9hPjoKK2ludGVybmFsIGVycm9yIGluIHNldHRpbmcgYnVpbGRwYXRoIChuYW1lIGNvbGxzaW9uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46CitDb2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTA3Ij41OTA3PC9hPjoKK0luZGV4ZXIgZXJyb3JzIHdoZW4gZGlzayBmdWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODg0Ij41ODg0PC9hPjoKK0NvZGUgYXNzaXN0IHNob3VsZCBvbmx5IGZ1bGx5IHF1YWxpZnkgaWYgbmVlZGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTE0Ij41NTE0PC9hPjoKK1NlbGVjdCBhIGRlY2xhcmF0aW9uIGRvZXMgbm90IHdvcmsgaW4gdW5zYXZlZCB3b3JraW5nIGNvcGllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQxNCI+NTQxNDwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gU2lnbmF0dXJlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mzg0Ij41Mzg0PC9hPjoKK3NlYXJjaCBlbmdpbmU6IGJlaGF2aW9yIGRpZmZlcmVudCB0aGFuIGV4cGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTA0Ij42MTA0PC9hPjoKK1Vub3B0aW1hbCBkZWJ1Z2dlciBoaWdobGlnaHQgZm9yIG11bHRpLWxpbmUgbWVzc2FnZSBleHByZXNzaW9uCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIxMCI+NjIxMDwvYT46IENyZWF0aW9uCitmYWlsZWQgZXJyb3Igd2hlbiBjcmVhdGluZyBhIHNvdXJjZSBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjUiPjM0MjU8L2E+OgorSmF2YUNvcmUuY3JlYXRlKFN0cmluZyBoYW5kbGUpIGxvb3NlcyBpbmZvcm1hdGlvbiAoMUdMQTBRRykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMjciPjYxMjc8L2E+OgorUmVmZXJlbmNlIGJ5IGxvY2FsIGNsYXNzIG5vdCBmb3VuZCB3aGVuIHNlYXJjaGluZyBmb3IgaW50ZXJmYWNlIHJlZnMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5OTAiPjQ5OTA8L2E+OgorRXJyb3Igc3RhcnRpbmcgRWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MSI+MzQ3MTwvYT46CitMZWFkaW5nICcvJyBpbiBzcmMgcGFnZSBvZiBKYXZhIHdpemFyZCBpcyBtaXNsZWFkaW5nICgxRzg0MlRIKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYxOSI+MzYxOTwvYT46CitpbmNvbnNpc3RlbnQgc2VhcmNoIGZvciBtZXRob2QgZGVjbGFyYXRpb25zICgxR0NaWlMxKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU1NyI+NTU1NzwvYT46CitJbmNvcnJlY3QgaGllcmFyY2h5IHNob3duIChub3Qgcm9vdGVkIGF0IE9iamVjdCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMDAiPjYxMDA8L2E+OgorQnVnIGluIE9iamVjdFNldC5FbnVtZXJhdGlvbi5uZXh0RWxlbWVudAorPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMTIwIC0gMjB0aCBOb3ZlbWJlciAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxMworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8dWw+Cis8bGk+CitDb2RlQXNzaXN0IG5vIGxvbmdlciBmaW5kIHN5bnRoZXRpYyBjb21wbGV0aW9ucy48L2xpPgorCis8bGk+CitSZWR1Y2VkIHN0YXJ0dXAgdGltZSBvZiBKYXZhIHBlcnNwZWN0aXZlPC9saT4KKworPGxpPgorQ29kZUFzc2lzdCBvcHRpb24gYWRkZWQgdG8gZm9yY2UgZnVsbCBxdWFsaWZpY2F0aW9uIG9mIGltcGxpY2l0IGZpZWxkL21ldGhvZAorcmVmZXJlbmNlcyAoc2VlIEphdmFDb3JlIG9wdGlvbjogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiIpLjwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTgyIj41OTgyPC9hPjogY29udGVudAorYXNzaXN0IGRpc3BsYXlzIGFjY2Vzc29ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk1NSI+NTk1NTwvYT46CitOUEUgaW4gTG9va3VwRW52aXJvbm1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MjMiPjU5MjM8L2E+OgorU2VhcmNoIGZvciAibGVuZ3RoIiBmaWVsZCByZWZzIGZpbmRzIFtdLmxlbmd0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkxNiI+NTkxNjwvYT46CitTZWFyY2ggLSB0b28gbWFueSBtYXRjaGVzIGZvciByZWZzIHRvIE5hbWVMb29rdXAuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NTciPjU5NTc8L2E+OgorSW50ZXJuYWwgZXJyb3IgaW4gUmVjb3ZlcmVkTWV0aG9kLmFkZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk3MiI+NTk3MjwvYT46CitJbmNyZW1lbnRhbCBidWlsZGVyIChuZXcpIHJlY29tcGlsaW5nIGRlcGVuZGVudHMgb2YgUGFyc2VyIGZvciBubyBhcHBhcmVudAorcmVhc29uCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTQwIj41OTQwPC9hPjoKK0luc3RhbmNlIGluaXRpYWxpemVyIGluIGFub24gaW5uZXIgY2xhc3MgZ2VuZXJhdGVzIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkxMyI+NTkxMzwvYT46CitQZXJmb3JtYW5jZSAtIGNyZWF0aW5nIHRvbnMgb2YgY2xhc3NmaWxlIGVsZW1lbnRzIGF0IHN0YXJ0dXAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4NjIiPjU4NjI8L2E+Ogorc2VhcmNoIDogdG9vIG1hbnkgbWF0Y2hlcyBvbiBzZWFyY2ggd2l0aCBPclBhdHRlcm4KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNzAiPjYwNzA8L2E+OgorTmV3IEJ1aWxkZXI6IEJ1aWxkZXIgb3JkZXIgcHJvYmxlbQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTg1MiI+NTg1MjwvYT46CitQcm9qZWN0IHJlZmVyZW5jZXMgbm90IHVwZGF0ZWQgYWNjb3JkaW5nIHRvIGJ1aWxkcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46CitDb2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTYzIj41NTYzPC9hPjoKK1dyaXRlIHJlZmVyZW5jZSBvbiBkZWNsYXJhdGlvbiBub3QgcmVwb3J0ZWQKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU3Ij4zMjU3PC9hPjogSU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcworZm9yIENsYXNzRmlsZXMgc2hvdWxkIHVzZSBuYW1lcyBmcm9tIHNvdXJjZSAoMUdER04zRykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDUiPjMyNDU8L2E+Ogorc3ViIGZvbGRlcnMgd2l0aCBkb3Qgbm90IHZpc2libGUgaW4gcGFja2FnZXMgdmlldyAoMUdDT0gxNykKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMyAtIDEzdGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTFiCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MjEiPjU4MjE8L2E+OiBSZWZhY3RvcgorUmVuYW1lIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgaW5zdGVhZCBvZiBtZW1iZXIgaW4gY2FzZSBvZiBuYW1lIGNsYXNoCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDAzPjUwMDM8L2E+OiAgICAgUmV2aWV3IEphdmFCdWlsZGVyIGNhbmNlbGF0aW9uIGhhbmRsaW5nIDxicj48YSBocmVmPSIgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0iNTc5MCI+NTc5MDwvYT46CitJSmF2YVByb2plY3QuaGFzQnVpbGRTdGF0ZSgpIGZhaWxzIHdpdGggbmV3IGJ1aWxkZXIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3OTQiPjU3OTQ8L2E+OgorUG9seW1vcnBoaWMgc2VhcmNoIGRvZXNuJ3Qgd29yayBpbiBkZXBlbmRlbnQgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3ODEiPjU3ODE8L2E+OgorTlBFIHVzaW5nIG5ldyBpbWFnZSBidWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODM0Ij41ODM0PC9hPjoKK0luY3JlbWVudGFsIGJ1aWxkIHJlY29tcGlsZWQgdW5yZWxhdGVkIHByb2plY3QKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjE1Ij41MjE1PC9hPjogc2VhcmNoOgorbWlzc2luZyBmaWVsZCByZWZlcmVuY2UKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMiAtIDEydGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTBfMDEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorUHJvamVjdCByZWZlcmVuY2VzIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBKYXZhQ29yZSwgaW4gcGFyYWxsZWwgd2l0aCBidWlsZAorcGF0aC48L2xpPgorCis8bGk+CitSZXN1cnJlY3RlZCBkZXByZWNhdGVkIEFQSXMgZnJvbSAwLjkgd2hpY2ggd2VyZSBkaXNjYXJkZWQgcHJldmlvdXNseS48L2xpPgorCis8bGk+CitJQ29kZUNvbXBsZXRpb24gcmV2ZXJ0ZWQgdG8gMS4wIHZlcnNpb24sIGFuZCBnb3QgZGVwcmVjYXRlZC4gVXNlIElDb21wbGV0aW9uUmVxdWVzdG9yCitpbnN0ZWFkLjwvbGk+CisKKzxsaT4KK0Nyb3NzLXByb2plY3QgaW5jcmVtZW50YWwgcmVjb21waWxhdGlvbiBpbiBwcmVzZW5jZSBvZiBzdHJ1Y3R1cmFsIGNoYW5nZXMKK2luIHByb2R1Y2VkIGJpbmFyaWVzLjwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzYyIj41MzYyPC9hPjogRGVlcGVyCit0aGFuIG5lY2Vzc2FyeSBKYXZhRWxlbWVudERlbHRhIHdoZW4gcGFja2FnZSBhZGRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNSI+NTUyNTwvYT46CitJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgaXNuJ3QgMS4wIGNvbXBhdGlibGUKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2MTYiPjU2MTY8L2E+OgorTlBFIHdoZW4gY29tcGlsaW5nIGludmFsaWQgY29kZSBkZWZpbmluZyBhIGFycmF5IG9mIHN0cmluZ3MKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTciPjUyMTc8L2E+OgoramF2YSBzZWFyY2ggc2NvcGU6IG1pc3NpbmcgZW5jbG9zaW5nIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MjciPjU1Mjc8L2E+OgorVW5leHBlY3RlZCBpbmFjY3VyYXRlIG1hdGNoZXMgZm9yICNjbG9zZSgpIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyMiI+NTUyMjwvYT46CitUeXBlIGhpZXJhcmNoeSAtIG1pc3Npbmcgc3VidHlwZXMgb2YgSmF2YUVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MDgiPjU1MDg8L2E+OgorSkRUIGNhbm5vdCBzdXBwb3J0IHBlcmlvZHMgaW4gdGhlIGZvbGRlcnMgYWJvdmUgdGhlIHBhY2thZ2UgbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MSI+NTU0MTwvYT46CitObyByZWZyZXNoIHdoZW4gYWRkaW5nIGEgY29tcGlsYXRpb24gdW5pdCBpbnNpZGUgYSBkb3QgbmFtZWQgc291cmNlIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUzMiI+NTUzMjwvYT46CitJbmNyZW1lbnRhbCBjb21waWxlIG1pc3NlZCBhIHJldHVybiB0eXBlIGNoYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUxNSI+NTUxNTwvYT46CitBYm9ydENvbXBpbGF0aW9uIGR1cmluZyBwb2x5bW9ycGhpYyBzZWFyY2gKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNzUiPjUyNzU8L2E+OgorQ3Jvc3MtcHJvamVjdCByZWNvbXBpbGF0aW9uIERlZmVjdCAxODYyNDkgLSBPVEkgUFIjIDFHTEVZVDEKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNjciPjUyNjc8L2E+OgorRGVwZW5kZW50IFByb2plY3RzIG5vdCBjb21waWxlZCB3aGVuIHByb2plY3QgaXMgc2F2ZWQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MjUiPjU0MjU8L2E+OgorRXhjZXB0aW9uIG9uIENvZGVBc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTQiPjMxOTQ8L2E+OgorRENSIC0gSk0gLSBCdWZmZXIgY29udGVudHMgaXMgZHVwbGljYXRlZCAoMUcwM0hDUCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MzAiPjU0MzA8L2E+OgorTXVzdCByZXN1cnJlY3QgMC45IGRlcHJlY2F0ZWQgQVBJcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkyMyI+NDkyMzwvYT46CitJSmF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMgcmV0dXJucyByb290cyBmcm9tIG90aGVyIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA4Ij4zMzA4PC9hPjoKK1Byb2plY3RzIG5vdCBidWlsZCBpbiBjb3JyZWN0IG9yZGVyIGFmdGVyIGxvYWQgKDFHRjYwVE4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM1Ij4zNDM1PC9hPjoKK2tlZXBpbmcgdGhlIHByb2plY3QgcmVmZXJlbmNlcyBhbmQgcmVxdWlyZWQgcHJvamVjdCBpbiBzeW5jaCAoMUdMMEwzNCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMDMiPjUyMDM8L2E+OgorUHJvamVjdCBpbmRleGluZyBkb2VzIG5vdCByZXN0cmFpbiB0byBzb3VyY2UgZmlsZXMgb24gdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MyI+MzI5MzwvYT46CitzZWFyY2ggZG9lcyBub3Qgd29yayBpbiBpbm5lciBjbGFzcyAoMUdFVVFISikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDkiPjMyNDk8L2E+OgorRXJyb3IgbWVzc2FnZSBpcyBjb25mdXNpbmc6IHVzaW5nIHRva2VuIGluc3RlYWQgb2YgaWRlbnRpZmllciAoMUdDVERZTSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTQiPjUyMTQ8L2E+OgorVFZUOiBBcG9zdHJvcGhlIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIGluIEphdmEgZXJyb3IgbWVzc2FnZXMgaW4gc29tZQordHJhbnNsYXRpb25zIChpdGFsaWFuKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTI2MyI+NTI2MzwvYT46CitUVlQ6IENvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIGFyZSBoYXJkIGZvciB0cmFuc2xhdG9ycyB0byB1bmRlcnN0YW5kCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUxIj4zMjUxPC9hPjoKK1R5cGVzIG5vdCBpbmNsdWRlZCBpbiBjb2RlIGFzc2lzdCBsaXN0IGZvciBpbXBvcnQgKDFHRDA2VzkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mjc3Ij41Mjc3PC9hPjoKK0NvZGUgYXNzaXN0IG9uIGFzc2VydCBtZXRob2QgZG8gYW4gQWJvcnRFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNzAiPjUwNzA8L2E+Ogorc2VhcmNoOiBtaXNzaW5nIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY5Ij41MDY5PC9hPjoKK3NlYXJjaDogbWV0aG9kIHJlZmVyZW5jZSBpbiBzdXBlciBtaXNzaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY4Ij41MDY4PC9hPjoKK3NlYXJjaDogbWlzc2luZyBtZXRob2QgcmVmZXJlbmNlCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNiI+NTUyNjwvYT46IE51bGxQb2ludGVyRXhjZXB0aW9uCitzZWFyY2hpbmcgZGVjbGFyYXRpb25zIG9mICNjbG9zZSgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDk4Ij41NDk4PC9hPjoKK0phdmEgQ29tcGlsZSAtIGNvZGUgZG9lcyBub3QgY29tcGlsZSBjb3JyZWN0bHkgaW4gSkRULCBidXQgZG9lcyB3aXRoIGphdmFjCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDkzIj41NDkzPC9hPjoKK0FkZGluZyBwcm9qZWN0IHJlZmVyZW5jZXMgZG9lc24ndCB1cGRhdGUgdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQyNiI+NTQyNjwvYT46CitDb2RlQXNzaXN0IHJldHVybnMgZW1wdHkgY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5MCI+MTY5MDwvYT46CitMb2NhbCB2YXJpYWJsZXMgbm90IGFsd2F5cyBkaXNwbGF5ZWQgd2hlbiBpbiBzY29wZSAoMUdKOFBYNCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQzNjgiPjQzNjg8L2E+OgorV3JvbmcgbWF0Y2ggaW4gSmF2YSBTZWFyY2gKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzgiPjMyMzg8L2E+OgorQ29kZUFzc2lzdCAtIG5vIGNvbXBsZXRpb24gaWYgY3Vyc29yIGF0IHN0cmluZyBiZWdpbm5pbmcgKDFHSTNCWU8pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcxIj4zMjcxPC9hPjoKK1VuYWJsZSB0byBkZWxldGUgYXR0YWNoZWQgaW50ZXJuYWwgc291cmNlIGphciAoMUdEWDIxNSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDkiPjMyMDk8L2E+OgorRENSIC0gSk0gLUludmFsaWQgcmVmZXJlbmNlcyB0byBJUGF0aC5nZXREZXZpY2UoKSBwb3RlbnRpYWxseSBicmVha2luZworb24gTGludXggKDFHNFUxUjcpCis8YnI+Jm5ic3A7Cis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEwMjUgLSAyNXRoIE9jdG9iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorSmF2YU1vZGVsIGlzIG5vIGxvbmdlciBwZXJmb3JtaW5nIHNtYXJ0IGNsYXNzcGF0aCB1cGRhdGVzIHdoZW4gSmF2YSBwYWNrYWdlCitmcmFnbWVudCByb290cyBhcmUgZWl0aGVyIG1vdmVkIG9yIHJlbW92ZWQuPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NjgiPjM1Njg8L2E+OiBubworaG92ZXJoZWxwIG92ZXIgY29uc3RydWN0b3IgcmVmZXJyZW5jZXMgKDFHQUowS1ApCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjE4Ij41MjE4PC9hPjoKK0FjY1N1cGVyIGlzIG5vdCBzZXQgcHJvcGVybHkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMDAiPjUyMDA8L2E+OgorU2V0Q2xhc3NwYXRoT3BlcmF0aW9uIG11c3QgY2xvc2Ugcm9vdCBvbmx5IHdoZW4gcm9vdCBpcyByZW1vdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ5Ij4zNDQ5PC9hPjoKK0NvZGVBc3Npc3QgLSB0d28gdHlwZSB3aXRoIHNhbWUgbmFtZSBtdXN0IGJlIHF1YWxpZmllZCAoMUdMRE4zWikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzMiPjQ5NzM8L2E+OgorUmVuYW1lIHBhY2thZ2UgcmVtb3ZlcyBmaXJzdCBsZXR0ZXIgb2YgaW1wb3J0IHN0YXRlbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzkiPjMyNzk8L2E+OgorU2V2ZXJlIC0gSk0gLSBTb3VyY2UgZm91bmQsIGV2ZW4gdGhvdWdoIHNvdXJjZXBhdGggaXMgZmFsc2UgKDFHRUxBVkIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM0Ij4zNDM0PC9hPjoKK0RlbGV0aW5nIGEgcHJvamVjdCBmcm9tIHRoZSB3cyByZW1vdmVzIGl0IGZyb20gdGhlIGJ1aWxkcGF0aCEgKDFHS1pOQlMpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDIxIj41MDIxPC9hPjoKK1JlZmFjdG9yaW5nIHRyYXNoZWQgbXkgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTEzNiI+NTEzNjwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBhIGZpZWxkIGRlY2xhcmF0aW9uIGlzIGFuIGFub255bW91cworY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDAiPjM0NDA8L2E+OgorQ2xhc3NmaWxlIGNvbXBhcmF0b3Igc2hvdWxkIGJlIGFibGUgdG8gaWdub3JlIG9yZGVyICgxR0wySTdFKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzOSI+MzQzOTwvYT46CitDbGFzc2ZpbGUgY29tcGFyYXRvciBzaG91bGQgYmUgYWJsZSB0byBpZ25vcmUgc3ludGhldGljcyAoMUdMMkkzTikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDIiPjM0NDI8L2E+OgorTlBFIGluIFNvdXJjZUVsZW1lbnRQYXJzZXIgKDFHTDQ5NkkpCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2OSI+MzM2OTwvYT46IENsYXNzcGF0aAorZ2V0cyBvdXQgb2Ygc3luYyAoMUdKVTg1MykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODEiPjMyODE8L2E+OgorY2hhbmdlIGphdmEgcHJvamVjdCBiaW5hcnkgb3V0cHV0IGNyZWF0ZSBuZXcgcGFja2FnZSAoMUdFSEswNykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTgiPjMyOTg8L2E+OgorSW5jb3JyZWN0IGNvbXBpbGUgZXJyb3Igb24gdmFsaWQgY2FzZSBzdGF0ZW1lbnQgKDFHRVlXRVQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTYyIj4zNTYyPC9hPjoKK091dGxpbmVyIGJ1ZyBmb3IgaW5pdGlhbGl6ZXJzICgxRzkzQ1MzKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0NyI+MzQ0NzwvYT46CitzZWFyY2g6IGNvdWxkIGF1dG9tYXRpY2FsbHkgbmFycm93IGRvd24gc2NvcGUgKDFHTERKVk4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg4Ij4zMjg4PC9hPjoKK0NvZGVBc3Npc3QgLSBDb2RlIGFzc2lzdCBkb2Vzbid0IHdvcmsgaW4gc29tZSBtZXRob2RzICgxR0VMRUJIKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA3MyI+NTA3MzwvYT46CitkZWxldGUgZG9lcyBub3Qgd29yayBvbiBkZWZhdWx0IHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDMiPjM0NDM8L2E+OgorVW51c2VkIGFyZ3VtZW50L3ZhcmlhYmxlIHdhcm5pbmdzIHNob3duIHR3aWNlICgxR0w0T1c3KQorPGJyPiZuYnNwOworPGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMDE4IC0gMTh0aCBPY3RvYmVyIDIwMDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjA1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzx1bD4KKzxsaT4KK0NvZGVBc3Npc3QgcHJvdmlkZXMgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucy48L2xpPgorCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChicmVha2luZykgQVBJIENoYW5nZXMgb24gPHR0PklDb21wbGV0aW9uUmVxdWVzdG9yPC90dD4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgPGI+KzwvYj4gPHU+QWRkZWQ8L3U+IEFQSSBmb3Igc3VnZ2VzdCB2YXJpYWJsZSBuYW1lOgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8dHQ+dm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSB0eXBlTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIG5hbWUsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBjb21wbGV0aW9uTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOzwvdHQ+Cis8YnI+Jm5ic3A7Cis8bGk+CitIZWxwZXIgbWV0aG9kIGZvciBjb21wdXRpbmcgYSByZXNvbHZlZCBhbmQgZXhwYW5kZWQgcGF0aCAoYWxsIGV4cG9ydHMgZnJvbQorcHJlcmVxdWlzaXRlcykgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gMjA0LCBnb3QgPHU+cmVtb3ZlZDwvdT4uIFRoaXMgaXMKK25vdCBhbiBBUEkgY2hhbmdlLCBpdCBuZXZlciBtYWRlIGl0IG91dCBvZmZpY2lhbGx5LjwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsgPGI+LTwvYj4gPHR0PklKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKTwvdHQ+Cis8cD48dHQ+U2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L3R0PiBoYXMgYmVlbiBkZXByZWNhdGVkLgorVXNlIDx0dD5TZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKTwvdHQ+IGluc3RlYWQuCitUaGUgcmF0aW9uYWwgaXMgdGhhdCA8dHQ+Y3JlYXRlSmF2YVNlYXJjaFNjb3BlKElSZXNvdXJjZVtdKTwvdHQ+IHdhcyBub3QKK3dlbGwgZGVmaW5lZCBmb3IgcHJvamVjdHMsIGFuZCBpdCBjb3VsZCBub3QgZGVmaW5lIGEgc2VhcmNoIHNjb3BlIGZvciBqYXZhCitlbGVtZW50cyB0aGF0IGRpZG4ndCBoYXZlIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZSAoZS5nLiBleHRlcm5hbCBqYXJzKS4KK1RoaXMgZGVwcmVjYXRlZCBBUEkncyBiZWhhdmlvciBoYXMgYWxzbyByZXZlcnRlZCB0byB0aGUgMS4wIHN0YXRlIGZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eS4gVGhlIHNwZWNpZmljYXRpb24gb2YgPHR0PmNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSk8L3R0PgoraXMgYXMgZm9sbG93czoKKzx1bD4KKzxsaT4KK0lmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklKYXZhUHJvamVjdDwvdHQ+LCB0aGVuIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlcnMsCitpdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgaXRzIHJlZmVyZW5jZXMgcHJvamVjdHMgKHdpdGggdGhlaXIKK3NvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC48L2xpPgorCis8bGk+CitJZiBhbiBlbGVtZW50IGlzIGFuIDx0dD5JUGFja2FnZUZyYWdtZW50Um9vdDwvdHQ+LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UKK2ZyYWdtZW50cyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aWxsIGJlIGluY2x1ZGVkLjwvbGk+CisKKzxsaT4KK0lmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklQYWNrYWdlRnJhZ21lbnQ8L3R0PiwgdGhlbiBvbmx5IHRoZSBjb21waWxhdGlvbgordW5pdCBhbmQgY2xhc3MgZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzCit3aWxsIE5PVCBiZSBpbmNsdWRlZC48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNjUiPjUwNjU8L2E+OiBOdWxsUG9pbnRlckV4Y2VwdGlvbgoraW4gQ29kZSBBc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MjEiPjQ5MjE8L2E+OgorU2VyYWNoIGRvZXMgbm90IGZpbmQgdHlwZXMgaW4gaW50ZXJuYWwgamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTE3Ij40OTE3PC9hPjoKK0xhdGVzdCBidWlsZCBmYWlscyB1cGRhdGluZyBUeXBlSGllcmFyY2h5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk2Ij4zMjk2PC9hPjoKK0NvZGVBc3Npc3QgLSBzaG91bGQgZmlsdGVyIG91dCBkdXBsaWNhdGVzIGlmIGFueSAoMUdFV0RMNykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjUiPjMzMjU8L2E+OgorVG9vIG11Y2ggY29kZWFzc2lzdCBtYXRjaCBvbiBpbnRlcmZhY2UgKDFHSDBHVjEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDI0Ij4zNDI0PC9hPjoKK0RDUjogY29kZSBhc3Npc3Qgc3VwcG9ydCBmb3IgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucyAoMUdLTTZPUSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODIiPjMyODI8L2E+OgorSkNLIDEuNCAtIERBU0cgLSBhc3NpZ25lZCB2YXJpYWJsZSBiZWZvcmUgY2F0Y2ggYmxvY2sgYWZ0ZXIgcmV0dXJuIHN0YXRlbWVudAorKDFHSzJBSFgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUyIj4zNDUyPC9hPjoKK05QRSBkb2luZyBEaXNwbGF5IGZyb20gQmluYXJ5ICgxR0xFRzVLKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NCI+MzM3NDwvYT46CitTZWFyY2hQYXR0ZXIuY3JlYXRlUGF0dGVybiguLi4pIGRvZXNuJ3Qgd29yayB3aXRoIHVuaWNvZGVzICgxR0pZQlJZKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwOSI+MzMwOTwvYT46CitEQ1IgLSBKTSAtIGNvdWxkIElDb21waWxhdGlvblVuaXQ6OmdldFR5cGUgdGhyb3cgSk1FPyAoMUdGOUFMOSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTAiPjMzMTA8L2E+OgorU21va2UgMTI0OiBDb21waWxlIGVycm9ycyBpbnRyb2R1Y2VkIHdpdGggcmVuYW1lIHJlZmFjdG9yaW5nICgxR0ZCSzJHKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNiI+MzQzNjwvYT46CitOUFcgaW4gVHlwZUhpZXJhcmNoeSAoMUdMMEw4RCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MTkiPjQ5MTk8L2E+OgorQ2Fubm90IGR1cGxpY2F0ZSBsb2NhbCB2YXJpYWJsZSBpbiBmaW5hbGx5IGJsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTQzIj40OTQzPC9hPjoKK1ZlcmlmaWNhdGlvbiBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4NSI+NDM4NTwvYT46CitRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5zb3VyY2VFbmQgaW5jb3JyZWN0IGlmIHR5cGUgaXMgYW4gQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzAiPjMyMzA8L2E+OgorU2VhcmNoIC0gVG9vIG1hbnkgdHlwZSByZWZlcmVuY2VzIGZvciBxdWVyeSBlbmRpbmcgd2l0aCAqICgxR0FaVkdJKQorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzQiPjMxNzQ8L2E+OiBPcGVuLW9uLXNlbGVjdGlvbgorZG9lc24ndCB3b3JrIG9uIE1vdXNlQWRhcHRlciAoMUdGNjlUSCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzciPjMzMzc8L2E+OgorT3BlbiBvbiBzZWxlY3Rpb24gZmFpbGVkIHdpdGggZG91YmxlIG1lc3NhZ2UgKDFHSUZBODApCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA3Ij4zMjA3PC9hPjoKK0pNIC0gU21hcnQgc2F2ZSB3aGVuIGVtcHR5IENVICgxRzRFVkhNKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MiI+MTY3MjwvYT46CitDYW5ub3QgZXZhbHVhdGUgY2xhc3NlcyBpbiBhIHNlYWxlZCBqYXIgKDFHSFU2WUspCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIwIj4zMjIwPC9hPjoKK0Zvcm1hdHRlciB0ZXN0cyByZWZlciB0byBoYXJkY29kZWQgcGF0aCBvbiBkaXNrICgxRzlSNUc0KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1OCI+MzI1ODwvYT46CitleGNlcHRpb24gZG9pbmcgaW1wb3J0IGFzc2lzdCAoMUdESUo5RCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDAiPjMyNDA8L2E+OgorbmVlZCB0byBmaW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gYW5vbnltb3VzIGlubmVyIHR5cGVzICgxR0NCUFJJKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NCI+MzI1NDwvYT46CitJbmRleGVyIC0gU2hvdWxkIG5lc3QgaW5kZXggc291cmNlIHJldHJpZXZhbCBpbiBJV29ya3NwYWNlUnVubmFibGUgKDFHRDdKNkYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI1Ij4zMjI1PC9hPjoKK0lKYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50IHN0cmFuZ2Ugc2VtYW50aWMgKDFHQU9MV1EpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE4Ij4zMjE4PC9hPjoKK05vIGludGVyZmFjZSB0byBwb2x5bW9ycGhpY2FsbHkgYWNlc3MgSUNvbXBpbGF0aW9uVW5pdCAoMUc4RDJaUCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDUiPjMyMDU8L2E+OgorUHJvYmxlbXMgd2l0aCBJSmF2YU1vZGVsLmZpbmRQYWNrYWdlRnJhZ21lbnQgKDFHNDU2RE8pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk3Ij4zMTk3PC9hPjoKK0RDUiAtIE9wZW5PblNlbGVjdGlvbiAtIENvZGUgcmVzb2x2ZSBkb2Vzbid0IHdvcmsgb24gZGVjbGFyYXRpb25zICgxRzBVWDlWKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NyI+MzE3NzwvYT46Cis2NGtiIG1ldGhvZCBzaG91bGQgYmUgYSBjb25maWd1cmFibGUgcHJvYmxlbSAoMUZKSEdWRikKKzxicj4mbmJzcDsKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTAxMSAtIE9jdG9iZXIgMTF0aCwgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorQ2xhc3NwYXRoIGVudHJpZXMgKGV4Y2VwdCBmb3Igc291cmNlIGZvbGRlcnMpIGNhbiBiZSB0YWdnZWQgYXMgZXhwb3J0ZWQKK3Vwb24gY3JlYXRpb24uIFdoZW4gZXhwb3J0ZWQsIGFuIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cworYWxvbmcgd2l0aCBpdHMgb3V0cHV0IGxvY2F0aW9uLjwvbGk+CisKKzxsaT4KK0FkZGVkIEFQSXM6PC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBUZXN0aW5nIHN0YXR1cyBvZiBhIGdpdmVuIGVudHJ5Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgSUNsYXNzcGF0aEVudHJ5LmlzRXhwb3J0ZWQoKTwvdWw+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ3JlYXRpbmcKK2VudHJpZXMgd2l0aCBleHBvcnQgZmxhZworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworKyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoSVBhdGgsIGJvb2xlYW4pCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisrIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworKyBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KElQYXRoLCBib29sZWFuKQorPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEhlbHBlcgorbWV0aG9kIGNvbXB1dGluZyBhIHJlc29sdmVkIGFuZCBleHBhbmRlZCBwYXRoIChhbGwgZXhwb3J0cyBmcm9tIHByZXJlcXVpc2l0ZXMpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisrIElKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKQorPHVsPgorPGxpPgorQ29kZUFzc2lzdCBpbnNlcnRzIHF1YWxpZmljYXRpb24gb24gZmllbGQvbWV0aG9kIHJlZmVyZW5jZXMgaW4gY2FzZSBvZgorYW1iaWd1aXRpZXMuPC9saT4KKworPGxpPgorQ29kZUFzc2lzdCBwcm92aWRlcyBwYXJhbWV0ZXIgbmFtZXMgb24gbWV0aG9kIGNvbXBsZXRpb25zLjwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQVBJIENoYW5nZXMgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IKKzxicj4mbmJzcDsmbmJzcDsgKyBBZGRlZCBBUEkgZm9yIGFuc3dlcmluZyBtZXRob2QgZGVjbGFyYXRpb24gY29tcGxldGlvbnM6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHNlbGVjdG9yLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgQWRkZWQgcGFyYW1ldGVyTmFtZXMgdG8gbm9ybWFsIG1ldGhvZCByZXN1bHRzCitBUEk6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kKAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBzZWxlY3RvciwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsKK0FEREVECis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Cis8YnI+Jm5ic3A7Cis8bGk+CitDb2RlQXNzaXN0IG9wdGlvbmFsbHkgcGVyZm9ybXMgdmlzaWJpbGl0eSBjaGVja3MgKHNlZSBKYXZhQ29yZSBvcHRpb246Cisib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayIpLjwvbGk+CisKKzxsaT4KK1NlYXJjaCBmb3IgZmllbGQgcmVhZCBhbmQgZmllbGQgd3JpdGUgcmVmZXJlbmNlcy4gVHdvIG5ldyBjb25zdGFudHMgaGF2ZQorYmVlbiBhZGRlZDwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb24gSUphdmFTZWFyY2hDb25zdGFudHMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nCithIGZpZWxkIHJlZmVyZW5jZSBzZWFyY2ggcGF0dGVybjoKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBSRUFEX1JFRkVSRU5DRVM6IHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluICpvbmx5KgorcmVhZCBhY2Nlc3MgdG8gYSBmaWVsZC4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBXUklURV9SRUZFUkVOQ0VTOiB0aGUgc2VhcmNoIHJlc3VsdHMgY29udGFpbiAqb25seSoKK3dyaXRlIGFjY2VzcyB0byBhIGZpZWxkLgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBOb3RlIHRoYXQgaWYgUkVGRVJFTkNFUyBpcyB1c2VkLCB0aGVuIHNlYXJjaCByZXN1bHRzCitjb250YWluIGJvdGggcmVhZCBhbmQgd3JpdGUKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYWNjZXNzcyB0byBhIGZpZWxkLgorPGxpPgorT3Blbk9uU2VsZWN0aW9uIGNhbiBub3cgbG9jYXRlIHNlbGVjdGVkIGRlY2xhcmF0aW9ucyB3aGljaCBoYXZlIGEgY29ycmVzcG9uZGluZzwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgSmF2YSBlbGVtZW50IChpLmUuIG5vIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGZvdW5kKSwKK2FuZCBpcyBtb3JlIHRvbGVyYW50IG9mCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGluY29ycmVjdCBjb2RlLjwvdWw+CisKKzxoMj4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDI+CismbmJzcDsgMzQzMCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cyAoMUdLWVhLNSkKKzxicj4mbmJzcDsgMzQzMSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBVbnJlYWNoYWJsZSBjb2RlIGluIEpDb3JlCisoMUdMMlY2SykKKzxicj4mbmJzcDsgMzE3NSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKQ0sxLjNhIC0gSUNMUyAtIENvbXBhcmluZworY3VycmVudCBpbnN0YW5jZSBhZ2FpbnN0IGVuY2xvc2luZyBpbnN0YW5jZSBpbnNpZGUgb2YgYW5vbnltb3VzIGNsYXNzLgorKDFHTERTQlMpCis8YnI+Jm5ic3A7IDFHTEJPSlo6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBVbmFyeUV4cHJlc3Npb24gZG9lc24ndCBzdG9yZQorZXhwcmVzc2lvbiB0eXBlIGluIGJpdCBtYXNrCis8YnI+Jm5ic3A7IDFHRFM3SVA6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBWZXJpZnlFcnJvciByZWxhdGVkIHRvIGEgbG9jYWwKK2luZGV4IGNvbXB1dGF0aW9uCis8YnI+Jm5ic3A7IDFHTEFCUTc6IElUUEpDT1JFOldJTjIwMDAgLSBKYXZhQ29yZS5jcmVhdGUoU3RyaW5nKSB0aHJvd3MgYW4KK3VuZXhwZWN0ZWQgZXhjZXB0aW9uCis8YnI+Jm5ic3A7IDFHTDBQR1Y6IElUUEpDT1JFOldJTk5UIC0gQmF0Y2ggY29tcGlsZXIgbGVhdmluZyBKQVJzIG9wZW4KKzxicj4mbmJzcDsgNTI2OCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJVFBKQ09SRTpBTEwgLSBWZXJpZnlFcnJvciB3aGVuIHJ1bm5pbmcgYXBwICgxR0w0UUtJKQorPGJyPiZuYnNwOyAxR0xCUDY1OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiB0eXBlIHJlZnMgLSBpbmNvcnJlY3QgbWF0Y2gKKzxicj4mbmJzcDsgMUdLWENPTTogSVRQSkNPUkU6V0lOMjAwMCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBkdXJpbmcgaW5uZXIKK2NsYXNzIGVtdWxhdGlvbgorPGJyPiZuYnNwOyAxR0QwN0dLOiBJVFBKVUk6V0lOOTggLSBDb2RlIGFzc2lzdCBzaG91bGQgcXVhbGlmeSBtZXRob2RzIGlmCituZWVkZWQuCis8YnI+Jm5ic3A7IDFHTDFIRjg6IElUUEpDT1JFOldJTjIwMDAgLSBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBjb21waWxlcgorY29tcGlsaW5nIGludmFsaWQgY29kZQorPGJyPiZuYnNwOyAxR0wxM09UOiBJVFBKQ09SRTpBTEwgLSBJTmFtZUxvb2t1cCBzaG91bGQgYmUgcmVtb3ZlZAorPGJyPiZuYnNwOyAxR0wxSTlGOiBJVFBKQ09SRTpXSU4yMDAwIC0gV3Jvbmcgc291cmNlIG1hcHBpbmcgZm9yIGJpbmFyeQorbWV0aG9kcyB3aXRoIHBhcmFtZXRlcnMgd2l0aCBpZGVudGljYWwgc2ltcGxlIG5hbWVzCis8YnI+Jm5ic3A7IDFHNENJUDA6IElUUEpVSTpXSU4gLSBTb3VyY2UgZm9yIGJpbmFyaWVzIGRvZXNuJ3Qgd29yayBmb3IgYW5vbnltb3VzCitpbm5lciBjbGFzc2VzCis8YnI+Jm5ic3A7IDFHRDc5WE06IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gc2VhcmNoIGZvciBmaWVsZCByZWZlcmVuY2VzCistIG5vdCBhbGwgZm91bmQKKzxicj4mbmJzcDsgMUdMQTYwVzogSVRQSkNPUkU6V0lOTlQgLSBDb2RlQXNzaXN0IC0gc2hvdWxkIG5vdCBwcm9wb3NlIGRlY2xhcmF0aW9ucworb2YgbWV0aG9kIGFscmVhZHkgbG9jYWxseSBpbXBsZW1lbnRlZAorPGJyPiZuYnNwOyAxR0xBRVpCOiBJVFBKQ09SRTpXSU5OVCAtIENvZGVBc3Npc3QgZG9lcyBub3QgZGlzYW1iaWd1YXRlIG1ldGhvZAorcmVmZXJlbmNlcworPGJyPiZuYnNwOyAxR0w0RjNKOiBJVFBKQ09SRTpXSU5OVCAtIENvbXBsZXRpb24gb24gZGVjbGFyYXRpb24gc2hvdWxkIGFsc28KK3Byb3ZpZGUgdGhyb3duIGV4Y2VwdGlvbnMKKzxicj4mbmJzcDsgMUdMMTFKNjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBmaWVsZCByZWZlcmVuY2VzCisobmVzdGVkIHR5cGVzKQorPGJyPiZuYnNwOyAxR0wxMlhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMKK2luIGlubmVyIGNsYXNzCis8YnI+Jm5ic3A7IDFHTDBYODI6IElUUEpDT1JFOkFMTCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBzZXR0aW5nIGFyZ3Mgb24gY2xhc3MKK2ZpbGUKKzxicj4mbmJzcDsgMUdLQVFKUzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogaW5jb3JyZWN0IHJlc3VsdHMgZm9yIG5lc3RlZAordHlwZXMKKzxicj4mbmJzcDsgMUdLWjhWWjogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBkaWQgbm90IGZpbmQgcmVmZXJlbmNlcyB0bworbWVtYmVyIGNvbnN0cnVjdG9yCis8YnI+Jm5ic3A7IDFHS1lTN1k6IElUUEpDT1JFOldJTk5UIC0gTWFpbiBub3QgZm91bmQKKzxicj4mbmJzcDsgMUdFTFNEUTogSVRQSlVJOldJTk5UIC0gSkRPTTogSVR5cGUuY3JlYXRlTWV0aG9kIGRvZXMgbm90IGluc2VydAorbmljZWx5IGZvciBpbm5lciB0eXBlcworPGJyPiZuYnNwOyAxR0Y2N1ZMOiBJVFBKVUk6V0lOOTggLSBEQ1IgLSBDb2RlQ29tcGxldGlvbiAtIENvZGUtYXNzaXN0IGZvcgorbGlzdGVuZXIgbWV0aG9kcworPGJyPiZuYnNwOyAxR0ZLOFlUOiBJVFBKVUk6QUxMIC0gUmVuYW1lIENVIEEuQi5qYXZhIHRvIEFCLmphdmEgZmFpbHMgKE5QRSkKKzxicj4mbmJzcDsgMUdEMDZKNjogSVRQSlVJOldJTjk4IC0gQ29kZSBhc3Npc3Qgc2hvdWxkIHF1YWxpZnkgZmllbGRzIGlmCituZWVkZWQuCis8YnI+Jm5ic3A7IDFGWldHTUc6IElUUENPTTpXSU45OCAtIERDUiAtIENvZGVBc3Npc3QgLSBjb2RlIGFzc2lzdCBzaG91bGQKK3Byb3ZpZGUgbWV0aG9kIHNpZ25hdHVyZSBjb21wbGV0aW9ucworPGJyPiZuYnNwOyAxR0hWT1FFOiBJVFBKQ09SRTpXSU5OVCAtIEFtYmlndW91cyBjb21wbGV0aW9uIGluIENvZGVBc3Npc3QKKzxicj4mbmJzcDsgMUc4REVBQjogSVRQSlVJOldJTk5UIC0gRENSOiBjb2RlIGFzc2lzdCBzdXBlciBtZXRob2RzIHdoZW4KK2RlZmluaW5nIG1ldGhvZAorPGJyPiZuYnNwOyAxR0dOTkRaOiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vbiB2aXNpYmxlIHRhcmdldAoraXMgZXF1aXZhbGVudCB0byBubyB0YXJnZXQKKzxicj4mbmJzcDsgMUdFMTROTjogSVRQSlVJOldJTk5UIC0gVW5hYmxlIHRvIGZpbmQvc2VhcmNoIGZvciAuY2xhc3MgZmlsZXMKKzxicj4mbmJzcDsgMUdKWUZVTzogSVRQRFVJOkFMTCAtIEV2YWx1YXRpb24gaGFuZ3MsIGV2YWx1YXRpb24gdGhyZWFkIGlzCitzdXNwZW5kZWQKKzxicj4mbmJzcDsgMUZXRzQ1MzogSVRQSkNPUkU6V0lOOTggLSBPcGVuT25TZWxlY3Rpb24gLSBmYWlscyBmb3IgZGVmYXVsdAorY29uc3RydWN0b3JzCis8YnI+Jm5ic3A7IDFHRFFEMzc6IElUUEpVSTpXSU4yMDAwIC0gT3Blbk9uU2VsZWN0aW9uIC0gT3BlbiBvbiBzZWxlY3Rpb24KK2ZhaWx1cmUKKzxicj4mbmJzcDsgMUdHWjJSNzogSVRQSlVJOldJTjIwMDAgLSBTZWFyY2ggZm9yIG1ldGhvZCByZWZzIGZhaWxlZAorPGJyPiZuYnNwOyAxR0tOWFg2OiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vIHNlbGVjdGlvbiBpZgordGFyZ2V0aW5nIG1lbWJlciB0eXBlIGluIGRlZmF1bHQgcGFja2FnZQorPGJyPiZuYnNwOyAxR0UzNEVFOiBJVFBKVUk6V0lOMjAwMCAtIE9wZW5PblNlbGVjdGlvbiAtIGluaXRpYWwgc2VsZWN0aW9uCit3cm9uZworPGJyPiZuYnNwOyAxR0tFRzczOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoICgxMzYpOiBtaXNzaW5nIGZpZWxkIGRlY2xhcmF0aW9uCis8YnI+Jm5ic3A7IDFHS0I5WUg6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2ggZm9yIGZpZWxkIHJlZnMgLSBpbmNvcnJlY3QKK3Jlc3VsdHMKKzxicj4mbmJzcDsgMUdKTDZFSjogSVRQSkNPUkU6V0lOTlQgLSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGg6CitDb21wYXJlcyBhZ2FpbnN0IHZhcmlhYmxlIG5hbWUKKzxicj4mbmJzcDsgMUdEUUVBUzogSVRQSlVJOkFMTCAtIEluZGV4ZXIgLSBkZWxldGUgdW51c2VkIGluZGV4ZXMgb24gSmF2YQorY29yZSBwbHVnLWluIHNodXRkb3duCis8YnI+Jm5ic3A7IDFHS000TTk6IElUUEpDT1JFOldJTk5UIC0gRENSOiBjb2RlIHNlbGVjdCBzaG91bGQgd29yayBvbiBkZWNsYXJhdGlvbnMKKzxicj4mbmJzcDsgMUcyTlpWVDogSVRQSlVJOldJTjIwMDAgLSBEQ1IgLSBPcGVuT25TZWxlY3Rpb24gLSBDb2RlIHJlc29sdmUKK2RvZXNuJ3Qgd29yayBmb3IgZGVjbGFyYXRpb25zCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKyZuYnNwOyAzMjIzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNlYXJjaCBmcm9tIGVkaXRvcidzIGNvbnRleHQKK21lbnUgZG9lc24ndCB3b3JrICgxR0FKQ0Q4KQorPGJyPiZuYnNwOyAzNDMzJm5ic3A7IHNlYXJjaDogbWlzc2luZyBmaWVsZCBvY2N1cnJlY25jZXMgKDFHS1o4SjYpCis8YnI+Jm5ic3A7IDMxNzYmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSkNLMS4zYSAtIFNUTVQgLSBTaW5nbGUgZGVjbGFyYXRpb24KK2luIHRyeSBibG9jayAoMUdMRFNIOSkKKzxicj4mbmJzcDsgMUdMME1OOTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbm90IGNvbnNpc3RlbnQgcmVzdWx0cyBmb3IKK25lc3RlZCB0eXBlcworPGJyPiZuYnNwOyAxR0w5VU1IOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHR5cGUgb2NjdXJyZW5jZXMKKzxicj4mbmJzcDsgMUdLWVhLNTogSVRQSlVJOldJTjIwMDAgLSB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cworPGJyPiZuYnNwOyAxR0VWNzhFOiBJVFBKVUk6V0lOMjAwMCAtIENvZGUgYXNzaXN0OiBwcml2YXRlIHN1cGVyY2xhc3MgbWV0aG9kcworc2hvdyB1cCwgYnV0IG90aGVycyBkb24ndAorPGJyPiZuYnNwOyAxR0RLS1RTOiBJVFBKVUk6V0lOTlQgLSBDb2RlQ29tcGxldGlvbiAtIGltcG9ydCBhc3Npc3Qgc2hvd3MKK2ludmlzaWJsZSB0eXBlcworPGJyPiZuYnNwOyAxRzczMTdPOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29kZUFzc2lzdCAtIGNvZGUgYXNzaXN0IHNob3dzCitpbnZpc2libGUgbWVtYmVycworPGJyPiZuYnNwOyAxR0tLOTMwOiBJVFBKQ09SRTpXSU5OVCAtIE5vIGNvZGUgYXNzaXN0IGZvciBJbm5lciB0eXBlCis8YnI+Jm5ic3A7IDFHSUlER1g6IElUUEpVSTpXSU5OVCAtIG9wZW4gb24gdHlwZTogZG9lcyBub3Qgd29yayBvbiBzb21lCit0eXBlcworPGJyPiZuYnNwOyAxR0tPRk82OiBJVFBKQ09SRTpXSU5OVCAtIEludGVybmFsIGVycm9yIHNlYXJjaGluZyBmb3IgY2xhc3MKK3JlZmVyZW5jZXMKKzxicj4mbmJzcDsgMUdLOTZBMDogSVRQSkNPUkU6V0lOTlQgLSBOUEUgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb24KKzxicj4mbmJzcDsgMUdLOUI1UTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzcyByZWZlcmVuY2Ugc2VhcmNoIGJyb2tlbgorPGJyPiZuYnNwOyAxR0JPRks1OiBJVFBKVUk6QUxMIC0gIlJlZmVyZW5jZXMgdG8iIG9uIG1ldGhvZHMgaW4gamFycworPGJyPiZuYnNwOyAxR0tFQ1dDOiBJVFBKQ09SRTpXSU5OVCAtIE9yZ2FuaXplIEltcG9ydHMgZmFpbHM6IFR5cGVyZWZzIG5vdAorY29tcGxldGUKKzxicj4mbmJzcDsgMUdLQ0gzTjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWV0aG9kIHJlZnMgLSBzdXBlciBjYWxsCitub3QgZm91bmQKKzxicj4mbmJzcDsgMUdLQjQ3NTogSVRQSkNPUkU6V0lOTlQgLSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uCitzZWFyY2hmb3IgbWV0aG9kcworPGJyPiZuYnNwOyAxR0pMNlYwOiBJVFBKQ09SRTpXSU5OVCAtIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aDoKK0lTdGF0dXMgdXNhZ2UKKzxicj4mbmJzcDsgMUdLTTFNVTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc3BhdGggdmFsaWRhdGlvbjogT3ZlcmxhcHBpbmcKK2FjY2VwdGVkCis8YnI+Jm5ic3A7IDFHSkw3UlM6IElUUEpDT1JFOldJTk5UIC0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoOgorbmVzdGVkIHNvdXJjZWZvbGRlcnMKKzxicj4mbmJzcDsgMUdLOU5CMDogSVRQSkNPUkU6V0lOMjAwMCAtIEFub3RoZXIgY29yZSBkdW1wIC0gc29ycnkKKzxicj4mbmJzcDsgMUdKWUczMzogSVRQSlVJOldJTjIwMDAgLSBDb3JlIGR1bXAgaW4gcnVuIHRpbWUgd29ya2JlbmNoIGluCitTZWFyY2gKKzxicj4mbmJzcDsgMUdLOVM1OTogSVRQSlVJOldJTjIwMDAgLSBJbnRlcm5hbCBlcnJvciB3aGVuIHN5bmNocm9uaXppbmcKKzxicj4mbmJzcDsgMUdMMlRaWTogSVRQSlVJOldJTjIwMDAgLSBDb2RlIENvbXBsZXRpb24gc2hvdWxkIG9ubHkgc2hvdyB2aXNpYmxlCitpdGVtcworPGJyPiZuYnNwOyAxR0tSTFo0OiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgb3ZlcnplYWxvdXMgd2l0aCBjb21tYXMKKzxicj4mbmJzcDsgMUdGOThSNDogSVRQSlVJOldJTk5UIC0gSk0gLSB3aHkgaXMgYSBmaWxlIEEuQi5qYXZhIHNlZW4gYXMKK2EgY29tcGlsYXRpb24gdW5pdD8KKzxicj4mbmJzcDsgMUc5OFhSNzogSVRQSkNPUkU6V0lOMjAwMCAtIEZlYXR1cmUgUmVxdWVzdCBmb3IgSmF2YURvYyBDb2RlQXNzaXN0Cis8aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMC4yMDIgLSBTcGV0ZW1iZXIgMjd0aCwgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorTmV3IEFTVCBub2RlIGZvciBlbXB0eSBzdGF0ZW1lbnRzIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkVtcHR5U3RhdGVtZW50KTwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsgaS5lLiAyIG1vcmUgQVBJcyBvbiB0aGUgQVNUIHZpc2l0b3IuIE5vdGU6IHRoaXMgd2FzIG5vdAorYW4gb2ZmaWNpYWwgQVBJCis8bGk+CitJU291cmNlRWxlbWVudFJlcXVlc3RvciBub3RpZmllcyBlbnRlci9leGl0IGluaXRpYWxpemVycyBpbnN0ZWFkIG9mIGp1c3QKK2FjY2VwdEluaXRpYWxpemVyLiBOb3RlOiB0aGlzIHdhcyBub3QgYW4gb2ZmaWNpYWwgQVBJPC9saT4KKworPGxpPgorU2VhcmNoIGluIGlubmVyLWNsYXNzZXMgbm93IHdvcmtzLiBJbmRleGVzIGFyZSByZWNvbXB1dGVkIGF1dG9tYXRpY2FsbHkKK29uIHN0YXJ0LXVwLjwvbGk+CisKKzxsaT4KKyZuYnNwOyBSZW1vdmVkIENvZGVBc3Npc3Qgb3B0aW9uIGZvciBodW5ncnkgbW9kZSAob3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmVudGlyZVdvcmRSZXBsYWNlbWVudCk8L2xpPgorCis8YnI+Jm5ic3A7Jm5ic3A7IENsaWVudCBjb2RlIGNhbiBkZWNpZGUgd2hldGhlciB1c2luZyBpbmZlcnJlZCBlbmQgcG9zaXRpb24KKyhodW5ncnkgYmVoYXZpb3IpIG9yIG9yaWdpbmFsIGN1cnNvciBsb2NhdGlvbiAoaW5zZXJ0IGJlaGF2aW9yKQorPGJyPiZuYnNwOyZuYnNwOyBiYXNlZCBvbiB0aGUga2V5c3Ryb2tlIChlbnRlci9pbnNlcnQ/KS4KKzxsaT4KKyZuYnNwOyBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3Igbm93IGNsZWFybHkKK3N0YXRlcyB0aGF0PC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgb3JkZXIgb2YgdGhlIHNlYXJjaCByZXN1bHQgaXMgdW5zcGVjaWZpZWQuPC91bD4KKworPGgyPgorUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KKyZuYnNwOyAxR0syQTQ1OiBJVFBKQ09SRTpXSU4yMDAwIC0gSkNLIDEuNCAtIHBvc3NpYmx5IGFzc2lnbmVkIHZhcmlhYmxlCithZnRlciBhc3NpZ25tZW50IGV4cHJlc3Npb24gd2hlbiB0cnVlCis8YnI+Jm5ic3A7IDFHSzI5UTg6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gcG9zc2libHkgYXNzaWduZWQgdmFsdWUKK29mIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgYWZ0ZXIgYSBjb25zdGFudCBib29sZWFuIGV4cHJlc3Npb24gd2hlbiBmYWxzZQorPGJyPiZuYnNwOyAxRzUyRjdQOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIGZpbmRzIGJvZ3VzIHJlZmVyZW5jZXMgdG8KK2NsYXNzCis8YnI+Jm5ic3A7IDFHNFROWDE6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gTm8gc2VhcmNoIGFub255bW91cyByZXN1bHRzCitpbiBpbm5lciBjbGFzc2VzCis8YnI+Jm5ic3A7IDFHSFcwQVo6IElUUEpDT1JFOldJTk5UIC0gSkNLIDEuNCAtIHVucmVhY2hhYmxlIGVtcHR5IHN0YXRlbWVudHMKKzxicj4mbmJzcDsgMUdLMkJMTTogSVRQSkNPUkU6V0lOMjAwMCAtIEpDSyAxLjQgLSBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhbHVlCithZnRlciB0aGUgYm9vbGVhbiBvcGVyYXRvciA/IDogd2hlbiB0cnVlCis8YnI+Jm5ic3A7IDFHS0IyOEE6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxlciBhY2NlcHRzIGluY29ycmVjdCBjb2RlCis8YnI+Jm5ic3A7IDFGTDRUMVE6IExGQ09NOldJTk5UIC0gSkNLIDEuNCAtIFZlcmlmeUVycm9yIGR1ZSB0byBhbiBpbGxlZ2FsCitqdW1wCis8YnI+Jm5ic3A7IDFHSzJCNkQ6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gZGVmaW5pdGVseSBhc3NpZ25lZCB2YWx1ZQorYmVmb3JlIHRoZSBzZWNvbmQgb3BlcmFuZCBvZiB0aGUgYm9vbGVhbiBvcGVyYXRvciAmYW1wOyZhbXA7Cis8YnI+Jm5ic3A7IDFHSzJBT0Y6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gYXNzaWduZWQgdmFyaWFibGUgYmVmb3JlCitmaW5hbGx5IGJsb2NrIGFmdGVyIHJldHVybiBzdGF0ZW1lbnQKKzxicj4mbmJzcDsgMUdLNldEMzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDpubyBmdWxseSBxdWFsaWZpZWQgcmVmZXJlbmNlcworYXJlIGZvdW5kCis8YnI+Jm5ic3A7IDFHSzcyMzE6IElUUEpDT1JFOldJTjIwMDAgLSB0eXBvcyBpbiBjb21tZW50cworPGJyPiZuYnNwOyAxR0s3N0hBOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIG1pc3NpbmcgYmFzZSB0eXBlIHJlZmVyZW5jZXMKKzxicj4mbmJzcDsgMUdKWTJYTjogSVRQSlVJOldJTjIwMDAgLSByZW5hbWUgdHlwZTogZXJyb3Igd2hlbiB3aXRoIHJlZmVyZW5jZQorPGJyPiZuYnNwOyAxR0sxSTJKOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnJva2VuIFNvdXJjZUVuZCBpbiBGb3JTdGF0ZW1lbnQKK2FuZCBXaGlsZVN0YXRlbWVudAorPGJyPiZuYnNwOyAxR0sxSFdZOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnJva2VuIHNvdXJjZUVuZCBpbiBmb3IgQXNzaWdubWVudAorYW5kIENvbXBvdW5kQXNzaWdubWVudAorPGJyPiZuYnNwOyAxR0lJQkMzOiBJVFBKQ09SRTpXSU5OVCAtIHNlYXJjaCBmb3IgbWV0aG9kIHJlZmVyZW5jZXMgLSBtaXNzaW5nCittYXRjaGVzCis8YnI+Jm5ic3A7IDFHR05PVEY6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIGRvZXNuJ3QgZmluZCBtZXRob2QgcmVmZXJlbmNlZAoraW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCis8YnI+Jm5ic3A7IDFHSzFHSkU6IElUUEpDT1JFOkFMTCAtIFNlYXJjaCAtIFN0cmluZ091dEJvdW5kc0V4Y2VwdGlvbiB3aGVuCitzZWFyY2hpbmcgcmVmZXJlbmNlcyBpbiBKQVIKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorJm5ic3A7MUdKWTNLRzogSVRQSlVJOldJTjIwMDAgLSBOUEUgaW4gamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlSW5mbworPGJyPiZuYnNwOyAxR0s5MEg0OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHBhY2thZ2UgcmVmZXJlbmNlCis8YnI+Jm5ic3A7IDFHSzhUWEU6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgZmllbGQgcmVmZXJlbmNlCis8YnI+Jm5ic3A7IDFHSzdLMTc6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgdHlwZSByZWZlcmVuY2UKKzxicj4mbmJzcDsgMUdLQ0pJTDogSVRQSkNPUkU6V0lOMjAwMCAtIGJ1aWxkIGV4Y2VwdGlvbiBpbiAxMzUKKzxicj4mbmJzcDsgMUdLNldQOTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYWNoOiBtaXNzaW5nIHR5cGUgcmVmZXJlbmNlCis8YnI+Jm5ic3A7IDFHSlpTQkU6IElUUEpDT1JFOldJTk5UIC0gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGR1cmluZworcmVidWlsZAorPGJyPiZuYnNwOyAxR0s3RTZTOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBTdHJpbmdJbmRleE91Zk9mQm91bmQKKzxicj4mbmJzcDsgMUdJVDg1NzogSVRQSkNPUkU6V0lOMjAwMCAtIFBlcmZvcm1hbmNlIC0gQ3RybCtTIHRyaWdnZXJzIGZpdmUKK3BhcnNlciBydW5zCis8YnI+Jm5ic3A7IDFHRUhDWUw6IElUUFVJOldJTk5UIC0gTWlub3I6IENvbG9uIGF0IHdyb25nIHBsYWNlIGluIGJ1aWxkCitkaWFsb2cKKzxicj4mbmJzcDsgMUZMVUJSUjogSlJJREU6V0lOTlQgLSBQcm9ibGVtczogaW5zdGFudGlhdGluZyBpbm5lciBjbGFzc2VzCis8YnI+Jm5ic3A7IDFGTFVPSkk6IEpSSURFOldJTk5UIC0gUHJvYmxlbXM6IHZhZ3VlIGVycm9yIG1lc3NhZ2Ugd2l0aCBpbGxlZ2FsCitjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCis8YnI+Jm5ic3A7IDFGTFpVRzU6IEpSSURFOldJTk5UIC0gUHJvYmxlbXM6IGludmFsaWQgZXhwcmVzc2lvbiBhcyBzdGF0ZW1lbnQKK2lzIG5vdCByZXBvcnRlZAorPGJyPiZuYnNwOyAxRkxaVjRNOiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiBpbnZhbGlkIGhleGEgbGl0ZXJhbCBudW1iZXIKK25vdCByZXBvcnRlZAorPGJyPiZuYnNwOyAxRkxaWUVTOiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiB0aGUgaW50ZXJmYWNlIGNhbm5vdCBkZWZpbmUKK2FuIGluaXRpYWxpemVyIGlzIG5vdCByZXBvcnRlZAorPGJyPiZuYnNwOyAxRlFWVEkxOiBMRkNPTTpXSU5OVCAtIENvbXBpbGVyIC0gTm8gaW1wbGljaXQgY29udmVyc2lvbiBzaG91bGQKK25vdCBnZW5lcmF0ZSBhY29uc3RudWxsCis8YnI+Jm5ic3A7IDFGVVpZWFQ6IElUUEpDT1JFOldJTk5UIC0gSk0gLSBTb3VyY2UgZm9yIEJpbmFyaWVzIGlzc3VlCis8YnI+Jm5ic3A7IDFGWDBMWjA6IElUUENPTTpBTEwgLSBSZXF1ZXN0IGZvciBjb21tZW50cyBwcmVjZWVkaW5nIGltcG9ydHMKKyZhbXA7IHBhY2thZ2UgZGVjbHMKKzxicj4mbmJzcDsgMUZXOEVOUDogSVRQSlVJOldJTjk4IC0gSkRPTSAtIERlbGV0aW5nIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20KK091dGxpbmUgb2JsaXRlcmF0ZXMgaW50ZXJ2ZW5pbmcgY29tbWVudHMKKzxicj4mbmJzcDsgMUc0UFdDNzogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBObyBtYXRjaGVzIHdpdGggY2xhc3MgZmlsZXMKKzxicj4mbmJzcDsgMUc4M1pLTDogSVRQSlVJOldJTk5UIC0gQ29tcGlsZXIgLSB1bmNsZWFyIGVycm9yIG1lc3NhZ2UgZm9yCithIHJlc2VydmVkIHdvcmQgdXNlZCBhcyBhbiBpZGVudGlmaWVyCis8YnI+Jm5ic3A7IDFHRjVXMVM6IElUUEpVSTpXSU4yMDAwIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIGluIExvb2t1cEVudmlyb25tZW50Cis8YnI+Jm5ic3A7IDFHS0YwMVM6IElUUEpDT1JFOldJTk5UIC0gU2V2ZXJlOiBpbnRlcm5hbCBlcnJvciBkdXJpbmcgc2VhcmNoCis8YnI+Jm5ic3A7IDFHRFZGUlg6IElUUEpVSTpXSU4yMDAwIC0gQ29kZUNvbXBsZXRpb24gLSBlYXRzIHRoZSBmb2xsb3dpbmcKK3dvcmQKKzxicj4mbmJzcDsgMUdGNjdKTTogSVRQSlVJOldJTjk4IC0gQ29kZUNvbXBsZXRpb24gLSBDb2RlLWFzc2lzdCBjb25zdW1lcworbmV4dCB0b2tlbgorPGJyPiZuYnNwOyAxR0NTSEFDOiBJVFBKQ09SRTpJbmNvbnNpc3RlbnQgY29kZWFzc2lzdCBiZWhhdmlvcgorPGJyPiZuYnNwOyAxR0NOQlRMOiBJVFBKQ09SRTpBTEwgLSBEQ1IgLSBKTSAtIFByb3ZpZGUgYSB3YXkgdG8gcmVhZCBKYXZhQ29yZQorZGVmYXVsdCBvcHRpb25zIGZyb20gdGhlIHBsdWdpbi54bWwgZmlsZQorPGJyPiZuYnNwOyAxR0FKQk9VOiBJVFBKVUk6V0lOTlQgLSBDb2RlIEFzc2lzdCBzaG93cyBtYXRjaGVzIGFmdGVyICgpCis8YnI+Jm5ic3A7IDFGVzhOVjY6IElUUEpDT1JFOkFMTCAtIERDUiAtIEpNIC0gTmVlZCBBUEkgZm9yIGNvbXBpbGVyIG9wdGlvbnMKKzxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitCdWlsZCAwLjIwMCAtIFNlcHRlbWJlciAxM3RoLCAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIwMAorPGgyPgorV2hhdCBpcyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorSkNLMS4zYSBjb21wbGlhbnQuPC9saT4KKworPGxpPgorQWRkZWQgMiBuZXcgQVBJcyBvbiBKYXZhQ29udmVudGlvbnMgZm9yIGNsYXNzcGF0aCB2YWxpZGF0aW9uLjwvbGk+CisKKzx1bD4KKzxsaT4KK0lKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdCitjbGFzc3BhdGgsIElQYXRoIG91dHB1dExvY2F0aW9uKTwvbGk+CisKKzxsaT4KK0lKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5CitlbnRyeSwgYm9vbGVhbiBjaGVja1NvdXJjZUF0dGFjaG1lbnQpPC9saT4KKzwvdWw+CisKKzxsaT4KK0FudCBFY2xpcHNlIGNvbXBpbGVyIHRhc2sgYWRkZWQgKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFudC5KZHRjb20pPC9saT4KKworPGxpPgorQXNzZXJ0aW9ucyBzdXBwb3J0IGVuYWJsZWQ6IGJ5IGRlZmF1bHQgdGhlIGNvbXBpbGVyIGlzIDEuMyBjb21wbGlhbnQsIGJ1dAoraXQgY2FuIG9wdGlvbmFsbHkgYmUgdHVybmVkIGludG8gc291cmNlIDEuNCBtb2RlIGNmLiBKYXZhQ29yZSBvcHRpb25zLjwvbGk+CisKKzxsaT4KK01vcmUgb3B0aW9ucyBhcmUgc3VyZmFjZWQgb24gSmF2YUNvcmUuIFNlZSBKYXZhQ29yZS5nZXREZWZhdWx0T3B0aW9ucygpCitmb3IgZGVzY3JpcHRpb24uPC9saT4KKworPHVsPgorPGxpPgorLi4uaW50ZXJuYWwuLi5Db25maWd1cmFibGVPcHRpb24gaGFzIGRpc2FwcGVhcmVkLjwvbGk+CisKKzxsaT4KK0V2YWx1YXRpb24gaW4gYmluYXJpZXMgaXMgZnVuY3Rpb25hbDwvbGk+Cis8L3VsPgorCis8bGk+CitTZWFyY2ggZm9yIHJlZmVyZW5jZXMgbm93IGZpbmRzIHJlc3VsdHMgaW4gYmluYXJpZXMuIEluZGV4ZXMgaW4gb2xkIHdvcmtzcGFjZXMKK2FyZSByZWNvbXB1dGVkIHdoZW4gcmVzdGFydGVkIHdoaWNoIG1heSByZXN1bHQgaW4gbG9uZ2VyIHN0YXJ0dXAgdGltZXMuPC9saT4KKzwvdWw+CisKKzxoMj4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDI+CisxR0VLS1VPOiBJVFBKQ09SRTpBTEwgLSBKTSAtIFV0aWwucmVhZENvbnRlbnRzQXNCeXRlcyhJbnB1dFN0cmVhbSkgZG9lc24ndAorYWxsb3cgZm9yIHNpemUgaGludAorPGJyPjFHQlJQU0o6IElUUEpDT1JFOk9wdGlvbnMgLSBzaG91bGQgc3VyZmFjZSB0aGUgY29kZSBmb3JtYXR0ZXIgb3B0aW9ucworb24gSmF2YUNvcmUKKzxicj4xR0pVM1lWOiBJVFBKQ09SRTpBTEwgLSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gc2Nhbm5lcgorPGJyPjFHSkwxUjU6IElUUEpDT1JFOkFMTCAtIE5QRSBpbiBDbGFzc0ZpbGUuZ2V0U291cmNlUmFuZ2UKKzxicj4xR0g0OVhSOiBJVFBKVUk6V0lOMjAwMCAtIE9yZ2FuaXplIEltcG9ydHMgaW5zZXJ0cyBib2d1cyBpbXBvcnQKKzxicj4xR0pVM084OiBJVFBKQ09SRTpXSU5OVCAtIHR5cGUgaGllcmFyY2h5OiBOUEUKKzxicj4xR0pJWUtQOiBJVFBKQ09SRTpXSU5OVCAtIHR5cGUgaGllcmFyY2h5IC0gY29udGFpbnMgdW5yZWxhdGVkIHR5cGVzCis8YnI+MUdJVEZRUjogSVZKSURUOldJTjIwMDAgLSBXcm9uZyBieXRlIGNvZGUgZ2VuZXJhdGlvbiwgSW5jb25zaXN0ZW50CitzdGFjayBoZWlnaHQgMSAhPSAwIGVycm9yCis8YnI+MUdJSFVRUDogSVRQSkNPUkU6V0lOTlQgLSBzZWFyY2ggZm9yIHN0YXRpYyBmaWVsZCBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZQorPGJyPjFHSVQ2Nlg6IElUUEpDT1JFOldJTk5UIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gY2FsbGluZyBDb2RlQXNzaXN0Cis8YnI+MUdKQTBXRzogSVRQSkNPUkU6V0lOTlQgLSBBYm9ydENvbXBpbGF0aW9uVW5pdCB3aGVuIGRvaW5nIGEgU2VhcmNoCis8YnI+MUdINDlIVzogSVRQSlVJOldJTk5UIC0gU2VhcmNoIGZ1bmN0aW9uYWxpdHkgaXMgbWlzbGVhZGluZyB3aGVuIHZpZXdpbmcKK3NvdXJjZSBmcm9tIGphcgorPGJyPjFHRlhQRTU6IElUUEpVSTpBTEwgLSBTZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIGJyb2tlbgorPGJyPjFHRk0zWDM6IElUUEpVSTpXSU5OVCAtIFdyb25nIGNvZGUgZm9ybWF0dGVyIGRlZmF1bHQgZm9yIGtlZXBpbmcgZWxzZQorb24gc2FtZSBsaW5lCis8YnI+MUdIU003QjogSVRQSlVJOkFMTCAtIGZvcm1hdHRpbmcgb2YgYW5vbnltb3VzIGNsYXNzZXMKKzxicj4xR0dQVkhOOiBJVFBKVUk6V0lOMjAwMCAtIE5vdCBnZXR0aW5nIGhvdmVyIEphdmFkb2MgZm9yIElTZWxlY3Rpb24KKzxicj4xR0UyTE8yOiBJVFBKQ09SRTpXSU4yMDAwIC0gU291cmNlU3RhcnQgYW5kIFNvdXJjZUVuZCBvZiBzeW5jaHJvbml6ZWQKK3N0YXRlbWVudAorPGJyPjFHSVVUSVo6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IGNhc2Ugc3RhdGVtZW50IGRvZXNuJ3QgY292ZXIgY2FzZQora2V5d29yZAorPGJyPjFHSVRDQ1k6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IHN0cmFuZ2UgTG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZAorPGJyPjFHSVJRRlc6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IHdyb25nIHNvdXJjZSBlbmQgaWYgc3Vibm9kZSBpcyBvZgordHlwZSBBbm5vbnltb3VzVHlwZURlY2xhcmF0aW9uCis8YnI+MUdJUkhSUDogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogd3Jvbmcgc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBpbgorU3luY2hyb25pemVkU3RhdGVtZW50Cis8YnI+MUdIVUFVTzogSVRQSkNPUkU6QUxMIC0gUmVuYW1pbmcgYW4gZWxlbWVudCBpbiBhIHdvcmtpbmcgY29weSBjb3JydXB0cwordGhlIHdvcmtpbmcgY29weQorPGJyPjFHSFVBTTE6IElUUEpDT1JFOkFMTCAtIE5QRSB3aGVuIHJlbmFtaW5nIGFuIGVsZW1lbnQgaW4gYSB3b3JraW5nIGNvcHkKKzxicj4xR0hEQTJWOiBJVFBKQ09SRTpXSU5OVCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGRvaW5nIGEgc2VhcmNoCis8YnI+MUdGWTAyQjogSVRQSlVJOkFMTCAtIERlbGV0ZSBhIG1ldGhvZCBhbmQgc2F2aW5nIGludHJvZHVjZXMgZXh0cmEgbGluZXMKKzxicj4xR0ZPRk1EOiBJVFBKVUk6V0lOMjAwMCAtIE5ldyBjbGFzcyBzaG91bGQgaGF2ZSBzcGFjZSBiZXR3ZWVuIHBhY2thZ2UKK2FuZCBjbGFzcyBkZWNscworPGJyPjFHSTNSMUk6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxhdGlvbiBlcnJvciBldmFsdWF0aW5nIHN1cGVyIGV4cHJlc3Npb24KK2luIGRlYnVnZ2VyCis8YnI+MUdJSTA3VjogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnRyYXZlcnNlIGRvZXNuJ3QKK2NhbGwgdmlzaXRvci5lbmRWaXNpdAorPGJyPjFHSVIzNDU6IElUUEpDT1JFOkFMTCAtIEluZGV4ZXI6IE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCis8YnI+MUdJUkMyMzogSVRQSkNPUkU6QUxMIC0gQ29kZUZvcm1hdHRlciBicmFjZSBvbiBuZXcgbGluZSBwcm9ibGVtCis8YnI+MUdJVDhTQTogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogd3Jvbmcgc291cmNlRW5kIGlmIGFjdGlvbiBpcyBCbG9jaworPGJyPjFHSVVRVkw6IElUUEpDT1JFOldJTk5UIC0gSUNsYXNzUGF0aEVudHJ5OiBqYXZhIGRvYyBpbmNvcnJlY3QKKzxicj4xR0lWR01IOiBJVFBKVUk6QUxMIC0gRUM6IEphdmFkb2MgaG92ZXJoZWxwIGluY29ycmVjdGx5IHVzZXMgZmlyc3QKK29mIG11bHRpcGxlIGNvbW1lbnRzCis8YnI+MUdJWUtTUjogSVRQSkNPUkU6V0lOMjAwMCAtIEFzdDogRmllbGREZWNsYXJhdGlvbi50cmF2ZXJzZSBpbXBsZW1ldGVkCitkaWZmZXJlbnRseQorPGJyPjFHSTNORDU6IElUUEpDT1JFOldJTk5UIC0gUG90ZW50aWFsIG9wdGltaXphdGlvbiBkdXJpbmcgSUIgcHJvYmxlbQorZ2VuZXJhdGlvbgorPGJyPjFHRkJWWkg6IElUUFVJOldJTjIwMDAgLSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IEphdmEgZWRpdG9yCis8YnI+MUdJNTA5RTogSVRQSkNPUkU6V0lOTlQgLSBJSmF2YVByb2plY3QuZ2V0Tm9uSmF2YVJlc291cmNlcyByZXR1cm5zCitqYXZhIGFuZCBjbGFzcyBmaWxlcworPGJyPjFHSTJXQVc6IElUUEpDT1JFOldJTk5UIC0gVG9vIG1hbnkgcmVzdWx0cyBmb3IgZGVmYXVsdCBwYWNrYWdlCis8YnI+MUdIUVo5SDogSVRQSlVJOkFMTCAtIFdhbGtiYWNrIGRvaW5nIGEgc2VhcmNoCis8YnI+MUdHWVQzUzogSVRQSkNPUkU6V0lOTlQgLSBqYXZhY29udmVudGlvbnM6OnZhbGlkYXRlUGFja2FnZU5hbWUgYW5kCitkZWZhdWx0IHBhY2thZ2UKKzxicj4xR0Y5ODU2OiBJVFBKQ09SRTpXSU5OVCAtIEpNIC0gSmF2YUNvbnZlbnRpb25zOjp2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUKKzxicj4xR0Y4MjJQOiBJVFBKQ09SRTpXSU4yMDAwIC0gTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gaW4gUGFyc2VyCis8YnI+MUdJNlQ0WTogSVRQSkNPUkU6V0lOTlQgLSBOUEUgaW4gSmF2YU1vZGVNYW5hZ2VyIHJldHJpZXZpbmcgd29ya3NwYWNlCitvcHRpb25zCis8YnI+MUdFNElMUjogSVRQSkNPUkU6QUxMIC0gRXZhbCAtIEV2YWx1YXRpb24gaW4gQmluYXJ5IFByb2plY3QgZmFpbHMKKzxicj4xR0kzTExDOiBJVFBKQ09SRTpBTEwgLSBJbmNvcnJlY3QgZm9ybWF0dGluZyBmb3IgdGhlIG5ldyBrZXl3b3JkCis8YnI+MUdIVTZPNTogSVRQSkNPUkU6V0lOTlQgLSBSTUlDIHRlc3QgZmFpbAorPGJyPjFHSEg2Tzc6IElUUEpDT1JFOkFMTCAtIE5lZWQgdG8gdHVuZSB0aGUgZXhjZXB0aW9uIGFuYWx5c2lzIGZvciBBc3NlcnRTdGF0ZW1lbnQKKzxicj4xR0hVVzdUOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnVpbGQgUHJvYmxlbQorPGJyPjFHSTNJRzk6IElUUEpDT1JFOkFMTCAtIGludGVybmFsIGNvbXBpbGVyIGVycm9yIGludm9sdmluZyBib2d1cyBtZXRob2QvZmllbGQKK2RlY2xhcmF0aW9uCis8YnI+MUdIVTRQSzogSVRQSkNPUkU6V0lOTlQgLSBOb1N1Y2hNZXRob2RFcnJvciB3aGVuIHJ1bm5pbmcgcHJvZ3JhbQorPGJyPjFHSE9OQVg6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxlciB1c2VzIGRpZmZlcmVudCBuYW1lIGxvb2t1cCBmb3IKK3JlZmFjdG9yaW5nCis8YnI+MUdFSllBSjogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGVyIC0gQmluZGluZyBvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlCitpcyBudWxsCis8YnI+MUdIRkhXUjogSVRQSkNPUkU6QUxMIC0gQXNzZXJ0aW9uczogQ29kZUFzc2lzdCBhbmQgU2VsZWN0aW9uIG5lZWQgdG8KK2JlIHVwZGF0ZWQKKzxicj4xR0hGSFhHOiBJVFBKQ09SRTpBTEwgLSBBc3NlcnRpb25zOiBBZGQgb3B0aW9uYWwgd2FybmluZyBvbiBhc3NlcnQKK2lkZW50aWZpZXIKKzxicj4xR0NaOVZNOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29tcGlsZXIgLSBCYXRjaCBjb21waWxlciBzaG91bGQKK2JlIEFQSQorPGJyPjFHSE82UVI6IElUUEpDT1JFOldJTk5UIC0gQ29kZSBBc3Npc3QgLSBubyBtZXRob2QgY29tcGxldGlvbiB3aGVuIHJldHVybgordHlwZSBpcyBzZWNvbmRhcnkgb25lCis8YnI+MUdIMEFVNzogSVRQSkNPUkU6QUxMIC0gRXZhbCAtIFZlcmlmeUVycm9yIGluIHNjcmFwYm9vayBwYWdlCis8YnI+MUdIMlI2MjogSVRQSkNPUkU6V0lOMjAwMCAtIFR5cG8gaW4gcHJvZ3Jlc3MgbWVzc2FnZQorPGJyPjFHR1lMMzI6IElUUEpDT1JFOkFMTCAtIERlZmF1bHQgc3VwZXJ0eXBlcyBhcmUgbm90IHZpc2libGUgd2hlbiBxdWFsaWZpZWQKKzxicj4xR0RGSkswOiBJVkpJRFQ6V0lOMjAwMCAtIFVzaW5nICdzeW5jaHJvbml6ZWQnIHByb2R1Y2VzIGludmFsaWQgZXhjZXB0aW9uCit0YWJsZSB2YWx1ZXMgaW4gY2xhc3MsIGNhdXNlcyAiSWxsZWdhbCBleGNlcHRpb24gdGFibGUgcmFuZ2UiIGV4Y2VwdGlvbiwKK1ZBSiAzLjUrCis8YnI+MUdHQUs2RzogSVRQSkNPUkU6QUxMIC0gSW5jb3JyZWN0IGphdmFkb2MgY29tbWVudCBpbiBKYXZhRWxlbWVudAorPGJyPjFHRjlMM0s6IElUUERVSTpBTEwgLSBFdmFsIC0gUHJpdmF0ZSBhcnJheSByZXNvbHV0aW9uIGZhaWx1cmUKKzxicj4xR0Y4S0hYOiBJVFBKVUk6QUxMIC0gSW52YWxpZCBwcm9qZWN0IGJ1aWxkIHBhdGggc2hvdWxkIGJlIHdhcm5pbmcsCitub3QgZXJyb3IKKzxicj4xR0Y3SklIOiBJVFBKQ09SRTpBTEwgLSBFeGNlcHRpb24gd2hlbiByZW1vdmluZyBuZXR3b3JrIGRyaXZlCis8YnI+MUdFWUJMOTogSVRQSlVJOldJTk5UIC0gQWRkaW5nIHNvdXJjZSBmb2xkZXJzIG9uIENQIGlzIHZlcnkgY29uZnVzaW5nCis8YnI+MUdFSkFPVDogSVRQSlVJOldJTk5UIC0gSlJFIFNvdXJjZSBhdHRhY2htZW50IHNldCB0byBwYXRoIHRvIGRvZXMgbm90CitleGlzdAorPGJyPjFHRUhaTkI6IElUUEpVSTpXSU5OVCAtIHNtb2tlIDExNDogZm9ybWF0dGVyIGluc2VydHMgZXh0cmEgdGFiIGluIGZpcnN0CitsaW5lCis8YnI+MUdDWlpUNDogSVRQSkNPUkU6RmF1bHQtdG9sZXJhbmNlIC0gbWlzc2luZyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCitjb3VsZCBzdGlsbCBhbnN3ZXIgdGhlIGFsbG9jYXRlZCB0eXBlCis8YnI+MUdBVTk2UDogSVRQSkNPUkU6V0lOTlQgLSBEQ1IgLSBKTSAtIEphdmFQcm9qZWN0IHNob3VsZCBwcm92aWRlIGEgY2xhc3MKK3BhdGggdmFsaWRhdGlvbiBtZXRob2QKKzxicj4xRzdBMVRMOiBJVFBKQ09SRTpXSU5OVCAtIERDUiAtIEpNIC0gUnVsZXMgZm9yIGNsYXNzcGF0aCBub3Qgc3BlY2lmaWVkCis8YnI+MUZWVldaVDogSVRQSkNPUkU6QUxMIC0gSk0gLSBJQmluYXJ5VHlwZSBzaG91bGQgaW1wbGVtZW50IGdldFNvdXJjZUZpbGVOYW1lKCkKKzxicj4mbmJzcDsKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvbkVuZ2luZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMTIxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvbkVuZ2luZS5qYXZhCkBAIC0wLDAgKzEsMjcwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CYXNpY0NvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5UeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNvdXJjZSBjb21wbGV0aW9ucy4KKyAqIEl0IGNvbnRhaW5zIHR3byBwdWJsaWMgQVBJcyB1c2VkIHRvIGNhbGwgQ29kZUFzc2lzdCBvbiBhIGdpdmVuIHNvdXJjZSB3aXRoCisgKiBhIGdpdmVuIGVudmlyb25tZW50LCBhc3Npc3RpbmcgcG9zaXRpb24gYW5kIHN0b3JhZ2UgKGFuZCBwb3NzaWJseSBvcHRpb25zKS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbXBsZXRpb25FbmdpbmUKKwlleHRlbmRzIEVuZ2luZQorCWltcGxlbWVudHMgSVNlYXJjaFJlcXVlc3RvciwgVHlwZUNvbnN0YW50cyAsIElUZXJtaW5hbFN5bWJvbHMgLCBSZWxldmFuY2VDb25zdGFudHMgeworCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIEVSUk9SX1BBVFRFUk4gPSAiKmVycm9yKiIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRVhDRVBUSU9OX1BBVFRFUk4gPSAiKmV4Y2VwdGlvbioiLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFNFTUlDT0xPTiA9IG5ldyBjaGFyW10geyAnOycgfTsKKwlUeXBlQmluZGluZ1tdIGV4cGVjdGVkVHlwZXM7CisJCisJYm9vbGVhbiBhc3Npc3ROb2RlSXNDbGFzczsKKwlib29sZWFuIGFzc2lzdE5vZGVJc0V4Y2VwdGlvbjsKKwlib29sZWFuIGFzc2lzdE5vZGVJc0ludGVyZmFjZTsKKwkKKwlDb21wbGV0aW9uUGFyc2VyIHBhcnNlcjsKKwlJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3I7CisJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKKwljaGFyW10gc291cmNlOworCWNoYXJbXSB0b2tlbjsKKwlib29sZWFuIHJlc29sdmluZ0ltcG9ydHMgPSBmYWxzZTsKKwlib29sZWFuIGluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSA9IGZhbHNlOworCWludCBzdGFydFBvc2l0aW9uLCBhY3R1YWxDb21wbGV0aW9uUG9zaXRpb24sIGVuZFBvc2l0aW9uLCBvZmZzZXQ7CisJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25Qa2dzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKKwlIYXNodGFibGVPZk9iamVjdCBrbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKKwlTY2FubmVyIG5hbWVTY2FubmVyOworCisJLyoKKwkJc3RhdGljIGZpbmFsIGNoYXJbXVtdIG1haW5EZWNsYXJhdGlvbnMgPQorCQkJbmV3IGNoYXJbXVtdIHsKKwkJCQkicGFja2FnZSIudG9DaGFyQXJyYXkoKSwKKwkJCQkiaW1wb3J0Ii50b0NoYXJBcnJheSgpLAorCQkJCSJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKSwKKwkJCQkiZmluYWwiLnRvQ2hhckFycmF5KCksCisJCQkJInB1YmxpYyIudG9DaGFyQXJyYXkoKSwKKwkJCQkiY2xhc3MiLnRvQ2hhckFycmF5KCksCisJCQkJImludGVyZmFjZSIudG9DaGFyQXJyYXkoKX07CisJCisJCXN0YXRpYyBmaW5hbCBjaGFyW11bXSBtb2RpZmllcnMgPSAvLyBtYXkgd2FudCBmaWVsZCwgbWV0aG9kLCB0eXBlICYgbWVtYmVyIHR5cGUgbW9kaWZpZXJzCisJCQluZXcgY2hhcltdW10geworCQkJCSJhYnN0cmFjdCIudG9DaGFyQXJyYXkoKSwKKwkJCQkiZmluYWwiLnRvQ2hhckFycmF5KCksCisJCQkJIm5hdGl2ZSIudG9DaGFyQXJyYXkoKSwKKwkJCQkicHVibGljIi50b0NoYXJBcnJheSgpLAorCQkJCSJwcm90ZWN0ZWQiLnRvQ2hhckFycmF5KCksCisJCQkJInByaXZhdGUiLnRvQ2hhckFycmF5KCksCisJCQkJInN0YXRpYyIudG9DaGFyQXJyYXkoKSwKKwkJCQkic3RyaWN0ZnAiLnRvQ2hhckFycmF5KCksCisJCQkJInN5bmNocm9uaXplZCIudG9DaGFyQXJyYXkoKSwKKwkJCQkidHJhbnNpZW50Ii50b0NoYXJBcnJheSgpLAorCQkJCSJ2b2xhdGlsZSIudG9DaGFyQXJyYXkoKX07CisJKi8KKwlzdGF0aWMgZmluYWwgY2hhcltdW10gYmFzZVR5cGVzID0gbmV3IGNoYXJbXVtdIHsgCisJCSJib29sZWFuIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCSJieXRlIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCSJjaGFyIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCSJkb3VibGUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJImZsb2F0Ii50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCSJpbnQiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJImxvbmciLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJInNob3J0Ii50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCSJ2b2lkIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJfTsKKwkJCisJc3RhdGljIGZpbmFsIGNoYXJbXSBjbGFzc0ZpZWxkID0gImNsYXNzIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBjaGFyW10gbGVuZ3RoRmllbGQgPSAibGVuZ3RoIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBjaGFyW10gVEhJUyA9ICJ0aGlzIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBjaGFyW10gVEhST1dTID0gInRocm93cyIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKKwkKKwlzdGF0aWMgSW52b2NhdGlvblNpdGUgRmFrZUludm9jYXRpb25TaXRlID0gbmV3IEludm9jYXRpb25TaXRlKCl7CisJCXB1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKXsgcmV0dXJuIGZhbHNlOyB9CisJCXB1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpeyByZXR1cm4gZmFsc2U7IH0KKwkJcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7fQorCQlwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpe30KKwkJcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpe30KKwl9OworCisJLyoqCisJICogVGhlIENvbXBsZXRpb25FbmdpbmUgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyBzb3VyY2UgY29tcGxldGlvbnMuCisJICoKKwkgKiBJdCByZXF1aXJlcyBhIHNlYXJjaGFibGUgbmFtZSBlbnZpcm9ubWVudCwgd2hpY2ggc3VwcG9ydHMgc29tZQorCSAqIHNwZWNpZmljIHNlYXJjaCBBUElzLCBhbmQgYSByZXF1ZXN0b3IgdG8gZmVlZCBiYWNrIHRoZSByZXN1bHRzIHRvIGEgVUkuCisJICoKKwkgKiAgQHBhcmFtIG5hbWVFbnZpcm9ubWVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudAorCSAqICAgICAgdXNlZCB0byByZXNvbHZlIHR5cGUvcGFja2FnZSByZWZlcmVuY2VzIGFuZCBzZWFyY2ggZm9yIHR5cGVzL3BhY2thZ2VzCisJICogICAgICBiYXNlZCBvbiBwYXJ0aWFsIG5hbWVzLgorCSAqCisJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSUNvbXBsZXRpb25SZXF1ZXN0b3IKKwkgKiAgICAgIHNpbmNlIHRoZSBlbmdpbmUgbWlnaHQgcHJvZHVjZSBhbnN3ZXJzIG9mIHZhcmlvdXMgZm9ybXMsIHRoZSBlbmdpbmUgCisJICogICAgICBpcyBhc3NvY2lhdGVkIHdpdGggYSByZXF1ZXN0b3IgYWJsZSB0byBhY2NlcHQgYWxsIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorCSAqCisJICogIEBwYXJhbSBzZXR0aW5ncyBqYXZhLnV0aWwuTWFwCisJICoJCXNldCBvZiBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjb2RlIGFzc2lzdCBlbmdpbmUuCisJICovCisJcHVibGljIENvbXBsZXRpb25FbmdpbmUoCisJCUlTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudCwKKwkJSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlNYXAgc2V0dGluZ3MpIHsKKworCQlzdXBlcihzZXR0aW5ncyk7CisJCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOworCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IG5hbWVFbnZpcm9ubWVudDsKKworCQlwcm9ibGVtUmVwb3J0ZXIgPSBuZXcgUHJvYmxlbVJlcG9ydGVyKAorCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLAorCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkgeworCQkJCQlwdWJsaWMgdm9pZCByZWNvcmQoSVByb2JsZW0gcHJvYmxlbSwgQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCwgUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CisJCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkgJiYgKHByb2JsZW0uZ2V0SUQoKSAmIElQcm9ibGVtLlN5bnRheCkgIT0gMCkgeworCQkJCQkJCUNvbXBsZXRpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuYWNjZXB0RXJyb3IocHJvYmxlbSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KTsKKwkJdGhpcy5wYXJzZXIgPQorCQkJbmV3IENvbXBsZXRpb25QYXJzZXIocHJvYmxlbVJlcG9ydGVyLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5hc3NlcnRNb2RlKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgdGhpcy5jb21waWxlck9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgbmFtZUVudmlyb25tZW50KTsKKwkJdGhpcy5uYW1lU2Nhbm5lciA9CisJCQluZXcgU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5hc3NlcnRNb2RlKTsKKwl9CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgY2xhc3MuCisJICoKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgaW50IG1vZGlmaWVycykgeworCisJCWNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCAnLicpOworCQljaGFyW10gY29tcGxldGlvbk5hbWUgPSBmdWxseVF1YWxpZmllZE5hbWU7CisJCQorCQlpZiAodGhpcy5rbm93blR5cGVzLmNvbnRhaW5zS2V5KGNvbXBsZXRpb25OYW1lKSkgcmV0dXJuOworCisJCXRoaXMua25vd25UeXBlcy5wdXQoY29tcGxldGlvbk5hbWUsIHRoaXMpOworCQkKKwkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJaWYgKHJlc29sdmluZ0ltcG9ydHMpIHsKKwkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY29tcGxldGlvbk5hbWUsIFNFTUlDT0xPTik7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgZnVsbHlRdWFsaWZpZWROYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlKSB7CisJCQkJaWYgKG11c3RRdWFsaWZ5VHlwZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgeworCQkJCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkKKwkJCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IE5vQ2hhckNoYXIpCisJCQkJCQkJcmV0dXJuOyAvLyBpZ25vcmUgdHlwZXMgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIGZyb20gb3V0c2lkZSBpdAorCQkJCX0gZWxzZSB7CisJCQkJCWNvbXBsZXRpb25OYW1lID0gY2xhc3NOYW1lOworCQkJCX0KKwkJCX0KKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBjbGFzc05hbWUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oY2xhc3NOYW1lKTsKKwkJfQorCisJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcygKKwkJCXBhY2thZ2VOYW1lLAorCQkJY2xhc3NOYW1lLAorCQkJY29tcGxldGlvbk5hbWUsCisJCQltb2RpZmllcnMsCisJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQlyZWxldmFuY2UpOworCX0KKwkKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgaW50ZXJmYWNlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuSSIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJY2hhcltdIGludGVyZmFjZU5hbWUsCisJCWludCBtb2RpZmllcnMpIHsKKworCQljaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsICcuJyk7CisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsKKworCQlpZiAodGhpcy5rbm93blR5cGVzLmNvbnRhaW5zS2V5KGNvbXBsZXRpb25OYW1lKSkgcmV0dXJuOworCisJCXRoaXMua25vd25UeXBlcy5wdXQoY29tcGxldGlvbk5hbWUsIHRoaXMpOworCisJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCWlmIChyZXNvbHZpbmdJbXBvcnRzKSB7CisJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNvbXBsZXRpb25OYW1lLCBuZXcgY2hhcltdIHsgJzsnIH0pOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIGZ1bGx5UXVhbGlmaWVkTmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgeworCQkJCWlmIChtdXN0UXVhbGlmeVR5cGUocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUpKSB7CisJCQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJCQkJaWYgKHVuaXRTY29wZSAhPSBudWxsICYmIHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gTm9DaGFyQ2hhcikKKwkJCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CisJCQkJfSBlbHNlIHsKKwkJCQkJY29tcGxldGlvbk5hbWUgPSBpbnRlcmZhY2VOYW1lOworCQkJCX0KKwkJCX0KKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBpbnRlcmZhY2VOYW1lKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShwYWNrYWdlTmFtZSwgaW50ZXJmYWNlTmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQl9CisJCQorCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAorCQkJcGFja2FnZU5hbWUsCisJCQlpbnRlcmZhY2VOYW1lLAorCQkJY29tcGxldGlvbk5hbWUsCisJCQltb2RpZmllcnMsCisJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQlyZWxldmFuY2UpOworCX0KKworCS8qKgorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBwYWNrYWdlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpIHsKKworCQlpZiAodGhpcy5rbm93blBrZ3MuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSByZXR1cm47CisKKwkJdGhpcy5rbm93blBrZ3MucHV0KHBhY2thZ2VOYW1lLCB0aGlzKTsKKwkJCisJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBwYWNrYWdlTmFtZSk7CisKKwkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UoCisJCQlwYWNrYWdlTmFtZSwKKwkJCXJlc29sdmluZ0ltcG9ydHMKKwkJCQk/IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBuZXcgY2hhcltdIHsgJy4nLCAnKicsICc7JyB9KQorCQkJCTogcGFja2FnZU5hbWUsCisJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQlyZWxldmFuY2UpOworCX0KKworCS8qKgorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyB0eXBlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKSB7CisKKwkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgJy4nKTsKKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lID0gZnVsbHlRdWFsaWZpZWROYW1lOworCQkKKwkJaWYgKHRoaXMua25vd25UeXBlcy5jb250YWluc0tleShjb21wbGV0aW9uTmFtZSkpIHJldHVybjsKKworCQl0aGlzLmtub3duVHlwZXMucHV0KGNvbXBsZXRpb25OYW1lLCB0aGlzKTsKKworCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQlpZiAocmVzb2x2aW5nSW1wb3J0cykgeworCQkJY29tcGxldGlvbk5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChjb21wbGV0aW9uTmFtZSwgbmV3IGNoYXJbXSB7ICc7JyB9KTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBmdWxseVF1YWxpZmllZE5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKKwkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpIHsKKwkJCQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoID09IDApCisJCQkJCQlpZiAodW5pdFNjb3BlICE9IG51bGwgJiYgdW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBOb0NoYXJDaGFyKQorCQkJCQkJCXJldHVybjsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQKKwkJCQl9IGVsc2UgeworCQkJCQljb21wbGV0aW9uTmFtZSA9IHR5cGVOYW1lOworCQkJCX0KKwkJCX0KKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCB0eXBlTmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lKTsKKwkJfQorCQkKKwkJcmVxdWVzdG9yLmFjY2VwdFR5cGUoCisJCQlwYWNrYWdlTmFtZSwKKwkJCXR5cGVOYW1lLAorCQkJY29tcGxldGlvbk5hbWUsCisJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQlyZWxldmFuY2UpOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wbGV0ZShBc3ROb2RlIGFzdE5vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKKworCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCk7CisJCQorCQlpZihwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7CisJCQljb21wdXRlRXhwZWN0ZWRUeXBlcyhwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCwgc2NvcGUpOworCQl9CisKKwkJLy8gZGVmYXVsdHMuLi4gc29tZSBub2RlcyB3aWxsIGNoYW5nZSB0aGVzZQorCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkVHlwZSkgeworCisJCQlDb21wbGV0aW9uT25GaWVsZFR5cGUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGRUeXBlKSBhc3ROb2RlOworCQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0gKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIGZpZWxkLnR5cGU7CisJCQl0b2tlbiA9IHR5cGUudG9rZW47CisJCQlzZXRTb3VyY2VSYW5nZSh0eXBlLnNvdXJjZVN0YXJ0LCB0eXBlLnNvdXJjZUVuZCk7CisJCQkvLwkJZmluZEtleXdvcmRzKHRva2VuLCBtb2RpZmllcnMsIHNjb3BlKTsgLy8gY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgZmllbGQsIG1ldGhvZCBvciBtZW1iZXIgdHlwZQorCQkJZmluZFR5cGVzQW5kUGFja2FnZXModG9rZW4sIHNjb3BlKTsKKwkJCQorCQkJaWYoIWZpZWxkLmlzTG9jYWxWYXJpYWJsZSAmJiBmaWVsZC5tb2RpZmllcnMgPT0gQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVmYXVsdCkgeworCQkJCWZpbmRNZXRob2RzKHRva2VuLG51bGwsc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLHNjb3BlLG5ldyBPYmplY3RWZWN0b3IoKSxmYWxzZSxmYWxzZSx0cnVlLG51bGwsbnVsbCxmYWxzZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZihhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSkgeworCQkJCQorCQkJCUNvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUgbWV0aG9kID0gKENvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUpIGFzdE5vZGU7CisJCQkJU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0gKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIG1ldGhvZC5yZXR1cm5UeXBlOworCQkJCXRva2VuID0gdHlwZS50b2tlbjsKKwkJCQlzZXRTb3VyY2VSYW5nZSh0eXBlLnNvdXJjZVN0YXJ0LCB0eXBlLnNvdXJjZUVuZCk7CisJCQkJZmluZFR5cGVzQW5kUGFja2FnZXModG9rZW4sIHNjb3BlKTsKKwkJCQkKKwkJCQlpZihtZXRob2QubW9kaWZpZXJzID09IENvbXBpbGVyTW9kaWZpZXJzLkFjY0RlZmF1bHQpIHsKKwkJCQkJZmluZE1ldGhvZHModG9rZW4sbnVsbCxzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksc2NvcGUsbmV3IE9iamVjdFZlY3RvcigpLGZhbHNlLGZhbHNlLHRydWUsbnVsbCxudWxsLGZhbHNlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCQorCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQorCQkJCQl0b2tlbiA9ICgoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgYXN0Tm9kZSkudG9rZW47CisJCQkJCWZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKAorCQkJCQkJdG9rZW4sCisJCQkJCQlzY29wZSwKKwkJCQkJCShDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKSBhc3ROb2RlLAorCQkJCQkJc2NvcGUpOworCQkJCQkvLyBjYW4gYmUgdGhlIHN0YXJ0IG9mIGEgcXVhbGlmaWVkIHR5cGUgbmFtZQorCQkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOworCQorCQkJCX0gZWxzZSB7CisJCisJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQorCQkJCQkJdG9rZW4gPSAoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIGFzdE5vZGUpLnRva2VuOworCQkJCQkJCisJCQkJCQlhc3Npc3ROb2RlSXNDbGFzcyA9IGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZTsKKwkJCQkJCWFzc2lzdE5vZGVJc0V4Y2VwdGlvbiA9IGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2U7CisJCQkJCQlhc3Npc3ROb2RlSXNJbnRlcmZhY2UgPSBhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSW50ZXJmYWNlUmVmZXJlbmNlOworCQorCQkJCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUKKwkJCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWZpbmRNZW1iZXJUeXBlcygKKwkJCQkJCQkJdG9rZW4sCisJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCQorCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCisJCQkJCQkJaW5zaWRlUXVhbGlmaWVkUmVmZXJlbmNlID0gdHJ1ZTsKKwkJCQkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIHJlZiA9CisJCQkJCQkJCShDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBhc3ROb2RlOworCQkJCQkJCXRva2VuID0gcmVmLmNvbXBsZXRpb25JZGVudGlmaWVyOworCQkJCQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYuc291cmNlUG9zaXRpb25zLmxlbmd0aCAtIDFdOworCQorCQkJCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgVmFyaWFibGVCaW5kaW5nKSB7CisJCisJCQkJCQkJCXNldFNvdXJjZVJhbmdlKChpbnQpIChjb21wbGV0aW9uUG9zaXRpb24gPj4+IDMyKSwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gKChWYXJpYWJsZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcpLnR5cGU7CisJCQkJCQkJCWlmIChyZWNlaXZlclR5cGUgIT0gbnVsbCkgeworCQkJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHModG9rZW4sIHJlY2VpdmVyVHlwZSwgc2NvcGUsIHJlZiwgc2NvcGUsZmFsc2UpOworCQkJCQkJCQl9CisJCisJCQkJCQkJfSBlbHNlIHsKKwkKKwkJCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCisJCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nOworCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQorCQkJCQkJCQkJZmluZE1lbWJlclR5cGVzKHRva2VuLCByZWNlaXZlclR5cGUsIHNjb3BlLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOworCQorCQkJCQkJCQkJZmluZENsYXNzRmllbGQodG9rZW4sIChUeXBlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOworCQorCQkJCQkJCQkJZmluZEZpZWxkcygKKwkJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQkJCQkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJCXJlZiwKKwkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQlmYWxzZSk7CisJCisJCQkJCQkJCQlmaW5kTWV0aG9kcygKKwkJCQkJCQkJCQl0b2tlbiwKKwkJCQkJCQkJCQludWxsLAorCQkJCQkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQkJCQkJCQkJdHJ1ZSwKKwkJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCQlyZWYsCisJCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQkJZmFsc2UpOworCQorCQkJCQkJCQl9IGVsc2UgeworCQorCQkJCQkJCQkJaWYgKHF1YWxpZmllZEJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQorCQkJCQkJCQkJCXNldFNvdXJjZVJhbmdlKGFzdE5vZGUuc291cmNlU3RhcnQsIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CisJCQkJCQkJCQkJLy8gcmVwbGFjZSB0byB0aGUgZW5kIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKKwkJCQkJCQkJCQlmaW5kVHlwZXNBbmRTdWJwYWNrYWdlcyh0b2tlbiwgKFBhY2thZ2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkKKwkJCQkJCX0gZWxzZSB7CisJCisJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQorCQkJCQkJCQlpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOworCQkJCQkJCQkKKwkJCQkJCQkJYXNzaXN0Tm9kZUlzQ2xhc3MgPSBhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkQ2xhc3NSZWZlcmVuY2U7CisJCQkJCQkJCWFzc2lzdE5vZGVJc0V4Y2VwdGlvbiA9IGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2U7CisJCQkJCQkJCWFzc2lzdE5vZGVJc0ludGVyZmFjZSA9IGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRJbnRlcmZhY2VSZWZlcmVuY2U7CisJCQkJCQkJCQorCQkJCQkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHJlZiA9CisJCQkJCQkJCQkoQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgYXN0Tm9kZTsKKwkJCQkJCQkJdG9rZW4gPSByZWYuY29tcGxldGlvbklkZW50aWZpZXI7CisJCQkJCQkJCWxvbmcgY29tcGxldGlvblBvc2l0aW9uID0gcmVmLnNvdXJjZVBvc2l0aW9uc1tyZWYudG9rZW5zLmxlbmd0aF07CisJCisJCQkJCQkJCS8vIGdldCB0aGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyCisJCQkJCQkJCWlmIChxdWFsaWZpZWRCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQorCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkJCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCQkJCQkJCXRva2VuLAorCQkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSk7CisJCisJCQkJCQkJCX0gZWxzZSB7CisJCisJCQkJCQkJCQlpZiAocXVhbGlmaWVkQmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCisJCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgKGludCkgY29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQkJCQkvLyByZXBsYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcgorCQkJCQkJCQkJCWZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKHRva2VuLCAoUGFja2FnZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCisJCQkJCQkJfSBlbHNlIHsKKwkKKwkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MpIHsKKwkKKwkJCQkJCQkJCUNvbXBsZXRpb25Pbk1lbWJlckFjY2VzcyBhY2Nlc3MgPSAoQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSBhc3ROb2RlOworCQkJCQkJCQkJbG9uZyBjb21wbGV0aW9uUG9zaXRpb24gPSBhY2Nlc3MubmFtZVNvdXJjZVBvc2l0aW9uOworCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoKGludCkgKGNvbXBsZXRpb25Qb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBjb21wbGV0aW9uUG9zaXRpb24pOworCQkJCQkKKwkJCQkJCQkJCXRva2VuID0gYWNjZXNzLnRva2VuOworCQorCQkJCQkJCQkJZmluZEZpZWxkc0FuZE1ldGhvZHMoCisJCQkJCQkJCQkJdG9rZW4sCisJCQkJCQkJCQkJKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLAorCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCWFjY2VzcywKKwkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQlmYWxzZSk7CisJCisJCQkJCQkJCX0gZWxzZSB7CisJCisJCQkJCQkJCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kKSB7CisJCisJCQkJCQkJCQkJQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQpIGFzdE5vZGU7CisJCQkJCQkJCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9CisJCQkJCQkJCQkJCWNvbXB1dGVUeXBlcyhtZXNzYWdlU2VuZC5hcmd1bWVudHMsIChCbG9ja1Njb3BlKSBzY29wZSk7CisJCQkJCQkJCQkJdG9rZW4gPSBtZXNzYWdlU2VuZC5zZWxlY3RvcjsKKwkJCQkJCQkJCQlpZiAocXVhbGlmaWVkQmluZGluZyA9PSBudWxsKSB7CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlmaW5kSW1wbGljaXRNZXNzYWdlU2VuZHModG9rZW4sIGFyZ1R5cGVzLCBzY29wZSwgbWVzc2FnZVNlbmQsIHNjb3BlKTsKKwkJCQkJCQkJCQl9IGVsc2UgeworCQorCQkJCQkJCQkJCQlmaW5kTWV0aG9kcygKKwkJCQkJCQkJCQkJCXRva2VuLAorCQkJCQkJCQkJCQkJYXJnVHlwZXMsCisJCQkJCQkJCQkJCQkoUmVmZXJlbmNlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywKKwkJCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCQkJbmV3IE9iamVjdFZlY3RvcigpLAorCQkJCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJCQkJZmFsc2UsCisJCQkJCQkJCQkJCQltZXNzYWdlU2VuZCwKKwkJCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCQkJZmFsc2UpOworCQkJCQkJCQkJCX0KKwkKKwkJCQkJCQkJCX0gZWxzZSB7CisJCisJCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgeworCQorCQkJCQkJCQkJCQlDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwgPQorCQkJCQkJCQkJCQkJKENvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBhc3ROb2RlOworCQkJCQkJCQkJCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0KKwkJCQkJCQkJCQkJCWNvbXB1dGVUeXBlcyhjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzLCAoQmxvY2tTY29wZSkgc2NvcGUpOworCQkJCQkJCQkJCQlmaW5kQ29uc3RydWN0b3JzKAorCQkJCQkJCQkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsCisJCQkJCQkJCQkJCQlhcmdUeXBlcywKKwkJCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCQkJY29uc3RydWN0b3JDYWxsLAorCQkJCQkJCQkJCQkJZmFsc2UpOworCQorCQkJCQkJCQkJCX0gZWxzZSB7CisJCisJCQkJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwkKKwkJCQkJCQkJCQkJCUNvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwcmVzc2lvbiA9CisJCQkJCQkJCQkJCQkJKENvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSBhc3ROb2RlOworCQkJCQkJCQkJCQkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9CisJCQkJCQkJCQkJCQkJY29tcHV0ZVR5cGVzKGFsbG9jRXhwcmVzc2lvbi5hcmd1bWVudHMsIChCbG9ja1Njb3BlKSBzY29wZSk7CisJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gKFJlZmVyZW5jZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmc7CisJCQkJCQkJCQkJCQlpZihyZWYuaXNDbGFzcygpKSB7CisJCQkJCQkJCQkJCQkJaWYoIXJlZi5pc0Fic3RyYWN0KCkpIHsKKwkJCQkJCQkJCQkJCQkJZmluZENvbnN0cnVjdG9ycygKKwkJCQkJCQkJCQkJCQkJCXJlZiwKKwkJCQkJCQkJCQkJCQkJCWFyZ1R5cGVzLAorCQkJCQkJCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQkJCQkJCQlhbGxvY0V4cHJlc3Npb24sCisJCQkJCQkJCQkJCQkJCQlmYWxzZSk7CisJCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJaWYoIXJlZi5pc0ZpbmFsKCkpeworCQkJCQkJCQkJCQkJCWZpbmRBbm9ueW1vdXNUeXBlKAorCQkJCQkJCQkJCQkJCQlyZWYsCisJCQkJCQkJCQkJCQkJCWFyZ1R5cGVzLAorCQkJCQkJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCQkJCQkJYWxsb2NFeHByZXNzaW9uKTsKKwkJCQkJCQkJCQkJCX0KKwkKKwkJCQkJCQkJCQkJfSBlbHNlIHsKKwkKKwkJCQkJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKSB7CisJCQkJCQkJCQkJCQkJQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzIGFjY2VzcyA9IChDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MpIGFzdE5vZGU7CisJCQkJCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoYWNjZXNzLmNsYXNzU3RhcnQsIGFjY2Vzcy5zb3VyY2VFbmQpOworCQkJCQkJCQkJCisJCQkJCQkJCQkJCQkJdG9rZW4gPSBhY2Nlc3MuY29tcGxldGlvbklkZW50aWZpZXI7CisJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCQlmaW5kQ2xhc3NGaWVsZCh0b2tlbiwgKFR5cGVCaW5kaW5nKSBxdWFsaWZpZWRCaW5kaW5nLCBzY29wZSk7CisJCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCWlmKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25NZXRob2ROYW1lKSB7CisJCQkJCQkJCQkJCQkJCUNvbXBsZXRpb25Pbk1ldGhvZE5hbWUgbWV0aG9kID0gKENvbXBsZXRpb25Pbk1ldGhvZE5hbWUpIGFzdE5vZGU7CisJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UobWV0aG9kLnNvdXJjZVN0YXJ0LCBtZXRob2Quc2VsZWN0b3JFbmQpOworCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5maWVsZHMoKTsKKwkJCQkJCQkJCQkJCQkJY2hhcltdW10gZXhjbHVkZU5hbWVzID0gbmV3IGNoYXJbZmllbGRzLmxlbmd0aF1bXTsKKwkJCQkJCQkJCQkJCQkJZm9yKGludCBpID0gMCA7IGkgPCBmaWVsZHMubGVuZ3RoIDsgaSsrKXsKKwkJCQkJCQkJCQkJCQkJCWV4Y2x1ZGVOYW1lc1tpXSA9IGZpZWxkc1tpXS5uYW1lOworCQkJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkJCQl0b2tlbiA9IG1ldGhvZC5zZWxlY3RvcjsKKwkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCQkJCWZpbmRWYXJpYWJsZU5hbWVzKHRva2VuLCBtZXRob2QucmV0dXJuVHlwZSwgZXhjbHVkZU5hbWVzKTsKKwkJCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkTmFtZSkgeworCQkJCQkJCQkJCQkJCQkJQ29tcGxldGlvbk9uRmllbGROYW1lIGZpZWxkID0gKENvbXBsZXRpb25PbkZpZWxkTmFtZSkgYXN0Tm9kZTsKKwkJCQkJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkJCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmZpZWxkcygpOworCQkJCQkJCQkJCQkJCQkJY2hhcltdW10gZXhjbHVkZU5hbWVzID0gbmV3IGNoYXJbZmllbGRzLmxlbmd0aF1bXTsKKwkJCQkJCQkJCQkJCQkJCWZvcihpbnQgaSA9IDAgOyBpIDwgZmllbGRzLmxlbmd0aCA7IGkrKyl7CisJCQkJCQkJCQkJCQkJCQkJZXhjbHVkZU5hbWVzW2ldID0gZmllbGRzW2ldLm5hbWU7CisJCQkJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCQkJCXRva2VuID0gZmllbGQucmVhbE5hbWU7CisJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCQkJCWZpbmRWYXJpYWJsZU5hbWVzKGZpZWxkLnJlYWxOYW1lLCBmaWVsZC50eXBlLCBleGNsdWRlTmFtZXMpOworCQkJCQkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Mb2NhbE5hbWUgfHwKKwkJCQkJCQkJCQkJCQkJCQlhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKXsKKwkJCQkJCQkJCQkJCQkJCQlMb2NhbERlY2xhcmF0aW9uIHZhcmlhYmxlID0gKExvY2FsRGVjbGFyYXRpb24pIGFzdE5vZGU7CisJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBsb2NhbHMgPSAoKEJsb2NrU2NvcGUpc2NvcGUpLmxvY2FsczsKKwkJCQkJCQkJCQkJCQkJCQljaGFyW11bXSBleGNsdWRlTmFtZXMgPSBuZXcgY2hhcltsb2NhbHMubGVuZ3RoXVtdOworCQkJCQkJCQkJCQkJCQkJCWludCBsb2NhbENvdW50ID0gMDsKKwkJCQkJCQkJCQkJCQkJCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxvY2Fscy5sZW5ndGggOyBpKyspeworCQkJCQkJCQkJCQkJCQkJCQlpZihsb2NhbHNbaV0gIT0gbnVsbCkgeworCQkJCQkJCQkJCQkJCQkJCQkJZXhjbHVkZU5hbWVzW2xvY2FsQ291bnQrK10gPSBsb2NhbHNbaV0ubmFtZTsKKwkJCQkJCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVOYW1lcywgMCwgZXhjbHVkZU5hbWVzID0gbmV3IGNoYXJbbG9jYWxDb3VudF1bXSwgMCwgbG9jYWxDb3VudCk7CisJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCQkJCQkJaWYodmFyaWFibGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25Mb2NhbE5hbWUpeworCQkJCQkJCQkJCQkJCQkJCQl0b2tlbiA9ICgoQ29tcGxldGlvbk9uTG9jYWxOYW1lKSB2YXJpYWJsZSkucmVhbE5hbWU7CisJCQkJCQkJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJCQkJCQkJdG9rZW4gPSAoKENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSkgdmFyaWFibGUpLnJlYWxOYW1lOworCQkJCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCQkJCQlmaW5kVmFyaWFibGVOYW1lcyh0b2tlbiwgdmFyaWFibGUudHlwZSwgZXhjbHVkZU5hbWVzKTsKKwkJCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBjb21wbGV0ZShJVHlwZSB0eXBlLCBjaGFyW10gc25pcHBldCwgaW50IHBvc2l0aW9uLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsIGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIGJvb2xlYW4gaXNTdGF0aWMpewkKKwkJVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgVHlwZUNvbnZlcnRlcigpOworCQkKKwkJSVR5cGUgdG9wTGV2ZWxUeXBlID0gdHlwZTsKKwkJd2hpbGUodG9wTGV2ZWxUeXBlLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsKSB7CisJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQl9CisJCQorCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgodG9wTGV2ZWxUeXBlLmdldEVsZW1lbnROYW1lKCkgKyAiLmphdmEiKS50b0NoYXJBcnJheSgpLCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOyAvLyROT04tTkxTLTEkCisJCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0LCAwKTsKKwkKKwkJdHJ5IHsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBjb252ZXJ0ZXIuYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZSwgY29tcGlsYXRpb25Vbml0LCBjb21waWxhdGlvblJlc3VsdCwgcHJvYmxlbVJlcG9ydGVyKTsKKwkJCisJCQlpZih0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgewkKKwkJCQkvLyBidWlsZCBBU1QgZnJvbSBzbmlwcGV0CisJCQkJSW5pdGlhbGl6ZXIgZmFrZUluaXRpYWxpemVyID0gcGFyc2VTbmlwcGVJbml0aWFsaXplcihzbmlwcGV0LCBwb3NpdGlvbiwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgbG9jYWxWYXJpYWJsZU5hbWVzLCBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCBpc1N0YXRpYyk7CisJCQkJCisJCQkJLy8gbWVyZ2UgQVNUCisJCQkJRmllbGREZWNsYXJhdGlvbltdIG9sZEZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJCQkJRmllbGREZWNsYXJhdGlvbltdIG5ld0ZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW29sZEZpZWxkcy5sZW5ndGggKyAxXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEZpZWxkcywgMCwgbmV3RmllbGRzLCAwLCBvbGRGaWVsZHMubGVuZ3RoKTsKKwkJCQluZXdGaWVsZHNbb2xkRmllbGRzLmxlbmd0aF0gPSBmYWtlSW5pdGlhbGl6ZXI7CisJCQkJdHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IG5ld0ZpZWxkczsKKwkJCisJCQkJaWYoREVCVUcpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTTklQUEVUIENPTVBMRVRJT04gQVNUIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcGlsYXRpb25Vbml0LnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoY29tcGlsYXRpb25Vbml0LnR5cGVzICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKGNvbXBpbGF0aW9uVW5pdCk7CisJCQkJCisJCQkJCQlpZiAoKHVuaXRTY29wZSA9IGNvbXBpbGF0aW9uVW5pdC5zY29wZSkgIT0gbnVsbCkgeworCQkJCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7CisJCQkJCQkJY29tcGlsYXRpb25Vbml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOworCQkJCQkJCWNvbXBpbGF0aW9uVW5pdC5yZXNvbHZlKCk7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKENvbXBsZXRpb25Ob2RlRm91bmQgZSkgeworCQkJCQkJLy8JCQkJCWNvbXBsZXRpb25Ob2RlRm91bmQgPSB0cnVlOworCQkJCQkJaWYgKGUuYXN0Tm9kZSAhPSBudWxsKSB7CisJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCisJCQkJCQkJY29tcGxldGUoZS5hc3ROb2RlLCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEbyBub3RoaW5nCisJCX0KKwl9CisJCisJcHJpdmF0ZSBJbml0aWFsaXplciBwYXJzZVNuaXBwZUluaXRpYWxpemVyKGNoYXJbXSBzbmlwcGV0LCBpbnQgcG9zaXRpb24sIGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIGNoYXJbXVtdIGxvY2FsVmFyaWFibGVOYW1lcywgaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycywgYm9vbGVhbiBpc1N0YXRpYyl7CisJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXByZWZpeC5hcHBlbmQoInB1YmxpYyBjbGFzcyBGYWtlVHlwZSB7XG4gIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYoaXNTdGF0aWMpIHsKKwkJCXByZWZpeC5hcHBlbmQoInN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXByZWZpeC5hcHBlbmQoIntcbiIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxWYXJpYWJsZVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgeworCQkJcHJlZml4LmFwcGVuZChBc3ROb2RlLm1vZGlmaWVyc1N0cmluZyhsb2NhbFZhcmlhYmxlTW9kaWZpZXJzW2ldKSk7CisJCQlwcmVmaXguYXBwZW5kKCcgJyk7CisJCQlwcmVmaXguYXBwZW5kKGxvY2FsVmFyaWFibGVUeXBlTmFtZXNbaV0pOworCQkJcHJlZml4LmFwcGVuZCgnICcpOworCQkJcHJlZml4LmFwcGVuZChsb2NhbFZhcmlhYmxlTmFtZXNbaV0pOworCQkJcHJlZml4LmFwcGVuZCgnOycpOworCQl9CisJCQorCQljaGFyW10gZmFrZVNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeC50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIHNuaXBwZXQsICJ9fSIudG9DaGFyQXJyYXkoKSk7Ly8kTk9OLU5MUy0xJCAKKwkJb2Zmc2V0ID0gcHJlZml4Lmxlbmd0aCgpOworCQkKKwkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBmYWtlVW5pdCA9IG5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdCgKKwkJCWZha2VTb3VyY2UsIAorCQkJbnVsbCwKKwkJCSJGYWtlVHlwZS5qYXZhIiwgLy8kTk9OLU5MUy0xJAorCQkJZW5jb2RpbmcpOyAKKwkJCQorCQlhY3R1YWxDb21wbGV0aW9uUG9zaXRpb24gPSBwcmVmaXgubGVuZ3RoKCkgKyBwb3NpdGlvbiAtIDE7CisJCQkKKwkJQ29tcGlsYXRpb25SZXN1bHQgZmFrZVJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChmYWtlVW5pdCwgMSwgMSwgdGhpcy5jb21waWxlck9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gZmFrZUFTVCA9IHBhcnNlci5kaWV0UGFyc2UoZmFrZVVuaXQsIGZha2VSZXN1bHQsIGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbik7CisJCQorCQlwYXJzZU1ldGhvZChmYWtlQVNULCBhY3R1YWxDb21wbGV0aW9uUG9zaXRpb24pOworCQkKKwkJcmV0dXJuIChJbml0aWFsaXplcilmYWtlQVNULnR5cGVzWzBdLmZpZWxkc1swXTsKKwl9CisKKwkvKioKKwkgKiBBc2sgdGhlIGVuZ2luZSB0byBjb21wdXRlIGEgY29tcGxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisJICogb2YgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisJICoKKwkgKiAgQHJldHVybiB2b2lkCisJICogICAgICBjb21wbGV0aW9uIHJlc3VsdHMgYXJlIGFuc3dlcmVkIHRocm91Z2ggYSByZXF1ZXN0b3IuCisJICoKKwkgKiAgQHBhcmFtIHNvdXJjZVVuaXQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0CisJICogICAgICB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCisJICoKKwkgKiAgQHBhcmFtIGNvbXBsZXRpb25Qb3NpdGlvbiBpbnQKKwkgKiAgICAgIGEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgY29tcGxldGlvbiBpcyB0YWtpbmcgcGxhY2UuIAorCSAqICAgICAgVGhpcyBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc291cmNlIHByb3ZpZGVkLgorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgaW50IGNvbXBsZXRpb25Qb3NpdGlvbiwgaW50IG9mZnNldCkgeworCisJCWlmKERFQlVHKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50KCJDT01QTEVUSU9OIElOICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50KHNvdXJjZVVuaXQuZ2V0RmlsZU5hbWUoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50KCIgQVQgUE9TSVRJT04gIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihjb21wbGV0aW9uUG9zaXRpb24pOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDT01QTEVUSU9OIC0gU291cmNlIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZVVuaXQuZ2V0Q29udGVudHMoKSk7CisJCX0KKwkJdHJ5IHsKKwkJCWFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiA9IGNvbXBsZXRpb25Qb3NpdGlvbiAtIDE7CisJCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKKwkJCS8vIGZvciBub3cgdW50aWwgd2UgY2FuIGNoYW5nZSB0aGUgVUkuCisJCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMSwgMSwgdGhpcy5jb21waWxlck9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHJlc3VsdCwgYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKworCQkJLy8JCWJvb2xlYW4gY29tcGxldGlvbk5vZGVGb3VuZCA9IGZhbHNlOworCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgeworCQkJCWlmKERFQlVHKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ09NUExFVElPTiAtIERpZXQgQVNUIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VkVW5pdC50b1N0cmluZygpKTsKKwkJCQl9CisKKwkJCQkvLyBzY2FuIHRoZSBwYWNrYWdlICYgaW1wb3J0IHN0YXRlbWVudHMgZmlyc3QKKwkJCQlpZiAocGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UpIHsKKwkJCQkJZmluZFBhY2thZ2VzKChDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlKSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBwYXJzZWRVbml0LmltcG9ydHM7CisJCQkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IGltcG9ydHNbaV07CisJCQkJCQlpZiAoaW1wb3J0UmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKSB7CisJCQkJCQkJZmluZEltcG9ydHMoKENvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZSkgaW1wb3J0UmVmZXJlbmNlKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocGFyc2VkVW5pdC50eXBlcyAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsKKworCQkJCQkJaWYgKCh1bml0U2NvcGUgPSBwYXJzZWRVbml0LnNjb3BlKSAhPSBudWxsKSB7CisJCQkJCQkJc291cmNlID0gc291cmNlVW5pdC5nZXRDb250ZW50cygpOworCQkJCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOworCQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJcGFyc2VNZXRob2QocGFyc2VkVW5pdCwgYWN0dWFsQ29tcGxldGlvblBvc2l0aW9uKTsKKwkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNPTVBMRVRJT04gLSBBU1QgOiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZWRVbml0LnRvU3RyaW5nKCkpOworCQkJCQkJCX0KKwkJCQkJCQlwYXJzZWRVbml0LnJlc29sdmUoKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29tcGxldGlvbk5vZGVGb3VuZCBlKSB7CisJCQkJCQkvLwkJCQkJY29tcGxldGlvbk5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQlpZiAoZS5hc3ROb2RlICE9IG51bGwpIHsKKwkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJDT01QTEVUSU9OIC0gQ29tcGxldGlvbiBub2RlIDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuYXN0Tm9kZS50b1N0cmluZygpKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCisJCQkJCQkJY29tcGxldGUoZS5hc3ROb2RlLCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBJZ25vcmUgcGFja2FnZSwgaW1wb3J0LCBjbGFzcyAmIGludGVyZmFjZSBrZXl3b3JkcyBmb3Igbm93Li4uCisJCQkJCWlmICghY29tcGxldGlvbk5vZGVGb3VuZCkgeworCQkJCQkJaWYgKHBhcnNlZFVuaXQgPT0gbnVsbCB8fCBwYXJzZWRVbml0LnR5cGVzID09IG51bGwpIHsKKwkJCQkJCQkvLyB0aGlzIGlzIG5vdCBnb29kIGVub3VnaC4uLiBjYW4gc3RpbGwgYmUgdHJ5aW5nIHRvIGRlZmluZSBhIHNlY29uZCB0eXBlCisJCQkJCQkJQ29tcGxldGlvblNjYW5uZXIgc2Nhbm5lciA9IChDb21wbGV0aW9uU2Nhbm5lcikgcGFyc2VyLnNjYW5uZXI7CisJCQkJCQkJc2V0U291cmNlUmFuZ2Uoc2Nhbm5lci5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQsIHNjYW5uZXIuY29tcGxldGVkSWRlbnRpZmllckVuZCk7CisJCQkJCQkJZmluZEtleXdvcmRzKHNjYW5uZXIuY29tcGxldGlvbklkZW50aWZpZXIsIG1haW5EZWNsYXJhdGlvbnMsIG51bGwpOworCQkJCQkJfQorCQkJCQkJLy8gY3VycmVudGx5IGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgZXh0ZW5kcy9pbXBsZW1lbnRzIGFyZSBwb3NzaWJsZSBrZXl3b3JkcworCQkJCQl9CisJCQkqLworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gd29yay1hcm91bmQgaW50ZXJuYWwgZmFpbHVyZSAtIDFHRU1GNkQKKwkJfSBjYXRjaCAoSW52YWxpZEN1cnNvckxvY2F0aW9uIGUpIHsgLy8gbWF5IGV2ZW50dWFsbHkgcmVwb3J0IGEgdXNlZnVsbCBlcnJvcgorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIGZvciBub3cgc2luY2UgaXQgdHlwaWNhbGx5IG1lYW5zIHdlIGNhbm5vdCBmaW5kIGphdmEubGFuZy5PYmplY3QKKwkJfSBjYXRjaCAoQ29tcGxldGlvbk5vZGVGb3VuZCBlKXsgLy8gaW50ZXJuYWwgZmFpbHVyZSAtIGJ1Z3MgNTYxOAorCQl9IGZpbmFsbHkgeworCQkJcmVzZXQoKTsKKwkJfQorCX0KKworCXByaXZhdGUgVHlwZUJpbmRpbmdbXSBjb21wdXRlVHlwZXMoRXhwcmVzc2lvbltdIGFyZ3VtZW50cywgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1thcmdzTGVuZ3RoXTsKKwkJZm9yIChpbnQgYSA9IGFyZ3NMZW5ndGg7IC0tYSA+PSAwOykKKwkJCWFyZ1R5cGVzW2FdID0gYXJndW1lbnRzW2FdLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJcmV0dXJuIGFyZ1R5cGVzOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZmluZEFub255bW91c1R5cGUoCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCisJCVNjb3BlIHNjb3BlLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCWlmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQljaGFyW10gY29tcGxldGlvbiA9IFR5cGVDb25zdGFudHMuTm9DaGFyOworCQkJLy8gbm90aGluZyB0byBpbnNlcnQgLSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBzZWxlY3RvciAmIGFyZ3VtZW50cworCQkJaWYgKHNvdXJjZSA9PSBudWxsCisJCQkJfHwgc291cmNlLmxlbmd0aCA8PSBlbmRQb3NpdGlvbgorCQkJCXx8IHNvdXJjZVtlbmRQb3NpdGlvbl0gIT0gJyknKQorCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsgJyknIH07CisJCQkKKwkJCXJlcXVlc3Rvci5hY2NlcHRBbm9ueW1vdXNUeXBlKAorCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyQ2hhciwKKwkJCQlUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXIsCisJCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyLAorCQkJCWNvbXBsZXRpb24sCisJCQkJSUNvbnN0YW50cy5BY2NQdWJsaWMsCisJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJUl9ERUZBVUxUKTsKKwkJfSBlbHNlIHsKKwkJCWZpbmRDb25zdHJ1Y3RvcnMoCisJCQkJY3VycmVudFR5cGUsCisJCQkJYXJnVHlwZXMsCisJCQkJc2NvcGUsCisJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJdHJ1ZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZENsYXNzRmllbGQoY2hhcltdIHRva2VuLCBUeXBlQmluZGluZyByZWNlaXZlclR5cGUsIFNjb3BlIHNjb3BlKSB7CisKKwkJaWYgKHRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKHRva2VuLmxlbmd0aCA8PSBjbGFzc0ZpZWxkLmxlbmd0aAorCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGNsYXNzRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCisJCSkpIHsKKwkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgY2xhc3NGaWVsZCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoc2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpKTsKKwkJCQkKKwkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKKwkJCQlOb0NoYXIsCisJCQkJTm9DaGFyLAorCQkJCWNsYXNzRmllbGQsCisJCQkJTm9DaGFyLAorCQkJCU5vQ2hhciwKKwkJCQljbGFzc0ZpZWxkLAorCQkJCUNvbXBpbGVyTW9kaWZpZXJzLkFjY1N0YXRpYyB8IENvbXBpbGVyTW9kaWZpZXJzLkFjY1B1YmxpYywKKwkJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCXJlbGV2YW5jZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZENvbnN0cnVjdG9ycygKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywKKwkJU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlib29sZWFuIGZvckFub255bW91c1R5cGUpIHsKKworCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCWlmKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJaW50IG1pbkFyZ0xlbmd0aCA9IGFyZ1R5cGVzID09IG51bGwgPyAwIDogYXJnVHlwZXMubGVuZ3RoOworCQkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQkJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IG1ldGhvZHNbZl07CisJCQkJaWYgKGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCQkKKwkJCQkJaWYgKGNvbnN0cnVjdG9yLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQkKKwkJCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5CisJCQkJCQkmJiAhY29uc3RydWN0b3IuY2FuQmVTZWVuQnkoaW52b2NhdGlvblNpdGUsIHNjb3BlKSkgY29udGludWUgbmV4dDsKKwkKKwkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IucGFyYW1ldGVyczsKKwkJCQkJaW50IHBhcmFtTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJCQkJCWlmIChtaW5BcmdMZW5ndGggPiBwYXJhbUxlbmd0aCkKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOykKKwkJCQkJCWlmIChhcmdUeXBlc1thXSAhPSBudWxsKSAvLyBjYW4gYmUgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgcHJvcGVybHkKKwkJCQkJCQlpZiAoIXNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShhcmdUeXBlc1thXSwgY29uc3RydWN0b3IucGFyYW1ldGVyc1thXSkpCisJCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOworCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltwYXJhbUxlbmd0aF1bXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CisJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVyc1tpXTsKKwkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQl9CisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yLHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQorCQkJCQljaGFyW10gY29tcGxldGlvbiA9IFR5cGVDb25zdGFudHMuTm9DaGFyOworCQkJCQkvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzCisJCQkJCWlmIChzb3VyY2UgPT0gbnVsbAorCQkJCQkJfHwgc291cmNlLmxlbmd0aCA8PSBlbmRQb3NpdGlvbgorCQkJCQkJfHwgc291cmNlW2VuZFBvc2l0aW9uXSAhPSAnKScpCisJCQkJCQljb21wbGV0aW9uID0gbmV3IGNoYXJbXSB7ICcpJyB9OworCQkJCQkKKwkJCQkJaWYoZm9yQW5vbnltb3VzVHlwZSl7CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0QW5vbnltb3VzVHlwZSgKKwkJCQkJCQljdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAorCQkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJCWNvbXBsZXRpb24sCisJCQkJCQkJY29uc3RydWN0b3IubW9kaWZpZXJzLAorCQkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJCVJfREVGQVVMVCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAorCQkJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCQkJY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQkJCWN1cnJlbnRUeXBlLnNvdXJjZU5hbWUoKSwKKwkJCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAorCQkJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyLAorCQkJCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyLAorCQkJCQkJCWNvbXBsZXRpb24sCisJCQkJCQkJY29uc3RydWN0b3IubW9kaWZpZXJzLAorCQkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJCVJfREVGQVVMVCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZEZpZWxkcyhjaGFyW10sIFJlZmVyZW5jZUJpbmRpbmcsIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4pCisJcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHMoCisJCWNoYXJbXSBmaWVsZE5hbWUsCisJCUZpZWxkQmluZGluZ1tdIGZpZWxkcywKKwkJU2NvcGUgc2NvcGUsCisJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCwKKwkJT2JqZWN0VmVjdG9yIGxvY2Fsc0ZvdW5kLAorCQlib29sZWFuIG9ubHlTdGF0aWNGaWVsZHMsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQlib29sZWFuIGltcGxpY2l0Q2FsbCkgeworCisJCS8vIEluaGVyaXRlZCBmaWVsZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisJCQorCQlpbnQgZmllbGRMZW5ndGggPSBmaWVsZE5hbWUubGVuZ3RoOworCQluZXh0IDogZm9yIChpbnQgZiA9IGZpZWxkcy5sZW5ndGg7IC0tZiA+PSAwOykgewkJCQorCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ZdOworCisJCQlpZiAoZmllbGQuaXNTeW50aGV0aWMoKSkJY29udGludWUgbmV4dDsKKworCQkJaWYgKG9ubHlTdGF0aWNGaWVsZHMgJiYgIWZpZWxkLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChmaWVsZExlbmd0aCA+IGZpZWxkLm5hbWUubGVuZ3RoKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGZpZWxkTmFtZSwgZmllbGQubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8pKQljb250aW51ZSBuZXh0OworCisJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKKwkJCQkmJiAhZmllbGQuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKQljb250aW51ZSBuZXh0OworCisJCQlib29sZWFuIHByZWZpeFJlcXVpcmVkID0gZmFsc2U7CisKKwkJCWZvciAoaW50IGkgPSBmaWVsZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKKwkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSlmaWVsZHNGb3VuZC5lbGVtZW50QXQoaSk7CisJCQkJRmllbGRCaW5kaW5nIG90aGVyRmllbGQgPSAoRmllbGRCaW5kaW5nKSBvdGhlclswXTsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIG90aGVyUmVjZWl2ZXJUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIG90aGVyWzFdOworCQkJCWlmIChmaWVsZCA9PSBvdGhlckZpZWxkICYmIHJlY2VpdmVyVHlwZSA9PSBvdGhlclJlY2VpdmVyVHlwZSkKKwkJCQkJY29udGludWUgbmV4dDsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQubmFtZSwgb3RoZXJGaWVsZC5uYW1lLCB0cnVlKSkgeworCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2Yob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcykpCisJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQorCQkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcywgdHJ1ZSkpCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCisJCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKGZpZWxkLmRlY2xhcmluZ0NsYXNzLCB0cnVlKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQlwcmVmaXhSZXF1aXJlZCA9IHRydWU7CisJCQkJfQorCQkJfQorCisJCQlmb3IgKGludCBsID0gbG9jYWxzRm91bmQuc2l6ZTsgLS1sID49IDA7KSB7CisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGxvY2Fsc0ZvdW5kLmVsZW1lbnRBdChsKTsJCisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQubmFtZSwgbG9jYWwubmFtZSwgdHJ1ZSkpIHsKKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyYXRpb25UeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJCQlpZiAoZGVjbGFyYXRpb25UeXBlLmlzQW5vbnltb3VzVHlwZSgpICYmIGRlY2xhcmF0aW9uVHlwZSAhPSBpbnZvY2F0aW9uU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKSB7CisJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQl9CisJCQkJCXByZWZpeFJlcXVpcmVkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJCisJCQlmaWVsZHNGb3VuZC5hZGQobmV3IE9iamVjdFtde2ZpZWxkLCByZWNlaXZlclR5cGV9KTsKKwkJCQorCQkJY2hhcltdIGNvbXBsZXRpb24gPSBmaWVsZC5uYW1lOworCQkJCisJCQlpZihwcmVmaXhSZXF1aXJlZCB8fCBvcHRpb25zLmZvcmNlSW1wbGljaXRRdWFsaWZpY2F0aW9uKXsKKwkJCQljaGFyW10gcHJlZml4ID0gY29tcHV0ZVByZWZpeChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIGludm9jYXRpb25TY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIGZpZWxkLmlzU3RhdGljKCkpOworCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXgsY29tcGxldGlvbiwnLicpOworCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoZmllbGROYW1lLCBmaWVsZC5uYW1lKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShmaWVsZC50eXBlKTsKKworCQkJcmVxdWVzdG9yCisJCQkJLmFjY2VwdEZpZWxkKAorCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCWZpZWxkLm5hbWUsCisJCQkJCWZpZWxkLnR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJZmllbGQudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCWNvbXBsZXRpb24sCisJCQkvLyBtYXkgaW5jbHVkZSBzb21lIHF1YWxpZmljYXRpb24gdG8gcmVzb2x2ZSBhbWJpZ3VpdGllcworCQkJZmllbGQubW9kaWZpZXJzLCBzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LCBlbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCXJlbGV2YW5jZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZEZpZWxkcygKKwkJY2hhcltdIGZpZWxkTmFtZSwKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgZmllbGRzRm91bmQsCisJCU9iamVjdFZlY3RvciBsb2NhbHNGb3VuZCwKKwkJYm9vbGVhbiBvbmx5U3RhdGljRmllbGRzLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJU2NvcGUgaW52b2NhdGlvblNjb3BlLAorCQlib29sZWFuIGltcGxpY2l0Q2FsbCkgeworCisJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOworCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsKKwkJZG8geworCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKworCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQorCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107CisKKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkwLAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQl9CisKKwkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmF2YWlsYWJsZUZpZWxkcygpOworCQkJaWYoZmllbGRzICE9IG51bGwpIHsKKwkJCQlmaW5kRmllbGRzKAorCQkJCQlmaWVsZE5hbWUsCisJCQkJCWZpZWxkcywKKwkJCQkJc2NvcGUsCisJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJb25seVN0YXRpY0ZpZWxkcywKKwkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQlpbXBsaWNpdENhbGwpOworCQkJfQorCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisJCX0gd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpOworCisJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKKworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1tqXTsKKwkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgVGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7CisJCQkJCQkvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkCisJCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZDsKKworCQkJCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gYW5JbnRlcmZhY2UuYXZhaWxhYmxlRmllbGRzKCk7CisJCQkJCQlpZihmaWVsZHMgIT0gIG51bGwpIHsKKwkJCQkJCQlmaW5kRmllbGRzKAorCQkJCQkJCQlmaWVsZE5hbWUsCisJCQkJCQkJCWZpZWxkcywKKwkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJCQlsb2NhbHNGb3VuZCwKKwkJCQkJCQkJb25seVN0YXRpY0ZpZWxkcywKKwkJCQkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJCQlpbXBsaWNpdENhbGwpOworCQkJCQkJfQorCisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIGJpdCByZWluaXRpYWxpemF0aW9uCisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspCisJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyAmPSB+VGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRGaWVsZHNBbmRNZXRob2RzKAorCQljaGFyW10gdG9rZW4sCisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsKSB7CisKKwkJaWYgKHRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpCisJCQlyZXR1cm47IC8vIG5vdGhpbmcgZWxzZSBpcyBwb3NzaWJsZSB3aXRoIGJhc2UgdHlwZXMKKworCQlpZiAocmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCWlmICh0b2tlbi5sZW5ndGggPD0gbGVuZ3RoRmllbGQubGVuZ3RoCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGxlbmd0aEZpZWxkLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLworCQkJKSkgeworCQkJCQorCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sbGVuZ3RoRmllbGQpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShCYXNlVHlwZXMuSW50QmluZGluZyk7CisJCQkJCisJCQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkKAorCQkJCQlOb0NoYXIsCisJCQkJCU5vQ2hhciwKKwkJCQkJbGVuZ3RoRmllbGQsCisJCQkJCU5vQ2hhciwKKwkJCQkJTm9DaGFyLAorCQkJCQlsZW5ndGhGaWVsZCwKKwkJCQkJQ29tcGlsZXJNb2RpZmllcnMuQWNjUHVibGljLAorCQkJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJcmVsZXZhbmNlKTsKKwkJCX0KKwkJCXJlY2VpdmVyVHlwZSA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJCX0KKworCQlmaW5kRmllbGRzKAorCQkJdG9rZW4sCisJCQkoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlLAorCQkJc2NvcGUsCisJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQluZXcgT2JqZWN0VmVjdG9yKCksCisJCQlmYWxzZSwKKwkJCWludm9jYXRpb25TaXRlLAorCQkJaW52b2NhdGlvblNjb3BlLAorCQkJaW1wbGljaXRDYWxsKTsKKworCQlmaW5kTWV0aG9kcygKKwkJCXRva2VuLAorCQkJbnVsbCwKKwkJCShSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUsCisJCQlzY29wZSwKKwkJCW5ldyBPYmplY3RWZWN0b3IoKSwKKwkJCWZhbHNlLAorCQkJZmFsc2UsCisJCQlmYWxzZSwKKwkJCWludm9jYXRpb25TaXRlLAorCQkJaW52b2NhdGlvblNjb3BlLAorCQkJaW1wbGljaXRDYWxsKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZEltcG9ydHMoQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSkgeworCQljaGFyW11bXSB0b2tlbnMgPSBpbXBvcnRSZWZlcmVuY2UudG9rZW5zOworCQkJCisJCWNoYXJbXSBpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKTsKKwkJCisJCWlmIChpbXBvcnROYW1lLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCQkJCisJCWNoYXJbXSBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdOworCQlpZihsYXN0VG9rZW4gIT0gbnVsbCAmJiBsYXN0VG9rZW4ubGVuZ3RoID09IDApCisJCQlpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoaW1wb3J0TmFtZSwgbmV3IGNoYXJbXXsnLid9KTsKKworCQlyZXNvbHZpbmdJbXBvcnRzID0gdHJ1ZTsKKwkJc2V0U291cmNlUmFuZ2UoCisJCQlpbXBvcnRSZWZlcmVuY2Uuc291cmNlU3RhcnQsCisJCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJCisJCXRva2VuID0gIGltcG9ydE5hbWU7CisJCS8vIHdhbnQgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgLio7CisJCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMoaW1wb3J0TmFtZSwgdGhpcyk7CisJCW5hbWVFbnZpcm9ubWVudC5maW5kVHlwZXMoaW1wb3J0TmFtZSwgdGhpcyk7CisJfQorCisJLy8gd2hhdCBhYm91dCBvbkRlbWFuZCB0eXBlcz8gSWdub3JlIHRoZW0gc2luY2UgaXQgZG9lcyBub3QgaGFwcGVuIQorCS8vIGltcG9ydCBwMS5wMi5BLio7CisJcHJpdmF0ZSB2b2lkIGZpbmRLZXl3b3JkcyhjaGFyW10ga2V5d29yZCwgY2hhcltdW10gY2hvaWNlcywgU2NvcGUgc2NvcGUpIHsKKworCQlpbnQgbGVuZ3RoID0ga2V5d29yZC5sZW5ndGg7CisJCWlmIChsZW5ndGggPiAwKQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQorCQkJCWlmIChsZW5ndGggPD0gY2hvaWNlc1tpXS5sZW5ndGgKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoa2V5d29yZCwgY2hvaWNlc1tpXSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KKwkJCQkpKXsKKwkJCQkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcoa2V5d29yZCwgY2hvaWNlc1tpXSk7CisJCQkJCQorCQkJCQlyZXF1ZXN0b3IuYWNjZXB0S2V5d29yZChjaG9pY2VzW2ldLCBzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LCBlbmRQb3NpdGlvbiAtIG9mZnNldCxyZWxldmFuY2UpOworCQkJCX0KKwl9CisKKwkvLyBIZWxwZXIgbWV0aG9kIGZvciBmaW5kTWVtYmVyVHlwZXMoY2hhcltdLCBSZWZlcmVuY2VCaW5kaW5nLCBTY29wZSkKKwlwcml2YXRlIHZvaWQgZmluZE1lbWJlclR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcywKKwkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSkgeworCisJCS8vIEluaGVyaXRlZCBtZW1iZXIgdHlwZXMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisJCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQluZXh0IDogZm9yIChpbnQgbSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1ttXTsKKwkJCS8vCQlpZiAoIXdhbnRDbGFzc2VzICYmIG1lbWJlclR5cGUuaXNDbGFzcygpKSBjb250aW51ZSBuZXh0OworCQkJLy8JCWlmICghd2FudEludGVyZmFjZXMgJiYgbWVtYmVyVHlwZS5pc0ludGVyZmFjZSgpKSBjb250aW51ZSBuZXh0OworCQkJaWYgKHR5cGVMZW5ndGggPiBtZW1iZXJUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQorCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSwgZmFsc2UKKwkJCQkvKiBpZ25vcmUgY2FzZSAqLworCQkJCSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5CisJCQkJJiYgIW1lbWJlclR5cGUuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uVHlwZSkpCisJCQkJY29udGludWUgbmV4dDsKKworCQkJZm9yIChpbnQgaSA9IHR5cGVzRm91bmQuc2l6ZTsgLS1pID49IDA7KSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBvdGhlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZXNGb3VuZC5lbGVtZW50QXQoaSk7CisKKwkJCQlpZiAobWVtYmVyVHlwZSA9PSBvdGhlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWVtYmVyVHlwZS5zb3VyY2VOYW1lLCBvdGhlclR5cGUuc291cmNlTmFtZSwgdHJ1ZSkpIHsKKworCQkJCQlpZiAobWVtYmVyVHlwZS5lbmNsb3NpbmdUeXBlKCkuaXNTdXBlcmNsYXNzT2Yob3RoZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSkpCisJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCWlmIChvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpLmlzSW50ZXJmYWNlKCkpCisJCQkJCQlpZiAobWVtYmVyVHlwZS5lbmNsb3NpbmdUeXBlKCkKKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShvdGhlclR5cGUuZW5jbG9zaW5nVHlwZSgpLCB0cnVlKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJCWlmIChtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKS5pc0ludGVyZmFjZSgpKQorCQkJCQkJaWYgKG90aGVyVHlwZS5lbmNsb3NpbmdUeXBlKCkKKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkpCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCXR5cGVzRm91bmQuYWRkKG1lbWJlclR5cGUpOworCisJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobWVtYmVyVHlwZSk7CisKKwkJCWlmIChtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgeworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCisJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJbWVtYmVyVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCW1lbWJlclR5cGUuc291cmNlTmFtZSgpLAorCQkJCQltZW1iZXJUeXBlLm1vZGlmaWVycywKKwkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCXJlbGV2YW5jZSk7CisKKwkJCX0gZWxzZSB7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAorCQkJCQltZW1iZXJUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQltZW1iZXJUeXBlLnNvdXJjZU5hbWUoKSwKKwkJCQkJbWVtYmVyVHlwZS5tb2RpZmllcnMsCisJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQlyZWxldmFuY2UpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygKKwkJY2hhcltdIHR5cGVOYW1lLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJU2NvcGUgc2NvcGUsCisJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVJbnZvY2F0aW9uKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpID09IG51bGwpCisJCQlyZXR1cm47IC8vIHdlJ3JlIHRyeWluZyB0byBmaW5kIGEgc3VwZXJ0eXBlCisKKwkJT2JqZWN0VmVjdG9yIHR5cGVzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCWlmIChpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UKKwkJCXx8IHR5cGVOYW1lLmxlbmd0aCA9PSAwKSB7IC8vIGRvIG5vdCBzZWFyY2ggdXAgdGhlIGhpZXJhcmNoeQorCisJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJdHlwZU5hbWUsCisJCQkJY3VycmVudFR5cGUubWVtYmVyVHlwZXMoKSwKKwkJCQl0eXBlc0ZvdW5kLAorCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQl0eXBlSW52b2NhdGlvbik7CisJCQlyZXR1cm47CisJCX0KKworCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsKKworCQlkbyB7CisKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCisJCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpCisJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKworCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwKKwkJCQkJCTAsCisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sCisJCQkJCQkwLAorCQkJCQkJbGFzdFBvc2l0aW9uKTsKKwkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsKKwkJCX0KKworCQkJZmluZE1lbWJlclR5cGVzKAorCQkJCXR5cGVOYW1lLAorCQkJCWN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCksCisJCQkJdHlwZXNGb3VuZCwKKwkJCQlyZWNlaXZlclR5cGUsCisJCQkJdHlwZUludm9jYXRpb24pOworCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisKKwkJfSB3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCk7CisKKwkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzW2pdOworCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQpID09IDApIHsKKwkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQKKwkJCQkJCWFuSW50ZXJmYWNlLnRhZ0JpdHMgfD0gVGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkOworCisJCQkJCQlmaW5kTWVtYmVyVHlwZXMoCisJCQkJCQkJdHlwZU5hbWUsCisJCQkJCQkJYW5JbnRlcmZhY2UubWVtYmVyVHlwZXMoKSwKKwkJCQkJCQl0eXBlc0ZvdW5kLAorCQkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCQl0eXBlSW52b2NhdGlvbik7CisKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2Uuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQlsYXN0UG9zaXRpb24pOworCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBiaXQgcmVpbml0aWFsaXphdGlvbgorCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQorCQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZDsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kSW50ZWZhY2VzTWV0aG9kcygKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCWJvb2xlYW4gaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsKSB7CisKKwkJaWYgKHNlbGVjdG9yID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKwkJCWludCBsYXN0UG9zaXRpb24gPSAwOworCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKworCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzW2pdOworCisJCQkJCWlmICgoY3VycmVudFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeworCQkJCQkJLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZAorCQkJCQkJY3VycmVudFR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7CisKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOworCQkJCQkJaWYobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJCQkJaWYoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24peworCQorCQkJCQkJCQlmaW5kTG9jYWxNZXRob2REZWNsYXJhdGlvbnMoCisJCQkJCQkJCQlzZWxlY3RvciwKKwkJCQkJCQkJCW1ldGhvZHMsCisJCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJCQkJCXJlY2VpdmVyVHlwZSk7CisJCisJCQkJCQkJfSBlbHNlIHsKKwkKKwkJCQkJCQkJZmluZExvY2FsTWV0aG9kcygKKwkJCQkJCQkJCXNlbGVjdG9yLAorCQkJCQkJCQkJYXJnVHlwZXMsCisJCQkJCQkJCQltZXRob2RzLAorCQkJCQkJCQkJc2NvcGUsCisJCQkJCQkJCQltZXRob2RzRm91bmQsCisJCQkJCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJCQkJCWV4YWN0TWF0Y2gsCisJCQkJCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJCQkJCWludm9jYXRpb25TY29wZSwKKwkJCQkJCQkJCWltcGxpY2l0Q2FsbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQlsYXN0UG9zaXRpb24pOworCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBiaXQgcmVpbml0aWFsaXphdGlvbgorCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspeworCQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gflRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGZpbmRJbXBsaWNpdE1lc3NhZ2VTZW5kcygKKwkJY2hhcltdIHRva2VuLAorCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCVNjb3BlIGludm9jYXRpb25TY29wZSkgeworCisJCWlmICh0b2tlbiA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWJvb2xlYW4gc3RhdGljc09ubHkgPSBmYWxzZTsKKwkJLy8gbmVlZCB0byBrbm93IGlmIHdlJ3JlIGluIGEgc3RhdGljIGNvbnRleHQgKG9yIGluc2lkZSBhIGNvbnN0cnVjdG9yKQorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kID0gbmV3IE9iamVjdFZlY3RvcigpOworCisJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisKKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCisJCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgorCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQorCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7CisJCQkJCXN0YXRpY3NPbmx5IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljIHwgbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBzY29wZTsKKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQlmaW5kTWV0aG9kcygKKwkJCQkJCXRva2VuLAorCQkJCQkJYXJnVHlwZXMsCisJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJY2xhc3NTY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCXN0YXRpY3NPbmx5LAorCQkJCQkJdHJ1ZSwKKwkJCQkJCWZhbHNlLAorCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCQl0cnVlKTsKKwkJCQkJc3RhdGljc09ubHkgfD0gZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmU7CisJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfQorCX0KKworCS8vIEhlbHBlciBtZXRob2QgZm9yIGZpbmRNZXRob2RzKGNoYXJbXSwgVHlwZUJpbmRpbmdbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUsIE9iamVjdFZlY3RvciwgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKKwlwcml2YXRlIHZvaWQgZmluZExvY2FsTWV0aG9kcygKKwkJY2hhcltdIG1ldGhvZE5hbWUsCisJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLAorCQlTY29wZSBzY29wZSwKKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCwKKwkJYm9vbGVhbiBvbmx5U3RhdGljTWV0aG9kcywKKwkJYm9vbGVhbiBleGFjdE1hdGNoLAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCVNjb3BlIGludm9jYXRpb25TY29wZSwKKwkJYm9vbGVhbiBpbXBsaWNpdENhbGwpIHsKKworCQkvLyBJbmhlcml0ZWQgbWV0aG9kcyB3aGljaCBhcmUgaGlkZGVuIGJ5IHN1YmNsYXNzZXMgYXJlIGZpbHRlcmVkIG91dAorCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKKworCQlpbnQgbWV0aG9kTGVuZ3RoID0gbWV0aG9kTmFtZS5sZW5ndGg7CisJCWludCBtaW5BcmdMZW5ndGggPSBhcmdUeXBlcyA9PSBudWxsID8gMCA6IGFyZ1R5cGVzLmxlbmd0aDsKKworCQluZXh0IDogZm9yIChpbnQgZiA9IG1ldGhvZHMubGVuZ3RoOyAtLWYgPj0gMDspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKKworCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0OworCisJCQlpZiAobWV0aG9kLmlzRGVmYXVsdEFic3RyYWN0KCkpCWNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZSBuZXh0OworCisJCQkvLwkJaWYgKG5vVm9pZFJldHVyblR5cGUgJiYgbWV0aG9kLnJldHVyblR5cGUgPT0gQmFzZVR5cGVzLlZvaWRCaW5kaW5nKSBjb250aW51ZSBuZXh0OworCQkJaWYgKG9ubHlTdGF0aWNNZXRob2RzICYmICFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dDsKKworCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5CisJCQkJJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCBzY29wZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChleGFjdE1hdGNoKSB7CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCisJCQkJCSkpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAobWV0aG9kTGVuZ3RoID4gbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCkKKwkJCQkJY29udGludWUgbmV4dDsKKworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZQorCQkJCQkvKiBpZ25vcmUgY2FzZSAqLworCQkJCQkpKQorCQkJCQljb250aW51ZSBuZXh0OworCQkJfQorCQkJaWYgKG1pbkFyZ0xlbmd0aCA+IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCkKKwkJCQljb250aW51ZSBuZXh0OworCisJCQlmb3IgKGludCBhID0gbWluQXJnTGVuZ3RoOyAtLWEgPj0gMDspeworCQkJCWlmIChhcmdUeXBlc1thXSAhPSBudWxsKXsgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5CisJCQkJCWlmICghc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGFyZ1R5cGVzW2FdLCBtZXRob2QucGFyYW1ldGVyc1thXSkpIHsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWJvb2xlYW4gcHJlZml4UmVxdWlyZWQgPSBmYWxzZTsKKwkJCQorCQkJZm9yIChpbnQgaSA9IG1ldGhvZHNGb3VuZC5zaXplOyAtLWkgPj0gMDspIHsKKwkJCQlPYmplY3RbXSBvdGhlciA9IChPYmplY3RbXSkgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlNZXRob2RCaW5kaW5nIG90aGVyTWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpIG90aGVyWzBdOworCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3RoZXJSZWNlaXZlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgb3RoZXJbMV07CisJCQkJaWYgKG1ldGhvZCA9PSBvdGhlck1ldGhvZCAmJiByZWNlaXZlclR5cGUgPT0gb3RoZXJSZWNlaXZlclR5cGUpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBvdGhlck1ldGhvZC5zZWxlY3RvciwgdHJ1ZSkKKwkJCQkJJiYgbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChvdGhlck1ldGhvZCkpIHsKKworCQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaWYgKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCisJCQkJCQlpZiAobWV0aG9kCisJCQkJCQkJLmRlY2xhcmluZ0NsYXNzCisJCQkJCQkJLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJaWYgKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQorCQkJCQkJaWYob3RoZXJNZXRob2QKKwkJCQkJCQkuZGVjbGFyaW5nQ2xhc3MKKwkJCQkJCQkuaW1wbGVtZW50c0ludGVyZmFjZShtZXRob2QuZGVjbGFyaW5nQ2xhc3MsdHJ1ZSkpCisJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJcHJlZml4UmVxdWlyZWQgPSB0cnVlOworCQkJCX0KKwkJCX0KKworCQkJbWV0aG9kc0ZvdW5kLmFkZChuZXcgT2JqZWN0W117bWV0aG9kLCByZWNlaXZlclR5cGV9KTsKKwkJCWludCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7CisJCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlUeXBlQmluZGluZyB0eXBlID0gbWV0aG9kLnBhcmFtZXRlcnNbaV07CisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMobWV0aG9kLHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwkJCWNoYXJbXSBjb21wbGV0aW9uID0gVHlwZUNvbnN0YW50cy5Ob0NoYXI7CisJCQkKKwkJCWludCBwcmV2aW91c1N0YXJ0UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOworCQkJCisJCQkvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzCisJCQlpZiAoIWV4YWN0TWF0Y2gpIHsKKwkJCQlpZiAoc291cmNlICE9IG51bGwKKwkJCQkJJiYgc291cmNlLmxlbmd0aCA+IGVuZFBvc2l0aW9uCisJCQkJCSYmIHNvdXJjZVtlbmRQb3NpdGlvbl0gPT0gJygnKQorCQkJCQljb21wbGV0aW9uID0gbWV0aG9kLnNlbGVjdG9yOworCQkJCWVsc2UKKwkJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KG1ldGhvZC5zZWxlY3RvciwgbmV3IGNoYXJbXSB7ICcoJywgJyknIH0pOworCQkJfSBlbHNlIHsKKwkJCQlpZihwcmVmaXhSZXF1aXJlZCAmJiAoc291cmNlICE9IG51bGwpKSB7CisJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNvdXJjZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXJ0UG9zaXRpb24gPSBlbmRQb3NpdGlvbjsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmKHByZWZpeFJlcXVpcmVkIHx8IG9wdGlvbnMuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24peworCQkJCWNoYXJbXSBwcmVmaXggPSBjb21wdXRlUHJlZml4KHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgaW52b2NhdGlvblNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgbWV0aG9kLmlzU3RhdGljKCkpOworCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXgsY29tcGxldGlvbiwnLicpOworCQkJfQorCisJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShtZXRob2QucmV0dXJuVHlwZSk7CisKKwkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2QoCisJCQkJbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQltZXRob2Quc2VsZWN0b3IsCisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCQkJCXBhcmFtZXRlclR5cGVOYW1lcywKKwkJCQlwYXJhbWV0ZXJOYW1lcywKKwkJCQltZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCW1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQljb21wbGV0aW9uLAorCQkJCW1ldGhvZC5tb2RpZmllcnMsCisJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQlyZWxldmFuY2UpOworCQkJc3RhcnRQb3NpdGlvbiA9IHByZXZpb3VzU3RhcnRQb3NpdGlvbjsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGNoYXJbXSB0b2tlbiwgY2hhcltdIHByb3Bvc2FsTmFtZSl7CisJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgcHJvcG9zYWxOYW1lLCB0cnVlIC8qIGRvIG5vdCBpZ25vcmUgY2FzZSAqLykpIHsKKwkJCXJldHVybiAgUl9DQVNFOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFJfREVGQVVMVDsKKwkJfQorCX0KKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKXsKKwkJaWYoYXNzaXN0Tm9kZUlzQ2xhc3MpIHsKKwkJCXJldHVybiBSX0NMQVNTOworCQl9CisJCXJldHVybiAwOworCX0KKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCl7CisJCWlmKGFzc2lzdE5vZGVJc0ludGVyZmFjZSkgeworCQkJcmV0dXJuIFJfSU5URVJGQUNFOworCQl9CisJCXJldHVybiBSX0RFRkFVTFQ7CisJfQorCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oY2hhcltdIHByb3Bvc2FsTmFtZSl7CisJCQorCQlpZihhc3Npc3ROb2RlSXNFeGNlcHRpb24gJiYKKwkJCShDaGFyT3BlcmF0aW9uLm1hdGNoKEVYQ0VQVElPTl9QQVRURVJOLCBwcm9wb3NhbE5hbWUsIGZhbHNlKSB8fAorCQkJQ2hhck9wZXJhdGlvbi5tYXRjaChFUlJPUl9QQVRURVJOLCBwcm9wb3NhbE5hbWUsIGZhbHNlKSkpIHsgCisJCQlyZXR1cm4gUl9FWENFUFRJT047CisJCX0KKwkJcmV0dXJuIFJfREVGQVVMVDsKKwl9CisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoVHlwZUJpbmRpbmcgcHJvcG9zYWxUeXBlKXsKKwkJaWYoZXhwZWN0ZWRUeXBlcyAhPSBudWxsICYmIHByb3Bvc2FsVHlwZSAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZihTY29wZS5hcmVUeXBlc0NvbXBhdGlibGUocHJvcG9zYWxUeXBlLCBleHBlY3RlZFR5cGVzW2ldKSkgeworCQkJCQlyZXR1cm4gUl9FWFBFQ1RFRF9UWVBFOworCQkJCX0KKwkJCX0KKwkJfSAKKwkJcmV0dXJuIFJfREVGQVVMVDsKKwl9CisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpeworCQlpZihleHBlY3RlZFR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgcGFja2FnZU5hbWUpICYmCisJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKGV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCB0eXBlTmFtZSkpIHsKKwkJCQkJcmV0dXJuIFJfRVhQRUNURURfVFlQRTsKKwkJCQl9CisJCQl9CisJCX0gCisJCXJldHVybiBSX0RFRkFVTFQ7CisJfQorCisJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1ldGhvZHMoY2hhcltdLCBNZXRob2RCaW5kaW5nW10sIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIFR5cGVCaW5kaW5nKQorCXByaXZhdGUgdm9pZCBmaW5kTG9jYWxNZXRob2REZWNsYXJhdGlvbnMoCisJCWNoYXJbXSBtZXRob2ROYW1lLAorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcywKKwkJU2NvcGUgc2NvcGUsCisJCU9iamVjdFZlY3RvciBtZXRob2RzRm91bmQsCisJCS8vCWJvb2xlYW4gbm9Wb2lkUmV0dXJuVHlwZSwgaG93IGRvIHlvdSBrbm93PworCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisKKwkJLy8gSW5oZXJpdGVkIG1ldGhvZHMgd2hpY2ggYXJlIGhpZGRlbiBieSBzdWJjbGFzc2VzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJLy8gTm8gdmlzaWJpbGl0eSBjaGVja3MgY2FuIGJlIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBzY29wZSAmIGludm9jYXRpb25TaXRlCisJCWludCBtZXRob2RMZW5ndGggPSBtZXRob2ROYW1lLmxlbmd0aDsKKwkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7CisKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tmXTsKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkJY29udGludWUgbmV4dDsKKwkJCQkKKwkJCWlmIChtZXRob2QuaXNEZWZhdWx0QWJzdHJhY3QoKSkgY29udGludWUgbmV4dDsKKwkJCQorCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCisJCQlpZiAobWV0aG9kLmlzRmluYWwoKSkgY29udGludWUgbmV4dDsKKworCQkJLy8JCWlmIChub1ZvaWRSZXR1cm5UeXBlICYmIG1ldGhvZC5yZXR1cm5UeXBlID09IEJhc2VUeXBlcy5Wb2lkQmluZGluZykgY29udGludWUgbmV4dDsKKwkJCWlmIChvbmx5U3RhdGljTWV0aG9kcyAmJiAhbWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChvcHRpb25zLmNoZWNrVmlzaWJpbGl0eQorCQkJCSYmICFtZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBGYWtlSW52b2NhdGlvblNpdGUgLCBzY29wZSkpIGNvbnRpbnVlIG5leHQ7CisKKwkJCWlmIChleGFjdE1hdGNoKSB7CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCisJCQkJCSkpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAobWV0aG9kTGVuZ3RoID4gbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCkKKwkJCQkJY29udGludWUgbmV4dDsKKworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yLCBmYWxzZQorCQkJCQkvKiBpZ25vcmUgY2FzZSAqLworCQkJCQkpKQorCQkJCQljb250aW51ZSBuZXh0OworCQkJfQorCisJCQlmb3IgKGludCBpID0gbWV0aG9kc0ZvdW5kLnNpemU7IC0taSA+PSAwOykgeworCQkJCU1ldGhvZEJpbmRpbmcgb3RoZXJNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kc0ZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlpZiAobWV0aG9kID09IG90aGVyTWV0aG9kKQorCQkJCQljb250aW51ZSBuZXh0OworCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgb3RoZXJNZXRob2Quc2VsZWN0b3IsIHRydWUpCisJCQkJCSYmIG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwob3RoZXJNZXRob2QpKSB7CisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJfQorCisJCQltZXRob2RzRm91bmQuYWRkKG1ldGhvZCk7CisJCQkKKwkJCWludCBsZW5ndGggPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7CisJCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlUeXBlQmluZGluZyB0eXBlID0gbWV0aG9kLnBhcmFtZXRlcnNbaV07CisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJfQorCisJCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhtZXRob2QscGFyYW1ldGVyVHlwZU5hbWVzKTsKKwkJCQorCQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJCS8vIGZsdXNoIHVuaW50ZXJlc3RpbmcgbW9kaWZpZXJzCisJCQlpbnQgaW5zZXJ0ZWRNb2RpZmllcnMgPSBtZXRob2QubW9kaWZpZXJzICYgfihDb21waWxlck1vZGlmaWVycy5BY2NOYXRpdmUgfCBDb21waWxlck1vZGlmaWVycy5BY2NBYnN0cmFjdCk7CisKKwkJCWlmICghZXhhY3RNYXRjaCkgeworCQkJCWlmKGluc2VydGVkTW9kaWZpZXJzICE9IENvbXBpbGVyTW9kaWZpZXJzLkFjY0RlZmF1bHQpeworCQkJCQljb21wbGV0aW9uLmFwcGVuZChBc3ROb2RlLm1vZGlmaWVyc1N0cmluZyhpbnNlcnRlZE1vZGlmaWVycykpOworCQkJCX0KKwkJCQljaGFyW10gcmV0dXJuUGFja2FnZU5hbWUgPSBtZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCQkJCWNoYXJbXSByZXR1cm5UeXBlTmFtZSA9IG1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKTsKKwkJCQlpZihtdXN0UXVhbGlmeVR5cGUocmV0dXJuUGFja2FnZU5hbWUsIHJldHVyblR5cGVOYW1lKSkgeworCQkJCQljb21wbGV0aW9uLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdChyZXR1cm5QYWNrYWdlTmFtZSwgcmV0dXJuVHlwZU5hbWUsJy4nKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29tcGxldGlvbi5hcHBlbmQobWV0aG9kLnJldHVyblR5cGUuc291cmNlTmFtZSgpKTsKKwkJCQl9CisJCQkJY29tcGxldGlvbi5hcHBlbmQoJyAnKTsKKwkJCQljb21wbGV0aW9uLmFwcGVuZChtZXRob2Quc2VsZWN0b3IpOworCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcoJyk7CisKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIDsgaSsrKXsKKwkJCQkJaWYobXVzdFF1YWxpZnlUeXBlKHBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSwgcGFyYW1ldGVyVHlwZU5hbWVzW2ldKSl7CisJCQkJCQljb21wbGV0aW9uLmFwcGVuZChDaGFyT3BlcmF0aW9uLmNvbmNhdChwYXJhbWV0ZXJQYWNrYWdlTmFtZXNbaV0sIHBhcmFtZXRlclR5cGVOYW1lc1tpXSwgJy4nKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb21wbGV0aW9uLmFwcGVuZChwYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOworCQkJCQl9CisJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcgJyk7CisJCQkJCWlmKHBhcmFtZXRlck5hbWVzICE9IG51bGwpeworCQkJCQkJY29tcGxldGlvbi5hcHBlbmQocGFyYW1ldGVyTmFtZXNbaV0pOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoJyUnKTsKKwkJCQkJfQorCQkJCQlpZihpICE9IChsZW5ndGggLSAxKSkKKwkJCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcsJyk7CQorCQkJCX0KKwkJCQljb21wbGV0aW9uLmFwcGVuZCgnKScpOworCQkJCQorCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zID0gbWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CisJCQkJCisJCQkJaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCAmJiBleGNlcHRpb25zLmxlbmd0aCA+IDApeworCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQljb21wbGV0aW9uLmFwcGVuZChUSFJPV1MpOworCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGggOyBpKyspeworCQkJCQkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb24gPSBleGNlcHRpb25zW2ldOworCisJCQkJCQljaGFyW10gZXhjZXB0aW9uUGFja2FnZU5hbWUgPSBleGNlcHRpb24ucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCWNoYXJbXSBleGNlcHRpb25UeXBlTmFtZSA9IGV4Y2VwdGlvbi5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCQkJCQkKKwkJCQkJCWlmKGkgIT0gMCl7CisJCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoJywnKTsKKwkJCQkJCQljb21wbGV0aW9uLmFwcGVuZCgnICcpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZihtdXN0UXVhbGlmeVR5cGUoZXhjZXB0aW9uUGFja2FnZU5hbWUsIGV4Y2VwdGlvblR5cGVOYW1lKSl7CisJCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoQ2hhck9wZXJhdGlvbi5jb25jYXQoZXhjZXB0aW9uUGFja2FnZU5hbWUsIGV4Y2VwdGlvblR5cGVOYW1lLCAnLicpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29tcGxldGlvbi5hcHBlbmQoZXhjZXB0aW9uLnNvdXJjZU5hbWUoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhtZXRob2ROYW1lLCBtZXRob2Quc2VsZWN0b3IpOworCisJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCisJCQkJbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJbWV0aG9kLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQltZXRob2Quc2VsZWN0b3IsCisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCQkJCXBhcmFtZXRlclR5cGVOYW1lcywKKwkJCQlwYXJhbWV0ZXJOYW1lcywKKwkJCQltZXRob2QucmV0dXJuVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCW1ldGhvZC5yZXR1cm5UeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQljb21wbGV0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSwKKwkJCQltZXRob2QubW9kaWZpZXJzLAorCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJcmVsZXZhbmNlKTsKKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgZmluZE1ldGhvZHMoCisJCWNoYXJbXSBzZWxlY3RvciwKKwkJVHlwZUJpbmRpbmdbXSBhcmdUeXBlcywKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCVNjb3BlIHNjb3BlLAorCQlPYmplY3RWZWN0b3IgbWV0aG9kc0ZvdW5kLAorCQlib29sZWFuIG9ubHlTdGF0aWNNZXRob2RzLAorCQlib29sZWFuIGV4YWN0TWF0Y2gsCisJCWJvb2xlYW4gaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlTY29wZSBpbnZvY2F0aW9uU2NvcGUsCisJCWJvb2xlYW4gaW1wbGljaXRDYWxsKSB7CisJCWlmIChzZWxlY3RvciA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJaWYoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24pIHsKKwkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gcmVjZWl2ZXJUeXBlLmF2YWlsYWJsZU1ldGhvZHMoKTsKKwkJCWlmIChtZXRob2RzICE9IG51bGwpeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZighbWV0aG9kc1tpXS5pc0RlZmF1bHRBYnN0cmFjdCgpKSB7CisJCQkJCQltZXRob2RzRm91bmQuYWRkKG1ldGhvZHNbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gcmVjZWl2ZXJUeXBlOworCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCWlmKGlzQ29tcGxldGluZ0RlY2xhcmF0aW9uKSB7CisJCQkJZmluZEludGVmYWNlc01ldGhvZHMoCisJCQkJCXNlbGVjdG9yLAorCQkJCQlhcmdUeXBlcywKKwkJCQkJcmVjZWl2ZXJUeXBlLAorCQkJCQljdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKSwKKwkJCQkJc2NvcGUsCisJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJb25seVN0YXRpY01ldGhvZHMsCisJCQkJCWV4YWN0TWF0Y2gsCisJCQkJCWlzQ29tcGxldGluZ0RlY2xhcmF0aW9uLAorCQkJCQlpbnZvY2F0aW9uU2l0ZSwKKwkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQlpbXBsaWNpdENhbGwpOworCQkJfSBlbHNlIHsKKwkJCQlmaW5kSW50ZWZhY2VzTWV0aG9kcygKKwkJCQkJc2VsZWN0b3IsCisJCQkJCWFyZ1R5cGVzLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCW5ldyBSZWZlcmVuY2VCaW5kaW5nW117Y3VycmVudFR5cGV9LAorCQkJCQlzY29wZSwKKwkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCisJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCWltcGxpY2l0Q2FsbCk7CisJCQl9CisJCQkKKwkJCWN1cnJlbnRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJfSBlbHNlIHsKKwkJCWlmKGlzQ29tcGxldGluZ0RlY2xhcmF0aW9uKXsKKwkJCQlmaW5kSW50ZWZhY2VzTWV0aG9kcygKKwkJCQkJc2VsZWN0b3IsCisJCQkJCWFyZ1R5cGVzLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCWN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpLAorCQkJCQlzY29wZSwKKwkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCisJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCWltcGxpY2l0Q2FsbCk7CisJCQkJCisJCQkJY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGUuc3VwZXJjbGFzcygpOworCQkJfQorCQl9CisJCWJvb2xlYW4gaGFzUG90ZW50aWFsRGVmYXVsdEFic3RyYWN0TWV0aG9kcyA9IHRydWU7CisJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7CisJCQkKKwkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gY3VycmVudFR5cGUuYXZhaWxhYmxlTWV0aG9kcygpOworCQkJaWYobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJaWYoaXNDb21wbGV0aW5nRGVjbGFyYXRpb24peworCQkJCQlmaW5kTG9jYWxNZXRob2REZWNsYXJhdGlvbnMoCisJCQkJCQlzZWxlY3RvciwKKwkJCQkJCW1ldGhvZHMsCisJCQkJCQlzY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJCXJlY2VpdmVyVHlwZSk7CisJCQkJfSBlbHNleworCQkJCQlmaW5kTG9jYWxNZXRob2RzKAorCQkJCQkJc2VsZWN0b3IsCisJCQkJCQlhcmdUeXBlcywKKwkJCQkJCW1ldGhvZHMsCisJCQkJCQlzY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCW9ubHlTdGF0aWNNZXRob2RzLAorCQkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJaW1wbGljaXRDYWxsKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmKGhhc1BvdGVudGlhbERlZmF1bHRBYnN0cmFjdE1ldGhvZHMgJiYgY3VycmVudFR5cGUuaXNBYnN0cmFjdCgpKXsKKwkJCQlmaW5kSW50ZWZhY2VzTWV0aG9kcygKKwkJCQkJc2VsZWN0b3IsCisJCQkJCWFyZ1R5cGVzLAorCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCWN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpLAorCQkJCQlzY29wZSwKKwkJCQkJbWV0aG9kc0ZvdW5kLAorCQkJCQlvbmx5U3RhdGljTWV0aG9kcywKKwkJCQkJZXhhY3RNYXRjaCwKKwkJCQkJaXNDb21wbGV0aW5nRGVjbGFyYXRpb24sCisJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQlpbnZvY2F0aW9uU2NvcGUsCisJCQkJCWltcGxpY2l0Q2FsbCk7CisJCQl9IGVsc2UgeworCQkJCWhhc1BvdGVudGlhbERlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPSBmYWxzZTsKKwkJCX0KKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpOworCQl9CisJfQorCXByaXZhdGUgY2hhcltdW10gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMpeworCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmdUeXBlID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzOworCisJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gbnVsbDsKKwkJCisJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoOworCisJCWlmIChsZW5ndGggPT0gMCl7CisJCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyOworCQl9CisJCS8vIGxvb2sgaW50byB0aGUgY29ycmVzcG9uZGluZyB1bml0IGlmIGl0IGlzIGF2YWlsYWJsZQorCQlpZiAoYmluZGluZ1R5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlQmluZGluZyl7CisJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBiaW5kaW5nVHlwZTsKKworCQkJaWYgKHNvdXJjZVR5cGUuc2NvcGUgIT0gbnVsbCl7CisJCQkJVHlwZURlY2xhcmF0aW9uIHBhcnNlZFR5cGU7CisKKwkJCQlpZiAoKHBhcnNlZFR5cGUgPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQpICE9IG51bGwpeworCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBwYXJzZWRUeXBlLmRlY2xhcmF0aW9uT2YobWV0aG9kKTsKKworCQkJCQlpZiAobWV0aG9kRGVjbCAhPSBudWxsKXsKKwkJCQkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kRGVjbC5hcmd1bWVudHM7CisJCQkJCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKworCQkJCQkJZm9yKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspeworCQkJCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gYXJndW1lbnRzW2ldLm5hbWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gbG9vayBpbnRvIHRoZSBtb2RlbAkJCisJCWlmKHBhcmFtZXRlck5hbWVzID09IG51bGwpeworCQkJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IG5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShiaW5kaW5nVHlwZS5jb21wb3VuZE5hbWUpOworCisJCQlpZihhbnN3ZXIgIT0gbnVsbCl7CisJCQkJaWYoYW5zd2VyLmlzU291cmNlVHlwZSgpKSB7CisJCQkJCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUgPSBhbnN3ZXIuZ2V0U291cmNlVHlwZXMoKVswXTsKKwkJCQkJSVNvdXJjZU1ldGhvZFtdIHNvdXJjZU1ldGhvZHMgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsKKwkJCQkJaW50IGxlbiA9IHNvdXJjZU1ldGhvZHMgPT0gbnVsbCA/IDAgOiBzb3VyY2VNZXRob2RzLmxlbmd0aDsKKwkJCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbiA7IGkrKyl7CisJCQkJCQlJU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCA9IHNvdXJjZU1ldGhvZHNbaV07CisJCQkJCQljaGFyW11bXSBhcmdUeXBlTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0QXJndW1lbnRUeXBlTmFtZXMoKTsKKworCQkJCQkJaWYoYXJnVHlwZU5hbWVzICE9IG51bGwgJiYKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3Isc291cmNlTWV0aG9kLmdldFNlbGVjdG9yKCkpICYmCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXJnVHlwZU5hbWVzLHBhcmFtZXRlclR5cGVOYW1lcykpeworCQkJCQkJCXBhcmFtZXRlck5hbWVzID0gc291cmNlTWV0aG9kLmdldEFyZ3VtZW50TmFtZXMoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gCisJCQl9CisJCX0KKwkJcmV0dXJuIHBhcmFtZXRlck5hbWVzOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZmluZE5lc3RlZFR5cGVzKAorCQljaGFyW10gdHlwZU5hbWUsCisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlLAorCQlTY29wZSBzY29wZSkgeworCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlpbnQgdHlwZUxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKKworCQl3aGlsZSAoc2NvcGUgIT0gbnVsbCkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisKKwkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCisJCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgorCQkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgorCQkJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUgPSAoQmxvY2tTY29wZSkgc2NvcGU7CisKKwkJCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLnNjb3BlSW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgeworCisJCQkJCQlpZiAoYmxvY2tTY29wZS5zdWJzY29wZXNbaV0gaW5zdGFuY2VvZiBDbGFzc1Njb3BlKSB7CisJCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0KKwkJCQkJCQkJKChDbGFzc1Njb3BlKSBibG9ja1Njb3BlLnN1YnNjb3Blc1tpXSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCisJCQkJCQkJaWYgKCFsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQkJCQkJaWYgKHR5cGVMZW5ndGggPiBsb2NhbFR5cGUuc291cmNlTmFtZS5sZW5ndGgpCisJCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHR5cGVOYW1lLCBsb2NhbFR5cGUuc291cmNlTmFtZSwgZmFsc2UKKwkJCQkJCQkJCS8qIGlnbm9yZSBjYXNlICovCisJCQkJCQkJCQkpKQorCQkJCQkJCQkJY29udGludWUgbmV4dDsKKworCQkJCQkJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0eXBlTmFtZSwgbG9jYWxUeXBlLnNvdXJjZU5hbWUpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobG9jYWxUeXBlKTsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCQkJCQkKKwkJCQkJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAorCQkJCQkJCQkJbG9jYWxUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSwKKwkJCQkJCQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lLAorCQkJCQkJCQkJbG9jYWxUeXBlLm1vZGlmaWVycywKKwkJCQkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCQkJCXJlbGV2YW5jZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJCWZpbmRNZW1iZXJUeXBlcyh0eXBlTmFtZSwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBzY29wZSwgY3VycmVudFR5cGUpOworCQkJCQlpZiAodHlwZUxlbmd0aCA9PSAwKQorCQkJCQkJcmV0dXJuOyAvLyBkbyBub3Qgc2VhcmNoIG91dHNpZGUgdGhlIGNsYXNzIHNjb3BlIGlmIG5vIHByZWZpeCB3YXMgcHJvdmlkZWQKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFNjb3BlLkNPTVBJTEFUSU9OX1VOSVRfU0NPUEUgOgorCQkJCQlyZXR1cm47CisJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kUGFja2FnZXMoQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSBwYWNrYWdlU3RhdGVtZW50KSB7CisKKwkJdG9rZW4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZVN0YXRlbWVudC50b2tlbnMsICcuJyk7CisJCWlmICh0b2tlbi5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKworCQlzZXRTb3VyY2VSYW5nZShwYWNrYWdlU3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBwYWNrYWdlU3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXMoQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0b2tlbiksIHRoaXMpOworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kVHlwZXNBbmRQYWNrYWdlcyhjaGFyW10gdG9rZW4sIFNjb3BlIHNjb3BlKSB7CisKKwkJaWYgKHRva2VuID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJaWYgKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBudWxsKQorCQkJZmluZE5lc3RlZFR5cGVzKHRva2VuLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIHNjb3BlKTsKKworCQlpZiAodW5pdFNjb3BlICE9IG51bGwpIHsKKwkJCWludCB0eXBlTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOworCQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9IHVuaXRTY29wZS50b3BMZXZlbFR5cGVzOworCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdHlwZXNbaV07IAorCisJCQkJaWYgKHR5cGVMZW5ndGggPiBzb3VyY2VUeXBlLnNvdXJjZU5hbWUubGVuZ3RoKQljb250aW51ZTsKKwkJCQkKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUsIGZhbHNlKSkJY29udGludWU7CisKKwkJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBzb3VyY2VUeXBlLnNvdXJjZU5hbWUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShzb3VyY2VUeXBlKTsKKworCQkJCWlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSl7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAorCQkJCQkJc291cmNlVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJc291cmNlVHlwZS5zb3VyY2VOYW1lKCksCisJCQkJCQlzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKSwKKwkJCQkJCXNvdXJjZVR5cGUubW9kaWZpZXJzLAorCQkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwgCisJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgKKwkJCQkJCXNvdXJjZVR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJCXNvdXJjZVR5cGUuc291cmNlTmFtZSgpLAorCQkJCQkJc291cmNlVHlwZS5zb3VyY2VOYW1lKCksCisJCQkJCQlzb3VyY2VUeXBlLm1vZGlmaWVycywKKwkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHRva2VuLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCisJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgYmFzZVR5cGVzLCBzY29wZSk7CisJCW5hbWVFbnZpcm9ubWVudC5maW5kVHlwZXModG9rZW4sIHRoaXMpOworCQluYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKHRva2VuLCB0aGlzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZFR5cGVzQW5kU3VicGFja2FnZXMoCisJCWNoYXJbXSB0b2tlbiwKKwkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKworCQljaGFyW10gcXVhbGlmaWVkTmFtZSA9CisJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lLCB0b2tlbiwgJy4nKTsKKworCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGggPT0gMCkgeworCQkJaW50IGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlxdWFsaWZpZWROYW1lLAorCQkJCTAsCisJCQkJcXVhbGlmaWVkTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLAorCQkJCTAsCisJCQkJbGVuZ3RoKTsKKwkJCXF1YWxpZmllZE5hbWVbbGVuZ3RoXSA9ICcuJzsKKwkJfQorCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHF1YWxpZmllZE5hbWUsIHRoaXMpOworCQluYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKHF1YWxpZmllZE5hbWUsIHRoaXMpOworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kVmFyaWFibGVzQW5kTWV0aG9kcygKKwkJY2hhcltdIHRva2VuLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCVNjb3BlIGludm9jYXRpb25TY29wZSkgeworCisJCWlmICh0b2tlbiA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCS8vIFNob3VsZCBsb2NhbCB2YXJpYWJsZXMgaGlkZSBmaWVsZHMgZnJvbSB0aGUgcmVjZWl2ZXIgdHlwZSBvciBhbnkgb2YgaXRzIGVuY2xvc2luZyB0eXBlcz8KKwkJLy8gd2Uga25vdyBpdHMgYW4gaW1wbGljaXQgZmllbGQvbWV0aG9kIGFjY2Vzcy4uLiBzZWUgQmxvY2tTY29wZSBnZXRCaW5kaW5nL2dldEltcGxpY2l0TWV0aG9kCisKKwkJYm9vbGVhbiBzdGF0aWNzT25seSA9IGZhbHNlOworCQkvLyBuZWVkIHRvIGtub3cgaWYgd2UncmUgaW4gYSBzdGF0aWMgY29udGV4dCAob3IgaW5zaWRlIGEgY29uc3RydWN0b3IpCisJCWludCB0b2tlbkxlbmd0aCA9IHRva2VuLmxlbmd0aDsKKworCQlPYmplY3RWZWN0b3IgbG9jYWxzRm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCU9iamVjdFZlY3RvciBmaWVsZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKwkJT2JqZWN0VmVjdG9yIG1ldGhvZHNGb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKworCQlTY29wZSBjdXJyZW50U2NvcGUgPSBzY29wZTsKKworCQlkb25lMSA6IHdoaWxlICh0cnVlKSB7IC8vIGRvbmUgd2hlbiBhIENPTVBJTEFUSU9OX1VOSVRfU0NPUEUgaXMgZm91bmQKKworCQkJc3dpdGNoIChjdXJyZW50U2NvcGUua2luZCkgeworCisJCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgorCQkJCQkvLyBoYW5kbGUgdGhlIGVycm9yIGNhc2UgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgKHNlZSBNZXRob2RTY29wZT4+ZmluZEZpZWxkKQorCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgY3VycmVudFNjb3BlOworCQkJCQlzdGF0aWNzT25seSB8PSBtZXRob2RTY29wZS5pc1N0YXRpYyB8IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOworCisJCQkJY2FzZSBTY29wZS5CTE9DS19TQ09QRSA6CisJCQkJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSA9IChCbG9ja1Njb3BlKSBjdXJyZW50U2NvcGU7CisKKwkJCQkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBibG9ja1Njb3BlLmxvY2Fscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBibG9ja1Njb3BlLmxvY2Fsc1tpXTsKKworCQkJCQkJaWYgKGxvY2FsID09IG51bGwpCisJCQkJCQkJYnJlYWsgbmV4dDsKKworCQkJCQkJaWYgKHRva2VuTGVuZ3RoID4gbG9jYWwubmFtZS5sZW5ndGgpCisJCQkJCQkJY29udGludWUgbmV4dDsKKworCQkJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbG9jYWwubmFtZSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KKwkJCQkJCQkpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJCWlmIChsb2NhbC5pc1NlY3JldCgpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisKKwkJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgbG9jYWxzRm91bmQuc2l6ZTsgZisrKSB7CisJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgb3RoZXJMb2NhbCA9CisJCQkJCQkJCShMb2NhbFZhcmlhYmxlQmluZGluZykgbG9jYWxzRm91bmQuZWxlbWVudEF0KGYpOworCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhvdGhlckxvY2FsLm5hbWUsIGxvY2FsLm5hbWUsIHRydWUpKQorCQkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJfQorCQkJCQkJbG9jYWxzRm91bmQuYWRkKGxvY2FsKTsKKworCQkJCQkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBsb2NhbC5uYW1lKTsKKwkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShsb2NhbC50eXBlKTsKKwkJCQkJCQorCQkJCQkJcmVxdWVzdG9yLmFjY2VwdExvY2FsVmFyaWFibGUoCisJCQkJCQkJbG9jYWwubmFtZSwKKwkJCQkJCQlsb2NhbC50eXBlID09IG51bGwgCisJCQkJCQkJCT8gTm9DaGFyCisJCQkJCQkJCTogbG9jYWwudHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJCWxvY2FsLnR5cGUgPT0gbnVsbAorCQkJCQkJCQk/IGxvY2FsLmRlY2xhcmF0aW9uLnR5cGUudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpCisJCQkJCQkJCTogbG9jYWwudHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQkJbG9jYWwubW9kaWZpZXJzLAorCQkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmUxOworCQkJfQorCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwkJfQorCisJCWN1cnJlbnRTY29wZSA9IHNjb3BlOworCisJCWRvbmUyIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCisJCQlzd2l0Y2ggKGN1cnJlbnRTY29wZS5raW5kKSB7CisKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIGN1cnJlbnRTY29wZTsKKwkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQkvKgkJCQlpZiAodG9rZW5MZW5ndGggPT0gMCkgeyAvLyBvbmx5IHNlYXJjaCBpbnNpZGUgdGhlIHR5cGUgaXRzZWxmIGlmIG5vIHByZWZpeCB3YXMgcHJvdmlkZWQKKwkJCQkJCQkJCQlmaW5kRmllbGRzKHRva2VuLCBlbmNsb3NpbmdUeXBlLmZpZWxkcygpLCBjbGFzc1Njb3BlLCBmaWVsZHNGb3VuZCwgc3RhdGljc09ubHkpOworCQkJCQkJCQkJCWZpbmRNZXRob2RzKHRva2VuLCBlbmNsb3NpbmdUeXBlLm1ldGhvZHMoKSwgY2xhc3NTY29wZSwgbWV0aG9kc0ZvdW5kLCBzdGF0aWNzT25seSwgZmFsc2UpOworCQkJCQkJCQkJCWJyZWFrIGRvbmU7CisJCQkJCQkJCQl9IGVsc2UgeyAqLworCQkJCQlmaW5kRmllbGRzKAorCQkJCQkJdG9rZW4sCisJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJY2xhc3NTY29wZSwKKwkJCQkJCWZpZWxkc0ZvdW5kLAorCQkJCQkJbG9jYWxzRm91bmQsCisJCQkJCQlzdGF0aWNzT25seSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJdHJ1ZSk7CisKKwkJCQkJZmluZE1ldGhvZHMoCisJCQkJCQl0b2tlbiwKKwkJCQkJCW51bGwsCisJCQkJCQllbmNsb3NpbmdUeXBlLAorCQkJCQkJY2xhc3NTY29wZSwKKwkJCQkJCW1ldGhvZHNGb3VuZCwKKwkJCQkJCXN0YXRpY3NPbmx5LAorCQkJCQkJZmFsc2UsCisJCQkJCQlmYWxzZSwKKwkJCQkJCWludm9jYXRpb25TaXRlLAorCQkJCQkJaW52b2NhdGlvblNjb3BlLAorCQkJCQkJdHJ1ZSk7CisJCQkJCXN0YXRpY3NPbmx5IHw9IGVuY2xvc2luZ1R5cGUuaXNTdGF0aWMoKTsKKwkJCQkJLy8JCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgU2NvcGUuQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCWJyZWFrIGRvbmUyOworCQkJfQorCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwkJfQorCX0KKworCS8vIEhlbHBlciBtZXRob2QgZm9yIHByaXZhdGUgdm9pZCBmaW5kVmFyaWFibGVOYW1lcyhjaGFyW10gbmFtZSwgVHlwZVJlZmVyZW5jZSB0eXBlICkKKwlwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZShjaGFyW10gdG9rZW4sIGNoYXJbXSBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUsIGNoYXJbXSBzb3VyY2VOYW1lLCBjaGFyW11bXSBleGNsdWRlTmFtZXMsIGludCBkaW0peworCQkJaWYoc291cmNlTmFtZSA9PSBudWxsIHx8IHNvdXJjZU5hbWUubGVuZ3RoID09IDApCisJCQkJcmV0dXJuOworCQkJCQorCQkJY2hhcltdIG5hbWUgPSBudWxsOworCQkJCisJCQkvLyBjb21wdXRlIHZhcmlhYmxlIG5hbWUgZm9yIGJhc2UgdHlwZQorCQkJdHJ5eworCQkJCW5hbWVTY2FubmVyLnNldFNvdXJjZShzb3VyY2VOYW1lKTsKKwkJCQlzd2l0Y2ggKG5hbWVTY2FubmVyLmdldE5leHRUb2tlbigpKSB7CisJCQkJCWNhc2UgVG9rZW5OYW1laW50IDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVieXRlIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVzaG9ydCA6CisJCQkJCWNhc2UgVG9rZW5OYW1lY2hhciA6CisJCQkJCWNhc2UgVG9rZW5OYW1lbG9uZyA6CisJCQkJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOgorCQkJCQljYXNlIFRva2VuTmFtZWRvdWJsZSA6CisJCQkJCWNhc2UgVG9rZW5OYW1lYm9vbGVhbiA6CisJCQkJCQlpZih0b2tlbiAhPSBudWxsICYmIHRva2VuLmxlbmd0aCAhPSAwKQorCQkJCQkJCXJldHVybjsKKwkJCQkJCW5hbWUgPSBjb21wdXRlQmFzZU5hbWVzKHNvdXJjZU5hbWVbMF0sIGV4Y2x1ZGVOYW1lcyk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYobmFtZSAhPSBudWxsKSB7CisJCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBuYW1lKTsKKwkJCQkJCisJCQkJCS8vIGFjY2VwdCByZXN1bHQKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFZhcmlhYmxlTmFtZSgKKwkJCQkJCXF1YWxpZmllZFBhY2thZ2VOYW1lLAorCQkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJCQkJCW5hbWUsCisJCQkJCQluYW1lLAorCQkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpeworCQkJfQorCQkJCisJCQkvLyBjb21wdXRlIHZhcmlhYmxlIG5hbWUgZm9yIG5vbiBiYXNlIHR5cGUKKwkJCWNoYXJbXVtdIG5hbWVzID0gY29tcHV0ZU5hbWVzKHNvdXJjZU5hbWUsIGRpbSA+IDApOworCQkJY2hhcltdIGRpc3BsYXlOYW1lOworCQkJaWYgKGRpbSA+IDApeworCQkJCWludCBsID0gcXVhbGlmaWVkU291cmNlTmFtZS5sZW5ndGg7CisJCQkJZGlzcGxheU5hbWUgPSBuZXcgY2hhcltsKygyKmRpbSldOworCQkJCVN5c3RlbS5hcnJheWNvcHkocXVhbGlmaWVkU291cmNlTmFtZSwgMCwgZGlzcGxheU5hbWUsIDAsIGwpOworCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBkaW07IGkrKyl7CisJCQkJCWRpc3BsYXlOYW1lW2wrKGkqMildID0gJ1snOworCQkJCQlkaXNwbGF5TmFtZVtsKyhpKjIpKzFdID0gJ10nOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGlzcGxheU5hbWUgPSBxdWFsaWZpZWRTb3VyY2VOYW1lOworCQkJfQorCQkJbmV4dCA6IGZvcihpbnQgaSA9IDAgOyBpIDwgbmFtZXMubGVuZ3RoIDsgaSsrKXsKKwkJCQluYW1lID0gbmFtZXNbaV07CisJCQkJCisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgbmFtZSwgZmFsc2UpKQorCQkJCQljb250aW51ZSBuZXh0OworCQkJCQorCQkJCS8vIGNvbXBsZXRpb24gbXVzdCBiZSBhbiBpZGVudGlmaWVyIChub3QgYSBrZXl3b3JkLCAuLi4pLgorCQkJCXRyeXsKKwkJCQkJbmFtZVNjYW5uZXIuc2V0U291cmNlKG5hbWUpOworCQkJCQlpZihuYW1lU2Nhbm5lci5nZXROZXh0VG9rZW4oKSAhPSBUb2tlbk5hbWVJZGVudGlmaWVyKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKKwkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQkJCisJCQkJaW50IGNvdW50ID0gMjsKKwkJCQljaGFyW10gb3JpZ2luYWxOYW1lID0gbmFtZTsKKwkJCQlmb3IoaW50IGogPSAwIDsgaiA8IGV4Y2x1ZGVOYW1lcy5sZW5ndGggOyBqKyspeworCQkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhuYW1lLCBleGNsdWRlTmFtZXNbal0sIGZhbHNlKSkgeworCQkJCQkJbmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KG9yaWdpbmFsTmFtZSwgU3RyaW5nLnZhbHVlT2YoY291bnQrKykudG9DaGFyQXJyYXkoKSk7CisJCQkJCQlqID0gMDsKKwkJCQkJfQkKKwkJCQl9CisJCQkJCisJCQkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgbmFtZSk7CisJCQkJCisJCQkJLy8gYWNjZXB0IHJlc3VsdAorCQkJCXJlcXVlc3Rvci5hY2NlcHRWYXJpYWJsZU5hbWUoCisJCQkJCXF1YWxpZmllZFBhY2thZ2VOYW1lLAorCQkJCQlkaXNwbGF5TmFtZSwKKwkJCQkJbmFtZSwKKwkJCQkJbmFtZSwKKwkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCXJlbGV2YW5jZSk7CisJCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWVzKGNoYXJbXSBuYW1lLCBUeXBlUmVmZXJlbmNlIHR5cGUgLCBjaGFyW11bXSBleGNsdWRlTmFtZXMpeworCisJCWlmKHR5cGUgIT0gbnVsbCAmJgorCQkJdHlwZS5iaW5kaW5nICE9IG51bGwgJiYKKwkJCXR5cGUuYmluZGluZy5wcm9ibGVtSWQoKSA9PSBCaW5kaW5nLk5vRXJyb3IpeworCQkJVHlwZUJpbmRpbmcgdGIgPSB0eXBlLmJpbmRpbmc7CisJCQlmaW5kVmFyaWFibGVOYW1lKAorCQkJCW5hbWUsCisJCQkJdGIubGVhZkNvbXBvbmVudFR5cGUoKS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCXRiLmxlYWZDb21wb25lbnRUeXBlKCkucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCXRiLmxlYWZDb21wb25lbnRUeXBlKCkuc291cmNlTmFtZSgpLAorCQkJCWV4Y2x1ZGVOYW1lcywKKwkJCQl0eXBlLmRpbWVuc2lvbnMoKSk7CisJCX0vKgllbHNlIHsKKwkJCWNoYXJbXVtdIHR5cGVOYW1lID0gdHlwZS5nZXRUeXBlTmFtZSgpOworCQkJZmluZFZhcmlhYmxlTmFtZSgKKwkJCQluYW1lLAorCQkJCU5vQ2hhciwKKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZU5hbWUsICcuJyksCisJCQkJdHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoIC0gMV0sCisJCQkJZXhjbHVkZU5hbWVzLAorCQkJCXR5cGUuZGltZW5zaW9ucygpKTsKKwkJfSovCisJfQorCQorCXB1YmxpYyBBc3Npc3RQYXJzZXIgZ2V0UGFyc2VyKCkgeworCisJCXJldHVybiBwYXJzZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisKKwkJc3VwZXIucmVzZXQoKTsKKwkJdGhpcy5rbm93blBrZ3MgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoMTApOworCQl0aGlzLmtub3duVHlwZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoMTApOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKworCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBzdGFydDsKKwkJdGhpcy5lbmRQb3NpdGlvbiA9IGVuZCArIDE7CisJfQorCQorCXByaXZhdGUgY2hhcltdIGNvbXB1dGVCYXNlTmFtZXMoY2hhciBmaXJzdE5hbWUsIGNoYXJbXVtdIGV4Y2x1ZGVOYW1lcyl7CisJCWNoYXJbXSBuYW1lID0gbmV3IGNoYXJbXXtmaXJzdE5hbWV9OworCQkKKwkJZm9yKGludCBpID0gMCA7IGkgPCBleGNsdWRlTmFtZXMubGVuZ3RoIDsgaSsrKXsKKwkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKG5hbWUsIGV4Y2x1ZGVOYW1lc1tpXSwgZmFsc2UpKSB7CisJCQkJbmFtZVswXSsrOworCQkJCWlmKG5hbWVbMF0gPiAneicpCisJCQkJCW5hbWVbMF0gPSAnYSc7CisJCQkJaWYobmFtZVswXSA9PSBmaXJzdE5hbWUpCisJCQkJCXJldHVybiBudWxsOworCQkJCWkgPSAwOworCQkJfQkKKwkJfQorCQkKKwkJcmV0dXJuIG5hbWU7CisJfQorCXByaXZhdGUgdm9pZCBjb21wdXRlRXhwZWN0ZWRUeXBlcyhBc3ROb2RlIHBhcmVudCwgU2NvcGUgc2NvcGUpeworCQlpbnQgZXhwZWN0ZWRUeXBlQ291bnQgPSAwOworCQlleHBlY3RlZFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nWzFdOworCQkKKwkJaWYocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB7CisJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gKChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pcGFyZW50KS50eXBlLmJpbmRpbmc7CisJCQlpZihiaW5kaW5nICE9IG51bGwpIHsKKwkJCQlleHBlY3RlZFR5cGVzW2V4cGVjdGVkVHlwZUNvdW50KytdID0gYmluZGluZzsKKwkJCX0KKwkJfSBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKKwkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSAoKEFzc2lnbm1lbnQpcGFyZW50KS5saHNUeXBlOworCQkJaWYoYmluZGluZyAhPSBudWxsKSB7CisJCQkJZXhwZWN0ZWRUeXBlc1tleHBlY3RlZFR5cGVDb3VudCsrXSA9IGJpbmRpbmc7CisJCQl9CisJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgc2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KS5iaW5kaW5nOworCQkJVHlwZUJpbmRpbmcgYmluZGluZyA9IG1ldGhvZEJpbmRpbmcgID09IG51bGwgPyBudWxsIDogbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlOworCQkJaWYoYmluZGluZyAhPSBudWxsKSB7CisJCQkJZXhwZWN0ZWRUeXBlc1tleHBlY3RlZFR5cGVDb3VudCsrXSA9IGJpbmRpbmc7CisJCQl9CisJCX0KKwkJCisJCVN5c3RlbS5hcnJheWNvcHkoZXhwZWN0ZWRUeXBlcywgMCwgZXhwZWN0ZWRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tleHBlY3RlZFR5cGVDb3VudF0sIDAsIGV4cGVjdGVkVHlwZUNvdW50KTsKKwl9CisJcHJpdmF0ZSBjaGFyW11bXSBjb21wdXRlTmFtZXMoY2hhcltdIHNvdXJjZU5hbWUsIGJvb2xlYW4gZm9yQXJyYXkpeworCQljaGFyW11bXSBuYW1lcyA9IG5ldyBjaGFyWzVdW107CisJCWludCBuYW1lQ291bnQgPSAwOworCQlib29sZWFuIHByZXZpb3VzSXNVcHBlckNhc2UgPSBmYWxzZTsKKwkJZm9yKGludCBpID0gc291cmNlTmFtZS5sZW5ndGggLSAxIDsgaSA+PSAwIDsgaS0tKXsKKwkJCWJvb2xlYW4gaXNVcHBlckNhc2UgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc291cmNlTmFtZVtpXSk7CisJCQlpZihpc1VwcGVyQ2FzZSAmJiAhcHJldmlvdXNJc1VwcGVyQ2FzZSl7CisJCQkJY2hhcltdIG5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNvdXJjZU5hbWUsaSxzb3VyY2VOYW1lLmxlbmd0aCk7CisJCQkJaWYobmFtZS5sZW5ndGggPiAxKXsKKwkJCQkJaWYobmFtZUNvdW50ID09IG5hbWVzLmxlbmd0aCkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgbmFtZXMgPSBuZXcgY2hhcltuYW1lQ291bnQgKiAyXVtdLCAwLCBuYW1lQ291bnQpOworCQkJCQl9CisJCQkJCW5hbWVbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZVswXSk7CisJCQkJCQorCQkJCQlpZihmb3JBcnJheSkgeworCQkJCQkJaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoOworCQkJCQkJaWYgKG5hbWVbbGVuZ3RoLTFdID09ICdzJyl7CisJCQkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMl0sIDAsIGxlbmd0aCk7CisJCQkJCQkJbmFtZVtsZW5ndGhdID0gJ2UnOworCQkJCQkJCW5hbWVbbGVuZ3RoKzFdID0gJ3MnOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWUsIDAsIG5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKKwkJCQkJCQluYW1lW2xlbmd0aF0gPSAncyc7CisJCQkJCQl9CisJCQkJCX0JCQkJCQorCQkJCQluYW1lc1tuYW1lQ291bnQrK10gPSBuYW1lOworCQkJCX0KKwkJCX0KKwkJCXByZXZpb3VzSXNVcHBlckNhc2UgPSBpc1VwcGVyQ2FzZTsKKwkJfQorCQlpZihuYW1lQ291bnQgPT0gMCl7CisJCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc291cmNlTmFtZSk7CisJCQlpZihmb3JBcnJheSkgeworCQkJCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aDsKKwkJCQlpZiAobmFtZVtsZW5ndGgtMV0gPT0gJ3MnKXsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMl0sIDAsIGxlbmd0aCk7CisJCQkJCW5hbWVbbGVuZ3RoXSA9ICdlJzsKKwkJCQkJbmFtZVtsZW5ndGgrMV0gPSAncyc7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7CisJCQkJCW5hbWVbbGVuZ3RoXSA9ICdzJzsKKwkJCQl9CisJCQl9CQkJCQkKKwkJCW5hbWVzW25hbWVDb3VudCsrXSA9IG5hbWU7CisJCQkKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBuYW1lcyA9IG5ldyBjaGFyW25hbWVDb3VudF1bXSwgMCwgbmFtZUNvdW50KTsKKwkJcmV0dXJuIG5hbWVzOworCX0KKwkKKwlwcml2YXRlIGNoYXJbXSBjb21wdXRlUHJlZml4KFNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmF0aW9uVHlwZSwgU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpeworCQkKKwkJU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKworCQlpZiAoaXNTdGF0aWMpIHsKKwkJCWNvbXBsZXRpb24uYXBwZW5kKGRlY2xhcmF0aW9uVHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCisJCX0gZWxzZSBpZiAoZGVjbGFyYXRpb25UeXBlID09IGludm9jYXRpb25UeXBlKSB7CisJCQljb21wbGV0aW9uLmFwcGVuZChUSElTKTsKKwkJCQorCQl9IGVsc2UgeworCQkJCisJCQlpZiAoIWRlY2xhcmF0aW9uVHlwZS5pc05lc3RlZFR5cGUoKSkgeworCQkJCQorCQkJCWNvbXBsZXRpb24uYXBwZW5kKGRlY2xhcmF0aW9uVHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcuJyk7CisJCQkJY29tcGxldGlvbi5hcHBlbmQoVEhJUyk7CisKKwkJCX0gZWxzZSBpZiAoIWRlY2xhcmF0aW9uVHlwZS5pc0Fub255bW91c1R5cGUoKSkgeworCQkJCQorCQkJCWNvbXBsZXRpb24uYXBwZW5kKGRlY2xhcmF0aW9uVHlwZS5zb3VyY2VOYW1lKCkpOworCQkJCWNvbXBsZXRpb24uYXBwZW5kKCcuJyk7CisJCQkJY29tcGxldGlvbi5hcHBlbmQoVEhJUyk7CisJCQkJCisJCQl9CisJCX0KKwkJCisJCXJldHVybiBjb21wbGV0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzRW5jbG9zZWQoUmVmZXJlbmNlQmluZGluZyBwb3NzaWJsZUVuY2xvc2luZ1R5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZSl7CisJCWlmKHR5cGUuaXNOZXN0ZWRUeXBlKCkpeworCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSB0eXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlKGVuY2xvc2luZyAhPSBudWxsICl7CisJCQkJaWYocG9zc2libGVFbmNsb3NpbmdUeXBlID09IGVuY2xvc2luZykKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZW5jbG9zaW5nID0gZW5jbG9zaW5nLmVuY2xvc2luZ1R5cGUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlYXJjaFJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTQyODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCByZXF1ZXN0b3IgcGFzc2VkIHRvIHRoZSBzZWFyY2hhYmxlIG5hbWUgZW52aXJvbm1lbnQKKyAqIHNvIGFzIHRvIHByb2Nlc3MgdGhlIG11bHRpcGxlIHNlYXJjaCByZXN1bHRzIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisgKgorICogSXQgaXMgdXNlZCB0byBhbGxvdyB0aGUgY29kZSBhc3Npc3QgZW5naW5lIHRvIGFkZCBzb21lIG1vcmUgaW5mb3JtYXRpb24KKyAqIHRvIHRoZSByYXcgbmFtZSBlbnZpcm9ubWVudCByZXN1bHRzIGJlZm9yZSBhbnN3ZXJpbmcgdGhlbSB0byB0aGUgVUkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFJlcXVlc3RvciB7CisJCisJLyoqCisJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IGNsYXNzLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IG1vZGlmaWVycyk7CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgaW50ZXJmYWNlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuSSIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBtb2RpZmllcnMpOworCisJLyoqCisJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHBhY2thZ2UuCisJICoKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSk7CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgdHlwZS4KKwkgKgorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzFmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgQVBJIHRoYXQgbWF5IGJlIHVzZWQgdG8gaW1wbGVtZW50IGFueQorICogc2VhcmNoLWJhc2VkIHRvb2wgKHN1Y2ggYXMgYSBDb2RlQXNzaXN0LCBhIEZpbmRlciwgLi4uKS4KKyAqIEl0IGlzIG1haW5seSB1c2VkIHRvIGhpZGUgZnJvbSB0aGUgc2VhcmNoIHRvb2wgdGhlIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgdW5kZXJseWluZyBlbnZpcm9ubWVudCBhbmQgaXRzIGNvbnN0cnVjdGlvbnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgZXh0ZW5kcyBJTmFtZUVudmlyb25tZW50IHsKKworCS8qKgorCSAqIEZpbmQgdGhlIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LgorCSAqIEEgdmFsaWQgcHJlZml4IGlzIGEgcXVhbGlmaWVkIG5hbWUgc2VwYXJhdGVkIGJ5IHBlcmlvZHMKKwkgKiAoZXguIGphdmEudXRpbCkuCisJICogVGhlIHBhY2thZ2VzIGZvdW5kIGFyZSBwYXNzZWQgdG86CisJICogICAgSVNlYXJjaFJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKGNoYXJbXVtdIHBhY2thZ2VOYW1lKQorCSAqLworCXZvaWQgZmluZFBhY2thZ2VzKGNoYXJbXSBwcmVmaXgsIElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKKworCS8qKgorCSAqIEZpbmQgdGhlIHRvcC1sZXZlbCB0eXBlcyAoY2xhc3NlcyBhbmQgaW50ZXJmYWNlcykgdGhhdCBhcmUgZGVmaW5lZAorCSAqIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFuZCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZQorCSAqIGdpdmVuIHByZWZpeC4gVGhlIHByZWZpeCBpcyBhIHF1YWxpZmllZCBuYW1lIHNlcGFyYXRlZCBieSBwZXJpb2RzCisJICogb3IgYSBzaW1wbGUgbmFtZSAoZXguIGphdmEudXRpbC5WIG9yIFYpLgorCSAqCisJICogVGhlIHR5cGVzIGZvdW5kIGFyZSBwYXNzZWQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoaWYgYWRkaXRpb25hbAorCSAqIGluZm9ybWF0aW9uIGlzIGtub3duIGFib3V0IHRoZSB0eXBlcyk6CisJICogICAgSVNlYXJjaFJlcXVlc3Rvci5hY2NlcHRUeXBlKGNoYXJbXVtdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpCisJICogICAgSVNlYXJjaFJlcXVlc3Rvci5hY2NlcHRDbGFzcyhjaGFyW11bXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgbW9kaWZpZXJzKQorCSAqICAgIElTZWFyY2hSZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKGNoYXJbXVtdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBtb2RpZmllcnMpCisJICoKKwkgKiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIHVzZWQgdG8gZmluZCBtZW1iZXIgdHlwZXMuLi4gbWVtYmVyCisJICogdHlwZXMgYXJlIGZvdW5kIHJlbGF0aXZlIHRvIHRoZWlyIGVuY2xvc2luZyB0eXBlLgorCSAqLworCXZvaWQgZmluZFR5cGVzKGNoYXJbXSBwcmVmaXgsIElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWxlY3Rpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWxlY3Rpb25SZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKKworLyoqCisgKiBBIHNlbGVjdGlvbiByZXF1ZXN0b3IgYWNjZXB0cyByZXN1bHRzIGZyb20gdGhlIHNlbGVjdGlvbiBlbmdpbmUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvblJlcXVlc3RvciB7CisJLyoqCisJICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgY2xhc3Mgc2VsZWN0aW9uLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBjaGFyW10KKwkgKiAJCURlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc05hbWUgY2hhcltdCisJICogCQlOYW1lIG9mIHRoZSBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gbmVlZFF1YWxpZmljYXRpb24gYm9vbGVhbgorCSAqIAkJRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0eXBlIG5hbWUgCisJICogICAgCW11c3QgYmUgcXVhbGlmaWVkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGRlcGVuZGluZyBvbiBpbXBvcnRzKS4KKwkgKgorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJdm9pZCBhY2NlcHRDbGFzcygKKwkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQljaGFyW10gY2xhc3NOYW1lLAorCQlib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKTsKKworCS8qKgorCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGNvbXBpbGF0aW9uIGVycm9yIGRldGVjdGVkIGR1cmluZyBzZWxlY3Rpb24uCisJICogIEBwYXJhbSBlcnJvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW0KKwkgKiAgICAgIE9ubHkgcHJvYmxlbXMgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGFzIGVycm9ycyBhcmUgbm90aWZpZWQgdG8gdGhlIHJlcXVlc3RvciwKKwkgKgkJd2FybmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisJICoJCUluIGNhc2UgYW4gZXJyb3IgZ290IHNpZ25hbGVkLCBubyBvdGhlciBjb21wbGV0aW9ucyBtaWdodCBiZSBhdmFpbGFibGUsCisJICoJCXRoZXJlZm9yZSB0aGUgcHJvYmxlbSBtZXNzYWdlIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICoJCVRoZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBwcm9ibGVtIGFyZSByZWxhdGVkIHRvIHRoZSBzb3VyY2Ugd2hlcmUgaXQgd2FzCisJICoJCWRldGVjdGVkIChtaWdodCBiZSBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQsIGlmIGl0IHdhcyBpbmRpcmVjdGx5IHJlcXVlc3RlZAorCSAqCQlkdXJpbmcgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3MpLgorCSAqICAgICAgTm90ZTogdGhlIHByb2JsZW0ga25vd3MgaXRzIG9yaWdpbmF0aW5nIGZpbGUgbmFtZS4KKwkgKi8KKwl2b2lkIGFjY2VwdEVycm9yKElQcm9ibGVtIGVycm9yKTsKKworCS8qKgorCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGZpZWxkIHNlbGVjdGlvbi4KKwkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIGNoYXJbXQorCSAqIAkJTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQgaXMgZGVjbGFyZWQuCisJICogCisJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIGNoYXJbXQorCSAqIAkJTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgZmllbGQuCisJICogCisJICogQHBhcmFtIG5hbWUgY2hhcltdCisJICogCQlOYW1lIG9mIHRoZSBmaWVsZC4KKwkgKgorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJdm9pZCBhY2NlcHRGaWVsZCgKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCQljaGFyW10gbmFtZSk7CisKKwkvKioKKwkgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYW4gaW50ZXJmYWNlIHNlbGVjdGlvbi4KKwkgKiBAcGFyYW0gcGFja2FnZU5hbWUgY2hhcltdCisJICogCQlEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UuCisJICogCisJICogQHBhcmFtIGludGVyZmFjZU5hbWUgY2hhcltdCisJICogCQlOYW1lIG9mIHRoZSBpbnRlcmZhY2UuCisJICogCisJICogQHBhcmFtIG5lZWRRdWFsaWZpY2F0aW9uIGJvb2xlYW4KKwkgKiAJCUZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdHlwZSBuYW1lIAorCSAqICAgIAltdXN0IGJlIHF1YWxpZmllZCBieSBpdHMgcGFja2FnZSBuYW1lIChkZXBlbmRpbmcgb24gaW1wb3J0cykuCisJICoKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5JIi4KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorCSAqLworCXZvaWQgYWNjZXB0SW50ZXJmYWNlKAorCQljaGFyW10gcGFja2FnZU5hbWUsCisJCWNoYXJbXSBpbnRlcmZhY2VOYW1lLAorCQlib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKTsKKworCS8qKgorCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBzZWxlY3Rpb24uCisJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBjaGFyW10KKwkgKiAJCU5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuCisJICogCisJICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIGNoYXJbXQorCSAqIAkJTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBzZWxlY3RvciBjaGFyW10KKwkgKiAJCU5hbWUgb2YgdGhlIG5ldyBtZXRob2QuCisJICogCisJICogQHBhcmFtIHBhcmFtZXRlclBhY2thZ2VOYW1lcyBjaGFyW11bXQorCSAqIAkJTmFtZXMgb2YgdGhlIHBhY2thZ2VzIGluIHdoaWNoIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGRlY2xhcmVkLgorCSAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclR5cGVOYW1lcy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWVzIGNoYXJbXVtdCisJICogCQlOYW1lcyBvZiB0aGUgcGFyYW1ldGVycyB0eXBlcy4KKwkgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMuCisJICogCisJICogIEBwYXJhbSBpc0NvbnN0cnVjdG9yIGJvb2xlYW4KKwkgKiAJCUFuc3dlciBpZiB0aGUgbWV0aG9kIGlzIGEgY29uc3RydWN0b3IuCisJICoKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgorCSAqICAgIEFycmF5IHR5cGVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIk1bXSIgb3IgImludFtdIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJdm9pZCBhY2NlcHRNZXRob2QoCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwkJY2hhcltdIHNlbGVjdG9yLAorCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKwkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yKTsKKworCS8qKgorCSAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIHBhY2thZ2Ugc2VsZWN0aW9uLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBjaGFyW10KKwkgKiAJCVRoZSBwYWNrYWdlIG5hbWUuCisJICoKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwl2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1JlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9SZWxldmFuY2VDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVlMThlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9SZWxldmFuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKKworcHVibGljIGludGVyZmFjZSBSZWxldmFuY2VDb25zdGFudHMgeworCQorCWludCBSX0RFRkFVTFQgPSAwOworCWludCBSX0NBU0UgPSAxMDsKKwlpbnQgUl9FWFBFQ1RFRF9UWVBFID0gMjA7CisJaW50IFJfSU5URVJGQUNFID0gMjA7CisJaW50IFJfQ0xBU1MgPSAyMDsKKwlpbnQgUl9FWENFUFRJT04gPSAyMDsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvU2VsZWN0aW9uRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDFlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhCkBAIC0wLDAgKzEsNzM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKKworLyoqCisgKiBUaGUgc2VsZWN0aW9uIGVuZ2luZSBpcyBpbnRlbmRlZCB0byBpbmZlciB0aGUgbmF0dXJlIG9mIGEgc2VsZWN0ZWQgbmFtZSBpbiBzb21lCisgKiBzb3VyY2UgY29kZS4gVGhpcyBuYW1lIGNhbiBiZSBxdWFsaWZpZWQuCisgKgorICogU2VsZWN0aW9uIGlzIHJlc29sdmluZyBjb250ZXh0IHVzaW5nIGEgbmFtZSBlbnZpcm9ubWVudCAobm8gbmVlZCB0byBzZWFyY2gpLCBhc3N1bWluZworICogdGhlIHNvdXJjZSB3aGVyZSBzZWxlY3Rpb24gb2NjdXJyZWQgaXMgY29ycmVjdCBhbmQgd2lsbCBub3QgcGVyZm9ybSBhbnkgY29tcGxldGlvbgorICogYXR0ZW1wdC4gSWYgdGhpcyB3YXMgdGhlIGRlc2lyZWQgYmVoYXZpb3IsIGEgY2FsbCB0byB0aGUgQ29tcGxldGlvbkVuZ2luZSBzaG91bGQgYmUKKyAqIHBlcmZvcm1lZCBpbnN0ZWFkLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VsZWN0aW9uRW5naW5lIGV4dGVuZHMgRW5naW5lIGltcGxlbWVudHMgSVNlYXJjaFJlcXVlc3RvciB7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKwkKKwlTZWxlY3Rpb25QYXJzZXIgcGFyc2VyOworCUlTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yOworCisJYm9vbGVhbiBhY2NlcHRlZEFuc3dlcjsKKworCXByaXZhdGUgaW50IGFjdHVhbFNlbGVjdGlvblN0YXJ0OworCXByaXZhdGUgaW50IGFjdHVhbFNlbGVjdGlvbkVuZDsKKwlwcml2YXRlIGNoYXJbXSBxdWFsaWZpZWRTZWxlY3Rpb247CisJcHJpdmF0ZSBjaGFyW10gc2VsZWN0ZWRJZGVudGlmaWVyOworCQorCXByaXZhdGUgY2hhcltdW11bXSBhY2NlcHRlZENsYXNzZXM7CisJcHJpdmF0ZSBjaGFyW11bXVtdIGFjY2VwdGVkSW50ZXJmYWNlczsKKwlpbnQgYWNjZXB0ZWRDbGFzc2VzQ291bnQ7CisJaW50IGFjY2VwdGVkSW50ZXJmYWNlc0NvdW50OworCisJLyoqCisJICogVGhlIFNlbGVjdGlvbkVuZ2luZSBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHRoZSBzZWxlY3RlZCBvYmplY3QuCisJICoKKwkgKiBJdCByZXF1aXJlcyBhIHNlYXJjaGFibGUgbmFtZSBlbnZpcm9ubWVudCwgd2hpY2ggc3VwcG9ydHMgc29tZQorCSAqIHNwZWNpZmljIHNlYXJjaCBBUElzLCBhbmQgYSByZXF1ZXN0b3IgdG8gZmVlZCBiYWNrIHRoZSByZXN1bHRzIHRvIGEgVUkuCisJICoKKwkgKiAgQHBhcmFtIG5hbWVFbnZpcm9ubWVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudAorCSAqICAgICAgdXNlZCB0byByZXNvbHZlIHR5cGUvcGFja2FnZSByZWZlcmVuY2VzIGFuZCBzZWFyY2ggZm9yIHR5cGVzL3BhY2thZ2VzCisJICogICAgICBiYXNlZCBvbiBwYXJ0aWFsIG5hbWVzLgorCSAqCisJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlbGVjdGlvblJlcXVlc3RvcgorCSAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZSAKKwkgKiAgICAgIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlcXVlc3RvciBhYmxlIHRvIGFjY2VwdCBhbGwgcG9zc2libGUgY29tcGxldGlvbnMuCisJICoKKwkgKiAgQHBhcmFtIHNldHRpbmdzIGphdmEudXRpbC5NYXAKKwkgKgkJc2V0IG9mIG9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIGNvZGUgYXNzaXN0IGVuZ2luZS4KKwkgKi8KKwlwdWJsaWMgU2VsZWN0aW9uRW5naW5lKAorCQlJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQsCisJCUlTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlNYXAgc2V0dGluZ3MpIHsKKworCQlzdXBlcihzZXR0aW5ncyk7CisKKwkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJCXRoaXMubmFtZUVudmlyb25tZW50ID0gbmFtZUVudmlyb25tZW50OworCisJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPQorCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKKwkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKKwkJCQl0aGlzLmNvbXBpbGVyT3B0aW9ucywKKwkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSB7CisJCQlwdWJsaWMgdm9pZCByZWNvcmQoSVByb2JsZW0gcHJvYmxlbSwgQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCwgUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CisJCQkJdW5pdFJlc3VsdC5yZWNvcmQocHJvYmxlbSwgcmVmZXJlbmNlQ29udGV4dCk7CisJCQkJU2VsZWN0aW9uRW5naW5lLnRoaXMucmVxdWVzdG9yLmFjY2VwdEVycm9yKHByb2JsZW0pOworCQkJfQorCQl9OworCQl0aGlzLnBhcnNlciA9IG5ldyBTZWxlY3Rpb25QYXJzZXIocHJvYmxlbVJlcG9ydGVyLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5hc3NlcnRNb2RlKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgdGhpcy5jb21waWxlck9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgbmFtZUVudmlyb25tZW50KTsKKwl9CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgY2xhc3MuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIGNoYXJbXQorCSAqIEBwYXJhbSBjbGFzc05hbWUgY2hhcltdCisJICogQHBhcmFtIG1vZGlmaWVycyBpbnQKKwkgKgorCSAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisJICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKwkgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBpbnQgbW9kaWZpZXJzKSB7CisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjbGFzc05hbWUsIHNlbGVjdGVkSWRlbnRpZmllcikpIHsKKwkJCWlmIChxdWFsaWZpZWRTZWxlY3Rpb24gIT0gbnVsbAorCQkJCSYmICFDaGFyT3BlcmF0aW9uLmVxdWFscygKKwkJCQkJcXVhbGlmaWVkU2VsZWN0aW9uLAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdChwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCAnLicpKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7CisJCQkJY2hhcltdW10gYWNjZXB0ZWRDbGFzcyA9IG5ldyBjaGFyWzJdW107CisJCQkJYWNjZXB0ZWRDbGFzc1swXSA9IHBhY2thZ2VOYW1lOworCQkJCWFjY2VwdGVkQ2xhc3NbMV0gPSBjbGFzc05hbWU7CisJCQkJCisJCQkJaWYoYWNjZXB0ZWRDbGFzc2VzID09IG51bGwpIHsKKwkJCQkJYWNjZXB0ZWRDbGFzc2VzID0gbmV3IGNoYXJbMTBdW11bXTsKKwkJCQkJYWNjZXB0ZWRDbGFzc2VzQ291bnQgPSAwOworCQkJCX0KKwkJCQlpbnQgbGVuZ3RoID0gYWNjZXB0ZWRDbGFzc2VzLmxlbmd0aDsKKwkJCQlpZihsZW5ndGggPT0gYWNjZXB0ZWRDbGFzc2VzQ291bnQpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShhY2NlcHRlZENsYXNzZXMsIDAsIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBjaGFyWyhsZW5ndGggKyAxKSogMl1bXVtdLCAwLCBsZW5ndGgpOworCQkJCX0KKwkJCQlhY2NlcHRlZENsYXNzZXNbYWNjZXB0ZWRDbGFzc2VzQ291bnQrK10gPSBhY2NlcHRlZENsYXNzOworCQkJCQorCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCisJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQljbGFzc05hbWUsCisJCQkJCWZhbHNlKTsKKwkJCQlhY2NlcHRlZEFuc3dlciA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBPbmUgcmVzdWx0IG9mIHRoZSBzZWFyY2ggY29uc2lzdHMgb2YgYSBuZXcgaW50ZXJmYWNlLgorCSAqCisJICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKwkgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorCSAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuSSIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJY2hhcltdIGludGVyZmFjZU5hbWUsCisJCWludCBtb2RpZmllcnMpIHsKKworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoaW50ZXJmYWNlTmFtZSwgc2VsZWN0ZWRJZGVudGlmaWVyKSkgeworCQkJaWYgKHF1YWxpZmllZFNlbGVjdGlvbiAhPSBudWxsCisJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKAorCQkJCQlxdWFsaWZpZWRTZWxlY3Rpb24sCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBpbnRlcmZhY2VOYW1lLCAnLicpKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCBpbnRlcmZhY2VOYW1lKSkgeworCQkJCWNoYXJbXVtdIGFjY2VwdGVkSW50ZXJmYWNlPSBuZXcgY2hhclsyXVtdOworCQkJCWFjY2VwdGVkSW50ZXJmYWNlWzBdID0gcGFja2FnZU5hbWU7CisJCQkJYWNjZXB0ZWRJbnRlcmZhY2VbMV0gPSBpbnRlcmZhY2VOYW1lOworCQkJCQorCQkJCWlmKGFjY2VwdGVkSW50ZXJmYWNlcyA9PSBudWxsKSB7CisJCQkJCWFjY2VwdGVkSW50ZXJmYWNlcyA9IG5ldyBjaGFyWzEwXVtdW107CisJCQkJCWFjY2VwdGVkSW50ZXJmYWNlc0NvdW50ID0gMDsKKwkJCQl9CisJCQkJaW50IGxlbmd0aCA9IGFjY2VwdGVkSW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IGFjY2VwdGVkSW50ZXJmYWNlc0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYWNjZXB0ZWRJbnRlcmZhY2VzLCAwLCBhY2NlcHRlZEludGVyZmFjZXMgPSBuZXcgY2hhclsobGVuZ3RoICsgMSkgKiAyXVtdW10sIDAsIGxlbmd0aCk7CisJCQkJfQorCQkJCWFjY2VwdGVkSW50ZXJmYWNlc1thY2NlcHRlZEludGVyZmFjZXNDb3VudCsrXSA9IGFjY2VwdGVkSW50ZXJmYWNlOworCQkJCQorCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAorCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJaW50ZXJmYWNlTmFtZSwKKwkJCQkJZmFsc2UpOworCQkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIE9uZSByZXN1bHQgb2YgdGhlIHNlYXJjaCBjb25zaXN0cyBvZiBhIG5ldyBwYWNrYWdlLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBjaGFyW10KKwkgKiAKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSkgeworCX0KKworCXByaXZhdGUgdm9pZCBhY2NlcHRRdWFsaWZpZWRUeXBlcygpIHsKKwkJaWYoYWNjZXB0ZWRDbGFzc2VzICE9IG51bGwpeworCQkJYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRlZENsYXNzZXNDb3VudDsgaSsrKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAorCQkJCQlhY2NlcHRlZENsYXNzZXNbaV1bMF0sCisJCQkJCWFjY2VwdGVkQ2xhc3Nlc1tpXVsxXSwKKwkJCQkJdHJ1ZSk7CisJCQl9CisJCQlhY2NlcHRlZENsYXNzZXMgPSBudWxsOworCQkJYWNjZXB0ZWRDbGFzc2VzQ291bnQgPSAwOworCQl9CisJCWlmKGFjY2VwdGVkSW50ZXJmYWNlcyAhPSBudWxsKXsKKwkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXB0ZWRJbnRlcmZhY2VzQ291bnQ7IGkrKykgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCisJCQkJCWFjY2VwdGVkSW50ZXJmYWNlc1tpXVswXSwKKwkJCQkJYWNjZXB0ZWRJbnRlcmZhY2VzW2ldWzFdLAorCQkJCQl0cnVlKTsKKwkJCX0KKwkJCWFjY2VwdGVkSW50ZXJmYWNlcyA9IG51bGw7CisJCQlhY2NlcHRlZEludGVyZmFjZXNDb3VudCA9IDA7CisJCX0KKwl9CisJCisJLyoqCisJICogT25lIHJlc3VsdCBvZiB0aGUgc2VhcmNoIGNvbnNpc3RzIG9mIGEgbmV3IHR5cGUuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIGNoYXJbXQorCSAqIEBwYXJhbSB0eXBlTmFtZSBjaGFyW10KKwkgKiAKKwkgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorCSAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisJICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKwkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpIHsKKwkJYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAwKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tTZWxlY3Rpb24oCisJCWNoYXJbXSBzb3VyY2UsCisJCWludCBzZWxlY3Rpb25TdGFydCwKKwkJaW50IHNlbGVjdGlvbkVuZCkgeworCisJCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CisJCQorCQlpbnQgbGFzdElkZW50aWZpZXJTdGFydCA9IC0xOworCQlpbnQgbGFzdElkZW50aWZpZXJFbmQgPSAtMTsKKwkJY2hhcltdIGxhc3RJZGVudGlmaWVyID0gbnVsbDsKKwkJaW50IHRva2VuLCBpZGVudENvdW50ID0gMDsKKwkJU3RyaW5nQnVmZmVyIGVudGlyZVNlbGVjdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoc2VsZWN0aW9uRW5kIC0gc2VsZWN0aW9uU3RhcnQgKyAxKTsKKwkJCisJCWlmKHNlbGVjdGlvblN0YXJ0ID4gc2VsZWN0aW9uRW5kKXsKKwkJCQorCQkJLy8gY29tcHV0ZSBzdGFydCBwb3NpdGlvbiBvZiBjdXJyZW50IGxpbmUKKwkJCWludCBjdXJyZW50UG9zaXRpb24gPSBzZWxlY3Rpb25TdGFydCAtIDE7CisJCQlpbnQgbmV4dENoYXJhY3RlclBvc2l0aW9uID0gc2VsZWN0aW9uU3RhcnQ7CisJCQljaGFyIGN1cnJlbnRDaGFyYWN0ZXIgPSAnICc7CisJCQl0cnkgeworCQkJCXdoaWxlKGN1cnJlbnRQb3NpdGlvbiA+IDAgfHwgY3VycmVudENoYXJhY3RlciA9PSAnXHInIHx8IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJyl7CisJCQkJCQorCQkJCQlpZihzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnICYmIHNvdXJjZVtjdXJyZW50UG9zaXRpb24rMV0gPT0gJ3UnKSB7CisJCQkJCQlpbnQgcG9zID0gY3VycmVudFBvc2l0aW9uICsgMjsKKwkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQl3aGlsZSAoc291cmNlW3Bvc10gPT0gJ3UnKSB7CisJCQkJCQkJcG9zKys7CisJCQkJCQl9CisJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbcG9zKytdKSkgPiAxNQorCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW3BvcysrXSkpID4gMTUKKwkJCQkJCQl8fCBjMiA8IDAKKwkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtwb3MrK10pKSA+IDE1CisJCQkJCQkJfHwgYzMgPCAwCisJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbcG9zKytdKSkgPiAxNQorCQkJCQkJCXx8IGM0IDwgMCkgeworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQluZXh0Q2hhcmFjdGVyUG9zaXRpb24gPSBwb3M7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbl07CisJCQkJCQluZXh0Q2hhcmFjdGVyUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb24rMTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYoY3VycmVudENoYXJhY3RlciA9PSAnXHInIHx8IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCisJCQkvLyBjb21wdXRlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGxhc3QgdG9rZW4KKwkJCXNjYW5uZXIucmVzZXRUbyhuZXh0Q2hhcmFjdGVyUG9zaXRpb24sIHNlbGVjdGlvbkVuZCk7CisJCQlkbyB7CisJCQkJdHJ5IHsKKwkJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJaWYoKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldGhpcyB8fAorCQkJCQl0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXN1cGVyIHx8CisJCQkJCXRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcikgJiYKKwkJCQkJc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IHNlbGVjdGlvblN0YXJ0ICYmCisJCQkJCXNlbGVjdGlvblN0YXJ0IDw9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7CisJCQkJCWxhc3RJZGVudGlmaWVyU3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCWxhc3RJZGVudGlmaWVyRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQlsYXN0SWRlbnRpZmllciA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQkJfQorCQkJfSB3aGlsZSAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpOworCQl9IGVsc2UgeworCQkJc2Nhbm5lci5yZXNldFRvKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOworCQorCQkJYm9vbGVhbiBleHBlY3RpbmdJZGVudGlmaWVyID0gdHJ1ZTsKKwkJCQorCQkJZG8geworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXRoaXMgOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc3VwZXIgOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllciA6CisJCQkJCQlpZiAoIWV4cGVjdGluZ0lkZW50aWZpZXIpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJbGFzdElkZW50aWZpZXIgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCQkJbGFzdElkZW50aWZpZXJTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCWxhc3RJZGVudGlmaWVyRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQkJaWYobGFzdElkZW50aWZpZXJFbmQgPiBzZWxlY3Rpb25FbmQpIHsKKwkJCQkJCQlsYXN0SWRlbnRpZmllckVuZCA9IHNlbGVjdGlvbkVuZDsKKwkJCQkJCQlsYXN0SWRlbnRpZmllciA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobGFzdElkZW50aWZpZXIsIDAsbGFzdElkZW50aWZpZXJFbmQgLSBsYXN0SWRlbnRpZmllclN0YXJ0ICsgMSk7CisJCQkJCQl9CisJCQkJCQllbnRpcmVTZWxlY3Rpb24uYXBwZW5kKGxhc3RJZGVudGlmaWVyKTsKKwkJCQkJCQkKKwkJCQkJCWlkZW50Q291bnQrKzsKKwkJCQkJCWV4cGVjdGluZ0lkZW50aWZpZXIgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UIDoKKwkJCQkJCWlmIChleHBlY3RpbmdJZGVudGlmaWVyKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCWVudGlyZVNlbGVjdGlvbi5hcHBlbmQoJy4nKTsKKwkJCQkJCWV4cGVjdGluZ0lkZW50aWZpZXIgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YgOgorCQkJCQkJaWYgKGV4cGVjdGluZ0lkZW50aWZpZXIpCisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gd2hpbGUgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKTsKKwkJfQorCQlpZiAobGFzdElkZW50aWZpZXJTdGFydCA+IDApIHsKKwkJCWFjdHVhbFNlbGVjdGlvblN0YXJ0ID0gbGFzdElkZW50aWZpZXJTdGFydDsKKwkJCWFjdHVhbFNlbGVjdGlvbkVuZCA9IGxhc3RJZGVudGlmaWVyRW5kOworCQkJc2VsZWN0ZWRJZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXI7CisJCQlpZiAoaWRlbnRDb3VudCA+IDEpCisJCQkJcXVhbGlmaWVkU2VsZWN0aW9uID0gZW50aXJlU2VsZWN0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgQXNzaXN0UGFyc2VyIGdldFBhcnNlcigpIHsKKwkJcmV0dXJuIHBhcnNlcjsKKwl9CisKKwkvKioKKwkgKiBBc2sgdGhlIGVuZ2luZSB0byBjb21wdXRlIHRoZSBzZWxlY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorCSAqIG9mIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgorCisJICogIEBwYXJhbSBzb3VyY2VVbml0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdAorCSAqICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgorCSAqCisJICogIEBwYXJhbSBzZWxlY3Rpb25Tb3VyY2VTdGFydCBpbnQKKwkgKiAgQHBhcmFtIHNlbGVjdGlvblNvdXJjZUVuZCBpbnQKKwkgKiAgICAgIGEgcmFuZ2UgaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgc2VsZWN0aW9uIGlzLgorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdCgKKwkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LAorCQlpbnQgc2VsZWN0aW9uU291cmNlU3RhcnQsCisJCWludCBzZWxlY3Rpb25Tb3VyY2VFbmQpIHsKKworCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRDb250ZW50cygpOworCQkKKwkJaWYoREVCVUcpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnQoIlNFTEVDVElPTiBJTiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludChzb3VyY2VVbml0LmdldEZpbGVOYW1lKCkpOworCQkJU3lzdGVtLm91dC5wcmludCgiIEZST00gIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnQoc2VsZWN0aW9uU291cmNlU3RhcnQpOworCQkJU3lzdGVtLm91dC5wcmludCgiIFRPICIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2VsZWN0aW9uU291cmNlRW5kKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiU0VMRUNUSU9OIC0gU291cmNlIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZSk7CisJCX0KKwkJaWYgKCFjaGVja1NlbGVjdGlvbihzb3VyY2UsIHNlbGVjdGlvblNvdXJjZVN0YXJ0LCBzZWxlY3Rpb25Tb3VyY2VFbmQpKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJYWNjZXB0ZWRBbnN3ZXIgPSBmYWxzZTsKKwkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9CisJCQkJcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCByZXN1bHQsIGFjdHVhbFNlbGVjdGlvblN0YXJ0LCBhY3R1YWxTZWxlY3Rpb25FbmQpOworCisJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CisJCQkJaWYoREVCVUcpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RJT04gLSBEaWV0IEFTVCA6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKHBhcnNlZFVuaXQudG9TdHJpbmcoKSk7CisJCQkJfQorCQkJCQorCQkJCS8vIHNjYW4gdGhlIHBhY2thZ2UgJiBpbXBvcnQgc3RhdGVtZW50cyBmaXJzdAorCQkJCWlmIChwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlIGluc3RhbmNlb2YgU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlKSB7CisJCQkJCWNoYXJbXVtdIHRva2VucyA9CisJCQkJCQkoKFNlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZSkgcGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSkudG9rZW5zOworCQkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlJbXBvcnRSZWZlcmVuY2VbXSBpbXBvcnRzID0gcGFyc2VkVW5pdC5pbXBvcnRzOworCQkJCWlmIChpbXBvcnRzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGltcG9ydHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSBpbXBvcnRzW2ldOworCQkJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSBpbnN0YW5jZW9mIFNlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlKSB7CisJCQkJCQkJY2hhcltdW10gdG9rZW5zID0gKChTZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZSkgaW1wb3J0UmVmZXJlbmNlKS50b2tlbnM7CisJCQkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRva2VucywgJy4nKSk7CisJCQkJCQkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpLCB0aGlzKTsKKwkJCQkJCQkvLyBhY2NlcHQgcXVhbGlmaWVkIHR5cGVzIG9ubHkgaWYgbm8gdW5xdWFsaWZpZWQgdHlwZSB3YXMgYWNjZXB0ZWQKKwkJCQkJCQlpZighYWNjZXB0ZWRBbnN3ZXIpIHsKKwkJCQkJCQkJYWNjZXB0UXVhbGlmaWVkVHlwZXMoKTsKKwkJCQkJCQkJaWYgKCFhY2NlcHRlZEFuc3dlcikgeworCQkJCQkJCQkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyhzZWxlY3RlZElkZW50aWZpZXIsIHRoaXMpOworCQkJCQkJCQkJLy8gdHJ5IHdpdGggc2ltcGxlIHR5cGUgbmFtZQorCQkJCQkJCQkJaWYoIWFjY2VwdGVkQW5zd2VyKSB7CisJCQkJCQkJCQkJYWNjZXB0UXVhbGlmaWVkVHlwZXMoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHBhcnNlZFVuaXQudHlwZXMgIT0gbnVsbCkgeworCQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsKKwkJCQkJaWYgKCh0aGlzLnVuaXRTY29wZSA9IHBhcnNlZFVuaXQuc2NvcGUpICAhPSBudWxsKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOworCQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJc2VsZWN0RGVjbGFyYXRpb24ocGFyc2VkVW5pdCk7CisJCQkJCQkJcGFyc2VNZXRob2QocGFyc2VkVW5pdCwgc2VsZWN0aW9uU291cmNlU3RhcnQpOworCQkJCQkJCWlmKERFQlVHKSB7CisJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU0VMRUNUSU9OIC0gQVNUIDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFyc2VkVW5pdC50b1N0cmluZygpKTsKKwkJCQkJCQl9CisJCQkJCQkJcGFyc2VkVW5pdC5yZXNvbHZlKCk7CisJCQkJCQl9IGNhdGNoIChTZWxlY3Rpb25Ob2RlRm91bmQgZSkgeworCQkJCQkJCWlmIChlLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RJT04gLSBTZWxlY3Rpb24gYmluZGluZzoiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuYmluZGluZy50b1N0cmluZygpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBpZiBudWxsIHRoZW4gd2UgZm91bmQgYSBwcm9ibGVtIGluIHRoZSBzZWxlY3Rpb24gbm9kZQorCQkJCQkJCQlzZWxlY3RGcm9tKGUuYmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gb25seSByZWFjaGVzIGhlcmUgaWYgbm8gc2VsZWN0aW9uIGNvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGUgcGFyc2VkIHRyZWUKKwkJCS8vIHRodXMgdXNlIHRoZSBzZWxlY3RlZCBzb3VyY2UgYW5kIHBlcmZvcm0gYSB0ZXh0dWFsIHR5cGUgc2VhcmNoCisJCQlpZiAoIWFjY2VwdGVkQW5zd2VyKSB7CisJCQkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyhzZWxlY3RlZElkZW50aWZpZXIsIHRoaXMpOworCQkJCQorCQkJCS8vIGFjY2VwdCBxdWFsaWZpZWQgdHlwZXMgb25seSBpZiBubyB1bnF1YWxpZmllZCB0eXBlIHdhcyBhY2NlcHRlZAorCQkJCWlmKCFhY2NlcHRlZEFuc3dlcikgeworCQkJCQlhY2NlcHRRdWFsaWZpZWRUeXBlcygpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vIHdvcmstYXJvdW5kIGludGVybmFsIGZhaWx1cmUgLSAxR0VNRjZECQkKKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7IC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBmb3Igbm93IHNpbmNlIGl0IHR5cGljYWxseSBtZWFucyB3ZSBjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0CisJCX0gZmluYWxseSB7CisJCQlyZXNldCgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNlbGVjdEZyb20oQmluZGluZyBiaW5kaW5nKSB7CisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCQkJaWYgKHF1YWxpZmllZFNlbGVjdGlvbiAhPSBudWxsCisJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKHF1YWxpZmllZFNlbGVjdGlvbiwgdHlwZUJpbmRpbmcucmVhZGFibGVOYW1lKCkpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAorCQkJCQl0eXBlQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQl0eXBlQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCWZhbHNlKTsKKwkJCX0gZWxzZSBpZih0eXBlQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKXsKKwkJCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBwcm9ibGVtQmluZGluZyA9IChQcm9ibGVtUmVmZXJlbmNlQmluZGluZyl0eXBlQmluZGluZzsKKwkJCQlpZihwcm9ibGVtQmluZGluZy5vcmlnaW5hbCA9PSBudWxsCisJCQkJCXx8ICEocHJvYmxlbUJpbmRpbmcub3JpZ2luYWwgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCVJlZmVyZW5jZUJpbmRpbmcgb3JpZ2luYWwgPSAoUmVmZXJlbmNlQmluZGluZykgcHJvYmxlbUJpbmRpbmcub3JpZ2luYWw7CisKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCisJCQkJCW9yaWdpbmFsLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCW9yaWdpbmFsLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCisJCQkJCXR5cGVCaW5kaW5nLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCXR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKKwkJCQkJZmFsc2UpOworCQkJfQorCQkJYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOworCQl9IGVsc2UKKwkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChNZXRob2RCaW5kaW5nKSBiaW5kaW5nOworCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnM7CisJCQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCX0KKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAorCQkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQltZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKQorCQkJCQkJPyBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKQorCQkJCQkJOiBtZXRob2RCaW5kaW5nLnNlbGVjdG9yLAorCQkJCQlwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCQkJCXBhcmFtZXRlclR5cGVOYW1lcywKKwkJCQkJbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpOworCQkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCX0gZWxzZQorCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CisJCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCQkJCQlpZiAoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwpIHsgLy8gYXJyYXlsZW5ndGgKKwkJCQkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKKwkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLAorCQkJCQkJCWZpZWxkQmluZGluZy5uYW1lKTsKKwkJCQkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nKSB7CisJCQkJCQlzZWxlY3RGcm9tKCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLnR5cGUpOworCQkJCQkJLy8gb3BlbiBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUKKwkJCQkJfSBlbHNlCisJCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgeworCQkJCQkJCXNlbGVjdEZyb20oKChBcnJheUJpbmRpbmcpIGJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlKTsKKwkJCQkJCQkvLyBvcGVuIG9uIHRoZSB0eXBlIG9mIHRoZSBhcnJheQorCQkJCQkJfSBlbHNlCisJCQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQkJCQkJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJCQkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UocGFja2FnZUJpbmRpbmcucmVhZGFibGVOYW1lKCkpOworCQkJCQkJCQlhY2NlcHRlZEFuc3dlciA9IHRydWU7CisJCQkJCQkJfSBlbHNlCisJCQkJCQkJCWlmKGJpbmRpbmcgaW5zdGFuY2VvZiBCYXNlVHlwZUJpbmRpbmcpIHsKKwkJCQkJCQkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKKwkJCQkJCQkJfQorCX0KKworCS8qKgorCSAqIEFza3MgdGhlIGVuZ2luZSB0byBjb21wdXRlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIHR5cGUKKwkgKiBmcm9tIHRoZSBzb3VyY2UgdHlwZS4KKwkgKgorCSAqICBAcGFyYW0gc291cmNlVHlwZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlCisJICogICAgICBhIHNvdXJjZSBmb3JtIG9mIHRoZSBjdXJyZW50IHR5cGUgaW4gd2hpY2ggY29kZSBhc3Npc3QgaXMgaW52b2tlZC4KKwkgKgorCSAqICBAcGFyYW0gdHlwZU5hbWUgY2hhcltdCisJICogICAgICBhIHR5cGUgbmFtZSB3aGljaCBpcyB0byBiZSByZXNvbHZlZCBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBpbGF0aW9uIHVuaXQuCisJICoJCU5PVEU6IHRoZSB0eXBlIG5hbWUgaXMgc3VwcG9zZWQgdG8gYmUgY29ycmVjdGx5IHJlZHVjZWQgKG5vIHdoaXRlc3BhY2VzLCBubyB1bmljb2RlcyBsZWZ0KQorCSAqIAorCSAqICBAcGFyYW0gc2VhcmNoSW5FbnZpcm9ubWVudAorCSAqIAlpZiA8Y29kZT50cnVlPC9jb2RlPiBhbmQgbm8gc2VsZWN0aW9uIGNvdWxkIGJlIGZvdW5kIGluIGNvbnRleHQgdGhlbiBzZWFyY2ggdHlwZSBpbiBlbnZpcm9ubWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3RUeXBlKElTb3VyY2VUeXBlIHNvdXJjZVR5cGUsIGNoYXJbXSB0eXBlTmFtZSwgYm9vbGVhbiBzZWFyY2hJbkVudmlyb25tZW50KSB7CisJCXRyeSB7CisJCQlhY2NlcHRlZEFuc3dlciA9IGZhbHNlOworCisJCQkvLyBmaW5kIHRoZSBvdXRlciBtb3N0IHR5cGUKKwkJCUlTb3VyY2VUeXBlIG91dGVyVHlwZSA9IHNvdXJjZVR5cGU7CisJCQlJU291cmNlVHlwZSBwYXJlbnQgPSBzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworCQkJCW91dGVyVHlwZSA9IHBhcmVudDsKKwkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0RW5jbG9zaW5nVHlwZSgpOworCQkJfQorCQkJLy8gY29tcHV0ZSBwYXJzZSB0cmVlIGZvciB0aGlzIG1vc3Qgb3V0ZXIgdHlwZQorCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KG91dGVyVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9CisJCQkJU291cmNlVHlwZUNvbnZlcnRlcgorCQkJCQkuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQkJCQluZXcgSVNvdXJjZVR5cGVbXSB7IG91dGVyVHlwZSB9LAorCQkJCQkJZmFsc2UsCisJCQkvLyBkb24ndCBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCisJCQl0cnVlLCAvLyBieSBkZWZhdWx0IGdldCBtZW1iZXIgdHlwZXMKKwkJCXRoaXMucGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLCByZXN1bHQpOworCisJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsICYmIHBhcnNlZFVuaXQudHlwZXMgIT0gbnVsbCkgeworCQkJCWlmKERFQlVHKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU0VMRUNUSU9OIC0gRGlldCBBU1QgOiIpOyAvLyROT04tTkxTLTEkCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZWRVbml0LnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCQkvLyBmaW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSB0eXBlCisJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gc291cmNlVHlwZS5nZXRQYWNrYWdlTmFtZSgpOworCQkJCWNoYXJbXSBzb3VyY2VUeXBlTmFtZSA9IHNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOworCQkJCS8vIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlIG5hbWUKKwkJCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgeworCQkJCQkvLyByZW1vdmUgdGhlIHBhY2thZ2UgbmFtZSBpZiBuZWNlc3NhcnkKKwkJCQkJc291cmNlVHlwZU5hbWUgPQorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKKwkJCQkJCQlzb3VyY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSwKKwkJCQkJCQlwYWNrYWdlTmFtZS5sZW5ndGggKyAxLAorCQkJCQkJCXNvdXJjZVR5cGVOYW1lLmxlbmd0aCk7CisJCQkJfTsKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPQorCQkJCQlwYXJzZWRVbml0LmRlY2xhcmF0aW9uT2ZUeXBlKENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHNvdXJjZVR5cGVOYW1lKSk7CisJCQkJaWYgKHR5cGVEZWNsICE9IG51bGwpIHsKKworCQkJCQkvLyBhZGQgZmFrZSBmaWVsZCB3aXRoIHRoZSB0eXBlIHdlJ3JlIGxvb2tpbmcgZm9yCisJCQkJCS8vIG5vdGU6IHNpbmNlIHdlIGRpZG4ndCBhc2sgZm9yIGZpZWxkcyBhYm92ZSwgdGhlcmUgaXMgbm8gZmllbGQgZGVmaW5lZCB5ZXQKKwkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7CisJCQkJCWludCBkb3Q7CisJCQkJCWlmICgoZG90ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHR5cGVOYW1lKSkgPT0gLTEpIHsKKwkJCQkJCXRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyID0gdHlwZU5hbWU7CisJCQkJCQlmaWVsZC50eXBlID0gbmV3IFNlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSh0eXBlTmFtZSwgLTEpOworCQkJCQkJLy8gcG9zaXRpb24gbm90IHVzZWQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXF1YWxpZmllZFNlbGVjdGlvbiA9IHR5cGVOYW1lOworCQkJCQkJY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCAwLCBkb3QgLSAxKTsKKwkJCQkJCWNoYXJbXSBzZWxlY3Rpb25JZGVudGlmaWVyID0KKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVOYW1lLCBkb3QgKyAxLCB0eXBlTmFtZS5sZW5ndGgpOworCQkJCQkJdGhpcy5zZWxlY3RlZElkZW50aWZpZXIgPSBzZWxlY3Rpb25JZGVudGlmaWVyOworCQkJCQkJZmllbGQudHlwZSA9CisJCQkJCQkJbmV3IFNlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKKwkJCQkJCQkJcHJldmlvdXNJZGVudGlmaWVycywKKwkJCQkJCQkJc2VsZWN0aW9uSWRlbnRpZmllciwKKwkJCQkJCQkJbmV3IGxvbmdbcHJldmlvdXNJZGVudGlmaWVycy5sZW5ndGggKyAxXSk7CisJCQkJCX0KKwkJCQkJZmllbGQubmFtZSA9ICI8ZmFrZUZpZWxkPiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0eXBlRGVjbC5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltdIHsgZmllbGQgfTsKKworCQkJCQkvLyBidWlsZCBiaW5kaW5ncworCQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsKKwkJCQkJaWYgKCh0aGlzLnVuaXRTY29wZSA9IHBhcnNlZFVuaXQuc2NvcGUpICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gYnVpbGQgZmllbGRzCisJCQkJCQkJLy8gbm90ZTogdGhpcyBidWlsZHMgZmllbGRzIG9ubHkgaW4gdGhlIHBhcnNlZCB1bml0ICh0aGUgYnVpbGRGaWVsZHNBbmRNZXRob2RzIGZsYWcgaXMgbm90IHBhc3NlZCBhbG9uZykKKwkJCQkJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIHRydWUpOworCisJCQkJCQkJLy8gcmVzb2x2ZQorCQkJCQkJCXBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJcGFyc2VkVW5pdC5yZXNvbHZlKCk7CisJCQkJCQl9IGNhdGNoIChTZWxlY3Rpb25Ob2RlRm91bmQgZSkgeworCQkJCQkJCWlmIChlLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCQlpZihERUJVRykgeworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTRUxFQ1RJT04gLSBTZWxlY3Rpb24gYmluZGluZyA6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmJpbmRpbmcudG9TdHJpbmcoKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgc2VsZWN0aW9uIG5vZGUKKwkJCQkJCQkJc2VsZWN0RnJvbShlLmJpbmRpbmcpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIG9ubHkgcmVhY2hlcyBoZXJlIGlmIG5vIHNlbGVjdGlvbiBjb3VsZCBiZSBkZXJpdmVkIGZyb20gdGhlIHBhcnNlZCB0cmVlCisJCQkvLyB0aHVzIHVzZSB0aGUgc2VsZWN0ZWQgc291cmNlIGFuZCBwZXJmb3JtIGEgdGV4dHVhbCB0eXBlIHNlYXJjaAorCQkJaWYgKCFhY2NlcHRlZEFuc3dlciAmJiBzZWFyY2hJbkVudmlyb25tZW50KSB7CisJCQkJaWYgKHRoaXMuc2VsZWN0ZWRJZGVudGlmaWVyICE9IG51bGwpIHsKKwkJCQkJbmFtZUVudmlyb25tZW50LmZpbmRUeXBlcyh0eXBlTmFtZSwgdGhpcyk7CisJCQkJCQorCQkJCQkvLyBhY2NlcHQgcXVhbGlmaWVkIHR5cGVzIG9ubHkgaWYgbm8gdW5xdWFsaWZpZWQgdHlwZSB3YXMgYWNjZXB0ZWQKKwkJCQkJaWYoIWFjY2VwdGVkQW5zd2VyKSB7CisJCQkJCQlhY2NlcHRRdWFsaWZpZWRUeXBlcygpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIGZvciBub3cgc2luY2UgaXQgdHlwaWNhbGx5IG1lYW5zIHdlIGNhbm5vdCBmaW5kIGphdmEubGFuZy5PYmplY3QKKwkJfSBmaW5hbGx5IHsKKwkJCXF1YWxpZmllZFNlbGVjdGlvbiA9IG51bGw7CisJCQlyZXNldCgpOworCQl9CisJfQorCisJLy8gQ2hlY2sgaWYgYSBkZWNsYXJhdGlvbiBnb3Qgc2VsZWN0ZWQgaW4gdGhpcyB1bml0CisJcHJpdmF0ZSB2b2lkIHNlbGVjdERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCl7CisKKwkJLy8gdGhlIHNlbGVjdGVkIGlkZW50aWZpZXIgaXMgbm90IGlkZW50aWNhbCB0byB0aGUgcGFyc2VyIG9uZSAoZXF1YWxzIGJ1dCBub3QgaWRlbnRpY2FsKSwKKwkJLy8gZm9yIHRyYXZlcnNpbmcgdGhlIHBhcnNlIHRyZWUsIHRoZSBwYXJzZXIgYXNzaXN0IGlkZW50aWZpZXIgaXMgbmVjZXNzYXJ5IGZvciBpZGVudGl0aXkgY2hlY2tzCisJCWNoYXJbXSBhc3Npc3RJZGVudGlmaWVyID0gdGhpcy5nZXRQYXJzZXIoKS5hc3Npc3RJZGVudGlmaWVyKCk7CisJCWlmIChhc3Npc3RJZGVudGlmaWVyID09IG51bGwpIHJldHVybjsKKwkJCisJCS8vIGl0ZXJhdGUgb3ZlciB0aGUgdHlwZXMKKwkJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXM7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcyA9PSBudWxsID8gMCA6IHR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCXNlbGVjdERlY2xhcmF0aW9uKHR5cGVzW2ldLCBhc3Npc3RJZGVudGlmaWVyKTsKKwkJfQorCX0KKworCS8vIENoZWNrIGlmIGEgZGVjbGFyYXRpb24gZ290IHNlbGVjdGVkIGluIHRoaXMgdHlwZQorCXByaXZhdGUgdm9pZCBzZWxlY3REZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBjaGFyW10gYXNzaXN0SWRlbnRpZmllcil7CisKKwkJaWYgKHR5cGVEZWNsYXJhdGlvbi5uYW1lID09IGFzc2lzdElkZW50aWZpZXIpeworCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCh0eXBlRGVjbGFyYXRpb24uYmluZGluZyk7CisJCX0KKwkJVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZXMgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXM7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCXNlbGVjdERlY2xhcmF0aW9uKG1lbWJlclR5cGVzW2ldLCBhc3Npc3RJZGVudGlmaWVyKTsKKwkJfQorCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gdHlwZURlY2xhcmF0aW9uLmZpZWxkczsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcyA9PSBudWxsID8gMCA6IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQlpZiAoZmllbGRzW2ldLm5hbWUgPT0gYXNzaXN0SWRlbnRpZmllcil7CisJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChmaWVsZHNbaV0uYmluZGluZyk7CisJCQl9CisJCX0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kczsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMgPT0gbnVsbCA/IDAgOiBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCWlmIChtZXRob2Quc2VsZWN0b3IgPT0gYXNzaXN0SWRlbnRpZmllcil7CisJCQkJaWYobWV0aG9kLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKG1ldGhvZC5iaW5kaW5nKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZihtZXRob2Quc2NvcGUgIT0gbnVsbCkgeworCQkJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChuZXcgTWV0aG9kQmluZGluZyhtZXRob2QubW9kaWZpZXJzLCBtZXRob2Quc2VsZWN0b3IsIG51bGwsIG51bGwsIG51bGwsIG1ldGhvZC5zY29wZS5yZWZlcmVuY2VUeXBlKCkuYmluZGluZykpOworCQkJCQl9CisJCQkJfQorCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZUZvdW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZUZvdW5kLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uTm9kZUZvdW5kIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJcHVibGljIEFzdE5vZGUgYXN0Tm9kZTsKKwlwdWJsaWMgQmluZGluZyBxdWFsaWZpZWRCaW5kaW5nOworCXB1YmxpYyBTY29wZSBzY29wZTsKK3B1YmxpYyBDb21wbGV0aW9uTm9kZUZvdW5kKCkgeworCXRoaXMobnVsbCwgbnVsbCwgbnVsbCk7IC8vIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCit9CitwdWJsaWMgQ29tcGxldGlvbk5vZGVGb3VuZChBc3ROb2RlIGFzdE5vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKKwl0aGlzLmFzdE5vZGUgPSBhc3ROb2RlOworCXRoaXMucXVhbGlmaWVkQmluZGluZyA9IHF1YWxpZmllZEJpbmRpbmc7CisJdGhpcy5zY29wZSA9IHNjb3BlOworfQorcHVibGljIENvbXBsZXRpb25Ob2RlRm91bmQoQXN0Tm9kZSBhc3ROb2RlLCBTY29wZSBzY29wZSkgeworCXRoaXMoYXN0Tm9kZSwgbnVsbCwgc2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Bcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQXJndW1lbnROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4MzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQXJndW1lbnROYW1lLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSBleHRlbmRzIEFyZ3VtZW50IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRkFLRU5BTUVTVUZGSVggPSAiICIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBjaGFyW10gcmVhbE5hbWU7CisJcHVibGljIENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZShjaGFyW10gbmFtZSAsIGxvbmcgcG9zTm9tICwgVHlwZVJlZmVyZW5jZSB0ciAsIGludCBtb2RpZmllcnMpeworCQlzdXBlcihDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLCBGQUtFTkFNRVNVRkZJWCksIHBvc05vbSwgdHIsIG1vZGlmaWVycyk7CisJCXRoaXMucmVhbE5hbWUgPSBuYW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJc3VwZXIucmVzb2x2ZShzY29wZSk7CisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHNjb3BlKTsKKwl9CisJCisJcHVibGljIHZvaWQgYmluZChNZXRob2RTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGJvb2xlYW4gdXNlZCkgeworCQlzdXBlci5iaW5kKHNjb3BlLCB0eXBlQmluZGluZywgdXNlZCk7CisJCQorCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlzICs9ICI8Q29tcGxldGVPbkFyZ3VtZW50TmFtZToiOyAvLyROT04tTkxTLTEkCisJCWlmICh0eXBlICE9IG51bGwpIHMgKz0gdHlwZS50b1N0cmluZygpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCXMgKz0gbmV3IFN0cmluZyhyZWFsTmFtZSk7CisJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSBzICs9ICIgPSAiICsgaW5pdGlhbGl6YXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCk7IC8vJE5PTi1OTFMtMSQKKwkJcyArPSAiPiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQkKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzODdhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYW4gYWNjZXNzIHRvIHRoZSBsaXRlcmFsICdjbGFzcycgY29udGFpbmluZyB0aGUgY3Vyc29yLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIFN0cmluZ1tdLltjdXJzb3JdCisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gY2xhc3MgWCB7CisgKiAgICAgICAgIHZvaWQgZm9vKCkgeworICogICAgICAgICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOlN0cmluZ1tdLj4KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqIFRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGNvbXBsZXRpb24gbm9kZSBkZW5vdGVzIHRoZSBzb3VyY2UgcmFuZ2UKKyAqIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgY29tcGxldGlvbi4KKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2VzcyBleHRlbmRzIENsYXNzTGl0ZXJhbEFjY2VzcyB7CisJcHVibGljIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllcjsKKwlwdWJsaWMgaW50IGNsYXNzU3RhcnQ7CisJCitwdWJsaWMgQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzKGxvbmcgcG9zLCBUeXBlUmVmZXJlbmNlIHQpIHsKKwlzdXBlcigoaW50KXBvcywgdCk7CisJdGhpcy5jbGFzc1N0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlpZiAoc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpID09IG51bGwpCisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CisJZWxzZQorCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB0YXJnZXRUeXBlLCBzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiPENvbXBsZXRlT25DbGFzc0xpdGVyYWxBY2Nlc3M6Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXN1bHQuYXBwZW5kKHR5cGUudG9TdHJpbmcoKSk7CisJcmVzdWx0LmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJcmVzdWx0LmFwcGVuZChjb21wbGV0aW9uSWRlbnRpZmllcik7CisJcmVzdWx0LmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzkxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgeworCXB1YmxpYyBDb21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcykgeworCQlzdXBlcihzb3VyY2UsIHBvcyk7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpIHsKKwkJcmV0dXJuICI8Q29tcGxldGVPbkNsYXNzOiIgKyBuZXcgU3RyaW5nKHRva2VuKSArICI+IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYjExNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYW4gZXhjZXB0aW9uIHR5cGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllci4KKyAqIGUuZy4KKyAqCisgKgljbGFzcyBYIHsKKyAqICAgIHZvaWQgZm9vKCkgeworICogICAgICB0cnkgeworICogICAgICAgIGJhcigpOworICogICAgICB9IGNhdGNoIChJT0V4Y1tjdXJzb3JdIGUpIHsKKyAqICAgICAgfQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICB0cnkgeworICogICAgICAgICAgICAgYmFyKCk7CisgKiAgICAgICAgICAgfSBjYXRjaCAoPENvbXBsZXRlT25FeGNlcHRpb246SU9FeGM+IGUpIHsKKyAqICAgICAgICAgICB9CisgKiAgICAgICAgIH0KKyAqICAgICAgIH0KKyAqCisgKiBUaGUgc291cmNlIHJhbmdlIG9mIHRoZSBjb21wbGV0aW9uIG5vZGUgZGVub3RlcyB0aGUgc291cmNlIHJhbmdlCisgKiB3aGljaCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbXBsZXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UgZXh0ZW5kcyBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlIHsKK3B1YmxpYyBDb21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKwlzdXBlcihzb3VyY2UsIHBvcyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CisJcmV0dXJuICI8Q29tcGxldGVPbkV4Y2VwdGlvbjoiICsgbmV3IFN0cmluZyh0b2tlbikgKyAiPiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjU4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYSBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsIGNvbnRhaW5pbmcgdGhlIGN1cnNvci4KKyAqIGUuZy4KKyAqCisgKgljbGFzcyBYIHsKKyAqICAgIFgoKSB7CisgKiAgICAgIHRoaXMoMSwgMiwgW2N1cnNvcl0KKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgWCgpIHsKKyAqICAgICAgICAgICA8Q29tcGxldGVPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMoMSwgMik+CisgKiAgICAgICAgIH0KKyAqICAgICAgIH0KKyAqCisgKiBUaGUgc291cmNlIHJhbmdlIGlzIGFsd2F5cyBvZiBsZW5ndGggMC4KKyAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNvbnN0cnVjdG9yIGNhbGwgYXJlIGFsbCB0aGUgYXJndW1lbnRzIGRlZmluZWQKKyAqIGJlZm9yZSB0aGUgY3Vyc29yLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXh0ZW5kcyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCB7CitwdWJsaWMgQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoaW50IGFjY2Vzc01vZGUpIHsKKwlzdXBlcihhY2Nlc3NNb2RlKTsKK30KK3B1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCisJaWYgKGFjY2Vzc01vZGUgIT0gVGhpcyAmJiByZWNlaXZlclR5cGUgIT0gbnVsbCkgeworCQlpZiAocmVjZWl2ZXJUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCisJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCgpOworCQlyZWNlaXZlclR5cGUgPSByZWNlaXZlclR5cGUuc3VwZXJjbGFzcygpOworCX0KKwlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwpCisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CisJZWxzZQorCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCByZWNlaXZlclR5cGUsIHNjb3BlKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJcyArPSAiPENvbXBsZXRlT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDoiOyAvLyROT04tTkxTLTEkCisJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJcyA9IHMgKyBxdWFsaWZpY2F0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIi4iOyAvLyROT04tTkxTLTEkCisJaWYgKGFjY2Vzc01vZGUgPT0gVGhpcykgeworCQlzID0gcyArICJ0aGlzKCI7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlzID0gcyArICJzdXBlcigiOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJcyArPSBhcmd1bWVudHNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCk7CisJCQlpZiAoaSAhPSBhcmd1bWVudHMubGVuZ3RoIC0gMSkgeworCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKwlzICs9ICIpPiI7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkTmFtZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25GaWVsZE5hbWUgZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRkFLRU5BTUVTVUZGSVggPSAiICIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBjaGFyW10gcmVhbE5hbWU7CisJcHVibGljIENvbXBsZXRpb25PbkZpZWxkTmFtZShFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uLCBjaGFyW10gbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJCXN1cGVyKGluaXRpYWxpemF0aW9uLCBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLCBGQUtFTkFNRVNVRkZJWCksIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOyAvLyROT04tTkxTLTEkCisJCXRoaXMucmVhbE5hbWUgPSBuYW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZXNvbHZlKE1ldGhvZFNjb3BlIGluaXRpYWxpemF0aW9uU2NvcGUpIHsKKwkJc3VwZXIucmVzb2x2ZShpbml0aWFsaXphdGlvblNjb3BlKTsKKwkJCisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIGluaXRpYWxpemF0aW9uU2NvcGUpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKKwkJcyArPSAiPENvbXBsZXRlT25GaWVsZE5hbWU6IjsgLy8kTk9OLU5MUy0xJAorCQlpZiAodHlwZSAhPSBudWxsKSBzICs9IHR5cGUudG9TdHJpbmcoKSArICIgIjsgLy8kTk9OLU5MUy0xJAorCQlzICs9IG5ldyBTdHJpbmcocmVhbE5hbWUpOworCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgcyArPSAiID0gIiArIGluaXRpYWxpemF0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOyAvLyROT04tTkxTLTEkCisJCXMgKz0gIj4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0JCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OWNjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCisvKgorICogQ29tcGxldGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGFuIHR5cGUgcmVmZXJlbmNlIGxvY2F0ZWQgYXMgYSBwb3RlbnRpYWwgcmV0dXJuIHR5cGUgZm9yIGEgY2xhc3MKKyAqIG1lbWJlciwgY29udGFpbmluZyB0aGUgY3Vyc29yIGxvY2F0aW9uLgorICogVGhpcyBub2RlIGlzIG9ubHkgYSBmYWtlLWZpZWxkIHdyYXBwZXIgb2YgdGhlIGFjdHVhbCBjb21wbGV0aW9uIG5vZGUKKyAqIHdoaWNoIGlzIGFjY2Vzc2libGUgYXMgdGhlIGZha2UtZmllbGQgdHlwZS4KKyAqIGUuZy4KKyAqCisgKgljbGFzcyBYIHsKKyAqICAgIE9ialtjdXJzb3JdCisgKiAgfQorICoKKyAqCS0tLT4gY2xhc3MgWCB7CisgKiAgICAgICAgIDxDb21wbGV0ZU9uVHlwZTpPYmo+OworICogICAgICAgfQorICoKKyAqIFRoZSBzb3VyY2UgcmFuZ2UgaXMgYWx3YXlzIG9mIGxlbmd0aCAwLgorICogVGhlIGFyZ3VtZW50cyBvZiB0aGUgYWxsb2NhdGlvbiBleHByZXNzaW9uIGFyZSBhbGwgdGhlIGFyZ3VtZW50cyBkZWZpbmVkCisgKiBiZWZvcmUgdGhlIGN1cnNvci4KKyAqLworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25GaWVsZFR5cGUgZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsVmFyaWFibGU7CisJCitwdWJsaWMgQ29tcGxldGlvbk9uRmllbGRUeXBlKFR5cGVSZWZlcmVuY2UgdHlwZSwgYm9vbGVhbiBpc0xvY2FsVmFyaWFibGUpeworCXN1cGVyKCk7CisJdGhpcy5zb3VyY2VTdGFydCA9IHR5cGUuc291cmNlU3RhcnQ7CisJdGhpcy5zb3VyY2VFbmQgPSB0eXBlLnNvdXJjZUVuZDsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMubmFtZSA9IE5vQ2hhcjsKKwl0aGlzLmlzTG9jYWxWYXJpYWJsZSA9IGlzTG9jYWxWYXJpYWJsZTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgeworCWlmKHR5cGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKQorCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CisJZWxzZSAvLyBoYW5kbGUgdGhlIHF1YWxpZmllZCB0eXBlIHJlZiBkaXJlY3RseQorCQlyZXR1cm4gdHlwZS5nZXRUeXBlQmluZGluZyhzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCXJldHVybiB0eXBlLnRvU3RyaW5nKHRhYik7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY0MjIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIENvbXBsZXRpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhbiBpbXBvcnQgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGN1cnNvciBsb2NhdGlvbi4KKyAqIGUuZy4KKyAqCisgKiAgaW1wb3J0IGphdmEuaW9bY3Vyc29yXTsKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gPENvbXBsZXRlT25JbXBvcnQ6amF2YS5pbz4KKyAqCQkgY2xhc3MgWCB7CisgKiAgICAgICAgIHZvaWQgZm9vKCkgeworICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBpcyBhbHdheXMgb2YgbGVuZ3RoIDAuCisgKiBUaGUgYXJndW1lbnRzIG9mIHRoZSBhbGxvY2F0aW9uIGV4cHJlc3Npb24gYXJlIGFsbCB0aGUgYXJndW1lbnRzIGRlZmluZWQKKyAqIGJlZm9yZSB0aGUgY3Vyc29yLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UgZXh0ZW5kcyBJbXBvcnRSZWZlcmVuY2UgeworCitwdWJsaWMgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucyAsIGxvbmdbXSBwb3NpdGlvbnMpIHsKKwlzdXBlcih0b2tlbnMsIHBvc2l0aW9ucywgZmFsc2UpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci4JYXBwZW5kKCI8Q29tcGxldGVPbkltcG9ydDoiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbnRlcmZhY2VSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdkNDNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbnRlcmZhY2VSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgeworCXB1YmxpYyBDb21wbGV0aW9uT25JbnRlcmZhY2VSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKwkJc3VwZXIoc291cmNlLCBwb3MpOworCX0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CisJCXJldHVybiAiPENvbXBsZXRlT25JbnRlcmZhY2U6IiArIG5ldyBTdHJpbmcodG9rZW4pICsgIj4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkxvY2FsTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Mb2NhbE5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Mb2NhbE5hbWUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkxvY2FsTmFtZSBleHRlbmRzIExvY2FsRGVjbGFyYXRpb24geworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGQUtFTkFNRVNVRkZJWCA9ICIgIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGNoYXJbXSByZWFsTmFtZTsKKwlwdWJsaWMgQ29tcGxldGlvbk9uTG9jYWxOYW1lKEV4cHJlc3Npb24gZXhwcixjaGFyW10gbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKXsKKwkJc3VwZXIoZXhwciwgQ2hhck9wZXJhdGlvbi5jb25jYXQobmFtZSwgRkFLRU5BTUVTVUZGSVgpLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKwkJdGhpcy5yZWFsTmFtZSA9IG5hbWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCQlzdXBlci5yZXNvbHZlKHNjb3BlKTsKKwkJCisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHNjb3BlKTsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgKz0gIjxDb21wbGV0ZU9uTG9jYWxOYW1lOiI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcyArPSB0eXBlLnRvU3RyaW5nKCkgKyAiICI7IC8vJE5PTi1OTFMtMSQKKwkJcyArPSBuZXcgU3RyaW5nKHJlYWxOYW1lKTsKKwkJaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHMgKz0gIiA9ICIgKyBpbml0aWFsaXphdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKTsgLy8kTk9OLU5MUy0xJAorCQlzICs9ICI+IjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lbWJlckFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWIxNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIENvbXBsZXRpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhbiBhY2Nlc3MgdG8gYSBtZW1iZXIgKGZpZWxkIHJlZmVyZW5jZSBvciBtZXNzYWdlIHNlbmQpIAorICogY29udGFpbmluZyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIGJhcigpLmZyZWRbY3Vyc29yXQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpiYXIoKS5mcmVkPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgY29tcGxldGlvbiBub2RlIGRlbm90ZXMgdGhlIHNvdXJjZSByYW5nZQorICogd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzIGV4dGVuZHMgRmllbGRSZWZlcmVuY2UgeworCQorCXB1YmxpYyBDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKwkJc3VwZXIoc291cmNlLCBwb3MpOworCX0KKwkKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCB8fCByZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQorCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsKKwkJZWxzZQorCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgcmVjZWl2ZXJUeXBlLCBzY29wZSk7CisJCS8vIGFycmF5IHR5cGVzIGFyZSBwYXNzZWQgYWxvbmcgdG8gZmluZCB0aGUgbGVuZ3RoIGZpZWxkCisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCisJCXJldHVybiAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6IiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIj4iOyAvLyROT04tTkxTLTEkCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ0ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXNzYWdlU2VuZC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCisvKgorICogQ29tcGxldGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGEgbWVzc2FnZSBzZW5kIGNvbnRhaW5pbmcgdGhlIGN1cnNvci4KKyAqIGUuZy4KKyAqCisgKgljbGFzcyBYIHsKKyAqICAgIHZvaWQgZm9vKCkgeworICogICAgICB0aGlzLmJhcigxLCAyLCBbY3Vyc29yXQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuYmFyKDEsIDIpPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBpcyBhbHdheXMgb2YgbGVuZ3RoIDAuCisgKiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXNzYWdlIHNlbmQgYXJlIGFsbCB0aGUgYXJndW1lbnRzIGRlZmluZWQKKyAqIGJlZm9yZSB0aGUgY3Vyc29yLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQgZXh0ZW5kcyBNZXNzYWdlU2VuZCB7CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQlpZiAocmVjZWl2ZXIgPT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpCisJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBudWxsLCBzY29wZSk7CisKKwkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwgfHwgcmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSkKKwkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CisKKwkJaWYgKHJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpKQorCQkJcmVjZWl2ZXJUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgcmVjZWl2ZXJUeXBlLCBzY29wZSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwkJU3RyaW5nIHMgPSAiPENvbXBsZXRlT25NZXNzYWdlU2VuZDoiOyAvLyROT04tTkxTLTEkCisJCWlmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCkKKwkJCXMgPSBzICsgcmVjZWl2ZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQKKwkJcyA9IHMgKyBuZXcgU3RyaW5nKHNlbGVjdG9yKSArICIoIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJcyArPSBhcmd1bWVudHNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCk7CisJCQkJaWYgKGkgIT0gYXJndW1lbnRzLmxlbmd0aCAtIDEpIHsKKwkJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfTsKKwkJfQorCQlzID0gcyArICIpPiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXRob2ROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmY2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kTmFtZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uIHsKKwlwdWJsaWMgaW50IHNlbGVjdG9yRW5kOworCisJcHVibGljIENvbXBsZXRpb25Pbk1ldGhvZE5hbWUoQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlc29sdmUoQ2xhc3NTY29wZSB1cHBlclNjb3BlKSB7CisJCQorCQlzdXBlci5yZXNvbHZlKHVwcGVyU2NvcGUpOworCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB1cHBlclNjb3BlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlzICs9ICI8Q29tcGxldGlvbk9uTWV0aG9kTmFtZToiOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KSB7CisJCQlzICs9IG1vZGlmaWVyc1N0cmluZyhtb2RpZmllcnMpOworCQl9CisKKwkJcyArPSByZXR1cm5UeXBlVG9TdHJpbmcoMCk7CisJCXMgKz0gbmV3IFN0cmluZyhzZWxlY3RvcikgKyAiKCI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nKDApOworCQkJCWlmIChpICE9IChhcmd1bWVudHMubGVuZ3RoIC0gMSkpCisJCQkJCXMgPSBzICsgIiwgIjsgLy8kTk9OLU5MUy0xJAorCQkJfTsKKwkJfTsKKwkJcyArPSAiKSI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQkJcyArPSAiIHRocm93cyAiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlzICs9IHRocm93bkV4Y2VwdGlvbnNbaV0udG9TdHJpbmcoMCk7CisJCQkJaWYgKGkgIT0gKHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoIC0gMSkpCisJCQkJCXMgPSBzICsgIiwgIjsgLy8kTk9OLU5MUy0xJAorCQkJfTsKKwkJfTsKKworCQlzICs9ICI+IjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXRob2RSZXR1cm5UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDA5ZTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXRob2RSZXR1cm5UeXBlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uIHsKKwlwdWJsaWMgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZShUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KXsKKwkJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworCQl0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOworCQl0aGlzLnNvdXJjZVN0YXJ0ID0gcmV0dXJuVHlwZS5zb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSByZXR1cm5UeXBlLnNvdXJjZUVuZDsKKwl9CisJCisJcHVibGljIHZvaWQgcmVzb2x2ZVN0YXRlbWVudHMoQ2xhc3NTY29wZSB1cHBlclNjb3BlKSB7CisJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB1cHBlclNjb3BlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisJCXJldHVybiByZXR1cm5UeXBlLnRvU3RyaW5nKHRhYik7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZhMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYW4gcGFja2FnZSBzdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgY3Vyc29yIGxvY2F0aW9uLgorICogZS5nLgorICoKKyAqICBwYWNrYWdlIGphdmEuaW9bY3Vyc29yXTsKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gPENvbXBsZXRlT25QYWNrYWdlOmphdmEuaW8+CisgKgkJIGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqIFRoZSBzb3VyY2UgcmFuZ2UgaXMgYWx3YXlzIG9mIGxlbmd0aCAwLgorICogVGhlIGFyZ3VtZW50cyBvZiB0aGUgYWxsb2NhdGlvbiBleHByZXNzaW9uIGFyZSBhbGwgdGhlIGFyZ3VtZW50cyBkZWZpbmVkCisgKiBiZWZvcmUgdGhlIGN1cnNvci4KKyAqLworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UgZXh0ZW5kcyBJbXBvcnRSZWZlcmVuY2UgeworcHVibGljIENvbXBsZXRpb25PblBhY2thZ2VSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zICwgbG9uZ1tdIHBvc2l0aW9ucykgeworCXN1cGVyKHRva2VucywgcG9zaXRpb25zLCB0cnVlKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYiwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLglhcHBlbmQoIjxDb21wbGV0ZU9uUGFja2FnZToiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlYjc1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIENvbXBsZXRpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24gY29udGFpbmluZyB0aGUgY3Vyc29yLgorICogSWYgdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbiBpcyBub3QgcXVhbGlmaWVkLCB0aGUgZW5jbG9zaW5nSW5zdGFuY2UgZmllbGQKKyAqIGlzIG51bGwuCisgKiBlLmcuCisgKgorICoJY2xhc3MgWCB7CisgKiAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgbmV3IEJhcigxLCAyLCBbY3Vyc29yXQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICA8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBCYXIoMSwgMik+CisgKiAgICAgICAgIH0KKyAqICAgICAgIH0KKyAqCisgKiBUaGUgc291cmNlIHJhbmdlIGlzIGFsd2F5cyBvZiBsZW5ndGggMC4KKyAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbiBhcmUgYWxsIHRoZSBhcmd1bWVudHMgZGVmaW5lZAorICogYmVmb3JlIHRoZSBjdXJzb3IuCisgKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHsKK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOworCWlmIChlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7CisJCVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSk7CisJCWlmICghKGVuY2xvc2luZ1R5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFByaW1pdGl2ZU9yQXJyYXlUeXBlRm9yRW5jbG9zaW5nSW5zdGFuY2UoZW5jbG9zaW5nVHlwZSwgZW5jbG9zaW5nSW5zdGFuY2UpOworCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsKKwkJfQorCQl0eXBlQmluZGluZyA9ICgoU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZSkucmVzb2x2ZVR5cGVFbmNsb3Npbmcoc2NvcGUsIChSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdUeXBlKTsKKwkJaWYgKCEodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKKwkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7IC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgaXRzIGFuIGFycmF5IG9yIGJhc2UgdHlwZQorCQlpZiAodHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgLy8gaGFuZGxlIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVmaW5pdGlvbiBjYXNlCisJCQl0eXBlQmluZGluZyA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJfSBlbHNlIHsKKwkJdHlwZUJpbmRpbmcgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKCEodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKKwkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7IC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgaXRzIGFuIGFycmF5IG9yIGJhc2UgdHlwZQorCX0KKworCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHR5cGVCaW5kaW5nLCBzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CisJcmV0dXJuIAorCQkoKHRoaXMuZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkgPyAKKwkJCSI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOiIgOiAgLy8kTk9OLU5MUy0xJAorCQkJIjxDb21wbGV0ZU9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246IikgKyAgLy8kTk9OLU5MUy0xJAorCQlzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSArICI+IjsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRDbGFzc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRDbGFzc1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzIzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZENsYXNzUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25RdWFsaWZpZWRDbGFzc1JlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UgeworcHVibGljIENvbXBsZXRpb25PblF1YWxpZmllZENsYXNzUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllciwgbG9uZ1tdIHBvc2l0aW9ucykgeworCXN1cGVyKHByZXZpb3VzSWRlbnRpZmllcnMsIGNvbXBsZXRpb25JZGVudGlmaWVyLCBwb3NpdGlvbnMpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuIGFwcGVuZCgiPENvbXBsZXRlT25DbGFzczoiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJfQorCWJ1ZmZlci5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4MmIyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYW4gZXhjZXB0aW9uIHR5cGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciAKKyAqIGFzIHBhcnQgb2YgYSBxdWFsaWZpZWQgbmFtZS4KKyAqIGUuZy4KKyAqCisgKgljbGFzcyBYIHsKKyAqICAgIHZvaWQgZm9vKCkgeworICogICAgICB0cnkgeworICogICAgICAgIGJhcigpOworICogICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjW2N1cnNvcl0gZSkgeworICogICAgICB9CisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gY2xhc3MgWCB7CisgKiAgICAgICAgIHZvaWQgZm9vKCkgeworICogICAgICAgICAgIHRyeSB7CisgKiAgICAgICAgICAgICBiYXIoKTsKKyAqICAgICAgICAgICB9IGNhdGNoICg8Q29tcGxldGVPbkV4Y2VwdGlvbjpqYXZhLmlvLklPRXhjPiBlKSB7CisgKiAgICAgICAgICAgfQorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgY29tcGxldGlvbiBub2RlIGRlbm90ZXMgdGhlIHNvdXJjZSByYW5nZQorICogd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uLgorICovCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlIGV4dGVuZHMgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB7CitwdWJsaWMgQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllciwgbG9uZ1tdIHBvc2l0aW9ucykgeworCXN1cGVyKHByZXZpb3VzSWRlbnRpZmllcnMsIGNvbXBsZXRpb25JZGVudGlmaWVyLCBwb3NpdGlvbnMpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuIGFwcGVuZCgiPENvbXBsZXRlT25FeGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7CisJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlidWZmZXIuYXBwZW5kKGNvbXBsZXRpb25JZGVudGlmaWVyKS5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkSW50ZXJmYWNlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODZkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUXVhbGlmaWVkSW50ZXJmYWNlUmVmZXJlbmNlICBleHRlbmRzIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UgeworcHVibGljIENvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXIsIGxvbmdbXSBwb3NpdGlvbnMpIHsKKwlzdXBlcihwcmV2aW91c0lkZW50aWZpZXJzLCBjb21wbGV0aW9uSWRlbnRpZmllciwgcG9zaXRpb25zKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpIHsKKworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmZmVyLiBhcHBlbmQoIjxDb21wbGV0ZU9uSW50ZXJmYWNlOiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKwkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOworCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJYnVmZmVyLmFwcGVuZChjb21wbGV0aW9uSWRlbnRpZmllcikuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTM0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIENvbXBsZXRpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSBjb250YWluaW5nIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIuCisgKiBlLmcuCisgKgorICoJY2xhc3MgWCB7CisgKiAgICBZIHk7CisgKiAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgeS5mcmVkLmJhW2N1cnNvcl0KKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgWSB5OworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICA8Q29tcGxldGVPbk5hbWU6eS5mcmVkLmJhPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgY29tcGxldGlvbiBub2RlIGRlbm90ZXMgdGhlIHNvdXJjZSByYW5nZQorICogd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBleHRlbmRzIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgeworCXB1YmxpYyBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXI7CisJcHVibGljIGxvbmdbXSBzb3VyY2VQb3NpdGlvbnM7IC8vIHBvc2l0aW9ucyBvZiBlYWNoIHRva2VuLCB0aGUgbGFzdCBvbmUgYmVpbmcgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyCitwdWJsaWMgQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXIsIGxvbmdbXSBwb3NpdGlvbnMpIHsKKwlzdXBlcihwcmV2aW91c0lkZW50aWZpZXJzLCAoaW50KSAocG9zaXRpb25zWzBdID4+PiAzMiksIChpbnQpIHBvc2l0aW9uc1twb3NpdGlvbnMubGVuZ3RoIC0gMV0pOworCXRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPSBjb21wbGV0aW9uSWRlbnRpZmllcjsKKwl0aGlzLnNvdXJjZVBvc2l0aW9ucyA9IHBvc2l0aW9uczsKK30KK3B1YmxpYyBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBjb21wbGV0aW9uSWRlbnRpZmllciwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJc3VwZXIocHJldmlvdXNJZGVudGlmaWVycywgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJdGhpcy5jb21wbGV0aW9uSWRlbnRpZmllciA9IGNvbXBsZXRpb25JZGVudGlmaWVyOworCXRoaXMuc291cmNlUG9zaXRpb25zID0gbmV3IGxvbmdbXSB7KChsb25nKXNvdXJjZVN0YXJ0IDw8IDMyKSArIHNvdXJjZUVuZH07Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGl0IGNhbiBiZSBhIHBhY2thZ2UsIHR5cGUsIG1lbWJlciB0eXBlLCBsb2NhbCB2YXJpYWJsZSBvciBmaWVsZAorCWJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRva2VucywgdGhpcyk7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgYmluZGluZyk7CisJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZXNvbHZhYmxlUmVmZXJlbmNlKHRoaXMsIGJpbmRpbmcpOworCQl9CisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7CisJfQorCisJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgYmluZGluZywgc2NvcGUpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPENvbXBsZXRlT25OYW1lOiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKwkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOworCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJYnVmZmVyLmFwcGVuZChjb21wbGV0aW9uSWRlbnRpZmllcikuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNGI0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIENvbXBsZXRpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhIHR5cGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhcyBwYXJ0CisgKiBvZiBhIHF1YWxpZmllZCBuYW1lLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggZXh0ZW5kcyBqYXZhLmxhbmcuT2JqW2N1cnNvcl0KKyAqCisgKgktLS0+IGNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPblR5cGU6amF2YS5sYW5nLk9iaj4KKyAqCisgKiBUaGUgc291cmNlIHJhbmdlIG9mIHRoZSBjb21wbGV0aW9uIG5vZGUgZGVub3RlcyB0aGUgc291cmNlIHJhbmdlCisgKiB3aGljaCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbXBsZXRpb24uCisgKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBleHRlbmRzIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgeworCXB1YmxpYyBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXI7CitwdWJsaWMgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXIsIGxvbmdbXSBwb3NpdGlvbnMpIHsKKwlzdXBlcihwcmV2aW91c0lkZW50aWZpZXJzLCBwb3NpdGlvbnMpOworCXRoaXMuY29tcGxldGlvbklkZW50aWZpZXIgPSBjb21wbGV0aW9uSWRlbnRpZmllcjsKK30KK3B1YmxpYyB2b2lkIGFib3V0VG9SZXNvbHZlKFNjb3BlIHNjb3BlKSB7CisJZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworfQorLyoKKyAqIE5vIGV4cGFuc2lvbiBvZiB0aGUgY29tcGxldGlvbiByZWZlcmVuY2UgaW50byBhbiBhcnJheSBvbmUKKyAqLworcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CisJcmV0dXJuIHRoaXM7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKKwkvLyBpdCBjYW4gYmUgYSBwYWNrYWdlLCB0eXBlIG9yIG1lbWJlciB0eXBlCisJQmluZGluZyBiaW5kaW5nID0gc2NvcGUucGFyZW50LmdldFR5cGVPclBhY2thZ2UodG9rZW5zKTsgLy8gc3RlcCB1cCBmcm9tIHRoZSBDbGFzc1Njb3BlCisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsKKwl9CisKKwl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBiaW5kaW5nLCBzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CisKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJ1ZmZlci5hcHBlbmQoIjxDb21wbGV0ZU9uVHlwZToiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJfQorCWJ1ZmZlci5hcHBlbmQoY29tcGxldGlvbklkZW50aWZpZXIpLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZhYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYSBzaW5nbGUgbmFtZSByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIGJhW2N1cnNvcl0KKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgPENvbXBsZXRlT25OYW1lOmJhPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgY29tcGxldGlvbiBub2RlIGRlbm90ZXMgdGhlIHNvdXJjZSByYW5nZQorICogd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworIAorcHVibGljIGNsYXNzIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVOYW1lUmVmZXJlbmNlIHsKK3B1YmxpYyBDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7CisJc3VwZXIoc291cmNlLCBwb3MpOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKwlyZXR1cm4gIjxDb21wbGV0ZU9uTmFtZToiICsgc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiPiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVlMGQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKKy8qCisgKiBDb21wbGV0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYSB0eXBlIHJlZmVyZW5jZSBjb250YWluaW5nIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgYXMgYSBzaW5nbGUKKyAqIG5hbWUgcmVmZXJlbmNlLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggZXh0ZW5kcyBPYmpbY3Vyc29yXQorICoKKyAqCS0tLT4gY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uVHlwZTpPYmo+CisgKgorICogVGhlIHNvdXJjZSByYW5nZSBvZiB0aGUgY29tcGxldGlvbiBub2RlIGRlbm90ZXMgdGhlIHNvdXJjZSByYW5nZQorICogd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSBjb21wbGV0aW9uLgorICovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVUeXBlUmVmZXJlbmNlIHsKK3B1YmxpYyBib29sZWFuIGlzQ29tcGxldGlvbk5vZGU7CitwdWJsaWMgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcykgeworCXN1cGVyKHNvdXJjZSwgcG9zKTsKKwlpc0NvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGFib3V0VG9SZXNvbHZlKFNjb3BlIHNjb3BlKSB7CisJZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworfQorLyoKKyAqIE5vIGV4cGFuc2lvbiBvZiB0aGUgY29tcGxldGlvbiByZWZlcmVuY2UgaW50byBhbiBhcnJheSBvbmUKKyAqLworcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CisJcmV0dXJuIHRoaXM7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKKwlpZihpc0NvbXBsZXRpb25Ob2RlKSB7CisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHNjb3BlKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3VwZXIuZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworCX0KK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZUVuY2xvc2luZyhCbG9ja1Njb3BlIHNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwlpZihpc0NvbXBsZXRpb25Ob2RlKSB7CisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIGVuY2xvc2luZ1R5cGUsIHNjb3BlKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVR5cGVFbmNsb3Npbmcoc2NvcGUsIGVuY2xvc2luZ1R5cGUpOworCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpeworCisJcmV0dXJuICI8Q29tcGxldGVPblR5cGU6IiArIG5ldyBTdHJpbmcodG9rZW4pICsgIj4iIDsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmEyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25QYXJzZXIuamF2YQpAQCAtMCwwICsxLDEzODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCisvKgorICogUGFyc2VyIGFibGUgdG8gYnVpbGQgc3BlY2lmaWMgY29tcGxldGlvbiBwYXJzZSBub2RlcywgZ2l2ZW4gYSBjdXJzb3JMb2NhdGlvbi4KKyAqCisgKiBDdXJzb3IgbG9jYXRpb24gZGVub3RlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGJlaGluZCB3aGljaCBjb21wbGV0aW9uCisgKiBnb3QgcmVxdWVzdGVkOgorICogIC0xIG1lYW5zIGNvbXBsZXRpb24gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UKKyAqCTAgIG1lYW5zIGNvbXBsZXRpb24gYmVoaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqICBuICBtZWFucyBjb21wbGV0aW9uIGJlaGluZCB0aGUgbi10aCBjaGFyYWN0ZXIKKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLio7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uUGFyc2VyIGV4dGVuZHMgQXNzaXN0UGFyc2VyIHsKKworCS8qIHB1YmxpYyBmaWVsZHMgKi8KKworCXB1YmxpYyBpbnQgY3Vyc29yTG9jYXRpb247CisJcHVibGljIGNoYXJbXVtdIGxhYmVsczsgLy8gdGhlIHZpc2libGUgbGFiZWxzIHVwIHRvIHRoZSBjdXJzb3IgbG9jYXRpb24KKwlwdWJsaWMgQXN0Tm9kZSBhc3Npc3ROb2RlUGFyZW50OyAvLyB0aGUgcGFyZW50IG5vZGUgb2YgYXNzaXN0IG5vZGUKKwkvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgaW50ZXJuYWwgZmxhZ3MgKi8KKwkKKwlib29sZWFuIGJldHdlZW5OZXdBbmRMZWZ0QnJha2V0OyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuIHRoZSBrZXl3b3JkICduZXcnIGFuZCB0aGUgZm9sbG93aW5nIGxlZnQgYnJha2V0LCBpZS4gJ1snLCAnKCcgb3IgJ3snCisJYm9vbGVhbiBiZXR3ZWVuQ2F0Y2hBbmRSaWdodFBhcmVuOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuIHRoZSBrZXl3b3JkICdjYXRjaCcgYW5kIHRoZSBmb2xsb3dpbmcgJyknCisJYm9vbGVhbiBjb21wbGV0aW9uQmVoaW5kRG90OyAvLyB0cnVlIHdoZW4gY29tcGxldGlvbiBpZGVudGlmaWVyIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBkb3QKKwkKKwlib29sZWFuIG5leHRUeXBlUmVmZXJlbmNlSXNDbGFzczsKKwlib29sZWFuIG5leHRUeXBlUmVmZXJlbmNlSXNFeGNlcHRpb247CisJYm9vbGVhbiBuZXh0VHlwZVJlZmVyZW5jZUlzSW50ZXJmYWNlOworCQorCWludCBicmFja2V0RGVwdGg7CisJaW50IHRocm93QnJhY2tldERlcHRoOworCisJLy8gdGhlIHN0YWNrcyBvZiB0eXBlcyBhbmQgcXVhbGlmaWVycyBmb3IgaW52b2NhdGlvbnMgKGllLiBtZXRob2QgaW52b2NhdGlvbnMsIGFsbG9jYXRpb24gZXhwcmVzc2lvbnMgYW5kCisJLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbnMpLiBUaGV5IHVzZSB0aGUgc2FtZSBzdGFjayBwb2ludGVyIGFzIHRoZSBzZWxlY3RvciBzdGFjayAoaWUuIGludm9jYXRpb25QdHIpCisJLy8gdGhlIGludm9jYXRpb24gdHlwZSBzdGFjayBjb250YWlucyBvbmUgb2YgdGhlIGludm9jYXRpb24gdHlwZSBjb25zdGFudHMgYmVsb3cKKwkvLyB0aGUgcXVhbGlmaWVyIHN0YWNrIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBleHByZXNzaW9uIHN0YWNrIG9yIC0xIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllcgorCS8vIChhIHF1YWxpZmllciBpcyB0aGUgZXhwcmVzc2lvbiB0aGF0IHF1YWxpZmllcyBhICduZXcnLCBhICdzdXBlcicgY29uc3RydWN0b3Igb3IgYSAndGhpcycgY29uc3RydWN0b3IKKwkvLyAgb3IgaXQgaXMgdGhlIHJlY2VpdmVyIG9mIGEgbWVzc2FnZSBzZW5kKQorCWludFtdIGludm9jYXRpb25UeXBlU3RhY2sgPSBuZXcgaW50W1N0YWNrSW5jcmVtZW50XTsKKwlpbnRbXSBxdWFsaWZpZXJTdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOworCisJLy8gaW52b2NhdGlvbiB0eXBlIGNvbnN0YW50cworCXN0YXRpYyBmaW5hbCBpbnQgRVhQTElDSVRfUkVDRUlWRVIgPSAwOworCXN0YXRpYyBmaW5hbCBpbnQgTk9fUkVDRUlWRVIgPSAtMTsKKwlzdGF0aWMgZmluYWwgaW50IFNVUEVSX1JFQ0VJVkVSID0gLTI7CisJc3RhdGljIGZpbmFsIGludCBOQU1FX1JFQ0VJVkVSID0gLTM7CisJc3RhdGljIGZpbmFsIGludCBBTExPQ0FUSU9OID0gLTQ7CisJc3RhdGljIGZpbmFsIGludCBRVUFMSUZJRURfQUxMT0NBVElPTiA9IC01OworCisJLy8gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiAob25lIG9mIHRoZSBpbnZvY2F0aW9uIHR5cGUgY29uc3RhbnRzKQorCWludCBpbnZvY2F0aW9uVHlwZTsKKworCS8vIGEgcG9pbnRlciBpbiB0aGUgZXhwcmVzc2lvbiBzdGFjayB0byB0aGUgcXVhbGlmaWVyIG9mIGEgaW52b2NhdGlvbgorCWludCBxdWFsaWZpZXI7CisKKwkvLyBhIHN0YWNrIG9mIGxhYmVsIGNvdW50ZXJzCisJLy8gYSBuZXcgY291bnRlciBpcyBwdXNoZWQgb24gdGhlIHN0YWNrIGVhY2ggdGltZSB3aGVuIGEgbWV0aG9kIChvciBhIGNvbnN0cnVjdG9yKSBpcyBlbnRlcmVkLCAKKwkvLyBpdCBpcyBwb3BlZCB3aGVuIHRoZSBtZXRob2QgKG9yIGNvbnN0cnVjdG9yKSBpcyBleGl0ZWQsCisJLy8gaXQgaXMgaW5jcmVtZW50ZWQgd2hlbiBhIG5ldyBsYWJlbCBpcyBkZWZpbmVkCisJaW50IGxhYmVsQ291bnRlclB0cjsKKwlpbnRbXSBsYWJlbENvdW50ZXJTdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOworCisJLy8gYSBzdGFjayBvZiBpbnZvY2F0aW9uUHRyOiBjb250YWlucyB0aGUgZmlyc3QgaW52b2NhdGlvblB0ciBvZiBhIGJsb2NrCisJLy8gdGhlIGN1cnJlbnQgaW52b2NhdGlvblB0cisxIGlzIHB1c2hlZCB3aGVuIGEgYmxvY2sgaXMgZW50ZXJlZAorCS8vIGl0IGlzIHBvcGVkIHdoZW4gYSBibG9jayBpcyBleGl0ZWQgCisJaW50IGJsb2NrSW52b2NhdGlvblB0cjsKKwlpbnRbXSBibG9ja0ludm9jYXRpb25TdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOworCQorCS8vIGxhc3QgbW9kaWZpZXJzIGluZm8KKwlpbnQgbGFzdE1vZGlmaWVycyA9IEFjY0RlZmF1bHQ7CisJaW50IGxhc3RNb2RpZmllcnNTdGFydCA9IC0xOworCQorcHVibGljIENvbXBsZXRpb25QYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgYm9vbGVhbiBhc3NlcnRNb2RlKSB7CisJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBhc3NlcnRNb2RlKTsKK30KK3B1YmxpYyBjaGFyW10gYXNzaXN0SWRlbnRpZmllcigpeworCXJldHVybiAoKENvbXBsZXRpb25TY2FubmVyKXNjYW5uZXIpLmNvbXBsZXRpb25JZGVudGlmaWVyOworfQorcHJvdGVjdGVkIHZvaWQgYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKXsKKwlpZiAodGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlKSB7CisJCUFzdE5vZGUgb3JwaGFuID0gdGhpcy5hc3Npc3ROb2RlOworCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsKKwkJCisJCS8qIGlmIGluIGNvbnRleHQgb2YgYSB0eXBlLCB0aGVuIHBlcnNpc3RzIHRoZSBpZGVudGlmaWVyIGludG8gYSBmYWtlIGZpZWxkIHJldHVybiB0eXBlICovCisJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCQkJUmVjb3ZlcmVkVHlwZSByZWNvdmVyZWRUeXBlID0gKFJlY292ZXJlZFR5cGUpY3VycmVudEVsZW1lbnQ7CisJCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCisJCQlpZiAocmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJCS8qIGdlbmVyYXRlIGEgcHNldWRvIGZpZWxkIHdpdGggYSBjb21wbGV0aW9uIG9uIHR5cGUgcmVmZXJlbmNlICovCQorCQkJCWlmIChvcnBoYW4gaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKXsKKwkJCQkJQ29tcGxldGlvbk9uRmllbGRUeXBlIGZpZWxkRGVjbGFyYXRpb24gPSBuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKChUeXBlUmVmZXJlbmNlKW9ycGhhbiwgZmFsc2UpOworCisJCQkJCS8vIHJldHJpZXZlIGF2YWlsYWJsZSBtb2RpZmllcnMgaWYgYW55CisJCQkJCWlmIChpbnRQdHIgPj0gMiAmJiBpbnRTdGFja1tpbnRQdHItMV0gPT0gdGhpcy5sYXN0TW9kaWZpZXJzU3RhcnQgJiYgaW50U3RhY2tbaW50UHRyLTJdID09IHRoaXMubGFzdE1vZGlmaWVycyl7CisJCQkJCQlmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLTFdOworCQkJCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItMl07CisJCQkJCX0KKworCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChmaWVsZERlY2xhcmF0aW9uLCAwKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBpZiBpbiBjb250ZXh0IG9mIGEgbWV0aG9kLCBwZXJzaXN0cyBpZiBpbnNpZGUgYXJndW1lbnRzIGFzIGEgdHlwZSAqLworCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRNZXRob2QpeworCQkJUmVjb3ZlcmVkTWV0aG9kIHJlY292ZXJlZE1ldGhvZCA9IChSZWNvdmVyZWRNZXRob2QpY3VycmVudEVsZW1lbnQ7CisJCQkvKiBvbmx5IGNvbnNpZGVyIGlmIGluc2lkZSBtZXRob2QgaGVhZGVyICovCisJCQlpZiAoIXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJCS8vaWYgKHJQYXJlblBvcyA8IGxQYXJlblBvcyl7IC8vIGluc2lkZSBhcmd1bWVudHMKKwkJCQlpZiAob3JwaGFuIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSl7CisJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50LmFkZCgKKwkJCQkJCW5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUoKFR5cGVSZWZlcmVuY2Upb3JwaGFuLCB0cnVlKSwgMCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBhZGQgdGhlIGNvbXBsZXRpb24gbm9kZSB0byB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCisJCWlmIChvcnBoYW4gaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHsKKwkJCS8qIGNoZWNrIGZvciBjb21wbGV0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgbWV0aG9kIGJvZHkKKwkJCQliZWhpbmQgYW4gaW52YWxpZCBzaWduYXR1cmUKKwkJCSAqLworCQkJUmVjb3ZlcmVkTWV0aG9kIG1ldGhvZCA9IGN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ01ldGhvZCgpOworCQkJaWYgKG1ldGhvZCAhPSBudWxsKXsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBtZXRob2QubWV0aG9kRGVjbGFyYXRpb247CisJCQkJaWYgKChtZXRob2REZWNsLmJvZHlTdGFydCA9PSBtZXRob2REZWNsLnNvdXJjZUVuZCsxKSAvLyB3YXMgbWlzc2luZyBvcGVuaW5nIGJyYWNlCisJCQkJCSYmIChzY2FubmVyLmdldExpbmVOdW1iZXIob3JwaGFuLnNvdXJjZVN0YXJ0KSA9PSBzY2FubmVyLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbC5zb3VyY2VFbmQpKSl7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvLyBhZGQgdGhlIGNvbXBsZXRpb24gbm9kZSBhcyBhIHN0YXRlbWVudCB0byB0aGUgbGlzdCBvZiBibG9jayBzdGF0ZW1lbnRzCisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KW9ycGhhbiwgMCk7CisJCQlyZXR1cm47CisJCX0gCisJfQorCQorCS8vIHRoZSBmb2xsb3dpbmcgY29kZSBhcHBsaWVzIG9ubHkgaW4gbWV0aG9kcywgY29uc3RydWN0b3JzIG9yIGluaXRpYWxpemVycworCWlmICgoIXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSAmJiAhdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0pKSB7IAorCQlyZXR1cm47CisJfQorCQorCS8vIHB1c2ggdG9wIGV4cHJlc3Npb24gb24gYXN0IHN0YWNrIGlmIGl0IGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIG5vZGUKKwlFeHByZXNzaW9uIGV4cHJlc3Npb247CisJaWYgKHRoaXMuZXhwcmVzc2lvblB0ciA+IC0xICYmIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pKSB7CisJCS8qIGNoZWNrIGZvciBjb21wbGV0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgbWV0aG9kIGJvZHkKKwkJCWJlaGluZCBhbiBpbnZhbGlkIHNpZ25hdHVyZQorCQkgKi8KKwkJUmVjb3ZlcmVkTWV0aG9kIG1ldGhvZCA9IGN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ01ldGhvZCgpOworCQlpZiAobWV0aG9kICE9IG51bGwpeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uOworCQkJaWYgKChtZXRob2REZWNsLmJvZHlTdGFydCA9PSBtZXRob2REZWNsLnNvdXJjZUVuZCsxKSAvLyB3YXMgbWlzc2luZyBvcGVuaW5nIGJyYWNlCisJCQkJJiYgKHNjYW5uZXIuZ2V0TGluZU51bWJlcihleHByZXNzaW9uLnNvdXJjZVN0YXJ0KSA9PSBzY2FubmVyLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbC5zb3VyY2VFbmQpKSl7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwkJCS8vIGtlZXAgdGhlIGNvbnRleHQgaWYgaXQgaXMgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCisJCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCl3cmFwV2l0aEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsSWZOZWVkZWQoZXhwcmVzc2lvbik7CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQl9IGVsc2UgeworCQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpd3JhcFdpdGhFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbElmTmVlZGVkKHRoaXMuYXNzaXN0Tm9kZSk7CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQl9CisJfQorfQorcHVibGljIGludCBib2R5RW5kKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKXsKKwlyZXR1cm4gY3Vyc29yTG9jYXRpb247Cit9CitwdWJsaWMgaW50IGJvZHlFbmQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpeworCXJldHVybiBjdXJzb3JMb2NhdGlvbjsKK30KKy8qKgorICogQ2hlY2tzIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9uIHRoZSBleGNlcHRpb24gdHlwZSBvZiBhIGNhdGNoIGNsYXVzZS4KKyAqIFJldHVybnMgd2hldGhlciB3ZSBmb3VuZCBhIGNvbXBsZXRpb24gbm9kZS4KKyAqLworcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2F0Y2hDbGF1c2UoKSB7CisJaWYgKHRoaXMuYmV0d2VlbkNhdGNoQW5kUmlnaHRQYXJlbiAmJiB0aGlzLmlkZW50aWZpZXJQdHIgPiAtMSkgeyAKKwkJLy8gTkI6IGlmIHRoZSBjdXJzb3IgaXMgb24gdGhlIHZhcmlhYmxlLCB0aGVuIGl0IGhhcyBiZWVuIHJlZHVjZWQgKHNvIGlkZW50aWZpZXJQdHIgaXMgLTEpLCAKKwkJLy8gICAgIHRodXMgdGhpcyBjYW4gb25seSBiZSBhIGNvbXBsZXRpb24gb24gdGhlIHR5cGUgb2YgdGhlIGNhdGNoIGNsYXVzZQorCQl0aGlzLmFzc2lzdE5vZGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CisJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIENoZWNrcyBpZiB0aGUgY29tcGxldGlvbiBpcyBvbiB0aGUgdHlwZSBmb2xsb3dpbmcgYSAnbmV3Jy4KKyAqIFJldHVybnMgd2hldGhlciB3ZSBmb3VuZCBhIGNvbXBsZXRpb24gbm9kZS4KKyAqLworcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgeworCWlmICh0aGlzLmJldHdlZW5OZXdBbmRMZWZ0QnJha2V0KSB7CisJCS8vIGNvbXBsZXRpb24gb24gdHlwZSBpbnNpZGUgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCisJCQorCQlpZih0aGlzLnRocm93QnJhY2tldERlcHRoICE9IC0xICYmIHRoaXMudGhyb3dCcmFja2V0RGVwdGggPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKKwkJCXRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbiA9IHRydWU7CQorCQl9CisJCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJCXRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbiA9IGZhbHNlOworCQl0aGlzLmFzc2lzdE5vZGUgPSB0eXBlOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdHlwZS5zb3VyY2VFbmQgKyAxOworCQlpZiAodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBBTExPQ0FUSU9OKSB7CisJCQkvLyBub24gcXVhbGlmaWVkIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NFeHByID0gbmV3IEFsbG9jYXRpb25FeHByZXNzaW9uKCk7CisJCQlhbGxvY0V4cHIudHlwZSA9IHR5cGU7CisJCQlhbGxvY0V4cHIuc291cmNlU3RhcnQgPSB0eXBlLnNvdXJjZVN0YXJ0OworCQkJYWxsb2NFeHByLnNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOworCQkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFsbG9jRXhwcik7CisJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8vIHF1YWxpZmllZCBhbGxvY2F0aW9uIGV4cHJlc3Npb24KKwkJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jRXhwciA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQkJYWxsb2NFeHByLnR5cGUgPSB0eXBlOworCQkJYWxsb2NFeHByLmVuY2xvc2luZ0luc3RhbmNlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5xdWFsaWZpZXJdOworCQkJYWxsb2NFeHByLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCWFsbG9jRXhwci5zb3VyY2VFbmQgPSB0eXBlLnNvdXJjZUVuZDsKKwkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMucXVhbGlmaWVyXSA9IGFsbG9jRXhwcjsgLy8gYXR0YWNoIGl0IG5vdyAoaXQgcmVwbGFjZXMgdGhlIHF1YWxpZmllciBleHByZXNzaW9uKQorCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQ2hlY2tzIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9uIHRoZSBkb3QgZm9sbG93aW5nIGFuIGFycmF5IHR5cGUsCisgKiBhIHByaW1pdGl2ZSB0eXBlIG9yIGFuIHByaW1pdGl2ZSBhcnJheSB0eXBlLgorICogUmV0dXJucyB3aGV0aGVyIHdlIGZvdW5kIGEgY29tcGxldGlvbiBub2RlLgorICovCitwcml2YXRlIGJvb2xlYW4gY2hlY2tDbGFzc0xpdGVyYWxBY2Nlc3MoKSB7CisJaWYgKHRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+PSAxICYmIHRoaXMucHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVET1QpIHsgLy8gKE5COiB0aGUgdG9wIGlkIGxlbmd0aCBpcyAxIGFuZCBpdCBpcyBmb3IgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllcikKKwkJaW50IGxlbmd0aDsKKwkJLy8gaWYgdGhlIHBlbnVsdGltYXRlIGlkIGxlbmd0aCBpcyBuZWdhdGl2ZSwgCisJCS8vIHRoZSBjb21wbGV0aW9uIGlzIGFmdGVyIGEgcHJpbWl0aXZlIHR5cGUgb3IgYSBwcmltaXRpdmUgYXJyYXkgdHlwZQorCQlpZiAoKGxlbmd0aCA9IHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0xXSkgPCAwKSB7CisJCQkvLyBidWlsZCB0aGUgcHJpbWl0aXZlIHR5cGUgbm9kZQorCQkJaW50IGRpbSA9IHRoaXMuaXNBZnRlckFycmF5VHlwZSgpID8gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXSA6IDA7CisJCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoU2luZ2xlVHlwZVJlZmVyZW5jZSlUeXBlUmVmZXJlbmNlLmJhc2VUeXBlUmVmZXJlbmNlKC1sZW5ndGgsIGRpbSk7CisJCQl0eXBlUmVmLnNvdXJjZVN0YXJ0ID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXR5cGVSZWYuc291cmNlRW5kID0gdGhpcy5pbnRTdGFja1t0aGlzLmludFB0ci0tXTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pbnRQdHItLTsKKwkJCQl0eXBlUmVmLnNvdXJjZUVuZCA9IHRoaXMuZW5kUG9zaXRpb247CisJCQl9CisJCQkvL3R5cGVSZWYuc291cmNlRW5kID0gdHlwZVJlZi5zb3VyY2VTdGFydCArIHR5cGVSZWYudG9rZW4ubGVuZ3RoOyAvLyBOQjogSXQncyBvayB0byB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgdG9rZW4gc2luY2UgaXQgZG9lc24ndCBjb250YWluIGFueSB1bmljb2RlCisKKwkJCS8vIGZpbmQgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhbmQgaXRzIHNvdXJjZSBwb3NpdGlvbnMKKwkJCWNoYXJbXSBzb3VyY2UgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJCQlsb25nIHBvcyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07IC8vIGl0IGNhbiBvbmx5IGJlIGEgc2ltcGxlIGlkZW50aWZpZXIgKHNvIGl0cyBsZW5ndGggaXMgb25lKQorCisJCQkvLyBidWlsZCB0aGUgY29tcGxldGlvbiBvbiBjbGFzcyBsaXRlcmFsIGFjY2VzcyBub2RlCisJCQlDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MgYWNjZXNzID0gbmV3IENvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcyhwb3MsIHR5cGVSZWYpOworCQkJYWNjZXNzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gc291cmNlOworCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07IC8vIHBvcCB0aGUgbGVuZ3RoIHRoYXQgd2FzIHVzZWQgdG8gc2F5IGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUKKwkJCXRoaXMuYXNzaXN0Tm9kZSA9IGFjY2VzczsKKwkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8vIGlmIHRoZSBjb21wbGV0aW9uIGlzIGFmdGVyIGEgcmVndWxhciBhcnJheSB0eXBlCisJCWlmIChpc0FmdGVyQXJyYXlUeXBlKCkpIHsKKwkJCS8vIGZpbmQgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhbmQgaXRzIHNvdXJjZSBwb3NpdGlvbnMKKwkJCWNoYXJbXSBzb3VyY2UgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJCQlsb25nIHBvcyA9IHRoaXMuaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyLS1dOworCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07IC8vIGl0IGNhbiBvbmx5IGJlIGEgc2ltcGxlIGlkZW50aWZpZXIgKHNvIGl0cyBsZW5ndGggaXMgb25lKQorCQkJCisJCQkvLyBnZXQgdGhlIHR5cGUgcmVmZXJlbmNlCisJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBnZXRUeXBlUmVmZXJlbmNlKHRoaXMuaW50UHRyLS0pOworCQkJCisJCQkvLyBidWlsZCB0aGUgY29tcGxldGlvbiBvbiBjbGFzcyBsaXRlcmFsIGFjY2VzcyBub2RlCisJCQlDb21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MgYWNjZXNzID0gbmV3IENvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcyhwb3MsIHR5cGVSZWYpOworCQkJYWNjZXNzLmNvbXBsZXRpb25JZGVudGlmaWVyID0gc291cmNlOworCQkJdGhpcy5hc3Npc3ROb2RlID0gYWNjZXNzOworCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgbWV0aG9kIGludm9jYXRpb24gb3IgYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLgorICogUmV0dXJucyB3aGV0aGVyIHdlIGZvdW5kIGEgY29tcGxldGlvbiBub2RlLgorICovCitwcml2YXRlIGJvb2xlYW4gY2hlY2tJbnZvY2F0aW9uKCkgeworCUV4cHJlc3Npb24gdG9wRXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvblB0ciA+PSAwID8gCisJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0gOgorCQludWxsOworCWJvb2xlYW4gaXNFbXB0eU5hbWVDb21wbGV0aW9uID0gZmFsc2U7CisJYm9vbGVhbiBpc0VtcHR5QXNzaXN0SWRlbnRpZmllciA9IGZhbHNlOworCWludCBzdGFydEludm9jYXRpb25QdHIgPSB0aGlzLmJsb2NrSW52b2NhdGlvblB0ciA+PSAwID8gdGhpcy5ibG9ja0ludm9jYXRpb25TdGFja1t0aGlzLmJsb2NrSW52b2NhdGlvblB0cl0gOiAwOworCWlmICh0aGlzLmludm9jYXRpb25QdHIgPj0gc3RhcnRJbnZvY2F0aW9uUHRyCisJCSYmICgoaXNFbXB0eU5hbWVDb21wbGV0aW9uID0gdG9wRXhwcmVzc2lvbiA9PSB0aGlzLmFzc2lzdE5vZGUgJiYgdGhpcy5pc0VtcHR5TmFtZUNvbXBsZXRpb24oKSkgLy8gZWcuIGl0IGlzIHNvbWV0aGluZyBsaWtlICJ0aGlzLmZyZWQoW2N1cnNvcl0iIGJ1dCBpdCBpcyBub3Qgc29tZXRoaW5nIGxpa2UgInRoaXMuZnJlZCgxICsgW2N1cnNvcl0iCisJCQl8fCAoaXNFbXB0eUFzc2lzdElkZW50aWZpZXIgPSB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPj0gMCAmJiB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdLmxlbmd0aCA9PSAwKSkpIHsgLy8gZWcuIGl0IGlzIHNvbWV0aGluZyBsaWtlICJ0aGlzLmZyZWQoMSBbY3Vyc29yXSIKKwkJCQkKKwkJLy8gcG9wIGVtcHR5IG5hbWUgY29tcGxldGlvbgorCQlpZiAoaXNFbXB0eU5hbWVDb21wbGV0aW9uKSB7CisJCQl0aGlzLmV4cHJlc3Npb25QdHItLTsKKwkJCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0cl0tLTsKKwkJfSBlbHNlIGlmIChpc0VtcHR5QXNzaXN0SWRlbnRpZmllcikgeworCQkJdGhpcy5pZGVudGlmaWVyUHRyLS07CisJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJfQorCisJCS8vIGZpbmQgcmVjZWl2ZXIgYW5kIHF1YWxpZmllcgorCQlpbnQgaW52b2NhdGlvblR5cGUgPSB0aGlzLmludm9jYXRpb25UeXBlU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXTsKKwkJaW50IHF1YWxpZmllckV4cHJQdHIgPSB0aGlzLnF1YWxpZmllclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl07CisKKwkJLy8gZmluZCBhcmd1bWVudHMKKwkJaW50IG51bUFyZ3MgPSB0aGlzLmV4cHJlc3Npb25QdHIgLSBxdWFsaWZpZXJFeHByUHRyOworCQlpbnQgYXJnU3RhcnQgPSBxdWFsaWZpZXJFeHByUHRyICsgMTsKKwkJRXhwcmVzc2lvbltdIGFyZ3VtZW50cyA9IG51bGw7CisJCWlmIChudW1BcmdzID4gMCkgeworCQkJLy8gcmVtZW1iZXIgdGhlIGFyZ3VtZW50cworCQkJYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbnVtQXJnc107CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXhwcmVzc2lvblN0YWNrLCBhcmdTdGFydCwgYXJndW1lbnRzLCAwLCBudW1BcmdzKTsKKworCQkJLy8gY29uc3VtZSB0aGUgZXhwcmVzc2lvbiBhcmd1bWVudHMKKwkJCXRoaXMuZXhwcmVzc2lvblB0ciAtPSBudW1BcmdzOworCQkJaW50IGNvdW50ID0gbnVtQXJnczsKKwkJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCQljb3VudCAtPSB0aGlzLmV4cHJlc3Npb25MZW5ndGhTdGFja1t0aGlzLmV4cHJlc3Npb25MZW5ndGhQdHItLV07CisJCQl9IAorCQl9CisKKwkJLy8gYnVpbGQgYXN0IG5vZGUKKwkJaWYgKGludm9jYXRpb25UeXBlICE9IEFMTE9DQVRJT04gJiYgaW52b2NhdGlvblR5cGUgIT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsKKwkJCS8vIGNyZWF0ZXMgY29tcGxldGlvbiBvbiBtZXNzYWdlIHNlbmQJCisJCQlDb21wbGV0aW9uT25NZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IG5ldyBDb21wbGV0aW9uT25NZXNzYWdlU2VuZCgpOworCQkJbWVzc2FnZVNlbmQuYXJndW1lbnRzID0gYXJndW1lbnRzOworCQkJc3dpdGNoIChpbnZvY2F0aW9uVHlwZSkgeworCQkJCWNhc2UgTk9fUkVDRUlWRVI6CisJCQkJCS8vIGltcGxpY2l0IHRoaXMKKwkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOQU1FX1JFQ0VJVkVSOgorCQkJCQkvLyByZW1vdmUgc3BlY2lhbCBmbGFncyBmb3IgcHJpbWl0aXZlIHR5cGVzCisJCQkJCXdoaWxlICh0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgPj0gMCAmJiB0aGlzLmlkZW50aWZpZXJMZW5ndGhTdGFja1t0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHJdIDwgMCkgeworCQkJCQkJdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJCQkJCX0KKwkJCQkKKwkJCQkJLy8gcmVtb3ZlIHNlbGVjdG9yIAorCQkJCQl0aGlzLmlkZW50aWZpZXJQdHItLTsgCisJCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0tLTsKKwkJCQkJLy8gY29uc3VtZSB0aGUgcmVjZWl2ZXIKKwkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSB0aGlzLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1VQRVJfUkVDRUlWRVI6CisJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gU3VwZXJSZWZlcmVuY2UuU3VwZXI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVhQTElDSVRfUkVDRUlWRVI6CisJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gdGhpcy5leHByZXNzaW9uU3RhY2tbcXVhbGlmaWVyRXhwclB0cl07CisJCQl9CisKKwkJCS8vIHNldCBzZWxlY3RvcgorCQkJaW50IHNlbGVjdG9yUHRyID0gdGhpcy5zZWxlY3RvclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl07CisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciA9IHRoaXMuaWRlbnRpZmllclN0YWNrW3NlbGVjdG9yUHRyXTsKKwkJCS8vIHJlbW92ZSBzZWxlY3RvcgorCQkJaWYgKHRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+PTAgJiYgdGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA9PSAxKSB7CisJCQkJdGhpcy5pZGVudGlmaWVyUHRyLS07IAorCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ci0tOworCQkJfQorCQkKKwkJCS8vIHRoZSBlbnRpcmUgbWVzc2FnZSBtYXkgYmUgcmVwbGFjZWQgaW4gY2FzZSBxdWFsaWZpY2F0aW9uIGlzIG5lZWRlZAorCQkJbWVzc2FnZVNlbmQuc291cmNlU3RhcnQgPSAoaW50KSh0aGlzLmlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3NlbGVjdG9yUHRyXSA+PiAzMik7IC8vdGhpcy5jdXJzb3JMb2NhdGlvbiArIDE7CisJCQltZXNzYWdlU2VuZC5zb3VyY2VFbmQgPSB0aGlzLmN1cnNvckxvY2F0aW9uOworCisJCQkvLyByZW1lbWJlciB0aGUgbWVzc2FnZSBzZW5kIGFzIGFuIG9ycGhhbiBjb21wbGV0aW9uIG5vZGUKKwkJCXRoaXMuYXNzaXN0Tm9kZSA9IG1lc3NhZ2VTZW5kOworCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1lc3NhZ2VTZW5kLnNvdXJjZUVuZCArIDE7CisJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQlpbnQgc2VsZWN0b3JQdHIgPSB0aGlzLnNlbGVjdG9yU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXTsKKwkJCWlmIChzZWxlY3RvclB0ciA9PSBUSElTX0NPTlNUUlVDVE9SIHx8IHNlbGVjdG9yUHRyID09IFNVUEVSX0NPTlNUUlVDVE9SKSB7CisJCQkJLy8gY3JlYXRlcyBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsCisJCQkJQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCA9IG5ldyBDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCgKKwkJCQkJKHNlbGVjdG9yUHRyID09IFRISVNfQ09OU1RSVUNUT1IpID8gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsKKwkJCQljYWxsLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKwkJCQlpZiAoaW52b2NhdGlvblR5cGUgPT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsKKwkJCQkJY2FsbC5xdWFsaWZpY2F0aW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbcXVhbGlmaWVyRXhwclB0cl07CisJCQkJfQorCQkKKwkJCQkvLyBubyBzb3VyY2UgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQKKwkJCQljYWxsLnNvdXJjZVN0YXJ0ID0gdGhpcy5jdXJzb3JMb2NhdGlvbiArIDE7CisJCQkJY2FsbC5zb3VyY2VFbmQgPSB0aGlzLmN1cnNvckxvY2F0aW9uOworCisJCQkJLy8gcmVtZW1iZXIgdGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgYXMgYW4gb3JwaGFuIGNvbXBsZXRpb24gbm9kZQorCQkJCXRoaXMuYXNzaXN0Tm9kZSA9IGNhbGw7CisJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGNhbGwuc291cmNlRW5kICsgMTsKKwkJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQkvLyBjcmVhdGVzIGFuIGFsbG9jYXRpb24gZXhwcmVzc2lvbiAKKwkJCQlDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY0V4cHIgPSBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwkJCQlhbGxvY0V4cHIuYXJndW1lbnRzID0gYXJndW1lbnRzOworCQkJCWFsbG9jRXhwci50eXBlID0gc3VwZXIuZ2V0VHlwZVJlZmVyZW5jZSgwKTsgLy8gd2UgZG9uJ3Qgd2FudCBhIGNvbXBsZXRpb24gbm9kZSBoZXJlLCBzbyBjYWxsIHN1cGVyCisJCQkJaWYgKGludm9jYXRpb25UeXBlID09IFFVQUxJRklFRF9BTExPQ0FUSU9OKSB7CisJCQkJCWFsbG9jRXhwci5lbmNsb3NpbmdJbnN0YW5jZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3F1YWxpZmllckV4cHJQdHJdOworCQkJCX0KKwkJCQkvLyBubyBzb3VyY2UgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQKKwkJCQlhbGxvY0V4cHIuc291cmNlU3RhcnQgPSB0aGlzLmN1cnNvckxvY2F0aW9uICsgMTsKKwkJCQlhbGxvY0V4cHIuc291cmNlRW5kID0gdGhpcy5jdXJzb3JMb2NhdGlvbjsKKwkJCQkKKwkJCQkvLyByZW1lbWJlciB0aGUgYWxsb2NhdGlvbiBleHByZXNzaW9uIGFzIGFuIG9ycGhhbiBjb21wbGV0aW9uIG5vZGUKKwkJCQl0aGlzLmFzc2lzdE5vZGUgPSBhbGxvY0V4cHI7CisJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGFsbG9jRXhwci5zb3VyY2VFbmQgKyAxOworCQkJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbXBsZXRpb24gaXMgb24gYSBtZW1iZXIgYWNjZXNzIChpZS4gaW4gYW4gaWRlbnRpZmllciBmb2xsb3dpbmcgYSBkb3QpLgorICogUmV0dXJucyB3aGV0aGVyIHdlIGZvdW5kIGEgY29tcGxldGlvbiBub2RlLgorICovCitwcml2YXRlIGJvb2xlYW4gY2hlY2tNZW1iZXJBY2Nlc3MoKSB7CisJaWYgKHRoaXMucHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVET1QgJiYgdGhpcy5xdWFsaWZpZXIgPiAtMSAmJiB0aGlzLmV4cHJlc3Npb25QdHIgPT0gdGhpcy5xdWFsaWZpZXIpIHsKKwkJLy8gdGhlIHJlY2VpdmVyIGlzIGFuIGV4cHJlc3Npb24KKwkJcHVzaENvbXBsZXRpb25Pbk1lbWJlckFjY2Vzc09uRXhwcmVzc2lvblN0YWNrKGZhbHNlKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQ2hlY2tzIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9uIGEgbmFtZSByZWZlcmVuY2UuCisgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBjaGVja05hbWVDb21wbGV0aW9uKCkgeworCS8qIAorCQlXZSBkaWRuJ3QgZmluZCBhbnkgb3RoZXIgY29tcGxldGlvbiwgYnV0IHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgaXMgb24gdGhlIGlkZW50aWZpZXIgc3RhY2ssCisJCXNvIGl0IGNhbiBvbmx5IGJlIGEgY29tcGxldGlvbiBvbiBuYW1lLgorCQlOb3RlIHRoYXQgd2UgYWxsb3cgdGhlIGNvbXBsZXRpb24gb24gYSBuYW1lIGV2ZW4gaWYgbm90aGluZyBpcyBleHBlY3RlZCAoZWcuIGZvbygpIGJbY3Vyc29yXSB3b3VsZAorCQliZSBhIGNvbXBsZXRpb24gb24gJ2InKS4gVGhpcyBwb2xpY3kgZ2l2ZXMgbW9yZSB0byB0aGUgdXNlciB0aGFuIGhlL3NoZSB3b3VsZCBleHBlY3QsIGJ1dCB0aGlzIAorCQlzaW1wbGlmaWVzIHRoZSBwcm9ibGVtLiBUbyBmaXggdGhpcywgdGhlIHJlY292ZXJ5IG11c3QgYmUgY2hhbmdlZCB0byB3b3JrIGF0IGEgJ3N0YXRlbWVudCcgZ3JhbnVsYXJpdHkKKwkJaW5zdGVhZCBvZiBhdCB0aGUgJ2V4cHJlc3Npb24nIGdyYW51bGFyaXR5IGFzIGl0IGRvZXMgcmlnaHQgbm93LgorCSovIAorCQorCS8vIE5COiBhdCB0aGlzIHBvaW50IHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgaXMgb24gdGhlIGlkZW50aWZpZXIgc3RhY2sKKwl0aGlzLmFzc2lzdE5vZGUgPSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kICsgMTsKKwl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbXBsZXRpb24gaXMgaW4gdGhlIGNvbnRleHQgb2YgYSBtZXRob2QgYW5kIG9uIHRoZSB0eXBlIG9mIG9uZSBvZiBpdHMgYXJndW1lbnRzCisgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBjaGVja1JlY292ZXJlZE1ldGhvZCgpIHsKKwlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRNZXRob2QpeworCQkvKiBjaGVjayBpZiBjdXJyZW50IGF3YWl0aW5nIGlkZW50aWZpZXIgaXMgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciAqLworCQlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgcmV0dXJuIGZhbHNlOworCisJCS8qIGNoZWNrIGlmIG9uIGxpbmUgd2l0aCBhbiBlcnJvciBhbHJlYWR5IC0gdG8gYXZvaWQgY29tcGxldGluZyBpbnNpZGUgCisJCQlpbGxlZ2FsIHR5cGUgbmFtZXMgZS5nLiAgaW50WzxjdXJzb3I+ICovCisJCWlmIChsYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbisxCisJCQkmJiBzY2FubmVyLmdldExpbmVOdW1iZXIobGFzdEVycm9yRW5kUG9zaXRpb24pIAorCQkJCT09IHNjYW5uZXIuZ2V0TGluZU51bWJlcigoKENvbXBsZXRpb25TY2FubmVyKXNjYW5uZXIpLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CQkKKyAJCVJlY292ZXJlZE1ldGhvZCByZWNvdmVyZWRNZXRob2QgPSAoUmVjb3ZlcmVkTWV0aG9kKWN1cnJlbnRFbGVtZW50OworCQkvKiBvbmx5IGNvbnNpZGVyIGlmIGluc2lkZSBtZXRob2QgaGVhZGVyICovCisJCWlmICghcmVjb3ZlcmVkTWV0aG9kLmZvdW5kT3BlbmluZ0JyYWNlCisJCQkmJiBsYXN0SWdub3JlZFRva2VuID09IC0xKSB7CisJCQkvL2lmIChyUGFyZW5Qb3MgPCBsUGFyZW5Qb3MpeyAvLyBpbnNpZGUgYXJndW1lbnRzCisJCQl0aGlzLmFzc2lzdE5vZGUgPSB0aGlzLmdldFR5cGVSZWZlcmVuY2UoMCk7CisJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CisJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBDaGVja3MgaWYgdGhlIGNvbXBsZXRpb24gaXMgaW4gdGhlIGNvbnRleHQgb2YgYSB0eXBlIGFuZCBvbiBhIHR5cGUgcmVmZXJlbmNlIGluIHRoaXMgdHlwZS4KKyAqIFBlcnNpc3RzIHRoZSBpZGVudGlmaWVyIGludG8gYSBmYWtlIGZpZWxkIHJldHVybiB0eXBlCisgKiBSZXR1cm5zIHdoZXRoZXIgd2UgZm91bmQgYSBjb21wbGV0aW9uIG5vZGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBjaGVja1JlY292ZXJlZFR5cGUoKSB7CisJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CisJCS8qIGNoZWNrIGlmIGN1cnJlbnQgYXdhaXRpbmcgaWRlbnRpZmllciBpcyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyICovCisJCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSByZXR1cm4gZmFsc2U7CisKKwkJLyogY2hlY2sgaWYgb24gbGluZSB3aXRoIGFuIGVycm9yIGFscmVhZHkgLSB0byBhdm9pZCBjb21wbGV0aW5nIGluc2lkZSAKKwkJCWlsbGVnYWwgdHlwZSBuYW1lcyBlLmcuICBpbnRbPGN1cnNvcj4gKi8KKwkJaWYgKChsYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbisxKQorCQkJJiYgc2Nhbm5lci5nZXRMaW5lTnVtYmVyKGxhc3RFcnJvckVuZFBvc2l0aW9uKSAKKwkJCQk9PSBzY2FubmVyLmdldExpbmVOdW1iZXIoKChDb21wbGV0aW9uU2Nhbm5lcilzY2FubmVyKS5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQpKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJLyogZmlsdGVyIG91dCBjYXNlcyB3aGVyZSBzY2FubmVyIGlzIHN0aWxsIGluc2lkZSB0eXBlIGhlYWRlciAqLworCQlpZiAocmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJdGhpcy5hc3Npc3ROb2RlID0gdGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApOworCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxOworCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qIAorICogQ2hlY2sgd2hldGhlciBhYm91dCB0byBzaGlmdCBiZXlvbmQgdGhlIGNvbXBsZXRpb24gdG9rZW4uCisgKiBJZiBzbywgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LCBhIHNwZWNpYWwgbm9kZSBtaWdodCBuZWVkIHRvIGJlIGNyZWF0ZWQKKyAqIGFuZCBhdHRhY2hlZCB0byB0aGUgZXhpc3RpbmcgcmVjb3ZlcmVkIHN0cnVjdHVyZSBzbyBhcyB0byBiZSByZW1lbWJlciBpbiB0aGUKKyAqIHJlc3VsdGluZyBwYXJzZWQgc3RydWN0dXJlLgorICovCitwdWJsaWMgdm9pZCBjb21wbGV0aW9uSWRlbnRpZmllckNoZWNrKCl7CisKKwlpZiAoY2hlY2tSZWNvdmVyZWRUeXBlKCkpIHJldHVybjsKKwlpZiAoY2hlY2tSZWNvdmVyZWRNZXRob2QoKSkgcmV0dXJuOworCisJLy8gaWYgbm90IGluIGEgbWV0aG9kIGluIG5vbiBkaWV0IG1vZGUgYW5kIGlmIG5vdCBpbnNpZGUgYSBmaWVsZCBpbml0aWFsaXplciwgb25seSByZWNvcmQgcmVmZXJlbmNlcyBhdHRhY2hlZCB0byB0eXBlcworCWlmICghKHRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSAmJiAhdGhpcy5kaWV0KQorCQkmJiAhaW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpKSByZXR1cm47IAorCisJLyoKKwkgCUluIHNvbWUgY2FzZXMsIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgbWF5IG5vdCBoYXZlIHlldCBiZWVuIGNvbnN1bWVkLAorCSAJZS5nLiAgaW50LltjdXJzb3JdCisJIAlUaGlzIGlzIGJlY2F1c2UgdGhlIGdyYW1tYXIgZG9lcyBub3QgYWxsb3cgYW55IChlbXB0eSkgaWRlbnRpZmllciB0byBmb2xsb3cKKwkgCWEgYmFzZSB0eXBlLiBXZSB0aHVzIGhhdmUgdG8gbWFudWFsbHkgZm9yY2UgdGhlIGlkZW50aWZpZXIgdG8gYmUgY29uc3VtZWQKKwkgCShpLmUuIHB1c2hlZCkuCisJICovCisJaWYgKGFzc2lzdElkZW50aWZpZXIoKSA9PSBudWxsICYmIHRoaXMuY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIpIHsgLy8gVGVzdCBiZWxvdyBjb3BpZWQgZnJvbSBDb21wbGV0aW9uU2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpCisJCWlmIChjdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uICYmIHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAorCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOwkJCQkJCisJCX0gZWxzZSBpZiAoY3Vyc29yTG9jYXRpb24rMSA+PSB0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiAmJiBjdXJzb3JMb2NhdGlvbiA8IHRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCQkJdGhpcy5wdXNoSWRlbnRpZmllcigpOworCQl9CisJfQorCisJLy8gY2hlY2sgZm9yIGRpZmZlcmVudCBzY2VuYXJpaQorCXRyeSB7CisJCS8vIG5vIG5lZWQgdG8gZ28gZnVydGhlciBpZiB3ZSBmb3VuZCBhIG5vbiBlbXB0eSBjb21wbGV0aW9uIG5vZGUKKwkJLy8gKHdlIHN0aWxsIG5lZWQgdG8gc3RvcmUgbGFiZWxzIHRob3VnaCkKKwkJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsKSB7CisJCQkvLyBob3dldmVyIGluc2lkZSBhbiBpbnZvY2F0aW9uLCB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjb25zdW1lZCBpbnRvIGFuIGVtcHR5IG5hbWUgCisJCQkvLyBjb21wbGV0aW9uLCBzbyB0aGlzIGNoZWNrIHNob3VsZCBiZSBiZWZvcmUgd2UgY2hlY2sgdGhhdCB3ZSBhcmUgYXQgdGhlIGN1cnNvciBsb2NhdGlvbgorCQkJaWYgKCFpc0VtcHR5TmFtZUNvbXBsZXRpb24oKSB8fCBjaGVja0ludm9jYXRpb24oKSkgcmV0dXJuOworCQl9CisKKwkJLy8gbm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIHdlIGFyZSBub3QgYXQgdGhlIGN1cnNvciBsb2NhdGlvbgorCQlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgcmV0dXJuOworCisJCWlmIChjaGVja0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpKSByZXR1cm47CisJCWlmIChjaGVja0NhdGNoQ2xhdXNlKCkpIHJldHVybjsKKwkJaWYgKGNoZWNrTWVtYmVyQWNjZXNzKCkpIHJldHVybjsKKwkJaWYgKGNoZWNrQ2xhc3NMaXRlcmFsQWNjZXNzKCkpIHJldHVybjsKKworCQkvLyBpZiB0aGUgY29tcGxldGlvbiB3YXMgbm90IG9uIGFuIGVtcHR5IG5hbWUsIGl0IGNhbiBzdGlsbCBiZSBpbnNpZGUgYW4gaW52b2NhdGlvbiAoZWcuIHRoaXMuZnJlZCgiYWJjIltjdXJzb3JdKQorCQkvLyAoTkI6IFB1dCB0aGlzIGNoZWNrIGJlZm9yZSBjaGVja05hbWVDb21wbGV0aW9uKCkgYmVjYXVzZSB0aGUgc2VsZWN0b3Igb2YgdGhlIGludm9jYXRpb24gY2FuIGJlIG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrKQorCQlpZiAoY2hlY2tJbnZvY2F0aW9uKCkpIHJldHVybjsKKworCQlpZiAoY2hlY2tOYW1lQ29tcGxldGlvbigpKSByZXR1cm47CisJfSBmaW5hbGx5IHsKKwkJc3RvcmVMYWJlbHNJZk5lZWRlZCgpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXNlTGFiZWwoKSB7CisJRXhwcmVzc2lvbiBjYXNlRXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07CisJaWYgKGNhc2VFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSB8fCBjYXNlRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJLy8gbGFiZWwgY291bnRlciB3YXMgd3JvbmdseSBpbmNyZW1lbnRlZCBpbiBjb25zdW1lVG9rZW4KKwkJaWYgKHRoaXMubGFiZWxDb3VudGVyUHRyID49IDApIHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdLS07CisJfQorCXN1cGVyLmNvbnN1bWVDYXNlTGFiZWwoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKSB7CisJdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzQ2xhc3MgPSB0cnVlOworCXN1cGVyLmNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKTsKKwl0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNDbGFzcyA9IGZhbHNlOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzVHlwZUVsdCgpIHsKKwl0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNFeGNlcHRpb24gPSB0cnVlOworCXN1cGVyLmNvbnN1bWVDbGFzc1R5cGVFbHQoKTsKKwl0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNFeGNlcHRpb24gPSBmYWxzZTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25kaXRpb25hbEV4cHJlc3Npb24oaW50IG9wKSB7CisJRXhwcmVzc2lvbiB2YWx1ZUlmVHJ1ZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ciAtIDFdOworCWlmICh2YWx1ZUlmVHJ1ZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UgfHwgdmFsdWVJZlRydWUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCS8vIGxhYmVsIGNvdW50ZXIgd2FzIHdyb25nbHkgaW5jcmVtZW50ZWQgaW4gY29uc3VtZVRva2VuCisJCWlmICh0aGlzLmxhYmVsQ291bnRlclB0ciA+PSAwKSB0aGlzLmxhYmVsQ291bnRlclN0YWNrW3RoaXMubGFiZWxDb3VudGVyUHRyXS0tOworCX0KKwlzdXBlci5jb25zdW1lQ29uZGl0aW9uYWxFeHByZXNzaW9uKG9wKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKSB7CisJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpOworCXRoaXMubGFiZWxDb3VudGVyUHRyLS07CisJaWYgKHRoaXMuYmxvY2tJbnZvY2F0aW9uUHRyID49IDApIHRoaXMuYmxvY2tJbnZvY2F0aW9uUHRyLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKSB7CisJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCk7CisJcHVzaEJsb2NrSW52b2NhdGlvblB0cigpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpIHsKKworCS8qIG5vIG5lZWQgdG8gdGFrZSBhY3Rpb24gaWYgbm90IGluc2lkZSBhc3Npc3QgaWRlbnRpZmllcnMgKi8KKwlpZiAoaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwkJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOworCQlyZXR1cm47CisJfQorCQkKKwkvKiBmb3JjZSB0byBzdGFydCByZWNvdmVyaW5nIGluIG9yZGVyIHRvIGdldCBmYWtlIGZpZWxkIGJlaGF2aW9yICovCisJaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpeworCQl0aGlzLmhhc1JlcG9ydGVkRXJyb3IgPSB0cnVlOyAvLyBkbyBub3QgcmVwb3J0IGFueSBlcnJvcgorCX0KKwl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJWYXJpYWJsZSgpIHsKKwlpZGVudGlmaWVyUHRyLS07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCisJYm9vbGVhbiBpc0xvY2FsRGVjbGFyYXRpb24gPSBuZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gIT0gMDsKKwlpbnQgdmFyaWFibGVJbmRleCA9IHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV07CisJaW50IGV4dGVuZGVkRGltZW5zaW9uID0gaW50U3RhY2tbaW50UHRyICsgMV07CisJCisJaWYoaXNMb2NhbERlY2xhcmF0aW9uIHx8IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwIHx8IHZhcmlhYmxlSW5kZXggIT0gMCB8fCBleHRlbmRlZERpbWVuc2lvbiAhPSAwKSB7CisJCWlkZW50aWZpZXJQdHIrKzsKKwkJaWRlbnRpZmllckxlbmd0aFB0cisrOworCQlzdXBlci5jb25zdW1lRW50ZXJWYXJpYWJsZSgpOworCX0gZWxzZSB7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCQorCQkvLyByZWNvdmVyeQorCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9IChpbnQpKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdID4+PiAzMik7CisJCQlpbnRQdHItLTsKKwkJCQorCQkJVHlwZVJlZmVyZW5jZSB0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCQkJaW50UHRyLS07CisJCQkKKwkJCWlmICghKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSkKKwkJCQkmJiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZURPVAorCQkJCQl8fCAoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHR5cGUuc291cmNlU3RhcnQpCisJCQkJCQkJIT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKG5hbWVTb3VyY2VTdGFydCkpKSl7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBuYW1lU291cmNlU3RhcnQ7CisJCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCUZpZWxkRGVjbGFyYXRpb24gY29tcGxldGlvbkZpZWxkRGVjbCA9IG5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUodHlwZSwgZmFsc2UpOworCQkJY29tcGxldGlvbkZpZWxkRGVjbC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlhc3Npc3ROb2RlID0gY29tcGxldGlvbkZpZWxkRGVjbDsKKwkJCWxhc3RDaGVja1BvaW50ID0gdHlwZS5zb3VyY2VFbmQgKyAxOworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoY29tcGxldGlvbkZpZWxkRGVjbCwgMCk7CisJCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCkgeworCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsKKwkKKwkvLyBkb2VzIG5vdCBrZWVwIHRoZSBpbml0aWFsaXphdGlvbiBpZiBjb21wbGV0aW9uIGlzIG5vdCBpbnNpZGUKKwlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCWlmIChjdXJzb3JMb2NhdGlvbiArIDEgPCB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VTdGFydCB8fAorCQljdXJzb3JMb2NhdGlvbiA+IHZhcmlhYmxlLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCkgeworCQl2YXJpYWJsZS5pbml0aWFsaXphdGlvbiA9IG51bGw7CisJfQorfQorCisvKgorICogQ29weSBvZiBjb2RlIGZyb20gc3VwZXJjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgorICogSWYgdGhlIGN1cnNvciBsb2NhdGlvbiBpcyBvbiB0aGUgZmllbGQgYWNjZXNzLCB0aGVuIGNyZWF0ZSBhIAorICogQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzIGluc3RlYWQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGaWVsZEFjY2Vzcyhib29sZWFuIGlzU3VwZXJBY2Nlc3MpIHsKKwkvLyBGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInCisJLy8gRmllbGRBY2Nlc3MgOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJworCisJLy8gcG90ZW50aWFsIHJlY2VpdmVyIGlzIGJlaW5nIHBvcGVkLCBzbyByZXNldCBwb3RlbnRpYWwgcmVjZWl2ZXIKKwl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CisKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQlzdXBlci5jb25zdW1lRmllbGRBY2Nlc3MoaXNTdXBlckFjY2Vzcyk7CisJfSBlbHNlIHsKKwkJdGhpcy5wdXNoQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzT25FeHByZXNzaW9uU3RhY2soaXNTdXBlckFjY2Vzcyk7CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9ybWFsUGFyYW1ldGVyKCkgeworCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CisJCXN1cGVyLmNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKTsKKwl9IGVsc2UgeworCisJCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJY2hhcltdIG5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJCWxvbmcgbmFtZVBvc2l0aW9ucyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dICsgaW50U3RhY2tbaW50UHRyLS1dKTsKKwkJaW50UHRyIC09IDI7CisJCUFyZ3VtZW50IGFyZyA9IAorCQkJbmV3IENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSgKKwkJCQluYW1lLCAKKwkJCQluYW1lUG9zaXRpb25zLCAKKwkJCQl0eXBlLCAKKwkJCQlpbnRTdGFja1tpbnRQdHIgKyAxXSAmIH5BY2NEZXByZWNhdGVkKTsgLy8gbW9kaWZpZXJzCisJCXB1c2hPbkFzdFN0YWNrKGFyZyk7CisJCQorCQlhc3Npc3ROb2RlID0gYXJnOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gKGludCkgbmFtZVBvc2l0aW9uczsKKwkJaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisKKwkJLyogaWYgaW5jb21wbGV0ZSBtZXRob2QgaGVhZGVyLCBsaXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAorCQkJaW5kaWNhdGluZyB0aGF0IHNvbWUgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrICovCisJCWxpc3RMZW5ndGgrKzsKKwl9IAkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VUeXBlKCkgeworCXRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0ludGVyZmFjZSA9IHRydWU7CisJc3VwZXIuY29uc3VtZUludGVyZmFjZVR5cGUoKTsKKwl0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNJbnRlcmZhY2UgPSBmYWxzZTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCkgeworCWlmKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwkJaWRlbnRpZmllclB0ci0tOworCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJCWlmKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSAhPSAwKSB7CisJCQlpZGVudGlmaWVyUHRyKys7CisJCQlpZGVudGlmaWVyTGVuZ3RoUHRyKys7CisJCQlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyTmFtZSgpOworCQl9IGVsc2UgeworCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJCQorCQkJLy8gcmVjb3ZlcnkKKwkJCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7CisJCQkJLy9uYW1lCisJCQkJY2hhcltdIHNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHIgKyAxXTsKKwkJCQlsb25nIHNlbGVjdG9yU291cmNlID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ciArIDFdOworCQkJCQorCQkJCS8vdHlwZQorCQkJCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dKTsKKwkJCQkoKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpdHlwZSkuaXNDb21wbGV0aW9uTm9kZSA9IGZhbHNlOworCQkJCS8vbW9kaWZpZXJzCisJCQkJaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQkJaW50IG1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJCQkKKwkJCQlpZihzY2FubmVyLmdldExpbmVOdW1iZXIodHlwZS5zb3VyY2VTdGFydCkgIT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKChpbnQpIChzZWxlY3RvclNvdXJjZSA+Pj4gMzIpKSkgeworCQkJCQlGaWVsZERlY2xhcmF0aW9uIGNvbXBsZXRpb25GaWVsZERlY2wgPSBuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKHR5cGUsIGZhbHNlKTsKKwkJCQkJY29tcGxldGlvbkZpZWxkRGVjbC5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQkJCWFzc2lzdE5vZGUgPSBjb21wbGV0aW9uRmllbGREZWNsOworCQkJCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGUuc291cmNlRW5kICsgMTsKKwkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoY29tcGxldGlvbkZpZWxkRGVjbCwgMCk7CisJCQkJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJCQl9IGVsc2UgeworCQkJCQlDb21wbGV0aW9uT25NZXRob2RSZXR1cm5UeXBlIG1kID0gbmV3IENvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUodHlwZSwgdGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQkJCQltZC5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJCQltZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJbWQubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCQkJCQltZC5ib2R5U3RhcnQgPSBsUGFyZW5Qb3MrMTsKKwkJCQkJbGlzdExlbmd0aCA9IDA7IC8vIGluaXRpYWxpemUgbGlzdExlbmd0aCBiZWZvcmUgcmVhZGluZyBwYXJhbWV0ZXJzL3Rocm93cworCQkJCQlhc3Npc3ROb2RlID0gbWQ7CisJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKG1kLCAwKTsKKwkJCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8vIE1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlICdJZGVudGlmaWVyJyAnKCcKKwkJQ29tcGxldGlvbk9uTWV0aG9kTmFtZSBtZCA9IG5ldyBDb21wbGV0aW9uT25NZXRob2ROYW1lKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkKKwkJLy9uYW1lCisJCW1kLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCQlsb25nIHNlbGVjdG9yU291cmNlID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJLy90eXBlCisJCW1kLnJldHVyblR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSk7CisJCS8vbW9kaWZpZXJzCisJCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCW1kLm1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkKKwkJLy9oaWdobGlnaHQgc3RhcnRzIGF0IHNlbGVjdG9yIHN0YXJ0CisJCW1kLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNlbGVjdG9yU291cmNlID4+PiAzMik7CisJCW1kLnNlbGVjdG9yRW5kID0gKGludCkgc2VsZWN0b3JTb3VyY2U7CisJCXB1c2hPbkFzdFN0YWNrKG1kKTsKKwkJbWQuc291cmNlRW5kID0gbFBhcmVuUG9zOworCQltZC5ib2R5U3RhcnQgPSBsUGFyZW5Qb3MrMTsKKwkJbGlzdExlbmd0aCA9IDA7IC8vIGluaXRpYWxpemUgbGlzdExlbmd0aCBiZWZvcmUgcmVhZGluZyBwYXJhbWV0ZXJzL3Rocm93cworCQkKKwkJdGhpcy5hc3Npc3ROb2RlID0gbWQ7CQorCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWQuc291cmNlRW5kOworCQkvLyByZWNvdmVyeQorCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlIAorCQkJCS8vfHwgbWQubW9kaWZpZXJzICE9IDAKKwkJCQl8fCAoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKG1kLnJldHVyblR5cGUuc291cmNlU3RhcnQpCisJCQkJCQk9PSBzY2FubmVyLmdldExpbmVOdW1iZXIobWQuc291cmNlU3RhcnQpKSl7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQobWQsIDApOworCQkJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJCX0gZWxzZSB7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5zb3VyY2VTdGFydDsKKwkJCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOworCQkJfQorCQl9CisJfQorfQorCisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RCb2R5KCkgeworCXN1cGVyLmNvbnN1bWVNZXRob2RCb2R5KCk7CisJdGhpcy5sYWJlbENvdW50ZXJQdHItLTsKKwlpZiAodGhpcy5ibG9ja0ludm9jYXRpb25QdHIgPj0gMCkgdGhpcy5ibG9ja0ludm9jYXRpb25QdHItLTsKK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlcigpIHsKKwlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyKCk7CisJcHVzaEJsb2NrSW52b2NhdGlvblB0cigpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1vZGlmaWVycygpIHsKKwlzdXBlci5jb25zdW1lTW9kaWZpZXJzKCk7CisJLy8gc2F2ZSBmcm9tIHN0YWNrIHZhbHVlcworCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gaW50U3RhY2tbaW50UHRyXTsKKwl0aGlzLmxhc3RNb2RpZmllcnMgPSAJaW50U3RhY2tbaW50UHRyLTFdOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU5lc3RlZE1ldGhvZCgpIHsKKwlzdXBlci5jb25zdW1lTmVzdGVkTWV0aG9kKCk7CisJdGhpcy5wdXNoTmV3TGFiZWxDb3VudGVyKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudExhYmVsKCk7CisJaWYgKHRoaXMubGFiZWxDb3VudGVyUHRyID49IDApIHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVG9rZW4oaW50IHRva2VuKSB7CisJaW50IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1Rva2VuOworCWludCBwcmV2aW91c0lkZW50aWZpZXJQdHIgPSB0aGlzLnByZXZpb3VzSWRlbnRpZmllclB0cjsKKwlzdXBlci5jb25zdW1lVG9rZW4odG9rZW4pOworCisJLy8gaWYgaW4gZmllbGQgaW5pdGlhbGl6ZXIgKGRpcmVjdGx5IG9yIG5vdCksIG9uIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgYW5kIG5vdCBpbiByZWNvdmVyeSBtb2RlIHlldAorCS8vIHRoZW4gcG9zaXRpb24gZW5kIG9mIGZpbGUgYXQgY3Vyc29yIGxvY2F0aW9uIChzbyB0aGF0IHdlIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKwkvLyBpbiBtZXRob2QgYm9kaWVzKQorCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCisJCQkmJiB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdID09IGFzc2lzdElkZW50aWZpZXIoKQorCQkJJiYgdGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsCisJCQkmJiB0aGlzLmluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkgeworCQl0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPSBjdXJzb3JMb2NhdGlvbiA8IEludGVnZXIuTUFYX1ZBTFVFID8gY3Vyc29yTG9jYXRpb24rMSA6IGN1cnNvckxvY2F0aW9uOworCX0KKwkKKwkvLyBpZiBpbiBhIG1ldGhvZCBvciBpZiBpbiBhIGZpZWxkIGluaXRpYWxpemVyIAorCWlmICh0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gfHwgdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0pIHsKKwkJc3dpdGNoICh0b2tlbikgeworCQkJY2FzZSBUb2tlbk5hbWVET1Q6CisJCQkJc3dpdGNoIChwcmV2aW91cykgeworCQkJCQljYXNlIFRva2VuTmFtZXRoaXM6IC8vIGVnLiB0aGlzWy5dZnJlZCgpCisJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gRVhQTElDSVRfUkVDRUlWRVI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZWcuIHN1cGVyWy5dZnJlZCgpCisJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gU1VQRVJfUkVDRUlWRVI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyOiAvLyBlZy4gYmFyWy5dZnJlZCgpCisJCQkJCQlpZiAoIXRoaXMuYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQpIHsgLy8gZWcuIG5vdCBuZXcgei55Wy5dWCgpCisJCQkJCQkJaWYgKHRoaXMuaWRlbnRpZmllclB0ciAhPSBwcmV2aW91c0lkZW50aWZpZXJQdHIpIHsgLy8gaWYgaWRlbnRpZmllciBoYXMgYmVlbiBjb25zdW1lZCwgZWcuIHRoaXMueFsuXWZyZWQoKQorCQkJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gRVhQTElDSVRfUkVDRUlWRVI7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IE5BTUVfUkVDRUlWRVI7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyOgorCQkJCWlmIChwcmV2aW91cyA9PSBUb2tlbk5hbWVET1QpIHsgLy8gZWcuIGZvbygpLltmcmVkXSgpCisJCQkJCS8vIGlmIGN1cnJlbnQgaWRlbnRpZmllciBpcyB0aGUgZW1wdHkgY29tcGxldGlvbiBvbmUKKwkJCQkJaWYgKGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSA9PSBDb21wbGV0aW9uU2Nhbm5lci5FbXB0eUNvbXBsZXRpb25JZGVudGlmaWVyKXsKKwkJCQkJCXRoaXMuY29tcGxldGlvbkJlaGluZERvdCA9IHRydWU7CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuaW52b2NhdGlvblR5cGUgIT0gU1VQRVJfUkVDRUlWRVIgLy8gZWcuIG5vdCBzdXBlci5bZnJlZF0oKQorCQkJCQkJJiYgdGhpcy5pbnZvY2F0aW9uVHlwZSAhPSBOQU1FX1JFQ0VJVkVSIC8vIGVnLiBub3QgYmFyLltmcmVkXSgpCisJCQkJCQkmJiB0aGlzLmludm9jYXRpb25UeXBlICE9IEFMTE9DQVRJT04gLy8gZWcuIG5vdCBuZXcgZm9vLltCYXJdKCkKKwkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsgLy8gZWcuIG5vdCBmcmVkKCkubmV3IGZvby5bQmFyXSgpCisKKwkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBFWFBMSUNJVF9SRUNFSVZFUjsKKwkJCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOwkKKwkJCWNhc2UgVG9rZW5OYW1lbmV3OgorCQkJCXRoaXMuYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQgPSB0cnVlOworCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOyAvLyBOQjogZXZlbiBpZiB0aGVyZSBpcyBubyBxdWFsaWZpY2F0aW9uLCBzZXQgaXQgdG8gdGhlIGV4cHJlc3Npb24gcHRyIHNvIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlIGNvcnJlY3RseSBjb21wdXRlZAorCQkJCWlmIChwcmV2aW91cyA9PSBUb2tlbk5hbWVET1QpIHsgLy8gZWcuIGZyZWQoKS5bbmV3XSBYKCkKKwkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IFFVQUxJRklFRF9BTExPQ0FUSU9OOworCQkJCX0gZWxzZSB7IC8vIGVnLiBbbmV3XSBYKCkKKwkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IEFMTE9DQVRJT047CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWV0aGlzOgorCQkJCWlmIChwcmV2aW91cyA9PSBUb2tlbk5hbWVET1QpIHsgLy8gZWcuIGZyZWQoKS5bdGhpc10oKQorCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gUVVBTElGSUVEX0FMTE9DQVRJT047CisJCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lc3VwZXI6CisJCQkJaWYgKHByZXZpb3VzID09IFRva2VuTmFtZURPVCkgeyAvLyBlZy4gZnJlZCgpLltzdXBlcl0oKQorCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gUVVBTElGSUVEX0FMTE9DQVRJT047CisJCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lY2F0Y2g6CisJCQkJdGhpcy5iZXR3ZWVuQ2F0Y2hBbmRSaWdodFBhcmVuID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTFBBUkVOOgorCQkJCXRoaXMuYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQgPSBmYWxzZTsKKwkJCQl0aGlzLmJyYWNrZXREZXB0aCsrOworCQkJCWlmICh0aGlzLmludm9jYXRpb25UeXBlID09IE5PX1JFQ0VJVkVSIHx8IHRoaXMuaW52b2NhdGlvblR5cGUgPT0gTkFNRV9SRUNFSVZFUikgeworCQkJCQl0aGlzLnF1YWxpZmllciA9IHRoaXMuZXhwcmVzc2lvblB0cjsgLy8gcmVtZW5iZXIgdGhlIGxhc3QgZXhwcmVzc2lvbiBzbyB0aGF0IGFyZ3VtZW50cyBhcmUgY29ycmVjdGx5IGNvbXB1dGVkCisJCQkJfQorCQkJCXN3aXRjaCAocHJldmlvdXMpIHsKKwkJCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyOiAvLyBlZy4gZnJlZFsoXSkgb3IgZm9vLmZyZWRbKF0pCisJCQkJCQl0aGlzLnB1c2hPbkludm9jYXRpb25TdGFja3ModGhpcy5pbnZvY2F0aW9uVHlwZSwgdGhpcy5xdWFsaWZpZXIpOworCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IE5PX1JFQ0VJVkVSOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1ldGhpczogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHRoaXNbKF0xLCAyKQorCQkJCQkJdGhpcy5wdXNoT25JbnZvY2F0aW9uU3RhY2tzKAorCQkJCQkJCSh0aGlzLmludm9jYXRpb25UeXBlID09IFFVQUxJRklFRF9BTExPQ0FUSU9OKSA/IFFVQUxJRklFRF9BTExPQ0FUSU9OIDogQUxMT0NBVElPTiwgCisJCQkJCQkJdGhpcy5xdWFsaWZpZXIpOworCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IE5PX1JFQ0VJVkVSOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lc3VwZXI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiBzdXBlclsoXTEsIDIpCisJCQkJCQl0aGlzLnB1c2hPbkludm9jYXRpb25TdGFja3MoCisJCQkJCQkJKHRoaXMuaW52b2NhdGlvblR5cGUgPT0gUVVBTElGSUVEX0FMTE9DQVRJT04pID8gUVVBTElGSUVEX0FMTE9DQVRJT04gOiBBTExPQ0FUSU9OLCAKKwkJCQkJCQl0aGlzLnF1YWxpZmllcik7CisJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZUxCUkFDRToKKwkJCQl0aGlzLmJldHdlZW5OZXdBbmRMZWZ0QnJha2V0ID0gZmFsc2U7CisJCQkJdGhpcy5icmFja2V0RGVwdGgrKzsKKwkJCQl0aGlzLnB1c2hCbG9ja0ludm9jYXRpb25QdHIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJdGhpcy5iZXR3ZWVuTmV3QW5kTGVmdEJyYWtldCA9IGZhbHNlOworCQkJCXRoaXMuYnJhY2tldERlcHRoKys7CisJCQkJYnJlYWs7IAorCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0U6CisJCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKKwkJCQlpZiAodGhpcy5ibG9ja0ludm9jYXRpb25QdHIgPj0gMCkgdGhpcy5ibG9ja0ludm9jYXRpb25QdHItLTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lUkJSQUNLRVQ6CisJCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKKwkJCQlicmVhazsgCisJCQljYXNlIFRva2VuTmFtZVJQQVJFTjoKKwkJCQl0aGlzLmJldHdlZW5DYXRjaEFuZFJpZ2h0UGFyZW4gPSBmYWxzZTsKKwkJCQl0aGlzLmJyYWNrZXREZXB0aC0tOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVDT0xPTjoKKwkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lSWRlbnRpZmllcikgeworCQkJCQlpZiAodGhpcy5sYWJlbENvdW50ZXJQdHIgPj0gMCkgdGhpcy5sYWJlbENvdW50ZXJTdGFja1t0aGlzLmxhYmVsQ291bnRlclB0cl0rKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZXRocm93OgorCQkJCXRoaXMudGhyb3dCcmFja2V0RGVwdGg9IGJyYWNrZXREZXB0aDsKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKy8qKgorICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFzdCBub2RlIGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIG5vZGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBjb250YWluc0NvbXBsZXRpb25Ob2RlKEFzdE5vZGUgYXN0KSB7CisJaWYgKHRoaXMuYXNzaXN0Tm9kZSA9PSBudWxsIHx8IGFzdCBpbnN0YW5jZW9mIExpdGVyYWwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodGhpcy5hc3Npc3ROb2RlID09IGFzdCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGFzdCBpbnN0YW5jZW9mIFJlZmVyZW5jZSB8fCBhc3QgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CisJCXJldHVybiBhc3QgPT0gdGhpcy5hc3Npc3ROb2RlOworCX0KKwlpZiAoYXN0IGluc3RhbmNlb2YgQXNzaWdubWVudCkgeworCQlBc3NpZ25tZW50IGFzc2lnbiA9IChBc3NpZ25tZW50KWFzdDsKKwkJcmV0dXJuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoYXNzaWduLmxocykgfHwgY29udGFpbnNDb21wbGV0aW9uTm9kZShhc3NpZ24uZXhwcmVzc2lvbik7CisJfQorCWlmIChhc3QgaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsKKwkJVW5hcnlFeHByZXNzaW9uIHVuYXJ5ID0gKFVuYXJ5RXhwcmVzc2lvbilhc3Q7CisJCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKHVuYXJ5LmV4cHJlc3Npb24pOworCX0KKwlpZiAoYXN0IGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworCQlCaW5hcnlFeHByZXNzaW9uIGJpbmFyeSA9IChCaW5hcnlFeHByZXNzaW9uKWFzdDsKKwkJcmV0dXJuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoYmluYXJ5LmxlZnQpIHx8IGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoYmluYXJ5LnJpZ2h0KTsKKwl9CisJaWYgKGFzdCBpbnN0YW5jZW9mIEluc3RhbmNlT2ZFeHByZXNzaW9uKSB7CisJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByID0gKEluc3RhbmNlT2ZFeHByZXNzaW9uKWFzdDsKKwkJcmV0dXJuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoaW5zdGFuY2VPZkV4cHIuZXhwcmVzc2lvbikgfHwgY29udGFpbnNDb21wbGV0aW9uTm9kZShpbnN0YW5jZU9mRXhwci50eXBlKTsKKwl9CisJaWYgKGFzdCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcmVzc2lvbikgeworCQlDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWwgPSAoQ29uZGl0aW9uYWxFeHByZXNzaW9uKWFzdDsKKwkJcmV0dXJuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoY29uZGl0aW9uYWwuY29uZGl0aW9uKSB8fCBjb250YWluc0NvbXBsZXRpb25Ob2RlKGNvbmRpdGlvbmFsLnZhbHVlSWZUcnVlKSB8fCBjb250YWluc0NvbXBsZXRpb25Ob2RlKGNvbmRpdGlvbmFsLnZhbHVlSWZGYWxzZSk7CisJfQorCWlmIChhc3QgaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgeworCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbilhc3Q7CisJCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGFsbG9jLnR5cGUpOworCX0KKwlpZiAoYXN0IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKKwkJQ2FzdEV4cHJlc3Npb24gY2FzdCA9IChDYXN0RXhwcmVzc2lvbilhc3Q7CisJCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGNhc3QuZXhwcmVzc2lvbikgfHwgY29udGFpbnNDb21wbGV0aW9uTm9kZShjYXN0LnR5cGUpOworCX0KKwlpZiAoYXN0IGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKKwkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCA9IChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbClhc3Q7CisJCUV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBjYWxsLmFyZ3VtZW50czsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChjb250YWluc0NvbXBsZXRpb25Ob2RlKGFyZ3VtZW50c1tpXSkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBJbXBvcnRSZWZlcmVuY2UgY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucywgbG9uZ1tdIHBvc2l0aW9ucyl7CisJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOworfQorcHVibGljIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVBc3Npc3RQYWNrYWdlUmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucywgbG9uZ1tdIHBvc2l0aW9ucyl7CisJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKK30KK3B1YmxpYyBOYW1lUmVmZXJlbmNlIGNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIG5hbWUsIGxvbmdbXSBwb3NpdGlvbnMpeworCXJldHVybiBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSgKKwkJCQkJcHJldmlvdXNJZGVudGlmaWVycywgCisJCQkJCW5hbWUsIAorCQkJCQlwb3NpdGlvbnMpOyAJCit9CitwdWJsaWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVRdWFsaWZpZWRBc3Npc3RUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBuYW1lLCBsb25nW10gcG9zaXRpb25zKXsKKwlyZXR1cm4gdGhpcy5iZXR3ZWVuQ2F0Y2hBbmRSaWdodFBhcmVuIHx8IHRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbiAvLyBjaGVjayBmb3IgZXhjZXB0aW9uIHNjZW5hcmlvIAorCQkJCT8gbmV3IENvbXBsZXRpb25PblF1YWxpZmllZEV4Y2VwdGlvblJlZmVyZW5jZSgKKwkJCQkJcHJldmlvdXNJZGVudGlmaWVycywgIAorCQkJCQluYW1lLCAKKwkJCQkJcG9zaXRpb25zKQorCQkJCTogdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzSW50ZXJmYWNlCisJCQkJCT8gbmV3IENvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZSgKKwkJCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsIAorCQkJCQkJbmFtZSwgCisJCQkJCQlwb3NpdGlvbnMpCisJCQkJCTogdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzQ2xhc3MKKwkJCQkJCT8gbmV3IENvbXBsZXRpb25PblF1YWxpZmllZENsYXNzUmVmZXJlbmNlKAorCQkJCQkJCXByZXZpb3VzSWRlbnRpZmllcnMsIAorCQkJCQkJCW5hbWUsIAorCQkJCQkJCXBvc2l0aW9ucykKKwkJCQkJCTogbmV3IENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UoCisJCQkJCQkJcHJldmlvdXNJZGVudGlmaWVycywgCisJCQkJCQkJbmFtZSwgCisJCQkJCQkJcG9zaXRpb25zKTsgCQorfQorcHVibGljIE5hbWVSZWZlcmVuY2UgY3JlYXRlU2luZ2xlQXNzaXN0TmFtZVJlZmVyZW5jZShjaGFyW10gbmFtZSwgbG9uZyBwb3NpdGlvbikgeworCXJldHVybiBuZXcgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbik7Cit9CitwdWJsaWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBsb25nIHBvc2l0aW9uKSB7CisJcmV0dXJuIHRoaXMuYmV0d2VlbkNhdGNoQW5kUmlnaHRQYXJlbiB8fCB0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNFeGNlcHRpb24gLy8gY2hlY2sgZm9yIGV4Y2VwdGlvbiBzY2VuYXJpbyAKKwkJPyBuZXcgQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlKG5hbWUsIHBvc2l0aW9uKSAKKwkJOiB0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNJbnRlcmZhY2UKKwkJCT8gbmV3IENvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbikgCisJCQk6IHRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0NsYXNzCisJCQkJPyBuZXcgQ29tcGxldGlvbk9uQ2xhc3NSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pIAorCQkJCTogbmV3IENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pOworfQorcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGRpZXRQYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBpbnQgY3Vyc29yTG9jYXRpb24pIHsKKworCXRoaXMuY3Vyc29yTG9jYXRpb24gPSBjdXJzb3JMb2NhdGlvbjsKKwlDb21wbGV0aW9uU2Nhbm5lciBjb21wbGV0aW9uU2Nhbm5lciA9IChDb21wbGV0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CisJY29tcGxldGlvblNjYW5uZXIuY29tcGxldGlvbklkZW50aWZpZXIgPSBudWxsOworCWNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gY3Vyc29yTG9jYXRpb247CisJcmV0dXJuIHRoaXMuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKK30KKy8qCisgKiBGbHVzaCBwYXJzZXIvc2Nhbm5lciBzdGF0ZSByZWdhcmRpbmcgdG8gY29kZSBhc3Npc3QKKyAqLworcHVibGljIHZvaWQgZmx1c2hBc3Npc3RTdGF0ZSgpIHsKKworCXN1cGVyLmZsdXNoQXNzaXN0U3RhdGUoKTsKKwl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsKKwlDb21wbGV0aW9uU2Nhbm5lciBjb21wbGV0aW9uU2Nhbm5lciA9IChDb21wbGV0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CisJY29tcGxldGlvblNjYW5uZXIuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0ID0gMDsKKwljb21wbGV0aW9uU2Nhbm5lci5jb21wbGV0ZWRJZGVudGlmaWVyRW5kID0gLTE7Cit9Citwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpIHsKKwlpZiAodGhpcy5pZGVudGlmaWVyTGVuZ3RoU3RhY2tbdGhpcy5pZGVudGlmaWVyTGVuZ3RoUHRyXSA+IDEpIHsgLy8gcmVkdWNpbmcgYSBxdWFsaWZpZWQgbmFtZQorCQkvLyBwb3RlbnRpYWwgcmVjZWl2ZXIgaXMgYmVpbmcgcG9wZWQsIHNvIHJlc2V0IHBvdGVudGlhbCByZWNlaXZlcgorCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CisJfQorCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOworfQorLyoqCisgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYXN0IG5vZGUgaGFzIGluZm9ybWF0aW9uIGludGVycmVzdGluZyBmb3IgY29kZSBjb21wbGV0aW9uLgorICovCitwcml2YXRlIGJvb2xlYW4gaGFzQ29tcGxldGlvbkluZm9ybWF0aW9uKEFzdE5vZGUgYXN0KSB7CisJcmV0dXJuICgKKwkJYXN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB8fAorCQlhc3QgaW5zdGFuY2VvZiBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gfHwKKwkJYXN0IGluc3RhbmNlb2YgTGFiZWxlZFN0YXRlbWVudCB8fAorCQlhc3QgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOworfQorcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwlzdXBlci5pbml0aWFsaXplKCk7CisJdGhpcy5pbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CisJdGhpcy5sYWJlbENvdW50ZXJQdHIgPSAtMTsKK30KKy8qCisgKiBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciB0aGF0IGlzIGFib3V0IHRvIGdvIGZvciBCbG9ja1N0YXRlbWVudHMuCisgKi8KK3ByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCkgeworCXRoaXMucHJldmlvdXNUb2tlbiA9IC0xOworCXRoaXMucHJldmlvdXNJZGVudGlmaWVyUHRyID0gLTE7CisJdGhpcy5jb21wbGV0aW9uQmVoaW5kRG90ID0gZmFsc2U7CisJdGhpcy5iZXR3ZWVuTmV3QW5kTGVmdEJyYWtldCA9IGZhbHNlOworCXRoaXMuYmV0d2VlbkNhdGNoQW5kUmlnaHRQYXJlbiA9IGZhbHNlOworCXRoaXMuYnJhY2tldERlcHRoID0gMDsKKwl0aGlzLnRocm93QnJhY2tldERlcHRoID0gLTE7CisJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IE5PX1JFQ0VJVkVSOworCXRoaXMucXVhbGlmaWVyID0gLTE7CisJdGhpcy5ibG9ja0ludm9jYXRpb25QdHIgPSAtMTsKK30KK3B1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7CisJdGhpcy5zY2FubmVyID0gbmV3IENvbXBsZXRpb25TY2FubmVyKHRoaXMuYXNzZXJ0TW9kZSk7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgY29tcGxldGlvbiBpcyBqdXN0IGFmdGVyIGFuIGFycmF5IHR5cGUKKyAqIGVnLiBTdHJpbmdbXS5bY3Vyc29yXQorICovCitwcml2YXRlIGJvb2xlYW4gaXNBZnRlckFycmF5VHlwZSgpIHsKKwkvLyBUQkQ6IFRoZSBmb2xsb3dpbmcgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYXJyYXkgZGltZW5zaW9ucyBhcmUgc21hbGw6IGl0IHNheXMgdGhhdCBpZiB0aGUKKwkvLyAgICAgIHRvcCBvZiB0aGUgaW50U3RhY2sgaXMgbGVzcyB0aGFuIDExLCB0aGVuIGl0IG11c3QgYmUgYSBkaW1lbnNpb24gCisJLy8gICAgICAoc21hbGxlc3QgcG9zaXRpb24gb2YgYXJyYXkgdHlwZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgMTEgYXMgaW4gImNsYXNzIFh7WVtdIikKKwlpZiAoKHRoaXMuaW50UHRyID4gLTEpICYmICh0aGlzLmludFN0YWNrW3RoaXMuaW50UHRyXSA8IDExKSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlOYW1lQ29tcGxldGlvbigpIHsKKwlyZXR1cm4KKwkJdGhpcy5hc3Npc3ROb2RlICE9IG51bGwgJiYgCisJCXRoaXMuYXNzaXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgJiYKKwkJKCgoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSl0aGlzLmFzc2lzdE5vZGUpLnRva2VuLmxlbmd0aCA9PSAwKTsKK30KK3B1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBpbnQgY3Vyc29yTG9jYXRpb24pIHsKKworCXRoaXMuY3Vyc29yTG9jYXRpb24gPSBjdXJzb3JMb2NhdGlvbjsKKwlDb21wbGV0aW9uU2Nhbm5lciBjb21wbGV0aW9uU2Nhbm5lciA9IChDb21wbGV0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CisJY29tcGxldGlvblNjYW5uZXIuY29tcGxldGlvbklkZW50aWZpZXIgPSBudWxsOworCWNvbXBsZXRpb25TY2FubmVyLmN1cnNvckxvY2F0aW9uID0gY3Vyc29yTG9jYXRpb247CisJcmV0dXJuIHRoaXMucGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQpOworfQorLyoKKyAqIFByZXBhcmVzIHRoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHRvIGdvIGZvciBCbG9ja1N0YXRlbWVudHMuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByZXBhcmVGb3JCbG9ja1N0YXRlbWVudHMoKSB7CisJc3VwZXIucHJlcGFyZUZvckJsb2NrU3RhdGVtZW50cygpOworCXRoaXMuaW5pdGlhbGl6ZUZvckJsb2NrU3RhdGVtZW50cygpOworfQorcHJvdGVjdGVkIHZvaWQgcHVzaEJsb2NrSW52b2NhdGlvblB0cigpIHsKKwl0cnkgeworCQl0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrWysrdGhpcy5ibG9ja0ludm9jYXRpb25QdHJdID0gdGhpcy5pbnZvY2F0aW9uUHRyKzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuYmxvY2tJbnZvY2F0aW9uU3RhY2subGVuZ3RoOworCQlpbnRbXSBvbGRTdGFjayA9IHRoaXMuYmxvY2tJbnZvY2F0aW9uU3RhY2s7CisJCXRoaXMuYmxvY2tJbnZvY2F0aW9uU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCXRoaXMuYmxvY2tJbnZvY2F0aW9uU3RhY2tbdGhpcy5ibG9ja0ludm9jYXRpb25QdHJdID0gdGhpcy5pbnZvY2F0aW9uUHRyKzE7CisJfQorfQorLyoqCisgKiBDcmVhdGVzIGEgY29tcGxldGlvbiBvbiBtZW1iZXIgYWNjZXNzIG5vZGUgYW5kIHB1c2ggaXQKKyAqIG9uIHRoZSBleHByZXNzaW9uIHN0YWNrLgorICovCitwcml2YXRlIHZvaWQgcHVzaENvbXBsZXRpb25Pbk1lbWJlckFjY2Vzc09uRXhwcmVzc2lvblN0YWNrKGJvb2xlYW4gaXNTdXBlckFjY2VzcykgeworCWNoYXJbXSBzb3VyY2UgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJbG9uZyBwb3MgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCUNvbXBsZXRpb25Pbk1lbWJlckFjY2VzcyBmciA9IG5ldyBDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3Moc291cmNlLCBwb3MpOworCXRoaXMuYXNzaXN0Tm9kZSA9IGZyOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSBmci5zb3VyY2VFbmQgKyAxOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlpZiAoaXNTdXBlckFjY2VzcykgeyAvL2NvbnNpZGVyYXRlcyB0aGUgZmllbGRSZWZlcmVuY2UgYmVnaW5uaW5nIGF0IHRoZSAnc3VwZXInIC4uLi4JCisJCWZyLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQlmci5yZWNlaXZlciA9IG5ldyBTdXBlclJlZmVyZW5jZShmci5zb3VyY2VTdGFydCwgZW5kUG9zaXRpb24pOworCQlwdXNoT25FeHByZXNzaW9uU3RhY2soZnIpOworCX0gZWxzZSB7IC8vb3B0aW1pemUgcHVzaC9wb3AKKwkJaWYgKChmci5yZWNlaXZlciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSkuaXNUaGlzKCkpIHsgLy9maWVsZHJlZmVyZW5jZSBiZWdpbnMgYXQgdGhlIHRoaXMKKwkJCWZyLnNvdXJjZVN0YXJ0ID0gZnIucmVjZWl2ZXIuc291cmNlU3RhcnQ7CisJCX0KKwkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gZnI7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgcHVzaE5ld0xhYmVsQ291bnRlcigpIHsKKwl0cnkgeworCQl0aGlzLmxhYmVsQ291bnRlclN0YWNrWysrdGhpcy5sYWJlbENvdW50ZXJQdHJdID0gMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5sYWJlbENvdW50ZXJTdGFjay5sZW5ndGg7CisJCWludFtdIG9sZFN0YWNrID0gdGhpcy5sYWJlbENvdW50ZXJTdGFjazsKKwkJdGhpcy5sYWJlbENvdW50ZXJTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkU3RhY2ssIDAsIHRoaXMubGFiZWxDb3VudGVyU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5sYWJlbENvdW50ZXJTdGFja1t0aGlzLmxhYmVsQ291bnRlclB0cl0gPSAwOworCX0KK30KKy8qKgorICogUHVzaGVzIHRoZSBnaXZlbiBpbnZvY2F0aW9uIHR5cGUgKG9uZSBvZiB0aGUgaW52b2NhdGlvbiB0eXBlIGNvbnN0YW50cykgb24gdGhlIGludm9jYXRpb24gdHlwZSBzdGFjaywKKyAqIGFuZCB0aGUgZ2l2ZW4gcXVhbGlmaWVyIChhbiBleHByZXNzaW9uIHBvaW50ZXIgdG8gdGhlIGV4cHJlc3Npb24gc3RhY2spIG9uIHRoZSBxdWFsaWZpZXIgc3RhY2suCisgKi8KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkludm9jYXRpb25TdGFja3MoaW50IGludm9jYXRpb25UeXBlLCBpbnQgcXVhbGlmaWVyRXhwclB0cikgeworCS8vIE5COiBpbnZvY2F0aW9uUHRyIGhhcyBhbHJlYWR5IGJlZW4gaW5jcmVtZW50ZWQgYnkgYSBjYWxsIHRvIHB1c2hPblNlbGVjdG9yU3RhY2soKQorCXRyeSB7CisJCXRoaXMuaW52b2NhdGlvblR5cGVTdGFja1t0aGlzLmludm9jYXRpb25QdHJdID0gaW52b2NhdGlvblR5cGU7CisJCXRoaXMucXVhbGlmaWVyU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXSA9IHF1YWxpZmllckV4cHJQdHI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuaW52b2NhdGlvblR5cGVTdGFjay5sZW5ndGg7CisJCWludCBvbGRJbnZvY2F0aW9uVHlwZVN0YWNrW10gPSB0aGlzLmludm9jYXRpb25UeXBlU3RhY2s7CisJCWludCBvbGRRdWFsaWZpZXJTdGFja1tdID0gdGhpcy5xdWFsaWZpZXJTdGFjazsKKwkJdGhpcy5pbnZvY2F0aW9uVHlwZVN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKKwkJdGhpcy5xdWFsaWZpZXJTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkSW52b2NhdGlvblR5cGVTdGFjaywgMCwgdGhpcy5pbnZvY2F0aW9uVHlwZVN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkob2xkUXVhbGlmaWVyU3RhY2ssIDAsIHRoaXMucXVhbGlmaWVyU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5pbnZvY2F0aW9uVHlwZVN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl0gPSBpbnZvY2F0aW9uVHlwZTsKKwkJdGhpcy5xdWFsaWZpZXJTdGFja1t0aGlzLmludm9jYXRpb25QdHJdID0gcXVhbGlmaWVyRXhwclB0cjsKKwl9Cit9CitwdWJsaWMgdm9pZCByZWNvcmRDb21wbGV0aW9uT25SZWZlcmVuY2UoKXsKKworCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKworCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCisJCWlmICghcmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgcmV0dXJuOworCQkKKwkJLyogZ2VuZXJhdGUgYSBwc2V1ZG8gZmllbGQgd2l0aCBhIGNvbXBsZXRpb24gb24gdHlwZSByZWZlcmVuY2UgKi8JCisJCWN1cnJlbnRFbGVtZW50LmFkZCgKKwkJCW5ldyBDb21wbGV0aW9uT25GaWVsZFR5cGUodGhpcy5nZXRUeXBlUmVmZXJlbmNlKDApLCBmYWxzZSksIDApOworCQlyZXR1cm47CisJfQorCWlmICghZGlldCkgcmV0dXJuOyAvLyBvbmx5IHJlY29yZCByZWZlcmVuY2VzIGF0dGFjaGVkIHRvIHR5cGVzCisKK30KK3Byb3RlY3RlZCB2b2lkIHJlcG9ydFN5bnRheEVycm9yKGludCBhY3QsIGludCBjdXJyZW50S2luZCwgaW50IHN0YXRlU3RhY2tUb3ApIHsKKworCS8qIEludGVyY2VwdCBlcnJvciBzdGF0ZSBvbiBFT0YgaW5zaWRlIG1ldGhvZCBib2RpZXMsIGR1ZSB0byAKKwkgICBjdXJzb3IgbG9jYXRpb24gYmVpbmcgdXNlZCBhcyBhbiBFT0YgcG9zaXRpb24uCisJKi8KKwlpZiAoIWRpZXQgJiYgY3VycmVudFRva2VuID09IFRva2VuTmFtZUVPRikgcmV0dXJuOworCXN1cGVyLnJlcG9ydFN5bnRheEVycm9yKGFjdCwgY3VycmVudEtpbmQsIHN0YXRlU3RhY2tUb3ApOworfQorLyoKKyAqIFJlc2V0IGludGVybmFsIHN0YXRlIGFmdGVyIGNvbXBsZXRpb24gaXMgb3ZlcgorICovCisgCitwdWJsaWMgdm9pZCByZXNldCgpIHsKKwlzdXBlci5yZXNldCgpOworCXRoaXMuY3Vyc29yTG9jYXRpb24gPSAwOworfQorLyoKKyAqIFJlc2V0IGludGVybmFsIHN0YXRlIGFmdGVyIGNvbXBsZXRpb24gaXMgb3ZlcgorICovCisgCitwdWJsaWMgdm9pZCByZXNldEFmdGVyQ29tcGxldGlvbigpIHsKKwl0aGlzLmN1cnNvckxvY2F0aW9uID0gMDsKKwl0aGlzLmZsdXNoQXNzaXN0U3RhdGUoKTsKK30KKy8qCisgKiBSZXNldCBjb250ZXh0IHNvIGFzIHRvIHJlc3VtZSB0byByZWd1bGFyIHBhcnNlIGxvb3AKKyAqIElmIHVuYWJsZSB0byByZXNldCBmb3IgcmVzdW1pbmcsIGFuc3dlcnMgZmFsc2UuCisgKgorICogTW92ZSBjaGVja3BvaW50IGxvY2F0aW9uLCByZXNldCBpbnRlcm5hbCBzdGFja3MgYW5kCisgKiBkZWNpZGUgd2hpY2ggZ3JhbW1hciBnb2FsIGlzIGFjdGl2YXRlZC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lQWZ0ZXJSZWNvdmVyeSgpIHsKKwlpZiAodGhpcy5hc3Npc3ROb2RlICE9IG51bGwpIHsKKwkJLyogaWYgcmVhY2hlZCBbZW9mXSBpbnNpZGUgbWV0aG9kIGJvZHksIGJ1dCBzdGlsbCBpbnNpZGUgbmVzdGVkIHR5cGUsCisJCQlvciBpbnNpZGUgYSBmaWVsZCBpbml0aWFsaXplciwgc2hvdWxkIGNvbnRpbnVlIGluIGRpZXQgbW9kZSB1bnRpbCAKKwkJCXRoZSBlbmQgb2YgdGhlIG1ldGhvZCBib2R5IG9yIGNvbXBpbGF0aW9uIHVuaXQgKi8KKwkJaWYgKChzY2FubmVyLmVvZlBvc2l0aW9uID09IGN1cnNvckxvY2F0aW9uKzEpCisJCQkmJiAoIShyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pIAorCQkJCXx8IGluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkpIHsKKworCQkJLyoJZGlzYWJsZWQgc2luY2UgZG9lcyBub3QgaGFuZGxlIHBvc3NpYmxlIGZpZWxkL21lc3NhZ2UgcmVmcywgaS5lLiBPYmpbQVNTSVNUIEhFUkVdZWN0LnJlZ2lzdGVyTmF0aXZlcygpCQkgICAgCisJCQkvLyBjb25zdW1lIGV4dHJhIHRva2VucyB3aGljaCB3ZXJlIHBhcnQgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UKKwkJCS8vICAgc28gdGhhdCB0aGUgcmVwbGFjZWQgc291cmNlIGNvbXByaXNlcyB0aGVtIGFzIHdlbGwgCisJCQlpZiAodGhpcy5hc3Npc3ROb2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSl7CisJCQkJaW50IG9sZEVvZiA9IHNjYW5uZXIuZW9mUG9zaXRpb247CisJCQkJc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IGN1cnJlbnRFbGVtZW50LnRvcEVsZW1lbnQoKS5zb3VyY2VFbmQoKSsxOworCQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy5jdXJzb3JMb2NhdGlvbisxOworCQkJCWludCB0b2tlbiA9IC0xOworCQkJCXRyeSB7CisJCQkJCWRvIHsKKwkJCQkJCS8vIGZpcnN0IHRva2VuIG1pZ2h0IG5vdCBoYXZlIHRvIGJlIGEgZG90CisJCQkJCQlpZiAodG9rZW4gPj0gMCB8fCAhdGhpcy5jb21wbGV0aW9uQmVoaW5kRG90KXsKKwkJCQkJCQlpZiAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVG9rZW5OYW1lRE9UKSBicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUb2tlbk5hbWVJZGVudGlmaWVyKSBicmVhazsKKwkJCQkJCXRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJCQkJCX0gd2hpbGUgKHRva2VuICE9IFRva2VuTmFtZUVPRik7CisJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpeworCQkJCX0gZmluYWxseSB7CisJCQkJCXNjYW5uZXIuZW9mUG9zaXRpb24gPSBvbGRFb2Y7CisJCQkJfQorCQkJfQorCQkJKi8JCQkKKwkJCS8qIHJlc3RhcnQgaW4gZGlldCBtb2RlIGZvciBmaW5kaW5nIHNpYmxpbmcgY29uc3RydWN0cyAqLworCQkJaWYgKGN1cnJlbnRFbGVtZW50LmVuY2xvc2luZ1R5cGUoKSAhPSBudWxsKXsKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IHRoaXMuYXNzaXN0Tm9kZS5zb3VyY2VFbmQrMTsKKwkJCQlpbnQgZW5kID0gY3VycmVudEVsZW1lbnQudG9wRWxlbWVudCgpLnNvdXJjZUVuZCgpOworCQkJCXNjYW5uZXIuZW9mUG9zaXRpb24gPSBlbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IGVuZCArIDEgOiBlbmQ7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVzZXRTdGFja3MoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CQorCQkJfQorCQl9CisJfQorCXJldHVybiBzdXBlci5yZXN1bWVBZnRlclJlY292ZXJ5KCk7Cit9CitwdWJsaWMgdm9pZCBzZXRBc3Npc3RJZGVudGlmaWVyKGNoYXJbXSBhc3Npc3RJZGVudCl7CisJKChDb21wbGV0aW9uU2Nhbm5lcilzY2FubmVyKS5jb21wbGV0aW9uSWRlbnRpZmllciA9IGFzc2lzdElkZW50OworfQorLyoqCisgKiBTdG9yZXMgdGhlIGxhYmVscyBsZWZ0IG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzdG9yZWQgeWV0LgorICovCitwcml2YXRlIHZvaWQgc3RvcmVMYWJlbHNJZk5lZWRlZCgpIHsKKy8vCWludCBjb3VudGVyID0gdGhpcy5sYWJlbENvdW50ZXJQdHIgPj0gMCA/IHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdIDogMDsKKy8vCWlmICh0aGlzLmxhYmVscyA9PSBudWxsICYmIHRoaXMuaWRlbnRpZmllclB0ciA+PSAwKSB7CisvLwkJdGhpcy5sYWJlbHMgPSBuZXcgY2hhcltjb3VudGVyXVtdOworLy8JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pZGVudGlmaWVyU3RhY2ssIHRoaXMuaWRlbnRpZmllclB0ciAtIGNvdW50ZXIgKyAxLCB0aGlzLmxhYmVscywgMCwgY291bnRlcik7CisvLwl9CisvLwl0aGlzLmlkZW50aWZpZXJQdHIgLT0gY291bnRlcjsKKy8vCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciAtPSBjb3VudGVyOyAvLyBsYWJlbHMgaGF2ZSBub3QgYmVlbiBjb25jYXRlbmF0ZWQgeWV0Cit9CisvKgorICogVXBkYXRlIHJlY292ZXJ5IHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgcGFyc2VyL3NjYW5uZXIgc3RhdGUKKyAqLworcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVjb3ZlcnlTdGF0ZSgpIHsKKworCS8qIGV4cG9zZSBwYXJzZXIgc3RhdGUgdG8gcmVjb3Zlcnkgc3RhdGUgKi8KKwljdXJyZW50RWxlbWVudC51cGRhdGVGcm9tUGFyc2VyU3RhdGUoKTsKKworCS8qIG1heSBiZSBhYmxlIHRvIHJldHJpZXZlIGNvbXBsZXRpb25Ob2RlIGFzIGFuIG9ycGhhbiwgYW5kIHRoZW4gYXR0YWNoIGl0ICovCisJdGhpcy5jb21wbGV0aW9uSWRlbnRpZmllckNoZWNrKCk7CisJdGhpcy5hdHRhY2hPcnBoYW5Db21wbGV0aW9uTm9kZSgpOworCQorCS8vIGlmIGFuIGFzc2lzdCBub2RlIGhhcyBiZWVuIGZvdW5kIGFuZCBhIHJlY292ZXJlZCBlbGVtZW50IGV4aXN0cywKKwkvLyBtYXJrIGVuY2xvc2luZyBibG9ja3MgYXMgdG8gYmUgcHJlc2VydmVkCisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsICYmIHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQljdXJyZW50RWxlbWVudC5wcmVzZXJ2ZUVuY2xvc2luZ0Jsb2NrcygpOworCX0KKwkKKwkvKiBjaGVjayBhbmQgdXBkYXRlIHJlY292ZXJlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHRva2VuLAorCQl0aGlzIGFjdGlvbiBpcyBhbHNvIHBlcmZvcm1lZCB3aGVuIHNoaWZ0aW5nIHRva2VuIGFmdGVyIHJlY292ZXJ5CisJCWdvdCBhY3RpdmF0ZWQgb25jZS4gCisJKi8KKwl0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworfQorCitwcm90ZWN0ZWQgTG9jYWxEZWNsYXJhdGlvbiBjcmVhdGVMb2NhbERlY2xhcmF0aW9uKEV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24sIGNoYXJbXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQlyZXR1cm4gc3VwZXIuY3JlYXRlTG9jYWxEZWNsYXJhdGlvbihpbml0aWFsaXphdGlvbiwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJfSBlbHNlIHsKKwkJQ29tcGxldGlvbk9uTG9jYWxOYW1lIGxvY2FsID0gbmV3IENvbXBsZXRpb25PbkxvY2FsTmFtZShpbml0aWFsaXphdGlvbiwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJCXRoaXMuYXNzaXN0Tm9kZSA9IGxvY2FsOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gc291cmNlRW5kICsgMTsKKwkJcmV0dXJuIGxvY2FsOworCX0KK30KKworcHJvdGVjdGVkIEZpZWxkRGVjbGFyYXRpb24gY3JlYXRlRmllbGREZWNsYXJhdGlvbihFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uLCBjaGFyW10gbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwkJcmV0dXJuIHN1cGVyLmNyZWF0ZUZpZWxkRGVjbGFyYXRpb24oaW5pdGlhbGl6YXRpb24sIG5hbWUsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCX0gZWxzZSB7CisJCUNvbXBsZXRpb25PbkZpZWxkTmFtZSBmaWVsZCA9IG5ldyBDb21wbGV0aW9uT25GaWVsZE5hbWUoaW5pdGlhbGl6YXRpb24sIG5hbWUsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCQl0aGlzLmFzc2lzdE5vZGUgPSBmaWVsZDsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHNvdXJjZUVuZCArIDE7CisJCXJldHVybiBmaWVsZDsKKwl9Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE2ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsNzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoKKyAqIFNjYW5uZXIgYXdhcmUgb2YgYSBjdXJzb3IgbG9jYXRpb24gc28gYXMgdG8gZGlzY2FyZCB0cmFpbGluZyBwb3J0aW9ucyBvZiBpZGVudGlmaWVycworICogY29udGFpbmluZyB0aGUgY3Vyc29yIGxvY2F0aW9uLgorICoKKyAqIEN1cnNvciBsb2NhdGlvbiBkZW5vdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVoaW5kIHdoaWNoIGNvbXBsZXRpb24KKyAqIGdvdCByZXF1ZXN0ZWQ6CisgKiAgLTEgbWVhbnMgY29tcGxldGlvbiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZQorICoJMCAgbWVhbnMgY29tcGxldGlvbiBiZWhpbmQgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogIG4gIG1lYW5zIGNvbXBsZXRpb24gYmVoaW5kIHRoZSBuLXRoIGNoYXJhY3RlcgorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25TY2FubmVyIGV4dGVuZHMgU2Nhbm5lciB7CisKKwlwdWJsaWMgY2hhcltdIGNvbXBsZXRpb25JZGVudGlmaWVyOworCXB1YmxpYyBpbnQgY3Vyc29yTG9jYXRpb247CisJCQorCS8qIFNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIGNvbXBsZXRlZElkZW50aWZpZXIKKwkgKiBpZiBpbnNpZGUgYWN0dWFsIGlkZW50aWZpZXIsIGVuZCBnb2VzIHRvIHRoZSBhY3R1YWwgaWRlbnRpZmllciAKKwkgKiBlbmQsIGkuZS4gYmV5b25kIGN1cnNvciBsb2NhdGlvbgorCSAqLworCXB1YmxpYyBpbnQgY29tcGxldGVkSWRlbnRpZmllclN0YXJ0ID0gMDsKKwlwdWJsaWMgaW50IGNvbXBsZXRlZElkZW50aWZpZXJFbmQgPSAtMTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVtcHR5Q29tcGxldGlvbklkZW50aWZpZXIgPSB7fTsKK3B1YmxpYyBDb21wbGV0aW9uU2Nhbm5lcihib29sZWFuIGFzc2VydE1vZGUpIHsKKwlzdXBlcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBhc3NlcnRNb2RlKTsKK30KKy8qIAorICogVHJ1bmNhdGUgdGhlIGN1cnJlbnQgaWRlbnRpZmllciBpZiBpdCBpcyBjb250YWluaW5nIHRoZSBjdXJzb3IgbG9jYXRpb24uIFNpbmNlIGNvbXBsZXRpb24gaXMgcGVyZm9ybWVkCisgKiBvbiBhbiBpZGVudGlmaWVyIHByZWZpeC4KKyAqCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSB7CisKKwlpZiAoY29tcGxldGlvbklkZW50aWZpZXIgPT0gbnVsbCl7CisJCWlmIChjdXJzb3JMb2NhdGlvbiA8IHN0YXJ0UG9zaXRpb24gJiYgY3VycmVudFBvc2l0aW9uID09IHN0YXJ0UG9zaXRpb24peyAvLyBmYWtlIGVtcHR5IGlkZW50aWZpZXIgZ290IGlzc3VlZAorCQkJLy8gcmVtZW1iZXIgYWN0dWFsIGlkZW50aWZpZXIgcG9zaXRpb25zCisJCQljb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQgPSBzdGFydFBvc2l0aW9uOworCQkJY29tcGxldGVkSWRlbnRpZmllckVuZCA9IGNvbXBsZXRlZElkZW50aWZpZXJTdGFydCAtIDE7CQkJCisJCQlyZXR1cm4gY29tcGxldGlvbklkZW50aWZpZXIgPSBFbXB0eUNvbXBsZXRpb25JZGVudGlmaWVyOwkJCQkJCisJCX0KKwkJaWYgKGN1cnNvckxvY2F0aW9uKzEgPj0gc3RhcnRQb3NpdGlvbiAmJiBjdXJzb3JMb2NhdGlvbiA8IGN1cnJlbnRQb3NpdGlvbil7CisJCQkvLyByZW1lbWJlciBhY3R1YWwgaWRlbnRpZmllciBwb3NpdGlvbnMKKwkJCWNvbXBsZXRlZElkZW50aWZpZXJTdGFydCA9IHN0YXJ0UG9zaXRpb247CisJCQljb21wbGV0ZWRJZGVudGlmaWVyRW5kID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKXsJCQkvLyBjaGVjayB1bmljb2RlIHNjZW5hcmlvCisJCQkJU3lzdGVtLmFycmF5Y29weSh3aXRob3V0VW5pY29kZUJ1ZmZlciwgMSwgY29tcGxldGlvbklkZW50aWZpZXIgPSBuZXcgY2hhclt3aXRob3V0VW5pY29kZVB0cl0sIDAsIHdpdGhvdXRVbmljb2RlUHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGxlbmd0aCA9IGN1cnNvckxvY2F0aW9uICsgMSAtIHN0YXJ0UG9zaXRpb247CisJCQkJLy8gbm8gY2hhcltdIHNoYXJpbmcgYXJvdW5kIGNvbXBsZXRpb25JZGVudGlmaWVyLCB3ZSB3YW50IGl0IHRvIGJlIHVuaXF1ZSBzbyBhcyB0byB1c2UgaWRlbnRpdHkgY2hlY2tzCQorCQkJCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzdGFydFBvc2l0aW9uLCAoY29tcGxldGlvbklkZW50aWZpZXIgPSBuZXcgY2hhcltsZW5ndGhdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCXJldHVybiBjb21wbGV0aW9uSWRlbnRpZmllcjsKKwkJfQorCX0KKwlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKK30KKy8qIAorICogSWRlbnRpZmllciBzcGxpdHRpbmcgZm9yIHVuaWNvZGVzLgorICogT25seSBzdG9yZSB0aGUgY3VycmVudCB1bmljb2RlIGlmIHdlIGRpZCBub3QgcGFzcyB0aGUgY3Vyc29yTG9jYXRpb24uCisgKiBOb3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSBtaWRkbGUgb2YgYSB1bmljb2RlCisgKi8KK3B1YmxpYyBib29sZWFuIGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSB7CisKKwlpbnQgdGVtcCA9IGN1cnJlbnRQb3NpdGlvbjsKKwl0cnkgeworCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQlpbnQgYzEsIGMyLCBjMywgYzQ7CisJCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJdW5pY29kZVNpemUrKzsKKwkJCX0KKworCQkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJfHwgYzEgPCAwKQorCQkJCXx8ICgoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMyIDwgMCkKKwkJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQkJfHwgKChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzQgPCAwKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy9uZWVkIHRoZSB1bmljb2RlIGJ1ZmZlcgorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkvL2J1ZmZlciBhbGwgdGhlIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBhc2lkZS4uLi4KKwkJCQl3aXRob3V0VW5pY29kZVB0ciA9IGN1cnJlbnRQb3NpdGlvbiAtIHVuaWNvZGVTaXplIC0gc3RhcnRQb3NpdGlvbjsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlzb3VyY2UsIAorCQkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkxLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwkJCX0KKwkJCWlmICh0ZW1wIDwgY3Vyc29yTG9jYXRpb24gJiYgY3Vyc29yTG9jYXRpb24gPCBjdXJyZW50UG9zaXRpb24tMSl7CisJCQkJdGhyb3cgbmV3IEludmFsaWRDdXJzb3JMb2NhdGlvbihJbnZhbGlkQ3Vyc29yTG9jYXRpb24uTk9fQ09NUExFVElPTl9JTlNJREVfVU5JQ09ERSk7CisJCQl9CisJCQkvLyBzdG9yZSB0aGUgY3VycmVudCB1bmljb2RlLCBvbmx5IGlmIHdlIGRpZCBub3QgcGFzcyB0aGUgY3Vyc29yTG9jYXRpb24KKwkJCS8vIE5vdGU6IHRoaXMgZG9lcyBub3QgaGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHVuaWNvZGUKKwkJCWlmICgoY29tcGxldGlvbklkZW50aWZpZXIgIT0gbnVsbCkKKwkJCQl8fCAoc3RhcnRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbisxICYmIGN1cnNvckxvY2F0aW9uID49IGN1cnJlbnRQb3NpdGlvbi0xKSl7CisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApeworCQkJCS8vIHN0b3JlIHRoZSBjdXJyZW50IHVuaWNvZGUsIG9ubHkgaWYgd2UgZGlkIG5vdCBwYXNzIHRoZSBjdXJzb3JMb2NhdGlvbgorCQkJCS8vIE5vdGU6IHRoaXMgZG9lcyBub3QgaGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHVuaWNvZGUKKwkJCQlpZiAoKGNvbXBsZXRpb25JZGVudGlmaWVyICE9IG51bGwpCisJCQkJCXx8IChzdGFydFBvc2l0aW9uIDw9IGN1cnNvckxvY2F0aW9uKzEgJiYgY3Vyc29yTG9jYXRpb24gPj0gY3VycmVudFBvc2l0aW9uLTEpKXsKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitwdWJsaWMgaW50IGdldE5leHRUb2tlbigpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCisJdGhpcy53YXNBY3IgPSBmYWxzZTsKKwlpZiAoZGlldCkgeworCQlqdW1wT3Zlck1ldGhvZEJvZHkoKTsKKwkJZGlldCA9IGZhbHNlOworCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uID4gc291cmNlLmxlbmd0aCA/IFRva2VuTmFtZUVPRiA6IFRva2VuTmFtZVJCUkFDRTsKKwl9CisJdHJ5IHsKKwkJd2hpbGUgKHRydWUpIHsgLy9sb29wIGZvciBqdW1waW5nIG92ZXIgY29tbWVudHMKKwkJCXdpdGhvdXRVbmljb2RlUHRyID0gMDsKKwkJCS8vc3RhcnQgd2l0aCBhIG5ldyB0b2tlbiAoZXZlbiBjb21tZW50IHdyaXR0ZW4gd2l0aCB1bmljb2RlICkKKworCQkJLy8gLS0tLS0tLS0tQ29uc3VtZSB3aGl0ZSBzcGFjZSBhbmQgaGFuZGxlcyBzdGFydFBvc2l0aW9uLS0tLS0tLS0tCisJCQlpbnQgd2hpdGVTdGFydCA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCWJvb2xlYW4gaXNXaGl0ZVNwYWNlOworCQkJZG8geworCQkJCXN0YXJ0UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247CisJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCWlzV2hpdGVTcGFjZSA9IGp1bXBPdmVyVW5pY29kZVdoaXRlU3BhY2UoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgorCQkJCQkJJiYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkKKwkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCWlzV2hpdGVTcGFjZSA9IAorCQkJCQkJKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnKSB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyYWN0ZXIpOyAKKwkJCQl9CisJCQkJLyogY29tcGxldGlvbiByZXF1ZXN0aW5nIHN0cmljdGx5IGluc2lkZSBibGFua3MgKi8KKwkJCQlpZiAoKHdoaXRlU3RhcnQgIT0gY3VycmVudFBvc2l0aW9uKQorCQkJCQkvLyYmIChwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZURPVCkKKwkJCQkJJiYgKGNvbXBsZXRpb25JZGVudGlmaWVyID09IG51bGwpCisJCQkJCSYmICh3aGl0ZVN0YXJ0IDw9IGN1cnNvckxvY2F0aW9uKzEpCisJCQkJCSYmIChjdXJzb3JMb2NhdGlvbiA8IHN0YXJ0UG9zaXRpb24pCisJCQkJCSYmICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGN1cnJlbnRDaGFyYWN0ZXIpKXsKKwkJCQkJY3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsgLy8gZm9yIG5leHQgdG9rZW4gcmVhZAorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQl9CisJCQl9IHdoaWxlIChpc1doaXRlU3BhY2UpOworCQkJaWYgKHRva2VuaXplV2hpdGVTcGFjZSAmJiAod2hpdGVTdGFydCAhPSBjdXJyZW50UG9zaXRpb24gLSAxKSkgeworCQkJCS8vIHJlcG9zaXRpb24gc2Nhbm5lciBpbiBjYXNlIHdlIGFyZSBpbnRlcmVzdGVkIGJ5IHNwYWNlcyBhcyB0b2tlbnMKKwkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQlzdGFydFBvc2l0aW9uID0gd2hpdGVTdGFydDsKKwkJCQlyZXR1cm4gVG9rZW5OYW1lV0hJVEVTUEFDRTsKKwkJCX0KKwkJCS8vbGl0dGxlIHRyaWNrIHRvIGdldCBvdXQgaW4gdGhlIG1pZGRsZSBvZiBhIHNvdXJjZSBjb21wdXRhdGlvbgorCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IGVvZlBvc2l0aW9uKXsKKwkJCQkvKiBtaWdodCBiZSBjb21wbGV0aW5nIGF0IGVvZiAoZS5nLiBiZWhpbmQgYSBkb3QpICovCisJCQkJaWYgKGNvbXBsZXRpb25JZGVudGlmaWVyID09IG51bGwgJiYgCisJCQkJCXN0YXJ0UG9zaXRpb24gPT0gY3Vyc29yTG9jYXRpb24gKyAxKXsKKwkJCQkJY3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsgLy8gZm9yIGJlaW5nIGRldGVjdGVkIGFzIGVtcHR5IGZyZWUgaWRlbnRpZmllcgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQl9CQkJCQorCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CisJCQl9CisKKwkJCS8vIC0tLS0tLS0tLUlkZW50aWZ5IHRoZSBuZXh0IHRva2VuLS0tLS0tLS0tLS0tLQorCisJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQljYXNlICcoJyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVMUEFSRU47CisJCQkJY2FzZSAnKScgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUlBBUkVOOworCQkJCWNhc2UgJ3snIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUxCUkFDRTsKKwkJCQljYXNlICd9JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVSQlJBQ0U7CisJCQkJY2FzZSAnWycgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEJSQUNLRVQ7CisJCQkJY2FzZSAnXScgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUkJSQUNLRVQ7CisJCQkJY2FzZSAnOycgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lU0VNSUNPTE9OOworCQkJCWNhc2UgJywnIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1BOworCQkJCWNhc2UgJy4nIDoKKwkJCQkJaWYgKHN0YXJ0UG9zaXRpb24gPD0gY3Vyc29yTG9jYXRpb24gCisJCQkJCSAgICAmJiBjdXJzb3JMb2NhdGlvbiA8IGN1cnJlbnRQb3NpdGlvbil7CisJCQkJCSAgICAJcmV0dXJuIFRva2VuTmFtZURPVDsgLy8gY29tcGxldGlvbiBpbnNpZGUgLjx8PjEyCisJCQkJICAgIH0KKwkJCQkJaWYgKGdldE5leHRDaGFyQXNEaWdpdCgpKQorCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIodHJ1ZSk7CisJCQkJCXJldHVybiBUb2tlbk5hbWVET1Q7CisJCQkJY2FzZSAnKycgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCcrJywgJz0nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUExVU19QTFVTOworCQkJCQkJaWYgKHRlc3QgPiAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVQTFVTX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZVBMVVM7CisJCQkJCX0KKwkJCQljYXNlICctJyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJy0nLCAnPScpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVNSU5VU19NSU5VUzsKKwkJCQkJCWlmICh0ZXN0ID4gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTUlOVVNfRVFVQUw7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTUlOVVM7CisJCQkJCX0KKwkJCQljYXNlICd+JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVUV0lERExFOworCQkJCWNhc2UgJyEnIDoKKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTk9UX0VRVUFMOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lTk9UOworCQkJCWNhc2UgJyonIDoKKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTVVMVElQTFlfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVNVUxUSVBMWTsKKwkJCQljYXNlICclJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTDsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVJFTUFJTkRFUjsKKwkJCQljYXNlICc8JyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJz0nLCAnPCcpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVMRVNTX0VRVUFMOworCQkJCQkJaWYgKHRlc3QgPiAwKSB7CisJCQkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMOworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVMRUZUX1NISUZUOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUxFU1M7CisJCQkJCX0KKwkJCQljYXNlICc+JyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJz0nLCAnPicpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMOworCQkJCQkJaWYgKHRlc3QgPiAwKSB7CisJCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJz0nLCAnPicpKSA9PSAwKQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUklHSFRfU0hJRlRfRVFVQUw7CisJCQkJCQkJaWYgKHRlc3QgPiAwKSB7CisJCQkJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMOworCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQ7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVSSUdIVF9TSElGVDsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBUb2tlbk5hbWVHUkVBVEVSOworCQkJCQl9CisJCQkJY2FzZSAnPScgOgorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVFUVVBTF9FUVVBTDsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUVRVUFMOworCQkJCWNhc2UgJyYnIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignJicsICc9JykpID09IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUFORF9BTkQ7CisJCQkJCQlpZiAodGVzdCA+IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUFORF9FUVVBTDsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVBTkQ7CisJCQkJCX0KKwkJCQljYXNlICd8JyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJ3wnLCAnPScpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVPUl9PUjsKKwkJCQkJCWlmICh0ZXN0ID4gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lT1JfRVFVQUw7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lT1I7CisJCQkJCX0KKwkJCQljYXNlICdeJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZVhPUl9FUVVBTDsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVhPUjsKKwkJCQljYXNlICc/JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVRVUVTVElPTjsKKwkJCQljYXNlICc6JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVDT0xPTjsKKwkJCQljYXNlICdcJycgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCdcbicsICdccicpKSA9PSAwKSB7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCk7CisJCQkJCQl9CisJCQkJCQlpZiAodGVzdCA+IDApIHsKKwkJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDM7IGxvb2tBaGVhZCsrKSB7CisJCQkJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWQgPT0gc291cmNlLmxlbmd0aCkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1xuJykKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wnJykgeworCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uICs9IGxvb2tBaGVhZCArIDE7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfQ0hBUkFDVEVSX0NPTlNUQU5UKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJ1wnJykpIHsKKwkJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCisJCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCAzOyBsb29rQWhlYWQrKykgeworCQkJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWQgPT0gc291cmNlLmxlbmd0aCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXCcnKSB7CisJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfQ0hBUkFDVEVSX0NPTlNUQU5UKTsKKwkJCQkJfQorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJ1xcJykpCisJCQkJCQlzY2FuRXNjYXBlQ2hhcmFjdGVyKCk7CisJCQkJCWVsc2UgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcJycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw7CisJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCisJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDIwOyBsb29rQWhlYWQrKykgeworCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZCA9PSBzb3VyY2UubGVuZ3RoKQorCQkJCQkJCWJyZWFrOworCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wnJykgeworCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCWNhc2UgJyInIDoKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJd2hpbGUgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJyInKSB7CisJCQkJCQkJLyoqKiogXHIgYW5kIFxuIGFyZSBub3QgdmFsaWQgaW4gc3RyaW5nIGxpdGVyYWxzICoqKiovCisJCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpKSB7CisJCQkJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCisJCQkJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDUwOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZCA9PSBzb3VyY2UubGVuZ3RoKQorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wiJykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSX0lOX1NUUklORyk7CisJCQkJCQkJfQorCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdcXCcpIHsKKwkJCQkJCQkJaW50IGVzY2FwZVNpemUgPSBjdXJyZW50UG9zaXRpb247CisJCQkJCQkJCWJvb2xlYW4gYmFja1NsYXNoQXNVbmljb2RlSW5TdHJpbmcgPSB1bmljb2RlQXNCYWNrU2xhc2g7CisJCQkJCQkJCS8vc2NhbkVzY2FwZUNoYXJhY3RlciBtYWtlIGEgc2lkZSBlZmZlY3Qgb24gdGhpcyB2YWx1ZSBhbmQgd2UgbmVlZCB0aGUgcHJldmlvdXMgdmFsdWUgZmV3IGxpbmVzIGRvd24gdGhpcyBvbmUKKwkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCQllc2NhcGVTaXplID0gY3VycmVudFBvc2l0aW9uIC0gZXNjYXBlU2l6ZTsKKwkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkJCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSBlc2NhcGVTaXplIC0gMSAtIHN0YXJ0UG9zaXRpb247CisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJCXNvdXJjZSwgCisJCQkJCQkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkJCQkJCTEsIAorCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0gZWxzZSB7IC8vb3ZlcndyaXRlIHRoZSAvIGluIHRoZSBidWZmZXIKKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyW3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCQlpZiAoYmFja1NsYXNoQXNVbmljb2RlSW5TdHJpbmcpIHsgLy90aGVyZSBhcmUgVFdPIFwgaW4gdGhlIHN0cmVhbSB3aGVyZSBvbmx5IG9uZSBpcyBjb3JyZWN0CisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVQdHItLTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9TVFJJTkcpOworCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhJTlZBTElEX0VTQ0FQRSkpIHsKKwkJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDUwOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcIicpIHsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJCXRocm93IGU7IC8vIHJldGhyb3cKKwkJCQkJfQorCQkJCQlpZiAoc3RhcnRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbiAmJiBjdXJzb3JMb2NhdGlvbiA8PSBjdXJyZW50UG9zaXRpb24tMSl7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZEN1cnNvckxvY2F0aW9uKEludmFsaWRDdXJzb3JMb2NhdGlvbi5OT19DT01QTEVUSU9OX0lOU0lERV9TVFJJTkcpOworCQkJCQl9CisJCQkJCXJldHVybiBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsOworCQkJCWNhc2UgJy8nIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQkJdHJ5IHsgLy9nZXQgdGhlIG5leHQgY2hhciAKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjNCA8IDApIHsKKwkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisKKwkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CisJCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJykKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJfSAvL2p1bXAgb3ZlciB0aGUgXFwKKwkJCQkJCQkJd2hpbGUgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdcbicpIHsKKwkJCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGM0IDwgMCkgeworCQkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJcmVjb3JkQ29tbWVudChmYWxzZSk7CisJCQkJCQkJCWlmIChzdGFydFBvc2l0aW9uIDw9IGN1cnNvckxvY2F0aW9uICYmIGN1cnNvckxvY2F0aW9uIDwgY3VycmVudFBvc2l0aW9uLTEpeworCQkJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRDdXJzb3JMb2NhdGlvbihJbnZhbGlkQ3Vyc29yTG9jYXRpb24uTk9fQ09NUExFVElPTl9JTlNJREVfQ09NTUVOVCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpCisJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgeworCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kCisJCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUVOVF9MSU5FOworCQkJCQkJCQl9CisJCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vYW4gZW9mIHdpbGwgdGhlbSBiZSBnZW5lcmF0ZWQKKwkJCQkJCQkJaWYgKHRva2VuaXplQ29tbWVudHMpIHsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAorCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICh0ZXN0ID4gMCkgeyAvL3RyYWRpdGlvbmFsIGFuZCBhbm5vdGF0aW9uIGNvbW1lbnQKKwkJCQkJCQlib29sZWFuIGlzSmF2YWRvYyA9IGZhbHNlLCBzdGFyID0gZmFsc2U7CisJCQkJCQkJLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CisJCQkJCQkJCWlzSmF2YWRvYyA9IHRydWU7CisJCQkJCQkJCXN0YXIgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgorCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQorCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzQgPCAwKSB7CisJCQkJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkvL2hhbmRsZSB0aGUgXFx1IGNhc2UgbWFudWFsbHkgaW50byBjb21tZW50CisJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdcXCcpIHsKKwkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQl9IC8vanVtcCBvdmVyIHRoZSBcXAorCQkJCQkJCQkvLyBlbXB0eSBjb21tZW50IGlzIG5vdCBhIGphdmFkb2MgLyoqLworCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCisJCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8gCisJCQkJCQkJCXdoaWxlICgoY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsKKwkJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCisJCQkJCQkJCQkJJiYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkKKwkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJc3RhciA9IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonOworCQkJCQkJCQkJLy9nZXQgbmV4dCBjaGFyCisJCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGM0IDwgMCkgeworCQkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJcmVjb3JkQ29tbWVudChpc0phdmFkb2MpOworCQkJCQkJCQlpZiAoc3RhcnRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbiAmJiBjdXJzb3JMb2NhdGlvbiA8IGN1cnJlbnRQb3NpdGlvbi0xKXsKKwkJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkQ3Vyc29yTG9jYXRpb24oSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX0NPTU1FTlQpOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICh0b2tlbml6ZUNvbW1lbnRzKSB7CisJCQkJCQkJCQlpZiAoaXNKYXZhZG9jKQorCQkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0pBVkFET0M7CisJCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUVOVF9CTE9DSzsKKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9DT01NRU5UKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZURJVklERTsKKwkJCQkJfQorCQkJCWNhc2UgJ1x1MDAxYScgOgorCQkJCQlpZiAoYXRFbmQoKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CisJCQkJCS8vdGhlIGF0RW5kIG1heSBub3QgYmUgPGN1cnJlbnRQb3NpdGlvbiA9PSBzb3VyY2UubGVuZ3RoPiBpZiBzb3VyY2UgaXMgb25seSBzb21lIHBhcnQgb2YgYSByZWFsIChleHRlcm5hbCkgc3RyZWFtCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oIkN0cmwtWiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3VycmVudENoYXJhY3RlcikpCisJCQkJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKQorCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIoZmFsc2UpOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRVJST1I7CisJCQl9CisJCX0KKwl9IC8vLS0tLS0tLS0tLS0tLS0tLS1lbmQgc3dpdGNoIHdoaWxlIHRyeS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCX0KKwkvKiBtaWdodCBiZSBjb21wbGV0aW5nIGF0IHZlcnkgZW5kIG9mIGZpbGUgKGUuZy4gYmVoaW5kIGEgZG90KSAqLworCWlmIChjb21wbGV0aW9uSWRlbnRpZmllciA9PSBudWxsICYmIAorCQlzdGFydFBvc2l0aW9uID09IGN1cnNvckxvY2F0aW9uICsgMSl7CisJCWN1cnJlbnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247IC8vIGZvciBiZWluZyBkZXRlY3RlZCBhcyBlbXB0eSBmcmVlIGlkZW50aWZpZXIKKwkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJfQorCXJldHVybiBUb2tlbk5hbWVFT0Y7Cit9CisvKgorICogSW4gY2FzZSB3ZSBhY3R1YWxseSByZWFkIGEga2V5d29yZCwgYnV0IHRoZSBjdXJzb3IgaXMgbG9jYXRlZCBpbnNpZGUsCisgKiB3ZSBwcmV0ZW5kIHdlIHJlYWQgYW4gaWRlbnRpZmllci4KKyAqLworcHVibGljIGludCBzY2FuSWRlbnRpZmllck9yS2V5d29yZCgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCisJaW50IGlkID0gc3VwZXIuc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKworCS8vIGNvbnZlcnQgY29tcGxldGVkIGtleXdvcmQgaW50byBhbiBpZGVudGlmaWVyCisJaWYgKGlkICE9IFRva2VuTmFtZUlkZW50aWZpZXIKKwkJJiYgc3RhcnRQb3NpdGlvbiA8PSBjdXJzb3JMb2NhdGlvbisxIAorCQkmJiBjdXJzb3JMb2NhdGlvbiA8IGN1cnJlbnRQb3NpdGlvbil7CisJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCX0KKwlyZXR1cm4gaWQ7Cit9CitwdWJsaWMgaW50IHNjYW5OdW1iZXIoYm9vbGVhbiBkb3RQcmVmaXgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCQorCWludCB0b2tlbiA9IHN1cGVyLnNjYW5OdW1iZXIoZG90UHJlZml4KTsKKworCS8vIGNvbnNpZGVyIGNvbXBsZXRpb24ganVzdCBiZWZvcmUgYSBudW1iZXIgdG8gYmUgb2ssIHdpbGwgaW5zZXJ0IGJlZm9yZSBpdAorCWlmIChzdGFydFBvc2l0aW9uIDw9IGN1cnNvckxvY2F0aW9uICYmIGN1cnNvckxvY2F0aW9uIDwgY3VycmVudFBvc2l0aW9uKXsgIAorCQl0aHJvdyBuZXcgSW52YWxpZEN1cnNvckxvY2F0aW9uKEludmFsaWRDdXJzb3JMb2NhdGlvbi5OT19DT01QTEVUSU9OX0lOU0lERV9OVU1CRVIpOworCX0KKwlyZXR1cm4gdG9rZW47Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0ludmFsaWRDdXJzb3JMb2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9JbnZhbGlkQ3Vyc29yTG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI0ZWNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9JbnZhbGlkQ3Vyc29yTG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworLyoqCisgKiBUaHJvd24gd2hlbmV2ZXIgY3Vyc29yIGxvY2F0aW9uIGlzIG5vdCBpbnNpZGUgYSBjb25zaXN0ZW50IHRva2VuCisgKiBpLmUuIGluc2lkZSBhIHN0cmluZywgbnVtYmVyLCB1bmljb2RlLCBjb21tZW50cyBldGMuLi4KKyAqLworcHVibGljIGNsYXNzIEludmFsaWRDdXJzb3JMb2NhdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisJcHVibGljIFN0cmluZyBpcnJpdGFudDsKKworCS8qIFBvc3NpYmxlIGlycml0YW50cyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0NPTVBMRVRJT05fSU5TSURFX1VOSUNPREUgPSAiTm8gQ29tcGxldGlvbiBJbnNpZGUgVW5pY29kZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DT01QTEVUSU9OX0lOU0lERV9DT01NRU5UID0gIk5vIENvbXBsZXRpb24gSW5zaWRlIENvbW1lbnQiOyAgICAgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DT01QTEVUSU9OX0lOU0lERV9TVFJJTkcgPSAiTm8gQ29tcGxldGlvbiBJbnNpZGUgU3RyaW5nIjsgICAgICAgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DT01QTEVUSU9OX0lOU0lERV9OVU1CRVIgPSAiTm8gQ29tcGxldGlvbiBJbnNpZGUgTnVtYmVyIjsgICAgICAgIC8vJE5PTi1OTFMtMSQKKyAgICAKK3B1YmxpYyBJbnZhbGlkQ3Vyc29yTG9jYXRpb24oU3RyaW5nIGlycml0YW50KXsKKwl0aGlzLmlycml0YW50ID0gaXJyaXRhbnQ7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0T3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdE9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ3YWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdE9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIEFzc2lzdE9wdGlvbnMgeworCS8qKgorCSAqIE9wdGlvbiBJRHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUGVyZm9ybVZpc2liaWxpdHlDaGVjayA9CisJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24gPQorCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZvcmNlSW1wbGljaXRRdWFsaWZpY2F0aW9uIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKKwlwdWJsaWMgYm9vbGVhbiBmb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiA9IGZhbHNlOworCisJLyoqIAorCSAqIEluaXRpYWxpemluZyB0aGUgYXNzaXN0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHNldHRpbmdzCisJICovCisJcHVibGljIEFzc2lzdE9wdGlvbnMoKSB7CisJfQorCisJLyoqIAorCSAqIEluaXRpYWxpemluZyB0aGUgYXNzaXN0IG9wdGlvbnMgd2l0aCBleHRlcm5hbCBzZXR0aW5ncworCSAqLworCXB1YmxpYyBBc3Npc3RPcHRpb25zKE1hcCBzZXR0aW5ncykgeworCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBmaWx0ZXIgb3B0aW9ucyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgYXNzaXN0IGNvbXBvbmVudAorCQlPYmplY3RbXSBlbnRyaWVzID0gc2V0dGluZ3MuZW50cnlTZXQoKS50b0FycmF5KCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzW2ldOworCQkJaWYgKCEoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBTdHJpbmcpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpCisJCQkJY29udGludWU7CisJCQlTdHJpbmcgb3B0aW9uSUQgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKwkJCVN0cmluZyBvcHRpb25WYWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCWlmIChvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1BlcmZvcm1WaXNpYmlsaXR5Q2hlY2spKSB7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFTkFCTEVEKSkgeworCQkJCQl0aGlzLmNoZWNrVmlzaWJpbGl0eSA9IHRydWU7CisJCQkJfSBlbHNlCisJCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRElTQUJMRUQpKSB7CisJCQkJCQl0aGlzLmNoZWNrVmlzaWJpbGl0eSA9IGZhbHNlOworCQkJCQl9CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKG9wdGlvbklELmVxdWFscyhPUFRJT05fRm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24pKSB7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFTkFCTEVEKSkgeworCQkJCQl0aGlzLmZvcmNlSW1wbGljaXRRdWFsaWZpY2F0aW9uID0gdHJ1ZTsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhESVNBQkxFRCkpIHsKKwkJCQkJCXRoaXMuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24gPSBmYWxzZTsKKwkJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4Y2I4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGw7CisKKy8qCisgKiBQYXJzZXIgZXh0ZW5zaW9uIGZvciBjb2RlIGFzc2lzdCB0YXNrCisgKgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcmVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJlZEZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcmVkSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyZWRNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUmVjb3ZlcmVkVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzc2lzdFBhcnNlciBleHRlbmRzIFBhcnNlciB7CisKKwlwdWJsaWMgQXN0Tm9kZSBhc3Npc3ROb2RlOworCXB1YmxpYyBib29sZWFuIGlzT3JwaGFuQ29tcGxldGlvbk5vZGU7CisJCQorCS8qIHJlY292ZXJ5ICovCisJaW50W10gYmxvY2tTdGFydHMgPSBuZXcgaW50WzMwXTsKKworCS8vIHRoZSBwcmV2aW91cyB0b2tlbiByZWFkIGJ5IHRoZSBzY2FubmVyCisJcHJvdGVjdGVkIGludCBwcmV2aW91c1Rva2VuOworCisJLy8gdGhlIGluZGV4IGluIHRoZSBpZGVudGlmaWVyIHN0YWNrIG9mIHRoZSBwcmV2aW91cyBpZGVudGlmaWVyCisJcHJvdGVjdGVkIGludCBwcmV2aW91c0lkZW50aWZpZXJQdHI7CisJCisJLy8gdGhlIHN0YWNrcyBvZiBzZWxlY3RvcnMgZm9yIGludm9jYXRpb25zIChpZS4gbWV0aG9kIGludm9jYXRpb25zLCBhbGxvY2F0aW9uIGV4cHJlc3Npb25zIGFuZAorCS8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb25zKQorCS8vIHRoZSBzZWxlY3RvciBzdGFjayBjb250YWlucyBwb2ludGVycyB0byB0aGUgaWRlbnRpZmllciBzdGFjayBvciBvbmUgb2YgdGhlIHNlbGVjdG9yIGNvbnN0YW50cyBiZWxvdworCXByb3RlY3RlZCBpbnQgaW52b2NhdGlvblB0cjsKKwlwcm90ZWN0ZWQgaW50W10gc2VsZWN0b3JTdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOworCisJLy8gc2VsZWN0b3IgY29uc3RhbnRzCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEhJU19DT05TVFJVQ1RPUiA9IC0xOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNVUEVSX0NPTlNUUlVDVE9SID0gLTI7CisKKwkvLyB3aGV0aGVyIHRoZSBwYXJzZXIgaXMgaW4gYSBmaWVsZCBpbml0aWFsaXplcgorCS8vIChmYWxzZSBpcyBwdXNoZWQgZWFjaCB0aW1lIGEgbmV3IHR5cGUgaXMgZW50ZXJlZCwKKwkvLyAgaXQgaXMgY2hhbmdlZCB0byB0cnVlIHdoZW4gdGhlIGluaXRpYWxpemVyIGlzIGVudGVyZWQsCisJLy8gIGl0IGlzIGNoYW5nZWQgYmFjayB0byBmYWxzZSB3aGVuIHRoZSBpbml0aWFsaXplciBpcyBleGl0ZWQsCisJLy8gIGFuZCBpdCBpcyBwb3BlZCB3aGVuIHRoZSB0eXBlIGlzIGV4aXRlZCkKKwlwcm90ZWN0ZWQgaW50IGluRmllbGRJbml0aWFsaXphdGlvblB0cjsKKwlwcm90ZWN0ZWQgYm9vbGVhbltdIGluRmllbGRJbml0aWFsaXphdGlvblN0YWNrID0gbmV3IGJvb2xlYW5bU3RhY2tJbmNyZW1lbnRdOworCisJLy8gd2hldGhlciB0aGUgcGFyc2VyIGlzIGluIGEgbWV0aG9kLCBjb25zdHJ1Y3RvciBvciBpbml0aWFsaXplcgorCS8vIChmYWxzZSBpcyBwdXNoZWQgZWFjaCB0aW1lIGEgbmV3IHR5cGUgaXMgZW50ZXJlZCwKKwkvLyAgaXQgaXMgY2hhbmdlZCB0byB0cnVlIHdoZW4gdGhlIG1ldGhvZCBpcyBlbnRlcmVkLAorCS8vICBpdCBpcyBjaGFuZ2VkIGJhY2sgdG8gZmFsc2Ugd2hlbiB0aGUgbWV0aG9kIGlzIGV4aXRlZCwKKwkvLyAgYW5kIGl0IGlzIHBvcGVkIHdoZW4gdGhlIHR5cGUgaXMgZXhpdGVkKQorCXByb3RlY3RlZCBpbnQgaW5NZXRob2RQdHI7CisJcHJvdGVjdGVkIGJvb2xlYW5bXSBpbk1ldGhvZFN0YWNrID0gbmV3IGJvb2xlYW5bU3RhY2tJbmNyZW1lbnRdOworcHVibGljIEFzc2lzdFBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIGFzc2VydE1vZGUpIHsKKwlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIHRydWUsIGFzc2VydE1vZGUpOworfQorcHVibGljIGFic3RyYWN0IGNoYXJbXSBhc3Npc3RJZGVudGlmaWVyKCk7CitwdWJsaWMgaW50IGJvZHlFbmQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpeworCXJldHVybiBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Cit9CitwdWJsaWMgaW50IGJvZHlFbmQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpeworCXJldHVybiBpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZDsKK30KKy8qCisgKiBCdWlsZCBpbml0aWFsIHJlY292ZXJ5IHN0YXRlLgorICogUmVjb3Zlcnkgc3RhdGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2VyIChyZWR1Y2VkIG5vZGUgc3RhY2spLgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBidWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCl7CisKKwkvKiByZWNvdmVyeSBpbiB1bml0IHN0cnVjdHVyZSAqLworCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24peworCQlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSBzdXBlci5idWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCk7CisJCWZsdXNoQXNzaXN0U3RhdGUoKTsKKwkJaW5pdEluTWV0aG9kQW5kSW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2soZWxlbWVudCk7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCS8qIHJlY292ZXJ5IGluIG1ldGhvZCBib2R5ICovCisJbGFzdENoZWNrUG9pbnQgPSAwOworCisJUmVjb3ZlcmVkRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKKwlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24peworCQllbGVtZW50ID0gbmV3IFJlY292ZXJlZE1ldGhvZCgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCwgbnVsbCwgMCwgdGhpcyk7CisJCWxhc3RDaGVja1BvaW50ID0gKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KS5ib2R5U3RhcnQ7CisJfSBlbHNlIHsKKwkJLyogSW5pdGlhbGl6ZXIgYm9kaWVzIGFyZSBwYXJzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHR5cGUgZGVjbGFyYXRpb24sIHdlIG11c3QgdGh1cyBzZWFyY2ggaXQgaW5zaWRlICovCisJCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKXsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5maWVsZHMubGVuZ3RoOyBpKyspeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSB0eXBlLmZpZWxkc1tpXTsJCQkJCQorCQkJCWlmICghZmllbGQuaXNGaWVsZCgpCisJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uCisJCQkJCQkmJiBzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZAorCQkJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsKKwkJCQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRJbml0aWFsaXplcigoSW5pdGlhbGl6ZXIpIGZpZWxkLCBudWxsLCAxLCB0aGlzKTsKKwkJCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwkJCQkJCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSAKKwl9CisKKwlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gZWxlbWVudDsKKworCS8qIGFkZCBpbml0aWFsIGJsb2NrICovCisJQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soMCk7CisJaW50IGxhc3RTdGFydCA9IGJsb2NrU3RhcnRzWzBdOworCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0OworCWVsZW1lbnQgPSBlbGVtZW50LmFkZChibG9jaywgMSk7CisJaW50IGJsb2NrSW5kZXggPSAxOwkvLyBpZ25vcmUgZmlyc3QgYmxvY2sgc3RhcnQsIHNpbmNlIG1hbnVhbGx5IHJlYnVpbHQgaGVyZQorCisJZm9yKGludCBpID0gMDsgaSA8PSBhc3RQdHI7IGkrKyl7CisJCUFzdE5vZGUgbm9kZSA9IGFzdFN0YWNrW2ldOworCisJCS8qIGNoZWNrIGZvciBpbnRlcm1lZGlhdGUgYmxvY2sgY3JlYXRpb24sIHNvIHJlY292ZXJ5IGNhbiBwcm9wZXJseSBjbG9zZSB0aGVtIGFmdGVyd2FyZHMgKi8KKwkJaW50IG5vZGVTdGFydCA9IG5vZGUuc291cmNlU3RhcnQ7CisJCWZvciAoaW50IGogPSBibG9ja0luZGV4OyBqIDw9IHJlYWxCbG9ja1B0cjsgaisrKXsKKwkJCWlmIChibG9ja1N0YXJ0c1tqXSA+IG5vZGVTdGFydCl7CisJCQkJYmxvY2tJbmRleCA9IGo7IC8vIHNoaWZ0IHRoZSBpbmRleCB0byB0aGUgbmV3IGJsb2NrCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmxvY2tTdGFydHNbal0gIT0gbGFzdFN0YXJ0KXsgLy8gYXZvaWQgbXVsdGlwbGUgYmxvY2sgaWYgYXQgc2FtZSBwb3NpdGlvbgorCQkJCWJsb2NrID0gbmV3IEJsb2NrKDApOworCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gYmxvY2tTdGFydHNbal07CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGJsb2NrLCAxKTsKKwkJCX0KKwkJCWJsb2NrSW5kZXggPSBqKzE7IC8vIHNoaWZ0IHRoZSBpbmRleCB0byB0aGUgbmV3IGJsb2NrCisJCX0KKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKXsKKwkJCUxvY2FsRGVjbGFyYXRpb24gbG9jYWwgPSAoTG9jYWxEZWNsYXJhdGlvbikgbm9kZTsKKwkJCWlmIChsb2NhbC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQobG9jYWwsIDApOworCQkJCWlmIChsb2NhbC5pbml0aWFsaXphdGlvbiA9PSBudWxsKXsKKwkJCQkJbGFzdENoZWNrUG9pbnQgPSBsb2NhbC5zb3VyY2VFbmQgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCWxhc3RDaGVja1BvaW50ID0gbG9jYWwuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kICsgMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChsb2NhbCwgMCk7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBsb2NhbC5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQkJCisJCWlmIChub2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbil7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQobWV0aG9kLCAwKTsKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IG1ldGhvZC5ib2R5U3RhcnQ7CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChtZXRob2QsIDApOworCQkJCWxhc3RDaGVja1BvaW50ID0gbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChub2RlIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpeworCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIG5vZGU7CisJCQlpZiAoaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGluaXRpYWxpemVyLCAxKTsKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IGluaXRpYWxpemVyLmJvZHlTdGFydDsJCQkJCisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChpbml0aWFsaXplciwgMCk7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQkJCisJCWlmIChub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbil7CisJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7CisJCQlpZiAoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGZpZWxkLCAwKTsKKwkJCQlpZiAoZmllbGQuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCl7CisJCQkJCWxhc3RDaGVja1BvaW50ID0gZmllbGQuc291cmNlRW5kICsgMTsKKwkJCQl9IGVsc2UgeworCQkJCQlsYXN0Q2hlY2tQb2ludCA9IGZpZWxkLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCArIDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoZmllbGQsIDApOworCQkJCWxhc3RDaGVja1BvaW50ID0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24peworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKHR5cGUuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKHR5cGUsIDApOwkKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGUuYm9keVN0YXJ0OworCQkJfSBlbHNlIHsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CQkJCQorCQkJCWxhc3RDaGVja1BvaW50ID0gdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSl7CisJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmID0gKEltcG9ydFJlZmVyZW5jZSkgbm9kZTsKKwkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChpbXBvcnRSZWYsIDApOworCQkJbGFzdENoZWNrUG9pbnQgPSBpbXBvcnRSZWYuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQl9CisJfQorCWlmICh0aGlzLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UpIHsKKwkJdGhpcy5jdXJyZW50VG9rZW4gPSAwOyAvLyBjbG9zaW5nIGJyYWNlIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZgorCX0KKworCS8qIG1pZ2h0IG5lZWQgc29tZSBleHRyYSBibG9jayAoYWZ0ZXIgdGhlIGxhc3QgcmVkdWNlZCBub2RlKSAqLworCWludCBwb3MgPSB0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbCA/IGxhc3RDaGVja1BvaW50IDogdGhpcy5hc3Npc3ROb2RlLnNvdXJjZVN0YXJ0OworCWZvciAoaW50IGogPSBibG9ja0luZGV4OyBqIDw9IHJlYWxCbG9ja1B0cjsgaisrKXsKKwkJaWYgKChibG9ja1N0YXJ0c1tqXSA8IHBvcykgJiYgKGJsb2NrU3RhcnRzW2pdICE9IGxhc3RTdGFydCkpeyAvLyBhdm9pZCBtdWx0aXBsZSBibG9jayBpZiBhdCBzYW1lIHBvc2l0aW9uCisJCQlibG9jayA9IG5ldyBCbG9jaygwKTsKKwkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gbGFzdFN0YXJ0ID0gYmxvY2tTdGFydHNbal07CisJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoYmxvY2ssIDEpOworCQl9CisJfQorCQorCWluaXRJbk1ldGhvZEFuZEluRmllbGRJbml0aWFsaXphdGlvblN0YWNrKGVsZW1lbnQpOworCXJldHVybiBlbGVtZW50OworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpIHsKKwlzdXBlci5jb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7CisJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHItLTsKKwl0aGlzLmluTWV0aG9kUHRyLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5b3B0KCkgeworCXN1cGVyLmNvbnN1bWVDbGFzc0JvZHlvcHQoKTsKKwl0aGlzLmludm9jYXRpb25QdHItLTsgLy8gTkI6IFRoaXMgY2FuIGJlIGRlY3JlbWVudGVkIGJlbG93IC0xIG9ubHkgaWYgaW4gZGlldCBtb2RlIGFuZCBub3QgaW4gZmllbGQgaW5pdGlhbGl6ZXIKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlcigpIHsKKwlzdXBlci5jb25zdW1lQ2xhc3NIZWFkZXIoKTsKKwl0aGlzLnB1c2hOb3RJbkluaXRpYWxpemVyKCk7CisJdGhpcy5wdXNoTm90SW5NZXRob2QoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKSB7CisJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpOworCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IGZhbHNlOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCkgeworCXN1cGVyLmNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOworCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IHRydWU7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKSB7CisJc3VwZXIuY29uc3VtZUVtcHR5Q2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7CisJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHItLTsKKwl0aGlzLmluTWV0aG9kUHRyLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKSB7CisJc3VwZXIuY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCk7CisJdGhpcy5pbnZvY2F0aW9uUHRyLS07IC8vIE5COiBUaGlzIGNhbiBiZSBkZWNyZW1lbnRlZCBiZWxvdyAtMSBvbmx5IGlmIGluIGRpZXQgbW9kZSBhbmQgbm90IGluIGZpZWxkIGluaXRpYWxpemVyCisJdGhpcy5wdXNoTm90SW5Jbml0aWFsaXplcigpOworCXRoaXMucHVzaE5vdEluTWV0aG9kKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaW50IGZsYWcsIGludCByZWNGbGFnKSB7CisJc3VwZXIuY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGZsYWcsIHJlY0ZsYWcpOworCXRoaXMuaW52b2NhdGlvblB0ci0tOyAvLyBOQjogVGhpcyBjYW4gYmUgZGVjcmVtZW50ZWQgYmVsb3cgLTEgb25seSBpZiBpbiBkaWV0IG1vZGUgYW5kIG5vdCBpbiBmaWVsZCBpbml0aWFsaXplcgorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcmNlTm9EaWV0KCkgeworCXN1cGVyLmNvbnN1bWVGb3JjZU5vRGlldCgpOworCS8vIGlmIHdlIGFyZSBub3QgaW4gYSBtZXRob2QgKGllLiB3ZSBhcmUgbm90IGluIGEgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXIpCisJLy8gdGhlbiB3ZSBhcmUgZW50ZXJpbmcgYSBmaWVsZCBpbml0aWFsaXplcgorCWlmICghdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdKSB7CisJCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHJdID0gdHJ1ZTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlSGVhZGVyKCkgeworCXN1cGVyLmNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKTsKKwl0aGlzLnB1c2hOb3RJbkluaXRpYWxpemVyKCk7CisJdGhpcy5wdXNoTm90SW5NZXRob2QoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKSB7CisJc3VwZXIuY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOworCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyLS07CisJdGhpcy5pbk1ldGhvZFB0ci0tOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEJvZHkoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEJvZHkoKTsKKwl0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gPSBmYWxzZTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXIoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlcigpOworCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IHRydWU7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCk7CisJdGhpcy5pbnZvY2F0aW9uUHRyLS07IC8vIE5COiBUaGlzIGNhbiBiZSBkZWNyZW1lbnRlZCBiZWxvdyAtMSBvbmx5IGlmIGluIGRpZXQgbW9kZSBhbmQgbm90IGluIGZpZWxkIGluaXRpYWxpemVyCisJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCWlmIChtZXNzYWdlU2VuZCA9PSBhc3Npc3ROb2RlKXsKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1lc3NhZ2VTZW5kLnNvdXJjZUVuZCArIDE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCkgeworCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOworCXRoaXMuaW52b2NhdGlvblB0ci0tOyAvLyBOQjogVGhpcyBjYW4gYmUgZGVjcmVtZW50ZWQgYmVsb3cgLTEgb25seSBpZiBpbiBkaWV0IG1vZGUgYW5kIG5vdCBpbiBmaWVsZCBpbml0aWFsaXplcgorCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwlpZiAobWVzc2FnZVNlbmQgPT0gYXNzaXN0Tm9kZSl7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXNzYWdlU2VuZC5zb3VyY2VFbmQgKyAxOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOworCXRoaXMuaW52b2NhdGlvblB0ci0tOyAvLyBOQjogVGhpcyBjYW4gYmUgZGVjcmVtZW50ZWQgYmVsb3cgLTEgb25seSBpZiBpbiBkaWV0IG1vZGUgYW5kIG5vdCBpbiBmaWVsZCBpbml0aWFsaXplciAKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJaWYgKG1lc3NhZ2VTZW5kID09IGFzc2lzdE5vZGUpeworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVzc2FnZVNlbmQuc291cmNlRW5kICsgMTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTmVzdGVkTWV0aG9kKCkgeworCXN1cGVyLmNvbnN1bWVOZXN0ZWRNZXRob2QoKTsKKwl0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gPSB0cnVlOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU9wZW5CbG9jaygpIHsKKwkvLyBPcGVuQmxvY2sgOjo9ICRlbXB0eQorCisJc3VwZXIuY29uc3VtZU9wZW5CbG9jaygpOworCXRyeSB7CisJCWJsb2NrU3RhcnRzW3JlYWxCbG9ja1B0cl0gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCS8vcmVhbEJsb2NrUHRyIGlzIGNvcnJlY3QgCisJCWludCBvbGRTdGFja0xlbmd0aCA9IGJsb2NrU3RhcnRzLmxlbmd0aDsKKwkJaW50IG9sZFN0YWNrW10gPSBibG9ja1N0YXJ0czsKKwkJYmxvY2tTdGFydHMgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBibG9ja1N0YXJ0cywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlibG9ja1N0YXJ0c1tyZWFsQmxvY2tQdHJdID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCkgeworCS8vIFBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgOjo9ICdwYWNrYWdlJyBOYW1lCisJLyogYnVpbGQgYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCisKKwlpbnQgaW5kZXg7CisKKwkvKiBubyBuZWVkIHRvIHRha2UgYWN0aW9uIGlmIG5vdCBpbnNpZGUgYXNzaXN0IGlkZW50aWZpZXJzICovCisJaWYgKChpbmRleCA9IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpIDwgMCkgeworCQlzdXBlci5jb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOworCQlyZXR1cm47CisJfQorCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCisJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLworCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgorCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCisJCWlkZW50aWZpZXJQdHIgKyAxLCAKKwkJcG9zaXRpb25zLCAKKwkJMCwgCisJCWxlbmd0aCk7IAorCisJLyogYnVpbGQgc3BlY2lmaWMgYXNzaXN0IG5vZGUgb24gcGFja2FnZSBzdGF0ZW1lbnQgKi8KKwlJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhpcy5jcmVhdGVBc3Npc3RQYWNrYWdlUmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zKTsKKwlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKKwljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSByZWZlcmVuY2U7IAorCisJaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peworCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJfSBlbHNlIHsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKKwl9CisJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCS8vIGZsdXNoIGFubm90YXRpb25zIGRlZmluZWQgcHJpb3IgdG8gaW1wb3J0IHN0YXRlbWVudHMKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLmZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCX0JCit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUmVzdG9yZURpZXQoKSB7CisJc3VwZXIuY29uc3VtZVJlc3RvcmVEaWV0KCk7CisJLy8gaWYgd2UgYXJlIG5vdCBpbiBhIG1ldGhvZCAoaWUuIHdlIHdlcmUgbm90IGluIGEgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXIpCisJLy8gdGhlbiB3ZSBhcmUgZXhpdGluZyBhIGZpZWxkIGluaXRpYWxpemVyCisJaWYgKCF0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0pIHsKKwkJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0gPSBmYWxzZTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpIHsKKwkvLyBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lCisJLyogcHVzaCBhbiBJbXBvcnRSZWYgYnVpbGQgZnJvbSB0aGUgbGFzdCBuYW1lIAorCXN0b3JlZCBpbiB0aGUgaWRlbnRpZmllciBzdGFjay4gKi8KKworCWludCBpbmRleDsKKworCS8qIG5vIG5lZWQgdG8gdGFrZSBhY3Rpb24gaWYgbm90IGluc2lkZSBhc3Npc3QgaWRlbnRpZmllcnMgKi8KKwlpZiAoKGluZGV4ID0gaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPCAwKSB7CisJCXN1cGVyLmNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7CisJCXJldHVybjsKKwl9CisJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBhc3Npc3Qgbm9kZSBwb3NpdGlvbnMKKwkJc2hvdWxkIGluY2x1ZGUgdGhlIGVudGlyZSByZXBsYWNlZCBzb3VyY2UuICovCisJaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwljaGFyW11bXSBzdWJzZXQgPSBpZGVudGlmaWVyU3ViU2V0KGluZGV4KzEpOyAvLyBpbmNsdWRlIHRoZSBhc3Npc3RJZGVudGlmaWVyCisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkoCisJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJaWRlbnRpZmllclB0ciArIDEsIAorCQlwb3NpdGlvbnMsIAorCQkwLCAKKwkJbGVuZ3RoKTsgCisKKwkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgbm9kZSBvbiBpbXBvcnQgc3RhdGVtZW50ICovCisJSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zKTsKKwlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKKworCXB1c2hPbkFzdFN0YWNrKHJlZmVyZW5jZSk7CisKKwlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CisJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwl9IGVsc2UgeworCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAoaW50KSBwb3NpdGlvbnNbbGVuZ3RoLTFdOworCX0KKwkvL2VuZFBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIHRoZSA7CisJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJLy8gZmx1c2ggYW5ub3RhdGlvbnMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHRoaXMuZmx1c2hBbm5vdGF0aW9uc0RlZmluZWRQcmlvclRvKHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQocmVmZXJlbmNlLCAwKTsKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCQkKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGljSW5pdGlhbGl6ZXIoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCk7CisJdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdID0gZmFsc2U7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGljT25seSgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGljT25seSgpOworCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IHRydWU7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVG9rZW4oaW50IHRva2VuKSB7CisJc3VwZXIuY29uc3VtZVRva2VuKHRva2VuKTsKKwkvLyByZWdpc3RlciBtZXNzYWdlIHNlbmQgc2VsZWN0b3Igb25seSBpZiBpbnNpZGUgYSBtZXRob2Qgb3IgaWYgbG9va2luZyBhdCBhIGZpZWxkIGluaXRpYWxpemVyIAorCS8vIGFuZCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhbiBvcGVuIHBhcmVudGhlc2lzCisJaWYgKCh0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gfHwgdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0pICYmIHRva2VuID09IFRva2VuTmFtZUxQQVJFTikgeworCQlzd2l0Y2ggKHRoaXMucHJldmlvdXNUb2tlbikgeworCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyOgorCQkJCXRoaXMucHVzaE9uU2VsZWN0b3JTdGFjayh0aGlzLmlkZW50aWZpZXJQdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWV0aGlzOiAvLyBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCBlZy4gdGhpcygxLCAyKQorCQkJCXRoaXMucHVzaE9uU2VsZWN0b3JTdGFjayhUSElTX0NPTlNUUlVDVE9SKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lc3VwZXI6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiBzdXBlcigxLCAyKQorCQkJCXRoaXMucHVzaE9uU2VsZWN0b3JTdGFjayhTVVBFUl9DT05TVFJVQ1RPUik7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJdGhpcy5wcmV2aW91c1Rva2VuID0gdG9rZW47CisJaWYgKHRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJdGhpcy5wcmV2aW91c0lkZW50aWZpZXJQdHIgPSB0aGlzLmlkZW50aWZpZXJQdHI7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKKwkvLyBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUgJy4nICcqJworCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCisKKwlpbnQgaW5kZXg7CisKKwkvKiBubyBuZWVkIHRvIHRha2UgYWN0aW9uIGlmIG5vdCBpbnNpZGUgYXNzaXN0IGlkZW50aWZpZXJzICovCisJaWYgKChpbmRleCA9IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpIDwgMCkgeworCQlzdXBlci5jb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7CisJCXJldHVybjsKKwl9CisJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBhc3Npc3Qgbm9kZSBwb3NpdGlvbnMKKwkJc2hvdWxkIGluY2x1ZGUgdGhlIGVudGlyZSByZXBsYWNlZCBzb3VyY2UuICovCisJaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwljaGFyW11bXSBzdWJzZXQgPSBpZGVudGlmaWVyU3ViU2V0KGluZGV4KzEpOyAvLyBpbmNsdWRlIHRoZSBhc3Npc3RJZGVudGlmaWVyCisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkoCisJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJaWRlbnRpZmllclB0ciArIDEsIAorCQlwb3NpdGlvbnMsIAorCQkwLCAKKwkJbGVuZ3RoKTsgCisKKwkvKiBidWlsZCBzcGVjaWZpYyBhc3Npc3Qgbm9kZSBvbiBpbXBvcnQgc3RhdGVtZW50ICovCisJSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKHN1YnNldCwgcG9zaXRpb25zKTsKKwlyZWZlcmVuY2Uub25EZW1hbmQgPSB0cnVlOworCWFzc2lzdE5vZGUgPSByZWZlcmVuY2U7CisJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOworCisJcHVzaE9uQXN0U3RhY2socmVmZXJlbmNlKTsKKworCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCX0gZWxzZSB7CisJCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IChpbnQpIHBvc2l0aW9uc1tsZW5ndGgtMV07CisJfQorCS8vZW5kUG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIDsKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCisJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8ocmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQlsYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChyZWZlcmVuY2UsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCX0KK30KK3B1YmxpYyBhYnN0cmFjdCBJbXBvcnRSZWZlcmVuY2UgY3JlYXRlQXNzaXN0SW1wb3J0UmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucywgbG9uZ1tdIHBvc2l0aW9ucyk7CitwdWJsaWMgYWJzdHJhY3QgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUFzc2lzdFBhY2thZ2VSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zLCBsb25nW10gcG9zaXRpb25zKTsKK3B1YmxpYyBhYnN0cmFjdCBOYW1lUmVmZXJlbmNlIGNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIG5hbWUsIGxvbmdbXSBwb3NpdGlvbnMpOworcHVibGljIGFic3RyYWN0IFR5cGVSZWZlcmVuY2UgY3JlYXRlUXVhbGlmaWVkQXNzaXN0VHlwZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gbmFtZSwgbG9uZ1tdIHBvc2l0aW9ucyk7CitwdWJsaWMgYWJzdHJhY3QgTmFtZVJlZmVyZW5jZSBjcmVhdGVTaW5nbGVBc3Npc3ROYW1lUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBsb25nIHBvc2l0aW9uKTsKK3B1YmxpYyBhYnN0cmFjdCBUeXBlUmVmZXJlbmNlIGNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoY2hhcltdIG5hbWUsIGxvbmcgcG9zaXRpb24pOworLyoKKyAqIEZsdXNoIHBhcnNlci9zY2FubmVyIHN0YXRlIHJlZ2FyZGluZyB0byBjb2RlIGFzc2lzdAorICovCitwdWJsaWMgdm9pZCBmbHVzaEFzc2lzdFN0YXRlKCl7CisJdGhpcy5hc3Npc3ROb2RlID0gbnVsbDsKKwl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsKKwl0aGlzLnNldEFzc2lzdElkZW50aWZpZXIobnVsbCk7Cit9CisvKgorICogQnVpbGQgc3BlY2lmaWMgdHlwZSByZWZlcmVuY2Ugbm9kZXMgaW4gY2FzZSB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQgaW5zaWRlIHRoZSB0eXBlIHJlZmVyZW5jZQorICovCitwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKGludCBkaW0pIHsKKworCWludCBpbmRleDsKKworCS8qIG5vIG5lZWQgdG8gdGFrZSBhY3Rpb24gaWYgbm90IGluc2lkZSBjb21wbGV0ZWQgaWRlbnRpZmllcnMgKi8KKwlpZiAoKGluZGV4ID0gaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPCAwKSB7CisJCXJldHVybiBzdXBlci5nZXRUeXBlUmVmZXJlbmNlKGRpbSk7CisJfQorCisJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBhc3Npc3Qgbm9kZSBwb3NpdGlvbnMKKwkJc2hvdWxkIGluY2x1ZGUgdGhlIGVudGlyZSByZXBsYWNlZCBzb3VyY2UuICovCisJaW50IGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXTsKKwljaGFyW11bXSBzdWJzZXQgPSBpZGVudGlmaWVyU3ViU2V0KGluZGV4KTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSgKKwkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAorCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCXBvc2l0aW9ucywgCisJCTAsIAorCQlsZW5ndGgpOyAKKworCS8qIGJ1aWxkIHNwZWNpZmljIGFzc2lzdCBvbiB0eXBlIHJlZmVyZW5jZSAqLworCVR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlOworCWlmIChpbmRleCA9PSAwKSB7CisJCS8qIGFzc2lzdCBpbnNpZGUgZmlyc3QgaWRlbnRpZmllciAqLworCQlyZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoCisJCQkJCQlhc3Npc3RJZGVudGlmaWVyKCksIAorCQkJCQkJcG9zaXRpb25zWzBdKTsKKwl9IGVsc2UgeworCQkvKiBhc3Npc3QgaW5zaWRlIHN1YnNlcXVlbnQgaWRlbnRpZmllciAqLworCQlyZWZlcmVuY2UgPQl0aGlzLmNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoCisJCQkJCQlzdWJzZXQsICAKKwkJCQkJCWFzc2lzdElkZW50aWZpZXIoKSwgCisJCQkJCQlwb3NpdGlvbnMpOworCX0KKwlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKKwlyZXR1cm4gcmVmZXJlbmNlOworfQorLyoKKyAqIENvcHkgb2YgY29kZSBmcm9tIHN1cGVyY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZToKKyAqIEluIHRoZSBjYXNlIG9mIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSBpZiB0aGUgY3Vyc29yIGxvY2F0aW9uIGlzIG9uIHRoZSAKKyAqIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSwgdGhlbiBjcmVhdGUgYSBDb21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIAorICogaW5zdGVhZC4KKyAqLworcHJvdGVjdGVkIE5hbWVSZWZlcmVuY2UgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSB7CisKKwlpbnQgY29tcGxldGlvbkluZGV4OworCisJLyogbm8gbmVlZCB0byB0YWtlIGFjdGlvbiBpZiBub3QgaW5zaWRlIGNvbXBsZXRlZCBpZGVudGlmaWVycyAqLworCWlmICgoY29tcGxldGlvbkluZGV4ID0gaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPCAwKSB7CisJCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOworCX0KKworCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgY29tcGxldGlvbiBub2RlIHBvc2l0aW9ucworCQlzaG91bGQgaW5jbHVkZSB0aGUgZW50aXJlIHJlcGxhY2VkIHNvdXJjZS4gKi8KKwlpbnQgbGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdOworCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoY29tcGxldGlvbkluZGV4KTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSgKKwkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAorCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCXBvc2l0aW9ucywgCisJCTAsIAorCQlsZW5ndGgpOworCisJLyogYnVpbGQgc3BlY2lmaWMgY29tcGxldGlvbiBvbiBuYW1lIHJlZmVyZW5jZSAqLworCU5hbWVSZWZlcmVuY2UgcmVmZXJlbmNlOworCWlmIChjb21wbGV0aW9uSW5kZXggPT0gMCkgeworCQkvKiBjb21wbGV0aW9uIGluc2lkZSBmaXJzdCBpZGVudGlmaWVyICovCisJCXJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlU2luZ2xlQXNzaXN0TmFtZVJlZmVyZW5jZShhc3Npc3RJZGVudGlmaWVyKCksIHBvc2l0aW9uc1swXSk7CisJfSBlbHNlIHsKKwkJLyogY29tcGxldGlvbiBpbnNpZGUgc3Vic2VxdWVudCBpZGVudGlmaWVyICovCisJCXJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0TmFtZVJlZmVyZW5jZShzdWJzZXQsIGFzc2lzdElkZW50aWZpZXIoKSwgcG9zaXRpb25zKTsKKwl9OworCXJlZmVyZW5jZS5iaXRzICY9IH5Bc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CisJcmVmZXJlbmNlLmJpdHMgfD0gTE9DQUwgfCBGSUVMRDsKKwkKKwlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCWxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLnNvdXJjZUVuZCArIDE7CisJcmV0dXJuIHJlZmVyZW5jZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCkgeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGJsb2NrIHN0YXRlbWVudHMgb3B0IHBhcnNpbmcKKworCWZpcnN0VG9rZW4gPSBUb2tlbk5hbWVUV0lERExFOworCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IGZhbHNlOworfQorcHVibGljIHZvaWQgZ29Gb3JDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCgpIHsKKwkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBjb25zdHJ1Y3RvciBibG9jayBzdGF0ZW1lbnRzIG9wdCBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lTk9UOworCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IGZhbHNlOworfQorLyoKKyAqIFJldHJpZXZlIGEgcGFydGlhbCBzdWJzZXQgb2YgYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgdXAgdG8gdGhlIGNvbXBsZXRpb24gcG9pbnQuCisgKiBJdCBkb2VzIG5vdCBwb3AgdGhlIGFjdHVhbCBhd2FpdGluZyBpZGVudGlmaWVycywgc28gYXMgdG8gYmUgYWJsZSB0byByZXRyaWV2ZSBwb3NpdGlvbgorICogaW5mb3JtYXRpb24gYWZ0ZXJ3YXJkcy4KKyAqLworcHJvdGVjdGVkIGNoYXJbXVtdIGlkZW50aWZpZXJTdWJTZXQoaW50IHN1YnNldExlbmd0aCl7CisKKwlpZiAoc3Vic2V0TGVuZ3RoID09IDApIHJldHVybiBudWxsOworCQorCWNoYXJbXVtdIHN1YnNldDsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlpZGVudGlmaWVyU3RhY2ssCisJCWlkZW50aWZpZXJQdHIgLSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl0gKyAxLAorCQkoc3Vic2V0ID0gbmV3IGNoYXJbc3Vic2V0TGVuZ3RoXVtdKSwKKwkJMCwKKwkJc3Vic2V0TGVuZ3RoKTsKKwlyZXR1cm4gc3Vic2V0OworfQorLyoKKyAqIEl0ZXJhdGUgdGhlIG1vc3QgcmVjZW50IGdyb3VwIG9mIGF3YWl0aW5nIGlkZW50aWZpZXJzIChncm91cGVkIGZvciBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgKGVnLiBhYS5iYi5jYykKKyAqIHNvIGFzIHRvIGNoZWNrIHdoZXRoZXIgb25lIG9mIHRoZW0gaXMgdGhlIGFzc2lzdCBpZGVudGlmaWVyLgorICogSWYgc28sIHRoZW4gYW5zd2VyIHRoZSBpbmRleCBvZiB0aGUgYXNzaXN0IGlkZW50aWZpZXIgKDAgYmVpbmcgdGhlIGZpcnN0IGlkZW50aWZpZXIgb2YgdGhlIHNldCkuCisgKgllZy4gYWEoMCkuYmIoMSkuY2MoMikKKyAqIElmIG5vIGFzc2lzdCBpZGVudGlmaWVyIHdhcyBmb3VuZCwgYW5zd2VycyAtMS4KKyAqLworcHJvdGVjdGVkIGludCBpbmRleE9mQXNzaXN0SWRlbnRpZmllcigpeworCisJaWYgKGlkZW50aWZpZXJMZW5ndGhQdHIgPCAwKXsKKwkJcmV0dXJuIC0xOyAvLyBubyBhd2FpdGluZyBpZGVudGlmaWVyCisJfQorCisJY2hhcltdIGFzc2lzdElkZW50aWZpZXIgOworCWlmICgoYXNzaXN0SWRlbnRpZmllciA9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpKSA9PSBudWxsKXsKKwkJcmV0dXJuIC0xOyAvLyBubyBhc3Npc3QgaWRlbnRpZmllciBmb3VuZCB5ZXQKKwl9CisKKwkvLyBpdGVyYXRlIGF3YWl0aW5nIGlkZW50aWZpZXJzIGJhY2t3YXJkcworCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7IAorCQlpZiAoaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHIgLSBpXSA9PSBhc3Npc3RJZGVudGlmaWVyKXsKKwkJCXJldHVybiBsZW5ndGggLSBpIC0gMTsKKwkJfQorCX0KKwkvLyBub25lIG9mIHRoZSBhd2FpdGluZyBpZGVudGlmaWVycyBpcyB0aGUgY29tcGxldGlvbiBvbmUKKwlyZXR1cm4gLTE7Cit9CitwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworCXN1cGVyLmluaXRpYWxpemUoKTsKKwl0aGlzLmZsdXNoQXNzaXN0U3RhdGUoKTsKKwl0aGlzLmludm9jYXRpb25QdHIgPSAtMTsKKwl0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0ciA9IDBdID0gZmFsc2U7CisJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0ciA9IDBdID0gZmFsc2U7CisJdGhpcy5wcmV2aW91c0lkZW50aWZpZXJQdHIgPSAtMTsKK30KK3B1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVTY2FubmVyKCk7CisKK3Byb3RlY3RlZCB2b2lkIGluaXRJbk1ldGhvZEFuZEluRmllbGRJbml0aWFsaXphdGlvblN0YWNrKFJlY292ZXJlZEVsZW1lbnQgY3VycmVudEVsZW1lbnQpIHsKKworCWludCBsZW5ndGggPSBjdXJyZW50RWxlbWVudC5kZXB0aCgpICsgMTsKKwlpbnQgcHRyID0gbGVuZ3RoOworCWJvb2xlYW5bXSBtZXRob2RTdGFjayA9IG5ldyBib29sZWFuW2xlbmd0aF07CisJYm9vbGVhbltdIGZpZWxkSW5pdGlhbGl6YXRpb25TdGFjayA9IG5ldyBib29sZWFuW2xlbmd0aF07CisJYm9vbGVhbiBpbk1ldGhvZCA9IGZhbHNlOworCWJvb2xlYW4gaW5GaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CisJCisJUmVjb3ZlcmVkRWxlbWVudCBlbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7CisJd2hpbGUoZWxlbWVudCAhPSBudWxsKXsKKwkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZE1ldGhvZCB8fAorCQkJZWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEluaXRpYWxpemVyKSB7CisJCQlpZihlbGVtZW50LnBhcmVudCA9PSBudWxsKSB7CisJCQkJbWV0aG9kU3RhY2tbLS1wdHJdID0gdHJ1ZTsKKwkJCQlmaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbcHRyXSA9IGZhbHNlOworCQkJfQorCQkJaW5NZXRob2QgPSB0cnVlOworCQl9IGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkKXsKKwkJCWluRmllbGRJbml0aWFsaXplciA9IGVsZW1lbnQuc291cmNlRW5kKCkgPT0gMDsKKwkJfSBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKKwkJCW1ldGhvZFN0YWNrWy0tcHRyXSA9IGluTWV0aG9kOworCQkJZmllbGRJbml0aWFsaXphdGlvblN0YWNrW3B0cl0gPSBpbkZpZWxkSW5pdGlhbGl6ZXI7CisJCisJCQlpbk1ldGhvZCA9IGZhbHNlOworCQkJaW5GaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CisJCX0gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVW5pdCkgeworCQkJbWV0aG9kU3RhY2tbLS1wdHJdID0gZmFsc2U7CisJCQlmaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbcHRyXSA9IGZhbHNlOworCQl9CisJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudDsKKwl9CisJCisJaW5NZXRob2RQdHIgPSBsZW5ndGggLSBwdHIgLSAxOworCWluRmllbGRJbml0aWFsaXphdGlvblB0ciA9IGluTWV0aG9kUHRyOworCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kU3RhY2ssIHB0ciwgaW5NZXRob2RTdGFjaywgMCwgaW5NZXRob2RQdHIgKyAxKTsKKwlTeXN0ZW0uYXJyYXljb3B5KGZpZWxkSW5pdGlhbGl6YXRpb25TdGFjaywgcHRyLCBpbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFjaywgMCwgaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyICsgMSk7CisJCit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHdlIGFyZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluc2lkZSBhIGZpZWxkIGluaXRpYWxpemVyLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkgeworCWZvciAoaW50IGkgPSB0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cjsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbaV0pIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUGFyc2UgdGhlIGJsb2NrIHN0YXRlbWVudHMgaW5zaWRlIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIHRyeSB0byBjb21wbGV0ZSBhdCB0aGUKKyAqIGN1cnNvciBsb2NhdGlvbi4KKyAqLworcHVibGljIHZvaWQgcGFyc2VCbG9ja1N0YXRlbWVudHMoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgeworCWlmIChtZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCXBhcnNlQmxvY2tTdGF0ZW1lbnRzKChNZXRob2REZWNsYXJhdGlvbikgbWQsIHVuaXQpOworCX0gZWxzZSBpZiAobWQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CisJCXBhcnNlQmxvY2tTdGF0ZW1lbnRzKChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZCwgdW5pdCk7CisJfQorfQorLyoqCisgKiBQYXJzZSB0aGUgYmxvY2sgc3RhdGVtZW50cyBpbnNpZGUgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGFuZCB0cnkgdG8gY29tcGxldGUgYXQgdGhlCisgKiBjdXJzb3IgbG9jYXRpb24uCisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlQmxvY2tTdGF0ZW1lbnRzKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwkvL29ubHkgcGFyc2UgdGhlIG1ldGhvZCBib2R5IG9mIGNkCisJLy9maWxsIG91dCBpdHMgc3RhdGVtZW50cworCisJLy9jb252ZXJ0IGJ1Z3MgaW50byBwYXJzZSBlcnJvcgorCisJaW5pdGlhbGl6ZSgpOworCQorCS8vIHNpbXVsYXRlIGdvRm9yQ29uc3RydWN0b3JCb2R5IGV4Y2VwdCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmFsYW5jZSBicmFja2V0cyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBnb2luZyB0byBiZSBiYWxhbmNlZAorCWdvRm9yQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQoKTsKKworCXJlZmVyZW5jZUNvbnRleHQgPSBjZDsKKwljb21waWxhdGlvblVuaXQgPSB1bml0OworCisJc2Nhbm5lci5yZXNldFRvKGNkLmJvZHlTdGFydCwgYm9keUVuZChjZCkpOworCWNvbnN1bWVOZXN0ZWRNZXRob2QoKTsKKwl0cnkgeworCQlwYXJzZSgpOworCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKKwkJbGFzdEFjdCA9IEVSUk9SX0FDVElPTjsKKwl9Cit9CisvKioKKyAqIFBhcnNlIHRoZSBibG9jayBzdGF0ZW1lbnRzIGluc2lkZSB0aGUgZ2l2ZW4gaW5pdGlhbGl6ZXIgYW5kIHRyeSB0byBjb21wbGV0ZSBhdCB0aGUKKyAqIGN1cnNvciBsb2NhdGlvbi4KKyAqLworcHVibGljIHZvaWQgcGFyc2VCbG9ja1N0YXRlbWVudHMoCisJSW5pdGlhbGl6ZXIgaW5pLAorCVR5cGVEZWNsYXJhdGlvbiB0eXBlLCAKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisKKwlpbml0aWFsaXplKCk7CisKKwkvLyBzaW11bGF0ZSBnb0ZvckluaXRpYWxpemVyIGV4Y2VwdCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmFsYW5jZSBicmFja2V0cyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBnb2luZyB0byBiZSBiYWxhbmNlZAorCWdvRm9yQmxvY2tTdGF0ZW1lbnRzb3B0KCk7CisJCisJcmVmZXJlbmNlQ29udGV4dCA9IHR5cGU7CisJY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKKworCXNjYW5uZXIucmVzZXRUbyhpbmkuc291cmNlU3RhcnQsIGJvZHlFbmQoaW5pKSk7IC8vIGp1c3QgYWZ0ZXIgdGhlIGJlZ2lubmluZyB7CisJY29uc3VtZU5lc3RlZE1ldGhvZCgpOworCXRyeSB7CisJCXBhcnNlKCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgeworCQlsYXN0QWN0ID0gRVJST1JfQUNUSU9OOworCX0gZmluYWxseSB7CisJCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXS0tOworCX0KK30KKy8qKgorICogUGFyc2UgdGhlIGJsb2NrIHN0YXRlbWVudHMgaW5zaWRlIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIHRyeSB0byBjb21wbGV0ZSBhdCB0aGUKKyAqIGN1cnNvciBsb2NhdGlvbi4KKyAqLworcHVibGljIHZvaWQgcGFyc2VCbG9ja1N0YXRlbWVudHMoTWV0aG9kRGVjbGFyYXRpb24gbWQsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwkvL29ubHkgcGFyc2UgdGhlIG1ldGhvZCBib2R5IG9mIG1kCisJLy9maWxsIG91dCBtZXRob2Qgc3RhdGVtZW50cworCisJLy9jb252ZXJ0IGJ1Z3MgaW50byBwYXJzZSBlcnJvcgorCisJaWYgKG1kLmlzQWJzdHJhY3QoKSkKKwkJcmV0dXJuOworCWlmIChtZC5pc05hdGl2ZSgpKQorCQlyZXR1cm47CisJaWYgKChtZC5tb2RpZmllcnMgJiBBY2NTZW1pY29sb25Cb2R5KSAhPSAwKQorCQlyZXR1cm47CisKKwlpbml0aWFsaXplKCk7CisKKwkvLyBzaW11bGF0ZSBnb0Zvck1ldGhvZEJvZHkgZXhjZXB0IHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBiYWxhbmNlIGJyYWNrZXRzIGJlY2F1c2UgdGhleSBhcmUgbm90IGdvaW5nIHRvIGJlIGJhbGFuY2VkCisJZ29Gb3JCbG9ja1N0YXRlbWVudHNvcHQoKTsKKworCXJlZmVyZW5jZUNvbnRleHQgPSBtZDsKKwljb21waWxhdGlvblVuaXQgPSB1bml0OworCQorCXNjYW5uZXIucmVzZXRUbyhtZC5ib2R5U3RhcnQsIGJvZHlFbmQobWQpKTsgLy8gcmVzZXQgdGhlIHNjYW5uZXIgdG8gcGFyc2VyIGZyb20geyBkb3duIHRvIHRoZSBjdXJzb3IgbG9jYXRpb24KKwljb25zdW1lTmVzdGVkTWV0aG9kKCk7CisJdHJ5IHsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJCWxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CisJfSBmaW5hbGx5IHsKKwkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CQkKKwl9Cit9CisvKgorICogUHJlcGFyZXMgdGhlIHN0YXRlIG9mIHRoZSBwYXJzZXIgdG8gZ28gZm9yIEJsb2NrU3RhdGVtZW50cy4KKyAqLworcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckJsb2NrU3RhdGVtZW50cygpIHsKKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGUgPSAwXSA9IDE7CisJdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gPSAwOworCXRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHIgPSAxXSA9IDA7CisJdGhpcy5pbnZvY2F0aW9uUHRyID0gLTE7Cit9CisvKgorICogUHVzaGVzICdmYWxzZScgb24gdGhlIGluSW5pdGlhbGl6ZXJTdGFjay4KKyAqLworcHJvdGVjdGVkIHZvaWQgcHVzaE5vdEluSW5pdGlhbGl6ZXIoKSB7CisJdHJ5IHsKKwkJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1srK3RoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyXSA9IGZhbHNlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL2V4Y2VwdCBpbiB0ZXN0J3MgY2FzZXMsIGl0IHNob3VsZCBuZXZlciByYWlzZQorCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrLmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrICwgMCwgKHRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2sgPSBuZXcgYm9vbGVhbltvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSksIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0gPSBmYWxzZTsKKwl9Cit9CisvKgorICogUHVzaGVzICdmYWxzZScgb24gdGhlIGluTWV0aG9kU3RhY2suCisgKi8KK3Byb3RlY3RlZCB2b2lkIHB1c2hOb3RJbk1ldGhvZCgpIHsKKwl0cnkgeworCQl0aGlzLmluTWV0aG9kU3RhY2tbKyt0aGlzLmluTWV0aG9kUHRyXSA9IGZhbHNlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL2V4Y2VwdCBpbiB0ZXN0J3MgY2FzZXMsIGl0IHNob3VsZCBuZXZlciByYWlzZQorCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmluTWV0aG9kU3RhY2subGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaW5NZXRob2RTdGFjayAsIDAsICh0aGlzLmluTWV0aG9kU3RhY2sgPSBuZXcgYm9vbGVhbltvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XSksIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdID0gZmFsc2U7CisJfQorfQorLyoqCisgKiBQdXNoZXMgdGhlIGdpdmVuIHRoZSBnaXZlbiBzZWxlY3RvciAoYW4gaWRlbnRpZmllciBwb2ludGVyIHRvIHRoZSBpZGVudGlmaWVyIHN0YWNrKSBvbiB0aGUgc2VsZWN0b3Igc3RhY2suCisgKi8KK3Byb3RlY3RlZCB2b2lkIHB1c2hPblNlbGVjdG9yU3RhY2soaW50IHNlbGVjdG9ySWRQdHIpIHsKKwlpZiAodGhpcy5pbnZvY2F0aW9uUHRyIDwgLTEpIHJldHVybjsKKwl0cnkgeworCQl0aGlzLnNlbGVjdG9yU3RhY2tbKyt0aGlzLmludm9jYXRpb25QdHJdID0gc2VsZWN0b3JJZFB0cjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5zZWxlY3RvclN0YWNrLmxlbmd0aDsKKwkJaW50IG9sZFNlbGVjdG9yU3RhY2tbXSA9IHRoaXMuc2VsZWN0b3JTdGFjazsKKwkJdGhpcy5zZWxlY3RvclN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRTZWxlY3RvclN0YWNrLCAwLCB0aGlzLnNlbGVjdG9yU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5zZWxlY3RvclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl0gPSBzZWxlY3RvcklkUHRyOworCX0KK30KK3B1YmxpYyB2b2lkIHJlc2V0KCl7CisJdGhpcy5mbHVzaEFzc2lzdFN0YXRlKCk7Cit9CisvKgorICogUmVzZXQgY29udGV4dCBzbyBhcyB0byByZXN1bWUgdG8gcmVndWxhciBwYXJzZSBsb29wCisgKi8KK3Byb3RlY3RlZCB2b2lkIHJlc2V0U3RhY2tzKCkgeworCXN1cGVyLnJlc2V0U3RhY2tzKCk7CisJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0ciA9IDBdID0gZmFsc2U7CisJdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHIgPSAwXSA9IGZhbHNlOworfQorLyoKKyAqIFJlc2V0IGNvbnRleHQgc28gYXMgdG8gcmVzdW1lIHRvIHJlZ3VsYXIgcGFyc2UgbG9vcAorICogSWYgdW5hYmxlIHRvIHJlc2V0IGZvciByZXN1bWluZywgYW5zd2VycyBmYWxzZS4KKyAqCisgKiBNb3ZlIGNoZWNrcG9pbnQgbG9jYXRpb24sIHJlc2V0IGludGVybmFsIHN0YWNrcyBhbmQKKyAqIGRlY2lkZSB3aGljaCBncmFtbWFyIGdvYWwgaXMgYWN0aXZhdGVkLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVBZnRlclJlY292ZXJ5KCkgeworCisJLy8gcmVzZXQgaW50ZXJuYWwgc3RhY2tzIAorCWFzdFB0ciA9IC0xOworCWFzdExlbmd0aFB0ciA9IC0xOworCWV4cHJlc3Npb25QdHIgPSAtMTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyID0gLTE7CisJaWRlbnRpZmllclB0ciA9IC0xOwkKKwlpZGVudGlmaWVyTGVuZ3RoUHRyCT0gLTE7CisJaW50UHRyID0gLTE7CisJZGltZW5zaW9ucyA9IDAgOworCXJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPSAwOworCisJLy8gaWYgaW4gZGlldCBtb2RlLCByZXNldCB0aGUgZGlldCBjb3VudGVyIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gcmVzdGFydCBvdXRzaWRlIGFuIGluaXRpYWxpemVyLgorCWlmIChkaWV0KSBkaWV0SW50ID0gMDsKKworCS8qIGF0dGVtcHQgdG8gbW92ZSBjaGVja3BvaW50IGxvY2F0aW9uICovCisJaWYgKCF0aGlzLm1vdmVSZWNvdmVyeUNoZWNrcG9pbnQoKSkgcmV0dXJuIGZhbHNlOworCisJaW5pdEluTWV0aG9kQW5kSW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2soY3VycmVudEVsZW1lbnQpOworCisJLy8gb25seSBsb29rIGZvciBoZWFkZXJzCisJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbgorCQl8fCB0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCl7CisJCQorCQlpZihpbk1ldGhvZFN0YWNrW2luTWV0aG9kUHRyXSAmJgorCQkJaW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpICYmCisJCQl0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbAorCQkJKXsgCisJCQl0aGlzLnByZXBhcmVGb3JCbG9ja1N0YXRlbWVudHMoKTsKKwkJCWdvRm9yQmxvY2tTdGF0ZW1lbnRzT3JNZXRob2RIZWFkZXJzKCk7CisJCX0gZWxzZSB7CisJCQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZSA9IDBdID0gMDsKKwkJCXZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV0gPSAwOworCQkJcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyID0gMF0gPSAwOworCQkJZ29Gb3JIZWFkZXJzKCk7CisJCQlkaWV0ID0gdHJ1ZTsgLy8gcGFzc2VkIHRoaXMgcG9pbnQsIHdpbGwgbm90IGNvbnNpZGVyIG1ldGhvZCBib2RpZXMKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJCXx8IHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24peworCQkJCisJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeworCQkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGUgPSAwXSA9IDA7CisJCQl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdID0gMDsKKwkJCXJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0ciA9IDBdID0gMDsKKwkJCWdvRm9ySGVhZGVycygpOworCQl9IGVsc2UgeworCQkJdGhpcy5wcmVwYXJlRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CisJCQlnb0ZvckJsb2NrU3RhdGVtZW50c09yTWV0aG9kSGVhZGVycygpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZXN0YXJ0CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QXNzaXN0SWRlbnRpZmllcihjaGFyW10gYXNzaXN0SWRlbnQpOworLyoqCisgKiBJZiB0aGUgZ2l2ZW4gYXN0IG5vZGUgaXMgaW5zaWRlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwKKyAqIHRoZW4gd3JhcCBpdCB3aXRoIGEgZmFrZSBjb25zdHJ1Y3RvciBjYWxsLgorICogUmV0dXJucyB0aGUgd3JhcHBlZCBjb21wbGV0aW9uIG5vZGUgb3IgdGhlIGNvbXBsZXRpb24gbm9kZSBpdHNlbGYuCisgKi8KK3Byb3RlY3RlZCBBc3ROb2RlIHdyYXBXaXRoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxJZk5lZWRlZChBc3ROb2RlIGFzdCkgeworCWludCBzZWxlY3RvcjsKKwlpZiAoYXN0ICE9IG51bGwgJiYgdGhpcy5pbnZvY2F0aW9uUHRyID49IDAgJiYgYXN0IGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJgorCQkJKCgoc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXSkgPT0gVEhJU19DT05TVFJVQ1RPUikgfHwKKwkJCShzZWxlY3RvciA9PSBTVVBFUl9DT05TVFJVQ1RPUikpKSB7CisJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNhbGwgPSBuZXcgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoCisJCQkoc2VsZWN0b3IgPT0gVEhJU19DT05TVFJVQ1RPUikgPyAKKwkJCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzIDogCisJCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIKKwkJKTsKKwkJY2FsbC5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltdIHsoRXhwcmVzc2lvbilhc3R9OworCQljYWxsLnNvdXJjZVN0YXJ0ID0gYXN0LnNvdXJjZVN0YXJ0OworCQljYWxsLnNvdXJjZUVuZCA9IGFzdC5zb3VyY2VFbmQ7CisJCXJldHVybiBjYWxsOworCX0gZWxzZSB7CisJCXJldHVybiBhc3Q7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0VuZ2luZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGU1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvRW5naW5lLmphdmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uTm9kZUZvdW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Ob2RlRm91bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFkY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uTm9kZUZvdW5kLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uTm9kZUZvdW5kIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJcHVibGljIEJpbmRpbmcgYmluZGluZzsKK3B1YmxpYyBTZWxlY3Rpb25Ob2RlRm91bmQoKSB7CisJdGhpcyhudWxsKTsgLy8gd2UgZm91bmQgYSBwcm9ibGVtIGluIHRoZSBzZWxlY3Rpb24gbm9kZQorfQorcHVibGljIFNlbGVjdGlvbk5vZGVGb3VuZChCaW5kaW5nIGJpbmRpbmcpIHsKKwl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uQXJndW1lbnROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5ZmY1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uQXJndW1lbnROYW1lLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uQXJndW1lbnROYW1lIGV4dGVuZHMgQXJndW1lbnQgeworCXB1YmxpYyBTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZShjaGFyW10gbmFtZSAsIGxvbmcgcG9zTm9tICwgVHlwZVJlZmVyZW5jZSB0ciAsIGludCBtb2RpZmllcnMpeworCQlzdXBlcihuYW1lLCBwb3NOb20sIHRyLCBtb2RpZmllcnMpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJc3VwZXIucmVzb2x2ZShzY29wZSk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJfQorCQorCXB1YmxpYyB2b2lkIGJpbmQoTWV0aG9kU2NvcGUgc2NvcGUsIFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBib29sZWFuIHVzZWQpIHsKKwkJc3VwZXIuYmluZChzY29wZSwgdHlwZUJpbmRpbmcsIHVzZWQpOworCQkKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgKz0gIjxTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZToiOyAvLyROT04tTkxTLTEkCisJCWlmICh0eXBlICE9IG51bGwpIHMgKz0gdHlwZS50b1N0cmluZygpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCXMgKz0gbmV3IFN0cmluZyhuYW1lKCkpOworCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgcyArPSAiID0gIiArIGluaXRpYWxpemF0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOyAvLyROT04tTkxTLTEkCisJCXMgKz0gIj4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDMzODhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKKworLyoKKyAqIFNlbGVjdGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgY29udGFpbmluZyB0aGUgY3Vyc29yLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIFkuW3N0YXJ0XXN1cGVyW2VuZF0oMSwgMikKKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6WS5zdXBlcigxLCAyKT4KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXh0ZW5kcyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCB7CitwdWJsaWMgU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChpbnQgYWNjZXNzTW9kZSkgeworCXN1cGVyKGFjY2Vzc01vZGUpOworfQorcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJc3VwZXIucmVzb2x2ZShzY29wZSk7CisKKwkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJaWYgKGJpbmRpbmcgPT0gbnVsbCB8fCAKKwkJCSEoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8CisJCQkJYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlKSkKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOworCWVsc2UKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJcyArPSAiPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6IjsgLy8kTk9OLU5MUy0xJAorCWlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwpCisJCXMgPSBzICsgcXVhbGlmaWNhdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIjsgLy8kTk9OLU5MUy0xJAorCWlmIChhY2Nlc3NNb2RlID09IFRoaXMpIHsKKwkJcyA9IHMgKyAidGhpcygiOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIHsKKwkJcyA9IHMgKyAic3VwZXIoIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCQkJaWYgKGkgIT0gYXJndW1lbnRzLmxlbmd0aCAtIDEpIHsKKwkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisJcyArPSAiKT4iOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NGRmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CisKKy8qCisgKiBTZWxlY3Rpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhIGZpZWxkIHJlZmVyZW5jZSBjb250YWluaW5nIHRoZSBjdXJzb3IuCisgKiBlLmcuCisgKgorICoJY2xhc3MgWCB7CisgKiAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgYmFyKCkuW3N0YXJ0XWZyZWRbZW5kXQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICA8U2VsZWN0T25GaWVsZFJlZmVyZW5jZTpiYXIoKS5mcmVkPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICovCisgCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZSBleHRlbmRzIEZpZWxkUmVmZXJlbmNlIHsKK3B1YmxpYyBTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UgLCBsb25nIHBvcykgeworCXN1cGVyKHNvdXJjZSwgcG9zKTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCisJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCB8fCAKKwkJCQkhKGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSB8fCAKKwkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQorCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSkKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOworCWVsc2UKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7CisJcmV0dXJuIAkiPFNlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2U6IiAgLy8kTk9OLU5MUy0xJAorCQkJKyBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24oKSAKKwkJCSsgIj4iOyAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBhZjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFR5cGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25GaWVsZFR5cGUgZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uIHsKKwlwdWJsaWMgU2VsZWN0aW9uT25GaWVsZFR5cGUoVHlwZVJlZmVyZW5jZSB0eXBlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc291cmNlU3RhcnQgPSB0eXBlLnNvdXJjZVN0YXJ0OworCQl0aGlzLnNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLm5hbWUgPSBOb0NoYXI7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCQlyZXR1cm4gdHlwZS50b1N0cmluZyh0YWIpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmFkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKKworLyoKKyAqIFNlbGVjdGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGFuIGltcG9ydCByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgYXNzaXN0IGlkZW50aWZpZXIuCisgKiBlLmcuCisgKgorICogIGltcG9ydCBqYXZhLltzdGFydF1pb1tlbmRdLio7CisgKgljbGFzcyBYIHsKKyAqICAgIHZvaWQgZm9vKCkgeworICogICAgfQorICogIH0KKyAqCisgKgktLS0+IDxTZWxlY3RPbkltcG9ydDpqYXZhLmlvPgorICoJCSBjbGFzcyBYIHsKKyAqICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgIH0KKyAqICAgICAgIH0KKyAqCisgKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlIGV4dGVuZHMgSW1wb3J0UmVmZXJlbmNlIHsKKworcHVibGljIFNlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlKGNoYXJbXVtdIHRva2VucyAsIGxvbmdbXSBwb3NpdGlvbnMpIHsKKwlzdXBlcih0b2tlbnMsIHBvc2l0aW9ucywgZmFsc2UpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci4JYXBwZW5kKCI8U2VsZWN0T25JbXBvcnQ6Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7CisJCWlmIChpIDwgKHRva2Vucy5sZW5ndGggLSAxKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Mb2NhbE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTG9jYWxOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwNGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTG9jYWxOYW1lLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3Rpb25PbkxvY2FsTmFtZSBleHRlbmRzIExvY2FsRGVjbGFyYXRpb257CisJcHVibGljIFNlbGVjdGlvbk9uTG9jYWxOYW1lKEV4cHJlc3Npb24gZXhwciwgY2hhcltdIG5hbWUsCWludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCQlzdXBlcihleHByLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXN1cGVyLnJlc29sdmUoc2NvcGUpOworCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKKwkJcyArPSAiPFNlbGVjdGlvbk9uTG9jYWxOYW1lOiI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KSB7CisJCQlzICs9IG1vZGlmaWVyc1N0cmluZyhtb2RpZmllcnMpOworCQl9CisJCXMgKz0gdHlwZS50b1N0cmluZygwKSArICIgIiArIG5ldyBTdHJpbmcobmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgcyArPSAiID0gIiArIGluaXRpYWxpemF0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOyAvLyROT04tTkxTLTEkCisJCXMrPSAiPiI7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsJCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDg4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCisvKgorICogU2VsZWN0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYSBtZXNzYWdlIHNlbmQgY29udGFpbmluZyB0aGUgY3Vyc29yLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIHRoaXMuW3N0YXJ0XWJhcltlbmRdKDEsIDIpCisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gY2xhc3MgWCB7CisgKiAgICAgICAgIHZvaWQgZm9vKCkgeworICogICAgICAgICAgIDxTZWxlY3RPbk1lc3NhZ2VTZW5kOnRoaXMuYmFyKDEsIDIpPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhpc1JlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25NZXNzYWdlU2VuZCBleHRlbmRzIE1lc3NhZ2VTZW5kIHsKKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKKworCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJCWlmKGJpbmRpbmcgPT0gbnVsbCB8fAorCQkJCQkhKGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSB8fCAKKwkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZQorCQkJCQkJfHwgYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lCisJCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCkpIHsKKwkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKwkJU3RyaW5nIHMgPSAiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6IjsgLy8kTk9OLU5MUy0xJAorCQlpZiAocmVjZWl2ZXIgIT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpCisJCQlzID0gcyArIHJlY2VpdmVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIi4iOyAvLyROT04tTkxTLTEkCisJCXMgPSBzICsgbmV3IFN0cmluZyhzZWxlY3RvcikgKyAiKCI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCQkJCWlmIChpICE9IGFyZ3VtZW50cy5sZW5ndGggLSAxKSB7CisJCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX07CisJCX0KKwkJcyA9IHMgKyAiKT4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWI1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CisKKy8qCisgKiBTZWxlY3Rpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhbiBwYWNrYWdlIHN0YXRlbWVudCBjb250YWluaW5nIHRoZSBhc3Npc3QgaWRlbnRpZmllci4KKyAqIGUuZy4KKyAqCisgKiAgcGFja2FnZSBqYXZhLltzdGFydF1pb1tlbmRdOworICoJY2xhc3MgWCB7CisgKiAgICB2b2lkIGZvbygpIHsKKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiA8U2VsZWN0T25QYWNrYWdlOmphdmEuaW8+CisgKgkJIGNsYXNzIFggeworICogICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlIGV4dGVuZHMgSW1wb3J0UmVmZXJlbmNlIHsKK3B1YmxpYyBTZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zICwgbG9uZ1tdIHBvc2l0aW9ucykgeworCXN1cGVyKHRva2VucywgcG9zaXRpb25zLCB0cnVlKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYiwgYm9vbGVhbiB3aXRoT25EZW1hbmQpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLglhcHBlbmQoIjxTZWxlY3RPblBhY2thZ2U6Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7CisJCWlmIChpIDwgKHRva2Vucy5sZW5ndGggLSAxKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODI0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCisvKgorICogU2VsZWN0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uIGNvbnRhaW5pbmcgdGhlIGN1cnNvci4KKyAqIElmIHRoZSBhbGxvY2F0aW9uIGV4cHJlc3Npb24gaXMgbm90IHF1YWxpZmllZCwgdGhlIGVuY2xvc2luZ0luc3RhbmNlIGZpZWxkCisgKiBpcyBudWxsLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIG5ldyBbc3RhcnRdQmFyW2VuZF0oMSwgMikKKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IEJhcigxLCAyKT4KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworIAorcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiB7CitwdWJsaWMgU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpIHsKK30KK3B1YmxpYyBTZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91cykgeworCWFub255bW91c1R5cGUgPSBhbm9ueW1vdXMgOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisKKwkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJaWYgKGJpbmRpbmcgPT0gbnVsbCB8fCAKKwkJCSEoYmluZGluZy5pc1ZhbGlkQmluZGluZygpIHx8IAorCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwlpZiAoYW5vbnltb3VzVHlwZSA9PSBudWxsKQorCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCisJLy8gaWYgc2VsZWN0aW5nIGEgdHlwZSBmb3IgYW4gYW5vbnltb3VzIHR5cGUgY3JlYXRpb24sIHdlIGhhdmUgdG8KKwkvLyBmaW5kIGl0cyB0YXJnZXQgc3VwZXIgY29uc3RydWN0b3IgKGlmIGV4dGVuZGluZyBhIGNsYXNzKSBvciBpdHMgdGFyZ2V0IAorCS8vIHN1cGVyIGludGVyZmFjZSAoaWYgZXh0ZW5kaW5nIGFuIGludGVyZmFjZSkKKwlpZiAoYW5vbnltb3VzVHlwZS5iaW5kaW5nLnN1cGVySW50ZXJmYWNlcyA9PSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkvLyBmaW5kIHRoZSBjb25zdHJ1Y3RvciBiaW5kaW5nIGluc2lkZSB0aGUgc3VwZXIgY29uc3RydWN0b3IgY2FsbAorCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFub255bW91c1R5cGUuZGVjbGFyYXRpb25PZihiaW5kaW5nKTsKKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZyk7CisJfSBlbHNlIHsKKwkJLy8gb3BlbiBvbiB0aGUgb25seSBzdXBlcmludGVyZmFjZQorCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGFub255bW91c1R5cGUuYmluZGluZy5zdXBlckludGVyZmFjZXNbMF0pOworCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpIHsKKwlyZXR1cm4gCisJCSgodGhpcy5lbmNsb3NpbmdJbnN0YW5jZSA9PSBudWxsKSA/IAorCQkJIjxTZWxlY3RPbkFsbG9jYXRpb25FeHByZXNzaW9uOiIgOiAgLy8kTk9OLU5MUy0xJAorCQkJIjxTZWxlY3RPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOiIpICsgIC8vJE5PTi1OTFMtMSQKKwkJc3VwZXIudG9TdHJpbmdFeHByZXNzaW9uKHRhYikgKyAiPiI7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzZTEzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKKworLyoKKyAqIFNlbGVjdGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGFzc2lzdCBpZGVudGlmaWVyLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggeworICogICAgWSB5OworICogICAgdm9pZCBmb28oKSB7CisgKiAgICAgIHkuZnJlZC5bc3RhcnRdYmFbZW5kXQorICogICAgfQorICogIH0KKyAqCisgKgktLS0+IGNsYXNzIFggeworICogICAgICAgICBZIHk7CisgKiAgICAgICAgIHZvaWQgZm9vKCkgeworICogICAgICAgICAgIDxTZWxlY3RPbk5hbWU6eS5mcmVkLmJhPgorICogICAgICAgICB9CisgKiAgICAgICB9CisgKgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZE5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlIGV4dGVuZHMgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSB7CisJcHVibGljIGxvbmdbXSBzb3VyY2VQb3NpdGlvbnM7IC8vIHBvc2l0aW9ucyBvZiBlYWNoIHRva2VuLCB0aGUgbGFzdCBvbmUgYmVpbmcgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyCitwdWJsaWMgU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBzZWxlY3Rpb25JZGVudGlmaWVyLCBsb25nW10gcG9zaXRpb25zKSB7CisJc3VwZXIoCisJCUNoYXJPcGVyYXRpb24uYXJyYXlDb25jYXQocHJldmlvdXNJZGVudGlmaWVycywgc2VsZWN0aW9uSWRlbnRpZmllciksCisJCShpbnQpIChwb3NpdGlvbnNbMF0gPj4+IDMyKSwKKwkJKGludCkgcG9zaXRpb25zW3Bvc2l0aW9ucy5sZW5ndGggLSAxXSk7CisJdGhpcy5zb3VyY2VQb3NpdGlvbnMgPSBwb3NpdGlvbnM7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGl0IGNhbiBiZSBhIHBhY2thZ2UsIHR5cGUsIG1lbWJlciB0eXBlLCBsb2NhbCB2YXJpYWJsZSBvciBmaWVsZAorCWJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRva2VucywgdGhpcyk7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CisJCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQorCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSB7CisJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCX0KKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKKwkJCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCQl9CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZXNvbHZhYmxlUmVmZXJlbmNlKHRoaXMsIGJpbmRpbmcpOworCQl9CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwl9CisJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIjxTZWxlY3RPbk5hbWU6Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJaWYgKGkgIT0gbGVuZ3RoIC0gMSkKKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkOWZlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CisKKy8qCisgKiBTZWxlY3Rpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhIHF1YWxpZmllZCBzdXBlciByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgYXNzaXN0IGlkZW50aWZpZXIuCisgKiBlLmcuCisgKgorICoJY2xhc3MgWCBleHRlbmRzIFogeworICogICAgY2xhc3MgWSB7CisgKiAgICAJdm9pZCBmb28oKSB7CisgKiAgICAgIAlYLltzdGFydF1zdXBlcltlbmRdLmJhcigpOworICogICAgICB9CisgKiAgICB9CisgKiAgfQorICoKKyAqCS0tLT4gY2xhc3MgWCB7CisgKgkJICAgY2xhc3MgWSB7CisgKiAgICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgICA8U2VsZWN0T25RdWFsaWZpZWRTdXBlcjpYLnN1cGVyPgorICogICAgICAgICAgIH0KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRTdXBlclJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlIGV4dGVuZHMgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgeworcHVibGljIFNlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UoVHlwZVJlZmVyZW5jZSBuYW1lLCBpbnQgcG9zLCBpbnQgc291cmNlRW5kKSB7CisJc3VwZXIobmFtZSwgcG9zLCBzb3VyY2VFbmQpOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlUeXBlQmluZGluZyBiaW5kaW5nID0gc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCisJaWYgKGJpbmRpbmcgPT0gbnVsbCB8fCAhYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKCk7CisJZWxzZQorCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKKwkKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPFNlbGVjdE9uUXVhbGlmaWVkU3VwZXI6Iik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpKTsKKwlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGU5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CisKKy8qCisgKiBTZWxlY3Rpb24gbm9kZSBidWlsZCBieSB0aGUgcGFyc2VyIGluIGFueSBjYXNlIGl0IHdhcyBpbnRlbmRpbmcgdG8KKyAqIHJlZHVjZSBhIHR5cGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhcyBwYXJ0CisgKiBvZiBhIHF1YWxpZmllZCBuYW1lLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggZXh0ZW5kcyBqYXZhLmxhbmcuW3N0YXJ0XU9iamVjdFtlbmRdCisgKgorICoJLS0tPiBjbGFzcyBYIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpqYXZhLmxhbmcuT2JqZWN0PgorICoKKyAqLworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBleHRlbmRzIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgeworcHVibGljIFNlbGVjdGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzLCBjaGFyW10gc2VsZWN0aW9uSWRlbnRpZmllciwgbG9uZ1tdIHBvc2l0aW9ucykgeworCXN1cGVyKAorCQlDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHByZXZpb3VzSWRlbnRpZmllcnMsIHNlbGVjdGlvbklkZW50aWZpZXIpLAorCQlwb3NpdGlvbnMpOworfQorcHVibGljIHZvaWQgYWJvdXRUb1Jlc29sdmUoU2NvcGUgc2NvcGUpIHsKKwlnZXRUeXBlQmluZGluZyhzY29wZS5wYXJlbnQpOyAvLyBzdGVwIHVwIGZyb20gdGhlIENsYXNzU2NvcGUKK30KK3B1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgeworCS8vIGl0IGNhbiBiZSBhIHBhY2thZ2UsIHR5cGUgb3IgbWVtYmVyIHR5cGUKKwlCaW5kaW5nIGJpbmRpbmcgPSBzY29wZS5nZXRUeXBlT3JQYWNrYWdlKHRva2Vucyk7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKKwkJCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUpeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCQl9CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwl9CisKKwl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCI8U2VsZWN0T25UeXBlOiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKHRva2Vuc1tpXSk7CisJCWlmIChpICE9IGxlbmd0aCAtIDEpCisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJYnVmZmVyLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk5OGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCisvKgorICogU2VsZWN0aW9uIG5vZGUgYnVpbGQgYnkgdGhlIHBhcnNlciBpbiBhbnkgY2FzZSBpdCB3YXMgaW50ZW5kaW5nIHRvCisgKiByZWR1Y2UgYSBzaW5nbGUgbmFtZSByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgYXNzaXN0IGlkZW50aWZpZXIuCisgKiBlLmcuCisgKgorICoJY2xhc3MgWCB7CisgKiAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgW3N0YXJ0XWJhW2VuZF0KKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqICAgICAgICAgdm9pZCBmb28oKSB7CisgKiAgICAgICAgICAgPFNlbGVjdE9uTmFtZTpiYT4KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisgCitwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlIGV4dGVuZHMgU2luZ2xlTmFtZVJlZmVyZW5jZSB7CitwdWJsaWMgU2VsZWN0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7CisJc3VwZXIoc291cmNlLCBwb3MpOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBpdCBjYW4gYmUgYSBwYWNrYWdlLCB0eXBlLCBtZW1iZXIgdHlwZSwgbG9jYWwgdmFyaWFibGUgb3IgZmllbGQKKwliaW5kaW5nID0gc2NvcGUuZ2V0QmluZGluZyh0b2tlbiwgVkFSSUFCTEUgfCBUWVBFIHwgUEFDS0FHRSwgdGhpcyk7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nKSB7CisJCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJCQlpZiAoYmluZGluZy5wcm9ibGVtSWQoKSA9PSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZQorCQkJCQl8fCBiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KXsKKwkJCQl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworCQkJfQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpOworCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgeworCQkJLy8gdG9sZXJhdGUgc29tZSBlcnJvciBjYXNlcworCQkJaWYgKGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSl7CisJCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCX0JCQkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisJCX0gZWxzZSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgYmluZGluZyk7CisJCX0KKwkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOworCX0KKworCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKwlyZXR1cm4gIjxTZWxlY3RPbk5hbWU6IiArIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIj4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5NTVhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKKworLyoKKyAqIFNlbGVjdGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGEgdHlwZSByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgc2VsZWN0aW9uIGlkZW50aWZpZXIgYXMgYSBzaW5nbGUKKyAqIG5hbWUgcmVmZXJlbmNlLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggZXh0ZW5kcyBbc3RhcnRdT2JqZWN0W2VuZF0KKyAqCisgKgktLS0+IGNsYXNzIFggZXh0ZW5kcyA8U2VsZWN0T25UeXBlOk9iamVjdD4KKyAqCisgKi8KKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVUeXBlUmVmZXJlbmNlIHsKK3B1YmxpYyBTZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKwlzdXBlcihzb3VyY2UsIHBvcyk7Cit9CitwdWJsaWMgdm9pZCBhYm91dFRvUmVzb2x2ZShTY29wZSBzY29wZSkgeworCWdldFR5cGVCaW5kaW5nKHNjb3BlLnBhcmVudCk7IC8vIHN0ZXAgdXAgZnJvbSB0aGUgQ2xhc3NTY29wZQorfQorcHVibGljIFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKSB7CisJLy8gaXQgY2FuIGJlIGEgcGFja2FnZSwgdHlwZSBvciBtZW1iZXIgdHlwZQorCUJpbmRpbmcgYmluZGluZyA9IHNjb3BlLmdldFR5cGVPclBhY2thZ2UobmV3IGNoYXJbXVtdIHt0b2tlbn0pOworCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwl9CisKKwl0aHJvdyBuZXcgU2VsZWN0aW9uTm9kZUZvdW5kKGJpbmRpbmcpOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlRW5jbG9zaW5nKEJsb2NrU2NvcGUgc2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCXN1cGVyLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCBlbmNsb3NpbmdUeXBlKTsKKworCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCisJCWlmIChiaW5kaW5nID09IG51bGwgfHwgCisJCQkJIShiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwgCisJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwllbHNlCisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKXsKKworCXJldHVybiAiPFNlbGVjdE9uVHlwZToiICsgbmV3IFN0cmluZyh0b2tlbikgKyAiPiIgOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJlMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKKworLyoKKyAqIFNlbGVjdGlvbiBub2RlIGJ1aWxkIGJ5IHRoZSBwYXJzZXIgaW4gYW55IGNhc2UgaXQgd2FzIGludGVuZGluZyB0bworICogcmVkdWNlIGEgc3VwZXIgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGFzc2lzdCBpZGVudGlmaWVyLgorICogZS5nLgorICoKKyAqCWNsYXNzIFggZXh0ZW5kcyBaIHsKKyAqICAgIGNsYXNzIFkgeworICogICAgCXZvaWQgZm9vKCkgeworICogICAgICAJW3N0YXJ0XXN1cGVyW2VuZF0uYmFyKCk7CisgKiAgICAgIH0KKyAqICAgIH0KKyAqICB9CisgKgorICoJLS0tPiBjbGFzcyBYIHsKKyAqCQkgICBjbGFzcyBZIHsKKyAqICAgICAgICAgICB2b2lkIGZvbygpIHsKKyAqICAgICAgICAgICAgIDxTZWxlY3RPblF1YWxpZmllZFN1cGVyOnN1cGVyPgorICogICAgICAgICAgIH0KKyAqICAgICAgICAgfQorICogICAgICAgfQorICoKKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdXBlclJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UgZXh0ZW5kcyBTdXBlclJlZmVyZW5jZSB7CisKK3B1YmxpYyBTZWxlY3Rpb25PblN1cGVyUmVmZXJlbmNlKGludCBwb3MsIGludCBzb3VyY2VFbmQpIHsKKwlzdXBlcihwb3MsIHNvdXJjZUVuZCk7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisKKwlpZiAoYmluZGluZyA9PSBudWxsIHx8ICFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKKwllbHNlCisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCisJcmV0dXJuICI8U2VsZWN0T25TdXBlcjoiK3N1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpKyI+IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzFiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YQpAQCAtMCwwICsxLDY4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCisvKgorICogUGFyc2VyIGFibGUgdG8gYnVpbGQgc3BlY2lmaWMgY29tcGxldGlvbiBwYXJzZSBub2RlcywgZ2l2ZW4gYSBjdXJzb3JMb2NhdGlvbi4KKyAqCisgKiBDdXJzb3IgbG9jYXRpb24gZGVub3RlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGJlaGluZCB3aGljaCBjb21wbGV0aW9uCisgKiBnb3QgcmVxdWVzdGVkOgorICogIC0xIG1lYW5zIGNvbXBsZXRpb24gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UKKyAqCTAgIG1lYW5zIGNvbXBsZXRpb24gYmVoaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqICBuICBtZWFucyBjb21wbGV0aW9uIGJlaGluZCB0aGUgbi10aCBjaGFyYWN0ZXIKKyAqLworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFNlbGVjdGlvblBhcnNlciBleHRlbmRzIEFzc2lzdFBhcnNlciB7CisKKwkvKiBwdWJsaWMgZmllbGRzICovCisKKwlwdWJsaWMgaW50IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQ7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTVVBFUiA9ICJzdXBlciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFRISVMgPSAidGhpcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQorcHVibGljIFNlbGVjdGlvblBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIGFzc2VydE1vZGUpIHsKKwlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIGFzc2VydE1vZGUpOworfQorcHVibGljIGNoYXJbXSBhc3Npc3RJZGVudGlmaWVyKCl7CisJcmV0dXJuICgoU2VsZWN0aW9uU2Nhbm5lcilzY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOworfQorcHJvdGVjdGVkIHZvaWQgYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKXsKKwlpZiAoaXNPcnBoYW5Db21wbGV0aW9uTm9kZSl7CisJCUFzdE5vZGUgb3JwaGFuID0gdGhpcy5hc3Npc3ROb2RlOworCQlpc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CisJCQorCQkKKwkJLyogaWYgaW4gY29udGV4dCBvZiBhIHR5cGUsIHRoZW4gcGVyc2lzdHMgdGhlIGlkZW50aWZpZXIgaW50byBhIGZha2UgZmllbGQgcmV0dXJuIHR5cGUgKi8KKwkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CisJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KKwkJCWlmIChyZWNvdmVyZWRUeXBlLmZvdW5kT3BlbmluZ0JyYWNlKSB7CisJCQkJLyogZ2VuZXJhdGUgYSBwc2V1ZG8gZmllbGQgd2l0aCBhIGNvbXBsZXRpb24gb24gdHlwZSByZWZlcmVuY2UgKi8JCisJCQkJaWYgKG9ycGhhbiBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpeworCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChuZXcgU2VsZWN0aW9uT25GaWVsZFR5cGUoKFR5cGVSZWZlcmVuY2Upb3JwaGFuKSwgMCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KXdyYXBXaXRoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxJZk5lZWRlZChvcnBoYW4pOworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQljdXJyZW50VG9rZW4gPSAwOyAvLyBnaXZlbiB3ZSBhcmUgbm90IG9uIGFuIGVvZiwgd2UgZG8gbm90IHdhbnQgc2lkZSBlZmZlY3RzIGNhdXNlZCBieSBsb29rZWQtYWhlYWQgdG9rZW4KKwl9Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBjaGVja1JlY292ZXJlZFR5cGUoKSB7CisJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CisJCS8qIGNoZWNrIGlmIGN1cnJlbnQgYXdhaXRpbmcgaWRlbnRpZmllciBpcyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyICovCisJCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSByZXR1cm4gZmFsc2U7CisKKwkJaWYgKChsYXN0RXJyb3JFbmRQb3NpdGlvbiA+PSBzZWxlY3Rpb25TdGFydCkKKwkJCSYmIChsYXN0RXJyb3JFbmRQb3NpdGlvbiA8PSBzZWxlY3Rpb25FbmQrMSkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKWN1cnJlbnRFbGVtZW50OworCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCisJCWlmIChyZWNvdmVyZWRUeXBlLmZvdW5kT3BlbmluZ0JyYWNlKSB7CisJCQl0aGlzLmFzc2lzdE5vZGUgPSB0aGlzLmdldFR5cGVSZWZlcmVuY2UoMCk7CisJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CisJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7CisJCisJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorCisJLy8gQ2xhc3NCb2R5b3B0IHByb2R1Y2VzIGEgbnVsbCBpdGVtIG9uIHRoZSBhc3RTdGFrIGlmIGl0IHByb2R1Y2VzIE5PIGNsYXNzIGJvZHkKKwkvLyBBbiBlbXB0eSBjbGFzcyBib2R5IHByb2R1Y2VzIGEgMCBvbiB0aGUgbGVuZ3RoIHN0YWNrLi4uLi4KKworCWludCBsZW5ndGg7CisJaWYgKCgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyXSkgPT0gMSkKKwkJJiYgKGFzdFN0YWNrW2FzdFB0cl0gPT0gbnVsbCkpIHsKKworCQlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQkJc3VwZXIuY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGFsd2F5c1F1YWxpZmllZCk7CisJCQlyZXR1cm47CisJCX0KKwkJUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2M7CisJCWFzdFB0ci0tOworCQlhc3RMZW5ndGhQdHItLTsKKwkJYWxsb2MgPSBuZXcgU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQlhbGxvYy5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsgLy90aGUgcG9zaXRpb24gaGFzIGJlZW4gc3RvcmVkIGV4cGxpY2l0bHkKKworCQlpZiAoKGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZXhwcmVzc2lvblN0YWNrLCAKKwkJCQlleHByZXNzaW9uUHRyICsgMSwgCisJCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCisJCQkJMCwgCisJCQkJbGVuZ3RoKTsgCisJCX0KKwkJLy8gdHJpY2sgdG8gYXZvaWQgY3JlYXRpbmcgYSBzZWxlY3Rpb24gb24gdHlwZSByZWZlcmVuY2UKKwkJY2hhciBbXSBvbGRJZGVudCA9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpOworCQl0aGlzLnNldEFzc2lzdElkZW50aWZpZXIobnVsbCk7CQkJCisJCWFsbG9jLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCQl0aGlzLnNldEFzc2lzdElkZW50aWZpZXIob2xkSWRlbnQpOworCQkKKwkJLy90aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudAorCQkvL3dpbGwgYmUgY3JlYXRlZCBhbmQgYWRkZWQgYnkgdGhlIFRDIChzZWUgY3JlYXRlc0ludGVybmFsQ29uc3RydWN0b3JXaXRoQmluZGluZykKKwkJYWxsb2Muc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhhbGxvYyk7CisKKwkJdGhpcy5hc3Npc3ROb2RlID0gYWxsb2M7CisJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbGxvYy5zb3VyY2VFbmQgKyAxOworCQlpZiAoIWRpZXQpeworCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKKwkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwkJfQorCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCX0gZWxzZSB7CisJCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihhbHdheXNRdWFsaWZpZWQpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCkgeworCS8vIEFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0CisJLy8gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0CisKKwlzdXBlci5jb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsKKworCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJaWYgKGFsbG9jLnR5cGUgPT0gYXNzaXN0Tm9kZSl7CisJCWlmICghZGlldCl7CisJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQl9CisJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgeworCS8vIEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSAkZW1wdHkKKworCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CisJCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOworCQlyZXR1cm47CisJfQorCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jOworCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGUgPSAKKwkJbmV3IEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsgCisJYWxsb2MgPSAKKwkJYW5vbnltb3VzVHlwZS5hbGxvY2F0aW9uID0gbmV3IFNlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oYW5vbnltb3VzVHlwZSk7IAorCW1hcmtDdXJyZW50TWV0aG9kV2l0aExvY2FsVHlwZSgpOworCXB1c2hPbkFzdFN0YWNrKGFub255bW91c1R5cGUpOworCisJYWxsb2Muc291cmNlRW5kID0gclBhcmVuUG9zOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQorCWludCBhcmd1bWVudExlbmd0aDsKKwlpZiAoKGFyZ3VtZW50TGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBhcmd1bWVudExlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWV4cHJlc3Npb25TdGFjaywgCisJCQlleHByZXNzaW9uUHRyICsgMSwgCisJCQlhbGxvYy5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvblthcmd1bWVudExlbmd0aF0sIAorCQkJMCwgCisJCQlhcmd1bWVudExlbmd0aCk7IAorCX0KKwkvLyB0cmljayB0byBhdm9pZCBjcmVhdGluZyBhIHNlbGVjdGlvbiBvbiB0eXBlIHJlZmVyZW5jZQorCWNoYXIgW10gb2xkSWRlbnQgPSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKTsKKwl0aGlzLnNldEFzc2lzdElkZW50aWZpZXIobnVsbCk7CQkJCisJYWxsb2MudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJdGhpcy5zZXRBc3Npc3RJZGVudGlmaWVyKG9sZElkZW50KTsJCQorCisJYW5vbnltb3VzVHlwZS5zb3VyY2VFbmQgPSBhbGxvYy5zb3VyY2VFbmQ7CisJLy9wb3NpdGlvbiBhdCB0aGUgdHlwZSB3aGlsZSBpdCBpbXBhY3RzIHRoZSBhbm9ueW1vdXMgZGVjbGFyYXRpb24KKwlhbm9ueW1vdXNUeXBlLnNvdXJjZVN0YXJ0ID0gYW5vbnltb3VzVHlwZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gYWxsb2MudHlwZS5zb3VyY2VTdGFydDsKKwlhbGxvYy5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soYWxsb2MpOworCisJYXNzaXN0Tm9kZSA9IGFsbG9jOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhbGxvYy5zb3VyY2VFbmQgKyAxOworCWlmICghZGlldCl7CisJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwl9CisJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCisJYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCisJbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKKwkJbGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoYW5vbnltb3VzVHlwZSwgMCk7IC8vIHRoZSByZWNvdmVyeVRva2VuQ2hlY2sgd2lsbCBkZWFsIHdpdGggdGhlIG9wZW4gYnJhY2UKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyVmFyaWFibGUoKSB7CisJLy8gRW50ZXJWYXJpYWJsZSA6Oj0gJGVtcHR5CisJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisKKwlzdXBlci5jb25zdW1lRW50ZXJWYXJpYWJsZSgpOworCisJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwlpZiAodmFyaWFibGUudHlwZSA9PSBhc3Npc3ROb2RlKXsKKwkJaWYgKCFkaWV0KXsKKwkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCX0KKwkJaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IGZhbHNlOyAvLyBhbHJlYWR5IGF0dGFjaGVkIGluc2lkZSB2YXJpYWJsZSBkZWNsCisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCkgeworCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsKKwkKKwkvLyBkb2VzIG5vdCBrZWVwIHRoZSBpbml0aWFsaXphdGlvbiBpZiBzZWxlY3Rpb24gaXMgbm90IGluc2lkZQorCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSA9IChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJaW50IHN0YXJ0ID0gdmFyaWFibGUuaW5pdGlhbGl6YXRpb24uc291cmNlU3RhcnQ7CisJaW50IGVuZCA9ICB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7CisJaWYgKChzZWxlY3Rpb25TdGFydCA8IHN0YXJ0KSAmJiAgKHNlbGVjdGlvbkVuZCA8IHN0YXJ0KSB8fAorCQkoc2VsZWN0aW9uU3RhcnQgPiBlbmQpICYmIChzZWxlY3Rpb25FbmQgPiBlbmQpKSB7CisJCXZhcmlhYmxlLmluaXRpYWxpemF0aW9uID0gbnVsbDsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGaWVsZEFjY2Vzcyhib29sZWFuIGlzU3VwZXJBY2Nlc3MpIHsKKwkvLyBGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInCisJLy8gRmllbGRBY2Nlc3MgOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJworCisJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwkJc3VwZXIuY29uc3VtZUZpZWxkQWNjZXNzKGlzU3VwZXJBY2Nlc3MpOworCQlyZXR1cm47CisJfSAKKwlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSA9IAorCQluZXcgU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZSgKKwkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCisJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJaWYgKGlzU3VwZXJBY2Nlc3MpIHsgLy9jb25zaWRlcmF0ZXMgdGhlIGZpZWxkUmVmZXJlbmNlZXJlbmNlIGJlZ2lubmluZyBhdCB0aGUgJ3N1cGVyJyAuLi4uCQorCQlmaWVsZFJlZmVyZW5jZS5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoZmllbGRSZWZlcmVuY2Uuc291cmNlU3RhcnQsIGVuZFBvc2l0aW9uKTsKKwkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGZpZWxkUmVmZXJlbmNlKTsKKwl9IGVsc2UgeyAvL29wdGltaXplIHB1c2gvcG9wCisJCWlmICgoZmllbGRSZWZlcmVuY2UucmVjZWl2ZXIgPSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0pLmlzVGhpcygpKSB7IC8vZmllbGRSZWZlcmVuY2VlcmVuY2UgYmVnaW5zIGF0IHRoZSB0aGlzCisJCQlmaWVsZFJlZmVyZW5jZS5zb3VyY2VTdGFydCA9IGZpZWxkUmVmZXJlbmNlLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OworCQl9CisJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGZpZWxkUmVmZXJlbmNlOworCX0KKwlhc3Npc3ROb2RlID0gZmllbGRSZWZlcmVuY2U7CisJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGZpZWxkUmVmZXJlbmNlLnNvdXJjZUVuZCArIDE7CisJaWYgKCFkaWV0KXsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKKwkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisJfQorCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpIHsKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCkgeworCQlzdXBlci5jb25zdW1lRm9ybWFsUGFyYW1ldGVyKCk7CisJfSBlbHNlIHsKKworCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJCWNoYXJbXSBuYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCQlsb25nIG5hbWVQb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCQlUeXBlUmVmZXJlbmNlIHR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSArIGludFN0YWNrW2ludFB0ci0tXSk7CisJCWludFB0ciAtPSAyOworCQlBcmd1bWVudCBhcmcgPSAKKwkJCW5ldyBTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZSgKKwkJCQluYW1lLCAKKwkJCQluYW1lUG9zaXRpb25zLCAKKwkJCQl0eXBlLCAKKwkJCQlpbnRTdGFja1tpbnRQdHIgKyAxXSAmIH5BY2NEZXByZWNhdGVkKTsgLy8gbW9kaWZpZXJzCisJCXB1c2hPbkFzdFN0YWNrKGFyZyk7CisJCQorCQlhc3Npc3ROb2RlID0gYXJnOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gKGludCkgbmFtZVBvc2l0aW9uczsKKwkJaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJCQorCQlpZiAoIWRpZXQpeworCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKKwkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwkJfQorCisJCS8qIGlmIGluY29tcGxldGUgbWV0aG9kIGhlYWRlciwgbGlzdExlbmd0aCBjb3VudGVyIHdpbGwgbm90IGhhdmUgYmVlbiByZXNldCwKKwkJCWluZGljYXRpbmcgdGhhdCBzb21lIGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjayAqLworCQlsaXN0TGVuZ3RoKys7CisJfSAJCit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24oaW50IG9wKSB7CisJaWYgKGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CisJCXN1cGVyLmNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihvcCk7CisJfSBlbHNlIHsKKwkJZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpIHsKKwkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisKKwkvLyB3aGVuIHRoZSBuYW1lIGlzIG9ubHkgYW4gaWRlbnRpZmllci4uLndlIGhhdmUgYSBtZXNzYWdlIHNlbmQgdG8gInRoaXMiIChpbXBsaWNpdCkKKworCWNoYXJbXSBzZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKKwlpbnQgYWNjZXNzTW9kZTsKKwlpZihzZWxlY3RvciA9PSB0aGlzLmFzc2lzdElkZW50aWZpZXIoKSkgeworCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgU1VQRVIpKSB7CisJCQlhY2Nlc3NNb2RlID0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXI7CisJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgVEhJUykpIHsKKwkJCWFjY2Vzc01vZGUgPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzOworCQl9IGVsc2UgeworCQkJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsKKwkJcmV0dXJuOworCX0KKwkKKwlmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwgPSBuZXcgU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChhY2Nlc3NNb2RlKTsKKwljb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gclBhcmVuUG9zOworCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IChpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXSA+Pj4gMzIpOworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShleHByZXNzaW9uU3RhY2ssIGV4cHJlc3Npb25QdHIgKyAxLCBjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwl9CisKKwlpZiAoIWRpZXQpeworCQlwdXNoT25Bc3RTdGFjayhjb25zdHJ1Y3RvckNhbGwpOworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwl9IGVsc2UgeworCQlwdXNoT25FeHByZXNzaW9uU3RhY2sobmV3IEV4cHJlc3Npb24oKXsKKwkJCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQkJY29uc3RydWN0b3JDYWxsLnJlc29sdmUoc2NvcGUpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9KTsKKwl9CisJdGhpcy5hc3Npc3ROb2RlID0gY29uc3RydWN0b3JDYWxsOwkKKwl0aGlzLmxhc3RDaGVja1BvaW50ID0gY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCArIDE7CisJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpIHsKKwkvL29wdGltaXplIHRoZSBwdXNoL3BvcAorCS8vTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisKKwljaGFyW10gc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJaW50IGFjY2Vzc01vZGU7CisJaWYoc2VsZWN0b3IgPT0gdGhpcy5hc3Npc3RJZGVudGlmaWVyKCkpIHsKKwkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIFNVUEVSKSkgeworCQkJYWNjZXNzTW9kZSA9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyOworCQl9IGVsc2UgaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIFRISVMpKSB7CisJCQlhY2Nlc3NNb2RlID0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpczsKKwkJfSBlbHNlIHsKKwkJCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7CisJCXJldHVybjsKKwl9CisJCisJZmluYWwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY29uc3RydWN0b3JDYWxsID0gbmV3IFNlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoYWNjZXNzTW9kZSk7CisJY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHJQYXJlblBvczsKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoZXhwcmVzc2lvblN0YWNrLCBleHByZXNzaW9uUHRyICsgMSwgY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJfQorCWNvbnN0cnVjdG9yQ2FsbC5xdWFsaWZpY2F0aW9uID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV07CisJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gY29uc3RydWN0b3JDYWxsLnF1YWxpZmljYXRpb24uc291cmNlU3RhcnQ7CisJCisJaWYgKCFkaWV0KXsKKwkJcHVzaE9uQXN0U3RhY2soY29uc3RydWN0b3JDYWxsKTsKKwkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKKwkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CisJfSBlbHNlIHsKKwkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG5ldyBFeHByZXNzaW9uKCl7CisJCQlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQkJCWNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKHNjb3BlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSk7CisJfQorCQorCXRoaXMuYXNzaXN0Tm9kZSA9IGNvbnN0cnVjdG9yQ2FsbDsKKwl0aGlzLmxhc3RDaGVja1BvaW50ID0gY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCArIDE7CisJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKSB7CisJLy8gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lICcuJyAnKicKKwkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLworCisJaW50IGluZGV4OworCisJLyogbm8gbmVlZCB0byB0YWtlIGFjdGlvbiBpZiBub3QgaW5zaWRlIGFzc2lzdCBpZGVudGlmaWVycyAqLworCWlmICgoaW5kZXggPSBpbmRleE9mQXNzaXN0SWRlbnRpZmllcigpKSA8IDApIHsKKwkJc3VwZXIuY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOworCQlyZXR1cm47CisJfQorCS8qIHJldHJpZXZlIGlkZW50aWZpZXJzIHN1YnNldCBhbmQgd2hvbGUgcG9zaXRpb25zLCB0aGUgYXNzaXN0IG5vZGUgcG9zaXRpb25zCisJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLworCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJY2hhcltdW10gc3Vic2V0ID0gaWRlbnRpZmllclN1YlNldChpbmRleCsxKTsgLy8gaW5jbHVkZSB0aGUgYXNzaXN0SWRlbnRpZmllcgorCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCisJCWlkZW50aWZpZXJQdHIgKyAxLCAKKwkJcG9zaXRpb25zLCAKKwkJMCwgCisJCWxlbmd0aCk7IAorCisJLyogYnVpbGQgc3BlY2lmaWMgYXNzaXN0IG5vZGUgb24gaW1wb3J0IHN0YXRlbWVudCAqLworCUltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UgPSB0aGlzLmNyZWF0ZUFzc2lzdEltcG9ydFJlZmVyZW5jZShzdWJzZXQsIHBvc2l0aW9ucyk7CisJcmVmZXJlbmNlLm9uRGVtYW5kID0gdHJ1ZTsKKwlhc3Npc3ROb2RlID0gcmVmZXJlbmNlOworCXRoaXMubGFzdENoZWNrUG9pbnQgPSByZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKKwkKKwlwdXNoT25Bc3RTdGFjayhyZWZlcmVuY2UpOworCisJaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peworCQlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJfSBlbHNlIHsKKwkJcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID0gKGludCkgcG9zaXRpb25zW2xlbmd0aC0xXTsKKwl9CisJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOworCXJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCS8vIGZsdXNoIGFubm90YXRpb25zIGRlZmluZWQgcHJpb3IgdG8gaW1wb3J0IHN0YXRlbWVudHMKKwlyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLmZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhyZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWxhc3RDaGVja1BvaW50ID0gcmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKHJlZmVyZW5jZSwgMCk7CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJfQorfQorcHVibGljIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVBc3Npc3RJbXBvcnRSZWZlcmVuY2UoY2hhcltdW10gdG9rZW5zLCBsb25nW10gcG9zaXRpb25zKXsKKwlyZXR1cm4gbmV3IFNlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKK30KK3B1YmxpYyBJbXBvcnRSZWZlcmVuY2UgY3JlYXRlQXNzaXN0UGFja2FnZVJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMpeworCXJldHVybiBuZXcgU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKK30KK3Byb3RlY3RlZCBMb2NhbERlY2xhcmF0aW9uIGNyZWF0ZUxvY2FsRGVjbGFyYXRpb24oRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbixjaGFyW10gbmFtZSxpbnQgc291cmNlU3RhcnQsaW50IHNvdXJjZUVuZCkgeworCWlmICh0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CisJCXJldHVybiBzdXBlci5jcmVhdGVMb2NhbERlY2xhcmF0aW9uKGluaXRpYWxpemF0aW9uLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKwl9IGVsc2UgeworCQlTZWxlY3Rpb25PbkxvY2FsTmFtZSBsb2NhbCA9IG5ldyBTZWxlY3Rpb25PbkxvY2FsTmFtZShpbml0aWFsaXphdGlvbiwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJCXRoaXMuYXNzaXN0Tm9kZSA9IGxvY2FsOworCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gc291cmNlRW5kICsgMTsKKwkJaWYgKCFkaWV0KXsKKwkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCX0KKwkJcmV0dXJuIGxvY2FsOworCX0KK30KK3B1YmxpYyBOYW1lUmVmZXJlbmNlIGNyZWF0ZVF1YWxpZmllZEFzc2lzdE5hbWVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIG5hbWUsIGxvbmdbXSBwb3NpdGlvbnMpeworCXJldHVybiBuZXcgU2VsZWN0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlKAorCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLCAKKwkJCQkJbmFtZSwgCisJCQkJCXBvc2l0aW9ucyk7IAkKK30KK3B1YmxpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIG5hbWUsIGxvbmdbXSBwb3NpdGlvbnMpeworCXJldHVybiBuZXcgU2VsZWN0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKAorCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLCAKKwkJCQkJbmFtZSwgCisJCQkJCXBvc2l0aW9ucyk7IAkKK30KK3B1YmxpYyBOYW1lUmVmZXJlbmNlIGNyZWF0ZVNpbmdsZUFzc2lzdE5hbWVSZWZlcmVuY2UoY2hhcltdIG5hbWUsIGxvbmcgcG9zaXRpb24pIHsKKwlyZXR1cm4gbmV3IFNlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbik7Cit9CitwdWJsaWMgVHlwZVJlZmVyZW5jZSBjcmVhdGVTaW5nbGVBc3Npc3RUeXBlUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBsb25nIHBvc2l0aW9uKSB7CisJcmV0dXJuIG5ldyBTZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pOworfQorcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGRpZXRQYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBpbnQgc2VsZWN0aW9uU3RhcnQsIGludCBzZWxlY3Rpb25FbmQpIHsKKworCXRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDsKKwl0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDsJCisJU2VsZWN0aW9uU2Nhbm5lciBzZWxlY3Rpb25TY2FubmVyID0gKFNlbGVjdGlvblNjYW5uZXIpdGhpcy5zY2FubmVyOworCXNlbGVjdGlvblNjYW5uZXIuc2VsZWN0aW9uSWRlbnRpZmllciA9IG51bGw7CisJc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0OworCXNlbGVjdGlvblNjYW5uZXIuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kOwkKKwlyZXR1cm4gdGhpcy5kaWV0UGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQpOworfQorcHJvdGVjdGVkIE5hbWVSZWZlcmVuY2UgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKSB7CisJLyogYnVpbGQgYSAodW5zcGVjaWZpZWQpIE5hbWVSZWZlcmVuY2Ugd2hpY2ggbWF5IGJlIHF1YWxpZmllZCovCisKKwlpbnQgY29tcGxldGlvbkluZGV4OworCisJLyogbm8gbmVlZCB0byB0YWtlIGFjdGlvbiBpZiBub3QgaW5zaWRlIGNvbXBsZXRlZCBpZGVudGlmaWVycyAqLworCWlmICgoY29tcGxldGlvbkluZGV4ID0gaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPCAwKSB7CisJCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOworCX0KKworCWludCBsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl07CisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGFzc2lzdElkZW50aWZpZXIoKSwgU1VQRVIpKXsKKwkJUmVmZXJlbmNlIHJlZmVyZW5jZTsKKwkJaWYgKGNvbXBsZXRpb25JbmRleCA+IDApeyAvLyBxdWFsaWZpZWQgc3VwZXIKKwkJCS8vIGRpc2NhcmQgJ3N1cGVyJyBmcm9tIGlkZW50aWZpZXIgc3RhY2tzCisJCQlpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl0gPSBjb21wbGV0aW9uSW5kZXg7CisJCQlpbnQgcHRyID0gaWRlbnRpZmllclB0ciAtPSAobGVuZ3RoIC0gY29tcGxldGlvbkluZGV4KTsKKwkJCXJlZmVyZW5jZSA9IAorCQkJCW5ldyBTZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKAorCQkJCQlnZXRUeXBlUmVmZXJlbmNlKDApLCAKKwkJCQkJKGludCkoaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbcHRyKzFdID4+PiAzMiksCisJCQkJCShpbnQpIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3B0cisxXSk7CisJCX0gZWxzZSB7IC8vIHN0YW5kYXJkIHN1cGVyCisJCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJCXJlZmVyZW5jZSA9IG5ldyBTZWxlY3Rpb25PblN1cGVyUmVmZXJlbmNlKChpbnQpKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIrMV0gPj4+IDMyKSwgKGludCkgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cisxXSk7CisJCX0KKwkJcHVzaE9uQXN0U3RhY2socmVmZXJlbmNlKTsKKwkJdGhpcy5hc3Npc3ROb2RlID0gcmVmZXJlbmNlOwkKKwkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHJlZmVyZW5jZS5zb3VyY2VFbmQgKyAxOworCQlpZiAoIWRpZXQgfHwgZGlldEludCAhPSAwKXsKKwkJCXRoaXMucmVzdGFydFJlY292ZXJ5CT0gdHJ1ZTsJLy8gZm9yY2UgdG8gcmVzdGFydCBpbiByZWNvdmVyeSBtb2RlCisJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCQorCQl9CisJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJCXJldHVybiBuZXcgU2luZ2xlTmFtZVJlZmVyZW5jZShuZXcgY2hhclswXSwgMCk7IC8vIGR1bW15IHJlZmVyZW5jZQorCX0KKwlOYW1lUmVmZXJlbmNlIG5hbWVSZWZlcmVuY2U7CisJLyogcmV0cmlldmUgaWRlbnRpZmllcnMgc3Vic2V0IGFuZCB3aG9sZSBwb3NpdGlvbnMsIHRoZSBjb21wbGV0aW9uIG5vZGUgcG9zaXRpb25zCisJCXNob3VsZCBpbmNsdWRlIHRoZSBlbnRpcmUgcmVwbGFjZWQgc291cmNlLiAqLworCWNoYXJbXVtdIHN1YnNldCA9IGlkZW50aWZpZXJTdWJTZXQoY29tcGxldGlvbkluZGV4KTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weSgKKwkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAorCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCXBvc2l0aW9ucywgCisJCTAsIAorCQlsZW5ndGgpOworCS8qIGJ1aWxkIHNwZWNpZmljIGNvbXBsZXRpb24gb24gbmFtZSByZWZlcmVuY2UgKi8KKwlpZiAoY29tcGxldGlvbkluZGV4ID09IDApIHsKKwkJLyogY29tcGxldGlvbiBpbnNpZGUgZmlyc3QgaWRlbnRpZmllciAqLworCQluYW1lUmVmZXJlbmNlID0gdGhpcy5jcmVhdGVTaW5nbGVBc3Npc3ROYW1lUmVmZXJlbmNlKGFzc2lzdElkZW50aWZpZXIoKSwgcG9zaXRpb25zWzBdKTsKKwl9IGVsc2UgeworCQkvKiBjb21wbGV0aW9uIGluc2lkZSBzdWJzZXF1ZW50IGlkZW50aWZpZXIgKi8KKwkJbmFtZVJlZmVyZW5jZSA9IHRoaXMuY3JlYXRlUXVhbGlmaWVkQXNzaXN0TmFtZVJlZmVyZW5jZShzdWJzZXQsIGFzc2lzdElkZW50aWZpZXIoKSwgcG9zaXRpb25zKTsKKwl9CisJYXNzaXN0Tm9kZSA9IG5hbWVSZWZlcmVuY2U7CisJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG5hbWVSZWZlcmVuY2Uuc291cmNlRW5kICsgMTsKKwlpZiAoIWRpZXQpeworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJfQorCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJcmV0dXJuIG5hbWVSZWZlcmVuY2U7Cit9CisvKgorICogQ29weSBvZiBjb2RlIGZyb20gc3VwZXJjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlOgorICogSW4gdGhlIGNhc2Ugb2YgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIGlmIHRoZSBjdXJzb3IgbG9jYXRpb24gaXMgb24gdGhlIAorICogcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLCB0aGVuIGNyZWF0ZSBhIENvbXBsZXRpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UgCisgKiBpbnN0ZWFkLgorICovCitwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpIHsKKworCWludCBpbmRleCA9IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCk7CisJTmFtZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOworCisJaWYgKGluZGV4ID49IDApeworCQlpZiAoIWRpZXQpeworCQkJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkJPSB0cnVlOwkvLyBmb3JjZSB0byByZXN0YXJ0IGluIHJlY292ZXJ5IG1vZGUKKwkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJCX0KKwkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwl9CisJcmV0dXJuIHJlZmVyZW5jZTsKK30KK3B1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7CisJdGhpcy5zY2FubmVyID0gbmV3IFNlbGVjdGlvblNjYW5uZXIodGhpcy5hc3NlcnRNb2RlKTsKK30KK3Byb3RlY3RlZCBNZXNzYWdlU2VuZCBuZXdNZXNzYWdlU2VuZCgpIHsKKwkvLyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworCS8vIHRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBleHByZXNzaW9uIHN0YWNrCisKKwljaGFyW10gc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJaWYgKHNlbGVjdG9yICE9IHRoaXMuYXNzaXN0SWRlbnRpZmllcigpKXsKKwkJcmV0dXJuIHN1cGVyLm5ld01lc3NhZ2VTZW5kKCk7CisJfQkKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IG5ldyBTZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kKCk7CisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWV4cHJlc3Npb25QdHIgLT0gbGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJZXhwcmVzc2lvblN0YWNrLCAKKwkJCWV4cHJlc3Npb25QdHIgKyAxLCAKKwkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAorCQkJMCwgCisJCQlsZW5ndGgpOyAKKwl9OworCWFzc2lzdE5vZGUgPSBtZXNzYWdlU2VuZDsKKwlpZiAoIWRpZXQpeworCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJfQorCQorCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJcmV0dXJuIG1lc3NhZ2VTZW5kOworfQorcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlKElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsIGludCBzZWxlY3Rpb25TdGFydCwgaW50IHNlbGVjdGlvbkVuZCkgeworCisJdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0OworCXRoaXMuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kOwkKKwlTZWxlY3Rpb25TY2FubmVyIHNlbGVjdGlvblNjYW5uZXIgPSAoU2VsZWN0aW9uU2Nhbm5lcil0aGlzLnNjYW5uZXI7CisJc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25JZGVudGlmaWVyID0gbnVsbDsKKwlzZWxlY3Rpb25TY2FubmVyLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7CisJc2VsZWN0aW9uU2Nhbm5lci5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7CQorCXJldHVybiB0aGlzLnBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKK30KKy8qCisgKiBSZXNldCBjb250ZXh0IHNvIGFzIHRvIHJlc3VtZSB0byByZWd1bGFyIHBhcnNlIGxvb3AKKyAqIElmIHVuYWJsZSB0byByZXNldCBmb3IgcmVzdW1pbmcsIGFuc3dlcnMgZmFsc2UuCisgKgorICogTW92ZSBjaGVja3BvaW50IGxvY2F0aW9uLCByZXNldCBpbnRlcm5hbCBzdGFja3MgYW5kCisgKiBkZWNpZGUgd2hpY2ggZ3JhbW1hciBnb2FsIGlzIGFjdGl2YXRlZC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lQWZ0ZXJSZWNvdmVyeSgpIHsKKworCS8qIGlmIHJlYWNoZWQgYXNzaXN0IG5vZGUgaW5zaWRlIG1ldGhvZCBib2R5LCBidXQgc3RpbGwgaW5zaWRlIG5lc3RlZCB0eXBlLAorCQlzaG91bGQgY29udGludWUgaW4gZGlldCBtb2RlIHVudGlsIHRoZSBlbmQgb2YgdGhlIG1ldGhvZCBib2R5ICovCisJaWYgKHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsCisJCSYmICEocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSl7CisJCWN1cnJlbnRFbGVtZW50LnByZXNlcnZlRW5jbG9zaW5nQmxvY2tzKCk7CisJCWlmIChjdXJyZW50RWxlbWVudC5lbmNsb3NpbmdUeXBlKCkgPT0gbnVsbCl7CisJCQl0aGlzLnJlc2V0U3RhY2tzKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHN1cGVyLnJlc3VtZUFmdGVyUmVjb3ZlcnkoKTsJCQkKK30KKworcHVibGljIHZvaWQgc2VsZWN0aW9uSWRlbnRpZmllckNoZWNrKCl7CisJaWYgKGNoZWNrUmVjb3ZlcmVkVHlwZSgpKSByZXR1cm47Cit9CitwdWJsaWMgdm9pZCBzZXRBc3Npc3RJZGVudGlmaWVyKGNoYXJbXSBhc3Npc3RJZGVudCl7CisJKChTZWxlY3Rpb25TY2FubmVyKXNjYW5uZXIpLnNlbGVjdGlvbklkZW50aWZpZXIgPSBhc3Npc3RJZGVudDsKK30KKy8qCisgKiBVcGRhdGUgcmVjb3Zlcnkgc3RhdGUgYmFzZWQgb24gY3VycmVudCBwYXJzZXIvc2Nhbm5lciBzdGF0ZQorICovCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWNvdmVyeVN0YXRlKCkgeworCisJLyogZXhwb3NlIHBhcnNlciBzdGF0ZSB0byByZWNvdmVyeSBzdGF0ZSAqLworCWN1cnJlbnRFbGVtZW50LnVwZGF0ZUZyb21QYXJzZXJTdGF0ZSgpOworCisJLyogbWF5IGJlIGFibGUgdG8gcmV0cmlldmUgY29tcGxldGlvbk5vZGUgYXMgYW4gb3JwaGFuLCBhbmQgdGhlbiBhdHRhY2ggaXQgKi8KKwl0aGlzLnNlbGVjdGlvbklkZW50aWZpZXJDaGVjaygpOworCXRoaXMuYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKTsKKwkKKwkvKiBjaGVjayBhbmQgdXBkYXRlIHJlY292ZXJlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHRva2VuLAorCQl0aGlzIGFjdGlvbiBpcyBhbHNvIHBlcmZvcm1lZCB3aGVuIHNoaWZ0aW5nIHRva2VuIGFmdGVyIHJlY292ZXJ5CisJCWdvdCBhY3RpdmF0ZWQgb25jZS4gCisJKi8KKwl0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2Y4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25TY2FubmVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OworCisvKgorICogU2Nhbm5lciBhd2FyZSBvZiBhIHNlbGVjdGlvbiByYW5nZS4gSWYgZmluZGluZyBhbiBpZGVudGlmaWVyIHdoaWNoIHNvdXJjZSByYW5nZSBpcyBleGFjdGx5CisgKiB0aGUgc2FtZSwgdGhlbiB3aWxsIHJlY29yZCBpdCBzbyB0aGF0IHRoZSBwYXJzZXIgY2FuIG1ha2UgdXNlIG9mIGl0LgorICoKKyAqIFNvdXJjZSBwb3NpdGlvbnMgYXJlIHplcm8tYmFzZWQgYW5kIGluY2x1c2l2ZS4KKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3Rpb25TY2FubmVyIGV4dGVuZHMgU2Nhbm5lciB7CisKKwlwdWJsaWMgY2hhcltdIHNlbGVjdGlvbklkZW50aWZpZXI7CisJcHVibGljIGludCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kOworLyogCisgKiBUcnVuY2F0ZSB0aGUgY3VycmVudCBpZGVudGlmaWVyIGlmIGl0IGlzIGNvbnRhaW5pbmcgdGhlIGN1cnNvciBsb2NhdGlvbi4gU2luY2UgY29tcGxldGlvbiBpcyBwZXJmb3JtZWQKKyAqIG9uIGFuIGlkZW50aWZpZXIgcHJlZml4LgorICoKKyAqLworIAorcHVibGljIFNlbGVjdGlvblNjYW5uZXIoYm9vbGVhbiBhc3NlcnRNb2RlKSB7CisJc3VwZXIoZmFsc2UsIGZhbHNlLCBmYWxzZSwgYXNzZXJ0TW9kZSk7Cit9CisKK3B1YmxpYyBjaGFyW10gZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSB7CisKKwlpZiAoc2VsZWN0aW9uSWRlbnRpZmllciA9PSBudWxsKXsKKwkJaWYgKHNlbGVjdGlvblN0YXJ0ID09IHN0YXJ0UG9zaXRpb24gJiYgc2VsZWN0aW9uRW5kID09IGN1cnJlbnRQb3NpdGlvbi0xKXsKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKXsJCQkvLyBjaGVjayB1bmljb2RlIHNjZW5hcmlvCisJCQkJU3lzdGVtLmFycmF5Y29weSh3aXRob3V0VW5pY29kZUJ1ZmZlciwgMSwgc2VsZWN0aW9uSWRlbnRpZmllciA9IG5ldyBjaGFyW3dpdGhvdXRVbmljb2RlUHRyXSwgMCwgd2l0aG91dFVuaWNvZGVQdHIpOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbGVuZ3RoID0gY3VycmVudFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbjsKKwkJCQkvLyBubyBjaGFyW10gc2hhcmluZyBhcm91bmQgY29tcGxldGlvbklkZW50aWZpZXIsIHdlIHdhbnQgaXQgdG8gYmUgdW5pcXVlIHNvIGFzIHRvIHVzZSBpZGVudGl0eSBjaGVja3MJCisJCQkJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHN0YXJ0UG9zaXRpb24sIChzZWxlY3Rpb25JZGVudGlmaWVyID0gbmV3IGNoYXJbbGVuZ3RoXSksIDAsIGxlbmd0aCk7CisJCQl9CisJCQlyZXR1cm4gc2VsZWN0aW9uSWRlbnRpZmllcjsKKwkJfQorCX0KKwlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKK30KKy8qCisgKiBJbiBjYXNlIHdlIGFjdHVhbGx5IHJlYWQgYSBrZXl3b3JkIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzZWxlY3RlZAorICogcmFuZ2UsIHdlIHByZXRlbmQgd2UgcmVhZCBhbiBpZGVudGlmaWVyLgorICovCitwdWJsaWMgaW50IHNjYW5JZGVudGlmaWVyT3JLZXl3b3JkKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisKKwlpbnQgaWQgPSBzdXBlci5zY2FuSWRlbnRpZmllck9yS2V5d29yZCgpOworCisJLy8gY29udmVydCBjb21wbGV0ZWQga2V5d29yZCBpbnRvIGFuIGlkZW50aWZpZXIKKwlpZiAoaWQgIT0gVG9rZW5OYW1lSWRlbnRpZmllcgorCQkmJiBzdGFydFBvc2l0aW9uID09IHNlbGVjdGlvblN0YXJ0IAorCQkmJiBjdXJyZW50UG9zaXRpb24gPT0gc2VsZWN0aW9uRW5kKzEpeworCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwl9CisJcmV0dXJuIGlkOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lQcm9ibGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyMGMyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lQcm9ibGVtLmphdmEKQEAgLTAsMCArMSw0ODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBKYXZhIHByb2JsZW0sIGFzIGRldGVjdGVkIGJ5IHRoZSBjb21waWxlciBvciBzb21lIG9mIHRoZSB1bmRlcmx5aW5nCisgKiB0ZWNobm9sb2d5IHJldXNpbmcgdGhlIGNvbXBpbGVyLiAKKyAqIEEgcHJvYmxlbSBwcm92aWRlcyBhY2Nlc3MgdG86CisgKiA8dWw+CisgKiA8bGk+IGl0cyBsb2NhdGlvbiAob3JpZ2luYXRpbmcgc291cmNlIGZpbGUgbmFtZSwgc291cmNlIHBvc2l0aW9uLCBsaW5lIG51bWJlciksIDwvbGk+CisgKiA8bGk+IGl0cyBtZXNzYWdlIGRlc2NyaXB0aW9uIGFuZCBhIHByZWRpY2F0ZSB0byBjaGVjayBpdHMgc2V2ZXJpdHkgKHdhcm5pbmcgb3IgZXJyb3IpLiA8L2xpPgorICogPGxpPiBpdHMgSUQgOiBhbiBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHZlcnkgbmF0dXJlIG9mIHRoaXMgcHJvYmxlbS4gQWxsIHBvc3NpYmxlIElEcyBhcmUgbGlzdGVkCisgKiBhcyBjb25zdGFudHMgb24gdGhpcyBpbnRlcmZhY2UuIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBOb3RlOiB0aGUgY29tcGlsZXIgcHJvZHVjZXMgSVByb2JsZW1zIGludGVybmFsbHksIHdoaWNoIGFyZSB0dXJuZWQgaW50byBtYXJrZXJzIGJ5IHRoZSBKYXZhQnVpbGRlcgorICogc28gYXMgdG8gcGVyc2lzdCBwcm9ibGVtIGRlc2NyaXB0aW9ucy4gVGhpcyBleHBsYWlucyB3aHkgdGhlcmUgaXMgbm8gQVBJIGFsbG93aW5nIHRvIHJlYWNoIElQcm9ibGVtIGRldGVjdGVkCisgKiB3aGVuIGNvbXBpbGluZy4gSG93ZXZlciwgdGhlIEphdmEgcHJvYmxlbSBtYXJrZXJzIGNhcnJ5IGVxdWl2YWxlbnQgaW5mb3JtYXRpb24gdG8gSVByb2JsZW0sIGluIHBhcnRpY3VsYXIKKyAqIHRoZWlyIElEIChhdHRyaWJ1dGUgImlkIikgaXMgc2V0IHRvIG9uZSBvZiB0aGUgSURzIGRlZmluZWQgb24gdGhpcyBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJUHJvYmxlbSB7IAorCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMgcmVjb3JkZWQgaW50byB0aGUgcHJvYmxlbS4KKwkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMgcmVjb3JkZWQgaW50byB0aGUgcHJvYmxlbQorCSAqLworCVN0cmluZ1tdIGdldEFyZ3VtZW50cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvYmxlbSBpZAorCSAqIAorCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gaWQKKwkgKi8KKwlpbnQgZ2V0SUQoKTsKKworCS8qKgorCSAqIEFuc3dlciBhIGxvY2FsaXplZCwgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIHRoZSBwcm9ibGVtLgorCSAqIAorCSAqIEByZXR1cm4gYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbQorCSAqLworCVN0cmluZyBnZXRNZXNzYWdlKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB0aGUgcHJvYmxlbSB3YXMgZm91bmQuCisJICogCisJICogQHJldHVybiB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHRoZSBwcm9ibGVtIHdhcyBmb3VuZAorCSAqLworCWNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCk7CisJCisJLyoqCisJICogQW5zd2VyIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHByb2JsZW0gKGluY2x1c2l2ZSksIG9yIC0xIGlmIHVua25vd24uCisJICogCisJICogQHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtIChpbmNsdXNpdmUpLCBvciAtMSBpZiB1bmtub3duCisJICovCisJaW50IGdldFNvdXJjZUVuZCgpOworCisJLyoqCisJICogQW5zd2VyIHRoZSBsaW5lIG51bWJlciBpbiBzb3VyY2Ugd2hlcmUgdGhlIHByb2JsZW0gYmVnaW5zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluIHNvdXJjZSB3aGVyZSB0aGUgcHJvYmxlbSBiZWdpbnMKKwkgKi8KKwlpbnQgZ2V0U291cmNlTGluZU51bWJlcigpOworCisJLyoqCisJICogQW5zd2VyIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bgorCSAqLworCWludCBnZXRTb3VyY2VTdGFydCgpOworCisJLyoqCisJICogQ2hlY2tzIHRoZSBzZXZlcml0eSB0byBzZWUgaWYgdGhlIEVycm9yIGJpdCBpcyBzZXQuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBFcnJvciBiaXQgaXMgc2V0IGZvciB0aGUgc2V2ZXJpdHksIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNFcnJvcigpOworCisJLyoqCisJICogQ2hlY2tzIHRoZSBzZXZlcml0eSB0byBzZWUgaWYgdGhlIEVycm9yIGJpdCBpcyBub3Qgc2V0LgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIG5vdCBzZXQgZm9yIHRoZSBzZXZlcml0eSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBpc1dhcm5pbmcoKTsKKworCS8qKgorCSAqIFNldCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtIChpbmNsdXNpdmUpLCBvciAtMSBpZiB1bmtub3duLgorCSAqIFVzZWQgZm9yIHNoaWZ0aW5nIHByb2JsZW0gcG9zaXRpb25zLgorCSAqIAorCSAqIEBwYXJhbSBzb3VyY2VFbmQgdGhlIGdpdmVuIGVuZCBwb3NpdGlvbgorCSAqLworCXZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpOworCisJLyoqCisJICogU2V0IHRoZSBsaW5lIG51bWJlciBpbiBzb3VyY2Ugd2hlcmUgdGhlIHByb2JsZW0gYmVnaW5zLgorCSAqIAorCSAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBnaXZlbiBsaW5lIG51bWJlcgorCSAqLworCXZvaWQgc2V0U291cmNlTGluZU51bWJlcihpbnQgbGluZU51bWJlcik7CisKKwkvKioKKwkgKiBTZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtIChpbmNsdXNpdmUpLCBvciAtMSBpZiB1bmtub3duLgorCSAqIFVzZWQgZm9yIHNoaWZ0aW5nIHByb2JsZW0gcG9zaXRpb25zLgorCSAqIAorCSAqIEBwYXJhbSB0aGUgZ2l2ZW4gc3RhcnQgcG9zaXRpb24KKwkgKi8KKwl2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCk7CisJCisJLyoqCisJICogUHJvYmxlbSBDYXRlZ29yaWVzCisJICogVGhlIGhpZ2ggYml0cyBvZiBhIHByb2JsZW0gSUQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhdGVnb3J5IG9mIGEgcHJvYmxlbS4gCisJICogZS5nLiAocHJvYmxlbUlEICYgVHlwZVJlbGF0ZWQpICE9IDAsIGluZGljYXRlcyB0aGF0IHRoaXMgcHJvYmxlbSBpcyB0eXBlIHJlbGF0ZWQuCisJICogCisJICogQSBwcm9ibGVtIGNhdGVnb3J5IGNhbiBoZWxwIHRvIGltcGxlbWVudCBjdXN0b20gcHJvYmxlbSBmaWx0ZXJzLiBJbmRlZWQsIHdoZW4gbnVtZXJvdXMgcHJvYmxlbXMKKwkgKiBhcmUgbGlzdGVkLCBmb2N1c2luZyBvbiBpbXBvcnQgcmVsYXRlZCBwcm9ibGVtcyBmaXJzdCBtaWdodCBiZSByZWxldmFudC4KKwkgKiAKKwkgKiBXaGVuIGEgcHJvYmxlbSBpcyB0YWdnZWQgYXMgSW50ZXJuYWwsIGl0IG1lYW5zIHRoYXQgbm8gY2hhbmdlIG90aGVyIHRoYW4gYSBsb2NhbCBzb3VyY2UgY29kZSBjaGFuZ2UKKwkgKiBjYW4gIGZpeCB0aGUgY29ycmVzcG9uZGluZyBwcm9ibGVtLgorCSAqLworCWludCBUeXBlUmVsYXRlZCA9IDB4MDEwMDAwMDA7CisJaW50IEZpZWxkUmVsYXRlZCA9IDB4MDIwMDAwMDA7CisJaW50IE1ldGhvZFJlbGF0ZWQgPSAweDA0MDAwMDAwOworCWludCBDb25zdHJ1Y3RvclJlbGF0ZWQgPSAweDA4MDAwMDAwOworCWludCBJbXBvcnRSZWxhdGVkID0gMHgxMDAwMDAwMDsKKwlpbnQgSW50ZXJuYWwgPSAweDIwMDAwMDAwOworCWludCBTeW50YXggPSAgMHg0MDAwMDAwMDsKKwkKKwkvKioKKwkgKiBNYXNrIHRvIHVzZSBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHRoZSBjYXRlZ29yeSBwb3J0aW9uIG9mIHRoZSBwcm9ibGVtIElELgorCSAqLworCWludCBJZ25vcmVDYXRlZ29yaWVzTWFzayA9IDB4RkZGRkZGOworCisJLyoqCisJICogQmVsb3cgYXJlIGxpc3RlZCBhbGwgYXZhaWxhYmxlIHByb2JsZW0gSURzLiBOb3RlIHRoYXQgdGhpcyBsaXN0IGNvdWxkIGJlIGF1Z21lbnRlZCBpbiB0aGUgZnV0dXJlLCAKKwkgKiBhcyBuZXcgZmVhdHVyZXMgYXJlIGFkZGVkIHRvIHRoZSBKYXZhIGNvcmUgaW1wbGVtZW50YXRpb24uCisJICovCisKKwkvKioKKwkgKiBJRCByZXNlcnZlZCBmb3IgcmVmZXJlbmNpbmcgYW4gaW50ZXJuYWwgZXJyb3IgaW5zaWRlIHRoZSBKYXZhQ29yZSBpbXBsZW1lbnRhdGlvbiB3aGljaAorCSAqIG1heSBiZSBzdXJmYWNlZCBhcyBhIHByb2JsZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxhdGlvbiB1bml0IHdoaWNoIGNhdXNlZCBpdCB0byBvY2N1ci4KKwkgKi8KKwlpbnQgVW5jbGFzc2lmaWVkID0gMDsKKworCS8qKgorCSAqIEdlbmVyaWMgdHlwZSByZWxhdGVkIHByb2JsZW1zCisJICovCisJaW50IE9iamVjdEhhc05vU3VwZXJjbGFzcyA9IFR5cGVSZWxhdGVkICsgMTsKKwlpbnQgVW5kZWZpbmVkVHlwZSA9IFR5cGVSZWxhdGVkICsgMjsKKwlpbnQgTm90VmlzaWJsZVR5cGUgPSBUeXBlUmVsYXRlZCArIDM7CisJaW50IEFtYmlndW91c1R5cGUgPSBUeXBlUmVsYXRlZCArIDQ7CisJaW50IFVzaW5nRGVwcmVjYXRlZFR5cGUgPSBUeXBlUmVsYXRlZCArIDU7CisJaW50IEludGVybmFsVHlwZU5hbWVQcm92aWRlZCA9IFR5cGVSZWxhdGVkICsgNjsKKworCWludCBJbmNvbXBhdGlibGVUeXBlc0luRXF1YWxpdHlPcGVyYXRvciA9IFR5cGVSZWxhdGVkICsgMTU7CisJaW50IEluY29tcGF0aWJsZVR5cGVzSW5Db25kaXRpb25hbE9wZXJhdG9yID0gVHlwZVJlbGF0ZWQgKyAxNjsKKwlpbnQgVHlwZU1pc21hdGNoID0gVHlwZVJlbGF0ZWQgKyAxNzsKKworCS8qKgorCSAqIElubmVyIHR5cGVzIHJlbGF0ZWQgcHJvYmxlbXMKKwkgKi8KKwlpbnQgTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlRm9yQ29uc3RydWN0b3JDYWxsID0gVHlwZVJlbGF0ZWQgKyAyMDsKKwlpbnQgTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlID0gVHlwZVJlbGF0ZWQgKyAyMTsKKwlpbnQgSW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UgPSBUeXBlUmVsYXRlZCArIDIyOworCWludCBJbGxlZ2FsRW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uID0gVHlwZVJlbGF0ZWQgKyAyMzsgCisJaW50IENhbm5vdERlZmluZVN0YXRpY0luaXRpYWxpemVySW5Mb2NhbFR5cGUgPSBJbnRlcm5hbCArIDI0OworCWludCBPdXRlckxvY2FsTXVzdEJlRmluYWwgPSBJbnRlcm5hbCArIDI1OworCWludCBDYW5ub3REZWZpbmVJbnRlcmZhY2VJbkxvY2FsVHlwZSA9IEludGVybmFsICsgMjY7CisJaW50IElsbGVnYWxQcmltaXRpdmVPckFycmF5VHlwZUZvckVuY2xvc2luZ0luc3RhbmNlID0gVHlwZVJlbGF0ZWQgKyAyNzsKKwlpbnQgQW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzID0gVHlwZVJlbGF0ZWQgKyAyOTsKKworCS8vIHZhcmlhYmxlcworCWludCBVbmRlZmluZWROYW1lID0gNTA7CisJaW50IFVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlID0gSW50ZXJuYWwgKyA1MTsKKwlpbnQgVmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkID0gSW50ZXJuYWwgKyA1MjsKKwlpbnQgVmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkQXJyYXkgPSBJbnRlcm5hbCArIDUzOworCWludCBDYW5ub3RBbGxvY2F0ZVZvaWRBcnJheSA9IEludGVybmFsICsgNTQ7CisJLy8gbG9jYWwgdmFyaWFibGVzCisJaW50IFJlZGVmaW5lZExvY2FsID0gSW50ZXJuYWwgKyA1NTsKKwlpbnQgUmVkZWZpbmVkQXJndW1lbnQgPSBJbnRlcm5hbCArIDU2OworCWludCBEdXBsaWNhdGVGaW5hbExvY2FsSW5pdGlhbGl6YXRpb24gPSBJbnRlcm5hbCArIDU3OworCS8vIGZpbmFsIGxvY2FsIHZhcmlhYmxlcworCWludCBGaW5hbE91dGVyTG9jYWxBc3NpZ25tZW50ID0gSW50ZXJuYWwgKyA2MDsKKwlpbnQgTG9jYWxWYXJpYWJsZUlzTmV2ZXJVc2VkID0gSW50ZXJuYWwgKyA2MTsKKwlpbnQgQXJndW1lbnRJc05ldmVyVXNlZCA9IEludGVybmFsICsgNjI7CisJaW50IEJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0ID0gSW50ZXJuYWwgKyA2MzsKKwlpbnQgQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXRGb3JDbGluaXQgPSBJbnRlcm5hbCArIDY0OworCWludCBUb29NYW55QXJndW1lbnRTbG90cyA9IEludGVybmFsICsgNjU7CisJaW50IFRvb01hbnlMb2NhbFZhcmlhYmxlU2xvdHMgPSBJbnRlcm5hbCArIDY2OworCisJLy8gZmllbGRzCisJaW50IFVuZGVmaW5lZEZpZWxkID0gRmllbGRSZWxhdGVkICsgNzA7CisJaW50IE5vdFZpc2libGVGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDcxOworCWludCBBbWJpZ3VvdXNGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDcyOworCWludCBVc2luZ0RlcHJlY2F0ZWRGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDczOworCWludCBOb25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uID0gRmllbGRSZWxhdGVkICsgNzQ7CisJaW50IFJlZmVyZW5jZVRvRm9yd2FyZEZpZWxkID0gRmllbGRSZWxhdGVkICsgSW50ZXJuYWwgKyA3NTsKKworCS8vIGJsYW5rIGZpbmFsIGZpZWxkcworCWludCBGaW5hbEZpZWxkQXNzaWdubWVudCA9IEZpZWxkUmVsYXRlZCArIDgwOworCWludCBVbmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkID0gRmllbGRSZWxhdGVkICsgODE7CisJaW50IER1cGxpY2F0ZUJsYW5rRmluYWxGaWVsZEluaXRpYWxpemF0aW9uID0gRmllbGRSZWxhdGVkICsgODI7CisKKwkvLyBtZXRob2RzCisJaW50IFVuZGVmaW5lZE1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyAxMDA7CisJaW50IE5vdFZpc2libGVNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgMTAxOworCWludCBBbWJpZ3VvdXNNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgMTAyOworCWludCBVc2luZ0RlcHJlY2F0ZWRNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgMTAzOworCWludCBEaXJlY3RJbnZvY2F0aW9uT2ZBYnN0cmFjdE1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyAxMDQ7CisJaW50IFZvaWRNZXRob2RSZXR1cm5zVmFsdWUgPSBNZXRob2RSZWxhdGVkICsgMTA1OworCWludCBNZXRob2RSZXR1cm5zVm9pZCA9IE1ldGhvZFJlbGF0ZWQgKyAxMDY7CisJaW50IE1ldGhvZFJlcXVpcmVzQm9keSA9IEludGVybmFsICsgTWV0aG9kUmVsYXRlZCArIDEwNzsKKwlpbnQgU2hvdWxkUmV0dXJuVmFsdWUgPSBJbnRlcm5hbCArIE1ldGhvZFJlbGF0ZWQgKyAxMDg7CisJaW50IE1ldGhvZEJ1dFdpdGhDb25zdHJ1Y3Rvck5hbWUgPSBNZXRob2RSZWxhdGVkICsgMTEwOworCWludCBNaXNzaW5nUmV0dXJuVHlwZSA9IFR5cGVSZWxhdGVkICsgMTExOworCWludCBCb2R5Rm9yTmF0aXZlTWV0aG9kID0gSW50ZXJuYWwgKyBNZXRob2RSZWxhdGVkICsgMTEyOworCWludCBCb2R5Rm9yQWJzdHJhY3RNZXRob2QgPSBJbnRlcm5hbCArIE1ldGhvZFJlbGF0ZWQgKyAxMTM7CisJaW50IE5vTWVzc2FnZVNlbmRPbkJhc2VUeXBlID0gTWV0aG9kUmVsYXRlZCArIDExNDsKKwlpbnQgUGFyYW1ldGVyTWlzbWF0Y2ggPSBNZXRob2RSZWxhdGVkICsgMTE1OworCWludCBOb01lc3NhZ2VTZW5kT25BcnJheVR5cGUgPSBNZXRob2RSZWxhdGVkICsgMTE2OworICAgIAorCS8vIGNvbnN0cnVjdG9ycworCWludCBVbmRlZmluZWRDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMDsKKwlpbnQgTm90VmlzaWJsZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTMxOworCWludCBBbWJpZ3VvdXNDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMjsKKwlpbnQgVXNpbmdEZXByZWNhdGVkQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxMzM7CisJLy8gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbHMKKwlpbnQgSW5zdGFuY2VGaWVsZER1cmluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbiA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzNTsKKwlpbnQgSW5zdGFuY2VNZXRob2REdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb24gPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxMzY7CisJaW50IFJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzNzsKKwlpbnQgVGhpc1N1cGVyRHVyaW5nQ29uc3RydWN0b3JJbnZvY2F0aW9uID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTM4OworCS8vIGltcGxpY2l0IGNvbnN0cnVjdG9yIGNhbGxzCisJaW50IFVuZGVmaW5lZENvbnN0cnVjdG9ySW5EZWZhdWx0Q29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxNDA7CisJaW50IE5vdFZpc2libGVDb25zdHJ1Y3RvckluRGVmYXVsdENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTQxOworCWludCBBbWJpZ3VvdXNDb25zdHJ1Y3RvckluRGVmYXVsdENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTQyOworCWludCBVbmRlZmluZWRDb25zdHJ1Y3RvckluSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxNDM7CisJaW50IE5vdFZpc2libGVDb25zdHJ1Y3RvckluSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxNDQ7CisJaW50IEFtYmlndW91c0NvbnN0cnVjdG9ySW5JbXBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDE0NTsKKwlpbnQgVW5oYW5kbGVkRXhjZXB0aW9uSW5EZWZhdWx0Q29uc3RydWN0b3IgPSBUeXBlUmVsYXRlZCArIDE0NjsKKwlpbnQgVW5oYW5kbGVkRXhjZXB0aW9uSW5JbXBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IFR5cGVSZWxhdGVkICsgMTQ3OworCQkJCQorCS8vIGV4cHJlc3Npb25zCisJaW50IEFycmF5UmVmZXJlbmNlUmVxdWlyZWQgPSBJbnRlcm5hbCArIDE1MDsKKwlpbnQgTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb25Gb3JDaGFyQXJyYXlFeHByZXNzaW9uID0gSW50ZXJuYWwgKyAxNTE7CisJLy8gY29uc3RhbnQgZXhwcmVzc2lvbnMKKwlpbnQgU3RyaW5nQ29uc3RhbnRJc0V4Y2VlZGluZ1V0ZjhMaW1pdCA9IEludGVybmFsICsgMTUyOworCWludCBOb25Db25zdGFudEV4cHJlc3Npb24gPSAxNTM7CisJaW50IE51bWVyaWNWYWx1ZU91dE9mUmFuZ2UgPSBJbnRlcm5hbCArIDE1NDsKKwkvLyBjYXN0IGV4cHJlc3Npb25zCisJaW50IElsbGVnYWxDYXN0ID0gVHlwZVJlbGF0ZWQgKyAxNTY7CisJLy8gYWxsb2NhdGlvbnMKKwlpbnQgSW52YWxpZENsYXNzSW5zdGFudGlhdGlvbiA9IFR5cGVSZWxhdGVkICsgMTU3OworCWludCBDYW5ub3REZWZpbmVEaW1lbnNpb25FeHByZXNzaW9uc1dpdGhJbml0ID0gSW50ZXJuYWwgKyAxNTg7CisJaW50IE11c3REZWZpbmVFaXRoZXJEaW1lbnNpb25FeHByZXNzaW9uc09ySW5pdGlhbGl6ZXIgPSBJbnRlcm5hbCArIDE1OTsKKwkvLyBvcGVyYXRvcnMKKwlpbnQgSW52YWxpZE9wZXJhdG9yID0gSW50ZXJuYWwgKyAxNjA7CisJLy8gc3RhdGVtZW50cworCWludCBDb2RlQ2Fubm90QmVSZWFjaGVkID0gSW50ZXJuYWwgKyAxNjE7CisJaW50IENhbm5vdFJldHVybkluSW5pdGlhbGl6ZXIgPSBJbnRlcm5hbCArIDE2MjsKKwlpbnQgSW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseSA9IEludGVybmFsICsgMTYzOworCQorCS8vIGFzc2VydAorCWludCBJbnZhbGlkVm9pZEV4cHJlc3Npb24gPSBJbnRlcm5hbCArIDE2NDsKKwkvLyB0cnkKKwlpbnQgTWFza2VkQ2F0Y2ggPSBUeXBlUmVsYXRlZCArIDE2NTsKKwlpbnQgRHVwbGljYXRlRGVmYXVsdENhc2UgPSAxNjY7CisJaW50IFVucmVhY2hhYmxlQ2F0Y2ggPSBUeXBlUmVsYXRlZCArIE1ldGhvZFJlbGF0ZWQgKyAxNjc7CisJaW50IFVuaGFuZGxlZEV4Y2VwdGlvbiA9IFR5cGVSZWxhdGVkICsgMTY4OworCS8vIHN3aXRjaCAgICAgICAKKwlpbnQgSW5jb3JyZWN0U3dpdGNoVHlwZSA9IFR5cGVSZWxhdGVkICsgMTY5OworCWludCBEdXBsaWNhdGVDYXNlID0gRmllbGRSZWxhdGVkICsgMTcwOworCS8vIGxhYmVsbGVkCisJaW50IER1cGxpY2F0ZUxhYmVsID0gSW50ZXJuYWwgKyAxNzE7CisJaW50IEludmFsaWRCcmVhayA9IEludGVybmFsICsgMTcyOworCWludCBJbnZhbGlkQ29udGludWUgPSBJbnRlcm5hbCArIDE3MzsKKwlpbnQgVW5kZWZpbmVkTGFiZWwgPSBJbnRlcm5hbCArIDE3NDsKKwkvL3N5bmNocm9uaXplZAorCWludCBJbnZhbGlkVHlwZVRvU3luY2hyb25pemVkID0gSW50ZXJuYWwgKyAxNzU7CisJaW50IEludmFsaWROdWxsVG9TeW5jaHJvbml6ZWQgPSBJbnRlcm5hbCArIDE3NjsKKwkvLyB0aHJvdworCWludCBDYW5ub3RUaHJvd051bGwgPSBJbnRlcm5hbCArIDE3NzsKKworCS8vIGlubmVyIGVtdWxhdGlvbgorCWludCBOZWVkVG9FbXVsYXRlRmllbGRSZWFkQWNjZXNzID0gRmllbGRSZWxhdGVkICsgMTkwOworCWludCBOZWVkVG9FbXVsYXRlRmllbGRXcml0ZUFjY2VzcyA9IEZpZWxkUmVsYXRlZCArIDE5MTsKKwlpbnQgTmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcyA9IE1ldGhvZFJlbGF0ZWQgKyAxOTI7CisJaW50IE5lZWRUb0VtdWxhdGVDb25zdHJ1Y3RvckFjY2VzcyA9IE1ldGhvZFJlbGF0ZWQgKyAxOTM7CisKKwkvL2luaGVyaXRlZCBuYW1lIGhpZGVzIGVuY2xvc2luZyBuYW1lIChzb3J0IG9mIGFtYmlndW91cykKKwlpbnQgSW5oZXJpdGVkTWV0aG9kSGlkZXNFbmNsb3NpbmdOYW1lID0gTWV0aG9kUmVsYXRlZCArIDE5NTsKKwlpbnQgSW5oZXJpdGVkRmllbGRIaWRlc0VuY2xvc2luZ05hbWUgPSBGaWVsZFJlbGF0ZWQgKyAxOTY7CisJaW50IEluaGVyaXRlZFR5cGVIaWRlc0VuY2xvc2luZ05hbWUgPSBUeXBlUmVsYXRlZCArIDE5NzsKKworCS8vIG1pc2NlbGxhbmVvdXMKKwlpbnQgVGhpc0luU3RhdGljQ29udGV4dCA9IEludGVybmFsICsgMjAwOworCWludCBTdGF0aWNNZXRob2RSZXF1ZXN0ZWQgPSBJbnRlcm5hbCArIE1ldGhvZFJlbGF0ZWQgKyAyMDE7CisJaW50IElsbGVnYWxEaW1lbnNpb24gPSBJbnRlcm5hbCArIDIwMjsKKwlpbnQgSW52YWxpZFR5cGVFeHByZXNzaW9uID0gSW50ZXJuYWwgKyAyMDM7CisJaW50IFBhcnNpbmdFcnJvciA9IFN5bnRheCArIEludGVybmFsICsgMjA0OworCWludCBQYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24gPSBTeW50YXggKyBJbnRlcm5hbCArIDIwNTsKKwlpbnQgSW52YWxpZFVuYXJ5RXhwcmVzc2lvbiA9IFN5bnRheCArIEludGVybmFsICsgMjA2OworCisJLy8gc3ludGF4IGVycm9ycworCWludCBJbnRlcmZhY2VDYW5ub3RIYXZlQ29uc3RydWN0b3JzID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMDc7CisJaW50IEFycmF5Q29uc3RhbnRzT25seUluQXJyYXlJbml0aWFsaXplcnMgPSBTeW50YXggKyBJbnRlcm5hbCArIDIwODsKKwlpbnQgUGFyc2luZ0Vycm9yT25LZXl3b3JkID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMDk7CQorCWludCBQYXJzaW5nRXJyb3JPbktleXdvcmROb1N1Z2dlc3Rpb24gPSBTeW50YXggKyBJbnRlcm5hbCArIDIxMDsKKworCWludCBVbm1hdGNoZWRCcmFja2V0ID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMjA7CisJaW50IE5vRmllbGRPbkJhc2VUeXBlID0gRmllbGRSZWxhdGVkICsgMjIxOworCWludCBJbnZhbGlkRXhwcmVzc2lvbkFzU3RhdGVtZW50ID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMjI7CisgICAgCisJLy8gc2Nhbm5lciBlcnJvcnMKKwlpbnQgRW5kT2ZTb3VyY2UgPSBTeW50YXggKyBJbnRlcm5hbCArIDI1MDsKKwlpbnQgSW52YWxpZEhleGEgPSBTeW50YXggKyBJbnRlcm5hbCArIDI1MTsKKwlpbnQgSW52YWxpZE9jdGFsID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNTI7CisJaW50IEludmFsaWRDaGFyYWN0ZXJDb25zdGFudCA9IFN5bnRheCArIEludGVybmFsICsgMjUzOworCWludCBJbnZhbGlkRXNjYXBlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNTQ7CisJaW50IEludmFsaWRJbnB1dCA9IFN5bnRheCArIEludGVybmFsICsgMjU1OworCWludCBJbnZhbGlkVW5pY29kZUVzY2FwZSA9IFN5bnRheCArIEludGVybmFsICsgMjU2OworCWludCBJbnZhbGlkRmxvYXQgPSBTeW50YXggKyBJbnRlcm5hbCArIDI1NzsKKwlpbnQgTnVsbFNvdXJjZVN0cmluZyA9IFN5bnRheCArIEludGVybmFsICsgMjU4OworCWludCBVbnRlcm1pbmF0ZWRTdHJpbmcgPSBTeW50YXggKyBJbnRlcm5hbCArIDI1OTsKKwlpbnQgVW50ZXJtaW5hdGVkQ29tbWVudCA9IFN5bnRheCArIEludGVybmFsICsgMjYwOworCisJLy8gdHlwZSByZWxhdGVkIHByb2JsZW1zCisJaW50IEludGVyZmFjZUNhbm5vdEhhdmVJbml0aWFsaXplcnMgPSBUeXBlUmVsYXRlZCArIDMwMDsKKwlpbnQgRHVwbGljYXRlTW9kaWZpZXJGb3JUeXBlID0gVHlwZVJlbGF0ZWQgKyAzMDE7CisJaW50IElsbGVnYWxNb2RpZmllckZvckNsYXNzID0gVHlwZVJlbGF0ZWQgKyAzMDI7CisJaW50IElsbGVnYWxNb2RpZmllckZvckludGVyZmFjZSA9IFR5cGVSZWxhdGVkICsgMzAzOworCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJDbGFzcyA9IFR5cGVSZWxhdGVkICsgMzA0OworCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJJbnRlcmZhY2UgPSBUeXBlUmVsYXRlZCArIDMwNTsKKwlpbnQgSWxsZWdhbE1vZGlmaWVyRm9yTG9jYWxDbGFzcyA9IFR5cGVSZWxhdGVkICsgMzA2OworCisJaW50IElsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxBYnN0cmFjdEZvckNsYXNzID0gVHlwZVJlbGF0ZWQgKyAzMDg7CisJaW50IElsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJGb3JJbnRlcmZhY2VNZW1iZXJUeXBlID0gVHlwZVJlbGF0ZWQgKyAzMDk7CisJaW50IElsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1lbWJlclR5cGUgPSBUeXBlUmVsYXRlZCArIDMxMDsKKwlpbnQgSWxsZWdhbFN0YXRpY01vZGlmaWVyRm9yTWVtYmVyVHlwZSA9IFR5cGVSZWxhdGVkICsgMzExOworCWludCBTdXBlcmNsYXNzTXVzdEJlQUNsYXNzID0gVHlwZVJlbGF0ZWQgKyAzMTI7CisJaW50IENsYXNzRXh0ZW5kRmluYWxDbGFzcyA9IFR5cGVSZWxhdGVkICsgMzEzOworCWludCBEdXBsaWNhdGVTdXBlckludGVyZmFjZSA9IFR5cGVSZWxhdGVkICsgMzE0OworCWludCBTdXBlckludGVyZmFjZU11c3RCZUFuSW50ZXJmYWNlID0gVHlwZVJlbGF0ZWQgKyAzMTU7CisJaW50IEhpZXJhcmNoeUNpcmN1bGFyaXR5U2VsZlJlZmVyZW5jZSA9IFR5cGVSZWxhdGVkICsgMzE2OworCWludCBIaWVyYXJjaHlDaXJjdWxhcml0eSA9IFR5cGVSZWxhdGVkICsgMzE3OworCWludCBIaWRpbmdFbmNsb3NpbmdUeXBlID0gVHlwZVJlbGF0ZWQgKyAzMTg7CisJaW50IER1cGxpY2F0ZU5lc3RlZFR5cGUgPSBUeXBlUmVsYXRlZCArIDMxOTsKKwlpbnQgQ2Fubm90VGhyb3dUeXBlID0gVHlwZVJlbGF0ZWQgKyAzMjA7CisJaW50IFBhY2thZ2VDb2xsaWRlc1dpdGhUeXBlID0gVHlwZVJlbGF0ZWQgKyAzMjE7CisJaW50IFR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlID0gVHlwZVJlbGF0ZWQgKyAzMjI7CisJaW50IER1cGxpY2F0ZVR5cGVzID0gVHlwZVJlbGF0ZWQgKyAzMjM7CisJaW50IElzQ2xhc3NQYXRoQ29ycmVjdCA9IFR5cGVSZWxhdGVkICsgMzI0OworCWludCBQdWJsaWNDbGFzc011c3RNYXRjaEZpbGVOYW1lID0gVHlwZVJlbGF0ZWQgKyAzMjU7CisJaW50IE11c3RTcGVjaWZ5UGFja2FnZSA9IDMyNjsKKwlpbnQgSGllcmFyY2h5SGFzUHJvYmxlbXMgPSBUeXBlUmVsYXRlZCArIDMyNzsKKwlpbnQgUGFja2FnZUlzTm90RXhwZWN0ZWRQYWNrYWdlID0gMzI4OworCisJLy8gaW50IEludmFsaWRTdXBlcmNsYXNzQmFzZSA9IFR5cGVSZWxhdGVkICsgMzI5OyAvLyByZXNlcnZlZCB0byAzMzQgaW5jbHVkZWQKKwlpbnQgU3VwZXJjbGFzc05vdEZvdW5kID0gIFR5cGVSZWxhdGVkICsgMzI5ICsgUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQ7IC8vIFR5cGVSZWxhdGVkICsgMzMwCisJaW50IFN1cGVyY2xhc3NOb3RWaXNpYmxlID0gIFR5cGVSZWxhdGVkICsgMzI5ICsgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZTsgLy8gVHlwZVJlbGF0ZWQgKyAzMzEKKwlpbnQgU3VwZXJjbGFzc0FtYmlndW91cyA9ICBUeXBlUmVsYXRlZCArIDMyOSArIFByb2JsZW1SZWFzb25zLkFtYmlndW91czsgLy8gVHlwZVJlbGF0ZWQgKyAzMzIKKwlpbnQgU3VwZXJjbGFzc0ludGVybmFsTmFtZVByb3ZpZGVkID0gIFR5cGVSZWxhdGVkICsgMzI5ICsgUHJvYmxlbVJlYXNvbnMuSW50ZXJuYWxOYW1lUHJvdmlkZWQ7IC8vIFR5cGVSZWxhdGVkICsgMzMzCisJaW50IFN1cGVyY2xhc3NJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gIFR5cGVSZWxhdGVkICsgMzI5ICsgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZTsgLy8gVHlwZVJlbGF0ZWQgKyAzMzQKKworCS8vIGludCBJbnZhbGlkSW50ZXJmYWNlQmFzZSA9IFR5cGVSZWxhdGVkICsgMzM0OyAvLyByZXNlcnZlZCB0byAzMzkgaW5jbHVkZWQKKwlpbnQgSW50ZXJmYWNlTm90Rm91bmQgPSAgVHlwZVJlbGF0ZWQgKyAzMzQgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gVHlwZVJlbGF0ZWQgKyAzMzUKKwlpbnQgSW50ZXJmYWNlTm90VmlzaWJsZSA9ICBUeXBlUmVsYXRlZCArIDMzNCArIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGU7IC8vIFR5cGVSZWxhdGVkICsgMzM2CisJaW50IEludGVyZmFjZUFtYmlndW91cyA9ICBUeXBlUmVsYXRlZCArIDMzNCArIFByb2JsZW1SZWFzb25zLkFtYmlndW91czsgLy8gVHlwZVJlbGF0ZWQgKyAzMzcKKwlpbnQgSW50ZXJmYWNlSW50ZXJuYWxOYW1lUHJvdmlkZWQgPSAgVHlwZVJlbGF0ZWQgKyAzMzQgKyBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZDsgLy8gVHlwZVJlbGF0ZWQgKyAzMzgKKwlpbnQgSW50ZXJmYWNlSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA9ICBUeXBlUmVsYXRlZCArIDMzNCArIFByb2JsZW1SZWFzb25zLkluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWU7IC8vIFR5cGVSZWxhdGVkICsgMzM5CisKKwkvLyBmaWVsZCByZWxhdGVkIHByb2JsZW1zCisJaW50IER1cGxpY2F0ZUZpZWxkID0gRmllbGRSZWxhdGVkICsgMzQwOworCWludCBEdXBsaWNhdGVNb2RpZmllckZvckZpZWxkID0gRmllbGRSZWxhdGVkICsgMzQxOworCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDM0MjsKKwlpbnQgSWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlRmllbGQgPSBGaWVsZFJlbGF0ZWQgKyAzNDM7CisJaW50IElsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvckZpZWxkID0gRmllbGRSZWxhdGVkICsgMzQ0OworCWludCBJbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsVm9sYXRpbGVGb3JGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDM0NTsKKwlpbnQgVW5leHBlY3RlZFN0YXRpY01vZGlmaWVyRm9yRmllbGQgPSBGaWVsZFJlbGF0ZWQgKyAzNDY7CisKKwkvLyBpbnQgRmllbGRUeXBlUHJvYmxlbUJhc2UgPSBGaWVsZFJlbGF0ZWQgKyAzNDk7IC8vcmVzZXJ2ZWQgdG8gMzU0CisJaW50IEZpZWxkVHlwZU5vdEZvdW5kID0gIEZpZWxkUmVsYXRlZCArIDM0OSArIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kOyAvLyBGaWVsZFJlbGF0ZWQgKyAzNTAKKwlpbnQgRmllbGRUeXBlTm90VmlzaWJsZSA9ICBGaWVsZFJlbGF0ZWQgKyAzNDkgKyBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlOyAvLyBGaWVsZFJlbGF0ZWQgKyAzNTEKKwlpbnQgRmllbGRUeXBlQW1iaWd1b3VzID0gIEZpZWxkUmVsYXRlZCArIDM0OSArIFByb2JsZW1SZWFzb25zLkFtYmlndW91czsgLy8gRmllbGRSZWxhdGVkICsgMzUyCisJaW50IEZpZWxkVHlwZUludGVybmFsTmFtZVByb3ZpZGVkID0gIEZpZWxkUmVsYXRlZCArIDM0OSArIFByb2JsZW1SZWFzb25zLkludGVybmFsTmFtZVByb3ZpZGVkOyAvLyBGaWVsZFJlbGF0ZWQgKyAzNTMKKwlpbnQgRmllbGRUeXBlSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA9ICBGaWVsZFJlbGF0ZWQgKyAzNDkgKyBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOyAvLyBGaWVsZFJlbGF0ZWQgKyAzNTQKKwkKKwkvLyBtZXRob2QgcmVsYXRlZCBwcm9ibGVtcworCWludCBEdXBsaWNhdGVNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgMzU1OworCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JBcmd1bWVudCA9IE1ldGhvZFJlbGF0ZWQgKyAzNTY7CisJaW50IER1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM1NzsKKwlpbnQgSWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM1ODsKKwlpbnQgSWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM1OTsKKwlpbnQgSWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM2MDsKKwlpbnQgVW5leHBlY3RlZFN0YXRpY01vZGlmaWVyRm9yTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDM2MTsKKwlpbnQgSWxsZWdhbEFic3RyYWN0TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyAzNjI7CisJaW50IEFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzID0gTWV0aG9kUmVsYXRlZCArIDM2MzsKKwlpbnQgQXJndW1lbnRUeXBlQ2Fubm90QmVWb2lkID0gTWV0aG9kUmVsYXRlZCArIDM2NDsKKwlpbnQgQXJndW1lbnRUeXBlQ2Fubm90QmVWb2lkQXJyYXkgPSBNZXRob2RSZWxhdGVkICsgMzY1OworCWludCBSZXR1cm5UeXBlQ2Fubm90QmVWb2lkQXJyYXkgPSBNZXRob2RSZWxhdGVkICsgMzY2OworCWludCBOYXRpdmVNZXRob2RzQ2Fubm90QmVTdHJpY3RmcCA9IE1ldGhvZFJlbGF0ZWQgKyAzNjc7CisJaW50IER1cGxpY2F0ZU1vZGlmaWVyRm9yQXJndW1lbnQgPSBNZXRob2RSZWxhdGVkICsgMzY4OworCisJLy8JaW50IEFyZ3VtZW50UHJvYmxlbUJhc2UgPSBNZXRob2RSZWxhdGVkICsgMzY5OyAvLyByZXNlcnZlZCB0byAzNzQgaW5jbHVkZWQuCisJaW50IEFyZ3VtZW50VHlwZU5vdEZvdW5kID0gIE1ldGhvZFJlbGF0ZWQgKyAzNjkgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gTWV0aG9kUmVsYXRlZCArIDM3MAorCWludCBBcmd1bWVudFR5cGVOb3RWaXNpYmxlID0gIE1ldGhvZFJlbGF0ZWQgKyAzNjkgKyBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlOyAvLyBNZXRob2RSZWxhdGVkICsgMzcxCisJaW50IEFyZ3VtZW50VHlwZUFtYmlndW91cyA9ICBNZXRob2RSZWxhdGVkICsgMzY5ICsgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzOyAvLyBNZXRob2RSZWxhdGVkICsgMzcyCisJaW50IEFyZ3VtZW50VHlwZUludGVybmFsTmFtZVByb3ZpZGVkID0gIE1ldGhvZFJlbGF0ZWQgKyAzNjkgKyBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZDsgLy8gTWV0aG9kUmVsYXRlZCArIDM3MworCWludCBBcmd1bWVudFR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gIE1ldGhvZFJlbGF0ZWQgKyAzNjkgKyBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOyAvLyBNZXRob2RSZWxhdGVkICsgMzc0CisKKwkvLwlpbnQgRXhjZXB0aW9uVHlwZVByb2JsZW1CYXNlID0gTWV0aG9kUmVsYXRlZCArIDM3NDsgLy8gcmVzZXJ2ZWQgdG8gMzc5IGluY2x1ZGVkLgorCWludCBFeGNlcHRpb25UeXBlTm90Rm91bmQgPSAgTWV0aG9kUmVsYXRlZCArIDM3NCArIFByb2JsZW1SZWFzb25zLk5vdEZvdW5kOyAvLyBNZXRob2RSZWxhdGVkICsgMzc1CisJaW50IEV4Y2VwdGlvblR5cGVOb3RWaXNpYmxlID0gIE1ldGhvZFJlbGF0ZWQgKyAzNzQgKyBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlOyAvLyBNZXRob2RSZWxhdGVkICsgMzc2CisJaW50IEV4Y2VwdGlvblR5cGVBbWJpZ3VvdXMgPSAgTWV0aG9kUmVsYXRlZCArIDM3NCArIFByb2JsZW1SZWFzb25zLkFtYmlndW91czsgLy8gTWV0aG9kUmVsYXRlZCArIDM3NworCWludCBFeGNlcHRpb25UeXBlSW50ZXJuYWxOYW1lUHJvdmlkZWQgPSAgTWV0aG9kUmVsYXRlZCArIDM3NCArIFByb2JsZW1SZWFzb25zLkludGVybmFsTmFtZVByb3ZpZGVkOyAvLyBNZXRob2RSZWxhdGVkICsgMzc4CisJaW50IEV4Y2VwdGlvblR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gIE1ldGhvZFJlbGF0ZWQgKyAzNzQgKyBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOyAvLyBNZXRob2RSZWxhdGVkICsgMzc5CisKKwkvLwlpbnQgUmV0dXJuVHlwZVByb2JsZW1CYXNlID0gTWV0aG9kUmVsYXRlZCArIDM3OTsKKwlpbnQgUmV0dXJuVHlwZU5vdEZvdW5kID0gIE1ldGhvZFJlbGF0ZWQgKyAzNzkgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gTWV0aG9kUmVsYXRlZCArIDM4MAorCWludCBSZXR1cm5UeXBlTm90VmlzaWJsZSA9ICBNZXRob2RSZWxhdGVkICsgMzc5ICsgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZTsgLy8gTWV0aG9kUmVsYXRlZCArIDM4MQorCWludCBSZXR1cm5UeXBlQW1iaWd1b3VzID0gIE1ldGhvZFJlbGF0ZWQgKyAzNzkgKyBQcm9ibGVtUmVhc29ucy5BbWJpZ3VvdXM7IC8vIE1ldGhvZFJlbGF0ZWQgKyAzODIKKwlpbnQgUmV0dXJuVHlwZUludGVybmFsTmFtZVByb3ZpZGVkID0gIE1ldGhvZFJlbGF0ZWQgKyAzNzkgKyBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZDsgLy8gTWV0aG9kUmVsYXRlZCArIDM4MworCWludCBSZXR1cm5UeXBlSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA9ICBNZXRob2RSZWxhdGVkICsgMzc5ICsgUHJvYmxlbVJlYXNvbnMuSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZTsgLy8gTWV0aG9kUmVsYXRlZCArIDM4NAorCisJLy8gaW1wb3J0IHJlbGF0ZWQgcHJvYmxlbXMKKwlpbnQgQ29uZmxpY3RpbmdJbXBvcnQgPSBJbXBvcnRSZWxhdGVkICsgMzg1OworCWludCBEdXBsaWNhdGVJbXBvcnQgPSBJbXBvcnRSZWxhdGVkICsgMzg2OworCWludCBDYW5ub3RJbXBvcnRQYWNrYWdlID0gSW1wb3J0UmVsYXRlZCArIDM4NzsKKwlpbnQgVW51c2VkSW1wb3J0ID0gSW1wb3J0UmVsYXRlZCArIDM4ODsKKworCS8vCWludCBJbXBvcnRQcm9ibGVtQmFzZSA9IEltcG9ydFJlbGF0ZWQgKyAzODk7CisJaW50IEltcG9ydE5vdEZvdW5kID0gIEltcG9ydFJlbGF0ZWQgKyAzODkgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gSW1wb3J0UmVsYXRlZCArIDM5MAorCWludCBJbXBvcnROb3RWaXNpYmxlID0gIEltcG9ydFJlbGF0ZWQgKyAzODkgKyBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlOyAvLyBJbXBvcnRSZWxhdGVkICsgMzkxCisJaW50IEltcG9ydEFtYmlndW91cyA9ICBJbXBvcnRSZWxhdGVkICsgMzg5ICsgUHJvYmxlbVJlYXNvbnMuQW1iaWd1b3VzOyAvLyBJbXBvcnRSZWxhdGVkICsgMzkyCisJaW50IEltcG9ydEludGVybmFsTmFtZVByb3ZpZGVkID0gIEltcG9ydFJlbGF0ZWQgKyAzODkgKyBQcm9ibGVtUmVhc29ucy5JbnRlcm5hbE5hbWVQcm92aWRlZDsgLy8gSW1wb3J0UmVsYXRlZCArIDM5MworCWludCBJbXBvcnRJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gIEltcG9ydFJlbGF0ZWQgKyAzODkgKyBQcm9ibGVtUmVhc29ucy5Jbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOyAvLyBJbXBvcnRSZWxhdGVkICsgMzk0CisKKwkKKwkvLyBsb2NhbCB2YXJpYWJsZSByZWxhdGVkIHByb2JsZW1zCisJaW50IER1cGxpY2F0ZU1vZGlmaWVyRm9yVmFyaWFibGUgPSBNZXRob2RSZWxhdGVkICsgMzk1OworCWludCBJbGxlZ2FsTW9kaWZpZXJGb3JWYXJpYWJsZSA9IE1ldGhvZFJlbGF0ZWQgKyAzOTY7CisKKwkvLyBtZXRob2QgdmVyaWZpZXIgcHJvYmxlbXMKKwlpbnQgQWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCA9IE1ldGhvZFJlbGF0ZWQgKyA0MDA7CisJaW50IEZpbmFsTWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuID0gTWV0aG9kUmVsYXRlZCArIDQwMTsKKwlpbnQgSW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2UgPSBNZXRob2RSZWxhdGVkICsgNDAyOworCWludCBJbmNvbXBhdGlibGVFeGNlcHRpb25JbkluaGVyaXRlZE1ldGhvZFRocm93c0NsYXVzZSA9IE1ldGhvZFJlbGF0ZWQgKyA0MDM7CisJaW50IEluY29tcGF0aWJsZVJldHVyblR5cGUgPSBNZXRob2RSZWxhdGVkICsgNDA0OworCWludCBJbmhlcml0ZWRNZXRob2RSZWR1Y2VzVmlzaWJpbGl0eSA9IE1ldGhvZFJlbGF0ZWQgKyA0MDU7CisJaW50IENhbm5vdE92ZXJyaWRlQVN0YXRpY01ldGhvZFdpdGhBbkluc3RhbmNlTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDQwNjsKKwlpbnQgQ2Fubm90SGlkZUFuSW5zdGFuY2VNZXRob2RXaXRoQVN0YXRpY01ldGhvZCA9IE1ldGhvZFJlbGF0ZWQgKyA0MDc7CisJaW50IFN0YXRpY0luaGVyaXRlZE1ldGhvZENvbmZsaWN0cyA9IE1ldGhvZFJlbGF0ZWQgKyA0MDg7CisJaW50IE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5ID0gTWV0aG9kUmVsYXRlZCArIDQwOTsKKwlpbnQgT3ZlcnJpZGluZ05vblZpc2libGVNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgNDEwOworCWludCBBYnN0cmFjdE1ldGhvZENhbm5vdEJlT3ZlcnJpZGRlbiA9IE1ldGhvZFJlbGF0ZWQgKyA0MTE7CisJaW50IE92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDQxMjsKKworCS8vIGNvZGUgc25pcHBldCBzdXBwb3J0CisJaW50IENvZGVTbmlwcGV0TWlzc2luZ0NsYXNzID0gSW50ZXJuYWwgKyA0MjA7CisJaW50IENvZGVTbmlwcGV0TWlzc2luZ01ldGhvZCA9IEludGVybmFsICsgNDIxOworCWludCBOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gSW50ZXJuYWwgKyAyNjE7CisJaW50IENhbm5vdFVzZVN1cGVySW5Db2RlU25pcHBldCA9IEludGVybmFsICsgNDIyOworCQorCS8vY29uc3RhbnQgcG9vbAorCWludCBUb29NYW55Q29uc3RhbnRzSW5Db25zdGFudFBvb2wgPSBJbnRlcm5hbCArIDQzMDsKKwkKKwkvLyAxLjQgZmVhdHVyZXMKKwkvLyBhc3NlcnRpb24gd2FybmluZworCWludCBVc2VBc3NlcnRBc0FuSWRlbnRpZmllciA9IEludGVybmFsICsgNDQwOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5NjllNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOworIAorIC8qKgorICAqIERlZmluaXRpb24gb2YgYSBKYXZhIHNjYW5uZXIsIGFzIHJldHVybmVkIGJ5IHRoZSA8Y29kZT5Ub29sRmFjdG9yeTwvY29kZT4uCisgICogVGhlIHNjYW5uZXIgaXMgcmVzcG9uc2libGUgZm9yIHRva2VuaXppbmcgYSBnaXZlbiBzb3VyY2UsIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dAorICAqIHRoZSBuYXR1cmUgb2YgdGhlIHRva2VuIHJlYWQsIGl0cyBwb3NpdGlvbnMgYW5kIHNvdXJjZSBlcXVpdmFsZW50LgorICAqIAorICAqIFdoZW4gdGhlIHNjYW5uZXIgaGFzIGZpbmlzaGVkIHRva2VuaXppbmcsIGl0IGFuc3dlcnMgYW4gRU9GIHRva2VuICg8Y29kZT4KKyAgKiBJVGVybWluYWxTeW1ib2xzI1Rva2VuTmFtZUVPRjwvY29kZT4uCisgICogCisgICogV2hlbiBlbmNvdW50ZXJpbmcgbGV4aWNhbCBlcnJvcnMsIGFuIDxjb2RlPkludmFsaWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLgorICAqIAorICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuVG9vbEZhY3RvcnkKKyAgKiBAc2VlIElUZXJtaW5hbFN5bWJvbHMKKyAgKiBAc2luY2UgMi4wCisgICovCitwdWJsaWMgaW50ZXJmYWNlIElTY2FubmVyIHsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGN1cnJlbnQgaWRlbnRpZmllciBzb3VyY2UsIGFmdGVyIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBoYXZlCisJICogYmVlbiB0cmFuc2xhdGVkIGludG8gdW5pY29kZSBjaGFyYWN0ZXJzLgorCSAqIGUuZy4gaWYgb3JpZ2luYWwgc291cmNlIHdhcyA8Y29kZT5cXHUwMDYxYmM8L2NvZGU+IHRoZW4gaXQgd2lsbCBhbnN3ZXIgPGNvZGU+YWJjPC9jb2RlPi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgc291cmNlLCBhZnRlciB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZQorCSAqIGJlZW4gdHJhbnNsYXRlZCBpbnRvIHVuaWNvZGUgY2hhcmFjdGVycworCSAqLworCWNoYXJbXSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlLgorCSAqIFRoaXMgcG9zaXRpb24gaXMgemVyby1iYXNlZCBhbmQgaW5jbHVzaXZlLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAKKwkgKiB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgdG9rZW4uIElmIHRoaXMgY2hhcmFjdGVyIHdhcyBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCBpdCBwb2ludHMgYXQgdGhlIGZpcnN0IAorCSAqIGNoYXJhY3RlciBvZiB0aGlzIHNlcXVlbmNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlCisJICovCisJaW50IGdldEN1cnJlbnRUb2tlblN0YXJ0UG9zaXRpb24oKTsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGVuZGluZyBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbiBpbnNpZGUgdGhlIG9yaWdpbmFsIHNvdXJjZS4KKwkgKiBUaGlzIHBvc2l0aW9uIGlzIHplcm8tYmFzZWQgYW5kIGluY2x1c2l2ZS4gSXQgY29ycmVzcG9uZHMgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJhY3RlcgorCSAqIHdoaWNoIGlzIHBhcnQgb2YgdGhpcyB0b2tlbi4gSWYgdGhpcyBjaGFyYWN0ZXIgd2FzIGEgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIGl0IHBvaW50cyBhdCB0aGUgbGFzdCAKKwkgKiBjaGFyYWN0ZXIgb2YgdGhpcyBzZXF1ZW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW5zaWRlIHRoZSBvcmlnaW5hbCBzb3VyY2UKKwkgKi8KKwlpbnQgZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIuIFRoaXMgbGluZSBoYXMgdG8gaGF2ZSBiZWVuIGVuY291bnRlcmVkCisJICogYWxyZWFkeSBpbiB0aGUgdG9rZW5pemF0aW9uIHByb2Nlc3MgKGkuZS4gaXQgY2Fubm90IGJlIHVzZWQgdG8gY29tcHV0ZSBwb3NpdGlvbnMgb2YgbGluZXMgYmV5b25kCisJICogY3VycmVudCB0b2tlbikuIE9uY2UgdGhlIGVudGlyZSBzb3VyY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLCBpdCBjYW4gYmUgdXNlZCB3aXRob3V0IGFueSBsaW1pdC4KKwkgKiBMaW5lIHN0YXJ0aW5nIHBvc2l0aW9ucyBhcmUgemVyby1iYXNlZCwgYW5kIHN0YXJ0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcmV2aW91cyBsaW5lIHNlcGFyYXRvciAoaWYgYW55KS4KKwkgKiAKKwkgKiBAcGFyYW0gbGluZU51bWJlciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIKKwkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBhIGdpdmVuIGxpbmUgbnVtYmVyCisJICovCisJaW50IGdldExpbmVTdGFydChpbnQgbGluZU51bWJlcik7CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgYSBnaXZlbiBsaW5lIG51bWJlci4gVGhpcyBsaW5lIGhhcyB0byBoYXZlIGJlZW4gZW5jb3VudGVyZWQKKwkgKiBhbHJlYWR5IGluIHRoZSB0b2tlbml6YXRpb24gcHJvY2VzcyAoaS5lLiBpdCBjYW5ub3QgYmUgdXNlZCB0byBjb21wdXRlIHBvc2l0aW9ucyBvZiBsaW5lcyBiZXlvbmQKKwkgKiBjdXJyZW50IHRva2VuKS4gT25jZSB0aGUgZW50aXJlIHNvdXJjZSBoYXMgYmVlbiBwcm9jZXNzZWQsIGl0IGNhbiBiZSB1c2VkIHdpdGhvdXQgYW55IGxpbWl0LgorCSAqIExpbmUgZW5kaW5nIHBvc2l0aW9ucyBhcmUgemVyby1iYXNlZCwgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHNlcGFyYXRvciAKKwkgKiAoaW4gY2FzZSBtdWx0aS1jaGFyYWN0ZXIgbGluZSBzZXBhcmF0b3JzKS4JIAorCSAqIAorCSAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBnaXZlbiBsaW5lIG51bWJlcgorCSAqIEByZXR1cm4gdGhlIGVuZGluZyBwb3NpdGlvbiBvZiBhIGdpdmVuIGxpbmUgbnVtYmVyCisJICoqLworCWludCBnZXRMaW5lRW5kKGludCBsaW5lTnVtYmVyKTsKKworCS8qKgorCSAqIEFuc3dlcnMgYW4gYXJyYXkgb2YgdGhlIGVuZGluZyBwb3NpdGlvbnMgb2YgdGhlIGxpbmVzIGVuY291bnRlcmVkIHNvIGZhci4gTGluZSBlbmRpbmcgcG9zaXRpb25zCisJICogYXJlIHplcm8tYmFzZWQsIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSBzZXBhcmF0b3IgKGluIGNhc2UgbXVsdGktY2hhcmFjdGVyCisJICogbGluZSBzZXBhcmF0b3JzKS4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBlbmRpbmcgcG9zaXRpb25zIG9mIHRoZSBsaW5lcyBlbmNvdW50ZXJlZCBzbyBmYXIKKwkgKi8KKwlpbnRbXSBnZXRMaW5lRW5kcygpOworCisJLyoqCisJICogQW5zd2VycyBhIDEtYmFzZWQgbGluZSBudW1iZXIgdXNpbmcgdGhlIGxpbmVzIHdoaWNoIGhhdmUgYmVlbiBlbmNvdW50ZXJlZCBzbyBmYXIuIElmIHRoZSBwb3NpdGlvbgorCSAqIGlzIGxvY2F0ZWQgYmV5b25kIHRoZSBjdXJyZW50IHNjYW5uZWQgbGluZSwgdGhlbiB0aGUgbGFzdCBsaW5lIG51bWJlciB3aWxsIGJlIGFuc3dlcmVkLgorCSAqIAorCSAqIEBwYXJhbSBjaGFyUG9zaXRpb24gdGhlIGdpdmVuIGNoYXJhY3RlciBwb3NpdGlvbgorCSAqIEByZXR1cm4gYSAxLWJhc2VkIGxpbmUgbnVtYmVyIHVzaW5nIHRoZSBsaW5lcyB3aGljaCBoYXZlIGJlZW4gZW5jb3VudGVyZWQgc28gZmFyCisJICovCisJaW50IGdldExpbmVOdW1iZXIoaW50IGNoYXJQb3NpdGlvbik7CisKKwkvKioKKwkgKiBSZWFkIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzb3VyY2UsIGFuZCBhbnN3ZXJzIGl0cyBJRCBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+SVRlcm1pbmFsU3ltYm9sczwvY29kZT4uCisJICogTm90ZSB0aGF0IHRoZSBhY3R1YWwgdG9rZW4gSUQgdmFsdWVzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpZiBuZXcga2V5d29yZHMgd2VyZSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UKKwkgKiAoaS5lLiAnYXNzZXJ0JyBrZXl3b3JkIGluIDEuNCkuCisJICogCisJICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gLSBpbiBjYXNlIGEgbGV4aWNhbCBlcnJvciB3YXMgZGV0ZWN0ZWQgd2hpbGUgcmVhZGluZyB0aGUgY3VycmVudCB0b2tlbgorCSAqLworCWludCBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uOworCisJLyoqCisJICogQW5zd2VycyB0aGUgb3JpZ2luYWwgc291cmNlIGJlaW5nIHByb2Nlc3NlZCAobm90IGEgY29weSBvZiBpdCkuIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHNvdXJjZSBiZWluZyBwcm9jZXNzZWQKKwkgKi8KKwljaGFyW10gZ2V0U291cmNlKCk7CisKKwkvKioKKwkgKiBSZXBvc2l0aW9uIHRoZSBzY2FubmVyIG9uIHNvbWUgcG9ydGlvbiBvZiB0aGUgb3JpZ2luYWwgc291cmNlLiBPbmNlIHJlYWNoaW5nIHRoZSBnaXZlbiA8Y29kZT5lbmRQb3NpdGlvbjwvY29kZT4KKwkgKiBpdCB3aWxsIGFuc3dlciBFT0YgdG9rZW5zICg8Y29kZT5JVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRjwvY29kZT4pLgorCSAqIAorCSAqIEBwYXJhbSBzdGFydFBvc2l0aW9uIHRoZSBnaXZlbiBzdGFydCBwb3NpdGlvbgorCSAqIEBwYXJhbSBlbmRQb3NpdGlvbiB0aGUgZ2l2ZW4gZW5kIHBvc2l0aW9uCisJICovCisJdm9pZCByZXNldFRvKGludCBzdGFydFBvc2l0aW9uLCBpbnQgZW5kUG9zaXRpb24pOworCisJLyoqCisJICogU2V0IHRoZSBzY2FubmVyIHNvdXJjZSB0byBwcm9jZXNzLiBCeSBkZWZhdWx0LCB0aGUgc2Nhbm5lciB3aWxsIGNvbnNpZGVyIHN0YXJ0aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICogc291cmNlIHVudGlsIGl0IHJlYWNoZXMgaXRzIGVuZC4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlIHRoZSBnaXZlbiBzb3VyY2UKKwkgKi8KKwl2b2lkIHNldFNvdXJjZShjaGFyW10gc291cmNlKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZlNWUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVRlcm1pbmFsU3ltYm9scy5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCiugCitDb250cmlidXRvcnM6CisgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlcjsKKyAKKy8qKgorICogTWFwcyBlYWNoIHRlcm1pbmFsIHN5bWJvbCBpbiB0aGUgamF2YS1ncmFtbWFyIGludG8gYSB1bmlxdWUgaW50ZWdlci4gCisgKiBUaGlzIGludGVnZXIgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRlcm1pbmFsIHdoZW4gY29tcHV0aW5nIGEgcGFyc2luZyBhY3Rpb24uIAorICogCisgKiBEaXNjbGFpbWVyIDogVGhlc2UgY29uc3RhbnQgdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhIEphdmEgCisgKiBncmFtbWFyLCB0aGVyZWZvcmUgdGhlaXIgYWN0dWFsIHZhbHVlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2UgaWYgbmV3IGtleXdvcmRzIAorICogd2VyZSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UgKGkuZS4gJ2Fzc2VydCcga2V5d29yZCBpbiAxLjQpLgorICogCisgKiBAc2VlIElTY2FubmVyCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlcm1pbmFsU3ltYm9scyB7CisKKwkvLyBzcGVjaWFsIHRva2VucyBub3QgcGFydCBvZiBncmFtbWFyIC0gbm90IGF1dG9nZW5lcmF0ZWQKKwlpbnQgCisJCVRva2VuTmFtZVdISVRFU1BBQ0UgPSAxMDAwLAorCQlUb2tlbk5hbWVDT01NRU5UX0xJTkUgPSAxMDAxLAorCQlUb2tlbk5hbWVDT01NRU5UX0JMT0NLID0gMTAwMiwKKwkJVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DID0gMTAwMzsKKwkKKyAgICBpbnQKKyAgICAgIFRva2VuTmFtZUlkZW50aWZpZXIgPSA1LAorICAgICAgVG9rZW5OYW1lYWJzdHJhY3QgPSA5OCwKKyAgICAgIFRva2VuTmFtZWFzc2VydCA9IDExOCwKKyAgICAgIFRva2VuTmFtZWJvb2xlYW4gPSAxOCwKKyAgICAgIFRva2VuTmFtZWJyZWFrID0gMTE5LAorICAgICAgVG9rZW5OYW1lYnl0ZSA9IDE5LAorICAgICAgVG9rZW5OYW1lY2FzZSA9IDIxMSwKKyAgICAgIFRva2VuTmFtZWNhdGNoID0gMjI1LAorICAgICAgVG9rZW5OYW1lY2hhciA9IDIwLAorICAgICAgVG9rZW5OYW1lY2xhc3MgPSAxNjUsCisgICAgICBUb2tlbk5hbWVjb250aW51ZSA9IDEyMCwKKyAgICAgIFRva2VuTmFtZWRlZmF1bHQgPSAyMTIsCisgICAgICBUb2tlbk5hbWVkbyA9IDEyMSwKKyAgICAgIFRva2VuTmFtZWRvdWJsZSA9IDIxLAorICAgICAgVG9rZW5OYW1lZWxzZSA9IDIxMywKKyAgICAgIFRva2VuTmFtZWV4dGVuZHMgPSAyNDMsCisgICAgICBUb2tlbk5hbWVmYWxzZSA9IDM3LAorICAgICAgVG9rZW5OYW1lZmluYWwgPSA5OSwKKyAgICAgIFRva2VuTmFtZWZpbmFsbHkgPSAyMjYsCisgICAgICBUb2tlbk5hbWVmbG9hdCA9IDIyLAorICAgICAgVG9rZW5OYW1lZm9yID0gMTIyLAorICAgICAgVG9rZW5OYW1laWYgPSAxMjMsCisgICAgICBUb2tlbk5hbWVpbXBsZW1lbnRzID0gMjY3LAorICAgICAgVG9rZW5OYW1laW1wb3J0ID0gMTkxLAorICAgICAgVG9rZW5OYW1laW5zdGFuY2VvZiA9IDY1LAorICAgICAgVG9rZW5OYW1laW50ID0gMjMsCisgICAgICBUb2tlbk5hbWVpbnRlcmZhY2UgPSAxODAsCisgICAgICBUb2tlbk5hbWVsb25nID0gMjQsCisgICAgICBUb2tlbk5hbWVuYXRpdmUgPSAxMDAsCisgICAgICBUb2tlbk5hbWVuZXcgPSAzMiwKKyAgICAgIFRva2VuTmFtZW51bGwgPSAzOCwKKyAgICAgIFRva2VuTmFtZXBhY2thZ2UgPSAyMTQsCisgICAgICBUb2tlbk5hbWVwcml2YXRlID0gMTAxLAorICAgICAgVG9rZW5OYW1lcHJvdGVjdGVkID0gMTAyLAorICAgICAgVG9rZW5OYW1lcHVibGljID0gMTAzLAorICAgICAgVG9rZW5OYW1lcmV0dXJuID0gMTI0LAorICAgICAgVG9rZW5OYW1lc2hvcnQgPSAyNSwKKyAgICAgIFRva2VuTmFtZXN0YXRpYyA9IDk0LAorICAgICAgVG9rZW5OYW1lc3RyaWN0ZnAgPSAxMDQsCisgICAgICBUb2tlbk5hbWVzdXBlciA9IDM0LAorICAgICAgVG9rZW5OYW1lc3dpdGNoID0gMTI1LAorICAgICAgVG9rZW5OYW1lc3luY2hyb25pemVkID0gODUsCisgICAgICBUb2tlbk5hbWV0aGlzID0gMzUsCisgICAgICBUb2tlbk5hbWV0aHJvdyA9IDEyNiwKKyAgICAgIFRva2VuTmFtZXRocm93cyA9IDIyNywKKyAgICAgIFRva2VuTmFtZXRyYW5zaWVudCA9IDEwNSwKKyAgICAgIFRva2VuTmFtZXRydWUgPSAzOSwKKyAgICAgIFRva2VuTmFtZXRyeSA9IDEyNywKKyAgICAgIFRva2VuTmFtZXZvaWQgPSAyNiwKKyAgICAgIFRva2VuTmFtZXZvbGF0aWxlID0gMTA2LAorICAgICAgVG9rZW5OYW1ld2hpbGUgPSAxMTcsCisgICAgICBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCA9IDQwLAorICAgICAgVG9rZW5OYW1lTG9uZ0xpdGVyYWwgPSA0MSwKKyAgICAgIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsID0gNDIsCisgICAgICBUb2tlbk5hbWVEb3VibGVMaXRlcmFsID0gNDMsCisgICAgICBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsID0gNDQsCisgICAgICBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsID0gNDUsCisgICAgICBUb2tlbk5hbWVQTFVTX1BMVVMgPSAxLAorICAgICAgVG9rZW5OYW1lTUlOVVNfTUlOVVMgPSAyLAorICAgICAgVG9rZW5OYW1lRVFVQUxfRVFVQUwgPSAzMywKKyAgICAgIFRva2VuTmFtZUxFU1NfRVFVQUwgPSA2NiwKKyAgICAgIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgPSA2NywKKyAgICAgIFRva2VuTmFtZU5PVF9FUVVBTCA9IDM2LAorICAgICAgVG9rZW5OYW1lTEVGVF9TSElGVCA9IDE0LAorICAgICAgVG9rZW5OYW1lUklHSFRfU0hJRlQgPSAxMSwKKyAgICAgIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUID0gMTIsCisgICAgICBUb2tlbk5hbWVQTFVTX0VRVUFMID0gMTY4LAorICAgICAgVG9rZW5OYW1lTUlOVVNfRVFVQUwgPSAxNjksCisgICAgICBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA9IDE3MCwKKyAgICAgIFRva2VuTmFtZURJVklERV9FUVVBTCA9IDE3MSwKKyAgICAgIFRva2VuTmFtZUFORF9FUVVBTCA9IDE3MiwKKyAgICAgIFRva2VuTmFtZU9SX0VRVUFMID0gMTczLAorICAgICAgVG9rZW5OYW1lWE9SX0VRVUFMID0gMTc0LAorICAgICAgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMID0gMTc1LAorICAgICAgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA9IDE3NiwKKyAgICAgIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMID0gMTc3LAorICAgICAgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgPSAxNzgsCisgICAgICBUb2tlbk5hbWVPUl9PUiA9IDgwLAorICAgICAgVG9rZW5OYW1lQU5EX0FORCA9IDc5LAorICAgICAgVG9rZW5OYW1lUExVUyA9IDMsCisgICAgICBUb2tlbk5hbWVNSU5VUyA9IDQsCisgICAgICBUb2tlbk5hbWVOT1QgPSA3MSwKKyAgICAgIFRva2VuTmFtZVJFTUFJTkRFUiA9IDksCisgICAgICBUb2tlbk5hbWVYT1IgPSA2MywKKyAgICAgIFRva2VuTmFtZUFORCA9IDYyLAorICAgICAgVG9rZW5OYW1lTVVMVElQTFkgPSA4LAorICAgICAgVG9rZW5OYW1lT1IgPSA3MCwKKyAgICAgIFRva2VuTmFtZVRXSURETEUgPSA3MiwKKyAgICAgIFRva2VuTmFtZURJVklERSA9IDEwLAorICAgICAgVG9rZW5OYW1lR1JFQVRFUiA9IDY4LAorICAgICAgVG9rZW5OYW1lTEVTUyA9IDY5LAorICAgICAgVG9rZW5OYW1lTFBBUkVOID0gNywKKyAgICAgIFRva2VuTmFtZVJQQVJFTiA9IDg2LAorICAgICAgVG9rZW5OYW1lTEJSQUNFID0gMTEwLAorICAgICAgVG9rZW5OYW1lUkJSQUNFID0gOTUsCisgICAgICBUb2tlbk5hbWVMQlJBQ0tFVCA9IDE1LAorICAgICAgVG9rZW5OYW1lUkJSQUNLRVQgPSAxNjYsCisgICAgICBUb2tlbk5hbWVTRU1JQ09MT04gPSA2NCwKKyAgICAgIFRva2VuTmFtZVFVRVNUSU9OID0gODEsCisgICAgICBUb2tlbk5hbWVDT0xPTiA9IDE1NCwKKyAgICAgIFRva2VuTmFtZUNPTU1BID0gOTAsCisgICAgICBUb2tlbk5hbWVET1QgPSA2LAorICAgICAgVG9rZW5OYW1lRVFVQUwgPSAxNjcsCisgICAgICBUb2tlbk5hbWVFT0YgPSAxNTgsCisgICAgICBUb2tlbk5hbWVFUlJPUiA9IDMwNzsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmZWQ1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Cit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKK6AKK0NvbnRyaWJ1dG9yczoKKyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gYnkgYSBzY2FubmVyIHdoZW4gZW5jb3VudGVyaW5nIGxleGljYWwgZXJyb3JzLgorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZElucHV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCS8qKgorCSAqIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCS8qKgorCSAqIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgSW52YWxpZElucHV0RXhjZXB0aW9uKFN0cmluZyBzKSB7CisJCXN1cGVyKHMpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL3BhY2thZ2UuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM5ZWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MyBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNvbXBpbGVyIGFzc29jaWF0ZWQgaW5mcmFzdHJ1Y3R1cmUgQVBJcy4KKzxoMj4KK1BhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+CisKKzxwPjxicj5UaGlzIHBhY2thZ2UgY29udGFpbnMgc29tZSBjb21waWxlciB0b29saW5nIEFQSXMsIGFsbG93aW5nIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBhdCBhIGxvd2VyLWxldmVsIAordGhhbiB1c2luZyB0aGUgSmF2YU1vZGVsLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0Fic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0Fic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0OTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworLyoqCisgKiBBbiBhZGFwdGVyIGNsYXNzIGZvciBpbnRlcmF0aW5nIHRocm91Z2ggdGhlIHBhcnNlIHRyZWUuCisgKi8KKworcHVibGljIGNsYXNzIEFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyIGltcGxlbWVudHMgSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgeworCisJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7fQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBTkRfQU5EX0V4cHJlc3Npb24gYW5kX2FuZF9FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJndW1lbnQgYXJndW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheVR5cGVSZWZlcmVuY2UgYXJyYXlUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9jayBibG9jaywgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChCcmVhayBicmVha1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXNlIGNhc2VTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhckxpdGVyYWwgY2hhckxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NMaXRlcmFsQWNjZXNzIGNsYXNzTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChDbGluaXQgY2xpbml0LCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwKKwkJQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcG91bmRBc3NpZ25tZW50IGNvbXBvdW5kQXNzaWdubWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLAorCQlDbGFzc1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnRpbnVlIGNvbnRpbnVlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERlZmF1bHRDYXNlIGRlZmF1bHRDYXNlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERvU3RhdGVtZW50IGRvU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERvdWJsZUxpdGVyYWwgZG91YmxlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFcXVhbEV4cHJlc3Npb24gZXF1YWxFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXh0ZW5kZWRTdHJpbmdMaXRlcmFsLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZhbHNlTGl0ZXJhbCBmYWxzZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBNZXRob2RTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChGbG9hdExpdGVyYWwgZmxvYXRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlJbnN0YW5jZU9mRXhwcmVzc2lvbiBpbnN0YW5jZU9mRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbnRMaXRlcmFsIGludExpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoTGFiZWxlZFN0YXRlbWVudCBsYWJlbGVkU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChMb25nTGl0ZXJhbCBsb25nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJTWVtYmVyVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwKKwkJQ2xhc3NTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdWxsTGl0ZXJhbCBudWxsTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChPUl9PUl9FeHByZXNzaW9uIG9yX29yX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSBxdWFsaWZpZWRTdXBlclJlZmVyZW5jZSwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSBxdWFsaWZpZWRUaGlzUmVmZXJlbmNlLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwKKwkJQ2xhc3NTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoCisJCVNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLAorCQlDbGFzc1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlclJlZmVyZW5jZSBzdXBlclJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50LAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCB0aHJvd1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnVlTGl0ZXJhbCB0cnVlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KAorCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorCQlDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChVbmFyeUV4cHJlc3Npb24gdW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQU5EX0FORF9FeHByZXNzaW9uIGFuZF9hbmRfRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGVEZWNsYXJhdGlvbiwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJndW1lbnQgYXJndW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLAorCQlDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrIGJsb2NrLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCcmVhayBicmVha1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzZSBjYXNlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhckxpdGVyYWwgY2hhckxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzTGl0ZXJhbEFjY2VzcyBjbGFzc0xpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENsaW5pdCBjbGluaXQsIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwKKwkJQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbXBvdW5kQXNzaWdubWVudCBjb21wb3VuZEFzc2lnbm1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLAorCQlDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb250aW51ZSBjb250aW51ZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoRGVmYXVsdENhc2UgZGVmYXVsdENhc2VTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KERvU3RhdGVtZW50IGRvU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChEb3VibGVMaXRlcmFsIGRvdWJsZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEVxdWFsRXhwcmVzc2lvbiBlcXVhbEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXhwbGljaXRDb25zdHJ1Y3RvciwKKwkJQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCUV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRlZFN0cmluZ0xpdGVyYWwsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZhbHNlTGl0ZXJhbCBmYWxzZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgTWV0aG9kU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGbG9hdExpdGVyYWwgZmxvYXRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJZlN0YXRlbWVudCBpZlN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIGluaXRpYWxpemVyLCBNZXRob2RTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnRMaXRlcmFsIGludExpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChMb25nTGl0ZXJhbCBsb25nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCU1lbWJlclR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sCisJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbnVsbExpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KE9SX09SX0V4cHJlc3Npb24gb3Jfb3JfRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHF1YWxpZmllZFRoaXNSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UsCisJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UsCisJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJSZWZlcmVuY2Ugc3VwZXJSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KAorCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50LAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzUmVmZXJlbmNlIHRoaXNSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFRocm93U3RhdGVtZW50IHRocm93U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnVlTGl0ZXJhbCB0cnVlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCisJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChVbmFyeUV4cHJlc3Npb24gdW5hcnlFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCUxvY2FsVHlwZURlY2xhcmF0aW9uIGxvY2FsVHlwZURlY2xhcmF0aW9uLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdCgKKwkJTG9jYWxUeXBlRGVjbGFyYXRpb24gbG9jYWxUeXBlRGVjbGFyYXRpb24sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNDU2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9DbGFzc0ZpbGUuamF2YQpAQCAtMCwwICsxLDI5NTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjbGFzcyBmaWxlIHdyYXBwZXIgb24gYnl0ZXMsIGl0IGlzIGF3YXJlIG9mIGl0cyBhY3R1YWwKKyAqIHR5cGUgbmFtZS4KKyAqCisgKiBQdWJsaWMgQVBJcyBhcmUgbGlzdGVkIGJlbG93OgorICoKKyAqIGJ5dGVbXSBnZXRCeXRlcygpOworICoJCUFuc3dlciB0aGUgYWN0dWFsIGJ5dGVzIG9mIHRoZSBjbGFzcyBmaWxlCisgKgorICogY2hhcltdW10gZ2V0Q29tcG91bmROYW1lKCk7CisgKiAJCUFuc3dlciB0aGUgY29tcG91bmQgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZS4KKyAqIAkJRm9yIGV4YW1wbGUsIHt7amF2YX0sIHt1dGlsfSwge0hhc2h0YWJsZX19LgorICoKKyAqIGJ5dGVbXSBnZXRSZWR1Y2VkQnl0ZXMoKTsKKyAqIAkJQW5zd2VyIGEgc21hbGxlciBieXRlIGZvcm1hdCwgd2hpY2ggaXMgb25seSBjb250YWlucyBzb21lIHN0cnVjdHVyYWwgCisgKiAgICAgIGluZm9ybWF0aW9uLiBUaG9zZSBieXRlcyBhcmUgZGVjb2RhYmxlIHdpdGggYSByZWd1bGFyIGNsYXNzIGZpbGUgcmVhZGVyLCAKKyAqICAgICAgc3VjaCBhcyBEaWV0Q2xhc3NGaWxlUmVhZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0ZpbGUKKwlpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21waWxlck1vZGlmaWVycywgVHlwZUNvbnN0YW50cywgVHlwZUlkcyB7CisJcHVibGljIFNvdXJjZVR5cGVCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmc7CisJcHVibGljIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7CisJcHVibGljIENsYXNzRmlsZSBlbmNsb3NpbmdDbGFzc0ZpbGU7CisJLy8gdXNlZCB0byBnZW5lcmF0ZSBwcml2YXRlIGFjY2VzcyBtZXRob2RzCisJcHVibGljIGludCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzOworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gaW5uZXJDbGFzc2VzQmluZGluZ3M7CisJcHVibGljIGludCBudW1iZXJPZklubmVyQ2xhc3NlczsKKwlwdWJsaWMgYnl0ZVtdIGhlYWRlcjsKKwkvLyB0aGUgaGVhZGVyIGNvbnRhaW5zIGFsbCB0aGUgYnl0ZXMgdGlsbCB0aGUgZW5kIG9mIHRoZSBjb25zdGFudCBwb29sCisJcHVibGljIGJ5dGVbXSBjb250ZW50czsKKwkvLyB0aGF0IGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIHRoZSByZW1haW5pbmcgYnl0ZXMgb2YgdGhlIC5jbGFzcyBmaWxlCisJcHVibGljIGludCBoZWFkZXJPZmZzZXQ7CisJcHVibGljIGludCBjb250ZW50c09mZnNldDsKKwlwdWJsaWMgaW50IGNvbnN0YW50UG9vbE9mZnNldDsKKwlwdWJsaWMgaW50IG1ldGhvZENvdW50T2Zmc2V0OworCXB1YmxpYyBpbnQgbWV0aG9kQ291bnQ7CisJcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRpbmdQcm9ibGVtVHlwZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0NPTlRFTlRTX1NJWkUgPSAxMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfSEVBREVSX1NJWkUgPSAxMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9TSVpFID0gMTAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk5FUl9DTEFTU0VTX1NJWkUgPSA1OworCXByb3RlY3RlZCBIYXNodGFibGVPZlR5cGUgbmFtZVVzYWdlOworCXB1YmxpYyBDb2RlU3RyZWFtIGNvZGVTdHJlYW07CisJcHJvdGVjdGVkIGludCBwcm9ibGVtTGluZTsJLy8gdXNlZCB0byBjcmVhdGUgbGluZSBudW1iZXIgYXR0cmlidXRlcyBmb3IgcHJvYmxlbSBtZXRob2RzCisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgQ2xhc3NGaWxlKCkgeworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBtZXRob2RzIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgorCSAqCisJICogQHBhcmFtIGFUeXBlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmcKKwkgKiBAcGFyYW0gZW5jbG9zaW5nQ2xhc3NGaWxlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGUKKwkgKiBAcGFyYW0gY3JlYXRpbmdQcm9ibGVtVHlwZSA8Q09ERT5ib29sZWFuPC9DT0RFPgorCSAqLworCXB1YmxpYyBDbGFzc0ZpbGUoCisJCVNvdXJjZVR5cGVCaW5kaW5nIGFUeXBlLAorCQlDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlLAorCQlib29sZWFuIGNyZWF0aW5nUHJvYmxlbVR5cGUpIHsKKwkJcmVmZXJlbmNlQmluZGluZyA9IGFUeXBlOworCQloZWFkZXIgPSBuZXcgYnl0ZVtJTklUSUFMX0hFQURFUl9TSVpFXTsKKwkJLy8gZ2VuZXJhdGUgdGhlIG1hZ2ljIG51bWJlcnMgaW5zaWRlIHRoZSBoZWFkZXIKKwkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IChieXRlKSAoMHhDQUZFQkFCRUwgPj4gMjQpOworCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAxNik7CisJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDgpOworCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAwKTsKKwkJc3dpdGNoKCgoU291cmNlVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpLnNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREspIHsKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkpESzFfNCA6CisJCQkJLy8gQ29tcGF0aWJsZSB3aXRoIEpESyAxLjQKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gNDg7CisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBpbGVyT3B0aW9ucy5KREsxXzMgOgorCQkJCS8vIENvbXBhdGlibGUgd2l0aCBKREsgMS4zCisJCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7CisJCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7CisJCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7CisJCQkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDQ3OworCQkJCWJyZWFrOworCQkJY2FzZSBDb21waWxlck9wdGlvbnMuSkRLMV8yIDoKKwkJCQkvLyBDb21wYXRpYmxlIHdpdGggSkRLIDEuMgorCQkJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOworCQkJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOworCQkJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOworCQkJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSA0NjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcGlsZXJPcHRpb25zLkpESzFfMSA6CisJCQkJLy8gQ29tcGF0aWJsZSB3aXRoIEpESyAxLjEKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMzsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gNDU7CisJCX0KKwkJY29uc3RhbnRQb29sT2Zmc2V0ID0gaGVhZGVyT2Zmc2V0OworCQloZWFkZXJPZmZzZXQgKz0gMjsKKwkJY29uc3RhbnRQb29sID0gbmV3IENvbnN0YW50UG9vbCh0aGlzKTsKKwkJCisJCS8vIE1vZGlmaWVyIG1hbmlwdWxhdGlvbnMgZm9yIGNsYXNzZmlsZQorCQlpbnQgYWNjZXNzRmxhZ3MgPSBhVHlwZS5nZXRBY2Nlc3NGbGFncygpOworCQlpZiAoYVR5cGUuaXNQcml2YXRlKCkpIHsgLy8gcmV3cml0ZSBwcml2YXRlIHRvIG5vbi1wdWJsaWMKKwkJCWFjY2Vzc0ZsYWdzICY9IH5BY2NQdWJsaWM7CisJCX0KKwkJaWYgKGFUeXBlLmlzUHJvdGVjdGVkKCkpIHsgLy8gcmV3cml0ZSBwcm90ZWN0ZWQgaW50byBwdWJsaWMKKwkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1B1YmxpYzsKKwkJfQorCQkvLyBjbGVhciBhbGwgYml0cyB0aGF0IGFyZSBpbGxlZ2FsIGZvciBhIGNsYXNzIG9yIGFuIGludGVyZmFjZQorCQlhY2Nlc3NGbGFncworCQkJJj0gfigKKwkJCQlBY2NTdHJpY3RmcAorCQkJCQl8IEFjY1Byb3RlY3RlZAorCQkJCQl8IEFjY1ByaXZhdGUKKwkJCQkJfCBBY2NTdGF0aWMKKwkJCQkJfCBBY2NTeW5jaHJvbml6ZWQKKwkJCQkJfCBBY2NOYXRpdmUpOworCQkJCQkKKwkJLy8gc2V0IHRoZSBBY2NTdXBlciBmbGFnIChoYXMgdG8gYmUgZG9uZSBhZnRlciBjbGVhcmluZyBBY2NTeW5jaHJvbml6ZWQgLSBzaW5jZSBzYW1lIHZhbHVlKQorCQlhY2Nlc3NGbGFncyB8PSBBY2NTdXBlcjsKKwkJCisJCXRoaXMuZW5jbG9zaW5nQ2xhc3NGaWxlID0gZW5jbG9zaW5nQ2xhc3NGaWxlOworCQkvLyBpbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWVzIGNvbXB1dGVkIGF0IGNvZGUgZ2VuIHRpbWUKKwkJaWYgKGFUeXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJCSgoTG9jYWxUeXBlQmluZGluZykgYVR5cGUpLmNvbnN0YW50UG9vbE5hbWUoCisJCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIGFUeXBlKSk7CisJCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSBhVHlwZS5tZW1iZXJUeXBlcygpOworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJKChMb2NhbFR5cGVCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkuY29uc3RhbnRQb29sTmFtZSgKKwkJCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKSk7CisJCQl9CisJCX0KKwkJY29udGVudHMgPSBuZXcgYnl0ZVtJTklUSUFMX0NPTlRFTlRTX1NJWkVdOworCQkvLyBub3cgd2UgY29udGludWUgdG8gZ2VuZXJhdGUgdGhlIGJ5dGVzIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGFjY2Vzc0ZsYWdzID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsKKwkJaW50IGNsYXNzTmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChhVHlwZSk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjbGFzc05hbWVJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY2xhc3NOYW1lSW5kZXg7CisJCWludCBzdXBlcmNsYXNzTmFtZUluZGV4OworCQlpZiAoYVR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJc3VwZXJjbGFzc05hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdCgpOworCQl9IGVsc2UgeworCQkJc3VwZXJjbGFzc05hbWVJbmRleCA9CisJCQkJKGFUeXBlLnN1cGVyY2xhc3MgPT0gbnVsbCA/IDAgOiBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFUeXBlLnN1cGVyY2xhc3MpKTsKKwkJfQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3VwZXJjbGFzc05hbWVJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3VwZXJjbGFzc05hbWVJbmRleDsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlc0JpbmRpbmcgPSBhVHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJaW50IGludGVyZmFjZXNDb3VudCA9IHN1cGVySW50ZXJmYWNlc0JpbmRpbmcubGVuZ3RoOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZXJmYWNlc0NvdW50ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlcmZhY2VzQ291bnQ7CisJCWlmIChzdXBlckludGVyZmFjZXNCaW5kaW5nICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlc0NvdW50OyBpKyspIHsKKwkJCQlpbnQgaW50ZXJmYWNlSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHN1cGVySW50ZXJmYWNlc0JpbmRpbmdbaV0pOworCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlcmZhY2VJbmRleCA+PiA4KTsKKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlcmZhY2VJbmRleDsKKwkJCX0KKwkJfQorCQlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzID0KKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIHJlZmVyZW5jZUJpbmRpbmcpCisJCQkJLnNjb3BlCisJCQkJLmVudmlyb25tZW50KCkKKwkJCQkub3B0aW9ucworCQkJCS5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzOworCQlpbm5lckNsYXNzZXNCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW0lOTkVSX0NMQVNTRVNfU0laRV07CisJCXRoaXMuY3JlYXRpbmdQcm9ibGVtVHlwZSA9IGNyZWF0aW5nUHJvYmxlbVR5cGU7CisJCWNvZGVTdHJlYW0gPSBuZXcgQ29kZVN0cmVhbSh0aGlzKTsKKworCQkvLyByZXRyaWV2ZSB0aGUgZW5jbG9zaW5nIG9uZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHByb3BhZ2F0ZWQgZmxvdyBpbmZvCisJCS8vIDFGRjlaQlU6IExGQ09NOkFMTCAtIExvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMgYnVzdGVkIChTYW5pdHkgY2hlY2spCisJCUNsYXNzRmlsZSBvdXRlcm1vc3RDbGFzc0ZpbGUgPSB0aGlzLm91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpOworCQlpZiAodGhpcyA9PSBvdXRlcm1vc3RDbGFzc0ZpbGUpIHsKKwkJCWNvZGVTdHJlYW0ubWF4RmllbGRDb3VudCA9IGFUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5tYXhGaWVsZENvdW50OworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5tYXhGaWVsZENvdW50ID0gb3V0ZXJtb3N0Q2xhc3NGaWxlLmNvZGVTdHJlYW0ubWF4RmllbGRDb3VudDsKKwkJfQorCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2dndXMgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuTWV0aG9kQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIGFkZEFic3RyYWN0TWV0aG9kKAorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwKKwkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisKKwkJLy8gZm9yY2UgdGhlIG1vZGlmaWVycyB0byBiZSBwdWJsaWMgYW5kIGFic3RyYWN0CisJCW1ldGhvZEJpbmRpbmcubW9kaWZpZXJzID0gQWNjUHVibGljIHwgQWNjQWJzdHJhY3Q7CisKKwkJdGhpcy5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSB0aGlzLmNvbnRlbnRzT2Zmc2V0OworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gdGhpcy5nZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7CisJCXRoaXMuY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZSBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSByZWNlaXZlci4KKwkgKiBGb3IgYSBjbGFzcyB0aGV5IGNvdWxkIGJlOgorCSAqIC0gc291cmNlIGZpbGUgYXR0cmlidXRlCisJICogLSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZQorCSAqIC0gZGVwcmVjYXRlZCBhdHRyaWJ1dGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKCkgeworCQkvLyB1cGRhdGUgdGhlIG1ldGhvZCBjb3VudAorCQljb250ZW50c1ttZXRob2RDb3VudE9mZnNldCsrXSA9IChieXRlKSAobWV0aG9kQ291bnQgPj4gOCk7CisJCWNvbnRlbnRzW21ldGhvZENvdW50T2Zmc2V0XSA9IChieXRlKSBtZXRob2RDb3VudDsKKworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsKKwkJLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgYW5kIHN0b3JlIHRoZSBjdXJyZW50IG9mZnNldAorCQlpbnQgYXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7CisJCWludCBjb250ZW50c0xlbmd0aDsKKworCQkvLyBzb3VyY2UgYXR0cmlidXRlCisJCWlmICgocHJvZHVjZURlYnVnQXR0cmlidXRlcyAmIENvbXBpbGVyT3B0aW9ucy5Tb3VyY2UpICE9IDApIHsKKwkJCVN0cmluZyBmdWxsRmlsZU5hbWUgPQorCQkJCW5ldyBTdHJpbmcocmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5nZXRGaWxlTmFtZSgpKTsKKwkJCWZ1bGxGaWxlTmFtZSA9IGZ1bGxGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CisJCQlpbnQgbGFzdEluZGV4ID0gZnVsbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcvJyk7CisJCQlpZiAobGFzdEluZGV4ICE9IC0xKSB7CisJCQkJZnVsbEZpbGVOYW1lID0gZnVsbEZpbGVOYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCBmdWxsRmlsZU5hbWUubGVuZ3RoKCkpOworCQkJfQorCQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGZpZWxkIGluZm8gY29ycmVzcG9uZGluZworCQkJLy8gdG8gdGhlIEBmaWVsZEJpbmRpbmcKKwkJCWlmIChjb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWNvbnRlbnRzLAorCQkJCQkwLAorCQkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJCTAsCisJCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJCX0KKwkJCWludCBzb3VyY2VBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU291cmNlTmFtZSk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc291cmNlQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc291cmNlQXR0cmlidXRlTmFtZUluZGV4OworCQkJLy8gVGhlIGxlbmd0aCBvZiBhIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZSBpcyAyLiBUaGlzIGlzIGEgZml4ZWQtbGVuZ3RoCisJCQkvLyBhdHRyaWJ1dGUKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKKwkJCS8vIHdyaXRlIHRoZSBzb3VyY2UgZmlsZSBuYW1lCisJCQlpbnQgZmlsZU5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZnVsbEZpbGVOYW1lLnRvQ2hhckFycmF5KCkpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZpbGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmaWxlTmFtZUluZGV4OworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUKKwkJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNEZXByZWNhdGVkKCkpIHsKKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBmaWVsZCBpbmZvIGNvcnJlc3BvbmRpbmcKKwkJCS8vIHRvIHRoZSBAZmllbGRCaW5kaW5nCisJCQlpZiAoY29udGVudHNPZmZzZXQgKyA2ID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQljb250ZW50cywKKwkJCQkJMCwKKwkJCQkJKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCQkwLAorCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQl9CisJCQlpbnQgZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5EZXByZWNhdGVkTmFtZSk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVwcmVjYXRlZEF0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDAKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWF0dHJpYnV0ZU51bWJlcisrOworCQl9CisJCS8vIElubmVyIGNsYXNzIGF0dHJpYnV0ZQorCQlpZiAobnVtYmVyT2ZJbm5lckNsYXNzZXMgIT0gMCkgeworCQkJLy8gR2VuZXJhdGUgdGhlIGlubmVyIGNsYXNzIGF0dHJpYnV0ZQorCQkJaW50IGV4U2l6ZTsKKwkJCWlmIChjb250ZW50c09mZnNldCArIChleFNpemUgPSAoOCAqIG51bWJlck9mSW5uZXJDbGFzc2VzICsgOCkpCisJCQkJPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWNvbnRlbnRzLAorCQkJCQkwLAorCQkJCQkoY29udGVudHMgPQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGgKKwkJCQkJCQkrIChleFNpemUgPj0gSU5DUkVNRU5UX1NJWkUgPyBleFNpemUgOiBJTkNSRU1FTlRfU0laRSldKSwKKwkJCQkJMCwKKwkJCQkJY29udGVudHNMZW5ndGgpOworCQkJfQorCQkJLy8gTm93IHdlIG5vdyB0aGUgc2l6ZSBvZiB0aGUgYXR0cmlidXRlIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMKKwkJCS8vIGF0dHJpYnV0ZSBuYW1lCisJCQlpbnQgYXR0cmlidXRlTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLklubmVyQ2xhc3NOYW1lKTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQlpbnQgdmFsdWUgPSAobnVtYmVyT2ZJbm5lckNsYXNzZXMgPDwgMykgKyAyOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAxNik7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZklubmVyQ2xhc3NlcyA+PiA4KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG51bWJlck9mSW5uZXJDbGFzc2VzOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZklubmVyQ2xhc3NlczsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBpbm5lckNsYXNzID0gaW5uZXJDbGFzc2VzQmluZGluZ3NbaV07CisJCQkJaW50IGFjY2Vzc0ZsYWdzID0gaW5uZXJDbGFzcy5nZXRBY2Nlc3NGbGFncygpOworCQkJCWludCBpbm5lckNsYXNzSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGlubmVyQ2xhc3MpOworCQkJCS8vIGlubmVyIGNsYXNzIGluZGV4CisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGlubmVyQ2xhc3NJbmRleCA+PiA4KTsKKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbm5lckNsYXNzSW5kZXg7CisJCQkJLy8gb3V0ZXIgY2xhc3MgaW5kZXg6IGFub255bW91cyBhbmQgbG9jYWwgaGF2ZSBubyBvdXRlciBjbGFzcyBpbmRleAorCQkJCWlmIChpbm5lckNsYXNzLmlzTWVtYmVyVHlwZSgpKSB7CisJCQkJCS8vIG1lbWJlciBvciBtZW1iZXIgb2YgbG9jYWwKKwkJCQkJaW50IG91dGVyQ2xhc3NJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoaW5uZXJDbGFzcy5lbmNsb3NpbmdUeXBlKCkpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAob3V0ZXJDbGFzc0luZGV4ID4+IDgpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBvdXRlckNsYXNzSW5kZXg7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgbm90IGEgbWVtYmVyIHR5cGUKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJfQorCQkJCS8vIG5hbWUgaW5kZXgKKwkJCQlpZiAoIWlubmVyQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoaW5uZXJDbGFzcy5zb3VyY2VOYW1lKCkpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZXF1YWxzIHRvIDAgaWYgdGhlIGlubmVyQ2xhc3MgaXMgYW4gYW5vbnltb3VzIHR5cGUKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJfQorCQkJCS8vIGFjY2VzcyBmbGFnCisJCQkJaWYgKGlubmVyQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQkJYWNjZXNzRmxhZ3MgfD0gQWNjUHJpdmF0ZTsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKGlubmVyQ2xhc3MuaXNMb2NhbFR5cGUoKSAmJiAhaW5uZXJDbGFzcy5pc01lbWJlclR5cGUoKSkgeworCQkJCQkJYWNjZXNzRmxhZ3MgfD0gQWNjUHJpdmF0ZTsKKwkJCQkJfQorCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsKKwkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsKKwkJCX0KKwkJCWF0dHJpYnV0ZU51bWJlcisrOworCQl9CisJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKwkJY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGg7CisJCWlmIChhdHRyaWJ1dGVPZmZzZXQgKyAyID49IGNvbnRlbnRzTGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWNvbnRlbnRzLAorCQkJCTAsCisJCQkJKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWNvbnRlbnRzW2F0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKworCQkvLyByZXN5bmNocm9uaXplIGFsbCBvZmZzZXRzIG9mIHRoZSBjbGFzc2ZpbGUKKwkJaGVhZGVyID0gY29uc3RhbnRQb29sLnBvb2xDb250ZW50OworCQloZWFkZXJPZmZzZXQgPSBjb25zdGFudFBvb2wuY3VycmVudE9mZnNldDsKKwkJaW50IGNvbnN0YW50UG9vbENvdW50ID0gY29uc3RhbnRQb29sLmN1cnJlbnRJbmRleDsKKwkJaGVhZGVyW2NvbnN0YW50UG9vbE9mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRQb29sQ291bnQgPj4gOCk7CisJCWhlYWRlcltjb25zdGFudFBvb2xPZmZzZXRdID0gKGJ5dGUpIGNvbnN0YW50UG9vbENvdW50OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBtZXRob2RzIGdlbmVyYXRlIGFsbCB0aGUgZGVmYXVsdCBhYnN0cmFjdCBtZXRob2QgaW5mb3MgdGhhdCBjb3JyZXBvbmQgdG8KKwkgKiB0aGUgYWJzdHJhY3QgbWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBzdXBlcmludGVyZmFjZXMuCisJICovCisJcHVibGljIHZvaWQgYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpIHsgLy8gZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCisJCU1ldGhvZEJpbmRpbmdbXSBkZWZhdWx0QWJzdHJhY3RNZXRob2RzID0KKwkJCXJlZmVyZW5jZUJpbmRpbmcuZ2V0RGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZGVmYXVsdEFic3RyYWN0TWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOworCQkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShkZWZhdWx0QWJzdHJhY3RNZXRob2RzW2ldKTsKKwkJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoaXMgbWV0aG9kcyBnZW5lcmF0ZXMgdGhlIGJ5dGVzIGZvciB0aGUgZmllbGQgYmluZGluZyBwYXNzZWQgbGlrZSBhIHBhcmFtZXRlcgorCSAqIEBwYXJhbSBmaWVsZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRGaWVsZEluZm8oRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgeworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsKKwkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIGZpZWxkIGluZm8gY29ycmVzcG9uZGluZworCQkvLyB0byB0aGUgQGZpZWxkQmluZGluZworCQlpbnQgY29udGVudHNMZW5ndGg7CisJCWlmIChjb250ZW50c09mZnNldCArIDMwID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJLy8gR2VuZXJhdGUgdHdvIGF0dHJpYnV0ZTogY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSBhbmQgU3ludGhldGljQXR0cmlidXRlCisJCS8vIE5vdyB3ZSBjYW4gZ2VuZXJhdGUgYWxsIGVudHJpZXMgaW50byB0aGUgYnl0ZSBhcnJheQorCQkvLyBGaXJzdCB0aGUgYWNjZXNzRmxhZ3MKKwkJaW50IGFjY2Vzc0ZsYWdzID0gZmllbGRCaW5kaW5nLmdldEFjY2Vzc0ZsYWdzKCk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgYWNjZXNzRmxhZ3M7CisJCS8vIFRoZW4gdGhlIG5hbWVJbmRleAorCQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcubmFtZSk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJLy8gVGhlbiB0aGUgZGVzY3JpcHRvckluZGV4CisJCWludCBkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy50eXBlLnNpZ25hdHVyZSgpKTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKwkJaW50IGZpZWxkQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7CisJCS8vIDQuNy4yIG9ubHkgc3RhdGljIGNvbnN0YW50IGZpZWxkcyBnZXQgYSBDb25zdGFudEF0dHJpYnV0ZQorCQlpZiAoZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudAorCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50LnR5cGVJRCgpICE9IFRfbnVsbCkgeworCQkJLy8gTm93IHdlIGdlbmVyYXRlIHRoZSBjb25zdGFudCBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGRCaW5kaW5nCisJCQlpbnQgY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db25zdGFudFZhbHVlTmFtZSk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29uc3RhbnRWYWx1ZU5hbWVJbmRleCA+PiA4KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGNvbnN0YW50VmFsdWVOYW1lSW5kZXg7CisJCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IDIgaW4gY2FzZSBvZiBhIGNvbnN0YW50VmFsdWUgYXR0cmlidXRlCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7CisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCS8vIE5lZWQgdG8gYWRkIHRoZSBjb25zdGFudF92YWx1ZV9pbmRleAorCQkJc3dpdGNoIChmaWVsZEJpbmRpbmcuY29uc3RhbnQudHlwZUlEKCkpIHsKKwkJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJCWludCBib29sZWFuVmFsdWVJbmRleCA9CisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA/IDEgOiAwKTsKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGJvb2xlYW5WYWx1ZUluZGV4ID4+IDgpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBib29sZWFuVmFsdWVJbmRleDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUX2J5dGUgOgorCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQljYXNlIFRfaW50IDoKKwkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQlpbnQgaW50ZWdlclZhbHVlSW5kZXggPQorCQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcuY29uc3RhbnQuaW50VmFsdWUoKSk7CisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChpbnRlZ2VyVmFsdWVJbmRleCA+PiA4KTsKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgaW50ZWdlclZhbHVlSW5kZXg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCWludCBmbG9hdFZhbHVlSW5kZXggPQorCQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcuY29uc3RhbnQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGZsb2F0VmFsdWVJbmRleCA+PiA4KTsKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZmxvYXRWYWx1ZUluZGV4OworCQkJCQlicmVhazsKKwkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJaW50IGRvdWJsZVZhbHVlSW5kZXggPQorCQkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChmaWVsZEJpbmRpbmcuY29uc3RhbnQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkb3VibGVWYWx1ZUluZGV4ID4+IDgpOworCQkJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkb3VibGVWYWx1ZUluZGV4OworCQkJCQlicmVhazsKKwkJCQljYXNlIFRfbG9uZyA6CisJCQkJCWludCBsb25nVmFsdWVJbmRleCA9CisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZy5jb25zdGFudC5sb25nVmFsdWUoKSk7CisJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb25nVmFsdWVJbmRleCA+PiA4KTsKKwkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9uZ1ZhbHVlSW5kZXg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVF9TdHJpbmcgOgorCQkJCQlpbnQgc3RyaW5nVmFsdWVJbmRleCA9CisJCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KAorCQkJCQkJCSgoU3RyaW5nQ29uc3RhbnQpIGZpZWxkQmluZGluZy5jb25zdGFudCkuc3RyaW5nVmFsdWUoKSk7CisJCQkJCWlmIChzdHJpbmdWYWx1ZUluZGV4ID09IC0xKSB7CisJCQkJCQlpZiAoIWNyZWF0aW5nUHJvYmxlbVR5cGUpIHsKKwkJCQkJCQkvLyByZXBvcnQgYW4gZXJyb3IgYW5kIGFib3J0OiB3aWxsIGxlYWQgdG8gYSBwcm9ibGVtIHR5cGUgY2xhc3NmaWxlIGNyZWF0aW9uCisJCQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNscyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQkJaWYgKGZpZWxkRGVjbHNbaV0uYmluZGluZyA9PSBmaWVsZEJpbmRpbmcpIHsKKwkJCQkJCQkJCS8vIHByb2JsZW0gc2hvdWxkIGFib3J0CisJCQkJCQkJCQl0eXBlRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RyaW5nQ29uc3RhbnRJc0V4Y2VlZGluZ1V0ZjhMaW1pdCgKKwkJCQkJCQkJCQlmaWVsZERlY2xzW2ldKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gYWxyZWFkeSBpbnNpZGUgYSBwcm9ibGVtIHR5cGUgY3JlYXRpb24gOiBubyBjb25zdGFudCBmb3IgdGhpcyBmaWVsZAorCQkJCQkJCWNvbnRlbnRzT2Zmc2V0ID0gZmllbGRBdHRyaWJ1dGVPZmZzZXQgKyAyOworCQkJCQkJCS8vICsyIGlzIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSB0d28gYnl0ZSBzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBudW1iZXIKKwkJCQkJCQlhdHRyaWJ1dGVOdW1iZXItLTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdHJpbmdWYWx1ZUluZGV4ID4+IDgpOworCQkJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RyaW5nVmFsdWVJbmRleDsKKwkJCQkJfQorCQkJfQorCQl9CisJCWlmIChmaWVsZEJpbmRpbmcuaXNTeW50aGV0aWMoKSkgeworCQkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TeW50aGV0aWNOYW1lKTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCQkvLyB0aGUgbGVuZ3RoIG9mIGEgc3ludGhldGljIGF0dHJpYnV0ZSBpcyBlcXVhbHMgdG8gMAorCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJaWYgKGZpZWxkQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgeworCQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRGVwcmVjYXRlZE5hbWUpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4OworCQkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQljb250ZW50c1tmaWVsZEF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQljb250ZW50c1tmaWVsZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBtZXRob2RzIGdlbmVyYXRlIGFsbCB0aGUgZmllbGRzIGluZm9zIGZvciB0aGUgcmVjZWl2ZXIuCisJICogVGhpcyBpbmNsdWRlczoKKwkgKiAtIGEgZmllbGQgaW5mbyBmb3IgZWFjaCBkZWZpbmVkIGZpZWxkIG9mIHRoYXQgY2xhc3MKKwkgKiAtIGEgZmllbGQgaW5mbyBmb3IgZWFjaCBzeW50aGV0aWMgZmllbGQgKGUuZy4gdGhpcyQwKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZEZpZWxkSW5mb3MoKSB7CisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gcmVmZXJlbmNlQmluZGluZzsKKwkJRmllbGRCaW5kaW5nW10gc3ludGhldGljRmllbGRzID0gY3VycmVudEJpbmRpbmcuc3ludGhldGljRmllbGRzKCk7CisJCWludCBmaWVsZENvdW50ID0KKwkJCWN1cnJlbnRCaW5kaW5nLmZpZWxkQ291bnQoKQorCQkJCSsgKHN5bnRoZXRpY0ZpZWxkcyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0ZpZWxkcy5sZW5ndGgpOworCisJCS8vIHdyaXRlIHRoZSBudW1iZXIgb2YgZmllbGRzCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWVsZENvdW50ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmaWVsZENvdW50OworCisJCUZpZWxkQmluZGluZ1tdIGZpZWxkQmluZGluZ3MgPSBjdXJyZW50QmluZGluZy5maWVsZHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkQmluZGluZ3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWFkZEZpZWxkSW5mbyhmaWVsZEJpbmRpbmdzW2ldKTsKKwkJfQorCQlpZiAoc3ludGhldGljRmllbGRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNGaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlhZGRGaWVsZEluZm8oc3ludGhldGljRmllbGRzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBtZXRob2RzIHN0b3JlcyB0aGUgYmluZGluZ3MgZm9yIGVhY2ggaW5uZXIgY2xhc3MuIFRoZXkgd2lsbCBiZSB1c2VkIHRvIGtub3cgd2hpY2ggZW50cmllcworCSAqIGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGUgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGVzLgorCSAqIEBwYXJhbSByZWZlcmVuY2VCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZyAKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRJbm5lckNsYXNzZXMoUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nKSB7CisJCS8vIGNoZWNrIGZpcnN0IGlmIHRoYXQgcmVmZXJlbmNlIGJpbmRpbmcgaXMgdGhlcmUKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZklubmVyQ2xhc3NlczsgaSsrKSB7CisJCQlpZiAoaW5uZXJDbGFzc2VzQmluZGluZ3NbaV0gPT0gcmVmZXJlbmNlQmluZGluZykKKwkJCQlyZXR1cm47CisJCX0KKwkJaW50IGxlbmd0aCA9IGlubmVyQ2xhc3Nlc0JpbmRpbmdzLmxlbmd0aDsKKwkJaWYgKG51bWJlck9mSW5uZXJDbGFzc2VzID09IGxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlpbm5lckNsYXNzZXNCaW5kaW5ncywKKwkJCQkwLAorCQkJCShpbm5lckNsYXNzZXNCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xlbmd0aCAqIDJdKSwKKwkJCQkwLAorCQkJCWxlbmd0aCk7CisJCX0KKwkJaW5uZXJDbGFzc2VzQmluZGluZ3NbbnVtYmVyT2ZJbm5lckNsYXNzZXMrK10gPSByZWZlcmVuY2VCaW5kaW5nOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBjbGluaXQgbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1bXQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1DbGluaXQoSVByb2JsZW1bXSBwcm9ibGVtcykgeworCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXJGb3JDbGluaXQoKTsKKwkJLy8gbGVhdmUgdHdvIHNwYWNlcyBmb3IgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCisJCWNvbnRlbnRzT2Zmc2V0IC09IDI7CisJCWludCBhdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJY29udGVudHNPZmZzZXQgKz0gMjsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7CisKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CisJCWNvZGVTdHJlYW0ucmVzZXRGb3JQcm9ibGVtQ2xpbml0KHRoaXMpOworCQlTdHJpbmcgcHJvYmxlbVN0cmluZyA9ICIiIDsgLy8kTk9OLU5MUy0xJAorCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgeworCQkJaW50IG1heCA9IHByb2JsZW1zLmxlbmd0aDsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDI1KTsKKwkJCWludCBjb3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOworCQkJCWlmICgocHJvYmxlbSAhPSBudWxsKSAmJiAocHJvYmxlbS5pc0Vycm9yKCkpKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IiAgK3Byb2JsZW0uZ2V0TWVzc2FnZSgpICsgIlxuIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJY291bnQrKzsKKwkJCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKKwkJCQkJCXByb2JsZW1MaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7CisJCQkJCX0KKwkJCQkJcHJvYmxlbXNbaV0gPSBudWxsOworCQkJCX0KKwkJCX0gLy8gaW5zZXJ0IHRoZSB0b3AgbGluZSBhZnRlcndhcmRzLCBvbmNlIGtub3dpbmcgaG93IG1hbnkgcHJvYmxlbXMgd2UgaGF2ZSB0byBjb25zaWRlcgorCQkJaWYgKGNvdW50ID4gMSkgeworCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbXMiICkpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbSIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCisJCS8vIHJldHVybiBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoY29tcC5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCAiIikKKwkJaW50W10gZXhjZXB0aW9uSGFuZGxlciA9CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoCisJCQkJcmVmZXJlbmNlQmluZGluZworCQkJCQkuc2NvcGUKKwkJCQkJLmVudmlyb25tZW50KCkKKwkJCQkJLm9wdGlvbnMKKwkJCQkJLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLAorCQkJCXByb2JsZW1TdHJpbmcpOworCQlhdHRyaWJ1dGVOdW1iZXIrKzsgLy8gY29kZSBhdHRyaWJ1dGUKKwkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yQ2xpbml0KAorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCWV4Y2VwdGlvbkhhbmRsZXIsCisJCQlyZWZlcmVuY2VCaW5kaW5nCisJCQkJLnNjb3BlCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpCisJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQljb250ZW50c1thdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKKwkJY29udGVudHNbYXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBjb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcKKwkgKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcm9ibGVtQ29uc3RydWN0b3IoCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsCisJCUlQcm9ibGVtW10gcHJvYmxlbXMpIHsKKworCQkvLyBhbHdheXMgY2xlYXIgdGhlIHN0cmljdGZwL25hdGl2ZS9hYnN0cmFjdCBiaXQgZm9yIGEgcHJvYmxlbSBtZXRob2QKKwkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgJj0gfihBY2NTdHJpY3RmcCB8IEFjY05hdGl2ZSB8IEFjY0Fic3RyYWN0KTsKKworCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsKKwkJCisJCS8vIENvZGUgYXR0cmlidXRlCisJCWF0dHJpYnV0ZU51bWJlcisrOworCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKKwkJZmluYWwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IG1ldGhvZC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKTsKKwkJY29kZVN0cmVhbS5yZXNldChtZXRob2QsIHRoaXMpOworCQlTdHJpbmcgcHJvYmxlbVN0cmluZyA9ICIiIDsgLy8kTk9OLU5MUy0xJAorCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgeworCQkJaW50IG1heCA9IHByb2JsZW1zLmxlbmd0aDsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDI1KTsKKwkJCWludCBjb3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOworCQkJCWlmICgocHJvYmxlbSAhPSBudWxsKSAmJiAocHJvYmxlbS5pc0Vycm9yKCkpKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IiAgK3Byb2JsZW0uZ2V0TWVzc2FnZSgpICsgIlxuIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJY291bnQrKzsKKwkJCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKKwkJCQkJCXByb2JsZW1MaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IC8vIGluc2VydCB0aGUgdG9wIGxpbmUgYWZ0ZXJ3YXJkcywgb25jZSBrbm93aW5nIGhvdyBtYW55IHByb2JsZW1zIHdlIGhhdmUgdG8gY29uc2lkZXIKKwkJCWlmIChjb3VudCA+IDEpIHsKKwkJCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zIiApKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuaW5zZXJ0KDAsIFV0aWwuYmluZCgiY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW0iICkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlwcm9ibGVtU3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKworCQkvLyByZXR1cm4gY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKGNvbXAub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwgIiIpCisJCWludFtdIGV4Y2VwdGlvbkhhbmRsZXIgPQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKAorCQkJCXByb2JsZW1SZXBvcnRlci5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLAorCQkJCXByb2JsZW1TdHJpbmcpOworCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKAorCQkJbWV0aG9kLAorCQkJbWV0aG9kQmluZGluZywKKwkJCWNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCQlleGNlcHRpb25IYW5kbGVyLAorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCQkuc2NvcGUKKwkJCQkucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkKKwkJCQkuY29tcGlsYXRpb25SZXN1bHQKKwkJCQkubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7CisJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIGJvZ2d1cyBjb25zdHJ1Y3Rvci4KKwkgKiBSZXNldCB0aGUgcG9zaXRpb24gaW5zaWRlIHRoZSBjb250ZW50cyBieXRlIGFycmF5IHRvIHRoZSBzYXZlZE9mZnNldC4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcKKwkgKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10KKwkgKiBAcGFyYW0gc2F2ZWRPZmZzZXQgPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1Db25zdHJ1Y3RvcigKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsCisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywKKwkJSVByb2JsZW1bXSBwcm9ibGVtcywKKwkJaW50IHNhdmVkT2Zmc2V0KSB7CisJCS8vIHdlIG5lZWQgdG8gbW92ZSBiYWNrIHRoZSBjb250ZW50c09mZnNldCB0byB0aGUgdmFsdWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kCisJCWNvbnRlbnRzT2Zmc2V0ID0gc2F2ZWRPZmZzZXQ7CisJCW1ldGhvZENvdW50LS07IC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXRob2QgdGhhdCBjYXVzZXMgdGhlIHByb2JsZW0KKwkJYWRkUHJvYmxlbUNvbnN0cnVjdG9yKG1ldGhvZCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXMpOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIGEgcHJvYmxlbSBtZXRob2QgaW5mbyB0aGF0IGNvcnJlc3BvbmQgdG8gYSBib2dndXMgbWV0aG9kLgorCSAqCisJICogQHBhcmFtIG1ldGhvZCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuTWV0aG9kQmluZGluZworCSAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1bXQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1NZXRob2QoCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsCisJCUlQcm9ibGVtW10gcHJvYmxlbXMpIHsKKwkJaWYgKG1ldGhvZEJpbmRpbmcuaXNBYnN0cmFjdCgpICYmIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJbWV0aG9kLmFib3J0KEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uQWJvcnRUeXBlKTsKKwkJfQorCQkvLyBhbHdheXMgY2xlYXIgdGhlIHN0cmljdGZwL25hdGl2ZS9hYnN0cmFjdCBiaXQgZm9yIGEgcHJvYmxlbSBtZXRob2QKKwkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgJj0gfihBY2NTdHJpY3RmcCB8IEFjY05hdGl2ZSB8IEFjY0Fic3RyYWN0KTsKKworCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShtZXRob2RCaW5kaW5nKTsKKwkJCisJCS8vIENvZGUgYXR0cmlidXRlCisJCWF0dHJpYnV0ZU51bWJlcisrOworCQkKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CisJCWZpbmFsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSBtZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7CisJCWNvZGVTdHJlYW0ucmVzZXQobWV0aG9kLCB0aGlzKTsKKwkJU3RyaW5nIHByb2JsZW1TdHJpbmcgPSAiIiA7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsKKwkJCWludCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyNSk7CisJCQlpbnQgY291bnQgPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCUlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKKwkJCQlpZiAoKHByb2JsZW0gIT0gbnVsbCkKKwkJCQkJJiYgKHByb2JsZW0uaXNFcnJvcigpKQorCQkJCQkmJiAocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpID49IG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KQorCQkJCQkmJiAocHJvYmxlbS5nZXRTb3VyY2VFbmQoKSA8PSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQpKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IiAgK3Byb2JsZW0uZ2V0TWVzc2FnZSgpICsgIlxuIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJY291bnQrKzsKKwkJCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKKwkJCQkJCXByb2JsZW1MaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7CisJCQkJCX0KKwkJCQkJcHJvYmxlbXNbaV0gPSBudWxsOworCQkJCX0KKwkJCX0gLy8gaW5zZXJ0IHRoZSB0b3AgbGluZSBhZnRlcndhcmRzLCBvbmNlIGtub3dpbmcgaG93IG1hbnkgcHJvYmxlbXMgd2UgaGF2ZSB0byBjb25zaWRlcgorCQkJaWYgKGNvdW50ID4gMSkgeworCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbXMiICkpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbSIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCisJCS8vIHJldHVybiBjb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoY29tcC5vcHRpb25zLnJ1bnRpbWVFeGNlcHRpb25OYW1lRm9yQ29tcGlsZUVycm9yLCAiIikKKwkJaW50W10gZXhjZXB0aW9uSGFuZGxlciA9CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoCisJCQkJcHJvYmxlbVJlcG9ydGVyLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsCisJCQkJcHJvYmxlbVN0cmluZyk7CisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclByb2JsZW1NZXRob2QoCisJCQltZXRob2QsCisJCQltZXRob2RCaW5kaW5nLAorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCWV4Y2VwdGlvbkhhbmRsZXIsCisJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKQorCQkJCS5zY29wZQorCQkJCS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKQorCQkJCS5jb21waWxhdGlvblJlc3VsdAorCQkJCS5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsKKwkJY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgYm9nZ3VzIG1ldGhvZC4KKwkgKiBSZXNldCB0aGUgcG9zaXRpb24gaW5zaWRlIHRoZSBjb250ZW50cyBieXRlIGFycmF5IHRvIHRoZSBzYXZlZE9mZnNldC4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2Qgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLk1ldGhvZEJpbmRpbmcKKwkgKiBAcGFyYW0gcHJvYmxlbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtW10KKwkgKiBAcGFyYW0gc2F2ZWRPZmZzZXQgPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFByb2JsZW1NZXRob2QoCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAorCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsCisJCUlQcm9ibGVtW10gcHJvYmxlbXMsCisJCWludCBzYXZlZE9mZnNldCkgeworCQkvLyB3ZSBuZWVkIHRvIG1vdmUgYmFjayB0aGUgY29udGVudHNPZmZzZXQgdG8gdGhlIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZAorCQljb250ZW50c09mZnNldCA9IHNhdmVkT2Zmc2V0OworCQltZXRob2RDb3VudC0tOyAvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbWV0aG9kIHRoYXQgY2F1c2VzIHRoZSBwcm9ibGVtCisJCWFkZFByb2JsZW1NZXRob2QobWV0aG9kLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtcyk7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYWxsIHRoZSBzcGVjaWFsIG1ldGhvZCBpbmZvcy4KKwkgKiBUaGV5IGFyZToKKwkgKiAtIHN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kcworCSAqIC0gZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCisJICovCisJcHVibGljIHZvaWQgYWRkU3BlY2lhbE1ldGhvZHMoKSB7CisJCS8vIGFkZCBhbGwgbWV0aG9kcyAoZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzIGFuZCBzeW50aGV0aWMpCisKKwkJLy8gZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCisJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gcmVmZXJlbmNlQmluZGluZzsKKwkJTWV0aG9kQmluZGluZ1tdIGRlZmF1bHRBYnN0cmFjdE1ldGhvZHMgPQorCQkJY3VycmVudEJpbmRpbmcuZ2V0RGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZGVmYXVsdEFic3RyYWN0TWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKGRlZmF1bHRBYnN0cmFjdE1ldGhvZHNbaV0pOworCQkJaW50IG1ldGhvZEF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQkJaW50IGF0dHJpYnV0ZU51bWJlciA9IGdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShkZWZhdWx0QWJzdHJhY3RNZXRob2RzW2ldKTsKKwkJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7CisJCX0KKwkJLy8gYWRkIHN5bnRoZXRpYyBtZXRob2RzIGluZm9zCisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNBY2Nlc3NNZXRob2RzID0KKwkJCWN1cnJlbnRCaW5kaW5nLnN5bnRoZXRpY0FjY2Vzc01ldGhvZHMoKTsKKwkJaWYgKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FjY2Vzc01ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc01ldGhvZEJpbmRpbmcgPSBzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldOworCQkJCXN3aXRjaCAoYWNjZXNzTWV0aG9kQmluZGluZy5hY2Nlc3NUeXBlKSB7CisJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5GaWVsZFJlYWRBY2Nlc3MgOgorCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIHJlYWRpbmcgYWNjZXNzIHRvCisJCQkJCQkvLyBhIHByaXZhdGUgZmllbGQKKwkJCQkJCWFkZFN5bnRoZXRpY0ZpZWxkUmVhZEFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuRmllbGRXcml0ZUFjY2VzcyA6CisJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gd3JpdGluZyBhY2Nlc3MgdG8KKwkJCQkJCS8vIGEgcHJpdmF0ZSBmaWVsZAorCQkJCQkJYWRkU3ludGhldGljRmllbGRXcml0ZUFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuTWV0aG9kQWNjZXNzIDoKKwkJCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiBhY2Nlc3MgdG8gYSBwcml2YXRlIG1ldGhvZAorCQkJCQkJYWRkU3ludGhldGljTWV0aG9kQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5Db25zdHJ1Y3RvckFjY2VzcyA6CisJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QKKwkJCQkJCWFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogR2VuZXJhdGUgdGhlIGJ5dGUgZm9yIHByb2JsZW0gbWV0aG9kIGluZm9zIHRoYXQgY29ycmVzcG9uZCB0byBtaXNzaW5nIGFic3RyYWN0IG1ldGhvZHMuCisJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc5CisJICoKKwkgKiBAcGFyYW0gbWV0aG9kRGVjbGFyYXRpb25zIEFycmF5IG9mIGFsbCBtaXNzaW5nIGFic3RyYWN0IG1ldGhvZHMKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU1pc3NpbmdBYnN0cmFjdE1ldGhvZHMoTWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJCWlmIChtZXRob2REZWNsYXJhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gbWV0aG9kRGVjbGFyYXRpb25zW2ldOworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmc7CisJCSAJCVN0cmluZyByZWFkYWJsZU5hbWUgPSBuZXcgU3RyaW5nKG1ldGhvZEJpbmRpbmcucmVhZGFibGVOYW1lKCkpOworCQkgCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbXM7CisJCSAJCWludCBwcm9ibGVtc0NvdW50ID0gY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50OworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvYmxlbXNDb3VudDsgaisrKSB7CisJCQkJCUlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tqXTsKKwkJCQkJaWYgKHByb2JsZW0gIT0gbnVsbAorCQkJCQkJJiYgcHJvYmxlbS5nZXRJRCgpID09IElQcm9ibGVtLkFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQKKwkJCQkJCSYmIHByb2JsZW0uZ2V0TWVzc2FnZSgpLmluZGV4T2YocmVhZGFibGVOYW1lKSAhPSAtMSkgeworCQkJCQkJCS8vIHdlIGZvdW5kIGEgbWF0Y2gKKwkJCQkJCQlhZGRNaXNzaW5nQWJzdHJhY3RQcm9ibGVtTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtLCBjb21waWxhdGlvblJlc3VsdCk7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRNaXNzaW5nQWJzdHJhY3RQcm9ibGVtTWV0aG9kKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsIElQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJCS8vIGFsd2F5cyBjbGVhciB0aGUgc3RyaWN0ZnAvbmF0aXZlL2Fic3RyYWN0IGJpdCBmb3IgYSBwcm9ibGVtIG1ldGhvZAorCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyAmPSB+KEFjY1N0cmljdGZwIHwgQWNjTmF0aXZlIHwgQWNjQWJzdHJhY3QpOworCQkKKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOworCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBnZW5lcmF0ZU1ldGhvZEluZm9BdHRyaWJ1dGUobWV0aG9kQmluZGluZyk7CisJCQorCQkvLyBDb2RlIGF0dHJpYnV0ZQorCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyNSk7CisJCWJ1ZmZlci5hcHBlbmQoIlx0IiAgKyBwcm9ibGVtLmdldE1lc3NhZ2UoKSArICJcbiIgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1ZmZlci5pbnNlcnQoMCwgVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bnJlc29sdmVkUHJvYmxlbSIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIHByb2JsZW1TdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKKwkJdGhpcy5wcm9ibGVtTGluZSA9IHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpOworCQkKKwkJZmluYWwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IG1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpOworCQljb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCWNvZGVTdHJlYW0ucHJlc2VydmVVbnVzZWRMb2NhbHMgPSB0cnVlOworCQljb2RlU3RyZWFtLmluaXRpYWxpemVNYXhMb2NhbHMobWV0aG9kQmluZGluZyk7CisKKwkJLy8gcmV0dXJuIGNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZChjb21wLm9wdGlvbnMucnVudGltZUV4Y2VwdGlvbk5hbWVGb3JDb21waWxlRXJyb3IsICIiKQorCQlpbnRbXSBleGNlcHRpb25IYW5kbGVyID0KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb2RlQXR0cmlidXRlRm9yUHJvYmxlbU1ldGhvZCgKKwkJCQlwcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5ydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciwKKwkJCQlwcm9ibGVtU3RyaW5nKTsKKwkJCQkKKwkJY29tcGxldGVDb2RlQXR0cmlidXRlRm9yTWlzc2luZ0Fic3RyYWN0UHJvYmxlbU1ldGhvZCgKKwkJCW1ldGhvZEJpbmRpbmcsCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJZXhjZXB0aW9uSGFuZGxlciwKKwkJCWNvbXBpbGF0aW9uUmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQkJCisJCWNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgY29tcGxldGVDb2RlQXR0cmlidXRlRm9yTWlzc2luZ0Fic3RyYWN0UHJvYmxlbU1ldGhvZCgKKwkJTWV0aG9kQmluZGluZyBiaW5kaW5nLAorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJaW50W10gZXhjZXB0aW9uSGFuZGxlciwKKwkJaW50W10gc3RhcnRMaW5lSW5kZXhlcykgeworCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KKwkJYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUvLyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVBdHRyaWJ1dGUvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLgorCQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOworCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsKKwkJaW50IGNvZGVfbGVuZ3RoID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUKKwkJaW50IGNvbnRlbnRzTGVuZ3RoOworCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDUwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsKKwkJaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlclswXTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0OworCQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlclsxXTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7CisJCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25IYW5kbGVyWzJdOworCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsKKwkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0V4Y2VwdGlvbigpOworCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsgLy8gZGVidWcgYXR0cmlidXRlcworCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQorCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsKKwkJCS8qIENyZWF0ZSBhbmQgYWRkIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgKHVzZWQgZm9yIGRlYnVnZ2luZykgCisJCQkgICAgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6CisJCQkgICAgKiAoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQorCQkJICAgICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCisJCQkgICAgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQorCQkJICAgICovCisJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4OworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOworCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKKwkJCQlwcm9ibGVtTGluZSA9IHNlYXJjaExpbmVOdW1iZXIoc3RhcnRMaW5lSW5kZXhlcywgYmluZGluZy5zb3VyY2VTdGFydCgpKTsKKwkJCX0KKwkJCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMAorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHByb2JsZW1MaW5lOworCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQkKKwkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCisJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgbG9jYWxDb250ZW50cyBhcnJheQorCQlpZiAoY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCArIDIKKwkJCT49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCQkvLyB1cGRhdGUgdGhlIGF0dHJpYnV0ZSBsZW5ndGgKKwkJaW50IGNvZGVBdHRyaWJ1dGVMZW5ndGggPSBsb2NhbENvbnRlbnRzT2Zmc2V0IC0gKGNvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMl0gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMjQpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDRdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA1XSA9IChieXRlKSBjb2RlQXR0cmlidXRlTGVuZ3RoOworCQljb250ZW50c09mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBHZW5lcmF0ZSB0aGUgYnl0ZSBmb3IgYSBwcm9ibGVtIG1ldGhvZCBpbmZvIHRoYXQgY29ycmVzcG9uZCB0byBhIHN5bnRoZXRpYyBtZXRob2QgdGhhdAorCSAqIGdlbmVyYXRlIGFuIGFjY2VzcyB0byBhIHByaXZhdGUgY29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY0NvbnN0cnVjdG9yQWNjZXNzTWV0aG9kKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQlnZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIobWV0aG9kQmluZGluZyk7CisJCS8vIFdlIGtub3cgdGhhdCB3ZSB3b24ndCBnZXQgbW9yZSB0aGFuIDIgYXR0cmlidXRlOiB0aGUgY29kZSBhdHRyaWJ1dGUgKyBzeW50aGV0aWMgYXR0cmlidXRlCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAyOworCQkvLyBDb2RlIGF0dHJpYnV0ZQorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNvbnRlbnRzT2Zmc2V0OworCQlnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKKwkJY29kZVN0cmVhbS5pbml0KHRoaXMpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQm9keUZvckNvbnN0cnVjdG9yQWNjZXNzKG1ldGhvZEJpbmRpbmcpOworCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QoCisJCQltZXRob2RCaW5kaW5nLAorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCisJCQkJLnNjb3BlCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpCisJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQkvLyBhZGQgdGhlIHN5bnRoZXRpYyBhdHRyaWJ1dGUKKwkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0CisJICogZ2VuZXJhdGUgYW4gcmVhZCBhY2Nlc3MgdG8gYSBwcml2YXRlIGZpZWxkLgorCSAqCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLm5hbWVsb29wa3VwLlN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTeW50aGV0aWNGaWVsZFJlYWRBY2Nlc3NNZXRob2QoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJCWdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlcihtZXRob2RCaW5kaW5nKTsKKwkJLy8gV2Uga25vdyB0aGF0IHdlIHdvbid0IGdldCBtb3JlIHRoYW4gMiBhdHRyaWJ1dGU6IHRoZSBjb2RlIGF0dHJpYnV0ZSArIHN5bnRoZXRpYyBhdHRyaWJ1dGUKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDI7CisJCS8vIENvZGUgYXR0cmlidXRlCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWdlbmVyYXRlQ29kZUF0dHJpYnV0ZUhlYWRlcigpOworCQljb2RlU3RyZWFtLmluaXQodGhpcyk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yRmllbGRSZWFkQWNjZXNzKG1ldGhvZEJpbmRpbmcpOworCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QoCisJCQltZXRob2RCaW5kaW5nLAorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCisJCQkJLnNjb3BlCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpCisJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQkvLyBhZGQgdGhlIHN5bnRoZXRpYyBhdHRyaWJ1dGUKKwkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0CisJICogZ2VuZXJhdGUgYW4gd3JpdGUgYWNjZXNzIHRvIGEgcHJpdmF0ZSBmaWVsZC4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nCisJICovCisJcHVibGljIHZvaWQgYWRkU3ludGhldGljRmllbGRXcml0ZUFjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOworCQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAyIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlICsgc3ludGhldGljIGF0dHJpYnV0ZQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKKwkJLy8gQ29kZSBhdHRyaWJ1dGUKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CisJCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFdyaXRlQWNjZXNzKG1ldGhvZEJpbmRpbmcpOworCQljb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QoCisJCQltZXRob2RCaW5kaW5nLAorCQkJY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJCSgoU291cmNlVHlwZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCisJCQkJLnNjb3BlCisJCQkJLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpCisJCQkJLmNvbXBpbGF0aW9uUmVzdWx0CisJCQkJLmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQkvLyBhZGQgdGhlIHN5bnRoZXRpYyBhdHRyaWJ1dGUKKwkJaW50IHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA9CisJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXg7CisJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIEdlbmVyYXRlIHRoZSBieXRlIGZvciBhIHByb2JsZW0gbWV0aG9kIGluZm8gdGhhdCBjb3JyZXNwb25kIHRvIGEgc3ludGhldGljIG1ldGhvZCB0aGF0CisJICogZ2VuZXJhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QuCisJICoKKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubmFtZWxvb3BrdXAuU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIGFkZFN5bnRoZXRpY01ldGhvZEFjY2Vzc01ldGhvZChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwkJZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKG1ldGhvZEJpbmRpbmcpOworCQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAyIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlICsgc3ludGhldGljIGF0dHJpYnV0ZQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMjsKKwkJLy8gQ29kZSBhdHRyaWJ1dGUKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjb250ZW50c09mZnNldDsKKwkJZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CisJCWNvZGVTdHJlYW0uaW5pdCh0aGlzKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JNZXRob2RBY2Nlc3MobWV0aG9kQmluZGluZyk7CisJCWNvbXBsZXRlQ29kZUF0dHJpYnV0ZUZvclN5bnRoZXRpY0FjY2Vzc01ldGhvZCgKKwkJCW1ldGhvZEJpbmRpbmcsCisJCQljb2RlQXR0cmlidXRlT2Zmc2V0LAorCQkJKChTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCQkuc2NvcGUKKwkJCQkucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkKKwkJCQkuY29tcGlsYXRpb25SZXN1bHQKKwkJCQkubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7CisJCS8vIGFkZCB0aGUgc3ludGhldGljIGF0dHJpYnV0ZQorCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0KKwkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU3ludGhldGljTmFtZSk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzeW50aGV0aWNBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsKKwkJLy8gdGhlIGxlbmd0aCBvZiBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaXMgZXF1YWxzIHRvIDAKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAwOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogQnVpbGQgYWxsIHRoZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZXMgbmFtZXMKKwkgKiBpbnRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMuCisJICoKKwkgKiBvdXRwdXRQYXRoIGlzIGZvcm1lZCBsaWtlOgorCSAqCSAgIGM6XHRlbXBcIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGZpbGUgc2VwYXJhdG9yCisJICogcmVsYXRpdmVGaWxlTmFtZSBpcyBmb3JtZWQgbGlrZToKKwkgKiAgICAgamF2YVxsYW5nXFN0cmluZy5jbGFzcyAqCisJICogCisJICogQHBhcmFtIG91dHB1dFBhdGggamF2YS5sYW5nLlN0cmluZworCSAqIEBwYXJhbSByZWxhdGl2ZUZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEFsbERpcmVjdG9yaWVzSW50bygKKwkJU3RyaW5nIG91dHB1dFBhdGgsCisJCVN0cmluZyByZWxhdGl2ZUZpbGVOYW1lKQorCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQljaGFyIGZpbGVTZXBhcmF0b3JDaGFyID0gRmlsZS5zZXBhcmF0b3JDaGFyOworCQlTdHJpbmcgZmlsZVNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yOworCQlGaWxlIGY7CisJCS8vIEZpcnN0IHdlIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXRQYXRoIGV4aXN0cworCQlvdXRwdXRQYXRoID0gb3V0cHV0UGF0aC5yZXBsYWNlKCcvJywgZmlsZVNlcGFyYXRvckNoYXIpOworCQkvLyBUbyBiZSBhYmxlIHRvIHBhc3MgdGhlIG1rZGlycygpIG1ldGhvZCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZXh0cmEgZmlsZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgb3V0RGlyIG5hbWUKKwkJaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsKKwkJCW91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnN1YnN0cmluZygwLCBvdXRwdXRQYXRoLmxlbmd0aCgpIC0gMSk7CisJCX0KKwkJZiA9IG5ldyBGaWxlKG91dHB1dFBhdGgpOworCQlpZiAoZi5leGlzdHMoKSkgeworCQkJaWYgKCFmLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJvdXRwdXQuaXNGaWxlIiAsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoIm91dHB1dC5pc0ZpbGVOb3REaXJlY3RvcnkiICkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGF0IGRpcmVjdG9yeQorCQkJaWYgKCFmLm1rZGlycygpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgib3V0cHV0LmRpck5hbWUiICwgZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFV0aWwuYmluZCgib3V0cHV0Lm5vdFZhbGlkQWxsIiApKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCVN0cmluZ0J1ZmZlciBvdXREaXIgPSBuZXcgU3RyaW5nQnVmZmVyKG91dHB1dFBhdGgpOworCQlvdXREaXIuYXBwZW5kKGZpbGVTZXBhcmF0b3IpOworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KKwkJCW5ldyBTdHJpbmdUb2tlbml6ZXIocmVsYXRpdmVGaWxlTmFtZSwgZmlsZVNlcGFyYXRvcik7CisJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCWYgPSBuZXcgRmlsZShvdXREaXIuYXBwZW5kKHRva2VuKS5hcHBlbmQoZmlsZVNlcGFyYXRvcikudG9TdHJpbmcoKSk7CisJCQlpZiAoZi5leGlzdHMoKSkgeworCQkJCS8vIFRoZSBvdXREaXIgYWxyZWFkeSBleGlzdHMsIHNvIHdlIHByb2NlZWQgdGhlIG5leHQgZW50cnkKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm91dERpcjogIiArIG91dERpciArICIgYWxyZWFkeSBleGlzdHMuIik7CisJCQl9IGVsc2UgeworCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSBvdXREaXIKKwkJCQlpZiAoIWYubWtkaXIoKSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJvdXRwdXQuZmlsZU5hbWUiICwgZi5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJvdXRwdXQubm90VmFsaWQiICkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCX0KKwkJLy8gdG9rZW4gY29udGFpbnMgdGhlIGxhc3Qgb25lCisJCXJldHVybiBvdXREaXIuYXBwZW5kKHRva2VuKS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZworCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkgKiAtIG1heF9zdGFjaworCSAqIC0gbWF4X2xvY2FscworCSAqIC0gY29kZV9sZW5ndGgKKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGUoaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQpIHsKKwkJLy8gcmVpbml0aWFsaXplIHRoZSBsb2NhbENvbnRlbnRzIHdpdGggdGhlIGJ5dGUgbW9kaWZpZWQgYnkgdGhlIGNvZGUgc3RyZWFtCisJCWJ5dGVbXSBsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBjb2RlU3RyZWFtLmJDb2RlU3RyZWFtOworCQlpbnQgbG9jYWxDb250ZW50c09mZnNldCA9IGNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0OworCQkvLyBjb2RlQXR0cmlidXRlT2Zmc2V0IGlzIHRoZSBwb3NpdGlvbiBpbnNpZGUgbG9jYWxDb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQorCQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQKKwkJLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOworCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoY29kZV9sZW5ndGggPiA2NTUzNSkgeworCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdCgKKwkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uKTsKKwkJfQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsKKwkJaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTJdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTNdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOworCisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUKKwkJaW50IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID0gY29kZVN0cmVhbS5leGNlcHRpb25IYW5kbGVyc051bWJlcjsKKwkJRXhjZXB0aW9uTGFiZWxbXSBleGNlcHRpb25IYW5kbGVycyA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnM7CisJCWludCBleFNpemU7CisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgKGV4U2l6ZSA9IChleGNlcHRpb25IYW5kbGVyc051bWJlciAqIDggKyAyKSkKKwkJCT49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0KKwkJCQkJY29udGVudHMgPQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyAoZXhTaXplID4gSU5DUkVNRU5UX1NJWkUgPyBleFNpemUgOiBJTkNSRU1FTlRfU0laRSldKSwKKwkJCQkwLAorCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJfQorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIAorCQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25IYW5kbGVyc051bWJlciA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOyBpKyspIHsKKwkJCUV4Y2VwdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyc1tpXTsKKwkJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXIuc3RhcnQ7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0ID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0OworCQkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXIuZW5kOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5kOworCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkhhbmRsZXIucG9zaXRpb247CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7CisJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsKKwkJCQkvLyBhbnkgZXhjZXB0aW9uIGhhbmRsZXIKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWludCBuYW1lSW5kZXg7CisJCQkJaWYgKGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZykgeworCQkJCQkvKiByZXByZXNlbnRzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIHNlZSBjbGFzcyBsaXRlcmFsIGFjY2VzcyovCisJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSk7CisJCQkJfQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQl9CisJCX0KKwkJLy8gZGVidWcgYXR0cmlidXRlcworCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOworCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsKKworCQkvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsKKwkJCS8qIENyZWF0ZSBhbmQgYWRkIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgKHVzZWQgZm9yIGRlYnVnZ2luZykgCisJCQkgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6CisJCQkgKiAJKGJ5dGVjb2RlUEMgbGluZU51bWJlcikKKwkJCSAqIGFjY29yZGluZyB0byB0aGUgdGFibGUgb2Ygc3RhcnQgbGluZSBpbmRleGVzIGFuZCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZQorCQkJICogY29udGFpbmVkIGludG8gdGhlIGNvZGVzdHJlYW0KKwkJCSAqLworCQkJaW50W10gcGNUb1NvdXJjZU1hcFRhYmxlOworCQkJaWYgKCgocGNUb1NvdXJjZU1hcFRhYmxlID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwKSAhPSBudWxsKQorCQkJCSYmIChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7CisJCQkJaW50IGxpbmVOdW1iZXJOYW1lSW5kZXggPQorCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOworCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWNvbnRlbnRzLAorCQkJCQkJMCwKKwkJCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJCQkwLAorCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCX0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7CisJCQkJaW50IGxpbmVOdW1iZXJUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OworCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgKKwkJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKKwkJCQlpbnQgbGVuZ3RoID0gY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDspIHsKKwkJCQkJLy8gd3JpdGUgdGhlIGVudHJ5CisJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJY29udGVudHMsCisJCQkJCQkJMCwKKwkJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCQkJCTAsCisJCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCQl9CisJCQkJCWludCBwYyA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOworCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHBjID4+IDgpOworCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcGM7CisJCQkJCWludCBsaW5lTnVtYmVyID0gcGNUb1NvdXJjZU1hcFRhYmxlW2krK107CisJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlciA+PiA4KTsKKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXI7CisJCQkJCW51bWJlck9mRW50cmllcysrOworCQkJCX0KKwkJCQkvLyBub3cgd2UgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUKKwkJCQlpbnQgbGluZU51bWJlckF0dHJfbGVuZ3RoID0gbnVtYmVyT2ZFbnRyaWVzICogNCArIDI7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiAyNCk7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiAxNik7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA+PiA4KTsKKwkJCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyQXR0cl9sZW5ndGg7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKKwkJCQlsb2NhbENvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7CisJCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCQl9CisJCX0KKwkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykgeworCQkJaW50IGxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKKwkJCWludCBsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOworCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWNvbnRlbnRzLAorCQkJCQkwLAorCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCQkwLAorCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQl9CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbG9jYWxWYXJpYWJsZU5hbWVJbmRleDsKKwkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsKKwkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgKKwkJCWludCBuYW1lSW5kZXg7CisJCQlpbnQgZGVzY3JpcHRvckluZGV4OworCQkJaWYgKCFjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsKKwkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJY29udGVudHMsCisJCQkJCQkwLAorCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCTAsCisJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJfQorCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb2RlX2xlbmd0aDsKKwkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRoaXMpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJZGVzY3JpcHRvckluZGV4ID0KKwkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgKKwkJCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaWduYXR1cmUoKSk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7IC8vIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhpcyBpcyBhbHdheXMgMAorCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkrKykgeworCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsVmFyaWFibGUgPSBjb2RlU3RyZWFtLmxvY2Fsc1tpXTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25Db3VudDsgaisrKSB7CisJCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOworCQkJCQlpbnQgZW5kUEMgPSBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uUENzWyhqIDw8IDEpICsgMV07CisJCQkJCWlmIChzdGFydFBDICE9IGVuZFBDKSB7IC8vIG9ubHkgZW50cmllcyBmb3Igbm9uIHplcm8gbGVuZ3RoCisJCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsKKwkJCQkJCQlsb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAorCQkJCQkJCQlVdGlsLmJpbmQoImFib3J0LmludmFsaWRBdHRyaWJ1dGUiICwgbmV3IFN0cmluZyhsb2NhbFZhcmlhYmxlLm5hbWUpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkoQXN0Tm9kZSkgbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOworCQkJCQkJfQorCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQljb250ZW50cywKKwkJCQkJCQkJMCwKKwkJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCQkJfQorCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQorCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3RhcnRQQzsKKwkJCQkJCWludCBsZW5ndGggPSBlbmRQQyAtIHN0YXJ0UEM7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7CisJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUubmFtZSk7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUudHlwZS5zaWduYXR1cmUoKSk7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7CisJCQkJCQlpbnQgcmVzb2x2ZWRQb3NpdGlvbiA9IGxvY2FsVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOworCQkJbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ICs9IDI7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7CisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzCisJCS8vIGVuc3VyZSBmaXJzdCB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW5zaWRlIHRoZSBsb2NhbENvbnRlbnRzIGFycmF5CisJCWlmIChjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0ICsgMgorCQkJPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWNvbnRlbnRzLAorCQkJCTAsCisJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkwLAorCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJfQorCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZU51bWJlciA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisKKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKKwkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZworCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkgKiAtIG1heF9zdGFjaworCSAqIC0gbWF4X2xvY2FscworCSAqIC0gY29kZV9sZW5ndGgKKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JDbGluaXQoaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQpIHsKKwkJLy8gcmVpbml0aWFsaXplIHRoZSBjb250ZW50cyB3aXRoIHRoZSBieXRlIG1vZGlmaWVkIGJ5IHRoZSBjb2RlIHN0cmVhbQorCQlieXRlW10gbG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gY29kZVN0cmVhbS5iQ29kZVN0cmVhbTsKKwkJaW50IGxvY2FsQ29udGVudHNPZmZzZXQgPSBjb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldDsKKwkJLy8gY29kZUF0dHJpYnV0ZU9mZnNldCBpcyB0aGUgcG9zaXRpb24gaW5zaWRlIGNvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUKKwkJLy8gYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlQXR0cmlidXRlCisJCS8vIFRoYXQgbWVhbnMgdGhhdCB0byB3cml0ZSB0aGUgYXR0cmlidXRlX2xlbmd0aCB5b3UgbmVlZCB0byBvZmZzZXQgYnkgMiB0aGUgdmFsdWUgb2YgY29kZUF0dHJpYnV0ZU9mZnNldAorCQkvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLgorCQlpbnQgY29udGVudHNMZW5ndGg7CisJCWludCBjb2RlX2xlbmd0aCA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWlmIChjb2RlX2xlbmd0aCA+IDY1NTM1KSB7CisJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KAorCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDIwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDZdID0gKGJ5dGUpIChtYXhfc3RhY2sgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDddID0gKGJ5dGUpIG1heF9zdGFjazsKKwkJaW50IG1heF9sb2NhbHMgPSBjb2RlU3RyZWFtLm1heExvY2FsczsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDldID0gKGJ5dGUpIG1heF9sb2NhbHM7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEwXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMjQpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTJdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTNdID0gKGJ5dGUpIGNvZGVfbGVuZ3RoOworCisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUKKwkJaW50IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyID0gY29kZVN0cmVhbS5leGNlcHRpb25IYW5kbGVyc051bWJlcjsKKwkJRXhjZXB0aW9uTGFiZWxbXSBleGNlcHRpb25IYW5kbGVycyA9IGNvZGVTdHJlYW0uZXhjZXB0aW9uSGFuZGxlcnM7CisJCWludCBleFNpemU7CisJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgKGV4U2l6ZSA9IChleGNlcHRpb25IYW5kbGVyc051bWJlciAqIDggKyAyKSkKKwkJCT49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0KKwkJCQkJY29udGVudHMgPQorCQkJCQkJbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyAoZXhTaXplID4gSU5DUkVNRU5UX1NJWkUgPyBleFNpemUgOiBJTkNSRU1FTlRfU0laRSldKSwKKwkJCQkwLAorCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJfQorCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIAorCQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25IYW5kbGVyc051bWJlciA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOyBpKyspIHsKKwkJCUV4Y2VwdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyc1tpXTsKKwkJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXIuc3RhcnQ7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0ID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0OworCQkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXIuZW5kOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5kOworCQkJaW50IGhhbmRsZXJQQyA9IGV4Y2VwdGlvbkhhbmRsZXIucG9zaXRpb247CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7CisJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsKKwkJCQkvLyBhbnkgZXhjZXB0aW9uIGhhbmRsZXIKKwkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7CisJCQl9IGVsc2UgeworCQkJCWludCBuYW1lSW5kZXg7CisJCQkJaWYgKGV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZykgeworCQkJCQkvKiByZXByZXNlbnRzIGRlbm90ZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBzZWUgY2xhc3MgbGl0ZXJhbCBhY2Nlc3MqLworCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUpOworCQkJCX0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQkJfQorCQl9CisJCS8vIGRlYnVnIGF0dHJpYnV0ZXMKKwkJaW50IGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsKKwkJLy8gbGVhdmUgdHdvIGJ5dGVzIGZvciB0aGUgYXR0cmlidXRlX2xlbmd0aAorCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7CisKKwkJLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQorCQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKSB7CisJCQkvKiBDcmVhdGUgYW5kIGFkZCB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlICh1c2VkIGZvciBkZWJ1Z2dpbmcpIAorCQkJICogQnVpbGQgdGhlIHBhaXJzIG9mOgorCQkJICogCShieXRlY29kZVBDIGxpbmVOdW1iZXIpCisJCQkgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUKKwkJCSAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtCisJCQkgKi8KKwkJCWludFtdIHBjVG9Tb3VyY2VNYXBUYWJsZTsKKwkJCWlmICgoKHBjVG9Tb3VyY2VNYXBUYWJsZSA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCkgIT0gbnVsbCkKKwkJCQkmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZSAhPSAwKSkgeworCQkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0KKwkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQljb250ZW50cywKKwkJCQkJCTAsCisJCQkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCQkJMCwKKwkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJCQl9CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyTmFtZUluZGV4ID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4OworCQkJCWludCBsaW5lTnVtYmVyVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsKKwkJCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbGluZV9udW1iZXJfdGFibGVfbGVuZ3RoCisJCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7CisJCQkJaW50IGxlbmd0aCA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemU7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7CisJCQkJCS8vIHdyaXRlIHRoZSBlbnRyeQorCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDQgPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCWNvbnRlbnRzLAorCQkJCQkJCTAsCisJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkwLAorCQkJCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJCQkJfQorCQkJCQlpbnQgcGMgPSBwY1RvU291cmNlTWFwVGFibGVbaSsrXTsKKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwYyA+PiA4KTsKKwkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHBjOworCQkJCQlpbnQgbGluZU51bWJlciA9IHBjVG9Tb3VyY2VNYXBUYWJsZVtpKytdOworCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXIgPj4gOCk7CisJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyOworCQkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQl9CisJCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlCisJCQkJaW50IGxpbmVOdW1iZXJBdHRyX2xlbmd0aCA9IG51bWJlck9mRW50cmllcyAqIDQgKyAyOworCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMjQpOworCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gMTYpOworCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyQXR0cl9sZW5ndGggPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbGluZU51bWJlckF0dHJfbGVuZ3RoOworCQkJCWxvY2FsQ29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIChudW1iZXJPZkVudHJpZXMgPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOworCQkJCWF0dHJpYnV0ZU51bWJlcisrOworCQkJfQorCQl9CisJCS8vIHRoZW4gd2UgZG8gdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQorCQlpZiAoY29kZVN0cmVhbS5nZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZXMpIHsKKwkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7CisJCQkvLwkJY29kZUF0dHJpYnV0ZS5hZGRMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUodGhpcyk7CisJCQlpZiAoKGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcCAhPSBudWxsKQorCQkJCSYmIChjb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBTaXplICE9IDApKSB7CisJCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQorCQkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOworCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWNvbnRlbnRzLAorCQkJCQkJMCwKKwkJCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJCQkwLAorCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCX0KKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7CisJCQkJbG9jYWxDb250ZW50c09mZnNldCArPSA2OworCQkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsb2NhbF92YXJpYWJsZV90YWJsZV9sZW5ndGgKKwkJCQlpbnQgbmFtZUluZGV4OworCQkJCWludCBkZXNjcmlwdG9ySW5kZXg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlU3RyZWFtLmFsbExvY2Fsc0NvdW50ZXI7IGkrKykgeworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gY29kZVN0cmVhbS5sb2NhbHNbaV07CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvbkNvdW50OyBqKyspIHsKKwkJCQkJCWludCBzdGFydFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1tqIDw8IDFdOworCQkJCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOworCQkJCQkJaWYgKHN0YXJ0UEMgIT0gZW5kUEMpIHsgLy8gb25seSBlbnRyaWVzIGZvciBub24gemVybyBsZW5ndGgKKwkJCQkJCQlpZiAoZW5kUEMgPT0gLTEpIHsKKwkJCQkJCQkJbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKKwkJCQkJCQkJCVV0aWwuYmluZCgiYWJvcnQuaW52YWxpZEF0dHJpYnV0ZSIgLCBuZXcgU3RyaW5nKGxvY2FsVmFyaWFibGUubmFtZSkpLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkoQXN0Tm9kZSkgbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJY29udGVudHMsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJCQkJfQorCQkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkKKwkJCQkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN0YXJ0UEMgPj4gOCk7CisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0UEM7CisJCQkJCQkJaW50IGxlbmd0aCA9IGVuZFBDIC0gc3RhcnRQQzsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOworCQkJCQkJCW5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS5uYW1lKTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQkJCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobG9jYWxWYXJpYWJsZS50eXBlLnNpZ25hdHVyZSgpKTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCQkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpbnQgdmFsdWUgPSBudW1iZXJPZkVudHJpZXMgKiAxMCArIDI7CisJCQkJbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ICs9IDI7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDI0KTsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMTYpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSB2YWx1ZTsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAobnVtYmVyT2ZFbnRyaWVzID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7CisJCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCQl9CisJCX0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcworCQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKKwkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyCisJCQk+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKKwkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZworCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkgKiAtIG1heF9zdGFjaworCSAqIC0gbWF4X2xvY2FscworCSAqIC0gY29kZV9sZW5ndGgKKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKiBAcGFyYW0gZXhjZXB0aW9uSGFuZGxlciBpbnRbXQorCSAqIEBwYXJhbSBzdGFydEluZGV4ZXMgaW50W10KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JDbGluaXQoCisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0LAorCQlpbnRbXSBleGNlcHRpb25IYW5kbGVyLAorCQlpbnRbXSBzdGFydExpbmVJbmRleGVzKSB7CisJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KKwkJYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBjb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQorCQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQKKwkJLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4KKwkJaW50IGNvbnRlbnRzTGVuZ3RoOworCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoY29kZV9sZW5ndGggPiA2NTUzNSkgeworCQkJY29kZVN0cmVhbS5tZXRob2REZWNsYXJhdGlvbi5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ieXRlY29kZUV4Y2VlZHM2NEtMaW1pdCgKKwkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWludCBtYXhfc3RhY2sgPSBjb2RlU3RyZWFtLnN0YWNrTWF4OworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA3XSA9IChieXRlKSBtYXhfc3RhY2s7CisJCWludCBtYXhfbG9jYWxzID0gY29kZVN0cmVhbS5tYXhMb2NhbHM7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDhdID0gKGJ5dGUpIChtYXhfbG9jYWxzID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMF0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDI0KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTFdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAxNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEzXSA9IChieXRlKSBjb2RlX2xlbmd0aDsKKworCQkvLyB3cml0ZSB0aGUgZXhjZXB0aW9uIHRhYmxlCisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDE7CisJCWludCBzdGFydCA9IGV4Y2VwdGlvbkhhbmRsZXJbMF07CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoc3RhcnQgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydDsKKwkJaW50IGVuZCA9IGV4Y2VwdGlvbkhhbmRsZXJbMV07CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZW5kID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZW5kOworCQlpbnQgaGFuZGxlclBDID0gZXhjZXB0aW9uSGFuZGxlclsyXTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChoYW5kbGVyUEMgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7CisJCWludCBuYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdFeGNlcHRpb24oKTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChuYW1lSW5kZXggPj4gOCk7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisKKwkJLy8gZGVidWcgYXR0cmlidXRlcworCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQorCisJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUKKwkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykgeworCQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSAKKwkJCSAgICAqIEJ1aWxkIHRoZSBwYWlycyBvZjoKKwkJCSAgICAqIChieXRlY29kZVBDIGxpbmVOdW1iZXIpCisJCQkgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIG9mIHN0YXJ0IGxpbmUgaW5kZXhlcyBhbmQgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUKKwkJCSAgICAqIGNvbnRhaW5lZCBpbnRvIHRoZSBjb2Rlc3RyZWFtCisJCQkgICAgKi8KKwkJCWludCBsaW5lTnVtYmVyTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxpbmVOdW1iZXJUYWJsZU5hbWUpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsaW5lTnVtYmVyTmFtZUluZGV4ID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSA2OworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDE7CisJCQkvLyBmaXJzdCBlbnRyeSBhdCBwYyA9IDAKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChwcm9ibGVtTGluZSA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBwcm9ibGVtTGluZTsKKwkJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQorCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykgeworCQkJaW50IGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTG9jYWxWYXJpYWJsZVRhYmxlTmFtZSk7CisJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDggPj0gKGNvbnRlbnRzTGVuZ3RoID0gbG9jYWxDb250ZW50cy5sZW5ndGgpKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJY29udGVudHMsCisJCQkJCTAsCisJCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJCTAsCisJCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJCX0KKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobG9jYWxWYXJpYWJsZU5hbWVJbmRleCA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsb2NhbFZhcmlhYmxlTmFtZUluZGV4OworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMjsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcworCQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKKwkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyCisJCQk+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKKwkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZworCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkgKiAtIG1heF9zdGFjaworCSAqIC0gbWF4X2xvY2FscworCSAqIC0gY29kZV9sZW5ndGgKKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKiBAcGFyYW0gZXhjZXB0aW9uSGFuZGxlciBpbnRbXSAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKAorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwKKwkJTWV0aG9kQmluZGluZyBiaW5kaW5nLAorCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCwKKwkJaW50W10gZXhjZXB0aW9uSGFuZGxlciwKKwkJaW50W10gc3RhcnRMaW5lSW5kZXhlcykgeworCQkvLyByZWluaXRpYWxpemUgdGhlIGxvY2FsQ29udGVudHMgd2l0aCB0aGUgYnl0ZSBtb2RpZmllZCBieSB0aGUgY29kZSBzdHJlYW0KKwkJYnl0ZVtdIGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBsb2NhbENvbnRlbnRzIGJ5dGUgYXJyYXkgYmVmb3JlIHdlIHN0YXJ0ZWQgdG8gd3JpdGUvLyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVBdHRyaWJ1dGUvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQvLyB0byBnZXQgdGhlIHJpZ2h0IHBvc2l0aW9uLCA2IGZvciB0aGUgbWF4X3N0YWNrIGV0Yy4uLgorCQlpbnQgbWF4X3N0YWNrID0gY29kZVN0cmVhbS5zdGFja01heDsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNl0gPSAoYnl0ZSkgKG1heF9zdGFjayA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOworCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA4XSA9IChieXRlKSAobWF4X2xvY2FscyA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOV0gPSAoYnl0ZSkgbWF4X2xvY2FsczsKKwkJaW50IGNvZGVfbGVuZ3RoID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDExXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMl0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCS8vIHdyaXRlIHRoZSBleGNlcHRpb24gdGFibGUKKwkJaW50IGNvbnRlbnRzTGVuZ3RoOworCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDUwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShsb2NhbENvbnRlbnRzID0gY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMTsKKwkJaW50IHN0YXJ0ID0gZXhjZXB0aW9uSGFuZGxlclswXTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN0YXJ0OworCQlpbnQgZW5kID0gZXhjZXB0aW9uSGFuZGxlclsxXTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChlbmQgPj4gOCk7CisJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBlbmQ7CisJCWludCBoYW5kbGVyUEMgPSBleGNlcHRpb25IYW5kbGVyWzJdOworCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGhhbmRsZXJQQyA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGhhbmRsZXJQQzsKKwkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0V4Y2VwdGlvbigpOworCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsgLy8gZGVidWcgYXR0cmlidXRlcworCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOyAvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gZmlyc3Qgd2UgaGFuZGxlIHRoZSBsaW5lbnVtYmVyIGF0dHJpYnV0ZQorCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsKKwkJCS8qIENyZWF0ZSBhbmQgYWRkIHRoZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUgKHVzZWQgZm9yIGRlYnVnZ2luZykgCisJCQkgICAgKiBCdWlsZCB0aGUgcGFpcnMgb2Y6CisJCQkgICAgKiAoYnl0ZWNvZGVQQyBsaW5lTnVtYmVyKQorCQkJICAgICogYWNjb3JkaW5nIHRvIHRoZSB0YWJsZSBvZiBzdGFydCBsaW5lIGluZGV4ZXMgYW5kIHRoZSBwY1RvU291cmNlTWFwIHRhYmxlCisJCQkgICAgKiBjb250YWluZWQgaW50byB0aGUgY29kZXN0cmVhbQorCQkJICAgICovCisJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobGluZU51bWJlck5hbWVJbmRleCA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsaW5lTnVtYmVyTmFtZUluZGV4OworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gNjsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAxOworCQkJaWYgKHByb2JsZW1MaW5lID09IDApIHsKKwkJCQlwcm9ibGVtTGluZSA9IHNlYXJjaExpbmVOdW1iZXIoc3RhcnRMaW5lSW5kZXhlcywgYmluZGluZy5zb3VyY2VTdGFydCgpKTsKKwkJCX0KKwkJCS8vIGZpcnN0IGVudHJ5IGF0IHBjID0gMAorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHByb2JsZW1MaW5lID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHByb2JsZW1MaW5lOworCQkJLy8gbm93IHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlCisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQkvLyB0aGVuIHdlIGRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKKwkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7CisJCQkvLyBjb21wdXRlIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kCisJCQlpbnQgYXJnU2l6ZTsKKwkJCWludCBsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCQkJaW50IG51bWJlck9mRW50cmllcyA9IDA7CisJCQkvLwkJY29kZUF0dHJpYnV0ZS5hZGRMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUodGhpcyk7CisJCQlpbnQgbG9jYWxWYXJpYWJsZU5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Mb2NhbFZhcmlhYmxlVGFibGVOYW1lKTsKKwkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgOCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQljb250ZW50cywKKwkJCQkJMCwKKwkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJMCwKKwkJCQkJY29udGVudHNMZW5ndGgpOworCQkJfQorCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID4+IDgpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7CisJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7CisJCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbG9jYWxfdmFyaWFibGVfdGFibGVfbGVuZ3RoCisJCQlpbnQgZGVzY3JpcHRvckluZGV4OworCQkJaWYgKCFjb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsKKwkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJY29udGVudHMsCisJCQkJCQkwLAorCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCTAsCisJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJfQorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb2RlX2xlbmd0aDsKKwkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRoaXMpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJZGVzY3JpcHRvckluZGV4ID0KKwkJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCgKKwkJCQkJCWNvZGVTdHJlYW0ubWV0aG9kRGVjbGFyYXRpb24uYmluZGluZy5kZWNsYXJpbmdDbGFzcy5zaWduYXR1cmUoKSk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCQkvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDAKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQl9CisJCQlpZiAoYmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCQkJTmVzdGVkVHlwZUJpbmRpbmcgbWV0aG9kRGVjbGFyaW5nQ2xhc3MgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCQkJCQlhcmdTaXplID0gbWV0aG9kRGVjbGFyaW5nQ2xhc3Muc3ludGhldGljQXJndW1lbnRzT2Zmc2V0OworCQkJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHM7CisJCQkJCWlmICgoc3ludGhldGljQXJndW1lbnRzID0gbWV0aG9kRGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VzKCkpCisJCQkJCQkhPSBudWxsKSB7CisJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXTsKKwkJCQkJCQlpZiAobG9jYWxDb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGxvY2FsQ29udGVudHMubGVuZ3RoKSkgeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJY29udGVudHMsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJCQkJfQorCQkJCQkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFkZCB0aGUgbG9jYWwgZW50cnkKKwkJCQkJCQludW1iZXJPZkVudHJpZXMrKzsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKKwkJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJCQkJZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLnR5cGUuc2lnbmF0dXJlKCkpOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7CisJCQkJCQkJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbFZhcmlhYmxlLnJlc29sdmVkUG9zaXRpb247CisJCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChyZXNvbHZlZFBvc2l0aW9uID4+IDgpOworCQkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJnU2l6ZSA9IDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlhcmdTaXplID0gYmluZGluZy5pc1N0YXRpYygpID8gMCA6IDE7CisJCQl9CisJCQlpZiAobWV0aG9kLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZC5iaW5kaW5nLnBhcmFtZXRlcnM7CisJCQkJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZXRob2QuYXJndW1lbnRzOworCQkJCWlmICgocGFyYW1ldGVycyAhPSBudWxsKSAmJiAoYXJndW1lbnRzICE9IG51bGwpKSB7CisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQlUeXBlQmluZGluZyBhcmd1bWVudEJpbmRpbmcgPSBwYXJhbWV0ZXJzW2ldOworCQkJCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQljb250ZW50cywKKwkJCQkJCQkJMCwKKwkJCQkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCQkJfQorCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQorCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOworCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7CisJCQkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCQkJCQluYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFyZ3VtZW50c1tpXS5uYW1lKTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIG5hbWVJbmRleDsKKwkJCQkJCWRlc2NyaXB0b3JJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoYXJndW1lbnRCaW5kaW5nLnNpZ25hdHVyZSgpKTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOworCQkJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gYXJnU2l6ZTsKKwkJCQkJCWlmICgoYXJndW1lbnRCaW5kaW5nID09IFR5cGVCaW5kaW5nLkxvbmdCaW5kaW5nKQorCQkJCQkJCXx8IChhcmd1bWVudEJpbmRpbmcgPT0gVHlwZUJpbmRpbmcuRG91YmxlQmluZGluZykpCisJCQkJCQkJYXJnU2l6ZSArPSAyOworCQkJCQkJZWxzZQorCQkJCQkJCWFyZ1NpemUrKzsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKKwkJCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSByZXNvbHZlZFBvc2l0aW9uOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaW50IHZhbHVlID0gbnVtYmVyT2ZFbnRyaWVzICogMTAgKyAyOworCQkJbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0ICs9IDI7CisJCQlsb2NhbENvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gMjQpOworCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCQkJbG9jYWxDb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKKwkJCWxvY2FsQ29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0XSA9IChieXRlKSBudW1iZXJPZkVudHJpZXM7CisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQkvLyB1cGRhdGUgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzLy8gZW5zdXJlIGZpcnN0IHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbnNpZGUgdGhlIGxvY2FsQ29udGVudHMgYXJyYXkKKwkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyCisJCQk+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkobG9jYWxDb250ZW50cyA9IGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWxvY2FsQ29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDJdID0gKGJ5dGUpIChjb2RlQXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgM10gPSAoYnl0ZSkgKGNvZGVBdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQlsb2NhbENvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJbG9jYWxDb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNV0gPSAoYnl0ZSkgY29kZUF0dHJpYnV0ZUxlbmd0aDsKKwkJY29udGVudHNPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgY29tcGxldGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgYnkgc2V0dGluZworCSAqIC0gdGhlIGF0dHJpYnV0ZV9sZW5ndGgKKwkgKiAtIG1heF9zdGFjaworCSAqIC0gbWF4X2xvY2FscworCSAqIC0gY29kZV9sZW5ndGgKKwkgKiAtIGV4Y2VwdGlvbiB0YWJsZQorCSAqIC0gYW5kIGRlYnVnIGF0dHJpYnV0ZXMgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSBjb2RlQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JTeW50aGV0aWNBY2Nlc3NNZXRob2QoCisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYmluZGluZywKKwkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQsCisJCWludFtdIHN0YXJ0TGluZUluZGV4ZXMpIHsKKwkJLy8gcmVpbml0aWFsaXplIHRoZSBjb250ZW50cyB3aXRoIHRoZSBieXRlIG1vZGlmaWVkIGJ5IHRoZSBjb2RlIHN0cmVhbQorCQljb250ZW50cyA9IGNvZGVTdHJlYW0uYkNvZGVTdHJlYW07CisJCWludCBsb2NhbENvbnRlbnRzT2Zmc2V0ID0gY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQ7CisJCS8vIGNvZGVBdHRyaWJ1dGVPZmZzZXQgaXMgdGhlIHBvc2l0aW9uIGluc2lkZSBjb250ZW50cyBieXRlIGFycmF5IGJlZm9yZSB3ZSBzdGFydGVkIHRvIHdyaXRlCisJCS8vIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZUF0dHJpYnV0ZQorCQkvLyBUaGF0IG1lYW5zIHRoYXQgdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZV9sZW5ndGggeW91IG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIHZhbHVlIG9mIGNvZGVBdHRyaWJ1dGVPZmZzZXQKKwkJLy8gdG8gZ2V0IHRoZSByaWdodCBwb3NpdGlvbiwgNiBmb3IgdGhlIG1heF9zdGFjayBldGMuLi4KKwkJaW50IG1heF9zdGFjayA9IGNvZGVTdHJlYW0uc3RhY2tNYXg7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA2XSA9IChieXRlKSAobWF4X3N0YWNrID4+IDgpOworCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgN10gPSAoYnl0ZSkgbWF4X3N0YWNrOworCQlpbnQgbWF4X2xvY2FscyA9IGNvZGVTdHJlYW0ubWF4TG9jYWxzOworCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgOF0gPSAoYnl0ZSkgKG1heF9sb2NhbHMgPj4gOCk7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA5XSA9IChieXRlKSBtYXhfbG9jYWxzOworCQlpbnQgY29kZV9sZW5ndGggPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQljb250ZW50c1tjb2RlQXR0cmlidXRlT2Zmc2V0ICsgMTBdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiAyNCk7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxMV0gPSAoYnl0ZSkgKGNvZGVfbGVuZ3RoID4+IDE2KTsKKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDEyXSA9IChieXRlKSAoY29kZV9sZW5ndGggPj4gOCk7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAxM10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CisJCWludCBjb250ZW50c0xlbmd0aDsKKwkJaWYgKChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgNDApID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJLy8gdGhlcmUgaXMgbm8gZXhjZXB0aW9uIHRhYmxlLCBzbyB3ZSBuZWVkIHRvIG9mZnNldCBieSAyIHRoZSBjdXJyZW50IG9mZnNldCBhbmQgbW92ZSAKKwkJLy8gb24gdGhlIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsKKwkJLy8gZGVidWcgYXR0cmlidXRlcworCQlpbnQgY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSAwOworCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbGVuZ3RoCisJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsKKworCQkvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsKKwkJCWludCBpbmRleCA9IDA7CisJCQlpbnQgbGluZU51bWJlck5hbWVJbmRleCA9CisJCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MaW5lTnVtYmVyVGFibGVOYW1lKTsKKwkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxpbmVOdW1iZXJOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxpbmVOdW1iZXJOYW1lSW5kZXg7CisJCQlpbnQgbGluZU51bWJlclRhYmxlT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gNjsKKwkJCS8vIGxlYXZlIHNwYWNlIGZvciBhdHRyaWJ1dGVfbGVuZ3RoIGFuZCBsaW5lX251bWJlcl90YWJsZV9sZW5ndGgKKwkJCS8vIFNlZW1zIGxpa2UgZG8gd291bGQgYmUgYmV0dGVyLCBidXQgdGhpcyBwcmVzZXJ2ZXMgdGhlIGV4aXN0aW5nIGJlaGF2aW9yLgorCQkJaW5kZXggPSBzZWFyY2hMaW5lTnVtYmVyKHN0YXJ0TGluZUluZGV4ZXMsIGJpbmRpbmcuc291cmNlU3RhcnQpOworCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGluZGV4ID4+IDgpOworCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbmRleDsKKwkJCS8vIG5vdyB3ZSBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZQorCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gMDsKKwkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAwOworCQkJY29udGVudHNbbGluZU51bWJlclRhYmxlT2Zmc2V0KytdID0gNjsKKwkJCWNvbnRlbnRzW2xpbmVOdW1iZXJUYWJsZU9mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tsaW5lTnVtYmVyVGFibGVPZmZzZXQrK10gPSAxOworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gdGhlbiB3ZSBkbyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlCisJCWlmIChjb2RlU3RyZWFtLmdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykgeworCQkJaW50IGxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCA9IGxvY2FsQ29udGVudHNPZmZzZXQ7CisJCQlpbnQgbnVtYmVyT2ZFbnRyaWVzID0gMDsKKwkJCWludCBsb2NhbFZhcmlhYmxlTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkxvY2FsVmFyaWFibGVUYWJsZU5hbWUpOworCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyA4ID4gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWNvbnRlbnRzLAorCQkJCQkwLAorCQkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJCTAsCisJCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJCX0KKwkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxvY2FsVmFyaWFibGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGxvY2FsVmFyaWFibGVOYW1lSW5kZXg7CisJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDY7CisJCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCBhbmQgbG9jYWxfdmFyaWFibGVfdGFibGVfbGVuZ3RoCisJCQlpbnQgbmFtZUluZGV4OworCQkJaW50IGRlc2NyaXB0b3JJbmRleDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29kZVN0cmVhbS5hbGxMb2NhbHNDb3VudGVyOyBpKyspIHsKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbFZhcmlhYmxlID0gY29kZVN0cmVhbS5sb2NhbHNbaV07CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbFZhcmlhYmxlLmluaXRpYWxpemF0aW9uQ291bnQ7IGorKykgeworCQkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGUuaW5pdGlhbGl6YXRpb25QQ3NbaiA8PCAxXTsKKwkJCQkJaW50IGVuZFBDID0gbG9jYWxWYXJpYWJsZS5pbml0aWFsaXphdGlvblBDc1soaiA8PCAxKSArIDFdOworCQkJCQlpZiAoc3RhcnRQQyAhPSBlbmRQQykgeyAvLyBvbmx5IGVudHJpZXMgZm9yIG5vbiB6ZXJvIGxlbmd0aAorCQkJCQkJaWYgKGVuZFBDID09IC0xKSB7CisJCQkJCQkJbG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYm9ydER1ZVRvSW50ZXJuYWxFcnJvcigKKwkJCQkJCQkJVXRpbC5iaW5kKCJhYm9ydC5pbnZhbGlkQXR0cmlidXRlIiAsIG5ldyBTdHJpbmcobG9jYWxWYXJpYWJsZS5uYW1lKSksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKEFzdE5vZGUpIGxvY2FsVmFyaWFibGUuZGVjbGFyaW5nU2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KTsKKwkJCQkJCX0KKwkJCQkJCWlmIChsb2NhbENvbnRlbnRzT2Zmc2V0ICsgMTAgPiAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7CisJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJY29udGVudHMsCisJCQkJCQkJCTAsCisJCQkJCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJY29udGVudHNMZW5ndGgpOworCQkJCQkJfQorCQkJCQkJLy8gbm93IHdlIGNhbiBzYWZlbHkgYWRkIHRoZSBsb2NhbCBlbnRyeQorCQkJCQkJbnVtYmVyT2ZFbnRyaWVzKys7CisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChzdGFydFBDID4+IDgpOworCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBzdGFydFBDOworCQkJCQkJaW50IGxlbmd0aCA9IGVuZFBDIC0gc3RhcnRQQzsKKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbGVuZ3RoOworCQkJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChsb2NhbFZhcmlhYmxlLm5hbWUpOworCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAobmFtZUluZGV4ID4+IDgpOworCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBuYW1lSW5kZXg7CisJCQkJCQlkZXNjcmlwdG9ySW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGxvY2FsVmFyaWFibGUudHlwZS5zaWduYXR1cmUoKSk7CisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChkZXNjcmlwdG9ySW5kZXggPj4gOCk7CisJCQkJCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGRlc2NyaXB0b3JJbmRleDsKKwkJCQkJCWludCByZXNvbHZlZFBvc2l0aW9uID0gbG9jYWxWYXJpYWJsZS5yZXNvbHZlZFBvc2l0aW9uOworCQkJCQkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAocmVzb2x2ZWRQb3NpdGlvbiA+PiA4KTsKKwkJCQkJCWNvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgcmVzb2x2ZWRQb3NpdGlvbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWludCB2YWx1ZSA9IG51bWJlck9mRW50cmllcyAqIDEwICsgMjsKKwkJCWxvY2FsVmFyaWFibGVUYWJsZU9mZnNldCArPSAyOworCQkJY29udGVudHNbbG9jYWxWYXJpYWJsZVRhYmxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSA+PiAyNCk7CisJCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+IDE2KTsKKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7CisJCQljb250ZW50c1tsb2NhbFZhcmlhYmxlVGFibGVPZmZzZXQrK10gPSAoYnl0ZSkgKG51bWJlck9mRW50cmllcyA+PiA4KTsKKwkJCWNvbnRlbnRzW2xvY2FsVmFyaWFibGVUYWJsZU9mZnNldF0gPSAoYnl0ZSkgbnVtYmVyT2ZFbnRyaWVzOworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gdXBkYXRlIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcworCQkvLyBlbnN1cmUgZmlyc3QgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlIGluc2lkZSB0aGUgY29udGVudHMgYXJyYXkKKwkJaWYgKGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgKyAyID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZUF0dHJpYnV0ZU9mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTnVtYmVyID4+IDgpOworCQljb250ZW50c1tjb2RlQXR0cmlidXRlQXR0cmlidXRlT2Zmc2V0XSA9IChieXRlKSBhdHRyaWJ1dGVOdW1iZXI7CisKKwkJLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJCWludCBjb2RlQXR0cmlidXRlTGVuZ3RoID0gbG9jYWxDb250ZW50c09mZnNldCAtIChjb2RlQXR0cmlidXRlT2Zmc2V0ICsgNik7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAyXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAyNCk7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyAzXSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiAxNik7CisJCWNvbnRlbnRzW2NvZGVBdHRyaWJ1dGVPZmZzZXQgKyA0XSA9IChieXRlKSAoY29kZUF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJY29udGVudHNbY29kZUF0dHJpYnV0ZU9mZnNldCArIDVdID0gKGJ5dGUpIGNvZGVBdHRyaWJ1dGVMZW5ndGg7CisJCWNvbnRlbnRzT2Zmc2V0ID0gbG9jYWxDb250ZW50c09mZnNldDsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBpbmZvIGJ5IHNldHRpbmcgdXAgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGF0IHRoZSByaWdodCBvZmZzZXQuCisJICoKKwkgKiBAcGFyYW0gbWV0aG9kQXR0cmlidXRlT2Zmc2V0IDxDT0RFPmludDwvQ09ERT4KKwkgKiBAcGFyYW0gYXR0cmlidXRlTnVtYmVyIDxDT0RFPmludDwvQ09ERT4gCisJICovCisJcHVibGljIHZvaWQgY29tcGxldGVNZXRob2RJbmZvKAorCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0LAorCQlpbnQgYXR0cmlidXRlTnVtYmVyKSB7CisJCS8vIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKwkJY29udGVudHNbbWV0aG9kQXR0cmlidXRlT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVOdW1iZXIgPj4gOCk7CisJCWNvbnRlbnRzW21ldGhvZEF0dHJpYnV0ZU9mZnNldF0gPSAoYnl0ZSkgYXR0cmlidXRlTnVtYmVyOworCX0KKworCS8qCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBJbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWUgY29tcHV0ZWQgYXMgdGhleSBhcmUgZ2VuZXJhdGVkLCBzaW5jZSBzb21lIG1heSBub3QKKwkgKiBiZSBhY3R1YWxseSBvdXRwdXRlZCBpZiBzaXR0aW5nIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlLgorCSAqCisJICogQHBhcmFtIGxvY2FsVHlwZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVHlwZUJpbmRpbmcKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGNvbXB1dGVDb25zdGFudFBvb2xOYW1lKExvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlKSB7CisJCWlmIChsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgpOworCQl9CisJCS8vIGRlbGVnYXRlcyB0byB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBjbGFzc2ZpbGUsIHNpbmNlIGl0IGlzIHRoZSBvbmx5IG9uZSB3aXRoIGEgZ2xvYmFsIHZpc2lvbiBvZiBpdHMgaW5uZXJ0eXBlcy4KKwkJaWYgKGVuY2xvc2luZ0NsYXNzRmlsZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKS5jb21wdXRlQ29uc3RhbnRQb29sTmFtZShsb2NhbFR5cGUpOworCQl9CisJCWlmIChuYW1lVXNhZ2UgPT0gbnVsbCkKKwkJCW5hbWVVc2FnZSA9IG5ldyBIYXNodGFibGVPZlR5cGUoKTsKKworCQkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGxvY2FsIHR5cGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSB1c2VyCisJCWludCBpbmRleCA9IDA7CisJCWNoYXJbXSBjYW5kaWRhdGVOYW1lOworCQl3aGlsZSh0cnVlKSB7CisJCQlpZiAobG9jYWxUeXBlLmlzTWVtYmVyVHlwZSgpKXsKKwkJCQlpZiAoaW5kZXggPT0gMCl7CisJCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCWxvY2FsVHlwZS5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpLAorCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUsCisJCQkJCQknJCcpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGluIGNhc2Ugb2YgY29sbGlzaW9uLCB0aGVuIG1lbWJlciBuYW1lIGdldHMgZXh0cmEgJDEgaW5zZXJ0ZWQKKwkJCQkJLy8gZS5nLiBjbGFzcyBYIHsgeyBjbGFzcyBMe30gbmV3IFgoKXsgY2xhc3MgTHt9IH0gfSB9CisJCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCWxvY2FsVHlwZS5lbmNsb3NpbmdUeXBlKCkuY29uc3RhbnRQb29sTmFtZSgpLAorCQkJCQkJJyQnLAorCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5kZXgpLnRvQ2hhckFycmF5KCksCisJCQkJCQknJCcsCisJCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsb2NhbFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkpeworCQkJCQljYW5kaWRhdGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlyZWZlcmVuY2VCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwKKwkJCQkJCVN0cmluZy52YWx1ZU9mKGluZGV4KzEpLnRvQ2hhckFycmF5KCksCisJCQkJCQknJCcpOworCQkJfSBlbHNlIHsKKwkJCQkJY2FuZGlkYXRlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJcmVmZXJlbmNlQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCksCisJCQkJCQknJCcsCisJCQkJCQlTdHJpbmcudmFsdWVPZihpbmRleCsxKS50b0NoYXJBcnJheSgpLAorCQkJCQkJJyQnLAorCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUpOworCQkJfQkJCQkJCQorCQkJaWYgKG5hbWVVc2FnZS5nZXQoY2FuZGlkYXRlTmFtZSkgIT0gbnVsbCkgeworCQkJCWluZGV4ICsrOworCQkJfSBlbHNlIHsKKwkJCQluYW1lVXNhZ2UucHV0KGNhbmRpZGF0ZU5hbWUsIGxvY2FsVHlwZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNhbmRpZGF0ZU5hbWU7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBSZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBhIENsYXNzRmlsZSBjb21wYXRpYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvYmxlbWF0aWMgdHlwZQorCSAqCisJICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbgorCSAqIEBwYXJhbSB1bml0UmVzdWx0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblVuaXRSZXN1bHQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUHJvYmxlbVR5cGUoCisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCisJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24uYmluZGluZzsKKwkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDbGFzc0ZpbGUodHlwZUJpbmRpbmcsIG51bGwsIHRydWUpOworCisJCS8vIGlubmVyIGF0dHJpYnV0ZXMKKwkJaWYgKHR5cGVCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKQorCQkJY2xhc3NGaWxlLnJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKHR5cGVCaW5kaW5nKTsKKworCQkvLyBhZGQgaXRzIGZpZWxkcworCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSB0eXBlQmluZGluZy5maWVsZHM7CisJCWlmICgoZmllbGRzICE9IG51bGwpICYmIChmaWVsZHMgIT0gTm9GaWVsZHMpKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKGZpZWxkc1tpXS5jb25zdGFudCA9PSBudWxsKSB7CisJCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkc1tpXSwgZmFsc2UsIG51bGwsIG51bGwsIDApOworCQkJCX0KKwkJCX0KKwkJCWNsYXNzRmlsZS5hZGRGaWVsZEluZm9zKCk7CisJCX0gZWxzZSB7CisJCQkvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0byBiZSBlcXVhbHMgdG8gMAorCQkJY2xhc3NGaWxlLmNvbnRlbnRzW2NsYXNzRmlsZS5jb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljbGFzc0ZpbGUuY29udGVudHNbY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJfQorCQkvLyBsZWF2ZSBzb21lIHNwYWNlIGZvciB0aGUgbWV0aG9kQ291bnQKKwkJY2xhc3NGaWxlLnNldEZvck1ldGhvZEluZm9zKCk7CisJCS8vIGFkZCBpdHMgdXNlciBkZWZpbmVkIG1ldGhvZHMKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSB0eXBlQmluZGluZy5tZXRob2RzOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CisJCWludCBtYXhNZXRob2REZWNsID0gbWV0aG9kRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogbWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aDsKKwkJaW50IHByb2JsZW1zTGVuZ3RoOworCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gdW5pdFJlc3VsdC5nZXRQcm9ibGVtcygpOworCQlpZiAocHJvYmxlbXMgPT0gbnVsbCkgeworCQkJcHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bMF07CisJCX0KKwkJSVByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgSVByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJaWYgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkvLyB3ZSBjYW5ub3QgY3JlYXRlIHByb2JsZW0gbWV0aG9kcyBmb3IgYW4gaW50ZXJmYWNlLiBTbyB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgY2xpbml0CisJCQkJLy8gd2hpY2ggc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBwcm9ibGVtCisJCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1DbGluaXQocHJvYmxlbXNDb3B5KTsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc7CisJCQkJCWlmICgobWV0aG9kQmluZGluZyA9IG1ldGhvZHNbaV0pICE9IG51bGwpIHsKKwkJCQkJCS8vIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGRlY2xhcmF0aW9uCisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heE1ldGhvZERlY2w7IGorKykgeworCQkJCQkJCWlmICgobWV0aG9kRGVjbGFyYXRpb25zW2pdICE9IG51bGwpCisJCQkJCQkJCSYmIChtZXRob2REZWNsYXJhdGlvbnNbal0uYmluZGluZyA9PSBtZXRob2RzW2ldKSkgeworCQkJCQkJCQlpZiAoIW1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJCQkJCQljbGFzc0ZpbGUuYWRkQWJzdHJhY3RNZXRob2QobWV0aG9kRGVjbGFyYXRpb25zW2pdLCBtZXRob2RCaW5kaW5nKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsKKwkJCQkJaWYgKChtZXRob2RCaW5kaW5nID0gbWV0aG9kc1tpXSkgIT0gbnVsbCkgeworCQkJCQkJLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZGVjbGFyYXRpb24KKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF4TWV0aG9kRGVjbDsgaisrKSB7CisJCQkJCQkJaWYgKChtZXRob2REZWNsYXJhdGlvbnNbal0gIT0gbnVsbCkKKwkJCQkJCQkJJiYgKG1ldGhvZERlY2xhcmF0aW9uc1tqXS5iaW5kaW5nID09IG1ldGhvZHNbaV0pKSB7CisJCQkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbDsKKwkJCQkJCQkJaWYgKChtZXRob2REZWNsID0gbWV0aG9kRGVjbGFyYXRpb25zW2pdKS5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IobWV0aG9kRGVjbCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXNDb3B5KTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKG1ldGhvZERlY2wsIG1ldGhvZEJpbmRpbmcsIHByb2JsZW1zQ29weSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gYWRkIGFic3RyYWN0IG1ldGhvZHMKKwkJCWNsYXNzRmlsZS5hZGREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCk7CisJCX0KKwkJLy8gcHJvcGFnYXRlIGdlbmVyYXRpb24gb2YgKHByb2JsZW0pIG1lbWJlciB0eXBlcworCQlpZiAodHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZSA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlc1tpXTsKKwkJCQlpZiAobWVtYmVyVHlwZS5iaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJY2xhc3NGaWxlLnJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShtZW1iZXJUeXBlLmJpbmRpbmcpOworCQkJCQlDbGFzc0ZpbGUuY3JlYXRlUHJvYmxlbVR5cGUobWVtYmVyVHlwZSwgdW5pdFJlc3VsdCk7CisJCQkJfQorCQkJfQorCQl9CisJCWNsYXNzRmlsZS5hZGRBdHRyaWJ1dGVzKCk7CisJCXVuaXRSZXN1bHQucmVjb3JkKHR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwgY2xhc3NGaWxlKTsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoaXMgbWV0aG9kcyByZXR1cm5zIGEgY2hhcltdIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZWNlaXZlcgorCSAqCisJICogQHJldHVybiBjaGFyW10KKwkgKi8KKwlwdWJsaWMgY2hhcltdIGZpbGVOYW1lKCkgeworCQlyZXR1cm4gY29uc3RhbnRQb29sLlVURjhDYWNoZS5yZXR1cm5LZXlGb3IoMSk7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGhlYWRlciBvZiBhIGNvZGUgYXR0cmlidXRlLgorCSAqIC0gdGhlIGluZGV4IGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbCBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lIChpLmUuJm5ic3A7Q29kZSkKKwkgKiAtIGxlYXZlIHNvbWUgc3BhY2UgZm9yIGF0dHJpYnV0ZV9sZW5ndGgoNCksIG1heF9zdGFjaygyKSwgbWF4X2xvY2FscygyKSwgY29kZV9sZW5ndGgoNCkuCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCkgeworCQlpbnQgY29udGVudHNMZW5ndGg7CisJCWlmIChjb250ZW50c09mZnNldCArIDIwID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJaW50IGNvbnN0YW50VmFsdWVOYW1lSW5kZXggPQorCQkJY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5Db2RlTmFtZSk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb25zdGFudFZhbHVlTmFtZUluZGV4ID4+IDgpOworCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBjb25zdGFudFZhbHVlTmFtZUluZGV4OworCQkvLyBsZWF2ZSBzcGFjZSBmb3IgYXR0cmlidXRlX2xlbmd0aCg0KSwgbWF4X3N0YWNrKDIpLCBtYXhfbG9jYWxzKDIpLCBjb2RlX2xlbmd0aCg0KQorCQljb250ZW50c09mZnNldCArPSAxMjsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoYXQgbWV0aG9kIGdlbmVyYXRlcyB0aGUgYXR0cmlidXRlcyBvZiBhIGNvZGUgYXR0cmlidXRlLgorCSAqIFRoZXkgY291bGQgYmU6CisJICogLSBhbiBleGNlcHRpb24gYXR0cmlidXRlIGZvciBlYWNoIHRyeS9jYXRjaCBmb3VuZCBpbnNpZGUgdGhlIG1ldGhvZAorCSAqIC0gYSBkZXByZWNhdGVkIGF0dHJpYnV0ZQorCSAqIC0gYSBzeW50aGV0aWMgYXR0cmlidXRlIGZvciBzeW50aGV0aWMgYWNjZXNzIG1ldGhvZHMKKwkgKgorCSAqIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGNyZWF0ZWQgZm9yIHRoZSBjb2RlIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZworCSAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorCSAqLworCXB1YmxpYyBpbnQgZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQkvLyBsZWF2ZSB0d28gYnl0ZXMgZm9yIHRoZSBhdHRyaWJ1dGVfbnVtYmVyCisJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7CisJCS8vIG5vdyB3ZSBjYW4gaGFuZGxlIGFsbCB0aGUgYXR0cmlidXRlIGZvciB0aGF0IG1ldGhvZCBpbmZvOgorCQkvLyBpdCBjb3VsZCBiZToKKwkJLy8gLSBhIENvZGVBdHRyaWJ1dGUKKwkJLy8gLSBhIEV4Y2VwdGlvbkF0dHJpYnV0ZQorCQkvLyAtIGEgRGVwcmVjYXRlZEF0dHJpYnV0ZQorCQkvLyAtIGEgU3ludGhldGljQXR0cmlidXRlCisKKwkJLy8gRXhjZXB0aW9uIGF0dHJpYnV0ZQorCQlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duc0V4Y2VwdGlvbnM7CisJCWludCBjb250ZW50c0xlbmd0aDsKKwkJaW50IGF0dHJpYnV0ZU51bWJlciA9IDA7CisJCWlmICgodGhyb3duc0V4Y2VwdGlvbnMgPSBtZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IE5vRXhjZXB0aW9ucykgeworCQkJLy8gVGhlIG1ldGhvZCBoYXMgYSB0aHJvdyBjbGF1c2UuIFNvIHdlIG5lZWQgdG8gYWRkIGFuIGV4Y2VwdGlvbiBhdHRyaWJ1dGUKKwkJCS8vIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIGFsbCB0aGUgYnl0ZXMgZm9yIHRoZSBleGNlcHRpb24gYXR0cmlidXRlCisJCQlpbnQgbGVuZ3RoID0gdGhyb3duc0V4Y2VwdGlvbnMubGVuZ3RoOworCQkJaWYgKGNvbnRlbnRzT2Zmc2V0ICsgKDggKyBsZW5ndGggKiAyKSA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJY29udGVudHMsCisJCQkJCTAsCisJCQkJCShjb250ZW50cyA9CisJCQkJCQluZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIE1hdGgubWF4KElOQ1JFTUVOVF9TSVpFLCAoOCArIGxlbmd0aCAqIDIpKV0pLAorCQkJCQkwLAorCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQl9CisJCQlpbnQgZXhjZXB0aW9uTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkV4Y2VwdGlvbnNOYW1lKTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChleGNlcHRpb25OYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBleGNlcHRpb25OYW1lSW5kZXg7CisJCQkvLyBUaGUgYXR0cmlidXRlIGxlbmd0aCA9IGxlbmd0aCAqIDIgKyAyIGluIGNhc2Ugb2YgYSBleGNlcHRpb24gYXR0cmlidXRlCisJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gbGVuZ3RoICogMiArIDI7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYXR0cmlidXRlTGVuZ3RoID4+IDI0KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhdHRyaWJ1dGVMZW5ndGggPj4gMTYpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGF0dHJpYnV0ZUxlbmd0aCA+PiA4KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGF0dHJpYnV0ZUxlbmd0aDsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChsZW5ndGggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBsZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaW50IGV4Y2VwdGlvbkluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCh0aHJvd25zRXhjZXB0aW9uc1tpXSk7CisJCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGV4Y2VwdGlvbkluZGV4ID4+IDgpOworCQkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGV4Y2VwdGlvbkluZGV4OworCQkJfQorCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJLy8gRGVwcmVjYXRlZCBhdHRyaWJ1dGUKKwkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlCisJCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkwLAorCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJfQorCQlpZiAobWV0aG9kQmluZGluZy5pc0RlcHJlY2F0ZWQoKSkgeworCQkJaW50IGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPQorCQkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRGVwcmVjYXRlZE5hbWUpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVOYW1lSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXByZWNhdGVkQXR0cmlidXRlTmFtZUluZGV4OworCQkJLy8gdGhlIGxlbmd0aCBvZiBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisKKwkJCWF0dHJpYnV0ZU51bWJlcisrOworCQl9CisJCS8vIFN5bnRoZXRpYyBhdHRyaWJ1dGUKKwkJLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlCisJCWlmIChjb250ZW50c09mZnNldCArIDYgPj0gKGNvbnRlbnRzTGVuZ3RoID0gY29udGVudHMubGVuZ3RoKSkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb250ZW50cywKKwkJCQkwLAorCQkJCShjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkwLAorCQkJCWNvbnRlbnRzTGVuZ3RoKTsKKwkJfQorCQlpZiAobWV0aG9kQmluZGluZy5pc1N5bnRoZXRpYygpKSB7CisJCQlpbnQgc3ludGhldGljQXR0cmlidXRlTmFtZUluZGV4ID0KKwkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlN5bnRoZXRpY05hbWUpOworCQkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleCA+PiA4KTsKKwkJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIHN5bnRoZXRpY0F0dHJpYnV0ZU5hbWVJbmRleDsKKwkJCS8vIHRoZSBsZW5ndGggb2YgYSBzeW50aGV0aWMgYXR0cmlidXRlIGlzIGVxdWFscyB0byAwCisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IDA7CisKKwkJCWF0dHJpYnV0ZU51bWJlcisrOworCQl9CisJCXJldHVybiBhdHRyaWJ1dGVOdW1iZXI7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBUaGF0IG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGhlYWRlciBvZiBhIG1ldGhvZCBpbmZvOgorCSAqIFRoZSBoZWFkZXIgY29uc2lzdHMgaW46CisJICogLSB0aGUgYWNjZXNzIGZsYWdzCisJICogLSB0aGUgbmFtZSBpbmRleCBvZiB0aGUgbWV0aG9kIG5hbWUgaW5zaWRlIHRoZSBjb25zdGFudCBwb29sCisJICogLSB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgaW5zaWRlIHRoZSBjb25zdGFudCBwb29sLgorCSAqCisJICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQkvLyBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byB3cml0ZSBhbGwgdGhlIGJ5dGVzIGZvciB0aGUgbWV0aG9kIGluZm8gY29ycmVzcG9uZGluZworCQkvLyB0byB0aGUgQG1ldGhvZEJpbmRpbmcKKwkJaW50IGNvbnRlbnRzTGVuZ3RoOworCQltZXRob2RDb3VudCsrOyAvLyBhZGQgb25lIG1vcmUgbWV0aG9kCisJCWlmIChjb250ZW50c09mZnNldCArIDEwID49IChjb250ZW50c0xlbmd0aCA9IGNvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJY29udGVudHMsCisJCQkJMCwKKwkJCQkoY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIElOQ1JFTUVOVF9TSVpFXSksCisJCQkJMCwKKwkJCQljb250ZW50c0xlbmd0aCk7CisJCX0KKwkJaW50IGFjY2Vzc0ZsYWdzID0gbWV0aG9kQmluZGluZy5nZXRBY2Nlc3NGbGFncygpOworCQlpZiAobWV0aG9kQmluZGluZy5pc1JlcXVpcmVkVG9DbGVhclByaXZhdGVNb2RpZmllcigpKSB7CisJCQlhY2Nlc3NGbGFncyAmPSB+QWNjUHJpdmF0ZTsKKwkJfQorCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYWNjZXNzRmxhZ3MgPj4gOCk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGFjY2Vzc0ZsYWdzOworCQlpbnQgbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChtZXRob2RCaW5kaW5nLnNlbGVjdG9yKTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQlpbnQgZGVzY3JpcHRvckluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpKTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhhdCBtZXRob2QgZ2VuZXJhdGVzIHRoZSBtZXRob2QgaW5mbyBoZWFkZXIgb2YgYSBjbGluaXQ6CisJICogVGhlIGhlYWRlciBjb25zaXN0cyBpbjoKKwkgKiAtIHRoZSBhY2Nlc3MgZmxhZ3MgKGFsd2F5cyBkZWZhdWx0IGFjY2VzcyArIHN0YXRpYykKKwkgKiAtIHRoZSBuYW1lIGluZGV4IG9mIHRoZSBtZXRob2QgbmFtZSAoYWx3YXlzIDxjbGluaXQ+KSBpbnNpZGUgdGhlIGNvbnN0YW50IHBvb2wgCisJICogLSB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGUgc2lnbmF0dXJlIChhbHdheXMgKClWKSBvZiB0aGUgbWV0aG9kIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbC4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlTWV0aG9kSW5mb0hlYWRlckZvckNsaW5pdCgpIHsKKwkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYWxsIHRoZSBieXRlcyBmb3IgdGhlIG1ldGhvZCBpbmZvIGNvcnJlc3BvbmRpbmcKKwkJLy8gdG8gdGhlIEBtZXRob2RCaW5kaW5nCisJCWludCBjb250ZW50c0xlbmd0aDsKKwkJbWV0aG9kQ291bnQrKzsgLy8gYWRkIG9uZSBtb3JlIG1ldGhvZAorCQlpZiAoY29udGVudHNPZmZzZXQgKyAxMCA+PSAoY29udGVudHNMZW5ndGggPSBjb250ZW50cy5sZW5ndGgpKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWNvbnRlbnRzLAorCQkJCTAsCisJCQkJKGNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBJTkNSRU1FTlRfU0laRV0pLAorCQkJCTAsCisJCQkJY29udGVudHNMZW5ndGgpOworCQl9CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpICgoQWNjRGVmYXVsdCB8IEFjY1N0YXRpYykgPj4gOCk7CisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChBY2NEZWZhdWx0IHwgQWNjU3RhdGljKTsKKwkJaW50IG5hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQ2xpbml0KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKG5hbWVJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgbmFtZUluZGV4OworCQlpbnQgZGVzY3JpcHRvckluZGV4ID0KKwkJCWNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQ2xpbml0U2lnbmF0dXJlKTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKGRlc2NyaXB0b3JJbmRleCA+PiA4KTsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgZGVzY3JpcHRvckluZGV4OworCQkvLyBXZSBrbm93IHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgdGhhbiAxIGF0dHJpYnV0ZTogdGhlIGNvZGUgYXR0cmlidXRlCisJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAxOworCX0KKworCS8qKgorCSAqIEVYVEVSTkFMIEFQSQorCSAqIEFuc3dlciB0aGUgYWN0dWFsIGJ5dGVzIG9mIHRoZSBjbGFzcyBmaWxlCisJICoKKwkgKiBUaGlzIG1ldGhvZCBlbmNvZGVzIHRoZSByZWNlaXZlciBzdHJ1Y3R1cmUgaW50byBhIGJ5dGUgYXJyYXkgd2hpY2ggaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGNsYXNzZmlsZS4KKwkgKiBSZXR1cm5zIHRoZSBieXRlIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgZW5jb2RlZCBzdHJ1Y3R1cmUgb2YgdGhlIHJlY2VpdmVyLgorCSAqCisJICogQHJldHVybiBieXRlW10KKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgeworCQlieXRlW10gZnVsbENvbnRlbnRzID0gbmV3IGJ5dGVbaGVhZGVyT2Zmc2V0ICsgY29udGVudHNPZmZzZXRdOworCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlciwgMCwgZnVsbENvbnRlbnRzLCAwLCBoZWFkZXJPZmZzZXQpOworCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCBmdWxsQ29udGVudHMsIGhlYWRlck9mZnNldCwgY29udGVudHNPZmZzZXQpOworCQlyZXR1cm4gZnVsbENvbnRlbnRzOworCX0KKworCS8qKgorCSAqIEVYVEVSTkFMIEFQSQorCSAqIEFuc3dlciB0aGUgY29tcG91bmQgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZS4KKwkgKiBAcmV0dXJuIGNoYXJbXVtdCisJICogZS5nLiB7e2phdmF9LCB7dXRpbH0sIHtIYXNodGFibGV9fS4KKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gZ2V0Q29tcG91bmROYW1lKCkgeworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgZmlsZU5hbWUoKSk7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBSZXR1cm5zIHRoZSBtb3N0IGVuY2xvc2luZyBjbGFzc2ZpbGUgb2YgdGhlIHJlY2VpdmVyLiBUaGlzIGlzIHVzZWQga25vdyB0byBzdG9yZSB0aGUgY29uc3RhbnQgcG9vbCBuYW1lCisJICogZm9yIGFsbCBpbm5lciB0eXBlcyBvZiB0aGUgcmVjZWl2ZXIuCisJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5DbGFzc0ZpbGUKKwkgKi8KKwlwdWJsaWMgQ2xhc3NGaWxlIG91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpIHsKKwkJQ2xhc3NGaWxlIGN1cnJlbnQgPSB0aGlzOworCQl3aGlsZSAoY3VycmVudC5lbmNsb3NpbmdDbGFzc0ZpbGUgIT0gbnVsbCkKKwkJCWN1cnJlbnQgPSBjdXJyZW50LmVuY2xvc2luZ0NsYXNzRmlsZTsKKwkJcmV0dXJuIGN1cnJlbnQ7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYSBuZXcgaW5uZXIgY2xhc3MuIEl0IGNoZWNrcyB0aGF0IHRoZSBiaW5kaW5nIEBiaW5kaW5nIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbnNpZGUgdGhlCisJICogY29sbGVjdGlvbiBvZiBpbm5lciBjbGFzc2VzLiBBZGQgYWxsIHRoZSBuZWNlc3NhcnkgY2xhc3NlcyBpbiB0aGUgcmlnaHQgb3JkZXIgdG8gZml0IHRvIHRoZSBzcGVjaWZpY2F0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBiaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIHJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKFJlZmVyZW5jZUJpbmRpbmcgYmluZGluZykgeworCQkvLyBhZGQgYWxsIHRoZSBlbmNsb3NpbmcgdHlwZXMKKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gcmVmZXJlbmNlQmluZGluZy5lbmNsb3NpbmdUeXBlKCk7CisJCWludCBkZXB0aCA9IDA7CisJCXdoaWxlIChlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKKwkJCWRlcHRoKys7CisJCQllbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCX0KKwkJZW5jbG9zaW5nVHlwZSA9IHJlZmVyZW5jZUJpbmRpbmc7CisJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZXNbXTsKKwkJaWYgKGRlcHRoID49IDIpIHsKKwkJCWVuY2xvc2luZ1R5cGVzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbZGVwdGhdOworCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQllbmNsb3NpbmdUeXBlc1tpXSA9IGVuY2xvc2luZ1R5cGU7CisJCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisJCQkJYWRkSW5uZXJDbGFzc2VzKGVuY2xvc2luZ1R5cGVzW2ldKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFkZElubmVyQ2xhc3NlcyhyZWZlcmVuY2VCaW5kaW5nKTsKKwkJfQorCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGEgbmV3IGlubmVyIGNsYXNzLiBJdCBjaGVja3MgdGhhdCB0aGUgYmluZGluZyBAYmluZGluZyBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW5zaWRlIHRoZQorCSAqIGNvbGxlY3Rpb24gb2YgaW5uZXIgY2xhc3Nlcy4gQWRkIGFsbCB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGZpdCB0byB0aGUgc3BlY2lmaWNhdGlvbnMuCisJICoKKwkgKiBAcGFyYW0gYmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWNvcmROZXN0ZWRMb2NhbEF0dHJpYnV0ZShSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsKKwkJLy8gYWRkIGFsbCB0aGUgZW5jbG9zaW5nIHR5cGVzCisJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlZmVyZW5jZUJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpOworCQlpbnQgZGVwdGggPSAwOworCQl3aGlsZSAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCQlkZXB0aCsrOworCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9CisJCWVuY2xvc2luZ1R5cGUgPSByZWZlcmVuY2VCaW5kaW5nOworCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGVzW107CisJCWlmIChkZXB0aCA+PSAyKSB7CisJCQllbmNsb3NpbmdUeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2RlcHRoXTsKKwkJCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJZW5jbG9zaW5nVHlwZXNbaV0gPSBlbmNsb3NpbmdUeXBlOworCQkJCWVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKwkJCQlhZGRJbm5lckNsYXNzZXMoZW5jbG9zaW5nVHlwZXNbaV0pOworCQl9IGVsc2UgeworCQkJYWRkSW5uZXJDbGFzc2VzKGJpbmRpbmcpOworCQl9CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYSBuZXcgaW5uZXIgY2xhc3MuIEl0IGNoZWNrcyB0aGF0IHRoZSBiaW5kaW5nIEBiaW5kaW5nIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbnNpZGUgdGhlCisJICogY29sbGVjdGlvbiBvZiBpbm5lciBjbGFzc2VzLiBBZGQgYWxsIHRoZSBuZWNlc3NhcnkgY2xhc3NlcyBpbiB0aGUgcmlnaHQgb3JkZXIgdG8gZml0IHRvIHRoZSBzcGVjaWZpY2F0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBiaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZworCSAqLworCXB1YmxpYyB2b2lkIHJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcpIHsKKwkJYWRkSW5uZXJDbGFzc2VzKGJpbmRpbmcpOworCX0KKworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogU2VhcmNoIHRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24KKwkgKgorCSAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VhcmNoTGluZU51bWJlcigKKwkJaW50W10gc3RhcnRMaW5lSW5kZXhlcywKKwkJaW50IHBvc2l0aW9uKSB7CisJCS8vIHRoaXMgY29kZSBpcyBjb21wbGV0ZWx5IHVzZWxlc3MsIGJ1dCBpdCBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiB0aGFuCisJCS8vIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1IYW5kbGVyLnNlYXJjaExpbmVOdW1iZXIoaW50W10sIGludCkKKwkJLy8gaWYgKHN0YXJ0TGluZUluZGV4ZXMgPT0gbnVsbCkKKwkJLy8JcmV0dXJuIDE7CisJCWludCBsZW5ndGggPSBzdGFydExpbmVJbmRleGVzLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIDE7CisJCWludCBnID0gMCwgZCA9IGxlbmd0aCAtIDE7CisJCWludCBtID0gMDsKKwkJd2hpbGUgKGcgPD0gZCkgeworCQkJbSA9IChnICsgZCkgLyAyOworCQkJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgeworCQkJCWQgPSBtIC0gMTsKKwkJCX0gZWxzZQorCQkJCWlmIChwb3NpdGlvbiA+IHN0YXJ0TGluZUluZGV4ZXNbbV0pIHsKKwkJCQkJZyA9IG0gKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBtICsgMTsKKwkJCQl9CisJCX0KKwkJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgeworCQkJcmV0dXJuIG0gKyAxOworCQl9CisJCXJldHVybiBtICsgMjsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UtT05MWQorCSAqIFRoaXMgbWV0aG9kcyBsZWF2ZXMgdGhlIHNwYWNlIGZvciBtZXRob2QgY291bnRzIHJlY29yZGluZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb3JNZXRob2RJbmZvcygpIHsKKwkJLy8gbGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIG1ldGhvZENvdW50CisJCW1ldGhvZENvdW50T2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CisJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7CisJfQorCisJLyoqCisJICogSU5URVJOQUwgVVNFLU9OTFkKKwkgKiBvdXRwdXRQYXRoIGlzIGZvcm1lZCBsaWtlOgorCSAqCSAgIGM6XHRlbXBcIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGZpbGUgc2VwYXJhdG9yCisJICogcmVsYXRpdmVGaWxlTmFtZSBpcyBmb3JtZWQgbGlrZToKKwkgKiAgICAgamF2YVxsYW5nXFN0cmluZy5jbGFzcworCSAqIEBwYXJhbSBnZW5lcmF0ZVBhY2thZ2VzU3RydWN0dXJlIGEgZmxhZyB0byBrbm93IGlmIHRoZSBwYWNrYWdlcyBzdHJ1Y3R1cmUgaGFzIHRvIGJlIGdlbmVyYXRlZC4KKwkgKiBAcGFyYW0gb3V0cHV0UGF0aCB0aGUgb3V0cHV0IGRpcmVjdG9yeQorCSAqIEBwYXJhbSByZWxhdGl2ZUZpbGVOYW1lIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gY29udGVudHMgYnl0ZVtdCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9EaXNrKAorCQlib29sZWFuIGdlbmVyYXRlUGFja2FnZXNTdHJ1Y3R1cmUsCisJCVN0cmluZyBvdXRwdXRQYXRoLAorCQlTdHJpbmcgcmVsYXRpdmVGaWxlTmFtZSwKKwkJYnl0ZVtdIGNvbnRlbnRzKQorCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCisJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CisJCWlmIChnZW5lcmF0ZVBhY2thZ2VzU3RydWN0dXJlKSB7CisJCQlvdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJCQluZXcgRmlsZShidWlsZEFsbERpcmVjdG9yaWVzSW50byhvdXRwdXRQYXRoLCByZWxhdGl2ZUZpbGVOYW1lKSkpKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisJCQljaGFyIGZpbGVTZXBhcmF0b3JDaGFyID0gRmlsZS5zZXBhcmF0b3JDaGFyOworCQkJU3RyaW5nIGZpbGVTZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvcjsKKwkJCS8vIEZpcnN0IHdlIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXRQYXRoIGV4aXN0cworCQkJb3V0cHV0UGF0aCA9IG91dHB1dFBhdGgucmVwbGFjZSgnLycsIGZpbGVTZXBhcmF0b3JDaGFyKTsKKwkJCS8vIFRvIGJlIGFibGUgdG8gcGFzcyB0aGUgbWtkaXJzKCkgbWV0aG9kIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBmaWxlIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBvdXREaXIgbmFtZQorCQkJaW50IGluZGV4T2ZQYWNrYWdlU2VwYXJhdG9yID0gcmVsYXRpdmVGaWxlTmFtZS5sYXN0SW5kZXhPZihmaWxlU2VwYXJhdG9yQ2hhcik7CisJCQlpZiAoaW5kZXhPZlBhY2thZ2VTZXBhcmF0b3IgPT0gLTEpIHsKKwkJCQlpZiAob3V0cHV0UGF0aC5lbmRzV2l0aChmaWxlU2VwYXJhdG9yKSkgeworCQkJCQlmaWxlTmFtZSA9IG91dHB1dFBhdGggKyByZWxhdGl2ZUZpbGVOYW1lOworCQkJCX0gZWxzZSB7CisJCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKyByZWxhdGl2ZUZpbGVOYW1lOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IGxlbmd0aCA9IHJlbGF0aXZlRmlsZU5hbWUubGVuZ3RoKCk7CisJCQkJaWYgKG91dHB1dFBhdGguZW5kc1dpdGgoZmlsZVNlcGFyYXRvcikpIHsKKwkJCQkJZmlsZU5hbWUgPSBvdXRwdXRQYXRoICsgcmVsYXRpdmVGaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXhPZlBhY2thZ2VTZXBhcmF0b3IgKyAxLCBsZW5ndGgpOworCQkJCX0gZWxzZSB7CisJCQkJCWZpbGVOYW1lID0gb3V0cHV0UGF0aCArIGZpbGVTZXBhcmF0b3IgKyByZWxhdGl2ZUZpbGVOYW1lLnN1YnN0cmluZyhpbmRleE9mUGFja2FnZVNlcGFyYXRvciArIDEsIGxlbmd0aCk7CisJCQkJfQorCQkJfQorCQkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKAorCQkJCQkJbmV3IEZpbGUoZmlsZU5hbWUpKSk7CisJCX0KKwkJdHJ5IHsKKwkJCW91dHB1dC53cml0ZShjb250ZW50cyk7CisJCX0gZmluYWxseSB7CisJCQlvdXRwdXQuZmx1c2goKTsKKwkJCW91dHB1dC5jbG9zZSgpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGF0aW9uUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlOWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKKy8qKgorICogQSBjb21waWxhdGlvbiByZXN1bHQgY29uc2lzdHMgb2YgYWxsIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBjb21waWxlciBmb3IgCisgKiBhIHNpbmdsZSBjb21waWxlZCBjb21waWxhdGlvbiBzb3VyY2UgdW5pdC4gIFRoaXMgaW5jbHVkZXM6CisgKiA8dWw+CisgKiA8bGk+IHRoZSBjb21waWxhdGlvbiB1bml0IHRoYXQgd2FzIGNvbXBpbGVkCisgKiA8bGk+IGZvciBlYWNoIHR5cGUgcHJvZHVjZWQgYnkgY29tcGlsaW5nIHRoZSBjb21waWxhdGlvbiB1bml0LCBpdHMgYmluYXJ5IGFuZCBvcHRpb25hbGx5IGl0cyBwcmluY2lwYWwgc3RydWN0dXJlCisgKiA8bGk+IGFueSBwcm9ibGVtcyAoZXJyb3JzIG9yIHdhcm5pbmdzKSBwcm9kdWNlZAorICogPGxpPiBkZXBlbmRlbmN5IGluZm8KKyAqIDwvdWw+CisgKgorICogVGhlIHByaW5jaXBsZSBzdHJ1Y3R1cmUgYW5kIGJpbmFyeSBtYXkgYmUgbnVsbCBpZiB0aGUgY29tcGlsZXIgY291bGQgbm90IHByb2R1Y2UgdGhlbS4KKyAqIElmIG5laXRoZXIgY291bGQgYmUgcHJvZHVjZWQsIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZW50cnkgZm9yIHRoZSB0eXBlLgorICoKKyAqIFRoZSBkZXBlbmRlbmN5IGluZm8gaW5jbHVkZXMgdHlwZSByZWZlcmVuY2VzIHN1Y2ggYXMgc3VwZXJ0eXBlcywgZmllbGQgdHlwZXMsIG1ldGhvZAorICogcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZXMsIGxvY2FsIHZhcmlhYmxlIHR5cGVzLCB0eXBlcyBvZiBpbnRlcm1lZGlhdGUgZXhwcmVzc2lvbnMsIGV0Yy4KKyAqIEl0IGFsc28gaW5jbHVkZXMgdGhlIG5hbWVzcGFjZXMgKHBhY2thZ2VzKSBpbiB3aGljaCBuYW1lcyB3ZXJlIGxvb2tlZCB1cC4KKyAqIEl0IGRvZXMgPGVtPm5vdDwvZW0+IGluY2x1ZGUgZmluZXIgZ3JhaW5lZCBkZXBlbmRlbmNpZXMgc3VjaCBhcyBpbmZvcm1hdGlvbiBhYm91dAorICogc3BlY2lmaWMgZmllbGRzIGFuZCBtZXRob2RzIHdoaWNoIHdlcmUgcmVmZXJlbmNlZCwgYnV0IGRvZXMgY29udGFpbiB0aGVpciAKKyAqIGRlY2xhcmluZyB0eXBlcyBhbmQgYW55IG90aGVyIHR5cGVzIHVzZWQgdG8gbG9jYXRlIHN1Y2ggZmllbGRzIG9yIG1ldGhvZHMuCisgKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblJlc3VsdCB7CisJCisJcHVibGljIElQcm9ibGVtIHByb2JsZW1zW107CisJcHVibGljIGludCBwcm9ibGVtQ291bnQ7CisJcHVibGljIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OworCXByaXZhdGUgTWFwIHByb2JsZW1zTWFwOworCXByaXZhdGUgTWFwIGZpcnN0RXJyb3JzTWFwOworCXByaXZhdGUgSGFzaFNldCBkdXBsaWNhdGVQcm9ibGVtczsKKwlwcml2YXRlIGludCBtYXhQcm9ibGVtUGVyVW5pdDsKKwlwdWJsaWMgY2hhcltdW11bXSBxdWFsaWZpZWRSZWZlcmVuY2VzOworCXB1YmxpYyBjaGFyW11bXSBzaW1wbGVOYW1lUmVmZXJlbmNlczsKKworCXB1YmxpYyBpbnQgbGluZVNlcGFyYXRvclBvc2l0aW9uc1tdOworCXB1YmxpYyBIYXNodGFibGUgY29tcGlsZWRUeXBlcyA9IG5ldyBIYXNodGFibGUoMTEpOworCXB1YmxpYyBpbnQgdW5pdEluZGV4LCB0b3RhbFVuaXRzS25vd247CisJcHVibGljIGJvb2xlYW4gaGFzQmVlbkFjY2VwdGVkID0gZmFsc2U7CisJcHVibGljIGNoYXJbXSBmaWxlTmFtZTsKKwkKK3B1YmxpYyBDb21waWxhdGlvblJlc3VsdCgKKwljaGFyW10gZmlsZU5hbWUsCisJaW50IHVuaXRJbmRleCwgCisJaW50IHRvdGFsVW5pdHNLbm93biwKKwlpbnQgbWF4UHJvYmxlbVBlclVuaXQpeworCisJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworCXRoaXMudW5pdEluZGV4ID0gdW5pdEluZGV4OworCXRoaXMudG90YWxVbml0c0tub3duID0gdG90YWxVbml0c0tub3duOworCXRoaXMubWF4UHJvYmxlbVBlclVuaXQgPSBtYXhQcm9ibGVtUGVyVW5pdDsKKworfQorCitwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQoCisJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCisJaW50IHVuaXRJbmRleCwgCisJaW50IHRvdGFsVW5pdHNLbm93biwKKwlpbnQgbWF4UHJvYmxlbVBlclVuaXQpeworCisJdGhpcy5maWxlTmFtZSA9IGNvbXBpbGF0aW9uVW5pdC5nZXRGaWxlTmFtZSgpOworCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OworCXRoaXMudW5pdEluZGV4ID0gdW5pdEluZGV4OworCXRoaXMudG90YWxVbml0c0tub3duID0gdG90YWxVbml0c0tub3duOworCXRoaXMubWF4UHJvYmxlbVBlclVuaXQgPSBtYXhQcm9ibGVtUGVyVW5pdDsKKworfQorcHJpdmF0ZSBpbnQgY29tcHV0ZVByaW9yaXR5KElQcm9ibGVtIHByb2JsZW0peworCisJZmluYWwgaW50IFBfU1RBVElDID0gMTAwMDsKKwlmaW5hbCBpbnQgUF9PVVRTSURFX01FVEhPRCA9IDQwMDA7CisJZmluYWwgaW50IFBfRklSU1RfRVJST1IgPSAyMDAwOworCWZpbmFsIGludCBQX0VSUk9SID0gMTAwMDA7CisJCisJaW50IHByaW9yaXR5ID0gMTAwMCAtIHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpOyAvLyBlYXJseSBwcm9ibGVtcyBmaXJzdAorCWlmIChwcmlvcml0eSA8IDApIHByaW9yaXR5ID0gMDsKKwlpZiAocHJvYmxlbS5pc0Vycm9yKCkpeworCQlwcmlvcml0eSArPSBQX0VSUk9SOworCX0KKwlSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQgPSBwcm9ibGVtc01hcCA9PSBudWxsID8gbnVsbCA6IChSZWZlcmVuY2VDb250ZXh0KSBwcm9ibGVtc01hcC5nZXQocHJvYmxlbSk7CisJaWYgKGNvbnRleHQgIT0gbnVsbCl7CisJCWlmIChjb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbil7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBjb250ZXh0OworCQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7CisJCQkJcHJpb3JpdHkgKz0gUF9TVEFUSUM7CisJCQl9CisJCX0gZWxzZSB7CisJCXByaW9yaXR5ICs9IFBfT1VUU0lERV9NRVRIT0Q7CisJCX0KKwl9IGVsc2UgeworCQlwcmlvcml0eSArPSBQX09VVFNJREVfTUVUSE9EOworCX0KKwlpZiAoZmlyc3RFcnJvcnNNYXAuY29udGFpbnNLZXkocHJvYmxlbSkpeworCQlwcmlvcml0eSArPSBQX0ZJUlNUX0VSUk9SOworCX0KKwlyZXR1cm4gcHJpb3JpdHk7Cit9CitwdWJsaWMgQ2xhc3NGaWxlW10gZ2V0Q2xhc3NGaWxlcygpIHsKKwlFbnVtZXJhdGlvbiBlbnVtID0gY29tcGlsZWRUeXBlcy5lbGVtZW50cygpOworCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBuZXcgQ2xhc3NGaWxlW2NvbXBpbGVkVHlwZXMuc2l6ZSgpXTsKKwlpbnQgaW5kZXggPSAwOworCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKXsKKwkJY2xhc3NGaWxlc1tpbmRleCsrXSA9IChDbGFzc0ZpbGUpZW51bS5uZXh0RWxlbWVudCgpOworCX0KKwlyZXR1cm4gY2xhc3NGaWxlczsJCit9CisvKioKKyAqIEFuc3dlciB0aGUgaW5pdGlhbCBjb21waWxhdGlvbiB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZXNlbnQgY29tcGlsYXRpb24gcmVzdWx0CisgKi8KK3B1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpeworCXJldHVybiBjb21waWxhdGlvblVuaXQ7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgaW5pdGlhbCBmaWxlIG5hbWUKKyAqLworcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpeworCXJldHVybiBmaWxlTmFtZTsKK30KKy8qKgorICogQW5zd2VyIHRoZSBwcm9ibGVtcyAoZXJyb3JzIGFuZCB3YXJuaW5ncykgZW5jb3VudGVyZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgorICoKKyAqIFRoaXMgaXMgbm90IGEgY29tcGlsZXIgaW50ZXJuYWwgQVBJIC0gaXQgaGFzIHNpZGUtZWZmZWN0cyAhCisgKiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgb25jZSBhbGwgcHJvYmxlbXMgaGF2ZSBiZWVuIGRldGVjdGVkLAorICogYW5kIG1ha2VzIHN1cmUgdGhlIHByb2JsZW1zIHNsb3QgYXMgdGhlIGV4YWN0IHNpemUgb2YgdGhlIG51bWJlciBvZgorICogcHJvYmxlbXMuCisgKi8KK3B1YmxpYyBJUHJvYmxlbVtdIGdldFByb2JsZW1zKCkgeworCQorCS8vIFJlLWFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcHJvYmxlbXMgaWYgbmVjZXNzYXJ5LgorCWlmIChwcm9ibGVtcyAhPSBudWxsKSB7CisKKwkJaWYgKHRoaXMucHJvYmxlbUNvdW50ICE9IHByb2JsZW1zLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgKHByb2JsZW1zID0gbmV3IElQcm9ibGVtW3Byb2JsZW1Db3VudF0pLCAwLCBwcm9ibGVtQ291bnQpOworCQl9CisKKwkJaWYgKHRoaXMubWF4UHJvYmxlbVBlclVuaXQgPiAwICYmIHRoaXMucHJvYmxlbUNvdW50ID4gdGhpcy5tYXhQcm9ibGVtUGVyVW5pdCl7CisJCQlxdWlja1ByaW9yaXRpemUocHJvYmxlbXMsIDAsIHByb2JsZW1Db3VudCAtIDEpOworCQkJdGhpcy5wcm9ibGVtQ291bnQgPSB0aGlzLm1heFByb2JsZW1QZXJVbml0OworCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgKHByb2JsZW1zID0gbmV3IElQcm9ibGVtW3Byb2JsZW1Db3VudF0pLCAwLCBwcm9ibGVtQ291bnQpOworCQl9CisKKwkJLy8gU29ydCBwcm9ibGVtcyBwZXIgc291cmNlIHBvc2l0aW9ucy4KKwkJcXVpY2tzb3J0KHByb2JsZW1zLCAwLCBwcm9ibGVtcy5sZW5ndGgtMSk7CisJfQorCXJldHVybiBwcm9ibGVtczsKK30KKworcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgeworCWlmIChwcm9ibGVtcyAhPSBudWxsKQorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1Db3VudDsgaSsrKSB7CisJCQlpZiAocHJvYmxlbXNbaV0uaXNFcnJvcigpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbXMoKSB7CisJcmV0dXJuIHByb2JsZW1Db3VudCAhPSAwOworfQorcHVibGljIGJvb2xlYW4gaGFzV2FybmluZ3MoKSB7CisJaWYgKHByb2JsZW1zICE9IG51bGwpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbUNvdW50OyBpKyspIHsKKwkJCWlmIChwcm9ibGVtc1tpXS5pc1dhcm5pbmcoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCXJldHVybiBmYWxzZTsKK30KKworcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja3NvcnQoSVByb2JsZW0gYXJyW10sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwlpbnQgaSwgbGFzdCwgcG9zOworCisJaWYgKGxlZnQgPj0gcmlnaHQpIHsKKwkJLyogZG8gbm90aGluZyBpZiBhcnJheSBjb250YWlucyBmZXdlciB0aGFuIHR3byAqLworCQlyZXR1cm47CisJCS8qIHR3byBlbGVtZW50cyAqLworCX0KKworCXN3YXAoYXJyLCBsZWZ0LCAobGVmdCArIHJpZ2h0KSAvIDIpOworCWxhc3QgPSBsZWZ0OworCXBvcyA9IGFycltsZWZ0XS5nZXRTb3VyY2VTdGFydCgpOworCisJZm9yIChpID0gbGVmdCArIDE7IGkgPD0gcmlnaHQ7IGkrKykgeworCQlpZiAoYXJyW2ldLmdldFNvdXJjZVN0YXJ0KCkgPCBwb3MpIHsKKwkJCXN3YXAoYXJyLCArK2xhc3QsIGkpOworCQl9CisJfQorCisJc3dhcChhcnIsIGxlZnQsIGxhc3QpOworCXF1aWNrc29ydChhcnIsIGxlZnQsIGxhc3QgLSAxKTsKKwlxdWlja3NvcnQoYXJyLCBsYXN0ICsgMSwgcmlnaHQpOworfQorCitwcml2YXRlIHZvaWQgcXVpY2tQcmlvcml0aXplKElQcm9ibGVtIGFycltdLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisJaW50IGksIGxhc3QsIHByaW87CisKKwlpZiAobGVmdCA+PSByaWdodCkgeworCQkvKiBkbyBub3RoaW5nIGlmIGFycmF5IGNvbnRhaW5zIGZld2VyIHRoYW4gdHdvICovCisJCXJldHVybjsKKwkJLyogdHdvIGVsZW1lbnRzICovCisJfQorCisJc3dhcChhcnIsIGxlZnQsIChsZWZ0ICsgcmlnaHQpIC8gMik7CisJbGFzdCA9IGxlZnQ7CisJcHJpbyA9IGNvbXB1dGVQcmlvcml0eShhcnJbbGVmdF0pOworCisJZm9yIChpID0gbGVmdCArIDE7IGkgPD0gcmlnaHQ7IGkrKykgeworCQlpZiAoY29tcHV0ZVByaW9yaXR5KGFycltpXSkgPiBwcmlvKSB7CisJCQlzd2FwKGFyciwgKytsYXN0LCBpKTsKKwkJfQorCX0KKworCXN3YXAoYXJyLCBsZWZ0LCBsYXN0KTsKKwlxdWlja1ByaW9yaXRpemUoYXJyLCBsZWZ0LCBsYXN0IC0gMSk7CisJcXVpY2tQcmlvcml0aXplKGFyciwgbGFzdCArIDEsIHJpZ2h0KTsKK30KKworLyoqCisgKiBGb3Igbm93LCByZW1lbWJlciB0aGUgY29tcGlsZWQgdHlwZSB1c2luZyBpdHMgY29tcG91bmQgbmFtZS4KKyAqLworcHVibGljIHZvaWQgcmVjb3JkKGNoYXJbXSB0eXBlTmFtZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCWNvbXBpbGVkVHlwZXMucHV0KHR5cGVOYW1lLCBjbGFzc0ZpbGUpOworfQorcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIG5ld1Byb2JsZW0sIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCkgeworCWlmIChwcm9ibGVtQ291bnQgPT0gMCkgeworCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVs1XTsKKwl9IGVsc2UgeworCQlpZiAocHJvYmxlbUNvdW50ID09IHByb2JsZW1zLmxlbmd0aCkKKwkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIChwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVtwcm9ibGVtQ291bnQgKiAyXSksIDAsIHByb2JsZW1Db3VudCk7CisJfTsKKwlwcm9ibGVtc1twcm9ibGVtQ291bnQrK10gPSBuZXdQcm9ibGVtOworCWlmIChyZWZlcmVuY2VDb250ZXh0ICE9IG51bGwpeworCQlpZiAocHJvYmxlbXNNYXAgPT0gbnVsbCkgcHJvYmxlbXNNYXAgPSBuZXcgSGFzaHRhYmxlKDUpOworCQlpZiAoZmlyc3RFcnJvcnNNYXAgPT0gbnVsbCkgZmlyc3RFcnJvcnNNYXAgPSBuZXcgSGFzaHRhYmxlKDUpOworCQlpZiAobmV3UHJvYmxlbS5pc0Vycm9yKCkgJiYgIXJlZmVyZW5jZUNvbnRleHQuaGFzRXJyb3JzKCkpIGZpcnN0RXJyb3JzTWFwLnB1dChuZXdQcm9ibGVtLCBuZXdQcm9ibGVtKTsKKwkJcHJvYmxlbXNNYXAucHV0KG5ld1Byb2JsZW0sIHJlZmVyZW5jZUNvbnRleHQpOworCX0KK30KK3ByaXZhdGUgc3RhdGljIHZvaWQgc3dhcChJUHJvYmxlbSBhcnJbXSwgaW50IGksIGludCBqKSB7CisJSVByb2JsZW0gdG1wOworCXRtcCA9IGFycltpXTsKKwlhcnJbaV0gPSBhcnJbal07CisJYXJyW2pdID0gdG1wOworfQorQ29tcGlsYXRpb25SZXN1bHQgdGFnQXNBY2NlcHRlZCgpeworCXRoaXMuaGFzQmVlbkFjY2VwdGVkID0gdHJ1ZTsKKwl0aGlzLnByb2JsZW1zTWFwID0gbnVsbDsgLy8gZmx1c2gKKwlyZXR1cm4gdGhpczsKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJaWYgKHRoaXMuZmlsZU5hbWUgIT0gbnVsbCl7CisJCWJ1ZmZlci5hcHBlbmQoIkZpbGVuYW1lIDogIikuYXBwZW5kKHRoaXMuZmlsZU5hbWUpLmFwcGVuZCgnXG4nKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAodGhpcy5jb21waWxlZFR5cGVzICE9IG51bGwpeworCQlidWZmZXIuYXBwZW5kKCJDT01QSUxFRCB0eXBlKHMpCVxuIik7ICAvLyROT04tTkxTLTEkCisJCUVudW1lcmF0aW9uIHR5cGVOYW1lcyA9IHRoaXMuY29tcGlsZWRUeXBlcy5rZXlzKCk7CisJCXdoaWxlICh0eXBlTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCWNoYXJbXSB0eXBlTmFtZSA9IChjaGFyW10pIHR5cGVOYW1lcy5uZXh0RWxlbWVudCgpOworCQkJYnVmZmVyLmFwcGVuZCgiXHQgLSAiKS5hcHBlbmQodHlwZU5hbWUpLmFwcGVuZCgnXG4nKTsgICAvLyROT04tTkxTLTEkCisJCQkKKwkJfQorCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoIk5vIENPTVBJTEVEIHR5cGVcbiIpOyAgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAocHJvYmxlbXMgIT0gbnVsbCl7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5wcm9ibGVtQ291bnQpLmFwcGVuZCgiIFBST0JMRU0ocykgZGV0ZWN0ZWQgXG4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1Db3VudDsgaSsrKXsKKwkJCWJ1ZmZlci5hcHBlbmQoIlx0IC0gIikuYXBwZW5kKHRoaXMucHJvYmxlbXNbaV0pLmFwcGVuZCgnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZCgiTm8gUFJPQkxFTVxuIik7IC8vJE5PTi1OTFMtMSQKKwl9IAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyZTEzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhCkBAIC0wLDAgKzEsNTk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIENvbXBpbGVyIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3IsIFByb2JsZW1TZXZlcml0aWVzIHsKKwlwdWJsaWMgUGFyc2VyIHBhcnNlcjsKKwlJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yOworCXB1YmxpYyBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKKwlwdWJsaWMgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKKworCS8vIG1hbmFnZW1lbnQgb2YgdW5pdCB0byBiZSBwcm9jZXNzZWQKKwkvL3B1YmxpYyBDb21waWxhdGlvblVuaXRSZXN1bHQgY3VycmVudENvbXBpbGF0aW9uVW5pdFJlc3VsdDsKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHVuaXRzVG9Qcm9jZXNzOworCWludCB0b3RhbFVuaXRzOyAvLyAodG90YWxVbml0cy0xKSBnaXZlcyB0aGUgbGFzdCB1bml0IGluIHVuaXRUb1Byb2Nlc3MKKworCS8vIG5hbWUgbG9va3VwCisJcHVibGljIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50OworCisJLy8gT05DRSBTVEFCSUxJWkVELCBUSEVTRSBTSE9VTEQgUkVUVVJOIFRPIEEgRklOQUwgRklFTEQKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKwlwdWJsaWMgaW50IHBhcnNlVGhyZXNob2xkID0gLTE7CisJLy8gbnVtYmVyIG9mIGluaXRpYWwgdW5pdHMgcGFyc2VkIGF0IG9uY2UgKC0xOiBub25lKQorCisJLyoKKwkgKiBTdGF0aWMgcmVxdWVzdG9yIHJlc2VydmVkIHRvIGxpc3RlbmluZyBjb21waWxhdGlvbiByZXN1bHRzIGluIGRlYnVnIG1vZGUsCisJICogc28gYXMgZm9yIGV4YW1wbGUgdG8gbW9uaXRvciBjb21waWxlciBhY3Rpdml0eSBpbmRlcGVuZGFudGx5IGZyb20gYSBwYXJ0aWN1bGFyCisJICogYnVpbGRlciBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgcmVzZXQgYXQgdGhlIGVuZCBvZiBjb21waWxhdGlvbiwgYW5kIHNob3VsZCBub3QgCisJICogcGVyc2lzdCBhbnkgaW5mb3JtYXRpb24gYWZ0ZXIgaGF2aW5nIGJlZW4gcmVzZXQuCisJICovCisJcHVibGljIHN0YXRpYyBJRGVidWdSZXF1ZXN0b3IgRGVidWdSZXF1ZXN0b3IgPSBudWxsOworCisJLyoqCisJICogQW5zd2VyIGEgbmV3IGNvbXBpbGVyIHVzaW5nIHRoZSBnaXZlbiBuYW1lIGVudmlyb25tZW50IGFuZCBjb21waWxlciBvcHRpb25zLgorCSAqIFRoZSBlbnZpcm9ubWVudCBhbmQgb3B0aW9ucyB3aWxsIGJlIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21waWxlci4KKwkgKiBXaGVuIHRoZSBjb21waWxlciBpcyBydW4sIGNvbXBpbGF0aW9uIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGdpdmVuIHJlcXVlc3Rvci4KKwkgKgorCSAqICBAcGFyYW0gZW52aXJvbm1lbnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5lbnYuSU5hbWVFbnZpcm9ubWVudAorCSAqICAgICAgRW52aXJvbm1lbnQgdXNlZCBieSB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0eXBlIGFuZCBwYWNrYWdlCisJICogICAgICBuYW1lcy4gVGhlIG5hbWUgZW52aXJvbm1lbnQgaW1wbGVtZW50cyB0aGUgYWN0dWFsIGNvbm5lY3Rpb24gb2YgdGhlIGNvbXBpbGVyCisJICogICAgICB0byB0aGUgb3V0c2lkZSB3b3JsZCAoZS5nLiBpbiBiYXRjaCBtb2RlIHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHBlcmZvcm1pbmcKKwkgKiAgICAgIHB1cmUgZmlsZSBhY2Nlc3NlcywgcmV1c2UgcHJldmlvdXMgYnVpbGQgc3RhdGUgb3IgY29ubmVjdGlvbiB0byByZXBvc2l0b3JpZXMpLgorCSAqICAgICAgTm90ZTogdGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgYWN0dWFsIGNsYXNzcGF0aAorCSAqICAgICAgICAgICAgcnVsZXMuCisJICoKKwkgKiAgQHBhcmFtIHBvbGljeSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uSUVycm9ySGFuZGxpbmdQb2xpY3kKKwkgKiAgICAgIENvbmZpZ3VyYWJsZSBwYXJ0IGZvciBwcm9ibGVtIGhhbmRsaW5nLCBhbGxvd2luZyB0aGUgY29tcGlsZXIgY2xpZW50IHRvCisJICogICAgICBzcGVjaWZ5IHRoZSBydWxlcyBmb3IgaGFuZGxpbmcgcHJvYmxlbXMgKHN0b3Agb24gZmlyc3QgZXJyb3Igb3IgYWNjdW11bGF0ZQorCSAqICAgICAgdGhlbSBhbGwpIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHBlcmZvcm0gc29tZSBhY3Rpb25zIHN1Y2ggYXMgb3BlbmluZyBhIGRpYWxvZworCSAqICAgICAgaW4gVUkgd2hlbiBjb21waWxpbmcgaW50ZXJhY3RpdmVseS4KKwkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMKKwkgKiAgICAgIAorCSAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUNvbXBpbGVyUmVxdWVzdG9yCisJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZAorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIAorCSAqICAgICAgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgb3V0IHRoZSBhY3R1YWwgLmNsYXNzIGZpbGVzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0CisJICoKKwkgKiAgQHBhcmFtIHByb2JsZW1GYWN0b3J5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5JUHJvYmxlbUZhY3RvcnkKKwkgKiAgICAgIEZhY3RvcnkgdXNlZCBpbnNpZGUgdGhlIGNvbXBpbGVyIHRvIGNyZWF0ZSBwcm9ibGVtIGRlc2NyaXB0b3JzLiBJdCBhbGxvd3MgdGhlCisJICogICAgICBjb21waWxlciBjbGllbnQgdG8gc3VwcGx5IGl0cyBvd24gcmVwcmVzZW50YXRpb24gb2YgY29tcGlsYXRpb24gcHJvYmxlbXMgaW4KKwkgKiAgICAgIG9yZGVyIHRvIGF2b2lkIG9iamVjdCBjb252ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBmYWN0b3J5IGlzIG5vdCBzdXBwb3NlZAorCSAqICAgICAgdG8gYWNjdW11bGF0ZSB0aGUgY3JlYXRlZCBwcm9ibGVtcywgdGhlIGNvbXBpbGVyIHdpbGwgZ2F0aGVyIHRoZW0gYWxsIGFuZCBoYW5kCisJICogICAgICB0aGVtIGJhY2sgYXMgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQuCisJICovCisJcHVibGljIENvbXBpbGVyKAorCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LAorCQlJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3ksCisJCU1hcCBzZXR0aW5ncywKKwkJZmluYWwgSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisKKwkJLy8gY3JlYXRlIGEgcHJvYmxlbSBoYW5kbGVyIGdpdmVuIGEgaGFuZGxpbmcgcG9saWN5CisJCXRoaXMub3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOworCQkKKwkJLy8gd3JhcCByZXF1ZXN0b3IgaW4gRGVidWdSZXF1ZXN0b3IgaWYgb25lIGlzIHNwZWNpZmllZAorCQlpZihEZWJ1Z1JlcXVlc3RvciA9PSBudWxsKSB7CisJCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucmVxdWVzdG9yID0gbmV3IElDb21waWxlclJlcXVlc3RvcigpeworCQkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCByZXN1bHQpeworCQkJCQlpZiAoRGVidWdSZXF1ZXN0b3IuaXNBY3RpdmUoKSl7CisJCQkJCQlEZWJ1Z1JlcXVlc3Rvci5hY2NlcHREZWJ1Z1Jlc3VsdChyZXN1bHQpOworCQkJCQl9CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQocmVzdWx0KTsKKwkJCQl9CisJCQl9OworCQl9CisJCXRoaXMucHJvYmxlbVJlcG9ydGVyID0KKwkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIocG9saWN5LCB0aGlzLm9wdGlvbnMsIHByb2JsZW1GYWN0b3J5KTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBlbnZpcm9ubWVudCk7CisJCXRoaXMucGFyc2VyID0KKwkJCW5ldyBQYXJzZXIoCisJCQkJcHJvYmxlbVJlcG9ydGVyLCAKKwkJCQl0aGlzLm9wdGlvbnMucGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cywgCisJCQkJdGhpcy5vcHRpb25zLmFzc2VydE1vZGUpOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXIgYSBuZXcgY29tcGlsZXIgdXNpbmcgdGhlIGdpdmVuIG5hbWUgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIG9wdGlvbnMuCisJICogVGhlIGVudmlyb25tZW50IGFuZCBvcHRpb25zIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBpbGVyLgorCSAqIFdoZW4gdGhlIGNvbXBpbGVyIGlzIHJ1biwgY29tcGlsYXRpb24gcmVzdWx0cyBhcmUgc2VudCB0byB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgorCSAqCisJICogIEBwYXJhbSBlbnZpcm9ubWVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLmVudi5JTmFtZUVudmlyb25tZW50CisJICogICAgICBFbnZpcm9ubWVudCB1c2VkIGJ5IHRoZSBjb21waWxlciBpbiBvcmRlciB0byByZXNvbHZlIHR5cGUgYW5kIHBhY2thZ2UKKwkgKiAgICAgIG5hbWVzLiBUaGUgbmFtZSBlbnZpcm9ubWVudCBpbXBsZW1lbnRzIHRoZSBhY3R1YWwgY29ubmVjdGlvbiBvZiB0aGUgY29tcGlsZXIKKwkgKiAgICAgIHRvIHRoZSBvdXRzaWRlIHdvcmxkIChlLmcuIGluIGJhdGNoIG1vZGUgdGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcGVyZm9ybWluZworCSAqICAgICAgcHVyZSBmaWxlIGFjY2Vzc2VzLCByZXVzZSBwcmV2aW91cyBidWlsZCBzdGF0ZSBvciBjb25uZWN0aW9uIHRvIHJlcG9zaXRvcmllcykuCisJICogICAgICBOb3RlOiB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBhY3R1YWwgY2xhc3NwYXRoCisJICogICAgICAgICAgICBydWxlcy4KKwkgKgorCSAqICBAcGFyYW0gcG9saWN5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5JRXJyb3JIYW5kbGluZ1BvbGljeQorCSAqICAgICAgQ29uZmlndXJhYmxlIHBhcnQgZm9yIHByb2JsZW0gaGFuZGxpbmcsIGFsbG93aW5nIHRoZSBjb21waWxlciBjbGllbnQgdG8KKwkgKiAgICAgIHNwZWNpZnkgdGhlIHJ1bGVzIGZvciBoYW5kbGluZyBwcm9ibGVtcyAoc3RvcCBvbiBmaXJzdCBlcnJvciBvciBhY2N1bXVsYXRlCisJICogICAgICB0aGVtIGFsbCkgYW5kIGF0IHRoZSBzYW1lIHRpbWUgcGVyZm9ybSBzb21lIGFjdGlvbnMgc3VjaCBhcyBvcGVuaW5nIGEgZGlhbG9nCisJICogICAgICBpbiBVSSB3aGVuIGNvbXBpbGluZyBpbnRlcmFjdGl2ZWx5LgorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcworCSAqICAgICAgCisJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5JQ29tcGlsZXJSZXF1ZXN0b3IKKwkgKiAgICAgIENvbXBvbmVudCB3aGljaCB3aWxsIHJlY2VpdmUgYW5kIHBlcnNpc3QgYWxsIGNvbXBpbGF0aW9uIHJlc3VsdHMgYW5kIGlzIGludGVuZGVkCisJICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMgCisJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQKKwkgKgorCSAqICBAcGFyYW0gcHJvYmxlbUZhY3Rvcnkgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklQcm9ibGVtRmFjdG9yeQorCSAqICAgICAgRmFjdG9yeSB1c2VkIGluc2lkZSB0aGUgY29tcGlsZXIgdG8gY3JlYXRlIHByb2JsZW0gZGVzY3JpcHRvcnMuIEl0IGFsbG93cyB0aGUKKwkgKiAgICAgIGNvbXBpbGVyIGNsaWVudCB0byBzdXBwbHkgaXRzIG93biByZXByZXNlbnRhdGlvbiBvZiBjb21waWxhdGlvbiBwcm9ibGVtcyBpbgorCSAqICAgICAgb3JkZXIgdG8gYXZvaWQgb2JqZWN0IGNvbnZlcnNpb25zLiBOb3RlIHRoYXQgdGhlIGZhY3RvcnkgaXMgbm90IHN1cHBvc2VkCisJICogICAgICB0byBhY2N1bXVsYXRlIHRoZSBjcmVhdGVkIHByb2JsZW1zLCB0aGUgY29tcGlsZXIgd2lsbCBnYXRoZXIgdGhlbSBhbGwgYW5kIGhhbmQKKwkgKiAgICAgIHRoZW0gYmFjayBhcyBwYXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdC4KKwkgKglAcGFyYW0gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cyA8Y29kZT5ib29sZWFuPC9jb2RlPgorCSAqCQlUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIG9wdGltaXplIHRoZSBsaXRlcmFscyBvciBsZWF2ZSB0aGVtIGFzIHRoZXkgYXJlIGluIHRoZSBzb3VyY2UuCisJICogCQlJZiB5b3UgcHV0IHRydWUsICJIZWxsbyIgKyAiIHdvcmxkIiB3aWxsIGJlIGNvbnZlcnRlZCB0byAiSGVsbG8gd29ybGQiLgorCSAqLworCXB1YmxpYyBDb21waWxlcigKKwkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKKwkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAorCQlNYXAgc2V0dGluZ3MsCisJCWZpbmFsIElDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsCisJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKKwkJYm9vbGVhbiBwYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzKSB7CisKKwkJLy8gY3JlYXRlIGEgcHJvYmxlbSBoYW5kbGVyIGdpdmVuIGEgaGFuZGxpbmcgcG9saWN5CisJCXRoaXMub3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOworCQkKKwkJLy8gd3JhcCByZXF1ZXN0b3IgaW4gRGVidWdSZXF1ZXN0b3IgaWYgb25lIGlzIHNwZWNpZmllZAorCQlpZihEZWJ1Z1JlcXVlc3RvciA9PSBudWxsKSB7CisJCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucmVxdWVzdG9yID0gbmV3IElDb21waWxlclJlcXVlc3RvcigpeworCQkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCByZXN1bHQpeworCQkJCQlpZiAoRGVidWdSZXF1ZXN0b3IuaXNBY3RpdmUoKSl7CisJCQkJCQlEZWJ1Z1JlcXVlc3Rvci5hY2NlcHREZWJ1Z1Jlc3VsdChyZXN1bHQpOworCQkJCQl9CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQocmVzdWx0KTsKKwkJCQl9CisJCQl9OworCQl9CisJCXRoaXMucHJvYmxlbVJlcG9ydGVyID0KKwkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIocG9saWN5LCB0aGlzLm9wdGlvbnMsIHByb2JsZW1GYWN0b3J5KTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBlbnZpcm9ubWVudCk7CisJCXRoaXMucGFyc2VyID0KKwkJCW5ldyBQYXJzZXIoCisJCQkJcHJvYmxlbVJlcG9ydGVyLCAKKwkJCQlwYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzLCAKKwkJCQl0aGlzLm9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJfQorCQorCS8qKgorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCWxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYW4gYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0IGludG8gdGhlIGxvb3AKKwkgKiAgLT4gIGJ1aWxkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb25zLCB0aGVpciBiaW5kaW5ncyBhbmQgcmVjb3JkIHRoZWlyIHJlc3VsdHMuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgeworCQkvLyBTd2l0Y2ggdGhlIGN1cnJlbnQgcG9saWN5IGFuZCBjb21waWxhdGlvbiByZXN1bHQgZm9yIHRoaXMgdW5pdCB0byB0aGUgcmVxdWVzdGVkIG9uZS4KKwkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9CisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgdG90YWxVbml0cywgdG90YWxVbml0cywgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCXRyeSB7CisJCQkvLyBkaWV0IHBhcnNpbmcgZm9yIGxhcmdlIGNvbGxlY3Rpb24gb2YgdW5pdAorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdDsKKwkJCWlmICh0b3RhbFVuaXRzIDwgcGFyc2VUaHJlc2hvbGQpIHsKKwkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXQsIHVuaXRSZXN1bHQpOworCQkJfSBlbHNlIHsKKwkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKKwkJCX0KKworCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJVXRpbC5iaW5kKAorCQkJCQkJImNvbXBpbGF0aW9uLnJlcXVlc3QiICwgLy8kTk9OLU5MUy0xJAorCQkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCQlTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSksCisJCQkJCQkJU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cyArIDEpLAorCQkJCQkJCW5ldyBTdHJpbmcoc291cmNlVW5pdC5nZXRGaWxlTmFtZSgpKX0pKTsKKwkJCX0KKworCQkJLy8gaW5pdGlhbCB0eXBlIGJpbmRpbmcgY3JlYXRpb24KKwkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOworCQkJdGhpcy5hZGRDb21waWxhdGlvblVuaXQoc291cmNlVW5pdCwgcGFyc2VkVW5pdCk7CisKKwkJCS8vIGJpbmRpbmcgcmVzb2x1dGlvbgorCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJCS8vIGF0IHRoaXMgcG9pbnQsIGN1cnJlbnRDb21waWxhdGlvblVuaXRSZXN1bHQgbWF5IG5vdCBiZSBzb3VyY2VVbml0LCBidXQgc29tZSBvdGhlcgorCQkJLy8gb25lIHJlcXVlc3RlZCBmdXJ0aGVyIGFsb25nIHRvIHJlc29sdmUgc291cmNlVW5pdC4KKwkJCWlmICh1bml0UmVzdWx0LmNvbXBpbGF0aW9uVW5pdCA9PSBzb3VyY2VVbml0KSB7IC8vIG9ubHkgcmVwb3J0IG9uY2UKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXRSZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgZTsgLy8gd2FudCB0byBhYm9ydCBlbmNsb3NpbmcgcmVxdWVzdCB0byBjb21waWxlCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGQgYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwkJcHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAorCQkJVXRpbC5iaW5kKAorCQkJCSJhYm9ydC5hZ2FpbnN0U291cmNlTW9kZWwgIiAsIC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcudmFsdWVPZihzb3VyY2VUeXBlc1swXS5nZXROYW1lKCkpLAorCQkJCVN0cmluZy52YWx1ZU9mKHNvdXJjZVR5cGVzWzBdLmdldEZpbGVOYW1lKCkpKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsYXRpb25Vbml0KAorCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQpIHsKKworCQkvLyBhcHBlbmQgdGhlIHVuaXQgdG8gdGhlIGxpc3Qgb2Ygb25lcyB0byBwcm9jZXNzIGxhdGVyIG9uCisJCWludCBzaXplID0gdW5pdHNUb1Byb2Nlc3MubGVuZ3RoOworCQlpZiAodG90YWxVbml0cyA9PSBzaXplKQorCQkJLy8gd2hlbiBncm93aW5nIHJlcG9zaXRpb24gdW5pdHMgc3RhcnRpbmcgYXQgcG9zaXRpb24gMAorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl1bml0c1RvUHJvY2VzcywKKwkJCQkwLAorCQkJCSh1bml0c1RvUHJvY2VzcyA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltzaXplICogMl0pLAorCQkJCTAsCisJCQkJdG90YWxVbml0cyk7CisJCXVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMrK10gPSBwYXJzZWRVbml0OworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgaW5pdGlhbCBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgaW50byB0aGUgbG9vcAorCSAqICAtPiAgYnVpbGQgY29tcGlsYXRpb24gdW5pdCBkZWNsYXJhdGlvbnMsIHRoZWlyIGJpbmRpbmdzIGFuZCByZWNvcmQgdGhlaXIgcmVzdWx0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBiZWdpblRvQ29tcGlsZShJQ29tcGlsYXRpb25Vbml0W10gc291cmNlVW5pdHMpIHsKKwkJaW50IG1heFVuaXRzID0gc291cmNlVW5pdHMubGVuZ3RoOworCQl0b3RhbFVuaXRzID0gMDsKKwkJdW5pdHNUb1Byb2Nlc3MgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bbWF4VW5pdHNdOworCisJCS8vIFN3aXRjaCB0aGUgY3VycmVudCBwb2xpY3kgYW5kIGNvbXBpbGF0aW9uIHJlc3VsdCBmb3IgdGhpcyB1bml0IHRvIHRoZSByZXF1ZXN0ZWQgb25lLgorCQlmb3IgKGludCBpID0gMDsgaSA8IG1heFVuaXRzOyBpKyspIHsKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7CisJCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0KKwkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdHNbaV0sIGksIG1heFVuaXRzLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCXRyeSB7CisJCQkJLy8gZGlldCBwYXJzaW5nIGZvciBsYXJnZSBjb2xsZWN0aW9uIG9mIHVuaXRzCisJCQkJaWYgKHRvdGFsVW5pdHMgPCBwYXJzZVRocmVzaG9sZCkgeworCQkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXRzW2ldLCB1bml0UmVzdWx0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0c1tpXSwgdW5pdFJlc3VsdCk7CisJCQkJfQorCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCQkJVXRpbC5iaW5kKAorCQkJCQkJCSJjb21waWxhdGlvbi5yZXF1ZXN0IiAsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJCQlTdHJpbmcudmFsdWVPZihpICsgMSksCisJCQkJCQkJCVN0cmluZy52YWx1ZU9mKG1heFVuaXRzKSwKKwkJCQkJCQkJbmV3IFN0cmluZyhzb3VyY2VVbml0c1tpXS5nZXRGaWxlTmFtZSgpKX0pKTsKKwkJCQl9CisJCQkJLy8gaW5pdGlhbCB0eXBlIGJpbmRpbmcgY3JlYXRpb24KKwkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsKKwkJCQl0aGlzLmFkZENvbXBpbGF0aW9uVW5pdChzb3VyY2VVbml0c1tpXSwgcGFyc2VkVW5pdCk7CisJCQkJLy99IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7CisJCQkJLy8JcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0UmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXNvdXJjZVVuaXRzW2ldID0gbnVsbDsgLy8gbm8gbG9uZ2VyIGhvbGQgb250byB0aGUgdW5pdAorCQkJfQorCQl9CisJCS8vIGJpbmRpbmcgcmVzb2x1dGlvbgorCQlsb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncygpOworCX0KKworCS8qKgorCSAqIEdlbmVyYWwgQVBJCisJICogLT4gY29tcGlsZSBlYWNoIG9mIHN1cHBsaWVkIGZpbGVzCisJICogLT4gcmVjb21waWxlIGFueSByZXF1aXJlZCB0eXBlcyBmb3Igd2hpY2ggd2UgaGF2ZSBhbiBpbmNvbXBsZXRlIHByaW5jaXBsZSBzdHJ1Y3R1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21waWxlKElDb21waWxhdGlvblVuaXRbXSBzb3VyY2VVbml0cykgeworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKKwkJaW50IGkgPSAwOworCQl0cnkgeworCQkJLy8gYnVpbGQgYW5kIHJlY29yZCBwYXJzZWQgdW5pdHMKKworCQkJYmVnaW5Ub0NvbXBpbGUoc291cmNlVW5pdHMpOworCisJCQkvLyBwcm9jZXNzIGFsbCB1bml0cyAoc29tZSBtb3JlIGNvdWxkIGJlIGluamVjdGVkIGluIHRoZSBsb29wIGJ5IHRoZSBsb29rdXAgZW52aXJvbm1lbnQpCisJCQlmb3IgKDsgaSA8IHRvdGFsVW5pdHM7IGkrKykgeworCQkJCXVuaXQgPSB1bml0c1RvUHJvY2Vzc1tpXTsKKwkJCQl0cnkgeworCQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCQkJCVV0aWwuYmluZCgKKwkJCQkJCQkJImNvbXBpbGF0aW9uLnByb2Nlc3MiICwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoaSArIDEpLAorCQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cyksCisJCQkJCQkJCQluZXcgU3RyaW5nKHVuaXRzVG9Qcm9jZXNzW2ldLmdldEZpbGVOYW1lKCkpfSkpOworCQkJCQlwcm9jZXNzKHVuaXQsIGkpOworCQkJCX0gZmluYWxseSB7CisJCQkJCS8vIGNsZWFudXAgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKKwkJCQkJdW5pdC5jbGVhblVwKCk7CisJCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJjb21waWxhdGlvbi5kb25lIiwgLy8kTk9OLU5MUy0xJAorCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJU3RyaW5nLnZhbHVlT2YoaSArIDEpLAorCQkJCQkJU3RyaW5nLnZhbHVlT2YodG90YWxVbml0cyksCisJCQkJCQluZXcgU3RyaW5nKHVuaXRzVG9Qcm9jZXNzW2ldLmdldEZpbGVOYW1lKCkpfSkpOworCQkJCX0KKwkJCQl1bml0c1RvUHJvY2Vzc1tpXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uCisJCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdCh1bml0LmNvbXBpbGF0aW9uUmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQl9CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0KTsKKwkJfSBjYXRjaCAoRXJyb3IgZSkgeworCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihlLCB1bml0LCBudWxsKTsKKwkJCXRocm93IGU7IC8vIHJldGhyb3cKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOworCQkJdGhyb3cgZTsgLy8gcmV0aHJvdworCQl9IGZpbmFsbHkgeworCQkJdGhpcy5yZXNldCgpOworCQl9CisJCWlmIChvcHRpb25zLnZlcmJvc2UpIHsKKwkJCWlmICh0b3RhbFVuaXRzID4gMSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bml0cyIgLCBTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzKSkpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJVXRpbC5iaW5kKCJjb21waWxhdGlvbi51bml0IiAsIFN0cmluZy52YWx1ZU9mKHRvdGFsVW5pdHMpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGdldE1ldGhvZEJvZGllcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBpbnQgcGxhY2UpIHsKKwkJLy9maWxsIHRoZSBtZXRob2RzIGJvZGllcyBpbiBvcmRlciBmb3IgdGhlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkCisKKwkJaWYgKHVuaXQuaWdub3JlTWV0aG9kQm9kaWVzKSB7CisJCQl1bml0Lmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJCXJldHVybjsKKwkJCS8vIGlmIGluaXRpYWwgZGlldCBwYXJzZSBkaWQgbm90IHdvcmssIG5vIG5lZWQgdG8gZGlnIGludG8gbWV0aG9kIGJvZGllcy4KKwkJfQorCisJCWlmIChwbGFjZSA8IHBhcnNlVGhyZXNob2xkKQorCQkJcmV0dXJuOyAvL3dvcmsgYWxyZWFkeSBkb25lIC4uLgorCisJCS8vcmVhbCBwYXJzZSBvZiB0aGUgbWV0aG9kLi4uLgorCQlwYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2UoCisJCQl1bml0LmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRDb250ZW50cygpKTsKKwkJaWYgKHVuaXQudHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IHVuaXQudHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQkJdW5pdC50eXBlc1tpXS5wYXJzZU1ldGhvZChwYXJzZXIsIHVuaXQpOworCQl9CisJfQorCisJLyoKKwkgKiBDb21waWxlciBjcmFzaCByZWNvdmVyeSBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgcnVudGltZSBleGNlcHRpb25zCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oCisJCVRocm93YWJsZSBpbnRlcm5hbEV4Y2VwdGlvbiwKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwKKwkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KSB7CisKKwkJLyogZHVtcCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBjb25zb2xlICovCisJCWludGVybmFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworCisJCS8qIGZpbmQgYSBjb21waWxhdGlvbiByZXN1bHQgKi8KKwkJaWYgKCh1bml0ICE9IG51bGwpKSAvLyBiYXNpbmcgcmVzdWx0IHVwb24gdGhlIGN1cnJlbnQgdW5pdCBpZiBhdmFpbGFibGUKKwkJCXJlc3VsdCA9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQ7IC8vIGN1cnJlbnQgdW5pdCBiZWluZyBwcm9jZXNzZWQgPworCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCkgJiYgKHRvdGFsVW5pdHMgPiAwKSkKKwkJCXJlc3VsdCA9IHVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsKKwkJLy8gbGFzdCB1bml0IGluIGJlZ2luVG9Db21waWxlID8KKworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCS8qIGNyZWF0ZSBhbmQgcmVjb3JkIGEgY29tcGlsYXRpb24gcHJvYmxlbSAqLworCQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCQkJaW50ZXJuYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gc3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpOworCisJCQlyZXN1bHQKKwkJCQkucmVjb3JkKAorCQkJCQlwcm9ibGVtUmVwb3J0ZXIKKwkJCQkJLmNyZWF0ZVByb2JsZW0oCisJCQkJCQlyZXN1bHQuZ2V0RmlsZU5hbWUoKSwKKwkJCQkJCUlQcm9ibGVtLlVuY2xhc3NpZmllZCwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQkJVXRpbC5iaW5kKCJjb21waWxhdGlvbi5pbnRlcm5hbEVycm9yIiApIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyAiXG4iICAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgYnVmZmVyLnRvU3RyaW5nKCl9LAorCQkJCQkJRXJyb3IsIC8vIHNldmVyaXR5CisJCQkJCQkwLCAvLyBzb3VyY2Ugc3RhcnQKKwkJCQkJCTAsIC8vIHNvdXJjZSBlbmQKKwkJCQkJCTAsIC8vIGxpbmUgbnVtYmVyCQkKKwkJCQkJCXVuaXQsCisJCQkJCQlyZXN1bHQpLAorCQkJCQl1bml0KTsKKworCQkJLyogaGFuZCBiYWNrIHRoZSBjb21waWxhdGlvbiByZXN1bHQgKi8KKwkJCWlmICghcmVzdWx0Lmhhc0JlZW5BY2NlcHRlZCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRSZXN1bHQocmVzdWx0LnRhZ0FzQWNjZXB0ZWQoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENvbXBpbGVyIHJlY292ZXJ5IGluIGNhc2Ugb2YgaW50ZXJuYWwgQWJvcnRDb21waWxhdGlvbiBldmVudAorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludGVybmFsRXhjZXB0aW9uKAorCQlBYm9ydENvbXBpbGF0aW9uIGFib3J0RXhjZXB0aW9uLAorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisKKwkJLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIFNpbGVudEFib3J0OiBzaWxlbnRseSBjYW5jZWxsaW5nIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzICovCisJCWlmIChhYm9ydEV4Y2VwdGlvbi5pc1NpbGVudCkgeworCQkJaWYgKGFib3J0RXhjZXB0aW9uLnNpbGVudEV4Y2VwdGlvbiA9PSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBhYm9ydEV4Y2VwdGlvbi5zaWxlbnRFeGNlcHRpb247CisJCQl9CisJCX0KKworCQkvKiB1bmNvbW1lbnQgZm9sbG93aW5nIGxpbmUgdG8gc2VlIHdoZXJlIHRoZSBhYm9ydCBjYW1lIGZyb20gKi8KKwkJLy8gYWJvcnRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7IAorCisJCS8vIEV4Y2VwdGlvbiBtYXkgdGVsbCB3aGljaCBjb21waWxhdGlvbiByZXN1bHQgaXQgaXMgcmVsYXRlZCwgYW5kIHdoaWNoIHByb2JsZW0gY2F1c2VkIGl0CisJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IGFib3J0RXhjZXB0aW9uLmNvbXBpbGF0aW9uUmVzdWx0OworCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdCAhPSBudWxsKSkKKwkJCXJlc3VsdCA9IHVuaXQuY29tcGlsYXRpb25SZXN1bHQ7IC8vIGN1cnJlbnQgdW5pdCBiZWluZyBwcm9jZXNzZWQgPworCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAodW5pdHNUb1Byb2Nlc3MgIT0gbnVsbCkgJiYgKHRvdGFsVW5pdHMgPiAwKSkKKwkJCXJlc3VsdCA9IHVuaXRzVG9Qcm9jZXNzW3RvdGFsVW5pdHMgLSAxXS5jb21waWxhdGlvblJlc3VsdDsKKwkJLy8gbGFzdCB1bml0IGluIGJlZ2luVG9Db21waWxlID8KKwkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaGFzQmVlbkFjY2VwdGVkKSB7CisJCQkvKiBkaXN0YW50IHByb2JsZW0gd2hpY2ggY291bGQgbm90IGJlIHJlcG9ydGVkIGJhY2sgdGhlcmUgKi8KKwkJCWlmIChhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQgIT0gMCkgeworCQkJCXJlc3VsdAorCQkJCQkucmVjb3JkKAorCQkJCQkJcHJvYmxlbVJlcG9ydGVyCisJCQkJCQkuY3JlYXRlUHJvYmxlbSgKKwkJCQkJCQlyZXN1bHQuZ2V0RmlsZU5hbWUoKSwKKwkJCQkJCQlhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQsCisJCQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJCQlFcnJvciwgLy8gc2V2ZXJpdHkKKwkJCQkJCQkwLCAvLyBzb3VyY2Ugc3RhcnQKKwkJCQkJCQkwLCAvLyBzb3VyY2UgZW5kCisJCQkJCQkJMCwgLy8gbGluZSBudW1iZXIJCQorCQkJCQkJCXVuaXQsCisJCQkJCQkJcmVzdWx0KSwKKwkJCQkJCXVuaXQpOwkJCQkKKwkJCX0gZWxzZSB7CisJCQkJLyogZGlzdGFudCBpbnRlcm5hbCBleGNlcHRpb24gd2hpY2ggY291bGQgbm90IGJlIHJlcG9ydGVkIGJhY2sgdGhlcmUgKi8KKwkJCQlpZiAoYWJvcnRFeGNlcHRpb24uZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCQkJdGhpcy5oYW5kbGVJbnRlcm5hbEV4Y2VwdGlvbihhYm9ydEV4Y2VwdGlvbi5leGNlcHRpb24sIG51bGwsIHJlc3VsdCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvKiBoYW5kIGJhY2sgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdCAqLworCQkJaWYgKCFyZXN1bHQuaGFzQmVlbkFjY2VwdGVkKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdFJlc3VsdChyZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQlpZiAoYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkICE9IDApeyAKKwkJCQlJUHJvYmxlbSBwcm9ibGVtID0KKwkJCQkJcHJvYmxlbVJlcG9ydGVyLmNyZWF0ZVByb2JsZW0oCisJCQkJCQkiPz8/Ii50b0NoYXJBcnJheSgpLAorCQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUlkLCAKKwkJCQkJCWFib3J0RXhjZXB0aW9uLnByb2JsZW1Bcmd1bWVudHMsIAorCQkJCQkJRXJyb3IsIC8vIHNldmVyaXR5CisJCQkJCQkwLCAvLyBzb3VyY2Ugc3RhcnQKKwkJCQkJCTAsIC8vIHNvdXJjZSBlbmQKKwkJCQkJCTApOyAvLyBsaW5lIG51bWJlcgorCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9ibGVtLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQkqLworCQkJYWJvcnRFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIGEgY29tcGlsYXRpb24gdW5pdCBhbHJlYWR5IHBhcnNlZCBhbmQgYnVpbGQuCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IGkpIHsKKworCQlnZXRNZXRob2RCb2RpZXModW5pdCwgaSk7CisKKwkJLy8gZmF1bHQgaW4gZmllbGRzICYgbWV0aG9kcworCQlpZiAodW5pdC5zY29wZSAhPSBudWxsKQorCQkJdW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKKworCQkvLyB2ZXJpZnkgaW5oZXJpdGVkIG1ldGhvZHMKKwkJaWYgKHVuaXQuc2NvcGUgIT0gbnVsbCkKKwkJCXVuaXQuc2NvcGUudmVyaWZ5TWV0aG9kcyhsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsKKworCQkvLyB0eXBlIGNoZWNraW5nCisJCXVuaXQucmVzb2x2ZSgpOworCisJCS8vIGZsb3cgYW5hbHlzaXMKKwkJdW5pdC5hbmFseXNlQ29kZSgpOworCisJCS8vIGNvZGUgZ2VuZXJhdGlvbgorCQl1bml0LmdlbmVyYXRlQ29kZSgpOworCisJCS8vIHJlZmVyZW5jZSBpbmZvCisJCWlmIChvcHRpb25zLnByb2R1Y2VSZWZlcmVuY2VJbmZvICYmIHVuaXQuc2NvcGUgIT0gbnVsbCkKKwkJCXVuaXQuc2NvcGUuc3RvcmVEZXBlbmRlbmN5SW5mbygpOworCisJCS8vIHJlZnJlc2ggdGhlIHRvdGFsIG51bWJlciBvZiB1bml0cyBrbm93biBhdCB0aGlzIHN0YWdlCisJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQudG90YWxVbml0c0tub3duID0gdG90YWxVbml0czsKKwl9CisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWxvb2t1cEVudmlyb25tZW50LnJlc2V0KCk7CisJCXBhcnNlci5zY2FubmVyLnNvdXJjZSA9IG51bGw7CisJCXVuaXRzVG9Qcm9jZXNzID0gbnVsbDsKKwkJaWYgKERlYnVnUmVxdWVzdG9yICE9IG51bGwpIERlYnVnUmVxdWVzdG9yLnJlc2V0KCk7CisJfQorCisJLyoqCisJICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmUKKwkgKi8KKwlwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVzb2x2ZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHsKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBidWlsZCBhbmQgcmVjb3JkIHBhcnNlZCB1bml0cworCQkJcGFyc2VUaHJlc2hvbGQgPSAwOyAvLyB3aWxsIHJlcXVlc3QgYSBmdWxsIHBhcnNlCisJCQliZWdpblRvQ29tcGlsZShuZXcgSUNvbXBpbGF0aW9uVW5pdFtdIHsgc291cmNlVW5pdCB9KTsKKwkJCS8vIHByb2Nlc3MgYWxsIHVuaXRzIChzb21lIG1vcmUgY291bGQgYmUgaW5qZWN0ZWQgaW4gdGhlIGxvb3AgYnkgdGhlIGxvb2t1cCBlbnZpcm9ubWVudCkKKwkJCXVuaXQgPSB1bml0c1RvUHJvY2Vzc1swXTsKKwkJCWdldE1ldGhvZEJvZGllcyh1bml0LCAwKTsKKwkJCWlmICh1bml0LnNjb3BlICE9IG51bGwpIHsKKwkJCQkvLyBmYXVsdCBpbiBmaWVsZHMgJiBtZXRob2RzCisJCQkJdW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKKwkJCQkvLyB0eXBlIGNoZWNraW5nCisJCQkJdW5pdC5yZXNvbHZlKCk7CisJCQl9CisJCQl1bml0c1RvUHJvY2Vzc1swXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uCisJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXQuY29tcGlsYXRpb25SZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKKwkJCXJldHVybiB1bml0OworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCk7CisJCQlyZXR1cm4gdW5pdCA9PSBudWxsID8gdW5pdHNUb1Byb2Nlc3NbMF0gOiB1bml0OworCQl9IGNhdGNoIChFcnJvciBlKSB7CisJCQl0aGlzLmhhbmRsZUludGVybmFsRXhjZXB0aW9uKGUsIHVuaXQsIG51bGwpOworCQkJdGhyb3cgZTsgLy8gcmV0aHJvdworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCXRoaXMuaGFuZGxlSW50ZXJuYWxFeGNlcHRpb24oZSwgdW5pdCwgbnVsbCk7CisJCQl0aHJvdyBlOyAvLyByZXRocm93CisJCX0gZmluYWxseSB7CisJCQkvLyBObyByZXNldCBpcyBwZXJmb3JtZWQgdGhlcmUgYW55bW9yZSBzaW5jZSwKKwkJCS8vIHdpdGhpbiB0aGUgQ29kZUFzc2lzdCAob3IgcmVsYXRlZCB0b29scyksCisJCQkvLyB0aGUgY29tcGlsZXIgbWF5IGJlIGNhbGxlZCAqYWZ0ZXIqIGEgY2FsbAorCQkJLy8gdG8gdGhpcyByZXNvbHZlKC4uLikgbWV0aG9kLiBBbmQgc3VjaCBhIGNhbGwKKwkJCS8vIG5lZWRzIHRvIGhhdmUgYSBjb21waWxlciB3aXRoIGEgbm9uLWVtcHR5CisJCQkvLyBlbnZpcm9ubWVudC4KKwkJCS8vIHRoaXMucmVzZXQoKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29uZmlndXJhYmxlT3B0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29uZmlndXJhYmxlT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNzRkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCisvKioKKyAqIEdlbmVyaWMgb3B0aW9uIGRlc2NyaXB0aW9uLCB3aGljaCBjYW4gYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBmcm9tIHRoZQorICogY29tcG9uZW50IGl0IGJlbG9uZ3MgdG8uCisgKiAKKyAqIEBkZXByZWNhdGVkIGJhY2twb3J0IDEuMCBpbnRlcm5hbCBmdW5jdGlvbmFsaXR5CisgKi8KKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlT3B0aW9uIHsKKwlwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lOworCXByaXZhdGUgU3RyaW5nIG9wdGlvbk5hbWU7CisJcHJpdmF0ZSBpbnQgaWQ7CisKKwlwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByaXZhdGUgaW50IGN1cnJlbnRWYWx1ZUluZGV4OworCXByaXZhdGUgaW50IGRlZmF1bHRWYWx1ZUluZGV4OworCXByaXZhdGUgU3RyaW5nW10gcG9zc2libGVWYWx1ZXM7CisKKwkvLyBzcGVjaWFsIHZhbHVlIGZvciA8cG9zc2libGVWYWx1ZXM+IGluZGljYXRpbmcgdGhhdCAKKwkvLyB0aGUgPGN1cnJlbnRWYWx1ZUluZGV4PiBpcyB0aGUgYWN0dWFsIHZhbHVlCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBOb0Rpc2NyZXRlVmFsdWUgPSB7fTsgCisvKioKKyAqIElOVEVSTkFMIFVTRSBPTkxZCisgKgorICogSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFjY29yZGluZyB0byBhIHNwZWNpZmljIGxvY2FsZQorICoKKyAqIEBwYXJhbSBsb2MgamF2YS51dGlsLkxvY2FsZQorICovCitwdWJsaWMgQ29uZmlndXJhYmxlT3B0aW9uKAorCVN0cmluZyBjb21wb25lbnROYW1lLCAKKwlTdHJpbmcgb3B0aW9uTmFtZSwgCisJTG9jYWxlIGxvYywgCisJaW50IGN1cnJlbnRWYWx1ZUluZGV4KSB7CisKKwl0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOworCXRoaXMub3B0aW9uTmFtZSA9IG9wdGlvbk5hbWU7CisJdGhpcy5jdXJyZW50VmFsdWVJbmRleCA9IGN1cnJlbnRWYWx1ZUluZGV4OworCQkKKwlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IG51bGw7CisJdHJ5IHsKKwkJU3RyaW5nIGxvY2F0aW9uID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5sYXN0SW5kZXhPZignLicpKTsKKwkJcmVzb3VyY2UgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobG9jYXRpb24gKyAiLk9wdGlvbnMiLCBsb2MpOyAvLyROT04tTkxTLTEkCisJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJY2F0ZWdvcnkgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIiArIGNvbXBvbmVudE5hbWUgKyAiIG9wdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbmFtZSA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWRlc2NyaXB0aW9uID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIgKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXBvc3NpYmxlVmFsdWVzID0gbmV3IFN0cmluZ1swXTsKKwkJaWQgPSAtMTsKKwl9CisJaWYgKHJlc291cmNlID09IG51bGwpIHJldHVybjsKKwl0cnkgeworCQlpZCA9IEludGVnZXIucGFyc2VJbnQocmVzb3VyY2UuZ2V0U3RyaW5nKG9wdGlvbk5hbWUgKyAiLm51bWJlciIpKTsgLy8kTk9OLU5MUy0xJAorCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCWlkID0gLTE7CisJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJaWQgPSAtMTsKKwl9CisJdHJ5IHsKKwkJY2F0ZWdvcnkgPSByZXNvdXJjZS5nZXRTdHJpbmcob3B0aW9uTmFtZSArICIuY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAorCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCWNhdGVnb3J5ID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIgKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCXRyeSB7CisJCW5hbWUgPSByZXNvdXJjZS5nZXRTdHJpbmcob3B0aW9uTmFtZSArICIubmFtZSIpOyAvLyROT04tTkxTLTEkCisJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJbmFtZSA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCXRyeSB7CisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc291cmNlLmdldFN0cmluZyhvcHRpb25OYW1lICsgIi5wb3NzaWJsZVZhbHVlcyIpLCAifCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaW50IG51bWJlck9mVmFsdWVzID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOworCQlpZihudW1iZXJPZlZhbHVlcyA9PSAtMSl7CisJCQlwb3NzaWJsZVZhbHVlcyA9IE5vRGlzY3JldGVWYWx1ZTsKKwkJfSBlbHNlIHsKKwkJCXBvc3NpYmxlVmFsdWVzID0gbmV3IFN0cmluZ1tudW1iZXJPZlZhbHVlc107CisJCQlpbnQgaW5kZXggPSAwOworCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlwb3NzaWJsZVZhbHVlc1tpbmRleF0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJaW5kZXgrKzsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCXBvc3NpYmxlVmFsdWVzID0gbmV3IFN0cmluZ1swXTsKKwl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKwkJcG9zc2libGVWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOworCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCXBvc3NpYmxlVmFsdWVzID0gbmV3IFN0cmluZ1swXTsKKwl9CisJdHJ5IHsKKwkJZGVzY3JpcHRpb24gPSByZXNvdXJjZS5nZXRTdHJpbmcob3B0aW9uTmFtZSArICIuZGVzY3JpcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKKwl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQlkZXNjcmlwdGlvbiA9ICJNaXNzaW5nIHJlc3NvdXJjZXMgZW50cmllcyBmb3IiKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorfQorLyoqCisgKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgY2F0ZWdvcnkgb2YgdGhlIHJlY2VpdmVyLgorICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7CisJcmV0dXJuIGNhdGVnb3J5OworfQorLyoqCisgKiBSZXR1cm4gYSBTdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21wb25lbnQgb3duZXIgKHR5cGljYWxseSB0aGUgcXVhbGlmaWVkCisgKgl0eXBlIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGl0IGNvcnJlc3BvbmRzIHRvKS4KKyAqCisgKiBlLmcuICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLkNvbXBpbGVyIgorICoKKyAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworICovCitwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKSB7CisJcmV0dXJuIGNvbXBvbmVudE5hbWU7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIG9wdGlvbi4KKyAqCisgKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlCisgKiBhY3R1YWwgdmFsdWUgKGUuZy4gbWF4IGxpbmUgbGVuZ2h0IHNldCB0byA4MCkuCisgKgorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBnZXRDdXJyZW50VmFsdWVJbmRleCgpIHsKKwlyZXR1cm4gY3VycmVudFZhbHVlSW5kZXg7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIG9wdGlvbi4KKyAqCisgKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlCisgKiBhY3R1YWwgdmFsdWUgKGUuZy4gbWF4IGxpbmUgbGVuZ2h0IHNldCB0byA4MCkuCisgKgorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBnZXREZWZhdWx0VmFsdWVJbmRleCgpIHsKKwlyZXR1cm4gZGVmYXVsdFZhbHVlSW5kZXg7Cit9CisvKioKKyAqIFJldHVybiBhbiBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgorICoKKyAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworICovCitwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCXJldHVybiBkZXNjcmlwdGlvbjsKK30KKy8qKgorICogSW50ZXJuYWwgSUQgd2hpY2ggYWxsb3dzIHRoZSBjb25maWd1cmFibGUgY29tcG9uZW50IHRvIGlkZW50aWZ5IHRoaXMgcGFydGljdWxhciBvcHRpb24uCisgKgorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBnZXRJRCgpIHsKKwlyZXR1cm4gaWQ7Cit9CisvKioKKyAqIFJldHVybiBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoZSByZWNlaXZlci4KKyAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7Cit9CisvKioKKyAqIFJldHVybiBhbiBhcnJheSBvZiBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsb2NhbGl6ZWQgcG9zc2libGUgdmFsdWVzIG9mIHRoZSByZWNlaXZlci4KKyAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCisgKi8KK3B1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcygpIHsKKwlyZXR1cm4gcG9zc2libGVWYWx1ZXM7Cit9CisvKioKKyAqIENoYW5nZSB0aGUgaW5kZXggKGluIHBvc3NpYmxlVmFsdWVzIGFycmF5KSBvZiB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIG9wdGlvbi4KKyAqCisgKiBJbiBjYXNlIHRoZSBzZXQgb2YgcG9zc2libGVWYWx1ZXMgaXMgTm9EaXNjcmV0ZVZhbHVlLCB0aGVuIHRoaXMgaW5kZXggaXMgdGhlCisgKiBhY3R1YWwgdmFsdWUgKGUuZy4gbWF4IGxpbmUgbGVuZ2h0IHNldCB0byA4MCkuCisgKgorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIHZvaWQgc2V0VmFsdWVJbmRleChpbnQgbmV3SW5kZXgpIHsKKwljdXJyZW50VmFsdWVJbmRleCA9IG5ld0luZGV4OworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJ1ZmZlci5hcHBlbmQoIkNvbmZpZ3VyYWJsZSBvcHRpb24gZm9yICIpOyAvLyROT04tTkxTLTEkIAorCWJ1ZmZlci5hcHBlbmQodGhpcy5jb21wb25lbnROYW1lKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgCisJYnVmZmVyLmFwcGVuZCgiLSBjYXRlZ29yeToJCQkiKS5hcHBlbmQodGhpcy5jYXRlZ29yeSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlidWZmZXIuYXBwZW5kKCItIG5hbWU6CQkJCSIpLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyogZGlzcGxheSBjdXJyZW50IHZhbHVlICovCisJYnVmZmVyLmFwcGVuZCgiLSBjdXJyZW50IHZhbHVlOgkiKTsgLy8kTk9OLU5MUy0xJCAKKwlpZiAocG9zc2libGVWYWx1ZXMgPT0gTm9EaXNjcmV0ZVZhbHVlKXsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmN1cnJlbnRWYWx1ZUluZGV4KTsKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKHRoaXMucG9zc2libGVWYWx1ZXNbdGhpcy5jdXJyZW50VmFsdWVJbmRleF0pOworCX0KKwlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIAorCQorCS8qIGRpc3BsYXkgcG9zc2libGUgdmFsdWVzICovCisJaWYgKHBvc3NpYmxlVmFsdWVzICE9IE5vRGlzY3JldGVWYWx1ZSl7CisJCWJ1ZmZlci5hcHBlbmQoIi0gcG9zc2libGUgdmFsdWVzOglbIik7IC8vJE5PTi1OTFMtMSQgCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwb3NzaWJsZVZhbHVlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGkgIT0gMCkKKwkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkIAorCQkJYnVmZmVyLmFwcGVuZChwb3NzaWJsZVZhbHVlc1tpXSk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiXVxuIik7IC8vJE5PTi1OTFMtMSQgCisJCWJ1ZmZlci5hcHBlbmQoIi0gY3Vyci4gdmFsLiBpbmRleDoJIikuYXBwZW5kKGN1cnJlbnRWYWx1ZUluZGV4KS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwlidWZmZXIuYXBwZW5kKCItIGRlc2NyaXB0aW9uOgkJIikuYXBwZW5kKGRlc2NyaXB0aW9uKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKwkvKioKKwkgKiBHZXRzIHRoZSBvcHRpb25OYW1lLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIG9wdGlvbk5hbWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMDI4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcyB7CisgCisvKgorICogQWNjdW11bGF0ZSBhbGwgcHJvYmxlbXMsIHRoZW4gZXhpdCB3aXRob3V0IHByb2NlZWRpbmcuCisgKgorICogVHlwaWNhbGx5LCB0aGUgI3Byb2NlZWRXaXRoUHJvYmxlbXMoUHJvYmxlbVtdKSBzaG91bGQKKyAqIHNob3cgdGhlIHByb2JsZW1zLgorICoKKyAqLworcHVibGljIHN0YXRpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBleGl0QWZ0ZXJBbGxQcm9ibGVtcygpIHsKKwlyZXR1cm4gbmV3IElFcnJvckhhbmRsaW5nUG9saWN5KCkgeworCQlwdWJsaWMgYm9vbGVhbiBzdG9wT25GaXJzdEVycm9yKCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXB1YmxpYyBib29sZWFuIHByb2NlZWRPbkVycm9ycygpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfTsKK30KKy8qCisgKiBFeGl0IHdpdGhvdXQgcHJvY2VlZGluZyBvbiB0aGUgZmlyc3QgcHJvYmxlbSB3aWNoIGFwcGVhcnMKKyAqIHRvIGJlIGFuIGVycm9yLgorICoKKyAqLworcHVibGljIHN0YXRpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBleGl0T25GaXJzdEVycm9yKCkgeworCXJldHVybiBuZXcgSUVycm9ySGFuZGxpbmdQb2xpY3koKSB7CisJCXB1YmxpYyBib29sZWFuIHN0b3BPbkZpcnN0RXJyb3IoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBwcm9jZWVkT25FcnJvcnMoKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX07Cit9CisvKgorICogUHJvY2VlZCBvbiB0aGUgZmlyc3QgZXJyb3IgbWV0LgorICoKKyAqLworcHVibGljIHN0YXRpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBwcm9jZWVkT25GaXJzdEVycm9yKCkgeworCXJldHVybiBuZXcgSUVycm9ySGFuZGxpbmdQb2xpY3koKSB7CisJCXB1YmxpYyBib29sZWFuIHN0b3BPbkZpcnN0RXJyb3IoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBwcm9jZWVkT25FcnJvcnMoKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfTsKK30KKy8qCisgKiBBY2N1bXVsYXRlIGFsbCBwcm9ibGVtcywgdGhlbiBwcm9jZWVkIHdpdGggdGhlbS4KKyAqCisgKi8KK3B1YmxpYyBzdGF0aWMgSUVycm9ySGFuZGxpbmdQb2xpY3kgcHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpIHsKKwlyZXR1cm4gbmV3IElFcnJvckhhbmRsaW5nUG9saWN5KCkgeworCQlwdWJsaWMgYm9vbGVhbiBzdG9wT25GaXJzdEVycm9yKCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXB1YmxpYyBib29sZWFuIHByb2NlZWRPbkVycm9ycygpeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9OworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2ZiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMzI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKKy8qCisgKiBBIGRvY3VtZW50IGVsZW1lbnQgcGFyc2VyIGV4dHJhY3RzIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24KKyAqIGZyb20gYSBwaWVjZSBvZiBzb3VyY2UsIHByb3ZpZGluZyBkZXRhaWxlZCBzb3VyY2UgcG9zaXRpb25zIGluZm8uCisgKgorICogYWxzbyBzZWUgQElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IKKyAqCisgKiBUaGUgc3RydWN0dXJhbCBpbnZlc3RpZ2F0aW9uIGluY2x1ZGVzOgorICogLSB0aGUgcGFja2FnZSBzdGF0ZW1lbnQKKyAqIC0gaW1wb3J0IHN0YXRlbWVudHMKKyAqIC0gdG9wLWxldmVsIHR5cGVzOiBwYWNrYWdlIG1lbWJlciwgbWVtYmVyIHR5cGVzIChtZW1iZXIgdHlwZXMgb2YgbWVtYmVyIHR5cGVzLi4uKQorICogLSBmaWVsZHMKKyAqIC0gbWV0aG9kcworICoKKyAqIEFueSAocGFyc2luZykgcHJvYmxlbSBlbmNvdW50ZXJlZCBpcyBhbHNvIHByb3ZpZGVkLgorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCitwdWJsaWMgY2xhc3MgRG9jdW1lbnRFbGVtZW50UGFyc2VyIGV4dGVuZHMgUGFyc2VyIHsKKwlJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvcjsKKwlwcml2YXRlIGludCBsb2NhbEludFB0cjsKKwlwcml2YXRlIGludCBsYXN0RmllbGRFbmRQb3NpdGlvbjsKKwlwcml2YXRlIGludCBsYXN0RmllbGRCb2R5RW5kUG9zaXRpb247CQorCXByaXZhdGUgaW50IHR5cGVTdGFydFBvc2l0aW9uOworCXByaXZhdGUgbG9uZyBzZWxlY3RvclNvdXJjZVBvc2l0aW9uczsKKwlwcml2YXRlIGludCB0eXBlRGltczsKKwlwcml2YXRlIGludCBleHRlbmRzRGltOworCXByaXZhdGUgaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisKKwkvKiBpbnRbXSBzdGFjayBmb3Igc3RvcmluZyBqYXZhZG9jIHBvc2l0aW9ucyAqLworCWludFtdW10gaW50QXJyYXlTdGFjazsKKwlpbnQgaW50QXJyYXlQdHI7CisJCisJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CisJCitwdWJsaWMgRG9jdW1lbnRFbGVtZW50UGFyc2VyKAorCWZpbmFsIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCAKKwlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksCisJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMpIHsKKwlzdXBlcihuZXcgUHJvYmxlbVJlcG9ydGVyKAorCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksIAorCQlvcHRpb25zLCAKKwkJcHJvYmxlbUZhY3RvcnkpIHsKKwkJcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQpIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKHByb2JsZW0pOworCQl9CisJfSwKKwlmYWxzZSwKKwlvcHRpb25zLmFzc2VydE1vZGUpOworCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOworCWludEFycmF5U3RhY2sgPSBuZXcgaW50WzMwXVtdOworCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Cit9CisKKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFkanVzdEludGVyZmFjZU1vZGlmaWVycygpIHsKKwlpbnRTdGFja1tpbnRQdHIgLSAyXSB8PSBBY2NJbnRlcmZhY2U7Cit9CisvKgorICogV2lsbCBjbGVhciB0aGUgY29tbWVudCBzdGFjayB3aGVuIGxvb2tpbmcKKyAqIGZvciBhIHBvdGVudGlhbCBKYXZhRG9jIHdoaWNoIG1pZ2h0IGNvbnRhaW4gQGRlcHJlY2F0ZWQuCisgKgorICogQWRkaXRpb25hbGx5LCBiZWZvcmUgaW52ZXN0aWdhdGluZyBmb3IgQGRlcHJlY2F0ZWQsIHJldHJpZXZlIHRoZSBwb3NpdGlvbnMKKyAqIG9mIHRoZSBKYXZhRG9jIGNvbW1lbnRzIHNvIGFzIHRvIG5vdGlmeSByZXF1ZXN0b3Igd2l0aCB0aGVtLgorICovCitwdWJsaWMgdm9pZCBjaGVja0Fubm90YXRpb24oKSB7CisKKwkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCisJcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CisJYm9vbGVhbiBkZXByZWNhdGVkID0gZmFsc2U7CisJaW50IGxhc3RBbm5vdGF0aW9uSW5kZXggPSAtMTsKKworCS8vc2luY2UgamRrMS4yIGxvb2sgb25seSBpbiB0aGUgbGFzdCBqYXZhIGRvYyBjb21tZW50Li4uCisJZm91bmQgOiB7CisJCWlmICgobGFzdEFubm90YXRpb25JbmRleCA9IHNjYW5uZXIuY29tbWVudFB0cikgPj0gMCkgeyAvL2xvb2sgZm9yIEBkZXByZWNhdGVkCisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCS8vIHJlc2V0IHRoZSBjb21tZW50IHN0YWNrLCBzaW5jZSBub3QgbmVjZXNzYXJ5IGFmdGVyIGhhdmluZyBjaGVja2VkCisJCQlpbnQgY29tbWVudFNvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RBbm5vdGF0aW9uSW5kZXhdOworCQkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucy4pCisJCQlpbnQgY29tbWVudFNvdXJjZUVuZCA9IHNjYW5uZXIuY29tbWVudFN0b3BzW2xhc3RBbm5vdGF0aW9uSW5kZXhdIC0gMTsKKwkJCS8vc3RvcCBpcyBvbmUgb3ZlcgorCQkJY2hhcltdIGNvbW1lbnQgPSBzY2FubmVyLnNvdXJjZTsKKworCQkJZm9yIChpbnQgaSA9IGNvbW1lbnRTb3VyY2VTdGFydCArIDM7IGkgPCBjb21tZW50U291cmNlRW5kIC0gMTA7IGkrKykgeworCQkJCWlmICgoY29tbWVudFtpXSA9PSAnQCcpCisJCQkJCSYmIChjb21tZW50W2kgKyAxXSA9PSAnZCcpCisJCQkJCSYmIChjb21tZW50W2kgKyAyXSA9PSAnZScpCisJCQkJCSYmIChjb21tZW50W2kgKyAzXSA9PSAncCcpCisJCQkJCSYmIChjb21tZW50W2kgKyA0XSA9PSAncicpCisJCQkJCSYmIChjb21tZW50W2kgKyA1XSA9PSAnZScpCisJCQkJCSYmIChjb21tZW50W2kgKyA2XSA9PSAnYycpCisJCQkJCSYmIChjb21tZW50W2kgKyA3XSA9PSAnYScpCisJCQkJCSYmIChjb21tZW50W2kgKyA4XSA9PSAndCcpCisJCQkJCSYmIChjb21tZW50W2kgKyA5XSA9PSAnZScpCisJCQkJCSYmIChjb21tZW50W2kgKyAxMF0gPT0gJ2QnKSkgeworCQkJCQkvLyBlbnN1cmUgdGhlIHRhZyBpcyBwcm9wZXJseSBlbmRlZDogZWl0aGVyIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGxpbmUgZW5kIG9yIGFzdGVyaXNrLgorCQkJCQlpbnQgbmV4dFBvcyA9IGkgKyAxMTsKKwkJCQkJZGVwcmVjYXRlZCA9IAorCQkJCQkJKGNvbW1lbnRbbmV4dFBvc10gPT0gJyAnKQorCQkJCQkJCXx8IChjb21tZW50W25leHRQb3NdID09ICdcbicpCisJCQkJCQkJfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJ1xyJykKKwkJCQkJCQl8fCAoY29tbWVudFtuZXh0UG9zXSA9PSAnKicpOyAKKwkJCQkJYnJlYWsgZm91bmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChkZXByZWNhdGVkKSB7CisJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY0RlcHJlY2F0ZWQpOworCX0KKwkvLyBtb2RpZnkgdGhlIG1vZGlmaWVyIHNvdXJjZSBzdGFydCB0byBwb2ludCBhdCB0aGUgZmlyc3QgY29tbWVudAorCWlmIChsYXN0QW5ub3RhdGlvbkluZGV4ID49IDApIHsKKwkJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHNjYW5uZXIuY29tbWVudFN0YXJ0c1swXTsKKwl9Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKSB7CisJLy8gQ2xhc3NCb2R5RGVjbGFyYXRpb24gOjo9IERpZXQgQmxvY2sKKwkvL3B1c2ggYW4gSW5pdGlhbGl6ZXIKKwkvL29wdGltaXplIHRoZSBwdXNoL3BvcAorCisJc3VwZXIuY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7CisJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGFzdFN0YWNrW2FzdFB0cl07CisJcmVxdWVzdG9yLmFjY2VwdEluaXRpYWxpemVyKAorCQlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwgCisJCTAsCisJCW1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKKwkJaW5pdGlhbGl6ZXIuYmxvY2suc291cmNlU3RhcnQsCisJCWluaXRpYWxpemVyLmJsb2NrLnNvdXJjZUVuZCk7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpIHsKKwlzdXBlci5jb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOworCS8vIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGEgVHlwZURlY2xhcmF0aW9uIG9uIHRoZSB0b3Agb2YgdGhlIGFzdFN0YWNrCisJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CisJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCXJldHVybjsKKwl9CisJcmVxdWVzdG9yLmV4aXRDbGFzcyhlbmRTdGF0ZW1lbnRQb3NpdGlvbiwgLy8gJ30nIGlzIHRoZSBlbmQgb2YgdGhlIGJvZHkgCisJICgoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdKS5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXIoKSB7CisJLy9DbGFzc0hlYWRlciA6Oj0gJGVtcHR5CisJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVyKCk7CisJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CisJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCWludEFycmF5UHRyLS07CisJCXJldHVybjsKKwl9CisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VzOworCWNoYXJbXVtdIGludGVyZmFjZU5hbWVzID0gbnVsbDsKKwlpbnRbXSBpbnRlcmZhY2VOYW1lU3RhcnRzID0gbnVsbDsKKwlpbnRbXSBpbnRlcmZhY2VOYW1lRW5kcyA9IG51bGw7CisJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCWludCBzdXBlckludGVyZmFjZXNMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQlpbnRlcmZhY2VOYW1lcyA9IG5ldyBjaGFyW3N1cGVySW50ZXJmYWNlc0xlbmd0aF1bXTsKKwkJaW50ZXJmYWNlTmFtZVN0YXJ0cyA9IG5ldyBpbnRbc3VwZXJJbnRlcmZhY2VzTGVuZ3RoXTsKKwkJaW50ZXJmYWNlTmFtZUVuZHMgPSBuZXcgaW50W3N1cGVySW50ZXJmYWNlc0xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VzTGVuZ3RoOyBpKyspIHsKKwkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV07CisJCQlpbnRlcmZhY2VOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlckludGVyZmFjZS5nZXRUeXBlTmFtZSgpLCAnLicpOyAKKwkJCWludGVyZmFjZU5hbWVTdGFydHNbaV0gPSBzdXBlckludGVyZmFjZS5zb3VyY2VTdGFydDsKKwkJCWludGVyZmFjZU5hbWVFbmRzW2ldID0gc3VwZXJJbnRlcmZhY2Uuc291cmNlRW5kOworCQl9CisJfQorCS8vIGZsdXNoIHRoZSBjb21tZW50cyByZWxhdGVkIHRvIHRoZSBjbGFzcyBoZWFkZXIKKwlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSB0eXBlRGVjbC5zdXBlcmNsYXNzOworCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKKwkJcmVxdWVzdG9yLmVudGVyQ2xhc3MoCisJCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwkJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAorCQkJdHlwZURlY2wubW9kaWZpZXJzLCAKKwkJCXR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKKwkJCXR5cGVTdGFydFBvc2l0aW9uLCAKKwkJCXR5cGVEZWNsLm5hbWUsIAorCQkJdHlwZURlY2wuc291cmNlU3RhcnQsIAorCQkJdHlwZURlY2wuc291cmNlRW5kLCAKKwkJCW51bGwsIAorCQkJLTEsIAorCQkJLTEsIAorCQkJaW50ZXJmYWNlTmFtZXMsIAorCQkJaW50ZXJmYWNlTmFtZVN0YXJ0cywgCisJCQlpbnRlcmZhY2VOYW1lRW5kcywgCisJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwl9IGVsc2UgeworCQlyZXF1ZXN0b3IuZW50ZXJDbGFzcygKKwkJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwgCisJCQl0eXBlRGVjbC5tb2RpZmllcnMsIAorCQkJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQsIAorCQkJdHlwZVN0YXJ0UG9zaXRpb24sIAorCQkJdHlwZURlY2wubmFtZSwgCisJCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwgCisJCQl0eXBlRGVjbC5zb3VyY2VFbmQsIAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVyY2xhc3MuZ2V0VHlwZU5hbWUoKSwgJy4nKSwgCisJCQlzdXBlcmNsYXNzLnNvdXJjZVN0YXJ0LCAKKwkJCXN1cGVyY2xhc3Muc291cmNlRW5kLCAKKwkJCWludGVyZmFjZU5hbWVzLCAKKwkJCWludGVyZmFjZU5hbWVTdGFydHMsIAorCQkJaW50ZXJmYWNlTmFtZUVuZHMsIAorCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsgCisKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCkgeworCS8vIENsYXNzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdjbGFzcycgJ0lkZW50aWZpZXInCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsOworCWlmIChuZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gPT0gMCkgeworCQlpZiAobmVzdGVkVHlwZSAhPSAwKSB7CisJCQl0eXBlRGVjbCA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQl9IGVsc2UgeworCQkJdHlwZURlY2wgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIFJlY29yZCB0aGF0IHRoZSBibG9jayBoYXMgYSBkZWNsYXJhdGlvbiBmb3IgbG9jYWwgdHlwZXMKKwkJdHlwZURlY2wgPSBuZXcgTG9jYWxUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQltYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKTsKKwkJYmxvY2tSZWFsKCk7CisJfQorCisJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKKwlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdOworCXR5cGVEZWNsLnNvdXJjZUVuZCA9IChpbnQpIHBvczsKKwl0eXBlRGVjbC5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwl0eXBlRGVjbC5uYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCisJLy9jb21wdXRlIHRoZSBkZWNsYXJhdGlvbiBzb3VyY2UgdG9vCisJLy8gJ2NsYXNzJyBhbmQgJ2ludGVyZmFjZScgcHVzaCBhbiBpbnQgcG9zaXRpb24KKwl0eXBlU3RhcnRQb3NpdGlvbiA9IHR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJaW50UHRyLS07CisJaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCWlmICh0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCkgeworCQl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwl9CisJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc291cmNlRW5kICsgMTsKKwlwdXNoT25Bc3RTdGFjayh0eXBlRGVjbCk7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29tcGlsYXRpb25Vbml0KCkgeworCS8vIENvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdAorCXJlcXVlc3Rvci5leGl0Q29tcGlsYXRpb25Vbml0KHNjYW5uZXIuc291cmNlLmxlbmd0aCAtIDEpOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSB7CisJLy8gQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5CisJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKTsKKwlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKCkpIHsKKwkJLy8gd2UgaWdub3JlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKwkJcmV0dXJuOworCX0KKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJcmVxdWVzdG9yLmV4aXRDb25zdHJ1Y3RvcihlbmRTdGF0ZW1lbnRQb3NpdGlvbiwgY2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCkgeworCS8vIENvbnN0cnVjdG9ySGVhZGVyIDo6PSBDb25zdHJ1Y3RvckhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQKKwlzdXBlci5jb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKTsKKwlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKCkpIHsKKwkJLy8gd2UgaWdub3JlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKwkJaW50QXJyYXlQdHItLTsKKwkJcmV0dXJuOworCX0KKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBjZC5hcmd1bWVudHM7CisJY2hhcltdW10gYXJndW1lbnRUeXBlcyA9IG51bGw7CisJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IG51bGw7CisJaW50W10gYXJndW1lbnRUeXBlU3RhcnRzID0gbnVsbDsKKwlpbnRbXSBhcmd1bWVudFR5cGVFbmRzID0gbnVsbDsKKwlpbnRbXSBhcmd1bWVudE5hbWVTdGFydHMgPSBudWxsOworCWludFtdIGFyZ3VtZW50TmFtZUVuZHMgPSBudWxsOworCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQlhcmd1bWVudFR5cGVzID0gbmV3IGNoYXJbYXJndW1lbnRMZW5ndGhdW107CisJCWFyZ3VtZW50TmFtZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKKwkJYXJndW1lbnROYW1lU3RhcnRzID0gbmV3IGludFthcmd1bWVudExlbmd0aF07CisJCWFyZ3VtZW50TmFtZUVuZHMgPSBuZXcgaW50W2FyZ3VtZW50TGVuZ3RoXTsKKwkJYXJndW1lbnRUeXBlU3RhcnRzID0gbmV3IGludFthcmd1bWVudExlbmd0aF07CisJCWFyZ3VtZW50VHlwZUVuZHMgPSBuZXcgaW50W2FyZ3VtZW50TGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7CisJCQlBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKKwkJCVR5cGVSZWZlcmVuY2UgYXJndW1lbnRUeXBlID0gYXJndW1lbnQudHlwZTsKKwkJCWFyZ3VtZW50VHlwZXNbaV0gPSByZXR1cm5UeXBlTmFtZShhcmd1bWVudFR5cGUpOworCQkJYXJndW1lbnROYW1lc1tpXSA9IGFyZ3VtZW50Lm5hbWU7CisJCQlhcmd1bWVudE5hbWVTdGFydHNbaV0gPSBhcmd1bWVudC5zb3VyY2VTdGFydDsKKwkJCWFyZ3VtZW50TmFtZUVuZHNbaV0gPSBhcmd1bWVudC5zb3VyY2VFbmQ7CisJCQlhcmd1bWVudFR5cGVTdGFydHNbaV0gPSBhcmd1bWVudFR5cGUuc291cmNlU3RhcnQ7CisJCQlhcmd1bWVudFR5cGVFbmRzW2ldID0gYXJndW1lbnRUeXBlLnNvdXJjZUVuZDsKKwkJfQorCX0KKwlUeXBlUmVmZXJlbmNlW10gdGhyb3duRXhjZXB0aW9ucyA9IGNkLnRocm93bkV4Y2VwdGlvbnM7CisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMgPSBudWxsOworCWludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMgPSBudWxsOworCWludFtdIGV4Y2VwdGlvblR5cGVFbmRzID0gbnVsbDsKKwlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCWludCB0aHJvd25FeGNlcHRpb25MZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJZXhjZXB0aW9uVHlwZXMgPSBuZXcgY2hhclt0aHJvd25FeGNlcHRpb25MZW5ndGhdW107CisJCWV4Y2VwdGlvblR5cGVTdGFydHMgPSBuZXcgaW50W3Rocm93bkV4Y2VwdGlvbkxlbmd0aF07CisJCWV4Y2VwdGlvblR5cGVFbmRzID0gbmV3IGludFt0aHJvd25FeGNlcHRpb25MZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbkxlbmd0aDsgaSsrKSB7CisJCQlUeXBlUmVmZXJlbmNlIGV4Y2VwdGlvbiA9IHRocm93bkV4Y2VwdGlvbnNbaV07CisJCQlleGNlcHRpb25UeXBlc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChleGNlcHRpb24uZ2V0VHlwZU5hbWUoKSwgJy4nKTsKKwkJCWV4Y2VwdGlvblR5cGVTdGFydHNbaV0gPSBleGNlcHRpb24uc291cmNlU3RhcnQ7CisJCQlleGNlcHRpb25UeXBlRW5kc1tpXSA9IGV4Y2VwdGlvbi5zb3VyY2VFbmQ7CisJCX0KKwl9CisJcmVxdWVzdG9yCisJCS5lbnRlckNvbnN0cnVjdG9yKAorCQkJY2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLCAKKwkJCWNkLm1vZGlmaWVycywKKwkJCWNkLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKKwkJCWNkLnNlbGVjdG9yLCAKKwkJCWNkLnNvdXJjZVN0YXJ0LCAKKwkJCShpbnQpIChzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyAmIDB4RkZGRkZGRkZMKSwgCisJCQkvLyByZXRyaWV2ZSB0aGUgc291cmNlIGVuZCBvZiB0aGUgbmFtZQorCQkJYXJndW1lbnRUeXBlcywgCisJCQlhcmd1bWVudFR5cGVTdGFydHMsIAorCQkJYXJndW1lbnRUeXBlRW5kcywgCisJCQlhcmd1bWVudE5hbWVzLCAKKwkJCWFyZ3VtZW50TmFtZVN0YXJ0cywgCisJCQlhcmd1bWVudE5hbWVFbmRzLCAKKwkJCXJQYXJlblBvcywgCisJCQkvLyByaWdodCBwYXJlbnRoZXNpcworCQkJZXhjZXB0aW9uVHlwZXMsIAorCQkJZXhjZXB0aW9uVHlwZVN0YXJ0cywgCisJCQlleGNlcHRpb25UeXBlRW5kcywgCisJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKSB7CisJLy8gQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCisJLy9uYW1lIC0tIHRoaXMgaXMgbm90IHJlYWxseSByZXZlbGFudCBidXQgd2UgZG8gLi4uLi4KKwljZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKKwlzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCisJLy9tb2RpZmllcnMKKwljZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCWNkLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCWNkLm1vZGlmaWVycyA9IGludFN0YWNrW2ludFB0ci0tXTsKKworCS8vaGlnaGxpZ2h0IHN0YXJ0cyBhdCB0aGUgc2VsZWN0b3Igc3RhcnRzCisJY2Quc291cmNlU3RhcnQgPSAoaW50KSAoc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgPj4+IDMyKTsKKwlwdXNoT25Bc3RTdGFjayhjZCk7CisKKwljZC5zb3VyY2VFbmQgPSBsUGFyZW5Qb3M7CisJY2QuYm9keVN0YXJ0ID0gbFBhcmVuUG9zICsgMTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCkgeworCWNoZWNrQW5ub3RhdGlvbigpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAorCXB1c2hPbkludFN0YWNrKG1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCXB1c2hPbkludFN0YWNrKC0xKTsKKwlwdXNoT25JbnRTdGFjaygKKwkJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+PSAwID8gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA6IHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7IAorCXJlc2V0TW9kaWZpZXJzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRGlldCgpIHsKKwkvLyBEaWV0IDo6PSAkZW1wdHkKKwlzdXBlci5jb25zdW1lRGlldCgpOworCS8qIHBlcnNpc3RpbmcgamF2YWRvYyBwb3NpdGlvbnMKKwkgKiBXaWxsIGJlIGNvbnN1bWUgaW4gY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uCisJICovCisJcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CQorfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQ29tcGlsYXRpb25Vbml0KCkgeworCS8vIEVudGVyQ29tcGlsYXRpb25Vbml0IDo6PSAkZW1wdHkKKwlyZXF1ZXN0b3IuZW50ZXJDb21waWxhdGlvblVuaXQoKTsKK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlclZhcmlhYmxlKCkgeworCS8vIEVudGVyVmFyaWFibGUgOjo9ICRlbXB0eQorCWJvb2xlYW4gaXNMb2NhbERlY2xhcmF0aW9uID0gaXNMb2NhbERlY2xhcmF0aW9uKCk7CisJaWYgKCFpc0xvY2FsRGVjbGFyYXRpb24gJiYgKHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV0gIT0gMCkpIHsKKwkJcmVxdWVzdG9yLmV4aXRGaWVsZChsYXN0RmllbGRCb2R5RW5kUG9zaXRpb24sIGxhc3RGaWVsZEVuZFBvc2l0aW9uKTsKKwl9CisJY2hhcltdIG5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJbG9uZyBuYW1lUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWludCBleHRlbmRlZFR5cGVEaW1lbnNpb24gPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb247CisJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSAhPSAwKSB7CisJCS8vIGNyZWF0ZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCWRlY2xhcmF0aW9uID0gCisJCQluZXcgTG9jYWxEZWNsYXJhdGlvbihudWxsLCBuYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7IAorCX0gZWxzZSB7CisJCS8vIGNyZWF0ZSB0aGUgZmllbGQgZGVjbGFyYXRpb24KKwkJZGVjbGFyYXRpb24gPSAKKwkJCW5ldyBGaWVsZERlY2xhcmF0aW9uKG51bGwsIG5hbWUsIChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSwgKGludCkgbmFtZVBvc2l0aW9uKTsgCisJfQorCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlUeXBlUmVmZXJlbmNlIHR5cGU7CisJaW50IHZhcmlhYmxlSW5kZXggPSB2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdOworCWludCB0eXBlRGltID0gMDsKKwlpZiAodmFyaWFibGVJbmRleCA9PSAwKSB7CisJCS8vIGZpcnN0IHZhcmlhYmxlIG9mIHRoZSBkZWNsYXJhdGlvbiAoRmllbGREZWNsYXJhdGlvbiBvciBMb2NhbERlY2xhcmF0aW9uKQorCQlpZiAobmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdICE9IDApIHsKKwkJCS8vIGxvY2FsIGRlY2xhcmF0aW9uCisJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQl0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0eXBlRGltID0gaW50U3RhY2tbaW50UHRyLS1dKTsgLy8gdHlwZSBkaW1lbnNpb24KKwkJCXB1c2hPbkFzdFN0YWNrKHR5cGUpOworCQl9IGVsc2UgeworCQkJLy8gZmllbGQgZGVjbGFyYXRpb24KKwkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHR5cGVEaW0gPSBpbnRTdGFja1tpbnRQdHItLV0pOyAvLyB0eXBlIGRpbWVuc2lvbgorCQkJcHVzaE9uQXN0U3RhY2sodHlwZSk7CisJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCX0KKwl9IGVsc2UgeworCQl0eXBlID0gKFR5cGVSZWZlcmVuY2UpIGFzdFN0YWNrW2FzdFB0ciAtIHZhcmlhYmxlSW5kZXhdOworCQl0eXBlRGltID0gdHlwZS5kaW1lbnNpb25zKCk7CisJCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBwcmV2aW91c1ZhcmlhYmxlID0gCisJCQkoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOyAKKwkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHByZXZpb3VzVmFyaWFibGUuZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gcHJldmlvdXNWYXJpYWJsZS5tb2RpZmllcnM7CisJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gcHJldmlvdXNWYXJpYWJsZS5tb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9CisKKwlsb2NhbEludFB0ciA9IGludFB0cjsKKworCWlmIChleHRlbmRlZFR5cGVEaW1lbnNpb24gPT0gMCkgeworCQlkZWNsYXJhdGlvbi50eXBlID0gdHlwZTsKKwl9IGVsc2UgeworCQlpbnQgZGltZW5zaW9uID0gdHlwZURpbSArIGV4dGVuZGVkVHlwZURpbWVuc2lvbjsKKwkJLy9vbiB0aGUgaWRlbnRpZmllckxlbmd0aFN0YWNrIHRoZXJlIGlzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZS4uLi4KKwkJaW50IGJhc2VUeXBlOworCQlpZiAoKGJhc2VUeXBlID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHIgKyAxXSkgPCAwKSB7CisJCQkvL2l0IHdhcyBhIGJhc2VUeXBlCisJCQlkZWNsYXJhdGlvbi50eXBlID0gVHlwZVJlZmVyZW5jZS5iYXNlVHlwZVJlZmVyZW5jZSgtYmFzZVR5cGUsIGRpbWVuc2lvbik7CisJCQlkZWNsYXJhdGlvbi50eXBlLnNvdXJjZVN0YXJ0ID0gdHlwZS5zb3VyY2VTdGFydDsKKwkJCWRlY2xhcmF0aW9uLnR5cGUuc291cmNlRW5kID0gdHlwZS5zb3VyY2VFbmQ7CisJCX0gZWxzZSB7CisJCQlkZWNsYXJhdGlvbi50eXBlID0gdGhpcy5jb3B5RGltcyh0eXBlLCBkaW1lbnNpb24pOworCQl9CisJfQorCXZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV0rKzsKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0rKzsKKwlwdXNoT25Bc3RTdGFjayhkZWNsYXJhdGlvbik7CisKKwlpbnRbXSBqYXZhZG9jUG9zaXRpb25zID0gaW50QXJyYXlTdGFja1tpbnRBcnJheVB0cl07CisJaWYgKCFpc0xvY2FsRGVjbGFyYXRpb24pIHsKKwkJcmVxdWVzdG9yCisJCQkuZW50ZXJGaWVsZCgKKwkJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwkJCQlqYXZhZG9jUG9zaXRpb25zLCAKKwkJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMsIAorCQkJCWRlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0LCAKKwkJCQlyZXR1cm5UeXBlTmFtZShkZWNsYXJhdGlvbi50eXBlKSwgCisJCQkJdHlwZS5zb3VyY2VTdGFydCwgCisJCQkJdHlwZS5zb3VyY2VFbmQsIAorCQkJCXR5cGVEaW1zLCAKKwkJCQluYW1lLCAKKwkJCQkoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIAorCQkJCShpbnQpIG5hbWVQb3NpdGlvbiwgCisJCQkJZXh0ZW5kZWRUeXBlRGltZW5zaW9uLCAKKwkJCQlleHRlbmRlZFR5cGVEaW1lbnNpb24gPT0gMCA/IC0xIDogZW5kUG9zaXRpb24pOyAKKwl9Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gdGhlIHNjYW5uZXIgaXMgbG9jYXRlZCBhZnRlciB0aGUgY29tbWEgb3IgdGhlIHNlbWktY29sb24uCisJLy8gd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBjb21tYSBvciB0aGUgc2VtaS1jb2xvbgorCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0tLTsJCisJbGFzdEZpZWxkRW5kUG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJbGFzdEZpZWxkQm9keUVuZFBvc2l0aW9uID0gCSgoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdKS5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJc3VwZXIuY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOworCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXS0tOwkKKwlsYXN0RmllbGRFbmRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwlsYXN0RmllbGRCb2R5RW5kUG9zaXRpb24gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKSB7CisJLy8gU2VlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25EZWZhdWx0TW9kaWZpZXIoKSBpbiBjYXNlIG9mIGNoYW5nZTogZHVwbGljYXRlZCBjb2RlCisJLy8gRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKKwkvLyB0aGUgc3VwZXIuY29uc3VtZUZpZWxkRGVjbGFyYXRpb24gd2lsbCByZWluaXRpYWxpemUgdGhlIHZhcmlhYmxlQ291bnRlcltuZXN0ZWRUeXBlXQkKKwlpbnQgdmFyaWFibGVJbmRleCA9IHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV07CisJc3VwZXIuY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKTsKKwlpbnRBcnJheVB0ci0tOworCWlmIChpc0xvY2FsRGVjbGFyYXRpb24oKSkKKwkJcmV0dXJuOworCWlmICh2YXJpYWJsZUluZGV4ICE9IDApIHsKKwkJcmVxdWVzdG9yLmV4aXRGaWVsZChsYXN0RmllbGRCb2R5RW5kUG9zaXRpb24sIGxhc3RGaWVsZEVuZFBvc2l0aW9uKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9ybWFsUGFyYW1ldGVyKCkgeworCS8vIEZvcm1hbFBhcmFtZXRlciA6Oj0gVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCA9PT4gZmFsc2UKKwkvLyBGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVycyBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkID09PiB0cnVlCisJLyoKKwlhc3RTdGFjayA6IAorCWlkZW50aWZpZXJTdGFjayA6IHR5cGUgaWRlbnRpZmllcgorCWludFN0YWNrIDogZGltIGRpbQorCSA9PT4KKwlhc3RTdGFjayA6IEFyZ3VtZW50CisJaWRlbnRpZmllclN0YWNrIDogIAorCWludFN0YWNrIDogIAorCSovCisKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJY2hhcltdIG5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJbG9uZyBuYW1lUG9zaXRpb25zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlUeXBlUmVmZXJlbmNlIHR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSArIGludFN0YWNrW2ludFB0ci0tXSk7CisJaW50UHRyIC09IDM7CisJQXJndW1lbnQgYXJnID0gCisJCW5ldyBBcmd1bWVudCgKKwkJCW5hbWUsIAorCQkJbmFtZVBvc2l0aW9ucywgCisJCQl0eXBlLCAKKwkJCWludFN0YWNrW2ludFB0ciArIDFdKTsgLy8gbW9kaWZpZXJzCisJcHVzaE9uQXN0U3RhY2soYXJnKTsKKwlpbnRBcnJheVB0ci0tOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZURlY2xhcmF0aW9uKCkgeworCXN1cGVyLmNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOworCS8vIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGEgVHlwZURlY2xhcmF0aW9uIG9uIHRoZSB0b3Agb2YgdGhlIGFzdFN0YWNrCisJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CisJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCXJldHVybjsKKwl9CisJcmVxdWVzdG9yLmV4aXRJbnRlcmZhY2UoZW5kU3RhdGVtZW50UG9zaXRpb24sIC8vIHRoZSAnfScgaXMgdGhlIGVuZCBvZiB0aGUgYm9keQorCSAoKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXSkuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZUhlYWRlcigpIHsKKwkvL0ludGVyZmFjZUhlYWRlciA6Oj0gJGVtcHR5CisJc3VwZXIuY29uc3VtZUludGVyZmFjZUhlYWRlcigpOworCWlmIChpc0xvY2FsRGVjbGFyYXRpb24oKSkgeworCQkvLyB3ZSBpZ25vcmUgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworCQlpbnRBcnJheVB0ci0tOworCQlyZXR1cm47CisJfQorCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsLnN1cGVySW50ZXJmYWNlczsKKwljaGFyW11bXSBpbnRlcmZhY2VOYW1lcyA9IG51bGw7CisJaW50W10gaW50ZXJmYWNlTmFtZVN0YXJ0cyA9IG51bGw7CisJaW50W10gaW50ZXJmYWNlbmFtZUVuZHMgPSBudWxsOworCWludCBzdXBlckludGVyZmFjZXNMZW5ndGggPSAwOworCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlzdXBlckludGVyZmFjZXNMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQlpbnRlcmZhY2VOYW1lcyA9IG5ldyBjaGFyW3N1cGVySW50ZXJmYWNlc0xlbmd0aF1bXTsKKwkJaW50ZXJmYWNlTmFtZVN0YXJ0cyA9IG5ldyBpbnRbc3VwZXJJbnRlcmZhY2VzTGVuZ3RoXTsKKwkJaW50ZXJmYWNlbmFtZUVuZHMgPSBuZXcgaW50W3N1cGVySW50ZXJmYWNlc0xlbmd0aF07CisJfQorCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlc0xlbmd0aDsgaSsrKSB7CisJCQlUeXBlUmVmZXJlbmNlIHN1cGVySW50ZXJmYWNlID0gc3VwZXJJbnRlcmZhY2VzW2ldOworCQkJaW50ZXJmYWNlTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoc3VwZXJJbnRlcmZhY2UuZ2V0VHlwZU5hbWUoKSwgJy4nKTsgCisJCQlpbnRlcmZhY2VOYW1lU3RhcnRzW2ldID0gc3VwZXJJbnRlcmZhY2Uuc291cmNlU3RhcnQ7CisJCQlpbnRlcmZhY2VuYW1lRW5kc1tpXSA9IHN1cGVySW50ZXJmYWNlLnNvdXJjZUVuZDsKKwkJfQorCX0KKwkvLyBmbHVzaCB0aGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgaW50ZXJmYWNlIGhlYWRlcgorCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCXJlcXVlc3Rvci5lbnRlckludGVyZmFjZSgKKwkJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sIAorCQl0eXBlRGVjbC5tb2RpZmllcnMsIAorCQl0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCwgCisJCXR5cGVTdGFydFBvc2l0aW9uLCAKKwkJdHlwZURlY2wubmFtZSwgCisJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LCAKKwkJdHlwZURlY2wuc291cmNlRW5kLCAKKwkJaW50ZXJmYWNlTmFtZXMsIAorCQlpbnRlcmZhY2VOYW1lU3RhcnRzLCAKKwkJaW50ZXJmYWNlbmFtZUVuZHMsIAorCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCkgeworCS8vIEludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w7CisJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSA9PSAwKSB7CisJCWlmIChuZXN0ZWRUeXBlICE9IDApIHsKKwkJCXR5cGVEZWNsID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlRGVjbCA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gUmVjb3JkIHRoYXQgdGhlIGJsb2NrIGhhcyBhIGRlY2xhcmF0aW9uIGZvciBsb2NhbCB0eXBlcworCQl0eXBlRGVjbCA9IG5ldyBMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCW1hcmtDdXJyZW50TWV0aG9kV2l0aExvY2FsVHlwZSgpOworCQlibG9ja1JlYWwoKTsKKwl9CisKKwkvL2hpZ2hsaWdodCB0aGUgbmFtZSBvZiB0aGUgdHlwZQorCWxvbmcgcG9zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl07CisJdHlwZURlY2wuc291cmNlRW5kID0gKGludCkgcG9zOworCXR5cGVEZWNsLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworCXR5cGVEZWNsLm5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisKKwkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KKwkvLyAnY2xhc3MnIGFuZCAnaW50ZXJmYWNlJyBwdXNoIGFuIGludCBwb3NpdGlvbgorCXR5cGVTdGFydFBvc2l0aW9uID0gdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlpbnRQdHItLTsKKwlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwl0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwl0eXBlRGVjbC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJaWYgKHR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCX0KKwl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zb3VyY2VFbmQgKyAxOworCXB1c2hPbkFzdFN0YWNrKHR5cGVEZWNsKTsKK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7CisJLy8gU2VlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25EZWZhdWx0TW9kaWZpZXIoKSBpbiBjYXNlIG9mIGNoYW5nZTogZHVwbGljYXRlZCBjb2RlCisJLy8gRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKKworCXN1cGVyLmNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKKwlpbnRBcnJheVB0ci0tOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGJvb2xlYW4gaXNOb3RBYnN0cmFjdCkgeworCS8vIE1ldGhvZERlY2xhcmF0aW9uIDo6PSBNZXRob2RIZWFkZXIgTWV0aG9kQm9keQorCS8vIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciAnOycKKwlzdXBlci5jb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oaXNOb3RBYnN0cmFjdCk7CisJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpKSB7CisJCS8vIHdlIGlnbm9yZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCXJldHVybjsKKwl9CisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJcmVxdWVzdG9yLmV4aXRNZXRob2QoZW5kU3RhdGVtZW50UG9zaXRpb24sIG1kLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXIoKSB7CisJLy8gTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIFRocm93c0NsYXVzZW9wdAorCXN1cGVyLmNvbnN1bWVNZXRob2RIZWFkZXIoKTsKKwlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKCkpIHsKKwkJLy8gd2UgaWdub3JlIHRoZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKwkJaW50QXJyYXlQdHItLTsKKwkJcmV0dXJuOworCX0KKwlNZXRob2REZWNsYXJhdGlvbiBtZCA9IChNZXRob2REZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKworCVR5cGVSZWZlcmVuY2UgcmV0dXJuVHlwZSA9IG1kLnJldHVyblR5cGU7CisJY2hhcltdIHJldHVyblR5cGVOYW1lID0gcmV0dXJuVHlwZU5hbWUocmV0dXJuVHlwZSk7CisJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZC5hcmd1bWVudHM7CisJY2hhcltdW10gYXJndW1lbnRUeXBlcyA9IG51bGw7CisJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IG51bGw7CisJaW50W10gYXJndW1lbnRUeXBlU3RhcnRzID0gbnVsbDsKKwlpbnRbXSBhcmd1bWVudFR5cGVFbmRzID0gbnVsbDsKKwlpbnRbXSBhcmd1bWVudE5hbWVTdGFydHMgPSBudWxsOworCWludFtdIGFyZ3VtZW50TmFtZUVuZHMgPSBudWxsOworCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQlhcmd1bWVudFR5cGVzID0gbmV3IGNoYXJbYXJndW1lbnRMZW5ndGhdW107CisJCWFyZ3VtZW50TmFtZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKKwkJYXJndW1lbnROYW1lU3RhcnRzID0gbmV3IGludFthcmd1bWVudExlbmd0aF07CisJCWFyZ3VtZW50TmFtZUVuZHMgPSBuZXcgaW50W2FyZ3VtZW50TGVuZ3RoXTsKKwkJYXJndW1lbnRUeXBlU3RhcnRzID0gbmV3IGludFthcmd1bWVudExlbmd0aF07CisJCWFyZ3VtZW50VHlwZUVuZHMgPSBuZXcgaW50W2FyZ3VtZW50TGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudExlbmd0aDsgaSsrKSB7CisJCQlBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKKwkJCVR5cGVSZWZlcmVuY2UgYXJndW1lbnRUeXBlID0gYXJndW1lbnQudHlwZTsKKwkJCWFyZ3VtZW50VHlwZXNbaV0gPSByZXR1cm5UeXBlTmFtZShhcmd1bWVudFR5cGUpOworCQkJYXJndW1lbnROYW1lc1tpXSA9IGFyZ3VtZW50Lm5hbWU7CisJCQlhcmd1bWVudE5hbWVTdGFydHNbaV0gPSBhcmd1bWVudC5zb3VyY2VTdGFydDsKKwkJCWFyZ3VtZW50TmFtZUVuZHNbaV0gPSBhcmd1bWVudC5zb3VyY2VFbmQ7CisJCQlhcmd1bWVudFR5cGVTdGFydHNbaV0gPSBhcmd1bWVudFR5cGUuc291cmNlU3RhcnQ7CisJCQlhcmd1bWVudFR5cGVFbmRzW2ldID0gYXJndW1lbnRUeXBlLnNvdXJjZUVuZDsKKwkJfQorCX0KKwlUeXBlUmVmZXJlbmNlW10gdGhyb3duRXhjZXB0aW9ucyA9IG1kLnRocm93bkV4Y2VwdGlvbnM7CisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMgPSBudWxsOworCWludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMgPSBudWxsOworCWludFtdIGV4Y2VwdGlvblR5cGVFbmRzID0gbnVsbDsKKwlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCWludCB0aHJvd25FeGNlcHRpb25MZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJZXhjZXB0aW9uVHlwZVN0YXJ0cyA9IG5ldyBpbnRbdGhyb3duRXhjZXB0aW9uTGVuZ3RoXTsKKwkJZXhjZXB0aW9uVHlwZUVuZHMgPSBuZXcgaW50W3Rocm93bkV4Y2VwdGlvbkxlbmd0aF07CisJCWV4Y2VwdGlvblR5cGVzID0gbmV3IGNoYXJbdGhyb3duRXhjZXB0aW9uTGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbkxlbmd0aDsgaSsrKSB7CisJCQlUeXBlUmVmZXJlbmNlIGV4Y2VwdGlvbiA9IHRocm93bkV4Y2VwdGlvbnNbaV07CisJCQlleGNlcHRpb25UeXBlc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChleGNlcHRpb24uZ2V0VHlwZU5hbWUoKSwgJy4nKTsKKwkJCWV4Y2VwdGlvblR5cGVTdGFydHNbaV0gPSBleGNlcHRpb24uc291cmNlU3RhcnQ7CisJCQlleGNlcHRpb25UeXBlRW5kc1tpXSA9IGV4Y2VwdGlvbi5zb3VyY2VFbmQ7CisJCX0KKwl9CisJcmVxdWVzdG9yCisJCS5lbnRlck1ldGhvZCgKKwkJCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwgCisJCQltZC5tb2RpZmllcnMsIAorCQkJbWQubW9kaWZpZXJzU291cmNlU3RhcnQsIAorCQkJcmV0dXJuVHlwZU5hbWUsIAorCQkJcmV0dXJuVHlwZS5zb3VyY2VTdGFydCwgCisJCQlyZXR1cm5UeXBlLnNvdXJjZUVuZCwgCisJCQl0eXBlRGltcywgCisJCQltZC5zZWxlY3RvciwgCisJCQltZC5zb3VyY2VTdGFydCwgCisJCQkoaW50KSAoc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgJiAweEZGRkZGRkZGTCksIAorCQkJYXJndW1lbnRUeXBlcywgCisJCQlhcmd1bWVudFR5cGVTdGFydHMsIAorCQkJYXJndW1lbnRUeXBlRW5kcywgCisJCQlhcmd1bWVudE5hbWVzLCAKKwkJCWFyZ3VtZW50TmFtZVN0YXJ0cywgCisJCQlhcmd1bWVudE5hbWVFbmRzLCAKKwkJCXJQYXJlblBvcywgCisJCQlleHRlbmRzRGltLCAKKwkJCWV4dGVuZHNEaW0gPT0gMCA/IC0xIDogZW5kUG9zaXRpb24sIAorCQkJZXhjZXB0aW9uVHlwZXMsIAorCQkJZXhjZXB0aW9uVHlwZVN0YXJ0cywgCisJCQlleGNlcHRpb25UeXBlRW5kcywgCisJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKSB7CisJLy8gTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0CisJLy8gbm93IHdlIHVwZGF0ZSB0aGUgcmV0dXJuVHlwZSBvZiB0aGUgbWV0aG9kCisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJaW50IGV4dGVuZGVkRGltcyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlleHRlbmRzRGltID0gZXh0ZW5kZWREaW1zOworCWlmIChleHRlbmRlZERpbXMgIT0gMCkgeworCQlUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUgPSBtZC5yZXR1cm5UeXBlOworCQltZC5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKKwkJaW50IGRpbXMgPSByZXR1cm5UeXBlLmRpbWVuc2lvbnMoKSArIGV4dGVuZGVkRGltczsKKwkJaW50IGJhc2VUeXBlOworCQlpZiAoKGJhc2VUeXBlID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHIgKyAxXSkgPCAwKSB7CisJCQkvL2l0IHdhcyBhIGJhc2VUeXBlCisJCQlpbnQgc291cmNlU3RhcnQgPSByZXR1cm5UeXBlLnNvdXJjZVN0YXJ0OworCQkJaW50IHNvdXJjZUVuZCA9IHJldHVyblR5cGUuc291cmNlRW5kOworCQkJcmV0dXJuVHlwZSA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWJhc2VUeXBlLCBkaW1zKTsKKwkJCXJldHVyblR5cGUuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJCXJldHVyblR5cGUuc291cmNlRW5kID0gc291cmNlRW5kOworCQkJbWQucmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisJCX0gZWxzZSB7CisJCQltZC5yZXR1cm5UeXBlID0gdGhpcy5jb3B5RGltcyhtZC5yZXR1cm5UeXBlLCBkaW1zKTsKKwkJfQorCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSkgeworCQkJbWQuYm9keVN0YXJ0ID0gZW5kUG9zaXRpb24gKyAxOworCQl9CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlck5hbWUoKSB7CisJLy8gTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgJ0lkZW50aWZpZXInICcoJworCU1ldGhvZERlY2xhcmF0aW9uIG1kID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKworCS8vbmFtZQorCW1kLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCXNlbGVjdG9yU291cmNlUG9zaXRpb25zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJLy90eXBlCisJbWQucmV0dXJuVHlwZSA9IGdldFR5cGVSZWZlcmVuY2UodHlwZURpbXMgPSBpbnRTdGFja1tpbnRQdHItLV0pOworCS8vbW9kaWZpZXJzCisJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwltZC5tb2RpZmllcnNTb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwltZC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvL2hpZ2hsaWdodCBzdGFydHMgYXQgc2VsZWN0b3Igc3RhcnQKKwltZC5zb3VyY2VTdGFydCA9IChpbnQpIChzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA+Pj4gMzIpOworCXB1c2hPbkFzdFN0YWNrKG1kKTsKKwltZC5ib2R5U3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1vZGlmaWVycygpIHsKKwljaGVja0Fubm90YXRpb24oKTsgLy8gbWlnaHQgdXBkYXRlIG1vZGlmaWVycyB3aXRoIEFjY0RlcHJlY2F0ZWQKKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnMpOyAvLyBtb2RpZmllcnMKKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnNTb3VyY2VTdGFydCk7CisJcHVzaE9uSW50U3RhY2soCisJCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiBtb2RpZmllcnNTb3VyY2VTdGFydCk7IAorCXJlc2V0TW9kaWZpZXJzKCk7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpIHsKKwkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCisJcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CisKKwlzdXBlci5jb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOworCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSBjb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2U7CisKKwlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKKwkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQsIAorCQlpbnRBcnJheVN0YWNrW2ludEFycmF5UHRyLS1dLCAKKwkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZmVyZW5jZS5nZXRJbXBvcnROYW1lKCksICcuJyksCisJCWltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHVzaE1vZGlmaWVycygpIHsKKwljaGVja0Fubm90YXRpb24oKTsgLy8gbWlnaHQgdXBkYXRlIG1vZGlmaWVycyB3aXRoIEFjY0RlcHJlY2F0ZWQKKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnMpOyAvLyBtb2RpZmllcnMKKwlpZiAobW9kaWZpZXJzU291cmNlU3RhcnQgPCAwKSB7CisJCXB1c2hPbkludFN0YWNrKC0xKTsKKwkJcHVzaE9uSW50U3RhY2soCisJCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID49IDAgPyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDogc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsgCisJfSBlbHNlIHsKKwkJcHVzaE9uSW50U3RhY2sobW9kaWZpZXJzU291cmNlU3RhcnQpOworCQlwdXNoT25JbnRTdGFjaygKKwkJCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiBtb2RpZmllcnNTb3VyY2VTdGFydCk7IAorCX0KKwlyZXNldE1vZGlmaWVycygpOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CisJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZQorCisJLyogcGVyc2lzdGluZyBqYXZhZG9jIHBvc2l0aW9ucyAqLworCXB1c2hPbkludEFycmF5U3RhY2sodGhpcy5nZXRKYXZhRG9jUG9zaXRpb25zKCkpOworCisJc3VwZXIuY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsKKwlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgYXN0U3RhY2tbYXN0UHRyXTsKKwlyZXF1ZXN0b3IuYWNjZXB0SW1wb3J0KAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwKKwkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZmVyZW5jZS5nZXRJbXBvcnROYW1lKCksICcuJyksCisJCWltcG9ydFJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJZmFsc2UpOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCkgeworCS8vIFN0YXRpY0luaXRpYWxpemVyIDo6PSAgU3RhdGljT25seSBCbG9jaworCS8vcHVzaCBhbiBJbml0aWFsaXplcgorCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisJc3VwZXIuY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCk7CisJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGFzdFN0YWNrW2FzdFB0cl07CisJcmVxdWVzdG9yLmFjY2VwdEluaXRpYWxpemVyKAorCQlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LAorCQlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCwKKwkJaW50QXJyYXlTdGFja1tpbnRBcnJheVB0ci0tXSwKKwkJQWNjU3RhdGljLCAKKwkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJaW5pdGlhbGl6ZXIuYmxvY2suc291cmNlU3RhcnQsCisJCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNPbmx5KCkgeworCS8vIFN0YXRpY09ubHkgOjo9ICdzdGF0aWMnCisJY2hlY2tBbm5vdGF0aW9uKCk7IC8vIG1pZ2h0IHVwZGF0ZSBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQKKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnNTb3VyY2VTdGFydCk7CisJcHVzaE9uSW50U3RhY2soCisJCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPj0gMCA/IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgOiBtb2RpZmllcnNTb3VyY2VTdGFydCk7IAorCWp1bXBPdmVyTWV0aG9kQm9keSgpOworCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSsrOworCXJlc2V0TW9kaWZpZXJzKCk7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgeworCS8vIFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZSAnLicgJyonCisKKwkvKiBwZXJzaXN0aW5nIGphdmFkb2MgcG9zaXRpb25zICovCisJcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CisKKwlzdXBlci5jb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7CisJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIGFzdFN0YWNrW2FzdFB0cl07CisJcmVxdWVzdG9yLmFjY2VwdEltcG9ydCgKKwkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQlpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQsCisJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHItLV0sCisJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpLCAKKwkJaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAorCQl0cnVlKTsKK30KK3B1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBlbmRQYXJzZShpbnQgYWN0KSB7CisJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgeworCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCX0KKwlyZXR1cm4gc3VwZXIuZW5kUGFyc2UoYWN0KTsKK30KKy8qCisgKiBGbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGEgZ2l2ZW4gcG9zaXRpb25zLgorICoKKyAqIE5vdGU6IGFubm90YXRpb25zIGFyZSBzdGFja2VkIGluIHN5bnRhY3RpY2FsIG9yZGVyCisgKgorICogRWl0aGVyIGFuc3dlciBnaXZlbiA8cG9zaXRpb24+LCBvciB0aGUgZW5kIHBvc2l0aW9uIG9mIGEgY29tbWVudCBsaW5lIAorICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSA8cG9zaXRpb24+IChzYW1lIGxpbmUpCisgKgorICogZS5nLgorICogdm9pZCBmb28oKXsKKyAqIH0gLy8gZW5kIG9mIG1ldGhvZCBmb28KKyAqLworIAorcHVibGljIGludCBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oaW50IHBvc2l0aW9uKSB7CisKKwlyZXR1cm4gbGFzdEZpZWxkRW5kUG9zaXRpb24gPSBzdXBlci5mbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8ocG9zaXRpb24pOworfQorcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgZ2V0VHlwZVJlZmVyZW5jZShpbnQgZGltKSB7IC8qIGJ1aWxkIGEgUmVmZXJlbmNlIG9uIGEgdmFyaWFibGUgdGhhdCBtYXkgYmUgcXVhbGlmaWVkIG9yIG5vdAorVGhpcyB2YXJpYWJsZSBpcyBhIHR5cGUgcmVmZXJlbmNlIGFuZCBkaW0gd2lsbCBiZSBpdHMgZGltZW5zaW9ucyovCisKKwlpbnQgbGVuZ3RoOworCVR5cGVSZWZlcmVuY2UgcmVmOworCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKKwkJLy8gc2luZ2xlIHZhcmlhYmxlIHJlZmVyZW5jZQorCQlpZiAoZGltID09IDApIHsKKwkJCXJlZiA9IAorCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCX0gZWxzZSB7CisJCQlyZWYgPSAKKwkJCQluZXcgQXJyYXlUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlkaW0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCX0KKwl9IGVsc2UgeworCQlpZiAobGVuZ3RoIDwgMCkgeyAvL2ZsYWcgZm9yIHByZWNvbXBpbGVkIHR5cGUgcmVmZXJlbmNlIG9uIGJhc2UgdHlwZXMKKwkJCXJlZiA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWxlbmd0aCwgZGltKTsKKwkJCXJlZi5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZi5zb3VyY2VFbmQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQl9IGVsc2UgeworCQkJCWludFB0ci0tOworCQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKKwkJCX0KKwkJfSBlbHNlIHsgLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCisJCQljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCQkJcG9zaXRpb25zLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGgpOyAKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZiA9IG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVmID0gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CisJCX0KKwl9OworCXJldHVybiByZWY7Cit9CitwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworCS8vcG9zaXRpb25uaW5nIHRoZSBwYXJzZXIgZm9yIGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQKKwkvL2F2b2lkaW5nIHN0YWNrIHJlYWxsb2NhdGlvbiBhbmQgYWxsIHRoYXQuLi4uCisJc3VwZXIuaW5pdGlhbGl6ZSgpOworCWludEFycmF5UHRyID0gLTE7Cit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcml2YXRlIGJvb2xlYW4gaXNMb2NhbERlY2xhcmF0aW9uKCkgeworCWludCBuZXN0ZWREZXB0aCA9IG5lc3RlZFR5cGU7CisJd2hpbGUgKG5lc3RlZERlcHRoID49IDApIHsKKwkJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWREZXB0aF0gIT0gMCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJbmVzdGVkRGVwdGgtLTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoKKyAqIEludmVzdGlnYXRlIG9uZSBlbnRpcmUgdW5pdC4KKyAqLworcHVibGljIHZvaWQgcGFyc2VDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB7CisJY2hhcltdIHJlZ2lvblNvdXJjZSA9IHVuaXQuZ2V0Q29udGVudHMoKTsKKwl0cnkgeworCQlpbml0aWFsaXplKCk7CisJCWdvRm9yQ29tcGlsYXRpb25Vbml0KCk7CisJCXJlZmVyZW5jZUNvbnRleHQgPQorCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLCAKKwkJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdCh1bml0LCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwgCisJCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsgCisJCXNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJfQorfQorLyoKKyAqIEludmVzdGlnYXRlIG9uZSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi4KKyAqLworcHVibGljIHZvaWQgcGFyc2VDb25zdHJ1Y3RvcihjaGFyW10gcmVnaW9uU291cmNlKSB7CisJdHJ5IHsKKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvckNsYXNzQm9keURlY2xhcmF0aW9ucygpOworCQlyZWZlcmVuY2VDb250ZXh0ID0gCisJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAorCQkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksIAorCQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAorCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCXBhcnNlKCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgeworCX0KK30KKy8qCisgKiBJbnZlc3RpZ2F0ZSBvbmUgZmllbGQgZGVjbGFyYXRpb24gc3RhdGVtZW50IChtaWdodCBoYXZlIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBpbiBpdCkuCisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlRmllbGQoY2hhcltdIHJlZ2lvblNvdXJjZSkgeworCXRyeSB7CisJCWluaXRpYWxpemUoKTsKKwkJZ29Gb3JGaWVsZERlY2xhcmF0aW9uKCk7CisJCXJlZmVyZW5jZUNvbnRleHQgPSAKKwkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCQluZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oCisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCisJCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwgCisJCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsgCisJCXNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJfQorCit9CisvKgorICogSW52ZXN0aWdhdGUgb25lIGltcG9ydCBzdGF0ZW1lbnQgZGVjbGFyYXRpb24uCisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlSW1wb3J0KGNoYXJbXSByZWdpb25Tb3VyY2UpIHsKKwl0cnkgeworCQlpbml0aWFsaXplKCk7CisJCWdvRm9ySW1wb3J0RGVjbGFyYXRpb24oKTsKKwkJcmVmZXJlbmNlQ29udGV4dCA9IAorCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLCAKKwkJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKKwkJCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOyAKKwkJc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQlzY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOworCQlwYXJzZSgpOworCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKKwl9CisKK30KKy8qCisgKiBJbnZlc3RpZ2F0ZSBvbmUgaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24uCisgKiByZWdpb25Tb3VyY2UgbmVlZCB0byBjb250ZW50IGV4YWN0bHkgYW4gaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24uCisgKiBlLmc6IHN0YXRpYyB7IGkgPSA0OyB9CisgKiB7IG5hbWUgPSAidGVzdCI7IH0KKyAqLworcHVibGljIHZvaWQgcGFyc2VJbml0aWFsaXplcihjaGFyW10gcmVnaW9uU291cmNlKSB7CisJdHJ5IHsKKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvckluaXRpYWxpemVyKCk7CisJCXJlZmVyZW5jZUNvbnRleHQgPSAKKwkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCQluZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24oCisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCisJCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocmVnaW9uU291cmNlLCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KSwgCisJCQkJCQlyZWdpb25Tb3VyY2UubGVuZ3RoKTsgCisJCXNjYW5uZXIucmVzZXRUbygwLCByZWdpb25Tb3VyY2UubGVuZ3RoKTsKKwkJc2Nhbm5lci5zZXRTb3VyY2UocmVnaW9uU291cmNlKTsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJfQorCit9CisvKgorICogSW52ZXN0aWdhdGUgb25lIG1ldGhvZCBkZWNsYXJhdGlvbi4KKyAqLworcHVibGljIHZvaWQgcGFyc2VNZXRob2QoY2hhcltdIHJlZ2lvblNvdXJjZSkgeworCXRyeSB7CisJCWluaXRpYWxpemUoKTsKKwkJZ29Gb3JHZW5lcmljTWV0aG9kRGVjbGFyYXRpb24oKTsKKwkJcmVmZXJlbmNlQ29udGV4dCA9IAorCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJY29tcGlsYXRpb25Vbml0ID0gCisJCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLCAKKwkJCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChyZWdpb25Tb3VyY2UsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpLCAKKwkJCQkJCXJlZ2lvblNvdXJjZS5sZW5ndGgpOyAKKwkJc2Nhbm5lci5yZXNldFRvKDAsIHJlZ2lvblNvdXJjZS5sZW5ndGgpOworCQlzY2FubmVyLnNldFNvdXJjZShyZWdpb25Tb3VyY2UpOworCQlwYXJzZSgpOworCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKKwl9CisKK30KKy8qCisgKiBJbnZlc3RpZ2F0ZSBvbmUgcGFja2FnZSBzdGF0ZW1lbnQgZGVjbGFyYXRpb24uCisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlUGFja2FnZShjaGFyW10gcmVnaW9uU291cmNlKSB7CisJdHJ5IHsKKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvclBhY2thZ2VEZWNsYXJhdGlvbigpOworCQlyZWZlcmVuY2VDb250ZXh0ID0gCisJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAorCQkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksIAorCQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAorCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCXBhcnNlKCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgeworCX0KKworfQorLyoKKyAqIEludmVzdGlnYXRlIG9uZSB0eXBlIGRlY2xhcmF0aW9uLCBpdHMgZmllbGRzLCBtZXRob2RzIGFuZCBtZW1iZXIgdHlwZXMuCisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlVHlwZShjaGFyW10gcmVnaW9uU291cmNlKSB7CisJdHJ5IHsKKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvclR5cGVEZWNsYXJhdGlvbigpOworCQlyZWZlcmVuY2VDb250ZXh0ID0gCisJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQljb21waWxhdGlvblVuaXQgPSAKKwkJCQkJbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKAorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCksIAorCQkJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHJlZ2lvblNvdXJjZSwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCksIAorCQkJCQkJcmVnaW9uU291cmNlLmxlbmd0aCk7IAorCQlzY2FubmVyLnJlc2V0VG8oMCwgcmVnaW9uU291cmNlLmxlbmd0aCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHJlZ2lvblNvdXJjZSk7CisJCXBhcnNlKCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgeworCX0KKworfQorLyoqCisgKiBSZXR1cm5zIHRoaXMgcGFyc2VyJ3MgcHJvYmxlbSByZXBvcnRlciBpbml0aWFsaXplZCB3aXRoIGl0cyByZWZlcmVuY2UgY29udGV4dC4KKyAqIEFsc28gaXQgaXMgYXNzdW1lZCB0aGF0IGEgcHJvYmxlbSBpcyBnb2luZyB0byBiZSByZXBvcnRlZCwgc28gaW5pdGlhbGl6ZXMKKyAqIHRoZSBjb21waWxhdGlvbiByZXN1bHQncyBsaW5lIHBvc2l0aW9ucy4KKyAqLworcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7CisJcHJvYmxlbVJlcG9ydGVyLnJlZmVyZW5jZUNvbnRleHQgPSByZWZlcmVuY2VDb250ZXh0OworCXJldHVybiBwcm9ibGVtUmVwb3J0ZXI7Cit9Citwcm90ZWN0ZWQgdm9pZCBwdXNoT25JbnRBcnJheVN0YWNrKGludFtdIHBvc2l0aW9ucykgeworCisJdHJ5IHsKKwkJaW50QXJyYXlTdGFja1srK2ludEFycmF5UHRyXSA9IHBvc2l0aW9uczsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJLy9pbnRQdHIgaXMgY29ycmVjdCAKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gaW50QXJyYXlTdGFjay5sZW5ndGg7CisJCWludCBvbGRTdGFja1tdW10gPSBpbnRBcnJheVN0YWNrOworCQlpbnRBcnJheVN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XVtdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBpbnRBcnJheVN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCWludEFycmF5U3RhY2tbaW50QXJyYXlQdHJdID0gcG9zaXRpb25zOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIHJlc2V0TW9kaWZpZXJzKCkgeworCXN1cGVyLnJlc2V0TW9kaWZpZXJzKCk7CisJZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IC0xOworfQorLyoKKyAqIFN5bnRheCBlcnJvciB3YXMgZGV0ZWN0ZWQuIFdpbGwgYXR0ZW1wdCB0byBwZXJmb3JtIHNvbWUgcmVjb3ZlcnkgYWN0aW9uIGluIG9yZGVyCisgKiB0byByZXN1bWUgdG8gdGhlIHJlZ3VsYXIgcGFyc2UgbG9vcC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lT25TeW50YXhFcnJvcigpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKgorICogQW5zd2VyIGEgY2hhciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBuYW1lIGZvcm1hdHRlZCBsaWtlOgorICogLSB0eXBlIG5hbWUgKyBkaW1lbnNpb25zCisgKiBFeGFtcGxlOgorICogIkFbXVtdIi50b0NoYXJBcnJheSgpCisgKiAiamF2YS5sYW5nLlN0cmluZyIudG9DaGFyQXJyYXkoKQorICovCitwcml2YXRlIGNoYXJbXSByZXR1cm5UeXBlTmFtZShUeXBlUmVmZXJlbmNlIHR5cGUpIHsKKwlpbnQgZGltZW5zaW9uID0gdHlwZS5kaW1lbnNpb25zKCk7CisJaWYgKGRpbWVuc2lvbiAhPSAwKSB7CisJCWNoYXJbXSBkaW1lbnNpb25zQXJyYXkgPSBuZXcgY2hhcltkaW1lbnNpb24gKiAyXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykgeworCQkJZGltZW5zaW9uc0FycmF5W2kqMl0gPSAnWyc7CisJCQlkaW1lbnNpb25zQXJyYXlbKGkqMikgKyAxXSA9ICddJzsKKwkJfQorCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpLCAKKwkJCWRpbWVuc2lvbnNBcnJheSk7IAorCX0KKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGUuZ2V0VHlwZU5hbWUoKSwgJy4nKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCJpbnRBcnJheVB0ciA9ICIgKyBpbnRBcnJheVB0ciArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKy8qKgorICogSU5URVJOQUwgVVNFIE9OTFkKKyAqLworcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSgKKwlpbnQgZGltLAorCWludCBsb2NhbElkZW50aWZpZXJQdHIsIAorCWludCBsb2NhbElkZW50aWZpZXJMZW5ndGhQdHIpIHsKKwkvKiBidWlsZCBhIFJlZmVyZW5jZSBvbiBhIHZhcmlhYmxlIHRoYXQgbWF5IGJlIHF1YWxpZmllZCBvciBub3QKKwkgKiBUaGlzIHZhcmlhYmxlIGlzIGEgdHlwZSByZWZlcmVuY2UgYW5kIGRpbSB3aWxsIGJlIGl0cyBkaW1lbnNpb25zLgorCSAqIFdlIGRvbid0IGhhdmUgYW55IHNpZGUgZWZmZWN0IG9uIHRoZSBzdGFja3MnIHBvaW50ZXJzLgorCSAqLworCisJaW50IGxlbmd0aDsKKwlUeXBlUmVmZXJlbmNlIHJlZjsKKwlpZiAoKGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tsb2NhbElkZW50aWZpZXJMZW5ndGhQdHJdKSA9PSAxKSB7CisJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKKwkJaWYgKGRpbSA9PSAwKSB7CisJCQlyZWYgPSAKKwkJCQluZXcgU2luZ2xlVHlwZVJlZmVyZW5jZSgKKwkJCQkJaWRlbnRpZmllclN0YWNrW2xvY2FsSWRlbnRpZmllclB0cl0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tsb2NhbElkZW50aWZpZXJQdHItLV0pOyAKKwkJfSBlbHNlIHsKKwkJCXJlZiA9IAorCQkJCW5ldyBBcnJheVR5cGVSZWZlcmVuY2UoCisJCQkJCWlkZW50aWZpZXJTdGFja1tsb2NhbElkZW50aWZpZXJQdHJdLCAKKwkJCQkJZGltLCAKKwkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbbG9jYWxJZGVudGlmaWVyUHRyLS1dKTsgCisJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CQkJCQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxlbmd0aCA8IDApIHsgLy9mbGFnIGZvciBwcmVjb21waWxlZCB0eXBlIHJlZmVyZW5jZSBvbiBiYXNlIHR5cGVzCisJCQlyZWYgPSBUeXBlUmVmZXJlbmNlLmJhc2VUeXBlUmVmZXJlbmNlKC1sZW5ndGgsIGRpbSk7CisJCQlyZWYuc291cmNlU3RhcnQgPSBpbnRTdGFja1tsb2NhbEludFB0ci0tXTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZi5zb3VyY2VFbmQgPSBpbnRTdGFja1tsb2NhbEludFB0ci0tXTsKKwkJCX0gZWxzZSB7CisJCQkJbG9jYWxJbnRQdHItLTsKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CisJCX0gZWxzZSB7IC8vUXVhbGlmaWVkIHZhcmlhYmxlIHJlZmVyZW5jZQorCQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJbG9jYWxJZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGxvY2FsSWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAorCQkJCWxvY2FsSWRlbnRpZmllclB0ciArIDEsIAorCQkJCXBvc2l0aW9ucywgCisJCQkJMCwgCisJCQkJbGVuZ3RoKTsgCisJCQlpZiAoZGltID09IDApCisJCQkJcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOworCQkJZWxzZQorCQkJCXJlZiA9IG5ldyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBkaW0sIHBvc2l0aW9ucyk7CisJCX0KKwl9OworCXJldHVybiByZWY7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWI1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7IAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworLyoqCisgKiBBIHZpc2l0b3IgaW50ZXJmYWNlIGZvciBpbnRlcmF0aW5nIHRocm91Z2ggdGhlIHBhcnNlIHRyZWUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgeworCXZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKTsKKwl2b2lkIGVuZFZpc2l0KEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFORF9BTkRfRXhwcmVzc2lvbiBhbmRfYW5kX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFyZ3VtZW50IGFyZ3VtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFycmF5UmVmZXJlbmNlIGFycmF5UmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFycmF5VHlwZVJlZmVyZW5jZSBhcnJheVR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQmxvY2sgYmxvY2ssIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQnJlYWsgYnJlYWtTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQ2FzZSBjYXNlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KENoYXJMaXRlcmFsIGNoYXJMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KENsYXNzTGl0ZXJhbEFjY2VzcyBjbGFzc0xpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQ2xpbml0IGNsaW5pdCwgQ2xhc3NTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoQ29tcG91bmRBc3NpZ25tZW50IGNvbXBvdW5kQXNzaWdubWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChDb250aW51ZSBjb250aW51ZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChEZWZhdWx0Q2FzZSBkZWZhdWx0Q2FzZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChEb1N0YXRlbWVudCBkb1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChEb3VibGVMaXRlcmFsIGRvdWJsZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoRXF1YWxFeHByZXNzaW9uIGVxdWFsRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBzdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXhwbGljaXRDb25zdHJ1Y3RvciwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXh0ZW5kZWRTdHJpbmdMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEZhbHNlTGl0ZXJhbCBmYWxzZUxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBNZXRob2RTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChGbG9hdExpdGVyYWwgZmxvYXRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KEludExpdGVyYWwgaW50TGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KExvY2FsVHlwZURlY2xhcmF0aW9uIGxvY2FsVHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KExvbmdMaXRlcmFsIGxvbmdMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KE1lbWJlclR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbnVsbExpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoT1JfT1JfRXhwcmVzc2lvbiBvcl9vcl9FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHF1YWxpZmllZE5hbWVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSBxdWFsaWZpZWRUaGlzUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIENsYXNzU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoU3VwZXJSZWZlcmVuY2Ugc3VwZXJSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCB0aHJvd1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChUcnVlTGl0ZXJhbCB0cnVlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlKTsKKwl2b2lkIGVuZFZpc2l0KFVuYXJ5RXhwcmVzc2lvbiB1bmFyeUV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCXZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQU5EX0FORF9FeHByZXNzaW9uIGFuZF9hbmRfRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQXJndW1lbnQgYXJndW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIENsYXNzU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChBcnJheVR5cGVSZWZlcmVuY2UgYXJyYXlUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBhc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChCbG9jayBibG9jaywgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChCcmVhayBicmVha1N0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChDYXNlIGNhc2VTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQ2hhckxpdGVyYWwgY2hhckxpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQ2xhc3NMaXRlcmFsQWNjZXNzIGNsYXNzTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChDbGluaXQgY2xpbml0LCBDbGFzc1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChDb21wb3VuZEFzc2lnbm1lbnQgY29tcG91bmRBc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KENvbnRpbnVlIGNvbnRpbnVlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KERlZmF1bHRDYXNlIGRlZmF1bHRDYXNlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KERvU3RhdGVtZW50IGRvU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KERvdWJsZUxpdGVyYWwgZG91YmxlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChFcXVhbEV4cHJlc3Npb24gZXF1YWxFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEVtcHR5U3RhdGVtZW50IHN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRlZFN0cmluZ0xpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoRmFsc2VMaXRlcmFsIGZhbHNlTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIE1ldGhvZFNjb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KEZsb2F0TGl0ZXJhbCBmbG9hdExpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChJZlN0YXRlbWVudCBpZlN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBDb21waWxhdGlvblVuaXRTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBpbml0aWFsaXplciwgTWV0aG9kU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoSW5zdGFuY2VPZkV4cHJlc3Npb24gaW5zdGFuY2VPZkV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoSW50TGl0ZXJhbCBpbnRMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZFN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoTG9jYWxUeXBlRGVjbGFyYXRpb24gbG9jYWxUeXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoTG9uZ0xpdGVyYWwgbG9uZ0xpdGVyYWwsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoTWVtYmVyVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBudWxsTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChPUl9PUl9FeHByZXNzaW9uIG9yX29yX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSBxdWFsaWZpZWRTdXBlclJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHF1YWxpZmllZFRoaXNSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFNpbmdsZU5hbWVSZWZlcmVuY2Ugc2luZ2xlTmFtZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChTdXBlclJlZmVyZW5jZSBzdXBlclJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoVGhpc1JlZmVyZW5jZSB0aGlzUmVmZXJlbmNlLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFRocm93U3RhdGVtZW50IHRocm93U3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFRydWVMaXRlcmFsIHRydWVMaXRlcmFsLCBCbG9ja1Njb3BlIHNjb3BlKTsKKwlib29sZWFuIHZpc2l0KFRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpOworCWJvb2xlYW4gdmlzaXQoVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSk7CisJYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyNjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQ29tcGlsZXJSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBjb21waWxhdGlvbiByZXN1bHRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElDb21waWxlclJlcXVlc3RvciB7CisJCisJLyoqCisJICogQWNjZXB0IGEgY29tcGlsYXRpb24gcmVzdWx0LgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCByZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEZWJ1Z1JlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEZWJ1Z1JlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOWFiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURlYnVnUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z1JlcXVlc3RvciB7CisKKwkvKgorCSAqIERlYnVnIGNhbGxiYWNrIG1ldGhvZCBhbGxvd2luZyB0byB0YWtlIGludG8gYWNjb3VudCBhIG5ldyBjb21waWxhdGlvbiByZXN1bHQuCisJICogQW55IHNpZGUtZWZmZWN0IHBlcmZvcm1lZCBvbiB0aGUgYWN0dWFsIHJlc3VsdCBtaWdodCBpbnRlcmZlcmUgd2l0aCB0aGUKKwkgKiBvcmlnaW5hbCBjb21waWxlciByZXF1ZXN0b3IsIGFuZCBzaG91bGQgYmUgcHJvaGliaXRlZC4KKwkgKi8KKwl2b2lkIGFjY2VwdERlYnVnUmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCk7CisKKwkvKgorCSAqIEFuc3dlcnMgdHJ1ZSB3aGVuIGluIGFjdGl2ZSBtb2RlCisJICovCisJYm9vbGVhbiBpc0FjdGl2ZSgpOworCQorCS8qIAorCSAqIEFjdGl2YXRlIGRlYnVnIGNhbGxiYWNrcworCSAqLwkKKwl2b2lkIGFjdGl2YXRlKCk7CisKKwkvKiAKKwkgKiBEZWFjdGl2YXRlIGRlYnVnIGNhbGxiYWNrcworCSAqLwkKKwl2b2lkIGRlYWN0aXZhdGUoKTsKKwkKKwkvKgorCSAqIFJlc2V0IGRlYnVnIHJlcXVlc3RvciBhZnRlciBjb21waWxhdGlvbiBoYXMgZmluaXNoZWQKKwkgKi8KKwl2b2lkIHJlc2V0KCk7Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURvY3VtZW50RWxlbWVudFJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmRjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURvY3VtZW50RWxlbWVudFJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsNDExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKKworLyoqCisgKiBQYXJ0IG9mIHRoZSBzb3VyY2UgZWxlbWVudCBwYXJzZXIgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSBvdXRwdXQuCisgKiBJdCBnZXRzIG5vdGlmaWVkIG9mIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYXMgdGhleSBhcmUgZGV0ZWN0ZWQsIHJlbHlpbmcKKyAqIG9uIHRoZSByZXF1ZXN0b3IgdG8gYXNzZW1ibGUgdGhlbSB0b2dldGhlciwgYmFzZWQgb24gdGhlIG5vdGlmaWNhdGlvbnMgaXQgZ290LgorICoKKyAqIFRoZSBzdHJ1Y3R1cmFsIGludmVzdGlnYXRpb24gaW5jbHVkZXM6CisgKiAtIHBhY2thZ2Ugc3RhdGVtZW50CisgKiAtIGltcG9ydCBzdGF0ZW1lbnRzCisgKiAtIHRvcC1sZXZlbCB0eXBlczogcGFja2FnZSBtZW1iZXIsIG1lbWJlciB0eXBlcyAobWVtYmVyIHR5cGVzIG9mIG1lbWJlciB0eXBlcy4uLikKKyAqIC0gZmllbGRzCisgKiAtIG1ldGhvZHMKKyAqCisgKiBJZiByZWZlcmVuY2UgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLCB0aGVuIGFsbCBzb3VyY2UgY29uc3RydWN0cyBhcmUKKyAqIGludmVzdGlnYXRlZCBhbmQgdHlwZSwgZmllbGQgJiBtZXRob2QgcmVmZXJlbmNlcyBhcmUgcHJvdmlkZWQgYXMgd2VsbC4KKyAqCisgKiBBbnkgKHBhcnNpbmcpIHByb2JsZW0gZW5jb3VudGVyZWQgaXMgYWxzbyBwcm92aWRlZC4KKyAqCisgKiBBbGwgcG9zaXRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgZXhhY3Qgc291cmNlIGZlZCB0byB0aGUgcGFyc2VyLgorICoKKyAqIEVsZW1lbnRzIHdoaWNoIGFyZSBjb21wbGV4IGFyZSBub3RpZmllZCBpbiB0d28gc3RlcHM6CisgKiAtIGVudGVyPEVsZW1lbnQ+IDogb25jZSB0aGUgZWxlbWVudCBoZWFkZXIgaGFzIGJlZW4gaWRlbnRpZmllZAorICogLSBleGl0PEVsZW1lbnQ+IDogb25jZSB0aGUgZWxlbWVudCBoYXMgYmVlbiBmdWxseSBjb25zdW1lZAorICoKKyAqIG90aGVyIHNpbXBsZXIgZWxlbWVudHMgKHBhY2thZ2UsIGltcG9ydCkgYXJlIHJlYWQgYWxsIGF0IG9uY2U6CisgKiAtIGFjY2VwdDxFbGVtZW50PgorICovCisgCitwdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IgeworLyoqCisgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrYWdlCisgKiAgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBkZWNsYXJhdGlvbkVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFja2FnZQorICogIGRlY2xhcmF0aW9uCisgKiBAcGFyYW0gamF2YURvY1Bvc2l0aW9ucyAtIGFuc3dlciBiYWNrIGFuIGFycmF5IG9mIHNvdXJjZVN0YXJ0L3NvdXJjZUVuZAorICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkIAorICogc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KKyAqIElmIG5vIEphdmFEb2MgaXMgYXZhaWxhYmxlLCB0aGVuIG51bGwgaXMgYW5zd2VyZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBhcnJheS4KKyAqIGUuZy4geyAxMCwgMjAsIDI1LCA0NSB9ICAtLT4gamF2YWRvYzEgZnJvbSAxMCB0byAyMCwgamF2YWRvYzIgZnJvbSAyNSB0byA0NQorICogVGhlIGFycmF5IGlzIGVxdWFscyB0byBudWxsIGlmIHRoZXJlIGFyZSBubyBqYXZhZG9jIGNvbW1lbnRzCisgKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCisgKiBAcGFyYW0gbmFtZVN0YXJ0UG9zaXRpb24gLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCisgKiAgbmFtZQorICogQHBhcmFtIG9uRGVtYW5kIC0gYSBib29sZWFuIGVxdWFscyB0byB0cnVlIGlmIHRoZSBpbXBvcnQgaXMgYW4gaW1wb3J0IG9uIGRlbWFuZAorICovCit2b2lkIGFjY2VwdEltcG9ydCgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwgCisJaW50IGRlY2xhcmF0aW9uRW5kLAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWNoYXJbXSBuYW1lLCAKKwlpbnQgbmFtZVN0YXJ0UG9zaXRpb24sCisJYm9vbGVhbiBvbkRlbWFuZCk7CisvKioKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2thZ2UKKyAqICBkZWNsYXJhdGlvbgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYWNrYWdlCisgKiAgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKiBUaGUgYXJyYXkgaXMgZXF1YWxzIHRvIG51bGwgaWYgdGhlcmUgYXJlIG5vIGphdmFkb2MgY29tbWVudHMKKyAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGluaXRpYWxpemVyCisgKiBAcGFyYW0gbW9kaWZpZXJzU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydAorICogIG9mIHRoZSB0ZXh0dWFsIG1vZGlmaWVycywgaXMgPCAwIGlmIHRoZXJlIGFyZSBubyB0ZXh0dWFsIG1vZGlmaWVycworICogQHBhcmFtIGJvZHlTdGFydCAtIHRoZSBwb3NpdGlvbiBvZiB0aGUgJ3snCisgKiBAcGFyYW0gYm9keUVuZCAtIHRoZSBwb3NpdGlvbiBvZiB0aGUgJ30nCisgKi8KK3ZvaWQgYWNjZXB0SW5pdGlhbGl6ZXIoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50IGRlY2xhcmF0aW9uRW5kLAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWludCBtb2RpZmllcnMsCisJaW50IG1vZGlmaWVyc1N0YXJ0LAorCWludCBib2R5U3RhcnQsCisJaW50IGJvZHlFbmQpOworLyoKKyAqIFRhYmxlIG9mIGxpbmUgc2VwYXJhdG9yIHBvc2l0aW9uLiBUaGlzIHRhYmxlIGlzIHBhc3NlZCBvbmNlIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBwYXJzZSBhY3Rpb24sIHNvIGFzIHRvIGFsbG93IGNvbXB1dGF0aW9uIG9mIG5vcm1hbGl6ZWQgcmFuZ2VzLgorICoKKyAqIEEgbGluZSBzZXBhcmF0b3IgbWlnaHQgY29ycmVzcG9uZHMgdG8gc2V2ZXJhbCBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2UsCisgKiAKKyAqLwordm9pZCBhY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKGludFtdIHBvc2l0aW9ucyk7CisvKioKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2thZ2UKKyAqICBkZWNsYXJhdGlvbgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYWNrYWdlCisgKiAgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKiBUaGUgYXJyYXkgaXMgZXF1YWxzIHRvIG51bGwgaWYgdGhlcmUgYXJlIG5vIGphdmFkb2MgY29tbWVudHMKKyAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAqIEBwYXJhbSBuYW1lU3RhcnRQb3NpdGlvbiAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICBuYW1lCisgKi8KK3ZvaWQgYWNjZXB0UGFja2FnZSgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwgCisJaW50IGRlY2xhcmF0aW9uRW5kLAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWNoYXJbXSBuYW1lLCAKKwlpbnQgbmFtZVN0YXJ0UG9zaXRpb24pOworLyoqCisgKiBAcGFyYW0gcHJvYmxlbSAtIFVzZWQgdG8gcmVwb3J0IGEgcHJvYmxlbSB3aGlsZSBydW5uaW5nIHRoZSBKRE9NCisgKi8KK3ZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKTsKKy8qKgorICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydAorICogIG9mIHRoaXMgY2xhc3MuCisgKiBAcGFyYW0gamF2YURvY1Bvc2l0aW9ucyAtIGFuc3dlciBiYWNrIGFuIGFycmF5IG9mIHNvdXJjZVN0YXJ0L3NvdXJjZUVuZAorICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkIAorICogc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KKyAqIElmIG5vIEphdmFEb2MgaXMgYXZhaWxhYmxlLCB0aGVuIG51bGwgaXMgYW5zd2VyZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBhcnJheS4KKyAqIGUuZy4geyAxMCwgMjAsIDI1LCA0NSB9ICAtLT4gamF2YWRvYzEgZnJvbSAxMCB0byAyMCwgamF2YWRvYzIgZnJvbSAyNSB0byA0NQorICogVGhlIGFycmF5IGlzIGVxdWFscyB0byBudWxsIGlmIHRoZXJlIGFyZSBubyBqYXZhZG9jIGNvbW1lbnRzCisgKiBAcGFyYW0gbW9kaWZpZXJzIC0gdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBjbGFzcworICogQHBhcmFtIG1vZGlmaWVyc1N0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQKKyAqICBvZiB0aGUgdGV4dHVhbCBtb2RpZmllcnMsIGlzIDwgMCBpZiB0aGVyZSBhcmUgbm8gdGV4dHVhbCBtb2RpZmllcnMKKyAqIEBwYXJhbSBjbGFzc1N0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQKKyAqICBvZiB0aGUga2V5d29yZCAnY2xhc3MnCisgKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICogQHBhcmFtIG5hbWVTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gbmFtZUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbmFtZQorICogQHBhcmFtIHN1cGVyY2xhc3MgLSB0aGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcworICogQHBhcmFtIHN1cGVyY2xhc3NTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0CisgKiAgb2YgdGhlIHN1cGVyY2xhc3MgbmFtZQorICogQHBhcmFtIHN1cGVyY2xhc3NFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlCisgKiAgc3VwZXJjbGFzcyBuYW1lCisgKiBAcGFyYW0gc3VwZXJpbnRlcmZhY2VzIC0gdGhlIG5hbWUgb2YgdGhlIHN1cGVyaW50ZXJmYWNlcworICogQHBhcmFtIHN1cGVyaW50ZXJmYWNlU3RhcnRzIC0gYW4gYXJyYXkgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nCisgKiAgdG8gdGhlIHN0YXJ0IG9mIHRoZWlyIHJlc3BlY3RpdmUgc3VwZXJpbnRlcmZhY2UgbmFtZXMKKyAqIEBwYXJhbSBzdXBlcmludGVyZmFjZUVuZHMgLSBhbiBhcnJheSBvZiBzb3VyY2UgcG9zaXRpb25zIGNvcnJlc3BvbmRpbmcKKyAqICB0byB0aGUgZW5kIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3VwZXJpbnRlcmZhY2UgbmFtZXMKKyAqIEBwYXJhbSBib2R5U3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcGVuIGJyYWNrZXQKKyAqICBvZiB0aGUgY2xhc3MgYm9keQorICovCit2b2lkIGVudGVyQ2xhc3MoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywKKwlpbnQgbW9kaWZpZXJzLAorCWludCBtb2RpZmllcnNTdGFydCwKKwlpbnQgY2xhc3NTdGFydCwgCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTdGFydCwKKwlpbnQgbmFtZUVuZCwKKwljaGFyW10gc3VwZXJjbGFzcywKKwlpbnQgc3VwZXJjbGFzc1N0YXJ0LAorCWludCBzdXBlcmNsYXNzRW5kLAorCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywKKwlpbnRbXSBzdXBlcmludGVyZmFjZVN0YXJ0cywKKwlpbnRbXSBzdXBlcmludGVyZmFjZUVuZHMsCisJaW50IGJvZHlTdGFydCk7Cit2b2lkIGVudGVyQ29tcGlsYXRpb25Vbml0KCk7CisvKioKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAorICogIG9mIHRoaXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKiBUaGUgYXJyYXkgaXMgZXF1YWxzIHRvIG51bGwgaWYgdGhlcmUgYXJlIG5vIGphdmFkb2MgY29tbWVudHMKKyAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yIGNvbnZlcnRlZCB0byBhIGZsYWcKKyAqIEBwYXJhbSBtb2RpZmllcnNTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICB0ZXh0dWFsIG1vZGlmaWVycworICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIGNvbnN0cnVjdG9yCisgKiBAcGFyYW0gbmFtZVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gbmFtZUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgLSBhIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgbmFtZXMKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlU3RhcnRzIC0gYSBsaXN0IG9mIHNvdXJjZSBwb3NpdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqICBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBwYXJhbWV0ZXIgdHlwZSBuYW1lCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZUVuZHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogIGxhc3QgY2hhcmFjdGVyIG9mIGVhY2ggcGFyYW1ldGVyIHR5cGUgbmFtZQorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIC0gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycworICogQHBhcmFtIHBhcmFtZXRlcnNFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICBwYXJhbWV0ZXIgbGlzdAorICogQHBhcmFtIGV4Y2VwdGlvblR5cGVzIC0gYSBsaXN0IG9mIHRoZSBleGNlcHRpb24gdHlwZXMKKyAqIEBwYXJhbSBleGNlcHRpb25UeXBlU3RhcnRzIC0gYSBsaXN0IG9mIHNvdXJjZSBwb3NpdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QKKyAqICBjaGFyYWN0ZXIgb2YgdGhlIHJlc3BlY3RpdmUgZXhjZXB0aW9uIHR5cGVzCisgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZUVuZHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0CisgKiAgY2hhcmFjdGVyIG9mIHRoZSByZXNwZWN0aXZlIGV4Y2VwdGlvbiB0eXBlcworICogQHBhcmFtIGJvZHlTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgCisgKiAgY29uc3RydWN0b3IncyBib2R5CisgKi8KK3ZvaWQgZW50ZXJDb25zdHJ1Y3RvcigKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnQgbW9kaWZpZXJzLAorCWludCBtb2RpZmllcnNTdGFydCwgCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTdGFydCwKKwlpbnQgbmFtZUVuZCwKKwljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZUVuZHMsCQkJCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVTdGFydHMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVFbmRzLAorCWludCBwYXJhbWV0ZXJzRW5kLAkKKwljaGFyW11bXSBleGNlcHRpb25UeXBlcywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZVN0YXJ0cywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZUVuZHMsCisJaW50IGJvZHlTdGFydCk7CisvKioKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAorICogIG9mIHRoaXMgZmllbGQKKyAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKiBUaGUgYXJyYXkgaXMgZXF1YWxzIHRvIG51bGwgaWYgdGhlcmUgYXJlIG5vIGphdmFkb2MgY29tbWVudHMKKyAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGZpZWxkIGNvbnZlcnRlZCB0byBhIGZsYWcKKyAqIEBwYXJhbSBtb2RpZmllcnNTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICB0ZXh0dWFsIG1vZGlmaWVycworICogQHBhcmFtIHR5cGUgLSB0aGUgbmFtZSBvZiB0aGUgZmllbGQgdHlwZQorICogQHBhcmFtIHR5cGVTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWVsZHMgdHlwZQorICogQHBhcmFtIHR5cGVFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGZpZWxkcyB0eXBlCisgKiBAcGFyYW0gdHlwZURpbWVuc2lvbkNvdW50IC0gdGhlIGFycmF5IGRpbWVuc2lvbiBpbmRpY2F0ZWQgb24gdGhlIHR5cGUsIGkuZS4gaW50W10gdgorICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIGNvbnN0cnVjdG9yCisgKiBAcGFyYW0gbmFtZVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gbmFtZUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gZXh0ZW5kZWRUeXBlRGltZW5zaW9uQ291bnQgLSB0aGUgYXJyYXkgZGltZW5zaW9uIGluZGljYXRlZCBvbiB0aGUgdmFyaWFibGUsCisgKiAgaS5lLiBpbnQgdltdCisgKiBAcGFyYW0gZXh0ZW5kZWRUeXBlRGltbmVzaW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mCisgKiAgdGhlIGV4dGVuZWQgdHlwZSBkaW1lbnNpb24uIFRoaXMgcG9zaXRpb24gc2hvdWxkIGJlIC0xIGluIGNhc2UgdGhlcmUgaXMgbm8gZXh0ZW5kZWQKKyAqICBkaW1lbnNpb24gZm9yIHRoZSB0eXBlLgorICovCit2b2lkIGVudGVyRmllbGQoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50IG1vZGlmaWVycywKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCisJY2hhcltdIHR5cGUsCisJaW50IHR5cGVTdGFydCwKKwlpbnQgdHlwZUVuZCwKKyAJaW50IHR5cGVEaW1lbnNpb25Db3VudCwKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LAorCWludCBuYW1lRW5kLAorCWludCBleHRlbmRlZFR5cGVEaW1lbnNpb25Db3VudCwKKwlpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uRW5kKTsKKy8qKgorICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydAorICogIG9mIHRoaXMgY2xhc3MuCisgKiBAcGFyYW0gamF2YURvY1Bvc2l0aW9ucyAtIGFuc3dlciBiYWNrIGFuIGFycmF5IG9mIHNvdXJjZVN0YXJ0L3NvdXJjZUVuZAorICogcG9zaXRpb25zIG9mIHRoZSBhdmFpbGFibGUgSmF2YURvYyBjb21tZW50cy4gVGhlIGFycmF5IGlzIGEgZmxhdHRlbmVkIAorICogc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KKyAqIElmIG5vIEphdmFEb2MgaXMgYXZhaWxhYmxlLCB0aGVuIG51bGwgaXMgYW5zd2VyZWQgaW5zdGVhZCBvZiBhbiBlbXB0eSBhcnJheS4KKyAqIGUuZy4geyAxMCwgMjAsIDI1LCA0NSB9ICAtLT4gamF2YWRvYzEgZnJvbSAxMCB0byAyMCwgamF2YWRvYzIgZnJvbSAyNSB0byA0NQorICogVGhlIGFycmF5IGlzIGVxdWFscyB0byBudWxsIGlmIHRoZXJlIGFyZSBubyBqYXZhZG9jIGNvbW1lbnRzCisgKiBAcGFyYW0gbW9kaWZpZXJzIC0gdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBjbGFzcworICogQHBhcmFtIG1vZGlmaWVyc1N0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQKKyAqICBvZiB0aGUgdGV4dHVhbCBtb2RpZmllcnMsIGlzIDwgMCBpZiB0aGVyZSBhcmUgbm8gdGV4dHVhbCBtb2RpZmllcnMKKyAqIEBwYXJhbSBpbnRlcmZhY2VTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0CisgKiAgb2YgdGhlIGtleXdvcmQgJ2ludGVyZmFjZScKKyAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgKiBAcGFyYW0gbmFtZVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIG5hbWUKKyAqIEBwYXJhbSBuYW1lRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gc3VwZXJpbnRlcmZhY2VzIC0gdGhlIG5hbWUgb2YgdGhlIHN1cGVyaW50ZXJmYWNlcworICogQHBhcmFtIHN1cGVyaW50ZXJmYWNlU3RhcnRzIC0gYW4gYXJyYXkgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nCisgKiAgdG8gdGhlIHN0YXJ0IG9mIHRoZWlyIHJlc3BlY3RpdmUgc3VwZXJpbnRlcmZhY2UgbmFtZXMKKyAqIEBwYXJhbSBzdXBlcmludGVyZmFjZUVuZHMgLSBhbiBhcnJheSBvZiBzb3VyY2UgcG9zaXRpb25zIGNvcnJlc3BvbmRpbmcKKyAqICB0byB0aGUgZW5kIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3VwZXJpbnRlcmZhY2UgbmFtZXMKKyAqIEBwYXJhbSBib2R5U3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcGVuIGJyYWNrZXQKKyAqICBvZiB0aGUgY2xhc3MgYm9keQorICovCit2b2lkIGVudGVySW50ZXJmYWNlKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCQorCWludCBtb2RpZmllcnMsCisJaW50IG1vZGlmaWVyc1N0YXJ0LAorCWludCBpbnRlcmZhY2VTdGFydCwKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LAorCWludCBuYW1lRW5kLAorCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywKKwlpbnRbXSBzdXBlcmludGVyZmFjZVN0YXJ0cywKKwlpbnRbXSBzdXBlcmludGVyZmFjZUVuZHMsCisJaW50IGJvZHlTdGFydCk7CisvKioKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAorICogIG9mIHRoaXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBqYXZhRG9jUG9zaXRpb25zIC0gYW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kCisgKiBwb3NpdGlvbnMgb2YgdGhlIGF2YWlsYWJsZSBKYXZhRG9jIGNvbW1lbnRzLiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgCisgKiBzdHJ1Y3R1cmU6IDIqbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLgorICogSWYgbm8gSmF2YURvYyBpcyBhdmFpbGFibGUsIHRoZW4gbnVsbCBpcyBhbnN3ZXJlZCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5LgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKiBUaGUgYXJyYXkgaXMgZXF1YWxzIHRvIG51bGwgaWYgdGhlcmUgYXJlIG5vIGphdmFkb2MgY29tbWVudHMKKyAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yIGNvbnZlcnRlZCB0byBhIGZsYWcKKyAqIEBwYXJhbSBtb2RpZmllcnNTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICB0ZXh0dWFsIG1vZGlmaWVycworICogQHBhcmFtIHJldHVyblR5cGUgLSB0aGUgbmFtZSBvZiB0aGUgcmV0dXJuIHR5cGUKKyAqIEBwYXJhbSByZXR1cm5UeXBlU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqICBvZiB0aGUgcmV0dXJuIHR5cGUKKyAqIEBwYXJhbSByZXR1cm5UeXBlRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAqICBvZiB0aGUgcmV0dXJuIHR5cGUKKyAqIEBwYXJhbSByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQgLSB0aGUgYXJyYXkgZGltZW5zaW9uIGNvdW50IGFzIHN1cHBsaWVkIG9uIHRoZQorICogIHJldHVybiB0eXBlLCBpLmUuIHB1YmxpYyBpbnRbXSBmb28oKSB7fQorICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIGNvbnN0cnVjdG9yCisgKiBAcGFyYW0gbmFtZVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gbmFtZUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgLSBhIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgbmFtZXMKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlU3RhcnRzIC0gYSBsaXN0IG9mIHNvdXJjZSBwb3NpdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqICBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBwYXJhbWV0ZXIgdHlwZSBuYW1lCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZUVuZHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogIGxhc3QgY2hhcmFjdGVyIG9mIGVhY2ggcGFyYW1ldGVyIHR5cGUgbmFtZQorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIC0gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycworICogQHBhcmFtIHBhcmFtZXRlcnNFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAqICBwYXJhbWV0ZXIgbGlzdAorICogQHBhcmFtIGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50IC0gdGhlIGFycmF5IGRpbWVuc2lvbiBjb3VudCBhcyBzdXBwbGllZCBvbiB0aGUKKyAqICBlbmQgb2YgdGhlIHBhcmFtZXRlciBsaXN0LCBpLmUuIHB1YmxpYyBpbnQgZm9vKClbXSB7fQorICogQHBhcmFtIGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyCisgKiAgb2YgdGhlIGV4dGVuZGVkIHJldHVybiB0eXBlIGRpbWVuc2lvbi4gVGhpcyBwb3NpdGlvbiBzaG91bGQgYmUgLTEgaW4gY2FzZSB0aGVyZSBpcyBubyBleHRlbmRlZAorICogIGRpbWVuc2lvbiBmb3IgdGhlIHR5cGUuCisgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZXMgLSBhIGxpc3Qgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlcworICogQHBhcmFtIGV4Y2VwdGlvblR5cGVTdGFydHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdAorICogIGNoYXJhY3RlciBvZiB0aGUgcmVzcGVjdGl2ZSBleGNlcHRpb24gdHlwZXMKKyAqIEBwYXJhbSBleGNlcHRpb25UeXBlRW5kcyAtIGEgbGlzdCBvZiBzb3VyY2UgcG9zaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QKKyAqICBjaGFyYWN0ZXIgb2YgdGhlIHJlc3BlY3RpdmUgZXhjZXB0aW9uIHR5cGVzCisgKiBAcGFyYW0gYm9keVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhpcyAKKyAqICBtZXRob2QncyBib2R5CisgKi8KK3ZvaWQgZW50ZXJNZXRob2QoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50IG1vZGlmaWVycywKKwlpbnQgbW9kaWZpZXJzU3RhcnQsIAorCWNoYXJbXSByZXR1cm5UeXBlLAorCWludCByZXR1cm5UeXBlU3RhcnQsCisJaW50IHJldHVyblR5cGVFbmQsCisgCWludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTdGFydCwKKwlpbnQgbmFtZUVuZCwKKwljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZUVuZHMsCQkJCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVTdGFydHMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVFbmRzLAorCWludCBwYXJhbWV0ZXJzRW5kLAorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25Db3VudCwKKwlpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uRW5kLAkKKwljaGFyW11bXSBleGNlcHRpb25UeXBlcywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZVN0YXJ0cywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZUVuZHMsCisJaW50IGJvZHlTdGFydCk7CisvKioKKyAqIEBwYXJhbSBib2R5RW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2xvc2luZyBicmFja2V0IG9mIHRoZSBjbGFzcworICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBjbGFzcworICogIGRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KKyAqLwordm9pZCBleGl0Q2xhc3MoCisJaW50IGJvZHlFbmQsCisJaW50IGRlY2xhcmF0aW9uRW5kKTsKKy8qKgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisgKi8KK3ZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdCgKKwlpbnQgZGVjbGFyYXRpb25FbmQpOworLyoqCisgKiBAcGFyYW0gYm9keUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsb3NpbmcgYnJhY2tldCBvZiB0aGUgbWV0aG9kCisgKiBAcGFyYW0gZGVjbGFyYXRpb25FbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZAorICogIGRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KKyAqLwordm9pZCBleGl0Q29uc3RydWN0b3IoCisJaW50IGJvZHlFbmQsCisJaW50IGRlY2xhcmF0aW9uRW5kKTsKKy8qKgorICogQHBhcmFtIGJvZHlFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBmaWVsZC4KKyAqICBUaGlzIGNhbiBpbmNsdWRlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGZvbGxvd2luZyB0aGUgc2VtaS1jb2xvbi4KKyAqLwordm9pZCBleGl0RmllbGQoCisJaW50IGJvZHlFbmQsCisJaW50IGRlY2xhcmF0aW9uRW5kKTsKKy8qKgorICogQHBhcmFtIGJvZHlFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9zaW5nIGJyYWNrZXQgb2YgdGhlIGludGVyZmFjZQorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBpbnRlcmZhY2UKKyAqICBkZWNsYXJhdGlvbi4gIFRoaXMgY2FuIGluY2x1ZGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgZm9sbG93aW5nIHRoZSBjbG9zaW5nIGJyYWNrZXQuCisgKi8KK3ZvaWQgZXhpdEludGVyZmFjZSgKKwlpbnQgYm9keUVuZCwKKwlpbnQgZGVjbGFyYXRpb25FbmQpOworLyoqCisgKiBAcGFyYW0gYm9keUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsb3NpbmcgYnJhY2tldCBvZiB0aGUgbWV0aG9kCisgKiBAcGFyYW0gZGVjbGFyYXRpb25FbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIG1ldGhvZAorICogIGRlY2xhcmF0aW9uLiAgVGhpcyBjYW4gaW5jbHVkZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgYnJhY2tldC4KKyAqLwordm9pZCBleGl0TWV0aG9kKAorCWludCBib2R5RW5kLAorCWludCBkZWNsYXJhdGlvbkVuZCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRXJyb3JIYW5kbGluZ1BvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CisKKy8qCisgKiBIYW5kbGVyIHBvbGljeSBpcyByZXNwb25zaWJsZSB0byBhbnN3ZXIgdGhlIDIgZm9sbG93aW5nCisgKiBxdWVzdGlvbnM6CisgKiAxLiBzaG91bGQgdGhlIGhhbmRsZXIgc3RvcCBvbiBmaXJzdCBwcm9ibGVtIHdoaWNoIGFwcGVhcnMKKyAqCXRvIGJlIGEgcmVhbCBlcnJvciAoaS5lLiBub3QgYSB3YXJuaW5nKSwKKyAqIDIuIHNob3VsZCBpdCBwcm9jZWVkIG9uY2UgaXQgaGFzIGdhdGhlcmVkIGFsbCBwcm9ibGVtcworICoKKyAqIFRoZSBpbnRlbnQgaXMgdGhhdCBvbmUgY2FuIHN1cHBseSBpdHMgb3duIHBvbGljeSB0byBpbXBsZW1lbnQgCisgKiBzb21lIGludGVyYWN0aXZlIGVycm9yIGhhbmRsaW5nIHN0cmF0ZWd5IHdoZXJlIHNvbWUgVUkgd291bGQgCisgKiBkaXNwbGF5IHByb2JsZW1zIGFuZCBhc2sgdXNlciBpZiBoZSB3YW50cyB0byBwcm9jZWVkIG9yIG5vdC4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElFcnJvckhhbmRsaW5nUG9saWN5IHsKKwlib29sZWFuIHByb2NlZWRPbkVycm9ycygpOworCWJvb2xlYW4gc3RvcE9uRmlyc3RFcnJvcigpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzgxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVByb2JsZW1GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CisKKy8qCisgKiBGYWN0b3J5IHVzZWQgZnJvbSBpbnNpZGUgdGhlIGNvbXBpbGVyIHRvIGJ1aWxkIHRoZSBhY3R1YWwgcHJvYmxlbXMKKyAqIHdoaWNoIGFyZSBoYW5kZWQgYmFjayBpbiB0aGUgY29tcGlsYXRpb24gcmVzdWx0LgorICoKKyAqIFRoaXMgYWxsb3dzIHNoYXJpbmcgdGhlIGludGVybmFsIHByb2JsZW0gcmVwcmVzZW50YXRpb24gd2l0aCB0aGUgZW52aXJvbm1lbnQuCisgKgorICogTm90ZTogVGhlIGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyBhbmQgc3RvcmluZyBhIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlLgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1GYWN0b3J5IHsKKworCUlQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCQlpbnQgcHJvYmxlbUlkLAorCQlTdHJpbmdbXSBhcmd1bWVudHMsCisJCWludCBzZXZlcml0eSwKKwkJaW50IHN0YXJ0UG9zaXRpb24sCisJCWludCBlbmRQb3NpdGlvbiwKKwkJaW50IGxpbmVOdW1iZXIpOworCQkKKwlMb2NhbGUgZ2V0TG9jYWxlKCk7CisJCisJU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoaW50IHByb2JsZW1JZCwgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cyk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDNhNWVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworCisvKgorICogUGFydCBvZiB0aGUgc291cmNlIGVsZW1lbnQgcGFyc2VyIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgb3V0cHV0LgorICogSXQgZ2V0cyBub3RpZmllZCBvZiBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFzIHRoZXkgYXJlIGRldGVjdGVkLCByZWx5aW5nCisgKiBvbiB0aGUgcmVxdWVzdG9yIHRvIGFzc2VtYmxlIHRoZW0gdG9nZXRoZXIsIGJhc2VkIG9uIHRoZSBub3RpZmljYXRpb25zIGl0IGdvdC4KKyAqCisgKiBUaGUgc3RydWN0dXJhbCBpbnZlc3RpZ2F0aW9uIGluY2x1ZGVzOgorICogLSBwYWNrYWdlIHN0YXRlbWVudAorICogLSBpbXBvcnQgc3RhdGVtZW50cworICogLSB0b3AtbGV2ZWwgdHlwZXM6IHBhY2thZ2UgbWVtYmVyLCBtZW1iZXIgdHlwZXMgKG1lbWJlciB0eXBlcyBvZiBtZW1iZXIgdHlwZXMuLi4pCisgKiAtIGZpZWxkcworICogLSBtZXRob2RzCisgKgorICogSWYgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCwgdGhlbiBhbGwgc291cmNlIGNvbnN0cnVjdHMgYXJlCisgKiBpbnZlc3RpZ2F0ZWQgYW5kIHR5cGUsIGZpZWxkICYgbWV0aG9kIHJlZmVyZW5jZXMgYXJlIHByb3ZpZGVkIGFzIHdlbGwuCisgKgorICogQW55IChwYXJzaW5nKSBwcm9ibGVtIGVuY291bnRlcmVkIGlzIGFsc28gcHJvdmlkZWQuCisgKgorICogQWxsIHBvc2l0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGV4YWN0IHNvdXJjZSBmZWQgdG8gdGhlIHBhcnNlci4KKyAqCisgKiBFbGVtZW50cyB3aGljaCBhcmUgY29tcGxleCBhcmUgbm90aWZpZWQgaW4gdHdvIHN0ZXBzOgorICogLSBlbnRlcjxFbGVtZW50PiA6IG9uY2UgdGhlIGVsZW1lbnQgaGVhZGVyIGhhcyBiZWVuIGlkZW50aWZpZWQKKyAqIC0gZXhpdDxFbGVtZW50PiA6IG9uY2UgdGhlIGVsZW1lbnQgaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQKKyAqCisgKiBvdGhlciBzaW1wbGVyIGVsZW1lbnRzIChwYWNrYWdlLCBpbXBvcnQpIGFyZSByZWFkIGFsbCBhdCBvbmNlOgorICogLSBhY2NlcHQ8RWxlbWVudD4KKyAqLworIAorcHVibGljIGludGVyZmFjZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciB7Cit2b2lkIGFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IGFyZ0NvdW50LCBpbnQgc291cmNlUG9zaXRpb24pOwordm9pZCBhY2NlcHRGaWVsZFJlZmVyZW5jZShjaGFyW10gZmllbGROYW1lLCBpbnQgc291cmNlUG9zaXRpb24pOworLyoqCisgKiBAcGFyYW0gZGVjbGFyYXRpb25TdGFydCBUaGlzIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQorICoJCSAgCQkJCSAgIGltcG9ydCBrZXl3b3JkLgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIFRoaXMgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAnOycgZW5kaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50CisgKgkJCQkJCSBvciB0aGUgZW5kIG9mIHRoZSBjb21tZW50IGZvbGxvd2luZyB0aGUgaW1wb3J0LgorICogQHBhcmFtIG5hbWUgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0IGxpa2Ugc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgaW5jbHVkaW5nIHRoZSBkb3RzLiBUaGUgJy4qJworICogICAgICAgICAgICAgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gdGhlIG5hbWUuCisgKiBAcGFyYW0gb25EZW1hbmQgc2V0IHRvIHRydWUgaWYgdGhlIGltcG9ydCBpcyBhbiBpbXBvcnQgb24gZGVtYW5kIChlLmcuIGltcG9ydCBqYXZhLmlvLiopLiBGYWxzZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgYWNjZXB0SW1wb3J0KAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBkZWNsYXJhdGlvbkVuZCwKKwljaGFyW10gbmFtZSwKKwlib29sZWFuIG9uRGVtYW5kKTsKKy8qCisgKiBUYWJsZSBvZiBsaW5lIHNlcGFyYXRvciBwb3NpdGlvbi4gVGhpcyB0YWJsZSBpcyBwYXNzZWQgb25jZSBhdCB0aGUgZW5kCisgKiBvZiB0aGUgcGFyc2UgYWN0aW9uLCBzbyBhcyB0byBhbGxvdyBjb21wdXRhdGlvbiBvZiBub3JtYWxpemVkIHJhbmdlcy4KKyAqCisgKiBBIGxpbmUgc2VwYXJhdG9yIG1pZ2h0IGNvcnJlc3BvbmRzIHRvIHNldmVyYWwgY2hhcmFjdGVycyBpbiB0aGUgc291cmNlLAorICogCisgKi8KK3ZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpOwordm9pZCBhY2NlcHRNZXRob2RSZWZlcmVuY2UoY2hhcltdIG1ldGhvZE5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKTsKK3ZvaWQgYWNjZXB0UGFja2FnZSgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgZGVjbGFyYXRpb25FbmQsCisJY2hhcltdIG5hbWUpOwordm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pOwordm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHR5cGVOYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpOwordm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKTsKK3ZvaWQgYWNjZXB0VW5rbm93blJlZmVyZW5jZShjaGFyW11bXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpOwordm9pZCBhY2NlcHRVbmtub3duUmVmZXJlbmNlKGNoYXJbXSBuYW1lLCBpbnQgc291cmNlUG9zaXRpb24pOwordm9pZCBlbnRlckNsYXNzKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBtb2RpZmllcnMsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTb3VyY2VTdGFydCwKKwlpbnQgbmFtZVNvdXJjZUVuZCwKKwljaGFyW10gc3VwZXJjbGFzcywKKwljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpOwordm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpOwordm9pZCBlbnRlckNvbnN0cnVjdG9yKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBtb2RpZmllcnMsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTb3VyY2VTdGFydCwKKwlpbnQgbmFtZVNvdXJjZUVuZCwJCisJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpOwordm9pZCBlbnRlckZpZWxkKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBtb2RpZmllcnMsCisJY2hhcltdIHR5cGUsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTb3VyY2VTdGFydCwKKwlpbnQgbmFtZVNvdXJjZUVuZCk7Cit2b2lkIGVudGVySW5pdGlhbGl6ZXIoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50IG1vZGlmaWVycyk7Cit2b2lkIGVudGVySW50ZXJmYWNlKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBtb2RpZmllcnMsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTb3VyY2VTdGFydCwKKwlpbnQgbmFtZVNvdXJjZUVuZCwKKwljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpOwordm9pZCBlbnRlck1ldGhvZCgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgbW9kaWZpZXJzLAorCWNoYXJbXSByZXR1cm5UeXBlLAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU291cmNlU3RhcnQsCisJaW50IG5hbWVTb3VyY2VFbmQsCQorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKTsKK3ZvaWQgZXhpdENsYXNzKGludCBkZWNsYXJhdGlvbkVuZCk7Cit2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKTsKK3ZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCk7CisvKgorICogLSBObyBpbml0aWFsaXphdGlvbiBzb3VyY2UgZm9yIG5vdyAtCisgKiBpbml0aWFsaXphdGlvblNvdXJjZSBkZW5vdGVzIHRoZSBzb3VyY2Ugb2YgdGhlIGV4cHJlc3Npb24gdXNlZCBmb3IgaW5pdGlhbGl6aW5nCisgKiB0aGUgZmllbGQgaWYgYW55IChpZiBubyBzb3VyY2UsIHRoZW4gaXQgaXMgbnVsbCkuCisgKgorICogTm90ZTogdGhlIGluaXRpYWxpemF0aW9uU291cmNlIHdpbGwgYmUgdXNlZCBpbiBjYXNlIHdlIGRvIG5lZWQgdG8gdHlwZSBjaGVjaworICoJYWdhaW5zdCBzb3VyY2UgbW9kZWxzLCBhbmQgdGh1cyB0aGUgb25seSBpbnRlcmVzdGluZyB1c2UgZm9yIGl0IGlzIGZpZWxkCisgKiAgY29uc3RhbnQgcHJvcGFnYXRpb24uIFRoZXJlZm9yZSwgdGhlIGluaXRpYWxpemF0aW9uU291cmNlIHdpbGwgb25seSBiZSBub24KKyAqICBudWxsIGZvciBmaW5hbCBmaWVsZHMgKHNvIGFzIHRvIG1pbmltaXplIGNoYXJbXSBhbGxvY2F0aW9ucykuCisgKi8KK3ZvaWQgZXhpdEZpZWxkKC8qY2hhcltdIGluaXRpYWxpemF0aW9uU291cmNlLCAqL2ludCBkZWNsYXJhdGlvbkVuZCk7Cit2b2lkIGV4aXRJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25FbmQpOwordm9pZCBleGl0SW50ZXJmYWNlKGludCBkZWNsYXJhdGlvbkVuZCk7Cit2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmFlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTI5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCisvKioKKyAqIEEgc291cmNlIGVsZW1lbnQgcGFyc2VyIGV4dHJhY3RzIHN0cnVjdHVyYWwgYW5kIHJlZmVyZW5jZSBpbmZvcm1hdGlvbgorICogZnJvbSBhIHBpZWNlIG9mIHNvdXJjZS4KKyAqCisgKiBhbHNvIHNlZSBASVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqCisgKiBUaGUgc3RydWN0dXJhbCBpbnZlc3RpZ2F0aW9uIGluY2x1ZGVzOgorICogLSB0aGUgcGFja2FnZSBzdGF0ZW1lbnQKKyAqIC0gaW1wb3J0IHN0YXRlbWVudHMKKyAqIC0gdG9wLWxldmVsIHR5cGVzOiBwYWNrYWdlIG1lbWJlciwgbWVtYmVyIHR5cGVzIChtZW1iZXIgdHlwZXMgb2YgbWVtYmVyIHR5cGVzLi4uKQorICogLSBmaWVsZHMKKyAqIC0gbWV0aG9kcworICoKKyAqIElmIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQsIHRoZW4gYWxsIHNvdXJjZSBjb25zdHJ1Y3RzIGFyZQorICogaW52ZXN0aWdhdGVkIGFuZCB0eXBlLCBmaWVsZCAmIG1ldGhvZCByZWZlcmVuY2VzIGFyZSBwcm92aWRlZCBhcyB3ZWxsLgorICoKKyAqIEFueSAocGFyc2luZykgcHJvYmxlbSBlbmNvdW50ZXJlZCBpcyBhbHNvIHByb3ZpZGVkLgorICovCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKKworcHVibGljIGNsYXNzIFNvdXJjZUVsZW1lbnRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgeworCQorCUlTb3VyY2VFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvcjsKKwlwcml2YXRlIGludCBmaWVsZENvdW50OworCXByaXZhdGUgaW50IGxvY2FsSW50UHRyOworCXByaXZhdGUgaW50IGxhc3RGaWVsZEVuZFBvc2l0aW9uOworCXByaXZhdGUgSVNvdXJjZVR5cGUgc291cmNlVHlwZTsKKwlwcml2YXRlIGJvb2xlYW4gcmVwb3J0UmVmZXJlbmNlSW5mbzsKKwlwcml2YXRlIGNoYXJbXVtdIHR5cGVOYW1lczsKKwlwcml2YXRlIGNoYXJbXVtdIHN1cGVyVHlwZU5hbWVzOworCXByaXZhdGUgaW50IG5lc3RlZFR5cGVJbmRleDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBOYW1lUmVmZXJlbmNlW10gdW5rbm93blJlZnM7CisJcHJpdmF0ZSBpbnQgdW5rbm93blJlZnNDb3VudGVyOworCXByaXZhdGUgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBudWxsOworCXByaXZhdGUgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CisJCisvKioKKyAqIEFuIGFzdCB2aXNpdG9yIHRoYXQgdmlzaXRzIGxvY2FsIHR5cGUgZGVjbGFyYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlciB7CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCQlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24sCisJCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLCBzb3VyY2VUeXBlID09IG51bGwpOworCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvciguLi4pCisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KExvY2FsVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKHR5cGVEZWNsYXJhdGlvbiwgc291cmNlVHlwZSA9PSBudWxsKTsKKwkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCB2aXNpdCBtZW1iZXJzIGFzIHRoaXMgd2FzIGRvbmUgZHVyaW5nIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoLi4uKQorCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IodHlwZURlY2xhcmF0aW9uLCBzb3VyY2VUeXBlID09IG51bGwpOworCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvciguLi4pCisJfQorCQorfQorCitwdWJsaWMgU291cmNlRWxlbWVudFBhcnNlcigKKwlmaW5hbCBJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsIAorCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKKwlDb21waWxlck9wdGlvbnMgb3B0aW9ucykgeworCS8vIHdlIHdhbnQgdG8gbm90aWZ5IGFsbCBzeW50YXggZXJyb3Igd2l0aCB0aGUgYWNjZXB0UHJvYmxlbSBBUEkKKwkvLyBUbyBkbyBzbywgd2UgZGVmaW5lIHRoZSByZWNvcmQgbWV0aG9kIG9mIHRoZSBQcm9ibGVtUmVwb3J0ZXIKKwlzdXBlcihuZXcgUHJvYmxlbVJlcG9ydGVyKAorCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksCisJCW9wdGlvbnMsIAorCQlwcm9ibGVtRmFjdG9yeSkgeworCQlwdWJsaWMgdm9pZCByZWNvcmQoSVByb2JsZW0gcHJvYmxlbSwgQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCwgUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CisJCQl1bml0UmVzdWx0LnJlY29yZChwcm9ibGVtLCByZWZlcmVuY2VDb250ZXh0KTsKKwkJCXJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKHByb2JsZW0pOworCQl9CisJfSwKKwl0cnVlLAorCW9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJdHlwZU5hbWVzID0gbmV3IGNoYXJbNF1bXTsKKwlzdXBlclR5cGVOYW1lcyA9IG5ldyBjaGFyWzRdW107CisJbmVzdGVkVHlwZUluZGV4ID0gMDsKKwl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworfQorCisvKiogQGRlcHJlY2F0ZWQgdXNlIFNvdXJjZUVsZW1lbnRQYXJzZXIoSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IsIElQcm9ibGVtRmFjdG9yeSwgQ29tcGlsZXJPcHRpb25zKSAqLworcHVibGljIFNvdXJjZUVsZW1lbnRQYXJzZXIoCisJZmluYWwgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yLCAKKwlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKKwkJdGhpcyhyZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBuZXcgQ29tcGlsZXJPcHRpb25zKCkpOworfQorCitwdWJsaWMgU291cmNlRWxlbWVudFBhcnNlcigKKwlmaW5hbCBJU291cmNlRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IsIAorCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwKKwlDb21waWxlck9wdGlvbnMgb3B0aW9ucywKKwlib29sZWFuIHJlcG9ydExvY2FsRGVjbGFyYXRpb25zKSB7CisJCXRoaXMocmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSwgb3B0aW9ucyk7CisJCWlmIChyZXBvcnRMb2NhbERlY2xhcmF0aW9ucykgeworCQkJdGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG5ldyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvcigpOworCQl9Cit9CisKK3B1YmxpYyB2b2lkIGNoZWNrQW5ub3RhdGlvbigpIHsKKwlpbnQgZmlyc3RDb21tZW50SW5kZXggPSBzY2FubmVyLmNvbW1lbnRQdHI7CisKKwlzdXBlci5jaGVja0Fubm90YXRpb24oKTsKKworCS8vIG1vZGlmeSB0aGUgbW9kaWZpZXIgc291cmNlIHN0YXJ0IHRvIHBvaW50IGF0IHRoZSBmaXJzdCBjb21tZW50CisJaWYgKGZpcnN0Q29tbWVudEluZGV4ID49IDApIHsKKwkJbW9kaWZpZXJzU291cmNlU3RhcnQgPSBzY2FubmVyLmNvbW1lbnRTdGFydHNbMF07IAorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7CisKKwlib29sZWFuIHByZXZpb3VzRmxhZyA9IHJlcG9ydFJlZmVyZW5jZUluZm87CisJcmVwb3J0UmVmZXJlbmNlSW5mbyA9IGZhbHNlOyAvLyBub3QgdG8gc2VlIHRoZSB0eXBlIHJlZmVyZW5jZSByZXBvcnRlZCBpbiBzdXBlciBjYWxsIHRvIGdldFR5cGVSZWZlcmVuY2UoLi4uKQorCXN1cGVyLmNsYXNzSW5zdGFuY2VDcmVhdGlvbihhbHdheXNRdWFsaWZpZWQpOworCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBwcmV2aW91c0ZsYWc7CisJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8peworCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9IChBbGxvY2F0aW9uRXhwcmVzc2lvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IGFsbG9jLnR5cGU7CisJCXJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKKwkJCXR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlIAorCQkJCT8gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlUmVmKS50b2tlbgorCQkJCTogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGFsbG9jLnR5cGUuZ2V0VHlwZU5hbWUoKSwgJy4nKSwKKwkJCWFsbG9jLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFsbG9jLmFyZ3VtZW50cy5sZW5ndGgsIAorCQkJYWxsb2Muc291cmNlU3RhcnQpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKSB7CisJLy8gQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKKworCS8qIHJlY292ZXJpbmcgLSBtaWdodCBiZSBhbiBlbXB0eSBtZXNzYWdlIHNlbmQgKi8KKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWlmIChsYXN0SWdub3JlZFRva2VuID09IFRva2VuTmFtZW5ldyl7IC8vIHdhcyBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24KKwkJCWxhc3RDaGVja1BvaW50ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOyAvLyBmb3JjZSB0byByZXN0YXJ0IGF0IHRoaXMgZXhhY3QgcG9zaXRpb24JCQkJCisJCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisJfQorCVNvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSBuZXcgU291cmNlQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisKKwkvL25hbWUgLS0gdGhpcyBpcyBub3QgcmVhbGx5IHJldmVsYW50IGJ1dCB3ZSBkbyAuLi4uLgorCWNkLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vbW9kaWZpZXJzCisJY2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwljZC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvL2hpZ2hsaWdodCBzdGFydHMgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0cworCWNkLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNlbGVjdG9yU291cmNlUG9zaXRpb25zID4+PiAzMik7CisJY2Quc2VsZWN0b3JTb3VyY2VFbmQgPSAoaW50KSBzZWxlY3RvclNvdXJjZVBvc2l0aW9uczsKKwlwdXNoT25Bc3RTdGFjayhjZCk7CisKKwljZC5zb3VyY2VFbmQgPSBsUGFyZW5Qb3M7CisJY2QuYm9keVN0YXJ0ID0gbFBhcmVuUG9zKzE7CisJbGlzdExlbmd0aCA9IDA7IC8vIGluaXRpYWxpemUgbGlzdExlbmd0aCBiZWZvcmUgcmVhZGluZyBwYXJhbWV0ZXJzL3Rocm93cworCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWxhc3RDaGVja1BvaW50ID0gY2QuYm9keVN0YXJ0OworCQlpZiAoKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSAmJiBsYXN0SWdub3JlZFRva2VuICE9IFRva2VuTmFtZURPVCkKKwkJCXx8IGNkLm1vZGlmaWVycyAhPSAwKXsKKwkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGNkLCAwKTsKKwkJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJfQorCX0JCit9CisvKioKKyAqCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gdGhlIHNjYW5uZXIgaXMgbG9jYXRlZCBhZnRlciB0aGUgY29tbWEgb3IgdGhlIHNlbWktY29sb24uCisJLy8gd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBjb21tYSBvciB0aGUgc2VtaS1jb2xvbgorCXN1cGVyLmNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsKKwlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKCkgfHwgKChjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1lQ09NTUEpICYmIChjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1lU0VNSUNPTE9OKSkpCisJCXJldHVybjsKKwkoKFNvdXJjZUZpZWxkRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl0pLmZpZWxkRW5kUG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpIHx8ICgoY3VycmVudFRva2VuICE9IFRva2VuTmFtZUNPTU1BKSAmJiAoY3VycmVudFRva2VuICE9IFRva2VuTmFtZVNFTUlDT0xPTikpKQorCQlyZXR1cm47CisJKChTb3VyY2VGaWVsZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdKS5maWVsZEVuZFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkQWNjZXNzKGJvb2xlYW4gaXNTdXBlckFjY2VzcykgeworCS8vIEZpZWxkQWNjZXNzIDo6PSBQcmltYXJ5ICcuJyAnSWRlbnRpZmllcicKKwkvLyBGaWVsZEFjY2VzcyA6Oj0gJ3N1cGVyJyAnLicgJ0lkZW50aWZpZXInCisJc3VwZXIuY29uc3VtZUZpZWxkQWNjZXNzKGlzU3VwZXJBY2Nlc3MpOworCUZpZWxkUmVmZXJlbmNlIGZyID0gKEZpZWxkUmVmZXJlbmNlKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkUmVmZXJlbmNlKGZyLnRva2VuLCBmci5zb3VyY2VTdGFydCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlck5hbWUoKSB7CisJLy8gTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgJ0lkZW50aWZpZXInICcoJworCVNvdXJjZU1ldGhvZERlY2xhcmF0aW9uIG1kID0gbmV3IFNvdXJjZU1ldGhvZERlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKworCS8vbmFtZQorCW1kLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkvL3R5cGUKKwltZC5yZXR1cm5UeXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCS8vbW9kaWZpZXJzCisJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwltZC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvL2hpZ2hsaWdodCBzdGFydHMgYXQgc2VsZWN0b3Igc3RhcnQKKwltZC5zb3VyY2VTdGFydCA9IChpbnQpIChzZWxlY3RvclNvdXJjZVBvc2l0aW9ucyA+Pj4gMzIpOworCW1kLnNlbGVjdG9yU291cmNlRW5kID0gKGludCkgc2VsZWN0b3JTb3VyY2VQb3NpdGlvbnM7CisJcHVzaE9uQXN0U3RhY2sobWQpOworCW1kLnNvdXJjZUVuZCA9IGxQYXJlblBvczsKKwltZC5ib2R5U3RhcnQgPSBsUGFyZW5Qb3MrMTsKKwlsaXN0TGVuZ3RoID0gMDsgLy8gaW5pdGlhbGl6ZSBsaXN0TGVuZ3RoIGJlZm9yZSByZWFkaW5nIHBhcmFtZXRlcnMvdGhyb3dzCisJCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUgCisJCQkvL3x8IG1kLm1vZGlmaWVycyAhPSAwCisJCQl8fCAoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKG1kLnJldHVyblR5cGUuc291cmNlU3RhcnQpCisJCQkJCT09IHNjYW5uZXIuZ2V0TGluZU51bWJlcihtZC5zb3VyY2VTdGFydCkpKXsKKwkJCWxhc3RDaGVja1BvaW50ID0gbWQuYm9keVN0YXJ0OworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQobWQsIDApOworCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCQorCQl9IGVsc2UgeworCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5zb3VyY2VTdGFydDsKKwkJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCX0KKwl9CQkKK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpIHsKKwkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisKKwkvLyB3aGVuIHRoZSBuYW1lIGlzIG9ubHkgYW4gaWRlbnRpZmllci4uLndlIGhhdmUgYSBtZXNzYWdlIHNlbmQgdG8gInRoaXMiIChpbXBsaWNpdCkKKwlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCUV4cHJlc3Npb25bXSBhcmdzID0gbWVzc2FnZVNlbmQuYXJndW1lbnRzOworCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwgCisJCQlhcmdzID09IG51bGwgPyAwIDogYXJncy5sZW5ndGgsIAorCQkJKGludCkobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMikpOworCX0KK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpIHsKKwlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCUV4cHJlc3Npb25bXSBhcmdzID0gbWVzc2FnZVNlbmQuYXJndW1lbnRzOworCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UoCisJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwgCisJCQlhcmdzID09IG51bGwgPyAwIDogYXJncy5sZW5ndGgsIAorCQkJKGludCkobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMikpOworCX0KK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKSB7CisJLy8gTWV0aG9kSW52b2NhdGlvbiA6Oj0gJ3N1cGVyJyAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOworCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJRXhwcmVzc2lvbltdIGFyZ3MgPSBtZXNzYWdlU2VuZC5hcmd1bWVudHM7CisJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZFJlZmVyZW5jZSgKKwkJCW1lc3NhZ2VTZW5kLnNlbGVjdG9yLCAKKwkJCWFyZ3MgPT0gbnVsbCA/IDAgOiBhcmdzLmxlbmd0aCwgCisJCQkoaW50KShtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CisJLy8gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSA6Oj0gJ2ltcG9ydCcgTmFtZQorCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCisKKwlzdXBlci5jb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpOworCUltcG9ydFJlZmVyZW5jZSBpbXB0ID0gKEltcG9ydFJlZmVyZW5jZSlhc3RTdGFja1thc3RQdHJdOworCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKGltcHQudG9rZW5zLCBpbXB0LnNvdXJjZVN0YXJ0LCBpbXB0LnNvdXJjZUVuZCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKKwkvLyBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUgJy4nICcqJworCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCisKKwlzdXBlci5jb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7CisJSW1wb3J0UmVmZXJlbmNlIGltcHQgPSAoSW1wb3J0UmVmZXJlbmNlKWFzdFN0YWNrW2FzdFB0cl07CisJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoaW1wdC50b2tlbnMsIGltcHQuc291cmNlU3RhcnQsIGltcHQuc291cmNlRW5kKTsKKwl9Cit9Citwcm90ZWN0ZWQgRmllbGREZWNsYXJhdGlvbiBjcmVhdGVGaWVsZERlY2xhcmF0aW9uKEV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24sIGNoYXJbXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlyZXR1cm4gbmV3IFNvdXJjZUZpZWxkRGVjbGFyYXRpb24obnVsbCwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7Cit9Citwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gZW5kUGFyc2UoaW50IGFjdCkgeworCWlmIChzb3VyY2VUeXBlICE9IG51bGwpIHsKKwkJaWYgKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJY29uc3VtZUludGVyZmFjZURlY2xhcmF0aW9uKCk7CisJCX0gZWxzZSB7CisJCQljb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOworCQl9CisJfQorCWlmIChjb21waWxhdGlvblVuaXQgIT0gbnVsbCkgeworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5lbmRQYXJzZShhY3QpOworCQlyZXR1cm4gcmVzdWx0OworCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0JCQorfQorLyoKKyAqIEZsdXNoIGFubm90YXRpb25zIGRlZmluZWQgcHJpb3IgdG8gYSBnaXZlbiBwb3NpdGlvbnMuCisgKgorICogTm90ZTogYW5ub3RhdGlvbnMgYXJlIHN0YWNrZWQgaW4gc3ludGFjdGljYWwgb3JkZXIKKyAqCisgKiBFaXRoZXIgYW5zd2VyIGdpdmVuIDxwb3NpdGlvbj4sIG9yIHRoZSBlbmQgcG9zaXRpb24gb2YgYSBjb21tZW50IGxpbmUgCisgKiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIDxwb3NpdGlvbj4gKHNhbWUgbGluZSkKKyAqCisgKiBlLmcuCisgKiB2b2lkIGZvbygpeworICogfSAvLyBlbmQgb2YgbWV0aG9kIGZvbworICovCisgCitwdWJsaWMgaW50IGZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhpbnQgcG9zaXRpb24pIHsKKworCXJldHVybiBsYXN0RmllbGRFbmRQb3NpdGlvbiA9IHN1cGVyLmZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhwb3NpdGlvbik7Cit9CitwdWJsaWMgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKGludCBkaW0pIHsKKwkvKiBidWlsZCBhIFJlZmVyZW5jZSBvbiBhIHZhcmlhYmxlIHRoYXQgbWF5IGJlIHF1YWxpZmllZCBvciBub3QKKwkgKiBUaGlzIHZhcmlhYmxlIGlzIGEgdHlwZSByZWZlcmVuY2UgYW5kIGRpbSB3aWxsIGJlIGl0cyBkaW1lbnNpb25zCisJICovCisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyLS1dKSA9PSAxKSB7CisJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKKwkJaWYgKGRpbSA9PSAwKSB7CisJCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHJlZiA9IAorCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsKKwkJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVmLnRva2VuLCByZWYuc291cmNlU3RhcnQpOworCQkJfQorCQkJcmV0dXJuIHJlZjsKKwkJfSBlbHNlIHsKKwkJCUFycmF5VHlwZVJlZmVyZW5jZSByZWYgPSAKKwkJCQluZXcgQXJyYXlUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlkaW0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbiwgcmVmLnNvdXJjZVN0YXJ0KTsKKwkJCX0KKwkJCXJldHVybiByZWY7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobGVuZ3RoIDwgMCkgeyAvL2ZsYWcgZm9yIHByZWNvbXBpbGVkIHR5cGUgcmVmZXJlbmNlIG9uIGJhc2UgdHlwZXMKKwkJCVR5cGVSZWZlcmVuY2UgcmVmID0gVHlwZVJlZmVyZW5jZS5iYXNlVHlwZVJlZmVyZW5jZSgtbGVuZ3RoLCBkaW0pOworCQkJcmVmLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJaWYgKGRpbSA9PSAwKSB7CisJCQkJcmVmLnNvdXJjZUVuZCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJCX0gZWxzZSB7CisJCQkJaW50UHRyLS07IC8vIG5vIG5lZWQgdG8gdXNlIHRoaXMgcG9zaXRpb24gYXMgaXQgaXMgYW4gYXJyYXkKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CisJCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbyl7CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi5nZXRUeXBlTmFtZSgpLCByZWYuc291cmNlU3RhcnQsIHJlZi5zb3VyY2VFbmQpOworCQkJfQorCQkJcmV0dXJuIHJlZjsKKwkJfSBlbHNlIHsgLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCisJCQljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCQkJcG9zaXRpb25zLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGgpOyAKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOworCQkJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHJlZi50b2tlbnMsIHJlZi5zb3VyY2VTdGFydCwgcmVmLnNvdXJjZUVuZCk7CisJCQkJfQorCQkJCXJldHVybiByZWY7CisJCQl9IGVsc2UgeworCQkJCUFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSByZWYgPSAKKwkJCQkJbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsgCisJCQkJcmVmLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOwkJCQkJCisJCQkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVmLnRva2VucywgcmVmLnNvdXJjZVN0YXJ0LCByZWYuc291cmNlRW5kKTsKKwkJCQl9CisJCQkJcmV0dXJuIHJlZjsKKwkJCX0KKwkJfQorCX0KK30KK3B1YmxpYyBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCkgeworCS8qIGJ1aWxkIGEgKHVuc3BlY2lmaWVkKSBOYW1lUmVmZXJlbmNlIHdoaWNoIG1heSBiZSBxdWFsaWZpZWQqLworCisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyLS1dKSA9PSAxKSB7CisJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKKwkJU2luZ2xlTmFtZVJlZmVyZW5jZSByZWYgPSAKKwkJCW5ldyBTaW5nbGVOYW1lUmVmZXJlbmNlKAorCQkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCisJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXSk7IAorCQlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQkJdGhpcy5hZGRVbmtub3duUmVmKHJlZik7CisJCX0KKwkJcmV0dXJuIHJlZjsKKwl9IGVsc2UgeworCQkvL1F1YWxpZmllZCB2YXJpYWJsZSByZWZlcmVuY2UKKwkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcmVmID0gCisJCQluZXcgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSgKKwkJCQl0b2tlbnMsIAorCQkJCShpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLCAvLyBzb3VyY2VTdGFydAorCQkJCShpbnQpIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyBsZW5ndGhdKTsgLy8gc291cmNlRW5kCisJCWlmIChyZXBvcnRSZWZlcmVuY2VJbmZvKSB7CisJCQl0aGlzLmFkZFVua25vd25SZWYocmVmKTsKKwkJfQorCQlyZXR1cm4gcmVmOworCX0KK30KK3B1YmxpYyBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkgeworCS8qIGJ1aWxkIGEgKHVuc3BlY2lmaWVkKSBOYW1lUmVmZXJlbmNlIHdoaWNoIG1heSBiZSBxdWFsaWZpZWQKKwlUaGUgb3B0aW1pemF0aW9uIG9jY3VycyBmb3IgcXVhbGlmaWVkIHJlZmVyZW5jZSB3aGlsZSB3ZSBhcmUKKwljZXJ0YWluIGluIHRoaXMgY2FzZSB0aGUgbGFzdCBpdGVtIG9mIHRoZSBxdWFsaWZpZWQgbmFtZSBpcworCWEgZmllbGQgYWNjZXNzLiBUaGlzIG9wdGltaXphdGlvbiBpcyBJTVBPUlRBTlQgd2hpbGUgaXQgcmVzdWx0cworCXRoYXQgd2hlbiBhIE5hbWVSZWZlcmVuY2UgaXMgYnVpbGQsIHRoZSB0eXBlIGNoZWNrZXIgc2hvdWxkIGFsd2F5cworCWxvb2sgZm9yIHRoYXQgaXQgaXMgbm90IGEgdHlwZSByZWZlcmVuY2UgKi8KKworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkgeworCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgcmVmID0gCisJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSgKKwkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV0pOyAKKwkJcmVmLmJpdHMgJj0gfkFzdE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSzsKKwkJcmVmLmJpdHMgfD0gTE9DQUwgfCBGSUVMRDsKKwkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCXRoaXMuYWRkVW5rbm93blJlZihyZWYpOworCQl9CisJCXJldHVybiByZWY7CisJfQorCisJLy9RdWFsaWZpZWQtdmFyaWFibGUtcmVmZXJlbmNlCisJLy9JbiBmYWN0IGl0IGlzIHZhcmlhYmxlLXJlZmVyZW5jZSBET1QgZmllbGQtcmVmICwgYnV0IGl0IHdvdWxkIHJlc3VsdCBpbiBhIHR5cGUKKwkvL2NvbmZsaWN0IHRoYSBjYW4gYmUgb25seSByZWR1Y2UgYnkgbWFraW5nIGEgc3VwZXJjbGFzcyAob3IgaW5ldHJmYWNlICkgYmV0d2VlbgorCS8vbmFtZVJlZmVyZW5jZSBhbmQgRmlsZWRSZWZlcmVuY2Ugb3IgcHV0dGluZyBGaWVsZFJlZmVyZW5jZSB1bmRlciBOYW1lUmVmZXJlbmNlCisJLy9vciBlbHNlLi4uLi4uLi4uLlRoaXMgb3B0aW1pc2F0aW9uIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgc28ganVzdCBsZWF2ZSBhcyBpdCBpcworCisJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcmVmID0gCisJCW5ldyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKAorCQkJdG9rZW5zLCAKKwkJCShpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLCAKKwkvLyBzb3VyY2VTdGFydAorCSAoaW50KSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgbGVuZ3RoXSk7IC8vIHNvdXJjZUVuZAorCXJlZi5iaXRzICY9IH5Bc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CisJcmVmLmJpdHMgfD0gTE9DQUwgfCBGSUVMRDsKKwlpZiAocmVwb3J0UmVmZXJlbmNlSW5mbykgeworCQl0aGlzLmFkZFVua25vd25SZWYocmVmKTsKKwl9CisJcmV0dXJuIHJlZjsKK30KKy8qKgorICoKKyAqIElOVEVSTkFMIFVTRS1PTkxZCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBpc0xvY2FsRGVjbGFyYXRpb24oKSB7CisJaW50IG5lc3RlZERlcHRoID0gbmVzdGVkVHlwZTsKKwl3aGlsZSAobmVzdGVkRGVwdGggPj0gMCkgeworCQlpZiAobmVzdGVkTWV0aG9kW25lc3RlZERlcHRoXSAhPSAwKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQluZXN0ZWREZXB0aC0tOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKgorICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQpIHsKKwlpZiAocGFyc2VkVW5pdCA9PSBudWxsKSB7CisJCS8vIHdoZW4gd2UgcGFyc2UgYSBzaW5nbGUgdHlwZSBtZW1iZXIgZGVjbGFyYXRpb24gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbnVsbCwgYnV0IHdlIHN0aWxsCisJCS8vIHdhbnQgdG8gYmUgYWJsZSB0byBub3RpZnkgdGhlIHJlcXVlc3RvciBvbiB0aGUgY3JlYXRlZCBhc3Qgbm9kZQorCQlpZiAoYXN0U3RhY2tbMF0gaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBhc3RTdGFja1swXSk7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyByYW5nZSBjaGVjaworCWJvb2xlYW4gaXNJblJhbmdlID0gCisJCQkJc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gcGFyc2VkVW5pdC5zb3VyY2VTdGFydAorCQkJCSYmIHNjYW5uZXIuZW9mUG9zaXRpb24gPj0gcGFyc2VkVW5pdC5zb3VyY2VFbmQ7CisJCisJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJbm90aWZ5QWxsVW5rbm93blJlZmVyZW5jZXMoKTsKKwl9CisJLy8gY29sbGVjdCB0aGUgdG9wIGxldmVsIGFzdCBub2RlcworCWludCBsZW5ndGggPSAwOworCUFzdE5vZGVbXSBub2RlcyA9IG51bGw7CisJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCl7CisJCWlmIChpc0luUmFuZ2UpIHsKKwkJCXJlcXVlc3Rvci5lbnRlckNvbXBpbGF0aW9uVW5pdCgpOworCQl9CisJCUltcG9ydFJlZmVyZW5jZSBjdXJyZW50UGFja2FnZSA9IHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2U7CisJCUltcG9ydFJlZmVyZW5jZVtdIGltcG9ydHMgPSBwYXJzZWRVbml0LmltcG9ydHM7CisJCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gcGFyc2VkVW5pdC50eXBlczsKKwkJbGVuZ3RoID0gCisJCQkoY3VycmVudFBhY2thZ2UgPT0gbnVsbCA/IDAgOiAxKSAKKwkJCSsgKGltcG9ydHMgPT0gbnVsbCA/IDAgOiBpbXBvcnRzLmxlbmd0aCkKKwkJCSsgKHR5cGVzID09IG51bGwgPyAwIDogdHlwZXMubGVuZ3RoKTsKKwkJbm9kZXMgPSBuZXcgQXN0Tm9kZVtsZW5ndGhdOworCQlpbnQgaW5kZXggPSAwOworCQlpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgeworCQkJbm9kZXNbaW5kZXgrK10gPSBjdXJyZW50UGFja2FnZTsKKwkJfQorCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCW5vZGVzW2luZGV4KytdID0gaW1wb3J0c1tpXTsKKwkJCX0KKwkJfQorCQlpZiAodHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJbm9kZXNbaW5kZXgrK10gPSB0eXBlc1tpXTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gcGFyc2VkVW5pdC50eXBlczsKKwkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCWxlbmd0aCA9IHR5cGVzLmxlbmd0aDsKKwkJCW5vZGVzID0gbmV3IEFzdE5vZGVbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCW5vZGVzW2ldID0gdHlwZXNbaV07CisJCQl9CisJCX0KKwl9CisJCisJLy8gbm90aWZ5IHRoZSBub2RlcyBpbiB0aGUgc3ludGFjdGljYWwgb3JkZXIKKwlpZiAobm9kZXMgIT0gbnVsbCAmJiBsZW5ndGggPiAwKSB7CisJCXF1aWNrU29ydChub2RlcywgMCwgbGVuZ3RoLTEpOworCQlmb3IgKGludCBpPTA7aTxsZW5ndGg7aSsrKSB7CisJCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKKwkJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7CisJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiA9IChJbXBvcnRSZWZlcmVuY2Upbm9kZTsKKwkJCQlpZiAobm9kZSA9PSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlKSB7CisJCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoaW1wb3J0UmVmLCB0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKGltcG9ydFJlZiwgZmFsc2UpOworCQkJCX0KKwkJCX0gZWxzZSB7IC8vIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uCisJCQkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcigoVHlwZURlY2xhcmF0aW9uKW5vZGUsIHNvdXJjZVR5cGUgPT0gbnVsbCk7CisJCQl9CisJCX0KKwl9CisJCisJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCl7CisJCWlmIChpc0luUmFuZ2UpIHsKKwkJCXJlcXVlc3Rvci5leGl0Q29tcGlsYXRpb25Vbml0KHBhcnNlZFVuaXQuc291cmNlRW5kKTsKKwkJfQorCX0KK30KKworcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbFVua25vd25SZWZlcmVuY2VzKCkgeworCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnVua25vd25SZWZzQ291bnRlcjsgaSA8IG1heDsgaSsrKSB7CisJCU5hbWVSZWZlcmVuY2UgbmFtZVJlZiA9IHRoaXMudW5rbm93blJlZnNbaV07CisJCWlmICgobmFtZVJlZi5iaXRzICYgQmluZGluZ0lkcy5WQVJJQUJMRSkgIT0gMCkgeworCQkJaWYgKChuYW1lUmVmLmJpdHMgJiBCaW5kaW5nSWRzLlRZUEUpID09IDApIHsgCisJCQkJLy8gdmFyaWFibGUgYnV0IG5vdCB0eXBlCisJCQkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7IAorCQkJCQkvLyBsb2NhbCB2YXIgb3IgZmllbGQKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoKChTaW5nbGVOYW1lUmVmZXJlbmNlKSBuYW1lUmVmKS50b2tlbiwgbmFtZVJlZi5zb3VyY2VTdGFydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQorCQkJCQkvLyBUaGUgbGFzdCB0b2tlbiBpcyBhIGZpZWxkIHJlZmVyZW5jZSBhbmQgdGhlIHByZXZpb3VzIHRva2VucyBhcmUgYSB0eXBlL3ZhcmlhYmxlIHJlZmVyZW5jZXMKKwkJCQkJY2hhcltdW10gdG9rZW5zID0gKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBuYW1lUmVmKS50b2tlbnM7CisJCQkJCWludCB0b2tlbnNMZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQkJCQlyZXF1ZXN0b3IuYWNjZXB0RmllbGRSZWZlcmVuY2UodG9rZW5zW3Rva2Vuc0xlbmd0aCAtIDFdLCBuYW1lUmVmLnNvdXJjZUVuZCAtIHRva2Vuc1t0b2tlbnNMZW5ndGggLSAxXS5sZW5ndGggKyAxKTsKKwkJCQkJY2hhcltdW10gdHlwZVJlZiA9IG5ldyBjaGFyW3Rva2Vuc0xlbmd0aCAtIDFdW107CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodG9rZW5zLCAwLCB0eXBlUmVmLCAwLCB0b2tlbnNMZW5ndGggLSAxKTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UodHlwZVJlZiwgbmFtZVJlZi5zb3VyY2VTdGFydCwgbmFtZVJlZi5zb3VyY2VFbmQgLSB0b2tlbnNbdG9rZW5zTGVuZ3RoIC0gMV0ubGVuZ3RoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHZhcmlhYmxlIG9yIHR5cGUKKwkJCQlpZiAobmFtZVJlZiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFVua25vd25SZWZlcmVuY2UoKChTaW5nbGVOYW1lUmVmZXJlbmNlKSBuYW1lUmVmKS50b2tlbiwgbmFtZVJlZi5zb3VyY2VTdGFydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy9RdWFsaWZpZWROYW1lUmVmZXJlbmNlCisJCQkJCXJlcXVlc3Rvci5hY2NlcHRVbmtub3duUmVmZXJlbmNlKCgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbmFtZVJlZikudG9rZW5zLCBuYW1lUmVmLnNvdXJjZVN0YXJ0LCBuYW1lUmVmLnNvdXJjZUVuZCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKChuYW1lUmVmLmJpdHMgJiBCaW5kaW5nSWRzLlRZUEUpICE9IDApIHsKKwkJCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKCgoU2luZ2xlTmFtZVJlZmVyZW5jZSkgbmFtZVJlZikudG9rZW4sIG5hbWVSZWYuc291cmNlU3RhcnQpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBpdCBpcyBhIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0VHlwZVJlZmVyZW5jZSgoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIG5hbWVSZWYpLnRva2VucywgbmFtZVJlZi5zb3VyY2VTdGFydCwgbmFtZVJlZi5zb3VyY2VFbmQpOworCQkJfQorCQl9CisJfQorfQorLyoKKyAqIFVwZGF0ZSB0aGUgYm9keVN0YXJ0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7CisKKwkvLyByYW5nZSBjaGVjaworCWJvb2xlYW4gaXNJblJhbmdlID0gCisJCQkJc2Nhbm5lci5pbml0aWFsUG9zaXRpb24gPD0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAorCQkJCSYmIHNjYW5uZXIuZW9mUG9zaXRpb24gPj0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisKKwlpZiAobWV0aG9kRGVjbGFyYXRpb24uaXNDbGluaXQoKSkgeworCQl0aGlzLnZpc2l0SWZOZWVkZWQobWV0aG9kRGVjbGFyYXRpb24pOworCQlyZXR1cm47CisJfQorCisJaWYgKG1ldGhvZERlY2xhcmF0aW9uLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKKwkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOworCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CisJCQkJc3dpdGNoKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlKSB7CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCisJCQkJCQkJdHlwZU5hbWVzW25lc3RlZFR5cGVJbmRleC0xXSwKKwkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsIAorCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlciA6CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlciA6CQkJCQkKKwkJCQkJCXJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSgKKwkJCQkJCQlzdXBlclR5cGVOYW1lc1tuZXN0ZWRUeXBlSW5kZXgtMV0sCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMubGVuZ3RoLCAKKwkJCQkJCQljb25zdHJ1Y3RvckNhbGwuc291cmNlU3RhcnQpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CQorCQlyZXR1cm47CQorCX0JCisJY2hhcltdW10gYXJndW1lbnRUeXBlcyA9IG51bGw7CisJY2hhcltdW10gYXJndW1lbnROYW1lcyA9IG51bGw7CisJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZXRob2REZWNsYXJhdGlvbi5hcmd1bWVudHM7CisJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWludCBhcmd1bWVudExlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWFyZ3VtZW50VHlwZXMgPSBuZXcgY2hhclthcmd1bWVudExlbmd0aF1bXTsKKwkJYXJndW1lbnROYW1lcyA9IG5ldyBjaGFyW2FyZ3VtZW50TGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspIHsKKwkJCWFyZ3VtZW50VHlwZXNbaV0gPSByZXR1cm5UeXBlTmFtZShhcmd1bWVudHNbaV0udHlwZSk7CisJCQlhcmd1bWVudE5hbWVzW2ldID0gYXJndW1lbnRzW2ldLm5hbWU7CisJCX0KKwl9CisJY2hhcltdW10gdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBudWxsOworCVR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKKwlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCWludCB0aHJvd25FeGNlcHRpb25MZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJdGhyb3duRXhjZXB0aW9uVHlwZXMgPSBuZXcgY2hhclt0aHJvd25FeGNlcHRpb25MZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9uTGVuZ3RoOyBpKyspIHsKKwkJCXRocm93bkV4Y2VwdGlvblR5cGVzW2ldID0gCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRocm93bkV4Y2VwdGlvbnNbaV0uZ2V0VHlwZU5hbWUoKSwgJy4nKTsgCisJCX0KKwl9CisJLy8gYnkgZGVmYXVsdCBubyBzZWxlY3RvciBlbmQgcG9zaXRpb24KKwlpbnQgc2VsZWN0b3JTb3VyY2VFbmQgPSAtMTsKKwlpZiAobWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpKSB7CisJCWlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFNvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKwkJCXNlbGVjdG9yU291cmNlRW5kID0gCisJCQkJKChTb3VyY2VDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbikuc2VsZWN0b3JTb3VyY2VFbmQ7IAorCQl9CisJCWlmIChpc0luUmFuZ2UpeworCQkJcmVxdWVzdG9yLmVudGVyQ29uc3RydWN0b3IoCisJCQkJbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCQkJbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzLCAKKwkJCQltZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvciwgCisJCQkJbWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIAorCQkJCXNlbGVjdG9yU291cmNlRW5kLCAKKwkJCQlhcmd1bWVudFR5cGVzLCAKKwkJCQlhcmd1bWVudE5hbWVzLCAKKwkJCQl0aHJvd25FeGNlcHRpb25UeXBlcyk7CisJCX0KKwkJaWYgKHJlcG9ydFJlZmVyZW5jZUluZm8pIHsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbjsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOworCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CisJCQkJc3dpdGNoKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlKSB7CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCisJCQkJCQkJdHlwZU5hbWVzW25lc3RlZFR5cGVJbmRleC0xXSwKKwkJCQkJCQljb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY29uc3RydWN0b3JDYWxsLmFyZ3VtZW50cy5sZW5ndGgsIAorCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlciA6CisJCQkJCWNhc2UgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlciA6CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoCisJCQkJCQkJc3VwZXJUeXBlTmFtZXNbbmVzdGVkVHlwZUluZGV4LTFdLAorCQkJCQkJCWNvbnN0cnVjdG9yQ2FsbC5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzLmxlbmd0aCwgCisJCQkJCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQl0aGlzLnZpc2l0SWZOZWVkZWQobWV0aG9kRGVjbGFyYXRpb24pOworCQlpZiAoaXNJblJhbmdlKXsKKwkJCXJlcXVlc3Rvci5leGl0Q29uc3RydWN0b3IobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKG1ldGhvZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgU291cmNlTWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJc2VsZWN0b3JTb3VyY2VFbmQgPSAKKwkJCSgoU291cmNlTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5zZWxlY3RvclNvdXJjZUVuZDsgCisJfQorCWlmIChpc0luUmFuZ2UpeworCQlyZXF1ZXN0b3IuZW50ZXJNZXRob2QoCisJCQltZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwkJCW1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIEFjY0p1c3RGbGFnLCAKKwkJCXJldHVyblR5cGVOYW1lKCgoTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5yZXR1cm5UeXBlKSwgCisJCQltZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvciwgCisJCQltZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgCisJCQlzZWxlY3RvclNvdXJjZUVuZCwgCisJCQlhcmd1bWVudFR5cGVzLCAKKwkJCWFyZ3VtZW50TmFtZXMsIAorCQkJdGhyb3duRXhjZXB0aW9uVHlwZXMpOyAKKwl9CQkKKwl0aGlzLnZpc2l0SWZOZWVkZWQobWV0aG9kRGVjbGFyYXRpb24pOworCisJaWYgKGlzSW5SYW5nZSl7CQorCQlyZXF1ZXN0b3IuZXhpdE1ldGhvZChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJfQorfQorLyoKKyogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorKi8KK3B1YmxpYyB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uKSB7CisJCisJLy8gcmFuZ2UgY2hlY2sKKwlib29sZWFuIGlzSW5SYW5nZSA9IAorCQkJCXNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uIDw9IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAorCQkJCSYmIHNjYW5uZXIuZW9mUG9zaXRpb24gPj0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKworCWlmIChmaWVsZERlY2xhcmF0aW9uLmlzRmllbGQoKSkgeworCQlpbnQgZmllbGRFbmRQb3NpdGlvbiA9IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCWlmIChmaWVsZERlY2xhcmF0aW9uIGluc3RhbmNlb2YgU291cmNlRmllbGREZWNsYXJhdGlvbikgeworCQkJZmllbGRFbmRQb3NpdGlvbiA9ICgoU291cmNlRmllbGREZWNsYXJhdGlvbikgZmllbGREZWNsYXJhdGlvbikuZmllbGRFbmRQb3NpdGlvbjsKKwkJCWlmIChmaWVsZEVuZFBvc2l0aW9uID09IDApIHsKKwkJCQkvLyB1c2UgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgYnkgZGVmYXVsdAorCQkJCWZpZWxkRW5kUG9zaXRpb24gPSBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCQkJfQorCQl9CisJCWlmIChpc0luUmFuZ2UpIHsKKwkJCXJlcXVlc3Rvci5lbnRlckZpZWxkKAorCQkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBBY2NKdXN0RmxhZywgCisJCQkJcmV0dXJuVHlwZU5hbWUoZmllbGREZWNsYXJhdGlvbi50eXBlKSwgCisJCQkJZmllbGREZWNsYXJhdGlvbi5uYW1lLCAKKwkJCQlmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCAKKwkJCQlmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCk7IAorCQl9CisJCXRoaXMudmlzaXRJZk5lZWRlZChmaWVsZERlY2xhcmF0aW9uKTsKKwkJaWYgKGlzSW5SYW5nZSl7CisJCQlyZXF1ZXN0b3IuZXhpdEZpZWxkKGZpZWxkRW5kUG9zaXRpb24pOworCQl9CisKKwl9IGVsc2UgeworCQlpZiAoaXNJblJhbmdlKXsKKwkJCXJlcXVlc3Rvci5lbnRlckluaXRpYWxpemVyKAorCQkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJCQlmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycyk7IAorCQl9CisJCXRoaXMudmlzaXRJZk5lZWRlZCgoSW5pdGlhbGl6ZXIpZmllbGREZWNsYXJhdGlvbik7CisJCWlmIChpc0luUmFuZ2UpeworCQkJcmVxdWVzdG9yLmV4aXRJbml0aWFsaXplcihmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJfQorCX0KK30KK3B1YmxpYyB2b2lkIG5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoCisJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSwgCisJYm9vbGVhbiBpc1BhY2thZ2UpIHsKKwlpZiAoaXNQYWNrYWdlKSB7CisJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKAorCQkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQkJaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kLCAKKwkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWZlcmVuY2UuZ2V0SW1wb3J0TmFtZSgpLCAnLicpKTsgCisJfSBlbHNlIHsKKwkJcmVxdWVzdG9yLmFjY2VwdEltcG9ydCgKKwkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKKwkJCWltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZUVuZCwgCisJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmZXJlbmNlLmdldEltcG9ydE5hbWUoKSwgJy4nKSwgCisJCQlpbXBvcnRSZWZlcmVuY2Uub25EZW1hbmQpOyAKKwl9Cit9CitwdWJsaWMgdm9pZCBub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIGJvb2xlYW4gbm90aWZ5VHlwZVByZXNlbmNlKSB7CisJCisJLy8gcmFuZ2UgY2hlY2sKKwlib29sZWFuIGlzSW5SYW5nZSA9IAorCQkJCXNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uIDw9IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0CisJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA+PSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCisJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kczsKKwlNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJUeXBlcyA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlczsKKwlpbnQgZmllbGRDb3VudCA9IGZpZWxkcyA9PSBudWxsID8gMCA6IGZpZWxkcy5sZW5ndGg7CisJaW50IG1ldGhvZENvdW50ID0gbWV0aG9kcyA9PSBudWxsID8gMCA6IG1ldGhvZHMubGVuZ3RoOworCWludCBtZW1iZXJUeXBlQ291bnQgPSBtZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsKKwlpbnQgZmllbGRJbmRleCA9IDA7CisJaW50IG1ldGhvZEluZGV4ID0gMDsKKwlpbnQgbWVtYmVyVHlwZUluZGV4ID0gMDsKKwlib29sZWFuIGlzSW50ZXJmYWNlID0gdHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCk7CisKKwlpZiAobm90aWZ5VHlwZVByZXNlbmNlKXsKKwkJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBudWxsOworCQlpbnQgc3VwZXJJbnRlcmZhY2VzTGVuZ3RoID0gMDsKKwkJVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXM7CisJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJc3VwZXJJbnRlcmZhY2VzTGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCWludGVyZmFjZU5hbWVzID0gbmV3IGNoYXJbc3VwZXJJbnRlcmZhY2VzTGVuZ3RoXVtdOworCQl9IGVsc2UgeworCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKSB7CisJCQkJLy8gc2VlIFBSIDM0NDIKKwkJCQlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYyA9ICgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKS5hbGxvY2F0aW9uOworCQkJCWlmIChhbGxvYyAhPSBudWxsICYmIGFsbG9jLnR5cGUgIT0gbnVsbCkgeworCQkJCQlzdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtdIHsgKChBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pLmFsbG9jYXRpb24udHlwZX07CisJCQkJCXN1cGVySW50ZXJmYWNlc0xlbmd0aCA9IDE7CisJCQkJCWludGVyZmFjZU5hbWVzID0gbmV3IGNoYXJbMV1bXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlc0xlbmd0aDsgaSsrKSB7CisJCQkJaW50ZXJmYWNlTmFtZXNbaV0gPSAKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVySW50ZXJmYWNlc1tpXS5nZXRUeXBlTmFtZSgpLCAnLicpOyAKKwkJCX0KKwkJfQorCQlpZiAoaXNJbnRlcmZhY2UpIHsKKwkJCWlmIChpc0luUmFuZ2UpeworCQkJCXJlcXVlc3Rvci5lbnRlckludGVyZmFjZSgKKwkJCQkJdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQkJCQl0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQWNjSnVzdEZsYWcsIAorCQkJCQl0eXBlRGVjbGFyYXRpb24ubmFtZSwgCisJCQkJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgCisJCQkJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQsIAorCQkJCQlpbnRlcmZhY2VOYW1lcyk7CisJCQl9CisJCQlpZiAobmVzdGVkVHlwZUluZGV4ID09IHR5cGVOYW1lcy5sZW5ndGgpIHsKKwkJCQkvLyBuZWVkIGEgcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZXMsIDAsICh0eXBlTmFtZXMgPSBuZXcgY2hhcltuZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgbmVzdGVkVHlwZUluZGV4KTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyVHlwZU5hbWVzLCAwLCAoc3VwZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltuZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgbmVzdGVkVHlwZUluZGV4KTsKKwkJCX0KKwkJCXR5cGVOYW1lc1tuZXN0ZWRUeXBlSW5kZXhdID0gdHlwZURlY2xhcmF0aW9uLm5hbWU7CisJCQlzdXBlclR5cGVOYW1lc1tuZXN0ZWRUeXBlSW5kZXgrK10gPSBKQVZBX0xBTkdfT0JKRUNUOworCQl9IGVsc2UgeworCQkJVHlwZVJlZmVyZW5jZSBzdXBlcmNsYXNzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVyY2xhc3M7CisJCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7CisJCQkJaWYgKGlzSW5SYW5nZSl7CisJCQkJCXJlcXVlc3Rvci5lbnRlckNsYXNzKAorCQkJCQkJdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAorCQkJCQkJdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycywgCisJCQkJCQl0eXBlRGVjbGFyYXRpb24ubmFtZSwgCisJCQkJCQl0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIAorCQkJCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwgCisJCQkJCQludWxsLCAKKwkJCQkJCWludGVyZmFjZU5hbWVzKTsgCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNJblJhbmdlKXsKKwkJCQkJcmVxdWVzdG9yLmVudGVyQ2xhc3MoCisJCQkJCQl0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCisJCQkJCQl0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzLCAKKwkJCQkJCXR5cGVEZWNsYXJhdGlvbi5uYW1lLCAKKwkJCQkJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgCisJCQkJCQl0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kLCAKKwkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzdXBlcmNsYXNzLmdldFR5cGVOYW1lKCksICcuJyksIAorCQkJCQkJaW50ZXJmYWNlTmFtZXMpOyAKKwkJCQl9CisJCQl9CisJCQlpZiAobmVzdGVkVHlwZUluZGV4ID09IHR5cGVOYW1lcy5sZW5ndGgpIHsKKwkJCQkvLyBuZWVkIGEgcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZXMsIDAsICh0eXBlTmFtZXMgPSBuZXcgY2hhcltuZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgbmVzdGVkVHlwZUluZGV4KTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyVHlwZU5hbWVzLCAwLCAoc3VwZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltuZXN0ZWRUeXBlSW5kZXggKiAyXVtdKSwgMCwgbmVzdGVkVHlwZUluZGV4KTsKKwkJCX0KKwkJCXR5cGVOYW1lc1tuZXN0ZWRUeXBlSW5kZXhdID0gdHlwZURlY2xhcmF0aW9uLm5hbWU7CisJCQlzdXBlclR5cGVOYW1lc1tuZXN0ZWRUeXBlSW5kZXgrK10gPSBzdXBlcmNsYXNzID09IG51bGwgPyBKQVZBX0xBTkdfT0JKRUNUIDogQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHN1cGVyY2xhc3MuZ2V0VHlwZU5hbWUoKSwgJy4nKTsKKwkJfQorCX0KKwl3aGlsZSAoKGZpZWxkSW5kZXggPCBmaWVsZENvdW50KQorCQl8fCAobWVtYmVyVHlwZUluZGV4IDwgbWVtYmVyVHlwZUNvdW50KQorCQl8fCAobWV0aG9kSW5kZXggPCBtZXRob2RDb3VudCkpIHsKKwkJRmllbGREZWNsYXJhdGlvbiBuZXh0RmllbGREZWNsYXJhdGlvbiA9IG51bGw7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbnVsbDsKKwkJVHlwZURlY2xhcmF0aW9uIG5leHRNZW1iZXJEZWNsYXJhdGlvbiA9IG51bGw7CisKKwkJaW50IHBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCWludCBuZXh0RGVjbGFyYXRpb25UeXBlID0gLTE7CisJCWlmIChmaWVsZEluZGV4IDwgZmllbGRDb3VudCkgeworCQkJbmV4dEZpZWxkRGVjbGFyYXRpb24gPSBmaWVsZHNbZmllbGRJbmRleF07CisJCQlpZiAobmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJcG9zaXRpb24gPSBuZXh0RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJCW5leHREZWNsYXJhdGlvblR5cGUgPSAwOyAvLyBGSUVMRAorCQkJfQorCQl9CisJCWlmIChtZXRob2RJbmRleCA8IG1ldGhvZENvdW50KSB7CisJCQluZXh0TWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RzW21ldGhvZEluZGV4XTsKKwkJCWlmIChuZXh0TWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJcG9zaXRpb24gPSBuZXh0TWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQluZXh0RGVjbGFyYXRpb25UeXBlID0gMTsgLy8gTUVUSE9ECisJCQl9CisJCX0KKwkJaWYgKG1lbWJlclR5cGVJbmRleCA8IG1lbWJlclR5cGVDb3VudCkgeworCQkJbmV4dE1lbWJlckRlY2xhcmF0aW9uID0gbWVtYmVyVHlwZXNbbWVtYmVyVHlwZUluZGV4XTsKKwkJCWlmIChuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJcG9zaXRpb24gPSBuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQluZXh0RGVjbGFyYXRpb25UeXBlID0gMjsgLy8gTUVNQkVSCisJCQl9CisJCX0KKwkJc3dpdGNoIChuZXh0RGVjbGFyYXRpb25UeXBlKSB7CisJCQljYXNlIDAgOgorCQkJCWZpZWxkSW5kZXgrKzsKKwkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKG5leHRGaWVsZERlY2xhcmF0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJbWV0aG9kSW5kZXgrKzsKKwkJCQlub3RpZnlTb3VyY2VFbGVtZW50UmVxdWVzdG9yKG5leHRNZXRob2REZWNsYXJhdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCW1lbWJlclR5cGVJbmRleCsrOworCQkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IobmV4dE1lbWJlckRlY2xhcmF0aW9uLCB0cnVlKTsKKwkJfQorCX0KKwlpZiAobm90aWZ5VHlwZVByZXNlbmNlKXsKKwkJaWYgKGlzSW5SYW5nZSl7CisJCQlpZiAoaXNJbnRlcmZhY2UpIHsKKwkJCQlyZXF1ZXN0b3IuZXhpdEludGVyZmFjZSh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXF1ZXN0b3IuZXhpdENsYXNzKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCQl9CisJCX0KKwkJbmVzdGVkVHlwZUluZGV4LS07CisJfQorfQorcHVibGljIHZvaWQgcGFyc2VDb21waWxhdGlvblVuaXQoCisJSUNvbXBpbGF0aW9uVW5pdCB1bml0LCAKKwlpbnQgc3RhcnQsIAorCWludCBlbmQsIAorCWJvb2xlYW4gbmVlZFJlZmVyZW5jZUluZm8pIHsKKworCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBuZWVkUmVmZXJlbmNlSW5mbzsKKwlib29sZWFuIG9sZCA9IGRpZXQ7CisJaWYgKG5lZWRSZWZlcmVuY2VJbmZvKSB7CisJCXVua25vd25SZWZzID0gbmV3IE5hbWVSZWZlcmVuY2VbMTBdOworCQl1bmtub3duUmVmc0NvdW50ZXIgPSAwOworCX0KKwl0cnkgeworCQlkaWV0ID0gdHJ1ZTsKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Vbml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHVuaXQsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2UodW5pdCwgY29tcGlsYXRpb25Vbml0UmVzdWx0LCBzdGFydCwgZW5kKTsKKwkJaWYgKG5lZWRSZWZlcmVuY2VJbmZvKXsKKwkJCWRpZXQgPSBmYWxzZTsKKwkJCXRoaXMuZ2V0TWV0aG9kQm9kaWVzKHBhcnNlZFVuaXQpOworCQl9CQkKKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IocGFyc2VkVW5pdCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJfSBmaW5hbGx5IHsKKwkJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgeworCQkJcmVxdWVzdG9yLmFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoc2Nhbm5lci5nZXRMaW5lRW5kcygpKTsKKwkJfQorCQlkaWV0ID0gb2xkOworCX0KK30KK3B1YmxpYyB2b2lkIHBhcnNlQ29tcGlsYXRpb25Vbml0KAorCUlDb21waWxhdGlvblVuaXQgdW5pdCwgCisJYm9vbGVhbiBuZWVkUmVmZXJlbmNlSW5mbykgeworCWJvb2xlYW4gb2xkID0gZGlldDsKKwlpZiAobmVlZFJlZmVyZW5jZUluZm8pIHsKKwkJdW5rbm93blJlZnMgPSBuZXcgTmFtZVJlZmVyZW5jZVsxMF07CisJCXVua25vd25SZWZzQ291bnRlciA9IDA7CisJfQorCQkKKwl0cnkgeworLyoJCWRpZXQgPSAhbmVlZFJlZmVyZW5jZUluZm87CisJCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBuZWVkUmVmZXJlbmNlSW5mbzsKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Vbml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHVuaXQsIDAsIDApOworCQlwYXJzZSh1bml0LCBjb21waWxhdGlvblVuaXRSZXN1bHQpOwkJCisqLwkJZGlldCA9IHRydWU7CisJCXJlcG9ydFJlZmVyZW5jZUluZm8gPSBuZWVkUmVmZXJlbmNlSW5mbzsKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25Vbml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHVuaXQsIDAsIDAsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2UodW5pdCwgY29tcGlsYXRpb25Vbml0UmVzdWx0KTsKKwkJaW50IGluaXRpYWxTdGFydCA9IHRoaXMuc2Nhbm5lci5pbml0aWFsUG9zaXRpb247CisJCWludCBpbml0aWFsRW5kID0gdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uOworCQlpZiAobmVlZFJlZmVyZW5jZUluZm8peworCQkJZGlldCA9IGZhbHNlOworCQkJdGhpcy5nZXRNZXRob2RCb2RpZXMocGFyc2VkVW5pdCk7CisJCX0KKwkJdGhpcy5zY2FubmVyLnJlc2V0VG8oaW5pdGlhbFN0YXJ0LCBpbml0aWFsRW5kKTsKKwkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihwYXJzZWRVbml0KTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwl9IGZpbmFsbHkgeworCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCQl9CisJCWRpZXQgPSBvbGQ7CisJfQorfQorcHVibGljIHZvaWQgcGFyc2VUeXBlTWVtYmVyRGVjbGFyYXRpb25zKAorCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUsIAorCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgCisJaW50IHN0YXJ0LCAKKwlpbnQgZW5kLCAKKwlib29sZWFuIG5lZWRSZWZlcmVuY2VJbmZvKSB7CisJYm9vbGVhbiBvbGQgPSBkaWV0OworCWlmIChuZWVkUmVmZXJlbmNlSW5mbykgeworCQl1bmtub3duUmVmcyA9IG5ldyBOYW1lUmVmZXJlbmNlWzEwXTsKKwkJdW5rbm93blJlZnNDb3VudGVyID0gMDsKKwl9CisJCisJdHJ5IHsKKwkJZGlldCA9ICFuZWVkUmVmZXJlbmNlSW5mbzsKKwkJcmVwb3J0UmVmZXJlbmNlSW5mbyA9IG5lZWRSZWZlcmVuY2VJbmZvOworCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblVuaXRSZXN1bHQgPSAKKwkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsgCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSAKKwkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQkJbmV3IElTb3VyY2VUeXBlW117c291cmNlVHlwZX0sIAorCQkJCWZhbHNlLAorCQkJCWZhbHNlLCAKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCisJCQkJY29tcGlsYXRpb25Vbml0UmVzdWx0KTsgCisJCWlmICgodW5pdCA9PSBudWxsKSB8fCAodW5pdC50eXBlcyA9PSBudWxsKSB8fCAodW5pdC50eXBlcy5sZW5ndGggIT0gMSkpCisJCQlyZXR1cm47CisJCXRoaXMuc291cmNlVHlwZSA9IHNvdXJjZVR5cGU7CisJCXRyeSB7CisJCQkvKiBhdXRvbWF0b24gaW5pdGlhbGl6YXRpb24gKi8KKwkJCWluaXRpYWxpemUoKTsKKwkJCWdvRm9yQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCk7CisJCQkvKiBzY2FubmVyIGluaXRpYWxpemF0aW9uICovCisJCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2VVbml0LmdldENvbnRlbnRzKCkpOworCQkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQkJLyogdW5pdCBjcmVhdGlvbiAqLworCQkJcmVmZXJlbmNlQ29udGV4dCA9IGNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7CisJCQkvKiBpbml0aWFsaXplIHRoZSBhc3RTdGFjbCAqLworCQkJLy8gdGhlIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHR5cGUKKwkJCXB1c2hPbkFzdFN0YWNrKHVuaXQudHlwZXNbMF0pOworCQkJLyogcnVuIGF1dG9tYXRvbiAqLworCQkJcGFyc2UoKTsKKwkJCW5vdGlmeVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IodW5pdCk7CisJCX0gZmluYWxseSB7CisJCQl1bml0ID0gY29tcGlsYXRpb25Vbml0OworCQkJY29tcGlsYXRpb25Vbml0ID0gbnVsbDsgLy8gcmVzZXQgcGFyc2VyCisJCX0KKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwl9IGZpbmFsbHkgeworCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCQl9CisJCWRpZXQgPSBvbGQ7CisJfQorfQorCitwdWJsaWMgdm9pZCBwYXJzZVR5cGVNZW1iZXJEZWNsYXJhdGlvbnMoCisJY2hhcltdIGNvbnRlbnRzLCAKKwlpbnQgc3RhcnQsIAorCWludCBlbmQpIHsKKworCWJvb2xlYW4gb2xkID0gZGlldDsKKwkKKwl0cnkgeworCQlkaWV0ID0gdHJ1ZTsKKworCQkvKiBhdXRvbWF0b24gaW5pdGlhbGl6YXRpb24gKi8KKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvckNsYXNzQm9keURlY2xhcmF0aW9ucygpOworCQkvKiBzY2FubmVyIGluaXRpYWxpemF0aW9uICovCisJCXNjYW5uZXIuc2V0U291cmNlKGNvbnRlbnRzKTsKKwkJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKworCQkvKiB1bml0IGNyZWF0aW9uICovCisJCXJlZmVyZW5jZUNvbnRleHQgPSBudWxsOworCisJCS8qIGluaXRpYWxpemUgdGhlIGFzdFN0YWNsICovCisJCS8vIHRoZSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSB0eXBlCisJCS8qIHJ1biBhdXRvbWF0b24gKi8KKwkJcGFyc2UoKTsKKwkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcigoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pbnVsbCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJfSBmaW5hbGx5IHsKKwkJZGlldCA9IG9sZDsKKwl9Cit9CisvKioKKyAqIFNvcnQgdGhlIGdpdmVuIGFzdCBub2RlcyBieSB0aGVpciBwb3NpdGlvbnMuCisgKi8KK3ByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KEFzdE5vZGVbXSBzb3J0ZWRDb2xsZWN0aW9uLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OworCUFzdE5vZGUgbWlkID0gc29ydGVkQ29sbGVjdGlvblsgKGxlZnQgKyByaWdodCkgLyAyXTsKKwlkbyB7CisJCXdoaWxlIChzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLnNvdXJjZVN0YXJ0IDwgbWlkLnNvdXJjZVN0YXJ0KSB7CisJCQlsZWZ0Kys7CisJCX0KKwkJd2hpbGUgKG1pZC5zb3VyY2VTdGFydCA8IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdLnNvdXJjZVN0YXJ0KSB7CisJCQlyaWdodC0tOworCQl9CisJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQlBc3ROb2RlIHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJfQorCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKKwkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwl9Cit9CisvKgorICogQW5zd2VyIGEgY2hhciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBuYW1lIGZvcm1hdHRlZCBsaWtlOgorICogLSB0eXBlIG5hbWUgKyBkaW1lbnNpb25zCisgKiBFeGFtcGxlOgorICogIkFbXVtdIi50b0NoYXJBcnJheSgpCisgKiAiamF2YS5sYW5nLlN0cmluZyIudG9DaGFyQXJyYXkoKQorICovCitwcml2YXRlIGNoYXJbXSByZXR1cm5UeXBlTmFtZShUeXBlUmVmZXJlbmNlIHR5cGUpIHsKKwlpZiAodHlwZSA9PSBudWxsKQorCQlyZXR1cm4gbnVsbDsKKwlpbnQgZGltZW5zaW9uID0gdHlwZS5kaW1lbnNpb25zKCk7CisJaWYgKGRpbWVuc2lvbiAhPSAwKSB7CisJCWNoYXJbXSBkaW1lbnNpb25zQXJyYXkgPSBuZXcgY2hhcltkaW1lbnNpb24gKiAyXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykgeworCQkJZGltZW5zaW9uc0FycmF5W2kgKiAyXSA9ICdbJzsKKwkJCWRpbWVuc2lvbnNBcnJheVsoaSAqIDIpICsgMV0gPSAnXSc7CisJCX0KKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGUuZ2V0VHlwZU5hbWUoKSwgJy4nKSwgCisJCQlkaW1lbnNpb25zQXJyYXkpOyAKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlLmdldFR5cGVOYW1lKCksICcuJyk7Cit9CisKK3B1YmxpYyB2b2lkIGFkZFVua25vd25SZWYoTmFtZVJlZmVyZW5jZSBuYW1lUmVmKSB7CisJaWYgKHRoaXMudW5rbm93blJlZnMubGVuZ3RoID09IHRoaXMudW5rbm93blJlZnNDb3VudGVyKSB7CisJCS8vIHJlc2l6ZQorCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJdGhpcy51bmtub3duUmVmcywKKwkJCTAsCisJCQkodGhpcy51bmtub3duUmVmcyA9IG5ldyBOYW1lUmVmZXJlbmNlW3RoaXMudW5rbm93blJlZnNDb3VudGVyICogMl0pLAorCQkJMCwKKwkJCXRoaXMudW5rbm93blJlZnNDb3VudGVyKTsKKwl9CisJdGhpcy51bmtub3duUmVmc1t0aGlzLnVua25vd25SZWZzQ291bnRlcisrXSA9IG5hbWVSZWY7Cit9Citwcml2YXRlIFR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSgKKwlpbnQgZGltLCAKKwlpbnQgbG9jYWxJZGVudGlmaWVyUHRyLCAKKwlpbnQgbG9jYWxJZGVudGlmaWVyTGVuZ3RoUHRyKSB7CisJLyogYnVpbGQgYSBSZWZlcmVuY2Ugb24gYSB2YXJpYWJsZSB0aGF0IG1heSBiZSBxdWFsaWZpZWQgb3Igbm90CisJICogVGhpcyB2YXJpYWJsZSBpcyBhIHR5cGUgcmVmZXJlbmNlIGFuZCBkaW0gd2lsbCBiZSBpdHMgZGltZW5zaW9ucy4KKwkgKiBXZSBkb24ndCBoYXZlIGFueSBzaWRlIGVmZmVjdCBvbiB0aGUgc3RhY2tzJyBwb2ludGVycy4KKwkgKi8KKworCWludCBsZW5ndGg7CisJVHlwZVJlZmVyZW5jZSByZWY7CisJaWYgKChsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbbG9jYWxJZGVudGlmaWVyTGVuZ3RoUHRyXSkgPT0gMSkgeworCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCisJCWlmIChkaW0gPT0gMCkgeworCQkJcmVmID0gCisJCQkJbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UoCisJCQkJCWlkZW50aWZpZXJTdGFja1tsb2NhbElkZW50aWZpZXJQdHJdLCAKKwkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbbG9jYWxJZGVudGlmaWVyUHRyLS1dKTsgCisJCX0gZWxzZSB7CisJCQlyZWYgPSAKKwkJCQluZXcgQXJyYXlUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbbG9jYWxJZGVudGlmaWVyUHRyXSwgCisJCQkJCWRpbSwgCisJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2xvY2FsSWRlbnRpZmllclB0ci0tXSk7CisJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CQkJIAorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxlbmd0aCA8IDApIHsgLy9mbGFnIGZvciBwcmVjb21waWxlZCB0eXBlIHJlZmVyZW5jZSBvbiBiYXNlIHR5cGVzCisJCQlyZWYgPSBUeXBlUmVmZXJlbmNlLmJhc2VUeXBlUmVmZXJlbmNlKC1sZW5ndGgsIGRpbSk7CisJCQlyZWYuc291cmNlU3RhcnQgPSBpbnRTdGFja1tsb2NhbEludFB0ci0tXTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZi5zb3VyY2VFbmQgPSBpbnRTdGFja1tsb2NhbEludFB0ci0tXTsKKwkJCX0gZWxzZSB7CisJCQkJbG9jYWxJbnRQdHItLTsKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CQorCQl9IGVsc2UgeyAvL1F1YWxpZmllZCB2YXJpYWJsZSByZWZlcmVuY2UKKwkJCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCWxvY2FsSWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJCQlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBsb2NhbElkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJCQlsb2NhbElkZW50aWZpZXJQdHIgKyAxLCAKKwkJCQlwb3NpdGlvbnMsIAorCQkJCTAsIAorCQkJCWxlbmd0aCk7IAorCQkJaWYgKGRpbSA9PSAwKSAgeworCQkJCXJlZiA9IG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVmID0gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CisJCX0KKwl9OworCXJldHVybiByZWY7Cit9CisKK3ByaXZhdGUgdm9pZCB2aXNpdElmTmVlZGVkKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisJaWYgKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgIT0gbnVsbCAKKwkJJiYgKG1ldGhvZC5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwKSB7CisJCQlpZiAobWV0aG9kLnN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gbWV0aG9kLnN0YXRlbWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50c0xlbmd0aDsgaSsrKQorCQkJCQltZXRob2Quc3RhdGVtZW50c1tpXS50cmF2ZXJzZSh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCBtZXRob2Quc2NvcGUpOworCQkJfQorCX0KK30KKworcHJpdmF0ZSB2b2lkIHZpc2l0SWZOZWVkZWQoRmllbGREZWNsYXJhdGlvbiBmaWVsZCkgeworCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yICE9IG51bGwgCisJCSYmIChmaWVsZC5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwKSB7CisJCQlpZiAoZmllbGQuaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJCWZpZWxkLmluaXRpYWxpemF0aW9uLnRyYXZlcnNlKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIG51bGwpOworCQkJfQorCX0KK30KKworcHJpdmF0ZSB2b2lkIHZpc2l0SWZOZWVkZWQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSBudWxsIAorCQkmJiAoaW5pdGlhbGl6ZXIuYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgIT0gMCkgeworCQkJaWYgKGluaXRpYWxpemVyLmJsb2NrICE9IG51bGwpIHsKKwkJCQlpbml0aWFsaXplci5ibG9jay50cmF2ZXJzZSh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCBudWxsKTsKKwkJCX0KKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIHJlcG9ydFN5bnRheEVycm9yKGludCBhY3QsIGludCBjdXJyZW50S2luZCwgaW50IHN0YXRlU3RhY2tUb3ApIHsKKwlpZiAoY29tcGlsYXRpb25Vbml0ID09IG51bGwpIHJldHVybjsKKwlzdXBlci5yZXBvcnRTeW50YXhFcnJvcihhY3QsIGN1cnJlbnRLaW5kLHN0YXRlU3RhY2tUb3ApOworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzhhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CisKK3B1YmxpYyBjbGFzcyBTb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlciBpbXBsZW1lbnRzIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yIHsKKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShjaGFyW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKAorCQljaGFyW10gdHlwZU5hbWUsCisJCWludCBhcmdDb3VudCwKKwkJaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEZpZWxkUmVmZXJlbmNlKGNoYXJbXSwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEZpZWxkUmVmZXJlbmNlKGNoYXJbXSBmaWVsZE5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNhY2NlcHRJbXBvcnQoaW50LCBpbnQsIGNoYXJbXSwgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgZGVjbGFyYXRpb25FbmQsCisJCWNoYXJbXSBuYW1lLAorCQlib29sZWFuIG9uRGVtYW5kKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoaW50W10pCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0TWV0aG9kUmVmZXJlbmNlKGNoYXJbXSwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKAorCQljaGFyW10gbWV0aG9kTmFtZSwKKwkJaW50IGFyZ0NvdW50LAorCQlpbnQgc291cmNlUG9zaXRpb24pIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0UGFja2FnZShpbnQsIGludCwgY2hhcltdKQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgZGVjbGFyYXRpb25FbmQsCisJCWNoYXJbXSBuYW1lKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdFByb2JsZW0oSVByb2JsZW0pCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdFR5cGVSZWZlcmVuY2UoY2hhcltdW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGVSZWZlcmVuY2UoCisJCWNoYXJbXVtdIHR5cGVOYW1lLAorCQlpbnQgc291cmNlU3RhcnQsCisJCWludCBzb3VyY2VFbmQpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0VHlwZVJlZmVyZW5jZShjaGFyW10sIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoCisJCWNoYXJbXVtdIG5hbWUsCisJCWludCBzb3VyY2VTdGFydCwKKwkJaW50IHNvdXJjZUVuZCkgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNhY2NlcHRVbmtub3duUmVmZXJlbmNlKGNoYXJbXSwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdIG5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckNsYXNzKGludCwgaW50LCBjaGFyW10sIGludCwgaW50LCBjaGFyW10sIGNoYXJbXVtdKQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyQ2xhc3MoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gbmFtZSwKKwkJaW50IG5hbWVTb3VyY2VTdGFydCwKKwkJaW50IG5hbWVTb3VyY2VFbmQsCisJCWNoYXJbXSBzdXBlcmNsYXNzLAorCQljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJDb21waWxhdGlvblVuaXQoKQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyQ29tcGlsYXRpb25Vbml0KCkgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckNvbnN0cnVjdG9yKGludCwgaW50LCBjaGFyW10sIGludCwgaW50LCBjaGFyW11bXSwgY2hhcltdW10sIGNoYXJbXVtdKQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gbmFtZSwKKwkJaW50IG5hbWVTb3VyY2VTdGFydCwKKwkJaW50IG5hbWVTb3VyY2VFbmQsCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJGaWVsZChpbnQsIGludCwgY2hhcltdLCBjaGFyW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyRmllbGQoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gdHlwZSwKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVySW5pdGlhbGl6ZXIoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgZW50ZXJJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycykgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckludGVyZmFjZShpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgY2hhcltdW10pCisJICovCisJcHVibGljIHZvaWQgZW50ZXJJbnRlcmZhY2UoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gbmFtZSwKKwkJaW50IG5hbWVTb3VyY2VTdGFydCwKKwkJaW50IG5hbWVTb3VyY2VFbmQsCisJCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlck1ldGhvZChpbnQsIGludCwgY2hhcltdLCBjaGFyW10sIGludCwgaW50LCBjaGFyW11bXSwgY2hhcltdW10sIGNoYXJbXVtdKQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyTWV0aG9kKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIHJldHVyblR5cGUsCisJCWNoYXJbXSBuYW1lLAorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCQlpbnQgbmFtZVNvdXJjZUVuZCwKKwkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCQljaGFyW11bXSBleGNlcHRpb25UeXBlcykgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0Q2xhc3MoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRDbGFzcyhpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbXBpbGF0aW9uVW5pdChpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbnN0cnVjdG9yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0Q29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2V4aXRGaWVsZChpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgeworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0SW5pdGlhbGl6ZXIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdEludGVyZmFjZShpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdE1ldGhvZChpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BTkRfQU5EX0V4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQU5EX0FORF9FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmYzgyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQU5EX0FORF9FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCisvL2RlZGljYXRlZCB0cmVhdG1lbnQgZm9yIHRoZSAmJgorcHVibGljIGNsYXNzIEFORF9BTkRfRXhwcmVzc2lvbiBleHRlbmRzIEJpbmFyeUV4cHJlc3Npb24geworCisJaW50IHJpZ2h0SW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKKworCXB1YmxpYyBBTkRfQU5EX0V4cHJlc3Npb24oRXhwcmVzc2lvbiBsZWZ0LCBFeHByZXNzaW9uIHJpZ2h0LCBpbnQgb3BlcmF0b3IpIHsKKwkJc3VwZXIobGVmdCwgcmlnaHQsIG9wZXJhdG9yKTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlDb25zdGFudCBvcENvbnN0YW50ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCk7CisJCWlmIChvcENvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJaWYgKG9wQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCS8vIFRSVUUgJiYgYW55dGhpbmcKKwkJCQkgLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgorCQkJCS8vCQkoeCAmJiB5KSAmJiAheiwgaWYgcGFzc2luZyB0aGUgbGVmdCBpbmZvIHRvIHRoZSByaWdodCwgaXQgd291bGQgYmUgc3dhcHBlZCBieSB0aGUgIQorCQkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsgCisJCQkJbWVyZ2VkSW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOworCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCQl9CisJCX0KKwkJRmxvd0luZm8gbGVmdEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJIC8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzY2VuYXJpbzoKKwkJLy8JCSh4ICYmIHkpICYmICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZCBiZSBzd2FwcGVkIGJ5IHRoZSAhCisJCUZsb3dJbmZvIHJpZ2h0SW5mbyA9IGxlZnRJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5jb3B5KCk7CisJCWlmIChvcENvbnN0YW50ICE9IE5vdEFDb25zdGFudCAmJiBvcENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSByaWdodEluZm8ubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKworCQlyaWdodEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHJpZ2h0SW5mbyk7CisJCXJpZ2h0SW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHJpZ2h0SW5mbyk7CisJCUZsb3dJbmZvIG1lcmdlZEluZm8gPQorCQkJRmxvd0luZm8uY29uZGl0aW9uYWwoCisJCQkJcmlnaHRJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCksCisJCQkJbGVmdEluZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKKwkJCQkJcmlnaHRJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKSk7CisJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwl9CisKKwkvKioKKwkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGEgYmluYXJ5IG9wZXJhdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCQkKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJTGFiZWwgZmFsc2VMYWJlbCwgZW5kTGFiZWw7CisJCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCS8vIGlubGluZWQgdmFsdWUKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQlyZXR1cm47CisJCX0KKwkJYml0cyB8PSBPbmx5VmFsdWVSZXF1aXJlZE1BU0s7CisJCWdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCWN1cnJlbnRTY29wZSwKKwkJCWNvZGVTdHJlYW0sCisJCQludWxsLAorCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJdmFsdWVSZXF1aXJlZCk7CisJCS8qIGltcHJvdmluZyBjb2RlIGdlbiBmb3Igc3VjaCBhIGNhc2U6IGJvb2xlYW4gYiA9IGkgPCAwICYmIGZhbHNlCisJCSAqIHNpbmNlIHRoZSBsYWJlbCBoYXMgbmV2ZXIgYmVlbiB1c2VkLCB3ZSBoYXZlIHRoZSBpbmxpbmVkIHZhbHVlIG9uIHRoZSBzdGFjay4gKi8KKwkJaWYgKGZhbHNlTGFiZWwuaGFzRm9yd2FyZFJlZmVyZW5jZXMoKSkgeworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQljb2RlU3RyZWFtLmljb25zdF8xKCk7CisJCQkJaWYgKChiaXRzICYgVmFsdWVGb3JSZXR1cm5NQVNLKSAhPSAwKSB7CisJCQkJCWNvZGVTdHJlYW0uaXJldHVybigpOworCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZExhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKTsKKwkJCQkJY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKDEpOworCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJZW5kTGFiZWwucGxhY2UoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCX0KKwkJfQorCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJLyoqCisJICogQm9vbGVhbiBvcGVyYXRvciBjb2RlIGdlbmVyYXRpb24KKwkgKglPcHRpbWl6ZWQgb3BlcmF0aW9ucyBhcmU6ICYmCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQlpZiAoKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJQ29uc3RhbnQgY29uZENvbnN0OworCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiAmJiB4CisJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQlmYWxzZSk7CisJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCByaWdodEluaXRTdGF0ZUluZGV4KTsKKwkJCQl9CisJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+ICYmIHgKKwkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCWZhbHNlKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uZ290b18oZmFsc2VMYWJlbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWlmICgoY29uZENvbnN0ID0gcmlnaHQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCS8vIHggJiYgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+CisJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCX0KKwkJCQlpZiAocmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOworCQkJCX0KKwkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQlmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHggJiYgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPgorCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCXRydWVMYWJlbCwKKwkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJZmFsc2UpOworCQkJCWlmIChyaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJfQorCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCWZhbHNlKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uZ290b18oZmFsc2VMYWJlbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCS8vIGRlZmF1bHQgY2FzZQorCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQlMYWJlbCBpbnRlcm5hbEZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJbnVsbCwKKwkJCQkJaW50ZXJuYWxGYWxzZUxhYmVsLAorCQkJCQl0cnVlKTsKKwkJCQlpZiAocmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOworCQkJCX0KKwkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQludWxsLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpbnRlcm5hbEZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG51bGwsIGZhbHNlTGFiZWwsIHRydWUpOworCQkJCWlmIChyaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJfQorCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQludWxsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJfQorCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlyaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZTBiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCisJZXh0ZW5kcyBBc3ROb2RlCisJaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgUmVmZXJlbmNlQ29udGV4dCB7CisJCQorCXB1YmxpYyBNZXRob2RTY29wZSBzY29wZTsKKwkvL2l0IGlzIG5vdCByZWxldmVudCBmb3IgY29uc3RydWN0b3IgYnV0IGl0IGhlbHBzIHRvIGhhdmUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIGhlcmUgCisJLy93aGljaCBpcyBhbHdheXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLi4uLi5wYXJzaW5nIGRvIGV4dHJhIHdvcmsgdG8gZmlsbCBpdCB1cCB3aGlsZSBpdCBkbyBub3QgaGF2ZSB0by4uLi4KKwlwdWJsaWMgY2hhcltdIHNlbGVjdG9yOworCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJcHVibGljIEFyZ3VtZW50W10gYXJndW1lbnRzOworCXB1YmxpYyBUeXBlUmVmZXJlbmNlW10gdGhyb3duRXhjZXB0aW9uczsKKwlwdWJsaWMgU3RhdGVtZW50W10gc3RhdGVtZW50czsKKwlwdWJsaWMgaW50IGV4cGxpY2l0RGVjbGFyYXRpb25zOworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGJpbmRpbmc7CisJcHVibGljIGJvb2xlYW4gaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSBmYWxzZTsKKwlwdWJsaWMgYm9vbGVhbiBuZWVkRnJlZVJldHVybiA9IGZhbHNlOworCisJcHVibGljIGludCBib2R5U3RhcnQ7CisJcHVibGljIGludCBib2R5RW5kID0gLTE7CisJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OworCQorCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCQl0aGlzLmNvbXBpbGF0aW9uUmVzdWx0ID0gY29tcGlsYXRpb25SZXN1bHQ7CisJfQorCQorCS8qCisJICoJV2UgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRhc2sgdG8gYWJvcnQgdG8gYSBnaXZlbiBleHRlbnQuCisJICovCisJcHVibGljIHZvaWQgYWJvcnQoaW50IGFib3J0TGV2ZWwpIHsKKworCQlpZiAoc2NvcGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24oKTsgLy8gY2Fubm90IGRvIGJldHRlcgorCQl9CisKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPQorCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQ7CisKKwkJc3dpdGNoIChhYm9ydExldmVsKSB7CisJCQljYXNlIEFib3J0Q29tcGlsYXRpb24gOgorCQkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCWNhc2UgQWJvcnRDb21waWxhdGlvblVuaXQgOgorCQkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblJlc3VsdCk7CisJCQljYXNlIEFib3J0VHlwZSA6CisJCQkJdGhyb3cgbmV3IEFib3J0VHlwZShjb21waWxhdGlvblJlc3VsdCk7CisJCQlkZWZhdWx0IDoKKwkJCQl0aHJvdyBuZXcgQWJvcnRNZXRob2QoY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoCisJCUNsYXNzU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBzdGFydGluZyBvZiB0aGUgY29kZSBhbmFseXNpcyBmb3IgbWV0aG9kcworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlpZiAoYmluZGluZyA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCS8vIG1heSBiZSBpbiBhIG5vbiBuZWNlc3NhcnkgPGNsaW5pdD4gZm9yIGlubmVyY2xhc3Mgd2l0aCBzdGF0aWMgZmluYWwgY29uc3RhbnQgZmllbGRzCisJCQlpZiAoYmluZGluZy5pc0Fic3RyYWN0KCkgfHwgYmluZGluZy5pc05hdGl2ZSgpKQorCQkJCXJldHVybjsKKworCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBtZXRob2RDb250ZXh0ID0KKwkJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKKwkJCQkJZmxvd0NvbnRleHQsCisJCQkJCXRoaXMsCisJCQkJCWJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywKKwkJCQkJc2NvcGUsCisJCQkJCUZsb3dJbmZvLkRlYWRFbmQpOworCisJCQkvLyBwcm9wYWdhdGUgdG8gc3RhdGVtZW50cworCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQlTdGF0ZW1lbnQgc3RhdDsKKwkJCQkJaWYgKCFmbG93SW5mby5jb21wbGFpbklmVW5yZWFjaGFibGUoKHN0YXQgPSBzdGF0ZW1lbnRzW2ldKSwgc2NvcGUpKSB7CisJCQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUoc2NvcGUsIG1ldGhvZENvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIGNoZWNrIGZvciBtaXNzaW5nIHJldHVybmluZyBwYXRoCisJCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gYmluZGluZy5yZXR1cm5UeXBlOworCQkJaWYgKChyZXR1cm5UeXBlID09IFZvaWRCaW5kaW5nKSB8fCBpc0Fic3RyYWN0KCkpIHsKKwkJCQluZWVkRnJlZVJldHVybiA9CisJCQkJCSEoKGZsb3dJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZsb3dJbmZvICE9IEZsb3dJbmZvLkRlYWRFbmQpIHsKKwkJCQkJLy8gc3BlY2lhbCB0ZXN0IGZvciBlbXB0eSBtZXRob2RzIHRoYXQgc2hvdWxkIHJldHVybiBzb21ldGhpbmcKKwkJCQkJaWYgKChzdGF0ZW1lbnRzID09IG51bGwpICYmIChyZXR1cm5UeXBlICE9IFZvaWRCaW5kaW5nKSkgeworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKHJldHVyblR5cGUsIHRoaXMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKAorCQkJCQkJCXJldHVyblR5cGUsCisJCQkJCQkJc3RhdGVtZW50c1tzdGF0ZW1lbnRzLmxlbmd0aCAtIDFdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBCaW5kIGFuZCBhZGQgYXJndW1lbnQncyBiaW5kaW5nIGludG8gdGhlIHNjb3BlIG9mIHRoZSBtZXRob2QKKwkgKi8KKwlwdWJsaWMgdm9pZCBiaW5kQXJndW1lbnRzKCkgeworCisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJLy8gYnkgZGVmYXVsdCBhcmd1bWVudHMgaW4gYWJzdHJhY3QvbmF0aXZlIG1ldGhvZHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgdXNlZCAobm8gY29tcGxhaW50IGlzIGV4cGVjdGVkKQorCQkJYm9vbGVhbiB1c2VkID0gYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcuaXNBYnN0cmFjdCgpIHx8IGJpbmRpbmcuaXNOYXRpdmUoKTsKKworCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZSA9IGJpbmRpbmcgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nLnBhcmFtZXRlcnNbaV07CisJCQkJYXJndW1lbnRzW2ldLmJpbmQoc2NvcGUsIGFyZ1R5cGUsIHVzZWQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmVjb3JkIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGUgYmluZGluZ3MgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSByZWZlcmVuY2VzLgorCSAqLworCXB1YmxpYyB2b2lkIGJpbmRUaHJvd25FeGNlcHRpb25zKCkgeworCisJCWlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbAorCQkJJiYgdGhpcy5iaW5kaW5nICE9IG51bGwKKwkJCSYmIHRoaXMuYmluZGluZy50aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLmJpbmRpbmcgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9uc1tpXTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCgpIHsKKwkJCisJCXJldHVybiB0aGlzLmNvbXBpbGF0aW9uUmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBCeXRlY29kZSBnZW5lcmF0aW9uIGZvciBhIG1ldGhvZAorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShDbGFzc1Njb3BlIGNsYXNzU2NvcGUsIENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwkJCisJCWludCBwcm9ibGVtUmVzZXRQQyA9IDA7CisJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLndpZGVNb2RlID0gZmFsc2U7IC8vIHJlc2V0IHdpZGVNb2RlIHRvIGZhbHNlCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikgeworCQkJLy8gbWV0aG9kIGlzIGtub3duIHRvIGhhdmUgZXJyb3JzLCBkdW1wIGEgcHJvYmxlbSBtZXRob2QKKwkJCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCkKKwkJCQlyZXR1cm47IC8vIGhhbmRsZSBtZXRob2RzIHdpdGggaW52YWxpZCBzaWduYXR1cmUgb3IgZHVwbGljYXRlcworCQkJaW50IHByb2JsZW1zTGVuZ3RoOworCQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9CisJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOworCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1NZXRob2QodGhpcywgYmluZGluZywgcHJvYmxlbXNDb3B5KTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyByZWd1bGFyIGNvZGUgZ2VuZXJhdGlvbgorCQl0cnkgeworCQkJcHJvYmxlbVJlc2V0UEMgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CisJCQl0aGlzLmdlbmVyYXRlQ29kZShjbGFzc0ZpbGUpOworCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7CisJCQkvLyBhIGZhdGFsIGVycm9yIHdhcyBkZXRlY3RlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBuZWVkIHRvIHJlc3RhcnQgY29kZSBnZW4gaWYgcG9zc2libGUKKwkJCWlmIChlLmNvbXBpbGF0aW9uUmVzdWx0ID09IENvZGVTdHJlYW0uUkVTVEFSVF9JTl9XSURFX01PREUpIHsKKwkJCQkvLyBhIGJyYW5jaCB0YXJnZXQgcmVxdWlyZWQgYSBnb3RvX3csIHJlc3RhcnQgY29kZSBnZW4gaW4gd2lkZSBtb2RlLgorCQkJCXRyeSB7CisJCQkJCXRoaXMudHJhdmVyc2UobmV3IFJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvblZpc2l0b3IoKSwgY2xhc3NTY29wZSk7CisJCQkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IHByb2JsZW1SZXNldFBDOworCQkJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKKwkJCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0ud2lkZU1vZGUgPSB0cnVlOyAvLyByZXF1ZXN0IHdpZGUgbW9kZSAKKwkJCQkJdGhpcy5nZW5lcmF0ZUNvZGUoY2xhc3NGaWxlKTsgLy8gcmVzdGFydCBtZXRob2QgZ2VuZXJhdGlvbgorCQkJCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUyKSB7CisJCQkJCWludCBwcm9ibGVtc0xlbmd0aDsKKwkJCQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9CisJCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCQlJUHJvYmxlbVtdIHByb2JsZW1zQ29weSA9IG5ldyBJUHJvYmxlbVtwcm9ibGVtc0xlbmd0aCA9IHByb2JsZW1zLmxlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOworCQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbU1ldGhvZCh0aGlzLCBiaW5kaW5nLCBwcm9ibGVtc0NvcHksIHByb2JsZW1SZXNldFBDKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHByb2R1Y2UgYSBwcm9ibGVtIG1ldGhvZCBhY2NvdW50aW5nIGZvciB0aGlzIGZhdGFsIGVycm9yCisJCQkJaW50IHByb2JsZW1zTGVuZ3RoOworCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPQorCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKKwkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbU1ldGhvZCh0aGlzLCBiaW5kaW5nLCBwcm9ibGVtc0NvcHksIHByb2JsZW1SZXNldFBDKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUNvZGUoQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCisJCWNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIoYmluZGluZyk7CisJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CisJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBjbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKGJpbmRpbmcpOworCQlpZiAoKCFiaW5kaW5nLmlzTmF0aXZlKCkpICYmICghYmluZGluZy5pc0Fic3RyYWN0KCkpKSB7CisJCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwkJCWNsYXNzRmlsZS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKKwkJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSA9IGNsYXNzRmlsZS5jb2RlU3RyZWFtOworCQkJY29kZVN0cmVhbS5yZXNldCh0aGlzLCBjbGFzc0ZpbGUpOworCQkJLy8gaW5pdGlhbGl6ZSBsb2NhbCBwb3NpdGlvbnMKKwkJCXNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKGJpbmRpbmcuaXNTdGF0aWMoKSA/IDAgOiAxLCBjb2RlU3RyZWFtKTsKKworCQkJLy8gYXJndW1lbnRzIGluaXRpYWxpemF0aW9uIGZvciBsb2NhbCB2YXJpYWJsZSBkZWJ1ZyBhdHRyaWJ1dGVzCisJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGFyZ0JpbmRpbmc7CisJCQkJCWNvZGVTdHJlYW0uYWRkVmlzaWJsZUxvY2FsVmFyaWFibGUoYXJnQmluZGluZyA9IGFyZ3VtZW50c1tpXS5iaW5kaW5nKTsKKwkJCQkJYXJnQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoMCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKQorCQkJCQlzdGF0ZW1lbnRzW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQl9CisJCQlpZiAobmVlZEZyZWVSZXR1cm4pIHsKKwkJCQljb2RlU3RyZWFtLnJldHVybl8oKTsKKwkJCX0KKwkJCS8vIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZShzY29wZSk7CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oMCwgdGhpcy5ib2R5RW5kKTsKKwkJCWNsYXNzRmlsZS5jb21wbGV0ZUNvZGVBdHRyaWJ1dGUoY29kZUF0dHJpYnV0ZU9mZnNldCk7CisJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfQorCQljbGFzc0ZpbGUuY29tcGxldGVNZXRob2RJbmZvKG1ldGhvZEF0dHJpYnV0ZU9mZnNldCwgYXR0cmlidXRlTnVtYmVyKTsKKworCQkvLyBpZiBhIHByb2JsZW0gZ290IHJlcG9ydGVkIGR1cmluZyBjb2RlIGdlbiwgdGhlbiB0cmlnZ2VyIHByb2JsZW0gbWV0aG9kIGNyZWF0aW9uCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikgeworCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKHNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKKwkJcmV0dXJuIHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb247CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKworCQlpZiAoYmluZGluZyAhPSBudWxsKQorCQkJcmV0dXJuIGJpbmRpbmcuaXNBYnN0cmFjdCgpOworCQlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0Fic3RyYWN0KSAhPSAwOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgeworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3RvcigpIHsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpIHsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNOYXRpdmUoKSB7CisKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkKKwkJCXJldHVybiBiaW5kaW5nLmlzTmF0aXZlKCk7CisJCXJldHVybiAobW9kaWZpZXJzICYgQWNjTmF0aXZlKSAhPSAwOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworCisJCWlmIChiaW5kaW5nICE9IG51bGwpCisJCQlyZXR1cm4gYmluZGluZy5pc1N0YXRpYygpOworCQlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1N0YXRpYykgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBGaWxsIHVwIHRoZSBtZXRob2QgYm9keSB3aXRoIHN0YXRlbWVudAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBhcnNlU3RhdGVtZW50cygKKwkJUGFyc2VyIHBhcnNlciwKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCk7CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKENsYXNzU2NvcGUgdXBwZXJTY29wZSkgeworCisJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCWlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJfQorCisJCXRyeSB7CisJCQliaW5kQXJndW1lbnRzKCk7IAorCQkJYmluZFRocm93bkV4Y2VwdGlvbnMoKTsKKwkJCXJlc29sdmVTdGF0ZW1lbnRzKHVwcGVyU2NvcGUpOworCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7CS8vID09PT09PT09PSBhYm9ydCBvbiBmYXRhbCBlcnJvciA9PT09PT09PT09PT09CisJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJfSAKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cyhDbGFzc1Njb3BlIHVwcGVyU2NvcGUpIHsKKworCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQlpbnQgaSA9IDAsIGxlbmd0aCA9IHN0YXRlbWVudHMubGVuZ3RoOworCQkJd2hpbGUgKGkgPCBsZW5ndGgpCisJCQkJc3RhdGVtZW50c1tpKytdLnJlc29sdmUoc2NvcGUpOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyByZXR1cm5UeXBlVG9TdHJpbmcoaW50IHRhYikgeworCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyB2b2lkIHRhZ0FzSGF2aW5nRXJyb3JzKCkgeworCisJCWlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpZiAobW9kaWZpZXJzICE9IEFjY0RlZmF1bHQpIHsKKwkJCXMgKz0gbW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycyk7CisJCX0KKworCQlzICs9IHJldHVyblR5cGVUb1N0cmluZygwKTsKKwkJcyArPSBuZXcgU3RyaW5nKHNlbGVjdG9yKSArICIoIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJcyArPSBhcmd1bWVudHNbaV0udG9TdHJpbmcoMCk7CisJCQkJaWYgKGkgIT0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSkKKwkJCQkJcyA9IHMgKyAiLCAiOyAvLyROT04tTkxTLTEkCisJCQl9OworCQl9OworCQlzICs9ICIpIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQlzICs9ICIgdGhyb3dzICI7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gdGhyb3duRXhjZXB0aW9uc1tpXS50b1N0cmluZygwKTsKKwkJCQlpZiAoaSAhPSAodGhyb3duRXhjZXB0aW9ucy5sZW5ndGggLSAxKSkKKwkJCQkJcyA9IHMgKyAiLCAiOyAvLyROT04tTkxTLTEkCisJCQl9OworCQl9OworCisJCXMgKz0gdG9TdHJpbmdTdGF0ZW1lbnRzKHRhYiArIDEpOworCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nU3RhdGVtZW50cyhpbnQgdGFiKSB7CisKKwkJaWYgKGlzQWJzdHJhY3QoKSB8fCAodGhpcy5tb2RpZmllcnMgJiBBY2NTZW1pY29sb25Cb2R5KSAhPSAwKQorCQkJcmV0dXJuICI7IjsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBzID0gIiB7IjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQlzID0gcyArICJcbiIgKyBzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKHRhYik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoIShzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgQmxvY2spKSB7CisJCQkJCXMgKz0gIjsiOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9CisJCXMgKz0gIlxuIiArIHRhYlN0cmluZyh0YWIgPT0gMCA/IDAgOiB0YWIgLSAxKSArICJ9IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxYWNmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CisJcHVibGljIGludCBtb2RpZmllcnM7CisKKwlwdWJsaWMgVHlwZVJlZmVyZW5jZSB0eXBlOworCXB1YmxpYyBFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uOworCisJcHVibGljIGNoYXJbXSBuYW1lOworCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25FbmQ7CisJcHVibGljIGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJcHVibGljIGludCBtb2RpZmllcnNTb3VyY2VTdGFydDsKKwlwdWJsaWMgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKCkgeworCX0KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIG5hbWUoKTsKKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpZiAobW9kaWZpZXJzICE9IEFjY0RlZmF1bHQpIHsKKwkJCXMgKz0gbW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycyk7CisJCX0KKwkJcyArPSB0eXBlLnRvU3RyaW5nKDApICsgIiAiICsgbmV3IFN0cmluZyhuYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKQorCQkJcyArPSAiID0gIiArIGluaXRpYWxpemF0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxNmNiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkV4cHJlc3Npb24KKwlleHRlbmRzIEV4cHJlc3Npb24KKwlpbXBsZW1lbnRzIEludm9jYXRpb25TaXRlIHsKKwkJCisJcHVibGljIFR5cGVSZWZlcmVuY2UgdHlwZTsKKwlwdWJsaWMgRXhwcmVzc2lvbltdIGFyZ3VtZW50czsKKwlwdWJsaWMgTWV0aG9kQmluZGluZyBiaW5kaW5nOworCisJTWV0aG9kQmluZGluZyBzeW50aGV0aWNBY2Nlc3NvcjsKKworCXB1YmxpYyBBbGxvY2F0aW9uRXhwcmVzc2lvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBtdXN0IHZlcmlmeSB0aGF0IGV4Y2VwdGlvbnMgcG90ZW50aWFsbHkgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiBhcmUgY2F1Z2h0IGluIHRoZSBtZXRob2QKKworCQkvLyBwcm9jZXNzIGFyZ3VtZW50cworCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJZmxvd0luZm8gPQorCQkJCQlhcmd1bWVudHNbaV0KKwkJCQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCX0KKwkJfQorCQkvLyByZWNvcmQgc29tZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvciBleGNlcHRpb24gdHlwZXMKKwkJUmVmZXJlbmNlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnM7CisJCWlmICgoKHRocm93bkV4Y2VwdGlvbnMgPSBiaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpLmxlbmd0aCkgIT0gMCkgeworCQkJLy8gY2hlY2sgZXhjZXB0aW9uIGhhbmRsaW5nCisJCQlmbG93Q29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKAorCQkJCXRocm93bkV4Y2VwdGlvbnMsCisJCQkJdGhpcywKKwkJCQlmbG93SW5mbywKKwkJCQljdXJyZW50U2NvcGUpOworCQl9CisJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJcmV0dXJuIGZsb3dJbmZvOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGVuY2xvc2luZ0luc3RhbmNlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisKKwkJY29kZVN0cmVhbS5uZXdfKGFsbG9jYXRlZFR5cGUpOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJfQorCQkvLyBiZXR0ZXIgaGlnaGxpZ2h0IGZvciBhbGxvY2F0aW9uOiBkaXNwbGF5IHRoZSB0eXBlIGluZGl2aWR1YWxseQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHR5cGUuc291cmNlU3RhcnQpOworCisJCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbgorCQlpZiAoYWxsb2NhdGVkVHlwZS5pc05lc3RlZFR5cGUoKSkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0FyZ3VtZW50VmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCWVuY2xvc2luZ0luc3RhbmNlKCksCisJCQkJdGhpcyk7CisJCX0KKwkJLy8gZ2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0KKwkJfQorCQkvLyBpbnZva2UgY29uc3RydWN0b3IKKwkJaWYgKHN5bnRoZXRpY0FjY2Vzc29yID09IG51bGwpIHsKKwkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChiaW5kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHN5bnRoZXRpYyBhY2Nlc3NvciBnb3Qgc29tZSBleHRyYSBhcmd1bWVudHMgYXBwZW5kZWQgdG8gaXRzIHNpZ25hdHVyZSwgd2hpY2ggbmVlZCB2YWx1ZXMKKwkJCWZvciAoaW50IGkgPSAwLAorCQkJCW1heCA9IHN5bnRoZXRpY0FjY2Vzc29yLnBhcmFtZXRlcnMubGVuZ3RoIC0gYmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQlpIDwgbWF4OworCQkJCWkrKykgeworCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChzeW50aGV0aWNBY2Nlc3Nvcik7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQWNjZXNzKCkgeworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogSW5uZXIgZW11bGF0aW9uIGNvbnNpc3RzIGluIGVpdGhlciByZWNvcmRpbmcgYSBkZXBlbmRlbmN5IAorCSAqIGxpbmsgb25seSwgb3IgcGVyZm9ybWluZyBvbmUgbGV2ZWwgb2YgcHJvcGFnYXRpb24uCisJICoKKwkgKiBEZXBlbmRlbmN5IG1lY2hhbmlzbSBpcyB1c2VkIHdoZW5ldmVyIGRlYWxpbmcgd2l0aCBzb3VyY2UgdGFyZ2V0CisJICogdHlwZXMsIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIHJlYWNoIHRoZW0sIHdlIG1pZ2h0IG5vdCB5ZXQga25vdyB0aGVpcgorCSAqIGV4YWN0IG5lZWQuCisJICovCisJcHVibGljIHZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZTsKKworCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CisJCWlmICgoYWxsb2NhdGVkVHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmlzTmVzdGVkVHlwZSgpCisJCQkmJiBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmlzTG9jYWxUeXBlKCkpIHsKKworCQkJaWYgKGFsbG9jYXRlZFR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQkJCSgoTG9jYWxUeXBlQmluZGluZykgYWxsb2NhdGVkVHlwZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJZmFsc2UsCisJCQkJCWZhbHNlKTsKKwkJCQkvLyByZXF1ZXN0IGNhc2NhZGUgb2YgYWNjZXNzZXMKKwkJCX0gZWxzZSB7CisJCQkJLy8gbG9jYWxseSBwcm9wYWdhdGUsIHNpbmNlIHdlIGFscmVhZHkgbm93IHRoZSBkZXNpcmVkIHNoYXBlIGZvciBzdXJlCisJCQkJY3VycmVudFNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKGFsbG9jYXRlZFR5cGUsIGZhbHNlLCBmYWxzZSk7CisJCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpCisJCQkmJiAoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSkgeworCisJCQlpZiAoY3VycmVudFNjb3BlCisJCQkJLmVudmlyb25tZW50KCkKKwkJCQkub3B0aW9ucworCQkJCS5pc1ByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0NoYW5naW5nVmlzaWJpbGl0eSkgeworCQkJCWJpbmRpbmcudGFnRm9yQ2xlYXJpbmdQcml2YXRlTW9kaWZpZXIoKTsKKwkJCQkvLyBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBkdW1wZWQgYXMgcHJpdmF0ZSwgbm8gZW11bGF0aW9uIHJlcXVpcmVkIHRodXMKKwkJCX0gZWxzZSB7CisJCQkJc3ludGhldGljQWNjZXNzb3IgPQorCQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZyk7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCS8vIFByb3BhZ2F0ZSB0aGUgdHlwZSBjaGVja2luZyB0byB0aGUgYXJndW1lbnRzLCBhbmQgY2hlY2sgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCisJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkvLyB3aWxsIGNoZWNrIGZvciBudWxsIGFmdGVyIGFyZ3MgYXJlIHJlc29sdmVkCisKKwkJLy8gYnVmZmVyaW5nIHRoZSBhcmd1bWVudHMnIHR5cGVzCisJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IE5vUGFyYW1ldGVyczsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gZmFsc2U7CisJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKKwkJCQkJYXJnSGFzRXJyb3IgPSB0cnVlOworCQkJaWYgKGFyZ0hhc0Vycm9yKQorCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJfQorCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICghdHlwZUJpbmRpbmcuY2FuQmVJbnN0YW50aWF0ZWQoKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodHlwZSwgdHlwZUJpbmRpbmcpOworCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQl9CisJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJaWYgKCEoYmluZGluZyA9IHNjb3BlLmdldENvbnN0cnVjdG9yKGFsbG9jYXRlZFR5cGUsIGFyZ3VtZW50VHlwZXMsIHRoaXMpKQorCQkJLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCisJCQkJYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IGFsbG9jYXRlZFR5cGU7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7CisJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCX0KKwkJaWYgKGlzTWV0aG9kVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOworCisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQorCQkJCWFyZ3VtZW50c1tpXS5pbXBsaWNpdFdpZGVuaW5nKGJpbmRpbmcucGFyYW1ldGVyc1tpXSwgYXJndW1lbnRUeXBlc1tpXSk7CisJCXJldHVybiBhbGxvY2F0ZWRUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCQkvLyBpZ25vcmVkCisJfQorCisJcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGkpIHsKKwkJLy8gaWdub3JlZAorCX0KKworCXB1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGkpIHsKKwkJLy8gaWdub3JlZAorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCisJCVN0cmluZyBzID0gIm5ldyAiICsgdHlwZS50b1N0cmluZygwKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYXJndW1lbnRzID09IG51bGwpCisJCQlzID0gcyArICIoKSI7IC8vJE5PTi1OTFMtMSQKKwkJZWxzZSB7CisJCQlzID0gcyArICIoIjsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQlzID0gcyArIGFyZ3VtZW50c1tpXS50b1N0cmluZ0V4cHJlc3Npb24oKTsKKwkJCQlpZiAoaSA9PSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpKQorCQkJCQlzID0gcyArICIpIjsgLy8kTk9OLU5MUy0xJAorCQkJCWVsc2UKKwkJCQkJcyA9IHMgKyAiLCAiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJaW50IGFyZ3VtZW50c0xlbmd0aDsKKwkJCXR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50c0xlbmd0aDsgaSsrKQorCQkJCQlhcmd1bWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YmE4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CisKK3B1YmxpYyBjbGFzcyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIExvY2FsVHlwZURlY2xhcmF0aW9uIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEFOT05ZTU9VU19FTVBUWV9OQU1FID0gbmV3IGNoYXJbXSB7fTsKKwlwdWJsaWMgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbjsKKworCXB1YmxpYyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CisJCW1vZGlmaWVycyA9IEFjY0RlZmF1bHQ7CisJCW5hbWUgPSBBTk9OWU1PVVNfRU1QVFlfTkFNRTsKKwl9IAorCQorCS8vIHVzZSBhIGRlZmF1bHQgbmFtZSBpbiBvcmRlciB0byB0aCBuYW1lIGxvb2t1cCAKKwkvLyB0byBvcGVyYXRlIGp1YXQgbGlrZSBhIHJlZ3VsYXIgdHlwZSAod2hpY2ggaGFzIGEgbmFtZSkKKwkvL3dpdGhvdXQgY2hlY2tpbmcgc3lzdGVtYXRpY2FsbHkgaWYgdGhlIG5hZW0gaXMgbnVsbCAuLi4uIAorCXB1YmxpYyBNZXRob2RCaW5kaW5nIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoTWV0aG9kQmluZGluZyBpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcpIHsKKworCQkvL0FkZCB0byBtZXRob2Qnc2V0LCB0aGUgZGVmYXVsdCBjb25zdHVjdG9yIHRoYXQganVzdCByZWNhbGwgdGhlCisJCS8vc3VwZXIgY29uc3RydWN0b3Igd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKwkJU3RyaW5nIGJhc2VOYW1lID0gIiRhbm9ueW1vdXMiOyAvLyROT04tTkxTLTEkCisJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IGluaGVyaXRlZENvbnN0cnVjdG9yQmluZGluZy5wYXJhbWV0ZXJzOworCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRUeXBlcy5sZW5ndGg7CisJCS8vdGhlIGNvbnN0cnVjdG9yCisJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJY2Quc2VsZWN0b3IgPSBuZXcgY2hhcltdIHsgJ3gnIH07IC8vbm8gbWFpbmluZworCQljZC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQljZC5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCWNkLm1vZGlmaWVycyA9IG1vZGlmaWVycyAmIEFjY1Zpc2liaWxpdHlNQVNLOworCQljZC5pc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7CisKKwkJaWYgKGFyZ3VtZW50c0xlbmd0aCA+IDApIHsKKwkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gKGNkLmFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFthcmd1bWVudHNMZW5ndGhdKTsKKwkJCWZvciAoaW50IGkgPSBhcmd1bWVudHNMZW5ndGg7IC0taSA+PSAwOykgeworCQkJCWFyZ3VtZW50c1tpXSA9IG5ldyBBcmd1bWVudCgoYmFzZU5hbWUgKyBpKS50b0NoYXJBcnJheSgpLCAwTCwgbnVsbCAvKnR5cGUgcmVmKi8sIEFjY0RlZmF1bHQpOworCQkJfQorCQl9CisKKwkJLy90aGUgc3VwZXIgY2FsbCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yCisJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9CisJCQluZXcgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQljZC5jb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gc291cmNlRW5kOworCisJCWlmIChhcmd1bWVudHNMZW5ndGggPiAwKSB7CisJCQlFeHByZXNzaW9uW10gYXJnczsKKwkJCWFyZ3MgPSBjZC5jb25zdHJ1Y3RvckNhbGwuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bYXJndW1lbnRzTGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSBhcmd1bWVudHNMZW5ndGg7IC0taSA+PSAwOykgeworCQkJCWFyZ3NbaV0gPSBuZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSgoYmFzZU5hbWUgKyBpKS50b0NoYXJBcnJheSgpLCAwTCk7CisJCQl9CisJCX0KKworCQkvL2FkZGluZyB0aGUgY29uc3RydWN0b3IgaW4gdGhlIG1ldGhvZHMgbGlzdAorCQlpZiAobWV0aG9kcyA9PSBudWxsKSB7CisJCQltZXRob2RzID0gbmV3IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSB7IGNkIH07CisJCX0gZWxzZSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbmV3TWV0aG9kczsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJbWV0aG9kcywKKwkJCQkwLAorCQkJCW5ld01ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvblttZXRob2RzLmxlbmd0aCArIDFdLAorCQkJCTEsCisJCQkJbWV0aG9kcy5sZW5ndGgpOworCQkJbmV3TWV0aG9kc1swXSA9IGNkOworCQkJbWV0aG9kcyA9IG5ld01ldGhvZHM7CisJCX0KKworCQkvLz09PT09PT09PT09PUJJTkRJTkcgVVBEQVRFPT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY2QuYmluZGluZyA9IG5ldyBNZXRob2RCaW5kaW5nKAorCQkJCWNkLm1vZGlmaWVycywgLy9tZXRob2REZWNsYXJhdGlvbgorCQkJCWFyZ3VtZW50c0xlbmd0aCA9PSAwID8gTm9QYXJhbWV0ZXJzIDogYXJndW1lbnRUeXBlcywgLy9hcmd1bWVudHMgYmluZGluZ3MKKwkJCQlpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywgLy9leGNlcHRpb25zCisJCQkJYmluZGluZyk7IC8vZGVjbGFyaW5nQ2xhc3MKKwkJCQkKKwkJY2Quc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUoc2NvcGUsIHRoaXMsIHRydWUpOworCQljZC5iaW5kQXJndW1lbnRzKCk7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKGNkLnNjb3BlKTsKKworCQlpZiAoYmluZGluZy5tZXRob2RzID09IG51bGwpIHsKKwkJCWJpbmRpbmcubWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW10geyBjZC5iaW5kaW5nIH07CisJCX0gZWxzZSB7CisJCQlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kczsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYmluZGluZy5tZXRob2RzLAorCQkJCTAsCisJCQkJbmV3TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2JpbmRpbmcubWV0aG9kcy5sZW5ndGggKyAxXSwKKwkJCQkxLAorCQkJCWJpbmRpbmcubWV0aG9kcy5sZW5ndGgpOworCQkJbmV3TWV0aG9kc1swXSA9IGNkLmJpbmRpbmc7CisJCQliaW5kaW5nLm1ldGhvZHMgPSBuZXdNZXRob2RzOworCQl9CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJcmV0dXJuIGNkLmJpbmRpbmc7CisKKwl9CisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJLy8gc2NvcGUgYW5kIGJpbmRpbmcgYXJlIHByb3ZpZGVkIGluIHVwZGF0ZUJpbmRpbmdTdXBlcmNsYXNzIAorCQlyZXNvbHZlKCk7CisJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlyZXR1cm4gdG9TdHJpbmdCb2R5KHRhYik7CisJfQorCisJLyoqCisJICoJSXRlcmF0aW9uIGZvciBhIGxvY2FsIGFub255bW91cyBpbm5lcnR5cGUKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCisJCQkJaW50IGZpZWxkc0xlbmd0aDsKKwkJCQlpbnQgbWV0aG9kc0xlbmd0aDsKKwkJCQlpbnQgbWVtYmVyVHlwZXNMZW5ndGg7CisKKwkJCQkvLyA8c3VwZXJjbGFzcz4gaXMgYm91bmQgdG8gdGhlIGFjdHVhbCB0eXBlIGZyb20gdGhlIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorCQkJCS8vIHRoZXJlZm9yZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGl0ZXJhdGVkIGF0IHRoaXMgcG9pbnQuCisKKwkJCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCQltZW1iZXJUeXBlc0xlbmd0aCA9IG1lbWJlclR5cGVzLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlc0xlbmd0aDsgaSsrKQorCQkJCQkJbWVtYmVyVHlwZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCX0KKwkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQkJZmllbGRzTGVuZ3RoID0gZmllbGRzLmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNMZW5ndGg7IGkrKykgeworCQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZDsKKwkJCQkJCWlmICgoZmllbGQgPSBmaWVsZHNbaV0pLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkvLyBsb2NhbCB0eXBlIGNhbm5vdCBoYXZlIHN0YXRpYyBmaWVsZHMKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZmllbGQudHJhdmVyc2UodmlzaXRvciwgaW5pdGlhbGl6ZXJTY29wZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCQltZXRob2RzTGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kc0xlbmd0aDsgaSsrKQorCQkJCQkJbWV0aG9kc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJfQorCQkJfQorCQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MzM2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJndW1lbnQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEFyZ3VtZW50IGV4dGVuZHMgTG9jYWxEZWNsYXJhdGlvbiB7CisJCisJcHVibGljIEFyZ3VtZW50KGNoYXJbXSBuYW1lLCBsb25nIHBvc05vbSwgVHlwZVJlZmVyZW5jZSB0ciwgaW50IG1vZGlmaWVycykgeworCisJCXN1cGVyKG51bGwsIG5hbWUsIChpbnQpIChwb3NOb20gPj4+IDMyKSwgKGludCkgcG9zTm9tKTsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCXR5cGUgPSB0cjsKKwkJdGhpcy5iaXRzIHw9IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZU1BU0s7CisJfQorCisJcHVibGljIHZvaWQgYmluZChNZXRob2RTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGJvb2xlYW4gdXNlZCkgeworCisJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkKKwkJCXRoaXMudHlwZS5iaW5kaW5nID0gdHlwZUJpbmRpbmc7CisJCS8vIHJlY29yZCB0aGUgcmVzb2x2ZWQgdHlwZSBpbnRvIHRoZSB0eXBlIHJlZmVyZW5jZQorCQlpbnQgbW9kaWZpZXJGbGFnID0gdGhpcy5tb2RpZmllcnM7CisJCWlmICgodGhpcy5iaW5kaW5nID0gc2NvcGUuZHVwbGljYXRlTmFtZSh0aGlzLm5hbWUpKSAhPSBudWxsKSB7CisJCQkvL3RoZSBuYW1lIGFscmVhZHkgZXhpc3QuLi4ubWF5IGNhcnJ5IG9uIHdpdGggdGhlIGZpcnN0IGJpbmRpbmcgLi4uLgorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmVkZWZpbmVBcmd1bWVudCh0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXNjb3BlLmFkZExvY2FsVmFyaWFibGUoCisJCQkJdGhpcy5iaW5kaW5nID0KKwkJCQkJbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKHRoaXMsIHR5cGVCaW5kaW5nLCBtb2RpZmllckZsYWcsIHRydWUpKTsKKwkJCS8vdHJ1ZSBzdGFuZCBmb3IgYXJndW1lbnQgaW5zdGVhZCBvZiBqdXN0IGxvY2FsCisJCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBpc1R5cGVVc2VEZXByZWNhdGVkKHR5cGVCaW5kaW5nLCBzY29wZSkpCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUodHlwZUJpbmRpbmcsIHRoaXMudHlwZSk7CisJCQl0aGlzLmJpbmRpbmcuZGVjbGFyYXRpb24gPSB0aGlzOworCQkJdGhpcy5iaW5kaW5nLnVzZWQgPSB1c2VkOworCQl9CisJfQorCisJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVGb3JDYXRjaChCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJLy8gcmVzb2x1dGlvbiBvbiBhbiBhcmd1bWVudCBvZiBhIGNhdGNoIGNsYXVzZQorCQkvLyBwcm92aWRlIHRoZSBzY29wZSB3aXRoIGEgc2lkZSBlZmZlY3QgOiBpbnNlcnRpb24gb2YgYSBMT0NBTAorCQkvLyB0aGF0IHJlcHJlc2VudHMgdGhlIGFyZ3VtZW50LiBUaGUgdHlwZSBtdXN0IGJlIGZyb20gSmF2YVRocm93YWJsZQorCisJCVR5cGVCaW5kaW5nIHRiID0gdHlwZS5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgc2NvcGUuZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSk7CisJCWlmICh0YiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmICgoYmluZGluZyA9IHNjb3BlLmR1cGxpY2F0ZU5hbWUobmFtZSkpICE9IG51bGwpIHsKKwkJCS8vIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLi4uLm1heSBjYXJyeSBvbiB3aXRoIHRoZSBmaXJzdCBiaW5kaW5nIC4uLi4KKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZGVmaW5lQXJndW1lbnQodGhpcyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQliaW5kaW5nID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKHRoaXMsIHRiLCBtb2RpZmllcnMsIGZhbHNlKTsgLy8gYXJndW1lbnQgZGVjbCwgYnV0IGxvY2FsIHZhciAgKGkuZS4gaXNBcmd1bWVudCA9IGZhbHNlKQorCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKGJpbmRpbmcpOworCQliaW5kaW5nLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQlyZXR1cm4gdGI7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAobW9kaWZpZXJzICE9IEFjY0RlZmF1bHQpIHsKKwkJCXMgKz0gbW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycyk7CisJCX0KKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJcyArPSAiPG5vIHR5cGU+ICI7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXMgKz0gdHlwZS50b1N0cmluZyh0YWIpICsgIiAiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcyArPSBuZXcgU3RyaW5nKG5hbWUpOworCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQorCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWlmICh0eXBlICE9IG51bGwpCisJCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkKKwkJCQlpbml0aWFsaXphdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlOTU4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHR5cGU7CisKKwkvL2RpbWVuc2lvbnMubGVuZ3RoIGdpdmVzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucywgYnV0IHRoZQorCS8vIGxhc3Qgb25lcyBtYXkgYmUgbnVsbGVkIGFzIGluIG5ldyBpbnRbNF1bNV1bXVtdCisJcHVibGljIEV4cHJlc3Npb25bXSBkaW1lbnNpb25zOworCXB1YmxpYyBBcnJheUluaXRpYWxpemVyIGluaXRpYWxpemVyOworCisJcHVibGljIEFycmF5QmluZGluZyBhcnJheVRiOworCisJLyoqCisJICogQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZGltZW5zaW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJRXhwcmVzc2lvbiBkaW07CisJCQlpZiAoKGRpbSA9IGRpbWVuc2lvbnNbaV0pICE9IG51bGwpIHsKKwkJCQlmbG93SW5mbyA9IGRpbS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQl9CisJCX0KKwkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKwkJCXJldHVybiBpbml0aWFsaXplci5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmxvd0luZm87CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGEgYXJyYXkgYWxsb2NhdGlvbiBleHByZXNzaW9uCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nOworCisJCWlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CisJCQlpbml0aWFsaXplci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWludCBub25OdWxsRGltZW5zaW9uc0xlbmd0aCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBkaW1lbnNpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKQorCQkJaWYgKGRpbWVuc2lvbnNbaV0gIT0gbnVsbCkgeworCQkJCWRpbWVuc2lvbnNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJbm9uTnVsbERpbWVuc2lvbnNMZW5ndGgrKzsKKwkJCX0KKworCQkvLyBHZW5lcmF0ZSBhIHNlcXVlbmNlIG9mIGJ5dGVjb2RlcyBjb3JyZXNwb25kaW5nIHRvIGFuIGFycmF5IGFsbG9jYXRpb24KKwkJaWYgKChhcnJheVRiLmlzQXJyYXlUeXBlKCkpCisJCQkmJiAoKGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5VGIpLmRpbWVuc2lvbnMgPT0gMSkpIHsKKwkJCS8vIE1vbm8tZGltZW5zaW9uYWwgYXJyYXkKKwkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY3VycmVudFNjb3BlLCBhcnJheUJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJLy8gTXVsdGktZGltZW5zaW9uYWwgYXJyYXkKKwkJCWNvZGVTdHJlYW0ubXVsdGlhbmV3YXJyYXkoYXJyYXlUYiwgbm9uTnVsbERpbWVuc2lvbnNMZW5ndGgpOworCQl9CisKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCX0KKworCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJLy8gQnVpbGQgYW4gYXJyYXkgdHlwZSByZWZlcmVuY2UgdXNpbmcgdGhlIGN1cnJlbnQgZGltZW5zaW9ucworCQkvLyBUaGUgcGFyc2VyIGRvZXMgbm90IGNoZWNrIGZvciB0aGUgZmFjdCB0aGF0IGRpbWVuc2lvbiBtYXkgYmUgbnVsbAorCQkvLyBvbmx5IGF0IHRoZSAtZW5kLSBsaWtlIG5ldyBpbnQgWzRdW11bXS4gVGhlIHBhcnNlciBhbGxvd3MgbmV3IGludFtdWzRdW10KKwkJLy8gc28gdGhpcyBtdXN0IGJlIGNoZWNrZWQgaGVyZS4uLi4uLih0aGlzIGNvbWVzIGZyb20gYSByZWR1Y3Rpb24gdG8gTEwxIGdyYW1tYXIpCisKKwkJVHlwZUJpbmRpbmcgcmVmZXJlbmNlVGIgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBkaW1lbnNpb25zIGFyZSBjaGVja2VkCisJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQlpZiAocmVmZXJlbmNlVGIgPT0gVm9pZEJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFsbG9jYXRlVm9pZEFycmF5KHRoaXMpOworCQkJcmVmZXJlbmNlVGIgPSBudWxsOyAvLyB3aWxsIHJldHVybiBiZWxvdworCQl9CisKKwkJLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBkaW1lbnNpb24gc3ludGF4IChhbmQgdGVzdCBmb3IgYWxsIG51bGwgZGltZW5zaW9ucykKKwkJaW50IGxlbmd0aERpbSA9IC0xOworCQlmb3IgKGludCBpID0gZGltZW5zaW9ucy5sZW5ndGg7IC0taSA+PSAwOykgeworCQkJaWYgKGRpbWVuc2lvbnNbaV0gIT0gbnVsbCkgeworCQkJCWlmIChsZW5ndGhEaW0gPT0gLTEpCisJCQkJCWxlbmd0aERpbSA9IGk7CisJCQl9IGVsc2UgaWYgKAorCQkJCWxlbmd0aERpbSAhPSAtMSkgeworCQkJCS8vIHNob3VsZCBub3QgaGF2ZSBhbiBlbXB0eSBkaW1lbnNpb24gYmVmb3JlIGFuIG5vbi1lbXB0eSBvbmUKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RMb2NhdGlvbkZvckVtcHR5RGltZW5zaW9uKHRoaXMsIGkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCWlmIChyZWZlcmVuY2VUYiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gbGVuZ3RoRGltID09IC0xIHNheXMgaWYgYWxsIGRpbWVuc2lvbnMgYXJlIG51bGxlZAorCQkvLyB3aGVuIGFuIGluaXRpYWxpemVyIGlzIGdpdmVuLCBubyBkaW1lbnNpb24gbXVzdCBiZSBzcGVjaWZpZWQKKwkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKKwkJCWlmIChsZW5ndGhEaW0gPT0gLTEpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tdXN0RGVmaW5lRGltZW5zaW9uc09ySW5pdGlhbGl6ZXIodGhpcyk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0gZWxzZSBpZiAobGVuZ3RoRGltICE9IC0xKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3REZWZpbmVEaW1lbnNpb25zQW5kSW5pdGlhbGl6ZXIodGhpcyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGRpbWVuc2lvbnMgcmVzb2x1dGlvbiAKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoRGltOyBpKyspIHsKKwkJCVR5cGVCaW5kaW5nIGRpbVRiID0gZGltZW5zaW9uc1tpXS5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgSW50QmluZGluZyk7CisJCQlpZiAoZGltVGIgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWRpbWVuc2lvbnNbaV0uaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCBkaW1UYik7CisJCX0KKworCQkvLyBidWlsZGluZyB0aGUgYXJyYXkgYmluZGluZworCQlhcnJheVRiID0gc2NvcGUuY3JlYXRlQXJyYXkocmVmZXJlbmNlVGIsIGRpbWVuc2lvbnMubGVuZ3RoKTsKKworCQkvLyBjaGVjayB0aGUgaW5pdGlhbGl6ZXIKKwkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCisJCQlpZiAoKGluaXRpYWxpemVyLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBhcnJheVRiKSkgIT0gbnVsbCkKKwkJCQlpbml0aWFsaXplci5iaW5kaW5nID0gYXJyYXlUYjsKKwkJcmV0dXJuIGFycmF5VGI7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwkJU3RyaW5nIHMgPSAibmV3ICIgKyB0eXBlLnRvU3RyaW5nKDApOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9ucy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRpbWVuc2lvbnNbaV0gPT0gbnVsbCkKKwkJCQlzID0gcyArICJbXSI7IC8vJE5PTi1OTFMtMSQKKwkJCWVsc2UKKwkJCQlzID0gcyArICJbIiArIGRpbWVuc2lvbnNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQl9IAorCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKKwkJCXMgPSBzICsgaW5pdGlhbGl6ZXIudG9TdHJpbmdFeHByZXNzaW9uKCk7CisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWludCBkaW1lbnNpb25zTGVuZ3RoID0gZGltZW5zaW9ucy5sZW5ndGg7CisJCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uc0xlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGRpbWVuc2lvbnNbaV0gIT0gbnVsbCkKKwkJCQkJZGltZW5zaW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKKwkJCQlpbml0aWFsaXplci50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlM2EyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEFycmF5SW5pdGlhbGl6ZXIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwlwdWJsaWMgRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zOworCXB1YmxpYyBBcnJheUJpbmRpbmcgYmluZGluZzsgLy90aGUgdHlwZSBvZiB0aGUgeyAsICwgLCB9CisKKy8qKgorICogQXJyYXlJbml0aWFsaXplciBjb25zdHJ1Y3RvciBjb21tZW50LgorICovCitwdWJsaWMgQXJyYXlJbml0aWFsaXplcigpIHsKKwlzdXBlcigpOworfQorcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWZsb3dJbmZvID0gZXhwcmVzc2lvbnNbaV0uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLnVuY29uZGl0aW9uYWxJbml0cygpOworCQl9CisJfQorCXJldHVybiBmbG93SW5mbzsKK30KKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIGFycmF5IGluaXRpYWxpemVyCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkvLyBGbGF0dGVuIHRoZSB2YWx1ZXMgYW5kIGNvbXB1dGUgdGhlIGRpbWVuc2lvbnMsIGJ5IGl0ZXJhdGluZyBpbiBkZXB0aCBpbnRvIG5lc3RlZCBhcnJheSBpbml0aWFsaXplcnMKKworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaW50IGV4cHJlc3Npb25MZW5ndGggPSAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgPyAwOiBleHByZXNzaW9ucy5sZW5ndGg7CisJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShleHByZXNzaW9uTGVuZ3RoKTsKKwljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZSwgYmluZGluZyk7CisJaWYgKGV4cHJlc3Npb25zICE9IG51bGwpIHsKKwkJLy8gYmluZGluZyBpcyBhbiBBcnJheVR5cGUsIHNvIEkgY2FuIGp1c3QgZGVhbCB3aXRoIHRoZSBkaW1lbnNpb24KKwkJaW50IGVsZW1lbnRzVHlwZUlEID0gYmluZGluZy5kaW1lbnNpb25zID4gMSA/IC0xIDogYmluZGluZy5sZWFmQ29tcG9uZW50VHlwZS5pZDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHByZXNzaW9uTGVuZ3RoOyBpKyspIHsKKwkJCUV4cHJlc3Npb24gZXhwcjsKKwkJCWlmICgoZXhwciA9IGV4cHJlc3Npb25zW2ldKS5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlzd2l0Y2ggKGVsZW1lbnRzVHlwZUlEKSB7IC8vIGZpbHRlciBvdXQgaW5pdGlhbGl6YXRpb25zIHRvIGRlZmF1bHQgdmFsdWVzCisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWlmIChleHByLmNvbnN0YW50LmRvdWJsZVZhbHVlKCkgIT0gMCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsKKwkJCQkJCQlleHByLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJCWNvZGVTdHJlYW0uYXJyYXlBdFB1dChlbGVtZW50c1R5cGVJRCwgZmFsc2UpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCWlmIChleHByLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpICE9IGZhbHNlKSB7CisJCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOworCQkJCQkJCWV4cHIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJCQkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGVsZW1lbnRzVHlwZUlELCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlpZiAoZXhwci5jb25zdGFudCAhPSBOdWxsQ29uc3RhbnQuRGVmYXVsdCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsKKwkJCQkJCQlleHByLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJCWNvZGVTdHJlYW0uYXJyYXlBdFB1dChlbGVtZW50c1R5cGVJRCwgZmFsc2UpOworCQkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOworCQkJCWV4cHIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGVsZW1lbnRzVHlwZUlELCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKCF2YWx1ZVJlcXVpcmVkKSB7CisJCWNvZGVTdHJlYW0ucG9wKCk7CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVFeHBlY3RpbmcoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUYikgeworCS8vIEFycmF5IGluaXRpYWxpemVycyBjYW4gb25seSBvY2N1ciBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQKKwkvLyBleHByZXNzaW9uLCB0aGVyZWZvcmUgdGhlIGV4cGVjdGVkIHR5cGUgY29udGFpbnMgdGhlIHZhbGlkIGluZm9ybWF0aW9uCisJLy8gY29uY2VybmluZyB0aGUgdHlwZSB0aGF0IG11c3QgYmUgZW5mb3JjZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBpbml0aWFsaXplci4KKworCS8vIHRoaXMgbWV0aG9kIGlzIHJlY3Vyc2l2ZS4uLiAodGhlIHRlc3Qgb24gaXNBcnJheVR5cGUgaXMgdGhlIHN0b3AgY2FzZSkKKworCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCWlmIChleHBlY3RlZFRiLmlzQXJyYXlUeXBlKCkpIHsKKwkJYmluZGluZyA9IChBcnJheUJpbmRpbmcpIGV4cGVjdGVkVGI7CisJCWlmIChleHByZXNzaW9ucyA9PSBudWxsKQorCQkJcmV0dXJuIGJpbmRpbmc7CisJCVR5cGVCaW5kaW5nIGV4cGVjdGVkRWxlbWVudHNUYiA9IGJpbmRpbmcuZWxlbWVudHNUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cGVjdGVkRWxlbWVudHNUYi5pc0Jhc2VUeXBlKCkpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBleHByZXNzaW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zW2ldOworCQkJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYiA9CisJCQkJCShleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikKKwkJCQkJCT8gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgZXhwZWN0ZWRFbGVtZW50c1RiKQorCQkJCQkJOiBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCQlpZiAoZXhwcmVzc2lvblRiID09IG51bGwpCisJCQkJCXJldHVybiBudWxsOworCisJCQkJLy8gQ29tcGlsZS10aW1lIGNvbnZlcnNpb24gcmVxdWlyZWQ/CisJCQkJaWYgKGV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShleHByZXNzaW9uVGIsIGV4cGVjdGVkRWxlbWVudHNUYikpIHsKKwkJCQkJZXhwcmVzc2lvbi5pbXBsaWNpdFdpZGVuaW5nKGV4cGVjdGVkRWxlbWVudHNUYiwgZXhwcmVzc2lvblRiKTsKKwkJCQl9IGVsc2UgaWYgKEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKGV4cGVjdGVkRWxlbWVudHNUYi5pZCwgZXhwcmVzc2lvblRiLmlkKSkgeworCQkJCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcoZXhwZWN0ZWRFbGVtZW50c1RiLCBleHByZXNzaW9uVGIpOworCQkJCX0gZWxzZSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZShleHByZXNzaW9uLCBleHByZXNzaW9uVGIsIGV4cGVjdGVkRWxlbWVudHNUYik7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBleHByZXNzaW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQlpZiAoZXhwcmVzc2lvbnNbaV0ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIGV4cGVjdGVkRWxlbWVudHNUYikgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGJpbmRpbmc7CisJfQorCQorCS8vIGluZmVyIGluaXRpYWxpemVyIHR5cGUgZm9yIGVycm9yIHJlcG9ydGluZyBiYXNlZCBvbiBmaXJzdCBlbGVtZW50CisJVHlwZUJpbmRpbmcgbGVhZkVsZW1lbnRUeXBlID0gbnVsbDsKKwlpbnQgZGltID0gMTsKKwlpZiAoZXhwcmVzc2lvbnMgPT0gbnVsbCkgeworCQlsZWFmRWxlbWVudFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOworCX0gZWxzZSB7CisJCUV4cHJlc3Npb24gY3VycmVudEV4cHJlc3Npb24gPSBleHByZXNzaW9uc1swXTsKKwkJd2hpbGUoY3VycmVudEV4cHJlc3Npb24gIT0gbnVsbCAmJiBjdXJyZW50RXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKKwkJCWRpbSsrOworCQkJRXhwcmVzc2lvbltdIHN1YkV4cHJzID0gKChBcnJheUluaXRpYWxpemVyKSBjdXJyZW50RXhwcmVzc2lvbikuZXhwcmVzc2lvbnM7CisJCQlpZiAoc3ViRXhwcnMgPT0gbnVsbCl7CisJCQkJbGVhZkVsZW1lbnRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCQljdXJyZW50RXhwcmVzc2lvbiA9IG51bGw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljdXJyZW50RXhwcmVzc2lvbiA9ICgoQXJyYXlJbml0aWFsaXplcikgY3VycmVudEV4cHJlc3Npb24pLmV4cHJlc3Npb25zWzBdOworCQl9CisJCWlmIChjdXJyZW50RXhwcmVzc2lvbiAhPSBudWxsKSB7CisJCQlsZWFmRWxlbWVudFR5cGUgPSBjdXJyZW50RXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJCX0KKwl9CisJaWYgKGxlYWZFbGVtZW50VHlwZSAhPSBudWxsKSB7CisJCVR5cGVCaW5kaW5nIHByb2JhYmxlVGIgPSBzY29wZS5jcmVhdGVBcnJheShsZWFmRWxlbWVudFR5cGUsIGRpbSk7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZSh0aGlzLCBwcm9iYWJsZVRiLCBleHBlY3RlZFRiKTsKKwl9CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCVN0cmluZyBzID0gInsiIDsgLy8kTk9OLU5MUy0xJAorCWlmIChleHByZXNzaW9ucyAhPSBudWxsKQorCXsgCWludCBqID0gMjAgOyAKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoIDsgaSsrKQorCQl7CXMgPSBzICsgZXhwcmVzc2lvbnNbaV0udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLCIgOyAvLyROT04tTkxTLTEkCisJCQlqIC0tIDsKKwkJCWlmIChqID09IDApCisJCQl7CXMgPSBzICsgIlxuICAgICAgICAgICAgICAgICI7IGogPSAyMDt9fX07IC8vJE5PTi1OTFMtMSQKKwlzID0gcyArICJ9IjsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBzO30KKworcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQlpZiAoZXhwcmVzc2lvbnMgIT0gbnVsbCkgeworCQkJaW50IGV4cHJlc3Npb25zTGVuZ3RoID0gZXhwcmVzc2lvbnMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHByZXNzaW9uc0xlbmd0aDsgaSsrKQorCQkJCWV4cHJlc3Npb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCX0KKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjkwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGV4dGVuZHMgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB7CisJaW50IGRpbWVuc2lvbnM7CitwdWJsaWMgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHNvdXJjZXMgLCBpbnQgZGltLCBsb25nW10gcG9zcykgeworCXN1cGVyKCBzb3VyY2VzICwgcG9zcyk7CisJZGltZW5zaW9ucyA9IGRpbSA7Cit9CitwdWJsaWMgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHNvdXJjZXMgLCBUeXBlQmluZGluZyB0YiwgaW50IGRpbSwgbG9uZ1tdIHBvc3MpIHsKKwlzdXBlciggc291cmNlcyAsIHRiLCBwb3NzKTsKKwlkaW1lbnNpb25zID0gZGltIDsKK30KK3B1YmxpYyBpbnQgZGltZW5zaW9ucygpIHsKKwlyZXR1cm4gZGltZW5zaW9uczsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgeworCWlmIChiaW5kaW5nICE9IG51bGwpCisJCXJldHVybiBiaW5kaW5nOworCXJldHVybiBzY29wZS5jcmVhdGVBcnJheShzY29wZS5nZXRUeXBlKHRva2VucyksIGRpbWVuc2lvbnMpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7CisJLyogc2xvdyBzcGVlZCAqLworCisJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSAgOworCWlmIChkaW1lbnNpb25zID09IDEgKSByZXR1cm4gcyArICJbXSIgOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaT0xIDsgaSA8PSBkaW1lbnNpb25zIDsgaSsrKQorCQlzID0gcyArICJbXSIgOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHMgOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjU0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQXJyYXlSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2UgeworCQorCXB1YmxpYyBFeHByZXNzaW9uIHJlY2VpdmVyOworCXB1YmxpYyBFeHByZXNzaW9uIHBvc2l0aW9uOworCisJcHVibGljIFR5cGVCaW5kaW5nIGFycmF5RWxlbWVudEJpbmRpbmc7CisKKwlwdWJsaWMgQXJyYXlSZWZlcmVuY2UoRXhwcmVzc2lvbiByZWMsIEV4cHJlc3Npb24gcG9zKSB7CisJCXRoaXMucmVjZWl2ZXIgPSByZWM7CisJCXRoaXMucG9zaXRpb24gPSBwb3M7CisJCXNvdXJjZVN0YXJ0ID0gcmVjLnNvdXJjZVN0YXJ0OworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudCgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbywKKwkJQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlib29sZWFuIGNvbXBvdW5kQXNzaWdubWVudCkgeworCisJCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBhc3NpZ25tZW50CisJCQkJLmV4cHJlc3Npb24KKwkJCQkuYW5hbHlzZUNvZGUoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJZmxvd0NvbnRleHQsCisJCQkJCWFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkKKwkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlyZXR1cm4gcG9zaXRpb24uYW5hbHlzZUNvZGUoCisJCQljdXJyZW50U2NvcGUsCisJCQlmbG93Q29udGV4dCwKKwkJCXJlY2VpdmVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKSk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlwb3NpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQljb2RlU3RyZWFtLmFycmF5QXRQdXQoYXJyYXlFbGVtZW50QmluZGluZy5pZCwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBhcnJheSByZWZlcmVuY2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlwb3NpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJY29kZVN0cmVhbS5hcnJheUF0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQpOworCQkvLyBHZW5lcmF0aW5nIGNvZGUgZm9yIHRoZSBwb3RlbnRpYWwgcnVudGltZSB0eXBlIGNoZWNraW5nCisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJyYXlFbGVtZW50QmluZGluZyA9PSBMb25nQmluZGluZworCQkJCXx8IGFycmF5RWxlbWVudEJpbmRpbmcgPT0gRG91YmxlQmluZGluZykgeworCQkJCWNvZGVTdHJlYW0ucG9wMigpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJfQorCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiwKKwkJaW50IG9wZXJhdG9yLAorCQlpbnQgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJY29kZVN0cmVhbS5hcnJheUF0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQpOworCQlpbnQgb3BlcmF0aW9uVHlwZUlEOworCQlpZiAoKG9wZXJhdGlvblR5cGVJRCA9IGltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX1N0cmluZykgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0FwcGVuZChjdXJyZW50U2NvcGUsIG51bGwsIGV4cHJlc3Npb24pOworCQl9IGVsc2UgeworCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCisJCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSkgeyAvLyBwcmVmaXggb3BlcmF0aW9uCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQl9IGVsc2UgeworCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9CisJCQkvLyBwZXJmb3JtIHRoZSBvcGVyYXRpb24KKwkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKG9wZXJhdG9yLCBvcGVyYXRpb25UeXBlSUQpOworCQkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7CisJCX0KKwkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQsIHZhbHVlUmVxdWlyZWQpOworCX0KKworCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudCgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlwb3NpdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJY29kZVN0cmVhbS5kdXAyKCk7CisJCWNvZGVTdHJlYW0uYXJyYXlBdChhcnJheUVsZW1lbnRCaW5kaW5nLmlkKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmICgoYXJyYXlFbGVtZW50QmluZGluZyA9PSBMb25nQmluZGluZykKKwkJCQl8fCAoYXJyYXlFbGVtZW50QmluZGluZyA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJfQorCQl9CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCgKKwkJCXBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwKKwkJCWltcGxpY2l0Q29udmVyc2lvbik7CisJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGFycmF5RWxlbWVudEJpbmRpbmcuaWQpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKAorCQkJcG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQlUeXBlQmluZGluZyBhcnJheVRiID0gcmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoYXJyYXlUYiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmICghYXJyYXlUYi5pc0FycmF5VHlwZSgpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWZlcmVuY2VNdXN0QmVBcnJheVR5cGVBdChhcnJheVRiLCB0aGlzKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVR5cGVCaW5kaW5nIHBvc2l0aW9uVGIgPSBwb3NpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgSW50QmluZGluZyk7CisJCWlmIChwb3NpdGlvblRiID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcG9zaXRpb24uaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCBwb3NpdGlvblRiKTsKKwkJcmV0dXJuIGFycmF5RWxlbWVudEJpbmRpbmcgPSAoKEFycmF5QmluZGluZykgYXJyYXlUYikuZWxlbWVudHNUeXBlKHNjb3BlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCQlyZXR1cm4gcmVjZWl2ZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiWyIgLy8kTk9OLU5MUy0xJAorCQkrcG9zaXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQKKwl9IAorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCQkKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlyZWNlaXZlci50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlwb3NpdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzZmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQXJyYXlUeXBlUmVmZXJlbmNlIGV4dGVuZHMgU2luZ2xlVHlwZVJlZmVyZW5jZSB7CisJcHVibGljIGludCBkaW1lbnNpb25zOworLyoqCisgKiBBcnJheVR5cGVSZWZlcmVuY2UgY29uc3RydWN0b3IgY29tbWVudC4KKyAqIEBwYXJhbSBzb3VyY2UgY2hhcltdCisgKiBAcGFyYW0gZGltIGludAorICogQHBhcmFtIHBvcyBpbnQKKyAqLworcHVibGljIEFycmF5VHlwZVJlZmVyZW5jZShjaGFyW10gc291cmNlLCBpbnQgZGltLCBsb25nIHBvcykgeworCXN1cGVyKHNvdXJjZSwgcG9zKTsKKwlkaW1lbnNpb25zID0gZGltIDsKK30KK3B1YmxpYyBBcnJheVR5cGVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgVHlwZUJpbmRpbmcgdGIsIGludCBkaW0sIGxvbmcgcG9zKSB7CisJc3VwZXIoc291cmNlLCB0YiwgcG9zKTsKKwlkaW1lbnNpb25zID0gZGltIDt9CitwdWJsaWMgaW50IGRpbWVuc2lvbnMoKSB7CisJcmV0dXJuIGRpbWVuc2lvbnM7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKKwlpZiAoYmluZGluZyAhPSBudWxsKQorCQlyZXR1cm4gYmluZGluZzsKKwlyZXR1cm4gc2NvcGUuY3JlYXRlQXJyYXkoc2NvcGUuZ2V0VHlwZSh0b2tlbiksIGRpbWVuc2lvbnMpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7CisJLyogc2xvdyBzcGVlZCAqLworCisJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZ0V4cHJlc3Npb24odGFiKSAgOworCWlmIChkaW1lbnNpb25zID09IDEgKSByZXR1cm4gcyArICJbXSIgOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaT0xIDsgaSA8PSBkaW1lbnNpb25zIDsgaSsrKQorCQlzID0gcyArICJbXSIgOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHMgOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NlcnRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1YTUxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworCitwdWJsaWMgY2xhc3MgQXNzZXJ0U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwlwdWJsaWMgRXhwcmVzc2lvbiBhc3NlcnRFeHByZXNzaW9uLCBleGNlcHRpb25Bcmd1bWVudDsKKworCS8vIGZvciBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKKwlpbnQgcHJlQXNzZXJ0SW5pdFN0YXRlSW5kZXggPSAtMTsKKwlwcml2YXRlIEZpZWxkQmluZGluZyBhc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmc7CisJCisJcHVibGljIEFzc2VydFN0YXRlbWVudCgKKwkJRXhwcmVzc2lvbiBleGNlcHRpb25Bcmd1bWVudCwKKwkJRXhwcmVzc2lvbiBhc3NlcnRFeHByZXNzaW9uLAorCQlpbnQgc3RhcnRQb3NpdGlvbikgeworCQkJCisJCXRoaXMuYXNzZXJ0RXhwcmVzc2lvbiA9IGFzc2VydEV4cHJlc3Npb247CisJCXRoaXMuZXhjZXB0aW9uQXJndW1lbnQgPSBleGNlcHRpb25Bcmd1bWVudDsKKwkJc291cmNlU3RhcnQgPSBzdGFydFBvc2l0aW9uOworCQlzb3VyY2VFbmQgPSBleGNlcHRpb25Bcmd1bWVudC5zb3VyY2VFbmQ7CisJfQorCisJcHVibGljIEFzc2VydFN0YXRlbWVudChFeHByZXNzaW9uIGFzc2VydEV4cHJlc3Npb24sIGludCBzdGFydFBvc2l0aW9uKSB7CisKKwkJdGhpcy5hc3NlcnRFeHByZXNzaW9uID0gYXNzZXJ0RXhwcmVzc2lvbjsKKwkJc291cmNlU3RhcnQgPSBzdGFydFBvc2l0aW9uOworCQlzb3VyY2VFbmQgPSBhc3NlcnRFeHByZXNzaW9uLnNvdXJjZUVuZDsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJCQorCQlDb25zdGFudCBjb25zdGFudCA9IGFzc2VydEV4cHJlc3Npb24uY29uc3RhbnQ7CisJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQgJiYgY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJcmV0dXJuIGZsb3dJbmZvOworCQl9CisKKwkJcHJlQXNzZXJ0SW5pdFN0YXRlSW5kZXggPSBjdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisJCUZsb3dJbmZvIGFzc2VydEluZm8gPSBmbG93SW5mby5jb3B5KCk7CisJCQkKKwkJaWYgKGV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKKwkJCWFzc2VydEluZm8gPSBleGNlcHRpb25Bcmd1bWVudC5hbmFseXNlQ29kZSgKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWZsb3dDb250ZXh0LAorCQkJCQkJYXNzZXJ0RXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBhc3NlcnRJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkKKwkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0SW5mbyA9IGFzc2VydEV4cHJlc3Npb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgYXNzZXJ0SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0KKwkJCisJCS8vIGFzc2VydGlvbiBtaWdodCB0aHJvdyBBc3NlcnRpb25FcnJvciAodW5jaGVja2VkKSwgd2hpY2ggY2FuIGhhdmUgY29uc2VxdWVuY2VzIGluIHRlcm0gb2YKKwkJLy8gZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMgKGRlcGVuZGluZyBvbiBjYXVnaHQgZXhjZXB0aW9uIGluIHRoZSBjb250ZXh0KQorCQkvLyBESVNBQkxFRCAtIEFzc2VydGlvbkVycm9yIGlzIHVuY2hlY2tlZCwgdHJ5IHN0YXRlbWVudHMgYXJlIGFscmVhZHkgcHJvdGVjdGVkIGFnYWluc3QgdGhlc2UuCisJCS8vZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyhjdXJyZW50U2NvcGUuZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpLCB0aGlzLCBhc3NlcnRJbmZvLCBjdXJyZW50U2NvcGUpOworCisJCS8vIG9ubHkgcmV0YWluIHBvdGVudGlhbCBpbml0aWFsaXphdGlvbnMKKwkJZmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShhc3NlcnRJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKworCQkvLyBhZGQgdGhlIGFzc2VydCBzdXBwb3J0IGluIHRoZSBjbGluaXQKKwkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCQkJCisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCisJCWlmICh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyAhPSBudWxsKSB7CisJCQlMYWJlbCBhc3NlcnRpb25BY3RpdmF0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQljb2RlU3RyZWFtLmdldHN0YXRpYyh0aGlzLmFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyk7CisJCQljb2RlU3RyZWFtLmlmbmUoYXNzZXJ0aW9uQWN0aXZhdGlvbkxhYmVsKTsKKwkJCUxhYmVsIGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQlhc3NlcnRFeHByZXNzaW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIChmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwgbnVsbCAsIHRydWUpOworCQkJY29kZVN0cmVhbS5uZXdKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCk7CisJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJaWYgKGV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKKwkJCQlleGNlcHRpb25Bcmd1bWVudC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQljb2RlU3RyZWFtLmludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JDb25zdHJ1Y3RvcihleGNlcHRpb25Bcmd1bWVudC5pbXBsaWNpdENvbnZlcnNpb24gJiAweEYpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IoKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0uYXRocm93KCk7CisJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQlhc3NlcnRpb25BY3RpdmF0aW9uTGFiZWwucGxhY2UoKTsKKwkJfQorCQkKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChwcmVBc3NlcnRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBwcmVBc3NlcnRJbml0U3RhdGVJbmRleCk7CisJCX0JCisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJYXNzZXJ0RXhwcmVzc2lvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgQm9vbGVhbkJpbmRpbmcpOworCQlpZiAoZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgeworCQkJVHlwZUJpbmRpbmcgZXhjZXB0aW9uQXJndW1lbnRUeXBlID0gZXhjZXB0aW9uQXJndW1lbnQucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJaWYgKGV4Y2VwdGlvbkFyZ3VtZW50VHlwZSAhPSBudWxsKXsKKwkJCQlpZiAoZXhjZXB0aW9uQXJndW1lbnRUeXBlLmlkID09IFRfdm9pZCl7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWb2lkRXhwcmVzc2lvbihleGNlcHRpb25Bcmd1bWVudCk7CisJCQkJfQorCQkJCWV4Y2VwdGlvbkFyZ3VtZW50LmltcGxpY2l0Q29udmVyc2lvbiA9IChleGNlcHRpb25Bcmd1bWVudFR5cGUuaWQgPDwgNCkgKyBleGNlcHRpb25Bcmd1bWVudFR5cGUuaWQ7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJYXNzZXJ0RXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAoZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgeworCQkJCWV4Y2VwdGlvbkFyZ3VtZW50LnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCX0KKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9CQorCQorCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CisKKwkJLy8gbmVlZCBhc3NlcnRpb24gZmxhZzogJGFzc2VydGlvbnNEaXNhYmxlZCBvbiBvdXRlciBtb3N0IHNvdXJjZSB0eXBlCisJCUNsYXNzU2NvcGUgb3V0ZXJNb3N0Q2xhc3NTY29wZSA9IGN1cnJlbnRTY29wZS5vdXRlck1vc3RDbGFzc1Njb3BlKCk7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGVCaW5kaW5nID0gb3V0ZXJNb3N0Q2xhc3NTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCXRoaXMuYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nID0gc291cmNlVHlwZUJpbmRpbmcuYWRkU3ludGhldGljRmllbGQodGhpcywgY3VycmVudFNjb3BlKTsKKworCQkvLyBmaW5kIDxjbGluaXQ+IGFuZCBlbmFibGUgYXNzZXJ0aW9uIHN1cHBvcnQKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG91dGVyTW9zdENsYXNzU2NvcGUucmVmZXJlbmNlVHlwZSgpOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJaWYgKG1ldGhvZC5pc0NsaW5pdCgpKSB7CisJCQkJKChDbGluaXQpIG1ldGhvZCkuYWRkU3VwcG9ydEZvckFzc2VydGlvbihhc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOworCQlidWZmZXIuYXBwZW5kKCJhc3NlcnQiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHRoaXMuYXNzZXJ0RXhwcmVzc2lvbik7CisJCWlmICh0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjoiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmV4Y2VwdGlvbkFyZ3VtZW50KTsKKwkJCWJ1ZmZlci5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NpZ25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fzc2lnbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZjOWExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NpZ25tZW50LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXB1YmxpYyBSZWZlcmVuY2UgbGhzOworCXB1YmxpYyBFeHByZXNzaW9uIGV4cHJlc3Npb247CisJcHVibGljIFR5cGVCaW5kaW5nIGxoc1R5cGU7CisJCisJcHVibGljIEFzc2lnbm1lbnQoRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IHNvdXJjZUVuZCkgeworCQkvL2xocyBpcyBhbHdheXMgYSByZWZlcmVuY2UgYnkgY29uc3RydWN0aW9uICwKKwkJLy9idXQgaXMgYnVpbGQgYXMgYW4gZXhwcmVzc2lvbiA9PT4gdGhlIGNoZWNrY2FzdCBjYW5ub3QgZmFpbAorCisJCXRoaXMubGhzID0gKFJlZmVyZW5jZSkgbGhzOworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCisJCXRoaXMuc291cmNlU3RhcnQgPSBsaHMuc291cmNlU3RhcnQ7CisJCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCQkvLyByZWNvcmQgc2V0dGluZyBhIHZhcmlhYmxlOiB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsIAorCQkvLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAorCQkvLyBqdXN0IGEgbG9jYWwgdmFyaWFibGUuCisKKwkJcmV0dXJuIGxocworCQkJLmFuYWx5c2VBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBmYWxzZSkKKwkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCS8vIHZhcmlvdXMgc2NlbmFyaWkgYXJlIHBvc3NpYmxlLCBzZXR0aW5nIGFuIGFycmF5IHJlZmVyZW5jZSwgCisJCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IgCisJCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KKworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlsaHMuZ2VuZXJhdGVBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdGhpcywgdmFsdWVSZXF1aXJlZCk7CisJCS8vIHZhcmlhYmxlIG1heSBoYXZlIGJlZW4gb3B0aW1pemVkIG91dAorCQkvLyB0aGUgbGhzIGlzIHJlc3BvbnNpYmxlIHRvIHBlcmZvcm0gdGhlIGltcGxpY2l0Q29udmVyc2lvbiBnZW5lcmF0aW9uIGZvciB0aGUgYXNzaWdubWVudCBzaW5jZSBvcHRpbWl6ZWQgZm9yIHVudXNlZCBsb2NhbCBhc3NpZ25tZW50LgorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJLy8gZHVlIHRvIHN5bnRheCBsaHMgbWF5IGJlIG9ubHkgYSBOYW1lUmVmZXJlbmNlLCBhIEZpZWxkUmVmZXJlbmNlIG9yIGFuIEFycmF5UmVmZXJlbmNlCisJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQl0aGlzLmxoc1R5cGUgPSBsaHMucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKHRoaXMubGhzVHlwZSA9PSBudWxsIHx8IGV4cHJlc3Npb25UYiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gQ29tcGlsZS10aW1lIGNvbnZlcnNpb24gb2YgYmFzZS10eXBlcyA6IGltcGxpY2l0IG5hcnJvd2luZyBpbnRlZ2VyIGludG8gYnl0ZS9zaG9ydC9jaGFyYWN0ZXIKKwkJLy8gbWF5IHJlcXVpcmUgdG8gd2lkZW4gdGhlIHJocyBleHByZXNzaW9uIGF0IHJ1bnRpbWUKKwkJaWYgKChleHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoZXhwcmVzc2lvblRiLCB0aGlzLmxoc1R5cGUpCisJCQl8fCAodGhpcy5saHNUeXBlLmlzQmFzZVR5cGUoKSAmJiBCYXNlVHlwZUJpbmRpbmcuaXNXaWRlbmluZyh0aGlzLmxoc1R5cGUuaWQsIGV4cHJlc3Npb25UYi5pZCkpKQorCQkJfHwgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIHRoaXMubGhzVHlwZSkpKSB7CisJCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcodGhpcy5saHNUeXBlLCBleHByZXNzaW9uVGIpOworCQkJcmV0dXJuIHRoaXMubGhzVHlwZTsKKwkJfQorCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvckFjdHVhbFR5cGVFeHBlY3RlZFR5cGUoCisJCQlleHByZXNzaW9uLAorCQkJZXhwcmVzc2lvblRiLAorCQkJdGhpcy5saHNUeXBlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJLy9ubyAoKSB3aGVuIHVzZWQgYXMgYSBzdGF0ZW1lbnQgCisJCXJldHVybiB0YWJTdHJpbmcodGFiKSArIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCQkvL3N1YmNsYXNzIHJlZGVmaW5lIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKQorCQlyZXR1cm4gIigiICsgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpICsgIikiOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9IAorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpIHsKKworCQlyZXR1cm4gbGhzLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiAiIC8vJE5PTi1OTFMtMSQKKwkJCSsgIj0iIC8vJE5PTi1OTFMtMSQKKwkJCSsgKChleHByZXNzaW9uLmNvbnN0YW50ICE9IG51bGwpICYmIChleHByZXNzaW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJCQk/ICIgLypjc3Q6IiArIGV4cHJlc3Npb24uY29uc3RhbnQudG9TdHJpbmcoKSArICIqLyAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCTogIiAiKSAgLy8kTk9OLU5MUy0xJAorCQkJKyBleHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCX0KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQorCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlleHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FzdE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ViODJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3ROb2RlIGltcGxlbWVudHMgQmFzZVR5cGVzLCBDb21waWxlck1vZGlmaWVycywgVHlwZUNvbnN0YW50cywgVHlwZUlkcyB7CisJCisJcHVibGljIGludCBzb3VyY2VTdGFydCwgc291cmNlRW5kOworCisJLy9zb21lIGdsb2JhbCBwcm92aXNpb24gZm9yIHRoZSBoaWVyYXJjaHkKKwlwdWJsaWMgZmluYWwgc3RhdGljIENvbnN0YW50IE5vdEFDb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKworCS8vIHN0b3JhZ2UgZm9yIGludGVybmFsIGZsYWdzICgzMiBiaXRzKQorCXB1YmxpYyBpbnQgYml0cyA9IElzUmVhY2hhYmxlTUFTSzsgLy8gcmVhY2hhYmxlIGJ5IGRlZmF1bHQKKworCS8vIGZvciBvcGVyYXRvcnMgb25seQorCS8vIFJlYWNoIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiBPIE8gTyBPIE8gTyBWIFZyUiBSIFIgUgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJldHVyblR5cGVJRE1BU0sgPSAxNTsgLy8gNCBsb3dlciBiaXRzIGZvciBvcGVyYXRvcnMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWYWx1ZUZvclJldHVybk1BU0sgPSAxNjsgLy8gZm9yIGJpbmFyeSBleHByZXNzaW9ucworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ubHlWYWx1ZVJlcXVpcmVkTUFTSyA9IDMyOyAvLyBmb3IgYmluYXJ5IGV4cHJlc3Npb25zCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3BlcmF0b3JTSElGVCA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3BlcmF0b3JNQVNLID0gNjMgPDwgT3BlcmF0b3JTSElGVDsKKworCS8vIGZvciBuYW1lIHJlZmVyZW5jZXMgb25seQorCS8vIFJlYWNoIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gRCBEIEQgRCBEIEQgRCBEIFZyRiBSIFIgUgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJlc3RyaWN0aXZlRmxhZ01BU0sgPSA3OworCS8vIDMgbG93ZXIgYml0cyBmb3IgbmFtZSByZWZlcmVuY2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRmlyc3RBc3NpZ25tZW50VG9Mb2NhbE1BU0sgPSA4OworCS8vIGZvciBzaW5nbGUgbmFtZSByZWZlcmVuY2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGVwdGhTSElGVCA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGVwdGhNQVNLID0gMHhGRiA8PCBEZXB0aFNISUZUOworCS8vIDggYml0cyBmb3IgYWN0dWFsIGRlcHRoIHZhbHVlIChtYXguIDI1NSkKKworCS8vIGZvciBzdGF0ZW1lbnRzIG9ubHkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc1JlYWNoYWJsZU1BU0sgPSAweDgwMDAwMDAwOyAvLyBoaWdoZXN0IGJpdAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZU1BU0sgPSAweDQwMDAwMDAwOyAvLyBiZWxvdyBoaWdoZXN0IGJpdAorCisJLy8gZm9yIHR5cGUgZGVjbGFyYXRpb24gb25seQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFkZEFzc2VydGlvbk1BU0sgPSAxOyAvLyBsb3dlc3QgYml0CisKKwkvLyBmb3IgdHlwZSwgbWV0aG9kIGFuZCBmaWVsZCBkZWNsYXJhdGlvbnMgb25seQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhhc0xvY2FsVHlwZU1BU0sgPSAyOworCS8vIGNhbm5vdCBjb25mbGljdCB3aXRoIEFkZEFzc2VydGlvbk1BU0sKKworCS8qCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE9IDB4MTsgLy8gZGVjaW1hbCAxCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI9IDB4MjsgLy8gZGVjaW1hbCAyCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazM9IDB4NDsgLy8gZGVjaW1hbCA0CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazQ9IDB4ODsgLy8gZGVjaW1hbCA4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazU9IDB4MTA7IC8vIGRlY2ltYWwgMTYKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrNj0gMHgyMDsgLy8gZGVjaW1hbCAzMgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2s3PSAweDQwOyAvLyBkZWNpbWFsIDY0CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazg9IDB4ODA7IC8vIGRlY2ltYWwgMTI4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazk9IDB4MTAwOyAvLyBkZWNpbWFsIDI1NgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2sxMD0gMHgyMDA7IC8vIGRlY2ltYWwgNTEyCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazExPSAweDQwMDsgLy8gZGVjaW1hbCAxMDI0CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazEyPSAweDgwMDsgLy8gZGVjaW1hbCAyMDQ4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazEzPSAweDEwMDA7IC8vIGRlY2ltYWwgNDA5NgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2sxND0gMHgyMDAwOyAvLyBkZWNpbWFsIDgxOTIKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTU9IDB4NDAwMDsgLy8gZGVjaW1hbCAxNjM4NAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2sxNj0gMHg4MDAwOyAvLyBkZWNpbWFsIDMyNzY4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE3PSAweDEwMDAwOyAvLyBkZWNpbWFsIDY1NTM2CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE4PSAweDIwMDAwOyAvLyBkZWNpbWFsIDEzMTA3MgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2sxOT0gMHg0MDAwMDsgLy8gZGVjaW1hbCAyNjIxNDQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjA9IDB4ODAwMDA7IC8vIGRlY2ltYWwgNTI0Mjg4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazIxPSAweDEwMDAwMDsgLy8gZGVjaW1hbCAxMDQ4NTc2CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazIyPSAweDIwMDAwMDsgLy8gZGVjaW1hbCAyMDk3MTUyCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazIzPSAweDQwMDAwMDsgLy8gZGVjaW1hbCA0MTk0MzA0CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI0PSAweDgwMDAwMDsgLy8gZGVjaW1hbCA4Mzg4NjA4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI1PSAweDEwMDAwMDA7IC8vIGRlY2ltYWwgMTY3NzcyMTYKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjY9IDB4MjAwMDAwMDsgLy8gZGVjaW1hbCAzMzU1NDQzMgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2syNz0gMHg0MDAwMDAwOyAvLyBkZWNpbWFsIDY3MTA4ODY0CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI4PSAweDgwMDAwMDA7IC8vIGRlY2ltYWwgMTM0MjE3NzI4CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI5PSAweDEwMDAwMDAwOyAvLyBkZWNpbWFsIDI2ODQzNTQ1NgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2szMD0gMHgyMDAwMDAwMDsgLy8gZGVjaW1hbCA1MzY4NzA5MTIKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMzE9IDB4NDAwMDAwMDA7IC8vIGRlY2ltYWwgMTA3Mzc0MTgyNAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2szMj0gMHg4MDAwMDAwMDsgLy8gZGVjaW1hbCAyMTQ3NDgzNjQ4CQorCSovCisKKwkvKioKKwkgKiBBc3ROb2RlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIEFzdE5vZGUoKSB7CisKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5ub3RSZXR1cm4oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgQXN0Tm9kZSBjb25jcmV0ZVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIGZpZWxkIHVzZSBpcyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisJKiBBbiBhY2Nlc3MgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdCBpcyBhbGxvd2VkLgorCSovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWVsZFVzZURlcHJlY2F0ZWQoRmllbGRCaW5kaW5nIGZpZWxkLCBTY29wZSBzY29wZSkgeworCisJCXJldHVybiBmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpCisJCQkmJiAhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChmaWVsZC5kZWNsYXJpbmdDbGFzcyk7CisJfQorCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIG1ldGhvZCB1c2UgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgorCSogQW4gYWNjZXNzIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgaXMgYWxsb3dlZC4KKwkqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWV0aG9kVXNlRGVwcmVjYXRlZChNZXRob2RCaW5kaW5nIG1ldGhvZCwgU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIG1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpCisJCQkmJiAhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChtZXRob2QuZGVjbGFyaW5nQ2xhc3MpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3VwZXIoKSB7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVGhpcygpIHsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIHR5cGUgdXNlIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZC4KKwkqIEFuIGFjY2VzcyBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IGlzIGFsbG93ZWQuCisJKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1R5cGVVc2VEZXByZWNhdGVkKFR5cGVCaW5kaW5nIHR5cGUsIFNjb3BlIHNjb3BlKSB7CisKKwkJaWYgKHR5cGUuaXNBcnJheVR5cGUoKSkKKwkJCXR5cGUgPSAoKEFycmF5QmluZGluZykgdHlwZSkubGVhZkNvbXBvbmVudFR5cGU7CisJCWlmICh0eXBlLmlzQmFzZVR5cGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIHJlZlR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZTsKKwkJcmV0dXJuIHJlZlR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZmllcnNTdHJpbmcoaW50IG1vZGlmaWVycykgeworCisJCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NQdWJsaWMpICE9IDApCisJCQlzID0gcyArICJwdWJsaWMgIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDApCisJCQlzID0gcyArICJwcml2YXRlICI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCisJCQlzID0gcyArICJwcm90ZWN0ZWQgIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoKG1vZGlmaWVycyAmIEFjY1N0YXRpYykgIT0gMCkKKwkJCXMgPSBzICsgInN0YXRpYyAiOyAvLyROT04tTkxTLTEkCisJCWlmICgobW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDApCisJCQlzID0gcyArICJmaW5hbCAiOyAvLyROT04tTkxTLTEkCisJCWlmICgobW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwKQorCQkJcyA9IHMgKyAic3luY2hyb25pemVkICI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NWb2xhdGlsZSkgIT0gMCkKKwkJCXMgPSBzICsgInZvbGF0aWxlICI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NUcmFuc2llbnQpICE9IDApCisJCQlzID0gcyArICJ0cmFuc2llbnQgIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoKG1vZGlmaWVycyAmIEFjY05hdGl2ZSkgIT0gMCkKKwkJCXMgPSBzICsgIm5hdGl2ZSAiOyAvLyROT04tTkxTLTEkCisJCWlmICgobW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApCisJCQlzID0gcyArICJhYnN0cmFjdCAiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCS8qKiAKKwkgKiBAZGVwcmVjYXRlZCAtIHVzZSBmaWVsZCBpbnN0ZWFkCisJKi8KKwlwdWJsaWMgaW50IHNvdXJjZUVuZCgpIHsKKwkJcmV0dXJuIHNvdXJjZUVuZDsKKwl9CisJCisJLyoqIAorCSAqIEBkZXByZWNhdGVkIC0gdXNlIGZpZWxkIGluc3RlYWQKKwkqLworCXB1YmxpYyBpbnQgc291cmNlU3RhcnQoKSB7CisJCXJldHVybiBzb3VyY2VTdGFydDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJTdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IHRhYjsgaSA+IDA7IGktLSkKKwkJCXMgPSBzICsgIiAgIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisJCXJldHVybiB0b1N0cmluZygwKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlyZXR1cm4gIioqKioiICsgc3VwZXIudG9TdHJpbmcoKSArICIqKioqIjsgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CaW5hcnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzOGQ4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmluYXJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTczOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBCaW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgT3BlcmF0b3JFeHByZXNzaW9uIHsKKworCXB1YmxpYyBFeHByZXNzaW9uIGxlZnQsIHJpZ2h0OworCXB1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CisKKwlwdWJsaWMgQmluYXJ5RXhwcmVzc2lvbihFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsIGludCBvcGVyYXRvcikgeworCisJCXRoaXMubGVmdCA9IGxlZnQ7CisJCXRoaXMucmlnaHQgPSByaWdodDsKKwkJdGhpcy5iaXRzIHw9IG9wZXJhdG9yIDw8IE9wZXJhdG9yU0hJRlQ7IC8vIGVuY29kZSBvcGVyYXRvcgorCQl0aGlzLnNvdXJjZVN0YXJ0ID0gbGVmdC5zb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSByaWdodC5zb3VyY2VFbmQ7CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJcmV0dXJuIHJpZ2h0CisJCQkuYW5hbHlzZUNvZGUoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWZsb3dDb250ZXh0LAorCQkJCWxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pLnVuY29uZGl0aW9uYWxJbml0cygpKQorCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudChCbG9ja1Njb3BlIHNjb3BlLCBpbnQgbGVmdElkLCBpbnQgcmlnaHRJZCkgeworCisJCS8vY29tcHV0ZSB0aGUgY29uc3RhbnQgd2hlbiB2YWxpZAorCQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJJiYgKHJpZ2h0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKKwkJCXRyeSB7CisJCQkJY29uc3RhbnQgPQorCQkJCQlDb25zdGFudC5jb21wdXRlQ29uc3RhbnRPcGVyYXRpb24oCisJCQkJCQlsZWZ0LmNvbnN0YW50LAorCQkJCQkJbGVmdElkLAorCQkJCQkJKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQsCisJCQkJCQlyaWdodC5jb25zdGFudCwKKwkJCQkJCXJpZ2h0SWQpOworCQkJfSBjYXRjaCAoQXJpdGhtZXRpY0V4Y2VwdGlvbiBlKSB7CisJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJLy8gMS4yIG5vIGxvbmdlciB0aHJvd3MgYW4gZXhjZXB0aW9uIGF0IGNvbXBpbGUtdGltZQorCQkJCS8vc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29tcGlsZVRpbWVDb25zdGFudFRocm93c0FyaXRobWV0aWNFeGNlcHRpb24odGhpcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCS8vYWRkIHNvbWUgd29yayBmb3IgdGhlIGJvb2xlYW4gb3BlcmF0b3JzICYgfCAgCisJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoCisJCQkJbGVmdElkLAorCQkJCShiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZULAorCQkJCXJpZ2h0SWQpOworCQl9CisJfQorCisJcHVibGljIENvbnN0YW50IGNvbmRpdGlvbmFsQ29uc3RhbnQoKSB7CisKKwkJcmV0dXJuIG9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9PSBudWxsID8gY29uc3RhbnQgOiBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CisJfQorCisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIGJpbmFyeSBvcGVyYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCUxhYmVsIGZhbHNlTGFiZWwsIGVuZExhYmVsOworCQlpZiAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJcmV0dXJuOworCQl9CisJCWJpdHMgfD0gT25seVZhbHVlUmVxdWlyZWRNQVNLOworCQlzd2l0Y2ggKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSB7CisJCQljYXNlIFBMVVMgOgorCQkJCXN3aXRjaCAoYml0cyAmIFJldHVyblR5cGVJRE1BU0spIHsKKwkJCQkJY2FzZSBUX1N0cmluZyA6CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgbGVmdCwgcmlnaHQpOworCQkJCQkJaWYgKCF2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmlhZGQoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmxhZGQoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uZGFkZCgpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmZhZGQoKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTUlOVVMgOgorCQkJCXN3aXRjaCAoYml0cyAmIFJldHVyblR5cGVJRE1BU0spIHsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmlzdWIoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmxzdWIoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uZHN1YigpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmZzdWIoKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTVVMVElQTFkgOgorCQkJCXN3aXRjaCAoYml0cyAmIFJldHVyblR5cGVJRE1BU0spIHsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmltdWwoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmxtdWwoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uZG11bCgpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmZtdWwoKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRElWSURFIDoKKwkJCQlzd2l0Y2ggKGJpdHMgJiBSZXR1cm5UeXBlSURNQVNLKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJY29kZVN0cmVhbS5pZGl2KCk7CisJCQkJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCisJCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJCQljb2RlU3RyZWFtLmxkaXYoKTsKKwkJCQkJCWlmICghdmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uZGRpdigpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmZkaXYoKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUkVNQUlOREVSIDoKKwkJCQlzd2l0Y2ggKGJpdHMgJiBSZXR1cm5UeXBlSURNQVNLKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJY29kZVN0cmVhbS5pcmVtKCk7CisJCQkJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCisJCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJCQljb2RlU3RyZWFtLmxyZW0oKTsKKwkJCQkJCWlmICghdmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uZHJlbSgpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLmZyZW0oKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQU5EIDoKKwkJCQlzd2l0Y2ggKGJpdHMgJiBSZXR1cm5UeXBlSURNQVNLKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJLy8gMCAmIHgKKwkJCQkJCWlmICgobGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9pbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyB4ICYgMAorCQkJCQkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9pbnQpCisJCQkJCQkJCSYmIChyaWdodC5jb25zdGFudC5pbnRWYWx1ZSgpID09IDApKSB7CisJCQkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJCQljb2RlU3RyZWFtLmlhbmQoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJLy8gMCAmIHgKKwkJCQkJCWlmICgobGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9sb25nKQorCQkJCQkJCSYmIChsZWZ0LmNvbnN0YW50LmxvbmdWYWx1ZSgpID09IDBMKSkgeworCQkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQkJY29kZVN0cmVhbS5sY29uc3RfMCgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyB4ICYgMAorCQkJCQkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9sb25nKQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gMEwpKSB7CisJCQkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQkJCWNvZGVTdHJlYW0ubGNvbnN0XzAoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJCQljb2RlU3RyZWFtLmxhbmQoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2Jvb2xlYW4gOiAvLyBsb2dpY2FsIGFuZAorCQkJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRMb2dpY2FsQW5kKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCW51bGwsCisJCQkJCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQkJLyogaW1wcm92aW5nIGNvZGUgZ2VuIGZvciBzdWNoIGEgY2FzZTogYm9vbGVhbiBiID0gaSA8IDAgJiYgZmFsc2U7CisJCQkJCQkgKiBzaW5jZSB0aGUgbGFiZWwgaGFzIG5ldmVyIGJlZW4gdXNlZCwgd2UgaGF2ZSB0aGUgaW5saW5lZCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisJCQkJCQlpZiAoZmFsc2VMYWJlbC5oYXNGb3J3YXJkUmVmZXJlbmNlcygpKSB7CisJCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJCQkJCQlpZiAoKGJpdHMgJiBWYWx1ZUZvclJldHVybk1BU0spICE9IDApIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uaXJldHVybigpOworCQkJCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSk7CisJCQkJCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUoMSk7CisJCQkJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQkJCQllbmRMYWJlbC5wbGFjZSgpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIE9SIDoKKwkJCQlzd2l0Y2ggKGJpdHMgJiBSZXR1cm5UeXBlSURNQVNLKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJLy8gMCB8IHgKKwkJCQkJCWlmICgobGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9pbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyB4IHwgMAorCQkJCQkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9pbnQpCisJCQkJCQkJCSYmIChyaWdodC5jb25zdGFudC5pbnRWYWx1ZSgpID09IDApKSB7CisJCQkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCQkJY29kZVN0cmVhbS5pb3IoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJLy8gMCB8IHgKKwkJCQkJCWlmICgobGVmdC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9sb25nKQorCQkJCQkJCSYmIChsZWZ0LmNvbnN0YW50LmxvbmdWYWx1ZSgpID09IDBMKSkgeworCQkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyB4IHwgMAorCQkJCQkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQudHlwZUlEKCkgPT0gVF9sb25nKQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gMEwpKSB7CisJCQkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCQkJY29kZVN0cmVhbS5sb3IoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2Jvb2xlYW4gOiAvLyBsb2dpY2FsIG9yCisJCQkJCQlnZW5lcmF0ZU9wdGltaXplZExvZ2ljYWxPcigKKwkJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCQludWxsLAorCQkJCQkJCShmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwKKwkJCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCS8qIGltcHJvdmluZyBjb2RlIGdlbiBmb3Igc3VjaCBhIGNhc2U6IGJvb2xlYW4gYiA9IGkgPCAwIHx8IHRydWU7CisJCQkJCQkgKiBzaW5jZSB0aGUgbGFiZWwgaGFzIG5ldmVyIGJlZW4gdXNlZCwgd2UgaGF2ZSB0aGUgaW5saW5lZCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisJCQkJCQlpZiAoZmFsc2VMYWJlbC5oYXNGb3J3YXJkUmVmZXJlbmNlcygpKSB7CisJCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJCQkJCQlpZiAoKGJpdHMgJiBWYWx1ZUZvclJldHVybk1BU0spICE9IDApIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uaXJldHVybigpOworCQkJCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSk7CisJCQkJCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUoMSk7CisJCQkJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQkJCQllbmRMYWJlbC5wbGFjZSgpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFhPUiA6CisJCQkJc3dpdGNoIChiaXRzICYgUmV0dXJuVHlwZUlETUFTSykgeworCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCS8vIDAgXiB4CisJCQkJCQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJCSYmIChsZWZ0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfaW50KQorCQkJCQkJCSYmIChsZWZ0LmNvbnN0YW50LmludFZhbHVlKCkgPT0gMCkpIHsKKwkJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8geCBeIDAKKwkJCQkJCQlpZiAoKHJpZ2h0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJCQkJCQkJJiYgKHJpZ2h0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfaW50KQorCQkJCQkJCQkmJiAocmlnaHQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQkJCWNvZGVTdHJlYW0uaXhvcigpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkvLyAwIF4geAorCQkJCQkJaWYgKChsZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJCQkJCQkmJiAobGVmdC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2xvbmcpCisJCQkJCQkJJiYgKGxlZnQuY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gMEwpKSB7CisJCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIHggXiAwCisJCQkJCQkJaWYgKChyaWdodC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCQkJCSYmIChyaWdodC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2xvbmcpCisJCQkJCQkJCSYmIChyaWdodC5jb25zdGFudC5sb25nVmFsdWUoKSA9PSAwTCkpIHsKKwkJCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJCQljb2RlU3RyZWFtLmx4b3IoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRMb2dpY2FsWG9yKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCW51bGwsCisJCQkJCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQkJLyogaW1wcm92aW5nIGNvZGUgZ2VuIGZvciBzdWNoIGEgY2FzZTogYm9vbGVhbiBiID0gaSA8IDAgXiBib29sOworCQkJCQkJICogc2luY2UgdGhlIGxhYmVsIGhhcyBuZXZlciBiZWVuIHVzZWQsIHdlIGhhdmUgdGhlIGlubGluZWQgdmFsdWUgb24gdGhlIHN0YWNrLiAqLworCQkJCQkJaWYgKGZhbHNlTGFiZWwuaGFzRm9yd2FyZFJlZmVyZW5jZXMoKSkgeworCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQkJCQkJaWYgKChiaXRzICYgVmFsdWVGb3JSZXR1cm5NQVNLKSAhPSAwKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmlyZXR1cm4oKTsKKwkJCQkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpOworCQkJCQkJCQkJY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKDEpOworCQkJCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQkJCQkJZW5kTGFiZWwucGxhY2UoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBMRUZUX1NISUZUIDoKKwkJCQlzd2l0Y2ggKGJpdHMgJiBSZXR1cm5UeXBlSURNQVNLKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJY29kZVN0cmVhbS5pc2hsKCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJY29kZVN0cmVhbS5sc2hsKCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBSSUdIVF9TSElGVCA6CisJCQkJc3dpdGNoIChiaXRzICYgUmV0dXJuVHlwZUlETUFTSykgeworCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0uaXNocigpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCQkJCWNvZGVTdHJlYW0ubHNocigpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQgOgorCQkJCXN3aXRjaCAoYml0cyAmIFJldHVyblR5cGVJRE1BU0spIHsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQkJCQljb2RlU3RyZWFtLml1c2hyKCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJCQkJY29kZVN0cmVhbS5sdXNocigpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgR1JFQVRFUiA6CisJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRHcmVhdGVyVGhhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQludWxsLAorCQkJCQkoZmFsc2VMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSksCisJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQkJaWYgKChiaXRzICYgVmFsdWVGb3JSZXR1cm5NQVNLKSAhPSAwKSB7CisJCQkJCQljb2RlU3RyZWFtLmlyZXR1cm4oKTsKKwkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpOworCQkJCQkJY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKDEpOworCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQkJZW5kTGFiZWwucGxhY2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgR1JFQVRFUl9FUVVBTCA6CisJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRHcmVhdGVyVGhhbk9yRXF1YWwoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJbnVsbCwKKwkJCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQljb2RlU3RyZWFtLmljb25zdF8xKCk7CisJCQkJCWlmICgoYml0cyAmIFZhbHVlRm9yUmV0dXJuTUFTSykgIT0gMCkgeworCQkJCQkJY29kZVN0cmVhbS5pcmV0dXJuKCk7CisJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZExhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKTsKKwkJCQkJCWNvZGVTdHJlYW0uZGVjclN0YWNrU2l6ZSgxKTsKKwkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJCWVuZExhYmVsLnBsYWNlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIExFU1MgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkTGVzc1RoYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJbnVsbCwKKwkJCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQljb2RlU3RyZWFtLmljb25zdF8xKCk7CisJCQkJCWlmICgoYml0cyAmIFZhbHVlRm9yUmV0dXJuTUFTSykgIT0gMCkgeworCQkJCQkJY29kZVN0cmVhbS5pcmV0dXJuKCk7CisJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZExhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKTsKKwkJCQkJCWNvZGVTdHJlYW0uZGVjclN0YWNrU2l6ZSgxKTsKKwkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCQkJCWVuZExhYmVsLnBsYWNlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIExFU1NfRVFVQUwgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkTGVzc1RoYW5PckVxdWFsKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCW51bGwsCisJCQkJCShmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwKKwkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJCQlpZiAoKGJpdHMgJiBWYWx1ZUZvclJldHVybk1BU0spICE9IDApIHsKKwkJCQkJCWNvZGVTdHJlYW0uaXJldHVybigpOworCQkJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSk7CisJCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUoMSk7CisJCQkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQllbmRMYWJlbC5wbGFjZSgpOworCQkJCQl9CisJCQkJfQorCQl9CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwkvKioKKwkgKiBCb29sZWFuIG9wZXJhdG9yIGNvZGUgZ2VuZXJhdGlvbgorCSAqCU9wdGltaXplZCBvcGVyYXRpb25zIGFyZTogPCwgPD0sID4sID49LCAmLCB8LCBeCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQljb2RlU3RyZWFtLAorCQkJCXRydWVMYWJlbCwKKwkJCQlmYWxzZUxhYmVsLAorCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJcmV0dXJuOworCQl9CisJCXN3aXRjaCAoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKKwkJCWNhc2UgTEVTUyA6CisJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRMZXNzVGhhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgTEVTU19FUVVBTCA6CisJCQkJZ2VuZXJhdGVPcHRpbWl6ZWRMZXNzVGhhbk9yRXF1YWwoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdSRUFURVIgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkR3JlYXRlclRoYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEdSRUFURVJfRVFVQUwgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkR3JlYXRlclRoYW5PckVxdWFsKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCXRydWVMYWJlbCwKKwkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBTkQgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkTG9naWNhbEFuZCgKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT1IgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkTG9naWNhbE9yKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCXRydWVMYWJlbCwKKwkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBYT1IgOgorCQkJCWdlbmVyYXRlT3B0aW1pemVkTG9naWNhbFhvcigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQljdXJyZW50U2NvcGUsCisJCQljb2RlU3RyZWFtLAorCQkJdHJ1ZUxhYmVsLAorCQkJZmFsc2VMYWJlbCwKKwkJCXZhbHVlUmVxdWlyZWQpOworCX0KKworCS8qKgorCSAqIEJvb2xlYW4gZ2VuZXJhdGlvbiBmb3IgPgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkR3JlYXRlclRoYW4oCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaW50IHByb21vdGVkVHlwZUlEID0gbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNDsKKwkJLy8gYm90aCBzaWRlcyBnb3QgcHJvbW90ZWQgaW4gdGhlIHNhbWUgd2F5CisJCWlmIChwcm9tb3RlZFR5cGVJRCA9PSBUX2ludCkgeworCQkJLy8gMCA+IHgKKwkJCWlmICgobGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpICYmIChsZWZ0LmNvbnN0YW50LmludFZhbHVlKCkgPT0gMCkpIHsKKwkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdGx5IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZsdCh0cnVlTGFiZWwpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZnZShmYWxzZUxhYmVsKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8geCA+IDAKKwkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAocmlnaHQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ3QodHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCS8vIGltcGxpY2l0bHkgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmbGUoZmFsc2VMYWJlbCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBkZWZhdWx0IGNvbXBhcmlzb24KKwkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQlzd2l0Y2ggKHByb21vdGVkVHlwZUlEKSB7CisJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQljb2RlU3RyZWFtLmlmX2ljbXBndCh0cnVlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBsKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmd0KHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJY29kZVN0cmVhbS5sY21wKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmd0KHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmRjbXBsKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmd0KHRydWVMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCXN3aXRjaCAocHJvbW90ZWRUeXBlSUQpIHsKKwkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGxlKGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBsKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmxlKGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCWNvZGVTdHJlYW0ubGNtcCgpOworCQkJCQkJCWNvZGVTdHJlYW0uaWZsZShmYWxzZUxhYmVsKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGwoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmbGUoZmFsc2VMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBCb29sZWFuIGdlbmVyYXRpb24gZm9yID49CisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRHcmVhdGVyVGhhbk9yRXF1YWwoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaW50IHByb21vdGVkVHlwZUlEID0gbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNDsKKwkJLy8gYm90aCBzaWRlcyBnb3QgcHJvbW90ZWQgaW4gdGhlIHNhbWUgd2F5CisJCWlmIChwcm9tb3RlZFR5cGVJRCA9PSBUX2ludCkgeworCQkJLy8gMCA+PSB4CisJCQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAobGVmdC5jb25zdGFudC5pbnRWYWx1ZSgpID09IDApKSB7CisJCQkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmbGUodHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCS8vIGltcGxpY2l0bHkgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ3QoZmFsc2VMYWJlbCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIHggPj0gMAorCQkJaWYgKChyaWdodC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpICYmIChyaWdodC5jb25zdGFudC5pbnRWYWx1ZSgpID09IDApKSB7CisJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdGx5IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZnZSh0cnVlTGFiZWwpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZsdChmYWxzZUxhYmVsKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8vIGRlZmF1bHQgY29tcGFyaXNvbgorCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCXN3aXRjaCAocHJvbW90ZWRUeXBlSUQpIHsKKwkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGdlKHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCWNvZGVTdHJlYW0uZmNtcGwoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ2UodHJ1ZUxhYmVsKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQljb2RlU3RyZWFtLmxjbXAoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ2UodHJ1ZUxhYmVsKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGwoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ2UodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJc3dpdGNoIChwcm9tb3RlZFR5cGVJRCkgeworCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJY29kZVN0cmVhbS5pZl9pY21wbHQoZmFsc2VMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCWNvZGVTdHJlYW0uZmNtcGwoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmbHQoZmFsc2VMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJY29kZVN0cmVhbS5sY21wKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmx0KGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJY29kZVN0cmVhbS5kY21wbCgpOworCQkJCQkJCWNvZGVTdHJlYW0uaWZsdChmYWxzZUxhYmVsKTsKKwkJCQkJfQorCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEJvb2xlYW4gZ2VuZXJhdGlvbiBmb3IgPAorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkTGVzc1RoYW4oCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaW50IHByb21vdGVkVHlwZUlEID0gbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNDsKKwkJLy8gYm90aCBzaWRlcyBnb3QgcHJvbW90ZWQgaW4gdGhlIHNhbWUgd2F5CisJCWlmIChwcm9tb3RlZFR5cGVJRCA9PSBUX2ludCkgeworCQkJLy8gMCA8IHgKKwkJCWlmICgobGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpICYmIChsZWZ0LmNvbnN0YW50LmludFZhbHVlKCkgPT0gMCkpIHsKKwkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdGx5IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZndCh0cnVlTGFiZWwpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQkJCWNvZGVTdHJlYW0uaWZsZShmYWxzZUxhYmVsKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8geCA8IDAKKwkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAocmlnaHQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmbHQodHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCS8vIGltcGxpY2l0bHkgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ2UoZmFsc2VMYWJlbCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBkZWZhdWx0IGNvbXBhcmlzb24KKwkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQlzd2l0Y2ggKHByb21vdGVkVHlwZUlEKSB7CisJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQljb2RlU3RyZWFtLmlmX2ljbXBsdCh0cnVlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmx0KHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJY29kZVN0cmVhbS5sY21wKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmx0KHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmRjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmx0KHRydWVMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCXN3aXRjaCAocHJvbW90ZWRUeXBlSUQpIHsKKwkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGdlKGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmdlKGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCWNvZGVTdHJlYW0ubGNtcCgpOworCQkJCQkJCWNvZGVTdHJlYW0uaWZnZShmYWxzZUxhYmVsKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGcoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ2UoZmFsc2VMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciA8PQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkTGVzc1RoYW5PckVxdWFsKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWludCBwcm9tb3RlZFR5cGVJRCA9IGxlZnQuaW1wbGljaXRDb252ZXJzaW9uID4+IDQ7CisJCS8vIGJvdGggc2lkZXMgZ290IHByb21vdGVkIGluIHRoZSBzYW1lIHdheQorCQlpZiAocHJvbW90ZWRUeXBlSUQgPT0gVF9pbnQpIHsKKwkJCS8vIDAgPD0geAorCQkJaWYgKChsZWZ0LmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgJiYgKGxlZnQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCS8vIGltcGxpY2l0bHkgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCQkJY29kZVN0cmVhbS5pZmdlKHRydWVMYWJlbCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQkJCQkvLyBpbXBsaWNpdGx5IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCQkJY29kZVN0cmVhbS5pZmx0KGZhbHNlTGFiZWwpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyB4IDw9IDAKKwkJCWlmICgocmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAocmlnaHQuY29uc3RhbnQuaW50VmFsdWUoKSA9PSAwKSkgeworCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkJLy8gaW1wbGljaXRseSBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmbGUodHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCS8vIGltcGxpY2l0bHkgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ3QoZmFsc2VMYWJlbCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBkZWZhdWx0IGNvbXBhcmlzb24KKwkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQlzd2l0Y2ggKHByb21vdGVkVHlwZUlEKSB7CisJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQljb2RlU3RyZWFtLmlmX2ljbXBsZSh0cnVlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmxlKHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJY29kZVN0cmVhbS5sY21wKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmxlKHRydWVMYWJlbCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQljb2RlU3RyZWFtLmRjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmxlKHRydWVMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCXN3aXRjaCAocHJvbW90ZWRUeXBlSUQpIHsKKwkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGd0KGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQljb2RlU3RyZWFtLmZjbXBnKCk7CisJCQkJCQkJY29kZVN0cmVhbS5pZmd0KGZhbHNlTGFiZWwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCWNvZGVTdHJlYW0ubGNtcCgpOworCQkJCQkJCWNvZGVTdHJlYW0uaWZndChmYWxzZUxhYmVsKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGcoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmlmZ3QoZmFsc2VMYWJlbCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciAmCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRMb2dpY2FsQW5kKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQkJCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCUNvbnN0YW50IGNvbmRDb25zdDsKKwkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgPT0gVF9ib29sZWFuKSB7CisJCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAoY29uZENvbnN0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+ICYgeAorCQkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiAmIHgKKwkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCWZhbHNlKTsKKwkJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQlmYWxzZSk7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhmYWxzZUxhYmVsKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoKGNvbmRDb25zdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CisJCQkJCS8vIHggJiA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4KKwkJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJCX0KKwkJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQlmYWxzZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8geCAmIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4KKwkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCWZhbHNlKTsKKwkJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQlmYWxzZSk7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhmYWxzZUxhYmVsKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLy8gZGVmYXVsdCBjYXNlCisJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5pYW5kKCk7CisJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spID09IDApIHsKKwkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCQljb2RlU3RyZWFtLmlmbmUodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5pZmVxKGZhbHNlTGFiZWwpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCQorCS8qKgorCSAqIEJvb2xlYW4gZ2VuZXJhdGlvbiBmb3IgfAorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkTG9naWNhbE9yKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQkJCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCUNvbnN0YW50IGNvbmRDb25zdDsKKwkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgPT0gVF9ib29sZWFuKSB7CisJCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAoY29uZENvbnN0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+IHwgeAorCQkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCWZhbHNlKTsKKwkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCWlmICgoYml0cyAmIE9ubHlWYWx1ZVJlcXVpcmVkTUFTSykgIT0gMCkgeworCQkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ290b18odHJ1ZUxhYmVsKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+IHwgeAorCQkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKChjb25kQ29uc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCQkvLyB4IHwgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+CisJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQlmYWxzZSk7CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIHggfCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CisJCQkJCWlmICgoYml0cyAmIE9ubHlWYWx1ZVJlcXVpcmVkTUFTSykgIT0gMCkgeworCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQl9CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBkZWZhdWx0IGNhc2UKKwkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmlvcigpOworCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSA9PSAwKSB7CisJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJY29kZVN0cmVhbS5pZm5lKHRydWVMYWJlbCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQkJCWNvZGVTdHJlYW0uaWZlcShmYWxzZUxhYmVsKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKwkKKwkvKioKKwkgKiBCb29sZWFuIGdlbmVyYXRpb24gZm9yIF4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZExvZ2ljYWxYb3IoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCQkKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJQ29uc3RhbnQgY29uZENvbnN0OworCQlpZiAoKGxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKSA9PSBUX2Jvb2xlYW4pIHsKKwkJCWlmICgoY29uZENvbnN0ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4gXiB4CisJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCWZhbHNlTGFiZWwsCisJCQkJCQlmYWxzZSk7CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiBeIHgKKwkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCWZhbHNlKTsKKwkJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICgoY29uZENvbnN0ID0gcmlnaHQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAoY29uZENvbnN0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkJLy8geCBeIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPgorCQkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHggXiA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CisJCQkJCWlmICgoYml0cyAmIE9ubHlWYWx1ZVJlcXVpcmVkTUFTSykgIT0gMCkgeworCQkJCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCXRydWVMYWJlbCwKKwkJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQl9CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJZmFsc2UpOworCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBkZWZhdWx0IGNhc2UKKwkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLml4b3IoKTsKKwkJCWlmICgoYml0cyAmIE9ubHlWYWx1ZVJlcXVpcmVkTUFTSykgPT0gMCkgeworCQkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCWNvZGVTdHJlYW0uaWZuZSh0cnVlTGFiZWwpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCQljb2RlU3RyZWFtLmlmZXEoZmFsc2VMYWJlbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisJCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdCdWZmZXIoCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlpbnQgdHlwZUlEKSB7CisJCQkKKwkJLyogSW4gdGhlIGNhc2UgdHJ5aW5nIHRvIG1ha2UgYSBzdHJpbmcgY29uY2F0ZW5hdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcKKwkJICogc3RyaW5nIGJ1ZmZlciwgdGh1cyB1c2UgYSBsb3dlci1sZXZlbCBBUEkgZm9yIGNvZGUgZ2VuZXJhdGlvbiBpbnZvbHZpbmcgb25seSB0aGUKKwkJICogYXBwZW5kaW5nIG9mIGFyZ3VtZW50cyB0byB0aGUgZXhpc3RpbmcgU3RyaW5nQnVmZmVyCisJCSAqLworCisJCWlmICgoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBQTFVTKQorCQkJJiYgKChiaXRzICYgUmV0dXJuVHlwZUlETUFTSykgPT0gVF9TdHJpbmcpKSB7CisJCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nQnVmZmVyQXBwZW5kRm9yVHlwZShpbXBsaWNpdENvbnZlcnNpb24gJiAweEYpOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdCdWZmZXIoCisJCQkJCWJsb2NrU2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCWxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIGxlZnQuc291cmNlU3RhcnQpOworCQkJCXBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0J1ZmZlcigKKwkJCQkJYmxvY2tTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJcmlnaHQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHJpZ2h0LnNvdXJjZVN0YXJ0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQnVmZmVyKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sIHR5cGVJRCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdCdWZmZXJDcmVhdGlvbigKKwkJQmxvY2tTY29wZSBibG9ja1Njb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWludCB0eXBlSUQpIHsKKwkJCQorCQkvKiBJbiB0aGUgY2FzZSB0cnlpbmcgdG8gbWFrZSBhIHN0cmluZyBjb25jYXRlbmF0aW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhIG5ldworCQkgKiBzdHJpbmcgYnVmZmVyLCB0aHVzIHVzZSBhIGxvd2VyLWxldmVsIEFQSSBmb3IgY29kZSBnZW5lcmF0aW9uIGludm9sdmluZyBvbmx5IHRoZSAKKwkJICogYXBwZW5kaW5nIG9mIGFyZ3VtZW50cyB0byB0aGUgZXhpc3RpbmcgU3RyaW5nQnVmZmVyCisJCSAqLworCisJCWlmICgoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBQTFVTKQorCQkJJiYgKChiaXRzICYgUmV0dXJuVHlwZUlETUFTSykgPT0gVF9TdHJpbmcpKSB7CisJCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJY29kZVN0cmVhbS5uZXdTdHJpbmdCdWZmZXIoKTsgLy8gbmV3OiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQljb2RlU3RyZWFtLmxkYyhjb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0J1ZmZlclN0cmluZ0NvbnN0cnVjdG9yKCk7CisJCQkJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLlN0cmluZ0J1ZmZlci48aW5pdD4oTGphdmEubGFuZy5TdHJpbmc7KVYKKwkJCX0gZWxzZSB7CisJCQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQnVmZmVyQ3JlYXRpb24oCisJCQkJCWJsb2NrU2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCWxlZnQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIGxlZnQuc291cmNlU3RhcnQpOworCQkJCXBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0J1ZmZlcigKKwkJCQkJYmxvY2tTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJcmlnaHQuaW1wbGljaXRDb252ZXJzaW9uICYgMHhGKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHJpZ2h0LnNvdXJjZVN0YXJ0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQnVmZmVyQ3JlYXRpb24oYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHlwZUlEKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhY3RhYmxlT3BlcmF0aW9uKCkgeworCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyB2b2lkIG9wdGltaXplZEJvb2xlYW5Db25zdGFudChpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIGludCByaWdodElkKSB7CisKKwkJc3dpdGNoIChvcGVyYXRvcikgeworCQkJY2FzZSBBTkQgOgorCQkJCWlmICgobGVmdElkICE9IFRfYm9vbGVhbikgfHwgKHJpZ2h0SWQgIT0gVF9ib29sZWFuKSkKKwkJCQkJcmV0dXJuOworCQkJY2FzZSBBTkRfQU5EIDoKKwkJCQlDb25zdGFudCBjc3Q7CisJCQkJaWYgKChjc3QgPSBsZWZ0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCWlmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsgLy8gbGVmdCBpcyBlcXVpdmFsZW50IHRvIGZhbHNlCisJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7IC8vIGNvbnN0YW50KGZhbHNlKQorCQkJCQkJcmV0dXJuOworCQkJCQl9IGVsc2UgeyAvL2xlZnQgaXMgZXF1aXZhbGVudCB0byB0cnVlCisJCQkJCQlpZiAoKGNzdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCQkJb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY3N0OworCQkJCQkJCS8vIHRoZSBjb25kaXRpb25hbCByZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgY29uZGl0aW9uYWwgdmFsdWUKKwkJCQkJCX0KKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKGNzdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCWlmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsgLy8gcmlnaHQgaXMgZXF1aXZhbGVudCB0byBmYWxzZQorCQkJCQkJb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY3N0OyAvLyBjb25zdGFudChmYWxzZSkKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm47CisJCQljYXNlIE9SIDoKKwkJCQlpZiAoKGxlZnRJZCAhPSBUX2Jvb2xlYW4pIHx8IChyaWdodElkICE9IFRfYm9vbGVhbikpCisJCQkJCXJldHVybjsKKwkJCWNhc2UgT1JfT1IgOgorCQkJCWlmICgoY3N0ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsgLy8gbGVmdCBpcyBlcXVpdmFsZW50IHRvIHRydWUKKwkJCQkJCW9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9IGNzdDsgLy8gY29uc3RhbnQodHJ1ZSkKKwkJCQkJCXJldHVybjsKKwkJCQkJfSBlbHNlIHsgLy9sZWZ0IGlzIGVxdWl2YWxlbnQgdG8gZmFsc2UKKwkJCQkJCWlmICgoY3N0ID0gcmlnaHQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7CisJCQkJCQl9CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKChjc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsgLy8gcmlnaHQgaXMgZXF1aXZhbGVudCB0byB0cnVlCisJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7IC8vIGNvbnN0YW50KHRydWUpCisJCQkJCX0KKwkJCQl9CisJCX0KKwl9CisJCisJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQkvLyB1c2UgdGhlIGlkIG9mIHRoZSB0eXBlIHRvIG5hdmlnYXRlIGludG8gdGhlIHRhYmxlCisJCVR5cGVCaW5kaW5nIGxlZnRUYiA9IGxlZnQucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlUeXBlQmluZGluZyByaWdodFRiID0gcmlnaHQucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAobGVmdFRiID09IG51bGwgfHwgcmlnaHRUYiA9PSBudWxsKSB7CisJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWludCBsZWZ0SWQgPSBsZWZ0VGIuaWQ7CisJCWludCByaWdodElkID0gcmlnaHRUYi5pZDsKKwkJaWYgKGxlZnRJZCA+IDE1CisJCQl8fCByaWdodElkID4gMTUpIHsgLy8gbXVzdCBjb252ZXJ0IFN0cmluZyArIE9iamVjdCB8fCBPYmplY3QgKyBTdHJpbmcKKwkJCWlmIChsZWZ0SWQgPT0gVF9TdHJpbmcpIHsKKwkJCQlyaWdodElkID0gVF9PYmplY3Q7CisJCQl9IGVsc2UgaWYgKHJpZ2h0SWQgPT0gVF9TdHJpbmcpIHsKKwkJCQlsZWZ0SWQgPSBUX09iamVjdDsKKwkJCX0gZWxzZSB7CisJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGxlZnRUYiwgcmlnaHRUYik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gUExVUykgeworCQkJaWYgKGxlZnRJZCA9PSBUX1N0cmluZworCQkJCSYmIHJpZ2h0VGIuaXNBcnJheVR5cGUoKQorCQkJCSYmICgoQXJyYXlCaW5kaW5nKSByaWdodFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpID09IENoYXJCaW5kaW5nKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnNpZ25hbE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uRm9yQ2hhckFycmF5RXhwcmVzc2lvbigKKwkJCQkJcmlnaHQpOworCQkJZWxzZSBpZiAoCisJCQkJcmlnaHRJZCA9PSBUX1N0cmluZworCQkJCQkmJiBsZWZ0VGIuaXNBcnJheVR5cGUoKQorCQkJCQkmJiAoKEFycmF5QmluZGluZykgbGVmdFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpID09IENoYXJCaW5kaW5nKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnNpZ25hbE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uRm9yQ2hhckFycmF5RXhwcmVzc2lvbigKKwkJCQkJbGVmdCk7CisJCX0KKworCQkvLyB0aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCisKKwkJLy8gRG9uJ3QgdGVzdCBmb3IgcmVzdWx0ID0gMC4gSWYgaXQgaXMgemVybywgc29tZSBtb3JlIHdvcmsgaXMgZG9uZS4KKwkJLy8gT24gdGhlIG9uZSBoYW5kIHdoZW4gaXQgaXMgbm90IHplcm8gKGNvcnJlY3QgY29kZSkgd2UgYXZvaWQgZG9pbmcgdGhlIHRlc3QJCisJCWludCByZXN1bHQgPQorCQkJUmVzb2x2ZVR5cGVUYWJsZXNbKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlRdWyhsZWZ0SWQgPDwgNCkKKwkJCQkrIHJpZ2h0SWRdOworCQlsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA9IHJlc3VsdCA+Pj4gMTI7CisJCXJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiA9IChyZXN1bHQgPj4+IDQpICYgMHgwMDBGRjsKKworCQliaXRzIHw9IHJlc3VsdCAmIDB4RjsKKwkJc3dpdGNoIChyZXN1bHQgJiAweEYpIHsgLy8gcmVjb3JkIHRoZSBjdXJyZW50IFJldHVyblR5cGVJRAorCQkJLy8gb25seSBzd2l0Y2ggb24gcG9zc2libGUgcmVzdWx0IHR5cGUuLi4uLgorCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBCb29sZWFuQmluZGluZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gQnl0ZUJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfY2hhciA6CisJCQkJdGhpcy50eXBlQmluZGluZyA9IENoYXJCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJdGhpcy50eXBlQmluZGluZyA9IERvdWJsZUJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBGbG9hdEJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gSW50QmluZGluZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gTG9uZ0JpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfU3RyaW5nIDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOiAvL2Vycm9yLi4uLi4uLi4KKwkJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgbGVmdFRiLCByaWdodFRiKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGNvbXB1dGUgdGhlIGNvbnN0YW50IHdoZW4gdmFsaWQKKwkJY29tcHV0ZUNvbnN0YW50KHNjb3BlLCBsZWZ0SWQsIHJpZ2h0SWQpOworCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZzsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgeworCisJCXJldHVybiBsZWZ0LnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIiAiICsgLy8kTk9OLU5MUy0xJAorCQlvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyAvLyROT04tTkxTLTEkCisJCXJpZ2h0LnRvU3RyaW5nRXhwcmVzc2lvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlyaWdodC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjUwZWYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CbG9jay5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBCbG9jayBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJcHVibGljIFN0YXRlbWVudFtdIHN0YXRlbWVudHM7CisJcHVibGljIGludCBleHBsaWNpdERlY2xhcmF0aW9uczsKKwkvLyB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IGRlY2xhcmF0aW9uICwgdXNlZCB0byBjcmVhdGUgc2NvcGUKKwlwdWJsaWMgQmxvY2tTY29wZSBzY29wZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJsb2NrIE5vbmUgPSBuZXcgQmxvY2soMCk7CisJCisJcHVibGljIEJsb2NrKGludCBleHBsaWNpdERlY2xhcmF0aW9ucykgeworCQl0aGlzLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gZXhwbGljaXREZWNsYXJhdGlvbnM7CisJfQorCQorCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCS8vIGVtcHR5IGJsb2NrCisJCWlmIChzdGF0ZW1lbnRzID09IG51bGwpCisJCQlyZXR1cm4gZmxvd0luZm87CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlTdGF0ZW1lbnQgc3RhdDsKKwkJCWlmICghZmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKChzdGF0ID0gc3RhdGVtZW50c1tpXSksIHNjb3BlKSkgeworCQkJCWZsb3dJbmZvID0gc3RhdC5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmxvd0luZm87CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBCbG9jayBFbXB0eVdpdGgoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisKKwkJLy9yZXR1cm4gYW4gZW1wdHkgYmxvY2sgd2hpY2ggcG9zaXRpb24gaXMgcyBhbmQgZQorCQlCbG9jayBiayA9IG5ldyBCbG9jaygwKTsKKwkJYmsuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJYmsuc291cmNlRW5kID0gc291cmNlRW5kOworCQlyZXR1cm4gYms7CisJfQorCisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIGJsb2NrCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZU1BU0spID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCXN0YXRlbWVudHNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCX0KKwkJfSAvLyBmb3IgbG9jYWwgdmFyaWFibGUgZGVidWcgYXR0cmlidXRlcworCQlpZiAoc2NvcGUgIT0gY3VycmVudFNjb3BlKSB7IC8vIHdhcyByZWFsbHkgYXNzb2NpYXRlZCB3aXRoIGl0cyBvd24gc2NvcGUKKwkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZShzY29wZSk7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5QmxvY2soKSB7CisKKwkJcmV0dXJuIHN0YXRlbWVudHMgPT0gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgdXBwZXJTY29wZSkgeworCisJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCXNjb3BlID0KKwkJCQlleHBsaWNpdERlY2xhcmF0aW9ucyA9PSAwCisJCQkJCT8gdXBwZXJTY29wZQorCQkJCQk6IG5ldyBCbG9ja1Njb3BlKHVwcGVyU2NvcGUsIGV4cGxpY2l0RGVjbGFyYXRpb25zKTsKKwkJCWludCBpID0gMCwgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CisJCQl3aGlsZSAoaSA8IGxlbmd0aCkKKwkJCQlzdGF0ZW1lbnRzW2krK10ucmVzb2x2ZShzY29wZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlVXNpbmcoQmxvY2tTY29wZSBnaXZlblNjb3BlKSB7CisKKwkJLy8gdGhpcyBvcHRpbWl6ZWQgcmVzb2x2ZSguLi4pIGlzIHNlbnQgb25seSBvbiBub25lIGVtcHR5IGJsb2NrcworCQlzY29wZSA9IGdpdmVuU2NvcGU7CisJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBpID0gMCwgbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CisJCQl3aGlsZSAoaSA8IGxlbmd0aCkKKwkJCQlzdGF0ZW1lbnRzW2krK10ucmVzb2x2ZShzY29wZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpZiAodGhpcy5zdGF0ZW1lbnRzID09IG51bGwpIHsKKwkJCXMgKz0gIntcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCXMgKz0gdGFiU3RyaW5nKHRhYik7CisJCQlzICs9ICJ9IjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHM7CisJCX0KKwkJcyArPSAie1xuIjsgLy8kTk9OLU5MUy0xJAorCQlzICs9IHRoaXMudG9TdHJpbmdTdGF0ZW1lbnRzKHRhYik7CisJCXMgKz0gdGFiU3RyaW5nKHRhYik7CisJCXMgKz0gIn0iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdTdGF0ZW1lbnRzKGludCB0YWIpIHsKKworCQlpZiAodGhpcy5zdGF0ZW1lbnRzID09IG51bGwpCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiICsgMSkpOworCQkJaWYgKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBCbG9jaykgeworCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiO1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBzdGF0ZW1lbnRMZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudExlbmd0aDsgaSsrKQorCQkJCQlzdGF0ZW1lbnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCX0KKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KKwkKKwkvKioKKwkgKiBEaXNwYXRjaCB0aGUgY2FsbCBvbiBpdHMgbGFzdCBzdGF0ZW1lbnQuCisJICovCisJcHVibGljIHZvaWQgYnJhbmNoQ2hhaW5UbyhMYWJlbCBsYWJlbCkgeworCQkgaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCSAJdGhpcy5zdGF0ZW1lbnRzW3N0YXRlbWVudHMubGVuZ3RoIC0gMV0uYnJhbmNoQ2hhaW5UbyhsYWJlbCk7CisJCSB9CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJhbmNoU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyYW5jaFN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTU0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyYW5jaFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJyYW5jaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJcHVibGljIGNoYXJbXSBsYWJlbDsKKwlwdWJsaWMgTGFiZWwgdGFyZ2V0TGFiZWw7CisJcHVibGljIEFzdE5vZGVbXSBzdWJyb3V0aW5lczsKKy8qKgorICogQnJhbmNoU3RhdGVtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBCcmFuY2hTdGF0ZW1lbnQoY2hhcltdIGwsIGludCBzLGludCBlKSB7CisJbGFiZWwgPSBsIDsKKwlzb3VyY2VTdGFydCA9IHM7CisJc291cmNlRW5kID0gZTsKK30KKy8qKgorICogQnJhbmNoIGNvZGUgZ2VuZXJhdGlvbgorICoKKyAqICAgZ2VuZXJhdGUgdGhlIGZpbmFsbHlJbnZvY2F0aW9uU2VxdWVuY2UuCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZU1BU0spID09IDApIHsKKwkJcmV0dXJuOworCX0KKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCisJLy8gZ2VuZXJhdGlvbiBvZiBjb2RlIHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyB0aGUgZmluYWxseSAKKwkvLyBibG9ja3MgaW4gc2VxdWVuY2UKKwlpZiAoc3Vicm91dGluZXMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdWJyb3V0aW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlBc3ROb2RlIHN1YjsKKwkJCWlmICgoc3ViID0gc3Vicm91dGluZXNbaV0pIGluc3RhbmNlb2YgU3luY2hyb25pemVkU3RhdGVtZW50KXsKKwkJCQljb2RlU3RyZWFtLmxvYWQoKChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQpc3ViKS5zeW5jaHJvVmFyaWFibGUpOworCQkJCWNvZGVTdHJlYW0ubW9uaXRvcmV4aXQoKTsgCisJCQl9IGVsc2UgeworCQkJCVRyeVN0YXRlbWVudCB0cnlTdWIgPSAoVHJ5U3RhdGVtZW50KSBzdWI7CisJCQkJaWYgKHRyeVN1Yi5zdWJSb3V0aW5lQ2Fubm90UmV0dXJuKQl7CisJCQkJCWNvZGVTdHJlYW0uZ290b18odHJ5U3ViLnN1YlJvdXRpbmVTdGFydExhYmVsKTsKKwkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uanNyKHRyeVN1Yi5zdWJSb3V0aW5lU3RhcnRMYWJlbCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWNvZGVTdHJlYW0uZ290b18odGFyZ2V0TGFiZWwpOworCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7CisJdGhpcy50YXJnZXRMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJlYWsuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJlYWsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY0MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVhay5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQnJlYWsgZXh0ZW5kcyBCcmFuY2hTdGF0ZW1lbnQgeworCQorCXB1YmxpYyBCcmVhayhjaGFyW10gbGFiZWwsIGludCBzb3VyY2VTdGFydCwgaW50IGUpIHsKKwkJc3VwZXIobGFiZWwsIHNvdXJjZVN0YXJ0LCBlKTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBoZXJlIHJlcXVpcmVzIHRvIGdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YgZmluYWxseSBibG9ja3MgaW52b2NhdGlvbnMgZGVwZW5kaW5nIGNvcnJlc3BvbmRpbmcKKwkJLy8gdG8gZWFjaCBvZiB0aGUgdHJhdmVyc2VkIHRyeSBzdGF0ZW1lbnRzLCBzbyB0aGF0IGV4ZWN1dGlvbiB3aWxsIHRlcm1pbmF0ZSBwcm9wZXJseS4KKworCQkvLyBsb29rdXAgdGhlIGxhYmVsLCB0aGlzIHNob3VsZCBhbnN3ZXIgdGhlIHJldHVybkNvbnRleHQKKwkJRmxvd0NvbnRleHQgdGFyZ2V0Q29udGV4dDsKKwkJaWYgKGxhYmVsID09IG51bGwpIHsKKwkJCXRhcmdldENvbnRleHQgPSBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdEJyZWFrKCk7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRDb250ZXh0ID0gZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckJyZWFrTGFiZWwobGFiZWwpOworCQl9CisJCWlmICh0YXJnZXRDb250ZXh0ID09IG51bGwpIHsKKwkJCWlmIChsYWJlbCA9PSBudWxsKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRCcmVhayh0aGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOyAvLyBuZWVkIHRvIGltcHJvdmUKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRhcmdldExhYmVsID0gdGFyZ2V0Q29udGV4dC5icmVha0xhYmVsKCk7CisJCQl0YXJnZXRDb250ZXh0LnJlY29yZEJyZWFrRnJvbShmbG93SW5mbyk7CisJCQlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gZmxvd0NvbnRleHQ7CisJCQlpbnQgc3ViSW5kZXggPSAwLCBtYXhTdWIgPSA1OworCQkJc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWJdOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlBc3ROb2RlIHN1YjsKKwkJCQlpZiAoKHN1YiA9IHRyYXZlcnNlZENvbnRleHQuc3ViUm91dGluZSgpKSAhPSBudWxsKSB7CisJCQkJCWlmIChzdWJJbmRleCA9PSBtYXhTdWIpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJc3Vicm91dGluZXMsCisJCQkJCQkJMCwKKwkJCQkJCQkoc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWIgKj0gMl0pLAorCQkJCQkJCTAsCisJCQkJCQkJc3ViSW5kZXgpOworCQkJCQkJLy8gZ3JvdworCQkJCQl9CisJCQkJCXN1YnJvdXRpbmVzW3N1YkluZGV4KytdID0gc3ViOworCQkJCQlpZiAoc3ViLmNhbm5vdFJldHVybigpKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyByZW1lbWJlciB0aGUgaW5pdGlhbGl6YXRpb24gYXQgdGhpcworCQkJCS8vIHBvaW50IGZvciBkZWFsaW5nIHdpdGggYmxhbmsgZmluYWwgdmFyaWFibGVzLgorCQkJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisKKwkJCQlpZiAodHJhdmVyc2VkQ29udGV4dCA9PSB0YXJnZXRDb250ZXh0KSB7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudDsKKwkJCQl9CisJCQl9CisJCQkvLyByZXNpemUgc3Vicm91dGluZXMKKwkJCWlmIChzdWJJbmRleCAhPSBtYXhTdWIpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlzdWJyb3V0aW5lcywKKwkJCQkJMCwKKwkJCQkJKHN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbc3ViSW5kZXhdKSwKKwkJCQkJMCwKKwkJCQkJc3ViSW5kZXgpOworCQkJfQorCQl9CisJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlzID0gcyArICJicmVhayAiOyAvLyROT04tTkxTLTEkCisJCWlmIChsYWJlbCAhPSBudWxsKQorCQkJcyA9IHMgKyBuZXcgU3RyaW5nKGxhYmVsKTsKKwkJcmV0dXJuIHM7CisJfQorCQorCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2Nrc2NvcGUpIHsKKworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2Nrc2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2Nrc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc2UuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIENhc2UgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQorCXB1YmxpYyBFeHByZXNzaW9uIGNvbnN0YW50RXhwcmVzc2lvbjsKKwlwdWJsaWMgQ2FzZUxhYmVsIHRhcmdldExhYmVsOworCXB1YmxpYyBDYXNlKGludCBzb3VyY2VTdGFydCwgRXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24pIHsKKwkJdGhpcy5jb25zdGFudEV4cHJlc3Npb24gPSBjb25zdGFudEV4cHJlc3Npb247CisJCXRoaXMuc291cmNlRW5kID0gY29uc3RhbnRFeHByZXNzaW9uLnNvdXJjZUVuZDsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCWlmIChjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KQorCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhc2VFeHByZXNzaW9uTXVzdEJlQ29uc3RhbnQoY29uc3RhbnRFeHByZXNzaW9uKTsKKworCQl0aGlzLmNvbnN0YW50RXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwkvKioKKwkgKiBDYXNlIGNvZGUgZ2VuZXJhdGlvbgorCSAqCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZU1BU0spID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQl0YXJnZXRMYWJlbC5wbGFjZSgpOworCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCS8vIGVycm9yLi4uLnVzZSByZXNvbHZlQ2FzZS4uLi4KKwkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIENvbnN0YW50IHJlc29sdmVDYXNlKAorCQlCbG9ja1Njb3BlIHNjb3BlLAorCQlUeXBlQmluZGluZyB0ZXN0VGIsCisJCVN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKKworCQkvLyBhZGQgaW50byB0aGUgY29sbGVjdGlvbiBvZiBjYXNlcyBvZiB0aGUgYXNzb2NpYXRlZCBzd2l0Y2ggc3RhdGVtZW50CisJCXN3aXRjaFN0YXRlbWVudC5jYXNlc1tzd2l0Y2hTdGF0ZW1lbnQuY2FzZUNvdW50KytdID0gdGhpczsKKwkJVHlwZUJpbmRpbmcgY2FzZVRiID0gY29uc3RhbnRFeHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGNhc2VUYiA9PSBudWxsIHx8IHRlc3RUYiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChjb25zdGFudEV4cHJlc3Npb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShjYXNlVGIsIHRlc3RUYikpCisJCQlyZXR1cm4gY29uc3RhbnRFeHByZXNzaW9uLmNvbnN0YW50OworCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGNhc2VUYiwgdGVzdFRiKSkKKwkJCXJldHVybiBjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQ7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZSgKKwkJCWNvbnN0YW50RXhwcmVzc2lvbiwKKwkJCWNhc2VUYiwKKwkJCXRlc3RUYik7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgPSBzICsgImNhc2UgIiArIGNvbnN0YW50RXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgOiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7CisJCQljb25zdGFudEV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzA2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ2FzdEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXB1YmxpYyBFeHByZXNzaW9uIGV4cHJlc3Npb247CisJcHVibGljIEV4cHJlc3Npb24gdHlwZTsKKwlwdWJsaWMgYm9vbGVhbiBuZWVkUnVudGltZUNoZWNrY2FzdDsKKwlwdWJsaWMgVHlwZUJpbmRpbmcgY2FzdFRiOworCisJLy9leHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiBob2xkcyB0aGUgY2FzdCBmb3IgYmFzZVR5cGUgY2FzdGluZyAKKwlwdWJsaWMgQ2FzdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBlLCBFeHByZXNzaW9uIHQpIHsKKwkJZXhwcmVzc2lvbiA9IGU7CisJCXR5cGUgPSB0OworCisJCS8vZHVlIHRvIHRoZSBmYWN0IGFuIGV4cHJlc3Npb24gbWF5IHN0YXJ0IHdpdGggKCBhbmQgdGhhdCBhIGNhc3QgYWxzbyBzdGFydCB3aXRoICgKKwkJLy90aGUgZmllbGQgaXMgYW4gZXhwcmVzc2lvbi4uLi5pdCBjYW4gYmUgYSBUeXBlUmVmZXJlbmNlIE9SIGEgTmFtZVJlZmVyZW5jZSBPcgorCQkvL2FuIGV4cHJlc3Npb24gPC0tdGhpcyBsYXN0IG9uZSBpcyBpbnZhbGlkLi4uLi4uLgorCisJCS8vIDotKCAuLi4uLi4uLi4uLi4uCisKKwkJLy9pZiAodHlwZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UgKQorCQkvLwlmbGFnID0gSXNUeXBlUmVmZXJlbmNlIDsKKwkJLy9lbHNlCisJCS8vCWlmICh0eXBlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkKKwkJLy8JCWZsYWcgPSBJc05hbWVSZWZlcmVuY2UgOworCQkvLwllbHNlCisJCS8vCQlmbGFnID0gSXNFeHByZXNzaW9uIDsKKworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCXJldHVybiBleHByZXNzaW9uCisJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCisJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJfQorCisJcHVibGljIGZpbmFsIHZvaWQgYXJlVHlwZXNDYXN0Q29tcGF0aWJsZSgKKwkJQmxvY2tTY29wZSBzY29wZSwKKwkJVHlwZUJpbmRpbmcgY2FzdFRiLAorCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIpIHsKKworCQkvLyBzZWUgc3BlY2lmaWNhdGlvbnMgcC42OAorCQkvLyBoYW5kbGUgZXJyb3JzIGFuZCBwcm9jZXNzIGNvbnN0YW50IHdoZW4gbmVlZGVkCisKKwkJLy8gaWYgZWl0aGVyIG9uZSBvZiB0aGUgdHlwZSBpcyBudWxsID09PgorCQkvLyBzb21lIGVycm9yIGhhcyBiZWVuIGFscmVhZHkgcmVwb3J0ZWQgc29tZSB3aGVyZSA9PT4KKwkJLy8gd2UgdGhlbiBkbyBub3QgcmVwb3J0IGFuIG9idmlvdXMtY2FzY2FkZS1lcnJvci4KKworCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IGZhbHNlOworCQlpZiAoY2FzdFRiID09IG51bGwgfHwgZXhwcmVzc2lvblRiID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmIChjYXN0VGIuaXNCYXNlVHlwZSgpKSB7CisJCQlpZiAoZXhwcmVzc2lvblRiLmlzQmFzZVR5cGUoKSkgeworCQkJCWlmIChleHByZXNzaW9uVGIgPT0gY2FzdFRiKSB7CisJCQkJCWNvbnN0YW50ID0gZXhwcmVzc2lvbi5jb25zdGFudDsgLy91c2UgdGhlIHNhbWUgY29uc3RhbnQKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UYiwgY2FzdFRiKQorCQkJCQl8fCBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcoY2FzdFRiLmlkLCBleHByZXNzaW9uVGIuaWQpKSB7CisJCQkJCWV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID0gKGNhc3RUYi5pZCA8PCA0KSArIGV4cHJlc3Npb25UYi5pZDsKKwkJCQkJaWYgKGV4cHJlc3Npb24uY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KQorCQkJCQkJY29uc3RhbnQgPSBleHByZXNzaW9uLmNvbnN0YW50LmNhc3RUbyhleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS1jYXN0IHRvIHNvbWV0aGluZyB3aGljaCBpcyBOT1QgYSBiYXNlIHR5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkKKwkJaWYgKGV4cHJlc3Npb25UYiA9PSBOdWxsQmluZGluZykKKwkJCXJldHVybjsgLy9udWxsIGlzIGNvbXBhdGlibGUgd2l0aCBldmVyeSB0aGluZworCisJCWlmIChleHByZXNzaW9uVGIuaXNCYXNlVHlwZSgpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChleHByZXNzaW9uVGIuaXNBcnJheVR5cGUoKSkgeworCQkJaWYgKGNhc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCQkJLy8tLS0tLS0tIChjYXN0VGIuaXNBcnJheSkgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0KKwkJCQlUeXBlQmluZGluZyBleHByZXNzaW9uRWx0VGIgPSAoKEFycmF5QmluZGluZykgZXhwcmVzc2lvblRiKS5lbGVtZW50c1R5cGUoc2NvcGUpOworCQkJCWlmIChleHByZXNzaW9uRWx0VGIuaXNCYXNlVHlwZSgpKSB7CisJCQkJCS8vIDwtLS1zdG9wIHRoZSByZWN1cnNpb24tLS0tLS0tIAorCQkJCQlpZiAoKChBcnJheUJpbmRpbmcpIGNhc3RUYikuZWxlbWVudHNUeXBlKHNjb3BlKSA9PSBleHByZXNzaW9uRWx0VGIpCisJCQkJCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IHRydWU7CisJCQkJCWVsc2UKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCS8vIHJlY3Vyc2l2ZWx5IG9uIHRoZSBlbGVtZW50cy4uLgorCQkJCWFyZVR5cGVzQ2FzdENvbXBhdGlibGUoCisJCQkJCXNjb3BlLAorCQkJCQkoKEFycmF5QmluZGluZykgY2FzdFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpLAorCQkJCQlleHByZXNzaW9uRWx0VGIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoCisJCQkJY2FzdFRiLmlzQ2xhc3MoKSkgeworCQkJCS8vLS0tLS0tKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNBcnJheSAtLS0tLS0tLS0tLS0tLS0JCisJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsgLy8tLS0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tCisJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdDbG9uZWFibGUoY2FzdFRiKSB8fCBzY29wZS5pc0phdmFJb1NlcmlhbGl6YWJsZShjYXN0VGIpKSB7CisJCQkJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGV4cHJlc3Npb25UYi5pc0NsYXNzKCkpIHsKKwkJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeworCQkJCS8vIC0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0tCisJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZXhwcmVzc2lvblRiKSkgeyAvLyBwb3RlbnRpYWwgcnVudGltZSBlcnJvcgorCQkJCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IHRydWU7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKAorCQkJCWNhc3RUYi5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0KKwkJCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UYiwgY2FzdFRiKSkgLy8gbm8gcnVudGltZSBlcnJvcgorCQkJCQlyZXR1cm47CisJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCQkJLy8gcG90ZW50aWFsIHJ1bnRpbWUgIGVycm9yCisJCQkJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7IC8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0gIAorCQkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UYikuaXNGaW5hbCgpKSB7CisJCQkJCS8vIG5vIHN1YmNsYXNzIGZvciBleHByZXNzaW9uVGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCisJCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblRiLCBjYXN0VGIpKQorCQkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSB7IC8vIGEgc3ViY2xhc3MgbWF5IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlID09PiBubyBjaGVjayBhdCBjb21waWxlIHRpbWUKKwkJCQkJbmVlZFJ1bnRpbWVDaGVja2Nhc3QgPSB0cnVlOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VGIsIGV4cHJlc3Npb25UYik7CisJCQlyZXR1cm47CisJCX0KKworCQkvLwlpZiAoZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlKCkpIHsgY2Fubm90IGJlIGFueXRoaW5nIGVsc2UKKwkJaWYgKGNhc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCQkvLyAtLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0ludGVyZmFjZSAtLS0tLS0KKwkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGV4cHJlc3Npb25UYikKKwkJCQl8fCBzY29wZS5pc0phdmFJb1NlcmlhbGl6YWJsZShleHByZXNzaW9uVGIpKSAvLyBwb3RlbnRpYWwgcnVudGltZSBlcnJvcgorCQkJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgKKwkJCWNhc3RUYi5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tLS0KKwkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGNhc3RUYikpIC8vIG5vIHJ1bnRpbWUgZXJyb3IKKwkJCQlyZXR1cm47CisJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLmlzRmluYWwoKSkgeworCQkJCS8vIG5vIHN1YmNsYXNzIGZvciBjYXN0VGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCisJCQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQkJCS8vIHBvdGVudGlhbCBydW50aW1lIGVycm9yCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeyAvLyAtLS0tLSAoY2FzdFRiLmlzSW50ZXJmYWNlKSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tLQorCQkJaWYgKGNhc3RUYiAhPSBleHByZXNzaW9uVGIKKwkJCQkmJiAoU2NvcGUuY29tcGFyZVR5cGVzKGNhc3RUYiwgZXhwcmVzc2lvblRiKSA9PSBOb3RSZWxhdGVkKSkgeworCQkJCU1ldGhvZEJpbmRpbmdbXSBjYXN0VGJNZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLm1ldGhvZHMoKTsKKwkJCQlNZXRob2RCaW5kaW5nW10gZXhwcmVzc2lvblRiTWV0aG9kcyA9CisJCQkJCSgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblRiKS5tZXRob2RzKCk7CisJCQkJaW50IGV4cHJNZXRob2RzTGVuZ3RoID0gZXhwcmVzc2lvblRiTWV0aG9kcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNhc3RNZXRob2RzTGVuZ3RoID0gY2FzdFRiTWV0aG9kcy5sZW5ndGg7CisJCQkJCWkgPCBjYXN0TWV0aG9kc0xlbmd0aDsKKwkJCQkJaSsrKQorCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cHJNZXRob2RzTGVuZ3RoOyBqKyspCisJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5yZXR1cm5UeXBlICE9IGV4cHJlc3Npb25UYk1ldGhvZHNbal0ucmV0dXJuVHlwZSkKKwkJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5zZWxlY3RvciA9PSBleHByZXNzaW9uVGJNZXRob2RzW2pdLnNlbGVjdG9yKQorCQkJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhwcmVzc2lvblRiTWV0aG9kc1tqXSkpCisJCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKKwkJCX0KKwkJfQorCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBDYXN0IGV4cHJlc3Npb24gY29kZSBnZW5lcmF0aW9uCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQlpZiAodmFsdWVSZXF1aXJlZAorCQkJCXx8IG5lZWRSdW50aW1lQ2hlY2tjYXN0KSB7IC8vIEFkZGVkIGZvcjogMUYxVzlJRzogSVZKQ09NOldJTk5UIC0gQ29tcGlsZXIgb21pdHMgY2FzdGluZyBjaGVjaworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKKwkJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QoY2FzdFRiKTsKKwkJCQkJaWYgKCF2YWx1ZVJlcXVpcmVkKQorCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJcmV0dXJuOworCQl9CisJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKAorCQkJY3VycmVudFNjb3BlLAorCQkJY29kZVN0cmVhbSwKKwkJCXZhbHVlUmVxdWlyZWQgfHwgbmVlZFJ1bnRpbWVDaGVja2Nhc3QpOworCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKKwkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KGNhc3RUYik7CisJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCisJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCS8vIGNvbXB1dGUgYSBuZXcgY29uc3RhbnQgaWYgdGhlIGNhc3QgaXMgZWZmZWN0aXZlCisKKwkJLy8gZHVlIHRvIHRoZSBmYWN0IGFuIGV4cHJlc3Npb24gbWF5IHN0YXJ0IHdpdGggKCBhbmQgdGhhdCBhIGNhc3QgY2FuIGFsc28gc3RhcnQgd2l0aCAoCisJCS8vIHRoZSBmaWVsZCBpcyBhbiBleHByZXNzaW9uLi4uLml0IGNhbiBiZSBhIFR5cGVSZWZlcmVuY2UgT1IgYSBOYW1lUmVmZXJlbmNlIE9yCisJCS8vIGFueSBraW5kIG9mIEV4cHJlc3Npb24gPC0tIHRoaXMgbGFzdCBvbmUgaXMgaW52YWxpZC4uLi4uLi4KKworCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJaW1wbGljaXRDb252ZXJzaW9uID0gVF91bmRlZmluZWQ7CisJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYiA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoZXhwcmVzc2lvblRiID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlpZiAoKHR5cGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB8fCAodHlwZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpKSB7CisJCQlpZiAoKGNhc3RUYiA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpKSA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJcmV0dXJuIGNhc3RUYjsKKwkJfSBlbHNlIHsgLy8gZXhwcmVzc2lvbiBhcyBhIGNhc3QgISEhISEhISEgCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZVJlZmVyZW5jZSh0eXBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwkJcmV0dXJuICIoIiArIHR5cGUudG9TdHJpbmcoMCkgKyAiKSAiICsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7CisJCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJZXhwcmVzc2lvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NoYXJMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NoYXJMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0MzY5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2hhckxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ2hhckxpdGVyYWwgZXh0ZW5kcyBOdW1iZXJMaXRlcmFsIHsKKwljaGFyIHZhbHVlOworcHVibGljIENoYXJMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJc3VwZXIodG9rZW4sIHMsIGUpOworCWNvbXB1dGVWYWx1ZSgpOworfQorcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgeworCS8vVGhlIHNvdXJjZSBpcyBhICBjaGFyWzNdIGZpcnN0IGFuZCBsYXN0IGNoYXIgYXJlICcKKwkvL1RoaXMgaXMgdHJ1ZSBmb3IgYm90aCByZWd1bGFyIGNoYXIgQU5EIHVuaWNvZGUgY2hhcgorCS8vQlVUIG5vdCBmb3IgZXNjYXBlIGNoYXIgbGlrZSAnXGInIHdoaWNoIGFyZSBjaGFyWzRdLi4uLgorCisJY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUodmFsdWUpOworfQorcHJpdmF0ZSB2b2lkIGNvbXB1dGVWYWx1ZSgpIHsKKwkvL1RoZSBzb3VyY2UgaXMgYSAgY2hhclszXSBmaXJzdCBhbmQgbGFzdCBjaGFyIGFyZSAnCisJLy9UaGlzIGlzIHRydWUgZm9yIGJvdGggcmVndWxhciBjaGFyIEFORCB1bmljb2RlIGNoYXIKKwkvL0JVVCBub3QgZm9yIGVzY2FwZSBjaGFyIGxpa2UgJ1xiJyB3aGljaCBhcmUgY2hhcls0XS4uLi4KKworCWlmICgodmFsdWUgPSBzb3VyY2VbMV0pICE9ICdcXCcpCisJCXJldHVybjsKKwljaGFyIGRpZ2l0OworCXN3aXRjaCAoZGlnaXQgPSBzb3VyY2VbMl0pIHsKKwkJY2FzZSAnYicgOgorCQkJdmFsdWUgPSAnXGInOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnIDoKKwkJCXZhbHVlID0gJ1x0JzsKKwkJCWJyZWFrOworCQljYXNlICduJyA6CisJCQl2YWx1ZSA9ICdcbic7CisJCQlicmVhazsKKwkJY2FzZSAnZicgOgorCQkJdmFsdWUgPSAnXGYnOworCQkJYnJlYWs7CisJCWNhc2UgJ3InIDoKKwkJCXZhbHVlID0gJ1xyJzsKKwkJCWJyZWFrOworCQljYXNlICdcIicgOgorCQkJdmFsdWUgPSAnXCInOworCQkJYnJlYWs7CisJCWNhc2UgJ1wnJyA6CisJCQl2YWx1ZSA9ICdcJyc7CisJCQlicmVhazsKKwkJY2FzZSAnXFwnIDoKKwkJCXZhbHVlID0gJ1xcJzsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDogLy9vY3RhbCAod2VsbGVkIGZvcm1lZCwgaS5lLiBlbmRlZCBieSBhICcgKQorCQkJaW50IG51bWJlciA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoZGlnaXQpOworCQkJaWYgKChkaWdpdCA9IHNvdXJjZVszXSkgIT0gJ1wnJykKKwkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKGRpZ2l0KTsKKwkJCWVsc2UgeworCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlID0gKGNoYXIpIG51bWJlcik7CisJCQkJYnJlYWs7CisJCQl9OworCQkJaWYgKChkaWdpdCA9IHNvdXJjZVs0XSkgIT0gJ1wnJykKKwkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKGRpZ2l0KTsKKwkJCXZhbHVlID0gKGNoYXIpIG51bWJlcjsKKwkJCWJyZWFrOworCX0KK30KKy8qKgorICogQ2hhckxpdGVyYWwgY29kZSBnZW5lcmF0aW9uCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHZhbHVlUmVxdWlyZWQpCisJCWlmICgoaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfY2hhcikKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUodmFsdWUpOworCQllbHNlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJcmV0dXJuIENoYXJCaW5kaW5nOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0MDAzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ2xhc3NMaXRlcmFsQWNjZXNzIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJcHVibGljIFR5cGVSZWZlcmVuY2UgdHlwZTsKKwlwdWJsaWMgVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZTsKKwlGaWVsZEJpbmRpbmcgc3ludGhldGljRmllbGQ7CisKKwlwdWJsaWMgQ2xhc3NMaXRlcmFsQWNjZXNzKGludCBzb3VyY2VFbmQsIFR5cGVSZWZlcmVuY2UgdCkgeworCQl0eXBlID0gdDsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IHQuc291cmNlU3RhcnQ7CisJCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCS8vIGlmIHJlYWNoYWJsZSwgcmVxdWVzdCB0aGUgYWRkaXRpb24gb2YgYSBzeW50aGV0aWMgZmllbGQgZm9yIGNhY2hpbmcgdGhlIGNsYXNzIGRlc2NyaXB0b3IKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9CisJCQljdXJyZW50U2NvcGUub3V0ZXJNb3N0TWV0aG9kU2NvcGUoKS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCWlmICghKHNvdXJjZVR5cGUuaXNJbnRlcmZhY2UoKQorCQkJLy8gbm8gZmllbGQgZ2VuZXJhdGVkIGluIGludGVyZmFjZSBjYXNlICh3b3VsZCdudCB2ZXJpZnkpIHNlZSAxRkhIRVpMCisJCQl8fCBzb3VyY2VUeXBlLmlzQmFzZVR5cGUoKSkpIHsKKwkJCXN5bnRoZXRpY0ZpZWxkID0gc291cmNlVHlwZS5hZGRTeW50aGV0aWNGaWVsZCh0YXJnZXRUeXBlLCBjdXJyZW50U2NvcGUpOworCQl9CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwkvKioKKwkgKiBNZXNzYWdlU2VuZERvdENsYXNzIGNvZGUgZ2VuZXJhdGlvbgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisKKwkJLy8gaW4gaW50ZXJmYWNlIGNhc2UsIG5vIGNhY2hpbmcgb2NjdXJzLCBzaW5jZSBjYW5ub3QgbWFrZSBhIGNhY2hlIGZpZWxkIGZvciBpbnRlcmZhY2UKKwkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ2xhc3NMaXRlcmFsQWNjZXNzRm9yVHlwZSh0eXBlLmJpbmRpbmcsIHN5bnRoZXRpY0ZpZWxkKTsKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQlpZiAoKHRhcmdldFR5cGUgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICh0YXJnZXRUeXBlLmlzQXJyYXlUeXBlKCkKKwkJCSYmICgoQXJyYXlCaW5kaW5nKSB0YXJnZXRUeXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBWb2lkQmluZGluZykgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QWxsb2NhdGVWb2lkQXJyYXkodGhpcyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXJldHVybiBzY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlzID0gcyArIHR5cGUudG9TdHJpbmcoMCkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwKKwkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJCXR5cGUudHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGluaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwZjg2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKKworcHVibGljIGNsYXNzIENsaW5pdCBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24geworCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIENvbnN0YW50UG9vbE5hbWUgPSAiPGNsaW5pdD4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgRmllbGRCaW5kaW5nIGFzc2VydGlvblN5bnRoZXRpY0ZpZWxkQmluZGluZyA9IG51bGw7CisJcHJpdmF0ZSBGaWVsZEJpbmRpbmcgY2xhc3NMaXRlcmFsU3ludGhldGljRmllbGQgPSBudWxsOworCisJcHVibGljIENsaW5pdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CisJCW1vZGlmaWVycyA9IDA7CisJCXNlbGVjdG9yID0gQ29uc3RhbnRQb29sTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZSgKKwkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlLAorCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IHN0YXRpY0luaXRpYWxpemVyRmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBjbGluaXRDb250ZXh0ID0KKwkJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKKwkJCQkJc3RhdGljSW5pdGlhbGl6ZXJGbG93Q29udGV4dC5wYXJlbnQsCisJCQkJCXRoaXMsCisJCQkJCU5vRXhjZXB0aW9ucywKKwkJCQkJc2NvcGUsCisJCQkJCUZsb3dJbmZvLkRlYWRFbmQpOworCisJCQkvLyBjaGVjayBmb3IgbWlzc2luZyByZXR1cm5pbmcgcGF0aAorCQkJbmVlZEZyZWVSZXR1cm4gPQorCQkJCSEoKGZsb3dJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKTsKKworCQkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMKKwkJCWZsb3dJbmZvID0gZmxvd0luZm8ubWVyZ2VkV2l0aChzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmluaXRzT25SZXR1cm4pOworCQkJRmllbGRCaW5kaW5nW10gZmllbGRzID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmZpZWxkcygpOworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlGaWVsZEJpbmRpbmcgZmllbGQ7CisJCQkJaWYgKChmaWVsZCA9IGZpZWxkc1tpXSkuaXNTdGF0aWMoKQorCQkJCQkmJiBmaWVsZC5pc0ZpbmFsKCkKKwkJCQkJJiYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZHNbaV0pKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKAorCQkJCQkJZmllbGQsCisJCQkJCQlzY29wZS5yZWZlcmVuY2VUeXBlKCkuZGVjbGFyYXRpb25PZihmaWVsZCkpOworCQkJCQkvLyBjYW4gY29tcGxhaW4gYWdhaW5zdCB0aGUgZmllbGQgZGVjbCwgc2luY2Ugb25seSBvbmUgPGNsaW5pdD4KKwkJCQl9CisJCQl9CisJCQkvLyBjaGVjayBzdGF0aWMgaW5pdGlhbGl6ZXJzIHRocm93biBleGNlcHRpb25zCisJCQlzdGF0aWNJbml0aWFsaXplckZsb3dDb250ZXh0LmNoZWNrSW5pdGlhbGl6ZXJFeGNlcHRpb25zKAorCQkJCXNjb3BlLAorCQkJCWNsaW5pdENvbnRleHQsCisJCQkJZmxvd0luZm8pOworCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7CisJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qKgorCSAqIEJ5dGVjb2RlIGdlbmVyYXRpb24gZm9yIGEgPGNsaW5pdD4gbWV0aG9kCisJICoKKwkgKiBAcGFyYW0gY2xhc3NTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGUKKwkgKiBAcGFyYW0gY2xhc3NGaWxlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNsYXNzRmlsZQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShDbGFzc1Njb3BlIGNsYXNzU2NvcGUsIENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKworCQlpbnQgY2xpbml0T2Zmc2V0ID0gMDsKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7CisJCQkvLyBzaG91bGQgbmV2ZXIgaGF2ZSB0byBhZGQgYW55IDxjbGluaXQ+IHByb2JsZW0gbWV0aG9kCisJCQlyZXR1cm47CisJCX0KKwkJdHJ5IHsKKwkJCWNsaW5pdE9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwkJCXRoaXMuZ2VuZXJhdGVDb2RlKGNsYXNzU2NvcGUsIGNsYXNzRmlsZSwgY2xpbml0T2Zmc2V0KTsKKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJLy8gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkvLyB0aGUgY2xpbml0IHJlZmVyZW5jZUNvbnRleHQgaXMgdGhlIHR5cGUgZGVjbGFyYXRpb24KKwkJCS8vIEFsbCBjbGluaXQgcHJvYmxlbXMgd2lsbCBiZSByZXBvcnRlZCBhZ2FpbnN0IHRoZSB0eXBlOiBBYm9ydFR5cGUgaW5zdGVhZCBvZiBBYm9ydE1ldGhvZAorCQkJLy8gcmVzZXQgdGhlIGNvbnRlbnRzT2Zmc2V0IHRvIHRoZSB2YWx1ZSBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY2xpbml0IGNvZGUKKwkJCS8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIG1ldGhvZCBpbmZvIGFzIHdlbGwuCisJCQkvLyBUaGlzIGlzIGRvbmUgaW4gdGhlIGFkZFByb2JsZW1NZXRob2QgYW5kIGFkZFByb2JsZW1Db25zdHJ1Y3RvciBmb3Igb3RoZXIKKwkJCS8vIGNhc2VzLgorCQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgeworCQkJCS8vIGEgYnJhbmNoIHRhcmdldCByZXF1aXJlZCBhIGdvdG9fdywgcmVzdGFydCBjb2RlIGdlbiBpbiB3aWRlIG1vZGUuCisJCQkJdHJ5IHsKKwkJCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCisJCQkJCQkJc3RhdGVtZW50c1tpXS5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJCQkJfQorCQkJCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBjbGluaXRPZmZzZXQ7CisJCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOworCQkJCQljbGFzc0ZpbGUuY29kZVN0cmVhbS53aWRlTW9kZSA9IHRydWU7IC8vIHJlcXVlc3Qgd2lkZSBtb2RlIAorCQkJCQl0aGlzLmdlbmVyYXRlQ29kZShjbGFzc1Njb3BlLCBjbGFzc0ZpbGUsIGNsaW5pdE9mZnNldCk7CisJCQkJCS8vIHJlc3RhcnQgbWV0aG9kIGdlbmVyYXRpb24KKwkJCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlMikgeworCQkJCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBjbGluaXRPZmZzZXQ7CisJCQkJCWNsYXNzRmlsZS5tZXRob2RDb3VudC0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gcHJvZHVjZSBhIHByb2JsZW0gbWV0aG9kIGFjY291bnRpbmcgZm9yIHRoaXMgZmF0YWwgZXJyb3IKKwkJCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBjbGluaXRPZmZzZXQ7CisJCQkJY2xhc3NGaWxlLm1ldGhvZENvdW50LS07CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBCeXRlY29kZSBnZW5lcmF0aW9uIGZvciBhIDxjbGluaXQ+IG1ldGhvZAorCSAqCisJICogQHBhcmFtIGNsYXNzU2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlCisJICogQHBhcmFtIGNsYXNzRmlsZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5DbGFzc0ZpbGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUsCisJCUNsYXNzRmlsZSBjbGFzc0ZpbGUsCisJCWludCBjbGluaXRPZmZzZXQpIHsKKworCQlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sID0gY2xhc3NGaWxlLmNvbnN0YW50UG9vbDsKKwkJaW50IGNvbnN0YW50UG9vbE9mZnNldCA9IGNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0OworCQlpbnQgY29uc3RhbnRQb29sSW5kZXggPSBjb25zdGFudFBvb2wuY3VycmVudEluZGV4OworCQljbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyRm9yQ2xpbml0KCk7CisJCWludCBjb2RlQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OworCQljbGFzc0ZpbGUuZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSA9IGNsYXNzRmlsZS5jb2RlU3RyZWFtOworCQl0aGlzLnJlc29sdmUoY2xhc3NTY29wZSk7CisKKwkJY29kZVN0cmVhbS5yZXNldCh0aGlzLCBjbGFzc0ZpbGUpOworCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKworCQkvLyBpbml0aWFsaXplIGxvY2FsIHBvc2l0aW9ucyAtIGluY2x1ZGluZyBpbml0aWFsaXplciBzY29wZS4KKwkJc2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoMCwgY29kZVN0cmVhbSk7IC8vIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5CisJCU1ldGhvZFNjb3BlIHN0YXRpY0luaXRpYWxpemVyU2NvcGUgPSBkZWNsYXJpbmdUeXBlLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7CisJCXN0YXRpY0luaXRpYWxpemVyU2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoMCwgY29kZVN0cmVhbSk7CisJCS8vIG9mZnNldCBieSB0aGUgYXJndW1lbnQgc2l6ZQorCisJCS8vIDEuNCBmZWF0dXJlCisJCS8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGFueSBvdGhlciBpbml0aWFsaXphdGlvbgorCQlpZiAodGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcgIT0gbnVsbCkgeworCQkJLy8gZ2VuZXJhdGUgY29kZSByZWxhdGVkIHRvIHRoZSBhY3RpdmF0aW9uIG9mIGFzc2VydGlvbiBmb3IgdGhpcyBjbGFzcworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUoCisJCQkJY2xhc3NTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksCisJCQkJY2xhc3NMaXRlcmFsU3ludGhldGljRmllbGQpOworCQkJY29kZVN0cmVhbS5pbnZva2VKYXZhTGFuZ0NsYXNzRGVzaXJlZEFzc2VydGlvblN0YXR1cygpOworCQkJTGFiZWwgZmFsc2VMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKwkJCWNvZGVTdHJlYW0uaWZuZShmYWxzZUxhYmVsKTsKKwkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCUxhYmVsIGp1bXBMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKwkJCWNvZGVTdHJlYW0uZ290b18oanVtcExhYmVsKTsKKwkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCWp1bXBMYWJlbC5wbGFjZSgpOworCQkJY29kZVN0cmVhbS5wdXRzdGF0aWModGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcpOworCQl9CisJCS8vIGdlbmVyYXRlIGluaXRpYWxpemVycworCQlpZiAoZGVjbGFyaW5nVHlwZS5maWVsZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlY2xhcmluZ1R5cGUuZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2w7CisJCQkJaWYgKChmaWVsZERlY2wgPSBkZWNsYXJpbmdUeXBlLmZpZWxkc1tpXSkuaXNTdGF0aWMoKSkgeworCQkJCQlmaWVsZERlY2wuZ2VuZXJhdGVDb2RlKHN0YXRpY0luaXRpYWxpemVyU2NvcGUsIGNvZGVTdHJlYW0pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY29kZVN0cmVhbS5wb3NpdGlvbiA9PSAwKSB7CisJCQkvLyBkbyBub3QgbmVlZCB0byBvdXRwdXQgYSBDbGluaXQgaWYgbm8gYnl0ZWNvZGVzCisJCQkvLyBzbyB3ZSByZXNldCB0aGUgb2Zmc2V0IGluc2lkZSB0aGUgYnl0ZSBhcnJheSBjb250ZW50cy4KKwkJCWNsYXNzRmlsZS5jb250ZW50c09mZnNldCA9IGNsaW5pdE9mZnNldDsKKwkJCS8vIGxpa2Ugd2UgZG9uJ3QgYWRkZCBhIG1ldGhvZCB3ZSBuZWVkIHRvIHVuZG8gdGhlIGluY3JlbWVudCBvbiB0aGUgbWV0aG9kIGNvdW50CisJCQljbGFzc0ZpbGUubWV0aG9kQ291bnQtLTsKKwkJCS8vIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIGNsaW5pdAorCQkJY29uc3RhbnRQb29sLnJlc2V0Rm9yQ2xpbml0KGNvbnN0YW50UG9vbEluZGV4LCBjb25zdGFudFBvb2xPZmZzZXQpOworCQl9IGVsc2UgeworCQkJaWYgKG5lZWRGcmVlUmV0dXJuKSB7CisJCQkJaW50IG9sZFBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQljb2RlU3RyZWFtLnJldHVybl8oKTsKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxvY2FsVmFyaWFibGVzQXR0cmlidXRlKG9sZFBvc2l0aW9uKTsKKwkJCX0KKwkJCS8vIFJlY29yZCB0aGUgZW5kIG9mIHRoZSBjbGluaXQ6IHBvaW50IHRvIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbSgwLCBkZWNsYXJpbmdUeXBlLnNvdXJjZVN0YXJ0KTsKKwkJCWNsYXNzRmlsZS5jb21wbGV0ZUNvZGVBdHRyaWJ1dGVGb3JDbGluaXQoY29kZUF0dHJpYnV0ZU9mZnNldCk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NsaW5pdCgpIHsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemF0aW9uTWV0aG9kKCkgeworCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cyhQYXJzZXIgcGFyc2VyLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJCS8vdGhlIGNsaW5pdCBpcyBmaWxsZWQgYnkgaGFuZCAuLi4uIAorCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQ2xhc3NTY29wZSBzY29wZSkgeworCisJCXRoaXMuc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUoc2NvcGUsIHNjb3BlLnJlZmVyZW5jZUNvbnRleHQsIHRydWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJcyA9IHMgKyB0YWJTdHJpbmcodGFiKTsKKwkJcyA9IHMgKyAiPGNsaW5pdD4oKSI7IC8vJE5PTi1OTFMtMSQKKwkJcyA9IHMgKyB0b1N0cmluZ1N0YXRlbWVudHModGFiICsgMSk7CisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKKworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpOworCX0KKworCS8vIDEuNCBmZWF0dXJlCisJcHVibGljIHZvaWQgYWRkU3VwcG9ydEZvckFzc2VydGlvbihGaWVsZEJpbmRpbmcgYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nKSB7CisKKwkJdGhpcy5hc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmcgPSBhc3NlcnRpb25TeW50aGV0aWNGaWVsZEJpbmRpbmc7CisKKwkJLy8gd2UgbmVlZCB0byBhZGQgdGhlIGZpZWxkIHJpZ2h0IG5vdywgYmVjYXVzZSB0aGUgZmllbGQgaW5mb3MgYXJlIGdlbmVyYXRlZCBiZWZvcmUgdGhlIG1ldGhvZHMKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9CisJCQl0aGlzLnNjb3BlLm91dGVyTW9zdE1ldGhvZFNjb3BlKCkuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQl0aGlzLmNsYXNzTGl0ZXJhbFN5bnRoZXRpY0ZpZWxkID0KKwkJCXNvdXJjZVR5cGUuYWRkU3ludGhldGljRmllbGQoc291cmNlVHlwZSwgc2NvcGUpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NmNWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCitwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24KKwlleHRlbmRzIEFzdE5vZGUKKwlpbXBsZW1lbnRzIFByb2JsZW1TZXZlcml0aWVzLCBSZWZlcmVuY2VDb250ZXh0IHsKKwkJCisJcHVibGljIEltcG9ydFJlZmVyZW5jZSBjdXJyZW50UGFja2FnZTsKKwlwdWJsaWMgSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0czsKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uW10gdHlwZXM7CisJLy9wdWJsaWMgY2hhcltdW10gbmFtZTsKKworCXB1YmxpYyBib29sZWFuIGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gZmFsc2U7CS8vIG9uY2UgcG9pbnRsZXNzIHRvIGludmVzdGlnYXRlIGR1ZSB0byBlcnJvcnMKKwlwdWJsaWMgYm9vbGVhbiBpZ25vcmVNZXRob2RCb2RpZXMgPSBmYWxzZTsKKwlwdWJsaWMgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGU7CisJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXI7CisJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OworCisJcHJpdmF0ZSBMb2NhbFR5cGVCaW5kaW5nW10gYWxsTG9jYWxUeXBlczsKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbjsKKworCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsCisJCWludCBzb3VyY2VMZW5ndGgpIHsKKworCQl0aGlzLnByb2JsZW1SZXBvcnRlciA9IHByb2JsZW1SZXBvcnRlcjsKKwkJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OworCisJCS8vYnkgZGVmaW5pdGlvbiBvZiBhIGNvbXBpbGF0aW9uIHVuaXQuLi4uCisJCXNvdXJjZVN0YXJ0ID0gMDsKKwkJc291cmNlRW5kID0gc291cmNlTGVuZ3RoIC0gMTsKKworCX0KKworCS8qCisJICoJV2UgY2F1c2UgdGhlIGNvbXBpbGF0aW9uIHRhc2sgdG8gYWJvcnQgdG8gYSBnaXZlbiBleHRlbnQuCisJICovCisJcHVibGljIHZvaWQgYWJvcnQoaW50IGFib3J0TGV2ZWwpIHsKKworCQlzd2l0Y2ggKGFib3J0TGV2ZWwpIHsKKwkJCWNhc2UgQWJvcnRUeXBlIDoKKwkJCQl0aHJvdyBuZXcgQWJvcnRUeXBlKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCWNhc2UgQWJvcnRNZXRob2QgOgorCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChjb21waWxhdGlvblJlc3VsdCk7CisJCQlkZWZhdWx0IDoKKwkJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfQorCisJLyoKKwkgKiBEaXNwYXRjaCBjb2RlIGFuYWx5c2lzIEFORCByZXF1ZXN0IHNhdHVyYXRpb24gb2YgaW5uZXIgZW11bGF0aW9uCisJICovCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoKSB7CisKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCXR5cGVzW2ldLmFuYWx5c2VDb2RlKHNjb3BlKTsKKwkJCQl9CisJCQl9CisJCQkvLyByZXF1ZXN0IGlubmVyIGVtdWxhdGlvbiBwcm9wYWdhdGlvbgorCQkJcHJvcGFnYXRlSW5uZXJFbXVsYXRpb25Gb3JBbGxMb2NhbFR5cGVzKCk7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBXaGVuIHVuaXQgcmVzdWx0IGlzIGFib3V0IHRvIGJlIGFjY2VwdGVkLCByZW1vdmVkIGJhY2sgcG9pbnRlcnMKKwkgKiB0byBjb21waWxlciBzdHJ1Y3R1cmVzLgorCSAqLworCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CisKKwkJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IGNvbXBpbGF0aW9uUmVzdWx0LmdldENsYXNzRmlsZXMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGNsYXNzRmlsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCS8vIGNsZWFyIHRoZSBjbGFzc0ZpbGUgYmFjayBwb2ludGVyIHRvIHRoZSBiaW5kaW5ncworCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGNsYXNzRmlsZXNbaV07CisJCQkvLyBudWxsIG91dCB0aGUgdHlwZSdzIHNjb3BlIGJhY2twb2ludGVycworCQkJICgoU291cmNlVHlwZUJpbmRpbmcpIGNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nKS5zY29wZSA9IG51bGw7CisJCQkvLyBudWxsIG91dCB0aGUgY2xhc3NmaWxlIGJhY2twb2ludGVyIHRvIGEgdHlwZSBiaW5kaW5nCisJCQljbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZyA9IG51bGw7CisJCQljbGFzc0ZpbGUuY29kZVN0cmVhbSA9IG51bGw7IC8vIGNvZGVTdHJlYW0gaG9sZHMgb250byBhc3QgYW5kIHNjb3BlcworCQkJY2xhc3NGaWxlLmlubmVyQ2xhc3Nlc0JpbmRpbmdzID0gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrVW51c2VkSW1wb3J0cygpeworCQkKKwkJaWYgKHRoaXMuc2NvcGUuaW1wb3J0cyAhPSBudWxsKXsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnNjb3BlLmltcG9ydHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJCUltcG9ydEJpbmRpbmcgaW1wb3J0QmluZGluZyA9IHRoaXMuc2NvcGUuaW1wb3J0c1tpXTsKKwkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0QmluZGluZy5yZWZlcmVuY2U7CisJCQkJaWYgKGltcG9ydFJlZmVyZW5jZSAhPSBudWxsICYmICFpbXBvcnRSZWZlcmVuY2UudXNlZCl7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZEltcG9ydChpbXBvcnRSZWZlcmVuY2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQoKSB7CisJCXJldHVybiBjb21waWxhdGlvblJlc3VsdDsKKwl9CisJCisJLyoKKwkgKiBGaW5kcyB0aGUgbWF0Y2hpbmcgdHlwZSBhbW91bmcgdGhpcyBjb21waWxhdGlvbiB1bml0IHR5cGVzLgorCSAqIFJldHVybnMgbnVsbCBpZiBubyB0eXBlIHdpdGggdGhpcyBuYW1lIGlzIGZvdW5kLgorCSAqIFRoZSB0eXBlIG5hbWUgaXMgYSBjb21wb3VuZCBuYW1lCisJICogZWcuIGlmIHdlJ3JlIGxvb2tpbmcgZm9yIFguQS5CIHRoZW4gYSB0eXBlIG5hbWUgd291bGQgYmUge1gsIEEsIEJ9CisJICovCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbk9mVHlwZShjaGFyW11bXSB0eXBlTmFtZSkgeworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50eXBlcy5sZW5ndGg7IGkrKykgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy50eXBlc1tpXS5kZWNsYXJhdGlvbk9mVHlwZSh0eXBlTmFtZSk7CisJCQlpZiAodHlwZURlY2wgIT0gbnVsbCkgeworCQkJCXJldHVybiB0eXBlRGVjbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBCeXRlY29kZSBnZW5lcmF0aW9uCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKCkgeworCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikgeworCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCXR5cGVzW2ldLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJCQkJLy8gcHJvcGFnYXRlIHRoZSBmbGFnIHRvIHJlcXVlc3QgcHJvYmxlbSB0eXBlIGNyZWF0aW9uCisJCQkJCXR5cGVzW2ldLmdlbmVyYXRlQ29kZShzY29wZSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQlpZiAodHlwZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspCisJCQkJCXR5cGVzW2ldLmdlbmVyYXRlQ29kZShzY29wZSk7CisJCQl9CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJfQorCX0KKworCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisKKwkJcmV0dXJuIGNvbXBpbGF0aW9uUmVzdWx0LmdldEZpbGVOYW1lKCk7CisJfQorCisJcHVibGljIGNoYXJbXSBnZXRNYWluVHlwZU5hbWUoKSB7CisKKwkJaWYgKGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7CisJCQljaGFyW10gZmlsZU5hbWUgPSBjb21waWxhdGlvblJlc3VsdC5nZXRGaWxlTmFtZSgpOworCisJCQlpbnQgc3RhcnQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcvJywgZmlsZU5hbWUpICsgMTsKKwkJCWlmIChzdGFydCA9PSAwIHx8IHN0YXJ0IDwgQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignXFwnLCBmaWxlTmFtZSkpCisJCQkJc3RhcnQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCdcXCcsIGZpbGVOYW1lKSArIDE7CisKKwkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcuJywgZmlsZU5hbWUpOworCQkJaWYgKGVuZCA9PSAtMSkKKwkJCQllbmQgPSBmaWxlTmFtZS5sZW5ndGg7CisKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGZpbGVOYW1lLCBzdGFydCwgZW5kKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBjb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCisJCXJldHVybiAoY3VycmVudFBhY2thZ2UgPT0gbnVsbCkgJiYgKGltcG9ydHMgPT0gbnVsbCkgJiYgKHR5cGVzID09IG51bGwpOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKKwkJcmV0dXJuIHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb247CisJfQorCisJLyoKKwkgKiBGb3JjZSBpbm5lciBsb2NhbCB0eXBlcyB0byB1cGRhdGUgdGhlaXIgaW5uZXJjbGFzcyBlbXVsYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wYWdhdGVJbm5lckVtdWxhdGlvbkZvckFsbExvY2FsVHlwZXMoKSB7CisKKwkJaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24gPSB0cnVlOworCQlpZiAoYWxsTG9jYWxUeXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYWxsTG9jYWxUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWFsbExvY2FsVHlwZXNbaV0udXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2YgYWxsIGxvY2FsIHR5cGVzLCBzbyBhcyB0byB1cGRhdGUgdGhlaXIgaW5uZXJjbGFzcworCSAqIGVtdWxhdGlvbiBsYXRlciBvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZWNvcmQoTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUpIHsKKworCQlpZiAoYWxsTG9jYWxUeXBlcyA9PSBudWxsKSB7CisJCQlhbGxMb2NhbFR5cGVzID0gbmV3IExvY2FsVHlwZUJpbmRpbmdbXSB7IGxvY2FsVHlwZSB9OworCQl9IGVsc2UgeworCQkJaW50IGxlbmd0aCA9IGFsbExvY2FsVHlwZXMubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlhbGxMb2NhbFR5cGVzLAorCQkJCTAsCisJCQkJKGFsbExvY2FsVHlwZXMgPSBuZXcgTG9jYWxUeXBlQmluZGluZ1tsZW5ndGggKyAxXSksCisJCQkJMCwKKwkJCQlsZW5ndGgpOworCQkJYWxsTG9jYWxUeXBlc1tsZW5ndGhdID0gbG9jYWxUeXBlOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKKworCQl0cnkgeworCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSB0eXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCXR5cGVzW2ldLnJlc29sdmUoc2NvcGUpOworCQkJCX0KKwkJCX0KKwkJCWNoZWNrVW51c2VkSW1wb3J0cygpOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uVW5pdCBlKSB7CisJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRhZ0FzSGF2aW5nRXJyb3JzKCkgeworCQlpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoY3VycmVudFBhY2thZ2UgIT0gbnVsbCkKKwkJCXMgPSB0YWJTdHJpbmcodGFiKSArICJwYWNrYWdlICIgKyBjdXJyZW50UGFja2FnZS50b1N0cmluZygwLCBmYWxzZSkgKyAiO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gdGFiU3RyaW5nKHRhYikgKyAiaW1wb3J0ICIgKyBpbXBvcnRzW2ldLnRvU3RyaW5nKCkgKyAiO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl9OworCisJCWlmICh0eXBlcyAhPSBudWxsKQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gdHlwZXNbaV0udG9TdHJpbmcodGFiKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlKSB7CisKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJCQlpbnQgaW1wb3J0TGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0TGVuZ3RoOyBpKyspCisJCQkJCQlpbXBvcnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQl9CisJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCQkJaW50IHR5cGVzTGVuZ3RoID0gdHlwZXMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzTGVuZ3RoOyBpKyspCisJCQkJCQl0eXBlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJfQorCQkJfQorCQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21wb3VuZEFzc2lnbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTdlNWYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21wb3VuZEFzc2lnbm1lbnQuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29tcG91bmRBc3NpZ25tZW50IGV4dGVuZHMgQXNzaWdubWVudCBpbXBsZW1lbnRzIE9wZXJhdG9ySWRzIHsKKwlwdWJsaWMgaW50IG9wZXJhdG9yOworCXB1YmxpYyBpbnQgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbjsKKworCS8vICB2YXIgb3AgZXhwIGlzIGVxdWl2YWxlbnQgdG8gdmFyID0gKHZhclR5cGUpIHZhciBvcCBleHAKKwkvLyBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uIHN0b3JlcyB0aGUgY2FzdCBuZWVkZWQgZm9yIHRoZSBhc3NpZ25tZW50CisKK3B1YmxpYyBDb21wb3VuZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbixpbnQgb3BlcmF0b3IsIGludCBzb3VyY2VFbmQpIHsKKwkvL2xocyBpcyBhbHdheXMgYSByZWZlcmVuY2UgYnkgY29uc3RydWN0aW9uICwKKwkvL2J1dCBpcyBidWlsZCBhcyBhbiBleHByZXNzaW9uID09PiB0aGUgY2hlY2tjYXN0IGNhbm5vdCBmYWlsCisKKwlzdXBlcihsaHMsIGV4cHJlc3Npb24sIHNvdXJjZUVuZCk7CisJdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yIDsKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJLy8gcmVjb3JkIHNldHRpbmcgYSB2YXJpYWJsZTogdmFyaW91cyBzY2VuYXJpaSBhcmUgcG9zc2libGUsIHNldHRpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLCAKKwkvLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAorCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KKworCXJldHVybiBsaHMuYW5hbHlzZUFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIHRydWUpLnVuY29uZGl0aW9uYWxJbml0cygpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJLy8gdmFyaW91cyBzY2VuYXJpaSBhcmUgcG9zc2libGUsIHNldHRpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLCAKKwkvLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAorCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KKworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJbGhzLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZXhwcmVzc2lvbiwgb3BlcmF0b3IsIGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KK3B1YmxpYyBTdHJpbmcgb3BlcmF0b3JUb1N0cmluZygpIHsKKwlzd2l0Y2ggKG9wZXJhdG9yKSB7CisJCWNhc2UgUExVUyA6CisJCQlyZXR1cm4gIis9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIE1JTlVTIDoKKwkJCXJldHVybiAiLT0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgTVVMVElQTFkgOgorCQkJcmV0dXJuICIqPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBESVZJREUgOgorCQkJcmV0dXJuICIvPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBBTkQgOgorCQkJcmV0dXJuICImPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBPUiA6CisJCQlyZXR1cm4gInw9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFhPUiA6CisJCQlyZXR1cm4gIl49IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFJFTUFJTkRFUiA6CisJCQlyZXR1cm4gIiU9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIExFRlRfU0hJRlQgOgorCQkJcmV0dXJuICI8PD0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgUklHSFRfU0hJRlQgOgorCQkJcmV0dXJuICI+Pj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQgOgorCQkJcmV0dXJuICI+Pj49IjsgLy8kTk9OLU5MUy0xJAorCX07CisJcmV0dXJuICJ1bmtub3duIG9wZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwlUeXBlQmluZGluZyBsaHNUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsKKwlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmIChsaHNUeXBlID09IG51bGwgfHwgZXhwcmVzc2lvblR5cGUgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisKKwlpbnQgbGhzSWQgPSBsaHNUeXBlLmlkOworCWludCBleHByZXNzaW9uSWQgPSBleHByZXNzaW9uVHlwZS5pZDsKKwlpZiAocmVzdHJhaW5Vc2FnZVRvTnVtZXJpY1R5cGVzKCkgJiYgIWxoc1R5cGUuaXNOdW1lcmljVHlwZSgpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm9wZXJhdG9yT25seVZhbGlkT25OdW1lcmljVHlwZSh0aGlzLCBsaHNUeXBlLCBleHByZXNzaW9uVHlwZSk7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAobGhzSWQgPiAxNSB8fCBleHByZXNzaW9uSWQgPiAxNSkgeworCQlpZiAobGhzSWQgIT0gVF9TdHJpbmcpIHsgLy8gU3RyaW5nICs9IE9iamVjdCBpcyB2YWxpZCB3aGVyYWFzIE9iamVjdCAtPSBTdHJpbmcgaXMgbm90CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgbGhzVHlwZSwgZXhwcmVzc2lvblR5cGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJZXhwcmVzc2lvbklkID0gVF9PYmplY3Q7IC8vIHVzZSB0aGUgT2JqZWN0IGhhcyB0YWcgdGFibGUKKwl9CisKKwkvLyB0aGUgY29kZSBpcyBhbiBpbnQKKwkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQgCisJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgIDw8NCAgICAgICAgPDwwCisKKwkvLyB0aGUgY29udmVyc2lvbiBpcyBzdG9yZWQgSU5UTyB0aGUgcmVmZXJlbmNlIChpbmZvIG5lZWRlZCBmb3IgdGhlIGNvZGUgZ2VuKQorCWludCByZXN1bHQgPSBPcGVyYXRvckV4cHJlc3Npb24uUmVzb2x2ZVR5cGVUYWJsZXNbb3BlcmF0b3JdWyAobGhzSWQgPDwgNCkgKyBleHByZXNzaW9uSWRdOworCWlmIChyZXN1bHQgPT0gVF91bmRlZmluZWQpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGxoc1R5cGUsIGV4cHJlc3Npb25UeXBlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChvcGVyYXRvciA9PSBQTFVTKXsKKwkJaWYoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChsaHNUeXBlKSkgeworCQkJLy8gPE9iamVjdD4gKz0gPFN0cmluZz4gaXMgaWxsZWdhbAorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGxoc1R5cGUsIGV4cHJlc3Npb25UeXBlKTsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgaWYgKChsaHNUeXBlLmlzTnVtZXJpY1R5cGUoKSB8fCBsaHNJZCA9PSBUX2Jvb2xlYW4pICYmICFleHByZXNzaW9uVHlwZS5pc051bWVyaWNUeXBlKCkpeworCQkJLy8gPGludCB8IGJvb2xlYW4+ICs9IDxTdHJpbmc+IGlzIGlsbGVnYWwKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRPcGVyYXRvcih0aGlzLCBsaHNUeXBlLCBleHByZXNzaW9uVHlwZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwlsaHMuaW1wbGljaXRDb252ZXJzaW9uID0gcmVzdWx0ID4+PiAxMjsKKwlleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA9IChyZXN1bHQgPj4+IDQpICYgMHgwMDBGRjsKKwlhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uID0gKGxoc0lkIDw8IDQpICsgKHJlc3VsdCAmIDB4MDAwMEYpOworCXJldHVybiBsaHNUeXBlOworfQorcHVibGljIGJvb2xlYW4gcmVzdHJhaW5Vc2FnZVRvTnVtZXJpY1R5cGVzKCl7CisJcmV0dXJuIGZhbHNlIDt9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSB7CisKKwlyZXR1cm4gCWxocy50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgIiArIC8vJE5PTi1OTFMtMSQKKwkJCW9wZXJhdG9yVG9TdHJpbmcoKSArICIgIiArIC8vJE5PTi1OTFMtMSQKKwkJCWV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCkgOyB9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCWxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCWV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCX0KKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWE4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIE9wZXJhdG9yRXhwcmVzc2lvbiB7CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb24sIHZhbHVlSWZUcnVlLCB2YWx1ZUlmRmFsc2U7CisJcHJpdmF0ZSBpbnQgcmV0dXJuVHlwZVNsb3RTaXplID0gMTsKKworCS8vIGZvciBsb2NhbCB2YXJpYWJsZXMgdGFibGUgYXR0cmlidXRlcworCWludCB0aGVuSW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgZWxzZUluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7CisJCisJcHVibGljIENvbmRpdGlvbmFsRXhwcmVzc2lvbigKKwkJRXhwcmVzc2lvbiBjb25kaXRpb24sCisJCUV4cHJlc3Npb24gdmFsdWVJZlRydWUsCisJCUV4cHJlc3Npb24gdmFsdWVJZkZhbHNlKSB7CisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQl0aGlzLnZhbHVlSWZUcnVlID0gdmFsdWVJZlRydWU7CisJCXRoaXMudmFsdWVJZkZhbHNlID0gdmFsdWVJZkZhbHNlOworCQlzb3VyY2VTdGFydCA9IGNvbmRpdGlvbi5zb3VyY2VTdGFydDsKKwkJc291cmNlRW5kID0gdmFsdWVJZkZhbHNlLnNvdXJjZUVuZDsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlDb25zdGFudCBjb25kaXRpb25Db25zdGFudCA9IGNvbmRpdGlvbi5jb25kaXRpb25hbENvbnN0YW50KCk7CisKKwkJZmxvd0luZm8gPSBjb25kaXRpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIGNvbmRpdGlvbkNvbnN0YW50ID09IE5vdEFDb25zdGFudCk7CisKKwkJaWYgKGNvbmRpdGlvbkNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJaWYgKGNvbmRpdGlvbkNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkvLyBUUlVFID8gbGVmdCA6IHJpZ2h0CisJCQkJRmxvd0luZm8gcmVzdWx0SW5mbyA9CisJCQkJCXZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCQkJLy8gYW5hbHlzZSB2YWx1ZUlmRmFsc2UsIGJ1dCBkbyBub3QgdGFrZSBpbnRvIGFjY291bnQgYW55IG9mIGl0cyBpbmZvcworCQkJCXZhbHVlSWZGYWxzZS5hbmFseXNlQ29kZSgKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQlmbG93Q29udGV4dCwKKwkJCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKSk7CisJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyZXN1bHRJbmZvKTsKKwkJCQlyZXR1cm4gcmVzdWx0SW5mbzsKKwkJCX0gZWxzZSB7CisJCQkJLy8gRkFMU0UgPyBsZWZ0IDogcmlnaHQKKwkJCQkvLyBhbmFseXNlIHZhbHVlSWZUcnVlLCBidXQgZG8gbm90IHRha2UgaW50byBhY2NvdW50IGFueSBvZiBpdHMgaW5mb3MJCQkKKwkJCQl2YWx1ZUlmVHJ1ZS5hbmFseXNlQ29kZSgKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQlmbG93Q29udGV4dCwKKwkJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpKTsKKwkJCQlGbG93SW5mbyBtZXJnZUluZm8gPQorCQkJCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZUluZm8pOworCQkJCXJldHVybiBtZXJnZUluZm87CisJCQl9CisJCX0KKworCQkvLyBzdG9yZSBhIGNvcHkgb2YgdGhlIG1lcmdlZCBpbmZvLCBzbyBhcyB0byBjb21wdXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzIGFmdGVyd2FyZHMKKwkJRmxvd0luZm8gdHJ1ZUluZm8gPSBmbG93SW5mby5pbml0c1doZW5UcnVlKCk7CisJCXRoZW5Jbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyh0cnVlSW5mbyk7CisJCUZsb3dJbmZvIGZhbHNlSW5mbyA9IGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCk7CisJCWVsc2VJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmYWxzZUluZm8pOworCisJCS8vIHByb3BhZ2F0ZSBhbmFseXNpcworCQl0cnVlSW5mbyA9IHZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHRydWVJbmZvLmNvcHkoKSk7CisJCWZhbHNlSW5mbyA9CisJCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmFsc2VJbmZvLmNvcHkoKSk7CisKKwkJLy8gbWVyZ2UgYmFjayB1c2luZyBhIGNvbmRpdGlvbmFsIGluZm8gLSAgMUdLMkJMTQorCQkvLyBpZiAoKHQgJiYgKHYgPSB0KSkgPyB0IDogdCAmJiAodiA9IGYpKSByID0gdjsgIC0tIG9rCisJCUZsb3dJbmZvIG1lcmdlZEluZm8gPQorCQkJRmxvd0luZm8uY29uZGl0aW9uYWwoCisJCQkJdHJ1ZUluZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKCAvLyBtdXN0IGNvcHksIHNpbmNlIGNvdWxkIGJlIHNoYXJlZCB3aXRoIHRydWVJbmZvLmluaXRzV2hlbkZhbHNlKCkuLi4KKwkJCQkJZmFsc2VJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkpLAorCQkJCXRydWVJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKKwkJCQkJZmFsc2VJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkpKTsKKwkJLyoJCQkKKwkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSB2YWx1ZUlmVHJ1ZS5hbmFseXNlQ29kZSgKKwkJCQljdXJyZW50U2NvcGUsCisJCQkJZmxvd0NvbnRleHQsCisJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKSkuCisJCQkJCXVuY29uZGl0aW9uYWxJbml0cygpLgorCQkJCQkJbWVyZ2VkV2l0aCgKKwkJCQkJCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoCisJCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQkJZmxvd0NvbnRleHQsCisJCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpKS4KKwkJCQkJCQkJCXVuY29uZGl0aW9uYWxJbml0cygpKTsKKwkJKi8KKwkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCXJldHVybiBtZXJnZWRJbmZvOworCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIGNvbmRpdGlvbmFsIG9wZXJhdG9yID86CisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisJKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCUxhYmVsIGVuZGlmTGFiZWwsIGZhbHNlTGFiZWw7CisJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQlyZXR1cm47CisJCX0KKwkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50OworCQlDb25zdGFudCBjb25kQ3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBuZWVkVHJ1ZVBhcnQgPQorCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQorCQkJCXx8ICgoY29uZENzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOworCQlib29sZWFuIG5lZWRGYWxzZVBhcnQgPQorCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpCisJCQkJfHwgKChjb25kQ3N0ICE9IE5vdEFDb25zdGFudCkgJiYgKGNvbmRDc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpKTsKKwkJZW5kaWZMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKworCQkvLyBHZW5lcmF0ZSBjb2RlIGZvciB0aGUgY29uZGl0aW9uCisJCWJvb2xlYW4gbmVlZENvbmRpdGlvblZhbHVlID0gKGNzdCA9PSBOb3RBQ29uc3RhbnQpICYmIChjb25kQ3N0ID09IE5vdEFDb25zdGFudCk7CisJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQljdXJyZW50U2NvcGUsCisJCQljb2RlU3RyZWFtLAorCQkJbnVsbCwKKwkJCShmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwKKwkJCW5lZWRDb25kaXRpb25WYWx1ZSk7CisKKwkJaWYgKHRoZW5Jbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCXRoZW5Jbml0U3RhdGVJbmRleCk7CisJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoZW5Jbml0U3RhdGVJbmRleCk7CisJCX0KKwkJLy8gVGhlbiBjb2RlIGdlbmVyYXRpb24KKwkJaWYgKG5lZWRUcnVlUGFydCkgeworCQkJdmFsdWVJZlRydWUuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQlpZiAobmVlZEZhbHNlUGFydCkgeworCQkJCS8vIEp1bXAgb3ZlciB0aGUgZWxzZSBwYXJ0CisJCQkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZGlmTGFiZWwpOworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOworCQkJCS8vIFR1bmUgY29kZXN0cmVhbSBzdGFjayBzaXplCisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKHJldHVyblR5cGVTbG90U2l6ZSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuZWVkRmFsc2VQYXJ0KSB7CisJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQlpZiAoZWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQl2YWx1ZUlmRmFsc2UuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkvLyBFbmQgb2YgaWYgc3RhdGVtZW50CisJCQllbmRpZkxhYmVsLnBsYWNlKCk7CisJCX0KKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQkvLyBpbXBsaWNpdCBjb252ZXJzaW9uCisJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCS8qKgorCSAqIE9wdGltaXplZCBib29sZWFuIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIGNvbmRpdGlvbmFsIG9wZXJhdG9yID86CisJKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaWYgKChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmIChjb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pIC8vIGNvbnN0YW50CisJCQl8fCAodmFsdWVJZlRydWUuaW1wbGljaXRDb252ZXJzaW9uID4+IDQpICE9IFRfYm9vbGVhbikgeyAvLyBub24gYm9vbGVhbiB2YWx1ZXMKKwkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50OworCQlDb25zdGFudCBjb25kQ3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBuZWVkVHJ1ZVBhcnQgPQorCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQorCQkJCXx8ICgoY29uZENzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOworCQlib29sZWFuIG5lZWRGYWxzZVBhcnQgPQorCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpCisJCQkJfHwgKChjb25kQ3N0ICE9IE5vdEFDb25zdGFudCkgJiYgKGNvbmRDc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpKTsKKworCQlMYWJlbCBpbnRlcm5hbEZhbHNlTGFiZWwsIGVuZGlmTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisKKwkJLy8gR2VuZXJhdGUgY29kZSBmb3IgdGhlIGNvbmRpdGlvbgorCQlib29sZWFuIG5lZWRDb25kaXRpb25WYWx1ZSA9IChjc3QgPT0gTm90QUNvbnN0YW50KSAmJiAoY29uZENzdCA9PSBOb3RBQ29uc3RhbnQpOworCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQljb2RlU3RyZWFtLAorCQkJCW51bGwsCisJCQkJaW50ZXJuYWxGYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pLAorCQkJCW5lZWRDb25kaXRpb25WYWx1ZSk7CisKKwkJaWYgKHRoZW5Jbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCXRoZW5Jbml0U3RhdGVJbmRleCk7CisJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRoZW5Jbml0U3RhdGVJbmRleCk7CisJCX0KKwkJLy8gVGhlbiBjb2RlIGdlbmVyYXRpb24KKwkJaWYgKG5lZWRUcnVlUGFydCkgeworCQkJdmFsdWVJZlRydWUuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQorCQkJaWYgKG5lZWRGYWxzZVBhcnQpIHsKKwkJCQkvLyBKdW1wIG92ZXIgdGhlIGVsc2UgcGFydAorCQkJCWludCBwb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRpZkxhYmVsKTsKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKHBvc2l0aW9uKTsKKwkJCQkvLyBUdW5lIGNvZGVzdHJlYW0gc3RhY2sgc2l6ZQorCQkJCS8vaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkvLwljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUocmV0dXJuVHlwZVNsb3RTaXplKTsKKwkJCQkvL30KKwkJCX0KKwkJfQorCQlpZiAobmVlZEZhbHNlUGFydCkgeworCQkJaW50ZXJuYWxGYWxzZUxhYmVsLnBsYWNlKCk7CisJCQlpZiAoZWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQl2YWx1ZUlmRmFsc2UuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKworCQkJLy8gRW5kIG9mIGlmIHN0YXRlbWVudAorCQkJZW5kaWZMYWJlbC5wbGFjZSgpOworCQl9CisJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQltZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCX0KKwkJLy8gbm8gaW1wbGljaXQgY29udmVyc2lvbiBmb3IgYm9vbGVhbiB2YWx1ZXMKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQkvLyBzcGVjcyBwLjM2OAorCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJVHlwZUJpbmRpbmcgY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgQm9vbGVhbkJpbmRpbmcpOworCQlUeXBlQmluZGluZyB2YWx1ZUlmVHJ1ZVR5cGUgPSB2YWx1ZUlmVHJ1ZS5yZXNvbHZlVHlwZShzY29wZSk7CisJCVR5cGVCaW5kaW5nIHZhbHVlSWZGYWxzZVR5cGUgPSB2YWx1ZUlmRmFsc2UucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoY29uZGl0aW9uVHlwZSA9PSBudWxsIHx8IHZhbHVlSWZUcnVlVHlwZSA9PSBudWxsIHx8IHZhbHVlSWZGYWxzZVR5cGUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCS8vIFByb3BhZ2F0ZSB0aGUgY29uc3RhbnQgdmFsdWUgZnJvbSB0aGUgdmFsdWVJZlRydWUgYW5kIHZhbHVlSUZGYWxzZSBleHByZXNzaW9uIGlmIGl0IGlzIHBvc3NpYmxlCisJCWlmIChjb25kaXRpb24uY29uc3RhbnQgIT0gTm90QUNvbnN0YW50CisJCQkmJiB2YWx1ZUlmVHJ1ZS5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQKKwkJCSYmIHZhbHVlSWZGYWxzZS5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCS8vIGFsbCB0ZXJtcyBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbiBzbyB3ZSBjYW4gcHJvcGFnYXRlIHRoZSBjb25zdGFudAorCQkJLy8gZnJvbSB2YWx1ZUlGVHJ1ZSBvciB2YWx1ZUlmRmFsc2UgdG8gdGVoIHJlY2VpdmVyIGNvbnN0YW50CisJCQljb25zdGFudCA9CisJCQkJKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSkKKwkJCQkJPyB2YWx1ZUlmVHJ1ZS5jb25zdGFudAorCQkJCQk6IHZhbHVlSWZGYWxzZS5jb25zdGFudDsKKwkJfQorCQlpZiAodmFsdWVJZlRydWVUeXBlID09IHZhbHVlSWZGYWxzZVR5cGUpIHsgLy8gaGFybWVkIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIAorCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRDb252ZXJzaW9uID0gdmFsdWVJZlRydWUuaW1wbGljaXRDb252ZXJzaW9uOworCQkJaWYgKHZhbHVlSWZUcnVlVHlwZSA9PSBMb25nQmluZGluZyB8fCB2YWx1ZUlmVHJ1ZVR5cGUgPT0gRG91YmxlQmluZGluZykgeworCQkJCXJldHVyblR5cGVTbG90U2l6ZSA9IDI7CisJCQl9CisJCQl0aGlzLnR5cGVCaW5kaW5nID0gdmFsdWVJZlRydWVUeXBlOworCQkJcmV0dXJuIHZhbHVlSWZUcnVlVHlwZTsKKwkJfQorCQkvLyBEZXRlcm1pbmUgdGhlIHJldHVybiB0eXBlIGRlcGVuZGluZyBvbiBhcmd1bWVudCB0eXBlcworCQkvLyBOdW1lcmljIHR5cGVzCisJCWlmICh2YWx1ZUlmVHJ1ZVR5cGUuaXNOdW1lcmljVHlwZSgpICYmIHZhbHVlSWZGYWxzZVR5cGUuaXNOdW1lcmljVHlwZSgpKSB7CisJCQkvLyAoU2hvcnQgeCBCeXRlKSBvciAoQnl0ZSB4IFNob3J0KSIKKwkJCWlmICgodmFsdWVJZlRydWVUeXBlID09IEJ5dGVCaW5kaW5nICYmIHZhbHVlSWZGYWxzZVR5cGUgPT0gU2hvcnRCaW5kaW5nKQorCQkJCXx8ICh2YWx1ZUlmVHJ1ZVR5cGUgPT0gU2hvcnRCaW5kaW5nICYmIHZhbHVlSWZGYWxzZVR5cGUgPT0gQnl0ZUJpbmRpbmcpKSB7CisJCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyhTaG9ydEJpbmRpbmcsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcoU2hvcnRCaW5kaW5nLCB2YWx1ZUlmRmFsc2VUeXBlKTsKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gU2hvcnRCaW5kaW5nOworCQkJCXJldHVybiBTaG9ydEJpbmRpbmc7CisJCQl9CisJCQkvLyA8Qnl0ZXxTaG9ydHxDaGFyPiB4IGNvbnN0YW50KEludCkgIC0tLT4gPEJ5dGV8U2hvcnR8Q2hhcj4gICBhbmQgcmVjaXByb2NhbGx5CisJCQlpZiAoKHZhbHVlSWZUcnVlVHlwZSA9PSBCeXRlQmluZGluZyB8fCB2YWx1ZUlmVHJ1ZVR5cGUgPT0gU2hvcnRCaW5kaW5nIHx8IHZhbHVlSWZUcnVlVHlwZSA9PSBDaGFyQmluZGluZykKKwkJCQkmJiAodmFsdWVJZkZhbHNlVHlwZSA9PSBJbnRCaW5kaW5nCisJCQkJCSYmIHZhbHVlSWZGYWxzZS5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKHZhbHVlSWZGYWxzZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSkpKSB7CisJCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcodmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKTsKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gdmFsdWVJZlRydWVUeXBlOworCQkJCXJldHVybiB2YWx1ZUlmVHJ1ZVR5cGU7CisJCQl9CisJCQlpZiAoKHZhbHVlSWZGYWxzZVR5cGUgPT0gQnl0ZUJpbmRpbmcKKwkJCQl8fCB2YWx1ZUlmRmFsc2VUeXBlID09IFNob3J0QmluZGluZworCQkJCXx8IHZhbHVlSWZGYWxzZVR5cGUgPT0gQ2hhckJpbmRpbmcpCisJCQkJJiYgKHZhbHVlSWZUcnVlVHlwZSA9PSBJbnRCaW5kaW5nCisJCQkJCSYmIHZhbHVlSWZUcnVlLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUodmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKSkpIHsKKwkJCQl2YWx1ZUlmVHJ1ZS5pbXBsaWNpdFdpZGVuaW5nKHZhbHVlSWZGYWxzZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcodmFsdWVJZkZhbHNlVHlwZSwgdmFsdWVJZkZhbHNlVHlwZSk7CisJCQkJdGhpcy50eXBlQmluZGluZyA9IHZhbHVlSWZGYWxzZVR5cGU7CisJCQkJcmV0dXJuIHZhbHVlSWZGYWxzZVR5cGU7CisJCQl9CisJCQkvLyBNYW51YWwgYmluYXJ5IG51bWVyaWMgcHJvbW90aW9uCisJCQkvLyBpbnQKKwkJCWlmIChCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZlRydWVUeXBlLmlkLCBUX2ludCkKKwkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9pbnQpKSB7CisJCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCB2YWx1ZUlmVHJ1ZVR5cGUpOworCQkJCXZhbHVlSWZGYWxzZS5pbXBsaWNpdFdpZGVuaW5nKEludEJpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBJbnRCaW5kaW5nOworCQkJCXJldHVybiBJbnRCaW5kaW5nOworCQkJfQorCQkJLy8gbG9uZworCQkJaWYgKEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyh2YWx1ZUlmVHJ1ZVR5cGUuaWQsIFRfbG9uZykKKwkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9sb25nKSkgeworCQkJCXZhbHVlSWZUcnVlLmltcGxpY2l0V2lkZW5pbmcoTG9uZ0JpbmRpbmcsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcoTG9uZ0JpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXJldHVyblR5cGVTbG90U2l6ZSA9IDI7CisJCQkJdGhpcy50eXBlQmluZGluZyA9IExvbmdCaW5kaW5nOworCQkJCXJldHVybiBMb25nQmluZGluZzsKKwkJCX0KKwkJCS8vIGZsb2F0CisJCQlpZiAoQmFzZVR5cGVCaW5kaW5nLmlzTmFycm93aW5nKHZhbHVlSWZUcnVlVHlwZS5pZCwgVF9mbG9hdCkKKwkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9mbG9hdCkpIHsKKwkJCQl2YWx1ZUlmVHJ1ZS5pbXBsaWNpdFdpZGVuaW5nKEZsb2F0QmluZGluZywgdmFsdWVJZlRydWVUeXBlKTsKKwkJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyhGbG9hdEJpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOworCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBGbG9hdEJpbmRpbmc7CisJCQkJcmV0dXJuIEZsb2F0QmluZGluZzsKKwkJCX0KKwkJCS8vIGRvdWJsZQorCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyhEb3VibGVCaW5kaW5nLCB2YWx1ZUlmVHJ1ZVR5cGUpOworCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcoRG91YmxlQmluZGluZywgdmFsdWVJZkZhbHNlVHlwZSk7CisJCQlyZXR1cm5UeXBlU2xvdFNpemUgPSAyOworCQkJdGhpcy50eXBlQmluZGluZyA9IERvdWJsZUJpbmRpbmc7CisJCQlyZXR1cm4gRG91YmxlQmluZGluZzsKKwkJfQorCQkvLyBUeXBlIHJlZmVyZW5jZXMgKG51bGwgbnVsbCBpcyBhbHJlYWR5IHRlc3RlZCkKKwkJaWYgKCh2YWx1ZUlmVHJ1ZVR5cGUuaXNCYXNlVHlwZSgpICYmIHZhbHVlSWZUcnVlVHlwZSAhPSBOdWxsQmluZGluZykKKwkJCXx8ICh2YWx1ZUlmRmFsc2VUeXBlLmlzQmFzZVR5cGUoKSAmJiB2YWx1ZUlmRmFsc2VUeXBlICE9IE51bGxCaW5kaW5nKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29uZGl0aW9uYWxBcmd1bWVudHNJbmNvbXBhdGlibGVUeXBlcygKKwkJCQl0aGlzLAorCQkJCXZhbHVlSWZUcnVlVHlwZSwKKwkJCQl2YWx1ZUlmRmFsc2VUeXBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUodmFsdWVJZkZhbHNlVHlwZSwgdmFsdWVJZlRydWVUeXBlKSkgeworCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZGYWxzZVR5cGUpOworCQkJdGhpcy50eXBlQmluZGluZyA9IHZhbHVlSWZUcnVlVHlwZTsKKwkJCXJldHVybiB2YWx1ZUlmVHJ1ZVR5cGU7CisJCX0KKwkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZSh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZGYWxzZVR5cGUpKSB7CisJCQl2YWx1ZUlmVHJ1ZS5pbXBsaWNpdFdpZGVuaW5nKHZhbHVlSWZGYWxzZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CisJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmRmFsc2VUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKTsKKwkJCXRoaXMudHlwZUJpbmRpbmcgPSB2YWx1ZUlmRmFsc2VUeXBlOworCQkJcmV0dXJuIHZhbHVlSWZGYWxzZVR5cGU7CisJCX0KKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29uZGl0aW9uYWxBcmd1bWVudHNJbmNvbXBhdGlibGVUeXBlcygKKwkJCXRoaXMsCisJCQl2YWx1ZUlmVHJ1ZVR5cGUsCisJCQl2YWx1ZUlmRmFsc2VUeXBlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgPyAiICsgLy8kTk9OLU5MUy0xJAorCQl2YWx1ZUlmVHJ1ZS50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgOiAiICsgLy8kTk9OLU5MUy0xJAorCQl2YWx1ZUlmRmFsc2UudG9TdHJpbmdFeHByZXNzaW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWNvbmRpdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl2YWx1ZUlmVHJ1ZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl2YWx1ZUlmRmFsc2UudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKKworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHsKKworCXB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGw7CisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gQ29uc3RhbnRQb29sTmFtZSA9ICI8aW5pdD4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOworCisJcHVibGljIGludCByZWZlcmVuY2VDb3VudCA9IDA7CisJLy8gY291bnQgaG93IG1hbnkgdGltZXMgdGhpcyBjb25zdHJ1Y3RvciBpcyByZWZlcmVuY2VkIGZyb20gb3RoZXIgbG9jYWwgY29uc3RydWN0b3JzCisKKwlwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CisJCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwl9CisJCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoCisJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSwKKwkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKKwkJCXJldHVybjsKKwkJdHJ5IHsKKwkJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgY29uc3RydWN0b3JDb250ZXh0ID0KKwkJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKKwkJCQkJaW5pdGlhbGl6ZXJGbG93Q29udGV4dC5wYXJlbnQsCisJCQkJCXRoaXMsCisJCQkJCWJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywKKwkJCQkJc2NvcGUsCisJCQkJCUZsb3dJbmZvLkRlYWRFbmQpOworCQkJaW5pdGlhbGl6ZXJGbG93Q29udGV4dC5jaGVja0luaXRpYWxpemVyRXhjZXB0aW9ucygKKwkJCQlzY29wZSwKKwkJCQljb25zdHJ1Y3RvckNvbnRleHQsCisJCQkJZmxvd0luZm8pOworCisJCQkvLyBhbm9ueW1vdXMgY29uc3RydWN0b3IgY2FuIGdhaW4gZXh0cmEgdGhyb3duIGV4Y2VwdGlvbnMgZnJvbSB1bmhhbmRsZWQgb25lcworCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQlBcnJheUxpc3QgY29tcHV0ZWRFeGNlcHRpb25zID0gY29uc3RydWN0b3JDb250ZXh0LmV4dGVuZGVkRXhjZXB0aW9uczsKKwkJCQlpZiAoY29tcHV0ZWRFeGNlcHRpb25zICE9IG51bGwpeworCQkJCQlpbnQgc2l6ZTsKKwkJCQkJaWYgKChzaXplID0gY29tcHV0ZWRFeGNlcHRpb25zLnNpemUoKSkgPiAwKXsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBhY3R1YWxseVRocm93bkV4Y2VwdGlvbnM7CisJCQkJCQljb21wdXRlZEV4Y2VwdGlvbnMudG9BcnJheShhY3R1YWxseVRocm93bkV4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXSk7CisJCQkJCQliaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMgPSBhY3R1YWxseVRocm93bkV4Y2VwdGlvbnM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIHByb3BhZ2F0ZSB0byBjb25zdHJ1Y3RvciBjYWxsCisJCQlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKKwkJCQkvLyBpZiBjYWxsaW5nICd0aGlzKC4uLiknLCB0aGVuIGZsYWcgYWxsIG5vbi1zdGF0aWMgZmllbGRzIGFzIGRlZmluaXRlbHkKKwkJCQkvLyBzZXQgc2luY2UgdGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgc2V0IGluc2lkZSBvdGhlciBsb2NhbCBjb25zdHJ1Y3RvcgorCQkJCWlmIChjb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSA9PSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSB7CisJCQkJCUZpZWxkQmluZGluZ1tdIGZpZWxkcyA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZmllbGRzKCk7CisJCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCQlGaWVsZEJpbmRpbmcgZmllbGQ7CisJCQkJCQlpZiAoIShmaWVsZCA9IGZpZWxkc1tpXSkuaXNTdGF0aWMoKSkgeworCQkJCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJZmxvd0luZm8gPSBjb25zdHJ1Y3RvckNhbGwuYW5hbHlzZUNvZGUoc2NvcGUsIGNvbnN0cnVjdG9yQ29udGV4dCwgZmxvd0luZm8pOworCQkJfQorCQkJLy8gcHJvcGFnYXRlIHRvIHN0YXRlbWVudHMKKwkJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJU3RhdGVtZW50IHN0YXQ7CisJCQkJCWlmICghZmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKChzdGF0ID0gc3RhdGVtZW50c1tpXSksIHNjb3BlKSkgeworCQkJCQkJZmxvd0luZm8gPSBzdGF0LmFuYWx5c2VDb2RlKHNjb3BlLCBjb25zdHJ1Y3RvckNvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIGNoZWNrIGZvciBtaXNzaW5nIHJldHVybmluZyBwYXRoCisJCQluZWVkRnJlZVJldHVybiA9CisJCQkJISgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpOworCisJCQkvLyBjaGVjayBtaXNzaW5nIGJsYW5rIGZpbmFsIGZpZWxkIGluaXRpYWxpemF0aW9ucworCQkJaWYgKChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkKKwkJCQkmJiAoY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUgIT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcykpIHsKKwkJCQlmbG93SW5mbyA9IGZsb3dJbmZvLm1lcmdlZFdpdGgoaW5pdGlhbGl6ZXJGbG93Q29udGV4dC5pbml0c09uUmV0dXJuKTsKKwkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmZpZWxkcygpOworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCUZpZWxkQmluZGluZyBmaWVsZDsKKwkJCQkJaWYgKCghKGZpZWxkID0gZmllbGRzW2ldKS5pc1N0YXRpYygpKQorCQkJCQkJJiYgZmllbGQuaXNGaW5hbCgpCisJCQkJCQkmJiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkc1tpXSkpKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKAorCQkJCQkJCWZpZWxkLAorCQkJCQkJCWlzRGVmYXVsdENvbnN0cnVjdG9yID8gKEFzdE5vZGUpIHNjb3BlLnJlZmVyZW5jZVR5cGUoKSA6IHRoaXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlKSB7CisJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qKgorCSAqIEJ5dGVjb2RlIGdlbmVyYXRpb24gZm9yIGEgY29uc3RydWN0b3IKKwkgKgorCSAqIEBwYXJhbSBjbGFzc1Njb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZQorCSAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCQlpbnQgcHJvYmxlbVJlc2V0UEMgPSAwOworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJCWlmICh0aGlzLmJpbmRpbmcgPT0gbnVsbCkKKwkJCQlyZXR1cm47IC8vIEhhbmRsZSBtZXRob2RzIHdpdGggaW52YWxpZCBzaWduYXR1cmUgb3IgZHVwbGljYXRlcworCQkJaW50IHByb2JsZW1zTGVuZ3RoOworCQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9CisJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOworCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1Db25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nLCBwcm9ibGVtc0NvcHkpOworCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQlwcm9ibGVtUmVzZXRQQyA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwkJCXRoaXMuaW50ZXJuYWxHZW5lcmF0ZUNvZGUoY2xhc3NTY29wZSwgY2xhc3NGaWxlKTsKKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJaWYgKGUuY29tcGlsYXRpb25SZXN1bHQgPT0gQ29kZVN0cmVhbS5SRVNUQVJUX0lOX1dJREVfTU9ERSkgeworCQkJCS8vIGEgYnJhbmNoIHRhcmdldCByZXF1aXJlZCBhIGdvdG9fdywgcmVzdGFydCBjb2RlIGdlbiBpbiB3aWRlIG1vZGUuCisJCQkJdHJ5IHsKKwkJCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCisJCQkJCQkJc3RhdGVtZW50c1tpXS5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJCQkJfQorCQkJCQljbGFzc0ZpbGUuY29udGVudHNPZmZzZXQgPSBwcm9ibGVtUmVzZXRQQzsKKwkJCQkJY2xhc3NGaWxlLm1ldGhvZENvdW50LS07CisJCQkJCWNsYXNzRmlsZS5jb2RlU3RyZWFtLndpZGVNb2RlID0gdHJ1ZTsgLy8gcmVxdWVzdCB3aWRlIG1vZGUgCisJCQkJCXRoaXMuaW50ZXJuYWxHZW5lcmF0ZUNvZGUoY2xhc3NTY29wZSwgY2xhc3NGaWxlKTsgLy8gcmVzdGFydCBtZXRob2QgZ2VuZXJhdGlvbgorCQkJCX0gY2F0Y2ggKEFib3J0TWV0aG9kIGUyKSB7CisJCQkJCWludCBwcm9ibGVtc0xlbmd0aDsKKwkJCQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9CisJCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCQlJUHJvYmxlbVtdIHByb2JsZW1zQ29weSA9IG5ldyBJUHJvYmxlbVtwcm9ibGVtc0xlbmd0aCA9IHByb2JsZW1zLmxlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOworCQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbUNvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IHByb2JsZW1zTGVuZ3RoOworCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPQorCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKKwkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbUNvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGludGVybmFsR2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCQljbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvSGVhZGVyKGJpbmRpbmcpOworCQlpbnQgbWV0aG9kQXR0cmlidXRlT2Zmc2V0ID0gY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0OworCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gY2xhc3NGaWxlLmdlbmVyYXRlTWV0aG9kSW5mb0F0dHJpYnV0ZShiaW5kaW5nKTsKKwkJaWYgKCghYmluZGluZy5pc05hdGl2ZSgpKSAmJiAoIWJpbmRpbmcuaXNBYnN0cmFjdCgpKSkgeworCQkJVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQlpbnQgY29kZUF0dHJpYnV0ZU9mZnNldCA9IGNsYXNzRmlsZS5jb250ZW50c09mZnNldDsKKwkJCWNsYXNzRmlsZS5nZW5lcmF0ZUNvZGVBdHRyaWJ1dGVIZWFkZXIoKTsKKwkJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSA9IGNsYXNzRmlsZS5jb2RlU3RyZWFtOworCQkJY29kZVN0cmVhbS5yZXNldCh0aGlzLCBjbGFzc0ZpbGUpOworCQkJLy8gaW5pdGlhbGl6ZSBsb2NhbCBwb3NpdGlvbnMgLSBpbmNsdWRpbmcgaW5pdGlhbGl6ZXIgc2NvcGUuCisJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCWludCBhcmdTaXplID0gMDsKKwkJCXNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKC8vIGNvbnNpZGVyIHN5bnRoZXRpYyBhcmd1bWVudHMgaWYgYW55CisJCQlhcmdTaXplID0KKwkJCQlkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKQorCQkJCQk/ICgoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzKS5zeW50aGV0aWNBcmd1bWVudHNPZmZzZXQKKwkJCQkJOiAxLAorCQkJCWNvZGVTdHJlYW0pOworCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkvLyBhcmd1bWVudHMgaW5pdGlhbGl6YXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKKwkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgYXJnQmluZGluZzsKKwkJCQkJY29kZVN0cmVhbS5hZGRWaXNpYmxlTG9jYWxWYXJpYWJsZShhcmdCaW5kaW5nID0gYXJndW1lbnRzW2ldLmJpbmRpbmcpOworCQkJCQlhcmdCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQygwKTsKKwkJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZTsKKwkJCQkJaWYgKChhcmdUeXBlID0gYXJnQmluZGluZy50eXBlKSA9PSBMb25nQmluZGluZyB8fCAoYXJnVHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJYXJnU2l6ZSArPSAyOworCQkJCQl9IGVsc2UgeworCQkJCQkJYXJnU2l6ZSsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJTWV0aG9kU2NvcGUgaW5pdGlhbGl6ZXJTY29wZSA9IGRlY2xhcmluZ1R5cGUuaW5pdGlhbGl6ZXJTY29wZTsKKwkJCWluaXRpYWxpemVyU2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoYXJnU2l6ZSwgY29kZVN0cmVhbSk7CisJCQkvLyBvZmZzZXQgYnkgdGhlIGFyZ3VtZW50IHNpemUgKHNpbmNlIG5vdCBsaW5rZWQgdG8gbWV0aG9kIHNjb3BlKQorCisJCQkvLyBnZW5lcmF0ZSBjb25zdHJ1Y3RvciBjYWxsCisJCQlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKKwkJCQljb25zdHJ1Y3RvckNhbGwuZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCX0KKwkJCS8vIGdlbmVyYXRlIGZpZWxkIGluaXRpYWxpemF0aW9uIC0gb25seSBpZiBub3QgaW52b2tpbmcgYW5vdGhlciBjb25zdHJ1Y3RvciBjYWxsIG9mIHRoZSBzYW1lIGNsYXNzCisJCQlpZiAoKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKQorCQkJCSYmIChjb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSkgeworCQkJCS8vIGdlbmVyYXRlIHN5bnRoZXRpYyBmaWVsZHMgaW5pdGlhbGl6YXRpb24KKwkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCQkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7CisJCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3MgPQorCQkJCQkJbmVzdGVkVHlwZS5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3MgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNBcmdzLmxlbmd0aDsKKwkJCQkJCWkgPCBtYXg7CisJCQkJCQlpKyspIHsKKwkJCQkJCWlmIChzeW50aGV0aWNBcmdzW2ldLm1hdGNoaW5nRmllbGQgIT0gbnVsbCkgeworCQkJCQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCQkJCQkJCWNvZGVTdHJlYW0ubG9hZChzeW50aGV0aWNBcmdzW2ldKTsKKwkJCQkJCQljb2RlU3RyZWFtLnB1dGZpZWxkKHN5bnRoZXRpY0FyZ3NbaV0ubWF0Y2hpbmdGaWVsZCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJc3ludGhldGljQXJncyA9IG5lc3RlZFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJncyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3MubGVuZ3RoOworCQkJCQkJaSA8IG1heDsKKwkJCQkJCWkrKykgeworCQkJCQkJaWYgKHN5bnRoZXRpY0FyZ3NbaV0ubWF0Y2hpbmdGaWVsZCAhPSBudWxsKSB7CisJCQkJCQkJY29kZVN0cmVhbS5hbG9hZF8wKCk7CisJCQkJCQkJY29kZVN0cmVhbS5sb2FkKHN5bnRoZXRpY0FyZ3NbaV0pOworCQkJCQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoc3ludGhldGljQXJnc1tpXS5tYXRjaGluZ0ZpZWxkKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBnZW5lcmF0ZSB1c2VyIGZpZWxkIGluaXRpYWxpemF0aW9uCisJCQkJaWYgKGRlY2xhcmluZ1R5cGUuZmllbGRzICE9IG51bGwpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlY2xhcmluZ1R5cGUuZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbDsKKwkJCQkJCWlmICghKGZpZWxkRGVjbCA9IGRlY2xhcmluZ1R5cGUuZmllbGRzW2ldKS5pc1N0YXRpYygpKSB7CisJCQkJCQkJZmllbGREZWNsLmdlbmVyYXRlQ29kZShpbml0aWFsaXplclNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIGdlbmVyYXRlIHN0YXRlbWVudHMKKwkJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlzdGF0ZW1lbnRzW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQkJfQorCQkJfQorCQkJaWYgKG5lZWRGcmVlUmV0dXJuKSB7CisJCQkJY29kZVN0cmVhbS5yZXR1cm5fKCk7CisJCQl9CisJCQkvLyBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUoc2NvcGUpOworCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKDAsIHRoaXMuYm9keUVuZCk7CisJCQljbGFzc0ZpbGUuY29tcGxldGVDb2RlQXR0cmlidXRlKGNvZGVBdHRyaWJ1dGVPZmZzZXQpOworCQkJYXR0cmlidXRlTnVtYmVyKys7CisJCX0KKwkJY2xhc3NGaWxlLmNvbXBsZXRlTWV0aG9kSW5mbyhtZXRob2RBdHRyaWJ1dGVPZmZzZXQsIGF0dHJpYnV0ZU51bWJlcik7CisKKwkJLy8gaWYgYSBwcm9ibGVtIGdvdCByZXBvcnRlZCBkdXJpbmcgY29kZSBnZW4sIHRoZW4gdHJpZ2dlciBwcm9ibGVtIG1ldGhvZCBjcmVhdGlvbgorCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENvbnN0cnVjdG9yKCkgeworCisJCXJldHVybiBpc0RlZmF1bHRDb25zdHJ1Y3RvcjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemF0aW9uTWV0aG9kKCkgeworCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cyhQYXJzZXIgcGFyc2VyLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisKKwkJLy9maWxsIHVwIHRoZSBjb25zdHJ1Y3RvciBib2R5IHdpdGggaXRzIHN0YXRlbWVudHMKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQlpZiAoaXNEZWZhdWx0Q29uc3RydWN0b3IpeworCQkJY29uc3RydWN0b3JDYWxsID0KKwkJCQluZXcgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7CisJCQljb25zdHJ1Y3RvckNhbGwuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7IAorCQkJcmV0dXJuOworCQl9CisJCXBhcnNlci5wYXJzZSh0aGlzLCB1bml0KTsKKworCX0KKworCS8qCisJICogVHlwZSBjaGVja2luZyBmb3IgY29uc3RydWN0b3IsIGp1c3QgYW5vdGhlciBtZXRob2QsIGV4Y2VwdCBmb3Igc3BlY2lhbCBjaGVjaworCSAqIGZvciByZWN1cnNpdmUgY29uc3RydWN0b3IgaW52b2NhdGlvbnMuCisJICovCisJcHVibGljIHZvaWQgcmVzb2x2ZVN0YXRlbWVudHMoQ2xhc3NTY29wZSB1cHBlclNjb3BlKSB7CisvKgorCQkvLyBjaGVja2luZyBmb3IgcmVjdXJzaXZlIGNvbnN0cnVjdG9yIGNhbGwgKHByb3RlY3Rpb24pCisJCWlmICghaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gJiYgY29uc3RydWN0b3JDYWxsID09IG51bGwpeworCQkJY29uc3RydWN0b3JDYWxsID0gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOworCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7CisJCQljb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gc291cmNlRW5kOworCQl9CisqLworCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5zb3VyY2VOYW1lLCBzZWxlY3RvcikpeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWlzc2luZ1JldHVyblR5cGUodGhpcyk7CisJCX0KKworCQkvLyBpZiBudWxsID09PiBhbiBlcnJvciBoYXMgb2NjdXJzIGF0IHBhcnNpbmcgdGltZSAuLi4uCisJCWlmIChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgeworCQkJLy8gZS5nLiB1c2luZyBzdXBlcigpIGluIGphdmEubGFuZy5PYmplY3QKKwkJCWlmIChiaW5kaW5nICE9IG51bGwKKwkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkID09IFRfT2JqZWN0CisJCQkJJiYgY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUgIT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcykgeworCQkJCQlpZiAoY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdChjb25zdHJ1Y3RvckNhbGwpOworCQkJCQl9CisJCQkJCWNvbnN0cnVjdG9yQ2FsbCA9IG51bGw7CisJCQl9IGVsc2UgeworCQkJCWNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKHNjb3BlKTsKKwkJCX0KKwkJfQorCQkKKwkJc3VwZXIucmVzb2x2ZVN0YXRlbWVudHModXBwZXJTY29wZSk7CisKKwkJLy8gaW5kaXJlY3QgcmVmZXJlbmNlOiBpbmNyZW1lbnQgdGFyZ2V0IGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBjb3VudAorCQlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwpeworCQkJaWYgKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nICE9IG51bGwKKwkJCQkmJiAhY29uc3RydWN0b3JDYWxsLmlzU3VwZXJBY2Nlc3MoKQorCQkJCSYmIGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pCisJCQkJCQkodXBwZXJTY29wZS5yZWZlcmVuY2VDb250ZXh0LmRlY2xhcmF0aW9uT2YoY29uc3RydWN0b3JDYWxsLmJpbmRpbmcpKSkucmVmZXJlbmNlQ291bnQrKzsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdTdGF0ZW1lbnRzKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9ICIgeyI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKSB7CisJCQlzID0gcyArICJcbiIgKyBjb25zdHJ1Y3RvckNhbGwudG9TdHJpbmcodGFiKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJcyA9IHMgKyAiXG4iICsgc3RhdGVtZW50c1tpXS50b1N0cmluZyh0YWIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKCEoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIEJsb2NrKSkgeworCQkJCQlzICs9ICI7IjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJfQorCQlzICs9ICJcbiIgKyB0YWJTdHJpbmcodGFiID09IDAgPyAwIDogdGFiIC0gMSkgKyAifSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpKSB7CisJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlpbnQgYXJndW1lbnRMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRMZW5ndGg7IGkrKykKKwkJCQkJYXJndW1lbnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCX0KKwkJCWlmICh0aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKKwkJCQlpbnQgdGhyb3duRXhjZXB0aW9uc0xlbmd0aCA9IHRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9uc0xlbmd0aDsgaSsrKQorCQkJCQl0aHJvd25FeGNlcHRpb25zW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCX0KKwkJCWlmIChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkKKwkJCQljb25zdHJ1Y3RvckNhbGwudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJCXN0YXRlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgY2xhc3NTY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTVlODJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db250aW51ZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgQ29udGludWUgZXh0ZW5kcyBCcmFuY2hTdGF0ZW1lbnQgeworCisJcHVibGljIENvbnRpbnVlKGNoYXJbXSBsLCBpbnQgcywgaW50IGUpIHsKKwkJCisJCXN1cGVyKGwsIHMsIGUpOworCX0KKwkKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBoZXJlIHJlcXVpcmVzIHRvIGdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YgZmluYWxseSBibG9ja3MgaW52b2NhdGlvbnMgZGVwZW5kaW5nIGNvcnJlc3BvbmRpbmcKKwkJLy8gdG8gZWFjaCBvZiB0aGUgdHJhdmVyc2VkIHRyeSBzdGF0ZW1lbnRzLCBzbyB0aGF0IGV4ZWN1dGlvbiB3aWxsIHRlcm1pbmF0ZSBwcm9wZXJseS4KKworCQkvLyBsb29rdXAgdGhlIGxhYmVsLCB0aGlzIHNob3VsZCBhbnN3ZXIgdGhlIHJldHVybkNvbnRleHQKKwkJRmxvd0NvbnRleHQgdGFyZ2V0Q29udGV4dDsKKwkJaWYgKGxhYmVsID09IG51bGwpIHsKKwkJCXRhcmdldENvbnRleHQgPSBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdENvbnRpbnVlKCk7CisJCX0gZWxzZSB7CisJCQl0YXJnZXRDb250ZXh0ID0gZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckNvbnRpbnVlTGFiZWwobGFiZWwpOworCQl9CisJCWlmICh0YXJnZXRDb250ZXh0ID09IG51bGwpIHsKKwkJCWlmIChsYWJlbCA9PSBudWxsKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb250aW51ZSh0aGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOyAvLyBuZWVkIHRvIGltcHJvdmUKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0YXJnZXRDb250ZXh0ID09IEZsb3dDb250ZXh0Lk5vdENvbnRpbnVhYmxlQ29udGV4dCkgeworCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29udGludWUodGhpcyk7CisJCQkJcmV0dXJuIEZsb3dJbmZvLkRlYWRFbmQ7CisJCQl9CisJCQl0YXJnZXRMYWJlbCA9IHRhcmdldENvbnRleHQuY29udGludWVMYWJlbCgpOworCQkJdGFyZ2V0Q29udGV4dC5yZWNvcmRDb250aW51ZUZyb20oZmxvd0luZm8pOworCQkJRmxvd0NvbnRleHQgdHJhdmVyc2VkQ29udGV4dCA9IGZsb3dDb250ZXh0OworCQkJaW50IHN1YkluZGV4ID0gMCwgbWF4U3ViID0gNTsKKwkJCXN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbbWF4U3ViXTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJQXN0Tm9kZSBzdWI7CisJCQkJaWYgKChzdWIgPSB0cmF2ZXJzZWRDb250ZXh0LnN1YlJvdXRpbmUoKSkgIT0gbnVsbCkgeworCQkJCQlpZiAoc3ViSW5kZXggPT0gbWF4U3ViKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCXN1YnJvdXRpbmVzLAorCQkJCQkJCTAsCisJCQkJCQkJKHN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbbWF4U3ViICo9IDJdKSwKKwkJCQkJCQkwLAorCQkJCQkJCXN1YkluZGV4KTsKKwkJCQkJCS8vIGdyb3cKKwkJCQkJfQorCQkJCQlzdWJyb3V0aW5lc1tzdWJJbmRleCsrXSA9IHN1YjsKKwkJCQkJaWYgKHN1Yi5jYW5ub3RSZXR1cm4oKSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmVtZW1iZXIgdGhlIGluaXRpYWxpemF0aW9uIGF0IHRoaXMKKwkJCQkvLyBwb2ludCBmb3IgZGVhbGluZyB3aXRoIGJsYW5rIGZpbmFsIHZhcmlhYmxlcy4KKwkJCQl0cmF2ZXJzZWRDb250ZXh0LnJlY29yZFJldHVybkZyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworCisJCQkJaWYgKHRyYXZlcnNlZENvbnRleHQgPT0gdGFyZ2V0Q29udGV4dCkgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQl0cmF2ZXJzZWRDb250ZXh0ID0gdHJhdmVyc2VkQ29udGV4dC5wYXJlbnQ7CisJCQkJfQorCQkJfQorCQkJLy8gcmVzaXplIHN1YnJvdXRpbmVzCisJCQlpZiAoc3ViSW5kZXggIT0gbWF4U3ViKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc3Vicm91dGluZXMsCisJCQkJCTAsCisJCQkJCShzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW3N1YkluZGV4XSksCisJCQkJCTAsCisJCQkJCXN1YkluZGV4KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlzID0gcyArICJjb250aW51ZSAiOyAvLyROT04tTkxTLTEkCisJCWlmIChsYWJlbCAhPSBudWxsKQorCQkJcyA9IHMgKyBuZXcgU3RyaW5nKGxhYmVsKTsKKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCisJCXZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRGVmYXVsdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRGVmYXVsdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc5ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9EZWZhdWx0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdENhc2UgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHVibGljIENhc2VMYWJlbCB0YXJnZXRMYWJlbDsKKwkvKioKKwkgKiBEZWZhdXRDYXNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIERlZmF1bHRDYXNlKGludCBzb3VyY2VFbmQsIGludCBzb3VyY2VTdGFydCkgeworCisJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJcmV0dXJuIGZsb3dJbmZvOworCX0KKworCS8qKgorCSAqIERlZmF1bHQgY2FzZSBjb2RlIGdlbmVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJdGFyZ2V0TGFiZWwucGxhY2UoKTsKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKworCX0KKwlwdWJsaWMgQ29uc3RhbnQgcmVzb2x2ZUNhc2UoCisJCUJsb2NrU2NvcGUgc2NvcGUsCisJCVR5cGVCaW5kaW5nIHRlc3RUeXBlLAorCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CisKKwkJLy8gcmVtZW1iZXIgdGhlIGRlZmF1bHQgY2FzZSBpbnRvIHRoZSBhc3NvY2lhdGVkIHN3aXRjaCBzdGF0ZW1lbnQKKwkJaWYgKHN3aXRjaFN0YXRlbWVudC5kZWZhdWx0Q2FzZSAhPSBudWxsKQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRGVmYXVsdENhc2UodGhpcyk7CisKKwkJLy8gb24gZXJyb3IgdGhlIGxhc3QgZGVmYXVsdCB3aWxsIGJlIHRoZSBzZWxlY3RlZCBvbmUgLi4uLiAod2h5IG5vdCkgLi4uLgkKKwkJc3dpdGNoU3RhdGVtZW50LmRlZmF1bHRDYXNlID0gdGhpczsKKwkJcmVzb2x2ZShzY29wZSk7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgPSBzICsgImRlZmF1bHQgOiAiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliMmZjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG9TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBEb1N0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb247CisJcHVibGljIFN0YXRlbWVudCBhY3Rpb247CisKKwlwcml2YXRlIExhYmVsIGJyZWFrTGFiZWwsIGNvbnRpbnVlTGFiZWw7CisKKwkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMKKwlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKKworCXB1YmxpYyBEb1N0YXRlbWVudChFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGFjdGlvbiwgaW50IHMsIGludCBlKSB7CisKKwkJdGhpcy5zb3VyY2VTdGFydCA9IHM7CisJCXRoaXMuc291cmNlRW5kID0gZTsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCWJyZWFrTGFiZWwgPSBuZXcgTGFiZWwoKTsKKwkJY29udGludWVMYWJlbCA9IG5ldyBMYWJlbCgpOworCQlMb29waW5nRmxvd0NvbnRleHQgbG9vcGluZ0NvbnRleHQgPQorCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dCgKKwkJCQlmbG93Q29udGV4dCwKKwkJCQl0aGlzLAorCQkJCWJyZWFrTGFiZWwsCisJCQkJY29udGludWVMYWJlbCwKKwkJCQljdXJyZW50U2NvcGUpOworCisJCUNvbnN0YW50IGNvbmRpdGlvbkNvbnN0YW50ID0gY29uZGl0aW9uLmNvbnN0YW50OworCQlDb25zdGFudCBjb25kaXRpb25hbENvbnN0YW50ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBpc0ZhbHNlQ29uZGl0aW9uID0KKwkJCSgoY29uZGl0aW9uQ29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQorCQkJCSYmIChjb25kaXRpb25Db25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkpCisJCQkJfHwgKChjb25kaXRpb25hbENvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJCQkJJiYgKGNvbmRpdGlvbmFsQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKTsKKworCQlpZiAoKGFjdGlvbiAhPSBudWxsKSAmJiAhYWN0aW9uLmlzRW1wdHlCbG9jaygpKSB7CisJCQlmbG93SW5mbyA9IGFjdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGxvb3BpbmdDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOworCisJCQkvLyBjb2RlIGdlbmVyYXRpb24gY2FuIGJlIG9wdGltaXplZCB3aGVuIG5vIG5lZWQgdG8gY29udGludWUgaW4gdGhlIGxvb3AKKwkJCWlmICgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpIHsKKwkJCQlpZiAoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZSA9PSBGbG93SW5mby5EZWFkRW5kKQorCQkJCQl8fCBsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUuaXNGYWtlUmVhY2hhYmxlKCkpIHsKKwkJCQkJY29udGludWVMYWJlbCA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmxvd0luZm8gPSBsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWU7IC8vIGZvciBjb25kaXRpb24KKwkJCQkJaWYgKGlzRmFsc2VDb25kaXRpb24pIHsKKwkJCQkJCS8vCWNvbnRpbnVlTGFiZWwgPSBudWxsOyAtIGNhbm5vdCBuaWwgdGhlIGxhYmVsIHNpbmNlIG1heSBiZSB0YXJnZXRlZCBhbHJlYWR5IGJ5ICdjb250aW51ZScgc3RhdGVtZW50cworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3AoY3VycmVudFNjb3BlLCBmbG93SW5mbyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChpc0ZhbHNlQ29uZGl0aW9uKSB7CisJCQkJCS8vCWNvbnRpbnVlTGFiZWwgPSBudWxsOyAtIGNhbm5vdCBuaWwgdGhlIGxhYmVsIHNpbmNlIG1heSBiZSB0YXJnZXRlZCBhbHJlYWR5IGJ5ICdjb250aW51ZScgc3RhdGVtZW50cworCQkJCX0gZWxzZSB7CisJCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOworCQkJCX0KKwkJCX0KKwkJfQorCQlMb29waW5nRmxvd0NvbnRleHQgY29uZExvb3BDb250ZXh0OworCQlmbG93SW5mbyA9CisJCQljb25kaXRpb24uYW5hbHlzZUNvZGUoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCShjb25kTG9vcENvbnRleHQgPQorCQkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCB0aGlzLCBudWxsLCBudWxsLCBjdXJyZW50U2NvcGUpKSwKKwkJCQkoYWN0aW9uID09IG51bGwKKwkJCQkJPyBmbG93SW5mbworCQkJCQk6IChmbG93SW5mby5tZXJnZWRXaXRoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZSkpKSk7CisJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChjdXJyZW50U2NvcGUsIGZsb3dJbmZvKTsKKworCQkvLyBpbmZpbml0ZSBsb29wCisJCUZsb3dJbmZvIG1lcmdlZEluZm87CisJCWlmICgoY29uZGl0aW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJCSYmIChjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpIHsKKwkJCW1lcmdlZEluZm8gPSBsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWs7CisJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwkJfQorCisJCS8vIGVuZCBvZiBsb29wOiBlaXRoZXIgY29uZGl0aW9uIGZhbHNlIG9yIGJyZWFrCisJCW1lcmdlZEluZm8gPQorCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKAorCQkJCWxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhayk7CisJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwl9CisKKwkvKioKKwkgKiBEbyBzdGF0ZW1lbnQgY29kZSBnZW5lcmF0aW9uCisJICoKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisKKwkJLy8gbGFiZWxzIG1hbmFnZW1lbnQKKwkJTGFiZWwgYWN0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCWFjdGlvbkxhYmVsLnBsYWNlKCk7CisJCWJyZWFrTGFiZWwuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CisJCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKKwkJCWNvbnRpbnVlTGFiZWwuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CisJCX0KKworCQkvLyBnZW5lcmF0ZSBhY3Rpb24KKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQlhY3Rpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCX0KKwkJLy8gZ2VuZXJhdGUgY29uZGl0aW9uCisJCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKKwkJCWNvbnRpbnVlTGFiZWwucGxhY2UoKTsKKwkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWNvZGVTdHJlYW0sCisJCQkJYWN0aW9uTGFiZWwsCisJCQkJbnVsbCwKKwkJCQl0cnVlKTsKKwkJfQorCQlicmVha0xhYmVsLnBsYWNlKCk7CisKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCisJfQorCisJcHVibGljIHZvaWQgcmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCkgeworCisJCXRoaXMuYnJlYWtMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJdGhpcy5jb250aW51ZUxhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCVR5cGVCaW5kaW5nIHR5cGUgPSBjb25kaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIEJvb2xlYW5CaW5kaW5nKTsKKwkJY29uZGl0aW9uLmltcGxpY2l0V2lkZW5pbmcodHlwZSwgdHlwZSk7CisJCWlmIChhY3Rpb24gIT0gbnVsbCkKKwkJCWFjdGlvbi5yZXNvbHZlKHNjb3BlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgaW5Gcm9udCwgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpbkZyb250ID0gczsKKwkJcyA9IHMgKyAiZG8iOyAvLyROT04tTkxTLTEkCisJCWlmIChhY3Rpb24gPT0gbnVsbCkKKwkJCXMgPSBzICsgIiB7fVxuIjsgLy8kTk9OLU5MUy0xJAorCQllbHNlIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBCbG9jaykKKwkJCXMgPSBzICsgIlxuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKSArICJcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlzID0gcyArICIge1xuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKSArICI7fVxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXMgPSBzICsgaW5Gcm9udCArICJ3aGlsZSAoIiArIGNvbmRpdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWlmIChhY3Rpb24gIT0gbnVsbCkgeworCQkJCWFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQljb25kaXRpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG91YmxlTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDMwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBEb3VibGVMaXRlcmFsIGV4dGVuZHMgTnVtYmVyTGl0ZXJhbCB7CisJZG91YmxlIHZhbHVlOworcHVibGljIERvdWJsZUxpdGVyYWwoY2hhcltdIHRva2VuLCBpbnQgcywgaW50IGUpIHsKKwlzdXBlcih0b2tlbiwgcyxlKTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKworCS8vdGhlIHNvdXJjZSBpcyBjb3JyZWN0bHkgZm9ybWF0ZWQgc28gdGhlIGV4Y2VwdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXJzCisKKwlEb3VibGUgY29tcHV0ZWRWYWx1ZTsKKwl0cnkgeyBjb21wdXRlZFZhbHVlID0gRG91YmxlLnZhbHVlT2YoU3RyaW5nLnZhbHVlT2Yoc291cmNlKSk7fQorCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXtyZXR1cm4gO30gLy9ob3cgY2FuIGl0IGhhcHBlbiA/Pz8/CisKKwlpZiAoY29tcHV0ZWRWYWx1ZS5kb3VibGVWYWx1ZSgpID4gRG91YmxlLk1BWF9WQUxVRSkgcmV0dXJuIDsgLy9tYXkgYmUgSW5maW5pdHkKKwlpZiAoY29tcHV0ZWRWYWx1ZS5kb3VibGVWYWx1ZSgpIDwgRG91YmxlLk1JTl9WQUxVRSkKKwl7CS8vb25seSBhIHRydWUgMCBjYW4gYmUgbWFkZSBvZiB6ZXJvcyA6LSkKKwkJLy8yLjAwMDAwMDAwMDAwMDAwMDAwZS0zMjQgaXMgaWxsZWdhbCAuLi4uIAorCQlsYWJlbCA6CisJCQlmb3IgKGludCBpPTA7aTxzb3VyY2UubGVuZ3RoO2krKykKKwkJCXsJLy9pdCBpcyB3ZWxsZWQgZm9ybWF0ZWQgc28ganVzdCB0ZXN0IGFnYWluc3QgJzAnIGFuZCBwb3RlbnRpYWwgLiBEIGQgIAorCQkJCXN3aXRjaCAoc291cmNlW2ldKXsKKwkJCQkJY2FzZSAnMCcgOgorCQkJCQljYXNlICcuJyA6CisJCQkJCWNhc2UgJ2QnIDoKKwkJCQkJY2FzZSAnRCcgOiBicmVhayA7CisJCQkJCWNhc2UgJ2UnIDogCisJCQkJCWNhc2UgJ0UnIDogYnJlYWsgbGFiZWwgOyAvL2V4cG9zYW50IGFyZSB2YWxpZC4uLi4hCisJCQkJCWRlZmF1bHQgIDogcmV0dXJuO319fSAvL2Vycm9yCisKKwljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSh2YWx1ZSA9IGNvbXB1dGVkVmFsdWUuZG91YmxlVmFsdWUoKSk7fQorLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBkb3VibGUgbGl0ZXJhaworICoKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKQorCQlpZiAoKGltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX2RvdWJsZSkKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUodmFsdWUpOworCQllbHNlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJcmV0dXJuIERvdWJsZUJpbmRpbmc7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VtcHR5U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VtcHR5U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjOWZjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRW1wdHlTdGF0ZW1lbnQuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VxdWFsRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FcXVhbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQyNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FcXVhbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDUzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBFcXVhbEV4cHJlc3Npb24gZXh0ZW5kcyBCaW5hcnlFeHByZXNzaW9uIHsKKworcHVibGljIEVxdWFsRXhwcmVzc2lvbihFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsaW50IG9wZXJhdG9yKSB7CisJc3VwZXIobGVmdCxyaWdodCxvcGVyYXRvcik7Cit9CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCWlmICgoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IEVRVUFMX0VRVUFMKSB7CisJCWlmICgobGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpICYmIChsZWZ0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCWlmIChsZWZ0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKSB7IC8vICB0cnVlID09IGFueXRoaW5nCisJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgYXJndW1lbnQgaW5pdHMgCisJCQkJcmV0dXJuIHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCX0gZWxzZSB7IC8vIGZhbHNlID09IGFueXRoaW5nCisJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgYXJndW1lbnQgaW5pdHMgbmVnYXRlZAorCQkJCXJldHVybiByaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CisJCQl9CisJCX0KKwkJaWYgKChyaWdodC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpICYmIChyaWdodC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCQlpZiAocmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsgLy8gIGFueXRoaW5nID09IHRydWUKKwkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyAKKwkJCQlyZXR1cm4gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCQl9IGVsc2UgeyAvLyBhbnl0aGluZyA9PSBmYWxzZQorCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50IGluaXRzIG5lZ2F0ZWQKKwkJCQlyZXR1cm4gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJpZ2h0LmFuYWx5c2VDb2RlKAorCQkJY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgCisJCQlsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkudW5jb25kaXRpb25hbEluaXRzKCk7CisJfSBlbHNlIHsgLy9OT1RfRVFVQUwgOgorCQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAobGVmdC5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCQlpZiAoIWxlZnQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsgLy8gIGZhbHNlICE9IGFueXRoaW5nCisJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgYXJndW1lbnQgaW5pdHMgCisJCQkJcmV0dXJuIHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCX0gZWxzZSB7IC8vIHRydWUgIT0gYW55dGhpbmcKKwkJCQkvLyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSByaWdodCBhcmd1bWVudCBpbml0cyBuZWdhdGVkCisJCQkJcmV0dXJuIHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS5hc05lZ2F0ZWRDb25kaXRpb24oKTsKKwkJCX0KKwkJfQorCQlpZiAoKHJpZ2h0LmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgJiYgKHJpZ2h0LmNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCWlmICghcmlnaHQuY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpIHsgLy8gIGFueXRoaW5nICE9IGZhbHNlCisJCQkJLy8gIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgYXJndW1lbnQgaW5pdHMgCisJCQkJcmV0dXJuIGxlZnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJfSBlbHNlIHsgLy8gYW55dGhpbmcgIT0gdHJ1ZQorCQkJCS8vICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHJpZ2h0IGFyZ3VtZW50IGluaXRzIG5lZ2F0ZWQKKwkJCQlyZXR1cm4gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJpZ2h0LmFuYWx5c2VDb2RlKAorCQkJY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgCisJCQlsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkuYXNOZWdhdGVkQ29uZGl0aW9uKCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJfQorfQorcHVibGljIGZpbmFsIGJvb2xlYW4gYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShCbG9ja1Njb3BlIHNjb3BlLCBUeXBlQmluZGluZyBjYXN0VGIsIFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYikgeworCS8vc2VlIHNwZWNpZmljYXRpb25zIHAuNjgKKwkvL0EgbW9yZSBjb21wbGV0ZSB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIG9uCisJLy9DYXN0RXhwcmVzc2lvbiAoaXQgZGVhbHMgd2l0aCBjb25zdGFudCBhbmQgbmVlZCBydW50aW1lIGNoZWNrY2FzdCkKKworCisJLy89PT09PT09PUFSUkFZPT09PT09PT09PT09PT09CisJaWYgKGV4cHJlc3Npb25UYi5pc0FycmF5VHlwZSgpKSB7CisJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeyAvLy0tLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNBcnJheSAtLS0tLS0tLS0tLQorCQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvbkVsdFRiID0gKChBcnJheUJpbmRpbmcpIGV4cHJlc3Npb25UYikuZWxlbWVudHNUeXBlKHNjb3BlKTsKKwkJCWlmIChleHByZXNzaW9uRWx0VGIuaXNCYXNlVHlwZSgpKQorCQkJCS8vIDwtLS1zdG9wIHRoZSByZWN1cnNpb24tLS0tLS0tIAorCQkJCXJldHVybiAoKEFycmF5QmluZGluZykgY2FzdFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpID09IGV4cHJlc3Npb25FbHRUYjsKKwkJCS8vcmVjdXJzaXZseSBvbiB0aGUgZWx0cy4uLgorCQkJcmV0dXJuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsICgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSksIGV4cHJlc3Npb25FbHRUYik7CisJCX0KKwkJaWYgKGNhc3RUYi5pc0Jhc2VUeXBlKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeyAvLy0tLS0tLShjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0tLS0tCQorCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2FzdFRiLmlzSW50ZXJmYWNlKCkpIHsgLy8tLS0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShjYXN0VGIpIHx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGNhc3RUYikpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLShjYXN0VHlwZSkgbnVsbC0tLS0tLS0tLS0tLS0tCisJaWYgKGV4cHJlc3Npb25UYiA9PSBOdWxsQmluZGluZykgeworCQlyZXR1cm4gIWNhc3RUYi5pc0Jhc2VUeXBlKCk7CisJfQorCisJLy89PT09PT09PUJBU0VUWVBFPT09PT09PT09PT09PT0KKwlpZiAoZXhwcmVzc2lvblRiLmlzQmFzZVR5cGUoKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisKKwkvLz09PT09PT09UkVGRVJFTkNFIFRZUEU9PT09PT09PT09PT09PT09PT09CisKKwlpZiAoZXhwcmVzc2lvblRiLmlzQ2xhc3MoKSkgeworCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsgLy8gLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0KKwkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGV4cHJlc3Npb25UYikpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGNhc3RUYi5pc0Jhc2VUeXBlKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeyAvLyAtLS0tLSAoY2FzdFRiLmlzQ2xhc3MpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLSAKKwkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblRiLCBjYXN0VGIpKQorCQkJCXJldHVybiB0cnVlOworCQkJZWxzZSB7CisJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAoY2FzdFRiLmlzSW50ZXJmYWNlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tLSAgCisJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVGIpLmlzRmluYWwoKSkgeyAvL25vIHN1YmNsYXNzIGZvciBleHByZXNzaW9uVGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCisJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIGNhc3RUYikpCisJCQkJCXJldHVybiB0cnVlOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UoKSkgeworCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShleHByZXNzaW9uVGIpIHx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGV4cHJlc3Npb25UYikpCisJCQkJLy9wb3RlbnRpYWwgcnVudGltZSBlcnJvcgorCQkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2FzdFRiLmlzQmFzZVR5cGUoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChjYXN0VGIuaXNDbGFzcygpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChjYXN0VGIpKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZykgY2FzdFRiKS5pc0ZpbmFsKCkpIHsgLy9ubyBzdWJjbGFzcyBmb3IgY2FzdFRiLCB0aHVzIGNvbXBpbGUtdGltZSBjaGVjayBpcyB2YWxpZAorCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY2FzdFRiLmlzSW50ZXJmYWNlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0KKwkJCWlmIChjYXN0VGIgIT0gZXhwcmVzc2lvblRiICYmIChTY29wZS5jb21wYXJlVHlwZXMoY2FzdFRiLCBleHByZXNzaW9uVGIpID09IE5vdFJlbGF0ZWQpKSB7CisJCQkJTWV0aG9kQmluZGluZ1tdIGNhc3RUYk1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUYikubWV0aG9kcygpOworCQkJCWludCBjYXN0VGJNZXRob2RzTGVuZ3RoID0gY2FzdFRiTWV0aG9kcy5sZW5ndGg7CisJCQkJTWV0aG9kQmluZGluZ1tdIGV4cHJlc3Npb25UYk1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UYikubWV0aG9kcygpOworCQkJCWludCBleHByZXNzaW9uVGJNZXRob2RzTGVuZ3RoID0gZXhwcmVzc2lvblRiTWV0aG9kcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXN0VGJNZXRob2RzTGVuZ3RoOyBpKyspIHsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHByZXNzaW9uVGJNZXRob2RzTGVuZ3RoOyBqKyspIHsKKwkJCQkJCWlmIChjYXN0VGJNZXRob2RzW2ldLnNlbGVjdG9yID09IGV4cHJlc3Npb25UYk1ldGhvZHNbal0uc2VsZWN0b3IpIHsKKwkJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5yZXR1cm5UeXBlICE9IGV4cHJlc3Npb25UYk1ldGhvZHNbal0ucmV0dXJuVHlwZSkgeworCQkJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhwcmVzc2lvblRiTWV0aG9kc1tqXSkpIHsKKwkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIGNvbXB1dGVDb25zdGFudChUeXBlQmluZGluZyBsZWZ0VGIsIFR5cGVCaW5kaW5nIHJpZ2h0VGIpIHsKKwlpZiAoKGxlZnQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAocmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkgeworCQljb25zdGFudCA9CisJCQlDb25zdGFudC5jb21wdXRlQ29uc3RhbnRPcGVyYXRpb25FUVVBTF9FUVVBTCgKKwkJCQlsZWZ0LmNvbnN0YW50LAorCQkJCWxlZnRUYi5pZCwKKwkJCQlFUVVBTF9FUVVBTCwKKwkJCQlyaWdodC5jb25zdGFudCwKKwkJCQlyaWdodFRiLmlkKTsKKwkJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UX0VRVUFMKQorCQkJY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUoIWNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKTsKKwl9IGVsc2UgeworCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwl9Cit9CisvKioKKyAqIE5vcm1hbCA9PSBvciAhPSBjb2RlIGdlbmVyYXRpb24uCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAodmFsdWVSZXF1aXJlZCkgCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCXJldHVybjsKKwl9CisJTGFiZWwgZmFsc2VMYWJlbDsKKwlnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCWN1cnJlbnRTY29wZSwgCisJCWNvZGVTdHJlYW0sIAorCQludWxsLCAKKwkJZmFsc2VMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSwgCisJCXZhbHVlUmVxdWlyZWQpOworCWlmIChmYWxzZUxhYmVsLmhhc0ZvcndhcmRSZWZlcmVuY2VzKCkpIHsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpeworCQkJLy8gY29tcGFyaXNvbiBpcyBUUlVFIAorCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJaWYgKChiaXRzICYgVmFsdWVGb3JSZXR1cm5NQVNLKSAhPSAwKXsKKwkJCQljb2RlU3RyZWFtLmlyZXR1cm4oKTsKKwkJCQkvLyBjb21wYXJpc29uIGlzIEZBTFNFCisJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzAoKTsKKwkJCX0gZWxzZSB7CisJCQkJTGFiZWwgZW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCk7CisJCQkJY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKDEpOworCQkJCS8vIGNvbXBhcmlzb24gaXMgRkFMU0UKKwkJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCWVuZExhYmVsLnBsYWNlKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmYWxzZUxhYmVsLnBsYWNlKCk7CisJCX0JCisJfQkKK30KKy8qKgorICogQm9vbGVhbiBvcGVyYXRvciBjb2RlIGdlbmVyYXRpb24KKyAqCU9wdGltaXplZCBvcGVyYXRpb25zIGFyZTogPT0gYW5kICE9CisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBMYWJlbCB0cnVlTGFiZWwsIExhYmVsIGZhbHNlTGFiZWwsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOworCQlyZXR1cm47CisJfQorCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gRVFVQUxfRVFVQUwpIHsKKwkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKKwkJCWdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKwkJfSBlbHNlIHsKKwkJCWdlbmVyYXRlT3B0aW1pemVkTm9uQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiAweEYpIC8qY29tcGlsZS10aW1lKi8gPT0gVF9ib29sZWFuKSB7CisJCQlnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW5FcXVhbChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlTGFiZWwsIHRydWVMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCX0gZWxzZSB7CisJCQlnZW5lcmF0ZU9wdGltaXplZE5vbkJvb2xlYW5FcXVhbChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlTGFiZWwsIHRydWVMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CisJCX0KKwl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KKy8qKgorICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciA9PSB3aXRoIGJvb2xlYW4gb3BlcmFuZHMKKyAqCisgKiBOb3RlIHRoaXMgY29kZSBkb2VzIG5vdCBvcHRpbWl6ZSBjb25kaXRpb25hbCBjb25zdGFudHMgISEhIQorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW5FcXVhbChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBMYWJlbCB0cnVlTGFiZWwsIExhYmVsIGZhbHNlTGFiZWwsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJLy8gb3B0aW1pemVkIGNhc2VzOiB0cnVlID09IHgsIGZhbHNlID09IHgKKwlpZiAobGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJYm9vbGVhbiBpbmxpbmUgPSBsZWZ0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpOworCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAoaW5saW5lID8gdHJ1ZUxhYmVsIDogZmFsc2VMYWJlbCksIChpbmxpbmUgPyBmYWxzZUxhYmVsIDogdHJ1ZUxhYmVsKSwgdmFsdWVSZXF1aXJlZCk7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCXJldHVybjsKKwl9IC8vIG9wdGltaXplZCBjYXNlczogeCA9PSB0cnVlLCB4ID09IGZhbHNlCisJaWYgKHJpZ2h0LmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQlib29sZWFuIGlubGluZSA9IHJpZ2h0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpOworCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIChpbmxpbmUgPyB0cnVlTGFiZWwgOiBmYWxzZUxhYmVsKSwgKGlubGluZSA/IGZhbHNlTGFiZWwgOiB0cnVlTGFiZWwpLCB2YWx1ZVJlcXVpcmVkKTsKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJcmV0dXJuOworCX0KKwkvLyBkZWZhdWx0IGNhc2UKKwlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGVxKHRydWVMYWJlbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJY29kZVN0cmVhbS5pZl9pY21wbmUoZmFsc2VMYWJlbCk7CisJCQl9IGVsc2UgeworCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCX0KKwkJfQorCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorLyoqCisgKiBCb29sZWFuIGdlbmVyYXRpb24gZm9yID09IHdpdGggbm9uLWJvb2xlYW4gb3BlcmFuZHMKKyAqCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkTm9uQm9vbGVhbkVxdWFsKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIExhYmVsIHRydWVMYWJlbCwgTGFiZWwgZmFsc2VMYWJlbCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlDb25zdGFudCBpbmxpbmU7CisJaWYgKChpbmxpbmUgPSByaWdodC5jb25zdGFudCkgIT0gTm90QUNvbnN0YW50KSB7CisJCS8vIG9wdGltaXplZCBjYXNlOiB4ID09IG51bGwKKwkJaWYgKHJpZ2h0LmNvbnN0YW50ID09IE51bGxDb25zdGFudC5EZWZhdWx0KSB7CisJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCQljb2RlU3RyZWFtLmlmbnVsbCh0cnVlTGFiZWwpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCQljb2RlU3RyZWFtLmlmbm9ubnVsbChmYWxzZUxhYmVsKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gb3B0aW1pemVkIGNhc2U6IHggPT0gMAorCQlpZiAoKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX2ludCkgJiYgKGlubGluZS5pbnRWYWx1ZSgpID09IDApKSB7CisJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCQljb2RlU3RyZWFtLmlmZXEodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5pZm5lKGZhbHNlTGFiZWwpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoKGlubGluZSA9IGxlZnQuY29uc3RhbnQpICE9IE5vdEFDb25zdGFudCkgeworCQkvLyBvcHRpbWl6ZWQgY2FzZTogbnVsbCA9PSB4CisJCWlmIChsZWZ0LmNvbnN0YW50ID09IE51bGxDb25zdGFudC5EZWZhdWx0KSB7CisJCQlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJY29kZVN0cmVhbS5pZm51bGwodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5pZm5vbm51bGwoZmFsc2VMYWJlbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJcmV0dXJuOworCQl9CisJCS8vIG9wdGltaXplZCBjYXNlOiAwID09IHgKKwkJaWYgKCgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgPT0gVF9pbnQpCisJCQkmJiAoaW5saW5lLmludFZhbHVlKCkgPT0gMCkpIHsKKwkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCQljb2RlU3RyZWFtLmlmZXEodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5pZm5lKGZhbHNlTGFiZWwpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvLyBkZWZhdWx0IGNhc2UKKwlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCXN3aXRjaCAobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgeyAvLyBvcGVyYW5kIHJ1bnRpbWUgdHlwZQorCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcGVxKHRydWVMYWJlbCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCWNvZGVTdHJlYW0uZmNtcGwoKTsKKwkJCQkJCWNvZGVTdHJlYW0uaWZlcSh0cnVlTGFiZWwpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCWNvZGVTdHJlYW0ubGNtcCgpOworCQkJCQkJY29kZVN0cmVhbS5pZmVxKHRydWVMYWJlbCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQljb2RlU3RyZWFtLmRjbXBsKCk7CisJCQkJCQljb2RlU3RyZWFtLmlmZXEodHJ1ZUxhYmVsKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWNvZGVTdHJlYW0uaWZfYWNtcGVxKHRydWVMYWJlbCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCXN3aXRjaCAobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgeyAvLyBvcGVyYW5kIHJ1bnRpbWUgdHlwZQorCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCWNvZGVTdHJlYW0uaWZfaWNtcG5lKGZhbHNlTGFiZWwpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQljb2RlU3RyZWFtLmZjbXBsKCk7CisJCQkJCQljb2RlU3RyZWFtLmlmbmUoZmFsc2VMYWJlbCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJY29kZVN0cmVhbS5sY21wKCk7CisJCQkJCQljb2RlU3RyZWFtLmlmbmUoZmFsc2VMYWJlbCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQljb2RlU3RyZWFtLmRjbXBsKCk7CisJCQkJCQljb2RlU3RyZWFtLmlmbmUoZmFsc2VMYWJlbCk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQljb2RlU3RyZWFtLmlmX2FjbXBuZShmYWxzZUxhYmVsKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCX0KKwkJfQorCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIGJvb2xlYW4gaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGFsd2F5cyByZXR1cm4gQm9vbGVhbkJpbmRpbmcKKwlUeXBlQmluZGluZyBsZWZ0VGIgPSBsZWZ0LnJlc29sdmVUeXBlKHNjb3BlKTsKKwlUeXBlQmluZGluZyByaWdodFRiID0gcmlnaHQucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmIChsZWZ0VGIgPT0gbnVsbCB8fCByaWdodFRiID09IG51bGwpeworCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyBib3RoIGJhc2UgdHlwZQorCWlmIChsZWZ0VGIuaXNCYXNlVHlwZSgpICYmIHJpZ2h0VGIuaXNCYXNlVHlwZSgpKSB7CisJCS8vIHRoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICA9PSAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICA8PDAKKwkJaW50IHJlc3VsdCA9IFJlc29sdmVUeXBlVGFibGVzW0VRVUFMX0VRVUFMXVsgKGxlZnRUYi5pZCA8PCA0KSArIHJpZ2h0VGIuaWRdOworCQlsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA9IHJlc3VsdCA+Pj4gMTI7CisJCXJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiA9IChyZXN1bHQgPj4+IDQpICYgMHgwMDBGRjsKKwkJYml0cyB8PSByZXN1bHQgJiAweEY7CQkKKwkJaWYgKChyZXN1bHQgJiAweDAwMDBGKSA9PSBUX3VuZGVmaW5lZCkgeworCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgbGVmdFRiLCByaWdodFRiKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWNvbXB1dGVDb25zdGFudChsZWZ0VGIsIHJpZ2h0VGIpOworCQl0aGlzLnR5cGVCaW5kaW5nID0gQm9vbGVhbkJpbmRpbmc7CisJCXJldHVybiBCb29sZWFuQmluZGluZzsKKwl9CisKKwkvLyBPYmplY3QgcmVmZXJlbmNlcyAKKwkvLyBzcGVjIDE1LjIwLjMKKwlpZiAoYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgcmlnaHRUYiwgbGVmdFRiKSB8fCBhcmVUeXBlc0Nhc3RDb21wYXRpYmxlKHNjb3BlLCBsZWZ0VGIsIHJpZ2h0VGIpKSB7CisJCS8vIChzcGVjaWFsIGNhc2UgZm9yIFN0cmluZykKKwkJaWYgKChyaWdodFRiLmlkID09IFRfU3RyaW5nKSAmJiAobGVmdFRiLmlkID09IFRfU3RyaW5nKSkKKwkJCWNvbXB1dGVDb25zdGFudChsZWZ0VGIsIHJpZ2h0VGIpOworCQllbHNlCisJCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJaWYgKHJpZ2h0VGIuaWQgPT0gVF9TdHJpbmcpCisJCQlyaWdodC5pbXBsaWNpdENvbnZlcnNpb24gPSBTdHJpbmcyU3RyaW5nOworCQlpZiAobGVmdFRiLmlkID09IFRfU3RyaW5nKQorCQkJbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPSBTdHJpbmcyU3RyaW5nOworCQl0aGlzLnR5cGVCaW5kaW5nID0gQm9vbGVhbkJpbmRpbmc7CisJCXJldHVybiBCb29sZWFuQmluZGluZzsKKwl9CisJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3IodGhpcywgbGVmdFRiLCByaWdodFRiKTsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJbGVmdC50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCXJpZ2h0LnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwl9CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkYzc1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwKKwlleHRlbmRzIFN0YXRlbWVudAorCWltcGxlbWVudHMgSW52b2NhdGlvblNpdGUgeworCQkKKwlwdWJsaWMgRXhwcmVzc2lvbltdIGFyZ3VtZW50czsKKwlwdWJsaWMgRXhwcmVzc2lvbiBxdWFsaWZpY2F0aW9uOworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGJpbmRpbmc7CisKKwlwdWJsaWMgaW50IGFjY2Vzc01vZGU7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJbXBsaWNpdFN1cGVyID0gMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTdXBlciA9IDI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVGhpcyA9IDM7CisKKwlwdWJsaWMgVmFyaWFibGVCaW5kaW5nW11bXSBpbXBsaWNpdEFyZ3VtZW50czsKKwlib29sZWFuIGRpc2NhcmRFbmNsb3NpbmdJbnN0YW5jZTsKKworCU1ldGhvZEJpbmRpbmcgc3ludGhldGljQWNjZXNzb3I7CisKKwlwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoaW50IGFjY2Vzc01vZGUpIHsKKwkJdGhpcy5hY2Nlc3NNb2RlID0gYWNjZXNzTW9kZTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBtdXN0IHZlcmlmeSB0aGF0IGV4Y2VwdGlvbnMgcG90ZW50aWFsbHkgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiBhcmUgY2F1Z2h0IGluIHRoZSBtZXRob2QuCisKKwkJdHJ5IHsKKwkJCSgoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZSkuaXNDb25zdHJ1Y3RvckNhbGwgPSB0cnVlOworCisJCQkvLyBwcm9jZXNzIGVuY2xvc2luZyBpbnN0YW5jZQorCQkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgeworCQkJCWZsb3dJbmZvID0KKwkJCQkJcXVhbGlmaWNhdGlvbgorCQkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQorCQkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJfQorCQkJLy8gcHJvY2VzcyBhcmd1bWVudHMKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJZmxvd0luZm8gPQorCQkJCQkJYXJndW1lbnRzW2ldCisJCQkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQorCQkJCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCQl9CisJCQl9CisKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25zOworCQkJaWYgKCh0aHJvd25FeGNlcHRpb25zID0gYmluZGluZy50aHJvd25FeGNlcHRpb25zKSAhPSBOb0V4Y2VwdGlvbnMpIHsKKwkJCQkvLyBjaGVjayBleGNlcHRpb25zCisJCQkJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycygKKwkJCQkJdGhyb3duRXhjZXB0aW9ucywKKwkJCQkJKGFjY2Vzc01vZGUgPT0gSW1wbGljaXRTdXBlcikKKwkJCQkJCT8gKEFzdE5vZGUpIGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQKKwkJCQkJCTogKEFzdE5vZGUpIHRoaXMsCisJCQkJCWZsb3dJbmZvLAorCQkJCQljdXJyZW50U2NvcGUpOworCQkJfQorCQkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCQkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCXJldHVybiBmbG93SW5mbzsKKwkJfSBmaW5hbGx5IHsKKwkJCSgoTWV0aG9kU2NvcGUpIGN1cnJlbnRTY29wZSkuaXNDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGNhbGwgY29kZSBnZW5lcmF0aW9uCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQkoKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGUpLmlzQ29uc3RydWN0b3JDYWxsID0gdHJ1ZTsKKworCQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCisJCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGNvbnN0cnVjdG9yIGludm9jYXRpb24KKwkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZTsKKwkJCWlmICgodGFyZ2V0VHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmlzTmVzdGVkVHlwZSgpKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0FyZ3VtZW50VmFsdWVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCXRhcmdldFR5cGUsCisJCQkJCWRpc2NhcmRFbmNsb3NpbmdJbnN0YW5jZSA/IG51bGwgOiBxdWFsaWZpY2F0aW9uLAorCQkJCQl0aGlzKTsKKwkJCX0KKwkJCS8vIHJlZ3VsYXIgY29kZSBnZW4KKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJYXJndW1lbnRzW2ldLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChzeW50aGV0aWNBY2Nlc3NvciAhPSBudWxsKSB7CisJCQkJLy8gc3ludGhldGljIGFjY2Vzc29yIGdvdCBzb21lIGV4dHJhIGFyZ3VtZW50cyBhcHBlbmRlZCB0byBpdHMgc2lnbmF0dXJlLCB3aGljaCBuZWVkIHZhbHVlcworCQkJCWZvciAoaW50IGkgPSAwLAorCQkJCQltYXggPSBzeW50aGV0aWNBY2Nlc3Nvci5wYXJhbWV0ZXJzLmxlbmd0aCAtIGJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CisJCQkJCWkgPCBtYXg7CisJCQkJCWkrKykgeworCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQkJfQorCQkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChzeW50aGV0aWNBY2Nlc3Nvcik7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChiaW5kaW5nKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCX0gZmluYWxseSB7CisJCQkoKE1ldGhvZFNjb3BlKSBjdXJyZW50U2NvcGUpLmlzQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0U3VwZXIoKSB7CisJCS8vcmV0dXJuIHRydWUgaWYgSSdtIG9mIHRoZXNlIGNvbXBpbGVyIGFkZGVkIHN0YXRlbWVudCBzdXBlcigpOworCisJCXJldHVybiAoYWNjZXNzTW9kZSA9PSBJbXBsaWNpdFN1cGVyKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQWNjZXNzKCkgeworCisJCXJldHVybiBhY2Nlc3NNb2RlICE9IFRoaXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgeworCisJCXJldHVybiB0cnVlOworCX0KKworCS8qIElubmVyIGVtdWxhdGlvbiBjb25zaXN0cyBpbiBlaXRoZXIgcmVjb3JkaW5nIGEgZGVwZW5kZW5jeSAKKwkgKiBsaW5rIG9ubHksIG9yIHBlcmZvcm1pbmcgb25lIGxldmVsIG9mIHByb3BhZ2F0aW9uLgorCSAqCisJICogRGVwZW5kZW5jeSBtZWNoYW5pc20gaXMgdXNlZCB3aGVuZXZlciBkZWFsaW5nIHdpdGggc291cmNlIHRhcmdldAorCSAqIHR5cGVzLCBzaW5jZSBieSB0aGUgdGltZSB3ZSByZWFjaCB0aGVtLCB3ZSBtaWdodCBub3QgeWV0IGtub3cgdGhlaXIKKwkgKiBleGFjdCBuZWVkLgorCSAqLworCXZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZTsKKworCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CisJCWlmICgoc3VwZXJUeXBlID0gYmluZGluZy5kZWNsYXJpbmdDbGFzcykuaXNOZXN0ZWRUeXBlKCkKKwkJCSYmIGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuaXNMb2NhbFR5cGUoKSkgeworCisJCQlpZiAoc3VwZXJUeXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJCQkoKExvY2FsVHlwZUJpbmRpbmcpIHN1cGVyVHlwZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJcXVhbGlmaWNhdGlvbiAhPSBudWxsLAorCQkJCQl0cnVlKTsKKwkJCQkvLyByZXF1ZXN0IGRpcmVjdCBhY2Nlc3MKKwkJCX0gZWxzZSB7CisJCQkJLy8gbG9jYWxseSBwcm9wYWdhdGUsIHNpbmNlIHdlIGFscmVhZHkgbm93IHRoZSBkZXNpcmVkIHNoYXBlIGZvciBzdXJlCisJCQkJY3VycmVudFNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKHN1cGVyVHlwZSwgcXVhbGlmaWNhdGlvbiAhPSBudWxsLCB0cnVlKTsKKwkJCQkvLyByZXF1ZXN0IGRpcmVjdCBhY2Nlc3MKKworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKworCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CisJCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpICYmIChhY2Nlc3NNb2RlICE9IFRoaXMpKSB7CisKKwkJCWlmIChjdXJyZW50U2NvcGUKKwkJCQkuZW52aXJvbm1lbnQoKQorCQkJCS5vcHRpb25zCisJCQkJLmlzUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2hhbmdpbmdWaXNpYmlsaXR5KSB7CisJCQkJYmluZGluZy50YWdGb3JDbGVhcmluZ1ByaXZhdGVNb2RpZmllcigpOworCQkJCS8vIGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGR1bXBlZCBhcyBwcml2YXRlLCBubyBlbXVsYXRpb24gcmVxdWlyZWQgdGh1cworCQkJfSBlbHNlIHsKKwkJCQlzeW50aGV0aWNBY2Nlc3NvciA9CisJCQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcyhiaW5kaW5nLCB0aGlzKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCQkvLyB0aGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIHZvaWQgZm9yIGEgY29uc3RydWN0b3IuCisJCS8vIHRoZSB0ZXN0IGlzIG1hZGUgaW50byBnZXRDb25zdHJ1Y3RvcgorCisJCS8vIG1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgaW4gYSBjb25zdHJ1Y3RvciBjYWxsLi4uLi4KKwkJLy8gdW5tYXJrIGF0IGFsbCByZXR1cm5zCisJCXRyeSB7CisJCQkoKE1ldGhvZFNjb3BlKSBzY29wZSkuaXNDb25zdHJ1Y3RvckNhbGwgPSB0cnVlOworCQkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQlpZiAoYWNjZXNzTW9kZSAhPSBUaGlzKQorCQkJCXJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyVHlwZS5zdXBlcmNsYXNzKCk7CisKKwkJCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gcXVhbGlmaWNhdGlvbiBzaG91bGQgYmUgZnJvbSB0aGUgdHlwZSBvZiB0aGUgZW5jbG9zaW5nVHlwZQorCQkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgeworCQkJCWlmIChhY2Nlc3NNb2RlICE9IFN1cGVyKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5RW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKAorCQkJCQkJcXVhbGlmaWNhdGlvbiwKKwkJCQkJCXJlY2VpdmVyVHlwZSk7CisJCQkJfQorCQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IHJlY2VpdmVyVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQkJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbigKKwkJCQkJCXF1YWxpZmljYXRpb24sCisJCQkJCQlyZWNlaXZlclR5cGUpOworCQkJCQlkaXNjYXJkRW5jbG9zaW5nSW5zdGFuY2UgPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCVR5cGVCaW5kaW5nIHFUYiA9IHF1YWxpZmljYXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIGVuY2xvc2luZ1R5cGUpOworCQkJCQlxdWFsaWZpY2F0aW9uLmltcGxpY2l0V2lkZW5pbmcocVRiLCBxVGIpOworCQkJCX0KKwkJCX0KKworCQkJLy8gYXJndW1lbnRzIGJ1ZmZlcmluZyBmb3IgdGhlIG1ldGhvZCBsb29rdXAKKwkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPSBOb1BhcmFtZXRlcnM7CisJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGFyZ0hhc0Vycm9yID0gZmFsc2U7IC8vIHR5cGVDaGVja3MgYWxsIGFyZ3VtZW50cworCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWFyZ1R5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQkJaWYgKChhcmdUeXBlc1tpXSA9IGFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCisJCQkJCQlhcmdIYXNFcnJvciA9IHRydWU7CisJCQkJaWYgKGFyZ0hhc0Vycm9yKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoKGJpbmRpbmcgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihyZWNlaXZlclR5cGUsIGFyZ1R5cGVzLCB0aGlzKSkKKwkJCQkuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQoYmluZGluZywgc2NvcGUpKQorCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOworCisJCQkJLy8gc2VlIGZvciB1c2VyLWltcGxpY2l0IHdpZGVuaW5nIGNvbnZlcnNpb24gCisJCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCQlUeXBlQmluZGluZ1tdIHBhcmFtVHlwZXMgPSBiaW5kaW5nLnBhcmFtZXRlcnM7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhwYXJhbVR5cGVzW2ldLCBhcmdUeXBlc1tpXSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKQorCQkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gcmVjZWl2ZXJUeXBlOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCSgoTWV0aG9kU2NvcGUpIHNjb3BlKS5pc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJCS8vIGlnbm9yZWQKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpIHsKKwkJLy8gaWdub3JlIGZvciBoZXJlCisJfQorCisJcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpIHsKKwkJLy8gaWdub3JlIGZvciBoZXJlCisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKKwkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkKKwkJCXMgPSBzICsgcXVhbGlmaWNhdGlvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYWNjZXNzTW9kZSA9PSBUaGlzKSB7CisJCQlzID0gcyArICJ0aGlzKCI7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXMgPSBzICsgInN1cGVyKCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCXMgPSBzICsgYXJndW1lbnRzW2ldLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCQkJCWlmIChpICE9IGFyZ3VtZW50cy5sZW5ndGggLSAxKQorCQkJCQlzID0gcyArICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJcyA9IHMgKyAiKSI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJaWYgKHF1YWxpZmljYXRpb24gIT0gbnVsbCkgeworCQkJCXF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspCisJCQkJCWFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyMzNlOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQorCS8vc29tZSBleHByZXNzaW9uIG1heSBub3QgYmUgdXNlZCAtIGZyb20gYSBqYXZhIHNlbWFudGljIHBvaW50CisJLy9vZiB2aWV3IG9ubHkgLSBhcyBzdGF0ZW1lbnRzLiBPdGhlciBtYXkuIEluIG9yZGVyIHRvIGF2b2lkIHRoZSBjcmVhdGlvbgorCS8vb2Ygd3JhcHBlcnMgYXJvdW5kIGV4cHJlc3Npb24gaW4gb3JkZXIgdG8gdHVuZSB0aGVtIGFzIGV4cHJlc3Npb24KKwkvL0V4cHJlc3Npb24gaXMgYSBzdWJjbGFzcyBvZiBTdGF0ZW1lbnQuIFNlZSB0aGUgbWVzc2FnZSBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpCisKKwlwdWJsaWMgaW50IGltcGxpY2l0Q29udmVyc2lvbjsKKworCXB1YmxpYyBDb25zdGFudCBjb25zdGFudDsKKworCXB1YmxpYyBFeHByZXNzaW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbywKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CisKKwlwdWJsaWMgQ29uc3RhbnQgY29uZGl0aW9uYWxDb25zdGFudCgpIHsKKworCQlyZXR1cm4gY29uc3RhbnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzQ29uc3RhbnRWYWx1ZVJlcHJlc2VudGFibGUoCisJCUNvbnN0YW50IGNvbnN0YW50LAorCQlpbnQgY29uc3RhbnRUeXBlSUQsCisJCWludCB0YXJnZXRUeXBlSUQpIHsKKworCQkvL3RydWUgaWYgdGhlcmUgaXMgbm8gbG9zcyBvZiBwcmVjaXNpb24gd2hpbGUgY2FzdGluZy4KKwkJLy8gY29uc3RhbnRUeXBlSUQgPT0gY29uc3RhbnQudHlwZUlECisJCWlmICh0YXJnZXRUeXBlSUQgPT0gY29uc3RhbnRUeXBlSUQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJc3dpdGNoICh0YXJnZXRUeXBlSUQpIHsKKwkJCWNhc2UgVF9jaGFyIDoKKwkJCQlzd2l0Y2ggKGNvbnN0YW50VHlwZUlEKSB7CisJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5kb3VibGVWYWx1ZSgpID09IGNvbnN0YW50LmNoYXJWYWx1ZSgpOworCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmZsb2F0VmFsdWUoKSA9PSBjb25zdGFudC5jaGFyVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuaW50VmFsdWUoKSA9PSBjb25zdGFudC5jaGFyVmFsdWUoKTsKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5zaG9ydFZhbHVlKCkgPT0gY29uc3RhbnQuY2hhclZhbHVlKCk7CisJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5ieXRlVmFsdWUoKSA9PSBjb25zdGFudC5jaGFyVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmxvbmdWYWx1ZSgpID09IGNvbnN0YW50LmNoYXJWYWx1ZSgpOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsvL2Jvb2xlYW4KKwkJCQl9IAorCisJCQljYXNlIFRfZmxvYXQgOgorCQkJCXN3aXRjaCAoY29uc3RhbnRUeXBlSUQpIHsKKwkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmNoYXJWYWx1ZSgpID09IGNvbnN0YW50LmZsb2F0VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuZG91YmxlVmFsdWUoKSA9PSBjb25zdGFudC5mbG9hdFZhbHVlKCk7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuaW50VmFsdWUoKSA9PSBjb25zdGFudC5mbG9hdFZhbHVlKCk7CisJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuc2hvcnRWYWx1ZSgpID09IGNvbnN0YW50LmZsb2F0VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmJ5dGVWYWx1ZSgpID09IGNvbnN0YW50LmZsb2F0VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmxvbmdWYWx1ZSgpID09IGNvbnN0YW50LmZsb2F0VmFsdWUoKTsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlyZXR1cm4gZmFsc2U7Ly9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXN3aXRjaCAoY29uc3RhbnRUeXBlSUQpIHsKKwkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmNoYXJWYWx1ZSgpID09IGNvbnN0YW50LmRvdWJsZVZhbHVlKCk7CisJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuZmxvYXRWYWx1ZSgpID09IGNvbnN0YW50LmRvdWJsZVZhbHVlKCk7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmludFZhbHVlKCkgPT0gY29uc3RhbnQuZG91YmxlVmFsdWUoKTsKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5zaG9ydFZhbHVlKCkgPT0gY29uc3RhbnQuZG91YmxlVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmJ5dGVWYWx1ZSgpID09IGNvbnN0YW50LmRvdWJsZVZhbHVlKCk7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5sb25nVmFsdWUoKSA9PSBjb25zdGFudC5kb3VibGVWYWx1ZSgpOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQlzd2l0Y2ggKGNvbnN0YW50VHlwZUlEKSB7CisJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5jaGFyVmFsdWUoKSA9PSBjb25zdGFudC5ieXRlVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuZG91YmxlVmFsdWUoKSA9PSBjb25zdGFudC5ieXRlVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5mbG9hdFZhbHVlKCkgPT0gY29uc3RhbnQuYnl0ZVZhbHVlKCk7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmludFZhbHVlKCkgPT0gY29uc3RhbnQuYnl0ZVZhbHVlKCk7CisJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuc2hvcnRWYWx1ZSgpID09IGNvbnN0YW50LmJ5dGVWYWx1ZSgpOworCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmxvbmdWYWx1ZSgpID09IGNvbnN0YW50LmJ5dGVWYWx1ZSgpOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChjb25zdGFudFR5cGVJRCkgeworCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuY2hhclZhbHVlKCkgPT0gY29uc3RhbnQuc2hvcnRWYWx1ZSgpOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5kb3VibGVWYWx1ZSgpID09IGNvbnN0YW50LnNob3J0VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5mbG9hdFZhbHVlKCkgPT0gY29uc3RhbnQuc2hvcnRWYWx1ZSgpOworCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5pbnRWYWx1ZSgpID09IGNvbnN0YW50LnNob3J0VmFsdWUoKTsKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuYnl0ZVZhbHVlKCkgPT0gY29uc3RhbnQuc2hvcnRWYWx1ZSgpOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQubG9uZ1ZhbHVlKCkgPT0gY29uc3RhbnQuc2hvcnRWYWx1ZSgpOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWNhc2UgVF9pbnQgOgorCQkJCXN3aXRjaCAoY29uc3RhbnRUeXBlSUQpIHsKKwkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmNoYXJWYWx1ZSgpID09IGNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmRvdWJsZVZhbHVlKCkgPT0gY29uc3RhbnQuaW50VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5mbG9hdFZhbHVlKCkgPT0gY29uc3RhbnQuaW50VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5zaG9ydFZhbHVlKCkgPT0gY29uc3RhbnQuaW50VmFsdWUoKTsKKwkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmJ5dGVWYWx1ZSgpID09IGNvbnN0YW50LmludFZhbHVlKCk7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5sb25nVmFsdWUoKSA9PSBjb25zdGFudC5pbnRWYWx1ZSgpOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlzd2l0Y2ggKGNvbnN0YW50VHlwZUlEKSB7CisJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5jaGFyVmFsdWUoKSA9PSBjb25zdGFudC5sb25nVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuZG91YmxlVmFsdWUoKSA9PSBjb25zdGFudC5sb25nVmFsdWUoKTsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCXJldHVybiBjb25zdGFudC5mbG9hdFZhbHVlKCkgPT0gY29uc3RhbnQubG9uZ1ZhbHVlKCk7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJcmV0dXJuIGNvbnN0YW50LmludFZhbHVlKCkgPT0gY29uc3RhbnQubG9uZ1ZhbHVlKCk7CisJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuc2hvcnRWYWx1ZSgpID09IGNvbnN0YW50LmxvbmdWYWx1ZSgpOworCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQlyZXR1cm4gY29uc3RhbnQuYnl0ZVZhbHVlKCkgPT0gY29uc3RhbnQubG9uZ1ZhbHVlKCk7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCQkJfSAKKwkJCQkKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiBmYWxzZTsgLy9ib29sZWFuCisJCX0gCisJfQorCisJLyoqCisJICogRXhwcmVzc2lvbiBzdGF0ZW1lbnRzIGFyZSBwbGFpbiBleHByZXNzaW9ucywgaG93ZXZlciB0aGV5IGdlbmVyYXRlIGxpa2UKKwkgKiBub3JtYWwgZXhwcmVzc2lvbnMgd2l0aCBubyB2YWx1ZSByZXF1aXJlZC4KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbSAKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBFdmVyeSBleHByZXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGl0cyBpbXBsaWNpdCBjb252ZXJzaW9uIHdoZW4gbmVjZXNzYXJ5LgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJLy8gZ2VuZXJhdGUgYSBjb25zdGFudCBleHByZXNzaW9uCisJCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJfSBlbHNlIHsKKwkJCS8vIGFjdHVhbCBub24tY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uCisJCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0Lm1pc3NpbmdDb2RlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvKioKKwkgKiBEZWZhdWx0IGdlbmVyYXRpb24gb2YgYSBib29sZWFuIHZhbHVlCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCS8vIGEgbGFiZWwgdmFsdWVkIHRvIG5pbCBtZWFuczogYnkgZGVmYXVsdCB3ZSBmYWxsIHRocm91Z2ggdGhlIGNhc2UuLi4gCisJCS8vIGJvdGggbmlsIG1lYW5zIHdlIGxlYXZlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sKKworCQlpZiAoKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgJiYgKGNvbnN0YW50LnR5cGVJRCgpID09IFRfYm9vbGVhbikpIHsKKwkJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQlpZiAoY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgeworCQkJCS8vIGNvbnN0YW50ID09IHRydWUKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZ290b18odHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZhbHNlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZ290b18oZmFsc2VMYWJlbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJcmV0dXJuOworCQl9CisJCWdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkvLyBicmFuY2hpbmcKKwkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJLy8gSW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCWNvZGVTdHJlYW0uaWZuZSh0cnVlTGFiZWwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJCS8vIEltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWNvZGVTdHJlYW0uaWZlcShmYWxzZUxhYmVsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBObyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkJfQorCQkJfQorCQl9CisJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCisJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOworCX0KKworCS8qIE9wdGltaXplZCAoamF2YSkgY29kZSBnZW5lcmF0aW9uIGZvciBzdHJpbmcgY29uY2F0ZW5hdGlvbnMgdGhhdCBpbnZvbHZlIFN0cmluZ0J1ZmZlcgorCSAqIGNyZWF0aW9uOiBnb2luZyB0aHJvdWdoIHRoaXMgcGF0aCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgbmV3IFN0cmluZ0J1ZmZlcgorCSAqIGNyZWF0aW9uLCBmdXJ0aGVyIG9wZXJhbmRzIHNob3VsZCByYXRoZXIgYmUgb25seSBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBvbmUuCisJICogQnkgZGVmYXVsdDogbm8gb3B0aW1pemF0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQnVmZmVyKAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUsCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJaW50IHR5cGVJRCkgeworCisJCWdlbmVyYXRlQ29kZShibG9ja1Njb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJY29kZVN0cmVhbS5pbnZva2VTdHJpbmdCdWZmZXJBcHBlbmRGb3JUeXBlKHR5cGVJRCk7CisJfQorCisJLyogT3B0aW1pemVkIChqYXZhKSBjb2RlIGdlbmVyYXRpb24gZm9yIHN0cmluZyBjb25jYXRlbmF0aW9ucyB0aGF0IGludm9sdmUgU3RyaW5nQnVmZmVyCisJICogY3JlYXRpb246IGdvaW5nIHRocm91Z2ggdGhpcyBwYXRoIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBuZXcgU3RyaW5nQnVmZmVyCisJICogY3JlYXRpb24sIGZ1cnRoZXIgb3BlcmFuZHMgc2hvdWxkIHJhdGhlciBiZSBvbmx5IGFwcGVuZGVkIHRvIHRoZSBjdXJyZW50IG9uZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZFN0cmluZ0J1ZmZlckNyZWF0aW9uKAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJaW50IHR5cGVJRCkgeworCisJCS8vIE9wdGltaXphdGlvbiBvbmx5IGZvciBpbnRlZ2VycyBhbmQgc3RyaW5ncworCQlpZiAodHlwZUlEID09IFRfT2JqZWN0KSB7CisJCQkvLyBpbiB0aGUgY2FzZSB0aGUgcnVudGltZSB2YWx1ZSBvZiB2YWx1ZU9mKE9iamVjdCkgcmV0dXJucyBudWxsLCB3ZSBoYXZlIHRvIHVzZSBhcHBlbmQoT2JqZWN0KSBpbnN0ZWFkIG9mIGRpcmVjdGx5IHZhbHVlT2YoT2JqZWN0KQorCQkJLy8gYXBwZW5kKE9iamVjdCkgcmV0dXJucyBhcHBlbmQodmFsdWVPZihPYmplY3QpKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbnVsbCBjYXNlIGlzIGhhbmRsZWQgYnkgYXBwZW5kKFN0cmluZykuCisJCQljb2RlU3RyZWFtLm5ld1N0cmluZ0J1ZmZlcigpOworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nQnVmZmVyRGVmYXVsdENvbnN0cnVjdG9yKCk7CisJCQlnZW5lcmF0ZUNvZGUoYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0J1ZmZlckFwcGVuZEZvclR5cGUoVF9PYmplY3QpOworCQkJcmV0dXJuOworCQl9CisJCWNvZGVTdHJlYW0ubmV3U3RyaW5nQnVmZmVyKCk7CisJCWNvZGVTdHJlYW0uZHVwKCk7CisJCWlmICgodHlwZUlEID09IFRfU3RyaW5nKSB8fCAodHlwZUlEID09IFRfbnVsbCkpIHsKKwkJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQljb2RlU3RyZWFtLmxkYyhjb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2VuZXJhdGVDb2RlKGJsb2NrU2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCWNvZGVTdHJlYW0uaW52b2tlU3RyaW5nVmFsdWVPZihUX09iamVjdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlnZW5lcmF0ZUNvZGUoYmxvY2tTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ1ZhbHVlT2YodHlwZUlEKTsKKwkJfQorCQljb2RlU3RyZWFtLmludm9rZVN0cmluZ0J1ZmZlclN0cmluZ0NvbnN0cnVjdG9yKCk7CisJfQorCisJLy8gQmFzZSB0eXBlcyBuZWVkIHRoYXQgdGhlIHdpZGVuaW5nIGlzIGV4cGxpY2l0bHkgZG9uZSBieSB0aGUgY29tcGlsZXIgdXNpbmcgc29tZSBieXRlY29kZSBsaWtlIGkyZgorCXB1YmxpYyB2b2lkIGltcGxpY2l0V2lkZW5pbmcoCisJCVR5cGVCaW5kaW5nIHJ1bnRpbWVUaW1lVHlwZSwKKwkJVHlwZUJpbmRpbmcgY29tcGlsZVRpbWVUeXBlKSB7CisKKwkJaWYgKHJ1bnRpbWVUaW1lVHlwZSA9PSBudWxsIHx8IGNvbXBpbGVUaW1lVHlwZSA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWlmIChjb21waWxlVGltZVR5cGUuaWQgPT0gVF9udWxsKSB7CisJCQkvLyB0aGlzIGNhc2UgaXMgcG9zc2libGUgb25seSBmb3IgY29uc3RhbnQgbnVsbAorCQkJLy8gVGhlIHR5cGUgb2YgcnVudGltZSBpcyBhIHJlZmVyZW5jZSB0eXBlCisJCQkvLyBUaGUgY29kZSBnZW4gdXNlIHRoZSBjb25zdGFudCBpZCB0aHVzIGFueSB2YWx1ZQorCQkJLy8gZm9yIHRoZSBydW50aW1lIGlkIChha2FrIHRoZSA8PDQpIGNvdWxkIGJlIHVzZWQuCisJCQkvLyBUX09iamVjdCBpcyB1c2VkIGFzIHNvbWUgZ2VuZXJhbCBUX3JlZmVyZW5jZQorCQkJaW1wbGljaXRDb252ZXJzaW9uID0gKFRfT2JqZWN0IDw8IDQpICsgVF9udWxsOworCQkJcmV0dXJuOworCQl9CisKKwkJc3dpdGNoIChydW50aW1lVGltZVR5cGUuaWQpIHsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQljYXNlIFRfY2hhciA6CisJCQkJaW1wbGljaXRDb252ZXJzaW9uID0gKFRfaW50IDw8IDQpICsgY29tcGlsZVRpbWVUeXBlLmlkOworCQkJCWJyZWFrOworCQkJY2FzZSBUX1N0cmluZyA6CisJCQljYXNlIFRfZmxvYXQgOgorCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJY2FzZSBUX2RvdWJsZSA6CisJCQljYXNlIFRfaW50IDogLy9pbXBsaWNpdENvbnZlcnNpb24gbWF5IHJlc3VsdCBpbiBpMmkgd2hpY2ggd2lsbCByZXN1bHQgaW4gTk8gY29kZSBnZW4KKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlpbXBsaWNpdENvbnZlcnNpb24gPSAocnVudGltZVRpbWVUeXBlLmlkIDw8IDQpICsgY29tcGlsZVRpbWVUeXBlLmlkOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6IC8vbm90aGluZyBvbiByZWd1bGFyIG9iamVjdCByZWYKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSB7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vUmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgZG9uZSBBVVRPTUFUSUNBTExZIGJ5IHRoZSB2bQorCS8vd2hpbGUgdGhlIGphdmFWTSBpcyBhbiBpbnQgYmFzZWQtbWFjaGluZSwgdGh1cyBmb3IgZXhhbXBsZSBwdXNoaW5nCisJLy9hIGJ5dGUgb250byB0aGUgc3RhY2sgLCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGludCBvbiB0aGUgc3RhY2sKKwkvLyh0aGlzIHJlcXVlc3Qgc29tZSB3b3JrIGQgYmUgZG9uZSBieSB0aGUgVk0gb24gc2lnbmVkIG51bWJlcnMpCisJcHVibGljIGJvb2xlYW4gaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSgKKwkJVHlwZUJpbmRpbmcgY29uc3RhbnRUeXBlLAorCQlUeXBlQmluZGluZyB0YXJnZXRUeXBlKSB7CisKKwkJaWYgKGNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNvbnN0YW50VHlwZSA9PSB0YXJnZXRUeXBlKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChjb25zdGFudFR5cGUuaXNCYXNlVHlwZSgpICYmIHRhcmdldFR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCQkvL05vIGZyZWUgYXNzaWdubWVudCBjb252ZXJzaW9uIGZyb20gYW55dGhpbmcgYnV0IHRvIGludGVncmFsIG9uZXMuCisJCQlpZiAoKGNvbnN0YW50VHlwZSA9PSBJbnRCaW5kaW5nCisJCQkJfHwgQmFzZVR5cGVCaW5kaW5nLmlzV2lkZW5pbmcoVF9pbnQsIGNvbnN0YW50VHlwZS5pZCkpCisJCQkJJiYgKEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyh0YXJnZXRUeXBlLmlkLCBUX2ludCkpKSB7CisJCQkJLy91c2UgY3VycmVudCBleHBsaWNpdCBjb252ZXJzaW9uIGluIG9yZGVyIHRvIGdldCBzb21lIG5ldyB2YWx1ZSB0byBjb21wYXJlIHdpdGggY3VycmVudCBvbmUKKwkJCQlyZXR1cm4gaXNDb25zdGFudFZhbHVlUmVwcmVzZW50YWJsZShjb25zdGFudCwgY29uc3RhbnRUeXBlLmlkLCB0YXJnZXRUeXBlLmlkKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUeXBlUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCS8vIGRyb3BzIHRoZSByZXR1cm5pbmcgZXhwcmVzc2lvbidzIHR5cGUgd2hhdGV2ZXIgdGhlIHR5cGUgaXMuCisKKwkJdGhpcy5yZXNvbHZlVHlwZShzY29wZSk7CisJCXJldHVybjsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQkvLyBieSBkZWZhdWx0Li4uIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBhIGJldHRlciBUQyBpZiByZXF1aXJlZC4KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVFeHBlY3RpbmcoCisJCUJsb2NrU2NvcGUgc2NvcGUsCisJCVR5cGVCaW5kaW5nIGV4cGVjdGVkVGIpIHsKKworCQlUeXBlQmluZGluZyB0aGlzVGIgPSB0aGlzLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKHRoaXNUYiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmICghc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKHRoaXNUYiwgZXhwZWN0ZWRUYikpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKHRoaXNUYiwgZXhwZWN0ZWRUYiwgdGhpcyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpc1RiOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCS8vU3ViY2xhc3MgcmUtZGVmaW5lIHRvU3RyaW5nRXhwcmVzc2lvbgorCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpZiAoY29uc3RhbnQgIT0gbnVsbCkKKwkJCS8vYmVmb3JlIFRDIGhhcyBydW5uZWQKKwkJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCisJCQkJLy9hZnRlciB0aGUgVEMgaGFzIHJ1bm5lZAorCQkJCXMgKz0gIiAvKmNzdDoiICsgY29uc3RhbnQudG9TdHJpbmcoKSArICIqLyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmV0dXJuIHMgKyB0b1N0cmluZ0V4cHJlc3Npb24odGFiKTsKKwl9CisKKwkvL1N1YmNsYXNzIHJlLWRlZmluZSB0b1N0cmluZ0V4cHJlc3Npb24KKwkvL1RoaXMgbWV0aG9kIGlzIGFic3RyYWN0IGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCisJLy9idXQgd2UgcHJvdmlkZSBzb21lIGNvZGUgdGhhdCBpcyBydW5uaW5nLi4uLi5qdXN0IGluIGNhc2UKKwkvL29mIGRldmVsb3BwZW1lbnQgdGltZSAod2hpbGUgZXZlcnkgIHRoaW5nIGlzIG5vdCBidWlsdCkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoMCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgeworCQkvLyBkZWZhdWx0IGlzIHJlZ3VsYXIgdG9TdHJpbmcgZXhwcmVzc2lvbiAocXVhbGlmaWVkIGFsbG9jYXRpb24gZXhwcmVzc2lvbnMgcmVkaWZpbmUgdGhpcyBtZXRob2QpCisJCXJldHVybiB0aGlzLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIHRvVHlwZVJlZmVyZW5jZSgpIHsKKwkJLy9ieSBkZWZhdWx0IHVuZGVmaW5lZAorCisJCS8vdGhpcyBtZXRob2QgaXMgbWVhbmx5IHVzZWQgYnkgdGhlIHBhcnNlciBpbiBvcmRlciB0byB0cmFuc2Zvcm0KKwkJLy9hbiBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBhcyBhIHR5cGUgcmVmZXJlbmNlIGluIGEgY2FzdCAuLi4uCisJCS8vLS1hcHByZWNpYXRlIHRoZSBmYWN0IHRoYXQgY2FzdEV4cHJlc3Npb24gYW5kIEV4cHJlc3Npb25XaXRoUGFyZW50aGVzaXMKKwkJLy8tLXN0YXJ0cyB3aXRoIHRoZSBzYW1lIHBhdHRlcm4uLi4uLgorCisJCXJldHVybiB0aGlzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4dGVuZGVkU3RyaW5nTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYwNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKKworcHVibGljIGNsYXNzIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRzIFN0cmluZ0xpdGVyYWwgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRfU0laRSA9IDMwOworCisJLyoqIAorCSAqICBCdWlsZCBhIHN0cmluZytjaGFyIGxpdGVyYWwKKwkgKi8KKwlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsKFN0cmluZ0xpdGVyYWwgc3RyLCBDaGFyTGl0ZXJhbCBjaGFyYWN0ZXIpIHsKKworCQlzdXBlcihzdHIuc291cmNlLCBzdHIuc291cmNlU3RhcnQsIHN0ci5zb3VyY2VFbmQpOworCQlleHRlbmRXaXRoKGNoYXJhY3Rlcik7CisJfQorCisJLyoqCQorCSAqIEJ1aWxkIGEgdHdvLXN0cmluZ3MgbGl0ZXJhbAorCSAqICovCisJcHVibGljIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbChTdHJpbmdMaXRlcmFsIHN0cjEsIFN0cmluZ0xpdGVyYWwgc3RyMikgeworCisJCXN1cGVyKHN0cjEuc291cmNlLCBzdHIxLnNvdXJjZVN0YXJ0LCBzdHIxLnNvdXJjZUVuZCk7CisJCWV4dGVuZFdpdGgoc3RyMik7CisJfQorCisJLyoqCisJICogQWRkIHRoZSBsaXQgc291cmNlIHRvIG1pbmUsIGp1c3QgYXMgaWYgaXQgd2FzIG1pbmUKKwkgKi8KKwlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZFdpdGgoQ2hhckxpdGVyYWwgbGl0KSB7CisKKwkJLy91cGRhdGUgdGhlIHNvdXJjZQorCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIDAsIChzb3VyY2UgPSBuZXcgY2hhcltsZW5ndGggKyAxXSksIDAsIGxlbmd0aCk7CisJCXNvdXJjZVtsZW5ndGhdID0gbGl0LnZhbHVlOworCQkvL3Bvc2l0aW9uIGF0IHRoZSBlbmQgb2YgYWxsIGxpdGVyYWxzCisJCXNvdXJjZUVuZCA9IGxpdC5zb3VyY2VFbmQ7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqICBBZGQgdGhlIGxpdCBzb3VyY2UgdG8gbWluZSwganVzdCBhcyBpZiBpdCB3YXMgbWluZQorCSAqLworCXB1YmxpYyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXh0ZW5kV2l0aChTdHJpbmdMaXRlcmFsIGxpdCkgeworCisJCS8vdWRkYXRlIHRoZSBzb3VyY2UKKwkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlzb3VyY2UsCisJCQkwLAorCQkJc291cmNlID0gbmV3IGNoYXJbbGVuZ3RoICsgbGl0LnNvdXJjZS5sZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkobGl0LnNvdXJjZSwgMCwgc291cmNlLCBsZW5ndGgsIGxpdC5zb3VyY2UubGVuZ3RoKTsKKwkJLy9wb3NpdGlvbiBhdCB0aGUgZW5kIG9mIGFsbCBsaXRlcmFscworCQlzb3VyY2VFbmQgPSBsaXQuc291cmNlRW5kOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCQlTdHJpbmcgc3RyID0gIkV4dGVuZGVkU3RyaW5nTGl0ZXJhbHsiICsgbmV3IFN0cmluZyhzb3VyY2UpICsgIn0iOwkvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZhbHNlTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GYWxzZUxpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GYWxzZUxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBGYWxzZUxpdGVyYWwgZXh0ZW5kcyBNYWdpY0xpdGVyYWwgeworCXN0YXRpYyBmaW5hbCBjaGFyW10gc291cmNlID0geydmJywgJ2EnLCAnbCcsICdzJywgJ2UnfTsKK3B1YmxpYyBGYWxzZUxpdGVyYWwoaW50IHMgLCBpbnQgZSkgeworCXN1cGVyKHMsZSk7Cit9CitwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7CisKKwljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZShmYWxzZSk7fQorLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGZhbHNlIGxpdGVyYWwKKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlpZiAodmFsdWVSZXF1aXJlZCkKKwkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgTGFiZWwgdHJ1ZUxhYmVsLCBMYWJlbCBmYWxzZUxhYmVsLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCS8vIGZhbHNlTGFiZWwgYmVpbmcgbm90IG5pbCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGZhbGwgdGhyb3VnaCBpbnRvIHRoZSBGQUxTRSBjYXNlCisKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWlmIChmYWxzZUxhYmVsICE9IG51bGwpIHsKKwkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGZhbHNlTGFiZWwpOworCQkJfQorCQl9CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCXJldHVybiBCb29sZWFuQmluZGluZzsKK30KKy8qKgorICogCisgKi8KK3B1YmxpYyBjaGFyW10gc291cmNlKCkgeworCXJldHVybiBzb3VyY2U7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGREZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmE1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHsKKwlwdWJsaWMgRmllbGRCaW5kaW5nIGJpbmRpbmc7CisJYm9vbGVhbiBoYXNCZWVuUmVzb2x2ZWQgPSBmYWxzZTsKKworCS8vYWxsb3dzIHRvIHJldHJpZXZlIGJvdGggdGhlICJ0eXBlIiBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiAocGFydDEpCisJLy9hbmQgYWxzbyB0aGUgcGFydCB0aGF0IGRlY3JpYmUgdGhlIG5hbWUgYW5kIHRoZSBpbml0IGFuZCBvcHRpb25hbGx5CisJLy9zb21lIG90aGVyIGRpbWVuc2lvbiAhIC4uLi4gCisJLy9wdWJsaWMgaW50W10gYSwgYltdID0gWCwgYyA7CisJLy9mb3IgYiB0aGF0IHdvdWxkIGdpdmUgZm9yIAorCS8vIC0gcGFydDEgOiBwdWJsaWMgaW50W10KKwkvLyAtIHBhcnQyIDogYltdID0gWCwKKworCXB1YmxpYyBpbnQgZW5kUGFydDFQb3NpdGlvbjsKKwlwdWJsaWMgaW50IGVuZFBhcnQyUG9zaXRpb247CisKKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbigpIHsKKwl9CisKKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbigKKwkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiwKKwkJY2hhcltdIG5hbWUsCisJCWludCBzb3VyY2VTdGFydCwKKwkJaW50IHNvdXJjZUVuZCkgeworCisJCXRoaXMuaW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXphdGlvbjsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKworCQkvL2R1ZSB0byBzb21lIGRlY2xhcmF0aW9uIGxpa2UgCisJCS8vIGludCB4LCB5ID0gMywgeiAsIHggOworCQkvL3RoZSBzb3VyY2VTdGFydCBhbmQgdGhlIHNvdXJjZUVuZCBpcyBPTkxZIG9uICB0aGUgbmFtZQorCQl0aGlzLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7CisJCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJTWV0aG9kU2NvcGUgaW5pdGlhbGl6YXRpb25TY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJLy8gY2Fubm90IGRlZmluZSBzdGF0aWMgbm9uLWNvbnN0YW50IGZpZWxkIGluc2lkZSBuZXN0ZWQgY2xhc3MKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbAorCQkJJiYgYmluZGluZy5pc1ZhbGlkQmluZGluZygpCisJCQkmJiBiaW5kaW5nLmlzU3RhdGljKCkKKwkJCSYmIGJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50CisJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpCisJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzQ2xhc3MoKQorCQkJJiYgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNTdGF0aWMoKSkgeworCQkJaW5pdGlhbGl6YXRpb25TY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmV4cGVjdGVkU3RhdGljTW9kaWZpZXJGb3JGaWVsZCgKKwkJCQkoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJdGhpcyk7CisJCX0KKworCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJZmxvd0luZm8gPQorCQkJCWluaXRpYWxpemF0aW9uCisJCQkJCS5hbmFseXNlQ29kZShpbml0aWFsaXphdGlvblNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCisJCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChiaW5kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChiaW5kaW5nKTsKKwkJCS8vIGNsZWFyIHRoZSBiaXQgaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBzZXQgKGZyb20gZW5jbG9zaW5nIGluZm8pCisJCX0KKwkJcmV0dXJuIGZsb3dJbmZvOworCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBmaWVsZCBkZWNsYXJhdGlvbjoKKwkgKglpLmUuJm5ic3A7bm9ybWFsIGFzc2lnbm1lbnQgdG8gYSBmaWVsZCAKKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gZG8gbm90IGdlbmVyYXRlIGluaXRpYWxpemF0aW9uIGNvZGUgaWYgZmluYWwgYW5kIHN0YXRpYyAoY29uc3RhbnQgaXMgdGhlbgorCQkvLyByZWNvcmRlZCBpbnNpZGUgdGhlIGZpZWxkIGl0c2VsZikuCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWJvb2xlYW4gaXNTdGF0aWM7CisJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsCisJCQkmJiAhKChpc1N0YXRpYyA9IGJpbmRpbmcuaXNTdGF0aWMoKSkgJiYgYmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKSB7CisJCQkvLyBub24tc3RhdGljIGZpZWxkLCBuZWVkIHJlY2VpdmVyCisJCQlpZiAoIWlzU3RhdGljKQorCQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCQkJLy8gZ2VuZXJhdGUgaW5pdGlhbGl6YXRpb24gdmFsdWUKKwkJCWluaXRpYWxpemF0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJLy8gc3RvcmUgaW50byBmaWVsZAorCQkJaWYgKGlzU3RhdGljKSB7CisJCQkJY29kZVN0cmVhbS5wdXRzdGF0aWMoYmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoYmluZGluZyk7CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKKworCQlyZXR1cm4gdHlwZS5nZXRUeXBlQmluZGluZyhzY29wZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKworCQlpZiAoYmluZGluZyAhPSBudWxsKQorCQkJcmV0dXJuIGJpbmRpbmcuaXNTdGF0aWMoKTsKKwkJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDA7CisJfQorCisJcHVibGljIFN0cmluZyBuYW1lKCkgeworCisJCXJldHVybiBTdHJpbmcudmFsdWVPZihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKE1ldGhvZFNjb3BlIGluaXRpYWxpemF0aW9uU2NvcGUpIHsKKworCQkvLyB0aGUgdHdvIDxjb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudD4gY291bGQgYmUgcmVncm91cGVkIGludG8KKwkJLy8gYSBzaW5nbGUgbGluZSBidXQgaXQgaXMgY2xlYXJlciB0byBoYXZlIHR3byBsaW5lcyB3aGlsZSB0aGUgcmVhc29uIG9mIHRoZWlyCisJCS8vIGV4aXN0ZW5jZSBpcyBub3QgYXQgYWxsIHRoZSBzYW1lLiBTZWUgY29tbWVudCBmb3IgdGhlIHNlY29uZCBvbmUuCisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQlpZiAoIXRoaXMuaGFzQmVlblJlc29sdmVkICYmIGJpbmRpbmcgIT0gbnVsbCAmJiB0aGlzLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCisJCQl0aGlzLmhhc0JlZW5SZXNvbHZlZCA9IHRydWU7CisKKwkJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZy50eXBlLCBpbml0aWFsaXphdGlvblNjb3BlKSkKKwkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKHRoaXMuYmluZGluZy50eXBlLCB0aGlzLnR5cGUpOworCisJCQl0aGlzLnR5cGUuYmluZGluZyA9IHRoaXMuYmluZGluZy50eXBlOyAvLyB1cGRhdGUgYmluZGluZyBmb3IgdHlwZSByZWZlcmVuY2UKKworCQkJLy8gdGhlIHJlc29sdXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGhhc24ndCBiZWVuIGRvbmUKKwkJCWlmICh0aGlzLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKKwkJCQl0aGlzLmJpbmRpbmcuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQl9IGVsc2UgeworCQkJCWludCBwcmV2aW91cyA9IGluaXRpYWxpemF0aW9uU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4OworCQkJCXRyeSB7CisJCQkJCWluaXRpYWxpemF0aW9uU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ID0gdGhpcy5iaW5kaW5nLmlkOworCisJCQkJCS8vIGJyZWFrIGRlYWQtbG9jayBjeWNsZXMgYnkgZm9yY2luZyBjb25zdGFudCB0byBOb3RBQ29uc3RhbnQKKwkJCQkJdGhpcy5iaW5kaW5nLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJCQkKKwkJCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcudHlwZTsKKwkJCQkJVHlwZUJpbmRpbmcgaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZzsKKwkJCQkJCisJCQkJCWlmIChpbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKKworCQkJCQkJaWYgKChpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nID0gdGhpcy5pbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhpbml0aWFsaXphdGlvblNjb3BlLCB0eXBlQmluZGluZykpIAkhPSBudWxsKSB7CisJCQkJCQkJKChBcnJheUluaXRpYWxpemVyKSB0aGlzLmluaXRpYWxpemF0aW9uKS5iaW5kaW5nID0gKEFycmF5QmluZGluZykgaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZzsKKwkJCQkJCQl0aGlzLmluaXRpYWxpemF0aW9uLmltcGxpY2l0V2lkZW5pbmcodHlwZUJpbmRpbmcsIGluaXRpYWxpemF0aW9uVHlwZUJpbmRpbmcpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKChpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nID0gaW5pdGlhbGl6YXRpb24ucmVzb2x2ZVR5cGUoaW5pdGlhbGl6YXRpb25TY29wZSkpICE9IG51bGwpIHsKKworCQkJCQkJaWYgKHRoaXMuaW5pdGlhbGl6YXRpb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nLCB0eXBlQmluZGluZykKKwkJCQkJCQl8fCAodHlwZUJpbmRpbmcuaXNCYXNlVHlwZSgpICYmIEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKHR5cGVCaW5kaW5nLmlkLCBpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nLmlkKSkpIHsKKworCQkJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24uaW1wbGljaXRXaWRlbmluZyh0eXBlQmluZGluZywgaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZyk7CisKKwkJCQkJCX0JZWxzZSBpZiAoaW5pdGlhbGl6YXRpb25TY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZywgdHlwZUJpbmRpbmcpKSB7CisJCQkJCQkJdGhpcy5pbml0aWFsaXphdGlvbi5pbXBsaWNpdFdpZGVuaW5nKHR5cGVCaW5kaW5nLCBpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nKTsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGluaXRpYWxpemF0aW9uVHlwZUJpbmRpbmcsIHR5cGVCaW5kaW5nLCB0aGlzKTsKKwkJCQkJCX0KKwkJCQkJCWlmICh0aGlzLmJpbmRpbmcuaXNGaW5hbCgpKXsgLy8gY2FzdCBmcm9tIGNvbnN0YW50IGFjdHVhbCB0eXBlIHRvIHZhcmlhYmxlIHR5cGUKKwkJCQkJCQl0aGlzLmJpbmRpbmcuY29uc3RhbnQgPQorCQkJCQkJCQl0aGlzLmluaXRpYWxpemF0aW9uLmNvbnN0YW50LmNhc3RUbygKKwkJCQkJCQkJCSh0aGlzLmJpbmRpbmcudHlwZS5pZCA8PCA0KSArIHRoaXMuaW5pdGlhbGl6YXRpb24uY29uc3RhbnQudHlwZUlEKCkpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJdGhpcy5iaW5kaW5nLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJCQl9CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaW5pdGlhbGl6YXRpb25TY29wZS5maWVsZERlY2xhcmF0aW9uSW5kZXggPSBwcmV2aW91czsKKwkJCQkJaWYgKHRoaXMuYmluZGluZy5jb25zdGFudCA9PSBudWxsKQorCQkJCQkJdGhpcy5iaW5kaW5nLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKQorCQkJCWluaXRpYWxpemF0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzc1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw1NjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgRmllbGRSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2UgaW1wbGVtZW50cyBJbnZvY2F0aW9uU2l0ZSB7CisKKwlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlcjsKKwlwdWJsaWMgY2hhcltdIHRva2VuOworCXB1YmxpYyBGaWVsZEJpbmRpbmcgYmluZGluZywgY29kZWdlbkJpbmRpbmc7CisJcHVibGljIGxvbmcgbmFtZVNvdXJjZVBvc2l0aW9uOyAvLyhzdGFydDw8MzIpK2VuZAorCU1ldGhvZEJpbmRpbmcgc3ludGhldGljUmVhZEFjY2Vzc29yLCBzeW50aGV0aWNXcml0ZUFjY2Vzc29yOworCXB1YmxpYyBUeXBlQmluZGluZyByZWNlaXZlclR5cGU7CisKKwlwdWJsaWMgRmllbGRSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKworCQl0b2tlbiA9IHNvdXJjZTsKKwkJbmFtZVNvdXJjZVBvc2l0aW9uID0gcG9zOworCQkvL2J5IGRlZmF1bHQgdGhlIHBvc2l0aW9uIGFyZSB0aGUgb25lIG9mIHRoZSBmaWVsZCAobm90IHRydWUgZm9yIHN1cGVyIGFjY2VzcykKKwkJc291cmNlU3RhcnQgPSAoaW50KSAocG9zID4+PiAzMik7CisJCXNvdXJjZUVuZCA9IChpbnQpIChwb3MgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKKwkJYml0cyB8PSBCaW5kaW5nSWRzLkZJRUxEOworCisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvLAorCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCWJvb2xlYW4gaXNDb21wb3VuZCkgeworCisJCS8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgZXh0cmEgd29yaworCQlpZiAoaXNDb21wb3VuZCkgeyAvLyBjaGVjayB0aGUgdmFyaWFibGUgcGFydCBpcyBpbml0aWFsaXplZCBpZiBibGFuayBmaW5hbAorCQkJaWYgKGJpbmRpbmcuaXNGaW5hbCgpCisJCQkJJiYgcmVjZWl2ZXIuaXNUaGlzKCkKKwkJCQkmJiBjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGJpbmRpbmcpCisJCQkJJiYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChiaW5kaW5nKSkpIHsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChiaW5kaW5nLCB0aGlzKTsKKwkJCQkvLyB3ZSBjb3VsZCBpbXByb3ZlIGVycm9yIG1zZyBoZXJlIHRlbGxpbmcgImNhbm5vdCB1c2UgY29tcG91bmQgYXNzaWdubWVudCBvbiBmaW5hbCBibGFuayBmaWVsZCIKKwkJCX0KKwkJCW1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCQl9CisJCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24gIT0gbnVsbCkgeworCQkJZmxvd0luZm8gPQorCQkJCWFzc2lnbm1lbnQKKwkJCQkJLmV4cHJlc3Npb24KKwkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQorCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0KKwkJZmxvd0luZm8gPQorCQkJcmVjZWl2ZXIKKwkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sICFiaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQltYW5hZ2VTeW50aGV0aWNXcml0ZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CisKKwkJLy8gY2hlY2sgaWYgYXNzaWduaW5nIGEgZmluYWwgZmllbGQgCisJCWlmIChiaW5kaW5nLmlzRmluYWwoKSkgeworCQkJLy8gaW4gYSBjb250ZXh0IHdoZXJlIGl0IGNhbiBiZSBhc3NpZ25lZD8KKwkJCWlmIChyZWNlaXZlci5pc1RoaXMoKQorCQkJCSYmICEocmVjZWl2ZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlKQorCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoYmluZGluZykpIHsKKwkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKGJpbmRpbmcpKSB7CisJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAorCQkJCQkJYmluZGluZywKKwkJCQkJCXRoaXMpOworCQkJCX0KKwkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZyk7CisJCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGJpbmRpbmcsIHRoaXMpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBhc3NpZ25pbmcgYSBmaW5hbCBmaWVsZCBvdXRzaWRlIGFuIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yCisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChiaW5kaW5nLCB0aGlzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmxvd0luZm87CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCXJlY2VpdmVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCAhYmluZGluZy5pc1N0YXRpYygpKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCW1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCQl9CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwlwdWJsaWMgRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZygpIHsKKworCQlyZXR1cm4gYmluZGluZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKAorCQkJY3VycmVudFNjb3BlLAorCQkJY29kZVN0cmVhbSwKKwkJCSF0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpOworCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCWZpZWxkU3RvcmUoCisJCQljb2RlU3RyZWFtLAorCQkJdGhpcy5jb2RlZ2VuQmluZGluZywKKwkJCXN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsCisJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJfQorCisJLyoqCisJICogRmllbGQgcmVmZXJlbmNlIGNvZGUgZ2VuZXJhdGlvbgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlib29sZWFuIGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOworCQkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQljb2RlU3RyZWFtLAorCQkJCXZhbHVlUmVxdWlyZWQgJiYgKCFpc1N0YXRpYykgJiYgKHRoaXMuY29kZWdlbkJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSk7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkgeworCQkJCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7IC8vIGFycmF5IGxlbmd0aAorCQkJCQkJY29kZVN0cmVhbS5hcnJheWxlbmd0aCgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHN5bnRoZXRpY1JlYWRBY2Nlc3NvciA9PSBudWxsKSB7CisJCQkJCQkJaWYgKGlzU3RhdGljKSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNSZWFkQWNjZXNzb3IpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb2RlZ2VuQmluZGluZy5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudCgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJRXhwcmVzc2lvbiBleHByZXNzaW9uLAorCQlpbnQgb3BlcmF0b3IsCisJCWludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlib29sZWFuIGlzU3RhdGljOworCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoCisJCQljdXJyZW50U2NvcGUsCisJCQljb2RlU3RyZWFtLAorCQkJIShpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOworCQlpZiAoaXNTdGF0aWMpIHsKKwkJCWlmIChzeW50aGV0aWNSZWFkQWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNSZWFkQWNjZXNzb3IpOworCQkJfQorCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWlmIChzeW50aGV0aWNSZWFkQWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY1JlYWRBY2Nlc3Nvcik7CisJCQl9CisJCX0KKwkJaW50IG9wZXJhdGlvblR5cGVJRDsKKwkJaWYgKChvcGVyYXRpb25UeXBlSUQgPSBpbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgPT0gVF9TdHJpbmcpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdBcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHByb21vdGUgdGhlIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgc3VpdGFibGUgb3BlcmF0aW9uIHR5cGUKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpIHsgLy8gcHJlZml4IG9wZXJhdGlvbgorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJfSBlbHNlIHsKKwkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfQorCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWZpZWxkU3RvcmUoCisJCQljb2RlU3RyZWFtLAorCQkJdGhpcy5jb2RlZ2VuQmluZGluZywKKwkJCXN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsCisJCQl2YWx1ZVJlcXVpcmVkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUNvbXBvdW5kQXNzaWdubWVudCBwb3N0SW5jcmVtZW50LAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlib29sZWFuIGlzU3RhdGljOworCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoCisJCQljdXJyZW50U2NvcGUsCisJCQljb2RlU3RyZWFtLAorCQkJIShpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOworCQlpZiAoaXNTdGF0aWMpIHsKKwkJCWlmIChzeW50aGV0aWNSZWFkQWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNSZWFkQWNjZXNzb3IpOworCQkJfQorCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWlmIChzeW50aGV0aWNSZWFkQWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKHN5bnRoZXRpY1JlYWRBY2Nlc3Nvcik7CisJCQl9CisJCX0KKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmIChpc1N0YXRpYykgeworCQkJCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKQorCQkJCQl8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KKwkJCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykKKwkJCQkJfHwgKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoCisJCQlwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsCisJCQlpbXBsaWNpdENvbnZlcnNpb24pOworCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUuaWQpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKAorCQkJcG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCB0aGlzLmNvZGVnZW5CaW5kaW5nLCBzeW50aGV0aWNXcml0ZUFjY2Vzc29yLCBmYWxzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBnZXRDb25zdGFudEZvcigKKwkJRmllbGRCaW5kaW5nIGJpbmRpbmcsCisJCWJvb2xlYW4gaW1wbGljaXRSZWNlaXZlciwKKwkJUmVmZXJlbmNlIHJlZmVyZW5jZSwKKwkJU2NvcGUgcmVmZXJlbmNlU2NvcGUsCisJCWludCBpbmRleEluUXVhbGlmaWNhdGlvbikgeworCisJCS8vcHJvcGFnYXRpb24gb2YgdGhlIGNvbnN0YW50LgorCisJCS8vcmVmIGNhbiBiZSBhIEZpZWxkUmVmZXJlbmNlLCBhIFNpbmdsZU5hbWVSZWZlcmVuY2Ugb3IgYSBRdWFsaWZpZWROYW1lUmVmZXJlbmNlCisJCS8vaW5kZXhJblF1YWxpZmljYXRpb24gbWF5IGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gemVybyBvbmx5IGZvciBRdWFsaWZpZWRuYW1lUmVmZXJlbmNlCisJCS8vaWYgcmVmPT1udWxsIHRoZW4gaW5kZXhJblF1YWxpZmljYXRpb249PTAgQU5EIGltcGxpY2l0UmVjZWl2ZXIgPT0gZmFsc2UuIFRoaXMgY2FzZSBpcyBhIAorCQkvL2RlZ2VuZXJhdGVkIGNhc2Ugd2hlcmUgYSBmYWtlIHJlZmVyZW5jZSBmaWVsZCAobnVsbCkgCisJCS8vaXMgYXNzb2NpdGVkIHRvIGEgcmVhbCBGaWVsZEJpbmRpbmcgaW4gb3JkZXIgCisJCS8vdG8gYWxsb3cgaXRzIGNvbnN0YW50IGNvbXB1dGF0aW9uIHVzaW5nIHRoZSByZWd1bGFyIHBhdGggKGkuZS4gZmluZCB0aGUgZmllbGREZWNsYXJhdGlvbgorCQkvL2FuZCBwcm9jZWVkIHRvIGl0cyB0eXBlIHJlc29sdXRpb24pLiBBcyBpbXBsaWNpdFJlY2VpdmVyIGlzIGZhbHNlLCBubyBlcnJvciByZXBvcnRpbmcKKwkJLy9hZ2FpbnN0IHJlZiB3aWxsIGJlIHVzZWQgPT0+IG5vIG51bGxQb2ludGVyRXhjZXB0aW9uIHJpc2sgLi4uLiAKKworCQkvL3NwZWNpYWwgdHJlYXRtZW50IGZvciBsYW5nYWdlLWJ1aWx0LWluICBmaWVsZCAodGhlaXIgZGVjbGFyaW5nIGNsYXNzIGlzIG51bGwpCisJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsKKwkJCS8vY3VycmVudGx5IG9ubHkgb25lIGZpZWxkICJsZW5ndGgiIDogdGhlIGNvbnN0YW50IGNvbXB1dGF0aW9uIGlzIG5ldmVyIGRvbmUKKwkJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJCX0KKwkJaWYgKCFiaW5kaW5nLmlzRmluYWwoKSkgeworCQkJcmV0dXJuIGJpbmRpbmcuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCX0KKwkJaWYgKGJpbmRpbmcuY29uc3RhbnQgIT0gbnVsbCkgeworCQkJaWYgKGluZGV4SW5RdWFsaWZpY2F0aW9uID09IDApIHsKKwkJCQlyZXR1cm4gYmluZGluZy5jb25zdGFudDsKKwkJCX0KKwkJCS8vc2VlIHByZXZpb3VzIGNvbW1lbnQgZm9yIHRoZSAoc291bGQtYWx3YXlzLWJlKSB2YWxpZCBjYXN0CisJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHF1YWxpZmllZFJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWZlcmVuY2U7CisJCQlpZiAoaW5kZXhJblF1YWxpZmljYXRpb24gPT0gKHF1YWxpZmllZFJlZmVyZW5jZS5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgLSAxKSkgeworCQkJCXJldHVybiBiaW5kaW5nLmNvbnN0YW50OworCQkJfQorCQkJcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJfQorCisJCS8vVGhlIGZpZWxkIGhhcyBub3QgYmVlbiB5ZXQgdHlwZSBjaGVja2VkLgorCQkvL0l0IGFsc28gbWVhbnMgdGhhdCB0aGUgZmllbGQgaXMgbm90IGNvbWluZyBmcm9tIGEgY2xhc3MgdGhhdAorCQkvL2hhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQuIEl0IGNhbiBvbmx5IGJlIGZyb20gYSBjbGFzcyB3aXRoaW4KKwkJLy9jb21waWxhdGlvbiB1bml0cyB0byBwcm9jZXNzLiBUaHVzIHRoZSBmaWVsZCBpcyBOT1QgZnJvbSBhIEJpbmFyeVR5cGVCaW5iaW5nCisKKwkJU291cmNlVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHR5cGVCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZGVjbGFyYXRpb25PZihiaW5kaW5nKTsKKworCQkvL3doYXQgc2NvcGUgdG8gdXNlIChkZXBlbmQgb24gdGhlIHN0YXRpY25lc3Mgb2YgdGhlIGZpZWxkIGJpbmRpbmcpCisJCU1ldGhvZFNjb3BlIGZpZWxkU2NvcGUgPQorCQkJYmluZGluZy5pc1N0YXRpYygpCisJCQkJPyB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlCisJCQkJOiB0eXBlRGVjbC5pbml0aWFsaXplclNjb3BlOworCisJCWlmIChpbXBsaWNpdFJlY2VpdmVyKSB7IC8vRGV0ZXJtaW5lIGlmIHRoZSByZWYgaXMgbGVnYWwgaW4gdGhlIGN1cnJlbnQgY2xhc3Mgb2YgdGhlIGZpZWxkCisJCQkvL2kuZS4gbm90IGEgZm9yd2FyZCByZWZlcmVuY2UgLi4uLiAodGhleSBhcmUgYWxsb3dlZCB3aGVuIHRoZSByZWNlaXZlciBpcyBleHBsaWNpdCAhIC4uLiBQbGVhc2UgZG9uJ3QgYXNrIG1lIHdoeSAhLi4ueWV0IGFub3RoZXIgamF2YSBteXN0ZXJ5Li4uKQorCQkJaWYgKGZpZWxkU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ID09IE1ldGhvZFNjb3BlLk5vdEluRmllbGREZWNsKSB7CisJCQkJLy8gbm8gZmllbGQgaXMgY3VycmVudGx5IGJlaW5nIGFuYWx5c2VkIGluIHR5cGVEZWNsCisJCQkJZmllbGREZWNsLnJlc29sdmUoZmllbGRTY29wZSk7IC8vc2lkZSBlZmZlY3Qgb24gYmluZGluZyA6LSkgLi4uIAorCQkJCXJldHVybiBiaW5kaW5nLmNvbnN0YW50OworCQkJfQorCQkJLy9XZSBhcmUgcmUtZW50ZXJpbmcgdGhlIHNhbWUgY2xhc3MgZmllbGRzIGFuYWx5c2luZworCQkJaWYgKChyZWZlcmVuY2UgIT0gbnVsbCkKKwkJCQkmJiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSByZWZlcmVuY2VTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpIC8vIG9ubHkgY29tcGxhaW4gZm9yIGFjY2VzcyBpbnNpZGUgc2FtZSB0eXBlCisJCQkJJiYgKGJpbmRpbmcuaWQgPiBmaWVsZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCkpIHsKKwkJCQkvL2ZvcndhcmQgcmVmZXJlbmNlLiBUaGUgZGVjbGFyYXRpb24gcmVtYWlucyB1bnJlc29sdmVkLgorCQkJCXJlZmVyZW5jZVNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZvcndhcmRSZWZlcmVuY2UocmVmZXJlbmNlLCBpbmRleEluUXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOworCQkJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJCQl9CisJCQlmaWVsZERlY2wucmVzb2x2ZShmaWVsZFNjb3BlKTsgLy9zaWRlIGVmZmVjdCBvbiBiaW5kaW5nIDotKSAuLi4gCisJCQlyZXR1cm4gYmluZGluZy5jb25zdGFudDsKKwkJfQorCQkvL3RoZSBmaWVsZCByZWZlcmVuY2UgaXMgZXhwbGljaXR5LiBJdCBoYXMgdG8gYmUgYSAic2ltcGxlIiBsaWtlIGZpZWxkIHJlZmVyZW5jZSB0byBnZXQgdGhlCisJCS8vY29uc3RhbnQgcHJvcGFnYXRpb24uIEZvciBleGFtcGxlIGluIFBhY2thaGUuVHlwZS5maWVsZDEuZmllbGQyICwgZmllbGQxIG1heSBoYXZlIGl0cworCQkvL2NvbnN0YW50IGhhdmluZyBhIHByb3BhZ2F0aW9uIHdoZXJlIGZpZWxkMiBpcyBhbHdheXMgbm90IHByb3BhZ2F0aW5nIGl0cworCQlpZiAoaW5kZXhJblF1YWxpZmljYXRpb24gPT0gMCkgeworCQkJZmllbGREZWNsLnJlc29sdmUoZmllbGRTY29wZSk7IC8vc2lkZSBlZmZlY3Qgb24gYmluZGluZyA6LSkgLi4uIAorCQkJcmV0dXJuIGJpbmRpbmcuY29uc3RhbnQ7CisJCX0KKwkJLy8gU2lkZS1lZmZlY3Qgb24gdGhlIGZpZWxkIGJpbmRpbmcgbWF5IG5vdCBiZSBwcm9wYWdhdGVkIG91dCBmb3IgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UKKwkJLy8gdW5sZXNzIGl0IG9jY3VycyBpbiBmaXJzdCBwbGFjZSBvZiB0aGUgbmFtZSBzZXF1ZW5jZQorCQlmaWVsZERlY2wucmVzb2x2ZShmaWVsZFNjb3BlKTsgLy9zaWRlIGVmZmVjdCBvbiBiaW5kaW5nIDotKSAuLi4gCisJCS8vc2VlIHByZXZpb3VzIGNvbW1lbnQgZm9yIHRoZSBjYXN0IHRoYXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHF1YWxpZmllZFJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWZlcmVuY2U7CisJCWlmIChpbmRleEluUXVhbGlmaWNhdGlvbiA9PSAocXVhbGlmaWVkUmVmZXJlbmNlLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyAtIDEpKSB7CisJCQlyZXR1cm4gYmluZGluZy5jb25zdGFudDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1N1cGVyQWNjZXNzKCkgeworCisJCXJldHVybiByZWNlaXZlci5pc1N1cGVyKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgeworCisJCXJldHVybiByZWNlaXZlciAhPSBudWxsICYmIHJlY2VpdmVyLmlzVHlwZVJlZmVyZW5jZSgpOworCX0KKworCS8qCisJICogTm8gbmVlZCB0byBlbXVsYXRlIGFjY2VzcyB0byBwcm90ZWN0ZWQgZmllbGRzIHNpbmNlIG5vdCBpbXBsaWNpdGx5IGFjY2Vzc2VkCisJICovCisJcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CisKKwkJaWYgKGJpbmRpbmcuaXNQcml2YXRlKCkpIHsKKwkJCWlmICgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKQorCQkJCSYmIChiaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkpIHsKKwkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3IgPQorCQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZywgdHJ1ZSk7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCX0gZWxzZSBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgeyAvLyBxdWFsaWZpZWQgc3VwZXIKKworCQkJLy8gcXVhbGlmaWVkIHN1cGVyIG5lZWQgZW11bGF0aW9uIGFsd2F5cworCQkJU291cmNlVHlwZUJpbmRpbmcgZGVzdGluYXRpb25UeXBlID0KKwkJCQkoU291cmNlVHlwZUJpbmRpbmcpICgoKFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSByZWNlaXZlcikKKwkJCQkJLmN1cnJlbnRDb21wYXRpYmxlVHlwZSk7CisJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3IgPSBkZXN0aW5hdGlvblR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcsIHRydWUpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCQlyZXR1cm47CisKKwkJfSBlbHNlIGlmIChiaW5kaW5nLmlzUHJvdGVjdGVkKCkpIHsKKworCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nU291cmNlVHlwZTsKKwkJCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApCisJCQkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkKKwkJCQkJIT0gKGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKS5nZXRQYWNrYWdlKCkpIHsKKworCQkJCVNvdXJjZVR5cGVCaW5kaW5nIGN1cnJlbnRDb21wYXRpYmxlVHlwZSA9CisJCQkJCShTb3VyY2VUeXBlQmluZGluZykgZW5jbG9zaW5nU291cmNlVHlwZS5lbmNsb3NpbmdUeXBlQXQoCisJCQkJCQkoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJc3ludGhldGljUmVhZEFjY2Vzc29yID0gY3VycmVudENvbXBhdGlibGVUeXBlLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nLCB0cnVlKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyhiaW5kaW5nLCB0aGlzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCisJCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMucmVjZWl2ZXJUeXBlCisJCQkmJiAhdGhpcy5yZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQorCQkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsIC8vIGFycmF5Lmxlbmd0aAorCQkJJiYgYmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCisJCQkvL25vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcyAoaW4gY2FzZSB0aGVyZSB3YXMpCisJCQkJfHwgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpIHsKKwkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPQorCQkJCWN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZygKKwkJCQkJYmluZGluZywKKwkJCQkJKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVjZWl2ZXJUeXBlKTsKKwkJfQorCX0KKworCS8qCisJICogTm8gbmVlZCB0byBlbXVsYXRlIGFjY2VzcyB0byBwcm90ZWN0ZWQgZmllbGRzIHNpbmNlIG5vdCBpbXBsaWNpdGx5IGFjY2Vzc2VkCisJICovCisJcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljV3JpdGVBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpKSB7CisJCQlpZiAoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSAhPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSB7CisJCQkJc3ludGhldGljV3JpdGVBY2Nlc3NvciA9CisJCQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nLCBmYWxzZSk7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzKGJpbmRpbmcsIHRoaXMpOworCQkJCXJldHVybjsKKwkJCX0KKworCQl9IGVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIHsgLy8gcXVhbGlmaWVkIHN1cGVyCisKKwkJCS8vIHF1YWxpZmllZCBzdXBlciBuZWVkIGVtdWxhdGlvbiBhbHdheXMKKwkJCVNvdXJjZVR5cGVCaW5kaW5nIGRlc3RpbmF0aW9uVHlwZSA9CisJCQkJKFNvdXJjZVR5cGVCaW5kaW5nKSAoKChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgcmVjZWl2ZXIpCisJCQkJCS5jdXJyZW50Q29tcGF0aWJsZVR5cGUpOworCQkJc3ludGhldGljV3JpdGVBY2Nlc3NvciA9IGRlc3RpbmF0aW9uVHlwZS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZywgZmFsc2UpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzKGJpbmRpbmcsIHRoaXMpOworCQkJcmV0dXJuOworCisJCX0gZWxzZSBpZiAoYmluZGluZy5pc1Byb3RlY3RlZCgpKSB7CisKKwkJCVNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGU7CisJCQlpZiAoKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKQorCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpCisJCQkJCSE9IChlbmNsb3NpbmdTb3VyY2VUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSkuZ2V0UGFja2FnZSgpKSB7CisKKwkJCQlTb3VyY2VUeXBlQmluZGluZyBjdXJyZW50Q29tcGF0aWJsZVR5cGUgPQorCQkJCQkoU291cmNlVHlwZUJpbmRpbmcpIGVuY2xvc2luZ1NvdXJjZVR5cGUuZW5jbG9zaW5nVHlwZUF0KAorCQkJCQkJKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOworCQkJCXN5bnRoZXRpY1dyaXRlQWNjZXNzb3IgPQorCQkJCQljdXJyZW50Q29tcGF0aWJsZVR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcsIGZhbHNlKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgorCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZworCQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLnJlY2VpdmVyVHlwZQorCQkJJiYgIXRoaXMucmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKKwkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKKwkJCSYmIGJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50CisJCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KQorCQkJLy9ubyBjaGFuZ2UgZm9yIE9iamVjdCBmaWVsZHMgKGluIGNhc2UgdGhlcmUgd2FzKQorCQkJCXx8ICFiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKSB7CisJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0KKwkJCQljdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoCisJCQkJCWJpbmRpbmcsCisJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlY2VpdmVyVHlwZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCS8vIEFuc3dlciB0aGUgc2lnbmF0dXJlIHR5cGUgb2YgdGhlIGZpZWxkLgorCQkvLyBjb25zdGFudHMgYXJlIHByb3BhZ2VkIHdoZW4gdGhlIGZpZWxkIGlzIGZpbmFsCisJCS8vIGFuZCBpbml0aWFsaXplZCB3aXRoIGEgKGNvbXBpbGUgdGltZSkgY29uc3RhbnQgCisKKwkJLy8gcmVndWxhciByZWNlaXZlciByZWZlcmVuY2UgCisJCXRoaXMucmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAodGhpcy5yZWNlaXZlclR5cGUgPT0gbnVsbCkgeworCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkvLyB0aGUgY2FzZSByZWNlaXZlclR5cGUuaXNBcnJheVR5cGUgYW5kIHRva2VuID0gJ2xlbmd0aCcgaXMgaGFuZGxlZCBieSB0aGUgc2NvcGUgQVBJCisJCXRoaXMuY29kZWdlbkJpbmRpbmcgPQorCQkJdGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0RmllbGQodGhpcy5yZWNlaXZlclR5cGUsIHRva2VuLCB0aGlzKTsKKwkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIHRoaXMucmVjZWl2ZXJUeXBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChiaW5kaW5nLCB0aGlzKTsKKworCQkvLyBjaGVjayBmb3IgdGhpcy54IGluIHN0YXRpYyBpcyBkb25lIGluIHRoZSByZXNvbHV0aW9uIG9mIHRoZSByZWNlaXZlcgorCQljb25zdGFudCA9CisJCQlGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcigKKwkJCQliaW5kaW5nLAorCQkJCXJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0LAorCQkJCXRoaXMsCisJCQkJc2NvcGUsCisJCQkJMCk7CisJCWlmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCkKKwkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCisJCXJldHVybiBiaW5kaW5nLnR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJCS8vIGlnbm9yZWQKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpIHsKKworCQlpZiAoZGVwdGggPiAwKSB7CisJCQliaXRzICY9IH5EZXB0aE1BU0s7IC8vIGZsdXNoIHByZXZpb3VzIGRlcHRoIGlmIGFueQkJCQorCQkJYml0cyB8PSAoZGVwdGggJiAweEZGKSA8PCBEZXB0aFNISUZUOyAvLyBlbmNvZGVkIG9uIDggYml0cworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgaW5kZXgpIHsKKwkJLy8gaWdub3JlZAorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCisJCXJldHVybiByZWNlaXZlci50b1N0cmluZygpICsgIi4iIC8vJE5PTi1OTFMtMSQKKwkJKyBuZXcgU3RyaW5nKHRva2VuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlyZWNlaXZlci50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmxvYXRMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Zsb2F0TGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZmI2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Zsb2F0TGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEZsb2F0TGl0ZXJhbCBleHRlbmRzIE51bWJlckxpdGVyYWwgeworCWZsb2F0IHZhbHVlOworCWZpbmFsIHN0YXRpYyBmbG9hdCBGbG9hdF9NSU5fVkFMVUUgPSBGbG9hdC5pbnRCaXRzVG9GbG9hdCgxKTsgLy8gd29yay1hcm91bmQgVkFKIHByb2JsZW0gMUY2SUdVVQorcHVibGljIEZsb2F0TGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLCBpbnQgZSkgeworCXN1cGVyKHRva2VuLCBzLGUpOworfQorcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgeworCisJLy90aGUgc291cmNlIGlzIGNvcnJlY3RseSBmb3JtYXRlZCBzbyB0aGUgZXhjZXB0aW9uIHNob3VsZCBuZXZlciBvY2N1cnMKKworCUZsb2F0IGNvbXB1dGVkVmFsdWU7CisJdHJ5IHsKKwkJY29tcHV0ZWRWYWx1ZSA9IEZsb2F0LnZhbHVlT2YoU3RyaW5nLnZhbHVlT2Yoc291cmNlKSk7CisJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuOworCX0gCisKKwlpZiAoY29tcHV0ZWRWYWx1ZS5kb3VibGVWYWx1ZSgpID4gRmxvYXQuTUFYX1ZBTFVFKXsKKwkJcmV0dXJuOyAvL21heSBiZSBJbmZpbml0eQorCX0KKwlpZiAoY29tcHV0ZWRWYWx1ZS5mbG9hdFZhbHVlKCkgPCBGbG9hdF9NSU5fVkFMVUUpeworCQkvLyBzZWUgMUY2SUdVVQorCQkvL29ubHkgYSB0cnVlIDAgY2FuIGJlIG1hZGUgb2YgemVyb3MKKwkJLy8xLjAwMDAwMDAwZS00NmYgaXMgaWxsZWdhbCAuLi4uCisJCWxhYmVsIDogZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsgCisJCQlzd2l0Y2ggKHNvdXJjZVtpXSkgeworCQkJCWNhc2UgJy4nIDoKKwkJCQljYXNlICdmJyA6CisJCQkJY2FzZSAnRicgOgorCQkJCWNhc2UgJzAnIDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZScgOgorCQkJCWNhc2UgJ0UnIDoKKwkJCQkJYnJlYWsgbGFiZWw7IC8vZXhwb3NhbnQgYXJlIHZhbGlkICEuLi4uCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybjsgLy9lcnJvcgorCisKKwkJCX0KKwkJfQorCX0KKwljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSh2YWx1ZSA9IGNvbXB1dGVkVmFsdWUuZmxvYXRWYWx1ZSgpKTsKK30KKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciBmbG9hdCBsaXRlcmFsCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLyAKK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKQorCQlpZiAoKGltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX2Zsb2F0KQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSh2YWx1ZSk7CisJCWVsc2UKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlyZXR1cm4gRmxvYXRCaW5kaW5nOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzYzQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwzMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIEZvclN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJcHVibGljIFN0YXRlbWVudFtdIGluaXRpYWxpemF0aW9uczsKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb247CisJcHVibGljIFN0YXRlbWVudFtdIGluY3JlbWVudHM7CisJcHVibGljIFN0YXRlbWVudCBhY3Rpb247CisKKwkvL3doZW4gdGhlcmUgaXMgbm8gbG9jYWwgZGVjbGFyYXRpb24sIHRoZXJlIGlzIG5vIG5lZWQgb2YgYSBuZXcgc2NvcGUKKwkvL3Njb3BlIGlzIHBvc2l0aW9ubmVkIGVpdGhlciB0byBhIG5ldyBzY29wZSwgb3IgdG8gdGhlICJ1cHBlciJzY29wZSAoc2VlIHJlc29sdmVUeXBlKQorCXB1YmxpYyBib29sZWFuIG5lZWRlZFNjb3BlOworCXB1YmxpYyBCbG9ja1Njb3BlIHNjb3BlOworCisJcHJpdmF0ZSBMYWJlbCBicmVha0xhYmVsLCBjb250aW51ZUxhYmVsOworCisJLy8gZm9yIGxvY2FsIHZhcmlhYmxlcyB0YWJsZSBhdHRyaWJ1dGVzCisJaW50IHByZUNvbmRJbml0U3RhdGVJbmRleCA9IC0xOworCWludCBjb25kSWZUcnVlSW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKKworCXB1YmxpYyBGb3JTdGF0ZW1lbnQoCisJCVN0YXRlbWVudFtdIGluaXRpYWxpemF0aW9ucywKKwkJRXhwcmVzc2lvbiBjb25kaXRpb24sCisJCVN0YXRlbWVudFtdIGluY3JlbWVudHMsCisJCVN0YXRlbWVudCBhY3Rpb24sCisJCWJvb2xlYW4gbmVlZGVkU2NvcGUsCisJCWludCBzLAorCQlpbnQgZSkgeworCisJCXRoaXMuc291cmNlU3RhcnQgPSBzOworCQl0aGlzLnNvdXJjZUVuZCA9IGU7CisJCXRoaXMuaW5pdGlhbGl6YXRpb25zID0gaW5pdGlhbGl6YXRpb25zOworCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKwkJdGhpcy5pbmNyZW1lbnRzID0gaW5jcmVtZW50czsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMubmVlZGVkU2NvcGUgPSBuZWVkZWRTY29wZTsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJCQorCQlicmVha0xhYmVsID0gbmV3IExhYmVsKCk7CisJCWNvbnRpbnVlTGFiZWwgPSBuZXcgTGFiZWwoKTsKKworCQkvLyBwcm9jZXNzIHRoZSBpbml0aWFsaXphdGlvbnMKKwkJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKSB7CisJCQlpbnQgY291bnQgPSBpbml0aWFsaXphdGlvbnMubGVuZ3RoLCBpID0gMDsKKwkJCXdoaWxlIChpIDwgY291bnQpIHsKKwkJCQlmbG93SW5mbyA9IGluaXRpYWxpemF0aW9uc1tpKytdLmFuYWx5c2VDb2RlKHNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJfQorCQl9CisJCXByZUNvbmRJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisKKwkJYm9vbGVhbiBjb25kaXRpb25Jc0lubGluZWRUb1RydWUgPSAKKwkJCWNvbmRpdGlvbiA9PSBudWxsIHx8IChjb25kaXRpb24uY29uc3RhbnQgIT0gTm90QUNvbnN0YW50ICYmIGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKTsKKwkJYm9vbGVhbiBjb25kaXRpb25Jc0lubGluZWRUb0ZhbHNlID0gCisJCQkhIGNvbmRpdGlvbklzSW5saW5lZFRvVHJ1ZSAmJiAoY29uZGl0aW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCAmJiBjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpOworCQkKKwkJLy8gcHJvY2VzcyB0aGUgY29uZGl0aW9uCisJCUxvb3BpbmdGbG93Q29udGV4dCBjb25kTG9vcENvbnRleHQgPSBudWxsOworCQlpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKKwkJCWlmICghY29uZGl0aW9uSXNJbmxpbmVkVG9UcnVlKSB7CisJCQkJZmxvd0luZm8gPQorCQkJCQljb25kaXRpb24uYW5hbHlzZUNvZGUoCisJCQkJCQlzY29wZSwKKwkJCQkJCShjb25kTG9vcENvbnRleHQgPQorCQkJCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIHRoaXMsIG51bGwsIG51bGwsIHNjb3BlKSksCisJCQkJCQlmbG93SW5mbyk7CisJCQl9CisJCX0KKworCQkvLyBwcm9jZXNzIHRoZSBhY3Rpb24KKwkJTG9vcGluZ0Zsb3dDb250ZXh0IGxvb3BpbmdDb250ZXh0OworCQlGbG93SW5mbyBhY3Rpb25JbmZvOworCQlpZiAoKGFjdGlvbiA9PSBudWxsKSB8fCBhY3Rpb24uaXNFbXB0eUJsb2NrKCkpIHsKKwkJCWlmIChjb25kTG9vcENvbnRleHQgIT0gbnVsbCkKKwkJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3Aoc2NvcGUsIGZsb3dJbmZvKTsKKwkJCWlmIChjb25kaXRpb25Jc0lubGluZWRUb1RydWUpIHsKKwkJCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbmRpdGlvbklzSW5saW5lZFRvRmFsc2UpeworCQkJCQljb250aW51ZUxhYmVsID0gbnVsbDsgLy8gZm9yKDtmYWxzZTtwKCkpOworCQkJCX0KKwkJCQlhY3Rpb25JbmZvID0gZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKTsKKwkJCQlsb29waW5nQ29udGV4dCA9CisJCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIHRoaXMsIGJyZWFrTGFiZWwsIGNvbnRpbnVlTGFiZWwsIHNjb3BlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvb3BpbmdDb250ZXh0ID0KKwkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCB0aGlzLCBicmVha0xhYmVsLCBjb250aW51ZUxhYmVsLCBzY29wZSk7CisJCQlGbG93SW5mbyBpbml0c1doZW5UcnVlID0gZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpOworCQkJY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ID0KKwkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhpbml0c1doZW5UcnVlKTsKKworCQkJCWFjdGlvbkluZm8gPSBjb25kaXRpb25Jc0lubGluZWRUb0ZhbHNlCisJCQkJCT8gRmxvd0luZm8uRGVhZEVuZCAgLy8gdW5yZWFjaGFibGUgd2hlbiBjb25kaXRpb24gaW5saW5lZCB0byBmYWxzZQorCQkJCQk6IGluaXRzV2hlblRydWUuY29weSgpOworCQkJaWYgKCFhY3Rpb25JbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZShhY3Rpb24sIHNjb3BlKSkgeworCQkJCWFjdGlvbkluZm8gPSBhY3Rpb24uYW5hbHlzZUNvZGUoc2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKTsKKwkJCX0KKworCQkJLy8gY29kZSBnZW5lcmF0aW9uIGNhbiBiZSBvcHRpbWl6ZWQgd2hlbiBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBsb29wCisJCQlpZiAoKChhY3Rpb25JbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGFjdGlvbkluZm8uaXNGYWtlUmVhY2hhYmxlKCkpCisJCQkJJiYgKChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUgPT0gRmxvd0luZm8uRGVhZEVuZCkKKwkJCQkJfHwgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLmlzRmFrZVJlYWNoYWJsZSgpKSkgeworCQkJCWNvbnRpbnVlTGFiZWwgPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29uZExvb3BDb250ZXh0ICE9IG51bGwpCisJCQkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChzY29wZSwgZmxvd0luZm8pOworCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKHNjb3BlLCBhY3Rpb25JbmZvKTsKKwkJCQlhY3Rpb25JbmZvID0KKwkJCQkJYWN0aW9uSW5mby5tZXJnZWRXaXRoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCQkJLy8gZm9yIGluY3JlbWVudHMKKwkJCX0KKwkJfQorCQlpZiAoKGNvbnRpbnVlTGFiZWwgIT0gbnVsbCkgJiYgKGluY3JlbWVudHMgIT0gbnVsbCkpIHsKKwkJCUxvb3BpbmdGbG93Q29udGV4dCBsb29wQ29udGV4dCA9CisJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgdGhpcywgbnVsbCwgbnVsbCwgc2NvcGUpOworCQkJaW50IGkgPSAwLCBjb3VudCA9IGluY3JlbWVudHMubGVuZ3RoOworCQkJd2hpbGUgKGkgPCBjb3VudCkKKwkJCQlhY3Rpb25JbmZvID0gaW5jcmVtZW50c1tpKytdLmFuYWx5c2VDb2RlKHNjb3BlLCBsb29wQ29udGV4dCwgYWN0aW9uSW5mbyk7CisJCQlsb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChzY29wZSwgZmxvd0luZm8pOworCQl9CisKKwkJLy8gaW5maW5pdGUgbG9vcAorCQlGbG93SW5mbyBtZXJnZWRJbmZvOworCQlpZiAoY29uZGl0aW9uSXNJbmxpbmVkVG9UcnVlKSB7CisJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoCisJCQkJCW1lcmdlZEluZm8gPSBsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWspOworCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCX0KKworCQkvL2VuZCBvZiBsb29wOiBlaXRoZXIgY29uZGl0aW9uIGZhbHNlIG9yIGJyZWFrCisJCW1lcmdlZEluZm8gPQorCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKAorCQkJCWxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhay51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwl9CisKKwkvKioKKwkgKiBGb3Igc3RhdGVtZW50IGNvZGUgZ2VuZXJhdGlvbgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZU1BU0spID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCisJCS8vIGdlbmVyYXRlIHRoZSBpbml0aWFsaXphdGlvbnMKKwkJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaW5pdGlhbGl6YXRpb25zW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQl9CisJCX0KKworCQkvLyBsYWJlbCBtYW5hZ2VtZW50CisJCUxhYmVsIGFjdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pOworCQlMYWJlbCBjb25kaXRpb25MYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKwkJYnJlYWtMYWJlbC5jb2RlU3RyZWFtID0gY29kZVN0cmVhbTsKKwkJaWYgKGNvbnRpbnVlTGFiZWwgIT0gbnVsbCkgeworCQkJY29udGludWVMYWJlbC5jb2RlU3RyZWFtID0gY29kZVN0cmVhbTsKKwkJfQorCQkvLyBqdW1wIG92ZXIgdGhlIGFjdGlvbkJsb2NrCisJCWlmICgoY29uZGl0aW9uICE9IG51bGwpCisJCQkmJiAoY29uZGl0aW9uLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkKKwkJCSYmICEoKGFjdGlvbiA9PSBudWxsIHx8IGFjdGlvbi5pc0VtcHR5QmxvY2soKSkgJiYgKGluY3JlbWVudHMgPT0gbnVsbCkpKSB7CisJCQlpbnQganVtcFBDID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCWNvZGVTdHJlYW0uZ290b18oY29uZGl0aW9uTGFiZWwpOworCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGp1bXBQQywgY29uZGl0aW9uLnNvdXJjZVN0YXJ0KTsKKwkJfQorCQkvLyBnZW5lcmF0ZSB0aGUgbG9vcCBhY3Rpb24KKwkJYWN0aW9uTGFiZWwucGxhY2UoKTsKKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQkvLyBSZXF1aXJlZCB0byBmaXggMVBSMFhWUzogTEZSRTpXSU5OVCAtIENvbXBpbGVyOiB2YXJpYWJsZSB0YWJsZSBmb3IgbWV0aG9kIGFwcGVhcnMgaW5jb3JyZWN0CisJCQlpZiAoY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJLy8gaW5zZXJ0IGFsbCBsb2NhbHMgaW5pdGlhbGl6ZWQgaW5zaWRlIHRoZSBjb25kaXRpb24gaW50byB0aGUgYWN0aW9uIGdlbmVyYXRlZCBwcmlvciB0byB0aGUgY29uZGl0aW9uCisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4KTsKKwkJCX0KKwkJCWFjdGlvbi5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQl9CisJCS8vIGNvbnRpbnVhdGlvbiBwb2ludAorCQlpZiAoY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQljb250aW51ZUxhYmVsLnBsYWNlKCk7CisJCQkvLyBnZW5lcmF0ZSB0aGUgaW5jcmVtZW50cyBmb3IgbmV4dCBpdGVyYXRpb24KKwkJCWlmIChpbmNyZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gaW5jcmVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlpbmNyZW1lbnRzW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChwcmVDb25kSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlwcmVDb25kSW5pdFN0YXRlSW5kZXgpOworCQl9CisKKwkJLy8gZ2VuZXJhdGUgdGhlIGNvbmRpdGlvbgorCQljb25kaXRpb25MYWJlbC5wbGFjZSgpOworCQlpZiAoKGNvbmRpdGlvbiAhPSBudWxsKSAmJiAoY29uZGl0aW9uLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkpIHsKKwkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oc2NvcGUsIGNvZGVTdHJlYW0sIGFjdGlvbkxhYmVsLCBudWxsLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGFjdGlvbkxhYmVsKTsKKwkJCX0KKwkJfQorCQlicmVha0xhYmVsLnBsYWNlKCk7CisKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChuZWVkZWRTY29wZSkgeworCQkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHNjb3BlKTsKKwkJfQorCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQltZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7CisKKwkJdGhpcy5icmVha0xhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQl0aGlzLmNvbnRpbnVlTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHVwcGVyU2NvcGUpIHsKKworCQkvLyB1c2UgdGhlIHNjb3BlIHRoYXQgd2lsbCBob2xkIHRoZSBpbml0IGRlY2xhcmF0aW9ucworCQlzY29wZSA9IG5lZWRlZFNjb3BlID8gbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSkgOiB1cHBlclNjb3BlOworCQlpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCWluaXRpYWxpemF0aW9uc1tpXS5yZXNvbHZlKHNjb3BlKTsKKwkJaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7CisJCQlUeXBlQmluZGluZyB0eXBlID0gY29uZGl0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBCb29sZWFuQmluZGluZyk7CisJCQljb25kaXRpb24uaW1wbGljaXRXaWRlbmluZyh0eXBlLCB0eXBlKTsKKwkJfQorCQlpZiAoaW5jcmVtZW50cyAhPSBudWxsKQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluY3JlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJaW5jcmVtZW50c1tpXS5yZXNvbHZlKHNjb3BlKTsKKwkJaWYgKGFjdGlvbiAhPSBudWxsKQorCQkJYWN0aW9uLnJlc29sdmUoc2NvcGUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYikgKyAiZm9yICgiOyAvLyROT04tTkxTLTEkCisJCWlmICghbmVlZGVkU2NvcGUpCisJCQlzID0gcyArICIgLy8tLU5PIHVwcGVyc2NvcGUgc2NvcGUgbmVlZGVkXG4iICsgdGFiU3RyaW5nKHRhYikgKyAiICAgICAiOwkvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJLy9pbml0cworCQlpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQkJLy9uaWNlIG9ubHkgd2l0aCBleHByZXNzaW9ucworCQkJCXMgPSBzICsgaW5pdGlhbGl6YXRpb25zW2ldLnRvU3RyaW5nKDApOworCQkJCWlmIChpICE9IChpbml0aWFsaXphdGlvbnMubGVuZ3RoIC0gMSkpCisJCQkJCXMgPSBzICsgIiAsICI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsgCisJCXMgPSBzICsgIjsgIjsgLy8kTk9OLU5MUy0xJAorCQkvL2NvbmQKKwkJaWYgKGNvbmRpdGlvbiAhPSBudWxsKQorCQkJcyA9IHMgKyBjb25kaXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCk7CisJCXMgPSBzICsgIjsgIjsgLy8kTk9OLU5MUy0xJAorCQkvL3VwZGF0ZXMKKwkJaWYgKGluY3JlbWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNyZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJLy9uaWNlIG9ubHkgd2l0aCBleHByZXNzaW9ucworCQkJCXMgPSBzICsgaW5jcmVtZW50c1tpXS50b1N0cmluZygwKTsKKwkJCQlpZiAoaSAhPSAoaW5jcmVtZW50cy5sZW5ndGggLSAxKSkKKwkJCQkJcyA9IHMgKyAiICwgIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OyAKKwkJcyA9IHMgKyAiKSAiOyAvLyROT04tTkxTLTEkCisJCS8vYmxvY2sKKwkJaWYgKGFjdGlvbiA9PSBudWxsKQorCQkJcyA9IHMgKyAie30iOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXMgPSBzICsgIlxuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisJCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7CisJCQlpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKwkJCQlpbnQgaW5pdGlhbGl6YXRpb25zTGVuZ3RoID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemF0aW9uc0xlbmd0aDsgaSsrKQorCQkJCQlpbml0aWFsaXphdGlvbnNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCisJCQlpZiAoY29uZGl0aW9uICE9IG51bGwpCisJCQkJY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKworCQkJaWYgKGluY3JlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBpbmNyZW1lbnRzTGVuZ3RoID0gaW5jcmVtZW50cy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNyZW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJCWluY3JlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCisJCQlpZiAoYWN0aW9uICE9IG51bGwpCisJCQkJYWN0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lmU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lmU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxOWM3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSWZTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLy90aGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNhc2Ugb2Ygb25seSBvbmUgc3RhdGVtZW50IGluIAorCS8vZWl0aGVyIGVsc2UgYW5kL29yIHRoZW4gYnJhbmNoZXMuCisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb247CisJcHVibGljIFN0YXRlbWVudCB0aGVuU3RhdGVtZW50OworCXB1YmxpYyBTdGF0ZW1lbnQgZWxzZVN0YXRlbWVudDsKKworCWJvb2xlYW4gdGhlbkV4aXQ7CisKKwkvLyBmb3IgbG9jYWwgdmFyaWFibGVzIHRhYmxlIGF0dHJpYnV0ZXMKKwlpbnQgdGhlbkluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IGVsc2VJbml0U3RhdGVJbmRleCA9IC0xOworCWludCBtZXJnZWRJbml0U3RhdGVJbmRleCA9IC0xOworCisJcHVibGljIElmU3RhdGVtZW50KAorCQlFeHByZXNzaW9uIGNvbmRpdGlvbiwKKwkJU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQsCisJCWludCBzLAorCQlpbnQgZSkgeworCisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQl0aGlzLnRoZW5TdGF0ZW1lbnQgPSB0aGVuU3RhdGVtZW50OworCQlzb3VyY2VTdGFydCA9IHM7CisJCXNvdXJjZUVuZCA9IGU7CisJfQorCisJcHVibGljIElmU3RhdGVtZW50KAorCQlFeHByZXNzaW9uIGNvbmRpdGlvbiwKKwkJU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQsCisJCVN0YXRlbWVudCBlbHNlU3RhdGVtZW50LAorCQlpbnQgcywKKwkJaW50IGUpIHsKKworCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKwkJdGhpcy50aGVuU3RhdGVtZW50ID0gdGhlblN0YXRlbWVudDsKKwkJdGhpcy5lbHNlU3RhdGVtZW50ID0gZWxzZVN0YXRlbWVudDsKKwkJc291cmNlRW5kID0gZTsKKwkJc291cmNlU3RhcnQgPSBzOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCUZsb3dJbmZvIHRoZW5GbG93SW5mbywgZWxzZUZsb3dJbmZvOworCisJCS8vIHByb2Nlc3MgdGhlIGNvbmRpdGlvbgorCQlmbG93SW5mbyA9IGNvbmRpdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisKKwkJLy8gcHJvY2VzcyB0aGUgVEhFTiBwYXJ0CisJCWlmICh0aGVuU3RhdGVtZW50ID09IG51bGwpIHsKKwkJCXRoZW5GbG93SW5mbyA9IGZsb3dJbmZvLmluaXRzV2hlblRydWUoKTsKKwkJfSBlbHNlIHsKKwkJCUNvbnN0YW50IGNzdDsKKwkJCXRoZW5GbG93SW5mbyA9CisJCQkJKCgoKGNzdCA9IGNvbmRpdGlvbi5jb25zdGFudCkgIT0gTm90QUNvbnN0YW50KQorCQkJCQkmJiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkKKwkJCQkJfHwgKCgoY3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KQorCQkJCQkJJiYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkpKQorCQkJCQk/IChmbG93SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSkpCisJCQkJCTogZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKTsKKwkJCS8vIFNhdmUgaW5mbyBmb3IgY29kZSBnZW4KKwkJCXRoZW5Jbml0U3RhdGVJbmRleCA9CisJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXModGhlbkZsb3dJbmZvKTsKKwkJCWlmICghdGhlbkZsb3dJbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZSh0aGVuU3RhdGVtZW50LCBjdXJyZW50U2NvcGUpKSB7CisJCQkJdGhlbkZsb3dJbmZvID0KKwkJCQkJdGhlblN0YXRlbWVudC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCB0aGVuRmxvd0luZm8pOworCQkJfQorCQl9OworCQkvLyBvcHRpbWl6aW5nIHRoZSBqdW1wIGFyb3VuZCB0aGUgRUxTRSBwYXJ0CisJCXRoZW5FeGl0ID0gKHRoZW5GbG93SW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCB0aGVuRmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCk7CisKKwkJLy8gcHJvY2VzcyB0aGUgRUxTRSBwYXJ0CisJCWlmIChlbHNlU3RhdGVtZW50ID09IG51bGwpIHsKKwkJCWVsc2VGbG93SW5mbyA9IGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCk7CisJCX0gZWxzZSB7CisJCQlDb25zdGFudCBjc3Q7CisJCQllbHNlRmxvd0luZm8gPQorCQkJCSgoKChjc3QgPSBjb25kaXRpb24uY29uc3RhbnQpICE9IE5vdEFDb25zdGFudCkgJiYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkKKwkJCQkJfHwgKCgoY3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KQorCQkJCQkJJiYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkpCisJCQkJCT8gKGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSkpCisJCQkJCTogZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCk7CisJCQkvLyBTYXZlIGluZm8gZm9yIGNvZGUgZ2VuCisJCQllbHNlSW5pdFN0YXRlSW5kZXggPQorCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGVsc2VGbG93SW5mbyk7CisJCQlpZiAoIWVsc2VGbG93SW5mby5jb21wbGFpbklmVW5yZWFjaGFibGUoZWxzZVN0YXRlbWVudCwgY3VycmVudFNjb3BlKSkgeworCQkJCWVsc2VGbG93SW5mbyA9CisJCQkJCWVsc2VTdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZWxzZUZsb3dJbmZvKTsKKwkJCX0KKwkJfQorCisJCS8vIG1lcmdlIFRIRU4gJiBFTFNFIGluaXRpYWxpemF0aW9ucworCQlGbG93SW5mbyBtZXJnZWRJbmZvOworCQlpZiAoKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCisJCQkmJiAoY29uZGl0aW9uLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpKSB7CisJCQkvLyBJRiAoVFJVRSkKKwkJCWlmICh0aGVuRXhpdCkgeworCQkJCW1lcmdlZEluZm8gPSBlbHNlRmxvd0luZm8ubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQkJCXJldHVybiBtZXJnZWRJbmZvOworCQkJfSBlbHNlIHsKKwkJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRoZW5GbG93SW5mbyk7CisJCQkJcmV0dXJuIHRoZW5GbG93SW5mbzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIElGIChGQUxTRSkKKwkJCWlmICgoY29uZGl0aW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJCQkmJiAoY29uZGl0aW9uLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkgeworCQkJCWlmIChlbHNlRmxvd0luZm8uaXNEZWFkRW5kKCkpIHsKKwkJCQkJbWVyZ2VkSW5mbyA9IHRoZW5GbG93SW5mby5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOworCQkJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZWxzZUZsb3dJbmZvKTsKKwkJCQkJcmV0dXJuIGVsc2VGbG93SW5mbzsKKwkJCQl9CisJCQl9CisJCX0KKwkJbWVyZ2VkSW5mbyA9IHRoZW5GbG93SW5mby5tZXJnZWRXaXRoKGVsc2VGbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwl9CisKKwkvKioKKwkgKiBJZiBjb2RlIGdlbmVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJTGFiZWwgZW5kaWZMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKworCQkvLyBvcHRpbWl6aW5nIHRoZSB0aGVuL2Vsc2UgcGFydCBjb2RlIGdlbgorCQlDb25zdGFudCBjc3QsIGNvbmRDc3Q7CisJCWJvb2xlYW4gaGFzVGhlblBhcnQgPQorCQkJISgoKChjc3QgPSBjb25kaXRpb24uY29uc3RhbnQpICE9IE5vdEFDb25zdGFudCkKKwkJCQkmJiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkKKwkJCQl8fCAodGhlblN0YXRlbWVudCA9PSBudWxsKQorCQkJCXx8ICh0aGVuU3RhdGVtZW50LmlzRW1wdHlCbG9jaygpKQorCQkJCXx8ICgoKGNvbmRDc3QgPSBjb25kaXRpb24uY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpCisJCQkJCSYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOworCQlib29sZWFuIGhhc0Vsc2VQYXJ0ID0KKwkJCSEoKChjc3QgIT0gTm90QUNvbnN0YW50KSAmJiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpKQorCQkJCXx8IChlbHNlU3RhdGVtZW50ID09IG51bGwpCisJCQkJfHwgKGVsc2VTdGF0ZW1lbnQuaXNFbXB0eUJsb2NrKCkpCisJCQkJfHwgKCgoY29uZENzdCA9IGNvbmRpdGlvbi5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkKKwkJCQkJJiYgKGNvbmRDc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpKTsKKworCQlpZiAoaGFzVGhlblBhcnQpIHsKKwkJCUxhYmVsIGZhbHNlTGFiZWw7CisJCQkvLyBnZW5lcmF0ZSBib29sZWFuIGNvbmRpdGlvbgorCQkJY29uZGl0aW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQljdXJyZW50U2NvcGUsCisJCQkJY29kZVN0cmVhbSwKKwkJCQludWxsLAorCQkJCShmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwKKwkJCQl0cnVlKTsKKwkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQkJaWYgKHRoZW5Jbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCXRoZW5Jbml0U3RhdGVJbmRleCk7CisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGVuSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJLy8gZ2VuZXJhdGUgdGhlbiBzdGF0ZW1lbnQKKwkJCXRoZW5TdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCQkvLyBqdW1wIGFyb3VuZCB0aGUgZWxzZSBzdGF0ZW1lbnQKKwkJCWlmIChoYXNFbHNlUGFydCAmJiAhdGhlbkV4aXQpIHsKKwkJCQl0aGVuU3RhdGVtZW50LmJyYW5jaENoYWluVG8oZW5kaWZMYWJlbCk7CisJCQkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZGlmTGFiZWwpOworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOworCQkJCS8vZ290byBpcyB0YWdnZWQgYXMgcGFydCBvZiB0aGUgdGhlbkFjdGlvbiBibG9jaworCQkJfQorCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQl9IGVsc2UgeworCQkJaWYgKGhhc0Vsc2VQYXJ0KSB7CisJCQkJLy8gZ2VuZXJhdGUgYm9vbGVhbiBjb25kaXRpb24KKwkJCQljb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCWVuZGlmTGFiZWwsCisJCQkJCW51bGwsCisJCQkJCXRydWUpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBnZW5lcmF0ZSBjb25kaXRpb24gc2lkZS1lZmZlY3RzCisJCQkJY29uZGl0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJfQorCQl9CisJCS8vIGdlbmVyYXRlIGVsc2Ugc3RhdGVtZW50CisJCWlmIChoYXNFbHNlUGFydCkgeworCQkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCQlpZiAoZWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQllbHNlU3RhdGVtZW50LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQl9CisJCWVuZGlmTGFiZWwucGxhY2UoKTsKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCVR5cGVCaW5kaW5nIHR5cGUgPSBjb25kaXRpb24ucmVzb2x2ZVR5cGVFeHBlY3Rpbmcoc2NvcGUsIEJvb2xlYW5CaW5kaW5nKTsKKwkJY29uZGl0aW9uLmltcGxpY2l0V2lkZW5pbmcodHlwZSwgdHlwZSk7CisJCWlmICh0aGVuU3RhdGVtZW50ICE9IG51bGwpCisJCQl0aGVuU3RhdGVtZW50LnJlc29sdmUoc2NvcGUpOworCQlpZiAoZWxzZVN0YXRlbWVudCAhPSBudWxsKQorCQkJZWxzZVN0YXRlbWVudC5yZXNvbHZlKHNjb3BlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlTdHJpbmcgaW5Gcm9udCwgcyA9IHRhYlN0cmluZyh0YWIpOworCQlpbkZyb250ID0gczsKKwkJcyA9IHMgKyAiaWYgKCIgKyBjb25kaXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiKSBcbiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlzID0gcyArIHRoZW5TdGF0ZW1lbnQudG9TdHJpbmcodGFiICsgMikgKyAiOyI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkKKwkJCXMgPSBzICsgIlxuIiArIGluRnJvbnQgKyAiZWxzZVxuIiArIGVsc2VTdGF0ZW1lbnQudG9TdHJpbmcodGFiICsgMikgKyAiOyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJaWYgKHRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkKKwkJCQl0aGVuU3RhdGVtZW50LnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJaWYgKGVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkKKwkJCQllbHNlU3RhdGVtZW50LnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW1wb3J0UmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2MwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgSW1wb3J0UmVmZXJlbmNlIGV4dGVuZHMgQXN0Tm9kZSB7CisJCisJcHVibGljIGNoYXJbXVtdIHRva2VuczsKKwlwdWJsaWMgbG9uZ1tdIHNvdXJjZVBvc2l0aW9uczsgLy9lYWNoIGVudHJ5IGlzIHVzaW5nIHRoZSBjb2RlIDogKHN0YXJ0PDwzMikgKyBlbmQKKwlwdWJsaWMgYm9vbGVhbiBvbkRlbWFuZCA9IHRydWU7IC8vbW9zdCBvZiB0aGUgdGltZQorCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25FbmQ7Ly8gZG9lc24ndCBpbmNsdWRlIGFuIHBvdGVudGlhbCB0cmFpbGluZyBjb21tZW50CisJcHVibGljIGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJcHVibGljIGJvb2xlYW4gdXNlZDsKKworcHVibGljIEltcG9ydFJlZmVyZW5jZShjaGFyW11bXSBzb3VyY2VzICwgbG9uZ1tdIHBvc3MgLCBib29sZWFuIGQpIHsKKwl0b2tlbnMgPSBzb3VyY2VzIDsKKwlzb3VyY2VQb3NpdGlvbnMgPSBwb3NzIDsKKwlvbkRlbWFuZCA9IGQ7CisJc291cmNlRW5kID0gKGludCkoc291cmNlUG9zaXRpb25zW3NvdXJjZVBvc2l0aW9ucy5sZW5ndGgtMV0gJiAweDAwMDAwMDAwRkZGRkZGRkYpOworCXNvdXJjZVN0YXJ0ID0gKGludCkoc291cmNlUG9zaXRpb25zWzBdPj4+MzIpIDsKK30KKy8qKgorICogQHJldHVybiBjaGFyW11bXQorICovCitwdWJsaWMgY2hhcltdW10gZ2V0SW1wb3J0TmFtZSgpIHsKKwlyZXR1cm4gdG9rZW5zOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiICl7CisKKwlyZXR1cm4gdG9TdHJpbmcodGFiLHRydWUpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgeworCS8qIHdoZW4gd2l0aE9uRGVtYW5kIGlzIGZhbHNlLCBvbmx5IHRoZSBuYW1lIGlzIHByaW50ZWQgKi8KKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldKTsKKwkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlpZiAod2l0aE9uRGVtYW5kICYmIG9uRGVtYW5kKSB7CisJCWJ1ZmZlci5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY2MDYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworCitwdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uIHsKKwkKKwlwdWJsaWMgQmxvY2sgYmxvY2s7CisJcHVibGljIGludCBsYXN0RmllbGRJRDsKKwlwdWJsaWMgaW50IGJvZHlTdGFydDsKKwlwdWJsaWMgSW5pdGlhbGl6ZXIoQmxvY2sgYmxvY2ssIGludCBtb2RpZmllcnMpIHsKKwkJdGhpcy5ibG9jayA9IGJsb2NrOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKworCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQgPSBibG9jay5zb3VyY2VTdGFydDsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCU1ldGhvZFNjb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJcmV0dXJuIGJsb2NrLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CisKKwkvKioKKwkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIGEgbm9uLXN0YXRpYyBpbml0aWFsaXplci4KKwkgKglpLmUuJm5ic3A7bm9ybWFsIGJsb2NrIGNvZGUgZ2VuCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWJsb2NrLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworCisJCXJldHVybiAobW9kaWZpZXJzICYgQWNjU3RhdGljKSAhPSAwOworCX0KKworCXB1YmxpYyB2b2lkIHBhcnNlU3RhdGVtZW50cygKKwkJUGFyc2VyIHBhcnNlciwKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGUsCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKworCQkvL2ZpbGwgdXAgdGhlIG1ldGhvZCBib2R5IHdpdGggc3RhdGVtZW50CisJCXBhcnNlci5wYXJzZSh0aGlzLCB0eXBlLCB1bml0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKE1ldGhvZFNjb3BlIHNjb3BlKSB7CisKKwkJaW50IHByZXZpb3VzID0gc2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4OworCQl0cnkgeworCQkJc2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ID0gbGFzdEZpZWxkSUQ7CisJCQlpZiAoaXNTdGF0aWMoKSkgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJCQlpZiAoZGVjbGFyaW5nVHlwZS5pc05lc3RlZFR5cGUoKSAmJiAhZGVjbGFyaW5nVHlwZS5pc1N0YXRpYygpKQorCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbm5lclR5cGVzQ2Fubm90RGVjbGFyZVN0YXRpY0luaXRpYWxpemVycygKKwkJCQkJCWRlY2xhcmluZ1R5cGUsCisJCQkJCQl0aGlzKTsKKwkJCX0KKwkJCWJsb2NrLnJlc29sdmUoc2NvcGUpOworCQl9IGZpbmFsbHkgeworCQkJc2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ID0gcHJldmlvdXM7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKworCQlpZiAobW9kaWZpZXJzICE9IDApIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKKwkJCWJ1ZmZlci5hcHBlbmQobW9kaWZpZXJzU3RyaW5nKG1vZGlmaWVycykpOworCQkJYnVmZmVyLmFwcGVuZCgie1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoYmxvY2sudG9TdHJpbmdTdGF0ZW1lbnRzKHRhYikpOworCQkJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSk7CisJCQlidWZmZXIuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBibG9jay50b1N0cmluZyh0YWIpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgTWV0aG9kU2NvcGUgc2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWJsb2NrLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbm5lclR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbm5lclR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzA5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lubmVyVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKKworcHVibGljIGNsYXNzIElubmVyVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIHsKKwkKKwlwdWJsaWMgSW5uZXJUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CisJfQkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5zdGFuY2VPZkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5zdGFuY2VPZkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFiODA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnN0YW5jZU9mRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBJbnN0YW5jZU9mRXhwcmVzc2lvbiBleHRlbmRzIE9wZXJhdG9yRXhwcmVzc2lvbiB7CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHR5cGU7CisKKwlwdWJsaWMgSW5zdGFuY2VPZkV4cHJlc3Npb24oCisJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiwKKwkJVHlwZVJlZmVyZW5jZSB0eXBlLAorCQlpbnQgb3BlcmF0b3IpIHsKKworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmJpdHMgfD0gb3BlcmF0b3IgPDwgT3BlcmF0b3JTSElGVDsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CisJCXRoaXMuc291cmNlRW5kID0gdHlwZS5zb3VyY2VFbmQ7CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJcmV0dXJuIGV4cHJlc3Npb24KKwkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBhcmVUeXBlc0Nhc3RDb21wYXRpYmxlKAorCQlCbG9ja1Njb3BlIHNjb3BlLAorCQlUeXBlQmluZGluZyBjYXN0VGIsCisJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYikgeworCisJCS8vCXNlZSBzcGVjaWZpY2F0aW9ucyBwLjY4CisJCS8vQSBtb3JlIGNwbXBsZXRlIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgb24KKwkJLy9DYXN0RXhwcmVzc2lvbiAoaXQgZGVhbHMgd2l0aCBjb25zdGFudCBhbmQgbmVlZCBydW50aW1lIGNoZWNrY2FzdCkKKworCQkvL2J5IGdyYW1tYXRpY2FsIGNvbnN0cnVjdGlvbiwgdGhlIGZpcnN0IHRlc3QgaXMgQUxXQVlTIGZhbHNlCisJCS8vaWYgKGNhc3RUYi5pc0Jhc2VUeXBlKCkpCisJCS8vewlpZiAoZXhwcmVzc2lvblRiLmlzQmFzZVR5cGUoKSkKKwkJLy8JewlpZiAoZXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGV4cHJlc3Npb25UYixjYXN0VGIpKQorCQkvLwkJewlyZXR1cm4gdHJ1ZTt9CisJCS8vCQllbHNlCisJCS8vCQl7CWlmIChleHByZXNzaW9uVGI9PWNhc3RUYikKKwkJLy8JCQl7CXJldHVybiB0cnVlO30KKwkJLy8JCQllbHNlIAorCQkvLwkJCXsJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsY2FzdFRiKSkKKwkJLy8JCQkJewlyZXR1cm4gdHJ1ZTsgfQorCQkvLwkJCQkKKwkJLy8JCQkJaWYgKEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyhjYXN0VGIuaWQsZXhwcmVzc2lvblRiLmlkKSkKKwkJLy8JCQkJewlyZXR1cm4gdHJ1ZTt9CisJCS8vCQkJCXJldHVybiBmYWxzZTt9fX0KKwkJLy8JZWxzZQorCQkvLwl7CXJldHVybiBmYWxzZTsgfX0KKwkJLy9lbHNlCisJCXsgLy8tLS0tLS0tLS0tLS0tY2hlY2tjYXN0IHRvIHNvbWV0aGluZyB3aGljaCBpcyBOT1QgYSBiYXNldHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisKKwkJCWlmIChOdWxsQmluZGluZyA9PSBleHByZXNzaW9uVGIpCisJCQkJLy9udWxsIGlzIGNvbXBhdGlibGUgd2l0aCBldmVyeSB0aGluZyAuLi4uIAorCQkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWlmIChleHByZXNzaW9uVGIuaXNBcnJheVR5cGUoKSkgeworCQkJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeworCQkJCQkvLy0tLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNBcnJheSAtLS0tLS0tLS0tLQorCQkJCQlUeXBlQmluZGluZyBleHByZXNzaW9uRWx0VGIgPSAoKEFycmF5QmluZGluZykgZXhwcmVzc2lvblRiKS5lbGVtZW50c1R5cGUoc2NvcGUpOworCQkJCQlpZiAoZXhwcmVzc2lvbkVsdFRiLmlzQmFzZVR5cGUoKSkKKwkJCQkJCS8vIDwtLS1zdG9wIHRoZSByZWN1cnNpb24tLS0tLS0tIAorCQkJCQkJcmV0dXJuICgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSkgPT0gZXhwcmVzc2lvbkVsdFRiOworCQkJCQkvL3JlY3Vyc2l2bHkgb24gdGhlIGVsdHMuLi4KKwkJCQkJcmV0dXJuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoCisJCQkJCQlzY29wZSwKKwkJCQkJCSgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSksCisJCQkJCQlleHByZXNzaW9uRWx0VGIpOworCQkJCX0KKwkJCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeworCQkJCQkvLy0tLS0tLShjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0tLS0tCQorCQkJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChjYXN0VGIpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7CisJCQkJCS8vLS0tLS0tLSAoY2FzdFRiLmlzSW50ZXJmYWNlKSBleHByZXNzaW9uVGIuaXNBcnJheSAtLS0tLS0tLS0tLQorCQkJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShjYXN0VGIpIHx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGNhc3RUYikpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAoZXhwcmVzc2lvblRiLmlzQmFzZVR5cGUoKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChleHByZXNzaW9uVGIuaXNDbGFzcygpKSB7CisJCQkJaWYgKGNhc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCQkJCS8vIC0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0tCisJCQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGV4cHJlc3Npb25UYikpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChjYXN0VGIuaXNDbGFzcygpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tIAorCQkJCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UYiwgY2FzdFRiKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQllbHNlIHsKKwkJCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7CisJCQkJCS8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0gIAorCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVGIpLmlzRmluYWwoKSkgeworCQkJCQkJLy9ubyBzdWJjbGFzcyBmb3IgZXhwcmVzc2lvblRiLCB0aHVzIGNvbXBpbGUtdGltZSBjaGVjayBpcyB2YWxpZAorCQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIGNhc3RUYikpCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UoKSkgeworCQkJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeworCQkJCQkvLyAtLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0ludGVyZmFjZSAtLS0tLS0KKwkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdDbG9uZWFibGUoZXhwcmVzc2lvblRiKQorCQkJCQkJfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoZXhwcmVzc2lvblRiKSkKKwkJCQkJCS8vcG90ZW50aWFsIHJ1bnRpbWUgZXJyb3IKKwkJCQkJCXsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJaWYgKGNhc3RUYi5pc0NsYXNzKCkpIHsKKwkJCQkJLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tLS0KKwkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLmlzRmluYWwoKSkgeworCQkJCQkJLy9ubyBzdWJjbGFzcyBmb3IgY2FzdFRiLCB0aHVzIGNvbXBpbGUtdGltZSBjaGVjayBpcyB2YWxpZAorCQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7CisJCQkJCS8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0ludGVyZmFjZSAtLS0tLS0tCisJCQkJCWlmIChjYXN0VGIgIT0gZXhwcmVzc2lvblRiCisJCQkJCQkmJiAoU2NvcGUuY29tcGFyZVR5cGVzKGNhc3RUYiwgZXhwcmVzc2lvblRiKSA9PSBOb3RSZWxhdGVkKSkgeworCQkJCQkJTWV0aG9kQmluZGluZ1tdIGNhc3RUYk1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUYikubWV0aG9kcygpOworCQkJCQkJaW50IGNhc3RUYk1ldGhvZHNMZW5ndGggPSBjYXN0VGJNZXRob2RzLmxlbmd0aDsKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBleHByZXNzaW9uVGJNZXRob2RzID0KKwkJCQkJCQkoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UYikubWV0aG9kcygpOworCQkJCQkJaW50IGV4cHJlc3Npb25UYk1ldGhvZHNMZW5ndGggPSBleHByZXNzaW9uVGJNZXRob2RzLmxlbmd0aDsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzdFRiTWV0aG9kc0xlbmd0aDsgaSsrKSB7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHByZXNzaW9uVGJNZXRob2RzTGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkJaWYgKGNhc3RUYk1ldGhvZHNbaV0uc2VsZWN0b3IgPT0gZXhwcmVzc2lvblRiTWV0aG9kc1tqXS5zZWxlY3RvcikgeworCQkJCQkJCQkJaWYgKGNhc3RUYk1ldGhvZHNbaV0ucmV0dXJuVHlwZSAhPSBleHByZXNzaW9uVGJNZXRob2RzW2pdLnJldHVyblR5cGUpIHsKKwkJCQkJCQkJCQlpZiAoY2FzdFRiTWV0aG9kc1tpXS5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhwcmVzc2lvblRiTWV0aG9kc1tqXSkpIHsKKwkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IAorCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciBpbnN0YW5jZU9mRXhwcmVzc2lvbgorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorCSovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQljb2RlU3RyZWFtLmluc3RhbmNlX29mKHR5cGUuYmluZGluZyk7CisJCWlmICghdmFsdWVSZXF1aXJlZCkKKwkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblRiID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJCVR5cGVCaW5kaW5nIGNoZWNrVGIgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cHJlc3Npb25UYiA9PSBudWxsIHx8IGNoZWNrVGIgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICghYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgY2hlY2tUYiwgZXhwcmVzc2lvblRiKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3IodGhpcywgZXhwcmVzc2lvblRiLCBjaGVja1RiKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXRoaXMudHlwZUJpbmRpbmcgPSBCb29sZWFuQmluZGluZzsKKwkJcmV0dXJuIEJvb2xlYW5CaW5kaW5nOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpIHsKKworCQlyZXR1cm4gZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSArICIgaW5zdGFuY2VvZiAiICsgLy8kTk9OLU5MUy0xJAorCQl0eXBlLnRvU3RyaW5nKDApOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW50TGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnRMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1ZTEwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW50TGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBJbnRMaXRlcmFsIGV4dGVuZHMgTnVtYmVyTGl0ZXJhbCB7CisJcHVibGljIGludCB2YWx1ZTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludExpdGVyYWwKKwkJT25lID0gbmV3IEludExpdGVyYWwobmV3IGNoYXJbXXsnMSd9LDAsMCwxKTsvL3VzZWQgZm9yICsrIGFuZCAtLSAKKworCXN0YXRpYyBmaW5hbCBDb25zdGFudCBGT1JNQVRfRVJST1IgPSBuZXcgRG91YmxlQ29uc3RhbnQoMS4wLzAuMCk7IC8vIE5hTjsKK3B1YmxpYyBJbnRMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJc3VwZXIodG9rZW4sIHMsZSk7Cit9CitwdWJsaWMgSW50TGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLGludCBlLCBpbnQgdmFsdWUpIHsKKwl0aGlzKHRva2VuLCBzLGUpOworCXRoaXMudmFsdWUgPSB2YWx1ZTsKK30KK3B1YmxpYyBJbnRMaXRlcmFsKGludCBpbnRWYWx1ZSkgeworCS8vc3BlY2lhbCBvcHRpbWl6ZWQgY29uc3RydWN0b3IgOiB0aGUgY3N0IGlzIHRoZSBhcmd1bWVudCAKKworCS8vdmFsdWUgdGhhdCBzaG91bGQgbm90IGJlIHVzZWQKKwkvLwl0b2tlbnMgPSBudWxsIDsKKwkvLwlzb3VyY2VTdGFydCA9IDA7CisJLy8Jc291cmNlRW5kID0gMDsKKwlzdXBlcihudWxsLDAsMCk7CisJY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUoaW50VmFsdWUpOworCXZhbHVlID0gaW50VmFsdWU7CisJCit9CitwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7CisJLy9hIHNwZWNpYWwgY29uc3RhbnQgaXMgdXNlIGZvciB0aGUgcG90ZW50aWFsIEludGVnZXIuTUFYX1ZBTFVFKzEKKwkvL3doaWNoIGlzIGxlZ2FsIGlmIHVzZWQgd2l0aCBhIC0gYXMgcHJlZml4Li4uLmNvb2wuLi4uCisJLy9ub3RpY2UgdGhhdCBJbnRlZ2VyLk1JTl9WQUxVRSAgPT0gLTIxNDc0ODM2NDgKKworCWxvbmcgTUFYID0gSW50ZWdlci5NQVhfVkFMVUU7CisJaWYgKHRoaXMgPT0gT25lKSB7CWNvbnN0YW50ID0gQ29uc3RhbnQuT25lOyByZXR1cm4gO30KKwkKKwlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDsKKwlsb25nIGNvbXB1dGVkVmFsdWUgPSAwTDsKKwlpZiAoc291cmNlWzBdID09ICcwJykKKwl7CU1BWCA9IDB4RkZGRkZGRkZMIDsgLy9hIGxvbmcgaW4gb3JkZXIgdG8gYmUgcG9zaXRpdmUgISAJCisJCWlmIChsZW5ndGggPT0gMSkgewljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSgwKTsgcmV0dXJuIDt9CisJCWZpbmFsIGludCBzaGlmdCxyYWRpeDsKKwkJaW50IGogOworCQlpZiAoIChzb3VyY2VbMV0gPT0gJ3gnKSB8IChzb3VyY2VbMV0gPT0gJ1gnKSApCisJCXsJc2hpZnQgPSA0IDsgaiA9IDI7IHJhZGl4ID0gMTY7fQorCQllbHNlCisJCXsJc2hpZnQgPSAzIDsgaiA9IDE7IHJhZGl4ID0gODt9CisJCXdoaWxlIChzb3VyY2Vbal09PScwJykgCisJCXsJaisrOyAvL2p1bXAgb3ZlciByZWRvbmRhbnQgemVybworCQkJaWYgKGogPT0gbGVuZ3RoKQorCQkJewkvL3dhdGNoIGZvciAwMDAwMDAwMDAwMDAwMDAwMDAgCTotKAorCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlID0gKGludCljb21wdXRlZFZhbHVlKTsKKwkJCQlyZXR1cm4gO319CisJCQorCQl3aGlsZSAoajxsZW5ndGgpCisJCXsJaW50IGRpZ2l0VmFsdWUgOworCQkJaWYgKChkaWdpdFZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KHNvdXJjZVtqKytdLHJhZGl4KSkJPCAwICkgCQorCQkJewljb25zdGFudCA9IEZPUk1BVF9FUlJPUjsgcmV0dXJuIDt9CisJCQljb21wdXRlZFZhbHVlID0gKGNvbXB1dGVkVmFsdWU8PHNoaWZ0KSB8IGRpZ2l0VmFsdWUgOworCQkJaWYgKGNvbXB1dGVkVmFsdWUgPiBNQVgpIHJldHVybiAvKmNvbnN0YW50IHN0YXlzIG51bGwqLyA7fX0KKwllbHNlCisJewkvLy0tLS0tLS0tLS0tcmVndWxhciBjYXNlIDogcmFkaXggPSAxMC0tLS0tLS0tLS0tCisJCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDtpKyspCisJCXsJaW50IGRpZ2l0VmFsdWUgOworCQkJaWYgKChkaWdpdFZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KHNvdXJjZVtpXSwxMCkpCTwgMCApIAorCQkJewljb25zdGFudCA9IEZPUk1BVF9FUlJPUjsgcmV0dXJuIDt9CisJCQljb21wdXRlZFZhbHVlID0gMTAqY29tcHV0ZWRWYWx1ZSArIGRpZ2l0VmFsdWU7CisJCQlpZiAoY29tcHV0ZWRWYWx1ZSA+IE1BWCkgcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovIDsgfX0KKworCWNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKHZhbHVlID0gKGludCljb21wdXRlZFZhbHVlKTsKKwkJCit9CisvKioKKyAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgaW50IGxpdGVyYWwKKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovIAorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHZhbHVlUmVxdWlyZWQpCisJCWlmICgoaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfaW50KQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSh2YWx1ZSk7CisJCWVsc2UKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlyZXR1cm4gSW50QmluZGluZzsKK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIG1heVJlcHJlc2VudE1JTl9WQUxVRSgpeworCS8vYSBzcGVjaWFsIGF1dG9yaXplZCBpbnQgbGl0ZXJyYWwgaXMgMjE0NzQ4MzY0OAorCS8vd2hpY2ggaXMgT05FIG92ZXIgdGhlIGxpbWl0LiBUaGlzIHNwZWNpYWwgY2FzZSAKKwkvL29ubHkgaXMgdXNlZCBpbiBjb21iaW5haXNvbiB3aXRoIC0gdG8gZGVub3RlCisJLy90aGUgbWluaW1hbCB2YWx1ZSBvZiBpbnQgLTIxNDc0ODM2NDgKKworCXJldHVybiAoKHNvdXJjZS5sZW5ndGggPT0gMTApICYmCisJCQkoc291cmNlWzBdID09ICcyJykgJiYKKwkJCShzb3VyY2VbMV0gPT0gJzEnKSAmJgorCQkJKHNvdXJjZVsyXSA9PSAnNCcpICYmCisJCQkoc291cmNlWzNdID09ICc3JykgJiYJCQkKKwkJCShzb3VyY2VbNF0gPT0gJzQnKSAmJgorCQkJKHNvdXJjZVs1XSA9PSAnOCcpICYmCisJCQkoc291cmNlWzZdID09ICczJykgJiYKKwkJCShzb3VyY2VbN10gPT0gJzYnKSAmJgkJCQorCQkJKHNvdXJjZVs4XSA9PSAnNCcpICYmCisJCQkoc291cmNlWzldID09ICc4JykpO30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gdGhlIGZvcm1hdCBtYXkgYmUgaW5jb3JyZWN0IHdoaWxlIHRoZSBzY2FubmVyIGNvdWxkIGRldGVjdAorCS8vIHN1Y2ggYW4gZXJyb3Igb25seSBvbiBwYWluZnVsbCB0ZXN0cy4uLmVhc2llciBhbmQgZmFzdGVyIGhlcmUKKworCVR5cGVCaW5kaW5nIHRiID0gc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmIChjb25zdGFudCA9PSBGT1JNQVRfRVJST1IpIHsKKwkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbnN0YW50T3V0T2ZGb3JtYXQodGhpcyk7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gdGI7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCisJaWYgKHNvdXJjZSA9PSBudWxsKQorCS8qIHNwZWNpYWwgb3B0aW1pemVkIEludExpdGVyYWwgdGhhdCBhcmUgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgKi8KKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZhbHVlKTsKKwkJCisJcmV0dXJuIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpO30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW50TGl0ZXJhbE1pblZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworCitwdWJsaWMgY2xhc3MgSW50TGl0ZXJhbE1pblZhbHVlIGV4dGVuZHMgSW50TGl0ZXJhbCB7CisKKwlmaW5hbCBzdGF0aWMgY2hhcltdIENoYXJWYWx1ZSA9IG5ldyBjaGFyW117Jy0nLCcyJywnMScsJzQnLCc3JywnNCcsJzgnLCczJywnNicsJzQnLCc4J307CisJZmluYWwgc3RhdGljIENvbnN0YW50IE1JTl9WQUxVRSA9IENvbnN0YW50LmZyb21WYWx1ZShJbnRlZ2VyLk1JTl9WQUxVRSkgOyAKKworcHVibGljIEludExpdGVyYWxNaW5WYWx1ZSgpIHsKKwlzdXBlcihDaGFyVmFsdWUsMCwwLEludGVnZXIuTUlOX1ZBTFVFKTsKKwljb25zdGFudCA9IE1JTl9WQUxVRTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpeworCQorCS8qcHJlY29tcHV0ZWQgYXQgY3JlYXRpb24gdGltZSovIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MYWJlbGVkU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3OGE2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwlwdWJsaWMgU3RhdGVtZW50IHN0YXRlbWVudDsKKwlwdWJsaWMgY2hhcltdIGxhYmVsOworCXB1YmxpYyBMYWJlbCB0YXJnZXRMYWJlbDsKKworCS8vIGZvciBsb2NhbCB2YXJpYWJsZXMgdGFibGUgYXR0cmlidXRlcworCWludCBtZXJnZWRJbml0U3RhdGVJbmRleCA9IC0xOworCQorCS8qKgorCSAqIExhYmVsZWRTdGF0ZW1lbnQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgTGFiZWxlZFN0YXRlbWVudChjaGFyW10gbCwgU3RhdGVtZW50IHN0LCBpbnQgcywgaW50IGUpIHsKKwkJCisJCXRoaXMuc3RhdGVtZW50ID0gc3Q7CisJCXRoaXMubGFiZWwgPSBsOworCQl0aGlzLnNvdXJjZVN0YXJ0ID0gczsKKwkJdGhpcy5zb3VyY2VFbmQgPSBlOworCX0KKwkKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBuZWVkIHRvIHN0YWNrIGEgY29udGV4dCB0byBzdG9yZSBleHBsaWNpdCBsYWJlbCwgYW5zd2VyIGluaXRzIGluIGNhc2Ugb2Ygbm9ybWFsIGNvbXBsZXRpb24gbWVyZ2VkCisJCS8vIHdpdGggdGhvc2UgcmVsYXRpdmUgdG8gdGhlIGV4aXQgcGF0aCBmcm9tIGJyZWFrIHN0YXRlbWVudCBvY2N1cnJpbmcgaW5zaWRlIHRoZSBsYWJlbGVkIHN0YXRlbWVudC4KKwkJaWYgKHN0YXRlbWVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmxvd0luZm87CisJCX0gZWxzZSB7CisJCQlMYWJlbEZsb3dDb250ZXh0IGxhYmVsQ29udGV4dDsKKwkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPQorCQkJCXN0YXRlbWVudAorCQkJCQkuYW5hbHlzZUNvZGUoCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQkobGFiZWxDb250ZXh0ID0KKwkJCQkJCQluZXcgTGFiZWxGbG93Q29udGV4dCgKKwkJCQkJCQkJZmxvd0NvbnRleHQsCisJCQkJCQkJCXRoaXMsCisJCQkJCQkJCWxhYmVsLAorCQkJCQkJCQkodGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwoKSksCisJCQkJCQkJCWN1cnJlbnRTY29wZSkpLAorCQkJCQkJZmxvd0luZm8pCisJCQkJCS5tZXJnZWRXaXRoKGxhYmVsQ29udGV4dC5pbml0c09uQnJlYWspOworCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCX0KKwl9CisJCisJcHVibGljIEFzdE5vZGUgY29uY3JldGVTdGF0ZW1lbnQoKSB7CisJCQorCQlyZXR1cm4gc3RhdGVtZW50LmNvbmNyZXRlU3RhdGVtZW50KCk7CisJfQorCQorCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgbGFiZWxlZCBzdGF0ZW1lbnQKKwkgKgorCSAqIG1heSBub3QgbmVlZCBhY3R1YWwgc291cmNlIHBvc2l0aW9ucyByZWNvcmRpbmcKKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJCQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAodGFyZ2V0TGFiZWwgIT0gbnVsbCkgeworCQkJdGFyZ2V0TGFiZWwuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CisJCQlpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKKwkJCQlzdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCQl9CisJCQl0YXJnZXRMYWJlbC5wbGFjZSgpOworCQl9CisJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQltZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQorCQlzdGF0ZW1lbnQucmVzb2x2ZShzY29wZSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgKz0gbmV3IFN0cmluZyhsYWJlbCkgKyAiOiAiICsgc3RhdGVtZW50LnRvU3RyaW5nKDApOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJc3RhdGVtZW50LnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorCisJcHVibGljIHZvaWQgcmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCkgeworCisJCXRoaXMudGFyZ2V0TGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5ZmE5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkKKworcHVibGljIExpdGVyYWwoaW50IHMsaW50IGUpIHsKKwlzb3VyY2VTdGFydCA9IHMgOworCXNvdXJjZUVuZD0gZTsKK30KK3B1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXB1dGVDb25zdGFudCgpIDsKKwkvL09OIEVSUk9SIGNvbnN0YW50IFNUQVlTIE5VTEwKK3B1YmxpYyBhYnN0cmFjdCBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKTsKK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gY29tcHV0ZSB0aGUgcmVhbCB2YWx1ZSwgd2hpY2ggbXVzdCByYW5nZSBpdHMgdHlwZSdzIHJhbmdlCisKKwljb21wdXRlQ29uc3RhbnQoKTsKKwlpZiAoY29uc3RhbnQgPT0gbnVsbCkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb25zdGFudE91dE9mUmFuZ2UodGhpcyk7CisJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIGxpdGVyYWxUeXBlKHNjb3BlKTsKK30KK3B1YmxpYyBhYnN0cmFjdCBjaGFyW10gc291cmNlKCkgOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb2NhbERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTczMWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb2NhbERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgTG9jYWxEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB7CisKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgYmluZGluZzsKKworCXB1YmxpYyBMb2NhbERlY2xhcmF0aW9uKAorCQlFeHByZXNzaW9uIGV4cHIsCisJCWNoYXJbXSBuYW1lLAorCQlpbnQgc291cmNlU3RhcnQsCisJCWludCBzb3VyY2VFbmQpIHsKKworCQlpbml0aWFsaXphdGlvbiA9IGV4cHI7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kID0gaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOworCQl9IGVsc2UgeworCQkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJfQorCQl0aGlzLmRlY2xhcmF0aW9uRW5kID0gdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyByZWNvcmQgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gaWYgYW55CisJCWlmICghZmxvd0luZm8uaXNEZWFkRW5kKCkgJiYgIWZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKSB7CisJCQliaXRzIHw9IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZU1BU0s7IC8vIG9ubHkgc2V0IGlmIGFjdHVhbGx5IHJlYWNoZWQKKwkJfQorCQlpZiAoaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkKKwkJCXJldHVybiBmbG93SW5mbzsKKwkJZmxvd0luZm8gPQorCQkJaW5pdGlhbGl6YXRpb24KKwkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCisJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZyk7CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBjaGVja01vZGlmaWVycygpIHsKKwkJLy9vbmx5IHBvdGVudGlhbCB2YWxpZCBtb2RpZmllciBpcyA8PGZpbmFsPj4KKworCQlpZiAoKChtb2RpZmllcnMgJiBBY2NKdXN0RmxhZykgfCBBY2NGaW5hbCkgIT0gQWNjRmluYWwpCisJCQkvL0FjY01vZGlmaWVyUHJvYmxlbSAtPiBvdGhlciAobm9uLXZpc2liaWxpdHkgcHJvYmxlbSkKKwkJCS8vQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtIC0+IGR1cGxpY2F0ZSBtb2RpZmllcgorCQkJLy9BY2NNb2RpZmllclByb2JsZW0gfCBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gLT4gdmlzaWJpbGl0eSBwcm9ibGVtIgorCQkJLy8gLXgtMSByZXR1cm5zIHRoZSBiaXRJbnZlcnQgCisKKwkJCW1vZGlmaWVycyA9CisJCQkJKG1vZGlmaWVycyAmICgtQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtIC0gMSkpIHwgQWNjTW9kaWZpZXJQcm9ibGVtOworCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgYSBsb2NhbCBkZWNsYXJhdGlvbjoKKwkgKglpLmUuJm5ic3A7bm9ybWFsIGFzc2lnbm1lbnQgdG8gYSBsb2NhbCB2YXJpYWJsZSArIHVudXNlZCB2YXJpYWJsZSBoYW5kbGluZyAKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCUNvbnN0YW50IGlubGluZWRWYWx1ZTsKKwkJLy8gc29tZXRoaW5nIHRvIGluaXRpYWxpemU/CisJCWlmIChiaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0uYWRkVmlzaWJsZUxvY2FsVmFyaWFibGUoYmluZGluZyk7CisJCX0KKwkJaWYgKGluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKKwkJCS8vIGluaXRpYWxpemUgdG8gY29uc3RhbnQgdmFsdWU/CisJCQlpZiAoKGlubGluZWRWYWx1ZSA9IGluaXRpYWxpemF0aW9uLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkvLyBmb3JnZXQgaW5pdGlhbGl6aW5nIHVudXNlZCBvciBmaW5hbCBsb2NhbHMgc2V0IHRvIGNvbnN0YW50IHZhbHVlIChmaW5hbCBvbmVzIGFyZSBpbmxpbmVkKQorCQkJCWlmIChiaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsgLy8gbWF5IG5lZWQgdG8gcHJlc2VydmUgdmFyaWFibGUKKwkJCQkJaW50IGluaXRQQyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChpbmxpbmVkVmFsdWUsIGluaXRpYWxpemF0aW9uLmltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShpbml0UEMsIGluaXRpYWxpemF0aW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQkJY29kZVN0cmVhbS5zdG9yZShiaW5kaW5nLCBmYWxzZSk7CisJCQkJCWJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOworCQkJCQkvLwkJCQljb2RlU3RyZWFtLmxhc3RJbml0U3RhdGVJbmRleFdoZW5SZW1vdmluZ0luaXRzID0gLTI7IC8vIHJlaW5pdGlhbGl6ZSByZW1vdmUgaW5kZXggCisJCQkJCS8vCQkJCWNvZGVTdHJlYW0ubGFzdEluaXRTdGF0ZUluZGV4V2hlbkFkZGluZ0luaXRzID0gLTI7IC8vIHJlaW5pdGlhbGl6ZSBhZGQgaW5kZXgJCQorCQkJCX0KKwkJCX0gZWxzZSB7IC8vIGluaXRpYWxpemluZyB0byBub24tY29uc3RhbnQgdmFsdWUKKwkJCQlpbml0aWFsaXphdGlvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCQkvLyBpZiBiaW5kaW5nIHVudXNlZCBnZW5lcmF0ZSB0aGVuIGRpc2NhcmQgdGhlIHZhbHVlCisJCQkJaWYgKGJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgeworCQkJCQljb2RlU3RyZWFtLnN0b3JlKGJpbmRpbmcsIGZhbHNlKTsKKwkJCQkJaWYgKGJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCA9PSAwKSB7CisJCQkJCQkvKiBWYXJpYWJsZSBtYXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGR1cmluZyB0aGUgY29kZSBpbml0aWFsaXppbmcgaXQKKwkJCQkJCQllLmcuIGludCBpID0gKGkgPSAxKTsKKwkJCQkJCSovCisJCQkJCQliaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJCQkJCS8vCQkJCQljb2RlU3RyZWFtLmxhc3RJbml0U3RhdGVJbmRleFdoZW5SZW1vdmluZ0luaXRzID0gLTI7IC8vIHJlaW5pdGlhbGl6ZSByZW1vdmUgaW5kZXggCisJCQkJCQkvLwkJCQkJY29kZVN0cmVhbS5sYXN0SW5pdFN0YXRlSW5kZXhXaGVuQWRkaW5nSW5pdHMgPSAtMjsgLy8gcmVpbml0aWFsaXplIGFkZCBpbmRleCAKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoYmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAoYmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCS8vIGNyZWF0ZSBhIGJpbmRpbmcgYW5kIGFkZCBpdCB0byB0aGUgc2NvcGUKKwkJVHlwZUJpbmRpbmcgdGIgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKworCQljaGVja01vZGlmaWVycygpOworCisJCWlmICh0YiAhPSBudWxsKSB7CisJCQlpZiAodGIgPT0gVm9pZEJpbmRpbmcpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS52YXJpYWJsZVR5cGVDYW5ub3RCZVZvaWQodGhpcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKHRiLmlzQXJyYXlUeXBlKCkgJiYgKChBcnJheUJpbmRpbmcpIHRiKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBWb2lkQmluZGluZykgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnZhcmlhYmxlVHlwZUNhbm5vdEJlVm9pZEFycmF5KHRoaXMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8vIGR1cGxpY2F0ZSBjaGVja3MKKwkJaWYgKChiaW5kaW5nID0gc2NvcGUuZHVwbGljYXRlTmFtZShuYW1lKSkgIT0gbnVsbCkgeworCQkJLy8gdGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuLi4gbWF5IGNhcnJ5IG9uIHdpdGggdGhlIGZpcnN0IGJpbmRpbmcuLi4KKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZGVmaW5lTG9jYWwodGhpcyk7CisJCX0gZWxzZSB7CisJCQliaW5kaW5nID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKHRoaXMsIHRiLCBtb2RpZmllcnMsIGZhbHNlKTsKKwkJCXNjb3BlLmFkZExvY2FsVmFyaWFibGUoYmluZGluZyk7CisJCQliaW5kaW5nLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJLy8gYWxsb3cgdG8gcmVjdXJzaXZlbGx5IHRhcmdldCB0aGUgYmluZGluZy4uLi4KKwkJCS8vIHRoZSBjb3JyZWN0IGNvbnN0YW50IGlzIGhhcm1lZCBpZiBjb3JyZWN0bHkgY29tcHV0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZAorCQl9CisKKwkJaWYgKHRiID09IG51bGwpIHsKKwkJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKQorCQkJCWluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlKHNjb3BlKTsgLy8gd2FudCB0byByZXBvcnQgYWxsIHBvc3NpYmxlIGVycm9ycworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gc3RvcmUgdGhlIGNvbnN0YW50IGZvciBmaW5hbCBsb2NhbHMgCQorCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJaWYgKGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikgeworCQkJCVR5cGVCaW5kaW5nIGluaXRUYiA9IGluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCB0Yik7CisJCQkJaWYgKGluaXRUYiAhPSBudWxsKSB7CisJCQkJCSgoQXJyYXlJbml0aWFsaXplcikgaW5pdGlhbGl6YXRpb24pLmJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSBpbml0VGI7CisJCQkJCWluaXRpYWxpemF0aW9uLmltcGxpY2l0V2lkZW5pbmcodGIsIGluaXRUYik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUeXBlQmluZGluZyBpbml0VGIgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJCQkJaWYgKGluaXRUYiAhPSBudWxsKSB7CisJCQkJCWlmIChpbml0aWFsaXphdGlvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGluaXRUYiwgdGIpCisJCQkJCQl8fCAodGIuaXNCYXNlVHlwZSgpICYmIEJhc2VUeXBlQmluZGluZy5pc1dpZGVuaW5nKHRiLmlkLCBpbml0VGIuaWQpKQorCQkJCQkJfHwgc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGluaXRUYiwgdGIpKQorCQkJCQkJaW5pdGlhbGl6YXRpb24uaW1wbGljaXRXaWRlbmluZyh0YiwgaW5pdFRiKTsKKwkJCQkJZWxzZQorCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IoaW5pdFRiLCB0YiwgdGhpcyk7CisJCQkJfQorCQkJfQorCisJCQkvLyBjaGFuZ2UgdGhlIGNvbnN0YW50IGluIHRoZSBiaW5kaW5nIHdoZW4gaXQgaXMgZmluYWwKKwkJCS8vICh0aGUgb3B0aW1pemF0aW9uIG9mIHRoZSBjb25zdGFudCBwcm9wYWdhdGlvbiB3aWxsIGJlIGRvbmUgbGF0ZXIgb24pCisJCQkvLyBjYXN0IGZyb20gY29uc3RhbnQgYWN0dWFsIHR5cGUgdG8gdmFyaWFibGUgdHlwZQorCQkJYmluZGluZy5jb25zdGFudCA9CisJCQkJYmluZGluZy5pc0ZpbmFsKCkKKwkJCQkJPyBpbml0aWFsaXphdGlvbi5jb25zdGFudC5jYXN0VG8oKHRiLmlkIDw8IDQpICsgaW5pdGlhbGl6YXRpb24uY29uc3RhbnQudHlwZUlEKCkpCisJCQkJCTogTm90QUNvbnN0YW50OworCQl9CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJdHlwZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAoaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkKKwkJCQlpbml0aWFsaXphdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkzY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb2NhbFR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOworCitwdWJsaWMgY2xhc3MgTG9jYWxUeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBJbm5lclR5cGVEZWNsYXJhdGlvbiB7CisJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gZW5jbG9zaW5nTWV0aG9kOworCitwdWJsaWMgTG9jYWxUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKK30JCisKKy8qKgorICoJSXRlcmF0aW9uIGZvciBhIGxvY2FsIGlubmVydHlwZQorICoKKyAqLworcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQlyZXR1cm47CisJdHJ5IHsKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpCisJCQkJc3VwZXJjbGFzcy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlpbnQgc3VwZXJJbnRlcmZhY2VMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJJbnRlcmZhY2VMZW5ndGg7IGkrKykKKwkJCQkJc3VwZXJJbnRlcmZhY2VzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCX0KKwkJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJaW50IG1lbWJlclR5cGVzTGVuZ3RoID0gbWVtYmVyVHlwZXMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXNMZW5ndGg7IGkrKykKKwkJCQkJbWVtYmVyVHlwZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCQkJaW50IGZpZWxkc0xlbmd0aCA9IGZpZWxkcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNMZW5ndGg7IGkrKykgeworCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkOworCQkJCQlpZiAoKGZpZWxkID0gZmllbGRzW2ldKS5pc1N0YXRpYygpKSB7CisJCQkJCQkvLyBsb2NhbCB0eXBlIGNhbm5vdCBoYXZlIHN0YXRpYyBmaWVsZHMKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZpZWxkLnRyYXZlcnNlKHZpc2l0b3IsIGluaXRpYWxpemVyU2NvcGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCWludCBtZXRob2RzTGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzTGVuZ3RoOyBpKyspCisJCQkJCW1ldGhvZHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3ZjczYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWwuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgTG9uZ0xpdGVyYWwgZXh0ZW5kcyBOdW1iZXJMaXRlcmFsIHsKKwlsb25nIHZhbHVlOworCQorCXN0YXRpYyBmaW5hbCBDb25zdGFudCBGT1JNQVRfRVJST1IgPSBuZXcgRG91YmxlQ29uc3RhbnQoMS4wLzAuMCk7IC8vIE5hTjsJCisJCQorcHVibGljIExvbmdMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsaW50IGUpIHsKKwlzdXBlcih0b2tlbiwgcyxlKTsKK30KK3B1YmxpYyBMb25nTGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLGludCBlLCBsb25nIHZhbHVlKSB7CisJdGhpcyh0b2tlbiwgcyxlKTsKKwl0aGlzLnZhbHVlID0gdmFsdWU7Cit9CitwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoKSB7CisJLy90aGUgb3ZlcmZsb3cgKHdoZW4gcmFkaXg9MTApIGlzIHRlc3RlZCB1c2luZyB0aGUgZmFjdCB0aGF0CisJLy90aGUgdmFsdWUgc2hvdWxkIGFsd2F5cyBncm93IGR1cmluZyBpdHMgY29tcHV0YXRpb24KKworCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoIC0gMTsgLy9taW51cyBvbmUgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzICdsJyBvciAnTCcKKwkKKwlsb25nIGNvbXB1dGVkVmFsdWUgOworCWlmIChzb3VyY2VbMF0gPT0gJzAnKQorCXsJaWYgKGxlbmd0aCA9PSAxKSB7IAljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSgwTCk7CXJldHVybjsJfQorCQlmaW5hbCBpbnQgc2hpZnQscmFkaXg7CisJCWludCBqIDsKKwkJaWYgKCAoc291cmNlWzFdID09ICd4JykgfCAoc291cmNlWzFdID09ICdYJykgKQorCQl7CXNoaWZ0ID0gNCA7IGogPSAyOyByYWRpeCA9IDE2O30KKwkJZWxzZQorCQl7CXNoaWZ0ID0gMyA7IGogPSAxOyByYWRpeCA9IDg7fQorCQlpbnQgbmJEaWdpdCA9IDA7CisJCXdoaWxlIChzb3VyY2Vbal09PScwJykgCisJCXsJaisrOyAvL2p1bXAgb3ZlciByZWRvbmRhbnQgemVybworCQkJaWYgKCBqID09IGxlbmd0aCkKKwkJCXsJLy93YXRjaCBmb3IgMDAwMDAwMDAwMDAwMEwKKwkJCQljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSh2YWx1ZSA9IDBMKTsKKwkJCQlyZXR1cm4gO319CisJCQkJCisJCWludCBkaWdpdFZhbHVlIDsKKwkJaWYgKChkaWdpdFZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KHNvdXJjZVtqKytdLHJhZGl4KSkJPCAwICkgCQorCQl7CWNvbnN0YW50ID0gRk9STUFUX0VSUk9SOyByZXR1cm4gO30KKwkJaWYgKGRpZ2l0VmFsdWUgPj0gOCkgbmJEaWdpdCA9IDQ7CisJCWVsc2UgCWlmIChkaWdpdFZhbHVlID49IDQpIG5iRGlnaXQgPSAzOworCQkJCWVsc2UgCWlmIChkaWdpdFZhbHVlID49IDIpIG5iRGlnaXQgPSAyOworCQkJCQkJZWxzZSBuYkRpZ2l0ID0gMTsgLy9kaWdpdFZhbHVlIGlzIG5vdCAwCisJCWNvbXB1dGVkVmFsdWUgPSBkaWdpdFZhbHVlIDsKKwkJd2hpbGUgKGo8bGVuZ3RoKQorCQl7CWlmICgoZGlnaXRWYWx1ZSA9IENoYXJhY3Rlci5kaWdpdChzb3VyY2VbaisrXSxyYWRpeCkpCTwgMCApIAkKKwkJCXsJY29uc3RhbnQgPSBGT1JNQVRfRVJST1I7IHJldHVybiA7fQorCQkJaWYgKChuYkRpZ2l0ICs9IHNoaWZ0KSA+IDY0KSByZXR1cm4gLypjb25zdGFudCBzdGF5cyBudWxsKi8gOworCQkJY29tcHV0ZWRWYWx1ZSA9IChjb21wdXRlZFZhbHVlPDxzaGlmdCkgfCBkaWdpdFZhbHVlIDt9fQorCisJZWxzZQorCXsJLy8tLS0tLS0tLS0tLWNhc2UgcmFkaXg9MTAtLS0tLS0tLS0tLS0tLS0tLQorCQlsb25nIHByZXZpb3VzID0gY29tcHV0ZWRWYWx1ZSA9IDA7CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSAKKwkJewlpbnQgZGlnaXRWYWx1ZSA7CQorCQkJaWYgKChkaWdpdFZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KHNvdXJjZVtpXSwgMTApKSA8IDAgKSByZXR1cm4gLypjb25zdGFudCBzdGF5cyBudWxsKi8gOworCQkJcHJldmlvdXMgPSBjb21wdXRlZFZhbHVlOworCQkJY29tcHV0ZWRWYWx1ZSA9IDEwICogY29tcHV0ZWRWYWx1ZSArIGRpZ2l0VmFsdWUgOworCQkJaWYgKHByZXZpb3VzID4gY29tcHV0ZWRWYWx1ZSkgcmV0dXJuIC8qY29uc3RhbnQgc3RheXMgbnVsbCovO319CisJCisJY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUodmFsdWUgPSBjb21wdXRlZFZhbHVlKTsKK30KKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciBsb25nIGxpdGVyYWwKKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovIAorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHZhbHVlUmVxdWlyZWQpCisJCWlmICgoaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfbG9uZykKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUodmFsdWUpOworCQllbHNlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJcmV0dXJuIExvbmdCaW5kaW5nOworfQorcHVibGljIGZpbmFsIGJvb2xlYW4gbWF5UmVwcmVzZW50TUlOX1ZBTFVFKCl7CisJLy9hIHNwZWNpYWwgYXV0b3JpemVkIGludCBsaXRlcnJhbCBpcyA5MjIzMzcyMDM2ODU0Nzc1ODA4TAorCS8vd2hpY2ggaXMgT05FIG92ZXIgdGhlIGxpbWl0LiBUaGlzIHNwZWNpYWwgY2FzZSAKKwkvL29ubHkgaXMgdXNlZCBpbiBjb21iaW5haXNvbiB3aXRoIC0gdG8gZGVub3RlCisJLy90aGUgbWluaW1hbCB2YWx1ZSBvZiBpbnQgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMCisKKwlyZXR1cm4gKChzb3VyY2UubGVuZ3RoID09IDIwKSAmJgorCQkJKHNvdXJjZVswXSA9PSAnOScpICYmCisJCQkoc291cmNlWzFdID09ICcyJykgJiYKKwkJCShzb3VyY2VbMl0gPT0gJzInKSAmJgorCQkJKHNvdXJjZVszXSA9PSAnMycpICYmCQkJCisJCQkoc291cmNlWzRdID09ICczJykgJiYKKwkJCShzb3VyY2VbNV0gPT0gJzcnKSAmJgorCQkJKHNvdXJjZVs2XSA9PSAnMicpICYmCisJCQkoc291cmNlWzddID09ICcwJykgJiYJCQkKKwkJCShzb3VyY2VbOF0gPT0gJzMnKSAmJgorCQkJKHNvdXJjZVs5XSA9PSAnNicpICYmCisJCQkoc291cmNlWzEwXSA9PSAnOCcpICYmCisJCQkoc291cmNlWzExXSA9PSAnNScpICYmCisJCQkoc291cmNlWzEyXSA9PSAnNCcpICYmCQkJCisJCQkoc291cmNlWzEzXSA9PSAnNycpICYmCisJCQkoc291cmNlWzE0XSA9PSAnNycpICYmCisJCQkoc291cmNlWzE1XSA9PSAnNScpICYmCisJCQkoc291cmNlWzE2XSA9PSAnOCcpICYmCQkJCisJCQkoc291cmNlWzE3XSA9PSAnMCcpICYmCisJCQkoc291cmNlWzE4XSA9PSAnOCcpKTt9CitwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIHRoZSBmb3JtYXQgbWF5IGJlIGluY29ycmVjdCB3aGlsZSB0aGUgc2Nhbm5lciBjb3VsZCBkZXRlY3QKKwkvLyBzdWNoIGVycm9yIG9ubHkgb24gcGFpbmZ1bGwgdGVzdHMuLi5lYXNpZXIgYW5kIGZhc3RlciBoZXJlCisKKwlUeXBlQmluZGluZyB0YiA9IHN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKKwlpZiAoY29uc3RhbnQgPT0gRk9STUFUX0VSUk9SKSB7CisJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb25zdGFudE91dE9mRm9ybWF0KHRoaXMpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIHRiOworfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsTWluVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIyZDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CisKK3B1YmxpYyBjbGFzcyBMb25nTGl0ZXJhbE1pblZhbHVlIGV4dGVuZHMgTG9uZ0xpdGVyYWwgeworCisJZmluYWwgc3RhdGljIGNoYXJbXSBDaGFyVmFsdWUgPSBuZXcgY2hhcltdeyctJywgJzknLCcyJywnMicsJzMnLCczJywnNycsJzInLCcwJywnMycsJzYnLCc4JywnNScsJzQnLCc3JywnNycsJzUnLCc4JywnMCcsJzgnLCdMJ307CisJZmluYWwgc3RhdGljIENvbnN0YW50IE1JTl9WQUxVRSA9IENvbnN0YW50LmZyb21WYWx1ZShMb25nLk1JTl9WQUxVRSkgOyAKKworcHVibGljIExvbmdMaXRlcmFsTWluVmFsdWUoKXsKKwlzdXBlcihDaGFyVmFsdWUsMCwwLExvbmcuTUlOX1ZBTFVFKTsKKwljb25zdGFudCA9IE1JTl9WQUxVRTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKworCS8qcHJlY29tcHV0ZWQgYXQgY3JlYXRpb24gdGltZSovfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYWdpY0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFnaWNMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMjRkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFnaWNMaXRlcmFsLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzICBNYWdpY0xpdGVyYWwgZXh0ZW5kcyBMaXRlcmFsIHsKK3B1YmxpYyBNYWdpY0xpdGVyYWwoaW50IHMgLCBpbnQgZSkgeworCXN1cGVyKHMsZSk7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpeworCS8vc2hvdWxkIG5ldmVyIGJlIHJlYWNoLCBidXQgd2l0aCBhIGJ1ZyBpbiB0aGUgYXN0IHRyZWUuLi4uCisJLy9zZWUgY29tbWVudCBvbiB0aGUgU3RhdGVtZW50IGNsYXNzCisJCisJcmV0dXJuIGZhbHNlIDt9CisvKioKKyAqIHNvdXJjZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIGNoYXJbXSBzb3VyY2UoKSB7CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCisJcmV0dXJuICBuZXcgU3RyaW5nKHNvdXJjZSgpKSA7IH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVtYmVyVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lbWJlclR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzMxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lbWJlclR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydFR5cGU7CisKK3B1YmxpYyBjbGFzcyBNZW1iZXJUeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBJbm5lclR5cGVEZWNsYXJhdGlvbiB7CisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBlbmNsb3NpbmdUeXBlOworCQorcHVibGljIE1lbWJlclR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CisJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworfQkJCisvKioKKyAqCUl0ZXJhdGlvbiBmb3IgYSBtZW1iZXIgaW5uZXJ0eXBlCisgKgorICovCitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKKwlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCXJldHVybjsKKwl0cnkgeworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBjbGFzc1Njb3BlKSkgeworCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkKKwkJCQlzdXBlcmNsYXNzLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCWludCBzdXBlckludGVyZmFjZUxlbmd0aCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZUxlbmd0aDsgaSsrKQorCQkJCQlzdXBlckludGVyZmFjZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJCQlpbnQgbWVtYmVyVHlwZXNMZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlc0xlbmd0aDsgaSsrKQorCQkJCQltZW1iZXJUeXBlc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQlpbnQgZmllbGRzTGVuZ3RoID0gZmllbGRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc0xlbmd0aDsgaSsrKSB7CisJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQ7CisJCQkJCWlmICgoZmllbGQgPSBmaWVsZHNbaV0pLmlzU3RhdGljKCkpIHsKKwkJCQkJCWZpZWxkLnRyYXZlcnNlKHZpc2l0b3IsIHN0YXRpY0luaXRpYWxpemVyU2NvcGUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmllbGQudHJhdmVyc2UodmlzaXRvciwgaW5pdGlhbGl6ZXJTY29wZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJaW50IG1ldGhvZHNMZW5ndGggPSBtZXRob2RzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHNMZW5ndGg7IGkrKykKKwkJCQkJbWV0aG9kc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBjbGFzc1Njb3BlKTsKKwl9IGNhdGNoIChBYm9ydFR5cGUgZSkgeworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM4ODBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXNzYWdlU2VuZC5qYXZhCkBAIC0wLDAgKzEsMzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VTZW5kIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEludm9jYXRpb25TaXRlIHsKKwlwdWJsaWMgRXhwcmVzc2lvbiByZWNlaXZlciA7CisJcHVibGljIGNoYXJbXSBzZWxlY3RvciA7CisJcHVibGljIEV4cHJlc3Npb25bXSBhcmd1bWVudHMgOworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGJpbmRpbmcsIGNvZGVnZW5CaW5kaW5nOworCisJcHVibGljIGxvbmcgbmFtZVNvdXJjZVBvc2l0aW9uIDsgLy8oc3RhcnQ8PDMyKStlbmQKKworCU1ldGhvZEJpbmRpbmcgc3ludGhldGljQWNjZXNzb3I7CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBxdWFsaWZ5aW5nVHlwZTsKKwkKK3B1YmxpYyBNZXNzYWdlU2VuZCgpIHsKKwkKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwlmbG93SW5mbyA9IHJlY2VpdmVyLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCAhYmluZGluZy5pc1N0YXRpYygpKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWZsb3dJbmZvID0gYXJndW1lbnRzW2ldLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJfQorCX0KKwlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duRXhjZXB0aW9uczsKKwlpZiAoKHRocm93bkV4Y2VwdGlvbnMgPSBiaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMpICE9IE5vRXhjZXB0aW9ucykgeworCQkvLyBtdXN0IHZlcmlmeSB0aGF0IGV4Y2VwdGlvbnMgcG90ZW50aWFsbHkgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiBhcmUgY2F1Z2h0IGluIHRoZSBtZXRob2QKKwkJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyh0aHJvd25FeGNlcHRpb25zLCB0aGlzLCBmbG93SW5mbywgY3VycmVudFNjb3BlKTsKKwl9CisJLy8gaWYgaW52b2tpbmcgdGhyb3VnaCBhbiBlbmNsb3NpbmcgaW5zdGFuY2UsIHRoZW4gbXVzdCBwZXJmb3JtIHRoZSBmaWVsZCBnZW5lcmF0aW9uIC0tIG9ubHkgaWYgcmVhY2hhYmxlCisJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CQorCXJldHVybiBmbG93SW5mbzsKK30KKy8qKgorICogTWVzc2FnZVNlbmQgY29kZSBnZW5lcmF0aW9uCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLyAKK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisKKwkvLyBnZW5lcmF0ZSByZWNlaXZlci9lbmNsb3NpbmcgaW5zdGFuY2UgYWNjZXNzCisJYm9vbGVhbiBpc1N0YXRpYyA9IGNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CisJLy8gb3V0ZXIgYWNjZXNzID8KKwlpZiAoIWlzU3RhdGljICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgJiYgKHJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KSl7CisJCS8vIG91dGVyIG1ldGhvZCBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGVtdWxhdGlvbiBpZiBpbXBsaWNpdCBhY2Nlc3MKKwkJT2JqZWN0W10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKKwkJaWYgKHBhdGggPT0gbnVsbCkgeworCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCX0gZWxzZSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJfQorCX0gZWxzZSB7CisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CisJfQorCS8vIGdlbmVyYXRlIGFyZ3VtZW50cworCWlmIChhcmd1bWVudHMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJYXJndW1lbnRzW2ldLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQl9CisJfQorCS8vIGFjdHVhbCBtZXNzYWdlIGludm9jYXRpb24KKwlpZiAoc3ludGhldGljQWNjZXNzb3IgPT0gbnVsbCl7CisJCWlmIChpc1N0YXRpYyl7CisJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhjb2RlZ2VuQmluZGluZyk7CisJCX0gZWxzZSB7CisJCQlpZiggKHJlY2VpdmVyLmlzU3VwZXIoKSkgfHwgY29kZWdlbkJpbmRpbmcuaXNQcml2YXRlKCkpeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChjb2RlZ2VuQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKXsKKwkJCQkJY29kZVN0cmVhbS5pbnZva2VpbnRlcmZhY2UoY29kZWdlbkJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tldmlydHVhbChjb2RlZ2VuQmluZGluZyk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3IpOworCX0KKwkvLyBvcGVyYXRpb24gb24gdGhlIHJldHVybmVkIHZhbHVlCisJaWYgKHZhbHVlUmVxdWlyZWQpeworCQkvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeQorCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJfSBlbHNlIHsKKwkJLy8gcG9wIHJldHVybiB2YWx1ZSBpZiBhbnkKKwkJc3dpdGNoKGJpbmRpbmcucmV0dXJuVHlwZS5pZCl7CisJCQljYXNlIFRfbG9uZyA6CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQljb2RlU3RyZWFtLnBvcDIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF92b2lkIDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJfQorCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIChpbnQpKHRoaXMubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMikpOyAvLyBoaWdobGlnaHQgc2VsZWN0b3IKK30KK3B1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7CQorCXJldHVybiByZWNlaXZlci5pc1N1cGVyKCk7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKSB7CQorCXJldHVybiByZWNlaXZlciAhPSBudWxsICYmIHJlY2VpdmVyLmlzVHlwZVJlZmVyZW5jZSgpOworfQorcHVibGljIHZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApICYmICFiaW5kaW5nLmlzU3RhdGljKCkgJiYgKHJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KSkgeworCQlSZWZlcmVuY2VCaW5kaW5nIGNvbXBhdGlibGVUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJLy8gdGhlIGRlY2xhcmluZ0NsYXNzIG9mIHRoZSB0YXJnZXQgYmluZGluZyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZW5jbG9zaW5nCisJCS8vIHR5cGUgYXQgPGRlcHRoPiBsZXZlbHMgb3V0c2lkZQorCQlmb3IgKGludCBpID0gMCwgZGVwdGggPSAoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVDsgaSA8IGRlcHRoOyBpKyspIHsKKwkJCWNvbXBhdGlibGVUeXBlID0gY29tcGF0aWJsZVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9CisJCWN1cnJlbnRTY29wZS5lbXVsYXRlT3V0ZXJBY2Nlc3MoKFNvdXJjZVR5cGVCaW5kaW5nKSBjb21wYXRpYmxlVHlwZSwgZmFsc2UpOyAvLyByZXF1ZXN0IGNhc2NhZGUgb2YgYWNjZXNzZXMKKwl9Cit9CitwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSl7CisKKwlpZiAoYmluZGluZy5pc1ByaXZhdGUoKSl7CisKKwkJLy8gZGVwdGggaXMgc2V0IGZvciBib3RoIGltcGxpY2l0IGFuZCBleHBsaWNpdCBhY2Nlc3MgKHNlZSBNZXRob2RCaW5kaW5nI2NhbkJlU2VlbkJ5KQkJCisJCWlmIChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpICE9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpeworCQkKKwkJCXN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZyliaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZyk7CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcyhiaW5kaW5nLCB0aGlzKTsKKwkJCXJldHVybjsKKwkJfQorCisJfSBlbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKXsgLy8gcXVhbGlmaWVkIHN1cGVyCisKKwkJLy8gcXVhbGlmaWVkIHN1cGVyIG5lZWQgZW11bGF0aW9uIGFsd2F5cworCQlTb3VyY2VUeXBlQmluZGluZyBkZXN0aW5hdGlvblR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpKCgoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpcmVjZWl2ZXIpLmN1cnJlbnRDb21wYXRpYmxlVHlwZSk7CisJCXN5bnRoZXRpY0FjY2Vzc29yID0gZGVzdGluYXRpb25UeXBlLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nKTsKKwkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCXJldHVybjsKKworCX0gZWxzZSBpZiAoYmluZGluZy5pc1Byb3RlY3RlZCgpKXsKKworCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlOworCQlpZiAoKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSAKKwkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmdldFBhY2thZ2UoKSAKKwkJCQkJIT0gKGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKS5nZXRQYWNrYWdlKCkpeworCisJCQlTb3VyY2VUeXBlQmluZGluZyBjdXJyZW50Q29tcGF0aWJsZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpZW5jbG9zaW5nU291cmNlVHlwZS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOworCQkJc3ludGhldGljQWNjZXNzb3IgPSBjdXJyZW50Q29tcGF0aWJsZVR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoYmluZGluZywgdGhpcyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4JCisJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5xdWFsaWZ5aW5nVHlwZQorCQkmJiAhdGhpcy5xdWFsaWZ5aW5nVHlwZS5pc0FycmF5VHlwZSgpCisJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCSYmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCB8fCAhYmluZGluZy5pc1N0YXRpYygpKQorCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IG1ldGhvZHMKKwkJCXx8ICFiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKSB7CisKKwkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZE1ldGhvZEJpbmRpbmcoYmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucXVhbGlmeWluZ1R5cGUpOworCX0KK30KKworcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBBbnN3ZXIgdGhlIHNpZ25hdHVyZSByZXR1cm4gdHlwZQorCS8vIEJhc2UgdHlwZSBwcm9tb3Rpb24KKworCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCXRoaXMucXVhbGlmeWluZ1R5cGUgPSB0aGlzLnJlY2VpdmVyVHlwZSA9IHJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsgCisJCisJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBhcmdzIGFyZSByZXNvbHZlZAorCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IE5vUGFyYW1ldGVyczsKKwlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOyAvLyB0eXBlQ2hlY2tzIGFsbCBhcmd1bWVudHMgCisJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQlhcmd1bWVudFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCl7CisJCQkJYXJnSGFzRXJyb3IgPSB0cnVlOworCQkJfQorCQl9CisJCWlmIChhcmdIYXNFcnJvcil7CisJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNZXRob2QgPSBudWxsOworCQkJaWYocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCS8vIHJlY29yZCBhbnkgc2VsZWN0b3IgbWF0Y2gsIGZvciBjbGllbnRzIHdobyBtYXkgc3RpbGwgbmVlZCBoaW50IGFib3V0IHBvc3NpYmxlIG1ldGhvZCBtYXRjaAorCQkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcgPSBzY29wZS5maW5kTWV0aG9kKChSZWZlcmVuY2VCaW5kaW5nKXJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIG5ldyBUeXBlQmluZGluZ1tde30sIHRoaXMpOworCQkJfQkJCQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJaWYgKHRoaXMucmVjZWl2ZXJUeXBlID09IG51bGwpCisJCXJldHVybiBudWxsOworCisJLy8gYmFzZSB0eXBlIGNhbm5vdCByZWNlaXZlIGFueSBtZXNzYWdlCisJaWYgKHRoaXMucmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvck5vTWV0aG9kRm9yKHRoaXMsIHRoaXMucmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IAorCQlyZWNlaXZlciA9PSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdAorCQkJPyBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgdGhpcykKKwkJCTogc2NvcGUuZ2V0TWV0aG9kKHRoaXMucmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgdGhpcyk7IAorCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsKKwkJCWlmICh0aGlzLnJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVjZWl2ZXJUeXBlOworCQkJfSBlbHNlIHsgLy8gcmVhbGx5IGJhZCBlcnJvciAuLi4uCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZXJyb3JOb01ldGhvZEZvcih0aGlzLCB0aGlzLnJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcyk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE1ldGhvZCh0aGlzLCBiaW5kaW5nKTsKKwkJLy8gcmVjb3JkIHRoZSBjbG9zZXN0IG1hdGNoLCBmb3IgY2xpZW50cyB3aG8gbWF5IHN0aWxsIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBtZXRob2QgbWF0Y2gKKwkJaWYgKGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90Rm91bmQpeworCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9ICgoUHJvYmxlbU1ldGhvZEJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwlpZiAoIWJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkvLyB0aGUgInJlY2VpdmVyIiBtdXN0IG5vdCBiZSBhIHR5cGUsIGkuZS4gYSBOYW1lUmVmZXJlbmNlIHRoYXQgdGhlIFRDIGhhcyBib3VuZCB0byBhIFR5cGUKKwkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgeworCQkJaWYgKCgoKE5hbWVSZWZlcmVuY2UpIHJlY2VpdmVyKS5iaXRzICYgQmluZGluZ0lkcy5UWVBFKSAhPSAwKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubXVzdFVzZUFTdGF0aWNNZXRob2QodGhpcywgYmluZGluZyk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQorCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKKwkJCWFyZ3VtZW50c1tpXS5pbXBsaWNpdFdpZGVuaW5nKGJpbmRpbmcucGFyYW1ldGVyc1tpXSwgYXJndW1lbnRUeXBlc1tpXSk7CisKKwkvLy0tLS0tLS1tZXNzYWdlIHNlbmQgdGhhdCBhcmUga25vd24gdG8gZmFpbCBhdCBjb21waWxlIHRpbWUtLS0tLS0tLS0tLQorCWlmIChiaW5kaW5nLmlzQWJzdHJhY3QoKSkgeworCQlpZiAocmVjZWl2ZXIuaXNTdXBlcigpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3REaXJlY2x5SW52b2tlQWJzdHJhY3RNZXRob2QodGhpcywgYmluZGluZyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkvLyBhYnN0cmFjdCBwcml2YXRlIG1ldGhvZHMgY2Fubm90IG9jY3VyIG5vciBhYnN0cmFjdCBzdGF0aWMuLi4uLi4uLi4uLi4KKwl9CisJaWYgKGlzTWV0aG9kVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QoYmluZGluZywgdGhpcyk7CisKKwlyZXR1cm4gYmluZGluZy5yZXR1cm5UeXBlOworfQorcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJdGhpcy5xdWFsaWZ5aW5nVHlwZSA9IHJlY2VpdmVyVHlwZTsKK30KK3B1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgeworCWlmIChkZXB0aCA+IDApIHsKKwkJYml0cyAmPSB+RGVwdGhNQVNLOyAvLyBmbHVzaCBwcmV2aW91cyBkZXB0aCBpZiBhbnkKKwkJYml0cyB8PSAoZGVwdGggJiAweEZGKSA8PCBEZXB0aFNISUZUOyAvLyBlbmNvZGVkIG9uIDggYml0cworCX0KK30KK3B1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGRlcHRoKSB7CisJLy8gaWdub3JlIGZvciBoZXJlCit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7CisJCisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCWlmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCkKKwkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSsiLiI7IC8vJE5PTi1OTFMtMSQKKwlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiIDsgLy8kTk9OLU5MUy0xJAorCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIDsgaSArKykKKwkJewlzID0gcyArIGFyZ3VtZW50c1tpXS50b1N0cmluZ0V4cHJlc3Npb24oKTsKKwkJCWlmICggaSAhPSBhcmd1bWVudHMubGVuZ3RoIC0xICkgcyA9IHMgKyAiICwgIiA7fTs7IC8vJE5PTi1OTFMtMSQKKwlzID1zICsgIikiIDsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBzOworfQorCitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQlyZWNlaXZlci50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlpbnQgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJYXJndW1lbnRzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQl9CisJfQorCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01ldGhvZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNDFhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCitwdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHsKKwkKKwlwdWJsaWMgVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlOworCisJLyoqCisJICogTWV0aG9kRGVjbGFyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwkJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworCX0KKworCisJcHVibGljIHZvaWQgcGFyc2VTdGF0ZW1lbnRzKFBhcnNlciBwYXJzZXIsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKworCQkvL2ZpbGwgdXAgdGhlIG1ldGhvZCBib2R5IHdpdGggc3RhdGVtZW50CisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKKwkJCXJldHVybjsKKwkJcGFyc2VyLnBhcnNlKHRoaXMsIHVuaXQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmVTdGF0ZW1lbnRzKENsYXNzU2NvcGUgdXBwZXJTY29wZSkgeworCisJCS8vID09PT09PT09PSBhYm9ydCBvbiBmYXRhbCBlcnJvciA9PT09PT09PT09PT09CisJCWlmICh0aGlzLnJldHVyblR5cGUgIT0gbnVsbCAmJiB0aGlzLmJpbmRpbmcgIT0gbnVsbCkgeworCQkJdGhpcy5yZXR1cm5UeXBlLmJpbmRpbmcgPSB0aGlzLmJpbmRpbmcucmV0dXJuVHlwZTsKKwkJCS8vIHJlY29yZCB0aGUgcmV0dXJuIHR5cGUgYmluZGluZworCQl9CisJCS8vIGxvb2sgaWYgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyBjb3JyZWN0CisJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgaXNUeXBlVXNlRGVwcmVjYXRlZChiaW5kaW5nLnJldHVyblR5cGUsIHNjb3BlKSkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKGJpbmRpbmcucmV0dXJuVHlwZSwgcmV0dXJuVHlwZSk7CisKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5zb3VyY2VOYW1lLCBzZWxlY3RvcikpCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKHRoaXMpOworCisJCS8vIGJ5IGdyYW1tYXRpY2FsIGNvbnN0cnVjdGlvbiwgaW50ZXJmYWNlIG1ldGhvZHMgYXJlIGFsd2F5cyBhYnN0cmFjdAorCQlpZiAoIXNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5pc0ludGVyZmFjZSgpKXsKKworCQkJLy8gaWYgYSBtZXRob2QgaGFzIGFuIHNlbWljb2xvbiBib2R5IGFuZCBpcyBub3QgZGVjbGFyZWQgYXMgYWJzdHJhY3Q9PT5lcnJvcgorCQkJLy8gbmF0aXZlIG1ldGhvZHMgbWF5IGhhdmUgYSBzZW1pY29sb24gYm9keSAKKwkJCWlmICgobW9kaWZpZXJzICYgQWNjU2VtaWNvbG9uQm9keSkgIT0gMCkgeworCQkJCWlmICgobW9kaWZpZXJzICYgQWNjTmF0aXZlKSA9PSAwKQorCQkJCQlpZiAoKG1vZGlmaWVycyAmIEFjY0Fic3RyYWN0KSA9PSAwKQorCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWV0aG9kTmVlZGluZ0Fic3RyYWN0TW9kaWZpZXIodGhpcyk7CisJCQl9IGVsc2UgeworCQkJCS8vIHRoZSBtZXRob2QgSEFTIGEgYm9keSAtLT4gYWJzdHJhY3QgbmF0aXZlIG1vZGlmaWVycyBhcmUgZm9yYmlkZW4KKwkJCQlpZiAoKChtb2RpZmllcnMgJiBBY2NOYXRpdmUpICE9IDApIHx8ICgobW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApKQorCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tZXRob2ROZWVkaW5nTm9Cb2R5KHRoaXMpOworCQkJfQorCQl9CisJCXN1cGVyLnJlc29sdmVTdGF0ZW1lbnRzKHVwcGVyU2NvcGUpOyAKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHJldHVyblR5cGVUb1N0cmluZyhpbnQgdGFiKSB7CisKKwkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gcmV0dXJuVHlwZS50b1N0cmluZyh0YWIpICsgIiAiOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUNsYXNzU2NvcGUgY2xhc3NTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpKSB7CisJCQlpZiAocmV0dXJuVHlwZSAhPSBudWxsKQorCQkJCXJldHVyblR5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJaW50IGFyZ3VtZW50TGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50TGVuZ3RoOyBpKyspCisJCQkJCWFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQkJaW50IHRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbnNMZW5ndGg7IGkrKykKKwkJCQkJdGhyb3duRXhjZXB0aW9uc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHNMZW5ndGg7IGkrKykKKwkJCQkJc3RhdGVtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBjbGFzc1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmNjMjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OYW1lUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2UgaW1wbGVtZW50cyBJbnZvY2F0aW9uU2l0ZSwgQmluZGluZ0lkcyB7CisKKwlwdWJsaWMgQmluZGluZyBiaW5kaW5nLCBjb2RlZ2VuQmluZGluZzsgLy9tYXkgYmUgYVR5cGVCaW5kaW5nLWFGaWVsZEJpbmRpbmctYUxvY2FsVmFyaWFibGVCaW5kaW5nCisJCisJcHVibGljIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgYWN0dWFsUmVjZWl2ZXJUeXBlOworCisJLy90aGUgZXJyb3IgcHJpbnRpbmcKKwkvL3NvbWUgbmFtZSByZWZlcmVuY2UgYXJlIGJ1aWxkIGFzIG5hbWUgcmVmZXJlbmNlIGJ1dAorCS8vb25seSB1c2VkIGFzIHR5cGUgcmVmZXJlbmNlLiBXaGVuIGl0IGhhcHBlbnMsIGluc3RlYWQgb2YKKwkvL2NyZWF0aW5nIGEgbmV3IG9iamV0IChhVHlwZVJlZmVyZW5jZSkgd2UganVzdCBmbGFnIGEgYm9vbGVhbgorCS8vVGhpcyBjb25jZXNpb24gaXMgdmFsdWFibGUgd2hpbGUgdGhlaXIgYXJlIGNhc2VzIHdoZW4gdGhlIE5hbWVSZWZlcmVuY2UKKwkvL3dpbGwgYmUgYSBUeXBlUmVmZXJlbmNlIChzdGF0aWMgbWVzc2FnZSBzZW5kcy4uLi4uKSBhbmQgdGhlcmUgaXMKKwkvL25vIGNoYW5nZUNsYXNzIGluIGphdmEuCitwdWJsaWMgTmFtZVJlZmVyZW5jZSgpIHsKKwlzdXBlcigpOworCWJpdHMgfD0gVFlQRSB8IFZBUklBQkxFOyAvLyByZXN0cmljdGl2ZUZsYWcKKwkKK30KK3B1YmxpYyBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKCkgeworCS8vdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNlbnQgT05MWSBhZnRlciBhIGNoZWNrIGFnYWluc3QgaXNGaWVsZFJlZmVyZW5jZSgpCisJLy9jaGVjayBpdHMgdXNlIGRvaW5nIHNlbmRlcnMuLi4uLi4uLi4KKworCXJldHVybiAoRmllbGRCaW5kaW5nKSBiaW5kaW5nIDsKK30KK3B1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgeworCS8vIG51bGwgaXMgYWNjZXB0YWJsZSB3aGVuIHdlIGFyZSByZXNvbHZpbmcgdGhlIGZpcnN0IHBhcnQgb2YgYSByZWZlcmVuY2UKKwlyZXR1cm4gYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nOworfQorcHVibGljIGJvb2xlYW4gaXNUeXBlUmVmZXJlbmNlKCkgeworCXJldHVybiBiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZzsKK30KK3B1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXJUeXBlOworfQorcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKSB7CisJaWYgKGRlcHRoID4gMCkgeworCQliaXRzICY9IH5EZXB0aE1BU0s7IC8vIGZsdXNoIHByZXZpb3VzIGRlcHRoIGlmIGFueQkJCQorCQliaXRzIHw9IChkZXB0aCAmIDB4RkYpIDw8IERlcHRoU0hJRlQ7IC8vIGVuY29kZWQgb24gOCBiaXRzCisJfQorfQorcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgaW5kZXgpeworCS8vIGlnbm9yZWQKK30KKworcHVibGljIGFic3RyYWN0IFN0cmluZyB1bmJvdW5kUmVmZXJlbmNlRXJyb3JOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YzljYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVsbExpdGVyYWwuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBOdWxsTGl0ZXJhbCBleHRlbmRzIE1hZ2ljTGl0ZXJhbCB7CisJc3RhdGljIGZpbmFsIGNoYXJbXSBzb3VyY2UgPSB7J24nICwgJ3UnICwgJ2wnICwgJ2wnfTsKK3B1YmxpYyBOdWxsTGl0ZXJhbChpbnQgcyAsIGludCBlKSB7CisJc3VwZXIocyxlKTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKworCWNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKG51bGwpO30KKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgbnVsbCBsaXRlcmFsCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLyAKK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKQorCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJcmV0dXJuIE51bGxCaW5kaW5nOworfQorLyoqCisgKiAKKyAqLworcHVibGljIGNoYXJbXSBzb3VyY2UoKSB7CisJcmV0dXJuIHNvdXJjZTsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OdW1iZXJMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMDljYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdW1iZXJMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB7CisJY2hhcltdIHNvdXJjZTsKK3B1YmxpYyBOdW1iZXJMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJdGhpcyhzLGUpIDsKKwlzb3VyY2UgPSB0b2tlbiA7Cit9CitwdWJsaWMgTnVtYmVyTGl0ZXJhbChpbnQgcywgaW50IGUpIHsKKwlzdXBlciAocyxlKSA7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpeworCS8vc2hvdWxkIG5ldmVyIGJlIHJlYWNoLCBidXQgd2l0aCBhIGJ1ZyBpbiB0aGUgYXN0IHRyZWUuLi4uCisJLy9zZWUgY29tbWVudCBvbiB0aGUgU3RhdGVtZW50IGNsYXNzCisJCisJcmV0dXJuIGZhbHNlIDt9CitwdWJsaWMgY2hhcltdIHNvdXJjZSgpeworCXJldHVybiBzb3VyY2U7fQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKKworCXJldHVybiBuZXcgU3RyaW5nKHNvdXJjZSk7fQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09SX09SX0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZkNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCisvL2RlZGljYXRlZCB0cmVhdG1lbnQgZm9yIHRoZSB8fAorcHVibGljIGNsYXNzIE9SX09SX0V4cHJlc3Npb24gZXh0ZW5kcyBCaW5hcnlFeHByZXNzaW9uIHsKKworCWludCByaWdodEluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7CisKKwlwdWJsaWMgT1JfT1JfRXhwcmVzc2lvbihFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsIGludCBvcGVyYXRvcikgeworCQlzdXBlcihsZWZ0LCByaWdodCwgb3BlcmF0b3IpOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCUNvbnN0YW50IG9wQ29uc3RhbnQgPSBsZWZ0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJaWYgKG9wQ29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQlpZiAob3BDb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgeworCQkJCS8vIEZBTFNFIHx8IGFueXRoaW5nCisJCQkJIC8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzY2VuYXJpbzoKKwkJCQkvLwkJKHggfHwgeSkgfHwgIXosIGlmIHBhc3NpbmcgdGhlIGxlZnQgaW5mbyB0byB0aGUgcmlnaHQsIGl0IHdvdWxkIGJlIHN3YXBwZWQgYnkgdGhlICEKKwkJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQkJbWVyZ2VkSW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOworCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCQl9CisJCX0KKwkJRmxvd0luZm8gbGVmdEluZm8sIHJpZ2h0SW5mbzsKKwkJbGVmdEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkKKwkJIC8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzY2VuYXJpbzoKKwkJLy8JCSh4IHx8IHkpIHx8ICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZCBiZSBzd2FwcGVkIGJ5IHRoZSAhCisJCXJpZ2h0SW5mbyA9IGxlZnRJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkuY29weSgpOworCQlpZiAob3BDb25zdGFudCAhPSBOb3RBQ29uc3RhbnQgJiYgb3BDb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSByaWdodEluZm8ubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKworCQlyaWdodEluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHJpZ2h0SW5mbyk7CisJCXJpZ2h0SW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHJpZ2h0SW5mbyk7CisJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBGbG93SW5mby5jb25kaXRpb25hbCgKKwkJCQkJLy8gbWVyZ2luZyB0d28gdHJ1ZSBpbml0SW5mb3MgZm9yIHN1Y2ggYSBuZWdhdGl2ZSBjYXNlOiBpZiAoKHQgJiYgKGIgPSB0KSkgfHwgZikgciA9IGI7IC8vIGIgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKwkJCQkJbGVmdEluZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKAorCQkJCQkJcmlnaHRJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkpLAorCQkJCQlyaWdodEluZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkpOworCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJcmV0dXJuIG1lcmdlZEluZm87CisJfQorCisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciBhIGJpbmFyeSBvcGVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlMYWJlbCBmYWxzZUxhYmVsLCBlbmRMYWJlbDsKKwkJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCXJldHVybjsKKwkJfQorCQliaXRzIHw9IE9ubHlWYWx1ZVJlcXVpcmVkTUFTSzsKKwkJZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJY3VycmVudFNjb3BlLAorCQkJY29kZVN0cmVhbSwKKwkJCW51bGwsCisJCQkoZmFsc2VMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKSksCisJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJLyogIGltcHJvdmluZyBjb2RlIGdlbiBmb3Igc3VjaCBhIGNhc2U6CQlib29sZWFuIGIgPSBpIDwgMCB8fCB0cnVlOyAKKwkJICogc2luY2UgdGhlIGxhYmVsIGhhcyBuZXZlciBiZWVuIHVzZWQsIHdlIGhhdmUgdGhlIGlubGluZWQgdmFsdWUgb24gdGhlIHN0YWNrLiAqLworCQlpZiAoZmFsc2VMYWJlbC5oYXNGb3J3YXJkUmVmZXJlbmNlcygpKSB7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQlpZiAoKGJpdHMgJiBWYWx1ZUZvclJldHVybk1BU0spICE9IDApIHsKKwkJCQkJY29kZVN0cmVhbS5pcmV0dXJuKCk7CisJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpOworCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUoMSk7CisJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJY29kZVN0cmVhbS5pY29uc3RfMCgpOworCQkJCQllbmRMYWJlbC5wbGFjZSgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZmFsc2VMYWJlbC5wbGFjZSgpOworCQkJfQorCQl9CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwkvKioKKwkgKiBCb29sZWFuIG9wZXJhdG9yIGNvZGUgZ2VuZXJhdGlvbgorCSAqCU9wdGltaXplZCBvcGVyYXRpb25zIGFyZTogfHwKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUxhYmVsIHRydWVMYWJlbCwKKwkJTGFiZWwgZmFsc2VMYWJlbCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlDb25zdGFudCBjb25kQ29uc3Q7CisJCWlmICgoY29uZENvbnN0ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CisJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+IHx8IHgKKwkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCWZhbHNlKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZ290b18odHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiB8fCB4CisJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQlmYWxzZSk7CisJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCByaWdodEluaXRTdGF0ZUluZGV4KTsKKwkJCQl9CisJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCWNvZGVTdHJlYW0sCisJCQkJCQl0cnVlTGFiZWwsCisJCQkJCQlmYWxzZUxhYmVsLAorCQkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQkJfQorCQkJfQorCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKGNvbmRDb25zdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQlpZiAoY29uZENvbnN0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkvLyB4IHx8IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPgorCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCXRydWVMYWJlbCwKKwkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJZmFsc2UpOworCQkJCWlmIChyaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJfQorCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQl0cnVlTGFiZWwsCisJCQkJCWZhbHNlTGFiZWwsCisJCQkJCWZhbHNlKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKKwkJCQkJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCWNvZGVTdHJlYW0uZ290b18odHJ1ZUxhYmVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8geCB8fCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CisJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CisJCQkJCWxlZnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJdHJ1ZUxhYmVsLAorCQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCX0KKwkJCQlpZiAocmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOworCQkJCX0KKwkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJdHJ1ZUxhYmVsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQlmYWxzZSk7CisJCQl9CisJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCS8vIGRlZmF1bHQgY2FzZQorCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIEZBTFNFIGNhc2UKKwkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgbnVsbCwgdHJ1ZSk7CisJCQkJcmlnaHQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvZGVTdHJlYW0sCisJCQkJCXRydWVMYWJlbCwKKwkJCQkJbnVsbCwKKwkJCQkJdmFsdWVSZXF1aXJlZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBpbXBsaWNpdCBmYWxsaW5nIHRocm91Z2ggdGhlIFRSVUUgY2FzZQorCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7CisJCQkJTGFiZWwgaW50ZXJuYWxUcnVlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJY29kZVN0cmVhbSwKKwkJCQkJaW50ZXJuYWxUcnVlTGFiZWwsCisJCQkJCW51bGwsCisJCQkJCXRydWUpOworCQkJCWlmIChyaWdodEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgcmlnaHRJbml0U3RhdGVJbmRleCk7CisJCQkJfQorCQkJCXJpZ2h0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQludWxsLAorCQkJCQlmYWxzZUxhYmVsLAorCQkJCQl2YWx1ZVJlcXVpcmVkKTsKKwkJCQlpbnRlcm5hbFRydWVMYWJlbC5wbGFjZSgpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKKwkJCQljdXJyZW50U2NvcGUsCisJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDb21wYWN0YWJsZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlsZWZ0LnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCXJpZ2h0LnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvckV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3OTEyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBPcGVyYXRvcklkcyB7CisKKwlwdWJsaWMgc3RhdGljIGludFtdW10gUmVzb2x2ZVR5cGVUYWJsZXMgPSBuZXcgaW50W051bWJlck9mVGFibGVzXVtdOworCXB1YmxpYyBUeXBlQmluZGluZyB0eXBlQmluZGluZzsJCisJc3RhdGljIHtjbGFzc0luaXRpYWxpemUoKTt9CisKKwkvKioKKwkgKiBPcGVyYXRvckV4cHJlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgT3BlcmF0b3JFeHByZXNzaW9uKCkgeworCQlzdXBlcigpOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xhc3NJbml0aWFsaXplKCkgeworCQlSZXNvbHZlVHlwZVRhYmxlc1tBTkRdID0gZ2V0X0FORCgpOworCQlSZXNvbHZlVHlwZVRhYmxlc1tBTkRfQU5EXSA9IGdldF9BTkRfQU5EKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW0RJVklERV0gPSBnZXRfRElWSURFKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW0VRVUFMX0VRVUFMXSA9IGdldF9FUVVBTF9FUVVBTCgpOworCQlSZXNvbHZlVHlwZVRhYmxlc1tHUkVBVEVSXSA9IGdldF9HUkVBVEVSKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW0dSRUFURVJfRVFVQUxdID0gZ2V0X0dSRUFURVJfRVFVQUwoKTsKKwkJUmVzb2x2ZVR5cGVUYWJsZXNbTEVGVF9TSElGVF0gPSBnZXRfTEVGVF9TSElGVCgpOworCQlSZXNvbHZlVHlwZVRhYmxlc1tMRVNTXSA9IGdldF9MRVNTKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW0xFU1NfRVFVQUxdID0gZ2V0X0xFU1NfRVFVQUwoKTsKKwkJUmVzb2x2ZVR5cGVUYWJsZXNbTUlOVVNdID0gZ2V0X01JTlVTKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW01VTFRJUExZXSA9IGdldF9NVUxUSVBMWSgpOworCQlSZXNvbHZlVHlwZVRhYmxlc1tPUl0gPSBnZXRfT1IoKTsKKwkJUmVzb2x2ZVR5cGVUYWJsZXNbT1JfT1JdID0gZ2V0X09SX09SKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW1BMVVNdID0gZ2V0X1BMVVMoKTsKKwkJUmVzb2x2ZVR5cGVUYWJsZXNbUkVNQUlOREVSXSA9IGdldF9SRU1BSU5ERVIoKTsKKwkJUmVzb2x2ZVR5cGVUYWJsZXNbUklHSFRfU0hJRlRdID0gZ2V0X1JJR0hUX1NISUZUKCk7CisJCVJlc29sdmVUeXBlVGFibGVzW1VOU0lHTkVEX1JJR0hUX1NISUZUXSA9IGdldF9VTlNJR05FRF9SSUdIVF9TSElGVCgpOworCQlSZXNvbHZlVHlwZVRhYmxlc1tYT1JdID0gZ2V0X1hPUigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRlVGFibGVUZXN0Q2FzZSgpeworCQkvL3JldHVybiBhIFN0cmluZyB3aGljaCBpcyBhIGphdmEgbWV0aG9kIGFsbG93aW5nIHRvIHRlc3QKKwkJLy90aGUgbm9uIHplcm8gZW50cmllcyBvZiBhbGwgdGFibGVzCisJCisJCS8qCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuCisJCU9wZXJhdG9yRXhwcmVzc2lvbi5nZW5lcmF0ZVRhYmxlVGVzdENhc2UoKTsKKwkJKi8KKwkKKwkJaW50W10gb3BlcmF0b3JzID0gbmV3IGludFtde0FORCxBTkRfQU5ELERJVklERSxHUkVBVEVSLEdSRUFURVJfRVFVQUwsCisJCQkJTEVGVF9TSElGVCxMRVNTLExFU1NfRVFVQUwsTUlOVVMsTVVMVElQTFksT1IsT1JfT1IsUExVUyxSRU1BSU5ERVIsCisJCQkJUklHSFRfU0hJRlQsVU5TSUdORURfUklHSFRfU0hJRlQsWE9SfTsKKwkKKwkJY2xhc3MgRGVjb2RlIHsKKwkJCXB1YmxpYyAgZmluYWwgU3RyaW5nIGNvbnN0YW50KGludCBjb2RlKXsKKwkJCQlzd2l0Y2goY29kZSl7IAorCQkJCQljYXNlIFRfYm9vbGVhbiAJOiByZXR1cm4gInRydWUiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfYnl0ZQkJOiByZXR1cm4gIigoYnl0ZSkgMykiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfY2hhcgkJOiByZXR1cm4gIidBJyIgOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgVF9kb3VibGUJOiByZXR1cm4gIjMwMC4wZCIgOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgVF9mbG9hdAk6IHJldHVybiAiMTAwLjBmIiA7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX2ludAkJOiByZXR1cm4gIjEiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfbG9uZwkJOiByZXR1cm4gIjdMIiA7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX1N0cmluZwk6IHJldHVybiAiXCJoZWxsby13b3JsZFwiIiA7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX251bGwJCTogcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfc2hvcnQJOiByZXR1cm4gIigoc2hvcnQpIDUpIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfT2JqZWN0CTogcmV0dXJuICJudWxsIjt9IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gIiI7fSAvLyROT04tTkxTLTEkCisJCisJCQlwdWJsaWMgIGZpbmFsIFN0cmluZyB0eXBlKGludCBjb2RlKXsKKwkJCQlzd2l0Y2goY29kZSl7IAorCQkJCQljYXNlIFRfYm9vbGVhbiAJOiByZXR1cm4gInoiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfYnl0ZQkJOiByZXR1cm4gImIiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfY2hhcgkJOiByZXR1cm4gImMiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfZG91YmxlCTogcmV0dXJuICJkIiA7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX2Zsb2F0CTogcmV0dXJuICJmIiA7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX2ludAkJOiByZXR1cm4gImkiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfbG9uZwkJOiByZXR1cm4gImwiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfU3RyaW5nCTogcmV0dXJuICJzdHIiIDsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIFRfbnVsbAkJOiByZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgVF9zaG9ydAk6IHJldHVybiAicyI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBUX09iamVjdAk6IHJldHVybiAib2JqIjt9IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gInh4eCI7fSAvLyROT04tTkxTLTEkCisJCQkKKwkJCXB1YmxpYyAgZmluYWwgU3RyaW5nIG9wZXJhdG9yKGludCBvcGVyYXRvcil7CisJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCQkJY2FzZSBFUVVBTF9FUVVBTCA6CXJldHVybiAiPT0iOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgTEVTU19FUVVBTCA6CXJldHVybiAiPD0iOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgR1JFQVRFUl9FUVVBTCA6cmV0dXJuICI+PSI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBMRUZUX1NISUZUIDoJcmV0dXJuICI8PCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBSSUdIVF9TSElGVCA6CXJldHVybiAiPj4iOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgVU5TSUdORURfUklHSFRfU0hJRlQgOglyZXR1cm4gIj4+PiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBPUl9PUiA6cmV0dXJuICJ8fCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBBTkRfQU5EIDoJCXJldHVybiAiJiYiOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgUExVUyA6CQkJcmV0dXJuICIrIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIE1JTlVTIDoJCXJldHVybiAiLSI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBOT1QgOgkJCXJldHVybiAiISI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBSRU1BSU5ERVIgOglyZXR1cm4gIiUiOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgWE9SIDoJCQlyZXR1cm4gIl4iOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgQU5EIDoJCQlyZXR1cm4gIiYiOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgTVVMVElQTFkgOgkJcmV0dXJuICIqIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlIE9SIDoJCQlyZXR1cm4gInwiOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgVFdJRERMRSA6CQlyZXR1cm4gIn4iOyAvLyROT04tTkxTLTEkCisJCQkJCWNhc2UgRElWSURFIDoJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBHUkVBVEVSIDoJCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY2FzZSBMRVNTIDoJCQlyZXR1cm4gIjwiOwl9OyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuICI/Pz8/Ijt9IC8vJE5PTi1OTFMtMSQKKwkJfQorCQorCQkJCisJCURlY29kZSBkZWNvZGUgPSBuZXcgRGVjb2RlKCk7CisJCVN0cmluZyBzIDsKKwkKKwkJcyA9ICJcdHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5hcnlPcGVyYXRpb25UYWJsZXNUZXN0Q2FzZSgpe1xuIiArIC8vJE5PTi1OTFMtMSQKKwkKKwkJCSJcdFx0Ly9UQyB0ZXN0IDogYWxsIGJpbmFyeSBvcGVyYXRpb24gKGRlc2NyaWJlZCBpbiB0YWJsZXMpXG4iKyAvLyROT04tTkxTLTEkCisJCQkiXHRcdC8vbWV0aG9kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5XG4iKyAvLyROT04tTkxTLTEkCisJCQkiXHRcdC8vb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvckV4cHJlc3Npb24uZ2VuZXJhdGVUYWJsZVRlc3RDYXNlKCk7XG4iKyAvLyROT04tTkxTLTEkCisJCQorCQkJIlx0XHRTdHJpbmcgc3RyMCA7XHQgU3RyaW5nIHN0clx0PSAiK2RlY29kZS5jb25zdGFudChUX1N0cmluZykrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJIlx0XHRpbnQgaTAgO1x0IGludCBpXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfaW50KSsiIDtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJIlx0XHRib29sZWFuIHowO1x0IGJvb2xlYW4gelx0PSAiK2RlY29kZS5jb25zdGFudChUX2Jvb2xlYW4pKyI7XG4iKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSJcdFx0Y2hhciBjMDsgXHQgY2hhciAgY1x0PSAiK2RlY29kZS5jb25zdGFudChUX2NoYXIpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkiXHRcdGZsb2F0IGYwOyBcdCBmbG9hdCBmXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfZmxvYXQpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkiXHRcdGRvdWJsZSBkMDtcdCBkb3VibGUgZFx0PSAiK2RlY29kZS5jb25zdGFudChUX2RvdWJsZSkrIiA7XG4iKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSJcdFx0Ynl0ZSBiMDsgXHQgYnl0ZSBiXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfYnl0ZSkrIjtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJIlx0XHRzaG9ydCBzMDsgXHQgc2hvcnQgc1x0PSAiK2RlY29kZS5jb25zdGFudChUX3Nob3J0KSsiO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkiXHRcdGxvbmcgbDA7IFx0IGxvbmcgbFx0PSAiK2RlY29kZS5jb25zdGFudChUX2xvbmcpKyIgO1xuIisgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkiXHRcdE9iamVjdCBvYmowOyBcdCBPYmplY3Qgb2JqXHQ9ICIrZGVjb2RlLmNvbnN0YW50KFRfT2JqZWN0KSsiIDtcbiIrIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJIlxuIjsgLy8kTk9OLU5MUy0xJAorCQorCQlpbnQgZXJyb3IgPSAwOwkJCisJCWZvciAoaW50IGk9MDsgaSA8IG9wZXJhdG9ycy5sZW5ndGggOyBpKyspCisJCXsJaW50IG9wZXJhdG9yID0gb3BlcmF0b3JzW2ldOworCQkJZm9yIChpbnQgbGVmdD0wOyBsZWZ0PDE2O2xlZnQrKykKKwkJCWZvciAoaW50IHJpZ2h0PTA7IHJpZ2h0PDE2O3JpZ2h0KyspCisJCQl7CWludCByZXN1bHQgPSAoUmVzb2x2ZVR5cGVUYWJsZXNbb3BlcmF0b3JdWyhsZWZ0PDw0KStyaWdodF0pICYgMHgwMDAwRjsKKwkJCQlpZiAocmVzdWx0ICE9IFRfdW5kZWZpbmVkKQorCQorCQkJCQkvLzEvIEZpcnN0IHJlZ3VsYXIgY29tcHV0YXRpb24gdGhlbiAyLyBjb21wYXJhaXNvbgorCQkJCQkvL3dpdGggYSBjb21waWxlIHRpbWUgY29uc3RhbnQgKGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIpCisJCQkJCS8vCXowID0gcyA+PSBzOworCQkJCQkvLwlpZiAoIHowICE9ICgoKHNob3J0KSA1KSA+PSAoKHNob3J0KSA1KSkpCisJCQkJCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oMTU1KTsKKwkKKwkJCQl7CXMgKz0gIlx0XHQiK2RlY29kZS50eXBlKHJlc3VsdCkrIjAiKyIgPSAiK2RlY29kZS50eXBlKGxlZnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJAorCQkJCQlzICs9ICIgIitkZWNvZGUub3BlcmF0b3Iob3BlcmF0b3IpKyIgIitkZWNvZGUudHlwZShyaWdodCkrIjtcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQkJCVN0cmluZyBiZWdpbiA9IHJlc3VsdCA9PSBUX1N0cmluZyA/ICJcdFx0aWYgKCEgIiA6ICJcdFx0aWYgKCAiOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQkJU3RyaW5nIHRlc3QgPSByZXN1bHQgPT0gVF9TdHJpbmcgPyAiLmVxdWFscygiIDogIiAhPSAoIiA7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJCQlzICs9IGJlZ2luCStkZWNvZGUudHlwZShyZXN1bHQpKyIwIit0ZXN0IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJK2RlY29kZS5jb25zdGFudChsZWZ0KSsiICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrZGVjb2RlLm9wZXJhdG9yKG9wZXJhdG9yKSsiICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrZGVjb2RlLmNvbnN0YW50KHJpZ2h0KSsiKSlcbiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcyArPSAiXHRcdFx0U3lzdGVtLm91dC5wcmludGxuKCIrICgrK2Vycm9yKSArIik7XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCXJldHVybiBzICs9ICJcblx0XHRTeXN0ZW0ub3V0LnByaW50bG4oXCJiaW5hcnkgdGFibGVzIHRlc3QgOiBkb25lXCIpO30iIDsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0FORCgpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJCisJCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdIDsKKwkJCisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2J5dGVdIAkJPSAoQnl0ZTJJbnQ8PDEyKSArKEJ5dGUySW50PDw0KSArVF9pbnQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2xvbmddCQk9IChCeXRlMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX3Nob3J0XSAJCT0gKEJ5dGUySW50PDwxMikgKyhTaG9ydDJJbnQ8PDQpK1RfaW50OworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfZG91YmxlXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSAoQnl0ZTJJbnQ8PDEyKSArKENoYXIySW50PDw0KSArVF9pbnQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2ludF0gCQk9IChCeXRlMkludDw8MTIpICsoSW50MkludDw8NCkgICtUX2ludCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfYnl0ZV0gCQk9IChMb25nMkxvbmc8PDEyKSsoQnl0ZTJMb25nPDw0KStUX2xvbmc7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfbG9uZ10gCQk9IChMb25nMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX3Nob3J0XSAJCT0gKExvbmcyTG9uZzw8MTIpKyhTaG9ydDJMb25nPDw0KStUX2xvbmc7IDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX1N0cmluZ10gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX09iamVjdF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX2RvdWJsZV0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX2Jvb2xlYW5dIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9jaGFyXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhDaGFyMkxvbmc8PDQpK1RfbG9uZyA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfaW50XSAJCT0gKExvbmcyTG9uZzw8MTIpKyhJbnQyTG9uZzw8NCkrVF9sb25nIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJCT0gKFNob3J0MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9sb25nXSAJCQk9IChTaG9ydDJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1Rfc2hvcnRdIAkJPSAoU2hvcnQySW50PDwxMikrKFNob3J0MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2NoYXJdIAkJCT0gKFNob3J0MkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9pbnRdIAkJCT0gKFNob3J0MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9TdHJpbmddIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9kb3VibGVdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9zaG9ydF0JCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbl0JCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX3Nob3J0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9TdHJpbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX09iamVjdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfZG91YmxlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYm9vbGVhbl0gCQk9IChCb29sZWFuMkJvb2xlYW4gPDwgMTIpKyhCb29sZWFuMkJvb2xlYW4gPDwgNCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2J5dGVdIAkJCT0gKENoYXIySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2NoYXI8PDQpK1RfbG9uZ10gCQkJPSAoQ2hhcjJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IChDaGFyMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9jaGFyXSAJCQk9IChDaGFyMkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2J5dGVdIAkJPSAoSW50MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfbG9uZ10gCQk9IChJbnQyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZyA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9zaG9ydF0gCQk9IChJbnQySW50PDwxMikrKFNob3J0MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfY2hhcl0gCQk9IChJbnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9pbnRdIAkJPSAoSW50MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1Rfc2hvcnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCisJCXJldHVybiB0YWJsZSA7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfQU5EX0FORCgpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJCisJCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdIDsKKwkJCisJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3Nob3J0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYnl0ZTw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYnl0ZTw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYnl0ZTw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYnl0ZTw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ieXRlPDw0KStUX2Jvb2xlYW5dIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYnl0ZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZDsKKwkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbG9uZzw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbG9uZzw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2xvbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3Nob3J0PDw0KStUX2RvdWJsZV0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfc2hvcnQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9ib29sZWFuXQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3Nob3J0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9zaG9ydDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8gICAgIHRhYmxlWyhUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdm9pZDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdm9pZDw8NCkrVF9TdHJpbmddIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3ZvaWQ8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX2RvdWJsZV0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdm9pZDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX3ZvaWQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdm9pZDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfdm9pZDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF92b2lkPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9TdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF9zaG9ydF0JCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbl0JCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfT2JqZWN0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX09iamVjdDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9kb3VibGU8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9kb3VibGU8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9kb3VibGU8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkOworCQkvLyAgICAgdGFibGVbKFRfZG91YmxlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9mbG9hdDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfZmxvYXQ8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8gICAgIHRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX3Nob3J0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Jvb2xlYW48PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX1N0cmluZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX09iamVjdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2RvdWJsZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW5dIAkJPSAoQm9vbGVhbjJCb29sZWFuPDwxMikrKEJvb2xlYW4yQm9vbGVhbjw8NCkrVF9ib29sZWFuIDsKKwkJLy8gICAgIHRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9ib29sZWFuPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQ7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfY2hhcjw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2NoYXI8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9jaGFyPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2ludDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX2ludDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9pbnQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9udWxsPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1Rfc2hvcnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vICAgICB0YWJsZVsoVF9udWxsPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1RfZmxvYXRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLyAgICAgdGFibGVbKFRfbnVsbDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8gICAgIHRhYmxlWyhUX251bGw8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXJldHVybiB0YWJsZSA7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfRElWSURFKCl7CisJCisJCS8vdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAorCQkKKwkJCisJLy8JaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl0gOworCQkKKwkJcmV0dXJuIGdldF9NSU5VUygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0VRVUFMX0VRVUFMKCl7CisJCisJCS8vdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAorCQkKKwkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl0gOworCQkKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfYnl0ZV0gCQk9IChCeXRlMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9sb25nXSAJCT0gKEJ5dGUyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1Rfc2hvcnRdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfZG91YmxlXSAJPSAoQnl0ZTJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9mbG9hdF0gCQk9IChCeXRlMkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Jvb2xlYW47CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gKEJ5dGUySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbjsKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQorCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2J5dGVdIAkJPSAoTG9uZzJMb25nPDwxMikrKEJ5dGUyTG9uZzw8NCkrVF9ib29sZWFuOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2xvbmddIAkJPSAoTG9uZzJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9zaG9ydF0gCQk9IChMb25nMkxvbmc8PDEyKSsoU2hvcnQyTG9uZzw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX1N0cmluZ10gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX09iamVjdF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2RvdWJsZV0gCT0gKExvbmcyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfZmxvYXRdIAkJPSAoTG9uZzJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IChMb25nMkxvbmc8PDEyKSsoQ2hhcjJMb25nPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IChMb25nMkxvbmc8PDEyKSsoSW50Mkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJCT0gKFNob3J0MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfbG9uZ10gCQkJPSAoU2hvcnQyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX3Nob3J0XSAJCT0gKFNob3J0MkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfZG91YmxlXSAJCT0gKFNob3J0MkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9mbG9hdF0gCQk9IChTaG9ydDJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfY2hhcl0gCQkJPSAoU2hvcnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9pbnRdIAkJCT0gKFNob3J0MkludDw8MTIpKyhJbnQySW50PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfZG91YmxlXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfU3RyaW5nXSAJCT0gLypTdHJpbmcyT2JqZWN0ICAgICAgICAgICAgICAgICBTdHJpbmcyT2JqZWN0Ki8KKwkJCQkJCQkJCQkJICAoVF9PYmplY3Q8PDE2KSsoVF9TdHJpbmc8PDEyKSsoVF9PYmplY3Q8PDgpKyhUX1N0cmluZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX09iamVjdF0gCQk9IC8qU3RyaW5nMk9iamVjdCAgICAgICAgICAgICAgICAgT2JqZWN0Mk9iamVjdCovCisJCQkJCQkJCQkJCSAgKFRfT2JqZWN0PDwxNikrKFRfU3RyaW5nPDwxMikrKFRfT2JqZWN0PDw4KSsoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsgCisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9udWxsXSAJCT0gLypPYmplY3QyU3RyaW5nICAgICAgICAgICAgICAgIG51bGwyT2JqZWN0ICovCisJCQkJCQkJCQkJCSAgKFRfT2JqZWN0PDwxNikrKFRfU3RyaW5nPDwxMikrKFRfT2JqZWN0PDw4KSsoVF9udWxsPDw0KStUX2Jvb2xlYW4gOworCQorCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3Nob3J0XQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfU3RyaW5nXSAJCT0gLypPYmplY3QyT2JqZWN0ICAgICAgICAgICAgICAgICBTdHJpbmcyT2JqZWN0Ki8KKwkJCQkJCQkJCQkJICAoVF9PYmplY3Q8PDE2KSsoVF9PYmplY3Q8PDEyKSsoVF9PYmplY3Q8PDgpKyhUX1N0cmluZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfT2JqZWN0PDw0KStUX09iamVjdF0gCQk9IC8qT2JqZWN0Mk9iamVjdCAgICAgICAgICAgICAgICAgT2JqZWN0Mk9iamVjdCovCisJCQkJCQkJCQkJCSAgKFRfT2JqZWN0PDwxNikrKFRfT2JqZWN0PDwxMikrKFRfT2JqZWN0PDw4KSsoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2Jvb2xlYW5dCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbnVsbF0gCQk9IC8qT2JqZWN0Mk9iamVjdCAgICAgICAgICAgICAgICAgbnVsbDJPYmplY3QqLworCQkJCQkJCQkJCQkgIChUX09iamVjdDw8MTYpKyhUX09iamVjdDw8MTIpKyhUX09iamVjdDw8OCkrKFRfbnVsbDw8NCkrVF9ib29sZWFuIDsKKwkKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYnl0ZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEJ5dGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbG9uZ10gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKExvbmcyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1Rfc2hvcnRdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhTaG9ydDJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfZG91YmxlXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2Zsb2F0XSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoRmxvYXQyRG91YmxlPDw0KStUX2Jvb2xlYW47CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfY2hhcl0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKENoYXIyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEludDJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQorCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfYnl0ZV0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoQnl0ZTJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoTG9uZzJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1Rfc2hvcnRdIAkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoU2hvcnQyRmxvYXQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfZG91YmxlXSAJCT0gKEZsb2F0MkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9mbG9hdF0gCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfY2hhcl0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoQ2hhcjJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfaW50XSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhJbnQyRmxvYXQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1Rfc2hvcnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX1N0cmluZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfT2JqZWN0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9kb3VibGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ib29sZWFuXSAJCT0gKEJvb2xlYW4yQm9vbGVhbjw8MTIpKyhCb29sZWFuMkJvb2xlYW48PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCQorCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IChDaGFyMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9sb25nXSAJCQk9IChDaGFyMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IChDaGFyMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9kb3VibGVdIAkJPSAoQ2hhcjJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9mbG9hdF0gCQkJPSAoQ2hhcjJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2NoYXJdIAkJCT0gKENoYXIySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCQorCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9ieXRlXSAJCT0gKEludDJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9sb25nXSAJCT0gKEludDJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX3Nob3J0XSAJCT0gKEludDJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2RvdWJsZV0gCQk9IChJbnQyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9mbG9hdF0gCQk9IChJbnQyRmxvYXQ8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfYm9vbGVhbjsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX2Jvb2xlYW5dIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2NoYXJdIAkJPSAoSW50MkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2ludF0gCQk9IChJbnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1Rfc2hvcnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9udWxsPDw0KStUX1N0cmluZ10gCQk9IC8qbnVsbDJPYmplY3QgICAgICAgICAgICAgICAgIFN0cmluZzJPYmplY3QqLworCQkJCQkJCQkJCQkgIChUX09iamVjdDw8MTYpKyhUX251bGw8PDEyKSsoVF9PYmplY3Q8PDgpKyhUX1N0cmluZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfbnVsbDw8NCkrVF9PYmplY3RdIAkJPSAvKm51bGwyT2JqZWN0ICAgICAgICAgICAgICAgICBPYmplY3QyT2JqZWN0Ki8KKwkJCQkJCQkJCQkJICAoVF9PYmplY3Q8PDE2KSsoVF9udWxsPDwxMikrKFRfT2JqZWN0PDw4KSsoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbiA7IDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfZmxvYXRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbnVsbDw8NCkrVF9udWxsXSAJCQk9IC8qbnVsbDJPYmplY3QgICAgICAgICAgICAgICAgIG51bGwyT2JqZWN0Ki8KKwkJCQkJCQkJCQkJICAoVF9PYmplY3Q8PDE2KSsoVF9udWxsPDwxMikrKFRfT2JqZWN0PDw4KSsoVF9udWxsPDw0KStUX2Jvb2xlYW4gOworCQlyZXR1cm4gdGFibGUgOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0dSRUFURVIoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTEVTUygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0dSRUFURVJfRVFVQUwoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTEVTUygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0xFRlRfU0hJRlQoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCQorCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkJCisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfYnl0ZV0gCQk9IChCeXRlMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2xvbmddIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoTG9uZzJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9zaG9ydF0gCQk9IChCeXRlMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX1N0cmluZ10gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX09iamVjdF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX2RvdWJsZV0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX2Jvb2xlYW5dIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9jaGFyXSAJCT0gKEJ5dGUySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gKEJ5dGUySW50PDwxMikrKEludDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9ieXRlXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhCeXRlMkludDw8NCkrVF9sb25nOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2xvbmddIAkJPSAoTG9uZzJMb25nPDwxMikrKExvbmcySW50PDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX3Nob3J0XSAJCT0gKExvbmcyTG9uZzw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfbG9uZyA7CisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9TdHJpbmddIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9kb3VibGVdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IChMb25nMkxvbmc8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfbG9uZyA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfaW50XSAJCT0gKExvbmcyTG9uZzw8MTIpKyhJbnQySW50PDw0KStUX2xvbmcgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfYnl0ZV0gCQkJPSAoU2hvcnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0MkludDw8MTIpKyhMb25nMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9zaG9ydF0gCQk9IChTaG9ydDJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfY2hhcl0gCQkJPSAoU2hvcnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2ludF0gCQkJPSAoU2hvcnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX1N0cmluZ10gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX09iamVjdF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2RvdWJsZV0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2Jvb2xlYW5dIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2ludF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3Nob3J0XQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ib29sZWFuXQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQ7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1Rfc2hvcnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX1N0cmluZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfT2JqZWN0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9kb3VibGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2Zsb2F0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2NoYXJdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQkKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2NoYXI8PDQpK1RfYnl0ZV0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9sb25nXSAJCQk9IChDaGFyMkludDw8MTIpKyhMb25nMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IChDaGFyMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9jaGFyXSAJCQk9IChDaGFyMkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfYnl0ZV0gCQk9IChJbnQySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9sb25nXSAJCT0gKEludDJJbnQ8PDEyKSsoTG9uZzJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfaW50PDw0KStUX3Nob3J0XSAJCT0gKEludDJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9jaGFyXSAJCT0gKEludDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2ludF0gCQk9IChJbnQySW50PDwxMikrKEludDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9zaG9ydF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfZmxvYXRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJcmV0dXJuIHRhYmxlIDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9MRVNTKCl7CisJCisJCS8vdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAorCQkKKwkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl0gOworCQkKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfYnl0ZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2ludF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfYnl0ZV0gCQk9IChCeXRlMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9sb25nXSAJCT0gKEJ5dGUyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1Rfc2hvcnRdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfZG91YmxlXSAJPSAoQnl0ZTJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9mbG9hdF0gCQk9IChCeXRlMkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Jvb2xlYW47CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2NoYXJdIAkJPSAoQnl0ZTJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfaW50XSAJCT0gKEJ5dGUySW50PDwxMikrKEludDJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9ieXRlXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhCeXRlMkxvbmc8PDQpK1RfYm9vbGVhbjsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1Rfc2hvcnRdIAkJPSAoTG9uZzJMb25nPDwxMikrKFNob3J0Mkxvbmc8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9TdHJpbmddIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9kb3VibGVdIAk9IChMb25nMkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2Zsb2F0XSAJCT0gKExvbmcyRmxvYXQ8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2NoYXJdIAkJPSAoTG9uZzJMb25nPDwxMikrKENoYXIyTG9uZzw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9pbnRdIAkJPSAoTG9uZzJMb25nPDwxMikrKEludDJMb25nPDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9ieXRlXSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2xvbmddIAkJCT0gKFNob3J0Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9zaG9ydF0gCQk9IChTaG9ydDJJbnQ8PDEyKSsoU2hvcnQySW50PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2RvdWJsZV0gCQk9IChTaG9ydDJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfZmxvYXRdIAkJPSAoU2hvcnQyRmxvYXQ8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX3Nob3J0PDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2NoYXJdIAkJCT0gKFNob3J0MkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfaW50XSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfU3RyaW5nXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfT2JqZWN0XSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfZG91YmxlXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfaW50XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYnl0ZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7IAorCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfU3RyaW5nPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2J5dGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9sb25nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1Rfc2hvcnRdCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2Jvb2xlYW5dCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfYnl0ZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEJ5dGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbG9uZ10gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKExvbmcyRG91YmxlPDw0KStUX2Jvb2xlYW47CisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9zaG9ydF0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKFNob3J0MkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9kb3VibGVdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfZmxvYXRdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhGbG9hdDJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfY2hhcl0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKENoYXIyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEludDJEb3VibGU8PDQpK1RfYm9vbGVhbjsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhCeXRlMkZsb2F0PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9sb25nXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhMb25nMkZsb2F0PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9zaG9ydF0gCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhTaG9ydDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9kb3VibGVdIAkJPSAoRmxvYXQyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfYm9vbGVhbiA7CisJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2Zsb2F0XSAJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9mbG9hdDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9jaGFyXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhDaGFyMkZsb2F0PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9pbnRdIAkJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEludDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9zaG9ydF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfU3RyaW5nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9PYmplY3RdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2RvdWJsZV0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfZmxvYXRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCQorCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9ieXRlXSAJCQk9IChDaGFyMkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9sb25nXSAJCQk9IChDaGFyMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IChDaGFyMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfYm9vbGVhbiA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9jaGFyPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9kb3VibGVdIAkJPSAoQ2hhcjJEb3VibGU8PDEyKSsoRG91YmxlMkRvdWJsZTw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9mbG9hdF0gCQkJPSAoQ2hhcjJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2NoYXJdIAkJCT0gKENoYXIySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX2ludF0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2J5dGVdIAkJPSAoSW50MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9ib29sZWFuIDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2xvbmddIAkJPSAoSW50Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2Jvb2xlYW47CisJCXRhYmxlWyhUX2ludDw8NCkrVF9zaG9ydF0gCQk9IChJbnQySW50PDwxMikrKFNob3J0MkludDw8NCkrVF9ib29sZWFuIDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9kb3VibGVdIAkJPSAoSW50MkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfZmxvYXRdIAkJPSAoSW50MkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Jvb2xlYW4gOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfY2hhcl0gCQk9IChJbnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2Jvb2xlYW4gOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfaW50XSAJCT0gKEludDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9ib29sZWFuOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfdW5kZWZpbmVkXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2xvbmddIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX3Nob3J0XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQorCQlyZXR1cm4gdGFibGUgOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X0xFU1NfRVFVQUwoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTEVTUygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X01JTlVTKCl7CisJCisJCS8vdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAorCQkKKwkJaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl0gOworCQorCQl0YWJsZSA9IChpbnRbXSkgZ2V0X1BMVVMoKS5jbG9uZSgpOworCisJCS8vIGN1c3RvbWl6YXRpb24JCisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX3Nob3J0XSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX2RvdWJsZV0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX2Zsb2F0XSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX2NoYXJdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCXRhYmxlWyhUX2J5dGU8PDQpCStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkJK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkJK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF92b2lkPDw0KQkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX09iamVjdDw8NCkJK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpCStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpCStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2NoYXI8PDQpCStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfaW50PDw0KQkrVF9TdHJpbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX251bGw8PDQpCStUX1N0cmluZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCXRhYmxlWyhUX251bGw8PDQpCStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCisJCXJldHVybiB0YWJsZSA7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfTVVMVElQTFkoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTUlOVVMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9PUigpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfQU5EKCkgOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X09SX09SKCl7CisJCisJCS8vdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIAorCQkKKwkJLy8JaW50W10gdGFibGUgID0gbmV3IGludFsxNioxNl0gOworCQlyZXR1cm4gZ2V0X0FORF9BTkQoKSA7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfUExVUygpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJCisJCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdIDsKKwkJCisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX2J5dGVdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbG9uZ10gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9zaG9ydF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdW5kZWZpbmVkPDw0KStUX3ZvaWRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfU3RyaW5nXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3VuZGVmaW5lZDw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF91bmRlZmluZWQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQkKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9ieXRlXSAJCT0gKEJ5dGUySW50PDwxMikrKEJ5dGUySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfbG9uZ10gCQk9IChCeXRlMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX3Nob3J0XSAJCT0gKEJ5dGUySW50PDwxMikrKFNob3J0MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9ieXRlPDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfU3RyaW5nXSAJPSAoQnl0ZTJCeXRlPDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfU3RyaW5nIDsKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfYnl0ZTw8NCkrVF9kb3VibGVdIAk9IChCeXRlMkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2RvdWJsZSA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfZmxvYXRdIAkJPSAoQnl0ZTJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9mbG9hdDsKKwkJLy8JdGFibGVbKFRfYnl0ZTw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2J5dGU8PDQpK1RfY2hhcl0gCQk9IChCeXRlMkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9ieXRlPDw0KStUX2ludF0gCQk9IChCeXRlMkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX2J5dGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9ieXRlXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhCeXRlMkxvbmc8PDQpK1RfbG9uZzsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9sb25nXSAJCT0gKExvbmcyTG9uZzw8MTIpKyhMb25nMkxvbmc8PDQpK1RfbG9uZyA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1Rfc2hvcnRdIAkJPSAoTG9uZzJMb25nPDwxMikrKFNob3J0Mkxvbmc8PDQpK1RfbG9uZyA7CisJCS8vCXRhYmxlWyhUX2xvbmc8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9TdHJpbmddIAk9IChMb25nMkxvbmc8PDEyKSsoU3RyaW5nMlN0cmluZzw8NCkrVF9TdHJpbmcgOworCQkvLwl0YWJsZVsoVF9sb25nPDw0KStUX09iamVjdF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2RvdWJsZV0gCT0gKExvbmcyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfZG91YmxlIDsKKwkJdGFibGVbKFRfbG9uZzw8NCkrVF9mbG9hdF0gCQk9IChMb25nMkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Zsb2F0IDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2xvbmc8PDQpK1RfY2hhcl0gCQk9IChMb25nMkxvbmc8PDEyKSsoQ2hhcjJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9sb25nPDw0KStUX2ludF0gCQk9IChMb25nMkxvbmc8PDEyKSsoSW50Mkxvbmc8PDQpK1RfbG9uZyA7IDsKKwkJLy8JdGFibGVbKFRfbG9uZzw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX3Nob3J0PDw0KStUX2J5dGVdIAkJCT0gKFNob3J0MkludDw8MTIpKyhCeXRlMkludDw8NCkrVF9pbnQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9sb25nXSAJCQk9IChTaG9ydDJMb25nPDwxMikrKExvbmcyTG9uZzw8NCkrVF9sb25nIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1Rfc2hvcnRdIAkJPSAoU2hvcnQySW50PDwxMikrKFNob3J0MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfU3RyaW5nXSAJCT0gKFNob3J0MlNob3J0PDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfU3RyaW5nIDsKKwkJLy8JdGFibGVbKFRfc2hvcnQ8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9kb3VibGVdIAkJPSAoU2hvcnQyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfZG91YmxlIDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfZmxvYXRdIAkJPSAoU2hvcnQyRmxvYXQ8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfZmxvYXQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9ib29sZWFuXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9zaG9ydDw8NCkrVF9jaGFyXSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoQ2hhcjJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfc2hvcnQ8PDQpK1RfaW50XSAJCQk9IChTaG9ydDJJbnQ8PDEyKSsoSW50MkludDw8NCkrVF9pbnQgOworCQkvLwl0YWJsZVsoVF9zaG9ydDw8NCkrVF9udWxsXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF92b2lkPDw0KStUX2xvbmddIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1Rfc2hvcnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9TdHJpbmddIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9PYmplY3RdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9kb3VibGVdIAk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9mbG9hdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9ib29sZWFuXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfY2hhcl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfdm9pZDw8NCkrVF9pbnRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX3ZvaWQ8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX1N0cmluZzw8NCkrVF91bmRlZmluZWRdIAk9IFRfdW5kZWZpbmVkIDsgCisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ieXRlXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQnl0ZTJCeXRlPDw0KStUX1N0cmluZyA7CisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9sb25nXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX1N0cmluZyA7IAorCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfc2hvcnRdIAkJPSAoU3RyaW5nMlN0cmluZzw8MTIpKyhTaG9ydDJTaG9ydDw8NCkrVF9TdHJpbmcgOworCQkvLwl0YWJsZVsoVF9TdHJpbmc8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX1N0cmluZ10gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfU3RyaW5nIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX09iamVjdF0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKE9iamVjdDJPYmplY3Q8PDQpK1RfU3RyaW5nIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX2RvdWJsZV0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfU3RyaW5nIDsKKwkJdGFibGVbKFRfU3RyaW5nPDw0KStUX2Zsb2F0XSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfU3RyaW5nIDsgCisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9ib29sZWFuXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQm9vbGVhbjJCb29sZWFuPDw0KStUX1N0cmluZyA7CisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9jaGFyXSAJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoQ2hhcjJDaGFyPDw0KStUX1N0cmluZyA7CisJCXRhYmxlWyhUX1N0cmluZzw8NCkrVF9pbnRdIAkJCT0gKFN0cmluZzJTdHJpbmc8PDEyKSsoSW50MkludDw8NCkrVF9TdHJpbmcgOworCQl0YWJsZVsoVF9TdHJpbmc8PDQpK1RfbnVsbF0gCQk9IChTdHJpbmcyU3RyaW5nPDwxMikrKFRfbnVsbDw8OCkrKFRfbnVsbDw8NCkrVF9TdHJpbmcgOworCQorCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ieXRlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfbG9uZ10gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX3Nob3J0XQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF92b2lkXSAJCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfU3RyaW5nXSAJCT0gKE9iamVjdDJPYmplY3Q8PDEyKSsoU3RyaW5nMlN0cmluZzw8NCkrVF9TdHJpbmcgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfT2JqZWN0XSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfZG91YmxlXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfZmxvYXRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9ib29sZWFuXQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX09iamVjdDw8NCkrVF9jaGFyXSAJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9PYmplY3Q8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfT2JqZWN0PDw0KStUX251bGxdIAkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9ieXRlXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoQnl0ZTJEb3VibGU8PDQpK1RfZG91YmxlIDsKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2xvbmddIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhMb25nMkRvdWJsZTw8NCkrVF9kb3VibGUgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1Rfc2hvcnRdIAkJPSAoRG91YmxlMkRvdWJsZTw8MTIpKyhTaG9ydDJEb3VibGU8PDQpK1RfZG91YmxlIDsgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1Rfdm9pZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX1N0cmluZ10gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfU3RyaW5nIDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2RvdWJsZV0gCQk9IChEb3VibGUyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfZG91YmxlIDsKKwkJdGFibGVbKFRfZG91YmxlPDw0KStUX2Zsb2F0XSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoRmxvYXQyRG91YmxlPDw0KStUX2RvdWJsZSA7IDsKKwkJLy8JdGFibGVbKFRfZG91YmxlPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2RvdWJsZTw8NCkrVF9jaGFyXSAJCT0gKERvdWJsZTJEb3VibGU8PDEyKSsoQ2hhcjJEb3VibGU8PDQpK1RfZG91YmxlIDsgOworCQl0YWJsZVsoVF9kb3VibGU8PDQpK1RfaW50XSAJCQk9IChEb3VibGUyRG91YmxlPDwxMikrKEludDJEb3VibGU8PDQpK1RfZG91YmxlIDsgOworCQkvLwl0YWJsZVsoVF9kb3VibGU8PDQpK1RfbnVsbF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJCisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZF0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9mbG9hdDw8NCkrVF9ieXRlXSAJCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhCeXRlMkZsb2F0PDw0KStUX2Zsb2F0IDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfbG9uZ10gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoTG9uZzJGbG9hdDw8NCkrVF9mbG9hdCA7CisJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX3Nob3J0XSAJCT0gKEZsb2F0MkZsb2F0PDwxMikrKFNob3J0MkZsb2F0PDw0KStUX2Zsb2F0IDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX1N0cmluZ10gCQk9IChGbG9hdDJGbG9hdDw8MTIpKyhTdHJpbmcyU3RyaW5nPDw0KStUX1N0cmluZyA7CisJCS8vCXRhYmxlWyhUX2Zsb2F0PDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfZG91YmxlXSAJCT0gKEZsb2F0MkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2RvdWJsZSA7CisJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2Zsb2F0XSAJCT0gKEZsb2F0MkZsb2F0PDwxMikrKEZsb2F0MkZsb2F0PDw0KStUX2Zsb2F0IDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfZmxvYXQ8PDQpK1RfY2hhcl0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoQ2hhcjJGbG9hdDw8NCkrVF9mbG9hdCA7CisJCXRhYmxlWyhUX2Zsb2F0PDw0KStUX2ludF0gCQkJPSAoRmxvYXQyRmxvYXQ8PDEyKSsoSW50MkZsb2F0PDw0KStUX2Zsb2F0IDsKKwkJLy8JdGFibGVbKFRfZmxvYXQ8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9zaG9ydF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfU3RyaW5nXSAJCQk9IChCb29sZWFuMkJvb2xlYW48PDEyKSsoU3RyaW5nMlN0cmluZzw8NCkrVF9TdHJpbmcgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX09iamVjdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfZG91YmxlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9mbG9hdF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX2Jvb2xlYW48PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9jaGFyXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfYm9vbGVhbjw8NCkrVF9pbnRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9ib29sZWFuPDw0KStUX251bGxdIAkJCT0gVF91bmRlZmluZWQgOworCQkKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF91bmRlZmluZWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2NoYXI8PDQpK1RfYnl0ZV0gCQkJPSAoQ2hhcjJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9sb25nXSAJCQk9IChDaGFyMkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9jaGFyPDw0KStUX3Nob3J0XSAJCQk9IChDaGFyMkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF92b2lkXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9TdHJpbmddIAkJPSAoQ2hhcjJDaGFyPDwxMikrKFN0cmluZzJTdHJpbmc8PDQpK1RfU3RyaW5nIDsKKwkJLy8JdGFibGVbKFRfY2hhcjw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2NoYXI8PDQpK1RfZG91YmxlXSAJCT0gKENoYXIyRG91YmxlPDwxMikrKERvdWJsZTJEb3VibGU8PDQpK1RfZG91YmxlIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9mbG9hdF0gCQkJPSAoQ2hhcjJGbG9hdDw8MTIpKyhGbG9hdDJGbG9hdDw8NCkrVF9mbG9hdCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfYm9vbGVhbl0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJdGFibGVbKFRfY2hhcjw8NCkrVF9jaGFyXSAJCQk9IChDaGFyMkludDw8MTIpKyhDaGFyMkludDw8NCkrVF9pbnQgOyA7CisJCXRhYmxlWyhUX2NoYXI8PDQpK1RfaW50XSAJCQk9IChDaGFyMkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX2NoYXI8PDQpK1RfbnVsbF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCQorCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkXSAJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9ieXRlXSAJCT0gKEludDJJbnQ8PDEyKSsoQnl0ZTJJbnQ8PDQpK1RfaW50IDsKKwkJdGFibGVbKFRfaW50PDw0KStUX2xvbmddIAkJPSAoSW50Mkxvbmc8PDEyKSsoTG9uZzJMb25nPDw0KStUX2xvbmcgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1Rfc2hvcnRdIAkJPSAoSW50MkludDw8MTIpKyhTaG9ydDJJbnQ8PDQpK1RfaW50IDsKKwkJLy8JdGFibGVbKFRfaW50PDw0KStUX3ZvaWRdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9TdHJpbmddIAkJPSAoSW50MkludDw8MTIpKyhTdHJpbmcyU3RyaW5nPDw0KStUX1N0cmluZyA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9PYmplY3RdIAkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9kb3VibGVdIAkJPSAoSW50MkRvdWJsZTw8MTIpKyhEb3VibGUyRG91YmxlPDw0KStUX2RvdWJsZSA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9mbG9hdF0gCQk9IChJbnQyRmxvYXQ8PDEyKSsoRmxvYXQyRmxvYXQ8PDQpK1RfZmxvYXQgOworCQkvLwl0YWJsZVsoVF9pbnQ8PDQpK1RfYm9vbGVhbl0gCT0gVF91bmRlZmluZWQgOworCQl0YWJsZVsoVF9pbnQ8PDQpK1RfY2hhcl0gCQk9IChJbnQySW50PDwxMikrKENoYXIySW50PDw0KStUX2ludCA7CisJCXRhYmxlWyhUX2ludDw8NCkrVF9pbnRdIAkJPSAoSW50MkludDw8MTIpKyhJbnQySW50PDw0KStUX2ludCA7CisJCS8vCXRhYmxlWyhUX2ludDw8NCkrVF9udWxsXSAJCT0gVF91bmRlZmluZWQgOworCQorCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX3VuZGVmaW5lZF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9ieXRlXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9sb25nXSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9zaG9ydF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1Rfdm9pZF0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCXRhYmxlWyhUX251bGw8PDQpK1RfU3RyaW5nXSAJCT0gKFRfbnVsbDw8MTYpKyhUX251bGw8PDEyKSsoU3RyaW5nMlN0cmluZzw8NCkrVF9TdHJpbmcgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX09iamVjdF0gCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9kb3VibGVdIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfZmxvYXRdIAkJCT0gVF91bmRlZmluZWQgOworCQkvLwl0YWJsZVsoVF9udWxsPDw0KStUX2Jvb2xlYW5dIAkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfY2hhcl0gCQkJPSBUX3VuZGVmaW5lZCA7CisJCS8vCXRhYmxlWyhUX251bGw8PDQpK1RfaW50XSAJCQk9IFRfdW5kZWZpbmVkIDsKKwkJLy8JdGFibGVbKFRfbnVsbDw8NCkrVF9udWxsXSAJCQk9IChOdWxsMlN0cmluZzw8MTIpKyhOdWxsMlN0cmluZzw8NCkrVF9TdHJpbmcgOzsKKwkKKwkJcmV0dXJuIHRhYmxlIDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9SRU1BSU5ERVIoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTUlOVVMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGdldF9SSUdIVF9TSElGVCgpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKwkJCisJCS8vCWludFtdIHRhYmxlICA9IG5ldyBpbnRbMTYqMTZdIDsKKwkJcmV0dXJuIGdldF9MRUZUX1NISUZUKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBnZXRfVU5TSUdORURfUklHSFRfU0hJRlQoKXsKKwkKKwkJLy90aGUgY29kZSBpcyBhbiBpbnQKKwkJLy8gKGNhc3QpICBsZWZ0ICAgT3AgKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CisJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKKwkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgCisJCQorCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfTEVGVF9TSElGVCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gZ2V0X1hPUigpeworCQorCQkvL3RoZSBjb2RlIGlzIGFuIGludAorCQkvLyAoY2FzdCkgIGxlZnQgICBPcCAoY2FzdCkgIHJpZ3RoIC0tPiByZXN1bHQKKwkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAorCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICAKKworCQkvLwlpbnRbXSB0YWJsZSAgPSBuZXcgaW50WzE2KjE2XSA7CisJCXJldHVybiBnZXRfQU5EKCkgOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIG9wZXJhdG9yVG9TdHJpbmcoKSB7CisJCXN3aXRjaCAoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKKwkJCWNhc2UgRVFVQUxfRVFVQUwgOgorCQkJCXJldHVybiAiPT0iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIExFU1NfRVFVQUwgOgorCQkJCXJldHVybiAiPD0iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIEdSRUFURVJfRVFVQUwgOgorCQkJCXJldHVybiAiPj0iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIE5PVF9FUVVBTCA6CisJCQkJcmV0dXJuICIhPSI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTEVGVF9TSElGVCA6CisJCQkJcmV0dXJuICI8PCI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgUklHSFRfU0hJRlQgOgorCQkJCXJldHVybiAiPj4iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFVOU0lHTkVEX1JJR0hUX1NISUZUIDoKKwkJCQlyZXR1cm4gIj4+PiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgT1JfT1IgOgorCQkJCXJldHVybiAifHwiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIEFORF9BTkQgOgorCQkJCXJldHVybiAiJiYiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFBMVVMgOgorCQkJCXJldHVybiAiKyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTUlOVVMgOgorCQkJCXJldHVybiAiLSI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTk9UIDoKKwkJCQlyZXR1cm4gIiEiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFJFTUFJTkRFUiA6CisJCQkJcmV0dXJuICIlIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBYT1IgOgorCQkJCXJldHVybiAiXiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgQU5EIDoKKwkJCQlyZXR1cm4gIiYiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIE1VTFRJUExZIDoKKwkJCQlyZXR1cm4gIioiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIE9SIDoKKwkJCQlyZXR1cm4gInwiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFRXSURETEUgOgorCQkJCXJldHVybiAifiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgRElWSURFIDoKKwkJCQlyZXR1cm4gIi8iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIEdSRUFURVIgOgorCQkJCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTEVTUyA6CisJCQkJcmV0dXJuICI8IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBRVUVTVElPTkNPTE9OIDoKKwkJCQlyZXR1cm4gIj86IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBFUVVBTCA6CisJCQkJcmV0dXJuICI9IjsgLy8kTk9OLU5MUy0xJAorCQl9OworCQlyZXR1cm4gInVua25vd24gb3BlcmF0b3IiOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKKworCQkvL3N1YmNsYXNzIHJlZGVmaW5lIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKQorCQlyZXR1cm4JIigiICsgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpICsgIikiOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uTm9QYXJlbnRoZXNpcygpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvcklkcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvcklkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTUwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9ySWRzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworcHVibGljIGludGVyZmFjZSBPcGVyYXRvcklkcyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5EX0FORCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JfT1IgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFORCA9IDI7IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SID0gMzsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVTUyA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVTU19FUVVBTCA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUiA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUl9FUVVBTCA9IDc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE9SID0gODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVZJREUgPSA5OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1NISUZUID0gMTA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UID0gMTE7IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRXSURETEUgPSAxMjsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSAxMzsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUyA9IDE0OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNVUxUSVBMWSA9IDE1OyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1BSU5ERVIgPSAxNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVCA9IDE3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMX0VRVUFMID0gMTg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TSUdORURfUklHSFRfU0hJRlQ9IDE5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE51bWJlck9mVGFibGVzID0gMjA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVTVElPTkNPTE9OID0gMjM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRVFVQUwgPSAyOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVBTCA9IDMwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTkNFT0YgPSAzMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTX1BMVVMgPSAzMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VU19NSU5VUyA9IDMzOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmEyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIFBvc3RmaXhFeHByZXNzaW9uIGV4dGVuZHMgQ29tcG91bmRBc3NpZ25tZW50IHsKKworCXB1YmxpYyBQb3N0Zml4RXhwcmVzc2lvbihFeHByZXNzaW9uIGwsIEV4cHJlc3Npb24gZSwgaW50IG9wLCBpbnQgcG9zKSB7CisJCQorCQlzdXBlcihsLCBlLCBvcCwgcG9zKTsKKwkJdGhpcy5zb3VyY2VTdGFydCA9IGwuc291cmNlU3RhcnQ7CisJCXRoaXMuc291cmNlRW5kID0gcG9zOworCX0KKwkKKwkvKioKKwkgKiBDb2RlIGdlbmVyYXRpb24gZm9yIFBvc3RmaXhFeHByZXNzaW9uCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQkvLyB2YXJpb3VzIHNjZW5hcmlpIGFyZSBwb3NzaWJsZSwgc2V0dGluZyBhbiBhcnJheSByZWZlcmVuY2UsIAorCQkvLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAorCQkvLyBqdXN0IGEgbG9jYWwgdmFyaWFibGUuCisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJbGhzLmdlbmVyYXRlUG9zdEluY3JlbWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMsIHZhbHVlUmVxdWlyZWQpOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIFN0cmluZyBvcGVyYXRvclRvU3RyaW5nKCkgeworCQlzd2l0Y2ggKG9wZXJhdG9yKSB7CisJCQljYXNlIFBMVVMgOgorCQkJCXJldHVybiAiKysiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIE1JTlVTIDoKKwkJCQlyZXR1cm4gIi0tIjsgLy8kTk9OLU5MUy0xJAorCQl9IAorCQlyZXR1cm4gInVua25vd24gb3BlcmF0b3IiOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBib29sZWFuIHJlc3RyYWluVXNhZ2VUb051bWVyaWNUeXBlcygpIHsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgeworCisJCXJldHVybiBsaHMudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiICIgKyBvcGVyYXRvclRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKKwl9IAorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKSkgeworCQkJbGhzLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1ByZWZpeEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmExZjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBQcmVmaXhFeHByZXNzaW9uIGV4dGVuZHMgQ29tcG91bmRBc3NpZ25tZW50IHsKKworCS8qKgorCSAqIFByZWZpeEV4cHJlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiBAcGFyYW0gbCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24KKwkgKiBAcGFyYW0gciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24KKwkgKiBAcGFyYW0gb3AgaW50CisJICovCisJcHVibGljIFByZWZpeEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsLCBFeHByZXNzaW9uIGUsIGludCBvcCwgaW50IHBvcykgeworCisJCXN1cGVyKGwsIGUsIG9wLCBsLnNvdXJjZUVuZCk7CisJCXRoaXMuc291cmNlU3RhcnQgPSBwb3M7CisJCXRoaXMuc291cmNlRW5kID0gbC5zb3VyY2VFbmQ7CisJfQorCisJcHVibGljIFN0cmluZyBvcGVyYXRvclRvU3RyaW5nKCkgeworCisJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCWNhc2UgUExVUyA6CisJCQkJcmV0dXJuICIrKyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgTUlOVVMgOgorCQkJCXJldHVybiAiLS0iOyAvLyROT04tTkxTLTEkCisJCX0gCisJCXJldHVybiAidW5rbm93biBvcGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiByZXN0cmFpblVzYWdlVG9OdW1lcmljVHlwZXMoKSB7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgeworCisJCXJldHVybiBvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyBsaHMudG9TdHJpbmdFeHByZXNzaW9uKCk7IC8vJE5PTi1OTFMtMSQKKworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSkpIHsKKwkJCWxocy50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA1ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEFsbG9jYXRpb25FeHByZXNzaW9uIHsKKwkKKwkvL3F1YWxpZmljYXRpb24gbWF5IGJlIG9uIGJvdGggc2lkZQorCXB1YmxpYyBFeHByZXNzaW9uIGVuY2xvc2luZ0luc3RhbmNlOworCXB1YmxpYyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlOworCisJcHVibGljIFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKCkgeworCX0KKworCXB1YmxpYyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlKSB7CisJCXRoaXMuYW5vbnltb3VzVHlwZSA9IGFub255bW91c1R5cGU7CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJLy8gdmFyaWF0aW9uIG9uIGFsbG9jYXRpb24sIHdoZXJlIGNhbiBiZSBzcGVjaWZpZWQgYW4gZW5jbG9zaW5nIGluc3RhbmNlIGFuZCBhbiBhbm9ueW1vdXMgdHlwZQorCisJCS8vIGFuYWx5c2UgdGhlIGVuY2xvc2luZyBpbnN0YW5jZQorCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkgeworCQkJZmxvd0luZm8gPSBlbmNsb3NpbmdJbnN0YW5jZS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCX0KKwkJLy8gcHJvY2VzcyBhcmd1bWVudHMKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWZsb3dJbmZvID0gYXJndW1lbnRzW2ldLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCX0KKwkJfQorCisJCS8vIGFuYWx5c2UgdGhlIGFub255bW91cyBuZXN0ZWQgdHlwZQorCQlpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CisJCQlmbG93SW5mbyA9IGFub255bW91c1R5cGUuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQl9CisKKwkJLy8gcmVjb3JkIHNvbWUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgZXhjZXB0aW9uIHR5cGVzCisJCVJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25zOworCQlpZiAoKCh0aHJvd25FeGNlcHRpb25zID0gYmluZGluZy50aHJvd25FeGNlcHRpb25zKS5sZW5ndGgpICE9IDApIHsKKwkJCS8vIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGluZworCQkJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycygKKwkJCQl0aHJvd25FeGNlcHRpb25zLAorCQkJCXRoaXMsCisJCQkJZmxvd0luZm8sCisJCQkJY3VycmVudFNjb3BlKTsKKwkJfQorCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CisJCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBlbmNsb3NpbmdJbnN0YW5jZSgpIHsKKworCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2U7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlpZiAoYWxsb2NhdGVkVHlwZS5pc0xvY2FsVHlwZSgpKSB7CisJCQlMb2NhbFR5cGVCaW5kaW5nIGxvY2FsVHlwZSA9IChMb2NhbFR5cGVCaW5kaW5nKSBhbGxvY2F0ZWRUeXBlOworCQkJbG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoCisJCQkJY29kZVN0cmVhbS5jbGFzc0ZpbGUub3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCkuY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoCisJCQkJCWxvY2FsVHlwZSkpOworCQl9CisJCWNvZGVTdHJlYW0ubmV3XyhhbGxvY2F0ZWRUeXBlKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCX0KKwkJLy8gYmV0dGVyIGhpZ2hsaWdodCBmb3IgYWxsb2NhdGlvbjogZGlzcGxheSB0aGUgdHlwZSBpbmRpdmlkdWFsbHkKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0eXBlLnNvdXJjZVN0YXJ0KTsKKworCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24KKwkJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCS8vIG1ha2Ugc3VyZSBpdHMgbmFtZSBpcyBjb21wdXRlZCBiZWZvcmUgYXJndW1lbnRzLCBzaW5jZSBtYXkgYmUgbmVjZXNzYXJ5IGZvciBhcmd1bWVudCBlbXVsYXRpb24KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNBcmd1bWVudFZhbHVlcygKKwkJCQljdXJyZW50U2NvcGUsCisJCQkJYWxsb2NhdGVkVHlwZSwKKwkJCQllbmNsb3NpbmdJbnN0YW5jZSgpLAorCQkJCXRoaXMpOworCQl9CisJCS8vIGdlbmVyYXRlIHRoZSBhcmd1bWVudHMgZm9yIGNvbnN0cnVjdG9yCisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9CisJCX0KKwkJLy8gaW52b2tlIGNvbnN0cnVjdG9yCisJCWlmIChzeW50aGV0aWNBY2Nlc3NvciA9PSBudWxsKSB7CisJCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwoYmluZGluZyk7CisJCX0gZWxzZSB7CisJCQkvLyBzeW50aGV0aWMgYWNjZXNzb3IgZ290IHNvbWUgZXh0cmEgYXJndW1lbnRzIGFwcGVuZGVkIHRvIGl0cyBzaWduYXR1cmUsIHdoaWNoIG5lZWQgdmFsdWVzCisJCQlmb3IgKGludCBpID0gMCwKKwkJCQltYXggPSBzeW50aGV0aWNBY2Nlc3Nvci5wYXJhbWV0ZXJzLmxlbmd0aCAtIGJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CisJCQkJaSA8IG1heDsKKwkJCQlpKyspIHsKKwkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQl9CisJCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwoc3ludGhldGljQWNjZXNzb3IpOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCWlmIChhbm9ueW1vdXNUeXBlICE9IG51bGwpIHsKKwkJCWFub255bW91c1R5cGUuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCX0KKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsKKworCQkvLyBuZWNlc3NhcnkgdG8gbG9va3VwIHN1cGVyIGNvbnN0cnVjdG9yIG9mIGFub255bW91cyB0eXBlCisJCXJldHVybiBhbm9ueW1vdXNUeXBlICE9IG51bGw7CisJfQorCQorCS8qIElubmVyIGVtdWxhdGlvbiBjb25zaXN0cyBpbiBlaXRoZXIgcmVjb3JkaW5nIGEgZGVwZW5kZW5jeSAKKwkgKiBsaW5rIG9ubHksIG9yIHBlcmZvcm1pbmcgb25lIGxldmVsIG9mIHByb3BhZ2F0aW9uLgorCSAqCisJICogRGVwZW5kZW5jeSBtZWNoYW5pc20gaXMgdXNlZCB3aGVuZXZlciBkZWFsaW5nIHdpdGggc291cmNlIHRhcmdldAorCSAqIHR5cGVzLCBzaW5jZSBieSB0aGUgdGltZSB3ZSByZWFjaCB0aGVtLCB3ZSBtaWdodCBub3QgeWV0IGtub3cgdGhlaXIKKwkgKiBleGFjdCBuZWVkLgorCSAqLworCXB1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGU7CisKKwkJLy8gcGVyZm9ybSBzb21lIGVtdWxhdGlvbiB3b3JrIGluIGNhc2UgdGhlcmUgaXMgc29tZSBhbmQgd2UgYXJlIGluc2lkZSBhIGxvY2FsIHR5cGUgb25seQorCQlpZiAoKGFsbG9jYXRlZFR5cGUgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5pc05lc3RlZFR5cGUoKQorCQkJJiYgY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5pc0xvY2FsVHlwZSgpKSB7CisKKwkJCWlmIChhbGxvY2F0ZWRUeXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJCQkoKExvY2FsVHlwZUJpbmRpbmcpIGFsbG9jYXRlZFR5cGUpLmFkZElubmVyRW11bGF0aW9uRGVwZW5kZW50KAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwsCisJCQkJCWZhbHNlKTsKKwkJCQkvLyByZXF1ZXN0IGNhc2NhZGUgb2YgYWNjZXNzZXMKKwkJCX0gZWxzZSB7CisJCQkJLy8gbG9jYWxseSBwcm9wYWdhdGUsIHNpbmNlIHdlIGFscmVhZHkgbm93IHRoZSBkZXNpcmVkIHNoYXBlIGZvciBzdXJlCisJCQkJY3VycmVudFNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKAorCQkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCQllbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsLAorCQkJCQlmYWxzZSk7CisJCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCisJCWlmIChhbm9ueW1vdXNUeXBlID09IG51bGwgJiYgZW5jbG9zaW5nSW5zdGFuY2UgPT0gbnVsbCkKKwkJCXJldHVybiBzdXBlci5yZXNvbHZlVHlwZShzY29wZSk7CisJCS8vIGFkZGVkIGZvciBjb2RlIGFzc2lzdC4uLiBpcyBub3QgcG9zc2libGUgd2l0aCAnbm9ybWFsJyBjb2RlCisKKwkJLy8gUHJvcGFnYXRlIHRoZSB0eXBlIGNoZWNraW5nIHRvIHRoZSBhcmd1bWVudHMsIGFuZCBjaGVja3MgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCisKKwkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKwkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gTmFtZSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKwkJLy8gPT0+IGJ5IGNvbnN0cnVjdGlvbiwgd2hlbiB0aGVyZSBpcyBhbiBlbmNsb3NpbmcgaW5zdGFuY2UgdGhlIHR5cGVuYW1lIG1heSBOT1QgYmUgcXVhbGlmaWVkCisJCS8vID09PiB0aGVyZWZvcmUgYnkgY29uc3RydWN0aW9uIHRoZSB0eXBlIGlzIGFsd2F5cyBhIFNpbmdsZVR5cGVSZWZlcmVuY2VUeXBlIGluc3RlYWQgb2YgYmVpbmcgZWl0aGVyIAorCQkvLyBzb21ldGltZSBhIFNpbmdsZVR5cGVSZWZlcmVuY2UgYW5kIHNvbWV0aW1lIGEgUXVhbGlmZWRUeXBlUmVmZXJlbmNlCisKKwkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCVR5cGVCaW5kaW5nIGVuY2xvc2luZ0luc3RUYiA9IG51bGw7CisJCVR5cGVCaW5kaW5nIHJlY1R5cGU7CisJCWlmIChhbm9ueW1vdXNUeXBlID09IG51bGwpIHsKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLW5vIGFub255bW91cyBjbGFzcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkKKwkJCWlmICgoZW5jbG9zaW5nSW5zdFRiID0gZW5jbG9zaW5nSW5zdGFuY2UucmVzb2x2ZVR5cGUoc2NvcGUpKSA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJaWYgKGVuY2xvc2luZ0luc3RUYi5pc0Jhc2VUeXBlKCkgfCBlbmNsb3NpbmdJbnN0VGIuaXNBcnJheVR5cGUoKSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxQcmltaXRpdmVPckFycmF5VHlwZUZvckVuY2xvc2luZ0luc3RhbmNlKAorCQkJCQllbmNsb3NpbmdJbnN0VGIsCisJCQkJCWVuY2xvc2luZ0luc3RhbmNlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJlY1R5cGUgPQorCQkJCSgoU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZSkucmVzb2x2ZVR5cGVFbmNsb3NpbmcoCisJCQkJCXNjb3BlLAorCQkJCQkoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdFRiKTsKKwkJCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKKwkJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IE5vUGFyYW1ldGVyczsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsKKwkJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQlhcmd1bWVudFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKKwkJCQkJCWFyZ0hhc0Vycm9yID0gdHJ1ZTsKKwkJCQlpZiAoYXJnSGFzRXJyb3IpCisJCQkJCXJldHVybiByZWNUeXBlOworCQkJfQorCQkJaWYgKHJlY1R5cGUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWlmICghcmVjVHlwZS5jYW5CZUluc3RhbnRpYXRlZCgpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodHlwZSwgcmVjVHlwZSk7CisJCQkJcmV0dXJuIHJlY1R5cGU7CisJCQl9CisJCQlpZiAoKGJpbmRpbmcgPQorCQkJCXNjb3BlLmdldENvbnN0cnVjdG9yKChSZWZlcmVuY2VCaW5kaW5nKSByZWNUeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKSkKKwkJCQkuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQoYmluZGluZywgc2NvcGUpKQorCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOworCisJCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQorCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKKwkJCQkJCWFyZ3VtZW50c1tpXS5pbXBsaWNpdFdpZGVuaW5nKGJpbmRpbmcucGFyYW1ldGVyc1tpXSwgYXJndW1lbnRUeXBlc1tpXSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCisJCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjVHlwZTsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7CisJCQkJcmV0dXJuIHJlY1R5cGU7CisJCQl9CisKKwkJCS8vIFRoZSBlbmNsb3NpbmcgaW5zdGFuY2UgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgdHlwZQorCQkJUmVmZXJlbmNlQmluZGluZyBleHBlY3RlZFR5cGUgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZW5jbG9zaW5nSW5zdFRiLCBleHBlY3RlZFR5cGUpKQorCQkJCXJldHVybiByZWNUeXBlOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3JBY3R1YWxUeXBlRXhwZWN0ZWRUeXBlKAorCQkJCWVuY2xvc2luZ0luc3RhbmNlLAorCQkJCWVuY2xvc2luZ0luc3RUYiwKKwkJCQlleHBlY3RlZFR5cGUpOworCQkJcmV0dXJuIHJlY1R5cGU7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tdGhlcmUgaXMgYW4gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24tLS0tLS0tLS0tLS0tLS0tLQorCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkgeworCQkJaWYgKChlbmNsb3NpbmdJbnN0VGIgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQlpZiAoZW5jbG9zaW5nSW5zdFRiLmlzQmFzZVR5cGUoKSB8IGVuY2xvc2luZ0luc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFByaW1pdGl2ZU9yQXJyYXlUeXBlRm9yRW5jbG9zaW5nSW5zdGFuY2UoCisJCQkJCWVuY2xvc2luZ0luc3RUYiwKKwkJCQkJZW5jbG9zaW5nSW5zdGFuY2UpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCS8vIGR1ZSB0byBzeW50YXgtY29uc3RydWN0aW9uLCByZWNUeXBlIGlzIGEgUmVmZXJlbmNlQmluZGluZwkJCisJCXJlY1R5cGUgPQorCQkJKGVuY2xvc2luZ0luc3RhbmNlID09IG51bGwpCisJCQkJPyB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKQorCQkJCTogKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlKS5yZXNvbHZlVHlwZUVuY2xvc2luZygKKwkJCQkJc2NvcGUsCisJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0VGIpOworCQlpZiAocmVjVHlwZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIHJlY1R5cGUpLmlzRmluYWwoKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKHR5cGUsIHJlY1R5cGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzID0gTm9QYXJhbWV0ZXJzOworCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQlpZiAoKGFyZ3VtZW50VHlwZXNbaV0gPSBhcmd1bWVudHNbaV0ucmVzb2x2ZVR5cGUoc2NvcGUpKSA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGFuIGFub255bW91cyBjbGFzcyBpbmhlcml0cyBmcm9tIGphdmEubGFuZy5PYmplY3Qgd2hlbiBkZWNsYXJlZCAiYWZ0ZXIiIGFuIGludGVyZmFjZQorCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyQmluZGluZyA9CisJCQlyZWNUeXBlLmlzSW50ZXJmYWNlKCkgPyBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpIDogKFJlZmVyZW5jZUJpbmRpbmcpIHJlY1R5cGU7CisJCU1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkQmluZGluZyA9CisJCQlzY29wZS5nZXRDb25zdHJ1Y3RvcihzdXBlckJpbmRpbmcsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOworCQlpZiAoIWluaGVyaXRlZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJaWYgKGluaGVyaXRlZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKKwkJCQlpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gc3VwZXJCaW5kaW5nOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGluaGVyaXRlZEJpbmRpbmcpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKKwkJCWlmICghc2NvcGUKKwkJCQkuYXJlVHlwZXNDb21wYXRpYmxlKAorCQkJCQllbmNsb3NpbmdJbnN0VGIsCisJCQkJCWluaGVyaXRlZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpKSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZSgKKwkJCQkJZW5jbG9zaW5nSW5zdGFuY2UsCisJCQkJCWVuY2xvc2luZ0luc3RUYiwKKwkJCQkJaW5oZXJpdGVkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisKKwkJLy8gdGhpcyBwcm9tb3Rpb24gaGFzIHRvIGJlIGRvbmUgc29tZXdoZXJlOiBoZXJlIG9yIGluc2lkZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlCisJCS8vIGFub255bW91cyBjbGFzcy4gV2UgZG8gaXQgaGVyZSB3aGlsZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGlubmVyIGlzIHRoZW4gZWFzaWVyLgorCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKKwkJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhpbmhlcml0ZWRCaW5kaW5nLnBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50VHlwZXNbaV0pOworCisJCS8vIFVwZGF0ZSB0aGUgYW5vbnltb3VzIGlubmVyIGNsYXNzIDogc3VwZXJjbGFzcywgaW50ZXJmYWNlICAKKwkJc2NvcGUuYWRkQW5vbnltb3VzVHlwZShhbm9ueW1vdXNUeXBlLCAoUmVmZXJlbmNlQmluZGluZykgcmVjVHlwZSk7CisJCWFub255bW91c1R5cGUucmVzb2x2ZShzY29wZSk7CisJCWJpbmRpbmcgPSBhbm9ueW1vdXNUeXBlLmNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoaW5oZXJpdGVkQmluZGluZyk7CisJCXJldHVybiBhbm9ueW1vdXNUeXBlLmJpbmRpbmc7IC8vIDEuMiBjaGFuZ2UKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkKKwkJCXMgKz0gZW5jbG9zaW5nSW5zdGFuY2UudG9TdHJpbmcoKSArICIuIjsgLy8kTk9OLU5MUy0xJAorCQlzICs9IHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpOworCQlpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CisJCQlzICs9IGFub255bW91c1R5cGUudG9TdHJpbmcodGFiKTsKKwkJfSAvL2FsbG93cyB0byByZXN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIH0gb25lIGxpbmUgdW5kZXIgLi4uLgorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkKKwkJCQllbmNsb3NpbmdJbnN0YW5jZS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl0eXBlLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJCWFyZ3VtZW50c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQl9CisJCQlpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKQorCQkJCWFub255bW91c1R5cGUudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGU1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDgwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIGV4dGVuZHMgTmFtZVJlZmVyZW5jZSB7CisJCisJcHVibGljIGNoYXJbXVtdIHRva2VuczsKKwlwdWJsaWMgRmllbGRCaW5kaW5nW10gb3RoZXJCaW5kaW5ncywgb3RoZXJDb2RlZ2VuQmluZGluZ3M7CisJaW50W10gb3RoZXJEZXB0aHM7CisJcHVibGljIGludCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmc7Ly9wb2ludHMgKGludG8gdG9rZW5zKSBmb3IgdGhlIGZpcnN0IHRva2VuIHRoYXQgY29ycmVzcG9uZHMgdG8gZmlyc3QgRmllbGRCaW5kaW5nCisJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBzeW50aGV0aWNXcml0ZUFjY2Vzc29yOworCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNSZWFkQWNjZXNzb3JzOworCXByb3RlY3RlZCBGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZzsKKwlwdWJsaWMgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSgKKwkJY2hhcltdW10gc291cmNlcywKKwkJaW50IHNvdXJjZVN0YXJ0LAorCQlpbnQgc291cmNlRW5kKSB7CisJCXN1cGVyKCk7CisJCXRva2VucyA9IHNvdXJjZXM7CisJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJfQorCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudCgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbywKKwkJQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlib29sZWFuIGlzQ29tcG91bmQpIHsKKworCQlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKKwkJCWZsb3dJbmZvID0KKwkJCQlhc3NpZ25tZW50CisJCQkJCS5leHByZXNzaW9uCisJCQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQl9CisJCS8vIGRldGVybWluZSB0aGUgcmFuayB1bnRpbCB3aGljaCB3ZSBub3cgd2UgZG8gbm90IG5lZWQgYW55IGFjdHVhbCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGFjY2VzcworCQlpbnQgb3RoZXJCaW5kaW5nc0NvdW50ID0gb3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IG90aGVyQmluZGluZ3MubGVuZ3RoOworCQlpbnQgaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9IG90aGVyQmluZGluZ3NDb3VudDsKKwkJd2hpbGUgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPiAwKSB7CisJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gb3RoZXJCaW5kaW5nc1tpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMV07CisJCQlpZiAob3RoZXJCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJYnJlYWs7IC8vIG5vIGxvbmdlciBuZWVkIGFueSB2YWx1ZSBiZWZvcmUgdGhpcyBwb2ludAorCQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZC0tOworCQl9CisJCUZpZWxkQmluZGluZyBsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsKKwkJaWYgKChiaXRzICYgRklFTEQpICE9IDApIHsKKwkJCS8vIHJlYWRpbmcgZnJvbSBhIGZpZWxkCisJCQkvLyBjaGVjayBpZiBmaW5hbCBibGFuayBmaWVsZAorCQkJaWYgKChsYXN0RmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpCisJCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChsYXN0RmllbGRCaW5kaW5nKSkgeworCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobGFzdEZpZWxkQmluZGluZykpIHsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoCisJCQkJCQlsYXN0RmllbGRCaW5kaW5nLAorCQkJCQkJdGhpcyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChiaXRzICYgTE9DQUwpICE9IDApIHsKKwkJCQkvLyBmaXJzdCBiaW5kaW5nIGlzIGEgbG9jYWwgdmFyaWFibGUKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmc7CisJCQkJaWYgKCFmbG93SW5mbworCQkJCQkuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKSkgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQl9CisJCQkJaWYgKCFmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkKKwkJCQkJbG9jYWxCaW5kaW5nLnVzZWQgPSB0cnVlOworCQkJfQorCQl9CisJCWlmIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDApIHsKKwkJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCS8vIG9ubHkgZm9yIGZpcnN0IGJpbmRpbmcKKwkJfQorCQkvLyBhbGwgaW50ZXJtZWRpYXRlIGZpZWxkIGFjY2Vzc2VzIGFyZSByZWFkIGFjY2Vzc2VzCisJCWlmIChvdGhlckJpbmRpbmdzICE9IG51bGwpIHsKKwkJCWludCBzdGFydCA9IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCA/IDAgOiBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMTsKKwkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcgIT0gbnVsbCkgeyAvLyBjb3VsZCBiZSBudWxsIGlmIGZpcnN0IHdhcyBhIGxvY2FsIHZhcmlhYmxlCisJCQkJCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGU7CisJCQkJCXN3aXRjaChpKXsKKwkJCQkJCWNhc2UgMCA6CisJCQkJCQkJbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxIDoKKwkJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gKChWYXJpYWJsZUJpbmRpbmcpYmluZGluZykudHlwZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCWxhc3RSZWNlaXZlclR5cGUgPSBvdGhlckJpbmRpbmdzW2ktMV0udHlwZTsKKwkJCQkJfQorCQkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoCisJCQkJCQljdXJyZW50U2NvcGUsIAorCQkJCQkJbGFzdEZpZWxkQmluZGluZywgCisJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlLAorCQkJCQkJaSk7CisJCQkJfQorCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSBvdGhlckJpbmRpbmdzW2ldOworCQkJfQorCQl9CisJCWlmIChpc0NvbXBvdW5kKSB7CisJCQlpZiAoYmluZGluZyA9PSBsYXN0RmllbGRCaW5kaW5nCisJCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChsYXN0RmllbGRCaW5kaW5nKQorCQkJCSYmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobGFzdEZpZWxkQmluZGluZykpKSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoCisJCQkJCWxhc3RGaWVsZEJpbmRpbmcsCisJCQkJCXRoaXMpOworCQkJfQorCQkJVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZTsKKwkJCWlmIChsYXN0RmllbGRCaW5kaW5nID09IGJpbmRpbmcpeworCQkJCWxhc3RSZWNlaXZlclR5cGUgPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCX0gZWxzZSBpZiAob3RoZXJCaW5kaW5nc0NvdW50ID09IDEpeworCQkJCWxhc3RSZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZyl0aGlzLmJpbmRpbmcpLnR5cGU7CisJCQl9IGVsc2UgeworCQkJCWxhc3RSZWNlaXZlclR5cGUgPSB0aGlzLm90aGVyQmluZGluZ3Nbb3RoZXJCaW5kaW5nc0NvdW50LTJdLnR5cGU7CisJCQl9CisJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWxhc3RGaWVsZEJpbmRpbmcsCisJCQkJbGFzdFJlY2VpdmVyVHlwZSwKKwkJCQlsYXN0RmllbGRCaW5kaW5nID09IGJpbmRpbmcKKwkJCQkJPyAwIAorCQkJCQk6IG90aGVyQmluZGluZ3NDb3VudCk7CisJCX0KKwkJLy8gdGhlIGxhc3QgZmllbGQgYWNjZXNzIGlzIGEgd3JpdGUgYWNjZXNzCisJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzRmluYWwoKSkgeworCQkJLy8gaW4gYSBjb250ZXh0IHdoZXJlIGl0IGNhbiBiZSBhc3NpZ25lZD8KKwkJCWlmIChjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGxhc3RGaWVsZEJpbmRpbmcpKSB7CisJCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKSkgeworCQkJCQlpZiAoaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpIHsKKwkJCQkJCS8vIHdhcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGZpZWxkIGJpbmRpbmcKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAorCQkJCQkJCWxhc3RGaWVsZEJpbmRpbmcsCisJCQkJCQkJdGhpcyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbEZpZWxkKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCQkJLy8gYXR0ZW1wdGluZyB0byBhc3NpZ24gYSBub24gaW1wbGljaXQgcmVmZXJlbmNlCisJCQkJCX0KKwkJCQl9CisJCQkJZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChsYXN0RmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChsYXN0RmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCX0KKwkJfQorCQkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCisJCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGU7CisJCWlmIChsYXN0RmllbGRCaW5kaW5nID09IGJpbmRpbmcpeworCQkJbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQl9IGVsc2UgaWYgKG90aGVyQmluZGluZ3NDb3VudCA9PSAxKXsKKwkJCWxhc3RSZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZyl0aGlzLmJpbmRpbmcpLnR5cGU7CisJCX0gZWxzZSB7CisJCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5vdGhlckJpbmRpbmdzW290aGVyQmluZGluZ3NDb3VudC0yXS50eXBlOworCQl9CisJCW1hbmFnZVN5bnRoZXRpY1dyaXRlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCBsYXN0RmllbGRCaW5kaW5nLCBsYXN0UmVjZWl2ZXJUeXBlKTsKKworCQlyZXR1cm4gZmxvd0luZm87CisJfQorCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCXJldHVybiBhbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbywgdHJ1ZSk7CisJfQorCQorCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbywKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCQkKKwkJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCisJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSBvdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogb3RoZXJCaW5kaW5ncy5sZW5ndGg7CisJCWludCBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9IG90aGVyQmluZGluZ3NDb3VudDsKKwkJCXdoaWxlIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID4gMCkgeworCQkJCUZpZWxkQmluZGluZyBvdGhlckJpbmRpbmcgPSBvdGhlckJpbmRpbmdzW2luZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgLSAxXTsKKwkJCQlpZiAob3RoZXJCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJCWJyZWFrOyAvLyBubyBsb25nZXIgbmVlZCBhbnkgdmFsdWUgYmVmb3JlIHRoaXMgcG9pbnQKKwkJCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkLS07CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50ICsgMTsKKwkJfQorCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCQljYXNlIEZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCisJCQkJaWYgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCkgeworCQkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSwgMCk7CisJCQkJfQorCQkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAorCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CisJCQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpCisJCQkJCQkmJiAoaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpCisJCQkJCS8vIHdhcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGZpZWxkIGJpbmRpbmcKKwkJCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKQorCQkJCQkJJiYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpKSkgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKKwkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmc7CisJCQkJaWYgKCFmbG93SW5mbworCQkJCQkuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKSkgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQl9CisJCQkJaWYgKCFmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkKKwkJCQkJbG9jYWxCaW5kaW5nLnVzZWQgPSB0cnVlOworCQl9CisJCWlmIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDApIHsKKwkJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCS8vIG9ubHkgZm9yIGZpcnN0IGJpbmRpbmcKKwkJfQorCQlpZiAob3RoZXJCaW5kaW5ncyAhPSBudWxsKSB7CisJCQlpbnQgc3RhcnQgPSBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDAgPyAwIDogaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDE7CisJCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBvdGhlckJpbmRpbmdzQ291bnQ7IGkrKykgeworCQkJCW1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeSgKKwkJCQkJY3VycmVudFNjb3BlLCAKKwkJCQkJb3RoZXJCaW5kaW5nc1tpXSwgCisJCQkJCWkgPT0gMCAKKwkJCQkJCT8gKChWYXJpYWJsZUJpbmRpbmcpYmluZGluZykudHlwZQorCQkJCQkJOiBvdGhlckJpbmRpbmdzW2ktMV0udHlwZSwKKwkJCQkJaSArIDEpOworCQkJfQorCQl9CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisJLyoqCisJICogQ2hlY2sgYW5kL29yIHJlZGlyZWN0IHRoZSBmaWVsZCBhY2Nlc3MgdG8gdGhlIGRlbGVnYXRlIHJlY2VpdmVyIGlmIGFueQorCSAqLworCXB1YmxpYyBUeXBlQmluZGluZyBjaGVja0ZpZWxkQWNjZXNzKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJLy8gY2hlY2sgZm9yIGZvcndhcmQgcmVmZXJlbmNlcworCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKKwkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOworCQlpZiAobWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpID09IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcworCQkJJiYgbWV0aG9kU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ICE9IG1ldGhvZFNjb3BlLk5vdEluRmllbGREZWNsCisJCQkmJiBmaWVsZEJpbmRpbmcuaWQgPj0gbWV0aG9kU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4KSB7CisJCQlpZiAoKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSB8fCBtZXRob2RTY29wZS5pc1N0YXRpYykKKwkJCQkmJiB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZvcndhcmRSZWZlcmVuY2UodGhpcywgMCwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKTsKKwkJfQorCQliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCisJCWJpdHMgfD0gRklFTEQ7CisJCXJldHVybiBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOworCX0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCUFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCQkKKwkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGxhc3RGaWVsZEJpbmRpbmcsIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIHZhbHVlUmVxdWlyZWQpOworCQkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfQorCX0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCisJCQkJCWNvZGVTdHJlYW0uYXJyYXlsZW5ndGgoKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJCQkJLy8gaW5saW5lIHRoZSBsYXN0IGZpZWxkIGNvbnN0YW50CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPQorCQkJCQkJCXN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbAorCQkJCQkJCQk/IG51bGwKKwkJCQkJCQkJOiBzeW50aGV0aWNSZWFkQWNjZXNzb3JzW3N5bnRoZXRpY1JlYWRBY2Nlc3NvcnMubGVuZ3RoIC0gMV07CisJCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCQkJCX0KKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudCgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJRXhwcmVzc2lvbiBleHByZXNzaW9uLAorCQlpbnQgb3BlcmF0b3IsCisJCWludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkJCQorCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KKwkJCXN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbAorCQkJCT8gbnVsbAorCQkJCTogc3ludGhldGljUmVhZEFjY2Vzc29yc1tzeW50aGV0aWNSZWFkQWNjZXNzb3JzLmxlbmd0aCAtIDFdOworCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJaWYgKGFjY2Vzc29yID09IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhhY2Nlc3Nvcik7CisJCQl9CisJCX0KKwkJLy8gdGhlIGxhc3QgZmllbGQgYWNjZXNzIGlzIGEgd3JpdGUgYWNjZXNzCisJCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KKwkJaW50IG9wZXJhdGlvblR5cGVJRDsKKwkJaWYgKChvcGVyYXRpb25UeXBlSUQgPSBpbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgPT0gVF9TdHJpbmcpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdBcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHByb21vdGUgdGhlIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgc3VpdGFibGUgb3BlcmF0aW9uIHR5cGUKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpIHsgLy8gcHJlZml4IG9wZXJhdGlvbgorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJfSBlbHNlIHsKKwkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfQorCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCS8vIGFjdHVhbCBhc3NpZ25tZW50CisJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgbGFzdEZpZWxkQmluZGluZywgc3ludGhldGljV3JpdGVBY2Nlc3NvciwgdmFsdWVSZXF1aXJlZCk7CisJCS8vIGVxdWl2YWxlbnQgdG8gdmFsdWVzUmVxdWlyZWRbbWF4T3RoZXJCaW5kaW5nc10KKwl9CisJcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWNjZXNzb3IgPQorCQkJc3ludGhldGljUmVhZEFjY2Vzc29ycyA9PSBudWxsCisJCQkJPyBudWxsCisJCQkJOiBzeW50aGV0aWNSZWFkQWNjZXNzb3JzW3N5bnRoZXRpY1JlYWRBY2Nlc3NvcnMubGVuZ3RoIC0gMV07CisJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCWlmIChhY2Nlc3NvciA9PSBudWxsKSB7CisJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCX0KKwkJfQorCQkvLyBkdXBsaWNhdGUgdGhlIG9sZCBmaWVsZCB2YWx1ZQorCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKQorCQkJCQl8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KKwkJCQlpZiAoKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykKKwkJCQkJfHwgKGxhc3RGaWVsZEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoCisJCQlwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsCisJCQlpbXBsaWNpdENvbnZlcnNpb24pOworCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCBsYXN0RmllbGRCaW5kaW5nLnR5cGUuaWQpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKAorCQkJcG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCBzeW50aGV0aWNXcml0ZUFjY2Vzc29yLCBmYWxzZSk7CisJfQorCS8qCisJICogR2VuZXJhdGUgY29kZSBmb3IgYWxsIGJpbmRpbmdzIChsb2NhbCBhbmQgZmllbGRzKSBleGNsdWRpbmcgdGhlIGxhc3Qgb25lLCB3aGljaCBtYXkgdGhlbiBiZSBnZW5lcmF0ZWQgY29kZQorCSAqIGZvciBhIHJlYWQgb3Igd3JpdGUgYWNjZXNzLgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVhZFNlcXVlbmNlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCisJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IG51bGwgPyAwIDogb3RoZXJDb2RlZ2VuQmluZGluZ3MubGVuZ3RoOworCQlpbnQgaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZDsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPSBvdGhlckJpbmRpbmdzQ291bnQ7CisJCQl3aGlsZSAoaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA+IDApIHsKKwkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5nc1tpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMV07CisJCQkJaWYgKG90aGVyQmluZGluZy5pc1N0YXRpYygpIHx8IG90aGVyQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCisJCQkJCWJyZWFrOyAvLyBubyBsb25nZXIgbmVlZCBhbnkgdmFsdWUgYmVmb3JlIHRoaXMgcG9pbnQKKwkJCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkLS07CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50ICsgMTsKKwkJfQorCQlpZiAoaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9PSAwKSB7CisJCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCQkJY2FzZSBGSUVMRCA6CisJCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJCQkvLyBpZiBmaXJzdCBmaWVsZCBpcyBhY3R1YWxseSBjb25zdGFudCwgd2UgY2FuIGlubGluZSBpdAorCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50LCAwKTsKKwkJCQkJCS8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOyAvLyB3aWxsIG5vdCBnZW5lcmF0ZSBpdCBhZ2FpbgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPQorCQkJCQkJCQljdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKAorCQkJCQkJCQkJY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoCisJCQkJCQkJCQkJKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKKwkJCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7CisJCQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CisJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMT0NBTCA6IC8vIHJlYWRpbmcgdGhlIGZpcnN0IGxvY2FsIHZhcmlhYmxlCisJCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQkJCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgcmVhZAorCQkJCQlpZiAobG9jYWxCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGxvY2FsQmluZGluZy5jb25zdGFudCwgMCk7CisJCQkJCQkvLyBubyBpbXBsaWNpdCBjb252ZXJzaW9uCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBvdXRlciBsb2NhbD8KKwkJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJCS8vIG91dGVyIGxvY2FsIGNhbiBiZSByZWFjaGVkIGVpdGhlciB0aHJvdWdoIGEgc3ludGhldGljIGFyZyBvciBhIHN5bnRoZXRpYyBmaWVsZAorCQkJCQkJCVZhcmlhYmxlQmluZGluZ1tdIHBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChsb2NhbEJpbmRpbmcpOworCQkJCQkJCWlmIChwYXRoID09IG51bGwpIHsKKwkJCQkJCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCisJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOworCQkJCQkJfQorCQkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsKKwkJfQorCQkvLyBhbGwgaW50ZXJtZWRpYXRlIGZpZWxkIGFjY2Vzc2VzIGFyZSByZWFkIGFjY2Vzc2VzCisJCS8vIG9ubHkgdGhlIGxhc3QgZmllbGQgYmluZGluZyBpcyBhIHdyaXRlIGFjY2VzcworCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyAhPSBudWxsKSB7CisJCQlpbnQgc3RhcnQgPSBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDAgPyAwIDogaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDE7CisJCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBvdGhlckJpbmRpbmdzQ291bnQ7IGkrKykgeworCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9CisJCQkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljUmVhZEFjY2Vzc29yc1tpXTsKKwkJCQkJaWYgKGFjY2Vzc29yID09IG51bGwpCisJCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKQorCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQkJZWxzZQorCQkJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCWVsc2UKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCQl9CisJCQkJbGFzdEZpZWxkQmluZGluZyA9IG90aGVyQ29kZWdlbkJpbmRpbmdzW2ldOworCQkJfQorCQl9CisJfQorCXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVjZWl2ZXIoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCX0KKwlwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJLy8gQXQgdGhpcyBwb2ludCByZXN0cmljdGl2ZUZsYWcgbWF5IE9OTFkgaGF2ZSB0d28gcG90ZW50aWFsIHZhbHVlIDogRklFTEQgTE9DQUwgKGkuZSBjYXN0IDw8KFZhcmlhYmxlQmluZGluZykgYmluZGluZz4+IGlzIHZhbGlkKQorCQlpZiAoKGJpdHMgJiBGSUVMRCkgIT0gMCkgeworCQkJaWYgKCEoKEZpZWxkQmluZGluZykgYmluZGluZykuaXNTdGF0aWMoKSkgeworCQkJCS8vbXVzdCBjaGVjayBmb3IgdGhlIHN0YXRpYyBzdGF0dXMuLi4uCisJCQkJaWYgKGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKSB7CisJCQkJCS8vdGhlIGZpZWxkIGlzIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgcXVhbGlmaWVkIHJlZmVyZW5jZS4uLi4KKwkJCQkJaWYgKHNjb3BlLm1ldGhvZFNjb3BlKCkuaXNTdGF0aWMpIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSgKKwkJCQkJCQl0aGlzLAorCQkJCQkJCShGaWVsZEJpbmRpbmcpIGJpbmRpbmcpOworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQl9IGVsc2UgeyAvL2FjY2Vzc2luZyB0byBhIGZpZWxkIHVzaW5nIGEgdHlwZSBhcyAicmVjZWl2ZXIiIGlzIGFsbG93ZWQgb25seSB3aXRoIHN0YXRpYyBmaWVsZAkKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKAorCQkJCQkJdGhpcywKKwkJCQkJCShGaWVsZEJpbmRpbmcpIGJpbmRpbmcpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXNGaWVsZFVzZURlcHJlY2F0ZWQoKEZpZWxkQmluZGluZykgYmluZGluZywgc2NvcGUpKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZCgoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCB0aGlzKTsKKwkJfQorCQlUeXBlQmluZGluZyB0eXBlID0gKChWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLnR5cGU7CisJCWludCBpbmRleCA9IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKKwkJaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CisJCWlmIChpbmRleCA9PSBsZW5ndGgpIHsgLy8JcmVzdHJpY3RpdmVGbGFnID09IEZJRUxECisJCQljb25zdGFudCA9CisJCQkJRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoKEZpZWxkQmluZGluZykgYmluZGluZywgZmFsc2UsIHRoaXMsIHNjb3BlLCBpbmRleCAtIDEpOworCQkJcmV0dXJuIHR5cGU7CisJCX0KKwkJLy8gYWxsb2NhdGlvbiBvZiB0aGUgZmllbGRCaW5kaW5ncyBhcnJheQlhbmQgaXRzIHJlc3BlY3RpdmUgY29uc3RhbnRzCisJCWludCBvdGhlckJpbmRpbmdzTGVuZ3RoID0gbGVuZ3RoIC0gaW5kZXg7CisJCW90aGVyQ29kZWdlbkJpbmRpbmdzID0gb3RoZXJCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbb3RoZXJCaW5kaW5nc0xlbmd0aF07CisJCW90aGVyRGVwdGhzID0gbmV3IGludFtvdGhlckJpbmRpbmdzTGVuZ3RoXTsKKwkJCisJCS8vIGZpbGwgdGhlIGZpcnN0IGNvbnN0YW50ICh0aGUgb25lIG9mIHRoZSBiaW5kaW5nKQorCQljb25zdGFudCA9CisJCQkoKGJpdHMgJiBGSUVMRCkgIT0gMCkKKwkJCQk/IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcsIGZhbHNlLCB0aGlzLCBzY29wZSwgaW5kZXggLSAxKQorCQkJCTogKChWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLmNvbnN0YW50OworCQkvLyBzYXZlIGZpcnN0IGRlcHRoLCBzaW5jZSB3aWxsIGJlIHVwZGF0ZWQgYnkgdmlzaWJpbGl0eSBjaGVja3Mgb2Ygb3RoZXIgYmluZGluZ3MKKwkJaW50IGZpcnN0RGVwdGggPSAoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVDsKKwkJLy8gaXRlcmF0aW9uIG9uIGVhY2ggZmllbGQJCisJCXdoaWxlIChpbmRleCA8IGxlbmd0aCkgeworCQkJY2hhcltdIHRva2VuID0gdG9rZW5zW2luZGV4XTsKKwkJCWlmICh0eXBlID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7IC8vIGNvdWxkIG5vdCByZXNvbHZlIHR5cGUgcHJpb3IgdG8gdGhpcyBwb2ludAorCisJCQliaXRzICY9IH5EZXB0aE1BU0s7IC8vIGZsdXNoIHByZXZpb3VzIGRlcHRoIGlmIGFueQkJCQorCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gc2NvcGUuZ2V0RmllbGQodHlwZSwgdG9rZW4sIHRoaXMpOworCQkJaW50IHBsYWNlID0gaW5kZXggLSBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmc7CisJCQlvdGhlckJpbmRpbmdzW3BsYWNlXSA9IGZpZWxkOworCQkJb3RoZXJEZXB0aHNbcGxhY2VdID0gKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQ7CisJCQlpZiAoZmllbGQuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZCwgc2NvcGUpKQorCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoZmllbGQsIHRoaXMpOworCQkJCUNvbnN0YW50IHNvbWVDb25zdGFudCA9CisJCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkLCBmYWxzZSwgdGhpcywgc2NvcGUsIHBsYWNlKTsKKwkJCQkvLyBjb25zdGFudCBwcm9wYWdhdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgcHJldmlvdXMgb25lIGlzIGEgY29uc3RhbnQgdG9vLgorCQkJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJY29uc3RhbnQgPSBzb21lQ29uc3RhbnQ7CisJCQkJfQorCQkJCXR5cGUgPSBmaWVsZC50eXBlOworCQkJCWluZGV4Kys7CisJCQl9IGVsc2UgeworCQkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OyAvL2Rvbid0IGZpbGwgb3RoZXIgY29uc3RhbnRzIHNsb3RzLi4uCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIGZpZWxkLCBpbmRleCwgdHlwZSk7CisJCQkJc2V0RGVwdGgoZmlyc3REZXB0aCk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJc2V0RGVwdGgoZmlyc3REZXB0aCk7CisJCXJldHVybiAob3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdzTGVuZ3RoIC0gMV0pLnR5cGU7CisJfQorCXB1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKwkJLy9JZiBpbmxpbmFibGUgZmllbGQsIGZvcmdldCB0aGUgYWNjZXNzIGVtdWxhdGlvbiwgdGhlIGNvZGUgZ2VuIHdpbGwgZGlyZWN0bHkgdGFyZ2V0IGl0CisJCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spID09IDApIHx8IChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBGSUVMRCA6CisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKKwkJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzU3RhdGljKCkKKwkJCQkJfHwgKGZpZWxkQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKQorCQkJCQlyZXR1cm47CisJCQkJUmVmZXJlbmNlQmluZGluZyBjb21wYXRpYmxlVHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkJLy8gdGhlIGRlY2xhcmluZ0NsYXNzIG9mIHRoZSB0YXJnZXQgYmluZGluZyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZW5jbG9zaW5nCisJCQkJLy8gdHlwZSBhdCA8ZGVwdGg+IGxldmVscyBvdXRzaWRlCisJCQkJZm9yIChpbnQgaSA9IDAsIGRlcHRoID0gKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQ7IGkgPCBkZXB0aDsgaSsrKSB7CisJCQkJCWNvbXBhdGlibGVUeXBlID0gY29tcGF0aWJsZVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJCX0KKwkJCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKGNvbXBhdGlibGVUeXBlLCBmYWxzZSk7CisJCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCisJCQkJYnJlYWs7CisJCQljYXNlIExPQ0FMIDoKKwkJCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZyk7CisJCX0KKwl9CisJcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywKKwkJVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZSwKKwkJaW50IGluZGV4KSB7CisJCS8vIGluZGV4ID09IDAgZGVub3RlcyB0aGUgZmlyc3QgZmllbGRCaW5kaW5nLCBpbmRleCA+IDAgZGVub3RlcyBvbmUgb2YgdGhlICdvdGhlckJpbmRpbmdzJworCQlpZiAoZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJCXJldHVybjsKKwkJaWYgKGZpZWxkQmluZGluZy5pc1ByaXZhdGUoKSkgeyAvLyBwcml2YXRlIGFjY2VzcworCQkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKSB7CisJCQkJaWYgKHN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbCkgeworCQkJCQlpZiAob3RoZXJCaW5kaW5ncyA9PSBudWxsKQorCQkJCQkJc3ludGhldGljUmVhZEFjY2Vzc29ycyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nWzFdOworCQkJCQllbHNlCisJCQkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3JzID0KKwkJCQkJCQluZXcgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tvdGhlckJpbmRpbmdzLmxlbmd0aCArIDFdOworCQkJCX0KKwkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3JzW2luZGV4XSA9ICgoU291cmNlVHlwZUJpbmRpbmcpIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKGZpZWxkQmluZGluZywgdHJ1ZSk7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MoZmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSBpZiAoZmllbGRCaW5kaW5nLmlzUHJvdGVjdGVkKCkpeworCQkJaW50IGRlcHRoID0gaW5kZXggPT0gMCA/IChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUIDogb3RoZXJEZXB0aHNbaW5kZXgtMV07CisJCQkvLyBpbXBsaWNpdCBwcm90ZWN0ZWQgYWNjZXNzIChvbmx5IGZvciBmaXJzdCBvbmUpCisJCQlpZiAoZGVwdGggPiAwICYmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpCisJCQkJCQkJCSE9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZSgpKSkgeworCQkJCWlmIChzeW50aGV0aWNSZWFkQWNjZXNzb3JzID09IG51bGwpIHsKKwkJCQkJaWYgKG90aGVyQmluZGluZ3MgPT0gbnVsbCkKKwkJCQkJCXN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPSBuZXcgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1sxXTsKKwkJCQkJZWxzZQorCQkJCQkJc3ludGhldGljUmVhZEFjY2Vzc29ycyA9CisJCQkJCQkJbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbb3RoZXJCaW5kaW5ncy5sZW5ndGggKyAxXTsKKwkJCQl9CisJCQkJc3ludGhldGljUmVhZEFjY2Vzc29yc1tpbmRleF0gPQorCQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdChkZXB0aCkpCisJCQkJCQkJCQkJCS5hZGRTeW50aGV0aWNNZXRob2QoZmllbGRCaW5kaW5nLCB0cnVlKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyhmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KKwkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkJLy8gTk9URTogZnJvbSAxLjQgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBsYXN0UmVjZWl2ZXJUeXBlCisJCQkmJiAhbGFzdFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQkJCisJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbAorCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAorCQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80CisJCQkJCSYmIChpbmRleCA+IDAgfHwgaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSB8fCAhZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkKKwkJCQl8fCAhZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKXsKKwkJCWlmIChpbmRleCA9PSAwKXsKKwkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKGZpZWxkQmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpbGFzdFJlY2VpdmVyVHlwZSk7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID09IHRoaXMub3RoZXJCaW5kaW5ncyl7CisJCQkJCWludCBsID0gdGhpcy5vdGhlckJpbmRpbmdzLmxlbmd0aDsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm90aGVyQmluZGluZ3MsIDAsIHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPSBuZXcgRmllbGRCaW5kaW5nW2xdLCAwLCBsKTsKKwkJCQl9CisJCQkJdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5nc1tpbmRleC0xXSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKWxhc3RSZWNlaXZlclR5cGUpOworCQkJfQorCQl9CisJfQorCS8qCisJICogTm8gbmVlZCB0byBlbXVsYXRlIGFjY2VzcyB0byBwcm90ZWN0ZWQgZmllbGRzIHNpbmNlIG5vdCBpbXBsaWNpdGx5IGFjY2Vzc2VkCisJICovCisJcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljV3JpdGVBY2Nlc3NJZk5lY2Vzc2FyeSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsCisJCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGUpIHsKKwkJaWYgKGZpZWxkQmluZGluZy5pc1ByaXZhdGUoKSkgeworCQkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKSB7CisJCQkJc3ludGhldGljV3JpdGVBY2Nlc3NvciA9ICgoU291cmNlVHlwZUJpbmRpbmcpIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCQkJCQkJCQkJLmFkZFN5bnRoZXRpY01ldGhvZChmaWVsZEJpbmRpbmcsIGZhbHNlKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MoZmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSBpZiAoZmllbGRCaW5kaW5nLmlzUHJvdGVjdGVkKCkpeworCQkJaW50IGRlcHRoID0gZmllbGRCaW5kaW5nID09IGJpbmRpbmcgPyAoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCA6IG90aGVyRGVwdGhzW290aGVyRGVwdGhzLmxlbmd0aC0xXTsKKwkJCWlmIChkZXB0aCA+IDAgJiYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkKKwkJCQkJCQkJIT0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRQYWNrYWdlKCkpKSB7CisJCQkJc3ludGhldGljV3JpdGVBY2Nlc3NvciA9ICgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KGRlcHRoKSkKKwkJCQkJCQkJCQkJLmFkZFN5bnRoZXRpY01ldGhvZChmaWVsZEJpbmRpbmcsIGZhbHNlKTsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MoZmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCisJCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbGFzdFJlY2VpdmVyVHlwZQorCQkJJiYgIWxhc3RSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQkJCQorCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKKwkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCQkmJiAoZmllbGRCaW5kaW5nICE9IGJpbmRpbmcgfHwgaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSB8fCAhZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkKKwkJCQl8fCAhZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKXsKKwkJCWlmIChmaWVsZEJpbmRpbmcgPT0gYmluZGluZyl7CisJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKWxhc3RSZWNlaXZlclR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSB0aGlzLm90aGVyQmluZGluZ3MpeworCQkJCQlpbnQgbCA9IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdGhlckJpbmRpbmdzLCAwLCB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1tsXSwgMCwgbCk7CisJCQkJfQorCQkJCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGgtMV0gPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoZmllbGRCaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZylsYXN0UmVjZWl2ZXJUeXBlKTsKKwkJCX0KKwkJfQorCQkKKwl9CisJLyoqCisJICogTm9ybWFsIGZpZWxkIGJpbmRpbmcgZGlkIG5vdCB3b3JrLCB0cnkgdG8gYmluZCB0byBhIGZpZWxkIG9mIHRoZSBkZWxlZ2F0ZSByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVwb3J0RXJyb3IoQmxvY2tTY29wZSBzY29wZSkgeworCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIChUeXBlQmluZGluZykgYmluZGluZyk7CisJCX0gZWxzZSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgYmluZGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCS8vIGZpZWxkIGFuZC9vciBsb2NhbCBhcmUgZG9uZSBiZWZvcmUgdHlwZSBsb29rdXBzCisJCS8vIHRoZSBvbmx5IGF2YWlsYWJsZSB2YWx1ZSBmb3IgdGhlIHJlc3RyaWN0aXZlRmxhZyBCRUZPUkUKKwkJLy8gdGhlIFRDIGlzIEZsYWdfVHlwZSBGbGFnX0xvY2FsRmllbGQgYW5kIEZsYWdfVHlwZUxvY2FsRmllbGQgCisJCXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlID0gdGhpcy5yZWNlaXZlclR5cGUgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcgPSBzY29wZS5nZXRCaW5kaW5nKHRva2VucywgYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0ssIHRoaXMpKQorCQkJLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCQljYXNlIFZBUklBQkxFIDogLy89PT09PT09PT09PT1vbmx5IHZhcmlhYmxlPT09PT09PT09PT0KKwkJCQljYXNlIFRZUEUgfCBWQVJJQUJMRSA6CisJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKKwkJCQkJCWlmICghKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkpCisJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90UmVmZXJUb05vbkZpbmFsT3V0ZXJMb2NhbCgKKwkJCQkJCQkJKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nLAorCQkJCQkJCQl0aGlzKTsKKwkJCQkJCWJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKKwkJCQkJCWJpdHMgfD0gTE9DQUw7CisJCQkJCQlyZXR1cm4gZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKHNjb3BlKTsKKwkJCQkJfQorCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCQkJCQkJLy8gY2hlY2sgZm9yIGZvcndhcmQgcmVmZXJlbmNlcworCQkJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCQkJCQlpZiAobWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpID09IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcworCQkJCQkJCSYmIG1ldGhvZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCAhPSBtZXRob2RTY29wZS5Ob3RJbkZpZWxkRGVjbAorCQkJCQkJCSYmIGZpZWxkQmluZGluZy5pZCA+PSBtZXRob2RTY29wZS5maWVsZERlY2xhcmF0aW9uSW5kZXgpIHsKKwkJCQkJCQlpZiAoKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSB8fCBtZXRob2RTY29wZS5pc1N0YXRpYykKKwkJCQkJCQkJJiYgdGhpcy5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPT0gMSkKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZm9yd2FyZFJlZmVyZW5jZSh0aGlzLCAwLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOworCQkJCQkJfQorCQkJCQkJYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cworCQkJCQkJYml0cyB8PSBGSUVMRDsKKwkJCQkJCXJldHVybiBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOworCQkJCQl9CisJCQkJCS8vIHRodXMgaXQgd2FzIGEgdHlwZQorCQkJCQliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCisJCQkJCWJpdHMgfD0gVFlQRTsKKwkJCQljYXNlIFRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KKwkJCQkJLy9kZXByZWNhdGVkIHRlc3QKKwkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQoKFR5cGVCaW5kaW5nKSBiaW5kaW5nLCBzY29wZSkpCisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSgoVHlwZUJpbmRpbmcpIGJpbmRpbmcsIHRoaXMpOworCQkJCQlyZXR1cm4gKFR5cGVCaW5kaW5nKSBiaW5kaW5nOworCQkJfQorCQl9CisJCS8vPT09PT09PT1lcnJvciBjYXNlcz09PT09PT09PT09PT09PQorCQlyZXR1cm4gdGhpcy5yZXBvcnRFcnJvcihzY29wZSk7CisJfQorCXB1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGluZGV4KSB7CisJCXRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID0gaW5kZXg7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOworCQkJaWYgKGkgPCAodG9rZW5zLmxlbmd0aCAtIDEpKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9CisJcHVibGljIFN0cmluZyB1bmJvdW5kUmVmZXJlbmNlRXJyb3JOYW1lKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZyh0b2tlbnNbMF0pOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmYjM3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlIGV4dGVuZHMgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSB7CisJCisJcHVibGljIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgbmFtZSwgaW50IHBvcywgaW50IHNvdXJjZUVuZCkgeworCQlzdXBlcihuYW1lLCBwb3MsIHNvdXJjZUVuZCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoY3VycmVudENvbXBhdGlibGVUeXBlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IgY2FzZQorCisJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGN1cnJlbnRDb21wYXRpYmxlVHlwZSkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdCh0aGlzKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjdXJyZW50Q29tcGF0aWJsZVR5cGUuc3VwZXJjbGFzcygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCisJCXJldHVybiBxdWFsaWZpY2F0aW9uLnRvU3RyaW5nKDApICsgIi5zdXBlciI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwKKwkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJCXF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFRoaXNSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI3ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIFF1YWxpZmllZFRoaXNSZWZlcmVuY2UgZXh0ZW5kcyBUaGlzUmVmZXJlbmNlIHsKKwkKKwlwdWJsaWMgVHlwZVJlZmVyZW5jZSBxdWFsaWZpY2F0aW9uOworCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudENvbXBhdGlibGVUeXBlOworCisJcHVibGljIFF1YWxpZmllZFRoaXNSZWZlcmVuY2UoVHlwZVJlZmVyZW5jZSBuYW1lLCBpbnQgcG9zLCBpbnQgc291cmNlRW5kKSB7CisKKwkJcXVhbGlmaWNhdGlvbiA9IG5hbWU7CisJCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOworCQl0aGlzLnNvdXJjZVN0YXJ0ID0gbmFtZS5zb3VyY2VTdGFydDsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CisJCX0KKwkJcmV0dXJuIGZsb3dJbmZvOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXNzKAorCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSwKKwkJVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSkgeworCisJCS8vIHRoaXMvc3VwZXIgY2Fubm90IGJlIHVzZWQgaW4gY29uc3RydWN0b3IgY2FsbAorCQlpZiAobWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKKwkJaWYgKG1ldGhvZFNjb3BlLmlzU3RhdGljKSB7CisJCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RFbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSgKKwkJCQl0aGlzLAorCQkJCXRhcmdldFR5cGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZQorCSAqCisJICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKwkgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisJICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPQorCQkJCQljdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRDb21wYXRpYmxlVHlwZSk7CisJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgeworCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBub3RoaW5nIHBhcnRpY3VsYXIgYWZ0ZXIgYWxsCisJCQkJY29kZVN0cmVhbS5hbG9hZF8wKCk7CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwl2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKworCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKAorCQkJKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50Q29tcGF0aWJsZVR5cGUsCisJCQlmYWxzZSk7CisJCS8vIHJlcXVlc3QgY2FzY2FkZSBvZiBhY2Nlc3NlcworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCVR5cGVCaW5kaW5nIHF1YWxpZmljYXRpb25UYiA9IHF1YWxpZmljYXRpb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAocXVhbGlmaWNhdGlvblRiID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyB0aGUgcXVhbGlmaWNhdGlvbiBNVVNUIGV4YWN0bHkgbWF0Y2ggc29tZSBlbmNsb3NpbmcgdHlwZSBuYW1lCisJCS8vIEl0cyBwb3NzaWJsZSB0byBxdWFsaWZ5ICd0aGlzJyBieSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBjbGFzcworCQlpbnQgZGVwdGggPSAwOworCQljdXJyZW50Q29tcGF0aWJsZVR5cGUgPSBzY29wZS5yZWZlcmVuY2VUeXBlKCkuYmluZGluZzsKKwkJd2hpbGUgKGN1cnJlbnRDb21wYXRpYmxlVHlwZSAhPSBudWxsCisJCQkmJiBjdXJyZW50Q29tcGF0aWJsZVR5cGUgIT0gcXVhbGlmaWNhdGlvblRiKSB7CisJCQlkZXB0aCsrOworCQkJY3VycmVudENvbXBhdGlibGVUeXBlID0KKwkJCQljdXJyZW50Q29tcGF0aWJsZVR5cGUuaXNTdGF0aWMoKSA/IG51bGwgOiBjdXJyZW50Q29tcGF0aWJsZVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9CisJCWJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CQkJCisJCWJpdHMgfD0gKGRlcHRoICYgMHhGRikgPDwgRGVwdGhTSElGVDsgLy8gZW5jb2RlZCBkZXB0aCBpbnRvIDggYml0cworCisJCWlmIChjdXJyZW50Q29tcGF0aWJsZVR5cGUgPT0gbnVsbCkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UoCisJCQkJdGhpcywKKwkJCQlxdWFsaWZpY2F0aW9uVGIpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBFbnN1cmUgb25lIGNhbm5vdCB3cml0ZSBjb2RlIGxpa2U6IEIoKSB7IHN1cGVyKEIudGhpcyk7IH0KKwkJaWYgKGRlcHRoID09IDApIHsKKwkJCWlmICghY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSwgcXVhbGlmaWNhdGlvblRiKSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCS8vIENvdWxkIGFsc28gYmUgdGFyZ2V0aW5nIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBpbnNpZGUgYSBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCisJCQkvLwljbGFzcyBYIHsKKwkJCS8vCQlwdWJsaWMgWChpbnQgaSkgeworCQkJLy8JCQl0aGlzKG5ldyBPYmplY3QoKSB7IE9iamVjdCBvYmogPSBYLnRoaXM7IH0pOworCQkJLy8JCX0KKwkJCS8vCX0KKworCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOworCQkJd2hpbGUgKG1ldGhvZFNjb3BlICE9IG51bGwpIHsKKwkJCQlpZiAobWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpID09IGN1cnJlbnRDb21wYXRpYmxlVHlwZSkgeworCQkJCQlpZiAoIXRoaXMuY2hlY2tBY2Nlc3MobWV0aG9kU2NvcGUsIHF1YWxpZmljYXRpb25UYikpCisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1ldGhvZFNjb3BlID0gbWV0aG9kU2NvcGUucGFyZW50Lm1ldGhvZFNjb3BlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHF1YWxpZmljYXRpb25UYjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKworCQlyZXR1cm4gcXVhbGlmaWNhdGlvbi50b1N0cmluZygwKSArICIudGhpcyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwKKwkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpIHsKKwkJCXF1YWxpZmljYXRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGY4ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGV4dGVuZHMgVHlwZVJlZmVyZW5jZSB7CisJcHVibGljIGNoYXJbXVtdIHRva2VuczsKKwlwdWJsaWMgbG9uZ1tdIHNvdXJjZVBvc2l0aW9uczsKK3B1YmxpYyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHNvdXJjZXMgLCBsb25nW10gcG9zcykgeworCXRva2VucyA9IHNvdXJjZXMgOworCXNvdXJjZVBvc2l0aW9ucyA9IHBvc3MgOworCXNvdXJjZVN0YXJ0ID0gKGludCkgKHNvdXJjZVBvc2l0aW9uc1swXT4+PjMyKSA7CisJc291cmNlRW5kID0gKGludCkoc291cmNlUG9zaXRpb25zW3NvdXJjZVBvc2l0aW9ucy5sZW5ndGgtMV0gJiAweDAwMDAwMDAwRkZGRkZGRkZMICkgOworfQorcHVibGljIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoY2hhcltdW10gc291cmNlcyAsIFR5cGVCaW5kaW5nIHRiICwgbG9uZ1tdIHBvc3MpIHsKKwl0aGlzKHNvdXJjZXMscG9zcyk7CisJYmluZGluZyA9IHRiOworfQorcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CisJLy9yZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBjb3B5IG9mIG1lIHdpdGggc29tZSBkaW1lbnNpb25zCisJLy93YXJuaW5nIDogdGhlIG5ldyB0eXBlIHJlZiBoYXMgYSBudWxsIGJpbmRpbmcKKwkKKwlyZXR1cm4gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsbnVsbCxkaW0sc291cmNlUG9zaXRpb25zKSA7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKKwlpZiAoYmluZGluZyAhPSBudWxsKQorCQlyZXR1cm4gYmluZGluZzsKKwlyZXR1cm4gc2NvcGUuZ2V0VHlwZSh0b2tlbnMpOworfQorcHVibGljIGNoYXJbXVtdIGdldFR5cGVOYW1lKCl7CisKKwlyZXR1cm4gdG9rZW5zOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKwkJYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0pOworCQlpZiAoaSA8ICh0b2tlbnMubGVuZ3RoIC0gMSkpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjlkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZSBleHRlbmRzIEV4cHJlc3Npb24gIHsKKy8qKgorICogQmFzZUxldmVsUmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBSZWZlcmVuY2UoKSB7CisJc3VwZXIoKTsKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gaXNDb21wb3VuZCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QudmFyaWFibGVTaG91bGRQcm92aWRlIikpOyAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCXJldHVybiBmbG93SW5mbzsKK30KK3B1YmxpYyBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKCkgeworCS8vdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNlbnQgb25lIEZJRUxELXRhZ2dlZCByZWZlcmVuY2VzCisJLy8gIChyZWYuYml0cyAmIEJpbmRpbmdJZHMuRklFTEQgIT0gMCkoKQorCXJldHVybiBudWxsIDsKK30KK3B1YmxpYyB2b2lkIGZpZWxkU3RvcmUoQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLCBNZXRob2RCaW5kaW5nIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCX0KKwkJfQorCQlpZiAoc3ludGhldGljV3JpdGVBY2Nlc3NvciA9PSBudWxsKSB7CisJCQljb2RlU3RyZWFtLnB1dHN0YXRpYyhmaWVsZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljV3JpdGVBY2Nlc3Nvcik7CisJCX0KKwl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bbmV3IGZpZWxkIHZhbHVlXSAgLS0tPiBbbmV3IGZpZWxkIHZhbHVlXVtvd25lcl1bbmV3IGZpZWxkIHZhbHVlXQorCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQl9CisJCX0KKwkJaWYgKHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IgPT0gbnVsbCkgeworCQkJY29kZVN0cmVhbS5wdXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljV3JpdGVBY2Nlc3Nvcik7CisJCX0KKwl9Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0LmNvbXBvdW5kUHJlU2hvdWxkUHJvdmlkZSIpKTsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0LmNvbXBvdW5kVmFyaWFibGVTaG91bGRQcm92aWRlIikpOyAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QucG9zdEluY3JTaG91bGRQcm92aWRlIikpOyAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JldHVyblN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlkYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgUmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwlwdWJsaWMgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCisJcHVibGljIFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlOworCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkOworCXB1YmxpYyBBc3ROb2RlW10gc3Vicm91dGluZXM7CisJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIHNhdmVWYWx1ZVZhcmlhYmxlOworCitwdWJsaWMgUmV0dXJuU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwciwgaW50IHMsIGludCBlICkgeworCXNvdXJjZVN0YXJ0ID0gczsKKwlzb3VyY2VFbmQgPSBlOworCWV4cHJlc3Npb24gPSBleHByIDsKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CS8vIGhlcmUgcmVxdWlyZXMgdG8gZ2VuZXJhdGUgYSBzZXF1ZW5jZSBvZiBmaW5hbGx5IGJsb2NrcyBpbnZvY2F0aW9ucyBkZXBlbmRpbmcgY29ycmVzcG9uZGluZworCS8vIHRvIGVhY2ggb2YgdGhlIHRyYXZlcnNlZCB0cnkgc3RhdGVtZW50cywgc28gdGhhdCBleGVjdXRpb24gd2lsbCB0ZXJtaW5hdGUgcHJvcGVybHkuCisKKwkvLyBsb29rdXAgdGhlIGxhYmVsLCB0aGlzIHNob3VsZCBhbnN3ZXIgdGhlIHJldHVybkNvbnRleHQKKworCWlmIChleHByZXNzaW9uICE9IG51bGwpIHsKKwkJZmxvd0luZm8gPSBleHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwl9CisJLy8gY29tcHV0ZSB0aGUgcmV0dXJuIHNlcXVlbmNlIChydW5uaW5nIHRoZSBmaW5hbGx5IGJsb2NrcykKKwlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gZmxvd0NvbnRleHQ7CisJaW50IHN1YkluZGV4ID0gMCwgbWF4U3ViID0gNTsKKwlib29sZWFuIHNhdmVWYWx1ZU5lZWRlZCA9IGZhbHNlOworCWJvb2xlYW4gaGFzVmFsdWVUb1NhdmUgPSBleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbi5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQ7CisJd2hpbGUgKHRydWUpIHsKKwkJQXN0Tm9kZSBzdWI7CisJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJSb3V0aW5lKCkpICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLnN1YnJvdXRpbmVzID09IG51bGwpeworCQkJCXRoaXMuc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWJdOworCQkJfQorCQkJaWYgKHN1YkluZGV4ID09IG1heFN1YikgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdWJyb3V0aW5lcywgMCwgKHRoaXMuc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWIgKj0gMl0pLCAwLCBzdWJJbmRleCk7IC8vIGdyb3cKKwkJCX0KKwkJCXRoaXMuc3Vicm91dGluZXNbc3ViSW5kZXgrK10gPSBzdWI7CisJCQlpZiAoc3ViLmNhbm5vdFJldHVybigpKSB7CisJCQkJc2F2ZVZhbHVlTmVlZGVkID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJQXN0Tm9kZSBub2RlOworCisJCWlmICgobm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGUpIGluc3RhbmNlb2YgU3luY2hyb25pemVkU3RhdGVtZW50KSB7CisJCQlpc1N5bmNocm9uaXplZCA9IHRydWU7CisKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50ICYmIGhhc1ZhbHVlVG9TYXZlKSB7CisJCQkJaWYgKHRoaXMuc2F2ZVZhbHVlVmFyaWFibGUgPT0gbnVsbCl7IC8vIGNsb3Nlc3Qgc3Vicm91dGluZSBzZWNyZXQgdmFyaWFibGUgaXMgdXNlZAorCQkJCQlwcmVwYXJlU2F2ZVZhbHVlTG9jYXRpb24oKFRyeVN0YXRlbWVudClub2RlKTsKKwkJCQl9CisJCQkJc2F2ZVZhbHVlTmVlZGVkID0gdHJ1ZTsKKworCQl9IGVsc2UgaWYgKHRyYXZlcnNlZENvbnRleHQgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KSB7CisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFJldHVybkluSW5pdGlhbGl6ZXIodGhpcyk7CisJCQkJcmV0dXJuIEZsb3dJbmZvLkRlYWRFbmQ7CisJCX0KKworCQkvLyByZW1lbWJlciB0aGUgaW5pdGlhbGl6YXRpb24gYXQgdGhpcworCQkvLyBwb2ludCBmb3IgZGVhbGluZyB3aXRoIGJsYW5rIGZpbmFsIHZhcmlhYmxlcy4KKwkJdHJhdmVyc2VkQ29udGV4dC5yZWNvcmRSZXR1cm5Gcm9tKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKworCQlGbG93Q29udGV4dCBwYXJlbnRDb250ZXh0OworCQlpZiAoKHBhcmVudENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudCkgPT0gbnVsbCkgeyAvLyB0b3AtY29udGV4dAorCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQl0cmF2ZXJzZWRDb250ZXh0ID0gcGFyZW50Q29udGV4dDsKKwkJfQorCX0KKwkvLyByZXNpemUgc3Vicm91dGluZXMKKwlpZiAoKHN1YnJvdXRpbmVzICE9IG51bGwpICYmIChzdWJJbmRleCAhPSBtYXhTdWIpKSB7CisJCVN5c3RlbS5hcnJheWNvcHkoc3Vicm91dGluZXMsIDAsIChzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW3N1YkluZGV4XSksIDAsIHN1YkluZGV4KTsKKwl9CisKKwkvLyBzZWNyZXQgbG9jYWwgdmFyaWFibGUgZm9yIHJldHVybiB2YWx1ZSAobm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgb2NjdXIgaW4gYSByZWFsIG1ldGhvZCkKKwlpZiAoc2F2ZVZhbHVlTmVlZGVkKSB7CisJCWlmICh0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlICE9IG51bGwpIHsKKwkJCXRoaXMuc2F2ZVZhbHVlVmFyaWFibGUudXNlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQl0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlID0gbnVsbDsKKwkJaWYgKCghaXNTeW5jaHJvbml6ZWQpICYmIChleHByZXNzaW9uVHlwZSA9PSBCb29sZWFuQmluZGluZykpIHsKKwkJCXRoaXMuZXhwcmVzc2lvbi5iaXRzIHw9IFZhbHVlRm9yUmV0dXJuTUFTSzsKKwkJfQorCX0KKwlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKK30KKyAKKy8qKgorICogUmV0cnVuIHN0YXRlbWVudCBjb2RlIGdlbmVyYXRpb24KKyAqCisgKiAgIGdlbmVyYXRlIHRoZSBmaW5hbGx5SW52b2NhdGlvblNlcXVlbmNlLgorICoKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkvLyBnZW5lcmF0ZSB0aGUgZXhwcmVzc2lvbgorCWlmICgoZXhwcmVzc2lvbiAhPSBudWxsKSAmJiAoZXhwcmVzc2lvbi5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQpKSB7CisJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbmVlZFZhbHVlKCkpOyAvLyBubyB2YWx1ZSBuZWVkZWQgaWYgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lCisJCWdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCX0KKwkKKwkvLyBnZW5lcmF0aW9uIG9mIGNvZGUgcmVzcG9uc2libGUgZm9yIGludm9raW5nIHRoZSBmaW5hbGx5IGJsb2NrcyBpbiBzZXF1ZW5jZQorCWlmIChzdWJyb3V0aW5lcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdWJyb3V0aW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJQXN0Tm9kZSBzdWI7CisJCQlpZiAoKHN1YiA9IHN1YnJvdXRpbmVzW2ldKSBpbnN0YW5jZW9mIFN5bmNocm9uaXplZFN0YXRlbWVudCkgeworCQkJCWNvZGVTdHJlYW0ubG9hZCgoKFN5bmNocm9uaXplZFN0YXRlbWVudCkgc3ViKS5zeW5jaHJvVmFyaWFibGUpOworCQkJCWNvZGVTdHJlYW0ubW9uaXRvcmV4aXQoKTsKKwkJCX0gZWxzZSB7CisJCQkJVHJ5U3RhdGVtZW50IHRyeVN1YiA9IChUcnlTdGF0ZW1lbnQpIHN1YjsKKwkJCQlpZiAodHJ5U3ViLnN1YlJvdXRpbmVDYW5ub3RSZXR1cm4pIHsKKwkJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnlTdWIuc3ViUm91dGluZVN0YXJ0TGFiZWwpOworCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5qc3IodHJ5U3ViLnN1YlJvdXRpbmVTdGFydExhYmVsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHNhdmVWYWx1ZVZhcmlhYmxlICE9IG51bGwpIGNvZGVTdHJlYW0ubG9hZChzYXZlVmFsdWVWYXJpYWJsZSk7CisJCisJaWYgKChleHByZXNzaW9uICE9IG51bGwpICYmIChleHByZXNzaW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJZ2VuZXJhdGVTdG9yZVNhdmVWYWx1ZUlmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CQkKKwl9CisJLy8gb3V0cHV0IHRoZSBzdWl0YWJsZSByZXR1cm4gYnl0ZWNvZGUgb3Igd3JhcCB0aGUgdmFsdWUgaW5zaWRlIGEgZGVzY3JpcHRvciBmb3IgZG9pdHMKKwl0aGlzLmdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKKwkKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorLyoqCisgKiBEdW1wIHRoZSBzdWl0YWJsZSByZXR1cm4gYnl0ZWNvZGUgZm9yIGEgcmV0dXJuIHN0YXRlbWVudAorICoKKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVSZXR1cm5CeXRlY29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCWNvZGVTdHJlYW0ucmV0dXJuXygpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgeworCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJY2FzZSBUX2ludCA6CisJCQkJY29kZVN0cmVhbS5pcmV0dXJuKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCWNvZGVTdHJlYW0uZnJldHVybigpOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCWNvZGVTdHJlYW0ubHJldHVybigpOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJY29kZVN0cmVhbS5kcmV0dXJuKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQljb2RlU3RyZWFtLmFyZXR1cm4oKTsKKwkJfQorCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKXsKKworCWlmIChzYXZlVmFsdWVWYXJpYWJsZSAhPSBudWxsKSBjb2RlU3RyZWFtLnN0b3JlKHNhdmVWYWx1ZVZhcmlhYmxlLCBmYWxzZSk7Cit9CitwdWJsaWMgYm9vbGVhbiBuZWVkVmFsdWUoKXsKKwlyZXR1cm4gKHN1YnJvdXRpbmVzID09IG51bGwpIHx8IChzYXZlVmFsdWVWYXJpYWJsZSAhPSBudWxsKSB8fCBpc1N5bmNocm9uaXplZDsKK30KK3B1YmxpYyB2b2lkIHByZXBhcmVTYXZlVmFsdWVMb2NhdGlvbihUcnlTdGF0ZW1lbnQgdGFyZ2V0VHJ5U3RhdGVtZW50KXsKKwkJCisJdGhpcy5zYXZlVmFsdWVWYXJpYWJsZSA9IHRhcmdldFRyeVN0YXRlbWVudC5zZWNyZXRSZXR1cm5WYWx1ZTsKK30KK3B1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKKwlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc7CisJVHlwZUJpbmRpbmcgbWV0aG9kVHlwZSA9CisJCShtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikKKwkJCT8gKChtZXRob2RCaW5kaW5nID0gKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0KS5iaW5kaW5nKSA9PSBudWxsIAorCQkJCT8gbnVsbCAKKwkJCQk6IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSkKKwkJCTogVm9pZEJpbmRpbmc7CisJaWYgKG1ldGhvZFR5cGUgPT0gVm9pZEJpbmRpbmcpIHsKKwkJLy8gdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIG51bGwKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWYgKChleHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpKSAhPSBudWxsKQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXR0ZW1wdFRvUmV0dXJuTm9uVm9pZEV4cHJlc3Npb24odGhpcywgZXhwcmVzc2lvblR5cGUpOworCQlyZXR1cm47CisJfQorCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJaWYgKG1ldGhvZFR5cGUgIT0gbnVsbCkgc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKG1ldGhvZFR5cGUsIHRoaXMpOworCQlyZXR1cm47CisJfQorCWlmICgoZXhwcmVzc2lvblR5cGUgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKKwkJcmV0dXJuOworCisJaWYgKG1ldGhvZFR5cGUgIT0gbnVsbCAmJiBleHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUoZXhwcmVzc2lvblR5cGUsIG1ldGhvZFR5cGUpKSB7CisJCS8vIGRlYWxpbmcgd2l0aCBjb25zdGFudAorCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcobWV0aG9kVHlwZSwgZXhwcmVzc2lvblR5cGUpOworCQlyZXR1cm47CisJfQorCWlmIChleHByZXNzaW9uVHlwZSA9PSBWb2lkQmluZGluZykgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hdHRlbXB0VG9SZXR1cm5Wb2lkVmFsdWUodGhpcyk7CisJCXJldHVybjsKKwl9CisJaWYgKG1ldGhvZFR5cGUgIT0gbnVsbCAmJiBzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblR5cGUsIG1ldGhvZFR5cGUpKSB7CisJCWV4cHJlc3Npb24uaW1wbGljaXRXaWRlbmluZyhtZXRob2RUeXBlLCBleHByZXNzaW9uVHlwZSk7CisJCXJldHVybjsKKwl9CisJaWYgKG1ldGhvZFR5cGUgIT0gbnVsbCl7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZShleHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgbWV0aG9kVHlwZSk7CisJfQorfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKXsKKworCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYikgOworCXMgPSBzICsgInJldHVybiAiOyAvLyROT04tTkxTLTEkCisJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCApCisJCXMgPSBzICsgZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKSA7CisJcmV0dXJuIHM7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCWlmIChleHByZXNzaW9uICE9IG51bGwpCisJCQlleHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwl9CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYmZmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBTaW5nbGVOYW1lUmVmZXJlbmNlIGV4dGVuZHMgTmFtZVJlZmVyZW5jZSBpbXBsZW1lbnRzIE9wZXJhdG9ySWRzIHsKKwlwdWJsaWMgY2hhcltdIHRva2VuOworCisJcHVibGljIE1ldGhvZEJpbmRpbmdbXSBzeW50aGV0aWNBY2Nlc3NvcnM7IC8vIFswXT1yZWFkIGFjY2Vzc29yIFsxXT13cml0ZSBhY2Nlc3NvcgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQUQgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdSSVRFID0gMTsKKwkKK3B1YmxpYyBTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7CisJc3VwZXIoKTsKKwl0b2tlbiA9IHNvdXJjZTsKKwlzb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwlzb3VyY2VFbmQgPSAoaW50KSBwb3M7Cit9CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIGlzQ29tcG91bmQpIHsKKworCS8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgZXh0cmEgd29yaworCWlmIChpc0NvbXBvdW5kKSB7IC8vIGNoZWNrIHRoZSB2YXJpYWJsZSBwYXJ0IGlzIGluaXRpYWxpemVkIGlmIGJsYW5rIGZpbmFsCisJCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCWNhc2UgRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKKwkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOworCQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJCQkvLyB3ZSBjb3VsZCBpbXByb3ZlIGVycm9yIG1zZyBoZXJlIHRlbGxpbmcgImNhbm5vdCB1c2UgY29tcG91bmQgYXNzaWdubWVudCBvbiBmaW5hbCBibGFuayBmaWVsZCIKKwkJCQkJfQorCQkJCX0KKwkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTE9DQUwgOiAvLyByZWFkaW5nIGEgbG9jYWwgdmFyaWFibGUKKwkJCQkvLyBjaGVjayBpZiBhc3NpZ25pbmcgYSBmaW5hbCBibGFuayBmaWVsZAorCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZzsKKwkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykpIHsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKGxvY2FsQmluZGluZywgdGhpcyk7CisJCQkJCS8vIHdlIGNvdWxkIGltcHJvdmUgZXJyb3IgbXNnIGhlcmUgdGVsbGluZyAiY2Fubm90IHVzZSBjb21wb3VuZCBhc3NpZ25tZW50IG9uIGZpbmFsIGxvY2FsIHZhcmlhYmxlIgorCQkJCX0KKwkJCQlpZiAoIWZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKSBsb2NhbEJpbmRpbmcudXNlZCA9IHRydWU7CisJCX0KKwl9CisJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CisJCWZsb3dJbmZvID0gYXNzaWdubWVudC5leHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwl9CisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCW1hbmFnZVN5bnRoZXRpY1dyaXRlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKworCQkJLy8gY2hlY2sgaWYgYXNzaWduaW5nIGEgZmluYWwgZmllbGQKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CisJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzRmluYWwoKSkgeworCQkJCS8vIGluc2lkZSBhIGNvbnRleHQgd2hlcmUgYWxsb3dlZAorCQkJCWlmIChjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGZpZWxkQmluZGluZykpIHsKKwkJCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpKSB7CisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCQl9CisJCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpOworCQkJCQlmbG93Q29udGV4dC5yZWNvcmRTZXR0aW5nRmluYWwoZmllbGRCaW5kaW5nLCB0aGlzKTsJCQkJCQkKKwkJCQl9IGVsc2UgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZSAKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZzsKKwkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKSl7Ly8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKKwkJCQliaXRzIHw9IEZpcnN0QXNzaWdubWVudFRvTG9jYWxNQVNLOworCQkJfSBlbHNlIHsKKwkJCQliaXRzICY9IH5GaXJzdEFzc2lnbm1lbnRUb0xvY2FsTUFTSzsKKwkJCX0KKwkJCWlmIChsb2NhbEJpbmRpbmcuaXNGaW5hbCgpKSB7CisJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSA9PSAwKSB7CisJCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWxCaW5kaW5nKSkgeworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUluaXRpYWxpemF0aW9uT2ZGaW5hbExvY2FsKGxvY2FsQmluZGluZywgdGhpcyk7CisJCQkJCX0KKwkJCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGxvY2FsQmluZGluZywgdGhpcyk7CQkJCQkJCQkKKwkJCQl9IGVsc2UgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbE91dGVyTG9jYWwobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQl9CisJCQl9CisJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nKTsKKwl9CisJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCXJldHVybiBmbG93SW5mbzsKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJcmV0dXJuIGFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0cnVlKTsKK30KK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBGSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCX0KKwkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAorCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKKwkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIExPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmc7CisJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykpIHsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCX0KKwkJCWlmICghZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpIGxvY2FsQmluZGluZy51c2VkID0gdHJ1ZTsJCQkKKwl9CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCX0KKwlyZXR1cm4gZmxvd0luZm87Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgY2hlY2tGaWVsZEFjY2VzcyhCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKKwkKKwliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCisJYml0cyB8PSBGSUVMRDsKKwlpZiAoISgoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc1N0YXRpYygpKSB7CisJCS8vIG11c3QgY2hlY2sgZm9yIHRoZSBzdGF0aWMgc3RhdHVzLi4uLgorCQlpZiAoc2NvcGUubWV0aG9kU2NvcGUoKS5pc1N0YXRpYykgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKAorCQkJCXRoaXMsCisJCQkJZmllbGRCaW5kaW5nKTsKKwkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJY29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZEJpbmRpbmcsIHRydWUsIHRoaXMsIHNjb3BlLCAwKTsKKwlpZiAoaXNGaWVsZFVzZURlcHJlY2F0ZWQoZmllbGRCaW5kaW5nLCBzY29wZSkpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vY3ljbGUgYXJlIGZvcmJpZGRlbiBPTkxZIHdpdGhpbiB0aGUgc2FtZSBjbGFzcy4uLndoeSA/Pz8/Pz8gKHBvb3IgamF2YWMuLi4uKQorCS8vQ3ljbGUgY2FuIGJlIGRvbmUgdXNpbmcgY3Jvc3MgY2xhc3MgcmVmIGJ1dCBub3QgZGlyZWN0IGludG8gYSBzYW1lIGNsYXNzIHJlZmVyZW5jZSA/Pz8/CisJLy9jbGFzcyBBIHsJc3RhdGljIGludCBrID0gQi5rKzE7fQorCS8vY2xhc3MgQiB7CXN0YXRpYyBpbnQgayA9IEEuaysyO30KKwkvL1RoZSBrLWN5Y2xlIGluIHRoaXMgZXhhbXBsZSBpcyB2YWxpZC4KKworCS8vY2xhc3MgQyB7IHN0YXRpYyBpbnQgayA9IGsgKyAxIDt9CisJLy9oZXJlIGl0IGlzIGZvcmJpZGRlbiAhID8/Pz8KKwkvL2J1dCB0aGUgbmV4dCBvbmUgaXMgdmFsaWQgISEhCisJLy9jbGFzcyBDIHsgc3RhdGljIGludCBrID0gQy5rICsgMTt9CisKKwkvL25vdGljZSB0aGF0IHRoZSBuZXh0IG9uZSBpcyBhbHNvIHZhbGlkID8hPyEKKwkvL2NsYXNzIEEgewlzdGF0aWMgaW50IGsgPSBmb28oKS5rKzEgOyBzdGF0aWMgQSBmb28oKXtyZXR1cm4gbmV3IEEoKTt9fQorCisJLy9mb3IgYWxsIHRoZXNlIHJlYXNvbnMsIHRoZSBuZXh0IHBpZWNlIG9mIGNvZGUgaXMgb25seSBoZXJlIGFuZCBub3QKKwkvL2NvbW11biBmb3IgYWxsIEZpZWxkUmVmIGFuZCBRdWFsaWZpZWROYW1lUmVmLi4uLihpLmUuIGluIHRoZSBnZXRGaWVsZCguLikgQVBJLi4uLi4KKworCS8vaW5zdGFuY2UgZmllbGQgbWF5IHJlZmVyIHRvIGZvcndhcmQgc3RhdGljIGZpZWxkLCBsaWtlIGluCisJLy9pbnQgaSA9IHN0YXRpY0k7CisJLy9zdGF0aWMgaW50IHN0YXRpY0kgPSAyIDsKKworCU1ldGhvZFNjb3BlIG1zID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKKwlpZiAobXMuZW5jbG9zaW5nU291cmNlVHlwZSgpID09IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcworCQkmJiBtcy5maWVsZERlY2xhcmF0aW9uSW5kZXggIT0gbXMuTm90SW5GaWVsZERlY2wKKwkJJiYgZmllbGRCaW5kaW5nLmlkID49IG1zLmZpZWxkRGVjbGFyYXRpb25JbmRleCkgeworCQkvL2lmIHRoZSBmaWVsZCBpcyBzdGF0aWMgYW5kIG1zIGlzIG5vdCAuLi4uIHRoZW4gaXQgaXMgdmFsaWQKKwkJaWYgKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSB8fCBtcy5pc1N0YXRpYykKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZvcndhcmRSZWZlcmVuY2UodGhpcywgMCwgc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKTsKKwl9CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlyZXR1cm4gZmllbGRCaW5kaW5nLnR5cGU7CisKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJLy8gb3B0aW1pemluZyBhc3NpZ25tZW50IGxpa2U6IGkgPSBpICsgMSBvciBpID0gMSArIGkKKwlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uLmlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSkgeworCQlCaW5hcnlFeHByZXNzaW9uIG9wZXJhdGlvbiA9IChCaW5hcnlFeHByZXNzaW9uKSBhc3NpZ25tZW50LmV4cHJlc3Npb247CisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgdmFyaWFibGVSZWZlcmVuY2U7CisJCWlmICgob3BlcmF0aW9uLmxlZnQgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSAmJiAoKHZhcmlhYmxlUmVmZXJlbmNlID0gKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG9wZXJhdGlvbi5sZWZ0KS5iaW5kaW5nID09IGJpbmRpbmcpKSB7CisJCQkvLyBpID0gaSArIHZhbHVlLCB0aGVuIHVzZSB0aGUgdmFyaWFibGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgc2luY2UgaXQgaGFzIHRoZSBjb3JyZWN0IGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCXZhcmlhYmxlUmVmZXJlbmNlLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwgb3BlcmF0aW9uLnJpZ2h0LCAob3BlcmF0aW9uLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQsIG9wZXJhdGlvbi5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAvKnNob3VsZCBiZSBlcXVpdmFsZW50IHRvIG5vIGNvbnZlcnNpb24qLywgdmFsdWVSZXF1aXJlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IG9wZXJhdG9yID0gKG9wZXJhdGlvbi5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUOworCQlpZiAoKG9wZXJhdGlvbi5yaWdodCBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpCisJCQkmJiAoKG9wZXJhdG9yID09IFBMVVMpIHx8IChvcGVyYXRvciA9PSBNVUxUSVBMWSkpIC8vIG9ubHkgY29tbXV0YXRpdmUgb3BlcmF0aW9ucworCQkJJiYgKCh2YXJpYWJsZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBvcGVyYXRpb24ucmlnaHQpLmJpbmRpbmcgPT0gYmluZGluZykKKwkJCSYmIChvcGVyYXRpb24ubGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIC8vIGV4Y2x1ZGUgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zLCBzaW5jZSBjb3VsZCBoYXZlIHNpZGUtZWZmZWN0CisJCQkmJiAoKG9wZXJhdGlvbi5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAhPSBUX1N0cmluZykgLy8gZXhjbHVkZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3aGljaCB3b3VsZCBvY2N1ciBiYWNrd2FyZHMKKwkJCSYmICgob3BlcmF0aW9uLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAhPSBUX1N0cmluZykpIHsgLy8gZXhjbHVkZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3aGljaCB3b3VsZCBvY2N1ciBiYWNrd2FyZHMKKwkJCS8vIGkgPSB2YWx1ZSArIGksIHRoZW4gdXNlIHRoZSB2YXJpYWJsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBzaW5jZSBpdCBoYXMgdGhlIGNvcnJlY3QgaW1wbGljaXQgY29udmVyc2lvbgorCQkJdmFyaWFibGVSZWZlcmVuY2UuZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiBzeW50aGV0aWNBY2Nlc3NvcnNbV1JJVEVdLCBvcGVyYXRpb24ubGVmdCwgb3BlcmF0b3IsIG9wZXJhdGlvbi5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gLypzaG91bGQgYmUgZXF1aXZhbGVudCB0byBubyBjb252ZXJzaW9uKi8sIHZhbHVlUmVxdWlyZWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBGSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOworCQkJaWYgKCEoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZykuaXNTdGF0aWMoKSkgeyAvLyBuZWVkIGEgcmVjZWl2ZXI/CisJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7CisJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKKwkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQl9CisJCQl9CisJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGZpZWxkQmluZGluZywgc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwgdmFsdWVSZXF1aXJlZCk7CisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJfQorCQkJcmV0dXJuOworCQljYXNlIExPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCWlmIChsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgeworCQkJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJLy8gYXNzaWduaW5nIGFuIHVudXNlZCBsb2NhbCB0byBhIGNvbnN0YW50IHZhbHVlID0gbm8gYWN0dWFsIGFzc2lnbm1lbnQgaXMgbmVjZXNzYXJ5CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoYXNzaWdubWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJCS8qIEV2ZW4gdGhvdWdoIHRoZSB2YWx1ZSBtYXkgbm90IGJlIHJlcXVpcmVkLCB3ZSBmb3JjZSBpdCB0byBiZSBwcm9kdWNlZCwgYW5kIGRpc2NhcmQgaXQgbGF0ZXIKKwkJCQkJb24gaWYgaXQgd2FzIGFjdHVhbGx5IG5vdCBuZWNlc3NhcnksIHNvIGFzIHRvIHByb3ZpZGUgdGhlIHNhbWUgYmVoYXZpb3IgYXMgSkRLMS4yYmV0YTMuCSovCisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsgLy8gaW1wbGljaXQgY29udmVyc2lvbgorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChsb2NhbEJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGxvY2FsQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCQkJY29kZVN0cmVhbS5wb3AyKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8gbm9ybWFsIGxvY2FsIGFzc2lnbm1lbnQgKHNpbmNlIGNhbm5vdCBzdG9yZSBpbiBvdXRlciBsb2NhbCB3aGljaCBhcmUgZmluYWwgbG9jYXRpb25zKQorCQkJY29kZVN0cmVhbS5zdG9yZShsb2NhbEJpbmRpbmcsIHZhbHVlUmVxdWlyZWQpOworCQkJaWYgKChiaXRzICYgRmlyc3RBc3NpZ25tZW50VG9Mb2NhbE1BU0spICE9IDApIHsgLy8gZm9yIGxvY2FsIHZhcmlhYmxlIGRlYnVnIGF0dHJpYnV0ZXMKKwkJCQlsb2NhbEJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOworCQkJfQorCQkJLy8gaW1wbGljaXQgY29udmVyc2lvbgorCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnQuaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0KKwl9Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCQljYXNlIEZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmcpLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkgeyAvLyBkaXJlY3RseSB1c2UgaW5saW5lZCB2YWx1ZSBmb3IgY29uc3RhbnQgZmllbGRzCisJCQkJCQlib29sZWFuIGlzU3RhdGljOworCQkJCQkJaWYgKCEoaXNTdGF0aWMgPSBmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkpIHsKKwkJCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKKwkJCQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgeworCQkJCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKKwkJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBtYW5hZ2luZyBwcml2YXRlIGFjY2VzcwkJCQkJCQkKKwkJCQkJCWlmICgoc3ludGhldGljQWNjZXNzb3JzID09IG51bGwpIHx8IChzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0gPT0gbnVsbCkpIHsKKwkJCQkJCQlpZiAoaXNTdGF0aWMpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMoZmllbGRCaW5kaW5nKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCQkJfQorCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCQl9IGVsc2UgeyAvLyBkaXJlY3RseSB1c2UgdGhlIGlubGluZWQgdmFsdWUKKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChmaWVsZEJpbmRpbmcuY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIExPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCS8vIG91dGVyIGxvY2FsPworCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCS8vIG91dGVyIGxvY2FsIGNhbiBiZSByZWFjaGVkIGVpdGhlciB0aHJvdWdoIGEgc3ludGhldGljIGFyZyBvciBhIHN5bnRoZXRpYyBmaWVsZAorCQkJCQkJVmFyaWFibGVCaW5kaW5nW10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKGxvY2FsQmluZGluZyk7CisJCQkJCQlpZiAocGF0aCA9PSBudWxsKSB7CisJCQkJCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCisJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgcmVhZAorCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCX0KKwkJfQorCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorLyoKKyAqIFJlZ3VsYXIgQVBJIGZvciBjb21wb3VuZCBhc3NpZ25tZW50LCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSByZWZlcmVuY2UgdG8gdGhlCisgKiB2YXJpYWJsZSwgd2hpY2ggY2FycmllcyBib3RoIHN5bnRoZXRpYyByZWFkL3dyaXRlIGFjY2Vzc29ycy4KKyAqIFRoZSBBUElzIHdpdGggYW4gZXh0cmEgYXJndW1lbnQgaXMgdXNlZCB3aGVuZXZlciB0aGVyZSBhcmUgdHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUgd2hpY2gKKyAqIGFyZSBvcHRpbWl6ZWQgaW4gb25lIGFjY2VzczogZS5nICJhID0gYSArIDEiIG9wdGltaXplZCBpbnRvICJhKysiLgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJdGhpcy5nZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudCgKKwkJY3VycmVudFNjb3BlLCAKKwkJY29kZVN0cmVhbSwgCisJCXN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sCisJCWV4cHJlc3Npb24sCisJCW9wZXJhdG9yLCAKKwkJYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgCisJCXZhbHVlUmVxdWlyZWQpOworfQorLyoKKyAqIFRoZSBBUElzIHdpdGggYW4gZXh0cmEgYXJndW1lbnQgaXMgdXNlZCB3aGVuZXZlciB0aGVyZSBhcmUgdHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUgd2hpY2gKKyAqIGFyZSBvcHRpbWl6ZWQgaW4gb25lIGFjY2VzczogZS5nICJhID0gYSArIDEiIG9wdGltaXplZCBpbnRvICJhKysiLgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBNZXRob2RCaW5kaW5nIHdyaXRlQWNjZXNzb3IsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IG9wZXJhdG9yLCBpbnQgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CisJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmcpLmlzU3RhdGljKCkpIHsKKwkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3JzW1JFQURdKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7CisJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQl9CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIExPQ0FMIDogLy8gYXNzaWduaW5nIHRvIGEgbG9jYWwgdmFyaWFibGUgKGNhbm5vdCBhc3NpZ24gdG8gb3V0ZXIgbG9jYWwpCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQlDb25zdGFudCBhc3NpZ25Db25zdGFudDsKKwkJCWludCBpbmNyZW1lbnQ7CisJCQkvLyB1c2luZyBpbmNyIGJ5dGVjb2RlIGlmIHBvc3NpYmxlCisJCQlzd2l0Y2ggKGxvY2FsQmluZGluZy50eXBlLmlkKSB7CisJCQkJY2FzZSBUX1N0cmluZyA6CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdBcHBlbmQoY3VycmVudFNjb3BlLCB0aGlzLCBleHByZXNzaW9uKTsKKwkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5zdG9yZShsb2NhbEJpbmRpbmcsIGZhbHNlKTsKKwkJCQkJcmV0dXJuOworCQkJCWNhc2UgVF9pbnQgOgorCQkJCQlpZiAoKChhc3NpZ25Db25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQpICE9IE5vdEFDb25zdGFudCkgCisJCQkJCQkmJiAoYXNzaWduQ29uc3RhbnQudHlwZUlEKCkgIT0gVF9mbG9hdCkgLy8gb25seSBmb3IgaW50ZWdyYWwgdHlwZXMKKwkJCQkJCSYmIChhc3NpZ25Db25zdGFudC50eXBlSUQoKSAhPSBUX2RvdWJsZSkKKwkJCQkJCSYmICgoaW5jcmVtZW50ID0gYXNzaWduQ29uc3RhbnQuaW50VmFsdWUoKSkgPT0gKHNob3J0KSBpbmNyZW1lbnQpKSB7IC8vIDE2IGJpdHMgdmFsdWUKKwkJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCQkJCQljYXNlIFBMVVMgOgorCQkJCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIGluY3JlbWVudCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSBNSU5VUyA6CisJCQkJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgLWluY3JlbWVudCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQlkZWZhdWx0IDoKKwkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQl9CisJfQorCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KKwlpbnQgb3BlcmF0aW9uVHlwZUlEOworCWlmICgob3BlcmF0aW9uVHlwZUlEID0gaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfU3RyaW5nIHx8IG9wZXJhdGlvblR5cGVJRCA9PSBUX09iamVjdCkgeworCQkvLyB3ZSBlbnRlciBoZXJlIGlmIHRoZSBzaW5nbGUgbmFtZSByZWZlcmVuY2UgaXMgYSBmaWVsZCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcgb3IgaWYgdGhlIHR5cGUgb2YgdGhlIAorCQkvLyBvcGVyYXRpb24gaXMgamF2YS5sYW5nLk9iamVjdAorCQkvLyBGb3IgZXhhbXBsZTogbyA9IG8gKyAiIjsgLy8gd2hlcmUgdGhlIGNvbXBpbGVkIHR5cGUgb2YgbyBpcyBqYXZhLmxhbmcuT2JqZWN0LgorCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJfSBlbHNlIHsKKwkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSl7IC8vIHByZWZpeCBvcGVyYXRpb24KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwkJCQorCQl9IGVsc2UgeworCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJfQkJCisJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwl9CisJLy8gc3RvcmUgdGhlIHJlc3VsdCBiYWNrIGludG8gdGhlIHZhcmlhYmxlCisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZywgd3JpdGVBY2Nlc3NvciwgdmFsdWVSZXF1aXJlZCk7CisJCQlyZXR1cm47CisJCWNhc2UgTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoKGxvY2FsQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobG9jYWxCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CisJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmcpLmlzU3RhdGljKCkpIHsKKwkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoc3ludGhldGljQWNjZXNzb3JzW1JFQURdKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7CisJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQl9CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQlpZiAoKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKSB8fCAoc3ludGhldGljQWNjZXNzb3JzW1JFQURdID09IG51bGwpKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmludm9rZXN0YXRpYyhzeW50aGV0aWNBY2Nlc3NvcnNbUkVBRF0pOworCQkJCX0KKwkJCX0KKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCWlmICgoZmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQl9CisJCQkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KKwkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgZmllbGRCaW5kaW5nLnR5cGUuaWQpOworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LmFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCBmaWVsZEJpbmRpbmcsIHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsID8gbnVsbCA6IHN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0sIGZhbHNlKTsKKwkJCXJldHVybjsKKwkJY2FzZSBMT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQkvLyB1c2luZyBpbmNyIGJ5dGVjb2RlIGlmIHBvc3NpYmxlCisJCQlpZiAobG9jYWxCaW5kaW5nLnR5cGUgPT0gSW50QmluZGluZykgeworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOworCQkJCX0KKwkJCQlpZiAocG9zdEluY3JlbWVudC5vcGVyYXRvciA9PSBQTFVTKSB7CisJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5paW5jKGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uLCAtMSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCl7CisJCQkJCWlmICgobG9jYWxCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChsb2NhbEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgbG9jYWxCaW5kaW5nLnR5cGUuaWQpOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKworCQkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7CisJCQl9CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVSZWNlaXZlcihDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwljb2RlU3RyZWFtLmFsb2FkXzAoKTsKK30KK3B1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKworCS8vSWYgaW5saW5hYmxlIGZpZWxkLCBmb3JnZXQgdGhlIGFjY2VzcyBlbXVsYXRpb24sIHRoZSBjb2RlIGdlbiB3aWxsIGRpcmVjdGx5IHRhcmdldCBpdAorCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spID09IDApIHx8IChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKSByZXR1cm47CisKKwlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgRklFTEQgOgorCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKKwkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZyliaW5kaW5nKS5pc1N0YXRpYygpIHx8IChmaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkgcmV0dXJuOworCQkJUmVmZXJlbmNlQmluZGluZyBjb21wYXRpYmxlVHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkvLyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb2YgdGhlIHRhcmdldCBiaW5kaW5nIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBlbmNsb3NpbmcKKwkJCS8vIHR5cGUgYXQgPGRlcHRoPiBsZXZlbHMgb3V0c2lkZQorCQkJZm9yIChpbnQgaSA9IDAsIGRlcHRoID0gKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQ7IGkgPCBkZXB0aDsgaSsrKSB7CisJCQkJY29tcGF0aWJsZVR5cGUgPSBjb21wYXRpYmxlVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQl9CisJCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKGNvbXBhdGlibGVUeXBlLCBmYWxzZSk7IC8vIHJlcXVlc3QgY2FzY2FkZSBvZiBhY2Nlc3NlcworCQkJYnJlYWs7CisJCWNhc2UgTE9DQUwgOgorCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOworCX0KK30KK3B1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJLy9JZiBpbmxpbmFibGUgZmllbGQsIGZvcmdldCB0aGUgYWNjZXNzIGVtdWxhdGlvbiwgdGhlIGNvZGUgZ2VuIHdpbGwgZGlyZWN0bHkgdGFyZ2V0IGl0CisJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKKwkJcmV0dXJuOworCisJaWYgKChiaXRzICYgRklFTEQpICE9IDApIHsKKwkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7CisJCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApCisJCQkmJiAoZmllbGRCaW5kaW5nLmlzUHJpdmF0ZSgpIC8vIHByaXZhdGUgYWNjZXNzCisJCQkJfHwgKGZpZWxkQmluZGluZy5pc1Byb3RlY3RlZCgpIC8vIGltcGxpY2l0IHByb3RlY3RlZCBhY2Nlc3MKKwkJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5nZXRQYWNrYWdlKCkgCisJCQkJCQkJIT0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRQYWNrYWdlKCkpKSkgeworCQkJaWYgKHN5bnRoZXRpY0FjY2Vzc29ycyA9PSBudWxsKQorCQkJCXN5bnRoZXRpY0FjY2Vzc29ycyA9IG5ldyBNZXRob2RCaW5kaW5nWzJdOworCQkJc3ludGhldGljQWNjZXNzb3JzW1JFQURdID0gCisJCQkJKChTb3VyY2VUeXBlQmluZGluZyljdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLgorCQkJCQllbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKS4KKwkJCQkJCWFkZFN5bnRoZXRpY01ldGhvZChmaWVsZEJpbmRpbmcsIHRydWUpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MoZmllbGRCaW5kaW5nLCB0aGlzKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KKwkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkJLy8gTk9URTogZnJvbSAxLjQgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkJLy8gYW5kIG5vdCBmcm9tIE9iamVjdCBvciBpbXBsaWNpdCBzdGF0aWMgZmllbGQgYWNjZXNzLgkKKwkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZQorCQkJJiYgIXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkJCisJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbAorCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAorCQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80IAorCQkJCQkmJiAhZmllbGRCaW5kaW5nLmlzU3RhdGljKCkKKwkJCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KSAvLyBubyBjaGFuZ2UgZm9yIE9iamVjdCBmaWVsZHMgKGlmIHRoZXJlIHdhcyBhbnkpCisJCQkJfHwgIWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSl7CisJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKGZpZWxkQmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUpOworCQl9CisJfQorfQorcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljV3JpdGVBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJaWYgKChiaXRzICYgRklFTEQpICE9IDApIHsKKwkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7CisJCWlmICgoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIAorCQkJJiYgKGZpZWxkQmluZGluZy5pc1ByaXZhdGUoKSAvLyBwcml2YXRlIGFjY2VzcworCQkJCXx8IChmaWVsZEJpbmRpbmcuaXNQcm90ZWN0ZWQoKSAvLyBpbXBsaWNpdCBwcm90ZWN0ZWQgYWNjZXNzCisJCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZ2V0UGFja2FnZSgpIAorCQkJCQkJCSE9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZSgpKSkpIHsKKwkJCWlmIChzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCkKKwkJCQlzeW50aGV0aWNBY2Nlc3NvcnMgPSBuZXcgTWV0aG9kQmluZGluZ1syXTsKKwkJCXN5bnRoZXRpY0FjY2Vzc29yc1tXUklURV0gPSAKKwkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKWN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuCisJCQkJCWVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpLgorCQkJCQkJYWRkU3ludGhldGljTWV0aG9kKGZpZWxkQmluZGluZywgZmFsc2UpOworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCisJCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIGZpZWxkIGFjY2Vzcy4JCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUKKwkJCSYmICF0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQorCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKKwkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCAKKwkJCQkJJiYgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpCisJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzIChpZiB0aGVyZSB3YXMgYW55KQorCQkJCXx8ICFmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpeworCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKXRoaXMuYWN0dWFsUmVjZWl2ZXJUeXBlKTsKKwkJfQorCX0KK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXBvcnRFcnJvcihCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy89PT09PWVycm9yIGNhc2VzPT09PT09PQorCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUZpZWxkQmluZGluZykgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgKEZpZWxkQmluZGluZykgYmluZGluZyk7CisJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwl9IGVsc2UgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlc29sdmFibGVSZWZlcmVuY2UodGhpcywgYmluZGluZyk7CisJfQorCXJldHVybiBudWxsOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBmb3IgY29kZSBnZW4sIGhhcm0gdGhlIHJlc3RyaWN0aXZlRmxhZyAJCisKKwl0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZSA9IHRoaXMucmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQorCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEJpbmRpbmcodG9rZW4sIGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLLCB0aGlzKSkuaXNWYWxpZEJpbmRpbmcoKSkgeworCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCQljYXNlIFZBUklBQkxFIDogLy8gPT09PT09PT09b25seSB2YXJpYWJsZT09PT09PT09PT09PQorCQkJY2FzZSBWQVJJQUJMRSB8IFRZUEUgOiAvLz09PT1ib3RoIHZhcmlhYmxlIGFuZCB0eXBlPT09PT09PT09PT09CisJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBWYXJpYWJsZUJpbmRpbmcpIHsKKwkJCQkJVmFyaWFibGVCaW5kaW5nIHZiID0gKFZhcmlhYmxlQmluZGluZykgYmluZGluZzsKKwkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJCQkJYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgIC8vIGNsZWFyIGJpdHMKKwkJCQkJCWJpdHMgfD0gTE9DQUw7CisJCQkJCQljb25zdGFudCA9IHZiLmNvbnN0YW50OworCQkJCQkJaWYgKCghdmIuaXNGaW5hbCgpKSAmJiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApKQorCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFJlZmVyVG9Ob25GaW5hbE91dGVyTG9jYWwoKExvY2FsVmFyaWFibGVCaW5kaW5nKXZiLCB0aGlzKTsKKwkJCQkJCXJldHVybiB2Yi50eXBlOworCQkJCQl9CisJCQkJCS8vIGEgZmllbGQKKwkJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOworCQkJCX0KKworCQkJCS8vIHRodXMgaXQgd2FzIGEgdHlwZQorCQkJCWJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7ICAvLyBjbGVhciBiaXRzCisJCQkJYml0cyB8PSBUWVBFOworCQkJY2FzZSBUWVBFIDogLy89PT09PT09PW9ubHkgdHlwZT09PT09PT09PT09PT09CisJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJLy9kZXByZWNhdGVkIHRlc3QKKwkJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZCgoVHlwZUJpbmRpbmcpIGJpbmRpbmcsIHNjb3BlKSkKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUoKFR5cGVCaW5kaW5nKSBiaW5kaW5nLCB0aGlzKTsKKwkJCQlyZXR1cm4gKFR5cGVCaW5kaW5nKSBiaW5kaW5nOworCQl9CisJfQorCisJLy8gZXJyb3Igc2NlbmFyaWkKKwlyZXR1cm4gdGhpcy5yZXBvcnRFcnJvcihzY29wZSk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCisJcmV0dXJuIG5ldyBTdHJpbmcodG9rZW4pO30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK3B1YmxpYyBTdHJpbmcgdW5ib3VuZFJlZmVyZW5jZUVycm9yTmFtZSgpeworCisJcmV0dXJuIG5ldyBTdHJpbmcodG9rZW4pO30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMGMwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgU2luZ2xlVHlwZVJlZmVyZW5jZSBleHRlbmRzIFR5cGVSZWZlcmVuY2UgeworCXB1YmxpYyBjaGFyW10gdG9rZW47CisJCisKK3B1YmxpYyBTaW5nbGVUeXBlUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zKSB7CisJCXRva2VuID0gc291cmNlOworCQlzb3VyY2VTdGFydCA9IChpbnQpIChwb3M+Pj4zMikgIDsKKwkJc291cmNlRW5kID0gKGludCkgKHBvcyAmIDB4MDAwMDAwMDBGRkZGRkZGRkwpIDsKKwkKK30KK3B1YmxpYyBTaW5nbGVUeXBlUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UgLFR5cGVCaW5kaW5nIHRiLCBsb25nIHBvcykgeworCXRoaXMoc291cmNlLCBwb3MpIDsKKwliaW5kaW5nID0gdGIgOworfQorcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CisJLy9yZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBjb3B5IG9mIG1lIHdpdGggc29tZSBkaW1lbnNpb25zCisJLy93YXJuaW5nIDogdGhlIG5ldyB0eXBlIHJlZiBoYXMgYSBudWxsIGJpbmRpbmcKKwkKKwlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZSh0b2tlbixudWxsLGRpbSwoKChsb25nKXNvdXJjZVN0YXJ0KTw8MzIpK3NvdXJjZUVuZCkgOworfQorcHVibGljIFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKSB7CisJaWYgKGJpbmRpbmcgIT0gbnVsbCkKKwkJcmV0dXJuIGJpbmRpbmc7CisJcmV0dXJuIHNjb3BlLmdldFR5cGUodG9rZW4pOworfQorcHVibGljIGNoYXIgW11bXSBnZXRUeXBlTmFtZSgpIHsKKwlyZXR1cm4gbmV3IGNoYXJbXVtdIHsgdG9rZW4gfTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZUVuY2xvc2luZyhCbG9ja1Njb3BlIHNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclRiID0gc2NvcGUuZ2V0TWVtYmVyVHlwZSh0b2tlbiwgZW5jbG9zaW5nVHlwZSk7CisJaWYgKCFtZW1iZXJUYi5pc1ZhbGlkQmluZGluZygpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRFbmNsb3NpbmdUeXBlKHRoaXMsIG1lbWJlclRiLCBlbmNsb3NpbmdUeXBlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKG1lbWJlclRiLCBzY29wZSkpCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKG1lbWJlclRiLCB0aGlzKTsKKwlyZXR1cm4gYmluZGluZyA9IG1lbWJlclRiOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7CisJcmV0dXJuIG5ldyBTdHJpbmcodG9rZW4pIDsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK3B1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIENsYXNzU2NvcGUgc2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2UwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgQXN0Tm9kZSB7CisJCisJLyoqCisJICogU3RhdGVtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFN0YXRlbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCXJldHVybiBmbG93SW5mbzsKKwl9CisJCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC5taXNzaW5nU3RhdGVtZW50IikpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRW1wdHlCbG9jaygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkSmF2YVN0YXRlbWVudCgpIHsKKwkJLy90aGUgdXNlIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhdm9pZCBpbiBtb3N0IGNhc2VzCisJCS8vYW5kIGlzIGhlcmUgbW9zdGx5IGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2UuLi4uLgorCQkvL3doaWxlIHRoZSBwYXJzZXIgaXMgcmVzcG9uc2FibGUgZm9yIGNyZWF0aW5nCisJCS8vd2VsbGVkIGZvcm1lZCBleHByZXNzaW9uIHN0YXRlbWVudCwgd2hpY2ggcmVzdWx0cworCQkvL2luIHRoZSBmYWN0IHRoYXQgamF2YS1ub24tc2VtYW50aWMtZXhwcmVzc2lvbi11c2VkLWFzLXN0YXRlbWVudAorCQkvL3Nob3VsZCBub3QgYmUgcGFyc2FibGUuLi50aHVzIG5vdCBiZWluZyBidWlsdC4KKwkJLy9JdCBzb3VuZHMgbGlrZSB0aGUgamF2YSBncmFtbWFyIGFzIGhlbHAgdGhlIGNvbXBpbGVyIGpvYiBpbiByZW1vdmluZworCQkvLy1ieSBjb25zdHJ1Y3Rpb24tIHNvbWUgc3RhdGVtZW50IHRoYXQgd291bGQgaGF2ZSBubyBlZmZlY3QuLi4uCisJCS8vKGZvciBleGFtcGxlIGFsbCBleHByZXNzaW9uIHRoYXQgbWF5IGRvIHNpZGUtZWZmZWN0cyBhcmUgdmFsaWQgc3RhdGVtZW50CisJCS8vIC10aGlzIGlzIGFuIGFwcHJvbWF0aXZlIGlkZWEuLi4uLi0pCisKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwkKKwlwdWJsaWMgQ29uc3RhbnQgcmVzb2x2ZUNhc2UoCisJCUJsb2NrU2NvcGUgc2NvcGUsCisJCVR5cGVCaW5kaW5nIHRlc3RUeXBlLAorCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CisJCS8vIHN0YXRlbWVudCB3aXRoaW4gYSBzd2l0Y2ggdGhhdCBhcmUgbm90IGNhc2UgYXJlIHRyZWF0ZWQgYXMgbm9ybWFsIHN0YXRlbWVudC4uLi4gCisKKwkJcmVzb2x2ZShzY29wZSk7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7CisJfQorCQorCS8qKgorCSAqIElOVEVSTkFMIFVTRSBPTkxZLgorCSAqIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4gVGhpcyBpcyB1c2VkIHRvIHJlZGlyZWN0IGludGVyLXN0YXRlbWVudHMganVtcHMuCisJICovCisJcHVibGljIHZvaWQgYnJhbmNoQ2hhaW5UbyhMYWJlbCBsYWJlbCkgeworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MzhjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0cmluZ0xpdGVyYWwuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCitwdWJsaWMgY2xhc3MgU3RyaW5nTGl0ZXJhbCBleHRlbmRzIExpdGVyYWwgeworCWNoYXJbXSBzb3VyY2U7CisKK3B1YmxpYyBTdHJpbmdMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7CisJdGhpcyhzLGUpOworCXNvdXJjZSA9IHRva2VuOworfQorcHVibGljIFN0cmluZ0xpdGVyYWwoaW50IHMsIGludCBlKSB7CisJc3VwZXIocyxlKTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKworCWNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKFN0cmluZy52YWx1ZU9mKHNvdXJjZSkpO30KK3B1YmxpYyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXh0ZW5kV2l0aChDaGFyTGl0ZXJhbCBsaXQpeworCS8vYWRkIHRoZSBsaXQgc291cmNlIHRvIG1pbmUsIGp1c3QgYXMgaWYgaXQgd2FzIG1pbmUKKworCXJldHVybiBuZXcgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsKHRoaXMsbGl0KTsKK30KK3B1YmxpYyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXh0ZW5kV2l0aChTdHJpbmdMaXRlcmFsIGxpdCl7CisJLy9hZGQgdGhlIGxpdCBzb3VyY2UgdG8gbWluZSwganVzdCBhcyBpZiBpdCB3YXMgbWluZQorCisJcmV0dXJuIG5ldyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwodGhpcyxsaXQpOworfQorLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHN0cmluZyBsaXRlcmFsCisgKgorICogQHBhcmFtIGN1cnJlbnRTY29wZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKyAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKyAqLyAKK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKQorCQljb2RlU3RyZWFtLmxkYyhjb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwlyZXR1cm4gc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKTsKK30KKy8qKgorICogc291cmNlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKKwlyZXR1cm4gc291cmNlOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisKKwkvLyBoYW5kbGUgc29tZSBzcGVjaWFsIGNoYXIuLi4uLgorCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJcIiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKKwkJc3dpdGNoIChzb3VyY2VbaV0pIHsKKwkJCWNhc2UgJ1xiJyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1x0JyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xuJyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xmJyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xyJyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wiJyA6CisJCQkJcmVzdWx0LmFwcGVuZCgiXFxcIiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcJycgOgorCQkJCXJlc3VsdC5hcHBlbmQoIlxcJyIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcXCcgOiAvL3Rha2UgY2FyZSBub3QgdG8gZGlzcGxheSB0aGUgZXNjYXBlIGFzIGEgcG90ZW50aWFsIHJlYWwgY2hhcgorCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJcmVzdWx0LmFwcGVuZChzb3VyY2VbaV0pOworCQl9CisJfQorCXJlc3VsdC5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1MDlkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBTdXBlclJlZmVyZW5jZSBleHRlbmRzIFRoaXNSZWZlcmVuY2UgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3VwZXJSZWZlcmVuY2UgU3VwZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UoKTsKKwkKKy8qKgorICogU3VwZXJSZWZlcmVuY2UgY29uc3RydWN0b3IgY29tbWVudC4KKyAqLworcHVibGljIFN1cGVyUmVmZXJlbmNlKCkgeworCXN1cGVyKCk7Cit9CitwdWJsaWMgU3VwZXJSZWZlcmVuY2UoaW50IHBvcywgaW50IHNvdXJjZUVuZCkgeworCXN1cGVyKCk7CisJc291cmNlU3RhcnQgPSBwb3M7CisJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7Cit9CitwdWJsaWMgc3RhdGljIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKSB7CisJcmV0dXJuIG5ldyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKTsKK30KK3B1YmxpYyBib29sZWFuIGlzU3VwZXIoKSB7CisJCisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7CisJCisJcmV0dXJuIGZhbHNlIDsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJaWYgKCFjaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKSkKKwkJcmV0dXJuIG51bGw7CisJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVGIgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZW5jbG9zaW5nVGIpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdCh0aGlzKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCXJldHVybiBlbmNsb3NpbmdUYi5zdXBlcmNsYXNzOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKKworCXJldHVybiAic3VwZXIiOyAvLyROT04tTkxTLTEkCisJCit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N3aXRjaFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Td2l0Y2hTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTgzMmNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Td2l0Y2hTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCXB1YmxpYyBFeHByZXNzaW9uIHRlc3RFeHByZXNzaW9uOworCXB1YmxpYyBTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzOworCXB1YmxpYyBCbG9ja1Njb3BlIHNjb3BlOworCXB1YmxpYyBpbnQgZXhwbGljaXREZWNsYXJhdGlvbnM7CisJcHVibGljIExhYmVsIGJyZWFrTGFiZWw7CisJcHVibGljIENhc2VbXSBjYXNlczsKKwlwdWJsaWMgRGVmYXVsdENhc2UgZGVmYXVsdENhc2U7CisJcHVibGljIGludCBjYXNlQ291bnQgPSAwOworCisJLy8gZm9yIGxvY2FsIHZhcmlhYmxlcyB0YWJsZSBhdHRyaWJ1dGVzCisJaW50IHByZVN3aXRjaEluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7CisJLyoqCisJICogU3dpdGNoU3RhdGVtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFN3aXRjaFN0YXRlbWVudCgpIHsKKwkJc3VwZXIoKTsKKwl9CisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCWZsb3dJbmZvID0gdGVzdEV4cHJlc3Npb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQlTd2l0Y2hGbG93Q29udGV4dCBzd2l0Y2hDb250ZXh0ID0KKwkJCW5ldyBTd2l0Y2hGbG93Q29udGV4dChmbG93Q29udGV4dCwgdGhpcywgKGJyZWFrTGFiZWwgPSBuZXcgTGFiZWwoKSkpOworCisJCS8vIGFuYWx5c2UgdGhlIGJsb2NrIGJ5IGNvbnNpZGVyaW5nIHNwZWNpYWxseSB0aGUgY2FzZS9kZWZhdWx0IHN0YXRlbWVudHMgKG5lZWQgdG8gYmluZCB0aGVtIAorCQkvLyB0byB0aGUgZW50cnkgcG9pbnQpCisJCUZsb3dJbmZvIGNhc2VJbml0cyA9IEZsb3dJbmZvLkRlYWRFbmQ7CisJCS8vIGluIGNhc2Ugb2Ygc3RhdGVtZW50cyBiZWZvcmUgdGhlIGZpcnN0IGNhc2UKKwkJcHJlU3dpdGNoSW5pdFN0YXRlSW5kZXggPQorCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOworCQlpbnQgY2FzZUluZGV4ID0gMDsKKwkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKKwkJCQlpZiAoKGNhc2VJbmRleCA8IGNhc2VDb3VudCkKKwkJCQkJJiYgKHN0YXRlbWVudCA9PSBjYXNlc1tjYXNlSW5kZXhdKSkgeyAvLyBzdGF0ZW1lbnRzW2ldIGlzIGEgY2FzZSBvciBhIGRlZmF1bHQgY2FzZQorCQkJCQljYXNlSW5kZXgrKzsKKwkJCQkJY2FzZUluaXRzID0gY2FzZUluaXRzLm1lcmdlZFdpdGgoZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdGVtZW50ID09IGRlZmF1bHRDYXNlKSB7CisJCQkJCQljYXNlSW5pdHMgPSBjYXNlSW5pdHMubWVyZ2VkV2l0aChmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghY2FzZUluaXRzLmNvbXBsYWluSWZVbnJlYWNoYWJsZShzdGF0ZW1lbnQsIHNjb3BlKSkgeworCQkJCQljYXNlSW5pdHMgPSBzdGF0ZW1lbnQuYW5hbHlzZUNvZGUoc2NvcGUsIHN3aXRjaENvbnRleHQsIGNhc2VJbml0cyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gaWYgbm8gZGVmYXVsdCBjYXNlLCB0aGVuIHJlY29yZCBpdCBtYXkganVtcCBvdmVyIHRoZSBibG9jayBkaXJlY3RseSB0byB0aGUgZW5kCisJCWlmIChkZWZhdWx0Q2FzZSA9PSBudWxsKSB7CisJCQkvLyBvbmx5IHJldGFpbiB0aGUgcG90ZW50aWFsIGluaXRpYWxpemF0aW9ucworCQkJZmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSgKKwkJCQljYXNlSW5pdHMubWVyZ2VkV2l0aChzd2l0Y2hDb250ZXh0LmluaXRzT25CcmVhaykpOworCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKKwkJCXJldHVybiBmbG93SW5mbzsKKwkJfQorCisJCS8vIG1lcmdlIGFsbCBicmFuY2hlcyBpbml0cworCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gY2FzZUluaXRzLm1lcmdlZFdpdGgoc3dpdGNoQ29udGV4dC5pbml0c09uQnJlYWspOworCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJcmV0dXJuIG1lcmdlZEluZm87CisJfQorCS8qKgorCSAqIFN3aXRjaCBjb2RlIGdlbmVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJCWludFtdIHNvcnRlZEluZGV4ZXMgPSBuZXcgaW50W2Nhc2VDb3VudF07CisJCWludFtdIGxvY2FsS2V5c0NvcHk7CisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisKKwkJLy8gcHJlcGFyZSB0aGUgbGFiZWxzIGFuZCBjb25zdGFudHMKKwkJYnJlYWtMYWJlbC5jb2RlU3RyZWFtID0gY29kZVN0cmVhbTsKKwkJQ2FzZUxhYmVsW10gY2FzZUxhYmVscyA9IG5ldyBDYXNlTGFiZWxbY2FzZUNvdW50XTsKKwkJaW50W10gY29uc3RhbnRzID0gbmV3IGludFtjYXNlQ291bnRdOworCQlib29sZWFuIG5lZWRTd2l0Y2ggPSBjYXNlQ291bnQgIT0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlQ291bnQ7IGkrKykgeworCQkJY29uc3RhbnRzW2ldID0gY2FzZXNbaV0uY29uc3RhbnRFeHByZXNzaW9uLmNvbnN0YW50LmludFZhbHVlKCk7CisJCQljYXNlc1tpXS50YXJnZXRMYWJlbCA9IChjYXNlTGFiZWxzW2ldID0gbmV3IENhc2VMYWJlbChjb2RlU3RyZWFtKSk7CisJCX0KKworCQkvLyB3ZSBzb3J0IHRoZSBrZXlzIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRhYmxlc3dpdGNoIG9yIGxvb2t1cHN3aXRjaAorCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VDb3VudDsgaSsrKSB7CisJCQlzb3J0ZWRJbmRleGVzW2ldID0gaTsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJY29uc3RhbnRzLAorCQkJMCwKKwkJCShsb2NhbEtleXNDb3B5ID0gbmV3IGludFtjYXNlQ291bnRdKSwKKwkJCTAsCisJCQljYXNlQ291bnQpOworCQlDb2RlU3RyZWFtLnNvcnQobG9jYWxLZXlzQ29weSwgMCwgY2FzZUNvdW50IC0gMSwgc29ydGVkSW5kZXhlcyk7CisJCUNhc2VMYWJlbCBkZWZhdWx0TGFiZWwgPSBuZXcgQ2FzZUxhYmVsKGNvZGVTdHJlYW0pOworCQlpZiAoZGVmYXVsdENhc2UgIT0gbnVsbCkgeworCQkJZGVmYXVsdENhc2UudGFyZ2V0TGFiZWwgPSBkZWZhdWx0TGFiZWw7CisJCX0KKwkJLy8gZ2VuZXJhdGUgZXhwcmVzc2lvbiB0ZXN0ZXMKKwkJdGVzdEV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbmVlZFN3aXRjaCk7CisKKwkJLy8gZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHN3aXRjaCB0YWJsZQorCQlpZiAobmVlZFN3aXRjaCkgeworCQkJaW50IG1heCA9IGxvY2FsS2V5c0NvcHlbY2FzZUNvdW50IC0gMV07CisJCQlpbnQgbWluID0gbG9jYWxLZXlzQ29weVswXTsKKwkJCWlmICgobG9uZykgKGNhc2VDb3VudCAqIDIuNSkgPiAoKGxvbmcpIG1heCAtIChsb25nKSBtaW4pKSB7CisJCQkJY29kZVN0cmVhbS50YWJsZXN3aXRjaCgKKwkJCQkJZGVmYXVsdExhYmVsLAorCQkJCQltaW4sCisJCQkJCW1heCwKKwkJCQkJY29uc3RhbnRzLAorCQkJCQlzb3J0ZWRJbmRleGVzLAorCQkJCQljYXNlTGFiZWxzKTsKKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5sb29rdXBzd2l0Y2goZGVmYXVsdExhYmVsLCBjb25zdGFudHMsIHNvcnRlZEluZGV4ZXMsIGNhc2VMYWJlbHMpOworCQkJfQorCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJfQorCQkvLyBnZW5lcmF0ZSB0aGUgc3dpdGNoIGJsb2NrIHN0YXRlbWVudHMKKwkJaW50IGNhc2VJbmRleCA9IDA7CisJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXhDYXNlcyA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4Q2FzZXM7IGkrKykgeworCQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzW2ldOworCQkJCWlmICgoY2FzZUluZGV4IDwgY2FzZUNvdW50KQorCQkJCQkmJiAoc3RhdGVtZW50ID09IGNhc2VzW2Nhc2VJbmRleF0pKSB7IC8vIHN0YXRlbWVudHNbaV0gaXMgYSBjYXNlCisJCQkJCWlmIChwcmVTd2l0Y2hJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJCXByZVN3aXRjaEluaXRTdGF0ZUluZGV4KTsKKwkJCQkJCWNhc2VJbmRleCsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHN0YXRlbWVudCA9PSBkZWZhdWx0Q2FzZSkgeyAvLyBzdGF0ZW1lbnRzW2ldIGlzIGEgY2FzZSBvciBhIGRlZmF1bHQgY2FzZQorCQkJCQkJaWYgKHByZVN3aXRjaEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQkJcHJlU3dpdGNoSW5pdFN0YXRlSW5kZXgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXN0YXRlbWVudC5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQkJfQorCQl9CisJCS8vIHBsYWNlIHRoZSB0cmFpbGluZyBsYWJlbHMgKGZvciBicmVhayBhbmQgZGVmYXVsdCBjYXNlKQorCQlicmVha0xhYmVsLnBsYWNlKCk7CisJCWlmIChkZWZhdWx0Q2FzZSA9PSBudWxsKSB7CisJCQlkZWZhdWx0TGFiZWwucGxhY2UoKTsKKwkJfQorCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKwkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKKwkJCQljdXJyZW50U2NvcGUsCisJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBtZXJnZWRJbml0U3RhdGVJbmRleCk7CisJCX0KKwkJaWYgKHNjb3BlICE9IGN1cnJlbnRTY29wZSkgeworCQkJY29kZVN0cmVhbS5leGl0VXNlclNjb3BlKHNjb3BlKTsKKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCisJcHVibGljIHZvaWQgcmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCkgeworCisJCXRoaXMuYnJlYWtMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgdXBwZXJTY29wZSkgeworCisJCVR5cGVCaW5kaW5nIHRlc3RUeXBlID0gdGVzdEV4cHJlc3Npb24ucmVzb2x2ZVR5cGUodXBwZXJTY29wZSk7CisJCWlmICh0ZXN0VHlwZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQl0ZXN0RXhwcmVzc2lvbi5pbXBsaWNpdFdpZGVuaW5nKHRlc3RUeXBlLCB0ZXN0VHlwZSk7CisJCWlmICghKHRlc3RFeHByZXNzaW9uCisJCQkuaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSh0ZXN0VHlwZSwgSW50QmluZGluZykpKSB7CisJCQlpZiAoIXVwcGVyU2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKHRlc3RUeXBlLCBJbnRCaW5kaW5nKSkgeworCQkJCXVwcGVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0U3dpdGNoVHlwZSh0ZXN0RXhwcmVzc2lvbiwgdGVzdFR5cGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQlzY29wZSA9IGV4cGxpY2l0RGVjbGFyYXRpb25zID09IDAgPyB1cHBlclNjb3BlIDogbmV3IEJsb2NrU2NvcGUodXBwZXJTY29wZSk7CisJCQlpbnQgbGVuZ3RoOworCQkJLy8gY29sbGVjdGlvbiBvZiBjYXNlcyBpcyB0b28gYmlnIGJ1dCB3ZSB3aWxsIG9ubHkgaXRlcmF0ZSB1bnRpbCBjYXNlQ291bnQKKwkJCWNhc2VzID0gbmV3IENhc2VbbGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGhdOworCQkJaW50W10gY2FzZXNWYWx1ZXMgPSBuZXcgaW50W2xlbmd0aF07CisJCQlpbnQgY291bnRlciA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJQ29uc3RhbnQgY3N0OworCQkJCWlmICgoY3N0ID0gc3RhdGVtZW50c1tpXS5yZXNvbHZlQ2FzZShzY29wZSwgdGVzdFR5cGUsIHRoaXMpKSAhPSBudWxsKSB7CisJCQkJCS8vLS0tLWNoZWNrIGZvciBkdXBsaWNhdGUgY2FzZSBzdGF0ZW1lbnQtLS0tLS0tLS0tLS0KKwkJCQkJaWYgKGNzdCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJCWludCBrZXkgPSBjc3QuaW50VmFsdWUoKTsKKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY291bnRlcjsgaisrKSB7CisJCQkJCQkJaWYgKGNhc2VzVmFsdWVzW2pdID09IGtleSkgeworCQkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVDYXNlKChDYXNlKSBzdGF0ZW1lbnRzW2ldLCBjc3QpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWNhc2VzVmFsdWVzW2NvdW50ZXIrK10gPSBrZXk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIGluRnJvbnQsIHMgPSB0YWJTdHJpbmcodGFiKTsKKwkJaW5Gcm9udCA9IHM7CisJCXMgPSBzICsgInN3aXRjaCAoIiArIHRlc3RFeHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIikgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWlmIChzdGF0ZW1lbnRzID09IG51bGwpIHsKKwkJCXMgPSBzICsgInt9IjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHM7CisJCX0gZWxzZQorCQkJcyA9IHMgKyAieyI7IC8vJE5PTi1OTFMtMSQKKwkJCXMgPSBzCisJCQkJCSsgKGV4cGxpY2l0RGVjbGFyYXRpb25zICE9IDAKKwkJCQkJCT8gIi8vIC0tLXNjb3BlIG5lZWRlZCBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJKyBTdHJpbmcudmFsdWVPZihleHBsaWNpdERlY2xhcmF0aW9ucykKKwkJCQkJCQkrICIgbG9jYWxzLS0tLS0tLS0tLS0tIFxuIi8vJE5PTi1OTFMtMSQKKwkJCQkJCTogIi8vIC0tLU5PIHNjb3BlIG5lZWRlZC0tLS0tLSBcbiIpOyAvLyROT04tTkxTLTEkCisKKwkJaW50IGkgPSAwOworCQlTdHJpbmcgdGFidWxhdGlvbiA9ICIgICI7IC8vJE5PTi1OTFMtMSQKKwkJdHJ5IHsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJLy91c2UgaW5zdGFuY2VvZiBpbiBvcmRlciBub3QgdG8gcG9sbHVhdGUgY2xhc3NlcyB3aXRoIGJlaGF2aW9yIG9ubHkgbmVlZGVkIGZvciBwcmludGluZyBwdXJwb3NlLgorCQkJCWlmIChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgRXhwcmVzc2lvbikKKwkJCQkJcyA9IHMgKyAiXG4iICsgaW5Gcm9udCArIHRhYnVsYXRpb247IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIEJyZWFrKQorCQkJCQlzID0gcyArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcoMCk7CisJCQkJZWxzZQorCQkJCQlzID0gcyArICJcbiIgKyBzdGF0ZW1lbnRzW2ldLnRvU3RyaW5nKHRhYiArIDIpOyAvLyROT04tTkxTLTEkCisJCQkJLy89PT09PT09PT09PT09CQorCQkJCWlmICgoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIENhc2UpCisJCQkJCXx8IChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgRGVmYXVsdENhc2UpKSB7CisJCQkJCWkrKzsKKwkJCQkJd2hpbGUgKCEoKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBDYXNlKQorCQkJCQkJfHwgKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBEZWZhdWx0Q2FzZSkpKSB7CisJCQkJCQlpZiAoKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB8fCAoc3RhdGVtZW50c1tpXSBpbnN0YW5jZW9mIEJyZWFrKSkKKwkJCQkJCQlzID0gcyArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcoMCkgKyAiIDsgIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZWxzZQorCQkJCQkJCXMgPSBzICsgIlxuIiArIHN0YXRlbWVudHNbaV0udG9TdHJpbmcodGFiICsgNikgKyAiIDsgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzID0gcyArICIgOyI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCX07CisJCXMgPSBzICsgIn0iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJdGVzdEV4cHJlc3Npb24udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJCWludCBzdGF0ZW1lbnRzTGVuZ3RoID0gc3RhdGVtZW50cy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzTGVuZ3RoOyBpKyspCisJCQkJCXN0YXRlbWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorCQorCS8qKgorCSAqIERpc3BhdGNoIHRoZSBjYWxsIG9uIGl0cyBsYXN0IHN0YXRlbWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBicmFuY2hDaGFpblRvKExhYmVsIGxhYmVsKSB7CisJCQorCQkvLyBpbiBvcmRlciB0byBpbXByb3ZlIGRlYnVnIGF0dHJpYnV0ZXMgZm9yIHN0ZXBwaW5nICgxMTQzMSkKKwkJLy8gd2Ugd2FudCB0byBpbmxpbmUgdGhlIGp1bXBzIHRvICNicmVha0xhYmVsIHdoaWNoIGFscmVhZHkgZ290CisJCS8vIGdlbmVyYXRlZCAoaWYgYW55KSwgYW5kIGhhdmUgdGhlbSBkaXJlY3RseSBicmFuY2ggdG8gYSBiZXR0ZXIKKwkJLy8gbG9jYXRpb24gKHRoZSBhcmd1bWVudCBsYWJlbCkuCisJCS8vIHdlIGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBicmVha0xhYmVsIGFscmVhZHkgZ290IHBsYWNlZAorCQlpZiAodGhpcy5icmVha0xhYmVsLmhhc0ZvcndhcmRSZWZlcmVuY2VzKCkpIHsKKwkJCWxhYmVsLmFwcGVuZEZvcndhcmRSZWZlcmVuY2VzRnJvbSh0aGlzLmJyZWFrTGFiZWwpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzcwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHVibGljIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKwlwdWJsaWMgQmxvY2sgYmxvY2s7CisJcHVibGljIEJsb2NrU2NvcGUgc2NvcGU7CisKKwlib29sZWFuIGJsb2NrRXhpdDsKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgc3luY2hyb1ZhcmlhYmxlOworCXN0YXRpYyBmaW5hbCBjaGFyW10gU2VjcmV0TG9jYWxEZWNsYXJhdGlvbk5hbWUgPSAiIHN5bmNWYWx1ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIFN5bmNocm9uaXplZFN0YXRlbWVudCgKKwkJRXhwcmVzc2lvbiBleHByZXNzaW9uLAorCQlCbG9jayBzdGF0ZW1lbnQsCisJCWludCBzLAorCQlpbnQgZSkgeworCisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJCXRoaXMuYmxvY2sgPSBzdGF0ZW1lbnQ7CisJCXNvdXJjZUVuZCA9IGU7CisJCXNvdXJjZVN0YXJ0ID0gczsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBtYXJrIHRoZSBzeW50aGV0aWMgdmFyaWFibGUgYXMgYmVpbmcgdXNlZAorCQlzeW5jaHJvVmFyaWFibGUudXNlZCA9IHRydWU7CisKKwkJLy8gc2ltcGxlIHByb3BhZ2F0aW9uIHRvIHN1Ym5vZGVzCisJCWZsb3dJbmZvID0KKwkJCWJsb2NrLmFuYWx5c2VDb2RlKAorCQkJCXNjb3BlLAorCQkJCW5ldyBJbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIHRoaXMpLAorCQkJCWV4cHJlc3Npb24uYW5hbHlzZUNvZGUoc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykpOworCisJCS8vIG9wdGltaXppbmcgY29kZSBnZW4KKwkJaWYgKChmbG93SW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkgeworCQkJYmxvY2tFeGl0ID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmxvd0luZm87CisJfQorCisJLyoqCisJICogU3luY2hyb25pemVkIHN0YXRlbWVudCBjb2RlIGdlbmVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKworCQkvLyBnZW5lcmF0ZSB0aGUgc3luY2hyb25pemF0aW9uIGV4cHJlc3Npb24KKwkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlpZiAoYmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKKwkJCWlmICgoc3luY2hyb1ZhcmlhYmxlLnR5cGUgPT0gTG9uZ0JpbmRpbmcpCisJCQkJfHwgKHN5bmNocm9WYXJpYWJsZS50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQl9CisJCQkvLyBvbmx5IHRha2UgdGhlIGxvY2sKKwkJCWNvZGVTdHJlYW0ubW9uaXRvcmVudGVyKCk7CisJCQljb2RlU3RyZWFtLm1vbml0b3JleGl0KCk7CisJCX0gZWxzZSB7CisJCQkvLyBlbnRlciB0aGUgbW9uaXRvcgorCQkJY29kZVN0cmVhbS5zdG9yZShzeW5jaHJvVmFyaWFibGUsIHRydWUpOworCQkJY29kZVN0cmVhbS5tb25pdG9yZW50ZXIoKTsKKworCQkJLy8gZ2VuZXJhdGUgIHRoZSBib2R5IG9mIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2sKKwkJCUV4Y2VwdGlvbkxhYmVsIGFueUV4Y2VwdGlvbkhhbmRsZXIgPSBuZXcgRXhjZXB0aW9uTGFiZWwoY29kZVN0cmVhbSwgbnVsbCk7CisJCQkvLydudWxsJyBkZW5vdGVzIGFueSBraW5kIG9mIGV4Y2VwdGlvbgorCQkJYmxvY2suZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCUxhYmVsIGVuZExhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pOworCQkJaWYgKCFibG9ja0V4aXQpIHsKKwkJCQljb2RlU3RyZWFtLmxvYWQoc3luY2hyb1ZhcmlhYmxlKTsKKwkJCQljb2RlU3RyZWFtLm1vbml0b3JleGl0KCk7CisJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCk7CisJCQl9CisJCQkvLyBnZW5lcmF0ZSB0aGUgYm9keSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKKwkJCWFueUV4Y2VwdGlvbkhhbmRsZXIucGxhY2VFbmQoKTsKKwkJCWFueUV4Y2VwdGlvbkhhbmRsZXIucGxhY2UoKTsKKwkJCWNvZGVTdHJlYW0uaW5jclN0YWNrU2l6ZSgxKTsKKwkJCWNvZGVTdHJlYW0ubG9hZChzeW5jaHJvVmFyaWFibGUpOworCQkJY29kZVN0cmVhbS5tb25pdG9yZXhpdCgpOworCQkJY29kZVN0cmVhbS5hdGhyb3coKTsKKwkJCWlmICghYmxvY2tFeGl0KSB7CisJCQkJZW5kTGFiZWwucGxhY2UoKTsKKwkJCX0KKwkJfQorCQlpZiAoc2NvcGUgIT0gY3VycmVudFNjb3BlKSB7CisJCQljb2RlU3RyZWFtLmV4aXRVc2VyU2NvcGUoc2NvcGUpOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHVwcGVyU2NvcGUpIHsKKworCQkvLyBzcGVjaWFsIHNjb3BlIGZvciBzZWNyZXQgbG9jYWxzIG9wdGltaXphdGlvbi4KKwkJc2NvcGUgPSBuZXcgQmxvY2tTY29wZSh1cHBlclNjb3BlKTsKKwkJVHlwZUJpbmRpbmcgdHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAodHlwZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlzd2l0Y2ggKHR5cGUuaWQpIHsKKwkJCWNhc2UgKFRfYm9vbGVhbikgOgorCQkJY2FzZSAoVF9jaGFyKSA6CisJCQljYXNlIChUX2Zsb2F0KSA6CisJCQljYXNlIChUX2RvdWJsZSkgOgorCQkJY2FzZSAoVF9ieXRlKSA6CisJCQljYXNlIChUX3Nob3J0KSA6CisJCQljYXNlIChUX2ludCkgOgorCQkJY2FzZSAoVF9sb25nKSA6CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGVUb1N5bmNocm9uaXplKGV4cHJlc3Npb24sIHR5cGUpOworCQkJCWJyZWFrOworCQkJY2FzZSAoVF92b2lkKSA6CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFZvaWRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworCQkJCWJyZWFrOworCQkJY2FzZSAoVF9udWxsKSA6CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE51bGxUb1N5bmNocm9uaXplKGV4cHJlc3Npb24pOworCQkJCWJyZWFrOyAKKwkJfQorCQkvL2NvbnRpbnVlIGV2ZW4gb24gZXJyb3JzIGluIG9yZGVyIHRvIGhhdmUgdGhlIFRDIGRvbmUgaW50byB0aGUgc3RhdGVtZW50cworCQlzeW5jaHJvVmFyaWFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoU2VjcmV0TG9jYWxEZWNsYXJhdGlvbk5hbWUsIHR5cGUsIEFjY0RlZmF1bHQsIGZhbHNlKTsKKwkJc2NvcGUuYWRkTG9jYWxWYXJpYWJsZShzeW5jaHJvVmFyaWFibGUpOworCQlzeW5jaHJvVmFyaWFibGUuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7IC8vIG5vdCBpbmxpbmFibGUKKwkJZXhwcmVzc2lvbi5pbXBsaWNpdFdpZGVuaW5nKHR5cGUsIHR5cGUpOworCQlibG9jay5yZXNvbHZlVXNpbmcoc2NvcGUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CisJCXMgPSBzICsgInN5bmNocm9uaXplZCAoIiArIGV4cHJlc3Npb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiKSI7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcyA9IHMgKyAiXG4iICsgYmxvY2sudG9TdHJpbmcodGFiICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoCisJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCisJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7CisJCQlleHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCWJsb2NrLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhpc1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODU4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RoaXNSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgVGhpc1JlZmVyZW5jZSBleHRlbmRzIFJlZmVyZW5jZSB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBUaGlzUmVmZXJlbmNlIFRoaXNJbXBsaWNpdCA9IG5ldyBUaGlzUmVmZXJlbmNlKCk7CisJCisvKioKKyAqIFRoaXNSZWZlcmVuY2UgY29uc3RydWN0b3IgY29tbWVudC4KKyAqLworcHVibGljIFRoaXNSZWZlcmVuY2UoKSB7CisJc3VwZXIoKTsKK30KK3B1YmxpYyBUaGlzUmVmZXJlbmNlKGludCBzLCBpbnQgc291cmNlRW5kKSB7CisJdGhpcygpOworCXRoaXMuc291cmNlU3RhcnQgPSBzIDsKKwl0aGlzLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKK30KK3Byb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXNzKE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKSB7CisJLy8gdGhpcy9zdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBjb25zdHJ1Y3RvciBjYWxsCisJaWYgKG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsKSB7CisJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKKwlpZiAobWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJbWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZXJyb3JUaGlzU3VwZXJJblN0YXRpYyh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmICh2YWx1ZVJlcXVpcmVkKQorCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIGJvb2xlYW4gaXNUaGlzKCkgeworCQorCXJldHVybiB0cnVlIDsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gaW1wbGljaXQgdGhpcworCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCWlmICh0aGlzICE9IFRoaXNJbXBsaWNpdCAmJiAhY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSkpCisJCXJldHVybiBudWxsOworCXJldHVybiBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCisJaWYgKHRoaXMgPT0gVGhpc0ltcGxpY2l0KSByZXR1cm4gIiIgOyAvLyROT04tTkxTLTEkCisJcmV0dXJuICJ0aGlzIjsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaHJvd1N0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaHJvd1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjgwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Rocm93U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIFRocm93U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwlwdWJsaWMgRXhwcmVzc2lvbiBleGNlcHRpb247CisJcHVibGljIFR5cGVCaW5kaW5nIGV4Y2VwdGlvblR5cGU7CisKKwlwdWJsaWMgVGhyb3dTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleGNlcHRpb24sIGludCBzdGFydFBvc2l0aW9uKSB7CisJCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworCQl0aGlzLnNvdXJjZVN0YXJ0ID0gc3RhcnRQb3NpdGlvbjsKKwkJdGhpcy5zb3VyY2VFbmQgPSBleGNlcHRpb24uc291cmNlRW5kOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJZXhjZXB0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJLy8gbmVlZCB0byBjaGVjayB0aGF0IGV4Y2VwdGlvbiB0aHJvd24gaXMgYWN0dWFsbHkgY2F1Z2h0IHNvbWV3aGVyZQorCQlmbG93Q29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKGV4Y2VwdGlvblR5cGUsIHRoaXMsIGZsb3dJbmZvLCBjdXJyZW50U2NvcGUpOworCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwl9CisKKwkvKioKKwkgKiBUaHJvdyBjb2RlIGdlbmVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisKKwkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKQorCQkJcmV0dXJuOworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlleGNlcHRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCWNvZGVTdHJlYW0uYXRocm93KCk7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQorCQlleGNlcHRpb25UeXBlID0gZXhjZXB0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpKTsKKwkJCisJCWlmIChleGNlcHRpb25UeXBlID09IE51bGxCaW5kaW5nCisJCQkJJiYgc2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA8PSBDb21waWxlck9wdGlvbnMuSkRLMV8zKXsKKwkJCS8vIGlmIGNvbXBsaWFudCB3aXRoIDEuNCwgdGhpcyBwcm9ibGVtIHdpbGwgbm90IGJlIHJlcG9ydGVkCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RUaHJvd051bGwodGhpcyk7CisJIAl9CisJCWV4Y2VwdGlvbi5pbXBsaWNpdFdpZGVuaW5nKGV4Y2VwdGlvblR5cGUsIGV4Y2VwdGlvblR5cGUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQlzID0gcyArICJ0aHJvdyAiOyAvLyROT04tTkxTLTEkCisJCXMgPSBzICsgZXhjZXB0aW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOworCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSkpCisJCQlleGNlcHRpb24udHJhdmVyc2UodmlzaXRvciwgYmxvY2tTY29wZSk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ1ZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ1ZUxpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODYzYWVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnVlTGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIFRydWVMaXRlcmFsIGV4dGVuZHMgTWFnaWNMaXRlcmFsIHsKKwlzdGF0aWMgZmluYWwgY2hhcltdIHNvdXJjZSA9IHsndCcgLCAncicgLCAndScgLCAnZSd9OworcHVibGljIFRydWVMaXRlcmFsKGludCBzICwgaW50IGUpIHsKKwlzdXBlcihzLGUpOworfQorcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgeworCisJY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUodHJ1ZSk7fQorLyoqCisgKiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSB0cnVlIGxpdGVyYWwKKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovIAorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKHZhbHVlUmVxdWlyZWQpCisJCWNvZGVTdHJlYW0uaWNvbnN0XzEoKTsKKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIExhYmVsIHRydWVMYWJlbCwgTGFiZWwgZmFsc2VMYWJlbCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkvLyB0cnVlTGFiZWwgYmVpbmcgbm90IG5pbCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGZhbGwgdGhyb3VnaCBpbnRvIHRoZSBUUlVFIGNhc2UKKworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJLy8gY29uc3RhbnQgPT0gdHJ1ZQorCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOworCQkJfQorCQl9CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCXJldHVybiBCb29sZWFuQmluZGluZzsKK30KKy8qKgorICogCisgKi8KK3B1YmxpYyBjaGFyW10gc291cmNlKCkgeworCXJldHVybiBzb3VyY2U7Cit9CitwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RyeVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU4ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDUyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgVHJ5U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwlwdWJsaWMgQmxvY2sgdHJ5QmxvY2s7CisJcHVibGljIEJsb2NrW10gY2F0Y2hCbG9ja3M7CisJcHVibGljIEFyZ3VtZW50W10gY2F0Y2hBcmd1bWVudHM7CisJcHVibGljIEJsb2NrIGZpbmFsbHlCbG9jazsKKwlCbG9ja1Njb3BlIHNjb3BlOworCisJcHVibGljIGJvb2xlYW4gc3ViUm91dGluZUNhbm5vdFJldHVybiA9IHRydWU7CisJLy8gc2hvdWxkIHJlbmFtZSBpbnRvIHN1YlJvdXRpbmVDb21wbGV0ZSB0byBiZSBzZXQgdG8gZmFsc2UgYnkgZGVmYXVsdAorCisJUmVmZXJlbmNlQmluZGluZ1tdIGNhdWdodEV4Y2VwdGlvblR5cGVzOworCWJvb2xlYW4gdHJ5QmxvY2tFeGl0OworCWJvb2xlYW5bXSBjYXRjaEV4aXRzOworCXB1YmxpYyBpbnRbXSBwcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXI7CisKKwlMYWJlbCBzdWJSb3V0aW5lU3RhcnRMYWJlbDsKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgYW55RXhjZXB0aW9uVmFyaWFibGUsCisJCXJldHVybkFkZHJlc3NWYXJpYWJsZSwKKwkJc2VjcmV0UmV0dXJuVmFsdWU7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTZWNyZXRSZXR1cm5OYW1lID0gIiByZXR1cm5BZGRyZXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU2VjcmV0QW55SGFuZGxlck5hbWUgPSAiIGFueUV4Y2VwdGlvbkhhbmRsZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTZWNyZXRMb2NhbERlY2xhcmF0aW9uTmFtZSA9ICIgcmV0dXJuVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCS8vIGZvciBsb2NhbCB2YXJpYWJsZXMgdGFibGUgYXR0cmlidXRlcworCWludCBwcmVUcnlJbml0U3RhdGVJbmRleCA9IC0xOworCWludCBtZXJnZWRJbml0U3RhdGVJbmRleCA9IC0xOworCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJLy8gQ29uc2lkZXIgdGhlIHRyeSBibG9jayBhbmQgY2F0Y2ggYmxvY2sgc28gYXMgdG8gY29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIGluaXRpYWxpemF0aW9ucyBhbmQJCisJCS8vIHRoZSBtaW5pbXVtIGV4aXQgcmVsYXRpdmUgZGVwdGggYW1vbmdzdCBhbGwgb2YgdGhlbS4gVGhlbiBjb25zaWRlciB0aGUgc3Vicm91dGluZSwgYW5kIGFwcGVuZCBpdHMKKwkJLy8gaW5pdGlhbGl6YXRpb24gdG8gdGhlIHRyeS9jYXRjaCBvbmVzLCBpZiB0aGUgc3Vicm91dGluZSBjb21wbGV0ZXMgbm9ybWFsbHkuIElmIHRoZSBzdWJyb3V0aW5lIGRvZXMgbm90CisJCS8vIGNvbXBsZXRlLCB0aGVuIG9ubHkga2VlcCB0aGlzIHJlc3VsdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGFuYWx5c2lzCisKKwkJLy8gcHJvY2VzcyB0aGUgZmluYWxseSBibG9jayAoc3Vicm91dGluZSkgLSBjcmVhdGUgYSBjb250ZXh0IGZvciB0aGUgc3Vicm91dGluZQorCisJCXByZVRyeUluaXRTdGF0ZUluZGV4ID0KKwkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKKworCQlpZiAoYW55RXhjZXB0aW9uVmFyaWFibGUgIT0gbnVsbCkgeworCQkJYW55RXhjZXB0aW9uVmFyaWFibGUudXNlZCA9IHRydWU7CisJCX0KKwkJaWYgKHJldHVybkFkZHJlc3NWYXJpYWJsZSAhPSBudWxsKSB7CisJCQlyZXR1cm5BZGRyZXNzVmFyaWFibGUudXNlZCA9IHRydWU7CisJCX0KKwkJSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0IGluc2lkZVN1YkNvbnRleHQ7CisJCUZpbmFsbHlGbG93Q29udGV4dCBmaW5hbGx5Q29udGV4dDsKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIHN1YkluZm87CisJCWlmIChzdWJSb3V0aW5lU3RhcnRMYWJlbCA9PSBudWxsKSB7CisJCQkvLyBubyBmaW5hbGx5IGJsb2NrCisJCQlpbnNpZGVTdWJDb250ZXh0ID0gbnVsbDsKKwkJCWZpbmFsbHlDb250ZXh0ID0gbnVsbDsKKwkJCXN1YkluZm8gPSBudWxsOworCQl9IGVsc2UgeworCQkJLy8gYW5hbHlzZSBmaW5hbGx5IGJsb2NrIGZpcnN0CisJCQlpbnNpZGVTdWJDb250ZXh0ID0gbmV3IEluc2lkZVN1YlJvdXRpbmVGbG93Q29udGV4dChmbG93Q29udGV4dCwgdGhpcyk7CisJCQlzdWJJbmZvID0KKwkJCQlmaW5hbGx5QmxvY2sKKwkJCQkJLmFuYWx5c2VDb2RlKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJZmluYWxseUNvbnRleHQgPSBuZXcgRmluYWxseUZsb3dDb250ZXh0KGZsb3dDb250ZXh0LCBmaW5hbGx5QmxvY2spLAorCQkJCQkJZmxvd0luZm8uY29weSgpKQorCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlpZiAoISgoc3ViSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBzdWJJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKSkgeworCQkJCXN1YlJvdXRpbmVDYW5ub3RSZXR1cm4gPSBmYWxzZTsKKwkJCX0KKwkJfQorCQkvLyBwcm9jZXNzIHRoZSB0cnkgYmxvY2sgaW4gYSBjb250ZXh0IGhhbmRsaW5nIHRoZSBsb2NhbCBleGNlcHRpb25zLgorCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGhhbmRsaW5nQ29udGV4dCA9CisJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKKwkJCQlpbnNpZGVTdWJDb250ZXh0ID09IG51bGwgPyBmbG93Q29udGV4dCA6IGluc2lkZVN1YkNvbnRleHQsCisJCQkJdHJ5QmxvY2ssCisJCQkJY2F1Z2h0RXhjZXB0aW9uVHlwZXMsCisJCQkJc2NvcGUsCisJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworCisJCUZsb3dJbmZvIHRyeUluZm87CisJCWlmICh0cnlCbG9jay5zdGF0ZW1lbnRzID09IG51bGwpIHsKKwkJCXRyeUluZm8gPSBmbG93SW5mbzsKKwkJCXRyeUJsb2NrRXhpdCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJdHJ5SW5mbyA9IHRyeUJsb2NrLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgaGFuZGxpbmdDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOworCQkJdHJ5QmxvY2tFeGl0ID0gKHRyeUluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgdHJ5SW5mby5pc0Zha2VSZWFjaGFibGUoKTsKKwkJfQorCisJCS8vIGNoZWNrIHVucmVhY2hhYmxlIGNhdGNoIGJsb2NrcworCQloYW5kbGluZ0NvbnRleHQuY29tcGxhaW5JZlVudXNlZEV4Y2VwdGlvbkhhbmRsZXJzKGNhdGNoQmxvY2tzLCBzY29wZSwgdGhpcyk7CisKKwkJLy8gcHJvY2VzcyB0aGUgY2F0Y2ggYmxvY2tzIC0gY29tcHV0aW5nIHRoZSBtaW5pbWFsIGV4aXQgZGVwdGggYW1vbmdzdCB0cnkvY2F0Y2gKKwkJaWYgKGNhdGNoQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBjYXRjaENvdW50OworCQkJY2F0Y2hFeGl0cyA9IG5ldyBib29sZWFuW2NhdGNoQ291bnQgPSBjYXRjaEJsb2Nrcy5sZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRjaENvdW50OyBpKyspIHsKKwkJCQkvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbml0cyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGhhdmUgbGVkIHRvIHRoaXMgZXhjZXB0aW9uIGhhbmRsZXIgKGZvciBmaW5hbCBhc3NpZ25tZW50cyBkaWFnbm9zaXMpCisJCQkJLy8vKgorCQkJCUZsb3dJbmZvIGNhdGNoSW5mbyA9CisJCQkJCWZsb3dJbmZvCisJCQkJCQkuY29weSgpCisJCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCkKKwkJCQkJCS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKAorCQkJCQkJCWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKGNhdWdodEV4Y2VwdGlvblR5cGVzW2ldKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkKKwkJCQkJCS5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKHRyeUluZm8udW5jb25kaXRpb25hbEluaXRzKCkpCisJCQkJCQkuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShoYW5kbGluZ0NvbnRleHQuaW5pdHNPblJldHVybik7CisKKwkJCQkvLyBjYXRjaCB2YXIgaXMgYWx3YXlzIHNldAorCQkJCWNhdGNoSW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoY2F0Y2hBcmd1bWVudHNbaV0uYmluZGluZyk7CisJCQkJLyoKKwkJCQkiSWYgd2UgYXJlIGFib3V0IHRvIGNvbnNpZGVyIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gaGFuZGxlciwgcG90ZW50aWFsIGluaXRzIG1heSBoYXZlIG9jY3VyZWQgaW5zaWRlCisJCQkJdGhlIHRyeSBibG9jayB0aGF0IG5lZWQgdG8gYmUgZGV0ZWN0ZWQgLCBlLmcuIAorCQkJCXRyeSB7IHggPSAxOyB0aHJvd1NvbWV0aGluZygpO30gY2F0Y2goRXhjZXB0aW9uIGUpeyB4ID0gMn0gIgorCQkJCSIodW5jaGVja2VkRXhjZXB0aW9uVHlwZXMgbm90TmlsIGFuZDogW3VuY2hlY2tlZEV4Y2VwdGlvblR5cGVzIGF0OiBpbmRleF0pCisJCQkJaWZUcnVlOiBbY2F0Y2hJbml0cyBhZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tOiB0cnlJbml0c10uIgorCQkJCSovCisJCQkJaWYgKHRyeUJsb2NrLnN0YXRlbWVudHMgPT0gbnVsbCkgeworCQkJCQljYXRjaEluZm8ubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQl9CisJCQkJY2F0Y2hJbmZvID0KKwkJCQkJY2F0Y2hCbG9ja3NbaV0uYW5hbHlzZUNvZGUoCisJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQlpbnNpZGVTdWJDb250ZXh0ID09IG51bGwgPyBmbG93Q29udGV4dCA6IGluc2lkZVN1YkNvbnRleHQsCisJCQkJCQljYXRjaEluZm8pOworCQkJCWNhdGNoRXhpdHNbaV0gPQorCQkJCQkoKGNhdGNoSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBjYXRjaEluZm8uaXNGYWtlUmVhY2hhYmxlKCkpOworCQkJCXRyeUluZm8gPSB0cnlJbmZvLm1lcmdlZFdpdGgoY2F0Y2hJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwkJCX0KKwkJfQorCQlpZiAoc3ViUm91dGluZVN0YXJ0TGFiZWwgPT0gbnVsbCkgeworCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRyeUluZm8pOworCQkJcmV0dXJuIHRyeUluZm87CisJCX0KKworCQkvLyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgcG90ZW50aWFsIG11bHRpcGxlIGFzc2lnbm1lbnRzIG9mIGZpbmFsIHZhcmlhYmxlcyBpbnNpZGUgdGhlIGZpbmFsbHkgYmxvY2sKKwkJLy8gbmVlZCB0byBpbmNsdWRlIHBvdGVudGlhbCBpbml0cyBmcm9tIHJldHVybnMgaW5zaWRlIHRoZSB0cnkvY2F0Y2ggcGFydHMgLSAxR0syQU9GCisJCXRyeUluZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShpbnNpZGVTdWJDb250ZXh0LmluaXRzT25SZXR1cm4pOworCQlmaW5hbGx5Q29udGV4dC5jb21wbGFpbk9uUmVkdW5kYW50RmluYWxBc3NpZ25tZW50cyh0cnlJbmZvLCBjdXJyZW50U2NvcGUpOworCQlpZiAoc3ViSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB7CisJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoc3ViSW5mbyk7CisJCQlyZXR1cm4gc3ViSW5mbzsKKwkJfSBlbHNlIHsKKwkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSB0cnlJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20oc3ViSW5mbyk7CisJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CisJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGNhbm5vdFJldHVybigpIHsKKworCQlyZXR1cm4gc3ViUm91dGluZUNhbm5vdFJldHVybjsKKwl9CisKKwkvKioKKwkgKiBUcnkgc3RhdGVtZW50IGNvZGUgZ2VuZXJhdGlvbgorCSAqCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQlpZiAoKGJpdHMgJiBJc1JlYWNoYWJsZU1BU0spID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodHJ5QmxvY2suaXNFbXB0eUJsb2NrKCkpIHsKKwkJCWlmIChzdWJSb3V0aW5lU3RhcnRMYWJlbCAhPSBudWxsKSB7CisJCQkJLy8gc2luY2Ugbm90IHBhc3NpbmcgdGhlIGZpbmFsbHlTY29wZSwgdGhlIGJsb2NrIGdlbmVyYXRpb24gd2lsbCBleGl0VXNlclNjb3BlKGZpbmFsbHlTY29wZSkKKwkJCQlmaW5hbGx5QmxvY2suZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKKwkJCX0KKwkJCS8vIE1heSBsb29zZSBzb21lIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyA6IGFmZmVjdGluZyB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcworCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCQkJLy8gbm8gbG9jYWwgYnl0ZWNvZGUgcHJvZHVjZWQgc28gbm8gbmVlZCBmb3IgcG9zaXRpb24gcmVtZW1iZXJpbmcKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlMYWJlbCBlbmRMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKKwkJYm9vbGVhbiByZXF1aXJlc05hdHVyYWxKc3IgPSBmYWxzZTsKKworCQkvLyBwcmVwYXJpbmcgZXhjZXB0aW9uIGxhYmVscworCQlpbnQgbWF4Q2F0Y2hlczsKKwkJRXhjZXB0aW9uTGFiZWxbXSBleGNlcHRpb25MYWJlbHMgPQorCQkJbmV3IEV4Y2VwdGlvbkxhYmVsW21heENhdGNoZXMgPQorCQkJCWNhdGNoQXJndW1lbnRzID09IG51bGwgPyAwIDogY2F0Y2hBcmd1bWVudHMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhDYXRjaGVzOyBpKyspIHsKKwkJCWJvb2xlYW4gcHJlc2VydmVDdXJyZW50SGFuZGxlciA9CisJCQkJKHByZXNlcnZlRXhjZXB0aW9uSGFuZGxlcltpCisJCQkJCS8gRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemVdCisJCQkJCQkmICgxIDw8IChpICUgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemUpKSkKKwkJCQkJIT0gMDsKKwkJCWlmIChwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyKSB7CisJCQkJZXhjZXB0aW9uTGFiZWxzW2ldID0KKwkJCQkJbmV3IEV4Y2VwdGlvbkxhYmVsKAorCQkJCQkJY29kZVN0cmVhbSwKKwkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBjYXRjaEFyZ3VtZW50c1tpXS5iaW5kaW5nLnR5cGUpOworCQkJfQorCQl9CisJCUV4Y2VwdGlvbkxhYmVsIGFueUV4Y2VwdGlvbkxhYmVsID0gbnVsbDsKKwkJaWYgKHN1YlJvdXRpbmVTdGFydExhYmVsICE9IG51bGwpIHsKKwkJCXN1YlJvdXRpbmVTdGFydExhYmVsLmNvZGVTdHJlYW0gPSBjb2RlU3RyZWFtOworCQkJYW55RXhjZXB0aW9uTGFiZWwgPSBuZXcgRXhjZXB0aW9uTGFiZWwoY29kZVN0cmVhbSwgbnVsbCk7CisJCX0KKwkJLy8gZ2VuZXJhdGUgdGhlIHRyeSBibG9jaworCQl0cnlCbG9jay5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQlib29sZWFuIHRyeUJsb2NrSGFzU29tZUNvZGUgPSBjb2RlU3RyZWFtLnBvc2l0aW9uICE9IHBjOworCQkvLyBmbGFnIHRlbGxpbmcgaWYgc29tZSBieXRlY29kZXMgd2VyZSBpc3N1ZWQgaW5zaWRlIHRoZSB0cnkgYmxvY2sKKworCQkvLyBuYXR1cmFsIGV4aXQ6IG9ubHkgaWYgbmVjZXNzYXJ5CisJCWJvb2xlYW4gbm9uUmV0dXJuaW5nU3ViUm91dGluZSA9CisJCQkoc3ViUm91dGluZVN0YXJ0TGFiZWwgIT0gbnVsbCkgJiYgc3ViUm91dGluZUNhbm5vdFJldHVybjsKKwkJaWYgKCghdHJ5QmxvY2tFeGl0KSAmJiB0cnlCbG9ja0hhc1NvbWVDb2RlKSB7CisJCQlpbnQgcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQkJaWYgKG5vblJldHVybmluZ1N1YlJvdXRpbmUpIHsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKHN1YlJvdXRpbmVTdGFydExhYmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxdWlyZXNOYXR1cmFsSnNyID0gdHJ1ZTsKKwkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZExhYmVsKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOworCQkJLy9nb3RvIGlzIHRhZ2dlZCBhcyBwYXJ0IG9mIHRoZSB0cnkgYmxvY2sKKwkJfQorCQkvLyBwbGFjZSBlbmQgcG9zaXRpb25zIG9mIHVzZXItZGVmaW5lZCBleGNlcHRpb24gbGFiZWxzCisJCWlmICh0cnlCbG9ja0hhc1NvbWVDb2RlKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENhdGNoZXM7IGkrKykgeworCQkJCWJvb2xlYW4gcHJlc2VydmVDdXJyZW50SGFuZGxlciA9CisJCQkJCShwcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXJbaQorCQkJCQkJLyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZV0KKwkJCQkJCQkmICgxIDw8IChpICUgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemUpKSkKKwkJCQkJCSE9IDA7CisJCQkJaWYgKHByZXNlcnZlQ3VycmVudEhhbmRsZXIpIHsKKwkJCQkJZXhjZXB0aW9uTGFiZWxzW2ldLnBsYWNlRW5kKCk7CisJCQkJfQorCQkJfQorCQkJLyogZ2VuZXJhdGUgc2VxdWVuY2Ugb2YgaGFuZGxlciwgYWxsIHN0YXJ0aW5nIGJ5IHN0b3JpbmcgdGhlIFRPUyAoZXhjZXB0aW9uCisJCQl0aHJvd24pIGludG8gdGhlaXIgb3duIGNhdGNoIHZhcmlhYmxlcywgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZQorCQkJdGhhdCBtdXN0IGRlbm90ZSB0aGUgaGFuZGxlZCBleGNlcHRpb24uCisJCQkqLworCQkJaWYgKGNhdGNoQXJndW1lbnRzID09IG51bGwpIHsKKwkJCQlpZiAoYW55RXhjZXB0aW9uTGFiZWwgIT0gbnVsbCkgeworCQkJCQlhbnlFeGNlcHRpb25MYWJlbC5wbGFjZUVuZCgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhDYXRjaGVzOyBpKyspIHsKKwkJCQkJYm9vbGVhbiBwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyID0KKwkJCQkJCShwcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXJbaQorCQkJCQkJCS8gRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemVdCisJCQkJCQkJCSYgKDEgPDwgKGkgJSBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZSkpKQorCQkJCQkJCSE9IDA7CisJCQkJCWlmIChwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyKSB7CisJCQkJCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKwkJCQkJCWlmIChwcmVUcnlJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCQkJCXByZVRyeUluaXRTdGF0ZUluZGV4KTsKKwkJCQkJCX0KKwkJCQkJCWV4Y2VwdGlvbkxhYmVsc1tpXS5wbGFjZSgpOworCQkJCQkJY29kZVN0cmVhbS5pbmNyU3RhY2tTaXplKDEpOworCQkJCQkJLy8gb3B0aW1pemluZyB0aGUgY2FzZSB3aGVyZSB0aGUgZXhjZXB0aW9uIHZhcmlhYmxlIGlzIG5vdCBhY3R1YWxseSB1c2VkCisJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBjYXRjaFZhcjsKKwkJCQkJCWludCB2YXJQQyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCQkJCQlpZiAoKGNhdGNoVmFyID0gY2F0Y2hBcmd1bWVudHNbaV0uYmluZGluZykucmVzb2x2ZWRQb3NpdGlvbiAhPSAtMSkgeworCQkJCQkJCWNvZGVTdHJlYW0uc3RvcmUoY2F0Y2hWYXIsIGZhbHNlKTsKKwkJCQkJCQljYXRjaFZhci5yZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CisJCQkJCQkJY29kZVN0cmVhbS5hZGRWaXNpYmxlTG9jYWxWYXJpYWJsZShjYXRjaFZhcik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQl9CisJCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20odmFyUEMsIGNhdGNoQXJndW1lbnRzW2ldLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCS8vIEtlZXAgdHJhY2sgb2YgdGhlIHBjcyBhdCBkaXZlcmdpbmcgcG9pbnQgZm9yIGNvbXB1dGluZyB0aGUgbG9jYWwgYXR0cmlidXRlCisJCQkJCQkvLyBzaW5jZSBub3QgcGFzc2luZyB0aGUgY2F0Y2hTY29wZSwgdGhlIGJsb2NrIGdlbmVyYXRpb24gd2lsbCBleGl0VXNlclNjb3BlKGNhdGNoU2NvcGUpCisJCQkJCQljYXRjaEJsb2Nrc1tpXS5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQkJCQl9CisJCQkJCWlmIChpID09IG1heENhdGNoZXMgLSAxKSB7CisJCQkJCQlpZiAoYW55RXhjZXB0aW9uTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCWFueUV4Y2VwdGlvbkxhYmVsLnBsYWNlRW5kKCk7CisJCQkJCQl9CisJCQkJCQlpZiAoc3ViUm91dGluZVN0YXJ0TGFiZWwgIT0gbnVsbCkgeworCQkJCQkJCWlmICghY2F0Y2hFeGl0c1tpXSAmJiBwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyKSB7CisJCQkJCQkJCXJlcXVpcmVzTmF0dXJhbEpzciA9IHRydWU7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ290b18oZW5kTGFiZWwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghY2F0Y2hFeGl0c1tpXSAmJiBwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyKSB7CisJCQkJCQkJaWYgKG5vblJldHVybmluZ1N1YlJvdXRpbmUpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhzdWJSb3V0aW5lU3RhcnRMYWJlbCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcmVxdWlyZXNOYXR1cmFsSnNyID0gdHJ1ZTsKKwkJCQkJCQkJY29kZVN0cmVhbS5nb3RvXyhlbmRMYWJlbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gYWRkaXRpb24gb2YgYSBzcGVjaWFsIGhhbmRsZXIgc28gYXMgdG8gZW5zdXJlIHRoYXQgYW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiAob3IgZXhjZXB0aW9uIHRocm93bgorCQkJLy8gaW5zaWRlIGNhdGNoIGJsb2Nrcykgd2lsbCBydW4gdGhlIGZpbmFsbHkgYmxvY2sKKwkJCWludCBmaW5hbGx5U2VxdWVuY2VTdGFydFBDID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJCWlmIChzdWJSb3V0aW5lU3RhcnRMYWJlbCAhPSBudWxsKSB7CisJCQkJLy8gdGhlIGFkZGl0aW9uYWwgaGFuZGxlciBpcyBkb2luZzoganNyIGZpbmFsbHlCbG9jayBhbmQgcmV0aHJvdyBUT1MtZXhjZXB0aW9uCisJCQkJYW55RXhjZXB0aW9uTGFiZWwucGxhY2UoKTsKKworCQkJCWlmIChwcmVUcnlJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCQkvLyByZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSwgYXMgZm9yIGEgbm9ybWFsIGNhdGNoIGJsb2NrCisJCQkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQkJY3VycmVudFNjb3BlLAorCQkJCQkJcHJlVHJ5SW5pdFN0YXRlSW5kZXgpOworCQkJCX0KKworCQkJCWNvZGVTdHJlYW0uaW5jclN0YWNrU2l6ZSgxKTsKKwkJCQlpZiAobm9uUmV0dXJuaW5nU3ViUm91dGluZSkgeworCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkvLyAiaWYgc3Vicm91dGluZSBjYW5ub3QgcmV0dXJuLCBubyBuZWVkIHRvIGpzci9qdW1wIHRvIHN1YnJvdXRpbmUgc2luY2UgaXQgd2lsbCBiZSBlbnRlcmVkIGluIHNlcXVlbmNlCisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5zdG9yZShhbnlFeGNlcHRpb25WYXJpYWJsZSwgZmFsc2UpOworCQkJCQljb2RlU3RyZWFtLmpzcihzdWJSb3V0aW5lU3RhcnRMYWJlbCk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZChhbnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCQkJCWNvZGVTdHJlYW0uYXRocm93KCk7CisJCQkJfQorCQkJfQorCQkJLy8gZW5kIG9mIGNhdGNoIHNlcXVlbmNlLCBwbGFjZSBsYWJlbCB0aGF0IHdpbGwgY29ycmVzcG9uZCB0byB0aGUgZmluYWxseSBibG9jayBiZWdpbm5pbmcsIG9yIGVuZCBvZiBzdGF0ZW1lbnQKKwkJCWVuZExhYmVsLnBsYWNlKCk7CisJCQlpZiAoc3ViUm91dGluZVN0YXJ0TGFiZWwgIT0gbnVsbCkgeworCQkJCWlmIChub25SZXR1cm5pbmdTdWJSb3V0aW5lKSB7CisJCQkJCXJlcXVpcmVzTmF0dXJhbEpzciA9IGZhbHNlOworCQkJCX0KKwkJCQlMYWJlbCB2ZXJ5RW5kTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CisJCQkJaWYgKHJlcXVpcmVzTmF0dXJhbEpzcikgeworCQkJCQljb2RlU3RyZWFtLmpzcihzdWJSb3V0aW5lU3RhcnRMYWJlbCk7CisJCQkJCWNvZGVTdHJlYW0uZ290b18odmVyeUVuZExhYmVsKTsKKwkJCQl9CisJCQkJc3ViUm91dGluZVN0YXJ0TGFiZWwucGxhY2UoKTsKKwkJCQlpZiAoIW5vblJldHVybmluZ1N1YlJvdXRpbmUpIHsKKwkJCQkJY29kZVN0cmVhbS5pbmNyU3RhY2tTaXplKDEpOworCQkJCQljb2RlU3RyZWFtLnN0b3JlKHJldHVybkFkZHJlc3NWYXJpYWJsZSwgZmFsc2UpOworCQkJCX0KKwkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oCisJCQkJCWZpbmFsbHlTZXF1ZW5jZVN0YXJ0UEMsCisJCQkJCWZpbmFsbHlCbG9jay5zb3VyY2VTdGFydCk7CisJCQkJLy8gZW50aXJlIHNlcXVlbmNlIGZvciBmaW5hbGx5IGlzIGFzc29jaWF0ZWQgdG8gZmluYWxseSBibG9jaworCQkJCWZpbmFsbHlCbG9jay5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNvZGVTdHJlYW0pOworCQkJCWlmICghbm9uUmV0dXJuaW5nU3ViUm91dGluZSkgeworCQkJCQlpbnQgcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQkJCQljb2RlU3RyZWFtLnJldChyZXR1cm5BZGRyZXNzVmFyaWFibGUucmVzb2x2ZWRQb3NpdGlvbik7CisJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOworCQkJCQkvLyB0aGUgcmV0IGJ5dGVjb2RlIGlzIHBhcnQgb2YgdGhlIHN1YnJvdXRpbmUKKwkJCQl9CisJCQkJaWYgKHJlcXVpcmVzTmF0dXJhbEpzcikgeworCQkJCQl2ZXJ5RW5kTGFiZWwucGxhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB0cnkgYmxvY2sgaGFkIG5vIGVmZmVjdCwgb25seSBnZW5lcmF0ZSB0aGUgYm9keSBvZiB0aGUgZmluYWxseSBibG9jayBpZiBhbnkKKwkJCWlmIChzdWJSb3V0aW5lU3RhcnRMYWJlbCAhPSBudWxsKSB7CisJCQkJZmluYWxseUJsb2NrLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CisJCQl9CisJCX0KKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHVwcGVyU2NvcGUpIHsKKworCQkvLyBzcGVjaWFsIHNjb3BlIGZvciBzZWNyZXQgbG9jYWxzIG9wdGltaXphdGlvbi4JCisJCXRoaXMuc2NvcGUgPSBuZXcgQmxvY2tTY29wZSh1cHBlclNjb3BlKTsKKworCQlCbG9ja1Njb3BlIHRyeVNjb3BlID0gbmV3IEJsb2NrU2NvcGUoc2NvcGUpOworCQlCbG9ja1Njb3BlIGZpbmFsbHlTY29wZSA9IG51bGw7CisJCQorCQlpZiAoZmluYWxseUJsb2NrICE9IG51bGwKKwkJCSYmIGZpbmFsbHlCbG9jay5zdGF0ZW1lbnRzICE9IG51bGwpIHsKKworCQkJZmluYWxseVNjb3BlID0gbmV3IEJsb2NrU2NvcGUoc2NvcGUsIGZhbHNlKTsgLy8gZG9uJ3QgYWRkIGl0IHlldCB0byBwYXJlbnQgc2NvcGUKKworCQkJLy8gcHJvdmlzaW9uIGZvciByZXR1cm5pbmcgYW5kIGZvcmNpbmcgdGhlIGZpbmFsbHkgYmxvY2sgdG8gcnVuCisJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisKKwkJCS8vIHRoZSB0eXBlIGRvZXMgbm90IG1hdHRlciBhcyBsb25nIGFzIGl0cyBub3QgYSBub3JtYWwgYmFzZSB0eXBlCisJCQl0aGlzLnJldHVybkFkZHJlc3NWYXJpYWJsZSA9CisJCQkJbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKFNlY3JldFJldHVybk5hbWUsIHVwcGVyU2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSwgQWNjRGVmYXVsdCwgZmFsc2UpOworCQkJZmluYWxseVNjb3BlLmFkZExvY2FsVmFyaWFibGUocmV0dXJuQWRkcmVzc1ZhcmlhYmxlKTsKKwkJCXRoaXMucmV0dXJuQWRkcmVzc1ZhcmlhYmxlLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OyAvLyBub3QgaW5saW5hYmxlCisJCQl0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsID0gbmV3IExhYmVsKCk7CisKKwkJCXRoaXMuYW55RXhjZXB0aW9uVmFyaWFibGUgPQorCQkJCW5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyhTZWNyZXRBbnlIYW5kbGVyTmFtZSwgc2NvcGUuZ2V0SmF2YUxhbmdUaHJvd2FibGUoKSwgQWNjRGVmYXVsdCwgZmFsc2UpOworCQkJZmluYWxseVNjb3BlLmFkZExvY2FsVmFyaWFibGUodGhpcy5hbnlFeGNlcHRpb25WYXJpYWJsZSk7CisJCQl0aGlzLmFueUV4Y2VwdGlvblZhcmlhYmxlLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OyAvLyBub3QgaW5saW5hYmxlCisKKwkJCWlmICghbWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplcigpKSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0KKwkJCQkJKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0KS5iaW5kaW5nOworCQkJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJVHlwZUJpbmRpbmcgbWV0aG9kUmV0dXJuVHlwZSA9IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZTsKKwkJCQkJaWYgKG1ldGhvZFJldHVyblR5cGUuaWQgIT0gVF92b2lkKSB7CisJCQkJCQl0aGlzLnNlY3JldFJldHVyblZhbHVlID0KKwkJCQkJCQluZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmcoCisJCQkJCQkJCVNlY3JldExvY2FsRGVjbGFyYXRpb25OYW1lLAorCQkJCQkJCQltZXRob2RSZXR1cm5UeXBlLAorCQkJCQkJCQlBY2NEZWZhdWx0LAorCQkJCQkJCQlmYWxzZSk7CisJCQkJCQlmaW5hbGx5U2NvcGUuYWRkTG9jYWxWYXJpYWJsZSh0aGlzLnNlY3JldFJldHVyblZhbHVlKTsKKwkJCQkJCXRoaXMuc2VjcmV0UmV0dXJuVmFsdWUuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7IC8vIG5vdCBpbmxpbmFibGUKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHlCbG9jay5yZXNvbHZlVXNpbmcoZmluYWxseVNjb3BlKTsKKwkJCS8vIGZvcmNlIHRoZSBmaW5hbGx5IHNjb3BlIHRvIGhhdmUgdmFyaWFibGUgcG9zaXRpb25zIHNoaWZ0ZWQgYWZ0ZXIgaXRzIHRyeSBzY29wZSBhbmQgY2F0Y2ggb25lcworCQkJZmluYWxseVNjb3BlLnNoaWZ0U2NvcGVzID0gbmV3IEJsb2NrU2NvcGVbY2F0Y2hBcmd1bWVudHMgPT0gbnVsbCA/IDEgOiBjYXRjaEFyZ3VtZW50cy5sZW5ndGgrMV07CisJCQlmaW5hbGx5U2NvcGUuc2hpZnRTY29wZXNbMF0gPSB0cnlTY29wZTsKKwkJfQorCQl0aGlzLnRyeUJsb2NrLnJlc29sdmVVc2luZyh0cnlTY29wZSk7CisKKwkJLy8gYXJndW1lbnRzIHR5cGUgYXJlIGNoZWNrZWQgYWdhaW5zdCBKYXZhTGFuZ1Rocm93YWJsZSBpbiByZXNvbHZlRm9yQ2F0Y2goLi4pCisJCWlmICh0aGlzLmNhdGNoQmxvY2tzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmNhdGNoQXJndW1lbnRzLmxlbmd0aDsKKwkJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUJsb2NrU2NvcGUgY2F0Y2hTY29wZSA9IG5ldyBCbG9ja1Njb3BlKHNjb3BlKTsKKwkJCQlpZiAoZmluYWxseVNjb3BlICE9IG51bGwpeworCQkJCQlmaW5hbGx5U2NvcGUuc2hpZnRTY29wZXNbaSsxXSA9IGNhdGNoU2NvcGU7CisJCQkJfQorCQkJCS8vIHNpZGUgZWZmZWN0IG9uIGNhdGNoU2NvcGUgaW4gcmVzb2x2ZUZvckNhdGNoKC4uKQorCQkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IGNhdGNoQXJndW1lbnRzW2ldLnJlc29sdmVGb3JDYXRjaChjYXRjaFNjb3BlKSkgPT0gbnVsbCkKKwkJCQkJcmV0dXJuOworCQkJCWNhdGNoQmxvY2tzW2ldLnJlc29sdmVVc2luZyhjYXRjaFNjb3BlKTsKKwkJCX0KKworCQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGNhdGNoIGNsYXVzZSBhcmUgb3JkZXJlZCBpbiB0aGUgcmlnaHQgd2F5OgorCQkJLy8gbW9yZSBzcGVjaWFsaXplZCBmaXJzdC4KKwkJCXRoaXMuY2F1Z2h0RXhjZXB0aW9uVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNhdWdodEV4Y2VwdGlvblR5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIGFyZ3VtZW50VHlwZXNbaV07CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXVnaHRFeGNlcHRpb25UeXBlc1tpXSwgYXJndW1lbnRUeXBlc1tqXSkpIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLndyb25nU2VxdWVuY2VPZkV4Y2VwdGlvblR5cGVzRXJyb3IodGhpcywgaSwgaik7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljYXVnaHRFeGNlcHRpb25UeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzBdOworCQl9CisJCQorCQlpZiAoZmluYWxseVNjb3BlICE9IG51bGwpeworCQkJLy8gYWRkIGZpbmFsbHlTY29wZSBhcyBsYXN0IHN1YnNjb3BlLCBzbyBpdCBjYW4gYmUgc2hpZnRlZCBiZWhpbmQgdHJ5L2NhdGNoIHN1YnNjb3Blcy4KKwkJCS8vIHRoZSBzaGlmdGluZyBpcyBuZWNlc3NhcnkgdG8gYWNoaWV2ZSBubyBvdmVybGF5IGluIGJldHdlZW4gdGhlIGZpbmFsbHkgc2NvcGUgYW5kIGl0cworCQkJLy8gc2libGluZyBpbiB0ZXJtIG9mIGxvY2FsIHZhcmlhYmxlIHBvc2l0aW9ucy4KKwkJCXRoaXMuc2NvcGUuYWRkU3Vic2NvcGUoZmluYWxseVNjb3BlKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCQlTdHJpbmcgcyA9IHRhYlN0cmluZyh0YWIpOworCQkvL3RyeQorCQlzID0gcyArICJ0cnkgIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAodHJ5QmxvY2sgPT0gQmxvY2suTm9uZSkKKwkJCXMgPSBzICsgInt9IjsgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlzID0gcyArICJcbiIgKyB0cnlCbG9jay50b1N0cmluZyh0YWIgKyAxKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vY2F0Y2hlcworCQlpZiAoY2F0Y2hCbG9ja3MgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0Y2hCbG9ja3MubGVuZ3RoOyBpKyspCisJCQkJCXMgPSBzICsgIlxuIiArIHRhYlN0cmluZyh0YWIpICsgImNhdGNoICgiIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJCQkJK2NhdGNoQXJndW1lbnRzW2ldLnRvU3RyaW5nKDApICsgIikgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrY2F0Y2hCbG9ja3NbaV0udG9TdHJpbmcodGFiICsgMSk7CisJCS8vZmluYWxseQorCQlpZiAoZmluYWxseUJsb2NrICE9IG51bGwpIHsKKwkJCWlmIChmaW5hbGx5QmxvY2sgPT0gQmxvY2suTm9uZSkKKwkJCQlzID0gcyArICJcbiIgKyB0YWJTdHJpbmcodGFiKSArICJmaW5hbGx5IHt9IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQllbHNlCisJCQkJCXMgPSBzICsgIlxuIiArIHRhYlN0cmluZyh0YWIpICsgImZpbmFsbHlcbiIgKyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsbHlCbG9jay50b1N0cmluZyh0YWIgKyAxKTsKKwkJfQorCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJdHJ5QmxvY2sudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJaWYgKGNhdGNoQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY2F0Y2hCbG9ja3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJY2F0Y2hBcmd1bWVudHNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCQljYXRjaEJsb2Nrc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbmFsbHlCbG9jayAhPSBudWxsKQorCQkJCWZpbmFsbHlCbG9jay50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkYjUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCitwdWJsaWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uCisJZXh0ZW5kcyBTdGF0ZW1lbnQKKwlpbXBsZW1lbnRzIFByb2JsZW1TZXZlcml0aWVzLCBSZWZlcmVuY2VDb250ZXh0IHsKKworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJcHVibGljIGNoYXJbXSBuYW1lOworCXB1YmxpYyBUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3M7CisJcHVibGljIFR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXM7CisJcHVibGljIEZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHM7CisJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzOworCXB1YmxpYyBNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJUeXBlczsKKwlwdWJsaWMgU291cmNlVHlwZUJpbmRpbmcgYmluZGluZzsKKwlwdWJsaWMgQ2xhc3NTY29wZSBzY29wZTsKKwlwdWJsaWMgTWV0aG9kU2NvcGUgaW5pdGlhbGl6ZXJTY29wZTsKKwlwdWJsaWMgTWV0aG9kU2NvcGUgc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKKwlwdWJsaWMgYm9vbGVhbiBpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IGZhbHNlOworCXB1YmxpYyBpbnQgbWF4RmllbGRDb3VudDsKKwlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJcHVibGljIGludCBkZWNsYXJhdGlvblNvdXJjZUVuZDsKKwlwdWJsaWMgaW50IGJvZHlTdGFydDsKKwlwdWJsaWMgaW50IGJvZHlFbmQ7IC8vIGRvZXNuJ3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgY29tbWVudCBpZiBhbnkuCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzQmVlbkdlbmVyYXRlZCA9IGZhbHNlOworCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdDsKKwlwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uW10gbWlzc2luZ0Fic3RyYWN0TWV0aG9kczsKKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCQl0aGlzLmNvbXBpbGF0aW9uUmVzdWx0ID0gY29tcGlsYXRpb25SZXN1bHQ7CisJfQorCQkKKwkvKgorCSAqCVdlIGNhdXNlIHRoZSBjb21waWxhdGlvbiB0YXNrIHRvIGFib3J0IHRvIGEgZ2l2ZW4gZXh0ZW50LgorCSAqLworCXB1YmxpYyB2b2lkIGFib3J0KGludCBhYm9ydExldmVsKSB7CisKKwkJaWYgKHNjb3BlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKCk7IC8vIGNhbm5vdCBkbyBiZXR0ZXIKKwkJfQorCisJCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0KKwkJCXNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0OworCisJCXN3aXRjaCAoYWJvcnRMZXZlbCkgeworCQkJY2FzZSBBYm9ydENvbXBpbGF0aW9uIDoKKwkJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbihjb21waWxhdGlvblJlc3VsdCk7CisJCQljYXNlIEFib3J0Q29tcGlsYXRpb25Vbml0IDoKKwkJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25SZXN1bHQpOworCQkJY2FzZSBBYm9ydE1ldGhvZCA6CisJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCWRlZmF1bHQgOgorCQkJCXRocm93IG5ldyBBYm9ydFR5cGUoY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgYSA8Y2xpbml0PiBtZXRob2QgZGVjbGFyYXRpb24gdG8gdGhlIHR5cGUgbWV0aG9kIGNvbGxlY3Rpb25zLgorCSAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGluc2VydGluZyBpdCBpbiBmaXJzdCBwbGFjZSAoYXMgVkFKIG9yIGphdmFjKSwgYW5kIHRoYXQgdGhpcworCSAqIGltcGFjdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBtZXRob2QgQ29uc3RhbnRQb29sLnJlc2V0Rm9yQ2xpbml0KGludC4gaW50KSwgaW4gc28gZmFyIGFzIAorCSAqIHRoZSBsYXR0ZXIgd2lsbCBoYXZlIHRvIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHN0YXRlIGFjY29yZGluZ2x5IChpZiBpdCB3YXMgYWRkZWQgZmlyc3QsIGl0IGRvZXMgCisJICogbm90IG5lZWQgdG8gcHJlc2VydmUgc29tZSBvZiB0aGUgbWV0aG9kIHNwZWNpZmljIGNhY2hlZCBlbnRyaWVzIHNpbmNlIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgbWV0aG9kKS4KKwkgKiBpbnNlcnRzIHRoZSBjbGluaXQgbWV0aG9kIGRlY2xhcmF0aW9uIGluIHRoZSBmaXJzdCBwb3NpdGlvbi4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvbnN0YW50UG9vbCNyZXNldEZvckNsaW5pdChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBhZGRDbGluaXQoKSB7CisKKwkJLy9zZWUgY29tbWVudCBvbiBuZWVkQ2xhc3NJbml0TWV0aG9kCisJCWlmIChuZWVkQ2xhc3NJbml0TWV0aG9kKCkpIHsKKwkJCWludCBsZW5ndGg7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kczsKKwkJCWlmICgobWV0aG9kcyA9IHRoaXMubWV0aG9kcykgPT0gbnVsbCkgeworCQkJCWxlbmd0aCA9IDA7CisJCQkJbWV0aG9kcyA9IG5ldyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uWzFdOworCQkJfSBlbHNlIHsKKwkJCQlsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQltZXRob2RzLAorCQkJCQkwLAorCQkJCQkobWV0aG9kcyA9IG5ldyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW2xlbmd0aCArIDFdKSwKKwkJCQkJMSwKKwkJCQkJbGVuZ3RoKTsKKwkJCX0KKwkJCUNsaW5pdCBjbGluaXQgPSBuZXcgQ2xpbml0KHRoaXMuY29tcGlsYXRpb25SZXN1bHQpOworCQkJbWV0aG9kc1swXSA9IGNsaW5pdDsKKwkJCS8vIGNsaW5pdCBpcyBhZGRlZCBpbiBmaXJzdCBsb2NhdGlvbiwgc28gYXMgdG8gbWluaW1pemUgdGhlIHVzZSBvZiBsZGN3IChiaWcgY29uc3VtZXIgb2YgY29uc3RhbnQgaW5pdHMpCisJCQljbGluaXQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGNsaW5pdC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQkJY2xpbml0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gY2xpbml0LnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJCWNsaW5pdC5ib2R5RW5kID0gc291cmNlRW5kOworCQkJdGhpcy5tZXRob2RzID0gbWV0aG9kczsKKwkJfQorCX0KKworCS8qKgorCSAqCUZsb3cgYW5hbHlzaXMgZm9yIGEgbG9jYWwgaW5uZXJ0eXBlCisJICoKKwkgKi8KKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQlyZXR1cm4gZmxvd0luZm87CisJCXRyeSB7CisJCQkvLyByZW1lbWJlciBsb2NhbCB0eXBlcyBiaW5kaW5nIGZvciBpbm5lcmNsYXNzIGVtdWxhdGlvbiBwcm9wYWdhdGlvbgorCQkJY3VycmVudFNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLnJlY29yZCgoTG9jYWxUeXBlQmluZGluZykgYmluZGluZyk7CisKKwkJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6ZXJDb250ZXh0ID0KKwkJCQluZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCBpbml0aWFsaXplclNjb3BlKTsKKwkJCS8vIHByb3BhZ2F0ZSBkb3duIHRoZSBtYXggZmllbGQgY291bnQKKwkJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKKwkJCUZsb3dJbmZvIGZpZWxkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKKwkJCS8vIHNvIGFzIG5vdCB0byBwcm9wYWdhdGUgY2hhbmdlcyBvdXRzaWRlIHRoaXMgdHlwZQorCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJZmllbGRJbmZvID0KKwkJCQkJCWZpZWxkc1tpXS5hbmFseXNlQ29kZShpbml0aWFsaXplclNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIGZpZWxkSW5mbyk7CisJCQkJCWlmIChmaWVsZEluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgeworCQkJCQkJLy8gaW4gY2FzZSB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IHJlYWNoYWJsZSwgdXNlIGEgcmVpbml0aWFsaXplZCBmbG93SW5mbyBhbmQgZW50ZXIgYSBmYWtlIHJlYWNoYWJsZQorCQkJCQkJLy8gYnJhbmNoLCBzaW5jZSB0aGUgcHJldmlvdXMgaW5pdGlhbGl6ZXIgYWxyZWFkeSBnb3QgdGhlIGJsYW1lLgorCQkJCQkJaW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkc1tpXSk7CisJCQkJCQlmaWVsZEluZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJbWVtYmVyVHlwZXNbaV0uYW5hbHlzZUNvZGUoc2NvcGUsIGZsb3dDb250ZXh0LCBmaWVsZEluZm8uY29weSgpKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJaW50IHJlY3Vyc2lvbkJhbGFuY2UgPSAwOyAvLyBjaGVjayBjb25zdHJ1Y3RvciByZWN1cnNpb25zCQkJCisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCQkJaWYgKG1ldGhvZC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgeyAvLyBjb25zdHJ1Y3RvcgorCQkJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2Q7CisJCQkJCQljb25zdHJ1Y3Rvci5hbmFseXNlQ29kZShzY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBmaWVsZEluZm8uY29weSgpKTsKKwkJCQkJCS8vIGNvbXB1dGUgdGhlIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIGJhbGFuY2U6CisJCQkJCQkvLyAgIGhvdyBtYW55IHRoaXNSZWZlcmVuY2VzIHZzLiBzdXBlclJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzCisJCQkJCQlpbnQgcmVmQ291bnQ7CisJCQkJCQlpZiAoKHJlZkNvdW50ID0gY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQpID4gMCkgeworCQkJCQkJCWlmICgoY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsID09IG51bGwpCisJCQkJCQkJCXx8IGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5pc1N1cGVyQWNjZXNzKCkKKwkJCQkJCQkJfHwgIWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQkJcmVjdXJzaW9uQmFsYW5jZSAtPSByZWZDb3VudDsKKwkJCQkJCQkJY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPSAtMTsKKwkJCQkJCQkJLy8gZm9yIGVycm9yIHJlcG9ydGluZyBwcm9wYWdhdGlvbgkJCQkJCQkJCQkJCQkJCQkKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlICs9IHJlZkNvdW50OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLy8gcmVndWxhciBtZXRob2QKKwkJCQkJCW1ldGhvZC5hbmFseXNlQ29kZShzY29wZSwgbnVsbCwgZmxvd0luZm8uY29weSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocmVjdXJzaW9uQmFsYW5jZSA+IDApIHsKKwkJCQkJLy8gdGhlcmUgaXMgb25lIG9yIG1vcmUgY3ljbGUocykgYW1vbmdzdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydFR5cGUgZSkgeworCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCX0KKwkJcmV0dXJuIGZsb3dJbmZvOworCX0KKworCS8qKgorCSAqCUZsb3cgYW5hbHlzaXMgZm9yIGEgbWVtYmVyIGlubmVydHlwZQorCSAqCisJICovCisJcHVibGljIHZvaWQgYW5hbHlzZUNvZGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlMSkgeworCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKKwkJCXJldHVybjsKKwkJdHJ5IHsKKwkJCS8vIHByb3BhZ2F0ZSBkb3duIHRoZSBtYXggZmllbGQgY291bnQKKwkJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKKwkJCUZsb3dJbmZvIGZsb3dJbmZvID0gRmxvd0luZm8uaW5pdGlhbChtYXhGaWVsZENvdW50KTsgLy8gc3RhcnQgZnJlc2ggaW5pdCBpbmZvCisJCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IGluaXRpYWxpemVyQ29udGV4dCA9CisJCQkJbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgaW5pdGlhbGl6ZXJTY29wZSk7CisJCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IHN0YXRpY0luaXRpYWxpemVyQ29udGV4dCA9CisJCQkJbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgc3RhdGljSW5pdGlhbGl6ZXJTY29wZSk7CisJCQlGbG93SW5mbyBub25TdGF0aWNGaWVsZEluZm8gPSBmbG93SW5mby5jb3B5KCksCisJCQkJc3RhdGljRmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpOworCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJaWYgKGZpZWxkc1tpXS5pc1N0YXRpYygpKSB7CisJCQkJCQlzdGF0aWNGaWVsZEluZm8gPQorCQkJCQkJCWZpZWxkc1tpXS5hbmFseXNlQ29kZSgKKwkJCQkJCQkJc3RhdGljSW5pdGlhbGl6ZXJTY29wZSwKKwkJCQkJCQkJc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LAorCQkJCQkJCQlzdGF0aWNGaWVsZEluZm8pOworCQkJCQkJLy8gaW4gY2FzZSB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IHJlYWNoYWJsZSwgdXNlIGEgcmVpbml0aWFsaXplZCBmbG93SW5mbyBhbmQgZW50ZXIgYSBmYWtlIHJlYWNoYWJsZQorCQkJCQkJLy8gYnJhbmNoLCBzaW5jZSB0aGUgcHJldmlvdXMgaW5pdGlhbGl6ZXIgYWxyZWFkeSBnb3QgdGhlIGJsYW1lLgorCQkJCQkJaWYgKHN0YXRpY0ZpZWxkSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB7CisJCQkJCQkJc3RhdGljSW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KAorCQkJCQkJCQlmaWVsZHNbaV0pOworCQkJCQkJCXN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9CisJCQkJCQkJZmllbGRzW2ldLmFuYWx5c2VDb2RlKGluaXRpYWxpemVyU2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgbm9uU3RhdGljRmllbGRJbmZvKTsKKwkJCQkJCS8vIGluIGNhc2UgdGhlIGluaXRpYWxpemVyIGlzIG5vdCByZWFjaGFibGUsIHVzZSBhIHJlaW5pdGlhbGl6ZWQgZmxvd0luZm8gYW5kIGVudGVyIGEgZmFrZSByZWFjaGFibGUKKwkJCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KKwkJCQkJCWlmIChub25TdGF0aWNGaWVsZEluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgeworCQkJCQkJCWluaXRpYWxpemVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseShmaWVsZHNbaV0pOworCQkJCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQltZW1iZXJUeXBlc1tpXS5hbmFseXNlQ29kZShzY29wZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCWludCByZWN1cnNpb25CYWxhbmNlID0gMDsgLy8gY2hlY2sgY29uc3RydWN0b3IgcmVjdXJzaW9ucworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkJCWlmIChtZXRob2QuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKG1ldGhvZC5pc0luaXRpYWxpemF0aW9uTWV0aG9kKCkpIHsKKwkJCQkJCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgeyAvLyA8Y2xpbml0PgorCQkJCQkJCSgoQ2xpbml0KSBtZXRob2QpLmFuYWx5c2VDb2RlKHNjb3BlLCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQsIHN0YXRpY0ZpZWxkSW5mbyk7CisJCQkJCQl9IGVsc2UgeyAvLyBjb25zdHJ1Y3RvcgorCQkJCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kOworCQkJCQkJCWNvbnN0cnVjdG9yLmFuYWx5c2VDb2RlKHNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIG5vblN0YXRpY0ZpZWxkSW5mby5jb3B5KCkpOworCQkJCQkJCS8vIGNvbXB1dGUgdGhlIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIGJhbGFuY2U6CisJCQkJCQkJLy8gICBob3cgbWFueSB0aGlzUmVmZXJlbmNlcyB2cy4gc3VwZXJSZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9ycworCQkJCQkJCWludCByZWZDb3VudDsKKwkJCQkJCQlpZiAoKHJlZkNvdW50ID0gY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQpID4gMCkgeworCQkJCQkJCQlpZiAoKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsKQorCQkJCQkJCQkJfHwgY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmlzU3VwZXJBY2Nlc3MoKQorCQkJCQkJCQkJfHwgIWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgLT0gcmVmQ291bnQ7CisJCQkJCQkJCQljb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA9IC0xOyAvLyBmb3IgZXJyb3IgcmVwb3J0aW5nIHByb3BhZ2F0aW9uCQkJCQkJCQkKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgKz0gcmVmQ291bnQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7IC8vIHJlZ3VsYXIgbWV0aG9kCisJCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoc2NvcGUsIG51bGwsIEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChyZWN1cnNpb25CYWxhbmNlID4gMCkgeworCQkJCQkvLyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBjeWNsZShzKSBhbW9uZ3N0IGNvbnN0cnVjdG9yIGludm9jYXRpb25zCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEFib3J0VHlwZSBlKSB7CisJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJfTsKKwl9CisKKwkvKioKKwkgKglGbG93IGFuYWx5c2lzIGZvciBhIGxvY2FsIG1lbWJlciBpbm5lcnR5cGUKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIGFuYWx5c2VDb2RlKAorCQlDbGFzc1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJLy8gcmVtZW1iZXIgbG9jYWwgdHlwZXMgYmluZGluZyBmb3IgaW5uZXJjbGFzcyBlbXVsYXRpb24gcHJvcGFnYXRpb24KKwkJCWN1cnJlbnRTY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5yZWNvcmQoKExvY2FsVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCisJCQkvKiBmb3JjZSB0byBlbXVsYXRpb24gb2YgYWNjZXNzIHRvIGRpcmVjdCBlbmNsb3NpbmcgaW5zdGFuY2U6IG9ubHkgZm9yIGxvY2FsIG1lbWJlcnMuCisJCQkgKiBCeSB1c2luZyB0aGUgaW5pdGlhbGl6ZXIgc2NvcGUsIHdlIGFjdHVhbGx5IG9ubHkgcmVxdWVzdCBhbiBhcmd1bWVudCBlbXVsYXRpb24sIHRoZQorCQkJICogZmllbGQgaXMgbm90IGFkZGVkIHVudGlsIGFjdHVhbGx5IHVzZWQuIEhvd2V2ZXIgd2Ugd2lsbCBmb3JjZSBhbGxvY2F0aW9ucyB0byBiZSBxdWFsaWZpZWQKKwkJCSAqIHdpdGggYW4gZW5jbG9zaW5nIGluc3RhbmNlLgorCQkJICovCisJCQlpbml0aWFsaXplclNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygKKwkJCQkoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpLAorCQkJCWZhbHNlKTsKKworCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckNvbnRleHQgPQorCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIGluaXRpYWxpemVyU2NvcGUpOworCQkJLy8gcHJvcGFnYXRlIGRvd24gdGhlIG1heCBmaWVsZCBjb3VudAorCQkJdXBkYXRlTWF4RmllbGRDb3VudCgpOworCQkJRmxvd0luZm8gZmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpOworCQkJLy8gc28gYXMgbm90IHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIG91dHNpZGUgdGhpcyB0eXBlCisJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQlpZiAoIWZpZWxkc1tpXS5pc1N0YXRpYygpKSB7CisJCQkJCQlmaWVsZEluZm8gPQorCQkJCQkJCWZpZWxkc1tpXS5hbmFseXNlQ29kZShpbml0aWFsaXplclNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIGZpZWxkSW5mbyk7CisJCQkJCQlpZiAoZmllbGRJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKKwkJCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCisJCQkJCQkJLy8gYnJhbmNoLCBzaW5jZSB0aGUgcHJldmlvdXMgaW5pdGlhbGl6ZXIgYWxyZWFkeSBnb3QgdGhlIGJsYW1lLgorCQkJCQkJCWluaXRpYWxpemVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseShmaWVsZHNbaV0pOworCQkJCQkJCWZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQltZW1iZXJUeXBlc1tpXS5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZpZWxkSW5mby5jb3B5KCkpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCQlpbnQgcmVjdXJzaW9uQmFsYW5jZSA9IDA7IC8vIGNoZWNrIGNvbnN0cnVjdG9yIHJlY3Vyc2lvbnMJCQkKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJCQlpZiAobWV0aG9kLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7IC8vIGNvbnN0cnVjdG9yCisJCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZDsKKwkJCQkJCWNvbnN0cnVjdG9yLmFuYWx5c2VDb2RlKHNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIGZpZWxkSW5mby5jb3B5KCkpOworCQkJCQkJLy8gY29tcHV0ZSB0aGUgcmVjdXJzaXZlIGludm9jYXRpb24gYmFsYW5jZToKKwkJCQkJCS8vICAgaG93IG1hbnkgdGhpc1JlZmVyZW5jZXMgdnMuIHN1cGVyUmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMKKwkJCQkJCWludCByZWZDb3VudDsKKwkJCQkJCWlmICgocmVmQ291bnQgPSBjb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCkgPiAwKSB7CisJCQkJCQkJaWYgKChjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbCkKKwkJCQkJCQkJfHwgY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmlzU3VwZXJBY2Nlc3MoKQorCQkJCQkJCQl8fCAhY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlIC09IHJlZkNvdW50OworCQkJCQkJCQljb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA9IC0xOyAvLyBmb3IgZXJyb3IgcmVwb3J0aW5nIHByb3BhZ2F0aW9uCQkJCQkJCQkKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlICs9IHJlZkNvdW50OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLy8gcmVndWxhciBtZXRob2QKKwkJCQkJCW1ldGhvZC5hbmFseXNlQ29kZShzY29wZSwgbnVsbCwgZmxvd0luZm8uY29weSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocmVjdXJzaW9uQmFsYW5jZSA+IDApIHsKKwkJCQkJLy8gdGhlcmUgaXMgb25lIG9yIG1vcmUgY3ljbGUocykgYW1vbmdzdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydFR5cGUgZSkgeworCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCX07CisJfQorCisJLyoqCisJICoJRmxvdyBhbmFseXNpcyBmb3IgYSBwYWNrYWdlIG1lbWJlciB0eXBlCisJICoKKwkgKi8KKwlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZShDb21waWxhdGlvblVuaXRTY29wZSB1bml0U2NvcGUpIHsKKworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlGbG93SW5mbyBmbG93SW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCk7IC8vIHN0YXJ0IGZyZXNoIGluaXQgaW5mbworCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckNvbnRleHQgPQorCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIGluaXRpYWxpemVyU2NvcGUpOworCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQgPQorCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIHN0YXRpY0luaXRpYWxpemVyU2NvcGUpOworCQkJRmxvd0luZm8gbm9uU3RhdGljRmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpLAorCQkJCXN0YXRpY0ZpZWxkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKKwkJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJCWlmIChmaWVsZHNbaV0uaXNTdGF0aWMoKSkgeworCQkJCQkJc3RhdGljRmllbGRJbmZvID0KKwkJCQkJCQlmaWVsZHNbaV0uYW5hbHlzZUNvZGUoCisJCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyU2NvcGUsCisJCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwKKwkJCQkJCQkJc3RhdGljRmllbGRJbmZvKTsKKwkJCQkJCS8vIGluIGNhc2UgdGhlIGluaXRpYWxpemVyIGlzIG5vdCByZWFjaGFibGUsIHVzZSBhIHJlaW5pdGlhbGl6ZWQgZmxvd0luZm8gYW5kIGVudGVyIGEgZmFrZSByZWFjaGFibGUKKwkJCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KKwkJCQkJCWlmIChzdGF0aWNGaWVsZEluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgeworCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseSgKKwkJCQkJCQkJZmllbGRzW2ldKTsKKwkJCQkJCQlzdGF0aWNGaWVsZEluZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlub25TdGF0aWNGaWVsZEluZm8gPQorCQkJCQkJCWZpZWxkc1tpXS5hbmFseXNlQ29kZShpbml0aWFsaXplclNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIG5vblN0YXRpY0ZpZWxkSW5mbyk7CisJCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCisJCQkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCisJCQkJCQlpZiAobm9uU3RhdGljRmllbGRJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKKwkJCQkJCQlpbml0aWFsaXplclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHkoZmllbGRzW2ldKTsKKwkJCQkJCQlub25TdGF0aWNGaWVsZEluZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJbWVtYmVyVHlwZXNbaV0uYW5hbHlzZUNvZGUoc2NvcGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCQlpbnQgcmVjdXJzaW9uQmFsYW5jZSA9IDA7IC8vIGNoZWNrIGNvbnN0cnVjdG9yIHJlY3Vyc2lvbnMJCQkKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJCQlpZiAobWV0aG9kLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChtZXRob2QuaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpKSB7CisJCQkJCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsgLy8gPGNsaW5pdD4KKwkJCQkJCQkoKENsaW5pdCkgbWV0aG9kKS5hbmFseXNlQ29kZShzY29wZSwgc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LCBzdGF0aWNGaWVsZEluZm8pOworCQkJCQkJfSBlbHNlIHsgLy8gY29uc3RydWN0b3IKKwkJCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZDsKKwkJCQkJCQljb25zdHJ1Y3Rvci5hbmFseXNlQ29kZShzY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8uY29weSgpKTsKKwkJCQkJCQkvLyBjb21wdXRlIHRoZSByZWN1cnNpdmUgaW52b2NhdGlvbiBiYWxhbmNlOgorCQkJCQkJCS8vICAgaG93IG1hbnkgdGhpc1JlZmVyZW5jZXMgdnMuIHN1cGVyUmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMKKwkJCQkJCQlpbnQgcmVmQ291bnQ7CisJCQkJCQkJaWYgKChyZWZDb3VudCA9IGNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50KSA+IDApIHsKKwkJCQkJCQkJaWYgKChjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbCkKKwkJCQkJCQkJCXx8IGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5pc1N1cGVyQWNjZXNzKCkKKwkJCQkJCQkJCXx8ICFjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlIC09IHJlZkNvdW50OworCQkJCQkJCQkJY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPSAtMTsgLy8gZm9yIGVycm9yIHJlcG9ydGluZyBwcm9wYWdhdGlvbgorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJcmVjdXJzaW9uQmFsYW5jZSArPSByZWZDb3VudDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLy8gcmVndWxhciBtZXRob2QKKwkJCQkJCW1ldGhvZC5hbmFseXNlQ29kZShzY29wZSwgbnVsbCwgRmxvd0luZm8uaW5pdGlhbChtYXhGaWVsZENvdW50KSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHJlY3Vyc2lvbkJhbGFuY2UgPiAwKSB7CisJCQkJCS8vIHRoZXJlIGlzIG9uZSBvciBtb3JlIGN5Y2xlKHMpIGFtb25nc3QgY29uc3RydWN0b3IgaW52b2NhdGlvbnMKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmVjdXJzaXZlQ29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKKwkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQl9OworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIGNvbnN0cnVjdG9yIHZzLiBtZXRob2Qgd2l0aCBubyByZXR1cm4gdHlwZS4KKwkgKiBBbnN3ZXJzIHRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbnN0cnVjdG9ycyhQYXJzZXIgcGFyc2VyKSB7CisKKwkJLy9pZiBhIGNvbnN0cnVjdG9yIGhhcyBub3QgdGhlIG5hbWUgb2YgdGhlIHR5cGUsCisJCS8vY29udmVydCBpdCBpbnRvIGEgbWV0aG9kIHdpdGggJ251bGwnIGFzIGl0cyByZXR1cm4gdHlwZQorCQlib29sZWFuIGhhc0NvbnN0cnVjdG9yID0gZmFsc2U7CisJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBhbTsKKwkJCQlpZiAoKGFtID0gbWV0aG9kc1tpXSkuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoYW0uc2VsZWN0b3IsIG5hbWUpKSB7CisJCQkJCQkvLyB0aGUgY29uc3RydWN0b3Igd2FzIGluIGZhY3QgYSBtZXRob2Qgd2l0aCBubyByZXR1cm4gdHlwZQorCQkJCQkJLy8gdW5sZXNzIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgd2FzIHN1cHBsaWVkCisJCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGMgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYW07CisJCQkJCQlpZiAoKGMuY29uc3RydWN0b3JDYWxsID09IG51bGwpCisJCQkJCQkJfHwgKGMuY29uc3RydWN0b3JDYWxsLmlzSW1wbGljaXRTdXBlcigpKSkgeyAvL2NoYW5nZWQgdG8gYSBtZXRob2QKKwkJCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25SZXN1bHQpOworCQkJCQkJCW0uc291cmNlU3RhcnQgPSBjLnNvdXJjZVN0YXJ0OworCQkJCQkJCW0uc291cmNlRW5kID0gYy5zb3VyY2VFbmQ7CisJCQkJCQkJbS5ib2R5U3RhcnQgPSBjLmJvZHlTdGFydDsKKwkJCQkJCQltLmJvZHlFbmQgPSBjLmJvZHlFbmQ7CisJCQkJCQkJbS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGMuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQkJCQkJbS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gYy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQkJCQkJCW0uc2VsZWN0b3IgPSBjLnNlbGVjdG9yOworCQkJCQkJCW0uc3RhdGVtZW50cyA9IGMuc3RhdGVtZW50czsKKwkJCQkJCQltLm1vZGlmaWVycyA9IGMubW9kaWZpZXJzOworCQkJCQkJCW0uYXJndW1lbnRzID0gYy5hcmd1bWVudHM7CisJCQkJCQkJbS50aHJvd25FeGNlcHRpb25zID0gYy50aHJvd25FeGNlcHRpb25zOworCQkJCQkJCW0uZXhwbGljaXREZWNsYXJhdGlvbnMgPSBjLmV4cGxpY2l0RGVjbGFyYXRpb25zOworCQkJCQkJCW0ucmV0dXJuVHlwZSA9IG51bGw7CisJCQkJCQkJbWV0aG9kc1tpXSA9IG07CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAodGhpcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQkJLy8gcmVwb3J0IHRoZSBwcm9ibGVtIGFuZCBjb250aW51ZSB0aGUgcGFyc2luZworCQkJCQkJCXBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKS5pbnRlcmZhY2VDYW5ub3RIYXZlQ29uc3RydWN0b3JzKAorCQkJCQkJCQkoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYW0pOworCQkJCQkJfQorCQkJCQkJaGFzQ29uc3RydWN0b3IgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBoYXNDb25zdHJ1Y3RvcjsKKwl9CisKKwlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQoKSB7CisKKwkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25SZXN1bHQ7CisJfQorCisJcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY3JlYXRlc0ludGVybmFsQ29uc3RydWN0b3IoCisJCWJvb2xlYW4gbmVlZEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLAorCQlib29sZWFuIG5lZWRUb0luc2VydCkgeworCisJCS8vQWRkIHRvIG1ldGhvZCdzZXQsIHRoZSBkZWZhdWx0IGNvbnN0dWN0b3IgdGhhdCBqdXN0IHJlY2FsbCB0aGUKKwkJLy9zdXBlciBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cworCQkvL1RoZSBhcmd1bWVudHMnIHR5cGUgd2lsbCBiZSBwb3NpdGlvbm5lZCBieSB0aGUgVEMgc28ganVzdCB1c2UKKwkJLy90aGUgZGVmYXVsdCBpbnQgaW5zdGVhZCBvZiBqdXN0IG51bGwgKGNvbnNpc3RlbmN5IHB1cnBvc2UpCisKKwkJLy90aGUgY29uc3RydWN0b3IKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25SZXN1bHQpOworCQljb25zdHJ1Y3Rvci5pc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7CisJCWNvbnN0cnVjdG9yLnNlbGVjdG9yID0gbmFtZTsKKwkJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KSB7CisJCQljb25zdHJ1Y3Rvci5tb2RpZmllcnMgPQorCQkJCSgodGhpcyBpbnN0YW5jZW9mIE1lbWJlclR5cGVEZWNsYXJhdGlvbikgJiYgKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDApCisJCQkJCT8gQWNjRGVmYXVsdAorCQkJCQk6IG1vZGlmaWVycyAmIEFjY1Zpc2liaWxpdHlNQVNLOworCQl9CisKKwkJLy9pZiB5b3UgY2hhbmdlIHRoaXMgc2V0dGluZywgcGxlYXNlIHVwZGF0ZSB0aGUgCisJCS8vU291cmNlSW5kZXhlcjIuYnVpbGRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uLGNoYXJbXSkgbWV0aG9kCisJCWNvbnN0cnVjdG9yLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBjb25zdHJ1Y3Rvci5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQljb25zdHJ1Y3Rvci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9CisJCQljb25zdHJ1Y3Rvci5zb3VyY2VFbmQgPSBjb25zdHJ1Y3Rvci5ib2R5RW5kID0gc291cmNlRW5kOworCisJCS8vdGhlIHN1cGVyIGNhbGwgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvcgorCQlpZiAobmVlZEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB7CisJCQljb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPQorCQkJCW5ldyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKTsKKwkJCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJfQorCisJCS8vYWRkaW5nIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGUgbWV0aG9kcyBsaXN0CisJCWlmIChuZWVkVG9JbnNlcnQpIHsKKwkJCWlmIChtZXRob2RzID09IG51bGwpIHsKKwkJCQltZXRob2RzID0gbmV3IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSB7IGNvbnN0cnVjdG9yIH07CisJCQl9IGVsc2UgeworCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBuZXdNZXRob2RzOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCW1ldGhvZHMsCisJCQkJCTAsCisJCQkJCW5ld01ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvblttZXRob2RzLmxlbmd0aCArIDFdLAorCQkJCQkxLAorCQkJCQltZXRob2RzLmxlbmd0aCk7CisJCQkJbmV3TWV0aG9kc1swXSA9IGNvbnN0cnVjdG9yOworCQkJCW1ldGhvZHMgPSBuZXdNZXRob2RzOworCQkJfQorCQl9CisJCXJldHVybiBjb25zdHJ1Y3RvcjsKKwl9CisKKwkvKioKKwkgKiBJTlRFUk5BTCBVU0UgT05MWSAtIENyZWF0ZXMgYSBmYWtlIG1ldGhvZCBkZWNsYXJhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZy4KKwkgKiBJdCBpcyB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgZm9yIG1pc3NpbmcgYWJzdHJhY3QgbWV0aG9kcy4KKwkgKi8KKwlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gYWRkTWlzc2luZ0Fic3RyYWN0TWV0aG9kRm9yKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnM7CisJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudFR5cGVzLmxlbmd0aDsKKwkJLy90aGUgY29uc3RydWN0b3IKKwkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblJlc3VsdCk7CisJCW1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yID0gbWV0aG9kQmluZGluZy5zZWxlY3RvcjsKKwkJbWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kID0gc291cmNlRW5kOworCQltZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBtZXRob2RCaW5kaW5nLmdldEFjY2Vzc0ZsYWdzKCkgJiB+QWNjQWJzdHJhY3Q7CisKKwkJaWYgKGFyZ3VtZW50c0xlbmd0aCA+IDApIHsKKwkJCVN0cmluZyBiYXNlTmFtZSA9ICJhcmciOy8vJE5PTi1OTFMtMSQKKwkJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gKG1ldGhvZERlY2xhcmF0aW9uLmFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFthcmd1bWVudHNMZW5ndGhdKTsKKwkJCWZvciAoaW50IGkgPSBhcmd1bWVudHNMZW5ndGg7IC0taSA+PSAwOykgeworCQkJCWFyZ3VtZW50c1tpXSA9IG5ldyBBcmd1bWVudCgoYmFzZU5hbWUgKyBpKS50b0NoYXJBcnJheSgpLCAwTCwgbnVsbCAvKnR5cGUgcmVmKi8sIEFjY0RlZmF1bHQpOworCQkJfQorCQl9CisKKwkJLy9hZGRpbmcgdGhlIGNvbnN0cnVjdG9yIGluIHRoZSBtZXRob2RzIGxpc3QKKwkJaWYgKHRoaXMubWlzc2luZ0Fic3RyYWN0TWV0aG9kcyA9PSBudWxsKSB7CisJCQl0aGlzLm1pc3NpbmdBYnN0cmFjdE1ldGhvZHMgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb25bXSB7IG1ldGhvZERlY2xhcmF0aW9uIH07CisJCX0gZWxzZSB7CisJCQlNZXRob2REZWNsYXJhdGlvbltdIG5ld01ldGhvZHM7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXRoaXMubWlzc2luZ0Fic3RyYWN0TWV0aG9kcywKKwkJCQkwLAorCQkJCW5ld01ldGhvZHMgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb25bdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzLmxlbmd0aCArIDFdLAorCQkJCTEsCisJCQkJdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzLmxlbmd0aCk7CisJCQluZXdNZXRob2RzWzBdID0gbWV0aG9kRGVjbGFyYXRpb247CisJCQl0aGlzLm1pc3NpbmdBYnN0cmFjdE1ldGhvZHMgPSBuZXdNZXRob2RzOworCQl9CisKKwkJLy89PT09PT09PT09PT1CSU5ESU5HIFVQREFURT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZygKKwkJCQltZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMsIC8vbWV0aG9kRGVjbGFyYXRpb24KKwkJCQltZXRob2RCaW5kaW5nLnNlbGVjdG9yLAorCQkJCW1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwKKwkJCQlhcmd1bWVudHNMZW5ndGggPT0gMCA/IE5vUGFyYW1ldGVycyA6IGFyZ3VtZW50VHlwZXMsIC8vYXJndW1lbnRzIGJpbmRpbmdzCisJCQkJbWV0aG9kQmluZGluZy50aHJvd25FeGNlcHRpb25zLCAvL2V4Y2VwdGlvbnMKKwkJCQliaW5kaW5nKTsgLy9kZWNsYXJpbmdDbGFzcworCQkJCQorCQltZXRob2REZWNsYXJhdGlvbi5zY29wZSA9IG5ldyBNZXRob2RTY29wZShzY29wZSwgbWV0aG9kRGVjbGFyYXRpb24sIHRydWUpOworCQltZXRob2REZWNsYXJhdGlvbi5iaW5kQXJndW1lbnRzKCk7CisKKy8qCQlpZiAoYmluZGluZy5tZXRob2RzID09IG51bGwpIHsKKwkJCWJpbmRpbmcubWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW10geyBtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nIH07CisJCX0gZWxzZSB7CisJCQlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kczsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYmluZGluZy5tZXRob2RzLAorCQkJCTAsCisJCQkJbmV3TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2JpbmRpbmcubWV0aG9kcy5sZW5ndGggKyAxXSwKKwkJCQkxLAorCQkJCWJpbmRpbmcubWV0aG9kcy5sZW5ndGgpOworCQkJbmV3TWV0aG9kc1swXSA9IG1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmc7CisJCQliaW5kaW5nLm1ldGhvZHMgPSBuZXdNZXRob2RzOworCQl9Ki8KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247CisJfQorCQorCS8qCisJICogRmluZCB0aGUgbWF0Y2hpbmcgcGFyc2Ugbm9kZSwgYW5zd2VycyBudWxsIGlmIG5vdGhpbmcgZm91bmQKKwkgKi8KKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbk9mKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKKworCQlpZiAoZmllbGRCaW5kaW5nICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsOworCQkJCWlmICgoZmllbGREZWNsID0gdGhpcy5maWVsZHNbaV0pLmJpbmRpbmcgPT0gZmllbGRCaW5kaW5nKQorCQkJCQlyZXR1cm4gZmllbGREZWNsOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogRmluZCB0aGUgbWF0Y2hpbmcgcGFyc2Ugbm9kZSwgYW5zd2VycyBudWxsIGlmIG5vdGhpbmcgZm91bmQKKwkgKi8KKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uT2YoTWVtYmVyVHlwZUJpbmRpbmcgbWVtYmVyVHlwZUJpbmRpbmcpIHsKKworCQlpZiAobWVtYmVyVHlwZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2w7CisJCQkJaWYgKChtZW1iZXJUeXBlRGVjbCA9IHRoaXMubWVtYmVyVHlwZXNbaV0pLmJpbmRpbmcgPT0gbWVtYmVyVHlwZUJpbmRpbmcpCisJCQkJCXJldHVybiBtZW1iZXJUeXBlRGVjbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEZpbmQgdGhlIG1hdGNoaW5nIHBhcnNlIG5vZGUsIGFuc3dlcnMgbnVsbCBpZiBub3RoaW5nIGZvdW5kCisJICovCisJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gZGVjbGFyYXRpb25PZihNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKworCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5tZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsOworCisJCQkJaWYgKChtZXRob2REZWNsID0gdGhpcy5tZXRob2RzW2ldKS5iaW5kaW5nID09IG1ldGhvZEJpbmRpbmcpCisJCQkJCXJldHVybiBtZXRob2REZWNsOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogRmluZHMgdGhlIG1hdGNoaW5nIHR5cGUgYW1vdW5nIHRoaXMgdHlwZSdzIG1lbWJlciB0eXBlcy4KKwkgKiBSZXR1cm5zIG51bGwgaWYgbm8gdHlwZSB3aXRoIHRoaXMgbmFtZSBpcyBmb3VuZC4KKwkgKiBUaGUgdHlwZSBuYW1lIGlzIGEgY29tcG91bmQgbmFtZSByZWxhdGl2ZSB0byB0aGlzIHR5cGUKKwkgKiBlZy4gaWYgdGhpcyB0eXBlIGlzIFggYW5kIHdlJ3JlIGxvb2tpbmcgZm9yIFkuWC5BLkIKKwkgKiAgICAgdGhlbiBhIHR5cGUgbmFtZSB3b3VsZCBiZSB7WCwgQSwgQn0KKwkgKi8KKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uT2ZUeXBlKGNoYXJbXVtdIHR5cGVOYW1lKSB7CisKKwkJaW50IHR5cGVOYW1lTGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQlpZiAodHlwZU5hbWVMZW5ndGggPCAxIHx8ICFDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlTmFtZVswXSwgdGhpcy5uYW1lKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHR5cGVOYW1lTGVuZ3RoID09IDEpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWNoYXJbXVtdIHN1YlR5cGVOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWVMZW5ndGggLSAxXVtdOworCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVOYW1lLCAxLCBzdWJUeXBlTmFtZSwgMCwgdHlwZU5hbWVMZW5ndGggLSAxKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0aGlzLm1lbWJlclR5cGVzW2ldLmRlY2xhcmF0aW9uT2ZUeXBlKHN1YlR5cGVOYW1lKTsKKwkJCWlmICh0eXBlRGVjbCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHR5cGVEZWNsOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEdlbmVyaWMgYnl0ZWNvZGUgZ2VuZXJhdGlvbiBmb3IgdHlwZQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlKSB7CisKKwkJaWYgKGhhc0JlZW5HZW5lcmF0ZWQpCisJCQlyZXR1cm47CisJCWhhc0JlZW5HZW5lcmF0ZWQgPSB0cnVlOworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJCWlmIChiaW5kaW5nID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJQ2xhc3NGaWxlLmNyZWF0ZVByb2JsZW1UeXBlKAorCQkJCXRoaXMsCisJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOworCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQkvLyBjcmVhdGUgdGhlIHJlc3VsdCBmb3IgYSBjb21waWxlZCB0eXBlCisJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gbmV3IENsYXNzRmlsZShiaW5kaW5nLCBlbmNsb3NpbmdDbGFzc0ZpbGUsIGZhbHNlKTsKKwkJCS8vIGdlbmVyYXRlIGFsbCBmaWVscworCQkJY2xhc3NGaWxlLmFkZEZpZWxkSW5mb3MoKTsKKworCQkJLy8gcmVjb3JkIHRoZSBpbm5lciB0eXBlIGluc2lkZSBpdHMgb3duIC5jbGFzcyBmaWxlIHRvIGJlIGFibGUKKwkJCS8vIHRvIGdlbmVyYXRlIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlcworCQkJaWYgKGJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpCisJCQkJY2xhc3NGaWxlLnJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKGJpbmRpbmcpOworCQkJaWYgKGJpbmRpbmcuaXNMb2NhbFR5cGUoKSkgeworCQkJCWVuY2xvc2luZ0NsYXNzRmlsZS5yZWNvcmROZXN0ZWRMb2NhbEF0dHJpYnV0ZShiaW5kaW5nKTsKKwkJCQljbGFzc0ZpbGUucmVjb3JkTmVzdGVkTG9jYWxBdHRyaWJ1dGUoYmluZGluZyk7CisJCQl9CisJCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkvLyByZWNvcmQgdGhlIGlubmVyIHR5cGUgaW5zaWRlIGl0cyBvd24gLmNsYXNzIGZpbGUgdG8gYmUgYWJsZQorCQkJCQkvLyB0byBnZW5lcmF0ZSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZXMKKwkJCQkJY2xhc3NGaWxlLnJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShtZW1iZXJUeXBlc1tpXS5iaW5kaW5nKTsKKwkJCQkJbWVtYmVyVHlwZXNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjbGFzc0ZpbGUpOworCQkJCX0KKwkJCX0KKwkJCS8vIGdlbmVyYXRlIGFsbCBtZXRob2RzCisJCQljbGFzc0ZpbGUuc2V0Rm9yTWV0aG9kSW5mb3MoKTsKKwkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQltZXRob2RzW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY2xhc3NGaWxlKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWNsYXNzRmlsZS5nZW5lcmF0ZU1pc3NpbmdBYnN0cmFjdE1ldGhvZHModGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzLCBzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CisKKwkJCS8vIGdlbmVyYXRlIGFsbCBtZXRob2RzCisJCQljbGFzc0ZpbGUuYWRkU3BlY2lhbE1ldGhvZHMoKTsKKworCQkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7IC8vIHRyaWdnZXIgcHJvYmxlbSB0eXBlIGdlbmVyYXRpb24gZm9yIGNvZGUgZ2VuIGVycm9ycworCQkJCXRocm93IG5ldyBBYm9ydFR5cGUoc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOworCQkJfQorCisJCQkvLyBmaW5hbGl6ZSB0aGUgY29tcGlsZWQgdHlwZSByZXN1bHQKKwkJCWNsYXNzRmlsZS5hZGRBdHRyaWJ1dGVzKCk7CisJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5yZWNvcmQoCisJCQkJYmluZGluZy5jb25zdGFudFBvb2xOYW1lKCksCisJCQkJY2xhc3NGaWxlKTsKKwkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKKwkJCWlmIChiaW5kaW5nID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJQ2xhc3NGaWxlLmNyZWF0ZVByb2JsZW1UeXBlKAorCQkJCXRoaXMsCisJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfQorCisJLyoqCisJICogQnl0ZWNvZGUgZ2VuZXJhdGlvbiBmb3IgYSBsb2NhbCBpbm5lciB0eXBlIChBUEkgYXMgYSBub3JtYWwgc3RhdGVtZW50IGNvZGUgZ2VuKQorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGJsb2NrU2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmIChoYXNCZWVuR2VuZXJhdGVkKQorCQkJcmV0dXJuOworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQkoKE5lc3RlZFR5cGVCaW5kaW5nKSBiaW5kaW5nKS5jb21wdXRlU3ludGhldGljQXJndW1lbnRzT2Zmc2V0KCk7CisJCX0KKwkJZ2VuZXJhdGVDb2RlKGNvZGVTdHJlYW0uY2xhc3NGaWxlKTsKKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwkvKioKKwkgKiBCeXRlY29kZSBnZW5lcmF0aW9uIGZvciBhIG1lbWJlciBpbm5lciB0eXBlCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGVuY2xvc2luZ0NsYXNzRmlsZSkgeworCisJCWlmIChoYXNCZWVuR2VuZXJhdGVkKQorCQkJcmV0dXJuOworCQkoKE5lc3RlZFR5cGVCaW5kaW5nKSBiaW5kaW5nKS5jb21wdXRlU3ludGhldGljQXJndW1lbnRzT2Zmc2V0KCk7CisJCWdlbmVyYXRlQ29kZShlbmNsb3NpbmdDbGFzc0ZpbGUpOworCX0KKworCS8qKgorCSAqIEJ5dGVjb2RlIGdlbmVyYXRpb24gZm9yIGEgcGFja2FnZSBtZW1iZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlKSB7CisKKwkJZ2VuZXJhdGVDb2RlKChDbGFzc0ZpbGUpIG51bGwpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworCisJCXJldHVybiAobW9kaWZpZXJzICYgQWNjSW50ZXJmYWNlKSAhPSAwOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKKwkJcmV0dXJuIHRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb247CisJfQorCisJLyoqCisJICogQSA8Y2xpbml0PiB3aWxsIGJlIHJlcXVlc3RlZCBhcyBzb29uIGFzIHN0YXRpYyBmaWVsZHMgb3IgYXNzZXJ0aW9ucyBhcmUgcHJlc2VudC4gSXQgd2lsbCBiZSBlbGltaW5hdGVkIGR1cmluZworCSAqIGNsYXNzZmlsZSBjcmVhdGlvbiBpZiBubyBieXRlY29kZSB3YXMgYWN0dWFsbHkgcHJvZHVjZWQgYmFzZWQgb24gc29tZSBvcHRpbWl6YXRpb25zL2NvbXBpbGVyIHNldHRpbmdzLgorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIG5lZWRDbGFzc0luaXRNZXRob2QoKSB7CisKKwkJLy8gYWx3YXlzIG5lZWQgYSA8Y2xpbml0PiB3aGVuIGFzc2VydGlvbnMgYXJlIHByZXNlbnQKKwkJaWYgKCh0aGlzLmJpdHMgJiBBZGRBc3NlcnRpb25NQVNLKSAhPSAwKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChmaWVsZHMgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGlzSW50ZXJmYWNlKCkpCisJCQlyZXR1cm4gdHJ1ZTsgLy8gZmllbGRzIGFyZSBpbXBsaWNpdGx5IHN0YXRpY3MKKwkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IC0taSA+PSAwOykgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKKwkJCS8vbmVlZCB0byB0ZXN0IHRoZSBtb2RpZmllciBkaXJlY3RseSB3aGlsZSB0aGVyZSBpcyBubyBiaW5kaW5nIHlldAorCQkJaWYgKChmaWVsZC5tb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDApCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHBhcnNlTWV0aG9kKFBhcnNlciBwYXJzZXIsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKworCQkvL2Nvbm5lY3QgbWV0aG9kIGJvZGllcworCQlpZiAodW5pdC5pZ25vcmVNZXRob2RCb2RpZXMpCisJCQlyZXR1cm47CisKKwkJLy8gbm8gc2NvcGUgd2VyZSBjcmVhdGVkLCBzbyBjYW5ub3QgcmVwb3J0IGZ1cnRoZXIgZXJyb3JzCisvLwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKKy8vCQkJcmV0dXJuOworCisJCS8vbWVtYmVycworCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IG1lbWJlclR5cGVzLmxlbmd0aDsgLS1pID49IDA7KQorCQkJCW1lbWJlclR5cGVzW2ldLnBhcnNlTWV0aG9kKHBhcnNlciwgdW5pdCk7CisJCX0KKworCQkvL21ldGhvZHMKKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IG1ldGhvZHMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQkJbWV0aG9kc1tpXS5wYXJzZVN0YXRlbWVudHMocGFyc2VyLCB1bml0KTsKKwkJfQorCisJCS8vaW5pdGlhbGl6ZXJzCisJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IC0taSA+PSAwOykgeworCQkJCWlmIChmaWVsZHNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplcikgeworCQkJCQkoKEluaXRpYWxpemVyKSBmaWVsZHNbaV0pLnBhcnNlU3RhdGVtZW50cyhwYXJzZXIsIHRoaXMsIHVuaXQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoKSB7CisKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCS8vIGNoZWNrIHN1cGVyY2xhc3MgJiBpbnRlcmZhY2VzCisJCQlpZiAoYmluZGluZy5zdXBlcmNsYXNzICE9IG51bGwpIC8vIHdhdGNoIG91dCBmb3IgT2JqZWN0ICEgKGFuZCBvdGhlciByb290cykJCisJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQoYmluZGluZy5zdXBlcmNsYXNzLCBzY29wZSkpCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKGJpbmRpbmcuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7CisJCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpCisJCQkJZm9yIChpbnQgaSA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCQkJaWYgKHN1cGVySW50ZXJmYWNlc1tpXS5iaW5kaW5nICE9IG51bGwpCisJCQkJCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChzdXBlckludGVyZmFjZXNbaV0uYmluZGluZywgc2NvcGUpKQorCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKAorCQkJCQkJCQlzdXBlckludGVyZmFjZXNbaV0uYmluZGluZywKKwkJCQkJCQkJc3VwZXJJbnRlcmZhY2VzW2ldKTsKKwkJCW1heEZpZWxkQ291bnQgPSAwOworCQkJaW50IGxhc3RGaWVsZElEID0gLTE7CisJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGRzW2ldOworCQkJCQlpZiAoZmllbGQuaXNGaWVsZCgpKSB7CisJCQkJCQlpZiAoZmllbGQuYmluZGluZyA9PSBudWxsKSB7CisJCQkJCQkJaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJbWF4RmllbGRDb3VudCsrOworCQkJCQkJbGFzdEZpZWxkSUQgPSBmaWVsZC5iaW5kaW5nLmlkOworCQkJCQl9IGVsc2UgeyAvLyBpbml0aWFsaXplcgorCQkJCQkJICgoSW5pdGlhbGl6ZXIpIGZpZWxkKS5sYXN0RmllbGRJRCA9IGxhc3RGaWVsZElEICsgMTsKKwkJCQkJfQorCQkJCQlmaWVsZC5yZXNvbHZlKGZpZWxkLmlzU3RhdGljKCkgPyBzdGF0aWNJbml0aWFsaXplclNjb3BlIDogaW5pdGlhbGl6ZXJTY29wZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpCisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykKKwkJCQkJbWVtYmVyVHlwZXNbaV0ucmVzb2x2ZShzY29wZSk7CisJCQlpZiAobWV0aG9kcyAhPSBudWxsKQorCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykKKwkJCQkJbWV0aG9kc1tpXS5yZXNvbHZlKHNjb3BlKTsKKwkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKKwkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCQkJcmV0dXJuOworCQl9OworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJCS8vIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24KKworCQkvLyBuZWVkIHRvIGJ1aWxkIGl0cyBzY29wZSBmaXJzdCBhbmQgcHJvY2VlZCB3aXRoIGJpbmRpbmcncyBjcmVhdGlvbgorCQlibG9ja1Njb3BlLmFkZExvY2FsVHlwZSh0aGlzKTsKKworCQkvLyBhbmQgVEMuLi4uCisJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCS8vIGJpbmRpbmcgaXMgbm90IHNldCBpZiB0aGUgcmVjZWl2ZXIgY291bGQgbm90IGJlIGNyZWF0ZWQKKwkJCXJlc29sdmUoKTsKKwkJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoQ2xhc3NTY29wZSB1cHBlclNjb3BlKSB7CisJCS8vIG1lbWJlciBzY29wZXMgYXJlIGFscmVhZHkgY3JlYXRlZAorCQkvLyByZXF1ZXN0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgYSBiaW5kaW5nIGlmIGxvY2FsIG1lbWJlciB0eXBlCisKKwkJcmVzb2x2ZSgpOworCQl1cGRhdGVNYXhGaWVsZENvdW50KCk7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShDb21waWxhdGlvblVuaXRTY29wZSB1cHBlclNjb3BlKSB7CisJCS8vIHRvcCBsZXZlbCA6IHNjb3BlIGFyZSBhbHJlYWR5IGNyZWF0ZWQKKworCQlyZXNvbHZlKCk7CisJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0YWdBc0hhdmluZ0Vycm9ycygpIHsKKwkJaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCXJldHVybiB0YWJTdHJpbmcodGFiKSArIHRvU3RyaW5nSGVhZGVyKCkgKyB0b1N0cmluZ0JvZHkodGFiKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nQm9keShpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSAiIHsiOyAvLyROT04tTkxTLTEkCisJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKG1lbWJlclR5cGVzW2ldICE9IG51bGwpIHsKKwkJCQkJcyArPSAiXG4iICsgbWVtYmVyVHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBmaWVsZEkgPSAwOyBmaWVsZEkgPCBmaWVsZHMubGVuZ3RoOyBmaWVsZEkrKykgeworCQkJCWlmIChmaWVsZHNbZmllbGRJXSAhPSBudWxsKSB7CisJCQkJCXMgKz0gIlxuIiArIGZpZWxkc1tmaWVsZEldLnRvU3RyaW5nKHRhYiArIDEpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChmaWVsZHNbZmllbGRJXS5pc0ZpZWxkKCkpCisJCQkJCQlzICs9ICI7IjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobWV0aG9kc1tpXSAhPSBudWxsKSB7CisJCQkJCXMgKz0gIlxuIiArIG1ldGhvZHNbaV0udG9TdHJpbmcodGFiICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJcyArPSAiXG4iICsgdGFiU3RyaW5nKHRhYikgKyAifSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nSGVhZGVyKCkgeworCisJCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1vZGlmaWVycyAhPSBBY2NEZWZhdWx0KSB7CisJCQlzICs9IG1vZGlmaWVyc1N0cmluZyhtb2RpZmllcnMpOworCQl9CisJCXMgKz0gKGlzSW50ZXJmYWNlKCkgPyAiaW50ZXJmYWNlICIgOiAiY2xhc3MgIikgKyBuZXcgU3RyaW5nKG5hbWUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKQorCQkJcyArPSAiIGV4dGVuZHMgIiArIHN1cGVyY2xhc3MudG9TdHJpbmcoMCk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsICYmIHN1cGVySW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisJCQlzICs9IChpc0ludGVyZmFjZSgpID8gIiBleHRlbmRzICIgOiAiIGltcGxlbWVudHMgIik7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJCXMgKz0gc3VwZXJJbnRlcmZhY2VzW2ldLnRvU3RyaW5nKDApOworCQkJCWlmIChpICE9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGggLSAxKQorCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCX07CisJCX07CisJCXJldHVybiBzOworCX0KKworCS8qKgorCSAqCUl0ZXJhdGlvbiBmb3IgYSBwYWNrYWdlIG1lbWJlciB0eXBlCisJICoKKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwKKwkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlKSB7CisKKwkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgdW5pdFNjb3BlKSkgeworCQkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpCisJCQkJCXN1cGVyY2xhc3MudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCQlpbnQgc3VwZXJJbnRlcmZhY2VMZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlTGVuZ3RoOyBpKyspCisJCQkJCQlzdXBlckludGVyZmFjZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCX0KKwkJCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJCQlpbnQgbWVtYmVyVHlwZXNMZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXNMZW5ndGg7IGkrKykKKwkJCQkJCW1lbWJlclR5cGVzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKKwkJCQl9CisJCQkJaWYgKGZpZWxkcyAhPSBudWxsKSB7CisJCQkJCWludCBmaWVsZHNMZW5ndGggPSBmaWVsZHMubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc0xlbmd0aDsgaSsrKSB7CisJCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkOworCQkJCQkJaWYgKChmaWVsZCA9IGZpZWxkc1tpXSkuaXNTdGF0aWMoKSkgeworCQkJCQkJCWZpZWxkLnRyYXZlcnNlKHZpc2l0b3IsIHN0YXRpY0luaXRpYWxpemVyU2NvcGUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlmaWVsZC50cmF2ZXJzZSh2aXNpdG9yLCBpbml0aWFsaXplclNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJCWludCBtZXRob2RzTGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kc0xlbmd0aDsgaSsrKQorCQkJCQkJbWV0aG9kc1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydFR5cGUgZSkgeworCQl9CisJfQorCisJLyoqCisJICogTWF4RmllbGRDb3VudCdzIGNvbXB1dGF0aW9uIGlzIG5lY2Vzc2FyeSBzbyBhcyB0byByZXNlcnZlIHNwYWNlIGZvcgorCSAqIHRoZSBmbG93IGluZm8gZmllbGQgcG9ydGlvbnMuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBtYXhpbXVtIGFtb3VudCBvZgorCSAqIGZpZWxkcyB0aGlzIGNsYXNzIG9yIG9uZSBvZiBpdHMgaW5uZXJ0eXBlcyBoYXZlLgorCSAqCisJICogRHVyaW5nIG5hbWUgcmVzb2x1dGlvbiwgdHlwZXMgYXJlIHRyYXZlcnNlZCwgYW5kIHRoZSBtYXggZmllbGQgY291bnQgaXMgcmVjb3JkZWQKKwkgKiBvbiB0aGUgb3V0ZXJtb3N0IHR5cGUuIEl0IGlzIHRoZW4gcHJvcGFnYXRlZCBkb3duIGR1cmluZyB0aGUgZmxvdyBhbmFseXNpcy4KKwkgKgorCSAqIFRoaXMgbWV0aG9kIGlzIGRvaW5nIGVpdGhlciB1cC9kb3duIHByb3BhZ2F0aW9uLgorCSAqLworCXZvaWQgdXBkYXRlTWF4RmllbGRDb3VudCgpIHsKKworCQlpZiAoYmluZGluZyA9PSBudWxsKQorCQkJcmV0dXJuOyAvLyBlcnJvciBzY2VuYXJpbworCQlUeXBlRGVjbGFyYXRpb24gb3V0ZXJNb3N0VHlwZSA9IHNjb3BlLm91dGVyTW9zdENsYXNzU2NvcGUoKS5yZWZlcmVuY2VUeXBlKCk7CisJCWlmIChtYXhGaWVsZENvdW50ID4gb3V0ZXJNb3N0VHlwZS5tYXhGaWVsZENvdW50KSB7CisJCQlvdXRlck1vc3RUeXBlLm1heEZpZWxkQ291bnQgPSBtYXhGaWVsZENvdW50OyAvLyB1cAorCQl9IGVsc2UgeworCQkJbWF4RmllbGRDb3VudCA9IG91dGVyTW9zdFR5cGUubWF4RmllbGRDb3VudDsgLy8gZG93bgorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVSZWZlcmVuY2UgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwlwdWJsaWMgVHlwZUJpbmRpbmcgYmluZGluZzsKK3B1YmxpYyBUeXBlUmVmZXJlbmNlKCkgeworCQlzdXBlciAoKSA7CisJCX0KKy8vIGFsbG93cyB1cyB0byB0cmFwIGNvbXBsZXRpb24gJiBzZWxlY3Rpb24gbm9kZXMKKworcHVibGljIHZvaWQgYWJvdXRUb1Jlc29sdmUoU2NvcGUgc2NvcGUpIHt9CisvKgorICogQW5zd2VyIGEgYmFzZSB0eXBlIHJlZmVyZW5jZSAoY2FuIGJlIGFuIGFycmF5IG9mIGJhc2UgdHlwZSkuCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVJlZmVyZW5jZSBiYXNlVHlwZVJlZmVyZW5jZShpbnQgYmFzZVR5cGUsIGludCBkaW0pIHsKKwkKKwlpZiAoZGltID09IDApIHsKKwkJc3dpdGNoIChiYXNlVHlwZSkgeworCQkJY2FzZSAoVF92b2lkKSA6CisJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKFZvaWRCaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJY2FzZSAoVF9ib29sZWFuKSA6CisJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKEJvb2xlYW5CaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJY2FzZSAoVF9jaGFyKSA6CisJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKENoYXJCaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJY2FzZSAoVF9mbG9hdCkgOgorCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShGbG9hdEJpbmRpbmcuc2ltcGxlTmFtZSwgMCk7CisJCQljYXNlIChUX2RvdWJsZSkgOgorCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShEb3VibGVCaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJY2FzZSAoVF9ieXRlKSA6CisJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKEJ5dGVCaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJY2FzZSAoVF9zaG9ydCkgOgorCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShTaG9ydEJpbmRpbmcuc2ltcGxlTmFtZSwgMCk7CisJCQljYXNlIChUX2ludCkgOgorCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShJbnRCaW5kaW5nLnNpbXBsZU5hbWUsIDApOworCQkJZGVmYXVsdCA6IC8vVF9sb25nCQorCQkJCXJldHVybiBuZXcgU2luZ2xlVHlwZVJlZmVyZW5jZShMb25nQmluZGluZy5zaW1wbGVOYW1lLCAwKTsKKwkJfQorCX0KKwlzd2l0Y2ggKGJhc2VUeXBlKSB7CisJCWNhc2UgKFRfdm9pZCkgOgorCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoVm9pZEJpbmRpbmcuc2ltcGxlTmFtZSwgZGltLCAwKTsKKwkJY2FzZSAoVF9ib29sZWFuKSA6CisJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShCb29sZWFuQmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCQljYXNlIChUX2NoYXIpIDoKKwkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKENoYXJCaW5kaW5nLnNpbXBsZU5hbWUsIGRpbSwgMCk7CisJCWNhc2UgKFRfZmxvYXQpIDoKKwkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKEZsb2F0QmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCQljYXNlIChUX2RvdWJsZSkgOgorCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoRG91YmxlQmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCQljYXNlIChUX2J5dGUpIDoKKwkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKEJ5dGVCaW5kaW5nLnNpbXBsZU5hbWUsIGRpbSwgMCk7CisJCWNhc2UgKFRfc2hvcnQpIDoKKwkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKFNob3J0QmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCQljYXNlIChUX2ludCkgOgorCQkJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UoSW50QmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCQlkZWZhdWx0IDogLy9UX2xvbmcJCisJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShMb25nQmluZGluZy5zaW1wbGVOYW1lLCBkaW0sIDApOworCX0KK30KK3B1YmxpYyBhYnN0cmFjdCBUeXBlUmVmZXJlbmNlIGNvcHlEaW1zKGludCBkaW0pOworcHVibGljIGludCBkaW1lbnNpb25zKCkgeworCXJldHVybiAwOworfQorcHVibGljIGFic3RyYWN0IFR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKFNjb3BlIHNjb3BlKTsKKy8qKgorICogQHJldHVybiBjaGFyW11bXQorICovCitwdWJsaWMgYWJzdHJhY3QgY2hhciBbXVtdIGdldFR5cGVOYW1lKCkgOworcHVibGljIGJvb2xlYW4gaXNUeXBlUmVmZXJlbmNlKCkgeworCXJldHVybiB0cnVlOworfQorcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkvLyBoYW5kbGUgdGhlIGVycm9yIGhlcmUKKwljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwlpZiAoYmluZGluZyAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCisJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJcmV0dXJuIG51bGw7IC8vIGFscmVhZHkgcmVwb3J0ZWQgZXJyb3IKKwl9IGVsc2UgeworCQliaW5kaW5nID0gZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUodGhpcywgYmluZGluZyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZShiaW5kaW5nLCB0aGlzKTsKKwl9CisJcmV0dXJuIGJpbmRpbmc7Cit9CitwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBDbGFzc1Njb3BlIGNsYXNzU2NvcGUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmFyeUV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4YTgzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwyODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCitwdWJsaWMgY2xhc3MgVW5hcnlFeHByZXNzaW9uIGV4dGVuZHMgT3BlcmF0b3JFeHByZXNzaW9uIHsKKwkKKwlwdWJsaWMgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCXB1YmxpYyBDb25zdGFudCBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CisKKwlwdWJsaWMgVW5hcnlFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IG9wZXJhdG9yKSB7CisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJCXRoaXMuYml0cyB8PSBvcGVyYXRvciA8PCBPcGVyYXRvclNISUZUOyAvLyBlbmNvZGUgb3BlcmF0b3IKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UKSB7CisJCQlyZXR1cm4gZXhwcmVzc2lvbgorCQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJCQkuYXNOZWdhdGVkQ29uZGl0aW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJCX0KKwl9CisKKwlwdWJsaWMgQ29uc3RhbnQgY29uZGl0aW9uYWxDb25zdGFudCgpIHsKKwkJcmV0dXJuIG9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9PSBudWxsID8gY29uc3RhbnQgOiBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CisJfQorCisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciBhbiB1bmFyeSBvcGVyYXRpb24KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisJICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorCSAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlMYWJlbCBmYWxzZUxhYmVsLCBlbmRpZkxhYmVsOworCQlpZiAoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQkvLyBpbmxpbmVkIHZhbHVlCisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQlyZXR1cm47CisJCX0KKwkJc3dpdGNoICgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgeworCQkJY2FzZSBOT1QgOgorCQkJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgLyogcnVudGltZSB0eXBlICovIHsKKwkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJLy8gISA8Ym9vbGVhbj4KKwkJCQkJCS8vIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBjb25kaXRpb24KKwkJCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCQkJCWN1cnJlbnRTY29wZSwKKwkJCQkJCQljb2RlU3RyZWFtLAorCQkJCQkJCW51bGwsCisJCQkJCQkJKGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLAorCQkJCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmljb25zdF8wKCk7CisJCQkJCQkJaWYgKGZhbHNlTGFiZWwuaGFzRm9yd2FyZFJlZmVyZW5jZXMoKSkgeworCQkJCQkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZGlmTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpOworCQkJCQkJCQljb2RlU3RyZWFtLmRlY3JTdGFja1NpemUoMSk7CisJCQkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfMSgpOworCQkJCQkJCQllbmRpZkxhYmVsLnBsYWNlKCk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsgLy8gNjU5NjogaWYgKCEoYSAmJiBiKSl7fSAtIG11c3Qgc3RpbGwgcGxhY2UgZmFsc2VMYWJlbAorCQkJCQkJCWZhbHNlTGFiZWwucGxhY2UoKTsKKwkJCQkJCX0JCQkJCQkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVFdJRERMRSA6CisJCQkJc3dpdGNoIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA+PiA0IC8qIHJ1bnRpbWUgKi8KKwkJCQkJKSB7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJLy8gfmludAorCQkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJY29kZVN0cmVhbS5pY29uc3RfbTEoKTsKKwkJCQkJCQljb2RlU3RyZWFtLml4b3IoKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmxkYzJfdygtMUwpOworCQkJCQkJCWNvZGVTdHJlYW0ubHhvcigpOworCQkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTUlOVVMgOgorCQkJCS8vIC0gPG51bT4KKwkJCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQlzd2l0Y2ggKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID4+IDQgLyogcnVudGltZSAqLworCQkJCQkJCSkgeworCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LmludFZhbHVlKCkgKiAtMSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoY29uc3RhbnQuZmxvYXRWYWx1ZSgpICogLTEuMGYpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoY29uc3RhbnQubG9uZ1ZhbHVlKCkgKiAtMUwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5kb3VibGVWYWx1ZSgpICogLTEuMCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJc3dpdGNoIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA+PiA0IC8qIHJ1bnRpbWUgdHlwZSAqLworCQkJCQkJCSkgeworCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQljb2RlU3RyZWFtLmluZWcoKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQkJY29kZVN0cmVhbS5mbmVnKCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJY29kZVN0cmVhbS5sbmVnKCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQljb2RlU3RyZWFtLmRuZWcoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUExVUyA6CisJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJfQorCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJLyoqCisJICogQm9vbGVhbiBvcGVyYXRvciBjb2RlIGdlbmVyYXRpb24KKwkgKglPcHRpbWl6ZWQgb3BlcmF0aW9ucyBhcmU6ICYmLCB8fCwgPCwgPD0sID4sID49LCAmLCB8LCBeCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCQlMYWJlbCB0cnVlTGFiZWwsCisJCUxhYmVsIGZhbHNlTGFiZWwsCisJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQljb2RlU3RyZWFtLAorCQkJCXRydWVMYWJlbCwKKwkJCQlmYWxzZUxhYmVsLAorCQkJCXZhbHVlUmVxdWlyZWQpOworCQkJcmV0dXJuOworCQl9CisJCWlmICgoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IE5PVCkgeworCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWNvZGVTdHJlYW0sCisJCQkJZmFsc2VMYWJlbCwKKwkJCQl0cnVlTGFiZWwsCisJCQkJdmFsdWVSZXF1aXJlZCk7CisJCX0gZWxzZSB7CisJCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWNvZGVTdHJlYW0sCisJCQkJdHJ1ZUxhYmVsLAorCQkJCWZhbHNlTGFiZWwsCisJCQkJdmFsdWVSZXF1aXJlZCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cHJlc3Npb25UYiA9PSBudWxsKSB7CisJCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWludCBleHByZXNzaW9uSWQgPSBleHByZXNzaW9uVGIuaWQ7CisJCWlmIChleHByZXNzaW9uSWQgPiAxNSkgeworCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgZXhwcmVzc2lvblRiKTsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaW50IHRhYmxlSWQ7CisJCXN3aXRjaCAoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpIHsKKwkJCWNhc2UgTk9UIDoKKwkJCQl0YWJsZUlkID0gQU5EX0FORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVFdJRERMRSA6CisJCQkJdGFibGVJZCA9IExFRlRfU0hJRlQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0YWJsZUlkID0gTUlOVVM7CisJCX0gLy8rIGFuZCAtIGNhc2VzCisKKwkJLy8gdGhlIGNvZGUgaXMgYW4gaW50CisJCS8vIChjYXN0KSAgbGVmdCAgIE9wIChjYXN0KSAgcmlndGggLS0+IHJlc3VsdAorCQkvLyAgMDAwMCAgIDAwMDAgICAgICAgMDAwMCAgIDAwMDAgICAgICAwMDAwCisJCS8vICA8PDE2ICAgPDwxMiAgICAgICA8PDggICAgPDw0ICAgICAgIDw8MAorCQlpbnQgcmVzdWx0ID0gUmVzb2x2ZVR5cGVUYWJsZXNbdGFibGVJZF1bKGV4cHJlc3Npb25JZCA8PCA0KSArIGV4cHJlc3Npb25JZF07CisJCWV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID0gcmVzdWx0ID4+PiAxMjsKKwkJYml0cyB8PSByZXN1bHQgJiAweEY7CisJCXN3aXRjaCAocmVzdWx0ICYgMHhGKSB7IC8vIG9ubHkgc3dpdGNoIG9uIHBvc3NpYmxlIHJlc3VsdCB0eXBlLi4uLi4KKwkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gQm9vbGVhbkJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQkJdGhpcy50eXBlQmluZGluZyA9IEJ5dGVCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2NoYXIgOgorCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBDaGFyQmluZGluZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBEb3VibGVCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQl0aGlzLnR5cGVCaW5kaW5nID0gRmxvYXRCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSBUX2ludCA6CisJCQkJdGhpcy50eXBlQmluZGluZyA9IEludEJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfbG9uZyA6CisJCQkJdGhpcy50eXBlQmluZGluZyA9IExvbmdCaW5kaW5nOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6IC8vZXJyb3IuLi4uLi4uLgorCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJCWlmIChleHByZXNzaW9uSWQgIT0gVF91bmRlZmluZWQpCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRPcGVyYXRvcih0aGlzLCBleHByZXNzaW9uVGIpOworCQkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGNvbXB1dGUgdGhlIGNvbnN0YW50IHdoZW4gdmFsaWQKKwkJaWYgKGV4cHJlc3Npb24uY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQljb25zdGFudCA9CisJCQkJQ29uc3RhbnQuY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKAorCQkJCQlleHByZXNzaW9uLmNvbnN0YW50LAorCQkJCQlleHByZXNzaW9uSWQsCisJCQkJCShiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gTk9UKSB7CisJCQkJQ29uc3RhbnQgY3N0ID0gZXhwcmVzc2lvbi5jb25kaXRpb25hbENvbnN0YW50KCk7CisJCQkJaWYgKGNzdC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pCisJCQkJCW9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSghY3N0LmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbk5vUGFyZW50aGVzaXMoKSB7CisJCXJldHVybiBvcGVyYXRvclRvU3RyaW5nKCkgKyAiICIgKyBleHByZXNzaW9uLnRvU3RyaW5nRXhwcmVzc2lvbigpOyAvLyROT04tTkxTLTEkCisJfSAKKwkKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZSgKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwKKwkJQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7CisJCQlleHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQzMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaGlsZVN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKKworcHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb247CisJcHVibGljIFN0YXRlbWVudCBhY3Rpb247CisJcHJpdmF0ZSBMYWJlbCBicmVha0xhYmVsLCBjb250aW51ZUxhYmVsOworCWludCBwcmVDb25kSW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IG1lcmdlZEluaXRTdGF0ZUluZGV4ID0gLTE7CisKKwlwdWJsaWMgV2hpbGVTdGF0ZW1lbnQoRXhwcmVzc2lvbiBjb25kaXRpb24sIFN0YXRlbWVudCBhY3Rpb24sIGludCBzLCBpbnQgZSkgeworCisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwkJc291cmNlU3RhcnQgPSBzOworCQlzb3VyY2VFbmQgPSBlOworCX0KKworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCisJCWJyZWFrTGFiZWwgPSBuZXcgTGFiZWwoKTsKKwkJY29udGludWVMYWJlbCA9IG5ldyBMYWJlbCgpOworCisJCXByZUNvbmRJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CisJCUxvb3BpbmdGbG93Q29udGV4dCBjb25kTG9vcENvbnRleHQ7CisJCUZsb3dJbmZvIHBvc3RDb25kSW5mbyA9CisJCQljb25kaXRpb24uYW5hbHlzZUNvZGUoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCShjb25kTG9vcENvbnRleHQgPQorCQkJCQluZXcgTG9vcGluZ0Zsb3dDb250ZXh0KGZsb3dDb250ZXh0LCB0aGlzLCBudWxsLCBudWxsLCBjdXJyZW50U2NvcGUpKSwKKwkJCQlmbG93SW5mbyk7CisKKwkJTG9vcGluZ0Zsb3dDb250ZXh0IGxvb3BpbmdDb250ZXh0OworCQlpZiAoKGFjdGlvbiA9PSBudWxsKSB8fCBhY3Rpb24uaXNFbXB0eUJsb2NrKCkpIHsKKwkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChjdXJyZW50U2NvcGUsIHBvc3RDb25kSW5mbyk7CisJCQlpZiAoKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCisJCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgeworCQkJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCQkJfSBlbHNlIHsKKwkJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gcG9zdENvbmRJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB3YXMgaW5saW5lZCB0byBmYWxzZSwgcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIHJlYWNoIGFueSAKKwkJCS8vIHN0YXRlbWVudCBpbnNpZGUgdGhlIGxvb3BpbmcgYWN0aW9uCisJCQlsb29waW5nQ29udGV4dCA9CisJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dCgKKwkJCQkJZmxvd0NvbnRleHQsCisJCQkJCXRoaXMsCisJCQkJCWJyZWFrTGFiZWwsCisJCQkJCWNvbnRpbnVlTGFiZWwsCisJCQkJCWN1cnJlbnRTY29wZSk7CisJCQlGbG93SW5mbyBhY3Rpb25JbmZvID0KKwkJCQkoKGNvbmRpdGlvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCisJCQkJCSYmIChjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQorCQkJCQk/IEZsb3dJbmZvLkRlYWRFbmQKKwkJCQkJOiBwb3N0Q29uZEluZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKTsKKworCQkJLy8gZm9yIGNvbXB1dGluZyBsb2NhbCB2YXIgYXR0cmlidXRlcworCQkJY29uZElmVHJ1ZUluaXRTdGF0ZUluZGV4ID0KKwkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcygKKwkJCQkJcG9zdENvbmRJbmZvLmluaXRzV2hlblRydWUoKSk7CisKKwkJCWlmICghYWN0aW9uSW5mby5jb21wbGFpbklmVW5yZWFjaGFibGUoYWN0aW9uLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJYWN0aW9uSW5mbyA9IGFjdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKTsKKwkJCX0KKworCQkJLy8gY29kZSBnZW5lcmF0aW9uIGNhbiBiZSBvcHRpbWl6ZWQgd2hlbiBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBsb29wCisJCQlpZiAoKChhY3Rpb25JbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGFjdGlvbkluZm8uaXNGYWtlUmVhY2hhYmxlKCkpCisJCQkJJiYgKChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUgPT0gRmxvd0luZm8uRGVhZEVuZCkKKwkJCQkJfHwgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLmlzRmFrZVJlYWNoYWJsZSgpKSkgeworCQkJCWNvbnRpbnVlTGFiZWwgPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3AoY3VycmVudFNjb3BlLCBwb3N0Q29uZEluZm8pOworCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKGN1cnJlbnRTY29wZSwgYWN0aW9uSW5mbyk7CisJCQl9CisJCX0KKworCQkvLyBpbmZpbml0ZSBsb29wCisJCUZsb3dJbmZvIG1lcmdlZEluZm87CisJCWlmICgoY29uZGl0aW9uLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJCSYmIChjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpIHsKKwkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcygKKwkJCQkJbWVyZ2VkSW5mbyA9IGxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhayk7CisJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKwkJfQorCisJCS8vIGVuZCBvZiBsb29wOiBlaXRoZXIgY29uZGl0aW9uIGZhbHNlIG9yIGJyZWFrCisJCW1lcmdlZEluZm8gPQorCQkJcG9zdENvbmRJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKKwkJCQlsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWspOworCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CisJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJcmV0dXJuIG1lcmdlZEluZm87CisJfQorCisJLyoqCisJICogV2hpbGUgY29kZSBnZW5lcmF0aW9uCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWlmICgoYml0cyAmIElzUmVhY2hhYmxlTUFTSykgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWJyZWFrTGFiZWwuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CisKKwkJLy8gZ2VuZXJhdGUgY29uZGl0aW9uCisJCWlmIChjb250aW51ZUxhYmVsID09IG51bGwpIHsKKwkJCS8vIG5vIG5lZWQgdG8gcmV2ZXJzZSBjb25kaXRpb24KKwkJCWlmIChjb25kaXRpb24uY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSB7CisJCQkJY29uZGl0aW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQljb2RlU3RyZWFtLAorCQkJCQludWxsLAorCQkJCQlicmVha0xhYmVsLAorCQkJCQl0cnVlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlTGFiZWwuY29kZVN0cmVhbSA9IGNvZGVTdHJlYW07CisJCQlpZiAoISgoKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCisJCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkKKwkJCQl8fCAoYWN0aW9uID09IG51bGwpCisJCQkJfHwgYWN0aW9uLmlzRW1wdHlCbG9jaygpKSkgeworCQkJCWludCBqdW1wUEMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQkJCWNvZGVTdHJlYW0uZ290b18oY29udGludWVMYWJlbCk7CisJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKGp1bXBQQywgY29uZGl0aW9uLnNvdXJjZVN0YXJ0KTsKKwkJCX0KKwkJfQorCQkvLyBnZW5lcmF0ZSB0aGUgYWN0aW9uCisJCUxhYmVsIGFjdGlvbkxhYmVsOworCQkoYWN0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSkpLnBsYWNlKCk7CisJCWlmIChhY3Rpb24gIT0gbnVsbCkgeworCQkJLy8gUmVxdWlyZWQgdG8gZml4IDFQUjBYVlM6IExGUkU6V0lOTlQgLSBDb21waWxlcjogdmFyaWFibGUgdGFibGUgZm9yIG1ldGhvZCBhcHBlYXJzIGluY29ycmVjdAorCQkJaWYgKGNvbmRJZlRydWVJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJCS8vIGluc2VydCBhbGwgbG9jYWxzIGluaXRpYWxpemVkIGluc2lkZSB0aGUgY29uZGl0aW9uIGludG8gdGhlIGFjdGlvbiBnZW5lcmF0ZWQgcHJpb3IgdG8gdGhlIGNvbmRpdGlvbgorCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCWNvbmRJZlRydWVJbml0U3RhdGVJbmRleCk7CisJCQl9CisJCQlhY3Rpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCQkvLyBNYXkgbG9vc2Ugc29tZSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgOiBhZmZlY3RpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKwkJCWlmIChwcmVDb25kSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKKwkJCQkJY3VycmVudFNjb3BlLAorCQkJCQlwcmVDb25kSW5pdFN0YXRlSW5kZXgpOworCQkJfQorCisJCX0KKwkJLy8gb3V0cHV0IGNvbmRpdGlvbiBhbmQgYnJhbmNoIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVwZWF0ZWQgYWN0aW9uCisJCWlmIChjb250aW51ZUxhYmVsICE9IG51bGwpIHsKKwkJCWNvbnRpbnVlTGFiZWwucGxhY2UoKTsKKwkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJY3VycmVudFNjb3BlLAorCQkJCWNvZGVTdHJlYW0sCisJCQkJYWN0aW9uTGFiZWwsCisJCQkJbnVsbCwKKwkJCQl0cnVlKTsKKwkJfQorCQlicmVha0xhYmVsLnBsYWNlKCk7CisKKwkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCisJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCisJCQkJY3VycmVudFNjb3BlLAorCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4KTsKKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpIHsKKworCQl0aGlzLmJyZWFrTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCXRoaXMuY29udGludWVMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlUeXBlQmluZGluZyB0eXBlID0gY29uZGl0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBCb29sZWFuQmluZGluZyk7CisJCWNvbmRpdGlvbi5pbXBsaWNpdFdpZGVuaW5nKHR5cGUsIHR5cGUpOworCQlpZiAoYWN0aW9uICE9IG51bGwpCisJCQlhY3Rpb24ucmVzb2x2ZShzY29wZSk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKKwkJcyA9IHMgKyAid2hpbGUgKCIgKyBjb25kaXRpb24udG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiKSI7IAkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaWYgKGFjdGlvbiA9PSBudWxsKQorCQkJcyA9IHMgKyAiIHt9IDsiOyAvLyROT04tTkxTLTEkIAorCQllbHNlIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBCbG9jaykKKwkJCXMgPSBzICsgIlxuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKTsgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlzID0gcyArICIge1xuIiArIGFjdGlvbi50b1N0cmluZyh0YWIgKyAxKSArICJ9IjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyB2b2lkIHRyYXZlcnNlKAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAorCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQlpZiAodmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKSkgeworCQkJY29uZGl0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJaWYgKGFjdGlvbiAhPSBudWxsKQorCQkJCWFjdGlvbi50cmF2ZXJzZSh2aXNpdG9yLCBibG9ja1Njb3BlKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhYzFmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ2xhc3NGaWxlQ29uc3RhbnRzIGV4dGVuZHMgSUNvbnN0YW50cyB7CisJCisJaW50IFV0ZjhUYWcgPSAxOworCWludCBJbnRlZ2VyVGFnID0gMzsKKwlpbnQgRmxvYXRUYWcgPSA0OworCWludCBMb25nVGFnID0gNTsKKwlpbnQgRG91YmxlVGFnID0gNjsKKwlpbnQgQ2xhc3NUYWcgPSA3OworCWludCBTdHJpbmdUYWcgPSA4OworCWludCBGaWVsZFJlZlRhZyA9IDk7CisJaW50IE1ldGhvZFJlZlRhZyA9IDEwOworCWludCBJbnRlcmZhY2VNZXRob2RSZWZUYWcgPSAxMTsKKwlpbnQgTmFtZUFuZFR5cGVUYWcgPSAxMjsKKwkKKwlpbnQgQ29uc3RhbnRNZXRob2RSZWZGaXhlZFNpemUgPSA1OworCWludCBDb25zdGFudENsYXNzRml4ZWRTaXplID0gMzsKKwlpbnQgQ29uc3RhbnREb3VibGVGaXhlZFNpemUgPSA5OworCWludCBDb25zdGFudEZpZWxkUmVmRml4ZWRTaXplID0gNTsKKwlpbnQgQ29uc3RhbnRGbG9hdEZpeGVkU2l6ZSA9IDU7CisJaW50IENvbnN0YW50SW50ZWdlckZpeGVkU2l6ZSA9IDU7CisJaW50IENvbnN0YW50SW50ZXJmYWNlTWV0aG9kUmVmRml4ZWRTaXplID0gNTsKKwlpbnQgQ29uc3RhbnRMb25nRml4ZWRTaXplID0gOTsKKwlpbnQgQ29uc3RhbnRTdHJpbmdGaXhlZFNpemUgPSAzOworCWludCBDb25zdGFudFV0ZjhGaXhlZFNpemUgPSAzOworCWludCBDb25zdGFudE5hbWVBbmRUeXBlRml4ZWRTaXplID0gNTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI2YzIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNzg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5OdWxsQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIENsYXNzRmlsZVJlYWRlciBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBJQmluYXJ5VHlwZSB7CisJcHJpdmF0ZSBpbnQgY29uc3RhbnRQb29sQ291bnQ7CisJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzOworCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOworCXByaXZhdGUgY2hhcltdIGNsYXNzTmFtZTsKKwlwcml2YXRlIGNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKKwlwcml2YXRlIGludCBpbnRlcmZhY2VzQ291bnQ7CisJcHJpdmF0ZSBjaGFyW11bXSBpbnRlcmZhY2VOYW1lczsKKwlwcml2YXRlIGludCBmaWVsZHNDb3VudDsKKwlwcml2YXRlIEZpZWxkSW5mb1tdIGZpZWxkczsKKwlwcml2YXRlIGludCBtZXRob2RzQ291bnQ7CisJcHJpdmF0ZSBNZXRob2RJbmZvW10gbWV0aG9kczsKKwlwcml2YXRlIElubmVyQ2xhc3NJbmZvW10gaW5uZXJJbmZvczsKKwlwcml2YXRlIGNoYXJbXSBzb3VyY2VGaWxlTmFtZTsKKwkvLyBpbml0aWFsaXplZCBpbiBjYXNlIHRoZSAuY2xhc3MgZmlsZSBpcyBhIG5lc3RlZCB0eXBlCisJcHJpdmF0ZSBJbm5lckNsYXNzSW5mbyBpbm5lckluZm87CisJcHJpdmF0ZSBjaGFyW10gY2xhc3NGaWxlTmFtZTsKKwlwcml2YXRlIGludCBjbGFzc05hbWVJbmRleDsKKwlwcml2YXRlIGludCBpbm5lckluZm9JbmRleDsKKy8qKgorICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIGJ5dGVbXQorICogCQlBY3R1YWwgYnl0ZXMgb2YgYSAuY2xhc3MgZmlsZQorICogCisgKiBAcGFyYW0gZmlsZU5hbWUgY2hhcltdCisgKiAJCUFjdHVhbCBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGJ5dGVzLCBjYW4gYmUgbnVsbAorICogCisgKiBAcGFyYW0gZnVsbHlJbml0aWFsaXplIGJvb2xlYW4KKyAqIAkJRmxhZyB0byBmdWxseSBpbml0aWFsaXplIHRoZSBuZXcgb2JqZWN0CisgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uCisgKi8KK3B1YmxpYyBDbGFzc0ZpbGVSZWFkZXIoYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzLCBjaGFyW10gZmlsZU5hbWUsIGJvb2xlYW4gZnVsbHlJbml0aWFsaXplKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCS8vIFRoaXMgbWV0aG9kIGxvb2tzIHVnbHkgYnV0IGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSwgdGhlIGNvbnN0YW50UG9vbCBpcyBjb25zdHJ1Y3RlZAorCS8vIGluIDMgcGFzc2VzLiAgQWxsIG5vbi1wcmltaXRpdmUgY29uc3RhbnQgcG9vbCBtZW1iZXJzIHRoYXQgdXN1YWxseSByZWZlciB0byBvdGhlciBtZW1iZXJzCisJLy8gYnkgaW5kZXggYXJlIHR3ZWFrZWQgdG8gaGF2ZSB0aGVpciB2YWx1ZSBpbiBpbnN0IHZhcnMsIHRoaXMgbWlub3IgY29zdCBhdCByZWFkLXRpbWUgbWFrZXMKKwkvLyBhbGwgc3Vic2VxdWVudCB1c2VzIG9mIHRoZSBjb25zdGFudCBwb29sIGVsZW1lbnQgZmFzdGVyLgorCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCAwKTsKKwl0aGlzLmNsYXNzRmlsZU5hbWUgPSBmaWxlTmFtZTsKKwlpbnQgcmVhZE9mZnNldCA9IDEwOworCXRyeSB7CisJCWNvbnN0YW50UG9vbENvdW50ID0gdGhpcy51MkF0KDgpOworCQkvLyBQYXNzICMxIC0gRmlsbCBpbiBhbGwgcHJpbWl0aXZlIGNvbnN0YW50cworCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBuZXcgaW50W2NvbnN0YW50UG9vbENvdW50XTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb25zdGFudFBvb2xDb3VudDsgaSsrKSB7CisJCQlpbnQgdGFnID0gdGhpcy51MUF0KHJlYWRPZmZzZXQpOworCQkJc3dpdGNoICh0YWcpIHsKKwkJCQljYXNlIFV0ZjhUYWcgOgorCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQlyZWFkT2Zmc2V0ICs9IHUyQXQocmVhZE9mZnNldCArIDEpOworCQkJCQlyZWFkT2Zmc2V0ICs9IENvbnN0YW50VXRmOEZpeGVkU2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJbnRlZ2VyVGFnIDoKKwkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJcmVhZE9mZnNldCArPSBDb25zdGFudEludGVnZXJGaXhlZFNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRmxvYXRUYWcgOgorCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQlyZWFkT2Zmc2V0ICs9IENvbnN0YW50RmxvYXRGaXhlZFNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTG9uZ1RhZyA6CisJCQkJCXRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCXJlYWRPZmZzZXQgKz0gQ29uc3RhbnRMb25nRml4ZWRTaXplOworCQkJCQlpKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRG91YmxlVGFnIDoKKwkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJcmVhZE9mZnNldCArPSBDb25zdGFudERvdWJsZUZpeGVkU2l6ZTsKKwkJCQkJaSsrOworCQkJCQlicmVhazsKKwkJCQljYXNlIENsYXNzVGFnIDoKKwkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJcmVhZE9mZnNldCArPSBDb25zdGFudENsYXNzRml4ZWRTaXplOworCQkJCQlicmVhazsKKwkJCQljYXNlIFN0cmluZ1RhZyA6CisJCQkJCXRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCXJlYWRPZmZzZXQgKz0gQ29uc3RhbnRTdHJpbmdGaXhlZFNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRmllbGRSZWZUYWcgOgorCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQlyZWFkT2Zmc2V0ICs9IENvbnN0YW50RmllbGRSZWZGaXhlZFNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTWV0aG9kUmVmVGFnIDoKKwkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJcmVhZE9mZnNldCArPSBDb25zdGFudE1ldGhvZFJlZkZpeGVkU2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJbnRlcmZhY2VNZXRob2RSZWZUYWcgOgorCQkJCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQlyZWFkT2Zmc2V0ICs9IENvbnN0YW50SW50ZXJmYWNlTWV0aG9kUmVmRml4ZWRTaXplOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5hbWVBbmRUeXBlVGFnIDoKKwkJCQkJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJcmVhZE9mZnNldCArPSBDb25zdGFudE5hbWVBbmRUeXBlRml4ZWRTaXplOworCQkJfQorCQl9CisJCS8vIFJlYWQgYW5kIHZhbGlkYXRlIGFjY2VzcyBmbGFncworCQl0aGlzLmFjY2Vzc0ZsYWdzID0gdTJBdChyZWFkT2Zmc2V0KTsKKwkJcmVhZE9mZnNldCArPSAyOworCisJCS8vIFJlYWQgdGhlIGNsYXNzbmFtZSwgdXNlIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBjYXRjaCBiYWQgZm9ybWF0CisJCXRoaXMuY2xhc3NOYW1lSW5kZXggPSB1MkF0KHJlYWRPZmZzZXQpOworCQl0aGlzLmNsYXNzTmFtZSA9IGdldENvbnN0YW50Q2xhc3NOYW1lQXQodGhpcy5jbGFzc05hbWVJbmRleCk7CisJCXJlYWRPZmZzZXQgKz0gMjsKKworCQkvLyBSZWFkIHRoZSBzdXBlcmNsYXNzIG5hbWUsIGNhbiBiZSBudWxsIGZvciBqYXZhLmxhbmcuT2JqZWN0CisJCWludCBzdXBlcmNsYXNzTmFtZUluZGV4ID0gdTJBdChyZWFkT2Zmc2V0KTsKKwkJcmVhZE9mZnNldCArPSAyOworCQkvLyBpZiBzdXBlcmNsYXNzTmFtZUluZGV4IGlzIGVxdWFscyB0byAwIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoZSAKKwkJLy8gZmllbGQgdGhpcy5zdXBlcmNsYXNzTmFtZS4gbnVsbCBpcyBmaW5lLgorCQlpZiAoc3VwZXJjbGFzc05hbWVJbmRleCAhPSAwKSB7CisJCQl0aGlzLnN1cGVyY2xhc3NOYW1lID0gZ2V0Q29uc3RhbnRDbGFzc05hbWVBdChzdXBlcmNsYXNzTmFtZUluZGV4KTsKKwkJfQorCisJCS8vIFJlYWQgdGhlIGludGVyZmFjZXMsIHVzZSBleGNlcHRpb24gaGFuZGxlcnMgdG8gY2F0Y2ggYmFkIGZvcm1hdAorCQl0aGlzLmludGVyZmFjZXNDb3VudCA9IHUyQXQocmVhZE9mZnNldCk7CisJCXJlYWRPZmZzZXQgKz0gMjsKKwkJaWYgKHRoaXMuaW50ZXJmYWNlc0NvdW50ICE9IDApIHsKKwkJCXRoaXMuaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhclt0aGlzLmludGVyZmFjZXNDb3VudF1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbnRlcmZhY2VzQ291bnQ7IGkrKykgeworCQkJCXRoaXMuaW50ZXJmYWNlTmFtZXNbaV0gPSBnZXRDb25zdGFudENsYXNzTmFtZUF0KHUyQXQocmVhZE9mZnNldCkpOworCQkJCXJlYWRPZmZzZXQgKz0gMjsKKwkJCX0KKwkJfQorCQkvLyBSZWFkIHRoZSB0aGlzLmZpZWxkcywgdXNlIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBjYXRjaCBiYWQgZm9ybWF0CisJCXRoaXMuZmllbGRzQ291bnQgPSB1MkF0KHJlYWRPZmZzZXQpOworCQlyZWFkT2Zmc2V0ICs9IDI7CisJCWlmICh0aGlzLmZpZWxkc0NvdW50ICE9IDApIHsKKwkJCUZpZWxkSW5mbyBmaWVsZDsKKwkJCXRoaXMuZmllbGRzID0gbmV3IEZpZWxkSW5mb1t0aGlzLmZpZWxkc0NvdW50XTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5maWVsZHNDb3VudDsgaSsrKSB7CisJCQkJZmllbGQgPSBuZXcgRmllbGRJbmZvKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KTsKKwkJCQl0aGlzLmZpZWxkc1tpXSA9IGZpZWxkOworCQkJCXJlYWRPZmZzZXQgKz0gZmllbGQuc2l6ZUluQnl0ZXMoKTsKKwkJCX0KKwkJfQorCQkvLyBSZWFkIHRoZSB0aGlzLm1ldGhvZHMKKwkJdGhpcy5tZXRob2RzQ291bnQgPSB1MkF0KHJlYWRPZmZzZXQpOworCQlyZWFkT2Zmc2V0ICs9IDI7CisJCWlmICh0aGlzLm1ldGhvZHNDb3VudCAhPSAwKSB7CisJCQl0aGlzLm1ldGhvZHMgPSBuZXcgTWV0aG9kSW5mb1t0aGlzLm1ldGhvZHNDb3VudF07CisJCQlNZXRob2RJbmZvIG1ldGhvZDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZXRob2RzQ291bnQ7IGkrKykgeworCQkJCW1ldGhvZCA9IG5ldyBNZXRob2RJbmZvKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCByZWFkT2Zmc2V0KTsKKwkJCQl0aGlzLm1ldGhvZHNbaV0gPSBtZXRob2Q7CisJCQkJcmVhZE9mZnNldCArPSBtZXRob2Quc2l6ZUluQnl0ZXMoKTsKKwkJCX0KKwkJfQorCisJCS8vIFJlYWQgdGhlIGF0dHJpYnV0ZXMKKwkJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQocmVhZE9mZnNldCk7CisJCXJlYWRPZmZzZXQgKz0gMjsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNDb3VudDsgaSsrKSB7CisJCQlpbnQgdXRmOE9mZnNldCA9IHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KHJlYWRPZmZzZXQpXTsKKwkJCWNoYXJbXSBhdHRyaWJ1dGVOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgRGVwcmVjYXRlZE5hbWUpKSB7CisJCQkJdGhpcy5hY2Nlc3NGbGFncyB8PSBBY2NEZXByZWNhdGVkOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgSW5uZXJDbGFzc05hbWUpKSB7CisJCQkJCWludCBpbm5lck9mZnNldCA9IHJlYWRPZmZzZXQgKyA2OworCQkJCQlpbnQgbnVtYmVyX29mX2NsYXNzZXMgPSB1MkF0KGlubmVyT2Zmc2V0KTsKKwkJCQkJaWYgKG51bWJlcl9vZl9jbGFzc2VzICE9IDApIHsKKwkJCQkJCXRoaXMuaW5uZXJJbmZvcyA9IG5ldyBJbm5lckNsYXNzSW5mb1tudW1iZXJfb2ZfY2xhc3Nlc107CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG51bWJlcl9vZl9jbGFzc2VzOyBqKyspIHsKKwkJCQkJCQl0aGlzLmlubmVySW5mb3Nbal0gPSAKKwkJCQkJCQkJbmV3IElubmVyQ2xhc3NJbmZvKHJlZmVyZW5jZSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzLCBpbm5lck9mZnNldCArIDIpOyAKKwkJCQkJCQlpZiAodGhpcy5jbGFzc05hbWVJbmRleCA9PSB0aGlzLmlubmVySW5mb3Nbal0uaW5uZXJDbGFzc05hbWVJbmRleCkgeworCQkJCQkJCQl0aGlzLmlubmVySW5mbyA9IHRoaXMuaW5uZXJJbmZvc1tqXTsKKwkJCQkJCQkJdGhpcy5pbm5lckluZm9JbmRleCA9IGo7CisJCQkJCQkJfQorCQkJCQkJCWlubmVyT2Zmc2V0ICs9IDg7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgU291cmNlTmFtZSkpIHsKKwkJCQkJCXV0ZjhPZmZzZXQgPSB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0ICsgNildOworCQkJCQkJdGhpcy5zb3VyY2VGaWxlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIFN5bnRoZXRpY05hbWUpKSB7CisJCQkJCQkJdGhpcy5hY2Nlc3NGbGFncyB8PSBBY2NTeW50aGV0aWM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOworCQl9CisJCWlmIChmdWxseUluaXRpYWxpemUpIHsKKwkJCXRoaXMuaW5pdGlhbGl6ZSgpOworCQl9CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKAorCQkJQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyVHJ1bmNhdGVkSW5wdXQsIAorCQkJcmVhZE9mZnNldCk7IAorCX0KK30KKworLyoqCisgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgQWN0dWFsIGJ5dGVzIG9mIGEgLmNsYXNzIGZpbGUKKyAqIEBwYXJhbSBmaWxlTmFtZQlBY3R1YWwgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBieXRlcywgY2FuIGJlIG51bGwKKyAqIAorICogQGV4Y2VwdGlvbiBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgorICovCitwdWJsaWMgQ2xhc3NGaWxlUmVhZGVyKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgY2hhcltdIGZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCXRoaXMoY2xhc3NGaWxlQnl0ZXMsIGZpbGVOYW1lLCBmYWxzZSk7Cit9CisKKy8qKgorICogCUFuc3dlciB0aGUgcmVjZWl2ZXIncyBhY2Nlc3MgZmxhZ3MuICBUaGUgdmFsdWUgb2YgdGhlIGFjY2Vzc19mbGFncworICoJaXRlbSBpcyBhIG1hc2sgb2YgbW9kaWZpZXJzIHVzZWQgd2l0aCBjbGFzcyBhbmQgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy4KKyAqICBAcmV0dXJuIGludCAKKyAqLworcHVibGljIGludCBhY2Nlc3NGbGFncygpIHsKKwlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKK30KKy8qKgorICogQW5zd2VyIHRoZSBjaGFyIGFycmF5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnN0YW50IGNsYXNzLgorICogY29uc3RhbnRQb29sSW5kZXggaXMgdGhlIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sIHRoYXQgaXMgYSBjb25zdGFudCBjbGFzcyBlbnRyeS4KKyAqCisgKiBAcGFyYW0gaW50IGNvbnN0YW50UG9vbEluZGV4CisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwcml2YXRlIGNoYXJbXSBnZXRDb25zdGFudENsYXNzTmFtZUF0KGludCBjb25zdGFudFBvb2xJbmRleCkgeworCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW3UyQXQodGhpcy5jb25zdGFudFBvb2xPZmZzZXRzW2NvbnN0YW50UG9vbEluZGV4XSArIDEpXTsKKwlyZXR1cm4gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgaW50IGFycmF5IHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIHRoZSBvZmZzZXRzIG9mIGVhY2ggZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wKKyAqCisgKiBAcmV0dXJuIGludFtdCisgKi8KK3B1YmxpYyBpbnRbXSBnZXRDb25zdGFudFBvb2xPZmZzZXRzKCkgeworCXJldHVybiB0aGlzLmNvbnN0YW50UG9vbE9mZnNldHM7Cit9CisvKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBjb21wb3VuZE5hbWUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCisgKiBvciBudWxsIGlmIHRoZSByZWNlaXZlciBpcyBhIHRvcCBsZXZlbCB0eXBlLgorICovCitwdWJsaWMgY2hhcltdIGdldEVuY2xvc2luZ1R5cGVOYW1lKCkgeworCWlmICh0aGlzLmlubmVySW5mbyAhPSBudWxsICYmICF0aGlzLmlzQW5vbnltb3VzKCkpIHsKKwkJcmV0dXJuIHRoaXMuaW5uZXJJbmZvLmdldEVuY2xvc2luZ1R5cGVOYW1lKCk7CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgdGhpcy5maWVsZHMgb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUJpbmFyeUZpZWxkW10KKyAqLworcHVibGljIElCaW5hcnlGaWVsZFtdIGdldEZpZWxkcygpIHsKKwlyZXR1cm4gdGhpcy5maWVsZHM7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgZmlsZSBuYW1lIHdoaWNoIGRlZmluZXMgdGhlIHR5cGUuCisgKiBUaGUgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLgorICovCitwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgeworCXJldHVybiB0aGlzLmNsYXNzRmlsZU5hbWU7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIG5hbWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgaW5uZXIgdHlwZS4gUmV0dXJuIG51bGwgaWYgaXQgaXMgYW4gYW5vbnltb3VzIGNsYXNzIG9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHRvcC1sZXZlbCBjbGFzcy4KKyAqIGUuZy4KKyAqIHB1YmxpYyBjbGFzcyBBIHsKKyAqCXB1YmxpYyBjbGFzcyBCIHsKKyAqCX0KKyAqCXB1YmxpYyB2b2lkIGZvbygpIHsKKyAqCQljbGFzcyBDIHt9CisgKgl9CisgKglwdWJsaWMgUnVubmFibGUgYmFyKCkgeworICoJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisgKgkJCXB1YmxpYyB2b2lkIHJ1bigpIHt9CisgKgkJfTsKKyAqCX0KKyAqIH0KKyAqIEl0IHJldHVybnMgeydCJ30gZm9yIHRoZSBtZW1iZXIgQSRCCisgKiBJdCByZXR1cm5zIG51bGwgZm9yIEEKKyAqIEl0IHJldHVybnMgeydDJ30gZm9yIHRoZSBsb2NhbCBjbGFzcyBBJDEkQworICogSXQgcmV0dXJucyBudWxsIGZvciB0aGUgYW5vbnltb3VzIEEkMQorICogQHJldHVybiBjaGFyW10KKyAqLworcHVibGljIGNoYXJbXSBnZXRJbm5lclNvdXJjZU5hbWUoKSB7CisJaWYgKHRoaXMuaW5uZXJJbmZvICE9IG51bGwpCisJCXJldHVybiB0aGlzLmlubmVySW5mby5nZXRTb3VyY2VOYW1lKCk7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgbmFtZXMgb2YgdGhlIHJlY2VpdmVyJ3MgaW50ZXJmYWNlcyBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMKKyAqIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICoKKyAqIEZvciBleGFtcGxlLCBqYXZhLmxhbmcuU3RyaW5nIGlzIGphdmEvbGFuZy9TdHJpbmcuCisgKiBAcmV0dXJuIGNoYXJbXVtdCisgKi8KK3B1YmxpYyBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5pbnRlcmZhY2VOYW1lczsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG5lc3RlZCB0eXBlcyBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqCisgKiBUaGlzIG5lc3RlZCB0eXBlIGluZm8gaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlubmVyIGNsYXNzIGF0dHJpYnV0ZXMuCisgKiBBc2sgdGhlIG5hbWUgZW52aXJvbm1lbnQgdG8gZmluZCBhIG1lbWJlciB0eXBlIHVzaW5nIGl0cyBjb21wb3VuZCBuYW1lCisgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUJpbmFyeU5lc3RlZFR5cGVbXQorICovCitwdWJsaWMgSUJpbmFyeU5lc3RlZFR5cGVbXSBnZXRNZW1iZXJUeXBlcygpIHsKKwkvLyB3ZSBtaWdodCBoYXZlIHNvbWUgbWVtYmVyIHR5cGVzIG9mIHRoZSBjdXJyZW50IHR5cGUKKwlpZiAodGhpcy5pbm5lckluZm9zID09IG51bGwpIHJldHVybiBudWxsOworCisJaW50IGxlbmd0aCA9IHRoaXMuaW5uZXJJbmZvcy5sZW5ndGg7CisJaW50IHN0YXJ0aW5nSW5kZXggPSB0aGlzLmlubmVySW5mbyAhPSBudWxsID8gdGhpcy5pbm5lckluZm9JbmRleCArIDEgOiAwOworCWlmIChsZW5ndGggIT0gc3RhcnRpbmdJbmRleCkgeworCQlJQmluYXJ5TmVzdGVkVHlwZVtdIG1lbWJlclR5cGVzID0gCisJCQluZXcgSUJpbmFyeU5lc3RlZFR5cGVbbGVuZ3RoIC0gdGhpcy5pbm5lckluZm9JbmRleF07IAorCQlpbnQgbWVtYmVyVHlwZUluZGV4ID0gMDsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0aW5nSW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSW5uZXJDbGFzc0luZm8gY3VycmVudElubmVySW5mbyA9IHRoaXMuaW5uZXJJbmZvc1tpXTsKKwkJCWludCBvdXRlckNsYXNzTmFtZUlkeCA9IGN1cnJlbnRJbm5lckluZm8ub3V0ZXJDbGFzc05hbWVJbmRleDsKKwkJCWludCBpbm5lck5hbWVJbmRleCA9IGN1cnJlbnRJbm5lckluZm8uaW5uZXJOYW1lSW5kZXg7CisJCQkvKgorCQkJICogQ2hlY2tpbmcgdGhhdCBvdXRlckNsYXNzTmFtZUlEeCBpcyBkaWZmZXJlbnQgZnJvbSAwIHNob3VsZCBiZSBlbm91Z2ggdG8gZGV0ZXJtaW5lIGlmIGFuIGlubmVyIGNsYXNzCisJCQkgKiBhdHRyaWJ1dGUgZW50cnkgaXMgYSBtZW1iZXIgY2xhc3MsIGJ1dCBkdWUgdG8gdGhlIGJ1ZzoKKwkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1OTIKKwkJCSAqIHdlIG5lZWRlZCB0byBhZGQgYW4gZXh0cmEgY2hlY2suIFNvIHdlIGNoZWNrIHRoYXQgaW5uZXJOYW1lSW5kZXggaXMgZGlmZmVyZW50IGZyb20gMCBhcyB3ZWxsLgorCQkJICovCisJCQlpZiAob3V0ZXJDbGFzc05hbWVJZHggIT0gMCAmJiBpbm5lck5hbWVJbmRleCAhPSAwICYmIG91dGVyQ2xhc3NOYW1lSWR4ID09IHRoaXMuY2xhc3NOYW1lSW5kZXgpIHsKKwkJCQltZW1iZXJUeXBlc1ttZW1iZXJUeXBlSW5kZXgrK10gPSBjdXJyZW50SW5uZXJJbmZvOworCQkJfQorCQl9CisJCWlmIChtZW1iZXJUeXBlSW5kZXggPT0gMCkgcmV0dXJuIG51bGw7CisJCWlmIChtZW1iZXJUeXBlSW5kZXggIT0gbWVtYmVyVHlwZXMubGVuZ3RoKSB7CisJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgbWVtYmVyVHlwZXMgYXJyYXkuIFNvbWUgbG9jYWwgb3IgYW5vbnltb3VzIGNsYXNzZXMKKwkJCS8vIGFyZSBwcmVzZW50IGluIHRoZSBjdXJyZW50IGNsYXNzLgorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQltZW1iZXJUeXBlcywgCisJCQkJMCwgCisJCQkJKG1lbWJlclR5cGVzID0gbmV3IElCaW5hcnlOZXN0ZWRUeXBlW21lbWJlclR5cGVJbmRleF0pLCAKKwkJCQkwLCAKKwkJCQltZW1iZXJUeXBlSW5kZXgpOyAKKwkJfQorCQlyZXR1cm4gbWVtYmVyVHlwZXM7CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgdGhpcy5tZXRob2RzIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLmVudi5JQmluYXJ5TWV0aG9kW10KKyAqLworcHVibGljIElCaW5hcnlNZXRob2RbXSBnZXRNZXRob2RzKCkgeworCXJldHVybiB0aGlzLm1ldGhvZHM7Cit9CisvKioKKyAqIEFuc3dlciBhbiBpbnQgd2hvc2UgYml0cyBhcmUgc2V0IGFjY29yZGluZyB0aGUgYWNjZXNzIGNvbnN0YW50cworICogZGVmaW5lZCBieSB0aGUgVk0gc3BlYy4KKyAqIFNldCB0aGUgQWNjRGVwcmVjYXRlZCBhbmQgQWNjU3ludGhldGljIGJpdHMgaWYgbmVjZXNzYXJ5CisgKiBAcmV0dXJuIGludAorICovCitwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwlpZiAodGhpcy5pbm5lckluZm8gIT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5pbm5lckluZm8uZ2V0TW9kaWZpZXJzKCk7CisJfQorCXJldHVybiB0aGlzLmFjY2Vzc0ZsYWdzOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHR5cGUgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjLgorICoKKyAqIEZvciBleGFtcGxlLCBqYXZhLmxhbmcuU3RyaW5nIGlzIGphdmEvbGFuZy9TdHJpbmcuCisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7CisJcmV0dXJuIHRoaXMuY2xhc3NOYW1lOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3Mgc3VwZXJjbGFzcyBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMKKyAqIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqIEByZXR1cm4gY2hhcltdCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0U3VwZXJjbGFzc05hbWUoKSB7CisJcmV0dXJuIHRoaXMuc3VwZXJjbGFzc05hbWU7Cit9CisvKioKKyAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhbiBhbm9ueW1vdXMgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogQHJldHVybiA8Q09ERT5ib29sZWFuPC9DT0RFPgorICovCitwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKKwlpZiAodGhpcy5pbm5lckluZm8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCWNoYXJbXSBzb3VyY2VOYW1lID0gdGhpcy5pbm5lckluZm8uZ2V0U291cmNlTmFtZSgpOworCXJldHVybiAoc291cmNlTmFtZSA9PSBudWxsIHx8IHNvdXJjZU5hbWUubGVuZ3RoID09IDApOworfQorLyoqCisgKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgY29udGFpbnMgdGhlIHJlc29sdmVkIGJpbmFyeSBmb3JtCisgKiBvciB0aGUgdW5yZXNvbHZlZCBzb3VyY2UgZm9ybSBvZiB0aGUgdHlwZS4KKyAqIEByZXR1cm4gYm9vbGVhbgorICovCitwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeVR5cGUoKSB7CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGNsYXNzLiBGYWxzZSBvdGhlcndpc2UuCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKwlyZXR1cm4gKGdldE1vZGlmaWVycygpICYgQWNjSW50ZXJmYWNlKSA9PSAwOworfQorLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYW4gaW50ZXJmYWNlLiBGYWxzZSBvdGhlcndpc2UuCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJcmV0dXJuIChnZXRNb2RpZmllcnMoKSAmIEFjY0ludGVyZmFjZSkgIT0gMDsKK30KKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbG9jYWwgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogQHJldHVybiA8Q09ERT5ib29sZWFuPC9DT0RFPgorICovCitwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgeworCXJldHVybiAKKwkJdGhpcy5pbm5lckluZm8gIT0gbnVsbCAKKwkJJiYgdGhpcy5pbm5lckluZm8uZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSA9PSBudWxsIAorCQkmJiB0aGlzLmlubmVySW5mby5nZXRTb3VyY2VOYW1lKCkgIT0gbnVsbDsKK30KKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbWVtYmVyIHR5cGUsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIEByZXR1cm4gPENPREU+Ym9vbGVhbjwvQ09ERT4KKyAqLworcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB7CisJcmV0dXJuIHRoaXMuaW5uZXJJbmZvICE9IG51bGwgJiYgdGhpcy5pbm5lckluZm8uZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSAhPSBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBuZXN0ZWQgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogQHJldHVybiA8Q09ERT5ib29sZWFuPC9DT0RFPgorICovCitwdWJsaWMgYm9vbGVhbiBpc05lc3RlZFR5cGUoKSB7CisJcmV0dXJuIHRoaXMuaW5uZXJJbmZvICE9IG51bGw7Cit9CitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHJlYWQoZmlsZSwgZmFsc2UpOworfQorcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgcmVhZChGaWxlIGZpbGUsIGJvb2xlYW4gZnVsbHlJbml0aWFsaXplKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlieXRlIGNsYXNzRmlsZUJ5dGVzW10gPSBVdGlsLmdldEZpbGVCeXRlQ29udGVudChmaWxlKTsKKwlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS50b0NoYXJBcnJheSgpKTsKKwlpZiAoZnVsbHlJbml0aWFsaXplKSB7CisJCWNsYXNzRmlsZVJlYWRlci5pbml0aWFsaXplKCk7CisJfQorCXJldHVybiBjbGFzc0ZpbGVSZWFkZXI7Cit9CitwdWJsaWMgc3RhdGljIENsYXNzRmlsZVJlYWRlciByZWFkKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwlyZXR1cm4gcmVhZChmaWxlTmFtZSwgZmFsc2UpOworfQorcHVibGljIHN0YXRpYyBDbGFzc0ZpbGVSZWFkZXIgcmVhZChTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gZnVsbHlJbml0aWFsaXplKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworCXJldHVybiByZWFkKG5ldyBGaWxlKGZpbGVOYW1lKSwgZnVsbHlJbml0aWFsaXplKTsKK30KK3B1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlUmVhZGVyIHJlYWQoCisJamF2YS51dGlsLnppcC5aaXBGaWxlIHppcCwgCisJU3RyaW5nIGZpbGVuYW1lKQorCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCXJldHVybiByZWFkKHppcCwgZmlsZW5hbWUsIGZhbHNlKTsKK30KK3B1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlUmVhZGVyIHJlYWQoCisJamF2YS51dGlsLnppcC5aaXBGaWxlIHppcCwgCisJU3RyaW5nIGZpbGVuYW1lLAorCWJvb2xlYW4gZnVsbHlJbml0aWFsaXplKQorCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJamF2YS51dGlsLnppcC5aaXBFbnRyeSB6ZSA9IHppcC5nZXRFbnRyeShmaWxlbmFtZSk7CisJaWYgKHplID09IG51bGwpCisJCXJldHVybiBudWxsOworCWJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSA9IFV0aWwuZ2V0WmlwRW50cnlCeXRlQ29udGVudCh6ZSwgemlwKTsKKwlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgZmlsZW5hbWUudG9DaGFyQXJyYXkoKSk7CisJaWYgKGZ1bGx5SW5pdGlhbGl6ZSkgeworCQljbGFzc0ZpbGVSZWFkZXIuaW5pdGlhbGl6ZSgpOworCX0KKwlyZXR1cm4gY2xhc3NGaWxlUmVhZGVyOworfQorCisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIGZpbGUgbmFtZSBhdHRyaWJ1dGUuIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZSBmb3IgdGhlIHJlY2VpdmVyLgorICogCisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIHNvdXJjZUZpbGVOYW1lKCkgeworCXJldHVybiB0aGlzLnNvdXJjZUZpbGVOYW1lOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwlqYXZhLmlvLlByaW50V3JpdGVyIHByaW50ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIob3V0KTsKKwkKKwlwcmludC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAieyIpOyAvLyROT04tTkxTLTEkCisJcHJpbnQucHJpbnRsbigiIHRoaXMuY2xhc3NOYW1lOiAiICsgbmV3IFN0cmluZyhnZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCXByaW50LnByaW50bG4oIiB0aGlzLnN1cGVyY2xhc3NOYW1lOiAiICsgKGdldFN1cGVyY2xhc3NOYW1lKCkgPT0gbnVsbCA/ICJudWxsIiA6IG5ldyBTdHJpbmcoZ2V0U3VwZXJjbGFzc05hbWUoKSkpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJcHJpbnQucHJpbnRsbigiIGFjY2Vzc19mbGFnczogIiArIENsYXNzRmlsZVN0cnVjdC5wcmludFR5cGVNb2RpZmllcnModGhpcy5hY2Nlc3NGbGFncygpKSArICIoIiArIHRoaXMuYWNjZXNzRmxhZ3MoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCisKKwlwcmludC5mbHVzaCgpOworCXJldHVybiBvdXQudG9TdHJpbmcoKTsKK30KKy8qKgorICogQ2hlY2sgaWYgdGhlIHJlY2VpdmVyIGhhcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgY29tcGFyZSB0byB0aGUgYnl0ZSBhcnJheSBpbiBhcmd1bWVudC4KKyAqIFN0cnVjdHVyYWwgY2hhbmdlcyBhcmU6CisgKiAtIG1vZGlmaWVycyBjaGFuZ2VzIGZvciB0aGUgY2xhc3MsIHRoZSB0aGlzLmZpZWxkcyBvciB0aGUgdGhpcy5tZXRob2RzCisgKiAtIHNpZ25hdHVyZSBjaGFuZ2VzIGZvciB0aGlzLmZpZWxkcyBvciB0aGlzLm1ldGhvZHMuCisgKiAtIGNoYW5nZXMgaW4gdGhlIG51bWJlciBvZiB0aGlzLmZpZWxkcyBvciB0aGlzLm1ldGhvZHMKKyAqIC0gY2hhbmdlcyBmb3IgZmllbGQgY29uc3RhbnRzCisgKiAtIGNoYW5nZXMgZm9yIHRocm93biBleGNlcHRpb25zCisgKiAtIGNoYW5nZSBmb3IgdGhlIHN1cGVyIGNsYXNzIG9yIGFueSBzdXBlciBpbnRlcmZhY2VzLgorICogLSBjaGFuZ2VzIGZvciBtZW1iZXIgdHlwZXMgbmFtZSBvciBtb2RpZmllcnMKKyAqIElmIGFueSBvZiB0aGVzZSBjaGFuZ2VzIG9jY3VycywgdGhlIG1ldGhvZCByZXR1cm5zIHRydWUuIGZhbHNlIG90aGVyd2lzZS4gCisgKiBUaGUgc3ludGhldGljIGZpZWxkcyBhcmUgaW5jbHVkZWQgYW5kIHRoZSBtZW1iZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgc29ydGVkLgorICogQHBhcmFtIG5ld0J5dGVzIHRoZSBieXRlcyBvZiB0aGUgLmNsYXNzIGZpbGUgd2Ugd2FudCB0byBjb21wYXJlIHRoZSByZWNlaXZlciB0bworICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpcyB0aGVyZSBpcyBhIHN0cnVjdHVyYWwgY2hhbmdlIGJldHdlZW4gdGhlIHR3byAuY2xhc3MgZmlsZXMsIGZhbHNlIG90aGVyd2lzZQorICovCitwdWJsaWMgYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhieXRlW10gbmV3Qnl0ZXMpIHsKKwlyZXR1cm4gaGFzU3RydWN0dXJhbENoYW5nZXMobmV3Qnl0ZXMsIHRydWUsIHRydWUpOworfQorLyoqCisgKiBDaGVjayBpZiB0aGUgcmVjZWl2ZXIgaGFzIHN0cnVjdHVyYWwgY2hhbmdlcyBjb21wYXJlIHRvIHRoZSBieXRlIGFycmF5IGluIGFyZ3VtZW50LgorICogU3RydWN0dXJhbCBjaGFuZ2VzIGFyZToKKyAqIC0gbW9kaWZpZXJzIGNoYW5nZXMgZm9yIHRoZSBjbGFzcywgdGhlIHRoaXMuZmllbGRzIG9yIHRoZSB0aGlzLm1ldGhvZHMKKyAqIC0gc2lnbmF0dXJlIGNoYW5nZXMgZm9yIHRoaXMuZmllbGRzIG9yIHRoaXMubWV0aG9kcy4KKyAqIC0gY2hhbmdlcyBpbiB0aGUgbnVtYmVyIG9mIHRoaXMuZmllbGRzIG9yIHRoaXMubWV0aG9kcworICogLSBjaGFuZ2VzIGZvciBmaWVsZCBjb25zdGFudHMKKyAqIC0gY2hhbmdlcyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKKyAqIC0gY2hhbmdlIGZvciB0aGUgc3VwZXIgY2xhc3Mgb3IgYW55IHN1cGVyIGludGVyZmFjZXMuCisgKiAtIGNoYW5nZXMgZm9yIG1lbWJlciB0eXBlcyBuYW1lIG9yIG1vZGlmaWVycworICogSWYgYW55IG9mIHRoZXNlIGNoYW5nZXMgb2NjdXJzLCB0aGUgbWV0aG9kIHJldHVybnMgdHJ1ZS4gZmFsc2Ugb3RoZXJ3aXNlLgorICogQHBhcmFtIG5ld0J5dGVzIHRoZSBieXRlcyBvZiB0aGUgLmNsYXNzIGZpbGUgd2Ugd2FudCB0byBjb21wYXJlIHRoZSByZWNlaXZlciB0bworICogQHBhcmFtIG9yZGVyUmVxdWlyZWQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWVtYmVycyBzaG91bGQgYmUgc29ydGVkIG9yIG5vdAorICogQHBhcmFtIGV4Y2x1ZGVzU3ludGhldGljcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzeW50aGV0aWMgbWVtYmVycyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgY29tcGFyaXNvbgorICogQHJldHVybiBib29sZWFuIFJldHVybnMgdHJ1ZSBpcyB0aGVyZSBpcyBhIHN0cnVjdHVyYWwgY2hhbmdlIGJldHdlZW4gdGhlIHR3byAuY2xhc3MgZmlsZXMsIGZhbHNlIG90aGVyd2lzZQorICovCitwdWJsaWMgYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhieXRlW10gbmV3Qnl0ZXMsIGJvb2xlYW4gb3JkZXJSZXF1aXJlZCwgYm9vbGVhbiBleGNsdWRlc1N5bnRoZXRpYykgeworCXRyeSB7CisJCUNsYXNzRmlsZVJlYWRlciBuZXdDbGFzc0ZpbGUgPQorCQkJbmV3IENsYXNzRmlsZVJlYWRlcihuZXdCeXRlcywgdGhpcy5jbGFzc0ZpbGVOYW1lKTsKKwkJLy8gdHlwZSBsZXZlbCBjb21wYXJpc29uCisJCS8vIG1vZGlmaWVycworCQlpZiAodGhpcy5nZXRNb2RpZmllcnMoKSAhPSBuZXdDbGFzc0ZpbGUuZ2V0TW9kaWZpZXJzKCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJLy8gc3VwZXJjbGFzcworCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuZ2V0U3VwZXJjbGFzc05hbWUoKSwgbmV3Q2xhc3NGaWxlLmdldFN1cGVyY2xhc3NOYW1lKCkpKQorCQkJcmV0dXJuIHRydWU7CisJCS8vIGludGVyZmFjZXMKKwkJY2hhcltdW10gbmV3SW50ZXJmYWNlc05hbWVzID0gbmV3Q2xhc3NGaWxlLmdldEludGVyZmFjZU5hbWVzKCk7CisJCWlmICh0aGlzLmludGVyZmFjZU5hbWVzICE9IG5ld0ludGVyZmFjZXNOYW1lcykgeyAvLyBUeXBlQ29uc3RhbnRzLk5vU3VwZXJJbnRlcmZhY2VzCisJCQlpbnQgbmV3SW50ZXJmYWNlc0xlbmd0aCA9IG5ld0ludGVyZmFjZXNOYW1lcyA9PSBudWxsID8gMCA6IG5ld0ludGVyZmFjZXNOYW1lcy5sZW5ndGg7CisJCQlpZiAobmV3SW50ZXJmYWNlc0xlbmd0aCAhPSB0aGlzLmludGVyZmFjZXNDb3VudCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmludGVyZmFjZXNDb3VudDsgaSA8IG1heDsgaSsrKQorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5pbnRlcmZhY2VOYW1lc1tpXSwgbmV3SW50ZXJmYWNlc05hbWVzW2ldKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvLyBtZW1iZXIgdHlwZXMKKwkJSUJpbmFyeU5lc3RlZFR5cGVbXSBjdXJyZW50TWVtYmVyVHlwZXMgPSAoSUJpbmFyeU5lc3RlZFR5cGVbXSkgdGhpcy5nZXRNZW1iZXJUeXBlcygpOworCQlJQmluYXJ5TmVzdGVkVHlwZVtdIG90aGVyTWVtYmVyVHlwZXMgPSAoSUJpbmFyeU5lc3RlZFR5cGVbXSkgbmV3Q2xhc3NGaWxlLmdldE1lbWJlclR5cGVzKCk7CisJCWlmIChjdXJyZW50TWVtYmVyVHlwZXMgIT0gb3RoZXJNZW1iZXJUeXBlcykgeyAvLyBUeXBlQ29uc3RhbnRzLk5vTWVtYmVyVHlwZXMKKwkJCWludCBjdXJyZW50TWVtYmVyVHlwZUxlbmd0aCA9IGN1cnJlbnRNZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IGN1cnJlbnRNZW1iZXJUeXBlcy5sZW5ndGg7CisJCQlpbnQgb3RoZXJNZW1iZXJUeXBlTGVuZ3RoID0gb3RoZXJNZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG90aGVyTWVtYmVyVHlwZXMubGVuZ3RoOworCQkJaWYgKGN1cnJlbnRNZW1iZXJUeXBlTGVuZ3RoICE9IG90aGVyTWVtYmVyVHlwZUxlbmd0aCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudE1lbWJlclR5cGVMZW5ndGg7IGkrKykKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRNZW1iZXJUeXBlc1tpXS5nZXROYW1lKCksIG90aGVyTWVtYmVyVHlwZXNbaV0uZ2V0TmFtZSgpKQorCQkJCQl8fCBjdXJyZW50TWVtYmVyVHlwZXNbaV0uZ2V0TW9kaWZpZXJzKCkgIT0gb3RoZXJNZW1iZXJUeXBlc1tpXS5nZXRNb2RpZmllcnMoKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQl9CisKKwkJLy8gZmllbGRzCisJCUZpZWxkSW5mb1tdIG90aGVyRmllbGRJbmZvcyA9IChGaWVsZEluZm9bXSkgbmV3Q2xhc3NGaWxlLmdldEZpZWxkcygpOworCQlpbnQgb3RoZXJGaWVsZEluZm9zTGVuZ3RoID0gb3RoZXJGaWVsZEluZm9zID09IG51bGwgPyAwIDogb3RoZXJGaWVsZEluZm9zLmxlbmd0aDsKKwkJYm9vbGVhbiBjb21wYXJlRmllbGRzID0gdHJ1ZTsKKwkJaWYgKHRoaXMuZmllbGRzQ291bnQgPT0gb3RoZXJGaWVsZEluZm9zTGVuZ3RoKSB7CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKDsgaSA8IHRoaXMuZmllbGRzQ291bnQ7IGkrKykKKwkJCQlpZiAoaGFzU3RydWN0dXJhbEZpZWxkQ2hhbmdlcyh0aGlzLmZpZWxkc1tpXSwgb3RoZXJGaWVsZEluZm9zW2ldKSkgYnJlYWs7CisJCQlpZiAoKGNvbXBhcmVGaWVsZHMgPSBpICE9IHRoaXMuZmllbGRzQ291bnQpICYmICFvcmRlclJlcXVpcmVkICYmICFleGNsdWRlc1N5bnRoZXRpYykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tcGFyZUZpZWxkcykgeworCQkJaWYgKHRoaXMuZmllbGRzQ291bnQgIT0gb3RoZXJGaWVsZEluZm9zTGVuZ3RoICYmICFleGNsdWRlc1N5bnRoZXRpYykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChvcmRlclJlcXVpcmVkKSB7CisJCQkJaWYgKHRoaXMuZmllbGRzQ291bnQgIT0gMCkKKwkJCQkJQXJyYXlzLnNvcnQodGhpcy5maWVsZHMpOworCQkJCWlmIChvdGhlckZpZWxkSW5mb3NMZW5ndGggIT0gMCkKKwkJCQkJQXJyYXlzLnNvcnQob3RoZXJGaWVsZEluZm9zKTsKKwkJCX0KKwkJCWlmIChleGNsdWRlc1N5bnRoZXRpYykgeworCQkJCWlmIChoYXNOb25TeW50aGV0aWNGaWVsZENoYW5nZXModGhpcy5maWVsZHMsIG90aGVyRmllbGRJbmZvcykpCisJCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZmllbGRzQ291bnQ7IGkrKykKKwkJCQkJaWYgKGhhc1N0cnVjdHVyYWxGaWVsZENoYW5nZXModGhpcy5maWVsZHNbaV0sIG90aGVyRmllbGRJbmZvc1tpXSkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gbWV0aG9kcworCQlNZXRob2RJbmZvW10gb3RoZXJNZXRob2RJbmZvcyA9IChNZXRob2RJbmZvW10pIG5ld0NsYXNzRmlsZS5nZXRNZXRob2RzKCk7CisJCWludCBvdGhlck1ldGhvZEluZm9zTGVuZ3RoID0gb3RoZXJNZXRob2RJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyTWV0aG9kSW5mb3MubGVuZ3RoOworCQlib29sZWFuIGNvbXBhcmVNZXRob2RzID0gdHJ1ZTsKKwkJaWYgKHRoaXMubWV0aG9kc0NvdW50ID09IG90aGVyTWV0aG9kSW5mb3NMZW5ndGgpIHsKKwkJCWludCBpID0gMDsKKwkJCWZvciAoOyBpIDwgdGhpcy5tZXRob2RzQ291bnQ7IGkrKykKKwkJCQlpZiAoaGFzU3RydWN0dXJhbE1ldGhvZENoYW5nZXModGhpcy5tZXRob2RzW2ldLCBvdGhlck1ldGhvZEluZm9zW2ldKSkgYnJlYWs7CisJCQlpZiAoKGNvbXBhcmVNZXRob2RzID0gaSAhPSB0aGlzLm1ldGhvZHNDb3VudCkgJiYgIW9yZGVyUmVxdWlyZWQgJiYgIWV4Y2x1ZGVzU3ludGhldGljKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChjb21wYXJlTWV0aG9kcykgeworCQkJaWYgKHRoaXMubWV0aG9kc0NvdW50ICE9IG90aGVyTWV0aG9kSW5mb3NMZW5ndGggJiYgIWV4Y2x1ZGVzU3ludGhldGljKQorCQkJCXJldHVybiB0cnVlOworCQkJaWYgKG9yZGVyUmVxdWlyZWQpIHsKKwkJCQlpZiAodGhpcy5tZXRob2RzQ291bnQgIT0gMCkKKwkJCQkJQXJyYXlzLnNvcnQodGhpcy5tZXRob2RzKTsKKwkJCQlpZiAob3RoZXJNZXRob2RJbmZvc0xlbmd0aCAhPSAwKQorCQkJCQlBcnJheXMuc29ydChvdGhlck1ldGhvZEluZm9zKTsJCisJCQl9CisJCQlpZiAoZXhjbHVkZXNTeW50aGV0aWMpIHsKKwkJCQlpZiAoaGFzTm9uU3ludGhldGljTWV0aG9kQ2hhbmdlcyh0aGlzLm1ldGhvZHMsIG90aGVyTWV0aG9kSW5mb3MpKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm1ldGhvZHNDb3VudDsgaSsrKQorCQkJCQlpZiAoaGFzU3RydWN0dXJhbE1ldGhvZENoYW5nZXModGhpcy5tZXRob2RzW2ldLCBvdGhlck1ldGhvZEluZm9zW2ldKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorfQorcHJpdmF0ZSBib29sZWFuIGhhc05vblN5bnRoZXRpY0ZpZWxkQ2hhbmdlcyhGaWVsZEluZm9bXSBjdXJyZW50RmllbGRJbmZvcywgRmllbGRJbmZvW10gb3RoZXJGaWVsZEluZm9zKSB7CisJaW50IGxlbmd0aDEgPSBjdXJyZW50RmllbGRJbmZvcyA9PSBudWxsID8gMCA6IGN1cnJlbnRGaWVsZEluZm9zLmxlbmd0aDsKKwlpbnQgbGVuZ3RoMiA9IG90aGVyRmllbGRJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyRmllbGRJbmZvcy5sZW5ndGg7CisJaW50IGluZGV4MSA9IDA7CisJaW50IGluZGV4MiA9IDA7CisKKwllbmQgOiB3aGlsZSAoaW5kZXgxIDwgbGVuZ3RoMSAmJiBpbmRleDIgPCBsZW5ndGgyKSB7CisJCXdoaWxlIChjdXJyZW50RmllbGRJbmZvc1tpbmRleDFdLmlzU3ludGhldGljKCkpIHsKKwkJCWlmICgrK2luZGV4MSA+PSBsZW5ndGgxKSBicmVhayBlbmQ7CisJCX0KKwkJd2hpbGUgKG90aGVyRmllbGRJbmZvc1tpbmRleDJdLmlzU3ludGhldGljKCkpIHsKKwkJCWlmICgrK2luZGV4MiA+PSBsZW5ndGgyKSBicmVhayBlbmQ7CisJCX0KKwkJaWYgKGhhc1N0cnVjdHVyYWxGaWVsZENoYW5nZXMoY3VycmVudEZpZWxkSW5mb3NbaW5kZXgxKytdLCBvdGhlckZpZWxkSW5mb3NbaW5kZXgyKytdKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXdoaWxlIChpbmRleDEgPCBsZW5ndGgxKSB7CisJCWlmICghY3VycmVudEZpZWxkSW5mb3NbaW5kZXgxKytdLmlzU3ludGhldGljKCkpIHJldHVybiB0cnVlOworCX0KKwl3aGlsZSAoaW5kZXgyIDwgbGVuZ3RoMikgeworCQlpZiAoIW90aGVyRmllbGRJbmZvc1tpbmRleDIrK10uaXNTeW50aGV0aWMoKSkgcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK3ByaXZhdGUgYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsRmllbGRDaGFuZ2VzKEZpZWxkSW5mbyBjdXJyZW50RmllbGRJbmZvLCBGaWVsZEluZm8gb3RoZXJGaWVsZEluZm8pIHsKKwlpZiAoY3VycmVudEZpZWxkSW5mby5nZXRNb2RpZmllcnMoKSAhPSBvdGhlckZpZWxkSW5mby5nZXRNb2RpZmllcnMoKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50RmllbGRJbmZvLmdldE5hbWUoKSwgb3RoZXJGaWVsZEluZm8uZ2V0TmFtZSgpKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50RmllbGRJbmZvLmdldFR5cGVOYW1lKCksIG90aGVyRmllbGRJbmZvLmdldFR5cGVOYW1lKCkpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoY3VycmVudEZpZWxkSW5mby5oYXNDb25zdGFudCgpICE9IG90aGVyRmllbGRJbmZvLmhhc0NvbnN0YW50KCkpCisJCXJldHVybiB0cnVlOworCWlmIChjdXJyZW50RmllbGRJbmZvLmhhc0NvbnN0YW50KCkpIHsKKwkJQ29uc3RhbnQgY3VycmVudENvbnN0YW50ID0gY3VycmVudEZpZWxkSW5mby5nZXRDb25zdGFudCgpOworCQlDb25zdGFudCBvdGhlckNvbnN0YW50ID0gb3RoZXJGaWVsZEluZm8uZ2V0Q29uc3RhbnQoKTsKKwkJaWYgKGN1cnJlbnRDb25zdGFudC50eXBlSUQoKSAhPSBvdGhlckNvbnN0YW50LnR5cGVJRCgpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICghY3VycmVudENvbnN0YW50LmdldENsYXNzKCkuZXF1YWxzKG90aGVyQ29uc3RhbnQuZ2V0Q2xhc3MoKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJc3dpdGNoIChjdXJyZW50Q29uc3RhbnQudHlwZUlEKCkpIHsKKwkJCWNhc2UgVHlwZUlkcy5UX2ludCA6CisJCQkJcmV0dXJuIGN1cnJlbnRDb25zdGFudC5pbnRWYWx1ZSgpICE9IG90aGVyQ29uc3RhbnQuaW50VmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgorCQkJCXJldHVybiBjdXJyZW50Q29uc3RhbnQuYnl0ZVZhbHVlKCkgIT0gb3RoZXJDb25zdGFudC5ieXRlVmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKKwkJCQlyZXR1cm4gY3VycmVudENvbnN0YW50LnNob3J0VmFsdWUoKSAhPSBvdGhlckNvbnN0YW50LnNob3J0VmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgorCQkJCXJldHVybiBjdXJyZW50Q29uc3RhbnQuY2hhclZhbHVlKCkgIT0gb3RoZXJDb25zdGFudC5jaGFyVmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKKwkJCQlyZXR1cm4gY3VycmVudENvbnN0YW50LmZsb2F0VmFsdWUoKSAhPSBvdGhlckNvbnN0YW50LmZsb2F0VmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQkJcmV0dXJuIGN1cnJlbnRDb25zdGFudC5kb3VibGVWYWx1ZSgpICE9IG90aGVyQ29uc3RhbnQuZG91YmxlVmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX2Jvb2xlYW4gOgorCQkJCXJldHVybiBjdXJyZW50Q29uc3RhbnQuYm9vbGVhblZhbHVlKCkgIT0gb3RoZXJDb25zdGFudC5ib29sZWFuVmFsdWUoKTsKKwkJCWNhc2UgVHlwZUlkcy5UX1N0cmluZyA6CisJCQkJcmV0dXJuICFjdXJyZW50Q29uc3RhbnQuc3RyaW5nVmFsdWUoKS5lcXVhbHMob3RoZXJDb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKKwkJCWNhc2UgVHlwZUlkcy5UX251bGwgOgorCQkJCXJldHVybiBvdGhlckNvbnN0YW50ICE9IE51bGxDb25zdGFudC5EZWZhdWx0OworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KK3ByaXZhdGUgYm9vbGVhbiBoYXNOb25TeW50aGV0aWNNZXRob2RDaGFuZ2VzKE1ldGhvZEluZm9bXSBjdXJyZW50TWV0aG9kSW5mb3MsIE1ldGhvZEluZm9bXSBvdGhlck1ldGhvZEluZm9zKSB7CisJaW50IGxlbmd0aDEgPSBjdXJyZW50TWV0aG9kSW5mb3MgPT0gbnVsbCA/IDAgOiBjdXJyZW50TWV0aG9kSW5mb3MubGVuZ3RoOworCWludCBsZW5ndGgyID0gb3RoZXJNZXRob2RJbmZvcyA9PSBudWxsID8gMCA6IG90aGVyTWV0aG9kSW5mb3MubGVuZ3RoOworCWludCBpbmRleDEgPSAwOworCWludCBpbmRleDIgPSAwOworCisJTWV0aG9kSW5mbyBtOworCWVuZCA6IHdoaWxlIChpbmRleDEgPCBsZW5ndGgxICYmIGluZGV4MiA8IGxlbmd0aDIpIHsKKwkJd2hpbGUgKChtID0gY3VycmVudE1ldGhvZEluZm9zW2luZGV4MV0pLmlzU3ludGhldGljKCkgfHwgbS5pc0NsaW5pdCgpKSB7CisJCQlpZiAoKytpbmRleDEgPj0gbGVuZ3RoMSkgYnJlYWsgZW5kOworCQl9CisJCXdoaWxlICgobSA9IG90aGVyTWV0aG9kSW5mb3NbaW5kZXgyXSkuaXNTeW50aGV0aWMoKSB8fCBtLmlzQ2xpbml0KCkpIHsKKwkJCWlmICgrK2luZGV4MiA+PSBsZW5ndGgyKSBicmVhayBlbmQ7CisJCX0KKwkJaWYgKGhhc1N0cnVjdHVyYWxNZXRob2RDaGFuZ2VzKGN1cnJlbnRNZXRob2RJbmZvc1tpbmRleDErK10sIG90aGVyTWV0aG9kSW5mb3NbaW5kZXgyKytdKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXdoaWxlIChpbmRleDEgPCBsZW5ndGgxKSB7CisJCWlmICghKChtID0gY3VycmVudE1ldGhvZEluZm9zW2luZGV4MSsrXSkuaXNTeW50aGV0aWMoKSB8fCBtLmlzQ2xpbml0KCkpKSByZXR1cm4gdHJ1ZTsKKwl9CisJd2hpbGUgKGluZGV4MiA8IGxlbmd0aDIpIHsKKwkJaWYgKCEoKG0gPSBvdGhlck1ldGhvZEluZm9zW2luZGV4MisrXSkuaXNTeW50aGV0aWMoKSB8fCBtLmlzQ2xpbml0KCkpKSByZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJpdmF0ZSBib29sZWFuIGhhc1N0cnVjdHVyYWxNZXRob2RDaGFuZ2VzKE1ldGhvZEluZm8gY3VycmVudE1ldGhvZEluZm8sIE1ldGhvZEluZm8gb3RoZXJNZXRob2RJbmZvKSB7CisJaWYgKGN1cnJlbnRNZXRob2RJbmZvLmdldE1vZGlmaWVycygpICE9IG90aGVyTWV0aG9kSW5mby5nZXRNb2RpZmllcnMoKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50TWV0aG9kSW5mby5nZXRTZWxlY3RvcigpLCBvdGhlck1ldGhvZEluZm8uZ2V0U2VsZWN0b3IoKSkpCisJCXJldHVybiB0cnVlOworCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudE1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpLCBvdGhlck1ldGhvZEluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpKSkKKwkJcmV0dXJuIHRydWU7CisKKwljaGFyW11bXSBjdXJyZW50VGhyb3duRXhjZXB0aW9ucyA9IGN1cnJlbnRNZXRob2RJbmZvLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpOworCWNoYXJbXVtdIG90aGVyVGhyb3duRXhjZXB0aW9ucyA9IG90aGVyTWV0aG9kSW5mby5nZXRFeGNlcHRpb25UeXBlTmFtZXMoKTsKKwlpZiAoY3VycmVudFRocm93bkV4Y2VwdGlvbnMgIT0gb3RoZXJUaHJvd25FeGNlcHRpb25zKSB7IC8vIFR5cGVDb25zdGFudHMuTm9FeGNlcHRpb25zCisJCWludCBjdXJyZW50VGhyb3duRXhjZXB0aW9uc0xlbmd0aCA9IGN1cnJlbnRUaHJvd25FeGNlcHRpb25zID09IG51bGwgPyAwIDogY3VycmVudFRocm93bkV4Y2VwdGlvbnMubGVuZ3RoOworCQlpbnQgb3RoZXJUaHJvd25FeGNlcHRpb25zTGVuZ3RoID0gb3RoZXJUaHJvd25FeGNlcHRpb25zID09IG51bGwgPyAwIDogb3RoZXJUaHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJaWYgKGN1cnJlbnRUaHJvd25FeGNlcHRpb25zTGVuZ3RoICE9IG90aGVyVGhyb3duRXhjZXB0aW9uc0xlbmd0aCkKKwkJCXJldHVybiB0cnVlOworCQlmb3IgKGludCBrID0gMDsgayA8IGN1cnJlbnRUaHJvd25FeGNlcHRpb25zTGVuZ3RoOyBrKyspCisJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRUaHJvd25FeGNlcHRpb25zW2tdLCBvdGhlclRocm93bkV4Y2VwdGlvbnNba10pKQorCQkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZnVsbHkgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVyLiBBbGwgbWV0aG9kaW5mb3MsIGZpZWxkcyBpbmZvcworICogd2lsbCBiZSB0aGVyZWZvcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBieXRlcy4KKyAqLworcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkc0NvdW50OyBpIDwgbWF4OyBpKyspIHsKKwkJZmllbGRzW2ldLmluaXRpYWxpemUoKTsKKwl9CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHNDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCW1ldGhvZHNbaV0uaW5pdGlhbGl6ZSgpOworCX0KKwlpZiAoaW5uZXJJbmZvcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBpbm5lckluZm9zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlpbm5lckluZm9zW2ldLmluaXRpYWxpemUoKTsKKwkJfQorCX0KKwl0aGlzLnJlc2V0KCk7Cit9Citwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKwl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBudWxsOworCXN1cGVyLnJlc2V0KCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFlZjUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBDbGFzc0ZpbGVDb25zdGFudHMgeworCWJ5dGVbXSByZWZlcmVuY2U7CisJaW50IHN0cnVjdE9mZnNldDsKK3B1YmxpYyBDbGFzc0ZpbGVTdHJ1Y3QoYnl0ZSBjbGFzc0ZpbGVCeXRlc1tdLCBpbnQgb2ZmKSB7CisJcmVmZXJlbmNlID0gY2xhc3NGaWxlQnl0ZXM7CisJc3RydWN0T2Zmc2V0ID0gb2ZmOworfQorcHVibGljIENsYXNzRmlsZVN0cnVjdCAoYnl0ZSBjbGFzc0ZpbGVCeXRlc1tdLCBpbnQgb2ZmLCBib29sZWFuIHZlcmlmeVN0cnVjdHVyZSkgeworCXJlZmVyZW5jZSA9IGNsYXNzRmlsZUJ5dGVzOworCXN0cnVjdE9mZnNldCA9IG9mZjsKK30KK3B1YmxpYyBkb3VibGUgZG91YmxlQXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7CisJcmV0dXJuIChEb3VibGUubG9uZ0JpdHNUb0RvdWJsZSh0aGlzLmk4QXQocmVsYXRpdmVPZmZzZXQpKSk7Cit9CitwdWJsaWMgZmxvYXQgZmxvYXRBdChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKKwlyZXR1cm4gKEZsb2F0LmludEJpdHNUb0Zsb2F0KHRoaXMuaTRBdChyZWxhdGl2ZU9mZnNldCkpKTsKK30KK3B1YmxpYyBpbnQgaTFBdChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKKwlyZXR1cm4gcmVmZXJlbmNlW3JlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0XTsKK30KK3B1YmxpYyBpbnQgaTJBdChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKKwlpbnQgcG9zaXRpb24gPSByZWxhdGl2ZU9mZnNldCArIHN0cnVjdE9mZnNldDsKKwlyZXR1cm4gKHJlZmVyZW5jZVtwb3NpdGlvbisrXSA8PCA4KSArIChyZWZlcmVuY2VbcG9zaXRpb25dICYgMHhGRik7Cit9CitwdWJsaWMgaW50IGk0QXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7CisJaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7CisJcmV0dXJuICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgMjQpICsgKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAxNikgKyAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpICsgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKK30KK3B1YmxpYyBsb25nIGk4QXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7CisJaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7CisJcmV0dXJuICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgNTYpICsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA0OCkgKyAoKChsb25nKSAocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikpIDw8IDQwKSArICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgMzIpICsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCAyNCkgKyAoKChsb25nKSAocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikpIDw8IDE2KSArICgoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSkgPDwgOCkgKyAoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSk7Cit9CitwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFR5cGVNb2RpZmllcnMoaW50IG1vZGlmaWVycykgeworCisJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJamF2YS5pby5QcmludFdyaXRlciBwcmludCA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKG91dCk7CisKKwlpZiAoKG1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkgcHJpbnQucHJpbnQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJAorCWlmICgobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkgcHJpbnQucHJpbnQoInByaXZhdGUgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoKG1vZGlmaWVycyAmIEFjY0ZpbmFsKSAhPSAwKSBwcmludC5wcmludCgiZmluYWwgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoKG1vZGlmaWVycyAmIEFjY1N1cGVyKSAhPSAwKSBwcmludC5wcmludCgic3VwZXIgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgIT0gMCkgcHJpbnQucHJpbnQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAorCWlmICgobW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApIHByaW50LnByaW50KCJhYnN0cmFjdCAiKTsgLy8kTk9OLU5MUy0xJAorCXByaW50LmZsdXNoKCk7CisJcmV0dXJuIG91dC50b1N0cmluZygpOworfQorcHVibGljIGludCB1MUF0KGludCByZWxhdGl2ZU9mZnNldCkgeworCXJldHVybiAocmVmZXJlbmNlW3JlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0XSAmIDB4RkYpOworfQorcHVibGljIGludCB1MkF0KGludCByZWxhdGl2ZU9mZnNldCkgeworCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCXJldHVybiAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpICsgKHJlZmVyZW5jZVtwb3NpdGlvbl0gJiAweEZGKTsKK30KK3B1YmxpYyBsb25nIHU0QXQoaW50IHJlbGF0aXZlT2Zmc2V0KSB7CisJaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7CisJcmV0dXJuICgoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkZMKSA8PCAyNCkgKyAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDE2KSArICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkgKyAocmVmZXJlbmNlW3Bvc2l0aW9uXSAmIDB4RkYpKTsKK30KK3B1YmxpYyBjaGFyW10gdXRmOEF0KGludCByZWxhdGl2ZU9mZnNldCwgaW50IGJ5dGVzQXZhaWxhYmxlKSB7CisJaW50IHgsIHksIHo7CisJaW50IGxlbmd0aCA9IGJ5dGVzQXZhaWxhYmxlOworCWNoYXIgb3V0cHV0QnVmW10gPSBuZXcgY2hhcltieXRlc0F2YWlsYWJsZV07CisJaW50IG91dHB1dFBvcyA9IDA7CisJaW50IHJlYWRPZmZzZXQgPSBzdHJ1Y3RPZmZzZXQgKyByZWxhdGl2ZU9mZnNldDsKKwkKKwl3aGlsZSAobGVuZ3RoICE9IDApIHsKKwkJeCA9IHJlZmVyZW5jZVtyZWFkT2Zmc2V0KytdICYgMHhGRjsKKwkJbGVuZ3RoLS07CisJCWlmICgoMHg4MCAmIHgpICE9IDApIHsKKwkJCXkgPSB0aGlzLnJlZmVyZW5jZVtyZWFkT2Zmc2V0KytdICYgMHhGRjsKKwkJCWxlbmd0aC0tOworCQkJaWYgKCh4ICYgMHgyMCkgIT0gMCkgeworCQkJCXogPSB0aGlzLnJlZmVyZW5jZVtyZWFkT2Zmc2V0KytdICYgMHhGRjsKKwkJCQlsZW5ndGgtLTsKKwkJCQl4ID0gKCh4ICYgMHgxRikgPDwgMTIpICsgKCh5ICYgMHgzRikgPDwgNikgKyAoeiAmIDB4M0YpOworCQkJfSBlbHNlIHsKKwkJCQl4ID0gKCh4ICYgMHgxRikgPDwgNikgKyAoeSAmIDB4M0YpOworCQkJfQorCQl9CisJCW91dHB1dEJ1ZltvdXRwdXRQb3MrK10gPSAoY2hhcikgeDsKKwl9CisKKwlpZiAob3V0cHV0UG9zICE9IGJ5dGVzQXZhaWxhYmxlKSB7CisJCVN5c3RlbS5hcnJheWNvcHkob3V0cHV0QnVmLCAwLCAob3V0cHV0QnVmID0gbmV3IGNoYXJbb3V0cHV0UG9zXSksIDAsIG91dHB1dFBvcyk7CisJfQorCXJldHVybiBvdXRwdXRCdWY7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworCXRoaXMucmVmZXJlbmNlID0gbnVsbDsKK30KKworcHVibGljIGNoYXJbXSB1dGY4QXQoaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgYnl0ZXNBdmFpbGFibGUsIGJvb2xlYW4gdGVzdFZhbGlkaXR5KSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCWludCB4LCB5LCB6OworCWludCBsZW5ndGggPSBieXRlc0F2YWlsYWJsZTsKKwljaGFyIG91dHB1dEJ1ZltdID0gbmV3IGNoYXJbYnl0ZXNBdmFpbGFibGVdOworCWludCBvdXRwdXRQb3MgPSAwOworCWludCByZWFkT2Zmc2V0ID0gc3RydWN0T2Zmc2V0ICsgcmVsYXRpdmVPZmZzZXQ7CisJCisJd2hpbGUgKGxlbmd0aCAhPSAwKSB7CisJCXggPSByZWZlcmVuY2VbcmVhZE9mZnNldCsrXSAmIDB4RkY7CisJCWxlbmd0aC0tOworCQlpZiAoKDB4ODAgJiB4KSAhPSAwKSB7CisJCQlpZiAodGVzdFZhbGlkaXR5KSB7CisJCQkJaWYgKCgweDQwICYgeCkgPT0gMCkgeworCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyTWFsZm9ybWVkVXRmOCk7CisJCQkJfQorCQkJCWlmIChsZW5ndGggPCAxKSB7CisJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJNYWxmb3JtZWRVdGY4KTsKKwkJCQl9CisJCQl9CisJCQl5ID0gdGhpcy5yZWZlcmVuY2VbcmVhZE9mZnNldCsrXSAmIDB4RkY7CisJCQlsZW5ndGgtLTsKKwkJCWlmICh0ZXN0VmFsaWRpdHkpIHsKKwkJCQlpZiAoKHkgJiAweEMwKSAhPSAweDgwKSB7CisJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJNYWxmb3JtZWRVdGY4KTsKKwkJCQl9CisJCQl9CisJCQlpZiAoKHggJiAweDIwKSAhPSAwKSB7CisJCQkJaWYgKHRlc3RWYWxpZGl0eSAmJiAobGVuZ3RoIDwgMSkpIHsKKwkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyck1hbGZvcm1lZFV0ZjgpOworCQkJCX0KKwkJCQl6ID0gdGhpcy5yZWZlcmVuY2VbcmVhZE9mZnNldCsrXSAmIDB4RkY7CisJCQkJbGVuZ3RoLS07CisJCQkJaWYgKHRlc3RWYWxpZGl0eSAmJiAoKHogJiAweEMwKSAhPSAweDgwKSkgeworCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyTWFsZm9ybWVkVXRmOCk7CisJCQkJfQorCQkJCXggPSAoKHggJiAweDFGKSA8PCAxMikgKyAoKHkgJiAweDNGKSA8PCA2KSArICh6ICYgMHgzRik7CisJCQkJaWYgKHRlc3RWYWxpZGl0eSAmJiAoeCA8IDB4MDgwMCkpIHsKKwkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyck1hbGZvcm1lZFV0ZjgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJeCA9ICgoeCAmIDB4MUYpIDw8IDYpICsgKHkgJiAweDNGKTsKKwkJCQlpZiAodGVzdFZhbGlkaXR5ICYmICEoKHggPT0gMCkgfHwgKHggPj0gMHg4MCkpKSB7CisJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJNYWxmb3JtZWRVdGY4KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGVzdFZhbGlkaXR5ICYmIHggPT0gMCkgeworCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJyTWFsZm9ybWVkVXRmOCk7CisJCQl9CisJCX0KKwkJb3V0cHV0QnVmW291dHB1dFBvcysrXSA9IChjaGFyKSB4OworCX0KKworCWlmIChvdXRwdXRQb3MgIT0gYnl0ZXNBdmFpbGFibGUpIHsKKwkJU3lzdGVtLmFycmF5Y29weShvdXRwdXRCdWYsIDAsIChvdXRwdXRCdWYgPSBuZXcgY2hhcltvdXRwdXRQb3NdKSwgMCwgb3V0cHV0UG9zKTsKKwl9CisJcmV0dXJuIG91dHB1dEJ1ZjsKK30KK3B1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlNZXRob2ROYW1lQW5kU2lnbmF0dXJlKGNoYXJbXSBuYW1lLCBjaGFyW10gc2lnbmF0dXJlKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCisJLy8gZW5zdXJlIG5hbWUgaXMgbm90IGVtcHR5IAorCWlmIChuYW1lLmxlbmd0aCA9PSAwKSB7CisJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJJbnZhbGlkTWV0aG9kTmFtZSk7CisJfQorCisJLy8gaWYgbmFtZSBiZWdpbnMgd2l0aCB0aGUgPCBjaGFyYWN0ZXIgaXQgbXVzdCBiZSBjbGluaXQgb3IgaW5pdAorCWlmIChuYW1lWzBdID09ICc8JykgeworCQlpZiAobmV3IFN0cmluZyhuYW1lKS5lcXVhbHMoIjxjbGluaXQ+IikgfHwgbmV3IFN0cmluZyhuYW1lKS5lcXVhbHMoIjxpbml0PiIpKSB7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJaW50IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CisJCQlpZiAoISgoc2lnbmF0dXJlTGVuZ3RoID4gMikKKwkJCQkmJiAoc2lnbmF0dXJlWzBdID09ICcoJykKKwkJCQkmJiAoc2lnbmF0dXJlW3NpZ25hdHVyZUxlbmd0aCAtIDJdID09ICcpJykKKwkJCQkmJiAoc2lnbmF0dXJlW3NpZ25hdHVyZUxlbmd0aCAtIDFdID09ICdWJykpKSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2ROYW1lKTsKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiYjUxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKKworcHVibGljIGNsYXNzIENsYXNzRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKwlwcml2YXRlIGludCBlcnJvckNvZGU7CisJcHJpdmF0ZSBpbnQgYnVmZmVyUG9zaXRpb247CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRNYWdpYyA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkTWlub3JWZXJzaW9uID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRNYWpvclZlcnNpb24gPSAzOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkQ29uc3RhbnRDbGFzcz0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRDb25zdGFudFN0cmluZz0gNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRDb25zdGFudE5hbWVBbmRUeXBlID0gNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRDb25zdGFudEZpZWxkUmVmPSA3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckJhZENvbnN0YW50TWV0aG9kUmVmID0gODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRDb25zdGFudEludGVyZmFjZU1ldGhvZFJlZiA9IDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkQ29uc3RhbnRQb29sSW5kZXggPSAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJCYWRTdXBlcmNsYXNzTmFtZSA9IDExOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckludGVyZmFjZUNhbm5vdEJlRmluYWwgPSAxMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJJbnRlcmZhY2VNdXN0QmVBYnN0cmFjdCA9IDEzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckJhZE1vZGlmaWVycyA9IDE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckNsYXNzQ2Fubm90QmVBYnN0cmFjdEZpbmFsID0gMTU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkQ2xhc3NuYW1lID0gMTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkRmllbGRJbmZvID0gMTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyQmFkTWV0aG9kSW5mbyA9IDE3OyAKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckVtcHR5Q29uc3RhbnRQb29sID0xODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJNYWxmb3JtZWRVdGY4ID0gMTk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyVW5rbm93bkNvbnN0YW50VGFnID0gMjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRXJyVHJ1bmNhdGVkSW5wdXQgPSAyMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJNZXRob2RNdXN0QmVBYnN0cmFjdCA9IDIyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyck1hbGZvcm1lZEF0dHJpYnV0ZSA9IDIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckJhZEludGVyZmFjZSA9IDI0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckludGVyZmFjZU11c3RTdWJjbGFzc09iamVjdCA9IDI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckluY29ycmVjdEludGVyZmFjZU1ldGhvZHMgPSAyNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFcnJJbnZhbGlkTWV0aG9kTmFtZSA9IDI3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVyckludmFsaWRNZXRob2RTaWduYXR1cmUgPSAyODsKKyAgICAKK3B1YmxpYyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihpbnQgY29kZSkgeworCWVycm9yQ29kZSA9IGNvZGU7Cit9CitwdWJsaWMgQ2xhc3NGb3JtYXRFeGNlcHRpb24oaW50IGNvZGUsIGludCBidWZQb3MpIHsKKwllcnJvckNvZGUgPSBjb2RlOworCWJ1ZmZlclBvc2l0aW9uID0gYnVmUG9zOworfQorLyoqCisgKiBAcmV0dXJuIGludAorICovCitwdWJsaWMgaW50IGdldEVycm9yQ29kZSgpIHsKKwlyZXR1cm4gZXJyb3JDb2RlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNGRkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEKQEAgLTAsMCArMSwzMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkJvb2xlYW5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5CeXRlQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ2hhckNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkRvdWJsZUNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkZsb2F0Q29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSW50Q29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuTG9uZ0NvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlNob3J0Q29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuU3RyaW5nQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBGaWVsZEluZm8gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cywgSUJpbmFyeUZpZWxkLCBDb21wYXJhYmxlLCBUeXBlSWRzIHsKKwlwcml2YXRlIENvbnN0YW50IGNvbnN0YW50OworCXByaXZhdGUgYm9vbGVhbiBpc0RlcHJlY2F0ZWQ7CisJcHJpdmF0ZSBib29sZWFuIGlzU3ludGhldGljOworCXByaXZhdGUgaW50W10gY29uc3RhbnRQb29sT2Zmc2V0czsKKwlwcml2YXRlIGludCBhY2Nlc3NGbGFnczsKKwlwcml2YXRlIGNoYXJbXSBuYW1lOworCXByaXZhdGUgY2hhcltdIHNpZ25hdHVyZTsKKwlwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7CisJcHJpdmF0ZSBpbnQgYXR0cmlidXRlQnl0ZXM7CisJcHJpdmF0ZSBPYmplY3Qgd3JhcHBlZENvbnN0YW50VmFsdWU7CisvKioKKyAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyBieXRlW10KKyAqIEBwYXJhbSBvZmZzZXRzIGludFtdCisgKiBAcGFyYW0gb2Zmc2V0IGludAorICovCitwdWJsaWMgRmllbGRJbmZvIChieXRlIGNsYXNzRmlsZUJ5dGVzW10sIGludCBvZmZzZXRzW10sIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJc3VwZXIoY2xhc3NGaWxlQnl0ZXMsIG9mZnNldCk7CisJY29uc3RhbnRQb29sT2Zmc2V0cyA9IG9mZnNldHM7CisJYWNjZXNzRmxhZ3MgPSAtMTsKKwlpbnQgYXR0cmlidXRlc0NvdW50ID0gdTJBdCg2KTsKKwlpbnQgcmVhZE9mZnNldCA9IDg7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOworCX0KKwlhdHRyaWJ1dGVCeXRlcyA9IHJlYWRPZmZzZXQ7Cit9CisvKioKKyAqIFJldHVybiB0aGUgY29uc3RhbnQgb2YgdGhlIGZpZWxkLgorICogUmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50Lk5vdEFDb25zdGFudCBpZiB0aGVyZSBpcyBub25lLgorICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudAorICovCitwdWJsaWMgQ29uc3RhbnQgZ2V0Q29uc3RhbnQoKSB7CisJaWYgKGNvbnN0YW50ID09IG51bGwpIHsKKwkJLy8gcmVhZCBjb25zdGFudAorCQlyZWFkQ29uc3RhbnRBdHRyaWJ1dGUoKTsKKwl9CisJcmV0dXJuIGNvbnN0YW50OworfQorLyoqCisgKiBBbnN3ZXIgYW4gaW50IHdob3NlIGJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdGhlIGFjY2VzcyBjb25zdGFudHMKKyAqIGRlZmluZWQgYnkgdGhlIFZNIHNwZWMuCisgKiBTZXQgdGhlIEFjY0RlcHJlY2F0ZWQgYW5kIEFjY1N5bnRoZXRpYyBiaXRzIGlmIG5lY2Vzc2FyeQorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJaWYgKGFjY2Vzc0ZsYWdzID09IC0xKSB7CisJCS8vIGNvbXB1dGUgdGhlIGFjY2Vzc2ZsYWcuIERvbid0IGZvcmdldCB0aGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUKKwkJYWNjZXNzRmxhZ3MgPSB1MkF0KDApOworCQlyZWFkRGVwcmVjYXRlZEFuZFN5bnRoZXRpY0F0dHJpYnV0ZXMoKTsKKwkJaWYgKGlzRGVwcmVjYXRlZCkgeworCQkJYWNjZXNzRmxhZ3MgfD0gQWNjRGVwcmVjYXRlZDsKKwkJfQorCQlpZiAoaXNTeW50aGV0aWMpIHsKKwkJCWFjY2Vzc0ZsYWdzIHw9IEFjY1N5bnRoZXRpYzsKKwkJfQorCX0KKwlyZXR1cm4gYWNjZXNzRmxhZ3M7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkvLyByZWFkIHRoZSBuYW1lCisJCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KDIpXSAtIHN0cnVjdE9mZnNldDsKKwkJbmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSByZWNlaXZlcidzIHR5cGUgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjMuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGU6CisgKiAgIC0gamF2YS5sYW5nLlN0cmluZyBpcyBMamF2YS9sYW5nL1N0cmluZzsKKyAqICAgLSBhbiBpbnQgaXMgSQorICogICAtIGEgMiBkaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzIGlzIFtbTGphdmEvbGFuZy9TdHJpbmc7CisgKiAgIC0gYW4gYXJyYXkgb2YgZmxvYXRzIGlzIFtGCisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIGdldFR5cGVOYW1lKCkgeworCWlmIChzaWduYXR1cmUgPT0gbnVsbCkgeworCQkvLyByZWFkIHRoZSBzaWduYXR1cmUKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoNCldIC0gc3RydWN0T2Zmc2V0OworCQlzaWduYXR1cmUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKKwl9CisJcmV0dXJuIHNpZ25hdHVyZTsKK30KKy8qKgorICogUmV0dXJuIGEgd3JhcHBlciB0aGF0IGNvbnRhaW5zIHRoZSBjb25zdGFudCBvZiB0aGUgZmllbGQuCisgKiBUaHJvd3MgYSBqYXZhLmlibS5jb21waWxlci5qYXZhLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uIGluIGNhc2UgdGhlIHNpZ25hdHVyZSBpcyAKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjb25zdGFudCB0YWcuCisgKiAKKyAqIEBleGNlcHRpb24gamF2YS5pYm0uY29tcGlsZXIuamF2YS5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbgorICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0CisgKi8KK3B1YmxpYyBPYmplY3QgZ2V0V3JhcHBlZENvbnN0YW50VmFsdWUoKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCisJaWYgKHRoaXMud3JhcHBlZENvbnN0YW50VmFsdWUgPT0gbnVsbCkgeworCQlpZiAoaGFzQ29uc3RhbnQoKSkgeworCQkJQ29uc3RhbnQgY29uc3RhbnQgPSBnZXRDb25zdGFudCgpOworCQkJc3dpdGNoIChjb25zdGFudC50eXBlSUQoKSkgeworCQkJCWNhc2UgVF9pbnQgOgorCQkJCQl0aGlzLndyYXBwZWRDb25zdGFudFZhbHVlID0gbmV3IEludGVnZXIoY29uc3RhbnQuaW50VmFsdWUoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IG5ldyBCeXRlKGNvbnN0YW50LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IG5ldyBTaG9ydChjb25zdGFudC5zaG9ydFZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRfY2hhciA6CisJCQkJCXRoaXMud3JhcHBlZENvbnN0YW50VmFsdWUgPSBuZXcgQ2hhcmFjdGVyKGNvbnN0YW50LmNoYXJWYWx1ZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IG5ldyBGbG9hdChjb25zdGFudC5mbG9hdFZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IG5ldyBEb3VibGUoY29uc3RhbnQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IG5ldyBCb29sZWFuKGNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQl0aGlzLndyYXBwZWRDb25zdGFudFZhbHVlID0gbmV3IExvbmcoY29uc3RhbnQubG9uZ1ZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRfU3RyaW5nIDoKKwkJCQkJdGhpcy53cmFwcGVkQ29uc3RhbnRWYWx1ZSA9IGNvbnN0YW50LnN0cmluZ1ZhbHVlKCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRoaXMud3JhcHBlZENvbnN0YW50VmFsdWU7Cit9CisvKioKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS4KKyAqIEByZXR1cm4gYm9vbGVhbgorICovCitwdWJsaWMgYm9vbGVhbiBoYXNDb25zdGFudCgpIHsKKwlyZXR1cm4gZ2V0Q29uc3RhbnQoKSAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Cit9CisvKioKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpcyBhIHN5bnRoZXRpYyBmaWVsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgeworCXJldHVybiAoZ2V0TW9kaWZpZXJzKCkgJiBBY2NTeW50aGV0aWMpICE9IDA7Cit9CisKK3ByaXZhdGUgdm9pZCByZWFkQ29uc3RhbnRBdHRyaWJ1dGUoKSB7CisJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoNik7CisJaW50IHJlYWRPZmZzZXQgPSA4OworCWJvb2xlYW4gaXNDb25zdGFudCA9IGZhbHNlOworCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQlpZiAoQ2hhck9wZXJhdGlvbgorCQkJLmVxdWFscyhhdHRyaWJ1dGVOYW1lLCBDb25zdGFudFZhbHVlTmFtZSkpIHsKKwkJCWlzQ29uc3RhbnQgPSB0cnVlOworCQkJLy8gcmVhZCB0aGUgcmlnaHQgY29uc3RhbnQKKwkJCWludCByZWxhdGl2ZU9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWFkT2Zmc2V0ICsgNildIC0gc3RydWN0T2Zmc2V0OworCQkJc3dpdGNoICh1MUF0KHJlbGF0aXZlT2Zmc2V0KSkgeworCQkJCWNhc2UgSW50ZWdlclRhZyA6CisJCQkJCWNoYXJbXSBzaWduID0gZ2V0VHlwZU5hbWUoKTsKKwkJCQkJaWYgKHNpZ24ubGVuZ3RoID09IDEpIHsKKwkJCQkJCXN3aXRjaCAoc2lnblswXSkgeworCQkJCQkJCWNhc2UgJ1onIDogLy8gYm9vbGVhbiBjb25zdGFudAorCQkJCQkJCQljb25zdGFudCA9IG5ldyBCb29sZWFuQ29uc3RhbnQoaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpID09IDEpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdJJyA6IC8vIGludGVnZXIgY29uc3RhbnQKKwkJCQkJCQkJY29uc3RhbnQgPSBuZXcgSW50Q29uc3RhbnQoaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQycgOiAvLyBjaGFyIGNvbnN0YW50CisJCQkJCQkJCWNvbnN0YW50ID0gbmV3IENoYXJDb25zdGFudCgoY2hhcikgaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQicgOiAvLyBieXRlIGNvbnN0YW50CisJCQkJCQkJCWNvbnN0YW50ID0gbmV3IEJ5dGVDb25zdGFudCgoYnl0ZSkgaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnUycgOiAvLyBzaG9ydCBjb25zdGFudAorCQkJCQkJCQljb25zdGFudCA9IG5ldyBTaG9ydENvbnN0YW50KChzaG9ydCkgaTRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7ICAgICAgICAgICAgICAgICAgIAorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBGbG9hdFRhZyA6CisJCQkJCWNvbnN0YW50ID0gbmV3IEZsb2F0Q29uc3RhbnQoZmxvYXRBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEb3VibGVUYWcgOgorCQkJCQljb25zdGFudCA9IG5ldyBEb3VibGVDb25zdGFudChkb3VibGVBdChyZWxhdGl2ZU9mZnNldCArIDEpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMb25nVGFnIDoKKwkJCQkJY29uc3RhbnQgPSBuZXcgTG9uZ0NvbnN0YW50KGk4QXQocmVsYXRpdmVPZmZzZXQgKyAxKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU3RyaW5nVGFnIDoKKwkJCQkJdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChyZWxhdGl2ZU9mZnNldCArIDEpXSAtIHN0cnVjdE9mZnNldDsKKwkJCQkJY29uc3RhbnQgPSAKKwkJCQkJCW5ldyBTdHJpbmdDb25zdGFudCgKKwkJCQkJCQlTdHJpbmcudmFsdWVPZih1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKSkpOyAKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQocmVhZE9mZnNldCArIDIpKTsKKwl9CisJaWYgKCFpc0NvbnN0YW50KSB7CisJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCX0KK30KK3ByaXZhdGUgdm9pZCByZWFkRGVwcmVjYXRlZEFuZFN5bnRoZXRpY0F0dHJpYnV0ZXMoKSB7CisJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoNik7CisJaW50IHJlYWRPZmZzZXQgPSA4OworCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgRGVwcmVjYXRlZE5hbWUpKSB7CisJCQlpc0RlcHJlY2F0ZWQgPSB0cnVlOworCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIFN5bnRoZXRpY05hbWUpKSB7CisJCQlpc1N5bnRoZXRpYyA9IHRydWU7CisJCX0KKwkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQocmVhZE9mZnNldCArIDIpKTsKKwl9Cit9CisvKioKKyAqIEFuc3dlciB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZXIgaW4gYnl0ZXMuCisgKiAKKyAqIEByZXR1cm4gaW50CisgKi8KK3B1YmxpYyBpbnQgc2l6ZUluQnl0ZXMoKSB7CisJcmV0dXJuIGF0dHJpYnV0ZUJ5dGVzOworfQorcHVibGljIHZvaWQgdGhyb3dGb3JtYXRFeGNlcHRpb24oKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJCYWRGaWVsZEluZm8pOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwlpbnQgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKCk7CisJcmV0dXJuIGJ1ZmZlcgorCQkuYXBwZW5kKCJ7IikgLy8kTk9OLU5MUy0xJAorCQkuYXBwZW5kKAorCQkJKChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwID8gImRlcHJlY2F0ZWQgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDAxKSA9PSAxID8gInB1YmxpYyAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDIpID09IDB4MDAwMiA/ICJwcml2YXRlICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwNCkgPT0gMHgwMDA0ID8gInByb3RlY3RlZCAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDgpID09IDB4MDAwMDA4ID8gInN0YXRpYyAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMTApID09IDB4MDAxMCA/ICJmaW5hbCAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwNDApID09IDB4MDA0MCA/ICJ2b2xhdGlsZSAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwODApID09IDB4MDA4MCA/ICJ0cmFuc2llbnQgIiA6ICIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCS5hcHBlbmQoZ2V0VHlwZU5hbWUoKSkKKwkJLmFwcGVuZCgiICIpIC8vJE5PTi1OTFMtMSQKKwkJLmFwcGVuZChnZXROYW1lKCkpCisJCS5hcHBlbmQoIiAiKSAvLyROT04tTkxTLTEkCisJCS5hcHBlbmQoZ2V0Q29uc3RhbnQoKSkKKwkJLmFwcGVuZCgifSIpIC8vJE5PTi1OTFMtMSQKKwkJLnRvU3RyaW5nKCk7IAorfQorCitwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgeworCWlmICghKG8gaW5zdGFuY2VvZiBGaWVsZEluZm8pKSB7CisJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKKwl9CisJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5nZXROYW1lKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKCgoRmllbGRJbmZvKSBvKS5nZXROYW1lKCkpKTsKK30KKy8qKgorICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmdWxseSBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZXIuIEFsbCBtZXRob2RpbmZvcywgZmllbGRzIGluZm9zCisgKiB3aWxsIGJlIHRoZXJlZm9yZSBmdWxseSBpbml0aWFsaXplZCBhbmQgd2UgY2FuIGdldCByaWQgb2YgdGhlIGJ5dGVzLgorICovCit2b2lkIGluaXRpYWxpemUoKSB7CisJZ2V0TW9kaWZpZXJzKCk7CisJZ2V0TmFtZSgpOworCWdldENvbnN0YW50KCk7CisJZ2V0VHlwZU5hbWUoKTsKKwlyZXNldCgpOworfQorcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzID0gbnVsbDsKKwlzdXBlci5yZXNldCgpOworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9Jbm5lckNsYXNzSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjgwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TmVzdGVkVHlwZTsKKworLyoqCisgKiBEZXNjcmliZXMgb25lIGVudHJ5IGluIHRoZSBjbGFzc2VzIHRhYmxlIG9mIHRoZSBJbm5lckNsYXNzZXMgYXR0cmlidXRlLgorICogU2VlIHRoZSBpbm5lciBjbGFzcyBzcGVjaWZpY2F0aW9uIChUaGUgY2xhc3MgZmlsZSBhdHRyaWJ1dGUgIklubmVyQ2xhc3NlcyIpLgorICovCisKK3B1YmxpYyBjbGFzcyBJbm5lckNsYXNzSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlOZXN0ZWRUeXBlIHsKKwlpbnQgaW5uZXJDbGFzc05hbWVJbmRleCA9IC0xOworCWludCBvdXRlckNsYXNzTmFtZUluZGV4ID0gLTE7CisJaW50IGlubmVyTmFtZUluZGV4ID0gLTE7CisJcHJpdmF0ZSBjaGFyW10gaW5uZXJDbGFzc05hbWU7CisJcHJpdmF0ZSBjaGFyW10gb3V0ZXJDbGFzc05hbWU7CisJcHJpdmF0ZSBjaGFyW10gaW5uZXJOYW1lOworCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzID0gLTE7CisJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzOworCXByaXZhdGUgYm9vbGVhbiByZWFkSW5uZXJDbGFzc05hbWUgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gcmVhZE91dGVyQ2xhc3NOYW1lID0gZmFsc2U7CisJcHJpdmF0ZSBib29sZWFuIHJlYWRJbm5lck5hbWUgPSBmYWxzZTsKK3B1YmxpYyBJbm5lckNsYXNzSW5mbyhieXRlIGNsYXNzRmlsZUJ5dGVzW10sIGludCBvZmZzZXRzW10sIGludCBvZmZzZXQpCisJdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKwlzdXBlcihjbGFzc0ZpbGVCeXRlcywgb2Zmc2V0KTsKKwljb25zdGFudFBvb2xPZmZzZXRzID0gb2Zmc2V0czsKKwlpbm5lckNsYXNzTmFtZUluZGV4ID0gdTJBdCgwKTsKKwlvdXRlckNsYXNzTmFtZUluZGV4ID0gdTJBdCgyKTsKKwl0aGlzLmlubmVyTmFtZUluZGV4ID0gdTJBdCg0KTsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgdHlwZSBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqIEByZXR1cm4gY2hhcltdCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSB7CisJaWYgKCFyZWFkT3V0ZXJDbGFzc05hbWUpIHsKKwkJLy8gcmVhZCBvdXRlciBjbGFzcyBuYW1lCisJCXJlYWRPdXRlckNsYXNzTmFtZSA9IHRydWU7CisJCWlmIChvdXRlckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWludCB1dGY4T2Zmc2V0ID0gCisJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KAorCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW291dGVyQ2xhc3NOYW1lSW5kZXhdIC0gc3RydWN0T2Zmc2V0ICsgMSldCisJCQkJCS0gc3RydWN0T2Zmc2V0OyAKKwkJCW91dGVyQ2xhc3NOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCX0KKworCX0KKwlyZXR1cm4gb3V0ZXJDbGFzc05hbWU7Cit9CisvKioKKyAqIEFuc3dlciBhbiBpbnQgd2hvc2UgYml0cyBhcmUgc2V0IGFjY29yZGluZyB0aGUgYWNjZXNzIGNvbnN0YW50cworICogZGVmaW5lZCBieSB0aGUgVk0gc3BlYy4KKyAqIEByZXR1cm4gaW50CisgKi8KK3B1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCWlmIChhY2Nlc3NGbGFncyA9PSAtMSkgeworCQkvLyByZWFkIGFjY2VzcyBmbGFnCisJCWFjY2Vzc0ZsYWdzID0gdTJBdCg2KTsKKwl9CisJcmV0dXJuIGFjY2Vzc0ZsYWdzOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIG1lbWJlciB0eXBlIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgcDEucDIuQS5NIGlzIHAxL3AyL0EkTS4KKyAqIEByZXR1cm4gY2hhcltdCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKKwlpZiAoIXJlYWRJbm5lckNsYXNzTmFtZSkgeworCQkvLyByZWFkIHRoZSBpbm5lciBjbGFzcyBuYW1lCisJCXJlYWRJbm5lckNsYXNzTmFtZSA9IHRydWU7CisJCWlmIChpbm5lckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWludCAgY2xhc3NPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW2lubmVyQ2xhc3NOYW1lSW5kZXhdIC0gc3RydWN0T2Zmc2V0OworCQkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoY2xhc3NPZmZzZXQgKyAxKV0gLSBzdHJ1Y3RPZmZzZXQ7CisJCQlpbm5lckNsYXNzTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQl9CisJfQorCXJldHVybiBpbm5lckNsYXNzTmFtZTsKK30KKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBvZiB0aGUgbWVtYmVyIHR5cGUuCisgKgorICogRm9yIGV4YW1wbGUsIHAxLnAyLkEuTSBpcyBNLgorICogQHJldHVybiBjaGFyW10KKyAqLworcHVibGljIGNoYXJbXSBnZXRTb3VyY2VOYW1lKCkgeworCWlmICghdGhpcy5yZWFkSW5uZXJOYW1lKSB7CisJCXRoaXMucmVhZElubmVyTmFtZSA9IHRydWU7CisJCWlmIChpbm5lck5hbWVJbmRleCAhPSAwKSB7CisJCQlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbaW5uZXJOYW1lSW5kZXhdIC0gc3RydWN0T2Zmc2V0OworCQkJaW5uZXJOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxKSk7CisJCX0KKwl9CisJcmV0dXJuIGlubmVyTmFtZTsKK30KKy8qKgorICogQW5zd2VyIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCisgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWlmIChnZXROYW1lKCkgIT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7CisJfQorCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSk7CisJfQorCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZ2V0U291cmNlTmFtZSgpICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRTb3VyY2VOYW1lKCkpOworCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7ICAgCit9CisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZnVsbHkgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVyLiBBbGwgbWV0aG9kaW5mb3MsIGZpZWxkcyBpbmZvcworICogd2lsbCBiZSB0aGVyZWZvcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBieXRlcy4KKyAqLwordm9pZCBpbml0aWFsaXplKCkgeworCWdldE1vZGlmaWVycygpOworCWdldE5hbWUoKTsKKwlnZXRTb3VyY2VOYW1lKCk7CisJZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKTsKKwlyZXNldCgpOworfQorcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzID0gbnVsbDsKKwlzdXBlci5yZXNldCgpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlMGZhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlNZXRob2QsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21wYXJhYmxlIHsKKwlwcml2YXRlIGNoYXJbXVtdIGV4Y2VwdGlvbk5hbWVzOworCXByaXZhdGUgaW50W10gY29uc3RhbnRQb29sT2Zmc2V0czsKKwlwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkOworCXByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYzsKKwlwcml2YXRlIGludCBhY2Nlc3NGbGFnczsKKwlwcml2YXRlIGNoYXJbXSBuYW1lOworCXByaXZhdGUgY2hhcltdIHNpZ25hdHVyZTsKKwlwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7CisJcHJpdmF0ZSBpbnQgYXR0cmlidXRlQnl0ZXM7CisJc3RhdGljIHByaXZhdGUgZmluYWwgY2hhcltdW10gbm9FeGNlcHRpb24gPSBuZXcgY2hhclswXVswXTsKKwlwcml2YXRlIGludCBkZWNvZGVJbmRleDsKKy8qKgorICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIGJ5dGVbXQorICogQHBhcmFtIG9mZnNldHMgaW50W10KKyAqIEBwYXJhbSBvZmZzZXQgaW50CisgKi8KK3B1YmxpYyBNZXRob2RJbmZvIChieXRlIGNsYXNzRmlsZUJ5dGVzW10sIGludCBvZmZzZXRzW10sIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJc3VwZXIoY2xhc3NGaWxlQnl0ZXMsIG9mZnNldCk7CisJY29uc3RhbnRQb29sT2Zmc2V0cyA9IG9mZnNldHM7CisJYWNjZXNzRmxhZ3MgPSAtMTsKKwlpbnQgYXR0cmlidXRlc0NvdW50ID0gdTJBdCg2KTsKKwlpbnQgcmVhZE9mZnNldCA9IDg7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQlyZWFkT2Zmc2V0ICs9ICg2ICsgdTRBdChyZWFkT2Zmc2V0ICsgMikpOworCX0KKwlhdHRyaWJ1dGVCeXRlcyA9IHJlYWRPZmZzZXQ7Cit9CisvKioKKyAqIEBzZWUgSUdlbmVyaWNNZXRob2QjZ2V0QXJndW1lbnROYW1lcygpCisgKi8KK3B1YmxpYyBjaGFyW11bXSBnZXRBcmd1bWVudE5hbWVzKCkgeworCXJldHVybiBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWVzIG9mIHRoZSBleGNlcHRpb24gdHlwZXMgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjCisgKiBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgamF2YS5sYW5nLlN0cmluZyBpcyBqYXZhL2xhbmcvU3RyaW5nLgorICogQHJldHVybiBjaGFyW11bXQorICovCitwdWJsaWMgY2hhcltdW10gZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCkgeworCWlmIChleGNlcHRpb25OYW1lcyA9PSBudWxsKSB7CisJCXJlYWRFeGNlcHRpb25BdHRyaWJ1dGVzKCk7CisJfQorCXJldHVybiBleGNlcHRpb25OYW1lczsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG1ldGhvZCBkZXNjcmlwdG9yIHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVyICYKKyAqIHJldHVybiB0eXBlcyBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjMuMyBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGU6CisgKiAgIC0gaW50IGZvbyhTdHJpbmcpIGlzIChMamF2YS9sYW5nL1N0cmluZzspSQorICogICAtIHZvaWQgZm9vKE9iamVjdFtdKSBpcyAoSSlbTGphdmEvbGFuZy9PYmplY3Q7CisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIGdldE1ldGhvZERlc2NyaXB0b3IoKSB7CisJaWYgKHNpZ25hdHVyZSA9PSBudWxsKSB7CisJCS8vIHJlYWQgdGhlIG5hbWUKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQoNCldIC0gc3RydWN0T2Zmc2V0OworCQlzaWduYXR1cmUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKKwl9CisJcmV0dXJuIHNpZ25hdHVyZTsKK30KKy8qKgorICogQW5zd2VyIGFuIGludCB3aG9zZSBiaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRoZSBhY2Nlc3MgY29uc3RhbnRzCisgKiBkZWZpbmVkIGJ5IHRoZSBWTSBzcGVjLgorICogU2V0IHRoZSBBY2NEZXByZWNhdGVkIGFuZCBBY2NTeW50aGV0aWMgYml0cyBpZiBuZWNlc3NhcnkKKyAqIEByZXR1cm4gaW50CisgKi8KK3B1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCWlmIChhY2Nlc3NGbGFncyA9PSAtMSkgeworCQkvLyBjb21wdXRlIHRoZSBhY2Nlc3NmbGFnLiBEb24ndCBmb3JnZXQgdGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlCisJCWFjY2Vzc0ZsYWdzID0gdTJBdCgwKTsKKwkJcmVhZERlcHJlY2F0ZWRBbmRTeW50aGV0aWNBdHRyaWJ1dGVzKCk7CisJCWlmIChpc0RlcHJlY2F0ZWQpIHsKKwkJCWFjY2Vzc0ZsYWdzIHw9IEFjY0RlcHJlY2F0ZWQ7CisJCX0KKwkJaWYgKGlzU3ludGhldGljKSB7CisJCQlhY2Nlc3NGbGFncyB8PSBBY2NTeW50aGV0aWM7CisJCX0KKwl9CisJcmV0dXJuIGFjY2Vzc0ZsYWdzOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAqCisgKiBGb3IgYSBjb25zdHJ1Y3RvciwgYW5zd2VyIDxpbml0PiAmIDxjbGluaXQ+IGZvciBhIGNsaW5pdCBtZXRob2QuCisgKiBAcmV0dXJuIGNoYXJbXQorICovCitwdWJsaWMgY2hhcltdIGdldFNlbGVjdG9yKCkgeworCWlmIChuYW1lID09IG51bGwpIHsKKwkJLy8gcmVhZCB0aGUgbmFtZQorCQlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdCgyKV0gLSBzdHJ1Y3RPZmZzZXQ7CisJCW5hbWUgPSB1dGY4QXQodXRmOE9mZnNldCArIDMsIHUyQXQodXRmOE9mZnNldCArIDEpKTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisvKioKKyAqIEFuc3dlciB0cnVlIGlmIHRoZSBtZXRob2QgaXMgYSBjbGFzcyBpbml0aWFsaXplciwgZmFsc2Ugb3RoZXJ3aXNlLgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgeworCWNoYXJbXSBzZWxlY3RvciA9IGdldFNlbGVjdG9yKCk7CisJcmV0dXJuIHNlbGVjdG9yWzBdID09ICc8JyAmJiBzZWxlY3Rvci5sZW5ndGggPT0gODsgLy8gQ2FuIG9ubHkgbWF0Y2ggPGNsaW5pdD4KK30KKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yLCBmYWxzZSBvdGhlcndpc2UuCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKwljaGFyW10gc2VsZWN0b3IgPSBnZXRTZWxlY3RvcigpOworCXJldHVybiBzZWxlY3RvclswXSA9PSAnPCcgJiYgc2VsZWN0b3IubGVuZ3RoID09IDY7IC8vIENhbiBvbmx5IG1hdGNoIDxpbml0PgorfQorLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgYSBzeW50aGV0aWMgbWV0aG9kLCBmYWxzZSBvdGhlcndpc2UuCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJcmV0dXJuIChnZXRNb2RpZmllcnMoKSAmIEFjY1N5bnRoZXRpYykgIT0gMDsKK30KK3ByaXZhdGUgdm9pZCByZWFkRGVwcmVjYXRlZEFuZFN5bnRoZXRpY0F0dHJpYnV0ZXMoKSB7CisJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoNik7CisJaW50IHJlYWRPZmZzZXQgPSA4OworCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgRGVwcmVjYXRlZE5hbWUpKSB7CisJCQlpc0RlcHJlY2F0ZWQgPSB0cnVlOworCQl9IGVsc2UgaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIFN5bnRoZXRpY05hbWUpKSB7CisJCQlpc1N5bnRoZXRpYyA9IHRydWU7CisJCX0KKwkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQocmVhZE9mZnNldCArIDIpKTsKKwl9Cit9Citwcml2YXRlIHZvaWQgcmVhZEV4Y2VwdGlvbkF0dHJpYnV0ZXMoKSB7CisJaW50IGF0dHJpYnV0ZXNDb3VudCA9IHUyQXQoNik7CisJaW50IHJlYWRPZmZzZXQgPSA4OworCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0OworCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXR0cmlidXRlTmFtZSwgRXhjZXB0aW9uc05hbWUpKSB7CisJCQkvLyByZWFkIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9uIGVudHJpZXMKKwkJCWludCBlbnRyaWVzTnVtYmVyID0gdTJBdChyZWFkT2Zmc2V0ICsgNik7CisJCQkvLyBwbGFjZSB0aGUgcmVhZE9mZnNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb25zIHRhYmxlCisJCQlyZWFkT2Zmc2V0ICs9IDg7CisJCQlpZiAoZW50cmllc051bWJlciA9PSAwKSB7CisJCQkJZXhjZXB0aW9uTmFtZXMgPSBub0V4Y2VwdGlvbjsKKwkJCX0gZWxzZSB7CisJCQkJZXhjZXB0aW9uTmFtZXMgPSBuZXcgY2hhcltlbnRyaWVzTnVtYmVyXVtdOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllc051bWJlcjsgaisrKSB7CisJCQkJCXV0ZjhPZmZzZXQgPSAKKwkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbdTJBdCgKKwkJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW3UyQXQocmVhZE9mZnNldCldIC0gc3RydWN0T2Zmc2V0ICsgMSldCisJCQkJCQkJLSBzdHJ1Y3RPZmZzZXQ7IAorCQkJCQlleGNlcHRpb25OYW1lc1tqXSA9IHV0ZjhBdCh1dGY4T2Zmc2V0ICsgMywgdTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworCQkJCQlyZWFkT2Zmc2V0ICs9IDI7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQocmVhZE9mZnNldCArIDIpKTsKKwkJfQorCX0KKwlpZiAoZXhjZXB0aW9uTmFtZXMgPT0gbnVsbCkgeworCQlleGNlcHRpb25OYW1lcyA9IG5vRXhjZXB0aW9uOworCX0KK30KKy8qKgorICogQW5zd2VyIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlciBpbiBieXRlcy4KKyAqIAorICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBzaXplSW5CeXRlcygpIHsKKwlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWludCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoKTsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwlyZXR1cm4gYnVmZmVyCisJCS5hcHBlbmQoInsiKSAvLyROT04tTkxTLTEkCisJCS5hcHBlbmQoCisJCQkoKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDAgPyAiZGVwcmVjYXRlZCAiIDogIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSsgKChtb2RpZmllcnMgJiAweDAwMDEpID09IDEgPyAicHVibGljICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwMikgPT0gMHgwMDAyID8gInByaXZhdGUgIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICgobW9kaWZpZXJzICYgMHgwMDA0KSA9PSAweDAwMDQgPyAicHJvdGVjdGVkICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAwOCkgPT0gMHgwMDAwMDggPyAic3RhdGljICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDAxMCkgPT0gMHgwMDEwID8gImZpbmFsICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDA0MCkgPT0gMHgwMDQwID8gInZvbGF0aWxlICIgOiAiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoKG1vZGlmaWVycyAmIDB4MDA4MCkgPT0gMHgwMDgwID8gInRyYW5zaWVudCAiIDogIiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJLmFwcGVuZChnZXRTZWxlY3RvcigpKQorCQkuYXBwZW5kKGdldE1ldGhvZERlc2NyaXB0b3IoKSkKKwkJLmFwcGVuZCgifSIpIC8vJE5PTi1OTFMtMSQKKwkJLnRvU3RyaW5nKCk7IAorfQorcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKwlpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kSW5mbykpIHsKKwkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOworCX0KKworCU1ldGhvZEluZm8gb3RoZXJNZXRob2QgPSAoTWV0aG9kSW5mbykgbzsKKwlpbnQgcmVzdWx0ID0gbmV3IFN0cmluZyh0aGlzLmdldFNlbGVjdG9yKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKG90aGVyTWV0aG9kLmdldFNlbGVjdG9yKCkpKTsKKwlpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CisJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5nZXRNZXRob2REZXNjcmlwdG9yKCkpLmNvbXBhcmVUbyhuZXcgU3RyaW5nKG90aGVyTWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKSkpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZnVsbHkgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmVyLiBBbGwgbWV0aG9kaW5mb3MsIGZpZWxkcyBpbmZvcworICogd2lsbCBiZSB0aGVyZWZvcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBieXRlcy4KKyAqLwordm9pZCBpbml0aWFsaXplKCkgeworCWdldE1vZGlmaWVycygpOworCWdldFNlbGVjdG9yKCk7CisJZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCWdldEV4Y2VwdGlvblR5cGVOYW1lcygpOworCXJlc2V0KCk7Cit9Citwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKwl0aGlzLmNvbnN0YW50UG9vbE9mZnNldHMgPSBudWxsOworCXN1cGVyLnJlc2V0KCk7Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0F0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2ZGIxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0F0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlTmFtZXNDb25zdGFudHMgeworCWZpbmFsIGNoYXJbXSBTeW50aGV0aWNOYW1lID0gbmV3IGNoYXJbXSB7J1MnLCAneScsICduJywgJ3QnLCAnaCcsICdlJywgJ3QnLCAnaScsICdjJ307CisJZmluYWwgY2hhcltdIENvbnN0YW50VmFsdWVOYW1lID0gbmV3IGNoYXJbXSB7J0MnLCAnbycsICduJywgJ3MnLCAndCcsICdhJywgJ24nLCAndCcsICdWJywgJ2EnLCAnbCcsICd1JywgJ2UnfTsKKwlmaW5hbCBjaGFyW10gTGluZU51bWJlclRhYmxlTmFtZSA9IG5ldyBjaGFyW10geydMJywgJ2knLCAnbicsICdlJywgJ04nLCAndScsICdtJywgJ2InLCAnZScsICdyJywgJ1QnLCAnYScsICdiJywgJ2wnLCAnZSd9OworCWZpbmFsIGNoYXJbXSBMb2NhbFZhcmlhYmxlVGFibGVOYW1lID0gbmV3IGNoYXJbXSB7J0wnLCAnbycsICdjJywgJ2EnLCAnbCcsICdWJywgJ2EnLCAncicsICdpJywgJ2EnLCAnYicsICdsJywgJ2UnLCAnVCcsICdhJywgJ2InLCAnbCcsICdlJ307CisJZmluYWwgY2hhcltdIElubmVyQ2xhc3NOYW1lID0gbmV3IGNoYXJbXSB7J0knLCAnbicsICduJywgJ2UnLCAncicsICdDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnZScsICdzJ307CisJZmluYWwgY2hhcltdIENvZGVOYW1lID0gbmV3IGNoYXJbXSB7J0MnLCAnbycsICdkJywgJ2UnfTsKKwlmaW5hbCBjaGFyW10gRXhjZXB0aW9uc05hbWUgPSBuZXcgY2hhcltdIHsnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nLCAncyd9OworCWZpbmFsIGNoYXJbXSBTb3VyY2VOYW1lID0gbmV3IGNoYXJbXSB7J1MnLCAnbycsICd1JywgJ3InLCAnYycsICdlJywgJ0YnLCAnaScsICdsJywgJ2UnfTsKKwlmaW5hbCBjaGFyW10gRGVwcmVjYXRlZE5hbWUgPSBuZXcgY2hhcltdIHsnRCcsICdlJywgJ3AnLCAncicsICdlJywgJ2MnLCAnYScsICd0JywgJ2UnLCAnZCd9OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DYXNlTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdiOTJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBDYXNlTGFiZWwgZXh0ZW5kcyBMYWJlbCB7CisJcHVibGljIGludCBpbnN0cnVjdGlvblBvc2l0aW9uID0gUE9TX05PVF9TRVQ7CisJcHVibGljIGludCBiYWNrd2FyZHNCcmFuY2ggPSBQT1NfTk9UX1NFVDsKKy8qKgorICogQ2FzZUxhYmVsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKi8KK3B1YmxpYyBDYXNlTGFiZWwoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJc3VwZXIoY29kZVN0cmVhbSk7Cit9CisvKgorKiBQdXQgZG93biAgYSByZWZlcm5lY2UgdG8gdGhlIGFycmF5IGF0IHRoZSBsb2NhdGlvbiBpbiB0aGUgY29kZXN0cmVhbS4KKyovCit2b2lkIGJyYW5jaCgpIHsKKwlpZiAocG9zaXRpb24gPT0gUE9TX05PVF9TRVQpIHsKKwkJYWRkRm9yd2FyZFJlZmVyZW5jZShjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJLy8gTGVhdmUgNCBieXRlcyBmcmVlIHRvIGdlbmVyYXRlIHRoZSBqdW1wIG9mZnNldCBhZnRlcndhcmRzCisJCWNvZGVTdHJlYW0ucG9zaXRpb24gKz0gNDsKKwkJY29kZVN0cmVhbS5jbGFzc0ZpbGVPZmZzZXQgKz0gNDsKKwl9IGVsc2UgeyAvL1Bvc2l0aW9uIGlzIHNldC4gV3JpdGUgaXQhCisJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRXb3JkKHBvc2l0aW9uIC0gY29kZVN0cmVhbS5wb3NpdGlvbiArIDEpOworCX0KK30KKy8qCisqIFB1dCBkb3duICBhIHJlZmVybmVjZSB0byB0aGUgYXJyYXkgYXQgdGhlIGxvY2F0aW9uIGluIHRoZSBjb2Rlc3RyZWFtLgorKi8KK3ZvaWQgYnJhbmNoV2lkZSgpIHsKKwlpZiAocG9zaXRpb24gPT0gUE9TX05PVF9TRVQpIHsKKwkJYWRkRm9yd2FyZFJlZmVyZW5jZShjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJLy8gTGVhdmUgNCBieXRlcyBmcmVlIHRvIGdlbmVyYXRlIHRoZSBqdW1wIG9mZnNldCBhZnRlcndhcmRzCisJCWNvZGVTdHJlYW0ucG9zaXRpb24gKz0gNDsKKwl9IGVsc2UgeyAvL1Bvc2l0aW9uIGlzIHNldC4gV3JpdGUgaXQhCisJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRXb3JkKHBvc2l0aW9uIC0gY29kZVN0cmVhbS5wb3NpdGlvbiArIDEpOworCX0KK30KK3B1YmxpYyBib29sZWFuIGlzU3RhbmRhcmRMYWJlbCgpeworCXJldHVybiBmYWxzZTsKK30KKy8qCisqIFB1dCBkb3duICBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgYXQgdGhlIGxvY2F0aW9uIGluIHRoZSBjb2Rlc3RyZWFtLgorKi8KK3B1YmxpYyB2b2lkIHBsYWNlKCkgeworCXBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlpZiAoaW5zdHJ1Y3Rpb25Qb3NpdGlvbiA9PSBQT1NfTk9UX1NFVCkKKwkJYmFja3dhcmRzQnJhbmNoID0gcG9zaXRpb247CisJZWxzZSB7CisJCWludCBvZmZzZXQgPSBwb3NpdGlvbiAtIGluc3RydWN0aW9uUG9zaXRpb247CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yd2FyZFJlZmVyZW5jZUNvdW50OyBpKyspIHsKKwkJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRXb3JkKGZvcndhcmRSZWZlcmVuY2VzW2ldLCBvZmZzZXQpOworCQl9CisJCS8vIGFkZCB0aGUgbGFiZWwgaW50IHRoZSBjb2RlU3RyZWFtIGxhYmVscyBjb2xsZWN0aW9uCisJCWNvZGVTdHJlYW0uYWRkTGFiZWwodGhpcyk7CisJfQorfQorLyoKKyogUHV0IGRvd24gIGEgcmVmZXJuZWNlIHRvIHRoZSBhcnJheSBhdCB0aGUgbG9jYXRpb24gaW4gdGhlIGNvZGVzdHJlYW0uCisqLwordm9pZCBwbGFjZUluc3RydWN0aW9uKCkgeworCWlmIChpbnN0cnVjdGlvblBvc2l0aW9uID09IFBPU19OT1RfU0VUKSB7CisJCWluc3RydWN0aW9uUG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAoYmFja3dhcmRzQnJhbmNoICE9IFBPU19OT1RfU0VUKSB7CisJCQlpbnQgb2Zmc2V0ID0gYmFja3dhcmRzQnJhbmNoIC0gaW5zdHJ1Y3Rpb25Qb3NpdGlvbjsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yd2FyZFJlZmVyZW5jZUNvdW50OyBpKyspCisJCQkJY29kZVN0cmVhbS53cml0ZVNpZ25lZFdvcmQoZm9yd2FyZFJlZmVyZW5jZXNbaV0sIG9mZnNldCk7CisJCQliYWNrd2FyZHNCcmFuY2ggPSBQT1NfTk9UX1NFVDsKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DaGFyQXJyYXlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTlhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DaGFyQXJyYXlDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlDYWNoZSB7CisJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscworCXB1YmxpYyBjaGFyW10ga2V5VGFibGVbXTsKKwlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsKKwlpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKKwlpbnQgdGhyZXNob2xkOworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUuIEEgZGVmYXVsdCBjYXBhY2l0eSBpcyB1c2VkLgorICogTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IGdyb3cgd2hlbiBpdCBnZXRzIGZ1bGwuCisgKi8KK3B1YmxpYyBDaGFyQXJyYXlDYWNoZSgpIHsKKwl0aGlzKDEzKTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCisgKiBjYXBhY2l0eS4KKyAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50CisgKgl0aGUgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cworICovCitwdWJsaWMgQ2hhckFycmF5Q2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCXRoaXMuZWxlbWVudFNpemUgPSAwOworCXRoaXMudGhyZXNob2xkID0gKGludCkgKGluaXRpYWxDYXBhY2l0eSAqIDAuNjZmKTsKKwl0aGlzLmtleVRhYmxlID0gbmV3IGNoYXJbaW5pdGlhbENhcGFjaXR5XVtdOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKK30KKy8qKgorICogQ2xlYXJzIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgaXQgaGFzIG5vIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgKi8KK3B1YmxpYyB2b2lkIGNsZWFyKCkgeworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykgeworCQlrZXlUYWJsZVtpXSA9IG51bGw7CisJCXZhbHVlVGFibGVbaV0gPSAwOworCX0KKwllbGVtZW50U2l6ZSA9IDA7Cit9CisvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZm9yIHRoZSBrZXkuCisgKgorICogQHBhcmFtIGNoYXJbXSBrZXkgdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGNoYXJbXSBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoQ29kZUNoYXIoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGtleVRhYmxlW2luZGV4XSwga2V5KSkKKwkJCXJldHVybiB0cnVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKiogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUKKyAqIGhhc2h0YWJsZS4KKyAqIEBwYXJhbSBrZXkgPENPREU+Y2hhcltdPC9DT0RFPiB0aGUgc3BlY2lmaWVkIGtleQorICogQHJldHVybiBpbnQgdGhlIGVsZW1lbnQgZm9yIHRoZSBrZXkgb3IgLTEgaWYgdGhlIGtleSBpcyBub3QKKyAqCWRlZmluZWQgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KK3B1YmxpYyBpbnQgZ2V0KGNoYXJbXSBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoQ29kZUNoYXIoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGtleVRhYmxlW2luZGV4XSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIC0xOworfQorcHJpdmF0ZSBpbnQgaGFzaENvZGVDaGFyKGNoYXJbXSB2YWwpIHsKKwlpbnQgbGVuZ3RoID0gdmFsLmxlbmd0aDsKKwlpbnQgaGFzaCA9IDA7CisJaW50IG4gPSAyOyAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBza2lwcGVkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gbikgeworCQloYXNoICs9IHZhbFtpXTsKKwl9CisJcmV0dXJuIChoYXNoICYgMHg3RkZGRkZGRikgJSBrZXlUYWJsZS5sZW5ndGg7Cit9CisvKioKKyAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgorICogVGhlIGtleSBhbmQgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG51bGwuIAorICogCisgKiBAcGFyYW0ga2V5IDxDT0RFPk9iamVjdDwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGhhc2h0YWJsZQorICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gdGhlIHNwZWNpZmllZCBlbGVtZW50CisgKiBAcmV0dXJuIGludCB0aGUgb2xkIHZhbHVlIG9mIHRoZSBrZXksIG9yIC0xIGlmIGl0IGRpZCBub3QgaGF2ZSBvbmUuCisgKi8KK3B1YmxpYyBpbnQgcHV0KGNoYXJbXSBrZXksIGludCB2YWx1ZSkgeyAKKwlpbnQgaW5kZXggPSBoYXNoQ29kZUNoYXIoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGtleVRhYmxlW2luZGV4XSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlrZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJcmVoYXNoKCk7CisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBSZWhhc2hlcyB0aGUgY29udGVudCBvZiB0aGUgdGFibGUgaW50byBhIGJpZ2dlciB0YWJsZS4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGhhc2h0YWJsZSdzCisgKiBzaXplIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4KKyAqLworcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKwlDaGFyQXJyYXlDYWNoZSBuZXdIYXNodGFibGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoa2V5VGFibGUubGVuZ3RoICogMik7CisJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkKKwkJCW5ld0hhc2h0YWJsZS5wdXQoa2V5VGFibGVbaV0sIHZhbHVlVGFibGVbaV0pOworCisJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKKwl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKKwl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7Cit9CisvKiogUmVtb3ZlIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZQorICogaGFzaHRhYmxlLgorICogQHBhcmFtIGtleSA8Q09ERT5jaGFyW108L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKi8KK3B1YmxpYyB2b2lkIHJlbW92ZShjaGFyW10ga2V5KSB7CisJaW50IGluZGV4ID0gaGFzaENvZGVDaGFyKGtleSk7CisJd2hpbGUgKGtleVRhYmxlW2luZGV4XSAhPSBudWxsKSB7CisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhrZXlUYWJsZVtpbmRleF0sIGtleSkpIHsKKwkJCXZhbHVlVGFibGVbaW5kZXhdID0gMDsKKwkJCWtleVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQlyZXR1cm47CisJCX0KKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZS4gUmV0dXJucyBudWxsIGlmIHRoZQorICogcmVjZWl2ZXIgZG9lc24ndCBjb250YWluIHRoZSB2YWx1ZS4KKyAqIEBwYXJhbSB2YWx1ZSBpbnQgdGhlIHZhbHVlIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yCisgKiBAcmV0dXJuIE9iamVjdAorICovCitwdWJsaWMgY2hhcltdIHJldHVybktleUZvcihpbnQgdmFsdWUpIHsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyBpLS0gPiAwOykgeworCQlpZiAodmFsdWVUYWJsZVtpXSA9PSB2YWx1ZSkgeworCQkJcmV0dXJuIGtleVRhYmxlW2ldOworCQl9CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBoYXNodGFibGUuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+IFRoZSBzaXplIG9mIHRoZSB0YWJsZQorICovCitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplOworfQorLyoqCisgKiBDb252ZXJ0cyB0byBhIHJhdGhlciBsZW5ndGh5IFN0cmluZy4KKyAqCisgKiByZXR1cm4gU3RyaW5nIHRoZSBhc2NpaSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXIKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlpbnQgbWF4ID0gc2l6ZSgpOworCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmLmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkgeworCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIpLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChpIDwgbWF4KSB7CisJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJYnVmLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29kZVN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29kZVN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGMzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db2RlU3RyZWFtLmphdmEKQEAgLTAsMCArMSw1NjkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK3B1YmxpYyBjbGFzcyBDb2RlU3RyZWFtIGltcGxlbWVudHMgT3BlcmF0b3JJZHMsIENsYXNzRmlsZUNvbnN0YW50cywgT3Bjb2RlcywgQmFzZVR5cGVzLCBUeXBlQ29uc3RhbnRzLCBUeXBlSWRzIHsKKwkvLyBJdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB0aGUgZm9sbG93aW5nIGl0ZW1zLgorCisJLy8gLT4gVHJhY2tpbmcgTWF4IFN0YWNrLgorCisJcHVibGljIGludCBzdGFja01heDsgLy8gVXNlIEludHMgdG8ga2VlcCBmcm9tIHVzaW5nIGV4dHJhIGJjIHdoZW4gYWRkaW5nCisJcHVibGljIGludCBzdGFja0RlcHRoOyAvLyBVc2UgSW50cyB0byBrZWVwIGZyb20gdXNpbmcgZXh0cmEgYmMgd2hlbiBhZGRpbmcKKwlwdWJsaWMgaW50IG1heExvY2FsczsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXggPSAxMDA7IC8vIE1heGltdW0gc2l6ZSBvZiB0aGUgY29kZSBhcnJheQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdyb3dGYWN0b3IgPSA0MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxTX0lOQ1JFTUVOVCA9IDU7CisJcHVibGljIGJ5dGVbXSBiQ29kZVN0cmVhbTsKKwlwdWJsaWMgaW50IHBjVG9Tb3VyY2VNYXBTaXplOworCXB1YmxpYyBpbnRbXSBwY1RvU291cmNlTWFwID0gbmV3IGludFsyNF07CisJcHVibGljIGludCBsYXN0RW50cnlQQzsgLy8gbGFzdCBlbnRyeSByZWNvcmRlZAorCXB1YmxpYyBpbnRbXSBsaW5lU2VwYXJhdG9yUG9zaXRpb25zOworCXB1YmxpYyBpbnQgcG9zaXRpb247IC8vIFNvIHdoZW4gZmlyc3Qgc2V0IGNhbiBiZSBpbmNyZW1lbnRlZAorCXB1YmxpYyBpbnQgY2xhc3NGaWxlT2Zmc2V0OworCXB1YmxpYyBpbnQgc3RhcnRpbmdDbGFzc0ZpbGVPZmZzZXQ7IC8vIEkgbmVlZCB0byBrZWVwIHRoZSBzdGFydGluZyBwb2ludCBpbnNpZGUgdGhlIGJ5dGUgYXJyYXkKKwlwdWJsaWMgQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbDsgLy8gVGhlIGNvbnN0YW50IHBvb2wgdXNlZCB0byBnZW5lcmF0ZSBieXRlY29kZXMgdGhhdCBuZWVkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwlwdWJsaWMgQ2xhc3NGaWxlIGNsYXNzRmlsZTsgLy8gVGhlIGN1cnJlbnQgY2xhc3NmaWxlIGl0IGlzIGFzc29jaWF0ZWQgdG8uCisJLy8gbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcyBvdXRwdXQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTFNfSU5DUkVNRU5UID0gMTA7CisJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nW10gbG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW0xPQ0FMU19JTkNSRU1FTlRdOworCXN0YXRpYyBMb2NhbFZhcmlhYmxlQmluZGluZ1tdIG5vTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW0xPQ0FMU19JTkNSRU1FTlRdOworCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZ1tdIHZpc2libGVMb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbTE9DQUxTX0lOQ1JFTUVOVF07CisJc3RhdGljIExvY2FsVmFyaWFibGVCaW5kaW5nW10gbm9WaXNpYmxlTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW0xPQ0FMU19JTkNSRU1FTlRdOworCWludCB2aXNpYmxlTG9jYWxzQ291bnQ7CisJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb247CisJcHVibGljIEV4Y2VwdGlvbkxhYmVsW10gZXhjZXB0aW9uSGFuZGxlcnMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbTEFCRUxTX0lOQ1JFTUVOVF07CisJc3RhdGljIEV4Y2VwdGlvbkxhYmVsW10gbm9FeGNlcHRpb25IYW5kbGVycyA9IG5ldyBFeGNlcHRpb25MYWJlbFtMQUJFTFNfSU5DUkVNRU5UXTsKKwlwdWJsaWMgaW50IGV4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyOworCXB1YmxpYyBzdGF0aWMgRmllbGRCaW5kaW5nW10gSW1wbGljaXRUaGlzID0gbmV3IEZpZWxkQmluZGluZ1tdIHt9OworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXM7CisJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzOworCXB1YmxpYyBib29sZWFuIHByZXNlcnZlVW51c2VkTG9jYWxzOworCS8vIHN0b3JlIGFsbCB0aGUgbGFiZWxzIHBsYWNlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiB0byBiZSBhYmxlIHRvIG9wdGltaXplCisJLy8gYSBqdW1wIHRvIHRoZSBuZXh0IGJ5dGVjb2RlLgorCXB1YmxpYyBMYWJlbFtdIGxhYmVscyA9IG5ldyBMYWJlbFtMQUJFTFNfSU5DUkVNRU5UXTsKKwlzdGF0aWMgTGFiZWxbXSBub0xhYmVscyA9IG5ldyBMYWJlbFtMQUJFTFNfSU5DUkVNRU5UXTsKKwlwdWJsaWMgaW50IGNvdW50TGFiZWxzOworCXB1YmxpYyBpbnQgYWxsTG9jYWxzQ291bnRlcjsKKwlwdWJsaWMgaW50IG1heEZpZWxkQ291bnQ7CisJLy8gdG8gaGFuZGxlIGdvdG9fdworCXB1YmxpYyBib29sZWFuIHdpZGVNb2RlID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblJlc3VsdCBSRVNUQVJUX0lOX1dJREVfTU9ERSA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgoY2hhcltdKW51bGwsIDAsIDAsIDApOworCQorcHVibGljIENvZGVTdHJlYW0oQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCWdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMgPSAoY2xhc3NGaWxlLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBDb21waWxlck9wdGlvbnMuTGluZXMpICE9IDA7CisJZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzID0gKGNsYXNzRmlsZS5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzICYgQ29tcGlsZXJPcHRpb25zLlZhcnMpICE9IDA7CisJaWYgKGdlbmVyYXRlTGluZU51bWJlckF0dHJpYnV0ZXMpIHsKKwkJbGluZVNlcGFyYXRvclBvc2l0aW9ucyA9IGNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnM7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgYWFsb2FkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2FhbG9hZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19hYWxvYWQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFhc3RvcmUoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMzsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYWFzdG9yZTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19hYXN0b3JlKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBhY29uc3RfbnVsbCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYWNvbnN0X251bGw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYWNvbnN0X251bGwpOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIGFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhTY29wZSBzY29wZSwgaW50IGluaXRTdGF0ZUluZGV4KSB7CisJLy8gUmVxdWlyZWQgdG8gZml4IDFQUjBYVlM6IExGUkU6V0lOTlQgLSBDb21waWxlcjogdmFyaWFibGUgdGFibGUgZm9yIG1ldGhvZCBhcHBlYXJzIGluY29ycmVjdAorCWlmICghZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKQorCQlyZXR1cm47CisvKglpZiAoaW5pdFN0YXRlSW5kZXggPT0gbGFzdEluaXRTdGF0ZUluZGV4V2hlbkFkZGluZ0luaXRzKQorCQlyZXR1cm47CisJbGFzdEluaXRTdGF0ZUluZGV4V2hlbkFkZGluZ0luaXRzID0gaW5pdFN0YXRlSW5kZXg7CisJaWYgKGxhc3RJbml0U3RhdGVJbmRleFdoZW5SZW1vdmluZ0luaXRzICE9IGluaXRTdGF0ZUluZGV4KXsKKwkJbGFzdEluaXRTdGF0ZUluZGV4V2hlblJlbW92aW5nSW5pdHMgPSAtMjsgLy8gcmVpbml0aWFsaXplIHJlbW92ZSBpbmRleCAKKwkJLy8gcmVtb3ZlKDEpLWFkZCgxKS1yZW1vdmUoMSkgLT4gaWdub3JlIHNlY29uZCByZW1vdmUKKwkJLy8gcmVtb3ZlKDEpLWFkZCgyKS1yZW1vdmUoMSkgLT4gcGVyZm9ybSBzZWNvbmQgcmVtb3ZlCisJfQorCQorKi8JZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlTG9jYWxzQ291bnQ7IGkrKykgeworCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSB2aXNpYmxlTG9jYWxzW2ldOworCQlpZiAobG9jYWxCaW5kaW5nICE9IG51bGwpIHsKKwkJCS8vIENoZWNrIGlmIHRoZSBsb2NhbCBpcyBkZWZpbml0ZWx5IGFzc2lnbmVkCisJCQlpZiAoKGluaXRTdGF0ZUluZGV4ICE9IC0xKSAmJiBpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgaW5pdFN0YXRlSW5kZXgsIGxvY2FsQmluZGluZykpIHsKKwkJCQlpZiAoKGxvY2FsQmluZGluZy5pbml0aWFsaXphdGlvbkNvdW50ID09IDApIHx8IChsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25QQ3NbKChsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gIT0gLTEpKSB7CisJCQkJCS8qIFRoZXJlIGFyZSB0d28gY2FzZXM6CisJCQkJCSAqIDEpIHRoZXJlIGlzIG5vIGluaXRpYWxpemF0aW9uIGludGVydmFsIG9wZW5lZCA9PT4gYWRkIGFuIG9wZW5lZCBpbnRlcnZhbAorCQkJCQkgKiAyKSB0aGVyZSBpcyBhbHJlYWR5IHNvbWUgaW5pdGlhbGl6YXRpb24gaW50ZXJ2YWxzIGJ1dCB0aGUgbGFzdCBvbmUgaXMgY2xvc2VkID09PiBhZGQgYW4gb3BlbmVkIGludGVydmFsCisJCQkJCSAqIEFuIG9wZW5lZCBpbnRlcnZhbCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBhdCBsb2NhbEJpbmRpbmcuaW5pdGlhbGl6YXRpb25QQ3NbbG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgLSAxXVsxXQorCQkJCQkgKiBpcyBlcXVhbHMgdG8gLTEuCisJCQkJCSAqIGluaXRpYWxpemF0aW9uUENzIGlzIGEgY29sbGVjdGlvbiBvZiBwYWlycyBvZiBpbnQ6CisJCQkJCSAqIAlmaXJzdCB2YWx1ZSBpcyB0aGUgc3RhcnRQQyBhbmQgc2Vjb25kIHZhbHVlIGlzIHRoZSBlbmRQQy4gLTEgb25lIGZvciB0aGUgbGFzdCB2YWx1ZSBtZWFucyB0aGF0IHRoZSBpbnRlcnZhbAorCQkJCQkgKiAJaXMgbm90IGNsb3NlZCB5ZXQuCisJCQkJCSAqLworCQkJCQlsb2NhbEJpbmRpbmcucmVjb3JkSW5pdGlhbGl6YXRpb25TdGFydFBDKHBvc2l0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CitwdWJsaWMgdm9pZCBhZGRMYWJlbChMYWJlbCBhTGFiZWwpIHsKKwlpZiAoY291bnRMYWJlbHMgPT0gbGFiZWxzLmxlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weShsYWJlbHMsIDAsIChsYWJlbHMgPSBuZXcgTGFiZWxbY291bnRMYWJlbHMgKyBMQUJFTFNfSU5DUkVNRU5UXSksIDAsIGNvdW50TGFiZWxzKTsKKwlsYWJlbHNbY291bnRMYWJlbHMrK10gPSBhTGFiZWw7Cit9CitwdWJsaWMgdm9pZCBhZGRWaXNpYmxlTG9jYWxWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcpIHsKKwlpZiAoIWdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykKKwkJcmV0dXJuOworCisJaWYgKHZpc2libGVMb2NhbHNDb3VudCA+PSB2aXNpYmxlTG9jYWxzLmxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHZpc2libGVMb2NhbHMsIDAsICh2aXNpYmxlTG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW3Zpc2libGVMb2NhbHNDb3VudCAqIDJdKSwgMCwgdmlzaWJsZUxvY2Fsc0NvdW50KTsKKwl9CisJdmlzaWJsZUxvY2Fsc1t2aXNpYmxlTG9jYWxzQ291bnQrK10gPSBsb2NhbEJpbmRpbmc7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBhbG9hZChpbnQgaUFyZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCWlmIChtYXhMb2NhbHMgPD0gaUFyZykgeworCQltYXhMb2NhbHMgPSBpQXJnICsgMTsKKwl9CisJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfd2lkZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX3dpZGUpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Fsb2FkOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfYWxvYWQpOworCQl9CisJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKKwl9IGVsc2UgeworCQkvLyBEb24ndCBuZWVkIHRvIHVzZSB0aGUgd2lkZSBieXRlY29kZQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbG9hZDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Fsb2FkKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSAoaUFyZyk7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KChieXRlKSBpQXJnKTsKKwkJfQorCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFsb2FkXzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA9PSAwKSB7CisJCW1heExvY2FscyA9IDE7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbG9hZF8wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Fsb2FkXzApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFsb2FkXzEoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8PSAxKSB7CisJCW1heExvY2FscyA9IDI7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbG9hZF8xOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Fsb2FkXzEpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFsb2FkXzIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8PSAyKSB7CisJCW1heExvY2FscyA9IDM7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbG9hZF8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Fsb2FkXzIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFsb2FkXzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8PSAzKSB7CisJCW1heExvY2FscyA9IDQ7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbG9hZF8zOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Fsb2FkXzMpOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIGFuZXdhcnJheShUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYW5ld2FycmF5OworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2FuZXdhcnJheSk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHR5cGVCaW5kaW5nKSk7Cit9CitwdWJsaWMgdm9pZCBhbmV3YXJyYXlKYXZhTGFuZ0NsYXNzKCkgeworCS8vIGFuZXdhcnJheTogamF2YS5sYW5nLkNsYXNzCisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbmV3YXJyYXk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYW5ld2FycmF5KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzKCkpOworfQorcHVibGljIHZvaWQgYW5ld2FycmF5SmF2YUxhbmdPYmplY3QoKSB7CisJLy8gYW5ld2FycmF5OiBqYXZhLmxhbmcuT2JqZWN0CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hbmV3YXJyYXk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYW5ld2FycmF5KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdCgpKTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFyZXR1cm4oKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMCAKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXJldHVybjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19hcmV0dXJuKTsKKwl9Cit9CitwdWJsaWMgdm9pZCBhcnJheUF0KGludCB0eXBlQmluZGluZ0lEKSB7CisJc3dpdGNoICh0eXBlQmluZGluZ0lEKSB7CisJCWNhc2UgVF9pbnQgOgorCQkJdGhpcy5pYWxvYWQoKTsKKwkJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCXRoaXMuYmFsb2FkKCk7CisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXRoaXMuc2Fsb2FkKCk7CisJCQlicmVhazsKKwkJY2FzZSBUX2NoYXIgOgorCQkJdGhpcy5jYWxvYWQoKTsKKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQl0aGlzLmxhbG9hZCgpOworCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQl0aGlzLmZhbG9hZCgpOworCQkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJdGhpcy5kYWxvYWQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXRoaXMuYWFsb2FkKCk7CisJfQorfQorcHVibGljIHZvaWQgYXJyYXlBdFB1dChpbnQgZWxlbWVudFR5cGVJRCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJc3dpdGNoIChlbGVtZW50VHlwZUlEKSB7CisJCWNhc2UgVF9pbnQgOgorCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJZHVwX3gyKCk7CisJCQlpYXN0b3JlKCk7CisJCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQljYXNlIFRfYm9vbGVhbiA6CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQlkdXBfeDIoKTsKKwkJCWJhc3RvcmUoKTsKKwkJCWJyZWFrOworCQljYXNlIFRfc2hvcnQgOgorCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJZHVwX3gyKCk7CisJCQlzYXN0b3JlKCk7CisJCQlicmVhazsKKwkJY2FzZSBUX2NoYXIgOgorCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJZHVwX3gyKCk7CisJCQljYXN0b3JlKCk7CisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQkJZHVwMl94MigpOworCQkJbGFzdG9yZSgpOworCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQlkdXBfeDIoKTsKKwkJCWZhc3RvcmUoKTsKKwkJCWJyZWFrOworCQljYXNlIFRfZG91YmxlIDoKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCWR1cDJfeDIoKTsKKwkJCWRhc3RvcmUoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCWR1cF94MigpOworCQkJYWFzdG9yZSgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFycmF5bGVuZ3RoKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXJyYXlsZW5ndGg7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXJyYXlsZW5ndGgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFzdG9yZShpbnQgaUFyZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKG1heExvY2FscyA8PSBpQXJnKSB7CisJCW1heExvY2FscyA9IGlBcmcgKyAxOworCX0KKwlpZiAoaUFyZyA+IDI1NSkgeyAvLyBXaWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXN0b3JlKTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXN0b3JlKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgaUFyZyk7CisJCX0KKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBhc3RvcmVfMCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPT0gMCkgeworCQltYXhMb2NhbHMgPSAxOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXN0b3JlXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXN0b3JlXzApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGFzdG9yZV8xKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKG1heExvY2FscyA8PSAxKSB7CisJCW1heExvY2FscyA9IDI7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hc3RvcmVfMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19hc3RvcmVfMSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgYXN0b3JlXzIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpZiAobWF4TG9jYWxzIDw9IDIpIHsKKwkJbWF4TG9jYWxzID0gMzsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2FzdG9yZV8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2FzdG9yZV8yKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBhc3RvcmVfMygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPD0gMykgeworCQltYXhMb2NhbHMgPSA0OworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYXN0b3JlXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXN0b3JlXzMpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGF0aHJvdygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19hdGhyb3c7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfYXRocm93KTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBiYWxvYWQoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYmFsb2FkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2JhbG9hZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgYmFzdG9yZSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAzOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19iYXN0b3JlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Jhc3RvcmUpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGJpcHVzaChieXRlIGIpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfYmlwdXNoOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2JpcHVzaCk7CisJfQorCXdyaXRlU2lnbmVkQnl0ZShiKTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGNhbG9hZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19jYWxvYWQ7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfY2Fsb2FkKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBjYXN0b3JlKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDM7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Nhc3RvcmU7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfY2FzdG9yZSk7CisJfQorfQorcHVibGljIGZpbmFsIHZvaWQgY2hlY2tjYXN0KFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19jaGVja2Nhc3Q7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfY2hlY2tjYXN0KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgodHlwZUJpbmRpbmcpKTsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIGNoZWNrY2FzdEphdmFMYW5nRXJyb3IoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19jaGVja2Nhc3Q7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfY2hlY2tjYXN0KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Vycm9yKCkpOworfQorZmluYWwgcHVibGljIHZvaWQgZDJmKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2QyZjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kMmYpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGQyaSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kMmk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZDJpKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkMmwoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kMmw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZDJsKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkYWRkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2RhZGQ7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZGFkZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZGFsb2FkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZGFsb2FkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RhbG9hZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZGFzdG9yZSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSA0OworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kYXN0b3JlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Rhc3RvcmUpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRjbXBnKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDM7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2RjbXBnOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RjbXBnKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkY21wbCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAzOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kY21wbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kY21wbCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZGNvbnN0XzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Rjb25zdF8wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Rjb25zdF8wKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkY29uc3RfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZGNvbnN0XzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZGNvbnN0XzEpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRkaXYoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZGRpdjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kZGl2KTsKKwl9Cit9CitwdWJsaWMgdm9pZCBkZWNyU3RhY2tTaXplKGludCBvZmZzZXQpIHsKKwlzdGFja0RlcHRoIC09IG9mZnNldDsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRsb2FkKGludCBpQXJnKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8IGlBcmcgKyAyKSB7CisJCW1heExvY2FscyA9IGlBcmcgKyAyOyAvLyArIDIgYmVjYXVzZSBpdCBpcyBhIGRvdWJsZQorCX0KKwlpZiAoaUFyZyA+IDI1NSkgeyAvLyBXaWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZGxvYWQ7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19kbG9hZCk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOworCX0gZWxzZSB7CisJCS8vIERvbid0IG5lZWQgdG8gdXNlIHRoZSB3aWRlIGJ5dGVjb2RlCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Rsb2FkOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfZGxvYWQpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGlBcmc7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KChieXRlKSBpQXJnKTsKKwkJfQorCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRsb2FkXzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8IDIpIHsKKwkJbWF4TG9jYWxzID0gMjsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Rsb2FkXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZGxvYWRfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZGxvYWRfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwlpZiAobWF4TG9jYWxzIDwgMykgeworCQltYXhMb2NhbHMgPSAzOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZGxvYWRfMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kbG9hZF8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkbG9hZF8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoICs9IDI7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCWlmIChtYXhMb2NhbHMgPCA0KSB7CisJCW1heExvY2FscyA9IDQ7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kbG9hZF8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Rsb2FkXzIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRsb2FkXzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKG1heExvY2FscyA8IDUpIHsKKwkJbWF4TG9jYWxzID0gNTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Rsb2FkXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZGxvYWRfMyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZG11bCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kbXVsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RtdWwpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRuZWcoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kbmVnOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RuZWcpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRyZW0oKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHJlbTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kcmVtKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkcmV0dXJuKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJLy8gdGhlIHN0YWNrRGVwdGggc2hvdWxkIGJlIGVxdWFsIHRvIDAgCisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2RyZXR1cm47CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHJldHVybik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZHN0b3JlKGludCBpQXJnKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAobWF4TG9jYWxzIDw9IGlBcmcgKyAxKSB7CisJCW1heExvY2FscyA9IGlBcmcgKyAyOworCX0KKwlpZiAoaUFyZyA+IDI1NSkgeyAvLyBXaWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHN0b3JlKTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHN0b3JlKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgaUFyZyk7CisJCX0KKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkc3RvcmVfMCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCWlmIChtYXhMb2NhbHMgPCAyKSB7CisJCW1heExvY2FscyA9IDI7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kc3RvcmVfMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kc3RvcmVfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZHN0b3JlXzEoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAobWF4TG9jYWxzIDwgMykgeworCQltYXhMb2NhbHMgPSAzOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHN0b3JlXzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHN0b3JlXzEpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGRzdG9yZV8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJaWYgKG1heExvY2FscyA8IDQpIHsKKwkJbWF4TG9jYWxzID0gNDsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2RzdG9yZV8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RzdG9yZV8yKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkc3RvcmVfMygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCWlmIChtYXhMb2NhbHMgPCA1KSB7CisJCW1heExvY2FscyA9IDU7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kc3RvcmVfMzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kc3RvcmVfMyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZHN1YigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kc3ViOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2RzdWIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGR1cCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHVwOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2R1cCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZHVwX3gxKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kdXBfeDE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHVwX3gxKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkdXBfeDIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2R1cF94MjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kdXBfeDIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGR1cDIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2R1cDI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZHVwMik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZHVwMl94MSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZHVwMl94MTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19kdXAyX3gxKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBkdXAyX3gyKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoICs9IDI7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19kdXAyX3gyOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2R1cDJfeDIpOworCX0KK30KK3B1YmxpYyB2b2lkIGV4aXRVc2VyU2NvcGUoQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJLy8gbWFyayBhbGwgdGhlIHNjb3BlJ3MgbG9jYWxzIGFzIGxvb3NpbmcgdGhlaXIgZGVmaW5pdGUgYXNzaWdubWVudAorCisJaWYgKCFnZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZXMpCisJCXJldHVybjsKKwlmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVMb2NhbHNDb3VudDsgaSsrKSB7CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHZpc2libGVMb2NhbCA9IHZpc2libGVMb2NhbHNbaV07CisJCWlmICgodmlzaWJsZUxvY2FsICE9IG51bGwpICYmICh2aXNpYmxlTG9jYWwuZGVjbGFyaW5nU2NvcGUgPT0gYmxvY2tTY29wZSkpIHsgCisJCQkvLyB0aGVyZSBtYXliZSBzb21lIHNvbWUgcHJlc2VydmVkIGxvY2FscyBuZXZlciBpbml0aWFsaXplZAorCQkJaWYgKHZpc2libGVMb2NhbC5pbml0aWFsaXphdGlvbkNvdW50ID4gMCl7CisJCQkJdmlzaWJsZUxvY2Fsc1tpXS5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKHBvc2l0aW9uKTsKKwkJCX0KKwkJCXZpc2libGVMb2NhbHNbaV0gPSBudWxsOyAvLyB0aGlzIHZhcmlhYmxlIGlzIG5vIGxvbmdlciB2aXNpYmxlIGFmdGVyd2FyZHMKKwkJfQorCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGYyZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZjJkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2YyZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZjJpKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZjJpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2YyaSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZjJsKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mMmw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZjJsKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmYWRkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZhZGQ7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZmFkZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZmFsb2FkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZhbG9hZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mYWxvYWQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGZhc3RvcmUoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMzsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmFzdG9yZTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mYXN0b3JlKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmY21wZygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mY21wZzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mY21wZyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZmNtcGwoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmNtcGw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZmNtcGwpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGZjb25zdF8wKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mY29uc3RfMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mY29uc3RfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZmNvbnN0XzEoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Zjb25zdF8xOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Zjb25zdF8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmY29uc3RfMigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmNvbnN0XzI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZmNvbnN0XzIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGZkaXYoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmRpdjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mZGl2KTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbG9hZChpbnQgaUFyZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKG1heExvY2FscyA8PSBpQXJnKSB7CisJCW1heExvY2FscyA9IGlBcmcgKyAxOworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfd2lkZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX3dpZGUpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2Zsb2FkOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfZmxvYWQpOworCQl9CisJCXdyaXRlVW5zaWduZWRTaG9ydChpQXJnKTsKKwl9IGVsc2UgeworCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mbG9hZDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2Zsb2FkKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgaUFyZyk7CisJCX0KKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbG9hZF8wKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKG1heExvY2FscyA9PSAwKSB7CisJCW1heExvY2FscyA9IDE7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmxvYWRfMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mbG9hZF8wKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbG9hZF8xKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKG1heExvY2FscyA8PSAxKSB7CisJCW1heExvY2FscyA9IDI7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmxvYWRfMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mbG9hZF8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbG9hZF8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKG1heExvY2FscyA8PSAyKSB7CisJCW1heExvY2FscyA9IDM7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmxvYWRfMjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mbG9hZF8yKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbG9hZF8zKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKG1heExvY2FscyA8PSAzKSB7CisJCW1heExvY2FscyA9IDQ7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZmxvYWRfMzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mbG9hZF8zKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmbXVsKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZtdWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZm11bCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZm5lZygpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZuZWc7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZm5lZyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZnJlbSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mcmVtOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ZyZW0pOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGZyZXR1cm4oKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMCAKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZnJldHVybjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mcmV0dXJuKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmc3RvcmUoaW50IGlBcmcpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPD0gaUFyZykgeworCQltYXhMb2NhbHMgPSBpQXJnICsgMTsKKwl9CisJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfd2lkZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX3dpZGUpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZzdG9yZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ZzdG9yZSk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZzdG9yZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ZzdG9yZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGlBcmcpOworCQl9CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZnN0b3JlXzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpZiAobWF4TG9jYWxzID09IDApIHsKKwkJbWF4TG9jYWxzID0gMTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZzdG9yZV8wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ZzdG9yZV8wKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmc3RvcmVfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPD0gMSkgeworCQltYXhMb2NhbHMgPSAyOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZnN0b3JlXzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZnN0b3JlXzEpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGZzdG9yZV8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKG1heExvY2FscyA8PSAyKSB7CisJCW1heExvY2FscyA9IDM7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19mc3RvcmVfMjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19mc3RvcmVfMik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgZnN0b3JlXzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpZiAobWF4TG9jYWxzIDw9IDMpIHsKKwkJbWF4TG9jYWxzID0gNDsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZzdG9yZV8zOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ZzdG9yZV8zKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBmc3ViKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ZzdWI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZnN1Yik7CisJfQorfQorLyoqCisgKiBNYWNybyBmb3IgYnVpbGRpbmcgYSBjbGFzcyBkZXNjcmlwdG9yIG9iamVjdAorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUoVHlwZUJpbmRpbmcgYWNjZXNzZWRUeXBlLCBGaWVsZEJpbmRpbmcgc3ludGhldGljRmllbGRCaW5kaW5nKSB7CisJTGFiZWwgZW5kTGFiZWw7CisJRXhjZXB0aW9uTGFiZWwgYW55RXhjZXB0aW9uSGFuZGxlcjsKKwlpbnQgc2F2ZVN0YWNrU2l6ZTsKKwlpZiAoYWNjZXNzZWRUeXBlLmlzQmFzZVR5cGUoKSAmJiBhY2Nlc3NlZFR5cGUgIT0gTnVsbEJpbmRpbmcpIHsKKwkJdGhpcy5nZXRUWVBFKGFjY2Vzc2VkVHlwZS5pZCk7CisJCXJldHVybjsKKwl9CisJZW5kTGFiZWwgPSBuZXcgTGFiZWwodGhpcyk7CisKKwlpZiAoc3ludGhldGljRmllbGRCaW5kaW5nICE9IG51bGwpIHsgLy8gbm9uIGludGVyZmFjZSBjYXNlCisJCXRoaXMuZ2V0c3RhdGljKHN5bnRoZXRpY0ZpZWxkQmluZGluZyk7CisJCXRoaXMuZHVwKCk7CisJCXRoaXMuaWZub25udWxsKGVuZExhYmVsKTsKKwkJdGhpcy5wb3AoKTsKKwl9CisKKwkvKiBNYWNybyBmb3IgYnVpbGRpbmcgYSBjbGFzcyBkZXNjcmlwdG9yIG9iamVjdC4uLiB1c2luZyBvciBub3QgYSBmaWVsZCBjYWNoZSB0byBzdG9yZSBpdCBpbnRvLi4uCisJdGhpcyBzZXF1ZW5jZSBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIGFjdHVhbCBjbGFzcyBkZXNjcmlwdG9yLgorCQorCUlmIHRoZSBmaWVsZENhY2hlIGlzIHNldCwgdGhlbiBpdCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgYm9keSBvZiBhIHN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kCisJZmFjdG9yaW5nIHRoZSBhY3R1YWwgZGVzY3JpcHRvciBjcmVhdGlvbiBvdXQgb2YgdGhlIGludm9jYXRpb24gc2l0ZSAoc2F2aW5nIHNwYWNlKS4KKwlJZiB0aGUgZmllbGRDYWNoZSBpcyBuaWwsIHRoZW4gd2UgYXJlIGR1bXBpbmcgdGhlIGJ5dGVjb2RlIG9uIHRoZSBpbnZvY2F0aW9uIHNpdGUsIHNpbmNlCisJd2UgaGF2ZSBubyB3YXkgdG8gZ2V0IGEgaGFuZCBvbiB0aGUgZmllbGQgY2FjaGUgdG8gZG8gYmV0dGVyLiAqLworCisKKwkvLyBXcmFwIHRoZSBjb2RlIGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNvbnZlcnQgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGludG8gYSBOb0NsYXNzRGVmRXJyb3IKKworCWFueUV4Y2VwdGlvbkhhbmRsZXIgPSBuZXcgRXhjZXB0aW9uTGFiZWwodGhpcywgVHlwZUJpbmRpbmcuTnVsbEJpbmRpbmcgLyogcmVwcmVzZW50cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKi8pOworCXRoaXMubGRjKGFjY2Vzc2VkVHlwZSA9PSBUeXBlQmluZGluZy5OdWxsQmluZGluZyA/ICJqYXZhLmxhbmcuT2JqZWN0IiA6IFN0cmluZy52YWx1ZU9mKGFjY2Vzc2VkVHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsgLy8kTk9OLU5MUy0xJAorCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisKKwkvKiBXZSBuZWVkIHRvIHByb3RlY3QgdGhlIHJ1bnRpbWUgY29kZSBmcm9tIGJpbmFyeSBpbmNvbnNpc3RlbmNpZXMKKwlpbiBjYXNlIHRoZSBhY2Nlc3NlZFR5cGUgaXMgbWlzc2luZywgdGhlIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaGFzIHRvIGJlIGNvbnZlcnRlZAorCWludG8gYSBOb0NsYXNzRGVmRXJyb3Iob2xkIGV4IG1lc3NhZ2UpLCB3ZSB0aHVzIG5lZWQgdG8gYnVpbGQgYW4gZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHRoaXMgb25lLiAqLworCWFueUV4Y2VwdGlvbkhhbmRsZXIucGxhY2VFbmQoKTsKKworCWlmIChzeW50aGV0aWNGaWVsZEJpbmRpbmcgIT0gbnVsbCkgeyAvLyBub24gaW50ZXJmYWNlIGNhc2UKKwkJdGhpcy5kdXAoKTsKKwkJdGhpcy5wdXRzdGF0aWMoc3ludGhldGljRmllbGRCaW5kaW5nKTsKKwl9CisJdGhpcy5nb3RvXyhlbmRMYWJlbCk7CisKKworCS8vIEdlbmVyYXRlIHRoZSBib2R5IG9mIHRoZSBleGNlcHRpb24gaGFuZGxlcgorCXNhdmVTdGFja1NpemUgPSBzdGFja0RlcHRoOworCXN0YWNrRGVwdGggPSAxOworCS8qIENsYXNzTm90Rm91bmRFeGNlcHRpb24gb24gc3RhY2sgLS0gdGhlIGNsYXNzIGxpdGVyYWwgY291bGQgYmUgZG9pbmcgbW9yZSB0aGluZ3MKKwlvbiB0aGUgc3RhY2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN0YWNrIG1heSBub3QgYmUgZW1wdHkgYXQgdGhpcyBwb2ludCBpbiB0aGUKKwlhYm92ZSBjb2RlIGdlbi4gU28gd2Ugc2F2ZSBpdHMgc3RhdGUgYW5kIHJlc3RhcnQgaXQgZnJvbSAxLiAqLworCisJYW55RXhjZXB0aW9uSGFuZGxlci5wbGFjZSgpOworCisJLy8gVHJhbnNmb3JtIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgYW5kIHJlcHVzaCBhbmQgdGhyb3cgYSAKKwkvLyBOb0NsYXNzRGVmRm91bmRFcnJvcihDbGFzc05vdEZvdW5kLmdldE1lc3NhZ2UoKSkKKworCXRoaXMubmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKTsKKwl0aGlzLmR1cF94MSgpOworCXRoaXMuc3dhcCgpOworCisJLy8gUmV0cmlldmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgb2xkIGV4Y2VwdGlvbgorCXRoaXMuaW52b2tlVGhyb3dhYmxlR2V0TWVzc2FnZSgpOworCisJLy8gU2VuZCB0aGUgY29uc3RydWN0b3IgdGFraW5nIGEgbWVzc2FnZSBzdHJpbmcgYXMgYW4gYXJndW1lbnQKKwl0aGlzLmludm9rZU5vQ2xhc3NEZWZGb3VuZEVycm9yU3RyaW5nQ29uc3RydWN0b3IoKTsKKwl0aGlzLmF0aHJvdygpOworCWVuZExhYmVsLnBsYWNlKCk7CisJc3RhY2tEZXB0aCA9IHNhdmVTdGFja1NpemU7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCisgKiBhdHRyaWJ1dGUuCisgKi8KK2ZpbmFsIHB1YmxpYyBpbnRbXSBnZW5lcmF0ZUNvZGVBdHRyaWJ1dGVGb3JQcm9ibGVtTWV0aG9kKFN0cmluZyBlcnJvck5hbWUsIFN0cmluZyBwcm9ibGVtTWVzc2FnZSkgeworCS8qKgorCSAqIEVxdWl2YWxlbnQgY29kZToKKwkgKgl0cnkgeworCSAqCQl0aHJvdyAoKEVycm9yKSAoQ2xhc3MuZm9yTmFtZShlcnJvck5hbWUpLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuU3RyaW5nIil9KSkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtwcm9ibGVtTWVzc2FnZX0pKTsKKwkgKgl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAqCQl0aHJvdyAoTnVsbFBvaW50ZXJFeGNlcHRpb24pIG51bGw7CisJICoJfQorCSAqLworCWludCBlbmRQQywgaGFuZGxlclBDOworCWxkYyhlcnJvck5hbWUpOworCWludm9rZUNsYXNzRm9yTmFtZSgpOworCWljb25zdF8xKCk7CisJYW5ld2FycmF5SmF2YUxhbmdDbGFzcygpOworCWR1cCgpOworCWljb25zdF8wKCk7CisJbGRjKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKKwlpbnZva2VDbGFzc0Zvck5hbWUoKTsKKwlhYXN0b3JlKCk7CisJaW52b2tlQ29uc3RydWN0b3JHZXRDb25zdHJ1Y3RvcigpOworCWljb25zdF8xKCk7CisJYW5ld2FycmF5SmF2YUxhbmdPYmplY3QoKTsKKwlkdXAoKTsKKwlpY29uc3RfMCgpOworCWxkYyhwcm9ibGVtTWVzc2FnZSk7CisJYWFzdG9yZSgpOworCWludm9rZU9iamVjdE5ld0luc3RhbmNlKCk7CisJY2hlY2tjYXN0SmF2YUxhbmdFcnJvcigpOworCWF0aHJvdygpOworCWVuZFBDID0gaGFuZGxlclBDID0gcG9zaXRpb247CisJcG9wKCk7CisJYWNvbnN0X251bGwoKTsKKwlhdGhyb3coKTsKKwlyZXR1cm5fKCk7CisJcmV0dXJuIG5ldyBpbnRbXSB7MCwgZW5kUEMsIGhhbmRsZXJQQ307Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbnN0YW50KENvbnN0YW50IGNvbnN0YW50LCBpbnQgaW1wbGljaXRDb252ZXJzaW9uQ29kZSkgeworCWludCB0YXJnZXRUeXBlSUQgPSBpbXBsaWNpdENvbnZlcnNpb25Db2RlID4+IDQ7CisJc3dpdGNoICh0YXJnZXRUeXBlSUQpIHsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJZ2VuZXJhdGVJbmxpbmVkVmFsdWUoY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9jaGFyIDoKKwkJCWdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LmNoYXJWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCQlnZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5ieXRlVmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCWdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LnNob3J0VmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlnZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5pbnRWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlnZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5sb25nVmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCWdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LmZsb2F0VmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlnZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5kb3VibGVWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfU3RyaW5nIDoKKwkJCXRoaXMubGRjKGNvbnN0YW50LnN0cmluZ1ZhbHVlKCkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOiAvL3JlZmVyZW5jZSBvYmplY3QgKGNvbnN0YW50IGNhbiBiZSBmcm9tIFRfbnVsbCBvciBUX1N0cmluZykKKwkJCWlmIChjb25zdGFudC50eXBlSUQoKSA9PSBUX1N0cmluZykKKwkJCQlsZGMoY29uc3RhbnQuc3RyaW5nVmFsdWUoKSk7CisJCQllbHNlCisJCQkJYWNvbnN0X251bGwoKTsKKwl9Cit9CisvKioKKyAqIEBwYXJhbSBpbXBsaWNpdENvbnZlcnNpb25Db2RlIGludAorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbnQgaW1wbGljaXRDb252ZXJzaW9uQ29kZSkgeworCXN3aXRjaCAoaW1wbGljaXRDb252ZXJzaW9uQ29kZSkgeworCQljYXNlIEZsb2F0MkNoYXIgOgorCQkJdGhpcy5mMmkoKTsKKwkJCXRoaXMuaTJjKCk7CisJCQlicmVhazsKKwkJY2FzZSBEb3VibGUyQ2hhciA6CisJCQl0aGlzLmQyaSgpOworCQkJdGhpcy5pMmMoKTsKKwkJCWJyZWFrOworCQljYXNlIEludDJDaGFyIDoKKwkJY2FzZSBTaG9ydDJDaGFyIDoKKwkJY2FzZSBCeXRlMkNoYXIgOgorCQkJdGhpcy5pMmMoKTsKKwkJCWJyZWFrOworCQljYXNlIExvbmcyQ2hhciA6CisJCQl0aGlzLmwyaSgpOworCQkJdGhpcy5pMmMoKTsKKwkJCWJyZWFrOworCQljYXNlIENoYXIyRmxvYXQgOgorCQljYXNlIFNob3J0MkZsb2F0IDoKKwkJY2FzZSBJbnQyRmxvYXQgOgorCQljYXNlIEJ5dGUyRmxvYXQgOgorCQkJdGhpcy5pMmYoKTsKKwkJCWJyZWFrOworCQljYXNlIERvdWJsZTJGbG9hdCA6CisJCQl0aGlzLmQyZigpOworCQkJYnJlYWs7CisJCWNhc2UgTG9uZzJGbG9hdCA6CisJCQl0aGlzLmwyZigpOworCQkJYnJlYWs7CisJCWNhc2UgRmxvYXQyQnl0ZSA6CisJCQl0aGlzLmYyaSgpOworCQkJdGhpcy5pMmIoKTsKKwkJCWJyZWFrOworCQljYXNlIERvdWJsZTJCeXRlIDoKKwkJCXRoaXMuZDJpKCk7CisJCQl0aGlzLmkyYigpOworCQkJYnJlYWs7CisJCWNhc2UgSW50MkJ5dGUgOgorCQljYXNlIFNob3J0MkJ5dGUgOgorCQljYXNlIENoYXIyQnl0ZSA6CisJCQl0aGlzLmkyYigpOworCQkJYnJlYWs7CisJCWNhc2UgTG9uZzJCeXRlIDoKKwkJCXRoaXMubDJpKCk7CisJCQl0aGlzLmkyYigpOworCQkJYnJlYWs7CisJCWNhc2UgQnl0ZTJEb3VibGUgOgorCQljYXNlIENoYXIyRG91YmxlIDoKKwkJY2FzZSBTaG9ydDJEb3VibGUgOgorCQljYXNlIEludDJEb3VibGUgOgorCQkJdGhpcy5pMmQoKTsKKwkJCWJyZWFrOworCQljYXNlIEZsb2F0MkRvdWJsZSA6CisJCQl0aGlzLmYyZCgpOworCQkJYnJlYWs7CisJCWNhc2UgTG9uZzJEb3VibGUgOgorCQkJdGhpcy5sMmQoKTsKKwkJCWJyZWFrOworCQljYXNlIEJ5dGUyU2hvcnQgOgorCQljYXNlIENoYXIyU2hvcnQgOgorCQljYXNlIEludDJTaG9ydCA6CisJCQl0aGlzLmkycygpOworCQkJYnJlYWs7CisJCWNhc2UgRG91YmxlMlNob3J0IDoKKwkJCXRoaXMuZDJpKCk7CisJCQl0aGlzLmkycygpOworCQkJYnJlYWs7CisJCWNhc2UgTG9uZzJTaG9ydCA6CisJCQl0aGlzLmwyaSgpOworCQkJdGhpcy5pMnMoKTsKKwkJCWJyZWFrOworCQljYXNlIEZsb2F0MlNob3J0IDoKKwkJCXRoaXMuZjJpKCk7CisJCQl0aGlzLmkycygpOworCQkJYnJlYWs7CisJCWNhc2UgRG91YmxlMkludCA6CisJCQl0aGlzLmQyaSgpOworCQkJYnJlYWs7CisJCWNhc2UgRmxvYXQySW50IDoKKwkJCXRoaXMuZjJpKCk7CisJCQlicmVhazsKKwkJY2FzZSBMb25nMkludCA6CisJCQl0aGlzLmwyaSgpOworCQkJYnJlYWs7CisJCWNhc2UgSW50MkxvbmcgOgorCQljYXNlIENoYXIyTG9uZyA6CisJCWNhc2UgQnl0ZTJMb25nIDoKKwkJY2FzZSBTaG9ydDJMb25nIDoKKwkJCXRoaXMuaTJsKCk7CisJCQlicmVhazsKKwkJY2FzZSBEb3VibGUyTG9uZyA6CisJCQl0aGlzLmQybCgpOworCQkJYnJlYWs7CisJCWNhc2UgRmxvYXQyTG9uZyA6CisJCQl0aGlzLmYybCgpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGJ5dGUgaW5saW5lZFZhbHVlKSB7CisJc3dpdGNoIChpbmxpbmVkVmFsdWUpIHsKKwkJY2FzZSAtMSA6CisJCQl0aGlzLmljb25zdF9tMSgpOworCQkJYnJlYWs7CisJCWNhc2UgMCA6CisJCQl0aGlzLmljb25zdF8wKCk7CisJCQlicmVhazsKKwkJY2FzZSAxIDoKKwkJCXRoaXMuaWNvbnN0XzEoKTsKKwkJCWJyZWFrOworCQljYXNlIDIgOgorCQkJdGhpcy5pY29uc3RfMigpOworCQkJYnJlYWs7CisJCWNhc2UgMyA6CisJCQl0aGlzLmljb25zdF8zKCk7CisJCQlicmVhazsKKwkJY2FzZSA0IDoKKwkJCXRoaXMuaWNvbnN0XzQoKTsKKwkJCWJyZWFrOworCQljYXNlIDUgOgorCQkJdGhpcy5pY29uc3RfNSgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJaWYgKCgtMTI4IDw9IGlubGluZWRWYWx1ZSkgJiYgKGlubGluZWRWYWx1ZSA8PSAxMjcpKSB7CisJCQkJdGhpcy5iaXB1c2goKGJ5dGUpIGlubGluZWRWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJfQorCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGNoYXIgaW5saW5lZFZhbHVlKSB7CisJc3dpdGNoIChpbmxpbmVkVmFsdWUpIHsKKwkJY2FzZSAwIDoKKwkJCXRoaXMuaWNvbnN0XzAoKTsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJdGhpcy5pY29uc3RfMSgpOworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisJCQl0aGlzLmljb25zdF8yKCk7CisJCQlicmVhazsKKwkJY2FzZSAzIDoKKwkJCXRoaXMuaWNvbnN0XzMoKTsKKwkJCWJyZWFrOworCQljYXNlIDQgOgorCQkJdGhpcy5pY29uc3RfNCgpOworCQkJYnJlYWs7CisJCWNhc2UgNSA6CisJCQl0aGlzLmljb25zdF81KCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlpZiAoKDYgPD0gaW5saW5lZFZhbHVlKSAmJiAoaW5saW5lZFZhbHVlIDw9IDEyNykpIHsKKwkJCQl0aGlzLmJpcHVzaCgoYnl0ZSkgaW5saW5lZFZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoKDEyOCA8PSBpbmxpbmVkVmFsdWUpICYmIChpbmxpbmVkVmFsdWUgPD0gMzI3NjcpKSB7CisJCQkJdGhpcy5zaXB1c2goaW5saW5lZFZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzLmxkYyhpbmxpbmVkVmFsdWUpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGRvdWJsZSBpbmxpbmVkVmFsdWUpIHsKKwlpZiAoaW5saW5lZFZhbHVlID09IDAuMCkgeworCQlpZiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoaW5saW5lZFZhbHVlKSAhPSAwTCkKKwkJCXRoaXMubGRjMl93KGlubGluZWRWYWx1ZSk7CisJCWVsc2UKKwkJCXRoaXMuZGNvbnN0XzAoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5saW5lZFZhbHVlID09IDEuMCkgeworCQl0aGlzLmRjb25zdF8xKCk7CisJCXJldHVybjsKKwl9CisJdGhpcy5sZGMyX3coaW5saW5lZFZhbHVlKTsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKGZsb2F0IGlubGluZWRWYWx1ZSkgeworCWlmIChpbmxpbmVkVmFsdWUgPT0gMC4wZikgeworCQlpZiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoaW5saW5lZFZhbHVlKSAhPSAwKQorCQkJdGhpcy5sZGMoaW5saW5lZFZhbHVlKTsKKwkJZWxzZQorCQkJdGhpcy5mY29uc3RfMCgpOworCQlyZXR1cm47CisJfQorCWlmIChpbmxpbmVkVmFsdWUgPT0gMS4wZikgeworCQl0aGlzLmZjb25zdF8xKCk7CisJCXJldHVybjsKKwl9CisJaWYgKGlubGluZWRWYWx1ZSA9PSAyLjBmKSB7CisJCXRoaXMuZmNvbnN0XzIoKTsKKwkJcmV0dXJuOworCX0KKwl0aGlzLmxkYyhpbmxpbmVkVmFsdWUpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVJbmxpbmVkVmFsdWUoaW50IGlubGluZWRWYWx1ZSkgeworCXN3aXRjaCAoaW5saW5lZFZhbHVlKSB7CisJCWNhc2UgLTEgOgorCQkJdGhpcy5pY29uc3RfbTEoKTsKKwkJCWJyZWFrOworCQljYXNlIDAgOgorCQkJdGhpcy5pY29uc3RfMCgpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQl0aGlzLmljb25zdF8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuaWNvbnN0XzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5pY29uc3RfMygpOworCQkJYnJlYWs7CisJCWNhc2UgNCA6CisJCQl0aGlzLmljb25zdF80KCk7CisJCQlicmVhazsKKwkJY2FzZSA1IDoKKwkJCXRoaXMuaWNvbnN0XzUoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWlmICgoLTEyOCA8PSBpbmxpbmVkVmFsdWUpICYmIChpbmxpbmVkVmFsdWUgPD0gMTI3KSkgeworCQkJCXRoaXMuYmlwdXNoKChieXRlKSBpbmxpbmVkVmFsdWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICgoLTMyNzY4IDw9IGlubGluZWRWYWx1ZSkgJiYgKGlubGluZWRWYWx1ZSA8PSAzMjc2NykpIHsKKwkJCQl0aGlzLnNpcHVzaChpbmxpbmVkVmFsdWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXMubGRjKGlubGluZWRWYWx1ZSk7CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVJbmxpbmVkVmFsdWUobG9uZyBpbmxpbmVkVmFsdWUpIHsKKwlpZiAoaW5saW5lZFZhbHVlID09IDApIHsKKwkJdGhpcy5sY29uc3RfMCgpOworCQlyZXR1cm47CisJfQorCWlmIChpbmxpbmVkVmFsdWUgPT0gMSkgeworCQl0aGlzLmxjb25zdF8xKCk7CisJCXJldHVybjsKKwl9CisJdGhpcy5sZGMyX3coaW5saW5lZFZhbHVlKTsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlSW5saW5lZFZhbHVlKHNob3J0IGlubGluZWRWYWx1ZSkgeworCXN3aXRjaCAoaW5saW5lZFZhbHVlKSB7CisJCWNhc2UgLTEgOgorCQkJdGhpcy5pY29uc3RfbTEoKTsKKwkJCWJyZWFrOworCQljYXNlIDAgOgorCQkJdGhpcy5pY29uc3RfMCgpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQl0aGlzLmljb25zdF8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuaWNvbnN0XzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5pY29uc3RfMygpOworCQkJYnJlYWs7CisJCWNhc2UgNCA6CisJCQl0aGlzLmljb25zdF80KCk7CisJCQlicmVhazsKKwkJY2FzZSA1IDoKKwkJCXRoaXMuaWNvbnN0XzUoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWlmICgoLTEyOCA8PSBpbmxpbmVkVmFsdWUpICYmIChpbmxpbmVkVmFsdWUgPD0gMTI3KSkgeworCQkJCXRoaXMuYmlwdXNoKChieXRlKSBpbmxpbmVkVmFsdWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRoaXMuc2lwdXNoKGlubGluZWRWYWx1ZSk7CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVJbmxpbmVkVmFsdWUoYm9vbGVhbiBpbmxpbmVkVmFsdWUpIHsKKwlpZiAoaW5saW5lZFZhbHVlKQorCQl0aGlzLmljb25zdF8xKCk7CisJZWxzZQorCQl0aGlzLmljb25zdF8wKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZU91dGVyQWNjZXNzKE9iamVjdFtdIG1hcHBpbmdTZXF1ZW5jZSwgQXN0Tm9kZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAobWFwcGluZ1NlcXVlbmNlID09IG51bGwpCisJCXJldHVybjsKKwlpZiAobWFwcGluZ1NlcXVlbmNlID09IEJsb2NrU2NvcGUuRW11bGF0aW9uUGF0aFRvSW1wbGljaXRUaGlzKSB7CisJCWlmIChzY29wZS5tZXRob2RTY29wZSgpLmlzQ29uc3RydWN0b3JDYWxsKXsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yVGhpc1N1cGVySW5TdGF0aWMoaW52b2NhdGlvblNpdGUpOworCQl9CisJCXRoaXMuYWxvYWRfMCgpOworCQlyZXR1cm47CisJfQorCWlmIChtYXBwaW5nU2VxdWVuY2VbMF0gaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKKwkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIG1hcHBpbmdTZXF1ZW5jZVswXTsKKwkJaWYgKHNjb3BlLm1ldGhvZFNjb3BlKCkuaXNDb25zdHJ1Y3RvckNhbGwpeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZXJyb3JUaGlzU3VwZXJJblN0YXRpYyhpbnZvY2F0aW9uU2l0ZSk7CisJCX0KKwkJdGhpcy5hbG9hZF8wKCk7CisJCXRoaXMuZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKKwl9IGVsc2UgeworCQlsb2FkKChMb2NhbFZhcmlhYmxlQmluZGluZykgbWFwcGluZ1NlcXVlbmNlWzBdKTsKKwl9CisJZm9yIChpbnQgaSA9IDEsIGxlbmd0aCA9IG1hcHBpbmdTZXF1ZW5jZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAobWFwcGluZ1NlcXVlbmNlW2ldIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgbWFwcGluZ1NlcXVlbmNlW2ldOworCQkJdGhpcy5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJdGhpcy5pbnZva2VzdGF0aWMoKE1ldGhvZEJpbmRpbmcpIG1hcHBpbmdTZXF1ZW5jZVtpXSk7CisJCX0KKwl9Cit9CisvKioKKyAqIFRoZSBlcXVpdmFsZW50IGNvZGUgcGVyZm9ybXMgYSBzdHJpbmcgY29udmVyc2lvbjoKKyAqCisgKiBAcGFyYW0gb3BlcjEgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKiBAcGFyYW0gb3BlcjEgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uCisgKiBAcGFyYW0gb3BlcjIgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3RyaW5nQXBwZW5kKEJsb2NrU2NvcGUgYmxvY2tTY29wZSwgRXhwcmVzc2lvbiBvcGVyMSwgRXhwcmVzc2lvbiBvcGVyMikgeworCWludCBwYzsKKwlpZiAob3BlcjEgPT0gbnVsbCkgeworCQkvKiBPcGVyYW5kIGlzIGFscmVhZHkgb24gdGhlIHN0YWNrLCBhbmQgbWF5YmUgbmlsOgorCQlub3RlIHR5cGUxIGlzIGFsd2F5cyB0byAgamF2YS5sYW5nLlN0cmluZyBoZXJlLiovCisJCXRoaXMubmV3U3RyaW5nQnVmZmVyKCk7CisJCXRoaXMuZHVwX3gxKCk7CisJCXRoaXMuc3dhcCgpOworCQkvLyBJZiBhcmd1bWVudCBpcyByZWZlcmVuY2UgdHlwZSwgbmVlZCB0byB0cmFuc2Zvcm0gaXQgCisJCS8vIGludG8gYSBzdHJpbmcgKGhhbmRsZXMgbnVsbCBjYXNlKQorCQl0aGlzLmludm9rZVN0cmluZ1ZhbHVlT2YoVF9PYmplY3QpOworCQl0aGlzLmludm9rZVN0cmluZ0J1ZmZlclN0cmluZ0NvbnN0cnVjdG9yKCk7CisJfSBlbHNlIHsKKwkJcGMgPSBwb3NpdGlvbjsKKwkJb3BlcjEuZ2VuZXJhdGVPcHRpbWl6ZWRTdHJpbmdCdWZmZXJDcmVhdGlvbihibG9ja1Njb3BlLCB0aGlzLCBvcGVyMS5pbXBsaWNpdENvbnZlcnNpb24gJiAweEYpOworCQl0aGlzLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIG9wZXIxLnNvdXJjZVN0YXJ0KTsKKwl9CisJcGMgPSBwb3NpdGlvbjsKKwlvcGVyMi5nZW5lcmF0ZU9wdGltaXplZFN0cmluZ0J1ZmZlcihibG9ja1Njb3BlLCB0aGlzLCBvcGVyMi5pbXBsaWNpdENvbnZlcnNpb24gJiAweEYpOworCXRoaXMucmVjb3JkUG9zaXRpb25zRnJvbShwYywgb3BlcjIuc291cmNlU3RhcnQpOworCXRoaXMuaW52b2tlU3RyaW5nQnVmZmVyVG9TdHJpbmcoKTsKK30KKy8qKgorICogQ29kZSByZXNwb25zaWJsZSB0byBnZW5lcmF0ZSB0aGUgc3VpdGFibGUgY29kZSB0byBzdXBwbHkgdmFsdWVzIGZvciB0aGUgc3ludGhldGljIGFyZ3VtZW50cyBvZgorICogYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG9mIGEgbmVzdGVkIHR5cGUuCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljQXJndW1lbnRWYWx1ZXMoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgRXhwcmVzc2lvbiBlbmNsb3NpbmdJbnN0YW5jZSwgQXN0Tm9kZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJLy8gcGVyZm9ybSBzb21lIGVtdWxhdGlvbiB3b3JrIGluIGNhc2UgdGhlcmUgaXMgc29tZSBhbmQgd2UgYXJlIGluc2lkZSBhIGxvY2FsIHR5cGUgb25seQorCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzOworCisJLy8gZ2VuZXJhdGUgdGhlIGVuY2xvc2luZyBpbnN0YW5jZSBmaXJzdAorCWlmICgoc3ludGhldGljQXJndW1lbnRUeXBlcyA9IHRhcmdldFR5cGUuc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpKSAhPSBudWxsKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlID0gdGFyZ2V0VHlwZS5pc0Fub255bW91c1R5cGUoKSA/IAorCQkJCXRhcmdldFR5cGUuc3VwZXJjbGFzcygpLmVuY2xvc2luZ1R5cGUoKSAvLyBzdXBwbHlpbmcgZW5jbG9zaW5nIGluc3RhbmNlIGZvciB0aGUgYW5vbnltb3VzIHR5cGUncyBzdXBlcmNsYXNzCisJCQkJOiB0YXJnZXRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQkKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgc3ludGhldGljQXJnVHlwZSA9IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXNbaV07CisJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCAmJiBpID09IDApIHsKKwkJCQlpZiAoc3ludGhldGljQXJnVHlwZSAhPSB0YXJnZXRFbmNsb3NpbmdUeXBlKSB7CisJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbihlbmNsb3NpbmdJbnN0YW5jZSwgdGFyZ2V0VHlwZSk7CisJCQkJfQorCQkJCS8vaWYgKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpeworCQkJCWVuY2xvc2luZ0luc3RhbmNlLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIHRoaXMsIHRydWUpOworCQkJCWlmIChzeW50aGV0aWNBcmdUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpeworCQkJCQl0aGlzLmR1cCgpOworCQkJCX0gCisJCQkJdGhpcy5pbnZva2VPYmplY3RHZXRDbGFzcygpOyAvLyBjYXVzZXMgbnVsbCBjaGVjayBmb3IgYWxsIGV4cGxpY2l0IGVuY2xvc2luZyBpbnN0YW5jZXMKKwkJCQl0aGlzLnBvcCgpOworCQkJCS8vfSBlbHNlIHsKKwkJCQkvLwllbmNsb3NpbmdJbnN0YW5jZS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCB0aGlzLCBzeW50aGV0aWNBcmdUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpOworCQkJCS8vfQkJCQorCQkJfSBlbHNlIHsKKwkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldENvbXBhdGlibGVFbXVsYXRpb25QYXRoKHN5bnRoZXRpY0FyZ1R5cGUpOworCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oc3ludGhldGljQXJnVHlwZSwgaW52b2NhdGlvblNpdGUpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCBpbnZvY2F0aW9uU2l0ZSwgY3VycmVudFNjb3BlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeyAvLyB3ZSBtYXkgc3RpbGwgaGF2ZSBhbiBlbmNsb3NpbmcgaW5zdGFuY2UgdG8gY29uc2lkZXIKKwkJaWYgKGVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKKwkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbihlbmNsb3NpbmdJbnN0YW5jZSwgdGFyZ2V0VHlwZSk7CisJCQkvL2lmIChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KXsKKwkJCWVuY2xvc2luZ0luc3RhbmNlLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIHRoaXMsIHRydWUpOworCQkJdGhpcy5pbnZva2VPYmplY3RHZXRDbGFzcygpOyAvLyBjYXVzZXMgbnVsbCBjaGVjayBmb3IgYWxsIGV4cGxpY2l0IGVuY2xvc2luZyBpbnN0YW5jZXMKKwkJCXRoaXMucG9wKCk7CisJCQkvL30gZWxzZSB7CisJCQkvLwllbmNsb3NpbmdJbnN0YW5jZS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCB0aGlzLCBmYWxzZSk7IC8vIGRvIG5vdCB3YW50IHRoZSB2YWx1ZQorCQkJLy99CQkJCisJCX0KKwl9CisJLy8gZ2VuZXJhdGUgdGhlIHN5bnRoZXRpYyBvdXRlciBhcmd1bWVudHMgdGhlbgorCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmd1bWVudHNbXTsKKwlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IHRhcmdldFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpKSAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVZhcmlhYmxlQmluZGluZ1tdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChzeW50aGV0aWNBcmd1bWVudHNbaV0uYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKKwkJCQkvLyBjb3VsZCBub3QgZW11bGF0ZSBhIHBhdGggdG8gYSBnaXZlbiBvdXRlciBsb2NhbCB2YXJpYWJsZSAoaW50ZXJuYWwgZXJyb3IpCisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgaW52b2NhdGlvblNpdGUsIGN1cnJlbnRTY29wZSk7CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmdbXQorICogQHBhcmFtIGNvbnN0cnVjdG9yQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yQ29uc3RydWN0b3JBY2Nlc3MoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhY2Nlc3NCaW5kaW5nKSB7CisKKwlpbml0aWFsaXplTWF4TG9jYWxzKGFjY2Vzc0JpbmRpbmcpOworCisJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvckJpbmRpbmcgPSBhY2Nlc3NCaW5kaW5nLnRhcmdldE1ldGhvZDsKKwlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBjb25zdHJ1Y3RvckJpbmRpbmcucGFyYW1ldGVyczsKKwlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJaW50IHJlc29sdmVkUG9zaXRpb24gPSAxOworCXRoaXMuYWxvYWRfMCgpOworCWlmIChjb25zdHJ1Y3RvckJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgY29uc3RydWN0b3JCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IChzeW50aGV0aWNBcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNBcmd1bWVudHMubGVuZ3RoKTsgaSsrKSB7CisJCQlUeXBlQmluZGluZyB0eXBlOworCQkJbG9hZCgodHlwZSA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXS50eXBlKSwgcmVzb2x2ZWRQb3NpdGlvbik7CisJCQlpZiAoKHR5cGUgPT0gRG91YmxlQmluZGluZykgfHwgKHR5cGUgPT0gTG9uZ0JpbmRpbmcpKQorCQkJCXJlc29sdmVkUG9zaXRpb24gKz0gMjsKKwkJCWVsc2UKKwkJCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJCX0KKwkJc3ludGhldGljQXJndW1lbnRzID0gbmVzdGVkVHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgKHN5bnRoZXRpY0FyZ3VtZW50cyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGgpOyBpKyspIHsKKwkJCVR5cGVCaW5kaW5nIHR5cGU7CisJCQlsb2FkKCh0eXBlID0gc3ludGhldGljQXJndW1lbnRzW2ldLnR5cGUpLCByZXNvbHZlZFBvc2l0aW9uKTsKKwkJCWlmICgodHlwZSA9PSBEb3VibGVCaW5kaW5nKSB8fCAodHlwZSA9PSBMb25nQmluZGluZykpCisJCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOworCQkJZWxzZQorCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwkJfQorCX0KKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWxvYWQocGFyYW1ldGVyc1tpXSwgcmVzb2x2ZWRQb3NpdGlvbik7CisJCWlmICgocGFyYW1ldGVyc1tpXSA9PSBEb3VibGVCaW5kaW5nKSB8fCAocGFyYW1ldGVyc1tpXSA9PSBMb25nQmluZGluZykpCisJCQlyZXNvbHZlZFBvc2l0aW9uICs9IDI7CisJCWVsc2UKKwkJCXJlc29sdmVkUG9zaXRpb24rKzsKKwl9CisJdGhpcy5pbnZva2VzcGVjaWFsKGNvbnN0cnVjdG9yQmluZGluZyk7CisJdGhpcy5yZXR1cm5fKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFJlYWRBY2Nlc3MoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhY2Nlc3NCaW5kaW5nKSB7CisJaW5pdGlhbGl6ZU1heExvY2FscyhhY2Nlc3NCaW5kaW5nKTsKKwlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gYWNjZXNzQmluZGluZy50YXJnZXRSZWFkRmllbGQ7CisJVHlwZUJpbmRpbmcgdHlwZTsKKwlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpCisJCXRoaXMuZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7CisJZWxzZSB7CisJCXRoaXMuYWxvYWRfMCgpOworCQl0aGlzLmdldGZpZWxkKGZpZWxkQmluZGluZyk7CisJfQorCWlmICgodHlwZSA9IGZpZWxkQmluZGluZy50eXBlKS5pc0Jhc2VUeXBlKCkpIHsKKwkJaWYgKHR5cGUgPT0gSW50QmluZGluZykKKwkJCXRoaXMuaXJldHVybigpOworCQllbHNlCisJCQlpZiAodHlwZSA9PSBGbG9hdEJpbmRpbmcpCisJCQkJdGhpcy5mcmV0dXJuKCk7CisJCQllbHNlCisJCQkJaWYgKHR5cGUgPT0gTG9uZ0JpbmRpbmcpCisJCQkJCXRoaXMubHJldHVybigpOworCQkJCWVsc2UKKwkJCQkJaWYgKHR5cGUgPT0gRG91YmxlQmluZGluZykKKwkJCQkJCXRoaXMuZHJldHVybigpOworCQkJCQllbHNlCisJCQkJCQl0aGlzLmlyZXR1cm4oKTsKKwl9IGVsc2UKKwkJdGhpcy5hcmV0dXJuKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0JvZHlGb3JGaWVsZFdyaXRlQWNjZXNzKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWNjZXNzQmluZGluZykgeworCWluaXRpYWxpemVNYXhMb2NhbHMoYWNjZXNzQmluZGluZyk7CisJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGFjY2Vzc0JpbmRpbmcudGFyZ2V0V3JpdGVGaWVsZDsKKwlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJbG9hZChmaWVsZEJpbmRpbmcudHlwZSwgMCk7CisJCXRoaXMucHV0c3RhdGljKGZpZWxkQmluZGluZyk7CisJfSBlbHNlIHsKKwkJdGhpcy5hbG9hZF8wKCk7CisJCWxvYWQoZmllbGRCaW5kaW5nLnR5cGUsIDEpOworCQl0aGlzLnB1dGZpZWxkKGZpZWxkQmluZGluZyk7CisJfQorCXRoaXMucmV0dXJuXygpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNCb2R5Rm9yTWV0aG9kQWNjZXNzKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWNjZXNzQmluZGluZykgeworCisJaW5pdGlhbGl6ZU1heExvY2FscyhhY2Nlc3NCaW5kaW5nKTsKKwlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBhY2Nlc3NCaW5kaW5nLnRhcmdldE1ldGhvZDsKKwlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnM7CisJaW50IGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCWludCByZXNvbHZlZFBvc2l0aW9uOworCWlmIChtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpCisJCXJlc29sdmVkUG9zaXRpb24gPSAwOworCWVsc2UgeworCQl0aGlzLmFsb2FkXzAoKTsKKwkJcmVzb2x2ZWRQb3NpdGlvbiA9IDE7CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJbG9hZChwYXJhbWV0ZXJzW2ldLCByZXNvbHZlZFBvc2l0aW9uKTsKKwkJaWYgKChwYXJhbWV0ZXJzW2ldID09IERvdWJsZUJpbmRpbmcpIHx8IChwYXJhbWV0ZXJzW2ldID09IExvbmdCaW5kaW5nKSkKKwkJCXJlc29sdmVkUG9zaXRpb24gKz0gMjsKKwkJZWxzZQorCQkJcmVzb2x2ZWRQb3NpdGlvbisrOworCX0KKwlUeXBlQmluZGluZyB0eXBlOworCWlmIChtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpCisJCXRoaXMuaW52b2tlc3RhdGljKG1ldGhvZEJpbmRpbmcpOworCWVsc2UgeworCQlpZiAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkKKwkJCXx8IG1ldGhvZEJpbmRpbmcuaXNQcml2YXRlKCkKKwkJCS8vIHF1YWxpZmllZCBzdXBlciAiWC5zdXBlci5mb28oKSIgdGFyZ2V0cyBtZXRob2RzIGZyb20gc3VwZXJjbGFzcworCQkJfHwgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbWV0aG9kRGVjbGFyYXRpb24uYmluZGluZy5kZWNsYXJpbmdDbGFzcykpeworCQkJdGhpcy5pbnZva2VzcGVjaWFsKG1ldGhvZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSl7CisJCQkJdGhpcy5pbnZva2VpbnRlcmZhY2UobWV0aG9kQmluZGluZyk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuaW52b2tldmlydHVhbChtZXRob2RCaW5kaW5nKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKHR5cGUgPSBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpLmlzQmFzZVR5cGUoKSkKKwkJaWYgKHR5cGUgPT0gVm9pZEJpbmRpbmcpCisJCQl0aGlzLnJldHVybl8oKTsKKwkJZWxzZQorCQkJaWYgKHR5cGUgPT0gSW50QmluZGluZykKKwkJCQl0aGlzLmlyZXR1cm4oKTsKKwkJCWVsc2UKKwkJCQlpZiAodHlwZSA9PSBGbG9hdEJpbmRpbmcpCisJCQkJCXRoaXMuZnJldHVybigpOworCQkJCWVsc2UKKwkJCQkJaWYgKHR5cGUgPT0gTG9uZ0JpbmRpbmcpCisJCQkJCQl0aGlzLmxyZXR1cm4oKTsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKHR5cGUgPT0gRG91YmxlQmluZGluZykKKwkJCQkJCQl0aGlzLmRyZXR1cm4oKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQl0aGlzLmlyZXR1cm4oKTsKKwllbHNlCisJCXRoaXMuYXJldHVybigpOworfQorZmluYWwgcHVibGljIGJ5dGVbXSBnZXRDb250ZW50cygpIHsKKwlieXRlW10gY29udGVudHM7CisJU3lzdGVtLmFycmF5Y29weShiQ29kZVN0cmVhbSwgMCwgY29udGVudHMgPSBuZXcgYnl0ZVtwb3NpdGlvbl0sIDAsIHBvc2l0aW9uKTsKKwlyZXR1cm4gY29udGVudHM7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBnZXRmaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7CisJY291bnRMYWJlbHMgPSAwOworCWlmICgoZmllbGRCaW5kaW5nLnR5cGUuaWQgPT0gVF9kb3VibGUpIHx8IChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUX2xvbmcpKSB7CisJCWlmICgrK3N0YWNrRGVwdGggPiBzdGFja01heCkKKwkJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2dldGZpZWxkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2dldGZpZWxkKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nKSk7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBnZXRzdGF0aWMoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlpZiAoKGZpZWxkQmluZGluZy50eXBlLmlkID09IFRfZG91YmxlKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUuaWQgPT0gVF9sb25nKSkKKwkJc3RhY2tEZXB0aCArPSAyOworCWVsc2UKKwkJc3RhY2tEZXB0aCArPSAxOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZ2V0c3RhdGljOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2dldHN0YXRpYyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGZpZWxkQmluZGluZykpOworfQorcHVibGljIHZvaWQgZ2V0U3lzdGVtT3V0KCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlpZiAoKytzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZ2V0c3RhdGljOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2dldHN0YXRpYyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTeXN0ZW1PdXQoKSk7Cit9CitwdWJsaWMgdm9pZCBnZXRUWVBFKGludCBiYXNlVHlwZUlEKSB7CisJY291bnRMYWJlbHMgPSAwOworCWlmICgrK3N0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19nZXRzdGF0aWM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZ2V0c3RhdGljKTsKKwl9CisJc3dpdGNoIChiYXNlVHlwZUlEKSB7CisJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkJ5dGUuVFlQRQkJCQorCQljYXNlIFRfYnl0ZSA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQnl0ZVRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLlNob3J0LlRZUEUJCQkKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTaG9ydFRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkNoYXJhY3Rlci5UWVBFCQkJCisJCWNhc2UgVF9jaGFyIDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXJUWVBFKCkpOworCQkJYnJlYWs7CisJCQkvLyBnZXRzdGF0aWM6IGphdmEubGFuZy5JbnRlZ2VyLlRZUEUJCQkKKwkJY2FzZSBUX2ludCA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nSW50ZWdlclRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkxvbmcuVFlQRQkJCQorCQljYXNlIFRfbG9uZyA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nTG9uZ1RZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkZsb2F0LlRZUEUJCQkKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdGbG9hdFRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkRvdWJsZS5UWVBFCQkJCisJCWNhc2UgVF9kb3VibGUgOgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0RvdWJsZVRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLkJvb2xlYW4uVFlQRQkJCQorCQljYXNlIFRfYm9vbGVhbiA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQm9vbGVhblRZUEUoKSk7CisJCQlicmVhazsKKwkJCS8vIGdldHN0YXRpYzogamF2YS5sYW5nLlZvaWQuVFlQRQorCQljYXNlIFRfdm9pZCA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nVm9pZFRZUEUoKSk7CisJCQlicmVhazsKKwl9Cit9CisvKioKKyAqIFdlIGRpZG4ndCBjYWxsIGl0IGdvdG8sIGJlY2F1c2UgdGhlcmUgaXMgYSBjb25mbGl0IHdpdGggdGhlIGdvdG8ga2V5d29yZAorICovCitmaW5hbCBwdWJsaWMgdm9pZCBnb3RvXyhMYWJlbCBsYmwpIHsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQl0aGlzLmdvdG9fdyhsYmwpOworCQlyZXR1cm47CisJfQorCXRyeSB7CisJCWxibC5pbmxpbmVGb3J3YXJkUmVmZXJlbmNlc0Zyb21MYWJlbHNUYXJnZXRpbmcocG9zaXRpb24pOworCQkvKgorCQkgUG9zc2libGUgb3B0aW1pemF0aW9uIGZvciBjb2RlIHN1Y2ggYXM6CisJCSBwdWJsaWMgT2JqZWN0IGZvbygpIHsKKwkJCWJvb2xlYW4gYiA9IHRydWU7CisJCQlpZiAoYikgeworCQkJCWlmIChiKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGIpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVGhlIGdvdG8gYXJvdW5kIHRoZSBlbHNlIGJsb2NrIGZvciB0aGUgZmlyc3QgaWYgd2lsbAorCQliZSB1bnJlYWNoYWJsZSwgYmVjYXVzZSB0aGUgdGhlbkNsYXVzZSBvZiB0aGUgc2Vjb25kIGlmCisJCXJldHVybnMuCisJCVNlZSBpbmxpbmVGb3J3YXJkUmVmZXJlbmNlc0Zyb21MYWJlbHNUYXJnZXRpbmcgZGVmaW5lZAorCQlvbiB0aGUgTGFiZWwgY2xhc3MgZm9yIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGlzCisJCW9wdGltaXphdGlvbi4KKwkJIGlmICghbGJsLmlzQnJhbmNoVGFyZ2V0KHBvc2l0aW9uKSkgeworCQkJc3dpdGNoKGJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldC0xXSkgeworCQkJCWNhc2UgT1BDX3JldHVybiA6CisJCQkJY2FzZSBPUENfYXJldHVybjoKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9Ki8KKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2dvdG87CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZ290byk7CisJfQorCWxibC5icmFuY2goKTsKK30KKworLyoqCisgKiBXZSBkaWRuJ3QgY2FsbCBpdCBnb3RvLCBiZWNhdXNlIHRoZXJlIGlzIGEgY29uZmxpdCB3aXRoIHRoZSBnb3RvIGtleXdvcmQKKyAqLworZmluYWwgcHVibGljIHZvaWQgaW50ZXJuYWxfZ290b18oTGFiZWwgbGJsKSB7CisJdHJ5IHsKKwkJbGJsLmlubGluZUZvcndhcmRSZWZlcmVuY2VzRnJvbUxhYmVsc1RhcmdldGluZyhwb3NpdGlvbik7CisJCS8qCisJCSBQb3NzaWJsZSBvcHRpbWl6YXRpb24gZm9yIGNvZGUgc3VjaCBhczoKKwkJIHB1YmxpYyBPYmplY3QgZm9vKCkgeworCQkJYm9vbGVhbiBiID0gdHJ1ZTsKKwkJCWlmIChiKSB7CisJCQkJaWYgKGIpCisJCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYikgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlUaGUgZ290byBhcm91bmQgdGhlIGVsc2UgYmxvY2sgZm9yIHRoZSBmaXJzdCBpZiB3aWxsCisJCWJlIHVucmVhY2hhYmxlLCBiZWNhdXNlIHRoZSB0aGVuQ2xhdXNlIG9mIHRoZSBzZWNvbmQgaWYKKwkJcmV0dXJucy4KKwkJU2VlIGlubGluZUZvcndhcmRSZWZlcmVuY2VzRnJvbUxhYmVsc1RhcmdldGluZyBkZWZpbmVkCisJCW9uIHRoZSBMYWJlbCBjbGFzcyBmb3IgdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoaXMKKwkJb3B0aW1pemF0aW9uLgorCQkgaWYgKCFsYmwuaXNCcmFuY2hUYXJnZXQocG9zaXRpb24pKSB7CisJCQlzd2l0Y2goYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0LTFdKSB7CisJCQkJY2FzZSBPUENfcmV0dXJuIDoKKwkJCQljYXNlIE9QQ19hcmV0dXJuOgorCQkJCQlyZXR1cm47CisJCQl9CisJCX0qLworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfZ290bzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19nb3RvKTsKKwl9CisJbGJsLmJyYW5jaCgpOworfQorZmluYWwgcHVibGljIHZvaWQgZ290b193KExhYmVsIGxibCkgeworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19nb3RvX3c7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfZ290b193KTsKKwl9CisJbGJsLmJyYW5jaFdpZGUoKTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGkyYigpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2kyYjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pMmIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGkyYygpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2kyYzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pMmMpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGkyZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaTJkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2kyZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaTJmKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaTJmOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2kyZik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaTJsKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pMmw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaTJsKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpMnMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pMnM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaTJzKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpYWRkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lhZGQ7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWFkZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWFsb2FkKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lhbG9hZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pYWxvYWQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlhbmQoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWFuZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pYW5kKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpYXN0b3JlKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDM7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lhc3RvcmU7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWFzdG9yZSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWNvbnN0XzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ljb25zdF8wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ljb25zdF8wKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpY29uc3RfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWNvbnN0XzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWNvbnN0XzEpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGljb25zdF8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pY29uc3RfMjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pY29uc3RfMik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWNvbnN0XzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ljb25zdF8zOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ljb25zdF8zKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpY29uc3RfNCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWNvbnN0XzQ7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWNvbnN0XzQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGljb25zdF81KCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pY29uc3RfNTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pY29uc3RfNSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWNvbnN0X20xKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pY29uc3RfbTE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWNvbnN0X20xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZGl2KCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lkaXY7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWRpdik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZfYWNtcGVxKExhYmVsIGxibCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLT0yOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZl9hY21wZXEsIGxibCk7CisJfSBlbHNlIHsJCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmX2FjbXBlcTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lmX2FjbXBlcSk7CisJCX0KKwkJbGJsLmJyYW5jaCgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlmX2FjbXBuZShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC09MjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfYWNtcG5lLCBsYmwpOworCX0gZWxzZSB7CQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZl9hY21wbmU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZl9hY21wbmUpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZl9pY21wZXEoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfaWNtcGVxLCBsYmwpOworCX0gZWxzZSB7CQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZl9pY21wZXE7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZl9pY21wZXEpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZl9pY21wZ2UoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfaWNtcGdlLCBsYmwpOworCX0gZWxzZSB7CQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZl9pY21wZ2U7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZl9pY21wZ2UpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZl9pY21wZ3QoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfaWNtcGd0LCBsYmwpOworCX0gZWxzZSB7CQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZl9pY21wZ3Q7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZl9pY21wZ3QpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZl9pY21wbGUoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfaWNtcGxlLCBsYmwpOworCX0gZWxzZSB7CQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZl9pY21wbGU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZl9pY21wbGUpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZl9pY21wbHQoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZfaWNtcGx0LCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmX2ljbXBsdDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lmX2ljbXBsdCk7CisJCX0KKwkJbGJsLmJyYW5jaCgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlmX2ljbXBuZShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZl9pY21wbmUsIGxibCk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWZfaWNtcG5lOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWZfaWNtcG5lKTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZlcShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZmVxLCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmZXE7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZmVxKTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZnZShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZmdlLCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmZ2U7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZmdlKTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZndChMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZmd0LCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmZ3Q7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZmd0KTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZsZShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZmxlLCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmbGU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZmxlKTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZsdChMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZmx0LCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmbHQ7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZmx0KTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZuZShMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmICh0aGlzLndpZGVNb2RlKSB7CisJCWdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKE9QQ19pZm5lLCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmbmU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZm5lKTsKKwkJfQorCQlsYmwuYnJhbmNoKCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWZub25udWxsKExhYmVsIGxibCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKHRoaXMud2lkZU1vZGUpIHsKKwkJZ2VuZXJhdGVXaWRlQ29uZGl0aW9uYWxCcmFuY2goT1BDX2lmbm9ubnVsbCwgbGJsKTsKKwl9IGVsc2UgeworCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pZm5vbm51bGw7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pZm5vbm51bGwpOworCQl9CisJCWxibC5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpZm51bGwoTGFiZWwgbGJsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQlnZW5lcmF0ZVdpZGVDb25kaXRpb25hbEJyYW5jaChPUENfaWZudWxsLCBsYmwpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lmbnVsbDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lmbnVsbCk7CisJCX0KKwkJbGJsLmJyYW5jaCgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlpbmMoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKKwljb3VudExhYmVscyA9IDA7CisJaWYgKChpbmRleCA+IDI1NSkgfHwgKHZhbHVlIDwgLTEyOCB8fCB2YWx1ZSA+IDEyNykpIHsgLy8gaGF2ZSB0byB3aWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWluYzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lpbmMpOworCQl9CisJCXdyaXRlVW5zaWduZWRTaG9ydChpbmRleCk7CisJCXdyaXRlU2lnbmVkU2hvcnQodmFsdWUpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lpbmM7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19paW5jKTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkQnl0ZShpbmRleCk7CisJCXdyaXRlU2lnbmVkQnl0ZSh2YWx1ZSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWxvYWQoaW50IGlBcmcpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChtYXhMb2NhbHMgPD0gaUFyZykgeworCQltYXhMb2NhbHMgPSBpQXJnICsgMTsKKwl9CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCWlmIChpQXJnID4gMjU1KSB7IC8vIFdpZGVuCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX3dpZGU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ193aWRlKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbG9hZDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lsb2FkKTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaWxvYWQ7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbG9hZCk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGlBcmcpOworCQl9CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWxvYWRfMCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChtYXhMb2NhbHMgPD0gMCkgeworCQltYXhMb2NhbHMgPSAxOworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lsb2FkXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWxvYWRfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWxvYWRfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChtYXhMb2NhbHMgPD0gMSkgeworCQltYXhMb2NhbHMgPSAyOworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lsb2FkXzE7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWxvYWRfMSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWxvYWRfMigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChtYXhMb2NhbHMgPD0gMikgeworCQltYXhMb2NhbHMgPSAzOworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lsb2FkXzI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWxvYWRfMik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaWxvYWRfMygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChtYXhMb2NhbHMgPD0gMykgeworCQltYXhMb2NhbHMgPSA0OworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lsb2FkXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaWxvYWRfMyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaW11bCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbXVsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ltdWwpOworCX0KK30KK3B1YmxpYyB2b2lkIGluY3JlbWVudFRlbXAoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nLCBpbnQgdmFsdWUpIHsKKwlpZiAodmFsdWUgPT0gKHNob3J0KSB2YWx1ZSkgeworCQl0aGlzLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIHZhbHVlKTsKKwkJcmV0dXJuOworCX0KKwlsb2FkKGxvY2FsQmluZGluZyk7CisJdGhpcy5sZGModmFsdWUpOworCXRoaXMuaWFkZCgpOworCXN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOworfQorcHVibGljIHZvaWQgaW5jclN0YWNrU2l6ZShpbnQgb2Zmc2V0KSB7CisJaWYgKChzdGFja0RlcHRoICs9IG9mZnNldCkgPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworfQorcHVibGljIGludCBpbmRleE9mU2FtZUxpbmVFbnRyeVNpbmNlUEMoaW50IHBjLCBpbnQgbGluZSkgeworCWZvciAoaW50IGluZGV4ID0gcGMsIG1heCA9IHBjVG9Tb3VyY2VNYXBTaXplOyBpbmRleCA8IG1heDsgaW5kZXgrPTIpIHsKKwkJaWYgKHBjVG9Tb3VyY2VNYXBbaW5kZXgrMV0gPT0gbGluZSkKKwkJCXJldHVybiBpbmRleDsKKwl9CisJcmV0dXJuIC0xOworfQorZmluYWwgcHVibGljIHZvaWQgaW5lZygpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2luZWc7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW5lZyk7CisJfQorfQorcHVibGljIHZvaWQgaW5pdChDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJdGhpcy5jbGFzc0ZpbGUgPSBjbGFzc0ZpbGU7CisJdGhpcy5jb25zdGFudFBvb2wgPSBjbGFzc0ZpbGUuY29uc3RhbnRQb29sOworCXRoaXMuYkNvZGVTdHJlYW0gPSBjbGFzc0ZpbGUuY29udGVudHM7CisJdGhpcy5jbGFzc0ZpbGVPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CisJdGhpcy5zdGFydGluZ0NsYXNzRmlsZU9mZnNldCA9IHRoaXMuY2xhc3NGaWxlT2Zmc2V0OworCXBjVG9Tb3VyY2VNYXBTaXplID0gMDsKKwlsYXN0RW50cnlQQyA9IDA7CisJaW50IGxlbmd0aCA9IHZpc2libGVMb2NhbHMubGVuZ3RoOworCWlmIChub1Zpc2libGVMb2NhbHMubGVuZ3RoIDwgbGVuZ3RoKSB7CisJCW5vVmlzaWJsZUxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tsZW5ndGhdOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5vVmlzaWJsZUxvY2FscywgMCwgdmlzaWJsZUxvY2FscywgMCwgbGVuZ3RoKTsKKwl2aXNpYmxlTG9jYWxzQ291bnQgPSAwOworCQorCWxlbmd0aCA9IGxvY2Fscy5sZW5ndGg7CisJaWYgKG5vTG9jYWxzLmxlbmd0aCA8IGxlbmd0aCkgeworCQlub0xvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tsZW5ndGhdOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5vTG9jYWxzLCAwLCBsb2NhbHMsIDAsIGxlbmd0aCk7CisJYWxsTG9jYWxzQ291bnRlciA9IDA7CisKKwlsZW5ndGggPSBleGNlcHRpb25IYW5kbGVycy5sZW5ndGg7CisJaWYgKG5vRXhjZXB0aW9uSGFuZGxlcnMubGVuZ3RoIDwgbGVuZ3RoKSB7CisJCW5vRXhjZXB0aW9uSGFuZGxlcnMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbbGVuZ3RoXTsKKwl9CisJU3lzdGVtLmFycmF5Y29weShub0V4Y2VwdGlvbkhhbmRsZXJzLCAwLCBleGNlcHRpb25IYW5kbGVycywgMCwgbGVuZ3RoKTsKKwlleGNlcHRpb25IYW5kbGVyc051bWJlciA9IDA7CisJCisJbGVuZ3RoID0gbGFiZWxzLmxlbmd0aDsKKwlpZiAobm9MYWJlbHMubGVuZ3RoIDwgbGVuZ3RoKSB7CisJCW5vTGFiZWxzID0gbmV3IExhYmVsW2xlbmd0aF07CisJfQorCVN5c3RlbS5hcnJheWNvcHkobm9MYWJlbHMsIDAsIGxhYmVscywgMCwgbGVuZ3RoKTsKKwljb3VudExhYmVscyA9IDA7CisKKwlzdGFja01heCA9IDA7CisJc3RhY2tEZXB0aCA9IDA7CisJbWF4TG9jYWxzID0gMDsKKwlwb3NpdGlvbiA9IDA7Cit9CisvKioKKyAqIEBwYXJhbSBtZXRob2REZWNsYXJhdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KKyAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyB2b2lkIGluaXRpYWxpemVNYXhMb2NhbHMoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisKKwltYXhMb2NhbHMgPSAobWV0aG9kQmluZGluZyA9PSBudWxsIHx8IG1ldGhvZEJpbmRpbmcuaXNTdGF0aWMoKSkgPyAwIDogMTsKKwkvLyB0YWtlIGludG8gYWNjb3VudCB0aGUgc3ludGhldGljIHBhcmFtZXRlcnMKKwlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCWlmIChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ0luc3RhbmNlVHlwZXNbXTsKKwkJCWlmICgoZW5jbG9zaW5nSW5zdGFuY2VUeXBlcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpKSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVuY2xvc2luZ0luc3RhbmNlVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJbWF4TG9jYWxzKys7IC8vIGFuIGVuY2xvc2luZ0luc3RhbmNlVHlwZSBjYW4gb25seSBiZSBhIHJlZmVyZW5jZSBiaW5kaW5nLiBJdCBjYW5ub3QgYmUKKwkJCQkJLy8gTG9uZ0JpbmRpbmcgb3IgRG91YmxlQmluZGluZworCQkJCX0KKwkJCX0KKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmd1bWVudHNbXTsKKwkJCWlmICgoc3ludGhldGljQXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkpICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCVR5cGVCaW5kaW5nIGFyZ1R5cGU7CisJCQkJCWlmICgoKGFyZ1R5cGUgPSBzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZSkgPT0gTG9uZ0JpbmRpbmcpIHx8IChhcmdUeXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCQltYXhMb2NhbHMgKz0gMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1heExvY2FscysrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRzOworCQlpZiAoKGFyZ3VtZW50cyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycykgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCVR5cGVCaW5kaW5nIGFyZ1R5cGU7CisJCQkJaWYgKCgoYXJnVHlwZSA9IGFyZ3VtZW50c1tpXSkgPT0gTG9uZ0JpbmRpbmcpIHx8IChhcmdUeXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCW1heExvY2FscyArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCW1heExvY2FscysrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKy8qKgorICogVGhpcyBtZXRob2RzIHNlYXJjaGVzIGZvciBhbiBleGlzdGluZyBlbnRyeSBpbnNpZGUgdGhlIHBjVG9Tb3VyY2VNYXAgdGFibGUgd2l0aCBhIHBjIGVxdWFscyB0byBAcGMuCisgKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBlbnRyeSBpdCByZXR1cm5zIC0xIChubyBpbnNlcnRpb24gcmVxdWlyZWQpLgorICogT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGluZGV4IHdoZXJlIHRoZSBlbnRyeSBmb3IgdGhlIHBjIGhhcyB0byBiZSBpbnNlcnRlZC4KKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcGNUb1NvdXJjZU1hcCB0YWJsZSBpcyBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBwYy4KKyAqCisgKiBAcGFyYW0gaW50IHBjCisgKiBAcmV0dXJuIGludAorICovCitwdWJsaWMgc3RhdGljIGludCBpbnNlcnRpb25JbmRleChpbnRbXSBwY1RvU291cmNlTWFwLCBpbnQgbGVuZ3RoLCBpbnQgcGMpIHsKKwlpbnQgZyA9IDA7CisJaW50IGQgPSBsZW5ndGggLSAyOworCWludCBtID0gMDsKKwl3aGlsZSAoZyA8PSBkKSB7CisJCW0gPSAoZyArIGQpIC8gMjsKKwkJLy8gd2Ugc2VhcmNoIG9ubHkgb24gZXZlbiBpbmRleGVzCisJCWlmICgobSAlIDIpICE9IDApCisJCQltLS07CisJCWludCBjdXJyZW50UEMgPSBwY1RvU291cmNlTWFwW21dOworCQlpZiAocGMgPCBjdXJyZW50UEMpIHsKKwkJCWQgPSBtIC0gMjsKKwkJfSBlbHNlCisJCQlpZiAocGMgPiBjdXJyZW50UEMpIHsKKwkJCQlnID0gbSArIDI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwl9CisJaWYgKHBjIDwgcGNUb1NvdXJjZU1hcFttXSkKKwkJcmV0dXJuIG07CisJcmV0dXJuIG0gKyAyOworfQorLyoqCisgKiBXZSBkaWRuJ3QgY2FsbCBpdCBpbnN0YW5jZW9mIGJlY2F1c2UgdGhlcmUgaXMgYSBjb25mbGl0IHdpdGggdGhlCisgKiBpbnN0YW5jZW9mIGtleXdvcmQKKyAqLworZmluYWwgcHVibGljIHZvaWQgaW5zdGFuY2Vfb2YoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2luc3RhbmNlb2Y7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW5zdGFuY2VvZik7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHR5cGVCaW5kaW5nKSk7Cit9CitwdWJsaWMgdm9pZCBpbnZva2VDbGFzc0Zvck5hbWUoKSB7CisJLy8gaW52b2tlc3RhdGljOiBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShMamF2YS5sYW5nLlN0cmluZzspTGphdmEubGFuZy5DbGFzczsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXN0YXRpYzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzdGF0aWMpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3NGb3JOYW1lKCkpOworfQorCitwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0NsYXNzRGVzaXJlZEFzc2VydGlvblN0YXR1cygpIHsKKwkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuQ2xhc3MuZGVzaXJlZEFzc2VydGlvblN0YXR1cygpWjsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3NEZXNpcmVkQXNzZXJ0aW9uU3RhdHVzKCkpOworfQorCitwdWJsaWMgdm9pZCBpbnZva2VDb25zdHJ1Y3RvckdldENvbnN0cnVjdG9yKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5DbGFzcy5nZXRDb25zdHJ1Y3RvcihqYXZhLmxhbmcuQ2xhc3NbXSlMamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2V2aXJ0dWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzR2V0Q29uc3RydWN0b3IoKSk7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpbnZva2VpbnRlcmZhY2UoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJLy8gaW5pdGlhbGl6ZWQgdG8gMSB0byB0YWtlIGludG8gYWNjb3VudCB0aGlzICBpbW1lZGlhdGVseQorCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgYXJnQ291bnQgPSAxOworCWludCBpZDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlaW50ZXJmYWNlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZWludGVyZmFjZSk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KG1ldGhvZEJpbmRpbmcpKTsKKwlmb3IgKGludCBpID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAoKChpZCA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1tpXS5pZCkgPT0gVF9kb3VibGUpIHx8IChpZCA9PSBUX2xvbmcpKQorCQkJYXJnQ291bnQgKz0gMjsKKwkJZWxzZQorCQkJYXJnQ291bnQgKz0gMTsKKwl3cml0ZVVuc2lnbmVkQnl0ZShhcmdDb3VudCk7CisJLy8gR2VuZXJhdGUgYSAgMCBpbnRvIHRoZSBieXRlIGFycmF5LiBMaWtlIHRoZSBhcnJheSBpcyBhbHJlYWR5IGZpbGwgd2l0aCAwLCB3ZSBqdXN0IG5lZWQgdG8gaW5jcmVtZW50CisJLy8gdGhlIG51bWJlciBvZiBieXRlcy4KKwlwb3NpdGlvbisrOworCWNsYXNzRmlsZU9mZnNldCsrOworCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCXN0YWNrRGVwdGggKz0gKDIgLSBhcmdDb3VudCk7CisJZWxzZQorCQlpZiAoaWQgPT0gVF92b2lkKQorCQkJc3RhY2tEZXB0aCAtPSBhcmdDb3VudDsKKwkJZWxzZQorCQkJc3RhY2tEZXB0aCArPSAoMSAtIGFyZ0NvdW50KTsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Cit9CitwdWJsaWMgdm9pZCBpbnZva2VKYXZhTGFuZ0Vycm9yQ29uc3RydWN0b3IoKSB7CisJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkVycm9yPGluaXQ+KExqYXZhLmxhbmcuU3RyaW5nOylWCisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2VzcGVjaWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXNwZWNpYWwpOworCX0KKwlzdGFja0RlcHRoIC09IDI7CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Vycm9yQ29uc3RydWN0b3IoKSk7Cit9CitwdWJsaWMgdm9pZCBpbnZva2VOb0NsYXNzRGVmRm91bmRFcnJvclN0cmluZ0NvbnN0cnVjdG9yKCkgeworCS8vIGludm9rZXNwZWNpYWw6IGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvci48aW5pdD4oTGphdmEubGFuZy5TdHJpbmc7KVYKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXNwZWNpYWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tlc3BlY2lhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdOb0NsYXNzRGVmRm91bmRFcnJvclN0cmluZ0NvbnN0cnVjdG9yKCkpOworCXN0YWNrRGVwdGggLT0gMjsKK30KK3B1YmxpYyB2b2lkIGludm9rZU9iamVjdE5ld0luc3RhbmNlKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGphdmEubGFuZy5PYmplY3RbXSlMamF2YS5sYW5nLk9iamVjdDsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yTmV3SW5zdGFuY2UoKSk7Cit9CisKK3B1YmxpYyB2b2lkIGludm9rZU9iamVjdEdldENsYXNzKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKUxqYXZhLmxhbmcuQ2xhc3M7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nT2JqZWN0R2V0Q2xhc3MoKSk7Cit9CisKK2ZpbmFsIHB1YmxpYyB2b2lkIGludm9rZXNwZWNpYWwoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJLy8gaW5pdGlhbGl6ZWQgdG8gMSB0byB0YWtlIGludG8gYWNjb3VudCB0aGlzICBpbW1lZGlhdGVseQorCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgYXJnQ291bnQgPSAxOworCWludCBpZDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3BlY2lhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZykpOworCWlmIChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKSAmJiBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CisJCS8vIGVuY2xvc2luZyBpbnN0YW5jZXMKKwkJVHlwZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCk7CisJCWlmIChzeW50aGV0aWNBcmd1bWVudFR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKCgoaWQgPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzW2ldLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpIHsKKwkJCQkJYXJnQ291bnQgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQlhcmdDb3VudCsrOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBvdXRlciBsb2NhbCB2YXJpYWJsZXMKKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CisJCWlmIChzeW50aGV0aWNBcmd1bWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmICgoKGlkID0gc3ludGhldGljQXJndW1lbnRzW2ldLnR5cGUuaWQpID09IFRfZG91YmxlKSB8fCAoaWQgPT0gVF9sb25nKSkgeworCQkJCQlhcmdDb3VudCArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCWFyZ0NvdW50Kys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWZvciAoaW50IGkgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCQlhcmdDb3VudCArPSAyOworCQllbHNlCisJCQlhcmdDb3VudCsrOworCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCXN0YWNrRGVwdGggKz0gKDIgLSBhcmdDb3VudCk7CisJZWxzZQorCQlpZiAoaWQgPT0gVF92b2lkKQorCQkJc3RhY2tEZXB0aCAtPSBhcmdDb3VudDsKKwkJZWxzZQorCQkJc3RhY2tEZXB0aCArPSAoMSAtIGFyZ0NvdW50KTsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpbnZva2VzdGF0aWMoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJLy8gaW5pdGlhbGl6ZWQgdG8gMCB0byB0YWtlIGludG8gYWNjb3VudCB0aGF0IHRoZXJlIGlzIG5vIHRoaXMgZm9yCisJLy8gYSBzdGF0aWMgbWV0aG9kCisJY291bnRMYWJlbHMgPSAwOworCWludCBhcmdDb3VudCA9IDA7CisJaW50IGlkOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2VzdGF0aWM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tlc3RhdGljKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZykpOworCWZvciAoaW50IGkgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCQlhcmdDb3VudCArPSAyOworCQllbHNlCisJCQlhcmdDb3VudCArPSAxOworCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCXN0YWNrRGVwdGggKz0gKDIgLSBhcmdDb3VudCk7CisJZWxzZQorCQlpZiAoaWQgPT0gVF92b2lkKQorCQkJc3RhY2tEZXB0aCAtPSBhcmdDb3VudDsKKwkJZWxzZQorCQkJc3RhY2tEZXB0aCArPSAoMSAtIGFyZ0NvdW50KTsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Cit9CisvKioKKyAqIFRoZSBlcXVpdmFsZW50IGNvZGUgcGVyZm9ybXMgYSBzdHJpbmcgY29udmVyc2lvbiBvZiB0aGUgVE9TCisgKiBAcGFyYW0gdHlwZUlEIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIHZvaWQgaW52b2tlU3RyaW5nQnVmZmVyQXBwZW5kRm9yVHlwZShpbnQgdHlwZUlEKSB7CisJY291bnRMYWJlbHMgPSAwOworCWludCB1c2VkVHlwZUlEOworCWlmICh0eXBlSUQgPT0gVF9udWxsKQorCQl1c2VkVHlwZUlEID0gVF9TdHJpbmc7CisJZWxzZQorCQl1c2VkVHlwZUlEID0gdHlwZUlEOworCS8vIGludm9rZXZpcnR1YWwKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2V2aXJ0dWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckFwcGVuZCh0eXBlSUQpKTsKKwlpZiAoKHVzZWRUeXBlSUQgPT0gVF9sb25nKSB8fCAodXNlZFR5cGVJRCA9PSBUX2RvdWJsZSkpCisJCXN0YWNrRGVwdGggLT0gMjsKKwllbHNlCisJCXN0YWNrRGVwdGgtLTsKK30KKworcHVibGljIHZvaWQgaW52b2tlSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0cnVjdG9yKGludCB0eXBlQmluZGluZ0lEKSB7CisJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yLjxpbml0Pih0eXBlQmluZGluZ0lEKVYKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXNwZWNpYWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tlc3BlY2lhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0cnVjdG9yKHR5cGVCaW5kaW5nSUQpKTsKKwlzdGFja0RlcHRoIC09IDI7Cit9CisKK3B1YmxpYyB2b2lkIGludm9rZUphdmFMYW5nQXNzZXJ0aW9uRXJyb3JEZWZhdWx0Q29uc3RydWN0b3IoKSB7CisJLy8gaW52b2tlc3BlY2lhbDogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yLjxpbml0PigpVgorCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3BlY2lhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yRGVmYXVsdENvbnN0cnVjdG9yKCkpOworCXN0YWNrRGVwdGggLS07Cit9CisKK3B1YmxpYyB2b2lkIGludm9rZVN0cmluZ0J1ZmZlckRlZmF1bHRDb25zdHJ1Y3RvcigpIHsKKwkvLyBpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLjxpbml0PigpVgorCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3BlY2lhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckRlZmF1bHRDb25zdHJ1Y3RvcigpKTsKKwlzdGFja0RlcHRoLS07Cit9CitwdWJsaWMgdm9pZCBpbnZva2VTdHJpbmdCdWZmZXJTdHJpbmdDb25zdHJ1Y3RvcigpIHsKKwkvLyBpbnZva2VzcGVjaWFsOiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyLjxpbml0PihMamF2YS5sYW5nLlN0cmluZzspVgorCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3BlY2lhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzcGVjaWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0cnVjdG9yKCkpOworCXN0YWNrRGVwdGggLT0gMjsKK30KKworcHVibGljIHZvaWQgaW52b2tlU3RyaW5nQnVmZmVyVG9TdHJpbmcoKSB7CisJLy8gaW52b2tldmlydHVhbDogU3RyaW5nQnVmZmVyLnRvU3RyaW5nKClMamF2YS5sYW5nLlN0cmluZzsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXZpcnR1YWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tldmlydHVhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXJUb1N0cmluZygpKTsKK30KK3B1YmxpYyB2b2lkIGludm9rZVN0cmluZ0ludGVybigpIHsKKwkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuU3RyaW5nLmludGVybigpCisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nSW50ZXJuKCkpOworfQorcHVibGljIHZvaWQgaW52b2tlU3RyaW5nVmFsdWVPZihpbnQgdHlwZUlEKSB7CisJLy8gaW52b2tlc3RhdGljOiBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoYXJndW1lbnRUeXBlKQorCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3RhdGljOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXN0YXRpYyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdWYWx1ZU9mKHR5cGVJRCkpOworfQorcHVibGljIHZvaWQgaW52b2tlU3lzdGVtRXhpdCgpIHsKKwkvLyBpbnZva2VzdGF0aWM6IGphdmEubGFuZy5TeXN0ZW0uZXhpdChJKQorCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tlc3RhdGljOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXN0YXRpYyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTeXN0ZW1FeGl0SW50KCkpOworCXN0YWNrRGVwdGgtLTsgLy8gaW50IGFyZ3VtZW50Cit9CitwdWJsaWMgdm9pZCBpbnZva2VUaHJvd2FibGVHZXRNZXNzYWdlKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpTGphdmEubGFuZy5TdHJpbmc7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nVGhyb3dhYmxlR2V0TWVzc2FnZSgpKTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGludm9rZXZpcnR1YWwoTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJLy8gaW5pdGlhbGl6ZWQgdG8gMSB0byB0YWtlIGludG8gYWNjb3VudCB0aGlzICBpbW1lZGlhdGVseQorCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgYXJnQ291bnQgPSAxOworCWludCBpZDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2V2aXJ0dWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgobWV0aG9kQmluZGluZykpOworCWZvciAoaW50IGkgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzW2ldLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCQlhcmdDb3VudCArPSAyOworCQllbHNlCisJCQlhcmdDb3VudCsrOworCWlmICgoKGlkID0gbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCXN0YWNrRGVwdGggKz0gKDIgLSBhcmdDb3VudCk7CisJZWxzZQorCQlpZiAoaWQgPT0gVF92b2lkKQorCQkJc3RhY2tEZXB0aCAtPSBhcmdDb3VudDsKKwkJZWxzZQorCQkJc3RhY2tEZXB0aCArPSAoMSAtIGFyZ0NvdW50KTsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpb3IoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW9yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lvcik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaXJlbSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pcmVtOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lyZW0pOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlyZXR1cm4oKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMCAKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXJldHVybjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pcmV0dXJuKTsKKwl9Cit9CitwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChTY29wZSBzY29wZSwgaW50IGluaXRTdGF0ZUluZGV4LCBMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCS8vIERlcGVuZGFudCBvZiBVbmNvbmRpdGlvbmFsRmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCisJaWYgKGluaXRTdGF0ZUluZGV4ID09IC0xKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGxvY2FsLmlzQXJndW1lbnQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCWludCBwb3NpdGlvbiA9IGxvY2FsLmlkICsgbWF4RmllbGRDb3VudDsKKwlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJLy8gaWQgaXMgemVyby1iYXNlZAorCWlmIChwb3NpdGlvbiA8IFVuY29uZGl0aW9uYWxGbG93SW5mby5CaXRDYWNoZVNpemUpIHsKKwkJcmV0dXJuIChtZXRob2RTY29wZS5kZWZpbml0ZUluaXRzW2luaXRTdGF0ZUluZGV4XSAmICgxTCA8PCBwb3NpdGlvbikpICE9IDA7IC8vIHVzZSBiaXRzCisJfQorCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwlsb25nW10gZXh0cmFJbml0cyA9IG1ldGhvZFNjb3BlLmV4dHJhRGVmaW5pdGVJbml0c1tpbml0U3RhdGVJbmRleF07CisJaWYgKGV4dHJhSW5pdHMgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCisJaW50IHZlY3RvckluZGV4OworCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBVbmNvbmRpdGlvbmFsRmxvd0luZm8uQml0Q2FjaGVTaXplKSAtIDEpID49IGV4dHJhSW5pdHMubGVuZ3RoKQorCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkIAorCXJldHVybiAoKGV4dHJhSW5pdHNbdmVjdG9ySW5kZXhdKSAmICgxTCA8PCAocG9zaXRpb24gJSBVbmNvbmRpdGlvbmFsRmxvd0luZm8uQml0Q2FjaGVTaXplKSkpICE9IDA7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpc2hsKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lzaGw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaXNobCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaXNocigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pc2hyOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lzaHIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlzdG9yZShpbnQgaUFyZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKG1heExvY2FscyA8PSBpQXJnKSB7CisJCW1heExvY2FscyA9IGlBcmcgKyAxOworCX0KKwlpZiAoaUFyZyA+IDI1NSkgeyAvLyBXaWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfaXN0b3JlKTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaUFyZyk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXN0b3JlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfaXN0b3JlKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpQXJnOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgaUFyZyk7CisJCX0KKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpc3RvcmVfMCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPT0gMCkgeworCQltYXhMb2NhbHMgPSAxOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXN0b3JlXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaXN0b3JlXzApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlzdG9yZV8xKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJaWYgKG1heExvY2FscyA8PSAxKSB7CisJCW1heExvY2FscyA9IDI7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pc3RvcmVfMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pc3RvcmVfMSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaXN0b3JlXzIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpZiAobWF4TG9jYWxzIDw9IDIpIHsKKwkJbWF4TG9jYWxzID0gMzsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2lzdG9yZV8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2lzdG9yZV8yKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpc3RvcmVfMygpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWlmIChtYXhMb2NhbHMgPD0gMykgeworCQltYXhMb2NhbHMgPSA0OworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXN0b3JlXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaXN0b3JlXzMpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGlzdWIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaXN1YjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pc3ViKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBpdXNocigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pdXNocjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pdXNocik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgaXhvcigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19peG9yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2l4b3IpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGpzcihMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2pzcjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19qc3IpOworCX0KKwlsYmwuYnJhbmNoKCk7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBqc3JfdyhMYWJlbCBsYmwpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2pzcl93OworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2pzcl93KTsKKwl9CisJbGJsLmJyYW5jaFdpZGUoKTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGwyZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2wyZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sMmQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGwyZigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sMmY7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbDJmKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsMmkoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbDJpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2wyaSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbGFkZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sYWRkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xhZGQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxhbG9hZCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xhbG9hZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sYWxvYWQpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxhbmQoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGFuZDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sYW5kKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsYXN0b3JlKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDQ7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xhc3RvcmU7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGFzdG9yZSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbGNtcCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAzOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sY21wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xjbXApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxjb25zdF8wKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoICs9IDI7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sY29uc3RfMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sY29uc3RfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbGNvbnN0XzEoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xjb25zdF8xOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xjb25zdF8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsZGMoZmxvYXQgY29uc3RhbnQpIHsKKwljb3VudExhYmVscyA9IDA7CisJaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwlpZiAoaW5kZXggPiAyNTUpIHsKKwkJLy8gR2VuZXJhdGUgYSBsZGNfdworCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sZGNfdzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkY193KTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOworCX0gZWxzZSB7CisJCS8vIEdlbmVyYXRlIGEgbGRjCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkYzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkYyk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZEJ5dGUoaW5kZXgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxkYyhpbnQgY29uc3RhbnQpIHsKKwljb3VudExhYmVscyA9IDA7CisJaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwlpZiAoaW5kZXggPiAyNTUpIHsKKwkJLy8gR2VuZXJhdGUgYSBsZGNfdworCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sZGNfdzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkY193KTsKKwkJfQorCQl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOworCX0gZWxzZSB7CisJCS8vIEdlbmVyYXRlIGEgbGRjCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkYzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkYyk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZEJ5dGUoaW5kZXgpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxkYyhTdHJpbmcgY29uc3RhbnQpIHsKKwljb3VudExhYmVscyA9IDA7CisJaW50IGN1cnJlbnRDb25zdGFudFBvb2xJbmRleCA9IGNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXg7CisJaW50IGN1cnJlbnRDb25zdGFudFBvb2xPZmZzZXQgPSBjb25zdGFudFBvb2wuY3VycmVudE9mZnNldDsKKwlpbnQgY3VycmVudENvZGVTdHJlYW1Qb3NpdGlvbiA9IHBvc2l0aW9uOworCWludCBpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JMZGMoY29uc3RhbnQudG9DaGFyQXJyYXkoKSk7CisJaWYgKGluZGV4ID4gMCkgeworCQkvLyB0aGUgc3RyaW5nIGFscmVhZHkgZXhpc3RzIGluc2lkZSB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyB3ZSByZXVzZSB0aGUgc2FtZSBpbmRleAorCQlzdGFja0RlcHRoKys7CisJCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJCWlmIChpbmRleCA+IDI1NSkgeworCQkJLy8gR2VuZXJhdGUgYSBsZGNfdworCQkJdHJ5IHsKKwkJCQlwb3NpdGlvbisrOworCQkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sZGNfdzsKKwkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGRjX3cpOworCQkJfQorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCS8vIEdlbmVyYXRlIGEgbGRjCisJCQl0cnkgeworCQkJCXBvc2l0aW9uKys7CisJCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkYzsKKwkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGRjKTsKKwkJCX0KKwkJCXdyaXRlVW5zaWduZWRCeXRlKGluZGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIHRoZSBzdHJpbmcgaXMgdG9vIGJpZyB0byBiZSB1dGY4LWVuY29kZWQgaW4gb25lIHBhc3MuCisJCS8vIHdlIGhhdmUgdG8gc3BsaXQgaXQgaW50byBkaWZmZXJlbnQgcGllY2VzLgorCQkvLyBmaXJzdCB3ZSBjbGVhbiBhbGwgc2lkZS1lZmZlY3RzIGR1ZSB0byB0aGUgY29kZSBhYm92ZQorCQkvLyB0aGlzIGNhc2UgaXMgdmVyeSByYXJlLCBzbyB3ZSBjYW4gYWZmb3JkIHRvIGxvc2UgdGltZSB0byBoYW5kbGUgaXQKKwkJY2hhcltdIGNvbnN0YW50Q2hhcnMgPSBjb25zdGFudC50b0NoYXJBcnJheSgpOworCQlwb3NpdGlvbiA9IGN1cnJlbnRDb2RlU3RyZWFtUG9zaXRpb247CisJCWNvbnN0YW50UG9vbC5jdXJyZW50SW5kZXggPSBjdXJyZW50Q29uc3RhbnRQb29sSW5kZXg7CisJCWNvbnN0YW50UG9vbC5jdXJyZW50T2Zmc2V0ID0gY3VycmVudENvbnN0YW50UG9vbE9mZnNldDsKKwkJY29uc3RhbnRQb29sLnN0cmluZ0NhY2hlLnJlbW92ZShjb25zdGFudENoYXJzKTsKKwkJY29uc3RhbnRQb29sLlVURjhDYWNoZS5yZW1vdmUoY29uc3RhbnRDaGFycyk7CisJCWludCBpID0gMDsKKwkJaW50IGxlbmd0aCA9IDA7CisJCWludCBjb25zdGFudExlbmd0aCA9IGNvbnN0YW50Lmxlbmd0aCgpOworCQlieXRlW10gdXRmOGVuY29kaW5nID0gbmV3IGJ5dGVbTWF0aC5taW4oY29uc3RhbnRMZW5ndGggKyAxMDAsIDY1NTM1KV07CisJCWludCB1dGY4ZW5jb2RpbmdMZW5ndGggPSAwOworCQl3aGlsZSAoKGxlbmd0aCA8IDY1NTMyKSAmJiAoaSA8IGNvbnN0YW50TGVuZ3RoKSkgeworCQkJY2hhciBjdXJyZW50ID0gY29uc3RhbnRDaGFyc1tpXTsKKwkJCS8vIHdlIHJlc2l6ZSB0aGUgYnl0ZSBhcnJheSBpbW1lZGlhdGVseSBpZiBuZWNlc3NhcnkKKwkJCWlmIChsZW5ndGggKyAzID4gKHV0ZjhlbmNvZGluZ0xlbmd0aCA9IHV0ZjhlbmNvZGluZy5sZW5ndGgpKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh1dGY4ZW5jb2RpbmcsIDAsICh1dGY4ZW5jb2RpbmcgPSBuZXcgYnl0ZVtNYXRoLm1pbih1dGY4ZW5jb2RpbmdMZW5ndGggKyAxMDAsIDY1NTM1KV0pLCAwLCBsZW5ndGgpOworCQkJfQorCQkJaWYgKChjdXJyZW50ID49IDB4MDAwMSkgJiYgKGN1cnJlbnQgPD0gMHgwMDdGKSkgeworCQkJCS8vIHdlIG9ubHkgbmVlZCBvbmUgYnl0ZTogQVNDSUkgdGFibGUKKwkJCQl1dGY4ZW5jb2RpbmdbbGVuZ3RoKytdID0gKGJ5dGUpIGN1cnJlbnQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdXJyZW50ID4gMHgwN0ZGKSB7CisJCQkJCS8vIHdlIG5lZWQgMyBieXRlcworCQkJCQl1dGY4ZW5jb2RpbmdbbGVuZ3RoKytdID0gKGJ5dGUpICgweEUwIHwgKChjdXJyZW50ID4+IDEyKSAmIDB4MEYpKTsgLy8gMHhFMCA9IDExMTAgMDAwMAorCQkJCQl1dGY4ZW5jb2RpbmdbbGVuZ3RoKytdID0gKGJ5dGUpICgweDgwIHwgKChjdXJyZW50ID4+IDYpICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCXV0ZjhlbmNvZGluZ1tsZW5ndGgrK10gPSAoYnl0ZSkgKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCX0gZWxzZSB7CisJCQkJCS8vIHdlIGNhbiBiZSAwIG9yIGJldHdlZW4gMHgwMDgwIGFuZCAweDA3RkYKKwkJCQkJLy8gSW4gdGhhdCBjYXNlIHdlIG9ubHkgbmVlZCAyIGJ5dGVzCisJCQkJCXV0ZjhlbmNvZGluZ1tsZW5ndGgrK10gPSAoYnl0ZSkgKDB4QzAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDFGKSk7IC8vIDB4QzAgPSAxMTAwIDAwMDAKKwkJCQkJdXRmOGVuY29kaW5nW2xlbmd0aCsrXSA9IChieXRlKSAoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJfQorCQkJfQorCQkJaSsrOworCQl9CisJCS8vIGNoZWNrIGlmIGFsbCB0aGUgc3RyaW5nIGlzIGVuY29kZWQgKFBSIDFQUjJEV0opCisJCS8vIHRoZSBzdHJpbmcgaXMgdG9vIGJpZyB0byBiZSBlbmNvZGVkIGluIG9uZSBwYXNzCisJCW5ld1N0cmluZ0J1ZmZlcigpOworCQlkdXAoKTsKKwkJLy8gd3JpdGUgdGhlIGZpcnN0IHBhcnQKKwkJY2hhcltdIHN1YkNoYXJzID0gbmV3IGNoYXJbaV07CisJCVN5c3RlbS5hcnJheWNvcHkoY29uc3RhbnRDaGFycywgMCwgc3ViQ2hhcnMsIDAsIGkpOworCQlTeXN0ZW0uYXJyYXljb3B5KHV0ZjhlbmNvZGluZywgMCwgKHV0ZjhlbmNvZGluZyA9IG5ldyBieXRlW2xlbmd0aF0pLCAwLCBsZW5ndGgpOworCQlpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3ViQ2hhcnMsIHV0ZjhlbmNvZGluZyk7CisJCXN0YWNrRGVwdGgrKzsKKwkJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwkJaWYgKGluZGV4ID4gMjU1KSB7CisJCQkvLyBHZW5lcmF0ZSBhIGxkY193CisJCQl0cnkgeworCQkJCXBvc2l0aW9uKys7CisJCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkY193OworCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19sZGNfdyk7CisJCQl9CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoaW5kZXgpOworCQl9IGVsc2UgeworCQkJLy8gR2VuZXJhdGUgYSBsZGMKKwkJCXRyeSB7CisJCQkJcG9zaXRpb24rKzsKKwkJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGRjOworCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19sZGMpOworCQkJfQorCQkJd3JpdGVVbnNpZ25lZEJ5dGUoaW5kZXgpOworCQl9CisJCS8vIHdyaXRlIHRoZSByZW1haW5pbmcgcGFydAorCQlpbnZva2VTdHJpbmdCdWZmZXJTdHJpbmdDb25zdHJ1Y3RvcigpOworCQl3aGlsZSAoaSA8IGNvbnN0YW50TGVuZ3RoKSB7CisJCQlsZW5ndGggPSAwOworCQkJdXRmOGVuY29kaW5nID0gbmV3IGJ5dGVbTWF0aC5taW4oY29uc3RhbnRMZW5ndGggLSBpICsgMTAwLCA2NTUzNSldOworCQkJaW50IHN0YXJ0SW5kZXggPSBpOworCQkJd2hpbGUgKChsZW5ndGggPCA2NTUzMikgJiYgKGkgPCBjb25zdGFudExlbmd0aCkpIHsKKwkJCQljaGFyIGN1cnJlbnQgPSBjb25zdGFudENoYXJzW2ldOworCQkJCS8vIHdlIHJlc2l6ZSB0aGUgYnl0ZSBhcnJheSBpbW1lZGlhdGVseSBpZiBuZWNlc3NhcnkKKwkJCQlpZiAoY29uc3RhbnRMZW5ndGggKyAyID4gKHV0ZjhlbmNvZGluZ0xlbmd0aCA9IHV0ZjhlbmNvZGluZy5sZW5ndGgpKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodXRmOGVuY29kaW5nLCAwLCAodXRmOGVuY29kaW5nID0gbmV3IGJ5dGVbTWF0aC5taW4odXRmOGVuY29kaW5nTGVuZ3RoICsgMTAwLCA2NTUzNSldKSwgMCwgbGVuZ3RoKTsKKwkJCQl9CisJCQkJaWYgKChjdXJyZW50ID49IDB4MDAwMSkgJiYgKGN1cnJlbnQgPD0gMHgwMDdGKSkgeworCQkJCQkvLyB3ZSBvbmx5IG5lZWQgb25lIGJ5dGU6IEFTQ0lJIHRhYmxlCisJCQkJCXV0ZjhlbmNvZGluZ1tsZW5ndGgrK10gPSAoYnl0ZSkgY3VycmVudDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY3VycmVudCA+IDB4MDdGRikgeworCQkJCQkJLy8gd2UgbmVlZCAzIGJ5dGVzCisJCQkJCQl1dGY4ZW5jb2RpbmdbbGVuZ3RoKytdID0gKGJ5dGUpICgweEUwIHwgKChjdXJyZW50ID4+IDEyKSAmIDB4MEYpKTsgLy8gMHhFMCA9IDExMTAgMDAwMAorCQkJCQkJdXRmOGVuY29kaW5nW2xlbmd0aCsrXSA9IChieXRlKSAoMHg4MCB8ICgoY3VycmVudCA+PiA2KSAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCQkJdXRmOGVuY29kaW5nW2xlbmd0aCsrXSA9IChieXRlKSAoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB3ZSBjYW4gYmUgMCBvciBiZXR3ZWVuIDB4MDA4MCBhbmQgMHgwN0ZGCisJCQkJCQkvLyBJbiB0aGF0IGNhc2Ugd2Ugb25seSBuZWVkIDIgYnl0ZXMKKwkJCQkJCXV0ZjhlbmNvZGluZ1tsZW5ndGgrK10gPSAoYnl0ZSkgKDB4QzAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDFGKSk7IC8vIDB4QzAgPSAxMTAwIDAwMDAKKwkJCQkJCXV0ZjhlbmNvZGluZ1tsZW5ndGgrK10gPSAoYnl0ZSkgKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCQl9CisJCQkJfQorCQkJCWkrKzsKKwkJCX0KKwkJCS8vIHRoZSBuZXh0IHBhcnQgaXMgZG9uZQorCQkJc3ViQ2hhcnMgPSBuZXcgY2hhcltpIC0gc3RhcnRJbmRleF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnN0YW50Q2hhcnMsIHN0YXJ0SW5kZXgsIHN1YkNoYXJzLCAwLCBpIC0gc3RhcnRJbmRleCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHV0ZjhlbmNvZGluZywgMCwgKHV0ZjhlbmNvZGluZyA9IG5ldyBieXRlW2xlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJaW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KHN1YkNoYXJzLCB1dGY4ZW5jb2RpbmcpOworCQkJc3RhY2tEZXB0aCsrOworCQkJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJCQlpZiAoaW5kZXggPiAyNTUpIHsKKwkJCQkvLyBHZW5lcmF0ZSBhIGxkY193CisJCQkJdHJ5IHsKKwkJCQkJcG9zaXRpb24rKzsKKwkJCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkY193OworCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkY193KTsKKwkJCQl9CisJCQkJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gR2VuZXJhdGUgYSBsZGMKKwkJCQl0cnkgeworCQkJCQlwb3NpdGlvbisrOworCQkJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGRjOworCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkYyk7CisJCQkJfQorCQkJCXdyaXRlVW5zaWduZWRCeXRlKGluZGV4KTsKKwkJCX0KKwkJCS8vIG5vdyBvbiB0aGUgc3RhY2sgaXQgc2hvdWxkIGJlIGEgU3RyaW5nQnVmZmVyIGFuZCBhIHN0cmluZy4KKwkJCWludm9rZVN0cmluZ0J1ZmZlckFwcGVuZEZvclR5cGUoVF9TdHJpbmcpOworCQl9CisJCWludm9rZVN0cmluZ0J1ZmZlclRvU3RyaW5nKCk7CisJCWludm9rZVN0cmluZ0ludGVybigpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxkYzJfdyhkb3VibGUgY29uc3RhbnQpIHsKKwljb3VudExhYmVscyA9IDA7CisJaW50IGluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChjb25zdGFudCk7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwkvLyBHZW5lcmF0ZSBhIGxkYzJfdworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sZGMyX3c7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGRjMl93KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGluZGV4KTsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxkYzJfdyhsb25nIGNvbnN0YW50KSB7CisJY291bnRMYWJlbHMgPSAwOworCWludCBpbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoY29uc3RhbnQpOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJLy8gR2VuZXJhdGUgYSBsZGMyX3cKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGRjMl93OworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xkYzJfdyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChpbmRleCk7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsZGl2KCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xkaXY7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGRpdik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbGxvYWQoaW50IGlBcmcpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChtYXhMb2NhbHMgPD0gaUFyZyArIDEpIHsKKwkJbWF4TG9jYWxzID0gaUFyZyArIDI7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwlpZiAoaUFyZyA+IDI1NSkgeyAvLyBXaWRlbgorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ193aWRlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfd2lkZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGxvYWQ7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19sbG9hZCk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xsb2FkOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGxvYWQpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIGlBcmc7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KChieXRlKSBpQXJnKTsKKwkJfQorCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxsb2FkXzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAobWF4TG9jYWxzIDwgMikgeworCQltYXhMb2NhbHMgPSAyOworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xsb2FkXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGxvYWRfMCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbGxvYWRfMSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCArPSAyOworCWlmIChtYXhMb2NhbHMgPCAzKSB7CisJCW1heExvY2FscyA9IDM7CisJfQorCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbGxvYWRfMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sbG9hZF8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsbG9hZF8yKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoICs9IDI7CisJaWYgKG1heExvY2FscyA8IDQpIHsKKwkJbWF4TG9jYWxzID0gNDsKKwl9CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sbG9hZF8yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xsb2FkXzIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxsb2FkXzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gMjsKKwlpZiAobWF4TG9jYWxzIDwgNSkgeworCQltYXhMb2NhbHMgPSA1OworCX0KKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xsb2FkXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbGxvYWRfMyk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbG11bCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sbXVsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xtdWwpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxuZWcoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sbmVnOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xuZWcpOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIGxvYWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nKSB7CisJY291bnRMYWJlbHMgPSAwOworCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbG9jYWxCaW5kaW5nLnR5cGU7CisJaW50IHJlc29sdmVkUG9zaXRpb24gPSBsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbjsKKwkvLyBVc2luZyBkZWRpY2F0ZWQgaW50IGJ5dGVjb2RlCisJaWYgKHR5cGVCaW5kaW5nID09IEludEJpbmRpbmcpIHsKKwkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuaWxvYWRfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmlsb2FkXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5pbG9hZF8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuaWxvYWRfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5pbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIFVzaW5nIGRlZGljYXRlZCBmbG9hdCBieXRlY29kZQorCWlmICh0eXBlQmluZGluZyA9PSBGbG9hdEJpbmRpbmcpIHsKKwkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuZmxvYWRfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmZsb2FkXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5mbG9hZF8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuZmxvYWRfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5mbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIFVzaW5nIGRlZGljYXRlZCBsb25nIGJ5dGVjb2RlCisJaWYgKHR5cGVCaW5kaW5nID09IExvbmdCaW5kaW5nKSB7CisJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmxsb2FkXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5sbG9hZF8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMubGxvYWRfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmxsb2FkXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMubGxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBVc2luZyBkZWRpY2F0ZWQgZG91YmxlIGJ5dGVjb2RlCisJaWYgKHR5cGVCaW5kaW5nID09IERvdWJsZUJpbmRpbmcpIHsKKwkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuZGxvYWRfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmRsb2FkXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5kbG9hZF8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuZGxvYWRfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5kbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIGJvb2xlYW4sIGJ5dGUsIGNoYXIgYW5kIHNob3J0IGFyZSBoYW5kbGVkIGFzIGludAorCWlmICgodHlwZUJpbmRpbmcgPT0gQnl0ZUJpbmRpbmcpIHx8ICh0eXBlQmluZGluZyA9PSBDaGFyQmluZGluZykgfHwgKHR5cGVCaW5kaW5nID09IEJvb2xlYW5CaW5kaW5nKSB8fCAodHlwZUJpbmRpbmcgPT0gU2hvcnRCaW5kaW5nKSkgeworCQlzd2l0Y2ggKHJlc29sdmVkUG9zaXRpb24pIHsKKwkJCWNhc2UgMCA6CisJCQkJdGhpcy5pbG9hZF8wKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEgOgorCQkJCXRoaXMuaWxvYWRfMSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyIDoKKwkJCQl0aGlzLmlsb2FkXzIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMyA6CisJCQkJdGhpcy5pbG9hZF8zKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aGlzLmlsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvLyBSZWZlcmVuY2Ugb2JqZWN0CisJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCWNhc2UgMCA6CisJCQl0aGlzLmFsb2FkXzAoKTsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJdGhpcy5hbG9hZF8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuYWxvYWRfMigpOworCQkJYnJlYWs7CisJCWNhc2UgMyA6CisJCQl0aGlzLmFsb2FkXzMoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXRoaXMuYWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJfQorfQorcHVibGljIGZpbmFsIHZvaWQgbG9hZChUeXBlQmluZGluZyB0eXBlQmluZGluZywgaW50IHJlc29sdmVkUG9zaXRpb24pIHsKKwljb3VudExhYmVscyA9IDA7CisJLy8gVXNpbmcgZGVkaWNhdGVkIGludCBieXRlY29kZQorCWlmICh0eXBlQmluZGluZyA9PSBJbnRCaW5kaW5nKSB7CisJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmlsb2FkXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5pbG9hZF8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMuaWxvYWRfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmlsb2FkXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuaWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBVc2luZyBkZWRpY2F0ZWQgZmxvYXQgYnl0ZWNvZGUKKwlpZiAodHlwZUJpbmRpbmcgPT0gRmxvYXRCaW5kaW5nKSB7CisJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmZsb2FkXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5mbG9hZF8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMuZmxvYWRfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmZsb2FkXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuZmxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBVc2luZyBkZWRpY2F0ZWQgbG9uZyBieXRlY29kZQorCWlmICh0eXBlQmluZGluZyA9PSBMb25nQmluZGluZykgeworCQlzd2l0Y2ggKHJlc29sdmVkUG9zaXRpb24pIHsKKwkJCWNhc2UgMCA6CisJCQkJdGhpcy5sbG9hZF8wKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEgOgorCQkJCXRoaXMubGxvYWRfMSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyIDoKKwkJCQl0aGlzLmxsb2FkXzIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMyA6CisJCQkJdGhpcy5sbG9hZF8zKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aGlzLmxsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCQl9CisJCXJldHVybjsKKwl9CisJLy8gVXNpbmcgZGVkaWNhdGVkIGRvdWJsZSBieXRlY29kZQorCWlmICh0eXBlQmluZGluZyA9PSBEb3VibGVCaW5kaW5nKSB7CisJCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmRsb2FkXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5kbG9hZF8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMuZGxvYWRfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmRsb2FkXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuZGxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBib29sZWFuLCBieXRlLCBjaGFyIGFuZCBzaG9ydCBhcmUgaGFuZGxlZCBhcyBpbnQKKwlpZiAoKHR5cGVCaW5kaW5nID09IEJ5dGVCaW5kaW5nKSB8fCAodHlwZUJpbmRpbmcgPT0gQ2hhckJpbmRpbmcpIHx8ICh0eXBlQmluZGluZyA9PSBCb29sZWFuQmluZGluZykgfHwgKHR5cGVCaW5kaW5nID09IFNob3J0QmluZGluZykpIHsKKwkJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuaWxvYWRfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmlsb2FkXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5pbG9hZF8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuaWxvYWRfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5pbG9hZChyZXNvbHZlZFBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLy8gUmVmZXJlbmNlIG9iamVjdAorCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQljYXNlIDAgOgorCQkJdGhpcy5hbG9hZF8wKCk7CisJCQlicmVhazsKKwkJY2FzZSAxIDoKKwkJCXRoaXMuYWxvYWRfMSgpOworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisJCQl0aGlzLmFsb2FkXzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5hbG9hZF8zKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQl0aGlzLmFsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIGxvYWRJbnQoaW50IHJlc29sdmVkUG9zaXRpb24pIHsKKwkvLyBVc2luZyBkZWRpY2F0ZWQgaW50IGJ5dGVjb2RlCisJc3dpdGNoIChyZXNvbHZlZFBvc2l0aW9uKSB7CisJCWNhc2UgMCA6CisJCQl0aGlzLmlsb2FkXzAoKTsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJdGhpcy5pbG9hZF8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuaWxvYWRfMigpOworCQkJYnJlYWs7CisJCWNhc2UgMyA6CisJCQl0aGlzLmlsb2FkXzMoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXRoaXMuaWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CisJfQorfQorcHVibGljIGZpbmFsIHZvaWQgbG9hZE9iamVjdChpbnQgcmVzb2x2ZWRQb3NpdGlvbikgeworCXN3aXRjaCAocmVzb2x2ZWRQb3NpdGlvbikgeworCQljYXNlIDAgOgorCQkJdGhpcy5hbG9hZF8wKCk7CisJCQlicmVhazsKKwkJY2FzZSAxIDoKKwkJCXRoaXMuYWxvYWRfMSgpOworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisJCQl0aGlzLmFsb2FkXzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5hbG9hZF8zKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQl0aGlzLmFsb2FkKHJlc29sdmVkUG9zaXRpb24pOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxvb2t1cHN3aXRjaChDYXNlTGFiZWwgZGVmYXVsdExhYmVsLCBpbnRbXSBrZXlzLCBpbnRbXSBzb3J0ZWRJbmRleGVzLCBDYXNlTGFiZWxbXSBjYXNlc0xhYmVsKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwlpbnQgbGVuZ3RoID0ga2V5cy5sZW5ndGg7CisJaW50IHBvcyA9IHBvc2l0aW9uOworCWRlZmF1bHRMYWJlbC5wbGFjZUluc3RydWN0aW9uKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljYXNlc0xhYmVsW2ldLnBsYWNlSW5zdHJ1Y3Rpb24oKTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xvb2t1cHN3aXRjaDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sb29rdXBzd2l0Y2gpOworCX0KKwlmb3IgKGludCBpID0gKDMgLSAocG9zICUgNCkpOyBpID4gMDsgaS0tKSB7CisJCXBvc2l0aW9uKys7IC8vIFBhZGRpbmcKKwkJY2xhc3NGaWxlT2Zmc2V0Kys7CisJfQorCWRlZmF1bHRMYWJlbC5icmFuY2goKTsKKwl3cml0ZVNpZ25lZFdvcmQobGVuZ3RoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXdyaXRlU2lnbmVkV29yZChrZXlzW3NvcnRlZEluZGV4ZXNbaV1dKTsKKwkJY2FzZXNMYWJlbFtzb3J0ZWRJbmRleGVzW2ldXS5icmFuY2goKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsb3IoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbG9yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xvcik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbHJlbSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19scmVtOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xyZW0pOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxyZXR1cm4oKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwkvLyB0aGUgc3RhY2tEZXB0aCBzaG91bGQgYmUgZXF1YWwgdG8gMCAKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbHJldHVybjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19scmV0dXJuKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsc2hsKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xzaGw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbHNobCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbHNocigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sc2hyOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xzaHIpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxzdG9yZShpbnQgaUFyZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJaWYgKG1heExvY2FscyA8PSBpQXJnICsgMSkgeworCQltYXhMb2NhbHMgPSBpQXJnICsgMjsKKwl9CisJaWYgKGlBcmcgPiAyNTUpIHsgLy8gV2lkZW4KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfd2lkZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX3dpZGUpOworCQl9CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xzdG9yZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xzdG9yZSk7CisJCX0KKwkJd3JpdGVVbnNpZ25lZFNob3J0KGlBcmcpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xzdG9yZTsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xzdG9yZSk7CisJCX0KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgaUFyZzsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGlBcmcpOworCQl9CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbHN0b3JlXzAoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAobWF4TG9jYWxzIDwgMikgeworCQltYXhMb2NhbHMgPSAyOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbHN0b3JlXzA7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbHN0b3JlXzApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxzdG9yZV8xKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoIC09IDI7CisJaWYgKG1heExvY2FscyA8IDMpIHsKKwkJbWF4TG9jYWxzID0gMzsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2xzdG9yZV8xOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xzdG9yZV8xKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsc3RvcmVfMigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCWlmIChtYXhMb2NhbHMgPCA0KSB7CisJCW1heExvY2FscyA9IDQ7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sc3RvcmVfMjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sc3RvcmVfMik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbHN0b3JlXzMoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAobWF4TG9jYWxzIDwgNSkgeworCQltYXhMb2NhbHMgPSA1OworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbHN0b3JlXzM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbHN0b3JlXzMpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIGxzdWIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbHN1YjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sc3ViKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBsdXNocigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19sdXNocjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19sdXNocik7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbHhvcigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAyOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19seG9yOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2x4b3IpOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIG1vbml0b3JlbnRlcigpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19tb25pdG9yZW50ZXI7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbW9uaXRvcmVudGVyKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBtb25pdG9yZXhpdCgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19tb25pdG9yZXhpdDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19tb25pdG9yZXhpdCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbXVsdGlhbmV3YXJyYXkoVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGludCBkaW1lbnNpb25zKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggKz0gKDEgLSBkaW1lbnNpb25zKTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbXVsdGlhbmV3YXJyYXk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbXVsdGlhbmV3YXJyYXkpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCh0eXBlQmluZGluZykpOworCXdyaXRlVW5zaWduZWRCeXRlKGRpbWVuc2lvbnMpOworfQorcHVibGljIHN0YXRpYyB2b2lkIG5lZWRJbXBsZW1lbnRhdGlvbigpIHsKK30KKy8qKgorICogV2UgZGlkbid0IGNhbGwgaXQgbmV3LCBiZWNhdXNlIHRoZXJlIGlzIGEgY29uZmxpdCB3aXRoIHRoZSBuZXcga2V5d29yZAorICovCitmaW5hbCBwdWJsaWMgdm9pZCBuZXdfKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX25ldzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19uZXcpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleCh0eXBlQmluZGluZykpOworfQorZmluYWwgcHVibGljIHZvaWQgbmV3YXJyYXkoaW50IGFycmF5X1R5cGUpIHsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX25ld2FycmF5OworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX25ld2FycmF5KTsKKwl9CisJd3JpdGVVbnNpZ25lZEJ5dGUoYXJyYXlfVHlwZSk7Cit9CitwdWJsaWMgdm9pZCBuZXdBcnJheShTY29wZSBzY29wZSwgQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZykgeworCVR5cGVCaW5kaW5nIGNvbXBvbmVudCA9IGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUoc2NvcGUpOworCXN3aXRjaCAoY29tcG9uZW50LmlkKSB7CisJCWNhc2UgVF9pbnQgOgorCQkJdGhpcy5uZXdhcnJheSgxMCk7CisJCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJdGhpcy5uZXdhcnJheSg4KTsKKwkJCWJyZWFrOworCQljYXNlIFRfYm9vbGVhbiA6CisJCQl0aGlzLm5ld2FycmF5KDQpOworCQkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQl0aGlzLm5ld2FycmF5KDkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9jaGFyIDoKKwkJCXRoaXMubmV3YXJyYXkoNSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJdGhpcy5uZXdhcnJheSgxMSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXRoaXMubmV3YXJyYXkoNik7CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQl0aGlzLm5ld2FycmF5KDcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJdGhpcy5hbmV3YXJyYXkoY29tcG9uZW50KTsKKwl9Cit9CitwdWJsaWMgdm9pZCBuZXdKYXZhTGFuZ0Vycm9yKCkgeworCS8vIG5ldzogamF2YS5sYW5nLkVycm9yCisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX25ldzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19uZXcpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nRXJyb3IoKSk7Cit9CisKK3B1YmxpYyB2b2lkIG5ld0phdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKSB7CisJLy8gbmV3OiBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCsrOworCWlmIChzdGFja0RlcHRoID4gc3RhY2tNYXgpCisJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbmV3OworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX25ldyk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpKTsKK30KKworcHVibGljIHZvaWQgbmV3Tm9DbGFzc0RlZkZvdW5kRXJyb3IoKSB7IC8vIG5ldzogamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yCisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX25ldzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19uZXcpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nTm9DbGFzc0RlZkZvdW5kRXJyb3IoKSk7Cit9CitwdWJsaWMgdm9pZCBuZXdTdHJpbmdCdWZmZXIoKSB7IC8vIG5ldzogamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19uZXc7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbmV3KTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlcigpKTsKK30KK3B1YmxpYyB2b2lkIG5ld1dyYXBwZXJGb3IoaW50IHR5cGVJRCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoKys7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19uZXc7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfbmV3KTsKKwl9CisJc3dpdGNoICh0eXBlSUQpIHsKKwkJY2FzZSBUX2ludCA6IC8vIG5ldzogamF2YS5sYW5nLkludGVnZXIKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdJbnRlZ2VyKCkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9ib29sZWFuIDogLy8gbmV3OiBqYXZhLmxhbmcuQm9vbGVhbgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Jvb2xlYW4oKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOiAvLyBuZXc6IGphdmEubGFuZy5CeXRlCisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQnl0ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6IC8vIG5ldzogamF2YS5sYW5nLkNoYXJhY3RlcgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NoYXJhY3RlcigpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOiAvLyBuZXc6IGphdmEubGFuZy5GbG9hdAorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Zsb2F0KCkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOiAvLyBuZXc6IGphdmEubGFuZy5Eb3VibGUKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdEb3VibGUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDogLy8gbmV3OiBqYXZhLmxhbmcuU2hvcnQKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTaG9ydCgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6IC8vIG5ldzogamF2YS5sYW5nLkxvbmcKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdMb25nKCkpOworCQkJYnJlYWs7CisJCWNhc2UgVF92b2lkIDogLy8gbmV3OiBqYXZhLmxhbmcuVm9pZAorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1ZvaWQoKSk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgbm9wKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfbm9wOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX25vcCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgcG9wKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlzdGFja0RlcHRoLS07CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX3BvcDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19wb3ApOworCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIHBvcDIoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGggLT0gMjsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfcG9wMjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19wb3AyKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBwdXRmaWVsZChGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7CisJY291bnRMYWJlbHMgPSAwOworCWludCBpZDsKKwlpZiAoKChpZCA9IGZpZWxkQmluZGluZy50eXBlLmlkKSA9PSBUX2RvdWJsZSkgfHwgKGlkID09IFRfbG9uZykpCisJCXN0YWNrRGVwdGggLT0gMzsKKwllbHNlCisJCXN0YWNrRGVwdGggLT0gMjsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX3B1dGZpZWxkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX3B1dGZpZWxkKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nKSk7Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBwdXRzdGF0aWMoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZykgeworCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgaWQ7CisJaWYgKCgoaWQgPSBmaWVsZEJpbmRpbmcudHlwZS5pZCkgPT0gVF9kb3VibGUpIHx8IChpZCA9PSBUX2xvbmcpKQorCQlzdGFja0RlcHRoIC09IDI7CisJZWxzZQorCQlzdGFja0RlcHRoIC09IDE7CisJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJc3RhY2tNYXggPSBzdGFja0RlcHRoOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19wdXRzdGF0aWM7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfcHV0c3RhdGljKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoZmllbGRCaW5kaW5nKSk7Cit9CitwdWJsaWMgdm9pZCByZWNvcmQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlpZiAoIWdlbmVyYXRlTG9jYWxWYXJpYWJsZVRhYmxlQXR0cmlidXRlcykKKwkJcmV0dXJuOworCWlmIChhbGxMb2NhbHNDb3VudGVyID09IGxvY2Fscy5sZW5ndGgpIHsKKwkJLy8gcmVzaXplIHRoZSBjb2xsZWN0aW9uCisJCVN5c3RlbS5hcnJheWNvcHkobG9jYWxzLCAwLCAobG9jYWxzID0gbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nW2FsbExvY2Fsc0NvdW50ZXIgKyBMT0NBTFNfSU5DUkVNRU5UXSksIDAsIGFsbExvY2Fsc0NvdW50ZXIpOworCX0KKwlsb2NhbHNbYWxsTG9jYWxzQ291bnRlcisrXSA9IGxvY2FsOworCWxvY2FsLmluaXRpYWxpemF0aW9uUENzID0gbmV3IGludFs0XTsKKwlsb2NhbC5pbml0aWFsaXphdGlvbkNvdW50ID0gMDsKK30KK3B1YmxpYyB2b2lkIHJlY29yZFBvc2l0aW9uc0Zyb20oaW50IHN0YXJ0UEMsIGludCBzb3VyY2VQb3MpIHsKKworCS8qIFJlY29yZCBwb3NpdGlvbnMgaW4gdGhlIHRhYmxlLCBvbmx5IGlmIG5vdGhpbmcgaGFzIAorCSAqIGFscmVhZHkgYmVlbiByZWNvcmRlZC4gU2luY2Ugd2Ugb3V0cHV0IHRoZW0gb24gdGhlIHdheSAKKwkgKiB1cCAoY2hpbGRyZW4gZmlyc3QgZm9yIG1vcmUgc3BlY2lmaWMgaW5mbykKKwkgKiBUaGUgcGNUb1NvdXJjZU1hcCB0YWJsZSBpcyBhbHdheXMgc29ydGVkLgorCSAqLworCisJaWYgKCFnZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKQorCQlyZXR1cm47CisJaWYgKHNvdXJjZVBvcyA9PSAwKQorCQlyZXR1cm47CisKKwkvLyBubyBjb2RlIGdlbmVyYXRlZCBmb3IgdGhpcyBub2RlLiBlLmcuIGZpZWxkIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uCisJaWYgKHBvc2l0aW9uID09IHN0YXJ0UEMpCisJCXJldHVybjsKKworCS8vIFdpZGVuaW5nIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgYWxyZWFkeSBoYXMgdGhlIHNhbWUgc291cmNlIHBvc2l0aW9ucworCWlmIChwY1RvU291cmNlTWFwU2l6ZSArIDQgPiBwY1RvU291cmNlTWFwLmxlbmd0aCkgeworCQkvLyByZXNpemUgdGhlIGFycmF5IHBjVG9Tb3VyY2VNYXAKKwkJU3lzdGVtLmFycmF5Y29weShwY1RvU291cmNlTWFwLCAwLCAocGNUb1NvdXJjZU1hcCA9IG5ldyBpbnRbcGNUb1NvdXJjZU1hcFNpemUgPDwgMV0pLCAwLCBwY1RvU291cmNlTWFwU2l6ZSk7CisJfQorCWludCBuZXdMaW5lID0gQ2xhc3NGaWxlLnNlYXJjaExpbmVOdW1iZXIobGluZVNlcGFyYXRvclBvc2l0aW9ucywgc291cmNlUG9zKTsKKwkvLyBsYXN0RW50cnlQQyByZXByZXNlbnRzIHRoZSBlbmRQQyBvZiB0aGUgbGFzdEVudHJ5LgorCWlmIChwY1RvU291cmNlTWFwU2l6ZSA+IDApIHsKKwkJLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGlzIGFscmVhZHkgYW4gZW50cnkgaW4gdGhlIHRhYmxlCisJCWlmIChwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplIC0gMV0gIT0gbmV3TGluZSkgeworCQkJaWYgKHN0YXJ0UEMgPCBsYXN0RW50cnlQQykgeworCQkJCS8vIHdlIGZvcmdvdCB0byBhZGQgYW4gZW50cnkuCisJCQkJLy8gc2VhcmNoIGlmIGFuIGV4aXN0aW5nIGVudHJ5IGV4aXN0cyBmb3Igc3RhcnRQQworCQkJCWludCBpbnNlcnRpb25JbmRleCA9IGluc2VydGlvbkluZGV4KHBjVG9Tb3VyY2VNYXAsIHBjVG9Tb3VyY2VNYXBTaXplLCBzdGFydFBDKTsKKwkJCQlpZiAoaW5zZXJ0aW9uSW5kZXggIT0gLTEpIHsKKwkJCQkJLy8gdGhlcmUgaXMgbm8gZXhpc3RpbmcgZW50cnkgc3RhcnRpbmcgd2l0aCBzdGFydFBDLgorCQkJCQlpbnQgZXhpc3RpbmdFbnRyeUluZGV4ID0gaW5kZXhPZlNhbWVMaW5lRW50cnlTaW5jZVBDKHN0YXJ0UEMsIG5ld0xpbmUpOyAvLyBpbmRleCBmb3IgUEMKKwkJCQkJLyogdGhlIGV4aXN0aW5nRW50cnlJbmRleCBjb3JyZXNwb25kcyB0byBlbiBlbnRyeSB3aXRoIHRoZSBzYW1lIGxpbmUgYW5kIGEgUEMgPj0gc3RhcnRQQy4KKwkJCQkJCWluIHRoaXMgY2FzZSBpdCBpcyByZWxldmFudCB0byB3aWRlbiB0aGlzIGVudHJ5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorCQkJCQkJbGluZTE6IHRoaXMoYSwKKwkJCQkJCSAgYiwKKwkJCQkJCSAgYyk7CisJCQkJCQl3aXRoIHRoaXMgY29kZSB3ZSBnZW5lcmF0ZSBlYWNoIGFyZ3VtZW50LiBXZSBnZW5lcmF0ZSBhIGFsb2FkMCB0byBpbnZva2UgdGhlIGNvbnN0cnVjdG9yLiBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcworCQkJCQkJYWxvYWQwIGJ5dGVjb2RlLiBUaGUgZmlyc3QgZW50cnkgaXMgdGhlIG9uZSBmb3IgdGhlIGFyZ3VtZW50IGEuCisJCQkJCQlCdXQgd2Ugd2FudCB0aGUgY29uc3RydWN0b3IgY2FsbCB0byBzdGFydCBhdCB0aGUgYWxvYWQwIHBjIGFuZCBub3QganVzdCBhdCB0aGUgcGMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LgorCQkJCQkJU28gd2Ugd2lkZW4gdGhlIGV4aXN0aW5nIGVudHJ5IChpZiB0aGVyZSBpcyBvbmUpIG9yIHdlIGNyZWF0ZSBhIG5ldyBlbnRyeSB3aXRoIHRoZSBzdGFydFBDLgorCQkJCQkqLworCQkJCQlpZiAoZXhpc3RpbmdFbnRyeUluZGV4ICE9IC0xKSB7CisJCQkJCQkvLyB3aWRlbiBleGlzdGluZyBlbnRyeQorCQkJCQkJcGNUb1NvdXJjZU1hcFtleGlzdGluZ0VudHJ5SW5kZXhdID0gc3RhcnRQQzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHdlIGhhdmUgdG8gYWRkIGFuIGVudHJ5IHRoYXQgd29uJ3QgYmUgc29ydGVkLiBTbyB3ZSBzb3J0IHRoZSBwY1RvU291cmNlTWFwLgorCQkJCQkJU3lzdGVtLmFycmF5Y29weShwY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCwgcGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXggKyAyLCBwY1RvU291cmNlTWFwU2l6ZSAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCXBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXgrK10gPSBzdGFydFBDOworCQkJCQkJcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBuZXdMaW5lOworCQkJCQkJcGNUb1NvdXJjZU1hcFNpemUgKz0gMjsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocG9zaXRpb24gIT0gbGFzdEVudHJ5UEMpIHsgLy8gbm8gYnl0ZWNvZGUgc2luY2UgbGFzdCBlbnRyeSBwYworCQkJCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gbGFzdEVudHJ5UEM7CisJCQkJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUrK10gPSBuZXdMaW5lOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gd2UgY2FuIHNhZmVseSBhZGQgdGhlIG5ldyBlbnRyeS4gVGhlIGVuZFBDIG9mIHRoZSBwcmV2aW91cyBlbnRyeSBpcyBub3QgaW4gY29uZmxpdCB3aXRoIHRoZSBzdGFydFBDIG9mIHRoZSBuZXcgZW50cnkuCisJCQkJcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSsrXSA9IHN0YXJ0UEM7CisJCQkJcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSsrXSA9IG5ld0xpbmU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgbGFzdCByZWNvcmRlZCBlbnRyeSBpcyBvbiB0aGUgc2FtZSBsaW5lLiBCdXQgaXQgY291bGQgYmUgcmVsZXZhbnQgdG8gd2lkZW4gdGhpcyBlbnRyeS4KKwkJCSAgIHdlIHdhbnQgdG8gZXh0ZW5kIHRoaXMgZW50cnkgZm9yd2FyZCBpbiBjYXNlIHdlIGdlbmVyYXRlZCBzb21lIGJ5dGVjb2RlIGJlZm9yZSB0aGUgbGFzdCBlbnRyeSB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byBhbnkgc3RhdGVtZW50CisJCQkqLwkKKwkJCWlmIChzdGFydFBDIDwgcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDJdKSB7CisJCQkJaW50IGluc2VydGlvbkluZGV4ID0gaW5zZXJ0aW9uSW5kZXgocGNUb1NvdXJjZU1hcCwgcGNUb1NvdXJjZU1hcFNpemUsIHN0YXJ0UEMpOworCQkJCWlmIChpbnNlcnRpb25JbmRleCAhPSAtMSkgeworCQkJCQkvLyB3aWRlbiB0aGUgZXhpc3RpbmcgZW50cnkKKwkJCQkJLy8gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gbW92ZSB0aGUgbGFzdCBlbnRyeSBhdCBhbm90aGVyIGxvY2F0aW9uIHRvIGtlZXAgYSBzb3J0ZWQgdGFibGUKKwkJCQkJaWYgKChwY1RvU291cmNlTWFwU2l6ZSA+IDQpICYmIChwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplIC0gNF0gPiBzdGFydFBDKSkgeworCQkJCQkJU3lzdGVtLmFycmF5Y29weShwY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCwgcGNUb1NvdXJjZU1hcCwgaW5zZXJ0aW9uSW5kZXggKyAyLCBwY1RvU291cmNlTWFwU2l6ZSAtIDIgLSBpbnNlcnRpb25JbmRleCk7CisJCQkJCQlwY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4KytdID0gc3RhcnRQQzsKKwkJCQkJCXBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXhdID0gbmV3TGluZTsJCQkJCQkKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAyXSA9IHN0YXJ0UEM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJbGFzdEVudHJ5UEMgPSBwb3NpdGlvbjsKKwl9IGVsc2UgeworCQkvLyByZWNvcmQgdGhlIGZpcnN0IGVudHJ5CisJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUrK10gPSBzdGFydFBDOworCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplKytdID0gbmV3TGluZTsKKwkJbGFzdEVudHJ5UEMgPSBwb3NpdGlvbjsKKwl9Cit9CisvKioKKyAqIEBwYXJhbSBhbkV4Y2VwdGlvbkxhYmVsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkV4Y2VwdGlvbkxhYmVsCisgKi8KK3B1YmxpYyB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSGFuZGxlcihFeGNlcHRpb25MYWJlbCBhbkV4Y2VwdGlvbkxhYmVsKSB7CisJaW50IGxlbmd0aDsKKwlpZiAoZXhjZXB0aW9uSGFuZGxlcnNOdW1iZXIgPj0gKGxlbmd0aCA9IGV4Y2VwdGlvbkhhbmRsZXJzLmxlbmd0aCkpIHsKKwkJLy8gcmVzaXplIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgdGFibGUKKwkJU3lzdGVtLmFycmF5Y29weShleGNlcHRpb25IYW5kbGVycywgMCwgZXhjZXB0aW9uSGFuZGxlcnMgPSBuZXcgRXhjZXB0aW9uTGFiZWxbbGVuZ3RoICsgTEFCRUxTX0lOQ1JFTUVOVF0sIDAsIGxlbmd0aCk7CisJfQorCS8vIG5vIG5lZWQgdG8gcmVzaXplLiBTbyBqdXN0IGFkZCB0aGUgbmV3IGV4Y2VwdGlvbiBsYWJlbAorCWV4Y2VwdGlvbkhhbmRsZXJzW2V4Y2VwdGlvbkhhbmRsZXJzTnVtYmVyKytdID0gYW5FeGNlcHRpb25MYWJlbDsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhTY29wZSBzY29wZSwgaW50IGluaXRTdGF0ZUluZGV4KSB7CisJLy8gZ2l2ZW4gc29tZSBmbG93IGluZm8sIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGxvb3NlIHNvbWUgdmFyaWFibGVzIGluaXRpYWxpemF0aW9uCisJLy8gaWYgdGhpcyBoYXBwZW5zLCB0aGVuIHdlIG11c3QgdXBkYXRlIHRoZWlyIHBjIGVudHJpZXMgdG8gcmVmbGVjdCBpdCBpbiBkZWJ1ZyBhdHRyaWJ1dGVzCisJaWYgKCFnZW5lcmF0ZUxvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZXMpCisJCXJldHVybjsKKy8qCWlmIChpbml0U3RhdGVJbmRleCA9PSBsYXN0SW5pdFN0YXRlSW5kZXhXaGVuUmVtb3ZpbmdJbml0cykKKwkJcmV0dXJuOworCQkKKwlsYXN0SW5pdFN0YXRlSW5kZXhXaGVuUmVtb3ZpbmdJbml0cyA9IGluaXRTdGF0ZUluZGV4OworCWlmIChsYXN0SW5pdFN0YXRlSW5kZXhXaGVuQWRkaW5nSW5pdHMgIT0gaW5pdFN0YXRlSW5kZXgpeworCQlsYXN0SW5pdFN0YXRlSW5kZXhXaGVuQWRkaW5nSW5pdHMgPSAtMjsvLyByZWluaXRpYWxpemUgYWRkIGluZGV4IAorCQkvLyBhZGQoMSktcmVtb3ZlKDEpLWFkZCgxKSAtPiBpZ25vcmUgc2Vjb25kIGFkZAorCQkvLyBhZGQoMSktcmVtb3ZlKDIpLWFkZCgxKSAtPiBwZXJmb3JtIHNlY29uZCBhZGQKKwl9Ki8KKwlmb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVMb2NhbHNDb3VudDsgaSsrKSB7CisJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IHZpc2libGVMb2NhbHNbaV07CisJCWlmIChsb2NhbEJpbmRpbmcgIT0gbnVsbCkgeworCQkJaWYgKGluaXRTdGF0ZUluZGV4ID09IC0xIHx8ICFpc0RlZmluaXRlbHlBc3NpZ25lZChzY29wZSwgaW5pdFN0YXRlSW5kZXgsIGxvY2FsQmluZGluZykpIHsKKwkJCQlpZiAobG9jYWxCaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgPiAwKSB7CisJCQkJCWxvY2FsQmluZGluZy5yZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKHBvc2l0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIEBwYXJhbSBtZXRob2REZWNsYXJhdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KKyAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyB2b2lkIHJlc2V0KEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwlpbml0KGNsYXNzRmlsZSk7CisJdGhpcy5tZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uOworCXByZXNlcnZlVW51c2VkTG9jYWxzID0gbWV0aG9kRGVjbGFyYXRpb24uc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkub3B0aW9ucy5wcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzOworCWluaXRpYWxpemVNYXhMb2NhbHMobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7Cit9CisvKioKKyAqIEBwYXJhbSBtZXRob2REZWNsYXJhdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KKyAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyB2b2lkIHJlc2V0Rm9yUHJvYmxlbUNsaW5pdChDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJaW5pdChjbGFzc0ZpbGUpOworCW1heExvY2FscyA9IDA7Cit9Citwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXNpemVCeXRlQXJyYXkoKSB7CisJaW50IGFjdHVhbExlbmd0aCA9IGJDb2RlU3RyZWFtLmxlbmd0aDsKKwlpbnQgcmVxdWlyZWRTaXplID0gYWN0dWFsTGVuZ3RoICsgZ3Jvd0ZhY3RvcjsKKwlpZiAoY2xhc3NGaWxlT2Zmc2V0ID4gcmVxdWlyZWRTaXplKSB7CisJCXJlcXVpcmVkU2l6ZSA9IGNsYXNzRmlsZU9mZnNldCArIGdyb3dGYWN0b3I7CisJfQorCVN5c3RlbS5hcnJheWNvcHkoYkNvZGVTdHJlYW0sIDAsIChiQ29kZVN0cmVhbSA9IG5ldyBieXRlW3JlcXVpcmVkU2l6ZV0pLCAwLCBhY3R1YWxMZW5ndGgpOworfQorLyoqCisgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJlc2l6ZSB0aGUgaW50ZXJuYWwgYnl0ZSBhcnJheSBpbiAKKyAqIGNhc2Ugb2YgYSBBcnJheU91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gYWRkaW5nIHRoZSB2YWx1ZSBiLgorICogUmVzaXplIGFuZCBhZGQgdGhlIG5ldyBieXRlIGIgaW5zaWRlIHRoZSBhcnJheS4KKyAqIEBwYXJhbSBiIGJ5dGUKKyAqLworcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVzaXplQnl0ZUFycmF5KGJ5dGUgYikgeworCXJlc2l6ZUJ5dGVBcnJheSgpOworCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCAtIDFdID0gYjsKK30KK2ZpbmFsIHB1YmxpYyB2b2lkIHJldChpbnQgaW5kZXgpIHsKKwljb3VudExhYmVscyA9IDA7CisJaWYgKGluZGV4ID4gMjU1KSB7IC8vIFdpZGVuCisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX3dpZGU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ193aWRlKTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19yZXQ7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KE9QQ19yZXQpOworCQl9CisJCXdyaXRlVW5zaWduZWRTaG9ydChpbmRleCk7CisJfSBlbHNlIHsgLy8gRG9uJ3QgV2lkZW4KKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfcmV0OworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShPUENfcmV0KTsKKwkJfQorCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBpbmRleDsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGluZGV4KTsKKwkJfQorCX0KK30KK2ZpbmFsIHB1YmxpYyB2b2lkIHJldHVybl8oKSB7CisJY291bnRMYWJlbHMgPSAwOworCS8vIHRoZSBzdGFja0RlcHRoIHNob3VsZCBiZSBlcXVhbCB0byAwIAorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19yZXR1cm47CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfcmV0dXJuKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBzYWxvYWQoKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgtLTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfc2Fsb2FkOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX3NhbG9hZCk7CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgc2FzdG9yZSgpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aCAtPSAzOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19zYXN0b3JlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX3Nhc3RvcmUpOworCX0KK30KKy8qKgorICogQHBhcmFtIG9wZXJhdG9yQ29uc3RhbnQgaW50CisgKiBAcGFyYW0gdHlwZV9JRCBpbnQKKyAqLworcHVibGljIHZvaWQgc2VuZE9wZXJhdG9yKGludCBvcGVyYXRvckNvbnN0YW50LCBpbnQgdHlwZV9JRCkgeworCXN3aXRjaCAodHlwZV9JRCkgeworCQljYXNlIFRfaW50IDoKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQljYXNlIFRfY2hhciA6CisJCWNhc2UgVF9ieXRlIDoKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAob3BlcmF0b3JDb25zdGFudCkgeworCQkJCWNhc2UgUExVUyA6CisJCQkJCXRoaXMuaWFkZCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1JTlVTIDoKKwkJCQkJdGhpcy5pc3ViKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTVVMVElQTFkgOgorCQkJCQl0aGlzLmltdWwoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBESVZJREUgOgorCQkJCQl0aGlzLmlkaXYoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRU1BSU5ERVIgOgorCQkJCQl0aGlzLmlyZW0oKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMRUZUX1NISUZUIDoKKwkJCQkJdGhpcy5pc2hsKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUklHSFRfU0hJRlQgOgorCQkJCQl0aGlzLmlzaHIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVCA6CisJCQkJCXRoaXMuaXVzaHIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBTkQgOgorCQkJCQl0aGlzLmlhbmQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPUiA6CisJCQkJCXRoaXMuaW9yKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgWE9SIDoKKwkJCQkJdGhpcy5peG9yKCk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAob3BlcmF0b3JDb25zdGFudCkgeworCQkJCWNhc2UgUExVUyA6CisJCQkJCXRoaXMubGFkZCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1JTlVTIDoKKwkJCQkJdGhpcy5sc3ViKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTVVMVElQTFkgOgorCQkJCQl0aGlzLmxtdWwoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBESVZJREUgOgorCQkJCQl0aGlzLmxkaXYoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRU1BSU5ERVIgOgorCQkJCQl0aGlzLmxyZW0oKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMRUZUX1NISUZUIDoKKwkJCQkJdGhpcy5sc2hsKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUklHSFRfU0hJRlQgOgorCQkJCQl0aGlzLmxzaHIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVCA6CisJCQkJCXRoaXMubHVzaHIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBTkQgOgorCQkJCQl0aGlzLmxhbmQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPUiA6CisJCQkJCXRoaXMubG9yKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgWE9SIDoKKwkJCQkJdGhpcy5seG9yKCk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlzd2l0Y2ggKG9wZXJhdG9yQ29uc3RhbnQpIHsKKwkJCQljYXNlIFBMVVMgOgorCQkJCQl0aGlzLmZhZGQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNSU5VUyA6CisJCQkJCXRoaXMuZnN1YigpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1VTFRJUExZIDoKKwkJCQkJdGhpcy5mbXVsKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRElWSURFIDoKKwkJCQkJdGhpcy5mZGl2KCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVNQUlOREVSIDoKKwkJCQkJdGhpcy5mcmVtKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKG9wZXJhdG9yQ29uc3RhbnQpIHsKKwkJCQljYXNlIFBMVVMgOgorCQkJCQl0aGlzLmRhZGQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNSU5VUyA6CisJCQkJCXRoaXMuZHN1YigpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1VTFRJUExZIDoKKwkJCQkJdGhpcy5kbXVsKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRElWSURFIDoKKwkJCQkJdGhpcy5kZGl2KCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVNQUlOREVSIDoKKwkJCQkJdGhpcy5kcmVtKCk7CisJCQl9CisJfQorfQorZmluYWwgcHVibGljIHZvaWQgc2lwdXNoKGludCBzKSB7CisJY291bnRMYWJlbHMgPSAwOworCXN0YWNrRGVwdGgrKzsKKwlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX3NpcHVzaDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19zaXB1c2gpOworCX0KKwl3cml0ZVNpZ25lZFNob3J0KHMpOworfQorcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNvcnQoaW50W10gdGFiLCBpbnQgbG8wLCBpbnQgaGkwLCBpbnRbXSByZXN1bHQpIHsKKwlpbnQgbG8gPSBsbzA7CisJaW50IGhpID0gaGkwOworCWludCBtaWQ7CisJaWYgKGhpMCA+IGxvMCkgeworCQkvKiBBcmJpdHJhcmlseSBlc3RhYmxpc2hpbmcgcGFydGl0aW9uIGVsZW1lbnQgYXMgdGhlIG1pZHBvaW50IG9mCisJCSAgKiB0aGUgYXJyYXkuCisJCSAgKi8KKwkJbWlkID0gdGFiWyAobG8wICsgaGkwKSAvIDJdOworCQkvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IHVudGlsIGluZGljZXMgY3Jvc3MKKwkJd2hpbGUgKGxvIDw9IGhpKSB7CisJCQkvKiBmaW5kIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIAorCQkJICogdGhlIHBhcnRpdGlvbiBlbGVtZW50IHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQgSW5kZXguCisJCQkgKi8KKwkJCXdoaWxlICgobG8gPCBoaTApICYmICh0YWJbbG9dIDwgbWlkKSkKKwkJCQkrK2xvOworCQkJLyogZmluZCBhbiBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIAorCQkJICogdGhlIHBhcnRpdGlvbiBlbGVtZW50IHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0IEluZGV4LgorCQkJICovCisJCQl3aGlsZSAoKGhpID4gbG8wKSAmJiAodGFiW2hpXSA+IG1pZCkpCisJCQkJLS1oaTsKKwkJCS8vIGlmIHRoZSBpbmRleGVzIGhhdmUgbm90IGNyb3NzZWQsIHN3YXAKKwkJCWlmIChsbyA8PSBoaSkgeworCQkJCXN3YXAodGFiLCBsbywgaGksIHJlc3VsdCk7CisJCQkJKytsbzsKKwkJCQktLWhpOworCQkJfQorCQl9CisJCS8qIElmIHRoZSByaWdodCBpbmRleCBoYXMgbm90IHJlYWNoZWQgdGhlIGxlZnQgc2lkZSBvZiBhcnJheQorCQkgICogbXVzdCBub3cgc29ydCB0aGUgbGVmdCBwYXJ0aXRpb24uCisJCSAgKi8KKwkJaWYgKGxvMCA8IGhpKQorCQkJc29ydCh0YWIsIGxvMCwgaGksIHJlc3VsdCk7CisJCS8qIElmIHRoZSBsZWZ0IGluZGV4IGhhcyBub3QgcmVhY2hlZCB0aGUgcmlnaHQgc2lkZSBvZiBhcnJheQorCQkgICogbXVzdCBub3cgc29ydCB0aGUgcmlnaHQgcGFydGl0aW9uLgorCQkgICovCisJCWlmIChsbyA8IGhpMCkKKwkJCXNvcnQodGFiLCBsbywgaGkwLCByZXN1bHQpOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHN0b3JlKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZywgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJVHlwZUJpbmRpbmcgdHlwZSA9IGxvY2FsQmluZGluZy50eXBlOworCWludCBwb3NpdGlvbiA9IGxvY2FsQmluZGluZy5yZXNvbHZlZFBvc2l0aW9uOworCS8vIFVzaW5nIGRlZGljYXRlZCBpbnQgYnl0ZWNvZGUKKwlpZiAoKHR5cGUgPT0gSW50QmluZGluZykgfHwgKHR5cGUgPT0gQ2hhckJpbmRpbmcpIHx8ICh0eXBlID09IEJ5dGVCaW5kaW5nKSB8fCAodHlwZSA9PSBTaG9ydEJpbmRpbmcpIHx8ICh0eXBlID09IEJvb2xlYW5CaW5kaW5nKSkgeworCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCXRoaXMuZHVwKCk7CisJCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJCWNhc2UgMCA6CisJCQkJdGhpcy5pc3RvcmVfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmlzdG9yZV8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMuaXN0b3JlXzIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMyA6CisJCQkJdGhpcy5pc3RvcmVfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5pc3RvcmUocG9zaXRpb24pOworCQl9CisJCXJldHVybjsKKwl9CisJLy8gVXNpbmcgZGVkaWNhdGVkIGZsb2F0IGJ5dGVjb2RlCisJaWYgKHR5cGUgPT0gRmxvYXRCaW5kaW5nKSB7CisJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJdGhpcy5kdXAoKTsKKwkJc3dpdGNoIChwb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmZzdG9yZV8wKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEgOgorCQkJCXRoaXMuZnN0b3JlXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5mc3RvcmVfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmZzdG9yZV8zKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aGlzLmZzdG9yZShwb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBVc2luZyBkZWRpY2F0ZWQgbG9uZyBieXRlY29kZQorCWlmICh0eXBlID09IExvbmdCaW5kaW5nKSB7CisJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJdGhpcy5kdXAyKCk7CisJCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJCWNhc2UgMCA6CisJCQkJdGhpcy5sc3RvcmVfMCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxIDoKKwkJCQl0aGlzLmxzdG9yZV8xKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCXRoaXMubHN0b3JlXzIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMyA6CisJCQkJdGhpcy5sc3RvcmVfMygpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhpcy5sc3RvcmUocG9zaXRpb24pOworCQl9CisJCXJldHVybjsKKwl9CisJLy8gVXNpbmcgZGVkaWNhdGVkIGRvdWJsZSBieXRlY29kZQorCWlmICh0eXBlID09IERvdWJsZUJpbmRpbmcpIHsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQl0aGlzLmR1cDIoKTsKKwkJc3dpdGNoIChwb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmRzdG9yZV8wKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEgOgorCQkJCXRoaXMuZHN0b3JlXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5kc3RvcmVfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmRzdG9yZV8zKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aGlzLmRzdG9yZShwb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBSZWZlcmVuY2Ugb2JqZWN0CisJaWYgKHZhbHVlUmVxdWlyZWQpCisJCXRoaXMuZHVwKCk7CisJc3dpdGNoIChwb3NpdGlvbikgeworCQljYXNlIDAgOgorCQkJdGhpcy5hc3RvcmVfMCgpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQl0aGlzLmFzdG9yZV8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuYXN0b3JlXzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5hc3RvcmVfMygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJdGhpcy5hc3RvcmUocG9zaXRpb24pOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHN0b3JlKFR5cGVCaW5kaW5nIHR5cGUsIGludCBwb3NpdGlvbikgeworCS8vIFVzaW5nIGRlZGljYXRlZCBpbnQgYnl0ZWNvZGUKKwlpZiAoKHR5cGUgPT0gSW50QmluZGluZykgfHwgKHR5cGUgPT0gQ2hhckJpbmRpbmcpIHx8ICh0eXBlID09IEJ5dGVCaW5kaW5nKSB8fCAodHlwZSA9PSBTaG9ydEJpbmRpbmcpIHx8ICh0eXBlID09IEJvb2xlYW5CaW5kaW5nKSkgeworCQlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuaXN0b3JlXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5pc3RvcmVfMSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyIDoKKwkJCQl0aGlzLmlzdG9yZV8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuaXN0b3JlXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuaXN0b3JlKHBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIFVzaW5nIGRlZGljYXRlZCBmbG9hdCBieXRlY29kZQorCWlmICh0eXBlID09IEZsb2F0QmluZGluZykgeworCQlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuZnN0b3JlXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5mc3RvcmVfMSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyIDoKKwkJCQl0aGlzLmZzdG9yZV8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuZnN0b3JlXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuZnN0b3JlKHBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIFVzaW5nIGRlZGljYXRlZCBsb25nIGJ5dGVjb2RlCisJaWYgKHR5cGUgPT0gTG9uZ0JpbmRpbmcpIHsKKwkJc3dpdGNoIChwb3NpdGlvbikgeworCQkJY2FzZSAwIDoKKwkJCQl0aGlzLmxzdG9yZV8wKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEgOgorCQkJCXRoaXMubHN0b3JlXzEoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMiA6CisJCQkJdGhpcy5sc3RvcmVfMigpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQl0aGlzLmxzdG9yZV8zKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aGlzLmxzdG9yZShwb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvLyBVc2luZyBkZWRpY2F0ZWQgZG91YmxlIGJ5dGVjb2RlCisJaWYgKHR5cGUgPT0gRG91YmxlQmluZGluZykgeworCQlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCQljYXNlIDAgOgorCQkJCXRoaXMuZHN0b3JlXzAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMSA6CisJCQkJdGhpcy5kc3RvcmVfMSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyIDoKKwkJCQl0aGlzLmRzdG9yZV8yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDMgOgorCQkJCXRoaXMuZHN0b3JlXzMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRoaXMuZHN0b3JlKHBvc2l0aW9uKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8vIFJlZmVyZW5jZSBvYmplY3QKKwlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCWNhc2UgMCA6CisJCQl0aGlzLmFzdG9yZV8wKCk7CisJCQlicmVhazsKKwkJY2FzZSAxIDoKKwkJCXRoaXMuYXN0b3JlXzEoKTsKKwkJCWJyZWFrOworCQljYXNlIDIgOgorCQkJdGhpcy5hc3RvcmVfMigpOworCQkJYnJlYWs7CisJCWNhc2UgMyA6CisJCQl0aGlzLmFzdG9yZV8zKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQl0aGlzLmFzdG9yZShwb3NpdGlvbik7CisJfQorfQorcHVibGljIGZpbmFsIHZvaWQgc3RvcmVJbnQoaW50IHBvc2l0aW9uKSB7CisJc3dpdGNoIChwb3NpdGlvbikgeworCQljYXNlIDAgOgorCQkJdGhpcy5pc3RvcmVfMCgpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQl0aGlzLmlzdG9yZV8xKCk7CisJCQlicmVhazsKKwkJY2FzZSAyIDoKKwkJCXRoaXMuaXN0b3JlXzIoKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOgorCQkJdGhpcy5pc3RvcmVfMygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJdGhpcy5pc3RvcmUocG9zaXRpb24pOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHN0b3JlT2JqZWN0KGludCBwb3NpdGlvbikgeworCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJY2FzZSAwIDoKKwkJCXRoaXMuYXN0b3JlXzAoKTsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJdGhpcy5hc3RvcmVfMSgpOworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisJCQl0aGlzLmFzdG9yZV8yKCk7CisJCQlicmVhazsKKwkJY2FzZSAzIDoKKwkJCXRoaXMuYXN0b3JlXzMoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXRoaXMuYXN0b3JlKHBvc2l0aW9uKTsKKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCBzd2FwKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfc3dhcDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19zd2FwKTsKKwl9Cit9Citwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHN3YXAoaW50IGFbXSwgaW50IGksIGludCBqLCBpbnQgcmVzdWx0W10pIHsKKwlpbnQgVDsKKwlUID0gYVtpXTsKKwlhW2ldID0gYVtqXTsKKwlhW2pdID0gVDsKKwlUID0gcmVzdWx0W2pdOworCXJlc3VsdFtqXSA9IHJlc3VsdFtpXTsKKwlyZXN1bHRbaV0gPSBUOworfQorZmluYWwgcHVibGljIHZvaWQgdGFibGVzd2l0Y2goQ2FzZUxhYmVsIGRlZmF1bHRMYWJlbCwgaW50IGxvdywgaW50IGhpZ2gsIGludFtdIGtleXMsIGludFtdIHNvcnRlZEluZGV4ZXMsIENhc2VMYWJlbFtdIGNhc2VzTGFiZWwpIHsKKwljb3VudExhYmVscyA9IDA7CisJc3RhY2tEZXB0aC0tOworCWludCBsZW5ndGggPSBjYXNlc0xhYmVsLmxlbmd0aDsKKwlpbnQgcG9zID0gcG9zaXRpb247CisJZGVmYXVsdExhYmVsLnBsYWNlSW5zdHJ1Y3Rpb24oKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQljYXNlc0xhYmVsW2ldLnBsYWNlSW5zdHJ1Y3Rpb24oKTsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfdGFibGVzd2l0Y2g7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfdGFibGVzd2l0Y2gpOworCX0KKwlmb3IgKGludCBpID0gKDMgLSAocG9zICUgNCkpOyBpID4gMDsgaS0tKSB7CisJCXBvc2l0aW9uKys7IC8vIFBhZGRpbmcKKwkJY2xhc3NGaWxlT2Zmc2V0Kys7CisJfQorCWRlZmF1bHRMYWJlbC5icmFuY2goKTsKKwl3cml0ZVNpZ25lZFdvcmQobG93KTsKKwl3cml0ZVNpZ25lZFdvcmQoaGlnaCk7CisJaW50IGkgPSBsb3csIGogPSBsb3c7CisJLy8gdGhlIGluZGV4IGogaXMgdXNlZCB0byBrbm93IGlmIHRoZSBpbmRleCBpIGlzIG9uZSBvZiB0aGUgbWlzc2luZyBlbnRyaWVzIGluIGNhc2Ugb2YgYW4gCisJLy8gb3B0aW1pemVkIHRhYmxlc3dpdGNoCisJd2hpbGUgKHRydWUpIHsKKwkJaW50IGluZGV4OworCQlpbnQga2V5ID0ga2V5c1tpbmRleCA9IHNvcnRlZEluZGV4ZXNbaiAtIGxvd11dOworCQlpZiAoa2V5ID09IGkpIHsKKwkJCWNhc2VzTGFiZWxbaW5kZXhdLmJyYW5jaCgpOworCQkJaisrOworCQkJaWYgKGkgPT0gaGlnaCkgYnJlYWs7IC8vIGlmIGhpZ2ggaXMgbWF4aW50LCB0aGVuIGF2b2lkcyB3cmFwcGluZyB0byBtaW5pbnQuCisJCX0gZWxzZSB7CisJCQlkZWZhdWx0TGFiZWwuYnJhbmNoKCk7CisJCX0KKwkJaSsrOworCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIiggcG9zaXRpb246Iik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHBvc2l0aW9uKTsKKwlidWZmZXIuYXBwZW5kKCIsXG5zdGFja0RlcHRoOiIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZChzdGFja0RlcHRoKTsKKwlidWZmZXIuYXBwZW5kKCIsXG5tYXhTdGFjazoiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoc3RhY2tNYXgpOworCWJ1ZmZlci5hcHBlbmQoIixcbm1heExvY2FsczoiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQobWF4TG9jYWxzKTsKKwlidWZmZXIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CitwdWJsaWMgdm9pZCB1cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhpbnQgcG9zKSB7CisKKwkvKiBUdW5lIHBvc2l0aW9ucyBpbiB0aGUgdGFibGUsIHRoaXMgaXMgZHVlIHRvIHNvbWUgCisJICogZXh0cmEgYnl0ZWNvZGVzIGJlaW5nCisJICogYWRkZWQgdG8gc29tZSB1c2VyIGNvZGUgKGp1bXBzKS4gKi8KKwkvKiogT0xEIENPREUKKwkJaWYgKCFnZW5lcmF0ZUxpbmVOdW1iZXJBdHRyaWJ1dGVzKQorCQkJcmV0dXJuOworCQlwY1RvU291cmNlTWFwW3BjVG9Tb3VyY2VNYXBTaXplIC0gMV1bMV0gPSBwb3NpdGlvbjsKKwkJLy8gbmVlZCB0byB1cGRhdGUgdGhlIGluaXRpYWxpemF0aW9uIGVuZFBDIGluIGNhc2Ugb2YgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzLgorCQl1cGRhdGVMb2NhbFZhcmlhYmxlc0F0dHJpYnV0ZShwb3MpOwkKKwkqLwkKKworCWlmICghZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykKKwkJcmV0dXJuOworCS8vIG5lZWQgdG8gdXBkYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbmRQQyBpbiBjYXNlIG9mIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcy4KKwl1cGRhdGVMb2NhbFZhcmlhYmxlc0F0dHJpYnV0ZShwb3MpOworfQorcHVibGljIHZvaWQgdXBkYXRlTG9jYWxWYXJpYWJsZXNBdHRyaWJ1dGUoaW50IHBvcykgeworCS8vIG5lZWQgdG8gdXBkYXRlIHRoZSBpbml0aWFsaXphdGlvbiBlbmRQQyBpbiBjYXNlIG9mIGdlbmVyYXRpb24gb2YgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcy4KKwlpZiAoZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBsb2NhbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxzW2ldOworCQkJaWYgKChsb2NhbCAhPSBudWxsKSAmJiAobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApKSB7CisJCQkJaWYgKGxvY2FsLmluaXRpYWxpemF0aW9uUENzWygobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPT0gcG9zKSB7CisJCQkJCWxvY2FsLmluaXRpYWxpemF0aW9uUENzWygobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSBwb3NpdGlvbjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CitmaW5hbCBwdWJsaWMgdm9pZCB3aWRlKCkgeworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfd2lkZTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ193aWRlKTsKKwl9Cit9CitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gYjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KGIpOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZUF0UG9zKGludCBwb3MsIGJ5dGUgYikgeworCXRyeSB7CisJCWJDb2RlU3RyZWFtW3Bvc10gPSBiOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKKwkJcmVzaXplQnl0ZUFycmF5KCk7CisJCWJDb2RlU3RyZWFtW3Bvc10gPSBiOworCX0KK30KKy8qKgorICogV3JpdGUgYSB1bnNpZ25lZCA4IGJpdHMgdmFsdWUgaW50byB0aGUgYnl0ZSBhcnJheQorICogQHBhcmFtIGIgdGhlIHNpZ25lZCBieXRlCisgKi8KK3B1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkQnl0ZShpbnQgYikgeworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBiOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGIpOworCX0KK30KKy8qKgorICogV3JpdGUgYSBzaWduZWQgMTYgYml0cyB2YWx1ZSBpbnRvIHRoZSBieXRlIGFycmF5CisgKiBAcGFyYW0gYiB0aGUgc2lnbmVkIHNob3J0CisgKi8KK3B1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkU2hvcnQoaW50IGIpIHsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKGIgPj4gOCk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgKGIgPj4gOCkpOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgYjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KChieXRlKSBiKTsKKwl9Cit9CitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNpZ25lZFNob3J0KGludCBwb3MsIGludCBiKSB7CisJaW50IGN1cnJlbnRPZmZzZXQgPSBzdGFydGluZ0NsYXNzRmlsZU9mZnNldCArIHBvczsKKwl0cnkgeworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0XSA9IChieXRlKSAoYiA+PiA4KTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KCk7CisJCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXRdID0gKGJ5dGUpIChiID4+IDgpOworCX0KKwl0cnkgeworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0ICsgMV0gPSAoYnl0ZSkgYjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KCk7CisJCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQgKyAxXSA9IChieXRlKSBiOworCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU2lnbmVkV29yZChpbnQgdmFsdWUpIHsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KChieXRlKSAoKHZhbHVlICYgMHhGRjAwMDAwMCkgPj4gMjQpKTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpKTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDApID4+IDgpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpICgodmFsdWUgJiAweEZGMDApID4+IDgpKTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpICh2YWx1ZSAmIDB4RkYpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpICh2YWx1ZSAmIDB4RkYpKTsKKwl9Cit9CitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNpZ25lZFdvcmQoaW50IHBvcywgaW50IHZhbHVlKSB7CisJaW50IGN1cnJlbnRPZmZzZXQgPSBzdGFydGluZ0NsYXNzRmlsZU9mZnNldCArIHBvczsKKwl0cnkgeworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgpOworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0LTFdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisJfQorCXRyeSB7CisJCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMDAwKSA+PiAxNik7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgpOworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0LTFdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMCkgPj4gMTYpOworCX0KKwl0cnkgeworCQliQ29kZVN0cmVhbVtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDApID4+IDgpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKTsKKwkJYkNvZGVTdHJlYW1bY3VycmVudE9mZnNldC0xXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwKSA+PiA4KTsKKwl9CisJdHJ5IHsKKwkJYkNvZGVTdHJlYW1bY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KCk7CisJCWJDb2RlU3RyZWFtW2N1cnJlbnRPZmZzZXQtMV0gPSAoYnl0ZSkgKHZhbHVlICYgMHhGRik7CisJfQorfQorLyoqCisgKiBXcml0ZSBhIHVuc2lnbmVkIDggYml0cyB2YWx1ZSBpbnRvIHRoZSBieXRlIGFycmF5CisgKiBAcGFyYW0gYiB0aGUgdW5zaWduZWQgYnl0ZQorICovCitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVuc2lnbmVkQnl0ZShpbnQgYikgeworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBiOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGIpOworCX0KK30KKy8qKgorICogV3JpdGUgYSB1bnNpZ25lZCAxNiBiaXRzIHZhbHVlIGludG8gdGhlIGJ5dGUgYXJyYXkKKyAqIEBwYXJhbSBiIHRoZSB1bnNpZ25lZCBzaG9ydAorICovCitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVuc2lnbmVkU2hvcnQoaW50IGIpIHsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKGIgPj4+IDgpOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIChiID4+PiA4KSk7CisJfQorCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IChieXRlKSBiOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIGIpOworCX0KK30KKy8qKgorICogV3JpdGUgYSB1bnNpZ25lZCAzMiBiaXRzIHZhbHVlIGludG8gdGhlIGJ5dGUgYXJyYXkKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdW5zaWduZWQgd29yZAorICovCitwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVuc2lnbmVkV29yZChpbnQgdmFsdWUpIHsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+PiAyNCk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgKHZhbHVlID4+PiAyNCkpOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+PiAxNik7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkgKHZhbHVlID4+PiAxNikpOworCX0KKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAoYnl0ZSkgKHZhbHVlID4+PiA4KTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KChieXRlKSAodmFsdWUgPj4+IDgpKTsKKwl9CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoKGJ5dGUpIHZhbHVlKTsKKwl9Cit9CisKK3B1YmxpYyB2b2lkIGdlbmVyYXRlV2lkZUNvbmRpdGlvbmFsQnJhbmNoKGJ5dGUgb3Bjb2RlLCBMYWJlbCBsYmwpIHsKKwkJLyogd2UgaGFuZGxlIHRoZSBnb3RvX3cgcHJvYmxlbSBpbnNpZGUgYW4gaWYuLi4uIHdpdGggc29tZSBtYWNybyBleHBhbnNpb24KKwkJICogYXQgdGhlIGJ5dGVjb2RlIGxldmVsCisJCSAqIGluc3RlYWQgb2Y6CisJCSAqIGlmXy4uLi4uLiBsYmwKKwkJICogd2UgaGF2ZToKKwkJICogICAgaWZuZSA8bDE+CisJCSAqICAgIGdvdG8gPGwyPgorCQkgKiBsMSBnb3RvdyA8bDM+IC8vIGwzIGlzIGEgd2lkZSB0YXJnZXQKKwkJICogbDIgLi4uLgorCQkgKi8KKwkJTGFiZWwgbDEgPSBuZXcgTGFiZWwodGhpcyk7CisJCXRyeSB7CisJCQlwb3NpdGlvbisrOworCQkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gb3Bjb2RlOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheShvcGNvZGUpOworCQl9CisJCWwxLmJyYW5jaCgpOworCQlMYWJlbCBsMiA9IG5ldyBMYWJlbCh0aGlzKTsKKwkJdGhpcy5pbnRlcm5hbF9nb3RvXyhsMik7CisJCWwxLnBsYWNlKCk7CisJCXRoaXMuZ290b193KGxibCk7CisJCWwyLnBsYWNlKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db25zdGFudFBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2IzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db25zdGFudFBvb2wuamF2YQpAQCAtMCwwICsxLDMxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CisKKy8qKgorICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudFBvb2wgaW1wbGVtZW50cyBDbGFzc0ZpbGVDb25zdGFudHMsIFR5cGVJZHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9JTklUSUFMX1NJWkUgPSA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUX0lOSVRJQUxfU0laRSA9IDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0lOSVRJQUxfU0laRSA9IDI0ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT05HX0lOSVRJQUxfU0laRSA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVRGOF9JTklUSUFMX1NJWkUgPSA3Nzg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0lOSVRJQUxfU0laRSA9IDc2MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9JTklUSUFMX1NJWkUgPSAxNTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0lOSVRJQUxfU0laRSA9IDIzNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUkZBQ0VfSU5JVElBTF9TSVpFID0gNTA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfSU5JVElBTF9TSVpFID0gODY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRUFORFRZUEVfSU5JVElBTF9TSVpFID0gMjcyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UUE9PTF9JTklUSUFMX1NJWkUgPSAyMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UUE9PTF9HUk9XX1NJWkUgPSA2MDAwOworCXByb3RlY3RlZCBEb3VibGVDYWNoZSBkb3VibGVDYWNoZTsKKwlwcm90ZWN0ZWQgRmxvYXRDYWNoZSBmbG9hdENhY2hlOworCXByb3RlY3RlZCBJbnRlZ2VyQ2FjaGUgaW50Q2FjaGU7CisJcHJvdGVjdGVkIExvbmdDYWNoZSBsb25nQ2FjaGU7CisJcHVibGljIENoYXJBcnJheUNhY2hlIFVURjhDYWNoZTsKKwlwcm90ZWN0ZWQgQ2hhckFycmF5Q2FjaGUgc3RyaW5nQ2FjaGU7CisJcHJvdGVjdGVkIE9iamVjdENhY2hlIGZpZWxkQ2FjaGU7CisJcHJvdGVjdGVkIE9iamVjdENhY2hlIG1ldGhvZENhY2hlOworCXByb3RlY3RlZCBPYmplY3RDYWNoZSBpbnRlcmZhY2VNZXRob2RDYWNoZTsKKwlwcm90ZWN0ZWQgT2JqZWN0Q2FjaGUgY2xhc3NDYWNoZTsKKwlwcm90ZWN0ZWQgRmllbGROYW1lQW5kVHlwZUNhY2hlIG5hbWVBbmRUeXBlQ2FjaGVGb3JGaWVsZHM7CisJcHJvdGVjdGVkIE1ldGhvZE5hbWVBbmRUeXBlQ2FjaGUgbmFtZUFuZFR5cGVDYWNoZUZvck1ldGhvZHM7CisJaW50W10gd2VsbEtub3duVHlwZXMgPSBuZXcgaW50WzIxXTsKKwlpbnRbXSB3ZWxsS25vd25NZXRob2RzID0gbmV3IGludFszNl07CisJaW50W10gd2VsbEtub3duRmllbGRzID0gbmV3IGludFsxMF07CisJaW50W10gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXMgPSBuZXcgaW50WzJdOworCWludFtdIHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlcyA9IG5ldyBpbnRbMzNdOworCXB1YmxpYyBieXRlW10gcG9vbENvbnRlbnQ7CisJcHVibGljIGludCBjdXJyZW50SW5kZXggPSAxOworCXB1YmxpYyBpbnQgY3VycmVudE9mZnNldDsKKwkvLyBwcmVkZWZpbmVkIGNvbnN0YW50IGluZGV4IGZvciB3ZWxsIGtub3duIHR5cGVzCisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfQk9PTEVBTl9UWVBFID0gMDsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19CWVRFX1RZUEUgPSAxOworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX0NIQVJBQ1RFUl9UWVBFID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19ET1VCTEVfVFlQRSA9IDM7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfRkxPQVRfVFlQRSA9IDQ7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfSU5URUdFUl9UWVBFID0gNTsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19MT05HX1RZUEUgPSA2OworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1NIT1JUX1RZUEUgPSA3OworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1ZPSURfVFlQRSA9IDg7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfQ0xBU1NfVFlQRSA9IDk7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfQ0xBU1NOT1RGT1VOREVYQ0VQVElPTl9UWVBFID0gMTA7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfTk9DTEFTU0RFRkZPVU5ERVJST1JfVFlQRSA9IDExOworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX09CSkVDVF9UWVBFID0gMTI7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfU1RSSU5HX1RZUEUgPSAxMzsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19TVFJJTkdCVUZGRVJfVFlQRSA9IDE0OworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1NZU1RFTV9UWVBFID0gMTU7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfVEhST1dBQkxFX1RZUEUgPSAxNjsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19FUlJPUl9UWVBFID0gMTc7CisJZmluYWwgc3RhdGljIGludCBKQVZBX0xBTkdfRVhDRVBUSU9OX1RZUEUgPSAxODsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SX1RZUEUgPSAxOTsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUl9UWVBFID0gMjA7CisJCisJLy8gcHJlZGVmaW5lZCBjb25zdGFudCBpbmRleCBmb3Igd2VsbCBrbm93biBmaWVsZHMgIAorCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9CWVRFX0ZJRUxEID0gMDsKKwlmaW5hbCBzdGF0aWMgaW50IFRZUEVfU0hPUlRfRklFTEQgPSAxOworCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9DSEFSQUNURVJfRklFTEQgPSAyOworCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9JTlRFR0VSX0ZJRUxEID0gMzsKKwlmaW5hbCBzdGF0aWMgaW50IFRZUEVfTE9OR19GSUVMRCA9IDQ7CisJZmluYWwgc3RhdGljIGludCBUWVBFX0ZMT0FUX0ZJRUxEID0gNTsKKwlmaW5hbCBzdGF0aWMgaW50IFRZUEVfRE9VQkxFX0ZJRUxEID0gNjsKKwlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9PTEVBTl9GSUVMRCA9IDc7CisJZmluYWwgc3RhdGljIGludCBUWVBFX1ZPSURfRklFTEQgPSA4OworCWZpbmFsIHN0YXRpYyBpbnQgT1VUX1NZU1RFTV9GSUVMRCA9IDk7CisJLy8gcHJlZGVmaW5lZCBjb25zdGFudCBpbmRleCBmb3Igd2VsbCBrbm93biBtZXRob2RzIAorCWZpbmFsIHN0YXRpYyBpbnQgRk9STkFNRV9DTEFTU19NRVRIT0QgPSAwOworCWZpbmFsIHN0YXRpYyBpbnQgTk9DTEFTU0RFRkZPVU5ERVJST1JfQ09OU1RSX01FVEhPRCA9IDE7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfSU5UX01FVEhPRCA9IDI7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfRkxPQVRfTUVUSE9EID0gMzsKKwlmaW5hbCBzdGF0aWMgaW50IEFQUEVORF9MT05HX01FVEhPRCA9IDQ7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfT0JKRUNUX01FVEhPRCA9IDU7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfQ0hBUl9NRVRIT0QgPSA2OworCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX1NUUklOR19NRVRIT0QgPSA3OworCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX0JPT0xFQU5fTUVUSE9EID0gODsKKwlmaW5hbCBzdGF0aWMgaW50IEFQUEVORF9ET1VCTEVfTUVUSE9EID0gOTsKKwlmaW5hbCBzdGF0aWMgaW50IFNUUklOR0JVRkZFUl9TVFJJTkdfQ09OU1RSX01FVEhPRCA9IDEwOworCWZpbmFsIHN0YXRpYyBpbnQgU1RSSU5HQlVGRkVSX0RFRkFVTFRfQ09OU1RSX01FVEhPRCA9IDExOworCWZpbmFsIHN0YXRpYyBpbnQgU1RSSU5HQlVGRkVSX1RPU1RSSU5HX01FVEhPRCA9IDEyOworCWZpbmFsIHN0YXRpYyBpbnQgU1lTVEVNX0VYSVRfTUVUSE9EID0gMTM7CisJZmluYWwgc3RhdGljIGludCBUSFJPV0FCTEVfR0VUTUVTU0FHRV9NRVRIT0QgPSAxNDsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFMQU5HRVJST1JfQ09OU1RSX01FVEhPRCA9IDE1OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EID0gMTY7CisJZmluYWwgc3RhdGljIGludCBORVdJTlNUQU5DRV9DT05TVFJVQ1RPUl9NRVRIT0QgPSAxNzsKKwlmaW5hbCBzdGF0aWMgaW50IFNUUklOR19JTlRFUk5fTUVUSE9EID0gMTg7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0lOVF9NRVRIT0QgPSAxOTsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfRkxPQVRfTUVUSE9EID0gMjA7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0xPTkdfTUVUSE9EID0gMjE7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX09CSkVDVF9NRVRIT0QgPSAyMjsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfQ0hBUl9NRVRIT0QgPSAyMzsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfQk9PTEVBTl9NRVRIT0QgPSAyNDsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfRE9VQkxFX01FVEhPRCA9IDI1OworCWZpbmFsIHN0YXRpYyBpbnQgQVNTRVJUSU9ORVJST1JfQ09OU1RSX09CSkVDVF9NRVRIT0QgPSAyNjsKKwlmaW5hbCBzdGF0aWMgaW50IEFTU0VSVElPTkVSUk9SX0NPTlNUUl9JTlRfTUVUSE9EID0gMjc7CisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfTE9OR19NRVRIT0QgPSAyODsKKwlmaW5hbCBzdGF0aWMgaW50IEFTU0VSVElPTkVSUk9SX0NPTlNUUl9GTE9BVF9NRVRIT0QgPSAyOTsKKwlmaW5hbCBzdGF0aWMgaW50IEFTU0VSVElPTkVSUk9SX0NPTlNUUl9ET1VCTEVfTUVUSE9EID0gMzA7CisJZmluYWwgc3RhdGljIGludCBBU1NFUlRJT05FUlJPUl9DT05TVFJfQk9PTEVBTl9NRVRIT0QgPSAzMTsKKwlmaW5hbCBzdGF0aWMgaW50IEFTU0VSVElPTkVSUk9SX0NPTlNUUl9DSEFSX01FVEhPRCA9IDMyOworCWZpbmFsIHN0YXRpYyBpbnQgQVNTRVJUSU9ORVJST1JfREVGQVVMVF9DT05TVFJfTUVUSE9EID0gMzM7CisJZmluYWwgc3RhdGljIGludCBERVNJUkVEQVNTRVJUSU9OU1RBVFVTX0NMQVNTX01FVEhPRCA9IDM0OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUQ0xBU1NfT0JKRUNUX01FVEhPRCA9IDM1OworCS8vIHByZWRlZmluZWQgY29uc3RhbnQgaW5kZXggZm9yIHdlbGwga25vd24gbmFtZSBhbmQgdHlwZSBmb3IgZmllbGRzCisJZmluYWwgc3RhdGljIGludCBUWVBFX0pBVkFMQU5HQ0xBU1NfTkFNRV9BTkRfVFlQRSA9IDA7CisJZmluYWwgc3RhdGljIGludCBPVVRfU1lTVEVNX05BTUVfQU5EX1RZUEUgPSAxOworCS8vIHByZWRlZmluZWQgY29uc3RhbnQgaW5kZXggZm9yIHdlbGwga25vd24gbmFtZSBhbmQgdHlwZSBmb3IgbWV0aG9kcworCWZpbmFsIHN0YXRpYyBpbnQgRk9STkFNRV9DTEFTU19NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDA7CisJZmluYWwgc3RhdGljIGludCBDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTsKKwlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IEFQUEVORF9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAzOworCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gNDsKKwlmaW5hbCBzdGF0aWMgaW50IEFQUEVORF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFID0gNTsKKwlmaW5hbCBzdGF0aWMgaW50IEFQUEVORF9PQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA2OworCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA3OworCWZpbmFsIHN0YXRpYyBpbnQgQVBQRU5EX1NUUklOR19NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDg7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDk7CisJZmluYWwgc3RhdGljIGludCBBUFBFTkRfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTA7CisJZmluYWwgc3RhdGljIGludCBUT1NUUklOR19NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDExOworCWZpbmFsIHN0YXRpYyBpbnQgRVhJVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDEyOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUTUVTU0FHRV9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDEzOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUQ09OU1RSVUNUT1JfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxNDsKKwlmaW5hbCBzdGF0aWMgaW50IE5FV0lOU1RBTkNFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTU7CisJZmluYWwgc3RhdGljIGludCBJTlRFUk5fTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxNjsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTc7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTg7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxOTsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjA7CisJZmluYWwgc3RhdGljIGludCBWQUxVRU9GX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyMTsKKwlmaW5hbCBzdGF0aWMgaW50IFZBTFVFT0ZfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDIyOworCWZpbmFsIHN0YXRpYyBpbnQgVkFMVUVPRl9ET1VCTEVfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyMzsKKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyNDsKKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjU7CisJZmluYWwgc3RhdGljIGludCBDT05TVFJfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyNjsKKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9ET1VCTEVfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyNzsKKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9PQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyODsKKwlmaW5hbCBzdGF0aWMgaW50IENPTlNUUl9DSEFSX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjk7CisJZmluYWwgc3RhdGljIGludCBDT05TVFJfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDMwOworCWZpbmFsIHN0YXRpYyBpbnQgREVTSVJFREFTU0VSVElPTlNUQVRVU19NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDMxOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUQ0xBU1NfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMzI7CisKKwkKKwlwdWJsaWMgQ2xhc3NGaWxlIGNsYXNzRmlsZTsKKworLyoqCisgKiBDb25zdGFudFBvb2wgY29uc3RydWN0b3IgY29tbWVudC4KKyAqLworcHVibGljIENvbnN0YW50UG9vbChDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJdGhpcy5VVEY4Q2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoVVRGOF9JTklUSUFMX1NJWkUpOworCXRoaXMuc3RyaW5nQ2FjaGUgPSBuZXcgQ2hhckFycmF5Q2FjaGUoU1RSSU5HX0lOSVRJQUxfU0laRSk7CisJdGhpcy5maWVsZENhY2hlID0gbmV3IE9iamVjdENhY2hlKEZJRUxEX0lOSVRJQUxfU0laRSk7CisJdGhpcy5tZXRob2RDYWNoZSA9IG5ldyBPYmplY3RDYWNoZShNRVRIT0RfSU5JVElBTF9TSVpFKTsKKwl0aGlzLmludGVyZmFjZU1ldGhvZENhY2hlID0gbmV3IE9iamVjdENhY2hlKElOVEVSRkFDRV9JTklUSUFMX1NJWkUpOworCXRoaXMuY2xhc3NDYWNoZSA9IG5ldyBPYmplY3RDYWNoZShDTEFTU19JTklUSUFMX1NJWkUpOworCXRoaXMubmFtZUFuZFR5cGVDYWNoZUZvck1ldGhvZHMgPSBuZXcgTWV0aG9kTmFtZUFuZFR5cGVDYWNoZShOQU1FQU5EVFlQRV9JTklUSUFMX1NJWkUpOworCXRoaXMubmFtZUFuZFR5cGVDYWNoZUZvckZpZWxkcyA9IG5ldyBGaWVsZE5hbWVBbmRUeXBlQ2FjaGUoTkFNRUFORFRZUEVfSU5JVElBTF9TSVpFKTsgICAKKwl0aGlzLnBvb2xDb250ZW50ID0gY2xhc3NGaWxlLmhlYWRlcjsKKwl0aGlzLmN1cnJlbnRPZmZzZXQgPSBjbGFzc0ZpbGUuaGVhZGVyT2Zmc2V0OworCS8vIGN1cnJlbnRPZmZzZXQgaXMgaW5pdGlhbGl6ZWQgdG8gMCBieSBkZWZhdWx0CisJdGhpcy5jdXJyZW50SW5kZXggPSAxOworCXRoaXMuY2xhc3NGaWxlID0gY2xhc3NGaWxlOworfQorLyoqCisgKiBSZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCisgKi8KK3B1YmxpYyBieXRlW10gZHVtcEJ5dGVzKCkgeworCVN5c3RlbS5hcnJheWNvcHkocG9vbENvbnRlbnQsIDAsIChwb29sQ29udGVudCA9IG5ldyBieXRlW2N1cnJlbnRPZmZzZXRdKSwgMCwgY3VycmVudE9mZnNldCk7CisJcmV0dXJuIHBvb2xDb250ZW50OworfQorLyoqCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBAZmllbGRCaW5kaW5nLgorICoKKyAqIFJldHVybnMgLTEgaWYgdGhlIEBmaWVsZEJpbmRpbmcgaXMgbm90IGEgcHJlZGVmaW5lZCBmaWVsZEJpbmRpbmcsIAorICogdGhlIHJpZ2h0IGluZGV4IG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gZmllbGRCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBpbmRleE9mV2VsbEtub3duRmllbGROYW1lQW5kVHlwZShGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7CisJaWYgKChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZEJpbmRpbmcubmFtZSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVFlQRSkpKQorCQlyZXR1cm4gVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEU7CisJaWYgKChmaWVsZEJpbmRpbmcudHlwZS5pZCA9PSBUX0phdmFJb1ByaW50U3RyZWFtKSAmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLk91dCkpKQorCQlyZXR1cm4gT1VUX1NZU1RFTV9OQU1FX0FORF9UWVBFOworCXJldHVybiAtMTsKK30KKy8qKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgQGZpZWxkQmluZGluZy4KKyAqCisgKiBSZXR1cm5zIC0xIGlmIHRoZSBAZmllbGRCaW5kaW5nIGlzIG5vdCBhIHByZWRlZmluZWQgZmllbGRCaW5kaW5nLCAKKyAqIHRoZSByaWdodCBpbmRleCBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIGZpZWxkQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgaW5kZXhPZldlbGxLbm93bkZpZWxkcyhGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nKSB7CisJc3dpdGNoIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQpIHsKKwkJY2FzZSBUX0phdmFMYW5nQnl0ZSA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpKQorCQkJCXJldHVybiBUWVBFX0JZVEVfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nU2hvcnQgOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkQmluZGluZy5uYW1lLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKSkKKwkJCQlyZXR1cm4gVFlQRV9TSE9SVF9GSUVMRDsKKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdDaGFyYWN0ZXIgOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkQmluZGluZy5uYW1lLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKSkKKwkJCQlyZXR1cm4gVFlQRV9DSEFSQUNURVJfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nSW50ZWdlciA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpKQorCQkJCXJldHVybiBUWVBFX0lOVEVHRVJfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nTG9uZyA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpKQorCQkJCXJldHVybiBUWVBFX0xPTkdfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nRmxvYXQgOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkQmluZGluZy5uYW1lLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKSkKKwkJCQlyZXR1cm4gVFlQRV9GTE9BVF9GSUVMRDsKKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdEb3VibGUgOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkQmluZGluZy5uYW1lLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKSkKKwkJCQlyZXR1cm4gVFlQRV9ET1VCTEVfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nQm9vbGVhbiA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpKQorCQkJCXJldHVybiBUWVBFX0JPT0xFQU5fRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nVm9pZCA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRCaW5kaW5nLm5hbWUsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpKQorCQkJCXJldHVybiBUWVBFX1ZPSURfRklFTEQ7CisJCQlicmVhazsKKwkJY2FzZSBUX0phdmFMYW5nU3lzdGVtIDoKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZEJpbmRpbmcubmFtZSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuT3V0KSkKKwkJCQlyZXR1cm4gT1VUX1NZU1RFTV9GSUVMRDsKKwl9CisJcmV0dXJuIC0xOworfQorLyoqCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBAbWV0aG9kQmluZGluZy4KKyAqCisgKiBSZXR1cm5zIC0xIGlmIHRoZSBAbWV0aG9kQmluZGluZyBpcyBub3QgYSBwcmVkZWZpbmVkIG1ldGhvZEJpbmRpbmcsIAorICogdGhlIHJpZ2h0IGluZGV4IG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGluZGV4T2ZXZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZShNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwljaGFyIGZpcnN0Q2hhciA9IG1ldGhvZEJpbmRpbmcuc2VsZWN0b3JbMF07CisJc3dpdGNoIChmaXJzdENoYXIpIHsKKwkJY2FzZSAnZicgOgorCQkJaWYgKChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Gb3JOYW1lKSkpIHsKKwkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGZvck5hbWUoamF2YS5sYW5nLlN0cmluZykKKwkJCQlyZXR1cm4gRk9STkFNRV9DTEFTU19NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc8JyA6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCkpIHsKKwkJCQlzd2l0Y2gobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCkgeworCQkJCQljYXNlIDE6CisJCQkJCQlzd2l0Y2gobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkKSB7CisJCQkJCQkJY2FzZSBUX1N0cmluZyA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5TdHJpbmdDb25zdHJ1Y3RvclNpZ25hdHVyZSkpIHsKKwkJCQkJCQkJCXJldHVybiBDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFOwkKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9PYmplY3QgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JPYmplY3RDb25zdHJTaWduYXR1cmUpKSB7CisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JJbnRDb25zdHJTaWduYXR1cmUpKSB7CisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yQ2hhckNvbnN0clNpZ25hdHVyZSkpIHsKKwkJCQkJCQkJCXJldHVybiBDT05TVFJfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yQm9vbGVhbkNvbnN0clNpZ25hdHVyZSkpIHsKKwkJCQkJCQkJCXJldHVybiBDT05TVFJfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckZsb2F0Q29uc3RyU2lnbmF0dXJlKSkgeworCQkJCQkJCQkJcmV0dXJuIENPTlNUUl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JEb3VibGVDb25zdHJTaWduYXR1cmUpKSB7CisJCQkJCQkJCQlyZXR1cm4gQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yTG9uZ0NvbnN0clNpZ25hdHVyZSkpIHsKKwkJCQkJCQkJCXJldHVybiBDT05TVFJfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCQkJfQorCQkJCQkJfQorCQkJCQljYXNlIDA6CisJCQkJCQlpZiAobWV0aG9kQmluZGluZy5zaWduYXR1cmUoKS5sZW5ndGggPT0gMykgeworCQkJCQkJCXJldHVybiBERUZBVUxUX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYScgOgorCQkJaWYgKChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1N0cmluZ0J1ZmZlcikgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZCkpKSB7CisJCQkJc3dpdGNoIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQpIHsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgYXBwZW5kKGludCkKKwkJCQkJCXJldHVybiBBUFBFTkRfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBhcHBlbmQoZmxvYXQpCisJCQkJCQlyZXR1cm4gQVBQRU5EX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChsb25nKQorCQkJCQkJcmV0dXJuIEFQUEVORF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgorCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBhcHBlbmQoamF2YS5sYW5nLk9iamVjdCkKKwkJCQkJCXJldHVybiBBUFBFTkRfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChjaGFyKQorCQkJCQkJcmV0dXJuIEFQUEVORF9DSEFSX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBhcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKwkJCQkJCXJldHVybiBBUFBFTkRfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChib29sZWFuKQorCQkJCQkJcmV0dXJuIEFQUEVORF9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfZG91YmxlIDoKKwkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgYXBwZW5kKGRvdWJsZSkKKwkJCQkJCXJldHVybiBBUFBFTkRfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd0JyA6CisJCQlpZiAoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMCkgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSAmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVG9TdHJpbmcpKSkgeworCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgdG9TdHJpbmcoKQorCQkJCXJldHVybiBUT1NUUklOR19NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd2JyA6CisJCQlpZiAoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMSkgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSAmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVmFsdWVPZikpKSB7CisJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCkgeworCQkJCQljYXNlIFRfT2JqZWN0OgorCQkJCQkJcmV0dXJuIFZBTFVFT0ZfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfaW50OgorCQkJCQljYXNlIFRfc2hvcnQ6CisJCQkJCWNhc2UgVF9ieXRlOgorCQkJCQkJcmV0dXJuIFZBTFVFT0ZfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfbG9uZzoKKwkJCQkJCXJldHVybiBWQUxVRU9GX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCWNhc2UgVF9mbG9hdDoKKwkJCQkJCXJldHVybiBWQUxVRU9GX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfZG91YmxlOgorCQkJCQkJcmV0dXJuIFZBTFVFT0ZfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQljYXNlIFRfYm9vbGVhbjoKKwkJCQkJCXJldHVybiBWQUxVRU9GX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCWNhc2UgVF9jaGFyOgorCQkJCQkJcmV0dXJuIFZBTFVFT0ZfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnZScgOgorCQkJaWYgKChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9pbnQpICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkKSAmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRXhpdCkpKSB7CisJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBleGl0KGludCkKKwkJCQlyZXR1cm4gRVhJVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdnJyA6CisJCQlpZiAoKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IubGVuZ3RoID09IDEwKQorCQkJICAgICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDApCisJCQkgICAgJiYgKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKQorCQkJICAgICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5HZXRNZXNzYWdlKSkpIHsKKwkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGdldE1lc3NhZ2UoKQorCQkJCXJldHVybiBHRVRNRVNTQUdFX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJfQorCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5HZXRDbGFzcykpIHsKKwkJCQkJcmV0dXJuIEdFVENMQVNTX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCX0JCQkJCisJCQlicmVhazsKKwkJY2FzZSAnaScgOgorCQkJaWYgKChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDApICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkludGVybikpKSB7CisJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyB0b1N0cmluZygpCisJCQkJcmV0dXJuIElOVEVSTl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCX0gICAgICAgCisJfQorCXJldHVybiAtMTsKK30KKy8qKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgQG1ldGhvZEJpbmRpbmcuCisgKgorICogUmV0dXJucyAtMSBpZiB0aGUgQG1ldGhvZEJpbmRpbmcgaXMgbm90IGEgcHJlZGVmaW5lZCBtZXRob2RCaW5kaW5nLCAKKyAqIHRoZSByaWdodCBpbmRleCBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIG1ldGhvZEJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBpbmRleE9mV2VsbEtub3duTWV0aG9kcyhNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwljaGFyIGZpcnN0Q2hhciA9IG1ldGhvZEJpbmRpbmcuc2VsZWN0b3JbMF07CisJc3dpdGNoIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkKSB7CisJCWNhc2UgVF9KYXZhTGFuZ0NsYXNzIDoKKwkJCWlmICgoZmlyc3RDaGFyID09ICdmJykgJiYgKG1ldGhvZEJpbmRpbmcuaXNTdGF0aWMoKSkgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMSkgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdDbGFzcykgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkZvck5hbWUpKSkgeworCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgZm9yTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorCQkJCXJldHVybiBGT1JOQU1FX0NMQVNTX01FVEhPRDsKKwkJCX0gZWxzZSBpZiAoKGZpcnN0Q2hhciA9PSAnZycpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvcikgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuR2V0Q29uc3RydWN0b3IpICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5jb25zdGFudFBvb2xOYW1lKCksIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFycmF5SmF2YUxhbmdDbGFzc0NvbnN0YW50UG9vbE5hbWUpKSB7CisJCQkJCXJldHVybiBHRVRDT05TVFJVQ1RPUl9DTEFTU19NRVRIT0Q7CisJCQl9IGVsc2UgaWYgKChmaXJzdENoYXIgPT0gJ2QnKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfYm9vbGVhbikgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRGVzaXJlZEFzc2VydGlvblN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIERFU0lSRURBU1NFUlRJT05TVEFUVVNfQ0xBU1NfTUVUSE9EOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9KYXZhTGFuZ05vQ2xhc3NEZWZFcnJvciA6CisJCQlpZiAoKGZpcnN0Q2hhciA9PSAnPCcpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpKSkgeworCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgTm9DbGFzc0RlZkZvdW5kRXJyb3IoamF2YS5sYW5nLlN0cmluZykKKwkJCQlyZXR1cm4gTk9DTEFTU0RFRkZPVU5ERVJST1JfQ09OU1RSX01FVEhPRDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IgOgorCQkJaWYgKChmaXJzdENoYXIgPT0gJ24nKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QpICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLk5ld0luc3RhbmNlKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uY29uc3RhbnRQb29sTmFtZSgpLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcnJheUphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSkpIHsKKwkJCQlyZXR1cm4gTkVXSU5TVEFOQ0VfQ09OU1RSVUNUT1JfTUVUSE9EOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZ0J1ZmZlciA6CisJCQlpZiAoKGZpcnN0Q2hhciA9PSAnYScpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1N0cmluZ0J1ZmZlcikgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZCkpKSB7CisJCQkJc3dpdGNoIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQpIHsKKwkJCQkJY2FzZSBUX2ludCA6CisJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgYXBwZW5kKGludCkKKwkJCQkJCXJldHVybiBBUFBFTkRfSU5UX01FVEhPRDsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgYXBwZW5kKGZsb2F0KQorCQkJCQkJcmV0dXJuIEFQUEVORF9GTE9BVF9NRVRIT0Q7CisJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgYXBwZW5kKGxvbmcpCisJCQkJCQlyZXR1cm4gQVBQRU5EX0xPTkdfTUVUSE9EOworCQkJCQljYXNlIFRfSmF2YUxhbmdPYmplY3QgOgorCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBhcHBlbmQoamF2YS5sYW5nLk9iamVjdCkKKwkJCQkJCXJldHVybiBBUFBFTkRfT0JKRUNUX01FVEhPRDsKKwkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyBhcHBlbmQoY2hhcikKKwkJCQkJCXJldHVybiBBUFBFTkRfQ0hBUl9NRVRIT0Q7CisJCQkJCWNhc2UgVF9KYXZhTGFuZ1N0cmluZyA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorCQkJCQkJcmV0dXJuIEFQUEVORF9TVFJJTkdfTUVUSE9EOworCQkJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChib29sZWFuKQorCQkJCQkJcmV0dXJuIEFQUEVORF9CT09MRUFOX01FVEhPRDsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIGFwcGVuZChkb3VibGUpCisJCQkJCQlyZXR1cm4gQVBQRU5EX0RPVUJMRV9NRVRIT0Q7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaWYgKChmaXJzdENoYXIgPT0gJ3QnKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdTdHJpbmcpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Ub1N0cmluZykpKSB7CisJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgdG9TdHJpbmcoKQorCQkJCQlyZXR1cm4gU1RSSU5HQlVGRkVSX1RPU1RSSU5HX01FVEhPRDsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKChmaXJzdENoYXIgPT0gJzwnKSAmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCkpKSB7CisJCQkJCQlpZiAoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMSkgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nKSkgeworCQkJCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgPGluaXQ+KFN0cmluZykgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCXJldHVybiBTVFJJTkdCVUZGRVJfU1RSSU5HX0NPTlNUUl9NRVRIT0Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDApIHsKKwkJCQkJCQkJLy8gVGhpcyBtZXRob2QgYmluZGluZyBpcyA8aW5pdD4oKQorCQkJCQkJCQlyZXR1cm4gU1RSSU5HQlVGRkVSX0RFRkFVTFRfQ09OU1RSX01FVEhPRDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdTdHJpbmcgOgorCQkJaWYgKChmaXJzdENoYXIgPT0gJ3YnKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdTdHJpbmcpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5WYWx1ZU9mKSkpIHsKKwkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIHZhbHVlT2YoamF2YS5sYW5nLk9iamVjdCkKKwkJCQlzd2l0Y2ggKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCkgeworCQkJCQljYXNlIFRfT2JqZWN0IDoKKwkJCQkJCXJldHVybiBWQUxVRU9GX09CSkVDVF9NRVRIT0Q7CisJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQlyZXR1cm4gVkFMVUVPRl9JTlRfTUVUSE9EOworCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlyZXR1cm4gVkFMVUVPRl9MT05HX01FVEhPRDsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCXJldHVybiBWQUxVRU9GX0ZMT0FUX01FVEhPRDsKKwkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQlyZXR1cm4gVkFMVUVPRl9ET1VCTEVfTUVUSE9EOworCQkJCQljYXNlIFRfYm9vbGVhbiA6CisJCQkJCQlyZXR1cm4gVkFMVUVPRl9CT09MRUFOX01FVEhPRDsKKwkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJcmV0dXJuIFZBTFVFT0ZfQ0hBUl9NRVRIT0Q7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaWYgKChmaXJzdENoYXIgPT0gJ2knKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdTdHJpbmcpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5JbnRlcm4pKSkgeworCQkJCQkvLyBUaGlzIG1ldGhvZCBiaW5kaW5nIGlzIHZhbHVlT2YoamF2YS5sYW5nLk9iamVjdCkKKwkJCQkJcmV0dXJuIFNUUklOR19JTlRFUk5fTUVUSE9EOworCQkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdTeXN0ZW0gOgorCQkJaWYgKChmaXJzdENoYXIgPT0gJ2UnKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSAmJiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkID09IFRfaW50KSAmJiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZCkgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkV4aXQpKSkgeworCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgZXhpdChpbnQpCisJCQkJcmV0dXJuIFNZU1RFTV9FWElUX01FVEhPRDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdUaHJvd2FibGUgOgorCQkJaWYgKChmaXJzdENoYXIgPT0gJ2cnKSAmJiAobWV0aG9kQmluZGluZy5zZWxlY3Rvci5sZW5ndGggPT0gMTApICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDApICYmIChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9KYXZhTGFuZ1N0cmluZykgJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkdldE1lc3NhZ2UpKSkgeworCQkJCS8vIFRoaXMgbWV0aG9kIGJpbmRpbmcgaXMgZ2V0TWVzc2FnZSgpCisJCQkJcmV0dXJuIFRIUk9XQUJMRV9HRVRNRVNTQUdFX01FVEhPRDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfSmF2YUxhbmdFcnJvciA6CisJCQlpZiAoKGZpcnN0Q2hhciA9PSAnPCcpICYmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEpICYmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KSkgJiYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX1N0cmluZykpIHsKKwkJCQlyZXR1cm4gSkFWQUxBTkdFUlJPUl9DT05TVFJfTUVUSE9EOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yIDoKKwkJCWlmICgoZmlyc3RDaGFyID09ICc8JykgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCkpIHsKKwkJCQlzd2l0Y2ggKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGgpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJcmV0dXJuIEFTU0VSVElPTkVSUk9SX0RFRkFVTFRfQ09OU1RSX01FVEhPRDsKKwkJCQkJY2FzZSAxOgorCQkJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCkgeworCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJcmV0dXJuIEFTU0VSVElPTkVSUk9SX0NPTlNUUl9CT09MRUFOX01FVEhPRDsKKwkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfQ0hBUl9NRVRIT0Q7CisJCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfRE9VQkxFX01FVEhPRDsKKwkJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQljYXNlIFRfYnl0ZSA6CisJCQkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCQkJcmV0dXJuIEFTU0VSVElPTkVSUk9SX0NPTlNUUl9JTlRfTUVUSE9EOworCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCXJldHVybiBBU1NFUlRJT05FUlJPUl9DT05TVFJfRkxPQVRfTUVUSE9EOworCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJcmV0dXJuIEFTU0VSVElPTkVSUk9SX0NPTlNUUl9MT05HX01FVEhPRDsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlyZXR1cm4gQVNTRVJUSU9ORVJST1JfQ09OU1RSX09CSkVDVF9NRVRIT0Q7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9KYXZhTGFuZ09iamVjdCA6CisJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuR2V0Q2xhc3MpKSB7CisJCQkJCXJldHVybiBHRVRDTEFTU19PQkpFQ1RfTUVUSE9EOworCQkJfQkJCQorCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIEB0eXBlQmluZGluZworICoKKyAqIFJldHVybnMgLTEgaWYgdGhlIEB0eXBlQmluZGluZyBpcyBub3QgYSBwcmVkZWZpbmVkIGJpbmRpbmcsIHRoZSByaWdodCBpbmRleCAKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdHlwZUJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgaW5kZXhPZldlbGxLbm93blR5cGVzKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJc3dpdGNoKHR5cGVCaW5kaW5nLmlkKSB7CisJCWNhc2UgVF9KYXZhTGFuZ0Jvb2xlYW4gOiByZXR1cm4gSkFWQV9MQU5HX0JPT0xFQU5fVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nQnl0ZSA6IHJldHVybiBKQVZBX0xBTkdfQllURV9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdDaGFyYWN0ZXIgOiByZXR1cm4gSkFWQV9MQU5HX0NIQVJBQ1RFUl9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdEb3VibGUgOiByZXR1cm4gSkFWQV9MQU5HX0RPVUJMRV9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdGbG9hdCA6IHJldHVybiBKQVZBX0xBTkdfRkxPQVRfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nSW50ZWdlciA6IHJldHVybiBKQVZBX0xBTkdfSU5URUdFUl9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdMb25nIDogcmV0dXJuIEpBVkFfTEFOR19MT05HX1RZUEU7CisJCWNhc2UgVF9KYXZhTGFuZ1Nob3J0IDogcmV0dXJuIEpBVkFfTEFOR19TSE9SVF9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdWb2lkIDogcmV0dXJuIEpBVkFfTEFOR19WT0lEX1RZUEU7CisJCWNhc2UgVF9KYXZhTGFuZ0NsYXNzIDogcmV0dXJuIEpBVkFfTEFOR19DTEFTU19UWVBFOworCQljYXNlIFRfSmF2YUxhbmdDbGFzc05vdEZvdW5kRXhjZXB0aW9uIDogcmV0dXJuIEpBVkFfTEFOR19DTEFTU05PVEZPVU5ERVhDRVBUSU9OX1RZUEU7CisJCWNhc2UgVF9KYXZhTGFuZ05vQ2xhc3NEZWZFcnJvciA6IHJldHVybiBKQVZBX0xBTkdfTk9DTEFTU0RFRkZPVU5ERVJST1JfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nT2JqZWN0IDogcmV0dXJuIEpBVkFfTEFOR19PQkpFQ1RfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nU3RyaW5nIDogcmV0dXJuIEpBVkFfTEFOR19TVFJJTkdfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nU3RyaW5nQnVmZmVyIDogcmV0dXJuIEpBVkFfTEFOR19TVFJJTkdCVUZGRVJfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nU3lzdGVtIDogcmV0dXJuIEpBVkFfTEFOR19TWVNURU1fVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nVGhyb3dhYmxlIDogcmV0dXJuIEpBVkFfTEFOR19USFJPV0FCTEVfVFlQRTsKKwkJY2FzZSBUX0phdmFMYW5nRXJyb3IgOiByZXR1cm4gSkFWQV9MQU5HX0VSUk9SX1RZUEU7CisJCWNhc2UgVF9KYXZhTGFuZ0V4Y2VwdGlvbiA6IHJldHVybiBKQVZBX0xBTkdfRVhDRVBUSU9OX1RZUEU7CisJCWNhc2UgVF9KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvciA6IHJldHVybiBKQVZBX0xBTkdfUkVGTEVDVF9DT05TVFJVQ1RPUl9UWVBFOworCQljYXNlIFRfSmF2YUxhbmdBc3NlcnRpb25FcnJvciA6IHJldHVybiBKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1JfVFlQRTsKKwl9CisJcmV0dXJuIC0xOworfQorcHVibGljIGludCBsaXRlcmFsSW5kZXgoYnl0ZVtdIHV0ZjhlbmNvZGluZywgY2hhcltdIHN0cmluZ0NoYXJBcnJheSkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gVVRGOENhY2hlLmdldChzdHJpbmdDaGFyQXJyYXkpKSA8IDApIHsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJaW5kZXggPSBVVEY4Q2FjaGUucHV0KHN0cmluZ0NoYXJBcnJheSwgY3VycmVudEluZGV4KTsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJY3VycmVudEluZGV4Kys7CisJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJd3JpdGVVMShVdGY4VGFnKTsKKwkJLy8gVGhlbiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nTmFtZSBhcnJheQorCQkvL3dyaXRlVTIodXRmOENvbnN0YW50Lmxlbmd0aCk7CisJCWludCBzYXZlZEN1cnJlbnRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0OworCQlpZiAoY3VycmVudE9mZnNldCArIDIgPj0gcG9vbENvbnRlbnQubGVuZ3RoKSB7CisJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCisJCQkvLyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIGxlbmd0aAorCQkJaW50IGxlbmd0aCA9IHBvb2xDb250ZW50Lmxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkocG9vbENvbnRlbnQsIDAsIChwb29sQ29udGVudCA9IG5ldyBieXRlW2xlbmd0aCArIENPTlNUQU5UUE9PTF9HUk9XX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJfQorCQljdXJyZW50T2Zmc2V0ICs9IDI7CisJCS8vIGFkZCBpbiBvbmNlIHRoZSB3aG9sZSBieXRlIGFycmF5CisJCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7CisJCWludCB1dGY4ZW5jb2RpbmdMZW5ndGggPSB1dGY4ZW5jb2RpbmcubGVuZ3RoOworCQlpZiAoY3VycmVudE9mZnNldCArIHV0ZjhlbmNvZGluZ0xlbmd0aCA+PSBsZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkocG9vbENvbnRlbnQsIDAsIChwb29sQ29udGVudCA9IG5ldyBieXRlW2xlbmd0aCArIHV0ZjhlbmNvZGluZ0xlbmd0aCArIENPTlNUQU5UUE9PTF9HUk9XX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KHV0ZjhlbmNvZGluZywgMCwgcG9vbENvbnRlbnQsIGN1cnJlbnRPZmZzZXQsIHV0ZjhlbmNvZGluZ0xlbmd0aCk7CisJCWN1cnJlbnRPZmZzZXQgKz0gdXRmOGVuY29kaW5nTGVuZ3RoOworCQkvLyBOb3cgd2Uga25vdyB0aGUgbGVuZ3RoIHRoYXQgd2UgaGF2ZSB0byB3cml0ZSBpbiB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyB3ZSB1c2Ugc2F2ZWRDdXJyZW50T2Zmc2V0IHRvIGRvIHRoYXQKKwkJcG9vbENvbnRlbnRbc2F2ZWRDdXJyZW50T2Zmc2V0XSA9IChieXRlKSAodXRmOGVuY29kaW5nTGVuZ3RoID4+IDgpOworCQlwb29sQ29udGVudFtzYXZlZEN1cnJlbnRPZmZzZXQgKyAxXSA9IChieXRlKSB1dGY4ZW5jb2RpbmdMZW5ndGg7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gY2hhcltdIHN0cmluZ05hbWUKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleChjaGFyW10gdXRmOENvbnN0YW50KSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSBVVEY4Q2FjaGUuZ2V0KHV0ZjhDb25zdGFudCkpIDwgMCkgeworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQkvLyBXcml0ZSB0aGUgdGFnIGZpcnN0CisJCXdyaXRlVTEoVXRmOFRhZyk7CisJCS8vIFRoZW4gdGhlIHNpemUgb2YgdGhlIHN0cmluZ05hbWUgYXJyYXkKKwkJaW50IHNhdmVkQ3VycmVudE9mZnNldCA9IGN1cnJlbnRPZmZzZXQ7CisJCWlmIChjdXJyZW50T2Zmc2V0ICsgMiA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCS8vIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBwb29sQ29udGVudCBhcnJheSBiZWNhdXNlIHdlIHdvbid0IGhhdmUKKwkJCS8vIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgbGVuZ3RoCisJCQlpbnQgbGVuZ3RoID0gcG9vbENvbnRlbnQubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShwb29sQ29udGVudCwgMCwgKHBvb2xDb250ZW50ID0gbmV3IGJ5dGVbbGVuZ3RoICsgQ09OU1RBTlRQT09MX0dST1dfU0laRV0pLCAwLCBsZW5ndGgpOworCQl9CisJCWN1cnJlbnRPZmZzZXQgKz0gMjsKKwkJaW50IGxlbmd0aCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdXRmOENvbnN0YW50Lmxlbmd0aDsgaSsrKSB7CisJCQljaGFyIGN1cnJlbnQgPSB1dGY4Q29uc3RhbnRbaV07CisJCQlpZiAoKGN1cnJlbnQgPj0gMHgwMDAxKSAmJiAoY3VycmVudCA8PSAweDAwN0YpKSB7CisJCQkJLy8gd2Ugb25seSBuZWVkIG9uZSBieXRlOiBBU0NJSSB0YWJsZQorCQkJCXdyaXRlVTEoY3VycmVudCk7CisJCQkJbGVuZ3RoKys7CisJCQl9IGVsc2UKKwkJCQlpZiAoY3VycmVudCA+IDB4MDdGRikgeworCQkJCQkvLyB3ZSBuZWVkIDMgYnl0ZXMKKwkJCQkJbGVuZ3RoICs9IDM7CisJCQkJCXdyaXRlVTEoMHhFMCB8ICgoY3VycmVudCA+PiAxMikgJiAweDBGKSk7IC8vIDB4RTAgPSAxMTEwIDAwMDAKKwkJCQkJd3JpdGVVMSgweDgwIHwgKChjdXJyZW50ID4+IDYpICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCXdyaXRlVTEoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gd2UgY2FuIGJlIDAgb3IgYmV0d2VlbiAweDAwODAgYW5kIDB4MDdGRgorCQkJCQkvLyBJbiB0aGF0IGNhc2Ugd2Ugb25seSBuZWVkIDIgYnl0ZXMKKwkJCQkJbGVuZ3RoICs9IDI7CisJCQkJCXdyaXRlVTEoMHhDMCB8ICgoY3VycmVudCA+PiA2KSAmIDB4MUYpKTsgLy8gMHhDMCA9IDExMDAgMDAwMAorCQkJCQl3cml0ZVUxKDB4ODAgfCAoY3VycmVudCAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCX0KKwkJfQorCQlpZiAobGVuZ3RoID49IDY1NTM1KSB7CisJCQljdXJyZW50T2Zmc2V0ID0gc2F2ZWRDdXJyZW50T2Zmc2V0IC0gMTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpbmRleCA9IFVURjhDYWNoZS5wdXQodXRmOENvbnN0YW50LCBjdXJyZW50SW5kZXgpOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQljdXJyZW50SW5kZXgrKzsgICAgIAorCQkvLyBOb3cgd2Uga25vdyB0aGUgbGVuZ3RoIHRoYXQgd2UgaGF2ZSB0byB3cml0ZSBpbiB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyB3ZSB1c2Ugc2F2ZWRDdXJyZW50T2Zmc2V0IHRvIGRvIHRoYXQKKwkJcG9vbENvbnRlbnRbc2F2ZWRDdXJyZW50T2Zmc2V0XSA9IChieXRlKSAobGVuZ3RoID4+IDgpOworCQlwb29sQ29udGVudFtzYXZlZEN1cnJlbnRPZmZzZXQgKyAxXSA9IChieXRlKSBsZW5ndGg7CisJfQorCXJldHVybiBpbmRleDsKK30KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGNoYXJbXSBzdHJpbmdDaGFyQXJyYXksIGJ5dGVbXSB1dGY4ZW5jb2RpbmcpIHsKKwlpbnQgaW5kZXg7CisJaW50IHN0cmluZ0luZGV4OworCWlmICgoaW5kZXggPSBzdHJpbmdDYWNoZS5nZXQoc3RyaW5nQ2hhckFycmF5KSkgPCAwKSB7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCXN0cmluZ0luZGV4ID0gbGl0ZXJhbEluZGV4KHV0ZjhlbmNvZGluZywgc3RyaW5nQ2hhckFycmF5KTsKKwkJaW5kZXggPSBzdHJpbmdDYWNoZS5wdXQoc3RyaW5nQ2hhckFycmF5LCBjdXJyZW50SW5kZXgrKyk7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJd3JpdGVVMShTdHJpbmdUYWcpOworCQkvLyBUaGVuIHRoZSBzdHJpbmcgaW5kZXgKKwkJd3JpdGVVMihzdHJpbmdJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRvdWJsZQorICogdmFsdWUuIElmIHRoZSBkb3VibGUgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlIAorICogZG91YmxlIGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgorICoKKyAqIEBwYXJhbSA8Q09ERT5kb3VibGU8L0NPREU+IGtleQorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGRvdWJsZSBrZXkpIHsKKwkvL1JldHJpZXZlIHRoZSBpbmRleCBmcm9tIHRoZSBjYWNoZQorCS8vIFRoZSBkb3VibGUgY29uc3RhbnQgdGFrZXMgdHdvIGluZGV4ZXMgaW50byB0aGUgY29uc3RhbnQgcG9vbCwgYnV0IHdlIG9ubHkgc3RvcmUKKwkvLyB0aGUgZmlyc3QgaW5kZXggaW50byB0aGUgbG9uZyB0YWJsZQorCWludCBpbmRleDsKKwkvLyBsYXp5IGluaXRpYWxpemF0aW9uIGZvciBiYXNlIHR5cGUgY2FjaGVzCisJLy8gSWYgaXQgaXMgbnVsbCwgaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHVzZSBpdAorCWlmIChkb3VibGVDYWNoZSA9PSBudWxsKSB7CisJCQlkb3VibGVDYWNoZSA9IG5ldyBEb3VibGVDYWNoZShET1VCTEVfSU5JVElBTF9TSVpFKTsKKwl9CisJaWYgKChpbmRleCA9IGRvdWJsZUNhY2hlLmdldChrZXkpKSA8IDApIHsKKwkJaW5kZXggPSBkb3VibGVDYWNoZS5wdXQoa2V5LCBjdXJyZW50SW5kZXgrKyk7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCWN1cnJlbnRJbmRleCsrOyAvLyBhIGRvdWJsZSBuZWVkcyBhbiBleHRyYSBwbGFjZSBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIFdyaXRlIHRoZSBkb3VibGUgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKERvdWJsZVRhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZG91YmxlCisJCWxvbmcgdGVtcCA9IGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhrZXkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiAoNTYgLSAoaSA8PCAzKSkpOworCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vY3VycmVudE9mZnNldCBoYXMgYmVlbiArKyBhbHJlYWR5IChzZWUgdGhlIC0xKQorCQkJCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShwb29sQ29udGVudCwgMCwgKHBvb2xDb250ZW50ID0gbmV3IGJ5dGVbKGxlbmd0aCA8PCAxKSArIENPTlNUQU5UUE9PTF9JTklUSUFMX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0IC0gMV0gPSAoYnl0ZSkgKHRlbXAgPj4+ICg1NiAtIChpIDw8IDMpKSk7CisJCQl9CisJCX0KKwl9OworCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZsb2F0CisgKiB2YWx1ZS4gSWYgdGhlIGZsb2F0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW50byB0aGUgcG9vbCwgaXQgaXMgYWRkZWQuIFRoZSAKKyAqIGludCBjYWNoZSBpcyB1cGRhdGVkIGFuZCBpdCByZXR1cm5zIHRoZSByaWdodCBpbmRleC4KKyAqCisgKiBAcGFyYW0gPENPREU+ZmxvYXQ8L0NPREU+IGtleQorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGZsb2F0IGtleSkgeworCS8vUmV0cmlldmUgdGhlIGluZGV4IGZyb20gdGhlIGNhY2hlCisJaW50IGluZGV4OworCS8vIGxhenkgaW5pdGlhbGl6YXRpb24gZm9yIGJhc2UgdHlwZSBjYWNoZXMKKwkvLyBJZiBpdCBpcyBudWxsLCBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdXNlIGl0CisJaWYgKGZsb2F0Q2FjaGUgPT0gbnVsbCkgeworCQlmbG9hdENhY2hlID0gbmV3IEZsb2F0Q2FjaGUoRkxPQVRfSU5JVElBTF9TSVpFKTsKKwl9CisJaWYgKChpbmRleCA9IGZsb2F0Q2FjaGUuZ2V0KGtleSkpIDwgMCkgeworCQlpbmRleCA9IGZsb2F0Q2FjaGUucHV0KGtleSwgY3VycmVudEluZGV4KyspOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgZmxvYXQgY29uc3RhbnQgZW50cnkgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKEZsb2F0VGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDQgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBmbG9hdAorCQlpbnQgdGVtcCA9IGphdmEubGFuZy5GbG9hdC5mbG9hdFRvSW50Qml0cyhrZXkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpICh0ZW1wID4+PiAoMjQgLSBpICogOCkpOworCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vY3VycmVudE9mZnNldCBoYXMgYmVlbiArKyBhbHJlYWR5IChzZWUgdGhlIC0xKQorCQkJCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShwb29sQ29udGVudCwgMCwgKHBvb2xDb250ZW50ID0gbmV3IGJ5dGVbbGVuZ3RoICogMiArIENPTlNUQU5UUE9PTF9JTklUSUFMX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0IC0gMV0gPSAoYnl0ZSkgKHRlbXAgPj4+ICgyNCAtIGkgKiA4KSk7CisJCQl9CisJCX0KKwl9OworCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludAorICogdmFsdWUuIElmIHRoZSBpbnQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbnRvIHRoZSBwb29sLCBpdCBpcyBhZGRlZC4gVGhlIAorICogaW50IGNhY2hlIGlzIHVwZGF0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHJpZ2h0IGluZGV4LgorICoKKyAqIEBwYXJhbSA8Q09ERT5pbnQ8L0NPREU+IGtleQorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGludCBrZXkpIHsKKwkvL1JldHJpZXZlIHRoZSBpbmRleCBmcm9tIHRoZSBjYWNoZQorCWludCBpbmRleDsKKwkvLyBsYXp5IGluaXRpYWxpemF0aW9uIGZvciBiYXNlIHR5cGUgY2FjaGVzCisJLy8gSWYgaXQgaXMgbnVsbCwgaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHVzZSBpdAorCWlmIChpbnRDYWNoZSA9PSBudWxsKSB7CisJCWludENhY2hlID0gbmV3IEludGVnZXJDYWNoZShJTlRfSU5JVElBTF9TSVpFKTsKKwl9CisJaWYgKChpbmRleCA9IGludENhY2hlLmdldChrZXkpKSA8IDApIHsKKwkJaW5kZXggPSBpbnRDYWNoZS5wdXQoa2V5LCBjdXJyZW50SW5kZXgrKyk7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBpbnRlZ2VyIGNvbnN0YW50IGVudHJ5IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShJbnRlZ2VyVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDQgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBpbnQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXRyeSB7CisJCQkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAoa2V5ID4+PiAoMjQgLSBpICogOCkpOworCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vY3VycmVudE9mZnNldCBoYXMgYmVlbiArKyBhbHJlYWR5IChzZWUgdGhlIC0xKQorCQkJCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShwb29sQ29udGVudCwgMCwgKHBvb2xDb250ZW50ID0gbmV3IGJ5dGVbbGVuZ3RoICogMiArIENPTlNUQU5UUE9PTF9JTklUSUFMX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0IC0gMV0gPSAoYnl0ZSkgKGtleSA+Pj4gKDI0IC0gaSAqIDgpKTsKKwkJCX0KKwkJfQorCX07CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgbG9uZworICogdmFsdWUuIElmIHRoZSBsb25nIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW50byB0aGUgcG9vbCwgaXQgaXMgYWRkZWQuIFRoZSAKKyAqIGxvbmcgY2FjaGUgaXMgdXBkYXRlZCBhbmQgaXQgcmV0dXJucyB0aGUgcmlnaHQgaW5kZXguCisgKgorICogQHBhcmFtIDxDT0RFPmxvbmc8L0NPREU+IGtleQorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KGxvbmcga2V5KSB7CisJLy8gUmV0cmlldmUgdGhlIGluZGV4IGZyb20gdGhlIGNhY2hlCisJLy8gVGhlIGxvbmcgY29uc3RhbnQgdGFrZXMgdHdvIGluZGV4ZXMgaW50byB0aGUgY29uc3RhbnQgcG9vbCwgYnV0IHdlIG9ubHkgc3RvcmUKKwkvLyB0aGUgZmlyc3QgaW5kZXggaW50byB0aGUgbG9uZyB0YWJsZQorCWludCBpbmRleDsKKwkvLyBsYXp5IGluaXRpYWxpemF0aW9uIGZvciBiYXNlIHR5cGUgY2FjaGVzCisJLy8gSWYgaXQgaXMgbnVsbCwgaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHVzZSBpdAorCWlmIChsb25nQ2FjaGUgPT0gbnVsbCkgeworCQlsb25nQ2FjaGUgPSBuZXcgTG9uZ0NhY2hlKExPTkdfSU5JVElBTF9TSVpFKTsKKwl9CisJaWYgKChpbmRleCA9IGxvbmdDYWNoZS5nZXQoa2V5KSkgPCAwKSB7CisJCWluZGV4ID0gbG9uZ0NhY2hlLnB1dChrZXksIGN1cnJlbnRJbmRleCsrKTsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJY3VycmVudEluZGV4Kys7IC8vIGxvbmcgdmFsdWUgbmVlZCBhbiBleHRyYSBwbGFjZSBpbnRvIHRod2UgY29uc3RhbnQgcG9vbAorCQkvLyBXcml0ZSB0aGUgbG9uZyBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTG9uZ1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIChrZXkgPj4+ICg1NiAtIChpIDw8IDMpKSk7CisJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy9jdXJyZW50T2Zmc2V0IGhhcyBiZWVuICsrIGFscmVhZHkgKHNlZSB0aGUgLTEpCisJCQkJaW50IGxlbmd0aCA9IHBvb2xDb250ZW50Lmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvb2xDb250ZW50LCAwLCAocG9vbENvbnRlbnQgPSBuZXcgYnl0ZVsobGVuZ3RoIDw8IDEpICsgQ09OU1RBTlRQT09MX0lOSVRJQUxfU0laRV0pLCAwLCBsZW5ndGgpOworCQkJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQgLSAxXSA9IChieXRlKSAoa2V5ID4+PiAoNTYgLSAoaSA8PCAzKSkpOworCQkJfQorCQl9CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gc3RyaW5nQ29uc3RhbnQgamF2YS5sYW5nLlN0cmluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KFN0cmluZyBzdHJpbmdDb25zdGFudCkgeworCWludCBpbmRleDsKKwljaGFyW10gc3RyaW5nQ2hhckFycmF5ID0gc3RyaW5nQ29uc3RhbnQudG9DaGFyQXJyYXkoKTsKKwlpZiAoKGluZGV4ID0gc3RyaW5nQ2FjaGUuZ2V0KHN0cmluZ0NoYXJBcnJheSkpIDwgMCkgeworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQlpbnQgc3RyaW5nSW5kZXggPSBsaXRlcmFsSW5kZXgoc3RyaW5nQ2hhckFycmF5KTsKKwkJaW5kZXggPSBzdHJpbmdDYWNoZS5wdXQoc3RyaW5nQ2hhckFycmF5LCBjdXJyZW50SW5kZXgrKyk7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJd3JpdGVVMShTdHJpbmdUYWcpOworCQkvLyBUaGVuIHRoZSBzdHJpbmcgaW5kZXgKKwkJd3JpdGVVMihzdHJpbmdJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIAorICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgYmluZGluZyBhRmllbGRCaW5kaW5nLgorICoKKyAqIEBwYXJhbSBGaWVsZEJpbmRpbmcgYUZpZWxkQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KEZpZWxkQmluZGluZyBhRmllbGRCaW5kaW5nKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCWludCBpbmRleFdlbGxLbm93bkZpZWxkOworCWlmICgoaW5kZXhXZWxsS25vd25GaWVsZCA9IGluZGV4T2ZXZWxsS25vd25GaWVsZHMoYUZpZWxkQmluZGluZykpID09IC0xKSB7CisJCWlmICgoaW5kZXggPSBmaWVsZENhY2hlLmdldChhRmllbGRCaW5kaW5nKSkgPCAwKSB7CisJCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhRmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JGaWVsZHMobGl0ZXJhbEluZGV4KGFGaWVsZEJpbmRpbmcubmFtZSksIGxpdGVyYWxJbmRleChhRmllbGRCaW5kaW5nLnR5cGUuc2lnbmF0dXJlKCkpLCBhRmllbGRCaW5kaW5nKTsKKwkJCWluZGV4ID0gZmllbGRDYWNoZS5wdXQoYUZpZWxkQmluZGluZywgY3VycmVudEluZGV4KyspOworCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJd3JpdGVVMShGaWVsZFJlZlRhZyk7CisJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaW5kZXggPSB3ZWxsS25vd25GaWVsZHNbaW5kZXhXZWxsS25vd25GaWVsZF0pID09IDApIHsKKwkJCS8vIHRoYXQgZmllbGQgbmVlZCB0byBiZSBpbnNlcnRlZAorCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhRmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JGaWVsZHMobGl0ZXJhbEluZGV4KGFGaWVsZEJpbmRpbmcubmFtZSksIGxpdGVyYWxJbmRleChhRmllbGRCaW5kaW5nLnR5cGUuc2lnbmF0dXJlKCkpLCBhRmllbGRCaW5kaW5nKTsKKwkJCWluZGV4ID0gd2VsbEtub3duRmllbGRzW2luZGV4V2VsbEtub3duRmllbGRdID0gY3VycmVudEluZGV4Kys7CisJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQl3cml0ZVUxKEZpZWxkUmVmVGFnKTsKKwkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQl9CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcGFyYW0gTWV0aG9kQmluZGluZyBhTWV0aG9kQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4KE1ldGhvZEJpbmRpbmcgYU1ldGhvZEJpbmRpbmcpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJaW50IGluZGV4V2VsbEtub3duTWV0aG9kOworCWlmICgoaW5kZXhXZWxsS25vd25NZXRob2QgPSBpbmRleE9mV2VsbEtub3duTWV0aG9kcyhhTWV0aG9kQmluZGluZykpID09IC0xKSB7CisJCWlmIChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkvLyBMb29raW5mIGludG8gdGhlIGludGVyZmFjZSBtZXRob2QgcmVmIHRhYmxlCisJCQlpZiAoKGluZGV4ID0gaW50ZXJmYWNlTWV0aG9kQ2FjaGUuZ2V0KGFNZXRob2RCaW5kaW5nKSkgPCAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQkJbmFtZUFuZFR5cGVJbmRleCA9IGxpdGVyYWxJbmRleEZvck1ldGhvZHMobGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSksIGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSksIGFNZXRob2RCaW5kaW5nKTsKKwkJCQlpbmRleCA9IGludGVyZmFjZU1ldGhvZENhY2hlLnB1dChhTWV0aG9kQmluZGluZywgY3VycmVudEluZGV4KyspOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBpbnRlcmZhY2UgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKEludGVyZmFjZU1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gTG9va2luZiBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJCQlpZiAoKGluZGV4ID0gbWV0aG9kQ2FjaGUuZ2V0KGFNZXRob2RCaW5kaW5nKSkgPCAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQkJbmFtZUFuZFR5cGVJbmRleCA9IGxpdGVyYWxJbmRleEZvck1ldGhvZHMobGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSksIGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSksIGFNZXRob2RCaW5kaW5nKTsKKwkJCQlpbmRleCA9IG1ldGhvZENhY2hlLnB1dChhTWV0aG9kQmluZGluZywgY3VycmVudEluZGV4KyspOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvLyBUaGlzIGlzIGEgd2VsbCBrbm93biBtZXRob2QKKwkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbaW5kZXhXZWxsS25vd25NZXRob2RdKSA9PSAwKSB7CisJCQkvLyB0aGlzIG1ldGhvZHMgd2FzIG5vdCBpbnNlcnRlZCB5ZXQKKwkJCWlmIChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJLy8gTG9va2luZiBpbnRvIHRoZSBpbnRlcmZhY2UgbWV0aG9kIHJlZiB0YWJsZQorCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpOworCQkJCW5hbWVBbmRUeXBlSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JNZXRob2RzKGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCkpLCBsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCkpLCBhTWV0aG9kQmluZGluZyk7CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW2luZGV4V2VsbEtub3duTWV0aG9kXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBpbnRlcmZhY2UgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKEludGVyZmFjZU1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBMb29raW5mIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKKwkJCQluYW1lQW5kVHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcyhsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKSwgbGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nLnNpZ25hdHVyZSgpKSwgYU1ldGhvZEJpbmRpbmcpOworCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tpbmRleFdlbGxLbm93bk1ldGhvZF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQl9CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gVHlwZUJpbmRpbmcgYVR5cGVCaW5kaW5nCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXgoVHlwZUJpbmRpbmcgYVR5cGVCaW5kaW5nKSB7CisJaW50IGluZGV4OworCWludCBuYW1lSW5kZXg7CisJaW50IGluZGV4V2VsbEtub3duVHlwZTsKKwlpZiAoKGluZGV4V2VsbEtub3duVHlwZSA9IGluZGV4T2ZXZWxsS25vd25UeXBlcyhhVHlwZUJpbmRpbmcpKSA9PSAtMSkgeworCQlpZiAoKGluZGV4ID0gY2xhc3NDYWNoZS5nZXQoYVR5cGVCaW5kaW5nKSkgPCAwKSB7CisJCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KGFUeXBlQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCkpOworCQkJaW5kZXggPSBjbGFzc0NhY2hlLnB1dChhVHlwZUJpbmRpbmcsIGN1cnJlbnRJbmRleCsrKTsKKwkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbaW5kZXhXZWxsS25vd25UeXBlXSkgPT0gMCkgeworCQkJLy8gTmVlZCB0byBpbnNlcnQgdGhhdCBiaW5kaW5nCisJCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoYVR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW2luZGV4V2VsbEtub3duVHlwZV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCX0KKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyAKKyAqIG5hbWVBbmRUeXBlIGNvbnN0YW50IHdpdGggbmFtZUluZGV4LCB0eXBlSW5kZXguCisgKgorICogQHBhcmFtIGludCBuYW1lSW5kZXgKKyAqIEBwYXJhbSBpbnQgbmFtZUluZGV4CisgKiBAcGFyYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmcgYSBGaWVsZEJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckZpZWxkcyhpbnQgbmFtZUluZGV4LCBpbnQgdHlwZUluZGV4LCBGaWVsZEJpbmRpbmcga2V5KSB7CisJaW50IGluZGV4OworCWludCBpbmRleE9mV2VsbEtub3duRmllbGROYW1lQW5kVHlwZTsKKwlpZiAoKGluZGV4T2ZXZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlID0gaW5kZXhPZldlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGUoa2V5KSkgPT0gLTEpIHsKKwkJLy8gY2hlY2sgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzCisJCWlmICgoaW5kZXggPSBuYW1lQW5kVHlwZUNhY2hlRm9yRmllbGRzLmdldChrZXkpKSA9PSAtMSkgeworCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCWluZGV4ID0gbmFtZUFuZFR5cGVDYWNoZUZvckZpZWxkcy5wdXQoa2V5LCBjdXJyZW50SW5kZXgrKyk7CisJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaW5kZXggPSB3ZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlc1tpbmRleE9mV2VsbEtub3duRmllbGROYW1lQW5kVHlwZV0pID09IDApIHsKKwkJCWluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbaW5kZXhPZldlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVdID0gY3VycmVudEluZGV4Kys7CisJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQl9CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCb29sZWFuKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0JPT0xFQU5fVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nQm9vbGVhbkNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19CT09MRUFOX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Jvb2xlYW5UWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfQk9PTEVBTl9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCb29sZWFuKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0JPT0xFQU5fRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCeXRlKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0JZVEVfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nQnl0ZUNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19CWVRFX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0J5dGVUWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfQllURV9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCeXRlKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0JZVEVfRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXIoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfQ0hBUkFDVEVSX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0NoYXJhY3RlckNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19DSEFSQUNURVJfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIAorICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgYmluZGluZyBhRmllbGRCaW5kaW5nLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2hhcmFjdGVyVFlQRSgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0NIQVJBQ1RFUl9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXIoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlc1tUWVBFX0pBVkFMQU5HQ0xBU1NfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfQ0hBUkFDVEVSX0ZJRUxEXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKEZpZWxkUmVmVGFnKTsKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3MoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfQ0xBU1NfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfQ0xBU1NfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzRm9yTmFtZSgpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbRk9STkFNRV9DTEFTU19NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tGT1JOQU1FX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Gb3JOYW1lKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRm9yTmFtZVNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0ZPUk5BTUVfQ0xBU1NfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbRk9STkFNRV9DTEFTU19NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzR2V0Q29uc3RydWN0b3IoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVENPTlNUUlVDVE9SX0NMQVNTX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2xhc3MoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVENPTlNUUlVDVE9SX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5HZXRDb25zdHJ1Y3Rvcik7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkdldENvbnN0cnVjdG9yU2lnbmF0dXJlKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUQ09OU1RSVUNUT1JfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0Rlc2lyZWRBc3NlcnRpb25TdGF0dXMoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0RFU0lSRURBU1NFUlRJT05TVEFUVVNfQ0xBU1NfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzcygpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbREVTSVJFREFTU0VSVElPTlNUQVRVU19NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRGVzaXJlZEFzc2VydGlvblN0YXR1cyk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkRlc2lyZWRBc3NlcnRpb25TdGF0dXNTaWduYXR1cmUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tERVNJUkVEQVNTRVJUSU9OU1RBVFVTX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0RFU0lSRURBU1NFUlRJT05TVEFUVVNfQ0xBU1NfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT05fVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbkNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19DTEFTU05PVEZPVU5ERVhDRVBUSU9OX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdEb3VibGUoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfRE9VQkxFX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19ET1VCTEVfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIAorICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgYmluZGluZyBhRmllbGRCaW5kaW5nLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRG91YmxlVFlQRSgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0RPVUJMRV9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdEb3VibGUoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlc1tUWVBFX0pBVkFMQU5HQ0xBU1NfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfRE9VQkxFX0ZJRUxEXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKEZpZWxkUmVmVGFnKTsKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRXJyb3IoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfRVJST1JfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nRXJyb3JDb25zdGFudFBvb2xOYW1lKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfRVJST1JfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Vycm9yQ29uc3RydWN0b3IoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0pBVkFMQU5HRVJST1JfQ09OU1RSX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRXJyb3IoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5TdHJpbmdDb25zdHJ1Y3RvclNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbSkFWQUxBTkdFUlJPUl9DT05TVFJfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRXhjZXB0aW9uKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0VYQ0VQVElPTl9UWVBFXSkgPT0gMCkgeworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nRXhjZXB0aW9uQ29uc3RhbnRQb29sTmFtZSk7CisJCWluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0VYQ0VQVElPTl9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRmxvYXQoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfRkxPQVRfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfRkxPQVRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIAorICogY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQgYmluZGluZyBhRmllbGRCaW5kaW5nLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRmxvYXRUWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfRkxPQVRfRklFTERdKSA9PSAwKSB7CisJCWludCBuYW1lQW5kVHlwZUluZGV4OworCQlpbnQgY2xhc3NJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRmxvYXQoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRZUEUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ0NsYXNzU2lnbmF0dXJlKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25GaWVsZE5hbWVBbmRUeXBlc1tUWVBFX0pBVkFMQU5HQ0xBU1NfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfRkxPQVRfRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdJbnRlZ2VyKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0lOVEVHRVJfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nSW50ZWdlckNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19JTlRFR0VSX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0ludGVnZXJUWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfSU5URUdFUl9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdJbnRlZ2VyKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0lOVEVHRVJfRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdMb25nKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX0xPTkdfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nTG9uZ0NvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19MT05HX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0xvbmdUWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfTE9OR19GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdMb25nKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX0xPTkdfRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdOb0NsYXNzRGVmRm91bmRFcnJvcigpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19OT0NMQVNTREVGRk9VTkRFUlJPUl9UWVBFXSkgPT0gMCkgeworCQlpbnQgbmFtZUluZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdOb0NsYXNzRGVmRm91bmRFcnJvckNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19OT0NMQVNTREVGRk9VTkRFUlJPUl9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19BU1NFUlRJT05FUlJPUl9UWVBFXSkgPT0gMCkgeworCQlpbnQgbmFtZUluZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19BU1NFUlRJT05FUlJPUl9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvckNvbnN0cnVjdG9yKGludCB0eXBlQmluZGluZ0lEKSB7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleCA9IDA7CisJaW50IGNsYXNzSW5kZXggPSAwOworCXN3aXRjaCAodHlwZUJpbmRpbmdJRCkgeworCQljYXNlIFRfaW50IDoKKwkJY2FzZSBUX2J5dGUgOgorCQljYXNlIFRfc2hvcnQgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0lOVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckludENvbnN0clNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0lOVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfTE9OR19NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JMb25nQ29uc3RyU2lnbmF0dXJlKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0xPTkdfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9GTE9BVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yRmxvYXRDb25zdHJTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0ZMT0FUX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0RPVUJMRV9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Bc3NlcnRpb25FcnJvckRvdWJsZUNvbnN0clNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0RPVUJMRV9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfQ0hBUl9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQXNzZXJ0aW9uRXJyb3IoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXNzZXJ0aW9uRXJyb3JDaGFyQ29uc3RyU2lnbmF0dXJlKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0NIQVJfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVNTRVJUSU9ORVJST1JfQ09OU1RSX0JPT0xFQU5fTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yQm9vbGVhbkNvbnN0clNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQ09OU1RSX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0NPTlNUUl9CT09MRUFOX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCS8vY2FzZSBUX09iamVjdCA6CisJCS8vY2FzZSBUX1N0cmluZyA6CisJCS8vY2FzZSBUX251bGwgOgorCQlkZWZhdWx0IDogCisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfT0JKRUNUX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdBc3NlcnRpb25FcnJvcigpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFzc2VydGlvbkVycm9yT2JqZWN0Q29uc3RyU2lnbmF0dXJlKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9DT05TVFJfT0JKRUNUX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yRGVmYXVsdENvbnN0cnVjdG9yKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBU1NFUlRJT05FUlJPUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tERUZBVUxUX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkRlZmF1bHRDb25zdHJ1Y3RvclNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0RFRkFVTFRfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FTU0VSVElPTkVSUk9SX0RFRkFVTFRfQ09OU1RSX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCisKKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ05vQ2xhc3NEZWZGb3VuZEVycm9yU3RyaW5nQ29uc3RydWN0b3IoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW05PQ0xBU1NERUZGT1VOREVSUk9SX0NPTlNUUl9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ05vQ2xhc3NEZWZGb3VuZEVycm9yKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Jbml0KTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuU3RyaW5nQ29uc3RydWN0b3JTaWduYXR1cmUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDT05TVFJfU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW05PQ0xBU1NERUZGT1VOREVSUk9SX0NPTlNUUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gVHlwZUJpbmRpbmcgYVR5cGVCaW5kaW5nCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdCgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19PQkpFQ1RfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSk7CisJCWluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX09CSkVDVF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1JFRkxFQ1RfQ09OU1RSVUNUT1JfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfUkVGTEVDVF9DT05TVFJVQ1RPUl9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3Rvck5ld0luc3RhbmNlKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tORVdJTlNUQU5DRV9DT05TVFJVQ1RPUl9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvcigpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbTkVXSU5TVEFOQ0VfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLk5ld0luc3RhbmNlKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuTmV3SW5zdGFuY2VTaWduYXR1cmUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tORVdJTlNUQU5DRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tORVdJTlNUQU5DRV9DT05TVFJVQ1RPUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gVHlwZUJpbmRpbmcgYVR5cGVCaW5kaW5nCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0KCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1NIT1JUX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ1Nob3J0Q29uc3RhbnRQb29sTmFtZSk7CisJCWluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1NIT1JUX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0VFlQRSgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX1NIT1JUX0ZJRUxEXSkgPT0gMCkgeworCQlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwkJaW50IGNsYXNzSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0KCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX1NIT1JUX0ZJRUxEXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQl3cml0ZVUxKEZpZWxkUmVmVGFnKTsKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1NUUklOR19UWVBFXSkgPT0gMCkgeworCQlpbnQgbmFtZUluZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdTdHJpbmdDb25zdGFudFBvb2xOYW1lKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfU1RSSU5HX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfU1RSSU5HQlVGRkVSX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ1N0cmluZ0J1ZmZlckNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19TVFJJTkdCVUZGRVJfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckFwcGVuZChpbnQgdHlwZUlEKSB7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleCA9IDA7CisJaW50IGNsYXNzSW5kZXggPSAwOworCXN3aXRjaCAodHlwZUlEKSB7CisJCWNhc2UgVF9pbnQgOgorCQljYXNlIFRfYnl0ZSA6CisJCWNhc2UgVF9zaG9ydCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfSU5UX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZEludFNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVBQRU5EX0lOVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfTE9OR19NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0FQUEVORF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZCk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXBwZW5kTG9uZ1NpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FQUEVORF9MT05HX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfRkxPQVRfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlcigpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tBUFBFTkRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXBwZW5kKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmRGbG9hdFNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfRkxPQVRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfRE9VQkxFX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZERvdWJsZVNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVBQRU5EX0RPVUJMRV9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfQ0hBUl9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0FQUEVORF9DSEFSX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZCk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXBwZW5kQ2hhclNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FQUEVORF9DSEFSX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FQUEVORF9CT09MRUFOX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXBwZW5kKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmRCb29sZWFuU2lnbmF0dXJlKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tBUFBFTkRfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVBQRU5EX0JPT0xFQU5fTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX09iamVjdCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tBUFBFTkRfT0JKRUNUX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmQpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkFwcGVuZE9iamVjdFNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQVBQRU5EX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVBQRU5EX09CSkVDVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfU3RyaW5nIDoKKwkJY2FzZSBUX251bGwgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQVBQRU5EX1NUUklOR19NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0FQUEVORF9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQXBwZW5kKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5BcHBlbmRTdHJpbmdTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0FQUEVORF9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0FQUEVORF9TVFJJTkdfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RydWN0b3IoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NUUklOR0JVRkZFUl9TVFJJTkdfQ09OU1RSX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuU3RyaW5nQ29uc3RydWN0b3JTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NPTlNUUl9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTVFJJTkdCVUZGRVJfU1RSSU5HX0NPTlNUUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlckRlZmF1bHRDb25zdHJ1Y3RvcigpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU1RSSU5HQlVGRkVSX0RFRkFVTFRfQ09OU1RSX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nQnVmZmVyKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tERUZBVUxUX0NPTlNUUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSW5pdCk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkRlZmF1bHRDb25zdHJ1Y3RvclNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0RFRkFVTFRfQ09OU1RSX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NUUklOR0JVRkZFUl9ERUZBVUxUX0NPTlNUUl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZ0J1ZmZlclRvU3RyaW5nKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTVFJJTkdCVUZGRVJfVE9TVFJJTkdfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTdHJpbmdCdWZmZXIoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1RPU1RSSU5HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5Ub1N0cmluZyk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlRvU3RyaW5nU2lnbmF0dXJlKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbVE9TVFJJTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU1RSSU5HQlVGRkVSX1RPU1RSSU5HX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nSW50ZXJuKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTVFJJTkdfSU5URVJOX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tJTlRFUk5fTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkludGVybik7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkludGVyblNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0lOVEVSTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTVFJJTkdfSU5URVJOX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3RyaW5nVmFsdWVPZihpbnQgdHlwZUlEKSB7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleCA9IDA7CisJaW50IGNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N0cmluZygpOworCXN3aXRjaCAodHlwZUlEKSB7CisJCWNhc2UgVF9pbnQgOgorCQljYXNlIFRfYnl0ZSA6CisJCWNhc2UgVF9zaG9ydCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0lOVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2YpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2ZJbnRTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0lOVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0xPTkdfTUVUSE9EXSkgPT0gMCkgeworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tWQUxVRU9GX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVmFsdWVPZik7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVmFsdWVPZkxvbmdTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbVkFMVUVPRl9MT05HX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0ZMT0FUX01FVEhPRF0pID09IDApIHsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbVkFMVUVPRl9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5WYWx1ZU9mKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5WYWx1ZU9mRmxvYXRTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1ZBTFVFT0ZfRkxPQVRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0RPVUJMRV9NRVRIT0RdKSA9PSAwKSB7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2YpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2ZEb3VibGVTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0RPVUJMRV9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0NIQVJfTUVUSE9EXSkgPT0gMCkgeworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tWQUxVRU9GX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVmFsdWVPZik7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuVmFsdWVPZkNoYXJTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbVkFMVUVPRl9DSEFSX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJCX0KKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1ZBTFVFT0ZfQk9PTEVBTl9NRVRIT0RdKSA9PSAwKSB7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5WYWx1ZU9mKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5WYWx1ZU9mQm9vbGVhblNpZ25hdHVyZSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbVkFMVUVPRl9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX0JPT0xFQU5fTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCQkJfQorCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX09iamVjdCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX09CSkVDVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2YpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLlZhbHVlT2ZPYmplY3RTaWduYXR1cmUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1ZBTFVFT0ZfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tWQUxVRU9GX09CSkVDVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCQl9CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTeXN0ZW0oKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfU1lTVEVNX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ1N5c3RlbUNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19TWVNURU1fVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N5c3RlbUV4aXRJbnQoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NZU1RFTV9FWElUX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nU3lzdGVtKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tFWElUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5FeGl0KTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuRXhpdEludFNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0VYSVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU1lTVEVNX0VYSVRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N5c3RlbU91dCgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tPVVRfU1lTVEVNX0ZJRUxEXSkgPT0gMCkgeworCQlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwkJaW50IGNsYXNzSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1N5c3RlbSgpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbT1VUX1NZU1RFTV9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5PdXQpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhSW9QcmludFN0cmVhbVNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW09VVF9TWVNURU1fTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duRmllbGRzW09VVF9TWVNURU1fRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdUaHJvd2FibGUoKSB7CisJaW50IGluZGV4OworCWlmICgoaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfVEhST1dBQkxFX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5KYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19USFJPV0FCTEVfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJd3JpdGVVMShDbGFzc1RhZyk7CisJCS8vIFRoZW4gYWRkIHRoZSA4IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgbG9uZworCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Rocm93YWJsZUdldE1lc3NhZ2UoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1RIUk9XQUJMRV9HRVRNRVNTQUdFX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nVGhyb3dhYmxlKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRNRVNTQUdFX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5HZXRNZXNzYWdlKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuR2V0TWVzc2FnZVNpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVE1FU1NBR0VfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbVEhST1dBQkxFX0dFVE1FU1NBR0VfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQlpZiAoaW5kZXggPiAweEZGRkYpeworCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJfQorCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIFR5cGVCaW5kaW5nIGFUeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdWb2lkKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1ZPSURfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkphdmFMYW5nVm9pZENvbnN0YW50UG9vbE5hbWUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19WT0lEX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCAKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkIGJpbmRpbmcgYUZpZWxkQmluZGluZy4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1ZvaWRUWVBFKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duRmllbGRzW1RZUEVfVk9JRF9GSUVMRF0pID09IDApIHsKKwkJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJCWludCBjbGFzc0luZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdWb2lkKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bkZpZWxkTmFtZUFuZFR5cGVzW1RZUEVfSkFWQUxBTkdDTEFTU19OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UWVBFKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuSmF2YUxhbmdDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duRmllbGROYW1lQW5kVHlwZXNbVFlQRV9KQVZBTEFOR0NMQVNTX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bkZpZWxkc1tUWVBFX1ZPSURfRklFTERdID0gY3VycmVudEluZGV4Kys7CisJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CisJCXdyaXRlVTEoRmllbGRSZWZUYWcpOworCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGNoYXJbXSBzdHJpbmdOYW1lCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JMZGMoY2hhcltdIHN0cmluZ0NoYXJBcnJheSkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gc3RyaW5nQ2FjaGUuZ2V0KHN0cmluZ0NoYXJBcnJheSkpIDwgMCkgeworCQlpbnQgc3RyaW5nSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCWlmICgoc3RyaW5nSW5kZXggPSBVVEY4Q2FjaGUuZ2V0KHN0cmluZ0NoYXJBcnJheSkpIDwgMCkgeworCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCS8vIFdyaXRlIHRoZSB0YWcgZmlyc3QKKwkJCXdyaXRlVTEoVXRmOFRhZyk7CisJCQkvLyBUaGVuIHRoZSBzaXplIG9mIHRoZSBzdHJpbmdOYW1lIGFycmF5CisJCQlpbnQgc2F2ZWRDdXJyZW50T2Zmc2V0ID0gY3VycmVudE9mZnNldDsKKwkJCWlmIChjdXJyZW50T2Zmc2V0ICsgMiA+PSBwb29sQ29udGVudC5sZW5ndGgpIHsKKwkJCQkvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgcG9vbENvbnRlbnQgYXJyYXkgYmVjYXVzZSB3ZSB3b24ndCBoYXZlCisJCQkJLy8gZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBsZW5ndGgKKwkJCQlpbnQgbGVuZ3RoID0gcG9vbENvbnRlbnQubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkocG9vbENvbnRlbnQsIDAsIChwb29sQ29udGVudCA9IG5ldyBieXRlW2xlbmd0aCArIENPTlNUQU5UUE9PTF9HUk9XX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJCX0KKwkJCWN1cnJlbnRPZmZzZXQgKz0gMjsKKwkJCWludCBsZW5ndGggPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdDaGFyQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyIGN1cnJlbnQgPSBzdHJpbmdDaGFyQXJyYXlbaV07CisJCQkJaWYgKChjdXJyZW50ID49IDB4MDAwMSkgJiYgKGN1cnJlbnQgPD0gMHgwMDdGKSkgeworCQkJCQkvLyB3ZSBvbmx5IG5lZWQgb25lIGJ5dGU6IEFTQ0lJIHRhYmxlCisJCQkJCXdyaXRlVTEoY3VycmVudCk7CisJCQkJCWxlbmd0aCsrOworCQkJCX0gZWxzZQorCQkJCQlpZiAoY3VycmVudCA+IDB4MDdGRikgeworCQkJCQkJLy8gd2UgbmVlZCAzIGJ5dGVzCisJCQkJCQlsZW5ndGggKz0gMzsKKwkJCQkJCXdyaXRlVTEoMHhFMCB8ICgoY3VycmVudCA+PiAxMikgJiAweDBGKSk7IC8vIDB4RTAgPSAxMTEwIDAwMDAKKwkJCQkJCXdyaXRlVTEoMHg4MCB8ICgoY3VycmVudCA+PiA2KSAmIDB4M0YpKTsgLy8gMHg4MCA9IDEwMDAgMDAwMAorCQkJCQkJd3JpdGVVMSgweDgwIHwgKGN1cnJlbnQgJiAweDNGKSk7IC8vIDB4ODAgPSAxMDAwIDAwMDAKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHdlIGNhbiBiZSAwIG9yIGJldHdlZW4gMHgwMDgwIGFuZCAweDA3RkYKKwkJCQkJCS8vIEluIHRoYXQgY2FzZSB3ZSBvbmx5IG5lZWQgMiBieXRlcworCQkJCQkJbGVuZ3RoICs9IDI7CisJCQkJCQl3cml0ZVUxKDB4QzAgfCAoKGN1cnJlbnQgPj4gNikgJiAweDFGKSk7IC8vIDB4QzAgPSAxMTAwIDAwMDAKKwkJCQkJCXdyaXRlVTEoMHg4MCB8IChjdXJyZW50ICYgMHgzRikpOyAvLyAweDgwID0gMTAwMCAwMDAwCisJCQkJCX0KKwkJCX0KKwkJCWlmIChsZW5ndGggPj0gNjU1MzUpIHsKKwkJCQljdXJyZW50T2Zmc2V0ID0gc2F2ZWRDdXJyZW50T2Zmc2V0IC0gMTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzdHJpbmdJbmRleCA9IFVURjhDYWNoZS5wdXQoc3RyaW5nQ2hhckFycmF5LCBjdXJyZW50SW5kZXgrKyk7CisJCQkvLyBOb3cgd2Uga25vdyB0aGUgbGVuZ3RoIHRoYXQgd2UgaGF2ZSB0byB3cml0ZSBpbiB0aGUgY29uc3RhbnQgcG9vbAorCQkJLy8gd2UgdXNlIHNhdmVkQ3VycmVudE9mZnNldCB0byBkbyB0aGF0CisJCQlpZiAobGVuZ3RoID4gNjU1MzUpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXBvb2xDb250ZW50W3NhdmVkQ3VycmVudE9mZnNldF0gPSAoYnl0ZSkgKGxlbmd0aCA+PiA4KTsKKwkJCXBvb2xDb250ZW50W3NhdmVkQ3VycmVudE9mZnNldCArIDFdID0gKGJ5dGUpIGxlbmd0aDsKKwkJfQorCQlpbmRleCA9IHN0cmluZ0NhY2hlLnB1dChzdHJpbmdDaGFyQXJyYXksIGN1cnJlbnRJbmRleCsrKTsKKwkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CisJCX0KKwkJLy8gV3JpdGUgdGhlIHRhZyBmaXJzdAorCQl3cml0ZVUxKFN0cmluZ1RhZyk7CisJCS8vIFRoZW4gdGhlIHN0cmluZyBpbmRleAorCQl3cml0ZVUyKHN0cmluZ0luZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyAKKyAqIG5hbWVBbmRUeXBlIGNvbnN0YW50IHdpdGggbmFtZUluZGV4LCB0eXBlSW5kZXguCisgKgorICogQHBhcmFtIGludCBuYW1lSW5kZXgKKyAqIEBwYXJhbSBpbnQgbmFtZUluZGV4CisgKiBAcGFyYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIGEgbWV0aG9kQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcyhpbnQgbmFtZUluZGV4LCBpbnQgdHlwZUluZGV4LCBNZXRob2RCaW5kaW5nIGtleSkgeworCWludCBpbmRleDsKKwlpbnQgaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlOworCWlmICgoaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlID0gaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlKGtleSkpID09IC0xKSB7CisJCS8vIGNoZWNrIGlmIHRoZSBlbnRyeSBleGlzdHMKKwkJaWYgKChpbmRleCA9IG5hbWVBbmRUeXBlQ2FjaGVGb3JNZXRob2RzLmdldChrZXkpKSA9PSAtMSkgeworCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCWluZGV4ID0gbmFtZUFuZFR5cGVDYWNoZUZvck1ldGhvZHMucHV0KGtleSwgY3VycmVudEluZGV4KyspOworCQkJaWYgKGluZGV4ID4gMHhGRkZGKXsKKwkJCQl0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlSW5Db25zdGFudFBvb2wodGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQkJfQorCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW2luZGV4T2ZXZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZV0pID09IDApIHsKKwkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW2luZGV4T2ZXZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCWlmIChpbmRleCA+IDB4RkZGRil7CisJCQkJdGhpcy5jbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZy5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUluQ29uc3RhbnRQb29sKHRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucmVmZXJlbmNlVHlwZSgpKTsKKwkJCX0KKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdEdldENsYXNzKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRDTEFTU19PQkpFQ1RfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdPYmplY3QoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVENMQVNTX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuR2V0Q2xhc3MpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5HZXRDbGFzc1NpZ25hdHVyZSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVENMQVNTX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRDTEFTU19PQkpFQ1RfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2xlYW4gdGhlIHJlY2VpdmVyIGluIGNhc2Ugb2YgYSBjbGluaXQgaGVhZGVyIGlzIGdlbmVyYXRlZCwgYnV0IHRoZSAKKyAqIGNsaW5pdCBoYXMgbm8gY29kZS4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBjbGluaXQgaXMgdGhlIGZpcnN0IG1ldGhvZCB0byBiZSBnZW5lcmF0ZWQuCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uI2FkZENsaW5pdCgpCisgKi8KK3B1YmxpYyB2b2lkIHJlc2V0Rm9yQ2xpbml0KGludCBjb25zdGFudFBvb2xJbmRleCwgaW50IGNvbnN0YW50UG9vbE9mZnNldCkgeworCWN1cnJlbnRJbmRleCA9IGNvbnN0YW50UG9vbEluZGV4OworCWN1cnJlbnRPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXQ7CisJaWYgKFVURjhDYWNoZS5nZXQoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpID49IGNvbnN0YW50UG9vbEluZGV4KSB7CisJCVVURjhDYWNoZS5yZW1vdmUoQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ29kZU5hbWUpOworCX0KKwlpZiAoVVRGOENhY2hlLmdldChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5DbGluaXRTaWduYXR1cmUpID49IGNvbnN0YW50UG9vbEluZGV4KSB7CisJCVVURjhDYWNoZS5yZW1vdmUoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQ2xpbml0U2lnbmF0dXJlKTsKKwl9CisJaWYgKFVURjhDYWNoZS5nZXQoUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuQ2xpbml0KSA+PSBjb25zdGFudFBvb2xJbmRleCkgeworCQlVVEY4Q2FjaGUucmVtb3ZlKFF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkNsaW5pdCk7CisJfQorfQorLyoqCisgKiBXcml0ZSBhIHVuc2lnbmVkIGJ5dGUgaW50byB0aGUgYnl0ZSBhcnJheQorICogCisgKiBAcGFyYW0gPENPREU+aW50PC9DT0RFPiBUaGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYnl0ZSBhcnJheQorICovCitwcm90ZWN0ZWQgZmluYWwgdm9pZCB3cml0ZVUxKGludCB2YWx1ZSkgeworCXRyeSB7CisJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQrK10gPSAoYnl0ZSkgdmFsdWU7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCS8vY3VycmVudE9mZnNldCBoYXMgYmVlbiArKyBhbHJlYWR5IChzZWUgdGhlIC0xKQorCQlpbnQgbGVuZ3RoID0gcG9vbENvbnRlbnQubGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KHBvb2xDb250ZW50LCAwLCAocG9vbENvbnRlbnQgPSBuZXcgYnl0ZVtsZW5ndGggKyBDT05TVEFOVFBPT0xfR1JPV19TSVpFXSksIDAsIGxlbmd0aCk7CisJCXBvb2xDb250ZW50W2N1cnJlbnRPZmZzZXQgLSAxXSA9IChieXRlKSB2YWx1ZTsKKwl9Cit9CisvKioKKyAqIFdyaXRlIGEgdW5zaWduZWQgYnl0ZSBpbnRvIHRoZSBieXRlIGFycmF5CisgKiAKKyAqIEBwYXJhbSA8Q09ERT5pbnQ8L0NPREU+IFRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBieXRlIGFycmF5CisgKi8KK3Byb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlVTIoaW50IHZhbHVlKSB7CisJLy9maXJzdCBieXRlCisJdHJ5IHsKKwkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCsrXSA9IChieXRlKSAodmFsdWUgPj4gOCk7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCSAvL2N1cnJlbnRPZmZzZXQgaGFzIGJlZW4gKysgYWxyZWFkeSAoc2VlIHRoZSAtMSkKKwkJaW50IGxlbmd0aCA9IHBvb2xDb250ZW50Lmxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShwb29sQ29udGVudCwgMCwgKHBvb2xDb250ZW50ID0gbmV3IGJ5dGVbbGVuZ3RoICsgQ09OU1RBTlRQT09MX0dST1dfU0laRV0pLCAwLCBsZW5ndGgpOworCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0IC0gMV0gPSAoYnl0ZSkgKHZhbHVlID4+IDgpOworCX0KKwl0cnkgeworCQlwb29sQ29udGVudFtjdXJyZW50T2Zmc2V0KytdID0gKGJ5dGUpIHZhbHVlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkgLy9jdXJyZW50T2Zmc2V0IGhhcyBiZWVuICsrIGFscmVhZHkgKHNlZSB0aGUgLTEpCisJCWludCBsZW5ndGggPSBwb29sQ29udGVudC5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkocG9vbENvbnRlbnQsIDAsIChwb29sQ29udGVudCA9IG5ldyBieXRlW2xlbmd0aCArIENPTlNUQU5UUE9PTF9HUk9XX1NJWkVdKSwgMCwgbGVuZ3RoKTsKKwkJcG9vbENvbnRlbnRbY3VycmVudE9mZnNldCAtIDFdID0gKGJ5dGUpIHZhbHVlOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0RvdWJsZUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Eb3VibGVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2M1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Eb3VibGVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworcHVibGljIGNsYXNzIERvdWJsZUNhY2hlIHsKKwlwcml2YXRlIGRvdWJsZSBrZXlUYWJsZVtdOworCXByaXZhdGUgaW50IHZhbHVlVGFibGVbXTsgCisJcHJpdmF0ZSBpbnQgZWxlbWVudFNpemU7CisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZS4gQSBkZWZhdWx0IGNhcGFjaXR5IGFuZAorICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IAorICogZ3JvdyB3aGVuIGl0IGdldHMgZnVsbC4KKyAqLworcHVibGljIERvdWJsZUNhY2hlKCkgeworCXRoaXMoMTMpOworfQorLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwKKyAqIGNhcGFjaXR5LgorICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQKKyAqICB0aGUgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cworICovCitwdWJsaWMgRG91YmxlQ2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCWVsZW1lbnRTaXplID0gMDsKKwlrZXlUYWJsZSA9IG5ldyBkb3VibGVbaW5pdGlhbENhcGFjaXR5XTsKKwl2YWx1ZVRhYmxlID0gbmV3IGludFtpbml0aWFsQ2FwYWNpdHldOworfQorLyoqCisgKiBDbGVhcnMgdGhlIGhhc2ggdGFibGUgc28gdGhhdCBpdCBoYXMgbm8gbW9yZSBlbGVtZW50cyBpbiBpdC4KKyAqLworcHVibGljIHZvaWQgY2xlYXIoKSB7CisJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCWtleVRhYmxlW2ldID0gMC4wOworCQl2YWx1ZVRhYmxlW2ldID0gMDsKKwl9CisJZWxlbWVudFNpemUgPSAwOworfQorLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhbiBlbGVtZW50IGZvciB0aGUga2V5LgorICoKKyAqIEBwYXJhbSBrZXkgPENPREU+ZG91YmxlPC9DT0RFPiB0aGUga2V5IHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoZG91YmxlIGtleSkgeworCWlmIChrZXkgPT0gMC4wKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbGVtZW50U2l6ZTsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAoa2V5VGFibGVbaV0gPT0gMC4wKSB7CisJCQkJbG9uZyB2YWx1ZTEgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhrZXkpOworCQkJCWxvbmcgdmFsdWUyID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoa2V5VGFibGVbaV0pOworCQkJCWlmICh2YWx1ZTEgPT0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhMICYmIHZhbHVlMiA9PSAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisJCQkJCXJldHVybiB0cnVlOworCQkJCWlmICh2YWx1ZTEgPT0gMCAmJiB2YWx1ZTIgPT0gMCkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZWxlbWVudFNpemU7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldID09IGtleSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZQorICogaGFzaHRhYmxlLgorICogQHBhcmFtIGtleSA8Q09ERT5kb3VibGU8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKiBAcmV0dXJuIGludCB0aGUgZWxlbWVudCBmb3IgdGhlIGtleSBvciAtMSBpZiB0aGUga2V5IGlzIG5vdAorICogIGRlZmluZWQgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KK3B1YmxpYyBpbnQgZ2V0KGRvdWJsZSBrZXkpIHsKKwlpZiAoa2V5ID09IDAuMCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZWxlbWVudFNpemU7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldID09IDAuMCkgeworCQkJCWxvbmcgdmFsdWUxID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoa2V5KTsKKwkJCQlsb25nIHZhbHVlMiA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGtleVRhYmxlW2ldKTsKKwkJCQlpZiAodmFsdWUxID09IC05MjIzMzcyMDM2ODU0Nzc1ODA4TCAmJiB2YWx1ZTIgPT0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorCQkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpXTsKKwkJCQlpZiAodmFsdWUxID09IDAgJiYgdmFsdWUyID09IDApCisJCQkJCXJldHVybiB2YWx1ZVRhYmxlW2ldOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVsZW1lbnRTaXplOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChrZXlUYWJsZVtpXSA9PSBrZXkpIHsKKwkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpXTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgorICogCisgKiBAcGFyYW0ga2V5IDxDT0RFPmRvdWJsZTwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGhhc2h0YWJsZQorICogQHBhcmFtIHZhbHVlIDxDT0RFPmludDwvQ09ERT4gdGhlIHNwZWNpZmllZCBlbGVtZW50CisgKiBAcmV0dXJuIGludCB2YWx1ZQorICovCitwdWJsaWMgaW50IHB1dChkb3VibGUga2V5LCBpbnQgdmFsdWUpIHsKKwlpZiAoZWxlbWVudFNpemUgPT0ga2V5VGFibGUubGVuZ3RoKSB7CisJCS8vIHJlc2l6ZQorCQlTeXN0ZW0uYXJyYXljb3B5KGtleVRhYmxlLCAwLCAoa2V5VGFibGUgPSBuZXcgZG91YmxlW2VsZW1lbnRTaXplICogMl0pLCAwLCBlbGVtZW50U2l6ZSk7CisJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVUYWJsZSwgMCwgKHZhbHVlVGFibGUgPSBuZXcgaW50W2VsZW1lbnRTaXplICogMl0pLCAwLCBlbGVtZW50U2l6ZSk7CisJfQorCWtleVRhYmxlW2VsZW1lbnRTaXplXSA9IGtleTsKKwl2YWx1ZVRhYmxlW2VsZW1lbnRTaXplXSA9IHZhbHVlOworCWVsZW1lbnRTaXplKys7CisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBDb252ZXJ0cyB0byBhIHJhdGhlciBsZW5ndGh5IFN0cmluZy4KKyAqCisgKiBAcmV0dXJuIFN0cmluZyB0aGUgYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJaW50IG1heCA9IGVsZW1lbnRTaXplOworCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmLmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQlpZiAoKGtleVRhYmxlW2ldICE9IDApIHx8ICgoa2V5VGFibGVbaV0gPT0gMCkgJiYodmFsdWVUYWJsZVtpXSAhPSAwKSkpIHsKKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoaSA8IG1heCkgeworCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWYudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0V4Y2VwdGlvbkxhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9FeGNlcHRpb25MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzg0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9FeGNlcHRpb25MYWJlbC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIEV4Y2VwdGlvbkxhYmVsIGV4dGVuZHMgTGFiZWwgeworCXB1YmxpYyBpbnQgc3RhcnQgPSBQT1NfTk9UX1NFVDsKKwlwdWJsaWMgaW50IGVuZCA9IFBPU19OT1RfU0VUOworCXB1YmxpYyBUeXBlQmluZGluZyBleGNlcHRpb25UeXBlOworcHVibGljIEV4Y2VwdGlvbkxhYmVsKENvZGVTdHJlYW0gY29kZVN0cmVhbSwgVHlwZUJpbmRpbmcgZXhjZXB0aW9uVHlwZSkgeworCXN1cGVyKGNvZGVTdHJlYW0pOworCXRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7CisJdGhpcy5zdGFydCA9IGNvZGVTdHJlYW0ucG9zaXRpb247CQorfQorcHVibGljIGJvb2xlYW4gaXNTdGFuZGFyZExhYmVsKCl7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIHZvaWQgcGxhY2UoKSB7CisJLy8gcmVnaXN0ZXIgdGhlIGhhbmRsZXIgaW5zaWRlIHRoZSBjb2RlU3RyZWFtIHRoZW4gbm9ybWFsIHBsYWNlCisJY29kZVN0cmVhbS5yZWdpc3RlckV4Y2VwdGlvbkhhbmRsZXIodGhpcyk7CisJc3VwZXIucGxhY2UoKTsKKworfQorcHVibGljIHZvaWQgcGxhY2VFbmQoKSB7CisJZW5kID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ZpZWxkTmFtZUFuZFR5cGVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmllbGROYW1lQW5kVHlwZUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzN2MyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ZpZWxkTmFtZUFuZFR5cGVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBGaWVsZE5hbWVBbmRUeXBlQ2FjaGUgeworCXB1YmxpYyBGaWVsZEJpbmRpbmcga2V5VGFibGVbXTsKKwlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsKKwlpbnQgZWxlbWVudFNpemU7CisJaW50IHRocmVzaG9sZDsKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlLiBBIGRlZmF1bHQgY2FwYWNpdHkgaXMgdXNlZC4KKyAqIE5vdGUgdGhhdCB0aGUgaGFzaHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSBncm93IHdoZW4gaXQgZ2V0cyBmdWxsLgorICovCitwdWJsaWMgRmllbGROYW1lQW5kVHlwZUNhY2hlKCkgeworCXRoaXMoMTMpOworfQorLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwKKyAqIGNhcGFjaXR5LgorICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQKKyAqCXRoZSBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzCisgKi8KK3B1YmxpYyBGaWVsZE5hbWVBbmRUeXBlQ2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCXRoaXMuZWxlbWVudFNpemUgPSAwOworCXRoaXMudGhyZXNob2xkID0gKGludCkgKGluaXRpYWxDYXBhY2l0eSAqIDAuNjZmKTsKKwl0aGlzLmtleVRhYmxlID0gbmV3IEZpZWxkQmluZGluZ1tpbml0aWFsQ2FwYWNpdHldOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKK30KKy8qKgorICogQ2xlYXJzIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgaXQgaGFzIG5vIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgKi8KK3B1YmxpYyB2b2lkIGNsZWFyKCkgeworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykgeworCQlrZXlUYWJsZVtpXSA9IG51bGw7CisJCXZhbHVlVGFibGVbaV0gPSAwOworCX0KKwllbGVtZW50U2l6ZSA9IDA7Cit9CisvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZm9yIHRoZSBrZXkuCisgKgorICogQHBhcmFtIGNoYXJbXSBrZXkgdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KEZpZWxkQmluZGluZyBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoQ29kZShrZXkpOworCXdoaWxlIChrZXlUYWJsZVtpbmRleF0gIT0gbnVsbCkgeworCQlpZiAoZXF1YWxzRm9yTmFtZUFuZFR5cGUoa2V5VGFibGVbaW5kZXhdLCBrZXkpKQorCQkJcmV0dXJuIHRydWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUmV0dXJuIHRydWUgaWYgdGhlIHR3byBmaWVsZCBiaW5kaW5nIGFyZSBjb25zaWRlciBsaWtlIGVxdWFscy4KKyAqLworcHVibGljIGJvb2xlYW4gZXF1YWxzRm9yTmFtZUFuZFR5cGUoRmllbGRCaW5kaW5nIGZpZWxkMSwgRmllbGRCaW5kaW5nIGZpZWxkMikgeworCXJldHVybiAoKGZpZWxkMS50eXBlID09IGZpZWxkMi50eXBlKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZDEubmFtZSwgZmllbGQyLm5hbWUpKTsKK30KKy8qKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZQorICogaGFzaHRhYmxlLgorICogQHBhcmFtIGtleSA8Q09ERT5jaGFyW108L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKiBAcmV0dXJuIGludCB0aGUgZWxlbWVudCBmb3IgdGhlIGtleSBvciAtMSBpZiB0aGUga2V5IGlzIG5vdAorICoJZGVmaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqLworcHVibGljIGludCBnZXQoRmllbGRCaW5kaW5nIGtleSkgeworCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSk7CisJd2hpbGUgKGtleVRhYmxlW2luZGV4XSAhPSBudWxsKSB7CisJCWlmIChlcXVhbHNGb3JOYW1lQW5kVHlwZShrZXlUYWJsZVtpbmRleF0sIGtleSkpCisJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiAtMTsKK30KKy8qKgorICogUmV0dXJuIHRoZSBoYXNoY29kZSBmb3IgdGhlIGtleSBwYXJhbWV0ZXIKKyAqCisgKiBAcGFyYW0ga2V5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZworICogQHJldHVybiBpbnQKKyAqLworcHVibGljIGludCBoYXNoQ29kZShGaWVsZEJpbmRpbmcga2V5KSB7CisJcmV0dXJuICgoQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkubmFtZSkgKyBrZXkudHlwZS5oYXNoQ29kZSgpKSAmIDB4N0ZGRkZGRkYpICUga2V5VGFibGUubGVuZ3RoOworfQorLyoqCisgKiBQdXRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoZSBoYXNodGFibGUsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIGtleS4gIFRoZSBlbGVtZW50IG1heSBiZSByZXRyaWV2ZWQgYnkgZG9pbmcgYSBnZXQoKSB3aXRoIHRoZSBzYW1lIGtleS4KKyAqIFRoZSBrZXkgYW5kIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiAKKyAqIAorICogQHBhcmFtIGtleSA8Q09ERT5PYmplY3Q8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKKyAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICogQHJldHVybiBpbnQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUga2V5LCBvciAtMSBpZiBpdCBkaWQgbm90IGhhdmUgb25lLgorICovCitwdWJsaWMgaW50IHB1dChGaWVsZEJpbmRpbmcga2V5LCBpbnQgdmFsdWUpIHsgCisJaW50IGluZGV4ID0gaGFzaENvZGUoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKGVxdWFsc0Zvck5hbWVBbmRUeXBlKGtleVRhYmxlW2luZGV4XSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlrZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJcmVoYXNoKCk7CisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBSZWhhc2hlcyB0aGUgY29udGVudCBvZiB0aGUgdGFibGUgaW50byBhIGJpZ2dlciB0YWJsZS4KKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGhhc2h0YWJsZSdzCisgKiBzaXplIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4KKyAqLworcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKwlGaWVsZE5hbWVBbmRUeXBlQ2FjaGUgbmV3SGFzaHRhYmxlID0gbmV3IEZpZWxkTmFtZUFuZFR5cGVDYWNoZShrZXlUYWJsZS5sZW5ndGggKiAyKTsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJbmV3SGFzaHRhYmxlLnB1dChrZXlUYWJsZVtpXSwgdmFsdWVUYWJsZVtpXSk7CisKKwl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOworCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgaGFzaHRhYmxlLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPiBUaGUgc2l6ZSBvZiB0aGUgdGFibGUKKyAqLworcHVibGljIGludCBzaXplKCkgeworCXJldHVybiBlbGVtZW50U2l6ZTsKK30KKy8qKgorICogQ29udmVydHMgdG8gYSByYXRoZXIgbGVuZ3RoeSBTdHJpbmcuCisgKgorICogQHJldHVybiBTdHJpbmcgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWludCBtYXggPSBzaXplKCk7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGkgPCBtYXgpIHsKKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxZjgzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Zsb2F0Q2FjaGUuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBGbG9hdENhY2hlIHsKKwlwcml2YXRlIGZsb2F0IGtleVRhYmxlW107CisJcHJpdmF0ZSBpbnQgdmFsdWVUYWJsZVtdOworCXByaXZhdGUgaW50IGVsZW1lbnRTaXplOworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUuIEEgZGVmYXVsdCBjYXBhY2l0eSBhbmQKKyAqIGxvYWQgZmFjdG9yIGlzIHVzZWQuIE5vdGUgdGhhdCB0aGUgaGFzaHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSAKKyAqIGdyb3cgd2hlbiBpdCBnZXRzIGZ1bGwuCisgKi8KK3B1YmxpYyBGbG9hdENhY2hlKCkgeworCXRoaXMoMTMpOworfQorLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwKKyAqIGNhcGFjaXR5LgorICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBpbnQKKyAqICB0aGUgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cworICovCitwdWJsaWMgRmxvYXRDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisJZWxlbWVudFNpemUgPSAwOworCWtleVRhYmxlID0gbmV3IGZsb2F0W2luaXRpYWxDYXBhY2l0eV07CisJdmFsdWVUYWJsZSA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKK30KKy8qKgorICogQ2xlYXJzIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgaXQgaGFzIG5vIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgKi8KK3B1YmxpYyB2b2lkIGNsZWFyKCkgeworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykgeworCQlrZXlUYWJsZVtpXSA9IDAuMGY7CisJCXZhbHVlVGFibGVbaV0gPSAwOworCX0KKwllbGVtZW50U2l6ZSA9IDA7Cit9CisvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZm9yIHRoZSBrZXkuCisgKgorICogQHBhcmFtIGtleSA8Q09ERT5mbG9hdDwvQ09ERT4gdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGZsb2F0IGtleSkgeworCWlmIChrZXkgPT0gMC4wZikgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZWxlbWVudFNpemU7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldID09IDAuMGYpIHsKKwkJCQlpbnQgdmFsdWUxID0gRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5KTsKKwkJCQlpbnQgdmFsdWUyID0gRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5VGFibGVbaV0pOworCQkJCWlmICh2YWx1ZTEgPT0gLTIxNDc0ODM2NDggJiYgdmFsdWUyID09IC0yMTQ3NDgzNjQ4KQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQlpZiAodmFsdWUxID09IDAgJiYgdmFsdWUyID09IDApCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVsZW1lbnRTaXplOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChrZXlUYWJsZVtpXSA9PSBrZXkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKiogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUKKyAqIGhhc2h0YWJsZS4KKyAqIEBwYXJhbSBrZXkgPENPREU+ZmxvYXQ8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKiBAcmV0dXJuIGludCB0aGUgZWxlbWVudCBmb3IgdGhlIGtleSBvciAtMSBpZiB0aGUga2V5IGlzIG5vdAorICogIGRlZmluZWQgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KK3B1YmxpYyBpbnQgZ2V0KGZsb2F0IGtleSkgeworCWlmIChrZXkgPT0gMC4wZikgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZWxlbWVudFNpemU7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldID09IDAuMGYpIHsKKwkJCQlpbnQgdmFsdWUxID0gRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5KTsKKwkJCQlpbnQgdmFsdWUyID0gRmxvYXQuZmxvYXRUb0ludEJpdHMoa2V5VGFibGVbaV0pOworCQkJCWlmICh2YWx1ZTEgPT0gLTIxNDc0ODM2NDggJiYgdmFsdWUyID09IC0yMTQ3NDgzNjQ4KQorCQkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpXTsKKwkJCQlpZiAodmFsdWUxID09IDAgJiYgdmFsdWUyID09IDApCisJCQkJCXJldHVybiB2YWx1ZVRhYmxlW2ldOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVsZW1lbnRTaXplOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChrZXlUYWJsZVtpXSA9PSBrZXkpIHsKKwkJCQlyZXR1cm4gdmFsdWVUYWJsZVtpXTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgorICogCisgKiBAcGFyYW0ga2V5IDxDT0RFPmZsb2F0PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgaGFzaHRhYmxlCisgKiBAcGFyYW0gdmFsdWUgPENPREU+aW50PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAqIEByZXR1cm4gaW50IHZhbHVlCisgKi8KK3B1YmxpYyBpbnQgcHV0KGZsb2F0IGtleSwgaW50IHZhbHVlKSB7CisJaWYgKGVsZW1lbnRTaXplID09IGtleVRhYmxlLmxlbmd0aCkgeworCQkvLyByZXNpemUKKwkJU3lzdGVtLmFycmF5Y29weShrZXlUYWJsZSwgMCwgKGtleVRhYmxlID0gbmV3IGZsb2F0W2VsZW1lbnRTaXplICogMl0pLCAwLCBlbGVtZW50U2l6ZSk7CisJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVUYWJsZSwgMCwgKHZhbHVlVGFibGUgPSBuZXcgaW50W2VsZW1lbnRTaXplICogMl0pLCAwLCBlbGVtZW50U2l6ZSk7CisJfQorCWtleVRhYmxlW2VsZW1lbnRTaXplXSA9IGtleTsKKwl2YWx1ZVRhYmxlW2VsZW1lbnRTaXplXSA9IHZhbHVlOworCWVsZW1lbnRTaXplKys7CisJcmV0dXJuIHZhbHVlOworfQorLyoqCisgKiBDb252ZXJ0cyB0byBhIHJhdGhlciBsZW5ndGh5IFN0cmluZy4KKyAqCisgKiBAcmV0dXJuIFN0cmluZyB0aGUgYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJaW50IG1heCA9IGVsZW1lbnRTaXplOworCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmLmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQlpZiAoKGtleVRhYmxlW2ldICE9IDApIHx8ICgoa2V5VGFibGVbaV0gPT0gMCkgJiYgKHZhbHVlVGFibGVbaV0gIT0gMCkpKSB7CisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGkgPCBtYXgpIHsKKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ludGVnZXJDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWZlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBJbnRlZ2VyQ2FjaGUgeworCXB1YmxpYyBpbnQga2V5VGFibGVbXTsKKwlwdWJsaWMgaW50IHZhbHVlVGFibGVbXTsgCisJaW50IGVsZW1lbnRTaXplOworCWludCB0aHJlc2hvbGQ7CisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZS4gQSBkZWZhdWx0IGNhcGFjaXR5IGFuZAorICogbG9hZCBmYWN0b3IgaXMgdXNlZC4gTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IAorICogZ3JvdyB3aGVuIGl0IGdldHMgZnVsbC4KKyAqLworcHVibGljIEludGVnZXJDYWNoZSgpIHsKKwl0aGlzKDEzKTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCisgKiBjYXBhY2l0eS4KKyAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50CisgKiAgdGhlIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMKKyAqLworcHVibGljIEludGVnZXJDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisJZWxlbWVudFNpemUgPSAwOworCXRocmVzaG9sZCA9IChpbnQpIChpbml0aWFsQ2FwYWNpdHkgKiAwLjY2KTsKKwlrZXlUYWJsZSA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKKwl2YWx1ZVRhYmxlID0gbmV3IGludFtpbml0aWFsQ2FwYWNpdHldOworfQorLyoqCisgKiBDbGVhcnMgdGhlIGhhc2ggdGFibGUgc28gdGhhdCBpdCBoYXMgbm8gbW9yZSBlbGVtZW50cyBpbiBpdC4KKyAqLworcHVibGljIHZvaWQgY2xlYXIoKSB7CisJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCWtleVRhYmxlW2ldID0gMDsKKwkJdmFsdWVUYWJsZVtpXSA9IDA7CisJfQorCWVsZW1lbnRTaXplID0gMDsKK30KKy8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgYW4gZWxlbWVudCBmb3IgdGhlIGtleS4KKyAqCisgKiBAcGFyYW0ga2V5IDxDT0RFPmRvdWJsZTwvQ09ERT4gdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGludCBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoKGtleSk7CisJd2hpbGUgKChrZXlUYWJsZVtpbmRleF0gIT0gMCkgfHwgKChrZXlUYWJsZVtpbmRleF0gPT0gMCkgJiYodmFsdWVUYWJsZVtpbmRleF0gIT0gMCkpKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHRydWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZQorICogaGFzaHRhYmxlLgorICogQHBhcmFtIGtleSA8Q09ERT5kb3VibGU8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKiBAcmV0dXJuIGludCB0aGUgZWxlbWVudCBmb3IgdGhlIGtleSBvciAtMSBpZiB0aGUga2V5IGlzIG5vdAorICogIGRlZmluZWQgaW4gdGhlIGhhc2ggdGFibGUuCisgKi8KK3B1YmxpYyBpbnQgZ2V0KGludCBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoKGtleSk7CisJd2hpbGUgKChrZXlUYWJsZVtpbmRleF0gIT0gMCkgfHwgKChrZXlUYWJsZVtpbmRleF0gPT0gMCkgJiYodmFsdWVUYWJsZVtpbmRleF0gIT0gMCkpKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFJldHVybiBhIGhhc2hjb2RlIGZvciB0aGUgdmFsdWUgb2YgdGhlIGtleSBwYXJhbWV0ZXIuCisgKiBAcGFyYW0ga2V5IGludAorICogQHJldHVybiBpbnQgdGhlIGhhc2ggY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgdmFsdWUKKyAqLworcHVibGljIGludCBoYXNoKGludCBrZXkpIHsKKwlyZXR1cm4gKGtleSAmIDB4N0ZGRkZGRkYpICUga2V5VGFibGUubGVuZ3RoOworfQorLyoqCisgKiBQdXRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoZSBoYXNodGFibGUsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIGtleS4gIFRoZSBlbGVtZW50IG1heSBiZSByZXRyaWV2ZWQgYnkgZG9pbmcgYSBnZXQoKSB3aXRoIHRoZSBzYW1lIGtleS4KKyAqIAorICogQHBhcmFtIGtleSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKKyAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICogQHJldHVybiBpbnQgdmFsdWUKKyAqLworcHVibGljIGludCBwdXQoaW50IGtleSwgaW50IHZhbHVlKSB7CisJaW50IGluZGV4ID0gaGFzaChrZXkpOworCXdoaWxlICgoa2V5VGFibGVbaW5kZXhdICE9IDApIHx8ICgoa2V5VGFibGVbaW5kZXhdID09IDApICYmICh2YWx1ZVRhYmxlW2luZGV4XSAhPSAwKSkpIHsKKwkJaWYgKGtleVRhYmxlW2luZGV4XSA9PSBrZXkpCisJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJa2V5VGFibGVbaW5kZXhdID0ga2V5OworCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpIHsKKwkJcmVoYXNoKCk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUmVoYXNoZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHRhYmxlIGludG8gYSBiaWdnZXIgdGFibGUuCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBoYXNodGFibGUncworICogc2l6ZSBleGNlZWRzIHRoZSB0aHJlc2hvbGQuCisgKi8KK3ByaXZhdGUgdm9pZCByZWhhc2goKSB7CisJSW50ZWdlckNhY2hlIG5ld0hhc2h0YWJsZSA9IG5ldyBJbnRlZ2VyQ2FjaGUoa2V5VGFibGUubGVuZ3RoICogMik7CisJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCWludCBrZXkgPSBrZXlUYWJsZVtpXTsKKwkJaW50IHZhbHVlID0gdmFsdWVUYWJsZVtpXTsKKwkJaWYgKChrZXkgIT0gMCkgfHwgKChrZXkgPT0gMCkgJiYgKHZhbHVlICE9IDApKSkgeworCQkJbmV3SGFzaHRhYmxlLnB1dChrZXksIHZhbHVlKTsKKwkJfQorCX0KKwl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOworCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgaGFzaHRhYmxlLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPiBUaGUgc2l6ZSBvZiB0aGUgdGFibGUKKyAqLworcHVibGljIGludCBzaXplKCkgeworCXJldHVybiBlbGVtZW50U2l6ZTsKK30KKy8qKgorICogQ29udmVydHMgdG8gYSByYXRoZXIgbGVuZ3RoeSBTdHJpbmcuCisgKgorICogQHJldHVybiBTdHJpbmcgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWludCBtYXggPSBzaXplKCk7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmICgoa2V5VGFibGVbaV0gIT0gMCkgfHwgKChrZXlUYWJsZVtpXSA9PSAwKSAmJiAodmFsdWVUYWJsZVtpXSAhPSAwKSkpIHsKKwkJCWJ1Zi5hcHBlbmQoa2V5VGFibGVbaV0pLmFwcGVuZCgiLT4iKS5hcHBlbmQodmFsdWVUYWJsZVtpXSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoaSA8IG1heCkgeworCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWJ1Zi5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWYudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xhYmVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZGVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRNZXRob2Q7CisKKy8qKgorICogVGhpcyB0eXBlIGlzIGEgcG9ydCBvZiBzbWFsbHRhbGtzIEphdmFMYWJlbAorICovCitwdWJsaWMgY2xhc3MgTGFiZWwgeworCXB1YmxpYyBDb2RlU3RyZWFtIGNvZGVTdHJlYW07CisJZmluYWwgc3RhdGljIGludCBQT1NfTk9UX1NFVCA9IC0xOworCXB1YmxpYyBpbnQgcG9zaXRpb24gPSBQT1NfTk9UX1NFVDsgLy8gcG9zaXRpb249UE9TX05PVF9TRVQgVGhlbiBpdCdzIHBvcyBpcyBub3Qgc2V0LgorCXB1YmxpYyBpbnRbXSBmb3J3YXJkUmVmZXJlbmNlcyA9IG5ldyBpbnRbMTBdOyAvLyBBZGQgYW4gb3ZlcmZsb3cgY2hlY2sgaGVyZS4KKwlwdWJsaWMgaW50IGZvcndhcmRSZWZlcmVuY2VDb3VudCA9IDA7CisJcHJpdmF0ZSBib29sZWFuIGlzV2lkZSA9IGZhbHNlOworcHVibGljIExhYmVsKCkgeworfQorLyoqCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKi8KK3B1YmxpYyBMYWJlbChDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwl0aGlzLmNvZGVTdHJlYW0gPSBjb2RlU3RyZWFtOworfQorLyoqCisgKiBBZGQgYSBmb3J3YXJkIHJlZnJlbmNlIGZvciB0aGUgYXJyYXkuCisgKi8KK3ZvaWQgYWRkRm9yd2FyZFJlZmVyZW5jZShpbnQgaVBvcykgeworCWludCBsZW5ndGg7CisJaWYgKGZvcndhcmRSZWZlcmVuY2VDb3VudCA+PSAobGVuZ3RoID0gZm9yd2FyZFJlZmVyZW5jZXMubGVuZ3RoKSkKKwkJU3lzdGVtLmFycmF5Y29weShmb3J3YXJkUmVmZXJlbmNlcywgMCwgKGZvcndhcmRSZWZlcmVuY2VzID0gbmV3IGludFsyKmxlbmd0aF0pLCAwLCBsZW5ndGgpOworCWZvcndhcmRSZWZlcmVuY2VzW2ZvcndhcmRSZWZlcmVuY2VDb3VudCsrXSA9IGlQb3M7Cit9CisvKioKKyAqIEFkZCBhIGZvcndhcmQgcmVmcmVuY2UgZm9yIHRoZSBhcnJheS4KKyAqLworcHVibGljIHZvaWQgYXBwZW5kRm9yd2FyZFJlZmVyZW5jZXNGcm9tKExhYmVsIG90aGVyTGFiZWwpIHsKKwlpbnQgb3RoZXJDb3VudCA9IG90aGVyTGFiZWwuZm9yd2FyZFJlZmVyZW5jZUNvdW50OworCWlmIChvdGhlckNvdW50ID09IDApIHJldHVybjsKKwlpbnQgbGVuZ3RoID0gZm9yd2FyZFJlZmVyZW5jZXMubGVuZ3RoOworCWludCBuZWVkZWRTcGFjZSA9IG90aGVyQ291bnQgKyBmb3J3YXJkUmVmZXJlbmNlQ291bnQ7CisJaWYgKG5lZWRlZFNwYWNlID49IGxlbmd0aCl7CisJCVN5c3RlbS5hcnJheWNvcHkoZm9yd2FyZFJlZmVyZW5jZXMsIDAsIChmb3J3YXJkUmVmZXJlbmNlcyA9IG5ldyBpbnRbbmVlZGVkU3BhY2VdKSwgMCwgZm9yd2FyZFJlZmVyZW5jZUNvdW50KTsKKwl9CisJLy8gYXBwZW5kIG90aGVyIGZvcndhcmQgcmVmZXJlbmNlcyBhdCB0aGUgZW5kLCBzbyB0aGV5IHdpbGwgZ2V0IHVwZGF0ZWQgYXMgd2VsbAorCVN5c3RlbS5hcnJheWNvcHkob3RoZXJMYWJlbC5mb3J3YXJkUmVmZXJlbmNlcywgMCwgZm9yd2FyZFJlZmVyZW5jZXMsIGZvcndhcmRSZWZlcmVuY2VDb3VudCwgb3RoZXJDb3VudCk7CisJZm9yd2FyZFJlZmVyZW5jZUNvdW50ID0gbmVlZGVkU3BhY2U7Cit9CisvKgorKiBQdXQgZG93biAgYSByZWZlcm5lY2UgdG8gdGhlIGFycmF5IGF0IHRoZSBsb2NhdGlvbiBpbiB0aGUgY29kZXN0cmVhbS4KKyovCit2b2lkIGJyYW5jaCgpIHsKKwlpZiAocG9zaXRpb24gPT0gUE9TX05PVF9TRVQpIHsKKwkJYWRkRm9yd2FyZFJlZmVyZW5jZShjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJLy8gTGVhdmUgdHdvIGJ5dGVzIGZyZWUgdG8gZ2VuZXJhdGUgdGhlIGp1bXAgYWZ0ZXJ3YXJkcworCQljb2RlU3RyZWFtLnBvc2l0aW9uICs9IDI7CisJCWNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0ICs9IDI7CisJfSBlbHNlIHsgLy9Qb3NpdGlvbiBpcyBzZXQuIFdyaXRlIGl0IQorCQljb2RlU3RyZWFtLndyaXRlU2lnbmVkU2hvcnQoKHNob3J0KSAocG9zaXRpb24gLSBjb2RlU3RyZWFtLnBvc2l0aW9uICsgMSkpOworCX0KK30KKy8qCisqIE5vIHN1cHBvcnQgZm9yIHdpZGUgYnJhbmNoZXMgeWV0CisqLwordm9pZCBicmFuY2hXaWRlKCkgeworCWlmIChwb3NpdGlvbiA9PSBQT1NfTk9UX1NFVCkgeworCQlhZGRGb3J3YXJkUmVmZXJlbmNlKGNvZGVTdHJlYW0ucG9zaXRpb24pOworCQkvLyBMZWF2ZSA0IGJ5dGVzIGZyZWUgdG8gZ2VuZXJhdGUgdGhlIGp1bXAgb2Zmc2V0IGFmdGVyd2FyZHMKKwkJaXNXaWRlID0gdHJ1ZTsKKwkJY29kZVN0cmVhbS5wb3NpdGlvbiArPSA0OworCQljb2RlU3RyZWFtLmNsYXNzRmlsZU9mZnNldCArPSA0OworCX0gZWxzZSB7IC8vUG9zaXRpb24gaXMgc2V0LiBXcml0ZSBpdCEKKwkJY29kZVN0cmVhbS53cml0ZVNpZ25lZFdvcmQocG9zaXRpb24gLSBjb2RlU3RyZWFtLnBvc2l0aW9uICsgMSk7CisJfQorfQorLyoqCisgKiBAcmV0dXJuIGJvb2xlYW4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzRm9yd2FyZFJlZmVyZW5jZXMoKSB7CisJcmV0dXJuIGZvcndhcmRSZWZlcmVuY2VDb3VudCAhPSAwOworfQorLyoKKyAqIFNvbWUgcGxhY2VkIGxhYmVscyBtaWdodCBiZSBicmFuY2hpbmcgdG8gYSBnb3RvIGJ5dGVjb2RlIHdoaWNoIHdlIGNhbiBvcHRpbWl6ZSBiZXR0ZXIuCisgKi8KK3B1YmxpYyB2b2lkIGlubGluZUZvcndhcmRSZWZlcmVuY2VzRnJvbUxhYmVsc1RhcmdldGluZyhpbnQgZ290b0xvY2F0aW9uKSB7CisvKgorIENvZGUgcmVxdWlyZWQgdG8gb3B0aW1pemVkIHVucmVhY2hhYmxlIGdvdG9zLgorCXB1YmxpYyBib29sZWFuIGlzQnJhbmNoVGFyZ2V0KGludCBsb2NhdGlvbikgeworCQlMYWJlbFtdIGxhYmVscyA9IGNvZGVTdHJlYW0ubGFiZWxzOworCQlmb3IgKGludCBpID0gY29kZVN0cmVhbS5jb3VudExhYmVscyAtIDE7IGkgPj0gMDsgaS0tKXsKKwkJCUxhYmVsIGxhYmVsID0gbGFiZWxzW2ldOworCQkJaWYgKChsYWJlbC5wb3NpdGlvbiA9PSBsb2NhdGlvbikgJiYgbGFiZWwuaXNTdGFuZGFyZExhYmVsKCkpeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisgKi8KKwkKKwlMYWJlbFtdIGxhYmVscyA9IGNvZGVTdHJlYW0ubGFiZWxzOworCWZvciAoaW50IGkgPSBjb2RlU3RyZWFtLmNvdW50TGFiZWxzIC0gMTsgaSA+PSAwOyBpLS0peworCQlMYWJlbCBsYWJlbCA9IGxhYmVsc1tpXTsKKwkJaWYgKChsYWJlbC5wb3NpdGlvbiA9PSBnb3RvTG9jYXRpb24pICYmIGxhYmVsLmlzU3RhbmRhcmRMYWJlbCgpKXsKKwkJCXRoaXMuYXBwZW5kRm9yd2FyZFJlZmVyZW5jZXNGcm9tKGxhYmVsKTsKKwkJCS8qCisJCQkgQ29kZSByZXF1aXJlZCB0byBvcHRpbWl6ZWQgdW5yZWFjaGFibGUgZ290b3MuCisJCQkJbGFiZWwucG9zaXRpb24gPSBQT1NfTk9UX1NFVDsKKwkJCSovCisJCX0gZWxzZSB7CisJCQlicmVhazsgLy8gc2FtZSB0YXJnZXQgbGFiZWxzIHNob3VsZCBiZSBjb250aWd1b3VzCisJCX0KKwl9Cit9CitwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYXJkTGFiZWwoKXsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qCisqIFBsYWNlIHRoZSBsYWJlbC4gSWYgd2UgaGF2ZSBmb3J3YXJkIHJlZmVyZW5jZXMgcmVzb2x2ZSB0aGVtLgorKi8KK3B1YmxpYyB2b2lkIHBsYWNlKCkgeyAvLyBDdXJyZW50bHkgbGFja2luZyB3aWRlIHN1cHBvcnQuCisJaWYgKHBvc2l0aW9uID09IFBPU19OT1RfU0VUKSB7CisJCXBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJY29kZVN0cmVhbS5hZGRMYWJlbCh0aGlzKTsKKwkJaW50IG9sZFBvc2l0aW9uID0gcG9zaXRpb247CisJCWJvb2xlYW4gb3B0aW1pemVkQnJhbmNoID0gZmFsc2U7CisJCS8vIFRVUk5FRCBPRkYgc2luY2UgZmFpbCBvbiAxRjRJUkQ5CisJCWlmIChmb3J3YXJkUmVmZXJlbmNlQ291bnQgIT0gMCkgeworCQkJaWYgKG9wdGltaXplZEJyYW5jaCA9IChmb3J3YXJkUmVmZXJlbmNlc1tmb3J3YXJkUmVmZXJlbmNlQ291bnQgLSAxXSArIDIgPT0gcG9zaXRpb24pICYmIChjb2RlU3RyZWFtLmJDb2RlU3RyZWFtW2NvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0IC0gM10gPT0gQ29kZVN0cmVhbS5PUENfZ290bykpIHsKKwkJCQljb2RlU3RyZWFtLnBvc2l0aW9uID0gKHBvc2l0aW9uIC09IDMpOworCQkJCWNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0IC09IDM7CisJCQkJZm9yd2FyZFJlZmVyZW5jZUNvdW50LS07CisJCQkJLy8gYWxzbyB1cGRhdGUgdGhlIFBDcyBpbiB0aGUgcmVsYXRlZCBkZWJ1ZyBhdHRyaWJ1dGVzCisJCQkJLyoqIE9MRCBDT0RFCisJCQkJCWludCBpbmRleCA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgLSAxOworCQkJCQkJd2hpbGUgKChpbmRleCA+PSAwKSAmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwW2luZGV4XVsxXSA9PSBvbGRQb3NpdGlvbikpIHsKKwkJCQkJCQljb2RlU3RyZWFtLnBjVG9Tb3VyY2VNYXBbaW5kZXgtLV1bMV0gPSBwb3NpdGlvbjsKKwkJCQkJCX0KKwkJCQkqLworCQkJCS8vIEJlZ2lubmluZyBvZiBuZXcgY29kZQorCQkJCWludCBpbmRleCA9IGNvZGVTdHJlYW0ucGNUb1NvdXJjZU1hcFNpemUgLSAyOworCQkJCWlmIChjb2RlU3RyZWFtLmxhc3RFbnRyeVBDID09IG9sZFBvc2l0aW9uKSB7CisJCQkJCWNvZGVTdHJlYW0ubGFzdEVudHJ5UEMgPSBwb3NpdGlvbjsKKwkJCQl9CisJCQkJaWYgKChpbmRleCA+PSAwKSAmJiAoY29kZVN0cmVhbS5wY1RvU291cmNlTWFwW2luZGV4XSA9PSBwb3NpdGlvbikpIHsKKwkJCQkJY29kZVN0cmVhbS5wY1RvU291cmNlTWFwU2l6ZS09MjsKKwkJCQl9CisJCQkJLy8gZW5kIG9mIG5ldyBjb2RlCisJCQkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGVzKSB7CisJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2Fsc1tdID0gY29kZVN0cmVhbS5sb2NhbHM7CisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBsb2NhbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxzW2ldOworCQkJCQkJaWYgKChsb2NhbCAhPSBudWxsKSAmJiAobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCA+IDApKSB7CisJCQkJCQkJaWYgKGxvY2FsLmluaXRpYWxpemF0aW9uUENzWygobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPT0gb2xkUG9zaXRpb24pIHsKKwkJCQkJCQkJLy8gd2Ugd2FudCB0byBwcmV2ZW50IGludGVydmFsIG9mIHNpemUgMCB0byBoYXZlIGEgbmVnYXRpdmUgc2l6ZS4KKwkJCQkJCQkJLy8gc2VlIFBSIDFHSVJRTEE6IElUUEpDT1JFOkFMTCAtIENsYXNzRm9ybWF0RXJyb3IgZm9yIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZQorCQkJCQkJCQlsb2NhbC5pbml0aWFsaXphdGlvblBDc1soKGxvY2FsLmluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID0gcG9zaXRpb247CisJCQkJCQkJfQorCQkJCQkJCWlmIChsb2NhbC5pbml0aWFsaXphdGlvblBDc1sobG9jYWwuaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDFdID09IG9sZFBvc2l0aW9uKSB7CisJCQkJCQkJCWxvY2FsLmluaXRpYWxpemF0aW9uUENzWyhsb2NhbC5pbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMV0gPSBwb3NpdGlvbjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3J3YXJkUmVmZXJlbmNlQ291bnQ7IGkrKykgeworCQkJaW50IG9mZnNldCA9IHBvc2l0aW9uIC0gZm9yd2FyZFJlZmVyZW5jZXNbaV0gKyAxOworCQkJaWYgKG9mZnNldCA+IDB4N0ZGRiAmJiAhdGhpcy5jb2RlU3RyZWFtLndpZGVNb2RlKSB7CisJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKENvZGVTdHJlYW0uUkVTVEFSVF9JTl9XSURFX01PREUpOworCQkJfQorCQkJaWYgKHRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgeworCQkJCWlmICh0aGlzLmlzV2lkZSkgeworCQkJCQljb2RlU3RyZWFtLndyaXRlU2lnbmVkV29yZChmb3J3YXJkUmVmZXJlbmNlc1tpXSwgb2Zmc2V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLndyaXRlU2lnbmVkU2hvcnQoZm9yd2FyZFJlZmVyZW5jZXNbaV0sIChzaG9ydCkgb2Zmc2V0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRTaG9ydChmb3J3YXJkUmVmZXJlbmNlc1tpXSwgKHNob3J0KSBvZmZzZXQpOworCQkJfQorCQl9CisJCS8vIEZvciBhbGwgbGFiZWxzIHBsYWNlZCBhdCB0aGF0IHBvc2l0aW9uIHdlIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmV3cml0ZSB0aGUganVtcAorCQkvLyBvZmZzZXQuIEl0IGlzIHRoZSBjYXNlIGVhY2ggdGltZSBhIGxhYmVsIGhhZCBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorCQkvLyBMaWtlIHdlIGNoYW5nZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIGp1bXAgb2Zmc2V0LiBTZWUgMUY0SVJEOSBmb3IgbW9yZSBkZXRhaWxzLgorCQlpZiAob3B0aW1pemVkQnJhbmNoKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGVTdHJlYW0uY291bnRMYWJlbHM7IGkrKykgeworCQkJCUxhYmVsIGxhYmVsID0gY29kZVN0cmVhbS5sYWJlbHNbaV07CisJCQkJaWYgKG9sZFBvc2l0aW9uID09IGxhYmVsLnBvc2l0aW9uKSB7CisJCQkJCWxhYmVsLnBvc2l0aW9uID0gcG9zaXRpb247CisJCQkJCWlmIChsYWJlbCBpbnN0YW5jZW9mIENhc2VMYWJlbCkgeworCQkJCQkJaW50IG9mZnNldCA9IHBvc2l0aW9uIC0gKChDYXNlTGFiZWwpIGxhYmVsKS5pbnN0cnVjdGlvblBvc2l0aW9uOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsYWJlbC5mb3J3YXJkUmVmZXJlbmNlQ291bnQ7IGorKykgeworCQkJCQkJCWludCBmb3J3YXJkUG9zaXRpb24gPSBsYWJlbC5mb3J3YXJkUmVmZXJlbmNlc1tqXTsKKwkJCQkJCQljb2RlU3RyZWFtLndyaXRlU2lnbmVkV29yZChmb3J3YXJkUG9zaXRpb24sIG9mZnNldCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxhYmVsLmZvcndhcmRSZWZlcmVuY2VDb3VudDsgaisrKSB7CisJCQkJCQkJaW50IGZvcndhcmRQb3NpdGlvbiA9IGxhYmVsLmZvcndhcmRSZWZlcmVuY2VzW2pdOworCQkJCQkJCWludCBvZmZzZXQgPSBwb3NpdGlvbiAtIGZvcndhcmRQb3NpdGlvbiArIDE7CisJCQkJCQkJaWYgKG9mZnNldCA+IDB4N0ZGRiAmJiAhdGhpcy5jb2RlU3RyZWFtLndpZGVNb2RlKSB7CisJCQkJCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChDb2RlU3RyZWFtLlJFU1RBUlRfSU5fV0lERV9NT0RFKTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgeworCQkJCQkJCQlpZiAodGhpcy5pc1dpZGUpIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRXb3JkKGZvcndhcmRQb3NpdGlvbiwgb2Zmc2V0KTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRTaG9ydChmb3J3YXJkUG9zaXRpb24sIChzaG9ydCkgb2Zmc2V0KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRTaG9ydChmb3J3YXJkUG9zaXRpb24sIChzaG9ydCkgb2Zmc2V0KTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIFByaW50IG91dCB0aGUgcmVjZWl2ZXIKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiKHBvc2l0aW9uPSIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZChwb3NpdGlvbik7CisJYnVmZmVyLmFwcGVuZCgiLCBmb3J3YXJkcyA9IFsiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yd2FyZFJlZmVyZW5jZUNvdW50IC0gMTsgaSsrKQorCQlidWZmZXIuYXBwZW5kKGZvcndhcmRSZWZlcmVuY2VzW2ldICsgIiwgIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZm9yd2FyZFJlZmVyZW5jZUNvdW50ID49IDEpCisJCWJ1ZmZlci5hcHBlbmQoZm9yd2FyZFJlZmVyZW5jZXNbZm9yd2FyZFJlZmVyZW5jZUNvdW50LTFdKTsKKwlidWZmZXIuYXBwZW5kKCJdICkiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworcHVibGljIHZvaWQgcmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCkgeworCXRoaXMucG9zaXRpb24gPSBQT1NfTk9UX1NFVDsKKwl0aGlzLmZvcndhcmRSZWZlcmVuY2VDb3VudCA9IDA7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xvbmdDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDQ0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBMb25nQ2FjaGUgeworCXB1YmxpYyBsb25nIGtleVRhYmxlW107CisJcHVibGljIGludCB2YWx1ZVRhYmxlW107IAorCWludCBlbGVtZW50U2l6ZTsKKwlpbnQgdGhyZXNob2xkOworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUuIEEgZGVmYXVsdCBjYXBhY2l0eSBhbmQKKyAqIGxvYWQgZmFjdG9yIGlzIHVzZWQuIE5vdGUgdGhhdCB0aGUgaGFzaHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSAKKyAqIGdyb3cgd2hlbiBpdCBnZXRzIGZ1bGwuCisgKi8KK3B1YmxpYyBMb25nQ2FjaGUoKSB7CisJdGhpcygxMyk7Cit9CisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGhhc2h0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbAorICogY2FwYWNpdHkuCisgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IGludAorICogIHRoZSBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzCisgKi8KK3B1YmxpYyBMb25nQ2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCWVsZW1lbnRTaXplID0gMDsKKwl0aHJlc2hvbGQgPSAoaW50KSAoaW5pdGlhbENhcGFjaXR5ICogMC42Nik7CisJa2V5VGFibGUgPSBuZXcgbG9uZ1tpbml0aWFsQ2FwYWNpdHldOworCXZhbHVlVGFibGUgPSBuZXcgaW50W2luaXRpYWxDYXBhY2l0eV07Cit9CisvKioKKyAqIENsZWFycyB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IGl0IGhhcyBubyBtb3JlIGVsZW1lbnRzIGluIGl0LgorICovCitwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJa2V5VGFibGVbaV0gPSAwOworCQl2YWx1ZVRhYmxlW2ldID0gMDsKKwl9CisJZWxlbWVudFNpemUgPSAwOworfQorLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhbiBlbGVtZW50IGZvciB0aGUga2V5LgorICoKKyAqIEBwYXJhbSBrZXkgPENPREU+bG9uZzwvQ09ERT4gdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGxvbmcga2V5KSB7CisJaW50IGluZGV4ID0gaGFzaChrZXkpOworCXdoaWxlICgoa2V5VGFibGVbaW5kZXhdICE9IDApIHx8ICgoa2V5VGFibGVbaW5kZXhdID09IDApICYmKHZhbHVlVGFibGVbaW5kZXhdICE9IDApKSkgeworCQlpZiAoa2V5VGFibGVbaW5kZXhdID09IGtleSkKKwkJCXJldHVybiB0cnVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKiogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUKKyAqIGhhc2h0YWJsZS4KKyAqIEBwYXJhbSBrZXkgPENPREU+bG9uZzwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkKKyAqIEByZXR1cm4gaW50IHRoZSBlbGVtZW50IGZvciB0aGUga2V5IG9yIC0xIGlmIHRoZSBrZXkgaXMgbm90CisgKiAgZGVmaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqLworcHVibGljIGludCBnZXQobG9uZyBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoKGtleSk7CisJd2hpbGUgKChrZXlUYWJsZVtpbmRleF0gIT0gMCkgfHwgKChrZXlUYWJsZVtpbmRleF0gPT0gMCkgJiYodmFsdWVUYWJsZVtpbmRleF0gIT0gMCkpKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFJldHVybiBhIGhhc2hjb2RlIGZvciB0aGUgdmFsdWUgb2YgdGhlIGtleSBwYXJhbWV0ZXIuCisgKiBAcGFyYW0ga2V5IGxvbmcKKyAqIEByZXR1cm4gaW50IHRoZSBoYXNoIGNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUga2V5IHZhbHVlCisgKi8KK3B1YmxpYyBpbnQgaGFzaChsb25nIGtleSkgeworCXJldHVybiAoKGludCkga2V5ICYgMHg3RkZGRkZGRikgJSBrZXlUYWJsZS5sZW5ndGg7Cit9CisvKioKKyAqIFB1dHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGhhc2h0YWJsZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICoga2V5LiAgVGhlIGVsZW1lbnQgbWF5IGJlIHJldHJpZXZlZCBieSBkb2luZyBhIGdldCgpIHdpdGggdGhlIHNhbWUga2V5LgorICogCisgKiBAcGFyYW0ga2V5IDxDT0RFPmxvbmc8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKKyAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICogQHJldHVybiBpbnQgdmFsdWUKKyAqLworcHVibGljIGludCBwdXQobG9uZyBrZXksIGludCB2YWx1ZSkgeworCWludCBpbmRleCA9IGhhc2goa2V5KTsKKwl3aGlsZSAoKGtleVRhYmxlW2luZGV4XSAhPSAwKSB8fCAoKGtleVRhYmxlW2luZGV4XSA9PSAwKSAmJiAodmFsdWVUYWJsZVtpbmRleF0gIT0gMCkpKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCWtleVRhYmxlW2luZGV4XSA9IGtleTsKKwl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCisJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQorCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKSB7CisJCXJlaGFzaCgpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFJlaGFzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB0YWJsZSBpbnRvIGEgYmlnZ2VyIHRhYmxlLgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaGFzaHRhYmxlJ3MKKyAqIHNpemUgZXhjZWVkcyB0aGUgdGhyZXNob2xkLgorICovCitwcml2YXRlIHZvaWQgcmVoYXNoKCkgeworCUxvbmdDYWNoZSBuZXdIYXNodGFibGUgPSBuZXcgTG9uZ0NhY2hlKGtleVRhYmxlLmxlbmd0aCAqIDIpOworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykgeworCQlsb25nIGtleSA9IGtleVRhYmxlW2ldOworCQlpbnQgdmFsdWUgPSB2YWx1ZVRhYmxlW2ldOworCQlpZiAoKGtleSAhPSAwKSB8fCAoKGtleSA9PSAwKSAmJiAodmFsdWUgIT0gMCkpKSB7CisJCQluZXdIYXNodGFibGUucHV0KGtleSwgdmFsdWUpOworCQl9CisJfQorCXRoaXMua2V5VGFibGUgPSBuZXdIYXNodGFibGUua2V5VGFibGU7CisJdGhpcy52YWx1ZVRhYmxlID0gbmV3SGFzaHRhYmxlLnZhbHVlVGFibGU7CisJdGhpcy50aHJlc2hvbGQgPSBuZXdIYXNodGFibGUudGhyZXNob2xkOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBoYXNodGFibGUuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+IFRoZSBzaXplIG9mIHRoZSB0YWJsZQorICovCitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplOworfQorLyoqCisgKiBDb252ZXJ0cyB0byBhIHJhdGhlciBsZW5ndGh5IFN0cmluZy4KKyAqCisgKiBAcmV0dXJuIFN0cmluZyB0aGUgYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJaW50IG1heCA9IHNpemUoKTsKKwlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJ1Zi5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKwkJaWYgKChrZXlUYWJsZVtpXSAhPSAwKSB8fCAoKGtleVRhYmxlW2ldID09IDApICYmICh2YWx1ZVRhYmxlW2ldICE9IDApKSkgeworCQkJYnVmLmFwcGVuZChrZXlUYWJsZVtpXSkuYXBwZW5kKCItPiIpLmFwcGVuZCh2YWx1ZVRhYmxlW2ldKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChpIDwgbWF4KSB7CisJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJYnVmLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTWV0aG9kTmFtZUFuZFR5cGVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTWV0aG9kTmFtZUFuZFR5cGVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjU4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9NZXRob2ROYW1lQW5kVHlwZUNhY2hlLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBNZXRob2ROYW1lQW5kVHlwZUNhY2hlIHsKKwlwdWJsaWMgTWV0aG9kQmluZGluZyBrZXlUYWJsZVtdOworCXB1YmxpYyBpbnQgdmFsdWVUYWJsZVtdOyAKKwlpbnQgZWxlbWVudFNpemU7CisJaW50IHRocmVzaG9sZDsKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlLiBBIGRlZmF1bHQgY2FwYWNpdHkgaXMgdXNlZC4KKyAqIE5vdGUgdGhhdCB0aGUgaGFzaHRhYmxlIHdpbGwgYXV0b21hdGljYWxseSBncm93IHdoZW4gaXQgZ2V0cyBmdWxsLgorICovCitwdWJsaWMgTWV0aG9kTmFtZUFuZFR5cGVDYWNoZSgpIHsKKwl0aGlzKDEzKTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCisgKiBjYXBhY2l0eS4KKyAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50CisgKgl0aGUgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cworICovCitwdWJsaWMgTWV0aG9kTmFtZUFuZFR5cGVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CisJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAoaW5pdGlhbENhcGFjaXR5ICogMC42NmYpOworCXRoaXMua2V5VGFibGUgPSBuZXcgTWV0aG9kQmluZGluZ1tpbml0aWFsQ2FwYWNpdHldOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKK30KKy8qKgorICogQ2xlYXJzIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgaXQgaGFzIG5vIG1vcmUgZWxlbWVudHMgaW4gaXQuCisgKi8KK3B1YmxpYyB2b2lkIGNsZWFyKCkgeworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykgeworCQlrZXlUYWJsZVtpXSA9IG51bGw7CisJCXZhbHVlVGFibGVbaV0gPSAwOworCX0KKwllbGVtZW50U2l6ZSA9IDA7Cit9CisvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGFuIGVsZW1lbnQgZm9yIHRoZSBrZXkuCisgKgorICogQHBhcmFtIGNoYXJbXSBrZXkgdGhlIGtleSB0aGF0IHdlIGFyZSBsb29raW5nIGZvcgorICogQHJldHVybiBib29sZWFuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE1ldGhvZEJpbmRpbmcga2V5KSB7CisJaW50IGluZGV4ID0gaGFzaENvZGUoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKGVxdWFsc0Zvck5hbWVBbmRUeXBlKGtleVRhYmxlW2luZGV4XSwga2V5KSkKKwkJCXJldHVybiB0cnVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG1ldGhvZEJpbmRpbmcgYXJlIGNvbnNpZGVyIHRvIGJlIGVxdWFsIGZvciB0aGUgbmFtZSBhbmQgdHlwZQorICogcHVycG9zZQorICovCitwdWJsaWMgYm9vbGVhbiBlcXVhbHNGb3JOYW1lQW5kVHlwZShNZXRob2RCaW5kaW5nIG1ldGhvZDEsIE1ldGhvZEJpbmRpbmcgbWV0aG9kMikgeworCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2QxLnNlbGVjdG9yLCBtZXRob2QyLnNlbGVjdG9yKSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2QxLnNpZ25hdHVyZSgpLCBtZXRob2QyLnNpZ25hdHVyZSgpKTsKK30KKy8qKiBHZXRzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZQorICogaGFzaHRhYmxlLgorICogQHBhcmFtIGtleSA8Q09ERT5jaGFyW108L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5CisgKiBAcmV0dXJuIGludCB0aGUgZWxlbWVudCBmb3IgdGhlIGtleSBvciAtMSBpZiB0aGUga2V5IGlzIG5vdAorICoJZGVmaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqLworcHVibGljIGludCBnZXQoTWV0aG9kQmluZGluZyBrZXkpIHsKKwlpbnQgaW5kZXggPSBoYXNoQ29kZShrZXkpOworCXdoaWxlIChrZXlUYWJsZVtpbmRleF0gIT0gbnVsbCkgeworCQlpZiAoZXF1YWxzRm9yTmFtZUFuZFR5cGUoa2V5VGFibGVbaW5kZXhdLCBrZXkpKQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFJldHVybiB0aGUgaGFzaGNvZGUgZm9yIHRoZSBrZXkgcGFyYW1ldGVyCisgKgorICogQHBhcmFtIGtleSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gaW50CisgKi8KK3B1YmxpYyBpbnQgaGFzaENvZGUoTWV0aG9kQmluZGluZyBrZXkpIHsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkuc2VsZWN0b3IpICUga2V5VGFibGUubGVuZ3RoOworfQorLyoqCisgKiBQdXRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoZSBoYXNodGFibGUsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIGtleS4gIFRoZSBlbGVtZW50IG1heSBiZSByZXRyaWV2ZWQgYnkgZG9pbmcgYSBnZXQoKSB3aXRoIHRoZSBzYW1lIGtleS4KKyAqIFRoZSBrZXkgYW5kIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiAKKyAqIAorICogQHBhcmFtIGtleSA8Q09ERT5PYmplY3Q8L0NPREU+IHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBoYXNodGFibGUKKyAqIEBwYXJhbSB2YWx1ZSA8Q09ERT5pbnQ8L0NPREU+IHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICogQHJldHVybiBpbnQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUga2V5LCBvciAtMSBpZiBpdCBkaWQgbm90IGhhdmUgb25lLgorICovCitwdWJsaWMgaW50IHB1dChNZXRob2RCaW5kaW5nIGtleSwgaW50IHZhbHVlKSB7IAorCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSk7CisJd2hpbGUgKGtleVRhYmxlW2luZGV4XSAhPSBudWxsKSB7CisJCWlmIChlcXVhbHNGb3JOYW1lQW5kVHlwZShrZXlUYWJsZVtpbmRleF0sIGtleSkpCisJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJa2V5VGFibGVbaW5kZXhdID0ga2V5OworCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJCXJlaGFzaCgpOworCXJldHVybiB2YWx1ZTsKK30KKy8qKgorICogUmVoYXNoZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHRhYmxlIGludG8gYSBiaWdnZXIgdGFibGUuCisgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBoYXNodGFibGUncworICogc2l6ZSBleGNlZWRzIHRoZSB0aHJlc2hvbGQuCisgKi8KK3ByaXZhdGUgdm9pZCByZWhhc2goKSB7CisJTWV0aG9kTmFtZUFuZFR5cGVDYWNoZSBuZXdIYXNodGFibGUgPSBuZXcgTWV0aG9kTmFtZUFuZFR5cGVDYWNoZShrZXlUYWJsZS5sZW5ndGggKiAyKTsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJbmV3SGFzaHRhYmxlLnB1dChrZXlUYWJsZVtpXSwgdmFsdWVUYWJsZVtpXSk7CisKKwl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOworCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgaGFzaHRhYmxlLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPiBUaGUgc2l6ZSBvZiB0aGUgdGFibGUKKyAqLworcHVibGljIGludCBzaXplKCkgeworCXJldHVybiBlbGVtZW50U2l6ZTsKK30KKy8qKgorICogQ29udmVydHMgdG8gYSByYXRoZXIgbGVuZ3RoeSBTdHJpbmcuCisgKgorICogQHJldHVybiBTdHJpbmcgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWludCBtYXggPSBzaXplKCk7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGkgPCBtYXgpIHsKKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PYmplY3RDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdmZDhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBPYmplY3RDYWNoZSB7CisJcHVibGljIE9iamVjdCBrZXlUYWJsZVtdOworCXB1YmxpYyBpbnQgdmFsdWVUYWJsZVtdOworCWludCBlbGVtZW50U2l6ZTsKKwlpbnQgdGhyZXNob2xkOworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBoYXNodGFibGUuIEEgZGVmYXVsdCBjYXBhY2l0eSBpcyB1c2VkLgorICogTm90ZSB0aGF0IHRoZSBoYXNodGFibGUgd2lsbCBhdXRvbWF0aWNhbGx5IGdyb3cgd2hlbiBpdCBnZXRzIGZ1bGwuCisgKi8KK3B1YmxpYyBPYmplY3RDYWNoZSgpIHsKKwl0aGlzKDEzKTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsCisgKiBjYXBhY2l0eS4KKyAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgaW50CisgKiAgdGhlIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMKKyAqLworcHVibGljIE9iamVjdENhY2hlKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKwl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChpbml0aWFsQ2FwYWNpdHkgKiAwLjY2Zik7CisJdGhpcy5rZXlUYWJsZSA9IG5ldyBPYmplY3RbaW5pdGlhbENhcGFjaXR5XTsKKwl0aGlzLnZhbHVlVGFibGUgPSBuZXcgaW50W2luaXRpYWxDYXBhY2l0eV07Cit9CisvKioKKyAqIENsZWFycyB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IGl0IGhhcyBubyBtb3JlIGVsZW1lbnRzIGluIGl0LgorICovCitwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJa2V5VGFibGVbaV0gPSBudWxsOworCQl2YWx1ZVRhYmxlW2ldID0gMDsKKwl9CisJZWxlbWVudFNpemUgPSAwOworfQorLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhbiBlbGVtZW50IGZvciB0aGUga2V5LgorICoKKyAqIEBwYXJhbSBjaGFyW10ga2V5IHRoZSBrZXkgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IKKyAqIEByZXR1cm4gYm9vbGVhbgorICovCitwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisJaW50IGluZGV4ID0gaGFzaENvZGUoa2V5KTsKKwl3aGlsZSAoa2V5VGFibGVbaW5kZXhdICE9IG51bGwpIHsKKwkJaWYgKGtleVRhYmxlW2luZGV4XSA9PSBrZXkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqIEdldHMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlCisgKiBoYXNodGFibGUuCisgKiBAcGFyYW0ga2V5IDxDT0RFPmNoYXJbXTwvQ09ERT4gdGhlIHNwZWNpZmllZCBrZXkKKyAqIEByZXR1cm4gaW50IHRoZSBlbGVtZW50IGZvciB0aGUga2V5IG9yIC0xIGlmIHRoZSBrZXkgaXMgbm90CisgKiAgZGVmaW5lZCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqLworcHVibGljIGludCBnZXQoT2JqZWN0IGtleSkgeworCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSk7CisJd2hpbGUgKGtleVRhYmxlW2luZGV4XSAhPSBudWxsKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gLTE7Cit9CisvKioKKyAqIFJldHVybiB0aGUgaGFzaGNvZGUgZm9yIHRoZSBrZXkgcGFyYW1ldGVyCisgKgorICogQHBhcmFtIGtleSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gaW50CisgKi8KK3B1YmxpYyBpbnQgaGFzaENvZGUoT2JqZWN0IGtleSkgeworCXJldHVybiAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGtleVRhYmxlLmxlbmd0aDsKK30KKy8qKgorICogUHV0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgaGFzaHRhYmxlLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgKiBrZXkuICBUaGUgZWxlbWVudCBtYXkgYmUgcmV0cmlldmVkIGJ5IGRvaW5nIGEgZ2V0KCkgd2l0aCB0aGUgc2FtZSBrZXkuCisgKiBUaGUga2V5IGFuZCB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbnVsbC4gCisgKiAKKyAqIEBwYXJhbSBrZXkgPENPREU+T2JqZWN0PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgaGFzaHRhYmxlCisgKiBAcGFyYW0gdmFsdWUgPENPREU+aW50PC9DT0RFPiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAqIEByZXR1cm4gaW50IHRoZSBvbGQgdmFsdWUgb2YgdGhlIGtleSwgb3IgLTEgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KKyAqLworcHVibGljIGludCBwdXQoT2JqZWN0IGtleSwgaW50IHZhbHVlKSB7IAorCWludCBpbmRleCA9IGhhc2hDb2RlKGtleSk7CisJd2hpbGUgKGtleVRhYmxlW2luZGV4XSAhPSBudWxsKSB7CisJCWlmIChrZXlUYWJsZVtpbmRleF0gPT0ga2V5KQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCWtleVRhYmxlW2luZGV4XSA9IGtleTsKKwl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCisJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQorCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQorCQlyZWhhc2goKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisvKioKKyAqIFJlaGFzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB0YWJsZSBpbnRvIGEgYmlnZ2VyIHRhYmxlLgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaGFzaHRhYmxlJ3MKKyAqIHNpemUgZXhjZWVkcyB0aGUgdGhyZXNob2xkLgorICovCitwcml2YXRlIHZvaWQgcmVoYXNoKCkgeworCU9iamVjdENhY2hlIG5ld0hhc2h0YWJsZSA9IG5ldyBPYmplY3RDYWNoZShrZXlUYWJsZS5sZW5ndGggKiAyKTsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJbmV3SGFzaHRhYmxlLnB1dChrZXlUYWJsZVtpXSwgdmFsdWVUYWJsZVtpXSk7CisKKwl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOworCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgaGFzaHRhYmxlLgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPiBUaGUgc2l6ZSBvZiB0aGUgdGFibGUKKyAqLworcHVibGljIGludCBzaXplKCkgeworCXJldHVybiBlbGVtZW50U2l6ZTsKK30KKy8qKgorICogQ29udmVydHMgdG8gYSByYXRoZXIgbGVuZ3RoeSBTdHJpbmcuCisgKgorICogQHJldHVybiBTdHJpbmcgdGhlIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWludCBtYXggPSBzaXplKCk7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWYuYXBwZW5kKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CisJCQlidWYuYXBwZW5kKGtleVRhYmxlW2ldKS5hcHBlbmQoIi0+IikuYXBwZW5kKHZhbHVlVGFibGVbaV0pOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGkgPCBtYXgpIHsKKwkJCWJ1Zi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlidWYuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PcGNvZGVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PcGNvZGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyYjU3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09wY29kZXMuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CisKK3B1YmxpYyBpbnRlcmZhY2UgT3Bjb2RlcyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX25vcCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hY29uc3RfbnVsbCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pY29uc3RfbTEgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzAgPSAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzEgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzIgPSA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzMgPSA2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzQgPSA3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWNvbnN0XzUgPSA4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbGNvbnN0XzAgPSA5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbGNvbnN0XzEgPSAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2Zjb25zdF8wID0gMTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mY29uc3RfMSA9IDEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmNvbnN0XzIgPSAxMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2Rjb25zdF8wID0gMTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kY29uc3RfMSA9IDE1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYmlwdXNoID0gMTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19zaXB1c2ggPSAxNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xkYyA9IDE4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbGRjX3cgPSAxOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xkYzJfdyA9IDIwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWxvYWQgPSAyMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xsb2FkID0gMjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbG9hZCA9IDIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZGxvYWQgPSAyNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2Fsb2FkID0gMjU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pbG9hZF8wID0gMjY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pbG9hZF8xID0gMjc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pbG9hZF8yID0gMjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pbG9hZF8zID0gMjk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sbG9hZF8wID0gMzA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sbG9hZF8xID0gMzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sbG9hZF8yID0gMzI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sbG9hZF8zID0gMzM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbG9hZF8wID0gMzQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbG9hZF8xID0gMzU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbG9hZF8yID0gMzY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbG9hZF8zID0gMzc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kbG9hZF8wID0gMzg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kbG9hZF8xID0gMzk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kbG9hZF8yID0gNDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kbG9hZF8zID0gNDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hbG9hZF8wID0gNDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hbG9hZF8xID0gNDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hbG9hZF8yID0gNDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hbG9hZF8zID0gNDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pYWxvYWQgPSA0NjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xhbG9hZCA9IDQ3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmFsb2FkID0gNDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kYWxvYWQgPSA0OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2FhbG9hZCA9IDUwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYmFsb2FkID0gNTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19jYWxvYWQgPSA1MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX3NhbG9hZCA9IDUzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaXN0b3JlID0gNTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sc3RvcmUgPSA1NTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ZzdG9yZSA9IDU2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZHN0b3JlID0gNTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hc3RvcmUgPSA1ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lzdG9yZV8wID0gNTk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pc3RvcmVfMSA9IDYwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaXN0b3JlXzIgPSA2MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lzdG9yZV8zID0gNjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sc3RvcmVfMCA9IDYzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbHN0b3JlXzEgPSA2NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xzdG9yZV8yID0gNjU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sc3RvcmVfMyA9IDY2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZnN0b3JlXzAgPSA2NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ZzdG9yZV8xID0gNjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mc3RvcmVfMiA9IDY5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZnN0b3JlXzMgPSA3MDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2RzdG9yZV8wID0gNzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kc3RvcmVfMSA9IDcyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZHN0b3JlXzIgPSA3MzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2RzdG9yZV8zID0gNzQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hc3RvcmVfMCA9IDc1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYXN0b3JlXzEgPSA3NjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2FzdG9yZV8yID0gNzc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19hc3RvcmVfMyA9IDc4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWFzdG9yZSA9IDc5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbGFzdG9yZSA9IDgwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmFzdG9yZSA9IDgxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZGFzdG9yZSA9IDgyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYWFzdG9yZSA9IDgzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYmFzdG9yZSA9IDg0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfY2FzdG9yZSA9IDg1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfc2FzdG9yZSA9IDg2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfcG9wID0gODc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19wb3AyID0gODg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kdXAgPSA4OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2R1cF94MSA9IDkwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZHVwX3gyID0gOTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kdXAyID0gOTI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kdXAyX3gxID0gOTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kdXAyX3gyID0gOTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19zd2FwID0gOTU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pYWRkID0gOTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sYWRkID0gOTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mYWRkID0gOTg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kYWRkID0gOTk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pc3ViID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbHN1YiA9IDEwMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ZzdWIgPSAxMDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kc3ViID0gMTAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaW11bCA9IDEwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xtdWwgPSAxMDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbXVsID0gMTA2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZG11bCA9IDEwNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lkaXYgPSAxMDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sZGl2ID0gMTA5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmRpdiA9IDExMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2RkaXYgPSAxMTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pcmVtID0gMTEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbHJlbSA9IDExMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ZyZW0gPSAxMTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kcmVtID0gMTE1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaW5lZyA9IDExNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xuZWcgPSAxMTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mbmVnID0gMTE4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZG5lZyA9IDExOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lzaGwgPSAxMjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sc2hsID0gMTIxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaXNociA9IDEyMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xzaHIgPSAxMjM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pdXNociA9IDEyNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2x1c2hyID0gMTI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWFuZCA9IDEyNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xhbmQgPSAxMjc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pb3IgPSAoYnl0ZSkgMTI4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbG9yID0gKGJ5dGUpIDEyOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2l4b3IgPSAoYnl0ZSkgMTMwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbHhvciA9IChieXRlKSAxMzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19paW5jID0gKGJ5dGUpIDEzMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2kybCA9IChieXRlKSAxMzM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pMmYgPSAoYnl0ZSkgMTM0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaTJkID0gKGJ5dGUpIDEzNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2wyaSA9IChieXRlKSAxMzY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19sMmYgPSAoYnl0ZSkgMTM3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbDJkID0gKGJ5dGUpIDEzODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2YyaSA9IChieXRlKSAxMzk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mMmwgPSAoYnl0ZSkgMTQwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZjJkID0gKGJ5dGUpIDE0MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2QyaSA9IChieXRlKSAxNDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19kMmwgPSAoYnl0ZSkgMTQzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZDJmID0gKGJ5dGUpIDE0NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2kyYiA9IChieXRlKSAxNDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pMmMgPSAoYnl0ZSkgMTQ2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaTJzID0gKGJ5dGUpIDE0NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2xjbXAgPSAoYnl0ZSkgMTQ4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmNtcGwgPSAoYnl0ZSkgMTQ5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZmNtcGcgPSAoYnl0ZSkgMTUwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZGNtcGwgPSAoYnl0ZSkgMTUxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZGNtcGcgPSAoYnl0ZSkgMTUyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZlcSA9IChieXRlKSAxNTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pZm5lID0gKGJ5dGUpIDE1NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lmbHQgPSAoYnl0ZSkgMTU1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZnZSA9IChieXRlKSAxNTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pZmd0ID0gKGJ5dGUpIDE1NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lmbGUgPSAoYnl0ZSkgMTU4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZfaWNtcGVxID0gKGJ5dGUpIDE1OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lmX2ljbXBuZSA9IChieXRlKSAxNjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pZl9pY21wbHQgPSAoYnl0ZSkgMTYxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZfaWNtcGdlID0gKGJ5dGUpIDE2MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lmX2ljbXBndCA9IChieXRlKSAxNjM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pZl9pY21wbGUgPSAoYnl0ZSkgMTY0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZfYWNtcGVxID0gKGJ5dGUpIDE2NTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lmX2FjbXBuZSA9IChieXRlKSAxNjY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19nb3RvID0gKGJ5dGUpIDE2NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2pzciA9IChieXRlKSAxNjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19yZXQgPSAoYnl0ZSkgMTY5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfdGFibGVzd2l0Y2ggPSAoYnl0ZSkgMTcwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbG9va3Vwc3dpdGNoID0gKGJ5dGUpIDE3MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2lyZXR1cm4gPSAoYnl0ZSkgMTcyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbHJldHVybiA9IChieXRlKSAxNzM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19mcmV0dXJuID0gKGJ5dGUpIDE3NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2RyZXR1cm4gPSAoYnl0ZSkgMTc1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYXJldHVybiA9IChieXRlKSAxNzY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19yZXR1cm4gPSAoYnl0ZSkgMTc3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfZ2V0c3RhdGljID0gKGJ5dGUpIDE3ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX3B1dHN0YXRpYyA9IChieXRlKSAxNzk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19nZXRmaWVsZCA9IChieXRlKSAxODA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19wdXRmaWVsZCA9IChieXRlKSAxODE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pbnZva2V2aXJ0dWFsID0gKGJ5dGUpIDE4MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ludm9rZXNwZWNpYWwgPSAoYnl0ZSkgMTgzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaW52b2tlc3RhdGljID0gKGJ5dGUpIDE4NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2ludm9rZWludGVyZmFjZSA9IChieXRlKSAxODU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19uZXcgPSAoYnl0ZSkgMTg3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbmV3YXJyYXkgPSAoYnl0ZSkgMTg4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfYW5ld2FycmF5ID0gKGJ5dGUpIDE4OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2FycmF5bGVuZ3RoID0gKGJ5dGUpIDE5MDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2F0aHJvdyA9IChieXRlKSAxOTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19jaGVja2Nhc3QgPSAoYnl0ZSkgMTkyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaW5zdGFuY2VvZiA9IChieXRlKSAxOTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19tb25pdG9yZW50ZXIgPSAoYnl0ZSkgMTk0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfbW9uaXRvcmV4aXQgPSAoYnl0ZSkgMTk1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfd2lkZSA9IChieXRlKSAxOTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19tdWx0aWFuZXdhcnJheSA9IChieXRlKSAxOTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19pZm51bGwgPSAoYnl0ZSkgMTk4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUENfaWZub25udWxsID0gKGJ5dGUpIDE5OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BDX2dvdG9fdyA9IChieXRlKSAyMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE9QQ19qc3JfdyA9IChieXRlKSAyMDE7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9RdWFsaWZpZWROYW1lc0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEwYWJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKKworcHVibGljIGludGVyZmFjZSBRdWFsaWZpZWROYW1lc0NvbnN0YW50cyB7CisJY2hhcltdIEphdmFMYW5nT2JqZWN0Q29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvT2JqZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nU3RyaW5nQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nU3RyaW5nQnVmZmVyQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nQnVmZmVyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DbGFzcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ1Rocm93YWJsZUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1Rocm93YWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0NsYXNzTm90Rm91bmRFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nTm9DbGFzc0RlZkZvdW5kRXJyb3JDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0ludGVnZXJDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9JbnRlZ2VyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nRmxvYXRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9GbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0RvdWJsZUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL0RvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0xvbmdDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9Mb25nIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nU2hvcnRDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9TaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0J5dGVDb25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9CeXRlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nQ2hhcmFjdGVyQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQ2hhcmFjdGVyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFMYW5nVm9pZENvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1ZvaWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gSmF2YUxhbmdCb29sZWFuQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ1N5c3RlbUNvbnN0YW50UG9vbE5hbWUgPSAiamF2YS9sYW5nL1N5c3RlbSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0Vycm9yQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvRXJyb3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gSmF2YUxhbmdFeGNlcHRpb25Db25zdGFudFBvb2xOYW1lID0gImphdmEvbGFuZy9FeGNlcHRpb24iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IgPSAiamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IiLnRvQ2hhckFycmF5KCk7ICAgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBcHBlbmQgPSBuZXcgY2hhcltdIHsnYScsICdwJywgJ3AnLCAnZScsICduJywgJ2QnfTsKKwljaGFyW10gVG9TdHJpbmcgPSBuZXcgY2hhcltdIHsndCcsICdvJywgJ1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJ307CisJY2hhcltdIEluaXQgPSBuZXcgY2hhcltdIHsnPCcsICdpJywgJ24nLCAnaScsICd0JywgJz4nfTsKKwljaGFyW10gQ2xpbml0ID0gbmV3IGNoYXJbXSB7JzwnLCAnYycsICdsJywgJ2knLCAnbicsICdpJywgJ3QnLCAnPid9OworCWNoYXJbXSBWYWx1ZU9mID0gbmV3IGNoYXJbXSB7J3YnLCAnYScsICdsJywgJ3UnLCAnZScsICdPJywgJ2YnfTsKKwljaGFyW10gRm9yTmFtZSA9IG5ldyBjaGFyW10geydmJywgJ28nLCAncicsICdOJywgJ2EnLCAnbScsICdlJ307CisJY2hhcltdIEdldE1lc3NhZ2UgPSBuZXcgY2hhcltdIHsnZycsICdlJywgJ3QnLCAnTScsICdlJywgJ3MnLCAncycsICdhJywgJ2cnLCAnZSd9OworCWNoYXJbXSBOZXdJbnN0YW5jZSA9ICJuZXdJbnN0YW5jZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBHZXRDb25zdHJ1Y3RvciA9ICJnZXRDb25zdHJ1Y3RvciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFeGl0ID0gbmV3IGNoYXJbXSB7J2UnLCAneCcsICdpJywgJ3QnfTsKKwljaGFyW10gSW50ZXJuID0gImludGVybiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBPdXQgPSBuZXcgY2hhcltdIHsnbycsICd1JywgJ3QnfTsKKwljaGFyW10gVFlQRSA9IG5ldyBjaGFyW10geydUJywgJ1knLCAnUCcsICdFJ307CisJY2hhcltdIFRoaXMgPSBuZXcgY2hhcltdIHsndCcsICdoJywgJ2knLCAncyd9OworCWNoYXJbXSBKYXZhTGFuZ0NsYXNzU2lnbmF0dXJlID0gbmV3IGNoYXJbXSB7J0wnLCAnaicsICdhJywgJ3YnLCAnYScsICcvJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLycsICdDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnOyd9OworCWNoYXJbXSBGb3JOYW1lU2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gR2V0TWVzc2FnZVNpZ25hdHVyZSA9ICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBHZXRDb25zdHJ1Y3RvclNpZ25hdHVyZSA9ICIoW0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU3RyaW5nQ29uc3RydWN0b3JTaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIE5ld0luc3RhbmNlU2lnbmF0dXJlID0gIihbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBEZWZhdWx0Q29uc3RydWN0b3JTaWduYXR1cmUgPSB7JygnLCAnKScsICdWJ307CisJY2hhcltdIENsaW5pdFNpZ25hdHVyZSA9IERlZmF1bHRDb25zdHJ1Y3RvclNpZ25hdHVyZTsKKwljaGFyW10gVG9TdHJpbmdTaWduYXR1cmUgPSBHZXRNZXNzYWdlU2lnbmF0dXJlOworCWNoYXJbXSBJbnRlcm5TaWduYXR1cmUgPSBHZXRNZXNzYWdlU2lnbmF0dXJlOworCWNoYXJbXSBBcHBlbmRJbnRTaWduYXR1cmUgPSAiKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFwcGVuZExvbmdTaWduYXR1cmUgPSAiKEopTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFwcGVuZEZsb2F0U2lnbmF0dXJlID0gIihGKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBcHBlbmREb3VibGVTaWduYXR1cmUgPSAiKEQpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFwcGVuZENoYXJTaWduYXR1cmUgPSAiKEMpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFwcGVuZEJvb2xlYW5TaWduYXR1cmUgPSAiKFopTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFwcGVuZE9iamVjdFNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBcHBlbmRTdHJpbmdTaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gVmFsdWVPZk9iamVjdFNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBWYWx1ZU9mSW50U2lnbmF0dXJlID0gIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBWYWx1ZU9mTG9uZ1NpZ25hdHVyZSA9ICIoSilMamF2YS9sYW5nL1N0cmluZzsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gVmFsdWVPZkNoYXJTaWduYXR1cmUgPSAiKEMpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFZhbHVlT2ZCb29sZWFuU2lnbmF0dXJlID0gIihaKUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBWYWx1ZU9mRG91YmxlU2lnbmF0dXJlID0gIihEKUxqYXZhL2xhbmcvU3RyaW5nOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBWYWx1ZU9mRmxvYXRTaWduYXR1cmUgPSAiKEYpTGphdmEvbGFuZy9TdHJpbmc7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEphdmFJb1ByaW50U3RyZWFtU2lnbmF0dXJlID0gIkxqYXZhL2lvL1ByaW50U3RyZWFtOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFeGl0SW50U2lnbmF0dXJlID0gbmV3IGNoYXJbXSB7JygnLCAnSScsICcpJywgJ1YnfTsKKwljaGFyW10gQXJyYXlKYXZhTGFuZ09iamVjdENvbnN0YW50UG9vbE5hbWUgPSAiW0xqYXZhL2xhbmcvT2JqZWN0OyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBcnJheUphdmFMYW5nQ2xhc3NDb25zdGFudFBvb2xOYW1lID0gIltMamF2YS9sYW5nL0NsYXNzOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBKYXZhTGFuZ0Fzc2VydGlvbkVycm9yQ29uc3RhbnRQb29sTmFtZSA9ICJqYXZhL2xhbmcvQXNzZXJ0aW9uRXJyb3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQXNzZXJ0aW9uRXJyb3JJbnRDb25zdHJTaWduYXR1cmUgPSAiKEkpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBc3NlcnRpb25FcnJvckxvbmdDb25zdHJTaWduYXR1cmUgPSAiKEopViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBc3NlcnRpb25FcnJvckZsb2F0Q29uc3RyU2lnbmF0dXJlID0gIihGKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQXNzZXJ0aW9uRXJyb3JEb3VibGVDb25zdHJTaWduYXR1cmUgPSAiKEQpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBc3NlcnRpb25FcnJvckNoYXJDb25zdHJTaWduYXR1cmUgPSAiKEMpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBc3NlcnRpb25FcnJvckJvb2xlYW5Db25zdHJTaWduYXR1cmUgPSAiKFopViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBBc3NlcnRpb25FcnJvck9iamVjdENvbnN0clNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gRGVzaXJlZEFzc2VydGlvblN0YXR1cyA9ICJkZXNpcmVkQXNzZXJ0aW9uU3RhdHVzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIERlc2lyZWRBc3NlcnRpb25TdGF0dXNTaWduYXR1cmUgPSAiKClaIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFNob3J0Q29uc3RyU2lnbmF0dXJlID0gIihTKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQnl0ZUNvbnN0clNpZ25hdHVyZSA9ICIoQilWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEdldENsYXNzID0gImdldENsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEdldENsYXNzU2lnbmF0dXJlID0gIigpTGphdmEvbGFuZy9DbGFzczsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1Jlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvblZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1Jlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvblZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NlNGNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQnJhbmNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRG9TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Gb3JTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5MYWJlbGVkU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3dpdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuV2hpbGVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworCitwdWJsaWMgY2xhc3MgUmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvcgorCWV4dGVuZHMgQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIgeworCisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQlzdGF0ZW1lbnQucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWZvclN0YXRlbWVudC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFdoaWxlU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXdoaWxlU3RhdGVtZW50LnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJbGFiZWxlZFN0YXRlbWVudC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gdmlzaXQoRG9TdGF0ZW1lbnQgZG9TdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZG9TdGF0ZW1lbnQucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIHZpc2l0KEJyYW5jaFN0YXRlbWVudCBicmFuY2hTdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJYnJhbmNoU3RhdGVtZW50LnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzE3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlGaWVsZC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKKworcHVibGljIGludGVyZmFjZSBJQmluYXJ5RmllbGQgZXh0ZW5kcyBJR2VuZXJpY0ZpZWxkIHsKKy8qKgorICogCisgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25zdGFudAorICovCitDb25zdGFudCBnZXRDb25zdGFudCgpOworLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3MgdHlwZSBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMy4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYy4KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqICAgLSBqYXZhLmxhbmcuU3RyaW5nIGlzIExqYXZhL2xhbmcvU3RyaW5nOworICogICAtIGFuIGludCBpcyBJCisgKiAgIC0gYSAyIGRpbWVuc2lvbmFsIGFycmF5IG9mIHN0cmluZ3MgaXMgW1tMamF2YS9sYW5nL1N0cmluZzsKKyAqICAgLSBhbiBhcnJheSBvZiBmbG9hdHMgaXMgW0YKKyAqLworCitjaGFyW10gZ2V0VHlwZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxODk1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CisKKy8vIGNsaW5pdCBtZXRob2RzIChzeW50aGV0aWNzIHRvbz8pIGNhbiBiZSByZXR1cm5lZCBmcm9tIElCaW5hcnlUeXBlPj5nZXRNZXRob2RzKCkKKy8vIEJVVCBkbyBub3QgaGF2ZSB0byBiZS4uLiB0aGUgY29tcGlsZXIgd2lsbCBpZ25vcmUgdGhlbSB3aGVuIGJ1aWxkaW5nIHRoZSBiaW5kaW5nLgorLy8gVGhlIHN5bnRoZXRpYyBhcmd1bWVudCBvZiBhIG1lbWJlciB0eXBlJ3MgY29uc3RydWN0b3IgKGllLiB0aGUgZmlyc3QgYXJnIG9mIGEgbm9uLXN0YXRpYworLy8gbWVtYmVyIHR5cGUpIGlzIGFsc28gaWdub3JlZCBieSB0aGUgY29tcGlsZXIsIEJVVCBpbiB0aGlzIGNhc2UgaXQgbXVzdCBiZSBpbmNsdWRlZAorLy8gaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgc2lnbmF0dXJlLgorCitwdWJsaWMgaW50ZXJmYWNlIElCaW5hcnlNZXRob2QgZXh0ZW5kcyBJR2VuZXJpY01ldGhvZCB7CisKKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lcyBvZiB0aGUgZXhjZXB0aW9uIHR5cGVzIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYworICogb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqLworY2hhcltdW10gZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCk7CisKKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG1ldGhvZCBkZXNjcmlwdG9yIHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVyICYKKyAqIHJldHVybiB0eXBlcyBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjMuMyBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGU6CisgKiAgIC0gaW50IGZvbyhTdHJpbmcpIGlzIChMamF2YS9sYW5nL1N0cmluZzspSQorICogICAtIE9iamVjdFtdIGZvbyhpbnQpIGlzIChJKVtMamF2YS9sYW5nL09iamVjdDsKKyAqLworY2hhcltdIGdldE1ldGhvZERlc2NyaXB0b3IoKTsKKworLyoqCisgKiBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIgcmVwcmVzZW50cyBhIGNsYXNzIGluaXRpYWxpemVyIG1ldGhvZC4KKyAqLworYm9vbGVhbiBpc0NsaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TmVzdGVkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TmVzdGVkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDA2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlOZXN0ZWRUeXBlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKKworcHVibGljIGludGVyZmFjZSBJQmluYXJ5TmVzdGVkVHlwZSB7CisvKioKKyAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHR5cGUgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjLgorICoKKyAqIEZvciBleGFtcGxlLCBqYXZhLmxhbmcuU3RyaW5nIGlzIGphdmEvbGFuZy9TdHJpbmcuCisgKi8KKworY2hhcltdIGdldEVuY2xvc2luZ1R5cGVOYW1lKCk7CisvKioKKyAqIEFuc3dlciBhbiBpbnQgd2hvc2UgYml0cyBhcmUgc2V0IGFjY29yZGluZyB0aGUgYWNjZXNzIGNvbnN0YW50cworICogZGVmaW5lZCBieSB0aGUgVk0gc3BlYy4KKyAqLworCisvLyBXZSBoYXZlIGFkZGVkIEFjY0RlcHJlY2F0ZWQgJiBBY2NTeW50aGV0aWMuCisKK2ludCBnZXRNb2RpZmllcnMoKTsKKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSBtZW1iZXIgdHlwZSBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGUsIHAxLnAyLkEuTSBpcyBwMS9wMi9BJE0uCisgKi8KKworY2hhcltdIGdldE5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFiZGFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCitwdWJsaWMgaW50ZXJmYWNlIElCaW5hcnlUeXBlIGV4dGVuZHMgSUdlbmVyaWNUeXBlIHsKKworCWNoYXJbXVtdIE5vSW50ZXJmYWNlID0gbmV3IGNoYXJbMF1bXTsKKwlJQmluYXJ5TmVzdGVkVHlwZVtdIE5vTmVzdGVkVHlwZSA9IG5ldyBJQmluYXJ5TmVzdGVkVHlwZVswXTsKKwlJQmluYXJ5RmllbGRbXSBOb0ZpZWxkID0gbmV3IElCaW5hcnlGaWVsZFswXTsKKwlJQmluYXJ5TWV0aG9kW10gTm9NZXRob2QgPSBuZXcgSUJpbmFyeU1ldGhvZFswXTsKKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgdHlwZSBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMKKyAqIG9yIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdG9wIGxldmVsIHR5cGUuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqLworCitjaGFyW10gZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKTsKKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIGZpZWxkcyBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqLworCitJQmluYXJ5RmllbGRbXSBnZXRGaWVsZHMoKTsKKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lcyBvZiB0aGUgcmVjZWl2ZXIncyBpbnRlcmZhY2VzIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYworICogb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqLworCitjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgbmVzdGVkIHR5cGVzIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICoKKyAqIFRoaXMgbmVzdGVkIHR5cGUgaW5mbyBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5uZXIgY2xhc3MgYXR0cmlidXRlcy4KKyAqIEFzayB0aGUgbmFtZSBlbnZpcm9ubWVudCB0byBmaW5kIGEgbWVtYmVyIHR5cGUgdXNpbmcgaXRzIGNvbXBvdW5kIG5hbWUuCisgKi8KKworLy8gTk9URTogVGhlIGNvbXBpbGVyIGV4YW1pbmVzIHRoZSBuZXN0ZWQgdHlwZSBpbmZvICYgaWdub3JlcyB0aGUgbG9jYWwgdHlwZXMKKy8vIHNvIHRoZSBsb2NhbCB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpbmNsdWRlZC4KKworSUJpbmFyeU5lc3RlZFR5cGVbXSBnZXRNZW1iZXJUeXBlcygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgbWV0aG9kcyBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqLworCitJQmluYXJ5TWV0aG9kW10gZ2V0TWV0aG9kcygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIHR5cGUgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjLgorICoKKyAqIEZvciBleGFtcGxlLCBqYXZhLmxhbmcuU3RyaW5nIGlzIGphdmEvbGFuZy9TdHJpbmcuCisgKi8KKworY2hhcltdIGdldE5hbWUoKTsKKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lIG9mIHRoZSByZWNlaXZlcidzIHN1cGVyY2xhc3MgaW4gdGhlCisgKiBjbGFzcyBmaWxlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gc2VjdGlvbiA0LjIgb2YgdGhlIEphdmEgMiBWTSBzcGVjCisgKiBvciBudWxsIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgorICoKKyAqIEZvciBleGFtcGxlLCBqYXZhLmxhbmcuU3RyaW5nIGlzIGphdmEvbGFuZy9TdHJpbmcuCisgKi8KKworY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCk7CisKKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGFuIGFub255bW91cyBjbGFzcy4KKyAqIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGlzQW5vbnltb3VzKCk7CisKKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbG9jYWwgY2xhc3MuCisgKiBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbGVhbiBpc0xvY2FsKCk7CisKKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgbWVtYmVyIGNsYXNzLgorICogZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2xlYW4gaXNNZW1iZXIoKTsgCisKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgbm9uZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgIlN0cmluZy5qYXZhIgorICovCisKK2NoYXJbXSBzb3VyY2VGaWxlTmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTNiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGRlbm90ZXMgYSBjb21waWxhdGlvbiB1bml0LCBwcm92aWRpbmcgaXRzIG5hbWUgYW5kIGNvbnRlbnQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdCBleHRlbmRzIElEZXBlbmRlbnQgeworLyoqCisgKiBBbnN3ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorICoKKyAqIEluIG5vcm1hbCB1c2UsIHRoZSBjb250ZW50cyBhcmUgcmVxdWVzdGVkIHR3aWNlLgorICogT25jZSBkdXJpbmcgdGhlIGluaXRpYWwgbGl0ZSBwYXJzaW5nIHN0ZXAsIHRoZW4gYWdhaW4gZm9yIHRoZQorICogbW9yZSBkZXRhaWxlZCBwYXJzaW5nIHN0ZXAuCisgKi8KK2NoYXJbXSBnZXRDb250ZW50cygpOworLyoqCisgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHRvcCBsZXZlbCBwdWJsaWMgdHlwZS4KKyAqIEZvciBleGFtcGxlLCB7SGFzaHRhYmxlfS4KKyAqLworY2hhcltdIGdldE1haW5UeXBlTmFtZSgpOworLyoqCisgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCisgKiBvciBudWxsIGlmIHBhY2thZ2UgY29uc2lzdGVuY3kgY2hlY2tzIHNob3VsZCBiZSBpZ25vcmVkLgorICogRm9yIGV4YW1wbGUsIHtqYXZhLCBsYW5nfS4KKyAqLworY2hhcltdW10gZ2V0UGFja2FnZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxYzRkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBjb25zdGFudHMgZm9yIHVzZSBieSB0aGUgYnVpbGRlciAvIGNvbXBpbGVyIGludGVyZmFjZS4KKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uc3RhbnRzIHsKKworCS8qCisJICogTW9kaWZpZXJzCisJICovCisJaW50IEFjY1B1YmxpYyA9IDB4MDAwMTsKKwlpbnQgQWNjUHJpdmF0ZSA9IDB4MDAwMjsKKwlpbnQgQWNjUHJvdGVjdGVkID0gMHgwMDA0OworCWludCBBY2NTdGF0aWMgPSAweDAwMDg7CisJaW50IEFjY0ZpbmFsID0gMHgwMDEwOworCWludCBBY2NTeW5jaHJvbml6ZWQgPSAweDAwMjA7CisJaW50IEFjY1ZvbGF0aWxlID0gMHgwMDQwOworCWludCBBY2NUcmFuc2llbnQgPSAweDAwODA7CisJaW50IEFjY05hdGl2ZSA9IDB4MDEwMDsKKwlpbnQgQWNjSW50ZXJmYWNlID0gMHgwMjAwOworCWludCBBY2NBYnN0cmFjdCA9IDB4MDQwMDsKKwlpbnQgQWNjU3RyaWN0ZnAgPSAweDA4MDA7CisKKwkvKgorCSAqIE90aGVyIFZNIGZsYWdzLgorCSAqLworCWludCBBY2NTdXBlciA9IDB4MDAyMDsKKworCS8qKgorCSAqIEV4dHJhIGZsYWdzIGZvciB0eXBlcyBhbmQgbWVtYmVycy4KKwkgKi8KKwlpbnQgQWNjU3ludGhldGljID0gMHgyMDAwMDsKKwlpbnQgQWNjRGVwcmVjYXRlZCA9IDB4MTAwMDAwOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lEZXBlbmRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc3MWIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHRhcmdldCAoaS5lLiZuYnNwO3RoZSBmaWxlKSBvZiBhIHR5cGUgZGVwZW5kZW5jeS4KKyAqCisgKiBBbGwgaW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBjb250YWluZXJzIGZvciB0eXBlcyBvciB0eXBlcworICogdGhlbXNlbHZlcyB3aGljaCBtdXN0IGJlIGFibGUgdG8gaWRlbnRpZnkgdGhlaXIgc291cmNlIGZpbGUgbmFtZQorICogd2hlbiBmaWxlIGRlcGVuZGVuY2llcyBhcmUgY29sbGVjdGVkLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbnQgeworLyoqCisgKiBBbnN3ZXIgdGhlIGZpbGUgbmFtZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlLgorICoKKyAqIFRoZSBwYXRoIHBhcnQgKG9wdGlvbmFsKSBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBhY3R1YWwKKyAqIGZpbGUgcHJvcGVyIG5hbWUgYnkgYSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yLgorICoKKyAqIFRoZSBwcm9wZXIgZmlsZSBuYW1lIGluY2x1ZGVzIHRoZSBzdWZmaXggZXh0ZW5zaW9uIChlLmcuJm5ic3A7Ii5qYXZhIikKKyAqCisgKiBlLmcuJm5ic3A7ImM6L2NvbS9pYm0vY29tcGlsZXIvamF2YS9hcGkvQ29tcGlsZXIuamF2YSIgCisgKi8KKworY2hhcltdIGdldEZpbGVOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lHZW5lcmljRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWM5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lHZW5lcmljRmllbGQuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCitwdWJsaWMgaW50ZXJmYWNlIElHZW5lcmljRmllbGQgeworLyoqCisgKiBBbnN3ZXIgYW4gaW50IHdob3NlIGJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdGhlIGFjY2VzcyBjb25zdGFudHMKKyAqIGRlZmluZWQgYnkgdGhlIFZNIHNwZWMuCisgKi8KKworLy8gV2UgaGF2ZSBhZGRlZCBBY2NEZXByZWNhdGVkICYgQWNjU3ludGhldGljLgorCitpbnQgZ2V0TW9kaWZpZXJzKCk7CisvKioKKyAqIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCisgKi8KKworY2hhcltdIGdldE5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI3N2E3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY01ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNNZXRob2QgeworLyoqCisgKiBBbnN3ZXIgYW4gaW50IHdob3NlIGJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdGhlIGFjY2VzcyBjb25zdGFudHMKKyAqIGRlZmluZWQgYnkgdGhlIFZNIHNwZWMuCisgKi8KKy8vIFdlIGhhdmUgYWRkZWQgQWNjRGVwcmVjYXRlZCAmIEFjY1N5bnRoZXRpYy4KK2ludCBnZXRNb2RpZmllcnMoKTsKKworLyoqCisgKiBBbnN3ZXIgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAqCisgKiBGb3IgYSBjb25zdHJ1Y3RvciwgYW5zd2VyIDxpbml0PiAmIDxjbGluaXQ+IGZvciBhIGNsaW5pdCBtZXRob2QuCisgKi8KK2NoYXJbXSBnZXRTZWxlY3RvcigpOworCitib29sZWFuIGlzQ29uc3RydWN0b3IoKTsKKworLyoqCisgKiBBbnN3ZXIgdGhlIG5hbWVzIG9mIHRoZSBhcmd1bWVudAorICogb3IgbnVsbCBpZiB0aGUgYXJndW1lbnQgbmFtZXMgYXJlIG5vdCBhdmFpbGFibGUuCisgKi8KKworY2hhcltdW10gZ2V0QXJndW1lbnROYW1lcygpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY1R5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwM2EzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNUeXBlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKKworcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1R5cGUgZXh0ZW5kcyBJRGVwZW5kZW50IHsKKy8qKgorICogQW5zd2VyIGFuIGludCB3aG9zZSBiaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRoZSBhY2Nlc3MgY29uc3RhbnRzCisgKiBkZWZpbmVkIGJ5IHRoZSBWTSBzcGVjLgorICovCisKKy8vIFdlIGhhdmUgYWRkZWQgQWNjRGVwcmVjYXRlZCAmIEFjY1N5bnRoZXRpYy4KKworLy8gTk9URTogSWYgdGhlIHJlY2VpdmVyIHJlcHJlc2VudHMgYSBtZW1iZXIgdHlwZSwgdGhlIG1vZGlmaWVycyBhcmUgZXh0cmFjdGVkIGZyb20gaXRzIGlubmVyIGNsYXNzIGF0dHJpYnV0ZXMuCisKK2ludCBnZXRNb2RpZmllcnMoKTsKKy8qKgorICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybQorICogb3IgdGhlIHVucmVzb2x2ZWQgc291cmNlIGZvcm0gb2YgdGhlIHR5cGUuCisgKi8KKworYm9vbGVhbiBpc0JpbmFyeVR5cGUoKTsKK2Jvb2xlYW4gaXNDbGFzcygpOworYm9vbGVhbiBpc0ludGVyZmFjZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JTmFtZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lOYW1lRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2MxY2RlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JTmFtZUVudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKKworLyoqCisgKiBUaGUgbmFtZSBlbnZpcm9ubWVudCBwcm92aWRlcyBhIGNhbGxiYWNrIEFQSSB0aGF0IHRoZSBjb21waWxlcgorICogY2FuIHVzZSB0byBsb29rIHVwIHR5cGVzLCBjb21waWxhdGlvbiB1bml0cywgYW5kIHBhY2thZ2VzIGluIHRoZQorICogY3VycmVudCBlbnZpcm9ubWVudC4gIFRoZSBuYW1lIGVudmlyb25tZW50IGlzIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyAqIG9uIGNyZWF0aW9uLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElOYW1lRW52aXJvbm1lbnQgeworLyoqCisgKiBGaW5kIGEgdHlwZSB3aXRoIHRoZSBnaXZlbiBjb21wb3VuZCBuYW1lLgorICogQW5zd2VyIHRoZSBiaW5hcnkgZm9ybSBvZiB0aGUgdHlwZSBpZiBpdCBpcyBrbm93biB0byBiZSBjb25zaXN0ZW50LgorICogT3RoZXJ3aXNlLCBhbnN3ZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2hpY2ggZGVmaW5lcyB0aGUgdHlwZQorICogb3IgbnVsbCBpZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdC4KKyAqIFR5cGVzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UgYXJlIHNwZWNpZmllZCBhcyB7e3R5cGVOYW1lfX0uCisgKgorICogSXQgaXMgdW5rbm93biB3aGV0aGVyIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIHR5cGUgYWN0dWFsbHkgZXhpc3RzLgorICoKKyAqIE5PVEU6IFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSBtZW1iZXIgdHlwZSB1c2luZyBpdHMKKyAqIGludGVybmFsIG5hbWUgQSRCLCBidXQgdGhlIHNvdXJjZSBmaWxlIGZvciBBIGlzIGFuc3dlcmVkIGlmIHRoZSBiaW5hcnkKKyAqIGZpbGUgaXMgaW5jb25zaXN0ZW50LgorICovCisKK05hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW11bXSBjb21wb3VuZFR5cGVOYW1lKTsKKy8qKgorICogRmluZCBhIHR5cGUgbmFtZWQgPHR5cGVOYW1lPiBpbiB0aGUgcGFja2FnZSA8cGFja2FnZU5hbWU+LgorICogQW5zd2VyIHRoZSBiaW5hcnkgZm9ybSBvZiB0aGUgdHlwZSBpZiBpdCBpcyBrbm93biB0byBiZSBjb25zaXN0ZW50LgorICogT3RoZXJ3aXNlLCBhbnN3ZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2hpY2ggZGVmaW5lcyB0aGUgdHlwZQorICogb3IgbnVsbCBpZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdC4KKyAqIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgaW5kaWNhdGVkIGJ5IGNoYXJbMF1bXS4KKyAqCisgKiBJdCBpcyBrbm93biB0aGF0IHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIHR5cGUgZXhpc3RzLgorICoKKyAqIE5PVEU6IFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSBtZW1iZXIgdHlwZSB1c2luZyBpdHMKKyAqIGludGVybmFsIG5hbWUgQSRCLCBidXQgdGhlIHNvdXJjZSBmaWxlIGZvciBBIGlzIGFuc3dlcmVkIGlmIHRoZSBiaW5hcnkKKyAqIGZpbGUgaXMgaW5jb25zaXN0ZW50LgorICovCisKK05hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW10gdHlwZU5hbWUsIGNoYXJbXVtdIHBhY2thZ2VOYW1lKTsKKy8qKgorICogQW5zd2VyIHdoZXRoZXIgcGFja2FnZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSBrbm93biBzdWJwYWNrYWdlIGluc2lkZQorICogdGhlIHBhY2thZ2UgcGFyZW50UGFja2FnZU5hbWUuIEEgdG9wIGxldmVsIHBhY2thZ2UgaXMgZm91bmQgcmVsYXRpdmUgdG8gbnVsbC4KKyAqIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgYWx3YXlzIGFzc3VtZWQgdG8gZXhpc3QuCisgKgorICogRm9yIGV4YW1wbGU6CisgKiAgICAgIGlzUGFja2FnZSh7e2phdmF9LCB7YXd0fX0sIHtldmVudH0pOworICogICAgICBpc1BhY2thZ2UobnVsbCwge2phdmF9KTsKKyAqLworCitib29sZWFuIGlzUGFja2FnZShjaGFyW11bXSBwYXJlbnRQYWNrYWdlTmFtZSwgY2hhcltdIHBhY2thZ2VOYW1lKTsKKworLyoqCisgKiBUaGlzIG1ldGhvZCBjbGVhbnMgdGhlIGVudmlyb25tZW50IHVvLiBJdCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBtZW1vcnkKKyAqIGFuZCBmcmVlaW5nIHJlc291cmNlcy4gUGFzc2VkIHRoYXQgcG9pbnQsIHRoZSBuYW1lIGVudmlyb25tZW50IGlzIG5vIGxvbmdlciB1c2FibGUuCisgKiAKKyAqIEEgbmFtZSBlbnZpcm9ubWVudCBjYW4gaGF2ZSBhIGxvbmcgbGlmZSBjeWNsZSwgdGhlcmVmb3JlIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICogdGhlIGNvZGUgd2hpY2ggY3JlYXRlZCBpdCB0byBkZWNpZGUgd2hlbiBpdCBpcyBhIGdvb2QgdGltZSB0byBjbGVhbiBpdCB1cC4KKyAqLwordm9pZCBjbGVhbnVwKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDg0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VGaWVsZC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUZpZWxkIGV4dGVuZHMgSUdlbmVyaWNGaWVsZCB7CisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIGVuZCBwb3NpdGlvbiBvZiB0aGUgZmllbGQncyBkZWNsYXJhdGlvbi4KKyAqLworCitpbnQgZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKTsKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2Ugc3RhcnQgcG9zaXRpb24gb2YgdGhlIGZpZWxkJ3MgZGVjbGFyYXRpb24uCisgKi8KKworaW50IGdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2UgZW5kIHBvc2l0aW9uIG9mIHRoZSBmaWVsZCdzIG5hbWUuCisgKi8KKworaW50IGdldE5hbWVTb3VyY2VFbmQoKTsKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2Ugc3RhcnQgcG9zaXRpb24gb2YgdGhlIGZpZWxkJ3MgbmFtZS4KKyAqLworCitpbnQgZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7CisvKioKKyAqIEFuc3dlciB0aGUgdHlwZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAqCisgKiBUaGUgbmFtZSBpcyBhIHNpbXBsZSBuYW1lIG9yIGEgcXVhbGlmaWVkLCBkb3Qgc2VwYXJhdGVkIG5hbWUuCisgKiBGb3IgZXhhbXBsZSwgSGFzaHRhYmxlIG9yIGphdmEudXRpbC5IYXNodGFibGUuCisgKi8KKworY2hhcltdIGdldFR5cGVOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODQxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VNZXRob2QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCitwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VNZXRob2QgZXh0ZW5kcyBJR2VuZXJpY01ldGhvZCB7CisKKy8qKgorICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIG5hbWVzIG9mIHRoZSBhcmd1bWVudCB0eXBlcworICogb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogQSBuYW1lIGlzIGEgc2ltcGxlIG5hbWUgb3IgYSBxdWFsaWZpZWQsIGRvdCBzZXBhcmF0ZWQgbmFtZS4KKyAqIEZvciBleGFtcGxlLCBIYXNodGFibGUgb3IgamF2YS51dGlsLkhhc2h0YWJsZS4KKyAqLworCitjaGFyW11bXSBnZXRBcmd1bWVudFR5cGVOYW1lcygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIG1ldGhvZCdzIGRlY2xhcmF0aW9uLgorICovCisKK2ludCBnZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpOworLyoqCisgKiBBbnN3ZXIgdGhlIHNvdXJjZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbWV0aG9kJ3MgZGVjbGFyYXRpb24uCisgKi8KKworaW50IGdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKKy8qKgorICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIG5hbWVzIG9mIHRoZSBleGNlcHRpb24gdHlwZXMKKyAqIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICoKKyAqIEEgbmFtZSBpcyBhIHNpbXBsZSBuYW1lIG9yIGEgcXVhbGlmaWVkLCBkb3Qgc2VwYXJhdGVkIG5hbWUuCisgKiBGb3IgZXhhbXBsZSwgSGFzaHRhYmxlIG9yIGphdmEudXRpbC5IYXNodGFibGUuCisgKi8KKworY2hhcltdW10gZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCk7CisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2VsZWN0b3IuCisgKi8KKworaW50IGdldE5hbWVTb3VyY2VFbmQoKTsKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2Ugc3RhcnQgcG9zaXRpb24gb2YgdGhlIG1ldGhvZCdzIHNlbGVjdG9yLgorICovCisKK2ludCBnZXROYW1lU291cmNlU3RhcnQoKTsKKy8qKgorICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIG5hbWUgb2YgdGhlIHJldHVybiB0eXBlCisgKiBvciBudWxsIGlmIHJlY2VpdmVyIGlzIGEgY29uc3RydWN0b3Igb3IgY2xpbml0LgorICoKKyAqIFRoZSBuYW1lIGlzIGEgc2ltcGxlIG5hbWUgb3IgYSBxdWFsaWZpZWQsIGRvdCBzZXBhcmF0ZWQgbmFtZS4KKyAqIEZvciBleGFtcGxlLCBIYXNodGFibGUgb3IgamF2YS51dGlsLkhhc2h0YWJsZS4KKyAqLworCitjaGFyW10gZ2V0UmV0dXJuVHlwZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzkwMjllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCitwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VUeXBlIGV4dGVuZHMgSUdlbmVyaWNUeXBlIHsKKy8qKgorICogQW5zd2VyIHRoZSBzb3VyY2UgZW5kIHBvc2l0aW9uIG9mIHRoZSB0eXBlJ3MgZGVjbGFyYXRpb24uCisgKi8KKworaW50IGdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7CisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSB0eXBlJ3MgZGVjbGFyYXRpb24uCisgKi8KKworaW50IGdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKKy8qKgorICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgdHlwZQorICogb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KKyAqLworCitJU291cmNlVHlwZSBnZXRFbmNsb3NpbmdUeXBlKCk7CisvKioKKyAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBmaWVsZHMgb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogTk9URTogTXVsdGlwbGUgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gZXhpc3QgaW4gdGhlIHJlc3VsdC4KKyAqLworCitJU291cmNlRmllbGRbXSBnZXRGaWVsZHMoKTsKKy8qKgorICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIG5hbWVzIG9mIHRoZSByZWNlaXZlcidzIGltcG9ydHMKKyAqIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICoKKyAqIEFuIGltcG9ydCBpcyBhIHF1YWxpZmllZCwgZG90IHNlcGFyYXRlZCBuYW1lLgorICogRm9yIGV4YW1wbGUsIGphdmEudXRpbC5IYXNodGFibGUgb3IgamF2YS5sYW5nLiouCisgKi8KKworY2hhcltdW10gZ2V0SW1wb3J0cygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHVucmVzb2x2ZWQgbmFtZXMgb2YgdGhlIHJlY2VpdmVyJ3MgaW50ZXJmYWNlcworICogb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogQSBuYW1lIGlzIGEgc2ltcGxlIG5hbWUgb3IgYSBxdWFsaWZpZWQsIGRvdCBzZXBhcmF0ZWQgbmFtZS4KKyAqIEZvciBleGFtcGxlLCBIYXNodGFibGUgb3IgamF2YS51dGlsLkhhc2h0YWJsZS4KKyAqLworCitjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpOworLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgbWVtYmVyIHR5cGVzCisgKiBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqLworCitJU291cmNlVHlwZVtdIGdldE1lbWJlclR5cGVzKCk7CisvKioKKyAqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBtZXRob2RzIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICoKKyAqIE5PVEU6IE11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lICYgcGFyYW1ldGVyIHR5cGVzIGNhbiBleGlzdCBpbiB0aGUgcmVzdWx0LgorICovCisKK0lTb3VyY2VNZXRob2RbXSBnZXRNZXRob2RzKCk7CisvKioKKyAqIEFuc3dlciB0aGUgc2ltcGxlIHNvdXJjZSBuYW1lIG9mIHRoZSByZWNlaXZlci4KKyAqLworCitjaGFyW10gZ2V0TmFtZSgpOworLyoqCisgKiBBbnN3ZXIgdGhlIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIHR5cGUncyBuYW1lLgorICovCisKK2ludCBnZXROYW1lU291cmNlRW5kKCk7CisvKioKKyAqIEFuc3dlciB0aGUgc291cmNlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSB0eXBlJ3MgbmFtZS4KKyAqLworCitpbnQgZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7CisvKioKKyAqIEFuc3dlciB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3MgcGFja2FnZSBzZXBhcmF0ZWQgYnkgcGVyaW9kcworICogb3IgbnVsbCBpZiBpdHMgdGhlIGRlZmF1bHQgcGFja2FnZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwge2phdmEudXRpbC5IYXNodGFibGV9LgorICovCisKK2NoYXJbXSBnZXRQYWNrYWdlTmFtZSgpOworLyoqCisgKiBBbnN3ZXIgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSByZWNlaXZlci4KKyAqCisgKiBUaGUgbmFtZSBpcyBhIHF1YWxpZmllZCwgZG90IHNlcGFyYXRlZCBuYW1lLgorICogRm9yIGV4YW1wbGUsIGphdmEudXRpbC5IYXNodGFibGUuCisgKi8KKworY2hhcltdIGdldFF1YWxpZmllZE5hbWUoKTsKKy8qKgorICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3Mgc3VwZXJjbGFzcworICogb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KKyAqCisgKiBUaGUgbmFtZSBpcyBhIHNpbXBsZSBuYW1lIG9yIGEgcXVhbGlmaWVkLCBkb3Qgc2VwYXJhdGVkIG5hbWUuCisgKiBGb3IgZXhhbXBsZSwgSGFzaHRhYmxlIG9yIGphdmEudXRpbC5IYXNodGFibGUuCisgKi8KKworY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L05hbWVFbnZpcm9ubWVudEFuc3dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRiMTJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OworCitwdWJsaWMgY2xhc3MgTmFtZUVudmlyb25tZW50QW5zd2VyIHsKKwkKKwkvLyBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgY2FuIGJlIHNldAorCUlCaW5hcnlUeXBlIGJpbmFyeVR5cGU7CisJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7CisJSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlczsKKwkKKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyKElCaW5hcnlUeXBlIGJpbmFyeVR5cGUpIHsKKwkJdGhpcy5iaW5hcnlUeXBlID0gYmluYXJ5VHlwZTsKKwl9CisKKwlwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisJCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OworCX0KKworCXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcykgeworCQl0aGlzLnNvdXJjZVR5cGVzID0gc291cmNlVHlwZXM7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybSBmb3IgdGhlIHR5cGUgb3IgbnVsbCBpZiB0aGUKKwkgKiByZWNlaXZlciByZXByZXNlbnRzIGEgY29tcGlsYXRpb24gdW5pdCBvciBzb3VyY2UgdHlwZS4KKwkgKi8KKwlwdWJsaWMgSUJpbmFyeVR5cGUgZ2V0QmluYXJ5VHlwZSgpIHsKKwkJcmV0dXJuIGJpbmFyeVR5cGU7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSBjb21waWxhdGlvbiB1bml0IG9yIG51bGwgaWYgdGhlCisJICogcmVjZWl2ZXIgcmVwcmVzZW50cyBhIGJpbmFyeSBvciBzb3VyY2UgdHlwZS4KKwkgKi8KKwlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJCXJldHVybiBjb21waWxhdGlvblVuaXQ7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSB1bnJlc29sdmVkIHNvdXJjZSBmb3JtcyBmb3IgdGhlIHR5cGUgb3IgbnVsbCBpZiB0aGUKKwkgKiByZWNlaXZlciByZXByZXNlbnRzIGEgY29tcGlsYXRpb24gdW5pdCBvciBiaW5hcnkgdHlwZS4KKwkgKiAKKwkgKiBNdWx0aXBsZSBzb3VyY2UgZm9ybXMgY2FuIGJlIGFuc3dlcmVkIGluIGNhc2UgdGhlIG9yaWdpbmF0aW5nIGNvbXBpbGF0aW9uIHVuaXQgZGlkIGNvbnRhaW4KKwkgKiBzZXZlcmFsIHR5cGUgYXQgb25jZS4gVGhlbiB0aGUgZmlyc3QgdHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgSVNvdXJjZVR5cGVbXSBnZXRTb3VyY2VUeXBlcygpIHsKKwkJcmV0dXJuIHNvdXJjZVR5cGVzOworCX0KKworCS8qKgorCSAqIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlciBjb250YWlucyB0aGUgcmVzb2x2ZWQgYmluYXJ5IGZvcm0gb2YgdGhlIHR5cGUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCaW5hcnlUeXBlKCkgeworCQlyZXR1cm4gYmluYXJ5VHlwZSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIEFuc3dlciB3aGV0aGVyIHRoZSByZWNlaXZlciBjb250YWlucyB0aGUgY29tcGlsYXRpb24gdW5pdCB3aGljaCBkZWZpbmVzIHRoZSB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29tcGlsYXRpb25Vbml0KCkgeworCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0ICE9IG51bGw7CisJfQorCisJLyoqCisJICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSB1bnJlc29sdmVkIHNvdXJjZSBmb3JtIG9mIHRoZSB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHNvdXJjZVR5cGVzICE9IG51bGw7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI5ODhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvQ29uZGl0aW9uYWxGbG93SW5mby5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CisKKy8qKgorICogUmVjb3JkIGNvbmRpdGlvbmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cyBkdXJpbmcgZGVmaW5pdGUgYXNzaWdubWVudCBhbmFseXNpcworICoKKyAqLworcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRmxvd0luZm8gZXh0ZW5kcyBGbG93SW5mbyB7CisJcHVibGljIEZsb3dJbmZvIGluaXRzV2hlblRydWU7CisJcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlOworQ29uZGl0aW9uYWxGbG93SW5mbyhGbG93SW5mbyBpbml0c1doZW5UcnVlLCBGbG93SW5mbyBpbml0c1doZW5GYWxzZSl7CisJdGhpcy5pbml0c1doZW5UcnVlID0gaW5pdHNXaGVuVHJ1ZTsKKwl0aGlzLmluaXRzV2hlbkZhbHNlID0gaW5pdHNXaGVuRmFsc2U7IAorfQorcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBhZGRJbml0aWFsaXphdGlvbnNGcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7CisJcmV0dXJuIHVuY29uZGl0aW9uYWxJbml0cygpLmFkZEluaXRpYWxpemF0aW9uc0Zyb20ob3RoZXJJbml0cyk7Cit9CitwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpIHsKKwlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShvdGhlckluaXRzKTsKK30KK3B1YmxpYyBGbG93SW5mbyBhc05lZ2F0ZWRDb25kaXRpb24oKSB7CisJRmxvd0luZm8gZXh0cmEgPSBpbml0c1doZW5UcnVlOworCWluaXRzV2hlblRydWUgPSBpbml0c1doZW5GYWxzZTsKKwlpbml0c1doZW5GYWxzZSA9IGV4dHJhOworCXJldHVybiB0aGlzOworfQorcHVibGljIEZsb3dJbmZvIGNvcHkoKSB7CisJcmV0dXJuIG5ldyBDb25kaXRpb25hbEZsb3dJbmZvKGluaXRzV2hlblRydWUuY29weSgpLCBpbml0c1doZW5GYWxzZS5jb3B5KCkpOworfQorcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKCkgeworCXJldHVybiBpbml0c1doZW5GYWxzZTsKK30KK3B1YmxpYyBGbG93SW5mbyBpbml0c1doZW5UcnVlKCkgeworCXJldHVybiBpbml0c1doZW5UcnVlOworfQorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KKyAqLworcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJcmV0dXJuIGluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpIAorCQkJJiYgaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpOworCQorfQorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCkgCisJCQkmJiBpbml0c1doZW5GYWxzZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCk7CisJCit9CitwdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUoKXsKKwlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkuaXNGYWtlUmVhY2hhYmxlKCk7CQorCS8vc2hvdWxkIG1heWJlIGRpcmVjdGx5IGJlOiBmYWxzZQorfQorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQpIAorCQkJfHwgaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkKTsKKwkKK30KKy8qKgorICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGZvciBhIGxvY2FsIHZhcmlhYmxlLgorICovCitwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWwpIAorCQkJfHwgaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGxvY2FsKTsKKwkKK30KKy8qKgorICogUmVjb3JkIGEgZmllbGQgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCisgKi8KK3B1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlpbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZCk7CisJaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsJCit9CisvKioKKyAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorICovCitwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwlpbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCk7CisJaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsKTsJCit9CisvKioKKyAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGZpZWxkCisgKi8KK3B1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlpbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChmaWVsZCk7CisJaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGZpZWxkKTsJCit9CisvKioKKyAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGxvY2FsIHZhcmlhYmxlCisgKi8KK3B1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGxvY2FsKTsKKwlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQobG9jYWwpOwkKK30KK3B1YmxpYyBGbG93SW5mbyBtYXJrQXNGYWtlUmVhY2hhYmxlKGJvb2xlYW4gaXNGYWtlUmVhY2hhYmxlKSB7CisJaW5pdHNXaGVuVHJ1ZS5tYXJrQXNGYWtlUmVhY2hhYmxlKGlzRmFrZVJlYWNoYWJsZSk7CisJaW5pdHNXaGVuRmFsc2UubWFya0FzRmFrZVJlYWNoYWJsZShpc0Zha2VSZWFjaGFibGUpOworCXJldHVybiB0aGlzOworfQorcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7CisJcmV0dXJuIHVuY29uZGl0aW9uYWxJbml0cygpLm1lcmdlZFdpdGgob3RoZXJJbml0cyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiRmxvd0luZm88dHJ1ZTogIiArIGluaXRzV2hlblRydWUudG9TdHJpbmcoKSArICIsIGZhbHNlOiAiICsgaW5pdHNXaGVuRmFsc2UudG9TdHJpbmcoKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQKK30KK3B1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzKCkgeworCXJldHVybiBpbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxJbml0cygpLmNvcHkoKQorCQkJLm1lcmdlZFdpdGgoaW5pdHNXaGVuRmFsc2UudW5jb25kaXRpb25hbEluaXRzKCkpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2NmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRyeVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5PYmplY3RDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworLyoqCisgKiBSZWZsZWN0cyB0aGUgY29udGV4dCBvZiBjb2RlIGFuYWx5c2lzLCBrZWVwaW5nIHRyYWNrIG9mIGVuY2xvc2luZworICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGV4dGVuZHMgRmxvd0NvbnRleHQgeworCQorCVJlZmVyZW5jZUJpbmRpbmdbXSBoYW5kbGVkRXhjZXB0aW9uczsKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRDYWNoZVNpemUgPSAzMjsgLy8gMzIgYml0cyBwZXIgaW50CisJaW50W10gaXNSZWFjaGVkOworCWludFtdIGlzTmVlZGVkOworCVVuY29uZGl0aW9uYWxGbG93SW5mb1tdIGluaXRzT25FeGNlcHRpb25zOworCU9iamVjdENhY2hlIGluZGV4ZXMgPSBuZXcgT2JqZWN0Q2FjaGUoKTsKKwlib29sZWFuIGlzTWV0aG9kQ29udGV4dDsKKworCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPblJldHVybjsKKworCS8vIGZvciBkZWFsaW5nIHdpdGggYW5vbnltb3VzIGNvbnN0cnVjdG9yIHRocm93biBleGNlcHRpb25zCisJcHVibGljIEFycmF5TGlzdCBleHRlbmRlZEV4Y2VwdGlvbnM7CisJCisJcHVibGljIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQoCisJCUZsb3dDb250ZXh0IHBhcmVudCwKKwkJQXN0Tm9kZSBhc3NvY2lhdGVkTm9kZSwKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGhhbmRsZWRFeGNlcHRpb25zLAorCQlCbG9ja1Njb3BlIHNjb3BlLAorCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlzdXBlcihwYXJlbnQsIGFzc29jaWF0ZWROb2RlKTsKKwkJaXNNZXRob2RDb250ZXh0ID0gc2NvcGUgPT0gc2NvcGUubWV0aG9kU2NvcGUoKTsKKwkJdGhpcy5oYW5kbGVkRXhjZXB0aW9ucyA9IGhhbmRsZWRFeGNlcHRpb25zOworCQlpbnQgY291bnQgPSBoYW5kbGVkRXhjZXB0aW9ucy5sZW5ndGgsIGNhY2hlU2l6ZSA9IChjb3VudCAvIEJpdENhY2hlU2l6ZSkgKyAxOworCQl0aGlzLmlzUmVhY2hlZCA9IG5ldyBpbnRbY2FjaGVTaXplXTsgLy8gbm9uZSBpcyByZWFjaGVkIGJ5IGRlZmF1bHQKKwkJdGhpcy5pc05lZWRlZCA9IG5ldyBpbnRbY2FjaGVTaXplXTsgLy8gbm9uZSBpcyBuZWVkZWQgYnkgZGVmYXVsdAorCQl0aGlzLmluaXRzT25FeGNlcHRpb25zID0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mb1tjb3VudF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJdGhpcy5pbmRleGVzLnB1dChoYW5kbGVkRXhjZXB0aW9uc1tpXSwgaSk7IC8vIGtleSB0eXBlICAtPiB2YWx1ZSBpbmRleAorCQkJYm9vbGVhbiBpc1VuY2hlY2tlZCA9CisJCQkJKHNjb3BlLmNvbXBhcmVVbmNoZWNrZWRFeGNlcHRpb24oaGFuZGxlZEV4Y2VwdGlvbnNbaV0pICE9IE5vdFJlbGF0ZWQpOworCQkJaW50IGNhY2hlSW5kZXggPSBpIC8gQml0Q2FjaGVTaXplLCBiaXRNYXNrID0gMSA8PCAoaSAlIEJpdENhY2hlU2l6ZSk7CisJCQlpZiAoaXNVbmNoZWNrZWQpIHsKKwkJCQlpc1JlYWNoZWRbY2FjaGVJbmRleF0gfD0gYml0TWFzazsKKwkJCQl0aGlzLmluaXRzT25FeGNlcHRpb25zW2ldID0gZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmluaXRzT25FeGNlcHRpb25zW2ldID0gRmxvd0luZm8uRGVhZEVuZDsKKwkJCX0KKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaXNSZWFjaGVkLCAwLCB0aGlzLmlzTmVlZGVkLCAwLCBjYWNoZVNpemUpOworCQl0aGlzLmluaXRzT25SZXR1cm4gPSBGbG93SW5mby5EZWFkRW5kOwkKKwl9CisKKwlwdWJsaWMgdm9pZCBjb21wbGFpbklmVW51c2VkRXhjZXB0aW9uSGFuZGxlcnMoCisJCUFzdE5vZGVbXSBleGNlcHRpb25IYW5kbGVycywKKwkJQmxvY2tTY29wZSBzY29wZSwKKwkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCkgeworCQkvLyByZXBvcnQgZXJyb3JzIGZvciB1bnJlYWNoYWJsZSBleGNlcHRpb24gaGFuZGxlcnMKKwkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gaGFuZGxlZEV4Y2VwdGlvbnMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJaW50IGluZGV4ID0gaW5kZXhlcy5nZXQoaGFuZGxlZEV4Y2VwdGlvbnNbaV0pOworCQkJaW50IGNhY2hlSW5kZXggPSBpbmRleCAvIEJpdENhY2hlU2l6ZTsKKwkJCWludCBiaXRNYXNrID0gMSA8PCAoaW5kZXggJSBCaXRDYWNoZVNpemUpOworCQkJaWYgKChpc1JlYWNoZWRbY2FjaGVJbmRleF0gJiBiaXRNYXNrKSA9PSAwKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZWFjaGFibGVFeGNlcHRpb25IYW5kbGVyKAorCQkJCQloYW5kbGVkRXhjZXB0aW9uc1tpbmRleF0sCisJCQkJCWV4Y2VwdGlvbkhhbmRsZXJzW2luZGV4XSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgoaXNOZWVkZWRbY2FjaGVJbmRleF0gJiBiaXRNYXNrKSA9PSAwKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm1hc2tlZEV4Y2VwdGlvbkhhbmRsZXIoCisJCQkJCQloYW5kbGVkRXhjZXB0aW9uc1tpbmRleF0sCisJCQkJCQlleGNlcHRpb25IYW5kbGVyc1tpbmRleF0pOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyB3aWxsIG9wdGltaXplZCBvdXQgdW5uZWNlc3NhcnkgY2F0Y2ggYmxvY2sgZHVyaW5nIGNvZGUgZ2VuCisJCXRyeVN0YXRlbWVudC5wcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXIgPSBpc05lZWRlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKKwkJCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGNlcHRpb24gZmxvdyBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGxlbmd0aCA9IGhhbmRsZWRFeGNlcHRpb25zLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaW50IGNhY2hlSW5kZXggPSBpIC8gQml0Q2FjaGVTaXplOworCQkJaW50IGJpdE1hc2sgPSAxIDw8IChpICUgQml0Q2FjaGVTaXplKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQoaGFuZGxlZEV4Y2VwdGlvbnNbaV0ucmVhZGFibGVOYW1lKCkpOworCQkJaWYgKChpc1JlYWNoZWRbY2FjaGVJbmRleF0gJiBiaXRNYXNrKSAhPSAwKSB7CisJCQkJaWYgKChpc05lZWRlZFtjYWNoZUluZGV4XSAmIGJpdE1hc2spID09IDApIHsKKwkJCQkJYnVmZmVyLmFwcGVuZCgiLW1hc2tlZCIpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJYnVmZmVyLmFwcGVuZCgiLXJlYWNoZWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLW5vdCByZWFjaGVkIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoJy0nKS5hcHBlbmQoaW5pdHNPbkV4Y2VwdGlvbnNbaV0udG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkV4Y2VwdGlvbihSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUpIHsKKwkJCisJCWludCBpbmRleDsKKwkJaWYgKChpbmRleCA9IGluZGV4ZXMuZ2V0KGV4Y2VwdGlvblR5cGUpKSA8IDApIHsKKwkJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCQl9CisJCXJldHVybiBpbml0c09uRXhjZXB0aW9uc1tpbmRleF07CisJfQorCisJcHVibGljIHZvaWQgcmVjb3JkSGFuZGxpbmdFeGNlcHRpb24oCisJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uVHlwZSwKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGZsb3dJbmZvLAorCQlUeXBlQmluZGluZyByYWlzZWRFeGNlcHRpb24sCisJCUFzdE5vZGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gd2FzQWxyZWFkeURlZmluaXRlbHlDYXVnaHQpIHsKKwkJCQorCQlpbnQgaW5kZXggPSBpbmRleGVzLmdldChleGNlcHRpb25UeXBlKTsKKwkJLy8gaWYgYWxyZWFkeSBmbGFnZ2VkIGFzIGJlaW5nIHJlYWNoZWQgKHVuY2hlY2tlZCBleGNlcHRpb24gaGFuZGxlcikKKwkJaW50IGNhY2hlSW5kZXggPSBpbmRleCAvIEJpdENhY2hlU2l6ZTsKKwkJaW50IGJpdE1hc2sgPSAxIDw8IChpbmRleCAlIEJpdENhY2hlU2l6ZSk7CisJCWlmICghd2FzQWxyZWFkeURlZmluaXRlbHlDYXVnaHQpIHsKKwkJCXRoaXMuaXNOZWVkZWRbY2FjaGVJbmRleF0gfD0gYml0TWFzazsKKwkJfQorCQl0aGlzLmlzUmVhY2hlZFtjYWNoZUluZGV4XSB8PSBiaXRNYXNrOworCQlpbml0c09uRXhjZXB0aW9uc1tpbmRleF0gPQorCQkJaW5pdHNPbkV4Y2VwdGlvbnNbaW5kZXhdID09IEZsb3dJbmZvLkRlYWRFbmQKKwkJCQk/IGZsb3dJbmZvLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKQorCQkJCTogaW5pdHNPbkV4Y2VwdGlvbnNbaW5kZXhdLm1lcmdlZFdpdGgoZmxvd0luZm8pOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZWNvcmRSZXR1cm5Gcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBmbG93SW5mbykgeworCQkKKwkJLy8gcmVjb3JkIGluaXRpYWxpemF0aW9ucyB3aGljaCB3ZXJlIHBlcmZvcm1lZCBhdCB0aGUgcmV0dXJuIHBvaW50CisJCWluaXRzT25SZXR1cm4gPSBpbml0c09uUmV0dXJuLm1lcmdlZFdpdGgoZmxvd0luZm8pOworCX0KKwkKKwkvKgorCSAqIENvbXB1dGUgYSBtZXJnZWQgbGlzdCBvZiB1bmhhbmRsZWQgZXhjZXB0aW9uIHR5cGVzIChrZWVwaW5nIG9ubHkgdGhlIG1vc3QgZ2VuZXJpYyBvbmVzKS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhZGQgc3ludGhldGljIHRocm93biBleGNlcHRpb25zIGZvciBhbm9ueW1vdXMgdHlwZSBjb25zdHJ1Y3RvcnMgKEpMUyA4LjYpLgorCSAqLworCXB1YmxpYyB2b2lkIG1lcmdlVW5oYW5kbGVkRXhjZXB0aW9uKFR5cGVCaW5kaW5nIG5ld0V4Y2VwdGlvbil7CisJCQorCQlpZiAodGhpcy5leHRlbmRlZEV4Y2VwdGlvbnMgPT0gbnVsbCl7CisJCQl0aGlzLmV4dGVuZGVkRXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoNSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaGFuZGxlZEV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspeworCQkJCXRoaXMuZXh0ZW5kZWRFeGNlcHRpb25zLmFkZCh0aGlzLmhhbmRsZWRFeGNlcHRpb25zW2ldKTsKKwkJCX0KKwkJfQorCQkKKwkJYm9vbGVhbiBpc1JlZHVuZGFudCA9IGZhbHNlOworCQkKKwkJZm9yKGludCBpID0gdGhpcy5leHRlbmRlZEV4Y2VwdGlvbnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKXsKKwkJCXN3aXRjaChTY29wZS5jb21wYXJlVHlwZXMobmV3RXhjZXB0aW9uLCAoVHlwZUJpbmRpbmcpdGhpcy5leHRlbmRlZEV4Y2VwdGlvbnMuZ2V0KGkpKSl7CisJCQkJY2FzZSBNb3JlR2VuZXJpYyA6CisJCQkJCXRoaXMuZXh0ZW5kZWRFeGNlcHRpb25zLnJlbW92ZShpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFcXVhbE9yTW9yZVNwZWNpZmljIDoKKwkJCQkJaXNSZWR1bmRhbnQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5vdFJlbGF0ZWQgOgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWlzUmVkdW5kYW50KXsKKwkJCXRoaXMuZXh0ZW5kZWRFeGNlcHRpb25zLmFkZChuZXdFeGNlcHRpb24pOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0ZpbmFsbHlGbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmluYWxseUZsb3dDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NDc2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0ZpbmFsbHlGbG93Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmdJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CisKKy8qKgorICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKKyAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgorICovCitwdWJsaWMgY2xhc3MgRmluYWxseUZsb3dDb250ZXh0IGV4dGVuZHMgRmxvd0NvbnRleHQgeworCQorCVJlZmVyZW5jZSBmaW5hbEFzc2lnbm1lbnRzW107CisJaW50IGFzc2lnbkNvdW50OworCQorCXB1YmxpYyBGaW5hbGx5Rmxvd0NvbnRleHQoRmxvd0NvbnRleHQgcGFyZW50LCBBc3ROb2RlIGFzc29jaWF0ZWROb2RlKSB7CisJCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUpOworCX0KKworCS8qKgorCSAqIEdpdmVuIHNvbWUgY29udGV4dHVhbCBpbml0aWFsaXphdGlvbiBpbmZvIChkZXJpdmVkIGZyb20gYSB0cnkgYmxvY2sgb3IgYSBjYXRjaCBibG9jayksIHRoaXMgCisJICogY29kZSB3aWxsIGNoZWNrIHRoYXQgdGhlIHN1YnJvdXRpbmUgY29udGV4dCBkb2VzIG5vdCBhbHNvIGluaXRpYWxpemUgYSBmaW5hbCB2YXJpYWJsZSBwb3RlbnRpYWxseSBzZXQKKwkgKiByZWR1bmRhbnRseS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGFpbk9uUmVkdW5kYW50RmluYWxBc3NpZ25tZW50cygKKwkJRmxvd0luZm8gZmxvd0luZm8sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NpZ25Db3VudDsgaSsrKSB7CisJCQlSZWZlcmVuY2UgcmVmOworCQkJaWYgKCgocmVmID0gZmluYWxBc3NpZ25tZW50c1tpXSkuYml0cyAmIEJpbmRpbmdJZHMuRklFTEQpICE9IDApIHsKKwkJCQkvLyBmaW5hbCBmaWVsZAorCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQocmVmLmZpZWxkQmluZGluZygpKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKHJlZi5maWVsZEJpbmRpbmcoKSwgcmVmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIGZpbmFsIGxvY2FsIHZhcmlhYmxlCisJCQkJaWYgKGZsb3dJbmZvCisJCQkJCS5pc1BvdGVudGlhbGx5QXNzaWduZWQoKExvY2FsVmFyaWFibGVCaW5kaW5nKSAoKE5hbWVSZWZlcmVuY2UpIHJlZikuYmluZGluZykpIHsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoCisJCQkJCQkoTG9jYWxWYXJpYWJsZUJpbmRpbmcpICgoTmFtZVJlZmVyZW5jZSkgcmVmKS5iaW5kaW5nLAorCQkJCQkJKE5hbWVSZWZlcmVuY2UpIHJlZik7CisJCQkJfQorCQkJfQorCQkJLy8gYW55IHJlZmVyZW5jZSByZXBvcnRlZCBhdCB0aGlzIGxldmVsIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IGNvbnRleHQgCisJCQkvLyB3aGVyZSBpdCBjb3VsZCBhbHNvIGJlIHJlcG9ydGVkIGFnYWluCisJCQlGbG93Q29udGV4dCBjdXJyZW50Q29udGV4dCA9IHBhcmVudDsKKwkJCXdoaWxlIChjdXJyZW50Q29udGV4dCAhPSBudWxsKSB7CisJCQkJaWYgKGN1cnJlbnRDb250ZXh0LmlzU3ViUm91dGluZSgpKSB7CisJCQkJCWN1cnJlbnRDb250ZXh0LnJlbW92ZUZpbmFsQXNzaWdubWVudElmQW55KHJlZik7CisJCQkJfQorCQkJCWN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQucGFyZW50OworCQkJfQorCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTdWJSb3V0aW5lKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlib29sZWFuIHJlY29yZEZpbmFsQXNzaWdubWVudCgKKwkJVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcsCisJCVJlZmVyZW5jZSBmaW5hbEFzc2lnbm1lbnQpIHsKKwkJaWYgKGFzc2lnbkNvdW50ID09IDApIHsKKwkJCWZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlWzVdOworCQl9IGVsc2UgeworCQkJaWYgKGFzc2lnbkNvdW50ID09IGZpbmFsQXNzaWdubWVudHMubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWZpbmFsQXNzaWdubWVudHMsCisJCQkJCTAsCisJCQkJCShmaW5hbEFzc2lnbm1lbnRzID0gbmV3IFJlZmVyZW5jZVthc3NpZ25Db3VudCAqIDJdKSwKKwkJCQkJMCwKKwkJCQkJYXNzaWduQ291bnQpOworCQl9OworCQlmaW5hbEFzc2lnbm1lbnRzW2Fzc2lnbkNvdW50KytdID0gZmluYWxBc3NpZ25tZW50OworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2YzVlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0NDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBSZWZsZWN0cyB0aGUgY29udGV4dCBvZiBjb2RlIGFuYWx5c2lzLCBrZWVwaW5nIHRyYWNrIG9mIGVuY2xvc2luZworICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCisgKi8KK3B1YmxpYyBjbGFzcyBGbG93Q29udGV4dCBpbXBsZW1lbnRzIFR5cGVDb25zdGFudHMgeworCXB1YmxpYyBBc3ROb2RlIGFzc29jaWF0ZWROb2RlOworCXB1YmxpYyBGbG93Q29udGV4dCBwYXJlbnQ7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIEZsb3dDb250ZXh0IE5vdENvbnRpbnVhYmxlQ29udGV4dCA9CisJCW5ldyBGbG93Q29udGV4dChudWxsLCBudWxsKTsKKwkJCisJcHVibGljIEZsb3dDb250ZXh0KEZsb3dDb250ZXh0IHBhcmVudCwgQXN0Tm9kZSBhc3NvY2lhdGVkTm9kZSkgeworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwkJdGhpcy5hc3NvY2lhdGVkTm9kZSA9IGFzc29jaWF0ZWROb2RlOworCX0KKwkKKwlwdWJsaWMgTGFiZWwgYnJlYWtMYWJlbCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIGNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCisJCVR5cGVCaW5kaW5nW10gcmFpc2VkRXhjZXB0aW9ucywKKwkJQXN0Tm9kZSBsb2NhdGlvbiwKKwkJRmxvd0luZm8gZmxvd0luZm8sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQkvLyBjaGVjayB0aGF0IGFsbCB0aGUgYXJndW1lbnQgZXhjZXB0aW9uIHR5cGVzIGFyZSBoYW5kbGVkCisJCS8vIEpESyBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIC0gd2hlbiBhbiBleGNlcHRpb24gdHlwZSBpcyB0aHJvd24sIAorCQkvLyBhbGwgcmVsYXRlZCBjYXRjaCBibG9ja3MgYXJlIG1hcmtlZCBhcyByZWFjaGFibGUuLi4gaW5zdGVhZCBvZiB0aG9zZSBvbmx5CisJCS8vIHVudGlsIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBzYWZlbHkgaGFuZGxlZCAoU21hcnRlciAtIHNlZSBjb21tZW50IGF0IHRoZSBlbmQpCisJCWludCByZW1haW5pbmdDb3VudDsgLy8gY291bnRpbmcgdGhlIG51bWJlciBvZiByZW1haW5pbmcgdW5oYW5kbGVkIGV4Y2VwdGlvbnMKKwkJaW50IHJhaXNlZENvdW50OyAvLyB0b3RhbCBudW1iZXIgb2YgZXhjZXB0aW9ucyByYWlzZWQKKwkJaWYgKChyYWlzZWRFeGNlcHRpb25zID09IG51bGwpCisJCQl8fCAoKHJhaXNlZENvdW50ID0gcmFpc2VkRXhjZXB0aW9ucy5sZW5ndGgpID09IDApKQorCQkJcmV0dXJuOworCQlyZW1haW5pbmdDb3VudCA9IHJhaXNlZENvdW50OworCisJCS8vIGR1cGxpY2F0ZSB0aGUgYXJyYXkgb2YgcmFpc2VkIGV4Y2VwdGlvbnMgc2luY2UgaXQgd2lsbCBiZSB1cGRhdGVkCisJCS8vIChudWxsIHJlcGxhY2VzIGFueSBoYW5kbGVkIGV4Y2VwdGlvbikKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXJhaXNlZEV4Y2VwdGlvbnMsCisJCQkwLAorCQkJKHJhaXNlZEV4Y2VwdGlvbnMgPSBuZXcgVHlwZUJpbmRpbmdbcmFpc2VkQ291bnRdKSwKKwkJCTAsCisJCQlyYWlzZWRDb3VudCk7CisJCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSB0aGlzOworCQl3aGlsZSAodHJhdmVyc2VkQ29udGV4dCAhPSBudWxsKSB7CisJCQlBc3ROb2RlIHN1YjsKKwkJCWlmICgoKHN1YiA9IHRyYXZlcnNlZENvbnRleHQuc3ViUm91dGluZSgpKSAhPSBudWxsKSAmJiBzdWIuY2Fubm90UmV0dXJuKCkpIHsKKwkJCQkvLyB0cmF2ZXJzaW5nIGEgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lIG1lYW5zIHRoYXQgYWxsIHVuaGFuZGxlZCAKKwkJCQkvLyBleGNlcHRpb25zIHdpbGwgYWN0dWFsbHkgbmV2ZXIgZ2V0IHNlbnQuLi4KKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBtb3N0IGVuY2xvc2luZyAKKwkJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVyIG9uZXMuCisJCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKKwkJCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGV4Y2VwdGlvbkNvbnRleHQgPQorCQkJCQkoRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCkgdHJhdmVyc2VkQ29udGV4dDsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gY2F1Z2h0RXhjZXB0aW9uczsKKwkJCQlpZiAoKGNhdWdodEV4Y2VwdGlvbnMgPSBleGNlcHRpb25Db250ZXh0LmhhbmRsZWRFeGNlcHRpb25zKSAhPSBOb0V4Y2VwdGlvbnMpIHsKKwkJCQkJaW50IGNhdWdodENvdW50ID0gY2F1Z2h0RXhjZXB0aW9ucy5sZW5ndGg7CisJCQkJCWJvb2xlYW5bXSBsb2NhbGx5Q2F1Z2h0ID0gbmV3IGJvb2xlYW5bcmFpc2VkQ291bnRdOyAvLyBhdCBtb3N0CisKKwkJCQkJZm9yIChpbnQgY2F1Z2h0SW5kZXggPSAwOyBjYXVnaHRJbmRleCA8IGNhdWdodENvdW50OyBjYXVnaHRJbmRleCsrKSB7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGNhdWdodEV4Y2VwdGlvbiA9IGNhdWdodEV4Y2VwdGlvbnNbY2F1Z2h0SW5kZXhdOworCQkJCQkJZm9yIChpbnQgcmFpc2VkSW5kZXggPSAwOyByYWlzZWRJbmRleCA8IHJhaXNlZENvdW50OyByYWlzZWRJbmRleCsrKSB7CisJCQkJCQkJVHlwZUJpbmRpbmcgcmFpc2VkRXhjZXB0aW9uOworCQkJCQkJCWlmICgocmFpc2VkRXhjZXB0aW9uID0gcmFpc2VkRXhjZXB0aW9uc1tyYWlzZWRJbmRleF0pICE9IG51bGwpIHsKKwkJCQkJCQkJc3dpdGNoIChTY29wZS5jb21wYXJlVHlwZXMocmFpc2VkRXhjZXB0aW9uLCBjYXVnaHRFeGNlcHRpb24pKSB7CisJCQkJCQkJCQljYXNlIEVxdWFsT3JNb3JlU3BlY2lmaWMgOgorCQkJCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQucmVjb3JkSGFuZGxpbmdFeGNlcHRpb24oCisJCQkJCQkJCQkJCWNhdWdodEV4Y2VwdGlvbiwKKwkJCQkJCQkJCQkJZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCksCisJCQkJCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbiwKKwkJCQkJCQkJCQkJbG9jYXRpb24sCisJCQkJCQkJCQkJCWxvY2FsbHlDYXVnaHRbcmFpc2VkSW5kZXhdKTsKKwkJCQkJCQkJCQkvLyB3YXMgYWxyZWFkeSBkZWZpbml0ZWx5IGNhdWdodCA/CisJCQkJCQkJCQkJaWYgKCFsb2NhbGx5Q2F1Z2h0W3JhaXNlZEluZGV4XSkgeworCQkJCQkJCQkJCQlsb2NhbGx5Q2F1Z2h0W3JhaXNlZEluZGV4XSA9IHRydWU7CisJCQkJCQkJCQkJCS8vIHJlbWVtYmVyIHRoYXQgdGhpcyBleGNlcHRpb24gaGFzIGJlZW4gZGVmaW5pdGVseSBjYXVnaHQKKwkJCQkJCQkJCQkJcmVtYWluaW5nQ291bnQtLTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIE1vcmVHZW5lcmljIDoKKwkJCQkJCQkJCQlleGNlcHRpb25Db250ZXh0LnJlY29yZEhhbmRsaW5nRXhjZXB0aW9uKAorCQkJCQkJCQkJCQljYXVnaHRFeGNlcHRpb24sCisJCQkJCQkJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLAorCQkJCQkJCQkJCQlyYWlzZWRFeGNlcHRpb24sCisJCQkJCQkJCQkJCWxvY2F0aW9uLAorCQkJCQkJCQkJCQlmYWxzZSk7CisJCQkJCQkJCQkJLy8gd2FzIG5vdCBjYXVnaHQgYWxyZWFkeSBwZXIgY29uc3RydWN0aW9uCisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gcmVtb3ZlIGxvY2FsbHkgY2F1Z2h0IGV4Y2VwdGlvbnMgZnJvbSB0aGUgcmVtYWluaW5nIG9uZXMKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYWlzZWRDb3VudDsgaSsrKSB7CisJCQkJCQlpZiAobG9jYWxseUNhdWdodFtpXSkgeworCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbnNbaV0gPSBudWxsOyAvLyByZW1vdmVkIGZyb20gdGhlIHJlbWFpbmluZyBvbmVzLgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCS8vIG1ldGhvZCB0cmVhdG1lbnQgZm9yIHVuY2hlY2tlZCBleGNlcHRpb25zCisJCQkJaWYgKGV4Y2VwdGlvbkNvbnRleHQuaXNNZXRob2RDb250ZXh0KSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFpc2VkQ291bnQ7IGkrKykgeworCQkJCQkJVHlwZUJpbmRpbmcgcmFpc2VkRXhjZXB0aW9uOworCQkJCQkJaWYgKChyYWlzZWRFeGNlcHRpb24gPSByYWlzZWRFeGNlcHRpb25zW2ldKSAhPSBudWxsKSB7CisJCQkJCQkJaWYgKHNjb3BlCisJCQkJCQkJCS5hcmVUeXBlc0NvbXBhdGlibGUocmFpc2VkRXhjZXB0aW9uLCBzY29wZS5nZXRKYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24oKSkKKwkJCQkJCQkJfHwgc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKHJhaXNlZEV4Y2VwdGlvbiwgc2NvcGUuZ2V0SmF2YUxhbmdFcnJvcigpKSkgeworCQkJCQkJCQlyZW1haW5pbmdDb3VudC0tOworCQkJCQkJCQlyYWlzZWRFeGNlcHRpb25zW2ldID0gbnVsbDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gYW5vbnltb3VzIGNvbnN0cnVjdG9ycyBhcmUgYWxsb3dlZCB0byB0aHJvdyBhbnkgZXhjZXB0aW9ucyAodGhlaXIgdGhyb3duIGV4Y2VwdGlvbnMKKwkJCQkJLy8gY2xhdXNlIHdpbGwgYmUgZml4ZWQgdXAgbGF0ZXIgYXMgcGVyIEpMUyA4LjYpLgorCQkJCQlpZiAoZXhjZXB0aW9uQ29udGV4dC5hc3NvY2lhdGVkTm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24peworCQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbilleGNlcHRpb25Db250ZXh0LmFzc29jaWF0ZWROb2RlOworCQkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgbWV0aG9kLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNBbm9ueW1vdXNUeXBlKCkpeworCQkJCQkJCQkKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKKwkJCQkJCQkJVHlwZUJpbmRpbmcgcmFpc2VkRXhjZXB0aW9uOworCQkJCQkJCQlpZiAoKHJhaXNlZEV4Y2VwdGlvbiA9IHJhaXNlZEV4Y2VwdGlvbnNbaV0pICE9IG51bGwpIHsKKwkJCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQubWVyZ2VVbmhhbmRsZWRFeGNlcHRpb24ocmFpc2VkRXhjZXB0aW9uKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gY29tcGxhaW4sIHdpbGwgZml4IHVwIGNvbnN0cnVjdG9yIGV4Y2VwdGlvbnMJCQkJCQkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsgLy8gbm90IGhhbmRsZWQgYW55d2hlcmUsIHRodXMganVtcCB0byBlcnJvciBoYW5kbGluZworCQkJCX0KKwkJCX0KKwkJCWlmIChyZW1haW5pbmdDb3VudCA9PSAwKQorCQkJCXJldHVybjsKKwkJCXRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudDsKKwkJfQorCQkvLyBpZiByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgYXJlIHNvbWUgcmVtYWluaW5nIHVuaGFuZGxlZCBleGNlcHRpb24gdHlwZXMuCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKKwkJCVR5cGVCaW5kaW5nIGV4Y2VwdGlvbjsKKwkJCWlmICgoZXhjZXB0aW9uID0gcmFpc2VkRXhjZXB0aW9uc1tpXSkgIT0gbnVsbCkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaGFuZGxlZEV4Y2VwdGlvbihleGNlcHRpb24sIGxvY2F0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCisJCVR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbiwKKwkJQXN0Tm9kZSBsb2NhdGlvbiwKKwkJRmxvd0luZm8gZmxvd0luZm8sCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQkvLyBMSUdIVC1WRVJTSU9OIE9GIFRIRSBFUVVJVkFMRU5UIFdJVEggQU4gQVJSQVkgT0YgRVhDRVBUSU9OUworCQkvLyBjaGVjayB0aGF0IGFsbCB0aGUgYXJndW1lbnQgZXhjZXB0aW9uIHR5cGVzIGFyZSBoYW5kbGVkCisJCS8vIEpESyBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uIC0gd2hlbiBhbiBleGNlcHRpb24gdHlwZSBpcyB0aHJvd24sIAorCQkvLyBhbGwgcmVsYXRlZCBjYXRjaCBibG9ja3MgYXJlIG1hcmtlZCBhcyByZWFjaGFibGUuLi4gaW5zdGVhZCBvZiB0aG9zZSBvbmx5CisJCS8vIHVudGlsIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBzYWZlbHkgaGFuZGxlZCAoU21hcnRlciAtIHNlZSBjb21tZW50IGF0IHRoZSBlbmQpCisJCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSB0aGlzOworCQl3aGlsZSAodHJhdmVyc2VkQ29udGV4dCAhPSBudWxsKSB7CisJCQlBc3ROb2RlIHN1YjsKKwkJCWlmICgoKHN1YiA9IHRyYXZlcnNlZENvbnRleHQuc3ViUm91dGluZSgpKSAhPSBudWxsKSAmJiBzdWIuY2Fubm90UmV0dXJuKCkpIHsKKwkJCQkvLyB0cmF2ZXJzaW5nIGEgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lIG1lYW5zIHRoYXQgYWxsIHVuaGFuZGxlZCAKKwkJCQkvLyBleGNlcHRpb25zIHdpbGwgYWN0dWFsbHkgbmV2ZXIgZ2V0IHNlbnQuLi4KKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBtb3N0IGVuY2xvc2luZyAKKwkJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVyIG9uZXMuCisJCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKKwkJCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGV4Y2VwdGlvbkNvbnRleHQgPQorCQkJCQkoRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCkgdHJhdmVyc2VkQ29udGV4dDsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gY2F1Z2h0RXhjZXB0aW9uczsKKwkJCQlpZiAoKGNhdWdodEV4Y2VwdGlvbnMgPSBleGNlcHRpb25Db250ZXh0LmhhbmRsZWRFeGNlcHRpb25zKSAhPSBOb0V4Y2VwdGlvbnMpIHsKKwkJCQkJYm9vbGVhbiBkZWZpbml0ZWx5Q2F1Z2h0ID0gZmFsc2U7CisJCQkJCWZvciAoaW50IGNhdWdodEluZGV4ID0gMCwgY2F1Z2h0Q291bnQgPSBjYXVnaHRFeGNlcHRpb25zLmxlbmd0aDsKKwkJCQkJCWNhdWdodEluZGV4IDwgY2F1Z2h0Q291bnQ7CisJCQkJCQljYXVnaHRJbmRleCsrKSB7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGNhdWdodEV4Y2VwdGlvbiA9IGNhdWdodEV4Y2VwdGlvbnNbY2F1Z2h0SW5kZXhdOworCQkJCQkJc3dpdGNoIChTY29wZS5jb21wYXJlVHlwZXMocmFpc2VkRXhjZXB0aW9uLCBjYXVnaHRFeGNlcHRpb24pKSB7CisJCQkJCQkJY2FzZSBFcXVhbE9yTW9yZVNwZWNpZmljIDoKKwkJCQkJCQkJZXhjZXB0aW9uQ29udGV4dC5yZWNvcmRIYW5kbGluZ0V4Y2VwdGlvbigKKwkJCQkJCQkJCWNhdWdodEV4Y2VwdGlvbiwKKwkJCQkJCQkJCWZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLAorCQkJCQkJCQkJcmFpc2VkRXhjZXB0aW9uLAorCQkJCQkJCQkJbG9jYXRpb24sCisJCQkJCQkJCQlkZWZpbml0ZWx5Q2F1Z2h0KTsKKwkJCQkJCQkJLy8gd2FzIGl0IGFscmVhZHkgZGVmaW5pdGVseSBjYXVnaHQgPworCQkJCQkJCQlkZWZpbml0ZWx5Q2F1Z2h0ID0gdHJ1ZTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBNb3JlR2VuZXJpYyA6CisJCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQucmVjb3JkSGFuZGxpbmdFeGNlcHRpb24oCisJCQkJCQkJCQljYXVnaHRFeGNlcHRpb24sCisJCQkJCQkJCQlmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSwKKwkJCQkJCQkJCXJhaXNlZEV4Y2VwdGlvbiwKKwkJCQkJCQkJCWxvY2F0aW9uLAorCQkJCQkJCQkJZmFsc2UpOworCQkJCQkJCQkvLyB3YXMgbm90IGNhdWdodCBhbHJlYWR5IHBlciBjb25zdHJ1Y3Rpb24KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoZGVmaW5pdGVseUNhdWdodCkKKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLy8gbWV0aG9kIHRyZWF0bWVudCBmb3IgdW5jaGVja2VkIGV4Y2VwdGlvbnMKKwkJCQlpZiAoZXhjZXB0aW9uQ29udGV4dC5pc01ldGhvZENvbnRleHQpIHsKKwkJCQkJaWYgKHNjb3BlCisJCQkJCQkuYXJlVHlwZXNDb21wYXRpYmxlKHJhaXNlZEV4Y2VwdGlvbiwgc2NvcGUuZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkpCisJCQkJCQl8fCBzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUocmFpc2VkRXhjZXB0aW9uLCBzY29wZS5nZXRKYXZhTGFuZ0Vycm9yKCkpKQorCQkJCQkJcmV0dXJuOworCQkJCQkJCisJCQkJCS8vIGFub255bW91cyBjb25zdHJ1Y3RvcnMgYXJlIGFsbG93ZWQgdG8gdGhyb3cgYW55IGV4Y2VwdGlvbnMgKHRoZWlyIHRocm93biBleGNlcHRpb25zCisJCQkJCS8vIGNsYXVzZSB3aWxsIGJlIGZpeGVkIHVwIGxhdGVyIGFzIHBlciBKTFMgOC42KS4KKwkJCQkJaWYgKGV4Y2VwdGlvbkNvbnRleHQuYXNzb2NpYXRlZE5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKKwkJCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pZXhjZXB0aW9uQ29udGV4dC5hc3NvY2lhdGVkTm9kZTsKKwkJCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmIG1ldGhvZC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzQW5vbnltb3VzVHlwZSgpKXsKKwkJCQkJCQkJCQorCQkJCQkJCWV4Y2VwdGlvbkNvbnRleHQubWVyZ2VVbmhhbmRsZWRFeGNlcHRpb24ocmFpc2VkRXhjZXB0aW9uKTsKKwkJCQkJCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gY29tcGxhaW4sIHdpbGwgZml4IHVwIGNvbnN0cnVjdG9yIGV4Y2VwdGlvbnMJCQkJCQkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsgLy8gbm90IGhhbmRsZWQgYW55d2hlcmUsIHRodXMganVtcCB0byBlcnJvciBoYW5kbGluZworCQkJCX0KKwkJCX0KKwkJCXRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudDsKKwkJfQorCQkvLyBpZiByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgYXJlIHNvbWUgcmVtYWluaW5nIHVuaGFuZGxlZCBleGNlcHRpb24gdHlwZXMuCisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaGFuZGxlZEV4Y2VwdGlvbihyYWlzZWRFeGNlcHRpb24sIGxvY2F0aW9uKTsKKwl9CisKKwlwdWJsaWMgTGFiZWwgY29udGludWVMYWJlbCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBsb29rdXAgdGhyb3VnaCBicmVhayBsYWJlbHMKKwkgKi8KKwlwdWJsaWMgRmxvd0NvbnRleHQgZ2V0VGFyZ2V0Q29udGV4dEZvckJyZWFrTGFiZWwoY2hhcltdIGxhYmVsTmFtZSkgeworCQlGbG93Q29udGV4dCBjdXJyZW50ID0gdGhpcywgbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPSBudWxsOworCQl3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisJCQlpZiAoY3VycmVudC5pc05vblJldHVybmluZ0NvbnRleHQoKSkgeworCQkJCWxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lID0gY3VycmVudDsKKwkJCX0KKwkJCWNoYXJbXSBjdXJyZW50TGFiZWxOYW1lOworCQkJaWYgKCgoY3VycmVudExhYmVsTmFtZSA9IGN1cnJlbnQubGFiZWxOYW1lKCkpICE9IG51bGwpCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudExhYmVsTmFtZSwgbGFiZWxOYW1lKSkgeworCQkJCWlmIChsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9PSBudWxsKSB7CisJCQkJCXJldHVybiBjdXJyZW50OworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZTsKKwkJCQl9CisJCQl9CisJCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJCX0KKwkJLy8gbm90IGZvdW5kCisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogbG9va3VwIHRocm91Z2ggY29udGludWUgbGFiZWxzCisJICovCisJcHVibGljIEZsb3dDb250ZXh0IGdldFRhcmdldENvbnRleHRGb3JDb250aW51ZUxhYmVsKGNoYXJbXSBsYWJlbE5hbWUpIHsKKwkJRmxvd0NvbnRleHQgY3VycmVudCA9IHRoaXMsCisJCQlsYXN0Q29udGludWFibGUgPSBudWxsLAorCQkJbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPSBudWxsOworCQl3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisJCQlpZiAoY3VycmVudC5pc05vblJldHVybmluZ0NvbnRleHQoKSkgeworCQkJCWxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lID0gY3VycmVudDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGN1cnJlbnQuaXNDb250aW51YWJsZSgpKSB7CisJCQkJCWxhc3RDb250aW51YWJsZSA9IGN1cnJlbnQ7CisJCQkJfQorCQkJfQorCQkJY2hhcltdIGN1cnJlbnRMYWJlbE5hbWU7CisJCQlpZiAoKChjdXJyZW50TGFiZWxOYW1lID0gY3VycmVudC5sYWJlbE5hbWUoKSkgIT0gbnVsbCkKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50TGFiZWxOYW1lLCBsYWJlbE5hbWUpKSB7CisJCQkJaWYgKChsYXN0Q29udGludWFibGUgIT0gbnVsbCkKKwkJCQkJJiYgKGN1cnJlbnQuYXNzb2NpYXRlZE5vZGUuY29uY3JldGVTdGF0ZW1lbnQoKQorCQkJCQkJPT0gbGFzdENvbnRpbnVhYmxlLmFzc29jaWF0ZWROb2RlKSkgeworCQkJCQlpZiAobGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGxhc3RDb250aW51YWJsZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGxhYmVsIGlzIGZvdW5kLCBidXQgbm90IGEgY29udGludWFibGUgbG9jYXRpb24KKwkJCQkJcmV0dXJuIE5vdENvbnRpbnVhYmxlQ29udGV4dDsKKwkJCQl9CisJCQl9CisJCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJCX0KKwkJLy8gbm90IGZvdW5kCisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogbG9va3VwIGEgZGVmYXVsdCBicmVhayB0aHJvdWdoIGJyZWFrYWJsZSBsb2NhdGlvbnMKKwkgKi8KKwlwdWJsaWMgRmxvd0NvbnRleHQgZ2V0VGFyZ2V0Q29udGV4dEZvckRlZmF1bHRCcmVhaygpIHsKKwkJRmxvd0NvbnRleHQgY3VycmVudCA9IHRoaXMsIGxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lID0gbnVsbDsKKwkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnQuaXNOb25SZXR1cm5pbmdDb250ZXh0KCkpIHsKKwkJCQlsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IGN1cnJlbnQ7CisJCQl9CisJCQlpZiAoY3VycmVudC5pc0JyZWFrYWJsZSgpKSB7CisJCQkJaWYgKGxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGN1cnJlbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lOworCQkJCX0KKwkJCX0KKwkJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwkJfQorCQkvLyBub3QgZm91bmQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBsb29rdXAgYSBkZWZhdWx0IGNvbnRpbnVlIGFtb25nc3QgY29udGludWFibGUgbG9jYXRpb25zCisJICovCisJcHVibGljIEZsb3dDb250ZXh0IGdldFRhcmdldENvbnRleHRGb3JEZWZhdWx0Q29udGludWUoKSB7CisJCUZsb3dDb250ZXh0IGN1cnJlbnQgPSB0aGlzLCBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IG51bGw7CisJCXdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50LmlzTm9uUmV0dXJuaW5nQ29udGV4dCgpKSB7CisJCQkJbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPSBjdXJyZW50OworCQkJfQorCQkJaWYgKGN1cnJlbnQuaXNDb250aW51YWJsZSgpKSB7CisJCQkJaWYgKGxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGN1cnJlbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGxhc3ROb25SZXR1cm5pbmdTdWJSb3V0aW5lOworCQkJCX0KKwkJCX0KKwkJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwkJfQorCQkvLyBub3QgZm91bmQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7CisJCXJldHVybiAiRmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBGbG93SW5mbyBpbml0c09uQnJlYWsoKSB7CisJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQnJlYWthYmxlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDb250aW51YWJsZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTm9uUmV0dXJuaW5nQ29udGV4dCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3ViUm91dGluZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBjaGFyW10gbGFiZWxOYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRCcmVha0Zyb20oRmxvd0luZm8gZmxvd0luZm8pIHsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRDb250aW51ZUZyb20oRmxvd0luZm8gZmxvd0luZm8pIHsKKwl9CisKKwlib29sZWFuIHJlY29yZEZpbmFsQXNzaWdubWVudCgKKwkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlLAorCQlSZWZlcmVuY2UgZmluYWxSZWZlcmVuY2UpIHsKKwkJcmV0dXJuIHRydWU7IC8vIGtlZXAgZ29pbmcKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRSZXR1cm5Gcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBmbG93SW5mbykgeworCX0KKworCXB1YmxpYyB2b2lkIHJlY29yZFNldHRpbmdGaW5hbCgKKwkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlLAorCQlSZWZlcmVuY2UgZmluYWxSZWZlcmVuY2UpIHsKKwkJLy8gZm9yIGluaXRpYWxpemF0aW9uIGluc2lkZSBsb29waW5nIHN0YXRlbWVudCB0aGF0IGVmZmVjdGl2ZWx5IGxvb3BzCisJCUZsb3dDb250ZXh0IGNvbnRleHQgPSB0aGlzOworCQl3aGlsZSAoY29udGV4dCAhPSBudWxsKSB7CisJCQlpZiAoIWNvbnRleHQucmVjb3JkRmluYWxBc3NpZ25tZW50KHZhcmlhYmxlLCBmaW5hbFJlZmVyZW5jZSkpIHsKKwkJCQlicmVhazsgLy8gbm8gbmVlZCB0byBrZWVwIGdvaW5nCisJCQl9CisJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7CisJCX0KKwl9CisKKwl2b2lkIHJlbW92ZUZpbmFsQXNzaWdubWVudElmQW55KFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwl9CisKKwlwdWJsaWMgQXN0Tm9kZSBzdWJSb3V0aW5lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlGbG93Q29udGV4dCBjdXJyZW50ID0gdGhpczsKKwkJaW50IHBhcmVudHNDb3VudCA9IDA7CisJCXdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSAhPSBudWxsKSB7CisJCQlwYXJlbnRzQ291bnQrKzsKKwkJfQorCQlGbG93Q29udGV4dFtdIHBhcmVudHMgPSBuZXcgRmxvd0NvbnRleHRbcGFyZW50c0NvdW50ICsgMV07CisJCWN1cnJlbnQgPSB0aGlzOworCQlpbnQgaW5kZXggPSBwYXJlbnRzQ291bnQ7CisJCXdoaWxlIChpbmRleCA+PSAwKSB7CisJCQlwYXJlbnRzW2luZGV4LS1dID0gY3VycmVudDsKKwkJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmVudHNDb3VudDsgaSsrKSB7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKKwkJCQlidWZmZXIuYXBwZW5kKCdcdCcpOworCQkJYnVmZmVyLmFwcGVuZChwYXJlbnRzW2ldLmluZGl2aWR1YWxUb1N0cmluZygpKS5hcHBlbmQoJ1xuJyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgnKicpOworCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmVudHNDb3VudCArIDE7IGorKykKKwkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCWJ1ZmZlci5hcHBlbmQoaW5kaXZpZHVhbFRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NkYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxvd0luZm8geworCXB1YmxpYyBzdGF0aWMgZmluYWwgVW5jb25kaXRpb25hbEZsb3dJbmZvIERlYWRFbmQgPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvKCk7IC8vIFJlcHJlc2VudHMgYSBkZWFkIGJyYW5jaCBzdGF0dXMgb2YgaW5pdGlhbGl6YXRpb24KK2Fic3RyYWN0IHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWRkSW5pdGlhbGl6YXRpb25zRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cyk7CithYnN0cmFjdCBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpOworcHVibGljIEZsb3dJbmZvIGFzTmVnYXRlZENvbmRpdGlvbigpIHsKKwlyZXR1cm4gdGhpczsKK30KK3B1YmxpYyBib29sZWFuIGNvbXBsYWluSWZVbnJlYWNoYWJsZShTdGF0ZW1lbnQgc3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gUmVwb3J0IGFuIGVycm9yIGlmIG5lY2Vzc2FyeQorCisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIHN0YXRpYyBGbG93SW5mbyBjb25kaXRpb25hbChGbG93SW5mbyBpbml0c1doZW5UcnVlLCBGbG93SW5mbyBpbml0c1doZW5GYWxzZSl7CisJLy8gaWYgKGluaXRzV2hlblRydWUuZXF1YWxzKGluaXRzV2hlbkZhbHNlKSkgcmV0dXJuIGluaXRzV2hlblRydWU7IC0tIGNvdWxkIG9wdGltaXplIGlmICNlcXVhbHMgaXMgZGVmaW5lZAorCXJldHVybiBuZXcgQ29uZGl0aW9uYWxGbG93SW5mbyhpbml0c1doZW5UcnVlLCBpbml0c1doZW5GYWxzZSk7Cit9CithYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gY29weSgpOworcHVibGljIHN0YXRpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdGlhbChpbnQgbWF4RmllbGRDb3VudCkgeworCVVuY29uZGl0aW9uYWxGbG93SW5mbyBpbmZvID0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mbygpOworCWluZm8ubWF4RmllbGRDb3VudCA9IG1heEZpZWxkQ291bnQ7CisJcmV0dXJuIGluZm87Cit9CithYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UoKTsKK2Fic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5UcnVlKCk7CitmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0RlYWRFbmQoKSB7CisJcmV0dXJuIHRoaXMgPT0gRGVhZEVuZDsKK30KKy8qKgorICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisgKi8KKyBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOyAgIAorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBsb2NhbC4KKyAqLworcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNGYWtlUmVhY2hhYmxlKCk7CisvKioKKyAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KKyAqLworIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOyAgIAorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwgdmFyaWFibGUuCisgKi8KKyBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgZmllbGQpOyAgIAorLyoqCisgKiBSZWNvcmQgYSBmaWVsZCBnb3QgZGVmaW5pdGVseSBhc3NpZ25lZC4KKyAqLworYWJzdHJhY3QgcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCk7CisvKioKKyAqIFJlY29yZCBhIGxvY2FsIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorICovCithYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworLyoqCisgKiBDbGVhciB0aGUgaW5pdGlhbGl6YXRpb24gaW5mbyBmb3IgYSBmaWVsZAorICovCithYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKTsKKy8qKgorICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgbG9jYWwgdmFyaWFibGUKKyAqLworYWJzdHJhY3QgcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKTsKK2Fic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBtYXJrQXNGYWtlUmVhY2hhYmxlKGJvb2xlYW4gaXNGYWtlUmVhY2hhYmxlKTsKK2Fic3RyYWN0IHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gbWVyZ2VkV2l0aChVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cyk7CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJaWYgKHRoaXMgPT0gRGVhZEVuZCl7CisJCXJldHVybiAiRmxvd0luZm8uRGVhZEVuZCI7IC8vJE5PTi1OTFMtMSQKKwl9CisJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Cit9CithYnN0cmFjdCBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHVuY29uZGl0aW9uYWxJbml0cygpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTI2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCisvKioKKyAqIFJlZmxlY3RzIHRoZSBjb250ZXh0IG9mIGNvZGUgYW5hbHlzaXMsIGtlZXBpbmcgdHJhY2sgb2YgZW5jbG9zaW5nCisgKgl0cnkgc3RhdGVtZW50cywgZXhjZXB0aW9uIGhhbmRsZXJzLCBldGMuLi4KKyAqLworcHVibGljIGNsYXNzIEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgZXh0ZW5kcyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IHsKKworCXB1YmxpYyBpbnQgZXhjZXB0aW9uQ291bnQ7CisJcHVibGljIFR5cGVCaW5kaW5nW10gdGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlQmluZGluZ1s1XTsKKwlwdWJsaWMgQXN0Tm9kZVtdIGV4Y2VwdGlvblRocm93ZXJzID0gbmV3IEFzdE5vZGVbNV07CisJcHVibGljIEZsb3dJbmZvW10gZXhjZXB0aW9uVGhyb3dlckZsb3dJbmZvcyA9IG5ldyBGbG93SW5mb1s1XTsKKworCXB1YmxpYyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KAorCQlGbG93Q29udGV4dCBwYXJlbnQsCisJCUFzdE5vZGUgYXNzb2NpYXRlZE5vZGUsCisJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJc3VwZXIoCisJCQlwYXJlbnQsCisJCQlhc3NvY2lhdGVkTm9kZSwKKwkJCW5ldyBSZWZlcmVuY2VCaW5kaW5nW10geyBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpfSwKKwkJLy8gdG9sZXJhdGUgYW55IGtpbmQgb2YgZXhjZXB0aW9uLCBidXQgcmVjb3JkIHRoZW0KKwkJc2NvcGUsIEZsb3dJbmZvLkRlYWRFbmQpOworCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrSW5pdGlhbGl6ZXJFeGNlcHRpb25zKAorCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKKwkJRmxvd0NvbnRleHQgaW5pdGlhbGl6ZXJDb250ZXh0LAorCQlGbG93SW5mbyBmbG93SW5mbykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyBpKyspIHsKKwkJCWluaXRpYWxpemVyQ29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKAorCQkJCXRocm93bkV4Y2VwdGlvbnNbaV0sCisJCQkJZXhjZXB0aW9uVGhyb3dlcnNbaV0sCisJCQkJZXhjZXB0aW9uVGhyb3dlckZsb3dJbmZvc1tpXSwKKwkJCQljdXJyZW50U2NvcGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVjb3JkSGFuZGxpbmdFeGNlcHRpb24oCisJCVJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uVHlwZSwKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGZsb3dJbmZvLAorCQlUeXBlQmluZGluZyByYWlzZWRFeGNlcHRpb24sCisJCUFzdE5vZGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gd2FzTWFza2VkKSB7CisJCQkKKwkJaW50IHNpemUgPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJaWYgKGV4Y2VwdGlvbkNvdW50ID09IHNpemUpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhyb3duRXhjZXB0aW9ucywKKwkJCQkwLAorCQkJCSh0aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVCaW5kaW5nW3NpemUgKiAyXSksCisJCQkJMCwKKwkJCQlzaXplKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZXhjZXB0aW9uVGhyb3dlcnMsCisJCQkJMCwKKwkJCQkoZXhjZXB0aW9uVGhyb3dlcnMgPSBuZXcgQXN0Tm9kZVtzaXplICogMl0pLAorCQkJCTAsCisJCQkJc2l6ZSk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3MsCisJCQkJMCwKKwkJCQkoZXhjZXB0aW9uVGhyb3dlckZsb3dJbmZvcyA9IG5ldyBGbG93SW5mb1tzaXplICogMl0pLAorCQkJCTAsCisJCQkJc2l6ZSk7CisJCX0KKwkJdGhyb3duRXhjZXB0aW9uc1tleGNlcHRpb25Db3VudF0gPSByYWlzZWRFeGNlcHRpb247CisJCWV4Y2VwdGlvblRocm93ZXJzW2V4Y2VwdGlvbkNvdW50XSA9IGludm9jYXRpb25TaXRlOworCQlleGNlcHRpb25UaHJvd2VyRmxvd0luZm9zW2V4Y2VwdGlvbkNvdW50KytdID0gZmxvd0luZm8uY29weSgpOworCX0JCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9JbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVjMGIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CisKKy8qKgorICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKKyAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgorICovCitwdWJsaWMgY2xhc3MgSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0IGV4dGVuZHMgRmxvd0NvbnRleHQgeworCisJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uUmV0dXJuOworCQorCXB1YmxpYyBJbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQoCisJCUZsb3dDb250ZXh0IHBhcmVudCwKKwkJQXN0Tm9kZSBhc3NvY2lhdGVkTm9kZSkgeworCQlzdXBlcihwYXJlbnQsIGFzc29jaWF0ZWROb2RlKTsKKwkJdGhpcy5pbml0c09uUmV0dXJuID0gRmxvd0luZm8uRGVhZEVuZDsJCQkJCisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTm9uUmV0dXJuaW5nQ29udGV4dCgpIHsKKwkJcmV0dXJuIGFzc29jaWF0ZWROb2RlLmNhbm5vdFJldHVybigpOworCX0KKwkKKwlwdWJsaWMgQXN0Tm9kZSBzdWJSb3V0aW5lKCkgeworCQlyZXR1cm4gYXNzb2NpYXRlZE5vZGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlY29yZFJldHVybkZyb20oVW5jb25kaXRpb25hbEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCS8vIHJlY29yZCBpbml0aWFsaXphdGlvbnMgd2hpY2ggd2VyZSBwZXJmb3JtZWQgYXQgdGhlIHJldHVybiBwb2ludAorCQlpbml0c09uUmV0dXJuID0gaW5pdHNPblJldHVybi5tZXJnZWRXaXRoKGZsb3dJbmZvKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTI5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9MYWJlbEZsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKKyAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgorICovCitwdWJsaWMgY2xhc3MgTGFiZWxGbG93Q29udGV4dCBleHRlbmRzIFN3aXRjaEZsb3dDb250ZXh0IHsKKwlwdWJsaWMgY2hhcltdIGxhYmVsTmFtZTsKKwlwdWJsaWMgTGFiZWxGbG93Q29udGV4dCgKKwkJRmxvd0NvbnRleHQgcGFyZW50LAorCQlBc3ROb2RlIGFzc29jaWF0ZWROb2RlLAorCQljaGFyW10gbGFiZWxOYW1lLAorCQlMYWJlbCBicmVha0xhYmVsLAorCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUsIGJyZWFrTGFiZWwpOworCQl0aGlzLmxhYmVsTmFtZSA9IGxhYmVsTmFtZTsKKwkJY2hlY2tMYWJlbFZhbGlkaXR5KHNjb3BlKTsKKwl9CisKKwl2b2lkIGNoZWNrTGFiZWxWYWxpZGl0eShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCS8vIGNoZWNrIGlmIGxhYmVsIHdhcyBhbHJlYWR5IGRlZmluZWQgYWJvdmUKKwkJRmxvd0NvbnRleHQgY3VycmVudCA9IHBhcmVudDsKKwkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworCQkJY2hhcltdIGN1cnJlbnRMYWJlbE5hbWU7CisJCQlpZiAoKChjdXJyZW50TGFiZWxOYW1lID0gY3VycmVudC5sYWJlbE5hbWUoKSkgIT0gbnVsbCkKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50TGFiZWxOYW1lLCBsYWJlbE5hbWUpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWxyZWFkeURlZmluZWRMYWJlbChsYWJlbE5hbWUsIGFzc29jaWF0ZWROb2RlKTsKKwkJCX0KKwkJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkxhYmVsIGZsb3cgY29udGV4dCBbbGFiZWw6IiArIFN0cmluZy52YWx1ZU9mKGxhYmVsTmFtZSkgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBjaGFyW10gbGFiZWxOYW1lKCkgeworCQlyZXR1cm4gbGFiZWxOYW1lOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Mb29waW5nRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Mb29waW5nRmxvd0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CisKKy8qKgorICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKKyAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgorICovCitwdWJsaWMgY2xhc3MgTG9vcGluZ0Zsb3dDb250ZXh0IGV4dGVuZHMgU3dpdGNoRmxvd0NvbnRleHQgeworCXB1YmxpYyBMYWJlbCBjb250aW51ZUxhYmVsOworCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkNvbnRpbnVlID0gRmxvd0luZm8uRGVhZEVuZDsKKwlSZWZlcmVuY2UgZmluYWxBc3NpZ25tZW50c1tdOworCVZhcmlhYmxlQmluZGluZyBmaW5hbFZhcmlhYmxlc1tdOworCWludCBhc3NpZ25Db3VudCA9IDA7CisJU2NvcGUgYXNzb2NpYXRlZFNjb3BlOworCXB1YmxpYyBMb29waW5nRmxvd0NvbnRleHQoCisJCUZsb3dDb250ZXh0IHBhcmVudCwKKwkJQXN0Tm9kZSBhc3NvY2lhdGVkTm9kZSwKKwkJTGFiZWwgYnJlYWtMYWJlbCwKKwkJTGFiZWwgY29udGludWVMYWJlbCwKKwkJU2NvcGUgYXNzb2NpYXRlZFNjb3BlKSB7CisJCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUsIGJyZWFrTGFiZWwpOworCQl0aGlzLmNvbnRpbnVlTGFiZWwgPSBjb250aW51ZUxhYmVsOworCQl0aGlzLmFzc29jaWF0ZWRTY29wZSA9IGFzc29jaWF0ZWRTY29wZTsKKwl9CisJCisJcHVibGljIHZvaWQgY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3AoCisJCUJsb2NrU2NvcGUgc2NvcGUsCisJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXNzaWduQ291bnQ7IGkrKykgeworCQkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlOworCQkJaWYgKCh2YXJpYWJsZSA9IGZpbmFsVmFyaWFibGVzW2ldKSAhPSBudWxsKSB7CisJCQkJYm9vbGVhbiBjb21wbGFpbmVkOyAvLyByZW1lbWJlciBpZiBoYXZlIGNvbXBsYWluZWQgb24gdGhpcyBmaW5hbCBhc3NpZ25tZW50CisJCQkJaWYgKHZhcmlhYmxlIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CisJCQkJCWlmIChjb21wbGFpbmVkID0gZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKChGaWVsZEJpbmRpbmcpIHZhcmlhYmxlKSkgeworCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZCgKKwkJCQkJCQkoRmllbGRCaW5kaW5nKSB2YXJpYWJsZSwKKwkJCQkJCQkoTmFtZVJlZmVyZW5jZSkgZmluYWxBc3NpZ25tZW50c1tpXSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29tcGxhaW5lZCA9CisJCQkJCQlmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoKExvY2FsVmFyaWFibGVCaW5kaW5nKSB2YXJpYWJsZSkpIHsKKwkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUluaXRpYWxpemF0aW9uT2ZGaW5hbExvY2FsKAorCQkJCQkJCShMb2NhbFZhcmlhYmxlQmluZGluZykgdmFyaWFibGUsCisJCQkJCQkJKE5hbWVSZWZlcmVuY2UpIGZpbmFsQXNzaWdubWVudHNbaV0pOworCQkJCQl9CisJCQkJfQorCQkJCS8vIGFueSByZWZlcmVuY2UgcmVwb3J0ZWQgYXQgdGhpcyBsZXZlbCBpcyByZW1vdmVkIGZyb20gdGhlIHBhcmVudCBjb250ZXh0IHdoZXJlIGl0IAorCQkJCS8vIGNvdWxkIGFsc28gYmUgcmVwb3J0ZWQgYWdhaW4KKwkJCQlpZiAoY29tcGxhaW5lZCkgeworCQkJCQlGbG93Q29udGV4dCBjb250ZXh0ID0gcGFyZW50OworCQkJCQl3aGlsZSAoY29udGV4dCAhPSBudWxsKSB7CisJCQkJCQljb250ZXh0LnJlbW92ZUZpbmFsQXNzaWdubWVudElmQW55KGZpbmFsQXNzaWdubWVudHNbaV0pOworCQkJCQkJY29udGV4dCA9IGNvbnRleHQucGFyZW50OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIExhYmVsIGNvbnRpbnVlTGFiZWwoKSB7CisJCXJldHVybiBjb250aW51ZUxhYmVsOworCX0KKworCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkxvb3BpbmcgZmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29udGludWFibGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29udGludWVkVG8oKSB7CisJCXJldHVybiBpbml0c09uQ29udGludWUgIT0gRmxvd0luZm8uRGVhZEVuZDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRDb250aW51ZUZyb20oRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJaWYgKGluaXRzT25Db250aW51ZSA9PSBGbG93SW5mby5EZWFkRW5kKSB7CisJCQlpbml0c09uQ29udGludWUgPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0gZWxzZSB7CisJCQkvLyBpZ25vcmUgaWYgbm90IHJlYWxseSByZWFjaGFibGUgKDFGS0VLUlApCisJCQlpZiAoZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpCisJCQkJcmV0dXJuOworCQkJaW5pdHNPbkNvbnRpbnVlLm1lcmdlZFdpdGgoZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworCQl9OworCX0KKworCWJvb2xlYW4gcmVjb3JkRmluYWxBc3NpZ25tZW50KAorCQlWYXJpYWJsZUJpbmRpbmcgYmluZGluZywKKwkJUmVmZXJlbmNlIGZpbmFsQXNzaWdubWVudCkgeworCQkvLyBkbyBub3QgY29uc2lkZXIgdmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGluc2lkZSB0aGlzIGxvb3AKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykgeworCQkJU2NvcGUgc2NvcGUgPSAoKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS5kZWNsYXJpbmdTY29wZTsKKwkJCXdoaWxlICgoc2NvcGUgPSBzY29wZS5wYXJlbnQpICE9IG51bGwpIHsKKwkJCQlpZiAoc2NvcGUgPT0gYXNzb2NpYXRlZFNjb3BlKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKGFzc2lnbkNvdW50ID09IDApIHsKKwkJCWZpbmFsQXNzaWdubWVudHMgPSBuZXcgUmVmZXJlbmNlWzVdOworCQkJZmluYWxWYXJpYWJsZXMgPSBuZXcgVmFyaWFibGVCaW5kaW5nWzVdOworCQl9IGVsc2UgeworCQkJaWYgKGFzc2lnbkNvdW50ID09IGZpbmFsQXNzaWdubWVudHMubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCWZpbmFsQXNzaWdubWVudHMsCisJCQkJCTAsCisJCQkJCShmaW5hbEFzc2lnbm1lbnRzID0gbmV3IFJlZmVyZW5jZVthc3NpZ25Db3VudCAqIDJdKSwKKwkJCQkJMCwKKwkJCQkJYXNzaWduQ291bnQpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlmaW5hbFZhcmlhYmxlcywKKwkJCQkwLAorCQkJCShmaW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbYXNzaWduQ291bnQgKiAyXSksCisJCQkJMCwKKwkJCQlhc3NpZ25Db3VudCk7CisJCX07CisJCWZpbmFsQXNzaWdubWVudHNbYXNzaWduQ291bnRdID0gZmluYWxBc3NpZ25tZW50OworCQlmaW5hbFZhcmlhYmxlc1thc3NpZ25Db3VudCsrXSA9IGJpbmRpbmc7CisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgcmVtb3ZlRmluYWxBc3NpZ25tZW50SWZBbnkoUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGFzc2lnbkNvdW50OyBpKyspIHsKKwkJCWlmIChmaW5hbEFzc2lnbm1lbnRzW2ldID09IHJlZmVyZW5jZSkgeworCQkJCWZpbmFsQXNzaWdubWVudHNbaV0gPSBudWxsOworCQkJCWZpbmFsVmFyaWFibGVzW2ldID0gbnVsbDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvU3dpdGNoRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMTg3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uTGFiZWw7CisKKy8qKgorICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKKyAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgorICovCitwdWJsaWMgY2xhc3MgU3dpdGNoRmxvd0NvbnRleHQgZXh0ZW5kcyBGbG93Q29udGV4dCB7CisJcHVibGljIExhYmVsIGJyZWFrTGFiZWw7CisJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uQnJlYWsgPSBGbG93SW5mby5EZWFkRW5kOworCQorCXB1YmxpYyBTd2l0Y2hGbG93Q29udGV4dCgKKwkJRmxvd0NvbnRleHQgcGFyZW50LAorCQlBc3ROb2RlIGFzc29jaWF0ZWROb2RlLAorCQlMYWJlbCBicmVha0xhYmVsKSB7CisJCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUpOworCQl0aGlzLmJyZWFrTGFiZWwgPSBicmVha0xhYmVsOworCX0KKworCXB1YmxpYyBMYWJlbCBicmVha0xhYmVsKCkgeworCQlyZXR1cm4gYnJlYWtMYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKKwkJcmV0dXJuICJTd2l0Y2ggZmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBib29sZWFuIGlzQnJlYWthYmxlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRCcmVha0Zyb20oRmxvd0luZm8gZmxvd0luZm8pIHsKKwkJaWYgKGluaXRzT25CcmVhayA9PSBGbG93SW5mby5EZWFkRW5kKSB7CisJCQlpbml0c09uQnJlYWsgPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCX0gZWxzZSB7CisJCQkvLyBpZ25vcmUgaWYgbm90IHJlYWxseSByZWFjaGFibGUgKDFGS0VLUlApCisJCQlpZiAoZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpCisJCQkJcmV0dXJuOworCQkJaW5pdHNPbkJyZWFrLm1lcmdlZFdpdGgoZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1VuY29uZGl0aW9uYWxGbG93SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTZjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworCisvKioKKyAqIFJlY29yZCBpbml0aWFsaXphdGlvbiBzdGF0dXMgZHVyaW5nIGRlZmluaXRlIGFzc2lnbm1lbnQgYW5hbHlzaXMKKyAqCisgKiBObyBjYWNoaW5nIG9mIHByZS1hbGxvY2F0ZWQgaW5zdGFuY2VzLgorICovCitwdWJsaWMgY2xhc3MgVW5jb25kaXRpb25hbEZsb3dJbmZvIGV4dGVuZHMgRmxvd0luZm8geworCXB1YmxpYyBsb25nIGRlZmluaXRlSW5pdHM7CisJbG9uZyBwb3RlbnRpYWxJbml0czsKKwlwdWJsaWMgbG9uZyBleHRyYURlZmluaXRlSW5pdHNbXTsKKwlsb25nIGV4dHJhUG90ZW50aWFsSW5pdHNbXTsKKwlwdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGU7CisJcHVibGljIGludCBtYXhGaWVsZENvdW50OworCQorCS8vIENvbnN0YW50cworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJpdENhY2hlU2l6ZSA9IDY0OyAvLyA2NCBiaXRzIGluIGEgbG9uZy4KK1VuY29uZGl0aW9uYWxGbG93SW5mbygpIHsKK30KK3B1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWRkSW5pdGlhbGl6YXRpb25zRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cykgeworCisJLy8gdW5pb25zIG9mIGJvdGggc2V0cyBvZiBpbml0aWFsaXphdGlvbiAtIHVzZWQgZm9yIHRyeS9maW5hbGx5CisJaWYgKHRoaXMgPT0gRGVhZEVuZCkKKwkJcmV0dXJuIHRoaXM7CisJaWYgKG90aGVySW5pdHMgPT0gRGVhZEVuZCkKKwkJcmV0dXJuIHRoaXM7CisJCQorCS8vIHVuaW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLCAKKwlkZWZpbml0ZUluaXRzIHw9IG90aGVySW5pdHMuZGVmaW5pdGVJbml0czsKKwkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcworCXBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisKKwkvLyB0cmVhdGluZyBleHRyYSBzdG9yYWdlCisJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCQkvLyBib3RoIHNpZGVzIGhhdmUgZXh0cmEgc3RvcmFnZQorCQkJaW50IGkgPSAwLCBsZW5ndGgsIG90aGVyTGVuZ3RoOworCQkJaWYgKChsZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSA8IChvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKKwkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQgKGNvdWxkIG1heWJlIHJldXNlIG90aGVySW5pdHMgZXh0cmEgc3RvcmFnZT8pCisJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCXdoaWxlIChpIDwgbGVuZ3RoKSB7CisJCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0c1tpXTsKKwkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKKwkJCQl9CisJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCisJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHNbaV07CisJCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJfQorCQkJCXdoaWxlIChpIDwgbGVuZ3RoKQorCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaSsrXSA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBubyBleHRyYSBzdG9yYWdlIG9uIG90aGVySW5pdHMKKwkJfQorCX0gZWxzZQorCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJLy8gbm8gc3RvcmFnZSBoZXJlLCBidXQgb3RoZXIgaGFzIGV4dHJhIHN0b3JhZ2UuCisJCQlpbnQgb3RoZXJMZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLCAwLCAoZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOwkJCQorCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHMsIDAsIChleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOworCQl9CisJcmV0dXJuIHRoaXM7Cit9CitwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpIHsKKworCS8vIHVuaW9ucyBvZiBib3RoIHNldHMgb2YgaW5pdGlhbGl6YXRpb24gLSB1c2VkIGZvciB0cnkvZmluYWxseQorCWlmICh0aGlzID09IERlYWRFbmQpeworCQlyZXR1cm4gdGhpczsKKwl9CisJaWYgKG90aGVySW5pdHMgPT0gRGVhZEVuZCl7CisJCXJldHVybiB0aGlzOworCX0KKwkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcworCXBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisKKwkvLyB0cmVhdGluZyBleHRyYSBzdG9yYWdlCisJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCQkvLyBib3RoIHNpZGVzIGhhdmUgZXh0cmEgc3RvcmFnZQorCQkJaW50IGkgPSAwLCBsZW5ndGgsIG90aGVyTGVuZ3RoOworCQkJaWYgKChsZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSA8IChvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKKwkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQgKGNvdWxkIG1heWJlIHJldXNlIG90aGVySW5pdHMgZXh0cmEgc3RvcmFnZT8pCisJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCXdoaWxlIChpIDwgbGVuZ3RoKSB7CisJCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJfQorCQkJCXdoaWxlIChpIDwgb3RoZXJMZW5ndGgpIHsKKwkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSA9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIGxvbmdlcgorCQkJCXdoaWxlIChpIDwgb3RoZXJMZW5ndGgpIHsKKwkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKKwkJCS8vIG5vIHN0b3JhZ2UgaGVyZSwgYnV0IG90aGVyIGhhcyBleHRyYSBzdG9yYWdlLgorCQkJaW50IG90aGVyTGVuZ3RoOworCQkJZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGhdOwkJCQorCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHMsIDAsIChleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOworCQl9CisJcmV0dXJuIHRoaXM7Cit9CitwdWJsaWMgYm9vbGVhbiBjb21wbGFpbklmVW5yZWFjaGFibGUoU3RhdGVtZW50IHN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCS8vIFJlcG9ydCBhbiBlcnJvciBpZiBuZWNlc3NhcnkKKworCWJvb2xlYW4gaXNEZWFkRW5kOworCWlmICgoaXNEZWFkRW5kID0gKHRoaXMgPT0gRGVhZEVuZCkpIHx8IGlzRmFrZVJlYWNoYWJsZSkgeworCQlzdGF0ZW1lbnQuYml0cyAmPSB+QXN0Tm9kZS5Jc1JlYWNoYWJsZU1BU0s7CisJCS8qIEVYVFJBIFJFRkVSRU5DRSBSRUNPUkRJTkcKKwkJc3RhdGVtZW50LnJlY29yZFVucmVhY2hhYmxlUmVmZXJlbmNlcyhzY29wZS5yZWZlcmVuY2VUeXBlKCkpOyAvLyBzY29wZXMgY2Fubm90IGhhdmUgYW4gZW5jbG9zaW5nTWV0aG9kIHNsb3Qgc2luY2UgdGhlcmUgYXJlIGNsYXNzIHNjb3BlcworCQkqLworCQlpZiAoaXNEZWFkRW5kKQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5yZWFjaGFibGVDb2RlKHN0YXRlbWVudCk7CisJCXJldHVybiBpc0RlYWRFbmQ7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQW5zd2VycyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UKKyAqLworcHVibGljIEZsb3dJbmZvIGNvcHkoKSB7CisJLy8gZG8gbm90IGNsb25lIHRoZSBEZWFkRW5kCisJaWYgKHRoaXMgPT0gRGVhZEVuZCkKKwkJcmV0dXJuIHRoaXM7CisKKwkvLyBsb29rIGZvciBhbiB1bnVzZWQgcHJlYWxsb2NhdGVkIG9iamVjdAorCVVuY29uZGl0aW9uYWxGbG93SW5mbyBjb3B5ID0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mbygpOworCisJLy8gY29weSBzbG90cworCWNvcHkuZGVmaW5pdGVJbml0cyA9IGRlZmluaXRlSW5pdHM7CisJY29weS5wb3RlbnRpYWxJbml0cyA9IHBvdGVudGlhbEluaXRzOworCWNvcHkuaXNGYWtlUmVhY2hhYmxlID0gaXNGYWtlUmVhY2hhYmxlOworCWNvcHkubWF4RmllbGRDb3VudCA9IG1heEZpZWxkQ291bnQ7CisJCisJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCWludCBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFEZWZpbml0ZUluaXRzLCAwLCAoY29weS5leHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1sgKGxlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpXSksIDAsIGxlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGNvcHkuZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW2xlbmd0aF0pLCAwLCBsZW5ndGgpOworCX07CisJcmV0dXJuIGNvcHk7Cit9CitwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UoKSB7CisJcmV0dXJuIHRoaXM7Cit9CitwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSgpIHsKKwlyZXR1cm4gdGhpczsKK30KKy8qKgorICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbi4KKyAqIEl0IGRlYWxzIHdpdGggdGhlIGR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIEluaXRpYWxpemF0aW9uSW5mbzI6CisgKiBiaXRzIGZvciB0aGUgZmlyc3QgNjQgZW50cmllcywgdGhlbiBhbiBhcnJheSBvZiBib29sZWFucy4KKyAqLworZmluYWwgcHJpdmF0ZSBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKGludCBwb3NpdGlvbikgeworCS8vIERlcGVuZGFudCBvZiBDb2RlU3RyZWFtLmlzRGVmaW5pdGVseUFzc2lnbmVkKC4uKQorCS8vIGlkIGlzIHplcm8tYmFzZWQKKwlpZiAocG9zaXRpb24gPCBCaXRDYWNoZVNpemUpIHsKKwkJcmV0dXJuIChkZWZpbml0ZUluaXRzICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMDsgLy8gdXNlIGJpdHMKKwl9CisJLy8gdXNlIGV4dHJhIHZlY3RvcgorCWlmIChleHRyYURlZmluaXRlSW5pdHMgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOyAvLyBpZiB2ZWN0b3Igbm90IHlldCBhbGxvY2F0ZWQsIHRoZW4gbm90IGluaXRpYWxpemVkCisJaW50IHZlY3RvckluZGV4OworCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkKKwkJcmV0dXJuIGZhbHNlOyAvLyBpZiBub3QgZW5vdWdoIHJvb20gaW4gdmVjdG9yLCB0aGVuIG5vdCBpbml0aWFsaXplZCAKKwlyZXR1cm4gKChleHRyYURlZmluaXRlSW5pdHNbdmVjdG9ySW5kZXhdKSAmICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSkgIT0gMDsKK30KKy8qKgorICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisgKi8KK2ZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgeworCS8vIERlcGVuZGFudCBvZiBDb2RlU3RyZWFtLmlzRGVmaW5pdGVseUFzc2lnbmVkKC4uKQorCS8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBsYWluIGluIHVucmVhY2hhYmxlIGNvZGUKKwlpZiAoKHRoaXMgPT0gRGVhZEVuZCkgfHwgKHRoaXMuaXNGYWtlUmVhY2hhYmxlKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkLmlkKTsgCit9CisvKioKKyAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGxvY2FsLgorICovCitmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCS8vIERlcGVuZGFudCBvZiBDb2RlU3RyZWFtLmlzRGVmaW5pdGVseUFzc2lnbmVkKC4uKQorCS8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBsYWluIGluIHVucmVhY2hhYmxlIGNvZGUKKwlpZiAoKHRoaXMgPT0gRGVhZEVuZCkgfHwgKHRoaXMuaXNGYWtlUmVhY2hhYmxlKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGxvY2FsLmlzQXJndW1lbnQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBpc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbC5pZCArIG1heEZpZWxkQ291bnQpOworfQorcHVibGljIGJvb2xlYW4gaXNGYWtlUmVhY2hhYmxlKCkgeworCXJldHVybiBpc0Zha2VSZWFjaGFibGU7Cit9CisvKioKKyAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uLgorICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMzoKKyAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgorICovCitmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKGludCBwb3NpdGlvbikgeworCS8vIGlkIGlzIHplcm8tYmFzZWQKKwlpZiAocG9zaXRpb24gPCBCaXRDYWNoZVNpemUpIHsKKwkJLy8gdXNlIGJpdHMKKwkJcmV0dXJuIChwb3RlbnRpYWxJbml0cyAmICgxTCA8PCBwb3NpdGlvbikpICE9IDA7CisJfQorCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwlpZiAoZXh0cmFQb3RlbnRpYWxJbml0cyA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKKwlpbnQgdmVjdG9ySW5kZXg7CisJaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSBleHRyYVBvdGVudGlhbEluaXRzLmxlbmd0aCkKKwkJcmV0dXJuIGZhbHNlOyAvLyBpZiBub3QgZW5vdWdoIHJvb20gaW4gdmVjdG9yLCB0aGVuIG5vdCBpbml0aWFsaXplZCAKKwlyZXR1cm4gKChleHRyYVBvdGVudGlhbEluaXRzW3ZlY3RvckluZGV4XSkgJiAoMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSkpICE9IDA7Cit9CisvKioKKyAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGZpZWxkLgorICovCitmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQorCWlmICgodGhpcyA9PSBEZWFkRW5kKSB8fCAodGhpcy5pc0Zha2VSZWFjaGFibGUpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChmaWVsZC5pZCk7IAorfQorLyoqCisgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuCisgKi8KK2ZpbmFsIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCS8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBsYWluIGluIHVucmVhY2hhYmxlIGNvZGUKKwlpZiAoKHRoaXMgPT0gRGVhZEVuZCkgfHwgKHRoaXMuaXNGYWtlUmVhY2hhYmxlKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChsb2NhbC5pc0FyZ3VtZW50KSB7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKGxvY2FsLmlkICsgbWF4RmllbGRDb3VudCk7Cit9CisvKioKKyAqIFJlY29yZCBhIGRlZmluaXRlIGFzc2lnbm1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbi4KKyAqIEl0IGRlYWxzIHdpdGggdGhlIGR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIEluaXRpYWxpemF0aW9uSW5mbzI6CisgKiBiaXRzIGZvciB0aGUgZmlyc3QgNjQgZW50cmllcywgdGhlbiBhbiBhcnJheSBvZiBib29sZWFucy4KKyAqLworZmluYWwgcHJpdmF0ZSB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChpbnQgcG9zaXRpb24pIHsKKwlpZiAodGhpcyAhPSBEZWFkRW5kKSB7CisKKwkJLy8gcG9zaXRpb24gaXMgemVyby1iYXNlZAorCQlpZiAocG9zaXRpb24gPCBCaXRDYWNoZVNpemUpIHsKKwkJCS8vIHVzZSBiaXRzCisJCQlsb25nIG1hc2s7CisJCQlkZWZpbml0ZUluaXRzIHw9IChtYXNrID0gMUwgPDwgcG9zaXRpb24pOworCQkJcG90ZW50aWFsSW5pdHMgfD0gbWFzazsKKwkJfSBlbHNlIHsKKwkJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwkJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworCQkJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyA9PSBudWxsKSB7CisJCQkJaW50IGxlbmd0aDsKKwkJCQlleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tsZW5ndGggPSB2ZWN0b3JJbmRleCArIDFdOworCQkJCWV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworCQkJCWlmICh2ZWN0b3JJbmRleCA+PSAob2xkTGVuZ3RoID0gZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1t2ZWN0b3JJbmRleCArIDFdKSwgMCwgb2xkTGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLCBvbGRMZW5ndGgpOworCQkJCX0KKwkJCX0KKwkJCWxvbmcgbWFzazsKKwkJCWV4dHJhRGVmaW5pdGVJbml0c1t2ZWN0b3JJbmRleF0gfD0gKG1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKTsKKwkJCWV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdIHw9IG1hc2s7CisJCX0KKwl9Cit9CisvKioKKyAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorICovCitwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJaWYgKHRoaXMgIT0gRGVhZEVuZCkKKwkJbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkLmlkKTsKK30KKy8qKgorICogUmVjb3JkIGEgbG9jYWwgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCisgKi8KK3B1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCWlmICh0aGlzICE9IERlYWRFbmQpCisJCW1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbC5pZCArIG1heEZpZWxkQ291bnQpOworfQorLyoqCisgKiBDbGVhciBpbml0aWFsaXphdGlvbiBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIHBvc2l0aW9uLgorICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKKyAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgorICovCitmaW5hbCBwcml2YXRlIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGludCBwb3NpdGlvbikgeworCWlmICh0aGlzICE9IERlYWRFbmQpIHsKKworCQkvLyBwb3NpdGlvbiBpcyB6ZXJvLWJhc2VkCisJCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgeworCQkJLy8gdXNlIGJpdHMKKwkJCWxvbmcgbWFzazsKKwkJCWRlZmluaXRlSW5pdHMgJj0gfihtYXNrID0gMUwgPDwgcG9zaXRpb24pOworCQkJcG90ZW50aWFsSW5pdHMgJj0gfm1hc2s7CisJCX0gZWxzZSB7CisJCQkvLyB1c2UgZXh0cmEgdmVjdG9yCisJCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKKwkJCWlmIChleHRyYURlZmluaXRlSW5pdHMgPT0gbnVsbCkgeworCQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbywgaXQgd2FzIG5vdCB5ZXQgc2V0IAorCQkJfSBlbHNlIHsKKwkJCQkvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworCQkJCWlmICh2ZWN0b3JJbmRleCA+PSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSB7CisJCQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbywgaXQgd2FzIG5vdCB5ZXQgc2V0IAorCQkJCX0KKwkJCX0KKwkJCWxvbmcgbWFzazsKKwkJCWV4dHJhRGVmaW5pdGVJbml0c1t2ZWN0b3JJbmRleF0gJj0gfihtYXNrID0gMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7CisJCQlleHRyYVBvdGVudGlhbEluaXRzW3ZlY3RvckluZGV4XSAmPSB+bWFzazsKKwkJfQorCX0KK30KKy8qKgorICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgZmllbGQKKyAqLworcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgeworCWlmICh0aGlzICE9IERlYWRFbmQpCisJCW1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChmaWVsZC5pZCk7Cit9CisvKioKKyAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGxvY2FsIHZhcmlhYmxlCisgKi8KKworcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJaWYgKHRoaXMgIT0gRGVhZEVuZCkKKwkJbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGxvY2FsLmlkICsgbWF4RmllbGRDb3VudCk7Cit9CitwdWJsaWMgRmxvd0luZm8gbWFya0FzRmFrZVJlYWNoYWJsZShib29sZWFuIGlzRmFrZVJlYWNoYWJsZSkgeworCXRoaXMuaXNGYWtlUmVhY2hhYmxlID0gaXNGYWtlUmVhY2hhYmxlOworCXJldHVybiB0aGlzOworfQorcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7CisJLy8gdXBkYXRlcyB0aGUgcmVjZWl2ZXIgd2l0aDoKKwkvLyAtIGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCisJLy8gLSB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcworCisJaWYgKHRoaXMgPT0gRGVhZEVuZCkKKwkJcmV0dXJuIG90aGVySW5pdHM7CisJaWYgKG90aGVySW5pdHMgPT0gRGVhZEVuZCkKKwkJcmV0dXJuIHRoaXM7CisKKwkvLyBpZiBvbmUgYnJhbmNoIGlzIG5vdCBmYWtlIHJlYWNoYWJsZSwgdGhlbiB0aGUgbWVyZ2VkIG9uZSBpcyByZWFjaGFibGUKKwlpZiAoIW90aGVySW5pdHMuaXNGYWtlUmVhY2hhYmxlKCkpCisJCW1hcmtBc0Zha2VSZWFjaGFibGUoZmFsc2UpOworCisJLy8gaW50ZXJzZWN0aW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLCAKKwlkZWZpbml0ZUluaXRzICY9IG90aGVySW5pdHMuZGVmaW5pdGVJbml0czsKKwkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcworCXBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisKKwkvLyB0cmVhdGluZyBleHRyYSBzdG9yYWdlCisJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCQkvLyBib3RoIHNpZGVzIGhhdmUgZXh0cmEgc3RvcmFnZQorCQkJaW50IGkgPSAwLCBsZW5ndGgsIG90aGVyTGVuZ3RoOworCQkJaWYgKChsZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSA8IChvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKKwkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQgKGNvdWxkIG1heWJlIHJldXNlIG90aGVySW5pdHMgZXh0cmEgc3RvcmFnZT8pCisJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCXdoaWxlIChpIDwgbGVuZ3RoKSB7CisJCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpXSAmPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0c1tpXTsKKwkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKKwkJCQl9CisJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCisJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaV0gJj0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHNbaV07CisJCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJfQorCQkJCXdoaWxlIChpIDwgbGVuZ3RoKQorCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaSsrXSA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBubyBleHRyYSBzdG9yYWdlIG9uIG90aGVySW5pdHMKKwkJCWludCBpID0gMCwgbGVuZ3RoID0gZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aDsKKwkJCXdoaWxlIChpIDwgbGVuZ3RoKQorCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpKytdID0gMDsKKwkJfQorCX0gZWxzZQorCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJLy8gbm8gc3RvcmFnZSBoZXJlLCBidXQgb3RoZXIgaGFzIGV4dHJhIHN0b3JhZ2UuCisJCQlpbnQgb3RoZXJMZW5ndGg7CisJCQlleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBvdGhlckxlbmd0aCk7CisJCX0KKwlyZXR1cm4gdGhpczsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIHRvdGFsIG51bWJlciBvZiBmaWVsZHMgaW4gZW5jbG9zaW5nIHR5cGVzIG9mIGEgZ2l2ZW4gdHlwZQorICovCitzdGF0aWMgaW50IG51bWJlck9mRW5jbG9zaW5nRmllbGRzKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSl7CisJaW50IGNvdW50ID0gMDsKKwl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJd2hpbGUodHlwZSAhPSBudWxsKSB7CisJCWNvdW50ICs9IHR5cGUuZmllbGRDb3VudCgpOworCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKwlpZiAodGhpcyA9PSBEZWFkRW5kKXsKKwkJcmV0dXJuICJGbG93SW5mby5EZWFkRW5kIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gIkZsb3dJbmZvPGRlZjogIisgZGVmaW5pdGVJbml0cyArIiwgcG90OiAiICsgcG90ZW50aWFsSW5pdHMgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCit9CitwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHVuY29uZGl0aW9uYWxJbml0cygpIHsKKwkvLyBhbHNvIHNlZSBjb25kaXRpb25hbCBpbml0cywgd2hlcmUgaXQgcmVxdWVzdHMgdGhlbSB0byBtZXJnZQorCXJldHVybiB0aGlzOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWViNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CisKK3B1YmxpYyBjbGFzcyBCb29sZWFuQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CisJYm9vbGVhbiB2YWx1ZTsKKworCQorcHVibGljIEJvb2xlYW5Db25zdGFudChib29sZWFuIHZhbHVlKSB7CisJdGhpcy52YWx1ZSA9IHZhbHVlOworfQorcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgeworCXJldHVybiAoYm9vbGVhbikgdmFsdWU7Cit9CitwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCS8vc3BlYyAxNS4xNy4xMQorCQorCVN0cmluZyBzID0gbmV3IEJvb2xlYW4odmFsdWUpLnRvU3RyaW5nKCkgOworCWlmIChzID09IG51bGwpCisJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCXJldHVybiBzOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCisJcmV0dXJuICIoYm9vbGVhbikiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQKK3B1YmxpYyBpbnQgdHlwZUlEKCkgeworCXJldHVybiBUX2Jvb2xlYW47Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0J5dGVDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjUyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKKworcHVibGljIGNsYXNzIEJ5dGVDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKKwlieXRlIHZhbHVlOworcHVibGljIEJ5dGVDb25zdGFudChieXRlIHZhbHVlKSB7CisJdGhpcy52YWx1ZSA9IHZhbHVlOworfQorcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgeworCXJldHVybiAoYnl0ZSkgdmFsdWU7Cit9CitwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7CisJcmV0dXJuIChjaGFyKSB2YWx1ZTsKK30KK3B1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisJcmV0dXJuIChkb3VibGUpIHZhbHVlOworfQorcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CisJcmV0dXJuIChmbG9hdCkgdmFsdWU7Cit9CitwdWJsaWMgaW50IGludFZhbHVlKCkgeworCXJldHVybiAoaW50KSB2YWx1ZTsKK30KK3B1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKKwlyZXR1cm4gKGxvbmcpIHZhbHVlOworfQorcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CisJcmV0dXJuIChzaG9ydCkgdmFsdWU7Cit9CitwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCS8vc3BlYyAxNS4xNy4xMQorCQorCVN0cmluZyBzID0gbmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkgOworCWlmIChzID09IG51bGwpCisJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCXJldHVybiBzOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCisJcmV0dXJuICIoYnl0ZSkiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQKK3B1YmxpYyBpbnQgdHlwZUlEKCkgeworCXJldHVybiBUX2J5dGU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NoYXJDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWUxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKKworcHVibGljIGNsYXNzIENoYXJDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKKwljaGFyIHZhbHVlOworcHVibGljIENoYXJDb25zdGFudChjaGFyIHZhbHVlKSB7CisJdGhpcy52YWx1ZSA9IHZhbHVlOworfQorcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgeworCXJldHVybiAoYnl0ZSkgdmFsdWU7Cit9CitwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7CisJcmV0dXJuIChjaGFyKSB2YWx1ZTsKK30KK3B1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisJcmV0dXJuIChkb3VibGUpIHZhbHVlOworfQorcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CisJcmV0dXJuIChmbG9hdCkgdmFsdWU7Cit9CitwdWJsaWMgaW50IGludFZhbHVlKCkgeworCXJldHVybiAoaW50KSB2YWx1ZTsKK30KK3B1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKKwlyZXR1cm4gKGxvbmcpIHZhbHVlOworfQorcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CisJcmV0dXJuIChzaG9ydCkgdmFsdWU7Cit9CitwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCS8vc3BlYyAxNS4xNy4xMQorCQorCVN0cmluZyBzID0gbmV3IENoYXJhY3Rlcih2YWx1ZSkudG9TdHJpbmcoKSA7CisJaWYgKHMgPT0gbnVsbCkKKwkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJcmV0dXJuIHM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlyZXR1cm4gIihjaGFyKSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJAorcHVibGljIGludCB0eXBlSUQoKSB7CisJcmV0dXJuIFRfY2hhcjsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29tcGlsZXJPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwNmNmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbXBpbGVyT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOworCisKK3B1YmxpYyBjbGFzcyBDb21waWxlck9wdGlvbnMgaW1wbGVtZW50cyBQcm9ibGVtUmVhc29ucywgUHJvYmxlbVNldmVyaXRpZXMgeworCQorCS8qKgorCSAqIE9wdGlvbiBJRHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NvdXJjZUZpbGVBdHRyaWJ1dGUgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUHJlc2VydmVVbnVzZWRMb2NhbCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnJlYWNoYWJsZUNvZGUgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEludmFsaWRJbXBvcnQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSW1wb3J0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnREZXByZWNhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jayI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkTG9jYWwgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1NvdXJjZSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2UiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1RhcmdldFBsYXRmb3JtID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Db21wbGlhbmNlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0VuY29kaW5nID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9NYXhQcm9ibGVtUGVyVW5pdCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCI7IC8vJE5PTi1OTFMtMSQKKworCS8qIHNob3VsZCBzdXJmYWNlID8/PyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5jb25zdHJ1Y3RvckFjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURSA9ICJnZW5lcmF0ZSI7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX05PVF9HRU5FUkFURSA9ICJkbyBub3QgZ2VuZXJhdGUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkUgPSAicHJlc2VydmUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkVfT1VUID0gIm9wdGltaXplIG91dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfMSA9ICIxLjEiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl8xXzIgPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV8zID0gIjEuMyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfNCA9ICIxLjQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiZXJyb3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJ3YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRSA9ICJpZ25vcmUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQml0IG1hc2sgZm9yIGNvbmZpZ3VyYWJsZSBwcm9ibGVtcyAoZXJyb3Ivd2FybmluZyB0aHJlc2hvbGQpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5yZWFjaGFibGVDb2RlID0gMHgxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW1wb3J0UHJvYmxlbSA9IDB4NDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUgPSAweDEwMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kID0gMHgyMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVzaW5nRGVwcmVjYXRlZEFQSSA9IDB4NDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNYXNrZWRDYXRjaEJsb2NrID0gMHg4MDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZExvY2FsVmFyaWFibGUgPSAweDEwMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVudXNlZEFyZ3VtZW50ID0gMHgyMDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiA9IDB4NDAwMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjZXNzRW11bGF0aW9uID0gMHg4MDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb25FeHRlcm5hbGl6ZWRTdHJpbmcgPSAweDEwMDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgPSAweDIwMDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnVzZWRJbXBvcnQgPSAweDQwMDAwMDsKKwkJCisJLy8gRGVmYXVsdCBzZXZlcml0eSBsZXZlbCBmb3IgaGFuZGxlcnMKKwlwdWJsaWMgaW50IGVycm9yVGhyZXNob2xkID0gVW5yZWFjaGFibGVDb2RlIHwgSW1wb3J0UHJvYmxlbTsKKwlwdWJsaWMgaW50IHdhcm5pbmdUaHJlc2hvbGQgPSAKKwkJTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSB8IE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZAorCQl8IFVzaW5nRGVwcmVjYXRlZEFQSSB8IE1hc2tlZENhdGNoQmxvY2sgCisJCXwgQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyIHwgTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb247CisKKwkvLyBEZWJ1ZyBhdHRyaWJ1dGVzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU291cmNlID0gMTsgLy8gU291cmNlRmlsZUF0dHJpYnV0ZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExpbmVzID0gMjsgLy8gTGluZU51bWJlckF0dHJpYnV0ZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZhcnMgPSA0OyAvLyBMb2NhbFZhcmlhYmxlVGFibGVBdHRyaWJ1dGUKKworCS8vIEJ5IGRlZmF1bHQgb25seSBsaW5lcyBhbmQgc291cmNlIGF0dHJpYnV0ZXMgYXJlIGdlbmVyYXRlZC4KKwlwdWJsaWMgaW50IHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgPSBMaW5lcyB8IFNvdXJjZTsKKworCisJLy8gSkRLIDEuMSwgMS4yLCAxLjMgb3IgMS40CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkRLMV8xID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKREsxXzIgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpESzFfMyA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkRLMV80ID0gMzsKKwkKKwlwdWJsaWMgaW50IHRhcmdldEpESyA9IEpESzFfMTsgLy8gZGVmYXVsdCBnZW5lcmF0ZXMgZm9yIEpWTTEuMQorCXB1YmxpYyBpbnQgY29tcGxpYW5jZUxldmVsID0gSkRLMV8zOyAvLyBieSBkZWZhdWx0IGJlIGNvbXBsaWFudCB3aXRoIDEuMworCisJLy8gdG9nZ2xlIHByaXZhdGUgYWNjZXNzIGVtdWxhdGlvbiBmb3IgMS4yIChjb25zdHIuIGFjY2Vzc29yIGhhcyBleHRyYSBhcmcgb24gY29uc3RydWN0b3IpIG9yIDEuMyAobWFrZSBwcml2YXRlIGNvbnN0cnVjdG9yIGRlZmF1bHQgYWNjZXNzIHdoZW4gYWNjZXNzIG5lZWRlZCkKKwlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0NoYW5naW5nVmlzaWJpbGl0eSA9IGZhbHNlOyAvLyBieSBkZWZhdWx0LCBmb2xsb3dzIDEuMgorCisJLy8gMS40IGZlYXR1cmUKKwlwdWJsaWMgYm9vbGVhbiBhc3NlcnRNb2RlID0gZmFsc2U7IC8vMS4zIGJlaGF2aW9yIGJ5IGRlZmF1bHQKKwkKKwkvLyBzb3VyY2UgZW5jb2RpbmcgZm9ybWF0CisJcHVibGljIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcgPSBudWxsOyAvLyB3aWxsIHVzZSB0aGUgcGxhdGZvcm0gZGVmYXVsdCBlbmNvZGluZworCQorCS8vIHByaW50IHdoYXQgdW5pdCBpcyBiZWluZyBwcm9jZXNzZWQKKwlwdWJsaWMgYm9vbGVhbiB2ZXJib3NlID0gQ29tcGlsZXIuREVCVUc7CisKKwkvLyBpbmRpY2F0ZXMgaWYgcmVmZXJlbmNlIGluZm8gaXMgZGVzaXJlZAorCXB1YmxpYyBib29sZWFuIHByb2R1Y2VSZWZlcmVuY2VJbmZvID0gdHJ1ZTsKKworCS8vIGluZGljYXRlcyBpZiB1bnVzZWQvb3B0aW1pemFibGUgbG9jYWwgdmFyaWFibGVzIG5lZWQgdG8gYmUgcHJlc2VydmVkIChkZWJ1Z2dpbmcgcHVycG9zZSkKKwlwdWJsaWMgYm9vbGVhbiBwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzID0gZmFsc2U7CisKKwkvLyBpbmRpY2F0ZXMgd2hldGhlciBsaXRlcmFsIGV4cHJlc3Npb25zIGFyZSBpbmxpbmVkIGF0IHBhcnNlLXRpbWUgb3Igbm90CisJcHVibGljIGJvb2xlYW4gcGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cyA9IHRydWU7CisKKwkvLyBleGNlcHRpb24gcmFpc2VkIGZvciB1bnJlc29sdmVkIGNvbXBpbGUgZXJyb3JzCisJcHVibGljIFN0cmluZyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvciA9ICJqYXZhLmxhbmcuRXJyb3IiOyAvLyROT04tTkxTLTEkCisKKwkvLyBtYXggcHJvYmxlbXMgcGVyIGNvbXBpbGF0aW9uIHVuaXQKKwlwdWJsaWMgaW50IG1heFByb2JsZW1zUGVyVW5pdCA9IDEwMDsgLy8gbm8gbW9yZSB0aGFuIDEwMCBwcm9ibGVtcyBwZXIgZGVmYXVsdAorCQorCS8qKiAKKwkgKiBJbml0aWFsaXppbmcgdGhlIGNvbXBpbGVyIG9wdGlvbnMgd2l0aCBkZWZhdWx0cworCSAqLworCXB1YmxpYyBDb21waWxlck9wdGlvbnMoKXsKKwl9CisKKwkvKiogCisJICogSW5pdGlhbGl6aW5nIHRoZSBjb21waWxlciBvcHRpb25zIHdpdGggZXh0ZXJuYWwgc2V0dGluZ3MKKwkgKi8KKwlwdWJsaWMgQ29tcGlsZXJPcHRpb25zKE1hcCBzZXR0aW5ncyl7CisKKwkJaWYgKHNldHRpbmdzID09IG51bGwpIHJldHVybjsKKwkJCisJCS8vIGZpbHRlciBvcHRpb25zIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBjb21waWxlciBjb21wb25lbnQKKwkJT2JqZWN0W10gZW50cmllcyA9IHNldHRpbmdzLmVudHJ5U2V0KCkudG9BcnJheSgpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW50cmllcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXNbaV07CisJCQlpZiAoIShlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFN0cmluZykpIGNvbnRpbnVlOworCQkJaWYgKCEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpIGNvbnRpbnVlOworCQkJU3RyaW5nIG9wdGlvbklEID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgb3B0aW9uVmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCisJCQkvLyBMb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoR0VORVJBVEUpKSB7CisJCQkJCXRoaXMucHJvZHVjZURlYnVnQXR0cmlidXRlcyB8PSBWYXJzOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKERPX05PVF9HRU5FUkFURSkpeworCQkJCQl0aGlzLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJj0gflZhcnM7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAgCisJCQkvLyBMaW5lIG51bWJlciBhdHRyaWJ1dGUJCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUpKSB7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhHRU5FUkFURSkpIHsKKwkJCQkJdGhpcy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzIHw9IExpbmVzOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKERPX05PVF9HRU5FUkFURSkpIHsKKwkJCQkJdGhpcy5wcm9kdWNlRGVidWdBdHRyaWJ1dGVzICY9IH5MaW5lczsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gU291cmNlIGZpbGUgYXR0cmlidXRlCQorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlKSkgeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoR0VORVJBVEUpKSB7CisJCQkJCXRoaXMucHJvZHVjZURlYnVnQXR0cmlidXRlcyB8PSBTb3VyY2U7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRE9fTk9UX0dFTkVSQVRFKSkgeworCQkJCQl0aGlzLnByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJj0gflNvdXJjZTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUHJlc2VydmUgdW51c2VkIGxvY2FsCQorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9QcmVzZXJ2ZVVudXNlZExvY2FsKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhQUkVTRVJWRSkpIHsKKwkJCQkJdGhpcy5wcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhPUFRJTUlaRV9PVVQpKSB7CisJCQkJCXRoaXMucHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcyA9IGZhbHNlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBSZXBvcnQgdW5yZWFjaGFibGUgY29kZQkJCQkKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0VW5yZWFjaGFibGVDb2RlKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBVbnJlYWNoYWJsZUNvZGU7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+VW5yZWFjaGFibGVDb2RlOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVucmVhY2hhYmxlQ29kZTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkIHw9IFVucmVhY2hhYmxlQ29kZTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhJR05PUkUpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVucmVhY2hhYmxlQ29kZTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnJlYWNoYWJsZUNvZGU7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBpbnZhbGlkIGltcG9ydAkKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0SW52YWxpZEltcG9ydCkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgfD0gSW1wb3J0UHJvYmxlbTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5JbXBvcnRQcm9ibGVtOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gfkltcG9ydFByb2JsZW07CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCB8PSBJbXBvcnRQcm9ibGVtOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+SW1wb3J0UHJvYmxlbTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5JbXBvcnRQcm9ibGVtOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBEZWZpbmUgdGhlIHRhcmdldCBKREsgdGFnIGZvciAuY2xhc3NmaWxlcworCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9UYXJnZXRQbGF0Zm9ybSkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzEpKSB7CisJCQkJCXRoaXMudGFyZ2V0SkRLID0gSkRLMV8xOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFZFUlNJT05fMV8yKSkgeworCQkJCQl0aGlzLnRhcmdldEpESyA9IEpESzFfMjsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhWRVJTSU9OXzFfMykpIHsKKwkJCQkJdGhpcy50YXJnZXRKREsgPSBKREsxXzM7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzQpKSB7CisJCQkJCXRoaXMudGFyZ2V0SkRLID0gSkRLMV80OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBEZWZpbmUgdGhlIEpESyBjb21wbGlhbmNlIGxldmVsCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0NvbXBsaWFuY2UpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFZFUlNJT05fMV8xKSkgeworCQkJCQl0aGlzLmNvbXBsaWFuY2VMZXZlbCA9IEpESzFfMTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhWRVJTSU9OXzFfMikpIHsKKwkJCQkJdGhpcy5jb21wbGlhbmNlTGV2ZWwgPSBKREsxXzI7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzMpKSB7CisJCQkJCXRoaXMuY29tcGxpYW5jZUxldmVsID0gSkRLMV8zOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFZFUlNJT05fMV80KSkgeworCQkJCQl0aGlzLmNvbXBsaWFuY2VMZXZlbCA9IEpESzFfNDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciBhY2Nlc3MgZW11bGF0aW9uIChleHRyYSBhcmcgdnMuIHZpc2liaWxpdHkgY2hhbmdlKQorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFZFUlNJT05fMV8xKSkgeworCQkJCQl0aGlzLmlzUHJpdmF0ZUNvbnN0cnVjdG9yQWNjZXNzQ2hhbmdpbmdWaXNpYmlsaXR5ID0gZmFsc2U7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzIpKSB7CisJCQkJCXRoaXMuaXNQcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDaGFuZ2luZ1Zpc2liaWxpdHkgPSBmYWxzZTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhWRVJTSU9OXzFfMykpIHsKKwkJCQkJdGhpcy5pc1ByaXZhdGVDb25zdHJ1Y3RvckFjY2Vzc0NoYW5naW5nVmlzaWJpbGl0eSA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzQpKSB7CisJCQkJCXRoaXMuaXNQcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDaGFuZ2luZ1Zpc2liaWxpdHkgPSB0cnVlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBSZXBvcnQgbWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZQorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoV0FSTklORykpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkIHw9IE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSUdOT1JFKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5NZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBvdmVycmlkaW5nIHBhY2thZ2UgZGVmYXVsdCBtZXRob2QKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2Q7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+T3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gfk92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkIHw9IE92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhJR05PUkUpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gfk92ZXJyaWRkZW5QYWNrYWdlRGVmYXVsdE1ldGhvZDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5PdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2Q7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBkZXByZWNhdGlvbgorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnREZXByZWNhdGlvbikpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgfD0gVXNpbmdEZXByZWNhdGVkQVBJOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gflVzaW5nRGVwcmVjYXRlZEFQSTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhXQVJOSU5HKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5Vc2luZ0RlcHJlY2F0ZWRBUEk7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCB8PSBVc2luZ0RlcHJlY2F0ZWRBUEk7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSUdOT1JFKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5Vc2luZ0RlcHJlY2F0ZWRBUEk7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+VXNpbmdEZXByZWNhdGVkQVBJOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBSZXBvcnQgaGlkZGVuIGNhdGNoIGJsb2NrCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2spKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IE1hc2tlZENhdGNoQmxvY2s7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+TWFza2VkQ2F0Y2hCbG9jazsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhXQVJOSU5HKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5NYXNrZWRDYXRjaEJsb2NrOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gTWFza2VkQ2F0Y2hCbG9jazsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhJR05PUkUpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gfk1hc2tlZENhdGNoQmxvY2s7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+TWFza2VkQ2F0Y2hCbG9jazsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUmVwb3J0IHVudXNlZCBsb2NhbCB2YXJpYWJsZQorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgfD0gVW51c2VkTG9jYWxWYXJpYWJsZTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRMb2NhbFZhcmlhYmxlOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVudXNlZExvY2FsVmFyaWFibGU7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCB8PSBVbnVzZWRMb2NhbFZhcmlhYmxlOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+VW51c2VkTG9jYWxWYXJpYWJsZTsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRMb2NhbFZhcmlhYmxlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBSZXBvcnQgdW51c2VkIHBhcmFtZXRlcgorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IFVudXNlZEFyZ3VtZW50OworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gflVudXNlZEFyZ3VtZW50OworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVudXNlZEFyZ3VtZW50OworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gVW51c2VkQXJndW1lbnQ7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSUdOT1JFKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5VbnVzZWRBcmd1bWVudDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRBcmd1bWVudDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUmVwb3J0IHVudXNlZCBwYXJhbWV0ZXIKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0KSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBVbnVzZWRJbXBvcnQ7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+VW51c2VkSW1wb3J0OworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVudXNlZEltcG9ydDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkIHw9IFVudXNlZEltcG9ydDsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhJR05PUkUpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVudXNlZEltcG9ydDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRJbXBvcnQ7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBzeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbgorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24pKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IEFjY2Vzc0VtdWxhdGlvbjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5BY2Nlc3NFbXVsYXRpb247CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoV0FSTklORykpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+QWNjZXNzRW11bGF0aW9uOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gQWNjZXNzRW11bGF0aW9uOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+QWNjZXNzRW11bGF0aW9uOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfkFjY2Vzc0VtdWxhdGlvbjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBSZXBvcnQgbm9uLWV4dGVybmFsaXplZCBzdHJpbmcgbGl0ZXJhbHMKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgfD0gTm9uRXh0ZXJuYWxpemVkU3RyaW5nOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfk5vbkV4dGVybmFsaXplZFN0cmluZzsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhXQVJOSU5HKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5Ob25FeHRlcm5hbGl6ZWRTdHJpbmc7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCB8PSBOb25FeHRlcm5hbGl6ZWRTdHJpbmc7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSUdOT1JFKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5Ob25FeHRlcm5hbGl6ZWRTdHJpbmc7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+Tm9uRXh0ZXJuYWxpemVkU3RyaW5nOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIFJlcG9ydCB1c2FnZSBvZiAnYXNzZXJ0JyBhcyBhbiBpZGVudGlmaWVyCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydEFzc2VydElkZW50aWZpZXIpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IEFzc2VydFVzZWRBc0FuSWRlbnRpZmllcjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5Bc3NlcnRVc2VkQXNBbklkZW50aWZpZXI7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoV0FSTklORykpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+QXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gQXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+QXNzZXJ0VXNlZEFzQW5JZGVudGlmaWVyOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfkFzc2VydFVzZWRBc0FuSWRlbnRpZmllcjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBTZXQgdGhlIHNvdXJjZSBjb21wYXRpYmlsaXR5IG1vZGUgKGFzc2VydGlvbnMpCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1NvdXJjZSkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzMpKSB7CisJCQkJCXRoaXMuYXNzZXJ0TW9kZSA9IGZhbHNlOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFZFUlNJT05fMV80KSkgeworCQkJCQl0aGlzLmFzc2VydE1vZGUgPSB0cnVlOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIFNldCB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3JtYXQKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fRW5jb2RpbmcpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUubGVuZ3RoKCkgPT0gMCl7CisJCQkJCXRoaXMuZGVmYXVsdEVuY29kaW5nID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQl0cnkgeyAvLyBpZ25vcmUgdW5zdXBwb3J0ZWQgZW5jb2RpbmcKKwkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCBvcHRpb25WYWx1ZSk7CisJCQkJCQl0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvblZhbHVlOworCQkJCQl9IGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSl7CisJCQkJCX0KKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBTZXQgdGhlIHRocmVzaG9sZCBmb3IgcHJvYmxlbXMgcGVyIHVuaXQKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fTWF4UHJvYmxlbVBlclVuaXQpKXsKKwkJCQl0cnkgeworCQkJCQlpbnQgdmFsID0gSW50ZWdlci5wYXJzZUludChvcHRpb25WYWx1ZSk7CisJCQkJCWlmICh2YWwgPj0gMCkgdGhpcy5tYXhQcm9ibGVtc1BlclVuaXQgPSB2YWw7CisJCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSl7CisJCQkJfQkJCQkKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgaW50IGdldFRhcmdldEpESygpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0SkRLOworCX0KKworCXB1YmxpYyBpbnQgZ2V0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbFNldmVyaXR5KCkgeworCQlpZigod2FybmluZ1RocmVzaG9sZCAmIE5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gMCkKKwkJCXJldHVybiBXYXJuaW5nOworCQlpZigoZXJyb3JUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApCisJCQlyZXR1cm4gRXJyb3I7CisJCXJldHVybiBJZ25vcmU7CisJfQorCisJcHVibGljIHZvaWQgcHJvZHVjZVJlZmVyZW5jZUluZm8oYm9vbGVhbiBmbGFnKSB7CisJCXRoaXMucHJvZHVjZVJlZmVyZW5jZUluZm8gPSBmbGFnOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcmJvc2VNb2RlKGJvb2xlYW4gZmxhZykgeworCQl0aGlzLnZlcmJvc2UgPSBmbGFnOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCisKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbXBpbGVyT3B0aW9uczoiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBWYXJzKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLWxvY2FsIHZhcmlhYmxlcyBkZWJ1ZyBhdHRyaWJ1dGVzOiBPTiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWYuYXBwZW5kKCJcbi1sb2NhbCB2YXJpYWJsZXMgZGVidWcgYXR0cmlidXRlczogT0ZGIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXMgJiBMaW5lcykgIT0gMCl7CisJCQlidWYuYXBwZW5kKCJcbi1saW5lIG51bWJlciBkZWJ1ZyBhdHRyaWJ1dGVzOiBPTiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWYuYXBwZW5kKCJcbi1saW5lIG51bWJlciBkZWJ1ZyBhdHRyaWJ1dGVzOiBPRkYiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgocHJvZHVjZURlYnVnQXR0cmlidXRlcyAmIFNvdXJjZSkgIT0gMCl7CisJCQlidWYuYXBwZW5kKCJcbi1zb3VyY2UgZGVidWcgYXR0cmlidXRlczogT04iKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJYnVmLmFwcGVuZCgiXG4tc291cmNlIGRlYnVnIGF0dHJpYnV0ZXM6IE9GRiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMpeworCQkJYnVmLmFwcGVuZCgiXG4tcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlczogT04iKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJYnVmLmFwcGVuZCgiXG4tcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlczogT0ZGIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGVycm9yVGhyZXNob2xkICYgVW5yZWFjaGFibGVDb2RlKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLXVucmVhY2hhYmxlIGNvZGU6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIFVucmVhY2hhYmxlQ29kZSkgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tdW5yZWFjaGFibGUgY29kZTogV0FSTklORyIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1Zi5hcHBlbmQoIlxuLXVucmVhY2hhYmxlIGNvZGU6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIEltcG9ydFByb2JsZW0pICE9IDApeworCQkJYnVmLmFwcGVuZCgiXG4taW1wb3J0IHByb2JsZW06IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIEltcG9ydFByb2JsZW0pICE9IDApeworCQkJCWJ1Zi5hcHBlbmQoIlxuLWltcG9ydCBwcm9ibGVtOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4taW1wb3J0IHByb2JsZW06IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIE1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUpICE9IDApeworCQkJYnVmLmFwcGVuZCgiXG4tbWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZTogRVJST1IiKTsJCSAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwKXsKKwkJCQlidWYuYXBwZW5kKCJcbi1tZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4tbWV0aG9kIHdpdGggY29uc3RydWN0b3IgbmFtZTogSUdOT1JFIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yVGhyZXNob2xkICYgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLW92ZXJyaWRkZW4gcGFja2FnZSBkZWZhdWx0IG1ldGhvZDogRVJST1IiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kKSAhPSAwKXsKKwkJCQlidWYuYXBwZW5kKCJcbi1vdmVycmlkZGVuIHBhY2thZ2UgZGVmYXVsdCBtZXRob2Q6IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWYuYXBwZW5kKCJcbi1vdmVycmlkZGVuIHBhY2thZ2UgZGVmYXVsdCBtZXRob2Q6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIFVzaW5nRGVwcmVjYXRlZEFQSSkgIT0gMCl7CisJCQlidWYuYXBwZW5kKCJcbi1kZXByZWNhdGlvbjogRVJST1IiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgVXNpbmdEZXByZWNhdGVkQVBJKSAhPSAwKXsKKwkJCQlidWYuYXBwZW5kKCJcbi1kZXByZWNhdGlvbjogV0FSTklORyIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1Zi5hcHBlbmQoIlxuLWRlcHJlY2F0aW9uOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBNYXNrZWRDYXRjaEJsb2NrKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLW1hc2tlZCBjYXRjaCBibG9jazogRVJST1IiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgTWFza2VkQ2F0Y2hCbG9jaykgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tbWFza2VkIGNhdGNoIGJsb2NrOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4tbWFza2VkIGNhdGNoIGJsb2NrOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBVbnVzZWRMb2NhbFZhcmlhYmxlKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBsb2NhbCB2YXJpYWJsZTogRVJST1IiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgVW51c2VkTG9jYWxWYXJpYWJsZSkgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIGxvY2FsIHZhcmlhYmxlOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIGxvY2FsIHZhcmlhYmxlOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBVbnVzZWRBcmd1bWVudCkgIT0gMCl7CisJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgcGFyYW1ldGVyOiBFUlJPUiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRBcmd1bWVudCkgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIHBhcmFtZXRlcjogV0FSTklORyIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBwYXJhbWV0ZXI6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIFVudXNlZEltcG9ydCkgIT0gMCl7CisJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgaW1wb3J0OiBFUlJPUiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRJbXBvcnQpICE9IDApeworCQkJCWJ1Zi5hcHBlbmQoIlxuLXVudXNlZCBpbXBvcnQ6IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgaW1wb3J0OiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBBY2Nlc3NFbXVsYXRpb24pICE9IDApeworCQkJYnVmLmFwcGVuZCgiXG4tc3ludGhldGljIGFjY2VzcyBlbXVsYXRpb246IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIEFjY2Vzc0VtdWxhdGlvbikgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tc3ludGhldGljIGFjY2VzcyBlbXVsYXRpb246IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWYuYXBwZW5kKCJcbi1zeW50aGV0aWMgYWNjZXNzIGVtdWxhdGlvbjogSUdOT1JFIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yVGhyZXNob2xkICYgTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLW5vbiBleHRlcm5hbGl6ZWQgc3RyaW5nOiBFUlJPUiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApeworCQkJCWJ1Zi5hcHBlbmQoIlxuLW5vbiBleHRlcm5hbGl6ZWQgc3RyaW5nOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4tbm9uIGV4dGVybmFsaXplZCBzdHJpbmc6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJc3dpdGNoKHRhcmdldEpESyl7CisJCQljYXNlIEpESzFfMSA6CisJCQkJYnVmLmFwcGVuZCgiXG4tdGFyZ2V0IEpESzogMS4xIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSkRLMV8yIDoKKwkJCQlidWYuYXBwZW5kKCJcbi10YXJnZXQgSkRLOiAxLjIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBKREsxXzMgOgorCQkJCWJ1Zi5hcHBlbmQoIlxuLXRhcmdldCBKREs6IDEuMyIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIEpESzFfNCA6CisJCQkJYnVmLmFwcGVuZCgiXG4tdGFyZ2V0IEpESzogMS40Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2goY29tcGxpYW5jZUxldmVsKXsKKwkJCWNhc2UgSkRLMV8xIDoKKwkJCQlidWYuYXBwZW5kKCJcbi1jb21wbGlhbmNlIEpESzogMS4xIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSkRLMV8yIDoKKwkJCQlidWYuYXBwZW5kKCJcbi1jb21wbGlhbmNlIEpESzogMS4yIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSkRLMV8zIDoKKwkJCQlidWYuYXBwZW5kKCJcbi1jb21wbGlhbmNlIEpESzogMS4zIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSkRLMV80IDoKKwkJCQlidWYuYXBwZW5kKCJcbi1jb21wbGlhbmNlIEpESzogMS40Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaXNQcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDaGFuZ2luZ1Zpc2liaWxpdHkpeworCQkJYnVmLmFwcGVuZCgiXG4tcHJpdmF0ZSBjb25zdHJ1Y3RvciBhY2Nlc3MgZW11bGF0aW9uOiBleHRyYSBhcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWYuYXBwZW5kKCJcbi1wcml2YXRlIGNvbnN0cnVjdG9yIGFjY2VzcyBlbXVsYXRpb246IG1ha2UgZGVmYXVsdCBhY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWJ1Zi5hcHBlbmQoIlxuLXZlcmJvc2UgOiAiICsgKHZlcmJvc2UgPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJYnVmLmFwcGVuZCgiXG4tcHJvZHVjZSByZWZlcmVuY2UgaW5mbyA6ICIgKyAocHJvZHVjZVJlZmVyZW5jZUluZm8gPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJYnVmLmFwcGVuZCgiXG4tcGFyc2UgbGl0ZXJhbCBleHByZXNzaW9ucyBhcyBjb25zdGFudHMgOiAiICsgKHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMgPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJYnVmLmFwcGVuZCgiXG4tcnVudGltZSBleGNlcHRpb24gbmFtZSBmb3IgY29tcGlsZSBlcnJvciA6ICIgKyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvcik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmLmFwcGVuZCgiXG4tZW5jb2RpbmcgOiAiICsgKGRlZmF1bHRFbmNvZGluZyA9PSBudWxsID8gIjxkZWZhdWx0PiIgOiBkZWZhdWx0RW5jb2RpbmcpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg4NmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YQpAQCAtMCwwICsxLDE0OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uU2hvdWxkTm90SW1wbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zdGFudCBpbXBsZW1lbnRzIFR5cGVJZHMsIE9wZXJhdG9ySWRzIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IE5vdEFDb25zdGFudCA9IG5ldyBEb3VibGVDb25zdGFudChEb3VibGUuTmFOKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50Q29uc3RhbnQgWmVybyA9IG5ldyBJbnRDb25zdGFudCgwKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludENvbnN0YW50IFR3byA9IG5ldyBJbnRDb25zdGFudCgyKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludENvbnN0YW50IE9uZSA9IG5ldyBJbnRDb25zdGFudCgxKTsKK3B1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiYm9vbGVhbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCit9CitwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImJ5dGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorfQorcHVibGljIGZpbmFsIENvbnN0YW50IGNhc3RUbyhpbnQgY29udmVyc2lvblRvVGFyZ2V0VHlwZSl7CisJLy90aGUgY2FzdCBpcyBhbiBpbnQgb2YgdGhlIGZvcm0KKwkvLyAoY2FzdElkPDw0KSt0eXBlSWQgKGluIG9yZGVyIHRvIGZvbGxvdyB0aGUKKwkvL3VzZXIgd3JpdHRlbiBzdHlsZSAoY2FzdClleHByZXNzaW9uIC4uLi4KKwkvL1RoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgVEMgaXMgZG9uZSAoY29ycmVjdGx5IDotKQorCisJaWYgKHRoaXMgPT0gTm90QUNvbnN0YW50KSByZXR1cm4gTm90QUNvbnN0YW50IDsKKwlzd2l0Y2goY29udmVyc2lvblRvVGFyZ2V0VHlwZSl7CisJCWNhc2UgVF91bmRlZmluZWQgOiAJCQkJCQlyZXR1cm4gdGhpczsKKy8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX1N0cmluZyAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJCisvLwkgICAgY2FzZSAoVF9ieXRlPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gdGhpcyA7ICAKKwkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmxvbmdWYWx1ZSgpKSA7IAorCSAgICBjYXNlIChUX2J5dGU8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLnNob3J0VmFsdWUoKSk7ICAgIAorLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfZG91YmxlICAJIAkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgIAorCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmZsb2F0VmFsdWUoKSk7ICAgIAorLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5jaGFyVmFsdWUoKSk7ICAgIAorCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5pbnRWYWx1ZSgpKTsgICAgCisvLwkgICAgY2FzZSAoVF9ieXRlPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5ieXRlVmFsdWUoKSk7IAorCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gdGhpcyA7IAorCSAgICBjYXNlIChUX2xvbmc8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLnNob3J0VmFsdWUoKSk7IAorLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9TdHJpbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9sb25nPDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCisJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuZmxvYXRWYWx1ZSgpKTsgIAorLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5jaGFyVmFsdWUoKSk7IAorCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5pbnRWYWx1ZSgpKTsgCisvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5ieXRlVmFsdWUoKSk7CisJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmxvbmdWYWx1ZSgpKTsgCisJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIHRoaXMgOyAgCisvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfU3RyaW5nICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9PYmplY3QgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9kb3VibGUgIAkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmRvdWJsZVZhbHVlKCkpIDsgICAKKwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmZsb2F0VmFsdWUoKSkgOyAgIAorLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfYm9vbGVhbiAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmNoYXJWYWx1ZSgpKSA7ICAKKwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5pbnRWYWx1ZSgpKSA7ICAKKy8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9kb3VibGUgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF91bmRlZmluZWQgICA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9zaG9ydCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX1N0cmluZyAgCSA6IHJldHVybiB0aGlzIDsgICAKKy8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9PYmplY3QgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9kb3VibGUgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9mbG9hdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfaW50ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF91bmRlZmluZWQgICAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9ieXRlICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9sb25nICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9zaG9ydCAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF92b2lkICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9TdHJpbmcgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9PYmplY3QgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9kb3VibGUgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9mbG9hdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2Jvb2xlYW4gCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2NoYXIgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2ludCAgCQkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfbnVsbCAgCQkgCTogcmV0dXJuIHRoaXMgOyAgIAorCisvLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkICAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfYnl0ZSAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuYnl0ZVZhbHVlKCkpIDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfbG9uZyAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMubG9uZ1ZhbHVlKCkpIDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1Rfc2hvcnQgIAkJOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChkb3VibGUpdGhpcy5zaG9ydFZhbHVlKCkpIDsgICAKKy8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF92b2lkICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9TdHJpbmcgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9PYmplY3QgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfZG91YmxlICAJCTogcmV0dXJuIHRoaXMgOyAgIAorCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9mbG9hdCAgCQk6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGRvdWJsZSl0aGlzLmZsb2F0VmFsdWUoKSkgOyAgIAorLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2Jvb2xlYW4gIAkJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfY2hhciAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuY2hhclZhbHVlKCkpIDsgICAKKwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfaW50ICAJCQk6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGRvdWJsZSl0aGlzLmludFZhbHVlKCkpOyAgCisvLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfbnVsbCAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5ieXRlVmFsdWUoKSkgOyAgIAorCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5sb25nVmFsdWUoKSkgIDsgICAKKwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLnNob3J0VmFsdWUoKSkgIDsgICAKKy8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGZsb2F0KXRoaXMuZG91YmxlVmFsdWUoKSkgIDsgICAKKwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gdGhpcyA7ICAgCisvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGZsb2F0KXRoaXMuY2hhclZhbHVlKCkpICA7ICAgCisJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGZsb2F0KXRoaXMuaW50VmFsdWUoKSkgIDsgICAKKy8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisKKy8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9ieXRlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfbG9uZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX3Nob3J0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1Rfdm9pZCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX1N0cmluZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX09iamVjdCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2RvdWJsZSAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Zsb2F0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW4gIAkJCSA6IHJldHVybiB0aGlzIDsgIAorLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9jaGFyICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfaW50ICAJCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX251bGwgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCQorLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmJ5dGVWYWx1ZSgpKSAgOyAgCisJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5sb25nVmFsdWUoKSkgIDsgIAorCSAgICBjYXNlIChUX2NoYXI8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLnNob3J0VmFsdWUoKSkgOyAgCisvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfT2JqZWN0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5kb3VibGVWYWx1ZSgpKSA7ICAgCisJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuZmxvYXRWYWx1ZSgpKSA7ICAgCisvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIHRoaXMgOyAgCisJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmludFZhbHVlKCkpIDsgIAorLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9udWxsICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCQorLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCSAgICBjYXNlIChUX2ludDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmJ5dGVWYWx1ZSgpKSA7ICAKKwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5sb25nVmFsdWUoKSkgIDsgIAorCSAgICBjYXNlIChUX2ludDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5zaG9ydFZhbHVlKCkpICA7ICAKKy8vCSAgICBjYXNlIChUX2ludDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX2ludDw8NCkrVF9PYmplY3QgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfaW50PDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5kb3VibGVWYWx1ZSgpKSAgOyAgIAorCSAgICBjYXNlIChUX2ludDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5mbG9hdFZhbHVlKCkpICA7ICAgCisvLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfYm9vbGVhbiAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfaW50PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoaW50KXRoaXMuY2hhclZhbHVlKCkpIDsgIAorCSAgICBjYXNlIChUX2ludDw8NCkrVF9pbnQgIAkJIAkgOiByZXR1cm4gdGhpcyA7ICAKKy8vCSAgICBjYXNlIChUX2ludDw8NCkrVF9udWxsICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCisvLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX3VuZGVmaW5lZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfYnl0ZSAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX2xvbmcgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9zaG9ydCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX3ZvaWQgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9TdHJpbmcgIAkJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfT2JqZWN0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfZG91YmxlICAJCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX2Zsb2F0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfYm9vbGVhbiAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKKy8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfY2hhciAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisvLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX2ludCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCisJICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9udWxsICAJCQkgOiByZXR1cm4gdGhpcyA7CisJfQorCisJCisKKwlyZXR1cm4gTm90QUNvbnN0YW50IDsKK30KK3B1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiY2hhciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCit9CitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbihDb25zdGFudCBjc3QsIGludCBpZCwgaW50IG9wZXJhdG9yKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJLy90aGUgcmVzdWx0IHNob3VsZCBiZSBhdmFpbGJhbGUgd2l0aCBub3QgcnVudGltZSBlcnJvcgorCisJc3dpdGNoIChvcGVyYXRvcikgeworCQljYXNlIE5PVAk6IAkKKwkJCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoIWNzdC5ib29sZWFuVmFsdWUoKSk7CisJCWNhc2UgUExVUwk6CXJldHVybiBjc3QgOyAKKwkJY2FzZSBNSU5VUwk6CS8vdGhlIHR3byBzcGVjaWFsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCBhbmQgLTIxNDc0ODM2NDggYXJlIGlubGluZWQgYXQgcGFyc2VUaW1lCisJCQkJCQlzd2l0Y2ggKGlkKXsKKwkJCQkJCQljYXNlIFRfZmxvYXQgIDoJZmxvYXQgZiA7CisJCQkJCQkJCQkJCWlmICggKGY9IGNzdC5mbG9hdFZhbHVlKCkpID09IDAuMGYpCisJCQkJCQkJCQkJCXsgLy9wb3NpdGl2ZSBhbmQgbmVnYXRpdmUgMC4uLi4KKwkJCQkJCQkJCQkJCWlmIChGbG9hdC5mbG9hdFRvSW50Qml0cyhmKSA9PSAwKQorCQkJCQkJCQkJCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoLTAuMGYpOworCQkJCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoMC4wZik7fQorCQkJCQkJCQkJCQlicmVhazsgLy9kZWZhdWx0IGNhc2UKKwkJCQkJCQljYXNlIFRfZG91YmxlIDogZG91YmxlIGQgOworCQkJCQkJCQkJCQlpZiAoIChkPSBjc3QuZG91YmxlVmFsdWUoKSkgPT0gMC4wZCkKKwkJCQkJCQkJCQkJeyAvL3Bvc2l0aXZlIGFuZCBuZWdhdGl2ZSAwLi4uLgorCQkJCQkJCQkJCQkJaWYgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGQpID09IDApCisJCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgtMC4wZCk7CisJCQkJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgwLjBkKTt9CisJCQkJCQkJCQkJCWJyZWFrOyAvL2RlZmF1bHQgY2FzZQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1JTlVTKFplcm8sVF9pbnQsb3BlcmF0b3IsY3N0LGlkKTsKKwkJY2FzZSBUV0lERExFOgkKKwkJCXN3aXRjaCAoaWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSh+IGNzdC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSh+IGNzdC5sb25nVmFsdWUoKSkgOworCQkJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50O30gLy9zaG91bGQgbm90IG9jY3VyLi4uLi4oY29uc2VydmF0aXZlIGNvZGUpCisJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50IDt9fSAvL3Nob3VsZCBub3Qgb2NjdXIuLi4uKGNvbnNlcnZhdGl2ZSBjb2RlKQorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb24oQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiBTbyAoZXhjZXB0IGZvciBkaXZpZGUgYnkgemVybykKKwkvL3RoZSByZXN1bHQgc2hvdWxkIGJlIGF2YWlsYmFsZSB3aXRoIG5vdCBydW50aW1lIGVycm9yCisKKwlzd2l0Y2ggKG9wZXJhdG9yKSB7CisJCWNhc2UgQU5ECQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkQJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7CisJCWNhc2UgQU5EX0FORAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkRfQU5ECShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7CisJCWNhc2UgRElWSURFIAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25ESVZJREUJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7CisJCWNhc2UgR1JFQVRFUgk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25HUkVBVEVSCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7CisJCWNhc2UgR1JFQVRFUl9FUVVBTAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25HUkVBVEVSX0VRVUFMKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBMRUZUX1NISUZUCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFRlRfU0hJRlQJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBMRVNTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOworCQljYXNlIExFU1NfRVFVQUwJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVTU19FUVVBTAkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOworCQljYXNlIE1JTlVTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NSU5VUwkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBNVUxUSVBMWQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NVUxUSVBMWQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOworCQljYXNlIE9SCQkJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uT1IJCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOworCQljYXNlIE9SX09SCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUl9PUgkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBQTFVTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25QTFVTCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOworCQljYXNlIFJFTUFJTkRFUgk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SRU1BSU5ERVIJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBSSUdIVF9TSElGVDogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJJR0hUX1NISUZUKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVDogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblVOU0lHTkVEX1JJR0hUX1NISUZUKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKwkJY2FzZSBYT1IJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblhPUgkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKKworCQlkZWZhdWx0IDogcmV0dXJuIE5vdEFDb25zdGFudCA7fX0gLy9zaG91bGQgbm90IG9jY3Vycy4uLi4oY29uc2VydmF0aXZlIGNvZGUpCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAorCQorCXN3aXRjaCAobGVmdElkKXsKKwkJY2FzZSBUX2Jvb2xlYW4gOgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpICYgcmlnaHQuYm9vbGVhblZhbHVlKCkpIDsKKwkJY2FzZSBUX2NoYXIgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAmIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAmIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICYgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWsgOworCQljYXNlIFRfYnl0ZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAmIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICYgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCisJCX0KKwkKKworCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUgCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORF9BTkQoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKworCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSAmJiByaWdodC5ib29sZWFuVmFsdWUoKSkgO30KK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRElWSURFKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJLy8gdGhlIC8wIG11c3QgYmUgaGFuZGxlZCBvdXRzaWRlIHRoaXMgbWV0aG9kIChlcnJvciByZXBvcnRpbmcpCisKKwlzd2l0Y2ggKGxlZnRJZCl7CisJCWNhc2UgVF9jaGFyIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZG91YmxlIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9ieXRlIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfc2hvcnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfaW50IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisKKwkJfQorCQorCisJcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy9zaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25FUVVBTF9FUVVBTChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAorCQorCXN3aXRjaCAobGVmdElkKXsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJaWYgKHJpZ2h0SWQgPT0gVF9ib29sZWFuKSB7CisJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpID09IHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKSA7CisJCQl9CisJCWJyZWFrIDsKKwkJY2FzZSBUX2NoYXIgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCQorCQljYXNlIFRfc2hvcnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQorCQljYXNlIFRfbG9uZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9TdHJpbmcgOgorCQkJaWYgKHJpZ2h0SWQgPT0gVF9TdHJpbmcpIHsKKwkJCQkvL1N0cmluZyBhcmUgaW50ZXJtZWQgaW4gdGggY29tcGlsZXI9PT50aHVzIGlmIHR3byBzdHJpbmcgY29uc3RhbnQKKwkJCQkvL2dldCB0byBiZSBjb21wYXJlZCwgaXQgaXMgYW4gZXF1YWwgb24gdGhlIHZhbGUgd2hpY2ggaXMgZG9uZQorCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKChTdHJpbmdDb25zdGFudClsZWZ0KS5jb21waWxlVGltZUVxdWFsKChTdHJpbmdDb25zdGFudClyaWdodCkpIDsKKwkJCX0KKwkJYnJlYWs7CQorCQljYXNlIFRfbnVsbCA6CisJCQlpZiAocmlnaHRJZCA9PSBUX1N0cmluZykgeyAKKwkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJpZ2h0SWQgPT0gVF9udWxsKSB7IAorCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKHRydWUpIDsKKwkJCQl9CisJCQl9CisJCX0KKwkKKwlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGZhbHNlKSAgO30KK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uR1JFQVRFUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAorCQorCXN3aXRjaCAobGVmdElkKXsKKwkJY2FzZSBUX2NoYXIgOiAKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZG91YmxlIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9ieXRlIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCQorCQljYXNlIFRfc2hvcnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfaW50IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CQkKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJCQorCQl9CisJCisJcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy9zaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25HUkVBVEVSX0VRVUFMKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfY2hhciA6IAorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCQorCQljYXNlIFRfc2hvcnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQorCQljYXNlIFRfbG9uZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJCQorCQl9CisJCisJcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy9zaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRUZUX1NISUZUKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfY2hhciA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrIDsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PCByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCisJCX0KKwkKKworCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUgCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1MoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKwkKKwlzd2l0Y2ggKGxlZnRJZCl7CisJCWNhc2UgVF9jaGFyIDogCisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQkKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCQkKKwkJfQorCQorCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVTU19FUVVBTChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAorCQorCXN3aXRjaCAobGVmdElkKXsKKwkJY2FzZSBUX2NoYXIgOiAKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9ieXRlIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQkKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CQkKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCQkKKwkJfQorCQorCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTUlOVVMoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKwkKKwlzd2l0Y2ggKGxlZnRJZCl7CisJCWNhc2UgVF9jaGFyIDogCisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQkKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLSByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLSByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCQkKKwkJfQorCQorCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTVVMVElQTFkoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKworCXN3aXRjaCAobGVmdElkKXsKKwkJY2FzZSBUX2NoYXIgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KKworCQl9CisJCisKKwlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk9SKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgfCByaWdodC5ib29sZWFuVmFsdWUoKSkgOworCQljYXNlIFRfY2hhciA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSB8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgfCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSB8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfaW50IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSkgO30KKworCQl9CisJCisKKwlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvLyBzaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUl9PUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAorCisJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpIHx8IHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKSA7fQorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25QTFVTKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfT2JqZWN0IDoKKwkJCWlmIChyaWdodElkID09IFRfU3RyaW5nKSB7CisJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCX0KKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJaWYgKHJpZ2h0SWQgPT0gVF9TdHJpbmcpIHsKKwkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJfQorCQlicmVhayA7CisJCWNhc2UgVF9jaGFyIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsgfQorCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7IH0KKworCQlicmVhazsJCQkKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkJCisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsgfQorCQlicmVhazsKKwkJY2FzZSBUX1N0cmluZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOworCQkJCWNhc2UgVF9TdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOyAKKwkJCQljYXNlIFRfbnVsbDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7IAorCQkJCWNhc2UgVF9ib29sZWFuOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOwkKKwkJY2FzZSBUX251bGwgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOworCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKKwkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsgCisJCQkJY2FzZSBUX251bGw6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOyB9CisJCQkKKwkJfQorCQorCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKK3B1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uUkVNQUlOREVSKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfY2hhciA6IAorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5mbG9hdFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CQkJCisJCWNhc2UgVF9zaG9ydCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsJCQorCQljYXNlIFRfbG9uZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQkJCisJCX0KKwkKKwlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJJR0hUX1NISUZUKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfY2hhciA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrIDsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCisJCX0KKwkKKworCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUgCitwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblVOU0lHTkVEX1JJR0hUX1NISUZUKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCisJc3dpdGNoIChsZWZ0SWQpeworCQljYXNlIFRfY2hhciA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWsgOworCQljYXNlIFRfYnl0ZSA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKKwkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSkgO30KKworCQl9CisJCisKKwlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvLyBzaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25YT1IoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKwkKKwlzd2l0Y2ggKGxlZnRJZCl7CisJCWNhc2UgVF9ib29sZWFuIDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSBeIHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKSA7CisJCWNhc2UgVF9jaGFyIDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSkgOworCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrIDsKKwkJY2FzZSBUX2J5dGUgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgXiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSkgO30KKwkJYnJlYWs7CisJCWNhc2UgVF9zaG9ydCA6CisJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSkgOworCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSBeIHJpZ2h0LnNob3J0VmFsdWUoKSkgOworCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9CisJCWJyZWFrOworCQljYXNlIFRfaW50IDoKKwkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKKwkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQorCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7CisJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5zaG9ydFZhbHVlKCkpIDsKKwkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIF4gcmlnaHQuaW50VmFsdWUoKSkgOworCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSkgO30KKworCQl9CisJCisKKwlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvLyBzaG91bGQgbm90IGdldCBoZXJlIAorcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKwl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZG91YmxlIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK3B1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJmbG9hdCIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShieXRlIHZhbHVlKSB7CisJcmV0dXJuIG5ldyBCeXRlQ29uc3RhbnQodmFsdWUpOworfQorcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoY2hhciB2YWx1ZSkgeworCXJldHVybiBuZXcgQ2hhckNvbnN0YW50KHZhbHVlKTsKK30KK3B1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGRvdWJsZSB2YWx1ZSkgeworCXJldHVybiBuZXcgRG91YmxlQ29uc3RhbnQodmFsdWUpOworfQorcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoZmxvYXQgdmFsdWUpIHsKKwlyZXR1cm4gbmV3IEZsb2F0Q29uc3RhbnQodmFsdWUpOworfQorcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoaW50IHZhbHVlKSB7CisJcmV0dXJuIG5ldyBJbnRDb25zdGFudCh2YWx1ZSk7Cit9CitwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShsb25nIHZhbHVlKSB7CisJcmV0dXJuIG5ldyBMb25nQ29uc3RhbnQodmFsdWUpOworfQorcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBOdWxsQ29uc3RhbnQuRGVmYXVsdDsKKwlyZXR1cm4gbmV3IFN0cmluZ0NvbnN0YW50KHZhbHVlKTsKK30KK3B1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKHNob3J0IHZhbHVlKSB7CisJcmV0dXJuIG5ldyBTaG9ydENvbnN0YW50KHZhbHVlKTsKK30KK3B1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKKwlyZXR1cm4gbmV3IEJvb2xlYW5Db25zdGFudCh2YWx1ZSk7Cit9CitwdWJsaWMgaW50IGludFZhbHVlKCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJpbnQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJsb25nIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK3B1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDb252ZXJ0ZWRUbyIsdHlwZU5hbWUoKSwic2hvcnQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorLyoqIERlcHJlY2F0ZWQKKyovCitwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDb252ZXJ0ZWRUbyIsdHlwZU5hbWUoKSwiU3RyaW5nIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKworCWlmICh0aGlzID09IE5vdEFDb25zdGFudCkgcmV0dXJuICIoQ29uc3RhbnQpIE5vdEFDb25zdGFudCIgOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7IH0KK3B1YmxpYyBhYnN0cmFjdCBpbnQgdHlwZUlEKCk7CitwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkgeworCXN3aXRjaCAodHlwZUlEKCkpIHsKKwkJY2FzZSBUX2ludCA6IHJldHVybiAiaW50IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRfYnl0ZSA6IHJldHVybiAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUX3Nob3J0IDogcmV0dXJuICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUX2NoYXIgOiByZXR1cm4gImNoYXIiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVF9mbG9hdCA6IHJldHVybiAiZmxvYXQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVF9kb3VibGUgOiByZXR1cm4gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUX2Jvb2xlYW4gOiByZXR1cm4gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVF9sb25nIDogcmV0dXJuICJsb25nIjsvLyROT04tTkxTLTEkCisJCWNhc2UgVF9TdHJpbmcgOiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVF9udWxsIDogcmV0dXJuICJudWxsIjsJIC8vJE5PTi1OTFMtMSQKKwkJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0RvdWJsZUNvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGZlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgRG91YmxlQ29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CisJCisJZG91YmxlIHZhbHVlOworCQorCXB1YmxpYyBEb3VibGVDb25zdGFudChkb3VibGUgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisJCXJldHVybiAoYnl0ZSkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwkJcmV0dXJuIChjaGFyKSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKwkJcmV0dXJuIChkb3VibGUpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKwkJcmV0dXJuIChmbG9hdCkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisJCXJldHVybiAoaW50KSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCQlyZXR1cm4gKGxvbmcpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChzaG9ydCkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJCS8vc3BlYyAxNS4xNy4xMQorCQlTdHJpbmcgcyA9IG5ldyBEb3VibGUodmFsdWUpLnRvU3RyaW5nKCk7CisJCWlmIChzID09IG51bGwpCisJCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXJldHVybiBzOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAodGhpcyA9PSBOb3RBQ29uc3RhbnQpCisJCQlyZXR1cm4gIihDb25zdGFudCkgTm90QUNvbnN0YW50IjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gIihkb3VibGUpIiArIHZhbHVlOyAgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBpbnQgdHlwZUlEKCkgeworCQlyZXR1cm4gVF9kb3VibGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE0NDdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRmxvYXRDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgRmxvYXRDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKKwkKKwlmbG9hdCB2YWx1ZTsKKwkKKwlwdWJsaWMgRmxvYXRDb25zdGFudChmbG9hdCB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCQorCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKKwkJcmV0dXJuIChieXRlKSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGNoYXIgY2hhclZhbHVlKCkgeworCQlyZXR1cm4gKGNoYXIpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeworCQlyZXR1cm4gKGRvdWJsZSkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeworCQlyZXR1cm4gKGZsb2F0KSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGludCBpbnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChpbnQpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisJCXJldHVybiAobG9uZykgdmFsdWU7CisJfQorCQorCXB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworCQlyZXR1cm4gKHNob3J0KSB2YWx1ZTsKKwl9CisJCisJcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKKwkJLy9zcGVjIDE1LjE3LjExCisJCVN0cmluZyBzID0gbmV3IEZsb2F0KHZhbHVlKS50b1N0cmluZygpOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIihmbG9hdCkiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKKwl9IAorCisJcHVibGljIGludCB0eXBlSUQoKSB7CisJCXJldHVybiBUX2Zsb2F0OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JVHlwZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQzMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKKw0KK3B1YmxpYyBpbnRlcmZhY2UgSVR5cGVSZXF1ZXN0b3IgeworCQorCS8qKgorCSAqIEFjY2VwdCB0aGUgcmVzb2x2ZWQgYmluYXJ5IGZvcm0gZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKwkgKi8KKwl2b2lkIGFjY2VwdChJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyk7CisKKwkvKioKKwkgKiBBY2NlcHQgdGhlIHJlcXVlc3RlZCB0eXBlJ3MgY29tcGlsYXRpb24gdW5pdC4KKwkgKi8KKwl2b2lkIGFjY2VwdChJQ29tcGlsYXRpb25Vbml0IHVuaXQpOworCisJLyoqCisJICogQWNjZXB0IHRoZSB1bnJlc29sdmVkIHNvdXJjZSBmb3JtcyBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLgorCSAqIE5vdGUgdGhhdCB0aGUgbXVsdGlwbGUgc291cmNlIGZvcm1zIGNhbiBiZSBhbnN3ZXJlZCwgaW4gY2FzZSB0aGUgdGFyZ2V0IGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBjb250YWlucyBtdWx0aXBsZSB0eXBlcy4gVGhlIGZpcnN0IG9uZSBpcyB0aGVuIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAqIHJlcXVlc3RlZCB0eXBlLgorCSAqLworCXZvaWQgYWNjZXB0KElTb3VyY2VUeXBlW10gc291cmNlVHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0ludENvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWY4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgSW50Q29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CisJCisJaW50IHZhbHVlOworCQorCXB1YmxpYyBJbnRDb25zdGFudChpbnQgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKwlwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisJCXJldHVybiAoYnl0ZSkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwkJcmV0dXJuIChjaGFyKSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKwkJcmV0dXJuIChkb3VibGUpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKwkJcmV0dXJuIChmbG9hdCkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisJCXJldHVybiAoaW50KSB2YWx1ZTsKKwl9CisJCisJcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCQlyZXR1cm4gKGxvbmcpIHZhbHVlOworCX0KKwkKKwlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKKwkJcmV0dXJuIChzaG9ydCkgdmFsdWU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJCS8vc3BlYyAxNS4xNy4xMQorCQlTdHJpbmcgcyA9IG5ldyBJbnRlZ2VyKHZhbHVlKS50b1N0cmluZygpOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIihpbnQpIiArIHZhbHVlOyAvLyROT04tTkxTLTEkCisJfSAKKworCXB1YmxpYyBpbnQgdHlwZUlEKCkgeworCQlyZXR1cm4gVF9pbnQ7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTG9uZ0NvbnN0YW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZGU0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgTG9uZ0NvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgeworCWxvbmcgdmFsdWU7CitwdWJsaWMgTG9uZ0NvbnN0YW50KGxvbmcgdmFsdWUpIHsKKwl0aGlzLnZhbHVlID0gdmFsdWU7Cit9CitwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisJcmV0dXJuIChieXRlKSB2YWx1ZTsKK30KK3B1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwlyZXR1cm4gKGNoYXIpIHZhbHVlOworfQorcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKwlyZXR1cm4gKGRvdWJsZSkgdmFsdWU7Cit9CitwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKwlyZXR1cm4gKGZsb2F0KSB2YWx1ZTsKK30KK3B1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisJcmV0dXJuIChpbnQpIHZhbHVlOworfQorcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCXJldHVybiAobG9uZykgdmFsdWU7Cit9CitwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKKwlyZXR1cm4gKHNob3J0KSB2YWx1ZTsKK30KK3B1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJLy9zcGVjIDE1LjE3LjExCisJCisJU3RyaW5nIHMgPSBuZXcgTG9uZyh2YWx1ZSkudG9TdHJpbmcoKSA7CisJaWYgKHMgPT0gbnVsbCkKKwkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJcmV0dXJuIHM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlyZXR1cm4gIihsb25nKSIgKyB2YWx1ZSA7IH0gLy8kTk9OLU5MUy0xJAorcHVibGljIGludCB0eXBlSUQoKSB7CisJcmV0dXJuIFRfbG9uZzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL051bGxDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTnVsbENvbnN0YW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4ZjZiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL051bGxDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOworCitwdWJsaWMgY2xhc3MgTnVsbENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbENvbnN0YW50IERlZmF1bHQgPSBuZXcgTnVsbENvbnN0YW50KCk7CisKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIE51bGxTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKDQpLmFwcGVuZCgoU3RyaW5nKW51bGwpLnRvU3RyaW5nKCk7Citwcml2YXRlIE51bGxDb25zdGFudCgpIHsKK30KK3B1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJCisJcmV0dXJuIE51bGxTdHJpbmc7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlyZXR1cm4gIihudWxsKSIgKyBudWxsIDsgfSAvLyROT04tTkxTLTEkCitwdWJsaWMgaW50IHR5cGVJRCgpIHsKKwlyZXR1cm4gVF9udWxsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvUmVmZXJlbmNlQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvUmVmZXJlbmNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOGFlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9SZWZlcmVuY2VDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CisvKgorICogSW1wbGVtZW50b3JzIGFyZSB2YWxpZCBjb21waWxhdGlvbiBjb250ZXh0cyBmcm9tIHdoaWNoIHdlIGNhbgorICogZXNjYXBlIGluIGNhc2Ugb2YgZXJyb3I6CisgKglpLmUuIG1ldGhvZCB8IHR5cGUgfCBjb21waWxhdGlvbiB1bml0CisgKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKKworcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VDb250ZXh0IHsKKwl2b2lkIGFib3J0KGludCBhYm9ydExldmVsKTsKKwlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCgpOworCXZvaWQgdGFnQXNIYXZpbmdFcnJvcnMoKTsKKwlib29sZWFuIGhhc0Vycm9ycygpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjY5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TaG9ydENvbnN0YW50LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CisKK3B1YmxpYyBjbGFzcyBTaG9ydENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgeworCXNob3J0IHZhbHVlOworcHVibGljIFNob3J0Q29uc3RhbnQoc2hvcnQgdmFsdWUpIHsKKwl0aGlzLnZhbHVlID0gdmFsdWU7Cit9CitwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisJcmV0dXJuIChieXRlKSB2YWx1ZTsKK30KK3B1YmxpYyBjaGFyIGNoYXJWYWx1ZSgpIHsKKwlyZXR1cm4gKGNoYXIpIHZhbHVlOworfQorcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKwlyZXR1cm4gKGRvdWJsZSkgdmFsdWU7Cit9CitwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKwlyZXR1cm4gKGZsb2F0KSB2YWx1ZTsKK30KK3B1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisJcmV0dXJuIChpbnQpIHZhbHVlOworfQorcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCXJldHVybiAobG9uZykgdmFsdWU7Cit9CitwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKKwlyZXR1cm4gKHNob3J0KSB2YWx1ZTsKK30KK3B1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7CisJLy9zcGVjIDE1LjE3LjExCisJCisJU3RyaW5nIHMgPSBuZXcgSW50ZWdlcih2YWx1ZSkudG9TdHJpbmcoKSA7CisJaWYgKHMgPT0gbnVsbCkKKwkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJcmV0dXJuIHM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlyZXR1cm4gIihzaG9ydCkiICsgdmFsdWUgOyB9IC8vJE5PTi1OTFMtMSQKK3B1YmxpYyBpbnQgdHlwZUlEKCkgeworCXJldHVybiBUX3Nob3J0OworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU3RyaW5nQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViYzYwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKKwlwdWJsaWMgU3RyaW5nIHZhbHVlOworICAgIAorcHVibGljIFN0cmluZ0NvbnN0YW50KFN0cmluZyB2YWx1ZSkgeworCXRoaXMudmFsdWUgPSB2YWx1ZSA7Cit9CitwdWJsaWMgYm9vbGVhbiBjb21waWxlVGltZUVxdWFsKFN0cmluZ0NvbnN0YW50IHJpZ2h0KXsKKwkvL1N0cmluZyBhcmUgaW50ZXJtZWQgaW4gdGhlIGNvbXBpbGVyPT0+dGh1cyBpZiB0d28gc3RyaW5nIGNvbnN0YW50CisJLy9nZXQgdG8gYmUgY29tcGFyZWQsIGl0IGlzIGFuIGVxdWFsIG9uIHRoZSB2YWxlIHdoaWNoIGlzIGRvbmUKKwlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7CisJCXJldHVybiByaWdodC52YWx1ZSA9PSBudWxsOworCX0KKwlyZXR1cm4gdGhpcy52YWx1ZS5lcXVhbHMocmlnaHQudmFsdWUpOworfQorcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKKwkvL3NwZWMgMTUuMTcuMTEKKworCS8vdGhlIG5leHQgbGluZSBkbyBub3QgZ28gaW50byB0aGUgdG9TdHJpbmcoKSBzZW5kLi4uLiEKKwlyZXR1cm4gdmFsdWUgOworCisJLyoKKwlTdHJpbmcgcyA9IHZhbHVlLnRvU3RyaW5nKCkgOworCWlmIChzID09IG51bGwpCisJCXJldHVybiAibnVsbCI7CisJZWxzZQorCQlyZXR1cm4gczsKKwkqLworCQorfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCisJcmV0dXJuICIoU3RyaW5nKVwiIiArIHZhbHVlICsiXCIiOyB9IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorcHVibGljIGludCB0eXBlSUQoKSB7CisJcmV0dXJuIFRfU3RyaW5nOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9BcnJheUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMzZlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlCaW5kaW5nIGV4dGVuZHMgVHlwZUJpbmRpbmcgeworCS8vIGNyZWF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgbGVuZ3RoIGZpZWxkCisJLy8gdGhlIGRlY2xhcmluZ0NsYXNzIG9mIHRoaXMgZmllbGQgaXMgaW50ZW50aW9uYWxseSBzZXQgdG8gbnVsbCBzbyBpdCBjYW4gYmUgZGlzdGluZ3Vpc2hlZC4KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkQmluZGluZyBMZW5ndGhGaWVsZCA9IG5ldyBGaWVsZEJpbmRpbmcoTEVOR1RILCBJbnRCaW5kaW5nLCBBY2NQdWJsaWMgfCBBY2NGaW5hbCwgbnVsbCwgQ29uc3RhbnQuTm90QUNvbnN0YW50KTsKKworCXB1YmxpYyBUeXBlQmluZGluZyBsZWFmQ29tcG9uZW50VHlwZTsKKwlwdWJsaWMgaW50IGRpbWVuc2lvbnM7CisKKwljaGFyW10gY29uc3RhbnRQb29sTmFtZTsKK3B1YmxpYyBBcnJheUJpbmRpbmcoVHlwZUJpbmRpbmcgdHlwZSwgaW50IGRpbWVuc2lvbnMpIHsKKwl0aGlzLnRhZ0JpdHMgfD0gSXNBcnJheVR5cGU7CisJdGhpcy5sZWFmQ29tcG9uZW50VHlwZSA9IHR5cGU7CisJdGhpcy5kaW1lbnNpb25zID0gZGltZW5zaW9uczsKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBjb25zdGFudCBwb29sIG5hbWUuCisqCisqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorKi8KKworcHVibGljIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKCkgLyoJW0xqYXZhL2xhbmcvT2JqZWN0OyAqLyB7CisJaWYgKGNvbnN0YW50UG9vbE5hbWUgIT0gbnVsbCkKKwkJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWU7CisKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zXTsKKwlmb3IgKGludCBpID0gZGltZW5zaW9ucyAtIDE7IGkgPj0gMDsgaS0tKQorCQlicmFja2V0c1tpXSA9ICdbJzsKKwlyZXR1cm4gY29uc3RhbnRQb29sTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGJyYWNrZXRzLCBsZWFmQ29tcG9uZW50VHlwZS5zaWduYXR1cmUoKSk7Cit9CitTdHJpbmcgZGVidWdOYW1lKCkgeworCVN0cmluZ0J1ZmZlciBicmFja2V0cyA9IG5ldyBTdHJpbmdCdWZmZXIoZGltZW5zaW9ucyAqIDIpOworCWZvciAoaW50IGkgPSBkaW1lbnNpb25zOyAtLWkgPj0gMDspCisJCWJyYWNrZXRzLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZS5kZWJ1Z05hbWUoKSArIGJyYWNrZXRzLnRvU3RyaW5nKCk7Cit9CisvKiBBbnN3ZXIgYW4gYXJyYXkgd2hvc2UgZGltZW5zaW9uIHNpemUgaXMgb25lIGxlc3MgdGhhbiB0aGUgcmVjZWl2ZXIuCisqCisqIFdoZW4gdGhlIHJlY2VpdmVyJ3MgZGltZW5zaW9uIHNpemUgaXMgb25lIHRoZW4gYW5zd2VyIHRoZSBsZWFmIGNvbXBvbmVudCB0eXBlLgorKi8KKworcHVibGljIFR5cGVCaW5kaW5nIGVsZW1lbnRzVHlwZShTY29wZSBzY29wZSkgeworCWlmIChkaW1lbnNpb25zID09IDEpCisJCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZTsKKwllbHNlCisJCXJldHVybiBzY29wZS5jcmVhdGVBcnJheShsZWFmQ29tcG9uZW50VHlwZSwgZGltZW5zaW9ucyAtIDEpOworfQorcHVibGljIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoKSB7CisJcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLmdldFBhY2thZ2UoKTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgYXJndW1lbnQgdHlwZSAocmlnaHQpCisqLworCitib29sZWFuIGlzQ29tcGF0aWJsZVdpdGgoVHlwZUJpbmRpbmcgcmlnaHQpIHsKKwlpZiAodGhpcyA9PSByaWdodCkKKwkJcmV0dXJuIHRydWU7CisKKwljaGFyW11bXSByaWdodE5hbWU7CisJaWYgKHJpZ2h0LmlzQXJyYXlUeXBlKCkpIHsKKwkJQXJyYXlCaW5kaW5nIHJpZ2h0QXJyYXkgPSAoQXJyYXlCaW5kaW5nKSByaWdodDsKKwkJaWYgKHJpZ2h0QXJyYXkubGVhZkNvbXBvbmVudFR5cGUuaXNCYXNlVHlwZSgpKQorCQkJcmV0dXJuIGZhbHNlOyAvLyByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgYWxsIGVxdWFsIGFycmF5cyBhcmUgaWRlbnRpY2FsCisJCWlmIChkaW1lbnNpb25zID09IHJpZ2h0QXJyYXkuZGltZW5zaW9ucykKKwkJCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZS5pc0NvbXBhdGlibGVXaXRoKHJpZ2h0QXJyYXkubGVhZkNvbXBvbmVudFR5cGUpOworCQlpZiAoZGltZW5zaW9ucyA8IHJpZ2h0QXJyYXkuZGltZW5zaW9ucykKKwkJCXJldHVybiBmYWxzZTsgLy8gY2Fubm90IGFzc2lnbiAnU3RyaW5nW10nIGludG8gJ09iamVjdFtdW10nIGJ1dCBjYW4gYXNzaWduICdieXRlW11bXScgaW50byAnT2JqZWN0W10nCisJCXJpZ2h0TmFtZSA9ICgoUmVmZXJlbmNlQmluZGluZykgcmlnaHRBcnJheS5sZWFmQ29tcG9uZW50VHlwZSkuY29tcG91bmROYW1lOworCX0gZWxzZSB7CisJCWlmIChyaWdodC5pc0Jhc2VUeXBlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJpZ2h0TmFtZSA9ICgoUmVmZXJlbmNlQmluZGluZykgcmlnaHQpLmNvbXBvdW5kTmFtZTsKKwl9CisJLy9DaGVjayBkaW1lbnNpb25zIC0gSmF2YSBkb2VzIG5vdCBzdXBwb3J0IGV4cGxpY2l0bHkgc2l6ZWQgZGltZW5zaW9ucyBmb3IgdHlwZXMuCisJLy9Ib3dldmVyLCBpZiBpdCBkaWQsIHRoZSB0eXBlIGNoZWNraW5nIHN1cHBvcnQgd291bGQgZ28gaGVyZS4KKworCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyaWdodE5hbWUsIEpBVkFfTEFOR19PQkpFQ1QpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocmlnaHROYW1lLCBKQVZBX0xBTkdfQ0xPTkVBQkxFKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHJpZ2h0TmFtZSwgSkFWQV9JT19TRVJJQUxJWkFCTEUpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3B1YmxpYyBUeXBlQmluZGluZyBsZWFmQ29tcG9uZW50VHlwZSgpeworCXJldHVybiBsZWFmQ29tcG9uZW50VHlwZTsKK30KKworLyogQVBJCisqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCisqLworCitwdWJsaWMgaW50IHByb2JsZW1JZCgpIHsKKwlyZXR1cm4gbGVhZkNvbXBvbmVudFR5cGUucHJvYmxlbUlkKCk7Cit9CisvKioKKyogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBmb3IgdGhlIHR5cGUuCisqIEluIHRoZSBjYXNlIG9mIG1lbWJlciB0eXBlcywgYXMgdGhlIHF1YWxpZmllZCBuYW1lIGZyb20gaXRzIHRvcCBsZXZlbCB0eXBlLgorKiBGb3IgZXhhbXBsZSwgZm9yIGEgbWVtYmVyIHR5cGUgTiBkZWZpbmVkIGluc2lkZSBNICYgQTogIkEuTS5OIi4KKyovCisKK3B1YmxpYyBjaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSgpIHsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07CisJZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwkJYnJhY2tldHNbaV0gPSAnXSc7CisJCWJyYWNrZXRzW2kgLSAxXSA9ICdbJzsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGxlYWZDb21wb25lbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgYnJhY2tldHMpOworfQorcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSAvKiBqYXZhLmxhbmcuT2JqZWN0W10gKi8geworCWNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW2RpbWVuc2lvbnMgKiAyXTsKKwlmb3IgKGludCBpID0gZGltZW5zaW9ucyAqIDIgLSAxOyBpID49IDA7IGkgLT0gMikgeworCQlicmFja2V0c1tpXSA9ICddJzsKKwkJYnJhY2tldHNbaSAtIDFdID0gJ1snOworCX0KKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQobGVhZkNvbXBvbmVudFR5cGUucmVhZGFibGVOYW1lKCksIGJyYWNrZXRzKTsKK30KK3B1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07CisJZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwkJYnJhY2tldHNbaV0gPSAnXSc7CisJCWJyYWNrZXRzW2kgLSAxXSA9ICdbJzsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGxlYWZDb21wb25lbnRUeXBlLnNvdXJjZU5hbWUoKSwgYnJhY2tldHMpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gbGVhZkNvbXBvbmVudFR5cGUgIT0gbnVsbCA/IGRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSBBUlJBWSI7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitwdWJsaWMgZmluYWwgY2xhc3MgQmFzZVR5cGVCaW5kaW5nIGV4dGVuZHMgVHlwZUJpbmRpbmcgeworCXB1YmxpYyBjaGFyW10gc2ltcGxlTmFtZTsKKwlwcml2YXRlIGNoYXIgW10gY29uc3RhbnRQb29sTmFtZTsKK0Jhc2VUeXBlQmluZGluZyhpbnQgaWQsIGNoYXJbXSBuYW1lLCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSkgeworCXRoaXMudGFnQml0cyB8PSBJc0Jhc2VUeXBlOworCXRoaXMuaWQgPSBpZDsKKwl0aGlzLnNpbXBsZU5hbWUgPSBuYW1lOworCXRoaXMuY29uc3RhbnRQb29sTmFtZSA9IGNvbnN0YW50UG9vbE5hbWU7Cit9CisvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgorKi8KKworcHVibGljIGNoYXJbXSBjb25zdGFudFBvb2xOYW1lKCkgeworCXJldHVybiBjb25zdGFudFBvb2xOYW1lOworfQorcHVibGljIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoKSB7CisJcmV0dXJuIG51bGw7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgKHJpZ2h0KQorKi8KKworZmluYWwgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CisJaWYgKHRoaXMgPT0gcmlnaHQpCisJCXJldHVybiB0cnVlOworCWlmICghcmlnaHQuaXNCYXNlVHlwZSgpKQorCQlyZXR1cm4gdGhpcyA9PSBOdWxsQmluZGluZzsKKworCXN3aXRjaCAocmlnaHQuaWQpIHsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQljYXNlIFRfYnl0ZSA6CisJCWNhc2UgVF9jaGFyIDoKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQlzd2l0Y2ggKGlkKSB7CisJCQkJY2FzZSBUX2J5dGUgOgorCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQljYXNlIFRfc2hvcnQgOgorCQkJCWNhc2UgVF9pbnQgOgorCQkJCWNhc2UgVF9sb25nIDoKKwkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQljYXNlIFRfZmxvYXQgOgorCQkJc3dpdGNoIChpZCkgeworCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQljYXNlIFRfY2hhciA6CisJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQljYXNlIFRfaW50IDoKKwkJCQljYXNlIFRfbG9uZyA6CisJCQkJCXJldHVybiB0cnVlOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCWNhc2UgVF9sb25nIDoKKwkJCXN3aXRjaCAoaWQpIHsKKwkJCQljYXNlIFRfYnl0ZSA6CisJCQkJY2FzZSBUX2NoYXIgOgorCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJY2FzZSBUX2ludCA6CisJCQkJCXJldHVybiB0cnVlOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCWNhc2UgVF9pbnQgOgorCQkJc3dpdGNoIChpZCkgeworCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQljYXNlIFRfY2hhciA6CisJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXJldHVybiAoaWQgPT0gVF9ieXRlKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTmFycm93aW5nKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkvL2NhbiAibGVmdCIgc3RvcmUgYSAicmlnaHQiIHVzaW5nIHNvbWUgbmFycm93aW5nIGNvbnZlcnNpb24KKwkvLyhpcyBsZWZ0IHNtYWxsZXIgdGhhbiByaWdodCkKKworCXN3aXRjaCAobGVmdCkgeworCQljYXNlIFRfYm9vbGVhbiA6CisJCQlyZXR1cm4gcmlnaHQgPT0gVF9ib29sZWFuOworCQljYXNlIFRfY2hhciA6CisJCWNhc2UgVF9ieXRlIDoKKwkJCWlmIChyaWdodCA9PSBUX2J5dGUpIHJldHVybiB0cnVlOworCQljYXNlIFRfc2hvcnQgOgorCQkJaWYgKHJpZ2h0ID09IFRfc2hvcnQpIHJldHVybiB0cnVlOworCQkJaWYgKHJpZ2h0ID09IFRfY2hhcikgcmV0dXJuIHRydWU7CisJCWNhc2UgVF9pbnQgOgorCQkJaWYgKHJpZ2h0ID09IFRfaW50KSByZXR1cm4gdHJ1ZTsKKwkJY2FzZSBUX2xvbmcgOgorCQkJaWYgKHJpZ2h0ID09IFRfbG9uZykgcmV0dXJuIHRydWU7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlpZiAocmlnaHQgPT0gVF9mbG9hdCkgcmV0dXJuIHRydWU7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJaWYgKHJpZ2h0ID09IFRfZG91YmxlKSByZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gZmFsc2U7CisJfQorfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2lkZW5pbmcoaW50IGxlZnQsIGludCByaWdodCkgeworCS8vY2FuICJsZWZ0IiBzdG9yZSBhICJyaWdodCIgdXNpbmcgc29tZSB3aWRlbmluZyBjb252ZXJzaW9uCisJLy8oaXMgbGVmdCAiYmlnZ2VyIiB0aGFuIHJpZ2h0KQorCisJc3dpdGNoIChsZWZ0KSB7CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCXJldHVybiByaWdodCA9PSBUX2Jvb2xlYW47CisJCWNhc2UgVF9jaGFyIDoKKwkJCXJldHVybiByaWdodCA9PSBUX2NoYXI7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJaWYgKHJpZ2h0ID09IFRfZG91YmxlKSByZXR1cm4gdHJ1ZTsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCWlmIChyaWdodCA9PSBUX2Zsb2F0KSByZXR1cm4gdHJ1ZTsKKwkJY2FzZSBUX2xvbmcgOgorCQkJaWYgKHJpZ2h0ID09IFRfbG9uZykgcmV0dXJuIHRydWU7CisJCWNhc2UgVF9pbnQgOgorCQkJaWYgKHJpZ2h0ID09IFRfaW50KSByZXR1cm4gdHJ1ZTsKKwkJCWlmIChyaWdodCA9PSBUX2NoYXIpIHJldHVybiB0cnVlOworCQljYXNlIFRfc2hvcnQgOgorCQkJaWYgKHJpZ2h0ID09IFRfc2hvcnQpIHJldHVybiB0cnVlOworCQljYXNlIFRfYnl0ZSA6CisJCQlpZiAocmlnaHQgPT0gVF9ieXRlKSByZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gZmFsc2U7CisJfQorfQorcHVibGljIGNoYXJbXSBxdWFsaWZpZWRTb3VyY2VOYW1lKCkgeworCXJldHVybiBzaW1wbGVOYW1lOworfQorcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSB7CisJcmV0dXJuIHNpbXBsZU5hbWU7Cit9CitwdWJsaWMgY2hhcltdIHNvdXJjZU5hbWUoKSB7CisJcmV0dXJuIHNpbXBsZU5hbWU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiBuZXcgU3RyaW5nKGNvbnN0YW50UG9vbE5hbWUpICsgIiAoaWQ9IiArIGlkICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzRjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK3B1YmxpYyBpbnRlcmZhY2UgQmFzZVR5cGVzIHsKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgSW50QmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2ludCwgImludCIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0knfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQnl0ZUJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ieXRlLCAiYnl0ZSIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0InfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgU2hvcnRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfc2hvcnQsICJzaG9ydCIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J1MnfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQ2hhckJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9jaGFyLCAiY2hhciIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0MnfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTG9uZ0JpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9sb25nLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0onfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRmxvYXRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfZmxvYXQsICJmbG9hdCIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0YnfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRG91YmxlQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2RvdWJsZSwgImRvdWJsZSIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J0QnfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQm9vbGVhbkJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ib29sZWFuLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J1onfSk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTnVsbEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9udWxsLCAibnVsbCIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J04nfSk7IC8vTiBzdGFuZHMgZm9yIG51bGwgZXZlbiBpZiBpdCBpcyBuZXZlciBpbnRlcm5hbGx5IHVzZWQgLy8kTk9OLU5MUy0xJAorCWZpbmFsIEJhc2VUeXBlQmluZGluZyBWb2lkQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX3ZvaWQsICJ2b2lkIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnVid9KTsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmFiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeVR5cGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU5lc3RlZFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qCitOb3QgYWxsIGZpZWxkcyBkZWZpbmVkIGJ5IHRoaXMgdHlwZSBhcmUgaW5pdGlhbGl6ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLgorU29tZSBhcmUgaW5pdGlhbGl6ZWQgb25seSB3aGVuIG5lZWRlZC4KKworQWNjZXNzb3JzIGhhdmUgYmVlbiBwcm92aWRlZCBmb3Igc29tZSBwdWJsaWMgZmllbGRzIHNvIGFsbCBUeXBlQmluZGluZ3MgaGF2ZSB0aGUgc2FtZSBBUEkuLi4KK2J1dCBhY2Nlc3MgcHVibGljIGZpZWxkcyBkaXJlY3RseSB3aGVuZXZlciBwb3NzaWJsZS4KK05vbi1wdWJsaWMgZmllbGRzIGhhdmUgYWNjZXNzb3JzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGV2ZXJ5d2hlcmUgeW91IGV4cGVjdCB0aGUgZmllbGQgdG8gYmUgaW5pdGlhbGl6ZWQuCisKK251bGwgaXMgTk9UIGEgdmFsaWQgdmFsdWUgZm9yIGEgbm9uLXB1YmxpYyBmaWVsZC4uLiBpdCBqdXN0IG1lYW5zIHRoZSBmaWVsZCBpcyBub3QgaW5pdGlhbGl6ZWQuCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VHlwZUJpbmRpbmcgZXh0ZW5kcyBSZWZlcmVuY2VCaW5kaW5nIHsKKwkvLyBhbGwgb2YgdGhlc2UgZmllbGRzIGFyZSBPTkxZIGd1YXJhbnRlZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaWYgYWNjZXNzZWQgdXNpbmcgdGhlaXIgcHVibGljIGFjY2Vzc29yIG1ldGhvZAorCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzOworCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlOworCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlczsKKwlwcml2YXRlIEZpZWxkQmluZGluZ1tdIGZpZWxkczsKKwlwcml2YXRlIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzOworCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzOworCisJLy8gRm9yIHRoZSBsaW5rIHdpdGggdGhlIHByaW5jaXBsZSBzdHJ1Y3R1cmUKKwlwcml2YXRlIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OworcHVibGljIEJpbmFyeVR5cGVCaW5kaW5nKFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCXRoaXMuY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgYmluYXJ5VHlwZS5nZXROYW1lKCkpOworCWNvbXB1dGVJZCgpOworCisJdGhpcy50YWdCaXRzIHw9IElzQmluYXJ5QmluZGluZzsKKwl0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7CisJdGhpcy5mUGFja2FnZSA9IHBhY2thZ2VCaW5kaW5nOworCXRoaXMuCWZpbGVOYW1lID0gYmluYXJ5VHlwZS5nZXRGaWxlTmFtZSgpOworCisJLy8gc291cmNlIG5hbWUgbXVzdCBiZSBvbmUgbmFtZSB3aXRob3V0ICIkIi4KKwljaGFyW10gcG9zc2libGVTb3VyY2VOYW1lID0gdGhpcy5jb21wb3VuZE5hbWVbdGhpcy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV07CisJaW50IHN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignJCcsIHBvc3NpYmxlU291cmNlTmFtZSkgKyAxOworCWlmIChzdGFydCA9PSAwKSB7CisJCXRoaXMuc291cmNlTmFtZSA9IHBvc3NpYmxlU291cmNlTmFtZTsKKwl9IGVsc2UgeworCQl0aGlzLnNvdXJjZU5hbWUgPSBuZXcgY2hhcltwb3NzaWJsZVNvdXJjZU5hbWUubGVuZ3RoIC0gc3RhcnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3NpYmxlU291cmNlTmFtZSwgc3RhcnQsIHRoaXMuc291cmNlTmFtZSwgMCwgdGhpcy5zb3VyY2VOYW1lLmxlbmd0aCk7CisJfQorCisJdGhpcy5tb2RpZmllcnMgPSBiaW5hcnlUeXBlLmdldE1vZGlmaWVycygpOworCWlmIChiaW5hcnlUeXBlLmlzSW50ZXJmYWNlKCkpCisJCXRoaXMubW9kaWZpZXJzIHw9IEFjY0ludGVyZmFjZTsKK30KKworcHVibGljIEZpZWxkQmluZGluZ1tdIGF2YWlsYWJsZUZpZWxkcygpIHsKKwlGaWVsZEJpbmRpbmdbXSBhdmFpbGFibGVGaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW2ZpZWxkcy5sZW5ndGhdOworCWludCBjb3VudCA9IDA7CisJCisJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoO2krKykgeworCQl0cnkgeworCQkJYXZhaWxhYmxlRmllbGRzW2NvdW50XSA9IHJlc29sdmVUeXBlRm9yKGZpZWxkc1tpXSk7CisJCQljb3VudCsrOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGEpeworCQl9CisJfQorCQorCVN5c3RlbS5hcnJheWNvcHkoYXZhaWxhYmxlRmllbGRzLCAwLCBhdmFpbGFibGVGaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworCXJldHVybiBhdmFpbGFibGVGaWVsZHM7Cit9CisKK3B1YmxpYyBNZXRob2RCaW5kaW5nW10gYXZhaWxhYmxlTWV0aG9kcygpIHsKKwlpZiAoKG1vZGlmaWVycyAmIEFjY1VucmVzb2x2ZWQpID09IDApCisJCXJldHVybiBtZXRob2RzOworCQkKKwlNZXRob2RCaW5kaW5nW10gYXZhaWxhYmxlTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW21ldGhvZHMubGVuZ3RoXTsKKwlpbnQgY291bnQgPSAwOworCQorCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7aSsrKSB7CisJCXRyeSB7CisJCQlhdmFpbGFibGVNZXRob2RzW2NvdW50XSA9IHJlc29sdmVUeXBlc0ZvcihtZXRob2RzW2ldKTsKKwkJCWNvdW50Kys7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gYSl7CisJCX0KKwl9CisJU3lzdGVtLmFycmF5Y29weShhdmFpbGFibGVNZXRob2RzLCAwLCBhdmFpbGFibGVNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJcmV0dXJuIGF2YWlsYWJsZU1ldGhvZHM7Cit9CisKK3ZvaWQgY2FjaGVQYXJ0c0Zyb20oSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgYm9vbGVhbiBuZWVkRmllbGRzQW5kTWV0aG9kcykgeworCWNoYXJbXSBzdXBlcmNsYXNzTmFtZSA9IGJpbmFyeVR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwlpZiAoc3VwZXJjbGFzc05hbWUgIT0gbnVsbCkKKwkJLy8gYXR0ZW1wdCB0byBmaW5kIHRoZSBzdXBlcmNsYXNzIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCXRoaXMuc3VwZXJjbGFzcyA9IGVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShzdXBlcmNsYXNzTmFtZSwgMCwgLTEpOworCisJY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lID0gYmluYXJ5VHlwZS5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpOworCWlmIChlbmNsb3NpbmdUeXBlTmFtZSAhPSBudWxsKSB7CisJCS8vIGF0dGVtcHQgdG8gZmluZCB0aGUgZW5jbG9zaW5nIHR5cGUgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZSAob3RoZXJ3aXNlIC0gcmVzb2x2ZSBpdCB3aGVuIHJlcXVlc3RlZCkKKwkJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKGVuY2xvc2luZ1R5cGVOYW1lLCAwLCAtMSk7CisJCXRoaXMudGFnQml0cyB8PSBNZW1iZXJUeXBlTWFzazsgICAvLyBtdXN0IGJlIGEgbWVtYmVyIHR5cGUgbm90IGEgdG9wLWxldmVsIG9yIGxvY2FsIHR5cGUKKwkJaWYgKHRoaXMuZW5jbG9zaW5nVHlwZSgpLmlzU3RyaWN0ZnAoKSkKKwkJCXRoaXMubW9kaWZpZXJzIHw9IEFjY1N0cmljdGZwOworCQlpZiAodGhpcy5lbmNsb3NpbmdUeXBlKCkuaXNEZXByZWNhdGVkKCkpCisJCQl0aGlzLm1vZGlmaWVycyB8PSBBY2NEZXByZWNhdGVkSW1wbGljaXRseTsKKwl9CisKKwl0aGlzLm1lbWJlclR5cGVzID0gTm9NZW1iZXJUeXBlczsKKwlJQmluYXJ5TmVzdGVkVHlwZVtdIG1lbWJlclR5cGVTdHJ1Y3R1cmVzID0gYmluYXJ5VHlwZS5nZXRNZW1iZXJUeXBlcygpOworCWlmIChtZW1iZXJUeXBlU3RydWN0dXJlcyAhPSBudWxsKSB7CisJCWludCBzaXplID0gbWVtYmVyVHlwZVN0cnVjdHVyZXMubGVuZ3RoOworCQlpZiAoc2l6ZSA+IDApIHsKKwkJCXRoaXMubWVtYmVyVHlwZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCS8vIGF0dGVtcHQgdG8gZmluZCBlYWNoIG1lbWJlciB0eXBlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCQkJdGhpcy5tZW1iZXJUeXBlc1tpXSA9IGVudmlyb25tZW50LmdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShtZW1iZXJUeXBlU3RydWN0dXJlc1tpXS5nZXROYW1lKCksIDAsIC0xKTsKKwkJfQorCX0KKworCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gTm9TdXBlckludGVyZmFjZXM7CisJY2hhcltdW10gaW50ZXJmYWNlTmFtZXMgPSBiaW5hcnlUeXBlLmdldEludGVyZmFjZU5hbWVzKCk7CisJaWYgKGludGVyZmFjZU5hbWVzICE9IG51bGwpIHsKKwkJaW50IHNpemUgPSBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisJCWlmIChzaXplID4gMCkgeworCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCS8vIGF0dGVtcHQgdG8gZmluZCBlYWNoIHN1cGVyaW50ZXJmYWNlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUgKG90aGVyd2lzZSAtIHJlc29sdmUgaXQgd2hlbiByZXF1ZXN0ZWQpCisJCQkJdGhpcy5zdXBlckludGVyZmFjZXNbaV0gPSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoaW50ZXJmYWNlTmFtZXNbaV0sIDAsIC0xKTsKKwkJfQorCX0KKwlpZiAobmVlZEZpZWxkc0FuZE1ldGhvZHMpeworCQljcmVhdGVGaWVsZHMoYmluYXJ5VHlwZS5nZXRGaWVsZHMoKSk7CisJCWNyZWF0ZU1ldGhvZHMoYmluYXJ5VHlwZS5nZXRNZXRob2RzKCkpOworCX0KK30KK3ByaXZhdGUgdm9pZCBjcmVhdGVGaWVsZHMoSUJpbmFyeUZpZWxkW10gaUZpZWxkcykgeworCXRoaXMuZmllbGRzID0gTm9GaWVsZHM7CisJaWYgKGlGaWVsZHMgIT0gbnVsbCkgeworCQlpbnQgc2l6ZSA9IGlGaWVsZHMubGVuZ3RoOworCQlpZiAoc2l6ZSA+IDApIHsKKwkJCXRoaXMuZmllbGRzID0gbmV3IEZpZWxkQmluZGluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJSUJpbmFyeUZpZWxkIGZpZWxkID0gaUZpZWxkc1tpXTsKKwkJCQl0aGlzLmZpZWxkc1tpXSA9CisJCQkJCW5ldyBGaWVsZEJpbmRpbmcoCisJCQkJCQlmaWVsZC5nZXROYW1lKCksCisJCQkJCQllbnZpcm9ubWVudC5nZXRUeXBlRnJvbVNpZ25hdHVyZShmaWVsZC5nZXRUeXBlTmFtZSgpLCAwLCAtMSksCisJCQkJCQlmaWVsZC5nZXRNb2RpZmllcnMoKSwKKwkJCQkJCXRoaXMsCisJCQkJCQlmaWVsZC5nZXRDb25zdGFudCgpKTsKKwkJCX0KKwkJfQorCX0KK30KK3ByaXZhdGUgTWV0aG9kQmluZGluZyBjcmVhdGVNZXRob2QoSUJpbmFyeU1ldGhvZCBtZXRob2QpIHsKKwlpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpIHwgQWNjVW5yZXNvbHZlZDsKKworCVJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zID0gTm9FeGNlcHRpb25zOworCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzID0gbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpOworCWlmIChleGNlcHRpb25UeXBlcyAhPSBudWxsKSB7CisJCWludCBzaXplID0gZXhjZXB0aW9uVHlwZXMubGVuZ3RoOworCQlpZiAoc2l6ZSA+IDApIHsKKwkJCWV4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCWV4Y2VwdGlvbnNbaV0gPSBlbnZpcm9ubWVudC5nZXRUeXBlRnJvbUNvbnN0YW50UG9vbE5hbWUoZXhjZXB0aW9uVHlwZXNbaV0sIDAsIC0xKTsKKwkJfQorCX0KKworCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IE5vUGFyYW1ldGVyczsKKwljaGFyW10gc2lnbmF0dXJlID0gbWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKTsgICAvLyBvZiB0aGUgZm9ybSAoSVtMamF2YS9qYW5nL1N0cmluZzspVgorCWludCBudW1PZlBhcmFtcyA9IDA7CisJY2hhciBuZXh0Q2hhcjsKKwlpbnQgaW5kZXggPSAwOyAgIC8vIGZpcnN0IGNoYXJhY3RlciBpcyBhbHdheXMgJygnIHNvIHNraXAgaXQKKwl3aGlsZSAoKG5leHRDaGFyID0gc2lnbmF0dXJlWysraW5kZXhdKSAhPSAnKScpIHsKKwkJaWYgKG5leHRDaGFyICE9ICdbJykgeworCQkJbnVtT2ZQYXJhbXMrKzsKKwkJCWlmIChuZXh0Q2hhciA9PSAnTCcpCisJCQkJd2hpbGUgKChuZXh0Q2hhciA9IHNpZ25hdHVyZVsrK2luZGV4XSkgIT0gJzsnKTsKKwkJfQorCX0KKworCS8vIElnbm9yZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIG1lbWJlciB0eXBlcy4KKwlpbnQgc3RhcnRJbmRleCA9IChtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmIGlzTWVtYmVyVHlwZSgpICYmICFpc1N0YXRpYygpKSA/IDEgOiAwOworCWludCBzaXplID0gbnVtT2ZQYXJhbXMgLSBzdGFydEluZGV4OworCWlmIChzaXplID4gMCkgeworCQlwYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW3NpemVdOworCQlpbmRleCA9IDE7CisJCWludCBlbmQgPSAwOyAgIC8vIGZpcnN0IGNoYXJhY3RlciBpcyBhbHdheXMgJygnIHNvIHNraXAgaXQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZlBhcmFtczsgaSsrKSB7CisJCQl3aGlsZSAoKG5leHRDaGFyID0gc2lnbmF0dXJlWysrZW5kXSkgPT0gJ1snKTsKKwkJCWlmIChuZXh0Q2hhciA9PSAnTCcpCisJCQkJd2hpbGUgKChuZXh0Q2hhciA9IHNpZ25hdHVyZVsrK2VuZF0pICE9ICc7Jyk7CisKKwkJCWlmIChpID49IHN0YXJ0SW5kZXgpICAgLy8gc2tpcCB0aGUgc3ludGhldGljIGFyZyBpZiBuZWNlc3NhcnkKKwkJCQlwYXJhbWV0ZXJzW2kgLSBzdGFydEluZGV4XSA9IGVudmlyb25tZW50LmdldFR5cGVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSwgaW5kZXgsIGVuZCk7CisJCQlpbmRleCA9IGVuZCArIDE7CisJCX0KKwl9CisKKwlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBudWxsOworCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKQorCQliaW5kaW5nID0gbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBwYXJhbWV0ZXJzLCBleGNlcHRpb25zLCB0aGlzKTsKKwllbHNlCisJCWJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZygKKwkJCW1vZGlmaWVycywKKwkJCW1ldGhvZC5nZXRTZWxlY3RvcigpLAorCQkJZW52aXJvbm1lbnQuZ2V0VHlwZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlLCBpbmRleCArIDEsIC0xKSwgICAvLyBpbmRleCBpcyBjdXJyZW50bHkgcG9pbnRpbmcgYXQgdGhlICcpJworCQkJcGFyYW1ldGVycywKKwkJCWV4Y2VwdGlvbnMsCisJCQl0aGlzKTsKKwlyZXR1cm4gYmluZGluZzsKK30KK3ByaXZhdGUgdm9pZCBjcmVhdGVNZXRob2RzKElCaW5hcnlNZXRob2RbXSBpTWV0aG9kcykgeworCWludCB0b3RhbCA9IDA7CisJaW50IGNsaW5pdEluZGV4ID0gLTE7CisJaWYgKGlNZXRob2RzICE9IG51bGwpIHsKKwkJdG90YWwgPSBpTWV0aG9kcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSB0b3RhbDsgLS1pID49IDA7KSB7CisJCQljaGFyW10gbWV0aG9kTmFtZSA9IGlNZXRob2RzW2ldLmdldFNlbGVjdG9yKCk7CisJCQlpZiAobWV0aG9kTmFtZVswXSA9PSAnPCcgJiYgbWV0aG9kTmFtZS5sZW5ndGggPT0gOCkgeyAvLyBDYW4gb25seSBtYXRjaCA8Y2xpbml0PgorCQkJCXRvdGFsLS07CisJCQkJY2xpbml0SW5kZXggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICh0b3RhbCA9PSAwKSB7CisJCXRoaXMubWV0aG9kcyA9IE5vTWV0aG9kczsKKwkJcmV0dXJuOworCX0KKworCXRoaXMubWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW3RvdGFsXTsKKwlpbnQgbmV4dCA9IDA7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGlNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoaSAhPSBjbGluaXRJbmRleCkKKwkJCXRoaXMubWV0aG9kc1tuZXh0KytdID0gY3JlYXRlTWV0aG9kKGlNZXRob2RzW2ldKTsKKwltb2RpZmllcnMgfD0gQWNjVW5yZXNvbHZlZDsgLy8gdW50aWwgbWV0aG9kcygpIGlzIHNlbnQKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBlbmNsb3NpbmcgdHlwZS4uLiBudWxsIGlmIHRoZSByZWNlaXZlciBpcyBhIHRvcCBsZXZlbCB0eXBlLgorKgorKiBOT1RFOiBlbmNsb3NpbmdUeXBlIG9mIGEgYmluYXJ5IHR5cGUgaXMgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKyovCisKK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUoKSB7CisJaWYgKGVuY2xvc2luZ1R5cGUgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJaWYgKGVuY2xvc2luZ1R5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKKwkJZW5jbG9zaW5nVHlwZSA9ICgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIGVuY2xvc2luZ1R5cGUpLnJlc29sdmUoZW52aXJvbm1lbnQpOworCXJldHVybiBlbmNsb3NpbmdUeXBlOworfQorLy8gTk9URTogdGhlIHR5cGUgb2YgZWFjaCBmaWVsZCBvZiBhIGJpbmFyeSB0eXBlIGlzIHJlc29sdmVkIHdoZW4gbmVlZGVkCisKK3B1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHMoKSB7CisJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJcmVzb2x2ZVR5cGVGb3IoZmllbGRzW2ldKTsKKwlyZXR1cm4gZmllbGRzOworfQorLy8gTk9URTogdGhlIHJldHVybiB0eXBlLCBhcmcgJiBleGNlcHRpb24gdHlwZXMgb2YgZWFjaCBtZXRob2Qgb2YgYSBiaW5hcnkgdHlwZSBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKworcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0RXhhY3RDb25zdHJ1Y3RvcihUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKKwlpbnQgYXJnQ291bnQgPSBhcmd1bWVudFR5cGVzLmxlbmd0aDsKKwluZXh0TWV0aG9kIDogZm9yIChpbnQgbSA9IG1ldGhvZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQlpZiAobWV0aG9kLnNlbGVjdG9yID09IENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSAmJiBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT0gYXJnQ291bnQpIHsKKwkJCXJlc29sdmVUeXBlc0ZvcihtZXRob2QpOworCQkJVHlwZUJpbmRpbmdbXSB0b01hdGNoID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJCQlmb3IgKGludCBwID0gMDsgcCA8IGFyZ0NvdW50OyBwKyspCisJCQkJaWYgKHRvTWF0Y2hbcF0gIT0gYXJndW1lbnRUeXBlc1twXSkKKwkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKwkJCXJldHVybiBtZXRob2Q7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIGJpbmFyeSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAorLy8gc2VhcmNoZXMgdXAgdGhlIGhpZXJhcmNoeSBhcyBsb25nIGFzIG5vIHBvdGVudGlhbCAoYnV0IG5vdCBleGFjdCkgbWF0Y2ggd2FzIGZvdW5kLgorCitwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRFeGFjdE1ldGhvZChjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcykgeworCWludCBhcmdDb3VudCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOworCWludCBzZWxlY3Rvckxlbmd0aCA9IHNlbGVjdG9yLmxlbmd0aDsKKwlib29sZWFuIGZvdW5kTm90aGluZyA9IHRydWU7CisJbmV4dE1ldGhvZCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJaWYgKG1ldGhvZC5zZWxlY3Rvci5sZW5ndGggPT0gc2VsZWN0b3JMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBzZWxlY3RvcikpIHsKKwkJCWZvdW5kTm90aGluZyA9IGZhbHNlOyAvLyBpbm5lciB0eXBlIGxvb2t1cHMgbXVzdCBrbm93IHRoYXQgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgZXhpc3RzCisJCQlpZiAobWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IGFyZ0NvdW50KSB7CisJCQkJcmVzb2x2ZVR5cGVzRm9yKG1ldGhvZCk7CisJCQkJVHlwZUJpbmRpbmdbXSB0b01hdGNoID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBhcmdDb3VudDsgcCsrKQorCQkJCQlpZiAodG9NYXRjaFtwXSAhPSBhcmd1bWVudFR5cGVzW3BdKQorCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQlyZXR1cm4gbWV0aG9kOworCQkJfQorCQl9CisJfQorCisJaWYgKGZvdW5kTm90aGluZykgeworCQlpZiAoaXNJbnRlcmZhY2UoKSkgeworCQkJIGlmIChzdXBlckludGVyZmFjZXMubGVuZ3RoID09IDEpCisJCQkJcmV0dXJuIHN1cGVySW50ZXJmYWNlc1swXS5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcyk7CisJCX0gZWxzZSBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCQlyZXR1cm4gc3VwZXJjbGFzcy5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcyk7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvLyBOT1RFOiB0aGUgdHlwZSBvZiBhIGZpZWxkIG9mIGEgYmluYXJ5IHR5cGUgaXMgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKworcHVibGljIEZpZWxkQmluZGluZyBnZXRGaWVsZChjaGFyW10gZmllbGROYW1lKSB7CisJaW50IGZpZWxkTGVuZ3RoID0gZmllbGROYW1lLmxlbmd0aDsKKwlmb3IgKGludCBmID0gZmllbGRzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCWNoYXJbXSBuYW1lID0gZmllbGRzW2ZdLm5hbWU7CisJCWlmIChuYW1lLmxlbmd0aCA9PSBmaWVsZExlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhuYW1lLCBmaWVsZE5hbWUpKQorCQkJcmV0dXJuIHJlc29sdmVUeXBlRm9yKGZpZWxkc1tmXSk7CisJfQorCXJldHVybiBudWxsOworfQorLy8gTk9URTogdGhlIHJldHVybiB0eXBlLCBhcmcgJiBleGNlcHRpb24gdHlwZXMgb2YgZWFjaCBtZXRob2Qgb2YgYSBiaW5hcnkgdHlwZSBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKworcHVibGljIE1ldGhvZEJpbmRpbmdbXSBnZXRNZXRob2RzKGNoYXJbXSBzZWxlY3RvcikgeworCWludCBjb3VudCA9IDA7CisJaW50IGxhc3RJbmRleCA9IC0xOworCWludCBzZWxlY3Rvckxlbmd0aCA9IHNlbGVjdG9yLmxlbmd0aDsKKwlmb3IgKGludCBtID0gMCwgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IG0gPCBsZW5ndGg7IG0rKykgeworCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbbV07CisJCWlmIChtZXRob2Quc2VsZWN0b3IubGVuZ3RoID09IHNlbGVjdG9yTGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgc2VsZWN0b3IpKSB7CisJCQlyZXNvbHZlVHlwZXNGb3IobWV0aG9kKTsKKwkJCWNvdW50Kys7CisJCQlsYXN0SW5kZXggPSBtOworCQl9CisJfQorCWlmIChjb3VudCA9PSAxKQorCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmdbXSB7bWV0aG9kc1tsYXN0SW5kZXhdfTsKKwlpZiAoY291bnQgPiAwKSB7CisJCU1ldGhvZEJpbmRpbmdbXSByZXN1bHQgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF07CisJCWNvdW50ID0gMDsKKwkJZm9yIChpbnQgbSA9IDA7IG0gPD0gbGFzdEluZGV4OyBtKyspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCWlmIChtZXRob2Quc2VsZWN0b3IubGVuZ3RoID09IHNlbGVjdG9yTGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgc2VsZWN0b3IpKQorCQkJCXJlc3VsdFtjb3VudCsrXSA9IG1ldGhvZDsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gTm9NZXRob2RzOworfQorLy8gTk9URTogbWVtYmVyIHR5cGVzIG9mIGJpbmFyeSB0eXBlcyBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKworcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcygpIHsKKwlmb3IgKGludCBpID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChtZW1iZXJUeXBlc1tpXSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQorCQkJbWVtYmVyVHlwZXNbaV0gPSAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkucmVzb2x2ZShlbnZpcm9ubWVudCk7CisJcmV0dXJuIG1lbWJlclR5cGVzOworfQorLy8gTk9URTogdGhlIHJldHVybiB0eXBlLCBhcmcgJiBleGNlcHRpb24gdHlwZXMgb2YgZWFjaCBtZXRob2Qgb2YgYSBiaW5hcnkgdHlwZSBhcmUgcmVzb2x2ZWQgd2hlbiBuZWVkZWQKKworcHVibGljIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzKCkgeworCWlmICgobW9kaWZpZXJzICYgQWNjVW5yZXNvbHZlZCkgPT0gMCkKKwkJcmV0dXJuIG1ldGhvZHM7CisKKwlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJcmVzb2x2ZVR5cGVzRm9yKG1ldGhvZHNbaV0pOworCW1vZGlmaWVycyBePSBBY2NVbnJlc29sdmVkOworCXJldHVybiBtZXRob2RzOworfQorcHJpdmF0ZSBUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlQmluZGluZyB0eXBlKSB7CisJaWYgKHR5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKKwkJcmV0dXJuICgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIHR5cGUpLnJlc29sdmUoZW52aXJvbm1lbnQpOworCWlmICh0eXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKSB7CisJCUFycmF5QmluZGluZyBhcnJheSA9IChBcnJheUJpbmRpbmcpIHR5cGU7CisJCWlmIChhcnJheS5sZWFmQ29tcG9uZW50VHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQorCQkJYXJyYXkubGVhZkNvbXBvbmVudFR5cGUgPSAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSBhcnJheS5sZWFmQ29tcG9uZW50VHlwZSkucmVzb2x2ZShlbnZpcm9ubWVudCk7CisJfQorCXJldHVybiB0eXBlOworfQorcHJpdmF0ZSBGaWVsZEJpbmRpbmcgcmVzb2x2ZVR5cGVGb3IoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJZmllbGQudHlwZSA9IHJlc29sdmVUeXBlKGZpZWxkLnR5cGUpOworCXJldHVybiBmaWVsZDsKK30KK3ByaXZhdGUgTWV0aG9kQmluZGluZyByZXNvbHZlVHlwZXNGb3IoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwlpZiAoKG1ldGhvZC5tb2RpZmllcnMgJiBBY2NVbnJlc29sdmVkKSA9PSAwKQorCQlyZXR1cm4gbWV0aG9kOworCisJaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpKQorCQltZXRob2QucmV0dXJuVHlwZSA9IHJlc29sdmVUeXBlKG1ldGhvZC5yZXR1cm5UeXBlKTsKKwlmb3IgKGludCBpID0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoOyAtLWkgPj0gMDspCisJCW1ldGhvZC5wYXJhbWV0ZXJzW2ldID0gcmVzb2x2ZVR5cGUobWV0aG9kLnBhcmFtZXRlcnNbaV0pOworCWZvciAoaW50IGkgPSBtZXRob2QudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKG1ldGhvZC50aHJvd25FeGNlcHRpb25zW2ldIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCisJCQltZXRob2QudGhyb3duRXhjZXB0aW9uc1tpXSA9ICgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIG1ldGhvZC50aHJvd25FeGNlcHRpb25zW2ldKS5yZXNvbHZlKGVudmlyb25tZW50KTsKKwltZXRob2QubW9kaWZpZXJzIF49IEFjY1VucmVzb2x2ZWQ7CisJcmV0dXJuIG1ldGhvZDsKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzdXBlcmNsYXNzLi4uIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIE9iamVjdCBvciBhbiBpbnRlcmZhY2UuCisqCisqIE5PVEU6IHN1cGVyY2xhc3Mgb2YgYSBiaW5hcnkgdHlwZSBpcyByZXNvbHZlZCB3aGVuIG5lZWRlZAorKi8KKworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcygpIHsKKwlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKQorCQlyZXR1cm4gbnVsbDsKKwlpZiAoc3VwZXJjbGFzcyBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQorCQlzdXBlcmNsYXNzID0gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgc3VwZXJjbGFzcykucmVzb2x2ZShlbnZpcm9ubWVudCk7CisJcmV0dXJuIHN1cGVyY2xhc3M7Cit9CisvLyBOT1RFOiBzdXBlckludGVyZmFjZXMgb2YgYmluYXJ5IHR5cGVzIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAorCitwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcygpIHsKKwlmb3IgKGludCBpID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoc3VwZXJJbnRlcmZhY2VzW2ldIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCisJCQlzdXBlckludGVyZmFjZXNbaV0gPSAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSBzdXBlckludGVyZmFjZXNbaV0pLnJlc29sdmUoZW52aXJvbm1lbnQpOworCXJldHVybiBzdXBlckludGVyZmFjZXM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCWlmIChpc0RlcHJlY2F0ZWQoKSkgcyArPSAiZGVwcmVjYXRlZCAiOyAvLyROT04tTkxTLTEkCisJaWYgKGlzUHVibGljKCkpIHMgKz0gInB1YmxpYyAiOyAvLyROT04tTkxTLTEkCisJaWYgKGlzUHJvdGVjdGVkKCkpIHMgKz0gInByb3RlY3RlZCAiOyAvLyROT04tTkxTLTEkCisJaWYgKGlzUHJpdmF0ZSgpKSBzICs9ICJwcml2YXRlICI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoaXNBYnN0cmFjdCgpICYmIGlzQ2xhc3MoKSkgcyArPSAiYWJzdHJhY3QgIjsgLy8kTk9OLU5MUy0xJAorCWlmIChpc1N0YXRpYygpICYmIGlzTmVzdGVkVHlwZSgpKSBzICs9ICJzdGF0aWMgIjsgLy8kTk9OLU5MUy0xJAorCWlmIChpc0ZpbmFsKCkpIHMgKz0gImZpbmFsICI7IC8vJE5PTi1OTFMtMSQKKworCXMgKz0gaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UgIiA6ICJjbGFzcyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlzICs9IChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCBUWVBFIjsgLy8kTk9OLU5MUy0xJAorCisJcyArPSAiXG5cdGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAorCXMgKz0gKHN1cGVyY2xhc3MgIT0gbnVsbCkgPyBzdXBlcmNsYXNzLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSI7IC8vJE5PTi1OTFMtMSQKKworCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQlzICs9ICJcblx0aW1wbGVtZW50cyA6ICI7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaSAgPiAwKQorCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCQlzICs9IChzdXBlckludGVyZmFjZXNbaV0gIT0gbnVsbCkgPyBzdXBlckludGVyZmFjZXNbaV0uZGVidWdOYW1lKCkgOiAiTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcyArPSAiTlVMTCBTVVBFUklOVEVSRkFDRVMiOyAvLyROT04tTkxTLTEkCisJfQorCisJaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgeworCQlzICs9ICJcblx0ZW5jbG9zaW5nIHR5cGUgOiAiOyAvLyROT04tTkxTLTEkCisJCXMgKz0gZW5jbG9zaW5nVHlwZS5kZWJ1Z05hbWUoKTsKKwl9CisKKwlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJaWYgKGZpZWxkcyAhPSBOb0ZpZWxkcykgeworCQkJcyArPSAiXG4vKiAgIGZpZWxkcyAgICovIjsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQlzICs9IChmaWVsZHNbaV0gIT0gbnVsbCkgPyAiXG4iICsgZmllbGRzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIEZJRUxEIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9IGVsc2UgeworCQlzICs9ICJOVUxMIEZJRUxEUyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCWlmIChtZXRob2RzICE9IE5vTWV0aG9kcykgeworCQkJcyArPSAiXG4vKiAgIG1ldGhvZHMgICAqLyI7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCXMgKz0gKG1ldGhvZHNbaV0gIT0gbnVsbCkgPyAiXG4iICsgbWV0aG9kc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBNRVRIT0QiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0gZWxzZSB7CisJCXMgKz0gIk5VTEwgTUVUSE9EUyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQlpZiAobWVtYmVyVHlwZXMgIT0gTm9NZW1iZXJUeXBlcykgeworCQkJcyArPSAiXG4vKiAgIG1lbWJlcnMgICAqLyI7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCQlzICs9IChtZW1iZXJUeXBlc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBtZW1iZXJUeXBlc1tpXS50b1N0cmluZygpIDogIlxuTlVMTCBUWVBFIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9IGVsc2UgeworCQlzICs9ICJOVUxMIE1FTUJFUiBUWVBFUyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlzICs9ICJcblxuXG4iOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmRjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmcuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZyBpbXBsZW1lbnRzIEJpbmRpbmdJZHMsIENvbXBpbGVyTW9kaWZpZXJzLCBQcm9ibGVtUmVhc29ucyB7CisvKiBBUEkKKyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgorKgorKiBOb3RlOiBEbyBOT1QgZXhwZWN0IHRoaXMgdG8gYmUgdXNlZCB2ZXJ5IG9mdGVuLi4uIG9ubHkgaW4gc3dpdGNoIHN0YXRlbWVudHMgd2l0aAorKiBtb3JlIHRoYW4gMiBwb3NzaWJsZSBjaG9pY2VzLgorKi8KKworcHVibGljIGFic3RyYWN0IGludCBiaW5kaW5nVHlwZSgpOworLyogQVBJCisqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBub3QgYSBwcm9ibGVtIGJpbmRpbmcKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRCaW5kaW5nKCkgeworCXJldHVybiBwcm9ibGVtSWQoKSA9PSBOb0Vycm9yOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCisqLworCitwdWJsaWMgaW50IHByb2JsZW1JZCgpIHsKKwlyZXR1cm4gTm9FcnJvcjsKK30KKy8qIEFuc3dlciBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCisqLworCitwdWJsaWMgYWJzdHJhY3QgY2hhcltdIHJlYWRhYmxlTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nSWRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmdJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE4MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nSWRzLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworcHVibGljIGludGVyZmFjZSBCaW5kaW5nSWRzIHsKKwlmaW5hbCBpbnQgRklFTEQgPSAxOworCWZpbmFsIGludCBMT0NBTCA9IDI7CisJZmluYWwgaW50IFZBUklBQkxFID0gRklFTEQgfCBMT0NBTDsKKwlmaW5hbCBpbnQgVFlQRSA9IDQ7CisJZmluYWwgaW50IE1FVEhPRCA9IDg7CisJZmluYWwgaW50IFBBQ0tBR0UgPSAxNjsKKwlmaW5hbCBpbnQgSU1QT1JUID0gMzI7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jsb2NrU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmxvY2tTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmUwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jsb2NrU2NvcGUuamF2YQpAQCAtMCwwICsxLDE0NDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQmxvY2tTY29wZSBleHRlbmRzIFNjb3BlIHsKKworCS8vIExvY2FsIHZhcmlhYmxlIG1hbmFnZW1lbnQKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmdbXSBsb2NhbHM7CisJcHVibGljIGludCBsb2NhbEluZGV4OyAvLyBwb3NpdGlvbiBmb3IgbmV4dCB2YXJpYWJsZQorCXB1YmxpYyBpbnQgc3RhcnRJbmRleDsJLy8gc3RhcnQgcG9zaXRpb24gaW4gdGhpcyBzY29wZSAtIGZvciBvcmRlcmluZyBzY29wZXMgdnMuIHZhcmlhYmxlcworCXB1YmxpYyBpbnQgb2Zmc2V0OyAvLyBmb3IgdmFyaWFibGUgYWxsb2NhdGlvbiB0aHJvdWdob3V0IHNjb3BlcworCXB1YmxpYyBpbnQgbWF4T2Zmc2V0OyAvLyBmb3IgdmFyaWFibGUgYWxsb2NhdGlvbiB0aHJvdWdob3V0IHNjb3BlcworCisJLy8gZmluYWxseSBzY29wZXMgbXVzdCBiZSBzaGlmdGVkIGJlaGluZCByZXNwZWN0aXZlIHRyeSBzY29wZQorCXB1YmxpYyBCbG9ja1Njb3BlW10gc2hpZnRTY29wZXM7IAorCisJcHVibGljIGZpbmFsIHN0YXRpYyBWYXJpYWJsZUJpbmRpbmdbXSBFbXVsYXRpb25QYXRoVG9JbXBsaWNpdFRoaXMgPSB7fTsKKworCXB1YmxpYyBTY29wZVtdIHN1YnNjb3BlcyA9IG5ldyBTY29wZVsxXTsgLy8gbmVlZCBhY2Nlc3MgZnJvbSBjb2RlIGFzc2lzdAorCXB1YmxpYyBpbnQgc2NvcGVJbmRleCA9IDA7IC8vIG5lZWQgYWNjZXNzIGZyb20gY29kZSBhc3Npc3QKKworCXByb3RlY3RlZCBCbG9ja1Njb3BlKGludCBraW5kLCBTY29wZSBwYXJlbnQpIHsKKworCQlzdXBlcihraW5kLCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBCbG9ja1Njb3BlKEJsb2NrU2NvcGUgcGFyZW50KSB7CisKKwkJdGhpcyhwYXJlbnQsIHRydWUpOworCX0KKworCXB1YmxpYyBCbG9ja1Njb3BlKEJsb2NrU2NvcGUgcGFyZW50LCBib29sZWFuIGFkZFRvUGFyZW50U2NvcGUpIHsKKworCQl0aGlzKEJMT0NLX1NDT1BFLCBwYXJlbnQpOworCQlsb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbNV07CisJCWlmIChhZGRUb1BhcmVudFNjb3BlKSBwYXJlbnQuYWRkU3Vic2NvcGUodGhpcyk7CisJCXRoaXMuc3RhcnRJbmRleCA9IHBhcmVudC5sb2NhbEluZGV4OworCX0KKworCXB1YmxpYyBCbG9ja1Njb3BlKEJsb2NrU2NvcGUgcGFyZW50LCBpbnQgdmFyaWFibGVDb3VudCkgeworCisJCXRoaXMoQkxPQ0tfU0NPUEUsIHBhcmVudCk7CisJCWxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1t2YXJpYWJsZUNvdW50XTsKKwkJcGFyZW50LmFkZFN1YnNjb3BlKHRoaXMpOworCQl0aGlzLnN0YXJ0SW5kZXggPSBwYXJlbnQubG9jYWxJbmRleDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGNsYXNzIHNjb3BlICYgYmluZGluZyBmb3IgdGhlIGFub255bW91cyB0eXBlLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEFub255bW91c1R5cGUoCisJCVR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlLAorCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyQmluZGluZykgeworCisJCUNsYXNzU2NvcGUgYW5vbnltb3VzQ2xhc3NTY29wZSA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIGFub255bW91c1R5cGUpOworCQlhbm9ueW1vdXNDbGFzc1Njb3BlLmJ1aWxkQW5vbnltb3VzVHlwZUJpbmRpbmcoCisJCQllbmNsb3NpbmdTb3VyY2VUeXBlKCksCisJCQlzdXBlckJpbmRpbmcpOworCX0KKworCS8qIENyZWF0ZSB0aGUgY2xhc3Mgc2NvcGUgJiBiaW5kaW5nIGZvciB0aGUgbG9jYWwgdHlwZS4KKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCBhZGRMb2NhbFR5cGUoVHlwZURlY2xhcmF0aW9uIGxvY2FsVHlwZSkgeworCisJCS8vIGNoZWNrIHRoYXQgdGhlIGxvY2FsVHlwZSBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJZG8geworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGUuc291cmNlTmFtZSwgbG9jYWxUeXBlLm5hbWUpKSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGlkaW5nRW5jbG9zaW5nVHlwZShsb2NhbFR5cGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXR5cGUgPSB0eXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsKKworCQkvLyBjaGVjayB0aGF0IHRoZSBsb2NhbFR5cGUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNpYmxpbmcgbG9jYWwgdHlwZQorCQlTY29wZSBzY29wZSA9IHRoaXM7CisJCWRvIHsKKwkJCWlmICgoKEJsb2NrU2NvcGUpIHNjb3BlKS5maW5kTG9jYWxUeXBlKGxvY2FsVHlwZS5uYW1lKSAhPSBudWxsKSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTmVzdGVkVHlwZShsb2NhbFR5cGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSB3aGlsZSAoKHNjb3BlID0gc2NvcGUucGFyZW50KSBpbnN0YW5jZW9mIEJsb2NrU2NvcGUpOworCisJCUNsYXNzU2NvcGUgbG9jYWxUeXBlU2NvcGUgPSBuZXcgQ2xhc3NTY29wZSh0aGlzLCBsb2NhbFR5cGUpOworCQlsb2NhbFR5cGVTY29wZS5idWlsZExvY2FsVHlwZUJpbmRpbmcoZW5jbG9zaW5nU291cmNlVHlwZSgpKTsKKwkJYWRkU3Vic2NvcGUobG9jYWxUeXBlU2NvcGUpOworCX0KKworCS8qIEluc2VydCBhIGxvY2FsIHZhcmlhYmxlIGludG8gYSBnaXZlbiBzY29wZSwgdXBkYXRpbmcgaXRzIHBvc2l0aW9uCisJICogYW5kIGNoZWNraW5nIHRoZXJlIGFyZSBub3QgdG9vIG1hbnkgbG9jYWxzIG9yIGFyZ3VtZW50cyBhbGxvY2F0ZWQuCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgYWRkTG9jYWxWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nKSB7CisKKwkJY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JWYXJpYWJsZShiaW5kaW5nKTsKKworCQkvLyBpbnNlcnQgbG9jYWwgaW4gc2NvcGUKKwkJaWYgKGxvY2FsSW5kZXggPT0gbG9jYWxzLmxlbmd0aCkKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJbG9jYWxzLAorCQkJCTAsCisJCQkJKGxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1tsb2NhbEluZGV4ICogMl0pLAorCQkJCTAsCisJCQkJbG9jYWxJbmRleCk7CisJCWxvY2Fsc1tsb2NhbEluZGV4KytdID0gYmluZGluZzsKKworCQkvLyB1cGRhdGUgbG9jYWwgdmFyaWFibGUgYmluZGluZyAKKwkJYmluZGluZy5kZWNsYXJpbmdTY29wZSA9IHRoaXM7CisJCWJpbmRpbmcuaWQgPSB0aGlzLm91dGVyTW9zdE1ldGhvZFNjb3BlKCkuYW5hbHlzaXNJbmRleCsrOworCQkvLyBzaGFyZSB0aGUgb3V0ZXJtb3N0IG1ldGhvZCBzY29wZSBhbmFseXNpc0luZGV4CisJfQorCisJcHVibGljIHZvaWQgYWRkU3Vic2NvcGUoU2NvcGUgY2hpbGRTY29wZSkgeworCQlpZiAoc2NvcGVJbmRleCA9PSBzdWJzY29wZXMubGVuZ3RoKQorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlzdWJzY29wZXMsCisJCQkJMCwKKwkJCQkoc3Vic2NvcGVzID0gbmV3IFNjb3BlW3Njb3BlSW5kZXggKiAyXSksCisJCQkJMCwKKwkJCQlzY29wZUluZGV4KTsKKwkJc3Vic2NvcGVzW3Njb3BlSW5kZXgrK10gPSBjaGlsZFNjb3BlOworCX0KKworCS8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBzdWl0YWJsZSBmb3IgYXNzaWduaW5nIGZpbmFsIGJsYW5rIGZpZWxkcy4KKwkgKgorCSAqIGkuZS4gaXMgaW5zaWRlIGFuIGluaXRpYWxpemVyLCBhIGNvbnN0cnVjdG9yIG9yIGEgY2xpbml0IAorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChGaWVsZEJpbmRpbmcgYmluZGluZykgeworCisJCWlmIChlbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gYmluZGluZy5kZWNsYXJpbmdDbGFzcykKKwkJCXJldHVybiBmYWxzZTsKKworCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IG1ldGhvZFNjb3BlKCk7CisJCWlmIChtZXRob2RTY29wZS5pc1N0YXRpYyAhPSBiaW5kaW5nLmlzU3RhdGljKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBtZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyKCkgLy8gaW5zaWRlIGluaXRpYWxpemVyCisJCXx8ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kU2NvcGUucmVmZXJlbmNlQ29udGV4dCkKKwkJCS5pc0luaXRpYWxpemF0aW9uTWV0aG9kKCk7CisJCS8vIGluc2lkZSBjb25zdHJ1Y3RvciBvciBjbGluaXQKKwl9CisJU3RyaW5nIGJhc2ljVG9TdHJpbmcoaW50IHRhYikgeworCQlTdHJpbmcgbmV3TGluZSA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IHRhYjsgLS1pID49IDA7KQorCQkJbmV3TGluZSArPSAiXHQiOyAvLyROT04tTkxTLTEkCisKKwkJU3RyaW5nIHMgPSBuZXdMaW5lICsgIi0tLSBCbG9jayBTY29wZSAtLS0iOyAvLyROT04tTkxTLTEkCisJCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJAorCQlzICs9IG5ld0xpbmUgKyAibG9jYWxzOiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEluZGV4OyBpKyspCisJCQlzICs9IG5ld0xpbmUgKyAiXHQiICsgbG9jYWxzW2ldLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKKwkJcyArPSBuZXdMaW5lICsgInN0YXJ0SW5kZXggPSAiICsgc3RhcnRJbmRleDsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyB2YXJCaW5kaW5nKSB7CisKKwkJaW50IG1vZGlmaWVycyA9IHZhckJpbmRpbmcubW9kaWZpZXJzOworCQlpZiAoKG1vZGlmaWVycyAmIEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCAmJiB2YXJCaW5kaW5nLmRlY2xhcmF0aW9uICE9IG51bGwpeworCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTW9kaWZpZXJGb3JWYXJpYWJsZSh2YXJCaW5kaW5nLmRlY2xhcmF0aW9uLCB0aGlzIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpOworCQl9CisJCWludCByZWFsTW9kaWZpZXJzID0gbW9kaWZpZXJzICYgQWNjSnVzdEZsYWc7CisJCQorCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH5BY2NGaW5hbDsKKwkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCAmJiB2YXJCaW5kaW5nLmRlY2xhcmF0aW9uICE9IG51bGwpeyAKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvclZhcmlhYmxlKHZhckJpbmRpbmcuZGVjbGFyYXRpb24sIHRoaXMgaW5zdGFuY2VvZiBNZXRob2RTY29wZSk7CisJCX0KKwkJdmFyQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCisJLyogQ29tcHV0ZSB2YXJpYWJsZSBwb3NpdGlvbnMgaW4gc2NvcGVzIGdpdmVuIGFuIGluaXRpYWwgcG9zaXRpb24gb2Zmc2V0CisJICogaWdub3JpbmcgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KKwkgKiAKKwkgKiBTcGVjaWFsIHRyZWF0bWVudCB0byBoYXZlIFRyeSBzZWNyZXQgcmV0dXJuIGFkZHJlc3MgdmFyaWFibGVzIGxvY2F0ZWQgYXQgbm9uCisJICogY29sbGlkaW5nIHBvc2l0aW9ucy4gUmV0dXJuIGFkZHJlc3NlcyBhcmUgbm90IGFsbG9jYXRlZCBpbml0aWFsbHksIGJ1dCBnYXRoZXJlZAorCSAqIGFuZCBhbGxvY2F0ZWQgYmVoaW5kIGFsbCBvdGhlciB2YXJpYWJsZXMuCisJICovCisJcHVibGljIHZvaWQgY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoCisJCWludCBpbml0T2Zmc2V0LAorCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKworCQl0aGlzLm9mZnNldCA9IGluaXRPZmZzZXQ7CisJCXRoaXMubWF4T2Zmc2V0ID0gaW5pdE9mZnNldDsKKworCQkvLyBsb2NhbCB2YXJpYWJsZSBpbml0CisJCWludCBpbG9jYWwgPSAwLCBtYXhMb2NhbHMgPSAwLCBsb2NhbHNMZW5ndGggPSBsb2NhbHMubGVuZ3RoOworCQl3aGlsZSAoKG1heExvY2FscyA8IGxvY2Fsc0xlbmd0aCkgJiYgKGxvY2Fsc1ttYXhMb2NhbHNdICE9IG51bGwpKQorCQkJbWF4TG9jYWxzKys7CisJCWJvb2xlYW4gaGFzTW9yZVZhcmlhYmxlcyA9IG1heExvY2FscyA+IDA7CisKKwkJLy8gc2NvcGUgaW5pdAorCQlpbnQgaXNjb3BlID0gMCwgbWF4U2NvcGVzID0gMCwgc3Vic2NvcGVzTGVuZ3RoID0gc3Vic2NvcGVzLmxlbmd0aDsKKwkJd2hpbGUgKChtYXhTY29wZXMgPCBzdWJzY29wZXNMZW5ndGgpICYmIChzdWJzY29wZXNbbWF4U2NvcGVzXSAhPSBudWxsKSkKKwkJCW1heFNjb3BlcysrOworCQlib29sZWFuIGhhc01vcmVTY29wZXMgPSBtYXhTY29wZXMgPiAwOworCisJCS8vIGl0ZXJhdGUgc2NvcGVzIGFuZCB2YXJpYWJsZXMgaW4gcGFyYWxsZWwKKwkJd2hpbGUgKGhhc01vcmVWYXJpYWJsZXMgfHwgaGFzTW9yZVNjb3BlcykgeworCQkJaWYgKGhhc01vcmVTY29wZXMKKwkJCQkmJiAoIWhhc01vcmVWYXJpYWJsZXMgfHwgKHN1YnNjb3Blc1tpc2NvcGVdLnN0YXJ0SW5kZXgoKSA8PSBpbG9jYWwpKSkgeworCQkJCS8vIGNvbnNpZGVyIHN1YnNjb3BlIGZpcnN0CisJCQkJaWYgKHN1YnNjb3Blc1tpc2NvcGVdIGluc3RhbmNlb2YgQmxvY2tTY29wZSkgeworCQkJCQlCbG9ja1Njb3BlIHN1YnNjb3BlID0gKEJsb2NrU2NvcGUpIHN1YnNjb3Blc1tpc2NvcGVdOworCQkJCQlpbnQgc3ViT2Zmc2V0ID0gc3Vic2NvcGUuc2hpZnRTY29wZXMgPT0gbnVsbCA/IHRoaXMub2Zmc2V0IDogc3Vic2NvcGUubWF4U2hpZnRlZE9mZnNldCgpOworCQkJCQlzdWJzY29wZS5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucyhzdWJPZmZzZXQsIGNvZGVTdHJlYW0pOworCQkJCQlpZiAoc3Vic2NvcGUubWF4T2Zmc2V0ID4gdGhpcy5tYXhPZmZzZXQpCisJCQkJCQl0aGlzLm1heE9mZnNldCA9IHN1YnNjb3BlLm1heE9mZnNldDsKKwkJCQl9CisJCQkJaGFzTW9yZVNjb3BlcyA9ICsraXNjb3BlIDwgbWF4U2NvcGVzOworCQkJfSBlbHNlIHsKKwkJCQkvLyBjb25zaWRlciB2YXJpYWJsZSBmaXJzdAorCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxzW2lsb2NhbF07CisKKwkJCQkvLyBjaGVjayBpZiB2YXJpYWJsZSBpcyBhY3R1YWxseSB1c2VkLCBhbmQgbWF5IGZvcmNlIGl0IHRvIGJlIHByZXNlcnZlZAorCQkJCWJvb2xlYW4gZ2VuZXJhdGVzTG9jYWwgPQorCQkJCQkobG9jYWwudXNlZCAmJiAobG9jYWwuY29uc3RhbnQgPT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSkgfHwgbG9jYWwuaXNBcmd1bWVudDsKKwkJCQlpZiAoIWxvY2FsLnVzZWQKKwkJCQkJJiYgKGxvY2FsLmRlY2xhcmF0aW9uICE9IG51bGwpIC8vIHVudXNlZCAoYW5kIG5vbiBzZWNyZXQpIGxvY2FsCisJCQkJCSYmICgobG9jYWwuZGVjbGFyYXRpb24uYml0cyAmIEFzdE5vZGUuSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlTUFTSykgIT0gMCkpIHsgLy8gZGVjbGFyYXRpb24gaXMgcmVhY2hhYmxlCisJCQkJCWlmIChsb2NhbC5pc0FyZ3VtZW50KSAvLyBtZXRob2QgYXJndW1lbnQKKwkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkQXJndW1lbnQobG9jYWwuZGVjbGFyYXRpb24pOworCQkJCQllbHNlIGlmICghKGxvY2FsLmRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQXJndW1lbnQpKSAgLy8gZG8gbm90IHJlcG9ydCB1bnVzZWQgY2F0Y2ggYXJndW1lbnRzCisJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZExvY2FsVmFyaWFibGUobG9jYWwuZGVjbGFyYXRpb24pOworCQkJCX0KKwkJCQlpZiAoIWdlbmVyYXRlc0xvY2FsKSB7CisJCQkJCWlmIChsb2NhbC5kZWNsYXJhdGlvbiAhPSBudWxsCisJCQkJCQkmJiBlbnZpcm9ubWVudCgpLm9wdGlvbnMucHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcykgeworCQkJCQkJZ2VuZXJhdGVzTG9jYWwgPSB0cnVlOyAvLyBmb3JjZSBpdCB0byBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCisJCQkJCQlsb2NhbC51c2VkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZ2VuZXJhdGVzTG9jYWwpIHsKKworCQkJCQlpZiAobG9jYWwuZGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5yZWNvcmQobG9jYWwpOworCQkJCQkJLy8gcmVjb3JkIHVzZXIgbG9jYWwgdmFyaWFibGVzIGZvciBhdHRyaWJ1dGUgZ2VuZXJhdGlvbgorCQkJCQl9CisJCQkJCS8vIGFsbG9jYXRlIHZhcmlhYmxlIHBvc2l0aW9uCisJCQkJCWxvY2FsLnJlc29sdmVkUG9zaXRpb24gPSB0aGlzLm9mZnNldDsKKworCQkJCQkvLyBjaGVjayBmb3IgdG9vIG1hbnkgYXJndW1lbnRzL2xvY2FsIHZhcmlhYmxlcworCQkJCQlpZiAobG9jYWwuaXNBcmd1bWVudCkgeworCQkJCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cworCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChsb2NhbCwgbG9jYWwuZGVjbGFyYXRpb24pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRkZGKSB7IC8vIG5vIG1vcmUgdGhhbiA2NTUzNSB3b3JkcyBvZiBsb2NhbHMKKwkJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yTG9jYWwoCisJCQkJCQkJCWxvY2FsLCBsb2NhbC5kZWNsYXJhdGlvbiA9PSBudWxsID8gKEFzdE5vZGUpdGhpcy5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQgOiBsb2NhbC5kZWNsYXJhdGlvbik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBpbmNyZW1lbnQgb2Zmc2V0CisJCQkJCWlmICgobG9jYWwudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGxvY2FsLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJCXRoaXMub2Zmc2V0ICs9IDI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLm9mZnNldCsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9jYWwucmVzb2x2ZWRQb3NpdGlvbiA9IC0xOyAvLyBub3QgZ2VuZXJhdGVkCisJCQkJfQorCQkJCWhhc01vcmVWYXJpYWJsZXMgPSArK2lsb2NhbCA8IG1heExvY2FsczsKKwkJCX0KKwkJfQorCQlpZiAodGhpcy5vZmZzZXQgPiB0aGlzLm1heE9mZnNldCkKKwkJCXRoaXMubWF4T2Zmc2V0ID0gdGhpcy5vZmZzZXQ7CisJfQorCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIHZhcmlhYmxlIG5hbWUgYWxyZWFkeSBleGlzdHMgd2l0aGluIHRoZSByZWNlaXZlcidzIHNjb3BlLgorCSAqLworCXB1YmxpYyBmaW5hbCBMb2NhbFZhcmlhYmxlQmluZGluZyBkdXBsaWNhdGVOYW1lKGNoYXJbXSBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxJbmRleDsgaSsrKQorCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG5hbWUsIGxvY2Fsc1tpXS5uYW1lKSkKKwkJCQlyZXR1cm4gbG9jYWxzW2ldOworCisJCWlmICh0aGlzIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpCisJCQlyZXR1cm4gbnVsbDsKKwkJZWxzZQorCQkJcmV0dXJuICgoQmxvY2tTY29wZSkgcGFyZW50KS5kdXBsaWNhdGVOYW1lKG5hbWUpOworCX0KKworCS8qCisJICoJUmVjb3JkIHRoZSBzdWl0YWJsZSBiaW5kaW5nIGRlbm90aW5nIGEgc3ludGhldGljIGZpZWxkIG9yIGNvbnN0cnVjdG9yIGFyZ3VtZW50LAorCSAqIG1hcHBpbmcgdG8gdGhlIGFjdHVhbCBvdXRlciBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgc2NvcGUgY29udGV4dC4KKwkgKiBOb3RlIHRoYXQgdGhpcyBtYXkgbm90IG5lZWQgYW55IGVmZmVjdCwgaW4gY2FzZSB0aGUgb3V0ZXIgbG9jYWwgdmFyaWFibGUgZG9lcyBub3QKKwkgKiBuZWVkIHRvIGJlIGVtdWxhdGVkIGFuZCBjYW4gZGlyZWN0bHkgYmUgdXNlZCBhcyBpcyAodXNpbmcgaXRzIGJhY2sgcG9pbnRlciB0byBpdHMKKwkgKiBkZWNsYXJpbmcgc2NvcGUpLgorCSAqLworCXB1YmxpYyB2b2lkIGVtdWxhdGVPdXRlckFjY2VzcyhMb2NhbFZhcmlhYmxlQmluZGluZyBvdXRlckxvY2FsVmFyaWFibGUpIHsKKworCQlNZXRob2RTY29wZSBjdXJyZW50TWV0aG9kU2NvcGU7CisJCWlmICgoY3VycmVudE1ldGhvZFNjb3BlID0gdGhpcy5tZXRob2RTY29wZSgpKQorCQkJIT0gb3V0ZXJMb2NhbFZhcmlhYmxlLmRlY2xhcmluZ1Njb3BlLm1ldGhvZFNjb3BlKCkpIHsKKwkJCU5lc3RlZFR5cGVCaW5kaW5nIGN1cnJlbnRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSB0aGlzLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKworCQkJLy9kbyBub3RoaW5nIGZvciBtZW1iZXIgdHlwZXMsIHByZSBlbXVsYXRpb24gd2FzIHBlcmZvcm1lZCBhbHJlYWR5CisJCQlpZiAoIWN1cnJlbnRUeXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBtdXN0IGFsc28gYWRkIGEgc3ludGhldGljIGZpZWxkIGlmIHdlJ3JlIG5vdCBpbnNpZGUgYSBjb25zdHJ1Y3RvcgorCQkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKSkgeworCQkJCWN1cnJlbnRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQob3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudFR5cGUuYWRkU3ludGhldGljQXJndW1lbnQob3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogUmVjb3JkIHRoZSBzdWl0YWJsZSBiaW5kaW5nIGRlbm90aW5nIGEgc3ludGhldGljIGZpZWxkIG9yIGNvbnN0cnVjdG9yIGFyZ3VtZW50LAorCSAqIG1hcHBpbmcgdG8gYSBnaXZlbiBhY3R1YWwgZW5jbG9zaW5nIGluc3RhbmNlIHR5cGUgaW4gdGhlIHNjb3BlIGNvbnRleHQuCisJICogU2tpcCBpdCBpZiB0aGUgZW5jbG9zaW5nVHlwZSBpcyBhY3R1YWxseSB0aGUgY3VycmVudCBzY29wZSdzIGVuY2xvc2luZyB0eXBlLgorCSAqLworCisJcHVibGljIHZvaWQgZW11bGF0ZU91dGVyQWNjZXNzKAorCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUsCisJCWJvb2xlYW4gdXNlRGlyZWN0UmVmZXJlbmNlKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJaWYgKGN1cnJlbnRUeXBlLmlzTmVzdGVkVHlwZSgpCisJCQkmJiBjdXJyZW50VHlwZSAhPSB0YXJnZXRFbmNsb3NpbmdUeXBlKXsKKwkJCS8qJiYgIXRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKi8KKworCQkJaWYgKHVzZURpcmVjdFJlZmVyZW5jZSkgeworCQkJCS8vIHRoZSB0YXJnZXQgZW5jbG9zaW5nIHR5cGUgaXMgbm90IGluIHNjb3BlLCB3ZSBkaXJlY3RseSByZWZlciBpdAorCQkJCS8vIG11c3QgYWxzbyBhZGQgYSBzeW50aGV0aWMgZmllbGQgaWYgd2UncmUgbm90IGluc2lkZSBhIGNvbnN0cnVjdG9yCisJCQkJTmVzdGVkVHlwZUJpbmRpbmcgY3VycmVudE5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlOworCQkJCWlmIChtZXRob2RTY29wZSgpLmlzSW5zaWRlSW5pdGlhbGl6ZXJPckNvbnN0cnVjdG9yKCkpCisJCQkJCWN1cnJlbnROZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50KHRhcmdldEVuY2xvc2luZ1R5cGUpOworCQkJCWVsc2UKKwkJCQkJY3VycmVudE5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZCh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKKwkJCQkJCisJCQl9IGVsc2UgeyAvLyBpbmRpcmVjdCByZWZlcmVuY2Ugc2VxdWVuY2UKKwkJCQlpbnQgZGVwdGggPSAwOworCQkJCQorCQkJCS8vIHNhdHVyYXRlIGFsbCB0aGUgd2F5IHVwIHVudGlsIHJlYWNoaW5nIGNvbXBhdGlibGUgZW5jbG9zaW5nIHR5cGUKKwkJCQl3aGlsZSAoY3VycmVudFR5cGUuaXNMb2NhbFR5cGUoKSl7CisJCQkJCU5lc3RlZFR5cGVCaW5kaW5nIGN1cnJlbnROZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZTsKKwkJCQkJY3VycmVudFR5cGUgPSBjdXJyZW50TmVzdGVkVHlwZS5lbmNsb3NpbmdUeXBlOworCQkJCQkKKwkJCQkJaWYgKGRlcHRoID09IDApeworCQkJCQkJaWYgKG1ldGhvZFNjb3BlKCkuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKSkgeworCQkJCQkJCS8vIG11c3QgYWxzbyBhZGQgYSBzeW50aGV0aWMgZmllbGQgaWYgd2UncmUgbm90IGluc2lkZSBhIGNvbnN0cnVjdG9yCisJCQkJCQkJY3VycmVudE5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnQoY3VycmVudFR5cGUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljdXJyZW50TmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKGN1cnJlbnRUeXBlKTsKKwkJCQkJCX0JCQkJCQorCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnROZXN0ZWRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUgCisJCQkJCQkJCQkJfHwgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihjdXJyZW50TmVzdGVkVHlwZSkpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWN1cnJlbnROZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoY3VycmVudFR5cGUpOworCQkJCQl9IAorCQkJCQlkZXB0aCsrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIE5vdGUgdGhhdCBpdCBtdXN0IG5ldmVyIHByb2R1Y2UgYSBkaXJlY3QgYWNjZXNzIHRvIHRoZSB0YXJnZXRFbmNsb3NpbmdUeXBlLAorCSAqIGJ1dCBpbnN0ZWFkIGEgZmllbGQgc2VxdWVuY2UgKHRoaXMkMi50aGlzJDEudGhpcyQwKSBzbyBhcyB0byBoYW5kbGUgc3VjaCBhIHRlc3QgY2FzZToKKwkgKgorCSAqIGNsYXNzIFhYIHsKKwkgKgl2b2lkIGZvbygpIHsKKwkgKgkJY2xhc3MgQSB7CisJICoJCQljbGFzcyBCIHsKKwkgKgkJCQljbGFzcyBDIHsKKwkgKgkJCQkJYm9vbGVhbiBmb28oKSB7CisJICoJCQkJCQlyZXR1cm4gKE9iamVjdCkgQS50aGlzID09IChPYmplY3QpIEIudGhpczsKKwkgKgkJCQkJfQorCSAqCQkJCX0KKwkgKgkJCX0KKwkgKgkJfQorCSAqCQluZXcgQSgpLm5ldyBCKCkubmV3IEMoKTsKKwkgKgl9CisJICogfQorCSAqIHdoZXJlIHdlIG9ubHkgd2FudCB0byBkZWFsIHdpdGggT05FIGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgQyAoY291bGQgbm90IGZpZ3VyZSBvdXQgYW4gQSBmb3IgQykKKwkgKi8KKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBmaW5kTG9jYWxUeXBlKGNoYXJbXSBuYW1lKSB7CisKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNjb3BlSW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHN1YnNjb3Blc1tpXSBpbnN0YW5jZW9mIENsYXNzU2NvcGUpIHsKKwkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0KKwkJCQkJKChDbGFzc1Njb3BlKSBzdWJzY29wZXNbaV0pLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc291cmNlVHlwZS5zb3VyY2VOYW1lKCksIG5hbWUpKQorCQkJCQlyZXR1cm4gc291cmNlVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgZmluZFZhcmlhYmxlKGNoYXJbXSB2YXJpYWJsZSkgeworCisJCWludCB2YXJpYWJsZUxlbmd0aCA9IHZhcmlhYmxlLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGxvY2Fscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBsb2NhbHNbaV07CisJCQlpZiAobG9jYWwgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWlmIChsb2NhbC5uYW1lLmxlbmd0aCA9PSB2YXJpYWJsZUxlbmd0aAorCQkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGxvY2FsLm5hbWUsIHZhcmlhYmxlKSkKKwkJCQlyZXR1cm4gbG9jYWw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCS8qIEFQSQorICAgICAqIGZsYWcgaXMgYSBtYXNrIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIFZBUklBQkxFICg9IEZJRUxEIG9yIExPQ0FMKSwgVFlQRS4KKwkgKiBPbmx5IGJpbmRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hc2sgd2lsbCBiZSBhbnN3ZXJlZC4KKwkgKgorCSAqCWlmIHRoZSBWQVJJQUJMRSBtYXNrIGlzIHNldCB0aGVuCisJICoJCUlmIHRoZSBmaXJzdCBuYW1lIHByb3ZpZGVkIGlzIGEgZmllbGQgKG9yIGxvY2FsKSB0aGVuIHRoZSBmaWVsZCAob3IgbG9jYWwpIGlzIGFuc3dlcmVkCisJICoJCU90aGVyd2lzZSwgcGFja2FnZSBuYW1lcyBhbmQgdHlwZSBuYW1lcyBhcmUgY29uc3VtZWQgdW50aWwgYSBmaWVsZCBpcyBmb3VuZC4KKwkgKgkJSW4gdGhpcyBjYXNlLCB0aGUgZmllbGQgaXMgYW5zd2VyZWQuCisJICoKKwkgKglpZiB0aGUgVFlQRSBtYXNrIGlzIHNldCwKKwkgKgkJcGFja2FnZSBuYW1lcyBhbmQgdHlwZSBuYW1lcyBhcmUgY29uc3VtZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCisJICoJCU9ubHkgaWYgYWxsIG9mIHRoZSBpbnB1dCBpcyBjb25zdW1lZCBpcyB0aGUgdHlwZSBhbnN3ZXJlZAorCSAqCisJICoJQWxsIG90aGVyIGNvbmRpdGlvbnMgYXJlIGVycm9ycywgYW5kIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLgorCSAqCQorCSAqCU5PVEU6IElmIGEgcHJvYmxlbSBiaW5kaW5nIGlzIHJldHVybmVkLCBzZW5kZXJzIHNob3VsZCBleHRyYWN0IHRoZSBjb21wb3VuZCBuYW1lCisJICoJZnJvbSB0aGUgYmluZGluZyAmIG5vdCBhc3N1bWUgdGhlIHByb2JsZW0gYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvdW5kTmFtZS4KKwkgKgorCSAqCVRoZSBWQVJJQUJMRSBtYXNrIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIFRZUEUgbWFzay4KKwkgKgorCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMKKwkgKgkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIGZpZWxkIGlzIHZpc2libGUuCisJICoJCXNldEZpZWxkSW5kZXgoaW50KTsgdGhpcyBpcyB1c2VkIHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIG5hbWVzIHRoYXQgd2VyZSBjb25zdW1lZC4KKwkgKgorCSAqCUZvciBleGFtcGxlLCBnZXRCaW5kaW5nKHsiZm9vIiwieSIsInEiLCBWQVJJQUJMRSwgc2l0ZSkgd2lsbCBhbnN3ZXIKKwkgKgl0aGUgYmluZGluZyBmb3IgdGhlIGZpZWxkIG9yIGxvY2FsIG5hbWVkICJmb28iIChvciBhbiBlcnJvciBiaW5kaW5nIGlmIG5vbmUgZXhpc3RzKS4KKwkgKglJbiBhZGRpdGlvbiwgc2V0RmllbGRJbmRleCgxKSB3aWxsIGJlIHNlbnQgdG8gdGhlIGludm9jYXRpb24gc2l0ZS4KKwkgKglJZiBhIHR5cGUgbmFtZWQgImZvbyIgZXhpc3RzLCBpdCB3aWxsIG5vdCBiZSBkZXRlY3RlZCAoYW5kIGFuIGVycm9yIGJpbmRpbmcgd2lsbCBiZSBhbnN3ZXJlZCkKKwkgKgorCSAqCUlNUE9SVEFOVCBOT1RFOiBUaGlzIG1ldGhvZCBpcyB3cml0dGVuIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgY29tcG91bmROYW1lIGlzIGxvbmdlciB0aGFuIGxlbmd0aCAxLgorCSAqLworCXB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBpbnQgbWFzaywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKworCQlCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nKGNvbXBvdW5kTmFtZVswXSwgbWFzayB8IFRZUEUgfCBQQUNLQUdFLCBpbnZvY2F0aW9uU2l0ZSk7CisJCWludm9jYXRpb25TaXRlLnNldEZpZWxkSW5kZXgoMSk7CisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgVmFyaWFibGVCaW5kaW5nKSByZXR1cm4gYmluZGluZzsKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRTaW1wbGVSZWZlcmVuY2UoY29tcG91bmROYW1lWzBdKTsKKwkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiBiaW5kaW5nOworCisJCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCQlpbnQgY3VycmVudEluZGV4ID0gMTsKKwkJZm91bmRUeXBlIDogaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7CisJCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CisJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRSZWZlcmVuY2UocGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lLCBjb21wb3VuZE5hbWVbY3VycmVudEluZGV4XSk7CisJCQkJYmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSk7CisJCQkJaW52b2NhdGlvblNpdGUuc2V0RmllbGRJbmRleChjdXJyZW50SW5kZXgpOworCQkJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCQkJaWYgKGN1cnJlbnRJbmRleCA9PSBsZW5ndGgpCisJCQkJCQkvLyBtdXN0IGJlIGEgdHlwZSBpZiBpdHMgdGhlIGxhc3QgbmFtZSwgb3RoZXJ3aXNlIHdlIGhhdmUgbm8gaWRlYSBpZiBpdHMgYSBwYWNrYWdlIG9yIHR5cGUKKwkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQkJTm90Rm91bmQpOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKAorCQkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJCU5vdEZvdW5kKTsKKwkJCQl9CisJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkJCQkJaWYgKCEoKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcpLmNhbkJlU2VlbkJ5KHRoaXMpKQorCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCQliaW5kaW5nLAorCQkJCQkJCU5vdFZpc2libGUpOworCQkJCQlicmVhayBmb3VuZFR5cGU7CisJCQkJfQorCQkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQkJfQorCisJCQkvLyBJdCBpcyBpbGxlZ2FsIHRvIHJlcXVlc3QgYSBQQUNLQUdFIGZyb20gdGhpcyBtZXRob2QuCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCU5vdEZvdW5kKTsKKwkJfQorCisJCS8vIGtub3cgYmluZGluZyBpcyBub3cgYSBSZWZlcmVuY2VCaW5kaW5nCisJCXdoaWxlIChjdXJyZW50SW5kZXggPCBsZW5ndGgpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKKwkJCWNoYXJbXSBuZXh0TmFtZSA9IGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK107CisJCQlpbnZvY2F0aW9uU2l0ZS5zZXRGaWVsZEluZGV4KGN1cnJlbnRJbmRleCk7CisJCQlpbnZvY2F0aW9uU2l0ZS5zZXRBY3R1YWxSZWNlaXZlclR5cGUodHlwZUJpbmRpbmcpOworCQkJaWYgKChiaW5kaW5nID0gZmluZEZpZWxkKHR5cGVCaW5kaW5nLCBuZXh0TmFtZSwgaW52b2NhdGlvblNpdGUpKSAhPSBudWxsKSB7CisJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKKwkJCQkJCSgoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCQkJYnJlYWs7IC8vIGJpbmRpbmcgaXMgbm93IGEgZmllbGQKKwkJCX0KKwkJCWlmICgoYmluZGluZyA9IGZpbmRNZW1iZXJUeXBlKG5leHROYW1lLCB0eXBlQmluZGluZykpID09IG51bGwpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtQmluZGluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCXR5cGVCaW5kaW5nLAorCQkJCQlOb3RGb3VuZCk7CisJCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCX0KKworCQlpZiAoKG1hc2sgJiBGSUVMRCkgIT0gMCAmJiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykpIHsKKwkJCS8vIHdhcyBsb29raW5nIGZvciBhIGZpZWxkIGFuZCBmb3VuZCBhIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGQgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCQkJaWYgKCFmaWVsZC5pc1N0YXRpYygpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKKwkJCQkJZmllbGQuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQlOb25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQpOworCQkJcmV0dXJuIGJpbmRpbmc7CisJCX0KKwkJaWYgKChtYXNrICYgVFlQRSkgIT0gMCAmJiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSB7CisJCQkvLyB3YXMgbG9va2luZyBmb3IgYSB0eXBlIGFuZCBmb3VuZCBhIHR5cGUKKwkJCXJldHVybiBiaW5kaW5nOworCQl9CisKKwkJLy8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gYSBmaWVsZCBvciB0eXBlIHdhcyBhc2tlZCBmb3IgYnV0IHdlIHJlc29sdmVkIHRoZSBjb21wb3VuZE5hbWUgdG8gYSB0eXBlIG9yIGZpZWxkCisJCXJldHVybiBuZXcgUHJvYmxlbUJpbmRpbmcoCisJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCU5vdEZvdW5kKTsKKwl9CisKKwkvLyBBZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gTk9UIFB1YmxpYyBBUEkKKwlwdWJsaWMgZmluYWwgQmluZGluZyBnZXRCaW5kaW5nKAorCQljaGFyW11bXSBjb21wb3VuZE5hbWUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJCWludCBjdXJyZW50SW5kZXggPSAwOworCQlpbnQgbGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsKKwkJQmluZGluZyBiaW5kaW5nID0KKwkJCWdldEJpbmRpbmcoCisJCQkJY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSwKKwkJCQlWQVJJQUJMRSB8IFRZUEUgfCBQQUNLQUdFLAorCQkJCWludm9jYXRpb25TaXRlKTsKKwkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQlyZXR1cm4gYmluZGluZzsKKworCQlmb3VuZFR5cGUgOiBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CisJCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJYmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSk7CisJCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQlpZiAoY3VycmVudEluZGV4ID09IGxlbmd0aCkKKwkJCQkJCS8vIG11c3QgYmUgYSB0eXBlIGlmIGl0cyB0aGUgbGFzdCBuYW1lLCBvdGhlcndpc2Ugd2UgaGF2ZSBubyBpZGVhIGlmIGl0cyBhIHBhY2thZ2Ugb3IgdHlwZQorCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCQlOb3RGb3VuZCk7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBuZXcgUHJvYmxlbUJpbmRpbmcoCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQkJTm90Rm91bmQpOworCQkJCX0KKwkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOworCQkJCQlpZiAoISgoUmVmZXJlbmNlQmluZGluZykgYmluZGluZykuY2FuQmVTZWVuQnkodGhpcykpCisJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJCWJpbmRpbmcsIAorCQkJCQkJCU5vdFZpc2libGUpOworCQkJCQlicmVhayBmb3VuZFR5cGU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGJpbmRpbmc7CisJCX0KKworCQlmb3VuZEZpZWxkIDogaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCQkJCWNoYXJbXSBuZXh0TmFtZSA9IGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK107CisJCQkJaWYgKChiaW5kaW5nID0gZmluZEZpZWxkKHR5cGVCaW5kaW5nLCBuZXh0TmFtZSwgaW52b2NhdGlvblNpdGUpKSAhPSBudWxsKSB7CisJCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJCQkJCSgoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkJCQkJaWYgKCEoKEZpZWxkQmluZGluZykgYmluZGluZykuaXNTdGF0aWMoKSkKKwkJCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygKKwkJCQkJCQkoKEZpZWxkQmluZGluZykgYmluZGluZykuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQkJTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KTsKKwkJCQkJYnJlYWsgZm91bmRGaWVsZDsgLy8gYmluZGluZyBpcyBub3cgYSBmaWVsZAorCQkJCX0KKwkJCQlpZiAoKGJpbmRpbmcgPSBmaW5kTWVtYmVyVHlwZShuZXh0TmFtZSwgdHlwZUJpbmRpbmcpKSA9PSBudWxsKQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKAorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQl0eXBlQmluZGluZywKKwkJCQkJCU5vdEZvdW5kKTsKKwkJCQlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCQl9CisJCQlyZXR1cm4gYmluZGluZzsKKwkJfQorCisJCVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOworCQl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CisJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHZhcmlhYmxlQmluZGluZy50eXBlOworCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJCQludWxsLAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4ICsgMSksCisJCQkJCU5vdEZvdW5kKTsKKwkJCXZhcmlhYmxlQmluZGluZyA9CisJCQkJZmluZEZpZWxkKHR5cGVCaW5kaW5nLCBjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCBpbnZvY2F0aW9uU2l0ZSk7CisJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJCQludWxsLAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJTm90Rm91bmQpOworCQkJaWYgKCF2YXJpYWJsZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOworCQl9CisJCXJldHVybiB2YXJpYWJsZUJpbmRpbmc7CisJfQorCisJLyogQVBJCisgICAgICoJCisJICoJQW5zd2VyIHRoZSBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGFyZ3VtZW50IG5hbWUuCisJICoJZmxhZyBpcyBhIG1hc2sgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgVkFSSUFCTEUgKD0gRklFTEQgb3IgTE9DQUwpLCBUWVBFLCBQQUNLQUdFLgorCSAqCU9ubHkgYmluZGluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWFzayBjYW4gYmUgYW5zd2VyZWQuCisJICoKKwkgKglGb3IgZXhhbXBsZSwgZ2V0QmluZGluZygiZm9vIiwgVkFSSUFCTEUsIHNpdGUpIHdpbGwgYW5zd2VyCisJICoJdGhlIGJpbmRpbmcgZm9yIHRoZSBmaWVsZCBvciBsb2NhbCBuYW1lZCAiZm9vIiAob3IgYW4gZXJyb3IgYmluZGluZyBpZiBub25lIGV4aXN0cykuCisJICoJSWYgYSB0eXBlIG5hbWVkICJmb28iIGV4aXN0cywgaXQgd2lsbCBub3QgYmUgZGV0ZWN0ZWQgKGFuZCBhbiBlcnJvciBiaW5kaW5nIHdpbGwgYmUgYW5zd2VyZWQpCisJICoKKwkgKglUaGUgVkFSSUFCTEUgbWFzayBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBUWVBFIG1hc2suCisJICoKKwkgKglJZiB0aGUgVkFSSUFCTEUgbWFzayBpcyBub3Qgc2V0LCBuZWl0aGVyIGZpZWxkcyBub3IgbG9jYWxzIHdpbGwgYmUgbG9va2VkIGZvci4KKwkgKgorCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHM6CisJICoJCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBmaWVsZCBpcyB2aXNpYmxlLgorCSAqCisJICoJTGltaXRhdGlvbnM6IGNhbm5vdCByZXF1ZXN0IEZJRUxEIGluZGVwZW5kZW50bHkgb2YgTE9DQUwsIG9yIHZpY2UgdmVyc2EKKwkgKi8KKwlwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKGNoYXJbXSBuYW1lLCBpbnQgbWFzaywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKwkJCQorCQlCaW5kaW5nIGJpbmRpbmcgPSBudWxsOworCQlGaWVsZEJpbmRpbmcgcHJvYmxlbUZpZWxkID0gbnVsbDsKKwkJaWYgKChtYXNrICYgVkFSSUFCTEUpICE9IDApIHsKKwkJCWlmICh0aGlzLmtpbmQgPT0gQkxPQ0tfU0NPUEUgfHwgdGhpcy5raW5kID09IE1FVEhPRF9TQ09QRSkgeworCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZpbmRWYXJpYWJsZShuYW1lKTsKKwkJCQkvLyBsb29rcyBpbiB0aGlzIHNjb3BlIG9ubHkKKwkJCQlpZiAodmFyaWFibGVCaW5kaW5nICE9IG51bGwpIHJldHVybiB2YXJpYWJsZUJpbmRpbmc7CisJCQl9CisKKwkJCWJvb2xlYW4gaW5zaWRlU3RhdGljQ29udGV4dCA9IGZhbHNlOworCQkJYm9vbGVhbiBpbnNpZGVDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsKKwkJCWlmICh0aGlzLmtpbmQgPT0gTUVUSE9EX1NDT1BFKSB7CisJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIHRoaXM7CisJCQkJaW5zaWRlU3RhdGljQ29udGV4dCB8PSBtZXRob2RTY29wZS5pc1N0YXRpYzsKKwkJCQlpbnNpZGVDb25zdHJ1Y3RvckNhbGwgfD0gbWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CisJCQl9CisKKwkJCUZpZWxkQmluZGluZyBmb3VuZEZpZWxkID0gbnVsbDsKKwkJCS8vIGNhbiBiZSBhIHByb2JsZW0gZmllbGQgd2hpY2ggaXMgYW5zd2VyZWQgaWYgYSB2YWxpZCBmaWVsZCBpcyBub3QgZm91bmQKKwkJCVByb2JsZW1GaWVsZEJpbmRpbmcgZm91bmRJbnNpZGVQcm9ibGVtID0gbnVsbDsKKwkJCS8vIGluc2lkZSBDb25zdHJ1Y3RvciBjYWxsIG9yIGluc2lkZSBzdGF0aWMgY29udGV4dAorCQkJU2NvcGUgc2NvcGUgPSBwYXJlbnQ7CisJCQlpbnQgZGVwdGggPSAwOworCQkJaW50IGZvdW5kRGVwdGggPSAwOworCQkJUmVmZXJlbmNlQmluZGluZyBmb3VuZEFjdHVhbFJlY2VpdmVyVHlwZSA9IG51bGw7CisJCQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCQkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCQljYXNlIE1FVEhPRF9TQ09QRSA6CisJCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7CisJCQkJCQlpbnNpZGVTdGF0aWNDb250ZXh0IHw9IG1ldGhvZFNjb3BlLmlzU3RhdGljOworCQkJCQkJaW5zaWRlQ29uc3RydWN0b3JDYWxsIHw9IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOworCQkJCQkJLy8gRmFsbCB0aHJvdWdoLi4uIGNvdWxkIGR1cGxpY2F0ZSB0aGUgY29kZSBiZWxvdyB0byBzYXZlIGEgY2FzdCAtIHF1ZXN0aW9uYWJsZSBvcHRpbWl6YXRpb24KKwkJCQkJY2FzZSBCTE9DS19TQ09QRSA6CisJCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoKEJsb2NrU2NvcGUpIHNjb3BlKS5maW5kVmFyaWFibGUobmFtZSk7CisJCQkJCQkvLyBsb29rcyBpbiB0aGlzIHNjb3BlIG9ubHkKKwkJCQkJCWlmICh2YXJpYWJsZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCWlmIChmb3VuZEZpZWxkICE9IG51bGwgJiYgZm91bmRGaWVsZC5pc1ZhbGlkQmluZGluZygpKQorCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJCQkJCQlmb3VuZEZpZWxkLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQkJbmFtZSwKKwkJCQkJCQkJCUluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCWlmIChkZXB0aCA+IDApCisJCQkJCQkJCWludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKKwkJCQkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQ0xBU1NfU0NPUEUgOgorCQkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIHNjb3BlOworCQkJCQkJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSA9IGNsYXNzU2NvcGUucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9CisJCQkJCQkJY2xhc3NTY29wZS5maW5kRmllbGQoZW5jbG9zaW5nVHlwZSwgbmFtZSwgaW52b2NhdGlvblNpdGUpOworCQkJCQkJLy8gVXNlIG5leHQgbGluZSBpbnN0ZWFkIGlmIHdpbGxpbmcgdG8gZW5hYmxlIHByb3RlY3RlZCBhY2Nlc3MgYWNjcm9zcyBpbm5lciB0eXBlcworCQkJCQkJLy8gRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGZpbmRGaWVsZChlbmNsb3NpbmdUeXBlLCBuYW1lLCBpbnZvY2F0aW9uU2l0ZSk7CisJCQkJCQlpZiAoZmllbGRCaW5kaW5nICE9IG51bGwpIHsgLy8gc2tpcCBpdCBpZiB3ZSBkaWQgbm90IGZpbmQgYW55dGhpbmcKKwkJCQkJCQlpZiAoZmllbGRCaW5kaW5nLnByb2JsZW1JZCgpID09IEFtYmlndW91cykgeworCQkJCQkJCQlpZiAoZm91bmRGaWVsZCA9PSBudWxsIHx8IGZvdW5kRmllbGQucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkKKwkJCQkJCQkJCS8vIHN1cGVyY2VkZXMgYW55IHBvdGVudGlhbCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIHByb2JsZW0KKwkJCQkJCQkJCXJldHVybiBmaWVsZEJpbmRpbmc7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCS8vIG1ha2UgdGhlIHVzZXIgcXVhbGlmeSB0aGUgZmllbGQsIGxpa2VseSB3YW50cyB0aGUgZmlyc3QgaW5oZXJpdGVkIGZpZWxkIChqYXZhYyBnZW5lcmF0ZXMgYW4gYW1iaWd1b3VzIGVycm9yIGluc3RlYWQpCisJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJCQkJCQkJZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQkJCW5hbWUsCisJCQkJCQkJCQkJSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CisJCQkJCQkJfQorCisJCQkJCQkJUHJvYmxlbUZpZWxkQmluZGluZyBpbnNpZGVQcm9ibGVtID0gbnVsbDsKKwkJCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQkJaWYgKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQkJCQkJaWYgKGluc2lkZUNvbnN0cnVjdG9yQ2FsbCkgeworCQkJCQkJCQkJCWluc2lkZVByb2JsZW0gPQorCQkJCQkJCQkJCQluZXcgUHJvYmxlbUZpZWxkQmluZGluZygKKwkJCQkJCQkJCQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCQkJCQkJCW5hbWUsCisJCQkJCQkJCQkJCQlOb25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbik7CisJCQkJCQkJCQl9IGVsc2UgaWYgKGluc2lkZVN0YXRpY0NvbnRleHQpIHsKKwkJCQkJCQkJCQlpbnNpZGVQcm9ibGVtID0KKwkJCQkJCQkJCQkJbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJCQkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJCQkJCQluYW1lLAorCQkJCQkJCQkJCQkJTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoZW5jbG9zaW5nVHlwZSA9PSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MKKwkJCQkJCQkJCXx8IGVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCl7CisJCQkJCQkJCQkvLyBmb3VuZCBhIHZhbGlkIGZpZWxkIGluIHRoZSAnaW1tZWRpYXRlJyBzY29wZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJCQkJCQkvLyBPUiBpbiAxLjQgbW9kZSAoaW5oZXJpdGVkIHNoYWRvd3MgZW5jbG9zaW5nKQorCQkJCQkJCQkJaWYgKGZvdW5kRmllbGQgPT0gbnVsbCkgeworCQkJCQkJCQkJCWlmIChkZXB0aCA+IDApeworCQkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZS5zZXREZXB0aChkZXB0aCk7CisJCQkJCQkJCQkJCWludm9jYXRpb25TaXRlLnNldEFjdHVhbFJlY2VpdmVyVHlwZShlbmNsb3NpbmdUeXBlKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJLy8gcmV0dXJuIHRoZSBmaWVsZEJpbmRpbmcgaWYgaXQgaXMgbm90IGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiB0aGUgc2NvcGUncyBiaW5kaW5nIChpLmUuICJpbmhlcml0ZWQiKQorCQkJCQkJCQkJCXJldHVybiBpbnNpZGVQcm9ibGVtID09IG51bGwgPyBmaWVsZEJpbmRpbmcgOiBpbnNpZGVQcm9ibGVtOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKGZvdW5kRmllbGQuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQkJCQkJCQkvLyBpZiBhIHZhbGlkIGZpZWxkIHdhcyBmb3VuZCwgY29tcGxhaW4gd2hlbiBhbm90aGVyIGlzIGZvdW5kIGluIGFuICdpbW1lZGlhdGUnIGVuY2xvc2luZyB0eXBlIChpZS4gbm90IGluaGVyaXRlZCkKKwkJCQkJCQkJCQlpZiAoZm91bmRGaWVsZC5kZWNsYXJpbmdDbGFzcyAhPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCisJCQkJCQkJCQkJCS8vIGllLiBoYXZlIHdlIGZvdW5kIHRoZSBzYW1lIGZpZWxkIC0gZG8gbm90IHRydXN0IGZpZWxkIGlkZW50aXR5IHlldAorCQkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJCQkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCQkJCQkJCQluYW1lLAorCQkJCQkJCQkJCQkJSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZm91bmRGaWVsZCA9PSBudWxsCisJCQkJCQkJCXx8IChmb3VuZEZpZWxkLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUKKwkJCQkJCQkJCSYmIGZpZWxkQmluZGluZy5wcm9ibGVtSWQoKSAhPSBOb3RWaXNpYmxlKSkgeworCQkJCQkJCQkvLyBvbmx5IHJlbWVtYmVyIHRoZSBmaWVsZEJpbmRpbmcgaWYgaXRzIHRoZSBmaXJzdCBvbmUgZm91bmQgb3IgdGhlIHByZXZpb3VzIG9uZSB3YXMgbm90IHZpc2libGUgJiBmaWVsZEJpbmRpbmcgaXMuLi4KKwkJCQkJCQkJZm91bmREZXB0aCA9IGRlcHRoOworCQkJCQkJCQlmb3VuZEFjdHVhbFJlY2VpdmVyVHlwZSA9IGVuY2xvc2luZ1R5cGU7CisJCQkJCQkJCWZvdW5kSW5zaWRlUHJvYmxlbSA9IGluc2lkZVByb2JsZW07CisJCQkJCQkJCWZvdW5kRmllbGQgPSBmaWVsZEJpbmRpbmc7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZGVwdGgrKzsKKwkJCQkJCWluc2lkZVN0YXRpY0NvbnRleHQgfD0gZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpOworCQkJCQkJLy8gMUVYNUk4WiAtIGFjY2Vzc2luZyBvdXRlciBmaWVsZHMgd2l0aGluIGEgY29uc3RydWN0b3IgY2FsbCBpcyBwZXJtaXR0ZWQKKwkJCQkJCS8vIGluIG9yZGVyIHRvIGRvIHNvLCB3ZSBjaGFuZ2UgdGhlIGZsYWcgYXMgd2UgZXhpdCBmcm9tIHRoZSB0eXBlLCBub3QgdGhlIG1ldGhvZAorCQkJCQkJLy8gaXRzZWxmLCBiZWNhdXNlIHRoZSBjbGFzcyBzY29wZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaWVsZHMuCisJCQkJCQlNZXRob2RTY29wZSBlbmNsb3NpbmdNZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCQkJCQlpbnNpZGVDb25zdHJ1Y3RvckNhbGwgPQorCQkJCQkJCWVuY2xvc2luZ01ldGhvZFNjb3BlID09IG51bGwgPyBmYWxzZSA6IGVuY2xvc2luZ01ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CisJCQkJCQlicmVhayBkb25lOworCQkJCX0KKwkJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJCX0KKworCQkJaWYgKGZvdW5kSW5zaWRlUHJvYmxlbSAhPSBudWxsKXsKKwkJCQlyZXR1cm4gZm91bmRJbnNpZGVQcm9ibGVtOworCQkJfQorCQkJaWYgKGZvdW5kRmllbGQgIT0gbnVsbCkgeworCQkJCWlmIChmb3VuZEZpZWxkLmlzVmFsaWRCaW5kaW5nKCkpeworCQkJCQlpZiAoZm91bmREZXB0aCA+IDApeworCQkJCQkJaW52b2NhdGlvblNpdGUuc2V0RGVwdGgoZm91bmREZXB0aCk7CisJCQkJCQlpbnZvY2F0aW9uU2l0ZS5zZXRBY3R1YWxSZWNlaXZlclR5cGUoZm91bmRBY3R1YWxSZWNlaXZlclR5cGUpOworCQkJCQl9CisJCQkJCXJldHVybiBmb3VuZEZpZWxkOworCQkJCX0KKwkJCQlwcm9ibGVtRmllbGQgPSBmb3VuZEZpZWxkOworCQkJfQorCQl9CisKKwkJLy8gV2UgZGlkIG5vdCBmaW5kIGEgbG9jYWwgb3IgaW5zdGFuY2UgdmFyaWFibGUuCisJCWlmICgobWFzayAmIFRZUEUpICE9IDApIHsKKwkJCWlmICgoYmluZGluZyA9IGdldEJhc2VUeXBlKG5hbWUpKSAhPSBudWxsKQorCQkJCXJldHVybiBiaW5kaW5nOworCQkJYmluZGluZyA9IGdldFR5cGVPclBhY2thZ2UobmFtZSwgKG1hc2sgJiBQQUNLQUdFKSA9PSAwID8gVFlQRSA6IFRZUEUgfCBQQUNLQUdFKTsKKwkJCWlmIChiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwgbWFzayA9PSBUWVBFKQorCQkJCXJldHVybiBiaW5kaW5nOworCQkJLy8gYW5zd2VyIHRoZSBwcm9ibGVtIHR5cGUgYmluZGluZyBpZiB3ZSBhcmUgb25seSBsb29raW5nIGZvciBhIHR5cGUKKwkJfSBlbHNlIGlmICgobWFzayAmIFBBQ0tBR0UpICE9IDApIHsKKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkU2ltcGxlUmVmZXJlbmNlKG5hbWUpOworCQkJaWYgKChiaW5kaW5nID0gZW52aXJvbm1lbnQoKS5nZXRUb3BMZXZlbFBhY2thZ2UobmFtZSkpICE9IG51bGwpCisJCQkJcmV0dXJuIGJpbmRpbmc7CisJCX0KKwkJaWYgKHByb2JsZW1GaWVsZCAhPSBudWxsKQorCQkJcmV0dXJuIHByb2JsZW1GaWVsZDsKKwkJZWxzZQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtQmluZGluZyhuYW1lLCBlbmNsb3NpbmdTb3VyY2VUeXBlKCksIE5vdEZvdW5kKTsKKwl9CisJCisJLyoKKwkgKiBUaGlzIHJldHJpZXZlcyB0aGUgYXJndW1lbnQgdGhhdCBtYXBzIHRvIGFuIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0aGUgc3VpdGFibGUgdHlwZSwKKwkgKiAJaWYgbm90IGZvdW5kIHRoZW4gYW5zd2VycyBuaWwgLS0gZG8gbm90IGNyZWF0ZSBvbmUKKwkgKgorCSAqCQkjaW1wbGljaXRUaGlzCQkgIAkgCQkJCQk6ICB0aGUgaW1wbGljaXQgdGhpcyB3aWxsIGJlIG9rCisJICoJCSMoKGFyZykgdGhpcyRuKQkJCQkJCQkJOiBhdmFpbGFibGUgYXMgYSBjb25zdHJ1Y3RvciBhcmcKKwkgKiAJCSMoKGFyZykgdGhpcyRuIGFjY2VzcyRtLi4uIGFjY2VzcyRwKSAJCTogYXZhaWxhYmxlIGFzIGFzIGEgY29uc3RydWN0b3IgYXJnICsgYSBzZXF1ZW5jZSBvZiBzeW50aGV0aWMgYWNjZXNzb3JzIHRvIHN5bnRoZXRpYyBmaWVsZHMKKwkgKiAJCSMoKGZpZWxkRGVzY3IpIHRoaXMkbiBhY2Nlc3MjbS4uLiBhY2Nlc3MkcCkJOiBhdmFpbGFibGUgYXMgYSBmaXJzdCBzeW50aGV0aWMgZmllbGQgKyBhIHNlcXVlbmNlIG9mIHN5bnRoZXRpYyBhY2Nlc3NvcnMgdG8gc3ludGhldGljIGZpZWxkcworCSAqIAkJbmlsIAkJIAkJCQkJCQkJCQkJCQkJOiBub3QgZm91bmQKKwkgKgorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDb21wYXRpYmxlRW11bGF0aW9uUGF0aChSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUpIHsKKworCQlNZXRob2RTY29wZSBjdXJyZW50TWV0aG9kU2NvcGUgPSB0aGlzLm1ldGhvZFNjb3BlKCk7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSBjdXJyZW50TWV0aG9kU2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCisJCS8vIGlkZW50aXR5IGNoZWNrCisJCWlmICghY3VycmVudE1ldGhvZFNjb3BlLmlzU3RhdGljIAorCQkJJiYgIWN1cnJlbnRNZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbAorCQkJJiYgKHNvdXJjZVR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZQorCQkJCXx8IHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2Yoc291cmNlVHlwZSkpKSB7CisJCQlyZXR1cm4gRW11bGF0aW9uUGF0aFRvSW1wbGljaXRUaGlzOyAvLyBpbXBsaWNpdCB0aGlzIGlzIGdvb2QgZW5vdWdoCisJCX0KKwkJaWYgKCFzb3VyY2VUeXBlLmlzTmVzdGVkVHlwZSgpCisJCQl8fCBzb3VyY2VUeXBlLmlzU3RhdGljKCkpIHsgLy8gbm8gZW11bGF0aW9uIGZyb20gd2l0aGluIG5vbi1pbm5lciB0eXBlcworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJYm9vbGVhbiBpbnNpZGVDb25zdHJ1Y3RvciA9CisJCQljdXJyZW50TWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKTsKKwkJLy8gdXNlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaWYgcG9zc2libGUKKwkJaWYgKGluc2lkZUNvbnN0cnVjdG9yKSB7CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOworCQkJaWYgKChzeW50aGV0aWNBcmcgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlLCB0aGlzLCBmYWxzZSkpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgc3ludGhldGljQXJnIH07CisJCQl9CisJCX0KKworCQkvLyB1c2UgYSBkaXJlY3Qgc3ludGhldGljIGZpZWxkIHRoZW4KKwkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZDsKKwkJCWlmICgoc3ludGhldGljRmllbGQgPSBzb3VyY2VUeXBlLmdldFN5bnRoZXRpY0ZpZWxkKHRhcmdldEVuY2xvc2luZ1R5cGUsIHRoaXMsIGZhbHNlKSkgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBzeW50aGV0aWNGaWVsZCB9OworCQkJfQorCQkJLy8gY291bGQgYmUgcmVhY2hlZCB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgZW5jbG9zaW5nIGluc3RhbmNlIGxpbmsgKG5lc3RlZCBtZW1iZXJzKQorCQkJT2JqZWN0W10gcGF0aCA9IG5ldyBPYmplY3RbMl07IC8vIHByb2JhYmx5IGF0IGxlYXN0IDIgb2YgdGhlbQorCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHNvdXJjZVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJaWYgKGluc2lkZUNvbnN0cnVjdG9yKSB7CisJCQkJcGF0aFswXSA9ICgoTmVzdGVkVHlwZUJpbmRpbmcpIHNvdXJjZVR5cGUpLmdldFN5bnRoZXRpY0FyZ3VtZW50KChTb3VyY2VUeXBlQmluZGluZykgY3VycmVudFR5cGUsIHRoaXMsIGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJcGF0aFswXSA9CisJCQkJCXNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSwgdGhpcywgZmFsc2UpOworCQkJfQorCQkJaWYgKHBhdGhbMF0gIT0gbnVsbCkgeyAvLyBrZWVwIGFjY3VtdWxhdGluZworCQkJCWludCBjb3VudCA9IDE7CisJCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RW5jbG9zaW5nVHlwZTsKKwkJCQl3aGlsZSAoKGN1cnJlbnRFbmNsb3NpbmdUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSB7CisJCQkJCS8vZG9uZT8KKwkJCQkJaWYgKGN1cnJlbnRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUKKwkJCQkJCXx8IHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKQorCQkJCQkJYnJlYWs7CisJCQkJCXN5bnRoZXRpY0ZpZWxkID0gKChOZXN0ZWRUeXBlQmluZGluZykgY3VycmVudFR5cGUpLmdldFN5bnRoZXRpY0ZpZWxkKChTb3VyY2VUeXBlQmluZGluZykgY3VycmVudEVuY2xvc2luZ1R5cGUsIHRoaXMsIGZhbHNlKTsKKwkJCQkJaWYgKHN5bnRoZXRpY0ZpZWxkID09IG51bGwpCisJCQkJCQlicmVhazsKKwkJCQkJLy8gYXBwZW5kIGluc2lkZSB0aGUgcGF0aAorCQkJCQlpZiAoY291bnQgPT0gcGF0aC5sZW5ndGgpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgKHBhdGggPSBuZXcgT2JqZWN0W2NvdW50ICsgMV0pLCAwLCBjb3VudCk7CisJCQkJCX0KKwkJCQkJLy8gcHJpdmF0ZSBhY2Nlc3MgZW11bGF0aW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBzeW50aGV0aWMgZmllbGQgaXMgcHJpdmF0ZQorCQkJCQlwYXRoW2NvdW50KytdID0gKChTb3VyY2VUeXBlQmluZGluZykgc3ludGhldGljRmllbGQuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChzeW50aGV0aWNGaWVsZCwgdHJ1ZSk7CisJCQkJCWN1cnJlbnRUeXBlID0gY3VycmVudEVuY2xvc2luZ1R5cGU7CisJCQkJfQorCQkJCWlmIChjdXJyZW50VHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlCisJCQkJCXx8IHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKSB7CisJCQkJCXJldHVybiBwYXRoOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiBBUEkKKwkgKgorCSAqCUFuc3dlciB0aGUgY29uc3RydWN0b3IgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcy4KKwkgKgorCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMgCisJICoJCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBjb25zdHJ1Y3RvciBpcyB2aXNpYmxlLgorCSAqCisJICoJSWYgbm8gdmlzaWJsZSBjb25zdHJ1Y3RvciBpcyBkaXNjb3ZlcmVkLCBhbiBlcnJvciBiaW5kaW5nIGlzIGFuc3dlcmVkLgorCSAqLworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGdldENvbnN0cnVjdG9yKAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZVJlZmVyZW5jZShyZWNlaXZlclR5cGUpOworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2VzKGFyZ3VtZW50VHlwZXMpOworCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSByZWNlaXZlclR5cGUuZ2V0RXhhY3RDb25zdHJ1Y3Rvcihhcmd1bWVudFR5cGVzKTsKKwkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkKKwkJCWlmIChtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKworCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9CisJCQlyZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLkNvbnN0YW50UG9vbE5hbWUpOworCQlpZiAobWV0aG9kcyA9PSBOb01ldGhvZHMpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwKKwkJCQlhcmd1bWVudFR5cGVzLAorCQkJCU5vdEZvdW5kKTsKKworCQlNZXRob2RCaW5kaW5nW10gY29tcGF0aWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW21ldGhvZHMubGVuZ3RoXTsKKwkJaW50IGNvbXBhdGlibGVJbmRleCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZHNbaV0ucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpCisJCQkJY29tcGF0aWJsZVtjb21wYXRpYmxlSW5kZXgrK10gPSBtZXRob2RzW2ldOworCQlpZiAoY29tcGF0aWJsZUluZGV4ID09IDApCisJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwKKwkJCQlhcmd1bWVudFR5cGVzLAorCQkJCU5vdEZvdW5kKTsKKwkJLy8gbmVlZCBhIG1vcmUgZGVzY3JpcHRpdmUgZXJyb3IuLi4gY2Fubm90IGNvbnZlcnQgZnJvbSBYIHRvIFkKKworCQlNZXRob2RCaW5kaW5nW10gdmlzaWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW2NvbXBhdGlibGVJbmRleF07CisJCWludCB2aXNpYmxlSW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVJbmRleDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IGNvbXBhdGlibGVbaV07CisJCQlpZiAobWV0aG9kLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQl2aXNpYmxlW3Zpc2libGVJbmRleCsrXSA9IG1ldGhvZDsKKwkJfQorCQlpZiAodmlzaWJsZUluZGV4ID09IDEpCisJCQlyZXR1cm4gdmlzaWJsZVswXTsKKwkJaWYgKHZpc2libGVJbmRleCA9PSAwKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLkNvbnN0YW50UG9vbE5hbWUsCisJCQkJYXJndW1lbnRUeXBlcywKKwkJCQlOb3RWaXNpYmxlKTsKKwkJcmV0dXJuIG1vc3RTcGVjaWZpY0NsYXNzTWV0aG9kQmluZGluZyh2aXNpYmxlLCB2aXNpYmxlSW5kZXgpOworCX0KKworCS8qCisJICogVGhpcyByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50IHRoYXQgbWFwcyB0byBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhlIHN1aXRhYmxlIHR5cGUsCisJICogCWlmIG5vdCBmb3VuZCB0aGVuIGFuc3dlcnMgbmlsIC0tIGRvIG5vdCBjcmVhdGUgb25lCisgICAgICoJCisJICoJCQkjaW1wbGljaXRUaGlzCQkgIAkgCQkJCQkJOiAgdGhlIGltcGxpY2l0IHRoaXMgd2lsbCBiZSBvaworCSAqCQkJIygoYXJnKSB0aGlzJG4pCQkJCQkJCQk6IGF2YWlsYWJsZSBhcyBhIGNvbnN0cnVjdG9yIGFyZworCSAqIAkJIygoYXJnKSB0aGlzJG4gLi4uIHRoaXMkcCkgCQkJCTogYXZhaWxhYmxlIGFzIGFzIGEgY29uc3RydWN0b3IgYXJnICsgYSBzZXF1ZW5jZSBvZiBmaWVsZHMKKwkgKiAJCSMoKGZpZWxkRGVzY3IpIHRoaXMkbiAuLi4gdGhpcyRwKSAJOiBhdmFpbGFibGUgYXMgYSBzZXF1ZW5jZSBvZiBmaWVsZHMKKwkgKiAJCW5pbCAJCSAJCQkJCQkJCQkJCTogbm90IGZvdW5kCisJICoKKwkgKiAJTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIHNob3VsZCBhbnN3ZXIgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIHNlcXVlbmNlIHdoZW4KKwkgKiAJCXNob3J0Y3V0cyBhcmUgYXZhaWxhYmxlOgorCSAqIAkJCQl0aGlzJDAgLiB0aGlzJDAgLiB0aGlzJDAKKwkgKiAJCWluc3RlYWQgb2YKKwkgKiAJCQkJdGhpcyQyIC4gdGhpcyQxIC4gdGhpcyQwIC4gdGhpcyQxIC4gdGhpcyQwCisJICogCQl0aHVzIHRoZSBjb2RlIGdlbmVyYXRpb24gd2lsbCBiZSBtb3JlIGNvbXBhY3QgYW5kIHJ1bnRpbWUgZmFzdGVyCisJICovCisJcHVibGljIFZhcmlhYmxlQmluZGluZ1tdIGdldEVtdWxhdGlvblBhdGgoTG9jYWxWYXJpYWJsZUJpbmRpbmcgb3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisKKwkJTWV0aG9kU2NvcGUgY3VycmVudE1ldGhvZFNjb3BlID0gdGhpcy5tZXRob2RTY29wZSgpOworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gY3VycmVudE1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKworCQkvLyBpZGVudGl0eSBjaGVjaworCQlpZiAoY3VycmVudE1ldGhvZFNjb3BlID09IG91dGVyTG9jYWxWYXJpYWJsZS5kZWNsYXJpbmdTY29wZS5tZXRob2RTY29wZSgpKSB7CisJCQlyZXR1cm4gbmV3IFZhcmlhYmxlQmluZGluZ1tdIHsgb3V0ZXJMb2NhbFZhcmlhYmxlIH07CisJCQkvLyBpbXBsaWNpdCB0aGlzIGlzIGdvb2QgZW5vdWdoCisJCX0KKwkJLy8gdXNlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaWYgcG9zc2libGUKKwkJaWYgKGN1cnJlbnRNZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpCisJCQkmJiAoc291cmNlVHlwZS5pc05lc3RlZFR5cGUoKSkpIHsKKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmc7CisJCQlpZiAoKHN5bnRoZXRpY0FyZyA9ICgoTmVzdGVkVHlwZUJpbmRpbmcpIHNvdXJjZVR5cGUpLmdldFN5bnRoZXRpY0FyZ3VtZW50KG91dGVyTG9jYWxWYXJpYWJsZSkpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IFZhcmlhYmxlQmluZGluZ1tdIHsgc3ludGhldGljQXJnIH07CisJCQl9CisJCX0KKwkJLy8gdXNlIGEgc3ludGhldGljIGZpZWxkIHRoZW4KKwkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZDsKKwkJCWlmICgoc3ludGhldGljRmllbGQgPSBzb3VyY2VUeXBlLmdldFN5bnRoZXRpY0ZpZWxkKG91dGVyTG9jYWxWYXJpYWJsZSkpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IFZhcmlhYmxlQmluZGluZ1tdIHsgc3ludGhldGljRmllbGQgfTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIFRoaXMgcmV0cmlldmVzIHRoZSBhcmd1bWVudCB0aGF0IG1hcHMgdG8gYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHRoZSBzdWl0YWJsZSB0eXBlLAorCSAqIAlpZiBub3QgZm91bmQgdGhlbiBhbnN3ZXJzIG5pbCAtLSBkbyBub3QgY3JlYXRlIG9uZQorCSAqCisJICoJCSNpbXBsaWNpdFRoaXMJCQkJCQkJCTogIHRoZSBpbXBsaWNpdCB0aGlzIHdpbGwgYmUgb2sKKwkgKgkJIygoYXJnKSB0aGlzJG4pCQkJCQkJCQk6IGF2YWlsYWJsZSBhcyBhIGNvbnN0cnVjdG9yIGFyZworCSAqIAkJIygoYXJnKSB0aGlzJG4gYWNjZXNzJG0uLi4gYWNjZXNzJHApIAkJOiBhdmFpbGFibGUgYXMgYXMgYSBjb25zdHJ1Y3RvciBhcmcgKyBhIHNlcXVlbmNlIG9mIHN5bnRoZXRpYyBhY2Nlc3NvcnMgdG8gc3ludGhldGljIGZpZWxkcworCSAqIAkJIygoZmllbGREZXNjcikgdGhpcyRuIGFjY2VzcyNtLi4uIGFjY2VzcyRwKQk6IGF2YWlsYWJsZSBhcyBhIGZpcnN0IHN5bnRoZXRpYyBmaWVsZCArIGEgc2VxdWVuY2Ugb2Ygc3ludGhldGljIGFjY2Vzc29ycyB0byBzeW50aGV0aWMgZmllbGRzCisJICogCQluaWwgCQkgCQkJCQkJCQk6IG5vdCBmb3VuZAorCSAqCisJICoJRVhBQ1QgTUFUQ0ggVkVSU0lPTiAtIG5vIHR5cGUgY29tcGF0aWJpbGl0eSBpcyBwZXJmb3JtZWQKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RXhhY3RFbXVsYXRpb25QYXRoKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSkgeworCisJCU1ldGhvZFNjb3BlIGN1cnJlbnRNZXRob2RTY29wZSA9IHRoaXMubWV0aG9kU2NvcGUoKTsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IGN1cnJlbnRNZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisKKwkJLy8gaWRlbnRpdHkgY2hlY2sKKwkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMgCisJCQkmJiAhY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsCisJCQkmJiAoc291cmNlVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKSkgeworCQkJcmV0dXJuIEVtdWxhdGlvblBhdGhUb0ltcGxpY2l0VGhpczsgLy8gaW1wbGljaXQgdGhpcyBpcyBnb29kIGVub3VnaAorCQl9CisJCWlmICghc291cmNlVHlwZS5pc05lc3RlZFR5cGUoKQorCQkJfHwgc291cmNlVHlwZS5pc1N0YXRpYygpKSB7IC8vIG5vIGVtdWxhdGlvbiBmcm9tIHdpdGhpbiBub24taW5uZXIgdHlwZXMKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJYm9vbGVhbiBpbnNpZGVDb25zdHJ1Y3RvciA9CisJCQljdXJyZW50TWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKTsKKwkJLy8gdXNlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaWYgcG9zc2libGUKKwkJaWYgKGluc2lkZUNvbnN0cnVjdG9yKSB7CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOworCQkJaWYgKChzeW50aGV0aWNBcmcgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlLCB0aGlzLCB0cnVlKSkgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBzeW50aGV0aWNBcmcgfTsKKwkJCX0KKwkJfQorCQkvLyB1c2UgYSBkaXJlY3Qgc3ludGhldGljIGZpZWxkIHRoZW4KKwkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZDsKKwkJCWlmICgoc3ludGhldGljRmllbGQgPSBzb3VyY2VUeXBlLmdldFN5bnRoZXRpY0ZpZWxkKHRhcmdldEVuY2xvc2luZ1R5cGUsIHRoaXMsIHRydWUpKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHN5bnRoZXRpY0ZpZWxkIH07CisJCQl9CisJCQkvLyBjb3VsZCBiZSByZWFjaGVkIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBlbmNsb3NpbmcgaW5zdGFuY2UgbGluayAobmVzdGVkIG1lbWJlcnMpCisJCQlPYmplY3RbXSBwYXRoID0gbmV3IE9iamVjdFsyXTsgLy8gcHJvYmFibHkgYXQgbGVhc3QgMiBvZiB0aGVtCisJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQlpZiAoaW5zaWRlQ29uc3RydWN0b3IpIHsKKwkJCQlwYXRoWzBdID0KKwkJCQkJKChOZXN0ZWRUeXBlQmluZGluZykgc291cmNlVHlwZSkuZ2V0U3ludGhldGljQXJndW1lbnQoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSwJdGhpcywgdHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCXBhdGhbMF0gPQorCQkJCQlzb3VyY2VUeXBlLmdldFN5bnRoZXRpY0ZpZWxkKChTb3VyY2VUeXBlQmluZGluZykgY3VycmVudFR5cGUsIHRoaXMsIHRydWUpOworCQkJfQorCQkJaWYgKHBhdGhbMF0gIT0gbnVsbCkgeyAvLyBrZWVwIGFjY3VtdWxhdGluZworCQkJCWludCBjb3VudCA9IDE7CisJCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RW5jbG9zaW5nVHlwZTsKKwkJCQl3aGlsZSAoKGN1cnJlbnRFbmNsb3NpbmdUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSB7CisJCQkJCS8vZG9uZT8KKwkJCQkJaWYgKGN1cnJlbnRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCisJCQkJCQlicmVhazsKKwkJCQkJc3ludGhldGljRmllbGQgPQorCQkJCQkJKChOZXN0ZWRUeXBlQmluZGluZykgY3VycmVudFR5cGUpLmdldFN5bnRoZXRpY0ZpZWxkKAorCQkJCQkJCShTb3VyY2VUeXBlQmluZGluZykgY3VycmVudEVuY2xvc2luZ1R5cGUsCisJCQkJCQkJdGhpcywKKwkJCQkJCQl0cnVlKTsKKwkJCQkJaWYgKHN5bnRoZXRpY0ZpZWxkID09IG51bGwpCisJCQkJCQlicmVhazsKKwkJCQkJLy8gYXBwZW5kIGluc2lkZSB0aGUgcGF0aAorCQkJCQlpZiAoY291bnQgPT0gcGF0aC5sZW5ndGgpIHsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgKHBhdGggPSBuZXcgT2JqZWN0W2NvdW50ICsgMV0pLCAwLCBjb3VudCk7CisJCQkJCX0KKwkJCQkJLy8gcHJpdmF0ZSBhY2Nlc3MgZW11bGF0aW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBzeW50aGV0aWMgZmllbGQgaXMgcHJpdmF0ZQorCQkJCQlwYXRoW2NvdW50KytdID0gKChTb3VyY2VUeXBlQmluZGluZykgc3ludGhldGljRmllbGQuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChzeW50aGV0aWNGaWVsZCwgdHJ1ZSk7CisJCQkJCWN1cnJlbnRUeXBlID0gY3VycmVudEVuY2xvc2luZ1R5cGU7CisJCQkJfQorCQkJCWlmIChjdXJyZW50VHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKSB7CisJCQkJCXJldHVybiBwYXRoOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiBBUEkKKyAgICAgKgkKKwkgKglBbnN3ZXIgdGhlIGZpZWxkIGJpbmRpbmcgdGhhdCBjb3JyZXNwb25kcyB0byBmaWVsZE5hbWUuCisJICoJU3RhcnQgdGhlIGxvb2t1cCBhdCB0aGUgcmVjZWl2ZXJUeXBlLgorCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMKKwkgKgkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIGZpZWxkIGlzIHZpc2libGUuCisJICoJT25seSBmaWVsZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXJUeXBlIG9yIGl0cyBzdXBlcnR5cGVzIGFyZSBhbnN3ZXJlZDsKKwkgKglhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyB0eXBlIHdpbGwgbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgQVBJLgorCSAqCisJICoJSWYgbm8gdmlzaWJsZSBmaWVsZCBpcyBkaXNjb3ZlcmVkLCBhbiBlcnJvciBiaW5kaW5nIGlzIGFuc3dlcmVkLgorCSAqLworCXB1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0RmllbGQoCisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJY2hhcltdIGZpZWxkTmFtZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKworCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaW5kRmllbGQocmVjZWl2ZXJUeXBlLCBmaWVsZE5hbWUsIGludm9jYXRpb25TaXRlKTsKKwkJaWYgKGZpZWxkID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJcmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZworCQkJCQk/IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUKKwkJCQkJOiBudWxsLAorCQkJCWZpZWxkTmFtZSwKKwkJCQlOb3RGb3VuZCk7CisJCWVsc2UKKwkJCXJldHVybiBmaWVsZDsKKwl9CisKKwkvKiBBUEkKKyAgICAgKgkKKwkgKglBbnN3ZXIgdGhlIG1ldGhvZCBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMuCisJICoJU3RhcnQgdGhlIGxvb2t1cCBhdCB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgdGhlIHJlY2VpdmVyLgorCSAqCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMgCisJICoJCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBtZXRob2QgaXMgdmlzaWJsZS4KKwkgKgkJc2V0RGVwdGgoaW50KTsgdGhpcyBpcyB1c2VkIHRvIHJlY29yZCB0aGUgZGVwdGggb2YgdGhlIGRpc2NvdmVyZWQgbWV0aG9kCisJICoJCQlyZWxhdGl2ZSB0byB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgdGhlIHJlY2VpdmVyLiAoSWYgdGhlIG1ldGhvZCBpcyBkZWZpbmVkCisJICoJCQlpbiB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgdGhlIHJlY2VpdmVyLCB0aGUgZGVwdGggaXMgMDsgaW4gdGhlIG5leHQgZW5jbG9zaW5nCisJICoJCQl0eXBlLCB0aGUgZGVwdGggaXMgMTsgYW5kIHNvIG9uCisJICogCisJICoJSWYgbm8gdmlzaWJsZSBtZXRob2QgaXMgZGlzY292ZXJlZCwgYW4gZXJyb3IgYmluZGluZyBpcyBhbnN3ZXJlZC4KKwkgKi8KKwlwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRJbXBsaWNpdE1ldGhvZCgKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisKKwkJYm9vbGVhbiBpbnNpZGVTdGF0aWNDb250ZXh0ID0gZmFsc2U7CisJCWJvb2xlYW4gaW5zaWRlQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisJCU1ldGhvZEJpbmRpbmcgZm91bmRNZXRob2QgPSBudWxsOworCQlQcm9ibGVtTWV0aG9kQmluZGluZyBmb3VuZEZ1enp5UHJvYmxlbSA9IG51bGw7CisJCS8vIHRoZSB3ZWlyZCBtZXRob2QgbG9va3VwIGNhc2UgKG1hdGNoZXMgbWV0aG9kIG5hbWUgaW4gc2NvcGUsIHRoZW4gYXJnIHR5cGVzLCB0aGVuIHZpc2liaWxpdHkpCisJCVByb2JsZW1NZXRob2RCaW5kaW5nIGZvdW5kSW5zaWRlUHJvYmxlbSA9IG51bGw7CisJCS8vIGluc2lkZSBDb25zdHJ1Y3RvciBjYWxsIG9yIGluc2lkZSBzdGF0aWMgY29udGV4dAorCQlTY29wZSBzY29wZSA9IHRoaXM7CisJCWludCBkZXB0aCA9IDA7CisJCWRvbmUgOiB3aGlsZSAodHJ1ZSkgeyAvLyBkb25lIHdoZW4gYSBDT01QSUxBVElPTl9VTklUX1NDT1BFIGlzIGZvdW5kCisJCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsKKwkJCQljYXNlIE1FVEhPRF9TQ09QRSA6CisJCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gKE1ldGhvZFNjb3BlKSBzY29wZTsKKwkJCQkJaW5zaWRlU3RhdGljQ29udGV4dCB8PSBtZXRob2RTY29wZS5pc1N0YXRpYzsKKwkJCQkJaW5zaWRlQ29uc3RydWN0b3JDYWxsIHw9IG1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsOworCQkJCQlicmVhazsKKwkJCQljYXNlIENMQVNTX1NDT1BFIDoKKwkJCQkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlID0gKENsYXNzU2NvcGUpIHNjb3BlOworCQkJCQlTb3VyY2VUeXBlQmluZGluZyByZWNlaXZlclR5cGUgPSBjbGFzc1Njb3BlLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJCQkJYm9vbGVhbiBpc0V4YWN0TWF0Y2ggPSB0cnVlOworCQkJCQkvLyByZXRyaWV2ZSBhbiBleGFjdCB2aXNpYmxlIG1hdGNoIChpZiBwb3NzaWJsZSkKKwkJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0KKwkJCQkJCShmb3VuZE1ldGhvZCA9PSBudWxsKQorCQkJCQkJCT8gY2xhc3NTY29wZS5maW5kRXhhY3RNZXRob2QoCisJCQkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCQkJc2VsZWN0b3IsCisJCQkJCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJCQkJCWludm9jYXRpb25TaXRlKQorCQkJCQkJCTogY2xhc3NTY29wZS5maW5kRXhhY3RNZXRob2QoCisJCQkJCQkJCXJlY2VpdmVyVHlwZSwKKwkJCQkJCQkJZm91bmRNZXRob2Quc2VsZWN0b3IsCisJCQkJCQkJCWZvdW5kTWV0aG9kLnBhcmFtZXRlcnMsCisJCQkJCQkJCWludm9jYXRpb25TaXRlKTsKKwkJCQkJLy8JCQkJCQk/IGZpbmRFeGFjdE1ldGhvZChyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSkKKwkJCQkJLy8JCQkJCQk6IGZpbmRFeGFjdE1ldGhvZChyZWNlaXZlclR5cGUsIGZvdW5kTWV0aG9kLnNlbGVjdG9yLCBmb3VuZE1ldGhvZC5wYXJhbWV0ZXJzLCBpbnZvY2F0aW9uU2l0ZSk7CisJCQkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJCS8vIGFuc3dlcnMgY2xvc2VzdCBhcHByb3hpbWF0aW9uLCBtYXkgbm90IGNoZWNrIGFyZ3VtZW50VHlwZXMgb3IgdmlzaWJpbGl0eQorCQkJCQkJaXNFeGFjdE1hdGNoID0gZmFsc2U7CisJCQkJCQltZXRob2RCaW5kaW5nID0KKwkJCQkJCQljbGFzc1Njb3BlLmZpbmRNZXRob2QocmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworCQkJCQkJLy8JCQkJCW1ldGhvZEJpbmRpbmcgPSBmaW5kTWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlKTsKKwkJCQkJfQorCQkJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7IC8vIHNraXAgaXQgaWYgd2UgZGlkIG5vdCBmaW5kIGFueXRoaW5nCisJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wcm9ibGVtSWQoKSA9PSBBbWJpZ3VvdXMpIHsKKwkJCQkJCQlpZiAoZm91bmRNZXRob2QgPT0gbnVsbCB8fCBmb3VuZE1ldGhvZC5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKQorCQkJCQkJCQkvLyBzdXBlcmNlZGVzIGFueSBwb3RlbnRpYWwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSBwcm9ibGVtCisJCQkJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJLy8gbWFrZSB0aGUgdXNlciBxdWFsaWZ5IHRoZSBtZXRob2QsIGxpa2VseSB3YW50cyB0aGUgZmlyc3QgaW5oZXJpdGVkIG1ldGhvZCAoamF2YWMgZ2VuZXJhdGVzIGFuIGFtYmlndW91cyBlcnJvciBpbnN0ZWFkKQorCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCQkJCQkJc2VsZWN0b3IsCisJCQkJCQkJCQlhcmd1bWVudFR5cGVzLAorCQkJCQkJCQkJSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CisJCQkJCQl9CisKKwkJCQkJCVByb2JsZW1NZXRob2RCaW5kaW5nIGZ1enp5UHJvYmxlbSA9IG51bGw7CisJCQkJCQlQcm9ibGVtTWV0aG9kQmluZGluZyBpbnNpZGVQcm9ibGVtID0gbnVsbDsKKwkJCQkJCWlmIChtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQlpZiAoIWlzRXhhY3RNYXRjaCkgeworCQkJCQkJCQlpZiAoIWFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpIHsKKwkJCQkJCQkJCWlmIChmb3VuZE1ldGhvZCA9PSBudWxsIHx8IGZvdW5kTWV0aG9kLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpeworCQkJCQkJCQkJCS8vIGluaGVyaXRlZCBtaXNtYXRjaCBpcyByZXBvcnRlZCBkaXJlY3RseSwgbm90IGxvb2tpbmcgYXQgZW5jbG9zaW5nIG1hdGNoZXMKKwkJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKG1ldGhvZEJpbmRpbmcsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBOb3RGb3VuZCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQkvLyBtYWtlIHRoZSB1c2VyIHF1YWxpZnkgdGhlIG1ldGhvZCwgbGlrZWx5IHdhbnRzIHRoZSBmaXJzdCBpbmhlcml0ZWQgbWV0aG9kIChqYXZhYyBnZW5lcmF0ZXMgYW4gYW1iaWd1b3VzIGVycm9yIGluc3RlYWQpCisJCQkJCQkJCQlmdXp6eVByb2JsZW0gPSBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCisJCQkJCQkJCX0gZWxzZSBpZiAoIW1ldGhvZEJpbmRpbmcuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgY2xhc3NTY29wZSkpIHsKKwkJCQkJCQkJCS8vIHVzaW5nIDxjbGFzc1Njb3BlPiBpbnN0ZWFkIG9mIDx0aGlzPiBmb3IgdmlzaWJpbGl0eSBjaGVjayBkb2VzIGdyYW50IGFsbCBhY2Nlc3MgdG8gaW5uZXJjbGFzcworCQkJCQkJCQkJZnV6enlQcm9ibGVtID0KKwkJCQkJCQkJCQluZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoCisJCQkJCQkJCQkJCXNlbGVjdG9yLAorCQkJCQkJCQkJCQlhcmd1bWVudFR5cGVzLAorCQkJCQkJCQkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCQkJCQkJCQlOb3RWaXNpYmxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiAoZnV6enlQcm9ibGVtID09IG51bGwgJiYgIW1ldGhvZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQkJCQlpZiAoaW5zaWRlQ29uc3RydWN0b3JDYWxsKSB7CisJCQkJCQkJCQlpbnNpZGVQcm9ibGVtID0KKwkJCQkJCQkJCQluZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoCisJCQkJCQkJCQkJCW1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsCisJCQkJCQkJCQkJCW1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywKKwkJCQkJCQkJCQkJTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24pOworCQkJCQkJCQl9IGVsc2UgaWYgKGluc2lkZVN0YXRpY0NvbnRleHQpIHsKKwkJCQkJCQkJCWluc2lkZVByb2JsZW0gPQorCQkJCQkJCQkJCW5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5zZWxlY3RvciwKKwkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAorCQkJCQkJCQkJCQlOb25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCWlmIChyZWNlaXZlclR5cGUgPT0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcworCQkJCQkJCQl8fCAocmVjZWl2ZXJUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpKSAhPSBOb01ldGhvZHMKKwkJCQkJCQkJfHwgKChmdXp6eVByb2JsZW0gPT0gbnVsbCB8fCBmdXp6eVByb2JsZW0ucHJvYmxlbUlkKCkgIT0gTm90VmlzaWJsZSkgJiYgZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KSl7CisJCQkJCQkJCS8vIGZvdW5kIGEgdmFsaWQgbWV0aG9kIGluIHRoZSAnaW1tZWRpYXRlJyBzY29wZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJCQkJCS8vIE9SIHRoZSByZWNlaXZlclR5cGUgaW1wbGVtZW50ZWQgYSBtZXRob2Qgd2l0aCB0aGUgY29ycmVjdCBuYW1lCisJCQkJCQkJCS8vIE9SIGluIDEuNCBtb2RlIChpbmhlcml0ZWQgdmlzaWJsZSBzaGFkb3dzIGVuY2xvc2luZykKKwkJCQkJCQkJaWYgKGZvdW5kTWV0aG9kID09IG51bGwpIHsKKwkJCQkJCQkJCWlmIChkZXB0aCA+IDApeworCQkJCQkJCQkJCWludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKKwkJCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZS5zZXRBY3R1YWxSZWNlaXZlclR5cGUocmVjZWl2ZXJUeXBlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vIHJldHVybiB0aGUgbWV0aG9kQmluZGluZyBpZiBpdCBpcyBub3QgZGVjbGFyZWQgaW4gYSBzdXBlcmNsYXNzIG9mIHRoZSBzY29wZSdzIGJpbmRpbmcgKGkuZS4gImluaGVyaXRlZCIpCisJCQkJCQkJCQlpZiAoZnV6enlQcm9ibGVtICE9IG51bGwpCisJCQkJCQkJCQkJcmV0dXJuIGZ1enp5UHJvYmxlbTsKKwkJCQkJCQkJCWlmIChpbnNpZGVQcm9ibGVtICE9IG51bGwpCisJCQkJCQkJCQkJcmV0dXJuIGluc2lkZVByb2JsZW07CisJCQkJCQkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBpZiBhIG1ldGhvZCB3YXMgZm91bmQsIGNvbXBsYWluIHdoZW4gYW5vdGhlciBpcyBmb3VuZCBpbiBhbiAnaW1tZWRpYXRlJyBlbmNsb3NpbmcgdHlwZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJCQkJCS8vIE5PVEU6IFVubGlrZSBmaWVsZHMsIGEgbm9uIHZpc2libGUgbWV0aG9kIGhpZGVzIGEgdmlzaWJsZSBtZXRob2QKKwkJCQkJCQkJaWYgKGZvdW5kTWV0aG9kLmRlY2xhcmluZ0NsYXNzICE9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpCisJCQkJCQkJCQkvLyBpZS4gaGF2ZSB3ZSBmb3VuZCB0aGUgc2FtZSBtZXRob2QgLSBkbyBub3QgdHJ1c3QgZmllbGQgaWRlbnRpdHkgeWV0CisJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCQkJCQkJCW1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsCisJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAorCQkJCQkJCQkJCUluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJaWYgKGZvdW5kTWV0aG9kID09IG51bGwKKwkJCQkJCQl8fCAoZm91bmRNZXRob2QucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZQorCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnByb2JsZW1JZCgpICE9IE5vdFZpc2libGUpKSB7CisJCQkJCQkJLy8gb25seSByZW1lbWJlciB0aGUgbWV0aG9kQmluZGluZyBpZiBpdHMgdGhlIGZpcnN0IG9uZSBmb3VuZCBvciB0aGUgcHJldmlvdXMgb25lIHdhcyBub3QgdmlzaWJsZSAmIG1ldGhvZEJpbmRpbmcgaXMuLi4KKwkJCQkJCQkvLyByZW1lbWJlciB0aGF0IHByaXZhdGUgbWV0aG9kcyBhcmUgdmlzaWJsZSBpZiBkZWZpbmVkIGRpcmVjdGx5IGJ5IGFuIGVuY2xvc2luZyBjbGFzcworCQkJCQkJCWlmIChkZXB0aCA+IDApeworCQkJCQkJCQlpbnZvY2F0aW9uU2l0ZS5zZXREZXB0aChkZXB0aCk7CisJCQkJCQkJCWludm9jYXRpb25TaXRlLnNldEFjdHVhbFJlY2VpdmVyVHlwZShyZWNlaXZlclR5cGUpOworCQkJCQkJCX0KKwkJCQkJCQlmb3VuZEZ1enp5UHJvYmxlbSA9IGZ1enp5UHJvYmxlbTsKKwkJCQkJCQlmb3VuZEluc2lkZVByb2JsZW0gPSBpbnNpZGVQcm9ibGVtOworCQkJCQkJCWlmIChmdXp6eVByb2JsZW0gPT0gbnVsbCkKKwkJCQkJCQkJZm91bmRNZXRob2QgPSBtZXRob2RCaW5kaW5nOyAvLyBvbmx5IGtlZXAgaXQgaWYgbm8gZXJyb3Igd2FzIGZvdW5kCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZGVwdGgrKzsKKwkJCQkJaW5zaWRlU3RhdGljQ29udGV4dCB8PSByZWNlaXZlclR5cGUuaXNTdGF0aWMoKTsKKwkJCQkJLy8gMUVYNUk4WiAtIGFjY2Vzc2luZyBvdXRlciBmaWVsZHMgd2l0aGluIGEgY29uc3RydWN0b3IgY2FsbCBpcyBwZXJtaXR0ZWQKKwkJCQkJLy8gaW4gb3JkZXIgdG8gZG8gc28sIHdlIGNoYW5nZSB0aGUgZmxhZyBhcyB3ZSBleGl0IGZyb20gdGhlIHR5cGUsIG5vdCB0aGUgbWV0aG9kCisJCQkJCS8vIGl0c2VsZiwgYmVjYXVzZSB0aGUgY2xhc3Mgc2NvcGUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZmllbGRzLgorCQkJCQlNZXRob2RTY29wZSBlbmNsb3NpbmdNZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCQkJCWluc2lkZUNvbnN0cnVjdG9yQ2FsbCA9CisJCQkJCQllbmNsb3NpbmdNZXRob2RTY29wZSA9PSBudWxsID8gZmFsc2UgOiBlbmNsb3NpbmdNZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDT01QSUxBVElPTl9VTklUX1NDT1BFIDoKKwkJCQkJYnJlYWsgZG9uZTsKKwkJCX0KKwkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQl9CisKKwkJaWYgKGZvdW5kRnV6enlQcm9ibGVtICE9IG51bGwpCisJCQlyZXR1cm4gZm91bmRGdXp6eVByb2JsZW07CisJCWlmIChmb3VuZEluc2lkZVByb2JsZW0gIT0gbnVsbCkKKwkJCXJldHVybiBmb3VuZEluc2lkZVByb2JsZW07CisJCWlmIChmb3VuZE1ldGhvZCAhPSBudWxsKQorCQkJcmV0dXJuIGZvdW5kTWV0aG9kOworCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBOb3RGb3VuZCk7CisJfQorCisJLyogQVBJCisgICAgICoJCisJICoJQW5zd2VyIHRoZSBtZXRob2QgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLgorCSAqCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIHJlY2VpdmVyVHlwZS4KKwkgKglJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIAorCSAqCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgbWV0aG9kIGlzIHZpc2libGUuCisJICoKKwkgKglPbmx5IG1ldGhvZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXJUeXBlIG9yIGl0cyBzdXBlcnR5cGVzIGFyZSBhbnN3ZXJlZDsKKwkgKgl1c2UgZ2V0SW1wbGljaXRNZXRob2QoKSB0byBkaXNjb3ZlciBtZXRob2RzIG9mIGVuY2xvc2luZyB0eXBlcy4KKwkgKgorCSAqCUlmIG5vIHZpc2libGUgbWV0aG9kIGlzIGRpc2NvdmVyZWQsIGFuIGVycm9yIGJpbmRpbmcgaXMgYW5zd2VyZWQuCisJICovCisJcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0TWV0aG9kKAorCQlUeXBlQmluZGluZyByZWNlaXZlclR5cGUsCisJCWNoYXJbXSBzZWxlY3RvciwKKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCWlmIChyZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKSkKKwkJCXJldHVybiBmaW5kTWV0aG9kRm9yQXJyYXkoCisJCQkJKEFycmF5QmluZGluZykgcmVjZWl2ZXJUeXBlLAorCQkJCXNlbGVjdG9yLAorCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJaW52b2NhdGlvblNpdGUpOworCQlpZiAocmVjZWl2ZXJUeXBlLmlzQmFzZVR5cGUoKSkKKwkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdEZvdW5kKTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwkJaWYgKCFjdXJyZW50VHlwZS5jYW5CZVNlZW5CeSh0aGlzKSkKKwkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdFZpc2libGUpOworCQkvLyAqKiogTmVlZCBhIG5ldyBwcm9ibGVtIGlkIC0gVHlwZU5vdFZpc2libGU/CisKKwkJLy8gcmV0cmlldmUgYW4gZXhhY3QgdmlzaWJsZSBtYXRjaCAoaWYgcG9zc2libGUpCisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9CisJCQlmaW5kRXhhY3RNZXRob2QoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CisJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpCisJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKworCQkvLyBhbnN3ZXJzIGNsb3Nlc3QgYXBwcm94aW1hdGlvbiwgbWF5IG5vdCBjaGVjayBhcmd1bWVudFR5cGVzIG9yIHZpc2liaWxpdHkKKwkJbWV0aG9kQmluZGluZyA9CisJCQlmaW5kTWV0aG9kKGN1cnJlbnRUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOworCQlpZiAobWV0aG9kQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlpZiAoIWFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQkJbWV0aG9kQmluZGluZywKKwkJCQkJc2VsZWN0b3IsCisJCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJCU5vdEZvdW5kKTsKKwkJCWlmICghbWV0aG9kQmluZGluZy5jYW5CZVNlZW5CeShjdXJyZW50VHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoCisJCQkJCXNlbGVjdG9yLAorCQkJCQlhcmd1bWVudFR5cGVzLAorCQkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCQlOb3RWaXNpYmxlKTsKKwkJfQorCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwl9CisKKwlwdWJsaWMgaW50IG1heFNoaWZ0ZWRPZmZzZXQoKSB7CisJCWludCBtYXggPSAtMTsKKwkJaWYgKHRoaXMuc2hpZnRTY29wZXMgIT0gbnVsbCl7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5zaGlmdFNjb3Blcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQkJaW50IHN1Yk1heE9mZnNldCA9IHRoaXMuc2hpZnRTY29wZXNbaV0ubWF4T2Zmc2V0OworCQkJCWlmIChzdWJNYXhPZmZzZXQgPiBtYXgpIG1heCA9IHN1Yk1heE9mZnNldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWF4OworCX0KKwkKKwkvKiBBbnN3ZXIgdGhlIHByb2JsZW0gcmVwb3J0ZXIgdG8gdXNlIGZvciByYWlzaW5nIG5ldyBwcm9ibGVtcy4KKwkgKgorCSAqIE5vdGUgdGhhdCBhcyBhIHNpZGUtZWZmZWN0LCB0aGlzIHVwZGF0ZXMgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGNvbnRleHQKKwkgKiAodW5pdCwgdHlwZSBvciBtZXRob2QpIGluIGNhc2UgdGhlIHByb2JsZW0gaGFuZGxlciBkZWNpZGVzIGl0IGlzIG5lY2Vzc2FyeQorCSAqIHRvIGFib3J0LgorCSAqLworCXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCkgeworCisJCXJldHVybiBvdXRlck1vc3RNZXRob2RTY29wZSgpLnByb2JsZW1SZXBvcnRlcigpOworCX0KKworCS8qCisJICogQ29kZSByZXNwb25zaWJsZSB0byByZXF1ZXN0IHNvbWUgbW9yZSBlbXVsYXRpb24gd29yayBpbnNpZGUgdGhlIGludm9jYXRpb24gdHlwZSwgc28gYXMgdG8gc3VwcGx5CisJICogY29ycmVjdCBzeW50aGV0aWMgYXJndW1lbnRzIHRvIGFueSBhbGxvY2F0aW9uIG9mIHRoZSB0YXJnZXQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wYWdhdGVJbm5lckVtdWxhdGlvbigKKwkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlLAorCQlib29sZWFuIGlzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwKKwkJYm9vbGVhbiB1c2VEaXJlY3RSZWZlcmVuY2UpIHsKKworCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5CisJCS8vIHByb3BhZ2UgZW11bGF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgaW5zdGFuY2VzCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzOworCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSB0YXJnZXRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKSkKKwkJCSE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBzeW50aGV0aWNBcmdUeXBlID0gc3ludGhldGljQXJndW1lbnRUeXBlc1tpXTsKKwkJCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgdGhlIG9uZSB0aGF0IGNvdWxkIG1hdGNoIGEgc3VwcGxpZWQgZW5jbG9zaW5nIGluc3RhbmNlCisJCQkJaWYgKCEoaXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkCisJCQkJCSYmIChzeW50aGV0aWNBcmdUeXBlID09IHRhcmdldFR5cGUuZW5jbG9zaW5nVHlwZSgpKSkpIHsKKwkJCQkJdGhpcy5lbXVsYXRlT3V0ZXJBY2Nlc3Moc3ludGhldGljQXJnVHlwZSwgdXNlRGlyZWN0UmVmZXJlbmNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzOworCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IHRhcmdldFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpKSAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZyA9IHN5bnRoZXRpY0FyZ3VtZW50c1tpXTsKKwkJCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgdGhlIG9uZSB0aGF0IGNvdWxkIG1hdGNoIGEgc3VwcGxpZWQgZW5jbG9zaW5nIGluc3RhbmNlCisJCQkJaWYgKCEoaXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkCisJCQkJCSYmIChzeW50aGV0aWNBcmcudHlwZSA9PSB0YXJnZXRUeXBlLmVuY2xvc2luZ1R5cGUoKSkpKSB7CisJCQkJCXRoaXMuZW11bGF0ZU91dGVyQWNjZXNzKHN5bnRoZXRpY0FyZy5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIEFuc3dlciB0aGUgcmVmZXJlbmNlIHR5cGUgb2YgdGhpcyBzY29wZS4KKwkgKgorCSAqIGkuZS4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHR5cGUgb2YgdGhpcyBzY29wZS4KKwkgKi8KKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHJlZmVyZW5jZVR5cGUoKSB7CisKKwkJcmV0dXJuIG1ldGhvZFNjb3BlKCkucmVmZXJlbmNlVHlwZSgpOworCX0KKworCS8vIHN0YXJ0IHBvc2l0aW9uIGluIHRoaXMgc2NvcGUgLSBmb3Igb3JkZXJpbmcgc2NvcGVzIHZzLiB2YXJpYWJsZXMKKwlpbnQgc3RhcnRJbmRleCgpIHsKKwkJcmV0dXJuIHN0YXJ0SW5kZXg7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRvU3RyaW5nKDApOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCisJCVN0cmluZyBzID0gYmFzaWNUb1N0cmluZyh0YWIpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlSW5kZXg7IGkrKykKKwkJCWlmIChzdWJzY29wZXNbaV0gaW5zdGFuY2VvZiBCbG9ja1Njb3BlKQorCQkJCXMgKz0gKChCbG9ja1Njb3BlKSBzdWJzY29wZXNbaV0pLnRvU3RyaW5nKHRhYiArIDEpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NsYXNzU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI2OGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKQEAgLTAsMCArMSw4NzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DbGluaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NTY29wZSBleHRlbmRzIFNjb3BlIHsKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHJlZmVyZW5jZUNvbnRleHQ7CisJCisJcHVibGljIENsYXNzU2NvcGUoU2NvcGUgcGFyZW50LCBUeXBlRGVjbGFyYXRpb24gY29udGV4dCkgeworCQlzdXBlcihDTEFTU19TQ09QRSwgcGFyZW50KTsKKwkJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gY29udGV4dDsKKwl9CisJCisJdm9pZCBidWlsZEFub255bW91c1R5cGVCaW5kaW5nKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJ0eXBlKSB7CisJCQorCQlMb2NhbFR5cGVCaW5kaW5nIGFub255bW91c1R5cGUgPSBidWlsZExvY2FsVHlwZShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdUeXBlLmZQYWNrYWdlKTsKKworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlpZiAoc3VwZXJ0eXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IGdldEphdmFMYW5nT2JqZWN0KCk7CisJCQlzb3VyY2VUeXBlLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW10geyBzdXBlcnR5cGUgfTsKKwkJfSBlbHNlIHsKKwkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IHN1cGVydHlwZTsKKwkJCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gVHlwZUJpbmRpbmcuTm9TdXBlckludGVyZmFjZXM7CisJCX0KKwkJY29ubmVjdE1lbWJlclR5cGVzKCk7CisJCWJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOworCQlhbm9ueW1vdXNUeXBlLmZhdWx0SW5UeXBlc0ZvckZpZWxkc0FuZE1ldGhvZHMoKTsKKwkJc291cmNlVHlwZS52ZXJpZnlNZXRob2RzKGVudmlyb25tZW50KCkubWV0aG9kVmVyaWZpZXIoKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBidWlsZEZpZWxkcygpIHsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuZmllbGRzID09IG51bGwpIHsKKwkJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5maWVsZHMgPSBOb0ZpZWxkczsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGZpZWxkcyB2cy4gaW5pdGlhbGl6ZXJzCisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSByZWZlcmVuY2VDb250ZXh0LmZpZWxkczsKKwkJaW50IHNpemUgPSBmaWVsZHMubGVuZ3RoOworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCWlmIChmaWVsZHNbaV0uaXNGaWVsZCgpKQorCQkJCWNvdW50Kys7CisKKwkJLy8gaXRlcmF0ZSB0aGUgZmllbGQgZGVjbGFyYXRpb25zIHRvIGNyZWF0ZSB0aGUgYmluZGluZ3MsIGxvc2UgYWxsIGR1cGxpY2F0ZXMKKwkJRmllbGRCaW5kaW5nW10gZmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbY291bnRdOworCQlIYXNodGFibGVPZk9iamVjdCBrbm93bkZpZWxkTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoY291bnQpOworCQlib29sZWFuIGR1cGxpY2F0ZSA9IGZhbHNlOworCQljb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGRzW2ldOworCQkJaWYgKCFmaWVsZC5pc0ZpZWxkKCkpIHsKKwkJCQlpZiAocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmludGVyZmFjZUNhbm5vdEhhdmVJbml0aWFsaXplcnMocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLCBmaWVsZCk7CisJCQl9IGVsc2UgeworCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBuZXcgRmllbGRCaW5kaW5nKGZpZWxkLCBudWxsLCByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcpOworCQkJCS8vIGZpZWxkJ3MgdHlwZSB3aWxsIGJlIHJlc29sdmVkIHdoZW4gbmVlZGVkIGZvciB0b3AgbGV2ZWwgdHlwZXMKKwkJCQljaGVja0FuZFNldE1vZGlmaWVyc0ZvckZpZWxkKGZpZWxkQmluZGluZywgZmllbGQpOworCisJCQkJaWYgKGtub3duRmllbGROYW1lcy5jb250YWluc0tleShmaWVsZC5uYW1lKSkgeworCQkJCQlkdXBsaWNhdGUgPSB0cnVlOworCQkJCQlGaWVsZEJpbmRpbmcgcHJldmlvdXNCaW5kaW5nID0gKEZpZWxkQmluZGluZykga25vd25GaWVsZE5hbWVzLmdldChmaWVsZC5uYW1lKTsKKwkJCQkJaWYgKHByZXZpb3VzQmluZGluZyAhPSBudWxsKSB7CisJCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGk7IGYrKykgeworCQkJCQkJCUZpZWxkRGVjbGFyYXRpb24gcHJldmlvdXNGaWVsZCA9IGZpZWxkc1tmXTsKKwkJCQkJCQlpZiAocHJldmlvdXNGaWVsZC5iaW5kaW5nID09IHByZXZpb3VzQmluZGluZykgeworCQkJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVGaWVsZEluVHlwZShyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcsIHByZXZpb3VzRmllbGQpOworCQkJCQkJCQlwcmV2aW91c0ZpZWxkLmJpbmRpbmcgPSBudWxsOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJa25vd25GaWVsZE5hbWVzLnB1dChmaWVsZC5uYW1lLCBudWxsKTsgLy8gZW5zdXJlIHRoYXQgdGhlIGR1cGxpY2F0ZSBmaWVsZCBpcyBmb3VuZCAmIHJlbW92ZWQKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlRmllbGRJblR5cGUocmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLCBmaWVsZCk7CisJCQkJCWZpZWxkLmJpbmRpbmcgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCWtub3duRmllbGROYW1lcy5wdXQoZmllbGQubmFtZSwgZmllbGRCaW5kaW5nKTsKKwkJCQkJLy8gcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHNlZW4gYSBmaWVsZCB3aXRoIHRoaXMgbmFtZQorCQkJCQlpZiAoZmllbGRCaW5kaW5nICE9IG51bGwpCisJCQkJCQlmaWVsZEJpbmRpbmdzW2NvdW50KytdID0gZmllbGRCaW5kaW5nOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyByZW1vdmUgZHVwbGljYXRlIGZpZWxkcworCQlpZiAoZHVwbGljYXRlKSB7CisJCQlGaWVsZEJpbmRpbmdbXSBuZXdGaWVsZEJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1trbm93bkZpZWxkTmFtZXMuc2l6ZSgpIC0gMV07CisJCQkvLyB3ZSBrbm93IHdlJ2xsIGJlIHJlbW92aW5nIGF0IGxlYXN0IDEgZHVwbGljYXRlIG5hbWUKKwkJCXNpemUgPSBjb3VudDsKKwkJCWNvdW50ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZ3NbaV07CisJCQkJaWYgKGtub3duRmllbGROYW1lcy5nZXQoZmllbGRCaW5kaW5nLm5hbWUpICE9IG51bGwpCisJCQkJCW5ld0ZpZWxkQmluZGluZ3NbY291bnQrK10gPSBmaWVsZEJpbmRpbmc7CisJCQl9CisJCQlmaWVsZEJpbmRpbmdzID0gbmV3RmllbGRCaW5kaW5nczsKKwkJfQorCisJCWlmIChjb3VudCAhPSBmaWVsZEJpbmRpbmdzLmxlbmd0aCkKKwkJCVN5c3RlbS5hcnJheWNvcHkoZmllbGRCaW5kaW5ncywgMCwgZmllbGRCaW5kaW5ncyA9IG5ldyBGaWVsZEJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCWZpZWxkQmluZGluZ3NbaV0uaWQgPSBpOworCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcuZmllbGRzID0gZmllbGRCaW5kaW5nczsKKwl9CisJCisJdm9pZCBidWlsZEZpZWxkc0FuZE1ldGhvZHMoKSB7CisJCWJ1aWxkRmllbGRzKCk7CisJCWJ1aWxkTWV0aG9kcygpOworCisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCWlmIChzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpICYmICFzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpCisJCQkgKChNZW1iZXJUeXBlQmluZGluZykgc291cmNlVHlwZSkuY2hlY2tTeW50aGV0aWNBcmdzQW5kRmllbGRzKCk7CisKKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gc291cmNlVHlwZS5tZW1iZXJUeXBlczsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJICgoU291cmNlVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKS5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsKKwl9CisJCisJcHJpdmF0ZSBMb2NhbFR5cGVCaW5kaW5nIGJ1aWxkTG9jYWxUeXBlKAorCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlLAorCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgeworCQlyZWZlcmVuY2VDb250ZXh0LnNjb3BlID0gdGhpczsKKwkJcmVmZXJlbmNlQ29udGV4dC5zdGF0aWNJbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIHRydWUpOworCQlyZWZlcmVuY2VDb250ZXh0LmluaXRpYWxpemVyU2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgcmVmZXJlbmNlQ29udGV4dCwgZmFsc2UpOworCisJCS8vIGJ1aWxkIHRoZSBiaW5kaW5nIG9yIHRoZSBsb2NhbCB0eXBlCisJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbmV3IExvY2FsVHlwZUJpbmRpbmcodGhpcywgZW5jbG9zaW5nVHlwZSk7CisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZyA9IGxvY2FsVHlwZTsKKwkJY2hlY2tBbmRTZXRNb2RpZmllcnMoKTsKKworCQkvLyBMb29rIGF0IG1lbWJlciB0eXBlcworCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZUJpbmRpbmdzID0gTm9NZW1iZXJUeXBlczsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzLmxlbmd0aDsKKwkJCW1lbWJlclR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3NpemVdOworCQkJaW50IGNvdW50ID0gMDsKKwkJCW5leHRNZW1iZXIgOiBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tpXTsKKwkJCQlpZiAobWVtYmVyQ29udGV4dC5pc0ludGVyZmFjZSgpKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLm5lc3RlZENsYXNzQ2Fubm90RGVjbGFyZUludGVyZmFjZShtZW1iZXJDb250ZXh0KTsKKwkJCQkJY29udGludWUgbmV4dE1lbWJlcjsKKwkJCQl9CisJCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gbG9jYWxUeXBlOworCQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlCisJCQkJZG8geworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5zb3VyY2VOYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7CisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWRpbmdFbmNsb3NpbmdUeXBlKG1lbWJlckNvbnRleHQpOworCQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsKKwkJCQkJfQorCQkJCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsKKwkJCQkvLyBjaGVjayB0aGUgbWVtYmVyIHR5cGUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNpYmxpbmcgbWVtYmVyIHR5cGUKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlc1tqXS5uYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7CisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVOZXN0ZWRUeXBlKG1lbWJlckNvbnRleHQpOworCQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsKKwkJCQkJfQorCQkJCX0KKworCQkJCUNsYXNzU2NvcGUgbWVtYmVyU2NvcGUgPSBuZXcgQ2xhc3NTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2ldKTsKKwkJCQlMb2NhbFR5cGVCaW5kaW5nIG1lbWJlckJpbmRpbmcgPSBtZW1iZXJTY29wZS5idWlsZExvY2FsVHlwZShsb2NhbFR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKKwkJCQltZW1iZXJCaW5kaW5nLnNldEFzTWVtYmVyVHlwZSgpOworCQkJCW1lbWJlclR5cGVCaW5kaW5nc1tjb3VudCsrXSA9IG1lbWJlckJpbmRpbmc7CisJCQl9CisJCQlpZiAoY291bnQgIT0gc2l6ZSkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG1lbWJlclR5cGVCaW5kaW5ncywgMCwgbWVtYmVyVHlwZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJCX0KKwkJbG9jYWxUeXBlLm1lbWJlclR5cGVzID0gbWVtYmVyVHlwZUJpbmRpbmdzOworCQlyZXR1cm4gbG9jYWxUeXBlOworCX0KKwkKKwl2b2lkIGJ1aWxkTG9jYWxUeXBlQmluZGluZyhTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisKKwkJTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUgPSBidWlsZExvY2FsVHlwZShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdUeXBlLmZQYWNrYWdlKTsKKwkJY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKKwkJYnVpbGRGaWVsZHNBbmRNZXRob2RzKCk7CisJCWxvY2FsVHlwZS5mYXVsdEluVHlwZXNGb3JGaWVsZHNBbmRNZXRob2RzKCk7CisKKwkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnZlcmlmeU1ldGhvZHMoZW52aXJvbm1lbnQoKS5tZXRob2RWZXJpZmllcigpKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGJ1aWxkTWV0aG9kcygpIHsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQubWV0aG9kcyA9PSBudWxsKSB7CisJCQlyZWZlcmVuY2VDb250ZXh0LmJpbmRpbmcubWV0aG9kcyA9IE5vTWV0aG9kczsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGl0ZXJhdGUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMgdG8gY3JlYXRlIHRoZSBiaW5kaW5ncworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsKKwkJaW50IHNpemUgPSBtZXRob2RzLmxlbmd0aDsKKwkJaW50IGNsaW5pdEluZGV4ID0gLTE7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlpZiAobWV0aG9kc1tpXSBpbnN0YW5jZW9mIENsaW5pdCkgeworCQkJCWNsaW5pdEluZGV4ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kQmluZGluZ3MgPSBuZXcgTWV0aG9kQmluZGluZ1tjbGluaXRJbmRleCA9PSAtMSA/IHNpemUgOiBzaXplIC0gMV07CisKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChpICE9IGNsaW5pdEluZGV4KSB7CisJCQkJTWV0aG9kU2NvcGUgc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUodGhpcywgbWV0aG9kc1tpXSwgZmFsc2UpOworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHNjb3BlLmNyZWF0ZU1ldGhvZChtZXRob2RzW2ldKTsKKwkJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSAvLyBpcyBudWxsIGlmIGJpbmRpbmcgY291bGQgbm90IGJlIGNyZWF0ZWQKKwkJCQkJbWV0aG9kQmluZGluZ3NbY291bnQrK10gPSBtZXRob2RCaW5kaW5nOworCQkJfQorCQl9CisJCWlmIChjb3VudCAhPSBtZXRob2RCaW5kaW5ncy5sZW5ndGgpCisJCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZEJpbmRpbmdzLCAwLCBtZXRob2RCaW5kaW5ncyA9IG5ldyBNZXRob2RCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworCisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tZXRob2RzID0gbWV0aG9kQmluZGluZ3M7CisJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZy5tb2RpZmllcnMgfD0gQWNjVW5yZXNvbHZlZDsgLy8gdW50aWwgbWV0aG9kcygpIGlzIHNlbnQKKwl9CisJU291cmNlVHlwZUJpbmRpbmcgYnVpbGRUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCS8vIHByb3ZpZGUgdGhlIHR5cGVEZWNsYXJhdGlvbiB3aXRoIG5lZWRlZCBzY29wZXMKKwkJcmVmZXJlbmNlQ29udGV4dC5zY29wZSA9IHRoaXM7CisJCXJlZmVyZW5jZUNvbnRleHQuc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IG5ldyBNZXRob2RTY29wZSh0aGlzLCByZWZlcmVuY2VDb250ZXh0LCB0cnVlKTsKKwkJcmVmZXJlbmNlQ29udGV4dC5pbml0aWFsaXplclNjb3BlID0gbmV3IE1ldGhvZFNjb3BlKHRoaXMsIHJlZmVyZW5jZUNvbnRleHQsIGZhbHNlKTsKKworCQlpZiAoZW5jbG9zaW5nVHlwZSA9PSBudWxsKSB7CisJCQljaGFyW11bXSBjbGFzc05hbWUgPSBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VCaW5kaW5nLmNvbXBvdW5kTmFtZSwgcmVmZXJlbmNlQ29udGV4dC5uYW1lKTsKKwkJCXJlZmVyZW5jZUNvbnRleHQuYmluZGluZyA9IG5ldyBTb3VyY2VUeXBlQmluZGluZyhjbGFzc05hbWUsIHBhY2thZ2VCaW5kaW5nLCB0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXVtdIGNsYXNzTmFtZSA9IENoYXJPcGVyYXRpb24uZGVlcENvcHkoZW5jbG9zaW5nVHlwZS5jb21wb3VuZE5hbWUpOworCQkJY2xhc3NOYW1lW2NsYXNzTmFtZS5sZW5ndGggLSAxXSA9CisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoY2xhc3NOYW1lW2NsYXNzTmFtZS5sZW5ndGggLSAxXSwgcmVmZXJlbmNlQ29udGV4dC5uYW1lLCAnJCcpOworCQkJcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nID0gbmV3IE1lbWJlclR5cGVCaW5kaW5nKGNsYXNzTmFtZSwgdGhpcywgZW5jbG9zaW5nVHlwZSk7CisJCX0KKworCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQlzb3VyY2VUeXBlLmZQYWNrYWdlLmFkZFR5cGUoc291cmNlVHlwZSk7CisJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKCk7CisKKwkJLy8gTG9vayBhdCBtZW1iZXIgdHlwZXMKKwkJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVCaW5kaW5ncyA9IE5vTWVtYmVyVHlwZXM7CisJCWlmIChyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJCWludCBzaXplID0gcmVmZXJlbmNlQ29udGV4dC5tZW1iZXJUeXBlcy5sZW5ndGg7CisJCQltZW1iZXJUeXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJCWludCBjb3VudCA9IDA7CisJCQluZXh0TWVtYmVyIDogZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQubWVtYmVyVHlwZXNbaV07CisJCQkJaWYgKG1lbWJlckNvbnRleHQuaXNJbnRlcmZhY2UoKQorCQkJCQkmJiBzb3VyY2VUeXBlLmlzTmVzdGVkVHlwZSgpCisJCQkJCSYmIHNvdXJjZVR5cGUuaXNDbGFzcygpCisJCQkJCSYmICFzb3VyY2VUeXBlLmlzU3RhdGljKCkpIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkubmVzdGVkQ2xhc3NDYW5ub3REZWNsYXJlSW50ZXJmYWNlKG1lbWJlckNvbnRleHQpOworCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOworCQkJCX0KKwkJCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBzb3VyY2VUeXBlOworCQkJCS8vIGNoZWNrIHRoYXQgdGhlIG1lbWJlciBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFuIGVuY2xvc2luZyB0eXBlCisJCQkJZG8geworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5zb3VyY2VOYW1lLCBtZW1iZXJDb250ZXh0Lm5hbWUpKSB7CisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWRpbmdFbmNsb3NpbmdUeXBlKG1lbWJlckNvbnRleHQpOworCQkJCQkJY29udGludWUgbmV4dE1lbWJlcjsKKwkJCQkJfQorCQkJCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQkJfSB3aGlsZSAodHlwZSAhPSBudWxsKTsKKwkJCQkvLyBjaGVjayB0aGF0IHRoZSBtZW1iZXIgdHlwZSBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFub3RoZXIgc2libGluZyBtZW1iZXIgdHlwZQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhyZWZlcmVuY2VDb250ZXh0Lm1lbWJlclR5cGVzW2pdLm5hbWUsIG1lbWJlckNvbnRleHQubmFtZSkpIHsKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU5lc3RlZFR5cGUobWVtYmVyQ29udGV4dCk7CisJCQkJCQljb250aW51ZSBuZXh0TWVtYmVyOworCQkJCQl9CisJCQkJfQorCisJCQkJQ2xhc3NTY29wZSBtZW1iZXJTY29wZSA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIG1lbWJlckNvbnRleHQpOworCQkJCW1lbWJlclR5cGVCaW5kaW5nc1tjb3VudCsrXSA9IG1lbWJlclNjb3BlLmJ1aWxkVHlwZShzb3VyY2VUeXBlLCBwYWNrYWdlQmluZGluZyk7CisJCQl9CisJCQlpZiAoY291bnQgIT0gc2l6ZSkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG1lbWJlclR5cGVCaW5kaW5ncywgMCwgbWVtYmVyVHlwZUJpbmRpbmdzID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJCX0KKwkJc291cmNlVHlwZS5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVCaW5kaW5nczsKKwkJcmV0dXJuIHNvdXJjZVR5cGU7CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja0FuZFNldE1vZGlmaWVycygpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaW50IG1vZGlmaWVycyA9IHNvdXJjZVR5cGUubW9kaWZpZXJzOworCQlpZiAoKG1vZGlmaWVycyAmIEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1vZGlmaWVyRm9yVHlwZShzb3VyY2VUeXBlKTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJYm9vbGVhbiBpc01lbWJlclR5cGUgPSBzb3VyY2VUeXBlLmlzTWVtYmVyVHlwZSgpOworCQkKKwkJaWYgKGlzTWVtYmVyVHlwZSkgeworCQkJLy8gY2hlY2tzIGZvciBtZW1iZXIgdHlwZXMgYmVmb3JlIGxvY2FsIHR5cGVzIHRvIGNhdGNoIGxvY2FsIG1lbWJlcnMKKwkJCWlmIChlbmNsb3NpbmdUeXBlLmlzU3RyaWN0ZnAoKSkKKwkJCQltb2RpZmllcnMgfD0gQWNjU3RyaWN0ZnA7CisJCQlpZiAoZW5jbG9zaW5nVHlwZS5pc0RlcHJlY2F0ZWQoKSkKKwkJCQltb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CisJCQlpZiAoZW5jbG9zaW5nVHlwZS5pc0ludGVyZmFjZSgpKQorCQkJCW1vZGlmaWVycyB8PSBBY2NQdWJsaWM7CisJCX0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0xvY2FsVHlwZSgpKSB7CisJCQlpZiAoc291cmNlVHlwZS5pc0Fub255bW91c1R5cGUoKSkKKwkJCQltb2RpZmllcnMgfD0gQWNjRmluYWw7CisJCQlSZWZlcmVuY2VDb250ZXh0IHJlZkNvbnRleHQgPSBtZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQ7CisJCQlpZiAocmVmQ29udGV4dCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9ICgoVHlwZURlY2xhcmF0aW9uKSByZWZDb250ZXh0KS5iaW5kaW5nOworCQkJCWlmICh0eXBlLmlzU3RyaWN0ZnAoKSkKKwkJCQkJbW9kaWZpZXJzIHw9IEFjY1N0cmljdGZwOworCQkJCWlmICh0eXBlLmlzRGVwcmVjYXRlZCgpKQorCQkJCQltb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CisJCQl9IGVsc2UgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZDb250ZXh0KS5iaW5kaW5nOworCQkJCWlmIChtZXRob2QgIT0gbnVsbCl7CisJCQkJCWlmIChtZXRob2QuaXNTdHJpY3RmcCgpKQorCQkJCQkJbW9kaWZpZXJzIHw9IEFjY1N0cmljdGZwOworCQkJCQlpZiAobWV0aG9kLmlzRGVwcmVjYXRlZCgpKQorCQkJCQkJbW9kaWZpZXJzIHw9IEFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5OworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4KKwkJaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKKworCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBBY2NJbnRlcmZhY2UpICE9IDApIHsKKwkJCS8vIGRldGVjdCBhYm5vcm1hbCBjYXNlcyBmb3IgaW50ZXJmYWNlcworCQkJaWYgKGlzTWVtYmVyVHlwZSkgeworCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0KKwkJCQkJfihBY2NQdWJsaWMgfCBBY2NQcml2YXRlIHwgQWNjUHJvdGVjdGVkIHwgQWNjU3RhdGljIHwgQWNjQWJzdHJhY3QgfCBBY2NJbnRlcmZhY2UgfCBBY2NTdHJpY3RmcCk7CisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVySW50ZXJmYWNlKHNvdXJjZVR5cGUpOworCQkJCS8qCisJCQkJfSBlbHNlIGlmIChzb3VyY2VUeXBlLmlzTG9jYWxUeXBlKCkpIHsgLy9pbnRlcmZhY2VzIGNhbm5vdCBiZSBkZWZpbmVkIGluc2lkZSBhIG1ldGhvZAorCQkJCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH4oQWNjQWJzdHJhY3QgfCBBY2NJbnRlcmZhY2UgfCBBY2NTdHJpY3RmcCk7CisJCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApCisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JMb2NhbEludGVyZmFjZShzb3VyY2VUeXBlKTsKKwkJCQkqLworCQkJfSBlbHNlIHsKKwkJCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9IH4oQWNjUHVibGljIHwgQWNjQWJzdHJhY3QgfCBBY2NJbnRlcmZhY2UgfCBBY2NTdHJpY3RmcCk7CisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlKHNvdXJjZVR5cGUpOworCQkJfQorCQkJbW9kaWZpZXJzIHw9IEFjY0Fic3RyYWN0OworCQl9IGVsc2UgeworCQkJLy8gZGV0ZWN0IGFibm9ybWFsIGNhc2VzIGZvciB0eXBlcworCQkJaWYgKGlzTWVtYmVyVHlwZSkgeyAvLyBpbmNsdWRlcyBtZW1iZXIgdHlwZXMgZGVmaW5lZCBpbnNpZGUgbG9jYWwgdHlwZXMKKwkJCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9CisJCQkJCX4oQWNjUHVibGljIHwgQWNjUHJpdmF0ZSB8IEFjY1Byb3RlY3RlZCB8IEFjY1N0YXRpYyB8IEFjY0Fic3RyYWN0IHwgQWNjRmluYWwgfCBBY2NTdHJpY3RmcCk7CisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVyQ2xhc3Moc291cmNlVHlwZSk7CisJCQl9IGVsc2UgaWYgKHNvdXJjZVR5cGUuaXNMb2NhbFR5cGUoKSkgeworCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NBYnN0cmFjdCB8IEFjY0ZpbmFsIHwgQWNjU3RyaWN0ZnApOworCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckxvY2FsQ2xhc3Moc291cmNlVHlwZSk7CisJCQl9IGVsc2UgeworCQkJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0gfihBY2NQdWJsaWMgfCBBY2NBYnN0cmFjdCB8IEFjY0ZpbmFsIHwgQWNjU3RyaWN0ZnApOworCQkJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApCisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckNsYXNzKHNvdXJjZVR5cGUpOworCQkJfQorCisJCQkvLyBjaGVjayB0aGF0IEZpbmFsIGFuZCBBYnN0cmFjdCBhcmUgbm90IHNldCB0b2dldGhlcgorCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgKEFjY0ZpbmFsIHwgQWNjQWJzdHJhY3QpKSA9PSAoQWNjRmluYWwgfCBBY2NBYnN0cmFjdCkpCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyQ29tYmluYXRpb25GaW5hbEFic3RyYWN0Rm9yQ2xhc3Moc291cmNlVHlwZSk7CisJCX0KKworCQlpZiAoaXNNZW1iZXJUeXBlKSB7CisJCQkvLyB0ZXN0IHZpc2liaWxpdHkgbW9kaWZpZXJzIGluY29uc2lzdGVuY3ksIGlzb2xhdGUgdGhlIGFjY2Vzc29ycyBiaXRzCisJCQlpZiAoZW5jbG9zaW5nVHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQkJaWYgKChyZWFsTW9kaWZpZXJzICYgKEFjY1Byb3RlY3RlZCB8IEFjY1ByaXZhdGUpKSAhPSAwKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJGb3JJbnRlcmZhY2VNZW1iZXJUeXBlKHNvdXJjZVR5cGUpOworCisJCQkJCS8vIG5lZWQgdG8ga2VlcCB0aGUgbGVzcyByZXN0cmljdGl2ZQorCQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCisJCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOworCQkJCQlpZiAoKHJlYWxNb2RpZmllcnMgJiBBY2NQcml2YXRlKSAhPSAwKQorCQkJCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpbnQgYWNjZXNzb3JCaXRzID0gcmVhbE1vZGlmaWVycyAmIChBY2NQdWJsaWMgfCBBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlKTsKKwkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIChhY2Nlc3NvckJpdHMgLSAxKSkgPiAxKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1lbWJlclR5cGUoc291cmNlVHlwZSk7CisKKwkJCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlCisJCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHVibGljKSAhPSAwKSB7CisJCQkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkKKwkJCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOworCQkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQorCQkJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOworCQkJCQl9CisJCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQorCQkJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQorCQkJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOworCQkJCX0KKwkJCX0KKworCQkJLy8gc3RhdGljIG1vZGlmaWVyIHRlc3QKKwkJCWlmICgocmVhbE1vZGlmaWVycyAmIEFjY1N0YXRpYykgPT0gMCkgeworCQkJCWlmIChlbmNsb3NpbmdUeXBlLmlzSW50ZXJmYWNlKCkpCisJCQkJCW1vZGlmaWVycyB8PSBBY2NTdGF0aWM7CisJCQl9IGVsc2UgeworCQkJCWlmICghZW5jbG9zaW5nVHlwZS5pc1N0YXRpYygpKQorCQkJCQkvLyBlcnJvciB0aGUgZW5jbG9zaW5nIHR5cGUgb2YgYSBzdGF0aWMgZmllbGQgbXVzdCBiZSBzdGF0aWMgb3IgYSB0b3AtbGV2ZWwgdHlwZQorCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsU3RhdGljTW9kaWZpZXJGb3JNZW1iZXJUeXBlKHNvdXJjZVR5cGUpOworCQkJfQorCQl9CisKKwkJc291cmNlVHlwZS5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCQorCS8qIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGUgbW9kaWZpZXJzIG9mIGEgZmllbGQuCisJKgorCSogOS4zICYgOC4zCisJKiBOZWVkIHRvIGludGVncmF0ZSB0aGUgY2hlY2sgZm9yIHRoZSBmaW5hbCBtb2RpZmllcnMgZm9yIG5lc3RlZCB0eXBlcworCSoKKwkqIE5vdGUgOiBBIHNjb3BlIGlzIGFjY2Vzc2libGUgYnkgOiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2NvcGUKKwkqLworCXByaXZhdGUgdm9pZCBjaGVja0FuZFNldE1vZGlmaWVyc0ZvckZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJCWludCBtb2RpZmllcnMgPSBmaWVsZEJpbmRpbmcubW9kaWZpZXJzOworCQlpZiAoKG1vZGlmaWVycyAmIEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1vZGlmaWVyRm9yRmllbGQoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCBmaWVsZERlY2wpOworCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJaW50IGV4cGVjdGVkVmFsdWUgPSBBY2NQdWJsaWMgfCBBY2NTdGF0aWMgfCBBY2NGaW5hbDsKKwkJCS8vIHNldCB0aGUgbW9kaWZpZXJzCisJCQltb2RpZmllcnMgfD0gZXhwZWN0ZWRWYWx1ZTsKKworCQkJLy8gYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGV5IGFyZSB0aGUgb25seSBvbmVzCisJCQlpZiAoKG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnKSAhPSBleHBlY3RlZFZhbHVlKQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZUZpZWxkKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywgZmllbGREZWNsKTsKKwkJCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4KKwkJaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKKwkJaW50IHVuZXhwZWN0ZWRNb2RpZmllcnMgPQorCQkJfihBY2NQdWJsaWMgfCBBY2NQcml2YXRlIHwgQWNjUHJvdGVjdGVkIHwgQWNjRmluYWwgfCBBY2NTdGF0aWMgfCBBY2NUcmFuc2llbnQgfCBBY2NWb2xhdGlsZSk7CisJCWlmICgocmVhbE1vZGlmaWVycyAmIHVuZXhwZWN0ZWRNb2RpZmllcnMpICE9IDApCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkRGVjbCk7CisKKwkJaW50IGFjY2Vzc29yQml0cyA9IHJlYWxNb2RpZmllcnMgJiAoQWNjUHVibGljIHwgQWNjUHJvdGVjdGVkIHwgQWNjUHJpdmF0ZSk7CisJCWlmICgoYWNjZXNzb3JCaXRzICYgKGFjY2Vzc29yQml0cyAtIDEpKSA+IDEpIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvckZpZWxkKAorCQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQlmaWVsZERlY2wpOworCisJCQkvLyBuZWVkIHRvIGtlZXAgdGhlIGxlc3MgcmVzdHJpY3RpdmUKKwkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHVibGljKSAhPSAwKSB7CisJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCisJCQkJCW1vZGlmaWVycyBePSBBY2NQcm90ZWN0ZWQ7CisJCQkJaWYgKChhY2Nlc3NvckJpdHMgJiBBY2NQcml2YXRlKSAhPSAwKQorCQkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsKKwkJCX0KKwkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQorCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJpdmF0ZSkgIT0gMCkKKwkJCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7CisJCX0KKworCQlpZiAoKHJlYWxNb2RpZmllcnMgJiAoQWNjRmluYWwgfCBBY2NWb2xhdGlsZSkpID09IChBY2NGaW5hbCB8IEFjY1ZvbGF0aWxlKSkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxWb2xhdGlsZUZvckZpZWxkKAorCQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQlmaWVsZERlY2wpOworCisJCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja0ZvckluaGVyaXRlZE1lbWJlclR5cGVzKFNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUpIHsKKwkJLy8gc2VhcmNoIHVwIHRoZSBoaWVyYXJjaHkgb2YgdGhlIHNvdXJjZVR5cGUgdG8gc2VlIGlmIGFueSBzdXBlclR5cGUgZGVmaW5lcyBhIG1lbWJlciB0eXBlCisJCS8vIHdoZW4gbm8gbWVtYmVyIHR5cGVzIGFyZSBkZWZpbmVkLCB0YWcgdGhlIHNvdXJjZVR5cGUgJiBlYWNoIHN1cGVyVHlwZSB3aXRoIHRoZSBIYXNOb01lbWJlclR5cGVzIGJpdAorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gc291cmNlVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOworCQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7CisJCWRvIHsKKwkJCWlmICgoY3VycmVudFR5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApCisJCQkJYnJlYWs7IC8vIGFscmVhZHkga25vdyBpdCBoYXMgbm8gaW5oZXJpdGVkIG1lbWJlciB0eXBlcywgY2FuIHN0b3AgbG9va2luZyB1cAorCQkJaWYgKGN1cnJlbnRUeXBlLm1lbWJlclR5cGVzKCkgIT0gTm9NZW1iZXJUeXBlcykKKwkJCQlyZXR1cm47IC8vIGhhcyBtZW1iZXIgdHlwZXMKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCA9PSBudWxsKQorCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107CisJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LAorCQkJCQkJMCwKKwkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCTAsCisJCQkJCQlsYXN0UG9zaXRpb24pOworCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJfQorCQl9IHdoaWxlICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOworCisJCWJvb2xlYW4gaGFzTWVtYmVycyA9IGZhbHNlOworCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgeworCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1tqXTsKKwkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeyAvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkCisJCQkJCQlhbkludGVyZmFjZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7CisJCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBIYXNOb01lbWJlclR5cGVzKSAhPSAwKQorCQkJCQkJCWNvbnRpbnVlOyAvLyBhbHJlYWR5IGtub3cgaXQgaGFzIG5vIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMKKwkJCQkJCWlmIChhbkludGVyZmFjZS5tZW1iZXJUeXBlcygpICE9IE5vTWVtYmVyVHlwZXMpIHsKKwkJCQkJCQloYXNNZW1iZXJzID0gdHJ1ZTsKKwkJCQkJCQlicmVhayBkb25lOworCQkJCQkJfQorCisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7CisJCQkJCWlmICghaGFzTWVtYmVycykKKwkJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyB8PSBIYXNOb01lbWJlclR5cGVzOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghaGFzTWVtYmVycykgeworCQkJY3VycmVudFR5cGUgPSBzb3VyY2VUeXBlOworCQkJZG8geworCQkJCWN1cnJlbnRUeXBlLnRhZ0JpdHMgfD0gSGFzTm9NZW1iZXJUeXBlczsKKwkJCX0gd2hpbGUgKChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNvbm5lY3RNZW1iZXJUeXBlcygpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKHNvdXJjZVR5cGUubWVtYmVyVHlwZXMgIT0gTm9NZW1iZXJUeXBlcykKKwkJCWZvciAoaW50IGkgPSAwLCBzaXplID0gc291cmNlVHlwZS5tZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBzaXplOyBpKyspCisJCQkJICgoU291cmNlVHlwZUJpbmRpbmcpIHNvdXJjZVR5cGUubWVtYmVyVHlwZXNbaV0pLnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisJfQorCS8qCisJCU91ciBjdXJyZW50IGJlbGllZiBiYXNlZCBvbiBhdmFpbGFibGUgSkNLIHRlc3RzIGlzOgorCQkJaW5oZXJpdGVkIG1lbWJlciB0eXBlcyBhcmUgdmlzaWJsZSBhcyBhIHBvdGVudGlhbCBzdXBlcmNsYXNzLgorCQkJaW5oZXJpdGVkIGludGVyZmFjZXMgYXJlIG5vdCB2aXNpYmxlIHdoZW4gZGVmaW5pbmcgYSBzdXBlcmludGVyZmFjZS4KKwkKKwkJRXJyb3IgcmVjb3Zlcnkgc3Rvcnk6CisJCQllbnN1cmUgdGhlIHN1cGVyY2xhc3MgaXMgc2V0IHRvIGphdmEubGFuZy5PYmplY3QgaWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkCisJCQlyZXNvbHZpbmcgdGhlIHN1cGVyY2xhc3MuCisJCisJCUFuc3dlciBmYWxzZSBpZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgc291cmNlVHlwZS4KKwkqLworCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0U3VwZXJjbGFzcygpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcyA9PSBudWxsKSB7CisJCQlpZiAoaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IGdldEphdmFMYW5nT2JqZWN0KCk7CisJCQlyZXR1cm4gIWRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHNvdXJjZVR5cGUuc3VwZXJjbGFzcywgbnVsbCk7CisJCQkvLyBlbnN1cmUgT2JqZWN0IGlzIGluaXRpYWxpemVkIGlmIGl0IGNvbWVzIGZyb20gYSBzb3VyY2UgZmlsZQorCQl9CisJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IGZpbmRTdXBlcnR5cGUocmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzKTsKKwkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeyAvLyBpcyBudWxsIGlmIGEgY3ljbGUgd2FzIGRldGVjdGVkIGN5Y2xlCisJCQlpZiAoIXN1cGVyY2xhc3MuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRTdXBlcmNsYXNzKHNvdXJjZVR5cGUsIHJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcywgc3VwZXJjbGFzcyk7CisJCQl9IGVsc2UgaWYgKHN1cGVyY2xhc3MuaXNJbnRlcmZhY2UoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLnN1cGVyY2xhc3NNdXN0QmVBQ2xhc3Moc291cmNlVHlwZSwgcmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzLCBzdXBlcmNsYXNzKTsKKwkJCX0gZWxzZSBpZiAoc3VwZXJjbGFzcy5pc0ZpbmFsKCkpIHsKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5jbGFzc0V4dGVuZEZpbmFsQ2xhc3Moc291cmNlVHlwZSwgcmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzLCBzdXBlcmNsYXNzKTsKKwkJCX0gZWxzZSBpZiAoaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkgeworCQkJCS8vIGNhbiBvbmx5IGhhcHBlbiBpZiBPYmplY3QgZXh0ZW5kcyBhbm90aGVyIHR5cGUuLi4gd2lsbCBuZXZlciBoYXBwZW4gdW5sZXNzIHdlJ3JlIHRlc3RpbmcgZm9yIGl0LgorCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBudWxsOworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQkvLyBvbmx5IHdhbnQgdG8gcmVhY2ggaGVyZSB3aGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQKKwkJCQlyZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MuYmluZGluZyA9IHN1cGVyY2xhc3M7CisJCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gc3VwZXJjbGFzczsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCWlmICghaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkgeworCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJCWlmICgoc291cmNlVHlwZS5zdXBlcmNsYXNzLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSA9PSAwKQorCQkJCWRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHNvdXJjZVR5cGUuc3VwZXJjbGFzcywgbnVsbCk7CisJCQkvLyBlbnN1cmUgT2JqZWN0IGlzIGluaXRpYWxpemVkIGlmIGl0IGNvbWVzIGZyb20gYSBzb3VyY2UgZmlsZQorCQl9CisJCXJldHVybiBmYWxzZTsgLy8gcmVwb3J0ZWQgc29tZSBlcnJvciBhZ2FpbnN0IHRoZSBzb3VyY2UgdHlwZQorCX0KKworCS8qCisJCU91ciBjdXJyZW50IGJlbGllZiBiYXNlZCBvbiBhdmFpbGFibGUgSkNLIDEuMyB0ZXN0cyBpczoKKwkJCWluaGVyaXRlZCBtZW1iZXIgdHlwZXMgYXJlIHZpc2libGUgYXMgYSBwb3RlbnRpYWwgc3VwZXJjbGFzcy4KKwkJCWluaGVyaXRlZCBpbnRlcmZhY2VzIGFyZSB2aXNpYmxlIHdoZW4gZGVmaW5pbmcgYSBzdXBlcmludGVyZmFjZS4KKwkKKwkJRXJyb3IgcmVjb3Zlcnkgc3Rvcnk6CisJCQllbnN1cmUgdGhlIHN1cGVyaW50ZXJmYWNlcyBjb250YWluIG9ubHkgdmFsaWQgdmlzaWJsZSBpbnRlcmZhY2VzLgorCQorCQlBbnN3ZXIgZmFsc2UgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkIGFnYWluc3QgdGhlIHNvdXJjZVR5cGUuCisJKi8KKwlwcml2YXRlIGJvb2xlYW4gY29ubmVjdFN1cGVySW50ZXJmYWNlcygpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBOb1N1cGVySW50ZXJmYWNlczsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlib29sZWFuIG5vUHJvYmxlbXMgPSB0cnVlOworCQlpbnQgbGVuZ3RoID0gcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMubGVuZ3RoOworCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsZW5ndGhdOworCQlpbnQgY291bnQgPSAwOworCQluZXh0SW50ZXJmYWNlIDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlckludGVyZmFjZSA9IGZpbmRTdXBlcnR5cGUocmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0pOworCQkJaWYgKHN1cGVySW50ZXJmYWNlID09IG51bGwpIHsgLy8gZGV0ZWN0ZWQgY3ljbGUKKwkJCQlub1Byb2JsZW1zID0gZmFsc2U7CisJCQkJY29udGludWUgbmV4dEludGVyZmFjZTsKKwkJCX0KKwkJCWlmICghc3VwZXJJbnRlcmZhY2UuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRTdXBlcmludGVyZmFjZSgKKwkJCQkJc291cmNlVHlwZSwKKwkJCQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0sCisJCQkJCXN1cGVySW50ZXJmYWNlKTsKKwkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJbm9Qcm9ibGVtcyA9IGZhbHNlOworCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQl9CisJCQkvLyBDaGVjayBmb3IgYSBkdXBsaWNhdGUgaW50ZXJmYWNlIG9uY2UgdGhlIG5hbWUgaXMgcmVzb2x2ZWQsIG90aGVyd2lzZSB3ZSBtYXkgYmUgY29uZnVzZWQgKGllIDogYS5iLkkgYW5kIGMuZC5JKQorCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CisJCQkJaWYgKGludGVyZmFjZUJpbmRpbmdzW2tdID09IHN1cGVySW50ZXJmYWNlKSB7CisJCQkJCS8vIHNob3VsZCB0aGlzIGJlIHRyZWF0ZWQgYXMgYSB3YXJuaW5nPworCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVTdXBlcmludGVyZmFjZShzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LCBzdXBlckludGVyZmFjZSk7CisJCQkJCWNvbnRpbnVlIG5leHRJbnRlcmZhY2U7CisJCQkJfQorCQkJfQorCQkJaWYgKHN1cGVySW50ZXJmYWNlLmlzQ2xhc3MoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLnN1cGVyaW50ZXJmYWNlTXVzdEJlQW5JbnRlcmZhY2Uoc291cmNlVHlwZSwgcmVmZXJlbmNlQ29udGV4dCwgc3VwZXJJbnRlcmZhY2UpOworCQkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQlub1Byb2JsZW1zID0gZmFsc2U7CisJCQkJY29udGludWUgbmV4dEludGVyZmFjZTsKKwkJCX0KKwkJCXJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzW2ldLmJpbmRpbmcgPSBzdXBlckludGVyZmFjZTsKKwkJCS8vIG9ubHkgd2FudCB0byByZWFjaCBoZXJlIHdoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAorCQkJaW50ZXJmYWNlQmluZGluZ3NbY291bnQrK10gPSBzdXBlckludGVyZmFjZTsKKwkJfQorCQkvLyBob2xkIG9udG8gYWxsIGNvcnJlY3RseSByZXNvbHZlZCBzdXBlcmludGVyZmFjZXMKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJaWYgKGNvdW50ICE9IGxlbmd0aCkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZUJpbmRpbmdzLCAwLCBpbnRlcmZhY2VCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworCQkJc291cmNlVHlwZS5zdXBlckludGVyZmFjZXMgPSBpbnRlcmZhY2VCaW5kaW5nczsKKwkJfQorCQlyZXR1cm4gbm9Qcm9ibGVtczsKKwl9CisJCisJdm9pZCBjb25uZWN0VHlwZUhpZXJhcmNoeSgpIHsKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKChzb3VyY2VUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSA9PSAwKSB7CisJCQlib29sZWFuIG5vUHJvYmxlbXMgPSB0cnVlOworCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEJlZ2luSGllcmFyY2h5Q2hlY2s7CisJCQlpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpCisJCQkJbm9Qcm9ibGVtcyAmPSBjb25uZWN0U3VwZXJjbGFzcygpOworCQkJbm9Qcm9ibGVtcyAmPSBjb25uZWN0U3VwZXJJbnRlcmZhY2VzKCk7CisJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gRW5kSGllcmFyY2h5Q2hlY2s7CisJCQlpZiAobm9Qcm9ibGVtcyAmJiBzb3VyY2VUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5SGFzUHJvYmxlbXMoc291cmNlVHlwZSk7CisJCX0KKwkJY29ubmVjdE1lbWJlclR5cGVzKCk7CisJCWNoZWNrRm9ySW5oZXJpdGVkTWVtYmVyVHlwZXMoc291cmNlVHlwZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCkgeworCQkvLyBtdXN0IGVuc3VyZSB0aGUgaW1wb3J0cyBhcmUgcmVzb2x2ZWQKKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdFNjb3BlKSB7CisJCQlpZiAoKChDb21waWxhdGlvblVuaXRTY29wZSkgcGFyZW50KS5pbXBvcnRzID09IG51bGwpCisJCQkJICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHBhcmVudCkuY2hlY2tBbmRTZXRJbXBvcnRzKCk7CisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ2xhc3NTY29wZSkgeworCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGVuY2xvc2luZyB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZAorCQkJICgoQ2xhc3NTY29wZSkgcGFyZW50KS5jb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCk7CisJCX0KKworCQkvLyBkb3VibGUgY2hlY2sgdGhhdCB0aGUgaGllcmFyY2h5IHNlYXJjaCBoYXMgbm90IGFscmVhZHkgYmVndW4uLi4KKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKChzb3VyY2VUeXBlLnRhZ0JpdHMgJiBCZWdpbkhpZXJhcmNoeUNoZWNrKSAhPSAwKQorCQkJcmV0dXJuOworCisJCWJvb2xlYW4gbm9Qcm9ibGVtcyA9IHRydWU7CisJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBCZWdpbkhpZXJhcmNoeUNoZWNrOworCQlpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpCisJCQlub1Byb2JsZW1zICY9IGNvbm5lY3RTdXBlcmNsYXNzKCk7CisJCW5vUHJvYmxlbXMgJj0gY29ubmVjdFN1cGVySW50ZXJmYWNlcygpOworCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gRW5kSGllcmFyY2h5Q2hlY2s7CisJCWlmIChub1Byb2JsZW1zICYmIHNvdXJjZVR5cGUuaXNIaWVyYXJjaHlJbmNvbnNpc3RlbnQoKSkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmhpZXJhcmNoeUhhc1Byb2JsZW1zKHNvdXJjZVR5cGUpOworCX0KKwkKKwkvLyBBbnN3ZXIgd2hldGhlciBhIGN5Y2xlIHdhcyBmb3VuZCBiZXR3ZWVuIHRoZSBzb3VyY2VUeXBlICYgdGhlIHN1cGVyVHlwZQorCXByaXZhdGUgYm9vbGVhbiBkZXRlY3RDeWNsZSgKKwkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSwKKwkJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUsCisJCVR5cGVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCWlmIChzb3VyY2VUeXBlID09IHN1cGVyVHlwZSkgeworCQkJcHJvYmxlbVJlcG9ydGVyKCkuaGllcmFyY2h5Q2lyY3VsYXJpdHkoc291cmNlVHlwZSwgc3VwZXJUeXBlLCByZWZlcmVuY2UpOworCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoc3VwZXJUeXBlLmlzQmluYXJ5QmluZGluZygpKSB7CisJCQkvLyBmb3JjZSBpdHMgc3VwZXJjbGFzcyAmIHN1cGVyaW50ZXJmYWNlcyB0byBiZSBmb3VuZC4uLiAyIHBvc3NpYmlsaXRpZXMgZXhpc3QgLSB0aGUgc291cmNlIHR5cGUgaXMgaW5jbHVkZWQgaW4gdGhlIGhpZXJhcmNoeSBvZjoKKwkJCS8vCQktIGEgYmluYXJ5IHR5cGUuLi4gdGhpcyBjYXNlIE1VU1QgYmUgY2F1Z2h0ICYgcmVwb3J0ZWQgaGVyZQorCQkJLy8JCS0gYW5vdGhlciBzb3VyY2UgdHlwZS4uLiB0aGlzIGNhc2UgaXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgb3RoZXIgc291cmNlIHR5cGUKKwkJCWJvb2xlYW4gaGFzQ3ljbGUgPSBmYWxzZTsKKwkJCWlmIChzdXBlclR5cGUuc3VwZXJjbGFzcygpICE9IG51bGwpIHsKKwkJCQlpZiAoc291cmNlVHlwZSA9PSBzdXBlclR5cGUuc3VwZXJjbGFzcygpKSB7CisJCQkJCXByb2JsZW1SZXBvcnRlcigpLmhpZXJhcmNoeUNpcmN1bGFyaXR5KHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgcmVmZXJlbmNlKTsKKwkJCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCWhhc0N5Y2xlIHw9IGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHN1cGVyVHlwZS5zdXBlcmNsYXNzKCksIHJlZmVyZW5jZSk7CisJCQkJaWYgKChzdXBlclR5cGUuc3VwZXJjbGFzcygpLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkgeworCQkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCXN1cGVyVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOyAvLyBwcm9wYWdhdGUgZG93biB0aGUgaGllcmFyY2h5CisJCQkJfQorCQkJfQorCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IHN1cGVyVHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGl0c0ludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGl0c0ludGVyZmFjZXNbaV07CisJCQkJCWlmIChzb3VyY2VUeXBlID09IGFuSW50ZXJmYWNlKSB7CisJCQkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5oaWVyYXJjaHlDaXJjdWxhcml0eShzb3VyY2VUeXBlLCBzdXBlclR5cGUsIHJlZmVyZW5jZSk7CisJCQkJCQlzb3VyY2VUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCQlzdXBlclR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCWhhc0N5Y2xlIHw9IGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIGFuSW50ZXJmYWNlLCByZWZlcmVuY2UpOworCQkJCQlpZiAoKGFuSW50ZXJmYWNlLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkgeworCQkJCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJCQkJc3VwZXJUeXBlLnRhZ0JpdHMgfD0gSGllcmFyY2h5SGFzUHJvYmxlbXM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gaGFzQ3ljbGU7CisJCX0KKworCQlpZiAoKHN1cGVyVHlwZS50YWdCaXRzICYgRW5kSGllcmFyY2h5Q2hlY2spID09IDAKKwkJCSYmIChzdXBlclR5cGUudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spICE9IDApIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmhpZXJhcmNoeUNpcmN1bGFyaXR5KHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgcmVmZXJlbmNlKTsKKwkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJCXN1cGVyVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKChzdXBlclR5cGUudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApCisJCQkvLyBlbnN1cmUgaWYgdGhpcyBpcyBhIHNvdXJjZSBzdXBlcmNsYXNzIHRoYXQgaXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkCisJCQkgKChTb3VyY2VUeXBlQmluZGluZykgc3VwZXJUeXBlKS5zY29wZS5jb25uZWN0VHlwZUhpZXJhcmNoeVdpdGhvdXRNZW1iZXJzKCk7CisJCWlmICgoc3VwZXJUeXBlLnRhZ0JpdHMgJiBIaWVyYXJjaHlIYXNQcm9ibGVtcykgIT0gMCkKKwkJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmcgZmluZFN1cGVydHlwZShUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpIHsKKwkJdHlwZVJlZmVyZW5jZS5hYm91dFRvUmVzb2x2ZSh0aGlzKTsgLy8gYWxsb3dzIHVzIHRvIHRyYXAgY29tcGxldGlvbiAmIHNlbGVjdGlvbiBub2RlcworCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSB0eXBlUmVmZXJlbmNlLmdldFR5cGVOYW1lKCk7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKGNvbXBvdW5kTmFtZSk7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSByZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCWludCBzaXplID0gY29tcG91bmROYW1lLmxlbmd0aDsKKwkJaW50IG4gPSAxOworCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZTsKKworCQkvLyByZXNvbHZlIHRoZSBmaXJzdCBuYW1lIG9mIHRoZSBjb21wb3VuZE5hbWUKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNvbXBvdW5kTmFtZVswXSwgc291cmNlVHlwZS5zb3VyY2VOYW1lKSkgeworCQkJc3VwZXJUeXBlID0gc291cmNlVHlwZTsKKwkJCS8vIG1hdGNoIGFnYWluc3QgdGhlIHNvdXJjZVR5cGUgZXZlbiB0aG91Z2ggbmVzdGVkIG1lbWJlcnMgY2Fubm90IGJlIHN1cGVydHlwZXMKKwkJfSBlbHNlIHsKKwkJCUJpbmRpbmcgdHlwZU9yUGFja2FnZSA9IHBhcmVudC5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSwgVFlQRSB8IFBBQ0tBR0UpOworCQkJaWYgKHR5cGVPclBhY2thZ2UgPT0gbnVsbCB8fCAhdHlwZU9yUGFja2FnZS5pc1ZhbGlkQmluZGluZygpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCWNvbXBvdW5kTmFtZVswXSwKKwkJCQkJdHlwZU9yUGFja2FnZSA9PSBudWxsID8gTm90Rm91bmQgOiB0eXBlT3JQYWNrYWdlLnByb2JsZW1JZCgpKTsKKworCQkJYm9vbGVhbiBjaGVja1Zpc2liaWxpdHkgPSBmYWxzZTsKKwkJCWZvciAoOyBuIDwgc2l6ZTsgbisrKSB7CisJCQkJaWYgKCEodHlwZU9yUGFja2FnZSBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSkKKwkJCQkJYnJlYWs7CisJCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIHR5cGVPclBhY2thZ2U7CisJCQkJdHlwZU9yUGFja2FnZSA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lW25dKTsKKwkJCQlpZiAodHlwZU9yUGFja2FnZSA9PSBudWxsIHx8ICF0eXBlT3JQYWNrYWdlLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgbiArIDEpLAorCQkJCQkJdHlwZU9yUGFja2FnZSA9PSBudWxsID8gTm90Rm91bmQgOiB0eXBlT3JQYWNrYWdlLnByb2JsZW1JZCgpKTsKKwkJCQljaGVja1Zpc2liaWxpdHkgPSB0cnVlOworCQkJfQorCisJCQkvLyBjb252ZXJ0IHRvIGEgUmVmZXJlbmNlQmluZGluZworCQkJaWYgKHR5cGVPclBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgLy8gZXJyb3IsIHRoZSBjb21wb3VuZE5hbWUgaXMgYSBwYWNrYWdlTmFtZQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4pLCBOb3RGb3VuZCk7CisJCQlzdXBlclR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZU9yUGFja2FnZTsKKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZVJlZmVyZW5jZShzdXBlclR5cGUpOyAvLyB0byByZWNvcmQgc3VwZXJ0eXBlcworCisJCQlpZiAoY2hlY2tWaXNpYmlsaXR5CisJCQkJJiYgbiA9PSBzaXplKSB7IC8vIGlmIHdlJ3JlIGZpbmlzaGVkIGFuZCBrbm93IHRoZSBmaW5hbCBzdXBlcnR5cGUgdGhlbiBjaGVjayB2aXNpYmlsaXR5CisJCQkJaWYgKCFzdXBlclR5cGUuY2FuQmVTZWVuQnkoc291cmNlVHlwZS5mUGFja2FnZSkpCisJCQkJCS8vIGl0cyBhIHRvcGxldmVsIHR5cGUgc28ganVzdCBjaGVjayBwYWNrYWdlIGFjY2VzcworCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBuKSwgc3VwZXJUeXBlLCBOb3RWaXNpYmxlKTsKKwkJCX0KKwkJfQorCQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgd2UgaGF2ZSBhIHR5cGUgYnV0IHdlIGhhdmUgdG8gbG9vayBmb3IgY3ljbGVzCisJCXdoaWxlICh0cnVlKSB7CisJCQkvLyBtdXN0IGRldGVjdCBjeWNsZXMgJiBmb3JjZSBjb25uZWN0aW9uIHVwIHRoZSBoaWVyYXJjaHkuLi4gYWxzbyBoYW5kbGUgY3ljbGVzIHdpdGggYmluYXJ5IHR5cGVzLgorCQkJLy8gbXVzdCBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIHN1cGVyVHlwZSBrbm93cyBpdHMgZW50aXJlIGhpZXJhcmNoeQorCQkJaWYgKGRldGVjdEN5Y2xlKHNvdXJjZVR5cGUsIHN1cGVyVHlwZSwgdHlwZVJlZmVyZW5jZSkpCisJCQkJcmV0dXJuIG51bGw7IC8vIGN5Y2xlIGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkCisKKwkJCWlmIChuID49IHNpemUpCisJCQkJYnJlYWs7CisKKwkJCS8vIHJldHJpZXZlIHRoZSBuZXh0IG1lbWJlciB0eXBlCisJCQljaGFyW10gdHlwZU5hbWUgPSBjb21wb3VuZE5hbWVbbisrXTsKKwkJCXN1cGVyVHlwZSA9IGZpbmRNZW1iZXJUeXBlKHR5cGVOYW1lLCBzdXBlclR5cGUpOworCQkJaWYgKHN1cGVyVHlwZSA9PSBudWxsKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIG4pLCBOb3RGb3VuZCk7CisJCQlpZiAoIXN1cGVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJc3VwZXJUeXBlLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBuKTsKKwkJCQlyZXR1cm4gc3VwZXJUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlclR5cGU7CisJfQorCisJLyogQW5zd2VyIHRoZSBwcm9ibGVtIHJlcG9ydGVyIHRvIHVzZSBmb3IgcmFpc2luZyBuZXcgcHJvYmxlbXMuCisJKgorCSogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dAorCSogKHVuaXQsIHR5cGUgb3IgbWV0aG9kKSBpbiBjYXNlIHRoZSBwcm9ibGVtIGhhbmRsZXIgZGVjaWRlcyBpdCBpcyBuZWNlc3NhcnkKKwkqIHRvIGFib3J0LgorCSovCisJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7CisJCU1ldGhvZFNjb3BlIG91dGVyTWV0aG9kU2NvcGU7CisJCWlmICgob3V0ZXJNZXRob2RTY29wZSA9IG91dGVyTW9zdE1ldGhvZFNjb3BlKCkpID09IG51bGwpIHsKKwkJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5wcm9ibGVtUmVwb3J0ZXI7CisJCQlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7CisJCQlyZXR1cm4gcHJvYmxlbVJlcG9ydGVyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG91dGVyTWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCk7CisJCX0KKwl9CisKKwkvKiBBbnN3ZXIgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgc2NvcGUuCisJKgorCSogaS5lLiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLgorCSovCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgeworCQlyZXR1cm4gcmVmZXJlbmNlQ29udGV4dDsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQgIT0gbnVsbCkKKwkJCXJldHVybiAiLS0tIENsYXNzIFNjb3BlIC0tLVxuXG4iICAvLyROT04tTkxTLTEkCisJCQkrcmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nLnRvU3RyaW5nKCk7CisJCWVsc2UKKwkJCXJldHVybiAiLS0tIENsYXNzIFNjb3BlIC0tLVxuXG4gQmluZGluZyBub3QgaW5pdGlhbGl6ZWQiIDsgLy8kTk9OLU5MUy0xJAorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1ODIyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsYXRpb25Vbml0U2NvcGUuamF2YQpAQCAtMCwwICsxLDUwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNvbXBvdW5kTmFtZVZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuT2JqZWN0VmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZU5hbWVWZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRTY29wZSBleHRlbmRzIFNjb3BlIHsKKwlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CisJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlZmVyZW5jZUNvbnRleHQ7CisJcHVibGljIGNoYXJbXVtdIGN1cnJlbnRQYWNrYWdlTmFtZTsKKwlwdWJsaWMgUGFja2FnZUJpbmRpbmcgZlBhY2thZ2U7CisJcHVibGljIEltcG9ydEJpbmRpbmdbXSBpbXBvcnRzOworCQorCXB1YmxpYyBTb3VyY2VUeXBlQmluZGluZ1tdIHRvcExldmVsVHlwZXM7CisKKwlwcml2YXRlIENvbXBvdW5kTmFtZVZlY3RvciBxdWFsaWZpZWRSZWZlcmVuY2VzOworCXByaXZhdGUgU2ltcGxlTmFtZVZlY3RvciBzaW1wbGVOYW1lUmVmZXJlbmNlczsKKwlwcml2YXRlIE9iamVjdFZlY3RvciByZWZlcmVuY2VkVHlwZXM7CisKK3B1YmxpYyBDb21waWxhdGlvblVuaXRTY29wZShDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCXN1cGVyKENPTVBJTEFUSU9OX1VOSVRfU0NPUEUsIG51bGwpOworCXRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKKwl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSB1bml0OworCXVuaXQuc2NvcGUgPSB0aGlzOworCXRoaXMuY3VycmVudFBhY2thZ2VOYW1lID0gdW5pdC5jdXJyZW50UGFja2FnZSA9PSBudWxsID8gTm9DaGFyQ2hhciA6IHVuaXQuY3VycmVudFBhY2thZ2UudG9rZW5zOworCisJaWYgKGVudmlyb25tZW50Lm9wdGlvbnMucHJvZHVjZVJlZmVyZW5jZUluZm8pIHsKKwkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VzID0gbmV3IENvbXBvdW5kTmFtZVZlY3RvcigpOworCQl0aGlzLnNpbXBsZU5hbWVSZWZlcmVuY2VzID0gbmV3IFNpbXBsZU5hbWVWZWN0b3IoKTsKKwkJdGhpcy5yZWZlcmVuY2VkVHlwZXMgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJfSBlbHNlIHsKKwkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VzID0gbnVsbDsgLy8gdXNlZCB0byB0ZXN0IGlmIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcmVjb3JkZWQKKwkJdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcyA9IG51bGw7CisJCXRoaXMucmVmZXJlbmNlZFR5cGVzID0gbnVsbDsKKwl9Cit9Cit2b2lkIGJ1aWxkRmllbGRzQW5kTWV0aG9kcygpIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJdG9wTGV2ZWxUeXBlc1tpXS5zY29wZS5idWlsZEZpZWxkc0FuZE1ldGhvZHMoKTsKK30KK3ZvaWQgYnVpbGRUeXBlQmluZGluZ3MoKSB7CisJdG9wTGV2ZWxUeXBlcyA9IG5ldyBTb3VyY2VUeXBlQmluZGluZ1swXTsgLy8gd2FudCBpdCBpbml0aWFsaXplZCBpZiB0aGUgcGFja2FnZSBjYW5ub3QgYmUgcmVzb2x2ZWQKKwlpZiAocmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQgIT0gbnVsbCkgeworCQljaGFyW11bXSBleHBlY3RlZFBhY2thZ2VOYW1lID0gcmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZU5hbWUoKTsKKwkJaWYgKGV4cGVjdGVkUGFja2FnZU5hbWUgIT0gbnVsbCAmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudFBhY2thZ2VOYW1lLCBleHBlY3RlZFBhY2thZ2VOYW1lKSkgeworCQkJcHJvYmxlbVJlcG9ydGVyKCkucGFja2FnZUlzTm90RXhwZWN0ZWRQYWNrYWdlKHJlZmVyZW5jZUNvbnRleHQpOworCQkJY3VycmVudFBhY2thZ2VOYW1lID0gZXhwZWN0ZWRQYWNrYWdlTmFtZS5sZW5ndGggPT0gMCA/IE5vQ2hhckNoYXIgOiBleHBlY3RlZFBhY2thZ2VOYW1lOworCQl9CisJfQorCWlmIChjdXJyZW50UGFja2FnZU5hbWUgPT0gTm9DaGFyQ2hhcikgeworCQlpZiAoKGZQYWNrYWdlID0gZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2UpID09IG51bGwpIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLm11c3RTcGVjaWZ5UGFja2FnZShyZWZlcmVuY2VDb250ZXh0KTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoZlBhY2thZ2UgPSBlbnZpcm9ubWVudC5jcmVhdGVQYWNrYWdlKGN1cnJlbnRQYWNrYWdlTmFtZSkpID09IG51bGwpIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLnBhY2thZ2VDb2xsaWRlc1dpdGhUeXBlKHJlZmVyZW5jZUNvbnRleHQpOworCQkJcmV0dXJuOworCQl9CisJCXJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShjdXJyZW50UGFja2FnZU5hbWUpOyAvLyBhbHdheXMgZGVwZW5kZW50IG9uIHlvdXIgb3duIHBhY2thZ2UKKwl9CisKKwkvLyBTa2lwIHR5cGVEZWNsYXJhdGlvbnMgd2hpY2gga25vdyBvZiBwcmV2aW91c2x5IHJlcG9ydGVkIGVycm9ycworCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVzID0gcmVmZXJlbmNlQ29udGV4dC50eXBlczsKKwlpbnQgdHlwZUxlbmd0aCA9ICh0eXBlcyA9PSBudWxsKSA/IDAgOiB0eXBlcy5sZW5ndGg7CisJdG9wTGV2ZWxUeXBlcyA9IG5ldyBTb3VyY2VUeXBlQmluZGluZ1t0eXBlTGVuZ3RoXTsKKwlpbnQgY291bnQgPSAwOworCW5leHRUeXBlOiBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVMZW5ndGg7IGkrKykgeworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0eXBlc1tpXTsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IGZQYWNrYWdlLmdldFR5cGUwKHR5cGVEZWNsLm5hbWUpOworCQlyZWNvcmRTaW1wbGVSZWZlcmVuY2UodHlwZURlY2wubmFtZSk7IC8vIG5lZWRlZCB0byBkZXRlY3QgY29sbGlzaW9uIGNhc2VzCisJCWlmICh0eXBlQmluZGluZyAhPSBudWxsICYmICEodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykpIHsKKwkJCS8vIGlmIGEgdHlwZSBleGlzdHMsIGl0IG11c3QgYmUgYSB2YWxpZCB0eXBlIC0gY2Fubm90IGJlIGEgTm90Rm91bmQgcHJvYmxlbSB0eXBlCisJCQkvLyB1bmxlc3MgaXRzIGFuIHVucmVzb2x2ZWQgdHlwZSB3aGljaCBpcyBub3cgYmVpbmcgZGVmaW5lZAorCQkJcHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlVHlwZXMocmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOworCQkJY29udGludWUgbmV4dFR5cGU7CisJCX0KKwkJYm9vbGVhbiBwYWNrYWdlRXhpc3RzID0gY3VycmVudFBhY2thZ2VOYW1lID09IE5vQ2hhckNoYXIKKwkJCT8gZW52aXJvbm1lbnQuZ2V0VG9wTGV2ZWxQYWNrYWdlKHR5cGVEZWNsLm5hbWUpICE9IG51bGwKKwkJCTogKGZQYWNrYWdlLmdldFBhY2thZ2UodHlwZURlY2wubmFtZSkpICE9IG51bGw7CisJCWlmIChwYWNrYWdlRXhpc3RzKSB7CisJCQkvLyBpZiBhIHBhY2thZ2UgZXhpc3RzLCBpdCBtdXN0IGJlIGEgdmFsaWQgcGFja2FnZSAtIGNhbm5vdCBiZSBhIE5vdEZvdW5kIHByb2JsZW0gcGFja2FnZQorCQkJcHJvYmxlbVJlcG9ydGVyKCkudHlwZUNvbGxpZGVzV2l0aFBhY2thZ2UocmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOworCQkJY29udGludWUgbmV4dFR5cGU7CisJCX0KKworCQlpZiAoKHR5cGVEZWNsLm1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkgeworCQkJY2hhcltdIG1haW5UeXBlTmFtZTsKKwkJCWlmICgobWFpblR5cGVOYW1lID0gcmVmZXJlbmNlQ29udGV4dC5nZXRNYWluVHlwZU5hbWUoKSkgIT0gbnVsbCAvLyBtYWluVHlwZU5hbWUgPT0gbnVsbCBtZWFucyB0aGF0IGltcGxlbWVudG9yIG9mIElDb21waWxhdGlvblVuaXQgZGVjaWRlZCB0byByZXR1cm4gbnVsbAorCQkJCQkmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMobWFpblR5cGVOYW1lLCB0eXBlRGVjbC5uYW1lKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLnB1YmxpY0NsYXNzTXVzdE1hdGNoRmlsZU5hbWUocmVmZXJlbmNlQ29udGV4dCwgdHlwZURlY2wpOworCQkJCWNvbnRpbnVlIG5leHRUeXBlOworCQkJfQorCQl9CisKKwkJQ2xhc3NTY29wZSBjaGlsZCA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIHR5cGVEZWNsKTsKKwkJdG9wTGV2ZWxUeXBlc1tjb3VudCsrXSA9IGNoaWxkLmJ1aWxkVHlwZShudWxsLCBmUGFja2FnZSk7CisJfQorCisJLy8gc2hyaW5rIHRvcExldmVsVHlwZXMuLi4gb25seSBoYXBwZW5zIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZAorCWlmIChjb3VudCAhPSB0b3BMZXZlbFR5cGVzLmxlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weSh0b3BMZXZlbFR5cGVzLCAwLCB0b3BMZXZlbFR5cGVzID0gbmV3IFNvdXJjZVR5cGVCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworfQordm9pZCBjaGVja0FuZFNldEltcG9ydHMoKSB7CisJLy8gaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbXBvcnRzIGlmIG5lY2Vzc2FyeS4uLiBzaGFyZSB0aGUgZGVmYXVsdCBqYXZhLmxhbmcuKiBpbXBvcnQKKwlpZiAoZW52aXJvbm1lbnQuZGVmYXVsdEltcG9ydHMgPT0gbnVsbCkgeworCQlCaW5kaW5nIGltcG9ydEJpbmRpbmcgPSBlbnZpcm9ubWVudC5nZXRUb3BMZXZlbFBhY2thZ2UoSkFWQSk7CisJCWlmIChpbXBvcnRCaW5kaW5nICE9IG51bGwpCisJCQlpbXBvcnRCaW5kaW5nID0gKChQYWNrYWdlQmluZGluZykgaW1wb3J0QmluZGluZykuZ2V0VHlwZU9yUGFja2FnZShKQVZBX0xBTkdbMV0pOworCisJCS8vIGFib3J0IGlmIGphdmEubGFuZyBjYW5ub3QgYmUgZm91bmQuLi4KKwkJaWYgKGltcG9ydEJpbmRpbmcgPT0gbnVsbCB8fCAhaW1wb3J0QmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19PQkpFQ1QsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsKKworCQllbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0cyA9IG5ldyBJbXBvcnRCaW5kaW5nW10ge25ldyBJbXBvcnRCaW5kaW5nKEpBVkFfTEFORywgdHJ1ZSwgaW1wb3J0QmluZGluZywgbnVsbCl9OworCX0KKwlpZiAocmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzID09IG51bGwpIHsKKwkJaW1wb3J0cyA9IGVudmlyb25tZW50LmRlZmF1bHRJbXBvcnRzOworCQlyZXR1cm47CisJfQorCisJLy8gYWxsb2NhdGUgdGhlIGltcG9ydCBhcnJheSwgYWRkIGphdmEubGFuZy4qIGJ5IGRlZmF1bHQKKwlpbnQgbnVtYmVyT2ZTdGF0ZW1lbnRzID0gcmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzLmxlbmd0aDsKKwlpbnQgbnVtYmVyT2ZJbXBvcnRzID0gbnVtYmVyT2ZTdGF0ZW1lbnRzICsgMTsKKwlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhdGVtZW50czsgaSsrKSB7CisJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSByZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV07CisJCWlmIChpbXBvcnRSZWZlcmVuY2Uub25EZW1hbmQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zKSkgeworCQkJbnVtYmVyT2ZJbXBvcnRzLS07CisJCQlicmVhazsKKwkJfQorCX0KKwlJbXBvcnRCaW5kaW5nW10gcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbbnVtYmVyT2ZJbXBvcnRzXTsKKwlyZXNvbHZlZEltcG9ydHNbMF0gPSBlbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0c1swXTsKKwlpbnQgaW5kZXggPSAxOworCisJbmV4dEltcG9ydCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGF0ZW1lbnRzOyBpKyspIHsKKwkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0c1tpXTsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gaW1wb3J0UmVmZXJlbmNlLnRva2VuczsKKworCQkvLyBza2lwIGR1cGxpY2F0ZXMgb3IgaW1wb3J0cyBvZiB0aGUgY3VycmVudCBwYWNrYWdlCisJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZXg7IGorKykKKwkJCWlmIChyZXNvbHZlZEltcG9ydHNbal0ub25EZW1hbmQgPT0gaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kKQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZE5hbWUsIHJlc29sdmVkSW1wb3J0c1tqXS5jb21wb3VuZE5hbWUpKQorCQkJCQljb250aW51ZSBuZXh0SW1wb3J0OworCQlpZiAoaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kID09IHRydWUpCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcG91bmROYW1lLCBjdXJyZW50UGFja2FnZU5hbWUpKQorCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisKKwkJaWYgKGltcG9ydFJlZmVyZW5jZS5vbkRlbWFuZCkgeworCQkJQmluZGluZyBpbXBvcnRCaW5kaW5nID0gZmluZE9uRGVtYW5kSW1wb3J0KGNvbXBvdW5kTmFtZSk7CisJCQlpZiAoIWltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQljb250aW51ZSBuZXh0SW1wb3J0OwkvLyB3ZSByZXBvcnQgYWxsIHByb2JsZW1zIGluIGZhdWx0SW5JbXBvcnRzKCkKKwkJCXJlc29sdmVkSW1wb3J0c1tpbmRleCsrXSA9IG5ldyBJbXBvcnRCaW5kaW5nKGNvbXBvdW5kTmFtZSwgdHJ1ZSwgaW1wb3J0QmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJfSBlbHNlIHsKKwkJCXJlc29sdmVkSW1wb3J0c1tpbmRleCsrXSA9IG5ldyBJbXBvcnRCaW5kaW5nKGNvbXBvdW5kTmFtZSwgZmFsc2UsIG51bGwsIGltcG9ydFJlZmVyZW5jZSk7CisJCX0KKwl9CisKKwkvLyBzaHJpbmsgcmVzb2x2ZWRJbXBvcnRzLi4uIG9ubHkgaGFwcGVucyBpZiBhbiBlcnJvciB3YXMgcmVwb3J0ZWQKKwlpZiAocmVzb2x2ZWRJbXBvcnRzLmxlbmd0aCA+IGluZGV4KQorCQlTeXN0ZW0uYXJyYXljb3B5KHJlc29sdmVkSW1wb3J0cywgMCwgcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbaW5kZXhdLCAwLCBpbmRleCk7CisJaW1wb3J0cyA9IHJlc29sdmVkSW1wb3J0czsKK30KK3ZvaWQgY29ubmVjdFR5cGVIaWVyYXJjaHkoKSB7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRvcExldmVsVHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCXRvcExldmVsVHlwZXNbaV0uc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKK30KK3ZvaWQgZmF1bHRJbkltcG9ydHMoKSB7CisJaWYgKHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cyA9PSBudWxsKQorCQlyZXR1cm47CisKKwkvLyBjb2xsZWN0IHRoZSB0b3AgbGV2ZWwgdHlwZSBuYW1lcyBpZiBhIHNpbmdsZSB0eXBlIGltcG9ydCBleGlzdHMKKwlpbnQgbnVtYmVyT2ZTdGF0ZW1lbnRzID0gcmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzLmxlbmd0aDsKKwlIYXNodGFibGVPZlR5cGUgdHlwZXNCeVNpbXBsZU5hbWVzID0gbnVsbDsKKwlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhdGVtZW50czsgaSsrKSB7CisJCWlmICghcmVmZXJlbmNlQ29udGV4dC5pbXBvcnRzW2ldLm9uRGVtYW5kKSB7CisJCQl0eXBlc0J5U2ltcGxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKHRvcExldmVsVHlwZXMubGVuZ3RoICsgbnVtYmVyT2ZTdGF0ZW1lbnRzKTsKKwkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSB0b3BMZXZlbFR5cGVzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQorCQkJCXR5cGVzQnlTaW1wbGVOYW1lcy5wdXQodG9wTGV2ZWxUeXBlc1tqXS5zb3VyY2VOYW1lLCB0b3BMZXZlbFR5cGVzW2pdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gYWxsb2NhdGUgdGhlIGltcG9ydCBhcnJheSwgYWRkIGphdmEubGFuZy4qIGJ5IGRlZmF1bHQKKwlpbnQgbnVtYmVyT2ZJbXBvcnRzID0gbnVtYmVyT2ZTdGF0ZW1lbnRzICsgMTsKKwlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3RhdGVtZW50czsgaSsrKSB7CisJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSByZWZlcmVuY2VDb250ZXh0LmltcG9ydHNbaV07CisJCWlmIChpbXBvcnRSZWZlcmVuY2Uub25EZW1hbmQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zKSkgeworCQkJbnVtYmVyT2ZJbXBvcnRzLS07CisJCQlicmVhazsKKwkJfQorCX0KKwlJbXBvcnRCaW5kaW5nW10gcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbbnVtYmVyT2ZJbXBvcnRzXTsKKwlyZXNvbHZlZEltcG9ydHNbMF0gPSBlbnZpcm9ubWVudC5kZWZhdWx0SW1wb3J0c1swXTsKKwlpbnQgaW5kZXggPSAxOworCisJbmV4dEltcG9ydCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTdGF0ZW1lbnRzOyBpKyspIHsKKwkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0c1tpXTsKKwkJY2hhcltdW10gY29tcG91bmROYW1lID0gaW1wb3J0UmVmZXJlbmNlLnRva2VuczsKKworCQkvLyBza2lwIGR1cGxpY2F0ZXMgb3IgaW1wb3J0cyBvZiB0aGUgY3VycmVudCBwYWNrYWdlCisJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZXg7IGorKykKKwkJCWlmIChyZXNvbHZlZEltcG9ydHNbal0ub25EZW1hbmQgPT0gaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kKQorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZE5hbWUsIHJlc29sdmVkSW1wb3J0c1tqXS5jb21wb3VuZE5hbWUpKSB7CisJCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisJCQkJfQorCQlpZiAoaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kID09IHRydWUpCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcG91bmROYW1lLCBjdXJyZW50UGFja2FnZU5hbWUpKSB7CisJCQkJY29udGludWUgbmV4dEltcG9ydDsKKwkJCX0KKwkJaWYgKGltcG9ydFJlZmVyZW5jZS5vbkRlbWFuZCkgeworCQkJQmluZGluZyBpbXBvcnRCaW5kaW5nID0gZmluZE9uRGVtYW5kSW1wb3J0KGNvbXBvdW5kTmFtZSk7CisJCQlpZiAoIWltcG9ydEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLmltcG9ydFByb2JsZW0oaW1wb3J0UmVmZXJlbmNlLCBpbXBvcnRCaW5kaW5nKTsKKwkJCQljb250aW51ZSBuZXh0SW1wb3J0OworCQkJfQorCQkJcmVzb2x2ZWRJbXBvcnRzW2luZGV4KytdID0gbmV3IEltcG9ydEJpbmRpbmcoY29tcG91bmROYW1lLCB0cnVlLCBpbXBvcnRCaW5kaW5nLCBpbXBvcnRSZWZlcmVuY2UpOworCQl9IGVsc2UgeworCQkJQmluZGluZyB0eXBlQmluZGluZyA9IGZpbmRTaW5nbGVUeXBlSW1wb3J0KGNvbXBvdW5kTmFtZSk7CisJCQlpZiAoIXR5cGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbXBvcnRQcm9ibGVtKGltcG9ydFJlZmVyZW5jZSwgdHlwZUJpbmRpbmcpOworCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisJCQl9CisJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgeworCQkJCXByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEltcG9ydFBhY2thZ2UoaW1wb3J0UmVmZXJlbmNlKTsKKwkJCQljb250aW51ZSBuZXh0SW1wb3J0OworCQkJfQorCQkJUmVmZXJlbmNlQmluZGluZyBleGlzdGluZ1R5cGUgPSB0eXBlc0J5U2ltcGxlTmFtZXMuZ2V0KGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCQkJaWYgKGV4aXN0aW5nVHlwZSAhPSBudWxsKSB7CisJCQkJLy8gZHVwbGljYXRlIHRlc3QgYWJvdmUgc2hvdWxkIGhhdmUgY2F1Z2h0IHRoaXMgY2FzZSwgYnV0IG1ha2Ugc3VyZQorCQkJCWlmIChleGlzdGluZ1R5cGUgPT0gdHlwZUJpbmRpbmcpIHsKKwkJCQkJY29udGludWUgbmV4dEltcG9ydDsKKwkJCQl9CisJCQkJLy8gZWl0aGVyIHRoZSB0eXBlIGNvbGxpZGVzIHdpdGggYSB0b3AgbGV2ZWwgdHlwZSBvciBhbm90aGVyIGltcG9ydGVkIHR5cGUKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9wTGV2ZWxUeXBlc1tqXS5zb3VyY2VOYW1lLCBleGlzdGluZ1R5cGUuc291cmNlTmFtZSkpIHsKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLmNvbmZsaWN0aW5nSW1wb3J0KGltcG9ydFJlZmVyZW5jZSk7CisJCQkJCQljb250aW51ZSBuZXh0SW1wb3J0OworCQkJCQl9CisJCQkJfQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUltcG9ydChpbXBvcnRSZWZlcmVuY2UpOworCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CisJCQl9CisJCQlyZXNvbHZlZEltcG9ydHNbaW5kZXgrK10gPSBuZXcgSW1wb3J0QmluZGluZyhjb21wb3VuZE5hbWUsIGZhbHNlLCB0eXBlQmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJCXR5cGVzQnlTaW1wbGVOYW1lcy5wdXQoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSwgKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nKTsKKwkJfQorCX0KKworCS8vIHNocmluayByZXNvbHZlZEltcG9ydHMuLi4gb25seSBoYXBwZW5zIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZAorCWlmIChyZXNvbHZlZEltcG9ydHMubGVuZ3RoID4gaW5kZXgpCisJCVN5c3RlbS5hcnJheWNvcHkocmVzb2x2ZWRJbXBvcnRzLCAwLCByZXNvbHZlZEltcG9ydHMgPSBuZXcgSW1wb3J0QmluZGluZ1tpbmRleF0sIDAsIGluZGV4KTsKKwlpbXBvcnRzID0gcmVzb2x2ZWRJbXBvcnRzOworfQorcHVibGljIHZvaWQgZmF1bHRJblR5cGVzKCkgeworCWZhdWx0SW5JbXBvcnRzKCk7CisKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJdG9wTGV2ZWxUeXBlc1tpXS5mYXVsdEluVHlwZXNGb3JGaWVsZHNBbmRNZXRob2RzKCk7Cit9Citwcml2YXRlIEJpbmRpbmcgZmluZE9uRGVtYW5kSW1wb3J0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCXJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShjb21wb3VuZE5hbWUpOworCisJQmluZGluZyBiaW5kaW5nID0gZW52aXJvbm1lbnQuZ2V0VG9wTGV2ZWxQYWNrYWdlKGNvbXBvdW5kTmFtZVswXSk7CisJaW50IGkgPSAxOworCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCWZvdW5kTm90aGluZ09yVHlwZTogaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJCWJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVtpKytdKTsKKwkJCWlmIChiaW5kaW5nID09IG51bGwgfHwgIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCWJpbmRpbmcgPSBudWxsOworCQkJCWJyZWFrIGZvdW5kTm90aGluZ09yVHlwZTsKKwkJCX0KKwkJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykpCisJCQkJYnJlYWsgZm91bmROb3RoaW5nT3JUeXBlOworCisJCQlwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJfQorCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CisJfQorCisJUmVmZXJlbmNlQmluZGluZyB0eXBlOworCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJaWYgKGVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlID09IG51bGwKKwkJCQl8fCBlbnZpcm9ubWVudC5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KXsKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGkpLAorCQkJCU5vdEZvdW5kKTsKKwkJfQorCQl0eXBlID0gZmluZFR5cGUoY29tcG91bmROYW1lWzBdLCBlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSwgZW52aXJvbm1lbnQuZGVmYXVsdFBhY2thZ2UpOworCQlpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmlzVmFsaWRCaW5kaW5nKCkpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBpKSwKKwkJCQlOb3RGb3VuZCk7CisJCWkgPSAxOyAvLyByZXNldCB0byBsb29rIGZvciBtZW1iZXIgdHlwZXMgaW5zaWRlIHRoZSBkZWZhdWx0IHBhY2thZ2UgdHlwZQorCX0gZWxzZSB7CisJCXR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKKwl9CisKKwlmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCS8vIGRvZXMgbm90IGxvb2sgZm9yIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMgb24gcHVycG9zZQorCQlpZiAoKHR5cGUgPSB0eXBlLmdldE1lbWJlclR5cGUoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGkgKyAxKSwKKwkJCQlOb3RGb3VuZCk7CisJfQorCWlmICghdHlwZS5jYW5CZVNlZW5CeShmUGFja2FnZSkpCisJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCB0eXBlLCBOb3RWaXNpYmxlKTsKKwlyZXR1cm4gdHlwZTsKK30KK3ByaXZhdGUgQmluZGluZyBmaW5kU2luZ2xlVHlwZUltcG9ydChjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsKKwlpZiAoY29tcG91bmROYW1lLmxlbmd0aCA9PSAxKSB7CisJCS8vIGZpbmRUeXBlIHJlY29yZHMgdGhlIHJlZmVyZW5jZQorCQkvLyB0aGUgbmFtZSBjYW5ub3QgYmUgYSBwYWNrYWdlCisJCWlmIChlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSA9PSBudWxsIAorCQkJfHwgZW52aXJvbm1lbnQub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCkKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lLCBOb3RGb3VuZCk7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBmaW5kVHlwZShjb21wb3VuZE5hbWVbMF0sIGVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlLCBmUGFja2FnZSk7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIE5vdEZvdW5kKTsKKwkJZWxzZQorCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCX0KKwlyZXR1cm4gZmluZE9uRGVtYW5kSW1wb3J0KGNvbXBvdW5kTmFtZSk7Cit9CisvKiBBbnN3ZXIgdGhlIHByb2JsZW0gcmVwb3J0ZXIgdG8gdXNlIGZvciByYWlzaW5nIG5ldyBwcm9ibGVtcy4KKyoKKyogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dAorKiAodW5pdCwgdHlwZSBvciBtZXRob2QpIGluIGNhc2UgdGhlIHByb2JsZW0gaGFuZGxlciBkZWNpZGVzIGl0IGlzIG5lY2Vzc2FyeQorKiB0byBhYm9ydC4KKyovCisKK3B1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKCkgeworCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPSByZWZlcmVuY2VDb250ZXh0LnByb2JsZW1SZXBvcnRlcjsKKwlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7CisJcmV0dXJuIHByb2JsZW1SZXBvcnRlcjsKK30KKworLyoKK1doYXQgZG8gd2UgaG9sZCBvbnRvOgorCisxLiB3aGVuIHdlIHJlc29sdmUgJ2EuYi5jJywgc2F5IHdlIGtlZXAgb25seSAnYS5iLmMnCisgJiB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSAnYycgaW4gJ2EuYicsIGxldHMga2VlcCAnYS5iLmMnCitUSEVOIHdoZW4gd2UgY29tZSBhY3Jvc3MgYSBuZXcvY2hhbmdlZC9yZW1vdmVkIGl0ZW0gbmFtZWQgJ2EuYi5jJywKKyB3ZSB3b3VsZCBmaW5kIGFsbCByZWZlcmVuY2VzIHRvICdhLmIuYycKKy0+IFRoaXMgYXBwcm9hY2ggZmFpbHMgYmVjYXVzZSBldmVyeSB0eXBlIGlzIHJlc29sdmVkIGluIGV2ZXJ5IG9uRGVtYW5kIGltcG9ydCB0bworIGRldGVjdCBjb2xsaXNpb24gY2FzZXMuLi4gc28gdGhlIHJlZmVyZW5jZXMgY291bGQgYmUgMTAgdGltZXMgYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5LgorCisyLiB3aGVuIHdlIHJlc29sdmUgJ2EuYi5jJywgbGV0cyBrZWVwICdhLmInICYgJ2MnCisgJiB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSAnYycgaW4gJ2EuYicsIGxldHMga2VlcCAnYS5iJyAmICdjJworVEhFTiB3aGVuIHdlIGNvbWUgYWNyb3NzIGEgbmV3L2NoYW5nZWQvcmVtb3ZlZCBpdGVtIG5hbWVkICdhLmIuYycsCisgd2Ugd291bGQgZmluZCBhbGwgcmVmZXJlbmNlcyB0byAnYS5iJyAmICdjJworLT4gVGhpcyBhcHByb2FjaCBkb2VzIG5vdCBoYXZlIGEgc3BhY2UgcHJvYmxlbSBidXQgZmFpbHMgdG8gaGFuZGxlIGNvbGxpc2lvbiBjYXNlcy4KKyBXaGF0IGhhcHBlbnMgaWYgYSB0eXBlIGlzIGFkZGVkIG5hbWVkICdhLmInPyBXZSB3b3VsZCBzZWFyY2ggZm9yICdhJyAmICdiJyBidXQKKyB3b3VsZCBub3QgZmluZCBhIG1hdGNoLgorCiszLiB3aGVuIHdlIHJlc29sdmUgJ2EuYi5jJywgbGV0cyBrZWVwICdhJywgJ2EuYicgJiAnYScsICdiJywgJ2MnCisgJiB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSAnYycgaW4gJ2EuYicsIGxldHMga2VlcCAnYScsICdhLmInICYgJ2EnLCAnYicsICdjJworVEhFTiB3aGVuIHdlIGNvbWUgYWNyb3NzIGEgbmV3L2NoYW5nZWQvcmVtb3ZlZCBpdGVtIG5hbWVkICdhLmIuYycsCisgd2Ugd291bGQgZmluZCBhbGwgcmVmZXJlbmNlcyB0byAnYS5iJyAmICdjJworT1IgJ2EuYicgLT4gJ2EnICYgJ2InCitPUiAnYScgLT4gJycgJiAnYScKKy0+IEFzIGxvbmcgYXMgZWFjaCBzaW5nbGUgY2hhcltdIGlzIGludGVybmVkLCB3ZSBzaG91bGQgbm90IGhhdmUgYSBzcGFjZSBwcm9ibGVtCisgYW5kIGNhbiBoYW5kbGUgY29sbGlzaW9uIGNhc2VzLgorCis0LiB3aGVuIHdlIHJlc29sdmUgJ2EuYi5jJywgbGV0cyBrZWVwICdhLmInICYgJ2EnLCAnYicsICdjJworICYgd2hlbiB3ZSBmYWlsIHRvIHJlc29sdmUgJ2MnIGluICdhLmInLCBsZXRzIGtlZXAgJ2EuYicgJiAnYScsICdiJywgJ2MnCitUSEVOIHdoZW4gd2UgY29tZSBhY3Jvc3MgYSBuZXcvY2hhbmdlZC9yZW1vdmVkIGl0ZW0gbmFtZWQgJ2EuYi5jJywKKyB3ZSB3b3VsZCBmaW5kIGFsbCByZWZlcmVuY2VzIHRvICdhLmInICYgJ2MnCitPUiAnYS5iJyAtPiAnYScgJiAnYicgaW4gdGhlIHNpbXBsZSBuYW1lIGNvbGxlY3Rpb24KK09SICdhJyAtPiAnYScgaW4gdGhlIHNpbXBsZSBuYW1lIGNvbGxlY3Rpb24KKy0+IEFzIGxvbmcgYXMgZWFjaCBzaW5nbGUgY2hhcltdIGlzIGludGVybmVkLCB3ZSBzaG91bGQgbm90IGhhdmUgYSBzcGFjZSBwcm9ibGVtCisgYW5kIGNhbiBoYW5kbGUgY29sbGlzaW9uIGNhc2VzLgorKi8KK3ZvaWQgcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKGNoYXJbXVtdIHF1YWxpZmllZE5hbWUpIHsKKwlpZiAocXVhbGlmaWVkUmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCisKKwlpbnQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7CisJaWYgKGxlbmd0aCA+IDEpIHsKKwkJd2hpbGUgKCFxdWFsaWZpZWRSZWZlcmVuY2VzLmNvbnRhaW5zKHF1YWxpZmllZE5hbWUpKSB7CisJCQlxdWFsaWZpZWRSZWZlcmVuY2VzLmFkZChxdWFsaWZpZWROYW1lKTsKKwkJCWlmIChsZW5ndGggPT0gMikgeworCQkJCXJlY29yZFNpbXBsZVJlZmVyZW5jZShxdWFsaWZpZWROYW1lWzBdKTsKKwkJCQlyZWNvcmRTaW1wbGVSZWZlcmVuY2UocXVhbGlmaWVkTmFtZVsxXSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJbGVuZ3RoLS07CisJCQlyZWNvcmRTaW1wbGVSZWZlcmVuY2UocXVhbGlmaWVkTmFtZVtsZW5ndGhdKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkocXVhbGlmaWVkTmFtZSwgMCwgcXVhbGlmaWVkTmFtZSA9IG5ldyBjaGFyW2xlbmd0aF1bXSwgMCwgbGVuZ3RoKTsKKwkJfQorCX0gZWxzZSBpZiAobGVuZ3RoID09IDEpIHsKKwkJcmVjb3JkU2ltcGxlUmVmZXJlbmNlKHF1YWxpZmllZE5hbWVbMF0pOworCX0KK30KK3ZvaWQgcmVjb3JkUmVmZXJlbmNlKGNoYXJbXVtdIHF1YWxpZmllZEVuY2xvc2luZ05hbWUsIGNoYXJbXSBzaW1wbGVOYW1lKSB7CisJcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKHF1YWxpZmllZEVuY2xvc2luZ05hbWUpOworCXJlY29yZFNpbXBsZVJlZmVyZW5jZShzaW1wbGVOYW1lKTsKK30KK3ZvaWQgcmVjb3JkU2ltcGxlUmVmZXJlbmNlKGNoYXJbXSBzaW1wbGVOYW1lKSB7CisJaWYgKHNpbXBsZU5hbWVSZWZlcmVuY2VzID09IG51bGwpIHJldHVybjsgLy8gbm90IHJlY29yZGluZyBkZXBlbmRlbmNpZXMKKworCWlmICghc2ltcGxlTmFtZVJlZmVyZW5jZXMuY29udGFpbnMoc2ltcGxlTmFtZSkpCisJCXNpbXBsZU5hbWVSZWZlcmVuY2VzLmFkZChzaW1wbGVOYW1lKTsKK30KK3ZvaWQgcmVjb3JkVHlwZVJlZmVyZW5jZShUeXBlQmluZGluZyB0eXBlKSB7CisJaWYgKHJlZmVyZW5jZWRUeXBlcyA9PSBudWxsKSByZXR1cm47IC8vIG5vdCByZWNvcmRpbmcgZGVwZW5kZW5jaWVzCisKKwlpZiAodHlwZS5pc0FycmF5VHlwZSgpKQorCQl0eXBlID0gKChBcnJheUJpbmRpbmcpIHR5cGUpLmxlYWZDb21wb25lbnRUeXBlOworCWlmICghdHlwZS5pc0Jhc2VUeXBlKCkgJiYgIXJlZmVyZW5jZWRUeXBlcy5jb250YWluc0lkZW50aWNhbCh0eXBlKSkKKwkJcmVmZXJlbmNlZFR5cGVzLmFkZCh0eXBlKTsKK30KK3ZvaWQgcmVjb3JkVHlwZVJlZmVyZW5jZXMoVHlwZUJpbmRpbmdbXSB0eXBlcykgeworCWlmIChxdWFsaWZpZWRSZWZlcmVuY2VzID09IG51bGwpIHJldHVybjsgLy8gbm90IHJlY29yZGluZyBkZXBlbmRlbmNpZXMKKwlpZiAodHlwZXMgPT0gbnVsbCB8fCB0eXBlcy5sZW5ndGggPT0gMCkgcmV0dXJuOworCisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCS8vIE5vIG5lZWQgdG8gcmVjb3JkIHN1cGVydHlwZXMgb2YgbWV0aG9kIGFyZ3VtZW50cyAmIHRocm93biBleGNlcHRpb25zLCBqdXN0IHRoZSBjb21wb3VuZE5hbWUKKwkJLy8gSWYgYSBmaWVsZC9tZXRob2QgaXMgcmV0cmlldmVkIGZyb20gc3VjaCBhIHR5cGUgdGhlbiBhIHNlcGFyYXRlIGNhbGwgZG9lcyB0aGUgam9iCisJCVR5cGVCaW5kaW5nIHR5cGUgPSB0eXBlc1tpXTsKKwkJaWYgKHR5cGUuaXNBcnJheVR5cGUoKSkKKwkJCXR5cGUgPSAoKEFycmF5QmluZGluZykgdHlwZSkubGVhZkNvbXBvbmVudFR5cGU7CisJCWlmICghdHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgYWN0dWFsVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlOworCQkJaWYgKCFhY3R1YWxUeXBlLmlzTG9jYWxUeXBlKCkpCisJCQkJcmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKGFjdHVhbFR5cGUuaXNNZW1iZXJUeXBlKCkKKwkJCQkJPyBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBhY3R1YWxUeXBlLnJlYWRhYmxlTmFtZSgpKQorCQkJCQk6IGFjdHVhbFR5cGUuY29tcG91bmROYW1lKTsKKwkJfQorCX0KK30KK0JpbmRpbmcgcmVzb2x2ZVNpbmdsZVR5cGVJbXBvcnQoSW1wb3J0QmluZGluZyBpbXBvcnRCaW5kaW5nKSB7CisJaWYgKGltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQgPT0gbnVsbCkgeworCQlpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0ID0gZmluZFNpbmdsZVR5cGVJbXBvcnQoaW1wb3J0QmluZGluZy5jb21wb3VuZE5hbWUpOworCQlpZiAoIWltcG9ydEJpbmRpbmcucmVzb2x2ZWRJbXBvcnQuaXNWYWxpZEJpbmRpbmcoKSB8fCBpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0IGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJCWlmICh0aGlzLmltcG9ydHMgIT0gbnVsbCl7CisJCQkJSW1wb3J0QmluZGluZ1tdIG5ld0ltcG9ydHMgPSBuZXcgSW1wb3J0QmluZGluZ1tpbXBvcnRzLmxlbmd0aCAtIDFdOworCQkJCWZvciAoaW50IGkgPSAwLCBuID0gMCwgbWF4ID0gdGhpcy5pbXBvcnRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKQorCQkJCQlpZiAodGhpcy5pbXBvcnRzW2ldICE9IGltcG9ydEJpbmRpbmcpeworCQkJCQkJbmV3SW1wb3J0c1tuKytdID0gdGhpcy5pbXBvcnRzW2ldOworCQkJCQl9CisJCQkJdGhpcy5pbXBvcnRzID0gbmV3SW1wb3J0czsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCXJldHVybiBpbXBvcnRCaW5kaW5nLnJlc29sdmVkSW1wb3J0OworfQorcHVibGljIHZvaWQgc3RvcmVEZXBlbmRlbmN5SW5mbygpIHsKKwkvLyBhZGQgdGhlIHR5cGUgaGllcmFyY2h5IG9mIGVhY2ggcmVmZXJlbmNlZCB0eXBlCisJLy8gY2Fubm90IGRvIGVhcmx5IHNpbmNlIHRoZSBoaWVyYXJjaHkgbWF5IG5vdCBiZSBmdWxseSByZXNvbHZlZAorCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZFR5cGVzLnNpemU7IGkrKykgeyAvLyBncm93cyBhcyBtb3JlIHR5cGVzIGFyZSBhZGRlZAorCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVmZXJlbmNlZFR5cGVzLmVsZW1lbnRBdChpKTsKKwkJaWYgKCF0eXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJCXJlY29yZFF1YWxpZmllZFJlZmVyZW5jZSh0eXBlLmlzTWVtYmVyVHlwZSgpCisJCQkJPyBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlLnJlYWRhYmxlTmFtZSgpKQorCQkJCTogdHlwZS5jb21wb3VuZE5hbWUpOworCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSB0eXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCWlmIChlbmNsb3NpbmcgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZFR5cGVzLmNvbnRhaW5zSWRlbnRpY2FsKGVuY2xvc2luZykpCisJCQkJcmVmZXJlbmNlZFR5cGVzLmFkZChlbmNsb3NpbmcpOyAvLyB0byByZWNvcmQgaXRzIHN1cGVydHlwZXMKKwkJfQorCQlSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MgPSB0eXBlLnN1cGVyY2xhc3MoKTsKKwkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZFR5cGVzLmNvbnRhaW5zSWRlbnRpY2FsKHN1cGVyY2xhc3MpKQorCQkJCXJlZmVyZW5jZWRUeXBlcy5hZGQoc3VwZXJjbGFzcyk7IC8vIHRvIHJlY29yZCBpdHMgc3VwZXJ0eXBlcworCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IHR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCWlmIChpbnRlcmZhY2VzICE9IG51bGwgJiYgaW50ZXJmYWNlcy5sZW5ndGggPiAwKQorCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspCisJCQkJaWYgKCFyZWZlcmVuY2VkVHlwZXMuY29udGFpbnNJZGVudGljYWwoaW50ZXJmYWNlc1tqXSkpCisJCQkJCXJlZmVyZW5jZWRUeXBlcy5hZGQoaW50ZXJmYWNlc1tqXSk7IC8vIHRvIHJlY29yZCBpdHMgc3VwZXJ0eXBlcworCX0KKworCWludCBzaXplID0gcXVhbGlmaWVkUmVmZXJlbmNlcy5zaXplOworCWNoYXJbXVtdW10gcXVhbGlmaWVkUmVmcyA9IG5ldyBjaGFyW3NpemVdW11bXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJcXVhbGlmaWVkUmVmc1tpXSA9IHF1YWxpZmllZFJlZmVyZW5jZXMuZWxlbWVudEF0KGkpOworCXJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQucXVhbGlmaWVkUmVmZXJlbmNlcyA9IHF1YWxpZmllZFJlZnM7CisKKwlzaXplID0gc2ltcGxlTmFtZVJlZmVyZW5jZXMuc2l6ZTsKKwljaGFyW11bXSBzaW1wbGVSZWZzID0gbmV3IGNoYXJbc2l6ZV1bXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJc2ltcGxlUmVmc1tpXSA9IHNpbXBsZU5hbWVSZWZlcmVuY2VzLmVsZW1lbnRBdChpKTsKKwlyZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LnNpbXBsZU5hbWVSZWZlcmVuY2VzID0gc2ltcGxlUmVmczsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICItLS0gQ29tcGlsYXRpb25Vbml0IFNjb3BlIDogIiArIG5ldyBTdHJpbmcocmVmZXJlbmNlQ29udGV4dC5nZXRGaWxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIHZvaWQgdmVyaWZ5TWV0aG9kcyhNZXRob2RWZXJpZmllciB2ZXJpZmllcikgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0b3BMZXZlbFR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQl0b3BMZXZlbFR5cGVzW2ldLnZlcmlmeU1ldGhvZHModmVyaWZpZXIpOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsZXJNb2RpZmllcnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsZXJNb2RpZmllcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA4ZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxlck1vZGlmaWVycy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOworCitwdWJsaWMgaW50ZXJmYWNlIENvbXBpbGVyTW9kaWZpZXJzIGV4dGVuZHMgQ2xhc3NGaWxlQ29uc3RhbnRzIHsgLy8gbW9kaWZpZXIgY29uc3RhbnQKKwkvLyB0aG9zZSBjb25zdGFudHMgYXJlIGRlcGVuZGluZyB1cG9uIENsYXNzRmlsZUNvbnN0YW50cyAocmVseWluZyB0aGF0IGNsYXNzZmlsZXMgb25seSB1c2UgdGhlIDE2IGxvd2VyIGJpdHMpCisJZmluYWwgaW50IEFjY0RlZmF1bHQgPSAwOworCWZpbmFsIGludCBBY2NKdXN0RmxhZyA9IDB4RkZGRjsKKwlmaW5hbCBpbnQgQWNjQ2F0Y2hlc0V4Y2VwdGlvbnMgPSAweDEwMDAwOworCWZpbmFsIGludCBBY2NUaHJvd3NFeGNlcHRpb25zID0gMHgyMDAwMDsKKwlmaW5hbCBpbnQgQWNjUHJvYmxlbSA9IDB4NDAwMDA7CisJZmluYWwgaW50IEFjY0Zyb21DbGFzc0ZpbGUgPSAweDgwMDAwOworCWZpbmFsIGludCBBY2NJc0NvbnN0YW50VmFsdWUgPSAweDgwMDAwOwkKKwlmaW5hbCBpbnQgQWNjRGVmYXVsdEFic3RyYWN0ID0gMHg4MDAwMDsKKwlmaW5hbCBpbnQgQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkgPSAweDIwMDAwMDsgLy8gaWUuIGlzIGRlcHJlY2F0ZWQgaXRzZWxmIG9yIGNvbnRhaW5lZCBieSBhIGRlcHJlY2F0ZWQgdHlwZQorCWZpbmFsIGludCBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gPSAweDQwMDAwMDsKKwlmaW5hbCBpbnQgQWNjTW9kaWZpZXJQcm9ibGVtID0gMHg4MDAwMDA7CisJZmluYWwgaW50IEFjY1NlbWljb2xvbkJvZHkgPSAweDEwMDAwMDA7CisJZmluYWwgaW50IEFjY1VucmVzb2x2ZWQgPSAweDIwMDAwMDA7CisJZmluYWwgaW50IEFjY0NsZWFyUHJpdmF0ZU1vZGlmaWVyID0gMHg0MDAwMDAwOyAvLyBtaWdodCBiZSByZXF1ZXN0ZWQgZHVyaW5nIHByaXZhdGUgYWNjZXNzIGVtdWxhdGlvbgorCWZpbmFsIGludCBBY2NWaXNpYmlsaXR5TUFTSyA9IEFjY1B1YmxpYyB8IEFjY1Byb3RlY3RlZCB8IEFjY1ByaXZhdGU7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ZpZWxkQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9GaWVsZEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI3Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9GaWVsZEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKKworcHVibGljIGNsYXNzIEZpZWxkQmluZGluZyBleHRlbmRzIFZhcmlhYmxlQmluZGluZyB7CisJcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3M7Citwcm90ZWN0ZWQgRmllbGRCaW5kaW5nKCkgeworfQorcHVibGljIEZpZWxkQmluZGluZyhjaGFyW10gbmFtZSwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcywgQ29uc3RhbnQgY29uc3RhbnQpIHsKKwl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOworCXRoaXMuY29uc3RhbnQgPSBjb25zdGFudDsKKworCS8vIHByb3BhZ2F0ZSB0aGUgZGVwcmVjYXRlZCBtb2RpZmllcgorCWlmICh0aGlzLmRlY2xhcmluZ0NsYXNzICE9IG51bGwpCisJCWlmICh0aGlzLmRlY2xhcmluZ0NsYXNzLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYgIWlzRGVwcmVjYXRlZCgpKQorCQkJdGhpcy5tb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7Cit9CitwdWJsaWMgRmllbGRCaW5kaW5nKEZpZWxkRGVjbGFyYXRpb24gZmllbGQsIFR5cGVCaW5kaW5nIHR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKKwl0aGlzKGZpZWxkLm5hbWUsIHR5cGUsIGZpZWxkLm1vZGlmaWVycywgZGVjbGFyaW5nQ2xhc3MsIG51bGwpOworCisJZmllbGQuYmluZGluZyA9IHRoaXM7Cit9CisvLyBzcGVjaWFsIEFQSSB1c2VkIHRvIGNoYW5nZSBmaWVsZCBkZWNsYXJpbmcgY2xhc3MgZm9yIHJ1bnRpbWUgdmlzaWJpbGl0eSBjaGVjaworcHVibGljIEZpZWxkQmluZGluZyhGaWVsZEJpbmRpbmcgaW5pdGlhbEZpZWxkQmluZGluZywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCXRoaXMubW9kaWZpZXJzID0gaW5pdGlhbEZpZWxkQmluZGluZy5tb2RpZmllcnM7CisJdGhpcy50eXBlID0gaW5pdGlhbEZpZWxkQmluZGluZy50eXBlOworCXRoaXMubmFtZSA9IGluaXRpYWxGaWVsZEJpbmRpbmcubmFtZTsKKwl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CisJdGhpcy5jb25zdGFudCA9IGluaXRpYWxGaWVsZEJpbmRpbmcuY29uc3RhbnQ7CisJdGhpcy5pZCA9IGluaXRpYWxGaWVsZEJpbmRpbmcuaWQ7Cit9CisvKiBBUEkKKyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgorKi8KKworcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKKwlyZXR1cm4gRklFTEQ7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCisqIEludm9jYXRpb25TaXRlIGltcGxlbWVudHMgaXNTdXBlckFjY2VzcygpIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiBpZiB0aGUgcmVjZWl2ZXIgaXMgcHJvdGVjdGVkLgorKgorKiBOT1RFOiBDYW5ub3QgaW52b2tlIHRoaXMgbWV0aG9kIHdpdGggYSBjb21waWxhdGlvbiB1bml0IHNjb3BlLgorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuQmVTZWVuQnkoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CisKKwlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgJiYgaW52b2NhdGlvblR5cGUgPT0gcmVjZWl2ZXJUeXBlKSByZXR1cm4gdHJ1ZTsKKworCWlmIChpc1Byb3RlY3RlZCgpKSB7CisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQorCQkvLyBPUiB0aGUgaW52b2NhdGlvblR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyaW5nQ2xhc3MKKwkJLy8gICAgQU5EIHRoZSByZWNlaXZlclR5cGUgaXMgdGhlIGludm9jYXRpb25UeXBlIG9yIGl0cyBzdWJjbGFzcworCQkvLyAgICBPUiB0aGUgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQorCQkvLyAgICBPUiBwcmV2aW91cyBhc3NlcnRpb25zIGFyZSB0cnVlIGZvciBvbmUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCisJCWlmIChpbnZvY2F0aW9uVHlwZSA9PSBkZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7CisJCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisJCQorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW52b2NhdGlvblR5cGU7CisJCWludCBkZXB0aCA9IDA7CisJCWRvIHsKKwkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpIHsKKwkJCQlpZiAoaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpKXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwkJCQlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoaXNTdGF0aWMoKSl7CisJCQkJCXJldHVybiB0cnVlOyAvLyBzZWUgMUZNRVBETCAtIHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1R5cGVBY2Nlc3MoKTsKKwkJCQl9CisJCQkJaWYgKGN1cnJlbnRUeXBlID09IHJlY2VpdmVyVHlwZSB8fCBjdXJyZW50VHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlKSl7CisJCQkJCWlmIChkZXB0aCA+IDApIGludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJZGVwdGgrKzsKKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9IHdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChpc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcworCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgZGVjbGFyaW5nQ2xhc3MgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCisJCWlmIChyZWNlaXZlclR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiBmYWxzZTsKKworCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IGludm9jYXRpb25UeXBlOworCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQkJb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IHRlbXA7CisJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCisJCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVyRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKwkJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKKwkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCQl9CisJCQlpZiAob3V0ZXJJbnZvY2F0aW9uVHlwZSAhPSBvdXRlckRlY2xhcmluZ0NsYXNzKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gaXNEZWZhdWx0KCkKKwlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgIT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKworCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKQorCQlyZXR1cm4gZmFsc2U7CisJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwlQYWNrYWdlQmluZGluZyBkZWNsYXJpbmdQYWNrYWdlID0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJZG8geworCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gdHlwZSkgcmV0dXJuIHRydWU7CisJCWlmIChkZWNsYXJpbmdQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKwl9IHdoaWxlICgodHlwZSA9IHR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgZmluYWwgaW50IGdldEFjY2Vzc0ZsYWdzKCkgeworCXJldHVybiBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgZGVmYXVsdCB2aXNpYmlsaXR5CisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHQoKSB7CisJcmV0dXJuICFpc1B1YmxpYygpICYmICFpc1Byb3RlY3RlZCgpICYmICFpc1ByaXZhdGUoKTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRlcHJlY2F0ZWQgZmllbGQKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eQorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcml2YXRlKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJvdGVjdGVkIHZpc2liaWxpdHkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJvdGVjdGVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJvdGVjdGVkKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NQdWJsaWMpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzdGF0aWMgZmllbGQKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGljKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjU3RhdGljKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzb3VyY2Ugb2YgdGhlIGRlY2xhcmluZ0NsYXNzCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1N5bnRoZXRpYykgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHRyYW5zaWVudCBmaWVsZAorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NUcmFuc2llbnQpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIncyBkZWNsYXJpbmcgdHlwZSBpcyBkZXByZWNhdGVkIChvciBhbnkgb2YgaXRzIGVuY2xvc2luZyB0eXBlcykKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzVmlld2VkQXNEZXByZWNhdGVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZCkgIT0gMCB8fAorCQkobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2b2xhdGlsZSBmaWVsZAorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWb2xhdGlsZSgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1ZvbGF0aWxlKSAhPSAwOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbXBvcnRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIxOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbXBvcnRCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7CisJcHVibGljIGNoYXJbXVtdIGNvbXBvdW5kTmFtZTsKKwlwdWJsaWMgYm9vbGVhbiBvbkRlbWFuZDsKKwlwdWJsaWMgSW1wb3J0UmVmZXJlbmNlIHJlZmVyZW5jZTsKKworCUJpbmRpbmcgcmVzb2x2ZWRJbXBvcnQ7IC8vIG11c3QgZW5zdXJlIHRoZSBpbXBvcnQgaXMgcmVzb2x2ZWQKKwkKK3B1YmxpYyBJbXBvcnRCaW5kaW5nKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgYm9vbGVhbiBpc09uRGVtYW5kLCBCaW5kaW5nIGJpbmRpbmcsIEltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwl0aGlzLmNvbXBvdW5kTmFtZSA9IGNvbXBvdW5kTmFtZTsKKwl0aGlzLm9uRGVtYW5kID0gaXNPbkRlbWFuZDsKKwl0aGlzLnJlc29sdmVkSW1wb3J0ID0gYmluZGluZzsKKwl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKK30KKy8qIEFQSQorKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgYmluZGluZyB0eXBlIGZyb20gQmluZGluZy5CaW5kaW5nSUQuCisqLworCitwdWJsaWMgZmluYWwgaW50IGJpbmRpbmdUeXBlKCkgeworCXJldHVybiBJTVBPUlQ7Cit9CitwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKKwlpZiAob25EZW1hbmQpCisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLicpLCAiLioiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJpbXBvcnQgOiAiICsgbmV3IFN0cmluZyhyZWFkYWJsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0lubmVyRW11bGF0aW9uRGVwZW5kZW5jeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGQzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0lubmVyRW11bGF0aW9uRGVwZW5kZW5jeS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK3B1YmxpYyBjbGFzcyBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3l7CisJcHVibGljIEJsb2NrU2NvcGUgc2NvcGU7CisJcHVibGljIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZDsKKwlwdWJsaWMgYm9vbGVhbiB1c2VEaXJlY3RBY2Nlc3M7CisgICAgCitwdWJsaWMgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5KEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwgYm9vbGVhbiB1c2VEaXJlY3RBY2Nlc3MpIHsKKwl0aGlzLnNjb3BlID0gc2NvcGU7CisJdGhpcy53YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkID0gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZDsKKwl0aGlzLnVzZURpcmVjdEFjY2VzcyA9IHVzZURpcmVjdEFjY2VzczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE1MzMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbnZvY2F0aW9uU2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK3B1YmxpYyBpbnRlcmZhY2UgSW52b2NhdGlvblNpdGUgeworCWJvb2xlYW4gaXNTdXBlckFjY2VzcygpOworCWJvb2xlYW4gaXNUeXBlQWNjZXNzKCk7CisJdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpOworCXZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpOworCQorCS8vIGluIGNhc2UgdGhlIHJlY2VpdmVyIHR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIGFjdHVhbCByZWNlaXZlciB0eXBlIAorCS8vIGUuZy4gcGtnLlR5cGUuQyAocmVjZWl2ZXIgdHlwZSBvZiBDIGlzIHR5cGUgb2Ygc291cmNlIGNvbnRleHQsIAorCS8vCQlidXQgYWN0dWFsIHJlY2VpdmVyIHR5cGUgaXMgcGtnLlR5cGUpCisJLy8gZS5nMi4gaW4gcHJlc2VuY2Ugb2YgaW1wbGljaXQgYWNjZXNzIHRvIGVuY2xvc2luZyB0eXBlCisJdm9pZCBzZXRBY3R1YWxSZWNlaXZlclR5cGUoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVHlwZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM5NDBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFR5cGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworcHVibGljIGZpbmFsIGNsYXNzIExvY2FsVHlwZUJpbmRpbmcgZXh0ZW5kcyBOZXN0ZWRUeXBlQmluZGluZyB7CisJZmluYWwgc3RhdGljIGNoYXJbXSBMb2NhbFR5cGVQcmVmaXggPSB7ICckJywgJ0wnLCAnbycsICdjJywgJ2EnLCAnbCcsICckJyB9OworCisJcHJpdmF0ZSBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3lbXSBkZXBlbmRlbnRzOworcHVibGljIExvY2FsVHlwZUJpbmRpbmcoQ2xhc3NTY29wZSBzY29wZSwgU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCXN1cGVyKAorCQluZXcgY2hhcltdW10ge0NoYXJPcGVyYXRpb24uY29uY2F0KExvY2FsVHlwZVByZWZpeCwgc2NvcGUucmVmZXJlbmNlQ29udGV4dC5uYW1lKX0sCisJCXNjb3BlLAorCQllbmNsb3NpbmdUeXBlKTsKKworCWlmICh0aGlzLnNvdXJjZU5hbWUgPT0gQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uQU5PTllNT1VTX0VNUFRZX05BTUUpCisJCXRoaXMudGFnQml0cyB8PSBBbm9ueW1vdXNUeXBlTWFzazsKKwllbHNlCisJCXRoaXMudGFnQml0cyB8PSBMb2NhbFR5cGVNYXNrOworfQorLyogUmVjb3JkIGEgZGVwZW5kZW5jeSBvbnRvIGEgc291cmNlIHRhcmdldCB0eXBlIHdoaWNoIG1heSBiZSBhbHRlcmVkCisqIGJ5IHRoZSBlbmQgb2YgdGhlIGlubmVyY2xhc3MgZW11bGF0aW9uLiBMYXRlciBvbiwgd2Ugd2lsbCByZXZpc2l0CisqIGFsbCBpdHMgZGVwZW5kZW50cyBzbyBhcyB0byB1cGRhdGUgdGhlbSAoc2VlIHVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpKS4KKyovCisKK3B1YmxpYyB2b2lkIGFkZElubmVyRW11bGF0aW9uRGVwZW5kZW50KEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwgYm9vbGVhbiB1c2VEaXJlY3RBY2Nlc3MpIHsKKwlpbnQgaW5kZXg7CisJaWYgKGRlcGVuZGVudHMgPT0gbnVsbCkgeworCQlpbmRleCA9IDA7CisJCWRlcGVuZGVudHMgPSBuZXcgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5WzFdOworCX0gZWxzZSB7CisJCWluZGV4ID0gZGVwZW5kZW50cy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJCWlmIChkZXBlbmRlbnRzW2ldLnNjb3BlID09IHNjb3BlKQorCQkJCXJldHVybjsgLy8gYWxyZWFkeSBzdG9yZWQKKwkJU3lzdGVtLmFycmF5Y29weShkZXBlbmRlbnRzLCAwLCAoZGVwZW5kZW50cyA9IG5ldyBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3lbaW5kZXggKyAxXSksIDAsIGluZGV4KTsKKwl9CisJZGVwZW5kZW50c1tpbmRleF0gPSBuZXcgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5KHNjb3BlLCB3YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkLCB1c2VEaXJlY3RBY2Nlc3MpOworCS8vICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBkZXBlbmRlbmN5OiAiKyBuZXcgU3RyaW5nKHNjb3BlLmVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSkgKyAiIC0tPiAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSk7Cit9CisvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgorKgorKiBOT1RFOiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZy9hZnRlciBjb2RlIGdlbi4KKyovCisKK3B1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIC8qIGphdmEvbGFuZy9PYmplY3QgKi8geworCXJldHVybiBjb25zdGFudFBvb2xOYW1lOworfQorcHVibGljIHZvaWQgY29uc3RhbnRQb29sTmFtZShjaGFyW10gY29tcHV0ZWRDb25zdGFudFBvb2xOYW1lKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKKwl0aGlzLmNvbnN0YW50UG9vbE5hbWUgPSBjb21wdXRlZENvbnN0YW50UG9vbE5hbWU7Cit9CitwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKKwlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyA9PSBOb1N1cGVySW50ZXJmYWNlcykKKwkJCXJldHVybiAoIjwiK1V0aWwuYmluZCgiYmluZGluZy5zdWJjbGFzcyIsbmV3IFN0cmluZyhzdXBlcmNsYXNzLnJlYWRhYmxlTmFtZSgpKSkgKyAiPiIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXJldHVybiAoIjwiK1V0aWwuYmluZCgiYmluZGluZy5pbXBsZW1lbnRhdGlvbiIsbmV3IFN0cmluZyhzdXBlckludGVyZmFjZXNbMF0ucmVhZGFibGVOYW1lKCkpKSArICI+IikudG9DaGFyQXJyYXkoKTsJCQkgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgaWYgKGlzTWVtYmVyVHlwZSgpKSB7CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCksIHNvdXJjZU5hbWUsICcuJyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNvdXJjZU5hbWU7CisJfQorfQorLy8gUmVjb3JkIHRoYXQgdGhlIHR5cGUgaXMgYSBsb2NhbCBtZW1iZXIgdHlwZQorCitwdWJsaWMgdm9pZCBzZXRBc01lbWJlclR5cGUoKSB7CisJdGFnQml0cyB8PSBNZW1iZXJUeXBlTWFzazsKK30KK3B1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKKwlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpCisJCXJldHVybiByZWFkYWJsZU5hbWUoKTsKKwllbHNlCisJCXJldHVybiBzb3VyY2VOYW1lOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpCisJCXJldHVybiAiQW5vbnltb3VzIHR5cGUgOiAiICsgc3VwZXIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorCWlmIChpc01lbWJlclR5cGUoKSkKKwkJcmV0dXJuICJMb2NhbCBtZW1iZXIgdHlwZSA6ICIgKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gIkxvY2FsIHR5cGUgOiAiICsgbmV3IFN0cmluZyhzb3VyY2VOYW1lKCkpICsgIiAiICsgc3VwZXIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9CisvKiBUcmlnZ2VyIHRoZSBkZXBlbmRlbmN5IG1lY2hhbmlzbSBmb3JjaW5nIHRoZSBpbm5lcmNsYXNzIGVtdWxhdGlvbgorKiB0byBiZSBwcm9wYWdhdGVkIHRvIGFsbCBkZXBlbmRlbnQgc291cmNlIHR5cGVzLgorKi8KKworcHVibGljIHZvaWQgdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCkgeworCWlmIChkZXBlbmRlbnRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGRlcGVuZGVudHNbaV07CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nICIgKyBuZXcgU3RyaW5nKHRoaXMucmVhZGFibGVOYW1lKCkpICsgIiAtLT4gIiArIG5ldyBTdHJpbmcoZGVwZW5kZW5jeS5zY29wZS5lbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCkpKTsKKwkJCWRlcGVuZGVuY3kuc2NvcGUucHJvcGFnYXRlSW5uZXJFbXVsYXRpb24odGhpcywgZGVwZW5kZW5jeS53YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkLCBkZXBlbmRlbmN5LnVzZURpcmVjdEFjY2Vzcyk7CisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlOWM5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworCitwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZUJpbmRpbmcgZXh0ZW5kcyBWYXJpYWJsZUJpbmRpbmcgeworCXB1YmxpYyBib29sZWFuIGlzQXJndW1lbnQ7CisKKwlwdWJsaWMgaW50IHJlc29sdmVkUG9zaXRpb247IC8vIGZvciBjb2RlIGdlbmVyYXRpb24gKHBvc2l0aW9uIGluIG1ldGhvZCBjb250ZXh0KQorCXB1YmxpYyBib29sZWFuIHVzZWQ7IC8vIGZvciBmbG93IGFuYWx5c2lzCisJcHVibGljIEJsb2NrU2NvcGUgZGVjbGFyaW5nU2NvcGU7IC8vIGJhY2stcG9pbnRlciB0byBpdHMgZGVjbGFyaW5nIHNjb3BlCisJcHVibGljIExvY2FsRGVjbGFyYXRpb24gZGVjbGFyYXRpb247IC8vIGZvciBzb3VyY2UtcG9zaXRpb25zCisKKwlwdWJsaWMgaW50W10gaW5pdGlhbGl6YXRpb25QQ3M7CisJcHVibGljIGludCBpbml0aWFsaXphdGlvbkNvdW50ID0gMDsKKworLy8gZm9yIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZXMJCitwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcoY2hhcltdIG5hbWUsIFR5cGVCaW5kaW5nIHR5cGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNBcmd1bWVudCkgeworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy50eXBlID0gdHlwZTsKKwl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwlpZiAodGhpcy5pc0FyZ3VtZW50ID0gaXNBcmd1bWVudCkKKwkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKK30KKworLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSBvciBhcmd1bWVudAorcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nKExvY2FsRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNBcmd1bWVudCkgeworCXRoaXMoZGVjbGFyYXRpb24ubmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBpc0FyZ3VtZW50KTsKKwl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Cit9CisvKiBBUEkKKyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgorKi8KKworcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKKwlyZXR1cm4gTE9DQUw7Cit9CisvLyBBbnN3ZXIgd2hldGhlciB0aGUgdmFyaWFibGUgYmluZGluZyBpcyBhIHNlY3JldCB2YXJpYWJsZSBhZGRlZCBmb3IgY29kZSBnZW4gcHVycG9zZXMKKworcHVibGljIGJvb2xlYW4gaXNTZWNyZXQoKSB7CisJcmV0dXJuIGRlY2xhcmF0aW9uID09IG51bGwgJiYgIWlzQXJndW1lbnQ7Cit9CitwdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKGludCBwYykgeworCWlmIChpbml0aWFsaXphdGlvblBDc1soKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IC0xKQorCQlpbml0aWFsaXphdGlvblBDc1soKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID0gcGM7Cit9CitwdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoaW50IHBjKSB7CisJaWYgKGluaXRpYWxpemF0aW9uUENzID09IG51bGwpCisJCXJldHVybjsKKwkvLyBvcHRpbWl6ZSBjYXNlcyB3aGVyZSByZW9wZW5pbmcgYSBjb250aWd1b3VzIGludGVydmFsCisJaWYgKChpbml0aWFsaXphdGlvbkNvdW50ID4gMCkgJiYgKGluaXRpYWxpemF0aW9uUENzWyAoKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IHBjKSkgeworCQlpbml0aWFsaXphdGlvblBDc1sgKChpbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSA9IC0xOyAvLyByZXVzZSBwcmV2aW91cyBpbnRlcnZhbCAoaXRzIHJhbmdlIHdpbGwgYmUgYXVnbWVudGVkKQorCX0gZWxzZSB7CisJCWludCBpbmRleCA9IGluaXRpYWxpemF0aW9uQ291bnQgPDwgMTsKKwkJaWYgKGluZGV4ID09IGluaXRpYWxpemF0aW9uUENzLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weShpbml0aWFsaXphdGlvblBDcywgMCwgKGluaXRpYWxpemF0aW9uUENzID0gbmV3IGludFtpbml0aWFsaXphdGlvbkNvdW50IDw8IDJdKSwgMCwgaW5kZXgpOworCQl9CisJCWluaXRpYWxpemF0aW9uUENzW2luZGV4XSA9IHBjOworCQlpbml0aWFsaXphdGlvblBDc1tpbmRleCArIDFdID0gLTE7CisJCWluaXRpYWxpemF0aW9uQ291bnQrKzsKKwl9Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gc3VwZXIudG9TdHJpbmcoKTsKKwlpZiAoIXVzZWQpCisJCXMgKz0gIltwb3M6IHVudXNlZF0iOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlzICs9ICJbcG9zOiAiICsgU3RyaW5nLnZhbHVlT2YocmVzb2x2ZWRQb3NpdGlvbikgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCXMgKz0gIltpZDoiICsgU3RyaW5nLnZhbHVlT2YoaWQpICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlpZiAoaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKKwkJcyArPSAiW3BjOiAiOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25Db3VudDsgaSsrKSB7CisJCQlpZiAoaSA+IDApCisJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCisJCQlzICs9IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzW2kgPDwgMV0pICsgIi0iICsgKChpbml0aWFsaXphdGlvblBDc1soaSA8PCAxKSArIDFdID09IC0xKSA/ICI/IiA6IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzWyhpPDwgMSkgKyAxXSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJfQorCQlzICs9ICJdIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzIwYjliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsNTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSVR5cGVSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CisKK3B1YmxpYyBjbGFzcyBMb29rdXBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEJhc2VUeXBlcywgUHJvYmxlbVJlYXNvbnMsIFR5cGVDb25zdGFudHMgeworCXB1YmxpYyBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKKwlwdWJsaWMgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKKwlwdWJsaWMgSVR5cGVSZXF1ZXN0b3IgdHlwZVJlcXVlc3RvcjsKKworCVBhY2thZ2VCaW5kaW5nIGRlZmF1bHRQYWNrYWdlOworCUltcG9ydEJpbmRpbmdbXSBkZWZhdWx0SW1wb3J0czsKKwlIYXNodGFibGVPZlBhY2thZ2Uga25vd25QYWNrYWdlczsKKwlzdGF0aWMgZmluYWwgUHJvYmxlbVBhY2thZ2VCaW5kaW5nIHRoZU5vdEZvdW5kUGFja2FnZSA9IG5ldyBQcm9ibGVtUGFja2FnZUJpbmRpbmcobmV3IGNoYXJbMF0sIE5vdEZvdW5kKTsKKwlzdGF0aWMgZmluYWwgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgdGhlTm90Rm91bmRUeXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5ldyBjaGFyWzBdLCBOb3RGb3VuZCk7CisKKwlwcml2YXRlIElOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50OworCXByaXZhdGUgTWV0aG9kVmVyaWZpZXIgdmVyaWZpZXI7CisJcHJpdmF0ZSBBcnJheUJpbmRpbmdbXVtdIHVuaXF1ZUFycmF5QmluZGluZ3M7CisKKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW10gdW5pdHMgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bNF07CisJcHJpdmF0ZSBpbnQgbGFzdFVuaXRJbmRleCA9IC0xOworCXByaXZhdGUgaW50IGxhc3RDb21wbGV0ZWRVbml0SW5kZXggPSAtMTsKKworCS8vIGluZGljYXRlIGluIHdoaWNoIHN0ZXAgb24gdGhlIGNvbXBpbGF0aW9uIHdlIGFyZS4KKwkvLyBzdGVwIDEgOiBidWlsZCB0aGUgcmVmZXJlbmNlIGJpbmRpbmcKKwkvLyBzdGVwIDIgOiBjb25lY3QgdGhlIGhpZXJhcmNoeSAoY29ubmVjdCBiaW5kaW5ncykKKwkvLyBzdGVwIDMgOiBidWlsZCBmaWVsZHMgYW5kIG1ldGhvZCBiaW5kaW5ncy4KKwlwcml2YXRlIGludCBzdGVwQ29tcGxldGVkOworCWZpbmFsIHN0YXRpYyBpbnQgQlVJTERfVFlQRV9ISUVSQVJDSFkgPSAxOworCWZpbmFsIHN0YXRpYyBpbnQgQ0hFQ0tfQU5EX1NFVF9JTVBPUlRTID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IENPTk5FQ1RfVFlQRV9ISUVSQVJDSFkgPSAzOworCWZpbmFsIHN0YXRpYyBpbnQgQlVJTERfRklFTERTX0FORF9NRVRIT0RTID0gNDsKK3B1YmxpYyBMb29rdXBFbnZpcm9ubWVudChJVHlwZVJlcXVlc3RvciB0eXBlUmVxdWVzdG9yLCBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQpIHsKKwl0aGlzLnR5cGVSZXF1ZXN0b3IgPSB0eXBlUmVxdWVzdG9yOworCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJdGhpcy5wcm9ibGVtUmVwb3J0ZXIgPSBwcm9ibGVtUmVwb3J0ZXI7CisJdGhpcy5kZWZhdWx0UGFja2FnZSA9IG5ldyBQYWNrYWdlQmluZGluZyh0aGlzKTsgLy8gYXNzdW1lIHRoZSBkZWZhdWx0IHBhY2thZ2UgYWx3YXlzIGV4aXN0cworCXRoaXMuZGVmYXVsdEltcG9ydHMgPSBudWxsOworCXRoaXMubmFtZUVudmlyb25tZW50ID0gbmFtZUVudmlyb25tZW50OworCXRoaXMua25vd25QYWNrYWdlcyA9IG5ldyBIYXNodGFibGVPZlBhY2thZ2UoKTsKKwl0aGlzLnVuaXF1ZUFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nWzVdW107CisJdGhpcy51bmlxdWVBcnJheUJpbmRpbmdzWzBdID0gbmV3IEFycmF5QmluZGluZ1s1MF07IC8vIHN0YXJ0IG9mZiB0aGUgbW9zdCBjb21tb24gMSBkaW1lbnNpb24gYXJyYXkgQCA1MAorfQorLyogQXNrIHRoZSBvcmFjbGUgZm9yIGEgdHlwZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgY29tcG91bmROYW1lLgorKiBBbnN3ZXIgbnVsbCBpZiB0aGUgbmFtZSBjYW5ub3QgYmUgZm91bmQuCisqLworCitwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBhc2tGb3JUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXIgPSBuYW1lRW52aXJvbm1lbnQuZmluZFR5cGUoY29tcG91bmROYW1lKTsKKwlpZiAoYW5zd2VyID09IG51bGwpCisJCXJldHVybiBudWxsOworCisJaWYgKGFuc3dlci5pc0JpbmFyeVR5cGUoKSkKKwkJLy8gdGhlIHR5cGUgd2FzIGZvdW5kIGFzIGEgLmNsYXNzIGZpbGUKKwkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldEJpbmFyeVR5cGUoKSwgY29tcHV0ZVBhY2thZ2VGcm9tKGNvbXBvdW5kTmFtZSkpOworCWVsc2UgaWYgKGFuc3dlci5pc0NvbXBpbGF0aW9uVW5pdCgpKQorCQkvLyB0aGUgdHlwZSB3YXMgZm91bmQgYXMgYSAuamF2YSBmaWxlLCB0cnkgdG8gYnVpbGQgaXQgdGhlbiBzZWFyY2ggdGhlIGNhY2hlCisJCXR5cGVSZXF1ZXN0b3IuYWNjZXB0KGFuc3dlci5nZXRDb21waWxhdGlvblVuaXQoKSk7CisJZWxzZSBpZiAoYW5zd2VyLmlzU291cmNlVHlwZSgpKQorCQkvLyB0aGUgdHlwZSB3YXMgZm91bmQgYXMgYSBzb3VyY2UgbW9kZWwKKwkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldFNvdXJjZVR5cGVzKCksIGNvbXB1dGVQYWNrYWdlRnJvbShjb21wb3VuZE5hbWUpKTsKKworCXJldHVybiBnZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7Cit9CisvKiBBc2sgdGhlIG9yYWNsZSBmb3IgYSB0eXBlIG5hbWVkIG5hbWUgaW4gdGhlIHBhY2thZ2VCaW5kaW5nLgorKiBBbnN3ZXIgbnVsbCBpZiB0aGUgbmFtZSBjYW5ub3QgYmUgZm91bmQuCisqLworCitSZWZlcmVuY2VCaW5kaW5nIGFza0ZvclR5cGUoUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcsIGNoYXJbXSBuYW1lKSB7CisJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwpIHsKKwkJaWYgKGRlZmF1bHRQYWNrYWdlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcGFja2FnZUJpbmRpbmcgPSBkZWZhdWx0UGFja2FnZTsKKwl9CisJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IG5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShuYW1lLCBwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUpOworCWlmIChhbnN3ZXIgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisKKwlpZiAoYW5zd2VyLmlzQmluYXJ5VHlwZSgpKQorCQkvLyB0aGUgdHlwZSB3YXMgZm91bmQgYXMgYSAuY2xhc3MgZmlsZQorCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0QmluYXJ5VHlwZSgpLCBwYWNrYWdlQmluZGluZyk7CisJZWxzZSBpZiAoYW5zd2VyLmlzQ29tcGlsYXRpb25Vbml0KCkpCisJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIC5qYXZhIGZpbGUsIHRyeSB0byBidWlsZCBpdCB0aGVuIHNlYXJjaCB0aGUgY2FjaGUKKwkJdHlwZVJlcXVlc3Rvci5hY2NlcHQoYW5zd2VyLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKKwllbHNlIGlmIChhbnN3ZXIuaXNTb3VyY2VUeXBlKCkpCisJCS8vIHRoZSB0eXBlIHdhcyBmb3VuZCBhcyBhIHNvdXJjZSBtb2RlbAorCQl0eXBlUmVxdWVzdG9yLmFjY2VwdChhbnN3ZXIuZ2V0U291cmNlVHlwZXMoKSwgcGFja2FnZUJpbmRpbmcpOworCisJcmV0dXJuIHBhY2thZ2VCaW5kaW5nLmdldFR5cGUwKG5hbWUpOworfQorLyogQ3JlYXRlIHRoZSBpbml0aWFsIHR5cGUgYmluZGluZ3MgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgorKgorKiBTZWUgY29tcGxldGVUeXBlQmluZGluZ3MoKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVtYWluaW5nIHN0ZXBzCisqCisqIE5PVEU6IFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgYWRkaXRpb25hbCBzb3VyY2UgZmlsZXMgYXJlIG5lZWRlZAorKi8KKworcHVibGljIHZvaWQgYnVpbGRUeXBlQmluZGluZ3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgeworCUNvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlID0gbmV3IENvbXBpbGF0aW9uVW5pdFNjb3BlKHVuaXQsIHRoaXMpOworCXNjb3BlLmJ1aWxkVHlwZUJpbmRpbmdzKCk7CisKKwlpbnQgdW5pdHNMZW5ndGggPSB1bml0cy5sZW5ndGg7CisJaWYgKCsrbGFzdFVuaXRJbmRleCA+PSB1bml0c0xlbmd0aCkKKwkJU3lzdGVtLmFycmF5Y29weSh1bml0cywgMCwgdW5pdHMgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bMiAqIHVuaXRzTGVuZ3RoXSwgMCwgdW5pdHNMZW5ndGgpOworCXVuaXRzW2xhc3RVbml0SW5kZXhdID0gdW5pdDsKK30KKy8qIENhY2hlIHRoZSBiaW5hcnkgdHlwZSBzaW5jZSB3ZSBrbm93IGl0IGlzIG5lZWRlZCBkdXJpbmcgdGhpcyBjb21waWxlLgorKgorKiBBbnN3ZXIgdGhlIGNyZWF0ZWQgQmluYXJ5VHlwZUJpbmRpbmcgb3IgbnVsbCBpZiB0aGUgdHlwZSBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZS4KKyovCisKK3B1YmxpYyBCaW5hcnlUeXBlQmluZGluZyBjYWNoZUJpbmFyeVR5cGUoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSkgeworCXJldHVybiBjYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSwgdHJ1ZSk7Cit9CisvKiBDYWNoZSB0aGUgYmluYXJ5IHR5cGUgc2luY2Ugd2Uga25vdyBpdCBpcyBuZWVkZWQgZHVyaW5nIHRoaXMgY29tcGlsZS4KKyoKKyogQW5zd2VyIHRoZSBjcmVhdGVkIEJpbmFyeVR5cGVCaW5kaW5nIG9yIG51bGwgaWYgdGhlIHR5cGUgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUuCisqLworCitwdWJsaWMgQmluYXJ5VHlwZUJpbmRpbmcgY2FjaGVCaW5hcnlUeXBlKElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIGJvb2xlYW4gbmVlZEZpZWxkc0FuZE1ldGhvZHMpIHsKKwljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBiaW5hcnlUeXBlLmdldE5hbWUoKSk7CisJUmVmZXJlbmNlQmluZGluZyBleGlzdGluZ1R5cGUgPSBnZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7CisKKwlpZiAoZXhpc3RpbmdUeXBlID09IG51bGwgfHwgZXhpc3RpbmdUeXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCisJCS8vIG9ubHkgYWRkIHRoZSBiaW5hcnkgdHlwZSBpZiBpdHMgbm90IGFscmVhZHkgaW4gdGhlIGNhY2hlCisJCXJldHVybiBjcmVhdGVCaW5hcnlUeXBlRnJvbShiaW5hcnlUeXBlLCBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lKSwgbmVlZEZpZWxkc0FuZE1ldGhvZHMpOworCXJldHVybiBudWxsOyAvLyB0aGUgdHlwZSBhbHJlYWR5IGV4aXN0cyAmIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY2FjaGUKK30KKy8qCisqIDEuIENvbm5lY3QgdGhlIHR5cGUgaGllcmFyY2h5IGZvciB0aGUgdHlwZSBiaW5kaW5ncyBjcmVhdGVkIGZvciBwYXJzZWRVbml0cy4KKyogMi4gQ3JlYXRlIHRoZSBmaWVsZCBiaW5kaW5ncworKiAzLiBDcmVhdGUgdGhlIG1ldGhvZCBiaW5kaW5ncworKi8KKworLyogV2Uga25vdyBlYWNoIGtub3duIGNvbXBpbGF0aW9uVW5pdCBpcyBmcmVlIG9mIGVycm9ycyBhdCB0aGlzIHBvaW50Li4uCisqCisqIEVhY2ggc3RlcCB3aWxsIGNyZWF0ZSBhZGRpdGlvbmFsIGJpbmRpbmdzIHVubGVzcyBhIHByb2JsZW0gaXMgZGV0ZWN0ZWQsIGluIHdoaWNoCisqIGNhc2UgZWl0aGVyIHRoZSBmYXVsdHkgaW1wb3J0L3N1cGVyaW50ZXJmYWNlL2ZpZWxkL21ldGhvZCB3aWxsIGJlIHNraXBwZWQgb3IgYQorKiBzdWl0YWJsZSByZXBsYWNlbWVudCB3aWxsIGJlIHN1YnN0aXR1dGVkIChzdWNoIGFzIE9iamVjdCBmb3IgYSBtaXNzaW5nIHN1cGVyY2xhc3MpCisqLworCitwdWJsaWMgdm9pZCBjb21wbGV0ZVR5cGVCaW5kaW5ncygpIHsKKwlzdGVwQ29tcGxldGVkID0gQlVJTERfVFlQRV9ISUVSQVJDSFk7CisJCisJZm9yIChpbnQgaSA9IGxhc3RDb21wbGV0ZWRVbml0SW5kZXggKyAxOyBpIDw9IGxhc3RVbml0SW5kZXg7IGkrKykgeworCQl1bml0c1tpXS5zY29wZS5jaGVja0FuZFNldEltcG9ydHMoKTsKKwl9CisJc3RlcENvbXBsZXRlZCA9IENIRUNLX0FORF9TRVRfSU1QT1JUUzsKKworCWZvciAoaW50IGkgPSBsYXN0Q29tcGxldGVkVW5pdEluZGV4ICsgMTsgaSA8PSBsYXN0VW5pdEluZGV4OyBpKyspIHsKKwkJdW5pdHNbaV0uc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKKwl9CisJc3RlcENvbXBsZXRlZCA9IENPTk5FQ1RfVFlQRV9ISUVSQVJDSFk7CisKKwlmb3IgKGludCBpID0gbGFzdENvbXBsZXRlZFVuaXRJbmRleCArIDE7IGkgPD0gbGFzdFVuaXRJbmRleDsgaSsrKSB7CisJCXVuaXRzW2ldLnNjb3BlLmJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOworCQl1bml0c1tpXSA9IG51bGw7IC8vIHJlbGVhc2UgdW5uZWNlc3NhcnkgcmVmZXJlbmNlIHRvIHRoZSBwYXJzZWQgdW5pdAorCX0KKwlzdGVwQ29tcGxldGVkID0gQlVJTERfRklFTERTX0FORF9NRVRIT0RTOworCWxhc3RDb21wbGV0ZWRVbml0SW5kZXggPSBsYXN0VW5pdEluZGV4OworfQorLyoKKyogMS4gQ29ubmVjdCB0aGUgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSB0eXBlIGJpbmRpbmdzIGNyZWF0ZWQgZm9yIHBhcnNlZFVuaXRzLgorKiAyLiBDcmVhdGUgdGhlIGZpZWxkIGJpbmRpbmdzCisqIDMuIENyZWF0ZSB0aGUgbWV0aG9kIGJpbmRpbmdzCisqLworCisvKgorKiBFYWNoIHN0ZXAgd2lsbCBjcmVhdGUgYWRkaXRpb25hbCBiaW5kaW5ncyB1bmxlc3MgYSBwcm9ibGVtIGlzIGRldGVjdGVkLCBpbiB3aGljaAorKiBjYXNlIGVpdGhlciB0aGUgZmF1bHR5IGltcG9ydC9zdXBlcmludGVyZmFjZS9maWVsZC9tZXRob2Qgd2lsbCBiZSBza2lwcGVkIG9yIGEKKyogc3VpdGFibGUgcmVwbGFjZW1lbnQgd2lsbCBiZSBzdWJzdGl0dXRlZCAoc3VjaCBhcyBPYmplY3QgZm9yIGEgbWlzc2luZyBzdXBlcmNsYXNzKQorKi8KKworcHVibGljIHZvaWQgY29tcGxldGVUeXBlQmluZGluZ3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgeworCWlmIChzdGVwQ29tcGxldGVkID09IEJVSUxEX0ZJRUxEU19BTkRfTUVUSE9EUykgeworCQkvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBiZWNhdXNlIHRoZSBvcmlnaW5hbCBzZXQgb2YgdW5pdHMgYXJlIGNvbXBsZXRlbHkgYnVpbHQgYW5kCisJCS8vIGFyZSBub3cgYmVpbmcgcHJvY2Vzc2VkLCBzbyB3ZSB3YW50IHRvIHRyZWF0IGFsbCB0aGUgYWRkaXRpb25hbCB1bml0cyBhcyBhIGdyb3VwCisJCS8vIHVudGlsIHRoZXkgdG9vIGFyZSBjb21wbGV0ZWx5IHByb2Nlc3NlZC4KKwkJY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwl9IGVsc2UgeworCQlpZiAocGFyc2VkVW5pdC5zY29wZSA9PSBudWxsKSByZXR1cm47IC8vIHBhcnNpbmcgZXJyb3JzIHdlcmUgdG9vIHNldmVyZQorCisJCWlmIChzdGVwQ29tcGxldGVkID49IENIRUNLX0FORF9TRVRfSU1QT1JUUykKKwkJCXBhcnNlZFVuaXQuc2NvcGUuY2hlY2tBbmRTZXRJbXBvcnRzKCk7CisKKwkJaWYgKHN0ZXBDb21wbGV0ZWQgPj0gQ09OTkVDVF9UWVBFX0hJRVJBUkNIWSkKKwkJCXBhcnNlZFVuaXQuc2NvcGUuY29ubmVjdFR5cGVIaWVyYXJjaHkoKTsKKwl9Cit9CisvKgorKiBVc2VkIGJ5IG90aGVyIGNvbXBpbGVyIHRvb2xzIHdoaWNoIGRvIG5vdCBzdGFydCBieSBjYWxsaW5nIGNvbXBsZXRlVHlwZUJpbmRpbmdzKCkuCisqCisqIDEuIENvbm5lY3QgdGhlIHR5cGUgaGllcmFyY2h5IGZvciB0aGUgdHlwZSBiaW5kaW5ncyBjcmVhdGVkIGZvciBwYXJzZWRVbml0cy4KKyogMi4gQ3JlYXRlIHRoZSBmaWVsZCBiaW5kaW5ncworKiAzLiBDcmVhdGUgdGhlIG1ldGhvZCBiaW5kaW5ncworKi8KKworcHVibGljIHZvaWQgY29tcGxldGVUeXBlQmluZGluZ3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCwgYm9vbGVhbiBidWlsZEZpZWxkc0FuZE1ldGhvZHMpIHsKKwlpZiAocGFyc2VkVW5pdC5zY29wZSA9PSBudWxsKSByZXR1cm47IC8vIHBhcnNpbmcgZXJyb3JzIHdlcmUgdG9vIHNldmVyZQorCisJcGFyc2VkVW5pdC5zY29wZS5jaGVja0FuZFNldEltcG9ydHMoKTsKKwlwYXJzZWRVbml0LnNjb3BlLmNvbm5lY3RUeXBlSGllcmFyY2h5KCk7CisKKwlpZiAoYnVpbGRGaWVsZHNBbmRNZXRob2RzKQorCQlwYXJzZWRVbml0LnNjb3BlLmJ1aWxkRmllbGRzQW5kTWV0aG9kcygpOworfQorcHJpdmF0ZSBQYWNrYWdlQmluZGluZyBjb21wdXRlUGFja2FnZUZyb20oY2hhcltdW10gY29uc3RhbnRQb29sTmFtZSkgeworCWlmIChjb25zdGFudFBvb2xOYW1lLmxlbmd0aCA9PSAxKQorCQlyZXR1cm4gZGVmYXVsdFBhY2thZ2U7CisKKwlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbnN0YW50UG9vbE5hbWVbMF0pOworCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IHRoZU5vdEZvdW5kUGFja2FnZSkgeworCQlwYWNrYWdlQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyhjb25zdGFudFBvb2xOYW1lWzBdLCB0aGlzKTsKKwkJa25vd25QYWNrYWdlcy5wdXQoY29uc3RhbnRQb29sTmFtZVswXSwgcGFja2FnZUJpbmRpbmcpOworCX0KKworCWZvciAoaW50IGkgPSAxLCBsZW5ndGggPSBjb25zdGFudFBvb2xOYW1lLmxlbmd0aCAtIDE7IGkgPCBsZW5ndGg7IGkrKykgeworCQlQYWNrYWdlQmluZGluZyBwYXJlbnQgPSBwYWNrYWdlQmluZGluZzsKKwkJaWYgKChwYWNrYWdlQmluZGluZyA9IHBhcmVudC5nZXRQYWNrYWdlMChjb25zdGFudFBvb2xOYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpIHsKKwkJCXBhY2thZ2VCaW5kaW5nID0gbmV3IFBhY2thZ2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29uc3RhbnRQb29sTmFtZSwgMCwgaSArIDEpLCBwYXJlbnQsIHRoaXMpOworCQkJcGFyZW50LmFkZFBhY2thZ2UocGFja2FnZUJpbmRpbmcpOworCQl9CisJfQorCXJldHVybiBwYWNrYWdlQmluZGluZzsKK30KKy8qIFVzZWQgdG8gZ3VhcmFudGVlIGFycmF5IHR5cGUgaWRlbnRpdHkuCisqLworCitBcnJheUJpbmRpbmcgY3JlYXRlQXJyYXlUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIGludCBkaW1lbnNpb25Db3VudCkgeworCS8vIGZpbmQgdGhlIGFycmF5IGJpbmRpbmcgY2FjaGUgZm9yIHRoaXMgZGltZW5zaW9uCisJaW50IGRpbUluZGV4ID0gZGltZW5zaW9uQ291bnQgLSAxOworCWludCBsZW5ndGggPSB1bmlxdWVBcnJheUJpbmRpbmdzLmxlbmd0aDsKKwlBcnJheUJpbmRpbmdbXSBhcnJheUJpbmRpbmdzOworCWlmIChkaW1JbmRleCA8IGxlbmd0aCkgeworCQlpZiAoKGFycmF5QmluZGluZ3MgPSB1bmlxdWVBcnJheUJpbmRpbmdzW2RpbUluZGV4XSkgPT0gbnVsbCkKKwkJCXVuaXF1ZUFycmF5QmluZGluZ3NbZGltSW5kZXhdID0gYXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbMTBdOworCX0gZWxzZSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl1bmlxdWVBcnJheUJpbmRpbmdzLCAwLCAKKwkJCXVuaXF1ZUFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nW2RpbWVuc2lvbkNvdW50XVtdLCAwLCAKKwkJCWxlbmd0aCk7IAorCQl1bmlxdWVBcnJheUJpbmRpbmdzW2RpbUluZGV4XSA9IGFycmF5QmluZGluZ3MgPSBuZXcgQXJyYXlCaW5kaW5nWzEwXTsKKwl9CisKKwkvLyBmaW5kIHRoZSBjYWNoZWQgYXJyYXkgYmluZGluZyBmb3IgdGhpcyBsZWFmIGNvbXBvbmVudCB0eXBlIChpZiBhbnkpCisJaW50IGluZGV4ID0gLTE7CisJbGVuZ3RoID0gYXJyYXlCaW5kaW5ncy5sZW5ndGg7CisJd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKwkJQXJyYXlCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tpbmRleF07CisJCWlmIChjdXJyZW50QmluZGluZyA9PSBudWxsKSAvLyBubyBtYXRjaGluZyBhcnJheSwgYnV0IHNwYWNlIGxlZnQKKwkJCXJldHVybiBhcnJheUJpbmRpbmdzW2luZGV4XSA9IG5ldyBBcnJheUJpbmRpbmcodHlwZSwgZGltZW5zaW9uQ291bnQpOworCQlpZiAoY3VycmVudEJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBjdXJyZW50QmluZGluZzsKKwl9CisKKwkvLyBubyBtYXRjaGluZyBhcnJheSwgbm8gc3BhY2UgbGVmdAorCVN5c3RlbS5hcnJheWNvcHkoCisJCWFycmF5QmluZGluZ3MsIDAsCisJCShhcnJheUJpbmRpbmdzID0gbmV3IEFycmF5QmluZGluZ1tsZW5ndGggKiAyXSksIDAsCisJCWxlbmd0aCk7IAorCXVuaXF1ZUFycmF5QmluZGluZ3NbZGltSW5kZXhdID0gYXJyYXlCaW5kaW5nczsKKwlyZXR1cm4gYXJyYXlCaW5kaW5nc1tsZW5ndGhdID0gbmV3IEFycmF5QmluZGluZyh0eXBlLCBkaW1lbnNpb25Db3VudCk7Cit9CitwdWJsaWMgQmluYXJ5VHlwZUJpbmRpbmcgY3JlYXRlQmluYXJ5VHlwZUZyb20oSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwlyZXR1cm4gY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcsIHRydWUpOworfQorcHVibGljIEJpbmFyeVR5cGVCaW5kaW5nIGNyZWF0ZUJpbmFyeVR5cGVGcm9tKElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nLCBib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzKSB7CisJQmluYXJ5VHlwZUJpbmRpbmcgYmluYXJ5QmluZGluZyA9IG5ldyBCaW5hcnlUeXBlQmluZGluZyhwYWNrYWdlQmluZGluZywgYmluYXJ5VHlwZSwgdGhpcyk7CisKKwkvLyByZXNvbHZlIGFueSBhcnJheSBiaW5kaW5ncyB3aGljaCByZWZlcmVuY2UgdGhlIHVucmVzb2x2ZWRUeXBlCisJUmVmZXJlbmNlQmluZGluZyBjYWNoZWRUeXBlID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZTAoYmluYXJ5QmluZGluZy5jb21wb3VuZE5hbWVbYmluYXJ5QmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCWlmIChjYWNoZWRUeXBlICE9IG51bGwpIHsKKwkJaWYgKGNhY2hlZFR5cGUuaXNCaW5hcnlCaW5kaW5nKCkpIC8vIHNhbml0eSBjaGVjayBiZWZvcmUgdGhlIGNhc3QuLi4gYXQgdGhpcyBwb2ludCB0aGUgY2FjaGUgc2hvdWxkIE9OTFkgY29udGFpbiB1bnJlc29sdmVkIHR5cGVzCisJCQlyZXR1cm4gKEJpbmFyeVR5cGVCaW5kaW5nKSBjYWNoZWRUeXBlOworCisJCVVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nIHVucmVzb2x2ZWRUeXBlID0gKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSBjYWNoZWRUeXBlOworCQl1bnJlc29sdmVkVHlwZS5yZXNvbHZlZFR5cGUgPSBiaW5hcnlCaW5kaW5nOworCQl1cGRhdGVBcnJheUNhY2hlKHVucmVzb2x2ZWRUeXBlLCBiaW5hcnlCaW5kaW5nKTsKKwl9CisKKwlwYWNrYWdlQmluZGluZy5hZGRUeXBlKGJpbmFyeUJpbmRpbmcpOworCWJpbmFyeUJpbmRpbmcuY2FjaGVQYXJ0c0Zyb20oYmluYXJ5VHlwZSwgbmVlZEZpZWxkc0FuZE1ldGhvZHMpOworCXJldHVybiBiaW5hcnlCaW5kaW5nOworfQorLyogVXNlZCB0byBjcmVhdGUgcGFja2FnZXMgZnJvbSB0aGUgcGFja2FnZSBzdGF0ZW1lbnQuCisqLworCitQYWNrYWdlQmluZGluZyBjcmVhdGVQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAoY29tcG91bmROYW1lWzBdKTsKKwlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpIHsKKwkJcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcoY29tcG91bmROYW1lWzBdLCB0aGlzKTsKKwkJa25vd25QYWNrYWdlcy5wdXQoY29tcG91bmROYW1lWzBdLCBwYWNrYWdlQmluZGluZyk7CisJfQorCisJZm9yIChpbnQgaSA9IDEsIGxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkvLyBjaGVjayB0byBzZWUgaWYgaXQgY29sbGlkZXMgd2l0aCBhIGtub3duIHR5cGUuLi4KKwkJLy8gdGhpcyBjYXNlIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCBhcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0KKwkJLy8gb3RoZXJ3aXNlIHdoZW4gdGhlIHNvdXJjZSB0eXBlIHdhcyBkZWZpbmVkLCB0aGUgY29ycmVjdCBlcnJvciB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKKwkJLy8gdW5sZXNzIGl0cyBhbiB1bnJlc29sdmVkIHR5cGUgd2hpY2ggaXMgcmVmZXJlbmNlZCBmcm9tIGFuIGluY29uc2lzdGVudCBjbGFzcyBmaWxlCisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGUwKGNvbXBvdW5kTmFtZVtpXSk7CisJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZSAhPSB0aGVOb3RGb3VuZFR5cGUgJiYgISh0eXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJUGFja2FnZUJpbmRpbmcgcGFyZW50ID0gcGFja2FnZUJpbmRpbmc7CisJCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYXJlbnQuZ2V0UGFja2FnZTAoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpIHsKKwkJCS8vIGlmIHRoZSBwYWNrYWdlIGlzIHVua25vd24sIGNoZWNrIHRvIHNlZSBpZiBhIHR5cGUgZXhpc3RzIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgbmV3IHBhY2thZ2UKKwkJCS8vIGNhdGNoZXMgdGhlIGNhc2Ugb2YgYSBwYWNrYWdlIHN0YXRlbWVudCBvZjogcGFja2FnZSBqYXZhLmxhbmcuT2JqZWN0OworCQkJLy8gc2luY2UgdGhlIHBhY2thZ2UgY2FuIGJlIGFkZGVkIGFmdGVyIGEgc2V0IG9mIHNvdXJjZSBmaWxlcyBoYXZlIGFscmVhZHkgYmVlbiBjb21waWxlZCwgd2UgbmVlZAorCQkJLy8gd2hlbmV2ZXIgYSBwYWNrYWdlIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZAorCQkJaWYgKG5hbWVFbnZpcm9ubWVudC5maW5kVHlwZShjb21wb3VuZE5hbWVbaV0sIHBhcmVudC5jb21wb3VuZE5hbWUpICE9IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisKKwkJCXBhY2thZ2VCaW5kaW5nID0gbmV3IFBhY2thZ2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBpICsgMSksIHBhcmVudCwgdGhpcyk7CisJCQlwYXJlbnQuYWRkUGFja2FnZShwYWNrYWdlQmluZGluZyk7CisJCX0KKwl9CisJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOworfQorLyogQW5zd2VyIHRoZSB0eXBlIGZvciB0aGUgY29tcG91bmROYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUuCisqIEFuc3dlciB0aGVOb3RGb3VuZFR5cGUgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRoZSBmaXJzdCB0aW1lCisqIGl0IHdhcyBsb29rZWQgdXAsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KKyoKKyogTk9URTogRG8gbm90IHVzZSBmb3IgbmVzdGVkIHR5cGVzLi4uIHRoZSBhbnN3ZXIgaXMgTk9UIHRoZSBzYW1lIGZvciBhLmIuQyBvciBhLmIuQy5ELkUKKyogYXNzdW1pbmcgQyBpcyBhIHR5cGUgaW4gYm90aCBjYXNlcy4gSW4gdGhlIGEuYi5DLkQuRSBjYXNlLCBudWxsIGlzIHRoZSBhbnN3ZXIuCisqLworCitwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBnZXRDYWNoZWRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCWlmIChjb21wb3VuZE5hbWUubGVuZ3RoID09IDEpIHsKKwkJaWYgKGRlZmF1bHRQYWNrYWdlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGRlZmF1bHRQYWNrYWdlLmdldFR5cGUwKGNvbXBvdW5kTmFtZVswXSk7CisJfQorCisJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlMChjb21wb3VuZE5hbWVbMF0pOworCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IHRoZU5vdEZvdW5kUGFja2FnZSkKKwkJcmV0dXJuIG51bGw7CisKKwlmb3IgKGludCBpID0gMSwgcGFja2FnZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGggLSAxOyBpIDwgcGFja2FnZUxlbmd0aDsgaSsrKQorCQlpZiAoKHBhY2thZ2VCaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0UGFja2FnZTAoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpCisJCQlyZXR1cm4gbnVsbDsKKwlyZXR1cm4gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZTAoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7Cit9CisvKiBBbnN3ZXIgdGhlIHRvcCBsZXZlbCBwYWNrYWdlIG5hbWVkIG5hbWUgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZS4KKyogQW5zd2VyIHRoZU5vdEZvdW5kUGFja2FnZSBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdGhlIGZpcnN0IHRpbWUKKyogaXQgd2FzIGxvb2tlZCB1cCwgb3RoZXJ3aXNlIGFuc3dlciBudWxsLgorKgorKiBOT1RFOiBTZW5kZXJzIG11c3QgY29udmVydCB0aGVOb3RGb3VuZFBhY2thZ2UgaW50byBhIHJlYWwgcHJvYmxlbQorKiBwYWNrYWdlIGlmIGl0cyB0byByZXR1cm5lZC4KKyovCisKK1BhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UwKGNoYXJbXSBuYW1lKSB7CisJcmV0dXJuIGtub3duUGFja2FnZXMuZ2V0KG5hbWUpOworfQorLyogQW5zd2VyIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSBuYW1lZCBuYW1lLgorKiBBc2sgdGhlIG9yYWNsZSBmb3IgdGhlIHBhY2thZ2UgaWYgaXRzIG5vdCBpbiB0aGUgY2FjaGUuCisqIEFuc3dlciBudWxsIGlmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSBmb3VuZC4KKyovCisKK1BhY2thZ2VCaW5kaW5nIGdldFRvcExldmVsUGFja2FnZShjaGFyW10gbmFtZSkgeworCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAobmFtZSk7CisJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKKwkJaWYgKHBhY2thZ2VCaW5kaW5nID09IHRoZU5vdEZvdW5kUGFja2FnZSkKKwkJCXJldHVybiBudWxsOworCQllbHNlCisJCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CisJfQorCisJaWYgKG5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UobnVsbCwgbmFtZSkpIHsKKwkJa25vd25QYWNrYWdlcy5wdXQobmFtZSwgcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcobmFtZSwgdGhpcykpOworCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CisJfQorCisJa25vd25QYWNrYWdlcy5wdXQobmFtZSwgdGhlTm90Rm91bmRQYWNrYWdlKTsgLy8gc2F2ZXMgYXNraW5nIHRoZSBvcmFjbGUgbmV4dCB0aW1lCisJcmV0dXJuIG51bGw7Cit9CisvKiBBbnN3ZXIgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmROYW1lLgorKiBBc2sgdGhlIG9yYWNsZSBmb3IgdGhlIHR5cGUgaWYgaXRzIG5vdCBpbiB0aGUgY2FjaGUuCisqIEFuc3dlciBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZC4uLiBsaWtlbHkgYSBmYXRhbCBlcnJvci4KKyovCisKK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CisJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nOworCisJaWYgKGNvbXBvdW5kTmFtZS5sZW5ndGggPT0gMSkgeworCQlpZiAoZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICgocmVmZXJlbmNlQmluZGluZyA9IGRlZmF1bHRQYWNrYWdlLmdldFR5cGUwKGNvbXBvdW5kTmFtZVswXSkpID09IG51bGwpIHsKKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAoY29tcG91bmROYW1lWzBdKTsKKwkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsICYmIHBhY2thZ2VCaW5kaW5nICE9IHRoZU5vdEZvdW5kUGFja2FnZSkKKwkJCQlyZXR1cm4gbnVsbDsgLy8gY29sbGlkZXMgd2l0aCBhIGtub3duIHBhY2thZ2UuLi4gc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGluIHN1Y2ggYSBjYXNlCisJCQlyZWZlcmVuY2VCaW5kaW5nID0gYXNrRm9yVHlwZShkZWZhdWx0UGFja2FnZSwgY29tcG91bmROYW1lWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAoY29tcG91bmROYW1lWzBdKTsKKwkJaWYgKHBhY2thZ2VCaW5kaW5nID09IHRoZU5vdEZvdW5kUGFja2FnZSkKKwkJCXJldHVybiBudWxsOworCisJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMSwgcGFja2FnZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGggLSAxOyBpIDwgcGFja2FnZUxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKChwYWNrYWdlQmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVtpXSkpID09IG51bGwpCisJCQkJCWJyZWFrOworCQkJCWlmIChwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpCisJCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisKKwkJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwpCisJCQlyZWZlcmVuY2VCaW5kaW5nID0gYXNrRm9yVHlwZShjb21wb3VuZE5hbWUpOworCQllbHNlIGlmICgocmVmZXJlbmNlQmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGUwKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pKSA9PSBudWxsKQorCQkJcmVmZXJlbmNlQmluZGluZyA9IGFza0ZvclR5cGUocGFja2FnZUJpbmRpbmcsIGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCX0KKworCWlmIChyZWZlcmVuY2VCaW5kaW5nID09IG51bGwgfHwgcmVmZXJlbmNlQmluZGluZyA9PSB0aGVOb3RGb3VuZFR5cGUpCisJCXJldHVybiBudWxsOworCWlmIChyZWZlcmVuY2VCaW5kaW5nIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCisJCXJlZmVyZW5jZUJpbmRpbmcgPSAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSByZWZlcmVuY2VCaW5kaW5nKS5yZXNvbHZlKHRoaXMpOworCisJLy8gY29tcG91bmROYW1lIHJlZmVycyB0byBhIG5lc3RlZCB0eXBlIGluY29ycmVjdGx5IChpLmUuIHBhY2thZ2UxLkEkQikKKwlpZiAocmVmZXJlbmNlQmluZGluZy5pc05lc3RlZFR5cGUoKSkKKwkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIEludGVybmFsTmFtZVByb3ZpZGVkKTsKKwllbHNlCisJCXJldHVybiByZWZlcmVuY2VCaW5kaW5nOworfQorLyogQW5zd2VyIHRoZSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWUgZnJvbSB0aGUgYmluYXJ5IGZpbGUuCisqIERvZXMgbm90IGFzayB0aGUgb3JhY2xlIGZvciB0aGUgdHlwZSBpZiBpdHMgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4uLiBpbnN0ZWFkIGFuCisqIHVucmVzb2x2ZWQgdHlwZSBpcyByZXR1cm5lZCB3aGljaCBtdXN0IGJlIHJlc29sdmVkIGJlZm9yZSB1c2VkLgorKgorKiBOT1RFOiBEb2VzIE5PVCBhbnN3ZXIgYmFzZSB0eXBlcyBub3IgYXJyYXkgdHlwZXMhCisqCisqIE5PVEU6IEFib3J0cyBjb21waWxhdGlvbiBpZiB0aGUgY2xhc3MgZmlsZSBjYW5ub3QgYmUgZm91bmQuCisqLworCitSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShjaGFyW10gc2lnbmF0dXJlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlpZiAoZW5kID09IC0xKQorCQllbmQgPSBzaWduYXR1cmUubGVuZ3RoIC0gMTsKKworCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCk7CisJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nID0gZ2V0Q2FjaGVkVHlwZShjb21wb3VuZE5hbWUpOworCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lKTsKKwkJYmluZGluZyA9IG5ldyBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIHBhY2thZ2VCaW5kaW5nKTsKKwkJcGFja2FnZUJpbmRpbmcuYWRkVHlwZShiaW5kaW5nKTsKKwl9IGVsc2UgaWYgKGJpbmRpbmcgPT0gdGhlTm90Rm91bmRUeXBlKSB7CisJCXByb2JsZW1SZXBvcnRlci5pc0NsYXNzUGF0aENvcnJlY3QoY29tcG91bmROYW1lLCBudWxsKTsKKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uCisJfQorCXJldHVybiBiaW5kaW5nOworfQorLyogQW5zd2VyIHRoZSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpZ25hdHVyZSBmcm9tIHRoZSBiaW5hcnkgZmlsZS4KKyogRG9lcyBub3QgYXNrIHRoZSBvcmFjbGUgZm9yIHRoZSB0eXBlIGlmIGl0cyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLi4uIGluc3RlYWQgYW4KKyogdW5yZXNvbHZlZCB0eXBlIGlzIHJldHVybmVkIHdoaWNoIG11c3QgYmUgcmVzb2x2ZWQgYmVmb3JlIHVzZWQuCisqCisqIE5PVEU6IERvZXMgYW5zd2VyIGJhc2UgdHlwZXMgJiBhcnJheSB0eXBlcy4KKyoKKyogTk9URTogQWJvcnRzIGNvbXBpbGF0aW9uIGlmIHRoZSBjbGFzcyBmaWxlIGNhbm5vdCBiZSBmb3VuZC4KKyovCisKK1R5cGVCaW5kaW5nIGdldFR5cGVGcm9tU2lnbmF0dXJlKGNoYXJbXSBzaWduYXR1cmUsIGludCBzdGFydCwgaW50IGVuZCkgeworCWludCBkaW1lbnNpb24gPSAwOworCXdoaWxlIChzaWduYXR1cmVbc3RhcnRdID09ICdbJykgeworCQlzdGFydCsrOworCQlkaW1lbnNpb24rKzsKKwl9CisJaWYgKGVuZCA9PSAtMSkKKwkJZW5kID0gc2lnbmF0dXJlLmxlbmd0aCAtIDE7CisKKwkvLyBKdXN0IHN3aXRjaCBvbiBzaWduYXR1cmVbc3RhcnRdIC0gdGhlIEwgY2FzZSBpcyB0aGUgZWxzZQorCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBudWxsOworCWlmIChzdGFydCA9PSBlbmQpIHsKKwkJc3dpdGNoIChzaWduYXR1cmVbc3RhcnRdKSB7CisJCQljYXNlICdJJyA6CisJCQkJYmluZGluZyA9IEludEJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdaJyA6CisJCQkJYmluZGluZyA9IEJvb2xlYW5CaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSAnVicgOgorCQkJCWJpbmRpbmcgPSBWb2lkQmluZGluZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnIDoKKwkJCQliaW5kaW5nID0gQ2hhckJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdEJyA6CisJCQkJYmluZGluZyA9IERvdWJsZUJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdCJyA6CisJCQkJYmluZGluZyA9IEJ5dGVCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSAnRicgOgorCQkJCWJpbmRpbmcgPSBGbG9hdEJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdKJyA6CisJCQkJYmluZGluZyA9IExvbmdCaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSAnUycgOgorCQkJCWJpbmRpbmcgPSBTaG9ydEJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQl0aHJvdyBuZXcgRXJyb3IoVXRpbC5iaW5kKCJlcnJvci51bmRlZmluZWRCYXNlVHlwZSIsU3RyaW5nLnZhbHVlT2Yoc2lnbmF0dXJlW3N0YXJ0XSkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSBlbHNlIHsKKwkJYmluZGluZyA9IGdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShzaWduYXR1cmUsIHN0YXJ0ICsgMSwgZW5kIC0gMSk7CisJfQorCisJaWYgKGRpbWVuc2lvbiA9PSAwKQorCQlyZXR1cm4gYmluZGluZzsKKwllbHNlCisJCXJldHVybiBjcmVhdGVBcnJheVR5cGUoYmluZGluZywgZGltZW5zaW9uKTsKK30KKy8qIEFzayB0aGUgb3JhY2xlIGlmIGEgcGFja2FnZSBleGlzdHMgbmFtZWQgbmFtZSBpbiB0aGUgcGFja2FnZSBuYW1lZCBjb21wb3VuZE5hbWUuCisqLworCitib29sZWFuIGlzUGFja2FnZShjaGFyW11bXSBjb21wb3VuZE5hbWUsIGNoYXJbXSBuYW1lKSB7CisJaWYgKGNvbXBvdW5kTmFtZSA9PSBudWxsIHx8IGNvbXBvdW5kTmFtZS5sZW5ndGggPT0gMCkKKwkJcmV0dXJuIG5hbWVFbnZpcm9ubWVudC5pc1BhY2thZ2UobnVsbCwgbmFtZSk7CisJZWxzZQorCQlyZXR1cm4gbmFtZUVudmlyb25tZW50LmlzUGFja2FnZShjb21wb3VuZE5hbWUsIG5hbWUpOworfQorLy8gVGhlIG1ldGhvZCB2ZXJpZmllciBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgdG8gZ3VhcmFudGVlIHRoZSByZWNlaXZlciwgdGhlIGNvbXBpbGVyICYgdGhlIG9yYWNsZSBhcmUgcmVhZHkuCisKK3B1YmxpYyBNZXRob2RWZXJpZmllciBtZXRob2RWZXJpZmllcigpIHsKKwlpZiAodmVyaWZpZXIgPT0gbnVsbCkKKwkJdmVyaWZpZXIgPSBuZXcgTWV0aG9kVmVyaWZpZXIodGhpcyk7CisJcmV0dXJuIHZlcmlmaWVyOworfQorcHVibGljIHZvaWQgcmVzZXQoKSB7CisJdGhpcy5kZWZhdWx0UGFja2FnZSA9IG5ldyBQYWNrYWdlQmluZGluZyh0aGlzKTsgLy8gYXNzdW1lIHRoZSBkZWZhdWx0IHBhY2thZ2UgYWx3YXlzIGV4aXN0cworCXRoaXMuZGVmYXVsdEltcG9ydHMgPSBudWxsOworCXRoaXMua25vd25QYWNrYWdlcyA9IG5ldyBIYXNodGFibGVPZlBhY2thZ2UoKTsKKworCXRoaXMudmVyaWZpZXIgPSBudWxsOworCWZvciAoaW50IGkgPSB0aGlzLnVuaXF1ZUFycmF5QmluZGluZ3MubGVuZ3RoOyAtLWkgPj0gMDspCisJCXRoaXMudW5pcXVlQXJyYXlCaW5kaW5nc1tpXSA9IG51bGw7CisJdGhpcy51bmlxdWVBcnJheUJpbmRpbmdzWzBdID0gbmV3IEFycmF5QmluZGluZ1s1MF07IC8vIHN0YXJ0IG9mZiB0aGUgbW9zdCBjb21tb24gMSBkaW1lbnNpb24gYXJyYXkgQCA1MAorCisJZm9yIChpbnQgaSA9IHRoaXMudW5pdHMubGVuZ3RoOyAtLWkgPj0gMDspCisJCXRoaXMudW5pdHNbaV0gPSBudWxsOworCXRoaXMubGFzdFVuaXRJbmRleCA9IC0xOworCXRoaXMubGFzdENvbXBsZXRlZFVuaXRJbmRleCA9IC0xOworCQorCS8vIG5hbWUgZW52aXJvbm1lbnQgaGFzIGEgbG9uZ2VyIGxpZmUgY3ljbGUsIGFuZCBtdXN0IGJlIHJlc2V0IGluCisJLy8gdGhlIGNvZGUgd2hpY2ggY3JlYXRlZCBpdC4KK30KK3ZvaWQgdXBkYXRlQXJyYXlDYWNoZShVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZyB1bnJlc29sdmVkVHlwZSwgUmVmZXJlbmNlQmluZGluZyByZXNvbHZlZFR5cGUpIHsKKwluZXh0RGltZW5zaW9uIDogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHVuaXF1ZUFycmF5QmluZGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJQXJyYXlCaW5kaW5nW10gYXJyYXlCaW5kaW5ncyA9IHVuaXF1ZUFycmF5QmluZGluZ3NbaV07CisJCWlmIChhcnJheUJpbmRpbmdzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGogPSAwLCBtYXggPSBhcnJheUJpbmRpbmdzLmxlbmd0aDsgaiA8IG1heDsgaisrKSB7CisJCQkJQXJyYXlCaW5kaW5nIGN1cnJlbnRCaW5kaW5nID0gYXJyYXlCaW5kaW5nc1tqXTsKKwkJCQlpZiAoY3VycmVudEJpbmRpbmcgPT0gbnVsbCkKKwkJCQkJY29udGludWUgbmV4dERpbWVuc2lvbjsKKwkJCQlpZiAoY3VycmVudEJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUgPT0gdW5yZXNvbHZlZFR5cGUpIHsKKwkJCQkJY3VycmVudEJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUgPSByZXNvbHZlZFR5cGU7CisJCQkJCWNvbnRpbnVlIG5leHREaW1lbnNpb247CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDIyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01lbWJlclR5cGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZW1iZXJUeXBlQmluZGluZyBleHRlbmRzIE5lc3RlZFR5cGVCaW5kaW5nIHsKK3B1YmxpYyBNZW1iZXJUeXBlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIENsYXNzU2NvcGUgc2NvcGUsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwlzdXBlcihjb21wb3VuZE5hbWUsIHNjb3BlLCBlbmNsb3NpbmdUeXBlKTsKKwl0aGlzLnRhZ0JpdHMgfD0gTWVtYmVyVHlwZU1hc2s7Cit9Cit2b2lkIGNoZWNrU3ludGhldGljQXJnc0FuZEZpZWxkcygpIHsKKwlpZiAodGhpcy5pc1N0YXRpYygpKSByZXR1cm47CisJaWYgKHRoaXMuaXNJbnRlcmZhY2UoKSkgcmV0dXJuOworCXRoaXMuYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZCh0aGlzLmVuY2xvc2luZ1R5cGUpOworfQorLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGNvbnN0YW50IHBvb2wgbmFtZS4KKyoKKyogTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCisqLworCitwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKKwlpZiAoY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gY29uc3RhbnRQb29sTmFtZTsKKworCXJldHVybiBjb25zdGFudFBvb2xOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZW5jbG9zaW5nVHlwZSgpLmNvbnN0YW50UG9vbE5hbWUoKSwgc291cmNlTmFtZSwgJyQnKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJNZW1iZXIgdHlwZSA6ICIgKyBuZXcgU3RyaW5nKHNvdXJjZU5hbWUoKSkgKyAiICIgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsNDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKKworcHVibGljIGNsYXNzIE1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIGltcGxlbWVudHMgQmFzZVR5cGVzLCBUeXBlQ29uc3RhbnRzIHsKKwlwdWJsaWMgaW50IG1vZGlmaWVyczsKKwlwdWJsaWMgY2hhcltdIHNlbGVjdG9yOworCXB1YmxpYyBUeXBlQmluZGluZyByZXR1cm5UeXBlOworCXB1YmxpYyBUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnM7CisJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSB0aHJvd25FeGNlcHRpb25zOworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzOworCisJY2hhcltdIHNpZ25hdHVyZTsKK3Byb3RlY3RlZCBNZXRob2RCaW5kaW5nKCkgeworfQorcHVibGljIE1ldGhvZEJpbmRpbmcoaW50IG1vZGlmaWVycywgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZyByZXR1cm5UeXBlLCBUeXBlQmluZGluZ1tdIGFyZ3MsIFJlZmVyZW5jZUJpbmRpbmdbXSBleGNlcHRpb25zLCBSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzKSB7CisJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCXRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisJdGhpcy5wYXJhbWV0ZXJzID0gKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKSA/IE5vUGFyYW1ldGVycyA6IGFyZ3M7CisJdGhpcy50aHJvd25FeGNlcHRpb25zID0gKGV4Y2VwdGlvbnMgPT0gbnVsbCB8fCBleGNlcHRpb25zLmxlbmd0aCA9PSAwKSA/IE5vRXhjZXB0aW9ucyA6IGV4Y2VwdGlvbnM7CisJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOworCisJLy8gcHJvcGFnYXRlIHRoZSBzdHJpY3RmcCAmIGRlcHJlY2F0ZWQgbW9kaWZpZXJzCisJaWYgKHRoaXMuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkgeworCQlpZiAodGhpcy5kZWNsYXJpbmdDbGFzcy5pc1N0cmljdGZwKCkpCisJCQlpZiAoIShpc05hdGl2ZSgpIHx8IGlzQWJzdHJhY3QoKSkpCisJCQkJdGhpcy5tb2RpZmllcnMgfD0gQWNjU3RyaWN0ZnA7CisJCWlmICh0aGlzLmRlY2xhcmluZ0NsYXNzLmlzVmlld2VkQXNEZXByZWNhdGVkKCkgJiYgIWlzRGVwcmVjYXRlZCgpKQorCQkJdGhpcy5tb2RpZmllcnMgfD0gQWNjRGVwcmVjYXRlZEltcGxpY2l0bHk7CisJfQorfQorcHVibGljIE1ldGhvZEJpbmRpbmcoaW50IG1vZGlmaWVycywgVHlwZUJpbmRpbmdbXSBhcmdzLCBSZWZlcmVuY2VCaW5kaW5nW10gZXhjZXB0aW9ucywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCXRoaXMobW9kaWZpZXJzLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLkNvbnN0YW50UG9vbE5hbWUsIFZvaWRCaW5kaW5nLCBhcmdzLCBleGNlcHRpb25zLCBkZWNsYXJpbmdDbGFzcyk7Cit9CisvLyBzcGVjaWFsIEFQSSB1c2VkIHRvIGNoYW5nZSBtZXRob2QgZGVjbGFyaW5nIGNsYXNzIGZvciBydW50aW1lIHZpc2liaWxpdHkgY2hlY2sKK3B1YmxpYyBNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmcgaW5pdGlhbE1ldGhvZEJpbmRpbmcsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKKwl0aGlzLm1vZGlmaWVycyA9IGluaXRpYWxNZXRob2RCaW5kaW5nLm1vZGlmaWVyczsKKwl0aGlzLnNlbGVjdG9yID0gaW5pdGlhbE1ldGhvZEJpbmRpbmcuc2VsZWN0b3I7CisJdGhpcy5yZXR1cm5UeXBlID0gaW5pdGlhbE1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZTsKKwl0aGlzLnBhcmFtZXRlcnMgPSBpbml0aWFsTWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzOworCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IGluaXRpYWxNZXRob2RCaW5kaW5nLnRocm93bkV4Y2VwdGlvbnM7CisJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIGFyZ3VtZW50IHR5cGVzICYgdGhlIHJlY2VpdmVyJ3MgcGFyYW1ldGVycyBhcmUgZXF1YWwKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGFyZVBhcmFtZXRlcnNFcXVhbChNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCVR5cGVCaW5kaW5nW10gYXJncyA9IG1ldGhvZC5wYXJhbWV0ZXJzOworCWlmIChwYXJhbWV0ZXJzID09IGFyZ3MpCisJCXJldHVybiB0cnVlOworCisJaW50IGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCWlmIChsZW5ndGggIT0gYXJncy5sZW5ndGgpCisJCXJldHVybiBmYWxzZTsKKwkKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAocGFyYW1ldGVyc1tpXSAhPSBhcmdzW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBiaW5kaW5nIHR5cGUgZnJvbSBCaW5kaW5nLkJpbmRpbmdJRC4KKyovCisKK3B1YmxpYyBmaW5hbCBpbnQgYmluZGluZ1R5cGUoKSB7CisJcmV0dXJuIE1FVEhPRDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSB0eXBlIHByb3ZpZGVkIGJ5IHRoZSBzY29wZS4KKyogSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cyBpc1N1cGVyQWNjZXNzKCkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIGlmIHRoZSByZWNlaXZlciBpcyBwcm90ZWN0ZWQuCisqCisqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBPTkxZIGJlIHNlbnQgaWYgdGhlIHJlY2VpdmVyIGlzIGEgY29uc3RydWN0b3IuCisqCisqIE5PVEU6IENhbm5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQgc2NvcGUuCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CisKKwlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiB0cnVlOworCisJaWYgKGlzUHJvdGVjdGVkKCkpIHsKKwkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGludm9jYXRpb25UeXBlCisJCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisJCXJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1N1cGVyQWNjZXNzKCk7CisJfQorCisJaWYgKGlzUHJpdmF0ZSgpKSB7CisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBhbmQgdGhlIGRlY2xhcmluZ0NsYXNzIGhhdmUgYSBjb21tb24gZW5jbG9zaW5nVHlwZQorCQkvLyBhbHJlYWR5IGtub3cgdGhleSBhcmUgbm90IHRoZSBpZGVudGljYWwgdHlwZQorCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVySW52b2NhdGlvblR5cGUgPSBpbnZvY2F0aW9uVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCW91dGVySW52b2NhdGlvblR5cGUgPSB0ZW1wOworCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQl9CisKKwkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CisJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgeworCQkJb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRlbXA7CisJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCX0KKwkJcmV0dXJuIG91dGVySW52b2NhdGlvblR5cGUgPT0gb3V0ZXJEZWNsYXJpbmdDbGFzczsKKwl9CisKKwkvLyBpc0RlZmF1bHQoKQorCXJldHVybiBpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSB0eXBlIHByb3ZpZGVkIGJ5IHRoZSBzY29wZS4KKyogSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cyBpc1N1cGVyQWNjZXNzKCkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIGlmIHRoZSByZWNlaXZlciBpcyBwcm90ZWN0ZWQuCisqCisqIE5PVEU6IENhbm5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQgc2NvcGUuCisqLworcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuQmVTZWVuQnkoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CisKKwlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwlpZiAoaW52b2NhdGlvblR5cGUgPT0gZGVjbGFyaW5nQ2xhc3MgJiYgaW52b2NhdGlvblR5cGUgPT0gcmVjZWl2ZXJUeXBlKSByZXR1cm4gdHJ1ZTsKKworCWlmIChpc1Byb3RlY3RlZCgpKSB7CisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQorCQkvLyBPUiB0aGUgaW52b2NhdGlvblR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyaW5nQ2xhc3MKKwkJLy8gICAgQU5EIHRoZSByZWNlaXZlclR5cGUgaXMgdGhlIGludm9jYXRpb25UeXBlIG9yIGl0cyBzdWJjbGFzcworCQkvLyAgICBPUiB0aGUgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQorCQkvLyAgICBPUiBwcmV2aW91cyBhc3NlcnRpb25zIGFyZSB0cnVlIGZvciBvbmUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCisJCWlmIChpbnZvY2F0aW9uVHlwZSA9PSBkZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7CisJCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBkZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisJCQorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW52b2NhdGlvblR5cGU7CisJCWludCBkZXB0aCA9IDA7CisJCWRvIHsKKwkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpIHsKKwkJCQlpZiAoaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpKXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwkJCQlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoaXNTdGF0aWMoKSl7CisJCQkJCXJldHVybiB0cnVlOyAvLyBzZWUgMUZNRVBETCAtIHJldHVybiBpbnZvY2F0aW9uU2l0ZS5pc1R5cGVBY2Nlc3MoKTsKKwkJCQl9CisJCQkJaWYgKGN1cnJlbnRUeXBlID09IHJlY2VpdmVyVHlwZSB8fCBjdXJyZW50VHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlKSl7CisJCQkJCWlmIChkZXB0aCA+IDApIGludm9jYXRpb25TaXRlLnNldERlcHRoKGRlcHRoKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJZGVwdGgrKzsKKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9IHdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChpc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcworCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgZGVjbGFyaW5nQ2xhc3MgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCisJCWlmIChyZWNlaXZlclR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHJldHVybiBmYWxzZTsKKworCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gZGVjbGFyaW5nQ2xhc3MpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IGludm9jYXRpb25UeXBlOworCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQkJb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IHRlbXA7CisJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCisJCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVyRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKwkJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKKwkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCQl9CisJCQlpZiAob3V0ZXJJbnZvY2F0aW9uVHlwZSAhPSBvdXRlckRlY2xhcmluZ0NsYXNzKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gaXNEZWZhdWx0KCkKKwlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgIT0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKworCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwlpZiAocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgQXJyYXlCaW5kaW5nKQorCQlyZXR1cm4gZmFsc2U7CisJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwlQYWNrYWdlQmluZGluZyBkZWNsYXJpbmdQYWNrYWdlID0gZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJZG8geworCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gdHlwZSkgcmV0dXJuIHRydWU7CisJCWlmIChkZWNsYXJpbmdQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKwl9IHdoaWxlICgodHlwZSA9IHR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgorKgorKiA8aW5pdD4gZm9yIGNvbnN0cnVjdG9ycworKiA8Y2xpbml0PiBmb3IgY2xpbml0IG1ldGhvZHMKKyogb3IgdGhlIHNvdXJjZSBuYW1lIG9mIHRoZSBtZXRob2QKKyovCisKK3B1YmxpYyBmaW5hbCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIHsKKwlyZXR1cm4gc2VsZWN0b3I7Cit9CitwdWJsaWMgZmluYWwgaW50IGdldEFjY2Vzc0ZsYWdzKCkgeworCXJldHVybiBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhbiBhYnN0cmFjdCBtZXRob2QKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NBYnN0cmFjdCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGNvbnN0cnVjdG9yCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCXJldHVybiBzZWxlY3RvciA9PSBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLkNvbnN0YW50UG9vbE5hbWU7Cit9Citwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnN0cnVjdG9yUmVsYXRlZCgpIHsKKwlyZXR1cm4gaXNDb25zdHJ1Y3RvcigpOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBkZWZhdWx0IHZpc2liaWxpdHkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdCgpIHsKKwlyZXR1cm4gIWlzUHVibGljKCkgJiYgIWlzUHJvdGVjdGVkKCkgJiYgIWlzUHJpdmF0ZSgpOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgc3lzdGVtIGdlbmVyYXRlZCBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZAorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0QWJzdHJhY3QoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NEZWZhdWx0QWJzdHJhY3QpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBkZXByZWNhdGVkIG1ldGhvZAorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBmaW5hbCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4KKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzRmluYWwoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NGaW5hbCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIG5hdGl2ZSBtZXRob2QKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzTmF0aXZlKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjTmF0aXZlKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwcml2YXRlIHZpc2liaWxpdHkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpdmF0ZSgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1Byb3RlY3RlZCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHVibGljIHZpc2liaWxpdHkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzUHVibGljKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHVibGljKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGdvdCByZXF1ZXN0ZWQgdG8gY2xlYXIgdGhlIHByaXZhdGUgbW9kaWZpZXIKKyAqIGR1cmluZyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24uCisgKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZXF1aXJlZFRvQ2xlYXJQcml2YXRlTW9kaWZpZXIoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NDbGVhclByaXZhdGVNb2RpZmllcikgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHN0YXRpYyBtZXRob2QKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGljKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjU3RhdGljKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgYWxsIGZsb2F0IG9wZXJhdGlvbnMgbXVzdCBhZGhlciB0byBJRUVFIDc1NCBmbG9hdC9kb3VibGUgcnVsZXMKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RyaWN0ZnAoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NTdHJpY3RmcCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHN5bmNocm9uaXplZCBtZXRob2QKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3luY2hyb25pemVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NTeW50aGV0aWMpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIncyBkZWNsYXJpbmcgdHlwZSBpcyBkZXByZWNhdGVkIChvciBhbnkgb2YgaXRzIGVuY2xvc2luZyB0eXBlcykKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzVmlld2VkQXNEZXByZWNhdGVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZCkgIT0gMCB8fAorCQkobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkpICE9IDA7Cit9CitwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIC8qIGZvbyhpbnQsIFRocmVhZCkgKi8geworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmFtZXRlcnMubGVuZ3RoICsgMSAqIDIwKTsKKwlpZiAoaXNDb25zdHJ1Y3RvcigpKQorCQlidWZmZXIuYXBwZW5kKGRlY2xhcmluZ0NsYXNzLnNvdXJjZU5hbWUoKSk7CisJZWxzZQorCQlidWZmZXIuYXBwZW5kKHNlbGVjdG9yKTsKKwlidWZmZXIuYXBwZW5kKCcoJyk7CisJaWYgKHBhcmFtZXRlcnMgIT0gTm9QYXJhbWV0ZXJzKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaSA+IDApCisJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzW2ldLnNvdXJjZU5hbWUoKSk7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgnKScpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworfQorcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2VsZWN0b3IoY2hhcltdIHNlbGVjdG9yKSB7CisJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCXRoaXMuc2lnbmF0dXJlID0gbnVsbDsKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUuCisqCisqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorKiBUaGUgc2lnbmF0dXJlIGlzIGNhY2hlZCBzbyBpZiB0aGUgc2lnbmF0dXJlIG9mIHRoZSByZXR1cm4gdHlwZSBvciBhbnkgcGFyYW1ldGVyCisqIHR5cGUgY2hhbmdlcywgdGhlIGNhY2hlZCBzdGF0ZSBpcyBpbnZhbGlkLgorKi8KKworcHVibGljIGZpbmFsIGNoYXJbXSBzaWduYXR1cmUoKSAvKiAoSUxqYXZhL2xhbmcvVGhyZWFkOylMamF2YS9sYW5nL09iamVjdDsgKi8geworCWlmIChzaWduYXR1cmUgIT0gbnVsbCkKKwkJcmV0dXJuIHNpZ25hdHVyZTsKKworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmFtZXRlcnMubGVuZ3RoICsgMSAqIDIwKTsKKwlidWZmZXIuYXBwZW5kKCcoJyk7CisJaWYgKGlzQ29uc3RydWN0b3JSZWxhdGVkKCkgJiYgZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJLy8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHN5bnRoZXRpYyBhcmd1bWVudCB0eXBlIHNpZ25hdHVyZXMgYXMgd2VsbAorCQlSZWZlcmVuY2VCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRUeXBlcyA9IGRlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKTsKKwkJaW50IGNvdW50ID0gc3ludGhldGljQXJndW1lbnRUeXBlcyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlidWZmZXIuYXBwZW5kKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXNbaV0uc2lnbmF0dXJlKCkpOworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CisJCWNvdW50ID0gc3ludGhldGljQXJndW1lbnRzID09IG51bGwgPyAwIDogc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJYnVmZmVyLmFwcGVuZChzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZS5zaWduYXR1cmUoKSk7CisJfQorCWlmIChwYXJhbWV0ZXJzICE9IE5vUGFyYW1ldGVycykKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQlidWZmZXIuYXBwZW5kKHBhcmFtZXRlcnNbaV0uc2lnbmF0dXJlKCkpOworCWJ1ZmZlci5hcHBlbmQoJyknKTsKKwlidWZmZXIuYXBwZW5kKHJldHVyblR5cGUuc2lnbmF0dXJlKCkpOworCXJldHVybiBzaWduYXR1cmUgPSBidWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworfQorcHVibGljIGZpbmFsIGludCBzb3VyY2VFbmQoKSB7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBzb3VyY2VNZXRob2QoKTsKKwlpZiAobWV0aG9kID09IG51bGwpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIG1ldGhvZC5zb3VyY2VFbmQ7Cit9CitBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHNvdXJjZU1ldGhvZCgpIHsKKwlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlOworCXRyeSB7CisJCXNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCXJldHVybiBudWxsOwkJCisJfQorCisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsKKwlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKHRoaXMgPT0gbWV0aG9kc1tpXS5iaW5kaW5nKQorCQkJcmV0dXJuIG1ldGhvZHNbaV07CisJcmV0dXJuIG51bGw7CQkKK30KK3B1YmxpYyBmaW5hbCBpbnQgc291cmNlU3RhcnQoKSB7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBzb3VyY2VNZXRob2QoKTsKKwlpZiAobWV0aG9kID09IG51bGwpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIG1ldGhvZC5zb3VyY2VTdGFydDsKK30KKy8qIER1cmluZyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24sIHRoZSBiaW5kaW5nIGNhbiBiZSByZXF1ZXN0ZWQgdG8gbG9vc2UgaXRzCisgKiBwcml2YXRlIHZpc2liaWxpdHkgd2hlbiB0aGUgY2xhc3MgZmlsZSBpcyBkdW1wZWQuCisgKi8KKworcHVibGljIGZpbmFsIHZvaWQgdGFnRm9yQ2xlYXJpbmdQcml2YXRlTW9kaWZpZXIoKSB7CisJbW9kaWZpZXJzIHw9IEFjY0NsZWFyUHJpdmF0ZU1vZGlmaWVyOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9IChyZXR1cm5UeXBlICE9IG51bGwpID8gcmV0dXJuVHlwZS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkCisJcyArPSAiICI7IC8vJE5PTi1OTFMtMSQKKwlzICs9IChzZWxlY3RvciAhPSBudWxsKSA/IG5ldyBTdHJpbmcoc2VsZWN0b3IpIDogIlVOTkFNRUQgTUVUSE9EIjsgLy8kTk9OLU5MUy0xJAorCisJcyArPSAiKCI7IC8vJE5PTi1OTFMtMSQKKwlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCWlmIChwYXJhbWV0ZXJzICE9IE5vUGFyYW1ldGVycykgeworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaSAgPiAwKQorCQkJCQlzICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKKwkJCQlzICs9IChwYXJhbWV0ZXJzW2ldICE9IG51bGwpID8gcGFyYW1ldGVyc1tpXS5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzICs9ICJOVUxMIFBBUkFNRVRFUlMiOyAvLyROT04tTkxTLTEkCisJfQorCXMgKz0gIikgIjsgLy8kTk9OLU5MUy0xJAorCisJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQlpZiAodGhyb3duRXhjZXB0aW9ucyAhPSBOb0V4Y2VwdGlvbnMpIHsKKwkJCXMgKz0gInRocm93cyAiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChpICA+IDApCisJCQkJCXMgKz0gIiwgIjsgLy8kTk9OLU5MUy0xJAorCQkJCXMgKz0gKHRocm93bkV4Y2VwdGlvbnNbaV0gIT0gbnVsbCkgPyB0aHJvd25FeGNlcHRpb25zW2ldLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXMgKz0gIk5VTEwgVEhST1dOIEVYQ0VQVElPTlMiOyAvLyROT04tTkxTLTEkCisJfQorCXJldHVybiBzOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmE2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFNjb3BlLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuVW5jb25kaXRpb25hbEZsb3dJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlJlZmVyZW5jZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworCisvKioKKyAqIFBhcnRpY3VsYXIgYmxvY2sgc2NvcGUgdXNlZCBmb3IgbWV0aG9kcywgY29uc3RydWN0b3JzIG9yIGNsaW5pdHMsIHJlcHJlc2VudGluZworICogaXRzIG91dGVybW9zdCBibG9ja3Njb3BlLiBOb3RlIGFsc28gdGhhdCBzdWNoIGEgc2NvcGUgd2lsbCBiZSBwcm92aWRlZCB0byBlbmNsb3NlCisgKiBmaWVsZCBpbml0aWFsaXplcnMgc3Vic2NvcGVzIGFzIHdlbGwuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RTY29wZSBleHRlbmRzIEJsb2NrU2NvcGUgeworCisJcHVibGljIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dDsKKwlwdWJsaWMgYm9vbGVhbiBuZWVkVG9Db21wYWN0TG9jYWxWYXJpYWJsZXM7CisJcHVibGljIGJvb2xlYW4gaXNTdGF0aWM7IC8vIG1ldGhvZCBtb2RpZmllciBvciBpbml0aWFsaXplciBvbmUKKworCS8vZmllbGRzIHVzZWQgaW4gdGhlIFRDIHByb2Nlc3MgKG5vIHJlYWwgbWVhbmluZykKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb3RJbkZpZWxkRGVjbCA9IC0xOyAvL211c3QgYmUgYSBuZWdhdGl2ZSB2YWx1ZSAKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOyAvL21vZGlmaWVkIG9uIHRoZSBmbHkgYnkgdGhlIFRDCisJcHVibGljIGludCBmaWVsZERlY2xhcmF0aW9uSW5kZXggPSBOb3RJbkZpZWxkRGVjbDsKKwkvL21vZGlmaWVkIG9uIHRoZSBmbHkgYnkgdGhlIFRDCisKKwlwdWJsaWMgaW50IGFuYWx5c2lzSW5kZXg7IC8vIGZvciBzZXR0aW5nIGZsb3ctYW5hbHlzaXMgaWQKKworCXB1YmxpYyBib29sZWFuIGlzUHJvcGFnYXRpbmdJbm5lckNsYXNzRW11bGF0aW9uOworCisJLy8gZm9yIGxvY2FsIHZhcmlhYmxlcyB0YWJsZSBhdHRyaWJ1dGVzCisJcHVibGljIGludCBsYXN0SW5kZXggPSAwOworCXB1YmxpYyBsb25nW10gZGVmaW5pdGVJbml0cyA9IG5ldyBsb25nWzRdOworCXB1YmxpYyBsb25nW11bXSBleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1s0XVtdOworCisJcHVibGljIE1ldGhvZFNjb3BlKAorCQlDbGFzc1Njb3BlIHBhcmVudCwKKwkJUmVmZXJlbmNlQ29udGV4dCBjb250ZXh0LAorCQlib29sZWFuIGlzU3RhdGljKSB7CisKKwkJc3VwZXIoTUVUSE9EX1NDT1BFLCBwYXJlbnQpOworCQlsb2NhbHMgPSBuZXcgTG9jYWxWYXJpYWJsZUJpbmRpbmdbNV07CisJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKKwkJdGhpcy5zdGFydEluZGV4ID0gMDsKKwl9CisKKwkvKiBTcGVjIDogOC40LjMgJiA5LjQKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JDb25zdHJ1Y3RvcihNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwkJCisJCWludCBtb2RpZmllcnMgPSBtZXRob2RCaW5kaW5nLm1vZGlmaWVyczsKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pICE9IDApCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVNb2RpZmllckZvck1ldGhvZCgKKwkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKworCQlpZiAoKChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KS5pc0RlZmF1bHRDb25zdHJ1Y3RvcikgeworCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNQdWJsaWMoKSkKKwkJCQltb2RpZmllcnMgfD0gQWNjUHVibGljOworCQkJZWxzZSBpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc1Byb3RlY3RlZCgpKQorCQkJCW1vZGlmaWVycyB8PSBBY2NQcm90ZWN0ZWQ7CisJCX0KKworCQkvLyBhZnRlciB0aGlzIHBvaW50LCB0ZXN0cyBvbiB0aGUgMTYgYml0cyByZXNlcnZlZC4KKwkJaW50IHJlYWxNb2RpZmllcnMgPSBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKKworCQkvLyBjaGVjayBmb3IgYWJub3JtYWwgbW9kaWZpZXJzCisJCWludCB1bmV4cGVjdGVkTW9kaWZpZXJzID0KKwkJCX4oQWNjUHVibGljIHwgQWNjUHJpdmF0ZSB8IEFjY1Byb3RlY3RlZCB8IEFjY1N0cmljdGZwKTsKKwkJaWYgKChyZWFsTW9kaWZpZXJzICYgdW5leHBlY3RlZE1vZGlmaWVycykgIT0gMCkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvck1ldGhvZCgKKwkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKwkJZWxzZSBpZiAoCisJCQkoKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KS5tb2RpZmllcnMgJiBBY2NTdHJpY3RmcCkgIT0gMCkKKwkJCS8vIG11c3QgY2hlY2sgdGhlIHBhcnNlIG5vZGUgZXhwbGljaXRseQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKAorCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCisJCS8vIGNoZWNrIGZvciBpbmNvbXBhdGlibGUgbW9kaWZpZXJzIGluIHRoZSB2aXNpYmlsaXR5IGJpdHMsIGlzb2xhdGUgdGhlIHZpc2liaWxpdHkgYml0cworCQlpbnQgYWNjZXNzb3JCaXRzID0gcmVhbE1vZGlmaWVycyAmIChBY2NQdWJsaWMgfCBBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlKTsKKwkJaWYgKChhY2Nlc3NvckJpdHMgJiAoYWNjZXNzb3JCaXRzIC0gMSkpICE9IDApIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZCgKKwkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKworCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlCisJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1B1YmxpYykgIT0gMCkgeworCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQorCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOworCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJpdmF0ZSkgIT0gMCkKKwkJCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7CisJCQl9CisJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkKKwkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1ByaXZhdGUpICE9IDApCisJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOworCQl9CisKKwkJLy8gaWYgdGhlIHJlY2VpdmVyJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIGEgcHJpdmF0ZSBuZXN0ZWQgdHlwZSwgdGhlbiBtYWtlIHN1cmUgdGhlIHJlY2VpdmVyIGlzIG5vdCBwcml2YXRlIChjYXVzZXMgcHJvYmxlbXMgZm9yIGlubmVyIHR5cGUgZW11bGF0aW9uKQorCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc1ByaXZhdGUoKSkKKwkJCWlmICgobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkKKwkJCQltb2RpZmllcnMgXj0gQWNjUHJpdmF0ZTsKKworCQltZXRob2RCaW5kaW5nLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl9CisJCisJLyogU3BlYyA6IDguNC4zICYgOS40CisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrQW5kU2V0TW9kaWZpZXJzRm9yTWV0aG9kKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQkKKwkJaW50IG1vZGlmaWVycyA9IG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzOworCQlpZiAoKG1vZGlmaWVycyAmIEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgIT0gMCkKKwkJCXByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kKAorCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCisJCS8vIGFmdGVyIHRoaXMgcG9pbnQsIHRlc3RzIG9uIHRoZSAxNiBiaXRzIHJlc2VydmVkLgorCQlpbnQgcmVhbE1vZGlmaWVycyA9IG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnOworCisJCS8vIHNldCB0aGUgcmVxdWVzdGVkIG1vZGlmaWVycyBmb3IgYSBtZXRob2QgaW4gYW4gaW50ZXJmYWNlCisJCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCWlmICgocmVhbE1vZGlmaWVycyAmIH4oQWNjUHVibGljIHwgQWNjQWJzdHJhY3QpKSAhPSAwKQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZU1ldGhvZCgKKwkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gY2hlY2sgZm9yIGFibm9ybWFsIG1vZGlmaWVycworCQlpbnQgdW5leHBlY3RlZE1vZGlmaWVycyA9CisJCQl+KAorCQkJCUFjY1B1YmxpYworCQkJCQl8IEFjY1ByaXZhdGUKKwkJCQkJfCBBY2NQcm90ZWN0ZWQKKwkJCQkJfCBBY2NBYnN0cmFjdAorCQkJCQl8IEFjY1N0YXRpYworCQkJCQl8IEFjY0ZpbmFsCisJCQkJCXwgQWNjU3luY2hyb25pemVkCisJCQkJCXwgQWNjTmF0aXZlCisJCQkJCXwgQWNjU3RyaWN0ZnApOworCQlpZiAoKHJlYWxNb2RpZmllcnMgJiB1bmV4cGVjdGVkTW9kaWZpZXJzKSAhPSAwKQorCQkJcHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbE1vZGlmaWVyRm9yTWV0aG9kKAorCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCisJCS8vIGNoZWNrIGZvciBpbmNvbXBhdGlibGUgbW9kaWZpZXJzIGluIHRoZSB2aXNpYmlsaXR5IGJpdHMsIGlzb2xhdGUgdGhlIHZpc2liaWxpdHkgYml0cworCQlpbnQgYWNjZXNzb3JCaXRzID0gcmVhbE1vZGlmaWVycyAmIChBY2NQdWJsaWMgfCBBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlKTsKKwkJaWYgKChhY2Nlc3NvckJpdHMgJiAoYWNjZXNzb3JCaXRzIC0gMSkpICE9IDApIHsKKwkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZCgKKwkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLAorCQkJCShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKworCQkJLy8gbmVlZCB0byBrZWVwIHRoZSBsZXNzIHJlc3RyaWN0aXZlCisJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1B1YmxpYykgIT0gMCkgeworCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJvdGVjdGVkKSAhPSAwKQorCQkJCQltb2RpZmllcnMgXj0gQWNjUHJvdGVjdGVkOworCQkJCWlmICgoYWNjZXNzb3JCaXRzICYgQWNjUHJpdmF0ZSkgIT0gMCkKKwkJCQkJbW9kaWZpZXJzIF49IEFjY1ByaXZhdGU7CisJCQl9CisJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1Byb3RlY3RlZCkgIT0gMCkKKwkJCQlpZiAoKGFjY2Vzc29yQml0cyAmIEFjY1ByaXZhdGUpICE9IDApCisJCQkJCW1vZGlmaWVycyBePSBBY2NQcml2YXRlOworCQl9CisKKwkJLy8gY2hlY2sgZm9yIG1vZGlmaWVycyBpbmNvbXBhdGlibGUgd2l0aCBhYnN0cmFjdCBtb2RpZmllcgorCQlpZiAoKG1vZGlmaWVycyAmIEFjY0Fic3RyYWN0KSAhPSAwKSB7CisJCQlpbnQgaW5jb21wYXRpYmxlV2l0aEFic3RyYWN0ID0KKwkJCQlBY2NQcml2YXRlIHwgQWNjU3RhdGljIHwgQWNjRmluYWwgfCBBY2NTeW5jaHJvbml6ZWQgfCBBY2NOYXRpdmUgfCBBY2NTdHJpY3RmcDsKKwkJCWlmICgobW9kaWZpZXJzICYgaW5jb21wYXRpYmxlV2l0aEFic3RyYWN0KSAhPSAwKQorCQkJCXByb2JsZW1SZXBvcnRlcigpLmlsbGVnYWxBYnN0cmFjdE1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QoCisJCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSByZWZlcmVuY2VDb250ZXh0KTsKKwkJCWlmICghbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0Fic3RyYWN0KCkpCisJCQkJcHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RJbkFic3RyYWN0Q2xhc3MoCisJCQkJCShTb3VyY2VUeXBlQmluZGluZykgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpOworCQl9CisKKwkJLyogRElTQUJMRUQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBqYXZhYyAoaWYgZW5hYmxlZCBzaG91bGQgYWxzbyBtYXJrIHByaXZhdGUgbWV0aG9kcyBhcyBmaW5hbCkKKwkJLy8gbWV0aG9kcyBmcm9tIGEgZmluYWwgY2xhc3MgYXJlIGZpbmFsIDogOC40LjMuMyAKKwkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNGaW5hbCgpKQorCQkJbW9kaWZpZXJzIHw9IEFjY0ZpbmFsOworCQkqLworCQkvLyBuYXRpdmUgbWV0aG9kcyBjYW5ub3QgYWxzbyBiZSB0YWdnZWQgYXMgc3RyaWN0ZnAKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NOYXRpdmUpICE9IDAgJiYgKG1vZGlmaWVycyAmIEFjY1N0cmljdGZwKSAhPSAwKQorCQkJcHJvYmxlbVJlcG9ydGVyKCkubmF0aXZlTWV0aG9kc0Nhbm5vdEJlU3RyaWN0ZnAoCisJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7CisKKwkJLy8gc3RhdGljIG1lbWJlcnMgYXJlIG9ubHkgYXV0aG9yaXplZCBpbiBhIHN0YXRpYyBtZW1iZXIgb3IgdG9wIGxldmVsIHR5cGUKKwkJaWYgKCgocmVhbE1vZGlmaWVycyAmIEFjY1N0YXRpYykgIT0gMCkKKwkJCSYmIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkKKwkJCSYmICFtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzU3RhdGljKCkpCisJCQlwcm9ibGVtUmVwb3J0ZXIoKS51bmV4cGVjdGVkU3RhdGljTW9kaWZpZXJGb3JNZXRob2QoCisJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dCk7CisKKwkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCQorCS8qIEVycm9yIG1hbmFnZW1lbnQ6CisJICogCQlrZWVwIG51bGwgZm9yIGFsbCB0aGUgZXJyb3JzIHRoYXQgcHJldmVudCB0aGUgbWV0aG9kIHRvIGJlIGNyZWF0ZWQKKwkgKiAJCW90aGVyd2lzZSByZXR1cm4gYSBjb3JyZWN0IG1ldGhvZCBiaW5kaW5nIChidXQgd2l0aG91dCB0aGUgZWxlbWVudAorCSAqCQl0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbSkgOiBpZSA6IEluY29ycmVjdCB0aHJvd24gZXhjZXB0aW9uCisJICovCisJTWV0aG9kQmluZGluZyBjcmVhdGVNZXRob2QoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKworCQkvLyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGVycm9yIHJlcG9ydGluZworCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBtZXRob2Q7CisJCW1ldGhvZC5zY29wZSA9IHRoaXM7CisJCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gcmVmZXJlbmNlVHlwZSgpLmJpbmRpbmc7CisJCWludCBtb2RpZmllcnMgPSBtZXRob2QubW9kaWZpZXJzIHwgQWNjVW5yZXNvbHZlZDsKKwkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCW1ldGhvZC5iaW5kaW5nID0gbmV3IE1ldGhvZEJpbmRpbmcobW9kaWZpZXJzLCBudWxsLCBudWxsLCBkZWNsYXJpbmdDbGFzcyk7CisJCQljaGVja0FuZFNldE1vZGlmaWVyc0ZvckNvbnN0cnVjdG9yKG1ldGhvZC5iaW5kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQorCQkJCW1vZGlmaWVycyB8PSBBY2NQdWJsaWMgfCBBY2NBYnN0cmFjdDsKKwkJCW1ldGhvZC5iaW5kaW5nID0KKwkJCQluZXcgTWV0aG9kQmluZGluZyhtb2RpZmllcnMsIG1ldGhvZC5zZWxlY3RvciwgbnVsbCwgbnVsbCwgbnVsbCwgZGVjbGFyaW5nQ2xhc3MpOworCQkJY2hlY2tBbmRTZXRNb2RpZmllcnNGb3JNZXRob2QobWV0aG9kLmJpbmRpbmcpOworCQl9CisKKwkJdGhpcy5pc1N0YXRpYyA9IG1ldGhvZC5iaW5kaW5nLmlzU3RhdGljKCk7CisJCXJldHVybiBtZXRob2QuYmluZGluZzsKKwl9CisKKwkvKiBPdmVycmlkZGVuIHRvIGRldGVjdCB0aGUgZXJyb3IgY2FzZSBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbDoKKwkKKwljbGFzcyBYIHsKKwkJaW50IGk7CisJCVggbXlYOworCQlYKFggeCkgeworCQkJdGhpcyhpLCBteVguaSwgeC5pKTsgLy8gc2FtZSBmb3Igc3VwZXIgY2FsbHMuLi4gb25seSB0aGUgZmlyc3QgMiBmaWVsZCBhY2Nlc3NlcyBhcmUgZXJyb3JzCisJCX0KKwl9CisJKi8KKwlwdWJsaWMgRmllbGRCaW5kaW5nIGZpbmRGaWVsZCgKKwkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQljaGFyW10gZmllbGROYW1lLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCUZpZWxkQmluZGluZyBmaWVsZCA9IHN1cGVyLmZpbmRGaWVsZChyZWNlaXZlclR5cGUsIGZpZWxkTmFtZSwgaW52b2NhdGlvblNpdGUpOworCQlpZiAoZmllbGQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlpZiAoIWZpZWxkLmlzVmFsaWRCaW5kaW5nKCkpCisJCQlyZXR1cm4gZmllbGQ7IC8vIGFuc3dlciB0aGUgZXJyb3IgZmllbGQKKwkJaWYgKGZpZWxkLmlzU3RhdGljKCkpCisJCQlyZXR1cm4gZmllbGQ7IC8vIHN0YXRpYyBmaWVsZHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlCisKKwkJaWYgKCFpc0NvbnN0cnVjdG9yQ2FsbCB8fCByZWNlaXZlclR5cGUgIT0gZW5jbG9zaW5nU291cmNlVHlwZSgpKQorCQkJcmV0dXJuIGZpZWxkOworCisJCWlmIChpbnZvY2F0aW9uU2l0ZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoCisJCQkJZmllbGQuZGVjbGFyaW5nQ2xhc3MsCisJCQkJZmllbGROYW1lLAorCQkJCU5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKKwkJaWYgKGludm9jYXRpb25TaXRlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQkJLy8gbG9vayB0byBzZWUgaWYgdGhlIGZpZWxkIGlzIHRoZSBmaXJzdCBiaW5kaW5nCisJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIG5hbWUgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgaW52b2NhdGlvblNpdGU7CisJCQlpZiAobmFtZS5iaW5kaW5nID09IG51bGwpCisJCQkJLy8gb25seSB0cnVlIHdoZW4gdGhlIGZpZWxkIGlzIHRoZSBmaWVsZGJpbmRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBuYW1lJ3MgdG9rZW5zCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKAorCQkJCQlmaWVsZC5kZWNsYXJpbmdDbGFzcywKKwkJCQkJZmllbGROYW1lLAorCQkJCQlOb25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbik7CisJCX0KKwkJcmV0dXJuIGZpZWxkOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSW5zaWRlSW5pdGlhbGl6ZXIoKSB7CisKKwkJcmV0dXJuIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpIHsKKworCQlyZXR1cm4gKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pCisJCQl8fCAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOworCX0KKworCS8qIEFuc3dlciB0aGUgcHJvYmxlbSByZXBvcnRlciB0byB1c2UgZm9yIHJhaXNpbmcgbmV3IHByb2JsZW1zLgorCSAqCisJICogTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoaXMgdXBkYXRlcyB0aGUgY3VycmVudCByZWZlcmVuY2UgY29udGV4dAorCSAqICh1bml0LCB0eXBlIG9yIG1ldGhvZCkgaW4gY2FzZSB0aGUgcHJvYmxlbSBoYW5kbGVyIGRlY2lkZXMgaXQgaXMgbmVjZXNzYXJ5CisJICogdG8gYWJvcnQuCisJICovCisJcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKSB7CisKKwkJTWV0aG9kU2NvcGUgb3V0ZXJNZXRob2RTY29wZTsKKwkJaWYgKChvdXRlck1ldGhvZFNjb3BlID0gb3V0ZXJNb3N0TWV0aG9kU2NvcGUoKSkgPT0gdGhpcykgeworCQkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLnByb2JsZW1SZXBvcnRlcjsKKwkJCXByb2JsZW1SZXBvcnRlci5yZWZlcmVuY2VDb250ZXh0ID0gcmVmZXJlbmNlQ29udGV4dDsKKwkJCXJldHVybiBwcm9ibGVtUmVwb3J0ZXI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gb3V0ZXJNZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKTsKKwkJfQorCX0KKworCXB1YmxpYyBmaW5hbCBpbnQgcmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlpZiAoKGZsb3dJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IChmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEZsb3dJbmZvID0gZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCk7CisJCWxvbmdbXSBleHRyYUluaXRzID0gdW5jb25kaXRpb25hbEZsb3dJbmZvLmV4dHJhRGVmaW5pdGVJbml0czsKKwkJbG9uZyBpbml0cyA9IHVuY29uZGl0aW9uYWxGbG93SW5mby5kZWZpbml0ZUluaXRzOworCQljaGVja05leHRFbnRyeSA6IGZvciAoaW50IGkgPSBsYXN0SW5kZXg7IC0taSA+PSAwOykgeworCQkJaWYgKGRlZmluaXRlSW5pdHNbaV0gPT0gaW5pdHMpIHsKKwkJCQlsb25nW10gb3RoZXJJbml0cyA9IGV4dHJhRGVmaW5pdGVJbml0c1tpXTsKKwkJCQlpZiAoKGV4dHJhSW5pdHMgIT0gbnVsbCkgJiYgKG90aGVySW5pdHMgIT0gbnVsbCkpIHsKKwkJCQkJaWYgKGV4dHJhSW5pdHMubGVuZ3RoID09IG90aGVySW5pdHMubGVuZ3RoKSB7CisJCQkJCQlpbnQgaiwgbWF4OworCQkJCQkJZm9yIChqID0gMCwgbWF4ID0gZXh0cmFJbml0cy5sZW5ndGg7IGogPCBtYXg7IGorKykgeworCQkJCQkJCWlmIChleHRyYUluaXRzW2pdICE9IG90aGVySW5pdHNbal0pIHsKKwkJCQkJCQkJY29udGludWUgY2hlY2tOZXh0RW50cnk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIGk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGV4dHJhSW5pdHMgPT0gbnVsbCkgJiYgKG90aGVySW5pdHMgPT0gbnVsbCkpIHsKKwkJCQkJCXJldHVybiBpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gYWRkIGEgbmV3IGVudHJ5CisJCWlmIChkZWZpbml0ZUluaXRzLmxlbmd0aCA9PSBsYXN0SW5kZXgpIHsKKwkJCS8vIG5lZWQgYSByZXNpemUKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZGVmaW5pdGVJbml0cywKKwkJCQkwLAorCQkJCShkZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbbGFzdEluZGV4ICsgMjBdKSwKKwkJCQkwLAorCQkJCWxhc3RJbmRleCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWV4dHJhRGVmaW5pdGVJbml0cywKKwkJCQkwLAorCQkJCShleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tsYXN0SW5kZXggKyAyMF1bXSksCisJCQkJMCwKKwkJCQlsYXN0SW5kZXgpOworCQl9CisJCWRlZmluaXRlSW5pdHNbbGFzdEluZGV4XSA9IGluaXRzOworCQlpZiAoZXh0cmFJbml0cyAhPSBudWxsKSB7CisJCQlleHRyYURlZmluaXRlSW5pdHNbbGFzdEluZGV4XSA9IG5ldyBsb25nW2V4dHJhSW5pdHMubGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZXh0cmFJbml0cywKKwkJCQkwLAorCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tsYXN0SW5kZXhdLAorCQkJCTAsCisJCQkJZXh0cmFJbml0cy5sZW5ndGgpOworCQl9CisJCXJldHVybiBsYXN0SW5kZXgrKzsKKwl9CisKKwkvKiBBbnN3ZXIgdGhlIHJlZmVyZW5jZSB0eXBlIG9mIHRoaXMgc2NvcGUuCisJKgorCSogaS5lLiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgdHlwZSBvZiB0aGlzIHNjb3BlLgorCSovCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiByZWZlcmVuY2VUeXBlKCkgeworCisJCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSAoKENsYXNzU2NvcGUpIHBhcmVudCkucmVmZXJlbmNlQ29udGV4dDsKKwl9CisKKwlTdHJpbmcgYmFzaWNUb1N0cmluZyhpbnQgdGFiKSB7CisKKwkJU3RyaW5nIG5ld0xpbmUgPSAiXG4iOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSB0YWI7IC0taSA+PSAwOykKKwkJCW5ld0xpbmUgKz0gIlx0IjsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBzID0gbmV3TGluZSArICItLS0gTWV0aG9kIFNjb3BlIC0tLSI7IC8vJE5PTi1OTFMtMSQKKwkJbmV3TGluZSArPSAiXHQiOyAvLyROT04tTkxTLTEkCisJCXMgKz0gbmV3TGluZSArICJsb2NhbHM6IjsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsSW5kZXg7IGkrKykKKwkJCXMgKz0gbmV3TGluZSArICJcdCIgKyBsb2NhbHNbaV0udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorCQlzICs9IG5ld0xpbmUgKyAic3RhcnRJbmRleCA9ICIgKyBzdGFydEluZGV4OyAvLyROT04tTkxTLTEkCisJCXMgKz0gbmV3TGluZSArICJpc0NvbnN0cnVjdG9yQ2FsbCA9ICIgKyBpc0NvbnN0cnVjdG9yQ2FsbDsgLy8kTk9OLU5MUy0xJAorCQlzICs9IG5ld0xpbmUgKyAiZmllbGREZWNsYXJhdGlvbkluZGV4ID0gIiArIGZpZWxkRGVjbGFyYXRpb25JbmRleDsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1N2I4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDg3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RWZXJpZmllciBpbXBsZW1lbnRzIFRhZ0JpdHMsIFR5cGVDb25zdGFudHMgeworCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGU7CisJSGFzaHRhYmxlT2ZPYmplY3QgaW5oZXJpdGVkTWV0aG9kczsKKwlIYXNodGFibGVPZk9iamVjdCBjdXJyZW50TWV0aG9kczsKKwlSZWZlcmVuY2VCaW5kaW5nIHJ1bnRpbWVFeGNlcHRpb247CisJUmVmZXJlbmNlQmluZGluZyBlcnJvckV4Y2VwdGlvbjsKKy8qCitCaW5kaW5nIGNyZWF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgYWxsIHByb2JsZW1zIHdpdGggdHlwZXM6CisJLSBhbGwgbW9kaWZpZXIgcHJvYmxlbXMgKGR1cGxpY2F0ZXMgJiBtdWx0aXBsZSB2aXNpYmlsaXR5IG1vZGlmaWVycyArIGluY29tcGF0aWJsZSBjb21iaW5hdGlvbnMgLSBhYnN0cmFjdC9maW5hbCkKKwkJLSBwbHVzIGludmFsaWQgbW9kaWZpZXJzIGdpdmVuIHRoZSBjb250ZXh0ICh0aGUgdmVyaWZpZXIgZGlkIG5vdCBkbyB0aGlzIGJlZm9yZSkKKwktIHF1YWxpZmllZCBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBhIHR5cGUgYW5kIGEgcGFja2FnZSAodHlwZXMgaW4gZGVmYXVsdCBwYWNrYWdlcyBhcmUgZXhjbHVkZWQpCisJLSBhbGwgdHlwZSBoaWVyYXJjaHkgcHJvYmxlbXM6CisJCS0gY3ljbGVzIGluIHRoZSBzdXBlcmNsYXNzIG9yIHN1cGVyaW50ZXJmYWNlIGhpZXJhcmNoeQorCQktIGFuIGFtYmlndW91cywgaW52aXNpYmxlIG9yIG1pc3Npbmcgc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZQorCQktIGV4dGVuZGluZyBhIGZpbmFsIGNsYXNzCisJCS0gZXh0ZW5kaW5nIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MKKwkJLSBpbXBsZW1lbnRpbmcgYSBjbGFzcyBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZQorCQktIGltcGxlbWVudGluZyB0aGUgc2FtZSBpbnRlcmZhY2UgbW9yZSB0aGFuIG9uY2UgKGllLiBkdXBsaWNhdGUgaW50ZXJmYWNlcykKKwktIHdpdGggbmVzdGVkIHR5cGVzOgorCQktIHNoYWRvd2luZyBhbiBlbmNsb3NpbmcgdHlwZSdzIHNvdXJjZSBuYW1lCisJCS0gZGVmaW5pbmcgYSBzdGF0aWMgY2xhc3Mgb3IgaW50ZXJmYWNlIGluc2lkZSBhIG5vbi1zdGF0aWMgbmVzdGVkIGNsYXNzCisJCS0gZGVmaW5pbmcgYW4gaW50ZXJmYWNlIGFzIGEgbG9jYWwgdHlwZSAobG9jYWwgdHlwZXMgY2FuIG9ubHkgYmUgY2xhc3NlcykKKwordmVyaWZ5VHlwZVN0cnVjdHVyZQorCisJfCBoYXNIaWVyYXJjaHlQcm9ibGVtIHN1cGVyY2xhc3MgY3VycmVudCBuYW1lcyBpbnRlcmZhY2VzIGludGVyZmFjZXNCeUluZGVudGl0eSBkdXBsaWNhdGVFeGlzdHMgaW52YWxpZFR5cGUgfAorCisJKHR5cGUgYmFzaWNNb2RpZmllcnMgYW55TWFzazogQWNjTW9kaWZpZXJQcm9ibGVtIHwgQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSBpZlRydWU6IFsKKwkJc2VsZiByZXBvcnRNb2RpZmllclByb2JsZW1zT25UeXBlOiB0eXBlXS4KKworCXR5cGUgY29udHJvbGxlciBpc0phdmFEZWZhdWx0UGFja2FnZSBpZkZhbHNlOiBbCisJCShuYW1lRW52aXJvbm1lbnQgY2xhc3MgZG9lc1BhY2thZ2VFeGlzdE5hbWVkOiB0eXBlIGphdmFRdWFsaWZpZWROYW1lKSBpZlRydWU6IFsKKwkJCXByb2JsZW1TdW1tYXJ5CisJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0NvbGxpZGVzV2l0aFBhY2thZ2UKKwkJCQlhcmdzOiAoQXJyYXkgd2l0aDogdHlwZSBqYXZhUXVhbGlmaWVkTmFtZSkKKwkJCQlzZXZlcml0eTogbmlsCisJCQkJZm9yVHlwZTogdHlwZV1dLgorCisJaGFzSGllcmFyY2h5UHJvYmxlbSA6PSBmYWxzZS4KKworCXR5cGUgaXNKYXZhQ2xhc3MKKwkJaWZUcnVlOiBbCisJCQkoc3VwZXJjbGFzcyA6PSBzZWxmIHN1cGVyY2xhc3NGb3I6IHR5cGUpIH5+IG5pbCBpZlRydWU6IFsKKwkJCQlzdXBlcmNsYXNzIGlzQnVpbGRlckNsYXNzIGlmVHJ1ZTogWworCQkJCQlzdXBlcmNsYXNzIDo9IHN1cGVyY2xhc3MgbmV3Q2xhc3NdLgorCQkJCXN1cGVyY2xhc3MgaXNKYXZhTWlzc2luZworCQkJCQlpZlRydWU6IFsKKwkJCQkJCWhhc0hpZXJhcmNoeVByb2JsZW0gOj0gdHJ1ZS4KKwkJCQkJCXR5cGUgamF2YVN1cGVyY2xhc3NJc01pc3NpbmcgaWZUcnVlOiBbCisJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI01pc3NpbmdTdXBlcmNsYXNzCisJCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBzdXBlcmNsYXNzIGphdmFRdWFsaWZpZWROYW1lIHdpdGg6IHN1cGVyY2xhc3MgdW5tYXRjaGVkRGVzY3JpcHRvcikKKwkJCQkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQkJCQlmb3JUeXBlOiB0eXBlXS4KKwkJCQkJCXR5cGUgamF2YVN1cGVyY2xhc3NDcmVhdGVzQ3ljbGUgaWZUcnVlOiBbCisJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0N5Y2xpY1N1cGVyY2xhc3MKKwkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IHN1cGVyY2xhc3MgamF2YVF1YWxpZmllZE5hbWUpCisJCQkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCQkJZm9yVHlwZTogdHlwZV0uCisJCQkJCQl0eXBlIGphdmFTdXBlcmNsYXNzSXNJbnRlcmZhY2UgaWZUcnVlOiBbCisJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0NsYXNzQ2Fubm90RXh0ZW5kQW5JbnRlcmZhY2UKKwkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IHN1cGVyY2xhc3MgamF2YVF1YWxpZmllZE5hbWUpCisJCQkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCQkJZm9yVHlwZTogdHlwZV1dCisJCQkJCWlmRmFsc2U6IFsKKwkJCQkJCSJOT1RFOiAgSWYgdHlwZSBpcyBhIEphdmEgY2xhc3MgYW5kIGl0cyBzdXBlcmNsYXNzIGlzCisJCQkJCQlhIHZhbGlkIGRlc2NyaXB0b3IgdGhlbiBpdCBzaG91bGQgTkVWRVIgYmUgYW4gaW50ZXJmYWNlLiIKKworCQkJCQkJc3VwZXJjbGFzcyBpc0phdmFGaW5hbCBpZlRydWU6IFsKKwkJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzCisJCQkJCQkJCWFyZ3M6IG5pbAorCQkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJCWZvclR5cGU6IHR5cGVdXV1dCisJCWlmRmFsc2U6IFsKKwkJCXR5cGUgaXNKYXZhTG9jYWxUeXBlIGlmVHJ1ZTogWworCQkJCXByb2JsZW1TdW1tYXJ5CisJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNDYW5ub3REZWZpbmVMb2NhbEludGVyZmFjZQorCQkJCQlhcmdzOiBuaWwKKwkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQlmb3JUeXBlOiB0eXBlXV0uCisKKwl0eXBlIGlzSmF2YU5lc3RlZFR5cGUgaWZUcnVlOiBbCisJCShjdXJyZW50IDo9IHR5cGUpIHNvdXJjZU5hbWUgbm90RW1wdHkgaWZUcnVlOiBbCisJCQluYW1lcyA6PSBTZXQgbmV3LgorCQkJWyhjdXJyZW50IDo9IGN1cnJlbnQgZW5jbG9zaW5nVHlwZSkgfn4gbmlsXSB3aGlsZVRydWU6IFsKKwkJCQluYW1lcyBhZGQ6IGN1cnJlbnQgc291cmNlTmFtZV0uCisKKwkJCShuYW1lcyBpbmNsdWRlczogdHlwZSBzb3VyY2VOYW1lKSBpZlRydWU6IFsKKwkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjTmVzdGVkVHlwZUNhbm5vdFNoYWRvd1R5cGVOYW1lCisJCQkJCWFyZ3M6IG5pbAorCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCWZvclR5cGU6IHR5cGVdXS4KKworCQkodHlwZSBlbmNsb3NpbmdUeXBlIGlzSmF2YU5lc3RlZFR5cGUgYW5kOiBbdHlwZSBlbmNsb3NpbmdUeXBlIGlzSmF2YUNsYXNzXSkgaWZUcnVlOiBbCisJCQl0eXBlIGVuY2xvc2luZ1R5cGUgaXNKYXZhU3RhdGljIGlmRmFsc2U6IFsKKwkJCQl0eXBlIGlzSmF2YUNsYXNzCisJCQkJCWlmVHJ1ZTogWworCQkJCQkJdHlwZSBpc0phdmFTdGF0aWMgaWZUcnVlOiBbCisJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI1N0YXRpY0NsYXNzQ2Fubm90RXhpc3RJbk5lc3RlZENsYXNzCisJCQkJCQkJCWFyZ3M6IG5pbAorCQkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJCWZvclR5cGU6IHR5cGVdXQorCQkJCQlpZkZhbHNlOiBbCisJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbnRlcmZhY2VDYW5ub3RFeGlzdEluTmVzdGVkQ2xhc3MKKwkJCQkJCQlhcmdzOiBuaWwKKwkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJZm9yVHlwZTogdHlwZV1dXV0uCisKKwkoaW50ZXJmYWNlcyA6PSBuZXdDbGFzcyBzdXBlcmludGVyZmFjZXMpIG5vdEVtcHR5IGlmVHJ1ZTogWworCQlpbnRlcmZhY2VzQnlJbmRlbnRpdHkgOj0gaW50ZXJmYWNlcyBhc1NldC4KKwkJZHVwbGljYXRlRXhpc3RzIDo9IGludGVyZmFjZXMgc2l6ZSB+fiBpbnRlcmZhY2VzQnlJbmRlbnRpdHkgc2l6ZS4KKworCQlpbnRlcmZhY2VzQnlJbmRlbnRpdHkgZG86IFs6aW50ZXJmYWNlIHwKKwkJCWR1cGxpY2F0ZUV4aXN0cyBpZlRydWU6IFsKKwkJCQkoaW50ZXJmYWNlcyBvY2N1cnJlbmNlc09mOiBpbnRlcmZhY2UpID4gMSBpZlRydWU6IFsKKwkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbnRlcmZhY2VJc1NwZWNpZmllZE1vcmVUaGFuT25jZQorCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKKwkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCWZvclR5cGU6IHR5cGVdXS4KKworCQkJaW50ZXJmYWNlIGlzSmF2YU1pc3NpbmcgaWZUcnVlOiBbCisJCQkJaGFzSGllcmFyY2h5UHJvYmxlbSA6PSB0cnVlLgorCQkJCWludGVyZmFjZSBiYXNpY0NsYXNzID09IEphdmFJbnRlcmZhY2VJc0NsYXNzIGJhc2ljQ2xhc3MKKwkJCQkJaWZUcnVlOiBbCisJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNVc2luZ0NsYXNzV2hlcmVJbnRlcmZhY2VJc1JlcXVpcmVkCisJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKKwkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJZm9yVHlwZTogdHlwZV0KKwkJCQkJaWZGYWxzZTogWworCQkJCQkJaW50ZXJmYWNlIGJhc2ljQ2xhc3MgPT0gSmF2YU1pc3NpbmdJbnRlcmZhY2UgYmFzaWNDbGFzcworCQkJCQkJCWlmVHJ1ZTogWworCQkJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI01pc3NpbmdJbnRlcmZhY2UKKwkJCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBpbnRlcmZhY2UgamF2YVF1YWxpZmllZE5hbWUgd2l0aDogaW50ZXJmYWNlIHVubWF0Y2hlZERlc2NyaXB0b3IpCisJCQkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJCQlmb3JUeXBlOiB0eXBlXQorCQkJCQkJCWlmRmFsc2U6IFsKKwkJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNDeWNsaWNTdXBlcmludGVyZmFjZQorCQkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKKwkJCQkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCQkJCWZvclR5cGU6IHR5cGVdXV1dXS4KKworCWhhc0hpZXJhcmNoeVByb2JsZW0gaWZGYWxzZTogWworCQkiU2VhcmNoIHVwIHRoZSB0eXBlJ3MgaGllcmFyY2h5IGZvcgorCQkJMS4gbWlzc2luZyBzdXBlcmNsYXNzLAorCQkJMi4gc3VwZXJjbGFzcyBjeWNsZSwgb3IKKwkJCTMuIHN1cGVyY2xhc3MgaXMgaW50ZXJmYWNlLiIKKwkJKGludmFsaWRUeXBlIDo9IG5ld0NsYXNzIGZpbmRGaXJzdEludmFsaWRTdXBlcnR5cGVTa2lwcGluZzogRXNJZGVudGl0eVNldCBuZXcpIH5+IG5pbCBpZlRydWU6IFsKKwkJCXByb2JsZW1TdW1tYXJ5CisJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0hhc0hpZXJhcmNoeVByb2JsZW0KKwkJCQlhcmdzOiAoQXJyYXkgd2l0aDogaW52YWxpZFR5cGUgamF2YVJlYWRhYmxlTmFtZSkKKwkJCQlzZXZlcml0eTogbmlsCisJCQkJZm9yVHlwZTogdHlwZV1dCisKK3JlcG9ydE1vZGlmaWVyUHJvYmxlbXNPblR5cGU6IGFUeXBlCisKKwkodHlwZSBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pIGlmVHJ1ZTogWworCQkodHlwZSBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NNb2RpZmllclByb2JsZW0pCisJCQlpZlRydWU6IFsKKwkJCQlecHJvYmxlbVN1bW1hcnkKKwkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI09ubHlPbmVWaXNpYmlsaXR5TW9kaWZpZXJBbGxvd2VkCisJCQkJCWFyZ3M6IG5pbAorCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCWZvclR5cGU6IGFUeXBlXQorCQkJaWZGYWxzZTogWworCQkJCV5wcm9ibGVtU3VtbWFyeQorCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjRHVwbGljYXRlTW9kaWZpZXIKKwkJCQkJYXJnczogbmlsCisJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJZm9yVHlwZTogYVR5cGVdXS4KKworCXR5cGUgaXNKYXZhSW50ZXJmYWNlIGlmVHJ1ZTogWworCQlecHJvYmxlbVN1bW1hcnkKKwkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UKKwkJCWFyZ3M6IG5pbAorCQkJc2V2ZXJpdHk6IG5pbAorCQkJZm9yVHlwZTogYVR5cGVdLgorCisJKHR5cGUgYmFzaWNNb2RpZmllcnMgYWxsTWFzazogQWNjQWJzdHJhY3QgfCBBY2NGaW5hbCkgaWZUcnVlOiBbCisJCV5wcm9ibGVtU3VtbWFyeQorCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uQWJzdHJhY3RGaW5hbAorCQkJYXJnczogbmlsCisJCQlzZXZlcml0eTogbmlsCisJCQlmb3JUeXBlOiBhVHlwZV0uCisKKwlecHJvYmxlbVN1bW1hcnkKKwkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckZvckNsYXNzCisJCWFyZ3M6IG5pbAorCQlzZXZlcml0eTogbmlsCisJCWZvclR5cGU6IGFUeXBlCisKK3ZvaWQgcmVwb3J0TW9kaWZpZXJQcm9ibGVtcygpIHsKKwlpZiAodGhpcy50eXBlLmlzQWJzdHJhY3QoKSAmJiB0aGlzLnR5cGUuaXNGaW5hbCgpKQorCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkFic3RyYWN0RmluYWwodGhpcy50eXBlKTsKKworCS8vIFNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCBhbGwgMyBwcm9ibGVtcyBOT1QganVzdCAxCisJaWYgKCh0eXBlLm1vZGlmaWVycygpICYgTW9kaWZpZXJzLkFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgPT0gMCkgeworCQlpZiAodGhpcy50eXBlLmlzSW50ZXJmYWNlKCkpCisJCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UodGhpcy50eXBlKTsKKwkJZWxzZQorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuaWxsZWdhbE1vZGlmaWVyKHRoaXMudHlwZSk7CisJfSBlbHNlIHsKKwkJaWYgKCh0eXBlLm1vZGlmaWVycygpICYgTW9kaWZpZXJzLkFjY01vZGlmaWVyUHJvYmxlbSkgIT0gMCkKKwkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLm9ubHlPbmVWaXNpYmlsaXR5TW9kaWZpZXJBbGxvd2VkKHRoaXMudHlwZSk7CisJCWVsc2UKKwkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmR1cGxpY2F0ZU1vZGlmaWVyKHRoaXMudHlwZSk7CisJfQorfQorKi8KK3B1YmxpYyBNZXRob2RWZXJpZmllcihMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCXRoaXMudHlwZSA9IG51bGw7CQkvLyBJbml0aWFsaXplZCB3aXRoIHRoZSBwdWJsaWMgbWV0aG9kIHZlcmlmeShTb3VyY2VUeXBlQmluZGluZykKKwl0aGlzLmluaGVyaXRlZE1ldGhvZHMgPSBudWxsOworCXRoaXMuY3VycmVudE1ldGhvZHMgPSBudWxsOworCXRoaXMucnVudGltZUV4Y2VwdGlvbiA9IG51bGw7CisJdGhpcy5lcnJvckV4Y2VwdGlvbiA9IG51bGw7Cit9Citwcml2YXRlIHZvaWQgY2hlY2tBZ2FpbnN0SW5oZXJpdGVkTWV0aG9kcyhNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLCBpbnQgbGVuZ3RoKSB7CisJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7CisJCU1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJaWYgKGN1cnJlbnRNZXRob2QucmV0dXJuVHlwZSAhPSBpbmhlcml0ZWRNZXRob2QucmV0dXJuVHlwZSkgeworCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoY3VycmVudE1ldGhvZCkuaW5jb21wYXRpYmxlUmV0dXJuVHlwZShjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOworCQl9IGVsc2UgaWYgKGN1cnJlbnRNZXRob2QuaXNTdGF0aWMoKSAhPSBpbmhlcml0ZWRNZXRob2QuaXNTdGF0aWMoKSkJIHsJLy8gQ2Fubm90IG92ZXJyaWRlIGEgc3RhdGljIG1ldGhvZCBvciBoaWRlIGFuIGluc3RhbmNlIG1ldGhvZAorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoY3VycmVudE1ldGhvZCkuc3RhdGljQW5kSW5zdGFuY2VDb25mbGljdChjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOworCQl9IGVsc2UgeworCQkJaWYgKGN1cnJlbnRNZXRob2QudGhyb3duRXhjZXB0aW9ucyAhPSBOb0V4Y2VwdGlvbnMpCisJCQkJdGhpcy5jaGVja0V4Y2VwdGlvbnMoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKKwkJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNGaW5hbCgpKQorCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKGN1cnJlbnRNZXRob2QpLmZpbmFsTWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7CisJCQlpZiAoIXRoaXMuaXNBc1Zpc2libGUoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkKKwkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS52aXNpYmlsaXR5Q29uZmxpY3QoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKKwkJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkKKwkJCQlpZiAoIWN1cnJlbnRNZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkKKwkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoY3VycmVudE1ldGhvZCkub3ZlcnJpZGVzRGVwcmVjYXRlZE1ldGhvZChjdXJyZW50TWV0aG9kLCBpbmhlcml0ZWRNZXRob2QpOworCQl9CisJfQorfQorLyoKKyI4LjQuNCIKK1ZlcmlmeSB0aGF0IG5ld0V4Y2VwdGlvbnMgYXJlIGFsbCBpbmNsdWRlZCBpbiBpbmhlcml0ZWRFeGNlcHRpb25zLgorQXNzdW1lcyBhbGwgZXhjZXB0aW9ucyBhcmUgdmFsaWQgYW5kIHRocm93YWJsZS4KK1VuY2hlY2tlZCBleGNlcHRpb25zIChjb21wYXRpYmxlIHdpdGggcnVudGltZSAmIGVycm9yKSBhcmUgaWdub3JlZCAoc2VlIHRoZSBzcGVjIG9uIHBnLiAyMDMpLgorKi8KKworcHJpdmF0ZSB2b2lkIGNoZWNrRXhjZXB0aW9ucyhNZXRob2RCaW5kaW5nIG5ld01ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlSZWZlcmVuY2VCaW5kaW5nW10gbmV3RXhjZXB0aW9ucyA9IG5ld01ldGhvZC50aHJvd25FeGNlcHRpb25zOworCVJlZmVyZW5jZUJpbmRpbmdbXSBpbmhlcml0ZWRFeGNlcHRpb25zID0gaW5oZXJpdGVkTWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CisJZm9yIChpbnQgaSA9IG5ld0V4Y2VwdGlvbnMubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJUmVmZXJlbmNlQmluZGluZyBuZXdFeGNlcHRpb24gPSBuZXdFeGNlcHRpb25zW2ldOworCQlpbnQgaiA9IGluaGVyaXRlZEV4Y2VwdGlvbnMubGVuZ3RoOworCQl3aGlsZSAoLS1qID4gLTEgJiYgIXRoaXMuaXNTYW1lQ2xhc3NPclN1YmNsYXNzT2YobmV3RXhjZXB0aW9uLCBpbmhlcml0ZWRFeGNlcHRpb25zW2pdKSk7CisJCWlmIChqID09IC0xKQorCQkJaWYgKCEobmV3RXhjZXB0aW9uLmlzQ29tcGF0aWJsZVdpdGgodGhpcy5ydW50aW1lRXhjZXB0aW9uKCkpIHx8IG5ld0V4Y2VwdGlvbi5pc0NvbXBhdGlibGVXaXRoKHRoaXMuZXJyb3JFeGNlcHRpb24oKSkpKQorCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKG5ld01ldGhvZCkuaW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2UodGhpcy50eXBlLCBuZXdNZXRob2QsIGluaGVyaXRlZE1ldGhvZCwgbmV3RXhjZXB0aW9uKTsKKwl9Cit9Citwcml2YXRlIHZvaWQgY2hlY2tJbmhlcml0ZWRNZXRob2RzKE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzLCBpbnQgbGVuZ3RoKSB7CisJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSA9IG1ldGhvZHNbMF0ucmV0dXJuVHlwZTsKKwlpbnQgaW5kZXggPSBsZW5ndGg7CisJd2hpbGUgKCgtLWluZGV4ID4gMCkgJiYgKHJldHVyblR5cGUgPT0gbWV0aG9kc1tpbmRleF0ucmV0dXJuVHlwZSkpOworCWlmIChpbmRleCA+IDApIHsJCS8vIEFsbCBpbmhlcml0ZWQgbWV0aG9kcyBkbyBOT1QgaGF2ZSB0aGUgc2FtZSB2bVNpZ25hdHVyZQorCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZHNIYXZlSW5jb21wYXRpYmxlUmV0dXJuVHlwZXModGhpcy50eXBlLCBtZXRob2RzLCBsZW5ndGgpOworCQlyZXR1cm47CisJfQorCisJTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCA9IG51bGw7CisJaWYgKCF0eXBlLmlzSW50ZXJmYWNlKCkpeyAvLyBpZ25vcmUgY29uY3JldGUgbWV0aG9kcyBmb3IgaW50ZXJmYWNlcworCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspCQkvLyBSZW1lbWJlciB0aGF0IG9ubHkgb25lIG9mIHRoZSBtZXRob2RzIGNhbiBiZSBub24tYWJzdHJhY3QKKwkJCWlmICghbWV0aG9kc1tpXS5pc0Fic3RyYWN0KCkpIHsKKwkJCQljb25jcmV0ZU1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJfQorCWlmIChjb25jcmV0ZU1ldGhvZCA9PSBudWxsKSB7CisJCWlmICh0aGlzLnR5cGUuaXNDbGFzcygpICYmICF0aGlzLnR5cGUuaXNBYnN0cmFjdCgpKSB7CisJCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspCisJCQkJaWYgKCFtdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2QobWV0aG9kc1tpXSkpCisJCQkJCXJldHVybjsJCS8vIGluIHRoaXMgY2FzZSwgd2UgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIHByb2JsZW0gYWdhaW5zdCB0aGUgY29uY3JldGUgc3VwZXJjbGFzcworCisJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtaXNzaW5nQWJzdHJhY3RNZXRob2QgPSB0eXBlRGVjbGFyYXRpb24uYWRkTWlzc2luZ0Fic3RyYWN0TWV0aG9kRm9yKG1ldGhvZHNbMF0pOworCQkJCQltaXNzaW5nQWJzdHJhY3RNZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOworCQkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCisJTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2xlbmd0aCAtIDFdOworCWluZGV4ID0gMDsKKwlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChtZXRob2RzW2ldICE9IGNvbmNyZXRlTWV0aG9kKQorCQkJYWJzdHJhY3RNZXRob2RzW2luZGV4KytdID0gbWV0aG9kc1tpXTsKKworCS8vIFJlbWVtYmVyIHRoYXQgaW50ZXJmYWNlcyBjYW4gb25seSBkZWZpbmUgcHVibGljIGluc3RhbmNlIG1ldGhvZHMKKwlpZiAoY29uY3JldGVNZXRob2QuaXNTdGF0aWMoKSkKKwkJLy8gQ2Fubm90IGluaGVyaXQgYSBzdGF0aWMgbWV0aG9kIHdoaWNoIGlzIHNwZWNpZmllZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgYnkgYW4gaW50ZXJmYWNlCisJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljSW5oZXJpdGVkTWV0aG9kQ29uZmxpY3RzKHR5cGUsIGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZHMpOwkKKwlpZiAoIWNvbmNyZXRlTWV0aG9kLmlzUHVibGljKCkpCisJCS8vIENhbm5vdCByZWR1Y2UgdmlzaWJpbGl0eSBvZiBhIHB1YmxpYyBtZXRob2Qgc3BlY2lmaWVkIGJ5IGFuIGludGVyZmFjZQorCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KHR5cGUsIGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZHMpOworCWlmIChjb25jcmV0ZU1ldGhvZC50aHJvd25FeGNlcHRpb25zICE9IE5vRXhjZXB0aW9ucykKKwkJZm9yIChpbnQgaSA9IGFic3RyYWN0TWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCXRoaXMuY2hlY2tFeGNlcHRpb25zKGNvbmNyZXRlTWV0aG9kLCBhYnN0cmFjdE1ldGhvZHNbaV0pOworfQorLyoKK0ZvciBlYWNoIGluaGVyaXRlZCBtZXRob2QgaWRlbnRpZmllciAobWVzc2FnZSBwYXR0ZXJuIC0gdm0gc2lnbmF0dXJlIG1pbnVzIHRoZSByZXR1cm4gdHlwZSkKKwlpZiBjdXJyZW50IG1ldGhvZCBleGlzdHMKKwkJaWYgY3VycmVudCdzIHZtIHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBhbiBpbmhlcml0ZWQgc2lnbmF0dXJlIHRoZW4gY29tcGxhaW4gCisJCWVsc2UgY29tcGFyZSBjdXJyZW50J3MgZXhjZXB0aW9ucyAmIHZpc2liaWxpdHkgYWdhaW5zdCBlYWNoIGluaGVyaXRlZCBtZXRob2QKKwllbHNlCisJCWlmIGluaGVyaXRlZCBtZXRob2RzID0gMQorCQkJaWYgaW5oZXJpdGVkIGlzIGFic3RyYWN0ICYmIHR5cGUgaXMgTk9UIGFuIGludGVyZmFjZSBvciBhYnN0cmFjdCwgY29tcGxhaW4KKwkJZWxzZQorCQkJaWYgdm0gc2lnbmF0dXJlcyBkbyBub3QgbWF0Y2ggY29tcGxhaW4KKwkJCWVsc2UKKwkJCQlmaW5kIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBhbW9uZ3N0IHRoZSBhYnN0cmFjdCBtZXRob2RzIChjYW4gb25seSBiZSAxKQorCQkJCWlmIG9uZSBleGlzdHMgdGhlbgorCQkJCQlpdCBtdXN0IGJlIGEgcHVibGljIGluc3RhbmNlIG1ldGhvZAorCQkJCQljb21wYXJlIGNvbmNyZXRlJ3MgZXhjZXB0aW9ucyBhZ2FpbnN0IGVhY2ggYWJzdHJhY3QgbWV0aG9kCisJCQkJZWxzZQorCQkJCQljb21wbGFpbiBhYm91dCBtaXNzaW5nIGltcGxlbWVudGF0aW9uIG9ubHkgaWYgdHlwZSBpcyBOT1QgYW4gaW50ZXJmYWNlIG9yIGFic3RyYWN0CisqLworCitwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RzKCkgeworCWJvb2xlYW4gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyA9IHRoaXMudHlwZS5pc0NsYXNzKCkgJiYgIXRoaXMudHlwZS5pc0Fic3RyYWN0KCk7CisJY2hhcltdW10gbWV0aG9kU2VsZWN0b3JzID0gdGhpcy5pbmhlcml0ZWRNZXRob2RzLmtleVRhYmxlOworCWZvciAoaW50IHMgPSBtZXRob2RTZWxlY3RvcnMubGVuZ3RoOyAtLXMgPj0gMDspIHsKKwkJaWYgKG1ldGhvZFNlbGVjdG9yc1tzXSAhPSBudWxsKSB7CisJCQlNZXRob2RCaW5kaW5nW10gY3VycmVudCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuY3VycmVudE1ldGhvZHMuZ2V0KG1ldGhvZFNlbGVjdG9yc1tzXSk7CisJCQlNZXRob2RCaW5kaW5nW10gaW5oZXJpdGVkID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5pbmhlcml0ZWRNZXRob2RzLnZhbHVlVGFibGVbc107CisKKwkJCWludCBpbmRleCA9IC0xOworCQkJTWV0aG9kQmluZGluZ1tdIG1hdGNoaW5nSW5oZXJpdGVkID0gbmV3IE1ldGhvZEJpbmRpbmdbaW5oZXJpdGVkLmxlbmd0aF07CisJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aDEgPSBjdXJyZW50Lmxlbmd0aDsgaSA8IGxlbmd0aDE7IGkrKykgeworCQkJCQl3aGlsZSAoaW5kZXggPj0gMCkgbWF0Y2hpbmdJbmhlcml0ZWRbaW5kZXgtLV0gPSBudWxsOyAvLyBjbGVhciB0aGUgcHJldmlvdXMgY29udGVudHMgb2YgdGhlIG1hdGNoaW5nIG1ldGhvZHMKKwkJCQkJTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kID0gY3VycmVudFtpXTsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBpbmhlcml0ZWQubGVuZ3RoOyBqIDwgbGVuZ3RoMjsgaisrKSB7CisJCQkJCQlpZiAoaW5oZXJpdGVkW2pdICE9IG51bGwgJiYgY3VycmVudE1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwoaW5oZXJpdGVkW2pdKSkgeworCQkJCQkJCW1hdGNoaW5nSW5oZXJpdGVkWysraW5kZXhdID0gaW5oZXJpdGVkW2pdOworCQkJCQkJCWluaGVyaXRlZFtqXSA9IG51bGw7IC8vIGRvIG5vdCB3YW50IHRvIGZpbmQgaXQgYWdhaW4KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoaW5kZXggPj0gMCkKKwkJCQkJCXRoaXMuY2hlY2tBZ2FpbnN0SW5oZXJpdGVkTWV0aG9kcyhjdXJyZW50TWV0aG9kLCBtYXRjaGluZ0luaGVyaXRlZCwgaW5kZXggKyAxKTsgLy8gcGFzcyBpbiB0aGUgbGVuZ3RoIG9mIG1hdGNoaW5nCisJCQkJfQorCQkJfQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluaGVyaXRlZC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCXdoaWxlIChpbmRleCA+PSAwKSBtYXRjaGluZ0luaGVyaXRlZFtpbmRleC0tXSA9IG51bGw7IC8vIGNsZWFyIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiB0aGUgbWF0Y2hpbmcgbWV0aG9kcworCQkJCWlmIChpbmhlcml0ZWRbaV0gIT0gbnVsbCkgeworCQkJCQltYXRjaGluZ0luaGVyaXRlZFsrK2luZGV4XSA9IGluaGVyaXRlZFtpXTsKKwkJCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJCWlmIChpbmhlcml0ZWRbal0gIT0gbnVsbCAmJiBpbmhlcml0ZWRbaV0uYXJlUGFyYW1ldGVyc0VxdWFsKGluaGVyaXRlZFtqXSkpIHsKKwkJCQkJCQltYXRjaGluZ0luaGVyaXRlZFsrK2luZGV4XSA9IGluaGVyaXRlZFtqXTsKKwkJCQkJCQlpbmhlcml0ZWRbal0gPSBudWxsOyAvLyBkbyBub3Qgd2FudCB0byBmaW5kIGl0IGFnYWluCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGluZGV4ID4gMCkgeworCQkJCQl0aGlzLmNoZWNrSW5oZXJpdGVkTWV0aG9kcyhtYXRjaGluZ0luaGVyaXRlZCwgaW5kZXggKyAxKTsgLy8gcGFzcyBpbiB0aGUgbGVuZ3RoIG9mIG1hdGNoaW5nCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZHMgJiYgaW5kZXggPT0gMCAmJiBtYXRjaGluZ0luaGVyaXRlZFswXS5pc0Fic3RyYWN0KCkpCisJCQkJCQlpZiAobXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kKG1hdGNoaW5nSW5oZXJpdGVkWzBdKSkgeworCQkJCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLnR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCQkJCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWlzc2luZ0Fic3RyYWN0TWV0aG9kID0gdHlwZURlY2xhcmF0aW9uLmFkZE1pc3NpbmdBYnN0cmFjdE1ldGhvZEZvcihtYXRjaGluZ0luaGVyaXRlZFswXSk7CisJCQkJCQkJCW1pc3NpbmdBYnN0cmFjdE1ldGhvZC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKHRoaXMudHlwZSwgbWF0Y2hpbmdJbmhlcml0ZWRbMF0pOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1hdGNoaW5nSW5oZXJpdGVkWzBdKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorLyoKK0JpbmRpbmcgY3JlYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZzoKKwktIGFsbCBtb2RpZmllciBwcm9ibGVtcyAoZHVwbGljYXRlcyAmIG11bHRpcGxlIHZpc2liaWxpdHkgbW9kaWZpZXJzICsgaW5jb21wYXRpYmxlIGNvbWJpbmF0aW9ucykKKwkJLSBwbHVzIGludmFsaWQgbW9kaWZpZXJzIGdpdmVuIHRoZSBjb250ZXh0Li4uIGV4YW1wbGVzOgorCQkJLSBpbnRlcmZhY2UgbWV0aG9kcyBjYW4gb25seSBiZSBwdWJsaWMKKwkJCS0gYWJzdHJhY3QgbWV0aG9kcyBjYW4gb25seSBiZSBkZWZpbmVkIGJ5IGFic3RyYWN0IGNsYXNzZXMKKwktIGNvbGxpc2lvbnMuLi4gMiBtZXRob2RzIHdpdGggaWRlbnRpY2FsIHZtU2VsZWN0b3JzCisJLSBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbWVzc2FnZSBwYXR0ZXJuIGJ1dCBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzCisJLSBhbWJpZ3VvdXMsIGludmlzaWJsZSBvciBtaXNzaW5nIHJldHVybi9hcmd1bWVudC9leGNlcHRpb24gdHlwZXMKKwktIGNoZWNrIHRoZSB0eXBlIG9mIGFueSBhcnJheSBpcyBub3Qgdm9pZAorCS0gY2hlY2sgdGhhdCBlYWNoIGV4Y2VwdGlvbiB0eXBlIGlzIFRocm93YWJsZSBvciBhIHN1YmNsYXNzIG9mIGl0CisqLworcHJpdmF0ZSB2b2lkIGNvbXB1dGVJbmhlcml0ZWRNZXRob2RzKCkgeworCXRoaXMuaW5oZXJpdGVkTWV0aG9kcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCg1MSk7IC8vIG1hcHMgbWV0aG9kIHNlbGVjdG9ycyB0byBhbiBhcnJheSBvZiBtZXRob2RzLi4uIG11c3Qgc2VhcmNoIHRvIG1hdGNoIHBhcmFtYXRlcnMgJiByZXR1cm4gdHlwZQorCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKwlpbnQgbGFzdFBvc2l0aW9uID0gMDsKKwlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gdHlwZS5zdXBlckludGVyZmFjZXMoKTsKKworCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlOworCWlmICh0aGlzLnR5cGUuaXNDbGFzcygpKSB7CisJCXN1cGVyVHlwZSA9IHRoaXMudHlwZS5zdXBlcmNsYXNzKCk7CisJfSBlbHNlIHsgLy8gY2hlY2sgaW50ZXJmYWNlIG1ldGhvZHMgYWdhaW5zdCBPYmplY3QKKwkJc3VwZXJUeXBlID0gdGhpcy50eXBlLnNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJfQorCU1ldGhvZEJpbmRpbmdbXSBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHMgPSBudWxsOworCWludCBub25WaXNpYmxlQ291bnQgPSAwOworCisJd2hpbGUgKHN1cGVyVHlwZSAhPSBudWxsKSB7CisJCWlmIChzdXBlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBzdXBlclR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsKKwkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsKKwkJCX0KKworCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBzdXBlclR5cGUubWV0aG9kcygpOworCQkJbmV4dE1ldGhvZCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQkJCWlmICghKG1ldGhvZC5pc1ByaXZhdGUoKSB8fCBtZXRob2QuaXNDb25zdHJ1Y3RvcigpIHx8IG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKSkgeyAvLyBsb29rIGF0IGFsbCBtZXRob2RzIHdoaWNoIGFyZSBOT1QgcHJpdmF0ZSBvciBjb25zdHJ1Y3RvcnMgb3IgZGVmYXVsdCBhYnN0cmFjdAorCQkJCQlNZXRob2RCaW5kaW5nW10gZXhpc3RpbmdNZXRob2RzID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5pbmhlcml0ZWRNZXRob2RzLmdldChtZXRob2Quc2VsZWN0b3IpOworCQkJCQlpZiAoZXhpc3RpbmdNZXRob2RzICE9IG51bGwpCisJCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZXhpc3RpbmdNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCQkJCWlmIChtZXRob2QucmV0dXJuVHlwZSA9PSBleGlzdGluZ01ldGhvZHNbaV0ucmV0dXJuVHlwZSkKKwkJCQkJCQkJaWYgKG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhpc3RpbmdNZXRob2RzW2ldKSkKKwkJCQkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQkJCWlmIChub25WaXNpYmxlRGVmYXVsdE1ldGhvZHMgIT0gbnVsbCkKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uVmlzaWJsZUNvdW50OyBpKyspCisJCQkJCQkJaWYgKG1ldGhvZC5yZXR1cm5UeXBlID09IG5vblZpc2libGVEZWZhdWx0TWV0aG9kc1tpXS5yZXR1cm5UeXBlKQorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHNbaV0uc2VsZWN0b3IpKQorCQkJCQkJCQkJaWYgKG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwobm9uVmlzaWJsZURlZmF1bHRNZXRob2RzW2ldKSkKKwkJCQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCisJCQkJCWlmICghKG1ldGhvZC5pc0RlZmF1bHQoKSAmJiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpKSkgeyAvLyBpZ25vcmUgbWV0aG9kcyB3aGljaCBoYXZlIGRlZmF1bHQgdmlzaWJpbGl0eSBhbmQgYXJlIE5PVCBkZWZpbmVkIGluIGFub3RoZXIgcGFja2FnZQorCQkJCQkJaWYgKGV4aXN0aW5nTWV0aG9kcyA9PSBudWxsKQorCQkJCQkJCWV4aXN0aW5nTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nWzFdOworCQkJCQkJZWxzZQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdNZXRob2RzLCAwLAorCQkJCQkJCQkoZXhpc3RpbmdNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbZXhpc3RpbmdNZXRob2RzLmxlbmd0aCArIDFdKSwgMCwgZXhpc3RpbmdNZXRob2RzLmxlbmd0aCAtIDEpOworCQkJCQkJZXhpc3RpbmdNZXRob2RzW2V4aXN0aW5nTWV0aG9kcy5sZW5ndGggLSAxXSA9IG1ldGhvZDsKKwkJCQkJCXRoaXMuaW5oZXJpdGVkTWV0aG9kcy5wdXQobWV0aG9kLnNlbGVjdG9yLCBleGlzdGluZ01ldGhvZHMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKG5vblZpc2libGVEZWZhdWx0TWV0aG9kcyA9PSBudWxsKQorCQkJCQkJCW5vblZpc2libGVEZWZhdWx0TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nWzEwXTsKKwkJCQkJCWVsc2UgaWYgKG5vblZpc2libGVDb3VudCA9PSBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHMubGVuZ3RoKQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobm9uVmlzaWJsZURlZmF1bHRNZXRob2RzLCAwLAorCQkJCQkJCQkobm9uVmlzaWJsZURlZmF1bHRNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbm9uVmlzaWJsZUNvdW50ICogMl0pLCAwLCBub25WaXNpYmxlQ291bnQpOworCQkJCQkJbm9uVmlzaWJsZURlZmF1bHRNZXRob2RzW25vblZpc2libGVDb3VudCsrXSA9IG1ldGhvZDsKKworCQkJCQkJaWYgKG1ldGhvZC5pc0Fic3RyYWN0KCkgJiYgIXRoaXMudHlwZS5pc0Fic3RyYWN0KCkpIC8vIG5vbiB2aXNpYmxlIGFic3RyYWN0IG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4gc28gdGhlIHR5cGUgbXVzdCBiZSBkZWZpbmVkIGFic3RyYWN0CisJCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZENhbm5vdEJlT3ZlcnJpZGRlbih0aGlzLnR5cGUsIG1ldGhvZCk7CisKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50ID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5jdXJyZW50TWV0aG9kcy5nZXQobWV0aG9kLnNlbGVjdG9yKTsKKwkJCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsgLy8gbm9uIHZpc2libGUgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBzbyBhIHdhcm5pbmcgaXMgaXNzdWVkCisJCQkJCQkJZm91bmRNYXRjaCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjdXJyZW50Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJCWlmIChtZXRob2QucmV0dXJuVHlwZSA9PSBjdXJyZW50W2ldLnJldHVyblR5cGUpIHsKKwkJCQkJCQkJCWlmIChtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKGN1cnJlbnRbaV0pKSB7CisJCQkJCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5vdmVycmlkZXNQYWNrYWdlRGVmYXVsdE1ldGhvZChjdXJyZW50W2ldLCBtZXRob2QpOworCQkJCQkJCQkJCWJyZWFrIGZvdW5kTWF0Y2g7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzdXBlclR5cGUgPSBzdXBlclR5cGUuc3VwZXJjbGFzcygpOworCQl9CisJfQorCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCXN1cGVyVHlwZSA9IGludGVyZmFjZXNbal07CisJCQlpZiAoKHN1cGVyVHlwZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeworCQkJCXN1cGVyVHlwZS50YWdCaXRzIHw9IEludGVyZmFjZVZpc2l0ZWQ7CisJCQkJaWYgKHN1cGVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gc3VwZXJUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7CisJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsKKwkJCQkJfQorCisJCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gc3VwZXJUeXBlLm1ldGhvZHMoKTsKKwkJCQkJZm9yIChpbnQgbSA9IG1ldGhvZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsgLy8gSW50ZXJmYWNlIG1ldGhvZHMgYXJlIGFsbCBhYnN0cmFjdCBwdWJsaWMKKwkJCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBleGlzdGluZ01ldGhvZHMgPSAoTWV0aG9kQmluZGluZ1tdKSB0aGlzLmluaGVyaXRlZE1ldGhvZHMuZ2V0KG1ldGhvZC5zZWxlY3Rvcik7CisJCQkJCQlpZiAoZXhpc3RpbmdNZXRob2RzID09IG51bGwpCisJCQkJCQkJZXhpc3RpbmdNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbMV07CisJCQkJCQllbHNlCisJCQkJCQkJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ01ldGhvZHMsIDAsCisJCQkJCQkJCShleGlzdGluZ01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tleGlzdGluZ01ldGhvZHMubGVuZ3RoICsgMV0pLCAwLCBleGlzdGluZ01ldGhvZHMubGVuZ3RoIC0gMSk7CisJCQkJCQlleGlzdGluZ01ldGhvZHNbZXhpc3RpbmdNZXRob2RzLmxlbmd0aCAtIDFdID0gbWV0aG9kOworCQkJCQkJdGhpcy5pbmhlcml0ZWRNZXRob2RzLnB1dChtZXRob2Quc2VsZWN0b3IsIGV4aXN0aW5nTWV0aG9kcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBiaXQgcmVpbml0aWFsaXphdGlvbgorCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKQorCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOworCX0KK30KKy8qCitjb21wdXRlSW5oZXJpdGVkTWV0aG9kTWVtYmVycworCisJIjguNC42LjQiCisJIkNvbXB1dGUgYWxsIG9mIHRoZSBtZW1iZXJzIGZvciB0aGUgdHlwZSB0aGF0IGFyZSBpbmhlcml0ZWQgZnJvbSBpdHMgc3VwZXJ0eXBlcy4KKwkJVGhpcyBpbmNsdWRlczoKKwkJCUFsbCBvZiB0aGUgbWV0aG9kcyBpbXBsZW1lbnRlZCBpbiB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeSB0aGF0IGFyZSBub3Qgb3ZlcnJpZGRlbi4KKwkJCVBST0JMRU06ICBDdXJyZW50bHkgd2UgZG8gbm90IHJlbW92ZSBvdmVycmlkZGVuIG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoaWVyYXJjaHkuCisJCQlUaGlzIGNvdWxkIGNhdXNlIGEgbm9uLWV4aXN0ZW50IGV4Y2VwdGlvbiBlcnJvciB0byBiZSBkZXRlY3RlZC4iCisKKwl8IHN1cGVydHlwZSBhbGxTdXBlcmludGVyZmFjZXMgbWV0aG9kc1NlZW4gaW50ZXJmYWNlc1NlZW4gfAorCWluaGVyaXRlZE1ldGhvZE1lbWJlcnMgOj0gTG9va3VwVGFibGUgbmV3OiA1MC4KKwlhbGxTdXBlcmludGVyZmFjZXMgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LgorCisJdHlwZSBpc0phdmFDbGFzcyBpZlRydWU6IFsKKwkJc3VwZXJ0eXBlIDo9IHR5cGUuCisJCW1ldGhvZHNTZWVuIDo9IEVzSWRlbnRpdHlTZXQgbmV3OiAyMC4KKwkJWyhzdXBlcnR5cGUgOj0gc2VsZiBzdXBlcmNsYXNzRm9yOiBzdXBlcnR5cGUpID09IG5pbF0gd2hpbGVGYWxzZTogWworCQkJKHN1cGVydHlwZSBpc0J1aWxkZXJDbGFzcyBvcjogW3N1cGVydHlwZSBpc1ZhbGlkRGVzY3JpcHRvcl0pIGlmVHJ1ZTogWworCQkJCWFsbFN1cGVyaW50ZXJmYWNlcyBhZGRBbGw6IChzZWxmIHN1cGVyaW50ZXJmYWNlc0Zvcjogc3VwZXJ0eXBlKS4KKwkJCQlzdXBlcnR5cGUgamF2YVVzZXJEZWZpbmVkTWV0aG9kc0RvOiBbOm1ldGhvZCB8CisJCQkJCShtZXRob2QgaXNKYXZhUHJpdmF0ZSBvcjogW21ldGhvZCBpc0phdmFDb25zdHJ1Y3Rvcl0pIGlmRmFsc2U6IFsKKwkJCQkJCShtZXRob2QgaXNKYXZhRGVmYXVsdCBhbmQ6IFttZXRob2QgZGVjbGFyaW5nQ2xhc3MgcGFja2FnZSBzeW1ib2wgfj0gdHlwZSBwYWNrYWdlIHN5bWJvbF0pIGlmRmFsc2U6IFsKKwkJCQkJCQkobWV0aG9kc1NlZW4gaW5jbHVkZXM6IG1ldGhvZCBzZWxlY3RvcikgaWZGYWxzZTogWworCQkJCQkJCQltZXRob2RzU2VlbiBhZGQ6IG1ldGhvZCBzZWxlY3Rvci4KKwkJCQkJCQkJKGluaGVyaXRlZE1ldGhvZE1lbWJlcnMKKwkJCQkJCQkJCWF0OiAoc2VsZiBtZXRob2RTaWduYXR1cmVGb3I6IG1ldGhvZCBzZWxlY3RvcikKKwkJCQkJCQkJCWlmQWJzZW50UHV0OiBbT3JkZXJlZENvbGxlY3Rpb24gbmV3OiAzXSkKKwkJCQkJCQkJCQlhZGQ6IG1ldGhvZF1dXV1dXV0uCisKKwlhbGxTdXBlcmludGVyZmFjZXMgYWRkQWxsOiAoc2VsZiBzdXBlcmludGVyZmFjZXNGb3I6IHR5cGUpLgorCWludGVyZmFjZXNTZWVuIDo9IEVzSWRlbnRpdHlTZXQgbmV3OiBhbGxTdXBlcmludGVyZmFjZXMgc2l6ZSAqIDIuCisJW2FsbFN1cGVyaW50ZXJmYWNlcyBub3RFbXB0eV0gd2hpbGVUcnVlOiBbCisJCXN1cGVydHlwZSA6PSBhbGxTdXBlcmludGVyZmFjZXMgcmVtb3ZlRmlyc3QuCisJCShpbnRlcmZhY2VzU2VlbiBpbmNsdWRlczogc3VwZXJ0eXBlKSBpZkZhbHNlOiBbCisJCQlpbnRlcmZhY2VzU2VlbiBhZGQ6IHN1cGVydHlwZS4KKwkJCShzdXBlcnR5cGUgaXNCdWlsZGVyQ2xhc3Mgb3I6IFtzdXBlcnR5cGUgaXNWYWxpZERlc2NyaXB0b3JdKSBpZlRydWU6IFsKKwkJCQlhbGxTdXBlcmludGVyZmFjZXMgYWRkQWxsOiAoc2VsZiBzdXBlcmludGVyZmFjZXNGb3I6IHN1cGVydHlwZSkuCisJCQkJc3VwZXJ0eXBlIGphdmFVc2VyRGVmaW5lZE1ldGhvZHNEbzogWzptZXRob2QgfAkJIkludGVyZmFjZSBtZXRob2RzIGFyZSBhbGwgYWJzdHJhY3QgcHVibGljLiIKKwkJCQkJKGluaGVyaXRlZE1ldGhvZE1lbWJlcnMKKwkJCQkJCWF0OiAoc2VsZiBtZXRob2RTaWduYXR1cmVGb3I6IG1ldGhvZCBzZWxlY3RvcikKKwkJCQkJCWlmQWJzZW50UHV0OiBbT3JkZXJlZENvbGxlY3Rpb24gbmV3OiAzXSkKKwkJCQkJCQlhZGQ6IG1ldGhvZF1dXV0KKyovCitwcml2YXRlIHZvaWQgY29tcHV0ZU1ldGhvZHMoKSB7CisJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSB0eXBlLm1ldGhvZHMoKTsKKwlpbnQgc2l6ZSA9IG1ldGhvZHMubGVuZ3RoOworCXRoaXMuY3VycmVudE1ldGhvZHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3Qoc2l6ZSA9PSAwID8gMSA6IHNpemUpOyAvLyBtYXBzIG1ldGhvZCBzZWxlY3RvcnMgdG8gYW4gYXJyYXkgb2YgbWV0aG9kcy4uLiBtdXN0IHNlYXJjaCB0byBtYXRjaCBwYXJhbWF0ZXJzICYgcmV0dXJuIHR5cGUKKwlmb3IgKGludCBtID0gc2l6ZTsgLS1tID49IDA7KSB7CisJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJaWYgKCEobWV0aG9kLmlzQ29uc3RydWN0b3IoKSB8fCBtZXRob2QuaXNEZWZhdWx0QWJzdHJhY3QoKSkpIHsgLy8ga2VlcCBhbGwgbWV0aG9kcyB3aGljaCBhcmUgTk9UIGNvbnN0cnVjdG9ycyBvciBkZWZhdWx0IGFic3RyYWN0CisJCQlNZXRob2RCaW5kaW5nW10gZXhpc3RpbmdNZXRob2RzID0gKE1ldGhvZEJpbmRpbmdbXSkgdGhpcy5jdXJyZW50TWV0aG9kcy5nZXQobWV0aG9kLnNlbGVjdG9yKTsKKwkJCWlmIChleGlzdGluZ01ldGhvZHMgPT0gbnVsbCkKKwkJCQlleGlzdGluZ01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1sxXTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4aXN0aW5nTWV0aG9kcywgMCwKKwkJCQkJKGV4aXN0aW5nTWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW2V4aXN0aW5nTWV0aG9kcy5sZW5ndGggKyAxXSksIDAsIGV4aXN0aW5nTWV0aG9kcy5sZW5ndGggLSAxKTsKKwkJCWV4aXN0aW5nTWV0aG9kc1tleGlzdGluZ01ldGhvZHMubGVuZ3RoIC0gMV0gPSBtZXRob2Q7CisJCQl0aGlzLmN1cnJlbnRNZXRob2RzLnB1dChtZXRob2Quc2VsZWN0b3IsIGV4aXN0aW5nTWV0aG9kcyk7CisJCX0KKwl9Cit9Citwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmcgZXJyb3JFeGNlcHRpb24oKSB7CisJaWYgKGVycm9yRXhjZXB0aW9uID09IG51bGwpCisJCXRoaXMuZXJyb3JFeGNlcHRpb24gPSB0aGlzLnR5cGUuc2NvcGUuZ2V0SmF2YUxhbmdFcnJvcigpOworCXJldHVybiBlcnJvckV4Y2VwdGlvbjsKK30KK3ByaXZhdGUgYm9vbGVhbiBpc0FzVmlzaWJsZShNZXRob2RCaW5kaW5nIG5ld01ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwlpZiAoaW5oZXJpdGVkTWV0aG9kLm1vZGlmaWVycyA9PSBuZXdNZXRob2QubW9kaWZpZXJzKSByZXR1cm4gdHJ1ZTsKKworCWlmIChuZXdNZXRob2QuaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CQkvLyBDb3ZlcnMgZXZlcnl0aGluZworCWlmIChpbmhlcml0ZWRNZXRob2QuaXNQdWJsaWMoKSkgcmV0dXJuIGZhbHNlOworCisJaWYgKG5ld01ldGhvZC5pc1Byb3RlY3RlZCgpKSByZXR1cm4gdHJ1ZTsKKwlpZiAoaW5oZXJpdGVkTWV0aG9kLmlzUHJvdGVjdGVkKCkpIHJldHVybiBmYWxzZTsKKworCXJldHVybiAhbmV3TWV0aG9kLmlzUHJpdmF0ZSgpOwkJLy8gVGhlIGluaGVyaXRlZE1ldGhvZCBjYW5ub3QgYmUgcHJpdmF0ZSBzaW5jZSBpdCB3b3VsZCBub3QgYmUgdmlzaWJsZQorfQorcHJpdmF0ZSBib29sZWFuIGlzU2FtZUNsYXNzT3JTdWJjbGFzc09mKFJlZmVyZW5jZUJpbmRpbmcgdGVzdENsYXNzLCBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MpIHsKKwlkbyB7CisJCWlmICh0ZXN0Q2xhc3MgPT0gc3VwZXJjbGFzcykgcmV0dXJuIHRydWU7CisJfSB3aGlsZSAoKHRlc3RDbGFzcyA9IHRlc3RDbGFzcy5zdXBlcmNsYXNzKCkpICE9IG51bGwpOworCXJldHVybiBmYWxzZTsKK30KK3ByaXZhdGUgYm9vbGVhbiBtdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2QoTWV0aG9kQmluZGluZyBhYnN0cmFjdE1ldGhvZCkgeworCS8vIGlmIHRoZSB0eXBlJ3Mgc3VwZXJjbGFzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcywgdGhlbiBhbGwgYWJzdHJhY3QgbWV0aG9kcyBtdXN0IGJlIGltcGxlbWVudGVkCisJLy8gb3RoZXJ3aXNlLCBza2lwIGl0IGlmIHRoZSB0eXBlJ3Mgc3VwZXJjbGFzcyBtdXN0IGltcGxlbWVudCBhbnkgb2YgdGhlIGluaGVyaXRlZCBtZXRob2RzCisJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gdGhpcy50eXBlLnN1cGVyY2xhc3MoKTsKKwlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3M7CisJaWYgKGRlY2xhcmluZ0NsYXNzLmlzQ2xhc3MoKSkgeworCQl3aGlsZSAoc3VwZXJjbGFzcy5pc0Fic3RyYWN0KCkgJiYgc3VwZXJjbGFzcyAhPSBkZWNsYXJpbmdDbGFzcykKKwkJCXN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLnN1cGVyY2xhc3MoKTsgLy8gZmluZCB0aGUgZmlyc3QgY29uY3JldGUgc3VwZXJjbGFzcyBvciB0aGUgYWJzdHJhY3QgZGVjbGFyaW5nQ2xhc3MKKwl9IGVsc2UgeworCQlpZiAodGhpcy50eXBlLmltcGxlbWVudHNJbnRlcmZhY2UoZGVjbGFyaW5nQ2xhc3MsIGZhbHNlKSkKKwkJCXJldHVybiAhdGhpcy50eXBlLmlzQWJzdHJhY3QoKTsKKwkJd2hpbGUgKHN1cGVyY2xhc3MuaXNBYnN0cmFjdCgpICYmICFzdXBlcmNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UoZGVjbGFyaW5nQ2xhc3MsIGZhbHNlKSkKKwkJCXN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLnN1cGVyY2xhc3MoKTsgLy8gZmluZCB0aGUgZmlyc3QgY29uY3JldGUgc3VwZXJjbGFzcyBvciB0aGUgc3VwZXJjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UKKwl9CisJcmV0dXJuIHN1cGVyY2xhc3MuaXNBYnN0cmFjdCgpOwkJLy8gaWYgaXQgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGVuIHdlIGhhdmUgYWxyZWFkeSByZXBvcnRlZCBwcm9ibGVtIGFnYWluc3QgaXQKK30KK3ByaXZhdGUgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcigpIHsKKwlyZXR1cm4gdGhpcy50eXBlLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpOworfQorcHJpdmF0ZSBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCkgeworCVByb2JsZW1SZXBvcnRlciByZXBvcnRlciA9IHByb2JsZW1SZXBvcnRlcigpOworCWlmIChjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzID09IHR5cGUpCS8vIG9ubHkgcmVwb3J0IGFnYWluc3QgdGhlIGN1cnJlbnRNZXRob2QgaWYgaXRzIGltcGxlbWVudGVkIGJ5IHRoZSB0eXBlCisJCXJlcG9ydGVyLnJlZmVyZW5jZUNvbnRleHQgPSBjdXJyZW50TWV0aG9kLnNvdXJjZU1ldGhvZCgpOworCXJldHVybiByZXBvcnRlcjsKK30KK3ByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBydW50aW1lRXhjZXB0aW9uKCkgeworCWlmIChydW50aW1lRXhjZXB0aW9uID09IG51bGwpCisJCXRoaXMucnVudGltZUV4Y2VwdGlvbiA9IHRoaXMudHlwZS5zY29wZS5nZXRKYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24oKTsKKwlyZXR1cm4gcnVudGltZUV4Y2VwdGlvbjsKK30KK3B1YmxpYyB2b2lkIHZlcmlmeShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy50eXBlID0gdHlwZTsKKwl0aGlzLmNvbXB1dGVNZXRob2RzKCk7CisJdGhpcy5jb21wdXRlSW5oZXJpdGVkTWV0aG9kcygpOworCXRoaXMuY2hlY2tNZXRob2RzKCk7Cit9Citwcml2YXRlIHZvaWQgenpGaWVsZFByb2JsZW1zKCkgeworfQorLyoKK0JpbmRpbmcgY3JlYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyBhbGwgcHJvYmxlbXMgd2l0aCBmaWVsZHM6CisJLSBhbGwgbW9kaWZpZXIgcHJvYmxlbXMgKGR1cGxpY2F0ZXMgJiBtdWx0aXBsZSB2aXNpYmlsaXR5IG1vZGlmaWVycyArIGluY29tcGF0aWJsZSBjb21iaW5hdGlvbnMgLSBmaW5hbC92b2xhdGlsZSkKKwkJLSBwbHVzIGludmFsaWQgbW9kaWZpZXJzIGdpdmVuIHRoZSBjb250ZXh0ICh0aGUgdmVyaWZpZXIgZGlkIG5vdCBkbyB0aGlzIGJlZm9yZSkKKwkJLSBpbmNsdWRlIGluaXRpYWxpemVycyBpbiB0aGUgbW9kaWZpZXIgY2hlY2tzIGV2ZW4gdGhvdWdoIGJpbmRpbmdzIGFyZSBub3QgY3JlYXRlZAorCS0gY29sbGlzaW9ucy4uLiAyIGZpZWxkcyB3aXRoIHNhbWUgbmFtZQorCS0gaW50ZXJmYWNlcyBjYW5ub3QgZGVmaW5lIGluaXRpYWxpemVycworCS0gbmVzdGVkIHR5cGVzIGNhbm5vdCBkZWZpbmUgc3RhdGljIGZpZWxkcworCS0gd2l0aCB0aGUgdHlwZSBvZiB0aGUgZmllbGQ6CisJCS0gdm9pZCBpcyBub3QgYSB2YWxpZCB0eXBlIChvciBmb3IgYW4gYXJyYXkpCisJCS0gYW4gYW1iaWd1b3VzLCBpbnZpc2libGUgb3IgbWlzc2luZyB0eXBlCisKK3ZlcmlmeUZpZWxkcworCisJfCB0b1NlYXJjaCB8CisJKHRvU2VhcmNoIDo9IG5ld0NsYXNzIGZpZWxkcykgbm90RW1wdHkgaWZUcnVlOiBbCisJCW5ld0NsYXNzIGZyb21KYXZhQ2xhc3NGaWxlCisJCQlpZlRydWU6IFsKKwkJCQl0b1NlYXJjaCBkbzogWzpmaWVsZCB8CisJCQkJCWZpZWxkIGlzSmF2YUluaXRpYWxpemVyIGlmRmFsc2U6IFsKKwkJCQkJCXNlbGYgdmVyaWZ5RmllbGRUeXBlOiBmaWVsZF1dXQorCQkJaWZGYWxzZTogWworCQkJCXRvU2VhcmNoIGRvOiBbOmZpZWxkIHwKKwkJCQkJZmllbGQgaXNKYXZhSW5pdGlhbGl6ZXIKKwkJCQkJCWlmVHJ1ZTogW3NlbGYgdmVyaWZ5RmllbGRJbml0aWFsaXplcjogZmllbGRdCisJCQkJCQlpZkZhbHNlOiBbc2VsZiB2ZXJpZnlGaWVsZDogZmllbGRdXV1dCisKK3ZlcmlmeUZpZWxkSW5pdGlhbGl6ZXI6IGZpZWxkCisKKwl0eXBlIGlzSmF2YUludGVyZmFjZQorCQlpZlRydWU6IFsKKwkJCXByb2JsZW1TdW1tYXJ5CisJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0ludGVyZmFjZXNDYW5ub3RIYXZlSW5pdGlhbGl6ZXJzCisJCQkJYXJnczogIygpCisJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCWZvckZpZWxkOiBmaWVsZF0KKwkJaWZGYWxzZTogWworCQkJZmllbGQgaXNKYXZhU3RhdGljCisJCQkJaWZUcnVlOiBbCisJCQkJCWZpZWxkIG1vZGlmaWVycyA9PSBBY2NTdGF0aWMgaWZGYWxzZTogWworCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjSWxsZWdhbE1vZGlmaWVyRm9yU3RhdGljSW5pdGlhbGl6ZXIKKwkJCQkJCQlhcmdzOiAjKCkKKwkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJZm9yRmllbGQ6IGZpZWxkXV0KKwkJCQlpZkZhbHNlOiBbCisJCQkJCWZpZWxkIG1vZGlmaWVycyA9PSAwIGlmRmFsc2U6IFsKKwkJCQkJCXByb2JsZW1TdW1tYXJ5CisJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckZvckluaXRpYWxpemVyCisJCQkJCQkJYXJnczogIygpCisJCQkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQkJCWZvckZpZWxkOiBmaWVsZF1dXQorCit2ZXJpZnlGaWVsZDogZmllbGQKKworCShmaWVsZCBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gfCBBY2NNb2RpZmllclByb2JsZW0pIGlmVHJ1ZTogWworCQlzZWxmIHJlcG9ydE1vZGlmaWVyUHJvYmxlbXNPbkZpZWxkOiBmaWVsZF0uCisKKwlmaWVsZCBpc0phdmFTdGF0aWMgaWZUcnVlOiBbCisJCXR5cGUgaXNKYXZhU3RhdGljIGlmRmFsc2U6IFsKKwkJCSh0eXBlIGlzSmF2YU5lc3RlZFR5cGUgYW5kOiBbdHlwZSBpc0phdmFDbGFzc10pIGlmVHJ1ZTogWworCQkJCXByb2JsZW1TdW1tYXJ5CisJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNOZXN0ZWRDbGFzc0Nhbm5vdEhhdmVTdGF0aWNGaWVsZAorCQkJCQlhcmdzOiAjKCkKKwkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQlmb3JGaWVsZDogZmllbGRdXV0uCisKKwlzZWxmIHZlcmlmeUZpZWxkVHlwZTogZmllbGQKKwordmVyaWZ5RmllbGRUeXBlOiBmaWVsZAorCisJfCBkZXNjcmlwdG9yIGZpZWxkVHlwZSB8CisJIjguMyAoQ2xhc3MpIDkuMyAoSW50ZXJmYWNlKSIKKwkiT3B0aW1pemUgdGhlIGJhc2UgdHlwZSBjYXNlIgorCWZpZWxkIHR5cGVJc0Jhc2VUeXBlCisJCWlmVHJ1ZTogWworCQkJZmllbGQgdHlwZU5hbWUgPSAnVicgaWZUcnVlOiBbICAiJE5PTi1OTFMkIgorCQkJCXByb2JsZW1TdW1tYXJ5CisJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsVHlwZUZvckZpZWxkCisJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBKYXZhVm9pZCkKKwkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQlmb3JGaWVsZDogZmllbGRdXQorCQlpZkZhbHNlOiBbCisJCQlkZXNjcmlwdG9yIDo9IGZpZWxkIGFzRGVzY3JpcHRvckluOiBuYW1lRW52aXJvbm1lbnQuCisJCQkoZmllbGRUeXBlIDo9IGRlc2NyaXB0b3IgdHlwZSkgaXNWYWxpZERlc2NyaXB0b3IKKwkJCQlpZlRydWU6IFsKKwkJCQkJKGZpZWxkVHlwZSBpc0FycmF5VHlwZSBhbmQ6IFtmaWVsZFR5cGUgbGVhZkNvbXBvbmVudFR5cGUgaXNWb2lkVHlwZV0pIGlmVHJ1ZTogWworCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjSW52YWxpZEFycmF5VHlwZQorCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBmaWVsZFR5cGUgamF2YVJlYWRhYmxlTmFtZSkKKwkJCQkJCQlzZXZlcml0eTogbmlsCisJCQkJCQkJZm9yRmllbGQ6IGZpZWxkXV0KKwkJCQlpZkZhbHNlOiBbCisJCQkJCXByb2JsZW1TdW1tYXJ5CisJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjVW5ib3VuZFR5cGVGb3JGaWVsZAorCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGZpZWxkVHlwZSBqYXZhUmVhZGFibGVOYW1lIHdpdGg6IGZpZWxkVHlwZSBsZWFmQ29tcG9uZW50VHlwZSkKKwkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCWZvckZpZWxkOiBmaWVsZF1dLgorCityZXBvcnRNb2RpZmllclByb2JsZW1zT25GaWVsZDogZmllbGQKKworCShmaWVsZCBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pIGlmVHJ1ZTogWworCQkoZmllbGQgYmFzaWNNb2RpZmllcnMgYW55TWFzazogQWNjTW9kaWZpZXJQcm9ibGVtKQorCQkJaWZUcnVlOiBbCisJCQkJXnByb2JsZW1TdW1tYXJ5CisJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNPbmx5T25lVmlzaWJpbGl0eU1vZGlmaWVyQWxsb3dlZAorCQkJCQlhcmdzOiAjKCkKKwkJCQkJc2V2ZXJpdHk6IEVycm9ySW5mbzo6Q29uZmxpY3RpbmdNb2RpZmllcgorCQkJCQlmb3JGaWVsZDogZmllbGRdCisJCQlpZkZhbHNlOiBbCisJCQkJXnByb2JsZW1TdW1tYXJ5CisJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNEdXBsaWNhdGVNb2RpZmllcgorCQkJCQlhcmdzOiAjKCkKKwkJCQkJc2V2ZXJpdHk6IEVycm9ySW5mbzo6Q29uZmxpY3RpbmdNb2RpZmllcgorCQkJCQlmb3JGaWVsZDogZmllbGRdXS4KKworCXR5cGUgaXNKYXZhSW50ZXJmYWNlIGlmVHJ1ZTogWworCQlecHJvYmxlbVN1bW1hcnkKKwkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2VGaWVsZAorCQkJYXJnczogIygpCisJCQlzZXZlcml0eTogbmlsCisJCQlmb3JGaWVsZDogZmllbGRdLgorCisJKGZpZWxkIGJhc2ljTW9kaWZpZXJzIGFsbE1hc2s6IEFjY0ZpbmFsIHwgIEFjY1ZvbGF0aWxlKSBpZlRydWU6IFsKKwkJXnByb2JsZW1TdW1tYXJ5CisJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjSWxsZWdhbE1vZGlmaWVyQ29tYmluYXRpb25GaW5hbFZvbGF0aWxlCisJCQlhcmdzOiAjKCkKKwkJCXNldmVyaXR5OiBuaWwKKwkJCWZvckZpZWxkOiBmaWVsZF0uCisKKwlecHJvYmxlbVN1bW1hcnkKKwkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckZvckZpZWxkCisJCWFyZ3M6ICMoKQorCQlzZXZlcml0eTogbmlsCisJCWZvckZpZWxkOiBmaWVsZAorCit2b2lkIHJlcG9ydE1vZGlmaWVyUHJvYmxlbXMoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJaWYgKGZpZWxkLmlzRmluYWwoKSAmJiBmaWVsZC5pc1ZvbGF0aWxlKCkpCisJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmlsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxWb2xhdGlsZShmaWVsZCk7CisKKwkvLyBTaG91bGQgYmUgYWJsZSB0byBkZXRlY3QgYWxsIDMgcHJvYmxlbXMgTk9UIGp1c3QgMQorCWlmICgodHlwZS5tb2RpZmllcnMoKSAmIE1vZGlmaWVycy5BY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pID09IDApIHsKKwkJaWYgKHRoaXMudHlwZS5pc0ludGVyZmFjZSgpKQorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlRmllbGQoZmllbGQpOworCQllbHNlCisJCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXIoZmllbGQpOworCX0gZWxzZSB7CisJCWlmICgoZmllbGQubW9kaWZpZXJzICYgTW9kaWZpZXJzLkFjY01vZGlmaWVyUHJvYmxlbSkgIT0gMCkKKwkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLm9ubHlPbmVWaXNpYmlsaXR5TW9kaWZpZXJBbGxvd2VkKGZpZWxkKTsKKwkJZWxzZQorCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuZHVwbGljYXRlTW9kaWZpZXIoZmllbGQpOworCX0KK30KKyovCitwcml2YXRlIHZvaWQgenpJbXBvcnRQcm9ibGVtcygpIHsKK30KKy8qCitCaW5kaW5nIGNyZWF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgYWxsIHByb2JsZW1zIHdpdGggaW1wb3J0czoKKwktIG9uIGRlbWFuZCBpbXBvcnRzIHdoaWNoIHJlZmVyIHRvIG1pc3NpbmcgcGFja2FnZXMKKwktIHdpdGggc2luZ2xlIHR5cGUgaW1wb3J0czoKKwkJLSByZXNvbHZlcyB0byBhbiBhbWJpZ3VvdXMsIGludmlzaWJsZSBvciBtaXNzaW5nIHR5cGUKKwkJLSBjb25mbGljdHMgd2l0aCB0aGUgdHlwZSdzIHNvdXJjZSBuYW1lCisJCS0gaGFzIHRoZSBzYW1lIHNpbXBsZSBuYW1lIGFzIGFub3RoZXIgaW1wb3J0CisKK05vdGU6IFZBSiBpZ25vcmVkIGR1cGxpY2F0ZSBpbXBvcnRzIChvbmx5IG9uZSB3YXMga2VwdCkKKwordmVyaWZ5SW1wb3J0cworCisJfCBpbXBvcnRzQnlTaW1wbGVOYW1lIG5hbWVFbnZDbGFzcyBpbXBvcnRzIGNsIGZpcnN0IHwKKwlpbXBvcnRzQnlTaW1wbGVOYW1lIDo9IExvb2t1cFRhYmxlIG5ldy4KKwluYW1lRW52Q2xhc3MgOj0gbmFtZUVudmlyb25tZW50IGNsYXNzLgorCisJIjcuNS4yIgorCXR5cGUgaW1wb3J0cyBkbzogWzppbXBvcnQgfAorCQlpbXBvcnQgaXNPbkRlbWFuZAorCQkJaWZUcnVlOiBbCisJCQkJKG5hbWVFbnZDbGFzcyBkb2VzUGFja2FnZUV4aXN0TmFtZWQ6IGltcG9ydCBqYXZhUGFja2FnZU5hbWUpIGlmRmFsc2U6IFsKKwkJCQkJKG5hbWVFbnZDbGFzcyBmaW5kSmF2YUNsYXNzTmFtZWRGcm9tOiBpbXBvcnQgamF2YVBhY2thZ2VOYW1lKSA9PSBuaWwgaWZUcnVlOiBbCisJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNPbkRlbWFuZEltcG9ydFJlZmVyc1RvTWlzc2luZ1BhY2thZ2UKKwkJCQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogaW1wb3J0IGFzU3RyaW5nKQorCQkJCQkJCXNldmVyaXR5OiBFcnJvckluZm86OkltcG9ydFZlcmlmaWNhdGlvbgorCQkJCQkJCWZvclR5cGU6IHR5cGVdXV0KKwkJCWlmRmFsc2U6IFsKKwkJCQkoaW1wb3J0cyA6PSBpbXBvcnRzQnlTaW1wbGVOYW1lIGF0OiBpbXBvcnQgamF2YVNpbXBsZU5hbWUgaWZBYnNlbnQ6IFtdKSA9PSBuaWwKKwkJCQkJaWZUcnVlOiBbCisJCQkJCQlpbXBvcnRzQnlTaW1wbGVOYW1lIGF0OiBpbXBvcnQgamF2YVNpbXBsZU5hbWUgcHV0OiAoQXJyYXkgd2l0aDogaW1wb3J0KV0KKwkJCQkJaWZGYWxzZTogWworCQkJCQkJKGltcG9ydHMgaW5jbHVkZXM6IGltcG9ydCkgaWZGYWxzZTogWworCQkJCQkJCWltcG9ydHNCeVNpbXBsZU5hbWUgYXQ6IGltcG9ydCBqYXZhU2ltcGxlTmFtZSBwdXQ6IGltcG9ydHMsIChBcnJheSB3aXRoOiBpbXBvcnQpXV0uCisKKwkJCQkiSWdub3JlIGFueSBpbXBvcnRzIHdoaWNoIGFyZSBzaW1wbGUgbmFtZXMgLSB3ZSB3aWxsIHRyZWF0IHRoZXNlIGFzIG5vLW9wcy4iCisKKwkJCQlpbXBvcnQgamF2YVBhY2thZ2VOYW1lIG5vdEVtcHR5IGlmVHJ1ZTogWworCQkJCQljbCA6PSBuYW1lRW52Q2xhc3MgZmluZEphdmFDbGFzc05hbWVkRnJvbTogaW1wb3J0IGFzU3RyaW5nLgorCisJCQkJCShjbCB+fiBuaWwgYW5kOiBbY2wgaXNKYXZhUHVibGljIG9yOiBbY2wgY29udHJvbGxlciBzeW1ib2wgPT0gdHlwZSBjb250cm9sbGVyIHN5bWJvbF1dKSBpZkZhbHNlOiBbCisJCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNTaW5nbGVUeXBlSW1wb3J0UmVmZXJzVG9JbnZpc2libGVUeXBlCisJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGltcG9ydCBhc1N0cmluZykKKwkJCQkJCQlzZXZlcml0eTogRXJyb3JJbmZvOjpJbXBvcnRWZXJpZmljYXRpb24KKwkJCQkJCQlmb3JUeXBlOiB0eXBlXV1dXS4KKworCWltcG9ydHNCeVNpbXBsZU5hbWUgbm90RW1wdHkgaWZUcnVlOiBbCisJCWltcG9ydHNCeVNpbXBsZU5hbWUga2V5c0FuZFZhbHVlc0RvOiBbOnNpbXBsZU5hbWUgOm1hdGNoaW5nIHwKKwkJCW1hdGNoaW5nIHNpemUgPT0gMQorCQkJCWlmVHJ1ZTogWworCQkJCQlzaW1wbGVOYW1lID0gdHlwZSBzb3VyY2VOYW1lIGlmVHJ1ZTogWworCQkJCQkJbWF0Y2hpbmcgZmlyc3QgamF2YVJlYWRhYmxlTmFtZSA9IHR5cGUgamF2YVJlYWRhYmxlTmFtZSBpZkZhbHNlOiBbCisJCQkJCQkJcHJvYmxlbVN1bW1hcnkKKwkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI1NpbmdsZVR5cGVJbXBvcnRDb25mbGljdHNXaXRoVHlwZQorCQkJCQkJCQlhcmdzOiAjKCkKKwkJCQkJCQkJc2V2ZXJpdHk6IG5pbAorCQkJCQkJCQlmb3JUeXBlOiB0eXBlXV1dCisJCQkJaWZGYWxzZTogWworCQkJCQlwcm9ibGVtU3VtbWFyeQorCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI1NpbmdsZVR5cGVJbXBvcnRzSGF2ZVNhbWVTaW1wbGVOYW1lCisJCQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogc2ltcGxlTmFtZSkKKwkJCQkJCXNldmVyaXR5OiBuaWwKKwkJCQkJCWZvclR5cGU6IHR5cGVdXV0KKyovCitwcml2YXRlIHZvaWQgenpUeXBlUHJvYmxlbXMoKSB7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL05lc3RlZFR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL05lc3RlZFR5cGVCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkNzFjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTmVzdGVkVHlwZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworcHVibGljIGNsYXNzIE5lc3RlZFR5cGVCaW5kaW5nIGV4dGVuZHMgU291cmNlVHlwZUJpbmRpbmcgeworCXB1YmxpYyBTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlOworCisJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIGVuY2xvc2luZ0luc3RhbmNlczsKKwlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gb3V0ZXJMb2NhbFZhcmlhYmxlczsKKwlwdWJsaWMgaW50IHN5bnRoZXRpY0FyZ3VtZW50c09mZnNldDsgLy8gYW1vdW50IG9mIHNsb3RzIHVzZWQgYnkgc3ludGhldGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50cworcHVibGljIE5lc3RlZFR5cGVCaW5kaW5nKGNoYXJbXVtdIHR5cGVOYW1lLCBDbGFzc1Njb3BlIHNjb3BlLCBTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisJc3VwZXIodHlwZU5hbWUsIGVuY2xvc2luZ1R5cGUuZlBhY2thZ2UsIHNjb3BlKTsKKwl0aGlzLnRhZ0JpdHMgfD0gSXNOZXN0ZWRUeXBlOworCXRoaXMuZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGU7Cit9CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPi4KKyogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworCitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFkZFN5bnRoZXRpY0FyZ3VtZW50KExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgeworCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gbnVsbDsKKworCWlmIChvdXRlckxvY2FsVmFyaWFibGVzID09IG51bGwpIHsKKwkJc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJb3V0ZXJMb2NhbFZhcmlhYmxlcyA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSB7c3ludGhMb2NhbH07CisJfSBlbHNlIHsKKwkJaW50IHNpemUgPSBvdXRlckxvY2FsVmFyaWFibGVzLmxlbmd0aDsKKwkJaW50IG5ld0FyZ0luZGV4ID0gc2l6ZTsKKwkJZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykgewkJLy8gbXVzdCBzZWFyY2ggYmFja3dhcmRzCisJCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKQorCQkJCXJldHVybiBvdXRlckxvY2FsVmFyaWFibGVzW2ldOwkvLyBhbHJlYWR5IGV4aXN0cworCQkJaWYgKG91dGVyTG9jYWxWYXJpYWJsZXNbaV0uaWQgPiBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUuaWQpCisJCQkJbmV3QXJnSW5kZXggPSBpOworCQl9CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoTG9jYWxzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tzaXplICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkob3V0ZXJMb2NhbFZhcmlhYmxlcywgMCwgc3ludGhMb2NhbHMsIDAsIG5ld0FyZ0luZGV4KTsKKwkJc3ludGhMb2NhbHNbbmV3QXJnSW5kZXhdID0gc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJU3lzdGVtLmFycmF5Y29weShvdXRlckxvY2FsVmFyaWFibGVzLCBuZXdBcmdJbmRleCwgc3ludGhMb2NhbHMsIG5ld0FyZ0luZGV4ICsgMSwgc2l6ZSAtIG5ld0FyZ0luZGV4KTsKKwkJb3V0ZXJMb2NhbFZhcmlhYmxlcyA9IHN5bnRoTG9jYWxzOworCX0KKwkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHN5bnRoIGFyZyBmb3IgbG9jYWwgdmFyOiAiICsgbmV3IFN0cmluZyhhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSkgKyAiIHRvOiAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSk7CisJaWYgKHNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmlzUHJvcGFnYXRpbmdJbm5lckNsYXNzRW11bGF0aW9uKQorCQl0aGlzLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOworCXJldHVybiBzeW50aExvY2FsOworfQorLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGVuY2xvc2luZ1R5cGU+LgorKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KKyovCisKK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBudWxsOworCWlmIChlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCkgeworCQlzeW50aExvY2FsID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhlbmNsb3NpbmdUeXBlKTsKKwkJZW5jbG9zaW5nSW5zdGFuY2VzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHtzeW50aExvY2FsfTsKKwl9IGVsc2UgeworCQlpbnQgc2l6ZSA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJCWludCBuZXdBcmdJbmRleCA9IHNpemU7CisJCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspIHsKKwkJCWlmIChlbmNsb3NpbmdJbnN0YW5jZXNbaV0udHlwZSA9PSBlbmNsb3NpbmdUeXBlKQorCQkJCXJldHVybiBlbmNsb3NpbmdJbnN0YW5jZXNbaV07IC8vIGFscmVhZHkgZXhpc3RzCisJCQlpZiAodGhpcy5lbmNsb3NpbmdUeXBlKCkgPT0gZW5jbG9zaW5nVHlwZSkKKwkJCQluZXdBcmdJbmRleCA9IDA7CisJCX0KKwkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gbmV3SW5zdGFuY2VzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tzaXplICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkoZW5jbG9zaW5nSW5zdGFuY2VzLCAwLCBuZXdJbnN0YW5jZXMsIG5ld0FyZ0luZGV4ID09IDAgPyAxIDogMCwgc2l6ZSk7CisJCW5ld0luc3RhbmNlc1tuZXdBcmdJbmRleF0gPSBzeW50aExvY2FsID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhlbmNsb3NpbmdUeXBlKTsKKwkJZW5jbG9zaW5nSW5zdGFuY2VzID0gbmV3SW5zdGFuY2VzOworCX0KKwkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHN5bnRoIGFyZyBmb3IgZW5jbG9zaW5nIHR5cGU6ICIgKyBuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpICsgIiB0bzogIiArIG5ldyBTdHJpbmcodGhpcy5yZWFkYWJsZU5hbWUoKSkpOworCWlmIChzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5pc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbikKKwkJdGhpcy51cGRhdGVJbm5lckVtdWxhdGlvbkRlcGVuZGVudHMoKTsKKwlyZXR1cm4gc3ludGhMb2NhbDsKK30KKy8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYXJndW1lbnQgYW5kIGZpZWxkIGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPi4KKyogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworCitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBhZGRTeW50aGV0aWNBcmd1bWVudChhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOworCWlmIChzeW50aExvY2FsID09IG51bGwpIHJldHVybiBudWxsOworCisJaWYgKHN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9PSBudWxsKQorCQlzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPSBhZGRTeW50aGV0aWNGaWVsZChhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOworCXJldHVybiBzeW50aExvY2FsOworfQorLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBhbmQgZmllbGQgZm9yIDxlbmNsb3NpbmdUeXBlPi4KKyogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworCitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBhZGRTeW50aGV0aWNBcmd1bWVudChlbmNsb3NpbmdUeXBlKTsKKwlpZiAoc3ludGhMb2NhbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCWlmIChzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPT0gbnVsbCkKKwkJc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID0gYWRkU3ludGhldGljRmllbGQoZW5jbG9zaW5nVHlwZSk7CisJcmV0dXJuIHN5bnRoTG9jYWw7Cit9CisvKioKKyAqIENvbXB1dGUgdGhlIHJlc29sdmVkIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzeW50aGV0aWMgYXJndW1lbnRzCisgKi8KK2ZpbmFsIHB1YmxpYyB2b2lkIGNvbXB1dGVTeW50aGV0aWNBcmd1bWVudHNPZmZzZXQoKSB7CisKKwlpbnQgcG9zaXRpb24gPSAxOyAvLyBpbnNpZGUgY29uc3RydWN0b3IsIHJlc2VydmUgcm9vbSBmb3IgcmVjZWl2ZXIKKwkKKwkvLyBpbnNlcnQgZW5jbG9zaW5nIGluc3RhbmNlcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIG91dGVyTG9jYWxzCisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gZW5jbG9zaW5nSW5zdGFuY2VzID0gdGhpcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKTsKKwlpbnQgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQgPSBlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCA/IDAgOiBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOworCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQ7IGkrKyl7CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmcgPSBlbmNsb3NpbmdJbnN0YW5jZXNbaV07CisJCXN5bnRoZXRpY0FyZy5yZXNvbHZlZFBvc2l0aW9uID0gcG9zaXRpb247CisJCWlmICgoc3ludGhldGljQXJnLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChzeW50aGV0aWNBcmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSl7CisJCQlwb3NpdGlvbiArPSAyOworCQl9IGVsc2UgeworCQkJcG9zaXRpb24gKys7CisJCX0KKwl9CisJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gb3V0ZXJMb2NhbHMgPSB0aGlzLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKKwlpbnQgb3V0ZXJMb2NhbHNDb3VudCA9IG91dGVyTG9jYWxzID09IG51bGwgPyAwIDogb3V0ZXJMb2NhbHMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IG91dGVyTG9jYWxzQ291bnQ7IGkrKyl7CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmcgPSBvdXRlckxvY2Fsc1tpXTsKKwkJc3ludGhldGljQXJnLnJlc29sdmVkUG9zaXRpb24gPSBwb3NpdGlvbjsKKwkJaWYgKChzeW50aGV0aWNBcmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKHN5bnRoZXRpY0FyZy50eXBlID09IERvdWJsZUJpbmRpbmcpKXsKKwkJCXBvc2l0aW9uICs9IDI7CisJCX0gZWxzZSB7CisJCQlwb3NpdGlvbiArKzsKKwkJfQorCX0KKwl0aGlzLnN5bnRoZXRpY0FyZ3VtZW50c09mZnNldCA9IHBvc2l0aW9uOworfQorLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGVuY2xvc2luZyB0eXBlLi4uIG51bGwgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdG9wIGxldmVsIHR5cGUuCisqLworCitwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKCkgeworCXJldHVybiBlbmNsb3NpbmdUeXBlOworfQorLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDxhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU+IG9yIG51bGwgaWYgb25lIGRvZXMgbm90IGV4aXN0LgorKi8KKworcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBnZXRTeW50aGV0aWNBcmd1bWVudChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKKwlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gb3V0ZXIgbG9jYWwgdmFyaWFibGVzIGFyZSBrbm93bgorCisJZm9yIChpbnQgaSA9IG91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChvdXRlckxvY2FsVmFyaWFibGVzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpCisJCQlyZXR1cm4gb3V0ZXJMb2NhbFZhcmlhYmxlc1tpXTsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKSB7CisJcmV0dXJuIGVuY2xvc2luZ0luc3RhbmNlczsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUgcmVxdWlyZWQKK30KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpIHsKKwlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzID09IG51bGwpCisJCXJldHVybiBudWxsOworCisJaW50IGxlbmd0aCA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJUmVmZXJlbmNlQmluZGluZyB0eXBlc1tdID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl0eXBlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0YW5jZXNbaV0udHlwZTsKKwlyZXR1cm4gdHlwZXM7Cit9CitwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpIHsKKwlyZXR1cm4gb3V0ZXJMb2NhbFZhcmlhYmxlczsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUgcmVxdWlyZWQKK30KKy8qCisgKiBUcmlnZ2VyIHRoZSBkZXBlbmRlbmN5IG1lY2hhbmlzbSBmb3JjaW5nIHRoZSBpbm5lcmNsYXNzIGVtdWxhdGlvbgorICogdG8gYmUgcHJvcGFnYXRlZCB0byBhbGwgZGVwZW5kZW50IHNvdXJjZSB0eXBlcy4KKyAqLworcHVibGljIHZvaWQgdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCkgeworCS8vIG5vdGhpbmcgdG8gZG8gaW4gZ2VuZXJhbCwgb25seSBsb2NhbCB0eXBlcyBhcmUgZG9pbmcgYW55dGhpbmcKK30KKworLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDx0YXJnZXRFbmNsb3NpbmdUeXBlPiBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KKyovCisKK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgZ2V0U3ludGhldGljQXJndW1lbnQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlLCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIG9ubHlFeGFjdE1hdGNoKSB7CisJaWYgKGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUga25vd24KKworCS8vIGV4YWN0IG1hdGNoCisJZm9yIChpbnQgaSA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCisJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBudWxsKQorCQkJCXJldHVybiBlbmNsb3NpbmdJbnN0YW5jZXNbaV07CisKKwkvLyB0eXBlIGNvbXBhdGliaWxpdHkgOiB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcworCS8vIGNsYXNzIFQgeyBjbGFzcyBNe319CisJLy8gY2xhc3MgUyBleHRlbmRzIFQgeyBjbGFzcyBOIGV4dGVuZHMgTSB7fX0gLS0+IG5lZWQgdG8gdXNlIFMgYXMgYSBkZWZhdWx0IGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgaW4gTigpLgorCWlmICghb25seUV4YWN0TWF0Y2gpeworCQlmb3IgKGludCBpID0gZW5jbG9zaW5nSW5zdGFuY2VzLmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gbnVsbCkKKwkJCQlpZiAodGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUpKQorCQkJCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzW2ldOworCX0KKwlyZXR1cm4gbnVsbDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFja2FnZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE5ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZUeXBlOworCitwdWJsaWMgY2xhc3MgUGFja2FnZUJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIGltcGxlbWVudHMgVHlwZUNvbnN0YW50cyB7CisJcHVibGljIGNoYXJbXVtdIGNvbXBvdW5kTmFtZTsKKwlQYWNrYWdlQmluZGluZyBwYXJlbnQ7CisJTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CisJSGFzaHRhYmxlT2ZUeXBlIGtub3duVHlwZXM7CisJSGFzaHRhYmxlT2ZQYWNrYWdlIGtub3duUGFja2FnZXM7Citwcm90ZWN0ZWQgUGFja2FnZUJpbmRpbmcoKSB7Cit9CitwdWJsaWMgUGFja2FnZUJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBQYWNrYWdlQmluZGluZyBwYXJlbnQsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CisJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CisJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OworCXRoaXMua25vd25UeXBlcyA9IG51bGw7IC8vIGluaXRpYWxpemVkIGlmIHVzZWQuLi4gY2xhc3MgY291bnRzIGNhbiBiZSB2ZXJ5IGxhcmdlIDMwMC02MDAKKwl0aGlzLmtub3duUGFja2FnZXMgPSBuZXcgSGFzaHRhYmxlT2ZQYWNrYWdlKDMpOyAvLyBzdWItcGFja2FnZSBjb3VudHMgYXJlIHR5cGljYWxseSAwLTMKK30KK3B1YmxpYyBQYWNrYWdlQmluZGluZyhjaGFyW10gdG9wTGV2ZWxQYWNrYWdlTmFtZSwgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKKwl0aGlzKG5ldyBjaGFyW11bXSB7dG9wTGV2ZWxQYWNrYWdlTmFtZX0sIG51bGwsIGVudmlyb25tZW50KTsKK30KKy8qIENyZWF0ZSB0aGUgZGVmYXVsdCBwYWNrYWdlLgorKi8KKworcHVibGljIFBhY2thZ2VCaW5kaW5nKExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KSB7CisJdGhpcyhOb0NoYXJDaGFyLCBudWxsLCBlbnZpcm9ubWVudCk7Cit9Citwcml2YXRlIHZvaWQgYWRkTm90Rm91bmRQYWNrYWdlKGNoYXJbXSBzaW1wbGVOYW1lKSB7CisJa25vd25QYWNrYWdlcy5wdXQoc2ltcGxlTmFtZSwgZW52aXJvbm1lbnQudGhlTm90Rm91bmRQYWNrYWdlKTsKK30KK3ByaXZhdGUgdm9pZCBhZGROb3RGb3VuZFR5cGUoY2hhcltdIHNpbXBsZU5hbWUpIHsKKwlpZiAoa25vd25UeXBlcyA9PSBudWxsKQorCQlrbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mVHlwZSgyNSk7CisJa25vd25UeXBlcy5wdXQoc2ltcGxlTmFtZSwgZW52aXJvbm1lbnQudGhlTm90Rm91bmRUeXBlKTsKK30KK3ZvaWQgYWRkUGFja2FnZShQYWNrYWdlQmluZGluZyBlbGVtZW50KSB7CisJa25vd25QYWNrYWdlcy5wdXQoZWxlbWVudC5jb21wb3VuZE5hbWVbZWxlbWVudC5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIGVsZW1lbnQpOworfQordm9pZCBhZGRUeXBlKFJlZmVyZW5jZUJpbmRpbmcgZWxlbWVudCkgeworCWlmIChrbm93blR5cGVzID09IG51bGwpCisJCWtub3duVHlwZXMgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKDI1KTsKKwlrbm93blR5cGVzLnB1dChlbGVtZW50LmNvbXBvdW5kTmFtZVtlbGVtZW50LmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSwgZWxlbWVudCk7Cit9CisvKiBBUEkKKyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgorKi8KKworcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKKwlyZXR1cm4gUEFDS0FHRTsKK30KK3ByaXZhdGUgUGFja2FnZUJpbmRpbmcgZmluZFBhY2thZ2UoY2hhcltdIG5hbWUpIHsKKwlpZiAoIWVudmlyb25tZW50LmlzUGFja2FnZSh0aGlzLmNvbXBvdW5kTmFtZSwgbmFtZSkpCisJCXJldHVybiBudWxsOworCisJY2hhcltdW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdCh0aGlzLmNvbXBvdW5kTmFtZSwgbmFtZSk7CisJUGFja2FnZUJpbmRpbmcgbmV3UGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcoY29tcG91bmROYW1lLCB0aGlzLCBlbnZpcm9ubWVudCk7CisJYWRkUGFja2FnZShuZXdQYWNrYWdlQmluZGluZyk7CisJcmV0dXJuIG5ld1BhY2thZ2VCaW5kaW5nOworfQorLyogQW5zd2VyIHRoZSBzdWJwYWNrYWdlIG5hbWVkIG5hbWU7IGFzayB0aGUgb3JhY2xlIGZvciB0aGUgcGFja2FnZSBpZiBpdHMgbm90IGluIHRoZSBjYWNoZS4KKyogQW5zd2VyIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkLgorKgorKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB3ZSBrbm93IHRoZXJlIGlzIE5PVCBhIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLgorKi8KKworUGFja2FnZUJpbmRpbmcgZ2V0UGFja2FnZShjaGFyW10gbmFtZSkgeworCVBhY2thZ2VCaW5kaW5nIGJpbmRpbmcgPSBnZXRQYWNrYWdlMChuYW1lKTsKKwlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCWlmIChiaW5kaW5nID09IGVudmlyb25tZW50LnRoZU5vdEZvdW5kUGFja2FnZSkKKwkJCXJldHVybiBudWxsOworCQllbHNlCisJCQlyZXR1cm4gYmluZGluZzsKKwl9CisJaWYgKChiaW5kaW5nID0gZmluZFBhY2thZ2UobmFtZSkpICE9IG51bGwpCisJCXJldHVybiBiaW5kaW5nOworCisJLy8gbm90IGZvdW5kIHNvIHJlbWVtYmVyIGEgcHJvYmxlbSBwYWNrYWdlIGJpbmRpbmcgaW4gdGhlIGNhY2hlIGZvciBmdXR1cmUgbG9va3VwcworCWFkZE5vdEZvdW5kUGFja2FnZShuYW1lKTsKKwlyZXR1cm4gbnVsbDsKK30KKy8qIEFuc3dlciB0aGUgc3VicGFja2FnZSBuYW1lZCBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUuCisqIEFuc3dlciB0aGVOb3RGb3VuZFBhY2thZ2UgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRoZSBmaXJzdCB0aW1lCisqIGl0IHdhcyBsb29rZWQgdXAsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KKyoKKyogTk9URTogU2VuZGVycyBtdXN0IGNvbnZlcnQgdGhlTm90Rm91bmRQYWNrYWdlIGludG8gYSByZWFsIHByb2JsZW0KKyogcGFja2FnZSBpZiBpdHMgdG8gcmV0dXJuZWQuCisqLworCitQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlMChjaGFyW10gbmFtZSkgeworCXJldHVybiBrbm93blBhY2thZ2VzLmdldChuYW1lKTsKK30KKy8qIEFuc3dlciB0aGUgdHlwZSBuYW1lZCBuYW1lOyBhc2sgdGhlIG9yYWNsZSBmb3IgdGhlIHR5cGUgaWYgaXRzIG5vdCBpbiB0aGUgY2FjaGUuCisqIEFuc3dlciBhIE5vdFZpc2libGUgcHJvYmxlbSB0eXBlIGlmIHRoZSB0eXBlIGlzIG5vdCB2aXNpYmxlIGZyb20gdGhlIGludm9jYXRpb25QYWNrYWdlLgorKiBBbnN3ZXIgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCisqCisqIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBzb3VyY2UgdHlwZXMvc2NvcGVzIHdoaWNoIGtub3cgdGhlcmUgaXMgTk9UIGEKKyogcGFja2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUuCisqLworCitSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGUoY2hhcltdIG5hbWUpIHsKKwlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSBnZXRUeXBlMChuYW1lKTsKKwlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCWlmICgoYmluZGluZyA9IGVudmlyb25tZW50LmFza0ZvclR5cGUodGhpcywgbmFtZSkpID09IG51bGwpIHsKKwkJCS8vIG5vdCBmb3VuZCBzbyByZW1lbWJlciBhIHByb2JsZW0gdHlwZSBiaW5kaW5nIGluIHRoZSBjYWNoZSBmb3IgZnV0dXJlIGxvb2t1cHMKKwkJCWFkZE5vdEZvdW5kVHlwZShuYW1lKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJaWYgKGJpbmRpbmcgPT0gZW52aXJvbm1lbnQudGhlTm90Rm91bmRUeXBlKQorCQlyZXR1cm4gbnVsbDsKKwlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKQorCQliaW5kaW5nID0gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgYmluZGluZykucmVzb2x2ZShlbnZpcm9ubWVudCk7CisJaWYgKGJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpCisJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW50ZXJuYWxOYW1lUHJvdmlkZWQpOworCXJldHVybiBiaW5kaW5nOworfQorLyogQW5zd2VyIHRoZSB0eXBlIG5hbWVkIG5hbWUgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZS4KKyogQW5zd2VyIHRoZU5vdEZvdW5kVHlwZSBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdGhlIGZpcnN0IHRpbWUKKyogaXQgd2FzIGxvb2tlZCB1cCwgb3RoZXJ3aXNlIGFuc3dlciBudWxsLgorKgorKiBOT1RFOiBTZW5kZXJzIG11c3QgY29udmVydCB0aGVOb3RGb3VuZFR5cGUgaW50byBhIHJlYWwgcHJvYmxlbQorKiByZWZlcmVuY2UgdHlwZSBpZiBpdHMgdG8gcmV0dXJuZWQuCisqLworCitSZWZlcmVuY2VCaW5kaW5nIGdldFR5cGUwKGNoYXJbXSBuYW1lKSB7CisJaWYgKGtub3duVHlwZXMgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJcmV0dXJuIGtub3duVHlwZXMuZ2V0KG5hbWUpOworfQorLyogQW5zd2VyIHRoZSBwYWNrYWdlIG9yIHR5cGUgbmFtZWQgbmFtZTsgYXNrIHRoZSBvcmFjbGUgaWYgaXQgaXMgbm90IGluIHRoZSBjYWNoZS4KKyogQW5zd2VyIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkLgorKgorKiBXaGVuIGNvbGxpc2lvbnMgZXhpc3QgYmV0d2VlbiBhIHR5cGUgbmFtZSAmIGEgcGFja2FnZSBuYW1lLCBhbnN3ZXIgdGhlIHBhY2thZ2UuCisqIFRyZWF0IHRoZSB0eXBlIGFzIGlmIGl0IGRvZXMgbm90IGV4aXN0Li4uIGEgcHJvYmxlbSB3YXMgYWxyZWFkeSByZXBvcnRlZCB3aGVuIHRoZSB0eXBlIHdhcyBkZWZpbmVkLgorKgorKiBOT1RFOiBubyB2aXNpYmlsaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkLgorKiBUSElTIFNIT1VMRCBPTkxZIEJFIFVTRUQgQlkgU09VUkNFIFRZUEVTL1NDT1BFUy4KKyovCisKK3B1YmxpYyBCaW5kaW5nIGdldFR5cGVPclBhY2thZ2UoY2hhcltdIG5hbWUpIHsKKwlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKG5hbWUpOworCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsICYmIHBhY2thZ2VCaW5kaW5nICE9IGVudmlyb25tZW50LnRoZU5vdEZvdW5kUGFja2FnZSkKKwkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOworCisJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IGdldFR5cGUwKG5hbWUpOworCWlmICh0eXBlQmluZGluZyAhPSBudWxsICYmIHR5cGVCaW5kaW5nICE9IGVudmlyb25tZW50LnRoZU5vdEZvdW5kVHlwZSkgeworCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKKwkJCXR5cGVCaW5kaW5nID0gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmcpLnJlc29sdmUoZW52aXJvbm1lbnQpOworCQlpZiAodHlwZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEludGVybmFsTmFtZVByb3ZpZGVkKTsKKwkJcmV0dXJuIHR5cGVCaW5kaW5nOworCX0KKworCWlmICh0eXBlQmluZGluZyA9PSBudWxsICYmIHBhY2thZ2VCaW5kaW5nID09IG51bGwpIHsKKwkJLy8gZmluZCB0aGUgcGFja2FnZQorCQlpZiAoKHBhY2thZ2VCaW5kaW5nID0gZmluZFBhY2thZ2UobmFtZSkpICE9IG51bGwpCisJCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CisKKwkJLy8gaWYgbm8gcGFja2FnZSB3YXMgZm91bmQsIGZpbmQgdGhlIHR5cGUgbmFtZWQgbmFtZSByZWxhdGl2ZSB0byB0aGUgcmVjZWl2ZXIKKwkJaWYgKCh0eXBlQmluZGluZyA9IGVudmlyb25tZW50LmFza0ZvclR5cGUodGhpcywgbmFtZSkpICE9IG51bGwpIHsKKwkJCWlmICh0eXBlQmluZGluZy5pc05lc3RlZFR5cGUoKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEludGVybmFsTmFtZVByb3ZpZGVkKTsKKwkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJfQorCisJCS8vIFNpbmNlIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLCBhZGQgcHJvYmxlbSBiaW5kaW5ncworCQkvLyB0byB0aGUgY29sbGVjdGlvbnMgc28gaXQgd2lsbCBiZSByZXBvcnRlZCBhcyBhbiBlcnJvciBuZXh0IHRpbWUuCisJCWFkZE5vdEZvdW5kUGFja2FnZShuYW1lKTsKKwkJYWRkTm90Rm91bmRUeXBlKG5hbWUpOworCX0gZWxzZSB7CisJCWlmIChwYWNrYWdlQmluZGluZyA9PSBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFBhY2thZ2UpCisJCQlwYWNrYWdlQmluZGluZyA9IG51bGw7CisJCWlmICh0eXBlQmluZGluZyA9PSBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFR5cGUpCisJCQl0eXBlQmluZGluZyA9IG51bGw7CisJfQorCisJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpCisJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwllbHNlCisJCXJldHVybiB0eXBlQmluZGluZzsKK30KK3B1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgLypqYXZhLmxhbmcqLyB7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWlmIChjb21wb3VuZE5hbWUgPT0gTm9DaGFyQ2hhcikKKwkJcmV0dXJuICJUaGUgRGVmYXVsdCBQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJcmV0dXJuICJwYWNrYWdlICIgKyAoKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IENoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcG91bmROYW1lKSA6ICJVTk5BTUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzZjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1CaW5kaW5nLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBQcm9ibGVtQmluZGluZyBleHRlbmRzIEJpbmRpbmcgeworCXB1YmxpYyBjaGFyW10gbmFtZTsKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzZWFyY2hUeXBlOworCXByaXZhdGUgaW50IHByb2JsZW1JZDsKKy8vIE5PVEU6IG11c3Qgb25seSBhbnN3ZXIgdGhlIHN1YnNldCBvZiB0aGUgbmFtZSByZWxhdGVkIHRvIHRoZSBwcm9ibGVtCisKK3B1YmxpYyBQcm9ibGVtQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIGludCBwcm9ibGVtSWQpIHsKKwl0aGlzKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHByb2JsZW1JZCk7Cit9CisvLyBOT1RFOiBtdXN0IG9ubHkgYW5zd2VyIHRoZSBzdWJzZXQgb2YgdGhlIG5hbWUgcmVsYXRlZCB0byB0aGUgcHJvYmxlbQorCitwdWJsaWMgUHJvYmxlbUJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBSZWZlcmVuY2VCaW5kaW5nIHNlYXJjaFR5cGUsIGludCBwcm9ibGVtSWQpIHsKKwl0aGlzKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHNlYXJjaFR5cGUsIHByb2JsZW1JZCk7Cit9CitQcm9ibGVtQmluZGluZyhjaGFyW10gbmFtZSwgaW50IHByb2JsZW1JZCkgeworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5wcm9ibGVtSWQgPSBwcm9ibGVtSWQ7Cit9CitQcm9ibGVtQmluZGluZyhjaGFyW10gbmFtZSwgUmVmZXJlbmNlQmluZGluZyBzZWFyY2hUeXBlLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcyhuYW1lLCBwcm9ibGVtSWQpOworCXRoaXMuc2VhcmNoVHlwZSA9IHNlYXJjaFR5cGU7Cit9CisvKiBBUEkKKyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgorKi8KKworcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKKwlyZXR1cm4gVkFSSUFCTEUgfCBUWVBFOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCisqLworCitwdWJsaWMgZmluYWwgaW50IHByb2JsZW1JZCgpIHsKKwlyZXR1cm4gcHJvYmxlbUlkOworfQorcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSB7CisJcmV0dXJuIG5hbWU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1GaWVsZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUZpZWxkQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGNjODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1GaWVsZEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFByb2JsZW1GaWVsZEJpbmRpbmcgZXh0ZW5kcyBGaWVsZEJpbmRpbmcgeworCXByaXZhdGUgaW50IHByb2JsZW1JZDsKKy8vIE5PVEU6IG11c3Qgb25seSBhbnN3ZXIgdGhlIHN1YnNldCBvZiB0aGUgbmFtZSByZWxhdGVkIHRvIHRoZSBwcm9ibGVtCisKK3B1YmxpYyBQcm9ibGVtRmllbGRCaW5kaW5nKFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MsIGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgaW50IHByb2JsZW1JZCkgeworCXRoaXMoZGVjbGFyaW5nQ2xhc3MsIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcuJyksIHByb2JsZW1JZCk7Cit9CitwdWJsaWMgUHJvYmxlbUZpZWxkQmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzLCBjaGFyW10gbmFtZSwgaW50IHByb2JsZW1JZCkgeworCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKwl0aGlzLm5hbWUgPSBuYW1lOworCXRoaXMucHJvYmxlbUlkID0gcHJvYmxlbUlkOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCisqLworCitwdWJsaWMgZmluYWwgaW50IHByb2JsZW1JZCgpIHsKKwlyZXR1cm4gcHJvYmxlbUlkOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtTWV0aG9kQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDllZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1NZXRob2RCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworcHVibGljIGNsYXNzIFByb2JsZW1NZXRob2RCaW5kaW5nIGV4dGVuZHMgTWV0aG9kQmluZGluZyB7CisJcHJpdmF0ZSBpbnQgcHJvYmxlbUlkOworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaDsKK3B1YmxpYyBQcm9ibGVtTWV0aG9kQmluZGluZyhjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJncywgaW50IHByb2JsZW1JZCkgeworCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwl0aGlzLnBhcmFtZXRlcnMgPSAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApID8gTm9QYXJhbWV0ZXJzIDogYXJnczsKKwl0aGlzLnByb2JsZW1JZCA9IHByb2JsZW1JZDsKK30KK3B1YmxpYyBQcm9ibGVtTWV0aG9kQmluZGluZyhjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJncywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcywgaW50IHByb2JsZW1JZCkgeworCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwl0aGlzLnBhcmFtZXRlcnMgPSAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApID8gTm9QYXJhbWV0ZXJzIDogYXJnczsKKwl0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7CisJdGhpcy5wcm9ibGVtSWQgPSBwcm9ibGVtSWQ7Cit9CitwdWJsaWMgUHJvYmxlbU1ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyBjbG9zZXN0TWF0Y2gsIGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmdbXSBhcmdzLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcyhzZWxlY3RvciwgYXJncywgcHJvYmxlbUlkKTsKKwl0aGlzLmNsb3Nlc3RNYXRjaCA9IGNsb3Nlc3RNYXRjaDsKK30KKy8qIEFQSQorKiBBbnN3ZXIgdGhlIHByb2JsZW0gaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKyogTm9FcnJvciBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2YWxpZCBiaW5kaW5nLgorKi8KKworcHVibGljIGZpbmFsIGludCBwcm9ibGVtSWQoKSB7CisJcmV0dXJuIHByb2JsZW1JZDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVBhY2thZ2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1QYWNrYWdlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzVkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK3B1YmxpYyBjbGFzcyBQcm9ibGVtUGFja2FnZUJpbmRpbmcgZXh0ZW5kcyBQYWNrYWdlQmluZGluZyB7CisJcHJpdmF0ZSBpbnQgcHJvYmxlbUlkOworLy8gTk9URTogbXVzdCBvbmx5IGFuc3dlciB0aGUgc3Vic2V0IG9mIHRoZSBuYW1lIHJlbGF0ZWQgdG8gdGhlIHByb2JsZW0KKworUHJvYmxlbVBhY2thZ2VCaW5kaW5nKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgaW50IHByb2JsZW1JZCkgeworCXRoaXMuY29tcG91bmROYW1lID0gY29tcG91bmROYW1lOworCXRoaXMucHJvYmxlbUlkID0gcHJvYmxlbUlkOworfQorUHJvYmxlbVBhY2thZ2VCaW5kaW5nKGNoYXJbXSBuYW1lLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcyhuZXcgY2hhcltdW10ge25hbWV9LCBwcm9ibGVtSWQpOworfQorLyogQVBJCisqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgorKiBOb0Vycm9yIGlmIHRoZSByZWNlaXZlciBpcyBhIHZhbGlkIGJpbmRpbmcuCisqLworCitwdWJsaWMgZmluYWwgaW50IHByb2JsZW1JZCgpIHsKKwlyZXR1cm4gcHJvYmxlbUlkOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVhc29ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVhc29ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWU2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWFzb25zLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworcHVibGljIGludGVyZmFjZSBQcm9ibGVtUmVhc29ucyB7CisJZmluYWwgaW50IE5vRXJyb3IgPSAwOworCWZpbmFsIGludCBOb3RGb3VuZCA9IDE7CisJZmluYWwgaW50IE5vdFZpc2libGUgPSAyOworCWZpbmFsIGludCBBbWJpZ3VvdXMgPSAzOworCWZpbmFsIGludCBJbnRlcm5hbE5hbWVQcm92aWRlZCA9IDQ7IC8vIHVzZWQgaWYgYW4gaW50ZXJuYWwgbmFtZSBpcyB1c2VkIGluIHNvdXJjZQorCWZpbmFsIGludCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lID0gNTsKKwlmaW5hbCBpbnQgTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24gPSA2OworCWZpbmFsIGludCBOb25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQgPSA3OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVmZXJlbmNlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVmZXJlbmNlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjUwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWZlcmVuY2VCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworcHVibGljIGNsYXNzIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIGV4dGVuZHMgUmVmZXJlbmNlQmluZGluZyB7CisJcHVibGljIEJpbmRpbmcgb3JpZ2luYWw7CisJcHJpdmF0ZSBpbnQgcHJvYmxlbUlkOworLy8gTk9URTogbXVzdCBvbmx5IGFuc3dlciB0aGUgc3Vic2V0IG9mIHRoZSBuYW1lIHJlbGF0ZWQgdG8gdGhlIHByb2JsZW0KKworcHVibGljIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgaW50IHByb2JsZW1JZCkgeworCXRoaXMoY29tcG91bmROYW1lLCBudWxsLCBwcm9ibGVtSWQpOworfQorcHVibGljIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNoYXJbXSBuYW1lLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcyhuZXcgY2hhcltdW10ge25hbWV9LCBudWxsLCBwcm9ibGVtSWQpOworfQorCitwdWJsaWMgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBCaW5kaW5nIG9yaWdpbmFsLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CisJdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOworCXRoaXMucHJvYmxlbUlkID0gcHJvYmxlbUlkOworfQorcHVibGljIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNoYXJbXSBuYW1lLCBCaW5kaW5nIG9yaWdpbmFsLCBpbnQgcHJvYmxlbUlkKSB7CisJdGhpcyhuZXcgY2hhcltdW10ge25hbWV9LCBvcmlnaW5hbCwgcHJvYmxlbUlkKTsKK30KKy8qIEFQSQorKiBBbnN3ZXIgdGhlIHByb2JsZW0gaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKyogTm9FcnJvciBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2YWxpZCBiaW5kaW5nLgorKi8KKworcHVibGljIGZpbmFsIGludCBwcm9ibGVtSWQoKSB7CisJcmV0dXJuIHByb2JsZW1JZDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SZWZlcmVuY2VCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMmZjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsNTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JRGVwZW5kZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qCitOb3QgYWxsIGZpZWxkcyBkZWZpbmVkIGJ5IHRoaXMgdHlwZSAoJiBpdHMgc3ViY2xhc3NlcykgYXJlIGluaXRpYWxpemVkIHdoZW4gaXQgaXMgY3JlYXRlZC4KK1NvbWUgYXJlIGluaXRpYWxpemVkIG9ubHkgd2hlbiBuZWVkZWQuCisKK0FjY2Vzc29ycyBoYXZlIGJlZW4gcHJvdmlkZWQgZm9yIHNvbWUgcHVibGljIGZpZWxkcyBzbyBhbGwgVHlwZUJpbmRpbmdzIGhhdmUgdGhlIHNhbWUgQVBJLi4uCitidXQgYWNjZXNzIHB1YmxpYyBmaWVsZHMgZGlyZWN0bHkgd2hlbmV2ZXIgcG9zc2libGUuCitOb24tcHVibGljIGZpZWxkcyBoYXZlIGFjY2Vzc29ycyB3aGljaCBzaG91bGQgYmUgdXNlZCBldmVyeXdoZXJlIHlvdSBleHBlY3QgdGhlIGZpZWxkIHRvIGJlIGluaXRpYWxpemVkLgorCitudWxsIGlzIE5PVCBhIHZhbGlkIHZhbHVlIGZvciBhIG5vbi1wdWJsaWMgZmllbGQuLi4gaXQganVzdCBtZWFucyB0aGUgZmllbGQgaXMgbm90IGluaXRpYWxpemVkLgorKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFJlZmVyZW5jZUJpbmRpbmcgZXh0ZW5kcyBUeXBlQmluZGluZyBpbXBsZW1lbnRzIElEZXBlbmRlbnQgeworCXB1YmxpYyBjaGFyW11bXSBjb21wb3VuZE5hbWU7CisJcHVibGljIGNoYXJbXSBzb3VyY2VOYW1lOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBQYWNrYWdlQmluZGluZyBmUGFja2FnZTsKKworCWNoYXJbXSBmaWxlTmFtZTsKKwljaGFyW10gY29uc3RhbnRQb29sTmFtZTsKKwljaGFyW10gc2lnbmF0dXJlOworCitwdWJsaWMgRmllbGRCaW5kaW5nW10gYXZhaWxhYmxlRmllbGRzKCkgeworCXJldHVybiBmaWVsZHMoKTsKK30KKworcHVibGljIE1ldGhvZEJpbmRpbmdbXSBhdmFpbGFibGVNZXRob2RzKCkgeworCXJldHVybiBtZXRob2RzKCk7Cit9CQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGNhbiBiZSBpbnN0YW50aWF0ZWQKKyovCisKK3B1YmxpYyBib29sZWFuIGNhbkJlSW5zdGFudGlhdGVkKCkgeworCXJldHVybiAhKGlzQWJzdHJhY3QoKSB8fCBpc0ludGVyZmFjZSgpKTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSBpbnZvY2F0aW9uUGFja2FnZS4KKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGNhbkJlU2VlbkJ5KFBhY2thZ2VCaW5kaW5nIGludm9jYXRpb25QYWNrYWdlKSB7CisJaWYgKGlzUHVibGljKCkpIHJldHVybiB0cnVlOworCWlmIChpc1ByaXZhdGUoKSkgcmV0dXJuIGZhbHNlOworCisJLy8gaXNQcm90ZWN0ZWQoKSBvciBpc0RlZmF1bHQoKQorCXJldHVybiBpbnZvY2F0aW9uUGFja2FnZSA9PSBmUGFja2FnZTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB2aXNpYmxlIHRvIHRoZSByZWNlaXZlclR5cGUgYW5kIHRoZSBpbnZvY2F0aW9uVHlwZS4KKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGNhbkJlU2VlbkJ5KFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSkgeworCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKKworCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzICYmIGludm9jYXRpb25UeXBlID09IHJlY2VpdmVyVHlwZSkgcmV0dXJuIHRydWU7CisKKwlpZiAoaXNQcm90ZWN0ZWQoKSkgeworCisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQorCQkvLyBPUiB0aGUgaW52b2NhdGlvblR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyaW5nQ2xhc3MKKwkJLy8gICAgQU5EIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgaW52b2NhdGlvblR5cGUgb3IgaXRzIHN1YmNsYXNzCisJCS8vICAgIE9SIHRoZSB0eXBlIGlzIGEgc3RhdGljIG1ldGhvZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQorCQkvLyAgICBPUiBwcmV2aW91cyBhc3NlcnRpb25zIGFyZSB0cnVlIGZvciBvbmUgb2YgdGhlIGVuY2xvc2luZyB0eXBlCisJCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IGZQYWNrYWdlKSByZXR1cm4gdHJ1ZTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW52b2NhdGlvblR5cGU7CisJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBlbmNsb3NpbmdUeXBlKCk7IC8vIHByb3RlY3RlZCB0eXBlcyBhbHdheXMgaGF2ZSBhbiBlbmNsb3Npbmcgb25lCisJCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIGNvdWxkIGJlIG51bGwgaWYgaW5jb3JyZWN0IHRvcC1sZXZlbCBwcm90ZWN0ZWQgdHlwZQorCQkvL2ludCBkZXB0aCA9IDA7CisJCWRvIHsKKwkJCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBpbnZvY2F0aW9uVHlwZSkgcmV0dXJuIHRydWU7CisJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKSByZXR1cm4gdHJ1ZTsKKwkJCS8vZGVwdGgrKzsKKwkJCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl9IHdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChpc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSByZWNlaXZlciBvciBpdHMgZW5jbG9zaW5nVHlwZQorCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgcmVjZWl2ZXIgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCisJCWlmICghKHJlY2VpdmVyVHlwZSA9PSB0aGlzIHx8IHJlY2VpdmVyVHlwZSA9PSBlbmNsb3NpbmdUeXBlKCkpKSByZXR1cm4gZmFsc2U7CisJCQorCQlpZiAoaW52b2NhdGlvblR5cGUgIT0gdGhpcykgeworCQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckludm9jYXRpb25UeXBlID0gaW52b2NhdGlvblR5cGU7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHRlbXAgPSBvdXRlckludm9jYXRpb25UeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCQlvdXRlckludm9jYXRpb25UeXBlID0gdGVtcDsKKwkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCQl9CisKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRoaXM7CisJCQl0ZW1wID0gb3V0ZXJEZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCk7CisJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQkJb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRlbXA7CisJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCQkJaWYgKG91dGVySW52b2NhdGlvblR5cGUgIT0gb3V0ZXJEZWNsYXJpbmdDbGFzcykgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8vIGlzRGVmYXVsdCgpCisJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlICE9IGZQYWNrYWdlKSByZXR1cm4gZmFsc2U7CisKKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSByZWNlaXZlclR5cGU7CisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGVuY2xvc2luZ1R5cGUoKSA9PSBudWxsID8gdGhpcyA6IGVuY2xvc2luZ1R5cGUoKTsKKwlkbyB7CisJCWlmIChkZWNsYXJpbmdDbGFzcyA9PSB0eXBlKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGZQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKwl9IHdoaWxlICgodHlwZSA9IHR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCisqCisqIE5PVEU6IENhbm5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQgc2NvcGUuCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeShTY29wZSBzY29wZSkgeworCWlmIChpc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKKworCVNvdXJjZVR5cGVCaW5kaW5nIGludm9jYXRpb25UeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCWlmIChpbnZvY2F0aW9uVHlwZSA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKworCWlmIChpc1Byb3RlY3RlZCgpKSB7CisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciAob3IgaXRzIGVuY2xvc2luZyB0eXBlKSBpcyB0aGUgc3VwZXJjbGFzcyAKKwkJLy8Jb2YgdGhlIGludm9jYXRpb25UeXBlIG9yIGluIHRoZSBzYW1lIHBhY2thZ2UKKwkJcmV0dXJuIGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IGZQYWNrYWdlIAorCQkJCXx8IGlzU3VwZXJjbGFzc09mKGludm9jYXRpb25UeXBlKQorCQkJCXx8IGVuY2xvc2luZ1R5cGUoKS5pc1N1cGVyY2xhc3NPZihpbnZvY2F0aW9uVHlwZSk7IC8vIHByb3RlY3RlZCB0eXBlcyBhbHdheXMgaGF2ZSBhbiBlbmNsb3Npbmcgb25lCisJfQorCisJaWYgKGlzUHJvdGVjdGVkKCkpIHsKKwkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIGludm9jYXRpb25UeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcyBvciB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlCisJCS8vIE9SIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBkZWNsYXJpbmdDbGFzcworCQkvLyAgICBBTkQgdGhlIGludm9jYXRpb25UeXBlIGlzIHRoZSBpbnZvY2F0aW9uVHlwZSBvciBpdHMgc3ViY2xhc3MKKwkJLy8gICAgT1IgdGhlIHR5cGUgaXMgYSBzdGF0aWMgbWV0aG9kIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggYSB0eXBlCisJCS8vICAgIE9SIHByZXZpb3VzIGFzc2VydGlvbnMgYXJlIHRydWUgZm9yIG9uZSBvZiB0aGUgZW5jbG9zaW5nIHR5cGUKKwkJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IGZQYWNrYWdlKSByZXR1cm4gdHJ1ZTsKKworCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gaW52b2NhdGlvblR5cGU7CisJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBlbmNsb3NpbmdUeXBlKCk7IC8vIHByb3RlY3RlZCB0eXBlcyBhbHdheXMgaGF2ZSBhbiBlbmNsb3Npbmcgb25lCisJCWlmIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIGNvdWxkIGJlIG51bGwgaWYgaW5jb3JyZWN0IHRvcC1sZXZlbCBwcm90ZWN0ZWQgdHlwZQorCQkvLyBpbnQgZGVwdGggPSAwOworCQlkbyB7CisJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgPT0gaW52b2NhdGlvblR5cGUpIHJldHVybiB0cnVlOworCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKGN1cnJlbnRUeXBlKSkgcmV0dXJuIHRydWU7CisJCQkvLyBkZXB0aCsrOworCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCX0gd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChpc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBpbnZvY2F0aW9uVHlwZSBoYXZlIGEgY29tbW9uIGVuY2xvc2luZ1R5cGUKKwkJLy8gYWxyZWFkeSBrbm93IHRoZXkgYXJlIG5vdCB0aGUgaWRlbnRpY2FsIHR5cGUKKwkJUmVmZXJlbmNlQmluZGluZyBvdXRlckludm9jYXRpb25UeXBlID0gaW52b2NhdGlvblR5cGU7CisJCVJlZmVyZW5jZUJpbmRpbmcgdGVtcCA9IG91dGVySW52b2NhdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQlvdXRlckludm9jYXRpb25UeXBlID0gdGVtcDsKKwkJCXRlbXAgPSB0ZW1wLmVuY2xvc2luZ1R5cGUoKTsKKwkJfQorCisJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRoaXM7CisJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgeworCQkJb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRlbXA7CisJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCX0KKwkJcmV0dXJuIG91dGVySW52b2NhdGlvblR5cGUgPT0gb3V0ZXJEZWNsYXJpbmdDbGFzczsKKwl9CisKKwkvLyBpc0RlZmF1bHQoKQorCXJldHVybiBpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBmUGFja2FnZTsKK30KK3B1YmxpYyB2b2lkIGNvbXB1dGVJZCgpIHsKKwlpZiAoY29tcG91bmROYW1lLmxlbmd0aCAhPSAzKSB7CisJCWlmIChjb21wb3VuZE5hbWUubGVuZ3RoID09IDQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1JFRkxFQ1RfQ09OU1RSVUNUT1IsIGNvbXBvdW5kTmFtZSkpIHsKKwkJCWlkID0gVF9KYXZhTGFuZ1JlZmxlY3RDb25zdHJ1Y3RvcjsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CQkvLyBhbGwgb3RoZXIgdHlwZXMgYXJlIGluIGphdmEuKi4qCisJfQorCisJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBLCBjb21wb3VuZE5hbWVbMF0pKQorCQlyZXR1cm47CQkvLyBhc3N1bWVzIHdlIG9ubHkgbG9vayB1cCB0eXBlcyBpbiBqYXZhCisKKwlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKExBTkcsIGNvbXBvdW5kTmFtZVsxXSkpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfSU9fUFJJTlRTVFJFQU0sIGNvbXBvdW5kTmFtZSkpIHsKKwkJCWlkID0gVF9KYXZhSW9QcmludFN0cmVhbTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CQkvLyBhbGwgb3RoZXIgdHlwZXMgYXJlIGluIGphdmEubGFuZworCX0KKworCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkdfT0JKRUNULCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ09iamVjdDsKKwkJcmV0dXJuOworCX0KKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1NUUklORywgY29tcG91bmROYW1lKSkgeworCQlpZCA9IFRfSmF2YUxhbmdTdHJpbmc7CisJCXJldHVybjsKKwl9CisKKwkvLyB3ZWxsLWtub3duIGV4Y2VwdGlvbiB0eXBlcworCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkdfVEhST1dBQkxFLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ1Rocm93YWJsZTsKKwkJcmV0dXJuOworCX0KKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0VSUk9SLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0Vycm9yOworCQlyZXR1cm47CisJfQorCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkdfRVhDRVBUSU9OLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0V4Y2VwdGlvbjsKKwkJcmV0dXJuOworCX0KKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT04sIGNvbXBvdW5kTmFtZSkpIHsKKwkJaWQgPSBUX0phdmFMYW5nQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKKwkJcmV0dXJuOworCX0KKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX05PQ0xBU1NERUZFUlJPUiwgY29tcG91bmROYW1lKSkgeworCQlpZCA9IFRfSmF2YUxhbmdOb0NsYXNzRGVmRXJyb3I7CisJCXJldHVybjsKKwl9CisKKwkvLyBvdGhlciB3ZWxsLWtub3duIHR5cGVzCisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19DTEFTUywgY29tcG91bmROYW1lKSkgeworCQlpZCA9IFRfSmF2YUxhbmdDbGFzczsKKwkJcmV0dXJuOworCX0KKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1NUUklOR0JVRkZFUiwgY29tcG91bmROYW1lKSkgeworCQlpZCA9IFRfSmF2YUxhbmdTdHJpbmdCdWZmZXI7CisJCXJldHVybjsKKwl9CisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19TWVNURU0sIGNvbXBvdW5kTmFtZSkpIHsKKwkJaWQgPSBUX0phdmFMYW5nU3lzdGVtOworCQlyZXR1cm47CisJfQorCisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19JTlRFR0VSLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0ludGVnZXI7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0JZVEUsIGNvbXBvdW5kTmFtZSkpIHsKKwkJaWQgPSBUX0phdmFMYW5nQnl0ZTsKKwkJcmV0dXJuOworCX0JCisKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0NIQVJBQ1RFUiwgY29tcG91bmROYW1lKSkgeworCQlpZCA9IFRfSmF2YUxhbmdDaGFyYWN0ZXI7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0ZMT0FULCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0Zsb2F0OworCQlyZXR1cm47CisJfQorCisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19ET1VCTEUsIGNvbXBvdW5kTmFtZSkpIHsKKwkJaWQgPSBUX0phdmFMYW5nRG91YmxlOworCQlyZXR1cm47CisJfQorCisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19CT09MRUFOLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0Jvb2xlYW47CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1NIT1JULCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ1Nob3J0OworCQlyZXR1cm47CisJfQorCisJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19MT05HLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0xvbmc7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1ZPSUQsIGNvbXBvdW5kTmFtZSkpIHsKKwkJaWQgPSBUX0phdmFMYW5nVm9pZDsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SLCBjb21wb3VuZE5hbWUpKSB7CisJCWlkID0gVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yOworCQlyZXR1cm47CisJfQorfQorLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGNvbnN0YW50IHBvb2wgbmFtZS4KKyoKKyogTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCisqLworCitwdWJsaWMgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKKwlpZiAoY29uc3RhbnRQb29sTmFtZSAhPSBudWxsKSAJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWU7CisJcmV0dXJuIGNvbnN0YW50UG9vbE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpOworfQorU3RyaW5nIGRlYnVnTmFtZSgpIHsKKwlyZXR1cm4gKGNvbXBvdW5kTmFtZSAhPSBudWxsKSA/IG5ldyBTdHJpbmcocmVhZGFibGVOYW1lKCkpIDogIlVOTkFNRUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQKK30KK3B1YmxpYyBmaW5hbCBpbnQgZGVwdGgoKSB7CisJaW50IGRlcHRoID0gMDsKKwlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnQgPSB0aGlzOworCXdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKQorCQlkZXB0aCsrOworCXJldHVybiBkZXB0aDsKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBlbmNsb3NpbmcgdHlwZS4uLiBudWxsIGlmIHRoZSByZWNlaXZlciBpcyBhIHRvcCBsZXZlbCB0eXBlLgorKi8KKworcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGVBdChpbnQgcmVsYXRpdmVEZXB0aCkgeworCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKHJlbGF0aXZlRGVwdGgtLSA+IDAgJiYgY3VycmVudCAhPSBudWxsKQorCQljdXJyZW50ID0gY3VycmVudC5lbmNsb3NpbmdUeXBlKCk7CisJcmV0dXJuIGN1cnJlbnQ7Cit9CitwdWJsaWMgaW50IGZpZWxkQ291bnQoKSB7CisJcmV0dXJuIGZpZWxkcygpLmxlbmd0aDsKK30KK3B1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHMoKSB7CisJcmV0dXJuIE5vRmllbGRzOworfQorcHVibGljIGZpbmFsIGludCBnZXRBY2Nlc3NGbGFncygpIHsKKwlyZXR1cm4gbW9kaWZpZXJzICYgQWNjSnVzdEZsYWc7Cit9CitwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRFeGFjdENvbnN0cnVjdG9yKFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcykgeworCXJldHVybiBudWxsOworfQorcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0RXhhY3RNZXRob2QoY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMpIHsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0RmllbGQoY2hhcltdIGZpZWxkTmFtZSkgeworCXJldHVybiBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIGZpbGUgbmFtZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlLgorICoKKyAqIFRoZSBwYXRoIHBhcnQgKG9wdGlvbmFsKSBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBhY3R1YWwKKyAqIGZpbGUgcHJvcGVyIG5hbWUgYnkgYSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yLgorICoKKyAqIFRoZSBwcm9wZXIgZmlsZSBuYW1lIGluY2x1ZGVzIHRoZSBzdWZmaXggZXh0ZW5zaW9uIChlLmcuICIuamF2YSIpCisgKgorICogZS5nLiAiYzovY29tL2libS9jb21waWxlci9qYXZhL2FwaS9Db21waWxlci5qYXZhIiAKKyAqLworCitwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgeworCXJldHVybiBmaWxlTmFtZTsKK30KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lKSB7CisJUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzID0gbWVtYmVyVHlwZXMoKTsKKwlmb3IgKGludCBpID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZW1iZXJUeXBlc1tpXS5zb3VyY2VOYW1lLCB0eXBlTmFtZSkpCisJCQlyZXR1cm4gbWVtYmVyVHlwZXNbaV07CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgTWV0aG9kQmluZGluZ1tdIGdldE1ldGhvZHMoY2hhcltdIHNlbGVjdG9yKSB7CisJcmV0dXJuIE5vTWV0aG9kczsKK30KK3B1YmxpYyBQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlKCkgeworCXJldHVybiBmUGFja2FnZTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIGFuSW50ZXJmYWNlIG9yIGlzIGlkZW50aWNhbCB0byBhbkludGVyZmFjZS4KKyogSWYgc2VhcmNoSGllcmFyY2h5IGlzIHRydWUsIHRoZW4gYWxzbyBzZWFyY2ggdGhlIHJlY2VpdmVyJ3Mgc3VwZXJjbGFzc2VzLgorKgorKiBOT1RFOiBBc3N1bWUgdGhhdCBhbkludGVyZmFjZSBpcyBhbiBpbnRlcmZhY2UuCisqLworCitwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzSW50ZXJmYWNlKFJlZmVyZW5jZUJpbmRpbmcgYW5JbnRlcmZhY2UsIGJvb2xlYW4gc2VhcmNoSGllcmFyY2h5KSB7CisJaWYgKHRoaXMgPT0gYW5JbnRlcmZhY2UpCisJCXJldHVybiB0cnVlOworCisJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOworCWludCBsYXN0UG9zaXRpb24gPSAtMTsKKwlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gdGhpczsKKwlkbyB7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsKKwkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQl9CisJfSB3aGlsZSAoc2VhcmNoSGllcmFyY2h5ICYmIChjdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisJCQkKKwlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJaWYgKChjdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal0pID09IGFuSW50ZXJmYWNlKQorCQkJCXJldHVybiB0cnVlOworCisJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXNUb1Zpc2l0LCAwLCBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xhc3RQb3NpdGlvbiAqIDJdW10sIDAsIGxhc3RQb3NpdGlvbik7CisJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorLy8gSW50ZXJuYWwgbWV0aG9kLi4uIGFzc3VtZSBpdHMgb25seSBzZW50IHRvIGNsYXNzZXMgTk9UIGludGVyZmFjZXMKKworYm9vbGVhbiBpbXBsZW1lbnRzTWV0aG9kKE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CisJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gdGhpczsKKwl3aGlsZSAodHlwZSAhPSBudWxsKSB7CisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKG1ldGhvZC5zZWxlY3Rvcik7CisJCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKG1ldGhvZHNbaV0uYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZCkpCisJCQkJcmV0dXJuIHRydWU7CisJCXR5cGUgPSB0eXBlLnN1cGVyY2xhc3MoKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGFuIGFic3RyYWN0IHR5cGUKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NBYnN0cmFjdCkgIT0gMDsKK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzQW5vbnltb3VzVHlwZSgpIHsKKwlyZXR1cm4gKHRhZ0JpdHMgJiBJc0Fub255bW91c1R5cGUpICE9IDA7Cit9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0JpbmFyeUJpbmRpbmcoKSB7CisJcmV0dXJuICh0YWdCaXRzICYgSXNCaW5hcnlCaW5kaW5nKSAhPSAwOworfQorcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDbGFzcygpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgPT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgYXJndW1lbnQgdHlwZSAocmlnaHQpCisqLworCQorYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CisJaWYgKHJpZ2h0ID09IHRoaXMpCisJCXJldHVybiB0cnVlOworCWlmIChyaWdodC5pZCA9PSBUX09iamVjdCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCEocmlnaHQgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKKwkJcmV0dXJuIGZhbHNlOworCisJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJpZ2h0OworCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzSW50ZXJmYWNlKCkpCisJCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlKHJlZmVyZW5jZUJpbmRpbmcsIHRydWUpOworCWlmIChpc0ludGVyZmFjZSgpKSAgLy8gRXhwbGljaXQgY29udmVyc2lvbiBmcm9tIGFuIGludGVyZmFjZSB0byBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5pc1N1cGVyY2xhc3NPZih0aGlzKTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgZGVmYXVsdCB2aXNpYmlsaXR5CisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHQoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiAoQWNjUHVibGljIHwgQWNjUHJvdGVjdGVkIHwgQWNjUHJpdmF0ZSkpID09IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBkZXByZWNhdGVkIHR5cGUKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZmluYWwgYW5kIGNhbm5vdCBiZSBzdWJjbGFzc2VkCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbmFsKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDA7Cit9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgIT0gMDsKK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzTG9jYWxUeXBlKCkgeworCXJldHVybiAodGFnQml0cyAmIElzTG9jYWxUeXBlKSAhPSAwOworfQorcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNZW1iZXJUeXBlKCkgeworCXJldHVybiAodGFnQml0cyAmIElzTWVtYmVyVHlwZSkgIT0gMDsKK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzTmVzdGVkVHlwZSgpIHsKKwlyZXR1cm4gKHRhZ0JpdHMgJiBJc05lc3RlZFR5cGUpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eQorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcml2YXRlKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJvdGVjdGVkIHZpc2liaWxpdHkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJvdGVjdGVkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJvdGVjdGVkKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NQdWJsaWMpICE9IDA7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzdGF0aWMgbWVtYmVyIHR5cGUgKG9yIHRvcGxldmVsKQorICovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGljKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgKEFjY1N0YXRpYyB8IEFjY0ludGVyZmFjZSkpICE9IDAgfHwKKwkJICAgICh0YWdCaXRzICYgSXNOZXN0ZWRUeXBlKSA9PSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgYWxsIGZsb2F0IG9wZXJhdGlvbnMgbXVzdCBhZGhlciB0byBJRUVFIDc1NCBmbG9hdC9kb3VibGUgcnVsZXMKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RyaWN0ZnAoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NTdHJpY3RmcCkgIT0gMDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBpbiB0aGUgc3VwZXJjbGFzcyBoaWVyYXJjaHkgb2YgYVR5cGUKKyoKKyogTk9URTogT2JqZWN0LmlzU3VwZXJjbGFzc09mKE9iamVjdCkgLT4gZmFsc2UKKyovCisKK3B1YmxpYyBib29sZWFuIGlzU3VwZXJjbGFzc09mKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSkgeworCWRvIHsKKwkJaWYgKHRoaXMgPT0gKHR5cGUgPSB0eXBlLnN1cGVyY2xhc3MoKSkpIHJldHVybiB0cnVlOworCX0gd2hpbGUgKHR5cGUgIT0gbnVsbCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZGVwcmVjYXRlZCAob3IgYW55IG9mIGl0cyBlbmNsb3NpbmcgdHlwZXMpCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZpZXdlZEFzRGVwcmVjYXRlZCgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDAgfHwKKwkJKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5KSAhPSAwOworfQorcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJUeXBlcygpIHsKKwlyZXR1cm4gTm9NZW1iZXJUeXBlczsKK30KK3B1YmxpYyBNZXRob2RCaW5kaW5nW10gbWV0aG9kcygpIHsKKwlyZXR1cm4gTm9NZXRob2RzOworfQorLyoqCisqIEFuc3dlciB0aGUgc291cmNlIG5hbWUgZm9yIHRoZSB0eXBlLgorKiBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgdHlwZXMsIGFzIHRoZSBxdWFsaWZpZWQgbmFtZSBmcm9tIGl0cyB0b3AgbGV2ZWwgdHlwZS4KKyogRm9yIGV4YW1wbGUsIGZvciBhIG1lbWJlciB0eXBlIE4gZGVmaW5lZCBpbnNpZGUgTSAmIEE6ICJBLk0uTiIuCisqLworCitwdWJsaWMgY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUoKSB7CisJaWYgKGlzTWVtYmVyVHlwZSgpKSB7CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkucXVhbGlmaWVkU291cmNlTmFtZSgpLCBzb3VyY2VOYW1lKCksICcuJyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNvdXJjZU5hbWUoKTsKKwl9Cit9CitwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIC8qamF2YS5sYW5nLk9iamVjdCovIHsKKwlpZiAoaXNNZW1iZXJUeXBlKCkpCisJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChlbmNsb3NpbmdUeXBlKCkucmVhZGFibGVOYW1lKCksIHNvdXJjZU5hbWUsICcuJyk7CisJZWxzZQorCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKK30KKy8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUuCisqCisqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorKi8KKworcHVibGljIGNoYXJbXSBzaWduYXR1cmUoKSAvKiBMamF2YS9sYW5nL09iamVjdDsgKi8geworCWlmIChzaWduYXR1cmUgIT0gbnVsbCkKKwkJcmV0dXJuIHNpZ25hdHVyZTsKKworCXJldHVybiBzaWduYXR1cmUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgnTCcsIGNvbnN0YW50UG9vbE5hbWUoKSwgJzsnKTsKK30KK3B1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKKwlyZXR1cm4gc291cmNlTmFtZTsKK30KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3MoKSB7CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIHN1cGVySW50ZXJmYWNlcygpIHsKKwlyZXR1cm4gTm9TdXBlckludGVyZmFjZXM7Cit9CitwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIHN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKSB7CisJaWYgKGlzU3RhdGljKCkpIHJldHVybiBudWxsOworCisJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZSgpOworCWlmIChlbmNsb3NpbmdUeXBlID09IG51bGwpCisJCXJldHVybiBudWxsOworCWVsc2UKKwkJcmV0dXJuIG5ldyBSZWZlcmVuY2VCaW5kaW5nW10ge2VuY2xvc2luZ1R5cGV9OworfQorcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKSB7CisJcmV0dXJuIG51bGw7CQkvLyBpcyBudWxsIGlmIG5vIGVuY2xvc2luZyBpbnN0YW5jZXMgYXJlIHJlcXVpcmVkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzNmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2NvcGUuamF2YQpAQCAtMCwwICsxLDEyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5PYmplY3RWZWN0b3I7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY29wZQorCWltcGxlbWVudHMKKwkJQmFzZVR5cGVzLAorCQlCaW5kaW5nSWRzLAorCQlDb21waWxlck1vZGlmaWVycywKKwkJUHJvYmxlbVJlYXNvbnMsCisJCVRhZ0JpdHMsCisJCVR5cGVDb25zdGFudHMsCisJCVR5cGVJZHMgeworCisJcHVibGljIFNjb3BlIHBhcmVudDsKKwlwdWJsaWMgaW50IGtpbmQ7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCTE9DS19TQ09QRSA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUVUSE9EX1NDT1BFID0gMjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19TQ09QRSA9IDM7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUElMQVRJT05fVU5JVF9TQ09QRSA9IDQ7CisJcHJvdGVjdGVkIFNjb3BlKGludCBraW5kLCBTY29wZSBwYXJlbnQpIHsKKwkJdGhpcy5raW5kID0ga2luZDsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJfQorCisJcHVibGljIGFic3RyYWN0IFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKTsKKworCS8vIEludGVybmFsIHVzZSBvbmx5CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUoVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50cykgeworCQlpZiAocGFyYW1ldGVycyA9PSBhcmd1bWVudHMpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJCWlmIChsZW5ndGggIT0gYXJndW1lbnRzLmxlbmd0aCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKHBhcmFtZXRlcnNbaV0gIT0gYXJndW1lbnRzW2ldKQorCQkJCWlmICghYXJndW1lbnRzW2ldLmlzQ29tcGF0aWJsZVdpdGgocGFyYW1ldGVyc1tpXSkpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIGxlZnQgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gcmlnaHQKKwkqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVUeXBlc0NvbXBhdGlibGUoVHlwZUJpbmRpbmcgbGVmdCwgVHlwZUJpbmRpbmcgcmlnaHQpIHsKKwkJcmV0dXJuIGxlZnQuaXNDb21wYXRpYmxlV2l0aChyaWdodCk7CisJfQorCisJLyogQW5zd2VyIGFuIGludCBkZXNjcmliaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZ2l2ZW4gdHlwZXMuCisJKgorCSogCQlOb3RSZWxhdGVkIAorCSogCQlFcXVhbE9yTW9yZVNwZWNpZmljIDogbGVmdCBpcyBjb21wYXRpYmxlIHdpdGggcmlnaHQKKwkqIAkJTW9yZUdlbmVyaWMgOiByaWdodCBpcyBjb21wYXRpYmxlIHdpdGggbGVmdAorCSovCisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVR5cGVzKFR5cGVCaW5kaW5nIGxlZnQsIFR5cGVCaW5kaW5nIHJpZ2h0KSB7CisJCWlmIChhcmVUeXBlc0NvbXBhdGlibGUobGVmdCwgcmlnaHQpKQorCQkJcmV0dXJuIEVxdWFsT3JNb3JlU3BlY2lmaWM7CisJCWlmIChhcmVUeXBlc0NvbXBhdGlibGUocmlnaHQsIGxlZnQpKQorCQkJcmV0dXJuIE1vcmVHZW5lcmljOworCQlyZXR1cm4gTm90UmVsYXRlZDsKKwl9CisKKwkvKiBBbnN3ZXIgYW4gaW50IGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBnaXZlbiB0eXBlIGFuZCB1bmNoZWNrZWQgZXhjZXB0aW9ucy4KKwkqCisJKiAJTm90UmVsYXRlZCAKKwkqIAlFcXVhbE9yTW9yZVNwZWNpZmljIDogdHlwZSBpcyBrbm93biBmb3Igc3VyZSB0byBiZSBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHR5cGUKKwkqIAlNb3JlR2VuZXJpYyA6IHR5cGUgaXMgYSBzdXBlcnR5cGUgb2YgYW4gYWN0dWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZQorCSovCisJcHVibGljIGludCBjb21wYXJlVW5jaGVja2VkRXhjZXB0aW9uKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSkgeworCQlpbnQgY29tcGFyaXNvbiA9IGNvbXBhcmVUeXBlcyh0eXBlLCBnZXRKYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24oKSk7CisJCWlmIChjb21wYXJpc29uICE9IDApIHJldHVybiBjb21wYXJpc29uOworCQlyZXR1cm4gY29tcGFyZVR5cGVzKHR5cGUsIGdldEphdmFMYW5nRXJyb3IoKSk7CisJfQorCisJcHVibGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdFNjb3BlIGNvbXBpbGF0aW9uVW5pdFNjb3BlKCkgeworCQlTY29wZSBsYXN0U2NvcGUgPSBudWxsOworCQlTY29wZSBzY29wZSA9IHRoaXM7CisJCWRvIHsKKwkJCWxhc3RTY29wZSA9IHNjb3BlOworCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7CisJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOworCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBsYXN0U2NvcGU7CisJfQorCisJcHVibGljIEFycmF5QmluZGluZyBjcmVhdGVBcnJheShUeXBlQmluZGluZyB0eXBlLCBpbnQgZGltZW5zaW9uKSB7CisJCWlmICh0eXBlLmlzVmFsaWRCaW5kaW5nKCkpCisJCQlyZXR1cm4gZW52aXJvbm1lbnQoKS5jcmVhdGVBcnJheVR5cGUodHlwZSwgZGltZW5zaW9uKTsKKwkJZWxzZQorCQkJcmV0dXJuIG5ldyBBcnJheUJpbmRpbmcodHlwZSwgZGltZW5zaW9uKTsKKwl9CisKKwkvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZW5jbG9zaW5nIHNvdXJjZSB0eXBlLgorCSovCisJcHVibGljIGZpbmFsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1NvdXJjZVR5cGUoKSB7CisJCVNjb3BlIHNjb3BlID0gdGhpczsKKwkJZG8geworCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkKKwkJCQlyZXR1cm4gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7CisJCX0gd2hpbGUgKHNjb3BlICE9IG51bGwpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIGZpbmFsIExvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50KCkgeworCQlTY29wZSBzY29wZSwgdW5pdFNjb3BlID0gdGhpczsKKwkJd2hpbGUgKChzY29wZSA9IHVuaXRTY29wZS5wYXJlbnQpICE9IG51bGwpCisJCQl1bml0U2NvcGUgPSBzY29wZTsKKwkJcmV0dXJuICgoQ29tcGlsYXRpb25Vbml0U2NvcGUpIHVuaXRTY29wZSkuZW52aXJvbm1lbnQ7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBmaW5kRGlyZWN0TWVtYmVyVHlwZShjaGFyW10gdHlwZU5hbWUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCQlpZiAoKGVuY2xvc2luZ1R5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApCisJCQlyZXR1cm4gbnVsbDsgLy8ga25vdyBpdCBoYXMgbm8gbWVtYmVyIHR5cGVzIChub3IgaW5oZXJpdGVkIG1lbWJlciB0eXBlcykKKworCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlID0gZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFJlZmVyZW5jZShlbmNsb3NpbmdUeXBlLmNvbXBvdW5kTmFtZSwgdHlwZU5hbWUpOworCQlSZWZlcmVuY2VCaW5kaW5nIG1lbWJlclR5cGUgPSBlbmNsb3NpbmdUeXBlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpOworCQlpZiAobWVtYmVyVHlwZSAhPSBudWxsKSB7CisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UobWVtYmVyVHlwZSk7IC8vIHRvIHJlY29yZCBzdXBlcnR5cGVzCisJCQlpZiAoZW5jbG9zaW5nU291cmNlVHlwZSA9PSBudWxsCisJCQkJPyBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGdldEN1cnJlbnRQYWNrYWdlKCkpCisJCQkJOiBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1NvdXJjZVR5cGUpKQorCQkJCXJldHVybiBtZW1iZXJUeXBlOworCQkJZWxzZQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIG1lbWJlclR5cGUsIE5vdFZpc2libGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8vIEludGVybmFsIHVzZSBvbmx5CisJcHVibGljIE1ldGhvZEJpbmRpbmcgZmluZEV4YWN0TWV0aG9kKAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlKHJlY2VpdmVyVHlwZSk7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZVJlZmVyZW5jZXMoYXJndW1lbnRUeXBlcyk7CisJCU1ldGhvZEJpbmRpbmcgZXhhY3RNZXRob2QgPSByZWNlaXZlclR5cGUuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMpOworCQlpZiAoZXhhY3RNZXRob2QgIT0gbnVsbCkgeworCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhleGFjdE1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsKKwkJCWlmIChyZWNlaXZlclR5cGUuaXNJbnRlcmZhY2UoKSB8fCBleGFjdE1ldGhvZC5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQlyZXR1cm4gZXhhY3RNZXRob2Q7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwkvKglBbnN3ZXIgdGhlIGZpZWxkIGJpbmRpbmcgdGhhdCBjb3JyZXNwb25kcyB0byBmaWVsZE5hbWUuCisJCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIHJlY2VpdmVyVHlwZS4KKwkJSW52b2NhdGlvblNpdGUgaW1wbGVtZW50cworCQkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIGZpZWxkIGlzIHZpc2libGUuCisJCU9ubHkgZmllbGRzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyVHlwZSBvciBpdHMgc3VwZXJ0eXBlcyBhcmUgYW5zd2VyZWQ7CisJCWEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIHR5cGUgd2lsbCBub3QgYmUgZm91bmQgdXNpbmcgdGhpcyBBUEkuCisJCisJCUlmIG5vIHZpc2libGUgZmllbGQgaXMgZGlzY292ZXJlZCwgbnVsbCBpcyBhbnN3ZXJlZC4KKwkqLworCXB1YmxpYyBGaWVsZEJpbmRpbmcgZmluZEZpZWxkKFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIGZpZWxkTmFtZSwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKwkJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpIHJldHVybiBudWxsOworCQlpZiAocmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZE5hbWUsIExFTkdUSCkpCisJCQkJcmV0dXJuIEFycmF5QmluZGluZy5MZW5ndGhGaWVsZDsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlKHJlY2VpdmVyVHlwZSk7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CisJCWlmICghY3VycmVudFR5cGUuY2FuQmVTZWVuQnkodGhpcykpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoY3VycmVudFR5cGUsIGZpZWxkTmFtZSwgTm90VmlzaWJsZSk7CisJCS8vICoqKiBOZWVkIGEgbmV3IHByb2JsZW0gaWQgLSBUeXBlTm90VmlzaWJsZT8KKworCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOworCQlpZiAoZmllbGQgIT0gbnVsbCkgeworCQkJaWYgKGZpZWxkLmNhbkJlU2VlbkJ5KGN1cnJlbnRUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCisJCQkJcmV0dXJuIGZpZWxkOworCQkJZWxzZQorCQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcywgZmllbGROYW1lLCBOb3RWaXNpYmxlKTsKKwkJfQorCQkvLyBjb2xsZWN0IGFsbCBzdXBlcmludGVyZmFjZXMgb2YgcmVjZWl2ZXJUeXBlIHVudGlsIHRoZSBmaWVsZCBpcyBmb3VuZCBpbiBhIHN1cGVydHlwZQorCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG51bGw7CisJCWludCBsYXN0UG9zaXRpb24gPSAtMTsKKwkJRmllbGRCaW5kaW5nIHZpc2libGVGaWVsZCA9IG51bGw7CisJCWJvb2xlYW4ga2VlcExvb2tpbmcgPSB0cnVlOworCQlib29sZWFuIG5vdFZpc2libGUgPSBmYWxzZTsKKwkJLy8gd2UgY291bGQgaG9sZCBvbnRvIHRoZSBub3QgdmlzaWJsZSBmaWVsZCBmb3IgZXh0cmEgZXJyb3IgcmVwb3J0aW5nCisJCXdoaWxlIChrZWVwTG9va2luZykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpCisJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkwLAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQl9CisJCQlpZiAoKGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpKSA9PSBudWxsKQorCQkJCWJyZWFrOworCisJCQlpZiAoKGZpZWxkID0gY3VycmVudFR5cGUuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgeworCQkJCWtlZXBMb29raW5nID0gZmFsc2U7CisJCQkJaWYgKGZpZWxkLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKSB7CisJCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkKKwkJCQkJCXZpc2libGVGaWVsZCA9IGZpZWxkOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcodmlzaWJsZUZpZWxkLmRlY2xhcmluZ0NsYXNzLCBmaWVsZE5hbWUsIEFtYmlndW91cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbm90VmlzaWJsZSA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gd2FsayBhbGwgdmlzaWJsZSBpbnRlcmZhY2VzIHRvIGZpbmQgYW1iaWd1b3VzIHJlZmVyZW5jZXMKKwkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ICE9IG51bGwpIHsKKwkJCVByb2JsZW1GaWVsZEJpbmRpbmcgYW1iaWd1b3VzID0gbnVsbDsKKwkJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07CisJCQkJCWlmICgoYW5JbnRlcmZhY2UudGFnQml0cyAmIEludGVyZmFjZVZpc2l0ZWQpID09IDApIHsKKwkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQKKwkJCQkJCWFuSW50ZXJmYWNlLnRhZ0JpdHMgfD0gSW50ZXJmYWNlVmlzaXRlZDsKKwkJCQkJCWlmICgoZmllbGQgPSBhbkludGVyZmFjZS5nZXRGaWVsZChmaWVsZE5hbWUpKSAhPSBudWxsKSB7CisJCQkJCQkJaWYgKHZpc2libGVGaWVsZCA9PSBudWxsKSB7CisJCQkJCQkJCXZpc2libGVGaWVsZCA9IGZpZWxkOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWFtYmlndW91cyA9IG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKHZpc2libGVGaWVsZC5kZWNsYXJpbmdDbGFzcywgZmllbGROYW1lLCBBbWJpZ3VvdXMpOworCQkJCQkJCQlicmVhayBkb25lOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24KKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykKKwkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOworCQkJfQorCQkJaWYgKGFtYmlndW91cyAhPSBudWxsKQorCQkJCXJldHVybiBhbWJpZ3VvdXM7CisJCX0KKworCQlpZiAodmlzaWJsZUZpZWxkICE9IG51bGwpCisJCQlyZXR1cm4gdmlzaWJsZUZpZWxkOworCQlpZiAobm90VmlzaWJsZSkKKwkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhjdXJyZW50VHlwZSwgZmllbGROYW1lLCBOb3RWaXNpYmxlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBmaW5kTWVtYmVyVHlwZShjaGFyW10gdHlwZU5hbWUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCQlpZiAoKGVuY2xvc2luZ1R5cGUudGFnQml0cyAmIEhhc05vTWVtYmVyVHlwZXMpICE9IDApCisJCQlyZXR1cm4gbnVsbDsgLy8ga25vdyBpdCBoYXMgbm8gbWVtYmVyIHR5cGVzIChub3IgaW5oZXJpdGVkIG1lbWJlciB0eXBlcykKKworCQlTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlID0gZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQlQYWNrYWdlQmluZGluZyBjdXJyZW50UGFja2FnZSA9IGdldEN1cnJlbnRQYWNrYWdlKCk7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkUmVmZXJlbmNlKGVuY2xvc2luZ1R5cGUuY29tcG91bmROYW1lLCB0eXBlTmFtZSk7CisJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGVuY2xvc2luZ1R5cGUuZ2V0TWVtYmVyVHlwZSh0eXBlTmFtZSk7CisJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsKKwkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZVJlZmVyZW5jZShtZW1iZXJUeXBlKTsgLy8gdG8gcmVjb3JkIHN1cGVydHlwZXMKKwkJCWlmIChlbmNsb3NpbmdTb3VyY2VUeXBlID09IG51bGwKKwkJCQk/IG1lbWJlclR5cGUuY2FuQmVTZWVuQnkoY3VycmVudFBhY2thZ2UpCisJCQkJOiBtZW1iZXJUeXBlLmNhbkJlU2VlbkJ5KGVuY2xvc2luZ1R5cGUsIGVuY2xvc2luZ1NvdXJjZVR5cGUpKQorCQkJCXJldHVybiBtZW1iZXJUeXBlOworCQkJZWxzZQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIG1lbWJlclR5cGUsIE5vdFZpc2libGUpOworCQl9CisKKwkJLy8gY29sbGVjdCBhbGwgc3VwZXJpbnRlcmZhY2VzIG9mIHJlY2VpdmVyVHlwZSB1bnRpbCB0aGUgbWVtYmVyVHlwZSBpcyBmb3VuZCBpbiBhIHN1cGVydHlwZQorCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gZW5jbG9zaW5nVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOworCQlpbnQgbGFzdFBvc2l0aW9uID0gLTE7CisJCVJlZmVyZW5jZUJpbmRpbmcgdmlzaWJsZU1lbWJlclR5cGUgPSBudWxsOworCQlib29sZWFuIGtlZXBMb29raW5nID0gdHJ1ZTsKKwkJUmVmZXJlbmNlQmluZGluZyBub3RWaXNpYmxlID0gbnVsbDsKKwkJLy8gd2UgY291bGQgaG9sZCBvbnRvIHRoZSBub3QgdmlzaWJsZSBmaWVsZCBmb3IgZXh0cmEgZXJyb3IgcmVwb3J0aW5nCisJCXdoaWxlIChrZWVwTG9va2luZykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQkJaWYgKGludGVyZmFjZXNUb1Zpc2l0ID09IG51bGwpCisJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKwkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkwLAorCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQl9CisJCQlpZiAoKGN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUuc3VwZXJjbGFzcygpKSA9PSBudWxsKQorCQkJCWJyZWFrOworCisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFJlZmVyZW5jZShjdXJyZW50VHlwZS5jb21wb3VuZE5hbWUsIHR5cGVOYW1lKTsKKwkJCWlmICgobWVtYmVyVHlwZSA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGUodHlwZU5hbWUpKSAhPSBudWxsKSB7CisJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlKG1lbWJlclR5cGUpOyAvLyB0byByZWNvcmQgc3VwZXJ0eXBlcworCQkJCWtlZXBMb29raW5nID0gZmFsc2U7CisJCQkJaWYgKGVuY2xvc2luZ1NvdXJjZVR5cGUgPT0gbnVsbAorCQkJCQk/IG1lbWJlclR5cGUuY2FuQmVTZWVuQnkoY3VycmVudFBhY2thZ2UpCisJCQkJCTogbWVtYmVyVHlwZS5jYW5CZVNlZW5CeShlbmNsb3NpbmdUeXBlLCBlbmNsb3NpbmdTb3VyY2VUeXBlKSkgeworCQkJCQkJaWYgKHZpc2libGVNZW1iZXJUeXBlID09IG51bGwpCisJCQkJCQkJdmlzaWJsZU1lbWJlclR5cGUgPSBtZW1iZXJUeXBlOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcodHlwZU5hbWUsIEFtYmlndW91cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbm90VmlzaWJsZSA9IG1lbWJlclR5cGU7CisJCQkJfQorCQkJfQorCQl9CisJCS8vIHdhbGsgYWxsIHZpc2libGUgaW50ZXJmYWNlcyB0byBmaW5kIGFtYmlndW91cyByZWZlcmVuY2VzCisJCWlmIChpbnRlcmZhY2VzVG9WaXNpdCAhPSBudWxsKSB7CisJCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBhbWJpZ3VvdXMgPSBudWxsOworCQkJZG9uZSA6IGZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGFuSW50ZXJmYWNlID0gaW50ZXJmYWNlc1tqXTsKKwkJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeworCQkJCQkJLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZAorCQkJCQkJYW5JbnRlcmZhY2UudGFnQml0cyB8PSBJbnRlcmZhY2VWaXNpdGVkOworCQkJCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRSZWZlcmVuY2UoYW5JbnRlcmZhY2UuY29tcG91bmROYW1lLCB0eXBlTmFtZSk7CisJCQkJCQlpZiAoKG1lbWJlclR5cGUgPSBhbkludGVyZmFjZS5nZXRNZW1iZXJUeXBlKHR5cGVOYW1lKSkgIT0gbnVsbCkgeworCQkJCQkJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkVHlwZVJlZmVyZW5jZShtZW1iZXJUeXBlKTsgLy8gdG8gcmVjb3JkIHN1cGVydHlwZXMKKwkJCQkJCQlpZiAodmlzaWJsZU1lbWJlclR5cGUgPT0gbnVsbCkgeworCQkJCQkJCQl2aXNpYmxlTWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJYW1iaWd1b3VzID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBBbWJpZ3VvdXMpOworCQkJCQkJCQlicmVhayBkb25lOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24KKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykKKwkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOworCQkJfQorCQkJaWYgKGFtYmlndW91cyAhPSBudWxsKQorCQkJCXJldHVybiBhbWJpZ3VvdXM7CisJCX0KKwkJaWYgKHZpc2libGVNZW1iZXJUeXBlICE9IG51bGwpCisJCQlyZXR1cm4gdmlzaWJsZU1lbWJlclR5cGU7CisJCWlmIChub3RWaXNpYmxlICE9IG51bGwpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCBub3RWaXNpYmxlLCBOb3RWaXNpYmxlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwlwdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kTWV0aG9kKAorCQlSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJTWV0aG9kQmluZGluZyBtYXRjaGluZ01ldGhvZCA9IG51bGw7CisJCU9iamVjdFZlY3RvciBmb3VuZCA9IG5ldyBPYmplY3RWZWN0b3IoKTsKKworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UocmVjZWl2ZXJUeXBlKTsKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhhcmd1bWVudFR5cGVzKTsKKworCQlpZiAoY3VycmVudFR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CisJCQlpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnRNZXRob2RzLmxlbmd0aDsKKwkJCWlmIChjdXJyZW50TGVuZ3RoID09IDEpIHsKKwkJCQltYXRjaGluZ01ldGhvZCA9IGN1cnJlbnRNZXRob2RzWzBdOworCQkJfSBlbHNlIGlmIChjdXJyZW50TGVuZ3RoID4gMSkgeworCQkJCWZvdW5kLmFkZEFsbChjdXJyZW50TWV0aG9kcyk7CisJCQl9CisJCQltYXRjaGluZ01ldGhvZCA9IGZpbmRNZXRob2RJblN1cGVySW50ZXJmYWNlcyhjdXJyZW50VHlwZSwgc2VsZWN0b3IsIGZvdW5kLCBtYXRjaGluZ01ldGhvZCk7CisJCQljdXJyZW50VHlwZSA9IGdldEphdmFMYW5nT2JqZWN0KCk7CisJCX0KKworCQkvLyBzdXBlcmNsYXNzIGxvb2t1cAorCQlSZWZlcmVuY2VCaW5kaW5nIGNsYXNzSGllcmFyY2h5U3RhcnQgPSBjdXJyZW50VHlwZTsKKwkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKKwkJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50TWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpOworCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7CisJCQlpZiAoY3VycmVudExlbmd0aCA9PSAxICYmIG1hdGNoaW5nTWV0aG9kID09IG51bGwgJiYgZm91bmQuc2l6ZSA9PSAwKSB7CisJCQkJbWF0Y2hpbmdNZXRob2QgPSBjdXJyZW50TWV0aG9kc1swXTsKKwkJCX0gZWxzZSBpZiAoY3VycmVudExlbmd0aCA+IDApIHsKKwkJCQlpZiAobWF0Y2hpbmdNZXRob2QgIT0gbnVsbCkgeworCQkJCQlmb3VuZC5hZGQobWF0Y2hpbmdNZXRob2QpOworCQkJCQltYXRjaGluZ01ldGhvZCA9IG51bGw7CisJCQkJfQorCQkJCWZvdW5kLmFkZEFsbChjdXJyZW50TWV0aG9kcyk7CisJCQl9CisJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKKwkJfQorCisJCWludCBmb3VuZFNpemUgPSBmb3VuZC5zaXplOworCQlpZiAoZm91bmRTaXplID09IDApIHsKKwkJCWlmIChtYXRjaGluZ01ldGhvZCAhPSBudWxsICYmIGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1hdGNoaW5nTWV0aG9kLnBhcmFtZXRlcnMsIGFyZ3VtZW50VHlwZXMpKQorCQkJCXJldHVybiBtYXRjaGluZ01ldGhvZDsKKwkJCXJldHVybiBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBtYXRjaGluZ01ldGhvZCwgZm91bmQpOworCQl9CisKKwkJTWV0aG9kQmluZGluZ1tdIGNhbmRpZGF0ZXMgPSBuZXcgTWV0aG9kQmluZGluZ1tmb3VuZFNpemVdOworCQlpbnQgY2FuZGlkYXRlc0NvdW50ID0gMDsKKwkJLy8gYXJndW1lbnQgdHlwZSBjb21wYXRpYmlsaXR5IGNoZWNrCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChNZXRob2RCaW5kaW5nKSBmb3VuZC5lbGVtZW50QXQoaSk7CisJCQlpZiAoYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBhcmd1bWVudFR5cGVzKSkKKwkJCQljYW5kaWRhdGVzW2NhbmRpZGF0ZXNDb3VudCsrXSA9IG1ldGhvZEJpbmRpbmc7CisJCX0KKwkJaWYgKGNhbmRpZGF0ZXNDb3VudCA9PSAxKSB7CisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2VzKGNhbmRpZGF0ZXNbMF0udGhyb3duRXhjZXB0aW9ucyk7CisJCQlyZXR1cm4gY2FuZGlkYXRlc1swXTsgLy8gaGF2ZSBub3QgY2hlY2tlZCB2aXNpYmlsaXR5CisJCX0KKwkJaWYgKGNhbmRpZGF0ZXNDb3VudCA9PSAwKSB7IC8vIHRyeSB0byBmaW5kIGEgY2xvc2UgbWF0Y2ggd2hlbiB0aGUgcGFyYW1ldGVyIG9yZGVyIGlzIHdyb25nIG9yIG1pc3Npbmcgc29tZSBwYXJhbWV0ZXJzCisJCQlNZXRob2RCaW5kaW5nIGludGVyZmFjZU1ldGhvZCA9CisJCQkJZmluZERlZmF1bHRBYnN0cmFjdE1ldGhvZChyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgY2xhc3NIaWVyYXJjaHlTdGFydCwgbWF0Y2hpbmdNZXRob2QsIGZvdW5kKTsKKwkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZDsKKworCQkJaW50IGFyZ0xlbmd0aCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOworCQkJZm91bmRTaXplID0gZm91bmQuc2l6ZTsKKwkJCW5leHRNZXRob2QgOiBmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kU2l6ZTsgaSsrKSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpIGZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCQlUeXBlQmluZGluZ1tdIHBhcmFtcyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyczsKKwkJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbXMubGVuZ3RoOworCQkJCW5leHRBcmc6IGZvciAoaW50IGEgPSAwOyBhIDwgYXJnTGVuZ3RoOyBhKyspIHsKKwkJCQkJVHlwZUJpbmRpbmcgYXJnID0gYXJndW1lbnRUeXBlc1thXTsKKwkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwYXJhbUxlbmd0aDsgcCsrKQorCQkJCQkJaWYgKHBhcmFtc1twXSA9PSBhcmcpCisJCQkJCQkJY29udGludWUgbmV4dEFyZzsKKwkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQl9CisJCQkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CisJCQl9CisJCQlyZXR1cm4gKE1ldGhvZEJpbmRpbmcpIGZvdW5kLmVsZW1lbnRBdCgwKTsgLy8gbm8gZ29vZCBtYXRjaCBzbyBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kCisJCX0KKworCQkvLyB2aXNpYmlsaXR5IGNoZWNrCisJCWludCB2aXNpYmxlc0NvdW50ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzQ291bnQ7IGkrKykgeworCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gY2FuZGlkYXRlc1tpXTsKKwkJCWlmIChtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKSB7CisJCQkJaWYgKHZpc2libGVzQ291bnQgIT0gaSkgeworCQkJCQljYW5kaWRhdGVzW2ldID0gbnVsbDsKKwkJCQkJY2FuZGlkYXRlc1t2aXNpYmxlc0NvdW50XSA9IG1ldGhvZEJpbmRpbmc7CisJCQkJfQorCQkJCXZpc2libGVzQ291bnQrKzsKKwkJCX0KKwkJfQorCQlpZiAodmlzaWJsZXNDb3VudCA9PSAxKSB7CisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2VzKGNhbmRpZGF0ZXNbMF0udGhyb3duRXhjZXB0aW9ucyk7CisJCQlyZXR1cm4gY2FuZGlkYXRlc1swXTsKKwkJfQorCQlpZiAodmlzaWJsZXNDb3VudCA9PSAwKSB7CisJCQlNZXRob2RCaW5kaW5nIGludGVyZmFjZU1ldGhvZCA9CisJCQkJZmluZERlZmF1bHRBYnN0cmFjdE1ldGhvZChyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSwgY2xhc3NIaWVyYXJjaHlTdGFydCwgbWF0Y2hpbmdNZXRob2QsIGZvdW5kKTsKKwkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZDsKKwkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoY2FuZGlkYXRlc1swXS5zZWxlY3RvciwgYXJndW1lbnRUeXBlcywgY2FuZGlkYXRlc1swXS5kZWNsYXJpbmdDbGFzcywgTm90VmlzaWJsZSk7CisJCX0JCisJCWlmIChjYW5kaWRhdGVzWzBdLmRlY2xhcmluZ0NsYXNzLmlzQ2xhc3MoKSkgeworCQkJcmV0dXJuIG1vc3RTcGVjaWZpY0NsYXNzTWV0aG9kQmluZGluZyhjYW5kaWRhdGVzLCB2aXNpYmxlc0NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBtb3N0U3BlY2lmaWNJbnRlcmZhY2VNZXRob2RCaW5kaW5nKGNhbmRpZGF0ZXMsIHZpc2libGVzQ291bnQpOworCQl9CisJfQorCisJLy8gYWJzdHJhY3QgbWV0aG9kIGxvb2t1cCBsb29rdXAgKHNpbmNlIG1heWJlIG1pc3NpbmcgZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzKQorCXB1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmREZWZhdWx0QWJzdHJhY3RNZXRob2QoCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCAKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlLAorCQlSZWZlcmVuY2VCaW5kaW5nIGNsYXNzSGllcmFyY2h5U3RhcnQsCisJCU1ldGhvZEJpbmRpbmcgbWF0Y2hpbmdNZXRob2QsCisJCU9iamVjdFZlY3RvciBmb3VuZCkgeworCisJCWludCBzdGFydEZvdW5kU2l6ZSA9IGZvdW5kLnNpemU7CisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBjbGFzc0hpZXJhcmNoeVN0YXJ0OworCQl3aGlsZSAoY3VycmVudFR5cGUgIT0gbnVsbCkgeworCQkJbWF0Y2hpbmdNZXRob2QgPSBmaW5kTWV0aG9kSW5TdXBlckludGVyZmFjZXMoY3VycmVudFR5cGUsIHNlbGVjdG9yLCBmb3VuZCwgbWF0Y2hpbmdNZXRob2QpOworCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisJCX0KKwkJaW50IGZvdW5kU2l6ZSA9IGZvdW5kLnNpemU7CisJCWlmIChmb3VuZFNpemUgPT0gc3RhcnRGb3VuZFNpemUpIHJldHVybiBtYXRjaGluZ01ldGhvZDsgLy8gbWF5YmUgbnVsbAorCisJCU1ldGhvZEJpbmRpbmdbXSBjYW5kaWRhdGVzID0gbmV3IE1ldGhvZEJpbmRpbmdbZm91bmRTaXplIC0gc3RhcnRGb3VuZFNpemVdOworCQlpbnQgY2FuZGlkYXRlc0NvdW50ID0gMDsKKwkJLy8gYXJndW1lbnQgdHlwZSBjb21wYXRpYmlsaXR5IGNoZWNrCisJCWZvciAoaW50IGkgPSBzdGFydEZvdW5kU2l6ZTsgaSA8IGZvdW5kU2l6ZTsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KGkpOworCQkJaWYgKGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpCisJCQkJY2FuZGlkYXRlc1tjYW5kaWRhdGVzQ291bnQrK10gPSBtZXRob2RCaW5kaW5nOworCQl9CisJCWlmIChjYW5kaWRhdGVzQ291bnQgPT0gMSkgeworCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhjYW5kaWRhdGVzWzBdLnRocm93bkV4Y2VwdGlvbnMpOworCQkJcmV0dXJuIGNhbmRpZGF0ZXNbMF07IAorCQl9CisJCWlmIChjYW5kaWRhdGVzQ291bnQgPT0gMCkgeyAvLyB0cnkgdG8gZmluZCBhIGNsb3NlIG1hdGNoIHdoZW4gdGhlIHBhcmFtZXRlciBvcmRlciBpcyB3cm9uZyBvciBtaXNzaW5nIHNvbWUgcGFyYW1ldGVycworCQkJaW50IGFyZ0xlbmd0aCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOworCQkJbmV4dE1ldGhvZCA6IGZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KGkpOworCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1zID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzOworCQkJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisJCQkJbmV4dEFyZzogZm9yIChpbnQgYSA9IDA7IGEgPCBhcmdMZW5ndGg7IGErKykgeworCQkJCQlUeXBlQmluZGluZyBhcmcgPSBhcmd1bWVudFR5cGVzW2FdOworCQkJCQlmb3IgKGludCBwID0gMDsgcCA8IHBhcmFtTGVuZ3RoOyBwKyspCisJCQkJCQlpZiAocGFyYW1zW3BdID09IGFyZykKKwkJCQkJCQljb250aW51ZSBuZXh0QXJnOworCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCX0KKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwkJCX0KKwkJCXJldHVybiAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KDApOyAvLyBubyBnb29kIG1hdGNoIHNvIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgZm91bmQKKwkJfQorCQkvLyBubyBuZWVkIHRvIGNoZWNrIGZvciB2aXNpYmlsaXR5IC0gaW50ZXJmYWNlIG1ldGhvZHMgYXJlIHB1YmxpYworCQlyZXR1cm4gbW9zdFNwZWNpZmljSW50ZXJmYWNlTWV0aG9kQmluZGluZyhjYW5kaWRhdGVzLCBjYW5kaWRhdGVzQ291bnQpOworCX0KKworCXB1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmRNZXRob2RJblN1cGVySW50ZXJmYWNlcygKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwKKwkJY2hhcltdIHNlbGVjdG9yLAorCQlPYmplY3RWZWN0b3IgZm91bmQsCisJCU1ldGhvZEJpbmRpbmcgbWF0Y2hpbmdNZXRob2QpIHsKKworCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IGN1cnJlbnRUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOworCQkJaW50IGxhc3RQb3NpdGlvbiA9IC0xOworCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlpbnRlcmZhY2VzVG9WaXNpdCwgMCwKKwkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLAorCQkJCQlsYXN0UG9zaXRpb24pOworCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQljdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal07CisJCQkJCWlmICgoY3VycmVudFR5cGUudGFnQml0cyAmIEludGVyZmFjZVZpc2l0ZWQpID09IDApIHsKKwkJCQkJCS8vIGlmIGludGVyZmFjZSBhcyBub3QgYWxyZWFkeSBiZWVuIHZpc2l0ZWQKKwkJCQkJCWN1cnJlbnRUeXBlLnRhZ0JpdHMgfD0gSW50ZXJmYWNlVmlzaXRlZDsKKworCQkJCQkJTWV0aG9kQmluZGluZ1tdIGN1cnJlbnRNZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcyhzZWxlY3Rvcik7CisJCQkJCQlpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnRNZXRob2RzLmxlbmd0aDsKKwkJCQkJCWlmIChjdXJyZW50TGVuZ3RoID09IDEgJiYgbWF0Y2hpbmdNZXRob2QgPT0gbnVsbCAmJiBmb3VuZC5zaXplID09IDApIHsKKwkJCQkJCQltYXRjaGluZ01ldGhvZCA9IGN1cnJlbnRNZXRob2RzWzBdOworCQkJCQkJfSBlbHNlIGlmIChjdXJyZW50TGVuZ3RoID4gMCkgeworCQkJCQkJCWlmIChtYXRjaGluZ01ldGhvZCAhPSBudWxsKSB7CisJCQkJCQkJCWZvdW5kLmFkZChtYXRjaGluZ01ldGhvZCk7CisJCQkJCQkJCW1hdGNoaW5nTWV0aG9kID0gbnVsbDsKKwkJCQkJCQl9CisJCQkJCQkJZm91bmQuYWRkQWxsKGN1cnJlbnRNZXRob2RzKTsKKwkJCQkJCX0KKwkJCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LCAwLAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLAorCQkJCQkJCQkJbGFzdFBvc2l0aW9uKTsKKwkJCQkJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24KKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykKKwkJCQkJaW50ZXJmYWNlc1tqXS50YWdCaXRzICY9IH5JbnRlcmZhY2VWaXNpdGVkOworCQkJfQorCQl9CisJCXJldHVybiBtYXRjaGluZ01ldGhvZDsKKwl9CisJCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwlwdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kTWV0aG9kRm9yQXJyYXkoCisJCUFycmF5QmluZGluZyByZWNlaXZlclR5cGUsCisJCWNoYXJbXSBzZWxlY3RvciwKKwkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCVJlZmVyZW5jZUJpbmRpbmcgb2JqZWN0ID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gb2JqZWN0LmdldEV4YWN0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzKTsKKwkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgeworCQkJLy8gaGFuZGxlIHRoZSBtZXRob2QgY2xvbmUoKSBzcGVjaWFsbHkuLi4gY2Fubm90IGJlIHByb3RlY3RlZCBvciB0aHJvdyBleGNlcHRpb25zCisJCQlpZiAoYXJndW1lbnRUeXBlcyA9PSBOb1BhcmFtZXRlcnMgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIENMT05FKSkKKwkJCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmcoCisJCQkJCShtZXRob2RCaW5kaW5nLm1vZGlmaWVycyBeIEFjY1Byb3RlY3RlZCkgfCBBY2NQdWJsaWMsCisJCQkJCUNMT05FLAorCQkJCQltZXRob2RCaW5kaW5nLnJldHVyblR5cGUsCisJCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJCW51bGwsCisJCQkJCW9iamVjdCk7CisJCQlpZiAobWV0aG9kQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwkJfQorCQkvLyBhbnN3ZXJzIGNsb3Nlc3QgYXBwcm94aW1hdGlvbiwgbWF5IG5vdCBjaGVjayBhcmd1bWVudFR5cGVzIG9yIHZpc2liaWxpdHkKKwkJbWV0aG9kQmluZGluZyA9IGZpbmRNZXRob2Qob2JqZWN0LCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOworCQlpZiAobWV0aG9kQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlpZiAoIWFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQkJbWV0aG9kQmluZGluZywKKwkJCQkJc2VsZWN0b3IsCisJCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJCU5vdEZvdW5kKTsKKwkJCWlmICghbWV0aG9kQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCQlzZWxlY3RvciwKKwkJCQkJYXJndW1lbnRUeXBlcywKKwkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJTm90VmlzaWJsZSk7CisJCX0KKwkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBmaW5kVHlwZSgKKwkJY2hhcltdIHR5cGVOYW1lLAorCQlQYWNrYWdlQmluZGluZyBkZWNsYXJhdGlvblBhY2thZ2UsCisJCVBhY2thZ2VCaW5kaW5nIGludm9jYXRpb25QYWNrYWdlKSB7CisKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRSZWZlcmVuY2UoZGVjbGFyYXRpb25QYWNrYWdlLmNvbXBvdW5kTmFtZSwgdHlwZU5hbWUpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gZGVjbGFyYXRpb25QYWNrYWdlLmdldFR5cGUodHlwZU5hbWUpOworCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICh0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisvLyBOb3QgY29udmluY2VkIHRoYXQgdGhpcyBpcyBuZWNlc3NhcnkKKy8vCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlKHR5cGVCaW5kaW5nKTsgLy8gdG8gcmVjb3JkIHN1cGVydHlwZXMKKwkJCWlmIChkZWNsYXJhdGlvblBhY2thZ2UgIT0gaW52b2NhdGlvblBhY2thZ2UgJiYgIXR5cGVCaW5kaW5nLmNhbkJlU2VlbkJ5KGludm9jYXRpb25QYWNrYWdlKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCB0eXBlQmluZGluZywgTm90VmlzaWJsZSk7CisJCX0KKwkJcmV0dXJuIHR5cGVCaW5kaW5nOworCX0KKworCXB1YmxpYyBUeXBlQmluZGluZyBnZXRCYXNlVHlwZShjaGFyW10gbmFtZSkgeworCQkvLyBsaXN0IHNob3VsZCBiZSBvcHRpbWl6ZWQgKHdpdGggbW9zdCBvZnRlbiB1c2VkIGZpcnN0KQorCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7CisJCWlmIChsZW5ndGggPiAyICYmIGxlbmd0aCA8IDgpIHsKKwkJCXN3aXRjaCAobmFtZVswXSkgeworCQkJCWNhc2UgJ2knIDoKKwkJCQkJaWYgKGxlbmd0aCA9PSAzICYmIG5hbWVbMV0gPT0gJ24nICYmIG5hbWVbMl0gPT0gJ3QnKQorCQkJCQkJcmV0dXJuIEludEJpbmRpbmc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3YnIDoKKwkJCQkJaWYgKGxlbmd0aCA9PSA0ICYmIG5hbWVbMV0gPT0gJ28nICYmIG5hbWVbMl0gPT0gJ2knICYmIG5hbWVbM10gPT0gJ2QnKQorCQkJCQkJcmV0dXJuIFZvaWRCaW5kaW5nOworCQkJCQlicmVhazsKKwkJCQljYXNlICdiJyA6CisJCQkJCWlmIChsZW5ndGggPT0gNworCQkJCQkJJiYgbmFtZVsxXSA9PSAnbycKKwkJCQkJCSYmIG5hbWVbMl0gPT0gJ28nCisJCQkJCQkmJiBuYW1lWzNdID09ICdsJworCQkJCQkJJiYgbmFtZVs0XSA9PSAnZScKKwkJCQkJCSYmIG5hbWVbNV0gPT0gJ2EnCisJCQkJCQkmJiBuYW1lWzZdID09ICduJykKKwkJCQkJCXJldHVybiBCb29sZWFuQmluZGluZzsKKwkJCQkJaWYgKGxlbmd0aCA9PSA0ICYmIG5hbWVbMV0gPT0gJ3knICYmIG5hbWVbMl0gPT0gJ3QnICYmIG5hbWVbM10gPT0gJ2UnKQorCQkJCQkJcmV0dXJuIEJ5dGVCaW5kaW5nOworCQkJCQlicmVhazsKKwkJCQljYXNlICdjJyA6CisJCQkJCWlmIChsZW5ndGggPT0gNCAmJiBuYW1lWzFdID09ICdoJyAmJiBuYW1lWzJdID09ICdhJyAmJiBuYW1lWzNdID09ICdyJykKKwkJCQkJCXJldHVybiBDaGFyQmluZGluZzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZCcgOgorCQkJCQlpZiAobGVuZ3RoID09IDYKKwkJCQkJCSYmIG5hbWVbMV0gPT0gJ28nCisJCQkJCQkmJiBuYW1lWzJdID09ICd1JworCQkJCQkJJiYgbmFtZVszXSA9PSAnYicKKwkJCQkJCSYmIG5hbWVbNF0gPT0gJ2wnCisJCQkJCQkmJiBuYW1lWzVdID09ICdlJykKKwkJCQkJCXJldHVybiBEb3VibGVCaW5kaW5nOworCQkJCQlicmVhazsKKwkJCQljYXNlICdmJyA6CisJCQkJCWlmIChsZW5ndGggPT0gNQorCQkJCQkJJiYgbmFtZVsxXSA9PSAnbCcKKwkJCQkJCSYmIG5hbWVbMl0gPT0gJ28nCisJCQkJCQkmJiBuYW1lWzNdID09ICdhJworCQkJCQkJJiYgbmFtZVs0XSA9PSAndCcpCisJCQkJCQlyZXR1cm4gRmxvYXRCaW5kaW5nOworCQkJCQlicmVhazsKKwkJCQljYXNlICdsJyA6CisJCQkJCWlmIChsZW5ndGggPT0gNCAmJiBuYW1lWzFdID09ICdvJyAmJiBuYW1lWzJdID09ICduJyAmJiBuYW1lWzNdID09ICdnJykKKwkJCQkJCXJldHVybiBMb25nQmluZGluZzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAncycgOgorCQkJCQlpZiAobGVuZ3RoID09IDUKKwkJCQkJCSYmIG5hbWVbMV0gPT0gJ2gnCisJCQkJCQkmJiBuYW1lWzJdID09ICdvJworCQkJCQkJJiYgbmFtZVszXSA9PSAncicKKwkJCQkJCSYmIG5hbWVbNF0gPT0gJ3QnKQorCQkJCQkJcmV0dXJuIFNob3J0QmluZGluZzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgZmluYWwgUGFja2FnZUJpbmRpbmcgZ2V0Q3VycmVudFBhY2thZ2UoKSB7CisJCVNjb3BlIHNjb3BlLCB1bml0U2NvcGUgPSB0aGlzOworCQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkKKwkJCXVuaXRTY29wZSA9IHNjb3BlOworCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXRTY29wZSkgdW5pdFNjb3BlKS5mUGFja2FnZTsKKwl9CisKKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhSW9TZXJpYWxpemFibGUoKSB7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfSU9fU0VSSUFMSVpBQkxFKTsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfSU9fU0VSSUFMSVpBQkxFKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CisJCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdChKQVZBX0lPX1NFUklBTElaQUJMRSwgcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOworCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24KKwl9CisKKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0NsYXNzKCkgeworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfQ0xBU1MpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX0NMQVNTKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CisJCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdChKQVZBX0xBTkdfQ0xBU1MsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsKKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uCisJfQorCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdDbG9uZWFibGUoKSB7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19DTE9ORUFCTEUpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX0NMT05FQUJMRSk7CisJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOworCQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX0NMT05FQUJMRSwgcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOworCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24KKwl9CisKKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ0Vycm9yKCkgeworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfRVJST1IpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX0VSUk9SKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CisJCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdChKQVZBX0xBTkdfRVJST1IsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsKKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uCisJfQorCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpIHsKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SKTsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUik7CisJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOworCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX0FTU0VSVElPTkVSUk9SLCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7CisJCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbgorCX0KKworCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldEphdmFMYW5nT2JqZWN0KCkgeworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfT0JKRUNUKTsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZW52aXJvbm1lbnQoKS5nZXRUeXBlKEpBVkFfTEFOR19PQkpFQ1QpOworCQlpZiAodHlwZSAhPSBudWxsKSByZXR1cm4gdHlwZTsKKwkKKwkJcHJvYmxlbVJlcG9ydGVyKCkuaXNDbGFzc1BhdGhDb3JyZWN0KEpBVkFfTEFOR19PQkpFQ1QsIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsKKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uCisJfQorCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkgeworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFF1YWxpZmllZFJlZmVyZW5jZShKQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTik7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfUlVOVElNRUVYQ0VQVElPTik7CisJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOworCQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpKTsKKwkJcmV0dXJuIG51bGw7IC8vIHdpbGwgbm90IGdldCBoZXJlIHNpbmNlIHRoZSBhYm92ZSBlcnJvciBhYm9ydHMgdGhlIGNvbXBpbGF0aW9uCisJfQorCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZUJpbmRpbmcgZ2V0SmF2YUxhbmdTdHJpbmcoKSB7CisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkUXVhbGlmaWVkUmVmZXJlbmNlKEpBVkFfTEFOR19TVFJJTkcpOworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBlbnZpcm9ubWVudCgpLmdldFR5cGUoSkFWQV9MQU5HX1NUUklORyk7CisJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOworCQorCQlwcm9ibGVtUmVwb3J0ZXIoKS5pc0NsYXNzUGF0aENvcnJlY3QoSkFWQV9MQU5HX1NUUklORywgcmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkpOworCQlyZXR1cm4gbnVsbDsgLy8gd2lsbCBub3QgZ2V0IGhlcmUgc2luY2UgdGhlIGFib3ZlIGVycm9yIGFib3J0cyB0aGUgY29tcGlsYXRpb24KKwl9CisKKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlQmluZGluZyBnZXRKYXZhTGFuZ1Rocm93YWJsZSgpIHsKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoSkFWQV9MQU5HX1RIUk9XQUJMRSk7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGVudmlyb25tZW50KCkuZ2V0VHlwZShKQVZBX0xBTkdfVEhST1dBQkxFKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CisJCisJCXByb2JsZW1SZXBvcnRlcigpLmlzQ2xhc3NQYXRoQ29ycmVjdChKQVZBX0xBTkdfVEhST1dBQkxFLCByZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKSk7CisJCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbgorCX0KKworCS8qIEFuc3dlciB0aGUgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGVOYW1lIGFyZ3VtZW50LCByZWxhdGl2ZSB0byB0aGUgZW5jbG9zaW5nVHlwZS4KKwkqLworCXB1YmxpYyBmaW5hbCBSZWZlcmVuY2VCaW5kaW5nIGdldE1lbWJlclR5cGUoY2hhcltdIHR5cGVOYW1lLCBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwkJUmVmZXJlbmNlQmluZGluZyBtZW1iZXJUeXBlID0gZmluZE1lbWJlclR5cGUodHlwZU5hbWUsIGVuY2xvc2luZ1R5cGUpOworCQlpZiAobWVtYmVyVHlwZSAhPSBudWxsKSByZXR1cm4gbWVtYmVyVHlwZTsKKwkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyh0eXBlTmFtZSwgTm90Rm91bmQpOworCX0KKworCS8qIEFuc3dlciB0aGUgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvdW5kTmFtZS4KKwkqCisJKiBOT1RFOiBJZiBhIHByb2JsZW0gYmluZGluZyBpcyByZXR1cm5lZCwgc2VuZGVycyBzaG91bGQgZXh0cmFjdCB0aGUgY29tcG91bmQgbmFtZQorCSogZnJvbSB0aGUgYmluZGluZyAmIG5vdCBhc3N1bWUgdGhlIHByb2JsZW0gYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvdW5kTmFtZS4KKwkqLworCXB1YmxpYyBmaW5hbCBUeXBlQmluZGluZyBnZXRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCQlpbnQgdHlwZU5hbWVMZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCQlpZiAodHlwZU5hbWVMZW5ndGggPT0gMSkgeworCQkJLy8gV291bGQgbGlrZSB0byByZW1vdmUgdGhpcyB0ZXN0IGFuZCByZXF1aXJlIHNlbmRlcnMgdG8gc3BlY2lhbGx5IGhhbmRsZSBiYXNlIHR5cGVzCisJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gZ2V0QmFzZVR5cGUoY29tcG91bmROYW1lWzBdKTsKKwkJCWlmIChiaW5kaW5nICE9IG51bGwpIHJldHVybiBiaW5kaW5nOworCQl9CisKKwkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRRdWFsaWZpZWRSZWZlcmVuY2UoY29tcG91bmROYW1lKTsKKwkJQmluZGluZyBiaW5kaW5nID0KKwkJCWdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lWzBdLCB0eXBlTmFtZUxlbmd0aCA9PSAxID8gVFlQRSA6IFRZUEUgfCBQQUNLQUdFKTsKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoY29tcG91bmROYW1lWzBdLCBOb3RGb3VuZCk7CisJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJcmV0dXJuIChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCisJCWludCBjdXJyZW50SW5kZXggPSAxOworCQlib29sZWFuIGNoZWNrVmlzaWJpbGl0eSA9IGZhbHNlOworCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJCXdoaWxlIChjdXJyZW50SW5kZXggPCB0eXBlTmFtZUxlbmd0aCkgeworCQkJCWJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRUeXBlT3JQYWNrYWdlKGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK10pOyAvLyBkb2VzIG5vdCBjaGVjayB2aXNpYmlsaXR5CisJCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQkJTm90Rm91bmQpOworCQkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQliaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpKQorCQkJCQlicmVhazsKKwkJCQlwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKwkJCX0KKwkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCU5vdEZvdW5kKTsKKwkJCWNoZWNrVmlzaWJpbGl0eSA9IHRydWU7CisJCX0KKworCQkvLyBiaW5kaW5nIGlzIG5vdyBhIFJlZmVyZW5jZUJpbmRpbmcKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UodHlwZUJpbmRpbmcpOyAvLyB0byByZWNvcmQgc3VwZXJ0eXBlcworCQlpZiAoY2hlY2tWaXNpYmlsaXR5KSAvLyBoYW5kbGVzIHRoZSBmYWxsIHRocm91Z2ggY2FzZQorCQkJaWYgKCF0eXBlQmluZGluZy5jYW5CZVNlZW5CeSh0aGlzKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJdHlwZUJpbmRpbmcsCisJCQkJCU5vdFZpc2libGUpOworCisJCXdoaWxlIChjdXJyZW50SW5kZXggPCB0eXBlTmFtZUxlbmd0aCkgeworCQkJdHlwZUJpbmRpbmcgPSBnZXRNZW1iZXJUeXBlKGNvbXBvdW5kTmFtZVtjdXJyZW50SW5kZXgrK10sIHR5cGVCaW5kaW5nKTsKKwkJCWlmICghdHlwZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJdHlwZUJpbmRpbmcucHJvYmxlbUlkKCkpOworCQl9CisJCXJldHVybiB0eXBlQmluZGluZzsKKwl9CisKKwkvKiBBbnN3ZXIgdGhlIHR5cGUgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRoZSBnaXZlbiBuYW1lLCBzdGFydGluZyB0aGUgbG9va3VwIGluIHRoZSByZWNlaXZlci4KKwkqIFRoZSBuYW1lIHByb3ZpZGVkIGlzIGEgc2ltcGxlIHNvdXJjZSBuYW1lIChlLmcuLCAiT2JqZWN0IiAsICJQb2ludCIsIC4uLikKKwkqLworCS8vIFRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBjb3VsZCBiZSBSZWZlcmVuY2VCaW5kaW5nIGlmIHdlIGRpZCBub3QgYW5zd2VyIGJhc2UgdHlwZXMuCisJLy8gTk9URTogV2UgY291bGQgc3VwcG9ydCBsb29raW5nIGZvciBCYXNlIFR5cGVzIGxhc3QgaW4gdGhlIHNlYXJjaCwgaG93ZXZlciBhbnkgY29kZSB1c2luZworCS8vIHRoaXMgZmVhdHVyZSB3b3VsZCBiZSBleHRyYW9yZGluYXJpbHkgc2xvdy4gIFRoZXJlZm9yZSB3ZSBkb24ndCBkbyB0aGlzCisJcHVibGljIGZpbmFsIFR5cGVCaW5kaW5nIGdldFR5cGUoY2hhcltdIG5hbWUpIHsKKwkJLy8gV291bGQgbGlrZSB0byByZW1vdmUgdGhpcyB0ZXN0IGFuZCByZXF1aXJlIHNlbmRlcnMgdG8gc3BlY2lhbGx5IGhhbmRsZSBiYXNlIHR5cGVzCisJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBnZXRCYXNlVHlwZShuYW1lKTsKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgcmV0dXJuIGJpbmRpbmc7CisJCXJldHVybiAoUmVmZXJlbmNlQmluZGluZykgZ2V0VHlwZU9yUGFja2FnZShuYW1lLCBUWVBFKTsKKwl9CisKKwkvLyBBZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gTk9UIFB1YmxpYyBBUEkKKwlwdWJsaWMgZmluYWwgQmluZGluZyBnZXRUeXBlT3JQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCQlpbnQgbmFtZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGg7CisJCWlmIChuYW1lTGVuZ3RoID09IDEpIHsKKwkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBnZXRCYXNlVHlwZShjb21wb3VuZE5hbWVbMF0pOworCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgcmV0dXJuIGJpbmRpbmc7CisJCX0KKwkJQmluZGluZyBiaW5kaW5nID0gZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbMF0sIFRZUEUgfCBQQUNLQUdFKTsKKwkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiBiaW5kaW5nOworCisJCWludCBjdXJyZW50SW5kZXggPSAxOworCQlib29sZWFuIGNoZWNrVmlzaWJpbGl0eSA9IGZhbHNlOworCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CisJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChQYWNrYWdlQmluZGluZykgYmluZGluZzsKKworCQkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IG5hbWVMZW5ndGgpIHsKKwkJCQliaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0VHlwZU9yUGFja2FnZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdKTsKKwkJCQlpZiAoYmluZGluZyA9PSBudWxsKQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKAorCQkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksCisJCQkJCQlOb3RGb3VuZCk7CisJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwKKwkJCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkpOworCQkJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykpCisJCQkJCWJyZWFrOworCQkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQkJfQorCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQYWNrYWdlQmluZGluZykgcmV0dXJuIGJpbmRpbmc7CisJCQljaGVja1Zpc2liaWxpdHkgPSB0cnVlOworCQl9CisJCS8vIGJpbmRpbmcgaXMgbm93IGEgUmVmZXJlbmNlQmluZGluZworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmc7CisJCWlmIChjaGVja1Zpc2liaWxpdHkpIC8vIGhhbmRsZXMgdGhlIGZhbGwgdGhyb3VnaCBjYXNlCisJCQlpZiAoIXR5cGVCaW5kaW5nLmNhbkJlU2VlbkJ5KHRoaXMpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQl0eXBlQmluZGluZywKKwkJCQkJTm90VmlzaWJsZSk7CisKKwkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IG5hbWVMZW5ndGgpIHsKKwkJCXR5cGVCaW5kaW5nID0gZ2V0TWVtYmVyVHlwZShjb21wb3VuZE5hbWVbY3VycmVudEluZGV4KytdLCB0eXBlQmluZGluZyk7CisJCQkvLyBjaGVja3MgdmlzaWJpbGl0eQorCQkJaWYgKCF0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLAorCQkJCQl0eXBlQmluZGluZy5wcm9ibGVtSWQoKSk7CisJCX0KKwkJcmV0dXJuIHR5cGVCaW5kaW5nOworCX0KKworCS8qIEludGVybmFsIHVzZSBvbmx5IAorCSovCisJZmluYWwgQmluZGluZyBnZXRUeXBlT3JQYWNrYWdlKGNoYXJbXSBuYW1lLCBpbnQgbWFzaykgeworCQkKKwkJU2NvcGUgc2NvcGUgPSB0aGlzOworCQlSZWZlcmVuY2VCaW5kaW5nIGZvdW5kVHlwZSA9IG51bGw7CisJCWlmICgobWFzayAmIFRZUEUpID09IDApIHsKKwkJCVNjb3BlIG5leHQgPSBzY29wZTsKKwkJCXdoaWxlICgobmV4dCA9IHNjb3BlLnBhcmVudCkgIT0gbnVsbCkKKwkJCQlzY29wZSA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQlkb25lIDogd2hpbGUgKHRydWUpIHsgLy8gZG9uZSB3aGVuIGEgQ09NUElMQVRJT05fVU5JVF9TQ09QRSBpcyBmb3VuZAorCQkJCXN3aXRjaCAoc2NvcGUua2luZCkgeworCQkJCQljYXNlIE1FVEhPRF9TQ09QRSA6CisJCQkJCWNhc2UgQkxPQ0tfU0NPUEUgOgorCQkJCQkJUmVmZXJlbmNlQmluZGluZyBsb2NhbFR5cGUgPSAoKEJsb2NrU2NvcGUpIHNjb3BlKS5maW5kTG9jYWxUeXBlKG5hbWUpOyAvLyBsb29rcyBpbiB0aGlzIHNjb3BlIG9ubHkKKwkJCQkJCWlmIChsb2NhbFR5cGUgIT0gbnVsbCkgeworCQkJCQkJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCAmJiBmb3VuZFR5cGUgIT0gbG9jYWxUeXBlKQorCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCXJldHVybiBsb2NhbFR5cGU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDTEFTU19TQ09QRSA6CisJCQkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOworCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNvdXJjZVR5cGUuc291cmNlTmFtZSwgbmFtZSkpIHsKKwkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG51bGwgJiYgZm91bmRUeXBlICE9IHNvdXJjZVR5cGUpCisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CisJCQkJCQkJcmV0dXJuIHNvdXJjZVR5cGU7CisJCQkJCQl9CisKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGZpbmRNZW1iZXJUeXBlKG5hbWUsIHNvdXJjZVR5cGUpOworCQkJCQkJaWYgKG1lbWJlclR5cGUgIT0gbnVsbCkgeyAvLyBza2lwIGl0IGlmIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZworCQkJCQkJCWlmIChtZW1iZXJUeXBlLnByb2JsZW1JZCgpID09IEFtYmlndW91cykgeworCQkJCQkJCQlpZiAoZm91bmRUeXBlID09IG51bGwgfHwgZm91bmRUeXBlLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpCisJCQkJCQkJCQkvLyBzdXBlcmNlZGVzIGFueSBwb3RlbnRpYWwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSBwcm9ibGVtCisJCQkJCQkJCQlyZXR1cm4gbWVtYmVyVHlwZTsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJLy8gbWFrZSB0aGUgdXNlciBxdWFsaWZ5IHRoZSB0eXBlLCBsaWtlbHkgd2FudHMgdGhlIGZpcnN0IGluaGVyaXRlZCB0eXBlCisJCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAobWVtYmVyVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQkJCWlmIChzb3VyY2VUeXBlID09IG1lbWJlclR5cGUuZW5jbG9zaW5nVHlwZSgpCisJCQkJCQkJCQl8fCBlbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpIHsKKwkJCQkJCQkJCS8vIGZvdW5kIGEgdmFsaWQgdHlwZSBpbiB0aGUgJ2ltbWVkaWF0ZScgc2NvcGUgKGllLiBub3QgaW5oZXJpdGVkKQorCQkJCQkJCQkJLy8gT1IgaW4gMS40IG1vZGUgKGluaGVyaXRlZCBzaGFkb3dzIGVuY2xvc2luZykKKwkJCQkJCQkJCWlmIChmb3VuZFR5cGUgPT0gbnVsbCkKKwkJCQkJCQkJCQlyZXR1cm4gbWVtYmVyVHlwZTsKKwkJCQkJCQkJCWlmIChmb3VuZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkKKwkJCQkJCQkJCQkvLyBpZiBhIHZhbGlkIHR5cGUgd2FzIGZvdW5kLCBjb21wbGFpbiB3aGVuIGFub3RoZXIgaXMgZm91bmQgaW4gYW4gJ2ltbWVkaWF0ZScgZW5jbG9zaW5nIHR5cGUgKGllLiBub3QgaW5oZXJpdGVkKQorCQkJCQkJCQkJCWlmIChmb3VuZFR5cGUgIT0gbWVtYmVyVHlwZSkKKwkJCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiAoZm91bmRUeXBlID09IG51bGwgfHwgKGZvdW5kVHlwZS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlICYmIG1lbWJlclR5cGUucHJvYmxlbUlkKCkgIT0gTm90VmlzaWJsZSkpCisJCQkJCQkJCS8vIG9ubHkgcmVtZW1iZXIgdGhlIG1lbWJlclR5cGUgaWYgaXRzIHRoZSBmaXJzdCBvbmUgZm91bmQgb3IgdGhlIHByZXZpb3VzIG9uZSB3YXMgbm90IHZpc2libGUgJiBtZW1iZXJUeXBlIGlzLi4uCisJCQkJCQkJCWZvdW5kVHlwZSA9IG1lbWJlclR5cGU7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDT01QSUxBVElPTl9VTklUX1NDT1BFIDoKKwkJCQkJCWJyZWFrIGRvbmU7CisJCQkJfQorCQkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQkJfQorCQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsICYmIGZvdW5kVHlwZS5wcm9ibGVtSWQoKSAhPSBOb3RWaXNpYmxlKQorCQkJCXJldHVybiBmb3VuZFR5cGU7CisJCX0KKworCQkvLyBhdCB0aGlzIHBvaW50IHRoZSBzY29wZSBpcyBhIGNvbXBpbGF0aW9uIHVuaXQgc2NvcGUKKwkJQ29tcGlsYXRpb25Vbml0U2NvcGUgdW5pdFNjb3BlID0gKENvbXBpbGF0aW9uVW5pdFNjb3BlKSBzY29wZTsKKwkJLy8gYXNrIGZvciB0aGUgaW1wb3J0cyArIG5hbWUKKwkJaWYgKChtYXNrICYgVFlQRSkgIT0gMCkgeworCQkJLy8gY2hlY2sgc2luZ2xlIHR5cGUgaW1wb3J0cy4KKwkJCUltcG9ydEJpbmRpbmdbXSBpbXBvcnRzID0gdW5pdFNjb3BlLmltcG9ydHM7CisJCQlpZiAoaW1wb3J0cyAhPSBudWxsKXsKKwkJCQkvLyBjb3B5IHRoZSBsaXN0LCBzaW5jZSBzaW5nbGUgdHlwZSBpbXBvcnRzIGFyZSByZW1vdmVkIGlmIHRoZXkgY2Fubm90IGJlIHJlc29sdmVkCisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGltcG9ydHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSW1wb3J0QmluZGluZyB0eXBlSW1wb3J0ID0gaW1wb3J0c1tpXTsKKwkJCQkJaWYgKCF0eXBlSW1wb3J0Lm9uRGVtYW5kKQorCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHR5cGVJbXBvcnQuY29tcG91bmROYW1lW3R5cGVJbXBvcnQuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLCBuYW1lKSkKKwkJCQkJCQlpZiAodW5pdFNjb3BlLnJlc29sdmVTaW5nbGVUeXBlSW1wb3J0KHR5cGVJbXBvcnQpICE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKHR5cGVJbXBvcnQucmVmZXJlbmNlICE9IG51bGwpIHR5cGVJbXBvcnQucmVmZXJlbmNlLnVzZWQgPSB0cnVlOworCQkJCQkJCQlyZXR1cm4gdHlwZUltcG9ydC5yZXNvbHZlZEltcG9ydDsgLy8gYWxyZWFkeSBrbm93IGl0cyB2aXNpYmxlCisJCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIGNoZWNrIGlmIHRoZSBuYW1lIGlzIGluIHRoZSBjdXJyZW50IHBhY2thZ2UgKGFuc3dlciB0aGUgcHJvYmxlbSBiaW5kaW5nIHVubGVzcyBpdHMgbm90IGZvdW5kIGluIHdoaWNoIGNhc2UgY29udGludWUgdG8gbG9vaykKKwkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IGZpbmRUeXBlKG5hbWUsIHVuaXRTY29wZS5mUGFja2FnZSwgdW5pdFNjb3BlLmZQYWNrYWdlKTsgLy8gaXMgYWx3YXlzIHZpc2libGUKKwkJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOworCisJCQkvLyBjaGVjayBvbiBkZW1hbmQgaW1wb3J0cworCQkJYm9vbGVhbiBmb3VuZEluSW1wb3J0ID0gZmFsc2U7CisJCQlpZiAoaW1wb3J0cyAhPSBudWxsKXsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJbXBvcnRCaW5kaW5nIHNvbWVJbXBvcnQgPSBpbXBvcnRzW2ldOworCQkJCQlpZiAoc29tZUltcG9ydC5vbkRlbWFuZCkgeworCQkJCQkJQmluZGluZyByZXNvbHZlZEltcG9ydCA9IHNvbWVJbXBvcnQucmVzb2x2ZWRJbXBvcnQ7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRlbXAgPQorCQkJCQkJCShyZXNvbHZlZEltcG9ydCBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKQorCQkJCQkJCQk/IGZpbmRUeXBlKG5hbWUsIChQYWNrYWdlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQsIHVuaXRTY29wZS5mUGFja2FnZSkKKwkJCQkJCQkJOiBmaW5kRGlyZWN0TWVtYmVyVHlwZShuYW1lLCAoUmVmZXJlbmNlQmluZGluZykgcmVzb2x2ZWRJbXBvcnQpOworCQkJCQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQlpZiAoc29tZUltcG9ydC5yZWZlcmVuY2UgIT0gbnVsbCkgc29tZUltcG9ydC5yZWZlcmVuY2UudXNlZCA9IHRydWU7CisJCQkJCQkJaWYgKGZvdW5kSW5JbXBvcnQpCisJCQkJCQkJCS8vIEFuc3dlciBlcnJvciBiaW5kaW5nIC0tIGltcG9ydCBvbiBkZW1hbmQgY29uZmxpY3Q7IG5hbWUgZm91bmQgaW4gdHdvIGltcG9ydCBvbiBkZW1hbmQgcGFja2FnZXMuCisJCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgQW1iaWd1b3VzKTsKKwkJCQkJCQl0eXBlID0gdGVtcDsKKwkJCQkJCQlmb3VuZEluSW1wb3J0ID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICh0eXBlICE9IG51bGwpCisJCQkJcmV0dXJuIHR5cGU7CisJCX0KKwkJLy8gc2VlIGlmIHRoZSBuYW1lIGlzIGEgcGFja2FnZQorCQlpZiAoKG1hc2sgJiBQQUNLQUdFKSAhPSAwKSB7CisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFNpbXBsZVJlZmVyZW5jZShuYW1lKTsKKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShuYW1lKTsKKwkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKQorCQkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwkJfQorCisJCWNvbXBpbGF0aW9uVW5pdFNjb3BlKCkucmVjb3JkU2ltcGxlUmVmZXJlbmNlKG5hbWUpOworCQkvLyBBbnN3ZXIgZXJyb3IgYmluZGluZyAtLSBjb3VsZCBub3QgZmluZCBuYW1lCisJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCl7CisJCQlyZXR1cm4gZm91bmRUeXBlOworCQl9CisJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgTm90Rm91bmQpOworCX0KKworCS8qIEFuc3dlciB3aGV0aGVyIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdCBhcyB0aGUgcmVjZWl2ZXIKKwkqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmaW5lZEluU2FtZVVuaXQoUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7CisJCS8vIGZpbmQgdGhlIG91dGVyIG1vc3QgZW5jbG9zaW5nIHR5cGUKKwkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlID0gdHlwZTsKKwkJd2hpbGUgKCh0eXBlID0gZW5jbG9zaW5nVHlwZS5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpCisJCQllbmNsb3NpbmdUeXBlID0gdHlwZTsKKworCQkvLyBmaW5kIHRoZSBjb21waWxhdGlvbiB1bml0IHNjb3BlCisJCVNjb3BlIHNjb3BlLCB1bml0U2NvcGUgPSB0aGlzOworCQl3aGlsZSAoKHNjb3BlID0gdW5pdFNjb3BlLnBhcmVudCkgIT0gbnVsbCkKKwkJCXVuaXRTY29wZSA9IHNjb3BlOworCisJCS8vIHRlc3QgdGhhdCB0aGUgZW5jbG9zaW5nVHlwZSBpcyBub3QgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAorCQlTb3VyY2VUeXBlQmluZGluZ1tdIHRvcExldmVsVHlwZXMgPQorCQkJKChDb21waWxhdGlvblVuaXRTY29wZSkgdW5pdFNjb3BlKS50b3BMZXZlbFR5cGVzOworCQlmb3IgKGludCBpID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICh0b3BMZXZlbFR5cGVzW2ldID09IGVuY2xvc2luZ1R5cGUpCisJCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0phdmFJb1NlcmlhbGl6YWJsZShUeXBlQmluZGluZyB0YikgeworCQkvL2EgZmlyc3QgLW5vbmUgb3B0aW1pemVkIHZlcnNpb24tLi4uOi0pLi4uLgorCQkvL3BsZWFzZSBtb2RpZnkgYXMgbmVlZGVkCisKKwkJcmV0dXJuIHRiID09IGdldEphdmFJb1NlcmlhbGl6YWJsZSgpOworCX0KKworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSmF2YUxhbmdDbG9uZWFibGUoVHlwZUJpbmRpbmcgdGIpIHsKKwkJLy9hIGZpcnN0IC1ub25lIG9wdGltaXplZCB2ZXJzaW9uLS4uLjotKS4uLi4KKwkJLy9wbGVhc2UgbW9kaWZ5IGFzIG5lZWRlZAorCisJCXJldHVybiB0YiA9PSBnZXRKYXZhTGFuZ0Nsb25lYWJsZSgpOworCX0KKworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzSmF2YUxhbmdPYmplY3QoVHlwZUJpbmRpbmcgdHlwZSkgeworCQlyZXR1cm4gdHlwZS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0OworCX0KKworCXB1YmxpYyBmaW5hbCBNZXRob2RTY29wZSBtZXRob2RTY29wZSgpIHsKKwkJU2NvcGUgc2NvcGUgPSB0aGlzOworCQlkbyB7CisJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSkKKwkJCQlyZXR1cm4gKE1ldGhvZFNjb3BlKSBzY29wZTsKKwkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gSW50ZXJuYWwgdXNlIG9ubHkKKwkvKiBBbGwgbWV0aG9kcyBpbiB2aXNpYmxlIGFyZSBhY2NlcHRhYmxlIG1hdGNoZXMgZm9yIHRoZSBtZXRob2QgaW4gcXVlc3Rpb24uLi4KKwkqIFRoZSBtZXRob2RzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyIHR5cGUgYXBwZWFyIGJlZm9yZSB0aG9zZSBkZWZpbmVkIGJ5IGl0cworCSogc3VwZXJjbGFzcyBhbmQgc28gb24uIFdlIHdhbnQgdG8gZmluZCB0aGUgb25lIHdoaWNoIG1hdGNoZXMgYmVzdC4KKwkqCisJKiBTaW5jZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBhIGNsYXNzLCB3ZSBrbm93IGVhY2ggbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzCisJKiBlaXRoZXIgdGhlIHJlY2VpdmVyIHR5cGUgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuIEl0IGlzIGFuIGVycm9yIGlmIHRoZSBiZXN0IG1hdGNoCisJKiBpcyBkZWZpbmVkIGJ5IGEgc3VwZXJjbGFzcywgd2hlbiBhIGxlc3NlciBtYXRjaCBpcyBkZWZpbmVkIGJ5IHRoZSByZWNlaXZlciB0eXBlCisJKiBvciBhIGNsb3NlciBzdXBlcmNsYXNzLgorCSovCisJcHJvdGVjdGVkIGZpbmFsIE1ldGhvZEJpbmRpbmcgbW9zdFNwZWNpZmljQ2xhc3NNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmdbXSB2aXNpYmxlLCBpbnQgdmlzaWJsZVNpemUpIHsKKworCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG51bGw7CisJCU1ldGhvZEJpbmRpbmcgcHJldmlvdXMgPSBudWxsOworCisJCW5leHRWaXNpYmxlIDogZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlU2l6ZTsgaSsrKSB7CisJCQltZXRob2QgPSB2aXNpYmxlW2ldOworCQkJCQkJCisJCQlpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBtZXRob2QuZGVjbGFyaW5nQ2xhc3MgIT0gcHJldmlvdXMuZGVjbGFyaW5nQ2xhc3MpCisJCQkJYnJlYWs7IC8vIGNhbm5vdCBhbnN3ZXIgYSBtZXRob2QgZmFydGhlciB1cCB0aGUgaGllcmFyY2h5IHRoYW4gdGhlIGZpcnN0IG1ldGhvZCBmb3VuZAorCQkJcHJldmlvdXMgPSBtZXRob2Q7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHZpc2libGVTaXplOyBqKyspIHsKKwkJCQlpZiAoaSA9PSBqKSBjb250aW51ZTsKKwkJCQlNZXRob2RCaW5kaW5nIG5leHQgPSB2aXNpYmxlW2pdOworCQkJCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobmV4dC5wYXJhbWV0ZXJzLCBtZXRob2QucGFyYW1ldGVycykpCisJCQkJCWNvbnRpbnVlIG5leHRWaXNpYmxlOworCQkJfQorCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhtZXRob2QudGhyb3duRXhjZXB0aW9ucyk7CisJCQlyZXR1cm4gbWV0aG9kOworCQl9CisJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcodmlzaWJsZVswXS5zZWxlY3RvciwgdmlzaWJsZVswXS5wYXJhbWV0ZXJzLCBBbWJpZ3VvdXMpOworCX0KKworCS8vIEludGVybmFsIHVzZSBvbmx5CisJLyogQWxsIG1ldGhvZHMgaW4gdmlzaWJsZSBhcmUgYWNjZXB0YWJsZSBtYXRjaGVzIGZvciB0aGUgbWV0aG9kIGluIHF1ZXN0aW9uLi4uCisJKiBTaW5jZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBhbiBpbnRlcmZhY2UsIHdlIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgdGhhdCAyIGluaGVyaXRlZAorCSogYnV0IHVucmVsYXRlZCBzdXBlcmludGVyZmFjZXMgbWF5IGRlZmluZSB0aGUgc2FtZSBtZXRob2QgaW4gYWNjZXB0YWJsZSBidXQKKwkqIG5vdCBpZGVudGljYWwgd2F5cy4uLiB3ZSBqdXN0IHRha2UgdGhlIGJlc3QgbWF0Y2ggdGhhdCB3ZSBmaW5kIHNpbmNlIGFueSBjbGFzcyB3aGljaAorCSogaW1wbGVtZW50cyB0aGUgcmVjZWl2ZXIgaW50ZXJmYWNlIE1VU1QgaW1wbGVtZW50IGFsbCBzaWduYXR1cmVzIGZvciB0aGUgbWV0aG9kLi4uCisJKiBpbiB3aGljaCBjYXNlIHRoZSBiZXN0IG1hdGNoIGlzIGNvcnJlY3QuCisJKgorCSogTk9URTogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBqYXZhYy4uLiBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBtZXNzYWdlIHNlbmQgb2YKKwkqIGJhcihYKSBpbiBjbGFzcyBZIGlzIHN1cHBvc2VkIHRvIGJlIGFtYmlndW91cy4gQnV0IGFueSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZQorCSogaW50ZXJmYWNlIEkgTVVTVCBpbXBsZW1lbnQgYm90aCBzaWduYXR1cmVzIGZvciBiYXIuIElmIHRoaXMgY2xhc3Mgd2FzIHRoZSByZWNlaXZlciBvZgorCSogdGhlIG1lc3NhZ2Ugc2VuZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcmZhY2UgSSwgdGhlbiBubyBwcm9ibGVtIHdvdWxkIGJlIHJlcG9ydGVkLgorCSoKKwlpbnRlcmZhY2UgSTEgeworCQl2b2lkIGJhcihKIGopOworCX0KKwlpbnRlcmZhY2UgSTIgeworCS8vCXZvaWQgYmFyKEogaik7CisJCXZvaWQgYmFyKE9iamVjdCBvKTsKKwl9CisJaW50ZXJmYWNlIEkgZXh0ZW5kcyBJMSwgSTIge30KKwlpbnRlcmZhY2UgSiB7fQorCQorCWNsYXNzIFggaW1wbGVtZW50cyBKIHt9CisJCisJY2xhc3MgWSBleHRlbmRzIFggeworCQlwdWJsaWMgdm9pZCBmb28oSSBpLCBYIHgpIHsgaS5iYXIoeCk7IH0KKwl9CisJKi8KKwlwcm90ZWN0ZWQgZmluYWwgTWV0aG9kQmluZGluZyBtb3N0U3BlY2lmaWNJbnRlcmZhY2VNZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmdbXSB2aXNpYmxlLCBpbnQgdmlzaWJsZVNpemUpIHsKKwkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBudWxsOworCQluZXh0VmlzaWJsZSA6IGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVNpemU7IGkrKykgeworCQkJbWV0aG9kID0gdmlzaWJsZVtpXTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgdmlzaWJsZVNpemU7IGorKykgeworCQkJCWlmIChpID09IGopIGNvbnRpbnVlOworCQkJCU1ldGhvZEJpbmRpbmcgbmV4dCA9IHZpc2libGVbal07CisJCQkJaWYgKCFhcmVQYXJhbWV0ZXJzQXNzaWduYWJsZShuZXh0LnBhcmFtZXRlcnMsIG1ldGhvZC5wYXJhbWV0ZXJzKSkKKwkJCQkJY29udGludWUgbmV4dFZpc2libGU7CisJCQl9CisJCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2VzKG1ldGhvZC50aHJvd25FeGNlcHRpb25zKTsKKwkJCXJldHVybiBtZXRob2Q7CisJCX0KKwkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyh2aXNpYmxlWzBdLnNlbGVjdG9yLCB2aXNpYmxlWzBdLnBhcmFtZXRlcnMsIEFtYmlndW91cyk7CisJfQorCisJcHVibGljIGZpbmFsIENsYXNzU2NvcGUgb3V0ZXJNb3N0Q2xhc3NTY29wZSgpIHsKKwkJQ2xhc3NTY29wZSBsYXN0Q2xhc3NTY29wZSA9IG51bGw7CisJCVNjb3BlIHNjb3BlID0gdGhpczsKKwkJZG8geworCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkKKwkJCQlsYXN0Q2xhc3NTY29wZSA9IChDbGFzc1Njb3BlKSBzY29wZTsKKwkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsKKwkJcmV0dXJuIGxhc3RDbGFzc1Njb3BlOyAvLyBtYXkgYW5zd2VyIG51bGwgaWYgbm8gY2xhc3MgYXJvdW5kCisJfQorCisJcHVibGljIGZpbmFsIE1ldGhvZFNjb3BlIG91dGVyTW9zdE1ldGhvZFNjb3BlKCkgeworCQlNZXRob2RTY29wZSBsYXN0TWV0aG9kU2NvcGUgPSBudWxsOworCQlTY29wZSBzY29wZSA9IHRoaXM7CisJCWRvIHsKKwkJCWlmIChzY29wZSBpbnN0YW5jZW9mIE1ldGhvZFNjb3BlKQorCQkJCWxhc3RNZXRob2RTY29wZSA9IChNZXRob2RTY29wZSkgc2NvcGU7CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7CisJCXJldHVybiBsYXN0TWV0aG9kU2NvcGU7IC8vIG1heSBhbnN3ZXIgbnVsbCBpZiBubyBtZXRob2QgYXJvdW5kCisJfQorCisJcHVibGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJU2NvcGUgc2NvcGUsIHVuaXRTY29wZSA9IHRoaXM7CisJCXdoaWxlICgoc2NvcGUgPSB1bml0U2NvcGUucGFyZW50KSAhPSBudWxsKQorCQkJdW5pdFNjb3BlID0gc2NvcGU7CisJCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdFNjb3BlKSB1bml0U2NvcGUpLnJlZmVyZW5jZUNvbnRleHQ7CisJfQorCS8vIHN0YXJ0IHBvc2l0aW9uIGluIHRoaXMgc2NvcGUgLSBmb3Igb3JkZXJpbmcgc2NvcGVzIHZzLiB2YXJpYWJsZXMKKwlpbnQgc3RhcnRJbmRleCgpIHsKKwkJcmV0dXJuIDA7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU4MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTA0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NlcnRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgU291cmNlVHlwZUJpbmRpbmcgZXh0ZW5kcyBSZWZlcmVuY2VCaW5kaW5nIHsKKwlwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzOworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzOworCXB1YmxpYyBGaWVsZEJpbmRpbmdbXSBmaWVsZHM7CisJcHVibGljIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzOworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXM7CisKKwlwdWJsaWMgQ2xhc3NTY29wZSBzY29wZTsKKworCS8vIFN5bnRoZXRpY3MgYXJlIHNlcGFyYXRlZCBpbnRvIDQgY2F0ZWdvcmllczogbWV0aG9kcywgZmllbGRzLCBjbGFzcyBsaXRlcmFscyBhbmQgY2hhbmdlZCBkZWNsYXJpbmcgY2xhc3MgYmluZGluZ3MKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0QgPSAwOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJRUxEID0gMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19MSVRFUkFMID0gMjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOR0VEX0RFQ0xBUklOR19DTEFTUyA9IDM7CisJCisJSGFzaHRhYmxlW10gc3ludGhldGljczsKK3Byb3RlY3RlZCBTb3VyY2VUeXBlQmluZGluZygpIHsKK30KK3B1YmxpYyBTb3VyY2VUeXBlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIFBhY2thZ2VCaW5kaW5nIGZQYWNrYWdlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CisJdGhpcy5mUGFja2FnZSA9IGZQYWNrYWdlOworCXRoaXMuZmlsZU5hbWUgPSBzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5nZXRGaWxlTmFtZSgpOworCXRoaXMubW9kaWZpZXJzID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tb2RpZmllcnM7CisJdGhpcy5zb3VyY2VOYW1lID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dC5uYW1lOworCXRoaXMuc2NvcGUgPSBzY29wZTsKKworCWNvbXB1dGVJZCgpOworfQorcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRBYnN0cmFjdE1ldGhvZChNZXRob2RCaW5kaW5nIGFic3RyYWN0TWV0aG9kKSB7CisJTWV0aG9kQmluZGluZyBkZWZhdWx0QWJzdHJhY3QgPSBuZXcgTWV0aG9kQmluZGluZygKKwkJYWJzdHJhY3RNZXRob2QubW9kaWZpZXJzIHwgQWNjRGVmYXVsdEFic3RyYWN0LAorCQlhYnN0cmFjdE1ldGhvZC5zZWxlY3RvciwKKwkJYWJzdHJhY3RNZXRob2QucmV0dXJuVHlwZSwKKwkJYWJzdHJhY3RNZXRob2QucGFyYW1ldGVycywKKwkJYWJzdHJhY3RNZXRob2QudGhyb3duRXhjZXB0aW9ucywKKwkJdGhpcyk7CisKKwlNZXRob2RCaW5kaW5nW10gdGVtcCA9IG5ldyBNZXRob2RCaW5kaW5nW21ldGhvZHMubGVuZ3RoICsgMV07CisJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCB0ZW1wLCAwLCBtZXRob2RzLmxlbmd0aCk7CisJdGVtcFttZXRob2RzLmxlbmd0aF0gPSBkZWZhdWx0QWJzdHJhY3Q7CisJbWV0aG9kcyA9IHRlbXA7Cit9CitwdWJsaWMgdm9pZCBhZGREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCkgeworCWlmICgodGFnQml0cyAmIEtub3dzRGVmYXVsdEFic3RyYWN0TWV0aG9kcykgIT0gMCkgcmV0dXJuOworCisJdGFnQml0cyB8PSBLbm93c0RlZmF1bHRBYnN0cmFjdE1ldGhvZHM7CisKKwlpZiAoaXNDbGFzcygpICYmIGlzQWJzdHJhY3QoKSkgeworCQlpZiAoZlBhY2thZ2UuZW52aXJvbm1lbnQub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMikgcmV0dXJuOyAvLyBubyBsb25nZXIgYWRkZWQgZm9yIHBvc3QgMS4yIHRhcmdldHMKKworCQlSZWZlcmVuY2VCaW5kaW5nW11bXSBpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107CisJCWludCBsYXN0UG9zaXRpb24gPSAwOworCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gc3VwZXJJbnRlcmZhY2VzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlID0gaW50ZXJmYWNlc1tqXTsKKwkJCQlpZiAoc3VwZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBzdXBlclR5cGUubWV0aG9kcygpOworCQkJCQlmb3IgKGludCBtID0gbWV0aG9kcy5sZW5ndGg7IC0tbSA+PSAwOykgeworCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQkJCQkJaWYgKCFpbXBsZW1lbnRzTWV0aG9kKG1ldGhvZCkpCisJCQkJCQkJYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kKG1ldGhvZCk7CisJCQkJCX0KKworCQkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaXRzSW50ZXJmYWNlcyA9IHN1cGVyVHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCQkJCWlmICgrK2xhc3RQb3NpdGlvbiA9PSBpbnRlcmZhY2VzVG9WaXNpdC5sZW5ndGgpCisJCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOworCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGZpZWxkIGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPi4KKyoJQW5zd2VyIHRoZSBuZXcgZmllbGQgb3IgdGhlIGV4aXN0aW5nIGZpZWxkIGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworCitwdWJsaWMgRmllbGRCaW5kaW5nIGFkZFN5bnRoZXRpY0ZpZWxkKExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgeworCWlmIChzeW50aGV0aWNzID09IG51bGwpIHsKKwkJc3ludGhldGljcyA9IG5ldyBIYXNodGFibGVbNF07CisJfQorCWlmIChzeW50aGV0aWNzW0ZJRUxEXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbRklFTERdID0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisJCisJRmllbGRCaW5kaW5nIHN5bnRoRmllbGQgPSAoRmllbGRCaW5kaW5nKSBzeW50aGV0aWNzW0ZJRUxEXS5nZXQoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7CisJCXN5bnRoRmllbGQgPSBuZXcgU3ludGhldGljRmllbGRCaW5kaW5nKAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoU3ludGhldGljQXJndW1lbnRCaW5kaW5nLk91dGVyTG9jYWxQcmVmaXgsIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5uYW1lKSwgCisJCQlhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUudHlwZSwgCisJCQlBY2NQcml2YXRlIHwgQWNjRmluYWwgfCBBY2NTeW50aGV0aWMsIAorCQkJdGhpcywgCisJCQlDb25zdGFudC5Ob3RBQ29uc3RhbnQsCisJCQlzeW50aGV0aWNzW0ZJRUxEXS5zaXplKCkpOworCQlzeW50aGV0aWNzW0ZJRUxEXS5wdXQoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLCBzeW50aEZpZWxkKTsKKwl9CisKKwkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGZpZWxkIGRlZmluZWQgYnkgdGhlIHVzZXIKKwlib29sZWFuIG5lZWRSZWNoZWNrOworCWludCBpbmRleCA9IDE7CisJZG8geworCQluZWVkUmVjaGVjayA9IGZhbHNlOworCQlGaWVsZEJpbmRpbmcgZXhpc3RpbmdGaWVsZDsKKwkJaWYgKChleGlzdGluZ0ZpZWxkID0gdGhpcy5nZXRGaWVsZChzeW50aEZpZWxkLm5hbWUpKSAhPSBudWxsKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBzY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVEZWNsLmZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJCWlmIChmaWVsZERlY2wuYmluZGluZyA9PSBleGlzdGluZ0ZpZWxkKSB7CisJCQkJCXN5bnRoRmllbGQubmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nLk91dGVyTG9jYWxQcmVmaXgsCisJCQkJCQlhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSwKKwkJCQkJCSgiJCIgKyBTdHJpbmcudmFsdWVPZihpbmRleCsrKSkudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbmVlZFJlY2hlY2sgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChuZWVkUmVjaGVjayk7CisJcmV0dXJuIHN5bnRoRmllbGQ7Cit9CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGZpZWxkIGZvciA8ZW5jbG9zaW5nVHlwZT4uCisqCUFuc3dlciB0aGUgbmV3IGZpZWxkIG9yIHRoZSBleGlzdGluZyBmaWVsZCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgorKi8KKworcHVibGljIEZpZWxkQmluZGluZyBhZGRTeW50aGV0aWNGaWVsZChSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKworCWlmIChzeW50aGV0aWNzID09IG51bGwpIHsKKwkJc3ludGhldGljcyA9IG5ldyBIYXNodGFibGVbNF07CisJfQorCWlmIChzeW50aGV0aWNzW0ZJRUxEXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbRklFTERdID0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisKKwlGaWVsZEJpbmRpbmcgc3ludGhGaWVsZCA9IChGaWVsZEJpbmRpbmcpIHN5bnRoZXRpY3NbRklFTERdLmdldChlbmNsb3NpbmdUeXBlKTsKKwlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7CisJCXN5bnRoRmllbGQgPSBuZXcgU3ludGhldGljRmllbGRCaW5kaW5nKAorCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nLkVuY2xvc2luZ0luc3RhbmNlUHJlZml4LAorCQkJCVN0cmluZy52YWx1ZU9mKGVuY2xvc2luZ1R5cGUuZGVwdGgoKSkudG9DaGFyQXJyYXkoKSksCisJCQllbmNsb3NpbmdUeXBlLAorCQkJQWNjUHJpdmF0ZSB8IEFjY0ZpbmFsIHwgQWNjU3ludGhldGljLAorCQkJdGhpcywKKwkJCUNvbnN0YW50Lk5vdEFDb25zdGFudCwKKwkJCXN5bnRoZXRpY3NbRklFTERdLnNpemUoKSk7CisJCXN5bnRoZXRpY3NbRklFTERdLnB1dChlbmNsb3NpbmdUeXBlLCBzeW50aEZpZWxkKTsKKwl9CisJLy8gZW5zdXJlIHRoZXJlIGlzIG5vdCBhbHJlYWR5IHN1Y2ggYSBmaWVsZCBkZWZpbmVkIGJ5IHRoZSB1c2VyCisJRmllbGRCaW5kaW5nIGV4aXN0aW5nRmllbGQ7CisJaWYgKChleGlzdGluZ0ZpZWxkID0gdGhpcy5nZXRGaWVsZChzeW50aEZpZWxkLm5hbWUpKSAhPSBudWxsKSB7CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVGaWVsZEluVHlwZSh0aGlzLCBmaWVsZERlY2wpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQkJCisJcmV0dXJuIHN5bnRoRmllbGQ7Cit9CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGZpZWxkIGZvciBhIGNsYXNzIGxpdGVyYWwgYWNjZXNzLgorKglBbnN3ZXIgdGhlIG5ldyBmaWVsZCBvciB0aGUgZXhpc3RpbmcgZmllbGQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KKyovCisKK3B1YmxpYyBGaWVsZEJpbmRpbmcgYWRkU3ludGhldGljRmllbGQoVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisKKwlpZiAoc3ludGhldGljcyA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3MgPSBuZXcgSGFzaHRhYmxlWzRdOworCX0KKwlpZiAoc3ludGhldGljc1tDTEFTU19MSVRFUkFMXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0gPSBuZXcgSGFzaHRhYmxlKDUpOworCX0KKworCS8vIHVzZSBhIGRpZmZlcmVudCB0YWJsZSB0aGFuIEZJRUxEUywgZ2l2ZW4gdGhlcmUgbWlnaHQgYmUgYSBjb2xsaXNpb24gYmV0d2VlbiBlbXVsYXRpb24gb2YgWC50aGlzJDAgYW5kIFguY2xhc3MuCisJRmllbGRCaW5kaW5nIHN5bnRoRmllbGQgPSAoRmllbGRCaW5kaW5nKSBzeW50aGV0aWNzW0NMQVNTX0xJVEVSQUxdLmdldCh0YXJnZXRUeXBlKTsKKwlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7CisJCXN5bnRoRmllbGQgPSBuZXcgU3ludGhldGljRmllbGRCaW5kaW5nKAorCQkJKCJjbGFzcyQiICsgc3ludGhldGljc1tDTEFTU19MSVRFUkFMXS5zaXplKCkpLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCWJsb2NrU2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpLAorCQkJQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYywKKwkJCXRoaXMsCisJCQlDb25zdGFudC5Ob3RBQ29uc3RhbnQsCisJCQlzeW50aGV0aWNzW0NMQVNTX0xJVEVSQUxdLnNpemUoKSk7CisJCXN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0ucHV0KHRhcmdldFR5cGUsIHN5bnRoRmllbGQpOworCX0KKwkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGZpZWxkIGRlZmluZWQgYnkgdGhlIHVzZXIKKwlGaWVsZEJpbmRpbmcgZXhpc3RpbmdGaWVsZDsKKwlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSkpICE9IG51bGwpIHsKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gYmxvY2tTY29wZS5yZWZlcmVuY2VUeXBlKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbC5maWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZmllbGRzW2ldOworCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKKwkJCQlibG9ja1Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUZpZWxkSW5UeXBlKHRoaXMsIGZpZWxkRGVjbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CQkKKwlyZXR1cm4gc3ludGhGaWVsZDsKK30KKworLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBmaWVsZCBmb3IgdGhlIGVtdWxhdGlvbiBvZiB0aGUgYXNzZXJ0IHN0YXRlbWVudC4KKyoJQW5zd2VyIHRoZSBuZXcgZmllbGQgb3IgdGhlIGV4aXN0aW5nIGZpZWxkIGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworcHVibGljIEZpZWxkQmluZGluZyBhZGRTeW50aGV0aWNGaWVsZChBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50LCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCWlmIChzeW50aGV0aWNzID09IG51bGwpIHsKKwkJc3ludGhldGljcyA9IG5ldyBIYXNodGFibGVbNF07CisJfQorCWlmIChzeW50aGV0aWNzW0ZJRUxEXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbRklFTERdID0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisKKwlGaWVsZEJpbmRpbmcgc3ludGhGaWVsZCA9IChGaWVsZEJpbmRpbmcpIHN5bnRoZXRpY3NbRklFTERdLmdldCgiYXNzZXJ0aW9uRW11bGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoc3ludGhGaWVsZCA9PSBudWxsKSB7CisJCXN5bnRoRmllbGQgPSBuZXcgU3ludGhldGljRmllbGRCaW5kaW5nKAorCQkJIiRhc3NlcnRpb25zRGlzYWJsZWQiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKKwkJCUJvb2xlYW5CaW5kaW5nLAorCQkJQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYyB8IEFjY0ZpbmFsLAorCQkJdGhpcywKKwkJCUNvbnN0YW50Lk5vdEFDb25zdGFudCwKKwkJCTApOworCQlzeW50aGV0aWNzW0ZJRUxEXS5wdXQoImFzc2VydGlvbkVtdWxhdGlvbiIsIHN5bnRoRmllbGQpOyAvLyROT04tTkxTLTEkCisJfQorCS8vIGVuc3VyZSB0aGVyZSBpcyBub3QgYWxyZWFkeSBzdWNoIGEgZmllbGQgZGVmaW5lZCBieSB0aGUgdXNlcgorCS8vIGVuc3VyZSB0aGVyZSBpcyBub3QgYWxyZWFkeSBzdWNoIGEgZmllbGQgZGVmaW5lZCBieSB0aGUgdXNlcgorCWJvb2xlYW4gbmVlZFJlY2hlY2s7CisJaW50IGluZGV4ID0gMDsKKwlkbyB7CisJCW5lZWRSZWNoZWNrID0gZmFsc2U7CisJCUZpZWxkQmluZGluZyBleGlzdGluZ0ZpZWxkOworCQlpZiAoKGV4aXN0aW5nRmllbGQgPSB0aGlzLmdldEZpZWxkKHN5bnRoRmllbGQubmFtZSkpICE9IG51bGwpIHsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZURlY2wuZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wgPSB0eXBlRGVjbC5maWVsZHNbaV07CisJCQkJaWYgKGZpZWxkRGVjbC5iaW5kaW5nID09IGV4aXN0aW5nRmllbGQpIHsKKwkJCQkJc3ludGhGaWVsZC5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkiJGFzc2VydGlvbnNEaXNhYmxlZCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJKCJfIiArIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKS50b0NoYXJBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQluZWVkUmVjaGVjayA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKG5lZWRSZWNoZWNrKTsKKwlyZXR1cm4gc3ludGhGaWVsZDsKK30KKworLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kIGZvciByZWFkL3dyaXRlIGFjY2VzcyB0byA8dGFyZ2V0RmllbGQ+LgorCUFuc3dlciB0aGUgbmV3IG1ldGhvZCBvciB0aGUgZXhpc3RpbmcgbWV0aG9kIGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisqLworCitwdWJsaWMgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhZGRTeW50aGV0aWNNZXRob2QoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcykgeworCisJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCkgeworCQlzeW50aGV0aWNzID0gbmV3IEhhc2h0YWJsZVs0XTsKKwl9CisJaWYgKHN5bnRoZXRpY3NbTUVUSE9EXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbTUVUSE9EXSA9IG5ldyBIYXNodGFibGUoNSk7CisJfQorCisJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhY2Nlc3NNZXRob2QgPSBudWxsOworCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBhY2Nlc3NvcnMgPSAoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdKSBzeW50aGV0aWNzW01FVEhPRF0uZ2V0KHRhcmdldEZpZWxkKTsKKwlpZiAoYWNjZXNzb3JzID09IG51bGwpIHsKKwkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcodGFyZ2V0RmllbGQsIGlzUmVhZEFjY2VzcywgdGhpcyk7CisJCXN5bnRoZXRpY3NbTUVUSE9EXS5wdXQodGFyZ2V0RmllbGQsIGFjY2Vzc29ycyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nWzJdKTsKKwkJYWNjZXNzb3JzW2lzUmVhZEFjY2VzcyA/IDAgOiAxXSA9IGFjY2Vzc01ldGhvZDsJCQorCX0gZWxzZSB7CisJCWlmICgoYWNjZXNzTWV0aG9kID0gYWNjZXNzb3JzW2lzUmVhZEFjY2VzcyA/IDAgOiAxXSkgPT0gbnVsbCkgeworCQkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcodGFyZ2V0RmllbGQsIGlzUmVhZEFjY2VzcywgdGhpcyk7CisJCQlhY2Nlc3NvcnNbaXNSZWFkQWNjZXNzID8gMCA6IDFdID0gYWNjZXNzTWV0aG9kOworCQl9CisJfQorCXJldHVybiBhY2Nlc3NNZXRob2Q7Cit9CisvKiBBZGQgYSBuZXcgc3ludGhldGljIGFjY2VzcyBtZXRob2QgZm9yIGFjY2VzcyB0byA8dGFyZ2V0TWV0aG9kPi4KKwlBbnN3ZXIgdGhlIG5ldyBtZXRob2Qgb3IgdGhlIGV4aXN0aW5nIG1ldGhvZCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgorKi8KKworcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljTWV0aG9kKE1ldGhvZEJpbmRpbmcgdGFyZ2V0TWV0aG9kKSB7CisKKwlpZiAoc3ludGhldGljcyA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3MgPSBuZXcgSGFzaHRhYmxlWzRdOworCX0KKwlpZiAoc3ludGhldGljc1tNRVRIT0RdID09IG51bGwpIHsKKwkJc3ludGhldGljc1tNRVRIT0RdID0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisKKwlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc01ldGhvZCA9IChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nKSBzeW50aGV0aWNzW01FVEhPRF0uZ2V0KHRhcmdldE1ldGhvZCk7CisJaWYgKGFjY2Vzc01ldGhvZCA9PSBudWxsKSB7CisJCWFjY2Vzc01ldGhvZCA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nKHRhcmdldE1ldGhvZCwgdGhpcyk7CisJCXN5bnRoZXRpY3NbTUVUSE9EXS5wdXQodGFyZ2V0TWV0aG9kLCBhY2Nlc3NNZXRob2QpOworCX0KKwlyZXR1cm4gYWNjZXNzTWV0aG9kOworfQorCitwdWJsaWMgRmllbGRCaW5kaW5nW10gYXZhaWxhYmxlRmllbGRzKCkgeworCXJldHVybiBmaWVsZHMoKTsKK30KK3B1YmxpYyBNZXRob2RCaW5kaW5nW10gYXZhaWxhYmxlTWV0aG9kcygpIHsKKwlyZXR1cm4gbWV0aG9kcygpOworfQordm9pZCBmYXVsdEluVHlwZXNGb3JGaWVsZHNBbmRNZXRob2RzKCkgeworCWZpZWxkcygpOworCW1ldGhvZHMoKTsKKworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJKChTb3VyY2VUeXBlQmluZGluZykgbWVtYmVyVHlwZXNbaV0pLmZhdWx0SW5UeXBlc0ZvckZpZWxkc0FuZE1ldGhvZHMoKTsKK30KKy8vIE5PVEU6IHRoZSB0eXBlIG9mIGVhY2ggZmllbGQgb2YgYSBzb3VyY2UgdHlwZSBpcyByZXNvbHZlZCB3aGVuIG5lZWRlZAorCitwdWJsaWMgRmllbGRCaW5kaW5nW10gZmllbGRzKCkgeworCQorCXRyeSB7CisJCWludCBmYWlsZWQgPSAwOworCQlmb3IgKGludCBmID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgZiA8IG1heDsgZisrKSB7CisJCQlpZiAocmVzb2x2ZVR5cGVGb3IoZmllbGRzW2ZdKSA9PSBudWxsKSB7CisJCQkJZmllbGRzW2ZdID0gbnVsbDsKKwkJCQlmYWlsZWQrKzsKKwkJCX0KKwkJfQorCQlpZiAoZmFpbGVkID4gMCkgeworCQkJaW50IG5ld1NpemUgPSBmaWVsZHMubGVuZ3RoIC0gZmFpbGVkOworCQkJaWYgKG5ld1NpemUgPT0gMCkKKwkJCQlyZXR1cm4gZmllbGRzID0gTm9GaWVsZHM7CisJCisJCQlGaWVsZEJpbmRpbmdbXSBuZXdGaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW25ld1NpemVdOworCQkJZm9yIChpbnQgaSA9IDAsIG4gPSAwLCBtYXggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCisJCQkJaWYgKGZpZWxkc1tpXSAhPSBudWxsKQorCQkJCQluZXdGaWVsZHNbbisrXSA9IGZpZWxkc1tpXTsKKwkJCWZpZWxkcyA9IG5ld0ZpZWxkczsKKwkJfQorCX0gY2F0Y2goQWJvcnRDb21waWxhdGlvbiBlKXsKKwkJLy8gZW5zdXJlIG51bGwgZmllbGRzIGFyZSByZW1vdmVkCisJCUZpZWxkQmluZGluZ1tdIG5ld0ZpZWxkcyA9IG51bGw7CisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ldOworCQkJaWYgKGZpZWxkID09IG51bGwgJiYgbmV3RmllbGRzID09IG51bGwpeworCQkJCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCAwLCBuZXdGaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW21heF0sIDAsIGkpOworCQkJfSBlbHNlIGlmIChuZXdGaWVsZHMgIT0gbnVsbCAmJiBmaWVsZCAhPSBudWxsKSB7CisJCQkJbmV3RmllbGRzW2NvdW50KytdID0gZmllbGQ7CisJCQl9CisJCX0KKwkJaWYgKG5ld0ZpZWxkcyAhPSBudWxsKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkobmV3RmllbGRzLCAwLCBmaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworCQl9CQkJCisJCXRocm93IGU7CisJfQorCXJldHVybiBmaWVsZHM7Cit9CitwdWJsaWMgTWV0aG9kQmluZGluZ1tdIGdldERlZmF1bHRBYnN0cmFjdE1ldGhvZHMoKSB7CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKG1ldGhvZHNbaV0uaXNEZWZhdWx0QWJzdHJhY3QoKSkKKwkJCWNvdW50Kys7CisJaWYgKGNvdW50ID09IDApIHJldHVybiBOb01ldGhvZHM7CisKKwlNZXRob2RCaW5kaW5nW10gcmVzdWx0ID0gbmV3IE1ldGhvZEJpbmRpbmdbY291bnRdOworCWNvdW50ID0gMDsKKwlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKG1ldGhvZHNbaV0uaXNEZWZhdWx0QWJzdHJhY3QoKSkKKwkJCXJlc3VsdFtjb3VudCsrXSA9IG1ldGhvZHNbaV07CisJcmV0dXJuIHJlc3VsdDsKK30KKy8vIE5PVEU6IHRoZSByZXR1cm4gdHlwZSwgYXJnICYgZXhjZXB0aW9uIHR5cGVzIG9mIGVhY2ggbWV0aG9kIG9mIGEgc291cmNlIHR5cGUgYXJlIHJlc29sdmVkIHdoZW4gbmVlZGVkCisKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGdldEV4YWN0Q29uc3RydWN0b3IoVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzKSB7CisJaW50IGFyZ0NvdW50ID0gYXJndW1lbnRUeXBlcy5sZW5ndGg7CisKKwlpZiAoKG1vZGlmaWVycyAmIEFjY1VucmVzb2x2ZWQpID09IDApIHsgLy8gaGF2ZSByZXNvbHZlZCBhbGwgYXJnIHR5cGVzICYgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZHMKKwkJbmV4dE1ldGhvZCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbbV07CisJCQlpZiAobWV0aG9kLnNlbGVjdG9yID09IENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSAmJiBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT0gYXJnQ291bnQpIHsKKwkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKKwkJCQlmb3IgKGludCBwID0gMDsgcCA8IGFyZ0NvdW50OyBwKyspCisJCQkJCWlmICh0b01hdGNoW3BdICE9IGFyZ3VtZW50VHlwZXNbcF0pCisJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCXJldHVybiBtZXRob2Q7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGdldE1ldGhvZHMoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5Db25zdGFudFBvb2xOYW1lKTsgLy8gdGFrZXMgY2FyZSBvZiBkdXBsaWNhdGVzICYgZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCisJCW5leHRNZXRob2QgOiBmb3IgKGludCBtID0gbWV0aG9kcy5sZW5ndGg7IC0tbSA+PSAwOykgeworCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQkJVHlwZUJpbmRpbmdbXSB0b01hdGNoID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJCQlpZiAodG9NYXRjaC5sZW5ndGggPT0gYXJnQ291bnQpIHsKKwkJCQlmb3IgKGludCBwID0gMDsgcCA8IGFyZ0NvdW50OyBwKyspCisJCQkJCWlmICh0b01hdGNoW3BdICE9IGFyZ3VtZW50VHlwZXNbcF0pCisJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCXJldHVybiBtZXRob2Q7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIHNvdXJjZSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAorLy8gc2VhcmNoZXMgdXAgdGhlIGhpZXJhcmNoeSBhcyBsb25nIGFzIG5vIHBvdGVudGlhbCAoYnV0IG5vdCBleGFjdCkgbWF0Y2ggd2FzIGZvdW5kLgorCitwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRFeGFjdE1ldGhvZChjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcykgeworCWludCBhcmdDb3VudCA9IGFyZ3VtZW50VHlwZXMubGVuZ3RoOworCWludCBzZWxlY3Rvckxlbmd0aCA9IHNlbGVjdG9yLmxlbmd0aDsKKwlib29sZWFuIGZvdW5kTm90aGluZyA9IHRydWU7CisKKwlpZiAoKG1vZGlmaWVycyAmIEFjY1VucmVzb2x2ZWQpID09IDApIHsgLy8gaGF2ZSByZXNvbHZlZCBhbGwgYXJnIHR5cGVzICYgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZHMKKwkJbmV4dE1ldGhvZCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbbV07CisJCQlpZiAobWV0aG9kLnNlbGVjdG9yLmxlbmd0aCA9PSBzZWxlY3Rvckxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkgeworCQkJCWZvdW5kTm90aGluZyA9IGZhbHNlOyAvLyBpbm5lciB0eXBlIGxvb2t1cHMgbXVzdCBrbm93IHRoYXQgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgZXhpc3RzCisJCQkJaWYgKG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PSBhcmdDb3VudCkgeworCQkJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKKwkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBhcmdDb3VudDsgcCsrKQorCQkJCQkJaWYgKHRvTWF0Y2hbcF0gIT0gYXJndW1lbnRUeXBlc1twXSkKKwkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCQlyZXR1cm4gbWV0aG9kOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gZ2V0TWV0aG9kcyhzZWxlY3Rvcik7IC8vIHRha2VzIGNhcmUgb2YgZHVwbGljYXRlcyAmIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcworCQlmb3VuZE5vdGhpbmcgPSBtZXRob2RzID09IE5vTWV0aG9kczsKKwkJbmV4dE1ldGhvZCA6IGZvciAoaW50IG0gPSBtZXRob2RzLmxlbmd0aDsgLS1tID49IDA7KSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbbV07CisJCQlUeXBlQmluZGluZ1tdIHRvTWF0Y2ggPSBtZXRob2QucGFyYW1ldGVyczsKKwkJCWlmICh0b01hdGNoLmxlbmd0aCA9PSBhcmdDb3VudCkgeworCQkJCWZvciAoaW50IHAgPSAwOyBwIDwgYXJnQ291bnQ7IHArKykKKwkJCQkJaWYgKHRvTWF0Y2hbcF0gIT0gYXJndW1lbnRUeXBlc1twXSkKKwkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQkJcmV0dXJuIG1ldGhvZDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmb3VuZE5vdGhpbmcpIHsKKwkJaWYgKGlzSW50ZXJmYWNlKCkpIHsKKwkJCSBpZiAoc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCA9PSAxKQorCQkJCXJldHVybiBzdXBlckludGVyZmFjZXNbMF0uZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMpOworCQl9IGVsc2UgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJcmV0dXJuIHN1cGVyY2xhc3MuZ2V0RXhhY3RNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMpOworCQl9CisJfQorCXJldHVybiBudWxsOworfQorLy8gTk9URTogdGhlIHR5cGUgb2YgYSBmaWVsZCBvZiBhIHNvdXJjZSB0eXBlIGlzIHJlc29sdmVkIHdoZW4gbmVlZGVkCisKK3B1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0RmllbGQoY2hhcltdIGZpZWxkTmFtZSkgeworCWludCBmaWVsZExlbmd0aCA9IGZpZWxkTmFtZS5sZW5ndGg7CisJZm9yIChpbnQgZiA9IGZpZWxkcy5sZW5ndGg7IC0tZiA+PSAwOykgeworCQlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZHNbZl07CisJCWlmIChmaWVsZC5uYW1lLmxlbmd0aCA9PSBmaWVsZExlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhmaWVsZC5uYW1lLCBmaWVsZE5hbWUpKSB7CisJCQlpZiAocmVzb2x2ZVR5cGVGb3IoZmllbGQpICE9IG51bGwpCisJCQkJcmV0dXJuIGZpZWxkOworCisJCQlpbnQgbmV3U2l6ZSA9IGZpZWxkcy5sZW5ndGggLSAxOworCQkJaWYgKG5ld1NpemUgPT0gMCkgeworCQkJCWZpZWxkcyA9IE5vRmllbGRzOworCQkJfSBlbHNlIHsKKwkJCQlGaWVsZEJpbmRpbmdbXSBuZXdGaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nW25ld1NpemVdOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCAwLCBuZXdGaWVsZHMsIDAsIGYpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCBmICsgMSwgbmV3RmllbGRzLCBmLCBuZXdTaXplIC0gZik7CisJCQkJZmllbGRzID0gbmV3RmllbGRzOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIHNvdXJjZSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAorCitwdWJsaWMgTWV0aG9kQmluZGluZ1tdIGdldE1ldGhvZHMoY2hhcltdIHNlbGVjdG9yKSB7CisJLy8gaGFuZGxlIGZvcndhcmQgcmVmZXJlbmNlcyB0byBwb3RlbnRpYWwgZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzCisJYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOworCisJdHJ5eworCQlpbnQgY291bnQgPSAwOworCQlpbnQgbGFzdEluZGV4ID0gLTE7CisJCWludCBzZWxlY3Rvckxlbmd0aCA9IHNlbGVjdG9yLmxlbmd0aDsKKwkJaWYgKChtb2RpZmllcnMgJiBBY2NVbnJlc29sdmVkKSA9PSAwKSB7IC8vIGhhdmUgcmVzb2x2ZWQgYWxsIGFyZyB0eXBlcyAmIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2RzCisJCQlmb3IgKGludCBtID0gMCwgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IG0gPCBsZW5ndGg7IG0rKykgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCQlpZiAobWV0aG9kLnNlbGVjdG9yLmxlbmd0aCA9PSBzZWxlY3Rvckxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkgeworCQkJCQljb3VudCsrOworCQkJCQlsYXN0SW5kZXggPSBtOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJvb2xlYW4gZm91bmRQcm9ibGVtID0gZmFsc2U7CisJCQlpbnQgZmFpbGVkID0gMDsKKwkJCWZvciAoaW50IG0gPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgbSA8IGxlbmd0aDsgbSsrKSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQkJCWlmIChtZXRob2Quc2VsZWN0b3IubGVuZ3RoID09IHNlbGVjdG9yTGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgc2VsZWN0b3IpKSB7CisJCQkJCWlmIChyZXNvbHZlVHlwZXNGb3IobWV0aG9kKSA9PSBudWxsKSB7CisJCQkJCQlmb3VuZFByb2JsZW0gPSB0cnVlOworCQkJCQkJbWV0aG9kc1ttXSA9IG51bGw7IC8vIHVuYWJsZSB0byByZXNvbHZlIHBhcmFtZXRlcnMKKwkJCQkJCWZhaWxlZCsrOworCQkJCQl9IGVsc2UgaWYgKG1ldGhvZC5yZXR1cm5UeXBlID09IG51bGwpIHsKKwkJCQkJCWZvdW5kUHJvYmxlbSA9IHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb3VudCsrOworCQkJCQkJbGFzdEluZGV4ID0gbTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkKKwkJCWlmIChmb3VuZFByb2JsZW0gfHwgY291bnQgPiAxKSB7CisJCQkJZm9yIChpbnQgbSA9IG1ldGhvZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW21dOworCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnNlbGVjdG9yLmxlbmd0aCA9PSBzZWxlY3Rvckxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkgeworCQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbnVsbDsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QyID0gbWV0aG9kc1tpXTsKKwkJCQkJCQlpZiAobWV0aG9kMiAhPSBudWxsICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3RvciwgbWV0aG9kMi5zZWxlY3RvcikpIHsKKwkJCQkJCQkJaWYgKG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kMikpIHsKKwkJCQkJCQkJCWlmIChtZXRob2REZWNsID09IG51bGwpIHsKKwkJCQkJCQkJCQltZXRob2REZWNsID0gbWV0aG9kLnNvdXJjZU1ldGhvZCgpOyAvLyBjYW5ub3QgYmUgcmV0cmlldmVkIGFmdGVyIGJpbmRpbmcgaXMgbG9zdAorCQkJCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1ldGhvZEluVHlwZSh0aGlzLCBtZXRob2REZWNsKTsKKwkJCQkJCQkJCQltZXRob2REZWNsLmJpbmRpbmcgPSBudWxsOworCQkJCQkJCQkJCW1ldGhvZHNbbV0gPSBudWxsOworCQkJCQkJCQkJCWZhaWxlZCsrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTWV0aG9kSW5UeXBlKHRoaXMsIG1ldGhvZDIuc291cmNlTWV0aG9kKCkpOworCQkJCQkJCQkJbWV0aG9kMi5zb3VyY2VNZXRob2QoKS5iaW5kaW5nID0gbnVsbDsKKwkJCQkJCQkJCW1ldGhvZHNbaV0gPSBudWxsOworCQkJCQkJCQkJZmFpbGVkKys7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gbnVsbCAmJiBtZXRob2REZWNsID09IG51bGwpIHsgLy8gZm9yZ2V0IG1ldGhvZCB3aXRoIGludmFsaWQgcmV0dXJuIHR5cGUuLi4gd2FzIGtlcHQgdG8gZGV0ZWN0IHBvc3NpYmxlIGNvbGxpc2lvbnMKKwkJCQkJCQltZXRob2Quc291cmNlTWV0aG9kKCkuYmluZGluZyA9IG51bGw7CisJCQkJCQkJbWV0aG9kc1ttXSA9IG51bGw7CisJCQkJCQkJZmFpbGVkKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCisJCQkJaWYgKGZhaWxlZCA+IDApIHsKKwkJCQkJaW50IG5ld1NpemUgPSBtZXRob2RzLmxlbmd0aCAtIGZhaWxlZDsKKwkJCQkJaWYgKG5ld1NpemUgPT0gMCkKKwkJCQkJCXJldHVybiBtZXRob2RzID0gTm9NZXRob2RzOworCQorCQkJCQlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW25ld1NpemVdOworCQkJCQlmb3IgKGludCBpID0gMCwgbiA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCisJCQkJCQlpZiAobWV0aG9kc1tpXSAhPSBudWxsKQorCQkJCQkJCW5ld01ldGhvZHNbbisrXSA9IG1ldGhvZHNbaV07CisJCQkJCW1ldGhvZHMgPSBuZXdNZXRob2RzOworCQkJCQlyZXR1cm4gZ2V0TWV0aG9kcyhzZWxlY3Rvcik7IC8vIHRyeSBhZ2FpbiBub3cgdGhhdCB0aGUgcHJvYmxlbSBtZXRob2RzIGhhdmUgYmVlbiByZW1vdmVkCisJCQkJfQorCQkJfQorCQl9CisJCWlmIChjb3VudCA9PSAxKQorCQkJcmV0dXJuIG5ldyBNZXRob2RCaW5kaW5nW10ge21ldGhvZHNbbGFzdEluZGV4XX07CisJCWlmIChjb3VudCA+IDEpIHsKKwkJCU1ldGhvZEJpbmRpbmdbXSByZXN1bHQgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF07CisJCQljb3VudCA9IDA7CisJCQlmb3IgKGludCBtID0gMDsgbSA8PSBsYXN0SW5kZXg7IG0rKykgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCQlpZiAobWV0aG9kLnNlbGVjdG9yLmxlbmd0aCA9PSBzZWxlY3Rvckxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhtZXRob2Quc2VsZWN0b3IsIHNlbGVjdG9yKSkKKwkJCQkJcmVzdWx0W2NvdW50KytdID0gbWV0aG9kOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0gY2F0Y2goQWJvcnRDb21waWxhdGlvbiBlKXsKKwkJLy8gZW5zdXJlIG51bGwgbWV0aG9kcyBhcmUgcmVtb3ZlZAorCQlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG51bGw7CisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCWlmIChtZXRob2QgPT0gbnVsbCAmJiBuZXdNZXRob2RzID09IG51bGwpeworCQkJCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kcywgMCwgbmV3TWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW21heF0sIDAsIGkpOworCQkJfSBlbHNlIGlmIChuZXdNZXRob2RzICE9IG51bGwgJiYgbWV0aG9kICE9IG51bGwpIHsKKwkJCQluZXdNZXRob2RzW2NvdW50KytdID0gbWV0aG9kOworCQkJfQorCQl9CisJCWlmIChuZXdNZXRob2RzICE9IG51bGwpeworCQkJU3lzdGVtLmFycmF5Y29weShuZXdNZXRob2RzLCAwLCBtZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbY291bnRdLCAwLCBjb3VudCk7CisJCX0JCQkKKwkJbW9kaWZpZXJzIF49IEFjY1VucmVzb2x2ZWQ7CisJCXRocm93IGU7CisJfQkJCisJcmV0dXJuIE5vTWV0aG9kczsKK30KKy8qIEFuc3dlciB0aGUgc3ludGhldGljIGZpZWxkIGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPgorKglvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KKyovCisKK3B1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0U3ludGhldGljRmllbGQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisJCisJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCB8fCBzeW50aGV0aWNzW0ZJRUxEXSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlyZXR1cm4gKEZpZWxkQmluZGluZykgc3ludGhldGljc1tGSUVMRF0uZ2V0KGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7Cit9CitwdWJsaWMgUmVmZXJlbmNlQmluZGluZ1tdIG1lbWJlclR5cGVzKCkgeworCXJldHVybiBtZW1iZXJUeXBlczsKK30KK3B1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhGaWVsZEJpbmRpbmcgdGFyZ2V0RmllbGQsIFJlZmVyZW5jZUJpbmRpbmcgbmV3RGVjbGFyaW5nQ2xhc3MpIHsKKworCWlmIChzeW50aGV0aWNzID09IG51bGwpIHsKKwkJc3ludGhldGljcyA9IG5ldyBIYXNodGFibGVbNF07CisJfQorCWlmIChzeW50aGV0aWNzW0NIQU5HRURfREVDTEFSSU5HX0NMQVNTXSA9PSBudWxsKSB7CisJCXN5bnRoZXRpY3NbQ0hBTkdFRF9ERUNMQVJJTkdfQ0xBU1NdID0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisKKwlIYXNodGFibGUgZmllbGRNYXAgPSAoSGFzaHRhYmxlKSBzeW50aGV0aWNzW0NIQU5HRURfREVDTEFSSU5HX0NMQVNTXS5nZXQodGFyZ2V0RmllbGQpOworCWlmIChmaWVsZE1hcCA9PSBudWxsKSB7CisJCWZpZWxkTWFwID0gbmV3IEhhc2h0YWJsZSg1KTsKKwkJc3ludGhldGljc1tDSEFOR0VEX0RFQ0xBUklOR19DTEFTU10ucHV0KHRhcmdldEZpZWxkLCBmaWVsZE1hcCk7CisJfQorCUZpZWxkQmluZGluZyB1cGRhdGVkRmllbGQgPSAoRmllbGRCaW5kaW5nKSBmaWVsZE1hcC5nZXQobmV3RGVjbGFyaW5nQ2xhc3MpOworCWlmICh1cGRhdGVkRmllbGQgPT0gbnVsbCl7CisJCXVwZGF0ZWRGaWVsZCA9IG5ldyBGaWVsZEJpbmRpbmcodGFyZ2V0RmllbGQsIG5ld0RlY2xhcmluZ0NsYXNzKTsKKwkJZmllbGRNYXAucHV0KG5ld0RlY2xhcmluZ0NsYXNzLCB1cGRhdGVkRmllbGQpOworCX0KKwlyZXR1cm4gdXBkYXRlZEZpZWxkOworfQorCitwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRVcGRhdGVkTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZyBuZXdEZWNsYXJpbmdDbGFzcykgeworCisJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCkgeworCQlzeW50aGV0aWNzID0gbmV3IEhhc2h0YWJsZVs0XTsKKwl9CisJaWYgKHN5bnRoZXRpY3NbQ0hBTkdFRF9ERUNMQVJJTkdfQ0xBU1NdID09IG51bGwpIHsKKwkJc3ludGhldGljc1tDSEFOR0VEX0RFQ0xBUklOR19DTEFTU10gPSBuZXcgSGFzaHRhYmxlKDUpOworCX0KKworCisJSGFzaHRhYmxlIG1ldGhvZE1hcCA9IChIYXNodGFibGUpIHN5bnRoZXRpY3NbQ0hBTkdFRF9ERUNMQVJJTkdfQ0xBU1NdLmdldCh0YXJnZXRNZXRob2QpOworCWlmIChtZXRob2RNYXAgPT0gbnVsbCkgeworCQltZXRob2RNYXAgPSBuZXcgSGFzaHRhYmxlKDUpOworCQlzeW50aGV0aWNzW0NIQU5HRURfREVDTEFSSU5HX0NMQVNTXS5wdXQodGFyZ2V0TWV0aG9kLCBtZXRob2RNYXApOworCX0KKwlNZXRob2RCaW5kaW5nIHVwZGF0ZWRNZXRob2QgPSAoTWV0aG9kQmluZGluZykgbWV0aG9kTWFwLmdldChuZXdEZWNsYXJpbmdDbGFzcyk7CisJaWYgKHVwZGF0ZWRNZXRob2QgPT0gbnVsbCl7CisJCXVwZGF0ZWRNZXRob2QgPSBuZXcgTWV0aG9kQmluZGluZyh0YXJnZXRNZXRob2QsIG5ld0RlY2xhcmluZ0NsYXNzKTsKKwkJbWV0aG9kTWFwLnB1dChuZXdEZWNsYXJpbmdDbGFzcywgdXBkYXRlZE1ldGhvZCk7CisJfQorCXJldHVybiB1cGRhdGVkTWV0aG9kOworfQorCisvLyBOT1RFOiB0aGUgcmV0dXJuIHR5cGUsIGFyZyAmIGV4Y2VwdGlvbiB0eXBlcyBvZiBlYWNoIG1ldGhvZCBvZiBhIHNvdXJjZSB0eXBlIGFyZSByZXNvbHZlZCB3aGVuIG5lZWRlZAorcHVibGljIE1ldGhvZEJpbmRpbmdbXSBtZXRob2RzKCkgeworCXRyeSB7CisJCWlmICgobW9kaWZpZXJzICYgQWNjVW5yZXNvbHZlZCkgPT0gMCkKKwkJCXJldHVybiBtZXRob2RzOworCQorCQlpbnQgZmFpbGVkID0gMDsKKwkJZm9yIChpbnQgbSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBtIDwgbWF4OyBtKyspIHsKKwkJCWlmIChyZXNvbHZlVHlwZXNGb3IobWV0aG9kc1ttXSkgPT0gbnVsbCkgeworCQkJCW1ldGhvZHNbbV0gPSBudWxsOyAvLyB1bmFibGUgdG8gcmVzb2x2ZSBwYXJhbWV0ZXJzCisJCQkJZmFpbGVkKys7CisJCQl9CisJCX0KKwkKKwkJZm9yIChpbnQgbSA9IG1ldGhvZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCWlmIChtZXRob2QgIT0gbnVsbCkgeworCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG51bGw7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QyID0gbWV0aG9kc1tpXTsKKwkJCQkJaWYgKG1ldGhvZDIgIT0gbnVsbCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIG1ldGhvZDIuc2VsZWN0b3IpKSB7CisJCQkJCQlpZiAobWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2QyKSkgeworCQkJCQkJCWlmIChtZXRob2REZWNsID09IG51bGwpIHsKKwkJCQkJCQkJbWV0aG9kRGVjbCA9IG1ldGhvZC5zb3VyY2VNZXRob2QoKTsgLy8gY2Fubm90IGJlIHJldHJpZXZlZCBhZnRlciBiaW5kaW5nIGlzIGxvc3QKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlTWV0aG9kSW5UeXBlKHRoaXMsIG1ldGhvZERlY2wpOworCQkJCQkJCQltZXRob2REZWNsLmJpbmRpbmcgPSBudWxsOworCQkJCQkJCQltZXRob2RzW21dID0gbnVsbDsKKwkJCQkJCQkJZmFpbGVkKys7CisJCQkJCQkJfQorCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZU1ldGhvZEluVHlwZSh0aGlzLCBtZXRob2QyLnNvdXJjZU1ldGhvZCgpKTsKKwkJCQkJCQltZXRob2QyLnNvdXJjZU1ldGhvZCgpLmJpbmRpbmcgPSBudWxsOworCQkJCQkJCW1ldGhvZHNbaV0gPSBudWxsOworCQkJCQkJCWZhaWxlZCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChtZXRob2QucmV0dXJuVHlwZSA9PSBudWxsICYmIG1ldGhvZERlY2wgPT0gbnVsbCkgeyAvLyBmb3JnZXQgbWV0aG9kIHdpdGggaW52YWxpZCByZXR1cm4gdHlwZS4uLiB3YXMga2VwdCB0byBkZXRlY3QgcG9zc2libGUgY29sbGlzaW9ucworCQkJCQltZXRob2Quc291cmNlTWV0aG9kKCkuYmluZGluZyA9IG51bGw7CisJCQkJCW1ldGhvZHNbbV0gPSBudWxsOworCQkJCQlmYWlsZWQrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkKKwkJaWYgKGZhaWxlZCA+IDApIHsKKwkJCWludCBuZXdTaXplID0gbWV0aG9kcy5sZW5ndGggLSBmYWlsZWQ7CisJCQlpZiAobmV3U2l6ZSA9PSAwKSB7CisJCQkJbWV0aG9kcyA9IE5vTWV0aG9kczsKKwkJCX0gZWxzZSB7CisJCQkJTWV0aG9kQmluZGluZ1tdIG5ld01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tuZXdTaXplXTsKKwkJCQlmb3IgKGludCBtID0gMCwgbiA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBtIDwgbWF4OyBtKyspCisJCQkJCWlmIChtZXRob2RzW21dICE9IG51bGwpCisJCQkJCQluZXdNZXRob2RzW24rK10gPSBtZXRob2RzW21dOworCQkJCW1ldGhvZHMgPSBuZXdNZXRob2RzOworCQkJfQorCQl9CisJCisJCS8vIGhhbmRsZSBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gcG90ZW50aWFsIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcworCQlhZGREZWZhdWx0QWJzdHJhY3RNZXRob2RzKCk7CisJfSBjYXRjaChBYm9ydENvbXBpbGF0aW9uIGUpeworCQkvLyBlbnN1cmUgbnVsbCBtZXRob2RzIGFyZSByZW1vdmVkCisJCU1ldGhvZEJpbmRpbmdbXSBuZXdNZXRob2RzID0gbnVsbDsKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJaWYgKG1ldGhvZCA9PSBudWxsICYmIG5ld01ldGhvZHMgPT0gbnVsbCl7CisJCQkJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCBuZXdNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbbWF4XSwgMCwgaSk7CisJCQl9IGVsc2UgaWYgKG5ld01ldGhvZHMgIT0gbnVsbCAmJiBtZXRob2QgIT0gbnVsbCkgeworCQkJCW5ld01ldGhvZHNbY291bnQrK10gPSBtZXRob2Q7CisJCQl9CisJCX0KKwkJaWYgKG5ld01ldGhvZHMgIT0gbnVsbCl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld01ldGhvZHMsIDAsIG1ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1tjb3VudF0sIDAsIGNvdW50KTsKKwkJfQkJCQorCQltb2RpZmllcnMgXj0gQWNjVW5yZXNvbHZlZDsKKwkJdGhyb3cgZTsKKwl9CQkKKwltb2RpZmllcnMgXj0gQWNjVW5yZXNvbHZlZDsKKwlyZXR1cm4gbWV0aG9kczsKK30KK3ByaXZhdGUgRmllbGRCaW5kaW5nIHJlc29sdmVUeXBlRm9yKEZpZWxkQmluZGluZyBmaWVsZCkgeworCWlmIChmaWVsZC50eXBlICE9IG51bGwpCisJCXJldHVybiBmaWVsZDsKKworCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gc2NvcGUucmVmZXJlbmNlQ29udGV4dC5maWVsZHM7CisJZm9yIChpbnQgZiA9IDAsIGxlbmd0aCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBmIDwgbGVuZ3RoOyBmKyspIHsKKwkJaWYgKGZpZWxkRGVjbHNbZl0uYmluZGluZyAhPSBmaWVsZCkKKwkJCWNvbnRpbnVlOworCisJCWZpZWxkLnR5cGUgPSBmaWVsZERlY2xzW2ZdLmdldFR5cGVCaW5kaW5nKHNjb3BlKTsKKwkJaWYgKCFmaWVsZC50eXBlLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkVHlwZVByb2JsZW0odGhpcywgZmllbGREZWNsc1tmXSwgZmllbGQudHlwZSk7CisJCQkvL3Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKGZpZWxkRGVjbHNbZl0udHlwZSwgZmllbGQudHlwZSk7CisJCQlmaWVsZERlY2xzW2ZdLmJpbmRpbmcgPSBudWxsOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGZpZWxkLnR5cGUgPT0gVm9pZEJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnZhcmlhYmxlVHlwZUNhbm5vdEJlVm9pZChmaWVsZERlY2xzW2ZdKTsKKwkJCWZpZWxkRGVjbHNbZl0uYmluZGluZyA9IG51bGw7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoZmllbGQudHlwZS5pc0FycmF5VHlwZSgpICYmICgoQXJyYXlCaW5kaW5nKSBmaWVsZC50eXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBWb2lkQmluZGluZykgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkQXJyYXkoZmllbGREZWNsc1tmXSk7CisJCQlmaWVsZERlY2xzW2ZdLmJpbmRpbmcgPSBudWxsOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGZpZWxkOworCX0KKwlyZXR1cm4gbnVsbDsgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcG9pbnQKK30KK3ByaXZhdGUgTWV0aG9kQmluZGluZyByZXNvbHZlVHlwZXNGb3IoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwlpZiAoKG1ldGhvZC5tb2RpZmllcnMgJiBBY2NVbnJlc29sdmVkKSA9PSAwKQorCQlyZXR1cm4gbWV0aG9kOworCisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbWV0aG9kLnNvdXJjZU1ldGhvZCgpOworCVR5cGVSZWZlcmVuY2VbXSBleGNlcHRpb25UeXBlcyA9IG1ldGhvZERlY2wudGhyb3duRXhjZXB0aW9uczsKKwlpZiAoZXhjZXB0aW9uVHlwZXMgIT0gbnVsbCkgeworCQlpbnQgc2l6ZSA9IGV4Y2VwdGlvblR5cGVzLmxlbmd0aDsKKwkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tzaXplXTsKKwkJUmVmZXJlbmNlQmluZGluZyB0aHJvd2FibGUgPSBzY29wZS5nZXRKYXZhTGFuZ1Rocm93YWJsZSgpOworCQlpbnQgY291bnQgPSAwOworCQlSZWZlcmVuY2VCaW5kaW5nIHJlc29sdmVkRXhjZXB0aW9uVHlwZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXJlc29sdmVkRXhjZXB0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBleGNlcHRpb25UeXBlc1tpXS5nZXRUeXBlQmluZGluZyhzY29wZSk7CisJCQlpZiAoIXJlc29sdmVkRXhjZXB0aW9uVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5leGNlcHRpb25UeXBlUHJvYmxlbSh0aGlzLCBtZXRob2REZWNsLCBleGNlcHRpb25UeXBlc1tpXSwgcmVzb2x2ZWRFeGNlcHRpb25UeXBlKTsKKwkJCQkvL21ldGhvZERlY2wuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZFR5cGUoZXhjZXB0aW9uVHlwZXNbaV0sIHJlc29sdmVkRXhjZXB0aW9uVHlwZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodGhyb3dhYmxlICE9IHJlc29sdmVkRXhjZXB0aW9uVHlwZSAmJiAhdGhyb3dhYmxlLmlzU3VwZXJjbGFzc09mKHJlc29sdmVkRXhjZXB0aW9uVHlwZSkpIHsKKwkJCQltZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFRocm93VHlwZSh0aGlzLCBtZXRob2REZWNsLCBleGNlcHRpb25UeXBlc1tpXSwgcmVzb2x2ZWRFeGNlcHRpb25UeXBlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1ldGhvZC50aHJvd25FeGNlcHRpb25zW2NvdW50KytdID0gcmVzb2x2ZWRFeGNlcHRpb25UeXBlOworCQl9CisJCWlmIChjb3VudCA8IHNpemUpCisJCQlTeXN0ZW0uYXJyYXljb3B5KG1ldGhvZC50aHJvd25FeGNlcHRpb25zLCAwLCBtZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2NvdW50XSwgMCwgY291bnQpOworCX0KKworCWJvb2xlYW4gZm91bmRBcmdQcm9ibGVtID0gZmFsc2U7CisJQXJndW1lbnRbXSBhcmd1bWVudHMgPSBtZXRob2REZWNsLmFyZ3VtZW50czsKKwlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJaW50IHNpemUgPSBhcmd1bWVudHMubGVuZ3RoOworCQltZXRob2QucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1tzaXplXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCUFyZ3VtZW50IGFyZyA9IGFyZ3VtZW50c1tpXTsKKwkJCW1ldGhvZC5wYXJhbWV0ZXJzW2ldID0gYXJnLnR5cGUuZ2V0VHlwZUJpbmRpbmcoc2NvcGUpOworCQkJaWYgKCFtZXRob2QucGFyYW1ldGVyc1tpXS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hcmd1bWVudFR5cGVQcm9ibGVtKHRoaXMsIG1ldGhvZERlY2wsIGFyZywgbWV0aG9kLnBhcmFtZXRlcnNbaV0pOworCQkJCS8vbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZShhcmcsIG1ldGhvZC5wYXJhbWV0ZXJzW2ldKTsKKwkJCQlmb3VuZEFyZ1Byb2JsZW0gPSB0cnVlOworCQkJfSBlbHNlIGlmIChtZXRob2QucGFyYW1ldGVyc1tpXSA9PSBWb2lkQmluZGluZykgeworCQkJCW1ldGhvZERlY2wuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXJndW1lbnRUeXBlQ2Fubm90QmVWb2lkKHRoaXMsIG1ldGhvZERlY2wsIGFyZyk7CisJCQkJZm91bmRBcmdQcm9ibGVtID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAobWV0aG9kLnBhcmFtZXRlcnNbaV0uaXNBcnJheVR5cGUoKSAmJiAoKEFycmF5QmluZGluZykgbWV0aG9kLnBhcmFtZXRlcnNbaV0pLmxlYWZDb21wb25lbnRUeXBlID09IFZvaWRCaW5kaW5nKSB7CisJCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5hcmd1bWVudFR5cGVDYW5ub3RCZVZvaWRBcnJheSh0aGlzLCBtZXRob2REZWNsLCBhcmcpOworCQkJCWZvdW5kQXJnUHJvYmxlbSA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlib29sZWFuIGZvdW5kUmV0dXJuVHlwZVByb2JsZW0gPSBmYWxzZTsKKwlpZiAoIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gKChNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbCkucmV0dXJuVHlwZTsKKwkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgeworCQkJbWV0aG9kRGVjbC5zY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nUmV0dXJuVHlwZShtZXRob2REZWNsKTsKKwkJCW1ldGhvZC5yZXR1cm5UeXBlID0gbnVsbDsKKwkJCWZvdW5kUmV0dXJuVHlwZVByb2JsZW0gPSB0cnVlOworCQl9IGVsc2UgeworCQkJbWV0aG9kLnJldHVyblR5cGUgPSByZXR1cm5UeXBlLmdldFR5cGVCaW5kaW5nKHNjb3BlKTsKKwkJCWlmICghbWV0aG9kLnJldHVyblR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCW1ldGhvZERlY2wuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmV0dXJuVHlwZVByb2JsZW0odGhpcywgKE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsLCBtZXRob2QucmV0dXJuVHlwZSk7CisJCQkJLy9tZXRob2REZWNsLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHJldHVyblR5cGUsIG1ldGhvZC5yZXR1cm5UeXBlKTsKKwkJCQltZXRob2QucmV0dXJuVHlwZSA9IG51bGw7CisJCQkJZm91bmRSZXR1cm5UeXBlUHJvYmxlbSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKG1ldGhvZC5yZXR1cm5UeXBlLmlzQXJyYXlUeXBlKCkgJiYgKChBcnJheUJpbmRpbmcpIG1ldGhvZC5yZXR1cm5UeXBlKS5sZWFmQ29tcG9uZW50VHlwZSA9PSBWb2lkQmluZGluZykgeworCQkJCW1ldGhvZERlY2wuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkucmV0dXJuVHlwZUNhbm5vdEJlVm9pZEFycmF5KHRoaXMsIChNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbCk7CisJCQkJbWV0aG9kLnJldHVyblR5cGUgPSBudWxsOworCQkJCWZvdW5kUmV0dXJuVHlwZVByb2JsZW0gPSB0cnVlOworCQkJfQorCQl9CisJfQorCWlmIChmb3VuZEFyZ1Byb2JsZW0pIHsKKwkJbWV0aG9kRGVjbC5iaW5kaW5nID0gbnVsbDsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmIChmb3VuZFJldHVyblR5cGVQcm9ibGVtKQorCQlyZXR1cm4gbWV0aG9kOyAvLyBidXQgaXRzIHN0aWxsIHVucmVzb2x2ZWQgd2l0aCBhIG51bGwgcmV0dXJuIHR5cGUgJiBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gaXRzIG1ldGhvZCBkZWNsYXJhdGlvbgorCisJbWV0aG9kLm1vZGlmaWVycyBePSBBY2NVbnJlc29sdmVkOworCXJldHVybiBtZXRob2Q7Cit9CitwdWJsaWMgZmluYWwgaW50IHNvdXJjZUVuZCgpIHsKKwlyZXR1cm4gc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zb3VyY2VFbmQ7Cit9CitwdWJsaWMgZmluYWwgaW50IHNvdXJjZVN0YXJ0KCkgeworCXJldHVybiBzY29wZS5yZWZlcmVuY2VDb250ZXh0LnNvdXJjZVN0YXJ0OworfQorcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcygpIHsKKwlyZXR1cm4gc3VwZXJjbGFzczsKK30KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzKCkgeworCXJldHVybiBzdXBlckludGVyZmFjZXM7Cit9CitwdWJsaWMgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIHN5bnRoZXRpY0FjY2Vzc01ldGhvZHMoKSB7CisJCisJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCB8fCBzeW50aGV0aWNzW01FVEhPRF0gPT0gbnVsbCB8fCBzeW50aGV0aWNzW01FVEhPRF0uc2l6ZSgpID09IDApIHJldHVybiBudWxsOworCisJLy8gZGlmZmljdWx0IHRvIGNvbXB1dGUgc2l6ZSB1cCBmcm9udCBiZWNhdXNlIG9mIHRoZSBlbWJlZGRlZCBhcnJheXMgc28gYXNzdW1lIHRoZXJlIGlzIG9ubHkgMQorCWludCBpbmRleCA9IDA7CisJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIGJpbmRpbmdzID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbMV07CisJRW51bWVyYXRpb24gZmllbGRzT3JNZXRob2RzID0gc3ludGhldGljc1tNRVRIT0RdLmtleXMoKTsKKwl3aGlsZSAoZmllbGRzT3JNZXRob2RzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCU9iamVjdCBmaWVsZE9yTWV0aG9kID0gZmllbGRzT3JNZXRob2RzLm5leHRFbGVtZW50KCk7CisJCWlmIChmaWVsZE9yTWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykgeworCQkJaWYgKGluZGV4ICsgMSA+IGJpbmRpbmdzLmxlbmd0aCkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGJpbmRpbmdzLCAwLCAoYmluZGluZ3MgPSBuZXcgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tpbmRleCArIDFdKSwgMCwgaW5kZXgpOworCQkJYmluZGluZ3NbaW5kZXgrK10gPSAoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZykgc3ludGhldGljc1tNRVRIT0RdLmdldChmaWVsZE9yTWV0aG9kKTsKKwkJfSBlbHNlIHsKKwkJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBmaWVsZEFjY2Vzc29ycyA9IChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10pIHN5bnRoZXRpY3NbTUVUSE9EXS5nZXQoZmllbGRPck1ldGhvZCk7CisJCQlpbnQgbnVtYmVyT2ZBY2Nlc3NvcnMgPSAwOworCQkJaWYgKGZpZWxkQWNjZXNzb3JzWzBdICE9IG51bGwpIG51bWJlck9mQWNjZXNzb3JzKys7CisJCQlpZiAoZmllbGRBY2Nlc3NvcnNbMV0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKKwkJCWlmIChpbmRleCArIG51bWJlck9mQWNjZXNzb3JzID4gYmluZGluZ3MubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIChiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW2luZGV4ICsgbnVtYmVyT2ZBY2Nlc3NvcnNdKSwgMCwgaW5kZXgpOworCQkJaWYgKGZpZWxkQWNjZXNzb3JzWzBdICE9IG51bGwpIAorCQkJCWJpbmRpbmdzW2luZGV4KytdID0gZmllbGRBY2Nlc3NvcnNbMF07CisJCQlpZiAoZmllbGRBY2Nlc3NvcnNbMV0gIT0gbnVsbCkgCisJCQkJYmluZGluZ3NbaW5kZXgrK10gPSBmaWVsZEFjY2Vzc29yc1sxXTsKKwkJfQorCX0KKworCS8vIHNvcnQgdGhlbSBpbiBhY2NvcmRpbmcgdG8gdGhlaXIgb3duIGluZGV4ZXMKKwlpbnQgbGVuZ3RoOworCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBzb3J0ZWRCaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW2xlbmd0aCA9IGJpbmRpbmdzLmxlbmd0aF07CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdzW2ldOworCQlzb3J0ZWRCaW5kaW5nc1tiaW5kaW5nLmluZGV4XSA9IGJpbmRpbmc7CisJfQorCXJldHVybiBzb3J0ZWRCaW5kaW5nczsKK30KKy8qKgorICogQW5zd2VyIHRoZSBjb2xsZWN0aW9uIG9mIHN5bnRoZXRpYyBmaWVsZHMgdG8gYXBwZW5kIGludG8gdGhlIGNsYXNzZmlsZQorICovCitwdWJsaWMgRmllbGRCaW5kaW5nW10gc3ludGhldGljRmllbGRzKCkgeworCQorCWlmIChzeW50aGV0aWNzID09IG51bGwpIHJldHVybiBudWxsOworCisJaW50IGZpZWxkU2l6ZSA9IHN5bnRoZXRpY3NbRklFTERdID09IG51bGwgPyAwIDogc3ludGhldGljc1tGSUVMRF0uc2l6ZSgpOworCWludCBsaXRlcmFsU2l6ZSA9IHN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0gPT0gbnVsbCA/IDAgOnN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0uc2l6ZSgpOworCWludCB0b3RhbFNpemUgPSBmaWVsZFNpemUgKyBsaXRlcmFsU2l6ZTsKKwlpZiAodG90YWxTaXplID09IDApIHJldHVybiBudWxsOworCUZpZWxkQmluZGluZ1tdIGJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1t0b3RhbFNpemVdOworCisJLy8gYWRkIGlubmVyY2xhc3Mgc3ludGhldGljcworCWlmIChzeW50aGV0aWNzW0ZJRUxEXSAhPSBudWxsKXsKKwkJRW51bWVyYXRpb24gZWxlbWVudHMgPSBzeW50aGV0aWNzW0ZJRUxEXS5lbGVtZW50cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkU2l6ZTsgaSsrKSB7CisJCQlTeW50aGV0aWNGaWVsZEJpbmRpbmcgc3ludGhCaW5kaW5nID0gKFN5bnRoZXRpY0ZpZWxkQmluZGluZykgZWxlbWVudHMubmV4dEVsZW1lbnQoKTsKKwkJCWJpbmRpbmdzW3N5bnRoQmluZGluZy5pbmRleF0gPSBzeW50aEJpbmRpbmc7CisJCX0KKwl9CisJLy8gYWRkIGNsYXNzIGxpdGVyYWwgc3ludGhldGljcworCWlmIChzeW50aGV0aWNzW0NMQVNTX0xJVEVSQUxdICE9IG51bGwpeworCQlFbnVtZXJhdGlvbiBlbGVtZW50cyA9IHN5bnRoZXRpY3NbQ0xBU1NfTElURVJBTF0uZWxlbWVudHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXRlcmFsU2l6ZTsgaSsrKSB7CisJCQlTeW50aGV0aWNGaWVsZEJpbmRpbmcgc3ludGhCaW5kaW5nID0gKFN5bnRoZXRpY0ZpZWxkQmluZGluZykgZWxlbWVudHMubmV4dEVsZW1lbnQoKTsKKwkJCWJpbmRpbmdzW2ZpZWxkU2l6ZStzeW50aEJpbmRpbmcuaW5kZXhdID0gc3ludGhCaW5kaW5nOworCQl9CisJfQorCXJldHVybiBiaW5kaW5nczsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAiKGlkPSIrKGlkID09IE5vSWQgPyAiTm9JZCIgOiAoIiIraWQpICkgKyIpXG4iOyAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTEkCisKKwlpZiAoaXNEZXByZWNhdGVkKCkpIHMgKz0gImRlcHJlY2F0ZWQgIjsgLy8kTk9OLU5MUy0xJAorCWlmIChpc1B1YmxpYygpKSBzICs9ICJwdWJsaWMgIjsgLy8kTk9OLU5MUy0xJAorCWlmIChpc1Byb3RlY3RlZCgpKSBzICs9ICJwcm90ZWN0ZWQgIjsgLy8kTk9OLU5MUy0xJAorCWlmIChpc1ByaXZhdGUoKSkgcyArPSAicHJpdmF0ZSAiOyAvLyROT04tTkxTLTEkCisJaWYgKGlzQWJzdHJhY3QoKSAmJiBpc0NsYXNzKCkpIHMgKz0gImFic3RyYWN0ICI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoaXNTdGF0aWMoKSAmJiBpc05lc3RlZFR5cGUoKSkgcyArPSAic3RhdGljICI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoaXNGaW5hbCgpKSBzICs9ICJmaW5hbCAiOyAvLyROT04tTkxTLTEkCisKKwlzICs9IGlzSW50ZXJmYWNlKCkgPyAiaW50ZXJmYWNlICIgOiAiY2xhc3MgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJcyArPSAoY29tcG91bmROYW1lICE9IG51bGwpID8gQ2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wb3VuZE5hbWUpIDogIlVOTkFNRUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQKKworCXMgKz0gIlxuXHRleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQKKwlzICs9IChzdXBlcmNsYXNzICE9IG51bGwpID8gc3VwZXJjbGFzcy5kZWJ1Z05hbWUoKSA6ICJOVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkCisKKwlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJcyArPSAiXG5cdGltcGxlbWVudHMgOiAiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGkgID4gMCkKKwkJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCisJCQkJcyArPSAoc3VwZXJJbnRlcmZhY2VzW2ldICE9IG51bGwpID8gc3VwZXJJbnRlcmZhY2VzW2ldLmRlYnVnTmFtZSgpIDogIk5VTEwgVFlQRSI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXMgKz0gIk5VTEwgU1VQRVJJTlRFUkZBQ0VTIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCWlmIChlbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgeworCQlzICs9ICJcblx0ZW5jbG9zaW5nIHR5cGUgOiAiOyAvLyROT04tTkxTLTEkCisJCXMgKz0gZW5jbG9zaW5nVHlwZSgpLmRlYnVnTmFtZSgpOworCX0KKworCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQlpZiAoZmllbGRzICE9IE5vRmllbGRzKSB7CisJCQlzICs9ICJcbi8qICAgZmllbGRzICAgKi8iOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCXMgKz0gKGZpZWxkc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBmaWVsZHNbaV0udG9TdHJpbmcoKSA6ICJcbk5VTEwgRklFTEQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0gZWxzZSB7CisJCXMgKz0gIk5VTEwgRklFTERTIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJaWYgKG1ldGhvZHMgIT0gTm9NZXRob2RzKSB7CisJCQlzICs9ICJcbi8qICAgbWV0aG9kcyAgICovIjsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJcyArPSAobWV0aG9kc1tpXSAhPSBudWxsKSA/ICJcbiIgKyBtZXRob2RzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIE1FVEhPRCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfSBlbHNlIHsKKwkJcyArPSAiTlVMTCBNRVRIT0RTIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCWlmIChtZW1iZXJUeXBlcyAhPSBOb01lbWJlclR5cGVzKSB7CisJCQlzICs9ICJcbi8qICAgbWVtYmVycyAgICovIjsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCXMgKz0gKG1lbWJlclR5cGVzW2ldICE9IG51bGwpID8gIlxuIiArIG1lbWJlclR5cGVzW2ldLnRvU3RyaW5nKCkgOiAiXG5OVUxMIFRZUEUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0gZWxzZSB7CisJCXMgKz0gIk5VTEwgTUVNQkVSIFRZUEVTIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXMgKz0gIlxuXG5cbiI7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gczsKK30KK3ZvaWQgdmVyaWZ5TWV0aG9kcyhNZXRob2RWZXJpZmllciB2ZXJpZmllcikgeworCXZlcmlmaWVyLnZlcmlmeSh0aGlzKTsKKworCWZvciAoaW50IGkgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJICgoU291cmNlVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKS52ZXJpZnlNZXRob2RzKHZlcmlmaWVyKTsKK30KKworLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgZmllbGQgZm9yIDx0YXJnZXRFbmNsb3NpbmdUeXBlPgorKglvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KKyovCisKK3B1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0U3ludGhldGljRmllbGQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlLCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIG9ubHlFeGFjdE1hdGNoKSB7CisKKwlpZiAoc3ludGhldGljcyA9PSBudWxsIHx8IHN5bnRoZXRpY3NbRklFTERdID09IG51bGwpIHJldHVybiBudWxsOworCUZpZWxkQmluZGluZyBmaWVsZCA9IChGaWVsZEJpbmRpbmcpIHN5bnRoZXRpY3NbRklFTERdLmdldCh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKKwlpZiAoZmllbGQgIT0gbnVsbCkgcmV0dXJuIGZpZWxkOworCisJLy8gdHlwZSBjb21wYXRpYmlsaXR5IDogdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMKKwkvLyBjbGFzcyBUIHsgY2xhc3MgTXt9fQorCS8vIGNsYXNzIFMgZXh0ZW5kcyBUIHsgY2xhc3MgTiBleHRlbmRzIE0ge319IC0tPiBuZWVkIHRvIHVzZSBTIGFzIGEgZGVmYXVsdCBlbmNsb3NpbmcgaW5zdGFuY2UgZm9yIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIGluIE4oKS4KKwlpZiAoIW9ubHlFeGFjdE1hdGNoKXsKKwkJRW51bWVyYXRpb24gZW51bSA9IHN5bnRoZXRpY3NbRklFTERdLmVsZW1lbnRzKCk7CisJCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlmaWVsZCA9IChGaWVsZEJpbmRpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLnN0YXJ0c1dpdGgoZmllbGQubmFtZSwgU3ludGhldGljQXJndW1lbnRCaW5kaW5nLkVuY2xvc2luZ0luc3RhbmNlUHJlZml4KQorCQkJCSYmIHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoKFJlZmVyZW5jZUJpbmRpbmcpIGZpZWxkLnR5cGUpKQorCQkJCQlyZXR1cm4gZmllbGQ7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDBmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgZXh0ZW5kcyBNZXRob2RCaW5kaW5nIHsKKworCXB1YmxpYyBGaWVsZEJpbmRpbmcgdGFyZ2V0UmVhZEZpZWxkOwkvLyByZWFkIGFjY2VzcyB0byBhIGZpZWxkCisJcHVibGljIEZpZWxkQmluZGluZyB0YXJnZXRXcml0ZUZpZWxkOwkJLy8gd3JpdGUgYWNjZXNzIHRvIGEgZmllbGQKKwlwdWJsaWMgTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2Q7CQkvLyBtZXRob2Qgb3IgY29uc3RydWN0b3IKKworCXB1YmxpYyBpbnQgYWNjZXNzVHlwZTsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZpZWxkUmVhZEFjY2VzcyA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRmllbGRXcml0ZUFjY2VzcyA9IDI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTWV0aG9kQWNjZXNzID0gMzsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDb25zdHJ1Y3RvckFjY2VzcyA9IDQ7CisKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEFjY2Vzc01ldGhvZFByZWZpeCA9IHsgJ2EnLCAnYycsICdjJywgJ2UnLCAncycsICdzJywgJyQnIH07CisKKwlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0ID0gMDsgLy8gc3RhcnQgcG9zaXRpb24gb2YgdGhlIG1hdGNoaW5nIGRlY2xhcmF0aW9uCisJcHVibGljIGludCBpbmRleDsgLy8gdXNlZCBmb3Igc29ydGluZyBhY2Nlc3MgbWV0aG9kcyBpbiB0aGUgY2xhc3MgZmlsZQorcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCXRoaXMubW9kaWZpZXJzID0gQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYzsKKwlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJpbmdTb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKKwlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7CisJaW50IG1ldGhvZElkID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKKwl0aGlzLmluZGV4ID0gbWV0aG9kSWQ7CisJdGhpcy5zZWxlY3RvciA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFjY2Vzc01ldGhvZFByZWZpeCwgU3RyaW5nLnZhbHVlT2YobWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpOworCWlmIChpc1JlYWRBY2Nlc3MpIHsKKwkJdGhpcy5yZXR1cm5UeXBlID0gdGFyZ2V0RmllbGQudHlwZTsKKwkJaWYgKHRhcmdldEZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCXRoaXMucGFyYW1ldGVycyA9IE5vUGFyYW1ldGVyczsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1sxXTsKKwkJCXRoaXMucGFyYW1ldGVyc1swXSA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisJCX0KKwkJdGhpcy50YXJnZXRSZWFkRmllbGQgPSB0YXJnZXRGaWVsZDsKKwkJdGhpcy5hY2Nlc3NUeXBlID0gRmllbGRSZWFkQWNjZXNzOworCX0gZWxzZSB7CisJCXRoaXMucmV0dXJuVHlwZSA9IFZvaWRCaW5kaW5nOworCQlpZiAodGFyZ2V0RmllbGQuaXNTdGF0aWMoKSkgeworCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nWzFdOworCQkJdGhpcy5wYXJhbWV0ZXJzWzBdID0gdGFyZ2V0RmllbGQudHlwZTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1syXTsKKwkJCXRoaXMucGFyYW1ldGVyc1swXSA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisJCQl0aGlzLnBhcmFtZXRlcnNbMV0gPSB0YXJnZXRGaWVsZC50eXBlOworCQl9CisJCXRoaXMudGFyZ2V0V3JpdGVGaWVsZCA9IHRhcmdldEZpZWxkOworCQl0aGlzLmFjY2Vzc1R5cGUgPSBGaWVsZFdyaXRlQWNjZXNzOworCX0KKwl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7CisJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisKKwkvLyBjaGVjayBmb3IgbWV0aG9kIGNvbGxpc2lvbgorCWJvb2xlYW4gbmVlZFJlbmFtZTsKKwlkbyB7CisJCWNoZWNrIDogeworCQkJbmVlZFJlbmFtZSA9IGZhbHNlOworCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGtub3duIG1ldGhvZHMKKwkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5tZXRob2RzOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBtZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCW5lZWRSZW5hbWUgPSB0cnVlOworCQkJCQlicmVhayBjaGVjazsKKwkJCQl9CisJCQl9CisJCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycworCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpIGNvbnRpbnVlOworCQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IgJiYgdGhpcy5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKKwkJCQkJCW5lZWRSZW5hbWUgPSB0cnVlOworCQkJCQkJYnJlYWsgY2hlY2s7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG5lZWRSZW5hbWUpIHsgLy8gcmV0cnkgd2l0aCBhIHNlbGVjdG9yIHBvc3RmaXhlZCBieSBhIGdyb3dpbmcgbWV0aG9kSWQKKwkJCXRoaXMuc2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CisJCX0KKwl9IHdoaWxlIChuZWVkUmVuYW1lKTsKKworCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IGZpZWxkIGZvciBsaW5lIG51bWJlciBhdHRyaWJ1dGVzCisJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOworCWlmIChmaWVsZERlY2xzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChmaWVsZERlY2xzW2ldLmJpbmRpbmcgPT0gdGFyZ2V0RmllbGQpIHsKKwkJCQl0aGlzLnNvdXJjZVN0YXJ0ID0gZmllbGREZWNsc1tpXS5zb3VyY2VTdGFydDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKy8qIGRpZCBub3QgZmluZCB0aGUgdGFyZ2V0IGZpZWxkIGRlY2xhcmF0aW9uIC0gaXQgaXMgYSBzeW50aGV0aWMgb25lCisJcHVibGljIGNsYXNzIEEgeworCQlwdWJsaWMgY2xhc3MgQiB7CisJCQlwdWJsaWMgY2xhc3MgQyB7CisJCQkJdm9pZCBmb28oKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQS50aGlzID0gIiArIEEudGhpcyk7CisJCQkJfQorCQkJfQorCQl9CisJCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKwkJCW5ldyBBKCkubmV3IEIoKS5uZXcgQygpLmZvbygpOworCQl9CisJfQkKKyovCisJLy8gV2Ugbm93IGF0IHRoaXMgcG9pbnQgLSBwZXIgY29uc3RydWN0aW9uIC0gaXQgaXMgZm9yIHN1cmUgYW4gZW5jbG9zaW5nIGluc3RhbmNlLCB3ZSBhcmUgZ29pbmcgdG8KKwkvLyBzaG93IHRoZSB0YXJnZXQgZmllbGQgdHlwZSBkZWNsYXJhdGlvbiBsb2NhdGlvbi4KKwl0aGlzLnNvdXJjZVN0YXJ0ID0gZGVjbGFyaW5nU291cmNlVHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0LnNvdXJjZVN0YXJ0OyAvLyB1c2UgdGhlIHRhcmdldCBkZWNsYXJpbmcgY2xhc3MgbmFtZSBwb3NpdGlvbiBpbnN0ZWFkCit9CitwdWJsaWMgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsKKworCWlmICh0YXJnZXRNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7CisJCXRoaXMuaW5pdGlhbGl6ZUNvbnN0cnVjdG9yQWNjZXNzb3IodGFyZ2V0TWV0aG9kKTsKKwl9IGVsc2UgeworCQl0aGlzLmluaXRpYWxpemVNZXRob2RBY2Nlc3Nvcih0YXJnZXRNZXRob2QsIHJlY2VpdmVyVHlwZSk7CisJfQorfQorLyoqCisgKiBBbiBjb25zdHJ1Y3RvciBhY2Nlc3NvciBpcyBhIGNvbnN0cnVjdG9yIHdpdGggYW4gZXh0cmEgYXJndW1lbnQgKGRlY2xhcmluZ0NsYXNzKSwgaW4gY2FzZSBvZgorICogY29sbGlzaW9uIHdpdGggYW4gZXhpc3RpbmcgY29uc3RydWN0b3IsIHRoZW4gYWRkIGFnYWluIGFuIGV4dHJhIGFyZ3VtZW50IChkZWNsYXJpbmdDbGFzcyBhZ2FpbikuCisgKi8KKyBwdWJsaWMgdm9pZCBpbml0aWFsaXplQ29uc3RydWN0b3JBY2Nlc3NvcihNZXRob2RCaW5kaW5nIHRhcmdldENvbnN0cnVjdG9yKSB7CisKKwl0aGlzLnRhcmdldE1ldGhvZCA9IHRhcmdldENvbnN0cnVjdG9yOworCXRoaXMubW9kaWZpZXJzID0gQWNjRGVmYXVsdCB8IEFjY1N5bnRoZXRpYzsKKwlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gCisJCShTb3VyY2VUeXBlQmluZGluZykgdGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3M7IAorCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBrbm93bkFjY2Vzc01ldGhvZHMgPSAKKwkJc291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7IAorCXRoaXMuaW5kZXggPSBrbm93bkFjY2Vzc01ldGhvZHMgPT0gbnVsbCA/IDAgOiBrbm93bkFjY2Vzc01ldGhvZHMubGVuZ3RoOworCisJdGhpcy5zZWxlY3RvciA9IHRhcmdldENvbnN0cnVjdG9yLnNlbGVjdG9yOworCXRoaXMucmV0dXJuVHlwZSA9IHRhcmdldENvbnN0cnVjdG9yLnJldHVyblR5cGU7CisJdGhpcy5hY2Nlc3NUeXBlID0gQ29uc3RydWN0b3JBY2Nlc3M7CisJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW3RhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoICsgMV07CisJU3lzdGVtLmFycmF5Y29weSgKKwkJdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycywgCisJCTAsIAorCQl0aGlzLnBhcmFtZXRlcnMsIAorCQkwLCAKKwkJdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGgpOyAKKwlwYXJhbWV0ZXJzW3RhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoXSA9IAorCQl0YXJnZXRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzczsgCisJdGhpcy50aHJvd25FeGNlcHRpb25zID0gdGFyZ2V0Q29uc3RydWN0b3IudGhyb3duRXhjZXB0aW9uczsKKwl0aGlzLmRlY2xhcmluZ0NsYXNzID0gc291cmNlVHlwZTsKKworCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCisJYm9vbGVhbiBuZWVkUmVuYW1lOworCWRvIHsKKwkJY2hlY2sgOiB7CisJCQluZWVkUmVuYW1lID0gZmFsc2U7CisJCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGgga25vd24gbWV0aG9kcworCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLm1ldGhvZHM7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICh0aGlzLnNlbGVjdG9yID09IG1ldGhvZHNbaV0uc2VsZWN0b3IKKwkJCQkJJiYgdGhpcy5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKKwkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CisJCQkJCWJyZWFrIGNoZWNrOworCQkJCX0KKwkJCX0KKwkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBzeW50aGV0aWMgYWNjZXNzb3JzCisJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHNbaV0gPT0gbnVsbCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IKKwkJCQkJCSYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKKwkJCQkJCWJyZWFrIGNoZWNrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBuZXcgZXh0cmEgYXJndW1lbnQKKwkJCWludCBsZW5ndGggPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnBhcmFtZXRlcnMsIAorCQkJCTAsIAorCQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGggKyAxXSwgCisJCQkJMCwgCisJCQkJbGVuZ3RoKTsgCisJCQl0aGlzLnBhcmFtZXRlcnNbbGVuZ3RoXSA9IHRoaXMuZGVjbGFyaW5nQ2xhc3M7CisJCX0KKwl9IHdoaWxlIChuZWVkUmVuYW1lKTsKKworCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNscyA9IAorCQlzb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQubWV0aG9kczsgCisJaWYgKG1ldGhvZERlY2xzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZERlY2xzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAobWV0aG9kRGVjbHNbaV0uYmluZGluZyA9PSB0YXJnZXRDb25zdHJ1Y3RvcikgeworCQkJCXRoaXMuc291cmNlU3RhcnQgPSBtZXRob2REZWNsc1tpXS5zb3VyY2VTdGFydDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIEFuIG1ldGhvZCBhY2Nlc3NvciBpcyBhIG1ldGhvZCB3aXRoIGFuIGFjY2VzcyROIHNlbGVjdG9yLCB3aGVyZSBOIGlzIGluY3JlbWVudGVkIGluIGNhc2Ugb2YgY29sbGlzaW9ucy4KKyAqLworCitwdWJsaWMgdm9pZCBpbml0aWFsaXplTWV0aG9kQWNjZXNzb3IoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKKwkKKwl0aGlzLnRhcmdldE1ldGhvZCA9IHRhcmdldE1ldGhvZDsKKwl0aGlzLm1vZGlmaWVycyA9IEFjY0RlZmF1bHQgfCBBY2NTdGF0aWMgfCBBY2NTeW50aGV0aWM7CisJU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyaW5nU291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7CisJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIGtub3duQWNjZXNzTWV0aG9kcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUuc3ludGhldGljQWNjZXNzTWV0aG9kcygpOworCWludCBtZXRob2RJZCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CisJdGhpcy5pbmRleCA9IG1ldGhvZElkOworCisJdGhpcy5zZWxlY3RvciA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFjY2Vzc01ldGhvZFByZWZpeCwgU3RyaW5nLnZhbHVlT2YobWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpOworCXRoaXMucmV0dXJuVHlwZSA9IHRhcmdldE1ldGhvZC5yZXR1cm5UeXBlOworCXRoaXMuYWNjZXNzVHlwZSA9IE1ldGhvZEFjY2VzczsKKwkKKwlpZiAodGFyZ2V0TWV0aG9kLmlzU3RhdGljKCkpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gdGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnM7CisJfSBlbHNlIHsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW3RhcmdldE1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCArIDFdOworCQl0aGlzLnBhcmFtZXRlcnNbMF0gPSBkZWNsYXJpbmdTb3VyY2VUeXBlOworCQlTeXN0ZW0uYXJyYXljb3B5KHRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzLCAwLCB0aGlzLnBhcmFtZXRlcnMsIDEsIHRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCk7CisJfQorCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IHRhcmdldE1ldGhvZC50aHJvd25FeGNlcHRpb25zOworCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdTb3VyY2VUeXBlOworCisJLy8gY2hlY2sgZm9yIG1ldGhvZCBjb2xsaXNpb24KKwlib29sZWFuIG5lZWRSZW5hbWU7CisJZG8geworCQljaGVjayA6IHsKKwkJCW5lZWRSZW5hbWUgPSBmYWxzZTsKKwkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBrbm93biBtZXRob2RzCisJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUubWV0aG9kczsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0gbWV0aG9kc1tpXS5zZWxlY3RvciAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2ldKSkgeworCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKKwkJCQkJYnJlYWsgY2hlY2s7CisJCQkJfQorCQkJfQorCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIHN5bnRoZXRpYyBhY2Nlc3NvcnMKKwkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrbm93bkFjY2Vzc01ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kc1tpXSA9PSBudWxsKSBjb250aW51ZTsKKwkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0ga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKKwkJCQkJCWJyZWFrIGNoZWNrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBzZWxlY3RvciAmIGEgZ3Jvd2luZyBtZXRob2RJZAorCQkJdGhpcy5zZWxlY3RvcihDaGFyT3BlcmF0aW9uLmNvbmNhdChBY2Nlc3NNZXRob2RQcmVmaXgsIFN0cmluZy52YWx1ZU9mKCsrbWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpKTsKKwkJfQorCX0gd2hpbGUgKG5lZWRSZW5hbWUpOworCisJLy8gcmV0cmlldmUgc291cmNlU3RhcnQgcG9zaXRpb24gZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGZvciBsaW5lIG51bWJlciBhdHRyaWJ1dGVzCisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7CisJaWYgKG1ldGhvZERlY2xzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZERlY2xzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAobWV0aG9kRGVjbHNbaV0uYmluZGluZyA9PSB0YXJnZXRNZXRob2QpIHsKKwkJCQl0aGlzLnNvdXJjZVN0YXJ0ID0gbWV0aG9kRGVjbHNbaV0uc291cmNlU3RhcnQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclJlbGF0ZWQoKSB7CisJcmV0dXJuIGFjY2Vzc1R5cGUgPT0gQ29uc3RydWN0b3JBY2Nlc3M7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FyZ3VtZW50QmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ5NDgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCisvKioKKyAqIFNwZWNpZmljIGxvY2FsIHZhcmlhYmxlIGxvY2F0aW9uIHVzZWQgdG86CisgKiAtIGVpdGhlciBwcm92aWRlIGVtdWxhdGlvbiBmb3Igb3V0ZXIgbG9jYWwgdmFyaWFibGVzIHVzZWQgZnJvbSB3aXRoaW4gaW5uZXJjbGFzcyBjb25zdHJ1Y3RzLAorICogLSBvciBwcm92aWRlIGVtdWxhdGlvbiB0byBlbmNsb3NpbmcgaW5zdGFuY2VzLiAKKyAqIFdoZW4gaXQgaXMgbWFwcGluZyB0byBhbiBvdXRlciBsb2NhbCB2YXJpYWJsZSwgdGhpcyBhY3R1YWwgb3V0ZXIgbG9jYWwgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIAorICogdGhlIHB1YmxpYyBmaWVsZCAjYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLgorICoKKyAqIFN1Y2ggYSBzeW50aGV0aWMgYXJndW1lbnQgYmluZGluZyB3aWxsIGJlIGluc2VydGVkIGluIGFsbCBjb25zdHJ1Y3RvcnMgb2YgbG9jYWwgaW5uZXJ0eXBlcyBiZWZvcmUKKyAqIHRoZSB1c2VyIGFyZ3VtZW50cy4KKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBleHRlbmRzIExvY2FsVmFyaWFibGVCaW5kaW5nIHsKKworCXsJCisJCXRoaXMuaXNBcmd1bWVudCA9IHRydWU7CisJCXRoaXMudXNlZCA9IHRydWU7CisJfQorCS8vIGlmIHRoZSBhcmd1bWVudCBpcyBtYXBwaW5nIHRvIGFuIG91dGVyIGxvY2FsIHZhcmlhYmxlLCB0aGlzIGRlbm90ZXMgdGhlIG91dGVyIGFjdHVhbCB2YXJpYWJsZQorCXB1YmxpYyBMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU7CisJLy8gaWYgdGhlIGFyZ3VtZW50IGhhcyBhIG1hdGNoaW5nIHN5bnRoZXRpYyBmaWVsZAorCXB1YmxpYyBGaWVsZEJpbmRpbmcgbWF0Y2hpbmdGaWVsZDsKKworCWZpbmFsIHN0YXRpYyBjaGFyW10gT3V0ZXJMb2NhbFByZWZpeCA9IHsgJ3YnLCAnYScsICdsJywgJyQnIH07CisJZmluYWwgc3RhdGljIGNoYXJbXSBFbmNsb3NpbmdJbnN0YW5jZVByZWZpeCA9IHsgJ3QnLCAnaCcsICdpJywgJ3MnLCAnJCcgfTsKK3B1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisJc3VwZXIoCisJCUNoYXJPcGVyYXRpb24uY29uY2F0KE91dGVyTG9jYWxQcmVmaXgsIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5uYW1lKSwgCisJCWFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS50eXBlLCAKKwkJQWNjRmluYWwsCisJCXRydWUpOworCXRoaXMuYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlID0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlOworfQorcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwlzdXBlcigKKwkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuRW5jbG9zaW5nSW5zdGFuY2VQcmVmaXgsCisJCQlTdHJpbmcudmFsdWVPZihlbmNsb3NpbmdUeXBlLmRlcHRoKCkpLnRvQ2hhckFycmF5KCkpLAorCQllbmNsb3NpbmdUeXBlLCAKKwkJQWNjRmluYWwsCisJCXRydWUpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNGaWVsZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjZmU2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworCitwdWJsaWMgY2xhc3MgU3ludGhldGljRmllbGRCaW5kaW5nIGV4dGVuZHMgRmllbGRCaW5kaW5nIHsKKwlwdWJsaWMgaW50IGluZGV4OworcHVibGljIFN5bnRoZXRpY0ZpZWxkQmluZGluZyhjaGFyW10gbmFtZSwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcywgQ29uc3RhbnQgY29uc3RhbnQsIGludCBpbmRleCkgeworCXN1cGVyKG5hbWUsIHR5cGUsIG1vZGlmaWVycywgZGVjbGFyaW5nQ2xhc3MsIGNvbnN0YW50KTsKKwl0aGlzLmluZGV4ID0gaW5kZXg7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1RhZ0JpdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVGFnQml0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTJlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1RhZ0JpdHMuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitwdWJsaWMgaW50ZXJmYWNlIFRhZ0JpdHMgeworCS8vIFRhZyBiaXRzIGluIHRoZSB0YWdCaXRzIGludCBvZiBldmVyeSBUeXBlQmluZGluZworCWZpbmFsIGludCBJc0FycmF5VHlwZSA9IDB4MDAwMTsKKwlmaW5hbCBpbnQgSXNCYXNlVHlwZSA9IDB4MDAwMjsKKwlmaW5hbCBpbnQgSXNOZXN0ZWRUeXBlID0gMHgwMDA0OworCWZpbmFsIGludCBJc01lbWJlclR5cGUgPSAweDAwMDg7CisJZmluYWwgaW50IE1lbWJlclR5cGVNYXNrID0gSXNOZXN0ZWRUeXBlIHwgSXNNZW1iZXJUeXBlOworCWZpbmFsIGludCBJc0xvY2FsVHlwZSA9IDB4MDAxMDsKKwlmaW5hbCBpbnQgTG9jYWxUeXBlTWFzayA9IElzTmVzdGVkVHlwZSB8IElzTG9jYWxUeXBlOworCWZpbmFsIGludCBJc0Fub255bW91c1R5cGUgPSAweDAwMjA7CisJZmluYWwgaW50IEFub255bW91c1R5cGVNYXNrID0gTG9jYWxUeXBlTWFzayB8IElzQW5vbnltb3VzVHlwZTsKKwlmaW5hbCBpbnQgSXNCaW5hcnlCaW5kaW5nID0gMHgwMDQwOworCisJLy8gZm9yIHRoZSB0eXBlIGhpZXJhcmNoeSBjaGVjayB1c2VkIGJ5IENsYXNzU2NvcGUKKwlmaW5hbCBpbnQgQmVnaW5IaWVyYXJjaHlDaGVjayA9IDB4MDEwMDsKKwlmaW5hbCBpbnQgRW5kSGllcmFyY2h5Q2hlY2sgPSAweDAyMDA7CisKKwkvLyB0ZXN0IGJpdCB0byBzZWUgaWYgZGVmYXVsdCBhYnN0cmFjdCBtZXRob2RzIHdlcmUgY29tcHV0ZWQKKwlmaW5hbCBpbnQgS25vd3NEZWZhdWx0QWJzdHJhY3RNZXRob2RzID0gMHgwNDAwOworCisJLy8gUmV1c2FibGUgYml0IGN1cnJlbnRseSB1c2VkIGJ5IFNjb3BlcworCWZpbmFsIGludCBJbnRlcmZhY2VWaXNpdGVkID0gMHgwODAwOworCisJLy8gdGVzdCBiaXRzIHRvIHNlZSBpZiBwYXJ0cyBvZiBiaW5hcnkgdHlwZXMgYXJlIGZhdWx0ZWQKKwlmaW5hbCBpbnQgQXJlRmllbGRzQ29tcGxldGUgPSAweDEwMDA7CisJZmluYWwgaW50IEFyZU1ldGhvZHNDb21wbGV0ZSA9IDB4MjAwMDsKKworCS8vIHRlc3QgYml0IHRvIGF2b2lkIGFza2luZyBhIHR5cGUgZm9yIGEgbWVtYmVyIHR5cGUgKGluY2x1ZGVzIGluaGVyaXRlZCBtZW1iZXIgdHlwZXMpCisJZmluYWwgaW50IEhhc05vTWVtYmVyVHlwZXMgPSAweDQwMDA7CisKKwkvLyB0ZXN0IGJpdCB0byBpZGVudGlmeSBpZiB0aGUgdHlwZSdzIGhpZXJhcmNoeSBpcyBpbmNvbnNpc3RlbnQKKwlmaW5hbCBpbnQgSGllcmFyY2h5SGFzUHJvYmxlbXMgPSAweDgwMDA7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmNmRiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKKworLyoKKyAqIE5vdCBhbGwgZmllbGRzIGRlZmluZWQgYnkgdGhpcyB0eXBlICgmIGl0cyBzdWJjbGFzc2VzKSBhcmUgaW5pdGlhbGl6ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLgorICogU29tZSBhcmUgaW5pdGlhbGl6ZWQgb25seSB3aGVuIG5lZWRlZC4KKyAqCisgKiBBY2Nlc3NvcnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGZvciBzb21lIHB1YmxpYyBmaWVsZHMgc28gYWxsIFR5cGVCaW5kaW5ncyBoYXZlIHRoZSBzYW1lIEFQSS4uLgorICogYnV0IGFjY2VzcyBwdWJsaWMgZmllbGRzIGRpcmVjdGx5IHdoZW5ldmVyIHBvc3NpYmxlLgorICogTm9uLXB1YmxpYyBmaWVsZHMgaGF2ZSBhY2Nlc3NvcnMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZXZlcnl3aGVyZSB5b3UgZXhwZWN0IHRoZSBmaWVsZCB0byBiZSBpbml0aWFsaXplZC4KKyAqCisgKiBudWxsIGlzIE5PVCBhIHZhbGlkIHZhbHVlIGZvciBhIG5vbi1wdWJsaWMgZmllbGQuLi4gaXQganVzdCBtZWFucyB0aGUgZmllbGQgaXMgbm90IGluaXRpYWxpemVkLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVHlwZUJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIGltcGxlbWVudHMgQmFzZVR5cGVzLCBUYWdCaXRzLCBUeXBlQ29uc3RhbnRzLCBUeXBlSWRzIHsKKwlwdWJsaWMgaW50IGlkID0gTm9JZDsKKwlwdWJsaWMgaW50IHRhZ0JpdHMgPSAwOyAvLyBTZWUgdmFsdWVzIGluIHRoZSBpbnRlcmZhY2UgVGFnQml0cyBiZWxvdworLyogQVBJCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgYmluZGluZyB0eXBlIGZyb20gQmluZGluZy5CaW5kaW5nSUQuCisgKi8KKworcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKKwlyZXR1cm4gVFlQRTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBjYW4gYmUgaW5zdGFudGlhdGVkCisgKi8KKworcHVibGljIGJvb2xlYW4gY2FuQmVJbnN0YW50aWF0ZWQoKSB7CisJcmV0dXJuICFpc0Jhc2VUeXBlKCk7Cit9CisvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgorICoKKyAqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpOyAvKiBqYXZhL2xhbmcvT2JqZWN0ICovCitTdHJpbmcgZGVidWdOYW1lKCkgeworCXJldHVybiBuZXcgU3RyaW5nKHJlYWRhYmxlTmFtZSgpKTsKK30KK3B1YmxpYyBhYnN0cmFjdCBQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlKCk7CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYW4gYXJyYXkKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzQXJyYXlUeXBlKCkgeworCXJldHVybiAodGFnQml0cyAmIElzQXJyYXlUeXBlKSAhPSAwOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgYmFzZSB0eXBlCisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Jhc2VUeXBlKCkgeworCXJldHVybiAodGFnQml0cyAmIElzQmFzZVR5cGUpICE9IDA7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgYXJndW1lbnQgdHlwZSAocmlnaHQpCisqLworCQorYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KTsKKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlcidzIGhpZXJhcmNoeSBoYXMgcHJvYmxlbXMgKGFsd2F5cyBmYWxzZSBmb3IgYXJyYXlzICYgYmFzZSB0eXBlcykKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkgeworCXJldHVybiAodGFnQml0cyAmIEhpZXJhcmNoeUhhc1Byb2JsZW1zKSAhPSAwOworfQorcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGZpbmFsIGJvb2xlYW4gaXNOdW1lcmljVHlwZSgpIHsKKwlzd2l0Y2ggKGlkKSB7CisJCWNhc2UgVF9pbnQgOgorCQljYXNlIFRfZmxvYXQgOgorCQljYXNlIFRfZG91YmxlIDoKKwkJY2FzZSBUX3Nob3J0IDoKKwkJY2FzZSBUX2J5dGUgOgorCQljYXNlIFRfbG9uZyA6CisJCWNhc2UgVF9jaGFyIDoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3B1YmxpYyBUeXBlQmluZGluZyBsZWFmQ29tcG9uZW50VHlwZSgpeworCXJldHVybiB0aGlzOworfQorCisvKioKKyAqIEFuc3dlciB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlY2VpdmVyJ3MgcGFja2FnZSBzZXBhcmF0ZWQgYnkgcGVyaW9kcworICogb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0cyB0aGUgZGVmYXVsdCBwYWNrYWdlLgorICoKKyAqIEZvciBleGFtcGxlLCB7amF2YS51dGlsLkhhc2h0YWJsZX0uCisgKi8KKworcHVibGljIGNoYXJbXSBxdWFsaWZpZWRQYWNrYWdlTmFtZSgpIHsKKwlyZXR1cm4gZ2V0UGFja2FnZSgpID09IG51bGwgPyBOb0NoYXIgOiBnZXRQYWNrYWdlKCkucmVhZGFibGVOYW1lKCk7Cit9CisvKioKKyogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBmb3IgdGhlIHR5cGUuCisqIEluIHRoZSBjYXNlIG9mIG1lbWJlciB0eXBlcywgYXMgdGhlIHF1YWxpZmllZCBuYW1lIGZyb20gaXRzIHRvcCBsZXZlbCB0eXBlLgorKiBGb3IgZXhhbXBsZSwgZm9yIGEgbWVtYmVyIHR5cGUgTiBkZWZpbmVkIGluc2lkZSBNICYgQTogIkEuTS5OIi4KKyovCisKK3B1YmxpYyBhYnN0cmFjdCBjaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSgpOworLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIHNpZ25hdHVyZS4KKyoKKyogQXJyYXlzICYgYmFzZSB0eXBlcyBkbyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaWduYXR1cmUoKSAmIGNvbnN0YW50UG9vbE5hbWUoKS4KKyoKKyogTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcvYWZ0ZXIgY29kZSBnZW4uCisqLworCitwdWJsaWMgY2hhcltdIHNpZ25hdHVyZSgpIHsKKwlyZXR1cm4gY29uc3RhbnRQb29sTmFtZSgpOworfQorcHVibGljIGFic3RyYWN0IGNoYXJbXSBzb3VyY2VOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGQ3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVDb25zdGFudHMgeworCWZpbmFsIGNoYXJbXSBKQVZBID0gbmV3IGNoYXJbXSB7J2onLCAnYScsICd2JywgJ2EnfTsKKwlmaW5hbCBjaGFyW10gTEFORyA9IG5ldyBjaGFyW10geydsJywgJ2EnLCAnbicsICdnJ307CisJZmluYWwgY2hhcltdIElPID0gbmV3IGNoYXJbXSB7J2knLCAnbyd9OworCWZpbmFsIGNoYXJbXSBSRUZMRUNUID0gbmV3IGNoYXJbXSB7J3InLCAnZScsICdmJywgJ2wnLCAnZScsICdjJywgJ3QnfTsKKwlmaW5hbCBjaGFyW10gQ2hhckFycmF5X0pBVkFfTEFOR19PQkpFQ1QgPSBuZXcgY2hhcltdIHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9OworCWZpbmFsIGNoYXJbXSBMRU5HVEggPSBuZXcgY2hhcltdIHsnbCcsICdlJywgJ24nLCAnZycsICd0JywgJ2gnfTsKKwlmaW5hbCBjaGFyW10gQ0xPTkUgPSBuZXcgY2hhcltdIHsnYycsICdsJywgJ28nLCAnbicsICdlJ307CisKKwkvLyBDb25zdGFudCBjb21wb3VuZCBuYW1lcworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFOR307CisJZmluYWwgY2hhcltdW10gSkFWQV9JTyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgSU99OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkFzc2VydGlvbkVycm9yIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19DTEFTUyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgeydDJywgJ2wnLCAnYScsICdzJywgJ3MnfX07CisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnQycsICdsJywgJ2EnLCAncycsICdzJywgJ04nLCAnbycsICd0JywgJ0YnLCAnbycsICd1JywgJ24nLCAnZCcsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbid9fTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0xPTkVBQkxFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J0MnLCAnbCcsICdvJywgJ24nLCAnZScsICdhJywgJ2InLCAnbCcsICdlJ319OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19FWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nfX07CisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0VSUk9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J0UnLCAncicsICdyJywgJ28nLCAncid9fTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfTk9DTEFTU0RFRkVSUk9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J04nLCAnbycsICdDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnRCcsICdlJywgJ2YnLCAnRScsICdyJywgJ3InLCAnbycsICdyJ319OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19PQkpFQ1QgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX07CisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NUUklORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgeydTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZyd9fTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU1RSSU5HQlVGRkVSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJ0InLCAndScsICdmJywgJ2YnLCAnZScsICdyJ319OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19TWVNURU0gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnUycsICd5JywgJ3MnLCAndCcsICdlJywgJ20nfX07CisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnUicsICd1JywgJ24nLCAndCcsICdpJywgJ20nLCAnZScsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbid9fTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfVEhST1dBQkxFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J1QnLCAnaCcsICdyJywgJ28nLCAndycsICdhJywgJ2InLCAnbCcsICdlJ319OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCB7J0MnLCAnbycsICduJywgJ3MnLCAndCcsICdyJywgJ3UnLCAnYycsICd0JywgJ28nLCAncid9fTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0lPX1BSSU5UU1RSRUFNID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBJTywgeydQJywgJ3InLCAnaScsICduJywgJ3QnLCAnUycsICd0JywgJ3InLCAnZScsICdhJywgJ20nfX07CisJZmluYWwgY2hhcltdW10gSkFWQV9JT19TRVJJQUxJWkFCTEUgPSBuZXcgY2hhcltdW10ge0pBVkEsIElPLCB7J1MnLCAnZScsICdyJywgJ2knLCAnYScsICdsJywgJ2knLCAneicsICdhJywgJ2InLCAnbCcsICdlJ319OworCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19CWVRFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQnl0ZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU0hPUlQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJTaG9ydCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0hBUkFDVEVSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQ2hhcmFjdGVyIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19JTlRFR0VSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiSW50ZWdlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfTE9ORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkxvbmciLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0ZMT0FUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiRmxvYXQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0RPVUJMRSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkRvdWJsZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQk9PTEVBTiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkJvb2xlYW4iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1ZPSUQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJWb2lkIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCisJLy8gQ29uc3RhbnRzIHVzZWQgYnkgdGhlIGZsb3cgYW5hbHlzaXMKKwlmaW5hbCBpbnQgRXF1YWxPck1vcmVTcGVjaWZpYyA9IC0xOworCWZpbmFsIGludCBOb3RSZWxhdGVkID0gMDsKKwlmaW5hbCBpbnQgTW9yZUdlbmVyaWMgPSAxOworCisJLy8gRW1wdHkgQ29sbGVjdGlvbiB3aGljaCBjYW4gbGF0ZXIgYXNzaWduIHRvIG51bGwgaWYgcGVyZm9ybWFuY2UgaXMgYW4gaXNzdWUuCisJZmluYWwgY2hhcltdIE5vQ2hhciA9IG5ldyBjaGFyWzBdOworCWZpbmFsIGNoYXJbXVtdIE5vQ2hhckNoYXIgPSBuZXcgY2hhclswXVtdOworCS8vIE1ldGhvZCBjb2xsZWN0aW9ucworCWZpbmFsIFR5cGVCaW5kaW5nW10gTm9QYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nWzBdOworCWZpbmFsIFJlZmVyZW5jZUJpbmRpbmdbXSBOb0V4Y2VwdGlvbnMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1swXTsKKwkvLyBUeXBlIGNvbGxlY3Rpb25zCisJZmluYWwgRmllbGRCaW5kaW5nW10gTm9GaWVsZHMgPSBuZXcgRmllbGRCaW5kaW5nWzBdOworCWZpbmFsIE1ldGhvZEJpbmRpbmdbXSBOb01ldGhvZHMgPSBuZXcgTWV0aG9kQmluZGluZ1swXTsKKwlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nW10gTm9TdXBlckludGVyZmFjZXMgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1swXTsKKwlmaW5hbCBSZWZlcmVuY2VCaW5kaW5nW10gTm9NZW1iZXJUeXBlcyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzBdOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjBlNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZUlkcyB7CisJLy9iYXNlIHR5cGUgdm9pZCBudWxsIHVuZGVmaW5lZCBPYmplY3QgU3RyaW5nCisJLy9zaG91bGQgaGF2ZSBhbiBpZCB0aGF0IGlzIDA8PSBpZCA8PSAxNQorCisJZmluYWwgaW50IFRfdW5kZWZpbmVkID0gMDsgLy8gc2hvdWxkIG5vdCBiZSBjaGFuZ2VkCisJZmluYWwgaW50IFRfT2JqZWN0ID0gMTsKKwlmaW5hbCBpbnQgVF9jaGFyID0gMjsKKwlmaW5hbCBpbnQgVF9ieXRlID0gMzsKKwlmaW5hbCBpbnQgVF9zaG9ydCA9IDQ7CisJZmluYWwgaW50IFRfYm9vbGVhbiA9IDU7CisJZmluYWwgaW50IFRfdm9pZCA9IDY7CisJZmluYWwgaW50IFRfbG9uZyA9IDc7CisJZmluYWwgaW50IFRfZG91YmxlID0gODsKKwlmaW5hbCBpbnQgVF9mbG9hdCA9IDk7CisJZmluYWwgaW50IFRfaW50ID0gMTA7CisJZmluYWwgaW50IFRfU3RyaW5nID0gMTE7CisJZmluYWwgaW50IFRfbnVsbCA9IDEyOworCS8vZmluYWwgaW50IFRfZXh0ZW5kZWREb3VibGUgPSAxMzsKKwkvL2ZpbmFsIGludCBUX2V4dGVuZGVkTG9uZyA9IDE0CisKKwkvLz09PT09PT09PWVuZCBvZiA0IGJpdHMgY29uc3RyYWludD09PT09PT09PT09CisKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ09iamVjdCA9IFRfT2JqZWN0OyAvLyBmb3IgY29uc2lzdGVuY3kKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ1N0cmluZyA9IFRfU3RyaW5nOyAvLyBmb3IgY29uc2lzdGVuY3kKKworCS8vIHdlbGwta25vd24gZXhjZXB0aW9uIHR5cGVzCisJZmluYWwgaW50IFRfSmF2YUxhbmdDbGFzcyA9IDE2OworCWZpbmFsIGludCBUX0phdmFMYW5nU3RyaW5nQnVmZmVyID0gMTc7CisJZmluYWwgaW50IFRfSmF2YUxhbmdTeXN0ZW0gPSAxODsKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ0Vycm9yID0gMTk7CisJZmluYWwgaW50IFRfSmF2YUxhbmdSZWZsZWN0Q29uc3RydWN0b3IgPSAyMDsKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ1Rocm93YWJsZSA9IDIxOworCWZpbmFsIGludCBUX0phdmFMYW5nTm9DbGFzc0RlZkVycm9yID0gMjI7CisJZmluYWwgaW50IFRfSmF2YUxhbmdDbGFzc05vdEZvdW5kRXhjZXB0aW9uID0gMjM7CisJZmluYWwgaW50IFRfSmF2YUlvUHJpbnRTdHJlYW0gPSAyNDsKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ0V4Y2VwdGlvbiA9IDI1OworCisJLy8gd3JhcHBlciB0eXBlcworCWZpbmFsIGludCBUX0phdmFMYW5nQnl0ZSA9IDI2OworCWZpbmFsIGludCBUX0phdmFMYW5nU2hvcnQgPSAyNzsKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ0NoYXJhY3RlciA9IDI4OworCWZpbmFsIGludCBUX0phdmFMYW5nSW50ZWdlciA9IDI5OworCWZpbmFsIGludCBUX0phdmFMYW5nTG9uZyA9IDMwOworCWZpbmFsIGludCBUX0phdmFMYW5nRmxvYXQgPSAzMTsKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ0RvdWJsZSA9IDMyOworCWZpbmFsIGludCBUX0phdmFMYW5nQm9vbGVhbiA9IDMzOworCWZpbmFsIGludCBUX0phdmFMYW5nVm9pZCA9IDM0OworCisJLy8gMS40IGZlYXR1cmUKKwlmaW5hbCBpbnQgVF9KYXZhTGFuZ0Fzc2VydGlvbkVycm9yID0gMzU7CisJZmluYWwgaW50IE5vSWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworCS8vIGltcGxpY2l0IGNvbnZlcnNpb25zOiA8Y29tcGlsZVR5cGU+IHRvIDxydW50aW1lVHlwZT4gIChub3RlOiBib29sZWFucyBhcmUgaW50ZWdlcnMgYXQgcnVudGltZSkKKwlmaW5hbCBpbnQgQm9vbGVhbjJJbnQgPSBUX2Jvb2xlYW4gKyAoVF9pbnQgPDwgNCk7CisJZmluYWwgaW50IEJvb2xlYW4yU3RyaW5nID0gVF9ib29sZWFuICsgKFRfU3RyaW5nIDw8IDQpOworCWZpbmFsIGludCBCb29sZWFuMkJvb2xlYW4gPSBUX2Jvb2xlYW4gKyAoVF9ib29sZWFuIDw8IDQpOworCWZpbmFsIGludCBCeXRlMkJ5dGUgPSBUX2J5dGUgKyAoVF9ieXRlIDw8IDQpOworCWZpbmFsIGludCBCeXRlMlNob3J0ID0gVF9ieXRlICsgKFRfc2hvcnQgPDwgNCk7CisJZmluYWwgaW50IEJ5dGUyQ2hhciA9IFRfYnl0ZSArIChUX2NoYXIgPDwgNCk7CisJZmluYWwgaW50IEJ5dGUySW50ID0gVF9ieXRlICsgKFRfaW50IDw8IDQpOworCWZpbmFsIGludCBCeXRlMkxvbmcgPSBUX2J5dGUgKyAoVF9sb25nIDw8IDQpOworCWZpbmFsIGludCBCeXRlMkZsb2F0ID0gVF9ieXRlICsgKFRfZmxvYXQgPDwgNCk7CisJZmluYWwgaW50IEJ5dGUyRG91YmxlID0gVF9ieXRlICsgKFRfZG91YmxlIDw8IDQpOworCWZpbmFsIGludCBCeXRlMlN0cmluZyA9IFRfYnl0ZSArIChUX1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgU2hvcnQyQnl0ZSA9IFRfc2hvcnQgKyAoVF9ieXRlIDw8IDQpOworCWZpbmFsIGludCBTaG9ydDJTaG9ydCA9IFRfc2hvcnQgKyAoVF9zaG9ydCA8PCA0KTsKKwlmaW5hbCBpbnQgU2hvcnQyQ2hhciA9IFRfc2hvcnQgKyAoVF9jaGFyIDw8IDQpOworCWZpbmFsIGludCBTaG9ydDJJbnQgPSBUX3Nob3J0ICsgKFRfaW50IDw8IDQpOworCWZpbmFsIGludCBTaG9ydDJMb25nID0gVF9zaG9ydCArIChUX2xvbmcgPDwgNCk7CisJZmluYWwgaW50IFNob3J0MkZsb2F0ID0gVF9zaG9ydCArIChUX2Zsb2F0IDw8IDQpOworCWZpbmFsIGludCBTaG9ydDJEb3VibGUgPSBUX3Nob3J0ICsgKFRfZG91YmxlIDw8IDQpOworCWZpbmFsIGludCBTaG9ydDJTdHJpbmcgPSBUX3Nob3J0ICsgKFRfU3RyaW5nIDw8IDQpOworCWZpbmFsIGludCBDaGFyMkJ5dGUgPSBUX2NoYXIgKyAoVF9ieXRlIDw8IDQpOworCWZpbmFsIGludCBDaGFyMlNob3J0ID0gVF9jaGFyICsgKFRfc2hvcnQgPDwgNCk7CisJZmluYWwgaW50IENoYXIyQ2hhciA9IFRfY2hhciArIChUX2NoYXIgPDwgNCk7CisJZmluYWwgaW50IENoYXIySW50ID0gVF9jaGFyICsgKFRfaW50IDw8IDQpOworCWZpbmFsIGludCBDaGFyMkxvbmcgPSBUX2NoYXIgKyAoVF9sb25nIDw8IDQpOworCWZpbmFsIGludCBDaGFyMkZsb2F0ID0gVF9jaGFyICsgKFRfZmxvYXQgPDwgNCk7CisJZmluYWwgaW50IENoYXIyRG91YmxlID0gVF9jaGFyICsgKFRfZG91YmxlIDw8IDQpOworCWZpbmFsIGludCBDaGFyMlN0cmluZyA9IFRfY2hhciArIChUX1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgSW50MkJ5dGUgPSBUX2ludCArIChUX2J5dGUgPDwgNCk7CisJZmluYWwgaW50IEludDJTaG9ydCA9IFRfaW50ICsgKFRfc2hvcnQgPDwgNCk7CisJZmluYWwgaW50IEludDJDaGFyID0gVF9pbnQgKyAoVF9jaGFyIDw8IDQpOworCWZpbmFsIGludCBJbnQySW50ID0gVF9pbnQgKyAoVF9pbnQgPDwgNCk7CisJZmluYWwgaW50IEludDJMb25nID0gVF9pbnQgKyAoVF9sb25nIDw8IDQpOworCWZpbmFsIGludCBJbnQyRmxvYXQgPSBUX2ludCArIChUX2Zsb2F0IDw8IDQpOworCWZpbmFsIGludCBJbnQyRG91YmxlID0gVF9pbnQgKyAoVF9kb3VibGUgPDwgNCk7CisJZmluYWwgaW50IEludDJTdHJpbmcgPSBUX2ludCArIChUX1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgTG9uZzJCeXRlID0gVF9sb25nICsgKFRfYnl0ZSA8PCA0KTsKKwlmaW5hbCBpbnQgTG9uZzJTaG9ydCA9IFRfbG9uZyArIChUX3Nob3J0IDw8IDQpOworCWZpbmFsIGludCBMb25nMkNoYXIgPSBUX2xvbmcgKyAoVF9jaGFyIDw8IDQpOworCWZpbmFsIGludCBMb25nMkludCA9IFRfbG9uZyArIChUX2ludCA8PCA0KTsKKwlmaW5hbCBpbnQgTG9uZzJMb25nID0gVF9sb25nICsgKFRfbG9uZyA8PCA0KTsKKwlmaW5hbCBpbnQgTG9uZzJGbG9hdCA9IFRfbG9uZyArIChUX2Zsb2F0IDw8IDQpOworCWZpbmFsIGludCBMb25nMkRvdWJsZSA9IFRfbG9uZyArIChUX2RvdWJsZSA8PCA0KTsKKwlmaW5hbCBpbnQgTG9uZzJTdHJpbmcgPSBUX2xvbmcgKyAoVF9TdHJpbmcgPDwgNCk7CisJZmluYWwgaW50IEZsb2F0MkJ5dGUgPSBUX2Zsb2F0ICsgKFRfYnl0ZSA8PCA0KTsKKwlmaW5hbCBpbnQgRmxvYXQyU2hvcnQgPSBUX2Zsb2F0ICsgKFRfc2hvcnQgPDwgNCk7CisJZmluYWwgaW50IEZsb2F0MkNoYXIgPSBUX2Zsb2F0ICsgKFRfY2hhciA8PCA0KTsKKwlmaW5hbCBpbnQgRmxvYXQySW50ID0gVF9mbG9hdCArIChUX2ludCA8PCA0KTsKKwlmaW5hbCBpbnQgRmxvYXQyTG9uZyA9IFRfZmxvYXQgKyAoVF9sb25nIDw8IDQpOworCWZpbmFsIGludCBGbG9hdDJGbG9hdCA9IFRfZmxvYXQgKyAoVF9mbG9hdCA8PCA0KTsKKwlmaW5hbCBpbnQgRmxvYXQyRG91YmxlID0gVF9mbG9hdCArIChUX2RvdWJsZSA8PCA0KTsKKwlmaW5hbCBpbnQgRmxvYXQyU3RyaW5nID0gVF9mbG9hdCArIChUX1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgRG91YmxlMkJ5dGUgPSBUX2RvdWJsZSArIChUX2J5dGUgPDwgNCk7CisJZmluYWwgaW50IERvdWJsZTJTaG9ydCA9IFRfZG91YmxlICsgKFRfc2hvcnQgPDwgNCk7CisJZmluYWwgaW50IERvdWJsZTJDaGFyID0gVF9kb3VibGUgKyAoVF9jaGFyIDw8IDQpOworCWZpbmFsIGludCBEb3VibGUySW50ID0gVF9kb3VibGUgKyAoVF9pbnQgPDwgNCk7CisJZmluYWwgaW50IERvdWJsZTJMb25nID0gVF9kb3VibGUgKyAoVF9sb25nIDw8IDQpOworCWZpbmFsIGludCBEb3VibGUyRmxvYXQgPSBUX2RvdWJsZSArIChUX2Zsb2F0IDw8IDQpOworCWZpbmFsIGludCBEb3VibGUyRG91YmxlID0gVF9kb3VibGUgKyAoVF9kb3VibGUgPDwgNCk7CisJZmluYWwgaW50IERvdWJsZTJTdHJpbmcgPSBUX2RvdWJsZSArIChUX1N0cmluZyA8PCA0KTsKKwlmaW5hbCBpbnQgU3RyaW5nMlN0cmluZyA9IFRfU3RyaW5nICsgKFRfU3RyaW5nIDw8IDQpOworCWZpbmFsIGludCBPYmplY3QyU3RyaW5nID0gVF9PYmplY3QgKyAoVF9TdHJpbmcgPDwgNCk7CisJZmluYWwgaW50IE51bGwyU3RyaW5nID0gVF9udWxsICsgKFRfU3RyaW5nIDw8IDQpOworCWZpbmFsIGludCBPYmplY3QyT2JqZWN0ID0gVF9PYmplY3QgKyAoVF9PYmplY3QgPDwgNCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNDRhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nIGV4dGVuZHMgUmVmZXJlbmNlQmluZGluZyB7CisJUmVmZXJlbmNlQmluZGluZyByZXNvbHZlZFR5cGU7CitVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJdGhpcy5jb21wb3VuZE5hbWUgPSBjb21wb3VuZE5hbWU7CisJdGhpcy5mUGFja2FnZSA9IHBhY2thZ2VCaW5kaW5nOworfQorU3RyaW5nIGRlYnVnTmFtZSgpIHsKKwlyZXR1cm4gdG9TdHJpbmcoKTsKK30KK1JlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZShMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCWlmIChyZXNvbHZlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIHJlc29sdmVkVHlwZTsKKworCVJlZmVyZW5jZUJpbmRpbmcgZW52aXJvbm1lbnRUeXBlID0gZlBhY2thZ2UuZ2V0VHlwZTAoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7CisJaWYgKGVudmlyb25tZW50VHlwZSA9PSB0aGlzKQorCQllbnZpcm9ubWVudFR5cGUgPSBlbnZpcm9ubWVudC5hc2tGb3JUeXBlKGNvbXBvdW5kTmFtZSk7CisJaWYgKGVudmlyb25tZW50VHlwZSAhPSBudWxsICYmIGVudmlyb25tZW50VHlwZSAhPSB0aGlzKSB7IC8vIGNvdWxkIG5vdCByZXNvbHZlIGFueSBiZXR0ZXIsIGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkIGFnYWluc3QgaXQKKwkJcmVzb2x2ZWRUeXBlID0gZW52aXJvbm1lbnRUeXBlOworCQllbnZpcm9ubWVudC51cGRhdGVBcnJheUNhY2hlKHRoaXMsIGVudmlyb25tZW50VHlwZSk7CisJCXJldHVybiBlbnZpcm9ubWVudFR5cGU7IC8vIHdoZW4gZm91bmQsIGl0IHJlcGxhY2VzIHRoZSB1bnJlc29sdmVkIHR5cGUgaW4gdGhlIGNhY2hlCisJfQorCisJZW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmlzQ2xhc3NQYXRoQ29ycmVjdChjb21wb3VuZE5hbWUsIG51bGwpOworCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbgorfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIlVucmVzb2x2ZWQgdHlwZSAiICsgKChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1ZhcmlhYmxlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDY3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1ZhcmlhYmxlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlQmluZGluZyBleHRlbmRzIEJpbmRpbmcgeworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBUeXBlQmluZGluZyB0eXBlOworCXB1YmxpYyBjaGFyW10gbmFtZTsKKwlwdWJsaWMgQ29uc3RhbnQgY29uc3RhbnQ7CisJcHVibGljIGludCBpZDsgLy8gZm9yIGZsb3ctYW5hbHlzaXMgKHBvc2l0aW9uIGluIGZsb3dJbmZvIGJpdCB2ZWN0b3IpCitwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50VmFsdWUoKSB7CisJcmV0dXJuIGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKK30KKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBmaW5hbCBhbmQgY2Fubm90IGJlIGNoYW5nZWQKKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzRmluYWwoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NGaW5hbCkgIT0gMDsKK30KK3B1YmxpYyBjaGFyW10gcmVhZGFibGVOYW1lKCkgeworCXJldHVybiBuYW1lOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICh0eXBlICE9IG51bGwpID8gdHlwZS5kZWJ1Z05hbWUoKSA6ICJVTkRFRklORUQgVFlQRSI7IC8vJE5PTi1OTFMtMSQKKwlzICs9ICIgIjsgLy8kTk9OLU5MUy0xJAorCXMgKz0gKG5hbWUgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKG5hbWUpIDogIlVOTkFNRUQgRklFTEQiOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU0xpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvTkxTTGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU0xpbmUuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjEzOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQpAQCAtMCwwICsxLDc0NTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7IAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBQYXJzZXIgaW1wbGVtZW50cyBCaW5kaW5nSWRzLCBQYXJzZXJCYXNpY0luZm9ybWF0aW9uLCBJVGVybWluYWxTeW1ib2xzLCBDb21waWxlck1vZGlmaWVycywgT3BlcmF0b3JJZHMsIFR5cGVJZHMgeworCXByb3RlY3RlZCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOworCXB1YmxpYyBpbnQgZmlyc3RUb2tlbiA7IC8vIGhhbmRsZSBmb3IgbXVsdGlwbGUgcGFyc2luZyBnb2FscworCXB1YmxpYyBpbnQgbGFzdEFjdCA7IC8vaGFuZGxlIGZvciBtdWx0aXBsZSBwYXJzaW5nIGdvYWxzCisJcHJvdGVjdGVkIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dDsKKwlwdWJsaWMgaW50IGN1cnJlbnRUb2tlbjsKKwlwcml2YXRlIGludCBzeW5jaHJvbml6ZWRCbG9ja1NvdXJjZVN0YXJ0OworCisJLy9lcnJvciByZWNvdmVyeSBtYW5hZ2VtZW50CisJcHJvdGVjdGVkIGludCBsYXN0Q2hlY2tQb2ludDsKKwlwcm90ZWN0ZWQgUmVjb3ZlcmVkRWxlbWVudCBjdXJyZW50RWxlbWVudDsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRV9SRUNPVkVSWSA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHJlc3RhcnRSZWNvdmVyeTsKKwlwcm90ZWN0ZWQgaW50IGxpc3RMZW5ndGg7IC8vIGZvciByZWNvdmVyaW5nIHNvbWUgaW5jb21wbGV0ZSBsaXN0IChpbnRlcmZhY2VzLCB0aHJvd3Mgb3IgcGFyYW1ldGVycykKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXBvcnRlZEVycm9yOworCXByb3RlY3RlZCBpbnQgcmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydDsKKwlwcm90ZWN0ZWQgaW50IGxhc3RJZ25vcmVkVG9rZW4sIG5leHRJZ25vcmVkVG9rZW47CisJcHJvdGVjdGVkIGludCBsYXN0RXJyb3JFbmRQb3NpdGlvbjsKKwkJCisJLy8gMS40IGZlYXR1cmUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBhc3NlcnRNb2RlID0gZmFsc2U7CisJCisJLy9pbnRlcm5hbCBkYXRhIGZvciB0aGUgYXV0b21hdCAKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTdGFja0luY3JlbWVudCA9IDI1NTsKKwlwcm90ZWN0ZWQgaW50IHN0YXRlU3RhY2tUb3A7CisJcHJvdGVjdGVkIGludFtdIHN0YWNrID0gbmV3IGludFtTdGFja0luY3JlbWVudF07CisJLy9zY2FubmVyIHRva2VuIAorCXB1YmxpYyBTY2FubmVyIHNjYW5uZXI7CisJLy9hc3Qgc3RhY2sKKwlmaW5hbCBzdGF0aWMgaW50IEFzdFN0YWNrSW5jcmVtZW50ID0gMTAwOworCXByb3RlY3RlZCBpbnQgYXN0UHRyOworCXByb3RlY3RlZCBBc3ROb2RlW10gYXN0U3RhY2sgPSBuZXcgQXN0Tm9kZVtBc3RTdGFja0luY3JlbWVudF07CisJcHJvdGVjdGVkIGludCBhc3RMZW5ndGhQdHI7CisJcHJvdGVjdGVkIGludFtdIGFzdExlbmd0aFN0YWNrOworCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQ7IC8qdGhlIHJlc3VsdCBmcm9tIHBhcnNlKCkqLworCUFzdE5vZGUgW10gbm9Bc3ROb2RlcyA9IG5ldyBBc3ROb2RlW0FzdFN0YWNrSW5jcmVtZW50XTsKKwkvL2V4cHJlc3Npb24gc3RhY2sKKwlmaW5hbCBzdGF0aWMgaW50IEV4cHJlc3Npb25TdGFja0luY3JlbWVudCA9IDEwMDsKKwlwcm90ZWN0ZWQgaW50IGV4cHJlc3Npb25QdHI7CisJcHJvdGVjdGVkIEV4cHJlc3Npb25bXSBleHByZXNzaW9uU3RhY2sgPSBuZXcgRXhwcmVzc2lvbltFeHByZXNzaW9uU3RhY2tJbmNyZW1lbnRdOworCXByb3RlY3RlZCBpbnQgZXhwcmVzc2lvbkxlbmd0aFB0cjsKKwlwcm90ZWN0ZWQgaW50W10gZXhwcmVzc2lvbkxlbmd0aFN0YWNrOworCUV4cHJlc3Npb24gW10gbm9FeHByZXNzaW9ucyA9IG5ldyBFeHByZXNzaW9uW0V4cHJlc3Npb25TdGFja0luY3JlbWVudF07CisJLy9pZGVudGlmaWVycyBzdGFja3MgCisJcHJvdGVjdGVkIGludCBpZGVudGlmaWVyUHRyOworCXByb3RlY3RlZCBjaGFyW11bXSBpZGVudGlmaWVyU3RhY2s7CisJcHJvdGVjdGVkIGludCBpZGVudGlmaWVyTGVuZ3RoUHRyOworCXByb3RlY3RlZCBpbnRbXSBpZGVudGlmaWVyTGVuZ3RoU3RhY2s7CisJcHJvdGVjdGVkIGxvbmdbXSBpZGVudGlmaWVyUG9zaXRpb25TdGFjazsKKwkvL3Bvc2l0aW9ucyAsIGRpbWVuc2lvbnMgLCAuLi4uICh3aGF0IGV2ZXIgaXMgaW50KSAuLi4uLiBzdGFjaworCXByb3RlY3RlZCBpbnQgaW50UHRyOworCXByb3RlY3RlZCBpbnRbXSBpbnRTdGFjazsKKwlwcm90ZWN0ZWQgaW50IGVuZFBvc2l0aW9uOyAvL2FjY3VyYXRlIG9ubHkgd2hlbiB1c2VkICEgKHRoZSBzdGFydCBwb3NpdGlvbiBpcyBwdXNoZWQgaW50byBpbnRTdGFjayB3aGlsZSB0aGUgZW5kIHRoZSBjdXJyZW50IG9uZSkKKwlwcm90ZWN0ZWQgaW50IGVuZFN0YXRlbWVudFBvc2l0aW9uOworCXByb3RlY3RlZCBpbnQgbFBhcmVuUG9zLHJQYXJlblBvczsgLy9hY2N1cmF0ZSBvbmx5IHdoZW4gdXNlZCAhCisJLy9tb2RpZmllcnMgZGltZW5zaW9ucyBuZXN0ZWRUeXBlIGV0Yy4uLi4uLi4KKwlwcm90ZWN0ZWQgYm9vbGVhbiBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzID10cnVlOworCXByb3RlY3RlZCBpbnQgbW9kaWZpZXJzOworCXByb3RlY3RlZCBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQ7CisJcHJvdGVjdGVkIGludCBuZXN0ZWRUeXBlLCBkaW1lbnNpb25zOworCXByb3RlY3RlZCBpbnRbXSBuZXN0ZWRNZXRob2Q7IC8vdGhlIHB0ciBpcyBuZXN0ZWRUeXBlCisJcHJvdGVjdGVkIGludFtdIHJlYWxCbG9ja1N0YWNrOworCXByb3RlY3RlZCBpbnQgcmVhbEJsb2NrUHRyOworCXByb3RlY3RlZCBib29sZWFuIGRpZXQgPSBmYWxzZTsgLy90ZWxscyB0aGUgc2Nhbm5lciB0byBqdW1wIG92ZXIgc29tZSBwYXJ0cyBvZiB0aGUgY29kZS9leHByZXNzaW9ucyBsaWtlIG1ldGhvZCBib2RpZXMKKwlwcm90ZWN0ZWQgaW50IGRpZXRJbnQgPSAwOyAvLyBpZiA+IDAgZm9yY2UgdGhlIG5vbmUtZGlldC1wYXJzaW5nIG1vZGUgKGV2ZW4gaWYgZGlldCBpZiByZXF1ZXN0ZWQpIFtmaWVsZCBwYXJzaW5nIHdpdGggYW5vbnltb3VzIGlubmVyIGNsYXNzZXMuLi5dCisJcHJvdGVjdGVkIGludFtdIHZhcmlhYmxlc0NvdW50ZXI7CisJLy89PT1EQVRBPT09REFUQT09PURBVEE9PT1EQVRBPT09REFUQT09PURBVEE9PT0vLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSByaHNbXSA9IHswLAorICAgICAgICAgICAgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisgICAgICAgICAgICAyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgICAgICAgICAgMiwyLDEsMSwxLDEsMyw0LDAsMSwyLDEsMSwxLDEsCisgICAgICAgICAgICAxLDEsMSwxLDEsNSwxLDIsMSwyLDIsMiwxLDEsMiwKKyAgICAgICAgICAgIDIsMiw0LDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLAorICAgICAgICAgICAgMSwxLDEsMSwyLDMsMywyLDIsMSwzLDEsMywxLDIsCisgICAgICAgICAgICAxLDEsMSwzLDAsMywxLDEsMSwxLDEsMSwxLDQsMSwKKyAgICAgICAgICAgIDMsMyw3LDAsMCwwLDAsMCwyLDEsMSwxLDIsMiw0LAorICAgICAgICAgICAgNCw1LDQsNCwyLDEsMiwzLDMsMSwzLDMsMSwzLDEsCisgICAgICAgICAgICA0LDAsMiwxLDIsMiw0LDEsMSwyLDUsNSw3LDcsNywKKyAgICAgICAgICAgIDcsMiwyLDMsMiwyLDMsMSwyLDEsMiwxLDEsMiwyLAorICAgICAgICAgICAgMSwxLDEsMSwxLDMsMyw0LDEsMyw0LDAsMSwyLDEsCisgICAgICAgICAgICAxLDEsMSwyLDMsNCwwLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgICAgICAgICAgMSwzLDMsMiwxLDEsMSwxLDEsMSwxLDUsNyw3LDYsCisgICAgICAgICAgICAyLDMsMyw0LDEsMiwyLDEsMiwzLDIsNSw1LDcsOSwKKyAgICAgICAgICAgIDksMSwxLDEsMSwzLDMsNSwyLDMsMiwzLDMsMyw1LAorICAgICAgICAgICAgMSwzLDQsMSwyLDUsMiwxLDEsMSwxLDEsMSwzLDEsCisgICAgICAgICAgICAxLDMsMywzLDMsMywxLDEsNSw2LDgsNywyLDAsMiwKKyAgICAgICAgICAgIDAsMSwzLDQsNCwxLDIsMywyLDEsMSwyLDIsMywzLAorICAgICAgICAgICAgNCw2LDYsNCw0LDEsMSwxLDEsMiwyLDAsMSwxLDMsCisgICAgICAgICAgICAzLDEsMywzLDEsMywzLDEsNSw1LDQsMSwzLDMsMywKKyAgICAgICAgICAgIDEsMywzLDEsMywzLDMsMSwzLDMsMywzLDMsMSwzLAorICAgICAgICAgICAgMywxLDMsMSwzLDEsMywxLDMsMSwzLDEsNSwxLDEsCisgICAgICAgICAgICAzLDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKyAgICAgICAgICAgIDEsMSwxLDEsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLAorICAgICAgICAgICAgMCwxLDAsMiwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsCisgICAgICAgICAgICAxLDAsMSwwLDIsMCwwLDEsMCwxLDAsMSwwLDEsMCwKKyAgICAgICAgICAgIDEKKyAgICB9OworCisJCQorCXB1YmxpYyAgc3RhdGljIGNoYXIgYXNiW10gPSBudWxsOworCXB1YmxpYyAgc3RhdGljIGNoYXIgYXNyW10gPSBudWxsOworCXB1YmxpYyAgc3RhdGljIGNoYXIgc3ltYm9sX2luZGV4W10gPSBudWxsOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX0VPRiA9ICJVbmV4cGVjdGVkIEVuZCBPZiBGaWxlIiA7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5hbWVbXSA9IHsgbnVsbCwKKyAgICAgICAgICAgICIrKyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIi0tIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiPT0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI8PSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj49IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiIT0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI8PCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4+IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiPj4+IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKz0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICItPSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIio9IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLz0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICImPSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInw9IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiXj0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIlPSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIjw8PSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4+PSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4+Pj0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ8fCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIiYmIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIi0iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIhIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIl4iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICImIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInwiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ+IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI8IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIikiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ7IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAifSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlsiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJdIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiOyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj8iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI6IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIi4iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI9IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJGVtcHR5IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSWRlbnRpZmllciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImFic3RyYWN0IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYXNzZXJ0IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYm9vbGVhbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImJyZWFrIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYnl0ZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImNhc2UiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJjYXRjaCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImNoYXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJjbGFzcyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImNvbnRpbnVlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZGVmYXVsdCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImRvIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZG91YmxlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZWxzZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImV4dGVuZHMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJmYWxzZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImZpbmFsIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZmluYWxseSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImZsb2F0IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZm9yIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiaWYiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJpbXBsZW1lbnRzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiaW1wb3J0IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiaW5zdGFuY2VvZiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImludCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImludGVyZmFjZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImxvbmciLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJuYXRpdmUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJuZXciLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJudWxsIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAicGFja2FnZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInByaXZhdGUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJwcm90ZWN0ZWQiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJwdWJsaWMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJyZXR1cm4iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJzaG9ydCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInN0YXRpYyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInN0cmljdGZwIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAic3VwZXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJzd2l0Y2giLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0aGlzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidGhyb3ciLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0aHJvd3MiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0cmFuc2llbnQiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0cnVlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidHJ5IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidm9pZCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInZvbGF0aWxlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAid2hpbGUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlZ2VyTGl0ZXJhbCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkxvbmdMaXRlcmFsIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRmxvYXRpbmdQb2ludExpdGVyYWwiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJEb3VibGVMaXRlcmFsIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2hhcmFjdGVyTGl0ZXJhbCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0cmluZ0xpdGVyYWwiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIFVORVhQRUNURURfRU9GLAorICAgICAgICAgICAgIkludmFsaWQgQ2hhcmFjdGVyIiwvLyROT04tTkxTLTEkICAgICAgICAgICAgCisgICAgICAgICAgICAiR29hbCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1ldGhvZEJvZHkiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25zdHJ1Y3RvckJvZHkiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTdGF0aWNJbml0aWFsaXplciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkluaXRpYWxpemVyIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSGVhZGVycyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkJsb2NrU3RhdGVtZW50cyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDYXRjaEhlYWRlciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbXBvcnREZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlBhY2thZ2VEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkdlbmVyaWNNZXRob2REZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNsYXNzQm9keURlY2xhcmF0aW9uIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlR5cGUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQcmltaXRpdmVUeXBlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUmVmZXJlbmNlVHlwZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNsYXNzT3JJbnRlcmZhY2VUeXBlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXJyYXlUeXBlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTmFtZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkRpbXMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc1R5cGUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTaW1wbGVOYW1lIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSGVhZGVyIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NIZWFkZXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlcmZhY2VIZWFkZXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNZXRob2RIZWFkZXIiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25zdHJ1Y3RvckhlYWRlciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkZvcm1hbFBhcmFtZXRlciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkltcG9ydERlY2xhcmF0aW9ucyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbnMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1vZGlmaWVycyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1vZGlmaWVyIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NCb2R5IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NIZWFkZXJOYW1lIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSW50ZXJmYWNlVHlwZUxpc3QiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlcmZhY2VUeXBlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQmxvY2siLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3JzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9yIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9ySWQiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJWYXJpYWJsZUluaXRpYWxpemVyIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXJyYXlJbml0aWFsaXplciIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1ldGhvZEhlYWRlck5hbWUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc1R5cGVMaXN0IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ29uc3RydWN0b3JIZWFkZXJOYW1lIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRm9ybWFsUGFyYW1ldGVyTGlzdCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNsYXNzVHlwZUVsdCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRpY09ubHkiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlByaW1hcnkiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlcmZhY2VCb2R5IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSW50ZXJmYWNlSGVhZGVyTmFtZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVmFyaWFibGVJbml0aWFsaXplcnMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJCbG9ja1N0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudE5vU2hvcnRJZiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTWV0aG9kSW52b2NhdGlvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTd2l0Y2hCbG9jayIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50cyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN3aXRjaExhYmVscyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50IiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU3dpdGNoTGFiZWwiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25zdGFudEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk9ubHlTeW5jaHJvbml6ZWQiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDYXRjaGVzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRmluYWxseSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNhdGNoQ2xhdXNlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUHVzaExQQVJFTiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlB1c2hSUEFSRU4iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQcmltYXJ5Tm9OZXdBcnJheSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkZpZWxkQWNjZXNzIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXJyYXlBY2Nlc3MiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFyZ3VtZW50TGlzdCIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHBycyIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHByIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRGltc0xvb3AiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJPbmVEaW1Mb29wIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUG9zdGZpeEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJBZGRpdGl2ZUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTaGlmdEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFuZEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJFeGNsdXNpdmVPckV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbmNsdXNpdmVPckV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25kaXRpb25hbE9yRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTGVmdEhhbmRTaWRlIiwvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXNzaWdubWVudE9wZXJhdG9yIi8vJE5PTi1OTFMtMSQKKyAgICB9OworICAgIAorCXB1YmxpYyAgc3RhdGljIHNob3J0IGNoZWNrX3RhYmxlW10gPSBudWxsOworCXB1YmxpYyAgc3RhdGljIGNoYXIgbGhzW10gPSAgbnVsbDsKKwlwdWJsaWMgIHN0YXRpYyBjaGFyIGFjdGlvbltdID0gbGhzOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFUFJFRklYID0gInBhcnNlciI7IC8vJE5PTi1OTFMtMSQKKworCXN0YXRpYyB7CisJCXRyeXsKKwkJCWluaXRUYWJsZXMoKTsKKwkJfSBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KXsKKwkJCXRocm93IG5ldyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoZXguZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdW5kQnJhY2tldCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3F1YXJlQnJhY2tldCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ3VybHlCcmFja2V0ID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCcmFja2V0S2luZHMgPSAzOworCitwdWJsaWMgUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIsIGJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscywgYm9vbGVhbiBhc3NlcnRNb2RlKSB7CisJCQorCXRoaXMucHJvYmxlbVJlcG9ydGVyID0gcHJvYmxlbVJlcG9ydGVyOworCXRoaXMub3B0aW1pemVTdHJpbmdMaXRlcmFscyA9IG9wdGltaXplU3RyaW5nTGl0ZXJhbHM7CisJdGhpcy5hc3NlcnRNb2RlID0gYXNzZXJ0TW9kZTsKKwl0aGlzLmluaXRpYWxpemVTY2FubmVyKCk7CisJYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50WzUwXTsKKwlleHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50WzMwXTsKKwlpbnRTdGFjayA9IG5ldyBpbnRbNTBdOworCWlkZW50aWZpZXJTdGFjayA9IG5ldyBjaGFyWzMwXVtdOworCWlkZW50aWZpZXJMZW5ndGhTdGFjayA9IG5ldyBpbnRbMzBdOworCW5lc3RlZE1ldGhvZCA9IG5ldyBpbnRbMzBdOworCXJlYWxCbG9ja1N0YWNrID0gbmV3IGludFszMF07CisJaWRlbnRpZmllclBvc2l0aW9uU3RhY2sgPSBuZXcgbG9uZ1szMF07CisJdmFyaWFibGVzQ291bnRlciA9IG5ldyBpbnRbMzBdOworfQorLyoqCisgKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqLworcHJvdGVjdGVkIHZvaWQgYWRqdXN0SW50ZXJmYWNlTW9kaWZpZXJzKCkgeworCWludFN0YWNrW2ludFB0ciAtIDFdIHw9IEFjY0ludGVyZmFjZTsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIGFycmF5SW5pdGlhbGl6ZXIoaW50IGxlbmd0aCkgeworCS8vbGVuZ3RoIGlzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBJbml0aWFsaXplcgorCS8vZXhwcmVzc2lvblB0ciBwb2ludHMgb24gdGhlIGxhc3QgZWx0IG9mIHRoZSBhcnJheUluaXRpYWxpemVyCisJLy9pLmUuIGl0IGhhcyBub3QgYmVlbiBkZWNyZW1lbnRlZCB5ZXQuCisKKwlBcnJheUluaXRpYWxpemVyIGFpID0gbmV3IEFycmF5SW5pdGlhbGl6ZXIoKTsKKwlpZiAobGVuZ3RoICE9IDApIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoZXhwcmVzc2lvblN0YWNrLCBleHByZXNzaW9uUHRyICsgMSwgYWkuZXhwcmVzc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAwLCBsZW5ndGgpOworCX0KKwlwdXNoT25FeHByZXNzaW9uU3RhY2soYWkpOworCS8vcG9zaXRpb25uaW5nCisJYWkuc291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJaW50IHNlYXJjaFBvc2l0aW9uID0gbGVuZ3RoID09IDAgPyBlbmRQb3NpdGlvbiA6IGFpLmV4cHJlc3Npb25zWzBdLnNvdXJjZVN0YXJ0OworCXRyeSB7CisJCS8vZG9lcyBub3Qgd29yayB3aXRoIGNvbW1lbnRzKHRoYXQgY29udGFpbiAneycpIG5vciAneycgZGVzY3JpYmVzIGFzIGEgdW5pY29kZS4uLi4JCQorCQl3aGlsZSAoc2Nhbm5lci5zb3VyY2VbLS1zZWFyY2hQb3NpdGlvbl0gIT0gJ3snKSB7CisJCX0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7CisJCS8vc2hvdWxkIG5ldmVyIG9jY3VyIChleGNlcHQgZm9yIHN0cmFuZ2UgY2FzZXMgbGlrZSB3aG9zZSBkZXNjcmliZSBhYm92ZSkKKwkJc2VhcmNoUG9zaXRpb24gPSAobGVuZ3RoID09IDAgPyBlbmRQb3NpdGlvbiA6IGFpLmV4cHJlc3Npb25zWzBdLnNvdXJjZVN0YXJ0KSAtIDE7CisJfQorCWFpLnNvdXJjZVN0YXJ0ID0gc2VhcmNoUG9zaXRpb247Cit9Citwcm90ZWN0ZWQgc3RhdGljIGludCBhc2koaW50IHN0YXRlKSB7CisKKwlyZXR1cm4gYXNiW29yaWdpbmFsX3N0YXRlKHN0YXRlKV07Cit9Citwcm90ZWN0ZWQgdm9pZCBibG9ja1JlYWwoKSB7CisJLy8gU2VlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgaW4gY2FzZSBvZiBjaGFuZ2U6IGR1cGxpY2F0ZWQgY29kZQorCS8vIGluY3JlbWVudCB0aGUgYW1vdW50IG9mIGRlY2xhcmVkIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jaworCXJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0cl0rKzsKK30KK3ByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYnVpbGRGaWxlRm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRhZywgU3RyaW5nW10gdG9rZW5zLCBib29sZWFuIGlzU2hvcnQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKworCS8vdHJhbnNmb3JtIHRoZSBTdHJpbmcgdG9rZW5zIGludG8gY2hhcnMgYmVmb3JlIGR1bXBpbmcgdGhlbiBpbnRvIGZpbGUKKworCWludCBpID0gMDsKKwkvL3JlYWQgdXB0byB0aGUgdGFnCisJd2hpbGUgKCF0b2tlbnNbaSsrXS5lcXVhbHModGFnKSkge30KKwkvL3JlYWQgdXB0byB0aGUgfQorCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3Rva2Vucy5sZW5ndGhdOyAvL2Nhbid0IGJlIGJpZ2dlcgorCWludCBpYyA9IDA7CisJU3RyaW5nIHRva2VuOworCXdoaWxlICghKHRva2VuID0gdG9rZW5zW2krK10pLmVxdWFscygifSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuKTsKKwkJaWYgKGlzU2hvcnQpCisJCQljICs9IDMyNzY4OworCQljaGFyc1tpYysrXSA9IChjaGFyKSBjOworCX0KKworCS8vcmVzaXplCisJU3lzdGVtLmFycmF5Y29weShjaGFycywgMCwgY2hhcnMgPSBuZXcgY2hhcltpY10sIDAsIGljKTsKKworCWJ1aWxkRmlsZUZvclRhYmxlKGZpbGVuYW1lLCBjaGFycyk7Cit9Citwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZUZvclRhYmxlKFN0cmluZyBmaWxlbmFtZSwgY2hhcltdIGNoYXJzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisKKwlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtjaGFycy5sZW5ndGggKiAyXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CisJCWJ5dGVzWzIgKiBpXSA9IChieXRlKSAoY2hhcnNbaV0gPj4+IDgpOworCQlieXRlc1syICogaSArIDFdID0gKGJ5dGUpIChjaGFyc1tpXSAmIDB4RkYpOworCX0KKworCWphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKKwlzdHJlYW0ud3JpdGUoYnl0ZXMpOworCXN0cmVhbS5jbG9zZSgpOworCVN5c3RlbS5vdXQucHJpbnRsbihmaWxlbmFtZSArICIgY3JlYXRpb24gY29tcGxldGUiKTsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIGZpbmFsIHN0YXRpYyB2b2lkIGJ1aWxkRmlsZXNGcm9tTFBHKFN0cmluZyBkYXRhRmlsZW5hbWUpCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKworCS8vUlVOIFRISVMgTUVUSE9EIFRPIEdFTkVSQVRFIFBBUlNFUiouUlNDIEZJTEVTCisKKwkvL2J1aWxkIGZyb20gdGhlIGxwZyBqYXZhZGNsLmphdmEgZmlsZXMgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJzZXIgdGFibGVzCisJLy9saHMgY2hlY2tfdGFibGUgYXNiIGFzciBzeW1ib2xfaW5kZXgKKworCS8vW29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyLmJ1aWxkRmlsZXNGcm9tTFBHKCJkOi9sZWFwZnJvZy9ncmFtbWFyL2phdmFkY2wuamF2YSIpXQorCisJY2hhcltdIGNvbnRlbnRzID0gbmV3IGNoYXJbXSB7fTsKKwl0cnkgeworCQljb250ZW50cyA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KG5ldyBGaWxlKGRhdGFGaWxlbmFtZSksIG51bGwpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoInBhcnNlci5pbmNvcnJlY3RQYXRoIikpOyAvLyROT04tTkxTLTEkCisJCXJldHVybjsKKwl9CisJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBzdCA9IAorCQluZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihuZXcgU3RyaW5nKGNvbnRlbnRzKSwgIiBcdFxuXHJbXT17LDsiKTsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOworCWludCBpID0gMDsKKwl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCXRva2Vuc1tpKytdID0gc3QubmV4dFRva2VuKCk7CisJfQorCWZpbmFsIFN0cmluZyBwcmVmaXggPSBGSUxFUFJFRklYOworCWkgPSAwOworCWJ1aWxkRmlsZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImxocyIsIHRva2VucywgZmFsc2UpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlidWlsZEZpbGVGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJjaGVja190YWJsZSIsIHRva2VucywgdHJ1ZSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCWJ1aWxkRmlsZUZvcihwcmVmaXggKyAoKytpKSArICIucnNjIiwgImFzYiIsIHRva2VucywgZmFsc2UpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlidWlsZEZpbGVGb3IocHJlZml4ICsgKCsraSkgKyAiLnJzYyIsICJhc3IiLCB0b2tlbnMsIGZhbHNlKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJYnVpbGRGaWxlRm9yKHByZWZpeCArICgrK2kpICsgIi5yc2MiLCAic3ltYm9sX2luZGV4IiwgdG9rZW5zLCBmYWxzZSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoInBhcnNlci5tb3ZlRmlsZXMiKSk7IC8vJE5PTi1OTFMtMSQKK30KKy8qCisgKiBCdWlsZCBpbml0aWFsIHJlY292ZXJ5IHN0YXRlLgorICogUmVjb3Zlcnkgc3RhdGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2VyIChyZWR1Y2VkIG5vZGUgc3RhY2spLgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBidWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCl7CisKKwkvKiBpbml0aWFsaXplIHJlY292ZXJ5IGJ5IHJldHJpZXZpbmcgYXZhaWxhYmxlIHJlZHVjZWQgbm9kZXMgCisJICogYWxzbyByZWJ1aWxkIGJyYWNrZXQgYmFsYW5jZSAKKwkgKi8KKwlsYXN0Q2hlY2tQb2ludCA9IDA7CisKKwlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSBudWxsOworCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24peworCQllbGVtZW50ID0gbmV3IFJlY292ZXJlZFVuaXQoY29tcGlsYXRpb25Vbml0LCAwLCB0aGlzKTsKKwkJCisJCS8qIGlnbm9yZSBjdXJyZW50IHN0YWNrIHN0YXRlLCBzaW5jZSByZXN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubm5pbmcgCisJCSAgIHNpbmNlIGNvdWxkIG5vdCB0cnVzdCBzaW1wbGUgYnJhY2UgY291bnQgKi8KKwkJaWYgKHRydWUpeyAvLyBleHBlcmltZW50aW5nIHJlc3RhcnQgcmVjb3ZlcnkgZnJvbSBzY3JhdGNoCisJCQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSBudWxsOworCQkJY29tcGlsYXRpb25Vbml0LmltcG9ydHMgPSBudWxsOworCQkJY29tcGlsYXRpb25Vbml0LnR5cGVzID0gbnVsbDsKKwkJCWN1cnJlbnRUb2tlbiA9IDA7CisJCQlsaXN0TGVuZ3RoID0gMDsKKwkJCXJldHVybiBlbGVtZW50OworCQl9CisJCWlmIChjb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCl7CisJCQlsYXN0Q2hlY2tQb2ludCA9IGNvbXBpbGF0aW9uVW5pdC5jdXJyZW50UGFja2FnZS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOworCQl9CisJCWlmIChjb21waWxhdGlvblVuaXQuaW1wb3J0cyAhPSBudWxsKXsKKwkJCWxhc3RDaGVja1BvaW50ID0gY29tcGlsYXRpb25Vbml0LmltcG9ydHNbY29tcGlsYXRpb25Vbml0LmltcG9ydHMubGVuZ3RoIC0xXS5kZWNsYXJhdGlvblNvdXJjZUVuZCsxOwkJCisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24peworCQkJZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRNZXRob2QoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQsIG51bGwsIDAsIHRoaXMpOworCQkJbGFzdENoZWNrUG9pbnQgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQpLmJvZHlTdGFydDsKKwkJfSBlbHNlIHsKKwkJCS8qIEluaXRpYWxpemVyIGJvZGllcyBhcmUgcGFyc2VkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0eXBlIGRlY2xhcmF0aW9uLCB3ZSBtdXN0IHRodXMgc2VhcmNoIGl0IGluc2lkZSAqLworCQkJaWYgKHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24peworCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsKKwkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwkJCQkJCisJCQkJCWlmICghZmllbGQuaXNGaWVsZCgpCisJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uCisJCQkJCQkmJiBzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZAorCQkJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsKKwkJCQkJCWVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIoKEluaXRpYWxpemVyKSBmaWVsZCwgbnVsbCwgMSwgdGhpcyk7CisJCQkJCQlsYXN0Q2hlY2tQb2ludCA9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CQkJCQkKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSAKKwkJfQorCX0KKworCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBlbGVtZW50OworCQorCWZvcihpbnQgaSA9IDA7IGkgPD0gYXN0UHRyOyBpKyspeworCQlBc3ROb2RlIG5vZGUgPSBhc3RTdGFja1tpXTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7CisJCQlpZiAobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChtZXRob2QsIDApOworCQkJCWxhc3RDaGVja1BvaW50ID0gbWV0aG9kLmJvZHlTdGFydDsKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKG1ldGhvZCwgMCk7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbml0aWFsaXplcil7CisJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgbm9kZTsKKwkJCWlmIChpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoaW5pdGlhbGl6ZXIsIDEpOworCQkJCWxhc3RDaGVja1BvaW50ID0gaW5pdGlhbGl6ZXIuYm9keVN0YXJ0OwkJCQkKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGluaXRpYWxpemVyLCAwKTsKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IGluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CQkKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKXsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTsKKwkJCWlmIChmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQoZmllbGQsIDApOworCQkJCWlmIChmaWVsZC5pbml0aWFsaXphdGlvbiA9PSBudWxsKXsKKwkJCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZC5zb3VyY2VFbmQgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCWxhc3RDaGVja1BvaW50ID0gZmllbGQuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kICsgMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZChmaWVsZCwgMCk7CisJCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbil7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7CisJCQlpZiAodHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCQllbGVtZW50ID0gZWxlbWVudC5hZGQodHlwZSwgMCk7CQorCQkJCWxhc3RDaGVja1BvaW50ID0gdHlwZS5ib2R5U3RhcnQ7CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbGVtZW50LmFkZCh0eXBlLCAwKTsJCQkJCisJCQkJbGFzdENoZWNrUG9pbnQgPSB0eXBlLmRlY2xhcmF0aW9uU291cmNlRW5kICsgMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKXsKKwkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYgPSAoSW1wb3J0UmVmZXJlbmNlKSBub2RlOworCQkJZWxlbWVudCA9IGVsZW1lbnQuYWRkKGltcG9ydFJlZiwgMCk7CisJCQlsYXN0Q2hlY2tQb2ludCA9IGltcG9ydFJlZi5kZWNsYXJhdGlvblNvdXJjZUVuZCArIDE7CisJCX0KKwl9CisJcmV0dXJuIGVsZW1lbnQ7Cit9Citwcm90ZWN0ZWQgc3RhdGljIHNob3J0IGNoZWNrKGludCBpKSB7CisJcmV0dXJuIGNoZWNrX3RhYmxlW2kgLSAoTlVNX1JVTEVTICsgMSldOworfQorLyoKKyAqIFJlY29uc2lkZXIgdGhlIGVudGlyZSBzb3VyY2UgbG9va2luZyBmb3IgaW5jb25zaXN0ZW5jaWVzIGluIHt9ICgpIFtdCisgKi8KK3B1YmxpYyBib29sZWFuIGNoZWNrQW5kUmVwb3J0QnJhY2tldEFub21hbGllcyhQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKSB7CisKKwlzY2FubmVyLndhc0FjciA9IGZhbHNlOworCWJvb2xlYW4gYW5vbWFsaWVzRGV0ZWN0ZWQgPSBmYWxzZTsJCisJdHJ5IHsKKwkJY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOworCQlpbnRbXSBsZWZ0Q291bnQgPSB7MCwgMCwgMH07CisJCWludFtdIHJpZ2h0Q291bnQgPSB7MCwgMCwgMH07CisJCWludFtdIGRlcHRocyA9IHswLCAwLCAwfTsKKwkJaW50W11bXSBsZWZ0UG9zaXRpb25zID0gbmV3IGludFtdW10ge25ldyBpbnRbMTBdLCBuZXcgaW50WzEwXSwgbmV3IGludFsxMF19OworCQlpbnRbXVtdIGxlZnREZXB0aHMgPSBuZXcgaW50W11bXSB7bmV3IGludFsxMF0sIG5ldyBpbnRbMTBdLCBuZXcgaW50WzEwXX07CisJCWludFtdW10gcmlnaHRQb3NpdGlvbnMgPSBuZXcgaW50W11bXSB7bmV3IGludFsxMF0sIG5ldyBpbnRbMTBdLCBuZXcgaW50WzEwXX07CisJCWludFtdW10gcmlnaHREZXB0aHMgPSBuZXcgaW50W11bXSB7bmV3IGludFsxMF0sIG5ldyBpbnRbMTBdLCBuZXcgaW50WzEwXX07CisJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gc2Nhbm5lci5pbml0aWFsUG9zaXRpb247IC8vc3RhcnRpbmcgcG9pbnQgKGZpcnN0LXplcm8tYmFzZWQgY2hhcikKKwkJd2hpbGUgKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIDwgc2Nhbm5lci5lb2ZQb3NpdGlvbikgeyAvL2xvb3AgZm9yIGp1bXBpbmcgb3ZlciBjb21tZW50cworCQkJdHJ5IHsKKwkJCQkvLyAtLS0tLS0tLS1Db25zdW1lIHdoaXRlIHNwYWNlIGFuZCBoYW5kbGVzIHN0YXJ0UG9zaXRpb24tLS0tLS0tLS0KKwkJCQlib29sZWFuIGlzV2hpdGVTcGFjZTsKKwkJCQlkbyB7CisJCQkJCXNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQlpZiAoKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpICYmIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCWlzV2hpdGVTcGFjZSA9IHNjYW5uZXIuanVtcE92ZXJVbmljb2RlV2hpdGVTcGFjZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciAmJiAoKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkgeworCQkJCQkJCWlmIChzY2FubmVyLmxpbmVFbmRzW3NjYW5uZXIubGluZVB0cl0gPCBzY2FubmVyLnN0YXJ0UG9zaXRpb24pIHsKKwkJCQkJCQkJLy8gb25seSByZWNvcmQgbGluZSBwb3NpdGlvbnMgd2UgaGF2ZSBub3QgcmVjb3JkZWQgeWV0CisJCQkJCQkJCXNjYW5uZXIucHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpc1doaXRlU3BhY2UgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNjYW5uZXIuY3VycmVudENoYXJhY3Rlcik7CisJCQkJCX0KKwkJCQl9IHdoaWxlIChpc1doaXRlU3BhY2UgJiYgKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIDwgc2Nhbm5lci5lb2ZQb3NpdGlvbikpOworCisJCQkJLy8gLS0tLS0tLWNvbnN1bWUgdG9rZW4gdW50aWwgfSBpcyBmb3VuZC0tLS0tLS0tLQorCisJCQkJc3dpdGNoIChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQkJY2FzZSAneycgOgorCQkJCQkJeworCQkJCQkJCWludCBpbmRleCA9IGxlZnRDb3VudFtDdXJseUJyYWNrZXRdICsrOworCQkJCQkJCWlmIChpbmRleCA9PSBsZWZ0UG9zaXRpb25zW0N1cmx5QnJhY2tldF0ubGVuZ3RoKSB7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobGVmdFBvc2l0aW9uc1tDdXJseUJyYWNrZXRdLCAwLCAobGVmdFBvc2l0aW9uc1tDdXJseUJyYWNrZXRdID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgaW5kZXgpOworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxlZnREZXB0aHNbQ3VybHlCcmFja2V0XSwgMCwgKGxlZnREZXB0aHNbQ3VybHlCcmFja2V0XSA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGluZGV4KTsKKwkJCQkJCQl9CisJCQkJCQkJbGVmdFBvc2l0aW9uc1tDdXJseUJyYWNrZXRdW2luZGV4XSA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQlsZWZ0RGVwdGhzW0N1cmx5QnJhY2tldF1baW5kZXhdID0gZGVwdGhzW0N1cmx5QnJhY2tldF0gKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnfScgOgorCQkJCQkJeworCQkJCQkJCWludCBpbmRleCA9IHJpZ2h0Q291bnRbQ3VybHlCcmFja2V0XSArKzsKKwkJCQkJCQlpZiAoaW5kZXggPT0gcmlnaHRQb3NpdGlvbnNbQ3VybHlCcmFja2V0XS5sZW5ndGgpIHsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShyaWdodFBvc2l0aW9uc1tDdXJseUJyYWNrZXRdLCAwLCAocmlnaHRQb3NpdGlvbnNbQ3VybHlCcmFja2V0XSA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGluZGV4KTsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShyaWdodERlcHRoc1tDdXJseUJyYWNrZXRdLCAwLCAocmlnaHREZXB0aHNbQ3VybHlCcmFja2V0XSA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGluZGV4KTsKKwkJCQkJCQl9CisJCQkJCQkJcmlnaHRQb3NpdGlvbnNbQ3VybHlCcmFja2V0XVtpbmRleF0gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJcmlnaHREZXB0aHNbQ3VybHlCcmFja2V0XVtpbmRleF0gPSAtLWRlcHRoc1tDdXJseUJyYWNrZXRdOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJygnIDoKKwkJCQkJCXsKKwkJCQkJCQlpbnQgaW5kZXggPSBsZWZ0Q291bnRbUm91bmRCcmFja2V0XSArKzsKKwkJCQkJCQlpZiAoaW5kZXggPT0gbGVmdFBvc2l0aW9uc1tSb3VuZEJyYWNrZXRdLmxlbmd0aCkgeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxlZnRQb3NpdGlvbnNbUm91bmRCcmFja2V0XSwgMCwgKGxlZnRQb3NpdGlvbnNbUm91bmRCcmFja2V0XSA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGluZGV4KTsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShsZWZ0RGVwdGhzW1JvdW5kQnJhY2tldF0sIDAsIChsZWZ0RGVwdGhzW1JvdW5kQnJhY2tldF0gPSBuZXcgaW50W2luZGV4ICogMl0pLCAwLCBpbmRleCk7CisJCQkJCQkJfQorCQkJCQkJCWxlZnRQb3NpdGlvbnNbUm91bmRCcmFja2V0XVtpbmRleF0gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJbGVmdERlcHRoc1tSb3VuZEJyYWNrZXRdW2luZGV4XSA9IGRlcHRoc1tSb3VuZEJyYWNrZXRdICsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJyknIDoKKwkJCQkJCXsKKwkJCQkJCQlpbnQgaW5kZXggPSByaWdodENvdW50W1JvdW5kQnJhY2tldF0gKys7CisJCQkJCQkJaWYgKGluZGV4ID09IHJpZ2h0UG9zaXRpb25zW1JvdW5kQnJhY2tldF0ubGVuZ3RoKSB7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocmlnaHRQb3NpdGlvbnNbUm91bmRCcmFja2V0XSwgMCwgKHJpZ2h0UG9zaXRpb25zW1JvdW5kQnJhY2tldF0gPSBuZXcgaW50W2luZGV4ICogMl0pLCAwLCBpbmRleCk7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocmlnaHREZXB0aHNbUm91bmRCcmFja2V0XSwgMCwgKHJpZ2h0RGVwdGhzW1JvdW5kQnJhY2tldF0gPSBuZXcgaW50W2luZGV4ICogMl0pLCAwLCBpbmRleCk7CisJCQkJCQkJfQorCQkJCQkJCXJpZ2h0UG9zaXRpb25zW1JvdW5kQnJhY2tldF1baW5kZXhdID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJCXJpZ2h0RGVwdGhzW1JvdW5kQnJhY2tldF1baW5kZXhdID0gLS1kZXB0aHNbUm91bmRCcmFja2V0XTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdbJyA6CisJCQkJCQl7CisJCQkJCQkJaW50IGluZGV4ID0gbGVmdENvdW50W1NxdWFyZUJyYWNrZXRdICsrOworCQkJCQkJCWlmIChpbmRleCA9PSBsZWZ0UG9zaXRpb25zW1NxdWFyZUJyYWNrZXRdLmxlbmd0aCkgeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxlZnRQb3NpdGlvbnNbU3F1YXJlQnJhY2tldF0sIDAsIChsZWZ0UG9zaXRpb25zW1NxdWFyZUJyYWNrZXRdID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgaW5kZXgpOworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxlZnREZXB0aHNbU3F1YXJlQnJhY2tldF0sIDAsIChsZWZ0RGVwdGhzW1NxdWFyZUJyYWNrZXRdID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgaW5kZXgpOworCQkJCQkJCX0KKwkJCQkJCQlsZWZ0UG9zaXRpb25zW1NxdWFyZUJyYWNrZXRdW2luZGV4XSA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQlsZWZ0RGVwdGhzW1NxdWFyZUJyYWNrZXRdW2luZGV4XSA9IGRlcHRoc1tTcXVhcmVCcmFja2V0XSArKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICddJyA6CisJCQkJCQl7CisJCQkJCQkJaW50IGluZGV4ID0gcmlnaHRDb3VudFtTcXVhcmVCcmFja2V0XSArKzsKKwkJCQkJCQlpZiAoaW5kZXggPT0gcmlnaHRQb3NpdGlvbnNbU3F1YXJlQnJhY2tldF0ubGVuZ3RoKSB7CisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocmlnaHRQb3NpdGlvbnNbU3F1YXJlQnJhY2tldF0sIDAsIChyaWdodFBvc2l0aW9uc1tTcXVhcmVCcmFja2V0XSA9IG5ldyBpbnRbaW5kZXggKiAyXSksIDAsIGluZGV4KTsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShyaWdodERlcHRoc1tTcXVhcmVCcmFja2V0XSwgMCwgKHJpZ2h0RGVwdGhzW1NxdWFyZUJyYWNrZXRdID0gbmV3IGludFtpbmRleCAqIDJdKSwgMCwgaW5kZXgpOworCQkJCQkJCX0KKwkJCQkJCQlyaWdodFBvc2l0aW9uc1tTcXVhcmVCcmFja2V0XVtpbmRleF0gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJcmlnaHREZXB0aHNbU3F1YXJlQnJhY2tldF1baW5kZXhdID0gLS1kZXB0aHNbU3F1YXJlQnJhY2tldF07CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnXCcnIDoKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc2Nhbm5lci5nZXROZXh0Q2hhcignXFwnKSkgeworCQkJCQkJCQlzY2FubmVyLnNjYW5Fc2NhcGVDaGFyYWN0ZXIoKTsKKwkJCQkJCQl9IGVsc2UgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJCXNjYW5uZXIudW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJCWlmICgoKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykgJiYgKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJc2Nhbm5lci5nZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmIChzY2FubmVyLndpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCQlzY2FubmVyLndpdGhvdXRVbmljb2RlQnVmZmVyWysrc2Nhbm5lci53aXRob3V0VW5pY29kZVB0cl0gPSBzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJc2Nhbm5lci5nZXROZXh0Q2hhcignXCcnKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJY2FzZSAnIicgOiAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQlzY2FubmVyLnVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJaWYgKCgoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKSAmJiAoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJc2Nhbm5lci5nZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHNjYW5uZXIud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQlzY2FubmVyLndpdGhvdXRVbmljb2RlQnVmZmVyWysrc2Nhbm5lci53aXRob3V0VW5pY29kZVB0cl0gPSBzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJd2hpbGUgKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciAhPSAnIicpIHsKKwkJCQkJCQlpZiAoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHsKKwkJCQkJCQkJaWYgKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykKKwkJCQkJCQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CisJCQkJCQkJCXNjYW5uZXIuc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCX0KKwkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJc2Nhbm5lci51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQlpZiAoKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpICYmIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJc2Nhbm5lci5nZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAoc2Nhbm5lci53aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQlzY2FubmVyLndpdGhvdXRVbmljb2RlQnVmZmVyWysrc2Nhbm5lci53aXRob3V0VW5pY29kZVB0cl0gPSBzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnLycgOgorCQkJCQkJeworCQkJCQkJCWludCB0ZXN0OworCQkJCQkJCWlmICgodGVzdCA9IHNjYW5uZXIuZ2V0TmV4dENoYXIoJy8nLCAnKicpKSA9PSAwKSB7IC8vbGluZSBjb21tZW50IAorCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQlpZiAoKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpICYmIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzEgPCAwIHx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDAgfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMzIDwgMCB8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzQgPCAwKSB7IC8vZXJyb3IgZG9uJ3QgY2FyZSBvZiB0aGUgdmFsdWUKKwkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSAnQSc7CisJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIFxuIGFuZCBccgorCQkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXdoaWxlIChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xuJykgeworCQkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhcgorCQkJCQkJCQkJc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCQlpZiAoKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpICYmIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMxIDwgMCB8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwIHx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDAgfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkgeyAvL2Vycm9yIGRvbid0IGNhcmUgb2YgdGhlIHZhbHVlCisJCQkJCQkJCQkJCXNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9ICdBJzsKKwkJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIFxuIGFuZCBccgorCQkJCQkJCQkJCWVsc2UgeworCQkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmIChzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgJiYgKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpIHsKKwkJCQkJCQkJCWlmIChzY2FubmVyLmxpbmVFbmRzW3NjYW5uZXIubGluZVB0cl0gPCBzY2FubmVyLnN0YXJ0UG9zaXRpb24pIHsKKwkJCQkJCQkJCQkvLyBvbmx5IHJlY29yZCBsaW5lIHBvc2l0aW9ucyB3ZSBoYXZlIG5vdCByZWNvcmRlZCB5ZXQKKwkJCQkJCQkJCQlzY2FubmVyLnB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmICh0ZXN0ID4gMCkgeyAvL3RyYWRpdGlvbmFsIGFuZCBhbm5vdGF0aW9uIGNvbW1lbnQKKwkJCQkJCQkJYm9vbGVhbiBzdGFyID0gZmFsc2U7CisJCQkJCQkJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQkJc2Nhbm5lci51bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQkJaWYgKCgoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKSAmJiAoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQlzY2FubmVyLmdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaWYgKHNjYW5uZXIud2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJCXNjYW5uZXIud2l0aG91dFVuaWNvZGVCdWZmZXJbKytzY2FubmVyLndpdGhvdXRVbmljb2RlUHRyXSA9IHNjYW5uZXIuY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID09ICcqJykgeworCQkJCQkJCQkJc3RhciA9IHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhciAKKwkJCQkJCQkJaWYgKCgoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKSAmJiAoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCXdoaWxlIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMxIDwgMCB8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwIHx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDAgfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkgeyAvL2Vycm9yIGRvbid0IGNhcmUgb2YgdGhlIHZhbHVlCisJCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gJ0EnOworCQkJCQkJCQkJfSAvL3NvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSAqIGFuZCAvCisJCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJLy9sb29wIHVudGlsIGVuZCBvZiBjb21tZW50ICovIAorCQkJCQkJCQl3aGlsZSAoKHNjYW5uZXIuY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsKKwkJCQkJCQkJCXN0YXIgPSBzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonOworCQkJCQkJCQkJLy9nZXQgbmV4dCBjaGFyCisJCQkJCQkJCQlpZiAoKChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpICYmIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMxIDwgMCB8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwIHx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW3NjYW5uZXIuY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDAgfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2Vbc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkgeyAvL2Vycm9yIGRvbid0IGNhcmUgb2YgdGhlIHZhbHVlCisJCQkJCQkJCQkJCXNjYW5uZXIuY3VycmVudENoYXJhY3RlciA9ICdBJzsKKwkJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tICogYW5kIC8KKwkJCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCQkJCXNjYW5uZXIuc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJCQkJc2Nhbm5lci5zY2FuTnVtYmVyKGZhbHNlKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQl9CisJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLWVuZCBzd2l0Y2ggd2hpbGUgdHJ5LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlicmVhazsgLy8gcmVhZCB1bnRpbCBFT0YKKwkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGZhbHNlOyAvLyBubyBjbHVlCisJCQl9CisJCX0KKwkJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgeworCQkJY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMgPSBzY2FubmVyLmdldExpbmVFbmRzKCk7CisJCX0KKworCQkvLyBjaGVjayBwbGFjZW1lbnQgYW5vbWFsaWVzIGFnYWluc3Qgb3RoZXIga2luZHMgb2YgYnJhY2tldHMKKwkJZm9yIChpbnQga2luZCA9IDA7IGtpbmQgPCBCcmFja2V0S2luZHM7IGtpbmQrKykgeworCQkJZm9yIChpbnQgbGVmdEluZGV4ID0gbGVmdENvdW50W2tpbmRdIC0gMTsgbGVmdEluZGV4ID49IDA7IGxlZnRJbmRleC0tKSB7CisJCQkJaW50IHN0YXJ0ID0gbGVmdFBvc2l0aW9uc1traW5kXVtsZWZ0SW5kZXhdOyAvLyBkZWVwZXN0IGZpcnN0CisJCQkJLy8gZmluZCBtYXRjaGluZyBjbG9zaW5nIGJyYWNrZXQKKwkJCQlpbnQgZGVwdGggPSBsZWZ0RGVwdGhzW2tpbmRdW2xlZnRJbmRleF07CisJCQkJaW50IGVuZCA9IC0xOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmlnaHRDb3VudFtraW5kXTsgaSsrKSB7CisJCQkJCWludCBwb3MgPSByaWdodFBvc2l0aW9uc1traW5kXVtpXTsKKwkJCQkJLy8gd2FudCBtYXRjaGluZyBicmFja2V0IGZ1cnRoZXIgaW4gc291cmNlIHdpdGggc2FtZSBkZXB0aAorCQkJCQlpZiAoKHBvcyA+IHN0YXJ0KSAmJiAoZGVwdGggPT0gcmlnaHREZXB0aHNba2luZF1baV0pKSB7CisJCQkJCQllbmQgPSBwb3M7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZW5kIDwgMCkgeyAvLyBkaWQgbm90IGZpbmQgYSBnb29kIGNsb3NpbmcgbWF0Y2gKKwkJCQkJcHJvYmxlbVJlcG9ydGVyLnVubWF0Y2hlZEJyYWNrZXQoc3RhcnQsIHJlZmVyZW5jZUNvbnRleHQsIGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkvLyBjaGVjayBpZiBldmVuIG51bWJlciBvZiBvcGVuaW5nL2Nsb3Npbmcgb3RoZXIgYnJhY2tldHMgaW4gYmV0d2VlbiB0aGlzIHBhaXIgb2YgYnJhY2tldHMKKwkJCQlpbnQgYmFsYW5jZSA9IDA7CisJCQkJZm9yIChpbnQgb3RoZXJLaW5kID0gMDsoYmFsYW5jZSA9PSAwKSAmJiAob3RoZXJLaW5kIDwgQnJhY2tldEtpbmRzKTsgb3RoZXJLaW5kKyspIHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZWZ0Q291bnRbb3RoZXJLaW5kXTsgaSsrKSB7CisJCQkJCQlpbnQgcG9zID0gbGVmdFBvc2l0aW9uc1tvdGhlcktpbmRdW2ldOworCQkJCQkJaWYgKChwb3MgPiBzdGFydCkgJiYgKHBvcyA8IGVuZCkpCisJCQkJCQkJYmFsYW5jZSsrOworCQkJCQl9CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmlnaHRDb3VudFtvdGhlcktpbmRdOyBpKyspIHsKKwkJCQkJCWludCBwb3MgPSByaWdodFBvc2l0aW9uc1tvdGhlcktpbmRdW2ldOworCQkJCQkJaWYgKChwb3MgPiBzdGFydCkgJiYgKHBvcyA8IGVuZCkpCisJCQkJCQkJYmFsYW5jZS0tOworCQkJCQl9CisJCQkJCWlmIChiYWxhbmNlICE9IDApIHsKKwkJCQkJCXByb2JsZW1SZXBvcnRlci51bm1hdGNoZWRCcmFja2V0KHN0YXJ0LCByZWZlcmVuY2VDb250ZXh0LCBjb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOyAvL2JyYWNrZXQgYW5vbWFseQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyB0b28gbWFueSBvcGVuaW5nIGJyYWNrZXRzID8KKwkJCWZvciAoaW50IGkgPSByaWdodENvdW50W2tpbmRdOyBpIDwgbGVmdENvdW50W2tpbmRdOyBpKyspIHsKKwkJCQlhbm9tYWxpZXNEZXRlY3RlZCA9IHRydWU7CisJCQkJcHJvYmxlbVJlcG9ydGVyLnVubWF0Y2hlZEJyYWNrZXQobGVmdFBvc2l0aW9uc1traW5kXVtsZWZ0Q291bnRba2luZF0gLSBpIC0gMV0sIHJlZmVyZW5jZUNvbnRleHQsIGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCQl9CisJCQkvLyB0b28gbWFueSBjbG9zaW5nIGJyYWNrZXRzID8KKwkJCWZvciAoaW50IGkgPSBsZWZ0Q291bnRba2luZF07IGkgPCByaWdodENvdW50W2tpbmRdOyBpKyspIHsKKwkJCQlhbm9tYWxpZXNEZXRlY3RlZCA9IHRydWU7CisJCQkJcHJvYmxlbVJlcG9ydGVyLnVubWF0Y2hlZEJyYWNrZXQocmlnaHRQb3NpdGlvbnNba2luZF1baV0sIHJlZmVyZW5jZUNvbnRleHQsIGNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCQl9CisJCQlpZiAoYW5vbWFsaWVzRGV0ZWN0ZWQpIHJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gYW5vbWFsaWVzRGV0ZWN0ZWQ7CisJfSBjYXRjaCAoQXJyYXlTdG9yZUV4Y2VwdGlvbiBlKSB7IC8vIGpkazEuMi4yIGppdCBidWcKKwkJcmV0dXJuIGFub21hbGllc0RldGVjdGVkOworCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsgLy8gamRrMS4yLjIgaml0IGJ1ZworCQlyZXR1cm4gYW5vbWFsaWVzRGV0ZWN0ZWQ7CisJfQorfQorcHVibGljIGZpbmFsIHZvaWQgY2hlY2tBbmRTZXRNb2RpZmllcnMoaW50IGZsYWcpeworCS8qbW9kaWZ5IHRoZSBjdXJyZW50IG1vZGlmaWVycyBidWZmZXIuCisJV2hlbiB0aGUgc3RhcnRQb3NpdGlvbiBvZiB0aGUgbW9kaWZpZXJzIGlzIDAKKwlpdCBtZWFucyB0aGF0IHRoZSBtb2RpZmllciBiZWluZyBwYXJzZWQgaXMgdGhlIGZpcnN0CisJb2YgYSBsaXN0IG9mIHNldmVyYWwgbW9kaWZpZXJzLiBUaGUgc3RhcnRQb3NpdGlvbgorCWlzIHplcm9lZCB3aGVuIGEgY29weSBvZiBtb2RpZmllcnMtYnVmZmVyIGlzIHB1c2gKKwlvbnRvIHRoZSBhc3RTdGFjay4gKi8KKworCWlmICgobW9kaWZpZXJzICYgZmxhZykgIT0gMCl7IC8vIGR1cGxpY2F0ZSBtb2RpZmllcgorCQltb2RpZmllcnMgfD0gQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtOworCX0KKwltb2RpZmllcnMgfD0gZmxhZzsKKwkJCQorCWlmIChtb2RpZmllcnNTb3VyY2VTdGFydCA8IDApIG1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworfQorcHVibGljIHZvaWQgY2hlY2tBbm5vdGF0aW9uKCkgeworCisJYm9vbGVhbiBkZXByZWNhdGVkID0gZmFsc2U7CisJYm9vbGVhbiBjaGVja0RlcHJlY2F0ZWQgPSBmYWxzZTsKKwlpbnQgbGFzdEFubm90YXRpb25JbmRleCA9IC0xOworCisJLy9zaW5jZSBqZGsxLjIgbG9vayBvbmx5IGluIHRoZSBsYXN0IGphdmEgZG9jIGNvbW1lbnQuLi4KKwlmb3VuZCA6IGZvciAobGFzdEFubm90YXRpb25JbmRleCA9IHNjYW5uZXIuY29tbWVudFB0cjsgbGFzdEFubm90YXRpb25JbmRleCA+PSAwOyBsYXN0QW5ub3RhdGlvbkluZGV4LS0peworCQkvL2xvb2sgZm9yIEBkZXByZWNhdGVkIGludG8gdGhlIGZpcnN0IGphdmFkb2MgY29tbWVudCBwcmVjZWVkaW5nIHRoZSBkZWNsYXJhdGlvbgorCQlpbnQgY29tbWVudFNvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RBbm5vdGF0aW9uSW5kZXhdOworCQkvLyBqYXZhZG9jIG9ubHkgKG5vbiBqYXZhZG9jIGNvbW1lbnQgaGF2ZSBuZWdhdGl2ZSBlbmQgcG9zaXRpb25zLikKKwkJaWYgKG1vZGlmaWVyc1NvdXJjZVN0YXJ0ICE9IC0xICYmIG1vZGlmaWVyc1NvdXJjZVN0YXJ0IDwgY29tbWVudFNvdXJjZVN0YXJ0KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdEFubm90YXRpb25JbmRleF0gPCAwKSB7CisJCQlicmVhayBmb3VuZDsKKwkJfQorCQljaGVja0RlcHJlY2F0ZWQgPSB0cnVlOworCQlpbnQgY29tbWVudFNvdXJjZUVuZCA9IHNjYW5uZXIuY29tbWVudFN0b3BzW2xhc3RBbm5vdGF0aW9uSW5kZXhdIC0gMTsgLy9zdG9wIGlzIG9uZSBvdmVyCisJCWNoYXJbXSBjb21tZW50ID0gc2Nhbm5lci5zb3VyY2U7CisKKwkJZm9yIChpbnQgaSA9IGNvbW1lbnRTb3VyY2VTdGFydCArIDM7IGkgPCBjb21tZW50U291cmNlRW5kIC0gMTA7IGkrKykgeworCQkJaWYgKChjb21tZW50W2ldID09ICdAJykgCisJCQkJJiYgKGNvbW1lbnRbaSArIDFdID09ICdkJykKKwkJCQkmJiAoY29tbWVudFtpICsgMl0gPT0gJ2UnKQorCQkJCSYmIChjb21tZW50W2kgKyAzXSA9PSAncCcpCisJCQkJJiYgKGNvbW1lbnRbaSArIDRdID09ICdyJykKKwkJCQkmJiAoY29tbWVudFtpICsgNV0gPT0gJ2UnKQorCQkJCSYmIChjb21tZW50W2kgKyA2XSA9PSAnYycpCisJCQkJJiYgKGNvbW1lbnRbaSArIDddID09ICdhJykKKwkJCQkmJiAoY29tbWVudFtpICsgOF0gPT0gJ3QnKQorCQkJCSYmIChjb21tZW50W2kgKyA5XSA9PSAnZScpCisJCQkJJiYgKGNvbW1lbnRbaSArIDEwXSA9PSAnZCcpKSB7CisJCQkJLy8gZW5zdXJlIHRoZSB0YWcgaXMgcHJvcGVybHkgZW5kZWQ6IGVpdGhlciBmb2xsb3dlZCBieSBhIHNwYWNlLCBhIHRhYiwgbGluZSBlbmQgb3IgYXN0ZXJpc2suCisJCQkJaW50IG5leHRQb3MgPSBpKzExOworCQkJCWRlcHJlY2F0ZWQgPSAoY29tbWVudFtuZXh0UG9zXSA9PSAnICcpIHx8IChjb21tZW50W25leHRQb3NdID09ICdcdCcpIHx8IChjb21tZW50W25leHRQb3NdID09ICdcbicpIHx8IChjb21tZW50W25leHRQb3NdID09ICdccicpIHx8IChjb21tZW50W25leHRQb3NdID09ICcqJyk7CisJCQkJYnJlYWsgZm91bmQ7CisJCQl9CisJCX0KKwkJYnJlYWsgZm91bmQ7CisJfQorCWlmIChkZXByZWNhdGVkKSB7CisJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY0RlcHJlY2F0ZWQpOworCX0KKwkvLyBtb2RpZnkgdGhlIG1vZGlmaWVyIHNvdXJjZSBzdGFydCB0byBwb2ludCBhdCB0aGUgZmlyc3QgY29tbWVudAorCWlmIChsYXN0QW5ub3RhdGlvbkluZGV4ID49IDAgJiYgY2hlY2tEZXByZWNhdGVkKSB7CisJCW1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RBbm5vdGF0aW9uSW5kZXhdOyAKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjbGFzc0luc3RhbmNlQ3JlYXRpb24oYm9vbGVhbiBhbHdheXNRdWFsaWZpZWQpIHsKKwkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CisKKwkvLyBDbGFzc0JvZHlvcHQgcHJvZHVjZXMgYSBudWxsIGl0ZW0gb24gdGhlIGFzdFN0YWsgaWYgaXQgcHJvZHVjZXMgTk8gY2xhc3MgYm9keQorCS8vIEFuIGVtcHR5IGNsYXNzIGJvZHkgcHJvZHVjZXMgYSAwIG9uIHRoZSBsZW5ndGggc3RhY2suLi4uLgorCisJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2M7CisJaW50IGxlbmd0aDsKKwlpZiAoKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pID09IDEpCisJCSYmIChhc3RTdGFja1thc3RQdHJdID09IG51bGwpKSB7CisJCS8vTk8gQ2xhc3NCb2R5CisJCWFzdFB0ci0tOworCQlpZiAoYWx3YXlzUXVhbGlmaWVkKSB7CisJCQlhbGxvYyA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQl9IGVsc2UgeworCQkJYWxsb2MgPSBuZXcgQWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwkJfQorCQlhbGxvYy5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsgLy90aGUgcG9zaXRpb24gaGFzIGJlZW4gc3RvcmVkIGV4cGxpY2l0bHkKKworCQlpZiAoKGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZXhwcmVzc2lvblN0YWNrLCAKKwkJCQlleHByZXNzaW9uUHRyICsgMSwgCisJCQkJYWxsb2MuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwgCisJCQkJMCwgCisJCQkJbGVuZ3RoKTsgCisJCX0KKwkJYWxsb2MudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJCS8vdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnQKKwkJLy93aWxsIGJlIGNyZWF0ZWQgYW5kIGFkZGVkIGJ5IHRoZSBUQyAoc2VlIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcpCisJCWFsbG9jLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQlwdXNoT25FeHByZXNzaW9uU3RhY2soYWxsb2MpOworCX0gZWxzZSB7CisJCWRpc3BhdGNoRGVjbGFyYXRpb25JbnRvKGxlbmd0aCk7CisJCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGVEZWNsYXJhdGlvbiA9IChBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwkJYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJCWlmIChhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbiAhPSBudWxsKSB7CisJCQlhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24uYWxsb2NhdGlvbi5zb3VyY2VFbmQgPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwkJfQorCQlhc3RQdHItLTsKKwkJYXN0TGVuZ3RoUHRyLS07CisJCQorCQkvLyBtYXJrIGZpZWxkcyBhbmQgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCisJCW1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKGFub255bW91c1R5cGVEZWNsYXJhdGlvbik7CisJfQorfQorcHJvdGVjdGVkIGZpbmFsIHZvaWQgY29uY2F0RXhwcmVzc2lvbkxpc3RzKCkgeworCWV4cHJlc3Npb25MZW5ndGhTdGFja1stLWV4cHJlc3Npb25MZW5ndGhQdHJdKys7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgY29uY2F0Tm9kZUxpc3RzKCkgeworCS8qCisJICogVGhpcyBpcyBhIGNhc2Ugd2hlcmUgeW91IGhhdmUgdHdvIHN1Ymxpc3RzIGludG8gdGhlIGFzdFN0YWNrIHRoYXQgeW91IHdhbnQKKwkgKiB0byBtZXJnZSBpbiBvbmUgbGlzdC4gVGhlcmUgaXMgbm8gYWN0aW9uIHJlcXVpcmVkIG9uIHRoZSBhc3RTdGFjay4gVGhlIG9ubHkKKwkgKiB0aGluZyB5b3UgbmVlZCB0byBkbyBpcyBtZXJnZSB0aGUgdHdvIGxlbmd0aHMgc3BlY2lmaWVkIG9uIHRoZSBhc3RTdGFja0xlbmd0aC4KKwkgKiBUaGUgdG9wIHR3byBsZW5ndGggYXJlIGZvciBleGFtcGxlOgorCSAqIC4uLiBwICAgbgorCSAqIGFuZCB5b3Ugd2FudCB0byByZXN1bHQgaW4gYSBsaXN0IGxpa2U6CisJICogLi4uIG4rcCAKKwkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHAgY291bGQgYmUgZXF1YWxzIHRvIDAgaW4gY2FzZSB0aGVyZSBpcyBubyBhc3ROb2RlIHB1c2hlZAorCSAqIG9uIHRoZSBhc3RTdGFjay4KKwkgKiBMb29rIGF0IHRoZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgZm9yIGFuIGV4YW1wbGUuCisJICovCisKKwlhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHIgLSAxXSArPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQWxsb2NhdGlvbkhlYWRlcigpIHsKKwkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CisKKwkvLyBDbGFzc0JvZHlvcHQgcHJvZHVjZXMgYSBudWxsIGl0ZW0gb24gdGhlIGFzdFN0YWsgaWYgaXQgcHJvZHVjZXMgTk8gY2xhc3MgYm9keQorCS8vIEFuIGVtcHR5IGNsYXNzIGJvZHkgcHJvZHVjZXMgYSAwIG9uIHRoZSBsZW5ndGggc3RhY2suLi4uLgorCisJaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpeworCQlyZXR1cm47IC8vIHNob3VsZCBuZXZlciBvY2N1ciwgdGhpcyBjb25zdW1lUnVsZSBpcyBvbmx5IHVzZWQgaW4gcmVjb3ZlcnkgbW9kZQorCX0KKwlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSl7CisJCS8vIGJlZ2lubmluZyBvZiBhbiBhbm9ueW1vdXMgdHlwZQorCQlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gbmV3IEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJYW5vbnltb3VzVHlwZS5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJYW5vbnltb3VzVHlwZS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7IC8vIGNsb3NpbmcgcGFyZW50aGVzaXMKKwkJbGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChhbm9ueW1vdXNUeXBlLCAwKTsKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQljdXJyZW50VG9rZW4gPSAwOyAvLyBvcGVuaW5nIGJyYWNlIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50CisJCXJldHVybjsKKwl9CisJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247IC8vIGZvcmNlIHRvIHJlc3RhcnQgYXQgdGhpcyBleGFjdCBwb3NpdGlvbgorCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHJlcXVlc3QgdG8gcmVzdGFydCBmcm9tIGhlcmUgb24KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcmd1bWVudExpc3QoKSB7CisJLy8gQXJndW1lbnRMaXN0IDo6PSBBcmd1bWVudExpc3QgJywnIEV4cHJlc3Npb24KKwljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcnJheUFjY2Vzcyhib29sZWFuIHVuc3BlY2lmaWVkUmVmZXJlbmNlKSB7CisJLy8gQXJyYXlBY2Nlc3MgOjo9IE5hbWUgJ1snIEV4cHJlc3Npb24gJ10nID09PiB0cnVlCisJLy8gQXJyYXlBY2Nlc3MgOjo9IFByaW1hcnlOb05ld0FycmF5ICdbJyBFeHByZXNzaW9uICddJyA9PT4gZmFsc2UKKworCisJLy9vcHRpbWl6ZSBwdXNoL3BvcAorCUV4cHJlc3Npb24gZXhwOworCWlmICh1bnNwZWNpZmllZFJlZmVyZW5jZSkgeworCQlleHAgPSAKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IAorCQkJCW5ldyBBcnJheVJlZmVyZW5jZSgKKwkJCQkJZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSwKKwkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKTsKKwl9IGVsc2UgeworCQlleHByZXNzaW9uUHRyLS07CisJCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwkJZXhwID0gCisJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSAKKwkJCQluZXcgQXJyYXlSZWZlcmVuY2UoCisJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSwKKwkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIgKyAxXSk7CisJfQorCWV4cC5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpIHsKKwkvLyBBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcm9wdAorCS8vIEFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcm9wdAorCisJaW50IGxlbmd0aDsKKwlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFhZSA9IG5ldyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKCk7CisJaWYgKGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyXSAhPSAwKSB7CisJCWV4cHJlc3Npb25MZW5ndGhQdHIgLS0gOworCQlhYWUuaW5pdGlhbGl6ZXIgPSAoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV07CisJfSBlbHNlIHsKKwkJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCX0KKwkJCisJYWFlLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCWxlbmd0aCA9IChleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSk7CisJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGggOworCVN5c3RlbS5hcnJheWNvcHkoCisJCWV4cHJlc3Npb25TdGFjaywKKwkJZXhwcmVzc2lvblB0cisxLAorCQlhYWUuZGltZW5zaW9ucyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sCisJCTAsCisJCWxlbmd0aCk7CisJYWFlLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCWlmIChhYWUuaW5pdGlhbGl6ZXIgPT0gbnVsbCkgeworCQlhYWUuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJfSBlbHNlIHsKKwkJYWFlLnNvdXJjZUVuZCA9IGFhZS5pbml0aWFsaXplci5zb3VyY2VFbmQgOworCX0KKwlwdXNoT25FeHByZXNzaW9uU3RhY2soYWFlKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCkgeworCS8vIEFycmF5SW5pdGlhbGl6ZXIgOjo9ICd7JyBWYXJpYWJsZUluaXRpYWxpemVycyAnfScKKwkvLyBBcnJheUluaXRpYWxpemVyIDo6PSAneycgVmFyaWFibGVJbml0aWFsaXplcnMgLCAnfScKKworCWFycmF5SW5pdGlhbGl6ZXIoZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXNzZXJ0U3RhdGVtZW50KCkgeworCS8vIEFzc2VydFN0YXRlbWVudCA6Oj0gJ2Fzc2VydCcgRXhwcmVzc2lvbiAnOicgRXhwcmVzc2lvbiAnOycKKwlleHByZXNzaW9uTGVuZ3RoUHRyLT0yOworCXB1c2hPbkFzdFN0YWNrKG5ldyBBc3NlcnRTdGF0ZW1lbnQoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFzc2lnbm1lbnQoKSB7CisJLy8gQXNzaWdubWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbgorCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwlpbnQgb3AgPSBpbnRTdGFja1tpbnRQdHItLV0gOyAvLzwtLXRoZSBlbmNvZGVkIG9wZXJhdG9yCisJCisJZXhwcmVzc2lvblB0ciAtLSA7IGV4cHJlc3Npb25MZW5ndGhQdHIgLS0gOworCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9CisJCShvcCAhPSBFUVVBTCApID8KKwkJCW5ldyBDb21wb3VuZEFzc2lnbm1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdICwKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cisxXSwgCisJCQkJb3AsCisJCQkJc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMSkJOgorCQkJbmV3IEFzc2lnbm1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdICwKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cisxXSwKKwkJCQlzY2FubmVyLnN0YXJ0UG9zaXRpb24gLSAxKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoaW50IHBvcykgeworCS8vIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJz0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnKj0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnLz0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnJT0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnKz0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnLT0nCisJLy8gQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnPDw9JworCS8vIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJz4+PScKKwkvLyBBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc+Pj49JworCS8vIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJyY9JworCS8vIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJ149JworCS8vIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJ3w9JworCisJdHJ5IHsKKwkJaW50U3RhY2tbKytpbnRQdHJdID0gcG9zOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL2ludFB0ciBpcyBjb3JyZWN0IAorCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBpbnRTdGFjay5sZW5ndGg7CisJCWludCBvbGRTdGFja1tdID0gaW50U3RhY2s7CisJCWludFN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgaW50U3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJaW50U3RhY2tbaW50UHRyXSA9IHBvczsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihpbnQgb3ApIHsKKwkvLyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnKicgVW5hcnlFeHByZXNzaW9uCisJLy8gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJy8nIFVuYXJ5RXhwcmVzc2lvbgorCS8vIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICclJyBVbmFyeUV4cHJlc3Npb24KKwkvLyBBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiAnKycgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisJLy8gQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gJy0nIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorCS8vIFNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc8PCcgIEFkZGl0aXZlRXhwcmVzc2lvbgorCS8vIFNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc+PicgIEFkZGl0aXZlRXhwcmVzc2lvbgorCS8vIFNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc+Pj4nIEFkZGl0aXZlRXhwcmVzc2lvbgorCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPCcgIFNoaWZ0RXhwcmVzc2lvbgorCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPicgIFNoaWZ0RXhwcmVzc2lvbgorCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPD0nIFNoaWZ0RXhwcmVzc2lvbgorCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPj0nIFNoaWZ0RXhwcmVzc2lvbgorCS8vIEFuZEV4cHJlc3Npb24gOjo9IEFuZEV4cHJlc3Npb24gJyYnIEVxdWFsaXR5RXhwcmVzc2lvbgorCS8vIEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gRXhjbHVzaXZlT3JFeHByZXNzaW9uICdeJyBBbmRFeHByZXNzaW9uCisJLy8gSW5jbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBJbmNsdXNpdmVPckV4cHJlc3Npb24gJ3wnIEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbgorCS8vIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICcmJicgSW5jbHVzaXZlT3JFeHByZXNzaW9uCisJLy8gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uICd8fCcgQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uCisKKwkvL29wdGltaXplIHRoZSBwdXNoL3BvcAorCisJZXhwcmVzc2lvblB0ci0tOworCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlpZiAob3AgPT0gT1JfT1IpIHsKKwkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gCisJCQluZXcgT1JfT1JfRXhwcmVzc2lvbigKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0sIAorCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyICsgMV0sIAorCQkJCW9wKTsgCisJfSBlbHNlIHsKKwkJaWYgKG9wID09IEFORF9BTkQpIHsKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IAorCQkJCW5ldyBBTkRfQU5EX0V4cHJlc3Npb24oCisJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSwgCisJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyICsgMV0sIAorCQkJCQlvcCk7CisJCX0gZWxzZSB7CisJCQkvLyBsb29rIGZvciAic3RyaW5nMSIgKyAic3RyaW5nMiIKKwkJCWlmICgob3AgPT0gUExVUykgJiYgb3B0aW1pemVTdHJpbmdMaXRlcmFscykgeworCQkJCUV4cHJlc3Npb24gZXhwcjEsIGV4cHIyOworCQkJCWV4cHIxID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCQkJCWV4cHIyID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIgKyAxXTsKKwkJCQlpZiAoZXhwcjEgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7CisJCQkJCWlmIChleHByMiBpbnN0YW5jZW9mIENoYXJMaXRlcmFsKSB7IC8vIHN0cmluZytjaGFyCisJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSAKKwkJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRXaXRoKChDaGFyTGl0ZXJhbCkgZXhwcjIpOyAKKwkJCQkJfSBlbHNlIGlmIChleHByMiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsgLy9zdHJpbmcrc3RyaW5nCisJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSAKKwkJCQkJCQkoKFN0cmluZ0xpdGVyYWwpIGV4cHIxKS5leHRlbmRXaXRoKChTdHJpbmdMaXRlcmFsKSBleHByMik7IAorCQkJCQl9IGVsc2UgeworCQkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gbmV3IEJpbmFyeUV4cHJlc3Npb24oZXhwcjEsIGV4cHIyLCBQTFVTKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHIxLCBleHByMiwgUExVUyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSAKKwkJCQkJbmV3IEJpbmFyeUV4cHJlc3Npb24oCisJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0sIAorCQkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHIgKyAxXSwgCisJCQkJCQlvcCk7CisJCQl9CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQmxvY2soKSB7CisJLy8gQmxvY2sgOjo9IE9wZW5CbG9jayAneycgQmxvY2tTdGF0ZW1lbnRzb3B0ICd9JworCS8vIHNpbXBsZXIgYWN0aW9uIGZvciBlbXB0eSBibG9ja3MKKworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pID09IDApIHsgLy8gZW1wdHkgYmxvY2sgCisJCXB1c2hPbkFzdFN0YWNrKEJsb2NrLkVtcHR5V2l0aChpbnRTdGFja1tpbnRQdHItLV0sIGVuZFN0YXRlbWVudFBvc2l0aW9uKSk7CisJCXJlYWxCbG9ja1B0ci0tOyAvLyBzdGlsbCBuZWVkIHRvIHBvcCB0aGUgYmxvY2sgdmFyaWFibGUgY291bnRlcgorCX0gZWxzZSB7CisJCUJsb2NrIGJrID0gbmV3IEJsb2NrKHJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0ci0tXSk7CisJCWFzdFB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlhc3RTdGFjaywgCisJCQlhc3RQdHIgKyAxLCAKKwkJCWJrLnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sIAorCQkJMCwgCisJCQlsZW5ndGgpOyAKKwkJcHVzaE9uQXN0U3RhY2soYmspOworCQliay5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJYmsuc291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUJsb2NrU3RhdGVtZW50cygpIHsKKwkvLyBCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyBCbG9ja1N0YXRlbWVudAorCWNvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc2VMYWJlbCgpIHsKKwkvLyBTd2l0Y2hMYWJlbCA6Oj0gJ2Nhc2UnIENvbnN0YW50RXhwcmVzc2lvbiAnOicKKwlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJcHVzaE9uQXN0U3RhY2sobmV3IENhc2UoaW50U3RhY2tbaW50UHRyLS1dLCBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSkpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uKCkgeworCS8vIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIFByaW1pdGl2ZVR5cGUgRGltc29wdCBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbgorCS8vIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgRGltcyBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCisJLy9pbnRTdGFjayA6IHBvc09mTGVmdFBhcmVuIGRpbSBwb3NPZlJpZ2h0UGFyZW4KKworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7CisJaW50IGVuZCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBjYXN0ID0gbmV3IENhc3RFeHByZXNzaW9uKGV4cCA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSwgY2FzdFR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSkpOworCWNhc3RUeXBlLnNvdXJjZUVuZCA9IGVuZCAtIDE7CisJY2FzdFR5cGUuc291cmNlU3RhcnQgPSAoY2FzdC5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXSkgKyAxOworCWNhc3Quc291cmNlRW5kID0gZXhwLnNvdXJjZUVuZDsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpIHsKKwkvL0Nhc3RFeHByZXNzaW9uIDo6PSAnKCcgRXhwcmVzc2lvbiAnKScgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisJLy8gRXhwcmVzc2lvbiBpcyB1c2VkIGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxCisKKwkvL29wdGltaXplIHB1c2gvcG9wCisKKwlFeHByZXNzaW9uIGNhc3RUeXBlLGNhc3QsZXhwOworCWV4cHJlc3Npb25QdHItLTsKKwlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSAKKwkJCWNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oCWV4cD1leHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cisxXSAsCisJCQkJCQkJCWNhc3RUeXBlID0gZ2V0VHlwZVJlZmVyZW5jZShleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0pKTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyIC0tIDsKKwl1cGRhdGVTb3VyY2VQb3NpdGlvbihjYXN0VHlwZSk7CisJY2FzdC5zb3VyY2VTdGFydD1jYXN0VHlwZS5zb3VyY2VTdGFydDsKKwljYXN0LnNvdXJjZUVuZD1leHAuc291cmNlRW5kOworCWNhc3RUeXBlLnNvdXJjZVN0YXJ0Kys7CisJY2FzdFR5cGUuc291cmNlRW5kLS07CisJfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhdGNoZXMoKSB7CisJLy8gQ2F0Y2hlcyA6Oj0gQ2F0Y2hlcyBDYXRjaENsYXVzZQorCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhdGNoSGVhZGVyKCkgeworCS8vIENhdGNoRGVjbGFyYXRpb24gOjo9ICdjYXRjaCcgJygnIEZvcm1hbFBhcmFtZXRlciAnKScgJ3snCisKKwlpZiAoY3VycmVudEVsZW1lbnQgPT0gbnVsbCl7CisJCXJldHVybjsgLy8gc2hvdWxkIG5ldmVyIG9jY3VyLCB0aGlzIGNvbnN1bWVSdWxlIGlzIG9ubHkgdXNlZCBpbiByZWNvdmVyeSBtb2RlCisJfQorCS8vIGN1cnJlbnQgZWxlbWVudCBzaG91bGQgYmUgYSBibG9jayBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHRoZSBvcGVuaW5nIGJyYWNlCisJaWYgKCEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRCbG9jaykpeworCQlyZXR1cm47CisJfQorCS8vIGV4Y2VwdGlvbiBhcmd1bWVudCBpcyBhbHJlYWR5IG9uIGFzdFN0YWNrCisJKChSZWNvdmVyZWRCbG9jayljdXJyZW50RWxlbWVudCkuYXR0YWNoKAorCQluZXcgUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSgoQXJndW1lbnQpYXN0U3RhY2tbYXN0UHRyLS1dLCBjdXJyZW50RWxlbWVudCwgMCkpOyAvLyBpbnNlcnQgY2F0Y2ggdmFyaWFibGUgaW4gY2F0Y2ggYmxvY2sKKwlsYXN0Q2hlY2tQb2ludCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsgLy8gZm9yY2UgdG8gcmVzdGFydCBhdCB0aGlzIGV4YWN0IHBvc2l0aW9uCisJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gcmVxdWVzdCB0byByZXN0YXJ0IGZyb20gaGVyZSBvbgorCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpIHsKKwkvLyBDbGFzc0JvZHlEZWNsYXJhdGlvbiA6Oj0gRGlldCBCbG9jaworCS8vcHVzaCBhbiBJbml0aWFsaXplcgorCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CisJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBuZXcgSW5pdGlhbGl6ZXIoKEJsb2NrKSBhc3RTdGFja1thc3RQdHJdLCAwKTsKKwlpbnRQdHItLTsgLy8gcG9wIHNvdXJjZXN0YXJ0IGxlZnQgb24gdGhlIHN0YWNrIGJ5IGNvbnN1bWVOZXN0ZWRNZXRob2QuCisJcmVhbEJsb2NrUHRyLS07IC8vIHBvcCB0aGUgYmxvY2sgdmFyaWFibGUgY291bnRlciBsZWZ0IG9uIHRoZSBzdGFjayBieSBjb25zdW1lTmVzdGVkTWV0aG9kCisJaW50IGphdmFkb2NDb21tZW50U3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJaWYgKGphdmFkb2NDb21tZW50U3RhcnQgIT0gLTEpIHsKKwkJaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGphdmFkb2NDb21tZW50U3RhcnQ7CisJfQorCWFzdFN0YWNrW2FzdFB0cl0gPSBpbml0aWFsaXplcjsKKwlpbml0aWFsaXplci5zb3VyY2VFbmQgPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwlpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhlbmRTdGF0ZW1lbnRQb3NpdGlvbik7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCkgeworCS8vIENsYXNzQm9keURlY2xhcmF0aW9ucyA6Oj0gQ2xhc3NCb2R5RGVjbGFyYXRpb25zIENsYXNzQm9keURlY2xhcmF0aW9uCisJY29uY2F0Tm9kZUxpc3RzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCkgeworCS8vIENsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMKKwluZXN0ZWRUeXBlLS0gOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzQm9keW9wdCgpIHsKKwkvLyBDbGFzc0JvZHlvcHQgOjo9ICRlbXB0eQorCXB1c2hPbkFzdFN0YWNrKG51bGwpOworCWVuZFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCkgeworCS8vIENsYXNzRGVjbGFyYXRpb24gOjo9IENsYXNzSGVhZGVyIENsYXNzQm9keQorCisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkvL3RoZXJlIGFyZSBsZW5ndGggZGVjbGFyYXRpb25zCisJCS8vZGlzcGF0Y2ggYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZSBkZWNsYXJhdGlvbnMKKwkJZGlzcGF0Y2hEZWNsYXJhdGlvbkludG8obGVuZ3RoKTsKKwl9CisKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCisJLy8gbWFyayBmaWVsZHMgYW5kIGluaXRpYWxpemVyIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAorCW1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKHR5cGVEZWNsKTsKKworCS8vY29udmVydCBjb25zdHJ1Y3RvciB0aGF0IGRvIG5vdCBoYXZlIHRoZSB0eXBlJ3MgbmFtZSBpbnRvIG1ldGhvZHMKKwlib29sZWFuIGhhc0NvbnN0cnVjdG9yID0gdHlwZURlY2wuY2hlY2tDb25zdHJ1Y3RvcnModGhpcyk7CisJCisJLy9hZGQgdGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2hlbiBuZWVkZWQgKGludGVyZmFjZSBkb24ndCBoYXZlIGl0KQorCWlmICghaGFzQ29uc3RydWN0b3IpIHsKKwkJYm9vbGVhbiBpbnNpZGVGaWVsZEluaXRpYWxpemVyID0gZmFsc2U7CisJCWlmIChkaWV0KSB7CisJCQlmb3IgKGludCBpID0gbmVzdGVkVHlwZTsgaSA+IDA7IGktLSl7CisJCQkJaWYgKHZhcmlhYmxlc0NvdW50ZXJbaV0gPiAwKSB7CisJCQkJCWluc2lkZUZpZWxkSW5pdGlhbGl6ZXIgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJdHlwZURlY2wuY3JlYXRlc0ludGVybmFsQ29uc3RydWN0b3IoIWRpZXQgfHwgaW5zaWRlRmllbGRJbml0aWFsaXplciwgdHJ1ZSk7CisJfQorCisJLy9hbHdheXMgYWRkIDxjbGluaXQ+ICh3aWxsIGJlIHJlbW92ZSBhdCBjb2RlIGdlbiB0aW1lIGlmIGVtcHR5KQorCWlmICh0aGlzLnNjYW5uZXIuY29udGFpbnNBc3NlcnRLZXl3b3JkKSB7CisJCXR5cGVEZWNsLmJpdHMgfD0gQXN0Tm9kZS5BZGRBc3NlcnRpb25NQVNLOworCX0KKwl0eXBlRGVjbC5hZGRDbGluaXQoKTsKKwl0eXBlRGVjbC5ib2R5RW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlcigpIHsKKwkvLyBDbGFzc0hlYWRlciA6Oj0gQ2xhc3NIZWFkZXJOYW1lIENsYXNzSGVhZGVyRXh0ZW5kc29wdCBDbGFzc0hlYWRlckltcGxlbWVudHNvcHQKKworCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CQorCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKSB7IAorCQl0eXBlRGVjbC5ib2R5U3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwl9CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJfQorCS8vIGZsdXNoIHRoZSBjb21tZW50cyByZWxhdGVkIHRvIHRoZSBjbGFzcyBoZWFkZXIKKwlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKSB7CisJLy8gQ2xhc3NIZWFkZXJFeHRlbmRzIDo6PSAnZXh0ZW5kcycgQ2xhc3NUeXBlCisJLy8gVGhlcmUgaXMgYSBjbGFzcyBkZWNsYXJhdGlvbiBvbiB0aGUgdG9wIG9mIHN0YWNrCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwkvL3N1cGVyY2xhc3MKKwl0eXBlRGVjbC5zdXBlcmNsYXNzID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zdXBlcmNsYXNzLnNvdXJjZUVuZCArIDE7CisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWxhc3RDaGVja1BvaW50ID0gdHlwZURlY2wuYm9keVN0YXJ0OworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKSB7CisJLy8gQ2xhc3NIZWFkZXJJbXBsZW1lbnRzIDo6PSAnaW1wbGVtZW50cycgSW50ZXJmYWNlVHlwZUxpc3QKKwlpbnQgbGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dOworCS8vc3VwZXIgaW50ZXJmYWNlcworCWFzdFB0ciAtPSBsZW5ndGg7CisJLy8gVGhlcmUgaXMgYSBjbGFzcyBkZWNsYXJhdGlvbiBvbiB0aGUgdG9wIG9mIHN0YWNrCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlhc3RTdGFjaywgCisJCWFzdFB0ciArIDEsIAorCQl0eXBlRGVjbC5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAKKwkJMCwgCisJCWxlbmd0aCk7IAorCXR5cGVEZWNsLmJvZHlTdGFydCA9IHR5cGVEZWNsLnN1cGVySW50ZXJmYWNlc1tsZW5ndGgtMV0uc291cmNlRW5kICsgMTsKKwlsaXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgYWZ0ZXIgaGF2aW5nIHJlYWQgc3VwZXItaW50ZXJmYWNlcworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsgLy8gaXMgcmVjb3ZlcmluZworCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGVEZWNsLmJvZHlTdGFydDsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCkgeworCS8vIENsYXNzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdjbGFzcycgJ0lkZW50aWZpZXInCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsOworCWlmIChuZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gPT0gMCkgeworCQlpZiAobmVzdGVkVHlwZSAhPSAwKSB7CisJCQl0eXBlRGVjbCA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQl9IGVsc2UgeworCQkJdHlwZURlY2wgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIFJlY29yZCB0aGF0IHRoZSBibG9jayBoYXMgYSBkZWNsYXJhdGlvbiBmb3IgbG9jYWwgdHlwZXMKKwkJdHlwZURlY2wgPSBuZXcgTG9jYWxUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQltYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKTsKKwkJYmxvY2tSZWFsKCk7CisJfQorCisJLy9oaWdobGlnaHQgdGhlIG5hbWUgb2YgdGhlIHR5cGUKKwlsb25nIHBvcyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdOworCXR5cGVEZWNsLnNvdXJjZUVuZCA9IChpbnQpIHBvczsKKwl0eXBlRGVjbC5zb3VyY2VTdGFydCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwl0eXBlRGVjbC5uYW1lID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCisJLy9jb21wdXRlIHRoZSBkZWNsYXJhdGlvbiBzb3VyY2UgdG9vCisJLy8gJ2NsYXNzJyBhbmQgJ2ludGVyZmFjZScgcHVzaCB0d28gaW50IHBvc2l0aW9uczogdGhlIGJlZ2lubmluZyBvZiB0aGUgY2xhc3MgdG9rZW4gYW5kIGl0cyBlbmQuCisJLy8gd2Ugd2FudCB0byBrZWVwIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gYnV0IGdldCByaWQgb2YgdGhlIGVuZCBwb3NpdGlvbgorCS8vIGl0IGlzIG9ubHkgdXNlZCBmb3IgdGhlIENsYXNzTGl0ZXJhbEFjY2VzcyBwb3NpdGlvbnMuCisJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsgCisJaW50UHRyLS07IC8vIHJlbW92ZSB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjbGFzcyB0b2tlbgorCisJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCWlmICh0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwKSB7CisJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9CisJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc291cmNlRW5kICsgMTsKKwlwdXNoT25Bc3RTdGFjayh0eXBlRGVjbCk7CisKKwlsaXN0TGVuZ3RoID0gMDsgLy8gd2lsbCBiZSB1cGRhdGVkIHdoZW4gcmVhZGluZyBzdXBlci1pbnRlcmZhY2VzCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7IAorCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGVEZWNsLmJvZHlTdGFydDsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQodHlwZURlY2wsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24oKSB7CisJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorCWNsYXNzSW5zdGFuY2VDcmVhdGlvbihmYWxzZSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUoKSB7CisJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgOjo9IE5hbWUgJy4nCisJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSB7CisJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKwkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorCisJY2xhc3NJbnN0YW5jZUNyZWF0aW9uKHRydWUpOyAvLyAgPC0tIHB1c2ggdGhlIFF1YWxpZmVkLi4uLgorCisJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIHFhZSA9IAorCQkoUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dOyAKKwlxYWUuZW5jbG9zaW5nSW5zdGFuY2UgPSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gcWFlOworCXFhZS5zb3VyY2VTdGFydCA9IHFhZS5lbmNsb3NpbmdJbnN0YW5jZS5zb3VyY2VTdGFydDsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc1R5cGVFbHQoKSB7CisJLy8gQ2xhc3NUeXBlRWx0IDo6PSBDbGFzc1R5cGUKKwlwdXNoT25Bc3RTdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsKKwkvKiBpZiBpbmNvbXBsZXRlIHRocm93biBleGNlcHRpb24gbGlzdCwgbGlzdExlbmd0aCBjb3VudGVyIHdpbGwgbm90IGhhdmUgYmVlbiByZXNldCwKKwkJaW5kaWNhdGluZyB0aGF0IHNvbWUgaXRlbXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3RhY2sgKi8KKwlsaXN0TGVuZ3RoKys7IAkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc1R5cGVMaXN0KCkgeworCS8vIENsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgJywnIENsYXNzVHlwZUVsdAorCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkvLyBDb21waWxhdGlvblVuaXQgOjo9IEVudGVyQ29tcGlsYXRpb25Vbml0IFBhY2thZ2VEZWNsYXJhdGlvbm9wdCBJbXBvcnREZWNsYXJhdGlvbnNvcHQKKwkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25kaXRpb25hbEV4cHJlc3Npb24oaW50IG9wKSB7CisJLy8gQ29uZGl0aW9uYWxFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiAnPycgRXhwcmVzc2lvbiAnOicgQ29uZGl0aW9uYWxFeHByZXNzaW9uCisJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKKworCWV4cHJlc3Npb25QdHIgLT0gMjsKKwlleHByZXNzaW9uTGVuZ3RoUHRyIC09IDI7CisJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0KKwkJbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbigKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSwKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyICsgMV0sCisJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ciArIDJdKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50cygpIHsKKwkvLyBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gQmxvY2tTdGF0ZW1lbnRzICd9JworCWNvbmNhdE5vZGVMaXN0cygpOyAvLyBleHBsaWN0bHkgYWRkIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW50byB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzIAorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpIHsKKwkvLyBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAgJ3snIEJsb2NrU3RhdGVtZW50c29wdCAnfScKKwkvLyBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAgJ3snIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uICd9JworCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSAtLTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworCS8vIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIENvbnN0cnVjdG9yQm9keQorCisJLyoKKwlhc3RTdGFjayA6IE1ldGhvZERlY2xhcmF0aW9uIHN0YXRlbWVudHMKKwlpZGVudGlmaWVyU3RhY2sgOiBuYW1lCisJID09PgorCWFzdFN0YWNrIDogTWV0aG9kRGVjbGFyYXRpb24KKwlpZGVudGlmaWVyU3RhY2sgOgorCSovCisKKwkvL211c3QgcHJvdmlkZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgY2FsbCB3aGVuIG5lZWRlZAorCisJaW50IGxlbmd0aDsKKworCS8vIHBvcCB0aGUgcG9zaXRpb24gb2YgdGhlIHsgIChib2R5IG9mIHRoZSBtZXRob2QpIHB1c2hlZCBpbiBibG9jayBkZWNsCisJaW50UHRyLS07CisKKwkvL3N0YXRlbWVudHMKKwlyZWFsQmxvY2tQdHItLTsKKwlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwgPSBudWxsOworCVN0YXRlbWVudFtdIHN0YXRlbWVudHMgPSBudWxsOworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWFzdFB0ciAtPSBsZW5ndGg7CisJCWlmIChhc3RTdGFja1thc3RQdHIgKyAxXSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB7CisJCQkvL2F2b2lkIGEgaXNTb21lVGhpbmcgdGhhdCB3b3VsZCBvbmx5IGJlIHVzZWQgaGVyZSBCVVQgd2hhdCBpcyBmYXN0ZXIgYmV0d2VlbiB0d28gYWx0ZXJuYXRpdmVzID8KKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYXN0U3RhY2ssIAorCQkJCWFzdFB0ciArIDIsIAorCQkJCXN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aCAtIDFdLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGggLSAxKTsgCisJCQljb25zdHJ1Y3RvckNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGFzdFN0YWNrW2FzdFB0ciArIDFdOworCQl9IGVsc2UgeyAvL25lZWQgdG8gYWRkIGV4cGxpY2l0bHkgdGhlIHN1cGVyKCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWFzdFN0YWNrLCAKKwkJCQlhc3RQdHIgKyAxLCAKKwkJCQlzdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGgpOyAKKwkJCWNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZGlldCl7CisJCQkvLyBhZGQgaXQgb25seSBpbiBub24tZGlldCBtb2RlLCBpZiBkaWV0X2JvZGllcywgdGhlbiBjb25zdHJ1Y3RvciBjYWxsIHdpbGwgYmUgYWRkZWQgZWxzZXdoZXJlLgorCQkJY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOworCQl9CisJfQorCisJLy8gbm93IHdlIGtub3cgdGhhdCB0aGUgdG9wIG9mIHN0YWNrIGlzIGEgY29uc3RydWN0b3JEZWNsYXJhdGlvbgorCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwljZC5jb25zdHJ1Y3RvckNhbGwgPSBjb25zdHJ1Y3RvckNhbGw7CisJY2Quc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7CisKKwkvL2hpZ2hsaWdodCBvZiB0aGUgaW1wbGljaXQgY2FsbCBvbiB0aGUgbWV0aG9kIG5hbWUKKwlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwgJiYgY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9PSAwKSB7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSBjZC5zb3VyY2VFbmQ7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IGNkLnNvdXJjZVN0YXJ0OworCX0KKworCS8vd2F0Y2ggZm9yIH0gdGhhdCBjb3VsZCBiZSBnaXZlbiBhcyBhIHVuaWNvZGUgISAoIHUwMDdEIGlzICd9JyApCisJLy8gc3RvcmUgdGhlIGVuZFBvc2l0aW9uIChwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgJ30nKSBpbiBjYXNlIHRoZXJlIGlzCisJLy8gYSB0cmFpbGluZyBjb21tZW50IGJlaGluZCB0aGUgZW5kIG9mIHRoZSBtZXRob2QKKwljZC5ib2R5RW5kID0gZW5kUG9zaXRpb247CisJY2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworCS8vIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyICc7JworCS8vIG5vdyB3ZSBrbm93IHRoYXQgdGhlIHRvcCBvZiBzdGFjayBpcyBhIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24KKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisKKwljZC5ib2R5RW5kID0gZW5kUG9zaXRpb247IC8vIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSB0cmFpbGluZyBzZW1pLWNvbG9uCisJY2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwkvLyByZXBvcnQgdGhlIHByb2JsZW0gYW5kIGNvbnRpbnVlIHRoZSBwYXJzaW5nIC0gbmFycm93aW5nIHRoZSBwcm9ibGVtIG9udG8gdGhlIG1ldGhvZAorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCkgeworCS8vIENvbnN0cnVjdG9ySGVhZGVyIDo6PSBDb25zdHJ1Y3RvckhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQKKworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pYXN0U3RhY2tbYXN0UHRyXTsKKworCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsgCisJCW1ldGhvZC5ib2R5U3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwl9CisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KKwl9CQkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKSB7CisKKwkvKiByZWNvdmVyaW5nIC0gbWlnaHQgYmUgYW4gZW1wdHkgbWVzc2FnZSBzZW5kICovCisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQlpZiAobGFzdElnbm9yZWRUb2tlbiA9PSBUb2tlbk5hbWVuZXcpeyAvLyB3YXMgYW4gYWxsb2NhdGlvbiBleHByZXNzaW9uCisJCQlsYXN0Q2hlY2tQb2ludCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsgLy8gZm9yY2UgdG8gcmVzdGFydCBhdCB0aGlzIGV4YWN0IHBvc2l0aW9uCQkJCQorCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwkvLyBDb25zdHJ1Y3RvckhlYWRlck5hbWUgOjo9ICBNb2RpZmllcnNvcHQgJ0lkZW50aWZpZXInICcoJworCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisKKwkvL25hbWUgLS0gdGhpcyBpcyBub3QgcmVhbGx5IHJldmVsYW50IGJ1dCB3ZSBkbyAuLi4uLgorCWNkLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgc2VsZWN0b3JTb3VyY2UgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vbW9kaWZpZXJzCisJY2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwljZC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvL2hpZ2hsaWdodCBzdGFydHMgYXQgdGhlIHNlbGVjdG9yIHN0YXJ0cworCWNkLnNvdXJjZVN0YXJ0ID0gKGludCkgKHNlbGVjdG9yU291cmNlID4+PiAzMik7CisJcHVzaE9uQXN0U3RhY2soY2QpOworCWNkLnNvdXJjZUVuZCA9IGxQYXJlblBvczsKKwljZC5ib2R5U3RhcnQgPSBsUGFyZW5Qb3MrMTsKKwlsaXN0TGVuZ3RoID0gMDsgLy8gaW5pdGlhbGl6ZSBsaXN0TGVuZ3RoIGJlZm9yZSByZWFkaW5nIHBhcmFtZXRlcnMvdGhyb3dzCisKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSBjZC5ib2R5U3RhcnQ7CisJCWlmICgoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlICYmIGxhc3RJZ25vcmVkVG9rZW4gIT0gVG9rZW5OYW1lRE9UKQorCQkJfHwgY2QubW9kaWZpZXJzICE9IDApeworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoY2QsIDApOworCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQl9CisJfQkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVEZWZhdWx0TGFiZWwoKSB7CisJLy8gU3dpdGNoTGFiZWwgOjo9ICdkZWZhdWx0JyAnOicKKwlwdXNoT25Bc3RTdGFjayhuZXcgRGVmYXVsdENhc2UoaW50U3RhY2tbaW50UHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCkgeworCWNoZWNrQW5ub3RhdGlvbigpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAorCXB1c2hPbkludFN0YWNrKG1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCXB1c2hPbkludFN0YWNrKAorCQltb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwID8gbW9kaWZpZXJzU291cmNlU3RhcnQgOiBzY2FubmVyLnN0YXJ0UG9zaXRpb24pOyAKKwlyZXNldE1vZGlmaWVycygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZURpZXQoKSB7CisJLy8gRGlldCA6Oj0gJGVtcHR5CisJY2hlY2tBbm5vdGF0aW9uKCk7CisJcHVzaE9uSW50U3RhY2sobW9kaWZpZXJzU291cmNlU3RhcnQpOyAvLyBwdXNoIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBhIGphdmFkb2MgY29tbWVudCBpZiB0aGVyZSBpcyBvbmUKKwlqdW1wT3Zlck1ldGhvZEJvZHkoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVEaW1zKCkgeworCS8vIERpbXMgOjo9IERpbXNMb29wCisJcHVzaE9uSW50U3RhY2soZGltZW5zaW9ucyk7CisJZGltZW5zaW9ucyA9IDA7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHIoKSB7CisJLy8gRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9ICdbJyAnXScKKwlwdXNoT25FeHByZXNzaW9uU3RhY2sobnVsbCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHJzKCkgeworCS8vIERpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByCisJY29uY2F0RXhwcmVzc2lvbkxpc3RzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKSB7CisJLy8gQXJndW1lbnRMaXN0b3B0IDo6PSAkZW1wdHkKKwlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXIoKSB7CisJLy8gQXJyYXlJbml0aWFsaXplciA6Oj0gJ3snICxvcHQgJ30nCisJYXJyYXlJbml0aWFsaXplcigwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXJvcHQoKSB7CisJLy8gQXJyYXlJbml0aWFsaXplcm9wdCA6Oj0gJGVtcHR5CisJcHVzaE9uRXhwcmVzc2lvblN0YWNrTGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlCbG9ja1N0YXRlbWVudHNvcHQoKSB7CisJLy8gQmxvY2tTdGF0ZW1lbnRzb3B0IDo6PSAkZW1wdHkKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUNhdGNoZXNvcHQoKSB7CisJLy8gQ2F0Y2hlc29wdCA6Oj0gJGVtcHR5CisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKSB7CisJLy8gQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSAkZW1wdHkKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUNsYXNzTWVtYmVyRGVjbGFyYXRpb24oKSB7CisJLy8gQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gJzsnCisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlEaW1zb3B0KCkgeworCS8vIERpbXNvcHQgOjo9ICRlbXB0eQorCXB1c2hPbkludFN0YWNrKDApOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5RXhwcmVzc2lvbigpIHsKKwkvLyBFeHByZXNzaW9ub3B0IDo6PSAkZW1wdHkKKwlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUZvckluaXRvcHQoKSB7CisJLy8gRm9ySW5pdG9wdCA6Oj0gJGVtcHR5CisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKSB7CisJLy8gRm9yVXBkYXRlb3B0IDo6PSAkZW1wdHkKKwlwdXNoT25FeHByZXNzaW9uU3RhY2tMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpIHsKKwkvLyBJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorCXB1c2hPbkFzdExlbmd0aFN0YWNrKDApOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24oKSB7CisJLy8gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9ICc7JworCXB1c2hPbkFzdExlbmd0aFN0YWNrKDApOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCkgeworCS8vIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRW1wdHlTdGF0ZW1lbnQoKSB7CisJLy8gRW1wdHlTdGF0ZW1lbnQgOjo9ICc7JworCWlmICh0aGlzLnNjYW5uZXIuc291cmNlW2VuZFN0YXRlbWVudFBvc2l0aW9uXSA9PSAnOycpIHsKKwkJcHVzaE9uQXN0U3RhY2sobmV3IEVtcHR5U3RhdGVtZW50KGVuZFN0YXRlbWVudFBvc2l0aW9uLCBlbmRTdGF0ZW1lbnRQb3NpdGlvbikpOworCX0gZWxzZSB7CisJCS8vIHdlIGhhdmUgYSBVbmljb2RlIGZvciB0aGUgJzsnICgvdTAwM0IpCisJCXB1c2hPbkFzdFN0YWNrKG5ldyBFbXB0eVN0YXRlbWVudChlbmRTdGF0ZW1lbnRQb3NpdGlvbiAtIDUsIGVuZFN0YXRlbWVudFBvc2l0aW9uKSk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5U3dpdGNoQmxvY2soKSB7CisJLy8gU3dpdGNoQmxvY2sgOjo9ICd7JyAnfScKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpIHsKKwkvLyBUeXBlRGVjbGFyYXRpb24gOjo9ICc7JyAKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbnNvcHQoKSB7CisJLy8gVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7IAorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgeworCS8vIEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSAkZW1wdHkKKwlRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvYzsKKwlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlID0gCisJCW5ldyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7IAorCWFsbG9jID0gCisJCWFub255bW91c1R5cGUuYWxsb2NhdGlvbiA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsgCisJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJcHVzaE9uQXN0U3RhY2soYW5vbnltb3VzVHlwZSk7CisKKwlhbGxvYy5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7IC8vdGhlIHBvc2l0aW9uIGhhcyBiZWVuIHN0b3JlZCBleHBsaWNpdGx5CisJaW50IGFyZ3VtZW50TGVuZ3RoOworCWlmICgoYXJndW1lbnRMZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQlleHByZXNzaW9uUHRyIC09IGFyZ3VtZW50TGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJZXhwcmVzc2lvblN0YWNrLCAKKwkJCWV4cHJlc3Npb25QdHIgKyAxLCAKKwkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2FyZ3VtZW50TGVuZ3RoXSwgCisJCQkwLCAKKwkJCWFyZ3VtZW50TGVuZ3RoKTsgCisJfQorCWFsbG9jLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCisJYW5vbnltb3VzVHlwZS5zb3VyY2VFbmQgPSBhbGxvYy5zb3VyY2VFbmQ7CisJLy9wb3NpdGlvbiBhdCB0aGUgdHlwZSB3aGlsZSBpdCBpbXBhY3RzIHRoZSBhbm9ueW1vdXMgZGVjbGFyYXRpb24KKwlhbm9ueW1vdXNUeXBlLnNvdXJjZVN0YXJ0ID0gYW5vbnltb3VzVHlwZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gYWxsb2MudHlwZS5zb3VyY2VTdGFydDsKKwlhbGxvYy5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soYWxsb2MpOworCisJYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCisJbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKKwkJbGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKKwkJLy8gdGhlIHJlY292ZXJ5VG9rZW5DaGVjayB3aWxsIGRlYWwgd2l0aCB0aGUgb3BlbiBicmFjZQkJCisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOworCQljdXJyZW50VG9rZW4gPSAwOyAvLyBvcGVuaW5nIGJyYWNlIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwl9CQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQ29tcGlsYXRpb25Vbml0KCkgeworCS8vIEVudGVyQ29tcGlsYXRpb25Vbml0IDo6PSAkZW1wdHkKKwkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFbnRlclZhcmlhYmxlKCkgeworCS8vIEVudGVyVmFyaWFibGUgOjo9ICRlbXB0eQorCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorCisJY2hhcltdIG5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJbG9uZyBuYW1lUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXTsKKwlpbnQgZXh0ZW5kZWREaW1lbnNpb24gPSBpbnRTdGFja1tpbnRQdHItLV07CisJQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOworCS8vIGNyZWF0ZSB0aGUgYXN0IG5vZGUKKwlib29sZWFuIGlzTG9jYWxEZWNsYXJhdGlvbiA9IG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSAhPSAwOyAKKwlpZiAoaXNMb2NhbERlY2xhcmF0aW9uKSB7CisJCS8vIGNyZWF0ZSB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zCisJCWRlY2xhcmF0aW9uID0gCisJCQl0aGlzLmNyZWF0ZUxvY2FsRGVjbGFyYXRpb24obnVsbCwgbmFtZSwgKGludCkgKG5hbWVQb3NpdGlvbiA+Pj4gMzIpLCAoaW50KSBuYW1lUG9zaXRpb24pOworCX0gZWxzZSB7CisJCS8vIGNyZWF0ZSB0aGUgZmllbGQgZGVjbGFyYXRpb24KKwkJZGVjbGFyYXRpb24gPSAKKwkJCXRoaXMuY3JlYXRlRmllbGREZWNsYXJhdGlvbihudWxsLCBuYW1lLCAoaW50KSAobmFtZVBvc2l0aW9uID4+PiAzMiksIChpbnQpIG5hbWVQb3NpdGlvbik7IAorCX0KKwkKKwlpZGVudGlmaWVyUHRyLS07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCVR5cGVSZWZlcmVuY2UgdHlwZTsKKwlpbnQgdmFyaWFibGVJbmRleCA9IHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV07CisJaW50IHR5cGVEaW0gPSAwOworCWlmICh2YXJpYWJsZUluZGV4ID09IDApIHsKKwkJLy8gZmlyc3QgdmFyaWFibGUgb2YgdGhlIGRlY2xhcmF0aW9uIChGaWVsZERlY2xhcmF0aW9uIG9yIExvY2FsRGVjbGFyYXRpb24pCisJCWlmIChpc0xvY2FsRGVjbGFyYXRpb24pIHsKKwkJCWRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQlkZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQl0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSh0eXBlRGltID0gaW50U3RhY2tbaW50UHRyLS1dKTsgLy8gdHlwZSBkaW1lbnNpb24KKwkJCWlmIChkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IC0xKSB7CisJCQkJLy8gdGhpcyBpcyB0cnVlIGlmIHRoZXJlIGlzIG5vIG1vZGlmaWVycyBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uCisJCQkJZGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHR5cGUuc291cmNlU3RhcnQ7CisJCQl9CisJCQlwdXNoT25Bc3RTdGFjayh0eXBlKTsKKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKHR5cGVEaW0gPSBpbnRTdGFja1tpbnRQdHItLV0pOyAvLyB0eXBlIGRpbWVuc2lvbgorCQkJcHVzaE9uQXN0U3RhY2sodHlwZSk7CisJCQlkZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCQl9CisJfSBlbHNlIHsKKwkJdHlwZSA9IChUeXBlUmVmZXJlbmNlKSBhc3RTdGFja1thc3RQdHIgLSB2YXJpYWJsZUluZGV4XTsKKwkJdHlwZURpbSA9IHR5cGUuZGltZW5zaW9ucygpOworCQlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gcHJldmlvdXNWYXJpYWJsZSA9IAorCQkJKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsgCisJCWRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBwcmV2aW91c1ZhcmlhYmxlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCWRlY2xhcmF0aW9uLm1vZGlmaWVycyA9IHByZXZpb3VzVmFyaWFibGUubW9kaWZpZXJzOworCX0KKworCWlmIChleHRlbmRlZERpbWVuc2lvbiA9PSAwKSB7CisJCWRlY2xhcmF0aW9uLnR5cGUgPSB0eXBlOworCX0gZWxzZSB7CisJCWludCBkaW1lbnNpb24gPSB0eXBlRGltICsgZXh0ZW5kZWREaW1lbnNpb247CisJCS8vb24gdGhlIGlkZW50aWZpZXJMZW5ndGhTdGFjayB0aGVyZSBpcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUuLi4uCisJCWludCBiYXNlVHlwZTsKKwkJaWYgKChiYXNlVHlwZSA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyICsgMV0pIDwgMCkgeworCQkJLy9pdCB3YXMgYSBiYXNlVHlwZQorCQkJaW50IHR5cGVTb3VyY2VTdGFydCA9IHR5cGUuc291cmNlU3RhcnQ7CisJCQlpbnQgdHlwZVNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOworCQkJdHlwZSA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWJhc2VUeXBlLCBkaW1lbnNpb24pOworCQkJdHlwZS5zb3VyY2VTdGFydCA9IHR5cGVTb3VyY2VTdGFydDsKKwkJCXR5cGUuc291cmNlRW5kID0gdHlwZVNvdXJjZUVuZDsKKwkJCWRlY2xhcmF0aW9uLnR5cGUgPSB0eXBlOworCQl9IGVsc2UgeworCQkJZGVjbGFyYXRpb24udHlwZSA9IHRoaXMuY29weURpbXModHlwZSwgZGltZW5zaW9uKTsKKwkJfQorCX0KKwl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdKys7CisJcHVzaE9uQXN0U3RhY2soZGVjbGFyYXRpb24pOworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJaWYgKCEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKQorCQkJJiYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVET1QKKwkJCQkvL3x8IGRlY2xhcmF0aW9uLm1vZGlmaWVycyAhPSAwCisJCQkJfHwgKHNjYW5uZXIuZ2V0TGluZU51bWJlcihkZWNsYXJhdGlvbi50eXBlLnNvdXJjZVN0YXJ0KQorCQkJCQkJIT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKSkpKSl7CisJCQlsYXN0Q2hlY2tQb2ludCA9IChpbnQpIChuYW1lUG9zaXRpb24gPj4+IDMyKTsKKwkJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbil7CisJCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbCA9IChMb2NhbERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCQkJbGFzdENoZWNrUG9pbnQgPSBsb2NhbERlY2wuc291cmNlRW5kICsgMTsKKwkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGxvY2FsRGVjbCwgMCk7CisJCX0gZWxzZSB7CisJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IChGaWVsZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCQkJbGFzdENoZWNrUG9pbnQgPSBmaWVsZERlY2wuc291cmNlRW5kICsgMTsKKwkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGZpZWxkRGVjbCwgMCk7CisJCX0KKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oaW50IG9wKSB7CisJLy8gRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gJz09JyBSZWxhdGlvbmFsRXhwcmVzc2lvbgorCS8vIEVxdWFsaXR5RXhwcmVzc2lvbiA6Oj0gRXF1YWxpdHlFeHByZXNzaW9uICchPScgUmVsYXRpb25hbEV4cHJlc3Npb24KKworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwlleHByZXNzaW9uUHRyLS07CisJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9CisJCW5ldyBFcXVhbEV4cHJlc3Npb24oCisJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0sCisJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ciArIDFdLAorCQkJb3ApOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpIHsKKwkvLyBFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24gOjo9ICRlbXB0eQorCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGVEZWNsID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwl2YXJpYWJsZURlY2wuaW5pdGlhbGl6YXRpb24gPSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXTsKKwkvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGVjbGFyYXRpb25Tb3VyY2VFbmQgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIHRoZQorCS8vIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24KKwl2YXJpYWJsZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB2YXJpYWJsZURlY2wuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOworCXZhcmlhYmxlRGVjbC5kZWNsYXJhdGlvbkVuZCA9IHZhcmlhYmxlRGVjbC5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCkgeworCS8vIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaW50IGZsYWcsIGludCByZWNGbGFnKSB7CisKKwkvKiBmbGFnIGFsbG93cyB0byBkaXN0aW5ndWlzaCAzIGNhc2VzIDoKKwkoMCkgOiAgIAorCUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAndGhpcycgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisJRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9ICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisJKDEpIDoKKwlFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3N1cGVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKKwlFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworCSgyKSA6CisJRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisJRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICd0aGlzJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKKwkqLworCWludCBzdGFydFBvc2l0aW9uID0gaW50U3RhY2tbaW50UHRyLS1dOworCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGVjYyA9IG5ldyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChyZWNGbGFnKTsKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoZXhwcmVzc2lvblN0YWNrLCBleHByZXNzaW9uUHRyICsgMSwgZWNjLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJfQorCXN3aXRjaCAoZmxhZykgeworCQljYXNlIDAgOgorCQkJZWNjLnNvdXJjZVN0YXJ0ID0gc3RhcnRQb3NpdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCQkJZWNjLnNvdXJjZVN0YXJ0ID0gKGVjYy5xdWFsaWZpY2F0aW9uID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0pLnNvdXJjZVN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisJCQllY2Muc291cmNlU3RhcnQgPSAoZWNjLnF1YWxpZmljYXRpb24gPSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpKS5zb3VyY2VTdGFydDsKKwkJCWJyZWFrOworCX07CisJcHVzaE9uQXN0U3RhY2soZWNjKTsKKwllY2Muc291cmNlRW5kID0gZW5kUG9zaXRpb247Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpIHsKKwkvLyBFeHByZXNzaW9uU3RhdGVtZW50IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uICc7JworCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlwdXNoT25Bc3RTdGFjayhleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRmllbGRBY2Nlc3MoYm9vbGVhbiBpc1N1cGVyQWNjZXNzKSB7CisJLy8gRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJworCS8vIEZpZWxkQWNjZXNzIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicKKworCUZpZWxkUmVmZXJlbmNlIGZyID0KKwkJbmV3IEZpZWxkUmVmZXJlbmNlKAorCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLAorCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXSk7CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCWlmIChpc1N1cGVyQWNjZXNzKSB7CisJCS8vY29uc2lkZXJhdGVzIHRoZSBmaWVsZFJlZmVyZW5jZSBiZWdpbm5pbmcgYXQgdGhlICdzdXBlcicgLi4uLgkKKwkJZnIuc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCWZyLnJlY2VpdmVyID0gbmV3IFN1cGVyUmVmZXJlbmNlKGZyLnNvdXJjZVN0YXJ0LCBlbmRQb3NpdGlvbik7CisJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhmcik7CisJfSBlbHNlIHsKKwkJLy9vcHRpbWl6ZSBwdXNoL3BvcAorCQlpZiAoKGZyLnJlY2VpdmVyID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKS5pc1RoaXMoKSkgeworCQkJLy9maWVsZHJlZmVyZW5jZSBiZWdpbnMgYXQgdGhlIHRoaXMKKwkJCWZyLnNvdXJjZVN0YXJ0ID0gZnIucmVjZWl2ZXIuc291cmNlU3RhcnQ7CisJCX0KKwkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gZnI7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKSB7CisJLy8gU2VlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25EZWZhdWx0TW9kaWZpZXIoKSBpbiBjYXNlIG9mIGNoYW5nZTogZHVwbGljYXRlZCBjb2RlCisJLy8gRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKKworCS8qCisJYXN0U3RhY2sgOiAKKwlleHByZXNzaW9uU3RhY2s6IEV4cHJlc3Npb24gRXhwcmVzc2lvbiAuLi4uLi4gRXhwcmVzc2lvbgorCWlkZW50aWZpZXJTdGFjayA6IHR5cGUgIGlkZW50aWZpZXIgaWRlbnRpZmllciAuLi4uLi4gaWRlbnRpZmllcgorCWludFN0YWNrIDogdHlwZURpbSAgICAgIGRpbSAgICAgICAgZGltICAgICAgICAgICAgICAgZGltCisJID09PgorCWFzdFN0YWNrIDogRmllbGREZWNsYXJhdGlvbiBGaWVsZERlY2xhcmF0aW9uIC4uLi4uLiBGaWVsZERlY2xhcmF0aW9uCisJZXhwcmVzc2lvblN0YWNrIDoKKwlpZGVudGlmaWVyU3RhY2sgOiAKKwlpbnRTdGFjayA6IAorCSAgCisJKi8KKwlpbnQgdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIgPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHJdOworCisJZm9yIChpbnQgaSA9IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0ciAtIGldOworCQlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247IAorCQlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CS8vIHNlbWktY29sb24gaW5jbHVkZWQKKwl9CisJdXBkYXRlU291cmNlRGVjbGFyYXRpb25QYXJ0cyh2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlcik7CisJaW50IGVuZFBvcyA9IGZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhlbmRTdGF0ZW1lbnRQb3NpdGlvbik7CisJaWYgKGVuZFBvcyAhPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbikgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyOyBpKyspIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHIgLSBpXTsKKwkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBlbmRQb3M7CisJCX0KKwl9CisJLy8gdXBkYXRlIHRoZSBhc3RTdGFjaywgYXN0UHRyIGFuZCBhc3RMZW5ndGhTdGFjaworCWludCBzdGFydEluZGV4ID0gYXN0UHRyIC0gdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSArIDE7CisJU3lzdGVtLmFycmF5Y29weSgKKwkJYXN0U3RhY2ssIAorCQlzdGFydEluZGV4LCAKKwkJYXN0U3RhY2ssIAorCQlzdGFydEluZGV4IC0gMSwgCisJCXZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyKTsgCisJYXN0UHRyLS07IC8vIHJlbW92ZSB0aGUgdHlwZSByZWZlcmVuY2UKKwlhc3RMZW5ndGhTdGFja1stLWFzdExlbmd0aFB0cl0gPSB2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlcjsKKworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJbGFzdENoZWNrUG9pbnQgPSBlbmRQb3MgKyAxOworCQlpZiAoY3VycmVudEVsZW1lbnQucGFyZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCl7CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudDsKKwkJfQorCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOworCX0KKwl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdID0gMDsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JjZU5vRGlldCgpIHsKKwkvLyBGb3JjZU5vRGlldCA6Oj0gJGVtcHR5CisJZGlldEludCsrOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvckluaXQoKSB7CisJLy8gRm9ySW5pdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygtMSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRm9ybWFsUGFyYW1ldGVyKCkgeworCS8vIEZvcm1hbFBhcmFtZXRlciA6Oj0gVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCA9PT4gZmFsc2UKKwkvLyBGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVycyBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkID09PiB0cnVlCisJLyoKKwlhc3RTdGFjayA6IAorCWlkZW50aWZpZXJTdGFjayA6IHR5cGUgaWRlbnRpZmllcgorCWludFN0YWNrIDogZGltIGRpbQorCSA9PT4KKwlhc3RTdGFjayA6IEFyZ3VtZW50CisJaWRlbnRpZmllclN0YWNrIDogIAorCWludFN0YWNrIDogIAorCSovCisKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJY2hhcltdIG5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl07CisJbG9uZyBuYW1lUG9zaXRpb25zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlUeXBlUmVmZXJlbmNlIHR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSArIGludFN0YWNrW2ludFB0ci0tXSk7CisJaW50IG1vZGlmaWVyUG9zaXRpb25zID0gaW50U3RhY2tbaW50UHRyLS1dOworCWludFB0ci0tOworCUFyZ3VtZW50IGFyZyA9IAorCQluZXcgQXJndW1lbnQoCisJCQluYW1lLCAKKwkJCW5hbWVQb3NpdGlvbnMsIAorCQkJdHlwZSwgCisJCQlpbnRTdGFja1tpbnRQdHIgKyAxXSAmIH5BY2NEZXByZWNhdGVkKTsgLy8gbW9kaWZpZXJzCisJYXJnLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBtb2RpZmllclBvc2l0aW9uczsKKwlwdXNoT25Bc3RTdGFjayhhcmcpOworCisJLyogaWYgaW5jb21wbGV0ZSBtZXRob2QgaGVhZGVyLCBsaXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAorCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3RhY2sgKi8KKwlsaXN0TGVuZ3RoKys7IAkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0KCkgeworCS8vIEZvcm1hbFBhcmFtZXRlckxpc3QgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3QgJywnIEZvcm1hbFBhcmFtZXRlcgorCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3RvcHQoKSB7CisJLy8gRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCA6Oj0gJGVtcHR5CisJcHVzaE9uQXN0TGVuZ3RoU3RhY2soMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zKCkgeworCS8vIEltcG9ydERlY2xhcmF0aW9ucyA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIEltcG9ydERlY2xhcmF0aW9uIAorCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUltcG9ydERlY2xhcmF0aW9uc29wdCgpIHsKKwkvLyBJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9IEltcG9ydERlY2xhcmF0aW9ucworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pICE9IDApIHsKKwkJYXN0UHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWFzdFN0YWNrLAorCQkJYXN0UHRyICsgMSwKKwkJCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzID0gbmV3IEltcG9ydFJlZmVyZW5jZVtsZW5ndGhdLAorCQkJMCwKKwkJCWxlbmd0aCk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKGludCBvcCkgeworCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnaW5zdGFuY2VvZicgUmVmZXJlbmNlVHlwZQorCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwkvL2J5IGNvbnN0cnVjdGlvbiwgbm8gYmFzZSB0eXBlIG1heSBiZSB1c2VkIGluIGdldFR5cGVSZWZlcmVuY2UKKwlFeHByZXNzaW9uIGV4cDsKKwlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBleHAgPQorCQluZXcgSW5zdGFuY2VPZkV4cHJlc3Npb24oCisJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0sCisJCQlnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSksCisJCQlvcCk7CisJaWYgKGV4cC5zb3VyY2VFbmQgPT0gMCkgeworCQkvL2FycmF5IG9uIGJhc2UgdHlwZS4uLi4KKwkJZXhwLnNvdXJjZUVuZCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CisJfQorCS8vdGhlIHNjYW5uZXIgaXMgb24gdGhlIG5leHQgdG9rZW4gYWxyZWFkeS4uLi4KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKKwkvLyBzZWUgY29uc3VtZUNsYXNzRGVjbGFyYXRpb24gaW4gY2FzZSBvZiBjaGFuZ2VzOiBkdXBsaWNhdGVkIGNvZGUKKwkvLyBJbnRlcmZhY2VEZWNsYXJhdGlvbiA6Oj0gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCS8vdGhlcmUgYXJlIGxlbmd0aCBkZWNsYXJhdGlvbnMKKwkJLy9kaXNwYXRjaC4uLi4uYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZSBkZWNsYXJhdGlvbnMKKwkJZGlzcGF0Y2hEZWNsYXJhdGlvbkludG8obGVuZ3RoKTsKKwl9CisKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCQorCS8vIG1hcmsgZmllbGRzIGFuZCBpbml0aWFsaXplciB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKKwltYXJrRmllbGRzV2l0aExvY2FsVHlwZSh0eXBlRGVjbCk7CisKKwkvL2NvbnZlcnQgY29uc3RydWN0b3IgdGhhdCBkbyBub3QgaGF2ZSB0aGUgdHlwZSdzIG5hbWUgaW50byBtZXRob2RzCisJdHlwZURlY2wuY2hlY2tDb25zdHJ1Y3RvcnModGhpcyk7CisJCisJLy9hbHdheXMgYWRkIDxjbGluaXQ+ICh3aWxsIGJlIHJlbW92ZSBhdCBjb2RlIGdlbiB0aW1lIGlmIGVtcHR5KQorCWlmICh0aGlzLnNjYW5uZXIuY29udGFpbnNBc3NlcnRLZXl3b3JkKSB7CisJCXR5cGVEZWNsLmJpdHMgfD0gQXN0Tm9kZS5BZGRBc3NlcnRpb25NQVNLOworCX0KKwl0eXBlRGVjbC5hZGRDbGluaXQoKTsKKwl0eXBlRGVjbC5ib2R5RW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKSB7CisJLy8gSW50ZXJmYWNlSGVhZGVyIDo6PSBJbnRlcmZhY2VIZWFkZXJOYW1lIEludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQKKworCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CQorCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsgCisJCXR5cGVEZWNsLmJvZHlTdGFydCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCX0KKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCX0KKwkvLyBmbHVzaCB0aGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgaW50ZXJmYWNlIGhlYWRlcgorCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOwkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJFeHRlbmRzKCkgeworCS8vIEludGVyZmFjZUhlYWRlckV4dGVuZHMgOjo9ICdleHRlbmRzJyBJbnRlcmZhY2VUeXBlTGlzdAorCWludCBsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV07CisJLy9zdXBlciBpbnRlcmZhY2VzCisJYXN0UHRyIC09IGxlbmd0aDsKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCVN5c3RlbS5hcnJheWNvcHkoCisJCWFzdFN0YWNrLCAKKwkJYXN0UHRyICsgMSwgCisJCXR5cGVEZWNsLnN1cGVySW50ZXJmYWNlcyA9IG5ldyBUeXBlUmVmZXJlbmNlW2xlbmd0aF0sIAorCQkwLCAKKwkJbGVuZ3RoKTsgCisJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VzW2xlbmd0aC0xXS5zb3VyY2VFbmQgKyAxOwkJCisJbGlzdExlbmd0aCA9IDA7IC8vIHJlc2V0IGFmdGVyIGhhdmluZyByZWFkIHN1cGVyLWludGVyZmFjZXMJCQorCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsgCisJCWxhc3RDaGVja1BvaW50ID0gdHlwZURlY2wuYm9keVN0YXJ0OworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCkgeworCS8vIEludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w7CisJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSA9PSAwKSB7CisJCWlmIChuZXN0ZWRUeXBlICE9IDApIHsKKwkJCXR5cGVEZWNsID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlRGVjbCA9IG5ldyBUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gUmVjb3JkIHRoYXQgdGhlIGJsb2NrIGhhcyBhIGRlY2xhcmF0aW9uIGZvciBsb2NhbCB0eXBlcworCQl0eXBlRGVjbCA9IG5ldyBMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCW1hcmtDdXJyZW50TWV0aG9kV2l0aExvY2FsVHlwZSgpOworCQlibG9ja1JlYWwoKTsKKwl9CisKKwkvL2hpZ2hsaWdodCB0aGUgbmFtZSBvZiB0aGUgdHlwZQorCWxvbmcgcG9zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl07CisJdHlwZURlY2wuc291cmNlRW5kID0gKGludCkgcG9zOworCXR5cGVEZWNsLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworCXR5cGVEZWNsLm5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisKKwkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KKwkvLyAnY2xhc3MnIGFuZCAnaW50ZXJmYWNlJyBwdXNoIHR3byBpbnQgcG9zaXRpb25zOiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyB0b2tlbiBhbmQgaXRzIGVuZC4KKwkvLyB3ZSB3YW50IHRvIGtlZXAgdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBidXQgZ2V0IHJpZCBvZiB0aGUgZW5kIHBvc2l0aW9uCisJLy8gaXQgaXMgb25seSB1c2VkIGZvciB0aGUgQ2xhc3NMaXRlcmFsQWNjZXNzIHBvc2l0aW9ucy4KKwl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCWludFB0ci0tOyAvLyByZW1vdmUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY2xhc3MgdG9rZW4KKwl0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwl0eXBlRGVjbC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJaWYgKHR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID49IDApIHsKKwkJdHlwZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHR5cGVEZWNsLm1vZGlmaWVyc1NvdXJjZVN0YXJ0OworCX0KKwl0eXBlRGVjbC5ib2R5U3RhcnQgPSB0eXBlRGVjbC5zb3VyY2VFbmQgKyAxOworCXB1c2hPbkFzdFN0YWNrKHR5cGVEZWNsKTsKKwlsaXN0TGVuZ3RoID0gMDsgLy8gd2lsbCBiZSB1cGRhdGVkIHdoZW4gcmVhZGluZyBzdXBlci1pbnRlcmZhY2VzCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7IC8vIGlzIHJlY292ZXJpbmcKKwkJbGFzdENoZWNrUG9pbnQgPSB0eXBlRGVjbC5ib2R5U3RhcnQ7CisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKHR5cGVEZWNsLCAwKTsKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwkJCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucygpIHsKKwkvLyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgOjo9IEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbgorCWNvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpIHsKKwkvLyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUgSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zCisJbmVzdGVkVHlwZS0tOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZVR5cGUoKSB7CisJLy8gSW50ZXJmYWNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUKKwlwdXNoT25Bc3RTdGFjayhnZXRUeXBlUmVmZXJlbmNlKDApKTsKKwkvKiBpZiBpbmNvbXBsZXRlIHR5cGUgaGVhZGVyLCBsaXN0TGVuZ3RoIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBiZWVuIHJlc2V0LAorCQlpbmRpY2F0aW5nIHRoYXQgc29tZSBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrICovCisJbGlzdExlbmd0aCsrOyAJCit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlVHlwZUxpc3QoKSB7CisJLy8gSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0ICcsJyBJbnRlcmZhY2VUeXBlCisJb3B0aW1pemVkQ29uY2F0Tm9kZUxpc3RzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTGVmdEhhbmRTaWRlKCkgeworCS8vIExlZnRIYW5kU2lkZSA6Oj0gTmFtZQorCisJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUxlZnRQYXJlbigpIHsKKwkvLyBQdXNoTFBBUkVOIDo6PSAnKCcKKwlwdXNoT25JbnRTdGFjayhsUGFyZW5Qb3MpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKKwkvLyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVycyBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgJzsnCisKKwkvKgorCWFzdFN0YWNrIDogCisJZXhwcmVzc2lvblN0YWNrOiBFeHByZXNzaW9uIEV4cHJlc3Npb24gLi4uLi4uIEV4cHJlc3Npb24KKwlpZGVudGlmaWVyU3RhY2sgOiB0eXBlICBpZGVudGlmaWVyIGlkZW50aWZpZXIgLi4uLi4uIGlkZW50aWZpZXIKKwlpbnRTdGFjayA6IHR5cGVEaW0gICAgICBkaW0gICAgICAgIGRpbSAgICAgICAgICAgICAgIGRpbQorCSA9PT4KKwlhc3RTdGFjayA6IEZpZWxkRGVjbGFyYXRpb24gRmllbGREZWNsYXJhdGlvbiAuLi4uLi4gRmllbGREZWNsYXJhdGlvbgorCWV4cHJlc3Npb25TdGFjayA6CisJaWRlbnRpZmllclN0YWNrIDogCisJaW50U3RhY2sgOiAKKwkgIAorCSovCisJaW50IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyXTsKKworCS8vIHVwZGF0ZSB0aGUgYXN0U3RhY2ssIGFzdFB0ciBhbmQgYXN0TGVuZ3RoU3RhY2sKKwlpbnQgc3RhcnRJbmRleCA9IGFzdFB0ciAtIHZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV0gKyAxOworCVN5c3RlbS5hcnJheWNvcHkoCisJCWFzdFN0YWNrLCAKKwkJc3RhcnRJbmRleCwgCisJCWFzdFN0YWNrLCAKKwkJc3RhcnRJbmRleCAtIDEsIAorCQl2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlcik7IAorCWFzdFB0ci0tOyAvLyByZW1vdmUgdGhlIHR5cGUgcmVmZXJlbmNlCisJYXN0TGVuZ3RoU3RhY2tbLS1hc3RMZW5ndGhQdHJdID0gdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXI7CisJdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSA9IDA7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KCkgeworCS8vIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA6Oj0gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JworCS8vIHNlZSBibG9ja1JlYWwgaW4gY2FzZSBvZiBjaGFuZ2U6IGR1cGxpY2F0ZWQgY29kZQorCS8vIGluY3JlbWVudCB0aGUgYW1vdW50IG9mIGRlY2xhcmVkIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jaworCXJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0cl0rKzsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RCb2R5KCkgeworCS8vIE1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgQmxvY2tTdGF0ZW1lbnRzb3B0ICd9JyAKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oYm9vbGVhbiBpc05vdEFic3RyYWN0KSB7CisJLy8gTWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBNZXRob2RCb2R5CisJLy8gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyICc7JworCisJLyoKKwlhc3RTdGFjayA6IG1vZGlmaWVycyBhcmd1bWVudHMgdGhyb3dzIHN0YXRlbWVudHMKKwlpZGVudGlmaWVyU3RhY2sgOiB0eXBlIG5hbWUKKwlpbnRTdGFjayA6IGRpbSBkaW0gZGltCisJID09PgorCWFzdFN0YWNrIDogTWV0aG9kRGVjbGFyYXRpb24KKwlpZGVudGlmaWVyU3RhY2sgOgorCWludFN0YWNrIDogCisJKi8KKworCWludCBsZW5ndGg7CisJaWYgKGlzTm90QWJzdHJhY3QpIHsKKwkJLy8gcG9wIHRoZSBwb3NpdGlvbiBvZiB0aGUgeyAgKGJvZHkgb2YgdGhlIG1ldGhvZCkgcHVzaGVkIGluIGJsb2NrIGRlY2wKKwkJaW50UHRyLS07CisJfQorCisJaW50IGV4cGxpY2l0RGVjbGFyYXRpb25zID0gMDsKKwlTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzID0gbnVsbDsKKwlpZiAoaXNOb3RBYnN0cmFjdCkgeworCQkvL3N0YXRlbWVudHMKKwkJZXhwbGljaXREZWNsYXJhdGlvbnMgPSByZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHItLV07CisJCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKQorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlhc3RTdGFjaywgCisJCQkJKGFzdFB0ciAtPSBsZW5ndGgpICsgMSwgCisJCQkJc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCisJCQkJMCwgCisJCQkJbGVuZ3RoKTsgCisJfQorCisJLy8gbm93IHdlIGtub3cgdGhhdCB3ZSBoYXZlIGEgbWV0aG9kIGRlY2xhcmF0aW9uIGF0IHRoZSB0b3Agb2YgdGhlIGFzdCBzdGFjaworCU1ldGhvZERlY2xhcmF0aW9uIG1kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCW1kLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzOworCW1kLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gZXhwbGljaXREZWNsYXJhdGlvbnM7CisKKwkvLyBjYW5ub3QgYmUgZG9uZSBpbiBjb25zdW1lTWV0aG9kSGVhZGVyIGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIHdoZXRoZXIgb3Igbm90IHRoZXJlCisJLy8gaXMgYSBib2R5IHdoZW4gd2UgcmVkdWNlIHRoZSBtZXRob2QgaGVhZGVyCisJaWYgKCFpc05vdEFic3RyYWN0KSB7IC8vcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCB0aGUgbWV0aG9kIGhhcyBhIHNlbWljb2xvbiBib2R5CisJCW1kLm1vZGlmaWVycyB8PSBBY2NTZW1pY29sb25Cb2R5OworCX0KKwkvLyBzdG9yZSB0aGUgZW5kUG9zaXRpb24gKHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSAnfScpIGluIGNhc2UgdGhlcmUgaXMKKwkvLyBhIHRyYWlsaW5nIGNvbW1lbnQgYmVoaW5kIHRoZSBlbmQgb2YgdGhlIG1ldGhvZAorCW1kLmJvZHlFbmQgPSBlbmRQb3NpdGlvbjsKKwltZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhlbmRTdGF0ZW1lbnRQb3NpdGlvbik7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyKCkgeworCS8vIE1ldGhvZEhlYWRlciA6Oj0gTWV0aG9kSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyBUaHJvd3NDbGF1c2VvcHQKKwkvLyByZXRyaWV2ZSBlbmQgcG9zaXRpb24gb2YgbWV0aG9kIGRlY2xhcmF0b3IKKwlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKWFzdFN0YWNrW2FzdFB0cl07CisKKwlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUxCUkFDRSl7IAorCQltZXRob2QuYm9keVN0YXJ0ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJfQorCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZVNFTUlDT0xPTil7CisJCQltZXRob2QubW9kaWZpZXJzIHw9IEFjY1NlbWljb2xvbkJvZHk7CQkJCisJCQltZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOworCQkJbWV0aG9kLmJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbi0xOworCQkJaWYgKGN1cnJlbnRFbGVtZW50LnBhcmVudCAhPSBudWxsKXsKKwkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudDsKKwkJCX0KKwkJfQkJCisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24KKwl9CQkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKSB7CisJLy8gTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0CisJLy8gbm93IHdlIHVwZGF0ZSB0aGUgcmV0dXJuVHlwZSBvZiB0aGUgbWV0aG9kCisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJaW50IGV4dGVuZGVkRGltcyA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlpZiAoZXh0ZW5kZWREaW1zICE9IDApIHsKKwkJVHlwZVJlZmVyZW5jZSByZXR1cm5UeXBlID0gbWQucmV0dXJuVHlwZTsKKwkJbWQuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCWludCBkaW1zID0gcmV0dXJuVHlwZS5kaW1lbnNpb25zKCkgKyBleHRlbmRlZERpbXM7CisJCWludCBiYXNlVHlwZTsKKwkJaWYgKChiYXNlVHlwZSA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyICsgMV0pIDwgMCkgeworCQkJLy9pdCB3YXMgYSBiYXNlVHlwZQorCQkJaW50IHNvdXJjZVN0YXJ0ID0gcmV0dXJuVHlwZS5zb3VyY2VTdGFydDsKKwkJCWludCBzb3VyY2VFbmQgPSAgcmV0dXJuVHlwZS5zb3VyY2VFbmQ7CisJCQlyZXR1cm5UeXBlID0gVHlwZVJlZmVyZW5jZS5iYXNlVHlwZVJlZmVyZW5jZSgtYmFzZVR5cGUsIGRpbXMpOworCQkJcmV0dXJuVHlwZS5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OworCQkJcmV0dXJuVHlwZS5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCQltZC5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKwkJfSBlbHNlIHsKKwkJCW1kLnJldHVyblR5cGUgPSB0aGlzLmNvcHlEaW1zKG1kLnJldHVyblR5cGUsIGRpbXMpOworCQl9CisJCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFKXsgCisJCQltZC5ib2R5U3RhcnQgPSBlbmRQb3NpdGlvbiArIDE7CisJCX0KKwkJLy8gcmVjb3ZlcnkKKwkJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCX0JCQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCkgeworCS8vIE1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlICdJZGVudGlmaWVyJyAnKCcKKwlNZXRob2REZWNsYXJhdGlvbiBtZCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisKKwkvL25hbWUKKwltZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXTsKKwlsb25nIHNlbGVjdG9yU291cmNlID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJLy90eXBlCisJbWQucmV0dXJuVHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dKTsKKwkvL21vZGlmaWVycworCW1kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJbWQubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCisJLy9oaWdobGlnaHQgc3RhcnRzIGF0IHNlbGVjdG9yIHN0YXJ0CisJbWQuc291cmNlU3RhcnQgPSAoaW50KSAoc2VsZWN0b3JTb3VyY2UgPj4+IDMyKTsKKwlwdXNoT25Bc3RTdGFjayhtZCk7CisJbWQuc291cmNlRW5kID0gbFBhcmVuUG9zOworCW1kLmJvZHlTdGFydCA9IGxQYXJlblBvcysxOworCWxpc3RMZW5ndGggPSAwOyAvLyBpbml0aWFsaXplIGxpc3RMZW5ndGggYmVmb3JlIHJlYWRpbmcgcGFyYW1ldGVycy90aHJvd3MKKwkKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSAKKwkJCS8vfHwgbWQubW9kaWZpZXJzICE9IDAKKwkJCXx8IChzY2FubmVyLmdldExpbmVOdW1iZXIobWQucmV0dXJuVHlwZS5zb3VyY2VTdGFydCkKKwkJCQkJPT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKG1kLnNvdXJjZVN0YXJ0KSkpeworCQkJbGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChtZCwgMCk7CisJCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCX0gZWxzZSB7CisJCQlsYXN0Q2hlY2tQb2ludCA9IG1kLnNvdXJjZVN0YXJ0OworCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJfQorCX0JCQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlclBhcmFtZXRlcnMoKSB7CisJLy8gTWV0aG9kSGVhZGVyUGFyYW1ldGVycyA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCAnKScKKwlpbnQgbGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dOworCWFzdFB0ciAtPSBsZW5ndGg7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCW1kLnNvdXJjZUVuZCA9IAlyUGFyZW5Qb3M7CisJLy9hcmd1bWVudHMKKwlpZiAobGVuZ3RoICE9IDApIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWFzdFN0YWNrLCAKKwkJCWFzdFB0ciArIDEsIAorCQkJbWQuYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50W2xlbmd0aF0sIAorCQkJMCwgCisJCQlsZW5ndGgpOyAKKwl9CisJbWQuYm9keVN0YXJ0ID0gclBhcmVuUG9zKzE7CisJbGlzdExlbmd0aCA9IDA7IC8vIHJlc2V0IGxpc3RMZW5ndGggYWZ0ZXIgaGF2aW5nIHJlYWQgYWxsIHBhcmFtZXRlcnMKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSBtZC5ib2R5U3RhcnQ7CisJCWlmIChjdXJyZW50RWxlbWVudC5wYXJzZVRyZWUoKSA9PSBtZCkgcmV0dXJuOworCisJCS8vIG1pZ2h0IG5vdCBoYXZlIGJlZW4gYXR0YWNoZWQgeWV0IC0gaW4gc29tZSBjb25zdHJ1Y3RvciBzY2VuYXJpaQorCQlpZiAobWQuaXNDb25zdHJ1Y3RvcigpKXsKKwkJCWlmICgobGVuZ3RoICE9IDApCisJCQkJfHwgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpIAorCQkJCXx8IChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1ldGhyb3dzKSl7CisJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQobWQsIDApOworCQkJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJCX0JCisJCX0JCisJfQkKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKSB7CisJLy8gTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlIDo6PSAndGhyb3dzJyBDbGFzc1R5cGVMaXN0CisJaW50IGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXTsKKwlhc3RQdHIgLT0gbGVuZ3RoOworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlhc3RTdGFjaywgCisJCWFzdFB0ciArIDEsIAorCQltZC50aHJvd25FeGNlcHRpb25zID0gbmV3IFR5cGVSZWZlcmVuY2VbbGVuZ3RoXSwgCisJCTAsIAorCQlsZW5ndGgpOworCW1kLnNvdXJjZUVuZCA9IAltZC50aHJvd25FeGNlcHRpb25zW2xlbmd0aC0xXS5zb3VyY2VFbmQ7CisJbWQuYm9keVN0YXJ0ID0gbWQudGhyb3duRXhjZXB0aW9uc1tsZW5ndGgtMV0uc291cmNlRW5kICsgMTsKKwlsaXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgbGlzdExlbmd0aCBhZnRlciBoYXZpbmcgcmVhZCBhbGwgdGhyb3duIGV4Y2VwdGlvbnMJCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCWxhc3RDaGVja1BvaW50ID0gbWQuYm9keVN0YXJ0OworCX0JCQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgeworCS8vIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKKworCS8vIHdoZW4gdGhlIG5hbWUgaXMgb25seSBhbiBpZGVudGlmaWVyLi4ud2UgaGF2ZSBhIG1lc3NhZ2Ugc2VuZCB0byAidGhpcyIgKGltcGxpY2l0KQorCisJTWVzc2FnZVNlbmQgbSA9IG5ld01lc3NhZ2VTZW5kKCk7CisJbS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7CisJbS5zb3VyY2VTdGFydCA9IAorCQkoaW50KSAoKG0ubmFtZVNvdXJjZVBvc2l0aW9uID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl0pID4+PiAzMik7IAorCW0uc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZiAoaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdID09IDEpIHsKKwkJbS5yZWNlaXZlciA9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0OworCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJfSBlbHNlIHsKKwkJaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdLS07CisJCW0ucmVjZWl2ZXIgPSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOworCQltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsJCQorCX0KKwlwdXNoT25FeHByZXNzaW9uU3RhY2sobSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKSB7CisJLy9vcHRpbWl6ZSB0aGUgcHVzaC9wb3AKKwkvL01ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworCisJTWVzc2FnZVNlbmQgbSA9IG5ld01lc3NhZ2VTZW5kKCk7CisJbS5zb3VyY2VTdGFydCA9IAorCQkoaW50KSAoKG0ubmFtZVNvdXJjZVBvc2l0aW9uID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl0pID4+PiAzMik7IAorCW0uc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisJbS5yZWNlaXZlciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwltLnNvdXJjZVN0YXJ0ID0gbS5yZWNlaXZlci5zb3VyY2VTdGFydDsKKwltLnNvdXJjZUVuZCA9IHJQYXJlblBvczsKKwlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBtOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsKKwkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKKworCU1lc3NhZ2VTZW5kIG0gPSBuZXdNZXNzYWdlU2VuZCgpOworCW0uc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJbS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7CisJbS5uYW1lU291cmNlUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXTsKKwltLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCW0ucmVjZWl2ZXIgPSBuZXcgU3VwZXJSZWZlcmVuY2UobS5zb3VyY2VTdGFydCwgZW5kUG9zaXRpb24pOworCXB1c2hPbkV4cHJlc3Npb25TdGFjayhtKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpIHsKKwkvLyBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyAnSWRlbnRpZmllcicgJygnCisJLy8gTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IFR5cGUgUHVzaE1vZGlmaWVycyAnSWRlbnRpZmllcicgJygnIAorCU1ldGhvZERlY2xhcmF0aW9uIG1kID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKworCS8vbmFtZQorCW1kLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdOworCWxvbmcgc2VsZWN0b3JTb3VyY2UgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vbW9kaWZpZXJzCisJbWQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwltZC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvL3R5cGUKKwltZC5yZXR1cm5UeXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCisJLy9oaWdobGlnaHQgc3RhcnRzIGF0IHNlbGVjdG9yIHN0YXJ0CisJbWQuc291cmNlU3RhcnQgPSAoaW50KSAoc2VsZWN0b3JTb3VyY2UgPj4+IDMyKTsKKwlwdXNoT25Bc3RTdGFjayhtZCk7CisJbWQuc291cmNlRW5kID0gbFBhcmVuUG9zOworCW1kLmJvZHlTdGFydCA9IGxQYXJlblBvcyArIDE7CisJbGlzdExlbmd0aCA9IDA7IC8vIGluaXRpYWxpemUgbGlzdExlbmd0aCBiZWZvcmUgcmVhZGluZyBwYXJhbWV0ZXJzL3Rocm93cworCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQlsYXN0Q2hlY2tQb2ludCA9IG1kLmJvZHlTdGFydDsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQobWQsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CQkKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTW9kaWZpZXJzKCkgeworCWludCBzYXZlZE1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gbW9kaWZpZXJzU291cmNlU3RhcnQ7CQorCWNoZWNrQW5ub3RhdGlvbigpOyAvLyBtaWdodCB1cGRhdGUgbW9kaWZpZXJzIHdpdGggQWNjRGVwcmVjYXRlZAorCXB1c2hPbkludFN0YWNrKG1vZGlmaWVycyk7IC8vIG1vZGlmaWVycworCWlmIChtb2RpZmllcnNTb3VyY2VTdGFydCA+PSBzYXZlZE1vZGlmaWVyc1NvdXJjZVN0YXJ0KSB7CisJCW1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gc2F2ZWRNb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9CisJcHVzaE9uSW50U3RhY2sobW9kaWZpZXJzU291cmNlU3RhcnQpOworCXJlc2V0TW9kaWZpZXJzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTmVzdGVkTWV0aG9kKCkgeworCS8vIE5lc3RlZE1ldGhvZCA6Oj0gJGVtcHR5CisJanVtcE92ZXJNZXRob2RCb2R5KCk7CisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdICsrOworCWNvbnN1bWVPcGVuQmxvY2soKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVOZXN0ZWRUeXBlKCkgeworCS8vIE5lc3RlZFR5cGUgOjo9ICRlbXB0eQorCW5lc3RlZFR5cGUrKzsKKwl0cnkgeworCQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gPSAwOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL2V4Y2VwdCBpbiB0ZXN0J3MgY2FzZXMsIGl0IHNob3VsZCBuZXZlciByYWlzZQorCQlpbnQgb2xkTCA9IG5lc3RlZE1ldGhvZC5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkobmVzdGVkTWV0aG9kICwgMCwgKG5lc3RlZE1ldGhvZCA9IG5ldyBpbnRbb2xkTCArIDMwXSksIDAsIG9sZEwpOworCQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gPSAwOworCQkvLyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzQ291bnRlciBhcyB3ZWxsLiBJdCBoYXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzaXplIG9mIHRoZSBuZXN0ZWRNZXRob2QgY29sbGVjdGlvbgorCQlTeXN0ZW0uYXJyYXljb3B5KHZhcmlhYmxlc0NvdW50ZXIsIDAsICh2YXJpYWJsZXNDb3VudGVyID0gbmV3IGludFtvbGRMICsgMzBdKSwgMCwgb2xkTCk7CisJfQorCXZhcmlhYmxlc0NvdW50ZXJbbmVzdGVkVHlwZV0gPSAwOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU9uZURpbUxvb3AoKSB7CisJLy8gT25lRGltTG9vcCA6Oj0gJ1snICddJworCWRpbWVuc2lvbnMrKzsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVPbmx5U3luY2hyb25pemVkKCkgeworCS8vIE9ubHlTeW5jaHJvbml6ZWQgOjo9ICdzeW5jaHJvbml6ZWQnCisJcHVzaE9uSW50U3RhY2sodGhpcy5zeW5jaHJvbml6ZWRCbG9ja1NvdXJjZVN0YXJ0KTsKKwlyZXNldE1vZGlmaWVycygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU9wZW5CbG9jaygpIHsKKwkvLyBPcGVuQmxvY2sgOjo9ICRlbXB0eQorCisJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwl0cnkgeworCQlyZWFsQmxvY2tTdGFja1srK3JlYWxCbG9ja1B0cl0gPSAwOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL3JlYWxCbG9ja1B0ciBpcyBjb3JyZWN0IAorCQlpbnQgb2xkU3RhY2tMZW5ndGggPSByZWFsQmxvY2tTdGFjay5sZW5ndGg7CisJCWludCBvbGRTdGFja1tdID0gcmVhbEJsb2NrU3RhY2s7CisJCXJlYWxCbG9ja1N0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgcmVhbEJsb2NrU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyXSA9IDA7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpIHsKKwkvLyBQYWNrYWdlRGVjbGFyYXRpb24gOjo9ICdwYWNrYWdlJyBOYW1lICc7JworCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLworCisJSW1wb3J0UmVmZXJlbmNlIGltcHQgPSBjb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2U7CisJLy8gZmx1c2ggYW5ub3RhdGlvbnMgZGVmaW5lZCBwcmlvciB0byBpbXBvcnQgc3RhdGVtZW50cworCWltcHQuZGVjbGFyYXRpb25FbmQgPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gdGhpcy5mbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpIHsKKwkvLyBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSAncGFja2FnZScgTmFtZQorCS8qIGJ1aWxkIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLworCisJSW1wb3J0UmVmZXJlbmNlIGltcHQ7CisJaW50IGxlbmd0aDsKKwljaGFyW11bXSB0b2tlbnMgPSAKKwkJbmV3IGNoYXJbbGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV1dW107IAorCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCArK2lkZW50aWZpZXJQdHIsIHRva2VucywgMCwgbGVuZ3RoKTsKKwlTeXN0ZW0uYXJyYXljb3B5KAorCQlpZGVudGlmaWVyUG9zaXRpb25TdGFjaywgCisJCWlkZW50aWZpZXJQdHItLSwgCisJCXBvc2l0aW9ucywgCisJCTAsIAorCQlsZW5ndGgpOyAKKwljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSAKKwkJaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIHRydWUpOyAKKworCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwl9IGVsc2UgeworCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gaW1wdC5zb3VyY2VFbmQ7CisJfQorCWltcHQuZGVjbGFyYXRpb25FbmQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kOworCS8vZW5kUG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIDsKKwlpbXB0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCX0JCit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUG9zdGZpeEV4cHJlc3Npb24oKSB7CisJLy8gUG9zdGZpeEV4cHJlc3Npb24gOjo9IE5hbWUKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKSB7CisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiAKKwl1cGRhdGVTb3VyY2VQb3NpdGlvbihleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0pOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCkgeworCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgJy4nICdjbGFzcycKKwlpbnRQdHItLTsKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soCisJCW5ldyBDbGFzc0xpdGVyYWxBY2Nlc3MoaW50U3RhY2tbaW50UHRyLS1dLAorCQlnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSkpKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKSB7CisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICdjbGFzcycKKwlpbnRQdHItLTsKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soCisJCW5ldyBDbGFzc0xpdGVyYWxBY2Nlc3MoaW50U3RhY2tbaW50UHRyLS1dLAorCQlnZXRUeXBlUmVmZXJlbmNlKDApKSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lU3VwZXIoKSB7CisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICdzdXBlcicKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soCisJCW5ldyBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSgKKwkJCWdldFR5cGVSZWZlcmVuY2UoMCksCisJCQlpbnRTdGFja1tpbnRQdHItLV0sCisJCQllbmRQb3NpdGlvbikpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVRoaXMoKSB7CisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICd0aGlzJworCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJbmV3IFF1YWxpZmllZFRoaXNSZWZlcmVuY2UoCisJCQlnZXRUeXBlUmVmZXJlbmNlKDApLAorCQkJaW50U3RhY2tbaW50UHRyLS1dLAorCQkJZW5kUG9zaXRpb24pKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVByaW1pdGl2ZVR5cGUoKSB7CisJLy8gUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgJy4nICdjbGFzcycKKwlpbnRQdHItLTsKKwlwdXNoT25FeHByZXNzaW9uU3RhY2soCisJCW5ldyBDbGFzc0xpdGVyYWxBY2Nlc3MoaW50U3RhY2tbaW50UHRyLS1dLAorCQlnZXRUeXBlUmVmZXJlbmNlKDApKSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCkgeworCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSAndGhpcycKKwlwdXNoT25FeHByZXNzaW9uU3RhY2sobmV3IFRoaXNSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dLCBlbmRQb3NpdGlvbikpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1pdGl2ZVR5cGUoKSB7CisJLy8gVHlwZSA6Oj0gUHJpbWl0aXZlVHlwZQorCXB1c2hPbkludFN0YWNrKDApOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVB1c2hNb2RpZmllcnMoKSB7CisJaWYgKChtb2RpZmllcnMgJiBBY2NTeW5jaHJvbml6ZWQpICE9IDApIHsKKwkJIC8qIHJlbW92ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHN5bmNocm9uaXplZCBrZXl3b3JkCisJCSAgKiB3ZSBkb24ndCBuZWVkIGl0IHdoZW4gc3luY2hyb25pemVkIGlzIHBhcnQgb2YgdGhlIG1vZGlmaWVycworCQkgICovCisJCWludFB0ci0tOworCX0KKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnMpOyAvLyBtb2RpZmllcnMKKwlwdXNoT25JbnRTdGFjayhtb2RpZmllcnNTb3VyY2VTdGFydCk7CisJcmVzZXRNb2RpZmllcnMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVQdXNoUG9zaXRpb24oKSB7CisJLy8gZm9yIHNvdXJjZSBtYW5hZ21lbnQgcHVycG9zZQorCS8vIFB1c2hQb3NpdGlvbiA6Oj0gJGVtcHR5CisJcHVzaE9uSW50U3RhY2soZW5kUG9zaXRpb24pOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVF1YWxpZmllZE5hbWUoKSB7CisJLy8gUXVhbGlmaWVkTmFtZSA6Oj0gTmFtZSAnLicgU2ltcGxlTmFtZSAKKwkvKmJhY2sgZnJvbSB0aGUgcmVjdXJzaXZlIGxvb3Agb2YgUXVhbGlmaWVkTmFtZS4KKwlVcGRhdGVzIGlkZW50aWZpZXIgbGVuZ3RoIGludG8gdGhlIGxlbmd0aCBzdGFjayovCisKKwlpZGVudGlmaWVyTGVuZ3RoU3RhY2tbLS1pZGVudGlmaWVyTGVuZ3RoUHRyXSsrOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJlZmVyZW5jZVR5cGUoKSB7CisJLy8gUmVmZXJlbmNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUKKwlwdXNoT25JbnRTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVSZXN0b3JlRGlldCgpIHsKKwkvLyBSZXN0b3JlRGlldCA6Oj0gJGVtcHR5CisJZGlldEludC0tOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJpZ2h0UGFyZW4oKSB7CisJLy8gUHVzaFJQQVJFTiA6Oj0gJyknCisJcHVzaE9uSW50U3RhY2soclBhcmVuUG9zKTsKK30KKwkvLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5ICAKKwkgLy8gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBhdXRvbWF0aWMgZ2VuZXJhdGlvbiA6IGRvIE5PVCBlZGl0LW1vZGlmeSAgCisJcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJ1bGUoaW50IGFjdCkgeworCSAgc3dpdGNoICggYWN0ICkgeworCSAgICBjYXNlIDI5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDo6PSBQcmltaXRpdmVUeXBlIik7CisJCQkgICAgY29uc3VtZVByaW1pdGl2ZVR5cGUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmVyZW5jZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlIik7CisJCQkgICAgY29uc3VtZVJlZmVyZW5jZVR5cGUoKTsgICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDUyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJRdWFsaWZpZWROYW1lIDo6PSBOYW1lIERPVCBTaW1wbGVOYW1lIik7CisJCQkgICAgY29uc3VtZVF1YWxpZmllZE5hbWUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdCIpOworCQkJICAgIGNvbnN1bWVDb21waWxhdGlvblVuaXQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyQ29tcGlsYXRpb25Vbml0IDo6PSIpOworCQkJICAgIGNvbnN1bWVFbnRlckNvbXBpbGF0aW9uVW5pdCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hIZWFkZXIgOjo9IGNhdGNoIExQQVJFTiBGb3JtYWxQYXJhbWV0ZXIgUlBBUkVOIExCUkFDRSIpOworCQkJICAgIGNvbnN1bWVDYXRjaEhlYWRlcigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgSW1wb3J0RGVjbGFyYXRpb24iKTsKKwkJCSAgICBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDcwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb25zIDo6PSBUeXBlRGVjbGFyYXRpb25zIFR5cGVEZWNsYXJhdGlvbiIpOworCQkJICAgIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDcxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYWNrYWdlRGVjbGFyYXRpb24gOjo9IFBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7CisJCQkgICAgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgOjo9IHBhY2thZ2UgTmFtZSIpOworCQkJICAgICBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uTmFtZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uIDo6PSBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIik7CisJCQkgICAgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PSBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDc4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9IGltcG9ydCBOYW1lIERPVCBNVUxUSVBMWSIpOworCQkJICAgIGNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDgxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEZWNsYXJhdGlvbiA6Oj0gQ2xhc3NIZWFkZXIgQ2xhc3NCb2R5Iik7CisJCQkgICAgY29uc3VtZUNsYXNzRGVjbGFyYXRpb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgOTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyIDo6PSBDbGFzc0hlYWRlck5hbWUgQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IENsYXNzSGVhZGVySW1wbGVtZW50c29wdCIpOworCQkJICAgIGNvbnN1bWVDbGFzc0hlYWRlcigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA5NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgY2xhc3MgSWRlbnRpZmllciIpOworCQkJICAgIGNvbnN1bWVDbGFzc0hlYWRlck5hbWUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgOTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBDbGFzc1R5cGUiKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXJFeHRlbmRzKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlckltcGxlbWVudHMgOjo9IGltcGxlbWVudHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXJJbXBsZW1lbnRzKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0IENPTU1BIEludGVyZmFjZVR5cGUiKTsKKwkJCSAgICBjb25zdW1lSW50ZXJmYWNlVHlwZUxpc3QoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTAyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZSIpOworCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VUeXBlKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMgQ2xhc3NCb2R5RGVjbGFyYXRpb24iKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb24gOjo9IERpZXQgTmVzdGVkTWV0aG9kIEJsb2NrIik7CisJCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDExMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlldCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRGlldCgpOyAgCisJCQkJYnJlYWsgOworCQorCSAgICBjYXNlIDExMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5pdGlhbGl6ZXIgOjo9IERpZXQgTmVzdGVkTWV0aG9kIEJsb2NrIik7CisJCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDExOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZUVtcHR5Q2xhc3NNZW1iZXJEZWNsYXJhdGlvbigpOyAgCisJCQkJYnJlYWsgOworCQorCSAgICBjYXNlIDExOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyBTRU1JQ09MT04iKTsKKwkJCSAgICBjb25zdW1lRmllbGREZWNsYXJhdGlvbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxMjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhcmlhYmxlRGVjbGFyYXRvcnMgOjo9IFZhcmlhYmxlRGVjbGFyYXRvcnMgQ09NTUEgVmFyaWFibGVEZWNsYXJhdG9yIik7CisJCQkgICAgY29uc3VtZVZhcmlhYmxlRGVjbGFyYXRvcnMoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTI0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbnRlclZhcmlhYmxlIDo6PSIpOworCQkJICAgIGNvbnN1bWVFbnRlclZhcmlhYmxlKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uIDo6PSIpOworCQkJICAgIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24gOjo9Iik7CisJCQkgICAgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxMjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcmNlTm9EaWV0IDo6PSIpOworCQkJICAgIGNvbnN1bWVGb3JjZU5vRGlldCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxMjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3RvcmVEaWV0IDo6PSIpOworCQkJICAgIGNvbnN1bWVSZXN0b3JlRGlldCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxMzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZERlY2xhcmF0aW9uIDo6PSBNZXRob2RIZWFkZXIgTWV0aG9kQm9keSIpOworCQkJICAgIC8vIHNldCB0byB0cnVlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aCBhIGJvZHkKKwkgIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbih0cnVlKTsgICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIFNFTUlDT0xPTiIpOworCQkJICAgIC8vIHNldCB0byBmYWxzZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGhvdXQgYm9keQorCSAgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGZhbHNlKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTM1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXIgOjo9IE1ldGhvZEhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMiKTsKKwkJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDEzNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlciA6Oj0gTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyIpOworCQkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTM3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyBJZGVudGlmaWVyIExQQVJFTiIpOworCQkJICAgIGNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgSWRlbnRpZmllciBMUEFSRU4iKTsKKwkJCSAgICBjb25zdW1lTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTM5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBJZGVudGlmaWVyIExQQVJFTiIpOworCQkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyUGFyYW1ldGVycyA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCBSUEFSRU4iKTsKKwkJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyUGFyYW1ldGVycygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyA6Oj0gRGltc29wdCIpOworCQkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTQyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UgOjo9IHRocm93cyBDbGFzc1R5cGVMaXN0Iik7CisJCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlclRocm93c0NsYXVzZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9ySGVhZGVyIDo6PSBDb25zdHJ1Y3RvckhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycy4uLiIpOworCQkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IElkZW50aWZpZXIgTFBBUkVOIik7CisJCQkgICAgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcm1hbFBhcmFtZXRlckxpc3QgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3QgQ09NTUEgRm9ybWFsUGFyYW1ldGVyIik7CisJCQkgICAgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3QoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTQ3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcklkIik7CisJCQkgICAgLy8gdGhlIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBtb2RpZmllcnMgc2hvdWxkIGJlIHJlc2V0CisJIAljb25zdW1lRm9ybWFsUGFyYW1ldGVyKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE0OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NUeXBlTGlzdCA6Oj0gQ2xhc3NUeXBlTGlzdCBDT01NQSBDbGFzc1R5cGVFbHQiKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NUeXBlTGlzdCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzVHlwZUVsdCA6Oj0gQ2xhc3NUeXBlIik7CisJCQkgICAgY29uc3VtZUNsYXNzVHlwZUVsdCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCBMQlJBQ0UgQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOworCQkJICAgIGNvbnN1bWVNZXRob2RCb2R5KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkTWV0aG9kIDo6PSIpOworCQkJICAgIGNvbnN1bWVOZXN0ZWRNZXRob2QoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTUzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0aWNJbml0aWFsaXplciA6Oj0gU3RhdGljT25seSBCbG9jayIpOworCQkJICAgIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOyAgCisJCQkJYnJlYWsgOworCQorCSAgICBjYXNlIDE1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljT25seSA6Oj0gc3RhdGljIik7CisJCQkgICAgY29uc3VtZVN0YXRpY09ubHkoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTU1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkiKTsKKwkJCSAgICBjb25zdW1lQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTU2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBTRU1JQ09MT04iKTsKKwkJCSAgICBjb25zdW1lSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE1NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgTEJSQUNFIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOworCQkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTYwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCA6Oj0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gQmxvY2tTdGF0ZW1lbnRzIik7CisJCQkgICAgIGNvbnN1bWVDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50cygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBzdXBlciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsKKwkJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMCxFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE2MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IFByaW1hcnkgRE9UIHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7CisJCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTY0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1Qgc3VwZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4uLi4iKTsKKwkJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7CisJCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lIERPVCB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7CisJCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDIsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZURlY2xhcmF0aW9uIDo6PSBJbnRlcmZhY2VIZWFkZXIgSW50ZXJmYWNlQm9keSIpOworCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlciA6Oj0gSW50ZXJmYWNlSGVhZGVyTmFtZSBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzb3B0Iik7CisJCQkgICAgY29uc3VtZUludGVyZmFjZUhlYWRlcigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxNjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBpbnRlcmZhY2UgSWRlbnRpZmllciIpOworCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBJbnRlcmZhY2VUeXBlTGlzdCIpOworCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJFeHRlbmRzKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE3NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIDo6PSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMuLi4iKTsKKwkJCSAgICBjb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVFbXB0eUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IEludmFsaWRNZXRob2REZWNsYXJhdGlvbiIpOworCQkJICAgIGlnbm9yZU1ldGhvZEJvZHkoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTc5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5Iik7CisJCQkgICAgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24odHJ1ZSk7ICAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxODAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBTRU1JQ09MT04iKTsKKwkJCSAgICBpZ25vcmVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihmYWxzZSk7ICAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5SW5pdGlhbGl6ZXIgOjo9IExCUkFDRSAsb3B0IFJCUkFDRSIpOworCQkJICAgIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTg3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgVmFyaWFibGVJbml0aWFsaXplcnMgUkJSQUNFIik7CisJCQkgICAgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTg4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgVmFyaWFibGVJbml0aWFsaXplcnMgQ09NTUEgUkJSQUNFIik7CisJCQkgICAgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTkwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcnMgQ09NTUEgVmFyaWFibGVJbml0aWFsaXplciIpOworCQkJICAgIGNvbnN1bWVWYXJpYWJsZUluaXRpYWxpemVycygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAxOTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrIDo6PSBPcGVuQmxvY2sgTEJSQUNFIEJsb2NrU3RhdGVtZW50c29wdCBSQlJBQ0UiKTsKKwkJCSAgICBjb25zdW1lQmxvY2soKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTkyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJPcGVuQmxvY2sgOjo9Iik7CisJCQkgICAgY29uc3VtZU9wZW5CbG9jaygpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMTk0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyBCbG9ja1N0YXRlbWVudCIpOworCQkJICAgIGNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworCQkJICAgIGlnbm9yZUludGVyZmFjZURlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDE5OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IDo6PSBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyMDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMiKTsKKwkJCSAgICBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDIwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMiKTsKKwkJCSAgICBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDIwMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaE1vZGlmaWVycyA6Oj0iKTsKKwkJCSAgICBjb25zdW1lUHVzaE1vZGlmaWVycygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyMjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVtcHR5U3RhdGVtZW50IDo6PSBTRU1JQ09MT04iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlTdGF0ZW1lbnQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMYWJlbGVkU3RhdGVtZW50IDo6PSBJZGVudGlmaWVyIENPTE9OIFN0YXRlbWVudCIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjI4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMYWJlbGVkU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBJZGVudGlmaWVyIENPTE9OIFN0YXRlbWVudE5vU2hvcnRJZiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDIyOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvblN0YXRlbWVudCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbiBTRU1JQ09MT04iKTsKKwkJCSAgICBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlblN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudCIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRJZk5vRWxzZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnQgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYgZWxzZS4uLiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDIzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudE5vU2hvcnRJZi4uLiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoU3RhdGVtZW50IDo6PSBzd2l0Y2ggT3BlbkJsb2NrIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTd2l0Y2hCbG9jayIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRTd2l0Y2goKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI0MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2sgOjo9IExCUkFDRSBSQlJBQ0UiKTsKKwkJCSAgICBjb25zdW1lRW1wdHlTd2l0Y2hCbG9jaygpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjQ0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9jayA6Oj0gTEJSQUNFIFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hMYWJlbHMgUkJSQUNFIik7CisJCQkgICAgY29uc3VtZVN3aXRjaEJsb2NrKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50cyA6Oj0gU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaEJsb2NrU3RhdGVtZW50Iik7CisJCQkgICAgY29uc3VtZVN3aXRjaEJsb2NrU3RhdGVtZW50cygpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjQ3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9ja1N0YXRlbWVudCA6Oj0gU3dpdGNoTGFiZWxzIEJsb2NrU3RhdGVtZW50cyIpOworCQkJICAgIGNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjQ5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbCIpOworCQkJICAgIGNvbnN1bWVTd2l0Y2hMYWJlbHMoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSAyNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBjYXNlIENvbnN0YW50RXhwcmVzc2lvbiBDT0xPTiIpOworCQkJICAgIGNvbnN1bWVDYXNlTGFiZWwoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDI1MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWwgOjo9IGRlZmF1bHQgQ09MT04iKTsKKwkJCSAgICBjb25zdW1lRGVmYXVsdExhYmVsKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnQgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnQiKTsKKwkJCSAgICBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYiKTsKKwkJCSAgICBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9TdGF0ZW1lbnQgOjo9IGRvIFN0YXRlbWVudCB3aGlsZSBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudERvKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclN0YXRlbWVudCA6Oj0gZm9yIExQQVJFTiBGb3JJbml0b3B0IFNFTUlDT0xPTiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTi4uLiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBmb3IgTFBBUkVOIEZvckluaXRvcHQgU0VNSUNPTE9OIEV4cHJlc3Npb25vcHQgU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudEZvcigpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjU3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JJbml0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCIpOworCQkJICAgIGNvbnN1bWVGb3JJbml0KCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlbWVudEV4cHJlc3Npb25MaXN0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCBDT01NQSBTdGF0ZW1lbnRFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudEV4cHJlc3Npb25MaXN0KCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVNpbXBsZUFzc2VydFN0YXRlbWVudCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjYzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NlcnRTdGF0ZW1lbnQgOjo9IGFzc2VydCBFeHByZXNzaW9uIENPTE9OIEV4cHJlc3Npb24gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZUFzc2VydFN0YXRlbWVudCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjY0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCcmVha1N0YXRlbWVudCA6Oj0gYnJlYWsgU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudEJyZWFrKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjY2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudENvbnRpbnVlKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRpbnVlU3RhdGVtZW50IDo6PSBjb250aW51ZSBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZVdpdGhMYWJlbCgpIDsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI2OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyb3dTdGF0ZW1lbnQgOjo9IHRocm93IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudFRocm93KCk7CisJIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjcwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIEJsb2NrIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudFN5bmNocm9uaXplZCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9ubHlTeW5jaHJvbml6ZWQgOjo9IHN5bmNocm9uaXplZCIpOworCQkJICAgIGNvbnN1bWVPbmx5U3luY2hyb25pemVkKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI3MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5U3RhdGVtZW50IDo6PSB0cnkgQmxvY2sgQ2F0Y2hlcyIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUcnkoZmFsc2UpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXNvcHQgRmluYWxseSIpOworCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI3NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlcyA6Oj0gQ2F0Y2hlcyBDYXRjaENsYXVzZSIpOworCQkJICAgIGNvbnN1bWVDYXRjaGVzKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI3NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hDbGF1c2UgOjo9IGNhdGNoIExQQVJFTiBGb3JtYWxQYXJhbWV0ZXIgUlBBUkVOIEJsb2NrIik7CisJCQkgICAgY29uc3VtZVN0YXRlbWVudENhdGNoKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hMUEFSRU4gOjo9IExQQVJFTiIpOworCQkJICAgIGNvbnN1bWVMZWZ0UGFyZW4oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjc5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUlBBUkVOIDo6PSBSUEFSRU4iKTsKKwkJCSAgICBjb25zdW1lUmlnaHRQYXJlbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyODMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSB0aGlzIik7CisJCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5VGhpcygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyODQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiIpOworCQkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyODcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lIERPVCB0aGlzIik7CisJCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVRoaXMoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjg4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1Qgc3VwZXIiKTsKKwkJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lU3VwZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1QgY2xhc3MiKTsKKwkJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IEFycmF5VHlwZSBET1QgY2xhc3MiKTsKKwkJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlBcnJheVR5cGUoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMjkxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHJpbWl0aXZlVHlwZSBET1QgY2xhc3MiKTsKKwkJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb2NhdGlvbkhlYWRlciA6Oj0gbmV3IENsYXNzVHlwZSBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOworCQkJICAgIGNvbnN1bWVBbGxvY2F0aW9uSGVhZGVyKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gbmV3IENsYXNzVHlwZSBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTi4uLiIpOworCQkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSBET1QgbmV3IFNpbXBsZU5hbWUgTFBBUkVOLi4uIik7CisJCQkgICAgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgbmV3Li4uIik7CisJCQkgICAgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDI5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgOjo9IE5hbWUgRE9UIik7CisJCQkgICAgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lKCkgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAyOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keW9wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NCb2R5b3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9Iik7CisJCQkgICAgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMwMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJndW1lbnRMaXN0IDo6PSBBcmd1bWVudExpc3QgQ09NTUEgRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVBcmd1bWVudExpc3QoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzA0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gbmV3IFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzLi4uIik7CisJCQkgICAgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMuLi4iKTsKKwkJCSAgICBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzA3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaW1XaXRoT3JXaXRoT3V0RXhwcnMgOjo9IERpbVdpdGhPcldpdGhPdXRFeHBycyBEaW1XaXRoT3JXaXRoT3V0RXhwciIpOworCQkJICAgIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDMwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9IExCUkFDS0VUIFJCUkFDS0VUIik7CisJCQkgICAgY29uc3VtZURpbVdpdGhPcldpdGhPdXRFeHByKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSAzMTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXMgOjo9IERpbXNMb29wIik7CisJCQkgICAgY29uc3VtZURpbXMoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDMxMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT25lRGltTG9vcCA6Oj0gTEJSQUNLRVQgUkJSQUNLRVQiKTsKKwkJCSAgICBjb25zdW1lT25lRGltTG9vcCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkQWNjZXNzIDo6PSBQcmltYXJ5IERPVCBJZGVudGlmaWVyIik7CisJCQkgICAgY29uc3VtZUZpZWxkQWNjZXNzKGZhbHNlKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzE1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gc3VwZXIgRE9UIElkZW50aWZpZXIiKTsKKwkJCSAgICBjb25zdW1lRmllbGRBY2Nlc3ModHJ1ZSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMxNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gTmFtZSBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOworCQkJICAgIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgRE9UIElkZW50aWZpZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsKKwkJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzE4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOworCQkJICAgIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzE5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gTmFtZSBMQlJBQ0tFVCBFeHByZXNzaW9uIFJCUkFDS0VUIik7CisJCQkgICAgY29uc3VtZUFycmF5QWNjZXNzKHRydWUpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBQcmltYXJ5Tm9OZXdBcnJheSBMQlJBQ0tFVCBFeHByZXNzaW9uIFJCUkFDS0VUIik7CisJCQkgICAgY29uc3VtZUFycmF5QWNjZXNzKGZhbHNlKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzIyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQb3N0Zml4RXhwcmVzc2lvbiA6Oj0gTmFtZSIpOworCQkJICAgIGNvbnN1bWVQb3N0Zml4RXhwcmVzc2lvbigpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3RJbmNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBQTFVTX1BMVVMiKTsKKwkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLHRydWUpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBNSU5VU19NSU5VUyIpOworCQkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTLHRydWUpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hQb3NpdGlvbiA6Oj0iKTsKKwkJCSAgICBjb25zdW1lUHVzaFBvc2l0aW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMzMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uIDo6PSBQTFVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzMxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb24gOjo9IE1JTlVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMzMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlSW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUExVU19QTFVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLGZhbHNlKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzM0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmVEZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBNSU5VU19NSU5VUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsZmFsc2UpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzMzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gVFdJRERMRSBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uVFdJRERMRSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMzNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSBOT1QgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDMzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZUNhc3RFeHByZXNzaW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIik7CisJCQkgICAgY29uc3VtZUNhc3RFeHByZXNzaW9uKCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM0MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyIpOworCQkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIE1VTFRJUExZIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NVUxUSVBMWSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM0NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRElWSURFIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5ESVZJREUpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIFJFTUFJTkRFUiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUkVNQUlOREVSKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzQ3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBQTFVTIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzQ4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIExFRlRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFRlRfU0hJRlQpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFJJR0hUX1NISUZUIEFkZGl0aXZlRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5SSUdIVF9TSElGVCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gVU5TSUdORURfUklHSFRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gTEVTUyBTaGlmdEV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTUyk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM1NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVIgU2hpZnRFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVIpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBMRVNTX0VRVUFMIFNoaWZ0RXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRVNTX0VRVUFMKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzU3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gR1JFQVRFUl9FUVVBTCBTaGlmdEV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uR1JFQVRFUl9FUVVBTCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM1OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlVHlwZSIpOworCQkJICAgIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uSU5TVEFOQ0VPRik7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM2MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gRVFVQUxfRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5FUVVBTF9FUVVBTCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM2MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gTk9UX0VRVUFMIFJlbGF0aW9uYWxFeHByZXNzaW9uIik7CisJCQkgICAgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTk9UX0VRVUFMKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzYzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBbmRFeHByZXNzaW9uIDo6PSBBbmRFeHByZXNzaW9uIEFORCBFcXVhbGl0eUV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzY1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiBYT1IgQW5kRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5YT1IpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uIE9SIEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUik7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM2OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gQU5EX0FORCBJbmNsdXNpdmVPckV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EX0FORCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIE9SX09SIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiIpOworCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUl9PUik7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM3MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiBRVUVTVElPTiBFeHByZXNzaW9uIENPTE9OLi4uIik7CisJCQkgICAgY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUVVFU1RJT05DT0xPTikgOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnQgOjo9IExlZnRIYW5kU2lkZSBBc3NpZ25tZW50T3BlcmF0b3IgQXNzaWdubWVudEV4cHJlc3Npb24iKTsKKwkJCSAgICBjb25zdW1lQXNzaWdubWVudCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnQgOjo9IEludmFsaWRBcnJheUluaXRpYWxpemVyQXNzaWduZW1lbnQiKTsKKwkJCSAgICBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpOyAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM3OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGVmdEhhbmRTaWRlIDo6PSBOYW1lIik7CisJCQkgICAgY29uc3VtZUxlZnRIYW5kU2lkZSgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzODIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRVFVQUwiKTsKKwkJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEVRVUFMKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzgzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1VTFRJUExZX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNVUxUSVBMWSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM4NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBESVZJREVfRVFVQUwiKTsKKwkJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKERJVklERSk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM4NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsKKwkJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJFTUFJTkRFUik7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM4NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBQTFVTX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihQTFVTKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzg3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE1JTlVTX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNSU5VUyk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBMRUZUX1NISUZUX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihMRUZUX1NISUZUKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgMzg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFJJR0hUX1NISUZUX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSSUdIVF9TSElGVCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDM5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCIpOworCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoVU5TSUdORURfUklHSFRfU0hJRlQpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzOTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gQU5EX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzOTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gWE9SX0VRVUFMIik7CisJCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihYT1IpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSAzOTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gT1JfRVFVQUwiKTsKKwkJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE9SKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNDAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9ub3B0IDo6PSIpOworCQkJICAgIGNvbnN1bWVFbXB0eUV4cHJlc3Npb24oKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNDA0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9Iik7CisJCQkgICAgY29uc3VtZUVtcHR5SW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDQwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zb3B0IDo6PSBJbXBvcnREZWNsYXJhdGlvbnMiKTsKKwkJCSAgICBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDQwNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDQwNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gVHlwZURlY2xhcmF0aW9ucyIpOworCQkJICAgIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICBjYXNlIDQwOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSIpOworCQkJICAgIGNvbnN1bWVFbXB0eUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA0MDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsKKwkJCSAgICBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSA0MTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyc29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRGVmYXVsdE1vZGlmaWVycygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA0MTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVyc29wdCA6Oj0gTW9kaWZpZXJzIik7CisJCQkgICAgY29uc3VtZU1vZGlmaWVycygpOyAgCisJCQkJYnJlYWsgOworCSAKKwkgICAgY2FzZSA0MTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50c29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlCbG9ja1N0YXRlbWVudHNvcHQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDQxNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGltc29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlEaW1zb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSA0MTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdG9wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNDIwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IDo6PSIpOworCQkJICAgIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSA0MjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDQyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyIpOworCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgIGNhc2UgNDI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXN0ZWRUeXBlIDo6PSIpOworCQkJICAgIGNvbnN1bWVOZXN0ZWRUeXBlKCk7ICAKKwkJCQlicmVhayA7CisJCisJICAgICBjYXNlIDQyNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ySW5pdG9wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlGb3JJbml0b3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSA0MjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclVwZGF0ZW9wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKTsgIAorCQkJCWJyZWFrIDsKKwkgCisJICAgICBjYXNlIDQzMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlc29wdCA6Oj0iKTsKKwkJCSAgICBjb25zdW1lRW1wdHlDYXRjaGVzb3B0KCk7ICAKKwkJCQlicmVhayA7CisJIAorCSAgICAgY2FzZSA0MzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5SW5pdGlhbGl6ZXJvcHQgOjo9Iik7CisJCQkgICAgY29uc3VtZUVtcHR5QXJyYXlJbml0aWFsaXplcm9wdCgpOyAgCisJCQkJYnJlYWsgOworCSAKKwkJfQorCX0gCisKKwkKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSB7CisJLy8gQXNzZXJ0U3RhdGVtZW50IDo6PSAnYXNzZXJ0JyBFeHByZXNzaW9uICc7JworCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlwdXNoT25Bc3RTdGFjayhuZXcgQXNzZXJ0U3RhdGVtZW50KGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsJCit9CisJCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uKCkgeworCS8vIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSAnOycKKworCUltcG9ydFJlZmVyZW5jZSBpbXB0ID0gKEltcG9ydFJlZmVyZW5jZSkgYXN0U3RhY2tbYXN0UHRyXTsKKwkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCisJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGVuZFN0YXRlbWVudFBvc2l0aW9uOworCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAKKwkJdGhpcy5mbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7IAorCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQlsYXN0Q2hlY2tQb2ludCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChpbXB0LCAwKTsKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOyAKKwkJLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCkgeworCS8vIFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUKKwkvKiBwdXNoIGFuIEltcG9ydFJlZiBidWlsZCBmcm9tIHRoZSBsYXN0IG5hbWUgCisJc3RvcmVkIGluIHRoZSBpZGVudGlmaWVyIHN0YWNrLiAqLworCisJSW1wb3J0UmVmZXJlbmNlIGltcHQ7CisJaW50IGxlbmd0aDsKKwljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0ci0tXV1bXTsKKwlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwlsb25nW10gcG9zaXRpb25zID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KGlkZW50aWZpZXJTdGFjaywgaWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKKwlTeXN0ZW0uYXJyYXljb3B5KGlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgcG9zaXRpb25zLCAwLCBsZW5ndGgpOworCXB1c2hPbkFzdFN0YWNrKGltcHQgPSBuZXcgSW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zLCBmYWxzZSkpOworCisJaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peworCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCX0gZWxzZSB7CisJCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBpbXB0LnNvdXJjZUVuZDsKKwl9CisJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJLy9lbmRQb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgOworCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQlsYXN0Q2hlY2tQb2ludCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQrMTsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoaW1wdCwgMCk7CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gdXNlZCB0byBhdm9pZCBicmFuY2hpbmcgYmFjayBpbnRvIHRoZSByZWd1bGFyIGF1dG9tYXRvbgkJCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudEJyZWFrKCkgeworCS8vIEJyZWFrU3RhdGVtZW50IDo6PSAnYnJlYWsnICc7JworCS8vIGJyZWFrIHB1c2hzIGEgcG9zaXRpb24gb24gaW50U3RhY2sgaW4gY2FzZSB0aGVyZSBpcyBubyBsYWJlbAorCisJcHVzaE9uQXN0U3RhY2sobmV3IEJyZWFrKG51bGwsIGludFN0YWNrW2ludFB0ci0tXSwgZW5kUG9zaXRpb24pKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpIHsKKwkvLyBCcmVha1N0YXRlbWVudCA6Oj0gJ2JyZWFrJyBJZGVudGlmaWVyICc7JworCS8vIGJyZWFrIHB1c2hzIGEgcG9zaXRpb24gb24gaW50U3RhY2sgaW4gY2FzZSB0aGVyZSBpcyBubyBsYWJlbAorCisJcHVzaE9uQXN0U3RhY2soCisJCW5ldyBCcmVhaygKKwkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyLS1dLAorCQkJaW50U3RhY2tbaW50UHRyLS1dLAorCQkJZW5kUG9zaXRpb24pKTsgCisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudENhdGNoKCkgeworCS8vIENhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICAgIEJsb2NrCisKKwkvL2NhdGNoIGFyZSBzdG9yZWQgZGlyZWN0bHkgaW50byB0aGUgVHJ5CisJLy9oYXMgdGhleSBhbHdheXMgY29tZXMgdHdvIGJ5IHR3by4uLi4KKwkvL3dlIHJlbW92ZSBvbmUgZW50cnkgZnJvbSB0aGUgYXN0bGVuZ3RoUHRyLgorCS8vVGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgdHJ5IHN0YXRlbWVudCBtdXN0CisJLy90aGVuIGZldGNoIHRoZSBjYXRjaGVzIHVzaW5nICAyKmkgYW5kIDIqaSArIDEKKworCWFzdExlbmd0aFB0ci0tOworCWxpc3RMZW5ndGggPSAwOyAvLyByZXNldCBmb3JtYWxQYXJhbWV0ZXIgY291bnRlciAoaW5jcmVtZW50ZWQgZm9yIGNhdGNoIHZhcmlhYmxlKQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudENvbnRpbnVlKCkgeworCS8vIENvbnRpbnVlU3RhdGVtZW50IDo6PSAnY29udGludWUnICc7JworCS8vIGNvbnRpbnVlIHB1c2hzIGEgcG9zaXRpb24gb24gaW50U3RhY2sgaW4gY2FzZSB0aGVyZSBpcyBubyBsYWJlbAorCisJcHVzaE9uQXN0U3RhY2soCisJCW5ldyBDb250aW51ZSgKKwkJCW51bGwsCisJCQlpbnRTdGFja1tpbnRQdHItLV0sCisJCQllbmRQb3NpdGlvbikpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudENvbnRpbnVlV2l0aExhYmVsKCkgeworCS8vIENvbnRpbnVlU3RhdGVtZW50IDo6PSAnY29udGludWUnIElkZW50aWZpZXIgJzsnCisJLy8gY29udGludWUgcHVzaHMgYSBwb3NpdGlvbiBvbiBpbnRTdGFjayBpbiBjYXNlIHRoZXJlIGlzIG5vIGxhYmVsCisKKwlwdXNoT25Bc3RTdGFjaygKKwkJbmV3IENvbnRpbnVlKAorCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV0sIAorCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCWVuZFBvc2l0aW9uKSk7IAorCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnREbygpIHsKKwkvLyBEb1N0YXRlbWVudCA6Oj0gJ2RvJyBTdGF0ZW1lbnQgJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgJzsnCisKKwkvL3RoZSAnd2hpbGUnIHB1c2hlcyBhIHZhbHVlIG9uIGludFN0YWNrIHRoYXQgd2UgbmVlZCB0byByZW1vdmUKKwlpbnRQdHItLTsKKworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisJU3RhdGVtZW50IGFjdGlvbiA9IChTdGF0ZW1lbnQpIGFzdFN0YWNrW2FzdFB0cl07CisJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50CisJCSYmIHByb2JsZW1SZXBvcnRlci5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA8PSBDb21waWxlck9wdGlvbnMuSkRLMV8zKSB7CisJCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwkJYXN0U3RhY2tbYXN0UHRyXSA9IAorCQkJbmV3IERvU3RhdGVtZW50KAorCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCQludWxsLCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFBvc2l0aW9uKTsgCisJfSBlbHNlIHsKKwkJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCQlhc3RTdGFja1thc3RQdHJdID0gCisJCQluZXcgRG9TdGF0ZW1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAorCQkJCWFjdGlvbiwgCisJCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCQllbmRQb3NpdGlvbik7IAorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCgpIHsKKwkvLyBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgJywnIFN0YXRlbWVudEV4cHJlc3Npb24KKwljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSB7CisJLy8gRm9yU3RhdGVtZW50IDo6PSAnZm9yJyAnKCcgRm9ySW5pdG9wdCAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnQKKwkvLyBGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyBFeHByZXNzaW9ub3B0ICc7JyBGb3JVcGRhdGVvcHQgJyknIFN0YXRlbWVudE5vU2hvcnRJZgorCisJaW50IGxlbmd0aDsKKwlFeHByZXNzaW9uIGNvbmQgPSBudWxsOworCVN0YXRlbWVudFtdIGluaXRzLCB1cGRhdGVzOworCVN0YXRlbWVudCBhY3Rpb247CisJYm9vbGVhbiBzY29wZSA9IHRydWU7CisKKwkvL3N0YXRlbWVudHMKKwlhc3RMZW5ndGhQdHItLTsgLy8gd2UgbmVlZCB0byBjb25zdW1lIGl0CisJYWN0aW9uID0gKFN0YXRlbWVudCkgYXN0U3RhY2tbYXN0UHRyLS1dOworCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudAorCQkmJiBwcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPD0gQ29tcGlsZXJPcHRpb25zLkpESzFfMykgeworCQlhY3Rpb24gPSBudWxsOworCX0KKworCS8vdXBkYXRlcyBhcmUgb24gdGhlIGV4cHJlc2lvbiBzdGFjaworCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pID09IDApIHsKKwkJdXBkYXRlcyA9IG51bGw7CisJfSBlbHNlIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlleHByZXNzaW9uU3RhY2ssIAorCQkJZXhwcmVzc2lvblB0ciArIDEsIAorCQkJdXBkYXRlcyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCisJCQkwLCAKKwkJCWxlbmd0aCk7IAorCX0KKworCWlmIChleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSAhPSAwKQorCQljb25kID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV07CisKKwkvL2luaXRzIG1heSBiZSBvbiB0d28gZGlmZmVyZW50IHN0YWNrcworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSA9PSAwKSB7CisJCWluaXRzID0gbnVsbDsKKwkJc2NvcGUgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAobGVuZ3RoID09IC0xKSB7IC8vb24gZXhwcmVzc2lvblN0YWNrCisJCQlzY29wZSA9IGZhbHNlOworCQkJbGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV07CisJCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJZXhwcmVzc2lvblN0YWNrLCAKKwkJCQlleHByZXNzaW9uUHRyICsgMSwgCisJCQkJaW5pdHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sIAorCQkJCTAsIAorCQkJCWxlbmd0aCk7IAorCQl9IGVsc2UgeyAvL29uIGFzdFN0YWNrCisJCQlhc3RQdHIgLT0gbGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlhc3RTdGFjaywgCisJCQkJYXN0UHRyICsgMSwgCisJCQkJaW5pdHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aF0sIAorCQkJCTAsIAorCQkJCWxlbmd0aCk7IAorCQl9CisJfTsKKwlpZiAoYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spIHsKKwkJcHVzaE9uQXN0U3RhY2soCisJCQluZXcgRm9yU3RhdGVtZW50KAorCQkJCWluaXRzLCAKKwkJCQljb25kLCAKKwkJCQl1cGRhdGVzLCAKKwkJCQlhY3Rpb24sIAorCQkJCXNjb3BlLCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKSk7IAorCX0gZWxzZSB7CisJCXB1c2hPbkFzdFN0YWNrKAorCQkJbmV3IEZvclN0YXRlbWVudCgKKwkJCQlpbml0cywgCisJCQkJY29uZCwgCisJCQkJdXBkYXRlcywgCisJCQkJYWN0aW9uLCAKKwkJCQlzY29wZSwgCisJCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCQllbmRQb3NpdGlvbikpOyAKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKSB7CisJLy8gSWZUaGVuU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50CisKKwkvL29wdGltaXplIHRoZSBwdXNoL3BvcAorCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIGFzdFN0YWNrW2FzdFB0cl07CisJaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9jaykgeworCQlhc3RTdGFja1thc3RQdHJdID0gCisJCQluZXcgSWZTdGF0ZW1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAorCQkJCXRoZW5TdGF0ZW1lbnQsIAorCQkJCWludFN0YWNrW2ludFB0ci0tXSwgCisJCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwl9IGVsc2UgaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkgeworCQlhc3RTdGFja1thc3RQdHJdID0gCisJCQluZXcgSWZTdGF0ZW1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAorCQkJCUJsb2NrLk5vbmUsIAorCQkJCWludFN0YWNrW2ludFB0ci0tXSwgCisJCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwl9IGVsc2UgeworCQlhc3RTdGFja1thc3RQdHJdID0gCisJCQluZXcgSWZTdGF0ZW1lbnQoCisJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAorCQkJCXRoZW5TdGF0ZW1lbnQsIAorCQkJCWludFN0YWNrW2ludFB0ci0tXSwgCisJCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpIHsKKwkvLyBJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyBTdGF0ZW1lbnQKKwkvLyBJZlRoZW5FbHNlU3RhdGVtZW50Tm9TaG9ydElmIDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyBTdGF0ZW1lbnROb1Nob3J0SWYKKworCWFzdExlbmd0aFB0ci0tOyAvLyBvcHRpbWl6ZWQgey4uLiwgVGhlbiwgRWxzZSB9ID09PiB7Li4uLCBJZiB9CisJZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisJU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBhc3RTdGFja1thc3RQdHItLV07CisJU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBhc3RTdGFja1thc3RQdHJdOworCWlmIChlbHNlU3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHsKKwkJZWxzZVN0YXRlbWVudCA9IEJsb2NrLk5vbmU7CisJfQorCWlmICh0aGVuU3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHsKKwkJdGhlblN0YXRlbWVudCA9IEJsb2NrLk5vbmU7CisJfQorCWlmIChlbHNlU3RhdGVtZW50IGluc3RhbmNlb2YgQmxvY2spIHsKKwkJYXN0U3RhY2tbYXN0UHRyXSA9IAorCQkJbmV3IElmU3RhdGVtZW50KAorCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCQl0aGVuU3RhdGVtZW50LCAKKwkJCQllbHNlU3RhdGVtZW50LCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJfSBlbHNlIHsKKwkJYXN0U3RhY2tbYXN0UHRyXSA9IAorCQkJbmV3IElmU3RhdGVtZW50KAorCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCQl0aGVuU3RhdGVtZW50LCAKKwkJCQllbHNlU3RhdGVtZW50LCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudExhYmVsKCkgeworCS8vIExhYmVsZWRTdGF0ZW1lbnQgOjo9ICdJZGVudGlmaWVyJyAnOicgU3RhdGVtZW50CisJLy8gTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ0lkZW50aWZpZXInICc6JyBTdGF0ZW1lbnROb1Nob3J0SWYKKworCS8vb3B0aW1pemUgcHVzaC9wb3AKKworCVN0YXRlbWVudCBzdG10ID0gKFN0YXRlbWVudCkgYXN0U3RhY2tbYXN0UHRyXTsKKwlpZiAoc3RtdCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSB7CisJCWFzdFN0YWNrW2FzdFB0cl0gPSAKKwkJCW5ldyBMYWJlbGVkU3RhdGVtZW50KAorCQkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCisJCQkJQmxvY2suTm9uZSwgCisJCQkJKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV0gPj4+IDMyKSwgCisJCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwl9IGVsc2UgeworCQlhc3RTdGFja1thc3RQdHJdID0gCisJCQluZXcgTGFiZWxlZFN0YXRlbWVudCgKKwkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCXN0bXQsIAorCQkJCShpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dID4+PiAzMiksIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJfQorCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSB7CisJLy8gUmV0dXJuU3RhdGVtZW50IDo6PSAncmV0dXJuJyBFeHByZXNzaW9ub3B0ICc7JworCS8vIHJldHVybiBwdXNocyBhIHBvc2l0aW9uIG9uIGludFN0YWNrIGluIGNhc2UgdGhlcmUgaXMgbm8gZXhwcmVzc2lvbgorCisJaWYgKGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dICE9IDApIHsKKwkJcHVzaE9uQXN0U3RhY2soCisJCQluZXcgUmV0dXJuU3RhdGVtZW50KAorCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFBvc2l0aW9uKQorCQkpOworCX0gZWxzZSB7CisJCXB1c2hPbkFzdFN0YWNrKG5ldyBSZXR1cm5TdGF0ZW1lbnQobnVsbCwgaW50U3RhY2tbaW50UHRyLS1dLCBlbmRQb3NpdGlvbikpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRTd2l0Y2goKSB7CisJLy8gU3dpdGNoU3RhdGVtZW50IDo6PSAnc3dpdGNoJyBPcGVuQmxvY2sgJygnIEV4cHJlc3Npb24gJyknIFN3aXRjaEJsb2NrCisKKwkvL09wZW5CbG9jayBqdXN0IG1ha2VzIHRoZSBzZW1hbnRpYyBhY3Rpb24gYmxvY2tTdGFydCgpCisJLy90aGUgYmxvY2sgaXMgaW5saW5lZCBidXQgYSBzY29wZSBuZWVkIHRvIGJlIGNyZWF0ZWQKKwkvL2lmIHNvbWUgZGVjbGFyYXRpb24gb2NjdXJzLgorCisJaW50IGxlbmd0aDsKKwlTd2l0Y2hTdGF0ZW1lbnQgcyA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnQoKTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJcy50ZXN0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dOworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWFzdFB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlhc3RTdGFjaywgCisJCQlhc3RQdHIgKyAxLCAKKwkJCXMuc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCisJCQkwLCAKKwkJCWxlbmd0aCk7IAorCX0KKwlzLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyLS1dOworCXB1c2hPbkFzdFN0YWNrKHMpOworCWludFB0ci0tOyAvLyBiZWNhdXNlIG9mIE9wZW5CbG9jaworCXMuc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJcy5zb3VyY2VFbmQgPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbjsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKSB7CisJLy8gU3luY2hyb25pemVkU3RhdGVtZW50IDo6PSBPbmx5U3luY2hyb25pemVkICcoJyBFeHByZXNzaW9uICcpJyBCbG9jaworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwlpZiAoYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyXSA9PSAwKSB7CisJCWFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0cl0gPSAxOworCQlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJCWFzdFN0YWNrWysrYXN0UHRyXSA9IAorCQkJbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCgKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSwgCisJCQkJQmxvY2suTm9uZSwgCisJCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCQllbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAorCX0gZWxzZSB7CisJCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwkJYXN0U3RhY2tbYXN0UHRyXSA9IAorCQkJbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCgKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSwgCisJCQkJKEJsb2NrKSBhc3RTdGFja1thc3RQdHJdLCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJfQorCXJlc2V0TW9kaWZpZXJzKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50VGhyb3coKSB7CisJLy8gVGhyb3dTdGF0ZW1lbnQgOjo9ICd0aHJvdycgRXhwcmVzc2lvbiAnOycKKwlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJcHVzaE9uQXN0U3RhY2sobmV3IFRocm93U3RhdGVtZW50KGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCBpbnRTdGFja1tpbnRQdHItLV0pKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRUcnkoYm9vbGVhbiB3aXRoRmluYWxseSkgeworCS8vVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgQmxvY2sgQ2F0Y2hlcworCS8vVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgQmxvY2sgQ2F0Y2hlc29wdCBGaW5hbGx5CisKKwlpbnQgbGVuZ3RoOworCVRyeVN0YXRlbWVudCB0cnlTdG10ID0gbmV3IFRyeVN0YXRlbWVudCgpOworCS8vZmluYWxseQorCWlmICh3aXRoRmluYWxseSkgeworCQlhc3RMZW5ndGhQdHItLTsKKwkJdHJ5U3RtdC5maW5hbGx5QmxvY2sgPSAoQmxvY2spIGFzdFN0YWNrW2FzdFB0ci0tXTsKKwl9CisJLy9jYXRjaGVzIGFyZSBoYW5kbGUgYnkgdHdvIDxhcmd1bWVudC1ibG9jaz4gW3NlZSBzdGF0ZW1lbnRDYXRjaF0KKwlpZiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkgeworCQlpZiAobGVuZ3RoID09IDEpIHsKKwkJCXRyeVN0bXQuY2F0Y2hCbG9ja3MgPSBuZXcgQmxvY2tbXSB7KEJsb2NrKSBhc3RTdGFja1thc3RQdHItLV19OworCQkJdHJ5U3RtdC5jYXRjaEFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFtdIHsoQXJndW1lbnQpIGFzdFN0YWNrW2FzdFB0ci0tXX07CisJCX0gZWxzZSB7CisJCQlCbG9ja1tdIGJrcyA9ICh0cnlTdG10LmNhdGNoQmxvY2tzID0gbmV3IEJsb2NrW2xlbmd0aF0pOworCQkJQXJndW1lbnRbXSBhcmdzID0gKHRyeVN0bXQuY2F0Y2hBcmd1bWVudHMgPSBuZXcgQXJndW1lbnRbbGVuZ3RoXSk7CisJCQl3aGlsZSAobGVuZ3RoLS0gPiAwKSB7CisJCQkJYmtzW2xlbmd0aF0gPSAoQmxvY2spIGFzdFN0YWNrW2FzdFB0ci0tXTsKKwkJCQlhcmdzW2xlbmd0aF0gPSAoQXJndW1lbnQpIGFzdFN0YWNrW2FzdFB0ci0tXTsKKwkJCX0KKwkJfQorCX0KKwkvL3RyeQorCWFzdExlbmd0aFB0ci0tOworCXRyeVN0bXQudHJ5QmxvY2sgPSAoQmxvY2spIGFzdFN0YWNrW2FzdFB0ci0tXTsKKworCS8vcG9zaXRpb25zCisJdHJ5U3RtdC5zb3VyY2VFbmQgPSBlbmRTdGF0ZW1lbnRQb3NpdGlvbjsKKwl0cnlTdG10LnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCXB1c2hPbkFzdFN0YWNrKHRyeVN0bXQpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudFdoaWxlKCkgeworCS8vIFdoaWxlU3RhdGVtZW50IDo6PSAnd2hpbGUnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnQKKwkvLyBXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmCisKKwlTdGF0ZW1lbnQgYWN0aW9uID0gKFN0YXRlbWVudCkgYXN0U3RhY2tbYXN0UHRyXTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEJsb2NrKSB7CisJCWFzdFN0YWNrW2FzdFB0cl0gPSAKKwkJCW5ldyBXaGlsZVN0YXRlbWVudCgKKwkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSwgCisJCQkJYWN0aW9uLCAKKwkJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJCWVuZFN0YXRlbWVudFBvc2l0aW9uKTsgCisJfSBlbHNlIHsKKwkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50CisJCQkmJiBwcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPD0gQ29tcGlsZXJPcHRpb25zLkpESzFfMykgeworCQkJYXN0U3RhY2tbYXN0UHRyXSA9IAorCQkJCW5ldyBXaGlsZVN0YXRlbWVudCgKKwkJCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAorCQkJCQludWxsLCAKKwkJCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCQkJZW5kUG9zaXRpb24pOyAKKwkJfSBlbHNlIHsKKwkJCWFzdFN0YWNrW2FzdFB0cl0gPSAKKwkJCQluZXcgV2hpbGVTdGF0ZW1lbnQoCisJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCQkJYWN0aW9uLCAKKwkJCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKKwkJCQkJZW5kUG9zaXRpb24pOyAKKwkJfQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpIHsKKwkvLyBTdGF0aWNJbml0aWFsaXplciA6Oj0gIFN0YXRpY09ubHkgQmxvY2sKKwkvL3B1c2ggYW4gSW5pdGlhbGl6ZXIKKwkvL29wdGltaXplIHRoZSBwdXNoL3BvcAorCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gbmV3IEluaXRpYWxpemVyKChCbG9jaykgYXN0U3RhY2tbYXN0UHRyXSwgQWNjU3RhdGljKTsKKwlhc3RTdGFja1thc3RQdHJdID0gaW5pdGlhbGl6ZXI7CisJaW5pdGlhbGl6ZXIuc291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CQorCWluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hBbm5vdGF0aW9uc0RlZmluZWRQcmlvclRvKGVuZFN0YXRlbWVudFBvc2l0aW9uKTsKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0gLS07CisJaW5pdGlhbGl6ZXIuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSBpbml0aWFsaXplci5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoaW5pdGlhbGl6ZXIsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY09ubHkoKSB7CisJLy8gU3RhdGljT25seSA6Oj0gJ3N0YXRpYycKKwlpbnQgc2F2ZWRNb2RpZmllcnNTb3VyY2VTdGFydCA9IG1vZGlmaWVyc1NvdXJjZVN0YXJ0OworCWNoZWNrQW5ub3RhdGlvbigpOyAvLyBtaWdodCB1cGRhdGUgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0CisJaWYgKG1vZGlmaWVyc1NvdXJjZVN0YXJ0ID49IHNhdmVkTW9kaWZpZXJzU291cmNlU3RhcnQpIHsKKwkJbW9kaWZpZXJzU291cmNlU3RhcnQgPSBzYXZlZE1vZGlmaWVyc1NvdXJjZVN0YXJ0OworCX0KKwlwdXNoT25JbnRTdGFjaygKKwkJbW9kaWZpZXJzU291cmNlU3RhcnQgPj0gMCA/IG1vZGlmaWVyc1NvdXJjZVN0YXJ0IDogc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwlqdW1wT3Zlck1ldGhvZEJvZHkoKTsKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0rKzsKKwlyZXNldE1vZGlmaWVycygpOworCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CisJCXJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPSBpbnRTdGFja1tpbnRQdHJdOyAvLyByZW1lbWJlciBzdGFydCBwb3NpdGlvbiBvbmx5IGZvciBzdGF0aWMgaW5pdGlhbGl6ZXJzCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN3aXRjaEJsb2NrKCkgeworCS8vIFN3aXRjaEJsb2NrIDo6PSAneycgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaExhYmVscyAnfScKKwljb25jYXROb2RlTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudCgpIHsKKwkvLyBTd2l0Y2hCbG9ja1N0YXRlbWVudCA6Oj0gU3dpdGNoTGFiZWxzIEJsb2NrU3RhdGVtZW50cworCWNvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN3aXRjaEJsb2NrU3RhdGVtZW50cygpIHsKKwkvLyBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hCbG9ja1N0YXRlbWVudAorCWNvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN3aXRjaExhYmVscygpIHsKKwkvLyBTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbAorCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVRva2VuKGludCB0eXBlKSB7CisJLyogcmVtZW1iZXIgdGhlIGxhc3QgY29uc3VtZWQgdmFsdWUgKi8KKwkvKiB0cnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBidWlsZCB2YWx1ZXMgKi8KKwlpZiAoc2Nhbm5lci53YXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKSB7CisJCVN0cmluZ0xpdGVyYWxbXSBsaXRlcmFscyA9IHRoaXMuc2Nhbm5lci5ub25OTFNTdHJpbmdzOworCQkvLyBjb3VsZCBub3QgcmVwcm9kdWNlLCBidXQgdGhpcyBpcyB0aGUgb25seSBOUEUKKwkJLy8gYWRkZWQgcHJldmVudGl2ZSBudWxsIGNoZWNrIHNlZSBQUiA5MDM1CisJCWlmIChsaXRlcmFscyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbGl0ZXJhbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKGxpdGVyYWxzW2ldKTsKKwkJCX0KKwkJfQorCQlzY2FubmVyLmN1cnJlbnRMaW5lID0gbnVsbDsKKwkJc2Nhbm5lci53YXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gZmFsc2U7CisJfQorCS8vIGNsZWFyIHRoZSBjb21tZW50UHRyIG9mIHRoZSBzY2FubmVyIGluIGNhc2Ugd2UgcmVhZCBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gYSBtb2RpZmllcgorCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgVG9rZW5OYW1lYWJzdHJhY3QgOgorCQljYXNlIFRva2VuTmFtZXN0cmljdGZwIDoKKwkJY2FzZSBUb2tlbk5hbWVmaW5hbCA6CisJCWNhc2UgVG9rZW5OYW1lbmF0aXZlIDoKKwkJY2FzZSBUb2tlbk5hbWVwcml2YXRlIDoKKwkJY2FzZSBUb2tlbk5hbWVwcm90ZWN0ZWQgOgorCQljYXNlIFRva2VuTmFtZXB1YmxpYyA6CisJCWNhc2UgVG9rZW5OYW1ldHJhbnNpZW50IDoKKwkJY2FzZSBUb2tlbk5hbWV2b2xhdGlsZSA6CisJCWNhc2UgVG9rZW5OYW1lc3RhdGljIDoKKwkJY2FzZSBUb2tlbk5hbWVzeW5jaHJvbml6ZWQgOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwl9CisJLy9TeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci50b1N0cmluZ0FjdGlvbih0eXBlKSk7CisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllciA6CisJCQlwdXNoSWRlbnRpZmllcigpOworCQkJaWYgKHNjYW5uZXIudXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyKSB7CisJCQkJbG9uZyBwb3NpdGlvbnMgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXTsKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS51c2VBc3NlcnRBc0FuSWRlbnRpZmllcigoaW50KSAocG9zaXRpb25zID4+PiAzMiksIChpbnQpIHBvc2l0aW9ucyk7CisJCQl9CisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZWludGVyZmFjZSA6CisJCQlhZGp1c3RJbnRlcmZhY2VNb2RpZmllcnMoKTsKKwkJCS8vJ2NsYXNzJyBpcyBwdXNoaW5nIHR3byBpbnQgKHBvc2l0aW9ucykgb24gdGhlIHN0YWNrID09PiAnaW50ZXJmYWNlJyBuZWVkcyB0byBkbyBpdCB0b28uLi4uCisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLnN0YXJ0UG9zaXRpb24pOworCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsJCQkKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lYWJzdHJhY3QgOgorCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjQWJzdHJhY3QpOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lc3RyaWN0ZnAgOgorCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjU3RyaWN0ZnApOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lZmluYWwgOgorCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjRmluYWwpOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lbmF0aXZlIDoKKwkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY05hdGl2ZSk7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVwcml2YXRlIDoKKwkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY1ByaXZhdGUpOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lcHJvdGVjdGVkIDoKKwkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY1Byb3RlY3RlZCk7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVwdWJsaWMgOgorCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjUHVibGljKTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZXRyYW5zaWVudCA6CisJCQljaGVja0FuZFNldE1vZGlmaWVycyhBY2NUcmFuc2llbnQpOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1ldm9sYXRpbGUgOgorCQkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjVm9sYXRpbGUpOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lc3RhdGljIDoKKwkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY1N0YXRpYyk7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVzeW5jaHJvbml6ZWQgOgorCQkJdGhpcy5zeW5jaHJvbml6ZWRCbG9ja1NvdXJjZVN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwkKKwkJCWNoZWNrQW5kU2V0TW9kaWZpZXJzKEFjY1N5bmNocm9uaXplZCk7CisJCQlicmVhazsKKwkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWNhc2UgVG9rZW5OYW1ldm9pZCA6CisJCQlwdXNoSWRlbnRpZmllcigtVF92b2lkKTsKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQorCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCQkvL3B1c2ggYSBkZWZhdWx0IGRpbWVuc2lvbiB3aGlsZSB2b2lkIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcmltaXRpdmUKKwkJCS8vZGVjbGFyYXRpb24gYmFzZVR5cGUgYW5kIHNvIHRha2VzIHRoZSBwbGFjZSBvZiBhIHR5cGUgd2l0aG91dCBnZXR0aW5nIGludG8KKwkJCS8vcmVndWxhciB0eXBlIHBhcnNpbmcgdGhhdCBnZW5lcmF0ZXMgYSBkaW1lbnNpb24gb24gaW50U3RhY2sKKwkJY2FzZSBUb2tlbk5hbWVib29sZWFuIDoKKwkJCXB1c2hJZGVudGlmaWVyKC1UX2Jvb2xlYW4pOworCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsJCQkJCisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLnN0YXJ0UG9zaXRpb24pOwkJCisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZWJ5dGUgOgorCQkJcHVzaElkZW50aWZpZXIoLVRfYnl0ZSk7CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CQkJCQkKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lY2hhciA6CisJCQlwdXNoSWRlbnRpZmllcigtVF9jaGFyKTsKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQorCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVkb3VibGUgOgorCQkJcHVzaElkZW50aWZpZXIoLVRfZG91YmxlKTsKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQorCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVmbG9hdCA6CisJCQlwdXNoSWRlbnRpZmllcigtVF9mbG9hdCk7CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CQkJCQkKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1laW50IDoKKwkJCXB1c2hJZGVudGlmaWVyKC1UX2ludCk7CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CQkJCQkKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lbG9uZyA6CisJCQlwdXNoSWRlbnRpZmllcigtVF9sb25nKTsKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7CQkJCQorCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsJCQkJCQorCQkJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVzaG9ydCA6CisJCQlwdXNoSWRlbnRpZmllcigtVF9zaG9ydCk7CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOwkJCQkKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CQkJCQkKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljYXNlIFRva2VuTmFtZUludGVnZXJMaXRlcmFsIDoKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJCQluZXcgSW50TGl0ZXJhbCgKKwkJCQkJc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwgCisJCQkJCXNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCisJCQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOyAKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lTG9uZ0xpdGVyYWwgOgorCQkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKAorCQkJCW5ldyBMb25nTGl0ZXJhbCgKKwkJCQkJc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSwgCisJCQkJCXNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCisJCQkJCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSkpOyAKKwkJCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWwgOgorCQkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKAorCQkJCW5ldyBGbG9hdExpdGVyYWwoCisJCQkJCXNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCksIAorCQkJCQlzY2FubmVyLnN0YXJ0UG9zaXRpb24sIAorCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZURvdWJsZUxpdGVyYWwgOgorCQkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKAorCQkJCW5ldyBEb3VibGVMaXRlcmFsKAorCQkJCQlzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpLCAKKwkJCQkJc2Nhbm5lci5zdGFydFBvc2l0aW9uLCAKKwkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7IAorCQkJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsIDoKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJCQluZXcgQ2hhckxpdGVyYWwoCisJCQkJCXNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCksIAorCQkJCQlzY2FubmVyLnN0YXJ0UG9zaXRpb24sIAorCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZVN0cmluZ0xpdGVyYWwgOgorCQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gbmV3IFN0cmluZ0xpdGVyYWwoCisJCQkJCXNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCksIAorCQkJCQlzY2FubmVyLnN0YXJ0UG9zaXRpb24sIAorCQkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjayhzdHJpbmdMaXRlcmFsKTsgCisJCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZWZhbHNlIDoKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJCQluZXcgRmFsc2VMaXRlcmFsKHNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKSk7IAorCQkJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWV0cnVlIDoKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJCQluZXcgVHJ1ZUxpdGVyYWwoc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVudWxsIDoKKwkJCXB1c2hPbkV4cHJlc3Npb25TdGFjaygKKwkJCQluZXcgTnVsbExpdGVyYWwoc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpKTsgCisJCQlicmVhazsKKwkJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljYXNlIFRva2VuTmFtZXN1cGVyIDoKKwkJY2FzZSBUb2tlbk5hbWV0aGlzIDoKKwkJCWVuZFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZWFzc2VydCA6CisJCWNhc2UgVG9rZW5OYW1laW1wb3J0IDoKKwkJY2FzZSBUb2tlbk5hbWVwYWNrYWdlIDoKKwkJY2FzZSBUb2tlbk5hbWV0aHJvdyA6CisJCWNhc2UgVG9rZW5OYW1lbmV3IDoKKwkJY2FzZSBUb2tlbk5hbWVkbyA6CisJCWNhc2UgVG9rZW5OYW1laWYgOgorCQljYXNlIFRva2VuTmFtZWZvciA6CisJCWNhc2UgVG9rZW5OYW1lc3dpdGNoIDoKKwkJY2FzZSBUb2tlbk5hbWV0cnkgOgorCQljYXNlIFRva2VuTmFtZXdoaWxlIDoKKwkJY2FzZSBUb2tlbk5hbWVicmVhayA6CisJCWNhc2UgVG9rZW5OYW1lY29udGludWUgOgorCQljYXNlIFRva2VuTmFtZXJldHVybiA6CisJCWNhc2UgVG9rZW5OYW1lY2FzZSA6CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLnN0YXJ0UG9zaXRpb24pOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lY2xhc3MgOgorCQkJcHVzaE9uSW50U3RhY2soc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVkZWZhdWx0IDoKKwkJCXB1c2hPbkludFN0YWNrKHNjYW5uZXIuc3RhcnRQb3NpdGlvbik7CisJCQlwdXNoT25JbnRTdGFjayhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJYnJlYWs7CisJCQkvL2xldCBleHRyYSBzZW1hbnRpYyBhY3Rpb24gZGVjaWRlIHdoZW4gdG8gcHVzaAorCQljYXNlIFRva2VuTmFtZVJCUkFDS0VUIDoKKwkJY2FzZSBUb2tlbk5hbWVQTFVTIDoKKwkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6CisJCWNhc2UgVG9rZW5OYW1lTk9UIDoKKwkJY2FzZSBUb2tlbk5hbWVUV0lERExFIDoKKwkJCWVuZFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lUExVU19QTFVTIDoKKwkJY2FzZSBUb2tlbk5hbWVNSU5VU19NSU5VUyA6CisJCQllbmRQb3NpdGlvbiA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCWVuZFN0YXRlbWVudFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lUkJSQUNFOgorCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6CisJCQllbmRTdGF0ZW1lbnRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCWVuZFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsgCisJCQkvL3RoZSBpdGVtIGlzIG5vdCBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgZnV0dXIgZXhwcmVzc2lvbi9zdGF0ZW1lbnQKKwkJCWJyZWFrOworCQkJLy8gaW4gb3JkZXIgdG8gaGFuZGxlICggZXhwcmVzc2lvbikgLy8vLy8vIChjYXN0KWV4cHJlc3Npb24vLy8vLyBmb28oeCkKKwkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOgorCQkJclBhcmVuUG9zID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOyAvLyBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHJpZ2h0IHBhcmVudGhlc2lzIChpbiBjYXNlIG9mIHVuaWNvZGUgXHUwMDI5KSBsZXgwMDEwMQorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lTFBBUkVOIDoKKwkJCWxQYXJlblBvcyA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCWJyZWFrOworCQkJLy8gIGNhc2UgVG9rZW5OYW1lUVVFU1RJT04gIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUNPTU1BIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUNPTE9OICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVFUVVBTCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lTEJSQUNLRVQgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZURPVCA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVFUlJPUiA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVFT0YgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZWNhc2UgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZWNhdGNoICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVlbHNlICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVleHRlbmRzICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVmaW5hbGx5ICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWV0aHJvd3MgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZWluc3RhbmNlb2YgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVOT1RfRVFVQUwgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlQgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVQTFVTX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZURJVklERV9FUVVBTCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVPUl9FUVVBTCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lT1JfT1IgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUFORF9BTkQgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZVJFTUFJTkRFUiA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVYT1IgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZUFORCAgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOgorCQkJLy8gIGNhc2UgVG9rZW5OYW1lT1IgIDoKKwkJCS8vICBjYXNlIFRva2VuTmFtZURJVklERSA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVHUkVBVEVSICA6CisJCQkvLyAgY2FzZSBUb2tlbk5hbWVMRVNTICA6CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVEZWNsYXJhdGlvbnMoKSB7CisJLy8gVHlwZURlY2xhcmF0aW9ucyA6Oj0gVHlwZURlY2xhcmF0aW9ucyBUeXBlRGVjbGFyYXRpb24KKwljb25jYXROb2RlTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zb3B0KCkgeworCS8vIFR5cGVEZWNsYXJhdGlvbnNvcHQgOjo9IFR5cGVEZWNsYXJhdGlvbnMKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCWFzdFB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoYXN0U3RhY2ssIGFzdFB0ciArIDEsIGNvbXBpbGF0aW9uVW5pdC50eXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24oKSB7CisJLy8gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24gOjo9IFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSAnOycKKworCUltcG9ydFJlZmVyZW5jZSBpbXB0ID0gKEltcG9ydFJlZmVyZW5jZSkgYXN0U3RhY2tbYXN0UHRyXTsKKwkvLyBmbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGltcG9ydCBzdGF0ZW1lbnRzCisJaW1wdC5kZWNsYXJhdGlvbkVuZCA9IGVuZFN0YXRlbWVudFBvc2l0aW9uOworCWltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAKKwkJdGhpcy5mbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7IAorCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgeworCQlsYXN0Q2hlY2tQb2ludCA9IGltcHQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgKyAxOworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChpbXB0LCAwKTsKKwkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQkvLyB1c2VkIHRvIGF2b2lkIGJyYW5jaGluZyBiYWNrIGludG8gdGhlIHJlZ3VsYXIgYXV0b21hdG9uCisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpIHsKKwkvLyBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUgJy4nICcqJworCS8qIHB1c2ggYW4gSW1wb3J0UmVmIGJ1aWxkIGZyb20gdGhlIGxhc3QgbmFtZSAKKwlzdG9yZWQgaW4gdGhlIGlkZW50aWZpZXIgc3RhY2suICovCisKKwlJbXBvcnRSZWZlcmVuY2UgaW1wdDsKKwlpbnQgbGVuZ3RoOworCWNoYXJbXVtdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyLS1dXVtdOworCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCBwb3NpdGlvbnMsIDAsIGxlbmd0aCk7CisJcHVzaE9uQXN0U3RhY2soaW1wdCA9IG5ldyBJbXBvcnRSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMsIHRydWUpKTsKKworCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKXsKKwkJaW1wdC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwl9IGVsc2UgeworCQlpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kID0gaW1wdC5zb3VyY2VFbmQ7CisJfQorCWltcHQuZGVjbGFyYXRpb25FbmQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kOworCS8vZW5kUG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIDsKKwlpbXB0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisKKwkvLyByZWNvdmVyeQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKXsKKwkJbGFzdENoZWNrUG9pbnQgPSBpbXB0LmRlY2xhcmF0aW9uU291cmNlRW5kKzE7CisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGltcHQsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7IC8vIHVzZWQgdG8gYXZvaWQgYnJhbmNoaW5nIGJhY2sgaW50byB0aGUgcmVndWxhciBhdXRvbWF0b24JCQorCX0JCit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVW5hcnlFeHByZXNzaW9uKGludCBvcCkgeworCS8vIFVuYXJ5RXhwcmVzc2lvbiA6Oj0gJysnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKwkvLyBVbmFyeUV4cHJlc3Npb24gOjo9ICctJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisJLy8gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSAnficgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorCS8vIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gJyEnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwkvL2hhbmRsZSBtYW51YWxseSB0aGUgLTIxNDc0ODM2NDggd2hpbGUgaXQgaXMgbm90IGEgcmVhbAorCS8vY29tcHV0YXRpb24gb2YgYW4gLSBhbmQgMjE0NzQ4MzY0OCAobm90aWNlIHRoYXQgMjE0NzQ4MzY0OAorCS8vaXMgSW50ZWdlci5NQVhfVkFMVUUrMS4uLi4uKQorCS8vU2FtZSBmb3IgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMIC4uLi4uLi4uLi4uLgorCisJLy9pbnRTdGFjayBoYXZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3BlcmF0b3IKKworCUV4cHJlc3Npb24gciwgZXhwID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCWlmIChvcCA9PSBNSU5VUykgeworCQlpZiAoKGV4cCBpbnN0YW5jZW9mIEludExpdGVyYWwpICYmICgoKEludExpdGVyYWwpIGV4cCkubWF5UmVwcmVzZW50TUlOX1ZBTFVFKCkpKSB7CisJCQlyID0gZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gbmV3IEludExpdGVyYWxNaW5WYWx1ZSgpOworCQl9IGVsc2UgeworCQkJaWYgKChleHAgaW5zdGFuY2VvZiBMb25nTGl0ZXJhbCkgJiYgKCgoTG9uZ0xpdGVyYWwpIGV4cCkubWF5UmVwcmVzZW50TUlOX1ZBTFVFKCkpKSB7CisJCQkJciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlKCk7CisJCQl9IGVsc2UgeworCQkJCXIgPSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBuZXcgVW5hcnlFeHByZXNzaW9uKGV4cCwgb3ApOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IG5ldyBVbmFyeUV4cHJlc3Npb24oZXhwLCBvcCk7CisJfQorCXIuc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJci5zb3VyY2VFbmQgPSBleHAuc291cmNlRW5kOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihpbnQgb3AsIGJvb2xlYW4gcG9zdCkgeworCS8vIFByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9ICcrKycgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorCS8vIFByZURlY3JlbWVudEV4cHJlc3Npb24gOjo9ICctLScgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorCisJLy8gKysgYW5kIC0tIG9wZXJhdG9ycworCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCisKKwkvL2ludFN0YWNrIGhhcyB0aGUgcG9zaXRpb24gb2YgdGhlIG9wZXJhdG9yIHdoZW4gcHJlZml4CisKKwlFeHByZXNzaW9uIGxlZnRIYW5kU2lkZSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwlpZiAobGVmdEhhbmRTaWRlIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7CisJCS8vICsrZm9vKCkrKyBpcyB1bnZhbGlkIAorCQlpZiAocG9zdCkgeworCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID0gCisJCQkJbmV3IFBvc3RmaXhFeHByZXNzaW9uKAorCQkJCQlsZWZ0SGFuZFNpZGUsCisJCQkJCUludExpdGVyYWwuT25lLAorCQkJCQlvcCwKKwkJCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKKwkJfSBlbHNlIHsKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IAorCQkJCW5ldyBQcmVmaXhFeHByZXNzaW9uKAorCQkJCQlsZWZ0SGFuZFNpZGUsCisJCQkJCUludExpdGVyYWwuT25lLAorCQkJCQlvcCwKKwkJCQkJaW50U3RhY2tbaW50UHRyLS1dKTsgCisJCX0KKwl9IGVsc2UgeworCQkvL3RoZSArKyBvciB0aGUgLS0gaXMgTk9UIHRha2VuIGludG8gYWNjb3VudCBpZiBjb2RlIGdlbiBwcm9jZWVkcworCQlpZiAoIXBvc3QpIHsKKwkJCWludFB0ci0tOworCQl9CisJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRVbmFyeUV4cHJlc3Npb24obGVmdEhhbmRTaWRlKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVmFyaWFibGVEZWNsYXJhdG9ycygpIHsKKwkvLyBWYXJpYWJsZURlY2xhcmF0b3JzIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JzICcsJyBWYXJpYWJsZURlY2xhcmF0b3IKKwlvcHRpbWl6ZWRDb25jYXROb2RlTGlzdHMoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVWYXJpYWJsZUluaXRpYWxpemVycygpIHsKKwkvLyBWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcnMgJywnIFZhcmlhYmxlSW5pdGlhbGl6ZXIKKwljb25jYXRFeHByZXNzaW9uTGlzdHMoKTsKK30KK3Byb3RlY3RlZCBUeXBlUmVmZXJlbmNlIGNvcHlEaW1zKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgaW50IGRpbSkgeworCXJldHVybiB0eXBlUmVmLmNvcHlEaW1zKGRpbSk7Cit9Citwcm90ZWN0ZWQgRmllbGREZWNsYXJhdGlvbiBjcmVhdGVGaWVsZERlY2xhcmF0aW9uKEV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24sIGNoYXJbXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlyZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24obnVsbCwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7Cit9CisKK3Byb3RlY3RlZCBMb2NhbERlY2xhcmF0aW9uIGNyZWF0ZUxvY2FsRGVjbGFyYXRpb24oRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiwgY2hhcltdIG5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCXJldHVybiBuZXcgTG9jYWxEZWNsYXJhdGlvbihudWxsLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKK30KKworcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGRpZXRQYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0OworCWJvb2xlYW4gb2xkID0gZGlldDsKKwl0cnkgeworCQlkaWV0ID0gdHJ1ZTsKKwkJcGFyc2VkVW5pdCA9IHBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwl9CisJZmluYWxseSB7CisJCWRpZXQgPSBvbGQ7CisJfQorCXJldHVybiBwYXJzZWRVbml0OworfQorcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hEZWNsYXJhdGlvbkludG8oaW50IGxlbmd0aCkgeworCS8qIHRoZXkgYXJlIGxlbmd0aCBvbiBhc3RTdGFjayB0aGF0IHNob3VsZCBnbyBpbnRvCisJICAgbWV0aG9kcyBmaWVsZHMgY29uc3RydWN0b3JzIGxpc3RzIG9mIHRoZSB0eXBlRGVjbAorCisJICAgUmV0dXJuIGlmIHRoZXJlIGlzIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaW4gdGhlIG1ldGhvZHMgZGVjbGFyYXRpb24gKi8KKwkgICAKKwkKKwkvLyBMb29rcyBmb3IgdGhlIHNpemUgb2YgZWFjaCBhcnJheSAuIAorCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm47CisJaW50W10gZmxhZyA9IG5ldyBpbnRbbGVuZ3RoICsgMV07IC8vcGx1cyBvbmUgLS0gc2VlIDxIRVJFPgorCWludCBzaXplMSA9IDAsIHNpemUyID0gMCwgc2l6ZTMgPSAwOworCWZvciAoaW50IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworCQlBc3ROb2RlIGFzdE5vZGUgPSBhc3RTdGFja1thc3RQdHItLV07CisJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgeworCQkJLy9tZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgaGF2ZSBiZWVuIHJlZ3JvdXBlZCBpbnRvIG9uZSBzaW5nbGUgbGlzdAorCQkJZmxhZ1tpXSA9IDM7CisJCQlzaXplMisrOworCQl9IGVsc2UgeworCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCQlmbGFnW2ldID0gNDsKKwkJCQlzaXplMysrOworCQkJfSBlbHNlIHsKKwkJCQkvL2ZpZWxkCisJCQkJZmxhZ1tpXSA9IDE7CisJCQkJc2l6ZTErKzsKKwkJCX0KKwkJfQorCX0KKworCS8vYXJyYXlzIGNyZWF0aW9uCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwlpZiAoc2l6ZTEgIT0gMCkKKwkJdHlwZURlY2wuZmllbGRzID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bc2l6ZTFdOworCWlmIChzaXplMiAhPSAwKQorCQl0eXBlRGVjbC5tZXRob2RzID0gbmV3IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bc2l6ZTJdOworCWlmIChzaXplMyAhPSAwKQorCQl0eXBlRGVjbC5tZW1iZXJUeXBlcyA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb25bc2l6ZTNdOworCisJLy9hcnJheXMgZmlsbCB1cAorCXNpemUxID0gc2l6ZTIgPSBzaXplMyA9IDA7CisJaW50IGZsYWdJID0gZmxhZ1swXSwgc3RhcnQgPSAwOworCWludCBsZW5ndGgyOworCWZvciAoaW50IGVuZCA9IDA7IGVuZCA8PSBsZW5ndGg7IGVuZCsrKSAvLzxIRVJFPiB0aGUgcGx1cyBvbmUgYWxsb3dzIHRvIAorCQl7CisJCWlmIChmbGFnSSAhPSBmbGFnW2VuZF0pIC8vdHJlYXQgdGhlIGxhc3QgZWxlbWVudCBhcyBhIGVuZGVkIGZsYWcuLi4uLgorCQkJeyAvL2FycmF5IGNvcHkKKwkJCXN3aXRjaCAoZmxhZ0kpIHsKKwkJCQljYXNlIDEgOgorCQkJCQlzaXplMSArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWFzdFN0YWNrLCAKKwkJCQkJCWFzdFB0ciArIHN0YXJ0ICsgMSwgCisJCQkJCQl0eXBlRGVjbC5maWVsZHMsIAorCQkJCQkJc2l6ZTEgLSBsZW5ndGgyLCAKKwkJCQkJCWxlbmd0aDIpOyAKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzIDoKKwkJCQkJc2l6ZTIgKz0gKGxlbmd0aDIgPSBlbmQgLSBzdGFydCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlhc3RTdGFjaywgCisJCQkJCQlhc3RQdHIgKyBzdGFydCArIDEsIAorCQkJCQkJdHlwZURlY2wubWV0aG9kcywgCisJCQkJCQlzaXplMiAtIGxlbmd0aDIsIAorCQkJCQkJbGVuZ3RoMik7IAorCQkJCQlicmVhazsKKwkJCQljYXNlIDQgOgorCQkJCQlzaXplMyArPSAobGVuZ3RoMiA9IGVuZCAtIHN0YXJ0KTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWFzdFN0YWNrLCAKKwkJCQkJCWFzdFB0ciArIHN0YXJ0ICsgMSwgCisJCQkJCQl0eXBlRGVjbC5tZW1iZXJUeXBlcywgCisJCQkJCQlzaXplMyAtIGxlbmd0aDIsIAorCQkJCQkJbGVuZ3RoMik7IAorCQkJCQlicmVhazsKKwkJCX07CisJCQlmbGFnSSA9IGZsYWdbc3RhcnQgPSBlbmRdOworCQl9CisJfQorCisJaWYgKHR5cGVEZWNsLm1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IHR5cGVEZWNsLm1lbWJlclR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQl0eXBlRGVjbC5tZW1iZXJUeXBlc1tpXS5lbmNsb3NpbmdUeXBlID0gdHlwZURlY2w7CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gZW5kUGFyc2UoaW50IGFjdCkgeworCisJdGhpcy5sYXN0QWN0ID0gYWN0OworCisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeworCQljdXJyZW50RWxlbWVudC50b3BFbGVtZW50KCkudXBkYXRlUGFyc2VUcmVlKCk7CisJCWlmIChWRVJCT1NFX1JFQ09WRVJZKXsKKwkJCVN5c3RlbS5vdXQucHJpbnQoVXRpbC5iaW5kKCJwYXJzZXIuc3ludGF4UmVjb3ZlcnkiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsJCSAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcGlsYXRpb25Vbml0KTsJCQorCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKKwkJfQkJCisJfSBlbHNlIHsKKwkJaWYgKGRpZXQgJiBWRVJCT1NFX1JFQ09WRVJZKXsKKwkJCVN5c3RlbS5vdXQucHJpbnQoVXRpbC5iaW5kKCJwYXJzZXIucmVndWxhclBhcnNlIikpOwkgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwkgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKGNvbXBpbGF0aW9uVW5pdCk7CQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJaWYgKHNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvcikgeworCQljb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucyA9IHNjYW5uZXIuZ2V0TGluZUVuZHMoKTsKKwl9CisJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKK30KKy8qCisgKiBGbHVzaCBhbm5vdGF0aW9ucyBkZWZpbmVkIHByaW9yIHRvIGEgZ2l2ZW4gcG9zaXRpb25zLgorICoKKyAqIE5vdGU6IGFubm90YXRpb25zIGFyZSBzdGFja2VkIGluIHN5bnRhY3RpY2FsIG9yZGVyCisgKgorICogRWl0aGVyIGFuc3dlciBnaXZlbiA8cG9zaXRpb24+LCBvciB0aGUgZW5kIHBvc2l0aW9uIG9mIGEgY29tbWVudCBsaW5lIAorICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSA8cG9zaXRpb24+IChzYW1lIGxpbmUpCisgKgorICogZS5nLgorICogdm9pZCBmb28oKXsKKyAqIH0gLy8gZW5kIG9mIG1ldGhvZCBmb28KKyAqLworIAorcHVibGljIGludCBmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oaW50IHBvc2l0aW9uKSB7CisKKwlpbnQgbGFzdEFubm90YXRpb25JbmRleCA9IHNjYW5uZXIuY29tbWVudFB0cjsKKwlpZiAobGFzdEFubm90YXRpb25JbmRleCA8IDApIHJldHVybiBwb3NpdGlvbjsgLy8gbm8gY29tbWVudAorCisJLy8gY29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9ic29sZXRlIGNvbW1lbnQKKwlpbnQgaW5kZXggPSBsYXN0QW5ub3RhdGlvbkluZGV4OworCWludCB2YWxpZENvdW50ID0gMDsKKwl3aGlsZSAoaW5kZXggPj0gMCl7CisJCWludCBjb21tZW50RW5kID0gc2Nhbm5lci5jb21tZW50U3RvcHNbaW5kZXhdOworCQlpZiAoY29tbWVudEVuZCA8IDApIGNvbW1lbnRFbmQgPSAtY29tbWVudEVuZDsgLy8gbmVnYXRpdmUgZW5kIHBvc2l0aW9uIGZvciBub24tamF2YWRvYyBjb21tZW50cworCQlpZiAoY29tbWVudEVuZCA8PSBwb3NpdGlvbil7CisJCQlicmVhazsKKwkJfQorCQlpbmRleC0tOworCQl2YWxpZENvdW50Kys7CisJfQorCS8vIGlmIHRoZSBzb3VyY2UgYXQgPHBvc2l0aW9uPiBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGxpbmUgY29tbWVudCwgdGhlbgorCS8vIGZsdXNoIHRoaXMgY29tbWVudCBhbmQgc2hpZnQgPHBvc2l0aW9uPiB0byB0aGUgY29tbWVudCBlbmQuCisJaWYgKHZhbGlkQ291bnQgPiAwKXsKKwkJaW50IGltbWVkaWF0ZUNvbW1lbnRFbmQgPSAtc2Nhbm5lci5jb21tZW50U3RvcHNbaW5kZXgrMV07IC8vbm9uLWphdmFkb2MgY29tbWVudCBlbmQgcG9zaXRpb25zIGFyZSBuZWdhdGl2ZQorCQlpZiAoaW1tZWRpYXRlQ29tbWVudEVuZCA+IDApeyAvLyBvbmx5IHRvbGVyYXRpbmcgbm9uLWphdmFkb2MgY29tbWVudHMKKwkJCS8vIGlzIHRoZXJlIGFueSBsaW5lIGJyZWFrIHVudGlsIHRoZSBlbmQgb2YgdGhlIGltbWVkaWF0ZSBjb21tZW50ID8gKHRodXMgb25seSB0b2xlcmF0aW5nIGxpbmUgY29tbWVudCkKKwkJCWltbWVkaWF0ZUNvbW1lbnRFbmQtLTsgLy8gY29tbWVudCBlbmQgaW4gb25lIGNoYXIgdG9vIGZhcgorCQkJaWYgKHNjYW5uZXIuZ2V0TGluZU51bWJlcihwb3NpdGlvbikgPT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKGltbWVkaWF0ZUNvbW1lbnRFbmQpKXsKKwkJCQlwb3NpdGlvbiA9IGltbWVkaWF0ZUNvbW1lbnRFbmQ7CisJCQkJdmFsaWRDb3VudC0tOyAvLyBmbHVzaCB0aGlzIGNvbW1lbnQKKwkJCQlpbmRleCsrOworCQkJfQorCQl9CisJfQorCS8vIHBvc2l0aW9uIGNhbiBiZSBsb2NhdGVkIGluIHRoZSBtaWRkbGUgb2YgYSBsaW5lIGJyZWFrCisJLy8gdGhpcyBpcyBhIGJ1ZyBvbiBXaW5kb3dzIHBsYXRmb3JtIG9ubHkuCisJLy8gaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU1NworCWNoYXJbXSBzb3VyY2UgPSBzY2FubmVyLnNvdXJjZTsKKwkKKwlpZiAoKHBvc2l0aW9uIDwgc291cmNlLmxlbmd0aCkKKwkJJiYgKHNvdXJjZVtwb3NpdGlvbl0gPT0gJ1xyJykKKwkgICAgJiYgKChwb3NpdGlvbiArIDEpIDwgc291cmNlLmxlbmd0aCkKKwkgICAgJiYgKHNvdXJjZVtwb3NpdGlvbiArIDFdID09ICdcbicpKSB7CisJCXBvc2l0aW9uKys7CisJfQorCWlmIChpbmRleCA8IDApIHJldHVybiBwb3NpdGlvbjsgLy8gbm8gb2Jzb2xldGUgY29tbWVudAorCisJaWYgKHZhbGlkQ291bnQgPiAwKXsgLy8gbW92ZSB2YWxpZCBjb21tZW50IGluZm9zLCBvdmVycmlkaW5nIG9ic29sZXRlIGNvbW1lbnQgaW5mb3MKKwkJU3lzdGVtLmFycmF5Y29weShzY2FubmVyLmNvbW1lbnRTdGFydHMsIGluZGV4ICsgMSwgc2Nhbm5lci5jb21tZW50U3RhcnRzLCAwLCB2YWxpZENvdW50KTsKKwkJU3lzdGVtLmFycmF5Y29weShzY2FubmVyLmNvbW1lbnRTdG9wcywgaW5kZXggKyAxLCBzY2FubmVyLmNvbW1lbnRTdG9wcywgMCwgdmFsaWRDb3VudCk7CQkKKwl9CisJc2Nhbm5lci5jb21tZW50UHRyID0gdmFsaWRDb3VudCAtIDE7CisJcmV0dXJuIHBvc2l0aW9uOworfQorcHVibGljIGZpbmFsIGludCBnZXRGaXJzdFRva2VuKCkgeworCS8vIHRoZSBmaXJzdCB0b2tlbiBpcyBhIHZpcnR1YWwgdG9rZW4gdGhhdAorCS8vIGFsbG93cyB0aGUgcGFyc2VyIHRvIHBhcnNlIHNldmVyYWwgZ29hbHMKKwkvLyBldmVuIGlmIHRoZXkgYXJlbid0IExBTFIoMSkuLi4uCisJLy8gR29hbCA6Oj0gJysrJyBDb21waWxhdGlvblVuaXQKKwkvLyBHb2FsIDo6PSAnLS0nIE1ldGhvZEJvZHkKKwkvLyBHb2FsIDo6PSAnPT0nIENvbnN0cnVjdG9yQm9keQorCS8vIC0tIEluaXRpYWxpemVyCisJLy8gR29hbCA6Oj0gJz4+JyBTdGF0aWNJbml0aWFsaXplcgorCS8vIEdvYWwgOjo9ICc+PicgQmxvY2sKKwkvLyAtLSBlcnJvciByZWNvdmVyeQorCS8vIEdvYWwgOjo9ICc+Pj4nIEhlYWRlcnMKKwkvLyBHb2FsIDo6PSAnKicgQmxvY2tTdGF0ZW1lbnRzCisJLy8gR29hbCA6Oj0gJyonIE1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIKKwkvLyAtLSBKRE9NCisJLy8gR29hbCA6Oj0gJyYmJyBGaWVsZERlY2xhcmF0aW9uCisJLy8gR29hbCA6Oj0gJ3x8JyBJbXBvcnREZWNsYXJhdGlvbgorCS8vIEdvYWwgOjo9ICc/JyBQYWNrYWdlRGVjbGFyYXRpb24KKwkvLyBHb2FsIDo6PSAnKycgVHlwZURlY2xhcmF0aW9uCisJLy8gR29hbCA6Oj0gJy8nIEdlbmVyaWNNZXRob2REZWNsYXJhdGlvbgorCS8vIEdvYWwgOjo9ICcmJyBDbGFzc0JvZHlEZWNsYXJhdGlvbgorCS8vIC0tIGNvZGUgc25pcHBldAorCS8vIEdvYWwgOjo9ICclJyBFeHByZXNzaW9uCisJLy8gLS0gY29tcGxldGlvbiBwYXJzZXIKKwkvLyBHb2FsIDo6PSAnIScgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQKKwkvLyBHb2FsIDo6PSAnficgQmxvY2tTdGF0ZW1lbnRzb3B0CisJCisJcmV0dXJuIGZpcnN0VG9rZW47Cit9CisvKgorICogQW5zd2VyIGJhY2sgYW4gYXJyYXkgb2Ygc291cmNlU3RhcnQvc291cmNlRW5kIHBvc2l0aW9ucyBvZiB0aGUgYXZhaWxhYmxlIEphdmFEb2MgY29tbWVudHMuCisgKiBUaGUgYXJyYXkgaXMgYSBmbGF0dGVuZWQgc3RydWN0dXJlOiAyKm4gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlcyBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucy4KKyAqCisgKiBJZiBubyBKYXZhRG9jIGlzIGF2YWlsYWJsZSwgdGhlbiBudWxsIGlzIGFuc3dlcmVkIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkuCisgKgorICogZS5nLiB7IDEwLCAyMCwgMjUsIDQ1IH0gIC0tPiBqYXZhZG9jMSBmcm9tIDEwIHRvIDIwLCBqYXZhZG9jMiBmcm9tIDI1IHRvIDQ1CisgKi8KK3B1YmxpYyBpbnRbXSBnZXRKYXZhRG9jUG9zaXRpb25zKCkgeworCisJaW50IGphdmFkb2NDb3VudCA9IDA7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHNjYW5uZXIuY29tbWVudFB0cjsgaSA8PSBtYXg7IGkrKyl7CisJCS8vIGphdmFkb2Mgb25seSAobm9uIGphdmFkb2MgY29tbWVudCBoYXZlIG5lZ2F0aXZlIGVuZCBwb3NpdGlvbnMuKQorCQlpZiAoc2Nhbm5lci5jb21tZW50U3RvcHNbaV0gPiAwKXsKKwkJCWphdmFkb2NDb3VudCsrOworCQl9CisJfQorCWlmIChqYXZhZG9jQ291bnQgPT0gMCkgcmV0dXJuIG51bGw7CisKKwlpbnRbXSBwb3NpdGlvbnMgPSBuZXcgaW50WzIqamF2YWRvY0NvdW50XTsKKwlpbnQgaW5kZXggPSAwOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBzY2FubmVyLmNvbW1lbnRQdHI7IGkgPD0gbWF4OyBpKyspeworCQkvLyBqYXZhZG9jIG9ubHkgKG5vbiBqYXZhZG9jIGNvbW1lbnQgaGF2ZSBuZWdhdGl2ZSBlbmQgcG9zaXRpb25zLikKKwkJaWYgKHNjYW5uZXIuY29tbWVudFN0b3BzW2ldID4gMCl7CisJCQlwb3NpdGlvbnNbaW5kZXgrK10gPSBzY2FubmVyLmNvbW1lbnRTdGFydHNbaV07CisJCQlwb3NpdGlvbnNbaW5kZXgrK10gPSBzY2FubmVyLmNvbW1lbnRTdG9wc1tpXS0xOyAvL3N0b3AgaXMgb25lIG92ZXIJCQkKKwkJfQorCX0KKwlyZXR1cm4gcG9zaXRpb25zOworfQorCXByb3RlY3RlZCB2b2lkIGdldE1ldGhvZEJvZGllcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAorCisJCWlmICh1bml0ID09IG51bGwpIHJldHVybjsKKwkJCisJCWlmICh1bml0Lmlnbm9yZU1ldGhvZEJvZGllcykgeworCQkJdW5pdC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCQlyZXR1cm47CisJCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCisJCX0KKworCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4KKwkJdGhpcy5zY2FubmVyLnNldFNvdXJjZSgKKwkJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQuY29tcGlsYXRpb25Vbml0LmdldENvbnRlbnRzKCkpOworCQlpZiAodW5pdC50eXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gdW5pdC50eXBlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCQl1bml0LnR5cGVzW2ldLnBhcnNlTWV0aG9kKHRoaXMsIHVuaXQpOworCQl9CisJfQorcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2UgZ2V0VHlwZVJlZmVyZW5jZShpbnQgZGltKSB7IC8qIGJ1aWxkIGEgUmVmZXJlbmNlIG9uIGEgdmFyaWFibGUgdGhhdCBtYXkgYmUgcXVhbGlmaWVkIG9yIG5vdAorVGhpcyB2YXJpYWJsZSBpcyBhIHR5cGUgcmVmZXJlbmNlIGFuZCBkaW0gd2lsbCBiZSBpdHMgZGltZW5zaW9ucyovCisKKwlpbnQgbGVuZ3RoOworCVR5cGVSZWZlcmVuY2UgcmVmOworCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKKwkJLy8gc2luZ2xlIHZhcmlhYmxlIHJlZmVyZW5jZQorCQlpZiAoZGltID09IDApIHsKKwkJCXJlZiA9IAorCQkJCW5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCX0gZWxzZSB7CisJCQlyZWYgPSAKKwkJCQluZXcgQXJyYXlUeXBlUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlkaW0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CQkJCisJCX0KKwl9IGVsc2UgeworCQlpZiAobGVuZ3RoIDwgMCkgeyAvL2ZsYWcgZm9yIHByZWNvbXBpbGVkIHR5cGUgcmVmZXJlbmNlIG9uIGJhc2UgdHlwZXMKKwkJCXJlZiA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWxlbmd0aCwgZGltKTsKKwkJCXJlZi5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZi5zb3VyY2VFbmQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQl9IGVsc2UgeworCQkJCWludFB0ci0tOworCQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKKwkJCX0KKwkJfSBlbHNlIHsgLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCisJCQljaGFyW11bXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAKKwkJCQlpZGVudGlmaWVyUHRyICsgMSwgCisJCQkJcG9zaXRpb25zLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGgpOyAKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJlZiA9IG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVmID0gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCQlyZWYuc291cmNlRW5kID0gZW5kUG9zaXRpb247CisJCQl9CisJCX0KKwl9OworCXJldHVybiByZWY7Cit9Citwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRUeXBlUmVmZXJlbmNlKEV4cHJlc3Npb24gZXhwKSB7CisJCisJZXhwLmJpdHMgJj0gfkFzdE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSzsKKwlleHAuYml0cyB8PSBUWVBFOworCXJldHVybiBleHA7Cit9Citwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpIHsKKwkvKiBidWlsZCBhICh1bnNwZWNpZmllZCkgTmFtZVJlZmVyZW5jZSB3aGljaCBtYXkgYmUgcXVhbGlmaWVkKi8KKworCWludCBsZW5ndGg7CisJTmFtZVJlZmVyZW5jZSByZWY7CisJaWYgKChsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkKKwkJLy8gc2luZ2xlIHZhcmlhYmxlIHJlZmVyZW5jZQorCQlyZWYgPSAKKwkJCW5ldyBTaW5nbGVOYW1lUmVmZXJlbmNlKAorCQkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCisJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ci0tXSk7IAorCWVsc2UKKwkJLy9RdWFsaWZpZWQgdmFyaWFibGUgcmVmZXJlbmNlCisJCXsKKwkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCXJlZiA9IAorCQkJbmV3IFF1YWxpZmllZE5hbWVSZWZlcmVuY2UodG9rZW5zLCAKKwkJCQkoaW50KSAoaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ciArIDFdID4+IDMyKSwgLy8gc291cmNlU3RhcnQKKwkJCQkoaW50KSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgbGVuZ3RoXSk7IC8vIHNvdXJjZUVuZAorCX07CisJcmV0dXJuIHJlZjsKK30KK3Byb3RlY3RlZCBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkgeworCS8qIGJ1aWxkIGEgKHVuc3BlY2lmaWVkKSBOYW1lUmVmZXJlbmNlIHdoaWNoIG1heSBiZSBxdWFsaWZpZWQKKwlUaGUgb3B0aW1pemF0aW9uIG9jY3VycyBmb3IgcXVhbGlmaWVkIHJlZmVyZW5jZSB3aGlsZSB3ZSBhcmUKKwljZXJ0YWluIGluIHRoaXMgY2FzZSB0aGUgbGFzdCBpdGVtIG9mIHRoZSBxdWFsaWZpZWQgbmFtZSBpcworCWEgZmllbGQgYWNjZXNzLiBUaGlzIG9wdGltaXphdGlvbiBpcyBJTVBPUlRBTlQgd2hpbGUgaXQgcmVzdWx0cworCXRoYXQgd2hlbiBhIE5hbWVSZWZlcmVuY2UgaXMgYnVpbGQsIHRoZSB0eXBlIGNoZWNrZXIgc2hvdWxkIGFsd2F5cworCWxvb2sgZm9yIHRoYXQgaXQgaXMgbm90IGEgdHlwZSByZWZlcmVuY2UgKi8KKworCWludCBsZW5ndGg7CisJTmFtZVJlZmVyZW5jZSByZWY7CisJaWYgKChsZW5ndGggPSBpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0ci0tXSkgPT0gMSkgeworCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCisJCXJlZiA9IAorCQkJbmV3IFNpbmdsZU5hbWVSZWZlcmVuY2UoCisJCQkJaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHJdLCAKKwkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dKTsgCisJCXJlZi5iaXRzICY9IH5Bc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CisJCXJlZi5iaXRzIHw9IExPQ0FMIHwgRklFTEQ7CisJCXJldHVybiByZWY7CisJfQorCisJLy9RdWFsaWZpZWQtdmFyaWFibGUtcmVmZXJlbmNlCisJLy9JbiBmYWN0IGl0IGlzIHZhcmlhYmxlLXJlZmVyZW5jZSBET1QgZmllbGQtcmVmICwgYnV0IGl0IHdvdWxkIHJlc3VsdCBpbiBhIHR5cGUKKwkvL2NvbmZsaWN0IHRoYSBjYW4gYmUgb25seSByZWR1Y2UgYnkgbWFraW5nIGEgc3VwZXJjbGFzcyAob3IgaW5ldHJmYWNlICkgYmV0d2VlbgorCS8vbmFtZVJlZmVyZW5jZSBhbmQgRmlsZWRSZWZlcmVuY2Ugb3IgcHV0dGluZyBGaWVsZFJlZmVyZW5jZSB1bmRlciBOYW1lUmVmZXJlbmNlCisJLy9vciBlbHNlLi4uLi4uLi4uLlRoaXMgb3B0aW1pc2F0aW9uIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgc28ganVzdCBsZWF2ZSBhcyBpdCBpcworCisJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCWlkZW50aWZpZXJQdHIgLT0gbGVuZ3RoOworCVN5c3RlbS5hcnJheWNvcHkoaWRlbnRpZmllclN0YWNrLCBpZGVudGlmaWVyUHRyICsgMSwgdG9rZW5zLCAwLCBsZW5ndGgpOworCXJlZiA9IG5ldyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKAorCQkJdG9rZW5zLCAKKwkJCShpbnQpIChpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgMV0gPj4gMzIpLCAvLyBzb3VyY2VTdGFydAorCQkJKGludCkgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ciArIGxlbmd0aF0pOyAvLyBzb3VyY2VFbmQKKwlyZWYuYml0cyAmPSB+QXN0Tm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOworCXJlZi5iaXRzIHw9IExPQ0FMIHwgRklFTEQ7CisJcmV0dXJuIHJlZjsKK30KK3B1YmxpYyB2b2lkIGdvRm9yQmxvY2tTdGF0ZW1lbnRzT3JNZXRob2RIZWFkZXJzKCkgeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGJsb2NrIHN0YXRlbWVudHMgb3IgbWV0aG9kIGhlYWRlcnMgcGFyc2luZyAKKworCWZpcnN0VG9rZW4gPSBUb2tlbk5hbWVNVUxUSVBMWTsKKwlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9yQ2xhc3NCb2R5RGVjbGFyYXRpb25zKCkgeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGFueSBib2R5IGRlY2xhcmF0aW9ucyBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lQU5EOworCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHRydWU7Cit9CitwdWJsaWMgdm9pZCBnb0ZvckNvbXBpbGF0aW9uVW5pdCgpeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGNvbXBpbGF0aW9uIHVuaXQgcGFyc2luZworCisJZmlyc3RUb2tlbiA9IFRva2VuTmFtZVBMVVNfUExVUyA7CisJc2Nhbm5lci5saW5lUHRyID0gLTE7CQorCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHRydWU7CisJc2Nhbm5lci5jdXJyZW50TGluZT0gbnVsbDsKKwlzY2FubmVyLmxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Cit9CitwdWJsaWMgdm9pZCBnb0ZvckNvbnN0cnVjdG9yQm9keSgpeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGNvbXBpbGF0aW9uIHVuaXQgcGFyc2luZworCisJZmlyc3RUb2tlbiA9IFRva2VuTmFtZUVRVUFMX0VRVUFMIDsKKwlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9yRXhwcmVzc2lvbigpIHsKKwkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBhbiBleHByZXNzaW9uIHBhcnNpbmcKKworCWZpcnN0VG9rZW4gPSBUb2tlbk5hbWVSRU1BSU5ERVI7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7Cit9CitwdWJsaWMgdm9pZCBnb0ZvckZpZWxkRGVjbGFyYXRpb24oKXsKKwkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBmaWVsZCBkZWNsYXJhdGlvbiBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lQU5EX0FORCA7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9yR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uKCl7CisJLy90ZWxscyB0aGUgc2Nhbm5lciB0byBnbyBmb3IgZ2VuZXJpYyBtZXRob2QgZGVjbGFyYXRpb25zIHBhcnNpbmcKKworCWZpcnN0VG9rZW4gPSBUb2tlbk5hbWVESVZJREU7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9ySGVhZGVycygpeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGhlYWRlcnMgb25seSBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQ7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9ySW1wb3J0RGVjbGFyYXRpb24oKXsKKwkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBpbXBvcnQgZGVjbGFyYXRpb24gcGFyc2luZworCisJZmlyc3RUb2tlbiA9IFRva2VuTmFtZU9SX09SIDsKKwlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSB0cnVlOworfQorcHVibGljIHZvaWQgZ29Gb3JJbml0aWFsaXplcigpeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGluaXRpYWxpemVyIHBhcnNpbmcKKworCWZpcnN0VG9rZW4gPSBUb2tlbk5hbWVSSUdIVF9TSElGVCA7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7Cit9CitwdWJsaWMgdm9pZCBnb0Zvck1ldGhvZEJvZHkoKXsKKwkvL3RlbGxzIHRoZSBzY2FubmVyIHRvIGdvIGZvciBtZXRob2QgYm9keSBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lTUlOVVNfTUlOVVMgOworCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IGZhbHNlOworfQorcHVibGljIHZvaWQgZ29Gb3JQYWNrYWdlRGVjbGFyYXRpb24oKSB7CisJLy90ZWxscyB0aGUgc2Nhbm5lciB0byBnbyBmb3IgcGFja2FnZSBkZWNsYXJhdGlvbiBwYXJzaW5nCisKKwlmaXJzdFRva2VuID0gVG9rZW5OYW1lUVVFU1RJT047CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9yVHlwZURlY2xhcmF0aW9uKCkgeworCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIHR5cGUgKGludGVyZmFjZSBvciBjbGFzcykgZGVjbGFyYXRpb24gcGFyc2luZworCisJZmlyc3RUb2tlbiA9IFRva2VuTmFtZVBMVVM7CisJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKK30KK3B1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBncmFtbWFyKCl7CisvKgorLS1tYWluIG9wdGlvbnMKKyVvcHRpb25zIEFDVElPTiwgQU49SmF2YUFjdGlvbi5qYXZhLCBHUD1qYXZhLCAKKyVvcHRpb25zIEZJTEUtUFJFRklYPWphdmEsIEVTQ0FQRT0kLCBQUkVGSVg9VG9rZW5OYW1lLCBPVVRQVVQtU0laRT0xMjUgLAorJW9wdGlvbnMgTk9HT1RPLURFRkFVTFQsIFNJTkdMRS1QUk9EVUNUSU9OUywgTEFMUj0xICwgVEFCTEU9VElNRSAsIAorCistLWVycm9yIHJlY292ZXJpbmcgb3B0aW9ucy4uLi4uCislb3B0aW9ucyBFUlJPUl9NQVBTIAorCistLWdyYW1tYXIgdW5kZXJzdGFuZGluZyBvcHRpb25zCislb3B0aW9ucyBmaXJzdCBmb2xsb3cKKyVvcHRpb25zIFRSQUNFPUZVTEwgLAorJW9wdGlvbnMgVkVSQk9TRQorCistLVVzZWZ1bGwgbWFjcm9zIGhlbHBpbmcgcmVhZGluZy93cml0aW5nIHNlbWFudGljIGFjdGlvbnMKKyREZWZpbmUgCiskcHV0Q2FzZSAKKy8uICAgIGNhc2UgJHJ1bGVfbnVtYmVyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCIkcnVsZV90ZXh0Iik7ICAKKwkJICAgLi8KKworJGJyZWFrCisvLiAKKwkJCWJyZWFrIDsKKy4vCisKKy0tIGhlcmUgaXQgc3RhcnRzIHJlYWxseSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyRUZXJtaW5hbHMKKworCUlkZW50aWZpZXIKKworCWFic3RyYWN0IGFzc2VydCBib29sZWFuIGJyZWFrIGJ5dGUgY2FzZSBjYXRjaCBjaGFyIGNsYXNzIAorCWNvbnRpbnVlIGRlZmF1bHQgZG8gZG91YmxlIGVsc2UgZXh0ZW5kcyBmYWxzZSBmaW5hbCBmaW5hbGx5IGZsb2F0CisJZm9yIGlmIGltcGxlbWVudHMgaW1wb3J0IGluc3RhbmNlb2YgaW50CisJaW50ZXJmYWNlIGxvbmcgbmF0aXZlIG5ldyBudWxsIHBhY2thZ2UgcHJpdmF0ZQorCXByb3RlY3RlZCBwdWJsaWMgcmV0dXJuIHNob3J0IHN0YXRpYyBzdHJpY3RmcCBzdXBlciBzd2l0Y2gKKwlzeW5jaHJvbml6ZWQgdGhpcyB0aHJvdyB0aHJvd3MgdHJhbnNpZW50IHRydWUgdHJ5IHZvaWQKKwl2b2xhdGlsZSB3aGlsZQorCisJSW50ZWdlckxpdGVyYWwKKwlMb25nTGl0ZXJhbAorCUZsb2F0aW5nUG9pbnRMaXRlcmFsCisJRG91YmxlTGl0ZXJhbAorCUNoYXJhY3RlckxpdGVyYWwKKwlTdHJpbmdMaXRlcmFsCisKKwlQTFVTX1BMVVMKKwlNSU5VU19NSU5VUworCUVRVUFMX0VRVUFMCisJTEVTU19FUVVBTAorCUdSRUFURVJfRVFVQUwKKwlOT1RfRVFVQUwKKwlMRUZUX1NISUZUCisJUklHSFRfU0hJRlQKKwlVTlNJR05FRF9SSUdIVF9TSElGVAorCVBMVVNfRVFVQUwKKwlNSU5VU19FUVVBTAorCU1VTFRJUExZX0VRVUFMCisJRElWSURFX0VRVUFMCisJQU5EX0VRVUFMCisJT1JfRVFVQUwKKwlYT1JfRVFVQUwKKwlSRU1BSU5ERVJfRVFVQUwKKwlMRUZUX1NISUZUX0VRVUFMCisJUklHSFRfU0hJRlRfRVFVQUwKKwlVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTAorCU9SX09SCisJQU5EX0FORAorCVBMVVMKKwlNSU5VUworCU5PVAorCVJFTUFJTkRFUgorCVhPUgorCUFORAorCU1VTFRJUExZCisJT1IKKwlUV0lERExFCisJRElWSURFCisJR1JFQVRFUgorCUxFU1MKKwlMUEFSRU4KKwlSUEFSRU4KKwlMQlJBQ0UKKwlSQlJBQ0UKKwlMQlJBQ0tFVAorCVJCUkFDS0VUCisJU0VNSUNPTE9OCisJUVVFU1RJT04KKwlDT0xPTgorCUNPTU1BCisJRE9UCisJRVFVQUwKKworLS0gICAgQm9keU1hcmtlcgorCiskQWxpYXMKKworCScrKycgICA6Oj0gUExVU19QTFVTCisJJy0tJyAgIDo6PSBNSU5VU19NSU5VUworCSc9PScgICA6Oj0gRVFVQUxfRVFVQUwKKwknPD0nICAgOjo9IExFU1NfRVFVQUwKKwknPj0nICAgOjo9IEdSRUFURVJfRVFVQUwKKwknIT0nICAgOjo9IE5PVF9FUVVBTAorCSc8PCcgICA6Oj0gTEVGVF9TSElGVAorCSc+PicgICA6Oj0gUklHSFRfU0hJRlQKKwknPj4+JyAgOjo9IFVOU0lHTkVEX1JJR0hUX1NISUZUCisJJys9JyAgIDo6PSBQTFVTX0VRVUFMCisJJy09JyAgIDo6PSBNSU5VU19FUVVBTAorCScqPScgICA6Oj0gTVVMVElQTFlfRVFVQUwKKwknLz0nICAgOjo9IERJVklERV9FUVVBTAorCScmPScgICA6Oj0gQU5EX0VRVUFMCisJJ3w9JyAgIDo6PSBPUl9FUVVBTAorCSdePScgICA6Oj0gWE9SX0VRVUFMCisJJyU9JyAgIDo6PSBSRU1BSU5ERVJfRVFVQUwKKwknPDw9JyAgOjo9IExFRlRfU0hJRlRfRVFVQUwKKwknPj49JyAgOjo9IFJJR0hUX1NISUZUX0VRVUFMCisJJz4+Pj0nIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTAorCSd8fCcgICA6Oj0gT1JfT1IKKwknJiYnICAgOjo9IEFORF9BTkQKKworCScrJyAgICA6Oj0gUExVUworCSctJyAgICA6Oj0gTUlOVVMKKwknIScgICAgOjo9IE5PVAorCSclJyAgICA6Oj0gUkVNQUlOREVSCisJJ14nICAgIDo6PSBYT1IKKwknJicgICAgOjo9IEFORAorCScqJyAgICA6Oj0gTVVMVElQTFkKKwknfCcgICAgOjo9IE9SCisJJ34nICAgIDo6PSBUV0lERExFCisJJy8nICAgIDo6PSBESVZJREUKKwknPicgICAgOjo9IEdSRUFURVIKKwknPCcgICAgOjo9IExFU1MKKwknKCcgICAgOjo9IExQQVJFTgorCScpJyAgICA6Oj0gUlBBUkVOCisJJ3snICAgIDo6PSBMQlJBQ0UKKwknfScgICAgOjo9IFJCUkFDRQorCSdbJyAgICA6Oj0gTEJSQUNLRVQKKwknXScgICAgOjo9IFJCUkFDS0VUCisJJzsnICAgIDo6PSBTRU1JQ09MT04KKwknPycgICAgOjo9IFFVRVNUSU9OCisJJzonICAgIDo6PSBDT0xPTgorCScsJyAgICA6Oj0gQ09NTUEKKwknLicgICAgOjo9IERPVAorCSc9JyAgICA6Oj0gRVFVQUwKKwkKKyRTdGFydAorCUdvYWwKKworJFJ1bGVzCisKKy8uIC8vIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gYXV0b21hdGljIGdlbmVyYXRpb24gOiBkbyBOT1QgZWRpdC1tb2RpZnkgIAorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJ1bGUoaW50IGFjdCkgeworICBzd2l0Y2ggKCBhY3QgKSB7CisuLworCisKKworR29hbCA6Oj0gJysrJyBDb21waWxhdGlvblVuaXQKK0dvYWwgOjo9ICctLScgTWV0aG9kQm9keQorR29hbCA6Oj0gJz09JyBDb25zdHJ1Y3RvckJvZHkKKy0tIEluaXRpYWxpemVyCitHb2FsIDo6PSAnPj4nIFN0YXRpY0luaXRpYWxpemVyCitHb2FsIDo6PSAnPj4nIEluaXRpYWxpemVyCistLSBlcnJvciByZWNvdmVyeQorR29hbCA6Oj0gJz4+PicgSGVhZGVycworR29hbCA6Oj0gJyonIEJsb2NrU3RhdGVtZW50cworR29hbCA6Oj0gJyonIE1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIKK0dvYWwgOjo9ICcqJyBDYXRjaEhlYWRlcgorLS0gSkRPTQorR29hbCA6Oj0gJyYmJyBGaWVsZERlY2xhcmF0aW9uCitHb2FsIDo6PSAnfHwnIEltcG9ydERlY2xhcmF0aW9uCitHb2FsIDo6PSAnPycgUGFja2FnZURlY2xhcmF0aW9uCitHb2FsIDo6PSAnKycgVHlwZURlY2xhcmF0aW9uCitHb2FsIDo6PSAnLycgR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uCitHb2FsIDo6PSAnJicgQ2xhc3NCb2R5RGVjbGFyYXRpb24KKy0tIGNvZGUgc25pcHBldAorR29hbCA6Oj0gJyUnIEV4cHJlc3Npb24KKy0tIGNvbXBsZXRpb24gcGFyc2VyCitHb2FsIDo6PSAnIScgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQKK0dvYWwgOjo9ICd+JyBCbG9ja1N0YXRlbWVudHNvcHQKKworTGl0ZXJhbCAtPiBJbnRlZ2VyTGl0ZXJhbAorTGl0ZXJhbCAtPiBMb25nTGl0ZXJhbAorTGl0ZXJhbCAtPiBGbG9hdGluZ1BvaW50TGl0ZXJhbAorTGl0ZXJhbCAtPiBEb3VibGVMaXRlcmFsCitMaXRlcmFsIC0+IENoYXJhY3RlckxpdGVyYWwKK0xpdGVyYWwgLT4gU3RyaW5nTGl0ZXJhbAorTGl0ZXJhbCAtPiBudWxsCitMaXRlcmFsIC0+IEJvb2xlYW5MaXRlcmFsCitCb29sZWFuTGl0ZXJhbCAtPiB0cnVlCitCb29sZWFuTGl0ZXJhbCAtPiBmYWxzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLWEgVHlwZSByZXN1bHRzIGluIGJvdGggYSBwdXNoIG9mIGl0cyBkaW1lbnNpb24ocykgYW5kIGl0cyBuYW1lKHMpLgorCitUeXBlIDo6PSBQcmltaXRpdmVUeXBlCisgLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWl0aXZlVHlwZSgpOyAkYnJlYWsgLi8KK1R5cGUgLT4gUmVmZXJlbmNlVHlwZQorCitQcmltaXRpdmVUeXBlIC0+IE51bWVyaWNUeXBlCitOdW1lcmljVHlwZSAtPiBJbnRlZ3JhbFR5cGUKK051bWVyaWNUeXBlIC0+IEZsb2F0aW5nUG9pbnRUeXBlCisKK1ByaW1pdGl2ZVR5cGUgLT4gJ2Jvb2xlYW4nCitQcmltaXRpdmVUeXBlIC0+ICd2b2lkJworSW50ZWdyYWxUeXBlIC0+ICdieXRlJworSW50ZWdyYWxUeXBlIC0+ICdzaG9ydCcKK0ludGVncmFsVHlwZSAtPiAnaW50JworSW50ZWdyYWxUeXBlIC0+ICdsb25nJworSW50ZWdyYWxUeXBlIC0+ICdjaGFyJworRmxvYXRpbmdQb2ludFR5cGUgLT4gJ2Zsb2F0JworRmxvYXRpbmdQb2ludFR5cGUgLT4gJ2RvdWJsZScKKworUmVmZXJlbmNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUKKy8uJHB1dENhc2UgY29uc3VtZVJlZmVyZW5jZVR5cGUoKTsgICRicmVhayAuLworUmVmZXJlbmNlVHlwZSAtPiBBcnJheVR5cGUgLS0gaGVyZSBhIHB1c2ggb2YgZGltZW5zaW9ucyBpcyBkb25lLCB0aGF0IGV4cGxhaW5zIHRoZSB0d28gcHJldmlvdXMgcHVzaCAwCisKK0NsYXNzT3JJbnRlcmZhY2VUeXBlIC0+IE5hbWUKKworLS0KKy0tIFRoZXNlIHJ1bGVzIGhhdmUgYmVlbiByZXdyaXR0ZW4gdG8gYXZvaWQgc29tZSBjb25mbGljdHMgaW50cm9kdWNlZAorLS0gYnkgYWRkaW5nIHRoZSAxLjEgZmVhdHVyZXMKKy0tCistLSBBcnJheVR5cGUgOjo9IFByaW1pdGl2ZVR5cGUgJ1snICddJworLS0gQXJyYXlUeXBlIDo6PSBOYW1lICdbJyAnXScKKy0tIEFycmF5VHlwZSA6Oj0gQXJyYXlUeXBlICdbJyAnXScKKy0tCisKK0FycmF5VHlwZSA6Oj0gUHJpbWl0aXZlVHlwZSBEaW1zCitBcnJheVR5cGUgOjo9IE5hbWUgRGltcworCitDbGFzc1R5cGUgLT4gQ2xhc3NPckludGVyZmFjZVR5cGUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAtPiBTaW1wbGVOYW1lCitOYW1lIC0+IFF1YWxpZmllZE5hbWUKKworU2ltcGxlTmFtZSAtPiAnSWRlbnRpZmllcicKKworUXVhbGlmaWVkTmFtZSA6Oj0gTmFtZSAnLicgU2ltcGxlTmFtZSAKKy8uJHB1dENhc2UgY29uc3VtZVF1YWxpZmllZE5hbWUoKTsgJGJyZWFrIC4vCisKK0NvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdCBUeXBlRGVjbGFyYXRpb25zb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVDb21waWxhdGlvblVuaXQoKTsgJGJyZWFrIC4vCisKK0VudGVyQ29tcGlsYXRpb25Vbml0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVudGVyQ29tcGlsYXRpb25Vbml0KCk7ICRicmVhayAuLworCitIZWFkZXJzIC0+IEhlYWRlcgorSGVhZGVycyA6Oj0gSGVhZGVycyBIZWFkZXIKKworSGVhZGVyIC0+IEltcG9ydERlY2xhcmF0aW9uCitIZWFkZXIgLT4gUGFja2FnZURlY2xhcmF0aW9uCitIZWFkZXIgLT4gQ2xhc3NIZWFkZXIKK0hlYWRlciAtPiBJbnRlcmZhY2VIZWFkZXIKK0hlYWRlciAtPiBTdGF0aWNJbml0aWFsaXplcgorSGVhZGVyIC0+IE1ldGhvZEhlYWRlcgorSGVhZGVyIC0+IENvbnN0cnVjdG9ySGVhZGVyCitIZWFkZXIgLT4gRmllbGREZWNsYXJhdGlvbgorSGVhZGVyIC0+IEFsbG9jYXRpb25IZWFkZXIKKworQ2F0Y2hIZWFkZXIgOjo9ICdjYXRjaCcgJygnIEZvcm1hbFBhcmFtZXRlciAnKScgJ3snCisvLiRwdXRDYXNlIGNvbnN1bWVDYXRjaEhlYWRlcigpOyAkYnJlYWsgLi8KKworSW1wb3J0RGVjbGFyYXRpb25zIC0+IEltcG9ydERlY2xhcmF0aW9uCitJbXBvcnREZWNsYXJhdGlvbnMgOjo9IEltcG9ydERlY2xhcmF0aW9ucyBJbXBvcnREZWNsYXJhdGlvbiAKKy8uJHB1dENhc2UgY29uc3VtZUltcG9ydERlY2xhcmF0aW9ucygpOyAkYnJlYWsgLi8KKworVHlwZURlY2xhcmF0aW9ucyAtPiBUeXBlRGVjbGFyYXRpb24KK1R5cGVEZWNsYXJhdGlvbnMgOjo9IFR5cGVEZWNsYXJhdGlvbnMgVHlwZURlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zKCk7ICRicmVhayAuLworCitQYWNrYWdlRGVjbGFyYXRpb24gOjo9IFBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgJzsnCisvLiRwdXRDYXNlICBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSAncGFja2FnZScgTmFtZQorLy4kcHV0Q2FzZSAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWUoKTsgJGJyZWFrIC4vCisKK0ltcG9ydERlY2xhcmF0aW9uIC0+IFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbgorSW1wb3J0RGVjbGFyYXRpb24gLT4gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24KKworU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uIDo6PSBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCQkJICAKK1NpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUKKy8uJHB1dENhc2UgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsgJGJyZWFrIC4vCisJCQkgIAorVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24gOjo9IFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSAnOycKKy8uJHB1dENhc2UgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgOjo9ICdpbXBvcnQnIE5hbWUgJy4nICcqJworLy4kcHV0Q2FzZSBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLworCitUeXBlRGVjbGFyYXRpb24gLT4gQ2xhc3NEZWNsYXJhdGlvbgorVHlwZURlY2xhcmF0aW9uIC0+IEludGVyZmFjZURlY2xhcmF0aW9uCistLSB0aGlzIGRlY2xhcmF0aW9uIGluIHBhcnQgb2YgYSBsaXN0IG9kIGRlY2xhcmF0aW9uIGFuZCB3ZSB3aWxsCistLSB1c2UgYW5kIG9wdGltaXplZCBsaXN0IGxlbmd0aCBjYWxjdWxhdGlvbiBwcm9jZXNzIAorLS0gdGh1cyB3ZSBkZWNyZW1lbnQgdGhlIG51bWJlciB3aGlsZSBpdCB3aWxsIGJlIGluY3JlbWVuZC4uLi4uCitUeXBlRGVjbGFyYXRpb24gOjo9ICc7JyAKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworLS0xOC43IE9ubHkgaW4gdGhlIExBTFIoMSkgR3JhbW1hcgorCitNb2RpZmllcnMgOjo9IE1vZGlmaWVyCitNb2RpZmllcnMgOjo9IE1vZGlmaWVycyBNb2RpZmllcgorCitNb2RpZmllciAtPiAncHVibGljJyAKK01vZGlmaWVyIC0+ICdwcm90ZWN0ZWQnCitNb2RpZmllciAtPiAncHJpdmF0ZScKK01vZGlmaWVyIC0+ICdzdGF0aWMnCitNb2RpZmllciAtPiAnYWJzdHJhY3QnCitNb2RpZmllciAtPiAnZmluYWwnCitNb2RpZmllciAtPiAnbmF0aXZlJworTW9kaWZpZXIgLT4gJ3N5bmNocm9uaXplZCcKK01vZGlmaWVyIC0+ICd0cmFuc2llbnQnCitNb2RpZmllciAtPiAndm9sYXRpbGUnCitNb2RpZmllciAtPiAnc3RyaWN0ZnAnCisKKy0tMTguOCBQcm9kdWN0aW9ucyBmcm9tIDg6IENsYXNzIERlY2xhcmF0aW9ucworLS1DbGFzc01vZGlmaWVyIDo6PQorLS0gICAgICAnYWJzdHJhY3QnCistLSAgICB8ICdmaW5hbCcKKy0tICAgIHwgJ3B1YmxpYycKKy0tMTguOC4xIFByb2R1Y3Rpb25zIGZyb20gOC4xOiBDbGFzcyBEZWNsYXJhdGlvbnMKKworQ2xhc3NEZWNsYXJhdGlvbiA6Oj0gQ2xhc3NIZWFkZXIgQ2xhc3NCb2R5CisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitDbGFzc0hlYWRlciA6Oj0gQ2xhc3NIZWFkZXJOYW1lIENsYXNzSGVhZGVyRXh0ZW5kc29wdCBDbGFzc0hlYWRlckltcGxlbWVudHNvcHQKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVyKCk7ICRicmVhayAuLworCitDbGFzc0hlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnY2xhc3MnICdJZGVudGlmaWVyJworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitDbGFzc0hlYWRlckV4dGVuZHMgOjo9ICdleHRlbmRzJyBDbGFzc1R5cGUKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXJJbXBsZW1lbnRzIDo6PSAnaW1wbGVtZW50cycgSW50ZXJmYWNlVHlwZUxpc3QKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlVHlwZUxpc3QgLT4gSW50ZXJmYWNlVHlwZQorSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0ICcsJyBJbnRlcmZhY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VUeXBlTGlzdCgpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZVR5cGUoKTsgJGJyZWFrIC4vCisKK0NsYXNzQm9keSA6Oj0gJ3snIENsYXNzQm9keURlY2xhcmF0aW9uc29wdCAnfScKKworQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbgorQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMgQ2xhc3NCb2R5RGVjbGFyYXRpb24KKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOyAkYnJlYWsgLi8KKworQ2xhc3NCb2R5RGVjbGFyYXRpb24gLT4gQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbgorQ2xhc3NCb2R5RGVjbGFyYXRpb24gLT4gU3RhdGljSW5pdGlhbGl6ZXIKK0NsYXNzQm9keURlY2xhcmF0aW9uIC0+IENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0NsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jaworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCitEaWV0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZURpZXQoKTsgJGJyZWFrLi8KKworSW5pdGlhbGl6ZXIgOjo9IERpZXQgTmVzdGVkTWV0aG9kIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiAtPiBGaWVsZERlY2xhcmF0aW9uCitDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IE1ldGhvZERlY2xhcmF0aW9uCistLTEuMSBmZWF0dXJlCitDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0NsYXNzTWVtYmVyRGVjbGFyYXRpb24gLT4gSW50ZXJmYWNlRGVjbGFyYXRpb24KKworLS0gRW1wdHkgZGVjbGFyYXRpb25zIGFyZSBub3QgdmFsaWQgSmF2YSBDbGFzc01lbWJlckRlY2xhcmF0aW9ucy4KKy0tIEhvd2V2ZXIsIHNpbmNlIHRoZSBjdXJyZW50ICgyLzE0Lzk3KSBKYXZhIGNvbXBpbGVyIGFjY2VwdHMgdGhlbSAKKy0tIChpbiBmYWN0LCBzb21lIG9mIHRoZSBvZmZpY2lhbCB0ZXN0cyBjb250YWluIHRoaXMgZXJyb25lb3VzCistLSBzeW50YXgpCisKK0dlbmVyaWNNZXRob2REZWNsYXJhdGlvbiAtPiBNZXRob2REZWNsYXJhdGlvbgorR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uIC0+IENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKworQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUNsYXNzTWVtYmVyRGVjbGFyYXRpb24oKTsgJGJyZWFrLi8KKworLS0xOC44LjIgUHJvZHVjdGlvbnMgZnJvbSA4LjM6IEZpZWxkIERlY2xhcmF0aW9ucworLS1WYXJpYWJsZU1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAncHJvdGVjdGVkJworLS0gICAgfCAncHJpdmF0ZScKKy0tICAgIHwgJ3N0YXRpYycKKy0tICAgIHwgJ2ZpbmFsJworLS0gICAgfCAndHJhbnNpZW50JworLS0gICAgfCAndm9sYXRpbGUnCisKK0ZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVGaWVsZERlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitWYXJpYWJsZURlY2xhcmF0b3JzIC0+IFZhcmlhYmxlRGVjbGFyYXRvciAKK1ZhcmlhYmxlRGVjbGFyYXRvcnMgOjo9IFZhcmlhYmxlRGVjbGFyYXRvcnMgJywnIFZhcmlhYmxlRGVjbGFyYXRvcgorLy4kcHV0Q2FzZSBjb25zdW1lVmFyaWFibGVEZWNsYXJhdG9ycygpOyAkYnJlYWsgLi8KKworVmFyaWFibGVEZWNsYXJhdG9yIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JJZCBFbnRlclZhcmlhYmxlIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbgorCitWYXJpYWJsZURlY2xhcmF0b3IgOjo9IFZhcmlhYmxlRGVjbGFyYXRvcklkIEVudGVyVmFyaWFibGUgJz0nIEZvcmNlTm9EaWV0IFZhcmlhYmxlSW5pdGlhbGl6ZXIgUmVzdG9yZURpZXQgRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uCisKK0VudGVyVmFyaWFibGUgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW50ZXJWYXJpYWJsZSgpOyAkYnJlYWsgLi8KKworRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOyAkYnJlYWsgLi8KKworRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOyAkYnJlYWsgLi8KKworRm9yY2VOb0RpZXQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRm9yY2VOb0RpZXQoKTsgJGJyZWFrIC4vCitSZXN0b3JlRGlldCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVSZXN0b3JlRGlldCgpOyAkYnJlYWsgLi8KKworVmFyaWFibGVEZWNsYXJhdG9ySWQgOjo9ICdJZGVudGlmaWVyJyBEaW1zb3B0CisKK1ZhcmlhYmxlSW5pdGlhbGl6ZXIgLT4gRXhwcmVzc2lvbgorVmFyaWFibGVJbml0aWFsaXplciAtPiBBcnJheUluaXRpYWxpemVyCisKKy0tMTguOC4zIFByb2R1Y3Rpb25zIGZyb20gOC40OiBNZXRob2QgRGVjbGFyYXRpb25zCistLU1ldGhvZE1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAncHJvdGVjdGVkJworLS0gICAgfCAncHJpdmF0ZScKKy0tICAgIHwgJ3N0YXRpYycKKy0tICAgIHwgJ2Fic3RyYWN0JworLS0gICAgfCAnZmluYWwnCistLSAgICB8ICduYXRpdmUnCistLSAgICB8ICdzeW5jaHJvbml6ZWQnCistLQorCitNZXRob2REZWNsYXJhdGlvbiAtPiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCitNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkgCisvLiRwdXRDYXNlIC8vIHNldCB0byB0cnVlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aCBhIGJvZHkKKyAgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOyAgJGJyZWFrIC4vCisKK0Fic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciAnOycKKy8uJHB1dENhc2UgLy8gc2V0IHRvIGZhbHNlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aG91dCBib2R5CisgIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXIgOjo9IE1ldGhvZEhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXIoKTsgJGJyZWFrIC4vCisKK01ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIgOjo9IE1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIE1ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICRicmVhayAuLworCitNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyAnSWRlbnRpZmllcicgJygnIAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisKK01ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgJ0lkZW50aWZpZXInICcoJyAKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSAnSWRlbnRpZmllcicgJygnCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyUGFyYW1ldGVycygpOyAkYnJlYWsgLi8KKworTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKTsgJGJyZWFrIC4vCisKK01ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gJ3Rocm93cycgQ2xhc3NUeXBlTGlzdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlKCk7ICRicmVhayAuLworCitDb25zdHJ1Y3RvckhlYWRlciA6Oj0gQ29uc3RydWN0b3JIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOyAkYnJlYWsgLi8KKworQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKKy8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworRm9ybWFsUGFyYW1ldGVyTGlzdCAtPiBGb3JtYWxQYXJhbWV0ZXIKK0Zvcm1hbFBhcmFtZXRlckxpc3QgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3QgJywnIEZvcm1hbFBhcmFtZXRlcgorLy4kcHV0Q2FzZSBjb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdCgpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZAorLy4kcHV0Q2FzZSAvLyB0aGUgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG1vZGlmaWVycyBzaG91bGQgYmUgcmVzZXQKKyAJY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NUeXBlTGlzdCAtPiBDbGFzc1R5cGVFbHQKK0NsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgJywnIENsYXNzVHlwZUVsdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NUeXBlTGlzdCgpOyAkYnJlYWsgLi8KKworQ2xhc3NUeXBlRWx0IDo6PSBDbGFzc1R5cGUKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzVHlwZUVsdCgpOyAkYnJlYWsgLi8KKworCitNZXRob2RCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIEJsb2NrU3RhdGVtZW50c29wdCAnfScgCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RCb2R5KCk7ICRicmVhayAuLworCitOZXN0ZWRNZXRob2QgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lTmVzdGVkTWV0aG9kKCk7ICRicmVhayAuLworCistLTE4LjguNCBQcm9kdWN0aW9ucyBmcm9tIDguNTogU3RhdGljIEluaXRpYWxpemVycworCitTdGF0aWNJbml0aWFsaXplciA6Oj0gIFN0YXRpY09ubHkgQmxvY2sKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCk7ICRicmVhay4vCisKK1N0YXRpY09ubHkgOjo9ICdzdGF0aWMnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0aWNPbmx5KCk7ICRicmVhayAuLworCistLTE4LjguNSBQcm9kdWN0aW9ucyBmcm9tIDguNjogQ29uc3RydWN0b3IgRGVjbGFyYXRpb25zCistLUNvbnN0cnVjdG9yTW9kaWZpZXIgOjo9CistLSAgICAgICdwdWJsaWMnCistLSAgICB8ICdwcm90ZWN0ZWQnCistLSAgICB8ICdwcml2YXRlJworLS0KKy0tCitDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkKKy8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICRicmVhayAuLyAKKworLS0gVGhlc2UgcnVsZXMgYXJlIGFkZGVkIHRvIGJlIGFibGUgdG8gcGFyc2UgY29uc3RydWN0b3JzIHdpdGggbm8gYm9keQorQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIDsgJGJyZWFrIC4vIAorCistLSB0aGUgcnVsZXMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25vcHQgaGFzIGJlZW4gZXhwYW5kZWQKKy0tIGluIHRoZSBydWxlIGJlbG93IGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgbGFscigxKS4KKy0tIENvbnN0cnVjdG9yQm9keSA6Oj0gJ3snIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9ub3B0IEJsb2NrU3RhdGVtZW50c29wdCAnfScKKy0tIE90aGVyIGlubGluaW5nIGhhcyBvY2N1cmVkIGludG8gdGhlIG5leHQgcnVsZSB0b28uLi4uCisKK0NvbnN0cnVjdG9yQm9keSA6Oj0gTmVzdGVkTWV0aG9kICAneycgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKTsgJGJyZWFrIC4vCisKK0NvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IC0+IEJsb2NrU3RhdGVtZW50c29wdAorCitDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCAtPiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgorCitDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCA6Oj0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gQmxvY2tTdGF0ZW1lbnRzCisvLiRwdXRDYXNlICBjb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKTsgJGJyZWFrIC4vCisKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAndGhpcycgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAkYnJlYWsgLi8KKworRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9ICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgJGJyZWFrIC4vCisKKy0tMS4xIGZlYXR1cmUKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5ICcuJyAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSAnLicgJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7ICRicmVhayAuLworCistLTE4LjkgUHJvZHVjdGlvbnMgZnJvbSA5OiBJbnRlcmZhY2UgRGVjbGFyYXRpb25zCisKKy0tMTguOS4xIFByb2R1Y3Rpb25zIGZyb20gOS4xOiBJbnRlcmZhY2UgRGVjbGFyYXRpb25zCistLUludGVyZmFjZU1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAnYWJzdHJhY3QnCistLQorSW50ZXJmYWNlRGVjbGFyYXRpb24gOjo9IEludGVyZmFjZUhlYWRlciBJbnRlcmZhY2VCb2R5CisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlSGVhZGVyIDo6PSBJbnRlcmZhY2VIZWFkZXJOYW1lIEludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZUhlYWRlcigpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdpbnRlcmZhY2UnICdJZGVudGlmaWVyJworLy4kcHV0Q2FzZSBjb25zdW1lSW50ZXJmYWNlSGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworLS0gVGhpcyBydWxlIHdpbGwgYmUgdXNlZCB0byBhY2NlcHQgaW5uZXIgbG9jYWwgaW50ZXJmYWNlIGFuZCB0aGVuIHJlcG9ydCBhIHJlbGV2YW50IGVycm9yIG1lc3NhZ2UKK0ludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbiAtPiBJbnRlcmZhY2VIZWFkZXIgSW50ZXJmYWNlQm9keQorCitJbnRlcmZhY2VIZWFkZXJFeHRlbmRzIDo6PSAnZXh0ZW5kcycgSW50ZXJmYWNlVHlwZUxpc3QKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZUhlYWRlckV4dGVuZHMoKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZUJvZHkgOjo9ICd7JyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgJ30nIAorCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgLT4gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24KK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKTsgJGJyZWFrIC4vCisKKy0tc2FtZSBhcyBmb3IgY2xhc3MgbWVtYmVycworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworLS0gVGhpcyBydWxlIGlzIGFkZGVkIHRvIGJlIGFibGUgdG8gcGFyc2Ugbm9uIGFic3RyYWN0IG1ldGhvZCBpbnNpZGUgaW50ZXJmYWNlIGFuZCB0aGVuIHJlcG9ydCBhIHJlbGV2ZW50IGVycm9yIG1lc3NhZ2UKK0ludmFsaWRNZXRob2REZWNsYXJhdGlvbiAtPiBNZXRob2RIZWFkZXIgTWV0aG9kQm9keQorCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiAtPiBDb25zdGFudERlY2xhcmF0aW9uCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gSW52YWxpZE1ldGhvZERlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGlnbm9yZU1ldGhvZEJvZHkoKTsgJGJyZWFrIC4vCisKKy0tIFRoZXNlIHJ1bGVzIGFyZSBhZGRlZCB0byBiZSBhYmxlIHRvIHBhcnNlIGNvbnN0cnVjdG9ycyBpbnNpZGUgaW50ZXJmYWNlIGFuZCB0aGVuIHJlcG9ydCBhIHJlbGV2ZW50IGVycm9yIG1lc3NhZ2UKK0ludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkKKy8uJHB1dENhc2UgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24odHJ1ZSk7ICAkYnJlYWsgLi8KKworSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyICc7JworLy4kcHV0Q2FzZSBpZ25vcmVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihmYWxzZSk7ICAkYnJlYWsgLi8KKworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gLT4gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgorSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gLT4gSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKyAKKy0tMS4xIGZlYXR1cmUKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEludGVyZmFjZURlY2xhcmF0aW9uCisKK0NvbnN0YW50RGVjbGFyYXRpb24gLT4gRmllbGREZWNsYXJhdGlvbgorCitBcnJheUluaXRpYWxpemVyIDo6PSAneycgLG9wdCAnfScKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5QXJyYXlJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KK0FycmF5SW5pdGlhbGl6ZXIgOjo9ICd7JyBWYXJpYWJsZUluaXRpYWxpemVycyAnfScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCitBcnJheUluaXRpYWxpemVyIDo6PSAneycgVmFyaWFibGVJbml0aWFsaXplcnMgLCAnfScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCisKK1ZhcmlhYmxlSW5pdGlhbGl6ZXJzIDo6PSBWYXJpYWJsZUluaXRpYWxpemVyCitWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcnMgJywnIFZhcmlhYmxlSW5pdGlhbGl6ZXIKKy8uJHB1dENhc2UgY29uc3VtZVZhcmlhYmxlSW5pdGlhbGl6ZXJzKCk7ICRicmVhayAuLworCitCbG9jayA6Oj0gT3BlbkJsb2NrICd7JyBCbG9ja1N0YXRlbWVudHNvcHQgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVCbG9jaygpOyAkYnJlYWsgLi8KK09wZW5CbG9jayA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVPcGVuQmxvY2soKSA7ICRicmVhayAuLworCitCbG9ja1N0YXRlbWVudHMgLT4gQmxvY2tTdGF0ZW1lbnQKK0Jsb2NrU3RhdGVtZW50cyA6Oj0gQmxvY2tTdGF0ZW1lbnRzIEJsb2NrU3RhdGVtZW50CisvLiRwdXRDYXNlIGNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKSA7ICRicmVhayAuLworCitCbG9ja1N0YXRlbWVudCAtPiBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKK0Jsb2NrU3RhdGVtZW50IC0+IFN0YXRlbWVudAorLS0xLjEgZmVhdHVyZQorQmxvY2tTdGF0ZW1lbnQgLT4gQ2xhc3NEZWNsYXJhdGlvbgorQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBpZ25vcmVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IDo6PSBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsgJGJyZWFrIC4vCisKK0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMKKy8uJHB1dENhc2UgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworLS0gMS4xIGZlYXR1cmUKKy0tIFRoZSBtb2RpZmllcnMgcGFydCBvZiB0aGlzIHJ1bGUgbWFrZXMgdGhlIGdyYW1tYXIgbW9yZSBwZXJtaXNzaXZlLiAKKy0tIFRoZSBvbmx5IG1vZGlmaWVyIGhlcmUgaXMgZmluYWwuIFdlIHB1dCBNb2RpZmllcnMgdG8gYWxsb3cgbXVsdGlwbGUgbW9kaWZpZXJzCistLSBUaGlzIHdpbGwgcmVxdWlyZSB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG1vZGlmaWVyCisKK0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzCisvLiRwdXRDYXNlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKK1B1c2hNb2RpZmllcnMgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lUHVzaE1vZGlmaWVycygpOyAkYnJlYWsgLi8KKworU3RhdGVtZW50IC0+IFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudAorU3RhdGVtZW50IC0+IExhYmVsZWRTdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBJZlRoZW5TdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBJZlRoZW5FbHNlU3RhdGVtZW50CitTdGF0ZW1lbnQgLT4gV2hpbGVTdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBGb3JTdGF0ZW1lbnQKKworU3RhdGVtZW50Tm9TaG9ydElmIC0+IFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudAorU3RhdGVtZW50Tm9TaG9ydElmIC0+IExhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBJZlRoZW5FbHNlU3RhdGVtZW50Tm9TaG9ydElmCitTdGF0ZW1lbnROb1Nob3J0SWYgLT4gV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBGb3JTdGF0ZW1lbnROb1Nob3J0SWYKKworU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEFzc2VydFN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEJsb2NrCitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gRW1wdHlTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBFeHByZXNzaW9uU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gU3dpdGNoU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gRG9TdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBCcmVha1N0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IENvbnRpbnVlU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gUmV0dXJuU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gU3luY2hyb25pemVkU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gVGhyb3dTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBUcnlTdGF0ZW1lbnQKKworRW1wdHlTdGF0ZW1lbnQgOjo9ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlTdGF0ZW1lbnQoKTsgJGJyZWFrIC4vCisKK0xhYmVsZWRTdGF0ZW1lbnQgOjo9ICdJZGVudGlmaWVyJyAnOicgU3RhdGVtZW50CisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0xhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdJZGVudGlmaWVyJyAnOicgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0V4cHJlc3Npb25TdGF0ZW1lbnQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb24gJzsnCisvLiAkcHV0Q2FzZSBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpOyAkYnJlYWsgLi8KKworU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gQXNzaWdubWVudAorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUHJlSW5jcmVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUHJlRGVjcmVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdEluY3JlbWVudEV4cHJlc3Npb24KK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IFBvc3REZWNyZW1lbnRFeHByZXNzaW9uCitTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBNZXRob2RJbnZvY2F0aW9uCitTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uCisKK0lmVGhlblN0YXRlbWVudCA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKTsgJGJyZWFrIC4vCisKK0lmVGhlbkVsc2VTdGF0ZW1lbnQgOjo9ICAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAkYnJlYWsgLi8KKworSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudE5vU2hvcnRJZiAnZWxzZScgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICRicmVhayAuLworCitTd2l0Y2hTdGF0ZW1lbnQgOjo9ICdzd2l0Y2gnIE9wZW5CbG9jayAnKCcgRXhwcmVzc2lvbiAnKScgU3dpdGNoQmxvY2sKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpIDsgJGJyZWFrIC4vCisKK1N3aXRjaEJsb2NrIDo6PSAneycgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eVN3aXRjaEJsb2NrKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2sgOjo9ICd7JyBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgJ30nCitTd2l0Y2hCbG9jayA6Oj0gJ3snIFN3aXRjaExhYmVscyAnfScKK1N3aXRjaEJsb2NrIDo6PSAneycgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaExhYmVscyAnfScKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaEJsb2NrKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIC0+IFN3aXRjaEJsb2NrU3RhdGVtZW50CitTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hCbG9ja1N0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnRzKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2tTdGF0ZW1lbnQgOjo9IFN3aXRjaExhYmVscyBCbG9ja1N0YXRlbWVudHMKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaEJsb2NrU3RhdGVtZW50KCkgOyAkYnJlYWsgLi8KKworU3dpdGNoTGFiZWxzIC0+IFN3aXRjaExhYmVsCitTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbAorLy4kcHV0Q2FzZSBjb25zdW1lU3dpdGNoTGFiZWxzKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoTGFiZWwgOjo9ICdjYXNlJyBDb25zdGFudEV4cHJlc3Npb24gJzonCisvLiAkcHV0Q2FzZSBjb25zdW1lQ2FzZUxhYmVsKCk7ICRicmVhayAuLworCitTd2l0Y2hMYWJlbCA6Oj0gJ2RlZmF1bHQnICc6JworLy4gJHB1dENhc2UgY29uc3VtZURlZmF1bHRMYWJlbCgpOyAkYnJlYWsgLi8KKworV2hpbGVTdGF0ZW1lbnQgOjo9ICd3aGlsZScgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICRicmVhayAuLworCitXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIDsgJGJyZWFrIC4vCisKK0RvU3RhdGVtZW50IDo6PSAnZG8nIFN0YXRlbWVudCAnd2hpbGUnICcoJyBFeHByZXNzaW9uICcpJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudERvKCkgOyAkYnJlYWsgLi8KKworRm9yU3RhdGVtZW50IDo6PSAnZm9yJyAnKCcgRm9ySW5pdG9wdCAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudEZvcigpIDsgJGJyZWFrIC4vCitGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyBFeHByZXNzaW9ub3B0ICc7JyBGb3JVcGRhdGVvcHQgJyknIFN0YXRlbWVudE5vU2hvcnRJZgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Rm9yKCkgOyAkYnJlYWsgLi8KKworLS10aGUgbWludXMgb25lIGFsbG93cyB0byBhdm9pZCBhIHN0YWNrLXRvLXN0YWNrIHRyYW5zZmVyCitGb3JJbml0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdAorLy4kcHV0Q2FzZSBjb25zdW1lRm9ySW5pdCgpIDsgJGJyZWFrIC4vCitGb3JJbml0IC0+IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbgorCitGb3JVcGRhdGUgLT4gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QKKworU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgLT4gU3RhdGVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0ICcsJyBTdGF0ZW1lbnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCgpIDsgJGJyZWFrIC4vCisKKy0tIDEuNCBmZWF0dXJlCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSA7ICRicmVhayAuLworCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzonIEV4cHJlc3Npb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NlcnRTdGF0ZW1lbnQoKSA7ICRicmVhayAuLworICAgICAgICAgIAorQnJlYWtTdGF0ZW1lbnQgOjo9ICdicmVhaycgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRCcmVhaygpIDsgJGJyZWFrIC4vCisKK0JyZWFrU3RhdGVtZW50IDo6PSAnYnJlYWsnIElkZW50aWZpZXIgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0NvbnRpbnVlU3RhdGVtZW50IDo6PSAnY29udGludWUnICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Q29udGludWUoKSA7ICRicmVhayAuLworCitDb250aW51ZVN0YXRlbWVudCA6Oj0gJ2NvbnRpbnVlJyBJZGVudGlmaWVyICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Q29udGludWVXaXRoTGFiZWwoKSA7ICRicmVhayAuLworCitSZXR1cm5TdGF0ZW1lbnQgOjo9ICdyZXR1cm4nIEV4cHJlc3Npb25vcHQgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSA7ICRicmVhayAuLworCitUaHJvd1N0YXRlbWVudCA6Oj0gJ3Rocm93JyBFeHByZXNzaW9uICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50VGhyb3coKTsKKyRicmVhayAuLworCitTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgJygnIEV4cHJlc3Npb24gJyknICAgIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsgJGJyZWFrIC4vCitPbmx5U3luY2hyb25pemVkIDo6PSAnc3luY2hyb25pemVkJworLy4kcHV0Q2FzZSBjb25zdW1lT25seVN5bmNocm9uaXplZCgpOyAkYnJlYWsgLi8KKworCitUcnlTdGF0ZW1lbnQgOjo9ICd0cnknICAgIEJsb2NrIENhdGNoZXMKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeShmYWxzZSk7ICRicmVhayAuLworVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgICBCbG9jayBDYXRjaGVzb3B0IEZpbmFsbHkKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeSh0cnVlKTsgJGJyZWFrIC4vCisKK0NhdGNoZXMgLT4gQ2F0Y2hDbGF1c2UKK0NhdGNoZXMgOjo9IENhdGNoZXMgQ2F0Y2hDbGF1c2UKKy8uJHB1dENhc2UgY29uc3VtZUNhdGNoZXMoKTsgJGJyZWFrIC4vCisKK0NhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICAgIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpIDsgJGJyZWFrIC4vCisKK0ZpbmFsbHkgOjo9ICdmaW5hbGx5JyAgICBCbG9jaworCistLTE4LjEyIFByb2R1Y3Rpb25zIGZyb20gMTQ6IEV4cHJlc3Npb25zCisKKy0tZm9yIHNvdXJjZSBwb3NpdGlvbm5pbmcgcHVycG9zZQorUHVzaExQQVJFTiA6Oj0gJygnCisvLiRwdXRDYXNlIGNvbnN1bWVMZWZ0UGFyZW4oKTsgJGJyZWFrIC4vCitQdXNoUlBBUkVOIDo6PSAnKScKKy8uJHB1dENhc2UgY29uc3VtZVJpZ2h0UGFyZW4oKTsgJGJyZWFrIC4vCisKK1ByaW1hcnkgLT4gUHJpbWFyeU5vTmV3QXJyYXkKK1ByaW1hcnkgLT4gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24KKworUHJpbWFyeU5vTmV3QXJyYXkgLT4gTGl0ZXJhbAorUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICd0aGlzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gIFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIAorLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IC0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24KK1ByaW1hcnlOb05ld0FycmF5IC0+IEZpZWxkQWNjZXNzCistLTEuMSBmZWF0dXJlCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSAnLicgJ3RoaXMnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVUaGlzKCk7ICRicmVhayAuLworUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICdzdXBlcicKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVN1cGVyKCk7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCistLVByaW1hcnlOb05ld0FycmF5IDo6PSBUeXBlICcuJyAnY2xhc3MnICAgCistLWlubGluZSBUeXBlIGluIHRoZSBwcmV2aW91cyBydWxlIGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxIGluc3RlYWQgCistLSBvZiBMTDIuIFRoZSByZXN1bHQgaXMgdGhlIDMgbmV4dCBydWxlcy4KK1ByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lICcuJyAnY2xhc3MnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgJy4nICdjbGFzcycKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHJpbWl0aXZlVHlwZSAnLicgJ2NsYXNzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBNZXRob2RJbnZvY2F0aW9uCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBBcnJheUFjY2VzcworCistLTEuMSBmZWF0dXJlCistLQorLS0gSW4gSmF2YSAxLjAgYSBDbGFzc0JvZHkgY291bGQgbm90IGFwcGVhciBhdCBhbGwgaW4gYQorLS0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbi4KKy0tCisKK0FsbG9jYXRpb25IZWFkZXIgOjo9ICduZXcnIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lQWxsb2NhdGlvbkhlYWRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KKy0tMS4xIGZlYXR1cmUKKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpIDsgJGJyZWFrIC4vCisKK0NsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIDo6PSBOYW1lICcuJworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUoKSA7ICRicmVhayAuLworCitDbGFzc0JvZHlvcHQgOjo9ICRlbXB0eSAtLXRlc3QgbWFkZSB1c2luZyBudWxsIGFzIGNvbnRlbnRzCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlvcHQoKTsgJGJyZWFrIC4vCitDbGFzc0JvZHlvcHQgOjo9IEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IENsYXNzQm9keQorCitFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOyAkYnJlYWsgLi8KKworQXJndW1lbnRMaXN0IDo6PSBFeHByZXNzaW9uCitBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCAnLCcgRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICRicmVhayAuLworCistLVRoZXNzIHJ1bGVzIGFyZSByZS13cml0dGVuIGluIG9yZGVyIHRvIGJlIGxsMSAKKy0tQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIEFycmF5VHlwZSBBcnJheUluaXRpYWxpemVyCistLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbUV4cHJzIERpbXNvcHQgCistLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1FeHBycyBEaW1zb3B0CistLURpbUV4cHJzIDo6PSBEaW1FeHByCistLURpbUV4cHJzIDo6PSBEaW1FeHBycyBEaW1FeHByCisKK0FycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK0FycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcm9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCisKK0RpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHIKK0RpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByCisvLiRwdXRDYXNlIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKTsgJGJyZWFrIC4vCisKK0RpbVdpdGhPcldpdGhPdXRFeHByIDo6PSAnWycgRXhwcmVzc2lvbiAnXScKK0RpbVdpdGhPcldpdGhPdXRFeHByIDo6PSAnWycgJ10nCisvLiAkcHV0Q2FzZSBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHIoKTsgJGJyZWFrIC4vCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaW1zIDo6PSBEaW1zTG9vcAorLy4gJHB1dENhc2UgY29uc3VtZURpbXMoKTsgJGJyZWFrIC4vCitEaW1zTG9vcCAtPiBPbmVEaW1Mb29wCitEaW1zTG9vcCA6Oj0gRGltc0xvb3AgT25lRGltTG9vcAorT25lRGltTG9vcCA6Oj0gJ1snICddJworLy4gJHB1dENhc2UgY29uc3VtZU9uZURpbUxvb3AoKTsgJGJyZWFrIC4vCisKK0ZpZWxkQWNjZXNzIDo6PSBQcmltYXJ5ICcuJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUZpZWxkQWNjZXNzKGZhbHNlKTsgJGJyZWFrIC4vCisKK0ZpZWxkQWNjZXNzIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUZpZWxkQWNjZXNzKHRydWUpOyAkYnJlYWsgLi8KKworTWV0aG9kSW52b2NhdGlvbiA6Oj0gTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsgJGJyZWFrIC4vCisKK01ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsgJGJyZWFrIC4vCisKK01ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7ICRicmVhayAuLworCitBcnJheUFjY2VzcyA6Oj0gTmFtZSAnWycgRXhwcmVzc2lvbiAnXScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5QWNjZXNzKHRydWUpOyAkYnJlYWsgLi8KK0FycmF5QWNjZXNzIDo6PSBQcmltYXJ5Tm9OZXdBcnJheSAnWycgRXhwcmVzc2lvbiAnXScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5QWNjZXNzKGZhbHNlKTsgJGJyZWFrIC4vCisKK1Bvc3RmaXhFeHByZXNzaW9uIC0+IFByaW1hcnkKK1Bvc3RmaXhFeHByZXNzaW9uIDo6PSBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVQb3N0Zml4RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK1Bvc3RmaXhFeHByZXNzaW9uIC0+IFBvc3RJbmNyZW1lbnRFeHByZXNzaW9uCitQb3N0Zml4RXhwcmVzc2lvbiAtPiBQb3N0RGVjcmVtZW50RXhwcmVzc2lvbgorCitQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gJysrJworLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLHRydWUpOyAkYnJlYWsgLi8KKworUG9zdERlY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uICctLScKKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsdHJ1ZSk7ICRicmVhayAuLworCistLWZvciBzb3VyY2UgbWFuYWdtZW50IHB1cnBvc2UKK1B1c2hQb3NpdGlvbiA6Oj0gJGVtcHR5CisgLy4kcHV0Q2FzZSBjb25zdW1lUHVzaFBvc2l0aW9uKCk7ICRicmVhayAuLworCitVbmFyeUV4cHJlc3Npb24gLT4gUHJlSW5jcmVtZW50RXhwcmVzc2lvbgorVW5hcnlFeHByZXNzaW9uIC0+IFByZURlY3JlbWVudEV4cHJlc3Npb24KK1VuYXJ5RXhwcmVzc2lvbiA6Oj0gJysnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7ICRicmVhayAuLworVW5hcnlFeHByZXNzaW9uIDo6PSAnLScgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyk7ICRicmVhayAuLworVW5hcnlFeHByZXNzaW9uIC0+IFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCitQcmVJbmNyZW1lbnRFeHByZXNzaW9uIDo6PSAnKysnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyxmYWxzZSk7ICRicmVhayAuLworCitQcmVEZWNyZW1lbnRFeHByZXNzaW9uIDo6PSAnLS0nIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsZmFsc2UpOyAkYnJlYWsgLi8KKworVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIC0+IFBvc3RmaXhFeHByZXNzaW9uCitVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9ICd+JyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlRXSURETEUpOyAkYnJlYWsgLi8KK1VuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gJyEnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTk9UKTsgJGJyZWFrIC4vCitVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgLT4gQ2FzdEV4cHJlc3Npb24KKworQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KKyBDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBOYW1lIERpbXMgUHVzaFJQQVJFTiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKy8uJHB1dENhc2UgY29uc3VtZUNhc3RFeHByZXNzaW9uKCk7ICRicmVhayAuLworLS0gRXhwcmVzc2lvbiBpcyBoZXJlIG9ubHkgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZ3JhbW1hciBMTDEKK0Nhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKy8uJHB1dENhc2UgY29uc3VtZUNhc3RFeHByZXNzaW9uTEwxKCk7ICRicmVhayAuLworCitNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gLT4gVW5hcnlFeHByZXNzaW9uCitNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnKicgVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NVUxUSVBMWSk7ICRicmVhayAuLworTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJy8nIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRElWSURFKTsgJGJyZWFrIC4vCitNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnJScgVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5SRU1BSU5ERVIpOyAkYnJlYWsgLi8KKworQWRkaXRpdmVFeHByZXNzaW9uIC0+IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gJysnIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7ICRicmVhayAuLworQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gJy0nIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOyAkYnJlYWsgLi8KKworU2hpZnRFeHByZXNzaW9uIC0+IEFkZGl0aXZlRXhwcmVzc2lvbgorU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJzw8JyAgQWRkaXRpdmVFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRUZUX1NISUZUKTsgJGJyZWFrIC4vCitTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiAnPj4nICBBZGRpdGl2ZUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlJJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiAnPj4+JyBBZGRpdGl2ZUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCisKK1JlbGF0aW9uYWxFeHByZXNzaW9uIC0+IFNoaWZ0RXhwcmVzc2lvbgorUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc8JyAgU2hpZnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRVNTKTsgJGJyZWFrIC4vCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJz4nICBTaGlmdEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVIpOyAkYnJlYWsgLi8KK1JlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPD0nIFNoaWZ0RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTU19FUVVBTCk7ICRicmVhayAuLworUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc+PScgU2hpZnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5HUkVBVEVSX0VRVUFMKTsgJGJyZWFrIC4vCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJ2luc3RhbmNlb2YnIFJlZmVyZW5jZVR5cGUKKy8uJHB1dENhc2UgY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GKTsgJGJyZWFrIC4vCisKK0VxdWFsaXR5RXhwcmVzc2lvbiAtPiBSZWxhdGlvbmFsRXhwcmVzc2lvbgorRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gJz09JyBSZWxhdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5FUVVBTF9FUVVBTCk7ICRicmVhayAuLworRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gJyE9JyBSZWxhdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5OT1RfRVFVQUwpOyAkYnJlYWsgLi8KKworQW5kRXhwcmVzc2lvbiAtPiBFcXVhbGl0eUV4cHJlc3Npb24KK0FuZEV4cHJlc3Npb24gOjo9IEFuZEV4cHJlc3Npb24gJyYnIEVxdWFsaXR5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EKTsgJGJyZWFrIC4vCisKK0V4Y2x1c2l2ZU9yRXhwcmVzc2lvbiAtPiBBbmRFeHByZXNzaW9uCitFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiAnXicgQW5kRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uWE9SKTsgJGJyZWFrIC4vCisKK0luY2x1c2l2ZU9yRXhwcmVzc2lvbiAtPiBFeGNsdXNpdmVPckV4cHJlc3Npb24KK0luY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uICd8JyBFeGNsdXNpdmVPckV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk9SKTsgJGJyZWFrIC4vCisKK0NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiAtPiBJbmNsdXNpdmVPckV4cHJlc3Npb24KK0NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICcmJicgSW5jbHVzaXZlT3JFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5BTkRfQU5EKTsgJGJyZWFrIC4vCisKK0NvbmRpdGlvbmFsT3JFeHByZXNzaW9uIC0+IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uICd8fCcgQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUl9PUik7ICRicmVhayAuLworCitDb25kaXRpb25hbEV4cHJlc3Npb24gLT4gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24KK0NvbmRpdGlvbmFsRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gJz8nIEV4cHJlc3Npb24gJzonIENvbmRpdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQ29uZGl0aW9uYWxFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5RVUVTVElPTkNPTE9OKSA7ICRicmVhayAuLworCitBc3NpZ25tZW50RXhwcmVzc2lvbiAtPiBDb25kaXRpb25hbEV4cHJlc3Npb24KK0Fzc2lnbm1lbnRFeHByZXNzaW9uIC0+IEFzc2lnbm1lbnQKKworQXNzaWdubWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudCgpOyAkYnJlYWsgLi8KKworLS0gdGhpcyBydWxlIGlzIGFkZGVkIHRvIHBhcnNlIGFuIGFycmF5IGluaXRpYWxpemVyIGluIGEgYXNzaWdtZW50IGFuZCB0aGVuIHJlcG9ydCBhIHN5bnRheCBlcnJvciBrbm93aW5nIHRoZSBleGFjdCBzZW5hcmlvCitJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50IDo6PSBMZWZ0SGFuZFNpZGUgQXNzaWdubWVudE9wZXJhdG9yIEFycmF5SW5pdGlhbGl6ZXIKK0Fzc2lnbm1lbnQgOjo9IEludmFsaWRBcnJheUluaXRpYWxpemVyQXNzaWduZW1lbnQKKy8uJHB1dGNhc2UgaWdub3JlRXhwcmVzc2lvbkFzc2lnbm1lbnQoKTskYnJlYWsgLi8KKworTGVmdEhhbmRTaWRlIDo6PSBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVMZWZ0SGFuZFNpZGUoKTsgJGJyZWFrIC4vCitMZWZ0SGFuZFNpZGUgLT4gRmllbGRBY2Nlc3MKK0xlZnRIYW5kU2lkZSAtPiBBcnJheUFjY2VzcworCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEVRVUFMKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcqPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNVUxUSVBMWSk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnLz0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRElWSURFKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICclPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJys9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFBMVVMpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJy09JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE1JTlVTKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc8PD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTEVGVF9TSElGVCk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnPj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc+Pj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcmPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJ149JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFhPUik7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnfD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoT1IpOyAkYnJlYWsgLi8KKworRXhwcmVzc2lvbiAtPiBBc3NpZ25tZW50RXhwcmVzc2lvbgorCitDb25zdGFudEV4cHJlc3Npb24gLT4gRXhwcmVzc2lvbgorCistLSBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBmb3Igb3B0aW9uYWwgbm9udGVybWluYWxzLgorLS0KKworUGFja2FnZURlY2xhcmF0aW9ub3B0IC0+ICRlbXB0eSAKK1BhY2thZ2VEZWNsYXJhdGlvbm9wdCAtPiBQYWNrYWdlRGVjbGFyYXRpb24KKworQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IDo6PSAkZW1wdHkKK0NsYXNzSGVhZGVyRXh0ZW5kc29wdCAtPiBDbGFzc0hlYWRlckV4dGVuZHMKKworRXhwcmVzc2lvbm9wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitFeHByZXNzaW9ub3B0IC0+IEV4cHJlc3Npb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSBUaGUgcnVsZXMgYmVsb3cgYXJlIGZvciBvcHRpb25hbCB0ZXJtaW5hbCBzeW1ib2xzLiAgQW4gb3B0aW9uYWwgY29tbWEsCistLSBpcyBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgLSBJdCBpcyBhCistLSAic3ludGFjdGljIHN1Z2FyIiB0aGF0IG90aGVyd2lzZSBzZXJ2ZXMgbm8gb3RoZXIgcHVycG9zZS4gQnkgY29udHJhc3QsCistLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgYSBicmVhayBhbmQgCistLSBjb250aW51ZSBzdGF0ZW1lbnQuIFdoZW4gdGhlIGlkZW50aWZpZXIgZG9lcyBub3QgYXBwZWFyLCBhIE5VTEwKKy0tIGlzIHByb2R1Y2VkLiBXaGVuIHRoZSBpZGVudGlmaWVyIGlzIHByZXNlbnQsIHRoZSB1c2VyIHNob3VsZCB1c2UgdGhlCistLSBjb3JyZXNwb25kaW5nIFRPS0VOKGkpIG1ldGhvZC4gU2VlIGJyZWFrIHN0YXRlbWVudCBhcyBhbiBleGFtcGxlLgorLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCissb3B0IC0+ICRlbXB0eQorLG9wdCAtPiAsCisKK0ltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KK0ltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCisKKworVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCitUeXBlRGVjbGFyYXRpb25zb3B0IDo6PSBUeXBlRGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworCitDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCitDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUgQ2xhc3NCb2R5RGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCisKK01vZGlmaWVyc29wdCA6Oj0gJGVtcHR5IAorLy4gJHB1dENhc2UgY29uc3VtZURlZmF1bHRNb2RpZmllcnMoKTsgJGJyZWFrIC4vCitNb2RpZmllcnNvcHQgOjo9IE1vZGlmaWVycyAKKy8uJHB1dENhc2UgY29uc3VtZU1vZGlmaWVycygpOyAkYnJlYWsgLi8gCisKK0Jsb2NrU3RhdGVtZW50c29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUJsb2NrU3RhdGVtZW50c29wdCgpOyAkYnJlYWsgLi8KK0Jsb2NrU3RhdGVtZW50c29wdCAtPiBCbG9ja1N0YXRlbWVudHMKKworRGltc29wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlEaW1zb3B0KCk7ICRicmVhayAuLworRGltc29wdCAtPiBEaW1zCisKK0FyZ3VtZW50TGlzdG9wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKTsgJGJyZWFrIC4vCitBcmd1bWVudExpc3RvcHQgLT4gQXJndW1lbnRMaXN0CisKK01ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdCA6Oj0gJGVtcHR5CitNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQgLT4gTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlCisgICAKK0Zvcm1hbFBhcmFtZXRlckxpc3RvcHQgOjo9ICRlbXB0eQorLy4kcHV0Y2FzZSBjb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCgpOyAkYnJlYWsgLi8KK0Zvcm1hbFBhcmFtZXRlckxpc3RvcHQgLT4gRm9ybWFsUGFyYW1ldGVyTGlzdAorCitDbGFzc0hlYWRlckltcGxlbWVudHNvcHQgOjo9ICRlbXB0eQorQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0IC0+IENsYXNzSGVhZGVySW1wbGVtZW50cworCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucworLy4gJHB1dENhc2UgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KKworTmVzdGVkVHlwZSA6Oj0gJGVtcHR5IAorLy4kcHV0Q2FzZSBjb25zdW1lTmVzdGVkVHlwZSgpOyAkYnJlYWsuLworCitGb3JJbml0b3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUZvckluaXRvcHQoKTsgJGJyZWFrIC4vCitGb3JJbml0b3B0IC0+IEZvckluaXQKKworRm9yVXBkYXRlb3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUZvclVwZGF0ZW9wdCgpOyAkYnJlYWsgLi8KKyBGb3JVcGRhdGVvcHQgLT4gRm9yVXBkYXRlCisKK0ludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQgOjo9ICRlbXB0eQorSW50ZXJmYWNlSGVhZGVyRXh0ZW5kc29wdCAtPiBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzCisKK0NhdGNoZXNvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5Q2F0Y2hlc29wdCgpOyAkYnJlYWsgLi8KK0NhdGNoZXNvcHQgLT4gQ2F0Y2hlcworCitBcnJheUluaXRpYWxpemVyb3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXJvcHQoKTsgJGJyZWFrIC4vCitBcnJheUluaXRpYWxpemVyb3B0IC0+IEFycmF5SW5pdGlhbGl6ZXIKKworLy4JfQorfSAuLworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJG5hbWVzCisKKy0tIEJvZHlNYXJrZXIgOjo9ICciY2xhc3MgSWRlbnRpZmllciB7IC4uLiBNZXRob2RIZWFkZXIgIicKKworLS0gdm9pZCA6Oj0gJ3ZvaWQnCisKK1BMVVNfUExVUyA6Oj0gICAgJysrJyAgIAorTUlOVVNfTUlOVVMgOjo9ICAgICctLScgICAKK0VRVUFMX0VRVUFMIDo6PSAgICAnPT0nICAgCitMRVNTX0VRVUFMIDo6PSAgICAnPD0nICAgCitHUkVBVEVSX0VRVUFMIDo6PSAgICAnPj0nICAgCitOT1RfRVFVQUwgOjo9ICAgICchPScgICAKK0xFRlRfU0hJRlQgOjo9ICAgICc8PCcgICAKK1JJR0hUX1NISUZUIDo6PSAgICAnPj4nICAgCitVTlNJR05FRF9SSUdIVF9TSElGVCA6Oj0gICAgJz4+PicgIAorUExVU19FUVVBTCA6Oj0gICAgJys9JyAgIAorTUlOVVNfRVFVQUwgOjo9ICAgICctPScgICAKK01VTFRJUExZX0VRVUFMIDo6PSAgICAnKj0nICAgCitESVZJREVfRVFVQUwgOjo9ICAgICcvPScgICAKK0FORF9FUVVBTCA6Oj0gICAgJyY9JyAgIAorT1JfRVFVQUwgOjo9ICAgICd8PScgICAKK1hPUl9FUVVBTCA6Oj0gICAgJ149JyAgIAorUkVNQUlOREVSX0VRVUFMIDo6PSAgICAnJT0nICAgCitMRUZUX1NISUZUX0VRVUFMIDo6PSAgICAnPDw9JyAgCitSSUdIVF9TSElGVF9FUVVBTCA6Oj0gICAgJz4+PScgIAorVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgOjo9ICAgICc+Pj49JyAKK09SX09SIDo6PSAgICAnfHwnICAgCitBTkRfQU5EIDo6PSAgICAnJiYnICAgCisKK1BMVVMgOjo9ICAgICcrJyAgICAKK01JTlVTIDo6PSAgICAnLScgICAgCitOT1QgOjo9ICAgICchJyAgICAKK1JFTUFJTkRFUiA6Oj0gICAgJyUnICAgIAorWE9SIDo6PSAgICAnXicgICAgCitBTkQgOjo9ICAgICcmJyAgICAKK01VTFRJUExZIDo6PSAgICAnKicgICAgCitPUiA6Oj0gICAgJ3wnICAgIAorVFdJRERMRSA6Oj0gICAgJ34nICAgIAorRElWSURFIDo6PSAgICAnLycgICAgCitHUkVBVEVSIDo6PSAgICAnPicgICAgCitMRVNTIDo6PSAgICAnPCcgICAgCitMUEFSRU4gOjo9ICAgICcoJyAgICAKK1JQQVJFTiA6Oj0gICAgJyknICAgIAorTEJSQUNFIDo6PSAgICAneycgICAgCitSQlJBQ0UgOjo9ICAgICd9JyAgICAKK0xCUkFDS0VUIDo6PSAgICAnWycgICAgCitSQlJBQ0tFVCA6Oj0gICAgJ10nICAgIAorU0VNSUNPTE9OIDo6PSAgICAnOycgICAgCitRVUVTVElPTiA6Oj0gICAgJz8nICAgIAorQ09MT04gOjo9ICAgICc6JyAgICAKK0NPTU1BIDo6PSAgICAnLCcgICAgCitET1QgOjo9ICAgICcuJyAgICAKK0VRVUFMIDo6PSAgICAnPScgICAgCisKKyRlbmQKKy0tIG5lZWQgYSBjYXJyaWFnZSByZXR1cm4gYWZ0ZXIgdGhlICRlbmQKKyovCit9Citwcm90ZWN0ZWQgdm9pZCBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpIHsKKwkvLyBBc3NpZ25tZW50IDo6PSBJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50CisJLy8gZW5jb2RlZCBvcGVyYXRvciB3b3VsZCBiZTogaW50U3RhY2tbaW50UHRyXQorCWludFB0ci0tOworCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyIC0tIDsKKwkvLyByZXBvcnQgYSBzeW50YXggZXJyb3IgYW5kIGFib3J0IHBhcnNpbmcKKwlwcm9ibGVtUmVwb3J0ZXIoKS5hcnJheUNvbnN0YW50c09ubHlJbkFycmF5SW5pdGlhbGl6ZXJzKGFycmF5SW5pdGlhbGl6ZXIuc291cmNlU3RhcnQsIGFycmF5SW5pdGlhbGl6ZXIuc291cmNlRW5kKTsgCQorfQorcHJvdGVjdGVkIHZvaWQgaWdub3JlSW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisJLy8gQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbgorCS8vSW50ZXJmYWNlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicgRXh0ZW5kc0ludGVyZmFjZXNvcHQgSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkKKworCS8vIGxlbmd0aCBkZWNsYXJhdGlvbnMKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyLS1dKSAhPSAwKSB7CisJCS8vdGhlcmUgYXJlIGxlbmd0aCBkZWNsYXJhdGlvbnMKKwkJLy9kaXNwYXRjaCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIGRlY2xhcmF0aW9ucworCQlkaXNwYXRjaERlY2xhcmF0aW9uSW50byhsZW5ndGgpOworCX0KKwkKKwlmbHVzaEFubm90YXRpb25zRGVmaW5lZFByaW9yVG8oZW5kU3RhdGVtZW50UG9zaXRpb24pOworCisJLy8gcmVwb3J0IHRoZSBwcm9ibGVtIGFuZCBjb250aW51ZSBwYXJzaW5nCisJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwl0eXBlRGVjbC5ib2R5RW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJcHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90RGVjbGFyZUxvY2FsSW50ZXJmYWNlKHR5cGVEZWNsLm5hbWUsIHR5cGVEZWNsLnNvdXJjZVN0YXJ0LCB0eXBlRGVjbC5zb3VyY2VFbmQpOworCisJLy8gbWFyayBmaWVsZHMgYW5kIGluaXRpYWxpemVyIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAorCW1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKHR5cGVEZWNsKTsKKworCS8vIHJlbW92ZSB0aGUgYXN0IG5vZGUgY3JlYXRlZCBpbiBpbnRlcmZhY2UgaGVhZGVyCisJYXN0UHRyLS07CQorCS8vIERvbid0IGNyZWF0ZSBhbiBhc3Rub2RlIGZvciB0aGlzIGlubmVyIGludGVyZmFjZSwgYnV0IGhhdmUgdG8gcHVzaAorCS8vIGEgMCBvbiB0aGUgYXN0TGVuZ3RoU3RhY2sgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSByZWR1Y3Rpb24gbWFkZQorCS8vIGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZDoKKwkvLyBwdWJsaWMgdm9pZCBwYXJzZShNZXRob2REZWNsYXJhdGlvbiBtZCwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkKKwlwdXNoT25Bc3RMZW5ndGhTdGFjaygwKTsKK30KK3Byb3RlY3RlZCB2b2lkIGlnbm9yZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGJvb2xlYW4gaGFzQm9keSkgeworCS8vIEludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkgPT0+IHRydWUKKwkvLyBJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgJzsnID09PiBmYWxzZQorCisJLyoKKwlhc3RTdGFjayA6IG1vZGlmaWVycyBhcmd1bWVudHMgdGhyb3dzIHN0YXRlbWVudHMKKwlpZGVudGlmaWVyU3RhY2sgOiBuYW1lCisJID09PgorCWFzdFN0YWNrIDogTWV0aG9kRGVjbGFyYXRpb24KKwlpZGVudGlmaWVyU3RhY2sgOgorCSovCisKKwkvL211c3QgcHJvdmlkZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgY2FsbCB3aGVuIG5lZWRlZAorCisJaWYgKGhhc0JvZHkpIHsKKwkJLy8gcG9wIHRoZSBwb3NpdGlvbiBvZiB0aGUgeyAgKGJvZHkgb2YgdGhlIG1ldGhvZCkgcHVzaGVkIGluIGJsb2NrIGRlY2wKKwkJaW50UHRyLS07CisJfQorCisJLy9zdGF0ZW1lbnRzCisJaWYgKGhhc0JvZHkpIHsKKwkJcmVhbEJsb2NrUHRyLS07CisJfQorCisJaW50IGxlbmd0aDsKKwlpZiAoaGFzQm9keSAmJiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkpIHsKKwkJYXN0UHRyIC09IGxlbmd0aDsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBpZ25vcmVNZXRob2RCb2R5KCkgeworCS8vIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBJbnZhbGlkTWV0aG9kRGVjbGFyYXRpb24KKworCS8qCisJYXN0U3RhY2sgOiBtb2RpZmllcnMgYXJndW1lbnRzIHRocm93cyBzdGF0ZW1lbnRzCisJaWRlbnRpZmllclN0YWNrIDogdHlwZSBuYW1lCisJaW50U3RhY2sgOiBkaW0gZGltIGRpbQorCSA9PT4KKwlhc3RTdGFjayA6IE1ldGhvZERlY2xhcmF0aW9uCisJaWRlbnRpZmllclN0YWNrIDoKKwlpbnRTdGFjayA6IAorCSovCisKKwkvLyBwb3AgdGhlIHBvc2l0aW9uIG9mIHRoZSB7ICAoYm9keSBvZiB0aGUgbWV0aG9kKSBwdXNoZWQgaW4gYmxvY2sgZGVjbAorCWludFB0ci0tOworCS8vIHJldHJpZXZlIGVuZCBwb3NpdGlvbiBvZiBtZXRob2QgZGVjbGFyYXRvcgorCisJLy9zdGF0ZW1lbnRzCisJcmVhbEJsb2NrUHRyLS07CisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkgeworCQlhc3RQdHIgLT0gbGVuZ3RoOworCX0KKworCS8vd2F0Y2ggZm9yIH0gdGhhdCBjb3VsZCBiZSBnaXZlbiBhcyBhIHVuaWNvZGUgISAoIHUwMDdEIGlzICd9JyApCisJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJbWQuYm9keUVuZCA9IGVuZFBvc2l0aW9uOworCW1kLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZmx1c2hBbm5vdGF0aW9uc0RlZmluZWRQcmlvclRvKGVuZFN0YXRlbWVudFBvc2l0aW9uKTsKKworCS8vIHJlcG9ydCB0aGUgcHJvYmxlbSBhbmQgY29udGludWUgdGhlIHBhcnNpbmcgLSBuYXJyb3dpbmcgdGhlIHByb2JsZW0gb250byB0aGUgbWV0aG9kCisJcHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2ROZWVkaW5nTm9Cb2R5KG1kKTsKK30KK3B1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJLy9wb3NpdGlvbm5pbmcgdGhlIHBhcnNlciBmb3IgYSBuZXcgY29tcGlsYXRpb24gdW5pdAorCS8vYXZvaWRpbmcgc3RhY2sgcmVhbGxvY2F0aW9uIGFuZCBhbGwgdGhhdC4uLi4KKwlhc3RQdHIgPSAtMTsKKwlhc3RMZW5ndGhQdHIgPSAtMTsKKwlleHByZXNzaW9uUHRyID0gLTE7CisJZXhwcmVzc2lvbkxlbmd0aFB0ciA9IC0xOworCWlkZW50aWZpZXJQdHIgPSAtMTsJCisJaWRlbnRpZmllckxlbmd0aFB0cgk9IC0xOworCWludFB0ciA9IC0xOworCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlID0gMF0gPSAwOyAvLyBuZWVkIHRvIHJlc2V0IGZvciBmdXJ0aGVyIHJldXNlCisJdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSA9IDA7CisJZGltZW5zaW9ucyA9IDAgOworCXJlYWxCbG9ja1B0ciA9IC0xOworCWNvbXBpbGF0aW9uVW5pdCA9IG51bGw7CisJcmVmZXJlbmNlQ29udGV4dCA9IG51bGw7CisJZW5kU3RhdGVtZW50UG9zaXRpb24gPSAwOworCisJLy9yZW1vdmUgb2JqZWN0cyBmcm9tIHN0YWNrIHRvbywgd2hpbGUgdGhlIHNhbWUgcGFyc2VyL2NvbXBpbGVyIGNvdXBsZSBpcworCS8vcmUtdXNlZCBiZXR3ZWVuIHR3byBjb21waWxhdGlvbnMgLi4uLgorCQorCWludCBhc3RMZW5ndGggPSBhc3RTdGFjay5sZW5ndGg7CisJaWYgKG5vQXN0Tm9kZXMubGVuZ3RoIDwgYXN0TGVuZ3RoKXsKKwkJbm9Bc3ROb2RlcyA9IG5ldyBBc3ROb2RlW2FzdExlbmd0aF07CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNpemVkIEFTVCBzdGFja3MgOiAiKyBhc3RMZW5ndGgpOworCQkKKwl9CisJU3lzdGVtLmFycmF5Y29weShub0FzdE5vZGVzLCAwLCBhc3RTdGFjaywgMCwgYXN0TGVuZ3RoKTsKKworCWludCBleHByZXNzaW9uTGVuZ3RoID0gZXhwcmVzc2lvblN0YWNrLmxlbmd0aDsKKwlpZiAobm9FeHByZXNzaW9ucy5sZW5ndGggPCBleHByZXNzaW9uTGVuZ3RoKXsKKwkJbm9FeHByZXNzaW9ucyA9IG5ldyBFeHByZXNzaW9uW2V4cHJlc3Npb25MZW5ndGhdOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzaXplZCBFWFBSIHN0YWNrcyA6ICIrIGV4cHJlc3Npb25MZW5ndGgpOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5vRXhwcmVzc2lvbnMsIDAsIGV4cHJlc3Npb25TdGFjaywgMCwgZXhwcmVzc2lvbkxlbmd0aCk7CisKKwkvLyByZXNldCBzY2FubmVyIHN0YXRlCisJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisJc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCisJcmVzZXRNb2RpZmllcnMoKTsKKworCS8vIHJlY292ZXJ5CisJbGFzdENoZWNrUG9pbnQgPSAtMTsKKwljdXJyZW50RWxlbWVudCA9IG51bGw7CisJcmVzdGFydFJlY292ZXJ5ID0gZmFsc2U7CisJaGFzUmVwb3J0ZWRFcnJvciA9IGZhbHNlOworCXJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPSAwOworCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwlsYXN0RXJyb3JFbmRQb3NpdGlvbiA9IC0xOworCWxpc3RMZW5ndGggPSAwOworfQorcHVibGljIHZvaWQgaW5pdGlhbGl6ZVNjYW5uZXIoKXsKKwl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgZmFsc2UsIHRoaXMucHJvYmxlbVJlcG9ydGVyLm9wdGlvbnMuZ2V0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbFNldmVyaXR5KCkgIT0gUHJvYmxlbVNldmVyaXRpZXMuSWdub3JlICwgdGhpcy5hc3NlcnRNb2RlKTsKK30KK3B1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBpbml0VGFibGVzKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCisJZmluYWwgU3RyaW5nIHByZWZpeCA9IEZJTEVQUkVGSVg7CisJaW50IGkgPSAwOworCWxocyA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gY2hhcnMgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJY2hlY2tfdGFibGUgPSBuZXcgc2hvcnRbY2hhcnMubGVuZ3RoXTsKKwlmb3IgKGludCBjID0gY2hhcnMubGVuZ3RoOyBjLS0gPiAwOykgeworCQljaGVja190YWJsZVtjXSA9IChzaG9ydCkgKGNoYXJzW2NdIC0gMzI3NjgpOworCX0KKwlhc2IgPSByZWFkVGFibGUocHJlZml4ICsgKCsraSkgKyAiLnJzYyIpOyAvLyROT04tTkxTLTEkCisJYXNyID0gcmVhZFRhYmxlKHByZWZpeCArICgrK2kpICsgIi5yc2MiKTsgLy8kTk9OLU5MUy0xJAorCXN5bWJvbF9pbmRleCA9IHJlYWRUYWJsZShwcmVmaXggKyAoKytpKSArICIucnNjIik7IC8vJE5PTi1OTFMtMSQKKwlhY3Rpb24gPSBsaHM7Cit9CitwdWJsaWMgZmluYWwgdm9pZCBqdW1wT3Zlck1ldGhvZEJvZHkoKSB7CisJLy9vbiBkaWV0IHBhcnNpbmcuLi4uLmRvIG5vdCBidWZmZXIgbWV0aG9kIHN0YXRlbWVudHMKKworCS8vdGhlIHNjYW5uZXIuZGlldCBpcyByZWluaXRpYWxpemVkIHRvIGZhbHNlCisJLy9hdXRvbWF0aWNhbGx5IGJ5IHRoZSBzY2FubmVyIG9uY2UgaXQgaGFzIGp1bXBlZCBvdmVyCisJLy90aGUgc3RhdGVtZW50cworCisJaWYgKGRpZXQgJiYgKGRpZXRJbnQgPT0gMCkpCisJCXNjYW5uZXIuZGlldCA9IHRydWU7Cit9Citwcm90ZWN0ZWQgdm9pZCBtYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKSB7CisJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuOyAvLyB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgcmVjb3ZlcnkgY29kZQorCWZvciAoaW50IGkgPSB0aGlzLmFzdFB0cjsgaSA+PSAwOyBpLS0pIHsKKwkJQXN0Tm9kZSBub2RlID0gdGhpcy5hc3RTdGFja1tpXTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIAorCQkJCXx8IG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsgLy8gbWFyayB0eXBlIGZvciBub3c6IGFsbCBmaWVsZHMgd2lsbCBiZSBtYXJrZWQgd2hlbiBhZGRlZCB0byB0aGlzIHR5cGUKKwkJCW5vZGUuYml0cyB8PSBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0s7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLy8gZGVmYXVsdCB0byByZWZlcmVuY2UgY29udGV4dCAoY2FzZSBvZiBwYXJzZSBtZXRob2QgYm9keSkKKwlpZiAodGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgorCQkJfHwgdGhpcy5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCSgoQXN0Tm9kZSl0aGlzLnJlZmVyZW5jZUNvbnRleHQpLmJpdHMgfD0gQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIG1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKFR5cGVEZWNsYXJhdGlvbiB0eXBlKSB7CisJaWYgKHR5cGUuZmllbGRzID09IG51bGwgfHwgKHR5cGUuYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgPT0gMCkgcmV0dXJuOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlLmZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQl0eXBlLmZpZWxkc1tpXS5iaXRzIHw9IEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSzsKKwl9Cit9CisvKgorICogTW92ZSBjaGVja3BvaW50IGxvY2F0aW9uIChjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG1vdmluZyBpdCBieSBvbmUgdG9rZW4pCisgKgorICogQW5zd2VycyB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBtb3ZlZCBjaGVja3BvaW50IChpLmUuIGRpZCBub3QgYXR0ZW1wdCB0byBtb3ZlIGl0CisgKiBiZXlvbmQgZW5kIG9mIGZpbGUpLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVjb3ZlcnlDaGVja3BvaW50KCkgeworCisJaW50IHBvcyA9IGxhc3RDaGVja1BvaW50OworCS8qIHJlc2V0IHNjYW5uZXIsIGFuZCBtb3ZlIGNoZWNrcG9pbnQgYnkgb25lIHRva2VuICovCisJc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gcG9zOworCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gcG9zOworCXNjYW5uZXIuZGlldCA9IGZhbHNlOyAvLyBxdWl0IGp1bXBpbmcgb3ZlciBtZXRob2QgYm9kaWVzCisJCisJLyogaWYgYWJvdXQgdG8gcmVzdGFydCwgdGhlbiBubyBuZWVkIHRvIHNoaWZ0IHRva2VuICovCisJaWYgKHJlc3RhcnRSZWNvdmVyeSl7CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qIHByb3RlY3QgYWdhaW5zdCBzaGlmdGluZyBvbiBhbiBpbnZhbGlkIHRva2VuICovCisJbGFzdElnbm9yZWRUb2tlbiA9IG5leHRJZ25vcmVkVG9rZW47CisJbmV4dElnbm9yZWRUb2tlbiA9IC0xOworCWRvIHsKKwkJdHJ5IHsKKwkJCW5leHRJZ25vcmVkVG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJaWYoc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPT0gc2Nhbm5lci5zdGFydFBvc2l0aW9uKXsKKwkJCQlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbisrOyAvLyBvbiBmYWtlIGNvbXBsZXRpb24gaWRlbnRpZmllcgorCQkJCW5leHRJZ25vcmVkVG9rZW4gPSAtMTsKKwkJCX0KKwkJCQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKKwkJCXBvcyA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQl9CisJfSB3aGlsZSAobmV4dElnbm9yZWRUb2tlbiA8IDApOworCQorCWlmIChuZXh0SWdub3JlZFRva2VuID09IFRva2VuTmFtZUVPRikgeyAvLyBubyBtb3JlIHJlY292ZXJ5IGFmdGVyIHRoaXMgcG9pbnQKKwkJaWYgKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVFT0YpIHsgLy8gYWxyZWFkeSB0cmllZCBvbmUgaXRlcmF0aW9uIG9uIEVPRgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCWxhc3RDaGVja1BvaW50ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCisJLyogcmVzZXQgc2Nhbm5lciBhZ2FpbiB0byBwcmV2aW91cyBjaGVja3BvaW50IGxvY2F0aW9uKi8KKwlzY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBwb3M7CisJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBwb3M7CisJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisKKwlyZXR1cm4gdHJ1ZTsKKworLyoKKyAJVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyB0aGUgY2hlY2twb2ludCBsb2NhdGlvbiBieSBvbmUgbGluZToKKwkgCisJaW50IHBvcyA9IGxhc3RDaGVja1BvaW50OworCS8vIHJlc2V0IHNjYW5uZXIsIGFuZCBtb3ZlIGNoZWNrcG9pbnQgYnkgb25lIHRva2VuCisJc2Nhbm5lci5zdGFydFBvc2l0aW9uID0gcG9zOworCXNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gcG9zOworCXNjYW5uZXIuZGlldCA9IGZhbHNlOyAvLyBxdWl0IGp1bXBpbmcgb3ZlciBtZXRob2QgYm9kaWVzCisJCisJLy8gaWYgYWJvdXQgdG8gcmVzdGFydCwgdGhlbiBubyBuZWVkIHRvIHNoaWZ0IHRva2VuCisJaWYgKHJlc3RhcnRSZWNvdmVyeSl7CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8vIHByb3RlY3QgYWdhaW5zdCBzaGlmdGluZyBvbiBhbiBpbnZhbGlkIHRva2VuCisJbGFzdElnbm9yZWRUb2tlbiA9IG5leHRJZ25vcmVkVG9rZW47CisJbmV4dElnbm9yZWRUb2tlbiA9IC0xOworCQorCWJvb2xlYW4gd2FzVG9rZW5pemluZ1doaXRlU3BhY2UgPSBzY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZTsKKwlzY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRydWU7CisJY2hlY2twb2ludE1vdmU6IAorCQlkbyB7CisJCQl0cnkgeworCQkJCW5leHRJZ25vcmVkVG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCXN3aXRjaChuZXh0SWdub3JlZFRva2VuKXsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UgOgorCQkJCQkJaWYoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHNjYW5uZXIuc3RhcnRQb3NpdGlvbikKKwkJCQkJCQk9PSBzY2FubmVyLmdldExpbmVOdW1iZXIoc2Nhbm5lci5jdXJyZW50UG9zaXRpb24pKXsKKwkJCQkJCQluZXh0SWdub3JlZFRva2VuID0gLTE7CisJCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOgorCQkJCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyIDoKKwkJCQkJCWlmKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uID09IHNjYW5uZXIuc3RhcnRQb3NpdGlvbil7CisJCQkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24rKzsgLy8gb24gZmFrZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKKwkJCQkJCX0KKwkJCQkJZGVmYXVsdDoJCQkJCQkKKwkJCQkJCW5leHRJZ25vcmVkVG9rZW4gPSAtMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZUVPRiA6CisJCQkJCQlicmVhayBjaGVja3BvaW50TW92ZTsKKwkJCQl9CisJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKKwkJCQlwb3MgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCX0KKwkJfSB3aGlsZSAobmV4dElnbm9yZWRUb2tlbiA8IDApOworCXNjYW5uZXIudG9rZW5pemVXaGl0ZVNwYWNlID0gd2FzVG9rZW5pemluZ1doaXRlU3BhY2U7CisJCisJaWYgKG5leHRJZ25vcmVkVG9rZW4gPT0gVG9rZW5OYW1lRU9GKSB7IC8vIG5vIG1vcmUgcmVjb3ZlcnkgYWZ0ZXIgdGhpcyBwb2ludAorCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUVPRikgeyAvLyBhbHJlYWR5IHRyaWVkIG9uZSBpdGVyYXRpb24gb24gRU9GCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkKKwkvLyByZXNldCBzY2FubmVyIGFnYWluIHRvIHByZXZpb3VzIGNoZWNrcG9pbnQgbG9jYXRpb24KKwlzY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBwb3M7CisJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPSBwb3M7CisJc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisKKwlyZXR1cm4gdHJ1ZTsKKyovCit9Citwcm90ZWN0ZWQgTWVzc2FnZVNlbmQgbmV3TWVzc2FnZVNlbmQoKSB7CisJLy8gJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKKwkvLyB0aGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjaworCisJTWVzc2FnZVNlbmQgbSA9IG5ldyBNZXNzYWdlU2VuZCgpOworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWV4cHJlc3Npb25TdGFjaywgCisJCQlleHByZXNzaW9uUHRyICsgMSwgCisJCQltLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAorCQkJMCwgCisJCQlsZW5ndGgpOyAKKwl9OworCXJldHVybiBtOworfQorcHJvdGVjdGVkIHN0YXRpYyBpbnQgbnRBY3Rpb24oaW50IHN0YXRlLCBpbnQgc3ltKSB7CisJcmV0dXJuIGFjdGlvbltzdGF0ZSArIHN5bV07Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgb3B0aW1pemVkQ29uY2F0Tm9kZUxpc3RzKCkgeworCS8qYmFjayBmcm9tIGEgcmVjdXJzaXZlIGxvb3AuIFZpcnR1YWx5IGdyb3VwIHRoZQorCWFzdE5vZGUgaW50byBhbiBhcnJheSB1c2luZyBhc3RMZW5ndGhTdGFjayovCisKKwkvKgorCSAqIFRoaXMgaXMgYSBjYXNlIHdoZXJlIHlvdSBoYXZlIHR3byBzdWJsaXN0cyBpbnRvIHRoZSBhc3RTdGFjayB0aGF0IHlvdSB3YW50CisJICogdG8gbWVyZ2UgaW4gb25lIGxpc3QuIFRoZXJlIGlzIG5vIGFjdGlvbiByZXF1aXJlZCBvbiB0aGUgYXN0U3RhY2suIFRoZSBvbmx5CisJICogdGhpbmcgeW91IG5lZWQgdG8gZG8gaXMgbWVyZ2UgdGhlIHR3byBsZW5ndGhzIHNwZWNpZmllZCBvbiB0aGUgYXN0U3RhY2tMZW5ndGguCisJICogVGhlIHRvcCB0d28gbGVuZ3RoIGFyZSBmb3IgZXhhbXBsZToKKwkgKiAuLi4gcCAgIG4KKwkgKiBhbmQgeW91IHdhbnQgdG8gcmVzdWx0IGluIGEgbGlzdCBsaWtlOgorCSAqIC4uLiBuK3AgCisJICogVGhpcyBtZWFucyB0aGF0IHRoZSBwIGNvdWxkIGJlIGVxdWFscyB0byAwIGluIGNhc2UgdGhlcmUgaXMgbm8gYXN0Tm9kZSBwdXNoZWQKKwkgKiBvbiB0aGUgYXN0U3RhY2suCisJICogTG9vayBhdCB0aGUgSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIGZvciBhbiBleGFtcGxlLgorCSAqIFRoaXMgY2FzZSBvcHRpbWl6ZXMgdGhlIGZhY3QgdGhhdCBwID09IDEuCisJICovCisKKwlhc3RMZW5ndGhTdGFja1stLWFzdExlbmd0aFB0cl0rKzsKK30KK3Byb3RlY3RlZCBzdGF0aWMgaW50IG9yaWdpbmFsX3N0YXRlKGludCBzdGF0ZSkgeworCXJldHVybiAtY2hlY2soc3RhdGUpOworfQorLyptYWluIGxvb3Agb2YgdGhlIGF1dG9tYXQKK1doZW4gYSBydWxlIGlzIHJlZHVjZWQsIHRoZSBtZXRob2QgY29uc3VtZVJ1bGUoaW50KSBpcyBjYWxsZWQgd2l0aCB0aGUgbnVtYmVyCitvZiB0aGUgY29uc3VtZWQgcnVsZS4gV2hlbiBhIHRlcm1pbmFsIGlzIGNvbnN1bWVkLCB0aGUgbWV0aG9kIGNvbnN1bWVUb2tlbihpbnQpIGlzIAorY2FsbGVkIGluIG9yZGVyIHRvIHJlbWVtYmVyICh3aGVuIG5lZWRlZCkgdGhlIGNvbnN1bWVkIHRva2VuICovCisvLyAoaW50KWFzclthc2koYWN0KV0KKy8vIG5hbWVbc3ltYm9sX2luZGV4W2N1cnJlbnRLaW5kXV0KK3Byb3RlY3RlZCB2b2lkIHBhcnNlKCkgeworCisJaGFzUmVwb3J0ZWRFcnJvciA9IGZhbHNlOworCWludCBhY3QgPSBTVEFSVF9TVEFURTsKKwlzdGF0ZVN0YWNrVG9wID0gLTE7CisJY3VycmVudFRva2VuID0gZ2V0Rmlyc3RUb2tlbigpOworCVByb2Nlc3NUZXJtaW5hbHMgOiBmb3IgKDs7KSB7CisJCXRyeSB7CisJCQlzdGFja1srK3N0YXRlU3RhY2tUb3BdID0gYWN0OworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCWludCBvbGRTdGFja0xlbmd0aCA9IHN0YWNrLmxlbmd0aDsKKwkJCWludCBvbGRTdGFja1tdID0gc3RhY2s7CisJCQlzdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBzdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQkJc3RhY2tbc3RhdGVTdGFja1RvcF0gPSBhY3Q7CisJCX07CisKKwkJYWN0ID0gdEFjdGlvbihhY3QsIGN1cnJlbnRUb2tlbik7CisKKwkJaWYgKGFjdCA9PSBFUlJPUl9BQ1RJT04gfHwgcmVzdGFydFJlY292ZXJ5KSB7CisJCQlpbnQgZXJyb3JQb3MgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCWlmICghaGFzUmVwb3J0ZWRFcnJvcil7CisJCQkJdGhpcy5yZXBvcnRTeW50YXhFcnJvcihFUlJPUl9BQ1RJT04sIGN1cnJlbnRUb2tlbiwgc3RhdGVTdGFja1RvcCk7CisJCQkJaGFzUmVwb3J0ZWRFcnJvciA9IHRydWU7CisJCQl9CisJCQlpZiAocmVzdW1lT25TeW50YXhFcnJvcigpKSB7CisJCQkJaWYgKGFjdCA9PSBFUlJPUl9BQ1RJT04pIGxhc3RFcnJvckVuZFBvc2l0aW9uID0gZXJyb3JQb3M7CisJCQkJYWN0ID0gU1RBUlRfU1RBVEU7CisJCQkJc3RhdGVTdGFja1RvcCA9IC0xOworCQkJCWN1cnJlbnRUb2tlbiA9IGdldEZpcnN0VG9rZW4oKTsKKwkJCQljb250aW51ZSBQcm9jZXNzVGVybWluYWxzOworCQkJfSBlbHNlIHsKKwkJCQlhY3QgPSBFUlJPUl9BQ1RJT047CisJCQl9CWJyZWFrIFByb2Nlc3NUZXJtaW5hbHM7CisJCX0KKwkJaWYgKGFjdCA8PSBOVU1fUlVMRVMpCisJCQlzdGF0ZVN0YWNrVG9wLS07CisJCWVsc2UKKwkJCWlmIChhY3QgPiBFUlJPUl9BQ1RJT04pIHsgLyogc2hpZnQtcmVkdWNlICovCisJCQkJY29uc3VtZVRva2VuKGN1cnJlbnRUb2tlbik7CisJCQkJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHRoaXMucmVjb3ZlcnlUb2tlbkNoZWNrKCk7CisJCQkJdHJ5eworCQkJCQljdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpeworCQkJCQlpZiAoIWhhc1JlcG9ydGVkRXJyb3IpeworCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5zY2FubmVyRXJyb3IodGhpcywgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJaGFzUmVwb3J0ZWRFcnJvciA9IHRydWU7CisJCQkJCX0KKwkJCQkJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKKwkJCQl9CQkJCQkKKwkJCQlhY3QgLT0gRVJST1JfQUNUSU9OOworCQkJfSBlbHNlCisJCQkJaWYgKGFjdCA8IEFDQ0VQVF9BQ1RJT04pIHsgLyogc2hpZnQgKi8KKwkJCQkJY29uc3VtZVRva2VuKGN1cnJlbnRUb2tlbik7CisJCQkJCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQkJCQl0cnl7CisJCQkJCQljdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKXsKKwkJCQkJCWlmICghaGFzUmVwb3J0ZWRFcnJvcil7CisJCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5zY2FubmVyRXJyb3IodGhpcywgZS5nZXRNZXNzYWdlKCkpOworCQkJCQkJCWhhc1JlcG9ydGVkRXJyb3IgPSB0cnVlOworCQkJCQkJfQorCQkJCQkJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCQkJCX0JCQkJCQorCQkJCQljb250aW51ZSBQcm9jZXNzVGVybWluYWxzOworCQkJCX0gZWxzZQorCQkJCQlicmVhayBQcm9jZXNzVGVybWluYWxzOworCisJCVByb2Nlc3NOb25UZXJtaW5hbHMgOiBkbyB7IC8qIHJlZHVjZSAqLworCQkJY29uc3VtZVJ1bGUoYWN0KTsKKwkJCXN0YXRlU3RhY2tUb3AgLT0gKHJoc1thY3RdIC0gMSk7CisJCQlhY3QgPSBudEFjdGlvbihzdGFja1tzdGF0ZVN0YWNrVG9wXSwgbGhzW2FjdF0pOworCQl9IHdoaWxlIChhY3QgPD0gTlVNX1JVTEVTKTsKKwl9CisJZW5kUGFyc2UoYWN0KTsKK30KKy8vIEEgUCBJCisKK3B1YmxpYyB2b2lkIHBhcnNlKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwkvL29ubHkgcGFyc2UgdGhlIG1ldGhvZCBib2R5IG9mIGNkCisJLy9maWxsIG91dCBpdHMgc3RhdGVtZW50cworCisJLy9jb252ZXJ0IGJ1Z3MgaW50byBwYXJzZSBlcnJvcgorCisJaW5pdGlhbGl6ZSgpOworCWdvRm9yQ29uc3RydWN0b3JCb2R5KCk7CisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdKys7CisKKwlyZWZlcmVuY2VDb250ZXh0ID0gY2Q7CisJY29tcGlsYXRpb25Vbml0ID0gdW5pdDsKKworCXNjYW5uZXIucmVzZXRUbyhjZC5zb3VyY2VFbmQgKyAxLCBjZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJdHJ5IHsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJCWxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CisJfSBmaW5hbGx5IHsKKwkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CisJfQorCisJaWYgKGxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisJCWluaXRpYWxpemUoKTsKKwkJcmV0dXJuOworCX0KKworCS8vc3RhdGVtZW50cworCWNkLmV4cGxpY2l0RGVjbGFyYXRpb25zID0gcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyLS1dOworCWludCBsZW5ndGg7CisJaWYgKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pICE9IDApIHsKKwkJYXN0UHRyIC09IGxlbmd0aDsKKwkJaWYgKGFzdFN0YWNrW2FzdFB0ciArIDFdIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCisJCQkvL2F2b2lkIGEgaXNTb21lVGhpbmcgdGhhdCB3b3VsZCBvbmx5IGJlIHVzZWQgaGVyZSBCVVQgd2hhdCBpcyBmYXN0ZXIgYmV0d2VlbiB0d28gYWx0ZXJuYXRpdmVzID8KKwkJCXsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYXN0U3RhY2ssIAorCQkJCWFzdFB0ciArIDIsIAorCQkJCWNkLnN0YXRlbWVudHMgPSBuZXcgU3RhdGVtZW50W2xlbmd0aCAtIDFdLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGggLSAxKTsgCisJCQljZC5jb25zdHJ1Y3RvckNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGFzdFN0YWNrW2FzdFB0ciArIDFdOworCQl9IGVsc2UgeyAvL25lZWQgdG8gYWRkIGV4cGxpY2l0bHkgdGhlIHN1cGVyKCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWFzdFN0YWNrLCAKKwkJCQlhc3RQdHIgKyAxLCAKKwkJCQljZC5zdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtsZW5ndGhdLCAKKwkJCQkwLCAKKwkJCQlsZW5ndGgpOyAKKwkJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKKwkJfQorCX0gZWxzZSB7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKKwl9CisKKwlpZiAoY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9PSAwKSB7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSBjZC5zb3VyY2VFbmQ7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IGNkLnNvdXJjZVN0YXJ0OworCX0KK30KKy8vIEEgUCBJCisKK3B1YmxpYyB2b2lkIHBhcnNlKAorCUluaXRpYWxpemVyIGluaSwgCisJVHlwZURlY2xhcmF0aW9uIHR5cGUsIAorCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwkvL29ubHkgcGFyc2UgdGhlIG1ldGhvZCBib2R5IG9mIG1kCisJLy9maWxsIG91dCBtZXRob2Qgc3RhdGVtZW50cworCisJLy9jb252ZXJ0IGJ1Z3MgaW50byBwYXJzZSBlcnJvcgorCisJaW5pdGlhbGl6ZSgpOworCWdvRm9ySW5pdGlhbGl6ZXIoKTsKKwluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0rKzsKKworCXJlZmVyZW5jZUNvbnRleHQgPSB0eXBlOworCWNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7CisKKwlzY2FubmVyLnJlc2V0VG8oaW5pLnNvdXJjZVN0YXJ0LCBpbmkuc291cmNlRW5kKTsgLy8ganVzdCBvbiB0aGUgYmVnaW5uaW5nIHsKKwl0cnkgeworCQlwYXJzZSgpOworCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZXgpIHsKKwkJbGFzdEFjdCA9IEVSUk9SX0FDVElPTjsKKwl9IGZpbmFsbHkgeworCQluZXN0ZWRNZXRob2RbbmVzdGVkVHlwZV0tLTsKKwl9CisKKwlpZiAobGFzdEFjdCA9PSBFUlJPUl9BQ1RJT04pIHsKKwkJcmV0dXJuOworCX0KKworCWluaS5ibG9jayA9ICgoSW5pdGlhbGl6ZXIpIGFzdFN0YWNrW2FzdFB0cl0pLmJsb2NrOworCQorCS8vIG1hcmsgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCB0eXBlIGlmIG9uZSB3YXMgZm91bmQgZHVyaW5nIHBhcnNpbmcKKwlpZiAoKHR5cGUuYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgIT0gMCkgeworCQlpbmkuYml0cyB8PSBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0s7CisJfQkKK30KKy8vIEEgUCBJCisKK3B1YmxpYyB2b2lkIHBhcnNlKE1ldGhvZERlY2xhcmF0aW9uIG1kLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJLy9vbmx5IHBhcnNlIHRoZSBtZXRob2QgYm9keSBvZiBtZAorCS8vZmlsbCBvdXQgbWV0aG9kIHN0YXRlbWVudHMKKworCS8vY29udmVydCBidWdzIGludG8gcGFyc2UgZXJyb3IKKworCWlmIChtZC5pc0Fic3RyYWN0KCkpCisJCXJldHVybjsKKwlpZiAobWQuaXNOYXRpdmUoKSkKKwkJcmV0dXJuOworCWlmICgobWQubW9kaWZpZXJzICYgQWNjU2VtaWNvbG9uQm9keSkgIT0gMCkKKwkJcmV0dXJuOworCisJaW5pdGlhbGl6ZSgpOworCWdvRm9yTWV0aG9kQm9keSgpOworCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSsrOworCisJcmVmZXJlbmNlQ29udGV4dCA9IG1kOworCWNvbXBpbGF0aW9uVW5pdCA9IHVuaXQ7CisKKwlzY2FubmVyLnJlc2V0VG8obWQuc291cmNlRW5kICsgMSwgbWQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOyAKKwkvLyByZXNldCB0aGUgc2Nhbm5lciB0byBwYXJzZXIgZnJvbSB7IGRvd24gdG8gfQorCXRyeSB7CisJCXBhcnNlKCk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBleCkgeworCQlsYXN0QWN0ID0gRVJST1JfQUNUSU9OOworCX0gZmluYWxseSB7CisJCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXS0tOwkJCisJfQorCisJaWYgKGxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisJCXJldHVybjsKKwl9CisKKwkvL3JlZmlsbCBzdGF0ZW1lbnRzCisJbWQuZXhwbGljaXREZWNsYXJhdGlvbnMgPSByZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHItLV07CisJaW50IGxlbmd0aDsKKwlpZiAoKGxlbmd0aCA9IGFzdExlbmd0aFN0YWNrW2FzdExlbmd0aFB0ci0tXSkgIT0gMCkKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCWFzdFN0YWNrLCAKKwkJCShhc3RQdHIgLT0gbGVuZ3RoKSArIDEsIAorCQkJbWQuc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoXSwgCisJCQkwLCAKKwkJCWxlbmd0aCk7IAorfQorLy8gQSBQIEkKKworcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlKAorCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgCisJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwkvLyBwYXJzZXMgYSBjb21waWxhdGlvbiB1bml0IGFuZCBtYW5hZ2VzIGVycm9yIGhhbmRsaW5nIChldmVuIGJ1Z3MuLi4uKQorCisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdDsKKwl0cnkgeworCQkvKiBhdXRvbWF0b24gaW5pdGlhbGl6YXRpb24gKi8KKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvckNvbXBpbGF0aW9uVW5pdCgpOworCisJCS8qIHNjYW5uZXIgaW5pdGlhbGl6YXRpb24gKi8KKwkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlVW5pdC5nZXRDb250ZW50cygpKTsKKworCQkvKiB1bml0IGNyZWF0aW9uICovCisJCXJlZmVyZW5jZUNvbnRleHQgPSAKKwkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJCQkJcHJvYmxlbVJlcG9ydGVyLCAKKwkJCQkJY29tcGlsYXRpb25SZXN1bHQsIAorCQkJCQlzY2FubmVyLnNvdXJjZS5sZW5ndGgpOworCQkvKiBydW4gYXV0b21hdG9uICovCisJCXBhcnNlKCk7CisJfSBmaW5hbGx5IHsKKwkJdW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKKwkJY29tcGlsYXRpb25Vbml0ID0gbnVsbDsgLy8gcmVzZXQgcGFyc2VyCisJfQorCXJldHVybiB1bml0OworfQorLy8gQSBQIEkKKworcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlKAorCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwgCisJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQsCisJaW50IHN0YXJ0LAorCWludCBlbmQpIHsKKwkvLyBwYXJzZXMgYSBjb21waWxhdGlvbiB1bml0IGFuZCBtYW5hZ2VzIGVycm9yIGhhbmRsaW5nIChldmVuIGJ1Z3MuLi4uKQorCisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdDsKKwl0cnkgeworCQkvKiBhdXRvbWF0b24gaW5pdGlhbGl6YXRpb24gKi8KKwkJaW5pdGlhbGl6ZSgpOworCQlnb0ZvckNvbXBpbGF0aW9uVW5pdCgpOworCisJCS8qIHNjYW5uZXIgaW5pdGlhbGl6YXRpb24gKi8KKwkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlVW5pdC5nZXRDb250ZW50cygpKTsKKwkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQkvKiB1bml0IGNyZWF0aW9uICovCisJCXJlZmVyZW5jZUNvbnRleHQgPSAKKwkJCWNvbXBpbGF0aW9uVW5pdCA9IAorCQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKKwkJCQkJcHJvYmxlbVJlcG9ydGVyLCAKKwkJCQkJY29tcGlsYXRpb25SZXN1bHQsIAorCQkJCQlzY2FubmVyLnNvdXJjZS5sZW5ndGgpOworCQkvKiBydW4gYXV0b21hdG9uICovCisJCXBhcnNlKCk7CisJfSBmaW5hbGx5IHsKKwkJdW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKKwkJY29tcGlsYXRpb25Vbml0ID0gbnVsbDsgLy8gcmVzZXQgcGFyc2VyCisJfQorCXJldHVybiB1bml0OworfQorLyoqCisgKiBSZXR1cm5zIHRoaXMgcGFyc2VyJ3MgcHJvYmxlbSByZXBvcnRlciBpbml0aWFsaXplZCB3aXRoIGl0cyByZWZlcmVuY2UgY29udGV4dC4KKyAqIEFsc28gaXQgaXMgYXNzdW1lZCB0aGF0IGEgcHJvYmxlbSBpcyBnb2luZyB0byBiZSByZXBvcnRlZCwgc28gaW5pdGlhbGl6ZXMKKyAqIHRoZSBjb21waWxhdGlvbiByZXN1bHQncyBsaW5lIHBvc2l0aW9ucy4KKyAqLworcHVibGljIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIoKXsKKwlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCWNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zID0gc2Nhbm5lci5nZXRMaW5lRW5kcygpOworCX0KKwlwcm9ibGVtUmVwb3J0ZXIucmVmZXJlbmNlQ29udGV4dCA9IHJlZmVyZW5jZUNvbnRleHQ7CisJcmV0dXJuIHByb2JsZW1SZXBvcnRlcjsKK30KK3Byb3RlY3RlZCB2b2lkIHB1c2hJZGVudGlmaWVyKCkgeworCS8qcHVzaCB0aGUgY29uc3VtZVRva2VuIG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrLgorCUluY3JlYXNlIHRoZSB0b3RhbCBudW1iZXIgb2YgaWRlbnRpZmllciBpbiB0aGUgc3RhY2suCisJaWRlbnRpZmllclB0ciBwb2ludHMgb24gdGhlIG5leHQgdG9wICovCisKKwl0cnkgeworCQlpZGVudGlmaWVyU3RhY2tbKytpZGVudGlmaWVyUHRyXSA9IHNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKTsKKwkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl0gPSAKKwkJCSgoKGxvbmcpIHNjYW5uZXIuc3RhcnRQb3NpdGlvbikgPDwgMzIpICsgKHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMSk7IAorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvKi0tLXN0YWNrIHJlYWxsYW9jYXRpb24gKGlkZW50aWZpZXJQdHIgaXMgY29ycmVjdCktLS0qLworCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBpZGVudGlmaWVyU3RhY2subGVuZ3RoOworCQljaGFyW11bXSBvbGRTdGFjayA9IGlkZW50aWZpZXJTdGFjazsKKwkJaWRlbnRpZmllclN0YWNrID0gbmV3IGNoYXJbb2xkU3RhY2tMZW5ndGggKyAyMF1bXTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgaWRlbnRpZmllclN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCS8qaWRlbnRpZmllciBwb3NpdGlvbiBzdGFjayovCisJCWxvbmdbXSBvbGRQb3MgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFjazsKKwkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2sgPSBuZXcgbG9uZ1tvbGRTdGFja0xlbmd0aCArIDIwXTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRQb3MsIDAsIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdID0gCisJCQkoKChsb25nKSBzY2FubmVyLnN0YXJ0UG9zaXRpb24pIDw8IDMyKSArIChzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOyAKKwl9OworCisJdHJ5IHsKKwkJaWRlbnRpZmllckxlbmd0aFN0YWNrWysraWRlbnRpZmllckxlbmd0aFB0cl0gPSAxOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvKi0tLXN0YWNrIHJlYWxsb2NhdGlvbiAoaWRlbnRpZmllckxlbmd0aFB0ciBpcyBjb3JyZWN0KS0tLSovCisJCWludCBvbGRTdGFja0xlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFjay5sZW5ndGg7CisJCWludCBvbGRTdGFja1tdID0gaWRlbnRpZmllckxlbmd0aFN0YWNrOworCQlpZGVudGlmaWVyTGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgMTBdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBpZGVudGlmaWVyTGVuZ3RoU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdID0gMTsKKwl9OworCit9Citwcm90ZWN0ZWQgdm9pZCBwdXNoSWRlbnRpZmllcihpbnQgZmxhZykgeworCS8qcHVzaCBhIHNwZWNpYWwgZmxhZyBvbiB0aGUgc3RhY2sgOgorCS16ZXJvIHN0YW5kcyBmb3Igb3B0aW9uYWwgTmFtZQorCS1uZWdhdGl2ZSBudW1iZXIgZm9yIGRpcmVjdCByZWYgdG8gYmFzZSB0eXBlcy4KKwlpZGVudGlmaWVyTGVuZ3RoUHRyIHBvaW50cyBvbiB0aGUgdG9wICovCisKKwl0cnkgeworCQlpZGVudGlmaWVyTGVuZ3RoU3RhY2tbKytpZGVudGlmaWVyTGVuZ3RoUHRyXSA9IGZsYWc7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCS8qLS0tc3RhY2sgcmVhbGxhb2NhdGlvbiAoaWRlbnRpZmllckxlbmd0aFB0ciBpcyBjb3JyZWN0KS0tLSovCisJCWludCBvbGRTdGFja0xlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFjay5sZW5ndGg7CisJCWludCBvbGRTdGFja1tdID0gaWRlbnRpZmllckxlbmd0aFN0YWNrOworCQlpZGVudGlmaWVyTGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgMTBdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBpZGVudGlmaWVyTGVuZ3RoU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdID0gZmxhZzsKKwl9OworCit9Citwcm90ZWN0ZWQgdm9pZCBwdXNoT25Bc3RMZW5ndGhTdGFjayhpbnQgcG9zKSB7CisJdHJ5IHsKKwkJYXN0TGVuZ3RoU3RhY2tbKythc3RMZW5ndGhQdHJdID0gcG9zOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBhc3RMZW5ndGhTdGFjay5sZW5ndGg7CisJCWludFtdIG9sZFBvcyA9IGFzdExlbmd0aFN0YWNrOworCQlhc3RMZW5ndGhTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkUG9zLCAwLCBhc3RMZW5ndGhTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHJdID0gcG9zOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkFzdFN0YWNrKEFzdE5vZGUgbm9kZSkgeworCS8qYWRkIGEgbmV3IG9iaiBvbiB0b3Agb2YgdGhlIGFzdCBzdGFjaworCWFzdFB0ciBwb2ludHMgb24gdGhlIHRvcCovCisKKwl0cnkgeworCQlhc3RTdGFja1srK2FzdFB0cl0gPSBub2RlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBhc3RTdGFjay5sZW5ndGg7CisJCUFzdE5vZGVbXSBvbGRTdGFjayA9IGFzdFN0YWNrOworCQlhc3RTdGFjayA9IG5ldyBBc3ROb2RlW29sZFN0YWNrTGVuZ3RoICsgQXN0U3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBhc3RTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlhc3RQdHIgPSBvbGRTdGFja0xlbmd0aDsKKwkJYXN0U3RhY2tbYXN0UHRyXSA9IG5vZGU7CisJfQorCisJdHJ5IHsKKwkJYXN0TGVuZ3RoU3RhY2tbKythc3RMZW5ndGhQdHJdID0gMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gYXN0TGVuZ3RoU3RhY2subGVuZ3RoOworCQlpbnRbXSBvbGRQb3MgPSBhc3RMZW5ndGhTdGFjazsKKwkJYXN0TGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgQXN0U3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBvcywgMCwgYXN0TGVuZ3RoU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJYXN0TGVuZ3RoU3RhY2tbYXN0TGVuZ3RoUHRyXSA9IDE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgcHVzaE9uRXhwcmVzc2lvblN0YWNrKEV4cHJlc3Npb24gZXhwcikgeworCisJdHJ5IHsKKwkJZXhwcmVzc2lvblN0YWNrWysrZXhwcmVzc2lvblB0cl0gPSBleHByOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkvL2V4cHJlc3Npb25QdHIgaXMgY29ycmVjdCAKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gZXhwcmVzc2lvblN0YWNrLmxlbmd0aDsKKwkJRXhwcmVzc2lvbltdIG9sZFN0YWNrID0gZXhwcmVzc2lvblN0YWNrOworCQlleHByZXNzaW9uU3RhY2sgPSBuZXcgRXhwcmVzc2lvbltvbGRTdGFja0xlbmd0aCArIEV4cHJlc3Npb25TdGFja0luY3JlbWVudF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkU3RhY2ssIDAsIGV4cHJlc3Npb25TdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBleHByOworCX0KKworCXRyeSB7CisJCWV4cHJlc3Npb25MZW5ndGhTdGFja1srK2V4cHJlc3Npb25MZW5ndGhQdHJdID0gMTsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrLmxlbmd0aDsKKwkJaW50W10gb2xkUG9zID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrOworCQlleHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgRXhwcmVzc2lvblN0YWNrSW5jcmVtZW50XTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRQb3MsIDAsIGV4cHJlc3Npb25MZW5ndGhTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0cl0gPSAxOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkV4cHJlc3Npb25TdGFja0xlbmd0aFN0YWNrKGludCBwb3MpIHsKKwl0cnkgeworCQlleHByZXNzaW9uTGVuZ3RoU3RhY2tbKytleHByZXNzaW9uTGVuZ3RoUHRyXSA9IHBvczsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrLmxlbmd0aDsKKwkJaW50W10gb2xkUG9zID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrOworCQlleHByZXNzaW9uTGVuZ3RoU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFBvcywgMCwgZXhwcmVzc2lvbkxlbmd0aFN0YWNrLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCWV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyXSA9IHBvczsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBwdXNoT25JbnRTdGFjayhpbnQgcG9zKSB7CisKKwl0cnkgeworCQlpbnRTdGFja1srK2ludFB0cl0gPSBwb3M7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCS8vaW50UHRyIGlzIGNvcnJlY3QgCisJCWludCBvbGRTdGFja0xlbmd0aCA9IGludFN0YWNrLmxlbmd0aDsKKwkJaW50IG9sZFN0YWNrW10gPSBpbnRTdGFjazsKKwkJaW50U3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCBpbnRTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQlpbnRTdGFja1tpbnRQdHJdID0gcG9zOworCX0KK30KK3Byb3RlY3RlZCBzdGF0aWMgY2hhcltdIHJlYWRUYWJsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKworCS8vZmlsZXMgYXJlIGxvY2F0ZWQgYXQgUGFyc2VyLmNsYXNzIGRpcmVjdG9yeQorCisJSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oUGFyc2VyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUpKTsKKwlpZiAoc3RyZWFtID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJwYXJzZXIubWlzc2luZ0ZpbGUiLGZpbGVuYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKwl0cnkgeworCQlieXRlcyA9IFV0aWwuZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheShzdHJlYW0sIC0xKTsKKwl9IGZpbmFsbHkgeworCQl0cnkgeworCQkJc3RyZWFtLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKworCS8vbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2sgKGV2ZW4gc2l6ZSBleHBlY3RlZCkKKwlpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworCWlmIChsZW5ndGggJSAyICE9IDApCisJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKFV0aWwuYmluZCgicGFyc2VyLmNvcnJ1cHRlZEZpbGUiLGZpbGVuYW1lKSk7IC8vJE5PTi1OTFMtMSQKKworCS8vIGNvbnZlcnQgYnl0ZXMgaW50byBjaGFycworCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2xlbmd0aCAvIDJdOworCWludCBpID0gMDsKKwlpbnQgY2hhckluZGV4ID0gMDsKKworCXdoaWxlICh0cnVlKSB7CisJCWNoYXJzW2NoYXJJbmRleCsrXSA9IChjaGFyKSAoKChieXRlc1tpKytdICYgMHhGRikgPDwgOCkgKyAoYnl0ZXNbaSsrXSAmIDB4RkYpKTsKKwkJaWYgKGkgPT0gbGVuZ3RoKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjaGFyczsKK30KKy8qIFRva2VuIGNoZWNrIHBlcmZvcm1lZCBvbiBldmVyeSB0b2tlbiBzaGlmdCBvbmNlIGhhdmluZyBlbnRlcmVkCisgKiByZWNvdmVyeSBtb2RlLgorICovCitwdWJsaWMgdm9pZCByZWNvdmVyeVRva2VuQ2hlY2soKSB7CisJc3dpdGNoIChjdXJyZW50VG9rZW4pIHsKKwkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOiB7CisJCQlSZWNvdmVyZWRFbGVtZW50IG5ld0VsZW1lbnQgPSAKKwkJCQljdXJyZW50RWxlbWVudC51cGRhdGVPbk9wZW5pbmdCcmFjZShzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsJCQkJCisJCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKXsgLy8gbnVsbCBtZWFucyBub3RoaW5nIGhhcHBlbmVkCisJCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsgLy8gb3BlbmluZyBicmFjZSBkZXRlY3RlZAorCQkJCWN1cnJlbnRFbGVtZW50ID0gbmV3RWxlbWVudDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDogeworCQkJZW5kUG9zaXRpb24gPSB0aGlzLmZsdXNoQW5ub3RhdGlvbnNEZWZpbmVkUHJpb3JUbyhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJUmVjb3ZlcmVkRWxlbWVudCBuZXdFbGVtZW50ID0KKwkJCQljdXJyZW50RWxlbWVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShzY2FubmVyLnN0YXJ0UG9zaXRpb24sIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0xKTsKKwkJCQlsYXN0Q2hlY2tQb2ludCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCWlmIChuZXdFbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50KXsKKwkJCQljdXJyZW50RWxlbWVudCA9IG5ld0VsZW1lbnQ7CisJCQl9CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCByZXBvcnRTeW50YXhFcnJvcihpbnQgYWN0LCBpbnQgY3VycmVudEtpbmQsIGludCBzdGF0ZVN0YWNrVG9wKSB7CisKKwkvKiByZW1lbWJlciBjdXJyZW50IHNjYW5uZXIgcG9zaXRpb24gKi8KKwlpbnQgc3RhcnRQb3MgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJaW50IGN1cnJlbnRQb3MgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkKKwlTdHJpbmdbXSBleHBlY3RpbmdzOworCVN0cmluZyB0b2tlbk5hbWUgPSBuYW1lW3N5bWJvbF9pbmRleFtjdXJyZW50S2luZF1dOworCisJLy9mZXRjaCBhbGwgImFjY3VyYXRlIiBwb3NzaWJsZSB0ZXJtaW5hbHMgdGhhdCBjb3VsZCByZWNvdmVyIHRoZSBlcnJvcgorCWludCBzdGFydCwgZW5kID0gc3RhcnQgPSBhc2koc3RhY2tbc3RhdGVTdGFja1RvcF0pOworCXdoaWxlIChhc3JbZW5kXSAhPSAwKQorCQllbmQrKzsKKwlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CisJZXhwZWN0aW5ncyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwlpZiAobGVuZ3RoICE9IDApIHsKKwkJY2hhcltdIGluZGV4ZXMgPSBuZXcgY2hhcltsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KGFzciwgc3RhcnQsIGluZGV4ZXMsIDAsIGxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWV4cGVjdGluZ3NbaV0gPSBuYW1lW3N5bWJvbF9pbmRleFtpbmRleGVzW2ldXV07CisJCX0KKwl9CisKKwkvL2lmIHRoZSBwYiBpcyBhbiBFT0YsIHRyeSB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgdGhleSBhcmUgc29tZSAKKwlpZiAodG9rZW5OYW1lLmVxdWFscyhVTkVYUEVDVEVEX0VPRikpIHsKKwkJaWYgKCF0aGlzLmNoZWNrQW5kUmVwb3J0QnJhY2tldEFub21hbGllcyhwcm9ibGVtUmVwb3J0ZXIoKSkpIHsKKwkJCWNoYXJbXSB0b2tlblNvdXJjZTsKKwkJCXRyeSB7CisJCQkJdG9rZW5Tb3VyY2UgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXRva2VuU291cmNlID0gbmV3IGNoYXJbXSB7fTsKKwkJCX0KKwkJCXByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3IoCisJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIAorCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxLCAKKwkJCQl0b2tlblNvdXJjZSwgCisJCQkJdG9rZW5OYW1lLCAKKwkJCQlleHBlY3RpbmdzKTsgCisJCX0KKwl9IGVsc2UgeyAvL3RoZSBuZXh0IHRlc3QgaXMgSEVBVklMWSBncmFtbWFyIERFUEVOREVOVC4KKwkJaWYgKChsZW5ndGggPT0gMikKKwkJCSYmICh0b2tlbk5hbWUuZXF1YWxzKCI7IikpIC8vJE5PTi1OTFMtMSQKKwkJCSYmIChleHBlY3RpbmdzWzBdID09ICIrKyIpIC8vJE5PTi1OTFMtMSQKKwkJCSYmIChleHBlY3RpbmdzWzFdID09ICItLSIpIC8vJE5PTi1OTFMtMSQKKwkJCSYmIChleHByZXNzaW9uUHRyID4gLTEpKSB7CisJCQkvLyB0aGUgOyBpcyBub3QgdGhlIGV4cGVjdGVkIHRva2VuID09PiBpdCBlbmRzIGEgc3RhdGVtZW50IHdoZW4gYW4gZXhwcmVzc2lvbiBpcyBub3QgZW5kZWQKKwkJCXByb2JsZW1SZXBvcnRlcigpLmludmFsaWRFeHByZXNzaW9uQXNTdGF0ZW1lbnQoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXSB0b2tlblNvdXJjZTsKKwkJCXRyeSB7CisJCQkJdG9rZW5Tb3VyY2UgPSB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXRva2VuU291cmNlID0gbmV3IGNoYXJbXSB7fTsKKwkJCX0KKwkJCXByb2JsZW1SZXBvcnRlcigpLnBhcnNlRXJyb3IoCisJCQkJdGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24sIAorCQkJCXRoaXMuc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxLCAKKwkJCQl0b2tlblNvdXJjZSwgCisJCQkJdG9rZW5OYW1lLCAKKwkJCQlleHBlY3RpbmdzKTsgCisJCQl0aGlzLmNoZWNrQW5kUmVwb3J0QnJhY2tldEFub21hbGllcyhwcm9ibGVtUmVwb3J0ZXIoKSk7CisJCX0KKwl9CisJLyogcmVzZXQgc2Nhbm5lciB3aGVyZSBpdCB3YXMgKi8KKwlzY2FubmVyLnN0YXJ0UG9zaXRpb24gPSBzdGFydFBvczsKKwlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IGN1cnJlbnRQb3M7Cit9Citwcm90ZWN0ZWQgdm9pZCByZXNldE1vZGlmaWVycygpIHsKKwltb2RpZmllcnMgPSBBY2NEZWZhdWx0OworCW1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gLTE7IC8vIDwtLSBzZWUgY29tbWVudCBpbnRvIG1vZGlmaWVyc0ZsYWcoaW50KQorCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworfQorLyoKKyAqIFJlc2V0IGNvbnRleHQgc28gYXMgdG8gcmVzdW1lIHRvIHJlZ3VsYXIgcGFyc2UgbG9vcAorICovCitwcm90ZWN0ZWQgdm9pZCByZXNldFN0YWNrcygpIHsKKworCWFzdFB0ciA9IC0xOworCWFzdExlbmd0aFB0ciA9IC0xOworCWV4cHJlc3Npb25QdHIgPSAtMTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyID0gLTE7CisJaWRlbnRpZmllclB0ciA9IC0xOwkKKwlpZGVudGlmaWVyTGVuZ3RoUHRyCT0gLTE7CisJaW50UHRyID0gLTE7CisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGUgPSAwXSA9IDA7IC8vIG5lZWQgdG8gcmVzZXQgZm9yIGZ1cnRoZXIgcmV1c2UKKwl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdID0gMDsKKwlkaW1lbnNpb25zID0gMCA7CisJcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyID0gMF0gPSAwOworCXJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPSAwOworCWxpc3RMZW5ndGggPSAwOworfQorLyoKKyAqIFJlc2V0IGNvbnRleHQgc28gYXMgdG8gcmVzdW1lIHRvIHJlZ3VsYXIgcGFyc2UgbG9vcAorICogSWYgdW5hYmxlIHRvIHJlc2V0IGZvciByZXN1bWluZywgYW5zd2VycyBmYWxzZS4KKyAqCisgKiBNb3ZlIGNoZWNrcG9pbnQgbG9jYXRpb24sIHJlc2V0IGludGVybmFsIHN0YWNrcyBhbmQKKyAqIGRlY2lkZSB3aGljaCBncmFtbWFyIGdvYWwgaXMgYWN0aXZhdGVkLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVBZnRlclJlY292ZXJ5KCkgeworCisJLy8gcmVzZXQgaW50ZXJuYWwgc3RhY2tzIAorCXRoaXMucmVzZXRTdGFja3MoKTsKKwkKKwkvKiBhdHRlbXB0IHRvIG1vdmUgY2hlY2twb2ludCBsb2NhdGlvbiAqLworCWlmICghdGhpcy5tb3ZlUmVjb3ZlcnlDaGVja3BvaW50KCkpIHJldHVybiBmYWxzZTsKKworCS8vIG9ubHkgbG9vayBmb3IgaGVhZGVycworCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24peworCQlnb0ZvckhlYWRlcnMoKTsKKwkJZGlldCA9IHRydWU7IC8vIHBhc3NlZCB0aGlzIHBvaW50LCB3aWxsIG5vdCBjb25zaWRlciBtZXRob2QgYm9kaWVzCisJCXJldHVybiB0cnVlOworCX0KKwkvLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZXN0YXJ0CisJcmV0dXJuIGZhbHNlOworfQorLyoKKyAqIFN5bnRheCBlcnJvciB3YXMgZGV0ZWN0ZWQuIFdpbGwgYXR0ZW1wdCB0byBwZXJmb3JtIHNvbWUgcmVjb3ZlcnkgYWN0aW9uIGluIG9yZGVyCisgKiB0byByZXN1bWUgdG8gdGhlIHJlZ3VsYXIgcGFyc2UgbG9vcC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcmVzdW1lT25TeW50YXhFcnJvcigpIHsKKworCS8qIHJlcXVlc3QgcmVjb3ZlcnkgaW5pdGlhbGl6YXRpb24gKi8KKwlpZiAoY3VycmVudEVsZW1lbnQgPT0gbnVsbCl7CisJCWN1cnJlbnRFbGVtZW50ID0gCisJCQl0aGlzLmJ1aWxkSW5pdGlhbFJlY292ZXJ5U3RhdGUoKTsgLy8gYnVpbGQgc29tZSByZWNvdmVyZWQgZWxlbWVudHMKKwl9CisJLyogZG8gbm90IGludmVzdGlnYXRlIGRlZXBlciBpbiByZWNvdmVyeSB3aGVuIG5vIHJlY292ZXJlZCBlbGVtZW50ICovCisJaWYgKGN1cnJlbnRFbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkKKwkvKiBtYW51YWwgZm9yY2VkIHJlY292ZXJ5IHJlc3RhcnQgLSBhZnRlciBoZWFkZXJzICovCisJaWYgKHJlc3RhcnRSZWNvdmVyeSl7CisJCXJlc3RhcnRSZWNvdmVyeSA9IGZhbHNlOworCX0KKwkvKiB1cGRhdGUgcmVjb3Zlcnkgc3RhdGUgd2l0aCBjdXJyZW50IGVycm9yIHN0YXRlIG9mIHRoZSBwYXJzZXIgKi8KKwl0aGlzLnVwZGF0ZVJlY292ZXJ5U3RhdGUoKTsKKwkKKwkvKiBhdHRlbXB0IHRvIHJlc2V0IHN0YXRlIGluIG9yZGVyIHRvIHJlc3VtZSB0byBwYXJzZSBsb29wICovCisJcmV0dXJuIHRoaXMucmVzdW1lQWZ0ZXJSZWNvdmVyeSgpOworfQorcHJvdGVjdGVkIHN0YXRpYyBpbnQgdEFjdGlvbihpbnQgc3RhdGUsIGludCBzeW0pIHsKKwlyZXR1cm4gYWN0aW9uW2NoZWNrKHN0YXRlICsgc3ltKSA9PSBzeW0gPyBzdGF0ZSArIHN5bSA6IHN0YXRlXTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlTdHJpbmcgcyA9ICJpZGVudGlmaWVyU3RhY2sgOiBjaGFyW11bXSA9IHsiOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gaWRlbnRpZmllclB0cjsgaSsrKSB7CisJCXMgPSBzICsgIlwiIiArIFN0cmluZy52YWx1ZU9mKGlkZW50aWZpZXJTdGFja1tpXSkgKyAiXCIsIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfTsKKwlzID0gcyArICJ9XG4iOyAvLyROT04tTkxTLTEkCisKKwlzID0gcyArICJpZGVudGllckxlbmd0aFN0YWNrIDogaW50W10gPSB7IjsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDw9IGlkZW50aWZpZXJMZW5ndGhQdHI7IGkrKykgeworCQlzID0gcyArIGlkZW50aWZpZXJMZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJAorCX07CisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAorCisJcyA9IHMgKyAiYXN0TGVuZ3RoU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gYXN0TGVuZ3RoUHRyOyBpKyspIHsKKwkJcyA9IHMgKyBhc3RMZW5ndGhTdGFja1tpXSArICIsIjsgLy8kTk9OLU5MUy0xJAorCX07CisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAorCXMgPSBzICsgImFzdFB0ciA6IGludCA9ICIgKyBTdHJpbmcudmFsdWVPZihhc3RQdHIpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwlzID0gcyArICJpbnRTdGFjayA6IGludFtdID0geyI7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKGludCBpID0gMDsgaSA8PSBpbnRQdHI7IGkrKykgeworCQlzID0gcyArIGludFN0YWNrW2ldICsgIiwiOyAvLyROT04tTkxTLTEkCisJfTsKKwlzID0gcyArICJ9XG4iOyAvLyROT04tTkxTLTEkCisKKwlzID0gcyArICJleHByZXNzaW9uTGVuZ3RoU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gZXhwcmVzc2lvbkxlbmd0aFB0cjsgaSsrKSB7CisJCXMgPSBzICsgZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2ldICsgIiwiOyAvLyROT04tTkxTLTEkCisJfTsKKwlzID0gcyArICJ9XG4iOyAvLyROT04tTkxTLTEkCisKKwlzID0gcyArICJleHByZXNzaW9uUHRyIDogaW50ID0gIiArIFN0cmluZy52YWx1ZU9mKGV4cHJlc3Npb25QdHIpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwlzID0gcyArICJcblxuXG4tLS0tLS0tLS0tLS0tLS0tU2Nhbm5lci0tLS0tLS0tLS0tLS0tXG4iICsgc2Nhbm5lci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7CisKK30KKy8qCisgKiBVcGRhdGUgcmVjb3Zlcnkgc3RhdGUgYmFzZWQgb24gY3VycmVudCBwYXJzZXIvc2Nhbm5lciBzdGF0ZQorICovCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWNvdmVyeVN0YXRlKCkgeworCisJLyogZXhwb3NlIHBhcnNlciBzdGF0ZSB0byByZWNvdmVyeSBzdGF0ZSAqLworCWN1cnJlbnRFbGVtZW50LnVwZGF0ZUZyb21QYXJzZXJTdGF0ZSgpOworCisJLyogY2hlY2sgYW5kIHVwZGF0ZSByZWNvdmVyZWQgc3RhdGUgYmFzZWQgb24gY3VycmVudCB0b2tlbiwKKwkJdGhpcyBhY3Rpb24gaXMgYWxzbyBwZXJmb3JtZWQgd2hlbiBzaGlmdGluZyB0b2tlbiBhZnRlciByZWNvdmVyeQorCQlnb3QgYWN0aXZhdGVkIG9uY2UuIAorCSovCisJdGhpcy5yZWNvdmVyeVRva2VuQ2hlY2soKTsKK30KK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZVNvdXJjZURlY2xhcmF0aW9uUGFydHMoaW50IHZhcmlhYmxlRGVjbGFyYXRvcnNDb3VudGVyKSB7CisJLy9maWVsZHMgaXMgYSBkZWZpbml0aW9uIG9mIGZpZWxkcyB0aGF0IGFyZSBncm91cGVkIHRvZ2V0aGVyIGxpa2UgaW4KKwkvL3B1YmxpYyBpbnRbXSBhLCBiW10sIGMKKwkvL3doaWNoIHJlc3VsdHMgaW50byAzIGZpZWxkcy4KKworCUZpZWxkRGVjbGFyYXRpb24gZmllbGQ7CisJaW50IGVuZFR5cGVEZWNsYXJhdGlvblBvc2l0aW9uID0gCisJCS0xICsgYXN0U3RhY2tbYXN0UHRyIC0gdmFyaWFibGVEZWNsYXJhdG9yc0NvdW50ZXIgKyAxXS5zb3VyY2VTdGFydDsgCisJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZURlY2xhcmF0b3JzQ291bnRlciAtIDE7IGkrKykgeworCQkvL2xhc3Qgb25lIGlzIHNwZWNpYWwoc2VlIGJlbG93KQorCQlmaWVsZCA9IChGaWVsZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHIgLSBpIC0gMV07CisJCWZpZWxkLmVuZFBhcnQxUG9zaXRpb24gPSBlbmRUeXBlRGVjbGFyYXRpb25Qb3NpdGlvbjsKKwkJZmllbGQuZW5kUGFydDJQb3NpdGlvbiA9IC0xICsgYXN0U3RhY2tbYXN0UHRyIC0gaV0uc291cmNlU3RhcnQ7CisJfQorCS8vbGFzdCBvbmUKKwkoZmllbGQgPSAoRmllbGREZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXSkuZW5kUGFydDFQb3NpdGlvbiA9IAorCQllbmRUeXBlRGVjbGFyYXRpb25Qb3NpdGlvbjsgCisJZmllbGQuZW5kUGFydDJQb3NpdGlvbiA9IGZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kOworCit9Citwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTb3VyY2VQb3NpdGlvbihFeHByZXNzaW9uIGV4cCkgeworCS8vdXBkYXRlIHRoZSBzb3VyY2UgUG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24KKworCS8vaW50U3RhY2sgOiBpbnQgaW50CisJLy8tLT4KKwkvL2ludFN0YWNrIDogCisKKwlleHAuc291cmNlRW5kID0gaW50U3RhY2tbaW50UHRyLS1dOworCWV4cC5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXJCYXNpY0luZm9ybWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzNjc0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKKy8qQW4gaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgc3RhdGljIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBiYXNpYyBpbmZvcm1hdGlvbgorIGFib3V0IHRoZSBwYXJzZXIgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHJ1bGVzIGluIHRoZSBncmFtbWFyLCB0aGUgc3RhcnRpbmcgc3RhdGUsIGV0Yy4uLiovCisKK3B1YmxpYyBpbnRlcmZhY2UgUGFyc2VyQmFzaWNJbmZvcm1hdGlvbiB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludAorICAgICAgRVJST1JfU1lNQk9MICAgICAgPSAzMDcsCisgICAgICBNQVhfTkFNRV9MRU5HVEggICA9IDM2LAorICAgICAgTlVNX1NUQVRFUyAgICAgICAgPSA1OTEsCisgICAgICBOVF9PRkZTRVQgICAgICAgICA9IDMwOCwKKyAgICAgIFNDT1BFX1VCT1VORCAgICAgID0gLTEsCisgICAgICBTQ09QRV9TSVpFICAgICAgICA9IDAsCisgICAgICBMQV9TVEFURV9PRkZTRVQgICA9IDE2OTY2LAorICAgICAgTUFYX0xBICAgICAgICAgICAgPSAxLAorICAgICAgTlVNX1JVTEVTICAgICAgICAgPSA0MzYsCisgICAgICBOVU1fVEVSTUlOQUxTICAgICA9IDEwNSwKKyAgICAgIE5VTV9OT05fVEVSTUlOQUxTID0gMjAzLAorICAgICAgTlVNX1NZTUJPTFMgICAgICAgPSAzMDgsCisgICAgICBTVEFSVF9TVEFURSAgICAgICA9IDEyMjYwLAorICAgICAgRU9GVF9TWU1CT0wgICAgICAgPSAxNTgsCisgICAgICBFT0xUX1NZTUJPTCAgICAgICA9IDE1OCwKKyAgICAgIEFDQ0VQVF9BQ1RJT04gICAgID0gMTY5NjUsCisgICAgICBFUlJPUl9BQ1RJT04gICAgICA9IDE2OTY2OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTQ1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEJsb2NrLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKKy8qKgorICogSW50ZXJuYWwgYmxvY2sgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CYXNlVHlwZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkQmxvY2sgZXh0ZW5kcyBSZWNvdmVyZWRTdGF0ZW1lbnQgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycywgSVRlcm1pbmFsU3ltYm9scywgQmFzZVR5cGVzIHsKKworCXB1YmxpYyBCbG9jayBibG9ja0RlY2xhcmF0aW9uOworCisJcHVibGljIFJlY292ZXJlZFN0YXRlbWVudFtdIHN0YXRlbWVudHM7CisJcHVibGljIGludCBzdGF0ZW1lbnRDb3VudDsKKworCXB1YmxpYyBib29sZWFuIHByZXNlcnZlQ29udGVudCA9IGZhbHNlOworCXB1YmxpYyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlIHBlbmRpbmdBcmd1bWVudDsKK3B1YmxpYyBSZWNvdmVyZWRCbG9jayhCbG9jayBibG9jaywgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSl7CisJc3VwZXIoYmxvY2ssIHBhcmVudCwgYnJhY2tldEJhbGFuY2UpOworCXRoaXMuYmxvY2tEZWNsYXJhdGlvbiA9IGJsb2NrOworCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworfQorLyoKKyAqIFJlY29yZCBhIG5lc3RlZCBibG9jayBkZWNsYXJhdGlvbiAKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEJsb2NrIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZG8gbm90IGNvbnNpZGVyIGEgbmVzdGVkIGJsb2NrIHN0YXJ0aW5nIHBhc3NlZCB0aGUgYmxvY2sgZW5kIChpZiBzZXQpCisJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBibG9jayAqLworCWlmIChibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCAhPSAwIAorCQkmJiBuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ID4gYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQpeworCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsKKwl9CisJCQkKKwlSZWNvdmVyZWRCbG9jayBlbGVtZW50ID0gbmV3IFJlY292ZXJlZEJsb2NrKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlKTsKKworCS8vIGlmIHdlIGhhdmUgYSBwZW5kaW5nIEFyZ3VtZW50LCBwcm9tb3RlIGl0IGludG8gdGhlIG5ldyBibG9jaworCWlmIChwZW5kaW5nQXJndW1lbnQgIT0gbnVsbCl7CisJCWVsZW1lbnQuYXR0YWNoKHBlbmRpbmdBcmd1bWVudCk7CisJCXBlbmRpbmdBcmd1bWVudCA9IG51bGw7CisJfQorCXRoaXMuYXR0YWNoKGVsZW1lbnQpOworCWlmIChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSAwKSByZXR1cm4gZWxlbWVudDsKKwlyZXR1cm4gdGhpczsJCit9CisvKgorICogUmVjb3JkIGEgbG9jYWwgZGVjbGFyYXRpb24gCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCXJldHVybiB0aGlzLmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSwgZmFsc2UpOworfQorLyoKKyAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIAorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UsIGJvb2xlYW4gZGVsZWdhdGVkQnlQYXJlbnQpIHsKKworCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgbWV0aG9kIGNhbiBvbmx5IGJlIGZpbmFsIGFuZCBub24gdm9pZCAqLworLyoJCisJY2hhcltdW10gbG9jYWxUeXBlTmFtZTsgCisJaWYgKChsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgCisJCXx8IChsb2NhbERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkgLy8gaW5pdGlhbGl6ZXIKKwkJfHwgKChsb2NhbFR5cGVOYW1lID0gbG9jYWxEZWNsYXJhdGlvbi50eXBlLmdldFR5cGVOYW1lKCkpLmxlbmd0aCA9PSAxIC8vIG5vbiB2b2lkCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhsb2NhbFR5cGVOYW1lWzBdLCBWb2lkQmluZGluZy5zb3VyY2VOYW1lKCkpKSl7IAorCisJCWlmIChkZWxlZ2F0ZWRCeVBhcmVudCl7CisJCQlyZXR1cm4gdGhpczsgLy9pZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOworCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCX0KKwl9CisqLwkKKwkJLyogZG8gbm90IGNvbnNpZGVyIGEgbG9jYWwgdmFyaWFibGUgc3RhcnRpbmcgcGFzc2VkIHRoZSBibG9jayBlbmQgKGlmIHNldCkKKwkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIGJsb2NrICovCisJaWYgKGJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kICE9IDAgCisJCSYmIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGJsb2NrRGVjbGFyYXRpb24uc291cmNlRW5kKXsKKworCQlpZiAoZGVsZWdhdGVkQnlQYXJlbnQpeworCQkJcmV0dXJuIHRoaXM7IC8vaWdub3JlCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKGxvY2FsRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsKKwkJfQorCX0KKworCVJlY292ZXJlZExvY2FsVmFyaWFibGUgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKGxvY2FsRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlKTsKKworCWlmIChsb2NhbERlY2xhcmF0aW9uIGluc3RhbmNlb2YgQXJndW1lbnQpeworCQlwZW5kaW5nQXJndW1lbnQgPSBlbGVtZW50OworCQlyZXR1cm4gdGhpczsKKwl9CisJCisJdGhpcy5hdHRhY2goZWxlbWVudCk7CisJaWYgKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7CisJcmV0dXJuIHRoaXM7CQorfQorLyoKKyAqIFJlY29yZCBhIHN0YXRlbWVudCBkZWNsYXJhdGlvbiAKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBicmFja2V0QmFsYW5jZSkgeworCXJldHVybiB0aGlzLmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlLCBmYWxzZSk7Cit9CisKKy8qCisgKiBSZWNvcmQgYSBzdGF0ZW1lbnQgZGVjbGFyYXRpb24gCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RhdGVtZW50LCBpbnQgYnJhY2tldEJhbGFuY2UsIGJvb2xlYW4gZGVsZWdhdGVkQnlQYXJlbnQpIHsKKworCS8qIGRvIG5vdCBjb25zaWRlciBhIG5lc3RlZCBibG9jayBzdGFydGluZyBwYXNzZWQgdGhlIGJsb2NrIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgYmxvY2sgKi8KKwlpZiAoYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMCAKKwkJJiYgc3RhdGVtZW50LnNvdXJjZVN0YXJ0ID4gYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQpeworCQkJCisJCWlmIChkZWxlZ2F0ZWRCeVBhcmVudCl7CisJCQlyZXR1cm4gdGhpczsgLy9pZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoc3RhdGVtZW50LCBicmFja2V0QmFsYW5jZSk7CisJCX0JCQkKKwl9CisJCQkKKwlSZWNvdmVyZWRTdGF0ZW1lbnQgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRTdGF0ZW1lbnQoc3RhdGVtZW50LCB0aGlzLCBicmFja2V0QmFsYW5jZSk7CisJdGhpcy5hdHRhY2goZWxlbWVudCk7CisJaWYgKHN0YXRlbWVudC5zb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7CisJcmV0dXJuIHRoaXM7CQorfQorLyoKKyAqIEFkZGl0aW9uIG9mIGEgdHlwZSB0byBhbiBpbml0aWFsaXplciAoYWN0IGxpa2UgaW5zaWRlIG1ldGhvZCBib2R5KQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisJcmV0dXJuIHRoaXMuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UsIGZhbHNlKTsKK30KKy8qCisgKiBBZGRpdGlvbiBvZiBhIHR5cGUgdG8gYW4gaW5pdGlhbGl6ZXIgKGFjdCBsaWtlIGluc2lkZSBtZXRob2QgYm9keSkKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSwgYm9vbGVhbiBkZWxlZ2F0ZWRCeVBhcmVudCkgeworCisJLyogZG8gbm90IGNvbnNpZGVyIGEgdHlwZSBzdGFydGluZyBwYXNzZWQgdGhlIGJsb2NrIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgYmxvY2sgKi8KKwlpZiAoYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMCAKKwkJJiYgdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiBibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCl7CisJCWlmIChkZWxlZ2F0ZWRCeVBhcmVudCl7CisJCQlyZXR1cm4gdGhpczsgLy9pZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCX0KKwl9CisJCQkKKwlSZWNvdmVyZWRTdGF0ZW1lbnQgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRUeXBlKHR5cGVEZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2UpOworCXRoaXMuYXR0YWNoKGVsZW1lbnQpOworCWlmICh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGVsZW1lbnQ7CisJcmV0dXJuIHRoaXM7Cit9CisvKgorICogQXR0YWNoIGEgcmVjb3ZlcmVkIHN0YXRlbWVudAorICovCit2b2lkIGF0dGFjaChSZWNvdmVyZWRTdGF0ZW1lbnQgcmVjb3ZlcmVkU3RhdGVtZW50KSB7CisKKwlpZiAoc3RhdGVtZW50cyA9PSBudWxsKSB7CisJCXN0YXRlbWVudHMgPSBuZXcgUmVjb3ZlcmVkU3RhdGVtZW50WzVdOworCQlzdGF0ZW1lbnRDb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXRlbWVudENvdW50ID09IHN0YXRlbWVudHMubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXN0YXRlbWVudHMsIAorCQkJCTAsIAorCQkJCShzdGF0ZW1lbnRzID0gbmV3IFJlY292ZXJlZFN0YXRlbWVudFsyICogc3RhdGVtZW50Q291bnRdKSwgCisJCQkJMCwgCisJCQkJc3RhdGVtZW50Q291bnQpOyAKKwkJfQorCX0KKwlzdGF0ZW1lbnRzW3N0YXRlbWVudENvdW50KytdID0gcmVjb3ZlcmVkU3RhdGVtZW50OworfQorLyogCisgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQorICovCitwdWJsaWMgQXN0Tm9kZSBwYXJzZVRyZWUoKXsKKwlyZXR1cm4gYmxvY2tEZWNsYXJhdGlvbjsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgeworCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlN0cmluZyh0YWIpKTsKKwlyZXN1bHQuYXBwZW5kKCJSZWNvdmVyZWQgYmxvY2s6XG4iKTsgLy8kTk9OLU5MUy0xJAorCXJlc3VsdC5hcHBlbmQoYmxvY2tEZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7CisJaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZW1lbnRDb3VudDsgaSsrKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXN1bHQuYXBwZW5kKHRoaXMuc3RhdGVtZW50c1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworfQorLyoKKyAqIFJlYnVpbGQgYSBibG9jayBmcm9tIHRoZSBuZXN0ZWQgc3RydWN0dXJlIHdoaWNoIGlzIGluIHNjb3BlCisgKi8KK3B1YmxpYyBCbG9jayB1cGRhdGVkQmxvY2soKXsKKworCS8vIGlmIGJsb2NrIHdhcyBub3QgbWFya2VkIHRvIGJlIHByZXNlcnZlZCBvciBlbXB0eSwgdGhlbiBpZ25vcmUgaXQKKwlpZiAoIXByZXNlcnZlQ29udGVudCB8fCBzdGF0ZW1lbnRDb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKKworCVN0YXRlbWVudFtdIHVwZGF0ZWRTdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtzdGF0ZW1lbnRDb3VudF07CisJaW50IHVwZGF0ZWRDb3VudCA9IDA7CisJCisJLy8gb25seSBjb2xsZWN0IHRoZSBub24tbnVsbCB1cGRhdGVkIHN0YXRlbWVudHMKKwlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudENvdW50OyBpKyspeworCQlTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV0udXBkYXRlZFN0YXRlbWVudCgpOworCQlpZiAodXBkYXRlZFN0YXRlbWVudCAhPSBudWxsKXsKKwkJCXVwZGF0ZWRTdGF0ZW1lbnRzW3VwZGF0ZWRDb3VudCsrXSA9IHVwZGF0ZWRTdGF0ZW1lbnQ7CisJCX0KKwl9CisJaWYgKHVwZGF0ZWRDb3VudCA9PSAwKSByZXR1cm4gbnVsbDsgLy8gbm90IGludGVyZXN0aW5nIGJsb2NrCisKKwkvLyByZXNpemUgc3RhdGVtZW50IGNvbGxlY3Rpb24gaWYgbmVjZXNzYXJ5CisJaWYgKHVwZGF0ZWRDb3VudCAhPSBzdGF0ZW1lbnRDb3VudCl7CisJCWJsb2NrRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbdXBkYXRlZENvdW50XTsKKwkJU3lzdGVtLmFycmF5Y29weSh1cGRhdGVkU3RhdGVtZW50cywgMCwgYmxvY2tEZWNsYXJhdGlvbi5zdGF0ZW1lbnRzLCAwLCB1cGRhdGVkQ291bnQpOworCX0gZWxzZSB7CisJCWJsb2NrRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IHVwZGF0ZWRTdGF0ZW1lbnRzOworCX0KKworCXJldHVybiBibG9ja0RlY2xhcmF0aW9uOworfQorLyoKKyAqIFJlYnVpbGQgYSBzdGF0ZW1lbnQgZnJvbSB0aGUgbmVzdGVkIHN0cnVjdHVyZSB3aGljaCBpcyBpbiBzY29wZQorICovCitwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoKXsKKworCXJldHVybiB0aGlzLnVwZGF0ZWRCbG9jaygpOworfQorLyoKKyAqIEEgY2xvc2luZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGhhdmUgY2xvc2VkIHRoZSBjdXJyZW50IGVsZW1lbnQsCisgKiBpbiB3aGljaCBjYXNlIGJvdGggdGhlIGN1cnJlbnRFbGVtZW50IGlzIGV4aXRlZAorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbkNsb3NpbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKKwlpZiAoKC0tYnJhY2tldEJhbGFuY2UgPD0gMCkgJiYgKHBhcmVudCAhPSBudWxsKSl7CisJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoYnJhY2VFbmQpOworCisJCS8qIGlmIHRoZSBibG9jayBpcyB0aGUgbWV0aG9kIGJvZHksIHRoZW4gaXQgY2xvc2VzIHRoZSBtZXRob2QgdG9vICovCisJCVJlY292ZXJlZE1ldGhvZCBtZXRob2QgPSBlbmNsb3NpbmdNZXRob2QoKTsKKwkJaWYgKG1ldGhvZCAhPSBudWxsICYmIG1ldGhvZC5tZXRob2RCb2R5ID09IHRoaXMpeworCQkJcmV0dXJuIHBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJCX0KKwkJUmVjb3ZlcmVkSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBlbmNsb3NpbmdJbml0aWFsaXplcigpOworCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCAmJiBpbml0aWFsaXplci5pbml0aWFsaXplckJvZHkgPT0gdGhpcyl7CisJCQlyZXR1cm4gcGFyZW50LnVwZGF0ZU9uQ2xvc2luZ0JyYWNlKGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsKKwkJfQorCQlyZXR1cm4gcGFyZW50OworCX0KKwlyZXR1cm4gdGhpczsKK30KKy8qCisgKiBBbiBvcGVuaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgYmUgdGhlIGV4cGVjdGVkIG9wZW5pbmcgb25lIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBib2R5U3RhcnQgaXMgdXBkYXRlZC4KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25PcGVuaW5nQnJhY2UoaW50IGN1cnJlbnRQb3NpdGlvbil7CisKKwkvLyBjcmVhdGUgYSBuZXN0ZWQgYmxvY2sKKwlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKKwlibG9jay5zb3VyY2VTdGFydCA9IHBhcnNlcigpLnNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwlyZXR1cm4gdGhpcy5hZGQoYmxvY2ssIDEpOworfQorLyoKKyAqIEZpbmFsIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZVBhcnNlVHJlZSgpeworCisJdGhpcy51cGRhdGVkQmxvY2soKTsKK30KKy8qCisgKiBSZWJ1aWxkIGEgZmxhdHRlbmVkIGJsb2NrIGZyb20gdGhlIG5lc3RlZCBzdHJ1Y3R1cmUgd2hpY2ggaXMgaW4gc2NvcGUKKyAqLworcHVibGljIFN0YXRlbWVudCB1cGRhdGVTdGF0ZW1lbnQoKXsKKworCS8vIGlmIGJsb2NrIHdhcyBjbG9zZWQgb3IgZW1wdHksIHRoZW4gaWdub3JlIGl0CisJaWYgKHRoaXMuYmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgIT0gMCB8fCBzdGF0ZW1lbnRDb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKKworCVN0YXRlbWVudFtdIHVwZGF0ZWRTdGF0ZW1lbnRzID0gbmV3IFN0YXRlbWVudFtzdGF0ZW1lbnRDb3VudF07CisJaW50IHVwZGF0ZWRDb3VudCA9IDA7CisJCisJLy8gb25seSBjb2xsZWN0IHRoZSBub24tbnVsbCB1cGRhdGVkIHN0YXRlbWVudHMKKwlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudENvdW50OyBpKyspeworCQlTdGF0ZW1lbnQgdXBkYXRlZFN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV0udXBkYXRlZFN0YXRlbWVudCgpOworCQlpZiAodXBkYXRlZFN0YXRlbWVudCAhPSBudWxsKXsKKwkJCXVwZGF0ZWRTdGF0ZW1lbnRzW3VwZGF0ZWRDb3VudCsrXSA9IHVwZGF0ZWRTdGF0ZW1lbnQ7CisJCX0KKwl9CisJaWYgKHVwZGF0ZWRDb3VudCA9PSAwKSByZXR1cm4gbnVsbDsgLy8gbm90IGludGVyZXN0aW5nIGJsb2NrCisKKwkvLyByZXNpemUgc3RhdGVtZW50IGNvbGxlY3Rpb24gaWYgbmVjZXNzYXJ5CisJaWYgKHVwZGF0ZWRDb3VudCAhPSBzdGF0ZW1lbnRDb3VudCl7CisJCWJsb2NrRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbdXBkYXRlZENvdW50XTsKKwkJU3lzdGVtLmFycmF5Y29weSh1cGRhdGVkU3RhdGVtZW50cywgMCwgYmxvY2tEZWNsYXJhdGlvbi5zdGF0ZW1lbnRzLCAwLCB1cGRhdGVkQ291bnQpOworCX0gZWxzZSB7CisJCWJsb2NrRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IHVwZGF0ZWRTdGF0ZW1lbnRzOworCX0KKworCXJldHVybiBibG9ja0RlY2xhcmF0aW9uOworfQorCisvKgorICogUmVjb3JkIGEgZmllbGQgZGVjbGFyYXRpb24gCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogbG9jYWwgdmFyaWFibGVzIGluc2lkZSBtZXRob2QgY2FuIG9ubHkgYmUgZmluYWwgYW5kIG5vbiB2b2lkICovCisJY2hhcltdW10gZmllbGRUeXBlTmFtZTsgCisJaWYgKChmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgCisJCXx8IChmaWVsZERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkgLy8gaW5pdGlhbGl6ZXIKKwkJfHwgKChmaWVsZFR5cGVOYW1lID0gZmllbGREZWNsYXJhdGlvbi50eXBlLmdldFR5cGVOYW1lKCkpLmxlbmd0aCA9PSAxIC8vIG5vbiB2b2lkCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhmaWVsZFR5cGVOYW1lWzBdLCBWb2lkQmluZGluZy5zb3VyY2VOYW1lKCkpKSl7IAorCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKKwkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChmaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorCQorCS8qIGRvIG5vdCBjb25zaWRlciBhIGxvY2FsIHZhcmlhYmxlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgYmxvY2sgZW5kIChpZiBzZXQpCisJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBibG9jayAqLworCWlmIChibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCAhPSAwIAorCQkmJiBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiBibG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCl7CisJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KKworCS8vIGlnbm9yZSB0aGUgYWRkZWQgZmllbGQsIHNpbmNlIGluZGljYXRlcyBhIGxvY2FsIHZhcmlhYmxlIGJlaGluZCByZWNvdmVyeSBwb2ludAorCS8vIHdoaWNoIHRodXMgZ290IHBhcnNlZCBhcyBhIGZpZWxkIHJlZmVyZW5jZS4gVGhpcyBjYW4gaGFwcGVuIGlmIHJlc3RhcnRpbmcgYWZ0ZXIKKwkvLyBoYXZpbmcgcmVkdWNlZCBhbiBhc3Npc3ROb2RlIHRvIGdldCB0aGUgZm9sbG93aW5nIGNvbnRleHQgKHNlZSAxR0VLN1NHKQorCXJldHVybiB0aGlzOwkKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhOTQzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOworCisvKioKKyAqIEludGVybmFsIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworCitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkRWxlbWVudCB7CisKKwlwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQ7CisJcHVibGljIGludCBicmFja2V0QmFsYW5jZTsKKwlwdWJsaWMgYm9vbGVhbiBmb3VuZE9wZW5pbmdCcmFjZTsKKwlwcm90ZWN0ZWQgUGFyc2VyIHJlY292ZXJpbmdQYXJzZXI7CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudChSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKKwl0aGlzKHBhcmVudCwgYnJhY2tldEJhbGFuY2UsIG51bGwpOworfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQoUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQsIGludCBicmFja2V0QmFsYW5jZSwgUGFyc2VyIHBhcnNlcil7CisJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJdGhpcy5icmFja2V0QmFsYW5jZSA9IGJyYWNrZXRCYWxhbmNlOworCXRoaXMucmVjb3ZlcmluZ1BhcnNlciA9IHBhcnNlcjsKK30KKy8qCisgKglSZWNvcmQgYSBtZXRob2QgZGVjbGFyYXRpb24KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJfSBlbHNlIHsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwkKKwkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChtZXRob2REZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KK30KKy8qCisgKiBSZWNvcmQgYSBuZXN0ZWQgYmxvY2sgZGVjbGFyYXRpb24KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEJsb2NrIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJfSBlbHNlIHsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0IC0gMSkpOwkKKwkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorfQorLyoKKyAqIFJlY29yZCBhIGZpZWxkIGRlY2xhcmF0aW9uCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJfSBlbHNlIHsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgLSAxKSk7CQorCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKGZpZWxkRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsKKwl9Cit9CisvKgorICoJUmVjb3JkIGFuIGltcG9ydCByZWZlcmVuY2UKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIGludCBicmFja2V0QmFsYW5jZSl7CisKKwkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55ICovCisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwl9IGVsc2UgeworCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOwkKKwkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChpbXBvcnRSZWZlcmVuY2UsIGJyYWNrZXRCYWxhbmNlKTsKKwl9Cit9CisvKgorICogUmVjb3JkIGEgbG9jYWwgZGVjbGFyYXRpb24KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55ICovCisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwl9IGVsc2UgeworCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsJCisJCXJldHVybiB0aGlzLnBhcmVudC5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KK30KKy8qCisgKiBSZWNvcmQgYSBzdGF0ZW1lbnQKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJfSBlbHNlIHsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZChzdGF0ZW1lbnQuc291cmNlU3RhcnQgLSAxKSk7CQorCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2UpOworCX0KK30KKy8qCisgKglSZWNvcmQgYSB0eXBlIGRlY2xhcmF0aW9uCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSAqLworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJfSBlbHNlIHsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeSh0aGlzLnByZXZpb3VzQXZhaWxhYmxlTGluZUVuZCh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsJCisJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorfQorLyoKKyAqIEFuc3dlciB0aGUgZGVwdGggb2YgdGhpcyBlbGVtZW50LCBjb25zaWRlcmluZyB0aGUgcGFyZW50IGxpbmsuCisgKi8KK3B1YmxpYyBpbnQgZGVwdGgoKXsKKwlpbnQgZGVwdGggPSAwOworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpICE9IG51bGwpIGRlcHRoKys7CisJcmV0dXJuIGRlcHRoOworfQorLyoKKyAqIEFuc3dlciB0aGUgZW5jbG9zaW5nIG1ldGhvZCBub2RlLCBvciBudWxsIGlmIG5vbmUKKyAqLworcHVibGljIFJlY292ZXJlZEluaXRpYWxpemVyIGVuY2xvc2luZ0luaXRpYWxpemVyKCl7CisJUmVjb3ZlcmVkRWxlbWVudCBjdXJyZW50ID0gdGhpczsKKwl3aGlsZSAoY3VycmVudCAhPSBudWxsKXsKKwkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcil7CisJCQlyZXR1cm4gKFJlY292ZXJlZEluaXRpYWxpemVyKSBjdXJyZW50OworCQl9CisJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKgorICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgbWV0aG9kIG5vZGUsIG9yIG51bGwgaWYgbm9uZQorICovCitwdWJsaWMgUmVjb3ZlcmVkTWV0aG9kIGVuY2xvc2luZ01ldGhvZCgpeworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCl7CisJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKXsKKwkJCXJldHVybiAoUmVjb3ZlcmVkTWV0aG9kKSBjdXJyZW50OworCQl9CisJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKgorICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgdHlwZSBub2RlLCBvciBudWxsIGlmIG5vbmUKKyAqLworcHVibGljIFJlY292ZXJlZFR5cGUgZW5jbG9zaW5nVHlwZSgpeworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCl7CisJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CisJCQlyZXR1cm4gKFJlY292ZXJlZFR5cGUpIGN1cnJlbnQ7CisJCX0KKwkJY3VycmVudCA9IGN1cnJlbnQucGFyZW50OworCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIGNsb3Nlc3Qgc3BlY2lmaWVkIHBhcnNlcgorICovCitwdWJsaWMgUGFyc2VyIHBhcnNlcigpeworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCl7CisJCWlmIChjdXJyZW50LnJlY292ZXJpbmdQYXJzZXIgIT0gbnVsbCl7CisJCQlyZXR1cm4gY3VycmVudC5yZWNvdmVyaW5nUGFyc2VyOworCQl9CisJCWN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKiAKKyAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBwYXJzZWQgc3RydWN0dXJlCisgKi8KK3B1YmxpYyBBc3ROb2RlIHBhcnNlVHJlZSgpeworCXJldHVybiBudWxsOworfQorLyoKKyAqIEl0ZXJhdGUgdGhlIGVuY2xvc2luZyBibG9ja3MgYW5kIHRhZyB0aGVtIHNvIGFzIHRvIHByZXNlcnZlIHRoZWlyIGNvbnRlbnQKKyAqLworcHVibGljIHZvaWQgcHJlc2VydmVFbmNsb3NpbmdCbG9ja3MoKXsKKwlSZWNvdmVyZWRFbGVtZW50IGN1cnJlbnQgPSB0aGlzOworCXdoaWxlIChjdXJyZW50ICE9IG51bGwpeworCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEJsb2NrKXsKKwkJCSgoUmVjb3ZlcmVkQmxvY2spY3VycmVudCkucHJlc2VydmVDb250ZW50ID0gdHJ1ZTsKKwkJfQorCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpeyAvLyBmb3IgYW5vbnltb3VzIHR5cGVzCisJCQkoKFJlY292ZXJlZFR5cGUpY3VycmVudCkucHJlc2VydmVDb250ZW50ID0gdHJ1ZTsKKwkJfQorCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJfQorfQorLyoKKyAqIEFuc3dlciB0aGUgcG9zaXRpb24gb2YgdGhlIHByZXZpb3VzIGxpbmUgZW5kIGlmCisgKiB0aGVyZSBpcyBub3RoaW5nIGJ1dCBzcGFjZXMgaW4gYmV0d2VlbiBpdCBhbmQgdGhlCisgKiBsaW5lIGVuZC4gVXNlZCB0byB0cmltIHNwYWNlcyBvbiB1bmNsb3NlZCBlbGVtZW50cy4KKyAqLworcHVibGljIGludCBwcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQoaW50IHBvc2l0aW9uKXsKKworCVBhcnNlciBwYXJzZXIgPSB0aGlzLnBhcnNlcigpOworCWlmIChwYXJzZXIgPT0gbnVsbCkgcmV0dXJuIHBvc2l0aW9uOworCQorCVNjYW5uZXIgc2Nhbm5lciA9IHBhcnNlci5zY2FubmVyOworCWlmIChzY2FubmVyLmxpbmVFbmRzID09IG51bGwpIHJldHVybiBwb3NpdGlvbjsKKwkKKwlpbnQgaW5kZXggPSBzY2FubmVyLmdldExpbmVOdW1iZXIocG9zaXRpb24pOworCWlmIChpbmRleCA8IDIpIHJldHVybiBwb3NpdGlvbjsKKwlpbnQgcHJldmlvdXNMaW5lRW5kID0gc2Nhbm5lci5saW5lRW5kc1tpbmRleC0yXTsKKworCWNoYXJbXSBzb3VyY2UgPSBzY2FubmVyLnNvdXJjZTsKKwlmb3IgKGludCBpID0gcHJldmlvdXNMaW5lRW5kKzE7IGkgPCBwb3NpdGlvbjsgaSsrKXsKKwkJaWYgKCEoc291cmNlW2ldID09ICcgJyB8fCBzb3VyY2VbaV0gPT0gJ1x0JykpIHJldHVybiBwb3NpdGlvbjsKKwl9CisJcmV0dXJuIHByZXZpb3VzTGluZUVuZDsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIHZlcnkgc291cmNlIGVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyBpbnQgc291cmNlRW5kKCl7CisJcmV0dXJuIDA7Cit9Citwcm90ZWN0ZWQgU3RyaW5nIHRhYlN0cmluZyhpbnQgdGFiKSB7CisJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlmb3IgKGludCBpID0gdGFiOyBpID4gMDsgaS0tKSB7CisJCXJlc3VsdC5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworfQorLyoKKyAqIEFuc3dlciB0aGUgdG9wIG5vZGUKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdG9wRWxlbWVudCgpeworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJd2hpbGUgKGN1cnJlbnQucGFyZW50ICE9IG51bGwpeworCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJfQorCXJldHVybiBjdXJyZW50OworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gdG9TdHJpbmcoMCk7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIGVuY2xvc2luZyB0eXBlIG5vZGUsIG9yIG51bGwgaWYgbm9uZQorICovCitwdWJsaWMgUmVjb3ZlcmVkVHlwZSB0eXBlKCl7CisJUmVjb3ZlcmVkRWxlbWVudCBjdXJyZW50ID0gdGhpczsKKwl3aGlsZSAoY3VycmVudCAhPSBudWxsKXsKKwkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKKwkJCXJldHVybiAoUmVjb3ZlcmVkVHlwZSkgY3VycmVudDsKKwkJfQorCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJfQorCXJldHVybiBudWxsOworfQorLyoKKyAqIFVwZGF0ZSB0aGUgYm9keVN0YXJ0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlQm9keVN0YXJ0KGludCBib2R5U3RhcnQpeworCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwkKK30KKy8qCisgKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZSBmcm9tIHBhcnNlciBzdGF0ZSB3aGljaAorICogaXMgYWJvdXQgdG8gZGlzYXBwZWFyIGJlY2F1c2Ugb2YgcmVzdGFydGluZyByZWNvdmVyeQorICovCitwdWJsaWMgdm9pZCB1cGRhdGVGcm9tUGFyc2VyU3RhdGUoKXsKK30KKy8qCisgKiBBIGNsb3NpbmcgYnJhY2UgZ290IGNvbnN1bWVkLCBtaWdodCBoYXZlIGNsb3NlZCB0aGUgY3VycmVudCBlbGVtZW50LAorICogaW4gd2hpY2ggY2FzZSBib3RoIHRoZSBjdXJyZW50RWxlbWVudCBpcyBleGl0ZWQKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7CisJaWYgKCgtLWJyYWNrZXRCYWxhbmNlIDw9IDApICYmIChwYXJlbnQgIT0gbnVsbCkpeworCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGJyYWNlRW5kKTsKKwkJcmV0dXJuIHBhcmVudDsKKwl9CisJcmV0dXJuIHRoaXM7Cit9CisvKgorICogQW4gb3BlbmluZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGJlIHRoZSBleHBlY3RlZCBvcGVuaW5nIG9uZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LAorICogaW4gd2hpY2ggY2FzZSB0aGUgYm9keVN0YXJ0IGlzIHVwZGF0ZWQuCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uT3BlbmluZ0JyYWNlKGludCBicmFjZUVuZCl7CisKKwlpZiAoYnJhY2tldEJhbGFuY2UrKyA9PSAwKXsKKwkJdGhpcy51cGRhdGVCb2R5U3RhcnQoYnJhY2VFbmQgKyAxKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXJldHVybiBudWxsOyAvLyBubyB1cGRhdGUgaXMgbmVjZXNzYXJ5Cit9CisvKgorICogRmluYWwgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7Cit9CisvKgorICogVXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGludCBzb3VyY2VFbmQpeworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTM4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEZpZWxkLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKKy8qKgorICogSW50ZXJuYWwgZmllbGQgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKKworcHVibGljIGNsYXNzIFJlY292ZXJlZEZpZWxkIGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCB7CisKKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uOworCWJvb2xlYW4gYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb247CisJCisJcHVibGljIFJlY292ZXJlZFR5cGVbXSBhbm9ueW1vdXNUeXBlczsKKwlwdWJsaWMgaW50IGFub255bW91c1R5cGVDb3VudDsKK3B1YmxpYyBSZWNvdmVyZWRGaWVsZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFJlY292ZXJlZEVsZW1lbnQgcGFyZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpeworCXRoaXMoZmllbGREZWNsYXJhdGlvbiwgcGFyZW50LCBicmFja2V0QmFsYW5jZSwgbnVsbCk7Cit9CitwdWJsaWMgUmVjb3ZlcmVkRmllbGQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlLCBQYXJzZXIgcGFyc2VyKXsKKwlzdXBlcihwYXJlbnQsIGJyYWNrZXRCYWxhbmNlLCBwYXJzZXIpOworCXRoaXMuZmllbGREZWNsYXJhdGlvbiA9IGZpZWxkRGVjbGFyYXRpb247CisJdGhpcy5hbHJlYWR5Q29tcGxldGVkRmllbGRJbml0aWFsaXphdGlvbiA9IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbDsKK30KKy8qCisgKiBSZWNvcmQgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaWYgZmllbGQgaXMgZXhwZWN0aW5nIGFuIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24sCisgKiB1c2VkIGZvciBjb21wbGV0aW9uIGluc2lkZSBmaWVsZCBpbml0aWFsaXplcnMuCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChTdGF0ZW1lbnQgc3RhdGVtZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCWlmICh0aGlzLmFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uIHx8ICEoc3RhdGVtZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbikpIHsKKwkJcmV0dXJuIHN1cGVyLmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlKTsKKwl9IGVsc2UgeworCQl0aGlzLmFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uID0gdHJ1ZTsKKwkJdGhpcy5maWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID0gKEV4cHJlc3Npb24pc3RhdGVtZW50OworCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzdGF0ZW1lbnQuc291cmNlRW5kOworCQl0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25FbmQgPSBzdGF0ZW1lbnQuc291cmNlRW5kOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CisvKgorICogUmVjb3JkIGEgdHlwZSBkZWNsYXJhdGlvbiBpZiB0aGlzIGZpZWxkIGlzIGV4cGVjdGluZyBhbiBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uIAorICogYW5kIHRoZSB0eXBlIGlzIGFuIGFub255bW91cyB0eXBlLgorICogVXNlZCBmb3IgY29tcGxldGlvbiBpbnNpZGUgZmllbGQgaW5pdGlhbGl6ZXJzLgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwlpZiAodGhpcy5hbHJlYWR5Q29tcGxldGVkRmllbGRJbml0aWFsaXphdGlvbiAKKwkJCXx8ICEodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pCisJCQl8fCAodGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgJiYgdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ID4gdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSkgeworCQlyZXR1cm4gc3VwZXIuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0gZWxzZSB7IAorCQkvLyBQcmVwYXJlIGFub255bW91cyB0eXBlIGxpc3QKKwkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZXMgPT0gbnVsbCkgeworCQkJdGhpcy5hbm9ueW1vdXNUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzVdOworCQkJdGhpcy5hbm9ueW1vdXNUeXBlQ291bnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZUNvdW50ID09IHRoaXMuYW5vbnltb3VzVHlwZXMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJdGhpcy5hbm9ueW1vdXNUeXBlcywgCisJCQkJCTAsIAorCQkJCQkodGhpcy5hbm9ueW1vdXNUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiB0aGlzLmFub255bW91c1R5cGVDb3VudF0pLCAKKwkJCQkJMCwgCisJCQkJCXRoaXMuYW5vbnltb3VzVHlwZUNvdW50KTsgCisJCQl9CisJCX0KKwkJLy8gU3RvcmUgdHlwZSBkZWNsYXJhdGlvbiBhcyBhbiBhbm9ueW1vdXMgdHlwZQorCQlSZWNvdmVyZWRUeXBlIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkVHlwZSh0eXBlRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlKTsKKwkJdGhpcy5hbm9ueW1vdXNUeXBlc1t0aGlzLmFub255bW91c1R5cGVDb3VudCsrXSA9IGVsZW1lbnQ7CisJCXJldHVybiBlbGVtZW50OworCX0KK30KKy8qIAorICogQW5zd2VyIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBzdHJ1Y3R1cmUKKyAqLworcHVibGljIEFzdE5vZGUgcGFyc2VUcmVlKCl7CisJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247Cit9CisvKgorICogQW5zd2VyIHRoZSB2ZXJ5IHNvdXJjZSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgaW50IHNvdXJjZUVuZCgpeworCXJldHVybiB0aGlzLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKCJSZWNvdmVyZWQgZmllbGQ6XG4iKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoZmllbGREZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7CisJaWYgKHRoaXMuYW5vbnltb3VzVHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuYW5vbnltb3VzVHlwZUNvdW50OyBpKyspeworCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChhbm9ueW1vdXNUeXBlc1tpXS50b1N0cmluZyh0YWIgKyAxKSk7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorcHVibGljIEZpZWxkRGVjbGFyYXRpb24gdXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKXsKKworCWlmICh0aGlzLmFub255bW91c1R5cGVzICE9IG51bGwgJiYgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiA9PSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hbm9ueW1vdXNUeXBlQ291bnQ7IGkrKyl7CisJCQlpZiAoYW5vbnltb3VzVHlwZXNbaV0ucHJlc2VydmVDb250ZW50KXsKKwkJCQlmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID0gCisJCQkJCSgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pdGhpcy5hbm9ueW1vdXNUeXBlc1tpXS51cGRhdGVkVHlwZURlY2xhcmF0aW9uKCkpLmFsbG9jYXRpb247CisJCQl9CisJCX0KKwkJaWYgKHRoaXMuYW5vbnltb3VzVHlwZUNvdW50ID4gMCkgZmllbGREZWNsYXJhdGlvbi5iaXRzIHw9IEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSzsKKwl9CisJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247Cit9CisvKgorICogQSBjbG9zaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgaGF2ZSBjbG9zZWQgdGhlIGN1cnJlbnQgZWxlbWVudCwKKyAqIGluIHdoaWNoIGNhc2UgYm90aCB0aGUgY3VycmVudEVsZW1lbnQgaXMgZXhpdGVkLgorICoKKyAqIEZpZWxkcyBoYXZlIG5vIGFzc29jaWF0ZWQgYnJhY2VzLCB0aHVzIGlmIG1hdGNoZXMsIHRoZW4gdXBkYXRlIHBhcmVudC4KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25DbG9zaW5nQnJhY2UoaW50IGJyYWNlU3RhcnQsIGludCBicmFjZUVuZCl7CisJaWYgKGJyYWNrZXRCYWxhbmNlID4gMCl7IC8vIHdhcyBhbiBhcnJheSBpbml0aWFsaXplcgorCQlicmFja2V0QmFsYW5jZS0tOworCQlpZiAoYnJhY2tldEJhbGFuY2UgPT0gMCkgYWxyZWFkeUNvbXBsZXRlZEZpZWxkSW5pdGlhbGl6YXRpb24gPSB0cnVlOworCQlyZXR1cm4gdGhpczsKKwl9CisJaWYgKHBhcmVudCAhPSBudWxsKXsKKwkJcmV0dXJuIHBhcmVudC51cGRhdGVPbkNsb3NpbmdCcmFjZShicmFjZVN0YXJ0LCBicmFjZUVuZCk7CisJfQorCXJldHVybiB0aGlzOworfQorLyoKKyAqIEFuIG9wZW5pbmcgYnJhY2UgZ290IGNvbnN1bWVkLCBtaWdodCBiZSB0aGUgZXhwZWN0ZWQgb3BlbmluZyBvbmUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIGJvZHlTdGFydCBpcyB1cGRhdGVkLgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgY3VycmVudFBvc2l0aW9uKXsKKwlpZiAoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwIAorCQkmJiBmaWVsZERlY2xhcmF0aW9uLnR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGVSZWZlcmVuY2UKKwkJJiYgIWFscmVhZHlDb21wbGV0ZWRGaWVsZEluaXRpYWxpemF0aW9uKXsKKwkJYnJhY2tldEJhbGFuY2UrKzsKKwkJcmV0dXJuIG51bGw7IC8vIG5vIHVwZGF0ZSBpcyBuZWNlc3NhcnkJKGFycmF5IGluaXRpYWxpemVyKQorCX0KKwkvLyBtaWdodCBiZSBhbiBhcnJheSBpbml0aWFsaXplcgorCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoY3VycmVudFBvc2l0aW9uIC0gMSk7CQorCXJldHVybiB0aGlzLnBhcmVudC51cGRhdGVPbk9wZW5pbmdCcmFjZShjdXJyZW50UG9zaXRpb24pOwkKK30KK3B1YmxpYyB2b2lkIHVwZGF0ZVBhcnNlVHJlZSgpeworCXRoaXMudXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKTsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IHNvdXJjZUVuZCl7CisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSB7CisJCXRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gc291cmNlRW5kOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW1wb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEltcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjA5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEltcG9ydC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKKy8qKgorICogSW50ZXJuYWwgaW1wb3J0IHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIFJlY292ZXJlZEltcG9ydCBleHRlbmRzIFJlY292ZXJlZEVsZW1lbnQgeworCisJcHVibGljIEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2U7CitwdWJsaWMgUmVjb3ZlcmVkSW1wb3J0KEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UsIFJlY292ZXJlZEVsZW1lbnQgcGFyZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpeworCXN1cGVyKHBhcmVudCwgYnJhY2tldEJhbGFuY2UpOworCXRoaXMuaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0UmVmZXJlbmNlOworfQorLyogCisgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQorICovCitwdWJsaWMgQXN0Tm9kZSBwYXJzZVRyZWUoKXsKKwlyZXR1cm4gaW1wb3J0UmVmZXJlbmNlOworfQorLyoKKyAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIGludCBzb3VyY2VFbmQoKXsKKwlyZXR1cm4gdGhpcy5pbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAiUmVjb3ZlcmVkIGltcG9ydDogIiArIGltcG9ydFJlZmVyZW5jZS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgSW1wb3J0UmVmZXJlbmNlIHVwZGF0ZWRJbXBvcnRSZWZlcmVuY2UoKXsKKworCXJldHVybiBpbXBvcnRSZWZlcmVuY2U7Cit9CitwdWJsaWMgdm9pZCB1cGRhdGVQYXJzZVRyZWUoKXsKKwl0aGlzLnVwZGF0ZWRJbXBvcnRSZWZlcmVuY2UoKTsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IHNvdXJjZUVuZCl7CisJaWYgKHRoaXMuaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHsKKwkJdGhpcy5pbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCXRoaXMuaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uRW5kID0gc291cmNlRW5kOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk4ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOworCisvKioKKyAqIEludGVybmFsIGluaXRpYWxpemVyIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CYXNlVHlwZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBSZWNvdmVyZWRGaWVsZCBpbXBsZW1lbnRzIENvbXBpbGVyTW9kaWZpZXJzLCBJVGVybWluYWxTeW1ib2xzLCBCYXNlVHlwZXMgeworCisJcHVibGljIFJlY292ZXJlZFR5cGVbXSBsb2NhbFR5cGVzOworCXB1YmxpYyBpbnQgbG9jYWxUeXBlQ291bnQ7CisKKwlwdWJsaWMgUmVjb3ZlcmVkQmxvY2sgaW5pdGlhbGl6ZXJCb2R5OwkKK3B1YmxpYyBSZWNvdmVyZWRJbml0aWFsaXplcihGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFJlY292ZXJlZEVsZW1lbnQgcGFyZW50LCBpbnQgYnJhY2tldEJhbGFuY2UpeworCXRoaXMoZmllbGREZWNsYXJhdGlvbiwgcGFyZW50LCBicmFja2V0QmFsYW5jZSwgbnVsbCk7Cit9CitwdWJsaWMgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlLCBQYXJzZXIgcGFyc2VyKXsKKwlzdXBlcihmaWVsZERlY2xhcmF0aW9uLCBwYXJlbnQsIGJyYWNrZXRCYWxhbmNlLCBwYXJzZXIpOworCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworfQorLyoKKyAqIFJlY29yZCBhIG5lc3RlZCBibG9jayBkZWNsYXJhdGlvbgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQmxvY2sgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55LAorCWRvIG5vdCBjb25zaWRlciBlbGVtZW50cyBwYXNzZWQgdGhlIGtub3duIGVuZCAoaWYgc2V0KQorCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50IAorCSovCisJaWYgKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwCisJCSYmIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24uc291cmNlU3RhcnQKKwkJCT4gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKXsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQobmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KKwlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorCisJaW5pdGlhbGl6ZXJCb2R5ID0gbmV3IFJlY292ZXJlZEJsb2NrKG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIHRoaXMsIGJyYWNrZXRCYWxhbmNlKTsKKwlpZiAobmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VFbmQgPT0gMCkgcmV0dXJuIGluaXRpYWxpemVyQm9keTsKKwlyZXR1cm4gdGhpczsKK30KKy8qCisgKiBSZWNvcmQgYSBmaWVsZCBkZWNsYXJhdGlvbiAoYWN0IGxpa2UgaW5zaWRlIG1ldGhvZCBib2R5KQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoRmllbGREZWNsYXJhdGlvbiBuZXdGaWVsZERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgaW5pdGlhbGl6ZXIgY2FuIG9ubHkgYmUgZmluYWwgYW5kIG5vbiB2b2lkICovCisJY2hhcltdW10gZmllbGRUeXBlTmFtZTsKKwlpZiAoKG5ld0ZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkFjY0ZpbmFsKSAhPSAwIC8qIGxvY2FsIHZhciBjYW4gb25seSBiZSBmaW5hbCAqLworCQl8fCAobmV3RmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpIC8vIGluaXRpYWxpemVyCisJCXx8ICgoZmllbGRUeXBlTmFtZSA9IG5ld0ZpZWxkRGVjbGFyYXRpb24udHlwZS5nZXRUeXBlTmFtZSgpKS5sZW5ndGggPT0gMSAvLyBub24gdm9pZAorCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRUeXBlTmFtZVswXSwgVm9pZEJpbmRpbmcuc291cmNlTmFtZSgpKSkpeyAKKwkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobmV3RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOworCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChuZXdGaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCX0KKwl9CisKKwkvKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlbGVnYXRlIHJlY29yZGluZyB0byBwYXJlbnQgaWYgYW55LAorCWRvIG5vdCBjb25zaWRlciBlbGVtZW50cyBwYXNzZWQgdGhlIGtub3duIGVuZCAoaWYgc2V0KQorCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyBlbGVtZW50IAorCSovCisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IDAKKwkJJiYgbmV3RmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0CisJCQk+IHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG5ld0ZpZWxkRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsKKwkJfQorCX0KKwkvLyBzdGlsbCBpbnNpZGUgaW5pdGlhbGl6ZXIsIHRyZWF0IGFzIGxvY2FsIHZhcmlhYmxlCisJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQorfQorLyoKKyAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIC0gcmVndWxhciBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGEgYmxvY2sgYm9keQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLworCWlmIChmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCisJCSYmIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCS8qIG1ldGhvZCBib2R5IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCAqLworCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCWJsb2NrLnNvdXJjZVN0YXJ0ID0gKChJbml0aWFsaXplcilmaWVsZERlY2xhcmF0aW9uKS5ib2R5U3RhcnQ7CisJUmVjb3ZlcmVkRWxlbWVudCBlbGVtZW50ID0gdGhpcy5hZGQoYmxvY2ssIDEpOworCXJldHVybiBlbGVtZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CQorfQorLyoKKyAqIFJlY29yZCBhIHN0YXRlbWVudCAtIHJlZ3VsYXIgbWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhIGJsb2NrIGJvZHkKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZG8gbm90IGNvbnNpZGVyIGEgc3RhdGVtZW50IHN0YXJ0aW5nIHBhc3NlZCB0aGUgaW5pdGlhbGl6ZXIgZW5kIChpZiBzZXQpCisJCWl0IG11c3QgYmUgYmVsb25naW5nIHRvIGFuIGVuY2xvc2luZyB0eXBlICovCisJaWYgKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKKwkJJiYgc3RhdGVtZW50LnNvdXJjZVN0YXJ0ID4gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlKTsKKwkJfQorCX0KKwkvKiBpbml0aWFsaXplciBib2R5IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCAqLworCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCWJsb2NrLnNvdXJjZVN0YXJ0ID0gKChJbml0aWFsaXplcilmaWVsZERlY2xhcmF0aW9uKS5ib2R5U3RhcnQ7CisJUmVjb3ZlcmVkRWxlbWVudCBlbGVtZW50ID0gdGhpcy5hZGQoYmxvY2ssIDEpOworCXJldHVybiBlbGVtZW50LmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlKTsJCit9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBkbyBub3QgY29uc2lkZXIgYSB0eXBlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgdHlwZSBlbmQgKGlmIHNldCkKKwkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KKwlpZiAoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwIAorCQkmJiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQodHlwZURlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCX0KKwl9CisJaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIExvY2FsVHlwZURlY2xhcmF0aW9uKXsKKwkJLyogbWV0aG9kIGJvZHkgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkICovCisJCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCQlibG9jay5zb3VyY2VTdGFydCA9ICgoSW5pdGlhbGl6ZXIpZmllbGREZWNsYXJhdGlvbikuYm9keVN0YXJ0OworCQlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSB0aGlzLmFkZChibG9jaywgMSk7CisJCXJldHVybiBlbGVtZW50LmFkZCh0eXBlRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsJCisJfQkKKwlpZiAobG9jYWxUeXBlcyA9PSBudWxsKSB7CisJCWxvY2FsVHlwZXMgPSBuZXcgUmVjb3ZlcmVkVHlwZVs1XTsKKwkJbG9jYWxUeXBlQ291bnQgPSAwOworCX0gZWxzZSB7CisJCWlmIChsb2NhbFR5cGVDb3VudCA9PSBsb2NhbFR5cGVzLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlsb2NhbFR5cGVzLCAKKwkJCQkwLCAKKwkJCQkobG9jYWxUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiBsb2NhbFR5cGVDb3VudF0pLCAKKwkJCQkwLCAKKwkJCQlsb2NhbFR5cGVDb3VudCk7IAorCQl9CisJfQorCVJlY292ZXJlZFR5cGUgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRUeXBlKHR5cGVEZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2UpOworCWxvY2FsVHlwZXNbbG9jYWxUeXBlQ291bnQrK10gPSBlbGVtZW50OworCisJLyogY29uc2lkZXIgdGhhdCBpZiB0aGUgb3BlbmluZyBicmFjZSB3YXMgbm90IGZvdW5kLCBpdCBpcyB0aGVyZSAqLworCWlmICghZm91bmRPcGVuaW5nQnJhY2UpeworCQlmb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJCXRoaXMuYnJhY2tldEJhbGFuY2UrKzsKKwl9CisJcmV0dXJuIGVsZW1lbnQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIGluaXRpYWxpemVyOlxuIik7IC8vJE5PTi1OTFMtMSQKKwlyZXN1bHQuYXBwZW5kKHRoaXMuZmllbGREZWNsYXJhdGlvbi50b1N0cmluZyh0YWIgKyAxKSk7CisJaWYgKHRoaXMuaW5pdGlhbGl6ZXJCb2R5ICE9IG51bGwpIHsKKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRoaXMuaW5pdGlhbGl6ZXJCb2R5LnRvU3RyaW5nKHRhYiArIDEpKTsKKwl9CisJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworfQorcHVibGljIEZpZWxkRGVjbGFyYXRpb24gdXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKXsKKworCWlmIChpbml0aWFsaXplckJvZHkgIT0gbnVsbCl7CisJCUJsb2NrIGJsb2NrID0gaW5pdGlhbGl6ZXJCb2R5LnVwZGF0ZWRCbG9jaygpOworCQlpZiAoYmxvY2sgIT0gbnVsbCl7CisJCQkoKEluaXRpYWxpemVyKWZpZWxkRGVjbGFyYXRpb24pLmJsb2NrID0gYmxvY2s7CisJCX0KKwkJaWYgKHRoaXMubG9jYWxUeXBlQ291bnQgPiAwKSBmaWVsZERlY2xhcmF0aW9uLmJpdHMgfD0gQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLOworCisJfQkKKwlpZiAoZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQgPT0gMCl7CisJCWZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwl9CisJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247Cit9CisvKgorICogQSBjbG9zaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgaGF2ZSBjbG9zZWQgdGhlIGN1cnJlbnQgZWxlbWVudCwKKyAqIGluIHdoaWNoIGNhc2UgYm90aCB0aGUgY3VycmVudEVsZW1lbnQgaXMgZXhpdGVkCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uQ2xvc2luZ0JyYWNlKGludCBicmFjZVN0YXJ0LCBpbnQgYnJhY2VFbmQpeworCWlmICgoLS1icmFja2V0QmFsYW5jZSA8PSAwKSAmJiAocGFyZW50ICE9IG51bGwpKXsKKwkJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShicmFjZUVuZCk7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCXJldHVybiB0aGlzOworfQorLyoKKyAqIEFuIG9wZW5pbmcgYnJhY2UgZ290IGNvbnN1bWVkLCBtaWdodCBiZSB0aGUgZXhwZWN0ZWQgb3BlbmluZyBvbmUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIGJvZHlTdGFydCBpcyB1cGRhdGVkLgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbk9wZW5pbmdCcmFjZShpbnQgY3VycmVudFBvc2l0aW9uKXsKKwlicmFja2V0QmFsYW5jZSsrOworCXJldHVybiB0aGlzOyAvLyByZXF1ZXN0IHRvIHJlc3RhcnQKK30KKy8qCisgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IHNvdXJjZUVuZCl7CisJaWYgKHRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSB7CisJCXRoaXMuZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCXRoaXMuZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJdGhpcy5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gc291cmNlRW5kOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRMb2NhbFZhcmlhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1MGE3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKKy8qKgorICogSW50ZXJuYWwgbG9jYWwgdmFyaWFibGUgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudDsKKworcHVibGljIGNsYXNzIFJlY292ZXJlZExvY2FsVmFyaWFibGUgZXh0ZW5kcyBSZWNvdmVyZWRTdGF0ZW1lbnQgeworCisJcHVibGljIExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbjsKKwlib29sZWFuIGFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uOworcHVibGljIFJlY292ZXJlZExvY2FsVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKKwlzdXBlcihsb2NhbERlY2xhcmF0aW9uLCBwYXJlbnQsIGJyYWNrZXRCYWxhbmNlKTsKKwl0aGlzLmxvY2FsRGVjbGFyYXRpb24gPSBsb2NhbERlY2xhcmF0aW9uOworCXRoaXMuYWxyZWFkeUNvbXBsZXRlZExvY2FsSW5pdGlhbGl6YXRpb24gPSBsb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGw7Cit9CisvKiAKKyAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBwYXJzZWQgc3RydWN0dXJlCisgKi8KK3B1YmxpYyBBc3ROb2RlIHBhcnNlVHJlZSgpeworCXJldHVybiBsb2NhbERlY2xhcmF0aW9uOworfQorLyoKKyAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIGludCBzb3VyY2VFbmQoKXsKKwlyZXR1cm4gdGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CisJcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBsb2NhbCB2YXJpYWJsZTpcbiIgKyBsb2NhbERlY2xhcmF0aW9uLnRvU3RyaW5nKHRhYiArIDEpOyAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoKXsKKwlyZXR1cm4gbG9jYWxEZWNsYXJhdGlvbjsKK30KKy8qCisgKiBBIGNsb3NpbmcgYnJhY2UgZ290IGNvbnN1bWVkLCBtaWdodCBoYXZlIGNsb3NlZCB0aGUgY3VycmVudCBlbGVtZW50LAorICogaW4gd2hpY2ggY2FzZSBib3RoIHRoZSBjdXJyZW50RWxlbWVudCBpcyBleGl0ZWQuCisgKgorICogRmllbGRzIGhhdmUgbm8gYXNzb2NpYXRlZCBicmFjZXMsIHRodXMgaWYgbWF0Y2hlcywgdGhlbiB1cGRhdGUgcGFyZW50LgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbkNsb3NpbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKKwlpZiAoYnJhY2tldEJhbGFuY2UgPiAwKXsgLy8gd2FzIGFuIGFycmF5IGluaXRpYWxpemVyCisJCWJyYWNrZXRCYWxhbmNlLS07CisJCWlmIChicmFja2V0QmFsYW5jZSA9PSAwKSBhbHJlYWR5Q29tcGxldGVkTG9jYWxJbml0aWFsaXphdGlvbiA9IHRydWU7CisJCXJldHVybiB0aGlzOworCX0KKwlpZiAocGFyZW50ICE9IG51bGwpeworCQlyZXR1cm4gcGFyZW50LnVwZGF0ZU9uQ2xvc2luZ0JyYWNlKGJyYWNlU3RhcnQsIGJyYWNlRW5kKTsKKwl9CisJcmV0dXJuIHRoaXM7Cit9CisvKgorICogQW4gb3BlbmluZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGJlIHRoZSBleHBlY3RlZCBvcGVuaW5nIG9uZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LAorICogaW4gd2hpY2ggY2FzZSB0aGUgYm9keVN0YXJ0IGlzIHVwZGF0ZWQuCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uT3BlbmluZ0JyYWNlKGludCBjdXJyZW50UG9zaXRpb24peworCWlmIChsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDAgCisJCSYmIGxvY2FsRGVjbGFyYXRpb24udHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZVJlZmVyZW5jZQorCQkmJiAhYWxyZWFkeUNvbXBsZXRlZExvY2FsSW5pdGlhbGl6YXRpb24peworCQlicmFja2V0QmFsYW5jZSsrOworCQlyZXR1cm4gbnVsbDsgLy8gbm8gdXBkYXRlIGlzIG5lY2Vzc2FyeQkoYXJyYXkgaW5pdGlhbGl6ZXIpCisJfQorCS8vIG1pZ2h0IGJlIGFuIGFycmF5IGluaXRpYWxpemVyCisJdGhpcy51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShjdXJyZW50UG9zaXRpb24gLSAxKTsJCisJcmV0dXJuIHRoaXMucGFyZW50LnVwZGF0ZU9uT3BlbmluZ0JyYWNlKGN1cnJlbnRQb3NpdGlvbik7CQorfQorcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7CisJdGhpcy51cGRhdGVkU3RhdGVtZW50KCk7Cit9CisvKgorICogVXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGludCBzb3VyY2VFbmQpeworCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQl0aGlzLmxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCXRoaXMubG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkVuZCA9IHNvdXJjZUVuZDsJCisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmODgyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTWV0aG9kLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN1cGVyUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJhc2VUeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogSW50ZXJuYWwgbWV0aG9kIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKKyAqLworCitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkTWV0aG9kIGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCBpbXBsZW1lbnRzIENvbXBpbGVyTW9kaWZpZXJzLCBJVGVybWluYWxTeW1ib2xzLCBCYXNlVHlwZXMgeworCisJcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb247CisKKwlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIGxvY2FsVHlwZXM7CisJcHVibGljIGludCBsb2NhbFR5cGVDb3VudDsKKworCXB1YmxpYyBSZWNvdmVyZWRCbG9jayBtZXRob2RCb2R5OworCXB1YmxpYyBib29sZWFuIGRpc2NhcmRCb2R5ID0gdHJ1ZTsKKworcHVibGljIFJlY292ZXJlZE1ldGhvZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlLCBQYXJzZXIgcGFyc2VyKXsKKwlzdXBlcihwYXJlbnQsIGJyYWNrZXRCYWxhbmNlLCBwYXJzZXIpOworCXRoaXMubWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2REZWNsYXJhdGlvbjsKKwl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gIWJvZHlTdGFydHNBdEhlYWRlckVuZCgpOworCWlmKHRoaXMuZm91bmRPcGVuaW5nQnJhY2UpIHsKKwkJdGhpcy5icmFja2V0QmFsYW5jZSsrOworCX0KK30KKy8qCisgKiBSZWNvcmQgYSBuZXN0ZWQgYmxvY2sgZGVjbGFyYXRpb24KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEJsb2NrIG5lc3RlZEJsb2NrRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBkZWxlZ2F0ZSByZWNvcmRpbmcgdG8gcGFyZW50IGlmIGFueSwKKwlkbyBub3QgY29uc2lkZXIgZWxlbWVudHMgcGFzc2VkIHRoZSBrbm93biBlbmQgKGlmIHNldCkKKwlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgZWxlbWVudCAKKwkqLworCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA+IDAKKwkJJiYgbmVzdGVkQmxvY2tEZWNsYXJhdGlvbi5zb3VyY2VTdGFydAorCQkJPiBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpeworCQkJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCQkJfQorCX0KKwkvKiBjb25zaWRlciB0aGF0IGlmIHRoZSBvcGVuaW5nIGJyYWNlIHdhcyBub3QgZm91bmQsIGl0IGlzIHRoZXJlICovCisJaWYgKCFmb3VuZE9wZW5pbmdCcmFjZSl7CisJCWZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKKwkJdGhpcy5icmFja2V0QmFsYW5jZSsrOworCX0KKworCW1ldGhvZEJvZHkgPSBuZXcgUmVjb3ZlcmVkQmxvY2sobmVzdGVkQmxvY2tEZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2UpOworCWlmIChuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSAwKSByZXR1cm4gbWV0aG9kQm9keTsKKwlyZXR1cm4gdGhpczsKK30KKy8qCisgKiBSZWNvcmQgYSBmaWVsZCBkZWNsYXJhdGlvbgorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgbWV0aG9kIGNhbiBvbmx5IGJlIGZpbmFsIGFuZCBub24gdm9pZCAqLworCWNoYXJbXVtdIGZpZWxkVHlwZU5hbWU7IAorCWlmICgoZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgJiB+QWNjRmluYWwpICE9IDAgLy8gbG9jYWwgdmFyIGNhbiBvbmx5IGJlIGZpbmFsIAorCQl8fCAoZmllbGREZWNsYXJhdGlvbi50eXBlID09IG51bGwpIC8vIGluaXRpYWxpemVyCisJCXx8ICgoZmllbGRUeXBlTmFtZSA9IGZpZWxkRGVjbGFyYXRpb24udHlwZS5nZXRUeXBlTmFtZSgpKS5sZW5ndGggPT0gMSAvLyBub24gdm9pZAorCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGRUeXBlTmFtZVswXSwgVm9pZEJpbmRpbmcuc291cmNlTmFtZSgpKSkpeyAKKworCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCl7CisJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJCX0gZWxzZSB7CisJCQl0aGlzLnVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KHRoaXMucHJldmlvdXNBdmFpbGFibGVMaW5lRW5kKGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAtIDEpKTsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGVsZWdhdGUgcmVjb3JkaW5nIHRvIHBhcmVudCBpZiBhbnksCisJZG8gbm90IGNvbnNpZGVyIGVsZW1lbnRzIHBhc3NlZCB0aGUga25vd24gZW5kIChpZiBzZXQpCisJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIGVsZW1lbnQgCisJKi8KKwlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPiAwCisJCSYmIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydAorCQkJPiBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKXsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KKwlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorCS8vIHN0aWxsIGluc2lkZSBtZXRob2QsIHRyZWF0IGFzIGxvY2FsIHZhcmlhYmxlCisJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQorfQorLyoKKyAqIFJlY29yZCBhIGxvY2FsIGRlY2xhcmF0aW9uIC0gcmVndWxhciBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGEgYmxvY2sgYm9keQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGxvY2FsIHZhcmlhYmxlcyBpbnNpZGUgbWV0aG9kIGNhbiBvbmx5IGJlIGZpbmFsIGFuZCBub24gdm9pZCAqLworLyoJCisJY2hhcltdW10gbG9jYWxUeXBlTmFtZTsgCisJaWYgKChsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMCAvLyBsb2NhbCB2YXIgY2FuIG9ubHkgYmUgZmluYWwgCisJCXx8IChsb2NhbERlY2xhcmF0aW9uLnR5cGUgPT0gbnVsbCkgLy8gaW5pdGlhbGl6ZXIKKwkJfHwgKChsb2NhbFR5cGVOYW1lID0gbG9jYWxEZWNsYXJhdGlvbi50eXBlLmdldFR5cGVOYW1lKCkpLmxlbmd0aCA9PSAxIC8vIG5vbiB2b2lkCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhsb2NhbFR5cGVOYW1lWzBdLCBWb2lkQmluZGluZy5zb3VyY2VOYW1lKCkpKSl7IAorCisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKXsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkodGhpcy5wcmV2aW91c0F2YWlsYWJsZUxpbmVFbmQobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IC0gMSkpOworCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJCX0KKwl9CisqLworCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLworCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwIAorCQkmJiBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCl7CisJCQkKKwkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKKwkJCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnBhcmVudC5hZGQobG9jYWxEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCWlmIChtZXRob2RCb2R5ID09IG51bGwpeworCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKKwkJYmxvY2suc291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudEJsb2NrID0gdGhpcy5hZGQoYmxvY2ssIDEpOworCQlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA+IDApeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmJyYWNrZXRCYWxhbmNlIC0gMTsgaSsrKXsKKwkJCQljdXJyZW50QmxvY2sgPSBjdXJyZW50QmxvY2suYWRkKG5ldyBCbG9jaygwKSwgMSk7CisJCQl9CisJCQl0aGlzLmJyYWNrZXRCYWxhbmNlID0gMTsKKwkJfQorCQlyZXR1cm4gY3VycmVudEJsb2NrLmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorCXJldHVybiBtZXRob2RCb2R5LmFkZChsb2NhbERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSwgdHJ1ZSk7Cit9CisvKgorICogUmVjb3JkIGEgc3RhdGVtZW50IC0gcmVndWxhciBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGEgYmxvY2sgYm9keQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBkbyBub3QgY29uc2lkZXIgYSB0eXBlIHN0YXJ0aW5nIHBhc3NlZCB0aGUgdHlwZSBlbmQgKGlmIHNldCkKKwkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KKwlpZiAobWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKKwkJJiYgc3RhdGVtZW50LnNvdXJjZVN0YXJ0ID4gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCisJCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gdGhpczsgLy8gaWdub3JlCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCWlmIChtZXRob2RCb2R5ID09IG51bGwpeworCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKKwkJYmxvY2suc291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudEJsb2NrID0gdGhpcy5hZGQoYmxvY2ssIDEpOworCQlpZiAodGhpcy5icmFja2V0QmFsYW5jZSA+IDApeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmJyYWNrZXRCYWxhbmNlIC0gMTsgaSsrKXsKKwkJCQljdXJyZW50QmxvY2sgPSBjdXJyZW50QmxvY2suYWRkKG5ldyBCbG9jaygwKSwgMSk7CisJCQl9CisJCQl0aGlzLmJyYWNrZXRCYWxhbmNlID0gMTsKKwkJfQorCQlyZXR1cm4gY3VycmVudEJsb2NrLmFkZChzdGF0ZW1lbnQsIGJyYWNrZXRCYWxhbmNlKTsKKwl9CisJcmV0dXJuIG1ldGhvZEJvZHkuYWRkKHN0YXRlbWVudCwgYnJhY2tldEJhbGFuY2UsIHRydWUpOwkKK30KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLworCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAhPSAwIAorCQkmJiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA+IG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKXsKKwkJCQorCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXM7IC8vIGlnbm9yZQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMucGFyZW50LmFkZCh0eXBlRGVjbGFyYXRpb24sIGJyYWNrZXRCYWxhbmNlKTsKKwkJfQorCX0KKwlpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTG9jYWxUeXBlRGVjbGFyYXRpb24peworCQlpZiAobWV0aG9kQm9keSA9PSBudWxsKXsKKwkJCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCQkJYmxvY2suc291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQ7CisJCQl0aGlzLmFkZChibG9jaywgMSk7CisJCX0KKwkJcmV0dXJuIG1ldGhvZEJvZHkuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UsIHRydWUpOwkKKwl9CQorCWlmIChsb2NhbFR5cGVzID09IG51bGwpIHsKKwkJbG9jYWxUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzVdOworCQlsb2NhbFR5cGVDb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGxvY2FsVHlwZUNvdW50ID09IGxvY2FsVHlwZXMubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWxvY2FsVHlwZXMsIAorCQkJCTAsIAorCQkJCShsb2NhbFR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbMiAqIGxvY2FsVHlwZUNvdW50XSksIAorCQkJCTAsIAorCQkJCWxvY2FsVHlwZUNvdW50KTsgCisJCX0KKwl9CisJUmVjb3ZlcmVkVHlwZSBlbGVtZW50ID0gbmV3IFJlY292ZXJlZFR5cGUodHlwZURlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZSk7CisJbG9jYWxUeXBlc1tsb2NhbFR5cGVDb3VudCsrXSA9IGVsZW1lbnQ7CisKKwkvKiBjb25zaWRlciB0aGF0IGlmIHRoZSBvcGVuaW5nIGJyYWNlIHdhcyBub3QgZm91bmQsIGl0IGlzIHRoZXJlICovCisJaWYgKCFmb3VuZE9wZW5pbmdCcmFjZSl7CisJCWZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsKKwkJdGhpcy5icmFja2V0QmFsYW5jZSsrOworCX0KKwlyZXR1cm4gZWxlbWVudDsKK30KK3B1YmxpYyBib29sZWFuIGJvZHlTdGFydHNBdEhlYWRlckVuZCgpeworCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5ib2R5U3RhcnQgPT0gbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKzE7Cit9CisvKiAKKyAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBwYXJzZWQgc3RydWN0dXJlCisgKi8KK3B1YmxpYyBBc3ROb2RlIHBhcnNlVHJlZSgpeworCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIHZlcnkgc291cmNlIGVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyBpbnQgc291cmNlRW5kKCl7CisJcmV0dXJuIHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIG1ldGhvZDpcbiIpOyAvLyROT04tTkxTLTEkCisJcmVzdWx0LmFwcGVuZCh0aGlzLm1ldGhvZERlY2xhcmF0aW9uLnRvU3RyaW5nKHRhYiArIDEpKTsKKwlpZiAodGhpcy5sb2NhbFR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsVHlwZUNvdW50OyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQodGhpcy5sb2NhbFR5cGVzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlpZiAodGhpcy5tZXRob2RCb2R5ICE9IG51bGwpIHsKKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHRoaXMubWV0aG9kQm9keS50b1N0cmluZyh0YWIgKyAxKSk7CisJfQorCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGJvZHlTdGFydCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZUJvZHlTdGFydChpbnQgYm9keVN0YXJ0KXsKKwl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsJCQorCXRoaXMubWV0aG9kRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gYm9keVN0YXJ0OworfQorcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gdXBkYXRlZE1ldGhvZERlY2xhcmF0aW9uKCl7CisKKwlpZiAobWV0aG9kQm9keSAhPSBudWxsKXsKKwkJQmxvY2sgYmxvY2sgPSBtZXRob2RCb2R5LnVwZGF0ZWRCbG9jaygpOworCQlpZiAoYmxvY2sgIT0gbnVsbCl7CisJCQltZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50czsKKworCQkJLyogZmlyc3Qgc3RhdGVtZW50IG1pZ2h0IGJlIGFuIGV4cGxpY3QgY29uc3RydWN0b3IgY2FsbCBkZXN0aW5hdGVkIHRvIGEgc3BlY2lhbCBzbG90ICovCisJCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKW1ldGhvZERlY2xhcmF0aW9uOworCQkJCWlmIChtZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzICE9IG51bGwKKwkJCQkJJiYgbWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50c1swXSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKXsKKwkJCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKW1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHNbMF07CisJCQkJCWludCBsZW5ndGggPSBtZXRob2REZWNsYXJhdGlvbi5zdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCW1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHMsIAorCQkJCQkJMSwgCisJCQkJCQkobWV0aG9kRGVjbGFyYXRpb24uc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbbGVuZ3RoLTFdKSwKKwkJCQkJCTAsCisJCQkJCQlsZW5ndGgtMSk7CisJCQkJCX0KKwkJCQkJaWYgKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsKXsgLy8gYWRkIGltcGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwKKwkJCQkJCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKKwkJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChsb2NhbFR5cGVDb3VudCA+IDApIG1ldGhvZERlY2xhcmF0aW9uLmJpdHMgfD0gQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLOworCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZSBmcm9tIHBhcnNlciBzdGF0ZSB3aGljaAorICogaXMgYWJvdXQgdG8gZGlzYXBwZWFyIGJlY2F1c2Ugb2YgcmVzdGFydGluZyByZWNvdmVyeQorICovCitwdWJsaWMgdm9pZCB1cGRhdGVGcm9tUGFyc2VyU3RhdGUoKXsKKworCWlmKHRoaXMuYm9keVN0YXJ0c0F0SGVhZGVyRW5kKCkpeworCQlQYXJzZXIgcGFyc2VyID0gdGhpcy5wYXJzZXIoKTsKKwkJLyogbWlnaHQgd2FudCB0byByZWNvdmVyIGFyZ3VtZW50cyBvciB0aHJvd24gZXhjZXB0aW9ucyAqLworCQlpZiAocGFyc2VyLmxpc3RMZW5ndGggPiAwICYmIHBhcnNlci5hc3RMZW5ndGhQdHIgPiAwKXsgLy8gYXdhaXRpbmcgaW50ZXJmYWNlIHR5cGUgcmVmZXJlbmNlcworCQkJLyogaGFzIGNvbnN1bWVkIHRoZSBhcmd1bWVudHMgLSBsaXN0ZWQgZWxlbWVudHMgbXVzdCBiZSB0aHJvd24gZXhjZXB0aW9ucyAqLworCQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZCA9PSBwYXJzZXIuclBhcmVuUG9zKSB7CisJCQkJCisJCQkJLy8gcHJvdGVjdGlvbiBmb3IgYnVncyAxNTE0MgorCQkJCWludCBsZW5ndGggPSBwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl07CisJCQkJaW50IGFzdFB0ciA9IHBhcnNlci5hc3RQdHIgLSBsZW5ndGg7CisJCQkJYm9vbGVhbiBjYW5Db25zdW1lID0gYXN0UHRyID49IDA7CisJCQkJaWYoY2FuQ29uc3VtZSkgeworCQkJCQlpZigoIShwYXJzZXIuYXN0U3RhY2tbYXN0UHRyXSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pKSkgeworCQkJCQkJY2FuQ29uc3VtZSA9IGZhbHNlOworCQkJCQl9CisJCQkJCWZvciAoaW50IGkgPSAxLCBtYXggPSBsZW5ndGggKyAxOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCWlmKCEocGFyc2VyLmFzdFN0YWNrW2FzdFB0ciArIGkgXSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpKSB7CisJCQkJCQkJY2FuQ29uc3VtZSA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChjYW5Db25zdW1lKXsKKwkJCQkJcGFyc2VyLmNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKTsgCisJCQkJCS8vIHdpbGwgcmVzZXQgdHlwZUxpc3RMZW5ndGggdG8gemVybworCQkJCQkvLyB0aHVzIHRoaXMgY2hlY2sgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBvbiBmaXJzdCBlcnJvckNoZWNrIGFmdGVyIHZvaWQgZm9vKCkgdGhyb3dzIFgsIFksCisJCQkJfSBlbHNlIHsKKwkJCQkJcGFyc2VyLmxpc3RMZW5ndGggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogaGFzIG5vdCBjb25zdW1lZCBhcmd1bWVudHMgeWV0LCBsaXN0ZWQgZWxlbWVudHMgbXVzdCBiZSBhcmd1bWVudHMgKi8KKwkJCQlpZiAocGFyc2VyLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVMUEFSRU4gfHwgcGFyc2VyLmN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04peworCQkJCQkvKiBpZiBjdXJyZW50VG9rZW4gaXMgcGFyZW50aGVzaXMgdGhpcyBsYXN0IGFyZ3VtZW50IGlzIGEgbWV0aG9kL2ZpZWxkIHNpZ25hdHVyZSAqLworCQkJCQlwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl0gLS07IAorCQkJCQlwYXJzZXIuYXN0UHRyIC0tOyAKKwkJCQkJcGFyc2VyLmxpc3RMZW5ndGggLS07CisJCQkJCXBhcnNlci5jdXJyZW50VG9rZW4gPSAwOworCQkJCX0KKwkJCQlpbnQgYXJnTGVuZ3RoID0gcGFyc2VyLmFzdExlbmd0aFN0YWNrW3BhcnNlci5hc3RMZW5ndGhQdHJdOworCQkJCWludCBhcmdTdGFydCA9IHBhcnNlci5hc3RQdHIgLSBhcmdMZW5ndGggKyAxOworCQkJCWJvb2xlYW4gbmVlZFVwZGF0ZVJQYXJlblBvcyA9IHBhcnNlci5yUGFyZW5Qb3MgPCBwYXJzZXIubFBhcmVuUG9zOyAvLyAxMjM4NyA6IHJQYXJlblBvcyB3aWxsIGJlIHVzZWQKKwkJCQkvLyB0byBjb21wdXRlIGJvZHlTdGFydCwgYW5kIHRodXMgdXNlZCB0byBzZXQgbmV4dCBjaGVja3BvaW50LgorCQkJCWludCBjb3VudDsKKwkJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBhcmdMZW5ndGg7IGNvdW50KyspeworCQkJCQlBcmd1bWVudCBhcmd1bWVudCA9IChBcmd1bWVudClwYXJzZXIuYXN0U3RhY2tbYXJnU3RhcnQrY291bnRdOworCQkJCQkvKiBjYW5ub3QgYmUgYW4gYXJndW1lbnQgaWYgbm9uIGZpbmFsICovCisJCQkJCWNoYXJbXVtdIGFyZ1R5cGVOYW1lID0gYXJndW1lbnQudHlwZS5nZXRUeXBlTmFtZSgpOworCQkJCQlpZiAoKGFyZ3VtZW50Lm1vZGlmaWVycyAmIH5BY2NGaW5hbCkgIT0gMAorCQkJCQkJfHwgKGFyZ1R5cGVOYW1lLmxlbmd0aCA9PSAxCisJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXJnVHlwZU5hbWVbMF0sIFZvaWRCaW5kaW5nLnNvdXJjZU5hbWUoKSkpKXsKKwkJCQkJCXBhcnNlci5hc3RMZW5ndGhTdGFja1twYXJzZXIuYXN0TGVuZ3RoUHRyXSA9IGNvdW50OyAKKwkJCQkJCXBhcnNlci5hc3RQdHIgPSBhcmdTdGFydCtjb3VudC0xOyAKKwkJCQkJCXBhcnNlci5saXN0TGVuZ3RoID0gY291bnQ7CisJCQkJCQlwYXJzZXIuY3VycmVudFRva2VuID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChuZWVkVXBkYXRlUlBhcmVuUG9zKSBwYXJzZXIuclBhcmVuUG9zID0gYXJndW1lbnQuc291cmNlRW5kICsgMTsKKwkJCQl9CisJCQkJaWYgKHBhcnNlci5saXN0TGVuZ3RoID4gMCAmJiBwYXJzZXIuYXN0TGVuZ3RoUHRyID4gMCl7CisJCQkJCQorCQkJCQkvLyBwcm90ZWN0aW9uIGZvciBidWdzIDE1MTQyCisJCQkJCWludCBsZW5ndGggPSBwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl07CisJCQkJCWludCBhc3RQdHIgPSBwYXJzZXIuYXN0UHRyIC0gbGVuZ3RoOworCQkJCQlib29sZWFuIGNhbkNvbnN1bWUgPSBhc3RQdHIgPj0gMDsKKwkJCQkJaWYoY2FuQ29uc3VtZSkgeworCQkJCQkJaWYoKCEocGFyc2VyLmFzdFN0YWNrW2FzdFB0cl0gaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSkpIHsKKwkJCQkJCQljYW5Db25zdW1lID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlmb3IgKGludCBpID0gMSwgbWF4ID0gbGVuZ3RoICsgMTsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJaWYoIShwYXJzZXIuYXN0U3RhY2tbYXN0UHRyICsgaSBdIGluc3RhbmNlb2YgQXJndW1lbnQpKSB7CisJCQkJCQkJCWNhbkNvbnN1bWUgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYoY2FuQ29uc3VtZSkgeworCQkJCQkJcGFyc2VyLmNvbnN1bWVNZXRob2RIZWFkZXJQYXJhbWV0ZXJzKCk7CisJCQkJCQkvKiBmaXgtdXAgcG9zaXRpb25zLCBnaXZlbiB0aGV5IHdlcmUgdXBkYXRlZCBhZ2FpbnN0IHJQYXJlblBvcywgd2hpY2ggZGlkIG5vdCBnZXQgc2V0ICovCisJCQkJCQlpZiAocGFyc2VyLmN1cnJlbnRFbGVtZW50ID09IHRoaXMpeyAvLyBwYXJhbWV0ZXIgYWRkaXRpb24gbWlnaHQgaGF2ZSBhZGRlZCBhbiBhd2FpdGluZyAobm8gcmV0dXJuIHR5cGUpIG1ldGhvZCAtIHNlZSAxRlZYUVo0ICovCisJCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kID0gbWV0aG9kRGVjbGFyYXRpb24uYXJndW1lbnRzW21ldGhvZERlY2xhcmF0aW9uLmFyZ3VtZW50cy5sZW5ndGgtMV0uc291cmNlRW5kOworCQkJCQkJCW1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydCA9IG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZUVuZCsxOworCQkJCQkJCXBhcnNlci5sYXN0Q2hlY2tQb2ludCA9IG1ldGhvZERlY2xhcmF0aW9uLmJvZHlTdGFydDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKy8qCisgKiBBbiBvcGVuaW5nIGJyYWNlIGdvdCBjb25zdW1lZCwgbWlnaHQgYmUgdGhlIGV4cGVjdGVkIG9wZW5pbmcgb25lIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBib2R5U3RhcnQgaXMgdXBkYXRlZC4KKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgdXBkYXRlT25PcGVuaW5nQnJhY2UoaW50IGJyYWNlRW5kKXsKKworCS8qIGluIGNhc2UgdGhlIG9wZW5pbmcgYnJhY2UgaXMgY2xvc2UgZW5vdWdoIHRvIHRoZSBzaWduYXR1cmUgKi8KKwlpZiAoYnJhY2tldEJhbGFuY2UgPT0gMCl7CisJCS8qCisJCQlpZiAocGFyc2VyLnNjYW5uZXIuc2VhcmNoTGluZU51bWJlcihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQpIAorCQkJCSE9IHBhcnNlci5zY2FubmVyLnNlYXJjaExpbmVOdW1iZXIoYnJhY2VFbmQpKXsKKwkJICovCisJCXN3aXRjaChwYXJzZXIoKS5sYXN0SWdub3JlZFRva2VuKXsKKwkJCWNhc2UgLTEgOgorCQkJY2FzZSBUb2tlbk5hbWV0aHJvd3MgOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aGlzLmZvdW5kT3BlbmluZ0JyYWNlID0gdHJ1ZTsJCQkJCisJCQkJYnJhY2tldEJhbGFuY2UgPSAxOyAvLyBwcmV0ZW5kIHRoZSBicmFjZSB3YXMgYWxyZWFkeSB0aGVyZQorCQl9CisJfQkKKwlyZXR1cm4gc3VwZXIudXBkYXRlT25PcGVuaW5nQnJhY2UoYnJhY2VFbmQpOworfQorcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7CisJdGhpcy51cGRhdGVkTWV0aG9kRGVjbGFyYXRpb24oKTsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IHNvdXJjZUVuZCl7CisJaWYgKHRoaXMubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkgeworCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc291cmNlRW5kOworCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uLmJvZHlFbmQgPSBzb3VyY2VFbmQ7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjYTFmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworLyoqCisgKiBJbnRlcm5hbCBzdGF0ZW1lbnQgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OworCitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkU3RhdGVtZW50IGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCB7CisKKwlwdWJsaWMgU3RhdGVtZW50IHN0YXRlbWVudDsKKwlib29sZWFuIGFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uOworcHVibGljIFJlY292ZXJlZFN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50LCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKKwlzdXBlcihwYXJlbnQsIGJyYWNrZXRCYWxhbmNlKTsKKwl0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKK30KKy8qIAorICogQW5zd2VyIHRoZSBhc3NvY2lhdGVkIHBhcnNlZCBzdHJ1Y3R1cmUKKyAqLworcHVibGljIEFzdE5vZGUgcGFyc2VUcmVlKCl7CisJcmV0dXJuIHN0YXRlbWVudDsKK30KKy8qCisgKiBBbnN3ZXIgdGhlIHZlcnkgc291cmNlIGVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyBpbnQgc291cmNlRW5kKCl7CisJcmV0dXJuIHRoaXMuc3RhdGVtZW50LnNvdXJjZUVuZDsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYil7CisJcmV0dXJuIHRhYlN0cmluZyh0YWIpICsgIlJlY292ZXJlZCBzdGF0ZW1lbnQ6XG4iICsgc3RhdGVtZW50LnRvU3RyaW5nKHRhYiArIDEpOyAvLyROT04tTkxTLTEkCit9CitwdWJsaWMgU3RhdGVtZW50IHVwZGF0ZWRTdGF0ZW1lbnQoKXsKKwlyZXR1cm4gc3RhdGVtZW50OworfQorcHVibGljIHZvaWQgdXBkYXRlUGFyc2VUcmVlKCl7CisJdGhpcy51cGRhdGVkU3RhdGVtZW50KCk7Cit9CisvKgorICogVXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJzZSBub2RlCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZVNvdXJjZUVuZElmTmVjZXNzYXJ5KGludCBzb3VyY2VFbmQpeworCWlmICh0aGlzLnN0YXRlbWVudC5zb3VyY2VFbmQgPT0gMCkJCisJCXRoaXMuc3RhdGVtZW50LnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMTQ0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOworCisvKioKKyAqIEludGVybmFsIHR5cGUgc3RydWN0dXJlIGZvciBwYXJzaW5nIHJlY292ZXJ5IAorICovCisKK3B1YmxpYyBjbGFzcyBSZWNvdmVyZWRUeXBlIGV4dGVuZHMgUmVjb3ZlcmVkU3RhdGVtZW50IGltcGxlbWVudHMgSVRlcm1pbmFsU3ltYm9scywgQ29tcGlsZXJNb2RpZmllcnMgeworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOworCisJcHVibGljIFJlY292ZXJlZFR5cGVbXSBtZW1iZXJUeXBlczsKKwlwdWJsaWMgaW50IG1lbWJlclR5cGVDb3VudDsKKwlwdWJsaWMgUmVjb3ZlcmVkRmllbGRbXSBmaWVsZHM7CisJcHVibGljIGludCBmaWVsZENvdW50OworCXB1YmxpYyBSZWNvdmVyZWRNZXRob2RbXSBtZXRob2RzOworCXB1YmxpYyBpbnQgbWV0aG9kQ291bnQ7CisKKwlwdWJsaWMgYm9vbGVhbiBwcmVzZXJ2ZUNvbnRlbnQgPSBmYWxzZTsJLy8gb25seSB1c2VkIGZvciBhbm9ueW1vdXMgdHlwZXMKKwlwdWJsaWMgaW50IGJvZHlFbmQ7CisJCitwdWJsaWMgUmVjb3ZlcmVkVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKKwlzdXBlcih0eXBlRGVjbGFyYXRpb24sIHBhcmVudCwgYnJhY2tldEJhbGFuY2UpOworCXRoaXMudHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uOworCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSAhYm9keVN0YXJ0c0F0SGVhZGVyRW5kKCk7CisJaWYodGhpcy5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorfQorcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGludCBicmFja2V0QmFsYW5jZSkgeworCisJLyogZG8gbm90IGNvbnNpZGVyIGEgbWV0aG9kIHN0YXJ0aW5nIHBhc3NlZCB0aGUgdHlwZSBlbmQgKGlmIHNldCkKKwkJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KKwlpZiAodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAgCisJCSYmIG1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG1ldGhvZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorCisJaWYgKG1ldGhvZHMgPT0gbnVsbCkgeworCQltZXRob2RzID0gbmV3IFJlY292ZXJlZE1ldGhvZFs1XTsKKwkJbWV0aG9kQ291bnQgPSAwOworCX0gZWxzZSB7CisJCWlmIChtZXRob2RDb3VudCA9PSBtZXRob2RzLmxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQltZXRob2RzLCAKKwkJCQkwLCAKKwkJCQkobWV0aG9kcyA9IG5ldyBSZWNvdmVyZWRNZXRob2RbMiAqIG1ldGhvZENvdW50XSksIAorCQkJCTAsIAorCQkJCW1ldGhvZENvdW50KTsgCisJCX0KKwl9CisJUmVjb3ZlcmVkTWV0aG9kIGVsZW1lbnQgPSBuZXcgUmVjb3ZlcmVkTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZSwgdGhpcy5yZWNvdmVyaW5nUGFyc2VyKTsKKwltZXRob2RzW21ldGhvZENvdW50KytdID0gZWxlbWVudDsKKworCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KKwlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorCS8qIGlmIG1ldGhvZCBub3QgZmluaXNoZWQsIHRoZW4gbWV0aG9kIGJlY29tZXMgY3VycmVudCAqLworCWlmIChtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSByZXR1cm4gZWxlbWVudDsKKwlyZXR1cm4gdGhpczsKK30KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChCbG9jayBuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLGludCBicmFja2V0QmFsYW5jZSkgeworCWludCBtb2RpZmllcnMgPSBBY2NEZWZhdWx0OworCWlmKHRoaXMucGFyc2VyKCkucmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydCAhPSAwKSB7CisJCW1vZGlmaWVycyA9IEFjY1N0YXRpYzsKKwl9CisJcmV0dXJuIHRoaXMuYWRkKG5ldyBJbml0aWFsaXplcihuZXN0ZWRCbG9ja0RlY2xhcmF0aW9uLCBtb2RpZmllcnMpLCBicmFja2V0QmFsYW5jZSk7Cit9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKwkKKwkvKiBkbyBub3QgY29uc2lkZXIgYSBmaWVsZCBzdGFydGluZyBwYXNzZWQgdGhlIHR5cGUgZW5kIChpZiBzZXQpCisJaXQgbXVzdCBiZSBiZWxvbmdpbmcgdG8gYW4gZW5jbG9zaW5nIHR5cGUgKi8KKwlpZiAodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICE9IDAKKwkJJiYgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID4gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCXJldHVybiB0aGlzLnBhcmVudC5hZGQoZmllbGREZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KKwlpZiAoZmllbGRzID09IG51bGwpIHsKKwkJZmllbGRzID0gbmV3IFJlY292ZXJlZEZpZWxkWzVdOworCQlmaWVsZENvdW50ID0gMDsKKwl9IGVsc2UgeworCQlpZiAoZmllbGRDb3VudCA9PSBmaWVsZHMubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWZpZWxkcywgCisJCQkJMCwgCisJCQkJKGZpZWxkcyA9IG5ldyBSZWNvdmVyZWRGaWVsZFsyICogZmllbGRDb3VudF0pLCAKKwkJCQkwLCAKKwkJCQlmaWVsZENvdW50KTsgCisJCX0KKwl9CisJUmVjb3ZlcmVkRmllbGQgZWxlbWVudCA9IGZpZWxkRGVjbGFyYXRpb24uaXNGaWVsZCgpIAorCQkJCQkJCQk/IG5ldyBSZWNvdmVyZWRGaWVsZChmaWVsZERlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZSkKKwkJCQkJCQkJOiBuZXcgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIoZmllbGREZWNsYXJhdGlvbiwgdGhpcywgYnJhY2tldEJhbGFuY2UpOworCWZpZWxkc1tmaWVsZENvdW50KytdID0gZWxlbWVudDsKKworCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KKwlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorCS8qIGlmIGZpZWxkIG5vdCBmaW5pc2hlZCwgdGhlbiBmaWVsZCBiZWNvbWVzIGN1cnJlbnQgKi8KKwlpZiAoZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSByZXR1cm4gZWxlbWVudDsKKwlyZXR1cm4gdGhpczsKK30KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKworCS8qIGRvIG5vdCBjb25zaWRlciBhIHR5cGUgc3RhcnRpbmcgcGFzc2VkIHRoZSB0eXBlIGVuZCAoaWYgc2V0KQorCQlpdCBtdXN0IGJlIGJlbG9uZ2luZyB0byBhbiBlbmNsb3NpbmcgdHlwZSAqLworCWlmICh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgIT0gMCAKKwkJJiYgbWVtYmVyVHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPiB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpeworCQlyZXR1cm4gdGhpcy5wYXJlbnQuYWRkKG1lbWJlclR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KKwkKKwlpZiAobWVtYmVyVHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24peworCQlpZiAodGhpcy5tZXRob2RDb3VudCA+IDApIHsKKwkJCS8vIGFkZCBpdCB0byB0aGUgbGFzdCBtZXRob2QgYm9keQorCQkJUmVjb3ZlcmVkTWV0aG9kIGxhc3RNZXRob2QgPSB0aGlzLm1ldGhvZHNbdGhpcy5tZXRob2RDb3VudC0xXTsKKwkJCWxhc3RNZXRob2QubWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7IC8vIHJlb3BlbiBtZXRob2QKKwkJCWxhc3RNZXRob2QubWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAwOyAvLyByZW9wZW4gbWV0aG9kCisJCQlsYXN0TWV0aG9kLmJyYWNrZXRCYWxhbmNlKys7IC8vIGV4cGVjdCBvbmUgY2xvc2luZyBicmFjZQorCQkJcmV0dXJuIGxhc3RNZXRob2QuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9IGVsc2UgeworCQkJLy8gaWdub3JlCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0JCisJCQorCWlmIChtZW1iZXJUeXBlcyA9PSBudWxsKSB7CisJCW1lbWJlclR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbNV07CisJCW1lbWJlclR5cGVDb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKG1lbWJlclR5cGVDb3VudCA9PSBtZW1iZXJUeXBlcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJbWVtYmVyVHlwZXMsIAorCQkJCTAsIAorCQkJCShtZW1iZXJUeXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiBtZW1iZXJUeXBlQ291bnRdKSwgCisJCQkJMCwgCisJCQkJbWVtYmVyVHlwZUNvdW50KTsgCisJCX0KKwl9CisJUmVjb3ZlcmVkVHlwZSBlbGVtZW50ID0gbmV3IFJlY292ZXJlZFR5cGUobWVtYmVyVHlwZURlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZSk7CisJbWVtYmVyVHlwZXNbbWVtYmVyVHlwZUNvdW50KytdID0gZWxlbWVudDsKKworCS8qIGNvbnNpZGVyIHRoYXQgaWYgdGhlIG9wZW5pbmcgYnJhY2Ugd2FzIG5vdCBmb3VuZCwgaXQgaXMgdGhlcmUgKi8KKwlpZiAoIWZvdW5kT3BlbmluZ0JyYWNlKXsKKwkJZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQl0aGlzLmJyYWNrZXRCYWxhbmNlKys7CisJfQorCS8qIGlmIG1lbWJlciB0eXBlIG5vdCBmaW5pc2hlZCwgdGhlbiBtZW1iZXIgdHlwZSBiZWNvbWVzIGN1cnJlbnQgKi8KKwlpZiAobWVtYmVyVHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHJldHVybiBlbGVtZW50OworCXJldHVybiB0aGlzOworfQorLyoKKyAqIEFuc3dlciB0aGUgYm9keSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgaW50IGJvZHlFbmQoKXsKKwlpZiAoYm9keUVuZCA9PSAwKSByZXR1cm4gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kOworCXJldHVybiBib2R5RW5kOworfQorcHVibGljIGJvb2xlYW4gYm9keVN0YXJ0c0F0SGVhZGVyRW5kKCl7CisJaWYgKHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXMgPT0gbnVsbCl7CisJCWlmICh0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcyA9PSBudWxsKXsKKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0ID09IHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQrMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0ID09IHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzLnNvdXJjZUVuZCsxOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQgCisJCQkJPT0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlc1t0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzLmxlbmd0aC0xXS5zb3VyY2VFbmQrMTsKKwl9Cit9CisvKgorICogQW5zd2VyIHRoZSBlbmNsb3NpbmcgdHlwZSBub2RlLCBvciBudWxsIGlmIG5vbmUKKyAqLworcHVibGljIFJlY292ZXJlZFR5cGUgZW5jbG9zaW5nVHlwZSgpeworCVJlY292ZXJlZEVsZW1lbnQgY3VycmVudCA9IHBhcmVudDsKKwl3aGlsZSAoY3VycmVudCAhPSBudWxsKXsKKwkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKXsKKwkJCXJldHVybiAoUmVjb3ZlcmVkVHlwZSkgY3VycmVudDsKKwkJfQorCQljdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisJfQorCXJldHVybiBudWxsOworfQorcHVibGljIGNoYXJbXSBuYW1lKCl7CisJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5uYW1lOworfQorLyogCisgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQorICovCitwdWJsaWMgQXN0Tm9kZSBwYXJzZVRyZWUoKXsKKwlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOworfQorLyoKKyAqIEFuc3dlciB0aGUgdmVyeSBzb3VyY2UgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIGludCBzb3VyY2VFbmQoKXsKKwlyZXR1cm4gdGhpcy50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIHR5cGU6XG4iKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgeworCQlyZXN1bHQuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJfQorCXJlc3VsdC5hcHBlbmQodHlwZURlY2xhcmF0aW9uLnRvU3RyaW5nKHRhYiArIDEpKTsKKwlpZiAodGhpcy5tZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJUeXBlQ291bnQ7IGkrKykgeworCQkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJcmVzdWx0LmFwcGVuZCh0aGlzLm1lbWJlclR5cGVzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlpZiAodGhpcy5maWVsZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZmllbGRDb3VudDsgaSsrKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXN1bHQuYXBwZW5kKHRoaXMuZmllbGRzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlpZiAodGhpcy5tZXRob2RzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm1ldGhvZENvdW50OyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQodGhpcy5tZXRob2RzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Cit9CisvKgorICogVXBkYXRlIHRoZSBib2R5U3RhcnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgdm9pZCB1cGRhdGVCb2R5U3RhcnQoaW50IGJvZHlTdGFydCl7CisJdGhpcy5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJdGhpcy50eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0ID0gYm9keVN0YXJ0OworfQorcHVibGljIFN0YXRlbWVudCB1cGRhdGVkU3RhdGVtZW50KCl7CisKKwkvLyBpZ25vcmUgY2xvc2VkIGFub255bW91cyB0eXBlCisJaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uCisJCSYmICF0aGlzLnByZXNlcnZlQ29udGVudCl7CisJCXJldHVybiBudWxsOworCX0KKwkJCisJVHlwZURlY2xhcmF0aW9uIHVwZGF0ZWRUeXBlID0gdGhpcy51cGRhdGVkVHlwZURlY2xhcmF0aW9uKCk7CisJaWYgKHVwZGF0ZWRUeXBlIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24peworCQkvKiBpbiBwcmVzZW5jZSBvZiBhbiBhbm9ueW1vdXMgdHlwZSwgd2Ugd2FudCB0aGUgZnVsbCBhbGxvY2F0aW9uIGV4cHJlc3Npb24gKi8KKwkJcmV0dXJuICgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pdXBkYXRlZFR5cGUpLmFsbG9jYXRpb247CisJfQorCXJldHVybiB1cGRhdGVkVHlwZTsKK30KK3B1YmxpYyBUeXBlRGVjbGFyYXRpb24gdXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpeworCisJLyogdXBkYXRlIG1lbWJlciB0eXBlcyAqLworCWlmIChtZW1iZXJUeXBlQ291bnQgPiAwKXsKKwkJaW50IGV4aXN0aW5nQ291bnQgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMgPT0gbnVsbCA/IDAgOiB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOworCQlNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJUeXBlRGVjbGFyYXRpb25zID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgbWVtYmVyVHlwZUNvdW50XTsKKwkJaWYgKGV4aXN0aW5nQ291bnQgPiAwKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkodHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzLCAwLCBtZW1iZXJUeXBlRGVjbGFyYXRpb25zLCAwLCBleGlzdGluZ0NvdW50KTsKKwkJfQorCQkvLyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBsYXN0IHR5cGUKKwkJaWYgKG1lbWJlclR5cGVzW21lbWJlclR5cGVDb3VudCAtIDFdLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCWludCBib2R5RW5kID0gYm9keUVuZCgpOworCQkJbWVtYmVyVHlwZXNbbWVtYmVyVHlwZUNvdW50IC0gMV0udHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZDsKKwkJCW1lbWJlclR5cGVzW21lbWJlclR5cGVDb3VudCAtIDFdLnR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gIGJvZHlFbmQ7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlQ291bnQ7IGkrKyl7CisJCQltZW1iZXJUeXBlRGVjbGFyYXRpb25zW2V4aXN0aW5nQ291bnQgKyBpXSA9IChNZW1iZXJUeXBlRGVjbGFyYXRpb24pbWVtYmVyVHlwZXNbaV0udXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpOworCQl9CisJCXR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVEZWNsYXJhdGlvbnM7CisJfQorCS8qIHVwZGF0ZSBmaWVsZHMgKi8KKwlpZiAoZmllbGRDb3VudCA+IDApeworCQlpbnQgZXhpc3RpbmdDb3VudCA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPT0gbnVsbCA/IDAgOiB0eXBlRGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aDsKKwkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gbmV3IEZpZWxkRGVjbGFyYXRpb25bZXhpc3RpbmdDb3VudCArIGZpZWxkQ291bnRdOworCQlpZiAoZXhpc3RpbmdDb3VudCA+IDApeworCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlRGVjbGFyYXRpb24uZmllbGRzLCAwLCBmaWVsZERlY2xhcmF0aW9ucywgMCwgZXhpc3RpbmdDb3VudCk7CisJCX0KKwkJLy8gbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgbGFzdCBmaWVsZAorCQlpZiAoZmllbGRzW2ZpZWxkQ291bnQgLSAxXS5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApeworCQkJaW50IHRlbXAgPSBib2R5RW5kKCk7CisJCQlmaWVsZHNbZmllbGRDb3VudCAtIDFdLmZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0ZW1wOworCQkJZmllbGRzW2ZpZWxkQ291bnQgLSAxXS5maWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gdGVtcDsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKyl7CisJCQlmaWVsZERlY2xhcmF0aW9uc1tleGlzdGluZ0NvdW50ICsgaV0gPSBmaWVsZHNbaV0udXBkYXRlZEZpZWxkRGVjbGFyYXRpb24oKTsKKwkJfQorCQl0eXBlRGVjbGFyYXRpb24uZmllbGRzID0gZmllbGREZWNsYXJhdGlvbnM7CisJfQorCS8qIHVwZGF0ZSBtZXRob2RzICovCisJaW50IGV4aXN0aW5nQ291bnQgPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kcyA9PSBudWxsID8gMCA6IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aDsKKwlib29sZWFuIGhhc0NvbnN0cnVjdG9yID0gZmFsc2UsIGhhc1JlY292ZXJlZENvbnN0cnVjdG9yID0gZmFsc2U7CisJaW50IGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ID0gLTE7CisJaWYgKG1ldGhvZENvdW50ID4gMCl7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltleGlzdGluZ0NvdW50ICsgbWV0aG9kQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nQ291bnQ7IGkrKyl7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG0gPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXTsKKwkJCWlmIChtLmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ID0gaTsKKwkJCW1ldGhvZERlY2xhcmF0aW9uc1tpXSA9IG07CisJCX0KKwkJLy8gbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgbGFzdCBtZXRob2QKKwkJaWYgKG1ldGhvZHNbbWV0aG9kQ291bnQgLSAxXS5tZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKXsKKwkJCWludCBib2R5RW5kID0gYm9keUVuZCgpOworCQkJbWV0aG9kc1ttZXRob2RDb3VudCAtIDFdLm1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gYm9keUVuZDsKKwkJCW1ldGhvZHNbbWV0aG9kQ291bnQgLSAxXS5tZXRob2REZWNsYXJhdGlvbi5ib2R5RW5kID0gYm9keUVuZDsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZENvdW50OyBpKyspeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB1cGRhdGVkTWV0aG9kID0gbWV0aG9kc1tpXS51cGRhdGVkTWV0aG9kRGVjbGFyYXRpb24oKTsJCQkKKwkJCWlmICh1cGRhdGVkTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgaGFzUmVjb3ZlcmVkQ29uc3RydWN0b3IgPSB0cnVlOworCQkJbWV0aG9kRGVjbGFyYXRpb25zW2V4aXN0aW5nQ291bnQgKyBpXSA9IHVwZGF0ZWRNZXRob2Q7CQkJCisJCX0KKwkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPSBtZXRob2REZWNsYXJhdGlvbnM7CisJCWhhc0NvbnN0cnVjdG9yID0gdHlwZURlY2xhcmF0aW9uLmNoZWNrQ29uc3RydWN0b3JzKHRoaXMucGFyc2VyKCkpOworCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb3VudDsgaSsrKXsKKwkJCWlmICh0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXS5pc0NvbnN0cnVjdG9yKCkpIGhhc0NvbnN0cnVjdG9yID0gdHJ1ZTsKKwkJfQkJCisJfQorCS8qIGFkZCBjbGluaXQgPyAqLworCWlmICh0eXBlRGVjbGFyYXRpb24ubmVlZENsYXNzSW5pdE1ldGhvZCgpKXsKKwkJYm9vbGVhbiBhbHJlYWR5SGFzQ2xpbml0ID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDb3VudDsgaSsrKXsKKwkJCWlmICh0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1tpXS5pc0NsaW5pdCgpKXsKKwkJCQlhbHJlYWR5SGFzQ2xpbml0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWFscmVhZHlIYXNDbGluaXQpIHR5cGVEZWNsYXJhdGlvbi5hZGRDbGluaXQoKTsKKwl9CisJLyogYWRkIGRlZmF1bHQgY29uc3RydWN0b3IgPyAqLworCWlmIChkZWZhdWx0Q29uc3RydWN0b3JJbmRleCA+PSAwICYmIGhhc1JlY292ZXJlZENvbnN0cnVjdG9yKXsKKwkJLyogc2hvdWxkIGRpc2NhcmQgcHJldmlvdXMgZGVmYXVsdCBjb25zdHJ1dG9yICovCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvblt0eXBlRGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGggLSAxXTsKKwkJaWYgKGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ICE9IDApeworCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlRGVjbGFyYXRpb24ubWV0aG9kcywgMCwgbWV0aG9kRGVjbGFyYXRpb25zLCAwLCBkZWZhdWx0Q29uc3RydWN0b3JJbmRleCk7CisJCX0KKwkJaWYgKGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4ICE9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aC0xKXsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMsIAorCQkJCWRlZmF1bHRDb25zdHJ1Y3RvckluZGV4KzEsIAorCQkJCW1ldGhvZERlY2xhcmF0aW9ucywgCisJCQkJZGVmYXVsdENvbnN0cnVjdG9ySW5kZXgsIAorCQkJCXR5cGVEZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aCAtIGRlZmF1bHRDb25zdHJ1Y3RvckluZGV4IC0gMSk7CisJCX0KKwkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHMgPSBtZXRob2REZWNsYXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJaWYgKCFoYXNDb25zdHJ1Y3Rvcikgey8vIGlmIHdhcyBhbHJlYWR5IHJlZHVjZWQsIHRoZW4gY29uc3RydWN0b3IKKwkJCWJvb2xlYW4gaW5zaWRlRmllbGRJbml0aWFsaXplciA9IGZhbHNlOworCQkJUmVjb3ZlcmVkRWxlbWVudCBwYXJlbnQgPSB0aGlzLnBhcmVudDsgCisJCQl3aGlsZSAocGFyZW50ICE9IG51bGwpeworCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZCl7CisJCQkJCQlpbnNpZGVGaWVsZEluaXRpYWxpemVyID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOyAKKwkJCQl9CisJCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudDsKKwkJCX0KKwkJCXR5cGVEZWNsYXJhdGlvbi5jcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcighcGFyc2VyKCkuZGlldCB8fCBpbnNpZGVGaWVsZEluaXRpYWxpemVyLCB0cnVlKTsKKwkJfSAKKwl9CisJLyogbWlnaHQgbmVlZCB0byBjYXN0IGl0c2VsZiBpbnRvIGEgTWVtYmVyVHlwZURlY2xhcmF0aW9uIG9yIGEgTG9jYWxUeXBlRGVjbGFyYXRpb24gKi8KKwlUeXBlRGVjbGFyYXRpb24gbmV3VHlwZURlY2xhcmF0aW9uID0gbnVsbDsKKwlpZiAoKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpKXsKKwkJbmV3VHlwZURlY2xhcmF0aW9uID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQpOworCX0gZWxzZSB7CisJCWlmICgodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSAmJiAocGFyZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kKSl7CisJCQluZXdUeXBlRGVjbGFyYXRpb24gPSBuZXcgTG9jYWxUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCX0KKwkvKiBjb3B5IHNsb3RzIGludG8gbmV3IHR5cGUgKi8KKwlpZiAobmV3VHlwZURlY2xhcmF0aW9uICE9IG51bGwpeworCQluZXdUeXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKKwkJbmV3VHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0ID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyc1NvdXJjZVN0YXJ0OworCQluZXdUeXBlRGVjbGFyYXRpb24ubmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5uYW1lOworCQluZXdUeXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzOworCQluZXdUeXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKKwkJbmV3VHlwZURlY2xhcmF0aW9uLmZpZWxkcyA9IHR5cGVEZWNsYXJhdGlvbi5maWVsZHM7CisJCW5ld1R5cGVEZWNsYXJhdGlvbi5tZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CisJCW5ld1R5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9IHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlczsKKwkJbmV3VHlwZURlY2xhcmF0aW9uLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHlwZURlY2xhcmF0aW9uLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uOworCQluZXdUeXBlRGVjbGFyYXRpb24ubWF4RmllbGRDb3VudCA9IHR5cGVEZWNsYXJhdGlvbi5tYXhGaWVsZENvdW50OworCQluZXdUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0OworCQluZXdUeXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCW5ld1R5cGVEZWNsYXJhdGlvbi5ib2R5RW5kID0gdHlwZURlY2xhcmF0aW9uLmJvZHlFbmQ7CisJCW5ld1R5cGVEZWNsYXJhdGlvbi5ib2R5U3RhcnQgPSB0eXBlRGVjbGFyYXRpb24uYm9keVN0YXJ0OworCQl0eXBlRGVjbGFyYXRpb24gPSBuZXdUeXBlRGVjbGFyYXRpb247CisJfQorCXJldHVybiB0eXBlRGVjbGFyYXRpb247Cit9CisvKgorICogVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUgZnJvbSBwYXJzZXIgc3RhdGUgd2hpY2gKKyAqIGlzIGFib3V0IHRvIGRpc2FwcGVhciBiZWNhdXNlIG9mIHJlc3RhcnRpbmcgcmVjb3ZlcnkKKyAqLworcHVibGljIHZvaWQgdXBkYXRlRnJvbVBhcnNlclN0YXRlKCl7CisKKwlpZih0aGlzLmJvZHlTdGFydHNBdEhlYWRlckVuZCgpKXsKKwkJUGFyc2VyIHBhcnNlciA9IHRoaXMucGFyc2VyKCk7CisJCS8qIG1pZ2h0IHdhbnQgdG8gcmVjb3ZlciBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzICovCisJCS8vIHByb3RlY3Rpb24gZm9yIGJ1Z3MgMTUxNDIKKwkJaWYgKHBhcnNlci5saXN0TGVuZ3RoID4gMCAmJiBwYXJzZXIuYXN0TGVuZ3RoUHRyID4gMCl7IC8vIGF3YWl0aW5nIGludGVyZmFjZSB0eXBlIHJlZmVyZW5jZXMKKwkJCWludCBsZW5ndGggPSBwYXJzZXIuYXN0TGVuZ3RoU3RhY2tbcGFyc2VyLmFzdExlbmd0aFB0cl07CisJCQlpbnQgYXN0UHRyID0gcGFyc2VyLmFzdFB0ciAtIGxlbmd0aDsKKwkJCWJvb2xlYW4gY2FuQ29uc3VtZSA9IGFzdFB0ciA+PSAwOworCQkJaWYoY2FuQ29uc3VtZSkgeworCQkJCWlmKCghKHBhcnNlci5hc3RTdGFja1thc3RQdHJdIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkpIHsKKwkJCQkJY2FuQ29uc3VtZSA9IGZhbHNlOworCQkJCX0KKwkJCQlmb3IgKGludCBpID0gMSwgbWF4ID0gbGVuZ3RoICsgMTsgaSA8IG1heDsgaSsrKSB7CisJCQkJCWlmKCEocGFyc2VyLmFzdFN0YWNrW2FzdFB0ciArIGkgXSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpKSB7CisJCQkJCQljYW5Db25zdW1lID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZihjYW5Db25zdW1lKSB7CisJCQkJcGFyc2VyLmNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKTsgCisJCQkJLy8gd2lsbCByZXNldCB0eXBlTGlzdExlbmd0aCB0byB6ZXJvCisJCQkJLy8gdGh1cyB0aGlzIGNoZWNrIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgb24gZmlyc3QgZXJyb3JDaGVjayBhZnRlciBjbGFzcyBYIGltcGxlbWVudHMgWSxaLAorCQkJfQorCQl9CisJfQorfQorLyoKKyAqIEEgY2xvc2luZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGhhdmUgY2xvc2VkIHRoZSBjdXJyZW50IGVsZW1lbnQsCisgKiBpbiB3aGljaCBjYXNlIGJvdGggdGhlIGN1cnJlbnRFbGVtZW50IGlzIGV4aXRlZAorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCB1cGRhdGVPbkNsb3NpbmdCcmFjZShpbnQgYnJhY2VTdGFydCwgaW50IGJyYWNlRW5kKXsKKwlpZiAoKC0tYnJhY2tldEJhbGFuY2UgPD0gMCkgJiYgKHBhcmVudCAhPSBudWxsKSl7CisJCXRoaXMudXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoYnJhY2VFbmQpOworCQl0aGlzLmJvZHlFbmQgPSBicmFjZVN0YXJ0IC0gMTsKKwkJcmV0dXJuIHBhcmVudDsKKwl9CisJcmV0dXJuIHRoaXM7Cit9CisvKgorICogQW4gb3BlbmluZyBicmFjZSBnb3QgY29uc3VtZWQsIG1pZ2h0IGJlIHRoZSBleHBlY3RlZCBvcGVuaW5nIG9uZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LAorICogaW4gd2hpY2ggY2FzZSB0aGUgYm9keVN0YXJ0IGlzIHVwZGF0ZWQuCisgKi8KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IHVwZGF0ZU9uT3BlbmluZ0JyYWNlKGludCBicmFjZUVuZCl7CisJLyogaW4gY2FzZSB0aGUgb3BlbmluZyBicmFjZSBpcyBub3QgY2xvc2UgZW5vdWdoIHRvIHRoZSBzaWduYXR1cmUsIGlnbm9yZSBpdCAqLworCWlmIChicmFja2V0QmFsYW5jZSA9PSAwKXsKKwkJLyoKKwkJCWlmIChwYXJzZXIuc2Nhbm5lci5zZWFyY2hMaW5lTnVtYmVyKHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQpIAorCQkJCSE9IHBhcnNlci5zY2FubmVyLnNlYXJjaExpbmVOdW1iZXIoYnJhY2VFbmQpKXsKKwkJICovCisJCVBhcnNlciBwYXJzZXIgPSB0aGlzLnBhcnNlcigpOworCQlzd2l0Y2gocGFyc2VyLmxhc3RJZ25vcmVkVG9rZW4peworCQkJY2FzZSAtMSA6CisJCQljYXNlIFRva2VuTmFtZWV4dGVuZHMgOgorCQkJY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoKKwkJCQlpZiAocGFyc2VyLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPT0gMCkgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRoaXMuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOwkJCQkKKwkJCQlicmFja2V0QmFsYW5jZSA9IDE7IC8vIHByZXRlbmQgdGhlIGJyYWNlIHdhcyBhbHJlYWR5IHRoZXJlCisJCX0KKwl9CQorCS8vIG1pZ2h0IGJlIGFuIGluaXRpYWxpemVyCisJaWYgKHRoaXMuYnJhY2tldEJhbGFuY2UgPT0gMSl7CisJCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCQlQYXJzZXIgcGFyc2VyID0gdGhpcy5wYXJzZXIoKTsKKwkJYmxvY2suc291cmNlU3RhcnQgPSBwYXJzZXIuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQlJbml0aWFsaXplciBpbml0OworCQlpZiAocGFyc2VyLnJlY292ZXJlZFN0YXRpY0luaXRpYWxpemVyU3RhcnQgPT0gMCl7CisJCQlpbml0ID0gbmV3IEluaXRpYWxpemVyKGJsb2NrLCBBY2NEZWZhdWx0KTsKKwkJfSBlbHNlIHsKKwkJCWluaXQgPSBuZXcgSW5pdGlhbGl6ZXIoYmxvY2ssIEFjY1N0YXRpYyk7CisJCQlpbml0LmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBwYXJzZXIucmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydDsKKwkJfQorCQlyZXR1cm4gdGhpcy5hZGQoaW5pdCwgMSk7CisJfQorCXJldHVybiBzdXBlci51cGRhdGVPbk9wZW5pbmdCcmFjZShicmFjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB1cGRhdGVQYXJzZVRyZWUoKXsKKwl0aGlzLnVwZGF0ZWRUeXBlRGVjbGFyYXRpb24oKTsKK30KKy8qCisgKiBVcGRhdGUgdGhlIGRlY2xhcmF0aW9uU291cmNlRW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBhcnNlIG5vZGUKKyAqLworcHVibGljIHZvaWQgdXBkYXRlU291cmNlRW5kSWZOZWNlc3NhcnkoaW50IHNvdXJjZUVuZCl7CisJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApeworCQl0aGlzLmJvZHlFbmQgPSAwOworCQl0aGlzLnR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKKwkJdGhpcy50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IHNvdXJjZUVuZDsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZWJjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFVuaXQuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworLyoqCisgKiBJbnRlcm5hbCBmaWVsZCBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgcmVjb3ZlcnkgCisgKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKKworcHVibGljIGNsYXNzIFJlY292ZXJlZFVuaXQgZXh0ZW5kcyBSZWNvdmVyZWRFbGVtZW50IHsKKworCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0RGVjbGFyYXRpb247CisJCisJcHVibGljIFJlY292ZXJlZEltcG9ydFtdIGltcG9ydHM7CisJcHVibGljIGludCBpbXBvcnRDb3VudDsKKwlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIHR5cGVzOworCXB1YmxpYyBpbnQgdHlwZUNvdW50OworcHVibGljIFJlY292ZXJlZFVuaXQoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdERlY2xhcmF0aW9uLCBpbnQgYnJhY2tldEJhbGFuY2UsIFBhcnNlciBwYXJzZXIpeworCXN1cGVyKG51bGwsIGJyYWNrZXRCYWxhbmNlLCBwYXJzZXIpOworCXRoaXMudW5pdERlY2xhcmF0aW9uID0gdW5pdERlY2xhcmF0aW9uOworfQorLyoKKyAqCVJlY29yZCBhIG1ldGhvZCBkZWNsYXJhdGlvbjogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGxhc3QgdHlwZQorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBhdHRhY2ggaXQgdG8gbGFzdCB0eXBlIC0gaWYgYW55ICovCisJaWYgKHR5cGVDb3VudCA+IDApeworCQlSZWNvdmVyZWRUeXBlIHR5cGUgPSB0aGlzLnR5cGVzW3R5cGVDb3VudCAtMV07CisJCXR5cGUuYm9keUVuZCA9IDA7IC8vIHJlc2V0IHBvc2l0aW9uCisJCXR5cGUudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gMDsgLy8gcmVzZXQgcG9zaXRpb24KKwkJdHlwZS50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7CisJCXJldHVybiB0eXBlLmFkZChtZXRob2REZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCX0KKwlyZXR1cm4gdGhpczsgLy8gaWdub3JlCit9CisvKgorICoJUmVjb3JkIGEgZmllbGQgZGVjbGFyYXRpb246IHNob3VsZCBiZSBhdHRhY2hlZCB0byBsYXN0IHR5cGUKKyAqLworcHVibGljIFJlY292ZXJlZEVsZW1lbnQgYWRkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwkvKiBhdHRhY2ggaXQgdG8gbGFzdCB0eXBlIC0gaWYgYW55ICovCisJaWYgKHR5cGVDb3VudCA+IDApeworCQlSZWNvdmVyZWRUeXBlIHR5cGUgPSB0aGlzLnR5cGVzW3R5cGVDb3VudCAtMV07CisJCXR5cGUuYm9keUVuZCA9IDA7IC8vIHJlc2V0IHBvc2l0aW9uCisJCXR5cGUudHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gMDsgLy8gcmVzZXQgcG9zaXRpb24KKwkJdHlwZS50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7CisJCXJldHVybiB0eXBlLmFkZChmaWVsZERlY2xhcmF0aW9uLCBicmFja2V0QmFsYW5jZSk7CisJfQorCXJldHVybiB0aGlzOyAvLyBpZ25vcmUKK30KK3B1YmxpYyBSZWNvdmVyZWRFbGVtZW50IGFkZChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlLCBpbnQgYnJhY2tldEJhbGFuY2UpIHsKKwlpZiAoaW1wb3J0cyA9PSBudWxsKSB7CisJCWltcG9ydHMgPSBuZXcgUmVjb3ZlcmVkSW1wb3J0WzVdOworCQlpbXBvcnRDb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGltcG9ydENvdW50ID09IGltcG9ydHMubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWltcG9ydHMsIAorCQkJCTAsIAorCQkJCShpbXBvcnRzID0gbmV3IFJlY292ZXJlZEltcG9ydFsyICogaW1wb3J0Q291bnRdKSwgCisJCQkJMCwgCisJCQkJaW1wb3J0Q291bnQpOyAKKwkJfQorCX0KKwlSZWNvdmVyZWRJbXBvcnQgZWxlbWVudCA9IG5ldyBSZWNvdmVyZWRJbXBvcnQoaW1wb3J0UmVmZXJlbmNlLCB0aGlzLCBicmFja2V0QmFsYW5jZSk7CisJaW1wb3J0c1tpbXBvcnRDb3VudCsrXSA9IGVsZW1lbnQ7CisKKwkvKiBpZiBpbXBvcnQgbm90IGZpbmlzaGVkLCB0aGVuIGltcG9ydCBiZWNvbWVzIGN1cnJlbnQgKi8KKwlpZiAoaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApIHJldHVybiBlbGVtZW50OworCXJldHVybiB0aGlzOwkJCit9CitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisJCisJaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKXsKKwkJaWYgKHRoaXMudHlwZUNvdW50ID4gMCkgeworCQkJLy8gYWRkIGl0IHRvIHRoZSBsYXN0IHR5cGUKKwkJCVJlY292ZXJlZFR5cGUgbGFzdFR5cGUgPSB0aGlzLnR5cGVzW3RoaXMudHlwZUNvdW50LTFdOworCQkJbGFzdFR5cGUuYm9keUVuZCA9IDA7IC8vIHJlb3BlbiB0eXBlCisJCQlsYXN0VHlwZS50eXBlRGVjbGFyYXRpb24uYm9keUVuZCA9IDA7IC8vIHJlb3BlbiB0eXBlCisJCQlsYXN0VHlwZS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSAwOyAvLyByZW9wZW4gdHlwZQorCQkJbGFzdFR5cGUuYnJhY2tldEJhbGFuY2UrKzsgLy8gZXhwZWN0IG9uZSBjbG9zaW5nIGJyYWNlCisJCQlyZXR1cm4gbGFzdFR5cGUuYWRkKHR5cGVEZWNsYXJhdGlvbiwgYnJhY2tldEJhbGFuY2UpOworCQl9CisJfQorCWlmICh0eXBlcyA9PSBudWxsKSB7CisJCXR5cGVzID0gbmV3IFJlY292ZXJlZFR5cGVbNV07CisJCXR5cGVDb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHR5cGVDb3VudCA9PSB0eXBlcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdHlwZXMsIAorCQkJCTAsIAorCQkJCSh0eXBlcyA9IG5ldyBSZWNvdmVyZWRUeXBlWzIgKiB0eXBlQ291bnRdKSwgCisJCQkJMCwgCisJCQkJdHlwZUNvdW50KTsgCisJCX0KKwl9CisJUmVjb3ZlcmVkVHlwZSBlbGVtZW50ID0gbmV3IFJlY292ZXJlZFR5cGUodHlwZURlY2xhcmF0aW9uLCB0aGlzLCBicmFja2V0QmFsYW5jZSk7CisJdHlwZXNbdHlwZUNvdW50KytdID0gZWxlbWVudDsKKworCS8qIGlmIHR5cGUgbm90IGZpbmlzaGVkLCB0aGVuIHR5cGUgYmVjb21lcyBjdXJyZW50ICovCisJaWYgKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSByZXR1cm4gZWxlbWVudDsKKwlyZXR1cm4gdGhpczsJCit9CisvKiAKKyAqIEFuc3dlciB0aGUgYXNzb2NpYXRlZCBwYXJzZWQgc3RydWN0dXJlCisgKi8KK3B1YmxpYyBBc3ROb2RlIHBhcnNlVHJlZSgpeworCXJldHVybiB1bml0RGVjbGFyYXRpb247Cit9CisvKgorICogQW5zd2VyIHRoZSB2ZXJ5IHNvdXJjZSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgaW50IHNvdXJjZUVuZCgpeworCXJldHVybiB0aGlzLnVuaXREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih0YWJTdHJpbmcodGFiKSk7CisJcmVzdWx0LmFwcGVuZCgiUmVjb3ZlcmVkIHVuaXQ6IFtcbiIpOyAvLyROT04tTkxTLTEkCisJcmVzdWx0LmFwcGVuZCh1bml0RGVjbGFyYXRpb24udG9TdHJpbmcodGFiICsgMSkpOworCXJlc3VsdC5hcHBlbmQodGFiU3RyaW5nKHRhYiArIDEpKTsKKwlyZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAodGhpcy5pbXBvcnRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmltcG9ydENvdW50OyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdC5hcHBlbmQodGhpcy5pbXBvcnRzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlpZiAodGhpcy50eXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50eXBlQ291bnQ7IGkrKykgeworCQkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJcmVzdWx0LmFwcGVuZCh0aGlzLnR5cGVzW2ldLnRvU3RyaW5nKHRhYiArIDEpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Cit9CitwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdXBkYXRlZENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKCl7CisKKwkvKiB1cGRhdGUgaW1wb3J0cyAqLworCWlmIChpbXBvcnRDb3VudCA+IDApeworCQlJbXBvcnRSZWZlcmVuY2VbXSBpbXBvcnRSZWZlbmNlcyA9IG5ldyBJbXBvcnRSZWZlcmVuY2VbaW1wb3J0Q291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydENvdW50OyBpKyspeworCQkJaW1wb3J0UmVmZW5jZXNbaV0gPSBpbXBvcnRzW2ldLnVwZGF0ZWRJbXBvcnRSZWZlcmVuY2UoKTsKKwkJfQorCQl1bml0RGVjbGFyYXRpb24uaW1wb3J0cyA9IGltcG9ydFJlZmVuY2VzOworCX0KKwkvKiB1cGRhdGUgdHlwZXMgKi8KKwlpZiAodHlwZUNvdW50ID4gMCl7CisJCWludCBleGlzdGluZ0NvdW50ID0gdW5pdERlY2xhcmF0aW9uLnR5cGVzID09IG51bGwgPyAwIDogdW5pdERlY2xhcmF0aW9uLnR5cGVzLmxlbmd0aDsKKwkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bZXhpc3RpbmdDb3VudCArIHR5cGVDb3VudF07CisJCWlmIChleGlzdGluZ0NvdW50ID4gMCl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHVuaXREZWNsYXJhdGlvbi50eXBlcywgMCwgdHlwZURlY2xhcmF0aW9ucywgMCwgZXhpc3RpbmdDb3VudCk7CisJCX0KKwkJLy8gbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBkZWNsYXJhdGlvblNvdXJjZUVuZCBvZiB0aGUgbGFzdCB0eXBlCisJCWlmICh0eXBlc1t0eXBlQ291bnQgLSAxXS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCl7CisJCQl0eXBlc1t0eXBlQ291bnQgLSAxXS50eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB1bml0RGVjbGFyYXRpb24uc291cmNlRW5kOworCQkJdHlwZXNbdHlwZUNvdW50IC0gMV0udHlwZURlY2xhcmF0aW9uLmJvZHlFbmQgPSB1bml0RGVjbGFyYXRpb24uc291cmNlRW5kOworCQl9CisJCWludCBhY3R1YWxDb3VudCA9IGV4aXN0aW5nQ291bnQ7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUNvdW50OyBpKyspeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZXNbaV0udXBkYXRlZFR5cGVEZWNsYXJhdGlvbigpOworCQkJLy8gZmlsdGVyIG91dCBsb2NhbCB0eXBlcyAoMTI0NTQpCisJCQlpZiAoISh0eXBlRGVjbCBpbnN0YW5jZW9mIExvY2FsVHlwZURlY2xhcmF0aW9uKSl7CisJCQkJdHlwZURlY2xhcmF0aW9uc1thY3R1YWxDb3VudCsrXSA9IHR5cGVEZWNsOworCQkJfQorCQl9CisJCWlmIChhY3R1YWxDb3VudCAhPSB0eXBlQ291bnQpeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0eXBlRGVjbGFyYXRpb25zLCAKKwkJCQkwLCAKKwkJCQl0eXBlRGVjbGFyYXRpb25zID0gbmV3IFR5cGVEZWNsYXJhdGlvbltleGlzdGluZ0NvdW50K2FjdHVhbENvdW50XSwgCisJCQkJMCwgCisJCQkJZXhpc3RpbmdDb3VudCthY3R1YWxDb3VudCk7CisJCX0KKwkJdW5pdERlY2xhcmF0aW9uLnR5cGVzID0gdHlwZURlY2xhcmF0aW9uczsKKwl9CisJcmV0dXJuIHVuaXREZWNsYXJhdGlvbjsKK30KK3B1YmxpYyB2b2lkIHVwZGF0ZVBhcnNlVHJlZSgpeworCXRoaXMudXBkYXRlZENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKCk7Cit9CisvKgorICogVXBkYXRlIHRoZSBzb3VyY2VFbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2Ugbm9kZQorICovCitwdWJsaWMgdm9pZCB1cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShpbnQgc291cmNlRW5kKXsKKwlpZiAodGhpcy51bml0RGVjbGFyYXRpb24uc291cmNlRW5kID09IDApCisJCXRoaXMudW5pdERlY2xhcmF0aW9uLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9TY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNDg4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMzA1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgU2Nhbm5lciBpbXBsZW1lbnRzIElTY2FubmVyLCBJVGVybWluYWxTeW1ib2xzIHsKKworCS8qIEFQSXMgYXJlcworCSAtIGdldE5leHRUb2tlbigpIHdoaWNoIHJldHVybiB0aGUgY3VycmVudCB0eXBlIG9mIHRoZSB0b2tlbgorCSAgICh0aGlzIHZhbHVlIGlzIG5vdCBtZW1vcml6ZWQgYnkgdGhlIHNjYW5uZXIpCisJIC0gZ2V0Q3VycmVudFRva2VuU291cmNlKCkgd2hpY2ggcHJvdmlkZXMgd2l0aCB0aGUgdG9rZW4gIlJFQUwiIHNvdXJjZQorCSAgIChha2EgYWxsIHVuaWNvZGUgaGF2ZSBiZWVuIHRyYW5zZm9ybWVkIGludG8gYSBjb3JyZWN0IGNoYXIpCisJIC0gc291cmNlU3RhcnQgZ2l2ZXMgdGhlIHBvc2l0aW9uIGludG8gdGhlIHN0cmVhbQorCSAtIGN1cnJlbnRQb3NpdGlvbi0xIGdpdmVzIHRoZSBzb3VyY2VFbmQgcG9zaXRpb24gaW50byB0aGUgc3RyZWFtIAorCSovCisKKwkvLyAxLjQgZmVhdHVyZSAKKwlwcml2YXRlIGJvb2xlYW4gYXNzZXJ0TW9kZTsKKwlwdWJsaWMgYm9vbGVhbiB1c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSBmYWxzZTsKKwkvL2ZsYWcgaW5kaWNhdGluZyBpZiBwcm9jZXNzZWQgc291cmNlIGNvbnRhaW5zIG9jY3VycmVuY2VzIG9mIGtleXdvcmQgYXNzZXJ0IAorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzZXJ0S2V5d29yZCA9IGZhbHNlOyAKKwkKKwlwdWJsaWMgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yOworCXB1YmxpYyBjaGFyIGN1cnJlbnRDaGFyYWN0ZXI7CisJcHVibGljIGludCBzdGFydFBvc2l0aW9uOworCXB1YmxpYyBpbnQgY3VycmVudFBvc2l0aW9uOworCXB1YmxpYyBpbnQgaW5pdGlhbFBvc2l0aW9uLCBlb2ZQb3NpdGlvbjsKKwkvLyBhZnRlciB0aGlzIHBvc2l0aW9uIGVvZiBhcmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVhbCB0b2tlbiBmcm9tIHRoZSBzb3VyY2UKKworCXB1YmxpYyBib29sZWFuIHRva2VuaXplQ29tbWVudHM7CisJcHVibGljIGJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlOworCisJLy9zb3VyY2Ugc2hvdWxkIGJlIHZpZXdlZCBhcyBhIHdpbmRvdyAoYWthIGEgcGFydCkKKwkvL29mIGEgZW50aXJlIHZlcnkgbGFyZ2Ugc3RyZWFtCisJcHVibGljIGNoYXIgc291cmNlW107CisKKwkvL3VuaWNvZGUgc3VwcG9ydAorCXB1YmxpYyBjaGFyW10gd2l0aG91dFVuaWNvZGVCdWZmZXI7CisJcHVibGljIGludCB3aXRob3V0VW5pY29kZVB0cjsgLy93aGVuID09IDAgPT0+IG5vIHVuaWNvZGUgaW4gdGhlIGN1cnJlbnQgdG9rZW4KKwlwdWJsaWMgYm9vbGVhbiB1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKworCXB1YmxpYyBib29sZWFuIHNjYW5uaW5nRmxvYXRMaXRlcmFsID0gZmFsc2U7CisKKwkvL3N1cHBvcnQgZm9yIC8qKiBjb21tZW50cworCS8vcHVibGljIGNoYXJbXVtdIGNvbW1lbnRzID0gbmV3IGNoYXJbMTBdW107CisJcHVibGljIGludFtdIGNvbW1lbnRTdG9wcyA9IG5ldyBpbnRbMTBdOworCXB1YmxpYyBpbnRbXSBjb21tZW50U3RhcnRzID0gbmV3IGludFsxMF07CisJcHVibGljIGludCBjb21tZW50UHRyID0gLTE7IC8vIG5vIGNvbW1lbnQgdGVzdCB3aXRoIGNvbW1lbnRQdHIgdmFsdWUgLTEKKworCS8vZGlldCBwYXJzaW5nIHN1cHBvcnQgLSBqdW1wIG92ZXIgc29tZSBtZXRob2QgYm9keSB3aGVuIHJlcXVlc3RlZAorCXB1YmxpYyBib29sZWFuIGRpZXQgPSBmYWxzZTsKKworCS8vc3VwcG9ydCBmb3IgdGhlICBwb29yLWxpbmUtZGVidWdnZXJzIC4uLi4KKwkvL3JlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3IvbGYKKwlwdWJsaWMgaW50W10gbGluZUVuZHMgPSBuZXcgaW50WzI1MF07CisJcHVibGljIGludCBsaW5lUHRyID0gLTE7CisJcHVibGljIGJvb2xlYW4gd2FzQWNyID0gZmFsc2U7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfT0ZfU09VUkNFID0gIkVuZF9PZl9Tb3VyY2UiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0hFWEEgPSAiSW52YWxpZF9IZXhhX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9PQ1RBTCA9ICJJbnZhbGlkX09jdGFsX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQgPSAKKwkJIkludmFsaWRfQ2hhcmFjdGVyX0NvbnN0YW50IjsgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0VTQ0FQRSA9ICJJbnZhbGlkX0VzY2FwZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0lOUFVUID0gIkludmFsaWRfSW5wdXQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSA9ICJJbnZhbGlkX1VuaWNvZGVfRXNjYXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfRkxPQVQgPSAiSW52YWxpZF9GbG9hdF9MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9TT1VSQ0VfU1RSSU5HID0gIk51bGxfU291cmNlX1N0cmluZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlRFUk1JTkFURURfU1RSSU5HID0gIlVudGVybWluYXRlZF9TdHJpbmciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5URVJNSU5BVEVEX0NPTU1FTlQgPSAiVW50ZXJtaW5hdGVkX0NvbW1lbnQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9DSEFSX0lOX1NUUklORyA9ICJJbnZhbGlkX0NoYXJfSW5fU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAorCisJLy8tLS0tLS0tLS0tLS0tLS0tb3B0aW1pemVkIGlkZW50aWZpZXIgbWFuYWdtZW50LS0tLS0tLS0tLS0tLS0tLS0tCisJc3RhdGljIGZpbmFsIGNoYXJbXSBjaGFyQXJyYXlfYSA9IG5ldyBjaGFyW10geydhJ30sIAorCQljaGFyQXJyYXlfYiA9IG5ldyBjaGFyW10geydiJ30sIAorCQljaGFyQXJyYXlfYyA9IG5ldyBjaGFyW10geydjJ30sIAorCQljaGFyQXJyYXlfZCA9IG5ldyBjaGFyW10geydkJ30sIAorCQljaGFyQXJyYXlfZSA9IG5ldyBjaGFyW10geydlJ30sIAorCQljaGFyQXJyYXlfZiA9IG5ldyBjaGFyW10geydmJ30sIAorCQljaGFyQXJyYXlfZyA9IG5ldyBjaGFyW10geydnJ30sIAorCQljaGFyQXJyYXlfaCA9IG5ldyBjaGFyW10geydoJ30sIAorCQljaGFyQXJyYXlfaSA9IG5ldyBjaGFyW10geydpJ30sIAorCQljaGFyQXJyYXlfaiA9IG5ldyBjaGFyW10geydqJ30sIAorCQljaGFyQXJyYXlfayA9IG5ldyBjaGFyW10geydrJ30sIAorCQljaGFyQXJyYXlfbCA9IG5ldyBjaGFyW10geydsJ30sIAorCQljaGFyQXJyYXlfbSA9IG5ldyBjaGFyW10geydtJ30sIAorCQljaGFyQXJyYXlfbiA9IG5ldyBjaGFyW10geyduJ30sIAorCQljaGFyQXJyYXlfbyA9IG5ldyBjaGFyW10geydvJ30sIAorCQljaGFyQXJyYXlfcCA9IG5ldyBjaGFyW10geydwJ30sIAorCQljaGFyQXJyYXlfcSA9IG5ldyBjaGFyW10geydxJ30sIAorCQljaGFyQXJyYXlfciA9IG5ldyBjaGFyW10geydyJ30sIAorCQljaGFyQXJyYXlfcyA9IG5ldyBjaGFyW10geydzJ30sIAorCQljaGFyQXJyYXlfdCA9IG5ldyBjaGFyW10geyd0J30sIAorCQljaGFyQXJyYXlfdSA9IG5ldyBjaGFyW10geyd1J30sIAorCQljaGFyQXJyYXlfdiA9IG5ldyBjaGFyW10geyd2J30sIAorCQljaGFyQXJyYXlfdyA9IG5ldyBjaGFyW10geyd3J30sIAorCQljaGFyQXJyYXlfeCA9IG5ldyBjaGFyW10geyd4J30sIAorCQljaGFyQXJyYXlfeSA9IG5ldyBjaGFyW10geyd5J30sIAorCQljaGFyQXJyYXlfeiA9IG5ldyBjaGFyW10geyd6J307IAorCisJc3RhdGljIGZpbmFsIGNoYXJbXSBpbml0Q2hhckFycmF5ID0gCisJCW5ldyBjaGFyW10geydcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCd9OyAKKwlzdGF0aWMgZmluYWwgaW50IFRhYmxlU2l6ZSA9IDMwLCBJbnRlcm5hbFRhYmxlU2l6ZSA9IDY7IC8vMzAqNiA9IDE4MCBlbnRyaWVzCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3B0aW1pemVkTGVuZ3RoID0gNjsKKwlwdWJsaWMgLypzdGF0aWMqLyBmaW5hbCBjaGFyW11bXVtdW10gY2hhckFycmF5X2xlbmd0aCA9IAorCQluZXcgY2hhcltPcHRpbWl6ZWRMZW5ndGhdW1RhYmxlU2l6ZV1bSW50ZXJuYWxUYWJsZVNpemVdW107IAorCS8vIHN1cHBvcnQgZm9yIGRldGVjdGluZyBub24tZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFscworCWludCBjdXJyZW50TGluZU5yPSAtMTsKKwlpbnQgcHJldmlvdXNMaW5lTnI9IC0xOworCU5MU0xpbmUgY3VycmVudExpbmU9IG51bGw7CisJTGlzdCBsaW5lcz0gbmV3IEFycmF5TGlzdCgpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUkVGSVg9ICIvLyROT04tTkxTLSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUFJFRklYX0xFTkdUSD0gVEFHX1BSRUZJWC5sZW5ndGgoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUE9TVEZJWD0gIiQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BPU1RGSVhfTEVOR1RIPSBUQUdfUE9TVEZJWC5sZW5ndGgoKTsKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbFtdIG5vbk5MU1N0cmluZ3MgPSBudWxsOworCXB1YmxpYyBib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMgPSB0cnVlOworCXB1YmxpYyBib29sZWFuIHdhc05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSBmYWxzZTsKKwkKKwkvKnN0YXRpYyovIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgVGFibGVTaXplOyBqKyspIHsKKwkJCQlmb3IgKGludCBrID0gMDsgayA8IEludGVybmFsVGFibGVTaXplOyBrKyspIHsKKwkJCQkJY2hhckFycmF5X2xlbmd0aFtpXVtqXVtrXSA9IGluaXRDaGFyQXJyYXk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXN0YXRpYyBpbnQgbmV3RW50cnkyID0gMCwgCisJCW5ld0VudHJ5MyA9IDAsIAorCQluZXdFbnRyeTQgPSAwLCAKKwkJbmV3RW50cnk1ID0gMCwgCisJCW5ld0VudHJ5NiA9IDA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSb3VuZEJyYWNrZXQgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNxdWFyZUJyYWNrZXQgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEN1cmx5QnJhY2tldCA9IDI7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJyYWNrZXRLaW5kcyA9IDM7CitwdWJsaWMgU2Nhbm5lcigpIHsKKwl0aGlzKGZhbHNlLCBmYWxzZSk7Cit9CitwdWJsaWMgU2Nhbm5lcihib29sZWFuIHRva2VuaXplQ29tbWVudHMsIGJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlKSB7CisJdGhpcyh0b2tlbml6ZUNvbW1lbnRzLCB0b2tlbml6ZVdoaXRlU3BhY2UsIGZhbHNlKTsJCit9CitwdWJsaWMgIGZpbmFsIGJvb2xlYW4gYXRFbmQoKSB7CisJLy8gVGhpcyBjb2RlIGlzIG5vdCByZWxldmFudCBpZiBzb3VyY2UgaXMgCisJLy8gT25seSBhIHBhcnQgb2YgdGhlIHJlYWwgc3RyZWFtIGlucHV0CisKKwlyZXR1cm4gc291cmNlLmxlbmd0aCA9PSBjdXJyZW50UG9zaXRpb247Cit9CitwdWJsaWMgY2hhcltdIGdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCkgeworCS8vcmV0dXJuIHRoZSB0b2tlbiBSRUFMIHNvdXJjZSAoYWthIHVuaWNvZGVzIGFyZSBwcmVjb21wdXRlZCkKKworCWNoYXJbXSByZXN1bHQ7CisJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCS8vMCBpcyB1c2VkIGFzIGEgZmFzdCB0ZXN0IGZsYWcgc28gdGhlIHJlYWwgZmlyc3QgY2hhciBpcyBpbiBwb3NpdGlvbiAxCisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkxLCAKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW3dpdGhvdXRVbmljb2RlUHRyXSwgCisJCQkwLCAKKwkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJZWxzZSB7CisJCWludCBsZW5ndGggPSBjdXJyZW50UG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOworCQlzd2l0Y2ggKGxlbmd0aCkgeyAvLyBzZWUgT3B0aW1pemVkTGVuZ3RoCisJCQljYXNlIDEgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UxKCk7CisJCQljYXNlIDIgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UyKCk7CisJCQljYXNlIDMgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UzKCk7CisJCQljYXNlIDQgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U0KCk7CisJCQljYXNlIDUgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U1KCk7CisJCQljYXNlIDYgOgorCQkJCXJldHVybiBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2U2KCk7CisJCX0KKwkJLy9ubyBvcHRpbWl6YXRpb24KKwkJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHN0YXJ0UG9zaXRpb24sIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF0sIDAsIGxlbmd0aCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgaW50IGdldEN1cnJlbnRUb2tlbkVuZFBvc2l0aW9uKCl7CisJcmV0dXJuIHRoaXMuY3VycmVudFBvc2l0aW9uIC0gMTsKK30KK3B1YmxpYyBmaW5hbCBjaGFyW10gZ2V0Q3VycmVudFRva2VuU291cmNlKCkgeworCS8vIFJldHVybiB0aGUgdG9rZW4gUkVBTCBzb3VyY2UgKGFrYSB1bmljb2RlcyBhcmUgcHJlY29tcHV0ZWQpCisKKwljaGFyW10gcmVzdWx0OworCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkvLyAwIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXdpdGhvdXRVbmljb2RlQnVmZmVyLCAKKwkJCTEsIAorCQkJcmVzdWx0ID0gbmV3IGNoYXJbd2l0aG91dFVuaWNvZGVQdHJdLCAKKwkJCTAsIAorCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwllbHNlIHsKKwkJaW50IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXNvdXJjZSwgCisJCQlzdGFydFBvc2l0aW9uLCAKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IGN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb25dLCAKKwkJCTAsIAorCQkJbGVuZ3RoKTsgCisJfQorCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgZmluYWwgY2hhcltdIGdldEN1cnJlbnRUb2tlblNvdXJjZVN0cmluZygpIHsKKwkvL3JldHVybiB0aGUgdG9rZW4gUkVBTCBzb3VyY2UgKGFrYSB1bmljb2RlcyBhcmUgcHJlY29tcHV0ZWQpLgorCS8vUkVNT1ZFIHRoZSB0d28gIiB0aGF0IGFyZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kLgorCisJY2hhcltdIHJlc3VsdDsKKwlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKKwkJLy8wIGlzIHVzZWQgYXMgYSBmYXN0IHRlc3QgZmxhZyBzbyB0aGUgcmVhbCBmaXJzdCBjaGFyIGlzIGluIHBvc2l0aW9uIDEKKwkJU3lzdGVtLmFycmF5Y29weSh3aXRob3V0VW5pY29kZUJ1ZmZlciwgMiwKKwkJLy8yIGlzIDEgKHJlYWwgc3RhcnQpICsgMSAodG8ganVtcCBvdmVyIHRoZSAiKQorCQlyZXN1bHQgPSBuZXcgY2hhclt3aXRob3V0VW5pY29kZVB0ciAtIDJdLCAwLCB3aXRob3V0VW5pY29kZVB0ciAtIDIpOworCWVsc2UgeworCQlpbnQgbGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJc291cmNlLCAKKwkJCXN0YXJ0UG9zaXRpb24gKyAxLCAKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCA9IGN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gLSAyXSwgCisJCQkwLCAKKwkJCWxlbmd0aCk7IAorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIGludCBnZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCl7CisJcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbjsKK30KKy8qCisgKiBTZWFyY2ggdGhlIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgYSBnaXZlbiBsaW5lIG51bWJlcgorICoKKyAqIExpbmUgbnVtYmVycyBhcmUgMS1iYXNlZCwgYW5kIHJlbGF0aXZlIHRvIHRoZSBzY2FubmVyIGluaXRpYWxQb3NpdGlvbi4gCisgKiBDaGFyYWN0ZXIgcG9zaXRpb25zIGFyZSAwLWJhc2VkLgorICoKKyAqIEluIGNhc2UgdGhlIGdpdmVuIGxpbmUgbnVtYmVyIGlzIGluY29uc2lzdGVudCwgYW5zd2VycyAtMS4KKyAqLworcHVibGljIGZpbmFsIGludCBnZXRMaW5lRW5kKGludCBsaW5lTnVtYmVyKSB7CisKKwlpZiAobGluZUVuZHMgPT0gbnVsbCkgcmV0dXJuIC0xOworCWlmIChsaW5lTnVtYmVyID49IGxpbmVFbmRzLmxlbmd0aCkgcmV0dXJuIC0xOworCWlmIChsaW5lTnVtYmVyIDw9IDApIHJldHVybiAtMTsKKwkKKwlpZiAobGluZU51bWJlciA9PSBsaW5lRW5kcy5sZW5ndGggLSAxKSByZXR1cm4gZW9mUG9zaXRpb247CisJcmV0dXJuIGxpbmVFbmRzW2xpbmVOdW1iZXItMV07IC8vIG5leHQgbGluZSBzdGFydCBvbmUgY2hhcmFjdGVyIGJlaGluZCB0aGUgbGluZUVuZCBvZiB0aGUgcHJldmlvdXMgbGluZQorfQorLyoqCisgKiBTZWFyY2ggdGhlIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBnaXZlbiBsaW5lIG51bWJlcgorICoKKyAqIExpbmUgbnVtYmVycyBhcmUgMS1iYXNlZCwgYW5kIHJlbGF0aXZlIHRvIHRoZSBzY2FubmVyIGluaXRpYWxQb3NpdGlvbi4gCisgKiBDaGFyYWN0ZXIgcG9zaXRpb25zIGFyZSAwLWJhc2VkLgorICoKKyAqIGUuZy4JZ2V0TGluZVN0YXJ0KDEpIC0tPiAwCWkuZS4gZmlyc3QgbGluZSBzdGFydHMgYXQgY2hhcmFjdGVyIDAuCisgKgorICogSW4gY2FzZSB0aGUgZ2l2ZW4gbGluZSBudW1iZXIgaXMgaW5jb25zaXN0ZW50LCBhbnN3ZXJzIC0xLgorICovCitwdWJsaWMgZmluYWwgaW50IGdldExpbmVTdGFydChpbnQgbGluZU51bWJlcikgeworCisJaWYgKGxpbmVFbmRzID09IG51bGwpIHJldHVybiAtMTsKKwlpZiAobGluZU51bWJlciA+PSBsaW5lRW5kcy5sZW5ndGgpIHJldHVybiAtMTsKKwlpZiAobGluZU51bWJlciA8PSAwKSByZXR1cm4gLTE7CisJCisJaWYgKGxpbmVOdW1iZXIgPT0gMSkgcmV0dXJuIGluaXRpYWxQb3NpdGlvbjsKKwlyZXR1cm4gbGluZUVuZHNbbGluZU51bWJlci0yXSsxOyAvLyBuZXh0IGxpbmUgc3RhcnQgb25lIGNoYXJhY3RlciBiZWhpbmQgdGhlIGxpbmVFbmQgb2YgdGhlIHByZXZpb3VzIGxpbmUKK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGdldE5leHRDaGFyKGNoYXIgdGVzdGVkQ2hhcikgeworCS8vQk9PTEVBTgorCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCisJLy93aGVuIGEgdW5pY29kZSBhcHBlYXJzIHRoZW4gd2UgbXVzdCB1c2UgYSBidWZmZXIgdGhhdCBob2xkcyBjaGFyIGludGVybmFsIHZhbHVlcworCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCisJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CisJLy9Cb3RoIHByZXZpb3VzIGxpbmVzIGFyZSB0cnVlIGlmIHRoZSBjdXJyZW50Q2hhcmFjdGVyIGlzID09IHRvIHRoZSB0ZXN0ZWRDaGFyCisJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCisKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisKKwlpbnQgdGVtcCA9IGN1cnJlbnRQb3NpdGlvbjsKKwl0cnkgeworCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQlpbnQgYzEsIGMyLCBjMywgYzQ7CisJCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJdW5pY29kZVNpemUrKzsKKwkJCX0KKworCQkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJfHwgYzEgPCAwKQorCQkJCXx8ICgoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMyIDwgMCkKKwkJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQkJfHwgKChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzQgPCAwKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gdGVzdGVkQ2hhcikgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJdW5pY29kZUFzQmFja1NsYXNoID0gY3VycmVudENoYXJhY3RlciA9PSAnXFwnOworCisJCQkvL25lZWQgdGhlIHVuaWNvZGUgYnVmZmVyCisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkgeworCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCXdpdGhvdXRVbmljb2RlUHRyID0gY3VycmVudFBvc2l0aW9uIC0gdW5pY29kZVNpemUgLSBzdGFydFBvc2l0aW9uOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXNvdXJjZSwgCisJCQkJCXN0YXJ0UG9zaXRpb24sIAorCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkJCTEsIAorCQkJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCQkJfQorCQkJLy9maWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgY2hhcgorCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisKKwkJfSAvLy0tLS0tLS0tLS0tLS1lbmQgdW5pY29kZSB0cmFpdGVtZW50LS0tLS0tLS0tLS0tLS0KKwkJZWxzZSB7CisJCQlpZiAoY3VycmVudENoYXJhY3RlciAhPSB0ZXN0ZWRDaGFyKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorcHVibGljIGZpbmFsIGludCBnZXROZXh0Q2hhcihjaGFyIHRlc3RlZENoYXIxLCBjaGFyIHRlc3RlZENoYXIyKSB7CisJLy9JTlQgMCA6IHRlc3RDaGFyMSBcXFxcLy8vXFxcXCAxIDogdGVzdGVkQ2hhcjIgXFxcXC8vL1xcXFwgLTEgOiBvdGhlcnMKKwkvL3Rlc3QgY2FuIGJlIGRvbmUgd2l0aCAoeD09MCkgZm9yIHRoZSBmaXJzdCBhbmQgKHg+MCkgZm9yIHRoZSBzZWNvbmQKKwkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgorCS8vd2hlbiBhIHVuaWNvZGUgYXBwZWFycyB0aGVuIHdlIG11c3QgdXNlIGEgYnVmZmVyIHRoYXQgaG9sZHMgY2hhciBpbnRlcm5hbCB2YWx1ZXMKKwkvL0F0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QgY3VycmVudENoYXJhY3RlciBob2xkcyB0aGUgbmV3IHZpc2l0ZWQgY2hhcgorCS8vYW5kIGN1cnJlbnRQb3NpdGlvbiBwb2ludHMgcmlnaHQgbmV4dCBhZnRlciBpdAorCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyA9PSB0byB0aGUgdGVzdGVkQ2hhcjEvMgorCS8vT24gZmFsc2UsIG5vIHNpZGUgZWZmZWN0IGhhcyBvY2N1cmVkLgorCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTIAorCisJaW50IHRlbXAgPSBjdXJyZW50UG9zaXRpb247CisJdHJ5IHsKKwkJaW50IHJlc3VsdDsKKwkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJaW50IGMxLCBjMiwgYzMsIGM0OworCQkJaW50IHVuaWNvZGVTaXplID0gNjsKKwkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCXVuaWNvZGVTaXplKys7CisJCQl9CisKKwkJCWlmICgoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCXx8IGMxIDwgMCkKKwkJCQl8fCAoKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDApCisJCQkJfHwgKChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzMgPCAwKQorCQkJCXx8ICgoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiAyOworCQkJfQorCisJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gdGVzdGVkQ2hhcjEpCisJCQkJcmVzdWx0ID0gMDsKKwkJCWVsc2UKKwkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSB0ZXN0ZWRDaGFyMikKKwkJCQkJcmVzdWx0ID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJLy9uZWVkIHRoZSB1bmljb2RlIGJ1ZmZlcgorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkvL2J1ZmZlciBhbGwgdGhlIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBhc2lkZS4uLi4KKwkJCQl3aXRob3V0VW5pY29kZVB0ciA9IGN1cnJlbnRQb3NpdGlvbiAtIHVuaWNvZGVTaXplIC0gc3RhcnRQb3NpdGlvbjsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlzb3VyY2UsIAorCQkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkxLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwkJCX0KKwkJCS8vZmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGNoYXIKKwkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gdGVzdGVkQ2hhcjEpCisJCQkJcmVzdWx0ID0gMDsKKwkJCWVsc2UKKwkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSB0ZXN0ZWRDaGFyMikKKwkJCQkJcmVzdWx0ID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQlyZXR1cm4gLTE7CisJfQorfQorcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TmV4dENoYXJBc0RpZ2l0KCkgeworCS8vQk9PTEVBTgorCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCisJLy93aGVuIGEgdW5pY29kZSBhcHBlYXJzIHRoZW4gd2UgbXVzdCB1c2UgYSBidWZmZXIgdGhhdCBob2xkcyBjaGFyIGludGVybmFsIHZhbHVlcworCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCisJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CisJLy9Cb3RoIHByZXZpb3VzIGxpbmVzIGFyZSB0cnVlIGlmIHRoZSBjdXJyZW50Q2hhcmFjdGVyIGlzIGEgZGlnaXQKKwkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KKworCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKworCWludCB0ZW1wID0gY3VycmVudFBvc2l0aW9uOworCXRyeSB7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWludCB1bmljb2RlU2l6ZSA9IDY7CisJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQl1bmljb2RlU2l6ZSsrOworCQkJfQorCisJCQlpZiAoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQl8fCBjMSA8IDApCisJCQkJfHwgKChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCXx8ICgoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vbmVlZCB0aGUgdW5pY29kZSBidWZmZXIKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CisJCQkJLy9idWZmZXIgYWxsIHRoZSBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIGxlZnQgYXNpZGUuLi4uCisJCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSB1bmljb2RlU2l6ZSAtIHN0YXJ0UG9zaXRpb247CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc291cmNlLCAKKwkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyLCAKKwkJCQkJMSwgCisJCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCQl9CisJCQkvL2ZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjaGFyCisJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSAvLy0tLS0tLS0tLS0tLS1lbmQgdW5pY29kZSB0cmFpdGVtZW50LS0tLS0tLS0tLS0tLS0KKwkJZWxzZSB7CisJCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKKwkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TmV4dENoYXJBc0RpZ2l0KGludCByYWRpeCkgeworCS8vQk9PTEVBTgorCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCisJLy93aGVuIGEgdW5pY29kZSBhcHBlYXJzIHRoZW4gd2UgbXVzdCB1c2UgYSBidWZmZXIgdGhhdCBob2xkcyBjaGFyIGludGVybmFsIHZhbHVlcworCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCisJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CisJLy9Cb3RoIHByZXZpb3VzIGxpbmVzIGFyZSB0cnVlIGlmIHRoZSBjdXJyZW50Q2hhcmFjdGVyIGlzIGEgZGlnaXQgYmFzZSBvbiByYWRpeAorCS8vT24gZmFsc2UsIG5vIHNpZGUgZWZmZWN0IGhhcyBvY2N1cmVkLgorCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTIAorCisJaW50IHRlbXAgPSBjdXJyZW50UG9zaXRpb247CisJdHJ5IHsKKwkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJaW50IGMxLCBjMiwgYzMsIGM0OworCQkJaW50IHVuaWNvZGVTaXplID0gNjsKKwkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCXVuaWNvZGVTaXplKys7CisJCQl9CisKKwkJCWlmICgoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCXx8IGMxIDwgMCkKKwkJCQl8fCAoKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDApCisJCQkJfHwgKChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzMgPCAwKQorCQkJCXx8ICgoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCWlmIChDaGFyYWN0ZXIuZGlnaXQoY3VycmVudENoYXJhY3RlciwgcmFkaXgpID09IC0xKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vbmVlZCB0aGUgdW5pY29kZSBidWZmZXIKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CisJCQkJLy9idWZmZXIgYWxsIHRoZSBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIGxlZnQgYXNpZGUuLi4uCisJCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSB1bmljb2RlU2l6ZSAtIHN0YXJ0UG9zaXRpb247CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc291cmNlLCAKKwkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyLCAKKwkJCQkJMSwgCisJCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCQl9CisJCQkvL2ZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjaGFyCisJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSAvLy0tLS0tLS0tLS0tLS1lbmQgdW5pY29kZSB0cmFpdGVtZW50LS0tLS0tLS0tLS0tLS0KKwkJZWxzZSB7CisJCQlpZiAoQ2hhcmFjdGVyLmRpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIsIHJhZGl4KSA9PSAtMSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KK3B1YmxpYyBib29sZWFuIGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSB7CisJLy9CT09MRUFOCisJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KKwkvL3doZW4gYSB1bmljb2RlIGFwcGVhcnMgdGhlbiB3ZSBtdXN0IHVzZSBhIGJ1ZmZlciB0aGF0IGhvbGRzIGNoYXIgaW50ZXJuYWwgdmFsdWVzCisJLy9BdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kIGN1cnJlbnRDaGFyYWN0ZXIgaG9sZHMgdGhlIG5ldyB2aXNpdGVkIGNoYXIKKwkvL2FuZCBjdXJyZW50UG9zaXRpb24gcG9pbnRzIHJpZ2h0IG5leHQgYWZ0ZXIgaXQKKwkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgYSBKYXZhSWRlbnRpZmllclBhcnQKKwkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KKworCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKworCWludCB0ZW1wID0gY3VycmVudFBvc2l0aW9uOworCXRyeSB7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWludCB1bmljb2RlU2l6ZSA9IDY7CisJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQl1bmljb2RlU2l6ZSsrOworCQkJfQorCisJCQlpZiAoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQl8fCBjMSA8IDApCisJCQkJfHwgKChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCXx8ICgoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvL25lZWQgdGhlIHVuaWNvZGUgYnVmZmVyCisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkgeworCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCXdpdGhvdXRVbmljb2RlUHRyID0gY3VycmVudFBvc2l0aW9uIC0gdW5pY29kZVNpemUgLSBzdGFydFBvc2l0aW9uOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXNvdXJjZSwgCisJCQkJCXN0YXJ0UG9zaXRpb24sIAorCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkJCTEsIAorCQkJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCQkJfQorCQkJLy9maWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgY2hhcgorCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KK3B1YmxpYyBpbnQgZ2V0TmV4dFRva2VuKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisKKwl0aGlzLndhc0FjciA9IGZhbHNlOworCWlmIChkaWV0KSB7CisJCWp1bXBPdmVyTWV0aG9kQm9keSgpOworCQlkaWV0ID0gZmFsc2U7CisJCXJldHVybiBjdXJyZW50UG9zaXRpb24gPiBzb3VyY2UubGVuZ3RoID8gVG9rZW5OYW1lRU9GIDogVG9rZW5OYW1lUkJSQUNFOworCX0KKwl0cnkgeworCQl3aGlsZSAodHJ1ZSkgeyAvL2xvb3AgZm9yIGp1bXBpbmcgb3ZlciBjb21tZW50cworCQkJd2l0aG91dFVuaWNvZGVQdHIgPSAwOworCQkJLy9zdGFydCB3aXRoIGEgbmV3IHRva2VuIChldmVuIGNvbW1lbnQgd3JpdHRlbiB3aXRoIHVuaWNvZGUgKQorCisJCQkvLyAtLS0tLS0tLS1Db25zdW1lIHdoaXRlIHNwYWNlIGFuZCBoYW5kbGVzIHN0YXJ0UG9zaXRpb24tLS0tLS0tLS0KKwkJCWludCB3aGl0ZVN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOworCQkJYm9vbGVhbiBpc1doaXRlU3BhY2U7CisJCQlkbyB7CisJCQkJc3RhcnRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJaXNXaGl0ZVNwYWNlID0ganVtcE92ZXJVbmljb2RlV2hpdGVTcGFjZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgeworCQkJCQkJY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpOworCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsKKwkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljdXJyZW50TGluZSA9IG51bGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaXNXaGl0ZVNwYWNlID0gCisJCQkJCQkoY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXJhY3Rlcik7IAorCQkJCX0KKwkJCX0gd2hpbGUgKGlzV2hpdGVTcGFjZSk7CisJCQlpZiAodG9rZW5pemVXaGl0ZVNwYWNlICYmICh3aGl0ZVN0YXJ0ICE9IGN1cnJlbnRQb3NpdGlvbiAtIDEpKSB7CisJCQkJLy8gcmVwb3NpdGlvbiBzY2FubmVyIGluIGNhc2Ugd2UgYXJlIGludGVyZXN0ZWQgYnkgc3BhY2VzIGFzIHRva2VucworCQkJCWN1cnJlbnRQb3NpdGlvbi0tOworCQkJCXN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJCXJldHVybiBUb2tlbk5hbWVXSElURVNQQUNFOworCQkJfQorCQkJLy9saXR0bGUgdHJpY2sgdG8gZ2V0IG91dCBpbiB0aGUgbWlkZGxlIG9mIGEgc291cmNlIGNvbXB1YXRpb24KKwkJCWlmIChjdXJyZW50UG9zaXRpb24gPiBlb2ZQb3NpdGlvbikKKwkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOworCisJCQkvLyAtLS0tLS0tLS1JZGVudGlmeSB0aGUgbmV4dCB0b2tlbi0tLS0tLS0tLS0tLS0KKworCQkJc3dpdGNoIChjdXJyZW50Q2hhcmFjdGVyKSB7CisJCQkJY2FzZSAnKCcgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lTFBBUkVOOworCQkJCWNhc2UgJyknIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVJQQVJFTjsKKwkJCQljYXNlICd7JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVMQlJBQ0U7CisJCQkJY2FzZSAnfScgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUkJSQUNFOworCQkJCWNhc2UgJ1snIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUxCUkFDS0VUOworCQkJCWNhc2UgJ10nIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVJCUkFDS0VUOworCQkJCWNhc2UgJzsnIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVNFTUlDT0xPTjsKKwkJCQljYXNlICcsJyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NQTsKKwkJCQljYXNlICcuJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhckFzRGlnaXQoKSkKKwkJCQkJCXJldHVybiBzY2FuTnVtYmVyKHRydWUpOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRE9UOworCQkJCWNhc2UgJysnIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignKycsICc9JykpID09IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVBMVVNfUExVUzsKKwkJCQkJCWlmICh0ZXN0ID4gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUExVU19FUVVBTDsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVQTFVTOworCQkJCQl9CisJCQkJY2FzZSAnLScgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCctJywgJz0nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTUlOVVNfTUlOVVM7CisJCQkJCQlpZiAodGVzdCA+IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1JTlVTX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1JTlVTOworCQkJCQl9CisJCQkJY2FzZSAnficgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lVFdJRERMRTsKKwkJCQljYXNlICchJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZU5PVF9FUVVBTDsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZU5PVDsKKwkJCQljYXNlICcqJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lTVVMVElQTFk7CisJCQkJY2FzZSAnJScgOgorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVSRU1BSU5ERVI7CisJCQkJY2FzZSAnPCcgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJzwnKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVTU19FUVVBTDsKKwkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTDsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVGVF9TSElGVDsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBUb2tlbk5hbWVMRVNTOworCQkJCQl9CisJCQkJY2FzZSAnPicgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJz4nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lR1JFQVRFUl9FUVVBTDsKKwkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJz4nKSkgPT0gMCkKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMOworCQkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTDsKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUklHSFRfU0hJRlQ7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lR1JFQVRFUjsKKwkJCQkJfQorCQkJCWNhc2UgJz0nIDoKKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRVFVQUxfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVFUVVBTDsKKwkJCQljYXNlICcmJyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJyYnLCAnPScpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVBTkRfQU5EOworCQkJCQkJaWYgKHRlc3QgPiAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVBTkRfRVFVQUw7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQU5EOworCQkJCQl9CisJCQkJY2FzZSAnfCcgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCd8JywgJz0nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lT1JfT1I7CisJCQkJCQlpZiAodGVzdCA+IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZU9SX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZU9SOworCQkJCQl9CisJCQkJY2FzZSAnXicgOgorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVYT1JfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVYT1I7CisJCQkJY2FzZSAnPycgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUVVFU1RJT047CisJCQkJY2FzZSAnOicgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09MT047CisJCQkJY2FzZSAnXCcnIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignXG4nLCAnXHInKSkgPT0gMCkgeworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCQkJfQorCQkJCQkJaWYgKHRlc3QgPiAwKSB7CisJCQkJCQkJLy8gcmVsb2NhdGUgaWYgZmluZGluZyBhbm90aGVyIHF1b3RlIGZhaXJseSBjbG9zZTogdGh1cyB1bmljb2RlICcvdTAwMEQnIHdpbGwgYmUgZnVsbHkgY29uc3VtZWQKKwkJCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCAzOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcJycpIHsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcJycpKSB7CisJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJZm9yIChpbnQgbG9va0FoZWFkID0gMDsgbG9va0FoZWFkIDwgMzsgbG9va0FoZWFkKyspIHsKKwkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXG4nKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wnJykgeworCQkJCQkJCQljdXJyZW50UG9zaXRpb24gKz0gbG9va0FoZWFkICsgMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCk7CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcXCcpKQorCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQllbHNlIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChnZXROZXh0Q2hhcignXCcnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsOworCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCAyMDsgbG9va0FoZWFkKyspIHsKKwkJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWQgPT0gc291cmNlLmxlbmd0aCkKKwkJCQkJCQlicmVhazsKKwkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXG4nKQorCQkJCQkJCWJyZWFrOworCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcJycpIHsKKwkJCQkJCQljdXJyZW50UG9zaXRpb24gKz0gbG9va0FoZWFkICsgMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfQ0hBUkFDVEVSX0NPTlNUQU5UKTsKKwkJCQljYXNlICciJyA6CisJCQkJCXRyeSB7CisJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICciJykgeworCQkJCQkJCS8qKioqIFxyIGFuZCBcbiBhcmUgbm90IHZhbGlkIGluIHN0cmluZyBsaXRlcmFscyAqKioqLworCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSkgeworCQkJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCA1MDsgbG9va0FoZWFkKyspIHsKKwkJCQkJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWQgPT0gc291cmNlLmxlbmd0aCkKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXG4nKQorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcIicpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24gKz0gbG9va0FoZWFkICsgMTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfQ0hBUl9JTl9TVFJJTkcpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CisJCQkJCQkJCWludCBlc2NhcGVTaXplID0gY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQlib29sZWFuIGJhY2tTbGFzaEFzVW5pY29kZUluU3RyaW5nID0gdW5pY29kZUFzQmFja1NsYXNoOworCQkJCQkJCQkvL3NjYW5Fc2NhcGVDaGFyYWN0ZXIgbWFrZSBhIHNpZGUgZWZmZWN0IG9uIHRoaXMgdmFsdWUgYW5kIHdlIG5lZWQgdGhlIHByZXZpb3VzIHZhbHVlIGZldyBsaW5lcyBkb3duIHRoaXMgb25lCisJCQkJCQkJCXNjYW5Fc2NhcGVDaGFyYWN0ZXIoKTsKKwkJCQkJCQkJZXNjYXBlU2l6ZSA9IGN1cnJlbnRQb3NpdGlvbiAtIGVzY2FwZVNpemU7CisJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CisJCQkJCQkJCQkvL2J1ZmZlciBhbGwgdGhlIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBhc2lkZS4uLi4KKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlUHRyID0gY3VycmVudFBvc2l0aW9uIC0gZXNjYXBlU2l6ZSAtIDEgLSBzdGFydFBvc2l0aW9uOworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlzb3VyY2UsIAorCQkJCQkJCQkJCXN0YXJ0UG9zaXRpb24sIAorCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyLCAKKwkJCQkJCQkJCQkxLCAKKwkJCQkJCQkJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQl9IGVsc2UgeyAvL292ZXJ3cml0ZSB0aGUgLyBpbiB0aGUgYnVmZmVyCisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQkJaWYgKGJhY2tTbGFzaEFzVW5pY29kZUluU3RyaW5nKSB7IC8vdGhlcmUgYXJlIFRXTyBcIGluIHRoZSBzdHJlYW0gd2hlcmUgb25seSBvbmUgaXMgY29ycmVjdAorCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlUHRyLS07CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihVTlRFUk1JTkFURURfU1RSSU5HKTsKKwkJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoSU5WQUxJRF9FU0NBUEUpKSB7CisJCQkJCQkJLy8gcmVsb2NhdGUgaWYgZmluZGluZyBhbm90aGVyIHF1b3RlIGZhaXJseSBjbG9zZTogdGh1cyB1bmljb2RlICcvdTAwMEQnIHdpbGwgYmUgZnVsbHkgY29uc3VtZWQKKwkJCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCA1MDsgbG9va0FoZWFkKyspIHsKKwkJCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZCA9PSBzb3VyY2UubGVuZ3RoKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXG4nKQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXCInKSB7CisJCQkJCQkJCQljdXJyZW50UG9zaXRpb24gKz0gbG9va0FoZWFkICsgMTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCQl0aHJvdyBlOyAvLyByZXRocm93CisJCQkJCX0KKwkJCQkJaWYgKGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpeyAvLyBjaGVjayBmb3IgcHJlc2VuY2Ugb2YJTkxTIHRhZ3MgLy8kTk9OLU5MUy0/JCB3aGVyZSA/IGlzIGFuIGludC4KKwkJCQkJCWlmIChjdXJyZW50TGluZSA9PSBudWxsKSB7CisJCQkJCQkJY3VycmVudExpbmU9IG5ldyBOTFNMaW5lKCk7CisJCQkJCQkJbGluZXMuYWRkKGN1cnJlbnRMaW5lKTsKKwkJCQkJCX0KKwkJCQkJCWN1cnJlbnRMaW5lLmFkZCgKKwkJCQkJCQluZXcgU3RyaW5nTGl0ZXJhbCgKKwkJCQkJCQkJZ2V0Q3VycmVudFRva2VuU291cmNlU3RyaW5nKCksIAorCQkJCQkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQkJCQkJY3VycmVudFBvc2l0aW9uIC0gMSkpOworCQkJCQl9CisJCQkJCXJldHVybiBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsOworCQkJCWNhc2UgJy8nIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQkJaW50IGVuZFBvc2l0aW9uRm9yTGluZUNvbW1lbnQgPSAwOworCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzQgPCAwKSB7CisJCQkJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vaGFuZGxlIHRoZSBcXHUgY2FzZSBtYW51YWxseSBpbnRvIGNvbW1lbnQKKwkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCWJvb2xlYW4gaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CisJCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyCisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsJCQkJCQkJCQkKKwkJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsJCQkJCQkJCQkJCQorCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGM0IDwgMCkgeworCQkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzVW5pY29kZSkgeworCQkJCQkJCQkJZW5kUG9zaXRpb25Gb3JMaW5lQ29tbWVudCA9IGN1cnJlbnRQb3NpdGlvbiAtIDY7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQllbmRQb3NpdGlvbkZvckxpbmVDb21tZW50ID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZWNvcmRDb21tZW50KGZhbHNlKTsKKwkJCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7CisJCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7CisJCQkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcikgeworCQkJCQkJCQkJCWlmIChpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQkJcHVzaFVuaWNvZGVMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgeworCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24gPSBlbmRQb3NpdGlvbkZvckxpbmVDb21tZW50OyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAorCQkJCQkJCQkJfQorCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeyAvL2FuIGVvZiB3aWxsIHRoZW0gYmUgZ2VuZXJhdGVkCisJCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAorCQkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0xJTkU7CisJCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKHRlc3QgPiAwKSB7IC8vdHJhZGl0aW9uYWwgYW5kIGFubm90YXRpb24gY29tbWVudAorCQkJCQkJCWJvb2xlYW4gaXNKYXZhZG9jID0gZmFsc2UsIHN0YXIgPSBmYWxzZTsKKwkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnKicpIHsKKwkJCQkJCQkJaXNKYXZhZG9jID0gdHJ1ZTsKKwkJCQkJCQkJc3RhciA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgeworCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7CisJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY3VycmVudExpbmUgPSBudWxsOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCQl9CisJCQkJCQkJCS8vaGFuZGxlIHRoZSBcXHUgY2FzZSBtYW51YWxseSBpbnRvIGNvbW1lbnQKKwkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7IC8vanVtcCBvdmVyIHRoZSBcXAorCQkJCQkJCQl9CisJCQkJCQkJCS8vIGVtcHR5IGNvbW1lbnQgaXMgbm90IGEgamF2YWRvYyAvKiovCisJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICcvJykgeyAKKwkJCQkJCQkJCWlzSmF2YWRvYyA9IGZhbHNlOworCQkJCQkJCQl9CisJCQkJCQkJCS8vbG9vcCB1bnRpbCBlbmQgb2YgY29tbWVudCAqLworCQkJCQkJCQl3aGlsZSAoKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJy8nKSB8fCAoIXN0YXIpKSB7CisJCQkJCQkJCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKKwkJCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7CisJCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsKKwkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCQljdXJyZW50TGluZSA9IG51bGw7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJc3RhciA9IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonOworCQkJCQkJCQkJLy9nZXQgbmV4dCBjaGFyCisJCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vaGFuZGxlIHRoZSBcXHUgY2FzZSBtYW51YWxseSBpbnRvIGNvbW1lbnQKKwkJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdcXCcpIHsKKwkJCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJykKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQl9IC8vanVtcCBvdmVyIHRoZSBcXAorCQkJCQkJCQl9CisJCQkJCQkJCXJlY29yZENvbW1lbnQoaXNKYXZhZG9jKTsKKwkJCQkJCQkJaWYgKHRva2VuaXplQ29tbWVudHMpIHsKKwkJCQkJCQkJCWlmIChpc0phdmFkb2MpCisJCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfSkFWQURPQzsKKwkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0JMT0NLOworCQkJCQkJCQl9CisJCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oVU5URVJNSU5BVEVEX0NPTU1FTlQpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVESVZJREVfRVFVQUw7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFOworCQkJCQl9CisJCQkJY2FzZSAnXHUwMDFhJyA6CisJCQkJCWlmIChhdEVuZCgpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUVPRjsKKwkJCQkJLy90aGUgYXRFbmQgbWF5IG5vdCBiZSA8Y3VycmVudFBvc2l0aW9uID09IHNvdXJjZS5sZW5ndGg+IGlmIHNvdXJjZSBpcyBvbmx5IHNvbWUgcGFydCBvZiBhIHJlYWwgKGV4dGVybmFsKSBzdHJlYW0KKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigiQ3RybC1aIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCWRlZmF1bHQgOgorCQkJCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjdXJyZW50Q2hhcmFjdGVyKSkKKwkJCQkJCXJldHVybiBzY2FuSWRlbnRpZmllck9yS2V5d29yZCgpOworCQkJCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlcikpCisJCQkJCQlyZXR1cm4gc2Nhbk51bWJlcihmYWxzZSk7CisJCQkJCXJldHVybiBUb2tlbk5hbWVFUlJPUjsKKwkJCX0KKwkJfQorCX0gLy8tLS0tLS0tLS0tLS0tLS0tLWVuZCBzd2l0Y2ggd2hpbGUgdHJ5LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBUb2tlbk5hbWVFT0Y7Cit9CitwdWJsaWMgZmluYWwgdm9pZCBnZXROZXh0VW5pY29kZUNoYXIoKQorCXRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCS8vVk9JRAorCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCisJLy93aGVuIGEgdW5pY29kZSBhcHBlYXJzIHRoZW4gd2UgbXVzdCB1c2UgYSBidWZmZXIgdGhhdCBob2xkcyBjaGFyIGludGVybmFsIHZhbHVlcworCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCisJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CisKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisKKwlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwLCB1bmljb2RlU2l6ZSA9IDY7CisJY3VycmVudFBvc2l0aW9uKys7CisJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQljdXJyZW50UG9zaXRpb24rKzsKKwkJdW5pY29kZVNpemUrKzsKKwl9CisKKwlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQl8fCBjMSA8IDAKKwkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQl8fCBjMiA8IDAKKwkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQl8fCBjMyA8IDAKKwkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQl8fCBjNCA8IDApeworCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCX0gZWxzZSB7CisJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCS8vbmVlZCB0aGUgdW5pY29kZSBidWZmZXIKKwkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSB1bmljb2RlU2l6ZSAtIHN0YXJ0UG9zaXRpb247CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXNvdXJjZSwgCisJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCTEsIAorCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCX0KKwkJLy9maWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgY2hhcgorCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJfQorCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJzsKK30KKy8qIFRva2VuaXplIGEgbWV0aG9kIGJvZHksIGFzc3VtaW5nIHRoYXQgY3VybHkgYnJhY2tldHMgYXJlIHByb3Blcmx5IGJhbGFuY2VkLgorICovCitwdWJsaWMgZmluYWwgdm9pZCBqdW1wT3Zlck1ldGhvZEJvZHkoKSB7CisKKwl0aGlzLndhc0FjciA9IGZhbHNlOworCWludCBmb3VuZCA9IDE7CisJdHJ5IHsKKwkJd2hpbGUgKHRydWUpIHsgLy9sb29wIGZvciBqdW1waW5nIG92ZXIgY29tbWVudHMKKwkJCS8vIC0tLS0tLS0tLUNvbnN1bWUgd2hpdGUgc3BhY2UgYW5kIGhhbmRsZXMgc3RhcnRQb3NpdGlvbi0tLS0tLS0tLQorCQkJYm9vbGVhbiBpc1doaXRlU3BhY2U7CisJCQlkbyB7CisJCQkJc3RhcnRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJaXNXaGl0ZVNwYWNlID0ganVtcE92ZXJVbmljb2RlV2hpdGVTcGFjZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCisJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQorCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJaXNXaGl0ZVNwYWNlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQl9CisJCQl9IHdoaWxlIChpc1doaXRlU3BhY2UpOworCisJCQkvLyAtLS0tLS0tY29uc3VtZSB0b2tlbiB1bnRpbCB9IGlzIGZvdW5kLS0tLS0tLS0tCisJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQljYXNlICd7JyA6CisJCQkJCWZvdW5kKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ30nIDoKKwkJCQkJZm91bmQtLTsKKwkJCQkJaWYgKGZvdW5kID09IDApCisJCQkJCQlyZXR1cm47CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wnJyA6CisJCQkJCXsKKwkJCQkJCWJvb2xlYW4gdGVzdDsKKwkJCQkJCXRlc3QgPSBnZXROZXh0Q2hhcignXFwnKTsKKwkJCQkJCWlmICh0ZXN0KSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRyeSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKKwkJCQkJCQl9OworCQkJCQkJfQorCQkJCQkJZ2V0TmV4dENoYXIoJ1wnJyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWNhc2UgJyInIDoKKwkJCQkJdHJ5IHsKKwkJCQkJCXRyeSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICciJykgeworCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpeworCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJyl7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKKwkJCQkJCQkJfTsKKwkJCQkJCQl9CisJCQkJCQkJdHJ5IHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJy8nIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignLycsICcqJykpID09IDApIHsgLy9saW5lIGNvbW1lbnQgCisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJLy9nZXQgdGhlIG5leHQgY2hhciAKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjNCA8IDApIHsgLy9lcnJvciBkb24ndCBjYXJlIG9mIHRoZSB2YWx1ZQorCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAnQSc7CisJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIFxuIGFuZCBccgorCQkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CisJCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMiA8IDAKKwkJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjNCA8IDApIHsgLy9lcnJvciBkb24ndCBjYXJlIG9mIHRoZSB2YWx1ZQorCQkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gJ0EnOworCQkJCQkJCQkJCX0gLy9zb21ldGhpbmcgZGlmZmVyZW50IGZyb20gXG4gYW5kIFxyCisJCQkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCisJCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQorCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl9IC8vYW4gZW9mIHdpbGwgdGhlbSBiZSBnZW5lcmF0ZWQKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICh0ZXN0ID4gMCkgeyAvL3RyYWRpdGlvbmFsIGFuZCBhbm5vdGF0aW9uIGNvbW1lbnQKKwkJCQkJCQlib29sZWFuIHN0YXIgPSBmYWxzZTsKKwkJCQkJCQl0cnkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQkJfQorCQkJCQkJCQl9OworCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CisJCQkJCQkJCXN0YXIgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgorCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQorCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzQgPCAwKSB7IC8vZXJyb3IgZG9uJ3QgY2FyZSBvZiB0aGUgdmFsdWUKKwkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gJ0EnOworCQkJCQkJCQkJfSAvL3NvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSAqIGFuZCAvCisJCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8vbG9vcCB1bnRpbCBlbmQgb2YgY29tbWVudCAqLyAKKwkJCQkJCQkJd2hpbGUgKChjdXJyZW50Q2hhcmFjdGVyICE9ICcvJykgfHwgKCFzdGFyKSkgeworCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQorCQkJCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQlzdGFyID0gY3VycmVudENoYXJhY3RlciA9PSAnKic7CisJCQkJCQkJCQkvL2dldCBuZXh0IGNoYXIKKwkJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzMgPCAwCisJCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzQgPCAwKSB7IC8vZXJyb3IgZG9uJ3QgY2FyZSBvZiB0aGUgdmFsdWUKKwkJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdBJzsKKwkJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tICogYW5kIC8KKwkJCQkJCQkJCQllbHNlIHsKKwkJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlzY2FuTnVtYmVyKGZhbHNlKTsKKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCX0KKwkJLy8tLS0tLS0tLS0tLS0tLS0tLWVuZCBzd2l0Y2ggd2hpbGUgdHJ5LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCX0KKwlyZXR1cm47Cit9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBqdW1wT3ZlclVuaWNvZGVXaGl0ZVNwYWNlKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJLy9CT09MRUFOCisJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4gSnVtcCBvdmVyIHRoZSBuZXh0IHdoaXRlU3BhY2UKKwkvL21ha2luZyBzdGFydFBvc2l0aW9uIHBvaW50aW5nIG9uIHRoZSBuZXh0IGF2YWlsYWJsZSBjaGFyCisJLy9PbiBmYWxzZSwgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgZmlsbGVkIHVwIHdpdGggYSBwb3RlbnRpYWwKKwkvL2NvcnJlY3QgY2hhcgorCisJdHJ5IHsKKwkJdGhpcy53YXNBY3IgPSBmYWxzZTsKKwkJaW50IGMxLCBjMiwgYzMsIGM0OworCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQljdXJyZW50UG9zaXRpb24rKzsKKwkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl1bmljb2RlU2l6ZSsrOworCQl9CisKKwkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQl8fCBjMSA8IDApCisJCQl8fCAoKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDApCisJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQl9CisKKwkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpCisJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKSkKKwkJCXJldHVybiB0cnVlOworCisJCS8vYnVmZmVyIHRoZSBuZXcgY2hhciB3aGljaCBpcyBub3QgYSB3aGl0ZSBzcGFjZQorCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCS8vd2l0aG91dFVuaWNvZGVQdHIgPT0gMSBpcyB0cnVlIGhlcmUKKwkJcmV0dXJuIGZhbHNlOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7CisJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSk7CisJfQorfQorcHVibGljIGZpbmFsIGludFtdIGdldExpbmVFbmRzKCkgeworCS8vcmV0dXJuIGEgYm91bmRlZCBjb3B5IG9mIHRoaXMubGluZUVuZHMgCisKKwlpbnRbXSBjb3B5OworCVN5c3RlbS5hcnJheWNvcHkobGluZUVuZHMsIDAsIGNvcHkgPSBuZXcgaW50W2xpbmVQdHIgKyAxXSwgMCwgbGluZVB0ciArIDEpOworCXJldHVybiBjb3B5OworfQorCitwdWJsaWMgY2hhcltdIGdldFNvdXJjZSgpeworCXJldHVybiB0aGlzLnNvdXJjZTsKK30KK2ZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UxKCkgeworCS8vcmV0dXJuIGFsd2F5cyB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCisKKwkvL29wdGltaXphdGlvbiBhdCBubyBzcGVlZCBjb3N0IG9mIDk5LjUgJSBvZiB0aGUgc2luZ2xlQ2hhcklkZW50aWZpZXIKKwljaGFyIGNoYXJPbmUgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl07CisJc3dpdGNoIChjaGFyT25lKSB7CisJCWNhc2UgJ2EnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfYTsKKwkJY2FzZSAnYicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9iOworCQljYXNlICdjJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2M7CisJCWNhc2UgJ2QnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfZDsKKwkJY2FzZSAnZScgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9lOworCQljYXNlICdmJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2Y7CisJCWNhc2UgJ2cnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfZzsKKwkJY2FzZSAnaCcgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9oOworCQljYXNlICdpJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2k7CisJCWNhc2UgJ2onIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfajsKKwkJY2FzZSAnaycgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9rOworCQljYXNlICdsJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2w7CisJCWNhc2UgJ20nIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfbTsKKwkJY2FzZSAnbicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9uOworCQljYXNlICdvJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X287CisJCWNhc2UgJ3AnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfcDsKKwkJY2FzZSAncScgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9xOworCQljYXNlICdyJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3I7CisJCWNhc2UgJ3MnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfczsKKwkJY2FzZSAndCcgOgorCQkJcmV0dXJuIGNoYXJBcnJheV90OworCQljYXNlICd1JyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3U7CisJCWNhc2UgJ3YnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfdjsKKwkJY2FzZSAndycgOgorCQkJcmV0dXJuIGNoYXJBcnJheV93OworCQljYXNlICd4JyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3g7CisJCWNhc2UgJ3knIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfeTsKKwkJY2FzZSAneicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV96OworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBuZXcgY2hhcltdIHtjaGFyT25lfTsKKwl9Cit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMigpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzE7CisJaW50IGhhc2ggPSAKKwkJKCgoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pIDw8IDYpICsgKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzBdW2hhc2hdOworCWludCBpID0gbmV3RW50cnkyOworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKSAmJiAoYzEgPT0gY2hhckFycmF5WzFdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnkyOworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pICYmIChjMSA9PSBjaGFyQXJyYXlbMV0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLWFkZCB0aGUgZW50cnktLS0tLS0tCisJaWYgKCsrbWF4ID49IEludGVybmFsVGFibGVTaXplKSBtYXggPSAwOworCWNoYXJbXSByOworCXRhYmxlW21heF0gPSAociA9IG5ldyBjaGFyW10ge2MwLCBjMX0pOworCW5ld0VudHJ5MiA9IG1heDsKKwlyZXR1cm4gcjsKK30KK2ZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UzKCkgeworCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCisKKwljaGFyIGMwLCBjMSwgYzI7CisJaW50IGhhc2ggPSAKKwkJKCgoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pIDw8IDEyKQorCQkJKyAoKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkgPDwgNikKKwkJCSsgKGMyID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAyXSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzFdW2hhc2hdOworCWludCBpID0gbmV3RW50cnkzOworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKSAmJiAoYzEgPT0gY2hhckFycmF5WzFdKSAmJiAoYzIgPT0gY2hhckFycmF5WzJdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnkzOworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pICYmIChjMSA9PSBjaGFyQXJyYXlbMV0pICYmIChjMiA9PSBjaGFyQXJyYXlbMl0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLWFkZCB0aGUgZW50cnktLS0tLS0tCisJaWYgKCsrbWF4ID49IEludGVybmFsVGFibGVTaXplKSBtYXggPSAwOworCWNoYXJbXSByOworCXRhYmxlW21heF0gPSAociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKKwluZXdFbnRyeTMgPSBtYXg7CisJcmV0dXJuIHI7Cit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNCgpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzEsIGMyLCBjMzsKKwlsb25nIGhhc2ggPSAKKwkJKCgoKGxvbmcpIChjMCA9IHNvdXJjZVtzdGFydFBvc2l0aW9uXSkpIDw8IDE4KQorCQkJKyAoKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkgPDwgMTIpCisJCQkrICgoYzIgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDJdKSA8PCA2KQorCQkJKyAoYzMgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDNdKSkKKwkJCSUgVGFibGVTaXplOyAKKwljaGFyW11bXSB0YWJsZSA9IGNoYXJBcnJheV9sZW5ndGhbMl1bKGludCkgaGFzaF07CisJaW50IGkgPSBuZXdFbnRyeTQ7CisJd2hpbGUgKCsraSA8IEludGVybmFsVGFibGVTaXplKSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLS1vdGhlciBzaWRlLS0tLS0tLS0tCisJaSA9IC0xOworCWludCBtYXggPSBuZXdFbnRyeTQ7CisJd2hpbGUgKCsraSA8PSBtYXgpIHsKKwkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOworCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKKwkJCSYmIChjMSA9PSBjaGFyQXJyYXlbMV0pCisJCQkmJiAoYzIgPT0gY2hhckFycmF5WzJdKQorCQkJJiYgKGMzID09IGNoYXJBcnJheVszXSkpCisJCQlyZXR1cm4gY2hhckFycmF5OworCX0KKwkvLy0tLS0tLS0tYWRkIHRoZSBlbnRyeS0tLS0tLS0KKwlpZiAoKyttYXggPj0gSW50ZXJuYWxUYWJsZVNpemUpIG1heCA9IDA7CisJY2hhcltdIHI7CisJdGFibGVbbWF4XSA9IChyID0gbmV3IGNoYXJbXSB7YzAsIGMxLCBjMiwgYzN9KTsKKwluZXdFbnRyeTQgPSBtYXg7CisJcmV0dXJuIHI7CisJCit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNSgpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzEsIGMyLCBjMywgYzQ7CisJbG9uZyBoYXNoID0gCisJCSgoKChsb25nKSAoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pKSA8PCAyNCkKKwkJCSsgKCgobG9uZykgKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkpIDw8IDE4KQorCQkJKyAoKGMyID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAyXSkgPDwgMTIpCisJCQkrICgoYzMgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDNdKSA8PCA2KQorCQkJKyAoYzQgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDRdKSkKKwkJCSUgVGFibGVTaXplOyAKKwljaGFyW11bXSB0YWJsZSA9IGNoYXJBcnJheV9sZW5ndGhbM11bKGludCkgaGFzaF07CisJaW50IGkgPSBuZXdFbnRyeTU7CisJd2hpbGUgKCsraSA8IEludGVybmFsVGFibGVTaXplKSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pCisJCQkmJiAoYzQgPT0gY2hhckFycmF5WzRdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnk1OworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pCisJCQkmJiAoYzQgPT0gY2hhckFycmF5WzRdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS1hZGQgdGhlIGVudHJ5LS0tLS0tLQorCWlmICgrK21heCA+PSBJbnRlcm5hbFRhYmxlU2l6ZSkgbWF4ID0gMDsKKwljaGFyW10gcjsKKwl0YWJsZVttYXhdID0gKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzR9KTsKKwluZXdFbnRyeTUgPSBtYXg7CisJcmV0dXJuIHI7CisJCQorfQorZmluYWwgY2hhcltdIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKSB7CisJLy90cnkgdG8gcmV0dXJuIHRoZSBzYW1lIGNoYXJbXSBidWlsZCBvbmx5IG9uY2UKKworCWNoYXIgYzAsIGMxLCBjMiwgYzMsIGM0LCBjNTsKKwlsb25nIGhhc2ggPSAKKwkJKCgoKGxvbmcpIChjMCA9IHNvdXJjZVtzdGFydFBvc2l0aW9uXSkpIDw8IDMyKQorCQkJKyAoKChsb25nKSAoYzEgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDFdKSkgPDwgMjQpCisJCQkrICgoKGxvbmcpIChjMiA9IHNvdXJjZVtzdGFydFBvc2l0aW9uICsgMl0pKSA8PCAxOCkKKwkJCSsgKChjMyA9IHNvdXJjZVtzdGFydFBvc2l0aW9uICsgM10pIDw8IDEyKQorCQkJKyAoKGM0ID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyA0XSkgPDwgNikKKwkJCSsgKGM1ID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyA1XSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzRdWyhpbnQpIGhhc2hdOworCWludCBpID0gbmV3RW50cnk2OworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQorCQkJJiYgKGMxID09IGNoYXJBcnJheVsxXSkKKwkJCSYmIChjMiA9PSBjaGFyQXJyYXlbMl0pCisJCQkmJiAoYzMgPT0gY2hhckFycmF5WzNdKQorCQkJJiYgKGM0ID09IGNoYXJBcnJheVs0XSkKKwkJCSYmIChjNSA9PSBjaGFyQXJyYXlbNV0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLS1vdGhlciBzaWRlLS0tLS0tLS0tCisJaSA9IC0xOworCWludCBtYXggPSBuZXdFbnRyeTY7CisJd2hpbGUgKCsraSA8PSBtYXgpIHsKKwkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOworCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKKwkJCSYmIChjMSA9PSBjaGFyQXJyYXlbMV0pCisJCQkmJiAoYzIgPT0gY2hhckFycmF5WzJdKQorCQkJJiYgKGMzID09IGNoYXJBcnJheVszXSkKKwkJCSYmIChjNCA9PSBjaGFyQXJyYXlbNF0pCisJCQkmJiAoYzUgPT0gY2hhckFycmF5WzVdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS1hZGQgdGhlIGVudHJ5LS0tLS0tLQorCWlmICgrK21heCA+PSBJbnRlcm5hbFRhYmxlU2l6ZSkgbWF4ID0gMDsKKwljaGFyW10gcjsKKwl0YWJsZVttYXhdID0gKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CisJbmV3RW50cnk2ID0gbWF4OworCXJldHVybiByOwkKK30KK3B1YmxpYyBmaW5hbCB2b2lkIHB1c2hMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJLy9zZWUgY29tbWVudCBvbiBpc0xpbmVEZWxpbWl0ZXIoY2hhcikgZm9yIHRoZSB1c2Ugb2YgJ1xuJyBhbmQgJ1xyJworCWZpbmFsIGludCBJTkNSRU1FTlQgPSAyNTA7CisJCisJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgeworCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY3VycmVudCBsaW5lIGZvciBub24gZXh0ZXJuYWxpemUgc3RyaW5ncyBwdXJwb3NlCisJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwl9CisJLy9jdXJyZW50Q2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uIGN1cnJlbnRQb3NpdGlvbi0xCisKKwkvLyBjciAwMDBECisJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgeworCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJaWYgKChsaW5lUHRyID4gMCkgJiYgKGxpbmVFbmRzW2xpbmVQdHJdID49IHNlcGFyYXRvclBvcykpIHJldHVybjsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNSLSIgKyBzZXBhcmF0b3JQb3MpOworCQl0cnkgeworCQkJbGluZUVuZHNbKytsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkvL2xpbmVQdHIgdmFsdWUgaXMgY29ycmVjdAorCQkJaW50IG9sZExlbmd0aCA9IGxpbmVFbmRzLmxlbmd0aDsKKwkJCWludFtdIG9sZCA9IGxpbmVFbmRzOworCQkJbGluZUVuZHMgPSBuZXcgaW50W29sZExlbmd0aCArIElOQ1JFTUVOVF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgbGluZUVuZHMsIDAsIG9sZExlbmd0aCk7CisJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJfQorCQkvLyBsb29rLWFoZWFkIGZvciBtZXJnZWQgY3IrbGYKKwkJdHJ5IHsKKwkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2stYWhlYWQgTEYtIiArIGN1cnJlbnRQb3NpdGlvbik7CQkJCisJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb247CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJd2FzQWNyID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXdhc0FjciA9IHRydWU7CisJCQl9CisJCX0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQl3YXNBY3IgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbGYgMDAwQQorCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB7IC8vbXVzdCBtZXJnZSBldmVudHVhbCBjciBmb2xsb3dlZCBieSBsZgorCQkJaWYgKHdhc0FjciAmJiAobGluZUVuZHNbbGluZVB0cl0gPT0gKGN1cnJlbnRQb3NpdGlvbiAtIDIpKSkgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZXJnZSBMRi0iICsgKGN1cnJlbnRQb3NpdGlvbiAtIDEpKTsJCQkJCQkJCisJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb24gLSAxOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQlpZiAoKGxpbmVQdHIgPiAwKSAmJiAobGluZUVuZHNbbGluZVB0cl0gPj0gc2VwYXJhdG9yUG9zKSkgcmV0dXJuOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTEYtIiArIHNlcGFyYXRvclBvcyk7CQkJCQkJCQorCQkJCXRyeSB7CisJCQkJCWxpbmVFbmRzWysrbGluZVB0cl0gPSBzZXBhcmF0b3JQb3M7CisJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vbGluZVB0ciB2YWx1ZSBpcyBjb3JyZWN0CisJCQkJCWludCBvbGRMZW5ndGggPSBsaW5lRW5kcy5sZW5ndGg7CisJCQkJCWludFtdIG9sZCA9IGxpbmVFbmRzOworCQkJCQlsaW5lRW5kcyA9IG5ldyBpbnRbb2xkTGVuZ3RoICsgSU5DUkVNRU5UXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGxpbmVFbmRzLCAwLCBvbGRMZW5ndGgpOworCQkJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJCQl9CisJCQl9CisJCQl3YXNBY3IgPSBmYWxzZTsKKwkJfQorCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHB1c2hVbmljb2RlTGluZVNlcGFyYXRvcigpIHsKKwkvLyBpc1VuaWNvZGUgbWVhbnMgdGhhdCB0aGUgXHIgb3IgXG4gaGFzIGJlZW4gcmVhZCBhcyBhIHVuaWNvZGUgY2hhcmFjdGVyCisJCisJLy9zZWUgY29tbWVudCBvbiBpc0xpbmVEZWxpbWl0ZXIoY2hhcikgZm9yIHRoZSB1c2Ugb2YgJ1xuJyBhbmQgJ1xyJworCisJZmluYWwgaW50IElOQ1JFTUVOVCA9IDI1MDsKKwkvL2N1cnJlbnRDaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gY3VycmVudFBvc2l0aW9uLTEKKworCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKKwkvLyByZWluaXRpYWxpemUgdGhlIGN1cnJlbnQgbGluZSBmb3Igbm9uIGV4dGVybmFsaXplIHN0cmluZ3MgcHVycG9zZQorCQljdXJyZW50TGluZSA9IG51bGw7CisJfQorCQorCS8vIGNyIDAwMEQKKwlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB7CisJCWludCBzZXBhcmF0b3JQb3MgPSBjdXJyZW50UG9zaXRpb24gLSA2OworCQlpZiAoKGxpbmVQdHIgPiAwKSAmJiAobGluZUVuZHNbbGluZVB0cl0gPj0gc2VwYXJhdG9yUG9zKSkgcmV0dXJuOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ1ItIiArIHNlcGFyYXRvclBvcyk7CisJCXRyeSB7CisJCQlsaW5lRW5kc1srK2xpbmVQdHJdID0gc2VwYXJhdG9yUG9zOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCS8vbGluZVB0ciB2YWx1ZSBpcyBjb3JyZWN0CisJCQlpbnQgb2xkTGVuZ3RoID0gbGluZUVuZHMubGVuZ3RoOworCQkJaW50W10gb2xkID0gbGluZUVuZHM7CisJCQlsaW5lRW5kcyA9IG5ldyBpbnRbb2xkTGVuZ3RoICsgSU5DUkVNRU5UXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob2xkLCAwLCBsaW5lRW5kcywgMCwgb2xkTGVuZ3RoKTsKKwkJCWxpbmVFbmRzW2xpbmVQdHJdID0gc2VwYXJhdG9yUG9zOworCQl9CisJCS8vIGxvb2stYWhlYWQgZm9yIG1lcmdlZCBjcitsZgorCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2stYWhlYWQgTEYtIiArIGN1cnJlbnRQb3NpdGlvbik7CQkJCisJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJd2FzQWNyID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl3YXNBY3IgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbGYgMDAwQQorCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB7IC8vbXVzdCBtZXJnZSBldmVudHVhbCBjciBmb2xsb3dlZCBieSBsZgorCQkJaWYgKHdhc0FjciAmJiAobGluZUVuZHNbbGluZVB0cl0gPT0gKGN1cnJlbnRQb3NpdGlvbiAtIDcpKSkgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZXJnZSBMRi0iICsgKGN1cnJlbnRQb3NpdGlvbiAtIDEpKTsJCQkJCQkJCisJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb24gLSA2OworCQkJfSBlbHNlIHsKKwkJCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gNjsKKwkJCQlpZiAoKGxpbmVQdHIgPiAwKSAmJiAobGluZUVuZHNbbGluZVB0cl0gPj0gc2VwYXJhdG9yUG9zKSkgcmV0dXJuOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTEYtIiArIHNlcGFyYXRvclBvcyk7CQkJCQkJCQorCQkJCXRyeSB7CisJCQkJCWxpbmVFbmRzWysrbGluZVB0cl0gPSBzZXBhcmF0b3JQb3M7CisJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vbGluZVB0ciB2YWx1ZSBpcyBjb3JyZWN0CisJCQkJCWludCBvbGRMZW5ndGggPSBsaW5lRW5kcy5sZW5ndGg7CisJCQkJCWludFtdIG9sZCA9IGxpbmVFbmRzOworCQkJCQlsaW5lRW5kcyA9IG5ldyBpbnRbb2xkTGVuZ3RoICsgSU5DUkVNRU5UXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGxpbmVFbmRzLCAwLCBvbGRMZW5ndGgpOworCQkJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJCQl9CisJCQl9CisJCQl3YXNBY3IgPSBmYWxzZTsKKwkJfQorCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHJlY29yZENvbW1lbnQoYm9vbGVhbiBpc0phdmFkb2MpIHsKKworCS8vIGEgbmV3IGFubm90YXRpb24gY29tbWVudCBpcyByZWNvcmRlZAorCXRyeSB7CisJCWNvbW1lbnRTdG9wc1srK2NvbW1lbnRQdHJdID0gaXNKYXZhZG9jID8gY3VycmVudFBvc2l0aW9uIDogLWN1cnJlbnRQb3NpdGlvbjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gY29tbWVudFN0b3BzLmxlbmd0aDsKKwkJaW50W10gb2xkU3RhY2sgPSBjb21tZW50U3RvcHM7CisJCWNvbW1lbnRTdG9wcyA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAzMF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkU3RhY2ssIDAsIGNvbW1lbnRTdG9wcywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQljb21tZW50U3RvcHNbY29tbWVudFB0cl0gPSBpc0phdmFkb2MgPyBjdXJyZW50UG9zaXRpb24gOiAtY3VycmVudFBvc2l0aW9uOworCQkvL2dyb3dzIHRoZSBwb3NpdGlvbnMgYnVmZmVycyB0b28KKwkJaW50W10gb2xkID0gY29tbWVudFN0YXJ0czsKKwkJY29tbWVudFN0YXJ0cyA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAzMF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkLCAwLCBjb21tZW50U3RhcnRzLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJfQorCisJLy90aGUgYnVmZmVyIGlzIG9mIGEgY29ycmVjdCBzaXplIGhlcmUKKwljb21tZW50U3RhcnRzW2NvbW1lbnRQdHJdID0gc3RhcnRQb3NpdGlvbjsKK30KK3B1YmxpYyB2b2lkIHJlc2V0VG8oaW50IGJlZ2luLCBpbnQgZW5kKSB7CisJLy9yZXNldCB0aGUgc2Nhbm5lciB0byBhIGdpdmVuIHBvc2l0aW9uIHdoZXJlIGl0IG1heSByZXNjYW4gYWdhaW4KKworCWRpZXQgPSBmYWxzZTsKKwlpbml0aWFsUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uID0gYmVnaW47CisJZW9mUG9zaXRpb24gPSBlbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IGVuZCArIDEgOiBlbmQ7CisJY29tbWVudFB0ciA9IC0xOyAvLyByZXNldCBjb21tZW50IHN0YWNrCit9CisKK3B1YmxpYyBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkvLyB0aGUgc3RyaW5nIHdpdGggIlxcdSIgaXMgYSBsZWdhbCBzdHJpbmcgb2YgdHdvIGNoYXJzIFwgYW5kIHUKKwkvL3RodXMgd2UgdXNlIGEgZGlyZWN0IGFjY2VzcyB0byB0aGUgc291cmNlIChmb3IgcmVndWxhciBjYXNlcykuCisKKwlpZiAodW5pY29kZUFzQmFja1NsYXNoKSB7CisJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKSAmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCX0gZWxzZSB7CisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQljdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXTsKKwlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJY2FzZSAnYicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcYic7CisJCQlicmVhazsKKwkJY2FzZSAndCcgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcdCc7CisJCQlicmVhazsKKwkJY2FzZSAnbicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcbic7CisJCQlicmVhazsKKwkJY2FzZSAnZicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcZic7CisJCQlicmVhazsKKwkJY2FzZSAncicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdccic7CisJCQlicmVhazsKKwkJY2FzZSAnXCInIDoKKwkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAnXCInOworCQkJYnJlYWs7CisJCWNhc2UgJ1wnJyA6CisJCQljdXJyZW50Q2hhcmFjdGVyID0gJ1wnJzsKKwkJCWJyZWFrOworCQljYXNlICdcXCcgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcXCc7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQkvLyAtLS0tLS0tLS0tLW9jdGFsIGVzY2FwZS0tLS0tLS0tLS0tLS0tCisJCQkvLyBPY3RhbERpZ2l0CisJCQkvLyBPY3RhbERpZ2l0IE9jdGFsRGlnaXQKKwkJCS8vIFplcm9Ub1RocmVlIE9jdGFsRGlnaXQgT2N0YWxEaWdpdAorCisJCQlpbnQgbnVtYmVyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCWlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPD0gNykgeworCQkJCWJvb2xlYW4gemVyb1RvVGhyZWVOb3QgPSBudW1iZXIgPiAzOworCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpIHsKKwkJCQkJaW50IGRpZ2l0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQkJaWYgKGRpZ2l0ID49IDAgJiYgZGlnaXQgPD0gNykgeworCQkJCQkJbnVtYmVyID0gKG51bWJlciAqIDgpICsgZGlnaXQ7CisJCQkJCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSB7CisJCQkJCQkJaWYgKHplcm9Ub1RocmVlTm90KSB7Ly8gaGFzIHJlYWQgXE5vdFplcm9Ub1RocmVlIE9jdGFsRGlnaXQgRGlnaXQgLS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgorCQkJCQkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkaWdpdCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoY3VycmVudENoYXJhY3Rlcik7CisJCQkJCQkJCWlmIChkaWdpdCA+PSAwICYmIGRpZ2l0IDw9IDcpeyAvLyBoYXMgcmVhZCBcWmVyb1RvVGhyZWUgT2N0YWxEaWdpdCBPY3RhbERpZ2l0CisJCQkJCQkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBkaWdpdDsKKwkJCQkJCQkJfSBlbHNlIHsvLyBoYXMgcmVhZCBcWmVyb1RvVGhyZWUgT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsgLy8gaGFzIHJlYWQgXE9jdGFsRGlnaXQgTm9uRGlnaXQtLT4gaWdub3JlIGxhc3QgY2hhcmFjdGVyCisJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IE5vbk9jdGFsRGlnaXQtLT4gaWdub3JlIGxhc3QgY2hhcmFjdGVyCQkJCQkJCisJCQkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKKwkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJfQorCQkJCWlmIChudW1iZXIgPiAyNTUpCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9FU0NBUEUpOworCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgbnVtYmVyOworCQkJfSBlbHNlCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0VTQ0FQRSk7CisJfQorfQorcHVibGljIGludCBzY2FuSWRlbnRpZmllck9yS2V5d29yZCgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCS8vdGVzdCBrZXl3b3JkcworCisJLy9maXJzdCBkaXNwYXRjaCBvbiB0aGUgZmlyc3QgY2hhci4KKwkvL3RoZW4gdGhlIGxlbmd0aC4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkvL2tleXdvcnMgd2l0aCB0aGUgc2FtZSBsZW5ndGggQU5EIHRoZSBzYW1lIGZpcnN0IGNoYXIsIHRoZW4gZG8gYW5vdGhlcgorCS8vZGlzcHRhY2ggb24gdGhlIHNlY29uZCBjaGFyIDotKS4uLmNvb2wuLi4uYnV0IGZhc3QgIQorCXVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IGZhbHNlOworCXdoaWxlIChnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkpIHt9OworCisJaW50IGluZGV4LCBsZW5ndGg7CisJY2hhcltdIGRhdGE7CisJY2hhciBmaXJzdExldHRlcjsKKwlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkKKworCQkvL3F1aWNrIHRlc3Qgb24gbGVuZ3RoID09IDEgYnV0IG5vdCBvbiBsZW5ndGggPiAxMiB3aGlsZSBtb3N0IGlkZW50aWZpZXIKKwkJLy9oYXZlIGEgbGVuZ3RoIHdoaWNoIGlzIDw9IDEyLi4uYnV0IHRoZXJlIGFyZSBsb3RzIG9mIGlkZW50aWZpZXIgd2l0aAorCQkvL29ubHkgb25lIGNoYXIuLi4uCisKKwkJeworCQlpZiAoKGxlbmd0aCA9IGN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pID09IDEpCisJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJZGF0YSA9IHNvdXJjZTsKKwkJaW5kZXggPSBzdGFydFBvc2l0aW9uOworCX0gZWxzZSB7CisJCWlmICgobGVuZ3RoID0gd2l0aG91dFVuaWNvZGVQdHIpID09IDEpCisJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJZGF0YSA9IHdpdGhvdXRVbmljb2RlQnVmZmVyOworCQlpbmRleCA9IDE7CisJfQorCisJZmlyc3RMZXR0ZXIgPSBkYXRhW2luZGV4XTsKKwlzd2l0Y2ggKGZpcnN0TGV0dGVyKSB7CisKKwkJY2FzZSAnYScgOiAKKwkJCXN3aXRjaChsZW5ndGgpIHsKKwkJCQljYXNlIDg6IC8vYWJzdHJhY3QKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lYWJzdHJhY3Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQkJfQorCQkJCWNhc2UgNjogLy8gYXNzZXJ0CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKSB7CisJCQkJCQkJaWYgKGFzc2VydE1vZGUpIHsKKwkJCQkJCQkJY29udGFpbnNBc3NlcnRLZXl3b3JkID0gdHJ1ZTsKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWFzc2VydDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl1c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSB0cnVlOworCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsJCQkJCQkJCQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCQl9CisJCQkJZGVmYXVsdDogCisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCQljYXNlICdiJyA6IC8vYm9vbGVhbiBicmVhayBieXRlCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgNCA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneScpICYmIChkYXRhWysraW5kZXhdID09ICd0JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVieXRlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2snKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVicmVhazsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA3IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICduJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lYm9vbGVhbjsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2MnIDogLy9jYXNlIGNoYXIgY2F0Y2ggY29uc3QgY2xhc3MgY29udGludWUKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdzJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lY2FzZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAnaCcpICYmIChkYXRhWysraW5kZXhdID09ICdhJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lY2hhcjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3QnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpICYmIChkYXRhWysraW5kZXhdID09ICdoJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWNhdGNoOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdsJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWNsYXNzOworCQkJCQkJZWxzZQorCQkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ28nKQorCQkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUVSUk9SOyAvL2NvbnN0IGlzIG5vdCB1c2VkIGluIGphdmEgPz8/Pz8/PworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDggOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVjb250aW51ZTsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2QnIDogLy9kZWZhdWx0IGRvIGRvdWJsZQorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDIgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVkbzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd1JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZG91YmxlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDcgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVkZWZhdWx0OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQl9CisJCWNhc2UgJ2UnIDogLy9lbHNlIGV4dGVuZHMKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdsJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWVsc2U7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWV4dGVuZHM7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICdmJyA6IC8vZmluYWwgZmluYWxseSBmbG9hdCBmb3IgZmFsc2UKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSAzIDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVmb3I7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNSA6CisJCQkJCWlmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZmluYWw7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAnbCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVmbG9hdDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdhJykKKwkJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKQorCQkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVmYWxzZTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAneScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWZpbmFsbHk7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCQljYXNlICdnJyA6IC8vZ290bworCQkJaWYgKGxlbmd0aCA9PSA0KSB7CisJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbycpKSB7CisJCQkJCXJldHVybiBUb2tlbk5hbWVFUlJPUjsKKwkJCQl9CisJCQl9IC8vbm8gZ290byBpbiBqYXZhIGFyZSBhbGxvd2VkLCBzbyB3aHkgamF2YSByZW1vdmVzIHRoaXMga2V5d29yZCA/Pz8KKwkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCWNhc2UgJ2knIDogLy9pZiBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIGludCBpbnRlcmZhY2UKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSAyIDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWlmOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDMgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ24nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWludDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdtJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdwJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1laW1wb3J0OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDkgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVpbnRlcmZhY2U7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgMTAgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnbScpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3AnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ20nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWltcGxlbWVudHM7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCWVsc2UKKwkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ24nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICduJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZicpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVpbnN0YW5jZW9mOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2wnIDogLy9sb25nCisJCQlpZiAobGVuZ3RoID09IDQpIHsKKwkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdnJykpIHsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZWxvbmc7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisKKwkJY2FzZSAnbicgOiAvL25hdGl2ZSBuZXcgbnVsbAorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDMgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2UnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAndycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZW5ldzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICd1JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZW51bGw7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNiA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKSB7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lbmF0aXZlOworCQkJCQl9IGVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICdwJyA6IC8vcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICd1JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVwdWJsaWM7CisJCQkJCX0gZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA3IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaycpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdnJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVwYWNrYWdlOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdyJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3YnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVwcml2YXRlOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA5IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdkJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVwcm90ZWN0ZWQ7CisJCQkJCX0gZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQl9CisKKwkJY2FzZSAncicgOiAvL3JldHVybgorCQkJaWYgKGxlbmd0aCA9PSA2KSB7CisJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndScpCisJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKSkgeworCQkJCQlyZXR1cm4gVG9rZW5OYW1lcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCWNhc2UgJ3MnIDogLy9zaG9ydCBzdGF0aWMgc3VwZXIgc3dpdGNoIHN5bmNocm9uaXplZCBzdHJpY3RmcAorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd0JykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXNob3J0OworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICd1JykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXN1cGVyOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lc3RhdGljOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCWVsc2UKKwkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ3cnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdoJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXN3aXRjaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDggOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3AnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVzdHJpY3RmcDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSAxMiA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAneicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZCcpKSB7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lc3luY2hyb25pemVkOworCQkJCQl9IGVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd0JyA6IC8vdHJ5IHRocm93IHRocm93cyB0cmFuc2llbnQgdGhpcyB0cnVlCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgMyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd5JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldHJ5OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDQgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2gnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpICYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldGhpczsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd1JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldHJ1ZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2gnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3cnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWV0aHJvdzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdoJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd3JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldGhyb3dzOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDkgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkgeworCQkJCQkJcmV0dXJuIFRva2VuTmFtZXRyYW5zaWVudDsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd2JyA6IC8vdm9pZCB2b2xhdGlsZQorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDQgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpICYmIChkYXRhWysraW5kZXhdID09ICdkJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldm9pZDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA4IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWV2b2xhdGlsZTsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd3JyA6IC8vd2hpbGUgd2lkZWZwCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgNSA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZXdoaWxlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJLy9jYXNlIDY6aWYgKCAoZGF0YVsrK2luZGV4XSA9PSdpJykgJiYgKGRhdGFbKytpbmRleF09PSdkJykgJiYgKGRhdGFbKytpbmRleF09PSdlJykgJiYgKGRhdGFbKytpbmRleF09PSdmJykmJiAoZGF0YVsrK2luZGV4XT09J3AnKSkKKwkJCQkJLy9yZXR1cm4gVG9rZW5OYW1ld2lkZWZwIDsKKwkJCQkJLy9lbHNlCisJCQkJCS8vcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWRlZmF1bHQgOgorCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJfQorfQorcHVibGljIGludCBzY2FuTnVtYmVyKGJvb2xlYW4gZG90UHJlZml4KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKworCS8vd2hlbiBlbnRlcmluZyB0aGlzIG1ldGhvZCB0aGUgY3VycmVudENoYXJhY3RlciBpcyB0aGUgZmlydAorCS8vZGlnaXQgb2YgdGhlIG51bWJlciAsIGkuZS4gaXQgbWF5IGJlIHByZWNlZWRlZCBieSBhIC4gd2hlbgorCS8vZG90UHJlZml4IGlzIHRydWUKKworCWJvb2xlYW4gZmxvYXRpbmcgPSBkb3RQcmVmaXg7CisJaWYgKCghZG90UHJlZml4KSAmJiAoY3VycmVudENoYXJhY3RlciA9PSAnMCcpKSB7CisJCWlmIChnZXROZXh0Q2hhcigneCcsICdYJykgPj0gMCkgeyAvLy0tLS0tLS0tLS1oZXhhLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vZm9yY2UgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGhleGEgbnVtYmVyIGRvIGV4aXN0Li4uCisJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQl9CisJCQl9CisJCQlpZiAoQ2hhcmFjdGVyLmRpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIsIDE2KSA9PSAtMSkKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSEVYQSk7CisJCQkvLy0tLWVuZCBmb3JjaW5nLS0KKwkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoMTYpKSB7fTsKKwkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkKKwkJCQlyZXR1cm4gVG9rZW5OYW1lTG9uZ0xpdGVyYWw7CisJCQllbHNlCisJCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOworCQl9CisKKwkJLy90aGVyZSBpcyB4IG9yIFggaW4gdGhlIG51bWJlcgorCQkvL3BvdGVudGlhbCBvY3RhbCAhIC4uLiBzb21lIG9uZSBtYXkgd3JpdGUgMDAwMDk5LjAgISB0aHVzIDAwMTAwIDwgMDAwNzguMCBpcyB0cnVlICEhISEhIGNyYXp5IGxhbmd1YWdlCisJCWlmIChnZXROZXh0Q2hhckFzRGlnaXQoKSkgeyAvLy0tLS0tLS0tLS0tLS1wb3RlbnRpYWwgb2N0YWwtLS0tLS0tLS0tLS0tLS0tLQorCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKKworCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOworCQkJfQorCisJCQlpZiAoZ2V0TmV4dENoYXIoJ2YnLCAnRicpID49IDApIHsKKwkJCQlyZXR1cm4gVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw7CisJCQl9CisKKwkJCWlmIChnZXROZXh0Q2hhcignZCcsICdEJykgPj0gMCkgeworCQkJCXJldHVybiBUb2tlbk5hbWVEb3VibGVMaXRlcmFsOworCQkJfSBlbHNlIHsgLy9tYWtlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG9jdGFsIGFuZCBmbG9hdCAuLi4uCisJCQkJaWYgKGdldE5leHRDaGFyKCcuJykpIHsgLy9iaW5nbyAhIC4uLi4KKwkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKKwkJCQkJaWYgKGdldE5leHRDaGFyKCdlJywgJ0UnKSA+PSAwKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICctJykKKwkJCQkJCQl8fCAoY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlcikpCisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKKwkJCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsOworCQkJCQlnZXROZXh0Q2hhcignZCcsICdEJyk7IC8vanVtcCBvdmVyIHBvdGVudGlhbCBkIG9yIEQKKwkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGNhcnJ5IG9uICovCisJCX0KKwl9CisKKwl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpIHt9OworCisJaWYgKCghZG90UHJlZml4KSAmJiAoZ2V0TmV4dENoYXIoJ2wnLCAnTCcpID49IDApKQorCQlyZXR1cm4gVG9rZW5OYW1lTG9uZ0xpdGVyYWw7CisKKwlpZiAoKCFkb3RQcmVmaXgpICYmIChnZXROZXh0Q2hhcignLicpKSkgeyAvL2RlY2ltYWwgcGFydCB0aGF0IGNhbiBiZSBlbXB0eQorCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpIHt9OworCQlmbG9hdGluZyA9IHRydWU7CisJfQorCisJLy9pZiBmbG9hdGluZyBpcyB0cnVlIGJvdGggZXhwb25hbnQgYW5kIHN1ZmZpeCBtYXkgYmUgb3B0aW9uYWwKKworCWlmIChnZXROZXh0Q2hhcignZScsICdFJykgPj0gMCkgeworCQlmbG9hdGluZyA9IHRydWU7CisJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQl9IGVsc2UgeworCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQl9CisJCX0KKworCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJy0nKQorCQkJfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJysnKSkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyKSkKKwkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9GTE9BVCk7CisJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307CisJfQorCisJaWYgKGdldE5leHRDaGFyKCdkJywgJ0QnKSA+PSAwKQorCQlyZXR1cm4gVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDsKKwlpZiAoZ2V0TmV4dENoYXIoJ2YnLCAnRicpID49IDApCisJCXJldHVybiBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDsKKworCS8vdGhlIGxvbmcgZmxhZyBoYXMgYmVlbiB0ZXN0ZWQgYmVmb3JlCisKKwlyZXR1cm4gZmxvYXRpbmcgPyBUb2tlbk5hbWVEb3VibGVMaXRlcmFsIDogVG9rZW5OYW1lSW50ZWdlckxpdGVyYWw7Cit9CisvKioKKyAqIFNlYXJjaCB0aGUgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIHBvc2l0aW9uCisgKgorICovCitwdWJsaWMgZmluYWwgaW50IGdldExpbmVOdW1iZXIoaW50IHBvc2l0aW9uKSB7CisKKwlpZiAobGluZUVuZHMgPT0gbnVsbCkKKwkJcmV0dXJuIDE7CisJaW50IGxlbmd0aCA9IGxpbmVQdHIrMTsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiAxOworCWludCBnID0gMCwgZCA9IGxlbmd0aCAtIDE7CisJaW50IG0gPSAwOworCXdoaWxlIChnIDw9IGQpIHsKKwkJbSA9IChnICsgZCkgLzI7CisJCWlmIChwb3NpdGlvbiA8IGxpbmVFbmRzW21dKSB7CisJCQlkID0gbS0xOworCQl9IGVsc2UgaWYgKHBvc2l0aW9uID4gbGluZUVuZHNbbV0pIHsKKwkJCWcgPSBtKzE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbSArIDE7CisJCX0KKwl9CisJaWYgKHBvc2l0aW9uIDwgbGluZUVuZHNbbV0pIHsKKwkJcmV0dXJuIG0rMTsKKwl9CisJcmV0dXJuIG0rMjsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIHNldFNvdXJjZShjaGFyW10gc291cmNlKXsKKwkvL3RoZSBzb3VyY2UtYnVmZmVyIGlzIHNldCB0byBzb3VyY2VTdHJpbmcKKworCWlmIChzb3VyY2UgPT0gbnVsbCkgeworCQl0aGlzLnNvdXJjZSA9IG5ldyBjaGFyWzBdOworCX0gZWxzZSB7CisJCXRoaXMuc291cmNlID0gc291cmNlOworCX0KKwlzdGFydFBvc2l0aW9uID0gLTE7CisJaW5pdGlhbFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uID0gMDsKKwljb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsKKwl3aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW3RoaXMuc291cmNlLmxlbmd0aF07CisKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlpZiAoc3RhcnRQb3NpdGlvbiA9PSBzb3VyY2UubGVuZ3RoKQorCQlyZXR1cm4gIkVPRlxuXG4iICsgbmV3IFN0cmluZyhzb3VyY2UpOyAvLyROT04tTkxTLTEkCisJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IHNvdXJjZS5sZW5ndGgpCisJCXJldHVybiAiYmVoaW5kIHRoZSBFT0YgOi0oIC4uLi5cblxuIiArIG5ldyBTdHJpbmcoc291cmNlKTsgLy8kTk9OLU5MUy0xJAorCisJY2hhciBmcm9udFtdID0gbmV3IGNoYXJbc3RhcnRQb3NpdGlvbl07CisJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIDAsIGZyb250LCAwLCBzdGFydFBvc2l0aW9uKTsKKworCWludCBtaWRkbGVMZW5ndGggPSAoY3VycmVudFBvc2l0aW9uIC0gMSkgLSBzdGFydFBvc2l0aW9uICsgMTsKKwljaGFyIG1pZGRsZVtdOworCWlmIChtaWRkbGVMZW5ndGggPiAtMSkgeworCQltaWRkbGUgPSBuZXcgY2hhclttaWRkbGVMZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJc291cmNlLCAKKwkJCXN0YXJ0UG9zaXRpb24sIAorCQkJbWlkZGxlLCAKKwkJCTAsIAorCQkJbWlkZGxlTGVuZ3RoKTsKKwl9IGVsc2UgeworCQltaWRkbGUgPSBuZXcgY2hhclswXTsKKwl9CisJCisJY2hhciBlbmRbXSA9IG5ldyBjaGFyW3NvdXJjZS5sZW5ndGggLSAoY3VycmVudFBvc2l0aW9uIC0gMSldOworCVN5c3RlbS5hcnJheWNvcHkoCisJCXNvdXJjZSwgCisJCShjdXJyZW50UG9zaXRpb24gLSAxKSArIDEsIAorCQllbmQsIAorCQkwLCAKKwkJc291cmNlLmxlbmd0aCAtIChjdXJyZW50UG9zaXRpb24gLSAxKSAtIDEpOworCQorCXJldHVybiBuZXcgU3RyaW5nKGZyb250KQorCQkrICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblN0YXJ0cyBoZXJlIC0tPiIgLy8kTk9OLU5MUy0xJAorCQkrIG5ldyBTdHJpbmcobWlkZGxlKQorCQkrICI8LS0gRW5kcyBoZXJlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iIC8vJE5PTi1OTFMtMSQKKwkJKyBuZXcgU3RyaW5nKGVuZCk7IAorfQorcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ0FjdGlvbihpbnQgYWN0KSB7CisJc3dpdGNoIChhY3QpIHsKKwkJY2FzZSBUb2tlbk5hbWVJZGVudGlmaWVyIDoKKwkJCXJldHVybiAiSWRlbnRpZmllcigiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljYXNlIFRva2VuTmFtZWFic3RyYWN0IDoKKwkJCXJldHVybiAiYWJzdHJhY3QiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lYm9vbGVhbiA6CisJCQlyZXR1cm4gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lYnJlYWsgOgorCQkJcmV0dXJuICJicmVhayI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVieXRlIDoKKwkJCXJldHVybiAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVjYXNlIDoKKwkJCXJldHVybiAiY2FzZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVjYXRjaCA6CisJCQlyZXR1cm4gImNhdGNoIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWNoYXIgOgorCQkJcmV0dXJuICJjaGFyIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWNsYXNzIDoKKwkJCXJldHVybiAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lY29udGludWUgOgorCQkJcmV0dXJuICJjb250aW51ZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVkZWZhdWx0IDoKKwkJCXJldHVybiAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVkbyA6CisJCQlyZXR1cm4gImRvIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWRvdWJsZSA6CisJCQlyZXR1cm4gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVlbHNlIDoKKwkJCXJldHVybiAiZWxzZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoKKwkJCXJldHVybiAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVmYWxzZSA6CisJCQlyZXR1cm4gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWZpbmFsIDoKKwkJCXJldHVybiAiZmluYWwiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lZmluYWxseSA6CisJCQlyZXR1cm4gImZpbmFsbHkiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOgorCQkJcmV0dXJuICJmbG9hdCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVmb3IgOgorCQkJcmV0dXJuICJmb3IiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1laWYgOgorCQkJcmV0dXJuICJpZiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoKKwkJCXJldHVybiAiaW1wbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVpbXBvcnQgOgorCQkJcmV0dXJuICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1laW5zdGFuY2VvZiA6CisJCQlyZXR1cm4gImluc3RhbmNlb2YiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1laW50IDoKKwkJCXJldHVybiAiaW50IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWludGVyZmFjZSA6CisJCQlyZXR1cm4gImludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVsb25nIDoKKwkJCXJldHVybiAibG9uZyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVuYXRpdmUgOgorCQkJcmV0dXJuICJuYXRpdmUiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lbmV3IDoKKwkJCXJldHVybiAibmV3IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZW51bGwgOgorCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXBhY2thZ2UgOgorCQkJcmV0dXJuICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXByaXZhdGUgOgorCQkJcmV0dXJuICJwcml2YXRlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXByb3RlY3RlZCA6CisJCQlyZXR1cm4gInByb3RlY3RlZCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVwdWJsaWMgOgorCQkJcmV0dXJuICJwdWJsaWMiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lcmV0dXJuIDoKKwkJCXJldHVybiAicmV0dXJuIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXNob3J0IDoKKwkJCXJldHVybiAic2hvcnQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lc3RhdGljIDoKKwkJCXJldHVybiAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXN1cGVyIDoKKwkJCXJldHVybiAic3VwZXIiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lc3dpdGNoIDoKKwkJCXJldHVybiAic3dpdGNoIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXN5bmNocm9uaXplZCA6CisJCQlyZXR1cm4gInN5bmNocm9uaXplZCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV0aGlzIDoKKwkJCXJldHVybiAidGhpcyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV0aHJvdyA6CisJCQlyZXR1cm4gInRocm93IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXRocm93cyA6CisJCQlyZXR1cm4gInRocm93cyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV0cmFuc2llbnQgOgorCQkJcmV0dXJuICJ0cmFuc2llbnQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ldHJ1ZSA6CisJCQlyZXR1cm4gInRydWUiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ldHJ5IDoKKwkJCXJldHVybiAidHJ5IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXZvaWQgOgorCQkJcmV0dXJuICJ2b2lkIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXZvbGF0aWxlIDoKKwkJCXJldHVybiAidm9sYXRpbGUiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ld2hpbGUgOgorCQkJcmV0dXJuICJ3aGlsZSI7IC8vJE5PTi1OTFMtMSQKKworCQljYXNlIFRva2VuTmFtZUludGVnZXJMaXRlcmFsIDoKKwkJCXJldHVybiAiSW50ZWdlcigiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljYXNlIFRva2VuTmFtZUxvbmdMaXRlcmFsIDoKKwkJCXJldHVybiAiTG9uZygiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljYXNlIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsIDoKKwkJCXJldHVybiAiRmxvYXQoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJY2FzZSBUb2tlbk5hbWVEb3VibGVMaXRlcmFsIDoKKwkJCXJldHVybiAiRG91YmxlKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNhc2UgVG9rZW5OYW1lQ2hhcmFjdGVyTGl0ZXJhbCA6CisJCQlyZXR1cm4gIkNoYXIoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJY2FzZSBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsIDoKKwkJCXJldHVybiAiU3RyaW5nKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJY2FzZSBUb2tlbk5hbWVQTFVTX1BMVVMgOgorCQkJcmV0dXJuICIrKyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVNSU5VU19NSU5VUyA6CisJCQlyZXR1cm4gIi0tIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMIDoKKwkJCXJldHVybiAiPT0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTEVTU19FUVVBTCA6CisJCQlyZXR1cm4gIjw9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgOgorCQkJcmV0dXJuICI+PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVOT1RfRVFVQUwgOgorCQkJcmV0dXJuICIhPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDoKKwkJCXJldHVybiAiPDwiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOgorCQkJcmV0dXJuICI+PiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6CisJCQlyZXR1cm4gIj4+PiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVQTFVTX0VRVUFMIDoKKwkJCXJldHVybiAiKz0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTUlOVVNfRVFVQUwgOgorCQkJcmV0dXJuICItPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA6CisJCQlyZXR1cm4gIio9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZURJVklERV9FUVVBTCA6CisJCQlyZXR1cm4gIi89IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUFORF9FUVVBTCA6CisJCQlyZXR1cm4gIiY9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU9SX0VRVUFMIDoKKwkJCXJldHVybiAifD0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDoKKwkJCXJldHVybiAiXj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMIDoKKwkJCXJldHVybiAiJT0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA6CisJCQlyZXR1cm4gIjw8PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6CisJCQlyZXR1cm4gIj4+PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6CisJCQlyZXR1cm4gIj4+Pj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lT1JfT1IgOgorCQkJcmV0dXJuICJ8fCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVBTkRfQU5EIDoKKwkJCXJldHVybiAiJiYiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUExVUyA6CisJCQlyZXR1cm4gIisiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTUlOVVMgOgorCQkJcmV0dXJuICItIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU5PVCA6CisJCQlyZXR1cm4gIiEiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSIDoKKwkJCXJldHVybiAiJSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVYT1IgOgorCQkJcmV0dXJuICJeIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUFORCA6CisJCQlyZXR1cm4gIiYiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOgorCQkJcmV0dXJuICIqIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU9SIDoKKwkJCXJldHVybiAifCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVUV0lERExFIDoKKwkJCXJldHVybiAifiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVESVZJREUgOgorCQkJcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUdSRUFURVIgOgorCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUxFU1MgOgorCQkJcmV0dXJuICI8IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUxQQVJFTiA6CisJCQlyZXR1cm4gIigiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUlBBUkVOIDoKKwkJCXJldHVybiAiKSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOgorCQkJcmV0dXJuICJ7IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6CisJCQlyZXR1cm4gIn0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJcmV0dXJuICJbIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVJCUkFDS0VUIDoKKwkJCXJldHVybiAiXSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOgorCQkJcmV0dXJuICI7IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVFVRVNUSU9OIDoKKwkJCXJldHVybiAiPyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVDT0xPTiA6CisJCQlyZXR1cm4gIjoiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lQ09NTUEgOgorCQkJcmV0dXJuICIsIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZURPVCA6CisJCQlyZXR1cm4gIi4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lRVFVQUwgOgorCQkJcmV0dXJuICI9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUVPRiA6CisJCQlyZXR1cm4gIkVPRiI7IC8vJE5PTi1OTFMtMSQKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gIm5vdC1hLXRva2VuIjsgLy8kTk9OLU5MUy0xJAorCX0KK30KKworcHVibGljIFNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzKSB7CisJdGhpcyh0b2tlbml6ZUNvbW1lbnRzLCB0b2tlbml6ZVdoaXRlU3BhY2UsIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIGZhbHNlKTsKK30KKworcHVibGljIFNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzLCBib29sZWFuIGFzc2VydE1vZGUpIHsKKwl0aGlzLmVvZlBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7CisJdGhpcy50b2tlbml6ZUNvbW1lbnRzID0gdG9rZW5pemVDb21tZW50czsKKwl0aGlzLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuaXplV2hpdGVTcGFjZTsKKwl0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMgPSBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzOworCXRoaXMuYXNzZXJ0TW9kZSA9IGFzc2VydE1vZGU7Cit9CisKK3ByaXZhdGUgdm9pZCBjaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCkgIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWlmIChjdXJyZW50TGluZSA9PSBudWxsKQorCQlyZXR1cm47CisJcGFyc2VUYWdzKGN1cnJlbnRMaW5lKTsKK30KKworcHJpdmF0ZSB2b2lkIHBhcnNlVGFncyhOTFNMaW5lIGxpbmUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCVN0cmluZyBzID0gbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJaW50IHBvcyA9IHMuaW5kZXhPZihUQUdfUFJFRklYKTsKKwlpbnQgbGluZUxlbmd0aCA9IGxpbmUuc2l6ZSgpOworCXdoaWxlIChwb3MgIT0gLTEpIHsKKwkJaW50IHN0YXJ0ID0gcG9zICsgVEFHX1BSRUZJWF9MRU5HVEg7CisJCWludCBlbmQgPSBzLmluZGV4T2YoVEFHX1BPU1RGSVgsIHN0YXJ0KTsKKwkJU3RyaW5nIGluZGV4ID0gcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisJCWludCBpID0gMDsKKwkJdHJ5IHsKKwkJCWkgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGV4KSAtIDE7IC8vIFRhZ3MgYXJlIG9uZSBiYXNlZCBub3QgemVybyBiYXNlZC4KKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCWkgPSAtMTsgLy8gd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGlzIGFzIGEgdmFsaWQgTkxTIHRhZworCQl9CisJCWlmIChsaW5lLmV4aXN0cyhpKSkgeworCQkJbGluZS5zZXQoaSwgbnVsbCk7CisJCX0KKwkJcG9zID0gcy5pbmRleE9mKFRBR19QUkVGSVgsIHN0YXJ0KTsKKwl9CisKKwl0aGlzLm5vbk5MU1N0cmluZ3MgPSBuZXcgU3RyaW5nTGl0ZXJhbFtsaW5lTGVuZ3RoXTsKKwlpbnQgbm9uTkxTQ291bnRlciA9IDA7CisJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKwkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gKFN0cmluZ0xpdGVyYWwpIGl0ZXJhdG9yLm5leHQoKTsKKwkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgeworCQkJdGhpcy5ub25OTFNTdHJpbmdzW25vbk5MU0NvdW50ZXIrK10gPSBsaXRlcmFsOworCQl9CisJfQorCWlmIChub25OTFNDb3VudGVyID09IDApIHsKKwkJdGhpcy5ub25OTFNTdHJpbmdzID0gbnVsbDsKKwkJY3VycmVudExpbmUgPSBudWxsOworCQlyZXR1cm47CisJfSAKKwl0aGlzLndhc05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSB0cnVlOworCWlmIChub25OTFNDb3VudGVyICE9IGxpbmVMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm5vbk5MU1N0cmluZ3MsIDAsICh0aGlzLm5vbk5MU1N0cmluZ3MgPSBuZXcgU3RyaW5nTGl0ZXJhbFtub25OTFNDb3VudGVyXSksIDAsIG5vbk5MU0NvdW50ZXIpOworCX0KKwljdXJyZW50TGluZSA9IG51bGw7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTM1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKKworcHVibGljIGNsYXNzIFNvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHsKKwlwdWJsaWMgaW50IHNlbGVjdG9yU291cmNlRW5kOworCisJcHVibGljIFNvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpeworCQlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VGaWVsZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmRjOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VGaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CisKK3B1YmxpYyBjbGFzcyBTb3VyY2VGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgRmllbGREZWNsYXJhdGlvbiB7CisJcHVibGljIGludCBmaWVsZEVuZFBvc2l0aW9uOworcHVibGljIFNvdXJjZUZpZWxkRGVjbGFyYXRpb24oCisJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiwgCisJY2hhcltdIG5hbWUsIAorCWludCBzb3VyY2VTdGFydCwgCisJaW50IHNvdXJjZUVuZCkgeworCXN1cGVyKGluaXRpYWxpemF0aW9uLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlTWV0aG9kRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdiNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VNZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKKworcHVibGljIGNsYXNzIFNvdXJjZU1ldGhvZERlY2xhcmF0aW9uIGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24geworCXB1YmxpYyBpbnQgc2VsZWN0b3JTb3VyY2VFbmQ7CisJCisJcHVibGljIFNvdXJjZU1ldGhvZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KXsKKwkJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4ZDQxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMzUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOworCisvKioKKyAqIENvbnZlcnRlciBmcm9tIHNvdXJjZSBlbGVtZW50IHR5cGUgdG8gcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQuCisgKgorICogTGltaXRhdGlvbjoKKyAqIHwgVGhlIHNvdXJjZSBlbGVtZW50IGZpZWxkIGRvZXMgbm90IGNhcnJ5IGFueSBpbmZvcm1hdGlvbiBmb3IgaXRzIGNvbnN0YW50IHBhcnQsIHRodXMKKyAqIHwgdGhlIGNvbnZlcnRlZCBwYXJzZSB0cmVlIHdpbGwgbm90IGluY2x1ZGUgYW55IGZpZWxkIGluaXRpYWxpemF0aW9ucy4KKyAqIHwgVGhlcmVmb3JlLCBhbnkgYmluYXJ5IHByb2R1Y2VkIGJ5IGNvbXBpbGluZyBhZ2FpbnN0IGNvbnZlcnRlZCBzb3VyY2UgZWxlbWVudHMgd2lsbAorICogfCBub3QgdGFrZSBhZHZhbnRhZ2Ugb2YgcmVtb3RlIGZpZWxkIGNvbnN0YW50IGlubGluaW5nLgorICogfCBHaXZlbiB0aGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgY29udmVyc2lvbiBpcyB0byByZXNvbHZlIHJlZmVyZW5jZXMsIHRoaXMgaXMgbm90CisgKiB8IGEgcHJvYmxlbS4KKyAqCisgKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZW1iZXJUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgU291cmNlVHlwZUNvbnZlcnRlciBpbXBsZW1lbnRzIENvbXBpbGVyTW9kaWZpZXJzIHsKKworCS8qCisJICogQ29udmVydCBhIHNldCBvZiBzb3VyY2UgZWxlbWVudCB0eXBlcyBpbnRvIGEgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24KKwkgKiBUaGUgYXJndW1lbnQgdHlwZXMgYXJlIHRoZW4gYWxsIGdyb3VwZWQgaW4gdGhlIHNhbWUgdW5pdC4gVGhlIGFyZ3VtZW50IHR5cGVzIG11c3QgCisJICogYXQgbGVhc3QgY29udGFpbiBvbmUgdHlwZS4KKwkgKiBDYW4gb3B0aW9uYWxseSBpZ25vcmUgZmllbGRzICYgbWV0aG9kcyBvciBtZW1iZXIgdHlwZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGJ1aWxkQ29tcGlsYXRpb25Vbml0KAorCQlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLAorCQlib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLAorCQlib29sZWFuIG5lZWRNZW1iZXJUeXBlcywKKwkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKworCQlJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gc291cmNlVHlwZXNbMF07CisJCWlmIChzb3VyY2VUeXBlLmdldE5hbWUoKSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7IC8vIGRvIGEgYmFzaWMgdGVzdCB0aGF0IHRoZSBzb3VyY2VUeXBlIGlzIHZhbGlkCisKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0KKwkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0LCAwKTsKKwkJLy8gbm90IGZpbGxlZCBhdCB0aGlzIHBvaW50CisKKwkJLyogb25seSBwb3NpdGlvbnMgYXZhaWxhYmxlICovCisJCWludCBzdGFydCA9IHNvdXJjZVR5cGUuZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7CisJCWludCBlbmQgPSBzb3VyY2VUeXBlLmdldE5hbWVTb3VyY2VFbmQoKTsKKworCQkvKiBjb252ZXJ0IHBhY2thZ2UgYW5kIGltcG9ydHMgKi8KKwkJaWYgKHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsCisJCQkmJiBzb3VyY2VUeXBlLmdldFBhY2thZ2VOYW1lKCkubGVuZ3RoID4gMCkKKwkJCS8vIGlmIGl0cyBudWxsIHRoZW4gaXQgaXMgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlCisJCQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPQorCQkJCWNyZWF0ZUltcG9ydFJlZmVyZW5jZShzb3VyY2VUeXBlLmdldFBhY2thZ2VOYW1lKCksIHN0YXJ0LCBlbmQpOworCQljaGFyW11bXSBpbXBvcnROYW1lcyA9IHNvdXJjZVR5cGUuZ2V0SW1wb3J0cygpOworCQlpbnQgaW1wb3J0Q291bnQgPSBpbXBvcnROYW1lcyA9PSBudWxsID8gMCA6IGltcG9ydE5hbWVzLmxlbmd0aDsKKwkJY29tcGlsYXRpb25Vbml0LmltcG9ydHMgPSBuZXcgSW1wb3J0UmVmZXJlbmNlW2ltcG9ydENvdW50XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRDb3VudDsgaSsrKQorCQkJY29tcGlsYXRpb25Vbml0LmltcG9ydHNbaV0gPSBjcmVhdGVJbXBvcnRSZWZlcmVuY2UoaW1wb3J0TmFtZXNbaV0sIHN0YXJ0LCBlbmQpOworCQkvKiBjb252ZXJ0IHR5cGUocykgKi8KKwkJaW50IHR5cGVDb3VudCA9IHNvdXJjZVR5cGVzLmxlbmd0aDsKKwkJY29tcGlsYXRpb25Vbml0LnR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvblt0eXBlQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVDb3VudDsgaSsrKSB7CisJCQljb21waWxhdGlvblVuaXQudHlwZXNbaV0gPQorCQkJCWNvbnZlcnQoc291cmNlVHlwZXNbaV0sIG5lZWRGaWVsZHNBbmRNZXRob2RzLCBuZWVkTWVtYmVyVHlwZXMsIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0OworCX0KKwkKKwkvKgorCSAqIENvbnZlcnQgYSBmaWVsZCBzb3VyY2UgZWxlbWVudCBpbnRvIGEgcGFyc2VkIGZpZWxkIGRlY2xhcmF0aW9uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRmllbGREZWNsYXJhdGlvbiBjb252ZXJ0KElTb3VyY2VGaWVsZCBzb3VyY2VGaWVsZCkgeworCisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOworCisJCWludCBzdGFydCA9IHNvdXJjZUZpZWxkLmdldE5hbWVTb3VyY2VTdGFydCgpOworCQlpbnQgZW5kID0gc291cmNlRmllbGQuZ2V0TmFtZVNvdXJjZUVuZCgpOworCisJCWZpZWxkLm5hbWUgPSBzb3VyY2VGaWVsZC5nZXROYW1lKCk7CisJCWZpZWxkLnNvdXJjZVN0YXJ0ID0gc3RhcnQ7CisJCWZpZWxkLnNvdXJjZUVuZCA9IGVuZDsKKwkJZmllbGQudHlwZSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2Uoc291cmNlRmllbGQuZ2V0VHlwZU5hbWUoKSwgc3RhcnQsIGVuZCk7CisJCWZpZWxkLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VGaWVsZC5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCk7CisJCWZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc291cmNlRmllbGQuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKTsKKwkJZmllbGQubW9kaWZpZXJzID0gc291cmNlRmllbGQuZ2V0TW9kaWZpZXJzKCk7CisKKwkJLyogY29udmVyc2lvbiBvZiBmaWVsZCBjb25zdGFudDogaWYgbm90IHByZXNlbnQsIHRoZW4gY2Fubm90IGdlbmVyYXRlIGJpbmFyeSBhZ2FpbnN0IAorCQkJY29udmVydGVkIHBhcnNlIG5vZGVzICovCisJCS8qCisJCWlmIChmaWVsZC5tb2RpZmllcnMgJiBBY2NGaW5hbCl7CisJCQljaGFyW10gaW5pdGlhbGl6YXRpb25Tb3VyY2UgPSBzb3VyY2VGaWVsZC5nZXRJbml0aWFsaXphdGlvblNvdXJjZSgpOworCQl9CisJCSovCisJCXJldHVybiBmaWVsZDsKKwl9CisKKwkvKgorCSAqIENvbnZlcnQgYSBtZXRob2Qgc291cmNlIGVsZW1lbnQgaW50byBhIHBhcnNlZCBtZXRob2QvY29uc3RydWN0b3IgZGVjbGFyYXRpb24gCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBjb252ZXJ0KElTb3VyY2VNZXRob2Qgc291cmNlTWV0aG9kLCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kOworCisJCS8qIG9ubHkgc291cmNlIHBvc2l0aW9ucyBhdmFpbGFibGUgKi8KKwkJaW50IHN0YXJ0ID0gc291cmNlTWV0aG9kLmdldE5hbWVTb3VyY2VTdGFydCgpOworCQlpbnQgZW5kID0gc291cmNlTWV0aG9kLmdldE5hbWVTb3VyY2VFbmQoKTsKKworCQlpZiAoc291cmNlTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgeworCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBkZWNsID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOworCQkJZGVjbC5pc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOworCQkJbWV0aG9kID0gZGVjbDsKKwkJfSBlbHNlIHsKKwkJCU1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOworCQkJLyogY29udmVydCByZXR1cm4gdHlwZSAqLworCQkJZGVjbC5yZXR1cm5UeXBlID0KKwkJCQljcmVhdGVUeXBlUmVmZXJlbmNlKHNvdXJjZU1ldGhvZC5nZXRSZXR1cm5UeXBlTmFtZSgpLCBzdGFydCwgZW5kKTsKKwkJCW1ldGhvZCA9IGRlY2w7CisJCX0KKwkJbWV0aG9kLnNlbGVjdG9yID0gc291cmNlTWV0aG9kLmdldFNlbGVjdG9yKCk7CisJCW1ldGhvZC5tb2RpZmllcnMgPSBzb3VyY2VNZXRob2QuZ2V0TW9kaWZpZXJzKCk7CisJCW1ldGhvZC5zb3VyY2VTdGFydCA9IHN0YXJ0OworCQltZXRob2Quc291cmNlRW5kID0gZW5kOworCQltZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA9IHNvdXJjZU1ldGhvZC5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCk7CisJCW1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZU1ldGhvZC5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpOworCisJCS8qIGNvbnZlcnQgYXJndW1lbnRzICovCisJCWNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzID0gc291cmNlTWV0aG9kLmdldEFyZ3VtZW50VHlwZU5hbWVzKCk7CisJCWNoYXJbXVtdIGFyZ3VtZW50TmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0QXJndW1lbnROYW1lcygpOworCQlpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3VtZW50VHlwZU5hbWVzID09IG51bGwgPyAwIDogYXJndW1lbnRUeXBlTmFtZXMubGVuZ3RoOworCQlsb25nIHBvc2l0aW9uID0gKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kOworCQltZXRob2QuYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50W2FyZ3VtZW50Q291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnQ7IGkrKykgeworCQkJbWV0aG9kLmFyZ3VtZW50c1tpXSA9CisJCQkJbmV3IEFyZ3VtZW50KAorCQkJCQlhcmd1bWVudE5hbWVzW2ldLAorCQkJCQlwb3NpdGlvbiwKKwkJCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShhcmd1bWVudFR5cGVOYW1lc1tpXSwgc3RhcnQsIGVuZCksCisJCQkJCUFjY0RlZmF1bHQpOworCQkJLy8gZG8gbm90IGNhcmUgd2hldGhlciB3YXMgZmluYWwgb3Igbm90CisJCX0KKworCQkvKiBjb252ZXJ0IHRocm93biBleGNlcHRpb25zICovCisJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVOYW1lcyA9IHNvdXJjZU1ldGhvZC5nZXRFeGNlcHRpb25UeXBlTmFtZXMoKTsKKwkJaW50IGV4Y2VwdGlvbkNvdW50ID0gZXhjZXB0aW9uVHlwZU5hbWVzID09IG51bGwgPyAwIDogZXhjZXB0aW9uVHlwZU5hbWVzLmxlbmd0aDsKKwkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZVJlZmVyZW5jZVtleGNlcHRpb25Db3VudF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ291bnQ7IGkrKykgeworCQkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnNbaV0gPQorCQkJCWNyZWF0ZVR5cGVSZWZlcmVuY2UoZXhjZXB0aW9uVHlwZU5hbWVzW2ldLCBzdGFydCwgZW5kKTsKKwkJfQorCQlyZXR1cm4gbWV0aG9kOworCX0KKworCS8qCisJICogQ29udmVydCBhIHNvdXJjZSBlbGVtZW50IHR5cGUgaW50byBhIHBhcnNlZCB0eXBlIGRlY2xhcmF0aW9uCisJICoKKwkgKiBDYW4gb3B0aW9uYWxseSBpZ25vcmUgZmllbGRzICYgbWV0aG9kcworCSAqLworCXByaXZhdGUgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiBjb252ZXJ0KAorCQlJU291cmNlVHlwZSBzb3VyY2VUeXBlLAorCQlib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLAorCQlib29sZWFuIG5lZWRNZW1iZXJUeXBlcywKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwkJLyogY3JlYXRlIHR5cGUgZGVjbGFyYXRpb24gLSBjYW4gYmUgbWVtYmVyIHR5cGUgKi8KKwkJVHlwZURlY2xhcmF0aW9uIHR5cGU7CisJCWlmIChzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKSA9PSBudWxsKSB7CisJCQl0eXBlID0gbmV3IFR5cGVEZWNsYXJhdGlvbihjb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbihjb21waWxhdGlvblJlc3VsdCk7CisJCX0KKwkJdHlwZS5uYW1lID0gc291cmNlVHlwZS5nZXROYW1lKCk7CisJCWludCBzdGFydCwgZW5kOyAvLyBvbmx5IHBvc2l0aW9ucyBhdmFpbGFibGUKKwkJdHlwZS5zb3VyY2VTdGFydCA9IHN0YXJ0ID0gc291cmNlVHlwZS5nZXROYW1lU291cmNlU3RhcnQoKTsKKwkJdHlwZS5zb3VyY2VFbmQgPSBlbmQgPSBzb3VyY2VUeXBlLmdldE5hbWVTb3VyY2VFbmQoKTsKKwkJdHlwZS5tb2RpZmllcnMgPSBzb3VyY2VUeXBlLmdldE1vZGlmaWVycygpOworCQl0eXBlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKKwkJdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IHNvdXJjZVR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKTsKKwkJdHlwZS5ib2R5RW5kID0gdHlwZS5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKworCQkvKiBzZXQgc3VwZXJjbGFzcyBhbmQgc3VwZXJpbnRlcmZhY2VzICovCisJCWlmIChzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NOYW1lKCkgIT0gbnVsbCkKKwkJCXR5cGUuc3VwZXJjbGFzcyA9CisJCQkJY3JlYXRlVHlwZVJlZmVyZW5jZShzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NOYW1lKCksIHN0YXJ0LCBlbmQpOworCQljaGFyW11bXSBpbnRlcmZhY2VOYW1lcyA9IHNvdXJjZVR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwkJaW50IGludGVyZmFjZUNvdW50ID0gaW50ZXJmYWNlTmFtZXMgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisJCXR5cGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbaW50ZXJmYWNlQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZUNvdW50OyBpKyspIHsKKwkJCXR5cGUuc3VwZXJJbnRlcmZhY2VzW2ldID0gY3JlYXRlVHlwZVJlZmVyZW5jZShpbnRlcmZhY2VOYW1lc1tpXSwgc3RhcnQsIGVuZCk7CisJCX0KKwkJLyogY29udmVydCBtZW1iZXIgdHlwZXMgKi8KKwkJaWYgKG5lZWRNZW1iZXJUeXBlcykgeworCQkJSVNvdXJjZVR5cGVbXSBzb3VyY2VNZW1iZXJUeXBlcyA9IHNvdXJjZVR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKKwkJCWludCBzb3VyY2VNZW1iZXJUeXBlQ291bnQgPQorCQkJCXNvdXJjZU1lbWJlclR5cGVzID09IG51bGwgPyAwIDogc291cmNlTWVtYmVyVHlwZXMubGVuZ3RoOworCQkJdHlwZS5tZW1iZXJUeXBlcyA9IG5ldyBNZW1iZXJUeXBlRGVjbGFyYXRpb25bc291cmNlTWVtYmVyVHlwZUNvdW50XTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTWVtYmVyVHlwZUNvdW50OyBpKyspIHsKKwkJCQl0eXBlLm1lbWJlclR5cGVzW2ldID0KKwkJCQkJKE1lbWJlclR5cGVEZWNsYXJhdGlvbikgY29udmVydChzb3VyY2VNZW1iZXJUeXBlc1tpXSwKKwkJCQkJCW5lZWRGaWVsZHNBbmRNZXRob2RzLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCWNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCX0KKwkJfQorCQkvKiBjb252ZXJ0IGZpZWxkcyBhbmQgbWV0aG9kcyAqLworCQlpZiAobmVlZEZpZWxkc0FuZE1ldGhvZHMpIHsKKwkJCS8qIGNvbnZlcnQgZmllbGRzICovCisJCQlJU291cmNlRmllbGRbXSBzb3VyY2VGaWVsZHMgPSBzb3VyY2VUeXBlLmdldEZpZWxkcygpOworCQkJaW50IHNvdXJjZUZpZWxkQ291bnQgPSBzb3VyY2VGaWVsZHMgPT0gbnVsbCA/IDAgOiBzb3VyY2VGaWVsZHMubGVuZ3RoOworCQkJdHlwZS5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltzb3VyY2VGaWVsZENvdW50XTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmllbGRDb3VudDsgaSsrKSB7CisJCQkJdHlwZS5maWVsZHNbaV0gPSBjb252ZXJ0KHNvdXJjZUZpZWxkc1tpXSk7CisJCQl9CisKKwkJCS8qIGNvbnZlcnQgbWV0aG9kcyAtIG5lZWQgdG8gYWRkIGRlZmF1bHQgY29uc3RydWN0b3IgaWYgbmVjZXNzYXJ5ICovCisJCQlJU291cmNlTWV0aG9kW10gc291cmNlTWV0aG9kcyA9IHNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpOworCQkJaW50IHNvdXJjZU1ldGhvZENvdW50ID0gc291cmNlTWV0aG9kcyA9PSBudWxsID8gMCA6IHNvdXJjZU1ldGhvZHMubGVuZ3RoOworCisJCQkvKiBzb3VyY2UgdHlwZSBoYXMgYSBjb25zdHJ1Y3RvciA/ICAgICAgICAgICAqLworCQkJLyogYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgb25lIGlzIG5lZWRlZC4gKi8KKwkJCWludCBuZWVkZWRDb3VudCA9IDE7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU1ldGhvZENvdW50OyBpKyspIHsKKwkJCQlpZiAoc291cmNlTWV0aG9kc1tpXS5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQkJbmVlZGVkQ291bnQgPSAwOworCQkJCQkvLyBEb2VzIG5vdCBuZWVkIHRoZSBleHRyYSBjb25zdHJ1Y3RvciBzaW5jZSBvbmUgY29uc3RydWN0b3IgYWxyZWFkeSBleGlzdHMuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXR5cGUubWV0aG9kcyA9IG5ldyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW3NvdXJjZU1ldGhvZENvdW50ICsgbmVlZGVkQ291bnRdOworCQkJaWYgKG5lZWRlZENvdW50ICE9IDApIHsgLy8gYWRkIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gZmlyc3QgcG9zaXRpb24KKwkJCQl0eXBlLm1ldGhvZHNbMF0gPSB0eXBlLmNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yKGZhbHNlLCBmYWxzZSk7CisJCQl9CisJCQlib29sZWFuIGlzSW50ZXJmYWNlID0gdHlwZS5pc0ludGVyZmFjZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VNZXRob2RDb3VudDsgaSsrKSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPWNvbnZlcnQoc291cmNlTWV0aG9kc1tpXSwgY29tcGlsYXRpb25SZXN1bHQpOworCQkJCWlmIChpc0ludGVyZmFjZSB8fCBtZXRob2QuaXNBYnN0cmFjdCgpKSB7IC8vIGZpeC11cCBmbGFnIAorCQkJCQltZXRob2QubW9kaWZpZXJzIHw9IEFjY1NlbWljb2xvbkJvZHk7CisJCQkJfQorCQkJCXR5cGUubWV0aG9kc1tuZWVkZWRDb3VudCArIGldID0gbWV0aG9kOworCQkJfQorCQl9CisJCXJldHVybiB0eXBlOworCX0KKworCS8qCisJICogQnVpbGQgYW4gaW1wb3J0IHJlZmVyZW5jZSBmcm9tIGFuIGltcG9ydCBuYW1lLCBlLmcuIGphdmEubGFuZy4qCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUltcG9ydFJlZmVyZW5jZSgKKwkJY2hhcltdIGltcG9ydE5hbWUsCisJCWludCBzdGFydCwKKwkJaW50IGVuZCkgeworCisJCS8qIGNvdW50IGlkZW50aWZpZXJzICovCisJCWludCBtYXggPSBpbXBvcnROYW1lLmxlbmd0aDsKKwkJaW50IGlkZW50Q291bnQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAoaW1wb3J0TmFtZVtpXSA9PSAnLicpCisJCQkJaWRlbnRDb3VudCsrOworCQl9CisJCS8qIGltcG9ydCBvbiBkZW1hbmQ/ICovCisJCWJvb2xlYW4gb25EZW1hbmQgPSBpbXBvcnROYW1lW21heCAtIDFdID09ICcqJzsKKwkJaWYgKCFvbkRlbWFuZCkKKwkJCWlkZW50Q291bnQrKzsgLy8gb25lIG1vcmUgaWRlbnQgdGhhbiBkb3RzCisKKwkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOworCQlsb25nIHBvc2l0aW9uID0gKGxvbmcpIHN0YXJ0IDw8IDMyICsgZW5kOworCQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50Q291bnQ7IGkrKykgeworCQkJcG9zaXRpb25zW2ldID0gcG9zaXRpb247CisJCX0KKwkJcmV0dXJuIG5ldyBJbXBvcnRSZWZlcmVuY2UoCisJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBpbXBvcnROYW1lLCAwLCBtYXggLSAob25EZW1hbmQgPyAzIDogMSkpLAorCQkJcG9zaXRpb25zLAorCQkJb25EZW1hbmQpOworCX0KKworCS8qCisJICogQnVpbGQgYSB0eXBlIHJlZmVyZW5jZSBmcm9tIGEgcmVhZGFibGUgbmFtZSwgZS5nLiBqYXZhLmxhbmcuT2JqZWN0W11bXQorCSAqLworCXByaXZhdGUgc3RhdGljIFR5cGVSZWZlcmVuY2UgY3JlYXRlVHlwZVJlZmVyZW5jZSgKKwkJY2hhcltdIHR5cGVTaWduYXR1cmUsCisJCWludCBzdGFydCwKKwkJaW50IGVuZCkgeworCisJCS8qIGNvdW50IGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovCisJCWludCBtYXggPSB0eXBlU2lnbmF0dXJlLmxlbmd0aDsKKwkJaW50IGRpbVN0YXJ0ID0gbWF4OworCQlpbnQgZGltID0gMDsKKwkJaW50IGlkZW50Q291bnQgPSAxOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlzd2l0Y2ggKHR5cGVTaWduYXR1cmVbaV0pIHsKKwkJCQljYXNlICdbJyA6CisJCQkJCWlmIChkaW0gPT0gMCkKKwkJCQkJCWRpbVN0YXJ0ID0gaTsKKwkJCQkJZGltKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJy4nIDoKKwkJCQkJaWRlbnRDb3VudCsrOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiByZWJ1aWxkIGlkZW50aWZpZXJzIGFuZCBkaW1lbnNpb25zICovCisJCWlmIChpZGVudENvdW50ID09IDEpIHsgLy8gc2ltcGxlIHR5cGUgcmVmZXJlbmNlCisJCQlpZiAoZGltID09IDApIHsKKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVR5cGVSZWZlcmVuY2UodHlwZVNpZ25hdHVyZSwgKCgobG9uZykgc3RhcnQgKTw8IDMyKSArIGVuZCk7CisJCQl9IGVsc2UgeworCQkJCWNoYXJbXSBpZGVudGlmaWVyID0gbmV3IGNoYXJbZGltU3RhcnRdOworCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZVNpZ25hdHVyZSwgMCwgaWRlbnRpZmllciwgMCwgZGltU3RhcnQpOworCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXIsIGRpbSwgKCgobG9uZykgc3RhcnQpIDw8IDMyKSArIGVuZCk7CisJCQl9CisJCX0gZWxzZSB7IC8vIHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZQorCQkJbG9uZ1tdIHBvc2l0aW9ucyA9IG5ldyBsb25nW2lkZW50Q291bnRdOworCQkJbG9uZyBwb3MgPSAoKChsb25nKSBzdGFydCkgPDwgMzIpICsgZW5kOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudENvdW50OyBpKyspIHsKKwkJCQlwb3NpdGlvbnNbaV0gPSBwb3M7CisJCQl9CisJCQljaGFyW11bXSBpZGVudGlmaWVycyA9CisJCQkJQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZVNpZ25hdHVyZSwgMCwgZGltU3RhcnQgLSAxKTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJldHVybiBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgcG9zaXRpb25zKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIGRpbSwgcG9zaXRpb25zKTsKKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ2OGJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY2OTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjMucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThkZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjQucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTBkYWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjUucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU3Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwODY2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKKworLyoKKyAqIFNwZWNpYWwgdW5jaGVja2VkIGV4Y2VwdGlvbiB0eXBlIHVzZWQgCisgKiB0byBhYm9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCisgKgorICogc2hvdWxkIG9ubHkgYmUgdGhyb3duIGZyb20gd2l0aGluIHByb2JsZW0gaGFuZGxlcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBBYm9ydENvbXBpbGF0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OworCXB1YmxpYyBUaHJvd2FibGUgZXhjZXB0aW9uOworCQorCXB1YmxpYyBpbnQgcHJvYmxlbUlkOyAKKwlwdWJsaWMgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50czsKKworCS8qIHNwZWNpYWwgZmllbGRzIHVzZWQgdG8gYWJvcnQgc2lsZW50bHkgKGUuZy4gd2hlbiBjYW5jZWxsaW5nIGJ1aWxkIHByb2Nlc3MpICovCisJcHVibGljIGJvb2xlYW4gaXNTaWxlbnQ7CisJcHVibGljIFJ1bnRpbWVFeGNlcHRpb24gc2lsZW50RXhjZXB0aW9uOworcHVibGljIEFib3J0Q29tcGlsYXRpb24oKSB7CisJdGhpcygoQ29tcGlsYXRpb25SZXN1bHQpbnVsbCk7Cit9CitwdWJsaWMgQWJvcnRDb21waWxhdGlvbihpbnQgcHJvYmxlbUlkLCBTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzKSB7CisKKwl0aGlzLnByb2JsZW1JZCA9IHByb2JsZW1JZDsKKwl0aGlzLnByb2JsZW1Bcmd1bWVudHMgPSBwcm9ibGVtQXJndW1lbnRzOworfQorcHVibGljIEFib3J0Q29tcGlsYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwl0aGlzKGNvbXBpbGF0aW9uUmVzdWx0LCBudWxsKTsKK30KK3B1YmxpYyBBYm9ydENvbXBpbGF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OworCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworfQorcHVibGljIEFib3J0Q29tcGlsYXRpb24oYm9vbGVhbiBpc1NpbGVudCwgUnVudGltZUV4Y2VwdGlvbiBzaWxlbnRFeGNlcHRpb24pIHsKKwl0aGlzLmlzU2lsZW50ID0gaXNTaWxlbnQ7CisJdGhpcy5zaWxlbnRFeGNlcHRpb24gPSBzaWxlbnRFeGNlcHRpb247Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJiYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKKworLyoKKyAqIFNwZWNpYWwgdW5jaGVja2VkIGV4Y2VwdGlvbiB0eXBlIHVzZWQgCisgKiB0byBhYm9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCisgKgorICogc2hvdWxkIG9ubHkgYmUgdGhyb3duIGZyb20gd2l0aGluIHByb2JsZW0gaGFuZGxlcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBBYm9ydENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEFib3J0Q29tcGlsYXRpb24geworcHVibGljIEFib3J0Q29tcGlsYXRpb25Vbml0KENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkMjRlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0TWV0aG9kLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CisKKy8qCisgKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogdG8gYWJvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gcHJvY2VzcworICoKKyAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgorICovCitwdWJsaWMgY2xhc3MgQWJvcnRNZXRob2QgZXh0ZW5kcyBBYm9ydFR5cGUgeworcHVibGljIEFib3J0TWV0aG9kKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJc3VwZXIoY29tcGlsYXRpb25SZXN1bHQpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzkyOTUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CisKKy8qCisgKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogdG8gYWJvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gcHJvY2VzcworICoKKyAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgorICovCitwdWJsaWMgY2xhc3MgQWJvcnRUeXBlIGV4dGVuZHMgQWJvcnRDb21waWxhdGlvblVuaXQgeworcHVibGljIEFib3J0VHlwZShDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTJjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbS5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFByb2JsZW0gaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgSVByb2JsZW0geworCQkKKwlwcml2YXRlIGNoYXJbXSBmaWxlTmFtZTsKKwlwcml2YXRlIGludCBpZDsKKwlwcml2YXRlIGludCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgbGluZTsKKwlwcml2YXRlIGludCBzZXZlcml0eTsKKwlwcml2YXRlIFN0cmluZ1tdIGFyZ3VtZW50czsKKwlwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCQorCXB1YmxpYyBEZWZhdWx0UHJvYmxlbSgKKwkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCisJCVN0cmluZyBtZXNzYWdlLAorCQlpbnQgaWQsCisJCVN0cmluZ1tdIHN0cmluZ0FyZ3VtZW50cywKKwkJaW50IHNldmVyaXR5LAorCQlpbnQgc3RhcnRQb3NpdGlvbiwKKwkJaW50IGVuZFBvc2l0aW9uLAorCQlpbnQgbGluZSkgeworCisJCXRoaXMuZmlsZU5hbWUgPSBvcmlnaW5hdGluZ0ZpbGVOYW1lOworCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuYXJndW1lbnRzID0gc3RyaW5nQXJndW1lbnRzOworCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7CisJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CisJCXRoaXMuZW5kUG9zaXRpb24gPSBlbmRQb3NpdGlvbjsKKwkJdGhpcy5saW5lID0gbGluZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGVycm9yUmVwb3J0U291cmNlKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisJCS8vZXh0cmEgZnJvbSB0aGUgc291cmNlIHRoZSBpbm5hY3VyYXRlICAgICB0b2tlbgorCQkvL2FuZCAiaGlnaGxpZ2h0IiBpdCB1c2luZyBzb21lIHVuZGVybmVhdGggXl5eXl4KKwkJLy9wdXQgc29tZSBjb250ZXh0IGFyb3VuZCB0b28uCisKKwkJLy90aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBmb250IHVzZWQgaW4gdGhlIGNvbnNvbGUgaXMgZml4ZWQgc2l6ZQorCisJCS8vc2FuaXR5IC4uLi4uCisJCWlmICgoc3RhcnRQb3NpdGlvbiA+IGVuZFBvc2l0aW9uKQorCQkJfHwgKChzdGFydFBvc2l0aW9uIDw9IDApICYmIChlbmRQb3NpdGlvbiA8PSAwKSkpCisJCQlyZXR1cm4gVXRpbC5iaW5kKCJwcm9ibGVtLm5vU291cmNlSW5mb3JtYXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCisJCWZpbmFsIGNoYXIgU1BBQ0UgPSAnXHUwMDIwJzsKKwkJZmluYWwgY2hhciBNQVJLID0gJ14nOworCQlmaW5hbCBjaGFyIFRBQiA9ICdcdCc7CisJCWNoYXJbXSBzb3VyY2UgPSBjb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKTsKKwkJLy90aGUgbmV4dCBjb2RlIHRyaWVzIHRvIHVuZGVybGluZSB0aGUgdG9rZW4uLi4uLgorCQkvL2l0IGFzc3VtZXMgKGZvciBhIGdvb2QgZGlzcGxheSkgdGhhdCB0b2tlbiBzb3VyY2UgZG9lcyBub3QKKwkJLy9jb250YWluIGFueSBcciBcbi4gVGhpcyBpcyBmYWxzZSBvbiBzdGF0ZW1lbnRzICEgCisJCS8vKHRoZSBjb2RlIHN0aWxsIHdvcmtzIGJ1dCB0aGUgZGlzcGxheSBpcyBub3Qgb3B0aW1hbCAhKQorCisJCS8vY29tcHV0ZSB0aGUgaG93LW11Y2gtY2hhciB3ZSBhcmUgZGlzcGxheWluZyBhcm91bmQgdGhlIGluYWNjdXJhdGUgdG9rZW4KKwkJaW50IGJlZ2luID0gc3RhcnRQb3NpdGlvbiA+PSBzb3VyY2UubGVuZ3RoID8gc291cmNlLmxlbmd0aCAtIDEgOiBzdGFydFBvc2l0aW9uOworCQlpbnQgcmVsYXRpdmVTdGFydCA9IDA7CisJCWludCBlbmQgPSBlbmRQb3NpdGlvbiA+PSBzb3VyY2UubGVuZ3RoID8gc291cmNlLmxlbmd0aCAtIDEgOiBlbmRQb3NpdGlvbjsKKwkJaW50IHJlbGF0aXZlRW5kID0gMDsKKwkJbGFiZWwgOiBmb3IgKHJlbGF0aXZlU3RhcnQgPSAwOzsgcmVsYXRpdmVTdGFydCsrKSB7CisJCQlpZiAoYmVnaW4gPT0gMCkKKwkJCQlicmVhayBsYWJlbDsKKwkJCWlmICgoc291cmNlW2JlZ2luIC0gMV0gPT0gJ1xuJykgfHwgKHNvdXJjZVtiZWdpbiAtIDFdID09ICdccicpKQorCQkJCWJyZWFrIGxhYmVsOworCQkJYmVnaW4tLTsKKwkJfQorCQlsYWJlbCA6IGZvciAocmVsYXRpdmVFbmQgPSAwOzsgcmVsYXRpdmVFbmQrKykgeworCQkJaWYgKChlbmQgKyAxKSA+PSBzb3VyY2UubGVuZ3RoKQorCQkJCWJyZWFrIGxhYmVsOworCQkJaWYgKChzb3VyY2VbZW5kICsgMV0gPT0gJ1xyJykgfHwgKHNvdXJjZVtlbmQgKyAxXSA9PSAnXG4nKSkgeworCQkJCWJyZWFrIGxhYmVsOworCQkJfQorCQkJZW5kKys7CisJCX0KKwkJLy9leHRyYWN0IHRoZSBtZXNzYWdlIGZvcm0gdGhlIHNvdXJjZQorCQljaGFyW10gZXh0cmFjdCA9IG5ldyBjaGFyW2VuZCAtIGJlZ2luICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBiZWdpbiwgZXh0cmFjdCwgMCwgZXh0cmFjdC5sZW5ndGgpOworCQljaGFyIGM7CisJCS8vcmVtb3ZlIGFsbCBTUEFDRSBhbmQgVEFCIHRoYXQgYmVnaW4gdGhlIGVycm9yIG1lc3NhZ2UuLi4KKwkJaW50IHRyaW1MZWZ0SW5kZXggPSAwOworCQl3aGlsZSAoKChjID0gZXh0cmFjdFt0cmltTGVmdEluZGV4KytdKSA9PSBUQUIpIHx8IChjID09IFNQQUNFKSkgeworCQl9OworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJZXh0cmFjdCwKKwkJCXRyaW1MZWZ0SW5kZXggLSAxLAorCQkJZXh0cmFjdCA9IG5ldyBjaGFyW2V4dHJhY3QubGVuZ3RoIC0gdHJpbUxlZnRJbmRleCArIDFdLAorCQkJMCwKKwkJCWV4dHJhY3QubGVuZ3RoKTsKKwkJcmVsYXRpdmVTdGFydCAtPSB0cmltTGVmdEluZGV4OworCQkvL2J1ZmZlciBzcGFjZXMgYW5kIHRhYnMgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGVycm9yIHBvc2l0aW9uCisJCWludCBwb3MgPSAwOworCQljaGFyW10gdW5kZXJuZWF0aCA9IG5ldyBjaGFyW2V4dHJhY3QubGVuZ3RoXTsgLy8gY2FuJ3QgYmUgYmlnZ2VyCisJCWZvciAoaW50IGkgPSAwOyBpIDw9IHJlbGF0aXZlU3RhcnQ7IGkrKykgeworCQkJaWYgKGV4dHJhY3RbaV0gPT0gVEFCKSB7CisJCQkJdW5kZXJuZWF0aFtwb3MrK10gPSBUQUI7CisJCQl9IGVsc2UgeworCQkJCXVuZGVybmVhdGhbcG9zKytdID0gU1BBQ0U7CisJCQl9CisJCX0KKwkJLy9tYXJrIHRoZSBlcnJvciBwb3NpdGlvbgorCQlmb3IgKGludCBpID0gc3RhcnRQb3NpdGlvbjsKKwkJCWkgPD0gKGVuZFBvc2l0aW9uID49IHNvdXJjZS5sZW5ndGggPyBzb3VyY2UubGVuZ3RoIC0gMSA6IGVuZFBvc2l0aW9uKTsKKwkJCWkrKykKKwkJCXVuZGVybmVhdGhbcG9zKytdID0gTUFSSzsKKwkJLy9yZXNpemUgdW5kZXJuZWF0aHRvIHJlbW92ZSAnbnVsbCcgY2hhcnMKKwkJU3lzdGVtLmFycmF5Y29weSh1bmRlcm5lYXRoLCAwLCB1bmRlcm5lYXRoID0gbmV3IGNoYXJbcG9zXSwgMCwgcG9zKTsKKworCQlyZXR1cm4gIiAiICsgVXRpbC5iaW5kKCJwcm9ibGVtLmF0TGluZSIsIFN0cmluZy52YWx1ZU9mKGxpbmUpKSAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkrICJcblx0IiArIG5ldyBTdHJpbmcoZXh0cmFjdCkgKyAiXG5cdCIgKyBuZXcgU3RyaW5nKHVuZGVybmVhdGgpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgb3JpZ2luYWwgYXJndW1lbnRzIHJlY29yZGVkIGludG8gdGhlIHByb2JsZW0uCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgeworCisJCXJldHVybiBhcmd1bWVudHM7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSB0eXBlIG9mIHByb2JsZW0uCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbSNnZXRJRCgpCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldElEKCkgeworCisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSBmaWxlIG5hbWUgaW4gd2hpY2ggdGhlIHByb2JsZW0gd2FzIGZvdW5kLgorCSAqIEByZXR1cm4gY2hhcltdCisJICovCisJcHVibGljIGNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgeworCisJCXJldHVybiBmaWxlTmFtZTsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bi4KKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBpbnQgZ2V0U291cmNlRW5kKCkgeworCisJCXJldHVybiBlbmRQb3NpdGlvbjsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGxpbmUgbnVtYmVyIGluIHNvdXJjZSB3aGVyZSB0aGUgcHJvYmxlbSBiZWdpbnMuCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFNvdXJjZUxpbmVOdW1iZXIoKSB7CisKKwkJcmV0dXJuIGxpbmU7CisJfQorCisJLyoqCisJICogQW5zd2VyIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbSAoaW5jbHVzaXZlKSwgb3IgLTEgaWYgdW5rbm93bi4KKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBpbnQgZ2V0U291cmNlU3RhcnQoKSB7CisKKwkJcmV0dXJuIHN0YXJ0UG9zaXRpb247CisJfQorCisJLyoKKwkgKiBIZWxwZXIgbWV0aG9kOiBjaGVja3MgdGhlIHNldmVyaXR5IHRvIHNlZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldC4KKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgeworCisJCXJldHVybiAoc2V2ZXJpdHkgJiBQcm9ibGVtU2V2ZXJpdGllcy5FcnJvcikgIT0gMDsKKwl9CisKKwkvKgorCSAqIEhlbHBlciBtZXRob2Q6IGNoZWNrcyB0aGUgc2V2ZXJpdHkgdG8gc2VlIGlmIHRoZSBFcnJvciBiaXQgaXMgbm90IHNldC4KKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7CisKKwkJcmV0dXJuIChzZXZlcml0eSAmIFByb2JsZW1TZXZlcml0aWVzLkVycm9yKSA9PSAwOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtIChpbmNsdXNpdmUpLCBvciAtMSBpZiB1bmtub3duLgorCSAqCisJICogVXNlZCBmb3Igc2hpZnRpbmcgcHJvYmxlbSBwb3NpdGlvbnMuCisJICogQHBhcmFtIHNvdXJjZUVuZCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBzb3VyY2VFbmQgb2YgdGhlIHJlY2VpdmVyCisJICovCisJcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHsKKworCQllbmRQb3NpdGlvbiA9IHNvdXJjZUVuZDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGxpbmUgbnVtYmVyIGluIHNvdXJjZSB3aGVyZSB0aGUgcHJvYmxlbSBiZWdpbnMuCisJICogQHBhcmFtIGxpbmVOdW1iZXIgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHJlY2VpdmVyCisJICovCisJcHVibGljIHZvaWQgc2V0U291cmNlTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeworCisJCWxpbmUgPSBsaW5lTnVtYmVyOworCX0KKworCS8qKgorCSAqIFNldCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHByb2JsZW0gKGluY2x1c2l2ZSksIG9yIC0xIGlmIHVua25vd24uCisJICoKKwkgKiBVc2VkIGZvciBzaGlmdGluZyBwcm9ibGVtIHBvc2l0aW9ucy4KKwkgKiBAcGFyYW0gc291cmNlU3RhcnQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgc291cmNlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZWNlaXZlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCkgeworCisJCXN0YXJ0UG9zaXRpb24gPSBzb3VyY2VTdGFydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisJCVN0cmluZyBzID0gIlBiKCIgKyAoaWQgJiBJZ25vcmVDYXRlZ29yaWVzTWFzaykgKyAiKSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworCQkJcyArPSBtZXNzYWdlOworCQl9IGVsc2UgeworCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQorCQkJCQlzICs9ICIgIiArIGFyZ3VtZW50c1tpXTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBzOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDUzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFByb2JsZW1GYWN0b3J5IGltcGxlbWVudHMgSVByb2JsZW1GYWN0b3J5IHsKKworCisJcHVibGljIFN0cmluZ1tdIG1lc3NhZ2VUZW1wbGF0ZXM7CisJcHJpdmF0ZSBMb2NhbGUgbG9jYWxlOworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfTE9DQUxFX1RFTVBMQVRFUzsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRE9VQkxFX1FVT1RFUyA9ICInJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBTSU5HTEVfUVVPVEUgPSAiJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisvKioKKyAqIEBwYXJhbSBsb2MgdGhlIGxvY2FsZSB1c2VkIHRvIGdldCB0aGUgcmlnaHQgbWVzc2FnZQorICovCitwdWJsaWMgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZSBsb2MpIHsKKwl0aGlzLmxvY2FsZSA9IGxvYzsKKwlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS5lcXVhbHMobG9jKSl7CisJCWlmIChERUZBVUxUX0xPQ0FMRV9URU1QTEFURVMgPT0gbnVsbCl7CisJCQlERUZBVUxUX0xPQ0FMRV9URU1QTEFURVMgPSBsb2FkTWVzc2FnZVRlbXBsYXRlcyhsb2MpOworCQl9CisJCXRoaXMubWVzc2FnZVRlbXBsYXRlcyA9IERFRkFVTFRfTE9DQUxFX1RFTVBMQVRFUzsKKwl9IGVsc2UgeworCQl0aGlzLm1lc3NhZ2VUZW1wbGF0ZXMgPSBsb2FkTWVzc2FnZVRlbXBsYXRlcyhsb2MpOworCX0KK30KKy8qKgorICogQW5zd2VyIGEgbmV3IElQcm9ibGVtIGNyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHZhbHVlCisgKiA8dWw+CisgKiA8bGk+b3JpZ2luYXRpbmdGaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBuYW1lIGZyb20gd2hpY2ggdGhlIHByb2JsZW0gaXMgb3JpZ2luYXRlZAorICogPGxpPnByb2JsZW1JZCB0aGUgcHJvYmxlbSBpZAorICogPGxpPmFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIG5lZWRlZCB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UKKyAqIDxsaT5zZXZlcml0eSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0KKyAqIDxsaT5zdGFydFBvc2l0aW9uIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbQorICogPGxpPmVuZFBvc2l0aW9uIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHByb2JsZW0KKyAqIDxsaT5saW5lTnVtYmVyIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VyZWQKKyAqIDwvdWw+CisgKiBAcGFyYW0gb3JpZ2luYXRpbmdGaWxlTmFtZSBjaGFyW10KKyAqIEBwYXJhbSBwcm9ibGVtSWQgaW50CisgKiBAcGFyYW0gYXJndW1lbnRzIFN0cmluZ1tdCisgKiBAcGFyYW0gc2V2ZXJpdHkgaW50CisgKiBAcGFyYW0gc3RhcnRQb3NpdGlvbiBpbnQKKyAqIEBwYXJhbSBlbmRQb3NpdGlvbiBpbnQKKyAqIEBwYXJhbSBsaW5lTnVtYmVyIGludAorICogQHJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW0KKyAqLworcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsIAorCWludCBwcm9ibGVtSWQsIAorCVN0cmluZ1tdIGFyZ3VtZW50cywgCisJaW50IHNldmVyaXR5LCAKKwlpbnQgc3RhcnRQb3NpdGlvbiwgCisJaW50IGVuZFBvc2l0aW9uLCAKKwlpbnQgbGluZU51bWJlcikgeworCisJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSgKKwkJb3JpZ2luYXRpbmdGaWxlTmFtZSwgCisJCXRoaXMuZ2V0TG9jYWxpemVkTWVzc2FnZShwcm9ibGVtSWQsIGFyZ3VtZW50cyksCisJCXByb2JsZW1JZCwgCisJCWFyZ3VtZW50cywgCisJCXNldmVyaXR5LCAKKwkJc3RhcnRQb3NpdGlvbiwgCisJCWVuZFBvc2l0aW9uLCAKKwkJbGluZU51bWJlcik7IAorfQorLyoqCisgKiBBbnN3ZXIgdGhlIGxvY2FsZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBlcnJvciBtZXNzYWdlcworICogQHJldHVybiBqYXZhLnV0aWwuTG9jYWxlCisgKi8KK3B1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworCXJldHVybiBsb2NhbGU7Cit9CitwdWJsaWMgZmluYWwgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoaW50IGlkLCBTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzKSB7CisJU3RyaW5nQnVmZmVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoODApOworCVN0cmluZyBtZXNzYWdlID0gCisJCW1lc3NhZ2VUZW1wbGF0ZXNbKGlkICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2spXTsgCisJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworCQlyZXR1cm4gIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbSBpZDogIiAvLyROT04tTkxTLTEkCisJCQkrIGlkCisJCQkrICIuIENoZWNrIGNvbXBpbGVyIHJlc291cmNlcy4iOyAgLy8kTk9OLU5MUy0xJAorCX0KKworCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWVzc2FnZUZvcm1hdCB3aGljaCBlbGltaW5hdGVzIGRvdWJsZSBxdW90ZXMgaW4gb3JpZ2luYWwgbWVzc2FnZQorCWNoYXJbXSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzID0KKwkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1lc3NhZ2UudG9DaGFyQXJyYXkoKSwgRE9VQkxFX1FVT1RFUywgU0lOR0xFX1FVT1RFKTsKKwltZXNzYWdlID0gbmV3IFN0cmluZyhtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzKTsKKworCWludCBsZW5ndGggPSBtZXNzYWdlLmxlbmd0aCgpOworCWludCBzdGFydCA9IC0xLCBlbmQgPSBsZW5ndGg7CisJd2hpbGUgKHRydWUpIHsKKwkJaWYgKChlbmQgPSBtZXNzYWdlLmluZGV4T2YoJ3snLCBzdGFydCkpID4gLTEpIHsKKwkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKKwkJCWlmICgoc3RhcnQgPSBtZXNzYWdlLmluZGV4T2YoJ30nLCBlbmQpKSA+IC0xKSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0cHV0LmFwcGVuZCgKKwkJCQkJCXByb2JsZW1Bcmd1bWVudHNbSW50ZWdlci5wYXJzZUludChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCkpXSk7IAorCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsKKwkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gIkNvcnJ1cHRlZCBjb21waWxlciByZXNvdXJjZXMgZm9yIHByb2JsZW0gaWQ6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyAoaWQgJiBJUHJvYmxlbS5JZ25vcmVDYXRlZ29yaWVzTWFzaykKKwkJCQkJCSsgIi4gQ2hlY2sgY29tcGlsZXIgcmVzb3VyY2VzLiI7ICAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0ICsgMSwgbGVuZ3RoKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Cit9CisvKioKKyAqIEBwYXJhbSBwcm9ibGVtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbQorICogQHJldHVybiBTdHJpbmcKKyAqLworcHVibGljIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKElQcm9ibGVtIHByb2JsZW0pIHsKKwlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZShwcm9ibGVtLmdldElEKCksIHByb2JsZW0uZ2V0QXJndW1lbnRzKCkpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBNZXNzYWdlVGVtcGxhdGVzIGNsYXNzIHZhcmlhYmxlIGFjY29yZGluZworICogdG8gdGhlIGN1cnJlbnQgTG9jYWxlLgorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGxvYWRNZXNzYWdlVGVtcGxhdGVzKExvY2FsZSBsb2MpIHsKKwlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLm1lc3NhZ2VzIiwgbG9jKTsgLy8kTk9OLU5MUy0xJAorCVN0cmluZ1tdIHRlbXBsYXRlcyA9IG5ldyBTdHJpbmdbNTAwXTsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gdGVtcGxhdGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCXRyeSB7CisJCQl0ZW1wbGF0ZXNbaV0gPSBidW5kbGUuZ2V0U3RyaW5nKFN0cmluZy52YWx1ZU9mKGkpKTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGF2YWlsYWJsZSBJRAorCQl9CisJfQorCXJldHVybiB0ZW1wbGF0ZXM7Cit9CisKK3B1YmxpYyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSB7CisJdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1IYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTRjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuUmVmZXJlbmNlQ29udGV4dDsKKworLyoKKyAqIENvbXBpbGVyIGVycm9yIGhhbmRsZXIsIHJlc3BvbnNpYmxlIHRvIGRldGVybWluZSB3aGV0aGVyCisgKiBhIHByb2JsZW0gaXMgYWN0dWFsbHkgYSB3YXJuaW5nIG9yIGFuIGVycm9yOyBhbHNvIHdpbGwKKyAqIGRlY2lkZSB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB0YXNrIGNhbiBiZSBwcm9jZXNzZWQgZnVydGhlciBvciBub3QuCisgKgorICogQmVoYXZpb3IgOiB3aWxsIHJlcXVlc3QgaXRzIGN1cnJlbnQgcG9saWN5IGlmIG5lZWQgdG8gc3RvcCBvbgorICoJZmlyc3QgZXJyb3IsIGFuZCBpZiBzaG91bGQgcHJvY2VlZCAocGVyc2lzdCkgd2l0aCBwcm9ibGVtcy4KKyAqLworCitwdWJsaWMgY2xhc3MgUHJvYmxlbUhhbmRsZXIgaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcyB7CisKKwlmaW5hbCBwdWJsaWMgSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5OworCXB1YmxpYyBmaW5hbCBJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3Rvcnk7CisJcHVibGljIGZpbmFsIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOworLyoKKyAqIFByb2JsZW0gaGFuZGxlciBjYW4gYmUgc3VwcGxpZWQgd2l0aCBhIHBvbGljeSB0byBzcGVjaWZ5CisgKiBpdHMgYmVoYXZpb3IgaW4gZXJyb3IgaGFuZGxpbmcuIEFsc28gc2VlIHN0YXRpYyBtZXRob2RzIGZvcgorICogYnVpbHQtaW4gcG9saWNpZXMuCisgKgorICovCitwdWJsaWMgUHJvYmxlbUhhbmRsZXIoSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LCBDb21waWxlck9wdGlvbnMgb3B0aW9ucywgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisJdGhpcy5wb2xpY3kgPSBwb2xpY3k7CisJdGhpcy5wcm9ibGVtRmFjdG9yeSA9IHByb2JsZW1GYWN0b3J5OworCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Cit9CisvKgorICogR2l2ZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5zd2VycyB3aGljaCBjYXRlZ29yeSB0aGUgcHJvYmxlbQorICogZmFsbHMgaW50bzoKKyAqCQlFcnJvciB8IFdhcm5pbmcgfCBJZ25vcmUKKyAqLworcHVibGljIGludCBjb21wdXRlU2V2ZXJpdHkoaW50IHByb2JsZW1JZCl7CisJCisJcmV0dXJuIEVycm9yOyAvLyBieSBkZWZhdWx0IGFsbCBwcm9ibGVtcyBhcmUgZXJyb3JzCit9CitwdWJsaWMgSVByb2JsZW0gY3JlYXRlUHJvYmxlbSgKKwljaGFyW10gZmlsZU5hbWUsIAorCWludCBwcm9ibGVtSWQsIAorCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsIAorCWludCBzZXZlcml0eSwgCisJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKKwlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLCAKKwlpbnQgbGluZU51bWJlciwKKwlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQsCisJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCisJcmV0dXJuIHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oCisJCWZpbGVOYW1lLCAKKwkJcHJvYmxlbUlkLCAKKwkJcHJvYmxlbUFyZ3VtZW50cywgCisJCXNldmVyaXR5LCAKKwkJcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAorCQlwcm9ibGVtRW5kUG9zaXRpb24sIAorCQlsaW5lTnVtYmVyKTsgCit9CitwdWJsaWMgdm9pZCBoYW5kbGUoCisJaW50IHByb2JsZW1JZCwgCisJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJaW50IHNldmVyaXR5LCAKKwlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAorCWludCBwcm9ibGVtRW5kUG9zaXRpb24sIAorCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwgCisJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCisJaWYgKHNldmVyaXR5ID09IElnbm9yZSkKKwkJcmV0dXJuOworCisJLy8gaWYgbm8gcmVmZXJlbmNlIGNvbnRleHQsIHdlIG5lZWQgdG8gYWJvcnQgZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbiBwcm9jZXNzCisJaWYgKHJlZmVyZW5jZUNvbnRleHQgPT0gbnVsbCkgeworCQlpZiAoKHNldmVyaXR5ICYgRXJyb3IpICE9IDApIHsgLy8gbm9uIHJlcG9ydGFibGUgZXJyb3IgaXMgZmF0YWwKKwkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHByb2JsZW1JZCwgcHJvYmxlbUFyZ3VtZW50cyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm47IC8vIGlnbm9yZSBub24gcmVwb3J0YWJsZSB3YXJuaW5nCisJCX0KKwl9CisKKwlJUHJvYmxlbSBwcm9ibGVtID0gCisJCXRoaXMuY3JlYXRlUHJvYmxlbSgKKwkJCXVuaXRSZXN1bHQuZ2V0RmlsZU5hbWUoKSwgCisJCQlwcm9ibGVtSWQsIAorCQkJcHJvYmxlbUFyZ3VtZW50cywgCisJCQlzZXZlcml0eSwgCisJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCisJCQlwcm9ibGVtRW5kUG9zaXRpb24sIAorCQkJcHJvYmxlbVN0YXJ0UG9zaXRpb24gPj0gMAorCQkJCT8gc2VhcmNoTGluZU51bWJlcih1bml0UmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMsIHByb2JsZW1TdGFydFBvc2l0aW9uKQorCQkJCTogMCwKKwkJCXJlZmVyZW5jZUNvbnRleHQsCisJCQl1bml0UmVzdWx0KTsgCisJaWYgKHByb2JsZW0gPT0gbnVsbCkgcmV0dXJuOyAvLyBwcm9ibGVtIGNvdWxkbid0IGJlIGNyZWF0ZWQsIGlnbm9yZQorCQorCXN3aXRjaCAoc2V2ZXJpdHkgJiBFcnJvcikgeworCQljYXNlIEVycm9yIDoKKwkJCXRoaXMucmVjb3JkKHByb2JsZW0sIHVuaXRSZXN1bHQsIHJlZmVyZW5jZUNvbnRleHQpOworCQkJcmVmZXJlbmNlQ29udGV4dC50YWdBc0hhdmluZ0Vycm9ycygpOworCisJCQkvLyBzaG91bGQgYWJvcnQgPworCQkJaW50IGFib3J0TGV2ZWw7CisJCQlpZiAoKGFib3J0TGV2ZWwgPSAKKwkJCQkocG9saWN5LnN0b3BPbkZpcnN0RXJyb3IoKSA/IEFib3J0Q29tcGlsYXRpb24gOiBzZXZlcml0eSAmIEFib3J0KSkgIT0gMCkgeworCisJCQkJcmVmZXJlbmNlQ29udGV4dC5hYm9ydChhYm9ydExldmVsKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdhcm5pbmcgOgorCQkJdGhpcy5yZWNvcmQocHJvYmxlbSwgdW5pdFJlc3VsdCwgcmVmZXJlbmNlQ29udGV4dCk7CisJCQlicmVhazsKKwl9Cit9CisvKioKKyAqIFN0YW5kYXJkIHByb2JsZW0gaGFuZGxpbmcgQVBJLCB0aGUgYWN0dWFsIHNldmVyaXR5ICh3YXJuaW5nL2Vycm9yL2lnbm9yZSkgaXMgZGVkdWN0ZWQKKyAqIGZyb20gdGhlIHByb2JsZW0gSUQgYW5kIHRoZSBjdXJyZW50IGNvbXBpbGVyIG9wdGlvbnMuCisgKi8KK3B1YmxpYyB2b2lkIGhhbmRsZSgKKwlpbnQgcHJvYmxlbUlkLCAKKwlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLCAKKwlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAorCWludCBwcm9ibGVtRW5kUG9zaXRpb24sIAorCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwgCisJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCisJdGhpcy5oYW5kbGUoCisJCXByb2JsZW1JZCwKKwkJcHJvYmxlbUFyZ3VtZW50cywKKwkJdGhpcy5jb21wdXRlU2V2ZXJpdHkocHJvYmxlbUlkKSwgLy8gc2V2ZXJpdHkgaW5mZXJyZWQgdXNpbmcgdGhlIElECisJCXByb2JsZW1TdGFydFBvc2l0aW9uLAorCQlwcm9ibGVtRW5kUG9zaXRpb24sCisJCXJlZmVyZW5jZUNvbnRleHQsCisJCXVuaXRSZXN1bHQpOworfQorcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIHByb2JsZW0sIENvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQsIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCkgeworCXVuaXRSZXN1bHQucmVjb3JkKHByb2JsZW0sIHJlZmVyZW5jZUNvbnRleHQpOworfQorLyoqCisgKiBTZWFyY2ggdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbgorICoKKyAqIEBwYXJhbSBtZXRob2RCaW5kaW5nIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5uYW1lbG9vcGt1cC5TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlYXJjaExpbmVOdW1iZXIoaW50W10gc3RhcnRMaW5lSW5kZXhlcywgaW50IHBvc2l0aW9uKSB7CisJaWYgKHN0YXJ0TGluZUluZGV4ZXMgPT0gbnVsbCkKKwkJcmV0dXJuIDE7CisJaW50IGxlbmd0aCA9IHN0YXJ0TGluZUluZGV4ZXMubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIDE7CisJaW50IGcgPSAwLCBkID0gbGVuZ3RoIC0gMTsKKwlpbnQgbSA9IDA7CisJd2hpbGUgKGcgPD0gZCkgeworCQltID0gKGcgKyBkKSAvMjsKKwkJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgeworCQkJZCA9IG0tMTsKKwkJfSBlbHNlIGlmIChwb3NpdGlvbiA+IHN0YXJ0TGluZUluZGV4ZXNbbV0pIHsKKwkJCWcgPSBtKzE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbSArIDE7CisJCX0KKwl9CisJaWYgKHBvc2l0aW9uIDwgc3RhcnRMaW5lSW5kZXhlc1ttXSkgeworCQlyZXR1cm4gbSsxOworCX0KKwlyZXR1cm4gbSsyOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg1ODJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwyNDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKKworcHVibGljIGNsYXNzIFByb2JsZW1SZXBvcnRlciBleHRlbmRzIFByb2JsZW1IYW5kbGVyIGltcGxlbWVudHMgUHJvYmxlbVJlYXNvbnMgeworCQorCXB1YmxpYyBSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQ7CitwdWJsaWMgUHJvYmxlbVJlcG9ydGVyKElFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgeworCXN1cGVyKHBvbGljeSwgb3B0aW9ucywgcHJvYmxlbUZhY3RvcnkpOworfQorcHVibGljIHZvaWQgYWJvcnREdWVUb0ludGVybmFsRXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5VbmNsYXNzaWZpZWQsCisJCW5ldyBTdHJpbmdbXSB7ZXJyb3JNZXNzYWdlfSwKKwkJRXJyb3IgfCBBYm9ydCwKKwkJMCwKKwkJMCk7Cit9CitwdWJsaWMgdm9pZCBhYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVuY2xhc3NpZmllZCwKKwkJbmV3IFN0cmluZ1tdIHtlcnJvck1lc3NhZ2V9LAorCQlFcnJvciB8IEFib3J0LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIE1ldGhvZEJpbmRpbmcgY29uY3JldGVNZXRob2QpIHsKKworCXRoaXMuaGFuZGxlKAorCQkvLyAlMSBtdXN0IGJlIGFic3RyYWN0IHNpbmNlIGl0IGNhbm5vdCBvdmVycmlkZSB0aGUgaW5oZXJpdGVkIHBhY2thZ2UtcHJpdmF0ZSBhYnN0cmFjdCBtZXRob2QgJTIKKwkJSVByb2JsZW0uQWJzdHJhY3RNZXRob2RDYW5ub3RCZU92ZXJyaWRkZW4sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcoY29uY3JldGVNZXRob2QucmVhZGFibGVOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kSW5BYnN0cmFjdENsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5BYnN0cmFjdE1ldGhvZEluQWJzdHJhY3RDbGFzcywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBhYnN0cmFjdE1ldGhvZCkgeworCXRoaXMuaGFuZGxlKAorCQkvLyBNdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCAlMQorCQkvLyA4LjQuMyAtIEV2ZXJ5IG5vbi1hYnN0cmFjdCBzdWJjbGFzcyBvZiBhbiBhYnN0cmFjdCB0eXBlLCBBLCBtdXN0IHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgb2YgQSdzIG1ldGhvZHMuCisJCUlQcm9ibGVtLkFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQsCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKAorCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQlhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJYWJzdHJhY3RNZXRob2QucmVhZGFibGVOYW1lKCksCisJCQkJCScuJykpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGFic3RyYWN0TWV0aG9kTmVlZGluZ05vQm9keShBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Cb2R5Rm9yQWJzdHJhY3RNZXRob2QsCisJCW5ldyBTdHJpbmdbMF0sCisJCW1ldGhvZC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kLnNvdXJjZUVuZCwKKwkJbWV0aG9kLAorCQltZXRob2QuY29tcGlsYXRpb25SZXN1bHQoKSk7Cit9CitwdWJsaWMgdm9pZCBhbHJlYWR5RGVmaW5lZExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlTGFiZWwsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsYWJlbE5hbWUpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBhbm9ueW1vdXNDbGFzc0Nhbm5vdEV4dGVuZEZpbmFsQ2xhc3MoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkFub255bW91c0NsYXNzQ2Fubm90RXh0ZW5kRmluYWxDbGFzcywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgYXJndW1lbnRUeXBlQ2Fubm90QmVWb2lkKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCwgQXJndW1lbnQgYXJnKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKGFyZy5uYW1lKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZEFycmF5KFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCwgQXJndW1lbnQgYXJnKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZEFycmF5LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoYXJnLm5hbWUpfSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgYXJndW1lbnRUeXBlUHJvYmxlbShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wsIEFyZ3VtZW50IGFyZywgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJaW50IHByb2JsZW1JZCA9IGV4cGVjdGVkVHlwZS5wcm9ibGVtSWQoKTsKKwlpbnQgaWQ7CisJc3dpdGNoIChwcm9ibGVtSWQpIHsKKwkJY2FzZSBOb3RGb3VuZCA6IC8vIDEKKwkJCWlkID0gSVByb2JsZW0uQXJndW1lbnRUeXBlTm90Rm91bmQ7CisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDogLy8gMgorCQkJaWQgPSBJUHJvYmxlbS5Bcmd1bWVudFR5cGVOb3RWaXNpYmxlOworCQkJYnJlYWs7CisJCWNhc2UgQW1iaWd1b3VzIDogLy8gMworCQkJaWQgPSBJUHJvYmxlbS5Bcmd1bWVudFR5cGVBbWJpZ3VvdXM7CisJCQlicmVhazsKKwkJY2FzZSBJbnRlcm5hbE5hbWVQcm92aWRlZCA6IC8vIDQKKwkJCWlkID0gSVByb2JsZW0uQXJndW1lbnRUeXBlSW50ZXJuYWxOYW1lUHJvdmlkZWQ7CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDogLy8gNQorCQkJaWQgPSBJUHJvYmxlbS5Bcmd1bWVudFR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOworCQkJYnJlYWs7CisJCWNhc2UgTm9FcnJvciA6IC8vIDAKKwkJZGVmYXVsdCA6CisJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQlyZXR1cm47CisJfQorCXRoaXMuaGFuZGxlKAorCQlpZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBhcmcubmFtZSgpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlhcmcudHlwZS5zb3VyY2VTdGFydCwKKwkJYXJnLnR5cGUuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGFycmF5Q29uc3RhbnRzT25seUluQXJyYXlJbml0aWFsaXplcnMoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkFycmF5Q29uc3RhbnRzT25seUluQXJyYXlJbml0aWFsaXplcnMsCisJCW5ldyBTdHJpbmdbMF0sCisJCXNvdXJjZVN0YXJ0LAorCQlzb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgYXR0ZW1wdFRvUmV0dXJuTm9uVm9pZEV4cHJlc3Npb24oUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlZvaWRNZXRob2RSZXR1cm5zVmFsdWUsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJcmV0dXJuU3RhdGVtZW50LnNvdXJjZVN0YXJ0LAorCQlyZXR1cm5TdGF0ZW1lbnQuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGF0dGVtcHRUb1JldHVyblZvaWRWYWx1ZShSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50KSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk1ldGhvZFJldHVybnNWb2lkLAorCQluZXcgU3RyaW5nW10ge30sCisJCXJldHVyblN0YXRlbWVudC5zb3VyY2VTdGFydCwKKwkJcmV0dXJuU3RhdGVtZW50LnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBieXRlY29kZUV4Y2VlZHM2NEtMaW1pdChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYXRpb24uc2VsZWN0b3IpfSwKKwkJRXJyb3IgfCBBYm9ydCwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBieXRlY29kZUV4Y2VlZHM2NEtMaW1pdChUeXBlRGVjbGFyYXRpb24gbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXRGb3JDbGluaXQsCisJCW5ldyBTdHJpbmdbMF0sCisJCUVycm9yIHwgQWJvcnQsCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2Fubm90QWxsb2NhdGVWb2lkQXJyYXkoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkNhbm5vdEFsbG9jYXRlVm9pZEFycmF5LAorCQluZXcgU3RyaW5nW10ge30sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChGaWVsZEJpbmRpbmcgZmllbGQsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRmluYWxGaWVsZEFzc2lnbm1lbnQsCisJCW5ldyBTdHJpbmdbXSB7CisJCQkoZmllbGQuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCA/ICJhcnJheSIgOiBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSksIC8vJE5PTi1OTFMtMSQKKwkJCW5ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3RBc3NpZ25Ub0ZpbmFsT3V0ZXJMb2NhbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5GaW5hbE91dGVyTG9jYWxBc3NpZ25tZW50LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWwucmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3REZWNsYXJlTG9jYWxJbnRlcmZhY2UoY2hhcltdIGludGVyZmFjZU5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5DYW5ub3REZWZpbmVJbnRlcmZhY2VJbkxvY2FsVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGludGVyZmFjZU5hbWUpfSwKKwkJc291cmNlU3RhcnQsCisJCXNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3REZWZpbmVEaW1lbnNpb25zQW5kSW5pdGlhbGl6ZXIoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHByZXNzc2lvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5DYW5ub3REZWZpbmVEaW1lbnNpb25FeHByZXNzaW9uc1dpdGhJbml0LAorCQluZXcgU3RyaW5nWzBdLAorCQlleHByZXNzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhbm5vdERpcmVjbHlJbnZva2VBYnN0cmFjdE1ldGhvZChNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRGlyZWN0SW52b2NhdGlvbk9mQWJzdHJhY3RNZXRob2QsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJbWVzc2FnZVNlbmQuc291cmNlU3RhcnQsCisJCW1lc3NhZ2VTZW5kLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3RJbXBvcnRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uQ2Fubm90SW1wb3J0UGFja2FnZSwKKwkJbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGltcG9ydFJlZi50b2tlbnMpfSwKKwkJaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAorCQlpbXBvcnRSZWYuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhbm5vdEluc3RhbnRpYXRlKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgVHlwZUJpbmRpbmcgdHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkQ2xhc3NJbnN0YW50aWF0aW9uLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQl0eXBlUmVmLnNvdXJjZVN0YXJ0LAorCQl0eXBlUmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3RSZWZlclRvTm9uRmluYWxPdXRlckxvY2FsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk91dGVyTG9jYWxNdXN0QmVGaW5hbCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2FsLnJlYWRhYmxlTmFtZSgpKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2Fubm90UmV0dXJuSW5Jbml0aWFsaXplcihBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkNhbm5vdFJldHVybkluSW5pdGlhbGl6ZXIsCisJCW5ldyBTdHJpbmdbMF0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2Fubm90VGhyb3dOdWxsKFRocm93U3RhdGVtZW50IHN0YXRlbWVudCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5DYW5ub3RUaHJvd051bGwsCisJCW5ldyBTdHJpbmdbMF0sCisJCXN0YXRlbWVudC5zb3VyY2VTdGFydCwKKwkJc3RhdGVtZW50LnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBjYW5ub3RUaHJvd1R5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsLCBUeXBlUmVmZXJlbmNlIGV4Y2VwdGlvblR5cGUsIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5DYW5ub3RUaHJvd1R5cGUsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJZXhjZXB0aW9uVHlwZS5zb3VyY2VTdGFydCwKKwkJZXhjZXB0aW9uVHlwZS5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2Fubm90VXNlU3VwZXJJbkphdmFMYW5nT2JqZWN0KEFzdE5vZGUgcmVmZXJlbmNlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk9iamVjdEhhc05vU3VwZXJjbGFzcywKKwkJbmV3IFN0cmluZ1swXSwKKwkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAorCQlyZWZlcmVuY2Uuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhbm5vdFVzZVN1cGVySW5Db2RlU25pcHBldChpbnQgc3RhcnQsIGludCBlbmQpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uQ2Fubm90VXNlU3VwZXJJbkNvZGVTbmlwcGV0LAorCQluZXcgU3RyaW5nWzBdLAorCQlFcnJvciB8IEFib3J0LAorCQlzdGFydCwKKwkJZW5kKTsKK30KK3B1YmxpYyB2b2lkIGNhc2VFeHByZXNzaW9uTXVzdEJlQ29uc3RhbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5vbkNvbnN0YW50RXhwcmVzc2lvbiwKKwkJbmV3IFN0cmluZ1swXSwKKwkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2xhc3NFeHRlbmRGaW5hbENsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIFR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzcywgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkNsYXNzRXh0ZW5kRmluYWxDbGFzcywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJc3VwZXJjbGFzcy5zb3VyY2VTdGFydCwKKwkJc3VwZXJjbGFzcy5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MoU3RyaW5nIG1pc3NpbmcsIGludCBzdGFydCwgaW50IGVuZCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Db2RlU25pcHBldE1pc3NpbmdDbGFzcywKKwkJbmV3IFN0cmluZ1tdeyBtaXNzaW5nIH0sCisJCUVycm9yIHwgQWJvcnQsCisJCXN0YXJ0LAorCQllbmQpOworfQorcHVibGljIHZvaWQgY29kZVNuaXBwZXRNaXNzaW5nTWV0aG9kKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtaXNzaW5nTWV0aG9kLCBTdHJpbmcgYXJndW1lbnRUeXBlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkNvZGVTbmlwcGV0TWlzc2luZ01ldGhvZCwKKwkJbmV3IFN0cmluZ1tdeyBjbGFzc05hbWUsIG1pc3NpbmdNZXRob2QsIGFyZ3VtZW50VHlwZXMgfSwKKwkJRXJyb3IgfCBBYm9ydCwKKwkJc3RhcnQsCisJCWVuZCk7Cit9CisvKgorICogR2l2ZW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5zd2VycyB3aGljaCBjYXRlZ29yeSB0aGUgcHJvYmxlbQorICogZmFsbHMgaW50bzoKKyAqCQlFcnJvciB8IFdhcm5pbmcgfCBJZ25vcmUKKyAqLworcHVibGljIGludCBjb21wdXRlU2V2ZXJpdHkoaW50IHByb2JsZW1JZCl7CisKKwkvLyBzZXZlcml0eSBjYW4gaGF2ZSBiZWVuIHByZXNldCBvbiB0aGUgcHJvYmxlbQorLy8JaWYgKChwcm9ibGVtLnNldmVyaXR5ICYgRmF0YWwpICE9IDApeworLy8JCXJldHVybiBFcnJvcjsKKy8vCX0KKworCS8vIGlmIG5vdCB0aGVuIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBjb25maWd1cmFibGUgcHJvYmxlbQorCWludCBlcnJvclRocmVzaG9sZCA9IG9wdGlvbnMuZXJyb3JUaHJlc2hvbGQ7CisJaW50IHdhcm5pbmdUaHJlc2hvbGQgPSBvcHRpb25zLndhcm5pbmdUaHJlc2hvbGQ7CisJCisJc3dpdGNoKHByb2JsZW1JZCl7CisKKwkJY2FzZSBJUHJvYmxlbS5VbnJlYWNoYWJsZUNhdGNoIDoKKwkJY2FzZSBJUHJvYmxlbS5Db2RlQ2Fubm90QmVSZWFjaGVkIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuVW5yZWFjaGFibGVDb2RlKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuVW5yZWFjaGFibGVDb2RlKSAhPSAwKXsKKwkJCQlyZXR1cm4gV2FybmluZzsKKwkJCX0KKwkJCXJldHVybiBJZ25vcmU7CisKKwkJY2FzZSBJUHJvYmxlbS5NYXNrZWRDYXRjaCA6IAorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5NYXNrZWRDYXRjaEJsb2NrKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuTWFza2VkQ2F0Y2hCbG9jaykgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCQkJCisvKgorCQljYXNlIE5ldmVyIFVzZWQgIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBQYXJzaW5nT3B0aW9uYWxFcnJvcikgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgUGFyc2luZ09wdGlvbmFsRXJyb3IpICE9IDApeworCQkJCXJldHVybiBXYXJuaW5nOworCQkJfQorCQkJcmV0dXJuIElnbm9yZTsKKyovCisJCWNhc2UgSVByb2JsZW0uSW1wb3J0Tm90Rm91bmQgOgorCQljYXNlIElQcm9ibGVtLkltcG9ydE5vdFZpc2libGUgOgorCQljYXNlIElQcm9ibGVtLkltcG9ydEFtYmlndW91cyA6CisJCWNhc2UgSVByb2JsZW0uSW1wb3J0SW50ZXJuYWxOYW1lUHJvdmlkZWQgOgorCQljYXNlIElQcm9ibGVtLkltcG9ydEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQljYXNlIElQcm9ibGVtLkR1cGxpY2F0ZUltcG9ydCA6CisJCWNhc2UgSVByb2JsZW0uQ29uZmxpY3RpbmdJbXBvcnQgOgorCQljYXNlIElQcm9ibGVtLkNhbm5vdEltcG9ydFBhY2thZ2UgOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5JbXBvcnRQcm9ibGVtKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuSW1wb3J0UHJvYmxlbSkgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCQkJCisJCWNhc2UgSVByb2JsZW0uVW51c2VkSW1wb3J0IDoKKwkJCS8vIGlmIGltcG9ydCBwcm9ibGVtIGFyZSBkaXNhYmxlZCwgdGhlbiBpZ25vcmUKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuSW1wb3J0UHJvYmxlbSkgPT0gMCAKKwkJCQkmJiAod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5JbXBvcnRQcm9ibGVtKSA9PSAwKXsKKwkJCQlyZXR1cm4gSWdub3JlOworCQkJfQorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQpICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRJbXBvcnQpICE9IDApeworCQkJCXJldHVybiBXYXJuaW5nOworCQkJfQorCQkJcmV0dXJuIElnbm9yZTsKKwkJCQorLyoJCQorCQljYXNlIFVubmVjZXNzYXJ5RW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBVbm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBVbm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlKSAhPSAwKXsKKwkJCQlyZXR1cm4gV2FybmluZzsKKwkJCX0KKwkJCXJldHVybiBJZ25vcmU7CisqLwkJCisJCWNhc2UgSVByb2JsZW0uTWV0aG9kQnV0V2l0aENvbnN0cnVjdG9yTmFtZSA6CisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLk1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUpICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5NZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwKXsKKwkJCQlyZXR1cm4gV2FybmluZzsKKwkJCX0KKwkJCXJldHVybiBJZ25vcmU7CisJCQorCQljYXNlIElQcm9ibGVtLk92ZXJyaWRpbmdOb25WaXNpYmxlTWV0aG9kIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kKSAhPSAwKXsKKwkJCQlyZXR1cm4gV2FybmluZzsKKwkJCX0KKwkJCXJldHVybiBJZ25vcmU7CisKKwkJY2FzZSBJUHJvYmxlbS5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCA6CQkJCQorCQljYXNlIElQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZFR5cGUgOgkJCQkKKwkJY2FzZSBJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRNZXRob2QgOgorCQljYXNlIElQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZENvbnN0cnVjdG9yIDoKKwkJY2FzZSBJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRGaWVsZCA6CisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLlVzaW5nRGVwcmVjYXRlZEFQSSkgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLlVzaW5nRGVwcmVjYXRlZEFQSSkgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCQkKKwkJY2FzZSBJUHJvYmxlbS5Mb2NhbFZhcmlhYmxlSXNOZXZlclVzZWQgOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRMb2NhbFZhcmlhYmxlKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuVW51c2VkTG9jYWxWYXJpYWJsZSkgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCQkKKwkJY2FzZSBJUHJvYmxlbS5Bcmd1bWVudElzTmV2ZXJVc2VkIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuVW51c2VkQXJndW1lbnQpICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRBcmd1bWVudCkgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCisJCWNhc2UgSVByb2JsZW0uTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb25Gb3JDaGFyQXJyYXlFeHByZXNzaW9uIDoKKwkJCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24pICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5Ob0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbikgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCisJCWNhc2UgSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyA6CisJCWNhc2UgSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MgOgorCQljYXNlIElQcm9ibGVtLk5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MgOgorCQljYXNlIElQcm9ibGVtLk5lZWRUb0VtdWxhdGVDb25zdHJ1Y3RvckFjY2VzcyA6CQkJCisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLkFjY2Vzc0VtdWxhdGlvbikgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLkFjY2Vzc0VtdWxhdGlvbikgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOworCQljYXNlIElQcm9ibGVtLk5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5Ob25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5Ob25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApeworCQkJCXJldHVybiBXYXJuaW5nOworCQkJfQorCQkJcmV0dXJuIElnbm9yZTsKKwkJY2FzZSBJUHJvYmxlbS5Vc2VBc3NlcnRBc0FuSWRlbnRpZmllciA6CisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLkFzc2VydFVzZWRBc0FuSWRlbnRpZmllcikgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLkFzc2VydFVzZWRBc0FuSWRlbnRpZmllcikgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOwkJCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRXJyb3I7CisJfQorfQorcHVibGljIHZvaWQgY29uZGl0aW9uYWxBcmd1bWVudHNJbmNvbXBhdGlibGVUeXBlcyhDb25kaXRpb25hbEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgdHJ1ZVR5cGUsIFR5cGVCaW5kaW5nIGZhbHNlVHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbmNvbXBhdGlibGVUeXBlc0luQ29uZGl0aW9uYWxPcGVyYXRvciwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRydWVUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhmYWxzZVR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY29uZmxpY3RpbmdJbXBvcnQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Db25mbGljdGluZ0ltcG9ydCwKKwkJbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGltcG9ydFJlZi50b2tlbnMpfSwKKwkJaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAorCQlpbXBvcnRSZWYuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGNvbnN0YW50T3V0T2ZGb3JtYXQoTnVtYmVyTGl0ZXJhbCBsaXQpIHsKKwkvLyB0aGUgbGl0ZXJhbCBpcyBub3QgaW4gYSBjb3JyZWN0IGZvcm1hdAorCS8vIHRoaXMgY29kZSBpcyBjYWxsZWQgb24gSW50TGl0ZXJhbCBhbmQgTG9uZ0xpdGVyYWwgCisJLy8gZXhhbXBsZSAwMDA4MTEgLi4udGhlIDggaXMgdW5jb3JyZWN0LgorCisJaWYgKChsaXQgaW5zdGFuY2VvZiBMb25nTGl0ZXJhbCkgfHwgKGxpdCBpbnN0YW5jZW9mIEludExpdGVyYWwpKSB7CisJCWNoYXJbXSBzb3VyY2UgPSBsaXQuc291cmNlKCk7CisJCXRyeSB7CisJCQlmaW5hbCBTdHJpbmcgUmFkaXg7CisJCQlmaW5hbCBpbnQgcmFkaXg7CisJCQlpZiAoKHNvdXJjZVsxXSA9PSAneCcpIHx8IChzb3VyY2VbMV0gPT0gJ1gnKSkgeworCQkJCXJhZGl4ID0gMTY7CisJCQkJUmFkaXggPSAiSGV4YSI7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJcmFkaXggPSA4OworCQkJCVJhZGl4ID0gIk9jdGFsIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJLy9sb29rIGZvciB0aGUgZmlyc3QgZGlnaXQgdGhhdCBpcyBpbmNvcnJlY3QKKwkJCWludCBwbGFjZSA9IC0xOworCQkJbGFiZWwgOiBmb3IgKGludCBpID0gcmFkaXggPT0gOCA/IDEgOiAyOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKENoYXJhY3Rlci5kaWdpdChzb3VyY2VbaV0sIHJhZGl4KSA9PSAtMSkgeworCQkJCQlwbGFjZSA9IGk7CisJCQkJCWJyZWFrIGxhYmVsOworCQkJCX0KKwkJCX0KKworCQkJdGhpcy5oYW5kbGUoCisJCQkJSVByb2JsZW0uTnVtZXJpY1ZhbHVlT3V0T2ZSYW5nZSwKKwkJCQluZXcgU3RyaW5nW10ge1JhZGl4ICsgIiAiICsgbmV3IFN0cmluZyhzb3VyY2UpICsgIiAoZGlnaXQgIiArIG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7c291cmNlW3BsYWNlXX0pICsgIikifSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQlsaXQuc291cmNlU3RhcnQsCisJCQkJbGl0LnNvdXJjZUVuZCk7CisJCQlyZXR1cm47CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHt9CisJCisJCS8vIGp1c3QgaW4gY2FzZSAuLi4uIHVzZSBhIHByZWRlZmluZWQgZXJyb3IuLgorCQkvLyB3ZSBzaG91bGQgbmV2ZXIgY29tZSBoZXJlLi4uKGV4Y2VwdCBpZiB0aGUgY29kZSBjaGFuZ2VzICEpCisJCXRoaXMuY29uc3RhbnRPdXRPZlJhbmdlKGxpdCk7CisJfQorfQorcHVibGljIHZvaWQgY29uc3RhbnRPdXRPZlJhbmdlKExpdGVyYWwgbGl0KSB7CisJLy8gbGl0IGlzIHNvbWUgaG93IG91dCBvZiByYW5nZSBvZiBpdCBkZWNsYXJlZCB0eXBlCisJLy8gZXhhbXBsZSA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CisKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTnVtZXJpY1ZhbHVlT3V0T2ZSYW5nZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxpdC5zb3VyY2UoKSl9LAorCQlsaXQuc291cmNlU3RhcnQsCisJCWxpdC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZGVwcmVjYXRlZEZpZWxkKEZpZWxkQmluZGluZyBmaWVsZCwgQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRGaWVsZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhmaWVsZC5uYW1lKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZGVwcmVjYXRlZE1ldGhvZChNZXRob2RCaW5kaW5nIG1ldGhvZCwgQXN0Tm9kZSBsb2NhdGlvbikgeworCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKQorCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZENvbnN0cnVjdG9yLAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQkJbG9jYXRpb24uc291cmNlRW5kKTsKKwllbHNlCisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkTWV0aG9kLAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCl9LAorCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZGVwcmVjYXRlZFR5cGUoVHlwZUJpbmRpbmcgdHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgeworCWlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47IC8vIDFHODI4RE4gLSBubyB0eXBlIHJlZiBmb3Igc3ludGhldGljIGFyZ3VtZW50cworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRUeXBlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZUNhc2UoQ2FzZSBzdGF0ZW1lbnQsIENvbnN0YW50IGNvbnN0YW50KSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZUNhc2UsCisJCW5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YoY29uc3RhbnQuaW50VmFsdWUoKSl9LAorCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCisJCXN0YXRlbWVudC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlRGVmYXVsdENhc2UoRGVmYXVsdENhc2Ugc3RhdGVtZW50KSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZURlZmF1bHRDYXNlLAorCQluZXcgU3RyaW5nWzBdLAorCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCisJCXN0YXRlbWVudC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlRmllbGRJblR5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlRmllbGQsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIGZpZWxkRGVjbC5uYW1lKCl9LAorCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlSW1wb3J0KEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlSW1wb3J0LAorCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoaW1wb3J0UmVmLnRva2Vucyl9LAorCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCisJCWltcG9ydFJlZi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZChGaWVsZEJpbmRpbmcgZmllbGQsIFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb24sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9LAorCQlyZWZlcmVuY2Uuc291cmNlU3RhcnQsCisJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIE5hbWVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZUZpbmFsTG9jYWxJbml0aWFsaXphdGlvbiwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2FsLnJlYWRhYmxlTmFtZSgpKX0sCisJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKKwkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBkdXBsaWNhdGVNZXRob2RJblR5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZU1ldGhvZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZU1vZGlmaWVyRm9yRmllbGQoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgeworLyogdG8gaGlnaGxpZ2h0IG1vZGlmaWVycyB1c2U6CisJdGhpcy5oYW5kbGUoCisJCW5ldyBQcm9ibGVtKAorCQkJRHVwbGljYXRlTW9kaWZpZXJGb3JGaWVsZCwKKwkJCW5ldyBTdHJpbmdbXSB7ZmllbGREZWNsLm5hbWUoKX0sCisJCQlmaWVsZERlY2wubW9kaWZpZXJzLnNvdXJjZVN0YXJ0LAorCQkJZmllbGREZWNsLm1vZGlmaWVycy5zb3VyY2VFbmQpKTsKKyovCisKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlTW9kaWZpZXJGb3JGaWVsZCwKKwkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfSwKKwkJZmllbGREZWNsLnNvdXJjZVN0YXJ0LAorCQlmaWVsZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlTW9kaWZpZXJGb3JUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlTW9kaWZpZXJGb3JUeXBlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZU1vZGlmaWVyRm9yVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2wsIGJvb2xlYW4gY29tcGxhaW5Gb3JBcmd1bWVudCkgeworCXRoaXMuaGFuZGxlKAorCQljb21wbGFpbkZvckFyZ3VtZW50CisJCQk/ICBJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvckFyZ3VtZW50IAorCQkJOiBJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvclZhcmlhYmxlLAorCQluZXcgU3RyaW5nW10ge2xvY2FsRGVjbC5uYW1lKCl9LAorCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCisJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZHVwbGljYXRlTmVzdGVkVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlTmVzdGVkVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfSwKKwkJdHlwZURlY2wuc291cmNlU3RhcnQsCisJCXR5cGVEZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBkdXBsaWNhdGVTdXBlcmludGVyZmFjZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wsIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkR1cGxpY2F0ZVN1cGVySW50ZXJmYWNlLAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZyhzdXBlclR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkJbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKKwkJdHlwZURlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGR1cGxpY2F0ZVR5cGVzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBVbml0RGVjbCwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdHlwZURlY2w7IC8vIHJlcG9ydCB0aGUgcHJvYmxlbSBhZ2FpbnN0IHRoZSB0eXBlIG5vdCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uRHVwbGljYXRlVHlwZXMsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjb21wVW5pdERlY2wuZ2V0RmlsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZURlY2wubmFtZSl9LAorCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKKwkJdHlwZURlY2wuc291cmNlRW5kLAorCQljb21wVW5pdERlY2wuY29tcGlsYXRpb25SZXN1bHQpOworfQorcHVibGljIHZvaWQgZXJyb3JOb01ldGhvZEZvcihNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgVHlwZUJpbmRpbmcgcmVjVHlwZSwgVHlwZUJpbmRpbmdbXSBwYXJhbXMpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGkgIT0gMCkKKwkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKHBhcmFtc1tpXS5yZWFkYWJsZU5hbWUoKSkpOworCX0KKworCXRoaXMuaGFuZGxlKAorCQlyZWNUeXBlLmlzQXJyYXlUeXBlKCkgPyBJUHJvYmxlbS5Ob01lc3NhZ2VTZW5kT25BcnJheVR5cGUgOiBJUHJvYmxlbS5Ob01lc3NhZ2VTZW5kT25CYXNlVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHJlY1R5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1lc3NhZ2VTZW5kLnNlbGVjdG9yKSwgYnVmZmVyLnRvU3RyaW5nKCl9LAorCQltZXNzYWdlU2VuZC5zb3VyY2VTdGFydCwKKwkJbWVzc2FnZVNlbmQuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGVycm9yVGhpc1N1cGVySW5TdGF0aWMoQXN0Tm9kZSByZWZlcmVuY2UpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVGhpc0luU3RhdGljQ29udGV4dCwKKwkJbmV3IFN0cmluZ1tdIHtyZWZlcmVuY2UuaXNTdXBlcigpID8gInN1cGVyIiA6ICJ0aGlzIn0sIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlyZWZlcmVuY2Uuc291cmNlU3RhcnQsCisJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZXhjZXB0aW9uVHlwZVByb2JsZW0oU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsLCBUeXBlUmVmZXJlbmNlIGV4Y2VwdGlvblR5cGUsIFR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSkgeworCWludCBwcm9ibGVtSWQgPSBleHBlY3RlZFR5cGUucHJvYmxlbUlkKCk7CisJaW50IGlkOworCXN3aXRjaCAocHJvYmxlbUlkKSB7CisJCWNhc2UgTm90Rm91bmQgOiAvLyAxCisJCQlpZCA9IElQcm9ibGVtLkV4Y2VwdGlvblR5cGVOb3RGb3VuZDsKKwkJCWJyZWFrOworCQljYXNlIE5vdFZpc2libGUgOiAvLyAyCisJCQlpZCA9IElQcm9ibGVtLkV4Y2VwdGlvblR5cGVOb3RWaXNpYmxlOworCQkJYnJlYWs7CisJCWNhc2UgQW1iaWd1b3VzIDogLy8gMworCQkJaWQgPSBJUHJvYmxlbS5FeGNlcHRpb25UeXBlQW1iaWd1b3VzOworCQkJYnJlYWs7CisJCWNhc2UgSW50ZXJuYWxOYW1lUHJvdmlkZWQgOiAvLyA0CisJCQlpZCA9IElQcm9ibGVtLkV4Y2VwdGlvblR5cGVJbnRlcm5hbE5hbWVQcm92aWRlZDsKKwkJCWJyZWFrOworCQljYXNlIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOiAvLyA1CisJCQlpZCA9IElQcm9ibGVtLkV4Y2VwdGlvblR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOworCQkJYnJlYWs7CisJCWNhc2UgTm9FcnJvciA6IC8vIDAKKwkJZGVmYXVsdCA6CisJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQlyZXR1cm47CisJfQorCXRoaXMuaGFuZGxlKAorCQlpZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlleGNlcHRpb25UeXBlLnNvdXJjZVN0YXJ0LAorCQlleGNlcHRpb25UeXBlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBmaWVsZHNPclRoaXNCZWZvcmVDb25zdHJ1Y3Rvckludm9jYXRpb24oVGhpc1JlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVGhpc1N1cGVyRHVyaW5nQ29uc3RydWN0b3JJbnZvY2F0aW9uLAorCQluZXcgU3RyaW5nWzBdLAorCQlyZWZlcmVuY2Uuc291cmNlU3RhcnQsCisJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgZmllbGRUeXBlUHJvYmxlbShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJaW50IHByb2JsZW1JZCA9IGV4cGVjdGVkVHlwZS5wcm9ibGVtSWQoKTsKKwlpbnQgaWQ7CisJc3dpdGNoIChwcm9ibGVtSWQpIHsKKwkJY2FzZSBOb3RGb3VuZCA6IC8vIDEKKwkJCWlkID0gSVByb2JsZW0uRmllbGRUeXBlTm90Rm91bmQ7CisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDogLy8gMgorCQkJaWQgPSBJUHJvYmxlbS5GaWVsZFR5cGVOb3RWaXNpYmxlOworCQkJYnJlYWs7CisJCWNhc2UgQW1iaWd1b3VzIDogLy8gMworCQkJaWQgPSBJUHJvYmxlbS5GaWVsZFR5cGVBbWJpZ3VvdXM7CisJCQlicmVhazsKKwkJY2FzZSBJbnRlcm5hbE5hbWVQcm92aWRlZCA6IC8vIDQKKwkJCWlkID0gSVByb2JsZW0uRmllbGRUeXBlSW50ZXJuYWxOYW1lUHJvdmlkZWQ7CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDogLy8gNQorCQkJaWQgPSBJUHJvYmxlbS5GaWVsZFR5cGVJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lOworCQkJYnJlYWs7CisJCWNhc2UgTm9FcnJvciA6IC8vIDAKKwkJZGVmYXVsdCA6CisJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQlyZXR1cm47CisJfQorCXRoaXMuaGFuZGxlKAorCQlpZCwKKwkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJZmllbGREZWNsLnR5cGUuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC50eXBlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBmaW5hbE1ldGhvZENhbm5vdEJlT3ZlcnJpZGRlbihNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJdGhpcy5oYW5kbGUoCisJCS8vIENhbm5vdCBvdmVycmlkZSB0aGUgZmluYWwgbWV0aG9kIGZyb20gJTEKKwkJLy8gOC40LjMuMyAtIEZpbmFsIG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4gb3IgaGlkZGVuLgorCQlJUHJvYmxlbS5GaW5hbE1ldGhvZENhbm5vdEJlT3ZlcnJpZGRlbiwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCisJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgZm9yd2FyZFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlLCBpbnQgaW5kZXhJblF1YWxpZmljYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uUmVmZXJlbmNlVG9Gb3J3YXJkRmllbGQsCisJCW5ldyBTdHJpbmdbXSB7fSwKKwkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAorCQlyZWZlcmVuY2Uuc291cmNlRW5kKTsKK30KKy8vIHVzZSB0aGlzIHByaXZhdGUgQVBJIHdoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0IGNhbiBiZSBmb3VuZCB0aHJvdWdoIHRoZQorLy8gcmVmZXJlbmNlIGNvbnRleHQuIE90aGVyd2lzZSwgdXNlIHRoZSBvdGhlciBBUEkgdGFraW5nIGEgcHJvYmxlbSBhbmQgYSBjb21waWxhdGlvbiByZXN1bHQKKy8vIGFzIGFyZ3VtZW50cworCitwcml2YXRlIHZvaWQgaGFuZGxlKAorCWludCBwcm9ibGVtSWQsIAorCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKKwlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uKXsKKworCXRoaXMuaGFuZGxlKAorCQkJcHJvYmxlbUlkLAorCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAorCQkJcHJvYmxlbUVuZFBvc2l0aW9uLAorCQkJcmVmZXJlbmNlQ29udGV4dCwgCisJCQlyZWZlcmVuY2VDb250ZXh0ID09IG51bGwgPyBudWxsIDogcmVmZXJlbmNlQ29udGV4dC5jb21waWxhdGlvblJlc3VsdCgpKTsgCisJcmVmZXJlbmNlQ29udGV4dCA9IG51bGw7Cit9CisvLyB1c2UgdGhpcyBwcml2YXRlIEFQSSB3aGVuIHRoZSBjb21waWxhdGlvbiB1bml0IHJlc3VsdCBjYW4gYmUgZm91bmQgdGhyb3VnaCB0aGUKKy8vIHJlZmVyZW5jZSBjb250ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgb3RoZXIgQVBJIHRha2luZyBhIHByb2JsZW0gYW5kIGEgY29tcGlsYXRpb24gcmVzdWx0CisvLyBhcyBhcmd1bWVudHMKKworcHJpdmF0ZSB2b2lkIGhhbmRsZSgKKwlpbnQgcHJvYmxlbUlkLCAKKwlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCWludCBzZXZlcml0eSwKKwlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAorCWludCBwcm9ibGVtRW5kUG9zaXRpb24peworCisJdGhpcy5oYW5kbGUoCisJCQlwcm9ibGVtSWQsCisJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJc2V2ZXJpdHksCisJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwkJCXByb2JsZW1FbmRQb3NpdGlvbiwKKwkJCXJlZmVyZW5jZUNvbnRleHQsIAorCQkJcmVmZXJlbmNlQ29udGV4dCA9PSBudWxsID8gbnVsbCA6IHJlZmVyZW5jZUNvbnRleHQuY29tcGlsYXRpb25SZXN1bHQoKSk7IAorCXJlZmVyZW5jZUNvbnRleHQgPSBudWxsOworfQorLy8gdXNlIHRoaXMgcHJpdmF0ZSBBUEkgd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQgY2Fubm90IGJlIGZvdW5kIHRocm91Z2ggdGhlCisvLyByZWZlcmVuY2UgY29udGV4dC4gCisKK3ByaXZhdGUgdm9pZCBoYW5kbGUoCisJaW50IHByb2JsZW1JZCwgCisJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAorCWludCBwcm9ibGVtRW5kUG9zaXRpb24sCisJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCl7CisKKwl0aGlzLmhhbmRsZSgKKwkJCXByb2JsZW1JZCwKKwkJCXByb2JsZW1Bcmd1bWVudHMsCisJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwKKwkJCXByb2JsZW1FbmRQb3NpdGlvbiwKKwkJCXJlZmVyZW5jZUNvbnRleHQsIAorCQkJdW5pdFJlc3VsdCk7IAorCXJlZmVyZW5jZUNvbnRleHQgPSBudWxsOworfQorcHVibGljIHZvaWQgaGlkaW5nRW5jbG9zaW5nVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSGlkaW5nRW5jbG9zaW5nVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfSwKKwkJdHlwZURlY2wuc291cmNlU3RhcnQsCisJCXR5cGVEZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBoaWVyYXJjaHlDaXJjdWxhcml0eShTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZSwgVHlwZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwlpbnQgc3RhcnQgPSAwOworCWludCBlbmQgPSAwOworCVN0cmluZyB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisKKwlpZiAocmVmZXJlbmNlID09IG51bGwpIHsJLy8gY2FuIG9ubHkgaGFwcGVuIHdoZW4gamF2YS5sYW5nLk9iamVjdCBpcyBidXN0ZWQKKwkJc3RhcnQgPSBzb3VyY2VUeXBlLnNvdXJjZVN0YXJ0KCk7CisJCWVuZCA9IHNvdXJjZVR5cGUuc291cmNlRW5kKCk7CisJCXR5cGVOYW1lID0gbmV3IFN0cmluZyhzdXBlclR5cGUucmVhZGFibGVOYW1lKCkpOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OworCQllbmQgPSByZWZlcmVuY2Uuc291cmNlRW5kOworCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24udG9TdHJpbmcocmVmZXJlbmNlLmdldFR5cGVOYW1lKCkpOworCX0KKworCWlmIChzb3VyY2VUeXBlID09IHN1cGVyVHlwZSkKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5IaWVyYXJjaHlDaXJjdWxhcml0eVNlbGZSZWZlcmVuY2UsCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlVHlwZS5zb3VyY2VOYW1lKCkpLCB0eXBlTmFtZX0sCisJCQlzdGFydCwKKwkJCWVuZCk7CisJZWxzZQorCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkhpZXJhcmNoeUNpcmN1bGFyaXR5LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHNvdXJjZVR5cGUuc291cmNlTmFtZSgpKSwgdHlwZU5hbWV9LAorCQkJc3RhcnQsCisJCQllbmQpOworfQorcHVibGljIHZvaWQgaGllcmFyY2h5SGFzUHJvYmxlbXMoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5IaWVyYXJjaHlIYXNQcm9ibGVtcywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJdHlwZS5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsQWJzdHJhY3RNb2RpZmllckNvbWJpbmF0aW9uRm9yTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxBYnN0cmFjdE1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAorCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAorCQltZXRob2REZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsQWJzdHJhY3RGb3JDbGFzcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxBYnN0cmFjdEZvckNsYXNzLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxWb2xhdGlsZUZvckZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyQ29tYmluYXRpb25GaW5hbFZvbGF0aWxlRm9yRmllbGQsCisJCW5ldyBTdHJpbmdbXSB7ZmllbGREZWNsLm5hbWUoKX0sCisJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKKwkJZmllbGREZWNsLnNvdXJjZUVuZCk7Cit9CisKK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yQ2xhc3MsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9yRmllbGQoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZCwKKwkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfSwKKwkJZmllbGREZWNsLnNvdXJjZVN0YXJ0LAorCQlmaWVsZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckludGVyZmFjZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJdHlwZS5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2VGaWVsZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckludGVyZmFjZUZpZWxkLAorCQluZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9LAorCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckludGVyZmFjZU1ldGhvZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckxvY2FsQ2xhc3MoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JMb2NhbENsYXNzLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvck1lbWJlckNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVyQ2xhc3MsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVySW50ZXJmYWNlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yTWVtYmVySW50ZXJmYWNlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvck1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JNZXRob2QsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAorCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAorCQltZXRob2REZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JWYXJpYWJsZShMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbCwgYm9vbGVhbiBjb21wbGFpbkFzQXJndW1lbnQpIHsKKwl0aGlzLmhhbmRsZSgKKwkJY29tcGxhaW5Bc0FyZ3VtZW50CisJCQk/IElQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckFyZ3VtZW50CisJCQk6IElQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvclZhcmlhYmxlLAorCQluZXcgU3RyaW5nW10ge2xvY2FsRGVjbC5uYW1lKCl9LAorCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCisJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaWxsZWdhbFByaW1pdGl2ZU9yQXJyYXlUeXBlRm9yRW5jbG9zaW5nSW5zdGFuY2UoVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbGxlZ2FsUHJpbWl0aXZlT3JBcnJheVR5cGVGb3JFbmNsb3NpbmdJbnN0YW5jZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsU3RhdGljTW9kaWZpZXJGb3JNZW1iZXJUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbFN0YXRpY01vZGlmaWVyRm9yTWVtYmVyVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJdHlwZS5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBpbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JGaWVsZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvckZpZWxkLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGREZWNsLm5hbWUoKSl9LAorCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWVtYmVyVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1lbWJlclR5cGUsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLklsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJGb3JJbnRlcmZhY2VNZW1iZXJUeXBlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckZvckludGVyZmFjZU1lbWJlclR5cGUsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaWxsZWdhbFZvaWRFeHByZXNzaW9uKEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW52YWxpZFZvaWRFeHByZXNzaW9uLAorCQluZXcgU3RyaW5nW10ge30sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW1wb3J0UHJvYmxlbShJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBCaW5kaW5nIGV4cGVjdGVkSW1wb3J0KSB7CisJaW50IHByb2JsZW1JZCA9IGV4cGVjdGVkSW1wb3J0LnByb2JsZW1JZCgpOworCWludCBpZDsKKwlzd2l0Y2ggKHByb2JsZW1JZCkgeworCQljYXNlIE5vdEZvdW5kIDogLy8gMQorCQkJaWQgPSBJUHJvYmxlbS5JbXBvcnROb3RGb3VuZDsKKwkJCWJyZWFrOworCQljYXNlIE5vdFZpc2libGUgOiAvLyAyCisJCQlpZCA9IElQcm9ibGVtLkltcG9ydE5vdFZpc2libGU7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOiAvLyAzCisJCQlpZCA9IElQcm9ibGVtLkltcG9ydEFtYmlndW91czsKKwkJCWJyZWFrOworCQljYXNlIEludGVybmFsTmFtZVByb3ZpZGVkIDogLy8gNAorCQkJaWQgPSBJUHJvYmxlbS5JbXBvcnRJbnRlcm5hbE5hbWVQcm92aWRlZDsKKwkJCWJyZWFrOworCQljYXNlIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOiAvLyA1CisJCQlpZCA9IElQcm9ibGVtLkltcG9ydEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWU7CisJCQlicmVhazsKKwkJY2FzZSBOb0Vycm9yIDogLy8gMAorCQlkZWZhdWx0IDoKKwkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCXJldHVybjsKKwl9CisJU3RyaW5nIGFyZ3VtZW50OworCWlmKGV4cGVjdGVkSW1wb3J0IGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJYXJndW1lbnQgPSBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKCgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpZXhwZWN0ZWRJbXBvcnQpLmNvbXBvdW5kTmFtZSk7CisJfSBlbHNlIHsKKwkJYXJndW1lbnQgPSBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGltcG9ydFJlZi50b2tlbnMpOworCX0KKwl0aGlzLmhhbmRsZShpZCwgbmV3IFN0cmluZ1tdIHthcmd1bWVudH0sIGltcG9ydFJlZi5zb3VyY2VTdGFydCwgaW1wb3J0UmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kLCBSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUpIHsKKwlpZiAodHlwZSA9PSBjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzKQorCQl0aGlzLmhhbmRsZSgKKwkJCS8vIEV4Y2VwdGlvbiAlMSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRocm93cyBjbGF1c2UgaW4gJTIKKwkJCS8vIDkuNC40IC0gVGhlIHR5cGUgb2YgZXhjZXB0aW9uIGluIHRoZSB0aHJvd3MgY2xhdXNlIGlzIGluY29tcGF0aWJsZS4KKwkJCUlQcm9ibGVtLkluY29tcGF0aWJsZUV4Y2VwdGlvbkluVGhyb3dzQ2xhdXNlLAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpKSwKKwkJCQluZXcgU3RyaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCWluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJCWluaGVyaXRlZE1ldGhvZC5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJCScuJykpfSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworCWVsc2UJCisJCXRoaXMuaGFuZGxlKAorCQkJLy8gRXhjZXB0aW9uICUxIGluIHRocm93cyBjbGF1c2Ugb2YgJTIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCAlMworCQkJLy8gOS40LjQgLSBUaGUgdHlwZSBvZiBleGNlcHRpb24gaW4gdGhlIHRocm93cyBjbGF1c2UgaXMgaW5jb21wYXRpYmxlLgorCQkJSVByb2JsZW0uSW5jb21wYXRpYmxlRXhjZXB0aW9uSW5Jbmhlcml0ZWRNZXRob2RUaHJvd3NDbGF1c2UsCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lKCkpLAorCQkJCW5ldyBTdHJpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJY3VycmVudE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zb3VyY2VOYW1lKCksCisJCQkJCQljdXJyZW50TWV0aG9kLnJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSksCisJCQkJbmV3IFN0cmluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCksCisJCQkJCQlpbmhlcml0ZWRNZXRob2QucmVhZGFibGVOYW1lKCksCisJCQkJCQknLicpKX0sCisJCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIGluY29tcGF0aWJsZVJldHVyblR5cGUoTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgeworCVN0cmluZ0J1ZmZlciBtZXRob2RTaWduYXR1cmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJbWV0aG9kU2lnbmF0dXJlCisJCS5hcHBlbmQoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKQorCQkuYXBwZW5kKCcuJykKKwkJLmFwcGVuZChpbmhlcml0ZWRNZXRob2QucmVhZGFibGVOYW1lKCkpOworCisJdGhpcy5oYW5kbGUoCisJCS8vIFJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoICUxCisJCS8vIDkuNC4yIC0gVGhlIHJldHVybiB0eXBlIGZyb20gdGhlIG1ldGhvZCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZGVjbGFyYXRpb24uCisJCUlQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGUsCisJCW5ldyBTdHJpbmdbXSB7bWV0aG9kU2lnbmF0dXJlLnRvU3RyaW5nKCl9LAorCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCisJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UoCisJUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSByZWZlcmVuY2UsIAorCVR5cGVCaW5kaW5nIHF1YWxpZmljYXRpb25UeXBlKSB7CisJCQorCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbmNvcnJlY3RFbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSwgCisJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcocXVhbGlmaWNhdGlvblR5cGUucmVhZGFibGVOYW1lKCkpfSwgCisJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwgCisJCXJlZmVyZW5jZS5zb3VyY2VFbmQpOyAKK30KK3B1YmxpYyB2b2lkIGluY29ycmVjdExvY2F0aW9uRm9yRW1wdHlEaW1lbnNpb24oQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgaW5kZXgpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbERpbWVuc2lvbiwKKwkJbmV3IFN0cmluZ1swXSwKKwkJZXhwcmVzc2lvbi5kaW1lbnNpb25zW2luZGV4ICsgMV0uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uZGltZW5zaW9uc1tpbmRleCArIDFdLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbmNvcnJlY3RTd2l0Y2hUeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgdGVzdFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW5jb3JyZWN0U3dpdGNoVHlwZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRlc3RUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5KFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIE1ldGhvZEJpbmRpbmcgY29uY3JldGVNZXRob2QsIE1ldGhvZEJpbmRpbmdbXSBhYnN0cmFjdE1ldGhvZHMpIHsKKwlTdHJpbmdCdWZmZXIgY29uY3JldGVTaWduYXR1cmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJY29uY3JldGVTaWduYXR1cmUKKwkJLmFwcGVuZChjb25jcmV0ZU1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSkKKwkJLmFwcGVuZCgnLicpCisJCS5hcHBlbmQoY29uY3JldGVNZXRob2QucmVhZGFibGVOYW1lKCkpOworCXRoaXMuaGFuZGxlKAorCQkvLyBUaGUgaW5oZXJpdGVkIG1ldGhvZCAlMSBjYW5ub3QgaGlkZSB0aGUgcHVibGljIGFic3RyYWN0IG1ldGhvZCBpbiAlMgorCQlJUHJvYmxlbS5Jbmhlcml0ZWRNZXRob2RSZWR1Y2VzVmlzaWJpbGl0eSwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcoY29uY3JldGVTaWduYXR1cmUudG9TdHJpbmcoKSksCisJCQluZXcgU3RyaW5nKGFic3RyYWN0TWV0aG9kc1swXS5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQl0eXBlLnNvdXJjZVN0YXJ0KCksCisJCXR5cGUuc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgaW5oZXJpdGVkTWV0aG9kc0hhdmVJbmNvbXBhdGlibGVSZXR1cm5UeXBlcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nW10gaW5oZXJpdGVkTWV0aG9kcywgaW50IGxlbmd0aCkgeworCVN0cmluZ0J1ZmZlciBtZXRob2RTaWduYXR1cmVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+PSAwOykgeworCQltZXRob2RTaWduYXR1cmVzCisJCQkuYXBwZW5kKGluaGVyaXRlZE1ldGhvZHNbaV0uZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpCisJCQkuYXBwZW5kKCcuJykKKwkJCS5hcHBlbmQoaW5oZXJpdGVkTWV0aG9kc1tpXS5yZWFkYWJsZU5hbWUoKSk7CisJCWlmIChpICE9IDApCisJCQltZXRob2RTaWduYXR1cmVzLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXRoaXMuaGFuZGxlKAorCQkvLyBSZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAlMQorCQkvLyA5LjQuMiAtIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSBtZXRob2QgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlY2xhcmF0aW9uLgorCQlJUHJvYmxlbS5JbmNvbXBhdGlibGVSZXR1cm5UeXBlLAorCQluZXcgU3RyaW5nW10ge21ldGhvZFNpZ25hdHVyZXMudG9TdHJpbmcoKX0sCisJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJdHlwZS5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBpbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHksCisJCW5ldyBTdHJpbmdbMF0sCisJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKKwkJZmllbGREZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbm5lclR5cGVzQ2Fubm90RGVjbGFyZVN0YXRpY0luaXRpYWxpemVycyhSZWZlcmVuY2VCaW5kaW5nIGlubmVyVHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5DYW5ub3REZWZpbmVTdGF0aWNJbml0aWFsaXplckluTG9jYWxUeXBlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5uZXJUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW50ZXJmYWNlQ2Fubm90SGF2ZUNvbnN0cnVjdG9ycyhDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludGVyZmFjZUNhbm5vdEhhdmVDb25zdHJ1Y3RvcnMsCisJCW5ldyBTdHJpbmdbMF0sCisJCWNvbnN0cnVjdG9yLnNvdXJjZVN0YXJ0LAorCQljb25zdHJ1Y3Rvci5zb3VyY2VFbmQsCisJCWNvbnN0cnVjdG9yLAorCQljb25zdHJ1Y3Rvci5jb21waWxhdGlvblJlc3VsdCgpKTsKK30KK3B1YmxpYyB2b2lkIGludGVyZmFjZUNhbm5vdEhhdmVJbml0aWFsaXplcnMoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW50ZXJmYWNlQ2Fubm90SGF2ZUluaXRpYWxpemVycywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKKwkJZmllbGREZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkQnJlYWsoQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkQnJlYWssCisJCW5ldyBTdHJpbmdbMF0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW52YWxpZENvbnN0cnVjdG9yKFN0YXRlbWVudCBzdGF0ZW1lbnQsIE1ldGhvZEJpbmRpbmcgdGFyZ2V0Q29uc3RydWN0b3IpIHsKKworCWJvb2xlYW4gaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yID0gCisJCShyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikKKwkJCSYmICgoQ29uc3RydWN0b3JEZWNsYXJhdGlvbilyZWZlcmVuY2VDb250ZXh0KS5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpOworCWJvb2xlYW4gaW5zaWRlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwgPQorCQkoc3RhdGVtZW50IGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCisJCQkmJiAoKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgc3RhdGVtZW50KS5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOworCisJaW50IGZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRDb25zdHJ1Y3RvcjsgLy9kZWZhdWx0Li4uCisJc3dpdGNoICh0YXJnZXRDb25zdHJ1Y3Rvci5wcm9ibGVtSWQoKSkgeworCQljYXNlIE5vdEZvdW5kIDoKKwkJCWlmIChpbnNpZGVEZWZhdWx0Q29uc3RydWN0b3IpeworCQkJCWZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRDb25zdHJ1Y3RvckluRGVmYXVsdENvbnN0cnVjdG9yOworCQkJfSBlbHNlIGlmIChpbnNpZGVJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbCl7CisJCQkJZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZENvbnN0cnVjdG9ySW5JbXBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKKwkJCX0gZWxzZSB7CisJCQkJZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZENvbnN0cnVjdG9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTm90VmlzaWJsZSA6CisJCQlpZiAoaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yKXsKKwkJCQlmbGFnID0gSVByb2JsZW0uTm90VmlzaWJsZUNvbnN0cnVjdG9ySW5EZWZhdWx0Q29uc3RydWN0b3I7CisJCQl9IGVsc2UgaWYgKGluc2lkZUltcGxpY2l0Q29uc3RydWN0b3JDYWxsKXsKKwkJCQlmbGFnID0gSVByb2JsZW0uTm90VmlzaWJsZUNvbnN0cnVjdG9ySW5JbXBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKKwkJCX0gZWxzZSB7CisJCQkJZmxhZyA9IElQcm9ibGVtLk5vdFZpc2libGVDb25zdHJ1Y3RvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFtYmlndW91cyA6CisJCQlpZiAoaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yKXsKKwkJCQlmbGFnID0gSVByb2JsZW0uQW1iaWd1b3VzQ29uc3RydWN0b3JJbkRlZmF1bHRDb25zdHJ1Y3RvcjsKKwkJCX0gZWxzZSBpZiAoaW5zaWRlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwpeworCQkJCWZsYWcgPSBJUHJvYmxlbS5BbWJpZ3VvdXNDb25zdHJ1Y3RvckluSW1wbGljaXRDb25zdHJ1Y3RvckNhbGw7CisJCQl9IGVsc2UgeworCQkJCWZsYWcgPSBJUHJvYmxlbS5BbWJpZ3VvdXNDb25zdHJ1Y3RvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJYnJlYWs7CisJfQorCisJCisJdGhpcy5oYW5kbGUoCisJCWZsYWcsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvcil9LAorCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCisJCXN0YXRlbWVudC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW52YWxpZENvbnRpbnVlKEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW52YWxpZENvbnRpbnVlLAorCQluZXcgU3RyaW5nWzBdLAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRFbmNsb3NpbmdUeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgdHlwZSwgVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCisJaW50IGZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRUeXBlOyAvLyBkZWZhdWx0CisJc3dpdGNoICh0eXBlLnByb2JsZW1JZCgpKSB7CisJCWNhc2UgTm90Rm91bmQgOiAvLyAxCisJCQlmbGFnID0gSVByb2JsZW0uVW5kZWZpbmVkVHlwZTsKKwkJCWJyZWFrOworCQljYXNlIE5vdFZpc2libGUgOiAvLyAyCisJCQlmbGFnID0gSVByb2JsZW0uTm90VmlzaWJsZVR5cGU7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOiAvLyAzCisJCQlmbGFnID0gSVByb2JsZW0uQW1iaWd1b3VzVHlwZTsKKwkJCWJyZWFrOworCQljYXNlIEludGVybmFsTmFtZVByb3ZpZGVkIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5JbnRlcm5hbFR5cGVOYW1lUHJvdmlkZWQ7CisJCQlicmVhazsKKwkJY2FzZSBOb0Vycm9yIDogLy8gMAorCQlkZWZhdWx0IDoKKwkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCWJyZWFrOworCX0KKworCXRoaXMuaGFuZGxlKAorCQlmbGFnLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiLiIgKyBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwgLy8kTk9OLU5MUy0xJAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkRXhwcmVzc2lvbkFzU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbil7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRFeHByZXNzaW9uQXNTdGF0ZW1lbnQsCisJCW5ldyBTdHJpbmdbMF0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRGaWVsZChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiwgVHlwZUJpbmRpbmcgc2VhcmNoZWRUeXBlKSB7CisJaW50IHNldmVyaXR5ID0gRXJyb3I7CisJaW50IGZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRGaWVsZDsKKwlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaWVsZFJlZi5iaW5kaW5nOworCXN3aXRjaCAoZmllbGQucHJvYmxlbUlkKCkpIHsKKwkJY2FzZSBOb3RGb3VuZCA6CisJCQlmbGFnID0gSVByb2JsZW0uVW5kZWZpbmVkRmllbGQ7CisvKiBhbHNvIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgc2VhcmNoZWRUeXBlIGlzIHRoZSByZWNlaXZlciB0eXBlCisJCQlpZiAoc2VhcmNoZWRUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCisJCQkJc2V2ZXJpdHkgPSBTZWNvbmRhcnlFcnJvcjsKKyovCisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob3RWaXNpYmxlRmllbGQ7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOgorCQkJZmxhZyA9IElQcm9ibGVtLkFtYmlndW91c0ZpZWxkOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24gOgorCQkJZmxhZyA9IElQcm9ibGVtLkluc3RhbmNlRmllbGREdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Jbmhlcml0ZWRGaWVsZEhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJYnJlYWs7CisJfQorCisJdGhpcy5oYW5kbGUoCisJCWZsYWcsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9LAorCQlzZXZlcml0eSwKKwkJZmllbGRSZWYuc291cmNlU3RhcnQsCisJCWZpZWxkUmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkRmllbGQoTmFtZVJlZmVyZW5jZSBuYW1lUmVmLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlpbnQgZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOworCXN3aXRjaCAoZmllbGQucHJvYmxlbUlkKCkpIHsKKwkJY2FzZSBOb3RGb3VuZCA6CisJCQlmbGFnID0gSVByb2JsZW0uVW5kZWZpbmVkRmllbGQ7CisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob3RWaXNpYmxlRmllbGQ7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOgorCQkJZmxhZyA9IElQcm9ibGVtLkFtYmlndW91c0ZpZWxkOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24gOgorCQkJZmxhZyA9IElQcm9ibGVtLkluc3RhbmNlRmllbGREdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Jbmhlcml0ZWRGaWVsZEhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJYnJlYWs7CisJfQorCXRoaXMuaGFuZGxlKAorCQlmbGFnLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfSwKKwkJbmFtZVJlZi5zb3VyY2VTdGFydCwKKwkJbmFtZVJlZi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW52YWxpZEZpZWxkKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgbmFtZVJlZiwgRmllbGRCaW5kaW5nIGZpZWxkLCBpbnQgaW5kZXgsIFR5cGVCaW5kaW5nIHNlYXJjaGVkVHlwZSkgeworCS8vdGhlIHJlc29sdXRpb24gb2YgdGhlIGluZGV4LXRoIGZpZWxkIG9mIHFuYW1lIGZhaWxlZAorCS8vcW5hbWUub3RoZXJCaW5kaW5nc1tpbmRleF0gaXMgdGhlIGJpbmRpbmcgdGhhdCBoYXMgcHJvZHVjZWQgdGhlIGVycm9yCisKKwkvL1RoZSBkaWZmZXJlbnQgdGFyZ2V0dGVkIGVycm9ycyBzaG91bGQgYmUgOgorCS8vVW5kZWZpbmVkRmllbGQKKwkvL05vdFZpc2libGVGaWVsZAorCS8vQW1iaWd1b3VzRmllbGQKKworCWlmIChzZWFyY2hlZFR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uTm9GaWVsZE9uQmFzZVR5cGUsCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwKKwkJCQlDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZVJlZi50b2tlbnMsIDAsIGluZGV4KSksCisJCQkJbmV3IFN0cmluZyhuYW1lUmVmLnRva2Vuc1tpbmRleF0pfSwKKwkJCW5hbWVSZWYuc291cmNlU3RhcnQsCisJCQluYW1lUmVmLnNvdXJjZUVuZCk7CisJCXJldHVybjsKKwl9CisKKwlpbnQgZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZEZpZWxkOworCXN3aXRjaCAoZmllbGQucHJvYmxlbUlkKCkpIHsKKwkJY2FzZSBOb3RGb3VuZCA6CisJCQlmbGFnID0gSVByb2JsZW0uVW5kZWZpbmVkRmllbGQ7CisvKiBhbHNvIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgc2VhcmNoZWRUeXBlIGlzIHRoZSByZWNlaXZlciB0eXBlCisJCQlpZiAoc2VhcmNoZWRUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpCisJCQkJc2V2ZXJpdHkgPSBTZWNvbmRhcnlFcnJvcjsKKyovCisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob3RWaXNpYmxlRmllbGQ7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOgorCQkJZmxhZyA9IElQcm9ibGVtLkFtYmlndW91c0ZpZWxkOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgTm9uU3RhdGljUmVmZXJlbmNlSW5Db25zdHJ1Y3Rvckludm9jYXRpb24gOgorCQkJZmxhZyA9IElQcm9ibGVtLkluc3RhbmNlRmllbGREdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Jbmhlcml0ZWRGaWVsZEhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJYnJlYWs7CisJfQorCXRoaXMuaGFuZGxlKAorCQlmbGFnLCAKKwkJbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZVJlZi50b2tlbnMsIDAsIGluZGV4ICsgMSkpfSwKKwkJbmFtZVJlZi5zb3VyY2VTdGFydCwgCisJCW5hbWVSZWYuc291cmNlRW5kKTsgCit9CitwdWJsaWMgdm9pZCBpbnZhbGlkTWV0aG9kKE1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kLCBNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCS8vIENPREUgc2hvdWxkIGJlIFVQREFURUQgYWNjb3JkaW5nIHRvIGVycm9yIGNvZGluZyBpbiB0aGUgZGlmZmVyZW50IG1ldGhvZCBiaW5kaW5nIGVycm9ycworCS8vIFRoZSBkaWZmZXJlbnQgdGFyZ2V0dGVkIGVycm9ycyBzaG91bGQgYmUgOgorCS8vIAlVbmRlZmluZWRNZXRob2QKKwkvLwlOb3RWaXNpYmxlTWV0aG9kCisJLy8JQW1iaWd1b3VzTWV0aG9kCisJLy8gIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUKKwkvLwlJbnN0YW5jZU1ldGhvZER1cmluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbgorCS8vIFN0YXRpY01ldGhvZFJlcXVlc3RlZAorCisJaW50IGZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRNZXRob2Q7IC8vZGVmYXVsdC4uLgorCXN3aXRjaCAobWV0aG9kLnByb2JsZW1JZCgpKSB7CisJCWNhc2UgTm90Rm91bmQgOgorCQkJZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZE1ldGhvZDsKKwkJCWJyZWFrOworCQljYXNlIE5vdFZpc2libGUgOgorCQkJZmxhZyA9IElQcm9ibGVtLk5vdFZpc2libGVNZXRob2Q7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOgorCQkJZmxhZyA9IElQcm9ibGVtLkFtYmlndW91c01ldGhvZDsKKwkJCWJyZWFrOworCQljYXNlIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJZmxhZyA9IElQcm9ibGVtLkluaGVyaXRlZE1ldGhvZEhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5JbnN0YW5jZU1ldGhvZER1cmluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCA6CisJCQlmbGFnID0gSVByb2JsZW0uU3RhdGljTWV0aG9kUmVxdWVzdGVkOworCQkJYnJlYWs7CisJCWNhc2UgTm9FcnJvciA6IC8vIDAKKwkJZGVmYXVsdCA6CisJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQlicmVhazsKKwl9CisKKwlpZiAoZmxhZyA9PSBJUHJvYmxlbS5VbmRlZmluZWRNZXRob2QpIHsKKwkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbU1ldGhvZCA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgbWV0aG9kOworCQlpZiAocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2ggIT0gbnVsbCkgeworCQkJCXRoaXMuaGFuZGxlKAorCQkJCQlJUHJvYmxlbS5QYXJhbWV0ZXJNaXNtYXRjaCwKKwkJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJCW5ldyBTdHJpbmcocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2guZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJCQkJbmV3IFN0cmluZyhwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaC5zZWxlY3RvciksCisJCQkJCQlwYXJhbWV0ZXJzQXNTdHJpbmcocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2gpLAorCQkJCQkJcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCl9LAorCQkJCQkoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMiksCisJCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJdGhpcy5oYW5kbGUoCisJCWZsYWcsCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJKGludCkgKG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbiA+Pj4gMzIpLAorCQkoaW50KSBtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24pOworfQorcHVibGljIHZvaWQgaW52YWxpZE51bGxUb1N5bmNocm9uaXplKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkTnVsbFRvU3luY2hyb25pemVkLAorCQluZXcgU3RyaW5nWzBdLAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkT3BlcmF0b3IoQmluYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRPcGVyYXRvciwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCWV4cHJlc3Npb24ub3BlcmF0b3JUb1N0cmluZygpLAorCQkJbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiLCAiICsgbmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpfSwgLy8kTk9OLU5MUy0xJAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkT3BlcmF0b3IoQ29tcG91bmRBc3NpZ25tZW50IGFzc2lnbiwgVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5JbnZhbGlkT3BlcmF0b3IsCisJCW5ldyBTdHJpbmdbXSB7CisJCQlhc3NpZ24ub3BlcmF0b3JUb1N0cmluZygpLAorCQkJbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiLCAiICsgbmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpfSwgLy8kTk9OLU5MUy0xJAorCQlhc3NpZ24uc291cmNlU3RhcnQsCisJCWFzc2lnbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgaW52YWxpZE9wZXJhdG9yKFVuYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRPcGVyYXRvciwKKwkJbmV3IFN0cmluZ1tdIHtleHByZXNzaW9uLm9wZXJhdG9yVG9TdHJpbmcoKSwgbmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRTdXBlcmNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIFR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzc1JlZiwgUmVmZXJlbmNlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKKwlpbnQgcHJvYmxlbUlkID0gZXhwZWN0ZWRUeXBlLnByb2JsZW1JZCgpOworCWludCBpZDsKKwlzd2l0Y2ggKHByb2JsZW1JZCkgeworCQljYXNlIE5vdEZvdW5kIDogLy8gMQorCQkJaWQgPSBJUHJvYmxlbS5TdXBlcmNsYXNzTm90Rm91bmQ7CisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDogLy8gMgorCQkJaWQgPSBJUHJvYmxlbS5TdXBlcmNsYXNzTm90VmlzaWJsZTsKKwkJCWJyZWFrOworCQljYXNlIEFtYmlndW91cyA6IC8vIDMKKwkJCWlkID0gSVByb2JsZW0uU3VwZXJjbGFzc0FtYmlndW91czsKKwkJCWJyZWFrOworCQljYXNlIEludGVybmFsTmFtZVByb3ZpZGVkIDogLy8gNAorCQkJaWQgPSBJUHJvYmxlbS5TdXBlcmNsYXNzSW50ZXJuYWxOYW1lUHJvdmlkZWQ7CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDogLy8gNQorCQkJaWQgPSBJUHJvYmxlbS5TdXBlcmNsYXNzSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJcmV0dXJuOworCX0KKwl0aGlzLmhhbmRsZSgKKwkJaWQsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCXN1cGVyY2xhc3NSZWYuc291cmNlU3RhcnQsCisJCXN1cGVyY2xhc3NSZWYuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRTdXBlcmludGVyZmFjZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBUeXBlUmVmZXJlbmNlIHN1cGVyaW50ZXJmYWNlUmVmLCBSZWZlcmVuY2VCaW5kaW5nIGV4cGVjdGVkVHlwZSkgeworCWludCBwcm9ibGVtSWQgPSBleHBlY3RlZFR5cGUucHJvYmxlbUlkKCk7CisJaW50IGlkOworCXN3aXRjaCAocHJvYmxlbUlkKSB7CisJCWNhc2UgTm90Rm91bmQgOiAvLyAxCisJCQlpZCA9IElQcm9ibGVtLkludGVyZmFjZU5vdEZvdW5kOworCQkJYnJlYWs7CisJCWNhc2UgTm90VmlzaWJsZSA6IC8vIDIKKwkJCWlkID0gSVByb2JsZW0uSW50ZXJmYWNlTm90VmlzaWJsZTsKKwkJCWJyZWFrOworCQljYXNlIEFtYmlndW91cyA6IC8vIDMKKwkJCWlkID0gSVByb2JsZW0uSW50ZXJmYWNlQW1iaWd1b3VzOworCQkJYnJlYWs7CisJCWNhc2UgSW50ZXJuYWxOYW1lUHJvdmlkZWQgOiAvLyA0CisJCQlpZCA9IElQcm9ibGVtLkludGVyZmFjZUludGVybmFsTmFtZVByb3ZpZGVkOworCQkJYnJlYWs7CisJCWNhc2UgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA6IC8vIDUKKwkJCWlkID0gSVByb2JsZW0uSW50ZXJmYWNlSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZTsKKwkJCWJyZWFrOworCQljYXNlIE5vRXJyb3IgOiAvLyAwCisJCWRlZmF1bHQgOgorCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgorCQkJcmV0dXJuOworCX0KKwkJdGhpcy5oYW5kbGUoCisJCQlpZCwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCQlzdXBlcmludGVyZmFjZVJlZi5zb3VyY2VTdGFydCwKKwkJCXN1cGVyaW50ZXJmYWNlUmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkVHlwZShBc3ROb2RlIGxvY2F0aW9uLCBUeXBlQmluZGluZyB0eXBlKSB7CisJaW50IGZsYWcgPSBJUHJvYmxlbS5VbmRlZmluZWRUeXBlOyAvLyBkZWZhdWx0CisJc3dpdGNoICh0eXBlLnByb2JsZW1JZCgpKSB7CisJCWNhc2UgTm90Rm91bmQgOgorCQkJZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZFR5cGU7CisJCQlicmVhazsKKwkJY2FzZSBOb3RWaXNpYmxlIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Ob3RWaXNpYmxlVHlwZTsKKwkJCWJyZWFrOworCQljYXNlIEFtYmlndW91cyA6CisJCQlmbGFnID0gSVByb2JsZW0uQW1iaWd1b3VzVHlwZTsKKwkJCWJyZWFrOworCQljYXNlIEludGVybmFsTmFtZVByb3ZpZGVkIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5JbnRlcm5hbFR5cGVOYW1lUHJvdmlkZWQ7CisJCQlicmVhazsKKwkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKKwkJCWZsYWcgPSBJUHJvYmxlbS5Jbmhlcml0ZWRUeXBlSGlkZXNFbmNsb3NpbmdOYW1lOworCQkJYnJlYWs7CisJCWNhc2UgTm9FcnJvciA6IC8vIDAKKwkJZGVmYXVsdCA6CisJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCisJCQlicmVhazsKKwl9CisKKwl0aGlzLmhhbmRsZSgKKwkJZmxhZywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkVHlwZVJlZmVyZW5jZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW52YWxpZFR5cGVFeHByZXNzaW9uLAorCQluZXcgU3RyaW5nWzBdLAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBpbnZhbGlkVHlwZVRvU3luY2hyb25pemUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyB0eXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRUeXBlVG9TeW5jaHJvbml6ZWQsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGludmFsaWRVbmFyeUV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRVbmFyeUV4cHJlc3Npb24sCisJCW5ldyBTdHJpbmdbMF0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIGlzQ2xhc3NQYXRoQ29ycmVjdChjaGFyW11bXSB3ZWxsS25vd25UeXBlTmFtZSwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsKSB7CisJcmVmZXJlbmNlQ29udGV4dCA9IGNvbXBVbml0RGVjbDsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSXNDbGFzc1BhdGhDb3JyZWN0LAorCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcod2VsbEtub3duVHlwZU5hbWUpfSwgCisJCUFib3J0Q29tcGlsYXRpb24gfCBFcnJvciwKKwkJY29tcFVuaXREZWNsID09IG51bGwgPyAwIDogY29tcFVuaXREZWNsLnNvdXJjZVN0YXJ0LAorCQljb21wVW5pdERlY2wgPT0gbnVsbCA/IDEgOiBjb21wVW5pdERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG1hc2tlZEV4Y2VwdGlvbkhhbmRsZXIoUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk1hc2tlZENhdGNoLAorCQluZXcgU3RyaW5nWzBdLAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG1ldGhvZE5lZWRpbmdBYnN0cmFjdE1vZGlmaWVyKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTWV0aG9kUmVxdWlyZXNCb2R5LAorCQluZXcgU3RyaW5nWzBdLAorCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAorCQltZXRob2REZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBtZXRob2ROZWVkaW5nTm9Cb2R5KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJKChtZXRob2REZWNsLm1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY05hdGl2ZSkgIT0gMCkgPyBJUHJvYmxlbS5Cb2R5Rm9yTmF0aXZlTWV0aG9kIDogSVByb2JsZW0uQm9keUZvckFic3RyYWN0TWV0aG9kLAorCQluZXcgU3RyaW5nWzBdLAorCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAorCQltZXRob2REZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBtZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTWV0aG9kQnV0V2l0aENvbnN0cnVjdG9yTmFtZSwKKwkJbmV3IFN0cmluZ1swXSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbihSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwlib29sZWFuIGluc2lkZUNvbnN0cnVjdG9yQ2FsbCA9CisJCShsb2NhdGlvbiBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKQorCQkJJiYgKCgoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGxvY2F0aW9uKS5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOworCisJdGhpcy5oYW5kbGUoCisJCWluc2lkZUNvbnN0cnVjdG9yQ2FsbAorCQkJPyBJUHJvYmxlbS5NaXNzaW5nRW5jbG9zaW5nSW5zdGFuY2VGb3JDb25zdHJ1Y3RvckNhbGwKKwkJCTogSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG1pc3NpbmdSZXR1cm5UeXBlKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5NaXNzaW5nUmV0dXJuVHlwZSwKKwkJbmV3IFN0cmluZ1swXSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbXVzdERlZmluZURpbWVuc2lvbnNPckluaXRpYWxpemVyKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5NdXN0RGVmaW5lRWl0aGVyRGltZW5zaW9uRXhwcmVzc2lvbnNPckluaXRpYWxpemVyLAorCQluZXcgU3RyaW5nWzBdLAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBtdXN0U3BlY2lmeVBhY2thZ2UoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk11c3RTcGVjaWZ5UGFja2FnZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKX0sCisJCWNvbXBVbml0RGVjbC5zb3VyY2VTdGFydCwKKwkJY29tcFVuaXREZWNsLnNvdXJjZVN0YXJ0ICsgMSk7CQorfQorcHVibGljIHZvaWQgbXVzdFVzZUFTdGF0aWNNZXRob2QoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlN0YXRpY01ldGhvZFJlcXVlc3RlZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCl9LAorCQltZXNzYWdlU2VuZC5zb3VyY2VTdGFydCwKKwkJbWVzc2FnZVNlbmQuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbmVlZEltcGxlbWVudGF0aW9uKCkgeworCXRoaXMuYWJvcnREdWVUb0ludGVybmFsRXJyb3IoVXRpbC5iaW5kKCJhYm9ydC5taXNzaW5nQ29kZSIpKTsgLy8kTk9OLU5MUy0xJAorfQorcHVibGljIHZvaWQgbmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcyhGaWVsZEJpbmRpbmcgZmllbGQsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTmVlZFRvRW11bGF0ZUZpZWxkUmVhZEFjY2VzcywKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhmaWVsZC5uYW1lKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbmVlZFRvRW11bGF0ZUZpZWxkV3JpdGVBY2Nlc3MoRmllbGRCaW5kaW5nIGZpZWxkLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBuZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKAorCU1ldGhvZEJpbmRpbmcgbWV0aG9kLCAKKwlBc3ROb2RlIGxvY2F0aW9uKSB7CisKKwlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5OZWVkVG9FbXVsYXRlQ29uc3RydWN0b3JBY2Nlc3MsIAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAorCQkJCXBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpCisJCQkgfSwgCisJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwgCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOyAKKwllbHNlCisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uTmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcywgCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCisJCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCAKKwkJCQlwYXJhbWV0ZXJzQXNTdHJpbmcobWV0aG9kKQorCQkJIH0sIAorCQkJbG9jYXRpb24uc291cmNlU3RhcnQsIAorCQkJbG9jYXRpb24uc291cmNlRW5kKTsgCit9CitwdWJsaWMgdm9pZCBuZXN0ZWRDbGFzc0Nhbm5vdERlY2xhcmVJbnRlcmZhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkNhbm5vdERlZmluZUludGVyZmFjZUluTG9jYWxUeXBlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZURlY2wubmFtZSl9LAorCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKKwkJdHlwZURlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVG9vTWFueUFyZ3VtZW50U2xvdHMsCisJCW5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyhsb2NhbC5uYW1lKSB9LAorCQlBYm9ydCB8IEVycm9yLAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yTG9jYWwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVG9vTWFueUxvY2FsVmFyaWFibGVTbG90cywKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKGxvY2FsLm5hbWUpIH0sCisJCUFib3J0IHwgRXJyb3IsCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgbm90Q29tcGF0aWJsZVR5cGVzRXJyb3IoRXF1YWxFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIGxlZnRUeXBlLCBUeXBlQmluZGluZyByaWdodFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW5jb21wYXRpYmxlVHlwZXNJbkVxdWFsaXR5T3BlcmF0b3IsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG5vdENvbXBhdGlibGVUeXBlc0Vycm9yKEluc3RhbmNlT2ZFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIGxlZnRUeXBlLCBUeXBlQmluZGluZyByaWdodFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSW5jb21wYXRpYmxlVHlwZXNJbkNvbmRpdGlvbmFsT3BlcmF0b3IsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIG9wZXJhdG9yT25seVZhbGlkT25OdW1lcmljVHlwZShDb21wb3VuZEFzc2lnbm1lbnQgIGFzc2lnbm1lbnQsIFR5cGVCaW5kaW5nIGxlZnRUeXBlLCBUeXBlQmluZGluZyByaWdodFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVHlwZU1pc21hdGNoLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlhc3NpZ25tZW50LnNvdXJjZVN0YXJ0LAorCQlhc3NpZ25tZW50LnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBvdmVycmlkZXNEZXByZWNhdGVkTWV0aG9kKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2QsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJY3VycmVudE1ldGhvZC5zb3VyY2VTdGFydCgpLAorCQljdXJyZW50TWV0aG9kLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIG92ZXJyaWRlc1BhY2thZ2VEZWZhdWx0TWV0aG9kKE1ldGhvZEJpbmRpbmcgbG9jYWxNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk92ZXJyaWRpbmdOb25WaXNpYmxlTWV0aG9kLAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlsb2NhbE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJCWxvY2FsTWV0aG9kLnJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSksCisJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhbE1ldGhvZC5zb3VyY2VTdGFydCgpLAorCQlsb2NhbE1ldGhvZC5zb3VyY2VFbmQoKSk7Cit9CitwdWJsaWMgdm9pZCBwYWNrYWdlQ29sbGlkZXNXaXRoVHlwZShDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wVW5pdERlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uUGFja2FnZUNvbGxpZGVzV2l0aFR5cGUsCisJCW5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2UudG9rZW5zKX0sCisJCWNvbXBVbml0RGVjbC5jdXJyZW50UGFja2FnZS5zb3VyY2VTdGFydCwKKwkJY29tcFVuaXREZWNsLmN1cnJlbnRQYWNrYWdlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBwYWNrYWdlSXNOb3RFeHBlY3RlZFBhY2thZ2UoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlBhY2thZ2VJc05vdEV4cGVjdGVkUGFja2FnZSwKKwkJbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBVbml0RGVjbC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZU5hbWUoKSl9LAorCQljb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2UgPT0gbnVsbCA/IDAgOiBjb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2Uuc291cmNlU3RhcnQsCisJCWNvbXBVbml0RGVjbC5jdXJyZW50UGFja2FnZSA9PSBudWxsID8gMCA6IGNvbXBVbml0RGVjbC5jdXJyZW50UGFja2FnZS5zb3VyY2VFbmQpOworfQorcHJpdmF0ZSBTdHJpbmcgcGFyYW1ldGVyc0FzU3RyaW5nKE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CisJVHlwZUJpbmRpbmdbXSBwYXJhbXMgPSBtZXRob2QucGFyYW1ldGVyczsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGkgIT0gMCkKKwkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKHBhcmFtc1tpXS5yZWFkYWJsZU5hbWUoKSkpOworCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CitwdWJsaWMgdm9pZCBwYXJzZUVycm9yKAorCWludCBzdGFydFBvc2l0aW9uLCAKKwlpbnQgZW5kUG9zaXRpb24sIAorCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UsIAorCVN0cmluZyBlcnJvclRva2VuTmFtZSwgCisJU3RyaW5nW10gcG9zc2libGVUb2tlbnMpIHsKKwkJCisJaWYgKHBvc3NpYmxlVG9rZW5zLmxlbmd0aCA9PSAwKSB7IC8vbm8gc3VnZ2VzdGlvbiBhdmFpbGFibGUKKwkJaWYgKGlzS2V5d29yZChjdXJyZW50VG9rZW5Tb3VyY2UpKSB7CisJCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3JPbktleXdvcmROb1N1Z2dlc3Rpb24sCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGN1cnJlbnRUb2tlblNvdXJjZSl9LAorCQkJCS8vIHRoaXMgaXMgdGhlIGN1cnJlbnQgLWludmFsaWQtIHRva2VuIHBvc2l0aW9uCisJCQkJc3RhcnRQb3NpdGlvbiwKKwkJCQllbmRQb3NpdGlvbik7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24sCisJCQkJbmV3IFN0cmluZ1tdIHtlcnJvclRva2VuTmFtZX0sCisJCQkJLy8gdGhpcyBpcyB0aGUgY3VycmVudCAtaW52YWxpZC0gdG9rZW4gcG9zaXRpb24KKwkJCQlzdGFydFBvc2l0aW9uLAorCQkJCWVuZFBvc2l0aW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8vYnVpbGQgYSBsaXN0IG9mIHByb2JhYmxlIHJpZ2h0IHRva2VucworCVN0cmluZ0J1ZmZlciBsaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBvc3NpYmxlVG9rZW5zLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCWlmIChpID4gMCkKKwkJCWxpc3QuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCWxpc3QuYXBwZW5kKCciJyk7CisJCWxpc3QuYXBwZW5kKHBvc3NpYmxlVG9rZW5zW2ldKTsKKwkJbGlzdC5hcHBlbmQoJyInKTsKKwl9CisKKwlpZiAoaXNLZXl3b3JkKGN1cnJlbnRUb2tlblNvdXJjZSkpIHsKKwkJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3JPbktleXdvcmQsCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKSwgbGlzdC50b1N0cmluZygpfSwKKwkJCS8vIHRoaXMgaXMgdGhlIGN1cnJlbnQgLWludmFsaWQtIHRva2VuIHBvc2l0aW9uCisJCQlzdGFydFBvc2l0aW9uLAorCQkJZW5kUG9zaXRpb24pOworCQlyZXR1cm47CisJfQorCS8vZXh0cmFjdCB0aGUgbGl0ZXJhbCB3aGVuIGl0J3MgYSBsaXRlcmFsICAKKwlpZiAoKGVycm9yVG9rZW5OYW1lLmVxdWFscygiSW50ZWdlckxpdGVyYWwiKSkgfHwgLy8kTk9OLU5MUy0xJAorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJMb25nTGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkCisJCShlcnJvclRva2VuTmFtZS5lcXVhbHMoIkZsb2F0aW5nUG9pbnRMaXRlcmFsIikpIHx8IC8vJE5PTi1OTFMtMSQKKwkJKGVycm9yVG9rZW5OYW1lLmVxdWFscygiRG91YmxlTGl0ZXJhbCIpKSB8fCAvLyROT04tTkxTLTEkCisJCShlcnJvclRva2VuTmFtZS5lcXVhbHMoIlN0cmluZ0xpdGVyYWwiKSkgfHwgLy8kTk9OLU5MUy0xJAorCQkoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKCJDaGFyYWN0ZXJMaXRlcmFsIikpIHx8IC8vJE5PTi1OTFMtMSQKKwkJKGVycm9yVG9rZW5OYW1lLmVxdWFscygiSWRlbnRpZmllciIpKSkgeyAvLyROT04tTkxTLTEkCisJCQllcnJvclRva2VuTmFtZSA9IG5ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKTsKKwl9CisKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uUGFyc2luZ0Vycm9yLAorCQluZXcgU3RyaW5nW10ge2Vycm9yVG9rZW5OYW1lLCBsaXN0LnRvU3RyaW5nKCl9LAorCQkvLyB0aGlzIGlzIHRoZSBjdXJyZW50IC1pbnZhbGlkLSB0b2tlbiBwb3NpdGlvbgorCQlzdGFydFBvc2l0aW9uLAorCQllbmRQb3NpdGlvbik7Cit9CitwdWJsaWMgdm9pZCBwdWJsaWNDbGFzc011c3RNYXRjaEZpbGVOYW1lKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBVbml0RGVjbCwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdHlwZURlY2w7IC8vIHJlcG9ydCB0aGUgcHJvYmxlbSBhZ2FpbnN0IHRoZSB0eXBlIG5vdCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uUHVibGljQ2xhc3NNdXN0TWF0Y2hGaWxlTmFtZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX0sCisJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAorCQl0eXBlRGVjbC5zb3VyY2VFbmQsCisJCWNvbXBVbml0RGVjbC5jb21waWxhdGlvblJlc3VsdCk7Cit9CisvKgorICogRmxhZyBhbGwgY29uc3RydWN0b3JzIGludm9sdmVkIGluIGEgY3ljbGUsIHdlIGtub3cgd2UgaGF2ZSBhIGN5Y2xlLgorICovCitwdWJsaWMgdm9pZCByZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24oVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgeworCisJLy8gcHJvcGFnYXRlIHRoZSByZWZlcmVuY2UgY291bnQsIG5lZ2F0aXZlIGNvdW50cyBtZWFucyBsZWFkaW5nIHRvIGEgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKKwlib29sZWFuIGhhc0NoYW5nZWQ7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlRGVjbGFyYXRpb24ubWV0aG9kczsKKwlpbnQgbWF4ID0gbWV0aG9kcy5sZW5ndGg7CisJZG8geworCQloYXNDaGFuZ2VkID0gZmFsc2U7CisJCWZvcihpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAobWV0aG9kc1tpXS5pc0NvbnN0cnVjdG9yKCkpeworCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kc1tpXTsKKwkJCQlpZiAoY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPiAwKXsKKwkJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB0YXJnZXRDb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsCisJCQkJCQk/IG51bGwKKwkJCQkJCTogKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvbk9mKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKSk7CisJCQkJCWlmICgodGFyZ2V0Q29uc3RydWN0b3IgPT0gbnVsbCkgfHwgKHRhcmdldENvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50IDwgMCkpeworCQkJCQkJaGFzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQljb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA9IC0xOworCQkJCQl9CQorCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKGhhc0NoYW5nZWQpOworCisJLy8gYWxsIHJlbWFpbmluZyBjb25zdHJ1Y3RvcnMgd2l0aCBhIHBvc2l0aXZlIGNvdW50IGFyZSBzdGlsbCBpbnZvbHZlZCBpbiBhIGN5Y2xlCisJZm9yKGludCBpID0gMDsgaSA8IG1heDsgaSsrKXsKKwkJaWYgKG1ldGhvZHNbaV0uaXNDb25zdHJ1Y3RvcigpKXsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kc1tpXTsKKwkJCWlmIChjb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA+IDApeworCQkJCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IGNvbnN0cnVjdG9yOworCQkJCXRoaXMuaGFuZGxlKAorCQkJCQlJUHJvYmxlbS5SZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24sCisJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCisJCQkJCQlwYXJhbWV0ZXJzQXNTdHJpbmcoY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcpCisJCQkJCX0sCisJCQkJCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCwKKwkJCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCk7CisJCQl9CisJCX0KKwl9Cit9CitwdWJsaWMgdm9pZCByZWRlZmluZUFyZ3VtZW50KEFyZ3VtZW50IGFyZykgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5SZWRlZmluZWRBcmd1bWVudCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGFyZy5uYW1lKX0sCisJCWFyZy5zb3VyY2VTdGFydCwKKwkJYXJnLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCByZWRlZmluZUxvY2FsKExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlJlZGVmaW5lZExvY2FsLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWxEZWNsLm5hbWUpfSwKKwkJbG9jYWxEZWNsLnNvdXJjZVN0YXJ0LAorCQlsb2NhbERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KFR5cGVCaW5kaW5nIGFycmF5VHlwZSwgQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWYpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uQXJyYXlSZWZlcmVuY2VSZXF1aXJlZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGFycmF5VHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlhcnJheVJlZi5zb3VyY2VTdGFydCwKKwkJYXJyYXlSZWYuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHJldHVyblR5cGVDYW5ub3RCZVZvaWRBcnJheShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlJldHVyblR5cGVDYW5ub3RCZVZvaWRBcnJheSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgcmV0dXJuVHlwZVByb2JsZW0oU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJaW50IHByb2JsZW1JZCA9IGV4cGVjdGVkVHlwZS5wcm9ibGVtSWQoKTsKKwlpbnQgaWQ7CisJc3dpdGNoIChwcm9ibGVtSWQpIHsKKwkJY2FzZSBOb3RGb3VuZCA6IC8vIDEKKwkJCWlkID0gSVByb2JsZW0uUmV0dXJuVHlwZU5vdEZvdW5kOworCQkJYnJlYWs7CisJCWNhc2UgTm90VmlzaWJsZSA6IC8vIDIKKwkJCWlkID0gSVByb2JsZW0uUmV0dXJuVHlwZU5vdFZpc2libGU7CisJCQlicmVhazsKKwkJY2FzZSBBbWJpZ3VvdXMgOiAvLyAzCisJCQlpZCA9IElQcm9ibGVtLlJldHVyblR5cGVBbWJpZ3VvdXM7CisJCQlicmVhazsKKwkJY2FzZSBJbnRlcm5hbE5hbWVQcm92aWRlZCA6IC8vIDQKKwkJCWlkID0gSVByb2JsZW0uUmV0dXJuVHlwZUludGVybmFsTmFtZVByb3ZpZGVkOworCQkJYnJlYWs7CisJCWNhc2UgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA6IC8vIDUKKwkJCWlkID0gSVByb2JsZW0uUmV0dXJuVHlwZUluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWU7CisJCQlicmVhazsKKwkJY2FzZSBOb0Vycm9yIDogLy8gMAorCQlkZWZhdWx0IDoKKwkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KKwkJCXJldHVybjsKKwl9CisJdGhpcy5oYW5kbGUoCisJCWlkLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW1ldGhvZERlY2wucmV0dXJuVHlwZS5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5yZXR1cm5UeXBlLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBzY2FubmVyRXJyb3IoUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVycm9yVG9rZW5OYW1lKSB7CisJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CisKKwlpbnQgZmxhZyA9IElQcm9ibGVtLlBhcnNpbmdFcnJvck5vU3VnZ2VzdGlvbjsKKwlpbnQgc3RhcnRQb3MgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisKKwkvL3NwZWNpYWwgdHJlYXRtZW50IGZvciByZWNvZ25pemVkIGVycm9ycy4uLi4KKwlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuRU5EX09GX1NPVVJDRSkpCisJCWZsYWcgPSBJUHJvYmxlbS5FbmRPZlNvdXJjZTsKKwllbHNlCisJCWlmIChlcnJvclRva2VuTmFtZS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0hFWEEpKQorCQkJZmxhZyA9IElQcm9ibGVtLkludmFsaWRIZXhhOworCQllbHNlCisJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9PQ1RBTCkpCisJCQkJZmxhZyA9IElQcm9ibGVtLkludmFsaWRPY3RhbDsKKwkJCWVsc2UKKwkJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpKQorCQkJCQlmbGFnID0gSVByb2JsZW0uSW52YWxpZENoYXJhY3RlckNvbnN0YW50OworCQkJCWVsc2UKKwkJCQkJaWYgKGVycm9yVG9rZW5OYW1lLmVxdWFscyhTY2FubmVyLklOVkFMSURfRVNDQVBFKSkKKwkJCQkJCWZsYWcgPSBJUHJvYmxlbS5JbnZhbGlkRXNjYXBlOworCQkJCQllbHNlCisJCQkJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSkpeworCQkJCQkJCWZsYWcgPSBJUHJvYmxlbS5JbnZhbGlkVW5pY29kZUVzY2FwZTsKKwkJCQkJCQkvLyBiZXR0ZXIgbG9jYXRlIHRoZSBlcnJvciBtZXNzYWdlCisJCQkJCQkJY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOworCQkJCQkJCWludCBjaGVja1BvcyA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQkJCQlpZiAoY2hlY2tQb3MgPj0gc291cmNlLmxlbmd0aCkgY2hlY2tQb3MgPSBzb3VyY2UubGVuZ3RoIC0gMTsKKwkJCQkJCQl3aGlsZSAoY2hlY2tQb3MgPj0gc3RhcnRQb3MpeworCQkJCQkJCQlpZiAoc291cmNlW2NoZWNrUG9zXSA9PSAnXFwnKSBicmVhazsKKwkJCQkJCQkJY2hlY2tQb3MgLS07CisJCQkJCQkJfQorCQkJCQkJCXN0YXJ0UG9zID0gY2hlY2tQb3M7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuSU5WQUxJRF9GTE9BVCkpCisJCQkJCQkJCWZsYWcgPSBJUHJvYmxlbS5JbnZhbGlkRmxvYXQ7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuVU5URVJNSU5BVEVEX1NUUklORykpCisJCQkJCQkJCQlmbGFnID0gSVByb2JsZW0uVW50ZXJtaW5hdGVkU3RyaW5nOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlpZiAoZXJyb3JUb2tlbk5hbWUuZXF1YWxzKFNjYW5uZXIuVU5URVJNSU5BVEVEX0NPTU1FTlQpKQorCQkJCQkJCQkJCWZsYWcgPSBJUHJvYmxlbS5VbnRlcm1pbmF0ZWRDb21tZW50OworCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCWlmIChlcnJvclRva2VuTmFtZS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0NIQVJfSU5fU1RSSU5HKSkKKwkJCQkJCQkJCQkJZmxhZyA9IElQcm9ibGVtLlVudGVybWluYXRlZFN0cmluZzsKKworCXRoaXMuaGFuZGxlKAorCQlmbGFnLCAKKwkJZmxhZyA9PSBJUHJvYmxlbS5QYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24gCisJCQk/IG5ldyBTdHJpbmdbXSB7ZXJyb3JUb2tlbk5hbWV9CisJCQk6IG5ldyBTdHJpbmdbMF0sCisJCS8vIHRoaXMgaXMgdGhlIGN1cnJlbnQgLWludmFsaWQtIHRva2VuIHBvc2l0aW9uCisJCXN0YXJ0UG9zLCAKKwkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxLAorCQlwYXJzZXIuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKK30KK3B1YmxpYyB2b2lkIHNob3VsZFJldHVybihUeXBlQmluZGluZyByZXR1cm5UeXBlLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlNob3VsZFJldHVyblZhbHVlLAorCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nIChyZXR1cm5UeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgc2lnbmFsTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb25Gb3JDaGFyQXJyYXlFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Ob0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbkZvckNoYXJBcnJheUV4cHJlc3Npb24sCisJCW5ldyBTdHJpbmdbXSB7fSwKKwkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgc3RhdGljQW5kSW5zdGFuY2VDb25mbGljdChNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QsIE1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkTWV0aG9kKSB7CisJaWYgKGN1cnJlbnRNZXRob2QuaXNTdGF0aWMoKSkKKwkJdGhpcy5oYW5kbGUoCisJCQkvLyBUaGlzIHN0YXRpYyBtZXRob2QgY2Fubm90IGhpZGUgdGhlIGluc3RhbmNlIG1ldGhvZCBmcm9tICUxCisJCQkvLyA4LjQuNi40IC0gSWYgYSBjbGFzcyBpbmhlcml0cyBtb3JlIHRoYW4gb25lIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhIHN0YXRpYyAobm9uLWFic3RyYWN0KSBtZXRob2QgY2Fubm90IGhpZGUgYW4gaW5zdGFuY2UgbWV0aG9kLgorCQkJSVByb2JsZW0uQ2Fubm90SGlkZUFuSW5zdGFuY2VNZXRob2RXaXRoQVN0YXRpY01ldGhvZCwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworCWVsc2UKKwkJdGhpcy5oYW5kbGUoCisJCQkvLyBUaGlzIGluc3RhbmNlIG1ldGhvZCBjYW5ub3Qgb3ZlcnJpZGUgdGhlIHN0YXRpYyBtZXRob2QgZnJvbSAlMQorCQkJLy8gOC40LjYuNCAtIElmIGEgY2xhc3MgaW5oZXJpdHMgbW9yZSB0aGFuIG9uZSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYW4gaW5zdGFuY2UgKG5vbi1hYnN0cmFjdCkgbWV0aG9kIGNhbm5vdCBvdmVycmlkZSBhIHN0YXRpYyBtZXRob2QuCisJCQlJUHJvYmxlbS5DYW5ub3RPdmVycmlkZUFTdGF0aWNNZXRob2RXaXRoQW5JbnN0YW5jZU1ldGhvZCwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKKwkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworfQorcHVibGljIHZvaWQgc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKEZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTm9uU3RhdGljRmllbGRGcm9tU3RhdGljSW52b2NhdGlvbiwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sCisJCWZpZWxkUmVmLnNvdXJjZVN0YXJ0LAorCQlmaWVsZFJlZi5zb3VyY2VFbmQpOyAKK30KK3B1YmxpYyB2b2lkIHN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZShRdWFsaWZpZWROYW1lUmVmZXJlbmNlIG5hbWVSZWYsIEZpZWxkQmluZGluZyBmaWVsZCl7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5vblN0YXRpY0ZpZWxkRnJvbVN0YXRpY0ludm9jYXRpb24sCisJCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfSwKKwkJbmFtZVJlZi5zb3VyY2VTdGFydCwKKwkJbmFtZVJlZi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKFNpbmdsZU5hbWVSZWZlcmVuY2UgbmFtZVJlZiwgRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5vblN0YXRpY0ZpZWxkRnJvbVN0YXRpY0ludm9jYXRpb24sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9LAorCQluYW1lUmVmLnNvdXJjZVN0YXJ0LAorCQluYW1lUmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBzdGF0aWNJbmhlcml0ZWRNZXRob2RDb25mbGljdHMoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBjb25jcmV0ZU1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIGFic3RyYWN0TWV0aG9kcykgeworCXRoaXMuaGFuZGxlKAorCQkvLyBUaGUgc3RhdGljIG1ldGhvZCAlMSBjb25mbGljdHMgd2l0aCB0aGUgYWJzdHJhY3QgbWV0aG9kIGluICUyCisJCS8vIDguNC42LjQgLSBJZiBhIGNsYXNzIGluaGVyaXRzIG1vcmUgdGhhbiBvbmUgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGl0IGlzIGFuIGVycm9yIGZvciBvbmUgdG8gYmUgc3RhdGljIChub24tYWJzdHJhY3QpIGFuZCB0aGUgb3RoZXIgYWJzdHJhY3QuCisJCUlQcm9ibGVtLlN0YXRpY0luaGVyaXRlZE1ldGhvZENvbmZsaWN0cywKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcoY29uY3JldGVNZXRob2QucmVhZGFibGVOYW1lKCkpLAorCQkJbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZHNbMF0uZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJdHlwZS5zb3VyY2VTdGFydCgpLAorCQl0eXBlLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIHN0cmluZ0NvbnN0YW50SXNFeGNlZWRpbmdVdGY4TGltaXQoQXN0Tm9kZSBsb2NhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5TdHJpbmdDb25zdGFudElzRXhjZWVkaW5nVXRmOExpbWl0LAorCQluZXcgU3RyaW5nWzBdLAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHN1cGVyY2xhc3NNdXN0QmVBQ2xhc3MoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgVHlwZVJlZmVyZW5jZSBzdXBlcmNsYXNzUmVmLCBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyVHlwZSkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5TdXBlcmNsYXNzTXVzdEJlQUNsYXNzLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc3VwZXJUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlzdXBlcmNsYXNzUmVmLnNvdXJjZVN0YXJ0LAorCQlzdXBlcmNsYXNzUmVmLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCBzdXBlcmludGVyZmFjZU11c3RCZUFuSW50ZXJmYWNlKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwgUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uU3VwZXJJbnRlcmZhY2VNdXN0QmVBbkludGVyZmFjZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHN1cGVyVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJdHlwZURlY2wuc291cmNlU3RhcnQsCisJCXR5cGVEZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB0eXBlQ2FzdEVycm9yKENhc3RFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIGxlZnRUeXBlLCBUeXBlQmluZGluZyByaWdodFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbENhc3QsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGxlZnRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBVbml0RGVjbCwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdHlwZURlY2w7IC8vIHJlcG9ydCB0aGUgcHJvYmxlbSBhZ2FpbnN0IHRoZSB0eXBlIG5vdCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVHlwZUNvbGxpZGVzV2l0aFBhY2thZ2UsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjb21wVW5pdERlY2wuZ2V0RmlsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZURlY2wubmFtZSl9LAorCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKKwkJdHlwZURlY2wuc291cmNlRW5kLAorCQljb21wVW5pdERlY2wuY29tcGlsYXRpb25SZXN1bHQpOworfQorcHVibGljIHZvaWQgdHlwZU1pc21hdGNoRXJyb3IoVHlwZUJpbmRpbmcgcmVzdWx0VHlwZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlR5cGVNaXNtYXRjaCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHJlc3VsdFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIGNvbnN0YW50VHlwZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlR5cGVNaXNtYXRjaCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbnN0YW50VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVuZGVmaW5lZExhYmVsKEJyYW5jaFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5kZWZpbmVkTGFiZWwsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzdGF0ZW1lbnQubGFiZWwpfSwKKwkJc3RhdGVtZW50LnNvdXJjZVN0YXJ0LAorCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVuZXhwZWN0ZWRTdGF0aWNNb2RpZmllckZvckZpZWxkKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVuZXhwZWN0ZWRTdGF0aWNNb2RpZmllckZvckZpZWxkLAorCQluZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9LAorCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdW5leHBlY3RlZFN0YXRpY01vZGlmaWVyRm9yTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVuZXhwZWN0ZWRTdGF0aWNNb2RpZmllckZvck1ldGhvZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCisJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVuaGFuZGxlZEV4Y2VwdGlvbihUeXBlQmluZGluZyBleGNlcHRpb25UeXBlLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisKKwlib29sZWFuIGluc2lkZURlZmF1bHRDb25zdHJ1Y3RvciA9IAorCQkocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pCisJCQkmJiAoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pcmVmZXJlbmNlQ29udGV4dCkuaXNEZWZhdWx0Q29uc3RydWN0b3IoKTsKKwlib29sZWFuIGluc2lkZUltcGxpY2l0Q29uc3RydWN0b3JDYWxsID0KKwkJKGxvY2F0aW9uIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCisJCQkmJiAoKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbG9jYXRpb24pLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7CisKKwl0aGlzLmhhbmRsZSgKKwkJaW5zaWRlRGVmYXVsdENvbnN0cnVjdG9yCisJCQk/IElQcm9ibGVtLlVuaGFuZGxlZEV4Y2VwdGlvbkluRGVmYXVsdENvbnN0cnVjdG9yCisJCQk6IChpbnNpZGVJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbCAKKwkJCQkJPyBJUHJvYmxlbS5VbmRlZmluZWRDb25zdHJ1Y3RvckluSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwKKwkJCQkJOiBJUHJvYmxlbS5VbmhhbmRsZWRFeGNlcHRpb24pLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoRmllbGRCaW5kaW5nIGJpbmRpbmcsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZCwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVubWF0Y2hlZEJyYWNrZXQoaW50IHBvc2l0aW9uLCBSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5tYXRjaGVkQnJhY2tldCwgCisJCW5ldyBTdHJpbmdbXSB7fSwKKwkJcG9zaXRpb24sIAorCQlwb3NpdGlvbiwKKwkJY29udGV4dCwKKwkJY29tcGlsYXRpb25SZXN1bHQpOworfQorcHVibGljIHZvaWQgdW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uSWxsZWdhbEVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbiwKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHRhcmdldFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKKwkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdW5yZWFjaGFibGVDb2RlKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uQ29kZUNhbm5vdEJlUmVhY2hlZCwKKwkJbmV3IFN0cmluZ1swXSwKKwkJc3RhdGVtZW50LnNvdXJjZVN0YXJ0LAorCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVucmVhY2hhYmxlRXhjZXB0aW9uSGFuZGxlcihSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5yZWFjaGFibGVDYXRjaCwKKwkJbmV3IFN0cmluZ1swXSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB1bnJlc29sdmFibGVSZWZlcmVuY2UoTmFtZVJlZmVyZW5jZSBuYW1lUmVmLCBCaW5kaW5nIGJpbmRpbmcpIHsKKwlpbnQgc2V2ZXJpdHkgPSBFcnJvcjsKKy8qIGFsc28gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBzZWFyY2hlZFR5cGUgaXMgdGhlIHJlY2VpdmVyIHR5cGUKKwlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1CaW5kaW5nKSB7CisJCVByb2JsZW1CaW5kaW5nIHByb2JsZW0gPSAoUHJvYmxlbUJpbmRpbmcpIGJpbmRpbmc7CisJCWlmIChwcm9ibGVtLnNlYXJjaFR5cGUgIT0gbnVsbCAmJiBwcm9ibGVtLnNlYXJjaFR5cGUuaXNIaWVyYXJjaHlJbmNvbnNpc3RlbnQoKSkKKwkJCXNldmVyaXR5ID0gU2Vjb25kYXJ5RXJyb3I7CisJfQorKi8KKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5kZWZpbmVkTmFtZSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJc2V2ZXJpdHksCisJCW5hbWVSZWYuc291cmNlU3RhcnQsCisJCW5hbWVSZWYuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVudXNlZEFyZ3VtZW50KExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkFyZ3VtZW50SXNOZXZlclVzZWQsCisJCW5ldyBTdHJpbmdbXSB7bG9jYWxEZWNsLm5hbWUoKX0sCisJCWxvY2FsRGVjbC5zb3VyY2VTdGFydCwKKwkJbG9jYWxEZWNsLnNvdXJjZUVuZCk7Cit9CitwdWJsaWMgdm9pZCB1bnVzZWRJbXBvcnQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5VbnVzZWRJbXBvcnQsCisJCW5ldyBTdHJpbmdbXSB7IENoYXJPcGVyYXRpb24udG9TdHJpbmcoaW1wb3J0UmVmLnRva2VucykgfSwKKwkJaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAorCQlpbXBvcnRSZWYuc291cmNlRW5kKTsgCit9CitwdWJsaWMgdm9pZCB1bnVzZWRMb2NhbFZhcmlhYmxlKExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkxvY2FsVmFyaWFibGVJc05ldmVyVXNlZCwKKwkJbmV3IFN0cmluZ1tdIHtsb2NhbERlY2wubmFtZSgpfSwKKwkJbG9jYWxEZWNsLnNvdXJjZVN0YXJ0LAorCQlsb2NhbERlY2wuc291cmNlRW5kKTsKK30KKworcHVibGljIHZvaWQgdXNlQXNzZXJ0QXNBbklkZW50aWZpZXIoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlVzZUFzc2VydEFzQW5JZGVudGlmaWVyLAorCQluZXcgU3RyaW5nWzBdLAorCQlzb3VyY2VTdGFydCwKKwkJc291cmNlRW5kKTsJCit9CisKK3B1YmxpYyB2b2lkIHZhcmlhYmxlVHlwZUNhbm5vdEJlVm9pZChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyRGVjbCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5WYXJpYWJsZVR5cGVDYW5ub3RCZVZvaWQsCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJEZWNsLm5hbWUpfSwKKwkJdmFyRGVjbC5zb3VyY2VTdGFydCwKKwkJdmFyRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkQXJyYXkoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIHZhckRlY2wpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkQXJyYXksCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJEZWNsLm5hbWUpfSwKKwkJdmFyRGVjbC5zb3VyY2VTdGFydCwKKwkJdmFyRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdmlzaWJpbGl0eUNvbmZsaWN0KE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZyBpbmhlcml0ZWRNZXRob2QpIHsKKwl0aGlzLmhhbmRsZSgKKwkJLy8JQ2Fubm90IHJlZHVjZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW5oZXJpdGVkIG1ldGhvZCBmcm9tICUxCisJCS8vIDguNC42LjMgLSBUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIGFuIGhpZGluZyBtZXRob2QgbXVzdCBwcm92aWRlIGF0IGxlYXN0IGFzIG11Y2ggYWNjZXNzIGFzIHRoZSBoaWRkZW4gbWV0aG9kLgorCQkvLyA4LjQuNi4zIC0gVGhlIGFjY2VzcyBtb2RpZmllciBvZiBhbiBvdmVyaWRpbmcgbWV0aG9kIG11c3QgcHJvdmlkZSBhdCBsZWFzdCBhcyBtdWNoIGFjY2VzcyBhcyB0aGUgb3ZlcnJpZGVuIG1ldGhvZC4KKwkJSVByb2JsZW0uTWV0aG9kUmVkdWNlc1Zpc2liaWxpdHksCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpfSwKKwkJY3VycmVudE1ldGhvZC5zb3VyY2VTdGFydCgpLAorCQljdXJyZW50TWV0aG9kLnNvdXJjZUVuZCgpKTsKK30KK3B1YmxpYyB2b2lkIHdyb25nU2VxdWVuY2VPZkV4Y2VwdGlvblR5cGVzRXJyb3IoVHJ5U3RhdGVtZW50IHN0YXRlbWVudCwgaW50IHVuZGVyLCBpbnQgdXBwZXIpIHsKKwkvL3RoZSB0d28gY2F0Y2ggYmxvY2sgdW5kZXIgYW5kIHVwcGVyIGFyZSBpbiBhbiBpbmNvcnJlY3Qgb3JkZXIuCisJLy91bmRlciBzaG91bGQgYmUgZGVmaW5lIEJFRk9SRSB1cHBlciBpbiB0aGUgc291cmNlCisKKwkvL25vdGljZSB0aGF0IHRoZSBjb21waWxlciBjb3VsZCBhcnJhbmdlIGF1dG9tYXRpY2FsbHkgdGhlCisJLy9jb3JyZWN0IG9yZGVyIC0gYW5kIHRoZSBvbmx5IGVycm9yIHdvdWxkIGJlIG9uIGN5Y2xlIC4uLi4KKwkvL29uIHRoaXMgb25lIGFnYWluICwgamF2YSBpcyBjb21waWxlci1kcml2ZW4gaW5zdGVhZCBvZiBiZWluZworCS8vdXNlci1kcml2ZW4gLi4uLi4KKworCVR5cGVSZWZlcmVuY2UgdHlwZVJlZiA9IHN0YXRlbWVudC5jYXRjaEFyZ3VtZW50c1t1bmRlcl0udHlwZTsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVW5yZWFjaGFibGVDYXRjaCwKKwkJbmV3IFN0cmluZ1swXSwKKwkJdHlwZVJlZi5zb3VyY2VTdGFydCwKKwkJdHlwZVJlZi5zb3VyY2VFbmQpOworfQorCitwdWJsaWMgdm9pZCBub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKEFzdE5vZGUgbG9jYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKKwkJbmV3IFN0cmluZ1tdIHt9LAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKK30KKworcHVibGljIHZvaWQgbm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlRvb01hbnlDb25zdGFudHNJbkNvbnN0YW50UG9vbCwKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nLnJlYWRhYmxlTmFtZSgpKX0sCisJCUFib3J0IHwgRXJyb3IsCisJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKKwkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCk7Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBpc0tleXdvcmQoY2hhcltdIHRva2VuU291cmNlKSB7CisJLyoKKwkgKiBUaGlzIGNvZGUgaXMgaGVhdmlseSBncmFtbWFyIGRlcGVuZGFudAorCSAqLworCisJaWYgKHRva2VuU291cmNlID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl0cnkgeworCQlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcigpOworCQlzY2FubmVyLnNldFNvdXJjZSh0b2tlblNvdXJjZSk7CisJCWludCB0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCWNoYXJbXSBjdXJyZW50S2V5d29yZDsKKwkJdHJ5IHsKKwkJCWN1cnJlbnRLZXl3b3JkID0gc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOworCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWludCBuZXh0VG9rZW49IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCWlmIChuZXh0VG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YKKwkJCSYmIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9PSBzY2FubmVyLnNvdXJjZS5sZW5ndGgpIHsgLy8gdG8gaGFuZGxlIGNhc2Ugd2hlcmUgd2UgaGFkIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAKKwkJCQkJCQkJCQkJCQkJCSAgICAgLy8gd2hpbGUgcmVhZGluZyB0aGUgbGFzdCB0b2tlbgorCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUVSUk9SOgorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoImdvdG8iLnRvQ2hhckFycmF5KCksIGN1cnJlbnRLZXl3b3JkKSB8fENoYXJPcGVyYXRpb24uZXF1YWxzKCJjb25zdCIudG9DaGFyQXJyYXkoKSwgY3VycmVudEtleXdvcmQpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lYWJzdHJhY3Q6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWFzc2VydDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lYnl0ZToKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lYnJlYWs6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWJvb2xlYW46CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWNhc2U6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWNoYXI6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWNhdGNoOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVjbGFzczoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lY29udGludWU6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWRvOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVkb3VibGU6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWRlZmF1bHQ6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWVsc2U6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWV4dGVuZHM6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWZvcjoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lZmluYWw6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWZsb2F0OgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVmYWxzZToKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lZmluYWxseToKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1laWY6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWludDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1laW1wb3J0OgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVpbnRlcmZhY2U6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWltcGxlbWVudHM6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWluc3RhbmNlb2Y6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWxvbmc6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZW5ldzoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lbnVsbDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lbmF0aXZlOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVwdWJsaWM6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXBhY2thZ2U6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXByaXZhdGU6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXByb3RlY3RlZDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lcmV0dXJuOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVzaG9ydDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lc3VwZXI6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXN0YXRpYzoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lc3dpdGNoOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVzdHJpY3RmcDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lc3luY2hyb25pemVkOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWV0cnk6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXRoaXM6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXRydWU6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXRocm93OgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWV0aHJvd3M6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXRyYW5zaWVudDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1ldm9pZDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1ldm9sYXRpbGU6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZXdoaWxlOgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQlkZWZhdWx0OiAKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVNldmVyaXRpZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1TZXZlcml0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ZTA3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1TZXZlcml0aWVzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CisKK3B1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbVNldmVyaXRpZXMgeworCQorCWZpbmFsIGludCBJZ25vcmUgPSAtMTsgLy8gZHVyaW5nIGhhbmRsaW5nIG9ubHkKKwlmaW5hbCBpbnQgV2FybmluZyA9IDA7IC8vIGR1cmluZyBoYW5kbGluZyBvbmx5CisKKwlmaW5hbCBpbnQgRXJyb3IgPSAxOyAvLyB3aGVuIGJpdCBpcyBzZXQ6IHByb2JsZW0gaXMgZXJyb3IsIGlmIG5vdCBpdCBpcyBhIHdhcm5pbmcKKwlmaW5hbCBpbnQgQWJvcnRDb21waWxhdGlvbiA9IDI7CisJZmluYWwgaW50IEFib3J0Q29tcGlsYXRpb25Vbml0ID0gNDsKKwlmaW5hbCBpbnQgQWJvcnRUeXBlID0gODsKKwlmaW5hbCBpbnQgQWJvcnRNZXRob2QgPSAxNjsKKwlmaW5hbCBpbnQgQWJvcnQgPSAzMDsgLy8gMnIxMTExMAorCWZpbmFsIGludCBTZWNvbmRhcnlFcnJvciA9IDY0OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vU2hvdWxkTm90SW1wbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9TaG91bGROb3RJbXBsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRlYThjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vU2hvdWxkTm90SW1wbGVtZW50LmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CisKKy8qCisgKiBTcGVjaWFsIHVuY2hlY2tlZCBleGNlcHRpb24gdHlwZSB1c2VkIAorICogdG8gZGVub3RlIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuCisgKgorICoJKGludGVybmFsIG9ubHkpCisgKi8KK3B1YmxpYyBjbGFzcyBTaG91bGROb3RJbXBsZW1lbnQgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKK3B1YmxpYyBTaG91bGROb3RJbXBsZW1lbnQoKXsKK30KK3B1YmxpYyBTaG91bGROb3RJbXBsZW1lbnQoU3RyaW5nIG1lc3NhZ2UpeworCXN1cGVyKG1lc3NhZ2UpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyN2MxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNjcgQEAKKzAgPSB7MH0KKzEgPSBzdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBqYXZhLmxhbmcuT2JqZWN0CisyID0gezB9IGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSB0eXBlCiszID0gVGhlIHR5cGUgezB9IGlzIG5vdCB2aXNpYmxlCis0ID0gVGhlIHR5cGUgezB9IGlzIGFtYmlndW91cworNSA9IFRoZSB0eXBlIHswfSBpcyBkZXByZWNhdGVkCis2ID0gVGhlIHR5cGUgezB9IGlzIGFuIGluY29ycmVjdGx5IHNwZWNpZmllZCBuZXN0ZWQgdHlwZTsgcmVwbGFjZSB0aGUgJyckJycgd2l0aCAnJy4nJworCisxNSA9IEluY29tcGF0aWJsZSBvcGVyYW5kIHR5cGVzIHswfSBhbmQgezF9CisxNiA9IEluY29tcGF0aWJsZSBjb25kaXRpb25hbCBvcGVyYW5kIHR5cGVzIHswfSBhbmQgezF9CisxNyA9IFR5cGUgbWlzbWF0Y2g6IGNhbm5vdCBjb252ZXJ0IGZyb20gezB9IHRvIHsxfQorCisyMCA9IE5vIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0aGUgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZSB0byBpbnZva2UgdGhlIHN1cGVyIGNvbnN0cnVjdG9yLiBNdXN0IGRlZmluZSBhIGNvbnN0cnVjdG9yIGFuZCBleHBsaWNpdGx5IHF1YWxpZnkgaXRzIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gd2l0aCBhbiBpbnN0YW5jZSBvZiB7MH0gKGUuZy4geC5zdXBlcigpIHdoZXJlIHggaXMgYW4gaW5zdGFuY2Ugb2YgezB9KS4KKzIxID0gTXVzdCBleHBsaWNpdGx5IHF1YWxpZnkgdGhlIGFsbG9jYXRpb24gd2l0aCBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gKGUuZy4geC5uZXcgQSgpIHdoZXJlIHggaXMgYW4gaW5zdGFuY2Ugb2YgezB9KS4KKzIyID0gTm8gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHRoZSB0eXBlIHswfSBpcyBhY2Nlc3NpYmxlIGluIHNjb3BlCisyMyA9IElsbGVnYWwgZW5jbG9zaW5nIGluc3RhbmNlIHNwZWNpZmljYXRpb24gZm9yIHR5cGUgezB9CisyNCA9IENhbm5vdCBkZWZpbmUgc3RhdGljIGluaXRpYWxpemVyIGluIGlubmVyIHR5cGUgezB9CisyNSA9IENhbm5vdCByZWZlciB0byBhIG5vbi1maW5hbCB2YXJpYWJsZSB7MH0gaW5zaWRlIGFuIGlubmVyIGNsYXNzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgbWV0aG9kCisyNiA9IFRoZSBtZW1iZXIgaW50ZXJmYWNlIHswfSBjYW4gb25seSBiZSBkZWZpbmVkIGluc2lkZSBhIHRvcC1sZXZlbCBjbGFzcyBvciBpbnRlcmZhY2UKKzI3ID0gQ2Fubm90IHVzZSBhbiBleHByZXNzaW9uIG9mIHRoZSB0eXBlIHswfSBhcyBhIHZhbGlkIGVuY2xvc2luZyBpbnN0YW5jZQorCisyOSA9IEFuIGFub255bW91cyBjbGFzcyBjYW5ub3Qgc3ViY2xhc3MgdGhlIGZpbmFsIGNsYXNzIHswfQorCis1MCA9IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQKKzUxID0gVGhlIGxvY2FsIHZhcmlhYmxlIHswfSBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZAorNTIgPSB2b2lkIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIHZhcmlhYmxlIHswfQorNTMgPSBBbiBhcnJheSBvZiB2b2lkIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIHZhcmlhYmxlIHswfQorNTQgPSBBbiBhcnJheSBvZiB2b2lkIGlzIGFuIGludmFsaWQgdHlwZQorNTUgPSBEdXBsaWNhdGUgbG9jYWwgdmFyaWFibGUgezB9Cis1NiA9IER1cGxpY2F0ZSBhcmd1bWVudCB7MH0KKzU3ID0gVGhlIGZpbmFsIGxvY2FsIHZhcmlhYmxlIHswfSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQKKworNjAgPSBDYW5ub3QgYXNzaWduIHRvIHRoZSBmaW5hbCBsb2NhbCB2YXJpYWJsZSB7MH0gZGVmaW5lZCBvdXRzaWRlIHRoaXMgaW5uZXIgY2xhc3MKKzYxID0gVGhlIGxvY2FsIHZhcmlhYmxlIHswfSBpcyBuZXZlciByZWFkCis2MiA9IFRoZSBhcmd1bWVudCB7MH0gaXMgbmV2ZXIgcmVhZAorNjMgPSBDb2RlIG9mIG1ldGhvZCB7MH0gaXMgZXhjZWVkaW5nIHRoZSA2NTUzNSBieXRlcyBsaW1pdAorNjQgPSBDb2RlIGZvciB0aGUgc3RhdGljIGluaXRpYWxpemVyIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQKKzY1ID0gVG9vIG1hbnkgYXJndW1lbnRzLCBwYXJhbWV0ZXIgezB9IGlzIGV4Y2VlZGluZyB0aGUgbGltaXQgb2YgMjU1IHdvcmRzIGVsaWdpYmxlIGZvciBtZXRob2QgYXJndW1lbnRzCis2NiA9IFRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcywgbG9jYWwgdmFyaWFibGUgezB9IGlzIGV4Y2VlZGluZyB0aGUgbGltaXQgb2YgNjU1MzUgd29yZHMgZWxpZ2libGUgZm9yIG1ldGhvZCBsb2NhbCB2YXJpYWJsZXMKKworNzAgPSB7MH0gY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIGZpZWxkCis3MSA9IFRoZSBmaWVsZCB7MH0gaXMgbm90IHZpc2libGUKKzcyID0gVGhlIGZpZWxkIHswfSBpcyBhbWJpZ3VvdXMKKzczID0gVGhlIGZpZWxkIHswfS57MX0gaXMgZGVwcmVjYXRlZAorNzQgPSBDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgZmllbGQgezB9Cis3NSA9IENhbm5vdCByZWZlcmVuY2UgYSBmaWVsZCBiZWZvcmUgaXQgaXMgZGVmaW5lZAorCis4MCA9IENhbm5vdCBhc3NpZ24gYSB2YWx1ZSB0byB0aGUgZmluYWwgZmllbGQgezB9LnsxfQorODEgPSBUaGUgYmxhbmsgZmluYWwgZmllbGQgezB9IG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkCis4MiA9IFRoZSBmaW5hbCBmaWVsZCB7MH0gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkCisKKzEwMCA9IFRoZSBtZXRob2QgezF9KHsyfSkgaXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSB7MH0KKzEwMSA9IFRoZSBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgbm90IHZpc2libGUKKzEwMiA9IFRoZSBtZXRob2QgezF9KHsyfSkgaXMgYW1iaWd1b3VzIGZvciB0aGUgdHlwZSB7MH0KKzEwMyA9IFRoZSBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgZGVwcmVjYXRlZAorMTA0ID0gQ2Fubm90IGRpcmVjdGx5IGludm9rZSB0aGUgYWJzdHJhY3QgbWV0aG9kIHsxfSh7Mn0pIGZvciB0aGUgdHlwZSB7MH0KKzEwNSA9IFZvaWQgbWV0aG9kcyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUKKzEwNiA9IENhbm5vdCByZXR1cm4gYSB2b2lkIHJlc3VsdAorMTA3ID0gVGhpcyBtZXRob2QgcmVxdWlyZXMgYSBib2R5IGluc3RlYWQgb2YgYSBzZW1pY29sb24KKzEwOCA9IFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgcmVzdWx0IG9mIHR5cGUgezB9CisKKzExMCA9IFRoaXMgbWV0aG9kIGhhcyBhIGNvbnN0cnVjdG9yIG5hbWUKKzExMSA9IFJldHVybiB0eXBlIGZvciB0aGUgbWV0aG9kIGlzIG1pc3NpbmcKKzExMiA9IE5hdGl2ZSBtZXRob2RzIGRvIG5vdCBzcGVjaWZ5IGEgYm9keQorMTEzID0gQWJzdHJhY3QgbWV0aG9kcyBkbyBub3Qgc3BlY2lmeSBhIGJvZHkKKzExNCA9IENhbm5vdCBpbnZva2UgezF9KHsyfSkgb24gdGhlIHByaW1pdGl2ZSB0eXBlIHswfQorMTE1ID0gVGhlIG1ldGhvZCB7MX0oezJ9KSBpbiB0aGUgdHlwZSB7MH0gaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKHszfSkKKzExNiA9IENhbm5vdCBpbnZva2UgezF9KHsyfSkgb24gdGhlIGFycmF5IHR5cGUgezB9CisKKzEzMCA9IFRoZSBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyB1bmRlZmluZWQKKzEzMSA9IFRoZSBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBub3QgdmlzaWJsZQorMTMyID0gVGhlIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGFtYmlndW91cworMTMzID0gVGhlIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGRlcHJlY2F0ZWQKKzEzNSA9IENhbm5vdCByZWZlciB0byBhbiBpbnN0YW5jZSBmaWVsZCB7MH0gd2hpbGUgZXhwbGljaXRseSBpbnZva2luZyBhIGNvbnN0cnVjdG9yCisxMzYgPSBDYW5ub3QgcmVmZXIgdG8gYW4gaW5zdGFuY2UgbWV0aG9kIHdoaWxlIGV4cGxpY2l0bHkgaW52b2tpbmcgYSBjb25zdHJ1Y3RvcgorMTM3ID0gUmVjdXJzaXZlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gezB9KHsxfSkKKzEzOCA9IENhbm5vdCByZWZlciB0byAnJ3RoaXMnJyBub3IgJydzdXBlcicnIHdoaWxlIGV4cGxpY2l0bHkgaW52b2tpbmcgYSBjb25zdHJ1Y3RvcgorCisxNDAgPSBJbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyB1bmRlZmluZWQgZm9yIGRlZmF1bHQgY29uc3RydWN0b3IuIE11c3QgZGVmaW5lIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yCisxNDEgPSBJbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBub3QgdmlzaWJsZSBmb3IgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gTXVzdCBkZWZpbmUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IKKzE0MiA9IEltcGxpY2l0IHN1cGVyIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGFtYmlndW91cyBmb3IgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gTXVzdCBkZWZpbmUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IKKzE0MyA9IEltcGxpY2l0IHN1cGVyIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIHVuZGVmaW5lZC4gTXVzdCBleHBsaWNpdGx5IGludm9rZSBhbm90aGVyIGNvbnN0cnVjdG9yCisxNDQgPSBJbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBub3QgdmlzaWJsZS4gTXVzdCBleHBsaWNpdGx5IGludm9rZSBhbm90aGVyIGNvbnN0cnVjdG9yCisxNDUgPSBJbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBhbWJpZ3VvdXMuIE11c3QgZXhwbGljaXRseSBpbnZva2UgYW5vdGhlciBjb25zdHJ1Y3RvcgorMTQ2ID0gRGVmYXVsdCBjb25zdHJ1Y3RvciBjYW5ub3QgaGFuZGxlIGV4Y2VwdGlvbiB0eXBlIHswfSB0aHJvd24gYnkgaW1wbGljaXQgc3VwZXIgY29uc3RydWN0b3IuIE11c3QgZGVmaW5lIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yCisxNDcgPSBVbmhhbmRsZWQgZXhjZXB0aW9uIHR5cGUgezB9IHRocm93biBieSBpbXBsaWNpdCBzdXBlciBjb25zdHJ1Y3RvcgorCisxNTAgPSBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGFycmF5IHR5cGUgYnV0IGl0IHJlc29sdmVkIHRvIHswfQorMTUxID0gTXVzdCBleHBsaWNpdGx5IGNvbnZlcnQgdGhlIGNoYXJbXSB0byBhIFN0cmluZworMTUyID0gU3RyaW5nIGNvbnN0YW50IGlzIGV4Y2VlZGluZyB0aGUgbGltaXQgb2YgNjU1MzUgYnl0ZXMgb2YgVVRGOCBlbmNvZGluZworMTUzID0gY2FzZSBleHByZXNzaW9ucyBtdXN0IGJlIGNvbnN0YW50IGV4cHJlc3Npb25zCisxNTQgPSB7MH0gaXMgb3V0IG9mIHJhbmdlIAorMTU2ID0gQ2Fubm90IGNhc3QgZnJvbSB7MH0gdG8gezF9CisxNTcgPSBDYW5ub3QgaW5zdGFudGlhdGUgezB9CisxNTggPSBDYW5ub3QgZGVmaW5lIGRpbWVuc2lvbiBleHByZXNzaW9ucyB3aGVuIGFuIGFycmF5IGluaXRpYWxpemVyIGlzIHByb3ZpZGVkCisxNTkgPSBWYXJpYWJsZSBtdXN0IHByb3ZpZGUgZWl0aGVyIGRpbWVuc2lvbiBleHByZXNzaW9ucyBvciBhbiBhcnJheSBpbml0aWFsaXplcgorMTYwID0gVGhlIG9wZXJhdG9yIHswfSBpcyB1bmRlZmluZWQgZm9yIHRoZSBhcmd1bWVudCB0eXBlKHMpIHsxfQorMTYxID0gVW5yZWFjaGFibGUgY29kZQorMTYyID0gQ2Fubm90IHJldHVybiBmcm9tIHdpdGhpbiBhbiBpbml0aWFsaXplcgorMTYzID0gSW5pdGlhbGl6ZXIgZG9lcyBub3QgY29tcGxldGUgbm9ybWFsbHkKKzE2NCA9IEV4cHJlc3Npb24gbXVzdCByZXR1cm4gYSB2YWx1ZQorMTY1ID0gQ2F0Y2ggYmxvY2sgaXMgaGlkZGVuIGJ5IGFub3RoZXIgb25lIGluIHRoZSBzYW1lIHRyeSBzdGF0ZW1lbnQKKzE2NiA9IER1cGxpY2F0ZSBkZWZhdWx0IGNhc2UKKzE2NyA9IFVucmVhY2hhYmxlIGNhdGNoIGJsb2NrCisxNjggPSBVbmhhbmRsZWQgZXhjZXB0aW9uIHR5cGUgezB9CisxNjkgPSBjYXNlIGNvbnN0YW50IG11c3QgYmUgYSBjaGFyLCBieXRlLCBzaG9ydCwgb3IgaW50IGluc3RlYWQgb2YgezB9CisxNzAgPSBEdXBsaWNhdGUgY2FzZSB7MH0KKzE3MSA9IER1cGxpY2F0ZSBsYWJlbCB7MH0KKzE3MiA9IE1pc3NpbmcgdmFsaWQgYnJlYWthYmxlIGxvY2F0aW9uCisxNzMgPSBNaXNzaW5nIGxvb3AtY29udGludWF0aW9uIHBvaW50CisxNzQgPSBNaXNzaW5nIGxhYmVsIHswfQorMTc1ID0gezB9IGlzIG5vdCBhIHZhbGlkIHR5cGUnJ3MgYXJndW1lbnQgZm9yIHRoZSBzeW5jaHJvbml6ZWQgc3RhdGVtZW50CisxNzYgPSBudWxsIGlzIG5vdCBhIHZhbGlkIGFyZ3VtZW50IGZvciB0aGUgc3luY2hyb25pemVkIHN0YXRlbWVudAorMTc3ID0gQ2Fubm90IHRocm93IG51bGwKKworMTkwID0gUmVhZCBhY2Nlc3MgdG8gZW5jbG9zaW5nIGZpZWxkIHswfS57MX0gaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kIAorMTkxID0gV3JpdGUgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCB7MH0uezF9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZAorMTkyID0gQWNjZXNzIHRvIGVuY2xvc2luZyBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kCisxOTMgPSBBY2Nlc3MgdG8gZW5jbG9zaW5nIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZAorMTk1ID0gVGhlIG1ldGhvZCB7MX0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCisxOTYgPSBUaGUgZmllbGQgezB9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZSAKKzE5NyA9IFRoZSB0eXBlIHswfSBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUKKworMjAwID0gQ2Fubm90IHVzZSB7MH0gaW4gYSBzdGF0aWMgY29udGV4dCAKKzIwMSA9IFRoZSBtZXRob2QgezF9KHsyfSkgZnJvbSB0aGUgdHlwZSB7MH0gaXMgbm90IHN0YXRpYworMjAyID0gQ2Fubm90IHNwZWNpZnkgYW4gYXJyYXkgZGltZW5zaW9uIGFmdGVyIGFuIGVtcHR5IGRpbWVuc2lvbgorMjAzID0gSW52YWxpZCBjYXN0IHR5cGUgZXhwcmVzc2lvbgorMjA0ID0gU3ludGF4IGVycm9yIG9uIHRva2VuICJ7MH0iLCB7MX0gZXhwZWN0ZWQKKzIwNSA9IFN5bnRheCBlcnJvciBvbiB0b2tlbiAiezB9Iiwgbm8gYWNjdXJhdGUgY29ycmVjdGlvbiBhdmFpbGFibGUKKzIwNiA9IEludmFsaWQgYXJndW1lbnQgdG8gb3BlcmF0aW9uICsrLy0tCisyMDcgPSBJbnRlcmZhY2VzIGNhbm5vdCBoYXZlIGNvbnN0cnVjdG9ycworMjA4ID0gQXJyYXkgY29uc3RhbnRzIGNhbiBvbmx5IGJlIHVzZWQgaW4gaW5pdGlhbGl6ZXJzCisyMDkgPSBTeW50YXggZXJyb3Igb24ga2V5d29yZCAiezB9IjsgezF9IGV4cGVjdGVkCisyMTAgPSBTeW50YXggZXJyb3Igb24ga2V5d29yZCAiezB9Iiwgbm8gYWNjdXJhdGUgY29ycmVjdGlvbiBhdmFpbGFibGUKKworMjIwID0gVW5tYXRjaGVkIGJyYWNrZXQKKzIyMSA9IFRoZSBwcmltaXRpdmUgdHlwZSB7MH0gb2YgezF9IGRvZXMgbm90IGhhdmUgYSBmaWVsZCB7Mn0KKzIyMiA9IEludmFsaWQgZXhwcmVzc2lvbiBhcyBzdGF0ZW1lbnQKKworMjUwID0gVW5leHBlY3RlZCBlbmQgb2YgZmlsZQorMjUxID0gSW52YWxpZCBoZXhhIGxpdGVyYWwgbnVtYmVyCisyNTIgPSBJbnZhbGlkIG9jdGFsIGxpdGVyYWwgbnVtYmVyCisyNTMgPSBJbnZhbGlkIGNoYXJhY3RlciBjb25zdGFudAorMjU0ID0gSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgKHZhbGlkIG9uZXMgYXJlICBcXGIgIFxcdCAgXFxuICBcXGYgIFxcciAgXFwiICBcXCcnICBcXFxcICkKKzI1NSA9IEludmFsaWQgaW5wdXQKKzI1NiA9IEludmFsaWQgdW5pY29kZQorMjU3ID0gSW52YWxpZCBmbG9hdCBsaXRlcmFsIG51bWJlcgorMjU4ID0gTnVsbCBzb3VyY2Ugc3RyaW5nCisyNTkgPSBTdHJpbmcgbGl0ZXJhbCBpcyBub3QgcHJvcGVybHkgY2xvc2VkIGJ5IGEgZG91YmxlLXF1b3RlCisyNjAgPSBVbmV4cGVjdGVkIGVuZCBvZiBjb21tZW50CisyNjEgPSBOb24tZXh0ZXJuYWxpemVkIHN0cmluZyBsaXRlcmFsOyBpdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgLy8kTk9OLU5MUy08bj4kCisKKzMwMCA9IFRoZSBpbnRlcmZhY2UgezB9IGNhbm5vdCBkZWZpbmUgYW4gaW5pdGlhbGl6ZXIKKzMwMSA9IER1cGxpY2F0ZSBtb2RpZmllciBmb3IgdGhlIHR5cGUgezB9CiszMDIgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgY2xhc3MgezB9OyBvbmx5IHB1YmxpYywgYWJzdHJhY3QgJiBmaW5hbCBhcmUgcGVybWl0dGVkCiszMDMgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgaW50ZXJmYWNlIHswfTsgb25seSBwdWJsaWMgJiBhYnN0cmFjdCBhcmUgcGVybWl0dGVkCiszMDQgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgbWVtYmVyIGNsYXNzIHswfTsgb25seSBwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgc3RhdGljLCBhYnN0cmFjdCAmIGZpbmFsIGFyZSBwZXJtaXR0ZWQKKzMwNSA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBtZW1iZXIgaW50ZXJmYWNlIHswfTsgb25seSBwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgc3RhdGljICYgYWJzdHJhY3QgYXJlIHBlcm1pdHRlZAorMzA2ID0gSWxsZWdhbCBtb2RpZmllciBmb3IgdGhlIGxvY2FsIGNsYXNzIHswfTsgb25seSBvbmUgb2YgYWJzdHJhY3Qgb3IgZmluYWwgaXMgcGVybWl0dGVkCiszMDggPSBUaGUgY2xhc3MgezB9IGNhbiBiZSBlaXRoZXIgYWJzdHJhY3Qgb3IgZmluYWwsIG5vdCBib3RoCiszMDkgPSBUaGUgaW50ZXJmYWNlIG1lbWJlciB0eXBlIHswfSBjYW4gb25seSBiZSBwdWJsaWMKKzMxMCA9IFRoZSBtZW1iZXIgdHlwZSB7MH0gY2FuIG9ubHkgc2V0IG9uZSBvZiBwdWJsaWMgLyBwcm90ZWN0ZWQgLyBwcml2YXRlCiszMTEgPSBUaGUgbWVtYmVyIHR5cGUgezB9IGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWM7IHN0YXRpYyB0eXBlcyBjYW4gb25seSBiZSBkZWNsYXJlZCBpbiBzdGF0aWMgb3IgdG9wIGxldmVsIHR5cGVzCiszMTIgPSBUaGUgaW50ZXJmYWNlIHswfSBjYW5ub3QgYmUgdGhlIHN1cGVyY2xhc3Mgb2YgezF9OyBhIHN1cGVyY2xhc3MgbXVzdCBiZSBhIGNsYXNzCiszMTMgPSBUaGUgdHlwZSB7MX0gY2Fubm90IHN1YmNsYXNzIHRoZSBmaW5hbCBjbGFzcyB7MH0KKzMxNCA9IER1cGxpY2F0ZSBpbnRlcmZhY2UgezB9IGZvciB0aGUgdHlwZSB7MX0KKzMxNSA9IFRoZSBjbGFzcyB7MH0gY2Fubm90IGJlIGEgc3VwZXJpbnRlcmZhY2Ugb2YgezF9OyBhIHN1cGVyaW50ZXJmYWNlIG11c3QgYmUgYW4gaW50ZXJmYWNlCiszMTYgPSB7MX0gY2F1c2VzIGEgY3ljbGUgLSB0aGUgdHlwZSB7MH0gY2Fubm90IGV4dGVuZC9pbXBsZW1lbnQgaXRzZWxmIG9yIG9uZSBvZiBpdHMgb3duIG1lbWJlciB0eXBlcworMzE3ID0gQSBjeWNsZSBleGlzdHMgaW4gdGhlIHR5cGUgaGllcmFyY2h5IGJldHdlZW4gezB9IGFuZCB7MX0KKzMxOCA9IE5lc3RlZCB0eXBlIHswfSBoaWRlcyBhbiBlbmNsb3NpbmcgdHlwZQorMzE5ID0gRHVwbGljYXRlIG5lc3RlZCB0eXBlIHswfQorMzIwID0gQ2Fubm90IHRocm93IHRoZSB0eXBlIHswfQorMzIxID0gVGhlIHBhY2thZ2UgezB9IGNvbGxpZGVzIHdpdGggYSB0eXBlCiszMjIgPSBUaGUgdHlwZSB7MX0gY29sbGlkZXMgd2l0aCBhIHBhY2thZ2UKKzMyMyA9IFRoZSB0eXBlIHsxfSBpcyBhbHJlYWR5IGRlZmluZWQKKzMyNCA9IFRoaXMgY29tcGlsYXRpb24gdW5pdCBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgdGhlIG1pc3NpbmcgdHlwZSB7MH0gKHR5cGljYWxseSBzb21lIHJlcXVpcmVkIGNsYXNzIGZpbGUgaXMgcmVmZXJlbmNpbmcgYSB0eXBlIG91dHNpZGUgdGhlIGNsYXNzcGF0aCkKKzMyNSA9IFRoZSBwdWJsaWMgdHlwZSB7MX0gbXVzdCBiZSBkZWZpbmVkIGluIGl0cyBvd24gZmlsZQorMzI2ID0gQSBwYWNrYWdlIG11c3QgYmUgc3BlY2lmaWVkIGluIHswfSBvciBhIGRlZmF1bHQgcGFja2FnZSBjcmVhdGVkCiszMjcgPSBUaGUgaGllcmFyY2h5IG9mIHRoZSB0eXBlIHswfSBpcyBpbmNvbnNpc3RlbnQKKzMyOCA9IFRoZSBkZWNsYXJlZCBwYWNrYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBwYWNrYWdlIHswfQorCiszMzAgPSB7MH0gY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIHZhbGlkIHN1cGVyY2xhc3MKKzMzMSA9IFN1cGVyY2xhc3MgezB9IGlzIG5vdCB2aXNpYmxlCiszMzIgPSBTdXBlcmNsYXNzIHswfSBpcyBhbWJpZ3VvdXMKKzMzMyA9IFN1cGVyY2xhc3MgezB9IGlzIGFuIGluY29ycmVjdGx5IHNwZWNpZmllZCBuZXN0ZWQgdHlwZTsgcmVwbGFjZSB0aGUgJyckJycgd2l0aCAnJy4nJworMzM0ID0gU3VwZXJjbGFzcyB7MH0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCiszMzUgPSB7MH0gY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIHZhbGlkIHN1cGVyaW50ZXJmYWNlCiszMzYgPSBTdXBlcmludGVyZmFjZSB7MH0gaXMgbm90IHZpc2libGUKKzMzNyA9IFN1cGVyaW50ZXJmYWNlIHswfSBpcyBhbWJpZ3VvdXMKKzMzOCA9IFN1cGVyaW50ZXJmYWNlIHswfSBpcyBhbiBpbmNvcnJlY3RseSBzcGVjaWZpZWQgbmVzdGVkIHR5cGU7IHJlcGxhY2UgdGhlICcnJCcnIHdpdGggJycuJycKKzMzOSA9IFN1cGVyaW50ZXJmYWNlIHswfSBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUKKzM0MCA9IER1cGxpY2F0ZSBmaWVsZCB7MH0uezF9CiszNDEgPSBEdXBsaWNhdGUgbW9kaWZpZXIgZm9yIHRoZSBmaWVsZCB7MH0KKzM0MiA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBmaWVsZCB7MH07IG9ubHkgcHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUsIHN0YXRpYywgZmluYWwsIHRyYW5zaWVudCAmIHZvbGF0aWxlIGFyZSBwZXJtaXR0ZWQKKzM0MyA9IElsbGVnYWwgbW9kaWZpZXIgZm9yIHRoZSBpbnRlcmZhY2UgZmllbGQgezB9OyBvbmx5IHB1YmxpYywgc3RhdGljICYgZmluYWwgYXJlIHBlcm1pdHRlZAorMzQ0ID0gVGhlIGZpZWxkIHswfSBjYW4gb25seSBzZXQgb25lIG9mIHB1YmxpYyAvIHByb3RlY3RlZCAvIHByaXZhdGUKKzM0NSA9IFRoZSBmaWVsZCB7MH0gY2FuIGJlIGVpdGhlciBmaW5hbCBvciB2b2xhdGlsZSwgbm90IGJvdGgKKzM0NiA9IFRoZSBmaWVsZCB7MH0gY2Fubm90IGJlIGRlY2xhcmVkIHN0YXRpYzsgc3RhdGljIGZpZWxkcyBjYW4gb25seSBiZSBkZWNsYXJlZCBpbiBzdGF0aWMgb3IgdG9wIGxldmVsIHR5cGVzCisKKzM1MCA9IHsyfSBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHR5cGUpIGZvciB0aGUgZmllbGQgezF9LnswfQorMzUxID0gVGhlIHR5cGUgezJ9IGlzIG5vdCB2aXNpYmxlIGZvciB0aGUgZmllbGQgezF9LnswfQorMzUyID0gVGhlIHR5cGUgezJ9IGlzIGFtYmlndW91cyBmb3IgdGhlIGZpZWxkIHsxfS57MH0KKzM1MyA9IFRoZSBmaWVsZCB0eXBlIHsyfSBpcyBhbiBpbmNvcnJlY3RseSBzcGVjaWZpZWQgbmVzdGVkIHR5cGU7IHJlcGxhY2UgdGhlICcnJCcnIHdpdGggJycuJycKKzM1NCA9IFRoZSBmaWVsZCB0eXBlIHsyfSBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUKKzM1NSA9IER1cGxpY2F0ZSBtZXRob2QgezB9IGluIHR5cGUgezF9CiszNTYgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciBhcmd1bWVudCB7MH07IG9ubHkgZmluYWwgaXMgcGVybWl0dGVkCiszNTcgPSBEdXBsaWNhdGUgbW9kaWZpZXIgZm9yIHRoZSBtZXRob2QgezF9IGluIHR5cGUgezB9CiszNTggPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgbWV0aG9kIHsxfSBpbiB0eXBlIHswfQorMzU5ID0gSWxsZWdhbCBtb2RpZmllciBmb3IgdGhlIGludGVyZmFjZSBtZXRob2QgezF9IGluIHR5cGUgezB9OyBvbmx5IHB1YmxpYyAmIGFic3RyYWN0IGFyZSBwZXJtaXR0ZWQKKzM2MCA9IFRoZSBtZXRob2QgezF9IGluIHR5cGUgezB9IGNhbiBvbmx5IHNldCBvbmUgb2YgcHVibGljIC8gcHJvdGVjdGVkIC8gcHJpdmF0ZQorMzYxID0gVGhlIG1ldGhvZCB7MX0gY2Fubm90IGJlIGRlY2xhcmVkIHN0YXRpYzsgc3RhdGljIG1ldGhvZHMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgaW4gYSBzdGF0aWMgb3IgdG9wIGxldmVsIHR5cGUKKzM2MiA9IFRoZSBhYnN0cmFjdCBtZXRob2QgezF9IGluIHR5cGUgezB9IGNhbiBvbmx5IHNldCBhIHZpc2liaWxpdHkgbW9kaWZpZXIsIG9uZSBvZiBwdWJsaWMgb3IgcHJvdGVjdGVkCiszNjMgPSBUaGUgYWJzdHJhY3QgbWV0aG9kIHsxfSBpbiB0eXBlIHswfSBjYW4gb25seSBiZSBkZWZpbmVkIGJ5IGFuIGFic3RyYWN0IGNsYXNzCiszNjQgPSB2b2lkIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgdGhlIGFyZ3VtZW50IHsxfSBvZiB0aGUgbWV0aG9kIHswfQorMzY1ID0gQW4gYXJyYXkgb2Ygdm9pZCBpcyBhbiBpbnZhbGlkIHR5cGUgZm9yIHRoZSBhcmd1bWVudCB7MX0gb2YgdGhlIG1ldGhvZCB7MH0KKzM2NiA9IEFuIGFycmF5IG9mIHZvaWQgaXMgYW4gaW52YWxpZCByZXR1cm4gdHlwZSBmb3IgdGhlIG1ldGhvZCB7MH0KKzM2NyA9IFRoZSBuYXRpdmUgbWV0aG9kIHsxfSBjYW5ub3QgYWxzbyBiZSBkZWNsYXJlZCBzdHJpY3RmcAorMzY4ID0gRHVwbGljYXRlIG1vZGlmaWVyIGZvciBhcmd1bWVudCB7MH0KKworMzcwID0gezJ9IGNhbm5vdCBiZSByZXNvbHZlZCAob3IgaXMgbm90IGEgdmFsaWQgdHlwZSkgZm9yIHRoZSBhcmd1bWVudCB7MX0gb2YgdGhlIG1ldGhvZCB7MH0KKzM3MSA9IFRoZSB0eXBlIHsyfSBpcyBub3QgdmlzaWJsZSBmb3IgdGhlIGFyZ3VtZW50IHsxfSBvZiB0aGUgbWV0aG9kIHswfQorMzcyID0gVGhlIHR5cGUgezJ9IGlzIGFtYmlndW91cyBmb3IgdGhlIGFyZ3VtZW50IHsxfSBvZiB0aGUgbWV0aG9kIHswfQorMzczID0gVGhlIGFyZ3VtZW50IHR5cGUgezJ9IGlzIGFuIGluY29ycmVjdGx5IHNwZWNpZmllZCBuZXN0ZWQgdHlwZTsgcmVwbGFjZSB0aGUgJyckJycgd2l0aCAnJy4nJworMzc0ID0gVGhlIGFyZ3VtZW50IHR5cGUgezJ9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQorMzc1ID0gezF9IGNhbm5vdCBiZSByZXNvbHZlZCAob3IgaXMgbm90IGFuIGV4Y2VwdGlvbiB0eXBlKSBmb3IgdGhlIG1ldGhvZCB7MH0KKzM3NiA9IFRoZSBleGNlcHRpb24gdHlwZSB7MX0gaXMgbm90IHZpc2libGUgZm9yIHRoZSBtZXRob2QgezB9CiszNzcgPSBUaGUgZXhjZXB0aW9uIHR5cGUgezF9IGlzIGFtYmlndW91cyBmb3IgdGhlIG1ldGhvZCB7MH0KKzM3OCA9IFRoZSBleGNlcHRpb24gdHlwZSB7MX0gaXMgYW4gaW5jb3JyZWN0bHkgc3BlY2lmaWVkIG5lc3RlZCB0eXBlOyByZXBsYWNlIHRoZSAnJyQnJyB3aXRoICcnLicnCiszNzkgPSBUaGUgZXhjZXB0aW9uIHR5cGUgezF9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQorMzgwID0gezF9IGNhbm5vdCBiZSByZXNvbHZlZCAob3IgaXMgbm90IGEgdmFsaWQgcmV0dXJuIHR5cGUpIGZvciB0aGUgbWV0aG9kIHswfQorMzgxID0gVGhlIHJldHVybiB0eXBlIHsxfSBpcyBub3QgdmlzaWJsZSBmb3IgdGhlIG1ldGhvZCB7MH0KKzM4MiA9IFRoZSByZXR1cm4gdHlwZSB7MX0gaXMgYW1iaWd1b3VzIGZvciB0aGUgbWV0aG9kIHswfQorMzgzID0gVGhlIHJldHVybiB0eXBlIHsxfSBpcyBhbiBpbmNvcnJlY3RseSBzcGVjaWZpZWQgbmVzdGVkIHR5cGU7IHJlcGxhY2UgdGhlICcnJCcnIHdpdGggJycuJycKKzM4NCA9IFRoZSByZXR1cm4gdHlwZSB7MX0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCiszODUgPSBUaGUgaW1wb3J0IHswfSBjb25mbGljdHMgd2l0aCBhIHR5cGUgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlCiszODYgPSBUaGUgaW1wb3J0IHswfSBjb2xsaWRlcyB3aXRoIGFub3RoZXIgaW1wb3J0ZWQgdHlwZQorMzg3ID0gT25seSBhIHR5cGUgY2FuIGJlIGltcG9ydGVkLiB7MH0gcmVzb2x2ZXMgdG8gYSBwYWNrYWdlCiszODggPSBUaGUgaW1wb3J0IHswfSBpcyBuZXZlciB1c2VkCiszOTAgPSBUaGUgaW1wb3J0IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQKKzM5MSA9IFRoZSBpbXBvcnRlZCB0eXBlIHswfSBpcyBub3QgdmlzaWJsZQorMzkyID0gVGhlIGltcG9ydGVkIHR5cGUgezB9IGlzIGFtYmlndW91cworMzkzID0gVGhlIHR5cGUgezB9IGlzIGFuIGluY29ycmVjdGx5IHNwZWNpZmllZCBuZXN0ZWQgdHlwZTsgcmVwbGFjZSB0aGUgJyckJycgd2l0aCAnJy4nJworMzk0ID0gVGhlIHR5cGUgezB9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQorMzk1ID0gRHVwbGljYXRlIG1vZGlmaWVyIGZvciB0aGUgdmFyaWFibGUgezB9CiszOTYgPSBJbGxlZ2FsIG1vZGlmaWVyIGZvciB0aGUgdmFyaWFibGUgezB9OyBvbmx5IGZpbmFsIGlzIHBlcm1pdHRlZAorCis0MDAgPSBDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCB7MH0KKzQwMSA9IENhbm5vdCBvdmVycmlkZSB0aGUgZmluYWwgbWV0aG9kIGZyb20gezB9Cis0MDIgPSBFeGNlcHRpb24gezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhyb3dzIGNsYXVzZSBpbiB7MX0KKzQwMyA9IEV4Y2VwdGlvbiB7MH0gaW4gdGhyb3dzIGNsYXVzZSBvZiB7MX0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB7Mn0KKzQwNCA9IFRoZSByZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB7MH0KKzQwNSA9IFRoZSBpbmhlcml0ZWQgbWV0aG9kIHswfSBjYW5ub3QgaGlkZSB0aGUgcHVibGljIGFic3RyYWN0IG1ldGhvZCBpbiB7MX0KKzQwNiA9IFRoaXMgaW5zdGFuY2UgbWV0aG9kIGNhbm5vdCBvdmVycmlkZSB0aGUgc3RhdGljIG1ldGhvZCBmcm9tIHswfQorNDA3ID0gVGhpcyBzdGF0aWMgbWV0aG9kIGNhbm5vdCBoaWRlIHRoZSBpbnN0YW5jZSBtZXRob2QgZnJvbSB7MH0KKzQwOCA9IFRoZSBzdGF0aWMgbWV0aG9kIHswfSBjb25mbGljdHMgd2l0aCB0aGUgYWJzdHJhY3QgbWV0aG9kIGluIHsxfQorNDA5ID0gQ2Fubm90IHJlZHVjZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIHswfQorNDEwID0gVGhlIG1ldGhvZCB7MH0gZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGluaGVyaXRlZCBtZXRob2QgZnJvbSB7MX0gc2luY2UgaXQgaXMgcHJpdmF0ZSB0byBhIGRpZmZlcmVudCBwYWNrYWdlLgorNDExID0gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCB7MX0sIGJ1dCBjYW5ub3Qgb3ZlcnJpZGUgaXQgc2luY2UgaXQgaXMgbm90IHZpc2libGUgZnJvbSB7MH0uIEVpdGhlciBtYWtlIHRoZSB0eXBlIGFic3RyYWN0IG9yIG1ha2UgdGhlIGluaGVyaXRlZCBtZXRob2QgdmlzaWJsZS4KKzQxMiA9IFRoaXMgbWV0aG9kIG92ZXJyaWRlcyBkZXByZWNhdGVkIG1ldGhvZCBmcm9tIHswfQorCis0MjAgPSBDb2RlIHNuaXBwZXQgc3VwcG9ydCBjYW5ub3QgZmluZCB0aGUgY2xhc3MgezB9Cis0MjEgPSBDb2RlIHNuaXBwZXQgc3VwcG9ydCBjYW5ub3QgZmluZCB0aGUgbWV0aG9kIHswfS57MX0oezJ9KSAKKzQyMiA9IHN1cGVyIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBjb2RlIHNuaXBwZXQgY29kZQorCis0MzAgPSBUb28gbWFueSBjb25zdGFudHMsIHRoZSBjb25zdGFudCBwb29sIGZvciB7MH0gd291bGQgZXhjZWVkIDY1NTM2IGVudHJpZXMKKworNDQwID0gJydhc3NlcnQnJyBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciwgc2luY2UgaXQgaXMgYSByZXNlcnZlZCBrZXl3b3JkIGZyb20gc291cmNlIGxldmVsIDEuNCBvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQwNjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvQ2hhck9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKKworcHVibGljIGZpbmFsIGNsYXNzIENoYXJPcGVyYXRpb24geworCQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gYXBwZW5kKGNoYXJbXSBhcnJheSwgY2hhciBzdWZmaXgpeworCWlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gbmV3IGNoYXJbXXtzdWZmaXh9OworCWludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgYXJyYXkgPSBuZXcgY2hhcltsZW5ndGgrMV0sIDAsIGxlbmd0aCk7CisJYXJyYXlbbGVuZ3RoXT1zdWZmaXg7CisJcmV0dXJuIGFycmF5OworfQkKKworcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBhcnJheUNvbmNhdChjaGFyW11bXSBmaXJzdCwgY2hhcltdW10gc2Vjb25kKSB7CisJaWYgKGZpcnN0ID09IG51bGwpCisJCXJldHVybiBzZWNvbmQ7CisJaWYgKHNlY29uZCA9PSBudWxsKQorCQlyZXR1cm4gZmlyc3Q7CisKKwlpbnQgbGVuZ3RoMSA9IGZpcnN0Lmxlbmd0aDsKKwlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDJdW107CisvKiBpZiB3ZSBkbyBub3QgdHJ1c3QgU3lzdGVtLmFycmF5Y29weSBvbiBvdXIgVk0gd2l0aCBjaGFyW11bXSdzCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDE7IGkrKykKKwkJcmVzdWx0W2ldID0gZmlyc3RbaV07CisJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGgyOyBqKyspCisJCXJlc3VsdFtpKytdID0gc2Vjb25kW2pdOworKi8KKwlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0LCAwLCByZXN1bHQsIDAsIGxlbmd0aDEpOworCVN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLCAwLCByZXN1bHQsIGxlbmd0aDEsIGxlbmd0aDIpOworCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIGFycmF5Q29uY2F0KGNoYXJbXVtdIGZpcnN0LCBjaGFyW10gc2Vjb25kKSB7CisJaWYgKHNlY29uZCA9PSBudWxsKQorCQlyZXR1cm4gZmlyc3Q7CisJaWYgKGZpcnN0ID09IG51bGwpCisJCXJldHVybiBuZXcgY2hhcltdW10ge3NlY29uZH07CisKKwlpbnQgbGVuZ3RoID0gZmlyc3QubGVuZ3RoOworCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCArIDFdW107CisvKiBpZiB3ZSBkbyBub3QgdHJ1c3QgU3lzdGVtLmFycmF5Y29weSBvbiBvdXIgVk0gd2l0aCBjaGFyW11bXSdzCisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJcmVzdWx0W2ldID0gZmlyc3RbaV07CisqLworCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKKwlyZXN1bHRbbGVuZ3RoXSA9IHNlY29uZDsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdCwgY2hhcltdIHNlY29uZCkgeworCWlmIChmaXJzdCA9PSBudWxsKQorCQlyZXR1cm4gc2Vjb25kOworCWlmIChzZWNvbmQgPT0gbnVsbCkKKwkJcmV0dXJuIGZpcnN0OworCisJaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7CisJaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGgxICsgbGVuZ3RoMl07CisJU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKKwlTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxLCBsZW5ndGgyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdCwgY2hhcltdIHNlY29uZCwgY2hhcltdIHRoaXJkKSB7CisJaWYgKGZpcnN0ID09IG51bGwpCisJCXJldHVybiBjb25jYXQoc2Vjb25kLCB0aGlyZCk7CisJaWYgKHNlY29uZCA9PSBudWxsKQorCQlyZXR1cm4gY29uY2F0KGZpcnN0LCB0aGlyZCk7CisJaWYgKHRoaXJkID09IG51bGwpCisJCXJldHVybiBjb25jYXQoZmlyc3QsIHNlY29uZCk7CisKKwlpbnQgbGVuZ3RoMSA9IGZpcnN0Lmxlbmd0aDsKKwlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJaW50IGxlbmd0aDMgPSB0aGlyZC5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aDEgKyBsZW5ndGgyICsgbGVuZ3RoM107CisJU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKKwlTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxLCBsZW5ndGgyKTsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXJkLCAwLCByZXN1bHQsIGxlbmd0aDEgKyBsZW5ndGgyLCBsZW5ndGgzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdCwgY2hhcltdIHNlY29uZCwgY2hhciBzZXBhcmF0b3IpIHsKKwlpZiAoZmlyc3QgPT0gbnVsbCkKKwkJcmV0dXJuIHNlY29uZDsKKwlpZiAoc2Vjb25kID09IG51bGwpCisJCXJldHVybiBmaXJzdDsKKworCWludCBsZW5ndGgxID0gZmlyc3QubGVuZ3RoOworCWlmIChsZW5ndGgxID09IDApCisJCXJldHVybiBzZWNvbmQ7CisJaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOworCWlmIChsZW5ndGgyID09IDApCisJCXJldHVybiBmaXJzdDsKKworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGgxICsgbGVuZ3RoMiArIDFdOworCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7CisJcmVzdWx0W2xlbmd0aDFdID0gc2VwYXJhdG9yOworCVN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLCAwLCByZXN1bHQsIGxlbmd0aDEgKyAxLCBsZW5ndGgyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdCwgY2hhciBzZXAxLCBjaGFyW10gc2Vjb25kLCBjaGFyIHNlcDIsIGNoYXJbXSB0aGlyZCkgeworCWlmIChmaXJzdCA9PSBudWxsKQorCQlyZXR1cm4gY29uY2F0KHNlY29uZCwgdGhpcmQsIHNlcDIpOworCWlmIChzZWNvbmQgPT0gbnVsbCkKKwkJcmV0dXJuIGNvbmNhdChmaXJzdCwgdGhpcmQsIHNlcDEpOworCWlmICh0aGlyZCA9PSBudWxsKQorCQlyZXR1cm4gY29uY2F0KGZpcnN0LCBzZWNvbmQsIHNlcDEpOworCisJaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7CisJaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOworCWludCBsZW5ndGgzID0gdGhpcmQubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGgxICsgbGVuZ3RoMiArIGxlbmd0aDMgKyAyXTsKKwlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0LCAwLCByZXN1bHQsIDAsIGxlbmd0aDEpOworCXJlc3VsdFtsZW5ndGgxXSA9IHNlcDE7CisJU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSArIDEsIGxlbmd0aDIpOworCXJlc3VsdFtsZW5ndGgxK2xlbmd0aDIrMV0gPSBzZXAyOworCVN5c3RlbS5hcnJheWNvcHkodGhpcmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSArIGxlbmd0aDIgKyAyLCBsZW5ndGgzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXIgcHJlZml4LCBjaGFyW10gYXJyYXksIGNoYXIgc3VmZml4KSB7CisJaWYgKGFycmF5ID09IG51bGwpCisJCXJldHVybiBuZXcgY2hhcltdIHtwcmVmaXgsIHN1ZmZpeH07CisKKwlpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggKyAyXTsKKwlyZXN1bHRbMF0gPSBwcmVmaXg7CisJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAxLCBsZW5ndGgpOworCXJlc3VsdFtsZW5ndGggKyAxXSA9IHN1ZmZpeDsKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0V2l0aChjaGFyW10gbmFtZSwgY2hhcltdW10gYXJyYXksIGNoYXIgc2VwYXJhdG9yKSB7CisJaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGg7CisJaWYgKG5hbWVMZW5ndGggPT0gMCkKKwkJcmV0dXJuIGNvbmNhdFdpdGgoYXJyYXksIHNlcGFyYXRvcik7CisKKwlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gbmFtZTsKKworCWludCBzaXplID0gbmFtZUxlbmd0aDsKKwlpbnQgaW5kZXggPSBsZW5ndGg7CisJd2hpbGUgKC0taW5kZXggPj0gMCkKKwkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPiAwKQorCQkJc2l6ZSArPSBhcnJheVtpbmRleF0ubGVuZ3RoICsgMTsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07CisJaW5kZXggPSBzaXplOworCWZvciAoaW50IGkgPSBsZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IHN1Ykxlbmd0aCA9IGFycmF5W2ldLmxlbmd0aDsKKwkJaWYgKHN1Ykxlbmd0aCA+IDApIHsKKwkJCWluZGV4IC09IHN1Ykxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXlbaV0sIDAsIHJlc3VsdCwgaW5kZXgsIHN1Ykxlbmd0aCk7CisJCQlyZXN1bHRbLS1pbmRleF0gPSBzZXBhcmF0b3I7CisJCX0KKwl9CisJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCByZXN1bHQsIDAsIG5hbWVMZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBjb25jYXRXaXRoKGNoYXJbXVtdIGFycmF5LCBjaGFyW10gbmFtZSwgY2hhciBzZXBhcmF0b3IpIHsKKwlpbnQgbmFtZUxlbmd0aCA9IG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmxlbmd0aDsKKwlpZiAobmFtZUxlbmd0aCA9PSAwKQorCQlyZXR1cm4gY29uY2F0V2l0aChhcnJheSwgc2VwYXJhdG9yKTsKKworCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBuYW1lOworCisJaW50IHNpemUgPSBuYW1lTGVuZ3RoOworCWludCBpbmRleCA9IGxlbmd0aDsKKwl3aGlsZSAoLS1pbmRleCA+PSAwKQorCQlpZiAoYXJyYXlbaW5kZXhdLmxlbmd0aCA+IDApCisJCQlzaXplICs9IGFycmF5W2luZGV4XS5sZW5ndGggKyAxOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzaXplXTsKKwlpbmRleCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgc3ViTGVuZ3RoID0gYXJyYXlbaV0ubGVuZ3RoOworCQlpZiAoc3ViTGVuZ3RoID4gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weShhcnJheVtpXSwgMCwgcmVzdWx0LCBpbmRleCwgc3ViTGVuZ3RoKTsKKwkJCWluZGV4ICs9IHN1Ykxlbmd0aDsKKwkJCXJlc3VsdFtpbmRleCsrXSA9IHNlcGFyYXRvcjsKKwkJfQorCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5hbWUsIDAsIHJlc3VsdCwgaW5kZXgsIG5hbWVMZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBjb25jYXRXaXRoKGNoYXJbXVtdIGFycmF5LCBjaGFyIHNlcGFyYXRvcikgeworCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhcjsKKworCWludCBzaXplID0gbGVuZ3RoIC0gMTsKKwlpbnQgaW5kZXggPSBsZW5ndGg7CisJd2hpbGUgKC0taW5kZXggPj0gMCkgeworCQlpZiAoYXJyYXlbaW5kZXhdLmxlbmd0aCA9PSAwKQorCQkJc2l6ZS0tOworCQllbHNlCisJCQlzaXplICs9IGFycmF5W2luZGV4XS5sZW5ndGg7CisJfQorCWlmIChzaXplIDw9IDApCisJCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhcjsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07CisJaW5kZXggPSBsZW5ndGg7CisJd2hpbGUgKC0taW5kZXggPj0gMCkgeworCQlsZW5ndGggPSBhcnJheVtpbmRleF0ubGVuZ3RoOworCQlpZiAobGVuZ3RoID4gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weShhcnJheVtpbmRleF0sIDAsIHJlc3VsdCwgKHNpemUgLT0gbGVuZ3RoKSwgbGVuZ3RoKTsKKwkJCWlmICgtLXNpemUgPj0gMCkKKwkJCQlyZXN1bHRbc2l6ZV0gPSBzZXBhcmF0b3I7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb250YWlucyhjaGFyIGNoYXJhY3RlciwgY2hhcltdW10gYXJyYXkpIHsKKwlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyAtLWkgPj0gMDspIHsKKwkJY2hhcltdIHN1YmFycmF5ID0gYXJyYXlbaV07CisJCWZvciAoaW50IGogPSBzdWJhcnJheS5sZW5ndGg7IC0taiA+PSAwOykKKwkJCWlmIChzdWJhcnJheVtqXSA9PSBjaGFyYWN0ZXIpCisJCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb250YWlucyhjaGFyIGNoYXJhY3RlciwgY2hhcltdIGFycmF5KSB7CisJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoYXJyYXlbaV0gPT0gY2hhcmFjdGVyKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBkZWVwQ29weShjaGFyW11bXSB0b0NvcHkpIHsKKwlpbnQgdG9Db3B5TGVuZ3RoID0gdG9Db3B5Lmxlbmd0aDsKKwljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhclt0b0NvcHlMZW5ndGhdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0NvcHlMZW5ndGg7IGkrKykgeworCQljaGFyW10gdG9FbGVtZW50ID0gdG9Db3B5W2ldOworCQlpbnQgdG9FbGVtZW50TGVuZ3RoID0gdG9FbGVtZW50Lmxlbmd0aDsKKwkJY2hhcltdIHJlc3VsdEVsZW1lbnQgPSBuZXcgY2hhclt0b0VsZW1lbnRMZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRvRWxlbWVudCwgMCwgcmVzdWx0RWxlbWVudCwgMCwgdG9FbGVtZW50TGVuZ3RoKTsKKwkJcmVzdWx0W2ldID0gcmVzdWx0RWxlbWVudDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuZHNXaXRoKGNoYXJbXSBhcnJheSwgY2hhcltdIHRvQmVGb3VuZCkgeworCWludCBpID0gdG9CZUZvdW5kLmxlbmd0aDsKKwlpbnQgaiA9IGFycmF5Lmxlbmd0aCAtIGk7CisJCisJaWYgKGogPCAwKQorCQlyZXR1cm4gZmFsc2U7CisJd2hpbGUgKC0taSA+PSAwKQorCQlpZiAodG9CZUZvdW5kW2ldICE9IGFycmF5W2kgKyBqXSkKKwkJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhjaGFyW11bXSBmaXJzdCwgY2hhcltdW10gc2Vjb25kKSB7CisJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKCFlcXVhbHMoZmlyc3RbaV0sIHNlY29uZFtpXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGNoYXJbXVtdIGZpcnN0LCBjaGFyW11bXSBzZWNvbmQsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKXsKKwkJcmV0dXJuIGVxdWFscyhmaXJzdCwgc2Vjb25kKTsKKwl9CisJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKCFlcXVhbHMoZmlyc3RbaV0sIHNlY29uZFtpXSwgZmFsc2UpKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQpIHsKKwlpZiAoZmlyc3QgPT0gc2Vjb25kKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChmaXJzdC5sZW5ndGggIT0gc2Vjb25kLmxlbmd0aCkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpbnQgaSA9IGZpcnN0Lmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoZmlyc3RbaV0gIT0gc2Vjb25kW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKXsKKwkJcmV0dXJuIGVxdWFscyhmaXJzdCwgc2Vjb25kKTsKKwl9CisJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShmaXJzdFtpXSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlY29uZFtpXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZnJhZ21lbnRFcXVhbHMoY2hhcltdIGZyYWdtZW50LCBjaGFyW10gbmFtZSwgaW50IHN0YXJ0SW5kZXgsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlpbnQgbWF4ID0gZnJhZ21lbnQubGVuZ3RoOworCWlmIChuYW1lLmxlbmd0aCA8IG1heCtzdGFydEluZGV4KSByZXR1cm4gZmFsc2U7CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSl7CisJCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQorCQkJaWYgKGZyYWdtZW50W2ldICE9IG5hbWVbaSArIHN0YXJ0SW5kZXhdKQorCQkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQorCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGZyYWdtZW50W2ldKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZVtpICsgc3RhcnRJbmRleF0pKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFzaENvZGUoY2hhcltdIGFycmF5KSB7CisJaW50IGhhc2ggPSAwOworCWludCBvZmZzZXQgPSAwOworCWludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisJaWYgKGxlbmd0aCA8IDE2KSB7CisJCWZvciAoaW50IGkgPSBsZW5ndGg7IGkgPiAwOyBpLS0pCisJCQloYXNoID0gKGhhc2ggKiAzNykgKyBhcnJheVtvZmZzZXQrK107CisJfSBlbHNlIHsKKwkJLy8gb25seSBzYW1wbGUgc29tZSBjaGFyYWN0ZXJzCisJCWludCBza2lwID0gbGVuZ3RoIC8gODsKKwkJZm9yIChpbnQgaSA9IGxlbmd0aDsgaSA+IDA7IGkgLT0gc2tpcCwgb2Zmc2V0ICs9IHNraXApCisJCQloYXNoID0gKGhhc2ggKiAzOSkgKyBhcnJheVtvZmZzZXRdOworCX0KKwlyZXR1cm4gaGFzaCAmIDB4N0ZGRkZGRkY7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpbmRleE9mKGNoYXIgdG9CZUZvdW5kLCBjaGFyW10gYXJyYXkpIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQorCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnQpIHsKKwlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKKwkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhc3RJbmRleE9mKGNoYXIgdG9CZUZvdW5kLCBjaGFyW10gYXJyYXkpIHsKKwlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCisJCQlyZXR1cm4gaTsKKwlyZXR1cm4gLTE7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnRJbmRleCkgeworCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IC0taSA+PSBzdGFydEluZGV4OykKKwkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhc3RJbmRleE9mKGNoYXIgdG9CZUZvdW5kLCBjaGFyW10gYXJyYXksIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKwlmb3IgKGludCBpID0gZW5kSW5kZXg7IC0taSA+PSBzdGFydEluZGV4OykKKwkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKy8qKgorICogQW5zd2VyIHRoZSBsYXN0IHBvcnRpb24gb2YgYSBuYW1lIGdpdmVuIGEgc2VwYXJhdG9yCisgKiBlLmcuIGxhc3RTZWdtZW50KCJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpLCcuJykgLS0+IE9iamVjdAorICovCitmaW5hbCBzdGF0aWMgcHVibGljIGNoYXJbXSBsYXN0U2VnbWVudChjaGFyW10gYXJyYXksIGNoYXIgc2VwYXJhdG9yKSB7CisJaW50IHBvcyA9IGxhc3RJbmRleE9mKHNlcGFyYXRvciwgYXJyYXkpOworCWlmIChwb3MgPCAwKSByZXR1cm4gYXJyYXk7CisJcmV0dXJuIHN1YmFycmF5KGFycmF5LCBwb3MrMSwgYXJyYXkubGVuZ3RoKTsKK30KKy8qKgorICogY2hhcltdIHBhdHRlcm4gbWF0Y2hpbmcsIGFjY2VwdGluZyB3aWxkLWNhcmRzICcqJy4KKyAqCisgKiBXaGVuIG5vdCBjYXNlIHNlbnNpdGl2ZSwgdGhlIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGxvd2VyY2FzZWQsIHRoZQorICogbmFtZSB3aWxsIGJlIGxvd2VyY2FzZWQgY2hhcmFjdGVyIHBlciBjaGFyYWN0ZXIgYXMgY29tcGFyaW5nLgorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gbWF0Y2goY2hhcltdIHBhdHRlcm4sIGNoYXJbXSBuYW1lLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJaWYgKHBhdHRlcm4gPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIG51bGwgcGF0dGVybiBpcyBlcXVpdmFsZW50IHRvICcqJworCWludCBpUGF0dGVybiA9IDAsIHBhdHRlcm5MZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDsKKwlpbnQgaU5hbWUgPSAwLCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGg7CisKKwkvKiBjaGVjayBmaXJzdCBzZWdtZW50ICovCisJY2hhciBwYXR0ZXJuQ2hhciA9IDA7CisJd2hpbGUgKChpUGF0dGVybiA8IHBhdHRlcm5MZW5ndGgpICYmIChwYXR0ZXJuQ2hhciA9IHBhdHRlcm5baVBhdHRlcm5dKSAhPSAnKicpeworCQlpZiAoaU5hbWUgPT0gbmFtZUxlbmd0aCkgcmV0dXJuIGZhbHNlOworCQlpZiAocGF0dGVybkNoYXIgIT0gKGlzQ2FzZVNlbnNpdGl2ZSAKKwkJCQkJCQkJPyBuYW1lW2lOYW1lXSAKKwkJCQkJCQkJOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZVtpTmFtZV0pKSl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaU5hbWUrKzsKKwkJaVBhdHRlcm4rKzsKKwl9CisJLyogY2hlY2sgc2VxdWVuY2Ugb2Ygc3RhcitzZWdtZW50ICovCisJaW50IHNlZ21lbnRTdGFydDsKKwlpZiAocGF0dGVybkNoYXIgPT0gJyonKXsKKwkJc2VnbWVudFN0YXJ0ID0gKytpUGF0dGVybjsgLy8gc2tpcCBzdGFyCisJfSBlbHNlIHsKKwkJc2VnbWVudFN0YXJ0ID0gMDsgLy8gZm9yY2UgaU5hbWUgY2hlY2sKKwl9CisJaW50IHByZWZpeFN0YXJ0ID0gaU5hbWU7CisJY2hlY2tTZWdtZW50OiB3aGlsZSAoaU5hbWUgPCBuYW1lTGVuZ3RoICYmIGlQYXR0ZXJuIDwgcGF0dGVybkxlbmd0aCl7CisJCS8qIHNlZ21lbnQgaXMgZW5kaW5nICovCisJCWlmICgocGF0dGVybkNoYXIgPSBwYXR0ZXJuW2lQYXR0ZXJuXSkgPT0gJyonKXsKKwkJCXNlZ21lbnRTdGFydCA9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcnQKKwkJCXByZWZpeFN0YXJ0ID0gaU5hbWU7CisJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7CisJCX0KKwkJLyogY2hlY2ggY3VycmVudCBuYW1lIGNoYXJhY3RlciAqLworCQlpZiAoKGlzQ2FzZVNlbnNpdGl2ZSAKKwkJCQk/IG5hbWVbaU5hbWVdIAorCQkJCTogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaU5hbWVdKSkhPSBwYXR0ZXJuQ2hhcil7CisJCQlpUGF0dGVybiA9IHNlZ21lbnRTdGFydDsgLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgc2VnbWVudAorCQkJaU5hbWUgPSArK3ByZWZpeFN0YXJ0OworCQkJY29udGludWUgY2hlY2tTZWdtZW50OworCQl9CisJCWlOYW1lKys7CisJCWlQYXR0ZXJuKys7CisJfQorCisJcmV0dXJuIChzZWdtZW50U3RhcnQgPT0gcGF0dGVybkxlbmd0aCkKKwkJCXx8IChpTmFtZSA9PSBuYW1lTGVuZ3RoICYmIGlQYXR0ZXJuID09IHBhdHRlcm5MZW5ndGgpCQorCQkJfHwgKGlQYXR0ZXJuID09IHBhdHRlcm5MZW5ndGggLSAxICYmIHBhdHRlcm5baVBhdHRlcm5dID09ICcqJyk7IAorfQorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb2NjdXJlbmNlc09mKGNoYXIgdG9CZUZvdW5kLCBjaGFyW10gYXJyYXkpIHsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pIGNvdW50Kys7CisJcmV0dXJuIGNvdW50OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb2NjdXJlbmNlc09mKGNoYXIgdG9CZUZvdW5kLCBjaGFyW10gYXJyYXksIGludCBzdGFydCkgeworCWludCBjb3VudCA9IDA7CisJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pIGNvdW50Kys7CisJcmV0dXJuIGNvdW50OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHByZWZpeEVxdWFscyhjaGFyW10gcHJlZml4LCBjaGFyW10gbmFtZSkgeworCisJaW50IG1heCA9IHByZWZpeC5sZW5ndGg7CisJaWYgKG5hbWUubGVuZ3RoIDwgbWF4KSByZXR1cm4gZmFsc2U7CisJZm9yIChpbnQgaSA9IG1heDsgLS1pID49IDA7KSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCisJCWlmIChwcmVmaXhbaV0gIT0gbmFtZVtpXSkKKwkJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcmVmaXhFcXVhbHMoY2hhcltdIHByZWZpeCwgY2hhcltdIG5hbWUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlpbnQgbWF4ID0gcHJlZml4Lmxlbmd0aDsKKwlpZiAobmFtZS5sZW5ndGggPCBtYXgpIHJldHVybiBmYWxzZTsKKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKXsKKwkJZm9yIChpbnQgaSA9IG1heDsgLS1pID49IDA7KSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCisJCQlpZiAocHJlZml4W2ldICE9IG5hbWVbaV0pCisJCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJZm9yIChpbnQgaSA9IG1heDsgLS1pID49IDA7KSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCisJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UocHJlZml4W2ldKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobmFtZVtpXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVwbGFjZSgKKwljaGFyW10gYXJyYXksIAorCWNoYXIgdG9CZVJlcGxhY2VkLCAKKwljaGFyIHJlcGxhY2VtZW50Q2hhcikgeworCWlmICh0b0JlUmVwbGFjZWQgIT0gcmVwbGFjZW1lbnRDaGFyKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcnJheS5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGFycmF5W2ldID09IHRvQmVSZXBsYWNlZCkKKwkJCQlhcnJheVtpXSA9IHJlcGxhY2VtZW50Q2hhcjsKKwkJfQorCX0KK30KKworLyoKKyAqIFJldHVybnMgYSBjaGFyW10gd2l0aCBzdWJzdGl0dXRpb25zLiBObyBzaWRlLWVmZmVjdCBpcyBvcGVyYXRlZCBvbiB0aGUgb3JpZ2luYWwKKyAqIGFycmF5LCBpbiBjYXNlIG5vIHN1YnN0aXR1dGlvbiBoYXBwZW5lZCwgdGhlbiB0aGUgcmVzdWx0IG1pZ2h0IGJlIHRoZSBzYW1lIGFzIHRoZQorICogb3JpZ2luYWwgb25lLgorICogCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIHJlcGxhY2UoCisJY2hhcltdIGFycmF5LCAKKwljaGFyW10gdG9CZVJlcGxhY2VkLCAKKwljaGFyW10gcmVwbGFjZW1lbnRDaGFycykgeworCisKKwlpbnQgbWF4ID0gYXJyYXkubGVuZ3RoOworCWludCByZXBsYWNlZExlbmd0aCA9IHRvQmVSZXBsYWNlZC5sZW5ndGg7CisJaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnRDaGFycy5sZW5ndGg7CisKKwlpbnRbXSBzdGFydHMgPSBuZXcgaW50WzVdOworCWludCBvY2N1cnJlbmNlQ291bnQgPSAwOworCQorCWlmICghZXF1YWxzKHRvQmVSZXBsYWNlZCxyZXBsYWNlbWVudENoYXJzKSkgeworCQkKKwkJbmV4dDogZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJaW50IGogPSAwOworCQkJd2hpbGUgKGogPCByZXBsYWNlZExlbmd0aCl7CisJCQkJaWYgKGkraiA9PSBtYXgpIGNvbnRpbnVlIG5leHQ7CisJCQkJaWYgKGFycmF5W2kgKyBqXSAhPSB0b0JlUmVwbGFjZWRbaisrXSkgY29udGludWUgbmV4dDsKKwkJCX0KKwkJCWlmIChvY2N1cnJlbmNlQ291bnQgPT0gc3RhcnRzLmxlbmd0aCl7CisJCQkJU3lzdGVtLmFycmF5Y29weShzdGFydHMsIDAsIHN0YXJ0cyA9IG5ldyBpbnRbb2NjdXJyZW5jZUNvdW50ICogMl0sIDAsIG9jY3VycmVuY2VDb3VudCk7CisJCQl9CisJCQlzdGFydHNbb2NjdXJyZW5jZUNvdW50KytdID0gaTsKKwkJfQorCX0KKwlpZiAob2NjdXJyZW5jZUNvdW50ID09IDApIHJldHVybiBhcnJheTsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbWF4ICsgb2NjdXJyZW5jZUNvdW50ICogKHJlcGxhY2VtZW50TGVuZ3RoIC0gcmVwbGFjZWRMZW5ndGgpXTsKKwlpbnQgaW5TdGFydCA9IDAsIG91dFN0YXJ0ID0gMDsKKwlmb3IoIGludCBpID0gMDsgaSA8IG9jY3VycmVuY2VDb3VudDsgaSsrKXsKKwkJaW50IG9mZnNldCA9IHN0YXJ0c1tpXSAtIGluU3RhcnQ7CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluU3RhcnQsIHJlc3VsdCwgb3V0U3RhcnQsIG9mZnNldCk7CisJCWluU3RhcnQgKz0gb2Zmc2V0OworCQlvdXRTdGFydCArPSBvZmZzZXQ7CisJCVN5c3RlbS5hcnJheWNvcHkocmVwbGFjZW1lbnRDaGFycywgMCwgcmVzdWx0LCBvdXRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOworCQlpblN0YXJ0ICs9IHJlcGxhY2VkTGVuZ3RoOworCQlvdXRTdGFydCArPSByZXBsYWNlbWVudExlbmd0aDsKKwl9CisJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5TdGFydCwgcmVzdWx0LCBvdXRTdGFydCwgbWF4IC0gaW5TdGFydCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBzcGxpdEFuZFRyaW1PbihjaGFyIGRpdmlkZXIsIGNoYXJbXSBhcnJheSkgeworCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXI7CisKKwlpbnQgd29yZENvdW50ID0gMTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikKKwkJCXdvcmRDb3VudCsrOworCWNoYXJbXVtdIHNwbGl0ID0gbmV3IGNoYXJbd29yZENvdW50XVtdOworCWludCBsYXN0ID0gMCwgY3VycmVudFdvcmQgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpIHsKKwkJCWludCBzdGFydCA9IGxhc3QsIGVuZCA9IGkgLSAxOworCQkJd2hpbGUgKHN0YXJ0IDwgaSAmJiBhcnJheVtzdGFydF0gPT0gJyAnKSBzdGFydCsrOworCQkJd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIGFycmF5W2VuZF0gPT0gJyAnKSBlbmQtLTsKKwkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2VuZCAtIHN0YXJ0ICsgMV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgc3BsaXRbY3VycmVudFdvcmQrK10sIDAsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQlsYXN0ID0gaSArIDE7CisJCX0KKwl9CisJaW50IHN0YXJ0ID0gbGFzdCwgZW5kID0gbGVuZ3RoIC0gMTsKKwl3aGlsZSAoc3RhcnQgPCBsZW5ndGggJiYgYXJyYXlbc3RhcnRdID09ICcgJykgc3RhcnQrKzsKKwl3aGlsZSAoZW5kID4gc3RhcnQgJiYgYXJyYXlbZW5kXSA9PSAnICcpIGVuZC0tOworCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2VuZCAtIHN0YXJ0ICsgMV07CisJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHNwbGl0W2N1cnJlbnRXb3JkKytdLCAwLCBlbmQgLSBzdGFydCArIDEpOworCXJldHVybiBzcGxpdDsKK30KKworcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBzcGxpdE9uKGNoYXIgZGl2aWRlciwgY2hhcltdIGFycmF5KSB7CisJaW50IGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIFR5cGVDb25zdGFudHMuTm9DaGFyQ2hhcjsKKworCWludCB3b3JkQ291bnQgPSAxOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKQorCQkJd29yZENvdW50Kys7CisJY2hhcltdW10gc3BsaXQgPSBuZXcgY2hhclt3b3JkQ291bnRdW107CisJaW50IGxhc3QgPSAwLCBjdXJyZW50V29yZCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikgeworCQkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbaSAtIGxhc3RdOworCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgbGFzdCwgc3BsaXRbY3VycmVudFdvcmQrK10sIDAsIGkgLSBsYXN0KTsKKwkJCWxhc3QgPSBpICsgMTsKKwkJfQorCX0KKwlzcGxpdFtjdXJyZW50V29yZF0gPSBuZXcgY2hhcltsZW5ndGggLSBsYXN0XTsKKwlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBsYXN0LCBzcGxpdFtjdXJyZW50V29yZF0sIDAsIGxlbmd0aCAtIGxhc3QpOworCXJldHVybiBzcGxpdDsKK30KK3B1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3BsaXRPbihjaGFyIGRpdmlkZXIsIGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJaW50IGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCB8fCBzdGFydCA+IGVuZCkKKwkJcmV0dXJuIFR5cGVDb25zdGFudHMuTm9DaGFyQ2hhcjsKKworCWludCB3b3JkQ291bnQgPSAxOworCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKQorCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikKKwkJCXdvcmRDb3VudCsrOworCWNoYXJbXVtdIHNwbGl0ID0gbmV3IGNoYXJbd29yZENvdW50XVtdOworCWludCBsYXN0ID0gc3RhcnQsIGN1cnJlbnRXb3JkID0gMDsKKwlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikgeworCQkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbaSAtIGxhc3RdOworCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgbGFzdCwgc3BsaXRbY3VycmVudFdvcmQrK10sIDAsIGkgLSBsYXN0KTsKKwkJCWxhc3QgPSBpICsgMTsKKwkJfQorCX0KKwlzcGxpdFtjdXJyZW50V29yZF0gPSBuZXcgY2hhcltlbmQgLSBsYXN0ICsgMV07CisJU3lzdGVtLmFycmF5Y29weShhcnJheSwgbGFzdCwgc3BsaXRbY3VycmVudFdvcmRdLCAwLCBlbmQgLSBsYXN0ICsgMSk7CisJcmV0dXJuIHNwbGl0OworfQorcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXJ0c1dpdGgoY2hhcltdIGFycmF5LCBjaGFyW10gdG9CZUZvdW5kKSB7CisJaW50IGkgPSB0b0JlRm91bmQubGVuZ3RoOworCWlmIChpID4gYXJyYXkubGVuZ3RoKQorCQlyZXR1cm4gZmFsc2U7CisJd2hpbGUgKC0taSA+PSAwKQorCQlpZiAodG9CZUZvdW5kW2ldICE9IGFycmF5W2ldKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorLyoKKyAqIGNvcGllcyBmcm9tIGFycmF5W3N0YXJ0XSB0aHJvdWdoIGFycmF5W2VuZCAtIDFdIChkb2VzIG5vdCBjb3B5IGFycmF5W2VuZF0pCisgKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3ViYXJyYXkoY2hhcltdW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgeworCWlmIChlbmQgPT0gLTEpIGVuZCA9IGFycmF5Lmxlbmd0aDsKKwlpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBudWxsOworCWlmIChzdGFydCA8IDApIHJldHVybiBudWxsOworCWlmIChlbmQgPiBhcnJheS5sZW5ndGgpIHJldHVybiBudWxsOworCisJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdW107CisvKiBpZiB3ZSBkbyBub3QgdHJ1c3QgU3lzdGVtLmFycmF5Y29weSBvbiBvdXIgVk0gd2l0aCBjaGFyW11bXSdzCisJZm9yIChpbnQgaSA9IDAsIHMgPSBzdGFydDsgcyA8IGVuZDsgaSsrLCBzKyspCisJCXJlc3VsdFtpXSA9IGFycmF5W3NdOworKi8KKwlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgcmVzdWx0LCAwLCBlbmQgLSBzdGFydCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qCisgKiBjb3BpZXMgZnJvbSBhcnJheVtzdGFydF0gdGhyb3VnaCBhcnJheVtlbmQgLSAxXSAoZG9lcyBub3QgY29weSBhcnJheVtlbmRdKQorICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBzdWJhcnJheShjaGFyW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgeworCWlmIChlbmQgPT0gLTEpIGVuZCA9IGFycmF5Lmxlbmd0aDsKKwlpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBudWxsOworCWlmIChzdGFydCA8IDApIHJldHVybiBudWxsOworCWlmIChlbmQgPiBhcnJheS5sZW5ndGgpIHJldHVybiBudWxsOworCisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2VuZCAtIHN0YXJ0XTsKKwlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgcmVzdWx0LCAwLCBlbmQgLSBzdGFydCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICoJQW5zd2VycyB0aGUgcmVzdWx0IG9mIGEgY2hhcltdIGNvbnZlcnNpb24gdG8gbG93ZXJjYXNlLgorICoJTk9URTogaWYgbm8gY29udmVyc2lvbiB3YXMgbmVjZXNzYXJ5LCB0aGVuIGFuc3dlcnMgYmFjayB0aGUgYXJndW1lbnQgb25lLgorICovCitmaW5hbCBzdGF0aWMgcHVibGljIGNoYXJbXSB0b0xvd2VyQ2FzZShjaGFyW10gY2hhcnMpIHsKKwlpZiAoY2hhcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJaW50IGxlbmd0aCA9IGNoYXJzLmxlbmd0aDsKKwljaGFyW10gbG93ZXJDaGFycyA9IG51bGw7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCWNoYXIgYyA9IGNoYXJzW2ldOworCQljaGFyIGxjID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpOworCQlpZiAoKGMgIT0gbGMpIHx8IChsb3dlckNoYXJzICE9IG51bGwpKXsKKwkJCWlmIChsb3dlckNoYXJzID09IG51bGwpeworCQkJCVN5c3RlbS5hcnJheWNvcHkoY2hhcnMsIDAsIGxvd2VyQ2hhcnMgPSBuZXcgY2hhcltsZW5ndGhdLCAwLCBpKTsKKwkJCX0KKwkJCWxvd2VyQ2hhcnNbaV0gPSBsYzsKKwkJfQorCX0KKwlyZXR1cm4gbG93ZXJDaGFycyA9PSBudWxsID8gY2hhcnMgOiBsb3dlckNoYXJzOworfQorCisvKioKKyAqIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKKyAqLworZmluYWwgc3RhdGljIHB1YmxpYyBjaGFyW10gdHJpbShjaGFyW10gY2hhcnMpeworCQorCWlmIChjaGFycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkKKwljaGFyW10gcmVzdWx0ID0gY2hhcnM7CisJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gY2hhcnMubGVuZ3RoLCBlbmQgPSBsZW5ndGggLSAxOworCXdoaWxlIChzdGFydCA8IGxlbmd0aCAmJiBjaGFyc1tzdGFydF0gPT0gJyAnKSB7CisJCXN0YXJ0Kys7CisJfQorCXdoaWxlIChlbmQgPiBzdGFydCAmJiBjaGFyc1tlbmRdID09ICcgJyl7CisJCWVuZC0tOworCX0KKwlpZiAoc3RhcnQgIT0gMCB8fCBlbmQgIT0gbGVuZ3RoIC0gMSl7CisJCXJldHVybiBzdWJhcnJheShjaGFycywgc3RhcnQsIGVuZCsxKTsKKwl9CisJcmV0dXJuIGNoYXJzOworfQorZmluYWwgc3RhdGljIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoY2hhcltdW10gYXJyYXkpIHsKKwljaGFyW10gcmVzdWx0ID0gY29uY2F0V2l0aChhcnJheSwgJy4nKTsKKwlpZiAocmVzdWx0ID09IG51bGwpCisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NvbXBvdW5kTmFtZVZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDNjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKworcHVibGljIGZpbmFsIGNsYXNzIENvbXBvdW5kTmFtZVZlY3RvciB7CisJc3RhdGljIGludCBJTklUSUFMX1NJWkUgPSAxMDsKKyAgICAKKwlwdWJsaWMgaW50IHNpemU7CisJaW50IG1heFNpemU7CisJY2hhcltdW11bXSBlbGVtZW50czsKK3B1YmxpYyBDb21wb3VuZE5hbWVWZWN0b3IoKSB7CisJbWF4U2l6ZSA9IElOSVRJQUxfU0laRTsKKwlzaXplID0gMDsKKwllbGVtZW50cyA9IG5ldyBjaGFyW21heFNpemVdW11bXTsKK30KK3B1YmxpYyB2b2lkIGFkZChjaGFyW11bXSBuZXdFbGVtZW50KSB7CisJaWYgKHNpemUgPT0gbWF4U2l6ZSkgICAgLy8ga25vd3MgdGhhdCBzaXplIHN0YXJ0cyA8PSBtYXhTaXplCisJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIChlbGVtZW50cyA9IG5ldyBjaGFyW21heFNpemUgKj0gMl1bXVtdKSwgMCwgc2l6ZSk7CisJZWxlbWVudHNbc2l6ZSsrXSA9IG5ld0VsZW1lbnQ7Cit9CitwdWJsaWMgdm9pZCBhZGRBbGwoY2hhcltdW11bXSBuZXdFbGVtZW50cykgeworCWlmIChzaXplICsgbmV3RWxlbWVudHMubGVuZ3RoID49IG1heFNpemUpIHsKKwkJbWF4U2l6ZSA9IHNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGg7ICAgIC8vIGFzc3VtZSBubyBtb3JlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKKwkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgKGVsZW1lbnRzID0gbmV3IGNoYXJbbWF4U2l6ZV1bXVtdKSwgMCwgc2l6ZSk7CisJfQorCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIGVsZW1lbnRzLCBzaXplLCBuZXdFbGVtZW50cy5sZW5ndGgpOworCXNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOworfQorcHVibGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdW10gZWxlbWVudCkgeworCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50LCBlbGVtZW50c1tpXSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgY2hhcltdW10gZWxlbWVudEF0KGludCBpbmRleCkgeworCXJldHVybiBlbGVtZW50c1tpbmRleF07Cit9CitwdWJsaWMgY2hhcltdW10gcmVtb3ZlKGNoYXJbXVtdIGVsZW1lbnQpIHsKKwkvLyBhc3N1bWVzIG9ubHkgb25lIG9jY3VycmVuY2Ugb2YgdGhlIGVsZW1lbnQgZXhpc3RzCisJZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykKKwkJaWYgKGVsZW1lbnQgPT0gZWxlbWVudHNbaV0pIHsKKwkJCS8vIHNoaWZ0IHRoZSByZW1haW5pbmcgZWxlbWVudHMgZG93biBvbmUgc3BvdAorCQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgaSArIDEsIGVsZW1lbnRzLCBpLCAtLXNpemUgLSBpKTsKKwkJCWVsZW1lbnRzW3NpemVdID0gbnVsbDsKKwkJCXJldHVybiBlbGVtZW50OworCQl9CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykKKwkJZWxlbWVudHNbaV0gPSBudWxsOworCXNpemUgPSAwOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoQ2hhck9wZXJhdGlvbi50b1N0cmluZyhlbGVtZW50c1tpXSkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMTJhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CisgCisgLyoqCisgICoJSGFzaHRhYmxlIGZvciBub24temVybyBpbnQga2V5cy4KKyAgKi8KKyAgCitwdWJsaWMgZmluYWwgY2xhc3MgSGFzaHRhYmxlT2ZJbnQgeworCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKKwlwdWJsaWMgaW50W10ga2V5VGFibGU7CisJcHVibGljIE9iamVjdFtdIHZhbHVlVGFibGU7CisKKwlpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKKwlpbnQgdGhyZXNob2xkOworcHVibGljIEhhc2h0YWJsZU9mSW50KCkgeworCXRoaXMoMTMpOworfQorcHVibGljIEhhc2h0YWJsZU9mSW50KGludCBzaXplKSB7CisJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CisJdGhpcy50aHJlc2hvbGQgPSBzaXplOyAvLyBzaXplIHJlcHJlc2VudHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbGVtZW50cworCWludCBleHRyYVJvb20gPSAoaW50KSAoc2l6ZSAqIDEuNzVmKTsKKwlpZiAodGhpcy50aHJlc2hvbGQgPT0gZXh0cmFSb29tKQorCQlleHRyYVJvb20rKzsKKwl0aGlzLmtleVRhYmxlID0gbmV3IGludFtleHRyYVJvb21dOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBPYmplY3RbZXh0cmFSb29tXTsKK30KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGludCBrZXkpIHsKKwlpbnQgaW5kZXggPSBrZXkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwlpbnQgY3VycmVudEtleTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IDApIHsKKwkJaWYgKGN1cnJlbnRLZXkgPT0ga2V5KQorCQkJcmV0dXJuIHRydWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBPYmplY3QgZ2V0KGludCBrZXkpIHsKKwlpbnQgaW5kZXggPSBrZXkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwlpbnQgY3VycmVudEtleTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IDApIHsKKwkJaWYgKGN1cnJlbnRLZXkgPT0ga2V5KSAgcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBPYmplY3QgcHV0KGludCBrZXksIE9iamVjdCB2YWx1ZSkgeworCWludCBpbmRleCA9IGtleSAlIHZhbHVlVGFibGUubGVuZ3RoOworCWludCBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJa2V5VGFibGVbaW5kZXhdID0ga2V5OworCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJCXJlaGFzaCgpOworCXJldHVybiB2YWx1ZTsKK30KK3ByaXZhdGUgdm9pZCByZWhhc2goKSB7CisJSGFzaHRhYmxlT2ZJbnQgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mSW50KGVsZW1lbnRTaXplICogMik7IC8vIGRvdWJsZSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzCisJaW50IGN1cnJlbnRLZXk7CisJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQorCQlpZiAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpXSkgIT0gMCkKKwkJCW5ld0hhc2h0YWJsZS5wdXQoY3VycmVudEtleSwgdmFsdWVUYWJsZVtpXSk7CisKKwl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0hhc2h0YWJsZS52YWx1ZVRhYmxlOworCXRoaXMudGhyZXNob2xkID0gbmV3SGFzaHRhYmxlLnRocmVzaG9sZDsKK30KK3B1YmxpYyBpbnQgc2l6ZSgpIHsKKwlyZXR1cm4gZWxlbWVudFNpemU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlPYmplY3Qgb2JqZWN0OworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoKG9iamVjdCA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJCQlzICs9IGtleVRhYmxlW2ldICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKworLyoqCisgKiBIYXNodGFibGUgb2Yge2NoYXJbXSAtLT4gT2JqZWN0IH0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEhhc2h0YWJsZU9mT2JqZWN0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKwkKKwkvLyB0byBhdm9pZCB1c2luZyBFbnVtZXJhdGlvbnMsIHdhbGsgdGhlIGluZGl2aWR1YWwgdGFibGVzIHNraXBwaW5nIG51bGxzCisJcHVibGljIGNoYXJbXSBrZXlUYWJsZVtdOworCXB1YmxpYyBPYmplY3QgdmFsdWVUYWJsZVtdOworCisJcHVibGljIGludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorCWludCB0aHJlc2hvbGQ7CisKKwlwdWJsaWMgSGFzaHRhYmxlT2ZPYmplY3QoKSB7CisJCXRoaXMoMTMpOworCX0KKworCXB1YmxpYyBIYXNodGFibGVPZk9iamVjdChpbnQgc2l6ZSkgeworCisJCXRoaXMuZWxlbWVudFNpemUgPSAwOworCQl0aGlzLnRocmVzaG9sZCA9IHNpemU7IC8vIHNpemUgcmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCisJCWludCBleHRyYVJvb20gPSAoaW50KSAoc2l6ZSAqIDEuNzVmKTsKKwkJaWYgKHRoaXMudGhyZXNob2xkID09IGV4dHJhUm9vbSkKKwkJCWV4dHJhUm9vbSsrOworCQl0aGlzLmtleVRhYmxlID0gbmV3IGNoYXJbZXh0cmFSb29tXVtdOworCQl0aGlzLnZhbHVlVGFibGUgPSBuZXcgT2JqZWN0W2V4dHJhUm9vbV07CisJfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJCUhhc2h0YWJsZU9mT2JqZWN0IHJlc3VsdCA9IChIYXNodGFibGVPZk9iamVjdCkgc3VwZXIuY2xvbmUoKTsKKwkJcmVzdWx0LmVsZW1lbnRTaXplID0gdGhpcy5lbGVtZW50U2l6ZTsKKwkJcmVzdWx0LnRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkOworCisJCWludCBsZW5ndGggPSB0aGlzLmtleVRhYmxlLmxlbmd0aDsKKwkJcmVzdWx0LmtleVRhYmxlID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMua2V5VGFibGUsIDAsIHJlc3VsdC5rZXlUYWJsZSwgMCwgbGVuZ3RoKTsKKworCQlsZW5ndGggPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOworCQlyZXN1bHQudmFsdWVUYWJsZSA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnZhbHVlVGFibGUsIDAsIHJlc3VsdC52YWx1ZVRhYmxlLCAwLCBsZW5ndGgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGNoYXJbXSBrZXkpIHsKKworCQlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJCWNoYXJbXSBjdXJyZW50S2V5OworCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGgKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhjdXJyZW50S2V5LCBrZXkpKQorCQkJCXJldHVybiB0cnVlOworCQkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIE9iamVjdCBnZXQoY2hhcltdIGtleSkgeworCisJCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIHZhbHVlVGFibGUubGVuZ3RoOworCQlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKKwkJY2hhcltdIGN1cnJlbnRLZXk7CisJCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRLZXkubGVuZ3RoID09IGtleUxlbmd0aAorCQkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCisJCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdOworCQkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHB1dChjaGFyW10ga2V5LCBPYmplY3QgdmFsdWUpIHsKKworCQlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwkJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJCWNoYXJbXSBjdXJyZW50S2V5OworCQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGgKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhjdXJyZW50S2V5LCBrZXkpKQorCQkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwkJfQorCQlrZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQorCQlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJCXJlaGFzaCgpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIE9iamVjdCByZW1vdmVLZXkoY2hhcltdIGtleSkgeworCisJCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIHZhbHVlVGFibGUubGVuZ3RoOworCQlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKKwkJY2hhcltdIGN1cnJlbnRLZXk7CisJCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRLZXkubGVuZ3RoID09IGtleUxlbmd0aAorCQkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGN1cnJlbnRLZXksIGtleSkpIHsKKwkJCQkJT2JqZWN0IHZhbHVlID0gdmFsdWVUYWJsZVtpbmRleF07CisJCQkJCWVsZW1lbnRTaXplLS07CisJCQkJCWtleVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQkJCXZhbHVlVGFibGVbaW5kZXhdID0gbnVsbDsKKwkJCQkJcmVoYXNoKCk7CisJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9CisJCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCByZWhhc2goKSB7CisKKwkJSGFzaHRhYmxlT2ZPYmplY3QgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KGVsZW1lbnRTaXplICogMik7CQkvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCQljaGFyW10gY3VycmVudEtleTsKKwkJZm9yIChpbnQgaSA9IGtleVRhYmxlLmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCisJCQkJbmV3SGFzaHRhYmxlLnB1dChjdXJyZW50S2V5LCB2YWx1ZVRhYmxlW2ldKTsKKworCQl0aGlzLmtleVRhYmxlID0gbmV3SGFzaHRhYmxlLmtleVRhYmxlOworCQl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKKwkJdGhpcy50aHJlc2hvbGQgPSBuZXdIYXNodGFibGUudGhyZXNob2xkOworCX0KKworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJcmV0dXJuIGVsZW1lbnRTaXplOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJT2JqZWN0IG9iamVjdDsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQlpZiAoKG9iamVjdCA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJCQkJcyArPSBuZXcgU3RyaW5nKGtleVRhYmxlW2ldKSArICIgLT4gIiArIG9iamVjdC50b1N0cmluZygpICsgIlxuIjsgCS8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gczsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWYxM2JlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOworCitwdWJsaWMgZmluYWwgY2xhc3MgSGFzaHRhYmxlT2ZQYWNrYWdlIHsKKwkvLyB0byBhdm9pZCB1c2luZyBFbnVtZXJhdGlvbnMsIHdhbGsgdGhlIGluZGl2aWR1YWwgdGFibGVzIHNraXBwaW5nIG51bGxzCisJcHVibGljIGNoYXJbXSBrZXlUYWJsZVtdOworCXB1YmxpYyBQYWNrYWdlQmluZGluZyB2YWx1ZVRhYmxlW107CisKKwlpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKKwlpbnQgdGhyZXNob2xkOworcHVibGljIEhhc2h0YWJsZU9mUGFja2FnZSgpIHsKKwl0aGlzKDMpOyAvLyB1c3VhbGx5IG5vdCB2ZXJ5IGxhcmdlCit9CitwdWJsaWMgSGFzaHRhYmxlT2ZQYWNrYWdlKGludCBzaXplKSB7CisJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CisJdGhpcy50aHJlc2hvbGQgPSBzaXplOyAvLyBzaXplIHJlcHJlc2VudHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbGVtZW50cworCWludCBleHRyYVJvb20gPSAoaW50KSAoc2l6ZSAqIDEuNzVmKTsKKwlpZiAodGhpcy50aHJlc2hvbGQgPT0gZXh0cmFSb29tKQorCQlleHRyYVJvb20rKzsKKwl0aGlzLmtleVRhYmxlID0gbmV3IGNoYXJbZXh0cmFSb29tXVtdOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBQYWNrYWdlQmluZGluZ1tleHRyYVJvb21dOworfQorcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoY2hhcltdIGtleSkgeworCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIHZhbHVlVGFibGUubGVuZ3RoOworCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOworCWNoYXJbXSBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIFBhY2thZ2VCaW5kaW5nIGdldChjaGFyW10ga2V5KSB7CisJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJY2hhcltdIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoY3VycmVudEtleSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgUGFja2FnZUJpbmRpbmcgcHV0KGNoYXJbXSBrZXksIFBhY2thZ2VCaW5kaW5nIHZhbHVlKSB7CisJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJY2hhcltdIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoY3VycmVudEtleSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlrZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJcmVoYXNoKCk7CisJcmV0dXJuIHZhbHVlOworfQorcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKwlIYXNodGFibGVPZlBhY2thZ2UgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mUGFja2FnZShlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCWNoYXJbXSBjdXJyZW50S2V5OworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCisJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCisJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKKwl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKKwl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7Cit9CitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCisJUGFja2FnZUJpbmRpbmcgcGtnOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoKHBrZyA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJCQlzICs9IHBrZy50b1N0cmluZygpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBzOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdkYTliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIYXNodGFibGVPZlR5cGUgeworCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKKwlwdWJsaWMgY2hhcltdIGtleVRhYmxlW107CisJcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgdmFsdWVUYWJsZVtdOworCisJaW50IGVsZW1lbnRTaXplOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlCisJaW50IHRocmVzaG9sZDsKK3B1YmxpYyBIYXNodGFibGVPZlR5cGUoKSB7CisJdGhpcygzKTsKK30KK3B1YmxpYyBIYXNodGFibGVPZlR5cGUoaW50IHNpemUpIHsKKwl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwl0aGlzLnRocmVzaG9sZCA9IHNpemU7IC8vIHNpemUgcmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCisJaW50IGV4dHJhUm9vbSA9IChpbnQpIChzaXplICogMS43NWYpOworCWlmICh0aGlzLnRocmVzaG9sZCA9PSBleHRyYVJvb20pCisJCWV4dHJhUm9vbSsrOworCXRoaXMua2V5VGFibGUgPSBuZXcgY2hhcltleHRyYVJvb21dW107CisJdGhpcy52YWx1ZVRhYmxlID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbZXh0cmFSb29tXTsKK30KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGNoYXJbXSBrZXkpIHsKKwlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKGtleSkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKKwljaGFyW10gY3VycmVudEtleTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJaWYgKGN1cnJlbnRLZXkubGVuZ3RoID09IGtleUxlbmd0aCAmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhjdXJyZW50S2V5LCBrZXkpKQorCQkJcmV0dXJuIHRydWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGdldChjaGFyW10ga2V5KSB7CisJaW50IGluZGV4ID0gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZShrZXkpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJaW50IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CisJY2hhcltdIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5Lmxlbmd0aCA9PSBrZXlMZW5ndGggJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoY3VycmVudEtleSwga2V5KSkKKwkJCXJldHVybiB2YWx1ZVRhYmxlW2luZGV4XTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBwdXQoY2hhcltdIGtleSwgUmVmZXJlbmNlQmluZGluZyB2YWx1ZSkgeworCWludCBpbmRleCA9IENoYXJPcGVyYXRpb24uaGFzaENvZGUoa2V5KSAlIHZhbHVlVGFibGUubGVuZ3RoOworCWludCBrZXlMZW5ndGggPSBrZXkubGVuZ3RoOworCWNoYXJbXSBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoY3VycmVudEtleS5sZW5ndGggPT0ga2V5TGVuZ3RoICYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGN1cnJlbnRLZXksIGtleSkpCisJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJa2V5VGFibGVbaW5kZXhdID0ga2V5OworCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpCisJCXJlaGFzaCgpOworCXJldHVybiB2YWx1ZTsKK30KK3ByaXZhdGUgdm9pZCByZWhhc2goKSB7CisJSGFzaHRhYmxlT2ZUeXBlIG5ld0hhc2h0YWJsZSA9IG5ldyBIYXNodGFibGVPZlR5cGUoZWxlbWVudFNpemUgPCAxMDAgPyAxMDAgOiBlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCWNoYXJbXSBjdXJyZW50S2V5OworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCisJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCisJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKKwl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKKwl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7Cit9CitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCisJUmVmZXJlbmNlQmluZGluZyB0eXBlOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoKHR5cGUgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQorCQkJcyArPSB0eXBlLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL09iamVjdFZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTRhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RWZWN0b3IgeworCQorCXN0YXRpYyBpbnQgSU5JVElBTF9TSVpFID0gMTA7CisKKwlwdWJsaWMgaW50IHNpemU7CisJaW50IG1heFNpemU7CisJT2JqZWN0W10gZWxlbWVudHM7CisJCisJcHVibGljIE9iamVjdFZlY3RvcigpIHsKKworCQl0aGlzLm1heFNpemUgPSBJTklUSUFMX1NJWkU7CisJCXRoaXMuc2l6ZSA9IDA7CisJCXRoaXMuZWxlbWVudHMgPSBuZXcgT2JqZWN0W3RoaXMubWF4U2l6ZV07CisJfQorCisJcHVibGljIHZvaWQgYWRkKE9iamVjdCBuZXdFbGVtZW50KSB7CisKKwkJaWYgKHRoaXMuc2l6ZSA9PSB0aGlzLm1heFNpemUpIC8vIGtub3dzIHRoYXQgc2l6ZSBzdGFydHMgPD0gbWF4U2l6ZQorCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCAwLCAodGhpcy5lbGVtZW50cyA9IG5ldyBPYmplY3RbdGhpcy5tYXhTaXplICo9IDJdKSwgMCwgdGhpcy5zaXplKTsKKwkJdGhpcy5lbGVtZW50c1t0aGlzLnNpemUrK10gPSBuZXdFbGVtZW50OworCX0KKworCXB1YmxpYyB2b2lkIGFkZEFsbChPYmplY3RbXSBuZXdFbGVtZW50cykgeworCisJCWlmICh0aGlzLnNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGggPj0gdGhpcy5tYXhTaXplKSB7CisJCQltYXhTaXplID0gdGhpcy5zaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOyAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IE9iamVjdFt0aGlzLm1heFNpemVdKSwgMCwgdGhpcy5zaXplKTsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KG5ld0VsZW1lbnRzLCAwLCB0aGlzLmVsZW1lbnRzLCBzaXplLCBuZXdFbGVtZW50cy5sZW5ndGgpOworCQl0aGlzLnNpemUgKz0gbmV3RWxlbWVudHMubGVuZ3RoOworCX0KKworCXB1YmxpYyB2b2lkIGFkZEFsbChPYmplY3RWZWN0b3IgbmV3VmVjdG9yKSB7CisKKwkJaWYgKHRoaXMuc2l6ZSArIG5ld1ZlY3Rvci5zaXplID49IHRoaXMubWF4U2l6ZSkgeworCQkJbWF4U2l6ZSA9IHRoaXMuc2l6ZSArIG5ld1ZlY3Rvci5zaXplOyAvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IE9iamVjdFt0aGlzLm1heFNpemVdKSwgMCwgdGhpcy5zaXplKTsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1ZlY3Rvci5lbGVtZW50cywgMCwgdGhpcy5lbGVtZW50cywgc2l6ZSwgbmV3VmVjdG9yLnNpemUpOworCQl0aGlzLnNpemUgKz0gbmV3VmVjdG9yLnNpemU7CisJfQorCisJLyoqCisJICogSWRlbnRpdHkgY2hlY2sKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0lkZW50aWNhbChPYmplY3QgZWxlbWVudCkgeworCisJCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKKwkJCWlmIChlbGVtZW50ID09IHRoaXMuZWxlbWVudHNbaV0pCisJCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBFcXVhbGl0eSBjaGVjaworCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CisKKwkJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQkJaWYgKGVsZW1lbnQuZXF1YWxzKHRoaXMuZWxlbWVudHNbaV0pKQorCQkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgY29weUludG8oT2JqZWN0W10gdGFyZ2V0QXJyYXkpeworCQkKKwkJdGhpcy5jb3B5SW50byh0YXJnZXRBcnJheSwgMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGNvcHlJbnRvKE9iamVjdFtdIHRhcmdldEFycmF5LCBpbnQgaW5kZXgpeworCQkKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCAwLCB0YXJnZXRBcnJheSwgaW5kZXgsIHRoaXMuc2l6ZSk7CisJfQkKKwkKKwlwdWJsaWMgT2JqZWN0IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKKworCQlyZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07CisJfQorCisJcHVibGljIE9iamVjdCBmaW5kKE9iamVjdCBlbGVtZW50KSB7CisKKwkJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQkJaWYgKGVsZW1lbnQuZXF1YWxzKHRoaXMuZWxlbWVudHNbaV0pKQorCQkJCXJldHVybiBlbGVtZW50OworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3QgZWxlbWVudCkgeworCisJCS8vIGFzc3VtZXMgb25seSBvbmUgb2NjdXJyZW5jZSBvZiB0aGUgZWxlbWVudCBleGlzdHMKKwkJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQkJaWYgKGVsZW1lbnQuZXF1YWxzKHRoaXMuZWxlbWVudHNbaV0pKSB7CisJCQkJLy8gc2hpZnQgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBkb3duIG9uZSBzcG90CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCBpICsgMSwgdGhpcy5lbGVtZW50cywgaSwgLS10aGlzLnNpemUgLSBpKTsKKwkJCQl0aGlzLmVsZW1lbnRzW3RoaXMuc2l6ZV0gPSBudWxsOworCQkJCXJldHVybiBlbGVtZW50OworCQkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCQorCQlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCisJCQl0aGlzLmVsZW1lbnRzW2ldID0gbnVsbDsKKwkJdGhpcy5zaXplID0gMDsKKwl9CisKKwlwdWJsaWMgaW50IHNpemUoKXsKKwkJCisJCXJldHVybiB0aGlzLnNpemU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQorCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zaXplOyBpKyspCisJCQlzICs9IHRoaXMuZWxlbWVudHNbaV0udG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZU5hbWVWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZU5hbWVWZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQzYWViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTmFtZVZlY3Rvci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOworCitwdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlTmFtZVZlY3RvciB7CisJCisJc3RhdGljIGludCBJTklUSUFMX1NJWkUgPSAxMDsKKworCXB1YmxpYyBpbnQgc2l6ZTsKKwlpbnQgbWF4U2l6ZTsKKwljaGFyW11bXSBlbGVtZW50czsKKwkKKwlwdWJsaWMgU2ltcGxlTmFtZVZlY3RvcigpIHsKKwkJCisJCXRoaXMubWF4U2l6ZSA9IElOSVRJQUxfU0laRTsKKwkJdGhpcy5zaXplID0gMDsKKwkJdGhpcy5lbGVtZW50cyA9IG5ldyBjaGFyW3RoaXMubWF4U2l6ZV1bXTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkKGNoYXJbXSBuZXdFbGVtZW50KSB7CisJCQorCQlpZiAodGhpcy5zaXplID09IHRoaXMubWF4U2l6ZSkgLy8ga25vd3MgdGhhdCBzaXplIHN0YXJ0cyA8PSBtYXhTaXplCisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IGNoYXJbdGhpcy5tYXhTaXplICo9IDJdW10pLCAwLCB0aGlzLnNpemUpOworCQl0aGlzLmVsZW1lbnRzW3NpemUrK10gPSBuZXdFbGVtZW50OworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRBbGwoY2hhcltdW10gbmV3RWxlbWVudHMpIHsKKwkJCisJCWlmICh0aGlzLnNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGggPj0gdGhpcy5tYXhTaXplKSB7CisJCQl0aGlzLm1heFNpemUgPSB0aGlzLnNpemUgKyBuZXdFbGVtZW50cy5sZW5ndGg7IC8vIGFzc3VtZSBubyBtb3JlIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5lbGVtZW50cywgMCwgKHRoaXMuZWxlbWVudHMgPSBuZXcgY2hhclt0aGlzLm1heFNpemVdW10pLCAwLCB0aGlzLnNpemUpOworCQl9CisJCVN5c3RlbS5hcnJheWNvcHkobmV3RWxlbWVudHMsIDAsIHRoaXMuZWxlbWVudHMsIHRoaXMuc2l6ZSwgbmV3RWxlbWVudHMubGVuZ3RoKTsKKwkJdGhpcy5zaXplICs9IG5ld0VsZW1lbnRzLmxlbmd0aDsKKwl9CisJCisJcHVibGljIHZvaWQgY29weUludG8oT2JqZWN0W10gdGFyZ2V0QXJyYXkpeworCQkKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCAwLCB0YXJnZXRBcnJheSwgMCwgdGhpcy5zaXplKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGVsZW1lbnQpIHsKKwkJCisJCWZvciAoaW50IGkgPSB0aGlzLnNpemU7IC0taSA+PSAwOykKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbGVtZW50LCB0aGlzLmVsZW1lbnRzW2ldKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgY2hhcltdIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdOworCX0KKwkKKwlwdWJsaWMgY2hhcltdIHJlbW92ZShjaGFyW10gZWxlbWVudCkgeworCQkKKwkJLy8gYXNzdW1lcyBvbmx5IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBlbGVtZW50IGV4aXN0cworCQlmb3IgKGludCBpID0gdGhpcy5zaXplOyAtLWkgPj0gMDspCisJCQlpZiAoZWxlbWVudCA9PSB0aGlzLmVsZW1lbnRzW2ldKSB7CisJCQkJLy8gc2hpZnQgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBkb3duIG9uZSBzcG90CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCBpICsgMSwgdGhpcy5lbGVtZW50cywgaSwgLS10aGlzLnNpemUgLSBpKTsKKwkJCQl0aGlzLmVsZW1lbnRzW3RoaXMuc2l6ZV0gPSBudWxsOworCQkJCXJldHVybiBlbGVtZW50OworCQkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgeworCQkKKwkJZm9yIChpbnQgaSA9IHRoaXMuc2l6ZTsgLS1pID49IDA7KQorCQkJdGhpcy5lbGVtZW50c1tpXSA9IG51bGw7CisJCXRoaXMuc2l6ZSA9IDA7CisJfQorCQorCXB1YmxpYyBpbnQgc2l6ZSgpeworCQkKKwkJcmV0dXJuIHRoaXMuc2l6ZTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmVsZW1lbnRzW2ldKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDkwMDhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitwdWJsaWMgY2xhc3MgVXRpbCB7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgY2hhcltdIExJTkVfU0VQQVJBVE9SX0NIQVJTID0gTElORV9TRVBBUkFUT1IudG9DaGFyQXJyYXkoKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfY2xhc3MgPSAiLmNsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0NMQVNTID0gIi5DTEFTUyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9qYXZhID0gIi5qYXZhIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0pBVkEgPSAiLkpBVkEiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfamFyID0gIi5qYXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfSkFSID0gIi5KQVIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfemlwID0gIi56aXAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfWklQID0gIi5aSVAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRV9RVU9URVMgPSAiJyciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0lOR0xFX1FVT1RFID0gIiciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCS8qIEJ1bmRsZSBjb250YWluaW5nIG1lc3NhZ2VzICovCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPQorCQkib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJc3RhdGljIHsKKwkJcmVsb2NhbGl6ZSgpOworCX0KKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcxLCBTdHJpbmcgYmluZGluZzIpIHsKKwkJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcxLCBiaW5kaW5nMiB9KTsKKwl9CisJLyoqCisJICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKwkgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcpIHsKKwkJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcgfSk7CisJfQorCS8qKgorCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCisJICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmdbXSBiaW5kaW5ncykgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElmIHdlIGdvdCBhbiBleGNlcHRpb24gbG9va2luZyBmb3IgdGhlIG1lc3NhZ2UsIGZhaWwgZ3JhY2VmdWxseSBieSBqdXN0IHJldHVybmluZworCQkJLy8gdGhlIGlkIHdlIHdlcmUgbG9va2luZyBmb3IuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgc2VtaS1pbmZvcm1hdGl2ZSBzbyBpcyBub3QgdG9vIGJhZC4KKwkJCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgaWQgKyAiIGluOiAiICsgYnVuZGxlTmFtZTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNZXNzYWdlRm9ybWF0IHdoaWNoIGVsaW1pbmF0ZXMgZG91YmxlIHF1b3RlcyBpbiBvcmlnaW5hbCBtZXNzYWdlCisJCWNoYXJbXSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzID0KKwkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXNzYWdlLnRvQ2hhckFycmF5KCksIERPVUJMRV9RVU9URVMsIFNJTkdMRV9RVU9URSk7CisJCW1lc3NhZ2UgPSBuZXcgU3RyaW5nKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMpOworCisJCWlmIChiaW5kaW5ncyA9PSBudWxsKQorCQkJcmV0dXJuIG1lc3NhZ2U7CisKKwkJaW50IGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoKCk7CisJCWludCBzdGFydCA9IC0xOworCQlpbnQgZW5kID0gbGVuZ3RoOworCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7CisJCXdoaWxlICh0cnVlKSB7CisJCQlpZiAoKGVuZCA9IG1lc3NhZ2UuaW5kZXhPZigneycsIHN0YXJ0KSkgPiAtMSkgeworCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKKwkJCQlpZiAoKHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKCd9JywgZW5kKSkgPiAtMSkgeworCQkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCkpOworCQkJCQkJb3V0cHV0LmFwcGVuZChiaW5kaW5nc1tpbmRleF0pOworCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOworCQkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpICsgIn0iKTsJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGxlbmd0aCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCkgeworCQlyZXR1cm4gYmluZChpZCwgKFN0cmluZ1tdKSBudWxsKTsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvY2FsaXplKCkgeworCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGdpdmVuIGJ5dGVzIGFzIGEgY2hhciBhcnJheSB1c2luZyBhIGdpdmVuIGVuY29kaW5nIChudWxsIG1lYW5zIHBsYXRmb3JtIGRlZmF1bHQpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdIGJ5dGVzVG9DaGFyKGJ5dGVbXSBieXRlcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCXJldHVybiBnZXRJbnB1dFN0cmVhbUFzQ2hhckFycmF5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIGJ5dGVzLmxlbmd0aCwgZW5jb2RpbmcpOworCisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlIGFzIGEgYnl0ZSBhcnJheS4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cmVkIHJlYWRpbmcgdGhlIGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBieXRlW10gZ2V0RmlsZUJ5dGVDb250ZW50KEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworCQkJcmV0dXJuIGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAoaW50KSBmaWxlLmxlbmd0aCgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGZpbGUgYXMgYSBjaGFyIGFycmF5LgorCSAqIFdoZW4gZW5jb2RpbmcgaXMgbnVsbCwgdGhlbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCBvbmUgaXMgdXNlZAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VyZWQgcmVhZGluZyB0aGUgZmlsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRGaWxlQ2hhckNvbnRlbnQoRmlsZSBmaWxlLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKwkJCXJldHVybiBVdGlsLmdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoc3RyZWFtLCAoaW50KSBmaWxlLmxlbmd0aCgpLCBlbmNvZGluZyk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSdzIGNvbnRlbnRzIGFzIGEgYnl0ZSBhcnJheS4KKwkgKiBJZiBhIGxlbmd0aCBpcyBzcGVjaWZpZWQgKGllLiBpZiBsZW5ndGggIT0gLTEpLCBvbmx5IGxlbmd0aCBieXRlcworCSAqIGFyZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGFsbCBieXRlcyBpbiB0aGUgc3RyZWFtIGFyZSByZXR1cm5lZC4KKwkgKiBOb3RlIHRoaXMgZG9lc24ndCBjbG9zZSB0aGUgc3RyZWFtLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VyZWQgcmVhZGluZyB0aGUgc3RyZWFtLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoSW5wdXRTdHJlYW0gc3RyZWFtLCBpbnQgbGVuZ3RoKQorCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlieXRlW10gY29udGVudHM7CisJCWlmIChsZW5ndGggPT0gLTEpIHsKKwkJCWNvbnRlbnRzID0gbmV3IGJ5dGVbMF07CisJCQlpbnQgY29udGVudHNMZW5ndGggPSAwOworCQkJaW50IGJ5dGVzUmVhZCA9IC0xOworCQkJZG8geworCQkJCWludCBhdmFpbGFibGUgPSBzdHJlYW0uYXZhaWxhYmxlKCk7CisKKwkJCQkvLyByZXNpemUgY29udGVudHMgaWYgbmVlZGVkCisJCQkJaWYgKGNvbnRlbnRzTGVuZ3RoICsgYXZhaWxhYmxlID4gY29udGVudHMubGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQljb250ZW50cywKKwkJCQkJCTAsCisJCQkJCQljb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgYXZhaWxhYmxlXSwKKwkJCQkJCTAsCisJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJfQorCisJCQkJLy8gcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlCisJCQkJYnl0ZXNSZWFkID0gc3RyZWFtLnJlYWQoY29udGVudHMsIGNvbnRlbnRzTGVuZ3RoLCBhdmFpbGFibGUpOworCisJCQkJaWYgKGJ5dGVzUmVhZCA+IDApIHsKKwkJCQkJLy8gcmVtZW1iZXIgbGVuZ3RoIG9mIGNvbnRlbnRzCisJCQkJCWNvbnRlbnRzTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKwkJCQl9CisJCQl9IHdoaWxlIChieXRlc1JlYWQgPiAwKTsKKworCQkJLy8gcmVzaXplIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeQorCQkJaWYgKGNvbnRlbnRzTGVuZ3RoIDwgY29udGVudHMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJY29udGVudHMsCisJCQkJCTAsCisJCQkJCWNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGhdLAorCQkJCQkwLAorCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb250ZW50cyA9IG5ldyBieXRlW2xlbmd0aF07CisJCQlpbnQgbGVuID0gMDsKKwkJCWludCByZWFkU2l6ZSA9IDA7CisJCQl3aGlsZSAoKHJlYWRTaXplICE9IC0xKSAmJiAobGVuICE9IGxlbmd0aCkpIHsKKwkJCQkvLyBTZWUgUFIgMUZNUzg5VQorCQkJCS8vIFdlIHJlY29yZCBmaXJzdCB0aGUgcmVhZCBzaXplLiBJbiB0aGlzIGNhc2UgbGVuIGlzIHRoZSBhY3R1YWwgcmVhZCBzaXplLgorCQkJCWxlbiArPSByZWFkU2l6ZTsKKwkJCQlyZWFkU2l6ZSA9IHN0cmVhbS5yZWFkKGNvbnRlbnRzLCBsZW4sIGxlbmd0aCAtIGxlbik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29udGVudHM7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSdzIGNvbnRlbnRzIGFzIGEgY2hhcmFjdGVyIGFycmF5LgorCSAqIElmIGEgbGVuZ3RoIGlzIHNwZWNpZmllZCAoaWUuIGlmIGxlbmd0aCAhPSAtMSksIG9ubHkgbGVuZ3RoIGNoYXJzCisJICogYXJlIHJldHVybmVkLiBPdGhlcndpc2UgYWxsIGNoYXJzIGluIHRoZSBzdHJlYW0gYXJlIHJldHVybmVkLgorCSAqIE5vdGUgdGhpcyBkb2Vzbid0IGNsb3NlIHRoZSBzdHJlYW0uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJlZCByZWFkaW5nIHRoZSBzdHJlYW0uCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0SW5wdXRTdHJlYW1Bc0NoYXJBcnJheShJbnB1dFN0cmVhbSBzdHJlYW0sIGludCBsZW5ndGgsIFN0cmluZyBlbmNvZGluZykKKwkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbnVsbDsKKwkJcmVhZGVyID0gZW5jb2RpbmcgPT0gbnVsbAorCQkJCQk/IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pCisJCQkJCTogbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSwgZW5jb2RpbmcpOworCQljaGFyW10gY29udGVudHM7CisJCWlmIChsZW5ndGggPT0gLTEpIHsKKwkJCWNvbnRlbnRzID0gbmV3IGNoYXJbMF07CisJCQlpbnQgY29udGVudHNMZW5ndGggPSAwOworCQkJaW50IGNoYXJzUmVhZCA9IC0xOworCQkJZG8geworCQkJCWludCBhdmFpbGFibGUgPSBzdHJlYW0uYXZhaWxhYmxlKCk7CisKKwkJCQkvLyByZXNpemUgY29udGVudHMgaWYgbmVlZGVkCisJCQkJaWYgKGNvbnRlbnRzTGVuZ3RoICsgYXZhaWxhYmxlID4gY29udGVudHMubGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQljb250ZW50cywKKwkJCQkJCTAsCisJCQkJCQljb250ZW50cyA9IG5ldyBjaGFyW2NvbnRlbnRzTGVuZ3RoICsgYXZhaWxhYmxlXSwKKwkJCQkJCTAsCisJCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQkJfQorCisJCQkJLy8gcmVhZCBhcyBtYW55IGNoYXJzIGFzIHBvc3NpYmxlCisJCQkJY2hhcnNSZWFkID0gcmVhZGVyLnJlYWQoY29udGVudHMsIGNvbnRlbnRzTGVuZ3RoLCBhdmFpbGFibGUpOworCisJCQkJaWYgKGNoYXJzUmVhZCA+IDApIHsKKwkJCQkJLy8gcmVtZW1iZXIgbGVuZ3RoIG9mIGNvbnRlbnRzCisJCQkJCWNvbnRlbnRzTGVuZ3RoICs9IGNoYXJzUmVhZDsKKwkJCQl9CisJCQl9IHdoaWxlIChjaGFyc1JlYWQgPiAwKTsKKworCQkJLy8gcmVzaXplIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeQorCQkJaWYgKGNvbnRlbnRzTGVuZ3RoIDwgY29udGVudHMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJY29udGVudHMsCisJCQkJCTAsCisJCQkJCWNvbnRlbnRzID0gbmV3IGNoYXJbY29udGVudHNMZW5ndGhdLAorCQkJCQkwLAorCQkJCQljb250ZW50c0xlbmd0aCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb250ZW50cyA9IG5ldyBjaGFyW2xlbmd0aF07CisJCQlpbnQgbGVuID0gMDsKKwkJCWludCByZWFkU2l6ZSA9IDA7CisJCQl3aGlsZSAoKHJlYWRTaXplICE9IC0xKSAmJiAobGVuICE9IGxlbmd0aCkpIHsKKwkJCQkvLyBTZWUgUFIgMUZNUzg5VQorCQkJCS8vIFdlIHJlY29yZCBmaXJzdCB0aGUgcmVhZCBzaXplLiBJbiB0aGlzIGNhc2UgbGVuIGlzIHRoZSBhY3R1YWwgcmVhZCBzaXplLgorCQkJCWxlbiArPSByZWFkU2l6ZTsKKwkJCQlyZWFkU2l6ZSA9IHJlYWRlci5yZWFkKGNvbnRlbnRzLCBsZW4sIGxlbmd0aCAtIGxlbik7CisJCQl9CisJCQkvLyBTZWUgUFIgMUZNUzg5VQorCQkJLy8gTm93IHdlIG5lZWQgdG8gcmVzaXplIGluIGNhc2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBtb3JlIHRoYW4gb25lIGJ5dGUgZm9yIGVhY2gKKwkJCS8vIGNoYXJhY3RlcgorCQkJaWYgKGxlbiAhPSBsZW5ndGgpCisJCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50cywgMCwgKGNvbnRlbnRzID0gbmV3IGNoYXJbbGVuXSksIDAsIGxlbik7CisJCX0KKworCQlyZXR1cm4gY29udGVudHM7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiB6aXAgZW50cnkgYXMgYSBieXRlIGFycmF5LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VyZWQgcmVhZGluZyB0aGUgemlwIGVudHJ5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFppcEVudHJ5Qnl0ZUNvbnRlbnQoWmlwRW50cnkgemUsIFppcEZpbGUgemlwKQorCQl0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh6aXAuZ2V0SW5wdXRTdHJlYW0oemUpKTsKKwkJCXJldHVybiBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgKGludCkgemUuZ2V0U2l6ZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXN0cmVhbS5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmZiBzdHIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpIHx8IHN0ci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuemlwIikKKwkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY3JlYXRpbmcgZXh0cmEgc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGgoKTsKKwkJaW50IHN1ZmZpeExlbmd0aCA9IFNVRkZJWF9KQVIubGVuZ3RoOworCQlpZiAobmFtZUxlbmd0aCA8IHN1ZmZpeExlbmd0aCkgcmV0dXJuIGZhbHNlOworCisJCS8vIHRyeSB0byBtYXRjaCBhcyBKQVIgZmlsZQorCQlmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeExlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBuYW1lLmNoYXJBdChuYW1lTGVuZ3RoIC0gaSAtIDEpOworCQkJaW50IHN1ZmZpeEluZGV4ID0gc3VmZml4TGVuZ3RoIC0gaSAtIDE7CisJCQlpZiAoYyAhPSBTVUZGSVhfamFyW3N1ZmZpeEluZGV4XSAmJiBjICE9IFNVRkZJWF9KQVJbc3VmZml4SW5kZXhdKSB7CisKKwkJCQkvLyB0cnkgdG8gbWF0Y2ggYXMgWklQIGZpbGUKKwkJCQlzdWZmaXhMZW5ndGggPSBTVUZGSVhfWklQLmxlbmd0aDsKKwkJCQlpZiAobmFtZUxlbmd0aCA8IHN1ZmZpeExlbmd0aCkgcmV0dXJuIGZhbHNlOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VmZml4TGVuZ3RoOyBqKyspIHsKKwkJCQkJYyA9IG5hbWUuY2hhckF0KG5hbWVMZW5ndGggLSBqIC0gMSk7CisJCQkJCXN1ZmZpeEluZGV4ID0gc3VmZml4TGVuZ3RoIC0gaiAtIDE7CisJCQkJCWlmIChjICE9IFNVRkZJWF96aXBbc3VmZml4SW5kZXhdICYmIGMgIT0gU1VGRklYX1pJUFtzdWZmaXhJbmRleF0pIHJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CQkKKwl9CQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpCisJICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NGaWxlTmFtZShTdHJpbmcgbmFtZSkgeworCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmxlbmd0aCgpOworCQlpbnQgc3VmZml4TGVuZ3RoID0gU1VGRklYX0NMQVNTLmxlbmd0aDsKKwkJaWYgKG5hbWVMZW5ndGggPCBzdWZmaXhMZW5ndGgpIHJldHVybiBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeExlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBuYW1lLmNoYXJBdChuYW1lTGVuZ3RoIC0gaSAtIDEpOworCQkJaW50IHN1ZmZpeEluZGV4ID0gc3VmZml4TGVuZ3RoIC0gaSAtIDE7CisJCQlpZiAoYyAhPSBTVUZGSVhfY2xhc3Nbc3VmZml4SW5kZXhdICYmIGMgIT0gU1VGRklYX0NMQVNTW3N1ZmZpeEluZGV4XSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOwkJCisJfQkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWZmIHN0ci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpCisJICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzSmF2YUZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisJCWludCBuYW1lTGVuZ3RoID0gbmFtZSA9PSBudWxsID8gMCA6IG5hbWUubGVuZ3RoKCk7CisJCWludCBzdWZmaXhMZW5ndGggPSBTVUZGSVhfSkFWQS5sZW5ndGg7CisJCWlmIChuYW1lTGVuZ3RoIDwgc3VmZml4TGVuZ3RoKSByZXR1cm4gZmFsc2U7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhMZW5ndGg7IGkrKykgeworCQkJY2hhciBjID0gbmFtZS5jaGFyQXQobmFtZUxlbmd0aCAtIGkgLSAxKTsKKwkJCWludCBzdWZmaXhJbmRleCA9IHN1ZmZpeExlbmd0aCAtIGkgLSAxOworCQkJaWYgKGMgIT0gU1VGRklYX2phdmFbc3VmZml4SW5kZXhdICYmIGMgIT0gU1VGRklYX0pBVkFbc3VmZml4SW5kZXhdKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CQkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2ZGM5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OCBAQAorIyMjIEVjbGlwc2UgSmF2YSBDb3JlIENvbXBpbGVyIG1lc3NhZ2VzLgorCisjIyMgY29tcGlsYXRpb24KK2NvbXBpbGF0aW9uLnVucmVzb2x2ZWRQcm9ibGVtID0gVW5yZXNvbHZlZCBjb21waWxhdGlvbiBwcm9ibGVtOiBcbgorY29tcGlsYXRpb24udW5yZXNvbHZlZFByb2JsZW1zID0gVW5yZXNvbHZlZCBjb21waWxhdGlvbiBwcm9ibGVtczogXG4KK2NvbXBpbGF0aW9uLnJlcXVlc3QgPSByZXF1ZXN0IHswfS97MX0gOiB7Mn0KK2NvbXBpbGF0aW9uLnByb2Nlc3MgPSBwcm9jZXNzIHswfS97MX0gOiB7Mn0KK2NvbXBpbGF0aW9uLmRvbmUgPSBkb25lIHswfS97MX0gOiB7Mn0KK2NvbXBpbGF0aW9uLnVuaXRzID0gezB9IHVuaXRzIGNvbXBpbGVkCitjb21waWxhdGlvbi51bml0ID0gezB9IHVuaXQgY29tcGlsZWQKK2NvbXBpbGF0aW9uLmludGVybmFsRXJyb3IgPSBJbnRlcm5hbCBjb21waWxlciBlcnJvcgorCisjIyMgb3V0cHV0CitvdXRwdXQuaXNGaWxlID0gIFRoZSBvdXREaXIgaXMgYSBmaWxlIDogezB9CitvdXRwdXQuaXNGaWxlTm90RGlyZWN0b3J5ID0gVGhlIG91dERpciBpcyBhIGZpbGUgbm90IGEgZGlyZWN0b3J5Lgorb3V0cHV0LmRpck5hbWUgPSAgVGhlIG91dHB1dCBkaXIgbmFtZSBpcyA6IHswfQorb3V0cHV0Lm5vdFZhbGlkQWxsID0gIFRoZSBvdXREaXIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IG5hbWUuIEFsbCB0aGUgZGlyZWN0b3JpZXMgY2Fubm90IGJlIGNyZWF0ZWQuCitvdXRwdXQuZmlsZU5hbWUgPSAgZmlsZSBuYW1lIDogezB9CitvdXRwdXQubm90VmFsaWQgPSBUaGUgb3V0RGlyIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeSBuYW1lLiBUaGUgZGlyZWN0b3J5IGNhbm5vdCBiZSBjcmVhdGVkLgorCisjIyMgcHJvYmxlbQorcHJvYmxlbS5ub1NvdXJjZUluZm9ybWF0aW9uID0gXG4hISBubyBzb3VyY2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlICEhCitwcm9ibGVtLmF0TGluZSA9IChhdCBsaW5lIHswfSkKKworIyMjIGFib3J0CithYm9ydC5pbnZhbGlkQXR0cmlidXRlID0gU0FOSVRZIENIRUNLOiBJbnZhbGlkIGF0dHJpYnV0ZSBmb3IgbG9jYWwgdmFyaWFibGUgezB9CithYm9ydC5taXNzaW5nQ29kZSA9IE1pc3NpbmcgY29kZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY29tcGlsZXIKK2Fib3J0LmFnYWluc3RTb3VyY2VNb2RlbCA9IENhbm5vdCBjb21waWxlIGFnYWluc3Qgc291cmNlIG1vZGVsIHswfSBpc3N1ZWQgZnJvbSB7MX0KKworIyMjIGFjY2VwdAorYWNjZXB0LmNhbm5vdCA9IENhbm5vdCBhY2NlcHQgdGhlIGNvbXBpbGF0aW9uIHVuaXQ6IAorCisjIyMgcGFyc2VyCitwYXJzZXIuaW5jb3JyZWN0UGF0aCA9IFRoZSBwYXRoIGZvciB0aGUgamF2YWRjbC5qYXZhIGZpbGUgaXMgaW5jb3JyZWN0CitwYXJzZXIubW92ZUZpbGVzID0gTU9WRSBGSUxFUyBJTiBUSEUgUnVudGltZSBESVJFQ1RPUlkgT0YgUGFyc2VyLmNsYXNzCitwYXJzZXIuc3ludGF4UmVjb3ZlcnkgPSBTWU5UQVggUkVDT1ZFUlkKK3BhcnNlci5yZWd1bGFyUGFyc2UgPSBSRUdVTEFSIFBBUlNFCitwYXJzZXIubWlzc2luZ0ZpbGUgPSBtaXNzaW5nIGZpbGUgezB9CitwYXJzZXIuY29ycnVwdGVkRmlsZSA9IGNvcnJ1cHRlZCBmaWxlIHswfQorCisjIyMgYmluZGluZworYmluZGluZy5zdWJjbGFzcyA9IGFub255bW91cyBzdWJjbGFzcyBvZiB7MH0KK2JpbmRpbmcuaW1wbGVtZW50YXRpb24gPSBhbm9ueW1vdXMgaW1wbGVtZW50YXRpb24gb2YgezB9CisKKyMjIyBhc3QKK2FzdC5taXNzaW5nU3RhdGVtZW50ID0gTWlzc2luZyBzdGF0ZW1lbnQgY29kZSBnZW5lcmF0aW9uIGltcGxlbWVudGF0aW9uCithc3QudmFyaWFibGVTaG91bGRQcm92aWRlID0gQXNzaWdubWVudCB2YXJpYWJsZSBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgZmxvdyBhbmFseXNpcworYXN0LmNvbXBvdW5kUHJlU2hvdWxkUHJvdmlkZSA9IENvbXBvdW5kIHByZSBhc3NpZ25tZW50cyAgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGNvZGUgZ2VuZXJhdGlvbgorYXN0LmNvbXBvdW5kVmFyaWFibGVTaG91bGRQcm92aWRlID0gQ29tcG91bmQgYXNzaWdubWVudCB2YXJpYWJsZSAgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGNvZGUgZ2VuZXJhdGlvbgorYXN0LnBvc3RJbmNyU2hvdWxkUHJvdmlkZSA9IFBvc3QgaW5jcmVtZW50IHZhcmlhYmxlICBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgY29kZSBnZW5lcmF0aW9uCithc3QubWlzc2luZ0NvZGUgPSBNaXNzaW5nIGNvZGUgZ2VuIGltcGxlbWVudGF0aW9uCisKKyMjIyBjb25zdGFudAorY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byA9ICB7MH0gY29uc3RhbnQgY2Fubm90IGJlIGNhc3RlZCBpbnRvIHsxfQorY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8gPSB7MH0gY29uc3RhbnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB7MX0KKworIyMjIG1pc2NlbGxhbmVvdXMKK2Vycm9yLnVuZGVmaW5lZEJhc2VUeXBlID0gVW5kZWZpbmVkIGJhc2UgdHlwZTogezB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBhMjIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1QuamF2YQpAQCAtMCwwICsxLDE0NDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworCisvKioKKyAqIFVtYnJlbGxhIG93bmVyIGFuZCBhYnN0cmFjdCBzeW50YXggdHJlZSBub2RlIGZhY3RvcnkuCisgKiBBbiA8Y29kZT5BU1Q8L2NvZGU+IGluc3RhbmNlIHNlcnZlcyBhcyB0aGUgY29tbW9uIG93bmVyIG9mIGFueSBudW1iZXIgb2YKKyAqIEFTVCBub2RlcywgYW5kIGFzIHRoZSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgQVNUIG5vZGVzIG93bmVkIGJ5IHRoYXQgCisgKiBpbnN0YW5jZS4KKyAqIDxwPgorICogQWJzdHJhY3Qgc3ludGF4IHRyZWVzIG1heSBiZSBoYW5kIGNvbnN0cnVjdGVkIGJ5IGNsaWVudHMsIHVzaW5nIHRoZQorICogPGNvZGU+bmV3PGl0PlRZUEU8L2l0PjwvY29kZT4gZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZSBuZXcgbm9kZXMsIGFuZCB0aGUKKyAqIHZhcmlvdXMgPGNvZGU+c2V0PGl0PkNISUxEPC9pdD48L2NvZGU+IG1ldGhvZHMgCisgKiAoc2VlIDxjb2RlPkFTVE5vZGU8L2NvZGU+IGFuZCBpdHMgc3ViY2xhc3NlcykgdG8gY29ubmVjdCB0aGVtIHRvZ2V0aGVyLgorICogPC9wPgorICogPHA+CisgKiBFYWNoIEFTVCBub2RlIGJlbG9uZ3MgdG8gYSB1bmlxdWUgQVNUIGluc3RhbmNlLCBjYWxsZWQgdGhlIG93bmluZyBBU1QuCisgKiBUaGUgY2hpbGRyZW4gb2YgYW4gQVNUIG5vZGUgYWx3YXlzIGhhdmUgdGhlIHNhbWUgb3duZXIgYXMgdGhlaXIgcGFyZW50IG5vZGUuCisgKiBJZiBhIG5vZGUgZnJvbSBvbmUgQVNUIGlzIHRvIGJlIGFkZGVkIHRvIGEgZGlmZmVyZW50IEFTVCwgdGhlIHN1YnRyZWUgbXVzdAorICogYmUgY2xvbmVkIGZpcnN0IHRvIGVuc3VyZXMgdGhhdCB0aGUgYWRkZWQgbm9kZXMgaGF2ZSB0aGUgY29ycmVjdCBvd25pbmcgQVNULgorICogPC9wPgorICogPHA+CisgKiBUaGUgc3RhdGljIG1ldGhvZCA8Y29kZT5wYXJzZUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gcGFyc2VzIGEgc3RyaW5nCisgKiBjb250YWluaW5nIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IGFuZCByZXR1cm5zIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZQorICogZm9yIGl0LiBUaGUgcmVzdWx0aW5nIG5vZGVzIGNhcnJ5IHNvdXJjZSByYW5nZXMgcmVsYXRpbmcgdGhlIG5vZGUgYmFjayB0bworICogdGhlIG9yaWdpbmFsIHNvdXJjZSBjaGFyYWN0ZXJzLiBPcHRpb25hbCBuYW1lIGFuZCB0eXBlIHJlc29sdXRpb24gY2FuIGFsc28KKyAqIGJlIHJlcXVlc3RlZCBhdCB0aGUgdGltZSB0aGUgQVNUIGlzIGNyZWF0ZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIENsaWVudHMgbWF5IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcywgd2hpY2ggaXMgbm90IGludGVuZGVkIHRvIGJlCisgKiBzdWJjbGFzc2VkLgorICogPC9wPgorICogCisgKiBAc2VlICNwYXJzZUNvbXBpbGF0aW9uVW5pdAorICogQHNlZSBBU1ROb2RlCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBU1QgeworCQorCS8qKgorCSAqIEludGVybmFsIG1vZGlmaWNhdGlvbiBjb3VudDsgaW5pdGlhbGx5IDA7IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5CisJICogPGI+Ynkgb25lIG9yIG1vcmU8L2I+IGFzIHRoZSBBU1QgaXMgc3VjY2Vzc2l2ZWx5IG1vZGlmaWVkLgorCSAqLworCXByaXZhdGUgbG9uZyBtb2RDb3VudCA9IDA7CisJCisJLyoqCisJICogSmF2YSBTY2FubmVyIHVzZWQgdG8gdmFsaWRhdGUgcHJlY29uZGl0aW9ucyBmb3IgdGhlIGNyZWF0aW9uIG9mIHNwZWNpZmljIG5vZGVzCisJICogbGlrZSBDaGFyYWN0ZXJMaXRlcmFsLCBOdW1iZXJMaXRlcmFsLCBTdHJpbmdMaXRlcmFsIG9yIFNpbXBsZU5hbWUuCisJICovCisJU2Nhbm5lciBzY2FubmVyOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdXNpbmcgZGVmYXVsdCBvcHRpb25zLgorCSAqIAorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgQVNUKCkgeworCQl0aGlzKEphdmFDb3JlLmdldERlZmF1bHRPcHRpb25zKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGFic3RyYWN0IHN5bnRheCB0cmVlIHVzaW5nIHRoZSBnaXZlbiBvcHRpb25zLgorCSAqIDxwPgorCSAqIEZvbGxvd2luZyBvcHRpb24ga2V5cyBhcmUgc2lnbmlmaWNhbnQ6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIjwvY29kZT4gLSAKKwkgKiAgICBpbmRpY2F0ZXMgc291cmNlIGNvbXBhdGliaWxpdHkgbW9kZSAoYXMgcGVyIDxjb2RlPkphdmFDb3JlPC9jb2RlPik7CisJICogICAgPGNvZGU+IjEuMyI8L2NvZGU+IG1lYW5zIHRoZSBzb3VyY2UgY29kZSBpcyBhcyBwZXIgSkRLIDEuMzsKKwkgKiAgICA8Y29kZT4iMS40IjwvY29kZT4gbWVhbnMgdGhlIHNvdXJjZSBjb2RlIGlzIGFzIHBlciBKREsgMS40CisJICogICAgKDxjb2RlPmFzc2VydDwvY29kZT4gaXMgYSBrZXl3b3JkKTsKKwkgKiAgICBhZGRpdGlvbmFsIGxlZ2FsIHZhbHVlcyBtYXkgYmUgYWRkZWQgbGF0ZXIuIDwvbGk+CisJICogPC91bD4KKwkgKiBPcHRpb25zIG90aGVyIHRoYW4gdGhlIGFib3ZlIGFyZSBpZ25vcmVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gb3B0aW9ucyB0aGUgdGFibGUgb2Ygb3B0aW9ucyAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47CisJICogICAgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIEFTVChNYXAgb3B0aW9ucykgeworCQlPYmplY3QgdmFsdWUgPSBvcHRpb25zLmdldCgib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKCIxLjMiLmVxdWFscyh2YWx1ZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJLy8gdXNlIGEgMS4zIHNjYW5uZXIgLSB0cmVhdHMgYXNzZXJ0IGFzIGFuIGlkZW50aWZpZXIKKwkJCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKCk7CisJCX0gZWxzZSB7CisJCQkvLyB1c2UgYSAxLjQgc2Nhbm5lciAtIHRyZWF0cyBhc3NlcnQgYXMgYW4ga2V5d29yZAorCQkJdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCX0KKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCBmb3IgdGhpcyBBU1QuIFRoZSBtb2RpZmljYXRpb24gY291bnQKKwkgKiBpcyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSB0aGF0IGluY3JlYXNlcyAoYnkgMSBvciBwZXJoYXBzIGJ5IG1vcmUpIGFzCisJICogdGhpcyBBU1Qgb3IgaXRzIG5vZGVzIGFyZSBjaGFuZ2VkLiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIHRoaW5ncyBjb3VudCBhcyBtb2RpZnlpbmcgYW4gQVNUOgorCSAqIDx1bD4KKwkgKiA8bGk+Y3JlYXRpbmcgYSBuZXcgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgorCSAqIDxsaT5hZGRpbmcgYSBjaGlsZCB0byBhIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QsPC9saT4KKwkgKiA8bGk+cmVtb3ZpbmcgYSBjaGlsZCBmcm9tIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgorCSAqIDxsaT5zZXR0aW5nIGEgbm9uLW5vZGUgYXR0cmlidXRlIG9mIGEgbm9kZSBvd25lZCBieSB0aGlzIEFTVC48L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIE9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IGVudGFpbCBjcmVhdGluZyBvciBtb2RpZnlpbmcgZXhpc3Rpbmcgbm9kZXMKKwkgKiBkbyBub3QgaW5jcmVhc2UgdGhlIG1vZGlmaWNhdGlvbiBjb3VudC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBpbiB0aGUgY291cnNlCisJICogb2YgYSBzaW5nbGUgY2xpZW50IG9wZXJhdGlvbi4gVGhlIG9ubHkgcHJvbWlzZSBpcyB0aGF0IHRoZSBtb2RpZmljYXRpb24KKwkgKiBjb3VudCBpbmNyZWFzZXMgbW9ub3RvbmljYWxseSBhcyB0aGUgQVNUIG9yIGl0cyBub2RlcyBjaGFuZ2U7IHRoZXJlIGlzIAorCSAqIG5vIHByb21pc2UgdGhhdCBhIG1vZGlmeWluZyBvcGVyYXRpb24gaW5jcmVhc2VzIHRoZSBjb3VudCBieSBleGFjdGx5IDEuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgKG5vbi1uZWdhdGl2ZSkgb2YgdGhlIG1vZGlmaWNhdGlvbiBjb3VudGVyIG9mCisJICogICAgdGhpcyBBU1QKKwkgKi8KKwlwdWJsaWMgbG9uZyBtb2RpZmljYXRpb25Db3VudCgpIHsKKwkJcmV0dXJuIG1vZENvdW50OworCX0KKwkKKwkvKioKKwkgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIEFTVCBpcyBhYm91dCB0byBiZSBtb2RpZmllZC4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIHRoaW5ncyBjb3VudCBhcyBtb2RpZnlpbmcgYW4gQVNUOgorCSAqIDx1bD4KKwkgKiA8bGk+Y3JlYXRpbmcgYSBuZXcgbm9kZSBvd25lZCBieSB0aGlzIEFTVCw8L2xpPgorCSAqIDxsaT5hZGRpbmcgYSBjaGlsZCB0byBhIG5vZGUgb3duZWQgYnkgdGhpcyBBU1Q8L2xpPgorCSAqIDxsaT5yZW1vdmluZyBhIGNoaWxkIGZyb20gYSBub2RlIG93bmVkIGJ5IHRoaXMgQVNUPC9saT4KKwkgKiA8bGk+c2V0dGluZyBhIG5vbi1ub2RlIGF0dHJpYnV0ZSBvZiBhIG5vZGUgb3duZWQgYnkgdGhpcyBBU1Q8L2xpPi4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBpbiB0aGUgY291cnNlCisJICogb2YgYSBzaW5nbGUgY2xpZW50IG9wZXJhdGlvbi4KKwkgKiA8L3A+IAorCSAqLworCXZvaWQgbW9kaWZ5aW5nKCkgeworCQkvLyBpbmNyZWFzZSB0aGUgbW9kaWZpY2F0aW9uIGNvdW50CisJCW1vZENvdW50Kys7CQorCX0KKworCQorCS8qKgorCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0IGFuZCBjcmVhdGVzIGFuZCAKKwkgKiByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhYnN0cmFjdCBzeW50YXggdHJlZS4KKwkgKiA8cD4KKwkgKiBUaGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIGlzIHRoZSByb290IG5vZGUgb2YgYSBuZXcgQVNULgorCSAqIEVhY2ggbm9kZSBpbiB0aGUgc3VidHJlZSBjYXJyaWVzIHNvdXJjZSByYW5nZShzKSBpbmZvcm1hdGlvbiByZWxhdGluZyBiYWNrCisJICogdG8gcG9zaXRpb25zIGluIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nICh0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBpdHNlbGYKKwkgKiBpcyBub3QgcmVtZW1iZXJlZCB3aXRoIHRoZSBBU1QpLiBJZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZCB3aGlsZQorCSAqIHBhcnNpbmcsIHRoZSByZWxldmFudCBub2RlKHMpIG9mIHRoZSB0cmVlIHdpbGwgYmUgZmxhZ2dlZCBhcyAKKwkgKiA8Y29kZT5NQUxGT1JNRUQ8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBJZiA8Y29kZT5yZXNvbHZlQmluZGluZ3M8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdmFyaW91cyBuYW1lcworCSAqIGFuZCB0eXBlcyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIHJlc29sdmVkIHRvICJiaW5kaW5ncyIKKwkgKiBieSBjYWxsaW5nIHRoZSA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcy4gVGhlc2UgYmluZGluZ3MgCisJICogZHJhdyBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBhbmQgCisJICogZ2VuZXJhbGx5IGFmZm9yZCBhIG1vcmUgcG93ZXJmdWwgdmFudGFnZSBwb2ludCBmb3IgY2xpZW50cyB3aG8gd2lzaCB0bworCSAqIGFuYWx5emUgYSBwcm9ncmFtJ3Mgc3RydWN0dXJlIG1vcmUgZGVlcGx5LiBUaGVzZSBiaW5kaW5ncyBjb21lIGF0IGEgCisJICogY29uc2lkZXJhYmxlIGNvc3QgaW4gYm90aCB0aW1lIGFuZCBzcGFjZSwgaG93ZXZlciwgYW5kIHNob3VsZCBub3QgYmUKKwkgKiByZXF1ZXN0ZWQgZnJpdm9sb3VzbHkuIFRoZSBhZGRpdGlvbmFsIHNwYWNlIGlzIG5vdCByZWNsYWltZWQgdW50aWwgdGhlIAorCSAqIEFTVCwgYWxsIGl0cyBub2RlcywgYW5kIGFsbCBpdHMgYmluZGluZ3MgYmVjb21lIGdhcmJhZ2UuIFNvIGl0IGlzIHZlcnkKKwkgKiBpbXBvcnRhbnQgdG8gbm90IHJldGFpbiBhbnkgb2YgdGhlc2Ugb2JqZWN0cyBsb25nZXIgdGhhbiBhYnNvbHV0ZWx5CisJICogbmVjZXNzYXJ5LiBOb3RlIHRoYXQgYmluZGluZ3MgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgd2hpbGUgdGhlIEFTVCByZW1haW5zCisJICogaW4gaXRzIG9yaWdpbmFsIHVubW9kaWZpZWQgc3RhdGUuIE9uY2UgdGhlIEFTVCBpcyBtb2RpZmllZCwgYWxsIAorCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBJZiA8Y29kZT5yZXNvbHZlQmluZGluZ3M8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGFuYWx5c2lzIAorCSAqIGRvZXMgbm90IGdvIGJleW9uZCBwYXJzaW5nIGFuZCBidWlsZGluZyB0aGUgdHJlZSwgYW5kIGFsbCAKKwkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSB0aGUgCisJICogb3V0c2V0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdW5pdCB0aGUgSmF2YSBtb2RlbCBjb21waWxhdGlvbiB1bml0IHdob3NlIHNvdXJjZSBjb2RlIGlzIHRvIGJlIHBhcnNlZAorCSAqIEBwYXJhbSByZXNvbHZlQmluZGluZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIHdhbnRlZCwgCisJICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGJpbmRpbmdzIGFyZSBub3Qgb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IG5vZGUKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0RmxhZ3MoKQorCSAqIEBzZWUgQVNUTm9kZSNNQUxGT1JNRUQKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0U3RhcnRQb3NpdGlvbigpCisJICogQHNlZSBBU1ROb2RlI2dldExlbmd0aCgpCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoCisJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQsCisJCQlib29sZWFuIHJlc29sdmVCaW5kaW5ncykgeworCQkJCQorCQlpZiAodW5pdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJCisJCWNoYXJbXSBzb3VyY2UgPSBudWxsOworCQl0cnkgeworCQkJc291cmNlID0gdW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOworCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBubyBzb3VyY2UsIHRoZW4gd2UgY2Fubm90IGJ1aWxkIGFueXRoaW5nCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKworCQlpZiAocmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0cnkgeworCQkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uID0gQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucmVzb2x2ZSgKKwkJCQkJdW5pdCwKKwkJCQkJbmV3IEFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyKCkpOworCQkJCUFTVENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQVNUQ29udmVydGVyKHRydWUpOworCQkJCUFTVCBhc3QgPSBuZXcgQVNUKCk7CisJCQkJQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uc2NvcGUpOworCQkJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIocmVzb2x2ZXIpOworCQkJCWNvbnZlcnRlci5zZXRBU1QoYXN0KTsKKwkJCQorCQkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNvbnZlcnRlci5jb252ZXJ0KGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCBzb3VyY2UpOworCQkJCWN1LnNldExpbmVFbmRUYWJsZShjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsKKwkJCQlyZXNvbHZlci5zdG9yZU1vZGlmaWNhdGlvbkNvdW50KGFzdC5tb2RpZmljYXRpb25Db3VudCgpKTsKKwkJCQlyZXR1cm4gY3U7CisJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLyogaWYgYSBKYXZhTW9kZWxFeGNlcHRpb24gaXMgdGhyb3duIHRyeWluZyB0byByZXRyaWV2ZSB0aGUgbmFtZSBlbnZpcm9ubWVudAorCQkJCSAqIHRoZW4gd2Ugc2ltcGx5IGRvIGEgcGFyc2luZyB3aXRob3V0IGNyZWF0aW5nIGJpbmRpbmdzLgorCQkJCSAqIFRoZXJlZm9yZSBhbGwgYmluZGluZyByZXNvbHV0aW9uIHdpbGwgcmV0dXJuIG51bGwuCisJCQkJICovCisJCQkJcmV0dXJuIHBhcnNlQ29tcGlsYXRpb25Vbml0KHNvdXJjZSk7CQkJCisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcGFyc2VDb21waWxhdGlvblVuaXQoc291cmNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIHRoZSBoeXBvdGhldGljYWwgY29udGVudHMgb2YgdGhlIG5hbWVkCisJICogY29tcGlsYXRpb24gdW5pdCBhbmQgY3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3Qgc3ludGF4IHRyZWUuCisJICogPHA+CisJICogVGhlIHJldHVybmVkIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSBpcyB0aGUgcm9vdCBub2RlIG9mIGEgbmV3IEFTVC4KKwkgKiBFYWNoIG5vZGUgaW4gdGhlIHN1YnRyZWUgY2FycmllcyBzb3VyY2UgcmFuZ2UocykgaW5mb3JtYXRpb24gcmVsYXRpbmcgYmFjaworCSAqIHRvIHBvc2l0aW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyAodGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgaXRzZWxmCisJICogaXMgbm90IHJlbWVtYmVyZWQgd2l0aCB0aGUgQVNUKS4gSWYgYSBzeW50YXggZXJyb3IgaXMgZGV0ZWN0ZWQgd2hpbGUKKwkgKiBwYXJzaW5nLCB0aGUgcmVsZXZhbnQgbm9kZShzKSBvZiB0aGUgdHJlZSB3aWxsIGJlIGZsYWdnZWQgYXMgCisJICogPGNvZGU+TUFMRk9STUVEPC9jb2RlPi4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYgdGhlIGdpdmVuIHByb2plY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgdmFyaW91cyBuYW1lcworCSAqIGFuZCB0eXBlcyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIHJlc29sdmVkIHRvICJiaW5kaW5ncyIKKwkgKiBieSBjYWxsaW5nIHRoZSA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcy4gVGhlc2UgYmluZGluZ3MgCisJICogZHJhdyBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBhbmQgCisJICogZ2VuZXJhbGx5IGFmZm9yZCBhIG1vcmUgcG93ZXJmdWwgdmFudGFnZSBwb2ludCBmb3IgY2xpZW50cyB3aG8gd2lzaCB0bworCSAqIGFuYWx5emUgYSBwcm9ncmFtJ3Mgc3RydWN0dXJlIG1vcmUgZGVlcGx5LiBUaGVzZSBiaW5kaW5ncyBjb21lIGF0IGEgCisJICogY29uc2lkZXJhYmxlIGNvc3QgaW4gYm90aCB0aW1lIGFuZCBzcGFjZSwgaG93ZXZlciwgYW5kIHNob3VsZCBub3QgYmUKKwkgKiByZXF1ZXN0ZWQgZnJpdm9sb3VzbHkuIFRoZSBhZGRpdGlvbmFsIHNwYWNlIGlzIG5vdCByZWNsYWltZWQgdW50aWwgdGhlIAorCSAqIEFTVCwgYWxsIGl0cyBub2RlcywgYW5kIGFsbCBpdHMgYmluZGluZ3MgYmVjb21lIGdhcmJhZ2UuIFNvIGl0IGlzIHZlcnkKKwkgKiBpbXBvcnRhbnQgdG8gbm90IHJldGFpbiBhbnkgb2YgdGhlc2Ugb2JqZWN0cyBsb25nZXIgdGhhbiBhYnNvbHV0ZWx5CisJICogbmVjZXNzYXJ5LiBOb3RlIHRoYXQgYmluZGluZ3MgY2FuIG9ubHkgYmUgcmVzb2x2ZWQgd2hpbGUgdGhlIEFTVCByZW1haW5zCisJICogaW4gaXRzIG9yaWdpbmFsIHVubW9kaWZpZWQgc3RhdGUuIE9uY2UgdGhlIEFTVCBpcyBtb2RpZmllZCwgYWxsIAorCSAqIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBJZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGFuYWx5c2lzIAorCSAqIGRvZXMgbm90IGdvIGJleW9uZCBwYXJzaW5nIGFuZCBidWlsZGluZyB0aGUgdHJlZSwgYW5kIGFsbCAKKwkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSB0aGUgCisJICogb3V0c2V0LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBtdXN0IGJlIHN1cHBsaWVkIGZvciByZXNvbHZpbmcgYmluZGluZ3MuCisJICogVGhpcyBuYW1lIHNob3VsZCBpbmNsdWRlIHRoZSAiLmphdmEiIHN1ZmZpeCBhbmQgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG1haW4KKwkgKiAocHVibGljKSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzb3VyY2UKKwkgKiBkZWNsYXJlcyBhIHB1YmxpYyBjbGFzcyBuYW1lZCAiRm9vIiwgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHNob3VsZCBiZQorCSAqICJGb28uamF2YSIuIEZvciB0aGUgcHVycG9zZXMgb2YgcmVzb2x2aW5nIGJpbmRpbmdzLCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUKKwkgKiBzb3VyY2Ugc3RyaW5nIGhpZGUgdHlwZXMgYnkgdGhlIHNhbWUgbmFtZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgY2xhc3NwYXRoCisJICogb2YgdGhlIGdpdmVuIHByb2plY3QuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBiZSBwYXJzZWQgYXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBAcGFyYW0gdW5pdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3b3VsZCBjb250YWluIHRoZSBzb3VyY2UKKwkgKiAgICBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPiBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIHByb2plY3QgdGhlIEphdmEgcHJvamVjdCB1c2VkIHRvIHJlc29sdmUgbmFtZXMsIG9yIAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIGJpbmRpbmdzIGFyZSBub3QgcmVzb2x2ZWQKKwkgKiBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IG5vZGUKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0RmxhZ3MoKQorCSAqIEBzZWUgQVNUTm9kZSNNQUxGT1JNRUQKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0U3RhcnRQb3NpdGlvbigpCisJICogQHNlZSBBU1ROb2RlI2dldExlbmd0aCgpCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoCisJCWNoYXJbXSBzb3VyY2UsCisJCVN0cmluZyB1bml0TmFtZSwKKwkJSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJCQorCQlpZiAoc291cmNlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAodW5pdE5hbWUgPT0gbnVsbCAmJiBwcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQkvLyB0aGlzIGp1c3QgcmV1Y2VzIHRvIHRoZSBvdGhlciBzaW1wbGVzdCBjYXNlCisJCQlyZXR1cm4gcGFyc2VDb21waWxhdGlvblVuaXQoc291cmNlKTsKKwkJfQorCQorCQl0cnkgeworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPQorCQkJCUNvbXBpbGF0aW9uVW5pdFJlc29sdmVyLnJlc29sdmUoCisJCQkJCXNvdXJjZSwKKwkJCQkJdW5pdE5hbWUsCisJCQkJCXByb2plY3QsCisJCQkJCW5ldyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlcigpKTsKKwkJCUFTVENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQVNUQ29udmVydGVyKHRydWUpOworCQkJQVNUIGFzdCA9IG5ldyBBU1QoKTsKKwkJCUJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG5ldyBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNjb3BlKTsKKwkJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIocmVzb2x2ZXIpOworCQkJY29udmVydGVyLnNldEFTVChhc3QpOworCQkKKwkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNvbnZlcnRlci5jb252ZXJ0KGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLCBzb3VyY2UpOworCQkJY3Uuc2V0TGluZUVuZFRhYmxlKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmNvbXBpbGF0aW9uUmVzdWx0LmxpbmVTZXBhcmF0b3JQb3NpdGlvbnMpOworCQkJcmVzb2x2ZXIuc3RvcmVNb2RpZmljYXRpb25Db3VudChhc3QubW9kaWZpY2F0aW9uQ291bnQoKSk7CisJCQlyZXR1cm4gY3U7CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCS8qIGlmIGEgSmF2YU1vZGVsRXhjZXB0aW9uIGlzIHRocm93biB0cnlpbmcgdG8gcmV0cmlldmUgdGhlIG5hbWUgZW52aXJvbm1lbnQKKwkJCSAqIHRoZW4gd2Ugc2ltcGx5IGRvIGEgcGFyc2luZyB3aXRob3V0IGNyZWF0aW5nIGJpbmRpbmdzLgorCQkJICogVGhlcmVmb3JlIGFsbCBiaW5kaW5nIHJlc29sdXRpb24gd2lsbCByZXR1cm4gbnVsbC4KKwkJCSAqLworCQkJcmV0dXJuIHBhcnNlQ29tcGlsYXRpb25Vbml0KHNvdXJjZSk7CQkJCisJCX0KKwl9CisJICAJCisJLyoqCisJICogUGFyc2VzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNyZWF0ZXMgYW5kIAorCSAqIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFic3RyYWN0IHN5bnRheCB0cmVlLgorCSAqIDxwPgorCSAqIFRoZSByZXR1cm5lZCBjb21waWxhdGlvbiB1bml0IG5vZGUgaXMgdGhlIHJvb3Qgbm9kZSBvZiBhIG5ldyBBU1QuCisJICogRWFjaCBub2RlIGluIHRoZSBzdWJ0cmVlIGNhcnJpZXMgc291cmNlIHJhbmdlKHMpIGluZm9ybWF0aW9uIHJlbGF0aW5nIGJhY2sKKwkgKiB0byBwb3NpdGlvbnMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgKHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGl0c2VsZgorCSAqIGlzIG5vdCByZW1lbWJlcmVkIHdpdGggdGhlIEFTVCkuIElmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkIHdoaWxlCisJICogcGFyc2luZywgdGhlIHJlbGV2YW50IG5vZGUocykgb2YgdGhlIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIAorCSAqIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBiZSBwYXJzZWQgYXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0RmxhZ3MoKQorCSAqIEBzZWUgQVNUTm9kZSNNQUxGT1JNRUQKKwkgKiBAc2VlIEFTVE5vZGUjZ2V0U3RhcnRQb3NpdGlvbigpCisJICogQHNlZSBBU1ROb2RlI2dldExlbmd0aCgpCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoY2hhcltdIHNvdXJjZSkgeworCQlpZiAoc291cmNlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IAorCQkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucGFyc2Uoc291cmNlKTsKKworCQlBU1RDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEFTVENvbnZlcnRlcihmYWxzZSk7CisJCUFTVCBhc3QgPSBuZXcgQVNUKCk7CisJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIobmV3IEJpbmRpbmdSZXNvbHZlcigpKTsKKwkJY29udmVydGVyLnNldEFTVChhc3QpOworCQkJCQorCQlDb21waWxhdGlvblVuaXQgY3UgPSBjb252ZXJ0ZXIuY29udmVydChjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwgc291cmNlKTsKKwkJCisJCS8vIGxpbmUgZW5kIHRhYmxlIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSBzY2FubmVyCisJCWN1LnNldExpbmVFbmRUYWJsZShjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zKTsKKwkJcmV0dXJuIGN1OworCX0KKworCS8qKgorCSAqIFRoZSBiaW5kaW5nIHJlc29sdmVyIGZvciB0aGlzIEFTVC4gSW5pdGlhbGx5IGEgYmluZGluZyByZXNvbHZlciB0aGF0CisJICogZG9lcyBub3QgcmVzb2x2ZSBuYW1lcyBhdCBhbGwuCisJICovCisJcHJpdmF0ZSBCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgQmluZGluZ1Jlc29sdmVyKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QuCisJICogCisJICogQHJldHVybiB0aGUgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QKKwkgKi8KKwlCaW5kaW5nUmVzb2x2ZXIgZ2V0QmluZGluZ1Jlc29sdmVyKCkgeworCQlyZXR1cm4gcmVzb2x2ZXI7CisJfQorCisJLyoqIAorCSAqIFJldHVybnMgdGhlIHR5cGUgYmluZGluZyBmb3IgYSAid2VsbCBrbm93biIgdHlwZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIHR5cGUgbmFtZXMgYXJlIHN1cHBvcnRlZDoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPiJib29sZWFuIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iY2hhciI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImJ5dGUiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJzaG9ydCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImludCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImxvbmciPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJmbG9hdCI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImRvdWJsZSI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+InZvaWQiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuVGhyb3dhYmxlIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkV4Y2VwdGlvbiI8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkVycm9yIjwvY29kZT48L2xpPgorCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLkNsYXNzIjwvY29kZT48L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgd2VsbCBrbm93biB0eXBlCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSAKKwkgKiAgIG5hbWVkIHR5cGUgaXMgbm90IGNvbnNpZGVyZWQgd2VsbCBrbm93biBvciBpZiBubyBiaW5kaW5nIGNhbiBiZSBmb3VuZAorCSAqICAgZm9yIGl0CisJICovCisJcHVibGljIElUeXBlQmluZGluZyByZXNvbHZlV2VsbEtub3duVHlwZShTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIGdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVXZWxsS25vd25UeXBlKG5hbWUpOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QuCisJICogCisJICogQHBhcmFtIHJlc29sdmVyIHRoZSBuZXcgYmluZGluZyByZXNvbHZlciBmb3IgdGhpcyBBU1QKKwkgKi8KKwl2b2lkIHNldEJpbmRpbmdSZXNvbHZlcihCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKwkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE5BTUVTID09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBzaW1wbGUgbmFtZSBub2RlIGZvciB0aGUgZ2l2ZW4KKwkgKiBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQgYmUgYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIsIGJ1dCBub3QKKwkgKiBhIGtleXdvcmQsIGJvb2xlYW4gbGl0ZXJhbCAoInRydWUiLCAiZmFsc2UiKSBvciBudWxsIGxpdGVyYWwgKCJudWxsIikuCisJICogCisJICogQHBhcmFtIGlkZW50aWZpZXIgdGhlIGlkZW50aWZpZXIKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc2ltcGxlIG5hbWUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpZGVudGlmaWVyIGlzIGludmFsaWQKKwkgKi8KKwlwdWJsaWMgU2ltcGxlTmFtZSBuZXdTaW1wbGVOYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7CisJCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlTaW1wbGVOYW1lIHJlc3VsdCA9IG5ldyBTaW1wbGVOYW1lKHRoaXMpOworCQlyZXN1bHQuc2V0SWRlbnRpZmllcihpZGVudGlmaWVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHF1YWxpZmllZCBuYW1lIG5vZGUgZm9yIHRoZSBnaXZlbiAKKwkgKiBxdWFsaWZpZXIgYW5kIHNpbXBsZSBuYW1lIGNoaWxkIG5vZGUuCisJICogCisJICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZQorCSAqIEBwYXJhbSBuYW1lIHRoZSBzaW1wbGUgbmFtZSBiZWluZyBxdWFsaWZpZWQKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcXVhbGlmaWVkIG5hbWUgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgUXVhbGlmaWVkTmFtZSBuZXdRdWFsaWZpZWROYW1lKAorCQlOYW1lIHF1YWxpZmllciwKKwkJU2ltcGxlTmFtZSBuYW1lKSB7CisJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZE5hbWUodGhpcyk7CisJCXJlc3VsdC5zZXRRdWFsaWZpZXIocXVhbGlmaWVyKTsKKwkJcmVzdWx0LnNldE5hbWUobmFtZSk7CisJCXJldHVybiByZXN1bHQ7CisJCQorCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbmFtZSBub2RlIGZvciB0aGUgZ2l2ZW4gbmFtZSAKKwkgKiBzZWdtZW50cy4gUmV0dXJucyBhIHNpbXBsZSBuYW1lIGlmIHRoZXJlIGlzIG9ubHkgb25lIG5hbWUgc2VnbWVudCwgYW5kCisJICogYSBxdWFsaWZpZWQgbmFtZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbmFtZSBzZWdtZW50cy4gRWFjaCBvZiB0aGUgbmFtZQorCSAqIHNlZ21lbnRzIHNob3VsZCBiZSBsZWdhbCBKYXZhIGlkZW50aWZpZXJzICh0aGlzIGNvbnN0cmFpbnQgbWF5IG9yIG1heSAKKwkgKiBub3QgYmUgZW5mb3JjZWQpLCBhbmQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbmFtZSBzZWdtZW50LgorCSAqIAorCSAqIEBwYXJhbSBpZGVudGlmaWVycyBhIGxpc3Qgb2YgMSBvciBtb3JlIG5hbWUgc2VnbWVudHMsIGVhY2ggb2Ygd2hpY2gKKwkgKiAgICBpcyBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBuYW1lIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBpZGVudGlmaWVyIGlzIGludmFsaWQ8L2xpPgorCSAqIDxsaT50aGUgbGlzdCBvZiBpZGVudGlmaWVycyBpcyBlbXB0eTwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgTmFtZSBuZXdOYW1lKFN0cmluZ1tdIGlkZW50aWZpZXJzKSB7CisJCWludCBjb3VudCA9IGlkZW50aWZpZXJzLmxlbmd0aDsKKwkJaWYgKGNvdW50ID09IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlOYW1lIHJlc3VsdCA9IG5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcnNbMF0pOworCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKKwkJCVNpbXBsZU5hbWUgbmFtZSA9IG5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcnNbaV0pOworCQkJcmVzdWx0ID0gbmV3UXVhbGlmaWVkTmFtZShyZXN1bHQsIG5hbWUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRZUEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBzaW1wbGUgdHlwZSBub2RlIHdpdGggdGhlIGdpdmVuCisJICogdHlwZSBuYW1lLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSBuYW1lICg8Y29kZT5OYW1lPC9jb2RlPikgaW50byBhCisJICogdHlwZSAoPGNvZGU+VHlwZTwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBzaW1wbGUgdHlwZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBTaW1wbGVUeXBlIG5ld1NpbXBsZVR5cGUoTmFtZSB0eXBlTmFtZSkgeworCQlTaW1wbGVUeXBlIHJlc3VsdCA9IG5ldyBTaW1wbGVUeXBlKHRoaXMpOworCQlyZXN1bHQuc2V0TmFtZSh0eXBlTmFtZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IHR5cGUgbm9kZSB3aXRoIHRoZSBnaXZlbgorCSAqIGNvbXBvbmVudCB0eXBlLCB3aGljaCBtYXkgYmUgYW5vdGhlciBhcnJheSB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlIHRoZSBjb21wb25lbnQgdHlwZSAocG9zc2libHkgYW5vdGhlciBhcnJheSB0eXBlKQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSB0eXBlIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIEFycmF5VHlwZSBuZXdBcnJheVR5cGUoVHlwZSBjb21wb25lbnRUeXBlKSB7CisJCUFycmF5VHlwZSByZXN1bHQgPSBuZXcgQXJyYXlUeXBlKHRoaXMpOworCQlyZXN1bHQuc2V0Q29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgdHlwZSBub2RlIHdpdGggdGhlIGdpdmVuCisJICogZWxlbWVudCB0eXBlIGFuZCBudW1iZXIgb2YgZGltZW5zaW9ucy4gCisJICogPHA+CisJICogTm90ZSB0aGF0IGlmIHRoZSBlbGVtZW50IHR5cGUgcGFzc2VkIGluIGlzIGFuIGFycmF5IHR5cGUsIHRoZQorCSAqIGVsZW1lbnQgdHlwZSBvZiB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHdoYXQgd2FzIHBhc3NlZCBpbi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGVsZW1lbnRUeXBlIHRoZSBlbGVtZW50IHR5cGUgKG5ldmVyIGFuIGFycmF5IHR5cGUpCisJICogQHBhcmFtIGRpbWVuc2lvbnMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLCBhIHBvc2l0aXZlIG51bWJlcgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSB0eXBlIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIEFycmF5VHlwZSBuZXdBcnJheVR5cGUoVHlwZSBlbGVtZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpIHsKKwkJaWYgKGVsZW1lbnRUeXBlID09IG51bGwgfHwgZWxlbWVudFR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWlmIChkaW1lbnNpb25zIDwgMSB8fCBkaW1lbnNpb25zID4gMTAwMCkgeworCQkJLy8gd2Ugd291bGQgYmxvdyBvdXIgc3RhY2tzIGFueXdheSB3aXRoIGEgMTAwMC1EIGFycmF5CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJQXJyYXlUeXBlIHJlc3VsdCA9IG5ldyBBcnJheVR5cGUodGhpcyk7CisJCXJlc3VsdC5zZXRDb21wb25lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKwkJZm9yIChpbnQgaSA9IDI7IGkgPD0gZGltZW5zaW9uczsgaSsrKSB7CisJCQlyZXN1bHQgPSBuZXdBcnJheVR5cGUocmVzdWx0KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCQkKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcHJpbWl0aXZlIHR5cGUgbm9kZSB3aXRoIHRoZSBnaXZlbgorCSAqIHR5cGUgY29kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZUNvZGUgb25lIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvbnN0YW50cyBkZWNsYXJlZCBpbiAKKwkgKiAgICA8Y29kZT5QcmltaXRpdmVUeXBlPC9jb2RlPgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwcmltaXRpdmUgdHlwZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByaW1pdGl2ZSB0eXBlIGNvZGUgaXMgaW52YWxpZAorCSAqLworCXB1YmxpYyBQcmltaXRpdmVUeXBlIG5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5Db2RlIHR5cGVDb2RlKSB7CisJCVByaW1pdGl2ZVR5cGUgcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVR5cGUodGhpcyk7CisJCXJlc3VsdC5zZXRQcmltaXRpdmVUeXBlQ29kZSh0eXBlQ29kZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERFQ0xBUkFUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IGluaXRpYWxseSBoYXMgbm8gcGFja2FnZSBkZWNsYXJhdGlvbiwgbm8KKwkgKiBpbXBvcnQgZGVjbGFyYXRpb25zLCBhbmQgbm8gdHlwZSBkZWNsYXJhdGlvbnMuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBuZXcgY29tcGlsYXRpb24gdW5pdCBpcyA8Yj5ub3Q8L2I+IGF1dG9tYXRpY2FsbHkKKwkgKiBtYWRlIHRoZSByb290IG5vZGUgb2YgdGhpcyBBU1QuIFRoaXMgbXVzdCBiZSBkb25lIGV4cGxpY2l0bHkKKwkgKiBieSBjYWxsaW5nIDxjb2RlPnNldFJvb3Q8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdW5wYXJlbnRlZCBjb21waWxhdGlvbiB1bml0IG5vZGUKKwkgKi8KKwlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IG5ld0NvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogVGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gaW5pdGlhbGx5IGRlY2xhcmVzIGEgcGFja2FnZSB3aXRoIGFuCisJICogdW5zcGVjaWZpZWQgbmFtZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdW5wYXJlbnRlZCBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbiBuZXdQYWNrYWdlRGVjbGFyYXRpb24oKSB7CisJCVBhY2thZ2VEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgaW1wb3J0IGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogVGhlIGltcG9ydCBkZWNsYXJhdGlvbiBpbml0aWFsbHkgY29udGFpbnMgYSBzaW5nbGUtdHlwZSBpbXBvcnQKKwkgKiBvZiBhIHR5cGUgd2l0aCBhbiB1bnNwZWNpZmllZCBuYW1lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyB1bnBhcmVudGVkIGltcG9ydCBkZWNsYXJhdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBuZXdJbXBvcnREZWNsYXJhdGlvbigpIHsKKwkJSW1wb3J0RGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgY2xhc3MgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgCisJICogbm8gbW9kaWZpZXJzOyBubyBKYXZhZG9jIGNvbW1lbnQ7IG5vIHN1cGVyY2xhc3Mgb3Igc3VwZXJpbnRlcmZhY2VzOyAKKwkgKiBhbmQgYW4gZW1wdHkgY2xhc3MgYm9keS4KKwkgKiA8cD4KKwkgKiBUbyBjcmVhdGUgYW4gaW50ZXJmYWNlLCB1c2UgdGhpcyBtZXRob2QgYW5kIHRoZW4gY2FsbAorCSAqIDxjb2RlPlR5cGVEZWNsYXJhdGlvbi5zZXRJbnRlcmZhY2UodHJ1ZSk8L2NvZGU+IGFuZAorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBkZWNsYXJhdGlvbiBub2RlCisJICovCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBuZXdUeXBlRGVjbGFyYXRpb24oKSB7CisJCVR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRoaXMpOworCQlyZXN1bHQuc2V0SW50ZXJmYWNlKGZhbHNlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIG1ldGhvZCBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBkZWNsYXJhdGlvbiBpcyBmb3IgYSBtZXRob2Qgb2YgYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBKYXZhZG9jIGNvbW1lbnQ7IG5vIHBhcmFtZXRlcnM7IHJldHVybgorCSAqIHR5cGUgdm9pZDsgbm8gdGhyb3duIGV4Y2VwdGlvbnM7IGFuZCBubyBib2R5IChhcyBvcHBvc2VkIHRvIGFuIGVtcHR5CisJICogYm9keSkuCisJICogPHA+CisJICogVG8gY3JlYXRlIGEgY29uc3RydWN0b3IsIHVzZSB0aGlzIG1ldGhvZCBhbmQgdGhlbiBjYWxsCisJICogPGNvZGU+TWV0aG9kRGVjbGFyYXRpb24uc2V0Q29uc3RydWN0b3IodHJ1ZSk8L2NvZGU+IGFuZAorCSAqIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUoY2xhc3NOYW1lKTwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBtZXRob2QgZGVjbGFyYXRpb24gbm9kZQorCSAqLworCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBuZXdNZXRob2REZWNsYXJhdGlvbigpIHsKKwkJTWV0aG9kRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKHRoaXMpOworCQlyZXN1bHQuc2V0Q29uc3RydWN0b3IoZmFsc2UpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIHZhcmlhYmxlIHdpdGggYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBsZWdhbCwgbmFtZSBhbmQgdHlwZTsgbm8gbW9kaWZpZXJzOyBhbmQgbm8gaW5pdGlhbGl6ZXIuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBub2RlCisJICovCisJcHVibGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKKwkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IG5vZGUgb3duZWQgYnkgdGhpcyAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBmcmFnbWVudCBpcyBmb3IgYSB2YXJpYWJsZSB3aXRoIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogbGVnYWwsIG5hbWU7IG5vIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IGFuZCBubyBpbml0aWFsaXplci4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgbm9kZQorCSAqLworCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCkgeworCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGluaXRpYWxpemVyIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QsIHdpdGggYW4gCisJICogZW1wdHkgYmxvY2suIEJ5IGRlZmF1bHQsIHRoZSBpbml0aWFsaXplciBoYXMgbm8gbW9kaWZpZXJzIGFuZCAKKwkgKiBhbiBlbXB0eSBibG9jay4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgaW5pdGlhbGl6ZXIgbm9kZQorCSAqLworCXB1YmxpYyBJbml0aWFsaXplciBuZXdJbml0aWFsaXplcigpIHsKKwkJSW5pdGlhbGl6ZXIgcmVzdWx0ID0gbmV3IEluaXRpYWxpemVyKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSmF2YWRvYyBjb21tZW50IG5vZGUuCisJICogSW5pdGlhbGx5IHRoZSBuZXcgbm9kZSBoYXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgSmF2YWRvYyBjb21tZW50LgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBKYXZhZG9jIGNvbW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBKYXZhZG9jIG5ld0phdmFkb2MoKSB7CisJCUphdmFkb2MgcmVzdWx0ID0gbmV3IEphdmFkb2ModGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFURU1FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSAKKwkgKiBvd25lZCBieSB0aGlzIEFTVCwgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudC4gCisJICogQnkgZGVmYXVsdCwgdGhlcmUgYXJlIG5vIG1vZGlmaWVycyBhbmQgdGhlIGJhc2UgdHlwZSBpcyB1bnNwZWNpZmllZAorCSAqIChidXQgbGVnYWwpLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudAorCSAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgc3RhdGVtZW50CisJICogKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LiBBZGRpdGlvbmFsIHZhcmlhYmxlCisJICogZGVjbGFyYXRpb24gZnJhZ21lbnRzIGNhbiBiZSBhZGRlZCBhZnRlcndhcmRzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50CisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50CisJCQluZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgeworCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgcmVzdWx0ID0KKwkJCW5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRoaXMpOworCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkKGZyYWdtZW50KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QsIGZvciB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgdHlwZSBkZWNsYXJhdGlvbgorCSAqICg8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+KSBpbnRvIGEgc3RhdGVtZW50CisJICogKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZGVjbCB0aGUgdHlwZSBkZWNsYXJhdGlvbgorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgCisJCQluZXdUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQoVHlwZURlY2xhcmF0aW9uIGRlY2wpIHsKKwkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGhpcyk7CisJCXJlc3VsdC5zZXRUeXBlRGVjbGFyYXRpb24oZGVjbCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBibG9jayBub2RlIG93bmVkIGJ5IHRoaXMgQVNULCBmb3IgYW4gZW1wdHkgbGlzdCAKKwkgKiBvZiBzdGF0ZW1lbnRzLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCwgZW1wdHkgYmxvY2sgbm9kZQorCSAqLworCXB1YmxpYyBCbG9jayBuZXdCbG9jaygpIHsKKwkJcmV0dXJuIG5ldyBCbG9jayh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGNvbnRpbnVlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIFRoZSBjb250aW51ZSBzdGF0ZW1lbnQgaGFzIG5vIGxhYmVsLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjb250aW51ZSBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBDb250aW51ZVN0YXRlbWVudCBuZXdDb250aW51ZVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBDb250aW51ZVN0YXRlbWVudCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGJyZWFrIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIFRoZSBicmVhayBzdGF0ZW1lbnQgaGFzIG5vIGxhYmVsLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBicmVhayBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBCcmVha1N0YXRlbWVudCBuZXdCcmVha1N0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBCcmVha1N0YXRlbWVudCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGV4cHJlc3Npb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QsCisJICogZm9yIHRoZSBnaXZlbiBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW4gZXhwcmVzc2lvbiAKKwkgKiAoPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pIGludG8gYSBzdGF0ZW1lbnQgKDxjb2RlPlR5cGU8L2NvZGU+KSAKKwkgKiBieSB3cmFwcGluZyBpdC4gTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgcmVzdWx0IGlzIG9ubHkgbGVnYWwgZm9yIAorCSAqIGxpbWl0ZWQgZXhwcmVzc2lvbiB0eXBlcywgaW5jbHVkaW5nIG1ldGhvZCBpbnZvY2F0aW9ucywgYXNzaWdubWVudHMsCisJICogYW5kIGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmF0aW9ucy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24KKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3RhdGVtZW50IG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovCisJcHVibGljIEV4cHJlc3Npb25TdGF0ZW1lbnQgbmV3RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJRXhwcmVzc2lvblN0YXRlbWVudCByZXN1bHQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh0aGlzKTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBpZiBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSwgCisJICogdGhlIHRoZW4gc3RhdGVtZW50IGlzIGFuIGVtcHR5IGJsb2NrLCBhbmQgdGhlcmUgaXMgbm8gZWxzZSBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGlmIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIElmU3RhdGVtZW50IG5ld0lmU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IElmU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCB3aGlsZSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSwgYW5kCisJICogdGhlIGJvZHkgc3RhdGVtZW50IGlzIGFuIGVtcHR5IGJsb2NrLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB3aGlsZSBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBXaGlsZVN0YXRlbWVudCBuZXdXaGlsZVN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBXaGlsZVN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCksIGFuZAorCSAqIHRoZSBib2R5IHN0YXRlbWVudCBpcyBhbiBlbXB0eSBibG9jay4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZG8gc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgRG9TdGF0ZW1lbnQgbmV3RG9TdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgRG9TdGF0ZW1lbnQodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHRyeSBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgdHJ5IHN0YXRlbWVudCBoYXMgYW4gZW1wdHkgYmxvY2ssIG5vIGNhdGNoCisJICogY2xhdXNlcywgYW5kIG5vIGZpbmFsbHkgYmxvY2suCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHRyeSBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBUcnlTdGF0ZW1lbnQgbmV3VHJ5U3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IFRyeVN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgY2F0Y2ggY2xhdXNlIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGNhdGNoIGNsYXVzZSBkZWNsYXJlcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCAKKwkgKiBleGNlcHRpb24gZGVjbGFyYXRpb24gYW5kIGhhcyBhbiBlbXB0eSBibG9jay4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2F0Y2ggY2xhdXNlIG5vZGUKKwkgKi8KKwlwdWJsaWMgQ2F0Y2hDbGF1c2UgbmV3Q2F0Y2hDbGF1c2UoKSB7CisJCXJldHVybiBuZXcgQ2F0Y2hDbGF1c2UodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHJldHVybiBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgcmV0dXJuIHN0YXRlbWVudCBoYXMgbm8gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgcmV0dXJuIHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIFJldHVyblN0YXRlbWVudCBuZXdSZXR1cm5TdGF0ZW1lbnQoKSB7CisJCXJldHVybiBuZXcgUmV0dXJuU3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCB0aHJvdyBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0aHJvdyBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBUaHJvd1N0YXRlbWVudCBuZXdUaHJvd1N0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBUaHJvd1N0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgYXNzZXJ0IHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIGFuZCBoYXMgbm8KKwkgKiBtZXNzYWdlIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFzc2VydCBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBBc3NlcnRTdGF0ZW1lbnQgbmV3QXNzZXJ0U3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IEFzc2VydFN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZW1wdHkgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGVtcHR5IHN0YXRlbWVudCBub2RlCisJICovCisJcHVibGljIEVtcHR5U3RhdGVtZW50IG5ld0VtcHR5U3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBsYWJlbGVkIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBsYWJlbCBhbmQgc3RhdGVtZW50IGFyZSBib3RoIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGxhYmVsZWQgc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgTGFiZWxlZFN0YXRlbWVudCBuZXdMYWJlbGVkU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IExhYmVsZWRTdGF0ZW1lbnQodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHN3aXRjaCBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBhbmQgdGhlcmUgYXJlCisJICogbm8gc3RhdGVtZW50cyBvciBzd2l0Y2ggY2FzZXMuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGxhYmVsZWQgc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgU3dpdGNoU3RhdGVtZW50IG5ld1N3aXRjaFN0YXRlbWVudCgpIHsKKwkJcmV0dXJuIG5ldyBTd2l0Y2hTdGF0ZW1lbnQodGhpcyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHN3aXRjaCBjYXNlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IAorCSAqIHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBzd2l0Y2ggY2FzZSBub2RlCisJICovCisJcHVibGljIFN3aXRjaENhc2UgbmV3U3dpdGNoQ2FzZSgpIHsKKwkJcmV0dXJuIG5ldyBTd2l0Y2hDYXNlKHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgYW5kIHRoZSBib2R5IGlzCisJICogYW4gZW1wdHkgYmxvY2suCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbmV3U3luY2hyb25pemVkU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgZm9yIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMsIG5vIGNvbmRpdGlvbiBleHByZXNzaW9uLCAKKwkgKiBubyB1cGRhdGVycywgYW5kIHRoZSBib2R5IGlzIGFuIGVtcHR5IGJsb2NrLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCB0aHJvdyBzdGF0ZW1lbnQgbm9kZQorCSAqLworCXB1YmxpYyBGb3JTdGF0ZW1lbnQgbmV3Rm9yU3RhdGVtZW50KCkgeworCQlyZXR1cm4gbmV3IEZvclN0YXRlbWVudCh0aGlzKTsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVhQUkVTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHN0cmluZyBsaXRlcmFsIG5vZGUgZm9yIAorCSAqIHRoZSBlbXB0eSBzdHJpbmcgbGl0ZXJhbC4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgc3RyaW5nIGxpdGVyYWwgbm9kZQorCSAqLworCXB1YmxpYyBTdHJpbmdMaXRlcmFsIG5ld1N0cmluZ0xpdGVyYWwoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nTGl0ZXJhbCh0aGlzKTsKKwl9CisJCisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgY2hhcmFjdGVyIGxpdGVyYWwgbm9kZS4KKwkgKiBJbml0aWFsbHkgdGhlIG5vZGUgaGFzIGFuIHVuc3BlY2lmaWVkIGNoYXJhY3RlciBsaXRlcmFsLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBjaGFyYWN0ZXIgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIENoYXJhY3RlckxpdGVyYWwgbmV3Q2hhcmFjdGVyTGl0ZXJhbCgpIHsKKwkJcmV0dXJuIG5ldyBDaGFyYWN0ZXJMaXRlcmFsKHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBudW1iZXIgbGl0ZXJhbCBub2RlLgorCSAqIAorCSAqIEBwYXJhbSBsaXRlcmFsIHRoZSB0b2tlbiBmb3IgdGhlIG51bWVyaWMgbGl0ZXJhbCBhcyBpdCB3b3VsZCAKKwkgKiAgICBhcHBlYXIgaW4gSmF2YSBzb3VyY2UgY29kZQorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBudW1iZXIgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIE51bWJlckxpdGVyYWwgbmV3TnVtYmVyTGl0ZXJhbChTdHJpbmcgbGl0ZXJhbCkgeworCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJTnVtYmVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0aGlzKTsKKwkJcmVzdWx0LnNldFRva2VuKGxpdGVyYWwpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbnVtYmVyIGxpdGVyYWwgbm9kZS4KKwkgKiBJbml0aWFsbHkgdGhlIG51bWJlciBsaXRlcmFsIHRva2VuIGlzIDxjb2RlPiIwIjwvY29kZT4uCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG51bWJlciBsaXRlcmFsIG5vZGUKKwkgKi8KKwlwdWJsaWMgTnVtYmVyTGl0ZXJhbCBuZXdOdW1iZXJMaXRlcmFsKCkgeworCQlOdW1iZXJMaXRlcmFsIHJlc3VsdCA9IG5ldyBOdW1iZXJMaXRlcmFsKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgbnVsbCBsaXRlcmFsIG5vZGUuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG51bGwgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIE51bGxMaXRlcmFsIG5ld051bGxMaXRlcmFsKCkgeworCQlyZXR1cm4gbmV3IE51bGxMaXRlcmFsKHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYm9vbGVhbiBsaXRlcmFsIG5vZGUuCisJICogPHA+CisJICogRm9yIGV4YW1wbGUsIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24gPGNvZGU+Zm9vID0gdHJ1ZTwvY29kZT4KKwkgKiBpcyBnZW5lcmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBzbmlwcGV0OgorCSAqIDxjb2RlPgorCSAqIDxwcmU+CisJICogQXNzaWdubWVudCBlPSBhc3QubmV3QXNzaWdubWVudCgpOworCSAqIGUuc2V0TGVmdEhhbmRTaWRlKGFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKSk7CisJICogZS5zZXRSaWdodEhhbmRTaWRlKGFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7CisJICogPC9wcmU+CisJICogPC9jb2RlPgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIGJvb2xlYW4gdmFsdWUKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYm9vbGVhbiBsaXRlcmFsIG5vZGUKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbkxpdGVyYWwgbmV3Qm9vbGVhbkxpdGVyYWwoYm9vbGVhbiB2YWx1ZSkgeworCQlCb29sZWFuTGl0ZXJhbCByZXN1bHQgPSBuZXcgQm9vbGVhbkxpdGVyYWwodGhpcyk7CisJCXJlc3VsdC5zZXRCb29sZWFuVmFsdWUodmFsdWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIGlzICI9IiBhbmQKKwkgKiB0aGUgbGVmdCBhbmQgcmlnaHQgaGFuZCBzaWRlIGV4cHJlc3Npb25zIGFyZSB1bnNwZWNpZmllZCwgYnV0IAorCSAqIGxlZ2FsLCBuYW1lcy4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgQXNzaWdubWVudCBuZXdBc3NpZ25tZW50KCkgeworCQlBc3NpZ25tZW50IHJlc3VsdCA9IG5ldyBBc3NpZ25tZW50KHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiBub2RlIG93bmVkIGJ5IHRoaXMgCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGlzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIAorCSAqIHRoZXJlIGlzIG5vIHJlY2VpdmVyIGV4cHJlc3Npb24sIGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaXMgZW1wdHkuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBNZXRob2RJbnZvY2F0aW9uIG5ld01ldGhvZEludm9jYXRpb24oKSB7CisJCU1ldGhvZEludm9jYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZEludm9jYXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCAic3VwZXIiIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gbm9kZSBvd25lZCBieSAKKwkgKiB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSAKKwkgKiB0aGVyZSBpcyBubyBxdWFsaWZpZXIsIGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaXMgZW1wdHkuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkICAic3VwZXIiIG1ldGhvZCBpbnZvY2F0aW9uIAorCSAqICAgIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBTdXBlck1ldGhvZEludm9jYXRpb24gbmV3U3VwZXJNZXRob2RJbnZvY2F0aW9uKCkgeworCQlTdXBlck1ldGhvZEludm9jYXRpb24gcmVzdWx0ID0gbmV3IFN1cGVyTWV0aG9kSW52b2NhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiB1bnBhcmVudGVkIGFsdGVybmF0ZSBjb25zdHJ1Y3RvciAoInRoaXMoLi4uKTsiKSBpbnZvY2F0aW9uIAorCSAqIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBvZiBhcmd1bWVudHMKKwkgKiBpcyBlbXB0eS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyB0eXBlIG9mIG5vZGUgaXMgYSBTdGF0ZW1lbnQsIHdoZXJlYXMgYSByZWd1bGFyCisJICogbWV0aG9kIGludm9jYXRpb24gaXMgYW4gRXhwcmVzc2lvbi4gVGhlIG9ubHkgdmFsaWQgdXNlIG9mIHRoZXNlIAorCSAqIHN0YXRlbWVudHMgYXJlIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBjb25zdHJ1Y3RvciBib2R5LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5ld0NvbnN0cnVjdG9ySW52b2NhdGlvbigpIHsKKwkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBhbHRlcm5hdGUgc3VwZXIgY29uc3RydWN0b3IgKCJzdXBlciguLi4pOyIpIAorCSAqIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vCisJICogcXVhbGlmaWVyIGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaXMgZW1wdHkuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgdHlwZSBvZiBub2RlIGlzIGEgU3RhdGVtZW50LCB3aGVyZWFzIGEgcmVndWxhcgorCSAqIHN1cGVyIG1ldGhvZCBpbnZvY2F0aW9uIGlzIGFuIEV4cHJlc3Npb24uIFRoZSBvbmx5IHZhbGlkIHVzZSBvZiB0aGVzZSAKKwkgKiBzdGF0ZW1lbnRzIGFyZSBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIGEgY29uc3RydWN0b3IgYm9keS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IG5vZGUKKwkgKi8KKwlwdWJsaWMgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbmV3U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oKSB7CisJCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9CisJCQluZXcgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gZXhwcmVzc2lvbiBub2RlIAorCSAqIG93bmVkIGJ5IHRoaXMgQVNULCBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50LiBCeSAKKwkgKiBkZWZhdWx0LCB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzIGFuZCB0aGUgYmFzZSB0eXBlIGlzIHVuc3BlY2lmaWVkCisJICogKGJ1dCBsZWdhbCkuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50CisJICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYW4gZXhwcmVzc2lvbgorCSAqICg8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikgYnkgd3JhcHBpbmcgaXQuIEFkZGl0aW9uYWwgdmFyaWFibGUKKwkgKiBkZWNsYXJhdGlvbiBmcmFnbWVudHMgY2FuIGJlIGFkZGVkIGFmdGVyd2FyZHMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZmlyc3QgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24gZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbgorCQkJbmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50KSB7CisJCWlmIChmcmFnbWVudCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gcmVzdWx0ID0KKwkJCW5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih0aGlzKTsKKwkJcmVzdWx0LmZyYWdtZW50cygpLmFkZChmcmFnbWVudCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBkZWNsYXJhdGlvbiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULCAKKwkgKiBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50LiBCeSBkZWZhdWx0LCB0aGVyZSBhcmUgbm8KKwkgKiBtb2RpZmllcnMsIG5vIGphdmFkb2MgY29tbWVudCwgYW5kIHRoZSBiYXNlIHR5cGUgaXMgdW5zcGVjaWZpZWQgCisJICogKGJ1dCBsZWdhbCkuCisJICogPHA+CisJICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gd3JhcCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50CisJICogKDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pIGludG8gYSBmaWVsZCBkZWNsYXJhdGlvbgorCSAqIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gdGhlIGJvZHkgb2YgYSB0eXBlIGRlY2xhcmF0aW9uCisJICogKDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+IGltcGxlbWVudHMgPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogQWRkaXRpb25hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgY2FuIGJlIGFkZGVkIGFmdGVyd2FyZHMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBmcmFnbWVudCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgZmllbGQgZGVjbGFyYXRpb24gbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBuZXdGaWVsZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCkgeworCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCUZpZWxkRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEZpZWxkRGVjbGFyYXRpb24odGhpcyk7CisJCXJlc3VsdC5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgInRoaXMiIGV4cHJlc3Npb24gbm9kZSAKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gcXVhbGlmaWVyLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCAidGhpcyIgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIFRoaXNFeHByZXNzaW9uIG5ld1RoaXNFeHByZXNzaW9uKCkgeworCQlUaGlzRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgVGhpc0V4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGFuZCBmaWVsZCBhcmUgYm90aAorCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWVzLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEZpZWxkQWNjZXNzIG5ld0ZpZWxkQWNjZXNzKCkgeworCQlGaWVsZEFjY2VzcyByZXN1bHQgPSBuZXcgRmllbGRBY2Nlc3ModGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHN1cGVyIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGFuZCBmaWVsZCBhcmUgYm90aAorCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWVzLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBzdXBlciBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIFN1cGVyRmllbGRBY2Nlc3MgbmV3U3VwZXJGaWVsZEFjY2VzcygpIHsKKwkJU3VwZXJGaWVsZEFjY2VzcyByZXN1bHQgPSBuZXcgU3VwZXJGaWVsZEFjY2Vzcyh0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24gbm9kZSAKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHR5cGUgaXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHR5cGUgbGl0ZXJhbCBub2RlCisJICovCisJcHVibGljIFR5cGVMaXRlcmFsIG5ld1R5cGVMaXRlcmFsKCkgeworCQlUeXBlTGl0ZXJhbCByZXN1bHQgPSBuZXcgVHlwZUxpdGVyYWwodGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGNhc3QgZXhwcmVzc2lvbiBub2RlIAorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgdHlwZSBhbmQgZXhwcmVzc2lvbiBhcmUgdW5zcGVjaWZpZWQKKwkgKiAoYnV0IGxlZ2FsKS4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2FzdCBleHByZXNzaW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgQ2FzdEV4cHJlc3Npb24gbmV3Q2FzdEV4cHJlc3Npb24oKSB7CisJCUNhc3RFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDYXN0RXhwcmVzc2lvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzaW9uIGlzIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBuZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHsKKwkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBpbmZpeCBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBvcGVyYXRvciBhbmQgbGVmdCBhbmQgcmlnaHQKKwkgKiBvcGVyYW5kIGFyZSB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSwgYW5kIHRoZXJlIGFyZSBubyBleHRlbmRlZAorCSAqIG9wZXJhbmRzLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBpbmZpeCBleHByZXNzaW9uIG5vZGUKKwkgKi8KKwlwdWJsaWMgSW5maXhFeHByZXNzaW9uIG5ld0luZml4RXhwcmVzc2lvbigpIHsKKwkJSW5maXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJbmZpeEV4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGluc3RhbmNlb2YgZXhwcmVzc2lvbiBub2RlIAorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIGxlZnQgYW5kIHJpZ2h0CisJICogb3BlcmFuZCBhcmUgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGluc3RhbmNlb2YgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEluc3RhbmNlb2ZFeHByZXNzaW9uIG5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCkgeworCQlJbnN0YW5jZW9mRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIHBvc3RmaXggZXhwcmVzc2lvbiBub2RlIAorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIG9wZXJhbmQgYXJlIAorCSAqIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwb3N0Zml4IGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBQb3N0Zml4RXhwcmVzc2lvbiBuZXdQb3N0Zml4RXhwcmVzc2lvbigpIHsKKwkJUG9zdGZpeEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBvc3RmaXhFeHByZXNzaW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBwcmVmaXggZXhwcmVzc2lvbiBub2RlIAorCSAqIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgb3BlcmF0b3IgYW5kIG9wZXJhbmQgYXJlIAorCSAqIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBwcmVmaXggZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIFByZWZpeEV4cHJlc3Npb24gbmV3UHJlZml4RXhwcmVzc2lvbigpIHsKKwkJUHJlZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJlZml4RXhwcmVzc2lvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24gbm9kZSAKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFycmF5IGFuZCBpbmRleCBleHByZXNzaW9uIGFyZSAKKwkgKiBib3RoIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEFycmF5QWNjZXNzIG5ld0FycmF5QWNjZXNzKCkgeworCQlBcnJheUFjY2VzcyByZXN1bHQgPSBuZXcgQXJyYXlBY2Nlc3ModGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gbm9kZSAKKwkgKiBvd25lZCBieSB0aGlzIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFycmF5IHR5cGUgaXMgYW4gdW5zcGVjaWZpZWQKKwkgKiAxLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgbGlzdCBvZiBkaW1lbnNpb25zIGlzIGVtcHR5LCBhbmQgdGhlcmUgaXMgbm8KKwkgKiBhcnJheSBpbml0aWFsaXplci4KKwkgKiA8cD4KKwkgKiBFeGFtcGxlczoKKwkgKiA8Y29kZT4KKwkgKiA8cHJlPgorCSAqIAkvLyBuZXcgU3RyaW5nW2xlbl0KKwkgKiBBcnJheUNyZWF0aW9uIGFjMSA9IGFzdC5uZXdBcnJheUNyZWF0aW9uKCk7CisJICogYWMxLnNldFR5cGUoCisJICogICAgYXN0Lm5ld0FycmF5VHlwZSgKKwkgKiAgICAgICBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKSk7CisJICogYWMxLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld1NpbXBsZU5hbWUoImxlbiIpKTsKKworCSAqIAkvLyBuZXcgZG91YmxlWzddWzI0XVtdCisJICogQXJyYXlDcmVhdGlvbiBhYzIgPSBhc3QubmV3QXJyYXlDcmVhdGlvbigpOworCSAqIGFjMi5zZXRUeXBlKAorCSAqICAgIGFzdC5uZXdBcnJheVR5cGUoCisJICogICAgICAgYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5ET1VCTEUpLCAzKSk7CisJICogYWMyLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjciKSk7CisJICogYWMyLmRpbWVuc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjI0IikpOworCSAqCisJICogLy8gbmV3IGludFtdIHsxLCAyfQorCSAqIEFycmF5Q3JlYXRpb24gYWMzID0gYXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKKwkgKiBhYzMuc2V0VHlwZSgKKwkgKiAgICBhc3QubmV3QXJyYXlUeXBlKAorCSAqICAgICAgIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSkpOworCSAqIEFycmF5SW5pdGlhbGl6ZXIgYWkgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOworCSAqIGFjMy5zZXRJbml0aWFsaXplcihhaSk7CisJICogYWkuZXhwcmVzc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjEiKSk7CisJICogYWkuZXhwcmVzc2lvbnMoKS5hZGQoYXN0Lm5ld051bWJlckxpdGVyYWwoIjIiKSk7CisJICogPC9wcmU+CisJICogPC9jb2RlPgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgYXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIEFycmF5Q3JlYXRpb24gbmV3QXJyYXlDcmVhdGlvbigpIHsKKwkJQXJyYXlDcmVhdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlDcmVhdGlvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHVucGFyZW50ZWQgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gCisJICogKCJuZXciKSBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIAorCSAqIHRoZXJlIGlzIG5vIHF1YWxpZnlpbmcgZXhwcmVzc2lvbiwgYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgdHlwZSBuYW1lLAorCSAqIGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzLCBhbmQgZG9lcyBub3QgZGVjbGFyZSBhbiBhbm9ueW1vdXMKKwkgKiBjbGFzcyBkZWNsYXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbmV3IHVucGFyZW50ZWQgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBub2RlCisJICovCisJcHVibGljIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBuZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7CisJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiByZXN1bHQgPSBuZXcgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24KKwkgKiBub2RlIG93bmVkIGJ5IHRoaXMgQVNULiBCeSBkZWZhdWx0LCB0aGUgYm9keSBkZWNsYXJhdGlvbiBsaXN0IGlzIGVtcHR5LgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgdW5wYXJlbnRlZCBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24gbm9kZQorCSAqLworCXB1YmxpYyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7CisJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IEFub255bW91c0NsYXNzRGVjbGFyYXRpb24odGhpcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGluaXRpYWxpemVyIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBpbml0aWFsaXplciBoYXMgbm8gZXhwcmVzc2lvbnMuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGluaXRpYWxpemVyIG5vZGUKKwkgKi8KKwlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBuZXdBcnJheUluaXRpYWxpemVyKCkgeworCQlBcnJheUluaXRpYWxpemVyIHJlc3VsdCA9IG5ldyBBcnJheUluaXRpYWxpemVyKHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgdW5wYXJlbnRlZCBjb25kaXRpb25hbCBleHByZXNzaW9uIG5vZGUgCisJICogb3duZWQgYnkgdGhpcyBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBjb25kaXRpb24gYW5kIGJvdGggZXhwcmVzc2lvbnMKKwkgKiBhcmUgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkuCisJICogCisJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbm9kZQorCSAqLworCXB1YmxpYyBDb25kaXRpb25hbEV4cHJlc3Npb24gbmV3Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkgeworCQlDb25kaXRpb25hbEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IENvbmRpdGlvbmFsRXhwcmVzc2lvbih0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODZiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjg2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKKworLyoqCisgKiBJbnRlcm5hbCBjbGFzcyBmb3IgY29udmVydGluZyBpbnRlcm5hbCBjb21waWxlciBBU1RzIGludG8gcHVibGljIEFTVHMuCisgKi8KK2NsYXNzIEFTVENvbnZlcnRlciB7CisKKwlwcml2YXRlIEFTVCBhc3Q7CisJcHJpdmF0ZSBjaGFyW10gY29tcGlsYXRpb25Vbml0U291cmNlOworCXByaXZhdGUgU2Nhbm5lciBzY2FubmVyOworCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlQmluZGluZ3M7CisJCisJcHVibGljIEFTVENvbnZlcnRlcihib29sZWFuIHJlc29sdmVCaW5kaW5ncykgeworCQl0aGlzLnJlc29sdmVCaW5kaW5ncyA9IHJlc29sdmVCaW5kaW5nczsKKwkJc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsIGZhbHNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QVNUKEFTVCBhc3QpIHsKKwkJdGhpcy5hc3QgPSBhc3Q7CisJfQorCQorCXB1YmxpYyBDb21waWxhdGlvblVuaXQgY29udmVydChDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBjaGFyW10gc291cmNlKSB7CisJCXRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlID0gc291cmNlOworCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOworCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gdGhpcy5hc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7CisJCS8vIGhhbmRsZSB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbW1lZGlhdGVseQorCQkvLyBUaGVyZSBpcyBubyBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KKwkJaWYgKHJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoY29tcGlsYXRpb25Vbml0LCB1bml0KTsKKwkJfQorCQlpZiAodW5pdC5jdXJyZW50UGFja2FnZSAhPSBudWxsKSB7CisJCQljb21waWxhdGlvblVuaXQuc2V0UGFja2FnZShjb252ZXJ0UGFja2FnZSh1bml0LmN1cnJlbnRQYWNrYWdlKSk7CisJCX0KKwkJSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0cyA9IHVuaXQuaW1wb3J0czsKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJaW50IGltcG9ydExlbmd0aCA9IGltcG9ydHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRMZW5ndGg7IGkrKykgeworCQkJCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzKCkuYWRkKGNvbnZlcnRJbXBvcnQoaW1wb3J0c1tpXSkpOworCQkJfQorCQl9CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOworCQlpZiAodHlwZXMgIT0gbnVsbCkgeworCQkJaW50IHR5cGVzTGVuZ3RoID0gdHlwZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0xlbmd0aDsgaSsrKSB7CisJCQkJY29tcGlsYXRpb25Vbml0LnR5cGVzKCkuYWRkKGNvbnZlcnQodHlwZXNbaV0pKTsKKwkJCX0KKwkJfQorCQljb21waWxhdGlvblVuaXQuc2V0U291cmNlUmFuZ2UodW5pdC5zb3VyY2VTdGFydCwgdW5pdC5zb3VyY2VFbmQgLSB1bml0LnNvdXJjZVN0YXJ0ICArIDEpOworCQkKKwkJaWYgKHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50ICE9IDApIHsKKwkJCXByb3BhZ2F0ZUVycm9ycyhjb21waWxhdGlvblVuaXQsIHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbXMsIHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50KTsKKwkJfQorCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0OworCX0KKwkKKwlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGNvbnZlcnRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UpIHsKKwkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld1BhY2thZ2VEZWNsYXJhdGlvbigpOworCQljaGFyW11bXSB0b2tlbnMgPSBpbXBvcnRSZWZlcmVuY2UudG9rZW5zOworCQlpbnQgbGVuZ3RoID0gaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7CisJCWxvbmdbXSBwb3NpdGlvbnMgPSBpbXBvcnRSZWZlcmVuY2Uuc291cmNlUG9zaXRpb25zOworCQlpbnQgc3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMF0+Pj4zMik7CisJCWludCBlbmQgPSAoaW50KShwb3NpdGlvbnNbbGVuZ3RoIC0gMV0gJiAweEZGRkZGRkZGKTsKKwkJTmFtZSBuYW1lID0gbnVsbDsKKwkJaWYgKGxlbmd0aCA+IDEpIHsKKwkJCW5hbWUgPSBzZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyh0b2tlbnMsIHBvc2l0aW9ucywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodG9rZW5zWzBdKSk7CisJCQluYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQl9CisJCXBhY2thZ2VEZWNsYXJhdGlvbi5zZXRTb3VyY2VSYW5nZShpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uRW5kIC0gaW1wb3J0UmVmZXJlbmNlLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKKwkJcGFja2FnZURlY2xhcmF0aW9uLnNldE5hbWUobmFtZSk7CisJCWlmIChyZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHBhY2thZ2VEZWNsYXJhdGlvbiwgaW1wb3J0UmVmZXJlbmNlKTsKKwkJfQorCQlyZXR1cm4gcGFja2FnZURlY2xhcmF0aW9uOworCX0KKwkKKwlwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24gY29udmVydEltcG9ydChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlKSB7CisJCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsKKwkJYm9vbGVhbiBvbkRlbWFuZCA9IGltcG9ydFJlZmVyZW5jZS5vbkRlbWFuZDsKKwkJY2hhcltdW10gdG9rZW5zID0gaW1wb3J0UmVmZXJlbmNlLnRva2VuczsKKwkJaW50IGxlbmd0aCA9IGltcG9ydFJlZmVyZW5jZS50b2tlbnMubGVuZ3RoOworCQlsb25nW10gcG9zaXRpb25zID0gaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uczsKKwkJTmFtZSBuYW1lID0gbnVsbDsKKwkJaWYgKGxlbmd0aCA+IDEpIHsKKwkJCW5hbWUgPSBzZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyh0b2tlbnMsIHBvc2l0aW9ucywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodG9rZW5zWzBdKSk7CisJCQlpbnQgc3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMF0+Pj4zMik7CisJCQlpbnQgZW5kID0gKGludCkocG9zaXRpb25zWzBdICYgMHhGRkZGRkZGRik7CisJCQluYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQl9CisJCWltcG9ydERlY2xhcmF0aW9uLnNldFNvdXJjZVJhbmdlKGltcG9ydFJlZmVyZW5jZS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25FbmQgLSBpbXBvcnRSZWZlcmVuY2UuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpOworCQlpbXBvcnREZWNsYXJhdGlvbi5zZXROYW1lKG5hbWUpOworCQlpbXBvcnREZWNsYXJhdGlvbi5zZXRPbkRlbWFuZChvbkRlbWFuZCk7CisJCWlmIChyZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGltcG9ydERlY2xhcmF0aW9uLCBpbXBvcnRSZWZlcmVuY2UpOworCQl9CisJCXJldHVybiBpbXBvcnREZWNsYXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHRoaXMuYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOworCQlpbnQgbW9kaWZpZXJzID0gdHlwZURlY2xhcmF0aW9uLm1vZGlmaWVyczsKKwkJbW9kaWZpZXJzICY9IH5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzLkFjY0ludGVyZmFjZTsgLy8gcmVtb3ZlIEFjY0ludGVyZmFjZSBmbGFncworCQltb2RpZmllcnMgJj0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwkJLyoqCisJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzMKKwkJICogVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgYnVpbHQgbm9kZXMgd2l0aCBpbnZhbGlkIG1vZGlmaWVycy4KKwkJICovCisJCXRyeSB7CisJCQl0eXBlRGVjbC5zZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJaW50IGxlZ2FsTW9kaWZpZXJzID0KKwkJCQlNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuUFJPVEVDVEVECisJCQkJfCBNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLkFCU1RSQUNUCisJCQkJfCBNb2RpZmllci5TVFJJQ1RGUDsKKwkJCXR5cGVEZWNsLnNldE1vZGlmaWVycyhtb2RpZmllcnMgJiBsZWdhbE1vZGlmaWVycyk7CisJCQl0eXBlRGVjbC5zZXRGbGFncyhBU1ROb2RlLk1BTEZPUk1FRCk7CisJCX0KKwkJdHlwZURlY2wuc2V0SW50ZXJmYWNlKHR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpKTsKKwkJU2ltcGxlTmFtZSB0eXBlTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSkpOworCQl0eXBlTmFtZS5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSB0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKKwkJdHlwZURlY2wuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZURlY2xhcmF0aW9uLm5hbWUpKSk7CisJCXR5cGVEZWNsLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uYm9keUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCQorCQkvLyBuZWVkIHRvIHNldCB0aGUgc3VwZXJjbGFzcyBhbmQgc3VwZXIgaW50ZXJmYWNlcyBoZXJlIHNpbmNlIHdlIGNhbm5vdCBkaXN0aW5ndWlzaCB0aGVtIGF0CisJCS8vIHRoZSB0eXBlIHJlZmVyZW5jZXMgbGV2ZWwuCisJCWlmICh0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCQl0eXBlRGVjbC5zZXRTdXBlcmNsYXNzKGNvbnZlcnQodHlwZURlY2xhcmF0aW9uLnN1cGVyY2xhc3MpKTsKKwkJfQorCQkKKwkJVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXM7CisJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaW5kZXggPSAwLCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworCQkJCXR5cGVEZWNsLnN1cGVySW50ZXJmYWNlcygpLmFkZChjb252ZXJ0KHN1cGVySW50ZXJmYWNlc1tpbmRleF0pKTsKKwkJCX0KKwkJfQorCQkKKwkJYnVpbGRCb2R5RGVjbGFyYXRpb25zKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2wpOworCQlzZXRKYXZhRG9jQ29tbWVudCh0eXBlRGVjbCk7CisJCWlmIChyZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24pOworCQkJdHlwZURlY2wucmVzb2x2ZUJpbmRpbmcoKTsKKwkJfQorCQlyZXR1cm4gdHlwZURlY2w7CisJfQorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkQm9keURlY2xhcmF0aW9ucyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgeworCQkvLyBhZGQgYm9keSBkZWNsYXJhdGlvbiBpbiB0aGUgbGV4aWNhbCBvcmRlcgorCQlNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJzID0gdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbGFyYXRpb24uZmllbGRzOworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOworCQkKKwkJaW50IGZpZWxkc0xlbmd0aCA9IGZpZWxkcyA9PSBudWxsPyAwIDogZmllbGRzLmxlbmd0aDsKKwkJaW50IG1ldGhvZHNMZW5ndGggPSBtZXRob2RzID09IG51bGw/IDAgOiBtZXRob2RzLmxlbmd0aDsKKwkJaW50IG1lbWJlcnNMZW5ndGggPSBtZW1iZXJzID09IG51bGwgPyAwIDogbWVtYmVycy5sZW5ndGg7CisJCWludCBmaWVsZHNJbmRleCA9IDA7CisJCWludCBtZXRob2RzSW5kZXggPSAwOworCQlpbnQgbWVtYmVyc0luZGV4ID0gMDsKKwkJCisJCXdoaWxlICgoZmllbGRzSW5kZXggPCBmaWVsZHNMZW5ndGgpCisJCQl8fCAobWVtYmVyc0luZGV4IDwgbWVtYmVyc0xlbmd0aCkKKwkJCXx8IChtZXRob2RzSW5kZXggPCBtZXRob2RzTGVuZ3RoKSkgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIG5leHRGaWVsZERlY2xhcmF0aW9uID0gbnVsbDsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbnVsbDsKKwkJCU1lbWJlclR5cGVEZWNsYXJhdGlvbiBuZXh0TWVtYmVyRGVjbGFyYXRpb24gPSBudWxsOworCQkKKwkJCWludCBwb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCQkJaW50IG5leHREZWNsYXJhdGlvblR5cGUgPSAtMTsKKwkJCWlmIChmaWVsZHNJbmRleCA8IGZpZWxkc0xlbmd0aCkgeworCQkJCW5leHRGaWVsZERlY2xhcmF0aW9uID0gZmllbGRzW2ZpZWxkc0luZGV4XTsKKwkJCQlpZiAobmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJCXBvc2l0aW9uID0gbmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDA7IC8vIEZJRUxECisJCQkJfQorCQkJfQorCQkJaWYgKG1ldGhvZHNJbmRleCA8IG1ldGhvZHNMZW5ndGgpIHsKKwkJCQluZXh0TWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RzW21ldGhvZHNJbmRleF07CisJCQkJaWYgKG5leHRNZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDwgcG9zaXRpb24pIHsKKwkJCQkJcG9zaXRpb24gPSBuZXh0TWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDE7IC8vIE1FVEhPRAorCQkJCX0KKwkJCX0KKwkJCWlmIChtZW1iZXJzSW5kZXggPCBtZW1iZXJzTGVuZ3RoKSB7CisJCQkJbmV4dE1lbWJlckRlY2xhcmF0aW9uID0gbWVtYmVyc1ttZW1iZXJzSW5kZXhdOworCQkJCWlmIChuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJCXBvc2l0aW9uID0gbmV4dE1lbWJlckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCQkJCW5leHREZWNsYXJhdGlvblR5cGUgPSAyOyAvLyBNRU1CRVIKKwkJCQl9CisJCQl9CisJCQlzd2l0Y2ggKG5leHREZWNsYXJhdGlvblR5cGUpIHsKKwkJCQljYXNlIDAgOgorCQkJCQljaGVja0FuZEFkZE11bHRpcGxlRmllbGREZWNsYXJhdGlvbihmaWVsZHMsIGZpZWxkc0luZGV4LCB0eXBlRGVjbC5ib2R5RGVjbGFyYXRpb25zKCkpOworCQkJCQlmaWVsZHNJbmRleCsrOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEgOgorCQkJCQltZXRob2RzSW5kZXgrKzsKKwkJCQkJaWYgKCFuZXh0TWV0aG9kRGVjbGFyYXRpb24uaXNEZWZhdWx0Q29uc3RydWN0b3IoKSAmJiAhbmV4dE1ldGhvZERlY2xhcmF0aW9uLmlzQ2xpbml0KCkpIHsKKwkJCQkJCXR5cGVEZWNsLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoY29udmVydChuZXh0TWV0aG9kRGVjbGFyYXRpb24pKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDIgOgorCQkJCQltZW1iZXJzSW5kZXgrKzsKKwkJCQkJdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KG5leHRNZW1iZXJEZWNsYXJhdGlvbikpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja0FuZEFkZE11bHRpcGxlRmllbGREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMsIGludCBpbmRleCwgTGlzdCBib2R5RGVjbGFyYXRpb25zKSB7CisJCWlmIChmaWVsZHNbaW5kZXhdIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcikgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplciBvbGRJbml0aWFsaXplciA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkluaXRpYWxpemVyKSBmaWVsZHNbaW5kZXhdOworCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSB0aGlzLmFzdC5uZXdJbml0aWFsaXplcigpOworCQkJaW5pdGlhbGl6ZXIuc2V0Qm9keShjb252ZXJ0KG9sZEluaXRpYWxpemVyLmJsb2NrKSk7CisJCQlpbml0aWFsaXplci5zZXRNb2RpZmllcnMob2xkSW5pdGlhbGl6ZXIubW9kaWZpZXJzKTsKKwkJCWluaXRpYWxpemVyLnNldFNvdXJjZVJhbmdlKG9sZEluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG9sZEluaXRpYWxpemVyLnNvdXJjZUVuZCAtIG9sZEluaXRpYWxpemVyLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKKwkJCXNldEphdmFEb2NDb21tZW50KGluaXRpYWxpemVyKTsKKwkJCWJvZHlEZWNsYXJhdGlvbnMuYWRkKGluaXRpYWxpemVyKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoaW5kZXggPiAwICYmIGZpZWxkc1tpbmRleCAtIDFdLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPT0gZmllbGRzW2luZGV4XS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQkvLyB3ZSBoYXZlIGEgbXVsdGlwbGUgZmllbGQgZGVjbGFyYXRpb24KKwkJCS8vIFdlIHJldHJpZXZlIHRoZSBleGlzdGluZyBmaWVsZERlY2xhcmF0aW9uIHRvIGFkZCB0aGUgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAorCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KGJvZHlEZWNsYXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisJCQlmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpLmFkZChjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoZmllbGRzW2luZGV4XSkpOworCQl9IGVsc2UgeworCQkJLy8gd2UgY2FuIGNyZWF0ZSBhIG5ldyBGaWVsZERlY2xhcmF0aW9uCisJCQlib2R5RGVjbGFyYXRpb25zLmFkZChjb252ZXJ0VG9GaWVsZERlY2xhcmF0aW9uKGZpZWxkc1tpbmRleF0pKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRBZGRNdWx0aXBsZUxvY2FsRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnRbXSBzdG10cywgaW50IGluZGV4LCBMaXN0IGJsb2NrU3RhdGVtZW50cykgeworCQlpZiAoaW5kZXggPiAwCisJCSAgICAmJiBzdG10c1tpbmRleCAtIDFdIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkgICAgCUxvY2FsRGVjbGFyYXRpb24gbG9jYWwxID0gKExvY2FsRGVjbGFyYXRpb24pIHN0bXRzW2luZGV4IC0gMV07CisJCSAgICAJTG9jYWxEZWNsYXJhdGlvbiBsb2NhbDIgPSAoTG9jYWxEZWNsYXJhdGlvbikgc3RtdHNbaW5kZXhdOworCQkJICAgaWYgKGxvY2FsMS5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID09IGxvY2FsMi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0KSB7CisJCQkJCS8vIHdlIGhhdmUgYSBtdWx0aXBsZSBsb2NhbCBkZWNsYXJhdGlvbnMKKwkJCQkJLy8gV2UgcmV0cmlldmUgdGhlIGV4aXN0aW5nIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdG8gYWRkIHRoZSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50CisJCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBibG9ja1N0YXRlbWVudHMuZ2V0KGJsb2NrU3RhdGVtZW50cy5zaXplKCkgLSAxKTsKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKS5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KChMb2NhbERlY2xhcmF0aW9uKXN0bXRzW2luZGV4XSkpOworCQkJICAgfSBlbHNlIHsKKwkJCQkJLy8gd2UgY2FuIGNyZWF0ZSBhIG5ldyBGaWVsZERlY2xhcmF0aW9uCisJCQkJCWJsb2NrU3RhdGVtZW50cy5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgoTG9jYWxEZWNsYXJhdGlvbilzdG10c1tpbmRleF0pKTsKKwkJCSAgIH0KKwkJfSBlbHNlIHsKKwkJCS8vIHdlIGNhbiBjcmVhdGUgYSBuZXcgRmllbGREZWNsYXJhdGlvbgorCQkJYmxvY2tTdGF0ZW1lbnRzLmFkZChjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KChMb2NhbERlY2xhcmF0aW9uKXN0bXRzW2luZGV4XSkpOworCQl9CisJfQorCisJcHVibGljIE5hbWUgY29udmVydChUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UpIHsKKwkJY2hhcltdW10gdHlwZU5hbWUgPSB0eXBlUmVmZXJlbmNlLmdldFR5cGVOYW1lKCk7CisJCWludCBsZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7CisJCU5hbWUgbmFtZSA9IG51bGw7CisJCWlmIChsZW5ndGggPiAxKSB7CisJCQkvLyBRdWFsaWZpZWROYW1lCisJCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgdHlwZVJlZmVyZW5jZTsKKwkJCWxvbmdbXSBwb3NpdGlvbnMgPSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnNvdXJjZVBvc2l0aW9uczsJCQkKKwkJCW5hbWUgPSBzZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyh0eXBlTmFtZSwgcG9zaXRpb25zLCB0eXBlUmVmZXJlbmNlKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZU5hbWVbMF0pKTsKKwkJCW5hbWUuc2V0U291cmNlUmFuZ2UodHlwZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwgdHlwZVJlZmVyZW5jZS5zb3VyY2VFbmQgLSB0eXBlUmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICsgMSk7CisJCX0KKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2RlcyhuYW1lLCB0eXBlUmVmZXJlbmNlKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJcHVibGljIFNpbXBsZU5hbWUgY29udmVydChTaW5nbGVOYW1lUmVmZXJlbmNlIG5hbWVSZWZlcmVuY2UpIHsKKwkJU2ltcGxlTmFtZSBuYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKG5hbWVSZWZlcmVuY2UudG9rZW4pKTsJCQorCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKG5hbWUsIG5hbWVSZWZlcmVuY2UpOworCQl9CisJCW5hbWUuc2V0U291cmNlUmFuZ2UobmFtZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwgbmFtZVJlZmVyZW5jZS5zb3VyY2VFbmQgLSBuYW1lUmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICsgMSk7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBOYW1lIGNvbnZlcnQoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBuYW1lUmVmZXJlbmNlKSB7CisJCWNoYXJbXVtdIHR5cGVOYW1lID0gbmFtZVJlZmVyZW5jZS50b2tlbnM7CisJCWxvbmdbXSBwb3NpdGlvbnMgPSBzY2FuQWxsSWRlbnRpZmllcnNQb3NpdGlvbnMobmFtZVJlZmVyZW5jZS5zb3VyY2VTdGFydCwgbmFtZVJlZmVyZW5jZS5zb3VyY2VFbmQsIHR5cGVOYW1lLmxlbmd0aCk7CisJCXJldHVybiBzZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyh0eXBlTmFtZSwgcG9zaXRpb25zLCBuYW1lUmVmZXJlbmNlKTsKKwl9CisKKwlwcml2YXRlIFF1YWxpZmllZE5hbWUgc2V0UXVhbGlmaWVkTmFtZU5hbWVBbmRTb3VyY2VSYW5nZXMoY2hhcltdW10gdHlwZU5hbWUsIGxvbmdbXSBwb3NpdGlvbnMsIEFzdE5vZGUgbm9kZSkgeworCQlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCQlTaW1wbGVOYW1lIGZpcnN0VG9rZW4gPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZU5hbWVbMF0pKTsKKwkJaW50IHN0YXJ0MCA9IChpbnQpKHBvc2l0aW9uc1swXT4+PjMyKTsKKwkJaW50IHN0YXJ0ID0gc3RhcnQwOworCQlpbnQgZW5kID0gKGludCkocG9zaXRpb25zWzBdICYgMHhGRkZGRkZGRik7CisJCWZpcnN0VG9rZW4uc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCVNpbXBsZU5hbWUgc2Vjb25kVG9rZW4gPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZU5hbWVbMV0pKTsKKwkJc3RhcnQgPSAoaW50KShwb3NpdGlvbnNbMV0+Pj4zMik7CisJCWVuZCA9IChpbnQpKHBvc2l0aW9uc1sxXSAmIDB4RkZGRkZGRkYpOworCQlzZWNvbmRUb2tlbi5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZShmaXJzdFRva2VuLCBzZWNvbmRUb2tlbik7CisJCXF1YWxpZmllZE5hbWUuc2V0U291cmNlUmFuZ2Uoc3RhcnQwLCBlbmQgLSBzdGFydDAgKyAxKTsKKwkJU2ltcGxlTmFtZSBuZXdQYXJ0ID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDI7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJbmV3UGFydCA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0eXBlTmFtZVtpXSkpOworCQkJc3RhcnQgPSAoaW50KShwb3NpdGlvbnNbaV0+Pj4zMik7CisJCQllbmQgPSAoaW50KShwb3NpdGlvbnNbaV0gJiAweEZGRkZGRkZGKTsKKwkJCW5ld1BhcnQuc2V0U291cmNlUmFuZ2Uoc3RhcnQsICBlbmQgLSBzdGFydCArIDEpOworCQkJcXVhbGlmaWVkTmFtZSA9IHRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgbmV3UGFydCk7CisJCQlxdWFsaWZpZWROYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0MCwgZW5kIC0gc3RhcnQwICsgMSk7CisJCX0KKwkJUXVhbGlmaWVkTmFtZSBuYW1lID0gcXVhbGlmaWVkTmFtZTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2RlcyhuYW1lLCBub2RlKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9CisJCisJcHVibGljIEV4cHJlc3Npb24gY29udmVydChUaGlzUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlpZiAocmVmZXJlbmNlID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KSB7CisJCQkvLyBUaGVyZSBpcyBubyBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGFuIGltcGxpY2l0IHRoaXMKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gY29udmVydCgoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIHJlZmVyZW5jZSk7CisJCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKFF1YWxpZmllZFRoaXNSZWZlcmVuY2UpIHJlZmVyZW5jZSk7CisJCX0gIGVsc2UgeworCQkJVGhpc0V4cHJlc3Npb24gdGhpc0V4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdUaGlzRXhwcmVzc2lvbigpOworCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJcmVjb3JkTm9kZXModGhpc0V4cHJlc3Npb24sIHJlZmVyZW5jZSk7CisJCQl9CisJCQl0aGlzRXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShyZWZlcmVuY2Uuc291cmNlU3RhcnQsIHJlZmVyZW5jZS5zb3VyY2VFbmQgLSByZWZlcmVuY2Uuc291cmNlU3RhcnQgKyAxKTsKKwkJCXJldHVybiB0aGlzRXhwcmVzc2lvbjsKKwkJfQorCX0KKworCXB1YmxpYyBUaGlzRXhwcmVzc2lvbiBjb252ZXJ0KFF1YWxpZmllZFRoaXNSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCVRoaXNFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3VGhpc0V4cHJlc3Npb24oKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2Rlcyh0aGlzRXhwcmVzc2lvbiwgcmVmZXJlbmNlKTsKKwkJfQorCQl0aGlzRXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShyZWZlcmVuY2Uuc291cmNlU3RhcnQsIHJlZmVyZW5jZS5zb3VyY2VFbmQgLSByZWZlcmVuY2Uuc291cmNlU3RhcnQgKyAxKTsKKwkJdGhpc0V4cHJlc3Npb24uc2V0UXVhbGlmaWVyKGNvbnZlcnQocmVmZXJlbmNlLnF1YWxpZmljYXRpb24pKTsKKwkJcmV0dXJuIHRoaXNFeHByZXNzaW9uOworCX0KKworCXB1YmxpYyBOYW1lIGNvbnZlcnQoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCXJldHVybiBjb252ZXJ0KHJlZmVyZW5jZS5xdWFsaWZpY2F0aW9uKTsKKwl9CisKKwlwdWJsaWMgQXJyYXlBY2Nlc3MgY29udmVydChBcnJheVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJQXJyYXlBY2Nlc3MgYXJyYXlBY2Nlc3MgPSB0aGlzLmFzdC5uZXdBcnJheUFjY2VzcygpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGFycmF5QWNjZXNzLCByZWZlcmVuY2UpOworCQl9CisJCWFycmF5QWNjZXNzLnNldFNvdXJjZVJhbmdlKHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCAtIHJlZmVyZW5jZS5zb3VyY2VTdGFydCArIDEpOworCQlhcnJheUFjY2Vzcy5zZXRBcnJheShjb252ZXJ0KHJlZmVyZW5jZS5yZWNlaXZlcikpOworCQlhcnJheUFjY2Vzcy5zZXRJbmRleChjb252ZXJ0KHJlZmVyZW5jZS5wb3NpdGlvbikpOworCQlyZXR1cm4gYXJyYXlBY2Nlc3M7CisJfQorCQorCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoRmllbGRSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCWlmIChyZWZlcmVuY2UucmVjZWl2ZXIuaXNTdXBlcigpKSB7CisJCQlTdXBlckZpZWxkQWNjZXNzIHN1cGVyRmllbGRBY2Nlc3MgPSB0aGlzLmFzdC5uZXdTdXBlckZpZWxkQWNjZXNzKCk7CisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhzdXBlckZpZWxkQWNjZXNzLCByZWZlcmVuY2UpOworCQkJfQorCQkJaWYgKHJlZmVyZW5jZS5yZWNlaXZlciBpbnN0YW5jZW9mIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSB7CisJCQkJTmFtZSBxdWFsaWZpZXIgPSBjb252ZXJ0KChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgcmVmZXJlbmNlLnJlY2VpdmVyKTsKKwkJCQlzdXBlckZpZWxkQWNjZXNzLnNldFF1YWxpZmllcihxdWFsaWZpZXIpOworCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCQlyZWNvcmROb2RlcyhxdWFsaWZpZXIsIHJlZmVyZW5jZS5yZWNlaXZlcik7CisJCQkJfQorCQkJfQorCQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHJlZmVyZW5jZS50b2tlbikpOyAKKwkJCWludCBzb3VyY2VTdGFydCA9IChpbnQpKHJlZmVyZW5jZS5uYW1lU291cmNlUG9zaXRpb24+Pj4zMik7CisJCQlpbnQgbGVuZ3RoID0gKGludCkocmVmZXJlbmNlLm5hbWVTb3VyY2VQb3NpdGlvbiAmIDB4RkZGRkZGRkYpIC0gc291cmNlU3RhcnQgKyAxOworCQkJc2ltcGxlTmFtZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCXN1cGVyRmllbGRBY2Nlc3Muc2V0TmFtZShzaW1wbGVOYW1lKTsKKwkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCXJlY29yZE5vZGVzKHNpbXBsZU5hbWUsIHJlZmVyZW5jZSk7CisJCQl9CisJCQlzdXBlckZpZWxkQWNjZXNzLnNldFNvdXJjZVJhbmdlKHJlZmVyZW5jZS5yZWNlaXZlci5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCAtIHJlZmVyZW5jZS5yZWNlaXZlci5zb3VyY2VTdGFydCArIDEpOworCQkJcmV0dXJuIHN1cGVyRmllbGRBY2Nlc3M7CisJCX0gZWxzZSB7CisJCQlGaWVsZEFjY2VzcyBmaWVsZEFjY2VzcyA9IHRoaXMuYXN0Lm5ld0ZpZWxkQWNjZXNzKCk7CisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhmaWVsZEFjY2VzcywgcmVmZXJlbmNlKTsKKwkJCX0KKwkJCUV4cHJlc3Npb24gcmVjZWl2ZXIgPSBjb252ZXJ0KHJlZmVyZW5jZS5yZWNlaXZlcik7CisJCQlmaWVsZEFjY2Vzcy5zZXRFeHByZXNzaW9uKHJlY2VpdmVyKTsKKwkJCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhyZWZlcmVuY2UudG9rZW4pKTsgCisJCQlpbnQgc291cmNlU3RhcnQgPSAoaW50KShyZWZlcmVuY2UubmFtZVNvdXJjZVBvc2l0aW9uPj4+MzIpOworCQkJaW50IGxlbmd0aCA9IChpbnQpKHJlZmVyZW5jZS5uYW1lU291cmNlUG9zaXRpb24gJiAweEZGRkZGRkZGKSAtIHNvdXJjZVN0YXJ0ICsgMTsKKwkJCXNpbXBsZU5hbWUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CisJCQlmaWVsZEFjY2Vzcy5zZXROYW1lKHNpbXBsZU5hbWUpOworCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJcmVjb3JkTm9kZXMoc2ltcGxlTmFtZSwgcmVmZXJlbmNlKTsKKwkJCX0KKwkJCWZpZWxkQWNjZXNzLnNldFNvdXJjZVJhbmdlKHJlY2VpdmVyLmdldFN0YXJ0UG9zaXRpb24oKSwgcmVmZXJlbmNlLnNvdXJjZUVuZCAtIHJlY2VpdmVyLmdldFN0YXJ0UG9zaXRpb24oKSArIDEpOworCQkJcmV0dXJuIGZpZWxkQWNjZXNzOworCQl9CisJfQorCQorCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKE5hbWVSZWZlcmVuY2UpIHJlZmVyZW5jZSk7CisJCX0KKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFRoaXNSZWZlcmVuY2UpIHsKKwkJCXJldHVybiBjb252ZXJ0KChUaGlzUmVmZXJlbmNlKSByZWZlcmVuY2UpOworCQl9CisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBBcnJheVJlZmVyZW5jZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKEFycmF5UmVmZXJlbmNlKSByZWZlcmVuY2UpOworCQl9CisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKEZpZWxkUmVmZXJlbmNlKSByZWZlcmVuY2UpOworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQ6IGNvbnZlcnQoIiArIHJlZmVyZW5jZS5nZXRDbGFzcygpICsgIikiKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCX0KKwkJCQkJCQorCXB1YmxpYyBOYW1lIGNvbnZlcnQoTmFtZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJCXJldHVybiBjb252ZXJ0KChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWZlcmVuY2UpOworCQl9CisJCWlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gY29udmVydCgoU2luZ2xlTmFtZVJlZmVyZW5jZSkgcmVmZXJlbmNlKTsKKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkOiBjb252ZXJ0KCIgKyByZWZlcmVuY2UuZ2V0Q2xhc3MoKSArICIpIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwl9CQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBjb252ZXJ0KE1lbWJlclR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdGhpcy5hc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7CisJCWludCBtb2RpZmllcnMgPSB0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzOworCQltb2RpZmllcnMgJj0gfm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsZXJNb2RpZmllcnMuQWNjSW50ZXJmYWNlOyAvLyByZW1vdmUgQWNjSW50ZXJmYWNlIGZsYWdzCisJCW1vZGlmaWVycyAmPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnOworCQkvKioKKwkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMworCQkgKiBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciBidWlsdCBub2RlcyB3aXRoIGludmFsaWQgbW9kaWZpZXJzLgorCQkgKi8KKwkJdHJ5IHsKKwkJCXR5cGVEZWNsLnNldE1vZGlmaWVycyhtb2RpZmllcnMpOworCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlpbnQgbGVnYWxNb2RpZmllcnMgPQorCQkJCU1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5QUk9URUNURUQKKwkJCQl8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuQUJTVFJBQ1QKKwkJCQl8IE1vZGlmaWVyLlNUUklDVEZQOworCQkJdHlwZURlY2wuc2V0TW9kaWZpZXJzKG1vZGlmaWVycyAmIGxlZ2FsTW9kaWZpZXJzKTsKKwkJCXR5cGVEZWNsLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJfQorCQl0eXBlRGVjbC5zZXRJbnRlcmZhY2UodHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkpOworCQlTaW1wbGVOYW1lIHR5cGVOYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5uYW1lKSk7CisJCXR5cGVOYW1lLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQl0eXBlRGVjbC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSkpKTsKKwkJdHlwZURlY2wuc2V0U291cmNlUmFuZ2UodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kIC0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKKwkJCisJCS8vIG5lZWQgdG8gc2V0IHRoZSBzdXBlcmNsYXNzIGFuZCBzdXBlciBpbnRlcmZhY2VzIGhlcmUgc2luY2Ugd2UgY2Fubm90IGRpc3Rpbmd1aXNoIHRoZW0gYXQKKwkJLy8gdGhlIHR5cGUgcmVmZXJlbmNlcyBsZXZlbC4KKwkJaWYgKHR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCXR5cGVEZWNsLnNldFN1cGVyY2xhc3MoY29udmVydCh0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzcykpOworCQl9CisJCQorCQlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlczsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpbmRleCA9IDAsIGxlbmd0aCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJdHlwZURlY2wuc3VwZXJJbnRlcmZhY2VzKCkuYWRkKGNvbnZlcnQoc3VwZXJJbnRlcmZhY2VzW2luZGV4XSkpOworCQkJfQorCQl9CisJCWJ1aWxkQm9keURlY2xhcmF0aW9ucyh0eXBlRGVjbGFyYXRpb24sIHR5cGVEZWNsKTsKKwkJc2V0SmF2YURvY0NvbW1lbnQodHlwZURlY2wpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24pOworCQkJdHlwZURlY2wucmVzb2x2ZUJpbmRpbmcoKTsKKwkJfQorCQlyZXR1cm4gdHlwZURlY2w7CisJfQorCisJcHVibGljIFR5cGUgY29udmVydFR5cGUoVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKSB7CisJCVR5cGUgdHlwZSA9IG51bGw7CQkJCQorCQlpbnQgc291cmNlU3RhcnQgPSAtMTsKKwkJaW50IGxlbmd0aCA9IDA7CisJCWludCBkaW1lbnNpb25zID0gdHlwZVJlZmVyZW5jZS5kaW1lbnNpb25zKCk7CisJCWlmICh0eXBlUmVmZXJlbmNlIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJLy8gdGhpcyBpcyBlaXRoZXIgYW4gQXJyYXlUeXBlUmVmZXJlbmNlIG9yIGEgU2luZ2xlVHlwZVJlZmVyZW5jZQorCQkJY2hhcltdIG5hbWUgPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLmdldFR5cGVOYW1lKClbMF07CisJCQlzb3VyY2VTdGFydCA9IHR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQ7CisJCQlsZW5ndGggPSB0eXBlUmVmZXJlbmNlLnNvdXJjZUVuZCAtIHR5cGVSZWZlcmVuY2Uuc291cmNlU3RhcnQgKyAxOworCQkJaWYgKGRpbWVuc2lvbnMgIT0gMCkgeworCQkJCS8vIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlIG9mIHByaW1pdGl2ZSB0eXBlcyBvciBub3QKKwkJCQlpZiAoaXNQcmltaXRpdmVUeXBlKG5hbWUpKSB7CisJCQkJCWludCBlbmQgPSByZXRyaWV2ZVN0YXJ0aW5nTGVmdEJyYWNrZXRQb3NpdGlvbihzb3VyY2VTdGFydCwgc291cmNlU3RhcnQgKyBsZW5ndGgpOworCQkJCQlpZiAoZW5kID09IC0xKSB7CisJCQkJCQllbmQgPSBzb3VyY2VTdGFydCArIGxlbmd0aDsKKwkJCQkJfQkJCQkJCisJCQkJCVByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSA9IHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoZ2V0UHJpbWl0aXZlVHlwZUNvZGUobmFtZSkpOworCQkJCQlwcmltaXRpdmVUeXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBlbmQgLSBzb3VyY2VTdGFydCArIDEpOworCQkJCQl0eXBlID0gdGhpcy5hc3QubmV3QXJyYXlUeXBlKHByaW1pdGl2ZVR5cGUsIGRpbWVuc2lvbnMpOworCQkJCQl0eXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQkJCX0gZWxzZSB7CisJCQkJCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhuYW1lKSk7CisJCQkJCS8vIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJyYWNlIGluIG9yZGVyIHRvIHNldCB0aGUgcHJvcGVyIGxlbmd0aAorCQkJCQkvLyBQUiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzU5CisJCQkJCWludCBlbmQgPSByZXRyaWV2ZVN0YXJ0aW5nTGVmdEJyYWNrZXRQb3NpdGlvbihzb3VyY2VTdGFydCwgc291cmNlU3RhcnQgKyBsZW5ndGgpOworCQkJCQlpZiAoZW5kID09IC0xKSB7CisJCQkJCQllbmQgPSBzb3VyY2VTdGFydCArIGxlbmd0aCAtIDE7CisJCQkJCX0KKwkJCQkJc2ltcGxlTmFtZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgZW5kIC0gc291cmNlU3RhcnQgKyAxKTsKKwkJCQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gdGhpcy5hc3QubmV3U2ltcGxlVHlwZShzaW1wbGVOYW1lKTsKKwkJCQkJc2ltcGxlVHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgZW5kIC0gc291cmNlU3RhcnQgKyAxKTsKKwkJCQkJdHlwZSA9IHRoaXMuYXN0Lm5ld0FycmF5VHlwZShzaW1wbGVUeXBlLCBkaW1lbnNpb25zKTsKKwkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHNpbXBsZU5hbWUsIHR5cGVSZWZlcmVuY2UpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNQcmltaXRpdmVUeXBlKG5hbWUpKSB7CisJCQkJCXR5cGUgPSB0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKGdldFByaW1pdGl2ZVR5cGVDb2RlKG5hbWUpKTsKKwkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcobmFtZSkpOworCQkJCQlzaW1wbGVOYW1lLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQkJCQl0eXBlID0gdGhpcy5hc3QubmV3U2ltcGxlVHlwZShzaW1wbGVOYW1lKTsKKwkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHNpbXBsZU5hbWUsIHR5cGVSZWZlcmVuY2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJY2hhcltdW10gbmFtZSA9ICgoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgdHlwZVJlZmVyZW5jZSkuZ2V0VHlwZU5hbWUoKTsKKwkJCWludCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGg7CisJCQlsb25nW10gcG9zaXRpb25zID0gKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB0eXBlUmVmZXJlbmNlKS5zb3VyY2VQb3NpdGlvbnM7CisJCQlzb3VyY2VTdGFydCA9IChpbnQpKHBvc2l0aW9uc1swXT4+PjMyKTsKKwkJCWxlbmd0aCA9IChpbnQpKHBvc2l0aW9uc1tuYW1lTGVuZ3RoIC0gMV0gJiAweEZGRkZGRkZGKSAtIHNvdXJjZVN0YXJ0ICsgMTsKKwkJCWlmIChkaW1lbnNpb25zICE9IDApIHsKKwkJCQkvLyBuZWVkIHRvIGZpbmQgb3V0IGlmIHRoaXMgaXMgYW4gYXJyYXkgdHlwZSBvZiBwcmltaXRpdmUgdHlwZXMgb3Igbm90CisJCQkJTmFtZSBxdWFsaWZpZWROYW1lID0gdGhpcy5zZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyhuYW1lLCBwb3NpdGlvbnMsIHR5cGVSZWZlcmVuY2UpOworCQkJCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUocXVhbGlmaWVkTmFtZSk7CisJCQkJc2ltcGxlVHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCQl0eXBlID0gdGhpcy5hc3QubmV3QXJyYXlUeXBlKHNpbXBsZVR5cGUsIGRpbWVuc2lvbnMpOworCQkJCWludCBlbmQgPSByZXRyaWV2ZUVuZE9mRGltZW5zaW9uc1Bvc2l0aW9uKHNvdXJjZVN0YXJ0K2xlbmd0aCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCQlpZiAoZW5kICE9IC0xKSB7CisJCQkJCXR5cGUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCU5hbWUgcXVhbGlmaWVkTmFtZSA9IHRoaXMuc2V0UXVhbGlmaWVkTmFtZU5hbWVBbmRTb3VyY2VSYW5nZXMobmFtZSwgcG9zaXRpb25zLCB0eXBlUmVmZXJlbmNlKTsKKwkJCQl0eXBlID0gdGhpcy5hc3QubmV3U2ltcGxlVHlwZShxdWFsaWZpZWROYW1lKTsKKwkJCQl0eXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQkJfQorCQl9CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2Rlcyh0eXBlLCB0eXBlUmVmZXJlbmNlKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9CisJCQorCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBjb252ZXJ0KEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IHRoaXMuYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7CisJCS8qKgorCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjMzCisJCSAqIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIGJ1aWx0IG5vZGVzIHdpdGggaW52YWxpZCBtb2RpZmllcnMuCisJCSAqLworCQl0cnkgeworCQkJbWV0aG9kRGVjbC5zZXRNb2RpZmllcnMobWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZyk7CisJCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWludCBsZWdhbE1vZGlmaWVycyA9CisJCQkJTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLlBST1RFQ1RFRAorCQkJCXwgTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5TWU5DSFJPTklaRUQKKwkJCQl8IE1vZGlmaWVyLk5BVElWRSB8IE1vZGlmaWVyLkFCU1RSQUNUIHwgTW9kaWZpZXIuU1RSSUNURlA7CisJCQltZXRob2REZWNsLnNldE1vZGlmaWVycyhtZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBsZWdhbE1vZGlmaWVycyk7CisJCQltZXRob2REZWNsLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJfQorCQlib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCk7CisJCW1ldGhvZERlY2wuc2V0Q29uc3RydWN0b3IoaXNDb25zdHJ1Y3Rvcik7CisJCVNpbXBsZU5hbWUgbWV0aG9kTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhtZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvcikpOworCQltZXRob2ROYW1lLnNldFNvdXJjZVJhbmdlKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQltZXRob2REZWNsLnNldE5hbWUobWV0aG9kTmFtZSk7CisJCVR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKKwkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQkJaW50IHRocm93bkV4Y2VwdGlvbnNMZW5ndGggPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3duRXhjZXB0aW9uc0xlbmd0aDsgaSsrKSB7CisJCQkJbWV0aG9kRGVjbC50aHJvd25FeGNlcHRpb25zKCkuYWRkKGNvbnZlcnQodGhyb3duRXhjZXB0aW9uc1tpXSkpOworCQkJfQorCQl9CisJCUFyZ3VtZW50W10gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmFyZ3VtZW50czsKKwkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJaW50IHBhcmFtZXRlcnNMZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyc0xlbmd0aDsgaSsrKSB7CisJCQkJbWV0aG9kRGVjbC5wYXJhbWV0ZXJzKCkuYWRkKGNvbnZlcnQocGFyYW1ldGVyc1tpXSkpOworCQkJfQorCQl9CisJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gbnVsbDsKKwkJaWYgKGlzQ29uc3RydWN0b3IpIHsKKwkJCS8vIHNldCB0aGUgcmV0dXJuIHR5cGUgdG8gVk9JRAorCQkJbWV0aG9kRGVjbC5zZXRSZXR1cm5UeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5WT0lEKSk7CisJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb247CisJCQlleHBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uY29uc3RydWN0b3JDYWxsOworCQl9IGVsc2UgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb247CisJCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWZlcmVuY2UgPSBtZXRob2QucmV0dXJuVHlwZTsKKwkJCWlmICh0eXBlUmVmZXJlbmNlICE9IG51bGwpIHsKKwkJCQltZXRob2REZWNsLnNldFJldHVyblR5cGUoY29udmVydFR5cGUodHlwZVJlZmVyZW5jZSkpOworCQkJfQorCQl9CisJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJaW50IGRlY2xhcmF0aW9uU291cmNlRW5kID0gbWV0aG9kRGVjbGFyYXRpb24uYm9keUVuZDsKKwkJbWV0aG9kRGVjbC5zZXRTb3VyY2VSYW5nZShkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBkZWNsYXJhdGlvblNvdXJjZUVuZCAtIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKKwkJcmV0cmlldmVSaWdodEJyYWNlT3JTZW1pQ29sb25Qb3NpdGlvbihtZXRob2REZWNsKTsKKwkJCisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50W10gc3RhdGVtZW50cyA9IG1ldGhvZERlY2xhcmF0aW9uLnN0YXRlbWVudHM7CisJCQorCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsIHx8IGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKKwkJCUJsb2NrIGJsb2NrID0gdGhpcy5hc3QubmV3QmxvY2soKTsKKwkJCWludCBzdGFydCA9IHJldHJpZXZlU3RhcnRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBkZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCQlpbnQgZW5kID0gcmV0cmlldmVFbmRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGgpOworCQkJYmxvY2suc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQlpZiAoZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgeworCQkJCWJsb2NrLnN0YXRlbWVudHMoKS5hZGQoY29udmVydChleHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkpOworCQkJfQorCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBzdGF0ZW1lbnRzID09IG51bGwgPyAwIDogc3RhdGVtZW50cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHNMZW5ndGg7IGkrKykgeworCQkJCWlmIChzdGF0ZW1lbnRzW2ldIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkJCQljaGVja0FuZEFkZE11bHRpcGxlTG9jYWxEZWNsYXJhdGlvbihzdGF0ZW1lbnRzLCBpLCBibG9jay5zdGF0ZW1lbnRzKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWJsb2NrLnN0YXRlbWVudHMoKS5hZGQoY29udmVydChzdGF0ZW1lbnRzW2ldKSk7CisJCQkJfQorCQkJfQorCQkJbWV0aG9kRGVjbC5zZXRCb2R5KGJsb2NrKTsKKwkJfSBlbHNlIGlmICghbWV0aG9kRGVjbGFyYXRpb24uaXNOYXRpdmUoKSAmJiAhbWV0aG9kRGVjbGFyYXRpb24uaXNBYnN0cmFjdCgpKSB7CisJCQlpbnQgc3RhcnQgPSByZXRyaWV2ZVN0YXJ0QmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJaW50IGVuZCA9IHJldHJpZXZlRW5kQmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCWlmIChzdGFydCAhPSAtMSAmJiBlbmQgIT0gLTEpIHsKKwkJCQkvKgorCQkJCSAqIHN0YXJ0IG9yIGVuZCBjYW4gYmUgZXF1YWwgdG8gLTEgaWYgd2UgaGF2ZSBhbiBpbnRlcmZhY2UncyBtZXRob2QuCisJCQkJICovCisJCQkJQmxvY2sgYmxvY2sgPSB0aGlzLmFzdC5uZXdCbG9jaygpOworCQkJCWJsb2NrLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQkJCW1ldGhvZERlY2wuc2V0Qm9keShibG9jayk7CisJCQl9CisJCX0KKwkJc2V0SmF2YURvY0NvbW1lbnQobWV0aG9kRGVjbCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMobWV0aG9kRGVjbCwgbWV0aG9kRGVjbGFyYXRpb24pOworCQkJbWV0aG9kRGVjbC5yZXNvbHZlQmluZGluZygpOworCQl9CisJCXJldHVybiBtZXRob2REZWNsOworCX0JCisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChjaGVja0ZvclBhcmVudGhlc2lzKGV4cHJlc3Npb24pKSB7CisJCQlyZXR1cm4gY29udmVydFRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0KKwkJLy8gc3dpdGNoIGJldHdlZW4gYWxsIHR5cGVzIG9mIGV4cHJlc3Npb24KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgeworCQkJcmV0dXJuIGNvbnZlcnQoKFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyKSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUHJlZml4RXhwcmVzc2lvbikgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUHJlZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBvc3RmaXhFeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Qb3N0Zml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3VuZEFzc2lnbm1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChDb21wb3VuZEFzc2lnbm1lbnQpIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50KSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50KSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsYXNzTGl0ZXJhbEFjY2VzcykgeworCQkJcmV0dXJuIGNvbnZlcnQoKENsYXNzTGl0ZXJhbEFjY2VzcykgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBGYWxzZUxpdGVyYWwpIHsKKwkJCXJldHVybiBjb252ZXJ0KChGYWxzZUxpdGVyYWwpIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVHJ1ZUxpdGVyYWwpIHsKKwkJCXJldHVybiBjb252ZXJ0KChUcnVlTGl0ZXJhbCkgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk51bGxMaXRlcmFsKSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OdWxsTGl0ZXJhbCkgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDaGFyTGl0ZXJhbCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKENoYXJMaXRlcmFsKSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIERvdWJsZUxpdGVyYWwpIHsKKwkJCXJldHVybiBjb252ZXJ0KChEb3VibGVMaXRlcmFsKSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZsb2F0TGl0ZXJhbCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKEZsb2F0TGl0ZXJhbCkgZXhwcmVzc2lvbik7CisJCX0KKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbnRMaXRlcmFsTWluVmFsdWUpIHsKKwkJCXJldHVybiBjb252ZXJ0KChJbnRMaXRlcmFsTWluVmFsdWUpIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSW50TGl0ZXJhbCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKEludExpdGVyYWwpIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTG9uZ0xpdGVyYWxNaW5WYWx1ZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKExvbmdMaXRlcmFsTWluVmFsdWUpIGV4cHJlc3Npb24pOworCQl9CQkJCQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIExvbmdMaXRlcmFsKSB7CisJCQlyZXR1cm4gY29udmVydCgoTG9uZ0xpdGVyYWwpIGV4cHJlc3Npb24pOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHRlbmRlZFN0cmluZ0xpdGVyYWwpIHsKKwkJCXJldHVybiBjb252ZXJ0KChFeHRlbmRlZFN0cmluZ0xpdGVyYWwpIGV4cHJlc3Npb24pOworCQl9CQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbCkgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQU5EX0FORF9FeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoQU5EX0FORF9FeHByZXNzaW9uKSBleHByZXNzaW9uKTsKKwkJfQkJCQkKKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBPUl9PUl9FeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoT1JfT1JfRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgRXF1YWxFeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoRXF1YWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKKwkJfQkJCQkKKwkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gY29udmVydCgoQmluYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbnN0YW5jZU9mRXhwcmVzc2lvbikgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5zdGFuY2VPZkV4cHJlc3Npb24pIGV4cHJlc3Npb24pOworCQl9CQkJCQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFVuYXJ5RXhwcmVzc2lvbikgeworCQkJcmV0dXJuIGNvbnZlcnQoKFVuYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25kaXRpb25hbEV4cHJlc3Npb24pIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbikgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChNZXNzYWdlU2VuZCkgZXhwcmVzc2lvbik7CisJCX0JCQkJCisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gY29udmVydCgoUmVmZXJlbmNlKSBleHByZXNzaW9uKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpIHsKKwkJCXJldHVybiBjb252ZXJ0KChUeXBlUmVmZXJlbmNlKSBleHByZXNzaW9uKTsKKwkJfQkJCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZDogY29udmVydCgiICsgZXhwcmVzc2lvbi5nZXRDbGFzcygpICsgIikiKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCX0KKworCXB1YmxpYyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjb252ZXJ0VG9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMocGFyZW50aGVzaXplZEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCXBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOworCQlhZGp1c3RTb3VyY2VQb3NpdGlvbnNGb3JQYXJlbnQoZXhwcmVzc2lvbik7CisJCXBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLnNldEV4cHJlc3Npb24oY29udmVydChleHByZXNzaW9uKSk7CisJCXJldHVybiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKKwl9CisJCisJcHVibGljIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjb252ZXJ0KEFsbG9jYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNsYXNzSW5zdGFuY2VDcmVhdGlvbiA9IHRoaXMuYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGNsYXNzSW5zdGFuY2VDcmVhdGlvbiwgZXhwcmVzc2lvbik7CisJCX0KKwkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldE5hbWUoY29udmVydChleHByZXNzaW9uLnR5cGUpKTsKKwkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBleHByZXNzaW9uLmFyZ3VtZW50czsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uYXJndW1lbnRzKCkuYWRkKGNvbnZlcnQoYXJndW1lbnRzW2ldKSk7CisJCQl9CisJCX0KKwkJcmVtb3ZlVHJhaWxpbmdDb21tZW50RnJvbUV4cHJlc3Npb25FbmRpbmdXaXRoQVBhcmVuKGNsYXNzSW5zdGFuY2VDcmVhdGlvbik7CisJCXJldHVybiBjbGFzc0luc3RhbmNlQ3JlYXRpb247CisJfQorCQorCXB1YmxpYyBDbGFzc0luc3RhbmNlQ3JlYXRpb24gY29udmVydChBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBleHByZXNzaW9uKSB7CisJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSB0aGlzLmFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKKwkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldE5hbWUoY29udmVydChleHByZXNzaW9uLmFsbG9jYXRpb24udHlwZSkpOworCQlpZiAoZXhwcmVzc2lvbi5hbGxvY2F0aW9uLmVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKKwkJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi5hbGxvY2F0aW9uLmVuY2xvc2luZ0luc3RhbmNlKSk7CisJCX0KKwkJaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBleHByZXNzaW9uLmFsbG9jYXRpb24uc291cmNlU3RhcnQ7CisJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXRTb3VyY2VSYW5nZShkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLmJvZHlFbmQgLSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbltdIGFyZ3VtZW50cyA9IGV4cHJlc3Npb24uYWxsb2NhdGlvbi5hcmd1bWVudHM7CisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLmFyZ3VtZW50cygpLmFkZChjb252ZXJ0KGFyZ3VtZW50c1tpXSkpOworCQkJfQorCQl9CisJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKKwkJaW50IHN0YXJ0ID0gcmV0cmlldmVTdGFydEJsb2NrUG9zaXRpb24oZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5ib2R5RW5kKTsKKwkJYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5zZXRTb3VyY2VSYW5nZShzdGFydCwgZXhwcmVzc2lvbi5ib2R5RW5kIC0gc3RhcnQgKyAxKTsKKwkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbik7CisJCWJ1aWxkQm9keURlY2xhcmF0aW9ucyhleHByZXNzaW9uLCBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2RlcyhjbGFzc0luc3RhbmNlQ3JlYXRpb24sIGV4cHJlc3Npb24pOworCQkJcmVjb3JkTm9kZXMoYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiwgZXhwcmVzc2lvbik7CisJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7CisJCX0KKwkJcmV0dXJuIGNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKKwl9CisKKwlwcml2YXRlIHZvaWQgYnVpbGRCb2R5RGVjbGFyYXRpb25zKEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGV4cHJlc3Npb24sIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikgeworCQkvLyBhZGQgYm9keSBkZWNsYXJhdGlvbiBpbiB0aGUgbGV4aWNhbCBvcmRlcgorCQlNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJzID0gZXhwcmVzc2lvbi5tZW1iZXJUeXBlczsKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uW10gZmllbGRzID0gZXhwcmVzc2lvbi5maWVsZHM7CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gZXhwcmVzc2lvbi5tZXRob2RzOworCQkKKwkJaW50IGZpZWxkc0xlbmd0aCA9IGZpZWxkcyA9PSBudWxsPyAwIDogZmllbGRzLmxlbmd0aDsKKwkJaW50IG1ldGhvZHNMZW5ndGggPSBtZXRob2RzID09IG51bGw/IDAgOiBtZXRob2RzLmxlbmd0aDsKKwkJaW50IG1lbWJlcnNMZW5ndGggPSBtZW1iZXJzID09IG51bGwgPyAwIDogbWVtYmVycy5sZW5ndGg7CisJCWludCBmaWVsZHNJbmRleCA9IDA7CisJCWludCBtZXRob2RzSW5kZXggPSAwOworCQlpbnQgbWVtYmVyc0luZGV4ID0gMDsKKwkJCisJCXdoaWxlICgoZmllbGRzSW5kZXggPCBmaWVsZHNMZW5ndGgpCisJCQl8fCAobWVtYmVyc0luZGV4IDwgbWVtYmVyc0xlbmd0aCkKKwkJCXx8IChtZXRob2RzSW5kZXggPCBtZXRob2RzTGVuZ3RoKSkgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIG5leHRGaWVsZERlY2xhcmF0aW9uID0gbnVsbDsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbmV4dE1ldGhvZERlY2xhcmF0aW9uID0gbnVsbDsKKwkJCU1lbWJlclR5cGVEZWNsYXJhdGlvbiBuZXh0TWVtYmVyRGVjbGFyYXRpb24gPSBudWxsOworCQkKKwkJCWludCBwb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCQkJaW50IG5leHREZWNsYXJhdGlvblR5cGUgPSAtMTsKKwkJCWlmIChmaWVsZHNJbmRleCA8IGZpZWxkc0xlbmd0aCkgeworCQkJCW5leHRGaWVsZERlY2xhcmF0aW9uID0gZmllbGRzW2ZpZWxkc0luZGV4XTsKKwkJCQlpZiAobmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJCXBvc2l0aW9uID0gbmV4dEZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDA7IC8vIEZJRUxECisJCQkJfQorCQkJfQorCQkJaWYgKG1ldGhvZHNJbmRleCA8IG1ldGhvZHNMZW5ndGgpIHsKKwkJCQluZXh0TWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RzW21ldGhvZHNJbmRleF07CisJCQkJaWYgKG5leHRNZXRob2REZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDwgcG9zaXRpb24pIHsKKwkJCQkJcG9zaXRpb24gPSBuZXh0TWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKKwkJCQkJbmV4dERlY2xhcmF0aW9uVHlwZSA9IDE7IC8vIE1FVEhPRAorCQkJCX0KKwkJCX0KKwkJCWlmIChtZW1iZXJzSW5kZXggPCBtZW1iZXJzTGVuZ3RoKSB7CisJCQkJbmV4dE1lbWJlckRlY2xhcmF0aW9uID0gbWVtYmVyc1ttZW1iZXJzSW5kZXhdOworCQkJCWlmIChuZXh0TWVtYmVyRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8IHBvc2l0aW9uKSB7CisJCQkJCXBvc2l0aW9uID0gbmV4dE1lbWJlckRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQ7CisJCQkJCW5leHREZWNsYXJhdGlvblR5cGUgPSAyOyAvLyBNRU1CRVIKKwkJCQl9CisJCQl9CisJCQlzd2l0Y2ggKG5leHREZWNsYXJhdGlvblR5cGUpIHsKKwkJCQljYXNlIDAgOgorCQkJCQljaGVja0FuZEFkZE11bHRpcGxlRmllbGREZWNsYXJhdGlvbihmaWVsZHMsIGZpZWxkc0luZGV4LCBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKSk7CisJCQkJCWZpZWxkc0luZGV4Kys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMSA6CisJCQkJCW1ldGhvZHNJbmRleCsrOworCQkJCQlpZiAoIW5leHRNZXRob2REZWNsYXJhdGlvbi5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpICYmICFuZXh0TWV0aG9kRGVjbGFyYXRpb24uaXNDbGluaXQoKSkgeworCQkJCQkJYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGNvbnZlcnQobmV4dE1ldGhvZERlY2xhcmF0aW9uKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyIDoKKwkJCQkJbWVtYmVyc0luZGV4Kys7CisJCQkJCWFub255bW91c0NsYXNzRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLmFkZChjb252ZXJ0KG5leHRNZW1iZXJEZWNsYXJhdGlvbikpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEFycmF5Q3JlYXRpb24gY29udmVydChBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gdGhpcy5hc3QubmV3QXJyYXlDcmVhdGlvbigpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGFycmF5Q3JlYXRpb24sIGV4cHJlc3Npb24pOworCQl9CisJCWFycmF5Q3JlYXRpb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbltdIGRpbWVuc2lvbnMgPSBleHByZXNzaW9uLmRpbWVuc2lvbnM7CisJCQorCQlpbnQgZGltZW5zaW9uc0xlbmd0aCA9IGRpbWVuc2lvbnMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnNMZW5ndGg7IGkrKykgeworCQkJaWYgKGRpbWVuc2lvbnNbaV0gIT0gbnVsbCkgeworCQkJCUV4cHJlc3Npb24gZGltZW5zaW9uID0gY29udmVydChkaW1lbnNpb25zW2ldKTsKKwkJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQkJcmVjb3JkTm9kZXMoZGltZW5zaW9uLCBkaW1lbnNpb25zW2ldKTsKKwkJCQl9CisJCQkJYXJyYXlDcmVhdGlvbi5kaW1lbnNpb25zKCkuYWRkKGRpbWVuc2lvbik7CisJCQl9CisJCX0KKwkJVHlwZSB0eXBlID0gY29udmVydFR5cGUoZXhwcmVzc2lvbi50eXBlKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2Rlcyh0eXBlLCBleHByZXNzaW9uLnR5cGUpOworCQl9CQkKKwkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IG51bGw7CisJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCWFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisJCX0gZWxzZSB7CisJCQlhcnJheVR5cGUgPSB0aGlzLmFzdC5uZXdBcnJheVR5cGUodHlwZSwgZGltZW5zaW9uc0xlbmd0aCk7CisJCQlpbnQgc3RhcnQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCWludCBlbmQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKSArIHR5cGUuZ2V0TGVuZ3RoKCk7CisJCQlpbnQgcHJldmlvdXNTZWFyY2hTdGFydCA9IGVuZDsKKwkJCUFycmF5VHlwZSBjb21wb25lbnRUeXBlID0gKEFycmF5VHlwZSkgdHlwZS5nZXRQYXJlbnQoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uc0xlbmd0aDsgaSsrKSB7CisJCQkJcHJldmlvdXNTZWFyY2hTdGFydCA9IHJldHJpZXZlUmlnaHRCcmFja2V0UG9zaXRpb24ocHJldmlvdXNTZWFyY2hTdGFydCArIDEsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCk7CisJCQkJY29tcG9uZW50VHlwZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgcHJldmlvdXNTZWFyY2hTdGFydCAtIHN0YXJ0ICsgMSk7CisJCQkJY29tcG9uZW50VHlwZSA9IChBcnJheVR5cGUpIGNvbXBvbmVudFR5cGUuZ2V0UGFyZW50KCk7CisJCQl9CisJCX0KKwkJYXJyYXlDcmVhdGlvbi5zZXRUeXBlKGFycmF5VHlwZSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoYXJyYXlUeXBlLCBleHByZXNzaW9uKTsKKwkJfQkKKwkJaWYgKGV4cHJlc3Npb24uaW5pdGlhbGl6ZXIgIT0gbnVsbCkgeworCQkJYXJyYXlDcmVhdGlvbi5zZXRJbml0aWFsaXplcihjb252ZXJ0KGV4cHJlc3Npb24uaW5pdGlhbGl6ZXIpKTsKKwkJfQorCQlpZiAoZXhwcmVzc2lvbi5pbml0aWFsaXplciAhPSBudWxsKSB7CisJCQlhcnJheUNyZWF0aW9uLnNldEluaXRpYWxpemVyKGNvbnZlcnQoZXhwcmVzc2lvbi5pbml0aWFsaXplcikpOworCQl9CisJCXJldHVybiBhcnJheUNyZWF0aW9uOworCX0KKworCXB1YmxpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGNvbnZlcnQoQXJndW1lbnQgYXJndW1lbnQpIHsKKwkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZURlY2wgPSB0aGlzLmFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7CisJCS8qKgorCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjMzCisJCSAqIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIGJ1aWx0IG5vZGVzIHdpdGggaW52YWxpZCBtb2RpZmllcnMuCisJCSAqLworCQl0cnkgeworCQkJdmFyaWFibGVEZWNsLnNldE1vZGlmaWVycyhhcmd1bWVudC5tb2RpZmllcnMpOworCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlpbnQgbGVnYWxNb2RpZmllcnMgPQorCQkJCU1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5QUk9URUNURUQKKwkJCQl8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuVk9MQVRJTEUKKwkJCQl8IE1vZGlmaWVyLlRSQU5TSUVOVDsKKwkJCXZhcmlhYmxlRGVjbC5zZXRNb2RpZmllcnMoYXJndW1lbnQubW9kaWZpZXJzICYgbGVnYWxNb2RpZmllcnMpOworCQkJdmFyaWFibGVEZWNsLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJfQorCQkKKwkJdmFyaWFibGVEZWNsLnNldE1vZGlmaWVycyhhcmd1bWVudC5tb2RpZmllcnMpOworCQlTaW1wbGVOYW1lIG5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKGFyZ3VtZW50Lm5hbWUoKSk7CisJCW5hbWUuc2V0U291cmNlUmFuZ2UoYXJndW1lbnQuc291cmNlU3RhcnQsIGFyZ3VtZW50LnNvdXJjZUVuZCAtIGFyZ3VtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCXZhcmlhYmxlRGVjbC5zZXROYW1lKG5hbWUpOworCQlUeXBlIHR5cGUgPSBjb252ZXJ0VHlwZShhcmd1bWVudC50eXBlKTsKKwkJdmFyaWFibGVEZWNsLnNldFR5cGUodHlwZSk7CisJCWludCB0eXBlRW5kID0gdHlwZS5nZXRTdGFydFBvc2l0aW9uKCkgKyB0eXBlLmdldExlbmd0aCgpIC0gMTsKKwkJaW50IHJpZ2h0RW5kID0gTWF0aC5tYXgodHlwZUVuZCwgYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQl2YXJpYWJsZURlY2wuc2V0U291cmNlUmFuZ2UoYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgcmlnaHRFbmQgLSBhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMobmFtZSwgYXJndW1lbnQpOworCQkJcmVjb3JkTm9kZXModmFyaWFibGVEZWNsLCBhcmd1bWVudCk7CisJCQl2YXJpYWJsZURlY2wucmVzb2x2ZUJpbmRpbmcoKTsKKwkJfQorCQlyZXR1cm4gdmFyaWFibGVEZWNsOworCX0KKworCXB1YmxpYyBBcnJheUluaXRpYWxpemVyIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyIGV4cHJlc3Npb24pIHsKKwkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gdGhpcy5hc3QubmV3QXJyYXlJbml0aWFsaXplcigpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGFycmF5SW5pdGlhbGl6ZXIsIGV4cHJlc3Npb24pOworCQl9CisJCWFycmF5SW5pdGlhbGl6ZXIuc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zID0gZXhwcmVzc2lvbi5leHByZXNzaW9uczsKKwkJaWYgKGV4cHJlc3Npb25zICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSBleHByZXNzaW9ucy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJRXhwcmVzc2lvbiBleHByID0gY29udmVydChleHByZXNzaW9uc1tpXSk7CisJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCXJlY29yZE5vZGVzKGV4cHIsIGV4cHJlc3Npb25zW2ldKTsKKwkJCQl9CisJCQkJYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChleHByKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24uYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gY29udmVydCgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIGV4cHJlc3Npb24uYW5vbnltb3VzVHlwZSk7CisJCX0gZWxzZSB7CisJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gdGhpcy5hc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7CisJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0RXhwcmVzc2lvbihjb252ZXJ0KGV4cHJlc3Npb24uZW5jbG9zaW5nSW5zdGFuY2UpKTsKKwkJCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXROYW1lKGNvbnZlcnQoZXhwcmVzc2lvbi50eXBlKSk7CisJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBleHByZXNzaW9uLmFyZ3VtZW50czsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IGNvbnZlcnQoYXJndW1lbnRzW2ldKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQlyZWNvcmROb2Rlcyhhcmd1bWVudCwgYXJndW1lbnRzW2ldKTsKKwkJCQkJfQorCQkJCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uYXJndW1lbnRzKCkuYWRkKGFyZ3VtZW50KTsKKwkJCQl9CisJCQl9CisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhjbGFzc0luc3RhbmNlQ3JlYXRpb24sIGV4cHJlc3Npb24pOworCQkJfQorCQkJcmVtb3ZlVHJhaWxpbmdDb21tZW50RnJvbUV4cHJlc3Npb25FbmRpbmdXaXRoQVBhcmVuKGNsYXNzSW5zdGFuY2VDcmVhdGlvbik7CisJCQlyZXR1cm4gY2xhc3NJbnN0YW5jZUNyZWF0aW9uOworCQl9CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50IGV4cHJlc3Npb24pIHsKKwkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5hc3QubmV3QXNzaWdubWVudCgpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKGFzc2lnbm1lbnQsIGV4cHJlc3Npb24pOworCQl9CisJCUV4cHJlc3Npb24gbGhzID0gY29udmVydChleHByZXNzaW9uLmxocyk7CisJCWFzc2lnbm1lbnQuc2V0TGVmdEhhbmRTaWRlKGxocyk7CisJCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5BU1NJR04pOworCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUoY29udmVydChleHByZXNzaW9uLmV4cHJlc3Npb24pKTsKKwkJaW50IHN0YXJ0ID0gbGhzLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJYXNzaWdubWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBzdGFydCArIDEpOworCQlyZXR1cm4gYXNzaWdubWVudDsKKwl9CisKKwlwdWJsaWMgQXNzaWdubWVudCBjb252ZXJ0KENvbXBvdW5kQXNzaWdubWVudCBleHByZXNzaW9uKSB7CisJCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKKwkJRXhwcmVzc2lvbiBsaHMgPSBjb252ZXJ0KGV4cHJlc3Npb24ubGhzKTsKKwkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUobGhzKTsKKwkJaW50IHN0YXJ0ID0gbGhzLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJYXNzaWdubWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBzdGFydCArIDEpOworCQlzd2l0Y2ggKGV4cHJlc3Npb24ub3BlcmF0b3IpIHsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuUExVUyA6CisJCQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLlBMVVNfQVNTSUdOKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuTUlOVVMgOgorCQkJCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5NSU5VU19BU1NJR04pOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5NVUxUSVBMWSA6CisJCQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLlRJTUVTX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLkRJVklERSA6CisJCQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLkRJVklERV9BU1NJR04pOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5BTkQgOgorCQkJCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5CSVRfQU5EX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLk9SIDoKKwkJCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuQklUX09SX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLlhPUiA6CisJCQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLkJJVF9YT1JfQVNTSUdOKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuUkVNQUlOREVSIDoKKwkJCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUkVNQUlOREVSX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLkxFRlRfU0hJRlQgOgorCQkJCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5MRUZUX1NISUZUX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLlJJR0hUX1NISUZUIDoKKwkJCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEX0FTU0lHTik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUIDoKKwkJCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfQVNTSUdOKTsKKwkJCQlicmVhazsKKwkJfTsKKwkJYXNzaWdubWVudC5zZXRSaWdodEhhbmRTaWRlKGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKSk7CisJCXJldHVybiBhc3NpZ25tZW50OworCX0KKworCXB1YmxpYyBQcmVmaXhFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5QcmVmaXhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UHJlZml4RXhwcmVzc2lvbigpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHByZWZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCXByZWZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZChjb252ZXJ0KGV4cHJlc3Npb24ubGhzKSk7CisJCXN3aXRjaCAoZXhwcmVzc2lvbi5vcGVyYXRvcikgeworCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlByZWZpeEV4cHJlc3Npb24uUExVUyA6CisJCQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUHJlZml4RXhwcmVzc2lvbi5NSU5VUyA6CisJCQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkRFQ1JFTUVOVCk7CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHByZWZpeEV4cHJlc3Npb247CisJfQorCisJcHVibGljIFBvc3RmaXhFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Qb3N0Zml4RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2Rlcyhwb3N0Zml4RXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CisJCX0KKwkJcG9zdGZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCXBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQoY29udmVydChleHByZXNzaW9uLmxocykpOworCQlzd2l0Y2ggKGV4cHJlc3Npb24ub3BlcmF0b3IpIHsKKwkJCWNhc2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Qb3N0Zml4RXhwcmVzc2lvbi5QTFVTIDoKKwkJCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlBvc3RmaXhFeHByZXNzaW9uLk1JTlVTIDoKKwkJCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5ERUNSRU1FTlQpOworCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBwb3N0Zml4RXhwcmVzc2lvbjsKKwl9CisKKwlwdWJsaWMgQ2FzdEV4cHJlc3Npb24gY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOworCQljYXN0RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIHR5cGUgPSBleHByZXNzaW9uLnR5cGU7CisJCWlmICh0eXBlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSApIHsKKwkJCWNhc3RFeHByZXNzaW9uLnNldFR5cGUoY29udmVydFR5cGUoKFR5cGVSZWZlcmVuY2UpZXhwcmVzc2lvbi50eXBlKSk7CisJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKKwkJCWNhc3RFeHByZXNzaW9uLnNldFR5cGUoY29udmVydFRvVHlwZSgoTmFtZVJlZmVyZW5jZSlleHByZXNzaW9uLnR5cGUpKTsKKwkJfQorCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoY2FzdEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCXJldHVybiBjYXN0RXhwcmVzc2lvbjsKKwl9CisJCQorCXB1YmxpYyBUeXBlIGNvbnZlcnRUb1R5cGUoTmFtZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJTmFtZSBuYW1lID0gY29udmVydChyZWZlcmVuY2UpOworCQlTaW1wbGVUeXBlIHR5cGUgPSB0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpOworCQl0eXBlLnNldFNvdXJjZVJhbmdlKG5hbWUuZ2V0U3RhcnRQb3NpdGlvbigpLCBuYW1lLmdldExlbmd0aCgpKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKHR5cGUsIHJlZmVyZW5jZSk7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoQ2xhc3NMaXRlcmFsQWNjZXNzIGV4cHJlc3Npb24pIHsKKwkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSB0aGlzLmFzdC5uZXdUeXBlTGl0ZXJhbCgpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXRoaXMucmVjb3JkTm9kZXModHlwZUxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCXR5cGVMaXRlcmFsLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOworCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKGNvbnZlcnRUeXBlKGV4cHJlc3Npb24udHlwZSkpOworCQlyZXR1cm4gdHlwZUxpdGVyYWw7CisJfQorCisJcHVibGljIEJvb2xlYW5MaXRlcmFsIGNvbnZlcnQoRmFsc2VMaXRlcmFsIGV4cHJlc3Npb24pIHsKKwkJQm9vbGVhbkxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKGZhbHNlKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCXJldHVybiBsaXRlcmFsOwkKKwl9CisJCQorCXB1YmxpYyBCb29sZWFuTGl0ZXJhbCBjb252ZXJ0KFRydWVMaXRlcmFsIGV4cHJlc3Npb24pIHsKKwkJQm9vbGVhbkxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXRoaXMucmVjb3JkTm9kZXMobGl0ZXJhbCwgZXhwcmVzc2lvbik7CisJCX0KKwkJbGl0ZXJhbC5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKKwkJcmV0dXJuIGxpdGVyYWw7CQkKKwl9CisJCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTnVsbExpdGVyYWwgZXhwcmVzc2lvbikgeworCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bGxMaXRlcmFsKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2RlcyhsaXRlcmFsLCBleHByZXNzaW9uKTsKKwkJfQorCQlsaXRlcmFsLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOworCQlyZXR1cm4gbGl0ZXJhbDsJCQorCX0KKworCXB1YmxpYyBDaGFyYWN0ZXJMaXRlcmFsIGNvbnZlcnQoQ2hhckxpdGVyYWwgZXhwcmVzc2lvbikgeworCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBzb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CisJCWNoYXJbXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLCBzb3VyY2VTdGFydCwgdG9rZW5zLCAwLCBsZW5ndGgpOworCQlDaGFyYWN0ZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2RlcyhsaXRlcmFsLCBleHByZXNzaW9uKTsKKwkJfQorCQlsaXRlcmFsLnNldEVzY2FwZWRWYWx1ZShuZXcgU3RyaW5nKHRva2VucykpOworCQlsaXRlcmFsLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQlyZW1vdmVMZWFkaW5nQW5kVHJhaWxpbmdDb21tZW50c0Zyb21MaXRlcmFsKGxpdGVyYWwpOworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwlwdWJsaWMgTnVtYmVyTGl0ZXJhbCBjb252ZXJ0KERvdWJsZUxpdGVyYWwgZXhwcmVzc2lvbikgeworCQlpbnQgbGVuZ3RoID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMTsJCisJCWludCBzb3VyY2VTdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CisJCWNoYXJbXSB0b2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLCBzb3VyY2VTdGFydCwgdG9rZW5zLCAwLCBsZW5ndGgpOworCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKG5ldyBTdHJpbmcodG9rZW5zKSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2RlcyhsaXRlcmFsLCBleHByZXNzaW9uKTsKKwkJfQorCQlsaXRlcmFsLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOworCQlyZW1vdmVMZWFkaW5nQW5kVHJhaWxpbmdDb21tZW50c0Zyb21MaXRlcmFsKGxpdGVyYWwpOworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwlwdWJsaWMgTnVtYmVyTGl0ZXJhbCBjb252ZXJ0KEZsb2F0TGl0ZXJhbCBleHByZXNzaW9uKSB7CisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IHNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwkJY2hhcltdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwobmV3IFN0cmluZyh0b2tlbnMpKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CisJCXJlbW92ZUxlYWRpbmdBbmRUcmFpbGluZ0NvbW1lbnRzRnJvbUxpdGVyYWwobGl0ZXJhbCk7CisJCXJldHVybiBsaXRlcmFsOworCX0KKworCXB1YmxpYyBOdW1iZXJMaXRlcmFsIGNvbnZlcnQoSW50TGl0ZXJhbCBleHByZXNzaW9uKSB7CisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IHNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwkJY2hhcltdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwobmV3IFN0cmluZyh0b2tlbnMpKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CisJCXJlbW92ZUxlYWRpbmdBbmRUcmFpbGluZ0NvbW1lbnRzRnJvbUxpdGVyYWwobGl0ZXJhbCk7CisJCXJldHVybiBsaXRlcmFsOworCX0KKworCXB1YmxpYyBOdW1iZXJMaXRlcmFsIGNvbnZlcnQoSW50TGl0ZXJhbE1pblZhbHVlIGV4cHJlc3Npb24pIHsKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CQorCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OworCQljaGFyW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSwgc291cmNlU3RhcnQsIHRva2VucywgMCwgbGVuZ3RoKTsKKwkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbChuZXcgU3RyaW5nKHRva2VucykpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXRoaXMucmVjb3JkTm9kZXMobGl0ZXJhbCwgZXhwcmVzc2lvbik7CisJCX0KKwkJbGl0ZXJhbC5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgbGVuZ3RoKTsKKwkJcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nQ29tbWVudHNGcm9tTGl0ZXJhbChsaXRlcmFsKTsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCisJcHVibGljIE51bWJlckxpdGVyYWwgY29udmVydChMb25nTGl0ZXJhbCBleHByZXNzaW9uKSB7CisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IHNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwkJY2hhcltdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwobmV3IFN0cmluZyh0b2tlbnMpKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CisJCXJlbW92ZUxlYWRpbmdBbmRUcmFpbGluZ0NvbW1lbnRzRnJvbUxpdGVyYWwobGl0ZXJhbCk7CisJCXJldHVybiBsaXRlcmFsOworCX0KKworCXB1YmxpYyBOdW1iZXJMaXRlcmFsIGNvbnZlcnQoTG9uZ0xpdGVyYWxNaW5WYWx1ZSBleHByZXNzaW9uKSB7CisJCWludCBsZW5ndGggPSBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxOwkKKwkJaW50IHNvdXJjZVN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwkJY2hhcltdIHRva2VucyA9IG5ldyBjaGFyW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UsIHNvdXJjZVN0YXJ0LCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwobmV3IFN0cmluZyh0b2tlbnMpKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKGxpdGVyYWwsIGV4cHJlc3Npb24pOworCQl9CisJCWxpdGVyYWwuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CisJCXJlbW92ZUxlYWRpbmdBbmRUcmFpbGluZ0NvbW1lbnRzRnJvbUxpdGVyYWwobGl0ZXJhbCk7CisJCXJldHVybiBsaXRlcmFsOworCX0KKworCXB1YmxpYyBTdHJpbmdMaXRlcmFsIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdHJpbmdMaXRlcmFsIGV4cHJlc3Npb24pIHsKKwkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDE7CQorCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OworCQljaGFyW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSwgc291cmNlU3RhcnQsIHRva2VucywgMCwgbGVuZ3RoKTsKKwkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3U3RyaW5nTGl0ZXJhbCgpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXRoaXMucmVjb3JkTm9kZXMobGl0ZXJhbCwgZXhwcmVzc2lvbik7CisJCX0KKwkJbGl0ZXJhbC5zZXRFc2NhcGVkVmFsdWUobmV3IFN0cmluZyh0b2tlbnMpKTsKKwkJbGl0ZXJhbC5zZXRTb3VyY2VSYW5nZShleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIGV4cHJlc3Npb24uc291cmNlU3RhcnQgKyAxKTsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCisJcHVibGljIFN0cmluZ0xpdGVyYWwgY29udmVydChFeHRlbmRlZFN0cmluZ0xpdGVyYWwgZXhwcmVzc2lvbikgeworCQlleHByZXNzaW9uLmNvbXB1dGVDb25zdGFudCgpOworCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2RlcyhsaXRlcmFsLCBleHByZXNzaW9uKTsKKwkJfQorCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZShleHByZXNzaW9uLmNvbnN0YW50LnN0cmluZ1ZhbHVlKCkpOworCQlsaXRlcmFsLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCisJcHVibGljIEluZml4RXhwcmVzc2lvbiBjb252ZXJ0KEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJdGhpcy5yZWNvcmROb2RlcyhpbmZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisKKwkJaW50IGV4cHJlc3Npb25PcGVyYXRvcklEID0gKGV4cHJlc3Npb24uYml0cyAmIE9wZXJhdG9yRXhwcmVzc2lvbi5PcGVyYXRvck1BU0spID4+IE9wZXJhdG9yRXhwcmVzc2lvbi5PcGVyYXRvclNISUZUOworCQlzd2l0Y2ggKGV4cHJlc3Npb25PcGVyYXRvcklEKSB7CisJCQljYXNlIE9wZXJhdG9ySWRzLkVRVUFMX0VRVUFMIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkVRVUFMUyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLkxFU1NfRVFVQUwgOgorCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTU19FUVVBTFMpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5HUkVBVEVSX0VRVUFMIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVJfRVFVQUxTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuTk9UX0VRVUFMIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVF9FUVVBTFMpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5MRUZUX1NISUZUIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFRlRfU0hJRlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5SSUdIVF9TSElGVCA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORUQpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5VTlNJR05FRF9SSUdIVF9TSElGVCA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLk9SX09SIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX09SKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuQU5EX0FORCA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9BTkQpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VUyA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLlJFTUFJTkRFUiA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SRU1BSU5ERVIpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5YT1IgOgorCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuWE9SKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuQU5EIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkFORCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLk1VTFRJUExZIDoKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuT1IgOgorCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuT1IpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5ESVZJREUgOgorCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRElWSURFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuR1JFQVRFUiA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuTEVTUyA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTKTsKKwkJfTsKKwkJCisJCWlmIChleHByZXNzaW9uLmxlZnQgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisJCQkvLyBjcmVhdGUgYW4gZXh0ZW5kZWQgc3RyaW5nIGxpdGVyYWwgZXF1aXZhbGVudCA9PiB1c2UgdGhlIGV4dGVuZGVkIG9wZXJhbmRzIGxpc3QKKwkJCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKGNvbnZlcnQoZXhwcmVzc2lvbi5yaWdodCkpOworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGxlZnRPcGVyYW5kID0gZXhwcmVzc2lvbi5sZWZ0OworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCA9IG51bGw7CisJCQlkbyB7CisJCQkJaWYgKCgobGVmdE9wZXJhbmQuYml0cyAmIE9wZXJhdG9yRXhwcmVzc2lvbi5PcGVyYXRvck1BU0spID4+IE9wZXJhdG9yRXhwcmVzc2lvbi5PcGVyYXRvclNISUZUKSAhPSBleHByZXNzaW9uT3BlcmF0b3JJRCkgeworCQkJCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7CisJCQkJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGV4cHJlc3Npb24ubGVmdCk7CisJCQkJCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsZWZ0RXhwcmVzc2lvbik7CisJCQkJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoY29udmVydChleHByZXNzaW9uLnJpZ2h0KSk7CisJCQkJCWludCBzdGFydFBvc2l0aW9uID0gbGVmdEV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBzdGFydFBvc2l0aW9uICsgMSk7CisJCQkJCXJldHVybiBpbmZpeEV4cHJlc3Npb247CisJCQkJfQorCQkJCXJpZ2h0T3BlcmFuZCA9ICgoQmluYXJ5RXhwcmVzc2lvbikgbGVmdE9wZXJhbmQpLnJpZ2h0OworCQkJCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKDAsIGNvbnZlcnQocmlnaHRPcGVyYW5kKSk7CisJCQkJbGVmdE9wZXJhbmQgPSAoKEJpbmFyeUV4cHJlc3Npb24pIGxlZnRPcGVyYW5kKS5sZWZ0OworCQkJfSB3aGlsZSAobGVmdE9wZXJhbmQgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKTsKKwkJCS8vIGNoZWNrIHRoYXQgdGhlIHJpZ2h0IG9wZXJhbmQgd2Fzbid0IGEgQmluYXJ5RXhwcmVzc2lvbgorCQkJaWYgKHJpZ2h0T3BlcmFuZCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKKwkJCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7CisJCQkJRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGNvbnZlcnQoZXhwcmVzc2lvbi5sZWZ0KTsKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOworCQkJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoY29udmVydChleHByZXNzaW9uLnJpZ2h0KSk7CisJCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBsZWZ0RXhwcmVzc2lvbi5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJaW5maXhFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKHN0YXJ0UG9zaXRpb24sIGV4cHJlc3Npb24uc291cmNlRW5kIC0gc3RhcnRQb3NpdGlvbiArIDEpOworCQkJCXJldHVybiBpbmZpeEV4cHJlc3Npb247CisJCQl9IGVsc2UgeworCQkJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGxlZnRPcGVyYW5kKTsKKwkJCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOworCQkJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoKEV4cHJlc3Npb24paW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOworCQkJCWludCBzdGFydFBvc2l0aW9uID0gbGVmdEV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCWluZml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHN0YXJ0UG9zaXRpb24gKyAxKTsKKwkJCQlyZXR1cm4gaW5maXhFeHByZXNzaW9uOworCQkJfQorCQl9CQkKKwkJRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGNvbnZlcnQoZXhwcmVzc2lvbi5sZWZ0KTsKKwkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxlZnRFeHByZXNzaW9uKTsKKwkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZChjb252ZXJ0KGV4cHJlc3Npb24ucmlnaHQpKTsKKwkJaW50IHN0YXJ0UG9zaXRpb24gPSBsZWZ0RXhwcmVzc2lvbi5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWluZml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHN0YXJ0UG9zaXRpb24gKyAxKTsKKwkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKKwl9CisJCQkKKwlwdWJsaWMgUHJlZml4RXhwcmVzc2lvbiBjb252ZXJ0KFVuYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCVByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQl0aGlzLnJlY29yZE5vZGVzKHByZWZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCXByZWZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZChjb252ZXJ0KGV4cHJlc3Npb24uZXhwcmVzc2lvbikpOworCQlzd2l0Y2ggKChleHByZXNzaW9uLmJpdHMgJiBVbmFyeUV4cHJlc3Npb24uT3BlcmF0b3JNQVNLKSA+PiBVbmFyeUV4cHJlc3Npb24uT3BlcmF0b3JTSElGVCkgeworCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKKwkJCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wZXJhdG9ySWRzLk1JTlVTIDoKKwkJCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5OT1QgOgorCQkJCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1QpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5UV0lERExFIDoKKwkJCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09NUExFTUVOVCk7CisJCX0KKwkJcmV0dXJuIHByZWZpeEV4cHJlc3Npb247CisJfQorCQorCXB1YmxpYyBJbnN0YW5jZW9mRXhwcmVzc2lvbiBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5zdGFuY2VPZkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlJbnN0YW5jZW9mRXhwcmVzc2lvbiBpbnN0YW5jZU9mRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoaW5zdGFuY2VPZkV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7CisJCWluc3RhbmNlT2ZFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxlZnRFeHByZXNzaW9uKTsKKwkJaW5zdGFuY2VPZkV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGNvbnZlcnRUeXBlKGV4cHJlc3Npb24udHlwZSkpOworCQlpbnQgc3RhcnRQb3NpdGlvbiA9IGxlZnRFeHByZXNzaW9uLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJaW5zdGFuY2VPZkV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBzdGFydFBvc2l0aW9uICsgMSk7CisJCXJldHVybiBpbnN0YW5jZU9mRXhwcmVzc2lvbjsKKwl9CisKKwlwdWJsaWMgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25kaXRpb25hbEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3Q29uZGl0aW9uYWxFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoY29uZGl0aW9uYWxFeHByZXNzaW9uLCBleHByZXNzaW9uKTsKKwkJfQorCQljb25kaXRpb25hbEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CisJCWNvbmRpdGlvbmFsRXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi5jb25kaXRpb24pKTsKKwkJY29uZGl0aW9uYWxFeHByZXNzaW9uLnNldFRoZW5FeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi52YWx1ZUlmVHJ1ZSkpOworCQljb25kaXRpb25hbEV4cHJlc3Npb24uc2V0RWxzZUV4cHJlc3Npb24oY29udmVydChleHByZXNzaW9uLnZhbHVlSWZGYWxzZSkpOworCQlyZXR1cm4gY29uZGl0aW9uYWxFeHByZXNzaW9uOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoTWVzc2FnZVNlbmQgZXhwcmVzc2lvbikgeworCQkvLyB3aWxsIHJldHVybiBhIE1ldGhvZEludm9jYXRpb24gb3IgYSBTdXBlck1ldGhvZEludm9jYXRpb24gb3IKKwkJRXhwcmVzc2lvbiBleHByOworCQlpZiAoZXhwcmVzc2lvbi5pc1N1cGVyQWNjZXNzKCkpIHsKKwkJCS8vIHJldHVybnMgYSBTdXBlck1ldGhvZEludm9jYXRpb24KKwkJCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlck1ldGhvZEludm9jYXRpb24oKTsKKwkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCXJlY29yZE5vZGVzKHN1cGVyTWV0aG9kSW52b2NhdGlvbiwgZXhwcmVzc2lvbik7CisJCQl9CisJCQlTaW1wbGVOYW1lIG5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcoZXhwcmVzc2lvbi5zZWxlY3RvcikpOworCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9ICAoaW50KSAoZXhwcmVzc2lvbi5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKTsKKwkJCWludCBuYW1lU291cmNlTGVuZ3RoID0gKGludCkoZXhwcmVzc2lvbi5uYW1lU291cmNlUG9zaXRpb24gJiAweEZGRkZGRkZGKSAtIG5hbWVTb3VyY2VTdGFydCArIDE7CisJCQluYW1lLnNldFNvdXJjZVJhbmdlKG5hbWVTb3VyY2VTdGFydCwgbmFtZVNvdXJjZUxlbmd0aCk7CisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhuYW1lLCBleHByZXNzaW9uKTsKKwkJCX0KKwkJCXN1cGVyTWV0aG9kSW52b2NhdGlvbi5zZXROYW1lKG5hbWUpOworCQkJLy8gZXhwcmVzc2lvbi5yZWNlaXZlciBpcyBlaXRoZXIgYSBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSBvciBhIFN1cGVyUmVmZXJlbmNlCisJCQkvLyBzbyB0aGUgY2FzdGluZyBjYW5ub3QgZmFpbAorCQkJaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgeworCQkJCU5hbWUgcXVhbGlmaWVyID0gY29udmVydCgoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIGV4cHJlc3Npb24ucmVjZWl2ZXIpOworCQkJCXN1cGVyTWV0aG9kSW52b2NhdGlvbi5zZXRRdWFsaWZpZXIocXVhbGlmaWVyKTsKKwkJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQkJcmVjb3JkTm9kZXMocXVhbGlmaWVyLCBleHByZXNzaW9uLnJlY2VpdmVyKTsKKwkJCQl9CisJCQl9CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBleHByZXNzaW9uLmFyZ3VtZW50czsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKKwkJCQkJRXhwcmVzc2lvbiBleHByaSA9IGNvbnZlcnQoYXJndW1lbnRzW2ldKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQlyZWNvcmROb2RlcyhleHByaSwgYXJndW1lbnRzW2ldKTsKKwkJCQkJfQorCQkJCQlzdXBlck1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzKCkuYWRkKGV4cHJpKTsKKwkJCQl9CisJCQl9CisJCQlleHByID0gc3VwZXJNZXRob2RJbnZvY2F0aW9uOworCQl9IGVsc2UgeworCQkJLy8gcmV0dXJucyBhIE1ldGhvZEludm9jYXRpb24KKwkJCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IHRoaXMuYXN0Lm5ld01ldGhvZEludm9jYXRpb24oKTsKKwkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCXJlY29yZE5vZGVzKG1ldGhvZEludm9jYXRpb24sIGV4cHJlc3Npb24pOworCQkJfQorCQkJU2ltcGxlTmFtZSBuYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKGV4cHJlc3Npb24uc2VsZWN0b3IpKTsKKwkJCWludCBuYW1lU291cmNlU3RhcnQgPSAgKGludCkgKGV4cHJlc3Npb24ubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMik7CisJCQlpbnQgbmFtZVNvdXJjZUxlbmd0aCA9IChpbnQpKGV4cHJlc3Npb24ubmFtZVNvdXJjZVBvc2l0aW9uICYgMHhGRkZGRkZGRikgLSBuYW1lU291cmNlU3RhcnQgKyAxOworCQkJbmFtZS5zZXRTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VMZW5ndGgpOworCQkJbWV0aG9kSW52b2NhdGlvbi5zZXROYW1lKG5hbWUpOworCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJcmVjb3JkTm9kZXMobmFtZSwgZXhwcmVzc2lvbik7CisJCQl9CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBleHByZXNzaW9uLmFyZ3VtZW50czsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWludCBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzTGVuZ3RoOyBpKyspIHsKKwkJCQkJRXhwcmVzc2lvbiBleHByaSA9IGNvbnZlcnQoYXJndW1lbnRzW2ldKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQlyZWNvcmROb2RlcyhleHByaSwgYXJndW1lbnRzW2ldKTsKKwkJCQkJfQorCQkJCQltZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZChleHByaSk7CisJCQkJfQorCQkJfQorCQkJRXhwcmVzc2lvbiBxdWFsaWZpZXIgPSBjb252ZXJ0KGV4cHJlc3Npb24ucmVjZWl2ZXIpOworCQkJaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIE5hbWUgJiYgdGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhxdWFsaWZpZXIsIGV4cHJlc3Npb24ucmVjZWl2ZXIpOworCQkJfQorCQkJbWV0aG9kSW52b2NhdGlvbi5zZXRFeHByZXNzaW9uKHF1YWxpZmllcik7CisJCQlleHByID0gbWV0aG9kSW52b2NhdGlvbjsKKwkJfQorCQlleHByLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOwkKKwkJcmVtb3ZlVHJhaWxpbmdDb21tZW50RnJvbUV4cHJlc3Npb25FbmRpbmdXaXRoQVBhcmVuKGV4cHIpOworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KEFORF9BTkRfRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2RlcyhpbmZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQl9CisJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGV4cHJlc3Npb24ubGVmdCk7CisJCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsZWZ0RXhwcmVzc2lvbik7CisJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoY29udmVydChleHByZXNzaW9uLnJpZ2h0KSk7CisJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EKTsKKwkJaW50IHN0YXJ0UG9zaXRpb24gPSBsZWZ0RXhwcmVzc2lvbi5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWluZml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHN0YXJ0UG9zaXRpb24gKyAxKTsKKwkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKKwkKKwl9CisJCisJcHVibGljIEV4cHJlc3Npb24gY29udmVydChFcXVhbEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoaW5maXhFeHByZXNzaW9uLCBleHByZXNzaW9uKTsKKwkJfQorCQlFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gY29udmVydChleHByZXNzaW9uLmxlZnQpOworCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOworCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGNvbnZlcnQoZXhwcmVzc2lvbi5yaWdodCkpOworCQlpbnQgc3RhcnRQb3NpdGlvbiA9IGxlZnRFeHByZXNzaW9uLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJaW5maXhFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKHN0YXJ0UG9zaXRpb24sIGV4cHJlc3Npb24uc291cmNlRW5kIC0gc3RhcnRQb3NpdGlvbiArIDEpOworCQlzd2l0Y2ggKChleHByZXNzaW9uLmJpdHMgJiBPcGVyYXRvckV4cHJlc3Npb24uT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvckV4cHJlc3Npb24uT3BlcmF0b3JTSElGVCkgeworCQkJY2FzZSBPcGVyYXRvcklkcy5FUVVBTF9FUVVBTCA6CisJCQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTFMpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcGVyYXRvcklkcy5OT1RfRVFVQUwgOgorCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9UX0VRVUFMUyk7CisJCX0KKwkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKKwkKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KE9SX09SX0V4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMoaW5maXhFeHByZXNzaW9uLCBleHByZXNzaW9uKTsKKwkJfQorCQlFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gY29udmVydChleHByZXNzaW9uLmxlZnQpOworCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOworCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGNvbnZlcnQoZXhwcmVzc2lvbi5yaWdodCkpOworCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX09SKTsKKwkJaW50IHNvdXJjZVN0YXJ0ID0gbGVmdEV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOworCQlpbmZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKTsKKwkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQlyZXR1cm4gY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgoTG9jYWxEZWNsYXJhdGlvbilzdGF0ZW1lbnQpOworCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2VydFN0YXRlbWVudCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzZXJ0U3RhdGVtZW50KSBzdGF0ZW1lbnQpOworCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrKSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jaykgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQnJlYWspIHsKKwkJCXJldHVybiBjb252ZXJ0KChCcmVhaykgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQ29udGludWUpIHsKKwkJCXJldHVybiBjb252ZXJ0KChDb250aW51ZSkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQ2FzZSkgeworCQkJcmV0dXJuIGNvbnZlcnQoKENhc2UpIHN0YXRlbWVudCk7CisJCX0KKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIERlZmF1bHRDYXNlKSB7CisJCQlyZXR1cm4gY29udmVydCgoRGVmYXVsdENhc2UpIHN0YXRlbWVudCk7CisJCX0KKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRG9TdGF0ZW1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkRvU3RhdGVtZW50KSBzdGF0ZW1lbnQpOworCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkVtcHR5U3RhdGVtZW50KSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FbXB0eVN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCXJldHVybiBjb252ZXJ0KChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Gb3JTdGF0ZW1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZvclN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JZlN0YXRlbWVudCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSWZTdGF0ZW1lbnQpIHN0YXRlbWVudCk7CisJCX0KKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTGFiZWxlZFN0YXRlbWVudCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTGFiZWxlZFN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZXR1cm5TdGF0ZW1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJldHVyblN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Td2l0Y2hTdGF0ZW1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN3aXRjaFN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQpIHsKKwkJCXJldHVybiBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN5bmNocm9uaXplZFN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaHJvd1N0YXRlbWVudCkgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhyb3dTdGF0ZW1lbnQpIHN0YXRlbWVudCk7CisJCX0KKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHJ5U3RhdGVtZW50KSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UcnlTdGF0ZW1lbnQpIHN0YXRlbWVudCk7CisJCX0KKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIExvY2FsVHlwZURlY2xhcmF0aW9uKSB7CisJCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KGNvbnZlcnQoKExvY2FsVHlwZURlY2xhcmF0aW9uKSBzdGF0ZW1lbnQpKTsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRUeXBlRGVjbGFyYXRpb24oKTsKKwkJCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSh0eXBlRGVjbC5nZXRTdGFydFBvc2l0aW9uKCksIHR5cGVEZWNsLmdldExlbmd0aCgpKTsKKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CisJCQkJCQorCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgeworCQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudChjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgc3RhdGVtZW50KSk7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKCk7CisJCQl0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UodHlwZURlY2wuZ2V0U3RhcnRQb3NpdGlvbigpLCB0eXBlRGVjbC5nZXRMZW5ndGgoKSk7CisJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50OworCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgeworCQkJRXhwcmVzc2lvbiBleHByID0gY29udmVydCgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIHN0YXRlbWVudCk7CisJCQlTdGF0ZW1lbnQgc3RtdCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcik7CisJCQlzdG10LnNldFNvdXJjZVJhbmdlKGV4cHIuZ2V0U3RhcnRQb3NpdGlvbigpLCBleHByLmdldExlbmd0aCgpKTsKKwkJCXJldHVybiBzdG10OworCQl9CisJCWlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LldoaWxlU3RhdGVtZW50KSB7CisJCQlyZXR1cm4gY29udmVydCgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaGlsZVN0YXRlbWVudCkgc3RhdGVtZW50KTsKKwkJfQorCQlpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uKSB7CisJCQlFeHByZXNzaW9uIGV4cHIgPSBjb252ZXJ0KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24pIHN0YXRlbWVudCk7CisJCQlTdGF0ZW1lbnQgc3RtdCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcik7CisJCQlzdG10LnNldFNvdXJjZVJhbmdlKGV4cHIuZ2V0U3RhcnRQb3NpdGlvbigpLCBleHByLmdldExlbmd0aCgpKTsKKwkJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24oc3RtdCk7CisJCQlyZXR1cm4gc3RtdDsKKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkOiBjb252ZXJ0KCIgKyBzdGF0ZW1lbnQuZ2V0Q2xhc3MoKSArICIpIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwl9CisKKwlwdWJsaWMgQXNzZXJ0U3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdBc3NlcnRTdGF0ZW1lbnQoKTsKKwkJYXNzZXJ0U3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuYXNzZXJ0RXhwcmVzc2lvbikpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhjZXB0aW9uQXJndW1lbnQgPSBzdGF0ZW1lbnQuZXhjZXB0aW9uQXJndW1lbnQ7CisJCWlmIChleGNlcHRpb25Bcmd1bWVudCAhPSBudWxsKSB7CisJCQlhc3NlcnRTdGF0ZW1lbnQuc2V0TWVzc2FnZShjb252ZXJ0KGV4Y2VwdGlvbkFyZ3VtZW50KSk7CisJCX0KKwkJYXNzZXJ0U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlyZXR1cm4gYXNzZXJ0U3RhdGVtZW50OworCX0KKworCXB1YmxpYyBCbG9jayBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2sgc3RhdGVtZW50KSB7CisJCUJsb2NrIGJsb2NrID0gdGhpcy5hc3QubmV3QmxvY2soKTsKKwkJaWYgKHN0YXRlbWVudC5zb3VyY2VFbmQgPiAwKSB7CisJCQlibG9jay5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKKwkJfQorCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudFtdIHN0YXRlbWVudHMgPSBzdGF0ZW1lbnQuc3RhdGVtZW50czsKKwkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50c0xlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHN0YXRlbWVudHNbaV0gaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQkJCWNoZWNrQW5kQWRkTXVsdGlwbGVMb2NhbERlY2xhcmF0aW9uKHN0YXRlbWVudHMsIGksIGJsb2NrLnN0YXRlbWVudHMoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmxvY2suc3RhdGVtZW50cygpLmFkZChjb252ZXJ0KHN0YXRlbWVudHNbaV0pKTsKKwkJCQl9CQkJCQorCQkJfQorCQl9CisJCXJldHVybiBibG9jazsKKwl9CisJCisJcHVibGljIEJyZWFrU3RhdGVtZW50IGNvbnZlcnQoQnJlYWsgc3RhdGVtZW50KSAgeworCQlCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0JyZWFrU3RhdGVtZW50KCk7CisJCWJyZWFrU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlpZiAoc3RhdGVtZW50LmxhYmVsICE9IG51bGwpIHsKKwkJCVNpbXBsZU5hbWUgbmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhzdGF0ZW1lbnQubGFiZWwpKTsKKwkJCXJldHJpZXZlSWRlbnRpZmllckFuZFNldFBvc2l0aW9ucyhzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQsIG5hbWUpOworCQkJYnJlYWtTdGF0ZW1lbnQuc2V0TGFiZWwobmFtZSk7CisJCX0KKwkJcmV0dXJuIGJyZWFrU3RhdGVtZW50OworCX0KKworCXB1YmxpYyBDb250aW51ZVN0YXRlbWVudCBjb252ZXJ0KENvbnRpbnVlIHN0YXRlbWVudCkgIHsKKwkJQ29udGludWVTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdDb250aW51ZVN0YXRlbWVudCgpOworCQljb250aW51ZVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKKwkJaWYgKHN0YXRlbWVudC5sYWJlbCAhPSBudWxsKSB7CisJCQlTaW1wbGVOYW1lIG5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcoc3RhdGVtZW50LmxhYmVsKSk7CisJCQlyZXRyaWV2ZUlkZW50aWZpZXJBbmRTZXRQb3NpdGlvbnMoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kLCBuYW1lKTsKKwkJCWNvbnRpbnVlU3RhdGVtZW50LnNldExhYmVsKG5hbWUpOworCQl9CisJCXJldHVybiBjb250aW51ZVN0YXRlbWVudDsKKwl9CisJCQorCQkKKwlwdWJsaWMgU3dpdGNoQ2FzZSBjb252ZXJ0KENhc2Ugc3RhdGVtZW50KSB7CisJCVN3aXRjaENhc2Ugc3dpdGNoQ2FzZSA9IHRoaXMuYXN0Lm5ld1N3aXRjaENhc2UoKTsKKwkJc3dpdGNoQ2FzZS5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKKwkJc3dpdGNoQ2FzZS5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmNvbnN0YW50RXhwcmVzc2lvbikpOworCQlyZXR1cm4gc3dpdGNoQ2FzZTsKKwl9CisJCisJcHVibGljIFN3aXRjaENhc2UgY29udmVydChEZWZhdWx0Q2FzZSBzdGF0ZW1lbnQpIHsKKwkJU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlID0gdGhpcy5hc3QubmV3U3dpdGNoQ2FzZSgpOworCQlzd2l0Y2hDYXNlLnNldEV4cHJlc3Npb24obnVsbCk7CisJCXN3aXRjaENhc2Uuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCXJldHVybiBzd2l0Y2hDYXNlOworCX0KKwkKKwlwdWJsaWMgRG9TdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkRvU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlEb1N0YXRlbWVudCBkb1N0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0RvU3RhdGVtZW50KCk7CisJCWRvU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlkb1N0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmNvbmRpdGlvbikpOworCQlpZiAoc3RhdGVtZW50LmFjdGlvbiAhPSBudWxsKSB7CisJCQlkb1N0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoc3RhdGVtZW50LmFjdGlvbikpOworCQl9CisJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24oZG9TdGF0ZW1lbnQpOworCQlyZXR1cm4gZG9TdGF0ZW1lbnQ7CisJfQorCQorCXB1YmxpYyBFbXB0eVN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRW1wdHlTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCUVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKTsKKwkJZW1wdHlTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCXJldHVybiBlbXB0eVN0YXRlbWVudDsKKwl9CisJCisJcHVibGljIFN0YXRlbWVudCBjb252ZXJ0KEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIHN0YXRlbWVudCkgeworCQlTdGF0ZW1lbnQgbmV3U3RhdGVtZW50OworCQlpZiAoc3RhdGVtZW50LmlzU3VwZXJBY2Nlc3MoKSB8fCBzdGF0ZW1lbnQuaXNTdXBlcigpIHx8IHN0YXRlbWVudC5pc0ltcGxpY2l0U3VwZXIoKSkgeworCQkJU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpOworCQkJaWYgKHN0YXRlbWVudC5xdWFsaWZpY2F0aW9uICE9IG51bGwpIHsKKwkJCQlzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LnF1YWxpZmljYXRpb24pKTsKKwkJCX0KKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbltdIGFyZ3VtZW50cyA9IHN0YXRlbWVudC5hcmd1bWVudHM7CisJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCXN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZChjb252ZXJ0KGFyZ3VtZW50c1tpXSkpOworCQkJCX0KKwkJCX0KKwkJCW5ld1N0YXRlbWVudCA9IHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uOworCQl9IGVsc2UgeworCQkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIGNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IHRoaXMuYXN0Lm5ld0NvbnN0cnVjdG9ySW52b2NhdGlvbigpOworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uW10gYXJndW1lbnRzID0gc3RhdGVtZW50LmFyZ3VtZW50czsKKwkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJY29uc3RydWN0b3JJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZChjb252ZXJ0KGFyZ3VtZW50c1tpXSkpOworCQkJCX0KKwkJCX0KKwkJCW5ld1N0YXRlbWVudCA9IGNvbnN0cnVjdG9ySW52b2NhdGlvbjsKKwkJfQorCQluZXdTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXMobmV3U3RhdGVtZW50LCBzdGF0ZW1lbnQpOworCQl9CisJCXJldHVybiBuZXdTdGF0ZW1lbnQ7CisJfQorCQorCXB1YmxpYyBGb3JTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZvclN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0ZvclN0YXRlbWVudCgpOworCQlmb3JTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50W10gaW5pdGlhbGl6YXRpb25zID0gc3RhdGVtZW50LmluaXRpYWxpemF0aW9uczsKKwkJaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKSB7CisJCQlpbnQgaW5pdGlhbGl6YXRpb25zTGVuZ3RoID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25zTGVuZ3RoOyBpKyspIHsKKwkJCQlmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCkuYWRkKGNvbnZlcnRUb0V4cHJlc3Npb24oaW5pdGlhbGl6YXRpb25zW2ldKSk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXRlbWVudC5jb25kaXRpb24gIT0gbnVsbCkgeworCQkJZm9yU3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuY29uZGl0aW9uKSk7CisJCX0KKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnRbXSBpbmNyZW1lbnRzID0gc3RhdGVtZW50LmluY3JlbWVudHM7CisJCWlmIChpbmNyZW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBpbmNyZW1lbnRzTGVuZ3RoID0gaW5jcmVtZW50cy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY3JlbWVudHNMZW5ndGg7IGkrKykgeworCQkJCWZvclN0YXRlbWVudC51cGRhdGVycygpLmFkZChjb252ZXJ0VG9FeHByZXNzaW9uKGluY3JlbWVudHNbaV0pKTsJCQkJCisJCQl9CisJCX0KKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgYWN0aW9uID0gc3RhdGVtZW50LmFjdGlvbjsKKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQlmb3JTdGF0ZW1lbnQuc2V0Qm9keShjb252ZXJ0KHN0YXRlbWVudC5hY3Rpb24pKTsKKwkJCWlmICghKGFjdGlvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2spKSB7CisJCQkJLy8gc2V0IHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGZvciBzdGF0ZW1lbnQgb24gdGhlIHNlbWktY29sb24KKwkJCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKGZvclN0YXRlbWVudCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKGZvclN0YXRlbWVudCk7CisJCX0KKwkJcmV0dXJuIGZvclN0YXRlbWVudDsKKwl9CisJCisJcHVibGljIEV4cHJlc3Npb24gY29udmVydFRvRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgeworCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgc3RhdGVtZW50KTsKKwkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24gPSAoTG9jYWxEZWNsYXJhdGlvbikgc3RhdGVtZW50OworCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOworCQkJU2ltcGxlTmFtZSBuYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShsb2NhbERlY2xhcmF0aW9uLm5hbWUoKSk7CisJCQluYW1lLnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUobmFtZSk7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCQlpZiAobG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNvbnZlcnQobG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbikpOworCQkJfQorCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOworCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJcmVjb3JkTm9kZXModmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LCBsb2NhbERlY2xhcmF0aW9uKTsKKwkJCX0KKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAtIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpOworCQkJLyoqCisJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjMzCisJCQkgKiBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciBidWlsdCB2YXJpYWJsZXMgd2l0aCBpbnZhbGlkIG1vZGlmaWVycy4KKwkJCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IGlzIHRhZ2dlZCBhcyBoYXZpbmcgd3JvbmcgbW9kaWZpZXJzIGZvciB0aGUgbG9jYWwuCisJCQkgKiBPbmx5IGZpbmFsIGlzIGFsbG93ZWQgaW4gdGhpcyBjYXNlLgorCQkJICovCisJCQl0cnkgeworCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldE1vZGlmaWVycyhsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyk7CisJCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKGxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgTW9kaWZpZXIuRklOQUwpOworCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKKwkJCX0KKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMocmV0cmlldmVFeHRyYURpbWVuc2lvbihsb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZCArIDEsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCkpOworCQkJVHlwZSB0eXBlID0gY29udmVydFR5cGUobG9jYWxEZWNsYXJhdGlvbi50eXBlKTsKKwkJCXNldFR5cGVGb3JWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgdHlwZSwgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEV4dHJhRGltZW5zaW9ucygpKTsKKwkJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKKwkJfSBlbHNlIHsKKwkJCS8vIHVuc3VwcG9ydGVkCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkOiBjb252ZXJ0KCIgKyBzdGF0ZW1lbnQuZ2V0Q2xhc3MoKSArICIpIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKwkKKwlwdWJsaWMgSWZTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LklmU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0lmU3RhdGVtZW50KCk7CisJCWlmU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlpZlN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmNvbmRpdGlvbikpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudCB0aGVuU3RhdGVtZW50ID0gc3RhdGVtZW50LnRoZW5TdGF0ZW1lbnQ7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQuZWxzZVN0YXRlbWVudDsKKwkJaWYgKHRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKHRoZW5TdGF0ZW1lbnQgPT0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jay5Ob25lKSB7CisJCQkJaWZTdGF0ZW1lbnQuc2V0VGhlblN0YXRlbWVudCh0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWZTdGF0ZW1lbnQuc2V0VGhlblN0YXRlbWVudChjb252ZXJ0KHN0YXRlbWVudC50aGVuU3RhdGVtZW50KSk7CisJCQl9CisJCX0KKwkJaWYgKGVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKGVsc2VTdGF0ZW1lbnQgPT0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jay5Ob25lKSB7CisJCQkJaWZTdGF0ZW1lbnQuc2V0RWxzZVN0YXRlbWVudCh0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWZTdGF0ZW1lbnQuc2V0RWxzZVN0YXRlbWVudChjb252ZXJ0KGVsc2VTdGF0ZW1lbnQpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaWZTdGF0ZW1lbnQ7CisJfQorCQorCXB1YmxpYyBMYWJlbGVkU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5MYWJlbGVkU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdMYWJlbGVkU3RhdGVtZW50KCk7CisJCWxhYmVsZWRTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CQorCQlsYWJlbGVkU3RhdGVtZW50LnNldEJvZHkoY29udmVydChzdGF0ZW1lbnQuc3RhdGVtZW50KSk7CisJCVNpbXBsZU5hbWUgbmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhzdGF0ZW1lbnQubGFiZWwpKTsKKwkJcmV0cmlldmVJZGVudGlmaWVyQW5kU2V0UG9zaXRpb25zKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCwgbmFtZSk7CisJCWxhYmVsZWRTdGF0ZW1lbnQuc2V0TGFiZWwobmFtZSk7CisJCXJldHVybiBsYWJlbGVkU3RhdGVtZW50OworCX0KKwkKKwlwdWJsaWMgUmV0dXJuU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKKwkJcmV0dXJuU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwkKKwkJaWYgKHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKKwkJCXJldHVyblN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmV4cHJlc3Npb24pKTsKKwkJfQorCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKHJldHVyblN0YXRlbWVudCk7CisJCXJldHVybiByZXR1cm5TdGF0ZW1lbnQ7CisJfQorCQorCXB1YmxpYyBTd2l0Y2hTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1N3aXRjaFN0YXRlbWVudCgpOworCQlzd2l0Y2hTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CQorCQlzd2l0Y2hTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbihjb252ZXJ0KHN0YXRlbWVudC50ZXN0RXhwcmVzc2lvbikpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudFtdIHN0YXRlbWVudHMgPSBzdGF0ZW1lbnQuc3RhdGVtZW50czsKKwkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgeworCQkJaW50IHN0YXRlbWVudHNMZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50c0xlbmd0aDsgaSsrKSB7CisJCQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMoKS5hZGQoY29udmVydChzdGF0ZW1lbnRzW2ldKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN3aXRjaFN0YXRlbWVudDsKKwl9CisJCisJcHVibGljIFN5bmNocm9uaXplZFN0YXRlbWVudCBjb252ZXJ0KG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3luY2hyb25pemVkU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3U3luY2hyb25pemVkU3RhdGVtZW50KCk7CisJCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoc3RhdGVtZW50LmJsb2NrKSk7CisJCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmV4cHJlc3Npb24pKTsKKwkJcmV0dXJuIHN5bmNocm9uaXplZFN0YXRlbWVudDsKKwl9CisJCisJcHVibGljIFRocm93U3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaHJvd1N0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdUaHJvd1N0YXRlbWVudCgpOworCQl0aHJvd1N0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsJCisJCXRocm93U3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuZXhjZXB0aW9uKSk7CisJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24odGhyb3dTdGF0ZW1lbnQpOworCQlyZXR1cm4gdGhyb3dTdGF0ZW1lbnQ7CisJfQorCQorCXB1YmxpYyBUcnlTdGF0ZW1lbnQgY29udmVydChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRyeVN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1RyeVN0YXRlbWVudCgpOworCQl0cnlTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CQorCisJCXRyeVN0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoc3RhdGVtZW50LnRyeUJsb2NrKSk7CisJCUFyZ3VtZW50W10gY2F0Y2hBcmd1bWVudHMgPSBzdGF0ZW1lbnQuY2F0Y2hBcmd1bWVudHM7CisJCWlmIChjYXRjaEFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQlpbnQgY2F0Y2hBcmd1bWVudHNMZW5ndGggPSBjYXRjaEFyZ3VtZW50cy5sZW5ndGg7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrW10gY2F0Y2hCbG9ja3MgPSBzdGF0ZW1lbnQuY2F0Y2hCbG9ja3M7CisJCQlpbnQgc3RhcnQgPSBzdGF0ZW1lbnQudHJ5QmxvY2suc291cmNlRW5kOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRjaEFyZ3VtZW50c0xlbmd0aDsgaSsrKSB7CisJCQkJQ2F0Y2hDbGF1c2UgY2F0Y2hDbGF1c2UgPSB0aGlzLmFzdC5uZXdDYXRjaENsYXVzZSgpOworCQkJCWludCBjYXRjaENsYXVzZVNvdXJjZVN0YXJ0ID0gcmV0cmlldmVTdGFydGluZ0NhdGNoUG9zaXRpb24oc3RhcnQsIGNhdGNoQXJndW1lbnRzW2ldLnNvdXJjZVN0YXJ0KTsKKwkJCQljYXRjaENsYXVzZS5zZXRTb3VyY2VSYW5nZShjYXRjaENsYXVzZVNvdXJjZVN0YXJ0LCBjYXRjaEJsb2Nrc1tpXS5zb3VyY2VFbmQgLSBjYXRjaENsYXVzZVNvdXJjZVN0YXJ0ICsgMSk7CQorCQkJCWNhdGNoQ2xhdXNlLnNldEJvZHkoY29udmVydChjYXRjaEJsb2Nrc1tpXSkpOworCQkJCWNhdGNoQ2xhdXNlLnNldEV4Y2VwdGlvbihjb252ZXJ0KGNhdGNoQXJndW1lbnRzW2ldKSk7CisJCQkJdHJ5U3RhdGVtZW50LmNhdGNoQ2xhdXNlcygpLmFkZChjYXRjaENsYXVzZSk7CisJCQkJc3RhcnQgPSBjYXRjaEJsb2Nrc1tpXS5zb3VyY2VFbmQ7CisJCQl9CisJCX0KKwkJaWYgKHN0YXRlbWVudC5maW5hbGx5QmxvY2sgIT0gbnVsbCkgeworCQkJdHJ5U3RhdGVtZW50LnNldEZpbmFsbHkoY29udmVydChzdGF0ZW1lbnQuZmluYWxseUJsb2NrKSk7CisJCX0KKwkJcmV0dXJuIHRyeVN0YXRlbWVudDsKKwl9CisJCisJcHVibGljIFdoaWxlU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5XaGlsZVN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKwkJV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdXaGlsZVN0YXRlbWVudCgpOworCQl3aGlsZVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKKwkJd2hpbGVTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbihjb252ZXJ0KHN0YXRlbWVudC5jb25kaXRpb24pKTsKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgYWN0aW9uID0gc3RhdGVtZW50LmFjdGlvbjsKKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQl3aGlsZVN0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoYWN0aW9uKSk7CisJCQlpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrKSkgeworCQkJCS8vIHNldCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBmb3Igc3RhdGVtZW50IG9uIHRoZSBzZW1pLWNvbG9uCisJCQkJcmV0cmlldmVTZW1pQ29sb25Qb3NpdGlvbih3aGlsZVN0YXRlbWVudCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHdoaWxlU3RhdGVtZW50OworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKGNoYXJbXSBuYW1lKSB7CisJCXN3aXRjaChuYW1lWzBdKSB7CisJCQljYXNlICdpJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDMgJiYgbmFtZVsxXSA9PSAnbicgJiYgbmFtZVsyXSA9PSAndCcpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgJ2wnIDoKKwkJCQlpZiAobmFtZS5sZW5ndGggPT0gNCAmJiBuYW1lWzFdID09ICdvJyAmJiBuYW1lWzJdID09ICduJyAmJiBuYW1lWzNdID09ICdnJykgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJY2FzZSAnZCcgOgorCQkJCWlmIChuYW1lLmxlbmd0aCA9PSA2CisJCQkJCSAmJiBuYW1lWzFdID09ICdvJworCQkJCQkgJiYgbmFtZVsyXSA9PSAndScKKwkJCQkJICYmIG5hbWVbM10gPT0gJ2InCisJCQkJCSAmJiBuYW1lWzRdID09ICdsJworCQkJCQkgJiYgbmFtZVs1XSA9PSAnZScpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgJ2YnIDoKKwkJCQlpZiAobmFtZS5sZW5ndGggPT0gNQorCQkJCQkgJiYgbmFtZVsxXSA9PSAnbCcKKwkJCQkJICYmIG5hbWVbMl0gPT0gJ28nCisJCQkJCSAmJiBuYW1lWzNdID09ICdhJworCQkJCQkgJiYgbmFtZVs0XSA9PSAndCcpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgJ2InIDoKKwkJCQlpZiAobmFtZS5sZW5ndGggPT0gNAorCQkJCQkgJiYgbmFtZVsxXSA9PSAneScKKwkJCQkJICYmIG5hbWVbMl0gPT0gJ3QnCisJCQkJCSAmJiBuYW1lWzNdID09ICdlJykgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKG5hbWUubGVuZ3RoID09IDcKKwkJCQkJCSAmJiBuYW1lWzFdID09ICdvJworCQkJCQkJICYmIG5hbWVbMl0gPT0gJ28nCisJCQkJCQkgJiYgbmFtZVszXSA9PSAnbCcKKwkJCQkJCSAmJiBuYW1lWzRdID09ICdlJworCQkJCQkJICYmIG5hbWVbNV0gPT0gJ2EnCisJCQkJCQkgJiYgbmFtZVs2XSA9PSAnbicpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgJ2MnIDoKKwkJCQlpZiAobmFtZS5sZW5ndGggPT0gNAorCQkJCQkgJiYgbmFtZVsxXSA9PSAnaCcKKwkJCQkJICYmIG5hbWVbMl0gPT0gJ2EnCisJCQkJCSAmJiBuYW1lWzNdID09ICdyJykgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJY2FzZSAncycgOgorCQkJCWlmIChuYW1lLmxlbmd0aCA9PSA1CisJCQkJCSAmJiBuYW1lWzFdID09ICdoJworCQkJCQkgJiYgbmFtZVsyXSA9PSAnbycKKwkJCQkJICYmIG5hbWVbM10gPT0gJ3InCisJCQkJCSAmJiBuYW1lWzRdID09ICd0JykgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJY2FzZSAndicgOgorCQkJCWlmIChuYW1lLmxlbmd0aCA9PSA0CisJCQkJCSAmJiBuYW1lWzFdID09ICdvJworCQkJCQkgJiYgbmFtZVsyXSA9PSAnaScKKwkJCQkJICYmIG5hbWVbM10gPT0gJ2QnKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIFByaW1pdGl2ZVR5cGUuQ29kZSBnZXRQcmltaXRpdmVUeXBlQ29kZShjaGFyW10gbmFtZSkgeworCQlzd2l0Y2gobmFtZVswXSkgeworCQkJY2FzZSAnaScgOgorCQkJCWlmIChuYW1lLmxlbmd0aCA9PSAzICYmIG5hbWVbMV0gPT0gJ24nICYmIG5hbWVbMl0gPT0gJ3QnKSB7CisJCQkJCXJldHVybiBQcmltaXRpdmVUeXBlLklOVDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdsJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDQgJiYgbmFtZVsxXSA9PSAnbycgJiYgbmFtZVsyXSA9PSAnbicgJiYgbmFtZVszXSA9PSAnZycpIHsKKwkJCQkJcmV0dXJuIFByaW1pdGl2ZVR5cGUuTE9ORzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdkJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDYKKwkJCQkJICYmIG5hbWVbMV0gPT0gJ28nCisJCQkJCSAmJiBuYW1lWzJdID09ICd1JworCQkJCQkgJiYgbmFtZVszXSA9PSAnYicKKwkJCQkJICYmIG5hbWVbNF0gPT0gJ2wnCisJCQkJCSAmJiBuYW1lWzVdID09ICdlJykgeworCQkJCQlyZXR1cm4gUHJpbWl0aXZlVHlwZS5ET1VCTEU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnZicgOgorCQkJCWlmIChuYW1lLmxlbmd0aCA9PSA1CisJCQkJCSAmJiBuYW1lWzFdID09ICdsJworCQkJCQkgJiYgbmFtZVsyXSA9PSAnbycKKwkJCQkJICYmIG5hbWVbM10gPT0gJ2EnCisJCQkJCSAmJiBuYW1lWzRdID09ICd0JykgeworCQkJCQlyZXR1cm4gUHJpbWl0aXZlVHlwZS5GTE9BVDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdiJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDQKKwkJCQkJICYmIG5hbWVbMV0gPT0gJ3knCisJCQkJCSAmJiBuYW1lWzJdID09ICd0JworCQkJCQkgJiYgbmFtZVszXSA9PSAnZScpIHsKKwkJCQkJcmV0dXJuIFByaW1pdGl2ZVR5cGUuQllURTsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKG5hbWUubGVuZ3RoID09IDcKKwkJCQkJCSAmJiBuYW1lWzFdID09ICdvJworCQkJCQkJICYmIG5hbWVbMl0gPT0gJ28nCisJCQkJCQkgJiYgbmFtZVszXSA9PSAnbCcKKwkJCQkJCSAmJiBuYW1lWzRdID09ICdlJworCQkJCQkJICYmIG5hbWVbNV0gPT0gJ2EnCisJCQkJCQkgJiYgbmFtZVs2XSA9PSAnbicpIHsKKwkJCQkJcmV0dXJuIFByaW1pdGl2ZVR5cGUuQk9PTEVBTjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdjJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDQKKwkJCQkJICYmIG5hbWVbMV0gPT0gJ2gnCisJCQkJCSAmJiBuYW1lWzJdID09ICdhJworCQkJCQkgJiYgbmFtZVszXSA9PSAncicpIHsKKwkJCQkJcmV0dXJuIFByaW1pdGl2ZVR5cGUuQ0hBUjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdzJyA6CisJCQkJaWYgKG5hbWUubGVuZ3RoID09IDUKKwkJCQkJICYmIG5hbWVbMV0gPT0gJ2gnCisJCQkJCSAmJiBuYW1lWzJdID09ICdvJworCQkJCQkgJiYgbmFtZVszXSA9PSAncicKKwkJCQkJICYmIG5hbWVbNF0gPT0gJ3QnKSB7CisJCQkJCXJldHVybiBQcmltaXRpdmVUeXBlLlNIT1JUOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3YnIDoKKwkJCQlpZiAobmFtZS5sZW5ndGggPT0gNAorCQkJCQkgJiYgbmFtZVsxXSA9PSAnbycKKwkJCQkJICYmIG5hbWVbMl0gPT0gJ2knCisJCQkJCSAmJiBuYW1lWzNdID09ICdkJykgeworCQkJCQlyZXR1cm4gUHJpbWl0aXZlVHlwZS5WT0lEOworCQkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBwcmltaXRpdmUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIHJpZ2h0IGVuZCBwb3NpdGlvbiBmb3IgZXhwcmVzc2lvbgorCSAqIHN0YXRlbWVudC4gVGhlIGFjdHVhbCBBU1Qgbm9kZXMgZG9uJ3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLgorCSAqIFRoaXMgbWV0aG9kIGZpeGVzIHRoZSBsZW5ndGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmV0cmlldmVTZW1pQ29sb25Qb3NpdGlvbihBU1ROb2RlIG5vZGUpIHsKKwkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWludCBsZW5ndGggPSBub2RlLmdldExlbmd0aCgpOworCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7CisJCWludCBjb3VudCA9IDA7CisJCXNjYW5uZXIucmVzZXRUbyhlbmQsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVNFTUlDT0xPTjoKKwkJCQkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydCk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0UgOgorCQkJCQkJY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQkJCWNvdW50LS07CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxQQVJFTiA6CisJCQkJCQljb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSUEFSRU4gOgorCQkJCQkJY291bnQtLTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJCQkJY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNLRVQgOgorCQkJCQkJY291bnQtLTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSByaWdodCBlbmQgcG9zaXRpb24gZm9yIHN3aXRjaCBhbmQgCisJICogdHJ5IHN0YXRlbWVudHMuIFRoZXkgZG9uJ3QgaW5jbHVkZSB0aGUgY2xvc2UgfS4gCisJICovCisJcHJpdmF0ZSB2b2lkIHJldHJpZXZlUmlnaHRCcmFjZVBvc2l0aW9uKEFTVE5vZGUgbm9kZSkgeworCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0TGVuZ3RoKCk7CisJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKKwkJc2Nhbm5lci5yZXNldFRvKGVuZCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlbjsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNFOgorCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydCk7CisJCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcnJheSBkaW1lbnNpb24gZGVjbGFyZWQgYWZ0ZXIgdGhlCisJICogbmFtZSBvZiBhIGxvY2FsIG9yIGEgZmllbGQgZGVjbGFyYXRpb24uCisJICogRm9yIGV4YW1wbGU6CisJICogICAgaW50IGksIGpbXSA9IG51bGwsIGtbXVtdID0ge3t9fTsKKwkgKiAgICBJdCBzaG91bGQgcmV0dXJuIDAgZm9yIGksIDEgZm9yIGogYW5kIDIgZm9yIGsuCisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZAorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlRXh0cmFEaW1lbnNpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwkJaW50IGRpbWVuc2lvbnMgPSAwOworCQl0cnkgeworCQkJaW50IHRva2VuOworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0tFVDovLzE2NiAKKwkJCQkJCWRpbWVuc2lvbnMrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUEgOi8vOTAKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUVRVUFMIDovLzE2NworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lU0VNSUNPTE9OIDovLzY0CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSUEFSRU4gOiAvLzg2CisJCQkJCQlyZXR1cm4gZGltZW5zaW9uczsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gZGltZW5zaW9uczsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbmRpbmcgcG9zaXRpb24gZm9yIGEgdHlwZSBkZWNsYXJhdGlvbiB3aGVuIHRoZSBkaW1lbnNpb24gaXMgcmlnaHQgYWZ0ZXIgdGhlIHR5cGUKKwkgKiBuYW1lLgorCSAqIEZvciBleGFtcGxlOgorCSAqICAgIGludFtdIGk7ID0+IHJldHVybiA1LCBidXQgaW50IGlbXSA9PiByZXR1cm4gLTE7CisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZAorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlRW5kT2ZEaW1lbnNpb25zUG9zaXRpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwkJaW50IGZvdW5kUG9zaXRpb24gPSAtMTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlbjsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLOgorCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DOgorCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0tFVDovLzE2NgorCQkJCQkJZm91bmRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIGZvdW5kUG9zaXRpb247CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIGZvdW5kUG9zaXRpb247CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGNhdGNoIGtleXdvcmQuCisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlU3RhcnRpbmdDYXRjaFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWNhdGNoOi8vMjI1CisJCQkJCQlyZXR1cm4gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgbGVmdCBicmFja2V0LgorCSAqIEByZXR1cm4gaW50IHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKKwkgKi8KKwlwcml2YXRlIGludCByZXRyaWV2ZVN0YXJ0aW5nTGVmdEJyYWNrZXRQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQl0cnkgeworCQkJaW50IHRva2VuOworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0tFVDovLzIyNQorCQkJCQkJcmV0dXJuIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBvc2l0aW9uIG9mIHRoZSByaWdodCBicmFja2V0LgorCSAqIEByZXR1cm4gaW50IHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKKwkgKi8KKwlwcml2YXRlIGludCByZXRyaWV2ZVJpZ2h0QnJhY2tldFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDS0VUOgorCQkJCQkJcmV0dXJuIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcHJpdmF0ZSBpbnQgcmV0cmlldmVQcm9wZXJSaWdodEJyYWNrZXRQb3NpdGlvbihpbnQgYnJhY2tldE51bWJlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlbiwgY291bnQgPSAwOworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0tFVDoKKwkJCQkJCWNvdW50Kys7CisJCQkJCQlpZiAoY291bnQgPT0gYnJhY2tldE51bWJlcikgeworCQkJCQkJCXJldHVybiBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgYmxvY2suCisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlU3RhcnRCbG9ja1Bvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxCUkFDRTovLzExMAorCQkJCQkJcmV0dXJuIHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgYmxvY2suCisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlRW5kQmxvY2tQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQlpbnQgY291bnQgPSAwOworCQl0cnkgeworCQkJaW50IHRva2VuOworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0U6Ly8xMTAKKwkJCQkJCWNvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDRTovLzk1CisJCQkJCQljb3VudC0tOworCQkJCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQkJCQlyZXR1cm4gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQkJfTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaWV2ZSBwb3NpdGlvbiBiZWZvcmUgdGhlIG5leHQgcmlnaHQgYnJhY2Ugb3Igc2VtaS1jb2xvbi4KKwkgKiBAcmV0dXJuIGludCB0aGUgcG9zaXRpb24gZm91bmQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJldHJpZXZlUmlnaHRCcmFjZU9yU2VtaUNvbG9uUG9zaXRpb24oQVNUTm9kZSBub2RlKSB7CisJCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQlpbnQgYnJhY2VDb3VudGVyID0gMDsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNFIDoKKwkJCQkJCWJyYWNlQ291bnRlcisrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0UgOgorCQkJCQkJYnJhY2VDb3VudGVyLS07CisJCQkJCQlpZiAoYnJhY2VDb3VudGVyID09IDApIHsKKwkJCQkJCQlub2RlLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0KTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVNFTUlDT0xPTiA6CisJCQkJCQlpZiAoYnJhY2VDb3VudGVyID09IDApIHsKKwkJCQkJCQlub2RlLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0KTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHBvc2l0aW9uIGJlZm9yZSB0aGUgbmV4dCBjb21tYSBvciBzZW1pLWNvbG9uLgorCSAqIEByZXR1cm4gaW50IHRoZSBwb3NpdGlvbiBmb3VuZC4KKwkgKi8KKwlwcml2YXRlIGludCByZXRyaWV2ZVBvc2l0aW9uQmVmb3JlTmV4dENvbW1hT3JTZW1pQ29sb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwkJaW50IGJyYWNlQ291bnRlciA9IDA7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxCUkFDRSA6CisJCQkJCQlicmFjZUNvdW50ZXIrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQkJCWJyYWNlQ291bnRlci0tOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMUEFSRU4gOgorCQkJCQkJYnJhY2VDb3VudGVyKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJQQVJFTiA6CisJCQkJCQlicmFjZUNvdW50ZXItLTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJCQkJYnJhY2VDb3VudGVyKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDS0VUIDoKKwkJCQkJCWJyYWNlQ291bnRlci0tOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NQSA6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVTRU1JQ09MT04gOgorCQkJCQkJaWYgKGJyYWNlQ291bnRlciA9PSAwKSB7CisJCQkJCQkJcmV0dXJuIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkKKwlwcml2YXRlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24pIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOworCQlTaW1wbGVOYW1lIG5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKGZpZWxkRGVjbGFyYXRpb24ubmFtZSgpKTsKKwkJbmFtZS5zZXRTb3VyY2VSYW5nZShmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCAtIGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKKwkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUobmFtZSk7CisJCWludCBlbmQgPSByZXRyaWV2ZVBvc2l0aW9uQmVmb3JlTmV4dENvbW1hT3JTZW1pQ29sb24oZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQsIGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQlpZiAoZW5kID09IC0xKSB7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZmllbGREZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAtIGZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRGbGFncyhBU1ROb2RlLk1BTEZPUk1FRCk7CisJCX0gZWxzZSB7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZW5kIC0gZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQl9CisJCWlmIChmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uICE9IG51bGwpIHsKKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihjb252ZXJ0KGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24pKTsKKwkJfQorCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKHJldHJpZXZlRXh0cmFEaW1lbnNpb24oZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQgKyAxLCBmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kICkpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKG5hbWUsIGZpZWxkRGVjbGFyYXRpb24pOworCQkJcmVjb3JkTm9kZXModmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LCBmaWVsZERlY2xhcmF0aW9uKTsKKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5yZXNvbHZlQmluZGluZygpOworCQl9CisJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CisJfQorCisJcHJpdmF0ZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KExvY2FsRGVjbGFyYXRpb24gbG9jYWxEZWNsYXJhdGlvbikgeworCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7CisJCVNpbXBsZU5hbWUgbmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobG9jYWxEZWNsYXJhdGlvbi5uYW1lKCkpOworCQluYW1lLnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZShuYW1lKTsKKwkJaW50IGVuZCA9IHJldHJpZXZlUG9zaXRpb25CZWZvcmVOZXh0Q29tbWFPclNlbWlDb2xvbihsb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJaWYgKGVuZCA9PSAtMSkgeworCQkJaWYgKGxvY2FsRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbCkgeworCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRTb3VyY2VSYW5nZShsb2NhbERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCAtIGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGVuZCAtIGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQgKyAxKTsKKwkJfQorCQlpZiAobG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY29udmVydChsb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uKSk7CisJCX0KKwkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucyhyZXRyaWV2ZUV4dHJhRGltZW5zaW9uKGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kICsgMSwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXModmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LCBsb2NhbERlY2xhcmF0aW9uKTsKKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5yZXNvbHZlQmluZGluZygpOworCQl9CisJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CisJfQorCisJcHJpdmF0ZSBGaWVsZERlY2xhcmF0aW9uIGNvbnZlcnRUb0ZpZWxkRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgeworCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KGZpZWxkRGVjbCk7CisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld0ZpZWxkRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKKwkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlyZWNvcmROb2Rlcyh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQsIGZpZWxkRGVjbCk7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKKwkJfQorCQlmaWVsZERlY2xhcmF0aW9uLnNldFNvdXJjZVJhbmdlKGZpZWxkRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBmaWVsZERlY2wuZGVjbGFyYXRpb25FbmQgLSBmaWVsZERlY2wuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpOworCQlUeXBlIHR5cGUgPSBjb252ZXJ0VHlwZShmaWVsZERlY2wudHlwZSk7CisJCXNldFR5cGVGb3JGaWVsZChmaWVsZERlY2xhcmF0aW9uLCB0eXBlLCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0RXh0cmFEaW1lbnNpb25zKCkpOworCQkvKioKKwkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMworCQkgKiBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciBidWlsdCBub2RlcyB3aXRoIGludmFsaWQgbW9kaWZpZXJzLgorCQkgKi8KKwkJdHJ5IHsKKwkJCWZpZWxkRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGZpZWxkRGVjbC5tb2RpZmllcnMgJiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnKTsKKwkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJaW50IGxlZ2FsTW9kaWZpZXJzID0gCisJCQkJTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLlBST1RFQ1RFRAorCQkJCXwgTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5WT0xBVElMRQorCQkJCXwgTW9kaWZpZXIuVFJBTlNJRU5UOworCQkJZmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoZmllbGREZWNsLm1vZGlmaWVycyAmIGxlZ2FsTW9kaWZpZXJzKTsKKwkJCWZpZWxkRGVjbGFyYXRpb24uc2V0RmxhZ3MoQVNUTm9kZS5NQUxGT1JNRUQpOworCQl9CisJCXNldEphdmFEb2NDb21tZW50KGZpZWxkRGVjbGFyYXRpb24pOworCQlyZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKKwl9CisKKwlwcml2YXRlIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24pIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudChsb2NhbERlY2xhcmF0aW9uKTsKKwkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwgbG9jYWxEZWNsYXJhdGlvbik7CisJCX0KKwkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgLSBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKKwkJVHlwZSB0eXBlID0gY29udmVydFR5cGUobG9jYWxEZWNsYXJhdGlvbi50eXBlKTsKKwkJc2V0VHlwZUZvclZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgdHlwZSwgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEV4dHJhRGltZW5zaW9ucygpKTsKKwkJLyoqCisJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzMKKwkJICogVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgYnVpbHQgdmFyaWFibGVzIHdpdGggaW52YWxpZCBtb2RpZmllcnMuCisJCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IGlzIHRhZ2dlZCBhcyBoYXZpbmcgd3JvbmcgbW9kaWZpZXJzIGZvciB0aGUgbG9jYWwuCisJCSAqIE9ubHkgZmluYWwgaXMgYWxsb3dlZCBpbiB0aGlzIGNhc2UuCisJCSAqLworCQl0cnkgeworCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRNb2RpZmllcnMobG9jYWxEZWNsYXJhdGlvbi5tb2RpZmllcnMpOworCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldE1vZGlmaWVycyhsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIE1vZGlmaWVyLkZJTkFMKTsKKwkJCXZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0RmxhZ3MoQVNUTm9kZS5NQUxGT1JNRUQpOworCQl9CisJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24odmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7CisJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0VHlwZUZvckZpZWxkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKKwkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKKwkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQlpbnQgcmVtYWluaW5nRGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkgLSBleHRyYURpbWVuc2lvbjsKKwkJCQlpZiAocmVtYWluaW5nRGltZW5zaW9ucyA9PSAwKSAgeworCQkJCQkvLyB0aGUgZGltZW5zaW9ucyBhcmUgYWZ0ZXIgdGhlIG5hbWUgc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkRGVjbGFyYXRpb24gaXMgYSBzaW1wbGVUeXBlCisJCQkJCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKKwkJCQkJZWxlbWVudFR5cGUuc2V0UGFyZW50KG51bGwpOworCQkJCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS51cGRhdGVLZXkodHlwZSwgZWxlbWVudFR5cGUpOworCQkJCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUoZWxlbWVudFR5cGUpOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBzdGFydCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQlpbnQgbGVuZ3RoID0gdHlwZS5nZXRMZW5ndGgoKTsKKwkJCQkJQXJyYXlUeXBlIHN1YmFycmF5VHlwZSA9IGFycmF5VHlwZTsKKwkJCQkJaW50IGluZGV4ID0gZXh0cmFEaW1lbnNpb247CisJCQkJCXdoaWxlIChpbmRleCA+IDApIHsKKwkJCQkJCXN1YmFycmF5VHlwZSA9IChBcnJheVR5cGUpIHN1YmFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisJCQkJCQlpbmRleC0tOworCQkJCQl9CisJCQkJCWludCBlbmQgPSByZXRyaWV2ZVByb3BlclJpZ2h0QnJhY2tldFBvc2l0aW9uKHJlbWFpbmluZ0RpbWVuc2lvbnMsIHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CisJCQkJCXN1YmFycmF5VHlwZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJc3ViYXJyYXlUeXBlLnNldFBhcmVudChudWxsKTsKKwkJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKHN1YmFycmF5VHlwZSk7CisJCQkJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnVwZGF0ZUtleSh0eXBlLCBzdWJhcnJheVR5cGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKHR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKHR5cGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVGb3JWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKKwkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKKwkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQlpbnQgcmVtYWluaW5nRGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkgLSBleHRyYURpbWVuc2lvbjsKKwkJCQlpZiAocmVtYWluaW5nRGltZW5zaW9ucyA9PSAwKSAgeworCQkJCQkvLyB0aGUgZGltZW5zaW9ucyBhcmUgYWZ0ZXIgdGhlIG5hbWUgc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkRGVjbGFyYXRpb24gaXMgYSBzaW1wbGVUeXBlCisJCQkJCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKKwkJCQkJZWxlbWVudFR5cGUuc2V0UGFyZW50KG51bGwpOworCQkJCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS51cGRhdGVLZXkodHlwZSwgZWxlbWVudFR5cGUpOworCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldFR5cGUoZWxlbWVudFR5cGUpOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBzdGFydCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQlpbnQgbGVuZ3RoID0gdHlwZS5nZXRMZW5ndGgoKTsKKwkJCQkJQXJyYXlUeXBlIHN1YmFycmF5VHlwZSA9IGFycmF5VHlwZTsKKwkJCQkJaW50IGluZGV4ID0gZXh0cmFEaW1lbnNpb247CisJCQkJCXdoaWxlIChpbmRleCA+IDApIHsKKwkJCQkJCXN1YmFycmF5VHlwZSA9IChBcnJheVR5cGUpIHN1YmFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisJCQkJCQlpbmRleC0tOworCQkJCQl9CisJCQkJCWludCBlbmQgPSByZXRyaWV2ZVByb3BlclJpZ2h0QnJhY2tldFBvc2l0aW9uKHJlbWFpbmluZ0RpbWVuc2lvbnMsIHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CisJCQkJCXN1YmFycmF5VHlwZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJc3ViYXJyYXlUeXBlLnNldFBhcmVudChudWxsKTsKKwkJCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRUeXBlKHN1YmFycmF5VHlwZSk7CisJCQkJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnVwZGF0ZUtleSh0eXBlLCBzdWJhcnJheVR5cGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRUeXBlKHR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRUeXBlKHR5cGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVGb3JWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKKwkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKKwkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQlpbnQgcmVtYWluaW5nRGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkgLSBleHRyYURpbWVuc2lvbjsKKwkJCQlpZiAocmVtYWluaW5nRGltZW5zaW9ucyA9PSAwKSAgeworCQkJCQkvLyB0aGUgZGltZW5zaW9ucyBhcmUgYWZ0ZXIgdGhlIG5hbWUgc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkRGVjbGFyYXRpb24gaXMgYSBzaW1wbGVUeXBlCisJCQkJCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKKwkJCQkJZWxlbWVudFR5cGUuc2V0UGFyZW50KG51bGwpOworCQkJCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS51cGRhdGVLZXkodHlwZSwgZWxlbWVudFR5cGUpOworCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRUeXBlKGVsZW1lbnRUeXBlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgc3RhcnQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJaW50IGxlbmd0aCA9IHR5cGUuZ2V0TGVuZ3RoKCk7CisJCQkJCUFycmF5VHlwZSBzdWJhcnJheVR5cGUgPSBhcnJheVR5cGU7CisJCQkJCWludCBpbmRleCA9IGV4dHJhRGltZW5zaW9uOworCQkJCQl3aGlsZSAoaW5kZXggPiAwKSB7CisJCQkJCQlzdWJhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSBzdWJhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworCQkJCQkJaW5kZXgtLTsKKwkJCQkJfQorCQkJCQlpbnQgZW5kID0gcmV0cmlldmVQcm9wZXJSaWdodEJyYWNrZXRQb3NpdGlvbihyZW1haW5pbmdEaW1lbnNpb25zLCBzdGFydCwgc3RhcnQgKyBsZW5ndGgpOworCQkJCQlzdWJhcnJheVR5cGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCXN1YmFycmF5VHlwZS5zZXRQYXJlbnQobnVsbCk7CisJCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFR5cGUoc3ViYXJyYXlUeXBlKTsKKwkJCQkJdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkudXBkYXRlS2V5KHR5cGUsIHN1YmFycmF5VHlwZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRUeXBlKHR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0VHlwZSh0eXBlKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0SmF2YURvY0NvbW1lbnQoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgeworCQlzY2FubmVyLnJlc2V0VG8oYm9keURlY2xhcmF0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSwgYm9keURlY2xhcmF0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSArIGJvZHlEZWNsYXJhdGlvbi5nZXRMZW5ndGgoKSk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCQlzd2l0Y2godG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQzogLy8xMDAzCisJCQkJCQlKYXZhZG9jIGphdmFkb2NDb21tZW50ID0gdGhpcy5hc3QubmV3SmF2YWRvYygpOworCQkJCQkJaW50IHN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJaW50IGxlbmd0aCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gc3RhcnQ7CisJCQkJCQljaGFyW10gY29udGVudHMgPSBuZXcgY2hhcltsZW5ndGhdOworCQkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSwgc3RhcnQsIGNvbnRlbnRzLCAwLCBsZW5ndGgpOworCQkJCQkJamF2YWRvY0NvbW1lbnQuc2V0Q29tbWVudChuZXcgU3RyaW5nKGNvbnRlbnRzKSk7CisJCQkJCQlqYXZhZG9jQ29tbWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgbGVuZ3RoKTsKKwkJCQkJCWJvZHlEZWNsYXJhdGlvbi5zZXRKYXZhZG9jKGphdmFkb2NDb21tZW50KTsKKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgcHJvcGFnYXRlRXJyb3JzKENvbXBpbGF0aW9uVW5pdCB1bml0LCBJUHJvYmxlbVtdIHByb2JsZW1zLCBpbnQgcHJvYmxlbUxlbmd0aCkgeworCQkvLyByZXNpemUgdGhlIHByb2JsZW0gYXJyYXkgdG8gdGhlIHByb3BlciBzaXplCisJCUlQcm9ibGVtW10gcmVzaXplUHJvYmxlbXMgPSBudWxsOworCQlpZiAocHJvYmxlbXMubGVuZ3RoID09IHByb2JsZW1MZW5ndGgpIHsKKwkJCXJlc2l6ZVByb2JsZW1zID0gcHJvYmxlbXM7CisJCX0gZWxzZSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCAocmVzaXplUHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bcHJvYmxlbUxlbmd0aF0pLCAwLCBwcm9ibGVtTGVuZ3RoKTsKKwkJfQorCQlBU1RTeW50YXhFcnJvclByb3BhZ2F0b3Igc3ludGF4RXJyb3JQcm9wYWdhdG9yID0gbmV3IEFTVFN5bnRheEVycm9yUHJvcGFnYXRvcihyZXNpemVQcm9ibGVtcyk7CisJCXVuaXQuYWNjZXB0KHN5bnRheEVycm9yUHJvcGFnYXRvcik7CisJCS8vIHN0b3JlIHRoZSBtZXNzYWdlcyBlcnJvciBvbiB0aGUgY29tcHVsYXRpb24gdW5pdAorCQlNZXNzYWdlW10gbWVzc2FnZXMgPSBuZXcgTWVzc2FnZVtwcm9ibGVtTGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtTGVuZ3RoOyBpKyspIHsKKwkJCUlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKKwkJCWludCBzdGFydCA9IHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKTsKKwkJCWludCBlbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOworCQkJbWVzc2FnZXNbaV0gPSBuZXcgTWVzc2FnZShwcm9ibGVtLmdldE1lc3NhZ2UoKSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCX0KKwkJdW5pdC5zZXRNZXNzYWdlcyhtZXNzYWdlcyk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKEFTVE5vZGUgbm9kZSwgaW50IHBvc2l0aW9uKSB7CisJCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQlpbnQgZW5kID0gc3RhcnQgKyBub2RlLmdldExlbmd0aCgpOworCQlpZiAoKHN0YXJ0IDw9IHBvc2l0aW9uKSAmJiAocG9zaXRpb24gPD0gZW5kKSkgeworCQkJbm9kZS5zZXRGbGFncyhBU1ROb2RlLk1BTEZPUk1FRCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgdm9pZCByZWNvcmROb2RlcyhBU1ROb2RlIG5vZGUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZSBvbGRBU1ROb2RlKSB7CisJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnN0b3JlKG5vZGUsIG9sZEFTVE5vZGUpOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JQYXJlbnRoZXNpcyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGhhbmRsZSBtdWx0aXBsZSBwYXJlbnRoZXNpcworCQkgKi8KKwkJaW50IHN0YXJ0ID0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydDsKKwkJaW50IGVuZCA9IGV4cHJlc3Npb24uc291cmNlRW5kOworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCWludCBkYW5nbGluZyA9IDAsIHRva2VuOworCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxQQVJFTiA6CisJCQkJCQlkYW5nbGluZyArKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUlBBUkVOIDoKKwkJCQkJCWlmIChmaXJzdCkgcmV0dXJuIGZhbHNlOworCQkJCQkJZGFuZ2xpbmcgLS07CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUVPRiA6CisJCQkJCQlpZiAoZmlyc3QpIHJldHVybiBmYWxzZTsKKwkJCQkJCXJldHVybiBkYW5nbGluZyA9PSAwOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmIChmaXJzdCkgcmV0dXJuIGZhbHNlOworCQkJCQkJaWYgKGRhbmdsaW5nID09IDApIHJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCX0KKwkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpeworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkanVzdFNvdXJjZVBvc2l0aW9uc0ZvclBhcmVudChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpbnQgc3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OworCQlpbnQgZW5kID0gZXhwcmVzc2lvbi5zb3VyY2VFbmQ7CisJCWludCBsZWZ0UGFyZW50Q291bnQgPSAxOworCQlpbnQgcmlnaHRQYXJlbnRDb3VudCA9IDA7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQlib29sZWFuIHN0b3AgPSBmYWxzZTsKKwkJCXdoaWxlICghc3RvcCAmJiAoKHRva2VuICA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSkgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTFBBUkVOOgorCQkJCQkJbGVmdFBhcmVudENvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJQQVJFTjoKKwkJCQkJCXJpZ2h0UGFyZW50Q291bnQrKzsKKwkJCQkJCWlmIChyaWdodFBhcmVudENvdW50ID09IGxlZnRQYXJlbnRDb3VudCkgeworCQkJCQkJCS8vIHdlIGZvdW5kIHRoZSBtYXRjaGluZyBwYXJlbnRoZXNpcworCQkJCQkJCXN0b3AgPSB0cnVlOworCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWV4cHJlc3Npb24uc291cmNlRW5kID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uIC0gMTsKKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQl9CisJfQorCisJcHJpdmF0ZSBsb25nW10gc2NhbkFsbElkZW50aWZpZXJzUG9zaXRpb25zKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOworCQlpbnQgdG9rZW47CisJCWludCBpbmRleCA9IDA7CisJCXRyeSB7CisJCQl3aGlsZSgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgIHsKKwkJCQlpZiAodG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVJZGVudGlmaWVyKSB7CisJCQkJCXBvc2l0aW9uc1tpbmRleF0gPSAoKChsb25nKSBzY2FubmVyLnN0YXJ0UG9zaXRpb24pIDw8IDMyKSArIChzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJCQlpbmRleCsrOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiBwb3NpdGlvbnM7CisJfQorCQorCXByaXZhdGUgdm9pZCByZXRyaWV2ZUlkZW50aWZpZXJBbmRTZXRQb3NpdGlvbnMoaW50IHN0YXJ0LCBpbnQgZW5kLCBOYW1lIG5hbWUpIHsKKwkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQlpbnQgdG9rZW47CisJCXRyeSB7CisJCQl3aGlsZSgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgIHsKKwkJCQlpZiAodG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVJZGVudGlmaWVyKSB7CisJCQkJCWludCBzdGFydE5hbWUgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCWludCBlbmROYW1lID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQluYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0TmFtZSwgZW5kTmFtZSAtIHN0YXJ0TmFtZSArIDEpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisJCisJLyoqCisJICogUmVtb3ZlIHBvdGVudGlhbCB0cmFpbGluZyBjb21tZW50IGJ5IHNldHRpbmdzIHRoZSBzb3VyY2UgZW5kIG9uIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWlsaW5nQ29tbWVudEZyb21FeHByZXNzaW9uRW5kaW5nV2l0aEFQYXJlbihBU1ROb2RlIG5vZGUpIHsKKwkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgc3RhcnQgKyBub2RlLmdldExlbmd0aCgpKTsKKwkJaW50IHRva2VuOworCQlpbnQgcGFyZW5Db3VudGVyID0gMDsKKwkJdHJ5IHsKKwkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSAgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTFBBUkVOIDoKKwkJCQkJCXBhcmVuQ291bnRlcisrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSUEFSRU4gOgorCQkJCQkJcGFyZW5Db3VudGVyLS07CisJCQkJCQlpZiAocGFyZW5Db3VudGVyID09IDApIHsKKwkJCQkJCQlpbnQgZW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQkJCW5vZGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgcG90ZW50aWFsIHRyYWlsaW5nIGNvbW1lbnQgYnkgc2V0dGluZ3MgdGhlIHNvdXJjZSBlbmQgb24gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nQ29tbWVudHNGcm9tTGl0ZXJhbChBU1ROb2RlIG5vZGUpIHsKKwkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgc3RhcnQgKyBub2RlLmdldExlbmd0aCgpKTsKKwkJaW50IHRva2VuOworCQlpbnQgc3RhcnRQb3NpdGlvbiA9IC0xOworCQl0cnkgeworCQkJd2hpbGUoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpICB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCA6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMb25nTGl0ZXJhbCA6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVEb3VibGVMaXRlcmFsIDoKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgOgorCQkJCQkJaWYgKHN0YXJ0UG9zaXRpb24gPT0gLTEpIHsKKwkJCQkJCQlzdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQkJaW50IGVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBlbmQgLSBzdGFydFBvc2l0aW9uKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZU1JTlVTIDoKKwkJCQkJCXN0YXJ0UG9zaXRpb24gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RNYXRjaGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE1hdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE1Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxNjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDb25jcmV0ZSBzdXBlcmNsYXNzIGFuZCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGFuIEFTVCBzdWJ0cmVlIG1hdGNoZXIuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB0byBjb21wdXRlIHdoZXRoZXIgdHdvIEFTVHMgc3VidHJlZXMgYXJlIHN0cnVjdHVyYWxseSAKKyAqIGlzb21vcnBoaWMsIHVzZSA8Y29kZT5uMS5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbjIpPC9jb2RlPiB3aGVyZSAKKyAqIDxjb2RlPm4xPC9jb2RlPiBhbmQgPGNvZGU+bjI8L2NvZGU+IGFyZSB0aGUgQVNUIHJvb3Qgbm9kZXMgb2YgdGhlIHN1YnRyZWVzLgorICogPC9wPgorICogPHA+CisgKiBGb3IgZWFjaCBkaWZmZXJlbnQgY29uY3JldGUgQVNUIG5vZGUgdHlwZSA8aXQ+VDwvaXQ+IHRoZXJlIGlzIGEKKyAqIDxjb2RlPnB1YmxpYyBib29sZWFuIG1hdGNoKDxpdD5UPC9pdD4gbm9kZSwgT2JqZWN0IG90aGVyKTwvY29kZT4gbWV0aG9kCisgKiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG5vZGUgYWdhaW5zdCBhbm90aGVyIG9iamVjdCAodHlwaWNhbGx5IGFub3RoZXIKKyAqIEFTVCBub2RlLCBhbHRob3VnaCB0aGlzIGlzIG5vdCBlc3NlbnRpYWwpLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAqIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUgb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUKKyAqIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljIGNoaWxkIHN1YnRyZWVzLiBGb3Igbm9kZXMgd2l0aCAKKyAqIGxpc3QtdmFsdWVkIHByb3BlcnRpZXMsIHRoZSBjaGlsZCBub2RlcyB3aXRoaW4gdGhlIGxpc3QgYXJlIGNvbXBhcmVkIGluCisgKiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzIGFyZSBjb21wYXJlZAorICogaW4gdGhlIG9yZGVyIHRoYXQgbW9zdCBjbG9zZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSBsZXhpY2FsIHJlYWRpbmcgb3JkZXIKKyAqIG9mIHRoZSBzb3VyY2UgcHJvZ3JhbS4gRm9yIGluc3RhbmNlLCBmb3IgYSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUsIHRoZSAKKyAqIGNoaWxkIG9yZGVyaW5nIGlzOiBuYW1lLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMsIGFuZCBib2R5IAorICogZGVjbGFyYXRpb25zLgorICogPC9wPgorICogPHA+CisgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSAoZXh0ZW5kIG9yIHJlaW1wbGVtZW50KSBzb21lIG9yIGFsbCBvZiB0aGUgCisgKiA8Y29kZT5tYXRjaDwvY29kZT4gbWV0aG9kcyBpbiBvcmRlciB0byBkZWZpbmUgbW9yZSBzcGVjaWFsaXplZCBzdWJ0cmVlCisgKiBtYXRjaGVycy4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBBU1ROb2RlI3N1YnRyZWVNYXRjaAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgQVNUTWF0Y2hlciB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBtYXRjaGVyLgorCSAqLworCXB1YmxpYyBBU1RNYXRjaGVyKCkgeworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbGlzdHMgb2YgQVNUIG5vZGVzIG1hdGNoIHBhaXIgd2lzZSBhY2NvcmRpbmcKKwkgKiB0byA8Y29kZT5BU1ROb2RlLnN1YnRyZWVNYXRjaDwvY29kZT4uCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIHVzZWZ1bCBmb3Igd3JpdGluZyByZWN1cnNpdmUKKwkgKiBzdWJ0cmVlIG1hdGNoZXJzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdDEgdGhlIGZpcnN0IGxpc3Qgb2YgQVNUIG5vZGVzCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+QVNUTm9kZTwvY29kZT4pCisJICogQHBhcmFtIGxpc3QyIHRoZSBzZWNvbmQgbGlzdCBvZiBBU1Qgbm9kZXMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5BU1ROb2RlPC9jb2RlPikKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaXN0cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cworCSAqICAgIGFuZCBtYXRjaCBwYWlyLXdpc2UgYWNjb3JkaW5nIHRvIDxjb2RlPkFTVE5vZGUuc3VidHJlZU1hdGNoPC9jb2RlPiAKKwkgKiBAc2VlIEFTVE5vZGUjc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKQorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpIHsKKwkJaW50IHNpemUxID0gbGlzdDEuc2l6ZSgpOworCQlpbnQgc2l6ZTIgPSBsaXN0Mi5zaXplKCk7CisJCWlmIChzaXplMSAhPSBzaXplMikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvciAoSXRlcmF0b3IgaXQxID0gbGlzdDEuaXRlcmF0b3IoKSwgaXQyID0gbGlzdDIuaXRlcmF0b3IoKTsgaXQxLmhhc05leHQoKTspIHsKKwkJCUFTVE5vZGUgbjEgPSAoQVNUTm9kZSkgaXQxLm5leHQoKTsKKwkJCUFTVE5vZGUgbjIgPSAoQVNUTm9kZSkgaXQyLm5leHQoKTsKKwkJCWlmICghbjEuc3VidHJlZU1hdGNoKHRoaXMsIG4yKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGVzIG1hdGNoIGFjY29yZGluZyB0bworCSAqIDxjb2RlPkFTVC5zdWJ0cmVlTWF0Y2g8L2NvZGU+LiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBvbmUgb3IKKwkgKiB0aGUgb3RoZXIgb2YgdGhlIG5vZGVzIGFyZSA8Y29kZT5udWxsPC9jb2RlPi4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgorCSAqIGlmIGJvdGggbm9kZXMgYXJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCB1c2VmdWwgZm9yIHdyaXRpbmcgcmVjdXJzaXZlCisJICogc3VidHJlZSBtYXRjaGVycy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUxIHRoZSBmaXJzdCBBU1Qgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT47IG11c3QgYmUgYW4KKwkgKiAgICBpbnN0YW5jZSBvZiA8Y29kZT5BU1ROb2RlPC9jb2RlPgorCSAqIEBwYXJhbSBub2RlMiB0aGUgc2Vjb25kIEFTVCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPjsgbXVzdCBiZSBhbgorCSAqICAgIGluc3RhbmNlIG9mIDxjb2RlPkFTVE5vZGU8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbm9kZXMgbWF0Y2ggYWNjb3JkaW5nCisJICogICAgdG8gPGNvZGU+QVNULnN1YnRyZWVNYXRjaDwvY29kZT4gb3IgYm90aCBhcmUgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCAKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHNlZSBBU1ROb2RlI3N1YnRyZWVNYXRjaChBU1RNYXRjaGVyLCBPYmplY3QpCisJICovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gc2FmZVN1YnRyZWVNYXRjaChPYmplY3Qgbm9kZTEsIE9iamVjdCBub2RlMikgeworCQlpZiAobm9kZTEgPT0gbnVsbCAmJiBub2RlMiA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAobm9kZTEgPT0gbnVsbCB8fCBub2RlMiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJLy8gTi5CLiBjYWxsIHN1YnRyZWVNYXRjaCBldmVuIG5vZGUxPT1ub2RlMiE9bnVsbAorCQlyZXR1cm4gKChBU1ROb2RlKSBub2RlMSkuc3VidHJlZU1hdGNoKHRoaXMsIChBU1ROb2RlKSBub2RlMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3RzIGFyZSBlcXVhbCBhY2NvcmRpbmcgdG8KKwkgKiA8Y29kZT5lcXVhbHM8L2NvZGU+LiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBlaXRoZXIKKwkgKiBub2RlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBvMSB0aGUgZmlyc3Qgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBvMiB0aGUgc2Vjb25kIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlcyBhcmUgZXF1YWwgYWNjb3JkaW5nIHRvCisJICogICAgPGNvZGU+ZXF1YWxzPC9jb2RlPiBvciBib3RoIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlRXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCWlmIChvMSA9PSBvMikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG8xID09IG51bGwgfHwgbzIgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBvMS5lcXVhbHMobzIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG8gPSAoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmJvZHlEZWNsYXJhdGlvbnMoKSwgby5ib2R5RGVjbGFyYXRpb25zKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5QWNjZXNzIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5QWNjZXNzKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUFycmF5QWNjZXNzIG8gPSAoQXJyYXlBY2Nlc3MpIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEFycmF5KCksIG8uZ2V0QXJyYXkoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0SW5kZXgoKSwgby5nZXRJbmRleCgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5Q3JlYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlBcnJheUNyZWF0aW9uIG8gPSAoQXJyYXlDcmVhdGlvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0VHlwZSgpLCBvLmdldFR5cGUoKSkKKwkJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmRpbWVuc2lvbnMoKSwgby5kaW1lbnNpb25zKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEluaXRpYWxpemVyKCksIG8uZ2V0SW5pdGlhbGl6ZXIoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5SW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQXJyYXlJbml0aWFsaXplcikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlBcnJheUluaXRpYWxpemVyIG8gPSAoQXJyYXlJbml0aWFsaXplcikgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmV4cHJlc3Npb25zKCksIG8uZXhwcmVzc2lvbnMoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQXJyYXlUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlBcnJheVR5cGUgbyA9IChBcnJheVR5cGUpIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldENvbXBvbmVudFR5cGUoKSwgby5nZXRDb21wb25lbnRUeXBlKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEFzc2VydFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBBc3NlcnRTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQXNzZXJ0U3RhdGVtZW50IG8gPSAoQXNzZXJ0U3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRNZXNzYWdlKCksIG8uZ2V0TWVzc2FnZSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQXNzaWdubWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBBc3NpZ25tZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUFzc2lnbm1lbnQgbyA9IChBc3NpZ25tZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCW5vZGUuZ2V0T3BlcmF0b3IoKS5lcXVhbHMoby5nZXRPcGVyYXRvcigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRMZWZ0SGFuZFNpZGUoKSwgby5nZXRMZWZ0SGFuZFNpZGUoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0UmlnaHRIYW5kU2lkZSgpLCBvLmdldFJpZ2h0SGFuZFNpZGUoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEJsb2NrIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJsb2NrKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUJsb2NrIG8gPSAoQmxvY2spIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5zdGF0ZW1lbnRzKCksIG8uc3RhdGVtZW50cygpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChCb29sZWFuTGl0ZXJhbCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCb29sZWFuTGl0ZXJhbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlCb29sZWFuTGl0ZXJhbCBvID0gKEJvb2xlYW5MaXRlcmFsKSBvdGhlcjsKKwkJcmV0dXJuIG5vZGUuYm9vbGVhblZhbHVlKCkgPT0gby5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChCcmVha1N0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCcmVha1N0YXRlbWVudCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlCcmVha1N0YXRlbWVudCBvID0gKEJyZWFrU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRMYWJlbCgpLCBvLmdldExhYmVsKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKENhc3RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUNhc3RFeHByZXNzaW9uIG8gPSAoQ2FzdEV4cHJlc3Npb24pIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGUoKSwgby5nZXRUeXBlKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChDYXRjaENsYXVzZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBDYXRjaENsYXVzZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDYXRjaENsYXVzZSBvID0gKENhdGNoQ2xhdXNlKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeGNlcHRpb24oKSwgby5nZXRFeGNlcHRpb24oKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKENoYXJhY3RlckxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQ2hhcmFjdGVyTGl0ZXJhbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDaGFyYWN0ZXJMaXRlcmFsIG8gPSAoQ2hhcmFjdGVyTGl0ZXJhbCkgb3RoZXI7CisJCXJldHVybiBzYWZlRXF1YWxzKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCksIG8uZ2V0RXNjYXBlZFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlQ3JlYXRpb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG8gPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuYXJndW1lbnRzKCksIG8uYXJndW1lbnRzKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaCgKKwkJCQkJbm9kZS5nZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCksCisJCQkJCW8uZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29tcGlsYXRpb25Vbml0IG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb21waWxhdGlvblVuaXQgbyA9IChDb21waWxhdGlvblVuaXQpIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFBhY2thZ2UoKSwgby5nZXRQYWNrYWdlKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5pbXBvcnRzKCksIG8uaW1wb3J0cygpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUudHlwZXMoKSwgby50eXBlcygpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcmVzc2lvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb25kaXRpb25hbEV4cHJlc3Npb24gbyA9IChDb25kaXRpb25hbEV4cHJlc3Npb24pIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFRoZW5FeHByZXNzaW9uKCksIG8uZ2V0VGhlbkV4cHJlc3Npb24oKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0RWxzZUV4cHJlc3Npb24oKSwgby5nZXRFbHNlRXhwcmVzc2lvbigpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbnN0cnVjdG9ySW52b2NhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb25zdHJ1Y3Rvckludm9jYXRpb24gbyA9IChDb25zdHJ1Y3Rvckludm9jYXRpb24pIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5hcmd1bWVudHMoKSwgby5hcmd1bWVudHMoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29udGludWVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQ29udGludWVTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQ29udGludWVTdGF0ZW1lbnQgbyA9IChDb250aW51ZVN0YXRlbWVudCkgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TGFiZWwoKSwgby5nZXRMYWJlbCgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChEb1N0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEb1N0YXRlbWVudCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlEb1N0YXRlbWVudCBvID0gKERvU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRCb2R5KCksIG8uZ2V0Qm9keSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goRW1wdHlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goRXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUV4cHJlc3Npb25TdGF0ZW1lbnQgbyA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChGaWVsZEFjY2VzcyBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGaWVsZEFjY2VzcykpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlGaWVsZEFjY2VzcyBvID0gKEZpZWxkQWNjZXNzKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goRmllbGREZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUZpZWxkRGVjbGFyYXRpb24gbyA9IChGaWVsZERlY2xhcmF0aW9uKSBvdGhlcjsKKwkJcmV0dXJuIG5vZGUuZ2V0TW9kaWZpZXJzKCkgPT0gby5nZXRNb2RpZmllcnMoKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEphdmFkb2MoKSwgby5nZXRKYXZhZG9jKCkpCisJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0VHlwZSgpLCBvLmdldFR5cGUoKSkKKwkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuZnJhZ21lbnRzKCksIG8uZnJhZ21lbnRzKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEZvclN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGb3JTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRm9yU3RhdGVtZW50IG8gPSAoRm9yU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuaW5pdGlhbGl6ZXJzKCksIG8uaW5pdGlhbGl6ZXJzKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS51cGRhdGVycygpLCBvLnVwZGF0ZXJzKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEJvZHkoKSwgby5nZXRCb2R5KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChJZlN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBJZlN0YXRlbWVudCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlJZlN0YXRlbWVudCBvID0gKElmU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRUaGVuU3RhdGVtZW50KCksIG8uZ2V0VGhlblN0YXRlbWVudCgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFbHNlU3RhdGVtZW50KCksIG8uZ2V0RWxzZVN0YXRlbWVudCgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goSW1wb3J0RGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgSW1wb3J0RGVjbGFyYXRpb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSW1wb3J0RGVjbGFyYXRpb24gbyA9IChJbXBvcnREZWNsYXJhdGlvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkKKwkJCQkmJiBub2RlLmlzT25EZW1hbmQoKSA9PSBvLmlzT25EZW1hbmQoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goSW5maXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEluZml4RXhwcmVzc2lvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlJbmZpeEV4cHJlc3Npb24gbyA9IChJbmZpeEV4cHJlc3Npb24pIG90aGVyOworCQkvLyBiZSBjYXJlZnVsIG5vdCB0byB0cmlnZ2VyIGxhenkgY3JlYXRpb24gb2YgZXh0ZW5kZWQgb3BlcmFuZCBsaXN0cworCQlpZiAobm9kZS5oYXNFeHRlbmRlZE9wZXJhbmRzKCkgJiYgby5oYXNFeHRlbmRlZE9wZXJhbmRzKCkpIHsKKwkJCWlmICghc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5leHRlbmRlZE9wZXJhbmRzKCksIG8uZXh0ZW5kZWRPcGVyYW5kcygpKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAobm9kZS5oYXNFeHRlbmRlZE9wZXJhbmRzKCkgIT0gby5oYXNFeHRlbmRlZE9wZXJhbmRzKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKAorCQkJbm9kZS5nZXRPcGVyYXRvcigpLmVxdWFscyhvLmdldE9wZXJhdG9yKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldExlZnRPcGVyYW5kKCksIG8uZ2V0TGVmdE9wZXJhbmQoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0UmlnaHRPcGVyYW5kKCksIG8uZ2V0UmlnaHRPcGVyYW5kKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBJbnN0YW5jZW9mRXhwcmVzc2lvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlJbnN0YW5jZW9mRXhwcmVzc2lvbiBvID0gKEluc3RhbmNlb2ZFeHByZXNzaW9uKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCQlzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TGVmdE9wZXJhbmQoKSwgby5nZXRMZWZ0T3BlcmFuZCgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRSaWdodE9wZXJhbmQoKSwgby5nZXRSaWdodE9wZXJhbmQoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUluaXRpYWxpemVyIG8gPSAoSW5pdGlhbGl6ZXIpIG90aGVyOworCQlyZXR1cm4gKAorCQkJKG5vZGUuZ2V0TW9kaWZpZXJzKCkgPT0gby5nZXRNb2RpZmllcnMoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0SmF2YWRvYygpLCBvLmdldEphdmFkb2MoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKEphdmFkb2Mgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgSmF2YWRvYykpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlKYXZhZG9jIG8gPSAoSmF2YWRvYykgb3RoZXI7CisJCXJldHVybiBzYWZlRXF1YWxzKG5vZGUuZ2V0Q29tbWVudCgpLCBvLmdldENvbW1lbnQoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goTGFiZWxlZFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBMYWJlbGVkU3RhdGVtZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUxhYmVsZWRTdGF0ZW1lbnQgbyA9IChMYWJlbGVkU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRMYWJlbCgpLCBvLmdldExhYmVsKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEJvZHkoKSwgby5nZXRCb2R5KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXRob2REZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlNZXRob2REZWNsYXJhdGlvbiBvID0gKE1ldGhvZERlY2xhcmF0aW9uKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCShub2RlLmdldE1vZGlmaWVycygpID09IG8uZ2V0TW9kaWZpZXJzKCkpCisJCQkJJiYgKG5vZGUuaXNDb25zdHJ1Y3RvcigpID09IG8uaXNDb25zdHJ1Y3RvcigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRKYXZhZG9jKCksIG8uZ2V0SmF2YWRvYygpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRSZXR1cm5UeXBlKCksIG8uZ2V0UmV0dXJuVHlwZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUucGFyYW1ldGVycygpLCBvLnBhcmFtZXRlcnMoKSkKKwkJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLnRocm93bkV4Y2VwdGlvbnMoKSwgby50aHJvd25FeGNlcHRpb25zKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEJvZHkoKSwgby5nZXRCb2R5KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXRob2RJbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJTWV0aG9kSW52b2NhdGlvbiBvID0gKE1ldGhvZEludm9jYXRpb24pIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldE5hbWUoKSwgby5nZXROYW1lKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5hcmd1bWVudHMoKSwgby5hcmd1bWVudHMoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKE51bGxMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKE51bWJlckxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgTnVtYmVyTGl0ZXJhbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlOdW1iZXJMaXRlcmFsIG8gPSAoTnVtYmVyTGl0ZXJhbCkgb3RoZXI7CisJCXJldHVybiBzYWZlRXF1YWxzKG5vZGUuZ2V0VG9rZW4oKSwgby5nZXRUb2tlbigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVBhY2thZ2VEZWNsYXJhdGlvbiBvID0gKFBhY2thZ2VEZWNsYXJhdGlvbikgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbyA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0RXhwcmVzc2lvbigpLCBvLmdldEV4cHJlc3Npb24oKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgUG9zdGZpeEV4cHJlc3Npb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJUG9zdGZpeEV4cHJlc3Npb24gbyA9IChQb3N0Zml4RXhwcmVzc2lvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQlub2RlLmdldE9wZXJhdG9yKCkuZXF1YWxzKG8uZ2V0T3BlcmF0b3IoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0T3BlcmFuZCgpLCBvLmdldE9wZXJhbmQoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFByZWZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgUHJlZml4RXhwcmVzc2lvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlQcmVmaXhFeHByZXNzaW9uIG8gPSAoUHJlZml4RXhwcmVzc2lvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQlub2RlLmdldE9wZXJhdG9yKCkuZXF1YWxzKG8uZ2V0T3BlcmF0b3IoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0T3BlcmFuZCgpLCBvLmdldE9wZXJhbmQoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFByaW1pdGl2ZVR5cGUgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgUHJpbWl0aXZlVHlwZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlQcmltaXRpdmVUeXBlIG8gPSAoUHJpbWl0aXZlVHlwZSkgb3RoZXI7CisJCXJldHVybiAobm9kZS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpID09IG8uZ2V0UHJpbWl0aXZlVHlwZUNvZGUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goUXVhbGlmaWVkTmFtZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVF1YWxpZmllZE5hbWUgbyA9IChRdWFsaWZpZWROYW1lKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRRdWFsaWZpZXIoKSwgby5nZXRRdWFsaWZpZXIoKSkKKwkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFJldHVyblN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJUmV0dXJuU3RhdGVtZW50IG8gPSAoUmV0dXJuU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTaW1wbGVOYW1lIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU2ltcGxlTmFtZSBvID0gKFNpbXBsZU5hbWUpIG90aGVyOworCQlyZXR1cm4gbm9kZS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG8uZ2V0SWRlbnRpZmllcigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTaW1wbGVUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNpbXBsZVR5cGUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU2ltcGxlVHlwZSBvID0gKFNpbXBsZVR5cGUpIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldE5hbWUoKSwgby5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG8gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQkobm9kZS5nZXRNb2RpZmllcnMoKSA9PSBvLmdldE1vZGlmaWVycygpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRUeXBlKCksIG8uZ2V0VHlwZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRJbml0aWFsaXplcigpLCBvLmdldEluaXRpYWxpemVyKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmdMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3RyaW5nTGl0ZXJhbCBvID0gKFN0cmluZ0xpdGVyYWwpIG90aGVyOworCQlyZXR1cm4gc2FmZUVxdWFscyhub2RlLmdldEVzY2FwZWRWYWx1ZSgpLCBvLmdldEVzY2FwZWRWYWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBvID0gKFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuYXJndW1lbnRzKCksIG8uYXJndW1lbnRzKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdXBlckZpZWxkQWNjZXNzIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFN1cGVyRmllbGRBY2Nlc3MpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3VwZXJGaWVsZEFjY2VzcyBvID0gKFN1cGVyRmllbGRBY2Nlc3MpIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldE5hbWUoKSwgby5nZXROYW1lKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFF1YWxpZmllcigpLCBvLmdldFF1YWxpZmllcigpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFN1cGVyTWV0aG9kSW52b2NhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTdXBlck1ldGhvZEludm9jYXRpb24gbyA9IChTdXBlck1ldGhvZEludm9jYXRpb24pIG90aGVyOworCQlyZXR1cm4gKAorCQkJc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFF1YWxpZmllcigpLCBvLmdldFF1YWxpZmllcigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuYXJndW1lbnRzKCksIG8uYXJndW1lbnRzKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChTd2l0Y2hDYXNlIG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFN3aXRjaENhc2UpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3dpdGNoQ2FzZSBvID0gKFN3aXRjaENhc2UpIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTd2l0Y2hTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3dpdGNoU3RhdGVtZW50IG8gPSAoU3dpdGNoU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuc3RhdGVtZW50cygpLCBvLnN0YXRlbWVudHMoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3luY2hyb25pemVkU3RhdGVtZW50IG8gPSAoU3luY2hyb25pemVkU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRCb2R5KCksIG8uZ2V0Qm9keSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goVGhpc0V4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgVGhpc0V4cHJlc3Npb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJVGhpc0V4cHJlc3Npb24gbyA9IChUaGlzRXhwcmVzc2lvbikgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0UXVhbGlmaWVyKCksIG8uZ2V0UXVhbGlmaWVyKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFRocm93U3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFRocm93U3RhdGVtZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVRocm93U3RhdGVtZW50IG8gPSAoVGhyb3dTdGF0ZW1lbnQpIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEV4cHJlc3Npb24oKSwgby5nZXRFeHByZXNzaW9uKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBhbmQgdGhlIG90aGVyIG9iamVjdCBtYXRjaC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGlzIGNsYXNzIHRlc3RzIHdoZXRoZXIgdGhlCisJICogb3RoZXIgb2JqZWN0IGlzIGEgbm9kZSBvZiB0aGUgc2FtZSB0eXBlIHdpdGggc3RydWN0dXJhbGx5IGlzb21vcnBoaWMKKwkgKiBjaGlsZCBzdWJ0cmVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgbmVlZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQorCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN1YnRyZWUgbWF0Y2hlcywgb3IgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2ggb3IgdGhlIG90aGVyIG9iamVjdCBoYXMgYQorCSAqICAgZGlmZmVyZW50IG5vZGUgdHlwZSBvciBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoKFRyeVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUcnlTdGF0ZW1lbnQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJVHJ5U3RhdGVtZW50IG8gPSAoVHJ5U3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRCb2R5KCksIG8uZ2V0Qm9keSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuY2F0Y2hDbGF1c2VzKCksIG8uY2F0Y2hDbGF1c2VzKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEZpbmFsbHkoKSwgby5nZXRGaW5hbGx5KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChUeXBlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVR5cGVEZWNsYXJhdGlvbiBvID0gKFR5cGVEZWNsYXJhdGlvbikgb3RoZXI7CisJCXJldHVybiAoCisJCQkobm9kZS5nZXRNb2RpZmllcnMoKSA9PSBvLmdldE1vZGlmaWVycygpKQorCQkJCSYmIChub2RlLmlzSW50ZXJmYWNlKCkgPT0gby5pc0ludGVyZmFjZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRKYXZhZG9jKCksIG8uZ2V0SmF2YWRvYygpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXROYW1lKCksIG8uZ2V0TmFtZSgpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRTdXBlcmNsYXNzKCksIG8uZ2V0U3VwZXJjbGFzcygpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUuc3VwZXJJbnRlcmZhY2VzKCksIG8uc3VwZXJJbnRlcmZhY2VzKCkpCisJCQkJJiYgc2FmZVN1YnRyZWVMaXN0TWF0Y2gobm9kZS5ib2R5RGVjbGFyYXRpb25zKCksIG8uYm9keURlY2xhcmF0aW9ucygpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgeworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbyA9IChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG90aGVyOworCQlyZXR1cm4gc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGVEZWNsYXJhdGlvbigpLCBvLmdldFR5cGVEZWNsYXJhdGlvbigpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChUeXBlTGl0ZXJhbCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlTGl0ZXJhbCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlUeXBlTGl0ZXJhbCBvID0gKFR5cGVMaXRlcmFsKSBvdGhlcjsKKwkJcmV0dXJuIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRUeXBlKCksIG8uZ2V0VHlwZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBvID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSBvdGhlcjsKKwkJcmV0dXJuIG5vZGUuZ2V0TW9kaWZpZXJzKCkgPT0gby5nZXRNb2RpZmllcnMoKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGUoKSwgby5nZXRUeXBlKCkpCisJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmZyYWdtZW50cygpLCBvLmZyYWdtZW50cygpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBvID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgb3RoZXI7CisJCXJldHVybiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkKKwkJCSYmIG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gby5nZXRFeHRyYURpbWVuc2lvbnMoKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldEluaXRpYWxpemVyKCksIG8uZ2V0SW5pdGlhbGl6ZXIoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGFuZCB0aGUgb3RoZXIgb2JqZWN0IG1hdGNoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgdGVzdHMgd2hldGhlciB0aGUKKwkgKiBvdGhlciBvYmplY3QgaXMgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aCBzdHJ1Y3R1cmFsbHkgaXNvbW9ycGhpYworCSAqIGNoaWxkIHN1YnRyZWVzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IGRvIG5vdCBtYXRjaCBvciB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhCisJICogICBkaWZmZXJlbnQgbm9kZSB0eXBlIG9yIGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2goVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbyA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuIG5vZGUuZ2V0TW9kaWZpZXJzKCkgPT0gby5nZXRNb2RpZmllcnMoKQorCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGUoKSwgby5nZXRUeXBlKCkpCisJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLmZyYWdtZW50cygpLCBvLmZyYWdtZW50cygpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgYW5kIHRoZSBvdGhlciBvYmplY3QgbWF0Y2guCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyB0ZXN0cyB3aGV0aGVyIHRoZQorCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCisJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKKwkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWJ0cmVlIG1hdGNoZXMsIG9yIAorCSAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXkgZG8gbm90IG1hdGNoIG9yIHRoZSBvdGhlciBvYmplY3QgaGFzIGEKKwkgKiAgIGRpZmZlcmVudCBub2RlIHR5cGUgb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtYXRjaChXaGlsZVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBXaGlsZVN0YXRlbWVudCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlXaGlsZVN0YXRlbWVudCBvID0gKFdoaWxlU3RhdGVtZW50KSBvdGhlcjsKKwkJcmV0dXJuICgKKwkJCXNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRFeHByZXNzaW9uKCksIG8uZ2V0RXhwcmVzc2lvbigpKQorCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRCb2R5KCksIG8uZ2V0Qm9keSgpKSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmEzYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKQEAgLTAsMCArMSwxNTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBhbGwgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkgbm9kZSB0eXBlcy4KKyAqIDxwPgorICogQW4gQVNUIG5vZGUgcmVwcmVzZW50cyBhIEphdmEgc291cmNlIGNvZGUgY29uc3RydWN0LCBzdWNoCisgKiBhcyBhIG5hbWUsIHR5cGUsIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgb3IgZGVjbGFyYXRpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIEVhY2ggQVNUIG5vZGUgYmVsb25ncyB0byBhIHVuaXF1ZSBBU1QgaW5zdGFuY2UsIGNhbGxlZCB0aGUgb3duaW5nIEFTVC4KKyAqIFRoZSBjaGlsZHJlbiBvZiBhbiBBU1Qgbm9kZSBhbHdheXMgaGF2ZSB0aGUgc2FtZSBvd25lciBhcyB0aGVpciBwYXJlbnQgbm9kZS4KKyAqIElmIGEgbm9kZSBmcm9tIG9uZSBBU1QgaXMgdG8gYmUgYWRkZWQgdG8gYSBkaWZmZXJlbnQgQVNULCB0aGUgc3VidHJlZSBtdXN0CisgKiBiZSBjbG9uZWQgZmlyc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGFkZGVkIG5vZGVzIGhhdmUgdGhlIGNvcnJlY3Qgb3duaW5nIEFTVC4KKyAqIDwvcD4KKyAqIDxwPgorICogV2hlbiBhbiBBU1Qgbm9kZSBpcyBwYXJ0IG9mIGFuIEFTVCwgaXQgaGFzIGEgdW5pcXVlIHBhcmVudCBub2RlLgorICogQ2xpZW50cyBjYW4gbmF2aWdhdGUgdXB3YXJkcywgZnJvbSBjaGlsZCB0byBwYXJlbnQsIGFzIHdlbGwgYXMgZG93bndhcmRzLAorICogZnJvbSBwYXJlbnQgdG8gY2hpbGQuIE5ld2x5IGNyZWF0ZWQgbm9kZXMgYXJlIHVucGFyZW50ZWQuIFdoZW4gYW4gCisgKiB1bnBhcmVudGVkIG5vZGUgaXMgc2V0IGFzIGEgY2hpbGQgb2YgYSBub2RlICh1c2luZyBhIAorICogPGNvZGU+c2V0PGl0PkNISUxEPC9pdD48L2NvZGU+IG1ldGhvZCksIGl0cyBwYXJlbnQgbGluayBpcyBzZXQgYXV0b21hdGljYWxseQorICogYW5kIHRoZSBwYXJlbnQgbGluayBvZiB0aGUgZm9ybWVyIGNoaWxkIGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KKyAqIEZvciBub2RlcyB3aXRoIHByb3BlcnRpZXMgdGhhdCBpbmNsdWRlIGEgbGlzdCBvZiBjaGlsZHJlbiAoZm9yIGV4YW1wbGUsCisgKiA8Y29kZT5CbG9jazwvY29kZT4gd2hvc2UgPGNvZGU+c3RhdGVtZW50czwvY29kZT4gcHJvcGVydHkgaXMgYSBsaXN0CisgKiBvZiBzdGF0ZW1lbnRzKSwgYWRkaW5nIG9yIHJlbW92aW5nIGFuIGVsZW1lbnQgdG8vZm9yIHRoZSBsaXN0IHByb3BlcnR5CisgKiBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBhcmVudCBsaW5rcy4KKyAqIDwvcD4KKyAqIDxwPgorICogQVNUcyBtdXN0IG5vdCBjb250YWluIGN5Y2xlcy4gQWxsIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCBjcmVhdGUgYSBjeWNsZQorICogZGV0ZWN0IHRoaXMgcG9zc2liaWxpdHkgYW5kIGZhaWwuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFTVHMgZG8gbm90IGNvbnRhaW4gImhvbGVzIiAobWlzc2luZyBzdWJ0cmVlcykuIElmIGEgbm9kZSBpcyByZXF1aXJlZCB0bworICogaGF2ZSBhIGNlcnRhaW4gcHJvcGVydHksIGEgc3ludGFjdGljYWxseSBwbGF1c2libGUgaW5pdGlhbCB2YWx1ZSBpcworICogYWx3YXlzIHN1cHBsaWVkLiAKKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGhpZXJhcmNoeSBvZiBBU1Qgbm9kZSB0eXBlcyBoYXMgc29tZSBjb252ZW5pZW50IGdyb3VwaW5ncyBtYXJrZWQKKyAqIGJ5IGFic3RyYWN0IHN1cGVyY2xhc3NlczoKKyAqIDx1bD4KKyAqIDxsaT5leHByZXNzaW9ucyAtIDxjb2RlPkV4cHJlc3Npb248L2NvZGU+PC9saT4KKyAqIDxsaT5uYW1lcyAtIDxjb2RlPk5hbWU8L2NvZGU+IChhIHN1Yi1raW5kIG9mIGV4cHJlc3Npb24pPC9saT4KKyAqIDxsaT5zdGF0ZW1lbnRzIC0gPGNvZGU+U3RhdGVtZW50PC9jb2RlPjwvbGk+CisgKiA8bGk+dHlwZXMgLSA8Y29kZT5UeXBlPC9jb2RlPjwvbGk+CisgKiA8bGk+dHlwZSBib2R5IGRlY2xhcmF0aW9ucyAtIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogQWJzdHJhY3Qgc3ludGF4IHRyZWVzIG1heSBiZSBoYW5kIGNvbnN0cnVjdGVkIGJ5IGNsaWVudHMsIHVzaW5nIHRoZQorICogPGNvZGU+bmV3PGl0PlRZUEU8L2l0PjwvY29kZT4gZmFjdG9yeSBtZXRob2RzIChzZWUgPGNvZGU+QVNUPC9jb2RlPikgdG8KKyAqIGNyZWF0ZSBuZXcgbm9kZXMsIGFuZCB0aGUgdmFyaW91cyA8Y29kZT5zZXQ8aXQ+Q0hJTEQ8L2l0PjwvY29kZT4gbWV0aG9kcworICogdG8gY29ubmVjdCB0aGVtIHRvZ2V0aGVyLgorICogPC9wPgorICogPHA+CisgKiBUaGUgc3RhdGljIG1ldGhvZCA8Y29kZT5BU1QucGFyc2VDb21waWxhdGlvblVuaXQ8L2NvZGU+IHBhcnNlcyBhIHN0cmluZworICogY29udGFpbmluZyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBhbmQgcmV0dXJucyB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUKKyAqIGZvciBpdC4gVGhlIHJlc3VsdGluZyBub2RlcyBjYXJyeSBhIHNvdXJjZSByYW5nZSByZWxhdGluZyB0aGUgbm9kZSBiYWNrIHRvCisgKiB0aGUgb3JpZ2luYWwgc291cmNlIGNoYXJhY3RlcnMuIFRoZSBzb3VyY2UgcmFuZ2UgY292ZXJzIHRoZSBjb25zdHJ1Y3QKKyAqIGFzIGEgd2hvbGUuCisgKiA8L3A+CisgKiA8cD4KKyAqIEVhY2ggQVNUIG5vZGUgY2FycmllcyBiaXQgZmxhZ3MsIHdoaWNoIG1heSBjb252ZXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAorICogdGhlIG5vZGUuIEZvciBpbnN0YW5jZSwgdGhlIHBhcnNlciB1c2VzIGEgZmxhZyB0byBpbmRpY2F0ZSBhIHN5bnRheCBlcnJvci4KKyAqIE5ld2x5IGNyZWF0ZWQgbm9kZXMgaGF2ZSBubyBmbGFncyBzZXQuCisgKiA8L3A+CisgKiA8cD4KKyAqIEVhY2ggQVNUIG5vZGUgaXMgY2FwYWJsZSBvZiBjYXJyeWluZyBhbiBvcGVuLWVuZGVkIGNvbGxlY3Rpb24gb2YKKyAqIGNsaWVudC1kZWZpbmVkIHByb3BlcnRpZXMuIE5ld2x5IGNyZWF0ZWQgbm9kZXMgaGF2ZSBub25lLiAKKyAqIDxjb2RlPmdldFByb3BlcnR5PC9jb2RlPiBhbmQgPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IGFyZSB1c2VkIHRvIGFjY2VzcworICogdGhlc2UgcHJvcGVydGllcy4KKyAqIDwvcD4KKyAqIDxwPgorICogQVNUIG5vZGVzIGFyZSA8Yj5ub3Q8L2I+IHRocmVhZC1zYWZlOyB0aGlzIGlzIHRydWUgZXZlbiBmb3IgdHJlZXMgdGhhdAorICogYXJlIHJlYWQtb25seS4gSWYgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkLCBjb25zaWRlciB1c2luZyB0aGUgY29tbW9uIEFTVAorICogb2JqZWN0IHRoYXQgb3ducyB0aGUgbm9kZTsgdGhhdCBpcywgdXNlIAorICogPGNvZGU+c3luY2hyb25pemUgKG5vZGUuZ2V0QVNUKCkpIHsuLi59PC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogQVNUcyBhbHNvIHN1cHBvcnQgdGhlIHZpc2l0b3IgcGF0dGVybjsgc2VlIHRoZSBjbGFzcyA8Y29kZT5BU1RWaXNpdG9yPC9jb2RlPgorICogZm9yIGRldGFpbHMuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgQVNUI3BhcnNlQ29tcGlsYXRpb25Vbml0CisgKiBAc2VlIEFTVFZpc2l0b3IKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFTVE5vZGUgeworCQorCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkFub255bW91c0NsYXNzRGVjbGFyYXRpb248L2NvZGU+LgorCSAqIEBzZWUgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA9IDE7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5BcnJheUFjY2VzczwvY29kZT4uCisJICogQHNlZSBBcnJheUFjY2VzcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZX0FDQ0VTUyA9IDI7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5BcnJheUNyZWF0aW9uPC9jb2RlPi4KKwkgKiBAc2VlIEFycmF5Q3JlYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9DUkVBVElPTiA9IDM7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5BcnJheUluaXRpYWxpemVyPC9jb2RlPi4KKwkgKiBAc2VlIEFycmF5SW5pdGlhbGl6ZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9JTklUSUFMSVpFUiA9IDQ7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5BcnJheVR5cGU8L2NvZGU+LgorCSAqIEBzZWUgQXJyYXlUeXBlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfVFlQRSA9IDU7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5Bc3NlcnRTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgQXNzZXJ0U3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTRVJUX1NUQVRFTUVOVCA9IDY7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5Bc3NpZ25tZW50PC9jb2RlPi4KKwkgKiBAc2VlIEFzc2lnbm1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJR05NRU5UID0gNzsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkJsb2NrPC9jb2RlPi4KKwkgKiBAc2VlIEJsb2NrCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0sgPSA4OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+Qm9vbGVhbkxpdGVyYWw8L2NvZGU+LgorCSAqIEBzZWUgQm9vbGVhbkxpdGVyYWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOX0xJVEVSQUwgPSA5OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+QnJlYWtTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgQnJlYWtTdGF0ZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkVBS19TVEFURU1FTlQgPSAxMDsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkNhc3RFeHByZXNzaW9uPC9jb2RlPi4KKwkgKiBAc2VlIENhc3RFeHByZXNzaW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTVF9FWFBSRVNTSU9OID0gMTE7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5DYXRjaENsYXVzZTwvY29kZT4uCisJICogQHNlZSBDYXRjaENsYXVzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBVENIX0NMQVVTRSA9IDEyOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+Q2hhcmFjdGVyTGl0ZXJhbDwvY29kZT4uCisJICogQHNlZSBDaGFyYWN0ZXJMaXRlcmFsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUkFDVEVSX0xJVEVSQUwgPSAxMzsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkNsYXNzSW5zdGFuY2VDcmVhdGlvbjwvY29kZT4uCisJICogQHNlZSBDbGFzc0luc3RhbmNlQ3JlYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19JTlNUQU5DRV9DUkVBVElPTiA9IDE0OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+Q29tcGlsYXRpb25Vbml0PC9jb2RlPi4KKwkgKiBAc2VlIENvbXBpbGF0aW9uVW5pdAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBJTEFUSU9OX1VOSVQgPSAxNTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkNvbmRpdGlvbmFsRXhwcmVzc2lvbjwvY29kZT4uCisJICogQHNlZSBDb25kaXRpb25hbEV4cHJlc3Npb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT05BTF9FWFBSRVNTSU9OID0gMTY7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5Db25zdHJ1Y3Rvckludm9jYXRpb248L2NvZGU+LgorCSAqIEBzZWUgQ29uc3RydWN0b3JJbnZvY2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA9IDE3OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+Q29udGludWVTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgQ29udGludWVTdGF0ZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05USU5VRV9TVEFURU1FTlQgPSAxODsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkRvU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIERvU3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9fU1RBVEVNRU5UID0gMTk7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5FbXB0eVN0YXRlbWVudDwvY29kZT4uCisJICogQHNlZSBFbXB0eVN0YXRlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNUFRZX1NUQVRFTUVOVCA9IDIwOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+RXhwcmVzc2lvblN0YXRlbWVudDwvY29kZT4uCisJICogQHNlZSBFeHByZXNzaW9uU3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQUkVTU0lPTl9TVEFURU1FTlQgPSAyMTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPi4KKwkgKiBAc2VlIEZpZWxkQWNjZXNzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfQUNDRVNTID0gMjI7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPi4KKwkgKiBAc2VlIEZpZWxkRGVjbGFyYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9ERUNMQVJBVElPTiA9IDIzOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+Rm9yU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIEZvclN0YXRlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUl9TVEFURU1FTlQgPSAyNDsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPklmU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIElmU3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUZfU1RBVEVNRU5UID0gMjU7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5JbXBvcnREZWNsYXJhdGlvbjwvY29kZT4uCisJICogQHNlZSBJbXBvcnREZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVF9ERUNMQVJBVElPTiA9IDI2OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+SW5maXhFeHByZXNzaW9uPC9jb2RlPi4KKwkgKiBAc2VlIEluZml4RXhwcmVzc2lvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklYX0VYUFJFU1NJT04gPSAyNzsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkluaXRpYWxpemVyPC9jb2RlPi4KKwkgKiBAc2VlIEluaXRpYWxpemVyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaRVIgPSAyODsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkphdmFkb2M8L2NvZGU+LgorCSAqIEBzZWUgSmF2YWRvYworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFET0MgPSAyOTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPkxhYmVsZWRTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgTGFiZWxlZFN0YXRlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBQkVMRURfU1RBVEVNRU5UID0gMzA7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4uCisJICogQHNlZSBNZXRob2REZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUNMQVJBVElPTiA9IDMxOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+TWV0aG9kSW52b2NhdGlvbjwvY29kZT4uCisJICogQHNlZSBNZXRob2RJbnZvY2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0lOVk9DQVRJT04gPSAzMjsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPk51bGxMaXRlcmFsPC9jb2RlPi4KKwkgKiBAc2VlIE51bGxMaXRlcmFsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9MSVRFUkFMID0gMzM7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5OdW1iZXJMaXRlcmFsPC9jb2RlPi4KKwkgKiBAc2VlIE51bWJlckxpdGVyYWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfTElURVJBTCA9IDM0OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+UGFja2FnZURlY2xhcmF0aW9uPC9jb2RlPi4KKwkgKiBAc2VlIFBhY2thZ2VEZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfREVDTEFSQVRJT04gPSAzNTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPC9jb2RlPi4KKwkgKiBAc2VlIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OID0gMzY7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5Qb3N0Zml4RXhwcmVzc2lvbjwvY29kZT4uCisJICogQHNlZSBQb3N0Zml4RXhwcmVzc2lvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RGSVhfRVhQUkVTU0lPTiA9IDM3OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+UHJlZml4RXhwcmVzc2lvbjwvY29kZT4uCisJICogQHNlZSBQcmVmaXhFeHByZXNzaW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX0VYUFJFU1NJT04gPSAzODsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlByaW1pdGl2ZVR5cGU8L2NvZGU+LgorCSAqIEBzZWUgUHJpbWl0aXZlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU1JVElWRV9UWVBFID0gMzk7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5RdWFsaWZpZWROYW1lPC9jb2RlPi4KKwkgKiBAc2VlIFF1YWxpZmllZE5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSUZJRURfTkFNRSA9IDQwOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+UmV0dXJuU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIFJldHVyblN0YXRlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9TVEFURU1FTlQgPSA0MTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlNpbXBsZU5hbWU8L2NvZGU+LgorCSAqIEBzZWUgU2ltcGxlTmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9OQU1FID0gNDI7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5TaW1wbGVUeXBlPC9jb2RlPi4KKwkgKiBAc2VlIFNpbXBsZVR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfVFlQRSA9IDQzOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvY29kZT4uCisJICogQHNlZSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OID0gNDQ7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5TdHJpbmdMaXRlcmFsPC9jb2RlPi4KKwkgKiBAc2VlIFN0cmluZ0xpdGVyYWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfTElURVJBTCA9IDQ1OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb248L2NvZGU+LgorCSAqIEBzZWUgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUl9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID0gNDY7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5TdXBlckZpZWxkQWNjZXNzPC9jb2RlPi4KKwkgKiBAc2VlIFN1cGVyRmllbGRBY2Nlc3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUl9GSUVMRF9BQ0NFU1MgPSA0NzsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlN1cGVyTWV0aG9kSW52b2NhdGlvbjwvY29kZT4uCisJICogQHNlZSBTdXBlck1ldGhvZEludm9jYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBFUl9NRVRIT0RfSU5WT0NBVElPTiA9IDQ4OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+U3dpdGNoQ2FzZTwvY29kZT4uCisJICogQHNlZSBTd2l0Y2hDYXNlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX0NBU0UgPSA0OTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlN3aXRjaFN0YXRlbWVudDwvY29kZT4uCisJICogQHNlZSBTd2l0Y2hTdGF0ZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTV0lUQ0hfU1RBVEVNRU5UID0gNTA7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgU3luY2hyb25pemVkU3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hST05JWkVEX1NUQVRFTUVOVCA9IDUxOworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+VGhpc0V4cHJlc3Npb248L2NvZGU+LgorCSAqIEBzZWUgVGhpc0V4cHJlc3Npb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSElTX0VYUFJFU1NJT04gPSA1MjsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlRocm93U3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIFRocm93U3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhST1dfU1RBVEVNRU5UID0gNTM7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5UcnlTdGF0ZW1lbnQ8L2NvZGU+LgorCSAqIEBzZWUgVHJ5U3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJZX1NUQVRFTUVOVCA9IDU0OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPi4KKwkgKiBAc2VlIFR5cGVEZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfREVDTEFSQVRJT04gPSA1NTsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4uCisJICogQHNlZSBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCA9IDU2OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+VHlwZUxpdGVyYWw8L2NvZGU+LgorCSAqIEBzZWUgVHlwZUxpdGVyYWwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xJVEVSQUwgPSA1NzsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uPC9jb2RlPi4KKwkgKiBAc2VlIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUkVTU0lPTiA9IDU4OworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBub2RlIG9mIHR5cGUgCisJICogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPi4KKwkgKiBAc2VlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UID0gNTk7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQgPSA2MDsKKworCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbm9kZSBvZiB0eXBlIAorCSAqIDxjb2RlPldoaWxlU3RhdGVtZW50PC9jb2RlPi4KKwkgKiBAc2VlIFdoaWxlU3RhdGVtZW50CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJTEVfU1RBVEVNRU5UID0gNjE7CisKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIG5vZGUgb2YgdHlwZSAKKwkgKiA8Y29kZT5JbnN0YW5jZW9mRXhwcmVzc2lvbjwvY29kZT4uCisJICogQHNlZSBJbnN0YW5jZW9mRXhwcmVzc2lvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTkNFT0ZfRVhQUkVTU0lPTiA9IDYyOworCisJLyoqCisJICogT3duaW5nIEFTVC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIEFTVCBvd25lcjsKKwkKKwkvKioKKwkgKiBQYXJlbnQgQVNUIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBpcyBhIHJvb3QuCisJICogSW5pdGlhbGx5IDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByaXZhdGUgQVNUTm9kZSBwYXJlbnQgPSBudWxsOworCQorCS8qKgorCSAqIEFuIHVubW9kaWZpYWJsZSBlbXB0eSBtYXAgKHVzZWQgdG8gaW1wbGVtZW50IDxjb2RlPnByb3BlcnRpZXMoKTwvY29kZT4pLgorCSAqIAorCSAqIEBzZWUgI3Byb3BlcnRpZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXAgVU5NT0RJRklBQkxFX0VNUFRZX01BUAorCQk9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgSGFzaE1hcCgxKSk7CisJCisJLyoqCisJICogUHJpbWFyeSBmaWVsZCB1c2VkIGluIHJlcHJlc2VudGluZyBub2RlIHByb3BlcnRpZXMgZWZmaWNpZW50bHkuCisJICogSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoaXMgbm9kZSBoYXMgbm8gcHJvcGVydGllcy4KKwkgKiBJZiBhIDxjb2RlPlN0cmluZzwvY29kZT4sIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhpcyBub2RlJ3Mgc29sZSBwcm9wZXJ0eSwKKwkgKiBhbmQgPGNvZGU+cHJvcGVydHkyPC9jb2RlPiBjb250YWlucyBpdHMgdmFsdWUuCisJICogSWYgYSA8Y29kZT5IYXNoTWFwPC9jb2RlPiwgdGhpcyBpcyB0aGUgdGFibGUgb2YgcHJvcGVydHkgbmFtZS12YWx1ZQorCSAqIG1hcHBpbmdzOyA8Y29kZT5wcm9wZXJ0eTI8L2NvZGU+LCBpZiBub24tbnVsbCBpcyBpdHMgdW5tb2RpZmlhYmxlCisJICogZXF1aXZhbGVudC4KKwkgKiBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4uCisJICogCisJICogQHNlZSAjcHJvcGVydHkyCisJICovCisJcHJpdmF0ZSBPYmplY3QgcHJvcGVydHkxID0gbnVsbDsKKwkKKwkvKioKKwkgKiBBdXhpbGxhcnkgZmllbGQgdXNlZCBpbiByZXByZXNlbnRpbmcgbm9kZSBwcm9wZXJ0aWVzIGVmZmljaWVudGx5LgorCSAqIAorCSAqIEBzZWUgI3Byb3BlcnR5MQorCSAqLworCXByaXZhdGUgT2JqZWN0IHByb3BlcnR5MiA9IG51bGw7CisJCisJLyoqCisJICogQSBjaGFyYWN0ZXIgaW5kZXggaW50byB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZywgCisJICogb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUKKwkgKiBmb3IgdGhpcyBub2RlOyA8Y29kZT4tMTwvY29kZT4gYnkgZGVmYXVsdC4KKwkgKi8KKwlwcml2YXRlIGludCBzdGFydFBvc2l0aW9uID0gLTE7CisKKwkvKioKKwkgKiBBIGNoYXJhY3RlciBsZW5ndGgsIG9yIDxjb2RlPjA8L2NvZGU+IGlmIG5vIHNvdXJjZSBwb3NpdGlvbgorCSAqIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzIG5vZGU7IDxjb2RlPjA8L2NvZGU+IGJ5IGRlZmF1bHQuCisJICovCisJcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKKworCS8qKgorCSAqIEZsYWcgY29uc3RhbnQgKGJpdCBtYXNrLCB2YWx1ZSAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgc29tZXRoaW5nCisJICogbm90IHF1aXRlIHJpZ2h0IHdpdGggdGhpcyBBU1Qgbm9kZS4KKwkgKiA8cD4KKwkgKiBUaGUgc3RhbmRhcmQgcGFyc2VyICg8Y29kZT5BU1QucGFyc2VDb21waWxhdGlvblVuaXQ8L2NvZGU+KSBzZXRzIHRoaXMKKwkgKiBmbGFnIG9uIGEgbm9kZSB0byBpbmRpY2F0ZSBhIHN5bnRheCBlcnJvciBkZXRlY3RlZCBpbiB0aGUgdmljaW5pdHkuCisJICogPC9wPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRCA9IDE7CisKKwkvKioKKwkgKiBGbGFnczsgbm9uZSBzZXQgYnkgZGVmYXVsdC4KKwkgKiAKKwkgKiBAc2VlICNNQUxGT1JNRUQKKwkgKi8KKwlwcml2YXRlIGludCBmbGFncyA9IDA7CisJCQorCS8qKgorCSAqIEEgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBsaXN0IG9mIEFTVE5vZGVzLiBUaGUKKwkgKiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBBcnJheUxpc3QuCisJICovIAorCWNsYXNzIE5vZGVMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0IHsKKwkJCisJCS8qKgorCQkgKiBUaGUgdW5kZXJseWluZyBsaXN0IGluIHdoaWNoIHRoZSBub2RlcyBvZiB0aGlzIGxpc3QgYXJlCisJCSAqIHN0b3JlZCAoZWxlbWVudCB0eXBlOiA8Y29kZT5BU1ROb2RlPC9jb2RlPikuCisJCSAqIDxwPgorCQkgKiBCZSBzdGluZ3kgb24gc3RvcmFnZSAtIGFzc3VtZSB0aGF0IGxpc3Qgd2lsbCBiZSBlbXB0eS4KKwkJICogPC9wPgorCQkgKi8KKwkJcHJpdmF0ZSBBcnJheUxpc3Qgc3RvcmUgPSBuZXcgQXJyYXlMaXN0KDApOworCQkKKwkJLyoqCisJCSAqIEluZGljYXRlZCB3aGV0aGVyIGN5Y2xlcyBhcmUgYSByaXNrLiBBIGN5Y2xlIGlzIHBvc3NpYmxlCisJCSAqIGlmIHRoZSB0eXBlIG9mIG5vZGVzIHRoYXQgZ2V0IGFkZGVkIHRvIHRoaXMgbGlzdCBjb3VsZAorCQkgKiBoYXZlIGEgbm9kZSBvZiB0aGUgb3duZXIncyB0eXBlIGFzIGEgZGVzY2VuZGVudC4KKwkJICovCisJCXByaXZhdGUgYm9vbGVhbiBjeWNsZUNoZWNrOworCQkKKwkJLyoqCisJCSAqIFRoZSBkZWNsYXJlZCB0eXBlIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzIGxpc3QuCisJCSAqLworCQlwcml2YXRlIENsYXNzIG5vZGVUeXBlOworCQkKKwkJLyoqCisJCSAqIEEgY3Vyc29yIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QuCisJCSAqIERvZXMgbm90IGxvc2UgaXRzIHBvc2l0aW9uIGlmIHRoZSBsaXN0IGlzIGNoYW5nZWQgZHVyaW5nCisJCSAqIHRoZSBpdGVyYXRpb24uCisJCSAqLworCQljbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBJdGVyYXRvciB7CisJCQkvKioKKwkJCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGJldHdlZW4gZWxlbWVudHMuIElmIHRoZSB2YWx1ZQorCQkJICogaXMgTiwgdGhlbiB0aGUgY3Vyc29yIHNpdHMgYmV0d2VlbiB0aGUgZWxlbWVudCBhdCBwb3NpdGlvbnMKKwkJCSAqIE4tMSBhbmQgTi4gSW5pdGlhbGx5IGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorCQkJICogbGlzdC4KKwkJCSAqLworCQkJcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAwOworCQkJCisJCQkvKiAobm9uLUphdmFkb2MpCisJCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgorCQkJICovCisJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQkJCXJldHVybiBwb3NpdGlvbiA8IHN0b3JlLnNpemUoKTsKKwkJCX0KKwkJCQorCQkJLyogKG5vbi1KYXZhZG9jKQorCQkJICogTWV0aG9kIGRlY2xhcmVkIG9uIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPi4KKwkJCSAqLworCQkJcHVibGljIE9iamVjdCBuZXh0KCkgeworCQkJCU9iamVjdCByZXN1bHQgPSBzdG9yZS5nZXQocG9zaXRpb24pOworCQkJCXBvc2l0aW9uKys7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJICAgIH0KKwkJCQorCQkJLyogKG5vbi1KYXZhZG9jKQorCQkJICogTWV0aG9kIGRlY2xhcmVkIG9uIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPi4KKwkJCSAqLworCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkJfQorCQkJCisJCQkvKioKKwkJCSAqIEFkanVzdHMgdGhpcyBjdXJzb3IgdG8gYWNjb21vZGF0ZSBhbiBhZGQvcmVtb3ZlIGF0IHRoZSBnaXZlbgorCQkJICogaW5kZXguCisJCQkgKiAKKwkJCSAqIEBwYXJhbSBpbmRleCB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGVsZW1lbnQgd2FzIGFkZGVkCisJCQkgKiAgICBvciByZW1vdmVkCisJCQkgKiBAcGFyYW0gZGVsdGEgKzEgZm9yIGFkZCwgYW5kIC0xIGZvciByZW1vdmUKKwkJCSAqLworCQkJdm9pZCB1cGRhdGUoaW50IGluZGV4LCBpbnQgZGVsdGEpIHsKKwkJCQlpZiAocG9zaXRpb24gPiBpbmRleCkgeworCQkJCQkvLyB0aGUgY3Vyc29yIGhhcyBwYXNzZWQgdGhlIGFkZGVkIG9yIHJlbW92ZWQgZWxlbWVudAorCQkJCQlwb3NpdGlvbiArPSBkZWx0YTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKioKKwkJICogQSBsaXN0IG9mIGN1cnJlbnRseSBhY3RpdmUgY3Vyc29ycyAoZWxlbWVudCB0eXBlOgorCQkgKiA8Y29kZT5DdXJzb3I8L2NvZGU+KSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vCisJCSAqIGFjdGl2ZSBjdXJzb3JzLgorCQkgKiA8cD4KKwkJICogSXQgaXMgaW1wb3J0YW50IGZvciBzdG9yYWdlIGNvbnNpZGVyYXRpb25zIHRvIG1haW50YWluIHRoZQorCQkgKiBudWxsLW1lYW5zLWVtcHR5IGludmFyaWFudDsgb3RoZXJ3aXNlLCBldmVyeSBOb2RlTGlzdCBpbnN0YW5jZQorCQkgKiB3aWxsIHdhc3RlIGEgbG90IG9mIHNwYWNlLiBBIGN1cnNvciBpcyBuZWVkZWQgb25seSBmb3IgdGhlIGR1cmF0aW9uCisJCSAqIG9mIGEgdmlzaXQgdG8gdGhlIGNoaWxkIG5vZGVzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgb25seSBhIAorCQkgKiBzaW5nbGUgY3Vyc29yIGlzIG5lZWRlZDsgbXVsdGlwbGUgY3Vyc29ycyBhcmUgb25seSByZXF1aXJlZCBpZiB0aGVyZQorCQkgKiBhcmUgbXVsdGlwbGUgdmlzaXRzIGdvaW5nIG9uIGF0IHRoZSBzYW1lIHRpbWUuCisJCSAqIDwvcD4KKwkJICovCisJCXByaXZhdGUgTGlzdCBjdXJzb3JzID0gbnVsbDsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0IG9mIG5vZGVzIG93bmVkIGJ5IHRoaXMgbm9kZS4KKwkJICogVGhpcyBub2RlIHdpbGwgYmUgdGhlIGNvbW1vbiBwYXJlbnQgb2YgYWxsIG5vZGVzIGFkZGVkIHRvIAorCQkgKiB0aGlzIGxpc3QuCisJCSAqIAorCQkgKiBAcGFyYW0gY3ljbGVDaGVjayA8Y29kZT50cnVlPC9jb2RlPiBpZiBjeWNsZXMgc2hvdWxkIGJlCisJCSAqICAgIGNoZWNrZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY3ljbGVzIGFyZSBub3QgYSByaXNrCisJCSAqIEBwYXJhbSBub2RlVHlwZSB0aGUgdHlwZSBvZiBhbGwgZWxlbWVudHMgb2YgdGhpcyBsaXN0CisJCSAqLworCQlOb2RlTGlzdChib29sZWFuIGN5Y2xlQ2hlY2ssIENsYXNzIG5vZGVUeXBlKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5jeWNsZUNoZWNrID0gY3ljbGVDaGVjazsgCisJCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7CisJCX0KKwkKKwkJLyoqCisJCSAqIEBzZWUgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiNzaXplKCkKKwkJICovCisJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJCXJldHVybiBzdG9yZS5zaXplKCk7CisJCX0KKwkKKwkJLyoqCisJCSAqIEBzZWUgQWJzdHJhY3RMaXN0I2dldChpbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBzdG9yZS5nZXQoaW5kZXgpOworCQl9CisJCisJCS8qKgorCQkgKiBAc2VlIExpc3Qjc2V0KGludCwgamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJCS8vIGRlbGluayBvbGQgY2hpbGQgZnJvbSBwYXJlbnQsIGFuZCBsaW5rIG5ldyBjaGlsZCB0byBwYXJlbnQKKwkJCUFTVE5vZGUgbmV3Q2hpbGQgPSAoQVNUTm9kZSkgZWxlbWVudDsKKwkJCUFTVE5vZGUgb2xkQ2hpbGQgPSAoQVNUTm9kZSkgc3RvcmUuZ2V0KGluZGV4KTsKKwkJCWlmIChvbGRDaGlsZCA9PSBuZXdDaGlsZCkgeworCQkJCXJldHVybiBvbGRDaGlsZDsKKwkJCX0KKwkJCUFTVE5vZGUuY2hlY2tOZXdDaGlsZChBU1ROb2RlLnRoaXMsIG5ld0NoaWxkLCBjeWNsZUNoZWNrLCBub2RlVHlwZSk7CisJCQlPYmplY3QgcmVzdWx0ID0gc3RvcmUuc2V0KGluZGV4LCBuZXdDaGlsZCk7CisJCQkvLyBuLmIuIHNldFBhcmVudCB3aWxsIGNhbGwgbW9kaWZ5aW5nKCkKKwkJCW9sZENoaWxkLnNldFBhcmVudChudWxsKTsKKwkJCW5ld0NoaWxkLnNldFBhcmVudChBU1ROb2RlLnRoaXMpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBzZWUgTGlzdCNhZGQoaW50LCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJCS8vIGxpbmsgbmV3IGNoaWxkIHRvIHBhcmVudAorCQkJQVNUTm9kZSBuZXdDaGlsZCA9IChBU1ROb2RlKSBlbGVtZW50OworCQkJQVNUTm9kZS5jaGVja05ld0NoaWxkKEFTVE5vZGUudGhpcywgbmV3Q2hpbGQsIGN5Y2xlQ2hlY2ssIG5vZGVUeXBlKTsKKwkJCXN0b3JlLmFkZChpbmRleCwgZWxlbWVudCk7CisJCQl1cGRhdGVDdXJzb3JzKGluZGV4LCArMSk7CisJCQkvLyBuLmIuIHNldFBhcmVudCB3aWxsIGNhbGwgbW9kaWZ5aW5nKCkKKwkJCW5ld0NoaWxkLnNldFBhcmVudChBU1ROb2RlLnRoaXMpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBMaXN0I3JlbW92ZShpbnQpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKKwkJCS8vIGRlbGluayBvbGQgY2hpbGQgZnJvbSBwYXJlbnQKKwkJCUFTVE5vZGUgb2xkQ2hpbGQgPSAoQVNUTm9kZSkgc3RvcmUuZ2V0KGluZGV4KTsKKwkJCS8vIG4uYi4gc2V0UGFyZW50IHdpbGwgY2FsbCBtb2RpZnlpbmcoKQorCQkJb2xkQ2hpbGQuc2V0UGFyZW50KG51bGwpOworCQkJT2JqZWN0IHJlc3VsdCA9IHN0b3JlLnJlbW92ZShpbmRleCk7CisJCQl1cGRhdGVDdXJzb3JzKGluZGV4LCAtMSk7CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0KKwkJCisJCS8qKgorCQkgKiBBbGxvY2F0ZSBhIGN1cnNvciB0byB1c2UgZm9yIGEgdmlzaXQuIFRoZSBjbGllbnQgbXVzdCBjYWxsCisJCSAqIDxjb2RlPnJlbGVhc2VDdXJzb3I8L2NvZGU+IHdoZW4gZG9uZS4KKwkJICogCisJCSAqIEByZXR1cm4gYSBuZXcgY3Vyc29yIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IAorCQkgKiAgICBvZiB0aGUgbGlzdAorCQkgKi8KKwkJQ3Vyc29yIG5ld0N1cnNvcigpIHsKKwkJCWlmIChjdXJzb3JzID09IG51bGwpIHsKKwkJCQkvLyBjb252ZXJ0IG51bGwgdG8gZW1wdHkgbGlzdAorCQkJCWN1cnNvcnMgPSBuZXcgQXJyYXlMaXN0KDEpOworCQkJfQorCQkJQ3Vyc29yIHJlc3VsdCA9IG5ldyBDdXJzb3IoKTsKKwkJCWN1cnNvcnMuYWRkKHJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCQorCQkvKioKKwkJICogUmVsZWFzZXMgdGhlIGdpdmVuIGN1cnNvciBhdCB0aGUgZW5kIG9mIGEgdmlzaXQuCisJCSAqIAorCQkgKiBAcGFyYW0gY3Vyc29yIHRoZSBjdXJzb3IKKwkJICovCisJCXZvaWQgcmVsZWFzZUN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CisJCQljdXJzb3JzLnJlbW92ZShjdXJzb3IpOworCQkJaWYgKGN1cnNvcnMuaXNFbXB0eSgpKSB7CisJCQkJLy8gaW1wb3J0YW50OiBjb252ZXJ0IGVtcHR5IGxpc3QgYmFjayB0byBudWxsCisJCQkJLy8gb3RoZXJ3aXNlIHRoZSBub2RlIHdpbGwgaGFuZyBvbiB0byBuZWVkbGVzcyBqdW5rCisJCQkJY3Vyc29ycyA9IG51bGw7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogQWRqdXN0cyBhbGwgY3Vyc29ycyB0byBhY2NvbW9kYXRlIGFuIGFkZC9yZW1vdmUgYXQgdGhlIGdpdmVuCisJCSAqIGluZGV4LgorCQkgKiAKKwkJICogQHBhcmFtIGluZGV4IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgZWxlbWVudCB3YXMgYWRkZWQKKwkJICogICAgb3IgcmVtb3ZlZAorCQkgKiBAcGFyYW0gZGVsdGEgKzEgZm9yIGFkZCwgYW5kIC0xIGZvciByZW1vdmUKKwkJICovCisJCXByaXZhdGUgdm9pZCB1cGRhdGVDdXJzb3JzKGludCBpbmRleCwgaW50IGRlbHRhKSB7CisJCQlpZiAoY3Vyc29ycyA9PSBudWxsKSB7CisJCQkJLy8gdGhlcmUgYXJlIG5vIGN1cnNvcnMgdG8gd29ycnkgYWJvdXQKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3Vyc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJCUN1cnNvciBjID0gKEN1cnNvcikgaXQubmV4dCgpOworCQkJCWMudXBkYXRlKGluZGV4LCBkZWx0YSk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoaXMgbm9kZSBsaXN0IAorCQkgKiBpbnN0YW5jZSBpbiBieXRlcy4KKwkgICAgICogPHVsPgorCSAgICAgKiA8bGk+MSBvYmplY3QgaGVhZGVyIGZvciB0aGUgTm9kZUxpc3QgaW5zdGFuY2U8L2xpPgorCSAgICAgKiA8bGk+NSA0LWJ5dGUgZmllbGRzIG9mIHRoZSBOb2RlTGlzdCBpbnN0YW5jZTwvbGk+CisJICAgICAqIDxsaT4wIGZvciBjdXJzb3JzIHNpbmNlIG51bGwgdW5sZXNzIHdhbGsgaW4gcHJvZ3Jlc3M8L2xpPgorCSAgICAgKiA8bGk+MSBvYmplY3QgaGVhZGVyIGZvciB0aGUgQXJyYXlMaXN0IGluc3RhbmNlPC9saT4KKwkgICAgICogPGxpPjIgNC1ieXRlIGZpZWxkcyBvZiB0aGUgQXJyYXlMaXN0IGluc3RhbmNlPC9saT4KKwkgICAgICogPGxpPjEgb2JqZWN0IGhlYWRlciBmb3IgYW4gT2JqZWN0W10gaW5zdGFuY2U8L2xpPgorCSAgICAgKiA8bGk+NCBieXRlcyBpbiBhcnJheSBmb3IgZWFjaCBlbGVtZW50PC9saT4KKwkgICAgICogPC91bD4KKwkgCSAqIAorCQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbm9kZSBsaXN0IGluIGJ5dGVzCisJCSAqLworCQlpbnQgbWVtU2l6ZSgpIHsKKwkJCWludCByZXN1bHQgPSBIRUFERVJTICsgNSAqIDQ7CisJCQlyZXN1bHQgKz0gSEVBREVSUyArIDIgKiA0OworCQkJcmVzdWx0ICs9IEhFQURFUlMgKyA0ICogc2l6ZSgpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IGluIGJ5dGVzIG9mIHRoaXMgbm9kZQorCQkgKiBsaXN0IGFuZCBhbGwgaXRzIHN1YnRyZWVzLgorCQkgKiAKKwkJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxpc3Qgb2Ygc3VidHJlZXMgaW4gYnl0ZXMKKwkJICovCisJCWludCBsaXN0U2l6ZSgpIHsKKwkJCWludCByZXN1bHQgPSBtZW1TaXplKCk7CisJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCQlBU1ROb2RlIGNoaWxkID0gKEFTVE5vZGUpIGl0Lm5leHQoKTsKKwkJCQlyZXN1bHQgKz0gY2hpbGQudHJlZVNpemUoKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuIE9uY2UgZXN0YWJsaXNoZWQsCisJICogdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIEFTVCBub2RlIGFuZCBpdHMgb3duaW5nIEFTVCBkb2VzIG5vdCBjaGFuZ2UKKwkgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgbm9kZS4gVGhlIG5ldyBub2RlIGhhcyBubyBwYXJlbnQgbm9kZSwKKwkgKiBhbmQgbm8gcHJvcGVydGllcy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBteSBiZSAKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlBU1ROb2RlKEFTVCBhc3QpIHsKKwkJaWYgKGFzdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJb3duZXIgPSBhc3Q7CisJCW1vZGlmeWluZygpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgbm9kZSdzIEFTVC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFuIEFTVCBub2RlIGFuZCBpdHMgb3dpbmcgQVNUIGRvZXMKKwkgKiBub3QgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgbm9kZS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgQVNUIHRoYXQgb3ducyB0aGlzIG5vZGUKKwkgKi8gCisJcHVibGljIEFTVCBnZXRBU1QoKSB7CisJCXJldHVybiBvd25lcjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGlzIG5vZGUncyBwYXJlbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyB0aGUKKwkgKiByb290IG5vZGUuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbiBBU1Qgbm9kZSBhbmQgaXRzIHBhcmVudCBub2RlCisJICogbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiBhIG5vZGUuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8gCisJcHVibGljIEFTVE5vZGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKwkJCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBub2RlIGF0IG9yIGFib3ZlIHRoaXMgbm9kZTsgcmV0dXJucyB0aGlzIG5vZGUgaWYgCisJICogaXQgaXMgYSByb290LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBhdCBvciBhYm92ZSB0aGlzIG5vZGUKKwkgKi8gCisJcHVibGljIEFTVE5vZGUgZ2V0Um9vdCgpIHsKKwkJQVNUTm9kZSBjYW5kaWRhdGUgPSB0aGlzOworCQl3aGlsZSAodHJ1ZSkgeworCQkJQVNUTm9kZSBwID0gY2FuZGlkYXRlLmdldFBhcmVudCgpOworCQkJaWYgKHAgPT0gbnVsbCkgeworCQkJCS8vIGNhbmRpZGF0ZSBoYXMgbm8gcGFyZW50IC0gdGhhdCdzIHRoZSBndXkKKwkJCQlyZXR1cm4gY2FuZGlkYXRlOworCQkJfQorCQkJY2FuZGlkYXRlID0gcDsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBJbnRlcm5hbCBjYWxsYmFjayBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCBvZiB0aGlzIG5vZGUgaXMgYWJvdXQgdG8KKwkgKiBiZSBtb2RpZmllZC4KKwkgKi8KKwl2b2lkIG1vZGlmeWluZygpIHsKKwkJZ2V0QVNUKCkubW9kaWZ5aW5nKCk7CisJfQorCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhpcyBub2RlJ3MgcGFyZW50IG5vZGUuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHBhY2thZ2UtcHJpdmF0ZS4gVGhlIHBvaW50ZXIgZnJvbSBhIG5vZGUKKwkgKiB0byBpdHMgcGFyZW50IGlzIHNldCBpbXBsaWNpdGx5IGFzIGEgc2lkZSBlZmZlY3Qgb2YgaW5zZXJ0aW5nIG9yCisJICogcmVtb3ZpbmcgdGhlIG5vZGUgYXMgYSBjaGlsZCBvZiBhbm90aGVyIG5vZGUuIFRoaXMgbWV0aG9kIGNhbGxzCisJICogPGNvZGU+bW9kaWZ5aW5nPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHBhcmVudCB0aGUgbmV3IHBhcmVudCBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8gCisJdm9pZCBzZXRQYXJlbnQoQVNUTm9kZSBwYXJlbnQpIHsKKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMucGFyZW50ID0gcGFyZW50OworCX0KKwkKKwkvKioKKwkgKiBSZXBsYWNlcyBhbiBvbGQgY2hpbGQgb2YgdGhpcyBub2RlIHdpdGggYW5vdGhlciBub2RlLgorCSAqIFRoZSBvbGQgY2hpbGQgaXMgZGVsaW5rZWQgZnJvbSBpdHMgcGFyZW50IChtYWtpbmcgaXQgYSByb290IG5vZGUpLAorCSAqIGFuZCB0aGUgbmV3IGNoaWxkIG5vZGUgaXMgbGlua2VkIHRvIGl0cyBwYXJlbnQuIFRoZSBuZXcgY2hpbGQgbm9kZQorCSAqIG11c3QgYmUgYSByb290IG5vZGUgaW4gdGhlIHNhbWUgQVNUIGFzIGl0cyBuZXcgcGFyZW50LCBhbmQgbXVzdCBub3QKKwkgKiBiZSBhbiBhbmNlc3RvciBvZiB0aGlzIG5vZGUuIFRoaXMgb3BlcmF0aW9uIGZhaWxzIGF0b21pY2FsbHk7CisJICogYWxsIHByZWNvbmRpdGlvbiBjaGVja3MgYXJlIGRvbmUgYmVmb3JlIGFueSBsaW5raW5nIGFuZCBkZWxpbmtpbmcKKwkgKiBpcyBkb25lLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGNhbGxzIDxjb2RlPm1vZGlmeWluZzwvY29kZT4gZm9yIHRoZSBub2RlcyBhZmZlY3RlZC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG9sZENoaWxkIHRoZSBvbGQgY2hpbGQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqICAgdGhlcmUgd2FzIG5vIG9sZCBjaGlsZCB0byByZXBsYWNlCisJICogQHBhcmFtIG5ld0NoaWxkIHRoZSBuZXcgY2hpbGQgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqICAgdGhlcmUgaXMgbm8gcmVwbGFjZW1lbnQgY2hpbGQKKwkgKiBAcGFyYW0gY3ljbGVDaGVjayA8Y29kZT50cnVlPC9jb2RlPiBpZiBjeWNsZXMgYXJlIHBvc3NpYmxlIGFuZCBuZWVkIHRvCisJICogICBiZSBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY3ljbGVzIGFyZSBpbXBvc3NpYmxlIGFuZCBkbyBub3QKKwkgKiAgIG5lZWQgdG8gYmUgY2hlY2tlZAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJdm9pZCByZXBsYWNlQ2hpbGQoQVNUTm9kZSBvbGRDaGlsZCwgQVNUTm9kZSBuZXdDaGlsZCwgYm9vbGVhbiBjeWNsZUNoZWNrKSB7CisJCWlmIChuZXdDaGlsZCAhPSBudWxsKSB7CisJCQljaGVja05ld0NoaWxkKHRoaXMsIG5ld0NoaWxkLCBjeWNsZUNoZWNrLCBudWxsKTsKKwkJfQorCQkvLyBkZWxpbmsgb2xkIGNoaWxkIGZyb20gcGFyZW50CisJCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7CisJCQlvbGRDaGlsZC5zZXRQYXJlbnQobnVsbCk7CisJCX0KKwkJLy8gbGluayBuZXcgY2hpbGQgdG8gcGFyZW50CisJCWlmIChuZXdDaGlsZCAhPSBudWxsKSB7CisJCQluZXdDaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbmV3IGNoaWxkIG5vZGUgaXMgYSBub2RlIAorCSAqIGluIGEgZGlmZmVyZW50IEFTVCBmcm9tIGl0cyBwYXJlbnQtdG8tYmUsIHdoZXRoZXIgaXQgaXMKKwkgKiBhbHJlYWR5IGhhcyBhIHBhcmVudCwgd2hldGhlciBhZGRpbmcgaXQgdG8gaXRzCisJICogcGFyZW50LXRvLWJlIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlLCBhbmQgd2hldGhlciB0aGUgY2hpbGQgaXMgb2YKKwkgKiB0aGUgcmlnaHQgdHlwZS4gVGhlIHBhcmVudC10by1iZSBpcyB0aGUgZW5jbG9zaW5nIGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBwYXJlbnQtdG8tYmUgbm9kZQorCSAqIEBwYXJhbSBuZXdDaGlsZCB0aGUgbmV3IGNoaWxkIG9mIHRoZSBwYXJlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorCSAqICAgaWYgdGhlcmUgaXMgbm8gcmVwbGFjZW1lbnQgY2hpbGQKKwkgKiBAcGFyYW0gY3ljbGVDaGVjayA8Y29kZT50cnVlPC9jb2RlPiBpZiBjeWNsZXMgYXJlIHBvc3NpYmxlIGFuZCBuZWVkIAorCSAqICAgdG8gYmUgY2hlY2tlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGN5Y2xlcyBhcmUgaW1wb3NzaWJsZSBhbmQgZG8gCisJICogICBub3QgbmVlZCB0byBiZSBjaGVja2VkCisJICogQHBhcmFtIG5vZGVUeXBlIGEgdHlwZSBjb25zdHJhaW50IG9uIGNoaWxkIG5vZGVzLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgaWYgbm8gc3BlY2lhbCBjaGVjayBpcyByZXF1aXJlZAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIGNoaWxkIGlzIG51bGw8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBjaGlsZCBoYXMgdGhlIGluY29ycmVjdCBub2RlIHR5cGU8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJc3RhdGljIHZvaWQgY2hlY2tOZXdDaGlsZChBU1ROb2RlIG5vZGUsIEFTVE5vZGUgbmV3Q2hpbGQsCisJCQlib29sZWFuIGN5Y2xlQ2hlY2ssIENsYXNzIG5vZGVUeXBlKSB7CisJCUFTVCBhc3QgPSBub2RlLmdldEFTVCgpOworCQlpZiAobmV3Q2hpbGQuZ2V0QVNUKCkgIT0gYXN0KSB7CisJCQkvLyBuZXcgY2hpbGQgaXMgZnJvbSBhIGRpZmZlcmVudCBBU1QKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkKKwkJaWYgKG5ld0NoaWxkLmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCS8vIG5ldyBjaGlsZCBjdXJyZW50bHkgaGFzIGEgZGlmZmVyZW50IHBhcmVudAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWlmIChjeWNsZUNoZWNrICYmIG5ld0NoaWxkID09IG5vZGUuZ2V0Um9vdCgpKSB7CisJCQkvLyBpbnNlcnRpbmcgbmV3IGNoaWxkIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJQ2xhc3MgY2hpbGRDbGFzcyA9IG5ld0NoaWxkLmdldENsYXNzKCk7CisJCWlmIChub2RlVHlwZSAhPSBudWxsICYmICFub2RlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGNoaWxkQ2xhc3MpKSB7CisJCQkvLyBuZXcgY2hpbGQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lZCBwcm9wZXJ0eSBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZQorCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHNlZSAjc2V0UHJvcGVydHkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKHByb3BlcnR5MSA9PSBudWxsKSB7CisJCQkvLyBub2RlIGhhcyBubyBwcm9wZXJ0aWVzIGF0IGFsbAorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHByb3BlcnR5MSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gbm9kZSBoYXMgb25seSBhIHNpbmdsZSBwcm9wZXJ0eQorCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMocHJvcGVydHkxKSkgeworCQkJCXJldHVybiBwcm9wZXJ0eTI7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCS8vIG90aGVyd2lzZSBub2RlIGhhcyB0YWJsZSBvZiBwcm9wZXJ0aWVzCisJCU1hcCBtID0gKE1hcCkgcHJvcGVydHkxOworCQlyZXR1cm4gbS5nZXQocHJvcGVydHlOYW1lKTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgb2YgdGhpcyBub2RlIHRvIHRoZSBnaXZlbiB2YWx1ZSwKKwkgKiBvciB0byA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciBpdC4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIHNob3VsZCBlbXBsb3kgcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUgc3VmZmljaWVudGx5IHVuaXF1ZQorCSAqIHRvIGF2b2lkIGluYWR2ZXJ0ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyIGNsaWVudHMgdGhhdCBtaWdodCBhbHNvIGJlCisJICogc2V0dGluZyBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIG5vZGUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBpcyBub3QgY29uc2lkZXJlZCBhIG1vZGlmaWNhdGlvbiB0byB0aGUgCisJICogQVNUIGl0c2VsZi4gVGhpcyBpcyB0byBhbGxvdyBjbGllbnRzIHRvIGRlY29yYXRlIGV4aXN0aW5nIG5vZGVzIHdpdGggCisJICogdGhlaXIgb3duIHByb3BlcnRpZXMgd2l0aG91dCBqZW9wYXJkaXppbmcgY2VydGFpbiB0aGluZ3MgKGxpa2UgdGhlIAorCSAqIHZhbGlkaXR5IG9mIGJpbmRpbmdzKSwgd2hpY2ggcmVseSBvbiB0aGUgdW5kZXJseWluZyB0cmVlIHJlbWFpbmluZyBzdGF0aWMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUKKwkgKiBAcGFyYW0gZGF0YSB0aGUgbmV3IHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHNlZSAjZ2V0UHJvcGVydHkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgeworCQlpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBOLkIuIERPIE5PVCBDQUxMIG1vZGlmeWluZygpOworCisJCWlmIChwcm9wZXJ0eTEgPT0gbnVsbCkgeworCQkJLy8gbm9kZSBoYXMgbm8gcHJvcGVydGllcyBhdCBhbGwKKwkJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCQkvLyB3ZSBhbHJlYWR5IGtub3cgdGhpcworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIG5vZGUgZ2V0cyBpdHMgZmlzdCBwcm9wZXJ0eQorCQkJcHJvcGVydHkxID0gcHJvcGVydHlOYW1lOworCQkJcHJvcGVydHkyID0gZGF0YTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChwcm9wZXJ0eTEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCS8vIG5vZGUgaGFzIG9ubHkgYSBzaW5nbGUgcHJvcGVydHkKKwkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKHByb3BlcnR5MSkpIHsKKwkJCQkvLyB3ZSdyZSBpbiBsdWNrCisJCQkJcHJvcGVydHkyID0gZGF0YTsKKwkJCQlpZiAoZGF0YSA9PSBudWxsKSB7CisJCQkJCS8vIGp1c3QgZGVsZXRlZCBsYXN0IHByb3BlcnR5CisJCQkJCXByb3BlcnR5MSA9IG51bGw7CisJCQkJCXByb3BlcnR5MiA9IG51bGw7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCQkvLyB3ZSBhbHJlYWR5IGtub3cgdGhpcworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIG5vZGUgYWxyZWFkeSBoYXMgb25lIHByb3BlcnR5IC0gZ2V0dGluZyBpdHMgc2Vjb25kCisJCQkvLyBjb252ZXJ0IHRvIG1vcmUgZmxleGlibGUgcmVwcmVzZW50YXRpb24KKwkJCUhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKDIpOworCQkJbS5wdXQocHJvcGVydHkxLCBwcm9wZXJ0eTIpOworCQkJbS5wdXQocHJvcGVydHlOYW1lLCBkYXRhKTsKKwkJCXByb3BlcnR5MSA9IG07CisJCQlwcm9wZXJ0eTIgPSBudWxsOworCQkJcmV0dXJuOworCQl9CisJCQkKKwkJLy8gbm9kZSBoYXMgdHdvIG9yIG1vcmUgcHJvcGVydGllcworCQlIYXNoTWFwIG0gPSAoSGFzaE1hcCkgcHJvcGVydHkxOworCQlpZiAoZGF0YSA9PSBudWxsKSB7CisJCQltLnJlbW92ZShwcm9wZXJ0eU5hbWUpOworCQkJLy8gY2hlY2sgZm9yIGp1c3Qgb25lIHByb3BlcnR5IGxlZnQKKwkJCWlmIChtLnNpemUoKSA9PSAxKSB7CisJCQkJLy8gY29udmVydCB0byBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbgorCQkJCU1hcC5FbnRyeVtdIGVudHJpZXMgPSAoTWFwLkVudHJ5W10pIG0uZW50cnlTZXQoKS50b0FycmF5KG5ldyBNYXAuRW50cnlbMV0pOworCQkJCXByb3BlcnR5MSA9IGVudHJpZXNbMF0uZ2V0S2V5KCk7CisJCQkJcHJvcGVydHkyID0gZW50cmllc1swXS5nZXRWYWx1ZSgpOworCQkJfQorCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJbS5wdXQocHJvcGVydHlOYW1lLCBkYXRhKTsKKwkJCS8vIHN0aWxsIGhhcyB0d28gb3IgbW9yZSBwcm9wZXJ0aWVzCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB0YWJsZSBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIG5vZGUgd2l0aCAKKwkgKiBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWVzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRhYmxlIG9mIHByb3BlcnR5IHZhbHVlcyBrZXllZCBieSBwcm9wZXJ0eSBuYW1lCisJICogICAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCisJICovCisJcHVibGljIE1hcCBwcm9wZXJ0aWVzKCkgeworCQlpZiAocHJvcGVydHkxID09IG51bGwpIHsKKwkJCS8vIG5vZGUgaGFzIG5vIHByb3BlcnRpZXMgYXQgYWxsCisJCQlyZXR1cm4gVU5NT0RJRklBQkxFX0VNUFRZX01BUDsKKwkJfSAKKwkJaWYgKHByb3BlcnR5MSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gbm9kZSBoYXMgYSBzaW5nbGUgcHJvcGVydHkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAocHJvcGVydHkxLCBwcm9wZXJ0eTIpOworCQl9CisJCQorCQkvLyBub2RlIGhhcyB0d28gb3IgbW9yZSBwcm9wZXJ0aWVzCisJCWlmIChwcm9wZXJ0eTIgPT0gbnVsbCkgeworCQkJcHJvcGVydHkyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKChNYXApIHByb3BlcnR5MSk7CisJCX0KKwkJLy8gcHJvcGVydHkyIGlzIHVubW9kaWZpYWJsZSB3cmFwcGVyIGZvciBtYXAgaW4gcHJvcGVydHkxCisJCXJldHVybiAoTWFwKSBwcm9wZXJ0eTI7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCisJICogPHA+CisJICogTm8gZmxhZ3MgYXJlIGFzc29jaWF0ZWQgd2l0aCBuZXdseSBjcmVhdGVkIG5vZGVzLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZmxhZ3MgYXJlIHRoZSBiaXR3aXNlLW9yIG9mIGluZGl2aWR1YWwgZmxhZ3MuCisJICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT5NQUxGT1JNRUQ8L2NvZGU+IC0gaW5kaWNhdGVzIG5vZGUgaXMgc3ludGFjdGljYWxseSAKKwkgKiAgIG1hbGZvcm1lZDwvbGk+CisJICogPC91bD4KKwkgKiBPdGhlciBiaXQgcG9zaXRpb25zIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYml0d2lzZS1vciBvZiBpbmRpdmlkdWFsIGZsYWdzCisJICogQHNlZSAjc2V0RmxhZ3MKKwkgKiBAc2VlICNNQUxGT1JNRUQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEZsYWdzKCkgeworCQlyZXR1cm4gZmxhZ3M7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUgdG8gdGhlIGdpdmVuIHZhbHVlLgorCSAqIDxwPgorCSAqIFRoZSBmbGFncyBhcmUgdGhlIGJpdHdpc2Utb3Igb2YgaW5kaXZpZHVhbCBmbGFncy4KKwkgKiBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBjdXJyZW50bHkgZGVmaW5lZDoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPk1BTEZPUk1FRDwvY29kZT4gLSBpbmRpY2F0ZXMgbm9kZSBpcyBzeW50YWN0aWNhbGx5IAorCSAqICAgbWFsZm9ybWVkPC9saT4KKwkgKiA8L3VsPgorCSAqIE90aGVyIGJpdCBwb3NpdGlvbnMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGJpdHdpc2Utb3Igb2YgaW5kaXZpZHVhbCBmbGFncworCSAqIEBzZWUgI2dldEZsYWdzCisJICogQHNlZSAjTUFMRk9STUVECisJICovCisJcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7CisJCW1vZGlmeWluZygpOworCQl0aGlzLmZsYWdzID0gZmxhZ3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIHRoaXMgY29uY3JldGUgQVNUIG5vZGUuCisJICogVGhlIHZhbHVlcyBhcmUgc21hbGwgcG9zaXRpdmUgaW50ZWdlcnMsIHN1aXRhYmxlIGZvciB1c2UgaW4gc3dpdGNoIHN0YXRlbWVudHMuCisJICogPHA+CisJICogRm9yIGVhY2ggY29uY3JldGUgbm9kZSB0eXBlIHRoZXJlIGlzIGEgdW5pcXVlIG5vZGUgdHlwZSBjb25zdGFudCAobmFtZQorCSAqIGFuZCB2YWx1ZSkuIFRoZSB1bmlxdWUgbm9kZSB0eXBlIGNvbnN0YW50IGZvciBhIGNvbmNyZXRlIG5vZGUgdHlwZSBzdWNoIGFzIAorCSAqIDxjb2RlPkNhc3RFeHByZXNzaW9uPC9jb2RlPiBpcyA8Y29kZT5BU1ROb2RlLkNBU1RfRVhQUkVTU0lPTjwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gb25lIG9mIHRoZSBub2RlIHR5cGUgY29uc3RhbnRzCisJICovCisJcHVibGljIGFic3RyYWN0IGludCBnZXROb2RlVHlwZSgpOworCQorCS8qKgorCSAqIFRoZSA8Y29kZT5BU1ROb2RlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPk9iamVjdDwvY29kZT4KKwkgKiBtZXRob2QgdXNlcyBvYmplY3QgaWRlbnRpdHkgKD09KS4gVXNlIDxjb2RlPnN1YnRyZWVNYXRjaDwvY29kZT4gdG8KKwkgKiBjb21wYXJlIHR3byBzdWJ0cmVlcyBmb3IgZXF1YWxpdHkuCisJICogCisJICogQHNlZSAjc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKQorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCXJldHVybiB0aGlzID09IG9iajsgLy8gZXF1aXZhbGVudCB0byBPYmplY3QuZXF1YWxzCisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgZ2l2ZW4gbm9kZSBtYXRjaGVzIHRoZQorCSAqIGdpdmVuIG90aGVyIG9iamVjdCBhcyBkZWNpZGVkIGJ5IHRoZSBnaXZlbiBtYXRjaGVyLgorCSAqIAorCSAqIEBwYXJhbSBtYXRjaGVyIHRoZSBtYXRjaGVyCisJICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3VidHJlZSBtYXRjaGVzLCBvciAKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleSBkbyBub3QgbWF0Y2gKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpOworCQorCS8qKgorCSAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIHN1YnRyZWUgb2YgQVNUIG5vZGVzIHJvb3RlZCBhdCB0aGUKKwkgKiBnaXZlbiBub2RlLiBUaGUgcmVzdWx0aW5nIG5vZGVzIGFyZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULAorCSAqIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgQVNUcyBvZiB0aGUgZ2l2ZW4gbm9kZS4gCisJICogRXZlbiBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgYSBwYXJlbnQsIHRoZSByZXN1bHQgbm9kZSB3aWxsIGJlIHVucGFyZW50ZWQuCisJICogPHA+CisJICogTm90ZSB0aGF0IGNsaWVudCBwcm9wZXJ0aWVzIGFyZSBub3QgY2FycmllZCBvdmVyIHRvIHRoZSBuZXcgbm9kZXMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGUgbm9kZXMgaW4gdGhlIHJlc3VsdAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGNvcHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAcmV0dXJuIHRoZSBjb3BpZWQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+bm9kZTwvY29kZT4KKwkgKiAgICBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgQVNUTm9kZSBjb3B5U3VidHJlZShBU1QgdGFyZ2V0LCBBU1ROb2RlIG5vZGUpIHsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQVNUTm9kZSBuZXdOb2RlID0gbm9kZS5jbG9uZSh0YXJnZXQpOworCQlyZXR1cm4gbmV3Tm9kZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSBzdWJ0cmVlcyBvZiBBU1Qgbm9kZXMgcm9vdGVkIGF0IHRoZQorCSAqIGdpdmVuIGxpc3Qgb2Ygbm9kZXMuIFRoZSByZXN1bHRpbmcgbm9kZXMgYXJlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QsCisJICogd2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBBU1RzIG9mIHRoZSBub2RlcyBpbiB0aGUgbGlzdC4gCisJICogRXZlbiBpZiB0aGUgbm9kZXMgaW4gdGhlIGxpc3QgaGF2ZSBwYXJlbnRzLCB0aGUgbm9kZXMgaW4gdGhlIHJlc3VsdAorCSAqIHdpbGwgYmUgdW5wYXJlbnRlZC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgY2xpZW50IHByb3BlcnRpZXMgYXJlIG5vdCBjYXJyaWVkIG92ZXIgdG8gdGhlIG5ldyBub2Rlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHRhcmdldCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoZSBub2RlcyBpbiB0aGUgcmVzdWx0CisJICogQHBhcmFtIG5vZGVzIHRoZSBsaXN0IG9mIG5vZGVzIHRvIGNvcHkKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5BU1ROb2RlPC9jb2RlPikKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvcGllZCBzdWJ0cmVlcworCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkFTVE5vZGU8L2NvZGU+KQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBjb3B5U3VidHJlZXMoQVNUIHRhcmdldCwgTGlzdCBub2RlcykgeworCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Qobm9kZXMuc2l6ZSgpKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlBU1ROb2RlIG9sZE5vZGUgPSAoQVNUTm9kZSkgaXQubmV4dCgpOworCQkJQVNUTm9kZSBuZXdOb2RlID0gb2xkTm9kZS5jbG9uZSh0YXJnZXQpOworCQkJcmVzdWx0LmFkZChuZXdOb2RlKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIHN1YnRyZWUgb2YgQVNUIG5vZGVzIHJvb3RlZCBhdCB0aGlzIG5vZGUuCisJICogVGhlIHJlc3VsdGluZyBub2RlcyBhcmUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVCwgd2hpY2ggbWF5IGJlIGRpZmZlcmVudAorCSAqIGZyb20gdGhlIEFTVCBvZiB0aGlzIG5vZGUuIEV2ZW4gaWYgdGhpcyBub2RlIGhhcyBhIHBhcmVudCwgdGhlIAorCSAqIHJlc3VsdCBub2RlIHdpbGwgYmUgdW5wYXJlbnRlZC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgbWV0aG9kIGlzIHBhY2thZ2UtcHJpdmF0ZSwgc28gdGhhdCB0aGUgaW1wbGVtZW50YXRpb25zCisJICogb2YgdGhpcyBtZXRob2QgaW4gZWFjaCBvZiB0aGUgY29uY3JldGUgQVNUIG5vZGUgdHlwZXMgZG8gbm90CisJICogY2x1dHRlciB1cCB0aGUgQVBJIGRvYy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHRhcmdldCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoZSBub2RlcyBpbiB0aGUgcmVzdWx0CisJICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBjb3BpZXMgc3VidHJlZQorCSAqLworCWFic3RyYWN0IEFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCk7CisKKwkvKioKKwkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdmlzaXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmlzaXRvciBpcyBudWxsCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgYWNjZXB0KEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlpZiAodmlzaXRvciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYmVnaW4gd2l0aCB0aGUgZ2VuZXJpYyBwcmUtdmlzaXQKKwkJdmlzaXRvci5wcmVWaXNpdCh0aGlzKTsKKwkJLy8gZHluYW1pYyBkaXNwYXRjaCB0byBpbnRlcm5hbCBtZXRob2QgZm9yIHR5cGUtc3BlY2lmaWMgdmlzaXQvZW5kVmlzaXQKKwkJYWNjZXB0MCh2aXNpdG9yKTsKKwkJLy8gZW5kIHdpdGggdGhlIGdlbmVyaWMgcG9zdC12aXNpdAorCQl2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdHlwZS1zcGVjaWZpYyB2aXNpdCBvZiB0aGUgY3VycmVudCBub2RlLgorCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYWxsIGNvbmNyZXRlIEFTVCBub2RlIHR5cGVzLgorCSAqIDxwPgorCSAqIEdlbmVyYWwgdGVtcGxhdGUgZm9yIGltcGxlbWVudGF0aW9uIG9uIGVhY2ggY29uY3JldGUgQVNUTm9kZSBjbGFzczoKKwkgKiA8cHJlPgorCSAqIDxjb2RlPgorCSAqIGJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJICogaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkgKiAgICAvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkxKCkpOworCSAqICAgIGFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHJhd0xpc3RQcm9wZXJ0eSk7CisJICogICAgYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UHJvcGVydHkyKCkpOworCSAqIH0KKwkgKiB2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCSAqIDwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciAoPGNvZGU+YWNjZXB0PC9jb2RlPikgdGFrZSBjYXJlcyBvZiBpbnZva2luZworCSAqIDxjb2RlPnZpc2l0b3IucHJlVmlzaXQodGhpcyk8L2NvZGU+IGFuZCA8Y29kZT52aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAorCSAqLworCWFic3RyYWN0IHZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpOworCisJLyoqCisJICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBjdXJyZW50IG5vZGUuCisJICogPHA+CisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZgorCSAqIDxjb2RlPmFjY2VwdDA8L2NvZGU+IHRvIHRyYXZlcnNlIG9wdGlvbmFsIHByb3BlcnRpZXMuIEVxdWl2YWxlbnQKKwkgKiB0byA8Y29kZT5jaGlsZC5hY2NlcHQodmlzaXRvcik8L2NvZGU+IGlmIDxjb2RlPmNoaWxkPC9jb2RlPgorCSAqIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0CisJICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBBU1Qgbm9kZSB0byBkaXNwYXRjaCB0b28sIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgaWYgbm9uZQorCSAqLworCWZpbmFsIHZvaWQgYWNjZXB0Q2hpbGQoQVNUVmlzaXRvciB2aXNpdG9yLCBBU1ROb2RlIGNoaWxkKSB7CisJCWlmIChjaGlsZCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJY2hpbGQuYWNjZXB0KHZpc2l0b3IpOworCX0KKworCS8qKgorCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgZ2l2ZW4gbGl2ZSBsaXN0IG9mCisJICogY2hpbGQgbm9kZXMuIAorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgdXNlZCBieSB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mCisJICogPGNvZGU+YWNjZXB0PC9jb2RlPiB0byB0cmF2ZXJzZSBsaXN0LXZhbHVlcyBwcm9wZXJ0aWVzOyBpdAorCSAqIGVuY2Fwc3VsYXRlcyB0aGUgcHJvcGVyIGhhbmRsaW5nIG9mIG9uLXRoZS1mbHkgY2hhbmdlcyB0byB0aGUgbGlzdC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0CisJICogQHBhcmFtIGNoaWxkIHRoZSBjaGlsZCBBU1Qgbm9kZSB0byBkaXNwYXRjaCB0b28sIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgaWYgbm9uZQorCSAqLworCWZpbmFsIHZvaWQgYWNjZXB0Q2hpbGRyZW4oQVNUVmlzaXRvciB2aXNpdG9yLCBBU1ROb2RlLk5vZGVMaXN0IGNoaWxkcmVuKSB7CisJCS8vIHVzZSBhIGN1cnNvciB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSB1cCB0bworCQkvLyAodGhlIGxpc3QgbWF5IGJlIGNoYW5naW5nIHVuZGVyIGZvb3QpCisJCU5vZGVMaXN0LkN1cnNvciBjdXJzb3IgPSBjaGlsZHJlbi5uZXdDdXJzb3IoKTsKKwkJdHJ5IHsKKwkJCXdoaWxlIChjdXJzb3IuaGFzTmV4dCgpKSB7CisJCQkJQVNUTm9kZSBjaGlsZCA9IChBU1ROb2RlKSBjdXJzb3IubmV4dCgpOworCQkJCWNoaWxkLmFjY2VwdCh2aXNpdG9yKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWNoaWxkcmVuLnJlbGVhc2VDdXJzb3IoY3Vyc29yKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBpbmRpY2F0aW5nCisJICogd2hlcmUgdGhlIHNvdXJjZSBmcmFnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbm9kZSBiZWdpbnMuCisJICogCisJICogQHJldHVybiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXgsIG9yIDxjb2RlPi0xPC9jb2RlPgorCSAqICAgIGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCBmb3IgdGhpcyBub2RlCisJICogQHNlZSAjZ2V0TGVuZ3RoCisJICovCisJcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkgeworCQlyZXR1cm4gc3RhcnRQb3NpdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgaW5kaWNhdGluZworCSAqIHdoZXJlIHRoZSBzb3VyY2UgZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIG5vZGUgZW5kcy4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgKHBvc3NpYmx5IDApIGxlbmd0aCwgb3IgPGNvZGU+MDwvY29kZT4KKwkgKiAgICBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMgbm9kZQorCSAqIEBzZWUgI2dldFN0YXJ0UG9zaXRpb24oKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gbGVuZ3RoOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBzb3VyY2UKKwkgKiBmcmFnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbm9kZSB3YXMgZm91bmQuCisJICogCisJICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gYSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCwgCisJICogICAgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHNvdXJjZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyAKKwkgKiAgICBhdmFpbGFibGUgZm9yIHRoaXMgbm9kZQorCSAqIEBwYXJhbSBsZW5ndGggYSAocG9zc2libHkgMCkgbGVuZ3RoLCAKKwkgKiAgICBvciA8Y29kZT4wPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgCisJICogICAgZm9yIHRoaXMgbm9kZQorCSAqIEBzZWUgI2dldFN0YXJ0UG9zaXRpb24KKwkgKiBAc2VlICNnZXRMZW5ndGgKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgeworCQlpZiAoc3RhcnRQb3NpdGlvbiA+PSAwICYmIGxlbmd0aCA8IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAoc3RhcnRQb3NpdGlvbiA8IDAgJiYgbGVuZ3RoICE9IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcKKwkgKiBwdXJwb3NlcyBvbmx5LgorCSAqIAorCSAqIEByZXR1cm4gYSBkZWJ1ZyBzdHJpbmcgCisJICovCisJcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKwkJLy8gYWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbiBhdmVyYWdlIGNvbXBpbGF0aW9uIHVuaXQKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjAwMCk7CisJCWludCBwID0gYnVmZmVyLmxlbmd0aCgpOworCQl0cnkgeworCQkJYXBwZW5kRGVidWdTdHJpbmcoYnVmZmVyKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBzaW5jZSBkZWJ1Z2dlciBzb21ldGltZXMgY2FsbCB0b1N0cmluZyBtZXRob2RzLCBwcm9ibGVtcyBjYW4gZWFzaWx5IGhhcHBlbiB3aGVuCisJCQkvLyB0b1N0cmluZyBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBiZWluZyBpbml0aWFsaXplZAorCQkJYnVmZmVyLnNldExlbmd0aChwKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiEiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChzdGFuZGFyZFRvU3RyaW5nKCkpOworCQl9CisJCS8vIGNvbnZlcnQgdG8gYSBzdHJpbmcsIGJ1dCBsb3NlIHRoZSBleHRyYSBzcGFjZSBpbiB0aGUgc3RyaW5nIGJ1ZmZlciBieSBjb3B5aW5nCisJCXJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlci50b1N0cmluZygpKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBwcm9kdWNlZCBieSB0aGUgc3RhbmRhcmQKKwkgKiA8Y29kZT5PYmplY3QudG9TdHJpbmc8L2NvZGU+IG1ldGhvZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgZGVidWcgc3RyaW5nIAorCSAqLworCWZpbmFsIFN0cmluZyBzdGFuZGFyZFRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKwl9CisJCisJLyoqCisJICogQXBwZW5kcyBhIGRlYnVnIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSB0byB0aGUgZ2l2ZW4gc3RyaW5nIGJ1ZmZlci4KKwkgKiA8cD4KKwkgKiBUaGUgPGNvZGU+QVNUTm9kZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcHJpbnRzIG91dCB0aGUgZW50aXJlIAorCSAqIHN1YnRyZWUuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYSBtb3JlIHN1Y2NpbmN0IHJlcHJlc2VudGF0aW9uLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bworCSAqLworCXZvaWQgYXBwZW5kRGVidWdTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQkvLyBwcmludCB0aGUgc3VidHJlZSBieSBkZWZhdWx0CisJCWFwcGVuZFByaW50U3RyaW5nKGJ1ZmZlcik7CisJfQorCQkKKwkvKioKKwkgKiBBcHBlbmRzIGEgc3RhbmRhcmQgSmF2YSBzb3VyY2UgY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN1YnRyZWUgdG8gdGhlIGdpdmVuCisJICogc3RyaW5nIGJ1ZmZlci4KKwkgKiAKKwkgKiBAcGFyYW0gYnVmZmVyIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGFwcGVuZCB0bworCSAqLworCWZpbmFsIHZvaWQgYXBwZW5kUHJpbnRTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlOYWl2ZUFTVEZsYXR0ZW5lciBwcmludGVyID0gbmV3IE5haXZlQVNURmxhdHRlbmVyKCk7CisJCXRoaXMuYWNjZXB0KHByaW50ZXIpOworCQlidWZmZXIuYXBwZW5kKHByaW50ZXIuZ2V0UmVzdWx0KCkpOworCX0KKwkKKwkvKioKKwkgKiBFc3RpbWF0ZSBvZiBzaXplIG9mIGFuIG9iamVjdCBoZWFkZXIgaW4gYnl0ZXMuCisJICovCisJc3RhdGljIGZpbmFsIGludCBIRUFERVJTID0gMTI7CisJCisJLyoqCisJICogQXBwcm94aW1hdGUgYmFzZSBzaXplIG9mIGFuIEFTVCBub2RlIGluc3RhbmNlIGluIGJ5dGVzLCAKKwkgKiBpbmNsdWRpbmcgb2JqZWN0IGhlYWRlciBhbmQgaW5zdGFuY2UgZmllbGRzLgorCSAqLworCXN0YXRpYyBmaW5hbCBpbnQgQkFTRV9OT0RFX1NJWkUgPSBIRUFERVJTICsgNiAqIDQ7CisJCisJLyoqCisJICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbWVtb3J5IGZvb3RwcmludCBpbiBieXRlcyBvZiB0aGUgZW50aXJlIAorCSAqIHN1YnRyZWUgcm9vdGVkIGF0IHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgc3VidHJlZSBpbiBieXRlcworCSAqLworCXB1YmxpYyBmaW5hbCBpbnQgc3VidHJlZUJ5dGVzKCkgeworCQlyZXR1cm4gdHJlZVNpemUoKTsKKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG1lbW9yeSBmb290cHJpbnQgaW4gYnl0ZXMgb2YgdGhlIGVudGlyZSAKKwkgKiBzdWJ0cmVlIHJvb3RlZCBhdCB0aGlzIG5vZGUuCisJICogPHA+CisJICogTi5CLiBUaGlzIG1ldGhvZCBpcyBwYWNrYWdlLXByaXZhdGUsIHNvIHRoYXQgdGhlIGltcGxlbWVudGF0aW9ucworCSAqIG9mIHRoaXMgbWV0aG9kIGluIGVhY2ggb2YgdGhlIGNvbmNyZXRlIEFTVCBub2RlIHR5cGVzIGRvIG5vdAorCSAqIGNsdXR0ZXIgdXAgdGhlIEFQSSBkb2MuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBzdWJ0cmVlIGluIGJ5dGVzCisJICovCisJYWJzdHJhY3QgaW50IHRyZWVTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtZW1vcnkgZm9vdHByaW50IG9mIHRoaXMgbm9kZSBpbiBieXRlcy4KKwkgKiBUaGUgZXN0aW1hdGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgc3BhY2Ugb2NjdXBpZWQgYnkgY2hpbGQgbm9kZXMuCisJICogCisJICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIG5vZGUgaW4gYnl0ZXMKKwkgKi8KKwlhYnN0cmFjdCBpbnQgbWVtU2l6ZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RTeW50YXhFcnJvclByb3BhZ2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllNjNkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKKworLyoqCisgKiBJbnRlcm5hbCBBU1QgdmlzaXRvciBmb3IgcHJvcGFnYXRpbmcgc3ludGF4IGVycm9ycy4KKyAqLworY2xhc3MgQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CisKKwlwcml2YXRlIElQcm9ibGVtW10gcHJvYmxlbXM7CisJCisJQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yKElQcm9ibGVtW10gcHJvYmxlbXMpIHsKKwkJdGhpcy5wcm9ibGVtcyA9IHByb2JsZW1zOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKEFTVE5vZGUgbm9kZSkgeworCQlib29sZWFuIHRhZ1dpdGhFcnJvcnMgPSBmYWxzZTsKKwkJc2VhcmNoOiBmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5wcm9ibGVtcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJSVByb2JsZW0gcHJvYmxlbSA9IHRoaXMucHJvYmxlbXNbaV07CisJCQlzd2l0Y2gocHJvYmxlbS5nZXRJRCgpKSB7CisJCQkJY2FzZSBJUHJvYmxlbS5QYXJzaW5nRXJyb3JPbktleXdvcmROb1N1Z2dlc3Rpb24gOgorCQkJCWNhc2UgSVByb2JsZW0uUGFyc2luZ0Vycm9yT25LZXl3b3JkIDoKKwkJCQljYXNlIElQcm9ibGVtLlBhcnNpbmdFcnJvciA6CisJCQkJY2FzZSBJUHJvYmxlbS5QYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24gOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljb250aW51ZSBzZWFyY2g7CisJCQl9CisJCQlpbnQgcG9zaXRpb24gPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7CisJCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCWludCBlbmQgPSBzdGFydCArIG5vZGUuZ2V0TGVuZ3RoKCk7CisJCQlpZiAoKHN0YXJ0IDw9IHBvc2l0aW9uKSAmJiAocG9zaXRpb24gPD0gZW5kKSkgeworCQkJCW5vZGUuc2V0RmxhZ3MoQVNUTm9kZS5NQUxGT1JNRUQpOworCQkJCS8vIGNsZWFyIHRoZSBiaXRzIG9uIHBhcmVudAorCQkJCUFTVE5vZGUgY3VycmVudE5vZGUgPSBub2RlLmdldFBhcmVudCgpOworCQkJCXdoaWxlIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7CisJCQkJCWN1cnJlbnROb2RlLnNldEZsYWdzKGN1cnJlbnROb2RlLmdldEZsYWdzKCkgJiB+QVNUTm9kZS5NQUxGT1JNRUQpOworCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCQkJCX0KKwkJCQl0YWdXaXRoRXJyb3JzID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGFnV2l0aEVycm9yczsKKwl9CisKKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1RWaXNpdG9yLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsJCQorCX0KKworCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVFZpc2l0b3IuCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gY2hlY2tBbmRUYWdBc01hbGZvcm1lZChub2RlKTsJCQorCX0KKworCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVFZpc2l0b3IuCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwl9CisKKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1RWaXNpdG9yLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKKwkJcmV0dXJuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQobm9kZSk7CQkKKwl9CisKKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1RWaXNpdG9yLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7CisJCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwkJCisJfQorCisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBub2RlKSB7CisJCXJldHVybiBjaGVja0FuZFRhZ0FzTWFsZm9ybWVkKG5vZGUpOwkJCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDAzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDQzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQSB2aXNpdG9yIGZvciBhYnN0cmFjdCBzeW50YXggdHJlZXMuCisgKiA8cD4KKyAqIEZvciBlYWNoIGRpZmZlcmVudCBjb25jcmV0ZSBBU1Qgbm9kZSB0eXBlIDxpdD5UPC9pdD4gdGhlcmUgYXJlCisgKiBhIHBhaXIgb2YgbWV0aG9kczoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5wdWJsaWMgYm9vbGVhbiB2aXNpdCg8aXQ+VDwvaXQ+IG5vZGUpPC9jb2RlPiAtIFZpc2l0cworICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIElmIDxjb2RlPnRydWU8L2NvZGU+CisgKiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIGJlIHZpc2l0ZWQgbmV4dDsgaG93ZXZlciwKKyAqIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIAorICogbm90IGJlIHZpc2l0ZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgZG9lcworICogbm90aGluZyBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQKKyAqIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgorICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIGVuZFZpc2l0KDxpdD5UPC9pdD4gbm9kZSk8L2NvZGU+IC0gVmlzaXRzCisgKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gV2hlbiB1c2VkIGluIHRoZQorICogY29udmVudGlvbmFsIHdheSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCBvZiB0aGUgZ2l2ZW4gbm9kZSdzCisgKiBjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZCAob3IgaW1tZWRpYXRlbHksIGlmIDxjb2RlPnZpc2l0PC9jb2RlPiByZXR1cm5lZAorICogPGNvZGU+ZmFsc2U8L2NvZGU+KS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyBkb2VzCisgKiBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIGEgcGFpciBvZiBtZXRob2RzIGZvciB2aXNpdGluZyBBU1Qgbm9kZXMgaW4gdGhlIAorICogYWJzdHJhY3QsIHJlZ2FyZGxlc3Mgb2Ygbm9kZSB0eXBlOgorICogPHVsPgorICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIHByZVZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCisgKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCisgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHByaW9yIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCisgKiA8Y29kZT52aXNpdDwvY29kZT4gbWV0aG9kLgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+CisgKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCisgKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCisgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCisgKiA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kLgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBGb3Igbm9kZXMgd2l0aCBsaXN0LXZhbHVlZCBwcm9wZXJ0aWVzLCB0aGUgY2hpbGQgbm9kZXMgd2l0aGluIHRoZSBsaXN0CisgKiBhcmUgdmlzaXRlZCBpbiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzCisgKiBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgdGhhdCBtb3N0IGNsb3NlbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxleGljYWwKKyAqIHJlYWRpbmcgb3JkZXIgb2YgdGhlIHNvdXJjZSBwcm9ncmFtLiBGb3IgaW5zdGFuY2UsIGZvciBhIHR5cGUgZGVjbGFyYXRpb24KKyAqIG5vZGUsIHRoZSBjaGlsZCBvcmRlcmluZyBpczogbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzLCBhbmQgCisgKiBib2R5IGRlY2xhcmF0aW9ucy4KKyAqIDwvcD4KKyAqIDxwPgorICogV2hpbGUgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSB0cmVlIGluIHRoZSB2aXNpdG9yLCBjYXJlIGlzIHJlcXVpcmVkIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBhcyBleHBlY3RlZCBhbmQgZGVzaXJhYmxlLgorICogRHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYW4gb3JkaW5hcnkgdmlzaXQgc3RhcnRpbmcgYXQgYSBnaXZlbiBub2RlLCBldmVyeSBub2RlCisgKiBpbiB0aGUgc3VidHJlZSBpcyB2aXNpdGVkIGV4YWN0bHkgdHdpY2UsIGZpcnN0IHdpdGggPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAorICogdGhlbiB3aXRoIDxjb2RlPmVuZFZpc2l0PC9jb2RlPi4gRHVyaW5nIGEgdHJhdmVyc2FsIG9mIGEgc3RhdGlvbmFyeSB0cmVlLCAKKyAqIGVhY2ggbm9kZSBpcyBlaXRoZXIgYmVoaW5kIChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLCBhaGVhZCAoYmVmb3JlIAorICogPGNvZGU+dmlzaXQ8L2NvZGU+KSwgb3IgaW4gcHJvZ3Jlc3MgKGJldHdlZW4gPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAorICogdGhlIG1hdGNoaW5nIDxjb2RlPmVuZFZpc2l0PC9jb2RlPikuIENoYW5nZXMgdG8gdGhlICJiZWhpbmQiIHJlZ2lvbiBvZiB0aGUKKyAqIHRyZWUgYXJlIG9mIG5vIGNvbnNlcXVlbmNlIHRvIHRoZSB2aXNpdCBpbiBwcm9ncmVzcy4gQ2hhbmdlcyB0byB0aGUgImFoZWFkIgorICogcmVnaW9uIHdpbGwgYmUgdGFrZW4gaW4gc3RyaWRlLiBDaGFuZ2VzIHRvIHRoZSAiaW4gcHJvZ3Jlc3MiIHBvcnRpb24gYXJlCisgKiB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gV2l0aCBhIG5vZGUsIHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgYXJlIGFycmFuZ2VkCisgKiBpbiBhIGxpbmVhciBsaXN0LCB3aXRoIGEgY3Vyc29yIHRoYXQgc2VwYXJhdGVzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZQorICogYmVlbiB2aXNpdGVkIGZyb20gdGhlIG9uZXMgdGhhdCBhcmUgc3RpbGwgdG8gYmUgdmlzaXRlZCAodGhlIGN1cnNvcgorICogaXMgYmV0d2VlbiB0aGUgZWxlbWVudHMsIHJhdGhlciB0aGFuIG9uIGFuIGVsZW1lbnQpLiBUaGUgY3Vyc29yIG1vdmVzIGZyb20KKyAqIHRoZSBoZWFkIHRvIHRoZSB0YWlsIG9mIHRoaXMgbGlzdCwgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHBvc2l0aW9uIGp1c3QKKyAqIDxpdD5iZWZvcmU8L2l0PiA8Y29kZT52aXNpdDwvY29kZT4gaWYgY2FsbGVkIGZvciB0aGF0IGNoaWxkLiBBZnRlciB0aGUgY2hpbGQKKyAqIHN1YnRyZWUgaGFzIGJlZW4gY29tcGxldGVseSB2aXNpdGVkLCB0aGUgdmlzaXQgbW92ZXMgb24gdGhlIGNoaWxkIAorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gUmVtb3ZpbmcgYSBjaGlsZCB3aGlsZSBpdCBpcyBiZWluZyB2aXNpdGVkCisgKiBkb2VzIG5vdCBhbHRlciB0aGUgY291cnNlIG9mIHRoZSB2aXNpdC4gQnV0IGFueSBjaGlsZHJlbiBhZGRlZCBhdCBwb3NpdGlvbnMKKyAqIGFmdGVyIHRoZSBjdXJzb3IgYXJlIGNvbnNpZGVyZWQgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiBhbmQgd2lsbCBiZSB2aXNpdGVkLgorICogPC9wPgorICogPHA+CisgKiBDYXNlcyB0byB3YXRjaCBvdXQgZm9yOgorICogPHVsPgorICogPGxpPk1vdmluZyBhIGNoaWxkIG5vZGUgZnVydGhlciBkb3duIHRoZSBsaXN0LiBUaGlzIGNvdWxkIHJlc3VsdCBpbiB0aGUKKyAqIGNoaWxkIHN1YnRyZWUgYmVpbmcgdmlzaXRlZCBtdWx0aXBsZSB0aW1lczsgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+CisgKiA8bGk+TW92aW5nIGEgY2hpbGQgbm9kZSB1cCBpbnRvIGFuIGFuY2VzdG9yLiBJZiB0aGUgbmV3IGhvbWUgZm9yCisgKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCisgKiBhIHNlY29uZCB0aW1lOyBhZ2FpbiwgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+CisgKiA8bGk+TW92aW5nIGEgbm9kZSBkb3duIGludG8gYSBjaGlsZC4gSWYgdGhlIG5ldyBob21lIGZvcgorICogdGhlIG5vZGUgaXMgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiwgdGhlIHN1YnRyZWUgd2lsbCBiZSB2aXNpdGVkIAorICogYSBzZWNvbmQgdGltZTsgaW4gdGhpcyBjYXNlLCB0aGUgdmlzaXRzIHdpbGwgYmUgbmVzdGVkLiBJbiBzb21lIGNhc2VzLAorICogdGhpcyBjYW4gbGVhZCB0byBhIHN0YWNrIG92ZXJmbG93IG9yIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKiBAc2VlIEFTVE5vZGUjYWNjZXB0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU1RWaXNpdG9yIHsKKwkKKwkvKioKKwkgKiBWaXNpdHMgdGhlIGdpdmVuIEFTVCBub2RlIHByaW9yIHRvIHRoZSB0eXBlLXNwZWNpZmljIHZpc2l0LgorCSAqIChiZWZvcmUgPGNvZGU+dmlzaXQ8L2NvZGU+KS4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB2aXNpdAorCSAqLworCXB1YmxpYyB2b2lkIHByZVZpc2l0KEFTVE5vZGUgbm9kZSkgeworCX0KKwkKKwkvKioKKwkgKiBWaXNpdHMgdGhlIGdpdmVuIEFTVCBub2RlIGZvbGxvd2luZyB0aGUgdHlwZS1zcGVjaWZpYyB2aXNpdAorCSAqIChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHZpc2l0CisJICovCisJcHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSkgeworCX0KKworCXB1YmxpYyBib29sZWFuIHZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXRjaENsYXVzZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb21waWxhdGlvblVuaXQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb250aW51ZVN0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChEb1N0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChKYXZhZG9jIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoQ2FzZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5VHlwZSBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9jayBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnRpbnVlU3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZEFjY2VzcyBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChGb3JTdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChJZlN0YXRlbWVudCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEphdmFkb2Mgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgeworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgeworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDNlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24gQVNUIG5vZGUgdHlwZS4gVGhpcyB0eXBlIG9mIG5vZGUgYXBwZWFycworICogb25seSBhcyBhIGNoaWxkIG9uIGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4KKyAqCisgKiA8cHJlPgorICogQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjoKKyAqICAgICAgICA8Yj57PC9iPiBDbGFzc0JvZHlEZWNsYXJhdGlvbiA8Yj59PC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzZWUgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7CisKKwkvKioKKwkgKiBUaGUgYm9keSBkZWNsYXJhdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogRGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IAorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBCb2R5RGVjbGFyYXRpb24uY2xhc3MpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIG93bmVkIAorCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zIGlzIGVtcHR5LgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbih0YXJnZXQpOworCQlyZXN1bHQuYm9keURlY2xhcmF0aW9ucygpLmFkZEFsbCgKKwkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgYm9keURlY2xhcmF0aW9ucygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGJvZHlEZWNsYXJhdGlvbnMpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zIG9mIHRoaXMKKwkgKiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGJvZHkgZGVjbGFyYXRpb25zCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgYm9keURlY2xhcmF0aW9ucygpIHsKKwkJcmV0dXJuIGJvZHlEZWNsYXJhdGlvbnM7CisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyZWQgaW4KKwkgKiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKiAgICByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSVR5cGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCkgeworCQlyZXR1cm4gZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZVR5cGUodGhpcyk7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgYm9keURlY2xhcmF0aW9ucy5saXN0U2l6ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY1ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBcnJheSBhY2Nlc3MgZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBBcnJheUFjY2VzczoKKyAqICAgIEV4cHJlc3Npb24gPGI+WzwvYj4gRXhwcmVzc2lvbiA8Yj5dPC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEFycmF5QWNjZXNzIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJLyoqCisJICogVGhlIGFycmF5IGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogYnV0IGxlZ2FsLCBleHByZXNzaW9uLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBhcnJheUV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlIGluZGV4IGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogYnV0IGxlZ2FsLCBleHByZXNzaW9uLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBpbmRleEV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGFycmF5IGFjY2VzcyBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFycmF5IGFuZCBpbmRleCBleHByZXNzc2lvbnMgYXJlIHVuc3BlY2lmaWVkLCAKKwkgKiBidXQgbGVnYWwuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUFycmF5QWNjZXNzKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gQVJSQVlfQUNDRVNTOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlBcnJheUFjY2VzcyByZXN1bHQgPSBuZXcgQXJyYXlBY2Nlc3ModGFyZ2V0KTsKKwkJcmVzdWx0LnNldEFycmF5KChFeHByZXNzaW9uKSBnZXRBcnJheSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0SW5kZXgoKEV4cHJlc3Npb24pIGdldEluZGV4KCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEFycmF5KCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0SW5kZXgoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYXJyYXkgZXhwcmVzc2lvbiBvZiB0aGlzIGFycmF5IGFjY2VzcyBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IGV4cHJlc3Npb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRBcnJheSgpIHsKKwkJaWYgKGFycmF5RXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRBcnJheShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBhcnJheUV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGFycmF5IGV4cHJlc3Npb24gb2YgdGhpcyBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgYXJyYXkgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRBcnJheShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEFycmF5QWNjZXNzIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbgorCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5hcnJheUV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLmFycmF5RXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGluZGV4IGV4cHJlc3Npb24gb2YgdGhpcyBhcnJheSBhY2Nlc3MgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0SW5kZXgoKSB7CisJCWlmIChpbmRleEV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0SW5kZXgobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gaW5kZXhFeHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBpbmRleCBleHByZXNzaW9uIG9mIHRoaXMgYXJyYXkgYWNjZXNzIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGluZGV4IGV4cHJlc3Npb24gbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0SW5kZXgoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhbiBBcnJheUFjY2VzcyBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24KKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuaW5kZXhFeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5pbmRleEV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChhcnJheUV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRBcnJheSgpLnRyZWVTaXplKCkpCisJCQkrIChpbmRleEV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRJbmRleCgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5Q3JlYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY0ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBBcnJheUNyZWF0aW9uOgorICoJCTxiPm5ldzwvYj4gUHJpbWl0aXZlVHlwZSA8Yj5bPC9iPiBFeHByZXNzaW9uIDxiPl08L2I+IHsgPGI+WzwvYj4gRXhwcmVzc2lvbiA8Yj5dPC9iPiB9IHsgPGI+WzwvYj4gPGI+XTwvYj4gfQorICoJCTxiPm5ldzwvYj4gVHlwZU5hbWUgPGI+WzwvYj4gRXhwcmVzc2lvbiBdPC9iPiB7IDxiPls8L2I+IEV4cHJlc3Npb24gPGI+XTwvYj4gfSB7IDxiPls8L2I+IDxiPl08L2I+IH0KKyAqCQk8Yj5uZXc8L2I+IFByaW1pdGl2ZVR5cGUgPGI+WzwvYj4gPGI+XTwvYj4geyA8Yj5bPC9iPiA8Yj5dPC9iPiB9IEFycmF5SW5pdGlhbGl6ZXIKKyAqIAkJPGI+bmV3PC9iPiBUeXBlTmFtZSA8Yj5bPC9iPiA8Yj5dPC9iPiB7IDxiPls8L2I+IDxiPl08L2I+IH0gQXJyYXlJbml0aWFsaXplcgorICogPC9wcmU+CisgKiA8cD4KKyAqIFRoZSBtYXBwaW5nIGZyb20gSmF2YSBsYW5ndWFnZSBzeW50YXggdG8gQVNUIG5vZGVzIGlzIGFzIGZvbGxvd3M6CisgKiA8dWw+CisgKiA8bGk+dGhlIHR5cGUgbm9kZSBpcyB0aGUgYXJyYXkgdHlwZSBvZiB0aGUgY3JlYXRpb24gZXhwcmVzc2lvbiwKKyAqICAgd2l0aCBvbmUgbGV2ZWwgb2YgYXJyYXkgcGVyIHNldCBvZiBzcXVhcmUgYnJhY2tldHMsPC9saT4KKyAqIDxsaT50aGUgZGltZW5zaW9uIGV4cHJlc3Npb25zIGFyZSBjb2xsZWN0ZWQgaW50byB0aGUgPGNvZGU+ZGltZW5zaW9uczwvY29kZT4KKyAqICAgbGlzdC48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUNyZWF0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJLyoqCisJICogVGhlIGFycmF5IHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKKwkgKiBsZWdhbCBhcnJheSB0eXBlLgorCSAqLworCXByaXZhdGUgQXJyYXlUeXBlIGFycmF5VHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiBkaW1lbnNpb24gZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGRpbWVuc2lvbnMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBFeHByZXNzaW9uLmNsYXNzKTsKKworCS8qKgorCSAqIFRoZSBvcHRpb25hbCBhcnJheSBpbml0aWFsaXplciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsKKwkgKiBkZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgQXJyYXlJbml0aWFsaXplciBvcHRpb25hbEluaXRpYWxpemVyID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFycmF5IHR5cGUgaXMgYW4gdW5zcGVjaWZpZWQgMS1kaW1lbnNpb25hbAorCSAqIGFycmF5LCB0aGUgbGlzdCBvZiBkaW1lbnNpb25zIGlzIGVtcHR5LCBhbmQgdGhlcmUgaXMgbm8gYXJyYXkKKwkgKiBpbml0aWFsaXplci4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQXJyYXlDcmVhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEFSUkFZX0NSRUFUSU9OOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlBcnJheUNyZWF0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUNyZWF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRUeXBlKChBcnJheVR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LmRpbWVuc2lvbnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBkaW1lbnNpb25zKCkpKTsKKwkJcmVzdWx0LnNldEluaXRpYWxpemVyKAorCQkJKEFycmF5SW5pdGlhbGl6ZXIpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRJbml0aWFsaXplcigpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFR5cGUoKSk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBkaW1lbnNpb25zKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEluaXRpYWxpemVyKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGFycmF5IHR5cGUgaW4gdGhpcyBhcnJheSBjcmVhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IHR5cGUKKwkgKi8gCisJcHVibGljIEFycmF5VHlwZSBnZXRUeXBlKCkgeworCQlpZiAoYXJyYXlUeXBlID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFR5cGUoZ2V0QVNUKCkubmV3QXJyYXlUeXBlKAorCQkJCWdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKSk7CisJCX0KKwkJcmV0dXJuIGFycmF5VHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBhcnJheSB0eXBlIGluIHRoaXMgYXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGFycmF5IHR5cGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFR5cGUoQXJyYXlUeXBlIHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEFycmF5Q3JlYXRpb24gY2Fubm90IG9jY3VyIGluc2lkZSBhIEFycmF5VHlwZSAtIGN5Y2xlcyBub3QgcG9zc2libGUKKwkJcmVwbGFjZUNoaWxkKHRoaXMuYXJyYXlUeXBlLCB0eXBlLCBmYWxzZSk7CisJCXRoaXMuYXJyYXlUeXBlID0gdHlwZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgZGltZW5zaW9uIGV4cHJlc3Npb25zIGluIHRoaXMgYXJyYXkKKwkgKiBpbml0aWFsaXplci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgZGltZW5zaW9uIGV4cHJlc3Npb25zCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IGRpbWVuc2lvbnMoKSB7CisJCXJldHVybiBkaW1lbnNpb25zOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhcnJheSBpbml0aWFsaXplciBvZiB0aGlzIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24sIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBnZXRJbml0aWFsaXplcigpIHsKKwkJcmV0dXJuIG9wdGlvbmFsSW5pdGlhbGl6ZXI7CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBhcnJheSBpbml0aWFsaXplciBvZiB0aGlzIGFycmF5IGNyZWF0aW9uIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBhcnJheSBpbml0aWFsaXplciBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgIGlmIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwkJLy8gYW4gQXJyYXlDcmVhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEFycmF5SW5pdGlhbGl6ZXIKKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxJbml0aWFsaXplciwgaW5pdGlhbGl6ZXIsIHRydWUpOworCQl0aGlzLm9wdGlvbmFsSW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJaW50IHNpemUgPSBtZW1TaXplKCkKKwkJCSsgKGFycmF5VHlwZSA9PSBudWxsID8gMCA6IGdldFR5cGUoKS50cmVlU2l6ZSgpKQorCQkJKyAob3B0aW9uYWxJbml0aWFsaXplciA9PSBudWxsID8gMCA6IGdldEluaXRpYWxpemVyKCkudHJlZVNpemUoKSkKKwkJCSsgZGltZW5zaW9ucy5saXN0U2l6ZSgpOworCQlyZXR1cm4gc2l6ZTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNDk2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFycmF5IGluaXRpYWxpemVyIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIEFycmF5SW5pdGlhbGl6ZXI6CisgKiAJCTxiPns8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb259IFsgPGI+LDwvYj4gXV0gPGI+fTwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUluaXRpYWxpemVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJLyoqCisJICogVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZToKKwkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGV4cHJlc3Npb25zID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QodHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcyk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBhcnJheSBpbml0aWFsaXplciBvd25lZCBieSB0aGUgCisJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBlbXB0eS4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQXJyYXlJbml0aWFsaXplcihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CQorCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBBUlJBWV9JTklUSUFMSVpFUjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQXJyYXlJbml0aWFsaXplciByZXN1bHQgPSBuZXcgQXJyYXlJbml0aWFsaXplcih0YXJnZXQpOworCQlyZXN1bHQuZXhwcmVzc2lvbnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBleHByZXNzaW9ucygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGV4cHJlc3Npb25zKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpbiB0aGlzIGFycmF5IGluaXRpYWxpemVyLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBleHByZXNzaW9ucyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgZXhwcmVzc2lvbnMoKSB7CisJCXJldHVybiBleHByZXNzaW9uczsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiBtZW1TaXplKCkgKyBleHByZXNzaW9ucy5saXN0U2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhYTlhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlUeXBlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFR5cGUgbm9kZSBmb3IgYW4gYXJyYXkgdHlwZS4KKyAqIDxwPgorICogQXJyYXkgdHlwZXMgYXJlIGV4cHJlc3NlZCBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIsIG9uZSBkaW1lbnNpb24gYXQgYSB0aW1lLgorICogPC9wPgorICogPHByZT4KKyAqIEFycmF5VHlwZToKKyAqICAgIFR5cGUgPGI+WzwvYj4gPGI+XTwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKwkvKiogCisJICogVGhlIGNvbXBvbmVudCB0eXBlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgc2ltcGxlIHR5cGUgd2l0aAorCSAqIGFuIHVuc3BlY2ZpZWQsIGJ1dCBsZWdhbCwgbmFtZS4KKwkgKi8KKwlwcml2YXRlIFR5cGUgY29tcG9uZW50VHlwZSA9IG51bGw7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG5vZGUgZm9yIGFuIGFycmF5IHR5cGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCBhIDEtZGltZW5zaW9uYWwgYXJyYXkgb2YgYW4gdW5zcGVjaWZpZWQgc2ltcGxlIHR5cGUuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUFycmF5VHlwZShBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEFSUkFZX1RZUEU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUFycmF5VHlwZSByZXN1bHQgPSBuZXcgQXJyYXlUeXBlKHRhcmdldCk7CisJCXJlc3VsdC5zZXRDb21wb25lbnRUeXBlKChUeXBlKSBnZXRDb21wb25lbnRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldENvbXBvbmVudFR5cGUoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheSB0eXBlLiBUaGUgY29tcG9uZW50IHR5cGUKKwkgKiBtYXkgYmUgYW5vdGhlciBhcnJheSB0eXBlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlIG5vZGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0Q29tcG9uZW50VHlwZShuZXcgU2ltcGxlVHlwZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBjb21wb25lbnRUeXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZS4gVGhlIGNvbXBvbmVudCB0eXBlCisJICogbWF5IGJlIGFub3RoZXIgYXJyYXkgdHlwZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZSB0aGUgY29tcG9uZW50IHR5cGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoVHlwZSBjb21wb25lbnRUeXBlKSB7CisJCWlmIChjb21wb25lbnRUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhbiBBcnJheVR5cGUgbWF5IG9jY3VyIGluc2lkZSBhbiBBcnJheVR5cGUgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQoCisJCQkoQVNUTm9kZSkgdGhpcy5jb21wb25lbnRUeXBlLAorCQkJKEFTVE5vZGUpIGNvbXBvbmVudFR5cGUsIHRydWUpOworCQl0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGlzIGFycmF5IHR5cGUuIFRoZSBlbGVtZW50IHR5cGUgaXMKKwkgKiBuZXZlciBhbiBhcnJheSB0eXBlLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBkZXNjZW5kcyBhIGNoYWluIG9mIG5lc3RlZCBhcnJheSB0eXBlcworCSAqIHVudGlsIGl0IHJlYWNoZXMgYSBub24tYXJyYXkgdHlwZS4gCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCB0eXBlIG5vZGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7CisJCVR5cGUgdCA9IGdldENvbXBvbmVudFR5cGUoKTsKKwkJd2hpbGUgKHQuaXNBcnJheVR5cGUoKSkgeworCQkJdCA9ICgoQXJyYXlUeXBlKSB0KS5nZXRDb21wb25lbnRUeXBlKCk7CisJCX0KKwkJcmV0dXJuIHQ7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIHRoaXMgYXJyYXkgdHlwZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgZGVzY2VuZHMgYSBjaGFpbiBvZiBuZXN0ZWQgYXJyYXkgdHlwZXMKKwkgKiB1bnRpbCBpdCByZWFjaGVzIGEgbm9uLWFycmF5IHR5cGUuIAorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyAoYWx3YXlzIHBvc2l0aXZlKQorCSAqLyAKKwlwdWJsaWMgaW50IGdldERpbWVuc2lvbnMoKSB7CisJCVR5cGUgdCA9IGdldENvbXBvbmVudFR5cGUoKTsKKwkJaW50IGRpbWVuc2lvbnMgPSAxOyAvLyBhbHdheXMgaW5jbHVkZSB0aGlzIGFycmF5IHR5cGUKKwkJd2hpbGUgKHQuaXNBcnJheVR5cGUoKSkgeworCQkJZGltZW5zaW9ucysrOworCQkJdCA9ICgoQXJyYXlUeXBlKSB0KS5nZXRDb21wb25lbnRUeXBlKCk7CisJCX0KKwkJcmV0dXJuIGRpbWVuc2lvbnM7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKSAKKwkJCSsgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCA/IDAgOiBnZXRDb21wb25lbnRUeXBlKCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2VydFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NlcnRTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhhNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NlcnRTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQXNzZXJ0IHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBBc3NlcnRTdGF0ZW1lbnQ6CisgKiAgICA8Yj5hc3NlcnQ8L2I+IEV4cHJlc3Npb24gWyA8Yj46PC9iPiBFeHByZXNzaW9uIF0gPGI+OzwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQkJCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIGV4cHJlc3Npb24uCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlIG1lc3NhZ2UgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsTWVzc2FnZUV4cHJlc3Npb24gPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBhc3NlcnQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGFzc2VydCBzdGF0ZW1lbnQgaGFzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhwcmVzc2lvbiwgYW5kIG5vdCBtZXNzYWdlIGV4cHJlc3Npb24uCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUFzc2VydFN0YXRlbWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEFTU0VSVF9TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUFzc2VydFN0YXRlbWVudCByZXN1bHQgPSBuZXcgQXNzZXJ0U3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oCisJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4cHJlc3Npb24oKSkpOworCQlyZXN1bHQuc2V0TWVzc2FnZSgKKwkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0TWVzc2FnZSgpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRNZXNzYWdlKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IGV4cHJlc3Npb24gb2YgdGhpcyBhc3NlcnQgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGV4cHJlc3Npb247CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBmaXJzdCBleHByZXNzaW9uIG9mIHRoaXMgYXNzZXJ0IHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbmV3IGV4cHJlc3Npb24gbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEFzc2VydFN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24gb2YgdGhpcyBhc3NlcnQgc3RhdGVtZW50LCBvciAKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSAKKwkgKiAgICBpcyBub25lCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldE1lc3NhZ2UoKSB7CisJCXJldHVybiBvcHRpb25hbE1lc3NhZ2VFeHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWVzc2FnZSBleHByZXNzaW9uIG9mIHRoaXMgYXNzZXJ0IHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbWVzc2FnZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCS8vIGFuIEFzZXJ0U3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wdGlvbmFsTWVzc2FnZUV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLm9wdGlvbmFsTWVzc2FnZUV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCisJCQkrIChvcHRpb25hbE1lc3NhZ2VFeHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0TWVzc2FnZSgpLnRyZWVTaXplKCkpOworCQkJCisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2lnbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzaWdubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmYyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2lnbm1lbnQuamF2YQpAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFzc2lnbm1lbnQgZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBBc3NpZ25tZW50OgorICogICAgRXhwcmVzc2lvbiBBc3NpZ25tZW50T3BlcmF0b3IgRXhwcmVzc2lvbgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkJCisJLyoqCisgCSAqIEFzc2lnbm1lbnQgb3BlcmF0b3JzICh0eXBlc2FmZSBlbnVtZXJhdGlvbikuCisJICogPHByZT4KKwkgKiBBc3NpZ25tZW50T3BlcmF0b3I6PGNvZGU+CisJICogICAgPGI+PTwvYj4gQVNTSUdOCisJICogICAgPGI+Kz08L2I+IFBMVVNfQVNTSUdOCisJICogICAgPGI+LT08L2I+IE1JTlVTX0FTU0lHTgorCSAqICAgIDxiPio9PC9iPiBUSU1FU19BU1NJR04KKwkgKiAgICA8Yj4vPTwvYj4gRElWSURFX0FTU0lHTgorCSAqICAgIDxiPiZhbXA7PTwvYj4gQklUX0FORF9BU1NJR04KKwkgKiAgICA8Yj58PTwvYj4gQklUX09SX0FTU0lHTgorCSAqICAgIDxiPl49PC9iPiBCSVRfWE9SX0FTU0lHTgorCSAqICAgIDxiPiU9PC9iPiBSRU1BSU5ERVJfQVNTSUdOCisJICogICAgPGI+Jmx0OyZsdDs9PC9iPiBMRUZUX1NISUZUX0FTU0lHTgorCSAqICAgIDxiPiZndDsmZ3Q7PTwvYj4gUklHSFRfU0hJRlRfU0lHTkVEX0FTU0lHTgorCSAqICAgIDxiPiZndDsmZ3Q7Jmd0Oz08L2I+IFJJR0hUX1NISUZUX1VOU0lHTkVEX0FTU0lHTjwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdG9yIHsKKwkKKwkJLyoqCisJCSAqIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRvcgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgb3A7CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBhc3NpZ25tZW50IG9wZXJhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJCSAqIDxwPgorCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcworCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgorCQkgKiA8L3A+CisJCSAqIAorCQkgKiBAcGFyYW0gb3AgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCisJCSAqLworCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyBvcCkgeworCQkJdGhpcy5vcCA9IG9wOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IuCisJCSAqIAorCQkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBvcDsKKwkJfQorCQkKKwkJLyoqID0gb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgQVNTSUdOID0gbmV3IE9wZXJhdG9yKCI9Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogKz0gb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgUExVU19BU1NJR04gPSBuZXcgT3BlcmF0b3IoIis9Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogLT0gb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgTUlOVVNfQVNTSUdOID0gbmV3IE9wZXJhdG9yKCItPSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqICo9IG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFRJTUVTX0FTU0lHTiA9IG5ldyBPcGVyYXRvcigiKj0iKTsvLyROT04tTkxTLTEkCisJCS8qKiAvPSBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBESVZJREVfQVNTSUdOID0gbmV3IE9wZXJhdG9yKCIvPSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqICZhbXA7PSBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBCSVRfQU5EX0FTU0lHTiA9IG5ldyBPcGVyYXRvcigiJj0iKTsvLyROT04tTkxTLTEkCisJCS8qKiB8PSBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBCSVRfT1JfQVNTSUdOID0gbmV3IE9wZXJhdG9yKCJ8PSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqIF49IG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIEJJVF9YT1JfQVNTSUdOID0gbmV3IE9wZXJhdG9yKCJePSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqICU9IG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFJFTUFJTkRFUl9BU1NJR04gPSBuZXcgT3BlcmF0b3IoIiU9Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogJmx0OyZsdDs9PSBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBMRUZUX1NISUZUX0FTU0lHTiA9CisJCQluZXcgT3BlcmF0b3IoIjw8PSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqICZndDsmZ3Q7PT0gb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgUklHSFRfU0hJRlRfU0lHTkVEX0FTU0lHTiA9CisJCQluZXcgT3BlcmF0b3IoIj4+PSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqICZndDsmZ3Q7Jmd0Oz09IG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFJJR0hUX1NISUZUX1VOU0lHTkVEX0FTU0lHTiA9CisJCQluZXcgT3BlcmF0b3IoIj4+Pj0iKTsvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgYXNzaWdubWVudCBvcGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzdHJpbmcsCisJCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJCSAqIDxwPgorCQkgKiA8Y29kZT50b09wZXJhdG9yPC9jb2RlPiBpcyB0aGUgY29udmVyc2Ugb2YgPGNvZGU+dG9TdHJpbmc8L2NvZGU+OgorCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IgYWxsIAorCQkgKiBvcGVyYXRvcnMgPGNvZGU+b3A8L2NvZGU+LgorCQkgKiA8L3A+CisJCSAqIAorCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCisJCSAqIEByZXR1cm4gdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgT3BlcmF0b3IgdG9PcGVyYXRvcihTdHJpbmcgdG9rZW4pIHsKKwkJCXJldHVybiAoT3BlcmF0b3IpIENPREVTLmdldCh0b2tlbik7CisJCX0KKwkJCisJCS8qKgorCQkgKiBNYXAgZnJvbSB0b2tlbiB0byBvcGVyYXRvciAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47CisJCSAqIHZhbHVlIHR5cGU6IDxjb2RlPk9wZXJhdG9yPC9jb2RlPikuCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgQ09ERVM7CisJCXN0YXRpYyB7CisJCQlDT0RFUyA9IG5ldyBIYXNoTWFwKDIwKTsKKwkJCU9wZXJhdG9yW10gb3BzID0geworCQkJCQlBU1NJR04sCisJCQkJCVBMVVNfQVNTSUdOLAorCQkJCQlNSU5VU19BU1NJR04sCisJCQkJCVRJTUVTX0FTU0lHTiwKKwkJCQkJRElWSURFX0FTU0lHTiwKKwkJCQkJQklUX0FORF9BU1NJR04sCisJCQkJCUJJVF9PUl9BU1NJR04sCisJCQkJCUJJVF9YT1JfQVNTSUdOLAorCQkJCQlSRU1BSU5ERVJfQVNTSUdOLAorCQkJCQlMRUZUX1NISUZUX0FTU0lHTiwKKwkJCQkJUklHSFRfU0hJRlRfU0lHTkVEX0FTU0lHTiwKKwkJCQkJUklHSFRfU0hJRlRfVU5TSUdORURfQVNTSUdOCisJCQkJfTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7CisJCQkJQ09ERVMucHV0KG9wc1tpXS50b1N0cmluZygpLCBvcHNbaV0pOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIFRoZSBhc3NpZ25tZW50IG9wZXJhdG9yOyBkZWZhdWx0cyB0byBBc3NpZ25tZW50Lk9wZXJhdG9yLkFTU0lHTgorCSAqLworCXByaXZhdGUgQXNzaWdubWVudC5PcGVyYXRvciBhc3NpZ25tZW50T3BlcmF0b3IgPSBBc3NpZ25tZW50Lk9wZXJhdG9yLkFTU0lHTjsKKworCS8qKgorCSAqIFRoZSBsZWZ0IGhhbmQgc2lkZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBsZWZ0SGFuZFNpZGUgPSBudWxsOworCisJLyoqCisJICogVGhlIHJpZ2h0IGhhbmQgc2lkZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiByaWdodEhhbmRTaWRlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbm9kZSBoYXMgYW4gYXNzaWdubWVudCBvcGVyYXRvciwgYW5kIHVuc3BlY2lmaWVkCisJICogbGVmdCBhbmQgcmlnaHQgaGFuZCBzaWRlcy4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQXNzaWdubWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEFTU0lHTk1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUFzc2lnbm1lbnQgcmVzdWx0ID0gbmV3IEFzc2lnbm1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldE9wZXJhdG9yKGdldE9wZXJhdG9yKCkpOworCQlyZXN1bHQuc2V0TGVmdEhhbmRTaWRlKChFeHByZXNzaW9uKSBnZXRMZWZ0SGFuZFNpZGUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldFJpZ2h0SGFuZFNpZGUoKEV4cHJlc3Npb24pIGdldFJpZ2h0SGFuZFNpZGUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TGVmdEhhbmRTaWRlKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmlnaHRIYW5kU2lkZSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcGVyYXRvciBvZiB0aGlzIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yCisJICovIAorCXB1YmxpYyBBc3NpZ25tZW50Lk9wZXJhdG9yIGdldE9wZXJhdG9yKCkgeworCQlyZXR1cm4gYXNzaWdubWVudE9wZXJhdG9yOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG9wZXJhdG9yIG9mIHRoaXMgYXNzaWdubWVudCBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBhc3NpZ25tZW50T3BlcmF0b3IgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0CisJICovIAorCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IgYXNzaWdubWVudE9wZXJhdG9yKSB7CisJCWlmIChhc3NpZ25tZW50T3BlcmF0b3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmFzc2lnbm1lbnRPcGVyYXRvciA9IGFzc2lnbm1lbnRPcGVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGlzIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsZWZ0IGhhbmQgc2lkZSBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldExlZnRIYW5kU2lkZSgpIHsKKwkJaWYgKGxlZnRIYW5kU2lkZSAgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TGVmdEhhbmRTaWRlKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGxlZnRIYW5kU2lkZTsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoaXMgYXNzaWdubWVudCBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRMZWZ0SGFuZFNpZGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhbiBBc3NpZ25tZW50IG1heSBvY2N1ciBpbnNpZGUgYSBFeHByZXNzaW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKChBU1ROb2RlKSB0aGlzLmxlZnRIYW5kU2lkZSwgKEFTVE5vZGUpIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLmxlZnRIYW5kU2lkZSA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoaXMgYXNzaWdubWVudCBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldFJpZ2h0SGFuZFNpZGUoKSB7CisJCWlmIChyaWdodEhhbmRTaWRlICA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRSaWdodEhhbmRTaWRlKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIHJpZ2h0SGFuZFNpZGU7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhpcyBhc3NpZ25tZW50IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRSaWdodEhhbmRTaWRlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYW4gQXNzaWdubWVudCBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCgoQVNUTm9kZSkgdGhpcy5yaWdodEhhbmRTaWRlLCAoQVNUTm9kZSkgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMucmlnaHRIYW5kU2lkZSA9IGV4cHJlc3Npb247CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQorCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgKGxlZnRIYW5kU2lkZSA9PSBudWxsID8gMCA6IGdldExlZnRIYW5kU2lkZSgpLnRyZWVTaXplKCkpCisJCQkrIChyaWdodEhhbmRTaWRlID09IG51bGwgPyAwIDogZ2V0UmlnaHRIYW5kU2lkZSgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CaW5kaW5nUmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ1Jlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlN2M1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ1Jlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0NjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIEEgYmluZGluZyByZXNvbHZlciBpcyBhbiBpbnRlcm5hbCBtZWNoYW5pc20gZm9yIGZpZ3VyaW5nIG91dCB0aGUgYmluZGluZworICogZm9yIGEgbWFqb3IgZGVjbGFyYXRpb24sIHR5cGUsIG9yIG5hbWUgcmVmZXJlbmNlLgorICogPHA+CisgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXJ2ZXMgYXMgdGhlIGRlZmF1bHQgYmluZGluZyByZXNvbHZlcgorICogdGhhdCBkb2VzIG5vIHJlc29sdmluZyB3aGF0c29ldmVyLiBJbnRlcm5hbCBzdWJjbGFzc2VzIGRvIGFsbCB0aGUgcmVhbCB3b3JrLgorICogPC9wPgorICogCisgKiBAc2VlIEFTVCNnZXRCaW5kaW5nUmVzb2x2ZXIKKyAqLworY2xhc3MgQmluZGluZ1Jlc29sdmVyIHsKKwkKKwlwcm90ZWN0ZWQgbG9uZyBtb2RpZmljYXRpb25Db3VudDsKKwkvKioKKwkgKiBDcmVhdGVzIGEgYmluZGluZyByZXNvbHZlci4KKwkgKi8KKwlCaW5kaW5nUmVzb2x2ZXIoKSB7CisJfQorCisJLyoqCisJICogU3RvcmUgdGhlIG51bWJlciBvZiBtb2RpZmljYXRpb25zIGRvbmUgdXNpbmcgdGhlIGFzdC4gVGhpcyBpcyB1c2VkIHRvIHZhbGlkYXRlCisJICogcmVzb2x2ZUJpbmRpbmcgbWV0aG9kcy4gSWYgdGhlIG51bWJlciBjaGFuZ2VkLCBhbGwgcmVzb2x2ZSBiaW5kaW5ncyBtZXRob2RzCisJICogc2ltcGx5IHJldHVybiBudWxsLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHN0b3JlTW9kaWZpY2F0aW9uQ291bnQobG9uZyBtb2RpZmljYXRpb25Db3VudCkgeworCQl0aGlzLm1vZGlmaWNhdGlvbkNvdW50ID0gbW9kaWZpY2F0aW9uQ291bnQ7CisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gb2xkL25ldyBwYWlyIG9mCisJICogQVNUIG5vZGVzLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5ld05vZGUgdGhlIG5ldyBBU1Qgbm9kZQorCSAqIEBwYXJhbSBvbGROb2RlIHRoZSBvbGQgQVNUIG5vZGUKKwkgKi8KKwl2b2lkIHN0b3JlKEFTVE5vZGUgbmV3Tm9kZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlIG9sZEFTVE5vZGUpIHsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gbmFtZSBhbmQgcmV0dXJucyB0aGUgdHlwZSBiaW5kaW5nIGZvciBpdC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TmFtZS5yZXNvbHZlQmluZGluZzwvY29kZT4gZm9yd2FyZHMgdG8KKwkgKiB0aGlzIG1ldGhvZC4gSG93IHRoZSBuYW1lIHJlc29sdmVzIGlzIG9mdGVuIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRleHQKKwkgKiBpbiB3aGljaCB0aGUgbmFtZSBub2RlIGlzIGVtYmVkZGVkIGFzIHdlbGwgYXMgdGhlIG5hbWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBiaW5kaW5nIGlzCisJICogICAgYXZhaWxhYmxlCisJICovCisJSUJpbmRpbmcgcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJlc29sdmVzIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm5zIHRoZSB0eXBlIGJpbmRpbmcgZm9yIGl0LgorCSAqIDxwPgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5UeXBlLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBIb3cgdGhlIHR5cGUgcmVzb2x2ZXMgaXMgb2Z0ZW4gYSBmdW5jdGlvbgorCSAqIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0eXBlIG5vZGUgaXMgZW1iZWRkZWQgYXMgd2VsbCBhcyB0aGUgdHlwZQorCSAqIHN1YnRyZWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgIGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlIAorCSAqLworCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIHdlbGwga25vd24gdHlwZSBieSBuYW1lIGFuZCByZXR1cm5zIHRoZSB0eXBlIGJpbmRpbmcKKwkgKiBmb3IgaXQuCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFTVE5vZGUucmVzb2x2ZVdlbGxLbm93blR5cGU8L2NvZGU+CisJICogZm9yd2FyZHMgdG8gdGhpcyBtZXRob2QuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgd2VsbCBrbm93biB0eXBlCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8Y29kZT4gaWYgdGhlIAorCSAqICAgbmFtZWQgdHlwZSBpcyBub3QgY29uc2lkZXJlZCB3ZWxsIGtub3duIG9yIGlmIG5vIGJpbmRpbmcgY2FuIGJlIGZvdW5kCisJICogICBmb3IgaXQKKwkgKi8KKwlJVHlwZUJpbmRpbmcgcmVzb2x2ZVdlbGxLbm93blR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgYmluZGluZworCSAqIGZvciBpdC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+VHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPiAKKwkgKiAoYW5kIDxjb2RlPlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5yZXNvbHZlQmluZGluZzwvY29kZT4pIGZvcndhcmRzCisJICogdG8gdGhpcyBtZXRob2QuIEhvdyB0aGUgdHlwZSBkZWNsYXJhdGlvbiByZXNvbHZlcyBpcyBvZnRlbiBhIGZ1bmN0aW9uIG9mCisJICogdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHR5cGUgZGVjbGFyYXRpb24gbm9kZSBpcyBlbWJlZGRlZCBhcyB3ZWxsIGFzIHRoZQorCSAqIHR5cGUgZGVjbGFyYXRpb24gc3VidHJlZSBpdHNlbGYuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyYXRpb24gb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgICBpZiBubyBiaW5kaW5nIGlzIGF2YWlsYWJsZQorCSAqLworCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgYmluZGluZworCSAqIGZvciBpdC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZzwvY29kZT4gCisJICogZm9yd2FyZHMgdG8gdGhpcyBtZXRob2QuIEhvdyB0aGUgZGVjbGFyYXRpb24gcmVzb2x2ZXMgaXMgb2Z0ZW4gYSAKKwkgKiBmdW5jdGlvbiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgZGVjbGFyYXRpb24gbm9kZSBpcyBlbWJlZGRlZCBhcyB3ZWxsCisJICogYXMgdGhlIGRlY2xhcmF0aW9uIHN1YnRyZWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIG9mIGludGVyZXN0CisJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNsYXNzIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgIGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlCisJICovCisJSVR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gdHlwZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgaXQuCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBIb3cgdGhlIG1ldGhvZCByZXNvbHZlcyBpcyBvZnRlbiBhIGZ1bmN0aW9uIG9mCisJICogdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBub2RlIGlzIGVtYmVkZGVkIGFzIHdlbGwgYXMKKwkgKiB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHN1YnRyZWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uLCBvciAKKwkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBiaW5kaW5nIGlzIGF2YWlsYWJsZQorCSAqLworCUlNZXRob2RCaW5kaW5nIHJlc29sdmVNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIGl0LgorCSAqIDxwPgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBIb3cgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHJlc29sdmVzIGlzIG9mdGVuCisJICogYSBmdW5jdGlvbiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gbm9kZSBpcyAKKwkgKiBlbWJlZGRlZCBhcyB3ZWxsIGFzIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdWJ0cmVlIGl0c2VsZi4gVmFyaWFibGVEZWNsYXJhdGlvbiAKKwkgKiBkZWNsYXJhdGlvbnMgdXNlZCBhcyBsb2NhbCB2YXJpYWJsZSwgZm9ybWFsIHBhcmFtZXRlciBhbmQgZXhjZXB0aW9uIAorCSAqIHZhcmlhYmxlcyByZXNvbHZlIHRvIGxvY2FsIHZhcmlhYmxlIGJpbmRpbmdzOyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKwkgKiB1c2VkIHRvIGRlY2xhcmUgZmllbGRzIHJlc29sdmUgdG8gZmllbGQgYmluZGluZ3MuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUgZGVjbGFyYXRpb24sIG9yIAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlCisJICovCisJSVZhcmlhYmxlQmluZGluZyByZXNvbHZlVmFyaWFibGUoVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIGl0LgorCSAqIDxwPgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5GaWVsZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBIb3cgdGhlIGZpZWxkIGRlY2xhcmF0aW9uIHJlc29sdmVzIGlzIG9mdGVuCisJICogYSBmdW5jdGlvbiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gbm9kZSBpcyAKKwkgKiBlbWJlZGRlZCBhcyB3ZWxsIGFzIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdWJ0cmVlIGl0c2VsZi4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHZhcmlhYmxlIHRoZSBmaWVsZCBkZWNsYXJhdGlvbiBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiwgb3IgCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYmluZGluZyBpcyBhdmFpbGFibGUKKwkgKi8KKwlJVmFyaWFibGVCaW5kaW5nIHJlc29sdmVWYXJpYWJsZShGaWVsZERlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CisJCXJldHVybiBudWxsOworCX0KKwkJCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIHR5cGUgYmluZGluZworCSAqIGZvciBpdC4gCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBUaGUgcmVzdWx0IGlzIG9mdGVuIGEgZnVuY3Rpb24gb2YgdGhlIGNvbnRleHQKKwkgKiBpbiB3aGljaCB0aGUgZXhwcmVzc2lvbiBub2RlIGlzIGVtYmVkZGVkIGFzIHdlbGwgYXMgdGhlIGV4cHJlc3Npb24gCisJICogc3VidHJlZSBpdHNlbGYuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiwgb3IgCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYmluZGluZyBpcyBhdmFpbGFibGUKKwkgKi8KKwlJVHlwZUJpbmRpbmcgcmVzb2x2ZUV4cHJlc3Npb25UeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIGltcG9ydCBkZWNsYXJhdGlvbiBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgaXQuCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkltcG9ydERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gaW1wb3J0RGVjbGFyYXRpb24gdGhlIGltcG9ydCBkZWNsYXJhdGlvbiBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBwYWNrYWdlIGRlY2xhcmF0aW9uLCBvciAKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGJpbmRpbmcgKGZvciBvbi1kZW1hbmQgaW1wb3J0cykgb3IgdHlwZSBiaW5kaW5nCisJICogICAgKGZvciBzaW5nbGUtdHlwZSBpbXBvcnRzKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYmluZGluZyBpcworCSAqICAgIGF2YWlsYWJsZQorCSAqLworCUlCaW5kaW5nIHJlc29sdmVJbXBvcnQoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24pIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBwYWNrYWdlIGRlY2xhcmF0aW9uIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciBpdC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+UGFja2FnZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIGludGVyZXN0CisJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgZGVjbGFyYXRpb24sIG9yIAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlCisJICovCisJSVBhY2thZ2VCaW5kaW5nIHJlc29sdmVQYWNrYWdlKFBhY2thZ2VEZWNsYXJhdGlvbiBwa2cpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgY29uc3RydWN0b3IgYmVpbmcgaW52b2tlZC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YKKwkgKiA8Y29kZT5Db25zdHJ1Y3Rvckludm9jYXRpb24ucmVzb2x2ZUNvbnN0cnVjdG9yPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBXaGljaCBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGlzIG9mdGVuIGEgZnVuY3Rpb24KKwkgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgZXhwcmVzc2lvbiBub2RlIGlzIGVtYmVkZGVkIGFzIHdlbGwgYXMKKwkgKiB0aGUgZXhwcmVzc2lvbiBzdWJ0cmVlIGl0c2VsZi4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgY29uc3RydWN0b3IgYmVpbmcgaW52b2tlZCwgb3IgCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYmluZGluZyBpcyBhdmFpbGFibGUKKwkgKi8KKwlJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3IoQ29uc3RydWN0b3JJbnZvY2F0aW9uIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgY29uc3RydWN0b3IgYmVpbmcgaW52b2tlZC4KKwkgKiA8cD4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YKKwkgKiA8Y29kZT5TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5yZXNvbHZlQ29uc3RydWN0b3I8L2NvZGU+CisJICogZm9yd2FyZHMgdG8gdGhpcyBtZXRob2QuIFdoaWNoIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgaXMgb2Z0ZW4gYSBmdW5jdGlvbgorCSAqIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBleHByZXNzaW9uIG5vZGUgaXMgZW1iZWRkZWQgYXMgd2VsbCBhcworCSAqIHRoZSBleHByZXNzaW9uIHN1YnRyZWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBjb25zdHJ1Y3RvciBiZWluZyBpbnZva2VkLCBvciAKKwkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBiaW5kaW5nIGlzIGF2YWlsYWJsZQorCSAqLworCUlNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvcihTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBleHByZXNzaW9uKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGludm9rZWQuCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mCisJICogPGNvZGU+Q2xhc3NJbnN0YW5jZUNyZWF0aW9uLnJlc29sdmVDb25zdHJ1Y3RvcjwvY29kZT4KKwkgKiBmb3J3YXJkcyB0byB0aGlzIG1ldGhvZC4gV2hpY2ggY29uc3RydWN0b3IgaXMgaW52b2tlZCBpcyBvZnRlbiBhIGZ1bmN0aW9uCisJICogb2YgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGV4cHJlc3Npb24gbm9kZSBpcyBlbWJlZGRlZCBhcyB3ZWxsIGFzCisJICogdGhlIGV4cHJlc3Npb24gc3VidHJlZSBpdHNlbGYuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG9mIGludGVyZXN0CisJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGludm9rZWQsIG9yIAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlCisJICovCisJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUNvbnN0cnVjdG9yKENsYXNzSW5zdGFuY2VDcmVhdGlvbiBleHByZXNzaW9uKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBGaW5kcyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBmcm9tIHdoaWNoIHRoZSBnaXZlbiBiaW5kaW5nIG9yaWdpbmF0ZWQuCisJICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBub2RlCisJICogaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisJICogPHA+CisJICogVGhlIGZvbGxvd2luZyB0YWJsZSBpbmRpY2F0ZXMgdGhlIGV4cGVjdGVkIG5vZGUgdHlwZSBmb3IgdGhlIHZhcmlvdXMKKwkgKiBkaWZmZXJlbnQga2luZHMgb2YgYmluZGluZ3M6CisJICogPHVsPgorCSAqIDxsaT48L2xpPgorCSAqIDxsaT5wYWNrYWdlIC0gYSA8Y29kZT5QYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+PC9saT4KKwkgKiA8bGk+Y2xhc3Mgb3IgaW50ZXJmYWNlIC0gYSA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+IG9yIGEKKwkgKiAgICA8Y29kZT5DbGFzc0luc3RhbmNlQ3JlYXRpb248L2NvZGU+IChmb3IgYW5vbnltb3VzIGNsYXNzZXMpIDwvbGk+CisJICogPGxpPnByaW1pdGl2ZSB0eXBlIC0gbm9uZTwvbGk+CisJICogPGxpPmFycmF5IHR5cGUgLSBub25lPC9saT4KKwkgKiA8bGk+ZmllbGQgLSBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYSAKKwkgKiAgICA8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgorCSAqIDxsaT5sb2NhbCB2YXJpYWJsZSAtIGEgPGNvZGU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvY29kZT4sIG9yCisJICogICAgYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEgCisJICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4gb3IgCisJICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb248L2NvZGU+PC9saT4KKwkgKiA8bGk+bWV0aG9kIC0gYSA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4gPC9saT4KKwkgKiA8bGk+Y29uc3RydWN0b3IgLSBhIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Db21waWxhdGlvblVuaXQuZmluZERlY2xhcmluZ05vZGU8L2NvZGU+CisJICogZm9yd2FyZHMgdG8gdGhpcyBtZXRob2QuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBiaW5kaW5nIHRoZSBiaW5kaW5nCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIHdoZXJlIHRoZSBiaW5kaW5ncyBpcyBkZWNsYXJlZCwgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCUFTVE5vZGUgZmluZERlY2xhcmluZ05vZGUoSUJpbmRpbmcgYmluZGluZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuZXcgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9sZCB0eXBlIGJpbmRpbmcuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHJlZmVyZW5jZUJpbmRpbmcgdGhlIG9sZCB0eXBlIGJpbmRpbmcKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdHlwZSBiaW5kaW5nCisJICovCisJSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuZXcgcGFja2FnZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9sZCBwYWNrYWdlIGJpbmRpbmcuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHBhY2thZ2VCaW5kaW5nIHRoZSBvbGQgcGFja2FnZSBiaW5kaW5nCisJICogQHJldHVybiB0aGUgbmV3IHBhY2thZ2UgYmluZGluZworCSAqLworCUlQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCXJldHVybiBudWxsOworCX0JCQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmV3IG1ldGhvZCBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9sZCBtZXRob2QgYmluZGluZy4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kQmluZGluZyB0aGUgb2xkIG1ldGhvZCBiaW5kaW5nCisJICogQHJldHVybiB0aGUgbmV3IG1ldGhvZCBiaW5kaW5nCisJICovCisJSU1ldGhvZEJpbmRpbmcgZ2V0TWV0aG9kQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmV3IHZhcmlhYmxlIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gb2xkIHZhcmlhYmxlIGJpbmRpbmcuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHZhcmlhYmxlQmluZGluZyB0aGUgb2xkIHZhcmlhYmxlIGJpbmRpbmcKKwkgKiBAcmV0dXJuIHRoZSBuZXcgdmFyaWFibGUgYmluZGluZworCSAqLworCUlWYXJpYWJsZUJpbmRpbmcgZ2V0VmFyaWFibGVCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byB1cGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIG9sZC9uZXcgcGFpciBvZgorCSAqIEFTVCBub2Rlcy4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBvbGQgQVNUIG5vZGUKKwkgKiBAcGFyYW0gbmV3Tm9kZSB0aGUgbmV3IEFTVCBub2RlCisJICovCisJdm9pZCB1cGRhdGVLZXkoQVNUTm9kZSBub2RlLCBBU1ROb2RlIG5ld05vZGUpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3M2FhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmxvY2suamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCbG9jayBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogQmxvY2s6CisgKiAgICA8Yj57PC9iPiB7IFN0YXRlbWVudCB9IDxiPn08L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgQmxvY2sgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQorCS8qKgorCSAqIFRoZSBsaXN0IG9mIHN0YXRlbWVudHMgKGVsZW1lbnQgdHlwZTogPGNvZGU+U3RhdGVtZW50PC9jb2RlPikuIAorCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN0YXRlbWVudHMgPSAKKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QodHJ1ZSwgU3RhdGVtZW50LmNsYXNzKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBibG9jayBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogQnkgZGVmYXVsdCwgdGhlIGJsb2NrIGlzIGVtcHR5LgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlCbG9jayhBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEJMT0NLOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlCbG9jayByZXN1bHQgPSBuZXcgQmxvY2sodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc3RhdGVtZW50cygpLmFkZEFsbCgKKwkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgc3RhdGVtZW50cygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHN0YXRlbWVudHMpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIHRoaXMgYmxvY2suIEFkZGluZyBhbmQKKwkgKiByZW1vdmluZyBub2RlcyBmcm9tIHRoaXMgbGlzdCBhZmZlY3RzIHRoaXMgbm9kZSBkeW5hbWljYWxseS4KKwkgKiBBbGwgbm9kZXMgaW4gdGhpcyBsaXN0IG11c3QgYmUgPGNvZGU+U3RhdGVtZW50PC9jb2RlPnM7CisJICogYXR0ZW1wdHMgdG8gYWRkIGFueSBvdGhlciB0eXBlIG9mIG5vZGUgd2lsbCB0cmlnZ2VyIGFuCisJICogZXhjZXB0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIHRoaXMgYmxvY2sKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0ZW1lbnQ8L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBzdGF0ZW1lbnRzKCkgeworCQlyZXR1cm4gc3RhdGVtZW50czsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gbWVtU2l6ZSgpICsgc3RhdGVtZW50cy5saXN0U2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Cb2R5RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNjFiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IGJvZHkgZGVjbGFyYXRpb25zIAorICogdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBib2R5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLgorICogPHA+CisgKiA8cHJlPgorICogQ2xhc3NCb2R5RGVjbGFyYXRpb246CisgKgkJQ2xhc3NEZWNsYXJhdGlvbgorICoJCUludGVyZmFjZURlY2xhcmF0aW9uCisgKgkJTWV0aG9kRGVjbGFyYXRpb24KKyAqIAkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbgorICogCQlGaWVsZERlY2xhcmF0aW9uCisgKiAJCUluaXRpYWxpemVyCisgKiBJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb246CisgKgkJQ2xhc3NEZWNsYXJhdGlvbgorICoJCUludGVyZmFjZURlY2xhcmF0aW9uCisgKgkJTWV0aG9kRGVjbGFyYXRpb24KKyAqIAkJRmllbGREZWNsYXJhdGlvbgorICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIE1vc3QgdHlwZXMgb2YgYm9keSBkZWNsYXJhdGlvbnMgY2FuIGNhcnJ5IGEgSmF2YWRvYyBjb21tZW50OyBJbml0aWFsaXplcgorICogaXMgdGhlIG9ubHkgb25lcyB0aGF0IGRvZXMgbm90LiBUaGUgc291cmNlIHJhbmdlIGZvciBib2R5IGRlY2xhcmF0aW9ucworICogYWx3YXlzIGluY2x1ZGVzIHRoZSBKYXZhZG9jIGNvbW1lbnQgaWYgcHJlc2VudC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm9keURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7CisJCisJLyoqCisJICogVGhlIEphdmFkb2MgY29tbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgSmF2YWRvYyBvcHRpb25hbEphdmFkb2MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBib2R5IGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQm9keURlY2xhcmF0aW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgSmF2YWRvYyBjb21tZW50IG5vZGUuCisJICogCisJICogQHJldHVybiB0aGUgamF2YWRvYyBjb21tZW50IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgSmF2YWRvYyBnZXRKYXZhZG9jKCkgeworCQlyZXR1cm4gb3B0aW9uYWxKYXZhZG9jOworCX0KKworCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBKYXZhZG9jIGNvbW1lbnQgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gamF2YWRvYyB0aGUgamF2YWRvYyBjb21tZW50IG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgSmF2YSBjb21tZW50IHN0cmluZyBpcyBpbnZhbGlkCisJICovCisJcHVibGljIHZvaWQgc2V0SmF2YWRvYyhKYXZhZG9jIGphdmFkb2MpIHsKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxKYXZhZG9jLCBqYXZhZG9jLCBmYWxzZSk7CisJCXRoaXMub3B0aW9uYWxKYXZhZG9jID0gamF2YWRvYzsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0NjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9vbGVhbkxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQm9vbGVhbiBsaXRlcmFsIG5vZGUuCisgKiAKKyAqIDxwcmU+CisgKiBCb29sZWFuTGl0ZXJhbDoKKyAqIAkJPGI+dHJ1ZTwvYj4KKyAqIAkJPGI+ZmFsc2U8L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgQm9vbGVhbkxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkKKwkvKioKKwkgKiBUaGUgYm9vbGVhbjsgZGVmYXVsdHMgdG8gdGhlIGxpdGVyYWwgZm9yIDxjb2RlPmZhbHNlPC9jb2RlPi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBib29sZWFuIGxpdGVyYWwgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlCb29sZWFuTGl0ZXJhbChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQm9vbGVhbkxpdGVyYWwgcmVzdWx0ID0gbmV3IEJvb2xlYW5MaXRlcmFsKHRhcmdldCk7CisJCXJlc3VsdC5zZXRCb29sZWFuVmFsdWUoYm9vbGVhblZhbHVlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhpcyBib29sZWFuIGxpdGVyYWwgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciB0aGUgYm9vbGVhbiBsaXRlcmFsIHNwZWxsZWQKKwkgKiAgICA8Y29kZT4idHJ1ZSI8L2NvZGU+LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciB0aGUgYm9vbGVhbiBsaXRlcmFsIAorCSAqICAgIHNwZWxsZWQgPGNvZGU+ImZhbHNlIjwvY29kZT4uCisJICovIAorCXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGlzIGJvb2xlYW4gbGl0ZXJhbCBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB2YWx1ZSA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhlIGJvb2xlYW4gbGl0ZXJhbCBzcGVsbGVkCisJICogICAgPGNvZGU+InRydWUiPC9jb2RlPiwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgdGhlIGJvb2xlYW4gbGl0ZXJhbCAKKwkgKiAgICBzcGVsbGVkIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworCQltb2RpZnlpbmcoKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gbWVtU2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CcmVha1N0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CcmVha1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDMwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JyZWFrU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIEJyZWFrIHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBCcmVha1N0YXRlbWVudDoKKyAqICAgIDxiPmJyZWFrPC9iPiBbIElkZW50aWZpZXIgXSA8Yj47PC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkJCQorCS8qKgorCSAqIFRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgbm9uZSBieSBkZWZhdWx0LgorCSAqLworCXByaXZhdGUgU2ltcGxlTmFtZSBvcHRpb25hbExhYmVsID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBicmVhayBzdGF0ZW1lbnQgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgYnJlYWsgc3RhdGVtZW50IGhhcyBubyBsYWJlbC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQnJlYWtTdGF0ZW1lbnQoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBCUkVBS19TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUJyZWFrU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBCcmVha1N0YXRlbWVudCh0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRMYWJlbCgoU2ltcGxlTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldExhYmVsKCkpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TGFiZWwoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGFiZWwgb2YgdGhpcyBicmVhayBzdGF0ZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogdGhlcmUgaXMgbm9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgU2ltcGxlTmFtZSBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIG9wdGlvbmFsTGFiZWw7CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBsYWJlbCBvZiB0aGlzIGJyZWFrIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChTaW1wbGVOYW1lIGxhYmVsKSB7CisJCS8vIGEgQnJlYWtTdGF0ZW1lbnQgY2Fubm90IG9jY3VyIGluc2lkZSBhIFNpbXBsZU5hbWUgLSBubyBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxMYWJlbCwgbGFiZWwsIGZhbHNlKTsKKwkJdGhpcy5vcHRpb25hbExhYmVsID0gbGFiZWw7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKG9wdGlvbmFsTGFiZWwgPT0gbnVsbCA/IDAgOiBnZXRMYWJlbCgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXN0RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXN0RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTgyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Nhc3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIENhc3QgZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBDYXN0RXhwcmVzc2lvbjoKKyAqICAgIDxiPig8L2I+IFR5cGUgPGI+KTwvYj4gRXhwcmVzc2lvbiAKKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDYXN0RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisJLyoqCisJICogVGhlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKKwkgKiBsZWdhbCB0eXBlLgorCSAqLworCXByaXZhdGUgVHlwZSB0eXBlID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKKwkgKiBleHByZXNzaW9uLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgY2FzdCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB0eXBlIGFuZCBleHByZXNzaW9uIGFyZSB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKS4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJQ2FzdEV4cHJlc3Npb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBDQVNUX0VYUFJFU1NJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUNhc3RFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDYXN0RXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0VHlwZSgoVHlwZSkgZ2V0VHlwZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUeXBlKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIGluIHRoaXMgY2FzdCBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHR5cGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0VHlwZShnZXRBU1QoKS5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdHlwZSBpbiB0aGlzIGNhc3QgZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gdHlwZS4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IHR5cGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIENhc3RFeHByZXNzaW9uIGNhbm5vdCBvY2N1ciBpbnNpZGUgYSBUeXBlIC0gY3ljbGVzIG5vdCBwb3NzaWJsZQorCQlyZXBsYWNlQ2hpbGQodGhpcy50eXBlLCB0eXBlLCBmYWxzZSk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBjYXN0IGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBjYXN0IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIENhc3RFeHByZXNzaW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAKKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQorCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgKGV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKKwkJCSsgKHR5cGUgPT0gbnVsbCA/IDAgOiBnZXRUeXBlKCkudHJlZVNpemUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXRjaENsYXVzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXRjaENsYXVzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGM1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NhdGNoQ2xhdXNlLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIENhdGNoIGNsYXVzZSBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBDYXRjaENsYXVzZToKKyAqIAkJCTxiPmNhdGNoPC9iPiA8Yj4oPC9iPiBGb3JtYWxQYXJhbWV0ZXIgPGI+KTwvYj4gQmxvY2sKKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRjaENsYXVzZSBleHRlbmRzIEFTVE5vZGUgeworCS8qKgorCSAqIFRoZSBib2R5OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrLgorCSAqLworCXByaXZhdGUgQmxvY2sgYm9keSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgZXhjZXB0aW9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEKKwkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKwkgKi8KKwlwcml2YXRlIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZXhjZXB0aW9uRGVjbCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIGNhdGNoIGNsYXVzZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgY2F0Y2ggY2xhdXNlIGRlY2xhcmVzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIAorCSAqIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbiBhbmQgaGFzIGFuIGVtcHR5IGJsb2NrLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlDYXRjaENsYXVzZShBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIENBVENIX0NMQVVTRTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQ2F0Y2hDbGF1c2UgcmVzdWx0ID0gbmV3IENhdGNoQ2xhdXNlKHRhcmdldCk7CisJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0RXhjZXB0aW9uKAorCQkJKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeGNlcHRpb24oKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeGNlcHRpb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRCb2R5KCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGNhdGNoIGNsYXVzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdmFyaWFibGUgZGVjbGFyYXRpb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRFeGNlcHRpb24oKSB7CisJCWlmIChleGNlcHRpb25EZWNsID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4Y2VwdGlvbihuZXcgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBleGNlcHRpb25EZWNsOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gb2YgdGhpcyBjYXRjaCBjbGF1c2UuCisJICogCisJICogQHBhcmFtIGRlY2wgdGhlIGV4Y2VwdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb24pIHsKKwkJaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBDYXRjaENsYXVzZSBtYXkgb2NjdXIgaW5zaWRlIGFuIAorCQkvLyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuZXhjZXB0aW9uRGVjbCwgZXhjZXB0aW9uLCB0cnVlKTsKKwkJdGhpcy5leGNlcHRpb25EZWNsPSBleGNlcHRpb247CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGJvZHkgb2YgdGhpcyBjYXRjaCBjbGF1c2UuCisJICogCisJICogQHJldHVybiB0aGUgY2F0Y2ggY2xhdXNlIGJvZHkKKwkgKi8gCisJcHVibGljIEJsb2NrIGdldEJvZHkoKSB7CisJCWlmIChib2R5ID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEJvZHkobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGJvZHk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBjYXRjaCBjbGF1c2UuCisJICogCisJICogQHBhcmFtIGJvZHkgdGhlIGNhdGNoIGNsYXVzZSBibG9jayBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRCb2R5KEJsb2NrIGJvZHkpIHsKKwkJaWYgKGJvZHkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgQ2F0Y2hDbGF1c2UgbWF5IG9jY3VyIGluIGEgQmxvY2sgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5ib2R5LCBib2R5LCB0cnVlKTsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAoZXhjZXB0aW9uRGVjbCA9PSBudWxsID8gMCA6IGdldEV4Y2VwdGlvbigpLnRyZWVTaXplKCkpCisJCQkrIChib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DaGFyYWN0ZXJMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjNWU3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CisKKy8qKgorICogQ2hhcmFjdGVyIGxpdGVyYWwgbm9kZXMuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIENoYXJhY3RlckxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCS8qKgorCSAqIFRoZSBsaXRlcmFsIHN0cmluZywgaW5jbHVkaW5nIHF1b3RlcyBhbmQgZXNjYXBlczsgZGVmYXVsdHMgdG8gdGhlIAorCSAqIGxpdGVyYWwgZm9yIHRoZSBjaGFyYWN0ZXIgJ1gnLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGVzY2FwZWRWYWx1ZSA9ICJcJ1hcJyI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGNoYXJhY3RlciBsaXRlcmFsIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgY2hhcmFjdGVyIGxpdGVyYWwgZGVub3RlcyBhbiB1bnNwZWNpZmllZCBjaGFyYWN0ZXIuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUNoYXJhY3RlckxpdGVyYWwoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBDSEFSQUNURVJfTElURVJBTDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQ2hhcmFjdGVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgQ2hhcmFjdGVyTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0RXNjYXBlZFZhbHVlKGdldEVzY2FwZWRWYWx1ZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuIFRoZSB2YWx1ZSBpcyB0aGUgc2VxdWVuY2UKKwkgKiBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBzb3VyY2UgcHJvZ3JhbSwgaW5jbHVkaW5nCisJICogZW5jbG9zaW5nIHNpbmdsZSBxdW90ZXMgYW5kIGVtYmVkZGVkIGVzY2FwZXMuCisJICogCisJICogQHJldHVybiB0aGUgZXNjYXBlZCBzdHJpbmcgdmFsdWUsIGluY2x1ZGluZyBlbmNsb3Npbmcgc2luZ2xlIHF1b3RlcworCSAqICAgIGFuZCBlbWJlZGRlZCBlc2NhcGVzCisJICovIAorCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgeworCQlyZXR1cm4gZXNjYXBlZFZhbHVlOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlLiBUaGUgdmFsdWUgaXMgdGhlIHNlcXVlbmNlCisJICogb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIHByb2dyYW0sIGluY2x1ZGluZworCSAqIGVuY2xvc2luZyBzaW5nbGUgcXVvdGVzIGFuZCBlbWJlZGRlZCBlc2NhcGVzLiBGb3IgZXhhbXBsZSwKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPidhJzwvY29kZT4gPGNvZGU+c2V0RXNjYXBlZFZhbHVlKCJcJ2FcJyIpPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPidcbic8L2NvZGU+IDxjb2RlPnNldEVzY2FwZWRWYWx1ZSgiXCdcXG5cJyIpPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB2YWx1ZSwgaW5jbHVkaW5nIGVuY2xvc2luZyBzaW5nbGUgcXVvdGVzCisJICogICAgYW5kIGVtYmVkZGVkIGVzY2FwZXMKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0CisJICovIAorCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlTY2FubmVyIHNjYW5uZXIgPSBnZXRBU1QoKS5zY2FubmVyOworCQljaGFyW10gc291cmNlID0gdmFsdWUudG9DaGFyQXJyYXkoKTsKKwkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKKwkJc2Nhbm5lci5yZXNldFRvKDAsIHNvdXJjZS5sZW5ndGgpOworCQl0cnkgeworCQkJaW50IHRva2VuVHlwZSA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQlzd2l0Y2godG9rZW5UeXBlKSB7CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmVzY2FwZWRWYWx1ZSA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlLiAKKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwKKwkgKiA8Y29kZT4KKwkgKiA8cHJlPgorCSAqIENoYXJhY3RlckxpdGVyYWwgczsKKwkgKiBzLnNldEVzY2FwZWRWYWx1ZSgiXCd4XCciKTsKKwkgKiBhc3NlcnQgcy5jaGFyVmFsdWUoKSA9PSAneCc7CisJICogPC9wcmU+CisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciB2YWx1ZSB3aXRob3V0IGVuY2xvc2luZyBxdW90ZXMgYW5kIGVtYmVkZGVkCisJICogICAgZXNjYXBlcworCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsaXRlcmFsIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQKKwkgKi8gCisJcHVibGljIGNoYXIgY2hhclZhbHVlKCkgeworCQlTdHJpbmcgcyA9IGdldEVzY2FwZWRWYWx1ZSgpOworCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKKwkJaWYgKGxlbiA8IDIgfHwgcy5jaGFyQXQoMCkgIT0gJ1wnJyB8fCBzLmNoYXJBdChsZW4tMSkgIT0gJ1wnJyApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQljaGFyIGMgPSBzLmNoYXJBdCgxKTsKKwkJaWYgKGMgPT0gJ1wnJykgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWlmIChsZW4gPT0gNCkgeworCQkJCWNoYXIgbmV4dENoYXIgPSBzLmNoYXJBdCgyKTsKKwkJCQlzd2l0Y2gobmV4dENoYXIpIHsKKwkJCQkJY2FzZSAnYicgOgorCQkJCQkJcmV0dXJuICdcYic7CisJCQkJCWNhc2UgJ3QnIDoKKwkJCQkJCXJldHVybiAnXHQnOworCQkJCQljYXNlICduJyA6CisJCQkJCQlyZXR1cm4gJ1xuJzsKKwkJCQkJY2FzZSAnZicgOgorCQkJCQkJcmV0dXJuICdcZic7CisJCQkJCWNhc2UgJ3InIDoKKwkJCQkJCXJldHVybiAnXHInOworCQkJCQljYXNlICdcIic6CisJCQkJCQlyZXR1cm4gJ1wiJzsKKwkJCQkJY2FzZSAnXCcnOgorCQkJCQkJcmV0dXJuICdcJyc7CisJCQkJCWNhc2UgJ1xcJzoKKwkJCQkJCXJldHVybiAnXFwnOworCQkJCQljYXNlICcwJyA6CisJCQkJCQlyZXR1cm4gJ1wwJzsKKwkJCQkJY2FzZSAnMScgOgorCQkJCQkJcmV0dXJuICdcMSc7CisJCQkJCWNhc2UgJzInIDoKKwkJCQkJCXJldHVybiAnXDInOworCQkJCQljYXNlICczJyA6CisJCQkJCQlyZXR1cm4gJ1wzJzsKKwkJCQkJY2FzZSAnNCcgOgorCQkJCQkJcmV0dXJuICdcNCc7CisJCQkJCWNhc2UgJzUnIDoKKwkJCQkJCXJldHVybiAnXDUnOworCQkJCQljYXNlICc2JyA6CisJCQkJCQlyZXR1cm4gJ1w2JzsKKwkJCQkJY2FzZSAnNycgOgorCQkJCQkJcmV0dXJuICdcNyc7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gZWxzZSBpZiAobGVuID09IDgpIHsKKwkJCQkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgorCQkJCWludCBjdXJyZW50UG9zaXRpb24gPSAyOworCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJaWYgKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSA9PSAndScpIHsKKwkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQorCQkJCQkJfHwgYzEgPCAwCisJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKKwkJCQkJCXx8IGMyIDwgMAorCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1CisJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQorCQkJCQkJfHwgYzQgPCAwKXsKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY2hhcmFjdGVyIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBjaGFyYWN0ZXIgbGl0ZXJhbCBub2RlIHRvIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIAorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlLAorCSAqIDxjb2RlPgorCSAqIDxwcmU+CisJICogQ2hhcmFjdGVyTGl0ZXJhbCBzOworCSAqIHMuc2V0Q2hhclZhbHVlKCd4Jyk7CisJICogYXNzZXJ0IHMuY2hhclZhbHVlKCkgPT0gJ3gnOworCSAqIGFzc2VydCBzLmdldEVzY2FwZWRWYWx1ZSgiXCd4XCciKTsKKwkgKiA8L3ByZT4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBjaGFyYWN0ZXIgdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDaGFyVmFsdWUoY2hhciB2YWx1ZSkgeworCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMyk7CisJCQorCQliLmFwcGVuZCgnXCcnKTsgLy8gb3BlbmluZyBkZWxpbWl0ZXIKKwkJc3dpdGNoKHZhbHVlKSB7CisJCQljYXNlICdcYicgOgorCQkJCWIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSAnXHQnIDoKKwkJCQliLmFwcGVuZCgiXFx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xuJyA6CisJCQkJYi5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcZicgOgorCQkJCWIuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSAnXHInIDoKKwkJCQliLmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wiJzoKKwkJCQliLmFwcGVuZCgiXFxcIiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcJyc6CisJCQkJYi5hcHBlbmQoIlxcXCciKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSAnXFwnOgorCQkJCWIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wwJyA6CisJCQkJYi5hcHBlbmQoIlxcMCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcMScgOgorCQkJCWIuYXBwZW5kKCJcXDEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSAnXDInIDoKKwkJCQliLmFwcGVuZCgiXFwyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wzJyA6CisJCQkJYi5hcHBlbmQoIlxcMyIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNCcgOgorCQkJCWIuYXBwZW5kKCJcXDQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSAnXDUnIDoKKwkJCQliLmFwcGVuZCgiXFw1Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1w2JyA6CisJCQkJYi5hcHBlbmQoIlxcNiIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlICdcNycgOgorCQkJCWIuYXBwZW5kKCJcXDciKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOwkJCQorCQkJZGVmYXVsdDoKKwkJCQliLmFwcGVuZCh2YWx1ZSk7CisJCX0KKwkJYi5hcHBlbmQoJ1wnJyk7IC8vIGNsb3NpbmcgZGVsaW1pdGVyCisJCXNldEVzY2FwZWRWYWx1ZShiLnRvU3RyaW5nKCkpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0OworCQlpZiAoZXNjYXBlZFZhbHVlICE9IG51bGwpIHsKKwkJCXNpemUgKz0gSEVBREVSUyArIDIgKiA0ICsgSEVBREVSUyArIDIgKiBlc2NhcGVkVmFsdWUubGVuZ3RoKCk7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIG1lbVNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjk0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIENsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOgorICogICAgICAgIFsgRXhwcmVzc2lvbiA8Yj4uPC9iPiBdIDxiPm5ldzwvYj4gVHlwZU5hbWUKKyAqICAgICAgICAgICAgPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+LDwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+KTwvYj4KKyAqICAgICAgICAgICAgWyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIF0KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0luc3RhbmNlQ3JlYXRpb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCS8qKgorCSAqIFRoZSBvcHRpb25hbCBleHByZXNzaW9uOyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUgdHlwZSBuYW1lOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCisJICogbGVnYWwgdHlwZSBuYW1lLgorCSAqLworCXByaXZhdGUgTmFtZSB0eXBlTmFtZSA9IG51bGw7CisJCisJLyoqCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCisJICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBFeHByZXNzaW9uLmNsYXNzKTsKKwkJCisJLyoqCisJICogVGhlIG9wdGlvbmFsIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IAorCSAqIGRlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG9wdGlvbmFsQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA9IG51bGw7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIG93bmVkIAorCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIHF1YWxpZnlpbmcgZXhwcmVzc2lvbiwKKwkgKiBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlIG5hbWUsIGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzLAorCSAqIGFuZCBkb2VzIG5vdCBkZWNsYXJlIGFuIGFub255bW91cyBjbGFzcy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiAoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBDTEFTU19JTlNUQU5DRV9DUkVBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHJlc3VsdCA9IG5ldyBDbGFzc0luc3RhbmNlQ3JlYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oCisJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4cHJlc3Npb24oKSkpOworCQlyZXN1bHQuc2V0TmFtZSgoTmFtZSkgZ2V0TmFtZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuYXJndW1lbnRzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgYXJndW1lbnRzKCkpKTsKKwkJcmVzdWx0LnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oCisJCQkoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikgCisJCQkgICBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24sIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCXJldHVybiBvcHRpb25hbEV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQkvLyBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24KKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxFeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbEV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgaW5zdGFudGlhdGVkIGluIHRoaXMgY2xhc3MgaW5zdGFuY2UgCisJICogY3JlYXRpb24gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUgbm9kZQorCSAqLyAKKwlwdWJsaWMgTmFtZSBnZXROYW1lKCkgeworCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiB0eXBlTmFtZTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBpbnN0YW50aWF0ZWQgaW4gdGhpcyBjbGFzcyBpbnN0YW5jZSAKKwkgKiBjcmVhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgdHlwZSBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT5gCisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLnR5cGVOYW1lLCBuYW1lLCBmYWxzZSk7CisJCXRoaXMudHlwZU5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHRoaXMgY2xhc3MKKwkgKiBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAocG9zc2libHkgZW1wdHkpCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IGFyZ3VtZW50cygpIHsKKwkJcmV0dXJuIGFyZ3VtZW50czsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIGludHJvZHVjZWQgYnkgdGhpcworCSAqIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24sIGlmIGl0IGhhcyBvbmUuCisJICogCisJICogQHJldHVybiB0aGUgYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovIAorCXB1YmxpYyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7CisJCXJldHVybiBvcHRpb25hbEFub255bW91c0NsYXNzRGVjbGFyYXRpb247CisJfQorCQorCS8qKgorCSAqIFNldHMgd2hldGhlciB0aGlzIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gZGVjbGFyZXMKKwkgKiBhbiBhbm9ueW1vdXMgY2xhc3MgKHRoYXQgaXMsIGhhcyBjbGFzcyBib2R5IGRlY2xhcmF0aW9ucykuCisJICogCisJICogQHBhcmFtIGRlY2wgdGhlIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gCisJICogICAgaWYgbm9uZQorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gZGVjbCkgeworCQkvLyBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24KKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLCBkZWNsLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPSBkZWNsOworCX0KKworCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgY29uc3RydWN0b3IgaW52b2tlZCBieSB0aGlzCisJICogZXhwcmVzc2lvbi4gRm9yIGFub255bW91cyBjbGFzc2VzLCB0aGUgYmluZGluZyBpcyB0aGF0IG9mIHRoZSBhbm9ueW1vdXMKKwkgKiBjb25zdHJ1Y3Rvci4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZworCSAqICAgIGNhbm5vdCBiZSByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUNvbnN0cnVjdG9yQmluZGluZygpIHsKKwkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVDb25zdHJ1Y3Rvcih0aGlzKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDQgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAodHlwZU5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKKwkJCSsgKG9wdGlvbmFsRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKQorCQkJKyBhcmd1bWVudHMubGlzdFNpemUoKQorCQkJKyAob3B0aW9uYWxBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID09IG51bGwgPyAwIDogZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkZTYxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEphdmEgY29tcGlsYXRpb24gdW5pdCBBU1Qgbm9kZSB0eXBlLiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSByb290IG9mIGFuIEFTVC4KKyAqCisgKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgdGhyb3VnaCBsYXN0IGNoYXJhY3RlciBvZiB0aGUgc291cmNlIGZpbGUuCisgKgorICogPHByZT4KKyAqIENvbXBpbGF0aW9uVW5pdDoKKyAqICAgIFsgUGFja2FnZURlY2xhcmF0aW9uIF0KKyAqICAgIHsgSW1wb3J0RGVjbGFyYXRpb24gfQorICogICAgeyBUeXBlRGVjbGFyYXRpb24gfCA8Yj47PC9iPiB9CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgQVNUTm9kZSB7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgaW5pdGlhbGx5CisJICogPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJpdmF0ZSBQYWNrYWdlRGVjbGFyYXRpb24gb3B0aW9uYWxQYWNrYWdlRGVjbGFyYXRpb24gPSBudWxsOworCQorCS8qKgorCSAqIFRoZSBsaXN0IG9mIGltcG9ydCBkZWNsYXJhdGlvbnMgaW4gdGV4dHVhbCBvcmRlciBvcmRlcjsgCisJICogaW5pdGlhbGx5IG5vbmUgKGVsZW1lbnRUeXBlOiA8Y29kZT5JbXBvcnREZWNsYXJhdGlvbjwvY29kZT4pLgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBpbXBvcnRzID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoZmFsc2UsIEltcG9ydERlY2xhcmF0aW9uLmNsYXNzKTsKKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0ZXh0dWFsIG9yZGVyIG9yZGVyOyAKKwkgKiBpbml0aWFsbHkgbm9uZSAoZWxlbWVudFR5cGU6IDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4pCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHR5cGVzID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoZmFsc2UsIFR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisJCisJLyoqCisJICogTGluZSBlbmQgdGFibGUuIElmIDxjb2RlPmxpbmVFbmRUYWJsZVtpXSA9PSBwPC9jb2RlPiB0aGVuIHRoZQorCSAqIGxpbmUgbnVtYmVyIDxjb2RlPmkrMTwvY29kZT4gZW5kcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gCisJICogPGNvZGU+cDwvY29kZT4uIEV4Y2VwdCBmb3IgdGhlIGxhc3QgbGluZSwgdGhlIHBvc2l0aW9ucyBhcmUgdGhhdAorCSAqIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSBkZWxpbWl0ZXIuIAorCSAqIEZvciBleGFtcGxlLCB0aGUgc291cmNlIHN0cmluZyA8Y29kZT5BXG5CXG5DPC9jb2RlPiBoYXMKKwkgKiBsaW5lIGVuZCB0YWJsZSB7MSwgM30gKGlmIFxuIGlzIG9uZSBjaGFyYWN0ZXIpLgorCSAqLworCXByaXZhdGUgaW50W10gbGluZUVuZFRhYmxlID0gbmV3IGludFswXTsKKworCS8qKgorCSAqIENhbm9uaWNhbCBlbXB0eSBsaXN0IG9mIG1lc3NhZ2VzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VbXSBFTVBUWV9NRVNTQUdFUyA9IG5ldyBNZXNzYWdlWzBdOworCisJLyoqCisJICogTWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyBwYXJzaW5nIG9yIG5hbWUgcmVzb2x1dGlvbjsKKwkgKiBkZWZhdWx0cyB0byB0aGUgZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIE1lc3NhZ2VbXSBtZXNzYWdlcyA9IEVNUFRZX01FU1NBR0VTOworCSAKKwkvKioKKwkgKiBTZXRzIHRoZSBsaW5lIGVuZCB0YWJsZSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LgorCSAqIElmIDxjb2RlPmxpbmVFbmRUYWJsZVtpXSA9PSBwPC9jb2RlPiB0aGVuIGxpbmUgbnVtYmVyIDxjb2RlPmkrMTwvY29kZT4gCisJICogZW5kcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gPGNvZGU+cDwvY29kZT4uIEV4Y2VwdCBmb3IgdGhlIGxhc3QgbGluZSwgdGhlIAorCSAqIHBvc2l0aW9ucyBhcmUgdGhhdCBvZiAodGhlIGxhc3QgY2hhcmFjdGVyIG9mKSB0aGUgbGluZSBkZWxpbWl0ZXIuCisJICogRm9yIGV4YW1wbGUsIHRoZSBzb3VyY2Ugc3RyaW5nIDxjb2RlPkFcbkJcbkM8L2NvZGU+IGhhcworCSAqIGxpbmUgZW5kIHRhYmxlIHsxLCAzLCA0fS4KKwkgKiAKKwkgKiBAcGFyYW0gbGluZUVuZHRhYmxlIHRoZSBsaW5lIGVuZCB0YWJsZQorCSAqLworCXZvaWQgc2V0TGluZUVuZFRhYmxlKGludFtdIGxpbmVFbmRUYWJsZSkgeworCQlpZiAobGluZUVuZFRhYmxlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmxpbmVFbmRUYWJsZSA9IGxpbmVFbmRUYWJsZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIGNvbXBpbGF0aW9uIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgaW5pdGlhbGx5IGhhcyBubyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBubworCSAqIGltcG9ydCBkZWNsYXJhdGlvbnMsIGFuZCBubyB0eXBlIGRlY2xhcmF0aW9ucy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUNvbXBpbGF0aW9uVW5pdChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIENPTVBJTEFUSU9OX1VOSVQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUNvbXBpbGF0aW9uVW5pdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHRhcmdldCk7CisJCS8vIG4uYiBkbyBub3QgY29weSBsaW5lIG51bWJlciB0YWJsZSBvciBtZXNzYWdlcworCQlyZXN1bHQuc2V0UGFja2FnZSgKKwkJCShQYWNrYWdlRGVjbGFyYXRpb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRQYWNrYWdlKCkpKTsKKwkJcmVzdWx0LmltcG9ydHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBpbXBvcnRzKCkpKTsKKwkJcmVzdWx0LnR5cGVzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgdHlwZXMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRQYWNrYWdlKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgaW1wb3J0cyk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCB0eXBlcyk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbm9kZSBmb3IgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiAKKwkgKiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gdGhlIAorCSAqIGRlZmF1bHQgcGFja2FnZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8gCisJcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbiBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gb3B0aW9uYWxQYWNrYWdlRGVjbGFyYXRpb247CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCAKKwkgKiBub2RlIHRvIHRoZSBnaXZlbiBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUuCisJICogCisJICogQHBhcmFtIHBrZ0RlY2wgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIG5vZGUsIG9yIAorCSAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjb21waWxhdGlvbiB1bml0IGRvZXMgbm90IGhhdmUgYSBwYWNrYWdlCisJICogICBkZWNsYXJhdGlvbiAodGhhdCBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlKQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0UGFja2FnZShQYWNrYWdlRGVjbGFyYXRpb24gcGtnRGVjbCkgeworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbFBhY2thZ2VEZWNsYXJhdGlvbiwgcGtnRGVjbCwgZmFsc2UpOworCQl0aGlzLm9wdGlvbmFsUGFja2FnZURlY2xhcmF0aW9uID0gcGtnRGVjbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2Ygbm9kZXMgZm9yIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gb2YgdGhpcyAKKwkgKiBjb21waWxhdGlvbiB1bml0LCBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBpbXBvcnQgZGVjbGFyYXRpb24gbm9kZXMKKwkgKiAgICAoZWxlbWVudFR5cGU6IDxjb2RlPkltcG9ydERlY2xhcmF0aW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgaW1wb3J0cygpIHsKKwkJcmV0dXJuIGltcG9ydHM7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiBub2RlcyBmb3IgdGhlIHRvcC1sZXZlbCB0eXBlIGRlY2xhcmF0aW9uIG9mIHRoaXMgCisJICogY29tcGlsYXRpb24gdW5pdCwgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdG9wLWxldmVsIHR5cGUgZGVjbGFyYXRpb24KKwkgKiAgICBub2RlcyAoZWxlbWVudFR5cGU6IDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IHR5cGVzKCkgeworCQlyZXR1cm4gdHlwZXM7CisJfQorCisJLyoqCisJICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgQVNUIG5vZGUgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSAKKwkgKiB3aGljaCB0aGUgZ2l2ZW4gYmluZGluZyBvcmlnaW5hdGVkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorCSAqIGJpbmRpbmcgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbm9kZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisJICogPHA+CisJICogVGhlIGZvbGxvd2luZyB0YWJsZSBpbmRpY2F0ZXMgdGhlIGV4cGVjdGVkIG5vZGUgdHlwZSBmb3IgdGhlIHZhcmlvdXMKKwkgKiBkaWZmZXJlbnQga2luZHMgb2YgYmluZGluZ3M6CisJICogPHVsPgorCSAqIDxsaT48L2xpPgorCSAqIDxsaT5wYWNrYWdlIC0gYSA8Y29kZT5QYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+PC9saT4KKwkgKiA8bGk+Y2xhc3Mgb3IgaW50ZXJmYWNlIC0gYSA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+IG9yIGEKKwkgKiAgICA8Y29kZT5DbGFzc0luc3RhbmNlQ3JlYXRpb248L2NvZGU+IChmb3IgYW5vbnltb3VzIGNsYXNzZXMpIDwvbGk+CisJICogPGxpPnByaW1pdGl2ZSB0eXBlIC0gbm9uZTwvbGk+CisJICogPGxpPmFycmF5IHR5cGUgLSBub25lPC9saT4KKwkgKiA8bGk+ZmllbGQgLSBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYSAKKwkgKiAgICA8Y29kZT5GaWVsZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgorCSAqIDxsaT5sb2NhbCB2YXJpYWJsZSAtIGEgPGNvZGU+U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjwvY29kZT4sIG9yCisJICogICAgYSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+IGluIGEgCisJICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDwvY29kZT4gb3IgCisJICogICAgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb248L2NvZGU+PC9saT4KKwkgKiA8bGk+bWV0aG9kIC0gYSA8Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT4gPC9saT4KKwkgKiA8bGk+Y29uc3RydWN0b3IgLSBhIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBiaW5kaW5nIHRoZSBiaW5kaW5nCisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIHdoZXJlIHRoZSBiaW5kaW5ncyBpcyBkZWNsYXJlZCwgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBBU1ROb2RlIGZpbmREZWNsYXJpbmdOb2RlKElCaW5kaW5nIGJpbmRpbmcpIHsKKwkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzb3VyY2UgY2hhcmFjdGVyCisJICogcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcuIFRoZSBpbml0aWFsIGxpbmUgb2YgdGhlIAorCSAqIGNvbXBpbGF0aW9uIHVuaXQgaXMgbnVtYmVyZWQgMSwgYW5kIGVhY2ggbGluZSBleHRlbmRzIHRocm91Z2ggdGhlCisJICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGVuZC1vZi1saW5lIGRlbGltaXRlci4gVGhlIHZlcnkgbGFzdCBsaW5lIGV4dGVuZHMKKwkgKiB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBzdHJpbmcgYW5kIGhhcyBubyBsaW5lIGRlbGltaXRlci4KKwkgKiBGb3IgZXhhbXBsZSwgdGhlIHNvdXJjZSBzdHJpbmcgPGNvZGU+Y2xhc3MgQVxue1xufTwvY29kZT4gaGFzIDMgbGluZXMKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGluY2x1c2l2ZSBjaGFyYWN0ZXIgcmFuZ2VzIFswLDhdLCBbOCw5XSwgYW5kIFsxMCwxMF0uCisJICogUmV0dXJucyAxIGZvciBhIGNoYXJhY3RlciBwb3NpdGlvbiB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55CisJICogc291cmNlIGxpbmUsIG9yIGlmIG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcworCSAqIGNvbXBpbGF0aW9uIHVuaXQuCisJICogCisJICogQHBhcmFtIHBvc2l0aW9uIGEgMC1iYXNlZCBjaGFyYWN0ZXIgcG9zaXRpb24sIHBvc3NpYmx5CisJICogICBuZWdhdGl2ZSBvciBvdXQgb2YgcmFuZ2UKKwkgKiBAcmV0dXJuIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciA8Y29kZT4xPC9jb2RlPiBpZiB0aGUgY2hhcmFjdGVyCisJICogICAgcG9zaXRpb24gZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNvdXJjZSBsaW5lIGluIHRoZSBvcmlnaW5hbAorCSAqICAgIHNvdXJjZSBmaWxlIG9yIGlmIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIG5vdCBrbm93biBmb3IgdGhpcworCSAqICAgIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBAc2VlIEFTVCNwYXJzZUNvbXBpbGF0aW9uVW5pdAorCSAqLworCXB1YmxpYyBpbnQgbGluZU51bWJlcihpbnQgcG9zaXRpb24pIHsKKwkJaW50IGxlbmd0aCA9IGxpbmVFbmRUYWJsZS5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkgeworCQkJLy8gbm8gbGluZSBudW1iZXIgaW5mbworCQkJcmV0dXJuIDE7CisJCX0KKwkJaW50IGxvdyA9IDA7CisJCWlmIChwb3NpdGlvbiA8PSBsaW5lRW5kVGFibGVbbG93XSkgeworCQkJLy8gcG9zaXRpb24gaWxsZWdhbCBvciBiZWZvcmUgdGhlIGZpcnN0IGxpbmUgZGVsaW1pdGVyCisJCQlyZXR1cm4gMTsKKwkJfQorCQkvLyBhc3NlcnQgcG9zaXRpb24gPiBsaW5lRW5kVGFibGVbbG93KzFdICAmJiBsb3cgPT0gMAorCQlpbnQgaGkgPSBsZW5ndGggLSAxOworCQlpZiAocG9zaXRpb24gPiBsaW5lRW5kVGFibGVbaGldKSB7CisJCQkvLyBwb3NpdGlvbiBiZXlvbmQgdGhlIGxhc3QgbGluZSBzZXBhcmF0b3IKKwkJCWlmIChwb3NpdGlvbiA+PSBnZXRTdGFydFBvc2l0aW9uKCkgKyBnZXRMZW5ndGgoKSkgeworCQkJCS8vIHRoaXMgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBsZW5ndGgKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGxlbmd0aCArIDE7CisJCQl9CisJCX0KKwkJLy8gYXNzZXJ0IGxpbmVFbmRUYWJsZVtsb3ddICA8IHBvc2l0aW9uIDw9IGxpbmVFbmRUYWJsZVtoaV0KKwkJLy8gJiYgbG93ID09IDAgJiYgaGkgPT0gbGVuZ3RoIC0gMSAmJiBsb3cgPCBoaQorCQkKKwkJLy8gYmluYXJ5IHNlYXJjaCBsaW5lIGVuZCB0YWJsZQorCQl3aGlsZSAodHJ1ZSkgeworCQkJLy8gaW52YXJpYW50IGxpbmVFbmRUYWJsZVtsb3ddIDwgcG9zaXRpb24gPD0gbGluZUVuZFRhYmxlW2hpXQorCQkJLy8gJiYgMCA8PSBsb3cgPCBoaSA8PSBsZW5ndGggLSAxCisJCQkvLyByZWR1Y2luZyBtZWFzdXJlIGhpIC0gbG93CisJCQlpZiAobG93ICsgMSA9PSBoaSkgeworCQkJCS8vIGFzc2VydCBsaW5lRW5kVGFibGVbbG93XSA8IHBvc2l0aW9uIDw9IGxpbmVFbmRUYWJsZVtsb3crMV0KKwkJCQkvLyBwb3NpdGlvbiBpcyBvbiBsaW5lIGxvdysxIChsaW5lIG51bWJlciBpcyBsb3crMikKKwkJCQlyZXR1cm4gbG93ICsgMjsKKwkJCX0KKwkJCS8vIGFzc2VydCBoaSAtIGxvdyA+PSAyLCBzbyBhdmVyYWdlIGlzIHRydWx5IGluIGJldHdlZW4KKwkJCWludCBtaWQgPSAobG93ICsgaGkpIC8gMjsKKwkJCS8vIGFzc2VydCAwIDw9IGxvdyA8IG1pZCA8IGhpIDw9IGxlbmd0aCAtIDEKKwkJCWlmIChwb3NpdGlvbiA8PSBsaW5lRW5kVGFibGVbbWlkXSkgeworCQkJCS8vIGFzc2VydCBsaW5lRW5kVGFibGVbbG93XSA8IHBvc2l0aW9uIDw9IGxpbmVFbmRUYWJsZVttaWRdCisJCQkJLy8gJiYgMCA8PSBsb3cgPCBtaWQgPCBoaSA8PSBsZW5ndGggLSAxCisJCQkJaGkgPSBtaWQ7CisJCQl9IGVsc2UgeworCQkJCS8vIHBvc2l0aW9uID4gbGluZUVuZFRhYmxlW21pZF0KKwkJCQkvLyBhc3NlcnQgbGluZUVuZFRhYmxlW21pZF0gPCBwb3NpdGlvbiA8PSBsaW5lRW5kVGFibGVbaGldCisJCQkJLy8gJiYgMCA8PSBsb3cgPCBtaWQgPCBoaSA8PSBsZW5ndGggLSAxCisJCQkJbG93ID0gbWlkOworCQkJfQorCQkJLy8gaW4gYm90aCBjYXNlcywgaW52YXJpYW50IHJlYWNoaWV2ZWQgd2l0aCByZWR1Y2VkIG1lYXN1cmUKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgcGFyc2luZyAKKwkgKiBvciB0aGUgdHlwZSBjaGVja2luZyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbGlzdCBtaWdodCBiZSBhIHN1YnNldCBvZiAKKwkgKiBlcnJvcnMgZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkIGJ5IGEgSmF2YSBjb21waWxlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1lc3NhZ2VzLCBwb3NzaWJseSBlbXB0eQorCSAqIEBzZWUgQVNUI3BhcnNlQ29tcGlsYXRpb25Vbml0CisJICovCisJcHVibGljIE1lc3NhZ2VbXSBnZXRNZXNzYWdlcygpIHsKKwkJcmV0dXJuIG1lc3NhZ2VzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGFycmF5IG9mIG1lc3NhZ2VzIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgdGhlIHBhcnNpbmcgb3IKKwkgKiBuYW1lIHJlc29sdXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlcyB0aGUgbGlzdCBvZiBtZXNzYWdlcworCSAqLworCXZvaWQgc2V0TWVzc2FnZXMoTWVzc2FnZVtdIG1lc3NhZ2VzKSB7CisJCWlmIChtZXNzYWdlcyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOworCX0KKwkJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhcHBlbmREZWJ1Z1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoIkNvbXBpbGF0aW9uVW5pdCIpOyAvLyROT04tTkxTLTEkCisJCS8vIGluY2x1ZGUgdGhlIHR5cGUgbmFtZXMKKwkJYnVmZmVyLmFwcGVuZCgiWyIpOyAvLyROT04tTkxTLTEkCisJCWZvciAoSXRlcmF0b3IgaXQgPSB0eXBlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gZCA9IChUeXBlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKKwkJCWJ1ZmZlci5hcHBlbmQoZC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlpbnQgc2l6ZSA9IEJBU0VfTk9ERV9TSVpFICsgNCAqIDQ7CisJCWlmIChsaW5lRW5kVGFibGUgIT0gbnVsbCkgeworCQkJc2l6ZSArPSBIRUFERVJTICsgNCAqIGxpbmVFbmRUYWJsZS5sZW5ndGg7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKG9wdGlvbmFsUGFja2FnZURlY2xhcmF0aW9uID09IG51bGwgPyAwIDogZ2V0UGFja2FnZSgpLnRyZWVTaXplKCkpCisJCQkrIGltcG9ydHMubGlzdFNpemUoKQorCQkJKyB0eXBlcy5saXN0U2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTUyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU291cmNlVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworY2xhc3MgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIgZXh0ZW5kcyBDb21waWxlciB7CisJCisJLyoqCisJICogQW5zd2VyIGEgbmV3IENvbXBpbGF0aW9uVW5pdFZpc2l0b3IgdXNpbmcgdGhlIGdpdmVuIG5hbWUgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIG9wdGlvbnMuCisJICogVGhlIGVudmlyb25tZW50IGFuZCBvcHRpb25zIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBpbGVyLgorCSAqIFdoZW4gdGhlIGNvbXBpbGVyIGlzIHJ1biwgY29tcGlsYXRpb24gcmVzdWx0cyBhcmUgc2VudCB0byB0aGUgZ2l2ZW4gcmVxdWVzdG9yLgorCSAqCisJICogIEBwYXJhbSBlbnZpcm9ubWVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLmVudi5JTmFtZUVudmlyb25tZW50CisJICogICAgICBFbnZpcm9ubWVudCB1c2VkIGJ5IHRoZSBjb21waWxlciBpbiBvcmRlciB0byByZXNvbHZlIHR5cGUgYW5kIHBhY2thZ2UKKwkgKiAgICAgIG5hbWVzLiBUaGUgbmFtZSBlbnZpcm9ubWVudCBpbXBsZW1lbnRzIHRoZSBhY3R1YWwgY29ubmVjdGlvbiBvZiB0aGUgY29tcGlsZXIKKwkgKiAgICAgIHRvIHRoZSBvdXRzaWRlIHdvcmxkIChlLmcuIGluIGJhdGNoIG1vZGUgdGhlIG5hbWUgZW52aXJvbm1lbnQgaXMgcGVyZm9ybWluZworCSAqICAgICAgcHVyZSBmaWxlIGFjY2Vzc2VzLCByZXVzZSBwcmV2aW91cyBidWlsZCBzdGF0ZSBvciBjb25uZWN0aW9uIHRvIHJlcG9zaXRvcmllcykuCisJICogICAgICBOb3RlOiB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBhY3R1YWwgY2xhc3NwYXRoCisJICogICAgICAgICAgICBydWxlcy4KKwkgKgorCSAqICBAcGFyYW0gcG9saWN5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5JRXJyb3JIYW5kbGluZ1BvbGljeQorCSAqICAgICAgQ29uZmlndXJhYmxlIHBhcnQgZm9yIHByb2JsZW0gaGFuZGxpbmcsIGFsbG93aW5nIHRoZSBjb21waWxlciBjbGllbnQgdG8KKwkgKiAgICAgIHNwZWNpZnkgdGhlIHJ1bGVzIGZvciBoYW5kbGluZyBwcm9ibGVtcyAoc3RvcCBvbiBmaXJzdCBlcnJvciBvciBhY2N1bXVsYXRlCisJICogICAgICB0aGVtIGFsbCkgYW5kIGF0IHRoZSBzYW1lIHRpbWUgcGVyZm9ybSBzb21lIGFjdGlvbnMgc3VjaCBhcyBvcGVuaW5nIGEgZGlhbG9nCisJICogICAgICBpbiBVSSB3aGVuIGNvbXBpbGluZyBpbnRlcmFjdGl2ZWx5LgorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcworCSAqIAorCSAqCUBwYXJhbSBzZXR0aW5ncyBUaGUgc2V0dGluZ3MgdG8gdXNlIGZvciB0aGUgcmVzb2x1dGlvbi4KKwkgKiAgICAgIAorCSAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuSUNvbXBpbGVyUmVxdWVzdG9yCisJICogICAgICBDb21wb25lbnQgd2hpY2ggd2lsbCByZWNlaXZlIGFuZCBwZXJzaXN0IGFsbCBjb21waWxhdGlvbiByZXN1bHRzIGFuZCBpcyBpbnRlbmRlZAorCSAqICAgICAgdG8gY29uc3VtZSB0aGVtIGFzIHRoZXkgYXJlIHByb2R1Y2VkLiBUeXBpY2FsbHksIGluIGEgYmF0Y2ggY29tcGlsZXIsIGl0IGlzIAorCSAqICAgICAgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgb3V0IHRoZSBhY3R1YWwgLmNsYXNzIGZpbGVzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKwkgKiAgICAgIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5Db21waWxhdGlvblJlc3VsdAorCSAqCisJICogIEBwYXJhbSBwcm9ibGVtRmFjdG9yeSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uSVByb2JsZW1GYWN0b3J5CisJICogICAgICBGYWN0b3J5IHVzZWQgaW5zaWRlIHRoZSBjb21waWxlciB0byBjcmVhdGUgcHJvYmxlbSBkZXNjcmlwdG9ycy4gSXQgYWxsb3dzIHRoZQorCSAqICAgICAgY29tcGlsZXIgY2xpZW50IHRvIHN1cHBseSBpdHMgb3duIHJlcHJlc2VudGF0aW9uIG9mIGNvbXBpbGF0aW9uIHByb2JsZW1zIGluCisJICogICAgICBvcmRlciB0byBhdm9pZCBvYmplY3QgY29udmVyc2lvbnMuIE5vdGUgdGhhdCB0aGUgZmFjdG9yeSBpcyBub3Qgc3VwcG9zZWQKKwkgKiAgICAgIHRvIGFjY3VtdWxhdGUgdGhlIGNyZWF0ZWQgcHJvYmxlbXMsIHRoZSBjb21waWxlciB3aWxsIGdhdGhlciB0aGVtIGFsbCBhbmQgaGFuZAorCSAqICAgICAgdGhlbSBiYWNrIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0LgorCSAqLworCXB1YmxpYyBDb21waWxhdGlvblVuaXRSZXNvbHZlcigKKwkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwKKwkJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAorCQlNYXAgc2V0dGluZ3MsCisJCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsCisJCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgeworCisJCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIHNldHRpbmdzLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5LCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQWRkIGFkZGl0aW9uYWwgc291cmNlIHR5cGVzCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9CisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZXNbMF0uZ2V0RmlsZU5hbWUoKSwgMSwgMSwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCS8vIG5lZWQgdG8gaG9sZCBvbnRvIHRoaXMKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAorCQkJCXNvdXJjZVR5cGVzLAorCQkJCXRydWUsCisJCQkJdHJ1ZSwKKwkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCisJCQkJcmVzdWx0KTsKKworCQlpZiAodW5pdCAhPSBudWxsKSB7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOworCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0LCB0cnVlKTsKKwkJfQorCX0KKworCS8qCisJICogIExvdy1sZXZlbCBBUEkgcGVyZm9ybWluZyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBnZXRIYW5kbGluZ1BvbGljeSgpIHsKKworCQkvLyBwYXNzZXMgdGhlIGluaXRpYWwgc2V0IG9mIGZpbGVzIHRvIHRoZSBiYXRjaCBvcmFjbGUgKHRvIGF2b2lkIGZpbmRpbmcgbW9yZSB0aGFuIG9uY2UgdGhlIHNhbWUgdW5pdHMgd2hlbiBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoKQkKKwkJcmV0dXJuIG5ldyBJRXJyb3JIYW5kbGluZ1BvbGljeSgpIHsKKwkJCXB1YmxpYyBib29sZWFuIHN0b3BPbkZpcnN0RXJyb3IoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcHVibGljIGJvb2xlYW4gcHJvY2VlZE9uRXJyb3JzKCkgeworCQkJCXJldHVybiBmYWxzZTsgLy8gc3RvcCBpZiB0aGVyZSBhcmUgc29tZSBlcnJvcnMgCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBJTmFtZUVudmlyb25tZW50IGdldE5hbWVFbnZpcm9ubWVudChJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgc291cmNlVW5pdC5nZXRKYXZhUHJvamVjdCgpKQorCQkJLmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIElOYW1lRW52aXJvbm1lbnQgZ2V0TmFtZUVudmlyb25tZW50KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiAoU2VhcmNoYWJsZUVudmlyb25tZW50KSAoKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCkKKwkJCS5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJfQorCQorCS8qCisJICogQW5zd2VyIHRoZSBjb21wb25lbnQgdG8gd2hpY2ggd2lsbCBiZSBoYW5kZWQgYmFjayBjb21waWxhdGlvbiByZXN1bHRzIGZyb20gdGhlIGNvbXBpbGVyCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBJQ29tcGlsZXJSZXF1ZXN0b3IgZ2V0UmVxdWVzdG9yKCkgeworCQlyZXR1cm4gbmV3IElDb21waWxlclJlcXVlc3RvcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVzb2x2ZSgKKwkJSUNvbXBpbGF0aW9uVW5pdCB1bml0RWxlbWVudCwKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJY2hhcltdIGZpbGVOYW1lID0gdW5pdEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQlDb21waWxhdGlvblVuaXRSZXNvbHZlciBjb21waWxhdGlvblVuaXRWaXNpdG9yID0KKwkJCW5ldyBDb21waWxhdGlvblVuaXRSZXNvbHZlcigKKwkJCQlnZXROYW1lRW52aXJvbm1lbnQodW5pdEVsZW1lbnQpLAorCQkJCWdldEhhbmRsaW5nUG9saWN5KCksCisJCQkJSmF2YUNvcmUuZ2V0T3B0aW9ucygpLAorCQkJCWdldFJlcXVlc3RvcigpLAorCQkJCWdldFByb2JsZW1GYWN0b3J5KGZpbGVOYW1lLCB2aXNpdG9yKSk7CisKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisKKwkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpdW5pdEVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOworCQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IG51bGw7CisJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpeworCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCX0KKwkJCQorCQkJdW5pdCA9CisJCQkJY29tcGlsYXRpb25Vbml0VmlzaXRvci5yZXNvbHZlKAorCQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQkJCQl1bml0RWxlbWVudC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpLAorCQkJCQkJZXhwZWN0ZWRQYWNrYWdlTmFtZSwKKwkJCQkJCW5ldyBTdHJpbmcoZmlsZU5hbWUpLAorCQkJCQkJZW5jb2RpbmcpKTsKKwkJCXJldHVybiB1bml0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2UoY2hhcltdIHNvdXJjZSkgeworCQlpZiAoc291cmNlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpOworCQlQYXJzZXIgcGFyc2VyID0KKwkJCW5ldyBQYXJzZXIoCisJCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKKwkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAorCQkJCQljb21waWxlck9wdGlvbnMsIAorCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSwKKwkJCWZhbHNlLAorCQkJY29tcGlsZXJPcHRpb25zLmFzc2VydE1vZGUpOworCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IAorCQkJbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQoCisJCQkJc291cmNlLCAKKwkJCQkiIiwgLy8kTk9OLU5MUy0xJAorCQkJCWNvbXBpbGVyT3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIGNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpKTsKKwkJCisJCWlmIChjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5pZ25vcmVNZXRob2RCb2RpZXMpIHsKKwkJCWNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKKwkJCS8vIGlmIGluaXRpYWwgZGlldCBwYXJzZSBkaWQgbm90IHdvcmssIG5vIG5lZWQgdG8gZGlnIGludG8gbWV0aG9kIGJvZGllcy4KKwkJCXJldHVybiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsgCisJCX0KKwkJCisJCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAorCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4KKwkJcGFyc2VyLnNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKKwkJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCQl0eXBlc1tpXS5wYXJzZU1ldGhvZChwYXJzZXIsIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKTsKKwkJfQorCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBJUHJvYmxlbUZhY3RvcnkgZ2V0UHJvYmxlbUZhY3RvcnkoZmluYWwgY2hhcltdIGZpbGVOYW1lLCBmaW5hbCBJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yKSB7CisKKwkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkgeworCQkJcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJCQkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCisJCQkJaW50IHByb2JsZW1JZCwKKwkJCQlTdHJpbmdbXSBhcmd1bWVudHMsCisJCQkJaW50IHNldmVyaXR5LAorCQkJCWludCBzdGFydFBvc2l0aW9uLAorCQkJCWludCBlbmRQb3NpdGlvbiwKKwkJCQlpbnQgbGluZU51bWJlcikgeworCisJCQkJSVByb2JsZW0gcHJvYmxlbSA9CisJCQkJCXN1cGVyLmNyZWF0ZVByb2JsZW0oCisJCQkJCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCQkJCQkJcHJvYmxlbUlkLAorCQkJCQkJYXJndW1lbnRzLAorCQkJCQkJc2V2ZXJpdHksCisJCQkJCQlzdGFydFBvc2l0aW9uLAorCQkJCQkJZW5kUG9zaXRpb24sCisJCQkJCQlsaW5lTnVtYmVyKTsKKwkJCQkvLyBvbmx5IGNvbnNpZGVyIHByb2JsZW1zIGFzc29jaWF0ZWQgd2l0aCByZXNvbHZlZCBmaWxlCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG9yaWdpbmF0aW5nRmlsZU5hbWUsIGZpbGVOYW1lKSl7CisJCQkJCXZpc2l0b3IuYWNjZXB0UHJvYmxlbShwcm9ibGVtKTsKKwkJCQl9CisJCQkJcmV0dXJuIHByb2JsZW07CisJCQl9CisJCX07CisJfQorCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXNvbHZlKAorCQljaGFyW10gc291cmNlLAorCQlTdHJpbmcgdW5pdE5hbWUsCisJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKKwkJSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCisJCUNvbXBpbGF0aW9uVW5pdFJlc29sdmVyIGNvbXBpbGF0aW9uVW5pdFZpc2l0b3IgPQorCQkJbmV3IENvbXBpbGF0aW9uVW5pdFJlc29sdmVyKAorCQkJCWdldE5hbWVFbnZpcm9ubWVudChqYXZhUHJvamVjdCksCisJCQkJZ2V0SGFuZGxpbmdQb2xpY3koKSwKKwkJCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCisJCQkJZ2V0UmVxdWVzdG9yKCksCisJCQkJZ2V0UHJvYmxlbUZhY3RvcnkodW5pdE5hbWUudG9DaGFyQXJyYXkoKSwgdmlzaXRvcikpOworCQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSBudWxsOworCQorCQkJdW5pdCA9CisJCQkJY29tcGlsYXRpb25Vbml0VmlzaXRvci5yZXNvbHZlKAorCQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoc291cmNlLCBleHBlY3RlZFBhY2thZ2VOYW1lLCB1bml0TmFtZSwgZW5jb2RpbmcpKTsKKwkJCXJldHVybiB1bml0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJfQorCQl9CisJfQkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEwZDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBDb25kaXRpb25hbEV4cHJlc3Npb246CisgKiAgICBFeHByZXNzaW9uIDxiPj88L2I+IEV4cHJlc3Npb24gPGI+OjwvYj4gRXhwcmVzc2lvbgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCQorCS8qKgorCSAqIFRoZSBjb25kaXRpb24gZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIGV4cHJlc3Npb24uCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNvbmRpdGlvbkV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlICJ0aGVuIiBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLAorCSAqIGJ1dCBsZWdhbCwgZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gdGhlbkV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlICJlbHNlIiBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLAorCSAqIGJ1dCBsZWdhbCwgZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZWxzZUV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgY29uZGl0aW9uLCAidGhlbiIsIGFuZCAiZWxzZSIgZXhwcmVzc3Npb25zIGFyZQorCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUNvbmRpdGlvbmFsRXhwcmVzc2lvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIENPTkRJVElPTkFMX0VYUFJFU1NJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgQ29uZGl0aW9uYWxFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRUaGVuRXhwcmVzc2lvbigKKwkJCShFeHByZXNzaW9uKSBnZXRUaGVuRXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0RWxzZUV4cHJlc3Npb24oCisJCQkoRXhwcmVzc2lvbikgZ2V0RWxzZUV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFRoZW5FeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RWxzZUV4cHJlc3Npb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZGl0aW9uIG9mIHRoaXMgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlpZiAoY29uZGl0aW9uRXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGNvbmRpdGlvbkV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGNvbmRpdGlvbiBvZiB0aGlzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGNvbmRpdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBDb25kaXRpb25hbEV4cHJlc3Npb24gbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uCisJCS8vIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLmNvbmRpdGlvbkV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLmNvbmRpdGlvbkV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAidGhlbiIgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgInRoZW4iIGV4cHJlc3Npb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRUaGVuRXhwcmVzc2lvbigpIHsKKwkJaWYgKHRoZW5FeHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFRoZW5FeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIHRoZW5FeHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSAidGhlbiIgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlICJ0aGVuIiBleHByZXNzaW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFRoZW5FeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBDb25kaXRpb25hbEV4cHJlc3Npb24gbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uCisJCS8vIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLnRoZW5FeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy50aGVuRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlICJlbHNlIiBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RWxzZUV4cHJlc3Npb24oKSB7CisJCWlmIChlbHNlRXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRFbHNlRXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBlbHNlRXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSAiZWxzZSIgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFbHNlRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgQ29uZGl0aW9uYWxFeHByZXNzaW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbgorCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5lbHNlRXhwcmVzc2lvbiwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMuZWxzZUV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrIChjb25kaXRpb25FeHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCisJCQkrICh0aGVuRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldFRoZW5FeHByZXNzaW9uKCkudHJlZVNpemUoKSkKKwkJCSsgKGVsc2VFeHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RWxzZUV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc3NDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbHRlcm5hdGUgY29uc3RydWN0b3IgaW52b2NhdGlvbiBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIENvbnN0cnVjdG9ySW52b2NhdGlvbjoKKyAqCQk8Yj50aGlzPC9iPiA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj4sPC9iPiBFeHByZXNzaW9uIH0gXSA8Yj4pPC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIENvbnN0cnVjdG9ySW52b2NhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLyoqCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCisJICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBFeHByZXNzaW9uLmNsYXNzKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIGFsdGVybmF0ZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudAorCSAqIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlDb25zdHJ1Y3Rvckludm9jYXRpb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOwkKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gQ09OU1RSVUNUT1JfSU5WT0NBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3Rvckludm9jYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuYXJndW1lbnRzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgYXJndW1lbnRzKCkpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyBpbiB0aGlzIGFsdGVybmF0ZQorCSAqIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgYXJndW1lbnRzKCkgeworCQlyZXR1cm4gYXJndW1lbnRzOworCX0KKworCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgY29uc3RydWN0b3IgaW52b2tlZCBieSB0aGlzCisJICogZXhwcmVzc2lvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZworCSAqICAgIGNhbm5vdCBiZSByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUNvbnN0cnVjdG9yQmluZGluZygpIHsKKwkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVDb25zdHJ1Y3Rvcih0aGlzKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyBhcmd1bWVudHMubGlzdFNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmY1MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db250aW51ZVN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBDb250aW51ZSBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogQ29udGludWVTdGF0ZW1lbnQ6CisgKiAgICA8Yj5jb250aW51ZTwvYj4gWyBJZGVudGlmaWVyIF0gPGI+OzwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCQkKKwkvKioKKwkgKiBUaGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmU7IG5vbmUgYnkgZGVmYXVsdC4KKwkgKi8KKwlwcml2YXRlIFNpbXBsZU5hbWUgb3B0aW9uYWxMYWJlbCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgY29udGludWUgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGNvbnRpbnVlIHN0YXRlbWVudCBoYXMgbm8gbGFiZWwuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUNvbnRpbnVlU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gQ09OVElOVUVfU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlDb250aW51ZVN0YXRlbWVudCByZXN1bHQgPSBuZXcgQ29udGludWVTdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0TGFiZWwoKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRMYWJlbCgpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldExhYmVsKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoaXMgY29udGludWUgc3RhdGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBvcHRpb25hbExhYmVsOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgbGFiZWwgb2YgdGhpcyBjb250aW51ZSBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TGFiZWwoU2ltcGxlTmFtZSBsYWJlbCkgeworCQkvLyBhIENvbnRpbnVlU3RhdGVtZW50IGNhbm5vdCBvY2N1ciBpbnNpZGUgYSBTaW1wbGVOYW1lIC0gbm8gY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wdGlvbmFsTGFiZWwsIGxhYmVsLCBmYWxzZSk7CisJCXRoaXMub3B0aW9uYWxMYWJlbCA9IGxhYmVsOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChvcHRpb25hbExhYmVsID09IG51bGwgPyAwIDogZ2V0TGFiZWwoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiMDJmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsOTkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNoYXJMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GYWxzZUxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFN1cGVyUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhpc1JlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRydWVMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogSW50ZXJuYWwgY2xhc3MgZm9yIHJlc29sdmluZyBiaW5kaW5ncyB1c2luZyBvbGQgQVNUcy4KKyAqLworY2xhc3MgRGVmYXVsdEJpbmRpbmdSZXNvbHZlciBleHRlbmRzIEJpbmRpbmdSZXNvbHZlciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NUUklOR0JVRkZFUiA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiU3RyaW5nQnVmZmVyIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0VYQ0VQVElPTiA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiRXhjZXB0aW9uIi50b0NoYXJBcnJheSgpfTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUgY29ycmVzcG9uZGFuY2UgYmV0d2VlbiBuZXcgYmluZGluZ3MgYW5kIHRoZSAKKwkgKiBjb21waWxlciBiaW5kaW5ncy4gVGhpcyBpcyBhbiBpZGVudGl0eSBtYXAuIFdlIHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgb2JqZWN0CisJICogZm9yIG9uZSBiaW5kaW5nLgorCSAqLworCU1hcCBjb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5nczsKKwkKKwkvKioKKwkgKiBUaGlzIG1hcCBpcyB1c2VkIHRvIHJldHJpZXZlIGFuIG9sZCBhc3Qgbm9kZSB1c2luZyB0aGUgbmV3IGFzdCBub2RlLiBUaGlzIGlzIG5vdCBhbgorCSAqIGlkZW50aXR5IG1hcC4KKwkgKi8KKwlNYXAgbmV3QXN0VG9PbGRBc3Q7CisJCisJLyoqCisJICogVGhpcyBtYXAgaXMgdXNlZCB0byBnZXQgYW4gYXN0IG5vZGUgZnJvbSBpdHMgYmluZGluZyAobmV3IGJpbmRpbmcpCisJICovCisJTWFwIGJpbmRpbmdzVG9Bc3ROb2RlczsKKwkKKwkvKioKKwkgKiBUaGlzIG1hcCBpcyB1c2VkIHRvIGdldCBhIGJpbmRpbmcgZnJvbSBpdHMgYXN0IG5vZGUKKwkgKi8KKwlNYXAgYXN0Tm9kZXNUb0JpbmRpbmdzOworCQorCS8qKgorCSAqIENvbXBpbGF0aW9uIHVuaXQgc2NvcGUKKwkgKi8KKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlOworCQorCS8qKgorCSAqIENoZWNrIGlmIHRoZSBiaW5kaW5nIHJlc29sdmVyIGhhcyB0byBlbnN1cmUgdGhlIG1vZGlmaWNhdGlvbiBjb3VuZAorCSAqIGRpZG4ndCBjaGFuZ2UKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RpZmljYXRpb25Db3VudDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlEZWZhdWx0QmluZGluZ1Jlc29sdmVyKCkgeworCQljaGVja01vZGlmaWNhdGlvbkNvdW50ID0gZmFsc2U7CisJCXRoaXMubmV3QXN0VG9PbGRBc3QgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLmFzdE5vZGVzVG9CaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0QmluZGluZ1Jlc29sdmVyLgorCSAqLworCURlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwkJdGhpcygpOworCQl0aGlzLnNjb3BlID0gc2NvcGU7CisJfQorCQorCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlJQmluZGluZyByZXNvbHZlTmFtZShOYW1lIG5hbWUpIHsKKwkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IG5hbWUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQVNUTm9kZSBwYXJlbnQgPSBuYW1lLmdldFBhcmVudCgpOworCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgbmFtZS5lcXVhbHMoKChNZXRob2REZWNsYXJhdGlvbikgcGFyZW50KS5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlTWV0aG9kKChNZXRob2REZWNsYXJhdGlvbilwYXJlbnQpOworCQl9CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24gJiYgbmFtZS5lcXVhbHMoKChUeXBlRGVjbGFyYXRpb24pIHBhcmVudCkuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZVR5cGUoKFR5cGVEZWNsYXJhdGlvbilwYXJlbnQpOworCQl9CisJCWlmICgocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbiAmJiBuYW1lLmVxdWFscygoKE1ldGhvZEludm9jYXRpb24pIHBhcmVudCkuZ2V0TmFtZSgpKSkKKwkJCXx8IChwYXJlbnQgaW5zdGFuY2VvZiBTdXBlck1ldGhvZEludm9jYXRpb24gJiYgbmFtZS5lcXVhbHMoKChTdXBlck1ldGhvZEludm9jYXRpb24pIHBhcmVudCkuZ2V0TmFtZSgpKSkpIHsKKwkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JNZXRob2RJbnZvY2F0aW9uKG5hbWUpOworCQl9CisJCWlmICgocGFyZW50IGluc3RhbmNlb2YgRmllbGRBY2Nlc3MgJiYgbmFtZS5lcXVhbHMoKChGaWVsZEFjY2VzcykgcGFyZW50KS5nZXROYW1lKCkpKQorCQkgICB8fCAocGFyZW50IGluc3RhbmNlb2YgU3VwZXJGaWVsZEFjY2VzcyAmJiBuYW1lLmVxdWFscygoKFN1cGVyRmllbGRBY2Nlc3MpIHBhcmVudCkuZ2V0TmFtZSgpKSkpIHsKKwkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JGaWVsZEFjY2VzcyhuYW1lKTsKKwkJfQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uICYmIG5hbWUuZXF1YWxzKCgoUGFja2FnZURlY2xhcmF0aW9uKSBwYXJlbnQpLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JQYWNrYWdlRGVjbGFyYXRpb24obmFtZSk7CisJCX0KKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNpbXBsZVR5cGUgJiYgbmFtZS5lcXVhbHMoKChTaW1wbGVUeXBlKSBwYXJlbnQpLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVUeXBlKG5hbWUpOworCQl9CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUaGlzRXhwcmVzc2lvbikgeworCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclRoaXNFeHByZXNzaW9uKG5hbWUpOworCQl9CisJCWlmIChuYW1lIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgeworCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclF1YWxpZmllZE5hbWUobmFtZSk7CisJCX0KKwkJaWYgKG5hbWUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKSB7CisJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShuYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIucmVzb2x2ZU5hbWUobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yUGFja2FnZURlY2xhcmF0aW9uKE5hbWUgbmFtZSkgeworCQlQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gKFBhY2thZ2VEZWNsYXJhdGlvbikgbmFtZS5nZXRQYXJlbnQoKTsKKwkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBwYWNrYWdlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7CisJCUxpc3QgdHlwZXMgPSB1bml0LnR5cGVzKCk7CisJCWlmICh0eXBlcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIHN1cGVyLnJlc29sdmVOYW1lKG5hbWUpOworCQl9CisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOworCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7CisJCXJldHVybiB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7CisJfQorCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlJVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoVHlwZSB0eXBlKSB7CisJCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSB0eXBlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIHJldHJpZXZlIHRoZSBvbGQgYXN0IG5vZGUKKwkJaW50IGluZGV4ID0gMDsKKwkJQVNUTm9kZSBwYXJlbnRUeXBlID0gdHlwZS5nZXRQYXJlbnQoKTsKKwkJVHlwZSBhcnJheVR5cGUgPSBudWxsOworCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodHlwZSk7CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCWlmIChwYXJlbnRUeXBlIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbikgeworCQkJCW5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQocGFyZW50VHlwZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdlIHRyeSB0byByZXRyaWV2ZSB0aGUgdHlwZSBhcyBhbiBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXkgdHlwZQorCQkJCXdoaWxlICgocGFyZW50VHlwZSBpbnN0YW5jZW9mIFR5cGUpICYmICgoVHlwZSkgcGFyZW50VHlwZSkuaXNBcnJheVR5cGUoKSkgeworCQkJCQlhcnJheVR5cGUgPSAoVHlwZSkgcGFyZW50VHlwZTsKKwkJCQkJcGFyZW50VHlwZSA9IHBhcmVudFR5cGUuZ2V0UGFyZW50KCk7CisJCQkJCWluZGV4Kys7CisJCQkJfQorCQkJCWlmIChpbmRleCAhPSAwKSB7CisJCQkJCW5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoYXJyYXlUeXBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CisJCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpIG5vZGU7CisJCQkJaWYgKHR5cGVSZWZlcmVuY2UuYmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHR5cGVSZWZlcmVuY2UuYmluZGluZyk7CisJCQkJaWYgKGluZGV4ICE9IDApIHsKKwkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgeworCQkJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpdHlwZVJlZmVyZW5jZS5iaW5kaW5nOworCQkJCQkJaWYgKGluZGV4ID09IGFycmF5QmluZGluZy5kaW1lbnNpb25zKSB7CisJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisJCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQkJCUFycmF5VHlwZSBhcnJheSA9IChBcnJheVR5cGUpIHR5cGU7CisJCQkJCQlpZiAodHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpICE9IGFycmF5LmdldERpbWVuc2lvbnMoKSkgeworCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXR5cGVSZWZlcmVuY2UuYmluZGluZzsKKwkJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpIC0gYXJyYXkuZ2V0RGltZW5zaW9ucygpOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQkJYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYXJyYXlCaW5kaW5nLmVsZW1lbnRzVHlwZSh0aGlzLnNjb3BlKTsKKwkJCQkJCQl9CisJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmICh0eXBlQmluZGluZy5pc0FycmF5KCkgJiYgdHlwZS5pc1NpbXBsZVR5cGUoKSkgeworCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKChBcnJheUJpbmRpbmcpdHlwZVJlZmVyZW5jZS5iaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQkJfQorCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJCVNpbmdsZU5hbWVSZWZlcmVuY2Ugc2luZ2xlTmFtZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBub2RlOworCQkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJaWYgKHNpbmdsZU5hbWVSZWZlcmVuY2UuaXNUeXBlUmVmZXJlbmNlKCkpIHsKKwkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZygoUmVmZXJlbmNlQmluZGluZylzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmcpOworCQkJCQlpZiAoaW5kZXggIT0gMCkgeworCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgeworCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXNpbmdsZU5hbWVSZWZlcmVuY2UuYmluZGluZzsKKwkJCQkJCQlpZiAoaW5kZXggPT0gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnMpIHsKKwkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKKwkJCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gaXQgc2hvdWxkIGJlIGEgdHlwZSByZWZlcmVuY2UKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBub2RlOworCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7CisJCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZygoUmVmZXJlbmNlQmluZGluZylxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmcpOworCQkJCQlpZiAoaW5kZXggIT0gMCkgeworCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgeworCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXF1YWxpZmllZE5hbWVSZWZlcmVuY2UuYmluZGluZzsKKwkJCQkJCQlpZiAoaW5kZXggPT0gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnMpIHsKKwkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKKwkJCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBpdCBzaG91bGQgYmUgYSB0eXBlIHJlZmVyZW5jZQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQkJQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uID0gKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pIG5vZGU7CisJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uYXJyYXlUYjsKKwkJCQlpZiAoYXJyYXlCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCWlmIChpbmRleCAhPSAwKSB7CisJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuY3JlYXRlQXJyYXkoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlLCBhcnJheUJpbmRpbmcuZGltZW5zaW9ucyAtIGluZGV4KSk7CisJCQkJfSAKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhhcnJheUJpbmRpbmcpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCisJICovCisJSVR5cGVCaW5kaW5nIHJlc29sdmVXZWxsS25vd25UeXBlKFN0cmluZyBuYW1lKSB7CisJCWlmICgoImJvb2xlYW4iLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoImNoYXIiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoImJ5dGUiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoInNob3J0Ii5lcXVhbHMobmFtZSkpLy8kTk9OLU5MUy0xJAorCQkJfHwgKCJpbnQiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoImxvbmciLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoImZsb2F0Ii5lcXVhbHMobmFtZSkpLy8kTk9OLU5MUy0xJAorCQkJfHwgKCJkb3VibGUiLmVxdWFscyhuYW1lKSkvLyROT04tTkxTLTEkCisJCQl8fCAoInZvaWQiLmVxdWFscyhuYW1lKSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEJhc2VUeXBlKG5hbWUudG9DaGFyQXJyYXkoKSkpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCkpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nU3RyaW5nKCkpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoSkFWQV9MQU5HX1NUUklOR0JVRkZFUikpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuVGhyb3dhYmxlIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCkpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuRXhjZXB0aW9uIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldFR5cGUoSkFWQV9MQU5HX0VYQ0VQVElPTikpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1J1bnRpbWVFeGNlcHRpb24oKSk7CisJCX0gZWxzZSBpZiAoImphdmEubGFuZy5FcnJvciIuZXF1YWxzKG5hbWUpKSB7Ly8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ0Vycm9yKCkpOworCQl9IGVsc2UgaWYgKCJqYXZhLmxhbmcuQ2xhc3MiLmVxdWFscyhuYW1lKSkgey8vJE5PTi1OTFMtMSQgCisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKSk7CisJICAgIH0gZWxzZSB7CisJCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVdlbGxLbm93blR5cGUobmFtZSk7CisJCX0KKwl9CisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZSkgeworCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gdHlwZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHR5cGUpOworCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOworCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHR5cGVCaW5kaW5nLCB0eXBlKTsKKwkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJfQorCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVR5cGUodHlwZSk7CisJfQorCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlJTWV0aG9kQmluZGluZyByZXNvbHZlTWV0aG9kKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCkgeworCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gbWV0aG9kLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobWV0aG9kKTsKKwkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSB0aGlzLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQobWV0aG9kQmluZGluZywgbWV0aG9kKTsKKwkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlTWV0aG9kKG1ldGhvZCk7CisJfQorCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlJVmFyaWFibGVCaW5kaW5nIHJlc29sdmVWYXJpYWJsZShWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlKSB7CisJCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSB2YXJpYWJsZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodmFyaWFibGUpOworCQlpZiAoYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24pIGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbjsKKwkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKKwkJCXJldHVybiB2YXJpYWJsZUJpbmRpbmc7CisJCX0KKwkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZygoKExvY2FsRGVjbGFyYXRpb24pIGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikuYmluZGluZyk7CisJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKKwkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzsKKwl9CisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCUlWYXJpYWJsZUJpbmRpbmcgcmVzb2x2ZVZhcmlhYmxlKEZpZWxkRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKKwkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IHZhcmlhYmxlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodmFyaWFibGUpOworCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKGZpZWxkRGVjbGFyYXRpb24uYmluZGluZyk7CisJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKKwkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzsKKwl9CisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCUlUeXBlQmluZGluZyByZXNvbHZlRXhwcmVzc2lvblR5cGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSBleHByZXNzaW9uLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSB7CisJCQlBc3ROb2RlIGFzdE5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSBhc3ROb2RlOworCQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHR5cGVCaW5kaW5nLCBleHByZXNzaW9uKTsKKwkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gc2hvdWxkIGJlIGFuIEFsbG9jYXRpb25FeHByZXNzaW9uCisJCQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NhdGlvbkV4cHJlc3Npb24gPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7CisJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHRoaXMuZ2V0TWV0aG9kQmluZGluZyhhbGxvY2F0aW9uRXhwcmVzc2lvbi5iaW5kaW5nKTsKKwkJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBOYW1lKSB7CisJCQlJQmluZGluZyBiaW5kaW5nID0gdGhpcy5yZXNvbHZlTmFtZSgoTmFtZSkgZXhwcmVzc2lvbik7CisJCQlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlzd2l0Y2goYmluZGluZy5nZXRLaW5kKCkpIHsKKwkJCQljYXNlIElCaW5kaW5nLlRZUEUgOgorCQkJCQlyZXR1cm4gKElUeXBlQmluZGluZykgYmluZGluZzsKKwkJCQljYXNlIElCaW5kaW5nLlZBUklBQkxFIDoKKwkJCQkJcmV0dXJuICgoSVZhcmlhYmxlQmluZGluZykgYmluZGluZykuZ2V0VHlwZSgpOworCQkJfQorCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUluaXRpYWxpemVyKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5SW5pdGlhbGl6ZXIgb2xkQXN0ID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlJbml0aWFsaXplcikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlpZiAob2xkQXN0ID09IG51bGwgfHwgb2xkQXN0LmJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBzdXBlci5yZXNvbHZlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbik7CisJCQl9CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhvbGRBc3QuYmluZGluZyk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5Q3JlYXRpb24pIHsKKwkJCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiA9IChBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uYXJyYXlUYik7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKKwkJCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUV4cHJlc3Npb25UeXBlKGFzc2lnbm1lbnQuZ2V0TGVmdEhhbmRTaWRlKCkpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBQb3N0Zml4RXhwcmVzc2lvbikgeworCQkJUG9zdGZpeEV4cHJlc3Npb24gcG9zdEZpeEV4cHJlc3Npb24gPSAoUG9zdGZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblR5cGUocG9zdEZpeEV4cHJlc3Npb24uZ2V0T3BlcmFuZCgpKTsKKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUHJlZml4RXhwcmVzc2lvbikgeworCQkJUHJlZml4RXhwcmVzc2lvbiBwcmVGaXhFeHByZXNzaW9uID0gKFByZWZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblR5cGUocHJlRml4RXhwcmVzc2lvbi5nZXRPcGVyYW5kKCkpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGNhc3RFeHByZXNzaW9uLmNhc3RUYik7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbCkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlCbG9ja1Njb3BlIGJsb2NrU2NvcGUgPSB0aGlzLnJldHJpZXZlRW5jbG9zaW5nU2NvcGUoZXhwcmVzc2lvbik7CisJCQlpZiAoYmxvY2tTY29wZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoc3RyaW5nTGl0ZXJhbC5saXRlcmFsVHlwZShibG9ja1Njb3BlKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFR5cGVMaXRlcmFsKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJvb2xlYW5MaXRlcmFsKSB7CisJCQlCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IChCb29sZWFuTGl0ZXJhbCkgZXhwcmVzc2lvbjsKKwkJCWlmIChib29sZWFuTGl0ZXJhbC5ib29sZWFuVmFsdWUoKSkgeworCQkJCVRydWVMaXRlcmFsIHRydWVMaXRlcmFsID0gKFRydWVMaXRlcmFsKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChib29sZWFuTGl0ZXJhbCk7CisJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodHJ1ZUxpdGVyYWwubGl0ZXJhbFR5cGUobnVsbCkpOworCQkJfSBlbHNlIHsKKwkJCQlGYWxzZUxpdGVyYWwgZmFsc2VMaXRlcmFsID0gKEZhbHNlTGl0ZXJhbCkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoYm9vbGVhbkxpdGVyYWwpOworCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGZhbHNlTGl0ZXJhbC5saXRlcmFsVHlwZShudWxsKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk51bGxMaXRlcmFsIG51bGxMaXRlcmFsID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTnVsbExpdGVyYWwpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcobnVsbExpdGVyYWwubGl0ZXJhbFR5cGUobnVsbCkpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDaGFyYWN0ZXJMaXRlcmFsKSB7CisJCQlDaGFyTGl0ZXJhbCBjaGFyTGl0ZXJhbCA9IChDaGFyTGl0ZXJhbCkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhjaGFyTGl0ZXJhbC5saXRlcmFsVHlwZShudWxsKSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE51bWJlckxpdGVyYWwpIHsKKwkJCUxpdGVyYWwgbGl0ZXJhbCA9IChMaXRlcmFsKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGxpdGVyYWwubGl0ZXJhbFR5cGUobnVsbCkpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pIHsKKwkJCU9wZXJhdG9yRXhwcmVzc2lvbiBvcGVyYXRvckV4cHJlc3Npb24gPSAoT3BlcmF0b3JFeHByZXNzaW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKG9wZXJhdG9yRXhwcmVzc2lvbi50eXBlQmluZGluZyk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEluc3RhbmNlb2ZFeHByZXNzaW9uKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lkluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoaW5zdGFuY2VPZkV4cHJlc3Npb24udHlwZUJpbmRpbmcpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBGaWVsZEFjY2VzcykgeworCQkJRmllbGRSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2UgPSAoRmllbGRSZWZlcmVuY2UpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOworCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZFJlZmVyZW5jZS5iaW5kaW5nKTsKKwkJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgU3VwZXJGaWVsZEFjY2VzcykgeworCQkJRmllbGRSZWZlcmVuY2UgZmllbGRSZWZlcmVuY2UgPSAoRmllbGRSZWZlcmVuY2UpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOworCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZFJlZmVyZW5jZS5iaW5kaW5nKTsKKwkJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlBY2Nlc3MpIHsKKwkJCUFycmF5UmVmZXJlbmNlIGFycmF5UmVmZXJlbmNlID0gKEFycmF5UmVmZXJlbmNlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5UmVmZXJlbmNlLmFycmF5RWxlbWVudEJpbmRpbmcpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBUaGlzRXhwcmVzc2lvbikgeworCQkJVGhpc1JlZmVyZW5jZSB0aGlzUmVmZXJlbmNlID0gKFRoaXNSZWZlcmVuY2UpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOworCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gdGhpcy5yZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKGV4cHJlc3Npb24pOworCQkJaWYgKGJsb2NrU2NvcGUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpc1JlZmVyZW5jZS5yZXNvbHZlVHlwZShibG9ja1Njb3BlKSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pIHsKKwkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSAgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gdGhpcy5nZXRNZXRob2RCaW5kaW5nKG1lc3NhZ2VTZW5kLmJpbmRpbmcpOworCQkJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB7CisJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVFeHByZXNzaW9uVHlwZShwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkpOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhjb25kaXRpb25hbEV4cHJlc3Npb24udHlwZUJpbmRpbmcpOworCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbik7CisJfQorCisJLyoKKwkgKiBAc2VlIEJpbmRpbmdSZXNvbHZlciNyZXNvbHZlSW1wb3J0KEltcG9ydERlY2xhcmF0aW9uKQorCSAqLworCUlCaW5kaW5nIHJlc29sdmVJbXBvcnQoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24pIHsKKwkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IGltcG9ydERlY2xhcmF0aW9uLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChpbXBvcnREZWNsYXJhdGlvbik7CisJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7CisJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgbm9kZTsKKwkJCWlmIChpbXBvcnRSZWZlcmVuY2Uub25EZW1hbmQpIHsKKwkJCQlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShpbXBvcnRSZWZlcmVuY2UudG9rZW5zLCAwLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zLmxlbmd0aCkpOworCQkJCWlmICgoYmluZGluZyAhPSBudWxsKSAmJiAoYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSkgeworCQkJCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHBhY2thZ2VCaW5kaW5nLCBpbXBvcnREZWNsYXJhdGlvbik7CisJCQkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUJpbmRpbmcgYmluZGluZyA9IHRoaXMuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShpbXBvcnRSZWZlcmVuY2UudG9rZW5zKTsKKwkJCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHR5cGVCaW5kaW5nLCBpbXBvcnREZWNsYXJhdGlvbik7CisJCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLnJlc29sdmVJbXBvcnQoaW1wb3J0RGVjbGFyYXRpb24pOworCX0KKworCS8qCisJICogQHNlZSBCaW5kaW5nUmVzb2x2ZXIjcmVzb2x2ZVBhY2thZ2UoUGFja2FnZURlY2xhcmF0aW9uKQorCSAqLworCUlQYWNrYWdlQmluZGluZyByZXNvbHZlUGFja2FnZShQYWNrYWdlRGVjbGFyYXRpb24gcGtnKSB7CisJCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSBwa2cuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHBrZyk7CisJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7CisJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gKEltcG9ydFJlZmVyZW5jZSkgbm9kZTsKKwkJCUJpbmRpbmcgYmluZGluZyA9IHRoaXMuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGltcG9ydFJlZmVyZW5jZS50b2tlbnMsIDAsIGltcG9ydFJlZmVyZW5jZS50b2tlbnMubGVuZ3RoKSk7CisJCQlpZiAoKGJpbmRpbmcgIT0gbnVsbCkgJiYgKGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkpIHsKKwkJCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQocGFja2FnZUJpbmRpbmcsIHBrZyk7CisJCQkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlUGFja2FnZShwa2cpOworCX0KKworCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBmaW5kRGVjbGFyaW5nTm9kZShJQmluZGluZyBiaW5kaW5nKSB7CisJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiAoQVNUTm9kZSkgdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMuZ2V0KGJpbmRpbmcpOworCX0KKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCisJICovCisJdm9pZCBzdG9yZShBU1ROb2RlIG5vZGUsIEFzdE5vZGUgb2xkQVNUTm9kZSkgeworCQl0aGlzLm5ld0FzdFRvT2xkQXN0LnB1dChub2RlLCBvbGRBU1ROb2RlKTsKKwl9CisJCisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCXZvaWQgdXBkYXRlS2V5KEFTVE5vZGUgbm9kZSwgQVNUTm9kZSBuZXdOb2RlKSB7CisJCU9iamVjdCBhc3ROb2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5yZW1vdmUobm9kZSk7CisJCWlmIChhc3ROb2RlICE9IG51bGwpIHsKKwkJCXRoaXMubmV3QXN0VG9PbGRBc3QucHV0KG5ld05vZGUsIGFzdE5vZGUpOworCQl9CisJfQorCQkKKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCisJICovCisJcHJvdGVjdGVkIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJaWYgKHJlZmVyZW5jZUJpbmRpbmcgPT0gbnVsbCB8fCAhcmVmZXJlbmNlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlUeXBlQmluZGluZyBiaW5kaW5nID0gKFR5cGVCaW5kaW5nKSB0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChyZWZlcmVuY2VCaW5kaW5nKTsKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJcmV0dXJuIGJpbmRpbmc7CisJCX0KKwkJYmluZGluZyA9IG5ldyBUeXBlQmluZGluZyh0aGlzLCByZWZlcmVuY2VCaW5kaW5nKTsKKwkJdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQocmVmZXJlbmNlQmluZGluZywgYmluZGluZyk7CisJCXJldHVybiBiaW5kaW5nOworCX0KKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCisJICovCisJcHJvdGVjdGVkIElQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8ICFwYWNrYWdlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJUGFja2FnZUJpbmRpbmcgYmluZGluZyA9IChJUGFja2FnZUJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHBhY2thZ2VCaW5kaW5nKTsKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJcmV0dXJuIGJpbmRpbmc7CisJCX0KKwkJYmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyh0aGlzLCBwYWNrYWdlQmluZGluZyk7CisJCXRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KHBhY2thZ2VCaW5kaW5nLCBiaW5kaW5nKTsKKwkJcmV0dXJuIGJpbmRpbmc7CisJfQorCS8qCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgSVZhcmlhYmxlQmluZGluZyBnZXRWYXJpYWJsZUJpbmRpbmcob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nKSB7CisJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCB8fCAhdmFyaWFibGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlWYXJpYWJsZUJpbmRpbmcgYmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldCh2YXJpYWJsZUJpbmRpbmcpOworCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gYmluZGluZzsKKwkJfQorCQliaW5kaW5nID0gbmV3IFZhcmlhYmxlQmluZGluZyh0aGlzLCB2YXJpYWJsZUJpbmRpbmcpOworCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIGJpbmRpbmcpOworCQlyZXR1cm4gYmluZGluZzsKKwl9CisJCisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCXByb3RlY3RlZCBJTWV0aG9kQmluZGluZyBnZXRNZXRob2RCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwgfHwgIW1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IChJTWV0aG9kQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQobWV0aG9kQmluZGluZyk7CisJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCXJldHVybiBiaW5kaW5nOworCQl9CisJCWJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZyh0aGlzLCBtZXRob2RCaW5kaW5nKTsKKwkJdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQobWV0aG9kQmluZGluZywgYmluZGluZyk7CisJCXJldHVybiBiaW5kaW5nOworCX0KKworCXByaXZhdGUgQmxvY2tTY29wZSByZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKEFTVE5vZGUgbm9kZSkgeworCQlBU1ROb2RlIGN1cnJlbnROb2RlID0gbm9kZTsKKwkJd2hpbGUoY3VycmVudE5vZGUgIT0gbnVsbAorCQkJJiYhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCisJCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpCisJCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKKwkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7CisJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgY3VycmVudE5vZGU7CisJCQl3aGlsZSghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgeworCQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisJCQl9CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoY3VycmVudE5vZGUpOworCQkJaWYgKChpbml0aWFsaXplci5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgeworCQkJCXJldHVybiB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBjdXJyZW50Tm9kZTsKKwkJCXdoaWxlKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pKSB7CisJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChjdXJyZW50Tm9kZSk7CisJCQlpZiAoKGZpZWxkRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIHsKKwkJCQlyZXR1cm4gdHlwZURlY2wuc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHR5cGVEZWNsLmluaXRpYWxpemVyU2NvcGU7CisJCQl9CisJCX0KKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBhYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGN1cnJlbnROb2RlKTsKKwkJcmV0dXJuIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uc2NvcGU7CisJfQkKKwkKKwlwcml2YXRlIElCaW5kaW5nIGludGVybmFsUmVzb2x2ZU5hbWVGb3JRdWFsaWZpZWROYW1lKE5hbWUgbmFtZSkgeworCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgbmFtZTsKKwkJQVNUTm9kZSBwYXJlbnQgPSBxdWFsaWZpZWROYW1lLmdldFBhcmVudCgpOworCQlpbnQgaW5kZXggPSAwOworCQl3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgeworCQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBwYXJlbnQ7CisJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCQlpbmRleCsrOworCQl9CisJCXJldHVybiByZXR1cm5CaW5kaW5nRm9yUXVhbGlmaWVkTmFtZVBhcnQocXVhbGlmaWVkTmFtZSwgaW5kZXgpOworCX0KKworCXByaXZhdGUgSUJpbmRpbmcgcmV0dXJuQmluZGluZ0ZvclF1YWxpZmllZE5hbWVQYXJ0KEFTVE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKKwkJLy8gbm93IHdlIGNhbiByZXRyaWV2ZSB0aGUgY29tcGlsZXIncyBub2RlCisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChwYXJlbnQpOworCQlpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBub2RlOworCQkJaW50IHF1YWxpZmllZE5hbWVMZW5ndGggPSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7CisJCQlpbnQgaW5kZXhJblF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lTGVuZ3RoIC0gaW5kZXg7IC8vIG9uZS1iYXNlZAorCQkJaW50IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9IHF1YWxpZmllZE5hbWVSZWZlcmVuY2UuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOyAvLyBvbmUtYmFzZWQKKwkJCWludCBvdGhlckJpbmRpbmdMZW5ndGggPSBxdWFsaWZpZWROYW1lTGVuZ3RoIC0gaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOworCQkJaWYgKGluZGV4SW5RdWFsaWZpZWROYW1lIDwgaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nKSB7CisJCQkJLy8gYSBleHRyYSBsb29rdXAgaXMgcmVxdWlyZWQKKwkJCQlCbG9ja1Njb3BlIGludGVybmFsU2NvcGUgPSByZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKHBhcmVudCk7CisJCQkJQmluZGluZyBiaW5kaW5nID0gbnVsbDsKKwkJCQlpZiAoaW50ZXJuYWxTY29wZSA9PSBudWxsKSB7CisJCQkJCWJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnRva2VucywgMCwgaW5kZXhJblF1YWxpZmllZE5hbWUpKTsKKwkJCQl9IGVsc2UgeworCQkJCQliaW5kaW5nID0gaW50ZXJuYWxTY29wZS5nZXRUeXBlT3JQYWNrYWdlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkTmFtZVJlZmVyZW5jZS50b2tlbnMsIDAsIGluZGV4SW5RdWFsaWZpZWROYW1lKSk7CisJCQkJfQorCQkJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgeworCQkJCQkJcmV0dXJuIHRoaXMuZ2V0UGFja2FnZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpYmluZGluZyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBpdCBpcyBhIHR5cGUKKwkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaW5kZXhJblF1YWxpZmllZE5hbWUgPT0gaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nKSB7CisJCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygoUmVmZXJlbmNlQmluZGluZylxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJQmluZGluZyBiaW5kaW5nID0gcXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5iaW5kaW5nOworCQkJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJCQlyZXR1cm4gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKTsJCQkJCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGhpcyBpcyB0aGUgY2FzZSBmb3IgYSBuYW1lIHdoaWNoIGlzIHBhcnQgb2YgYSBxdWFsaWZpZWQgbmFtZSB0aGF0CisJCQkJCSAqIGNhbm5vdCBiZSByZXNvbHZlZC4gU2VlIFBSIDEzMDYzLgorCQkJCQkgKi8KKwkJCQkJaWYgKHF1YWxpZmllZE5hbWVSZWZlcmVuY2Uub3RoZXJCaW5kaW5ncyA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhxdWFsaWZpZWROYW1lUmVmZXJlbmNlLm90aGVyQmluZGluZ3Nbb3RoZXJCaW5kaW5nTGVuZ3RoIC0gaW5kZXggLSAxXSk7CQkJCQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CisJCQlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHF1YWxpZmllZFR5cGVSZWZlcmVuY2UgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgbm9kZTsKKwkJCWlmIChxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKGluZGV4ID09IDApIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKSk7CisJCQl9IGVsc2UgeworCQkJCWludCBxdWFsaWZpZWRUeXBlTGVuZ3RoID0gcXVhbGlmaWVkVHlwZVJlZmVyZW5jZS50b2tlbnMubGVuZ3RoOworCQkJCWludCBpbmRleEluUXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZFR5cGVMZW5ndGggLSBpbmRleDsgLy8gb25lLWJhc2VkCisJCQkJQmxvY2tTY29wZSBpbnRlcm5hbFNjb3BlID0gcmV0cmlldmVFbmNsb3NpbmdTY29wZShwYXJlbnQpOworCQkJCUJpbmRpbmcgYmluZGluZyA9IG51bGw7CisJCQkJaWYgKGludGVybmFsU2NvcGUgPT0gbnVsbCkgeworCQkJCQliaW5kaW5nID0gdGhpcy5zY29wZS5nZXRUeXBlT3JQYWNrYWdlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS50b2tlbnMsIDAsIGluZGV4SW5RdWFsaWZpZWROYW1lKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmluZGluZyA9IGludGVybmFsU2NvcGUuZ2V0VHlwZU9yUGFja2FnZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHF1YWxpZmllZFR5cGVSZWZlcmVuY2UudG9rZW5zLCAwLCBpbmRleEluUXVhbGlmaWVkTmFtZSkpOworCQkJCX0KKwkJCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpIHsKKwkJCQkJCXJldHVybiB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaXQgaXMgYSB0eXBlCisJCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIElCaW5kaW5nIGludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVOYW1lKE5hbWUgbmFtZSkgeworCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobmFtZSk7CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCUFTVE5vZGUgcGFyZW50ID0gbmFtZS5nZXRQYXJlbnQoKTsKKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKSB7CisJCQkJLy8gcmV0cmlldmUgdGhlIHF1YWxpZmllZCBuYW1lIGFuZCByZW1lbWJlciBhdCB3aGljaCBwb3NpdGlvbiBpcyB0aGUgc2ltcGxlIG5hbWUKKwkJCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcGFyZW50OworCQkJCWludCBpbmRleCA9IC0xOworCQkJCWlmIChxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpID09IG5hbWUpIHsKKwkJCQkJaW5kZXgrKzsKKwkJCQl9CisJCQkJd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpIHsKKwkJCQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBwYXJlbnQ7CisJCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJCQkJaW5kZXgrKzsKKwkJCQl9CisJCQkJcmV0dXJuIHJldHVybkJpbmRpbmdGb3JRdWFsaWZpZWROYW1lUGFydChxdWFsaWZpZWROYW1lLCBpbmRleCk7CisJCQl9CisJCX0KKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgbm9kZTsKKwkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKFJlZmVyZW5jZUJpbmRpbmcpc2luZ2xlTmFtZVJlZmVyZW5jZS5iaW5kaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gdGhpcyBpcyBhIHZhcmlhYmxlIG9yIGEgZmllbGQKKwkJCQlCaW5kaW5nIGJpbmRpbmcgPSBzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmc7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZykgYmluZGluZyk7CQkJCQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIHsKKwkJCVF1YWxpZmllZFN1cGVyUmVmZXJlbmNlIHF1YWxpZmllZFN1cGVyUmVmZXJlbmNlID0gKFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSBub2RlOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcocXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UucXVhbGlmaWNhdGlvbi5iaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkJcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKCgoTG9jYWxEZWNsYXJhdGlvbilub2RlKS5iaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsKKwkJCXJldHVybiBnZXRWYXJpYWJsZUJpbmRpbmcoKChGaWVsZFJlZmVyZW5jZSkgbm9kZSkuYmluZGluZyk7CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJCVNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSA9IChTaW5nbGVUeXBlUmVmZXJlbmNlKSBub2RlOworCQkJaWYgKHNpbmdsZVR5cGVSZWZlcmVuY2UuYmluZGluZyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhzaW5nbGVUeXBlUmVmZXJlbmNlLmJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKSk7CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uKSBub2RlOworCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZERlY2xhcmF0aW9uLmJpbmRpbmcpOworCQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIElCaW5kaW5nIGludGVybmFsUmVzb2x2ZU5hbWVGb3JNZXRob2RJbnZvY2F0aW9uKE5hbWUgbmFtZSkgeworCQlBU1ROb2RlIHBhcmVudCA9IG5hbWUuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKSB7CisJCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgcGFyZW50OworCQkJaWYgKG5hbWUgPT0gbWV0aG9kSW52b2NhdGlvbi5nZXRFeHByZXNzaW9uKCkpIHsKKwkJCQlpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSkgeworCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yUXVhbGlmaWVkTmFtZShuYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShuYW1lKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChuYW1lKTsKKwkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBub2RlOworCQkJCQlyZXR1cm4gZ2V0TWV0aG9kQmluZGluZyhtZXNzYWdlU2VuZC5iaW5kaW5nKTsKKwkJCQl9IGVsc2UgaWYgKG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpIHsKKwkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclF1YWxpZmllZE5hbWUobmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclNpbXBsZU5hbWUobmFtZSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHN1cGVyTWV0aG9kSW52b2NhdGlvbiA9IChTdXBlck1ldGhvZEludm9jYXRpb24pIHBhcmVudDsKKwkJCWlmIChuYW1lID09IHN1cGVyTWV0aG9kSW52b2NhdGlvbi5nZXRRdWFsaWZpZXIoKSkgeworCQkJCWlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7CisJCQkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JRdWFsaWZpZWROYW1lKG5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVOYW1lKG5hbWUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KG5hbWUpOworCQkJCWlmIChub2RlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKKwkJCQkJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIG5vZGU7CisJCQkJCXJldHVybiBnZXRNZXRob2RCaW5kaW5nKG1lc3NhZ2VTZW5kLmJpbmRpbmcpOworCQkJCX0gZWxzZSBpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSkgeworCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yUXVhbGlmaWVkTmFtZShuYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShuYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yRmllbGRBY2Nlc3MoTmFtZSBuYW1lKSB7CisJCWlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7CisJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yUXVhbGlmaWVkTmFtZShuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVOYW1lKG5hbWUpOworCQl9CisJfQorCisJcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlVHlwZShOYW1lIG5hbWUpIHsKKwkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KG5hbWUpOworCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgYmluZGluZyA9ICgoVHlwZVJlZmVyZW5jZSkgbm9kZSkuYmluZGluZzsKKwkJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUoKSk7CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKKwkJCU5hbWVSZWZlcmVuY2UgbmFtZVJlZmVyZW5jZSA9IChOYW1lUmVmZXJlbmNlKSBub2RlOworCQkJaWYgKG5hbWVSZWZlcmVuY2UuaXNUeXBlUmVmZXJlbmNlKCkpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgbmFtZVJlZmVyZW5jZS5iaW5kaW5nKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CQorCisJcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yVGhpc0V4cHJlc3Npb24oTmFtZSBuYW1lKSB7CisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChuYW1lKTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygoKFR5cGVSZWZlcmVuY2UpIG5vZGUpLmJpbmRpbmcpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKgorCSAqIEBzZWUgQmluZGluZ1Jlc29sdmVyI3Jlc29sdmVDb25zdHJ1Y3RvcihDbGFzc0luc3RhbmNlQ3JlYXRpb24pCisJICovCisJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUNvbnN0cnVjdG9yKENsYXNzSW5zdGFuY2VDcmVhdGlvbiBleHByZXNzaW9uKSB7CisJCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSBleHByZXNzaW9uLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgeworCQkJQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24gYW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24gPSAoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIG5vZGU7CisJCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24uYmluZGluZyk7CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRNZXRob2RCaW5kaW5nKCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pbm9kZSkuYmluZGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIEJpbmRpbmdSZXNvbHZlciNyZXNvbHZlQ29uc3RydWN0b3IoQ29uc3RydWN0b3JJbnZvY2F0aW9uKQorCSAqLworCUlNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvcihDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcmVzc2lvbikgeworCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gZXhwcmVzc2lvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCWlmIChub2RlIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBub2RlOworCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kQmluZGluZyhleHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgQmluZGluZ1Jlc29sdmVyI3Jlc29sdmVDb25zdHJ1Y3RvcihTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikKKwkgKi8KKwlJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3IoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcmVzc2lvbikgeworCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gZXhwcmVzc2lvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CisJCWlmIChub2RlIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBub2RlOworCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kQmluZGluZyhleHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoKKwkgKiBAc2VlIEJpbmRpbmdSZXNvbHZlciNyZXNvbHZlVHlwZShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQorCSAqLworCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIHR5cGUpIHsKKwkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IHR5cGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldCh0eXBlKTsKKwkJaWYgKGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcoYW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQodHlwZUJpbmRpbmcsIHR5cGUpOworCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlVHlwZSh0eXBlKTsKKwl9CisKKwkvKioKKwkgKiBTdG9yZSB0aGUgbnVtYmVyIG9mIG1vZGlmaWNhdGlvbnMgZG9uZSB1c2luZyB0aGUgYXN0LiBUaGlzIGlzIHVzZWQgdG8gdmFsaWRhdGUKKwkgKiByZXNvbHZlQmluZGluZyBtZXRob2RzLiBJZiB0aGUgbnVtYmVyIGNoYW5nZWQsIGFsbCByZXNvbHZlIGJpbmRpbmdzIG1ldGhvZHMKKwkgKiBzaW1wbHkgcmV0dXJuIG51bGwuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc3RvcmVNb2RpZmljYXRpb25Db3VudChsb25nIG1vZGlmaWNhdGlvbkNvdW50KSB7CisJCXN1cGVyLnN0b3JlTW9kaWZpY2F0aW9uQ291bnQobW9kaWZpY2F0aW9uQ291bnQpOworCQl0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgPSB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RvU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RvU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MWYwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogRG8gc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIERvU3RhdGVtZW50OgorICogICAgPGI+ZG88L2I+IFN0YXRlbWVudCA8Yj53aGlsZTwvYj4gPGI+KDwvYj4gRXhwcmVzc2lvbiA8Yj4pPC9iPiA8Yj47PC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIERvU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCS8qKgorCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogbGVnYWwsIGV4cHJlc3Npb24uCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlIGJvZHkgc3RhdGVtZW50OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrLgorCSAqLworCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGRvIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIGFuZCB0aGUgYm9keSBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2suCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCURvU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gRE9fU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlEb1N0YXRlbWVudCByZXN1bHQgPSBuZXcgRG9TdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0Qm9keSgoU3RhdGVtZW50KSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRCb2R5KCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBkbyBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGRvIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBEb1N0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgZG8gc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKKwkgKi8gCisJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRCb2R5KG5ldyBCbG9jayhnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBib2R5OworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgZG8gc3RhdGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIERvU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYSBTdGF0ZW1lbnQgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5ib2R5LCBzdGF0ZW1lbnQsIHRydWUpOworCQl0aGlzLmJvZHkgPSBzdGF0ZW1lbnQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKKwkJCSsgKGJvZHkgPT0gbnVsbCA/IDAgOiBnZXRCb2R5KCkudHJlZVNpemUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbXB0eVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbXB0eVN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzEwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VtcHR5U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogTnVsbCBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogRW1wdHlTdGF0ZW1lbnQ6CisgKiAgICA8Yj47PC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEVtcHR5U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBudWxsIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUVtcHR5U3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEVNUFRZX1NUQVRFTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJRW1wdHlTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEVtcHR5U3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiBtZW1TaXplKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OGFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIEFTVCBub2RlcyB0aGF0IHJlcHJlc2VudCBleHByZXNzaW9ucy4KKyAqIFRoZXJlIGFyZSBzZXZlcmFsIGtpbmRzIG9mIGV4cHJlc3Npb25zLgorICogPHA+CisgKiA8cHJlPgorICogRXhwcmVzc2lvbjoKKyAqICAgIE5hbWUKKyAqICAgIEludGVnZXJMaXRlcmFsIChpbmNsdWRlcyBkZWNpbWFsLCBoZXgsIGFuZCBvY3RhbCBmb3JtczsgYW5kIGxvbmcpCisgKiAgICBGbG9hdGluZ1BvaW50TGl0ZXJhbCAoaW5jbHVkZXMgYm90aCBmbG9hdCBhbmQgZG91YmxlKQorICogICAgQ2hhcmFjdGVyTGl0ZXJhbAorICogICAgTnVsbExpdGVyYWwKKyAqICAgIEJvb2xlYW5MaXRlcmFsCisgKiAgICBTdHJpbmdMaXRlcmFsCisgKiAgICBUeXBlTGl0ZXJhbAorICogICAgVGhpc0V4cHJlc3Npb24KKyAqICAgIFN1cGVyRmllbGRBY2Nlc3MKKyAqICAgIEZpZWxkQWNjZXNzCisgKiAgICBBc3NpZ25tZW50CisgKiAgICBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorICogICAgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCisgKiAgICBBcnJheUNyZWF0aW9uCisgKiAgICBBcnJheUluaXRpYWxpemVyCisgKiAgICBNZXRob2RJbnZvY2F0aW9uCisgKiAgICBTdXBlck1ldGhvZEludm9jYXRpb24KKyAqICAgIEFycmF5QWNjZXNzCisgKiAgICBJbmZpeEV4cHJlc3Npb24KKyAqICAgIEluc3RhbmNlb2ZFeHByZXNzaW9uCisgKiAgICBDb25kaXRpb25hbEV4cHJlc3Npb24KKyAqICAgIFBvc3RmaXhFeHByZXNzaW9uCisgKiAgICBQcmVmaXhFeHByZXNzaW9uCisgKiAgICBDYXN0RXhwcmVzc2lvbgorICogICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KKyAqIDwvcHJlPgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSB7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gZXhwcmVzc2lvbiBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlFeHByZXNzaW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyoqCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSB0eXBlIG9mIHRoaXMgZXhwcmVzc2lvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24sIG9yCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHR5cGUgY2Fubm90IGJlIHJlc29sdmVkCisJICovCQorCXB1YmxpYyBJVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVCaW5kaW5nKCkgeworCQlyZXR1cm4gZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZUV4cHJlc3Npb25UeXBlKHRoaXMpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FeHByZXNzaW9uU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb25TdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGYzODZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FeHByZXNzaW9uU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIEV4cHJlc3Npb24gc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKiA8cD4KKyAqIFRoaXMga2luZCBvZiBub2RlIGlzIHVzZWQgdG8gY29udmVydCBhbiBleHByZXNzaW9uICg8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKyAqIGludG8gYSBzdGF0ZW1lbnQgKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgorICogPC9wPgorICogPHByZT4KKyAqIEV4cHJlc3Npb25TdGF0ZW1lbnQ6CisgKiAgICBTdGF0ZW1lbnRFeHByZXNzaW9uIDxiPjs8L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLAorCSAqIGV4cHJlc3Npb24uCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGV4cHJlc3Npb24gc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gc3RhdGVtZW50IGlzIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJRXhwcmVzc2lvblN0YXRlbWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEVYUFJFU1NJT05fU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlFeHByZXNzaW9uU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGV4cHJlc3Npb24gc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRFeHByZXNzaW9uKG5ldyBNZXRob2RJbnZvY2F0aW9uKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGV4cHJlc3Npb247CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgZXhwcmVzc2lvbiBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhbiBFeHByZXNzaW9uU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAKKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1Y2RkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGRBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogRmllbGQgYWNjZXNzIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogRmllbGRBY2Nlc3M6IAorICogCQlFeHByZXNzaW9uIDxiPi48L2I+IElkZW50aWZpZXIKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkKKwkvKioKKwkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBmaWVsZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBmaWVsZCBuYW1lLgorCSAqLworCXByaXZhdGUgU2ltcGxlTmFtZSBmaWVsZE5hbWUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG5vZGUgZm9yIGEgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlCisJICogZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCB0aGUgZXhwcmVzc2lvbiBhbmQgZmllbGQgYXJlIGJvdGggdW5zcGVjaWZpZWQsCisJICogYnV0IGxlZ2FsLCBuYW1lcy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJRmllbGRBY2Nlc3MoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBGSUVMRF9BQ0NFU1M7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUZpZWxkQWNjZXNzIHJlc3VsdCA9IG5ldyBGaWVsZEFjY2Vzcyh0YXJnZXQpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgZ2V0TmFtZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TmFtZSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbmV3IGV4cHJlc3Npb24KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIEZpZWxkQWNjZXNzIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCgoQVNUTm9kZSkgdGhpcy5leHByZXNzaW9uLCAoQVNUTm9kZSkgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWNjZXNzZWQgaW4gdGhpcyBmaWVsZCBhY2Nlc3MgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmaWVsZCBuYW1lCisJICovIAorCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkgeworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBmaWVsZE5hbWU7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhY2Nlc3NlZCBpbiB0aGlzIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBmaWVsZE5hbWUgdGhlIGZpZWxkIG5hbWUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSBmaWVsZE5hbWUpIHsKKwkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBGaWVsZEFjY2VzcyBjYW5ub3Qgb2NjdXIgaW5zaWRlIGEgU2ltcGxlTmFtZQorCQlyZXBsYWNlQ2hpbGQodGhpcy5maWVsZE5hbWUsIGZpZWxkTmFtZSwgZmFsc2UpOworCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAoZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKQorCQkJKyAoZmllbGROYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg2YzljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZpZWxkIGRlY2xhcmF0aW9uIG5vZGUgdHlwZS4KKyAqIDxwPgorICogVGhpcyBraW5kIG9mIG5vZGUgY29sbGVjdHMgc2V2ZXJhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMKKyAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgc2luZ2xlIGJvZHkgZGVjbGFyYXRpb24KKyAqICg8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KSwgYWxsIHNoYXJpbmcgdGhlIHNhbWUgbW9kaWZpZXJzIGFuZCBiYXNlIHR5cGUuCisgKiA8L3A+CisgKiA8cHJlPgorICogRmllbGREZWNsYXJhdGlvbjoKKyAqICAgIFtKYXZhZG9jXSB7IE1vZGlmaWVyIH0gVHlwZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKKyAqICAgICAgICAgeyA8Yj4sPC9iPiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgfSA8Yj47PC9iPgorICogPC9wcmU+CisgKiA8cD4KKyAqIFdoZW4gYSBKYXZhZG9jIGNvbW1lbnQgaXMgcHJlc2VudCwgdGhlIHNvdXJjZSByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBvZiB0aGUgIi8qKiIgY29tbWVudCBkZWxpbWl0ZXIuIFdoZW4gdGhlcmUgaXMgbm8gSmF2YWRvYyBjb21tZW50LAorICogdGhlIHNvdXJjZSByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpbml0aWFsIG1vZGlmaWVyIG9yCisgKiB0eXBlLiBUaGUgc291cmNlIHJhbmdlIGV4dGVuZHMgdGhyb3VnaCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpbmFsICI7Ii4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogTWFzayBjb250YWluaW5nIGFsbCBsZWdhbCBtb2RpZmllcnMgZm9yIHRoaXMgY29uc3RydWN0LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRUdBTF9NT0RJRklFUlMgPSAKKwkJTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLlBST1RFQ1RFRAorCQl8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuVk9MQVRJTEUKKwkJfCBNb2RpZmllci5UUkFOU0lFTlQ7CisKKwkvKioKKwkgKiBUaGUgbW9kaWZpZXJzOyBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBmbGFncy4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgaW50IG1vZGlmaWVycyA9IE1vZGlmaWVyLk5PTkU7CisJCQorCS8qKgorCSAqIFRoZSBiYXNlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogbGVnYWwgdHlwZS4KKwkgKi8KKwlwcml2YXRlIFR5cGUgYmFzZVR5cGUgPSBudWxsOworCisJLyoqCisJICogVGhlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIChlbGVtZW50IHR5cGU6IAorCSAqIDxjb2RlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50cyA9IAorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCAgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmNsYXNzKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBmaWVsZCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSBvd25lZCAKKwkgKiBieSB0aGUgZ2l2ZW4gQVNULiAgQnkgZGVmYXVsdCwgdGhlIGZpZWxkIGRlY2xhcmF0aW9uIGhhczogbm8gbW9kaWZpZXJzLAorCSAqIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUsIGFuZCBhbiBlbXB0eSBsaXN0IG9mIHZhcmlhYmxlIAorCSAqIGRlY2xhcmF0aW9uIGZyYWdtZW50cyAod2hpY2ggaXMgc3ludGFjdGljYWxseSBpbGxlZ2FsKS4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJRmllbGREZWNsYXJhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEZJRUxEX0RFQ0xBUkFUSU9OOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlGaWVsZERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRKYXZhZG9jKAorCQkJKEphdmFkb2MpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LChBU1ROb2RlKSBnZXRKYXZhZG9jKCkpKTsKKwkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CisJCXJlc3VsdC5zZXRUeXBlKChUeXBlKSBnZXRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5mcmFnbWVudHMoKS5hZGRBbGwoCisJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGZyYWdtZW50cygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0SmF2YWRvYygpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFR5cGUoKSk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGUgZm9sbG93aW5nIG1vZGlmaWVycyBhcmUgdmFsaWQgZm9yIGZpZWxkczogcHVibGljLCBwcml2YXRlLCBwcm90ZWN0ZWQsCisJICogc3RhdGljLCBmaW5hbCwgdm9sYXRpbGUsIGFuZCB0cmFuc2llbnQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICovIAorCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gbW9kaWZpZXJzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzIGFyZSB2YWxpZCBmb3IgZmllbGRzOiBwdWJsaWMsIHByaXZhdGUsIHByb3RlY3RlZCwKKwkgKiBzdGF0aWMsIGZpbmFsLCB2b2xhdGlsZSwgYW5kIHRyYW5zaWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYml0LXdpc2Ugb3Igb2YgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpZXJzIGFyZSBpbGxlZ2FsCisJICovIAorCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisJCWlmICgobW9kaWZpZXJzICYgfkxFR0FMX01PRElGSUVSUykgIT0gMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBiYXNlIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoZSBpbmRpdmlkdWFsIGNoaWxkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBtYXkgc3BlY2lmeSAKKwkgKiBhZGRpdGlvbmFsIGFycmF5IGRpbWVuc2lvbnMuIFNvIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBhcmUgbm90IAorCSAqIG5lY2Vzc2FyaWx5IGV4YWN0bHkgdGhpcyB0eXBlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJaWYgKGJhc2VUeXBlID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFR5cGUoZ2V0QVNUKCkubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOworCQl9CisJCXJldHVybiBiYXNlVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBiYXNlIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiB0byB0aGUgZ2l2ZW4gdHlwZS4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IGJhc2UgdHlwZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLmJhc2VUeXBlLCB0eXBlLCBmYWxzZSk7CisJCXRoaXMuYmFzZVR5cGUgPSB0eXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgaW4gdGhpcyBmaWVsZCAKKwkgKiBkZWNsYXJhdGlvbi4gQWRkaW5nIGFuZCByZW1vdmluZyBub2RlcyBmcm9tIHRoaXMgbGlzdCBhZmZlY3RzIHRoaXMgbm9kZQorCSAqIGR5bmFtaWNhbGx5LiBBbGwgbm9kZXMgaW4gdGhpcyBsaXN0IG11c3QgYmUgCisJICogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPnM7IGF0dGVtcHRzIHRvIGFkZCBhbnkgb3RoZXIgCisJICogdHlwZSBvZiBub2RlIHdpbGwgdHJpZ2dlciBhbiBleGNlcHRpb24uCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIAorCSAqICAgIHN0YXRlbWVudCAoZWxlbWVudCB0eXBlOiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBmcmFnbWVudHMoKSB7CisJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzOworCX0KKwkJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhcHBlbmREZWJ1Z1N0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoIkZpZWxkRGVjbGFyYXRpb25bIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiZmllbGQgIik7IC8vJE5PTi1OTFMtMSQKKwkJZ2V0VHlwZSgpLmFwcGVuZFByaW50U3RyaW5nKGJ1ZmZlcik7CisJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBkID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgaXQubmV4dCgpOworCQkJZC5nZXROYW1lKCkuYXBwZW5kUHJpbnRTdHJpbmcoYnVmZmVyKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChnZXRKYXZhZG9jKCkgPT0gbnVsbCA/IDAgOiBnZXRKYXZhZG9jKCkudHJlZVNpemUoKSkKKwkJCSsgKGJhc2VUeXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCisJCQkrIHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMubGlzdFNpemUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZvclN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Gb3JTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI0N2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Gb3JTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBGb3Igc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIEZvclN0YXRlbWVudDoKKyAqICAgIDxiPmZvcjwvYj4gPGI+KDwvYj4KKyAqIAkJCVsgRm9ySW5pdCBdPGI+OzwvYj4KKyAqIAkJCVsgRXhwcmVzc2lvbiBdIDxiPjs8L2I+CisgKiAJCQlbIEZvclVwZGF0ZSBdIDxiPik8L2I+CisgKiAJCQlTdGF0ZW1lbnQKKyAqIEZvckluaXQ6CisgKiAJCSggU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb24gKQorICogCQkJeyA8Yj4sPC9iPiAoIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gfCBFeHByZXNzaW9uICkgfQorICogRm9yVXBkYXRlOgorICogCQlFeHByZXNzaW9uIHsgPGI+LDwvYj4gRXhwcmVzc2lvbiB9CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiBpbml0aWFsaXplciBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKKwkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGluaXRpYWxpemVycyA9CisJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIEV4cHJlc3Npb24uY2xhc3MpOworCisJLyoqCisJICogVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uOyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxDb25kaXRpb25FeHByZXNzaW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiB1cGRhdGUgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCisJICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB1cGRhdGVycyA9CisJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIEV4cHJlc3Npb24uY2xhc3MpOworCisJLyoqCisJICogVGhlIGJvZHkgc3RhdGVtZW50OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrCisJICogc3RhdGVtZW50LgorCSAqLworCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOworCQkJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBmb3Igc3RhdGVtZW50IG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuIAorCSAqIEJ5IGRlZmF1bHQsIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMsIG5vIGNvbmRpdGlvbiBleHByZXNzaW9uLCAKKwkgKiBubyB1cGRhdGVycywgYW5kIHRoZSBib2R5IGlzIGFuIGVtcHR5IGJsb2NrLgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlGb3JTdGF0ZW1lbnQoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBGT1JfU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlGb3JTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEZvclN0YXRlbWVudCh0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5pbml0aWFsaXplcnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBpbml0aWFsaXplcnMoKSkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigKKwkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhwcmVzc2lvbigpKSk7CisJCXJlc3VsdC51cGRhdGVycygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHVwZGF0ZXJzKCkpKTsKKwkJcmVzdWx0LnNldEJvZHkoCisJCQkoU3RhdGVtZW50KSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0Qm9keSgpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGluaXRpYWxpemVycyk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdXBkYXRlcnMpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Qm9keSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBpbml0aWFsaXplciBleHByZXNzaW9ucyBpbiB0aGlzIGZvcgorCSAqIHN0YXRlbWVudC4KKwkgKiA8cD4KKwkgKiBUaGUgbGlzdCBzaG91bGQgY29uc2lzdCBvZiBlaXRoZXIgYSBsaXN0IG9mIHNvIGNhbGxlZCBzdGF0ZW1lbnQgCisJICogZXhwcmVzc2lvbnMgKEpMUzIsIDE0LjgpLCBvciBhIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZXhwcmVzc2lvbnMKKwkgKiBhbGwgd2l0aCB0aGUgc2FtZSB0eXBlLiBPdGhlcndpc2UsIHRoZSBmb3Igc3RhdGVtZW50IHdvdWxkIGhhdmUgbm8gSmF2YQorCSAqIHNvdXJjZSBlcXVpdmFsZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IGluaXRpYWxpemVycygpIHsKKwkJcmV0dXJuIGluaXRpYWxpemVyczsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gb2YgdGhpcyBmb3Igc3RhdGVtZW50LCBvciAKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgICB0aGVyZSBpcyBub25lCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCXJldHVybiBvcHRpb25hbENvbmRpdGlvbkV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBvZiB0aGlzIHJldHVybiBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgaWYgdGhlcmUgaXMgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJLy8gYSBGb3JTdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxDb25kaXRpb25FeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbENvbmRpdGlvbkV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIHVwZGF0ZSBleHByZXNzaW9ucyBpbiB0aGlzIGZvcgorCSAqIHN0YXRlbWVudC4KKwkgKiA8cD4KKwkgKiBUaGUgbGlzdCBzaG91bGQgY29uc2lzdCBvZiBzbyBjYWxsZWQgc3RhdGVtZW50IGV4cHJlc3Npb25zLiBPdGhlcndpc2UsCisJICogdGhlIGZvciBzdGF0ZW1lbnQgd291bGQgaGF2ZSBubyBKYXZhIHNvdXJjZSBlcXVpdmFsZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgdXBkYXRlIGV4cHJlc3Npb25zIAorCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCB1cGRhdGVycygpIHsKKwkJcmV0dXJuIHVwZGF0ZXJzOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgZm9yIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBib2R5IHN0YXRlbWVudCBub2RlCisJICovIAorCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKwkJaWYgKGJvZHkgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0Qm9keShuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gYm9keTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIGZvciBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIHN0YXRlbWVudCB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0Qm9keShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCWlmIChzdGF0ZW1lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgRm9yU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYSBTdGF0ZW1lbnQgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5ib2R5LCBzdGF0ZW1lbnQsIHRydWUpOworCQl0aGlzLmJvZHkgPSBzdGF0ZW1lbnQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgNCAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgaW5pdGlhbGl6ZXJzLmxpc3RTaXplKCkKKwkJCSsgdXBkYXRlcnMubGlzdFNpemUoKQorCQkJKyAob3B0aW9uYWxDb25kaXRpb25FeHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCisJCQkrIChib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBhNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBIGJpbmRpbmcgcmVwcmVzZW50cyBhIG5hbWVkIGVudGl0eSBpbiB0aGUgSmF2YSBsYW5ndWFnZS4gVGhlIHdvcmxkIG9mIAorICogYmluZGluZ3MgcHJvdmlkZXMgYW4gaW50ZWdyYXRlZCBwaWN0dXJlIG9mIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2dyYW0gYXMKKyAqIHNlZW4gZnJvbSB0aGUgY29tcGlsZXIncyBwb2ludCBvZiB2aWV3LiBUaGlzIGludGVyZmFjZSBkZWNsYXJlIHByb3RvY29sCisgKiBjb21tb24gdG8gdGhlIHZhcmlvdXMgZGlmZmVyZW50IGtpbmRzIG9mIG5hbWVkIGVudGl0aWVzIGluIHRoZSBKYXZhIGxhbmd1YWdlOgorICogcGFja2FnZXMsIHR5cGVzLCBmaWVsZHMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGxvY2FsIHZhcmlhYmxlcy4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNlZSBJUGFja2FnZUJpbmRpbmcKKyAqIEBzZWUgSVR5cGVCaW5kaW5nCisgKiBAc2VlIElWYXJpYWJsZUJpbmRpbmcKKyAqIEBzZWUgSU1ldGhvZEJpbmRpbmcKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJQmluZGluZyB7CisJCisJLyoqCisJICogS2luZCBjb25zdGFudCAodmFsdWUgMSkgaW5kaWNhdGluZyBhIHBhY2thZ2UgYmluZGluZy4KKwkgKiBCaW5kaW5ncyBvZiB0aGlzIGtpbmQgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklQYWNrYWdlQmluZGluZzwvY29kZT4uCisJICogCisJICogQHNlZSAjZ2V0S2luZAorCSAqIEBzZWUgSVBhY2thZ2VCaW5kaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRSA9IDE7CisJCisJLyoqCisJICogS2luZCBjb25zdGFudCAodmFsdWUgMikgaW5kaWNhdGluZyBhIHR5cGUgYmluZGluZy4KKwkgKiBCaW5kaW5ncyBvZiB0aGlzIGtpbmQgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklUeXBlQmluZGluZzwvY29kZT4uCisJICogCisJICogQHNlZSAjZ2V0S2luZAorCSAqIEBzZWUgSVR5cGVCaW5kaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDI7CisJCQorCS8qKgorCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDMpIGluZGljYXRpbmcgYSBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZSBiaW5kaW5nLgorCSAqIEJpbmRpbmdzIG9mIHRoaXMga2luZCBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SVZhcmlhYmxlQmluZGluZzwvY29kZT4uCisJICogCisJICogQHNlZSAjZ2V0S2luZAorCSAqIEBzZWUgSVZhcmlhYmxlQmluZGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFID0gMzsKKworCS8qKgorCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDQpIGluZGljYXRpbmcgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IgYmluZGluZy4KKwkgKiBCaW5kaW5ncyBvZiB0aGlzIGtpbmQgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklNZXRob2RCaW5kaW5nPC9jb2RlPi4KKwkgKiAKKwkgKiBAc2VlICNnZXRLaW5kCisJICogQHNlZSBJTWV0aG9kQmluZGluZworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDQ7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUga2luZCBvZiBiaW5kaW5ncyB0aGlzIGlzLgorCSAqIAorCSAqIEByZXR1cm4gb25lIG9mIHRoZSBraW5kIGNvbnN0YW50czoKKwkgKiAJPGNvZGU+UEFDS0FHRTwvY29kZT4sCisJICogCTxjb2RlPlRZUEU8L2NvZGU+LAorCSAqIAk8Y29kZT5WQVJJQUJMRTwvY29kZT4sCisJICogCW9yIDxjb2RlPk1FVEhPRDwvY29kZT4uCisJICovCisJcHVibGljIGludCBnZXRLaW5kKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGJpbmRpbmcuCisJICogRGV0YWlscyBvZiB0aGUgbmFtZSBhcmUgc3BlY2lmaWVkIHdpdGggZWFjaCBzcGVjaWZpYyBraW5kIG9mIGJpbmRpbmcuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGJpbmRpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBiaW5kaW5nLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBkZXByZWNhdGVkIGlzIG5vdCBpbmNsdWRlZCBhbW9uZyB0aGUgbW9kaWZpZXJzLgorCSAqIFVzZSA8Y29kZT5pc0RlcHJlY2F0ZWQ8L2NvZGU+IHRvIGZpbmQgb3V0IHdoZXRoZXIgYSBiaW5kaW5nIGlzIGRlcHJlY2F0ZWQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICovIAorCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGJpbmRpbmcgaXMgZm9yIHNvbWV0aGluZyB0aGF0IGlzIGRlcHJlY2F0ZWQuCisJICogQSBkZXByZWNhdGVkIGNsYXNzLCBpbnRlcmZhY2UsIGZpZWxkLCBtZXRob2QsIG9yIGNvbnN0cnVjdG9yIGlzIG9uZSB0aGF0CisJICogaXMgbWFya2VkIHdpdGggdGhlICdkZXByZWNhdGVkJyB0YWcgaW4gaXRzIEphdmFkb2MgY29tbWVudC4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBiaW5kaW5nIGlzIGRlcHJlY2F0ZWQsIGFuZCAKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXByZWNhdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBiaW5kaW5nIGlzIHN5bnRoZXRpYy4gQSBzeW50aGV0aWMgYmluZGluZyBpcyBvbmUgdGhhdAorCSAqIHdhcyBtYWRlIHVwIGJ5IHRoZSBjb21waWxlciwgcmF0aGVyIHRoYW4gc29tZXRoaW5nIGRlY2xhcmVkIGluIHRoZSAKKwkgKiBzb3VyY2UgY29kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYmluZGluZyBpcyBzeW50aGV0aWMsIGFuZCAKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgYmluZGluZy4KKwkgKiA8cD4KKwkgKiBXaXRoaW4gYSBjb25uZWN0ZWQgY2x1c3RlciBvZiBiaW5kaW5ncyAoZm9yIGV4YW1wbGUsIGFsbCBiaW5kaW5ncyAKKwkgKiByZWFjaGFibGUgZnJvbSBhIGdpdmVuIEFTVCksIGVhY2ggYmluZGluZyB3aWxsIGhhdmUgYSBkaXN0aW5jdCBrZXlzLgorCSAqIFRoZSBrZXlzIGFyZSBnZW5lcmF0ZWQgaW4gYSBtYW5uZXIgdGhhdCBpcyBwcmVkaWN0YWJsZSBhbmQgYXMKKwkgKiBzdGFibGUgYXMgcG9zc2libGUuIFRoaXMgbGFzdCBwcm9wZXJ0eSBtYWtlcyB0aGVzZSBrZXlzIHVzZWZ1bCBmb3IgCisJICogY29tcGFyaW5nIGJpbmRpbmdzIGJldHdlZW4gZGlzY29ubmVjdGVkIGNsdXN0ZXJzIG9mIGJpbmRpbmdzIChmb3IgZXhhbXBsZSwgCisJICogdGhlIGJpbmRpbmdzIGJldHdlZW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIEFTVHMgb2YgdGhlIHNhbWUKKwkgKiBjb21waWxhdGlvbiB1bml0KS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGV4YWN0IGRldGFpbHMgb2YgaG93IHRoZSBrZXlzIGFyZSBnZW5lcmF0ZWQgaXMgdW5zcGVjaWZpZWQuCisJICogSG93ZXZlciwgaXQgaXMgYSBmdW5jdGlvbiBvZiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCSAqIDx1bD4KKwkgKiA8bGk+cGFja2FnZXMgLSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSAoZm9yIGFuIHVubmFtZWQgcGFja2FnZSwKKwkgKiAgIHNvbWUgaW50ZXJuYWwgaWQpPC9saT4KKwkgKiA8bGk+Y2xhc3NlcyBvciBpbnRlcmZhY2VzIC0gdGhlIFZNIG5hbWUgb2YgdGhlIHR5cGUgYW5kIHRoZSBrZXkKKwkgKiAgIG9mIGl0cyBwYWNrYWdlPC9saT4KKwkgKiA8bGk+YXJyYXkgdHlwZXMgLSB0aGUga2V5IG9mIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgbnVtYmVyIG9mCisJICogICBkaW1lbnNpb25zPC9saT4KKwkgKiA8bGk+cHJpbWl0aXZlIHR5cGVzIC0gdGhlIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlPC9saT4KKwkgKiA8bGk+ZmllbGRzIC0gdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCB0aGUga2V5IG9mIGl0cyBkZWNsYXJpbmcKKwkgKiAgIHR5cGU8L2xpPgorCSAqIDxsaT5tZXRob2RzIC0gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCwgdGhlIGtleSBvZiBpdHMgZGVjbGFyaW5nCisJICogICB0eXBlLCBhbmQgdGhlIGtleXMgb2YgdGhlIHBhcmFtZXRlciB0eXBlczwvbGk+CisJICogPGxpPmNvbnN0cnVjdG9ycyAtIHRoZSBrZXkgb2YgaXRzIGRlY2xhcmluZyBjbGFzcywgYW5kIHRoZSAKKwkgKiAgIGtleXMgb2YgdGhlIHBhcmFtZXRlciB0eXBlczwvbGk+CisJICogPC91bD4KKwkgKiBTb21lIGJpbmRpbmdzLCBsaWtlIG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIGRlY2xhcmF0aW9ucyBvY2N1cnJpbmcKKwkgKiB3aXRoaW4gdGhlIGJvZHkgb2YgYSBtZXRob2QsIGFyZSBwcm9ibGVtYXRpYyBiZWNhdXNlIG9mIHRoZSBsYWNrIG9mCisJICogYW55IHVuaXZlcnNhbGx5IGFjY2VwdGFibGUgd2F5IG9mIGFzc2lnbmluZyBrZXlzIHRoYXQgYXJlIGJvdGgKKwkgKiBwcmVkaWN0YWJsZSBhbmQgc3RhYmxlLiBUaGUga2V5cyBmb3IgYmluZGluZ3MgdG8gbG9jYWwgdmFyaWFibGVzLCAKKwkgKiBsb2NhbCB0eXBlcywgZXRjLiBpcyB1bnNwZWNpZmllZCwgYW5kIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpOworCQorCS8qKgorCSAqIFRoZXJlIGlzIG5vIHNwZWNpYWwgZGVmaW5pdGlvbiBvZiBlcXVhbGl0eSBmb3IgYmluZGluZ3M7IGVxdWFsaXR5IGlzCisJICogc2ltcGx5IG9iamVjdCBpZGVudGl0eS4gIFdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHNpbmdsZSBjbHVzdGVyIG9mCisJICogYmluZGluZ3MsIGVhY2ggYmluZGluZyBpcyByZXByZXNlbnRlZCBieSBhIGRpc3RpbmN0IG9iamVjdC4gSG93ZXZlciwKKwkgKiBiZXR3ZWVuIGRpZmZlcmVudCBjbHVzdGVycyBvZiBiaW5kaW5ncywgdGhlIGJpbmRpbmcgb2JqZWN0cyBtYXkgb3IgbWF5CisJICogbm90IGJlIGRpZmZlcmVudDsgaW4gdGhlc2UgY2FzZXMsIHRoZSBjbGllbnQgc2hvdWxkIGNvbXBhcmUgYmluZGluZ3MKKwkgKiB2aWEgdGhlaXIgYmluZGluZyBrZXlzICg8Y29kZT5nZXRLZXk8L2NvZGU+KSBpZiBhdmFpbGFibGUuCisJICogCisJICogQHNlZSAjZ2V0S2V5CisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOworCQorCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaW5kaW5nIHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcKKwkgKiBwdXJwb3NlcyBvbmx5LgorCSAqIAorCSAqIEByZXR1cm4gYSBkZWJ1ZyBzdHJpbmcgCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSU1ldGhvZEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSU1ldGhvZEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNhNzFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWV0aG9kQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIEEgbWV0aG9kIGJpbmRpbmcgcmVwcmVzZW50cyBhIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBvZiBhIGNsYXNzIG9yIGludGVyZmFjZS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNlZSBJVHlwZUJpbmRpbmcjZ2V0RGVjbGFyZWRNZXRob2RzCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYmluZGluZyBpcyBmb3IgYSBjb25zdHJ1Y3RvciBvciBhIG1ldGhvZC4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIGJpbmRpbmcgZm9yIGEgY29uc3RydWN0b3IsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSBiaW5kaW5nIGZvciBhIG1ldGhvZAorCSAqLyAKKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRlY2xhcmVkIGluIHRoaXMgYmluZGluZy4gVGhlIG1ldGhvZCBuYW1lCisJICogaXMgYWx3YXlzIGEgc2ltcGxlIGlkZW50aWZpZXIuIFRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgaXMgYWx3YXlzIHRoZQorCSAqIHNhbWUgYXMgdGhlIGRlY2xhcmVkIG5hbWUgb2YgaXRzIGRlY2xhcmluZyBjbGFzcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kLCBvciB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGlzCisJICogICBjb25zdHJ1Y3RvcidzIGRlY2xhcmluZyBjbGFzcworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHR5cGUgYmluZGluZyByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG9yIGludGVyZmFjZQorCSAqIHRoYXQgZGVjbGFyZXMgdGhpcyBtZXRob2Qgb3IgY29uc3RydWN0b3IuCisJICogCisJICogQHJldHVybiB0aGUgYmluZGluZyBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgZGVjbGFyZXMgdGhpcyBtZXRob2QKKwkgKiAgICBvciBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgcmVwcmVzZW50aW5nIHRoZSBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLAorCSAqIGluIGRlY2xhcmF0aW9uIG9yZGVyLCBvZiB0aGlzIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4gUmV0dXJucyBhbiBhcnJheSBvZgorCSAqIGxlbmd0aCAwIGlmIHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRha2VzIGFueSBwYXJhbWV0ZXJzLgorCSAqIDxwPgorCSAqIE5vdGU6IFRoZSByZXN1bHQgZG9lcyBub3QgaW5jbHVkZSBzeW50aGV0aWMgcGFyYW1ldGVycyBpbnRyb2R1Y2VkIGJ5CisJICogaW5uZXIgY2xhc3MgZW11bGF0aW9uLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgZm9yIHRoZSBmb3JtYWwKKwkgKiAgIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2Qgb3IgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSVR5cGVCaW5kaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZC4gUmV0dXJucyB0aGUKKwkgKiBzcGVjaWFsIHByaW1pdGl2ZSA8Y29kZT52b2lkPC9jb2RlPiByZXR1cm4gdHlwZSBmb3IgY29uc3RydWN0b3JzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCwgb3IgdGhlCisJICogICAgPGNvZGU+dm9pZDwvY29kZT4gcmV0dXJuIHR5cGUgZm9yIGNvbnN0cnVjdG9ycworCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0UmV0dXJuVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBiaW5kaW5ncyByZXByZXNlbnRpbmcgdGhlIHR5cGVzIG9mIHRoZSBleGNlcHRpb25zIHRocm93bgorCSAqIGJ5IHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yLiBSZXR1cm5zIGFuIGFycmF5IG9mIGxlbmd0aCAwIGlmIHRoaXMgbWV0aG9kCisJICogdGhyb3dzIG5vIGV4Y2VwdGlvbnMuIFRoZSByZXN1bHRpbmcgdHlwZXMgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisJICogCisJICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBiaW5kaW5ncyBmb3IgZXhjZXB0aW9ucworCSAqICAgdGhyb3duIGJ5IHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIElUeXBlQmluZGluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVBhY2thZ2VCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ZTBhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVBhY2thZ2VCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQSBwYWNrYWdlIGJpbmRpbmcgcmVwcmVzZW50cyBhIG5hbWVkIG9yIHVubmFtZWQgcGFja2FnZS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJUGFja2FnZUJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHJlcHJlc2VudGVkIGJ5IHRoaXMgYmluZGluZy4gRm9yIG5hbWVkCisJICogcGFja2FnZXMsIHRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgKHVzaW5nICIuIiBmb3IgCisJICogc2VwYXJhdG9ycykuIEZvciB1bm5hbWVkIHBhY2thZ2VzLCB0aGlzIGlzIGEgZGlzdGluY3RpdmUgc3RyaW5nCisJICogdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGlzIHVubmFtZWQgcGFja2FnZSAoc2luY2UgdGhlcmUKKwkgKiBtYXkgaW4gZmFjdCBiZSBtdWx0aXBsZSB1bm5hbWVkIHBhY2thZ2VzKS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHJlcHJlc2VudGVkIGJ5IHRoaXMgYmluZGluZywgb3IgYW4KKwkgKiAgICBpbnRlcm5hbCBpZGVudGlmaWVyIGZvciBhbiB1bm5hbWVkIHBhY2thZ2UKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGlzIGFuIHVubmFtZWQgcGFja2FnZS4KKwkgKiBTZWUgPGVtPlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb248L2VtPiBzZWN0aW9uIDcuNC4yIGZvciBkZXRhaWxzLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGFuIHVubmFtZWQgcGFja2FnZSwgYW5kCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5uYW1lZCgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbmFtZSBjb21wb25lbnQgbWFraW5nIHVwIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCisJICogcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBwYWNrYWdlIG5hbWVkCisJICogImNvbS5leGFtcGxlLnRvb2wiLCB0aGlzIG1ldGhvZCByZXR1cm5zIHsiY29tIiwgImV4YW1wbGUiLCAidG9vbCJ9LgorCSAqIFJldHVybnMgdGhlIGVtcHR5IGxpc3QgZm9yIHVubmFtZWQgcGFja2FnZXMuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcsIG9yIHRoZQorCSAqICAgIGVtcHR5IGxpc3QgZm9yIHVubmFtZWQgcGFja2FnZXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZUNvbXBvbmVudHMoKTsKKwkKKy8vCS8qKgorLy8JICogRmluZHMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSBjbGFzcyBvciBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2l2ZW4KKy8vCSAqIG5hbWUgZGVjbGFyZWQgaW4gdGhpcyBwYWNrYWdlLgorLy8JICogPHA+CisvLwkgKiBGb3IgdG9wLWxldmVsIGNsYXNzZXMgYW5kIGludGVyZmFjZXMsIHRoZSBuYW1lIGhlcmUgaXMganVzdCB0aGUgc2ltcGxlCisvLwkgKiBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UuIEZvciBuZXN0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgdGhlCisvLwkgKiBuYW1lIGlzIHRoZSBWTSBjbGFzcyBuYW1lIChpbiBvdGhlciB3b3JkcywgYSBuYW1lIGxpa2UgCisvLwkgKiA8Y29kZT4iT3V0ZXIkSW5uZXIiPC9jb2RlPiBhcyB1c2VkIHRvIG5hbWUgdGhlIGNsYXNzIGZpbGU7IHNlZQorLy8JICogPGNvZGU+SVR5cGVCaW5kaW5nLmdldE5hbWU8L2NvZGU+KS4KKy8vCSAqIDwvcD4KKy8vCSAqCisvLwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGNsYXNzIG9yIGludGVyZmFjZQorLy8JICogQHJldHVybiB0aGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHdpdGggdGhlCisvLwkgKiAgIGdpdmVuIG5hbWUgZGVjbGFyZWQgaW4gdGhpcyBwYWNrYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorLy8JICogICBpZiB0aGVyZSBpcyBubyBzdWNoIHR5cGUKKy8vCSAqLworLy8JcHVibGljIElUeXBlQmluZGluZyBmaW5kVHlwZUJpbmRpbmcoU3RyaW5nIG5hbWUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lUeXBlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjU1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lUeXBlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGEgY2xhc3MgdHlwZSwgaW50ZXJmYWNlIHR5cGUsIGFycmF5IHR5cGUsIGEgCisgKiBwcmltaXRpdmUgdHlwZSAoaW5jbHVkaW5nIHRoZSBzcGVjaWFsIHJldHVybiB0eXBlIDxjb2RlPnZvaWQ8L2NvZGU+KSwgb3IgdGhlCisgKiBudWxsIHR5cGUuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICogCisgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJlZFR5cGVzKCkKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJVHlwZUJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZS4KKwkgKiA8cD4KKwkgKiBUaGVyZSBhcmUgbmluZSBwcmVkZWZpbmVkIHR5cGUgYmluZGluZ3MgdG8gcmVwcmVzZW50IHRoZSBlaWdodCBwcmltaXRpdmUKKwkgKiB0eXBlcyBhbmQgPGNvZGU+dm9pZDwvY29kZT4uIFRoZXNlIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIHByaW1pdGl2ZQorCSAqIHR5cGVzIHRoYXQgdGhleSByZXByZXNlbnQsIG5hbWVseSBib29sZWFuLCBieXRlLCBjaGFyLCBzaG9ydCwgaW50LAorCSAqIGxvbmcsIGZsb2F0LCBhbmQgZG91YmxlLCBhbmQgdm9pZC4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIHNldCBvZiBwcmltaXRpdmUgdHlwZXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIHNldHMgb2YKKwkgKiBhcnJheSB0eXBlcywgd2l0aCB0aGUgc2V0cyBvZiBjbGFzcyBhbmQgaW50ZXJmYWNlIHR5cGVzLCBhbmQgd2l0aCB0aGUgbnVsbCB0eXBlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBiaW5kaW5nIGlzIGZvciBhIHByaW1pdGl2ZSB0eXBlLAorCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKgorCSAqIEBzZWUgI2lzQXJyYXkoKQorCSAqIEBzZWUgI2lzQ2xhc3MoKQorCSAqIEBzZWUgI2lzSW50ZXJmYWNlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgdGhlIG51bGwgdHlwZS4KKwkgKiA8cD4KKwkgKiBUaGUgbnVsbCB0eXBlIGlzIHRoZSB0eXBlIG9mIGEgPGNvZGU+TnVsbExpdGVyYWw8L2NvZGU+IG5vZGUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBudWxsIHR5cGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIHNldHMgb2YKKwkgKiBhcnJheSB0eXBlcywgd2l0aCB0aGUgc2V0cyBvZiBjbGFzcyBhbmQgaW50ZXJmYWNlIHR5cGVzLCBhbmQgCisJICogd2l0aCB0aGUgc2V0IG9mIHByaW1pdGl2ZSB0eXBlcyAuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGJpbmRpbmcgaXMgZm9yIHRoZSBudWxsIHR5cGUsCisJICogICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTnVsbFR5cGUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlLgorCSAqIDxwPgorCSAqIFRoZSBzZXQgb2YgYXJyYXkgdHlwZXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIHNldHMgb2YKKwkgKiBwcmltaXRpdmUgdHlwZXMgYW5kIHdpdGggdGhlIHNldHMgb2YgY2xhc3MgYW5kIGludGVyZmFjZSB0eXBlcy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBiaW5kaW5nIGlzIGZvciBhbiBhcnJheSB0eXBlLAorCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKiBAc2VlICNpc0NsYXNzKCkKKwkgKiBAc2VlICNpc0ludGVyZmFjZSgpCisJICogQHNlZSAjaXNQcmltaXRpdmUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIHJlcHJlc2VudGluZyB0aGUgZWxlbWVudCB0eXBlIG9mIHRoaXMgYXJyYXkgdHlwZSwKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlIGJpbmRpbmcuIFRoZSBlbGVtZW50CisJICogdHlwZSBvZiBhbiBhcnJheSBpcyBuZXZlciBpdHNlbGYgYW4gYXJyYXkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCisJICogICBub3QgYW4gYXJyYXkgdHlwZQorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0RWxlbWVudFR5cGUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGlzIGFycmF5IHR5cGUsIG9yIDxjb2RlPjA8L2NvZGU+IGlmIHRoaXMKKwkgKiBpcyBub3QgYW4gYXJyYXkgdHlwZSBiaW5kaW5nLgorCSAqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBvZiB0aGlzIGFycmF5IHR5cGUgYmluZGluZywgb3IgCisJICogICA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheSB0eXBlCisJICovCisJcHVibGljIGludCBnZXREaW1lbnNpb25zKCk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYSBjbGFzcyB0eXBlLgorCSAqIDxwPgorCSAqIFRoZSBzZXQgb2YgY2xhc3MgdHlwZXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIHNldHMgb2YKKwkgKiBwcmltaXZlIHR5cGVzLCBhcnJheSB0eXBlcywgaW50ZXJmYWNlIHR5cGVzLCBhbmQgdGhlIG51bGwgdHlwZS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYSBjbGFzcywKKwkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqCisJICogQHNlZSAjaXNBcnJheSgpCisJICogQHNlZSAjaXNJbnRlcmZhY2UoKQorCSAqIEBzZWUgI2lzUHJpbWl0aXZlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlIHR5cGUuCisJICogPHA+CisJICogVGhlIHNldCBvZiBpbnRlcmZhY2UgdHlwZXMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIHNldHMgb2YKKwkgKiBwcmltaXZlIHR5cGVzLCBhcnJheSB0eXBlcywgY2xhc3MgdHlwZXMsIGFuZCB0aGUgbnVsbCB0eXBlLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKgorCSAqIEBzZWUgI2lzQXJyYXkoKQorCSAqIEBzZWUgI2lzQ2xhc3MoKQorCSAqIEBzZWUgI2lzUHJpbWl0aXZlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBiaW5kaW5nLgorCSAqIDxwPgorCSAqIEZvciBuYW1lZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCB0aGlzIGlzIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgdHlwZS4gCisJICogRm9yIHByaW1pdGl2ZSB0eXBlcywgdGhlIG5hbWUgaXMgdGhlIGtleXdvcmQgZm9yIHRoZSBwcmltaXRpdmUgdHlwZS4gRm9yIGFycmF5CisJICogdHlwZXMsIHRoZSBuYW1lIGlzIHRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgdHlwZSBmb2xsb3dlZCBieSAiW10iLgorCSAqIElmIHRoaXMgcmVwcmVzZW50cyBhbiBhbm9ueW1vdXMgY2xhc3MsIGl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIChub3RlIHRoYXQKKwkgKiBpdCBpcyBpbXBvc3NpYmxlIHRvIGhhdmUgYW4gYXJyYXkgdHlwZSB3aXRoIGFuIGFub255bW91cyBjbGFzcyBhcyBlbGVtZW50IHR5cGUpLgorCSAqIEZvciB0aGUgbnVsbCB0eXBlLCBpdCByZXR1cm5zICJudWxsIi4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcsIGFuCisJICogICAgZW1wdHkgc3RyaW5nIHRoaXMgaXMgYW4gYW5vbnltb3VzIHR5cGUsIG9yICJudWxsIiBmb3IgdGhlIG51bGwgdHlwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCQkJCisJLyoqCisJICogUmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaXMgCisJICogZGVjbGFyZWQuCisJICogCisJICogQHJldHVybiB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgaXMKKwkgKiAgIGRlY2xhcmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGEgCisJICogICBwcmltaXRpdmUgdHlwZSwgYW4gYXJyYXkgdHlwZSwgb3IgdGhlIG51bGwgdHlwZS4KKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIGJpbmRpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UKKwkgKiB0aGF0IGRlY2xhcmVzIHRoaXMgYmluZGluZy4KKwkgKiA8cD4KKwkgKiBUaGUgZGVjbGFyaW5nIGNsYXNzIG9mIGEgbWVtYmVyIGNsYXNzIG9yIGludGVyZmFjZSBpcyB0aGUgY2xhc3Mgb3IKKwkgKiBpbnRlcmZhY2Ugb2Ygd2hpY2ggaXQgaXMgYSBtZW1iZXIuIFRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgYSBsb2NhbCBjbGFzcworCSAqIG9yIGludGVyZmFjZSAoaW5jbHVkaW5nIGFub255bW91cyBjbGFzc2VzKSBpcyB0aGUgaW5uZXJtb3N0IGNsYXNzIG9yCisJICogaW50ZXJmYWNlIGNvbnRhaW5pbmcgdGhlIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50IGluIHdoaWNoIHRoaXMgdHlwZSBpcworCSAqIGRlY2xhcmVkLiBBcnJheSB0eXBlcywgcHJpbWl0aXZlIHR5cGVzLCB0aGUgbnVsbCB0eXBlLCBhbmQgdG9wLWxldmVsIHR5cGVzIAorCSAqIGhhdmUgbm8gZGVjbGFyaW5nIGNsYXNzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBkZWNsYXJlcyB0aGlzIHR5cGUsCisJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXREZWNsYXJpbmdDbGFzcygpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHR5cGUgYmluZGluZyBmb3IgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIHR5cGUgcmVwcmVzZW50ZWQKKwkgKiBieSB0aGlzIGNsYXNzIGJpbmRpbmcuCisJICogPHA+CisJICogSWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhbnkgY2xhc3Mgb3RoZXIgdGhhbiB0aGUgY2xhc3MKKwkgKiA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiwgdGhlbiB0aGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgZGlyZWN0CisJICogc3VwZXJjbGFzcyBvZiB0aGlzIGNsYXNzIGlzIHJldHVybmVkLiBJZiB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzCisJICogdGhlIGNsYXNzIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+LCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzCisJICogcmV0dXJuZWQuCisJICogPC9wPgorCSAqIDxwPgorCSAqIElmIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLCBhbiBhcnJheSB0eXBlLCBhCisJICogcHJpbWl0aXZlIHR5cGUsIG9yIHRoZSBudWxsIHR5cGUsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuIAorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgdHlwZSBiaW5kaW5nLAorCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldFN1cGVyY2xhc3MoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiB0eXBlIGJpbmRpbmdzIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0IHN1cGVyaW50ZXJmYWNlcworCSAqIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyB0eXBlIGJpbmRpbmcuIAorCSAqIDxwPgorCSAqIElmIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYSBjbGFzcywgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheQorCSAqIGNvbnRhaW5pbmcgdHlwZSBiaW5kaW5ncyByZXByZXNlbnRpbmcgYWxsIGludGVyZmFjZXMgZGlyZWN0bHkgaW1wbGVtZW50ZWQKKwkgKiBieSB0aGlzIGNsYXNzLiBUaGUgbnVtYmVyIGFuZCBvcmRlciBvZiB0aGUgaW50ZXJmYWNlIG9iamVjdHMgaW4gdGhlIGFycmF5CisJICogY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBhbmQgb3JkZXIgb2YgdGhlIGludGVyZmFjZSBuYW1lcyBpbiB0aGUgCisJICogPGNvZGU+aW1wbGVtZW50czwvY29kZT4gY2xhdXNlIG9mIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGNsYXNzLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBJZiB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGFuIGludGVyZmFjZSwgdGhlIGFycmF5IGNvbnRhaW5zIAorCSAqIHR5cGUgYmluZGluZ3MgcmVwcmVzZW50aW5nIGFsbCBpbnRlcmZhY2VzIGRpcmVjdGx5IGV4dGVuZGVkIGJ5IHRoaXMKKwkgKiBpbnRlcmZhY2UuIFRoZSBudW1iZXIgYW5kIG9yZGVyIG9mIHRoZSBpbnRlcmZhY2Ugb2JqZWN0cyBpbiB0aGUgYXJyYXkgCisJICogY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBhbmQgb3JkZXIgb2YgdGhlIGludGVyZmFjZSBuYW1lcyBpbiB0aGUgCisJICogPGNvZGU+ZXh0ZW5kczwvY29kZT4gY2xhdXNlIG9mIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4gCisJICogPC9wPgorCSAqIDxwPgorCSAqIElmIHRoZSBjbGFzcyBpbXBsZW1lbnRzIG5vIGludGVyZmFjZXMsIG9yIHRoZSBpbnRlcmZhY2UgZXh0ZW5kcyBubyAKKwkgKiBpbnRlcmZhY2VzLCBvciBpZiB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUsIGEKKwkgKiBwcmltaXRpdmUgdHlwZSwgb3IgdGhlIG51bGwgdHlwZSwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBsZW5ndGggMC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgZm9yIHRoZSBpbnRlcmZhY2VzIGV4dGVuZGVkIGJ5IHRoaXMKKwkgKiAgIGNsYXNzLCBvciBpbnRlcmZhY2VzIGV4dGVuZGVkIGJ5IHRoaXMgaW50ZXJmYWNlLCBvciBvdGhlcndpc2UgdGhlIAorCSAqICAgZW1wdHkgbGlzdAorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmdbXSBnZXRJbnRlcmZhY2VzKCk7CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbXBpbGVkIG1vZGlmaWVycyBmb3IgdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgYmluZGluZy4gCisJICogVGhlIHJlc3VsdCBtYXkgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG1vZGlmaWVycyBhcyBkZWNsYXJlZCBpbiB0aGUKKwkgKiBvcmlnaW5hbCBzb3VyY2UsIHNpbmNlIHRoZSBjb21waWxlciBtYXkgY2hhbmdlIHRoZW0gKGluIHBhcnRpY3VsYXIsIAorCSAqIGZvciBpbm5lciBjbGFzcyBlbXVsYXRpb24pLiBUaGUgPGNvZGU+Z2V0RGVjbGFyZWRNb2RpZmllcnM8L2NvZGU+IG1ldGhvZAorCSAqIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBvcmlnaW5hbCBtb2RpZmllcnMgYXJlIG5lZWRlZC4gCisJICogUmV0dXJucyAwIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCByZXByZXNlbnQgYSBjbGFzcyBvciBpbnRlcmZhY2UuCisJICogCisJICogQHNlZSAjZ2V0RGVjbGFyZWRNb2RpZmllcnMKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGRlY2xhcmVkIG1vZGlmaWVycyBmb3IgdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UgYmluZGluZworCSAqIGFzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyBvciAKKwkgKiBpbnRlcmZhY2UuIFRoZSByZXN1bHQgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBtb2RpZmllcnMgaW4gdGhlIGNvbXBpbGVkCisJICogYmluYXJ5LCBzaW5jZSB0aGUgY29tcGlsZXIgbWF5IGNoYW5nZSB0aGVtIChpbiBwYXJ0aWN1bGFyLCBmb3IgaW5uZXIgCisJICogY2xhc3MgZW11bGF0aW9uKS4gVGhlIDxjb2RlPmdldE1vZGlmaWVyczwvY29kZT4gbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmCisJICogdGhlIGNvbXBpbGVkIG1vZGlmaWVycyBhcmUgbmVlZGVkLiBSZXR1cm5zIC0xIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCAKKwkgKiByZXByZXNlbnQgYSBjbGFzcyBvciBpbnRlcmZhY2UuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCisJICogQHNlZSAjZ2V0TW9kaWZpZXJzCisJICogQHNlZSBNb2RpZmllcgorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRNb2RpZmllcnMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhIHRvcC1sZXZlbCBjbGFzcyBvcgorCSAqIGludGVyZmFjZS4KKwkgKiA8cD4KKwkgKiBBIHRvcC1sZXZlbCB0eXBlIGlzIGFueSBjbGFzcyBvciBpbnRlcmZhY2Ugd2hvc2UgZGVjbGFyYXRpb24gZG9lcyBub3QKKwkgKiBvY2N1ciB3aXRoaW4gdGhlIGJvZHkgb2YgYW5vdGhlciBjbGFzcyBvciBpbnRlcmZhY2UuIFRoZSBzZXQgb2YgdG9wCisJICogbGV2ZWwgdHlwZXMgaXMgZGlzam9pbnQgZnJvbSB0aGUgc2V0IG9mIG5lc3RlZCB0eXBlcy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBiaW5kaW5nIGlzIGZvciBhIHRvcC1sZXZlbCBjbGFzcworCSAqICAgb3IgaW50ZXJmYWNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVG9wTGV2ZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGEgbmVzdGVkIGNsYXNzIG9yCisJICogaW50ZXJmYWNlLgorCSAqIDxwPgorCSAqIEEgbmVzdGVkIHR5cGUgaXMgYW55IGNsYXNzIG9yIGludGVyZmFjZSB3aG9zZSBkZWNsYXJhdGlvbiBvY2N1cnMgd2l0aGluCisJICogdGhlIGJvZHkgb2YgYW5vdGhlciBjbGFzcyBvciBpbnRlcmZhY2UuIFRoZSBzZXQgb2YgbmVzdGVkIHR5cGVzIGlzIAorCSAqIGRpc2pvaW50IGZyb20gdGhlIHNldCBvZiB0b3AtbGV2ZWwgdHlwZXMuIE5lc3RlZCB0eXBlcyBmdXJ0aGVyIHN1YmRpdmlkZQorCSAqIGludG8gbWVtYmVyIHR5cGVzLCBsb2NhbCB0eXBlcywgYW5kIGFub255bW91cyB0eXBlcy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBiaW5kaW5nIGlzIGZvciBhIG5lc3RlZCBjbGFzcworCSAqICAgb3IgaW50ZXJmYWNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhIG1lbWJlciBjbGFzcyBvcgorCSAqIGludGVyZmFjZS4KKwkgKiA8cD4KKwkgKiBBIG1lbWJlciB0eXBlIGlzIGFueSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyZWQgYXMgYSBtZW1iZXIgb2YKKwkgKiBhbm90aGVyIGNsYXNzIG9yIGludGVyZmFjZS4gQSBtZW1iZXIgdHlwZSBpcyBhIHN1YnNwZWNpZXMgb2YgbmVzdGVkCisJICogdHlwZSwgYW5kIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGxvY2FsIHR5cGVzLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGJpbmRpbmcgaXMgZm9yIGEgbWVtYmVyIGNsYXNzCisJICogICBvciBpbnRlcmZhY2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhIGxvY2FsIGNsYXNzIG9yCisJICogaW50ZXJmYWNlLgorCSAqIDxwPgorCSAqIEEgbG9jYWwgdHlwZSBpcyBhbnkgbmVzdGVkIGNsYXNzIG9yIGludGVyZmFjZSBub3QgZGVjbGFyZWQgYXMgYSBtZW1iZXIgb2YKKwkgKiBhbm90aGVyIGNsYXNzIG9yIGludGVyZmFjZS4gQSBsb2NhbCB0eXBlIGlzIGEgc3Vic3BlY2llcyBvZiBuZXN0ZWQKKwkgKiB0eXBlLCBhbmQgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbWVtYmVyIHR5cGVzLiBOb3RlIHRoYXQgYW5vbnltb3VzCisJICogY2xhc3NlcyBhcmUgYSBzdWJzcGVjaWVzIG9mIGxvY2FsIHR5cGVzLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGJpbmRpbmcgaXMgZm9yIGEgbG9jYWwgY2xhc3MKKwkgKiAgIG9yIGludGVyZmFjZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBiaW5kaW5nIHJlcHJlc2VudHMgYW4gYW5vbnltb3VzIGNsYXNzLgorCSAqIDxwPgorCSAqIEFuIGFub255bW91cyBjbGFzcyBpcyBhIHN1YnNwZWNpZXMgb2YgbG9jYWwgY2xhc3MsIGFuZCB0aGVyZWZvcmUgbXV0dWFsbHkKKwkgKiBleGNsdXNpdmUgd2l0aCBtZW1iZXIgdHlwZXMuIE5vdGUgdGhhdCBhbm9ueW1vdXMgY2xhc3NlcyBoYXZlIG5vIG5hbWUgCisJICogKDxjb2RlPmdldE5hbWU8L2NvZGU+IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZykuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgYmluZGluZyBpcyBmb3IgYW4gYW5vbnltb3VzIGNsYXNzLAorCSAqICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpOworCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBiaW5kaW5ncyByZXByZXNlbnRpbmcgYWxsIHRoZSBjbGFzc2VzCisJICogYW5kIGludGVyZmFjZXMgZGVjbGFyZWQgYXMgbWVtYmVycyBvZiB0aGlzIGNsYXNzIG9yIGludGVyZmFjZSB0eXBlLiAKKwkgKiBUaGVzZSBpbmNsdWRlIHB1YmxpYywgcHJvdGVjdGVkLCBkZWZhdWx0IChwYWNrYWdlLXByaXZhdGUpIGFjY2VzcywKKwkgKiBhbmQgcHJpdmF0ZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcywgYnV0IGV4Y2x1ZGVzCisJICogaW5oZXJpdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuIFJldHVybnMgYW4gZW1wdHkgbGlzdCBpZiB0aGUKKwkgKiBjbGFzcyBkZWNsYXJlcyBubyBjbGFzc2VzIG9yIGludGVyZmFjZXMgYXMgbWVtYmVycywgb3IgaWYgdGhpcyB0eXBlCisJICogYmluZGluZyByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUsIGEgcHJpbWl0aXZlIHR5cGUsIG9yIHRoZSBudWxsIHR5cGUuCisJICogVGhlIHJlc3VsdGluZyBiaW5kaW5ncyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHR5cGUgYmluZGluZ3MgZm9yIHRoZSBtZW1iZXIgdHlwZXMgb2YgdGhpcyB0eXBlLAorCSAqICAgb3IgdGhlIGVtcHR5IGxpc3QgaWYgdGhpcyB0eXBlIGRvZXMgbm90IGhhdmUgbWVtYmVyIHR5cGVzCisJICovCisJcHVibGljIElUeXBlQmluZGluZ1tdIGdldERlY2xhcmVkVHlwZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBiaW5kaW5ncyByZXByZXNlbnRpbmcgYWxsIHRoZSBmaWVsZHMgZGVjbGFyZWQKKwkgKiBhcyBtZW1iZXJzIG9mIHRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlLiBUaGVzZSBpbmNsdWRlIHB1YmxpYywgCisJICogcHJvdGVjdGVkLCBkZWZhdWx0IChwYWNrYWdlLXByaXZhdGUpIGFjY2VzcywgYW5kIHByaXZhdGUgZmllbGRzIGRlY2xhcmVkCisJICogYnkgdGhlIGNsYXNzLCBidXQgZXhjbHVkZXMgaW5oZXJpdGVkIGZpZWxkcy4gU3ludGhldGljIGZpZWxkcyBtYXkgb3IKKwkgKiBtYXkgbm90IGJlIGluY2x1ZGVkLgorCSAqIFJldHVybnMgYW4gZW1wdHkgbGlzdCBpZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmVzIG5vIGZpZWxkcywKKwkgKiBvciBpZiB0aGlzIHR5cGUgYmluZGluZyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIHR5cGUgb3IgYW4gYXJyYXkgdHlwZSAKKwkgKiAodGhlIGltcGxpY2l0IDxjb2RlPmxlbmd0aDwvY29kZT4gZmllbGQgb2YgYXJyYXkgdHlwZXMgaXMgbm90IGNvbnNpZGVyZWQKKwkgKiB0byBiZSBhIGRlY2xhcmVkIGZpZWxkKS4gVGhlIHJlc3VsdGluZyBiaW5kaW5ncyBhcmUgaW4gbm8gcGFydGljdWxhciAKKwkgKiBvcmRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGJpbmRpbmdzIGZvciB0aGUgZmllbGQgbWVtYmVycyBvZiB0aGlzIHR5cGUsCisJICogICBvciB0aGUgZW1wdHkgbGlzdCBpZiB0aGlzIHR5cGUgZG9lcyBub3QgaGF2ZSBmaWVsZCBtZW1iZXJzIG9yIGlzIGFuCisJICogICBhcnJheSB0eXBlLCBwcmltaXRpdmUgdHlwZSwgb3IgdGhlIG51bGwgdHlwZQorCSAqLworCXB1YmxpYyBJVmFyaWFibGVCaW5kaW5nW10gZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRob2QgYmluZGluZ3MgcmVwcmVzZW50aW5nIGFsbCB0aGUgbWV0aG9kcyBhbmQgCisJICogY29uc3RydWN0b3JzIGRlY2xhcmVkIGZvciB0aGlzIGNsYXNzIG9yIGludGVyZmFjZS4gVGhlc2UgaW5jbHVkZSBwdWJsaWMsCisJICogcHJvdGVjdGVkLCBkZWZhdWx0IChwYWNrYWdlLXByaXZhdGUpIGFjY2VzcywgYW5kIHByaXZhdGUgbWV0aG9kcy4gCisJICogU3ludGhldGljIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycyBtYXkgb3IgbWF5IG5vdCBiZSBpbmNsdWRlZC4gUmV0dXJucworCSAqIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJlcyBubyBtZXRob2RzIG9yIAorCSAqIGNvbnN0cnVjdG9ycywgb3IgaWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlIG9yIGEKKwkgKiBwcmltaXRpdmUgdHlwZS4gVGhlIHJlc3VsdGluZyBiaW5kaW5ncyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1ldGhvZCBiaW5kaW5ncyBmb3IgdGhlIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycworCSAqICAgZGVjbGFyZWQgYnkgdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UsIG9yIHRoZSBlbXB0eSBsaXN0IGlmIHRoaXMgdHlwZSBkb2VzCisJICogICBub3QgZGVjbGFyZSBhbnkgbWV0aG9kcyBvciBjb25zdHJ1Y3RvcnMKKwkgKi8KKwlwdWJsaWMgSU1ldGhvZEJpbmRpbmdbXSBnZXREZWNsYXJlZE1ldGhvZHMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGJpbmRpbmcgb3JpZ2luYXRlZCBpbiBzb3VyY2UgY29kZS4KKwkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgcHJpbWl0aXZlIHR5cGVzLCB0aGUgbnVsbCB0eXBlLCBhcnJheSB0eXBlcywKKwkgKiBhbmQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB3aG9zZSBpbmZvcm1hdGlvbiBjYW1lIGZyb20gYSBwcmUtY29tcGlsZWQgYmluYXJ5CisJICogY2xhc3MgZmlsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIGluIHNvdXJjZSBjb2RlLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGcm9tU291cmNlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lWYXJpYWJsZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTA2OGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQSB2YXJpYWJsZSBiaW5kaW5nIHJlcHJlc2VudHMgZWl0aGVyIGEgZmllbGQgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UsIG9yIAorICogYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAoaW5jbHVkaW5nIGZvcm1hbCBwYXJhbWV0ZXJzLCBsb2NhbCB2YXJpYWJsZXMsIAorICogYW5kIGV4Y2VwdGlvbiB2YXJpYWJsZXMpLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJlZEZpZWxkcworICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElWYXJpYWJsZUJpbmRpbmcgZXh0ZW5kcyBJQmluZGluZyB7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYmluZGluZyBpcyBmb3IgYSBmaWVsZCBvciBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIGJpbmRpbmcgZm9yIGEgZmllbGQsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSBiaW5kaW5nIGZvciBhIGxvY2FsIHZhcmlhYmxlCisJICovIAorCXB1YmxpYyBib29sZWFuIGlzRmllbGQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGlzIGJpbmRpbmcuCisJICogVGhlIG5hbWUgaXMgYWx3YXlzIGEgc2ltcGxlIGlkZW50aWZpZXIuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBiaW5kaW5nIHJlcHJlc2VudGluZyB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlCisJICogdGhhdCBkZWNsYXJlcyB0aGlzIGZpZWxkLgorCSAqIDxwPgorCSAqIFRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgYSBmaWVsZCBpcyB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIG9mIHdoaWNoIGl0IGlzCisJICogYSBtZW1iZXIuIExvY2FsIHZhcmlhYmxlcyBoYXZlIG5vIGRlY2xhcmluZyBjbGFzcy4gVGhlIGZpZWxkIGxlbmd0aCBvZiBhbiAKKwkgKiBhcnJheSB0eXBlIGhhcyBubyBkZWNsYXJpbmcgY2xhc3MuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IGRlY2xhcmVzIHRoaXMgZmllbGQsCisJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXREZWNsYXJpbmdDbGFzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXRUeXBlKCk7CisJCisJLyoqCisJICogUmV0dXJucyBhIHNtYWxsIGludGVnZXIgdmFyaWFibGUgaWQgZm9yIHRoaXMgdmFyaWFibGUgYmluZGluZy4KKwkgKiA8cD4KKwkgKiA8Yj5Mb2NhbCB2YXJpYWJsZXMgaW5zaWRlIG1ldGhvZHM6PC9iPiBMb2NhbCB2YXJpYWJsZXMgKGFuZCBwYXJhbWV0ZXJzKQorCSAqIGRlY2xhcmVkIHdpdGhpbiBhIHNpbmdsZSBtZXRob2QgYXJlIGFzc2lnbmVkIGFzY2VuZGluZyBpZHMgaW4gbm9ybWFsCisJICogY29kZSByZWFkaW5nIG9yZGVyOyB2YXIxLmdldFZhcmlhYmxlSWQoKSZsdDt2YXIyLmdldFZhcmlhYmxlSWQoKSBtZWFucyB0aGF0IHZhcjEgaXMKKwkgKiBkZWNsYXJlZCBiZWZvcmUgdmFyMi4gTm90ZSB0aGF0IHRoZSBudW1iZXJpbmcgZG9lcyBub3QgaW5jbHVkZSB0aGUgbG9jYWwKKwkgKiB2YXJpYWJsZXMgZGVjbGFyZWQgd2l0aGluIHRoZSBtZXRob2QncyBsb2NhbCAob3IgYW5vbnltb3VzKSB0eXBlcyAtIHRoZWlyCisJICogaWRzIHdvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBtZXRob2RzIG9mIHRoZSBsb2NhbCB0eXBlLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiA8Yj5Mb2NhbCB2YXJpYWJsZXMgb3V0c2lkZSBtZXRob2RzOjwvYj4gTG9jYWwgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEKKwkgKiB0eXBlJ3Mgc3RhdGljIGluaXRpYWxpemVycyAob3IgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgb2Ygc3RhdGljIGZpZWxkcykKKwkgKiBhcmUgYXNzaWduZWQgYXNjZW5kaW5nIGlkcyBpbiBub3JtYWwgY29kZSByZWFkaW5nIG9yZGVyLiBMb2NhbCB2YXJpYWJsZXMKKwkgKiBkZWNsYXJlZCBpbiBhIHR5cGUncyBpbnN0YW5jZSBpbml0aWFsaXplcnMgKG9yIGluaXRpYWxpemVyIGV4cHJlc3Npb25zCisJICogb2Ygbm9uLXN0YXRpYyBmaWVsZHMpIGFyZSBhc3NpZ25lZCBhc2NlbmRpbmcgaWRzIGluIG5vcm1hbCBjb2RlIHJlYWRpbmcKKwkgKiBvcmRlci4gVGhlc2UgaWRzIGFyZSB1c2VmdWwgd2hlbiBjaGVja2luZyBkZWZpbml0ZSBhc3NpZ25tZW50IGZvcgorCSAqIHN0YXRpYyBpbml0aWFsaXplcnMgKEpMUyAxNi43KSBhbmQgaW5zdGFuY2UgaW5pdGlhbGl6ZXJzIChKTFMgMTYuOCksIAorCSAqIHJlc3BlY3RpdmVseS4KKwkgKiA8L3A+CisJICogPHA+CisJICogPGI+RmllbGRzOjwvYj4gRmllbGRzIGRlY2xhcmVkIGFzIG1lbWJlcnMgb2YgYSB0eXBlIGFyZSBhc3NpZ25lZCAKKwkgKiBhc2NlbmRpbmcgaWRzIGluIG5vcm1hbCBjb2RlIHJlYWRpbmcgb3JkZXI7IAorCSAqIGZpZWxkMS5nZXRWYXJpYWJsZUlkKCkmbHQ7ZmllbGQyLmdldFZhcmlhYmxlSWQoKSBtZWFucyB0aGF0IGZpZWxkMSBpcyBkZWNsYXJlZCBiZWZvcmUKKwkgKiBmaWVsZDIuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gYSBzbWFsbCBub24tbmVnYXRpdmUgdmFyaWFibGUgaWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhcmlhYmxlSWQoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lmU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lmU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjZjIyNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSWZTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogSWYgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogUmFuZ2UgMDogZmlyc3QgY2hhcmFjdGVyIG9mICJpZiIga2V5d29yZCB0aHJvdWdoIGxhc3QgY2hhcmFjdGVyIG9mCisgKiB0aGUgbGFzdCBzdGF0ZW1lbnQuCisgKiBSYW5nZSAxOiBmaXJzdCBjaGFyYWN0ZXIgb2YgImVsc2UiIGtleXdvcmQgdGhyb3VnaCBsYXN0IGNoYXJhY3RlciBvZgorICogdGhlIGxhc3Qgc3RhdGVtZW50OyBpZiAiZWxzZSIga2V5d29yZCBpcyBhYnNlbnQgdGhlbiBhbiBlbXB0eSByYW5nZQorICoKKyAqIDxwcmU+CisgKiBJZlN0YXRlbWVudDoKKyAqICAgIDxiPmlmPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IFN0YXRlbWVudCBbIDxiPmVsc2U8L2I+IFN0YXRlbWVudF0KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBsZWdhbCwgZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgdGhlbiBzdGF0ZW1lbnQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBsZWdhbCwgc3RhdGVtZW50LgorCSAqLworCXByaXZhdGUgU3RhdGVtZW50IHRoZW5TdGF0ZW1lbnQgPSBudWxsOworCisJLyoqCisJICogVGhlIGVsc2Ugc3RhdGVtZW50OyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIFN0YXRlbWVudCBvcHRpb25hbEVsc2VTdGF0ZW1lbnQgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIGlmIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzc2lvbiBpcyB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHRoZSB0aGVuIHN0YXRlbWVudCBpcyBhbiBlbXB0eSBibG9jaywgYW5kIHRoZXJlIGlzIG5vIGVsc2UKKwkgKiBzdGF0ZW1lbnQuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUlmU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIElGX1NUQVRFTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJSWZTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IElmU3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldFRoZW5TdGF0ZW1lbnQoCisJCQkoU3RhdGVtZW50KSBnZXRUaGVuU3RhdGVtZW50KCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRFbHNlU3RhdGVtZW50KAorCQkJKFN0YXRlbWVudCkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEVsc2VTdGF0ZW1lbnQoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VGhlblN0YXRlbWVudCgpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEVsc2VTdGF0ZW1lbnQoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGlmIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBleHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjb25kaXRpb24gb2YgdGhpcyBpZiBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIElmU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICJ0aGVuIiBwYXJ0IG9mIHRoaXMgaWYgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlICJ0aGVuIiBzdGF0ZW1lbnQgbm9kZQorCSAqLyAKKwlwdWJsaWMgU3RhdGVtZW50IGdldFRoZW5TdGF0ZW1lbnQoKSB7CisJCWlmICh0aGVuU3RhdGVtZW50ID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFRoZW5TdGF0ZW1lbnQobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIHRoZW5TdGF0ZW1lbnQ7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlICJ0aGVuIiBwYXJ0IG9mIHRoaXMgaWYgc3RhdGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlICJ0aGVuIiBzdGF0ZW1lbnQgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0VGhlblN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCWlmIChzdGF0ZW1lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIElmU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYSBTdGF0ZW1lbnQgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy50aGVuU3RhdGVtZW50LCBzdGF0ZW1lbnQsIHRydWUpOworCQl0aGlzLnRoZW5TdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgImVsc2UiIHBhcnQgb2YgdGhpcyBpZiBzdGF0ZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogdGhpcyBpZiBzdGF0ZW1lbnQgaGFzIDxiPm5vPC9iPiAiZWxzZSIgcGFydC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhhdmluZyBubyBlbHNlIAorCSAqIHN0YXRlbWVudCBhbmQgaGF2aW5nIGFuIGVtcHR5IHN0YXRlbWVudCAoInt9Iikgb3IgbnVsbCBzdGF0ZW1lbnQgKCI7IikuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlICJlbHNlIiBzdGF0ZW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLyAKKwlwdWJsaWMgU3RhdGVtZW50IGdldEVsc2VTdGF0ZW1lbnQoKSB7CisJCXJldHVybiBvcHRpb25hbEVsc2VTdGF0ZW1lbnQ7CisJfQorCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlICJlbHNlIiBwYXJ0IG9mIHRoaXMgaWYgc3RhdGVtZW50LgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHN1YnRsZSBkaWZmZXJlbmNlIGJldHdlZW4gaGF2aW5nIG5vIGVsc2UgcGFydAorCSAqIChhcyBpbiA8Y29kZT4iaWYodHJ1ZSl7fSI8L2NvZGU+KSBhbmQgaGF2aW5nIGFuIGVtcHR5IGJsb2NrIChhcyBpbgorCSAqICJpZih0cnVlKXt9ZWxzZXt9Iikgb3IgbnVsbCBzdGF0ZW1lbnQgKGFzIGluICJpZih0cnVlKXt9ZWxzZTsiKS4gCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlICJlbHNlIiBzdGF0ZW1lbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RWxzZVN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCS8vIGFuIElmU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYSBTdGF0ZW1lbnQgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbEVsc2VTdGF0ZW1lbnQsIHN0YXRlbWVudCwgdHJ1ZSk7CisJCXRoaXMub3B0aW9uYWxFbHNlU3RhdGVtZW50ID0gc3RhdGVtZW50OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RWxzZVN0YXRlbWVudCgpLnRyZWVTaXplKCkpCisJCQkrICh0aGVuU3RhdGVtZW50ID09IG51bGwgPyAwIDogZ2V0VGhlblN0YXRlbWVudCgpLnRyZWVTaXplKCkpCisJCQkrIChvcHRpb25hbEVsc2VTdGF0ZW1lbnQgPT0gbnVsbCA/IDAgOiBnZXRFbHNlU3RhdGVtZW50KCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ltcG9ydERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjMDIzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW1wb3J0RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogSW1wb3J0IGRlY2xhcmF0aW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIEltcG9ydERlY2xhcmF0aW9uOgorICogICAgPGI+aW1wb3J0PC9iPiBOYW1lIFsgPGI+LjwvYj4gPGI+KjwvYj4gXSA8Yj47PC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7CisJLyoqCisJICogVGhlIGltcG9ydCBuYW1lOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCisJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgTmFtZSBpbXBvcnROYW1lID0gbnVsbDsKKworCS8qKgorCSAqIE9uIGRlbWFuZCB2ZXJzdXMgc2luZ2xlIHR5cGUgaW1wb3J0OyBkZWZhdWx0cyB0byBzaW5nbGUgdHlwZSBpbXBvcnQuCisJICovCisJcHJpdmF0ZSBib29sZWFuIG9uRGVtYW5kID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbXBvcnQgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlCisJICogZ2l2ZW4gQVNULiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uIGluaXRpYWxseSBpcyBhIHNpbmdsZSB0eXBlCisJICogaW1wb3J0IGZvciBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBKYXZhIHR5cGUgbmFtZS4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCUltcG9ydERlY2xhcmF0aW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gSU1QT1JUX0RFQ0xBUkFUSU9OOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlJbXBvcnREZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldE9uRGVtYW5kKGlzT25EZW1hbmQoKSk7CisJCXJlc3VsdC5zZXROYW1lKChOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE5hbWUoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBpbXBvcnRlZCBieSB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIEZvciBhbiBvbi1kZW1hbmQgaW1wb3J0LCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgcGFja2FnZS4gRm9yIGEgCisJICogc2luZ2xlLXR5cGUgaW1wb3J0LCB0aGlzIGlzIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiBhIHR5cGUuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGltcG9ydGVkIG5hbWUgbm9kZQorCSAqLyAKKwlwdWJsaWMgTmFtZSBnZXROYW1lKCkgIHsKKwkJaWYgKGltcG9ydE5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShnZXRBU1QoKS5uZXdRdWFsaWZpZWROYW1lKAorCQkJCW5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSwgbmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKSk7CisJCX0KKwkJcmV0dXJuIGltcG9ydE5hbWU7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24gdG8gdGhlIGdpdmVuIG5hbWUuCisJICogPHA+CisJICogRm9yIGFuIG9uLWRlbWFuZCBpbXBvcnQsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlLiBGb3IgYSAKKwkgKiBzaW5nbGUtdHlwZSBpbXBvcnQsIHRoaXMgaXMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIGEgdHlwZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIG5ldyBpbXBvcnQgbmFtZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLmltcG9ydE5hbWUsIG5hbWUsIGZhbHNlKTsKKwkJdGhpcy5pbXBvcnROYW1lID0gbmFtZTsKKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbiBpcyBhbiBvbi1kZW1hbmQgb3IgYSAKKwkgKiBzaW5nbGUtdHlwZSBpbXBvcnQuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGFuIG9uLWRlbWFuZCBpbXBvcnQsCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgc2luZ2xlIHR5cGUgaW1wb3J0CisJICovIAorCXB1YmxpYyBib29sZWFuIGlzT25EZW1hbmQoKSB7CisJCXJldHVybiBvbkRlbWFuZDsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgd2hldGhlciB0aGlzIGltcG9ydCBkZWNsYXJhdGlvbiBpcyBhbiBvbi1kZW1hbmQgb3IgYSAKKwkgKiBzaW5nbGUtdHlwZSBpbXBvcnQuCisJICogCisJICogQHBhcmFtIG9uRGVtYW5kIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYW4gb24tZGVtYW5kIGltcG9ydCwKKwkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgaXMgYSBzaW5nbGUgdHlwZSBpbXBvcnQKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0T25EZW1hbmQoYm9vbGVhbiBvbkRlbWFuZCkgeworCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5vbkRlbWFuZCA9IG9uRGVtYW5kOworCX0KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2Ugb3IgdHlwZSBpbXBvcnRlZCBieQorCSAqIHRoaXMgaW1wb3J0IGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgYmluZGluZyAoZm9yIG9uLWRlbWFuZCBpbXBvcnRzKSBvciB0eXBlIGJpbmRpbmcKKwkgKiAgICAoZm9yIHNpbmdsZS10eXBlIGltcG9ydHMpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QKKwkgKiAgICBiZSByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlSW1wb3J0KHRoaXMpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGltcG9ydE5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luZml4RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbmZpeEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UxYzIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbmZpeEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEluZml4IGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqCisgKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgb2YgbGVmdCBvcGVyYW5kIGV4cHJlc3Npb24gdGhyb3VnaCBsYXN0IGNoYXJhY3RlcgorICogb2YgdGhlIGxhc3QgZXh0ZW5kZWQgb3BlcmFuZCBleHByZXNzaW9uLiBJZiB0aGVyZSBhcmUgbm8gZXh0ZW5kZWQgb3BlcmFuZHMsCisgKiB0aGUgcmFuZ2UgZW5kcyBhZnRlciB0aGUgcmlnaHQgb3BlcmFuZCBleHByZXNzaW9uLgorICoKKyAqIDxwcmU+CisgKiBJbmZpeEV4cHJlc3Npb246CisgKiAgICBFeHByZXNzaW9uIEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB7IEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB9IAorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEluZml4RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisJLyoqCisgCSAqIEluZml4IG9wZXJhdG9ycyAodHlwZXNhZmUgZW51bWVyYXRpb24pLgorIAkgKiA8cHJlPgorCSAqIEluZml4T3BlcmF0b3I6PGNvZGU+CisJICogICAgPGI+KjwvYj4JVElNRVMKKwkgKiAgICA8Yj4vPC9iPiAgRElWSURFCisJICogICAgPGI+JTwvYj4gIFJFTUFJTkRFUgorCSAqICAgIDxiPis8L2I+ICBQTFVTCisJICogICAgPGI+LTwvYj4gIE1JTlVTCisJICogICAgPGI+Jmx0OyZsdDs8L2I+ICBMRUZUX1NISUZUCisJICogICAgPGI+Jmd0OyZndDs8L2I+ICBSSUdIVF9TSElGVF9TSUdORUQKKwkgKiAgICA8Yj4mZ3Q7Jmd0OyZndDs8L2I+ICBSSUdIVF9TSElGVF9VTlNJR05FRAorCSAqICAgIDxiPiZsdDs8L2I+ICBMRVNTCisJICogICAgPGI+Jmd0OzwvYj4gIEdSRUFURVIKKwkgKiAgICA8Yj4mbHQ7PTwvYj4gIExFU1NfRVFVQUxTCisJICogICAgPGI+Jmd0Oz08L2I+ICBHUkVBVEVSX0VRVUFMUworCSAqICAgIDxiPj09PC9iPiAgRVFVQUxTCisJICogICAgPGI+IT08L2I+ICBOT1RfRVFVQUxTCisJICogICAgPGI+XjwvYj4gIFhPUgorCSAqICAgIDxiPiZhbXA7PC9iPiAgQU5ECisJICogICAgPGI+fDwvYj4gIE9SCisJICogICAgPGI+JmFtcDsmYW1wOzwvYj4gIENPTkRJVElPTkFMX0FORAorCSAqICAgIDxiPnx8PC9iPiAgQ09ORElUSU9OQUxfT1I8L2NvZGU+CisJICogPC9wcmU+CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBPcGVyYXRvciB7CisJCisJCS8qKgorCQkgKiBUaGUgdG9rZW4gZm9yIHRoZSBvcGVyYXRvci4KKwkJICovCisJCXByaXZhdGUgU3RyaW5nIHRva2VuOworCQkKKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBuZXcgaW5maXggb3BlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uCisJCSAqIDxwPgorCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcworCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgorCQkgKiA8L3A+CisJCSAqIAorCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCisJCSAqLworCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyB0b2tlbikgeworCQkJdGhpcy50b2tlbiA9IHRva2VuOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IuCisJCSAqIAorCQkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiB0b2tlbjsKKwkJfQorCQkKKwkJLyoqIE11bHRpcGxpY2F0aW9uICIqIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBUSU1FUyA9IG5ldyBPcGVyYXRvcigiKiIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqIERpdmlzaW9uICIvIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBESVZJREUgPSBuZXcgT3BlcmF0b3IoIi8iKTsvLyROT04tTkxTLTEkCisJCS8qKiBSZW1haW5kZXIgIiUiIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFJFTUFJTkRFUiA9IG5ldyBPcGVyYXRvcigiJSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqIEFkZGl0aW9uIChvciBzdHJpbmcgY29uY2F0ZW5hdGlvbikgIisiIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFBMVVMgPSBuZXcgT3BlcmF0b3IoIisiKTsvLyROT04tTkxTLTEkCisJCS8qKiBTdWJ0cmFjdGlvbiAiLSIgb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgTUlOVVMgPSBuZXcgT3BlcmF0b3IoIi0iKTsvLyROT04tTkxTLTEkCisJCS8qKiBMZWZ0IHNoaWZ0ICImbHQ7Jmx0OyIgb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgTEVGVF9TSElGVCA9IG5ldyBPcGVyYXRvcigiPDwiKTsvLyROT04tTkxTLTEkCisJCS8qKiBTaWduZWQgcmlnaHQgc2hpZnQgIiZndDsmZ3Q7IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBSSUdIVF9TSElGVF9TSUdORUQgPSBuZXcgT3BlcmF0b3IoIj4+Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogVW5zaWduZWQgcmlnaHQgc2hpZnQgIiZndDsmZ3Q7Jmd0OyIgb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgUklHSFRfU0hJRlRfVU5TSUdORUQgPSAKKwkJCW5ldyBPcGVyYXRvcigiPj4+Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogTGVzcyB0aGFuICImbHQ7IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBMRVNTID0gbmV3IE9wZXJhdG9yKCI8Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogR3JlYXRlciB0aGFuICImZ3Q7IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBHUkVBVEVSID0gbmV3IE9wZXJhdG9yKCI+Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogTGVzcyB0aGFuIG9yIGVxdWFscyAiJmx0Oz0iIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIExFU1NfRVFVQUxTID0gbmV3IE9wZXJhdG9yKCI8PSIpOy8vJE5PTi1OTFMtMSQKKwkJLyoqIEdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgIiZndD07IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBHUkVBVEVSX0VRVUFMUyA9IG5ldyBPcGVyYXRvcigiPj0iKTsvLyROT04tTkxTLTEkCisJCS8qKiBFcXVhbHMgIj09IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBFUVVBTFMgPSBuZXcgT3BlcmF0b3IoIj09Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogTm90IGVxdWFscyAiIT0iIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIE5PVF9FUVVBTFMgPSBuZXcgT3BlcmF0b3IoIiE9Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogRXhjbHVzaXZlIE9SICJeIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBYT1IgPSBuZXcgT3BlcmF0b3IoIl4iKTsvLyROT04tTkxTLTEkCisJCS8qKiBJbmNsdXNpdmUgT1IgInwiIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIE9SID0gbmV3IE9wZXJhdG9yKCJ8Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogQU5EICImYW1wOyIgb3BlcmF0b3IuICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0b3IgQU5EID0gbmV3IE9wZXJhdG9yKCImIik7Ly8kTk9OLU5MUy0xJAorCQkvKiogQ29uZGl0aW9uYWwgT1IgInx8IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBDT05ESVRJT05BTF9PUiA9IG5ldyBPcGVyYXRvcigifHwiKTsvLyROT04tTkxTLTEkCisJCS8qKiBDb25kaXRpb25hbCBBTkQgIiZhbXA7JmFtcDsiIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIENPTkRJVElPTkFMX0FORCA9IG5ldyBPcGVyYXRvcigiJiYiKTsvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogTWFwIGZyb20gdG9rZW4gdG8gb3BlcmF0b3IgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OworCQkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5PcGVyYXRvcjwvY29kZT4pLgorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPREVTOworCQlzdGF0aWMgeworCQkJQ09ERVMgPSBuZXcgSGFzaE1hcCgyMCk7CisJCQlPcGVyYXRvcltdIG9wcyA9IHsKKwkJCQkJVElNRVMsCisJCQkJCURJVklERSwKKwkJCQkJUkVNQUlOREVSLAorCQkJCQlQTFVTLAorCQkJCQlNSU5VUywKKwkJCQkJTEVGVF9TSElGVCwKKwkJCQkJUklHSFRfU0hJRlRfU0lHTkVELAorCQkJCQlSSUdIVF9TSElGVF9VTlNJR05FRCwKKwkJCQkJTEVTUywKKwkJCQkJR1JFQVRFUiwKKwkJCQkJTEVTU19FUVVBTFMsCisJCQkJCUdSRUFURVJfRVFVQUxTLAorCQkJCQlFUVVBTFMsCisJCQkJCU5PVF9FUVVBTFMsCisJCQkJCVhPUiwKKwkJCQkJT1IsCisJCQkJCUFORCwKKwkJCQkJQ09ORElUSU9OQUxfT1IsCisJCQkJCUNPTkRJVElPTkFMX0FORCwKKwkJCQl9OworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKKwkJCQlDT0RFUy5wdXQob3BzW2ldLnRvU3RyaW5nKCksIG9wc1tpXSk7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgaW5maXggb3BlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc3RyaW5nLAorCQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCQkgKiA8cD4KKwkJICogPGNvZGU+dG9PcGVyYXRvcjwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKKwkJICogdGhhdCBpcywgPGNvZGU+T3BlcmF0b3IudG9PcGVyYXRvcihvcC50b1N0cmluZygpKSA9PSBvcDwvY29kZT4gZm9yIAorCQkgKiBhbGwgb3BlcmF0b3JzIDxjb2RlPm9wPC9jb2RlPi4KKwkJICogPC9wPgorCQkgKiAKKwkJICogQHBhcmFtIHRva2VuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKiBAcmV0dXJuIHRoZSBpbmZpeCBvcGVyYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBPcGVyYXRvciB0b09wZXJhdG9yKFN0cmluZyB0b2tlbikgeworCQkJcmV0dXJuIChPcGVyYXRvcikgQ09ERVMuZ2V0KHRva2VuKTsKKwkJfQorCQkKKwl9CisJCisJLyoqCisJICogVGhlIGluZml4IG9wZXJhdG9yOyBkZWZhdWx0cyB0byBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUy4KKwkgKi8KKwlwcml2YXRlIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvciA9IEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTOworCisJLyoqCisJICogVGhlIGxlZnQgb3BlcmFuZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcmlnaHQgb3BlcmFuZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiByaWdodE9wZXJhbmQgPSBudWxsOworCisJLyoqCisJICogVGhlIGxpc3Qgb2YgZXh0ZW5kZWQgb3BlcmFuZCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKKwkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIExhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgZXh0ZW5kZWRPcGVyYW5kcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBpbmZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSBvcGVyYXRvciwKKwkgKiBsZWZ0IGFuZCByaWdodCBvcGVyYW5kcywgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgYWRkaXRpb25hbCBvcGVyYW5kcy4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJSW5maXhFeHByZXNzaW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gSU5GSVhfRVhQUkVTU0lPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJSW5maXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJbmZpeEV4cHJlc3Npb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldE9wZXJhdG9yKGdldE9wZXJhdG9yKCkpOworCQlyZXN1bHQuc2V0TGVmdE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldExlZnRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRSaWdodE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldFJpZ2h0T3BlcmFuZCgpLmNsb25lKHRhcmdldCkpOworCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsKSB7CisJCQkvLyBiZSBjYXJlZnVsIG5vdCB0byB0cmlnZ2VyIGxhenkgY3JlYXRpb24gb2YgbGlzdAorCQkJcmVzdWx0LmV4dGVuZGVkT3BlcmFuZHMoKS5hZGRBbGwoCisJCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBleHRlbmRlZE9wZXJhbmRzKCkpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRMZWZ0T3BlcmFuZCgpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJpZ2h0T3BlcmFuZCgpKTsKKwkJCWlmIChleHRlbmRlZE9wZXJhbmRzICE9IG51bGwpIHsKKwkJCQkvLyBiZSBjYXJlZnVsIG5vdCB0byB0cmlnZ2VyIGxhenkgY3JlYXRpb24gb2YgbGlzdAorCQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGV4dGVuZGVkT3BlcmFuZHMpOworCQkJfQorCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG9wZXJhdG9yIG9mIHRoaXMgaW5maXggZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbmZpeCBvcGVyYXRvcgorCSAqLyAKKwlwdWJsaWMgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yIGdldE9wZXJhdG9yKCkgeworCQlyZXR1cm4gb3BlcmF0b3I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBpbmZpeCBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBvcGVyYXRvciB0aGUgaW5maXggb3BlcmF0b3IKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0CisJICovIAorCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgeworCQlpZiAob3BlcmF0b3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoaXMgaW5maXggZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsZWZ0IG9wZXJhbmQgbm9kZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRMZWZ0T3BlcmFuZCgpIHsKKwkJaWYgKGxlZnRPcGVyYW5kICA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRMZWZ0T3BlcmFuZChuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBsZWZ0T3BlcmFuZDsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGlzIGluZml4IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGxlZnQgb3BlcmFuZCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRMZWZ0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEluZml4RXhwcmVzc2lvbiBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLmxlZnRPcGVyYW5kLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5sZWZ0T3BlcmFuZCA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGlzIGluZml4IGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgcmlnaHQgb3BlcmFuZCBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldFJpZ2h0T3BlcmFuZCgpIHsKKwkJaWYgKHJpZ2h0T3BlcmFuZCAgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0UmlnaHRPcGVyYW5kKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIHJpZ2h0T3BlcmFuZDsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgdGhpcyBpbmZpeCBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSByaWdodCBvcGVyYW5kIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFJpZ2h0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEluZml4RXhwcmVzc2lvbiBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLnJpZ2h0T3BlcmFuZCwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMucmlnaHRPcGVyYW5kID0gZXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGVyZSB0aGVyZSBhcmUgYW55IGV4dGVuZGVkIG9wZXJhbmRzLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGV4dGVuZGVkIG9wZXJhbmRzLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGV4dGVuZGVkIG9wZXJhbmRzCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5kZWRPcGVyYW5kcygpIHsKKwkJcmV0dXJuIAorCQkJKGV4dGVuZGVkT3BlcmFuZHMgIT0gbnVsbCkgJiYgZXh0ZW5kZWRPcGVyYW5kcy5zaXplKCkgPiAwOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIGxpc3Qgb2YgZXh0ZW5kZWQgb3BlcmFuZHMuCisJICogPHA+CisJICogVGhlIGV4dGVuZGVkIG9wZXJhbmRzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlcHJlc2VudGluZyBkZWVwbHkgbmVzdGVkCisJICogZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gPGNvZGU+TCBvcCBSIG9wIFIyIG9wIFIzLi4uPC9jb2RlPiB3aGVyZQorCSAqIHRoZSBzYW1lIG9wZXJhdG9yIGFwcGVhcnMgYmV0d2VlbiBhbGwgdGhlIG9wZXJhbmRzICh0aGUgbW9zdCAKKwkgKiBjb21tb24gY2FzZSBiZWluZyBsZW5ndGh5IHN0cmluZyBjb25jYXRlbmF0aW9uIGV4cHJlc3Npb25zKS4gVXNpbmcKKwkgKiB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMga2VlcHMgdGhlIHRyZWVzIGZyb20gZ2V0dGluZyB0b28gZGVlcDsgdGhpcworCSAqIGRlY3JlYXNlcyB0aGUgcmlzayBpcyBydW5uaW5nIG91dCBvZiB0aHJlYWQgc3RhY2sgc3BhY2UgYXQgcnVudGltZQorCSAqIHdoZW4gdHJhdmVyc2luZyBzdWNoIHRyZWVzLgorCSAqICgoYSArIGIpICsgYykgKyBkIHdvdWxkIGJlIHRyYW5zbGF0ZWQgdG86CisJICogCWxlZnRPcGVyYW5kOiBhCisJICogCXJpZ2h0T3BlcmFuZDogYgorCSAqIAlleHRlbmRlZE9wZXJhbmRzOiB7YywgZH0KKwkgKiAJb3BlcmF0b3I6ICsKKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGV4dGVuZGVkIG9wZXJhbmRzCisJICogICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKi8KKwlwdWJsaWMgTGlzdCBleHRlbmRlZE9wZXJhbmRzKCkgeworCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyA9PSBudWxsKSB7CisJCQkvLyBsYXppbHkgaW5pdGlhbGl6ZQorCQkJZXh0ZW5kZWRPcGVyYW5kcyA9IG5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIEV4cHJlc3Npb24uY2xhc3MpOworCQl9CisJCXJldHVybiBleHRlbmRlZE9wZXJhbmRzOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDQgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAobGVmdE9wZXJhbmQgPT0gbnVsbCA/IDAgOiBnZXRMZWZ0T3BlcmFuZCgpLnRyZWVTaXplKCkpCisJCQkrIChyaWdodE9wZXJhbmQgPT0gbnVsbCA/IDAgOiBnZXRSaWdodE9wZXJhbmQoKS50cmVlU2l6ZSgpKQorCQkJKyAoZXh0ZW5kZWRPcGVyYW5kcyA9PSBudWxsID8gMCA6IGV4dGVuZGVkT3BlcmFuZHMubGlzdFNpemUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Jbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmM3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFN0YXRpYyBvciBpbnN0YW5jZSBpbml0aWFsaXplciBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBJbml0aWFsaXplcjoKKyAqICAgICBbIDxiPnN0YXRpYzwvYj4gXSBCbG9jaworICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uIHsKKwkKKwkvKioKKwkgKiBNYXNrIGNvbnRhaW5pbmcgYWxsIGxlZ2FsIG1vZGlmaWVycyBmb3IgdGhpcyBjb25zdHJ1Y3QuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFR0FMX01PRElGSUVSUyA9IE1vZGlmaWVyLlNUQVRJQzsKKwkKKwkvKioKKwkgKiBUaGUgbW9kaWZpZXJzOyBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBmbGFncy4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgaW50IG1vZGlmaWVycyA9IDA7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbGl6ZXIgYm9keTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiBlbXB0eSBibG9jay4KKwkgKi8KKwlwcml2YXRlIEJsb2NrIGJvZHkgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGluaXRpYWxpemVyIGhhcyBubyBtb2RpZmllcnMgYW5kIGFuIGVtcHR5IGJsb2NrLgorCSAqIFRoZSBqYXZhZG9jIGNvbW1lbnQgaXMgbm90IHVzZWQgZm9yIGluaXRpYWxpemVycy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJSW5pdGlhbGl6ZXIoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBJTklUSUFMSVpFUjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJSW5pdGlhbGl6ZXIgcmVzdWx0ID0gbmV3IEluaXRpYWxpemVyKHRhcmdldCk7CisJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOworCQlyZXN1bHQuc2V0SmF2YWRvYygKKwkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwoQVNUTm9kZSkgZ2V0SmF2YWRvYygpKSk7CisJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRKYXZhZG9jKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Qm9keSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgc3RhdGljIGlzIHRoZSBvbmx5IG1lYW5pbmdmdWwgbW9kaWZpZXIgZm9yIGFuIGluaXRpYWxpemVyLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCisJICogQHNlZSBNb2RpZmllcgorCSAqLyAKKwlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJcmV0dXJuIG1vZGlmaWVyczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgc3RhdGljIGlzIHRoZSBvbmx5IG1lYW5pbmdmdWwgbW9kaWZpZXIgZm9yIGFuIGluaXRpYWxpemVyLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCisJICogQHNlZSBNb2RpZmllcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtb2RpZmllcnMgYXJlIGlsbGVnYWwKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKwkJaWYgKChtb2RpZmllcnMgJiB+TEVHQUxfTU9ESUZJRVJTKSAhPSAwKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGJvZHkgb2YgdGhpcyBpbml0aWFsaXplciBkZWNsYXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplciBib2R5CisJICovIAorCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRCb2R5KG5ldyBCbG9jayhnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBib2R5OworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24uCisJICogCisJICogQHBhcmFtIGJvZHkgdGhlIGJsb2NrIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEJvZHkoQmxvY2sgYm9keSkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMuYm9keSwgYm9keSwgdHJ1ZSk7CisJCXRoaXMuYm9keSA9IGJvZHk7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGdldEphdmFkb2MoKSA9PSBudWxsID8gMCA6IGdldEphdmFkb2MoKS50cmVlU2l6ZSgpKQorCQkJKyAoYm9keSA9PSBudWxsID8gMCA6IGdldEJvZHkoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGFkYmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBJbnN0YW5jZW9mIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqCisgKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgb2YgbGVmdCBvcGVyYW5kIGV4cHJlc3Npb24gdGhyb3VnaCBsYXN0IGNoYXJhY3RlcgorICogb2YgdGhlIHJpZ2h0IG9wZXJhbmQgZXhwcmVzc2lvbi4KKyAqCisgKiA8cHJlPgorICogSW5zdGFuY2VvZkV4cHJlc3Npb246CisgKiAgICBFeHByZXNzaW9uIDxiPmluc3RhbmNlb2Y8L2I+IFR5cGUKKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZW9mRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisJLyoqCisJICogVGhlIGxlZnQgb3BlcmFuZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSBuYW1lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcmlnaHQgb3BlcmFuZDsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBidXQgbGVnYWwsIHNpbXBsZSB0eXBlLgorCSAqLworCXByaXZhdGUgVHlwZSByaWdodE9wZXJhbmQgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gaW5zdGFuY2VvZiBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSBvcGVyYXRvciwKKwkgKiBsZWZ0IGFuZCByaWdodCBvcGVyYW5kcy4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJSW5zdGFuY2VvZkV4cHJlc3Npb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBJTlNUQU5DRU9GX0VYUFJFU1NJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUluc3RhbmNlb2ZFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBJbnN0YW5jZW9mRXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVmdE9wZXJhbmQoKEV4cHJlc3Npb24pIGdldExlZnRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRSaWdodE9wZXJhbmQoKFR5cGUpIGdldFJpZ2h0T3BlcmFuZCgpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRMZWZ0T3BlcmFuZCgpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJpZ2h0T3BlcmFuZCgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhpcyBpbnN0YW5jZW9mIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgbGVmdCBvcGVyYW5kIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKSB7CisJCWlmIChsZWZ0T3BlcmFuZCAgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TGVmdE9wZXJhbmQobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gbGVmdE9wZXJhbmQ7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhpcyBpbnN0YW5jZW9mIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGxlZnQgb3BlcmFuZCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRMZWZ0T3BlcmFuZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGFuIEluZml4RXhwcmVzc2lvbiBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLmxlZnRPcGVyYW5kLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5sZWZ0T3BlcmFuZCA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGlzIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSByaWdodCBvcGVyYW5kIG5vZGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0UmlnaHRPcGVyYW5kKCkgeworCQlpZiAocmlnaHRPcGVyYW5kICA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRSaWdodE9wZXJhbmQobmV3IFNpbXBsZVR5cGUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gcmlnaHRPcGVyYW5kOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGlzIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcmVmZXJlbmNlVHlwZSB0aGUgcmlnaHQgb3BlcmFuZCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRSaWdodE9wZXJhbmQoVHlwZSByZWZlcmVuY2VUeXBlKSB7CisJCWlmIChyZWZlcmVuY2VUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhbiBJbnN0YW5jZW9mRXhwcmVzc2lvbiBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLnJpZ2h0T3BlcmFuZCwgcmVmZXJlbmNlVHlwZSwgdHJ1ZSk7CisJCXRoaXMucmlnaHRPcGVyYW5kID0gcmVmZXJlbmNlVHlwZTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrIChsZWZ0T3BlcmFuZCA9PSBudWxsID8gMCA6IGdldExlZnRPcGVyYW5kKCkudHJlZVNpemUoKSkKKwkJCSsgKHJpZ2h0T3BlcmFuZCA9PSBudWxsID8gMCA6IGdldFJpZ2h0T3BlcmFuZCgpLnRyZWVTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9KYXZhZG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MGYzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBU1Qgbm9kZSBmb3IgYSBKYXZhZG9jIGNvbW1lbnQuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFkb2MgZXh0ZW5kcyBBU1ROb2RlIHsKKworCS8qKgorCSAqIFRoZSBqYXZhZG9jIGNvbW1lbnQgc3RyaW5nLCBpbmNsdWRpbmcgb3BlbmluZyBhbmQgY2xvc2luZyBjb21tZW50IAorCSAqIGRlbGltaXRlcnM7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIEphdmFkb2MgY29tbWVudC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjb21tZW50ID0gIi8qKiAqLyI7Ly8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgSmF2YWRvYyBjb21tZW50IG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogVGhlIG5ldyBub2RlIGhhcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBKYXZhZG9jIGNvbW1lbnQuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKKwkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKKwkgKiBhZGRpdGlvbmFsIHN1YmNsYXNzZXMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlKYXZhZG9jKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIEpBVkFET0M7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUphdmFkb2MgcmVzdWx0ID0gbmV3IEphdmFkb2ModGFyZ2V0KTsKKwkJcmVzdWx0LnNldENvbW1lbnQoZ2V0Q29tbWVudCgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKYXZhZG9jIGNvbW1lbnQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nCisJICogYW5kIGVuZGluZyBjb21tZW50IGRlbGltaXRlcnMsIGFuZCBhbnkgZW1iZWRkZWQgbGluZSBicmVha3MuCisJICogCisJICogQHJldHVybiB0aGUgamF2YWRvYyBjb21tZW50IHN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKwkJcmV0dXJuIGNvbW1lbnQ7CisJfQorCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlIEphdmFkb2MgY29tbWVudCBzdHJpbmcuIFRoZSBkb2N1bWVudGF0aW9uCisJICogc3RyaW5nIG11c3QgaW5jbHVkZSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBjb21tZW50IGRlbGltaXRlcnMsCisJICogYW5kIGFueSBlbWJlZGRlZCBsaW5lIGJyZWFrcy4KKwkgKiAKKwkgKiBAcGFyYW0gamF2YWRvY0NvbW1lbnQgdGhlIGphdmFkb2MgY29tbWVudCBzdHJpbmcKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgSmF2YSBjb21tZW50IHN0cmluZyBpcyBpbnZhbGlkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgamF2YWRvY0NvbW1lbnQpIHsKKwkJaWYgKGphdmFkb2NDb21tZW50ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAoamF2YWRvY0NvbW1lbnQubGVuZ3RoKCkgPCA1IHx8ICFqYXZhZG9jQ29tbWVudC5zdGFydHNXaXRoKCIvKioiKSB8fCAhamF2YWRvY0NvbW1lbnQuZW5kc1dpdGgoIiovIikpIHsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmNvbW1lbnQgPSBqYXZhZG9jQ29tbWVudDsKKwl9CisJCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlpbnQgc2l6ZSA9IEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJCXNpemUgKz0gSEVBREVSUyArIDIgKiA0ICsgSEVBREVSUyArIDIgKiBjb21tZW50Lmxlbmd0aCgpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gbWVtU2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9MYWJlbGVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNhMWMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9MYWJlbGVkU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIExhYmVsZWQgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIExhYmVsZWRTdGF0ZW1lbnQ6CisgKiAgICBJZGVudGlmaWVyIDxiPjo8L2I+IFN0YXRlbWVudAorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQkJCisJLyoqCisJICogVGhlIGxhYmVsOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCisJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgU2ltcGxlTmFtZSBsYWJlbE5hbWUgPSBudWxsOworCisJLyoqCisJICogVGhlIGJvZHkgc3RhdGVtZW50OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogbGVnYWwsIHN0YXRlbWVudC4KKwkgKi8KKwlwcml2YXRlIFN0YXRlbWVudCBib2R5ID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgbGFiZWxlZCBzdGF0ZW1lbnQgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHN0YXRlbWVudCBoYXMgYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgbGFiZWwKKwkgKiBhbmQgYW4gdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgc3RhdGVtZW50LgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlMYWJlbGVkU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gTEFCRUxFRF9TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCUxhYmVsZWRTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExhYmVsKAorCQkJKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRMYWJlbCgpKSk7CisJCXJlc3VsdC5zZXRCb2R5KAorCQkJKFN0YXRlbWVudCkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEJvZHkoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRMYWJlbCgpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEJvZHkoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGFiZWwgb2YgdGhpcyBsYWJlbGVkIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBuYW1lIG5vZGUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TGFiZWwoKSB7CisJCWlmIChsYWJlbE5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TGFiZWwobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gbGFiZWxOYW1lOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgbGFiZWwgb2YgdGhpcyBsYWJlbGVkIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gbGFiZWwgdGhlIG5ldyBsYWJlbAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TGFiZWwoU2ltcGxlTmFtZSBsYWJlbCkgeworCQlpZiAobGFiZWwgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLmxhYmVsTmFtZSwgbGFiZWwsIGZhbHNlKTsKKwkJdGhpcy5sYWJlbE5hbWUgPSBsYWJlbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGxhYmVsZWQgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKKwkgKi8gCisJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRCb2R5KG5ldyBFbXB0eVN0YXRlbWVudChnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBib2R5OworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgbGFiZWxlZCBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIHN0YXRlbWVudCB0aGUgYm9keSBzdGF0ZW1lbnQgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0Qm9keShTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJCWlmIChzdGF0ZW1lbnQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgTGFiZWxlZFN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGEgU3RhdGVtZW50IC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuYm9keSwgc3RhdGVtZW50LCB0cnVlKTsKKwkJdGhpcy5ib2R5ID0gc3RhdGVtZW50OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChsYWJlbE5hbWUgPT0gbnVsbCA/IDAgOiBnZXRMYWJlbCgpLnRyZWVTaXplKCkpCisJCQkrIChib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXNzYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2UyZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIEVycm9yIG1lc3NhZ2UgdXNlZCB0byByZXBvcnQgcG90ZW50aWFsIGVycm9ycyBmb3VuZCBkdXJpbmcgdGhlIEFTVCBwYXJzaW5nCisgKiBvciBuYW1lIHJlc29sdXRpb24uIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBpbW11dGFibGUuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZSB7CisJCisJLyoqCisJICogVGhlIG1lc3NhZ2UuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKwkKKwkvKioKKwkgKiBUaGUgY2hhcmFjdGVyIGluZGV4IGludG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzdHJpbmcsIG9yIC0xIGlmIG5vbmUuCisJICovCisJcHJpdmF0ZSBpbnQgc3RhcnRQb3NpdGlvbjsKKwkKKwkvKioKKwkgKiBUaGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGluZGljYXRpbmcKKwkgKiB3aGVyZSB0aGUgc291cmNlIGZyYWdtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXNzYWdlIGVuZHMuCisJICovCisJcHJpdmF0ZSBpbnQgbGVuZ3RoOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBtZXNzYWdlLgorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgY29tcGlsZXIKKwkgKiBAcGFyYW0gc3RhcnRQb3NpdGlvbiB0aGUgMC1iYXNlZCBjaGFyYWN0ZXIgaW5kZXggaW50byB0aGUgCisJICogICAgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzb3VyY2UgcG9zaXRpb24KKwkgKiAgICBpbmZvcm1hdGlvbiBpcyB0byBiZSByZWNvcmRlZCBmb3IgdGhpcyBtZXNzYWdlCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbnVsbAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdGFydFBvc2l0aW9uIGlzIGxvd2VyIHRoYW4gLTEuIAorCSAqLworCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgc3RhcnRQb3NpdGlvbikgeworCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKHN0YXJ0UG9zaXRpb24gPCAtMSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CisJCXRoaXMubGVuZ3RoID0gMDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyCisJICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4IGludG8gdGhlIAorCSAqICAgIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciA8Y29kZT4tMTwvY29kZT4gaWYgbm8gc291cmNlIHBvc2l0aW9uCisJICogICAgaW5mb3JtYXRpb24gaXMgdG8gYmUgcmVjb3JkZWQgZm9yIHRoaXMgbWVzc2FnZQorCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXIgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGluZGljYXRpbmcKKwkgKiAJICB3aGVyZSB0aGUgc291cmNlIGZyYWdtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXNzYWdlIGVuZHMuIDAgb3IgYSBuZWdhdGl2ZSBudW1iZXIgCisJICogICAgaWYgbm9uZS4gQSBuZWdhdGl2ZSBudW1iZXIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSAwLWxlbmd0aC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBudWxsCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0YXJ0UG9zaXRpb24gaXMgbG93ZXIgdGhhbiAtMS4gCisJICovCisJcHVibGljIE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzdGFydFBvc2l0aW9uLCBpbnQgbGVuZ3RoKSB7CisJCWlmIChtZXNzYWdlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAoc3RhcnRQb3NpdGlvbiA8IC0xKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKKwkJaWYgKGxlbmd0aCA8PSAwKSB7CisJCQl0aGlzLmxlbmd0aCA9IDA7CisJCX0gZWxzZSB7CisJCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleCBpbnRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGNoYXJhY3RlciBpbmRleCwgb3IgPGNvZGU+LTE8L2NvZGU+CisJICogICAgaWYgbm8gc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIGZvciB0aGlzCisJICogICAgbWVzc2FnZQorCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRTdGFydFBvc2l0aW9uKCkgaW5zdGVhZC4KKwkgKiBAc2VlICNnZXRMZW5ndGgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7CisJCXJldHVybiBnZXRTdGFydFBvc2l0aW9uKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IGludG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIDAtYmFzZWQgY2hhcmFjdGVyIGluZGV4LCBvciA8Y29kZT4tMTwvY29kZT4KKwkgKiAgICBpZiBubyBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMKKwkgKiAgICBtZXNzYWdlCisJICogQHNlZSAjZ2V0TGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKSB7CisJCXJldHVybiBzdGFydFBvc2l0aW9uOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgaW5kaWNhdGluZworCSAqIHdoZXJlIHRoZSBzb3VyY2UgZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lc3NhZ2UgZW5kcy4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbGVuZ3RoLCBvciA8Y29kZT4wPC9jb2RlPgorCSAqICAgIGlmIG5vIHNvdXJjZSBsZW5ndGggaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgZm9yIHRoaXMgbWVzc2FnZQorCSAqIEBzZWUgI2dldFN0YXJ0UG9zaXRpb24oKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gbGVuZ3RoOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2NjVjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgYmluZGluZ3MuCisgKi8KK2NsYXNzIE1ldGhvZEJpbmRpbmcgaW1wbGVtZW50cyBJTWV0aG9kQmluZGluZyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVHlwZUJpbmRpbmdbXSBOT19QQVJBTUVURVJTID0gbmV3IElUeXBlQmluZGluZ1swXTsKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBiaW5kaW5nOworCXByaXZhdGUgQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyOworCXByaXZhdGUgSVR5cGVCaW5kaW5nW10gcGFyYW1ldGVyVHlwZXM7CisJcHJpdmF0ZSBJVHlwZUJpbmRpbmdbXSBleGNlcHRpb25UeXBlczsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgSVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzOworCXByaXZhdGUgSVR5cGVCaW5kaW5nIHJldHVyblR5cGU7IAorCQorCU1ldGhvZEJpbmRpbmcoQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcgYmluZGluZykgeworCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisJCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisJfQorCQorCS8qCisJICogQHNlZSBJTWV0aG9kQmluZGluZyNpc0NvbnN0cnVjdG9yKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCQlyZXR1cm4gdGhpcy5iaW5kaW5nLmlzQ29uc3RydWN0b3IoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAodGhpcy5iaW5kaW5nLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCW5hbWUgPSB0aGlzLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpOworCQkJfSBlbHNlIHsKKwkJCQluYW1lID0gbmV3IFN0cmluZyh0aGlzLmJpbmRpbmcuc2VsZWN0b3IpOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qCisJICogQHNlZSBJTWV0aG9kQmluZGluZyNnZXREZWNsYXJpbmdDbGFzcygpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXREZWNsYXJpbmdDbGFzcygpIHsKKwkJaWYgKHRoaXMuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeworCQkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IHRoaXMucmVzb2x2ZXIuZ2V0VHlwZUJpbmRpbmcodGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKKwkJfQorCQlyZXR1cm4gZGVjbGFyaW5nQ2xhc3M7CisJfQorCisJLyoKKwkgKiBAc2VlIElNZXRob2RCaW5kaW5nI2dldFBhcmFtZXRlclR5cGVzKCkKKwkgKi8KKwlwdWJsaWMgSVR5cGVCaW5kaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CisJCWlmICh0aGlzLnBhcmFtZXRlclR5cGVzICE9IG51bGwpIHsKKwkJCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKKwkJfQorCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IHRoaXMuYmluZGluZy5wYXJhbWV0ZXJzOworCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIE5PX1BBUkFNRVRFUlM7CisJCX0KKwkJdGhpcy5wYXJhbWV0ZXJUeXBlcyA9IG5ldyBJVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJdGhpcy5wYXJhbWV0ZXJUeXBlc1tpXSA9IHRoaXMucmVzb2x2ZXIuZ2V0VHlwZUJpbmRpbmcocGFyYW1ldGVyc1tpXSk7CisJCX0KKwkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7CisJfQorCisJLyoKKwkgKiBAc2VlIElNZXRob2RCaW5kaW5nI2dldFJldHVyblR5cGUoKQorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0UmV0dXJuVHlwZSgpIHsKKwkJaWYgKHRoaXMucmV0dXJuVHlwZSA9PSBudWxsKSB7CisJCQl0aGlzLnJldHVyblR5cGUgPSB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKHRoaXMuYmluZGluZy5yZXR1cm5UeXBlKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXR1cm5UeXBlOworCX0KKworCS8qCisJICogQHNlZSBJTWV0aG9kQmluZGluZyNnZXRFeGNlcHRpb25UeXBlcygpCisJICovCisJcHVibGljIElUeXBlQmluZGluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCkgeworCQlpZiAodGhpcy5leGNlcHRpb25UeXBlcyAhPSBudWxsKSB7CisJCQlyZXR1cm4gZXhjZXB0aW9uVHlwZXM7CisJCX0KKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZ1tdIGV4Y2VwdGlvbnMgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9uczsKKwkJaW50IGxlbmd0aCA9IGV4Y2VwdGlvbnMubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBOT19QQVJBTUVURVJTOworCQl9CisJCXRoaXMuZXhjZXB0aW9uVHlwZXMgPSBuZXcgSVR5cGVCaW5kaW5nW2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMuZXhjZXB0aW9uVHlwZXNbaV0gPSB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGV4Y2VwdGlvbnNbaV0pOworCQl9CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvblR5cGVzOworCX0KKworCS8qCisJICogQHNlZSBJQmluZGluZyNnZXRLaW5kKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEtpbmQoKSB7CisJCXJldHVybiBJQmluZGluZy5NRVRIT0Q7CisJfQorCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldE1vZGlmaWVycygpCisJICovCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcuZ2V0QWNjZXNzRmxhZ3MoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjaXNEZXByZWNhdGVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaXNEZXByZWNhdGVkKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQmluZGluZyNpc1N5bnRoZXRpYygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaXNTeW50aGV0aWMoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0S2V5KCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRSZXR1cm5UeXBlKCkuZ2V0S2V5KCkpOworCQlpZiAoIWlzQ29uc3RydWN0b3IoKSkgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisJCQlidWZmZXIuYXBwZW5kKCcvJyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0S2V5KCkpOworCQlJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwkJYnVmZmVyLmFwcGVuZCgnKCcpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzW2ldLmdldEtleSgpKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCcpJyk7CisJCUlUeXBlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnMgPSBnZXRFeGNlcHRpb25UeXBlcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0aHJvd25FeGNlcHRpb25zW2ldLmdldEtleSgpKTsKKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwZmI3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogTWV0aG9kIGRlY2xhcmF0aW9uIEFTVCBub2RlIHR5cGUuIEEgbWV0aG9kIGRlY2xhcmF0aW9uCisgKiBpcyB0aGUgdW5pb24gb2YgYSBtZXRob2QgZGVjbGFyYXRpb24gYW5kIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uCisgKgorICogPHByZT4KKyAqIE1ldGhvZERlY2xhcmF0aW9uOgorICogICAgWyBKYXZhZG9jIF0geyBNb2RpZmllciB9ICggVHlwZSB8IDxiPnZvaWQ8L2I+ICkgSWRlbnRpZmllciA8Yj4oPC9iPgorICogICAgICAgIFsgRm9ybWFsUGFyYW1ldGVyIAorICogCQkgICAgIHsgPGI+LDwvYj4gRm9ybWFsUGFyYW1ldGVyIH0gXSA8Yj4pPC9iPiB7PGI+WzwvYj4gPGI+XTwvYj4gfQorICogICAgICAgIFsgPGI+dGhyb3dzPC9iPiBUeXBlTmFtZSB7IDxiPiw8L2I+IFR5cGVOYW1lIH0gXSAoIEJsb2NrIHwgPGI+OzwvYj4gKQorICogQ29uc3RydWN0b3JEZWNsYXJhdGlvbjoKKyAqICAgIFsgSmF2YWRvYyBdIHsgTW9kaWZpZXIgfSBJZGVudGlmaWVyIDxiPig8L2I+CisgKiAJCSAgWyBGb3JtYWxQYXJhbWV0ZXIKKyAqIAkJCSB7IDxiPiw8L2I+IEZvcm1hbFBhcmFtZXRlciB9IF0gPGI+KTwvYj4KKyAqICAgICAgICBbPGI+dGhyb3dzPC9iPiBUeXBlTmFtZSB7IDxiPiw8L2I+IFR5cGVOYW1lIH0gXSBNZXRob2RCb2R5CisgKiA8L3ByZT4KKyAqIE5vcm1hbCBmb3JtOgorICogPHByZT4KKyAqIE1ldGhvZERlY2xhcmF0aW9uOgorICogICAgWyBKYXZhZG9jIF0geyBNb2RpZmllciB9ICggVHlwZSB8IDxiPnZvaWQ8L2I+ICkgSWRlbnRpZmllcgorICogICAgICAgIDxiPig8L2I+IFsgRm9ybWFsUGFyYW10ZXIgeyA8Yj4sPC9iPiBGb3JtYWxQYXJhbWV0ZXIgfSBdIDxiPik8L2I+CisgKiAgICAgICAgWyA8Yj50aHJvd3M8L2I+IFR5cGVOYW1lIHsgPGI+LDwvYj4gVHlwZU5hbWUgfSBdCisgKiAgICAgICAgKCBCbG9jayB8IDxiPjs8L2I+ICkKKyAqIENvbnN0cnVjdG9yRGVjbGFyYXRpb246CisgKiAgICBbIEphdmFkb2MgXSB7IE1vZGlmaWVyIH0gSWRlbnRpZmllcgorICogICAgICAgIDxiPig8L2I+IFsgRm9ybWFsUGFyYW1ldGVyIHsgPGI+LDwvYj4gRm9ybWFsUGFyYW1ldGVyIH0gXSA8Yj4pPC9iPgorICogICAgICAgIFsgPGI+dGhyb3dzPC9iPiBUeXBlTmFtZSB7IDxiPiw8L2I+IFR5cGVOYW1lIH0gXQorICogICAgICAgIEJsb2NrCisgKiA8L3ByZT4gCisgKiA8cD4KKyAqIFdoZW4gYSBKYXZhZG9jIGNvbW1lbnQgaXMgcHJlc2VudCwgdGhlIHNvdXJjZQorICogcmFuZ2UgYmVnaW5zIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgIi8qKiIgY29tbWVudCBkZWxpbWl0ZXIuCisgKiBXaGVuIHRoZXJlIGlzIG5vIEphdmFkb2MgY29tbWVudCwgdGhlIHNvdXJjZSByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgbW9kaWZpZXIga2V5d29yZCAoaWYgbW9kaWZpZXJzKSwgb3IgdGhlCisgKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHJldHVybiB0eXBlIChtZXRob2QsIG5vIG1vZGlmaWVycyksIG9yIHRoZQorICogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpZGVudGlmaWVyIChjb25zdHJ1Y3Rvciwgbm8gbW9kaWZpZXJzKS4KKyAqIFRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgIjsiIHRva2VuIChpZgorICogbm8gYm9keSksIG9yIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgYmxvY2sgKGlmIGJvZHkpLgorICogPC9wPgorICoKKyAqIEBzaW5jZSAyLjAgCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiB7CisJCisJLyoqCisJICogTWFzayBjb250YWluaW5nIGFsbCBsZWdhbCBtb2RpZmllcnMgZm9yIHRoaXMgY29uc3RydWN0LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRUdBTF9NT0RJRklFUlMgPSAKKwkJTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLlBST1RFQ1RFRAorCQl8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuU1lOQ0hST05JWkVECisJCXwgTW9kaWZpZXIuTkFUSVZFIHwgTW9kaWZpZXIuQUJTVFJBQ1QgfCBNb2RpZmllci5TVFJJQ1RGUDsKKwkJCisJLyoqCisJICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgY29uc3RydWN0b3IsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYSBtZXRob2QuCisJICogRGVmYXVsdHMgdG8gbWV0aG9kLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gZmFsc2U7CisJCisJLyoqCisJICogVGhlIG1vZGlmaWVyczsgYml0LXdpc2Ugb3Igb2YgTW9kaWZpZXIgZmxhZ3MuCisJICogRGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIGludCBtb2RpZmllcnMgPSBNb2RpZmllci5OT05FOworCQorCS8qKgorCSAqIFRoZSBtZXRob2QgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhbiB1bnNwZWNpZmllZCwKKwkgKiBsZWdhbCBKYXZhIGlkZW50aWZpZXIuCisJICovCisJcHJpdmF0ZSBTaW1wbGVOYW1lIG1ldGhvZE5hbWUgPSBudWxsOworCQorCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIAorCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L2NvZGU+KS4KKwkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBwYXJhbWV0ZXJzID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QodHJ1ZSwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5jbGFzcyk7OworCQorCS8qKgorCSAqIFRoZSByZXR1cm4gdHlwZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byB2b2lkLiBOb3RlIHRoYXQgdGhpcyAKKwkgKiBmaWVsZCBpcyBub3QgdXNlZCBmb3IgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zLgorCSAqLworCXByaXZhdGUgVHlwZSByZXR1cm5UeXBlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiB0aHJvd24gZXhjZXB0aW9uIG5hbWVzIChlbGVtZW50IHR5cGU6IDxjb2RlPk5hbWU8L2NvZGU+KS4KKwkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCB0aHJvd25FeGNlcHRpb25zID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QoZmFsc2UsIE5hbWUuY2xhc3MpOworCisJLyoqCisJICogVGhlIG1ldGhvZCBib2R5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIERlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBCbG9jayBvcHRpb25hbEJvZHkgPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG93bmVkIAorCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBkZWNsYXJhdGlvbiBpcyBmb3IgYSBtZXRob2Qgb2YgYW4KKwkgKiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIGphdmFkb2M7IG5vIHBhcmFtZXRlcnM7IAorCSAqIHZvaWQgcmV0dXJuIHR5cGU7IG5vIHRocm93biBleGNlcHRpb25zOyBhbmQgbm8gYm9keSAoYXMgb3Bwb3NlZCB0byBhbgorCSAqIGVtcHR5IGJvZHkpLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJTWV0aG9kRGVjbGFyYXRpb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBNRVRIT0RfREVDTEFSQVRJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCU1ldGhvZERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0SmF2YWRvYygKKwkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwoQVNUTm9kZSkgZ2V0SmF2YWRvYygpKSk7CisJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOworCQlyZXN1bHQuc2V0Q29uc3RydWN0b3IoaXNDb25zdHJ1Y3RvcigpKTsKKwkJcmVzdWx0LnNldFJldHVyblR5cGUoCisJCQkoVHlwZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFJldHVyblR5cGUoKSkpOworCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgZ2V0TmFtZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQucGFyYW1ldGVycygpLmFkZEFsbCgKKwkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgcGFyYW1ldGVycygpKSk7CisJCXJlc3VsdC50aHJvd25FeGNlcHRpb25zKCkuYWRkQWxsKAorCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCB0aHJvd25FeGNlcHRpb25zKCkpKTsKKwkJcmVzdWx0LnNldEJvZHkoCisJCQkoQmxvY2spIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRCb2R5KCkpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEphdmFkb2MoKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSZXR1cm5UeXBlKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TmFtZSgpKTsKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHBhcmFtZXRlcnMpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdGhyb3duRXhjZXB0aW9ucyk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRCb2R5KCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgY29uc3RydWN0b3Igb3IgYSBtZXRob2QuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24sCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbWV0aG9kIGRlY2xhcmF0aW9uCisJICovIAorCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CisJCXJldHVybiBpc0NvbnN0cnVjdG9yOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhpcyBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIGNvbnN0cnVjdG9yIG9yIGEgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBpc0NvbnN0cnVjdG9yIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLAorCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGEgbWV0aG9kIGRlY2xhcmF0aW9uCisJICovIAorCXB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5pc0NvbnN0cnVjdG9yID0gaXNDb25zdHJ1Y3RvcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtb2RpZmllcnMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhpcyBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgZGVwcmVjYXRlZCBpcyBub3QgaW5jbHVkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIE1vZGlmaWVyIGNvbnN0YW50cworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKi8gCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiBtb2RpZmllcnM7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzIGFyZSB2YWxpZCBmb3IgbWV0aG9kczogcHVibGljLCBwcml2YXRlLCBwcm90ZWN0ZWQsCisJICogc3RhdGljLCBmaW5hbCwgc3luY2hyb25pemVkLCBuYXRpdmUsIGFic3RyYWN0LCBhbmQgc3RyaWN0ZnAuCisJICogRm9yIGNvbnN0cnVjdG9ycywgb25seSBwdWJsaWMsIHByaXZhdGUsIGFuZCBwcm90ZWN0ZWQgYXJlIG1lYW5pbmdmdWwuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIGJpdC13aXNlIG9yIG9mIE1vZGlmaWVyIGNvbnN0YW50cworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpZXJzIGFyZSBpbGxlZ2FsCisJICovIAorCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisJCWlmICgobW9kaWZpZXJzICYgfkxFR0FMX01PRElGSUVSUykgIT0gMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl9CisKKy8vCXB1YmxpYyBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKCk7IC8vIEpTUi0wMTQKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbi4KKwkgKiBGb3IgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiwgdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgCisJICogb2YgdGhlIGNsYXNzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIG5vZGUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBtZXRob2ROYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgZGVjbGFyZWQgaW4gdGhpcyBtZXRob2QgZGVjbGFyYXRpb24gdG8gdGhlCisJICogZ2l2ZW4gbmFtZS4gRm9yIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24sIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIAorCSAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmV3IG1ldGhvZCBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbWV0aG9kTmFtZSkgeworCQlpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMubWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgZmFsc2UpOworCQl0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIG1ldGhvZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIGZvciB0aGlzCisJICogbWV0aG9kIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBtZXRob2QgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucworCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBwYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gcGFyYW1ldGVyczsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbiBuYW1lcyBpbiB0aGlzIG1ldGhvZCAKKwkgKiBkZWNsYXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgZXhjZXB0aW9uIG5hbWVzCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+TmFtZTwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IHRocm93bkV4Y2VwdGlvbnMoKSB7CisJCXJldHVybiB0aHJvd25FeGNlcHRpb25zOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIGRlY2xhcmVkIGluIHRoaXMgbWV0aG9kIAorCSAqIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIAorCSAqIGlzIG1lYW5pbmdmdWwuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgY2hpbGQgaXMgbm90IHJlbGV2YW50IGZvciBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMKKwkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucykuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJldHVybiB0eXBlLCBwb3NzaWJseSB0aGUgdm9pZCBwcmltaXRpdmUgdHlwZQorCSAqLyAKKwlwdWJsaWMgVHlwZSBnZXRSZXR1cm5UeXBlKCkgeworCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRSZXR1cm5UeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5WT0lEKSk7CisJCX0KKwkJcmV0dXJuIHJldHVyblR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbgorCSAqIHRvIHRoZSBnaXZlbiB0eXBlLiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIGlzCisJICogbWVhbmluZ2Z1bC4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBjaGlsZCBpcyBub3QgcmVsZXZhbnQgZm9yIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucworCSAqIChhbHRob3VnaCBpdCBkb2VzIHN0aWxsIGZpZ3VyZSBpbiBzdWJ0cmVlIGVxdWFsaXR5IGNvbXBhcmlzb25zKS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHR5cGUgdGhlIG5ldyByZXR1cm4gdHlwZSwgcG9zc2libHkgdGhlIHZvaWQgcHJpbWl0aXZlIHR5cGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoVHlwZSB0eXBlKSB7CisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlyZXBsYWNlQ2hpbGQoKEFTVE5vZGUpIHRoaXMucmV0dXJuVHlwZSwgKEFTVE5vZGUpIHR5cGUsIGZhbHNlKTsKKwkJdGhpcy5yZXR1cm5UeXBlID0gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiB0aGlzIG1ldGhvZCBoYXMgPGI+bm88L2I+IGJvZHkuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgc3VidGxlIGRpZmZlcmVuY2UgYmV0d2VlbiBoYXZpbmcgbm8gYm9keSBhbmQgaGF2aW5nCisJICogYW4gZW1wdHkgYm9keSAoInt9IikuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBib2R5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1ldGhvZCBoYXMgbm8KKwkgKiAgICBib2R5CisJICovIAorCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgeworCQlyZXR1cm4gb3B0aW9uYWxCb2R5OworCX0KKworCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHN1YnRsZSBkaWZmZXJlbmNlIGJldHdlZW4gaGF2aW5nIG5vIGJvZHkgCisJICogKGFzIGluIDxjb2RlPiJ2b2lkIGZvbygpOyI8L2NvZGU+KSBhbmQgaGF2aW5nIGFuIGVtcHR5IGJvZHkgKGFzIGluCisJICogInZvaWQgZm9vKCkge30iKS4gQWJzdHJhY3QgbWV0aG9kcywgYW5kIG1ldGhvZHMgZGVjbGFyZWQgaW4gaW50ZXJmYWNlcywKKwkgKiBoYXZlIG5vIGJvZHkuIE5vbi1hYnN0cmFjdCBtZXRob2RzLCBhbmQgYWxsIGNvbnN0cnVjdG9ycywgaGF2ZSBhIGJvZHkuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBib2R5IHRoZSBibG9jayBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRCb2R5KEJsb2NrIGJvZHkpIHsKKwkJLy8gYSBNZXRob2REZWNsYXJhdGlvbiBtYXkgb2NjdXIgaW4gYSBCbG9jayAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wdGlvbmFsQm9keSwgYm9keSwgdHJ1ZSk7CisJCXRoaXMub3B0aW9uYWxCb2R5ID0gYm9keTsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBkZWNsYXJlZAorCSAqIGluIHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKiAgICByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlTWV0aG9kKHRoaXMpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYXBwZW5kRGVidWdTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlidWZmZXIuYXBwZW5kKCJNZXRob2REZWNsYXJhdGlvblsiKTsvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoaXNDb25zdHJ1Y3RvcigpID8gImNvbnN0cnVjdG9yICIgOiAibWV0aG9kICIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCisJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZCA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7CisJCQlkLmdldFR5cGUoKS5hcHBlbmRQcmludFN0cmluZyhidWZmZXIpOworCQkJaWYgKGl0Lmhhc05leHQoKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKKwkJaWYgKCFpc0NvbnN0cnVjdG9yKCkpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIiByZXR1cm5zICIpOy8vJE5PTi1OTFMtMSQKKwkJCWdldFJldHVyblR5cGUoKS5hcHBlbmRQcmludFN0cmluZyhidWZmZXIpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIl0iKTsvLyROT04tTkxTLTEkCisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyA3ICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKQorCQkJKyAoZ2V0SmF2YWRvYygpID09IG51bGwgPyAwIDogZ2V0SmF2YWRvYygpLnRyZWVTaXplKCkpCisJCQkrIChtZXRob2ROYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpCisJCQkrIChyZXR1cm5UeXBlID09IG51bGwgPyAwIDogZ2V0UmV0dXJuVHlwZSgpLnRyZWVTaXplKCkpCisJCQkrIHBhcmFtZXRlcnMubGlzdFNpemUoKQorCQkJKyB0aHJvd25FeGNlcHRpb25zLmxpc3RTaXplKCkKKwkJCSsgKG9wdGlvbmFsQm9keSA9PSBudWxsID8gMCA6IGdldEJvZHkoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kSW52b2NhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RJbnZvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1YzJjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kSW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogTWV0aG9kSW52b2NhdGlvbjoKKyAqCQlbIEV4cHJlc3Npb24gPGI+LjwvYj4gXSBJZGVudGlmaWVyIAorICogCQkJPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+LDwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+KTwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RJbnZvY2F0aW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBvcHRpb25hbEV4cHJlc3Npb24gPSBudWxsOworCQorCS8qKgorCSAqIFRoZSBtZXRob2QgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIEphdmEgbWV0aG9kIG5hbWUuCisJICovCisJcHJpdmF0ZSBTaW1wbGVOYW1lIG1ldGhvZE5hbWUgPSBudWxsOworCQorCS8qKgorCSAqIFRoZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIChlbGVtZW50IHR5cGU6IAorCSAqIDxjb2RlPkV4cHJlc3Npb248L2NvZGU+KS4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgYXJndW1lbnRzID0KKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QodHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcyk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgbm8gZXhwcmVzc2lvbiwgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbWV0aG9kCisJICogbmFtZSwgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgYXJndW1lbnRzLgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlNZXRob2RJbnZvY2F0aW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsJCisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIE1FVEhPRF9JTlZPQ0FUSU9OOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlNZXRob2RJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBNZXRob2RJbnZvY2F0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAorCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKKwkJcmVzdWx0LmFyZ3VtZW50cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGFyZ3VtZW50cygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiwgb3IgCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKwkJcmV0dXJuIG9wdGlvbmFsRXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCS8vIGEgTWV0aG9kSW52b2NhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbEV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLm9wdGlvbmFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludm9rZWQgaW4gdGhpcyBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIG5vZGUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBtZXRob2ROYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW52b2tlZCBpbiB0aGlzIGV4cHJlc3Npb24gdG8gdGhlCisJICogZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG1ldGhvZCBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMubWV0aG9kTmFtZSwgbmFtZSwgZmFsc2UpOworCQl0aGlzLm1ldGhvZE5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHRoaXMgbWV0aG9kCisJICogaW52b2NhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgYXJndW1lbnRzKCkgeworCQlyZXR1cm4gYXJndW1lbnRzOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrIChvcHRpb25hbEV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKKwkJCSsgKG1ldGhvZE5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKKwkJCSsgYXJndW1lbnRzLmxpc3RTaXplKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01vZGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4NTMzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogTW9kaWZpZXIgZmxhZ3MuIFRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVzZSBmbGFncyBtYXRjaCB0aGUgb25lcyBmb3IgY2xhc3MKKyAqIGZpbGVzIGFzIGRlc2NyaWJlZCBpbiB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbi4KKyAqIDxwPgorICogPHByZT4KKyAqIE1vZGlmaWVyOgorICogICAgPGI+cHVibGljPC9iPgorICogICAgPGI+cHJvdGVjdGVkPC9iPgorICogICAgPGI+cHJpdmF0ZTwvYj4KKyAqICAgIDxiPnN0YXRpYzwvYj4KKyAqICAgIDxiPmFic3RyYWN0PC9iPgorICogICAgPGI+ZmluYWw8L2I+CisgKiAgICA8Yj5uYXRpdmU8L2I+CisgKiAgICA8Yj5zeW5jaHJvbml6ZWQ8L2I+CisgKiAgICA8Yj50cmFuc2llbnQ8L2I+CisgKiAgICA8Yj52b2xhdGlsZTwvYj4KKyAqICAgIDxiPnN0cmljdGZwPC9iPgorICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29uc3RhbnRzIGFuZCBzdGF0aWMgbWV0aG9kcyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQKKyAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb2RpZmllciB7CisKKwkvKioKKwkgKiBNb2RpZmllciBjb25zdGFudCAoYml0IG1hc2ssIHZhbHVlIDApIGluZGljYXRpbmcgbm8gbW9kaWZpZXJzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IE5PTkUgPSAweDAwMDA7CisKKwkvKioKKwkgKiAicHVibGljIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgorCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGZpZWxkcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBQVUJMSUMgPSAweDAwMDE7CisKKwkvKioKKwkgKiAicHJpdmF0ZSIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KKwkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBmaWVsZHMuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgUFJJVkFURSA9IDB4MDAwMjsKKworCS8qKgorCSAqICJwcm90ZWN0ZWQiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCisJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgZmllbGRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFBST1RFQ1RFRCA9IDB4MDAwNDsKKworCS8qKgorCSAqICJzdGF0aWMiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCisJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgZmllbGRzLCBhbmQgaW5pdGlhbGl6ZXJzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFNUQVRJQyA9IDB4MDAwODsKKworCS8qKgorCSAqICJmaW5hbCIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KKwkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBmaWVsZHMsIGFuZCB2YXJpYWJsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgRklOQUwgPSAweDAwMTA7CisKKwkvKioKKwkgKiAic3luY2hyb25pemVkIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgorCSAqIEFwcGxpY2FibGUgb25seSB0byBtZXRob2RzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNIUk9OSVpFRCA9IDB4MDAyMDsKKworCS8qKgorCSAqICJ2b2xhdGlsZSIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFZPTEFUSUxFID0gMHgwMDQwOworCisJLyoqCisJICogInRyYW5zaWVudCIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFRSQU5TSUVOVCA9IDB4MDA4MDsKKworCS8qKgorCSAqICJuYXRpdmUiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCisJICogQXBwbGljYWJsZSBvbmx5IHRvIG1ldGhvZHMuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgTkFUSVZFID0gMHgwMTAwOworCisJLyoqCisJICogImFic3RyYWN0IiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgorCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMgYW5kIG1ldGhvZHMuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgQUJTVFJBQ1QgPSAweDA0MDA7CisKKwkvKioKKwkgKiAic3RyaWN0ZnAiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCisJICogQXBwbGljYWJsZSB0byB0eXBlcyBhbmQgbWV0aG9kcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBTVFJJQ1RGUCA9IDB4MDgwMDsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZ3MgaW5jbHVkZXMgdGhlICJwdWJsaWMiIG1vZGlmaWVyLgorCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGZpZWxkcy4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+UFVCTElDPC9jb2RlPiBiaXQgaXMKKwkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWMoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBQVUJMSUMpICE9IDA7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgInByaXZhdGUiIG1vZGlmaWVyLgorCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGZpZWxkcy4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+UFJJVkFURTwvY29kZT4gYml0IGlzCisJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpdmF0ZShpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIFBSSVZBVEUpICE9IDA7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgInByb3RlY3RlZCIgbW9kaWZpZXIuCisJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgZmllbGRzLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5QUk9URUNURUQ8L2NvZGU+IGJpdCBpcworCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3RlY3RlZChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIFBST1RFQ1RFRCkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAic3RhdGljIiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzLCBtZXRob2RzLCBmaWVsZHMsIGFuZCBpbml0aWFsaXplcnMuCisJICogCisJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlNUQVRJQzwvY29kZT4gYml0IGlzCisJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdGljKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgU1RBVElDKSAhPSAwOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZ3MgaW5jbHVkZXMgdGhlICJmaW5hbCIgbW9kaWZpZXIuCisJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgZmllbGRzLCBhbmQgdmFyaWFibGVzLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5GSU5BTDwvY29kZT4gYml0IGlzCisJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmluYWwoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBGSU5BTCkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAic3luY2hyb25pemVkIiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gbWV0aG9kcy4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U1lOQ0hST05JWkVEPC9jb2RlPiBiaXQgaXMKKwkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBTWU5DSFJPTklaRUQpICE9IDA7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgInZvbGF0aWxlIiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5WT0xBVElMRTwvY29kZT4gYml0IGlzCisJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVm9sYXRpbGUoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBWT0xBVElMRSkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAidHJhbnNpZW50IiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5UUkFOU0lFTlQ8L2NvZGU+IGJpdCBpcworCSAqICAgc2V0LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYW5zaWVudChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIFRSQU5TSUVOVCkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAibmF0aXZlIiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gbWV0aG9kcy4KKwkgKiAKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIG1vZGlmaWVyIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+TkFUSVZFPC9jb2RlPiBiaXQgaXMKKwkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYXRpdmUoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBOQVRJVkUpICE9IDA7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgImFic3RyYWN0IiBtb2RpZmllci4KKwkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzIGFuZCBtZXRob2RzLgorCSAqIAorCSAqIEBwYXJhbSBmbGFncyB0aGUgbW9kaWZpZXIgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5BQlNUUkFDVDwvY29kZT4gYml0IGlzCisJICogICBzZXQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWJzdHJhY3QoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBBQlNUUkFDVCkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZsYWdzIGluY2x1ZGVzIHRoZSAic3RyaWN0ZnAiIG1vZGlmaWVyLgorCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMgYW5kIG1ldGhvZHMuCisJICogCisJICogQHBhcmFtIGZsYWdzIHRoZSBtb2RpZmllciBmbGFncworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlNUUklDVEZQPC9jb2RlPiBiaXQgaXMKKwkgKiAgIHNldCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdHJpY3RmcChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIFNUUklDVEZQKSAhPSAwOworCX0KKwkKKwkvKgorCSAqIEJsb2NrIGluc3RhbnRpYXRpb24uCisJICovCisJcHJpdmF0ZSBNb2RpZmllcigpIHsKKwl9CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjE5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05haXZlQVNURmxhdHRlbmVyLmphdmEKQEAgLTAsMCArMSw5NTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEludGVybmFsIEFTVCB2aXNpdG9yIGZvciBzZXJpYWxpemluZyBhbiBBU1QgaW4gYSBxdWNpayBhbmQgZGlydHkgZmFzaGlvbi4KKyAqIEZvciB2YXJpb3VzIHJlYXNvbnMgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgbm90IG5lY2Vzc2FyaWx5IGxlZ2FsCisgKiBKYXZhIGNvZGU7IGFuZCBldmVuIGlmIGl0IGlzIGxlZ2FsIEphdmEgY29kZSwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzdHJpbmcKKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIEFTVC4gQWx0aG91Z2ggdXNlbGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgaXQncworICogZmluZSBmb3IgZ2VuZXJhdGluZyBkZWJ1ZyBwcmludCBzdHJpbmdzLgorICogPHA+CisgKiBFeGFtcGxlIHVzYWdlOgorICogPGNvZGU+CisgKiA8cHJlPgorICogICAgTmFpdmVBU1RGbGF0dGVuZXIgcCA9IG5ldyBOYWl2ZUFTVEZsYXR0ZW5lcigpOworICogICAgbm9kZS5hY2NlcHQocCk7CisgKiAgICBTdHJpbmcgcmVzdWx0ID0gcC5nZXRSZXN1bHQoKTsKKyAqIDwvcHJlPgorICogPC9jb2RlPgorICogQ2FsbCB0aGUgPGNvZGU+cmVzZXQ8L2NvZGU+IG1ldGhvZCB0byBjbGVhciB0aGUgcHJldmlvdXMgcmVzdWx0IGJlZm9yZSByZXVzaW5nIGFuCisgKiBleGlzdGluZyBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitjbGFzcyBOYWl2ZUFTVEZsYXR0ZW5lciBleHRlbmRzIEFTVFZpc2l0b3IgeworCQorCS8qKgorCSAqIFRoZSBzdHJpbmcgYnVmZmVyIGludG8gd2hpY2ggdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFTVCBpcworCSAqIHdyaXR0ZW4uCisJICovCisJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MDAwKTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBwcmludGVyLgorCSAqLworCU5haXZlQVNURmxhdHRlbmVyKCkgeworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgYWNjdW11bGF0ZWQgaW4gdGhlIHZpc2l0LgorCSAqCisJICogQHJldHVybiB0aGUgc2VyaWFsaXplZCAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKKwkJLy8gY29udmVydCB0byBhIHN0cmluZywgYnV0IGxvc2UgYW55IGV4dHJhIHNwYWNlIGluIHRoZSBzdHJpbmcgYnVmZmVyIGJ5IGNvcHlpbmcKKwkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLnRvU3RyaW5nKCkpOworCX0KKwkKKwkvKioKKwkgKiBSZXNldHMgdGhpcyBwcmludGVyIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4uCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCWJ1ZmZlci5zZXRMZW5ndGgoMCk7CisJfQorCQorCS8qKgorCSAqIEFwcGVuZHMgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1vZGlmaWVyIGZsYWdzLCBmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZS4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKKwkgKi8KKwl2b2lkIHByaW50TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKwkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyAiKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKE1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInByb3RlY3RlZCAiKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKE1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKSB7CisJCQlidWZmZXIuYXBwZW5kKCJwcml2YXRlICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgeworCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKSB7CisJCQlidWZmZXIuYXBwZW5kKCJhYnN0cmFjdCAiKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKE1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiZmluYWwgIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChNb2RpZmllci5pc1N5bmNocm9uaXplZChtb2RpZmllcnMpKSB7CisJCQlidWZmZXIuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChNb2RpZmllci5pc1ZvbGF0aWxlKG1vZGlmaWVycykpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInZvbGF0aWxlICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoTW9kaWZpZXIuaXNOYXRpdmUobW9kaWZpZXJzKSkgeworCQkJYnVmZmVyLmFwcGVuZCgibmF0aXZlICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoTW9kaWZpZXIuaXNTdHJpY3RmcChtb2RpZmllcnMpKSB7CisJCQlidWZmZXIuYXBwZW5kKCJzdHJpY3RmcCAiKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKE1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInRyYW5zaWVudCAiKTsvLyROT04tTkxTLTEkCisJCX0KKwl9CQkKKwkKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5ib2R5RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUJvZHlEZWNsYXJhdGlvbiBiID0gKEJvZHlEZWNsYXJhdGlvbikgaXQubmV4dCgpOworCQkJYi5hY2NlcHQodGhpcyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEFycmF5QWNjZXNzKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKKwkJbm9kZS5nZXRBcnJheSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiWyIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRJbmRleCgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiXSIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEFycmF5Q3JlYXRpb24pCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsvLyROT04tTkxTLTEkCisJCUFycmF5VHlwZSBhdCA9IG5vZGUuZ2V0VHlwZSgpOworCQlpbnQgZGltcyA9IGF0LmdldERpbWVuc2lvbnMoKTsKKwkJVHlwZSBlbGVtZW50VHlwZSA9IGF0LmdldEVsZW1lbnRUeXBlKCk7CisJCWVsZW1lbnRUeXBlLmFjY2VwdCh0aGlzKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuZGltZW5zaW9ucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlidWZmZXIuYXBwZW5kKCJbIik7Ly8kTk9OLU5MUy0xJAorCQkJRXhwcmVzc2lvbiBlID0gKEV4cHJlc3Npb24pIGl0Lm5leHQoKTsKKwkJCWUuYWNjZXB0KHRoaXMpOworCQkJYnVmZmVyLmFwcGVuZCgiXSIpOy8vJE5PTi1OTFMtMSQKKwkJCWRpbXMtLTsKKwkJfQorCQkvLyBhZGQgZW1wdHkgIltdIiBmb3IgZWFjaCBleHRyYSBhcnJheSBkaW1lbnNpb24KKwkJZm9yIChpbnQgaT0gMDsgaSA8IGRpbXM7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCgiW10iKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCI9Iik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQXJyYXlJbml0aWFsaXplcikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuZXhwcmVzc2lvbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJRXhwcmVzc2lvbiBlID0gKEV4cHJlc3Npb24pIGl0Lm5leHQoKTsKKwkJCWUuYWNjZXB0KHRoaXMpOworCQkJYnVmZmVyLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlidWZmZXIuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQXJyYXlUeXBlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZSBub2RlKSB7CisJCW5vZGUuZ2V0Q29tcG9uZW50VHlwZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiW10iKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChBc3NlcnRTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgiYXNzZXJ0ICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlpZiAobm9kZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiIDogIik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRNZXNzYWdlKCkuYWNjZXB0KHRoaXMpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChBc3NpZ25tZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgeworCQlub2RlLmdldExlZnRIYW5kU2lkZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSk7CisJCW5vZGUuZ2V0UmlnaHRIYW5kU2lkZSgpLmFjY2VwdCh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KEJsb2NrKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrIG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuc3RhdGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlTdGF0ZW1lbnQgcyA9IChTdGF0ZW1lbnQpIGl0Lm5leHQoKTsKKwkJCXMuYWNjZXB0KHRoaXMpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChCb29sZWFuTGl0ZXJhbCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7CisJCWlmIChub2RlLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInRydWUiKTsvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWZmZXIuYXBwZW5kKCJmYWxzZSIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQnJlYWtTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJicmVhayIpOy8vJE5PTi1OTFMtMSQKKwkJaWYgKG5vZGUuZ2V0TGFiZWwoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQ2FzdEV4cHJlc3Npb24pCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldFR5cGUoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KENhdGNoQ2xhdXNlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgiY2F0Y2ggKCIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeGNlcHRpb24oKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIikgIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldEJvZHkoKS5hY2NlcHQodGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChDaGFyYWN0ZXJMaXRlcmFsKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CisJCWlmIChub2RlLmdldEV4cHJlc3Npb24oKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIm5ldyAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuYXJndW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUV4cHJlc3Npb24gZSA9IChFeHByZXNzaW9uKSBpdC5uZXh0KCk7CisJCQllLmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCisJCWlmIChub2RlLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KENvbXBpbGF0aW9uVW5pdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb21waWxhdGlvblVuaXQgbm9kZSkgeworCQlpZiAobm9kZS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMpOworCQl9CisJCWZvciAoSXRlcmF0b3IgaXQgPSBub2RlLmltcG9ydHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJSW1wb3J0RGVjbGFyYXRpb24gZCA9IChJbXBvcnREZWNsYXJhdGlvbikgaXQubmV4dCgpOworCQkJZC5hY2NlcHQodGhpcyk7CisJCX0KKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUudHlwZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJVHlwZURlY2xhcmF0aW9uIGQgPSAoVHlwZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7CisJCQlkLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiPyIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRUaGVuRXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiOiIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFbHNlRXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJ0aGlzKCIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuYXJndW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUV4cHJlc3Npb24gZSA9IChFeHByZXNzaW9uKSBpdC5uZXh0KCk7CisJCQllLmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIik7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoQ29udGludWVTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJjb250aW51ZSIpOy8vJE5PTi1OTFMtMSQKKwkJaWYgKG5vZGUuZ2V0TGFiZWwoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoRG9TdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJkbyAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0Qm9keSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiIHdoaWxlICgiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiKTsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChFbXB0eVN0YXRlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChFeHByZXNzaW9uU3RhdGVtZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgeworCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChGaWVsZEFjY2VzcykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZEFjY2VzcyBub2RlKSB7CisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiLiIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoRmllbGREZWNsYXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKKwkJaWYgKG5vZGUuZ2V0SmF2YWRvYygpICE9IG51bGwpIHsKKwkJCW5vZGUuZ2V0SmF2YWRvYygpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlwcmludE1vZGlmaWVycyhub2RlLmdldE1vZGlmaWVycygpKTsKKwkJbm9kZS5nZXRUeXBlKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5mcmFnbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGYgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBpdC5uZXh0KCk7CisJCQlmLmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoRm9yU3RhdGVtZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoImZvciAoIik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5pbml0aWFsaXplcnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJRXhwcmVzc2lvbiBlID0gKEV4cHJlc3Npb24pIGl0Lm5leHQoKTsKKwkJCWUuYWNjZXB0KHRoaXMpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIjsgIik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS51cGRhdGVycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlFeHByZXNzaW9uIGUgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOworCQkJZS5hY2NlcHQodGhpcyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiOyAiKTsvLyROT04tTkxTLTEkCisJCWlmIChub2RlLmdldEV4cHJlc3Npb24oKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiKSAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0Qm9keSgpLmFjY2VwdCh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KElmU3RhdGVtZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgiaWYgKCIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRUaGVuU3RhdGVtZW50KCkuYWNjZXB0KHRoaXMpOworCQlpZiAobm9kZS5nZXRFbHNlU3RhdGVtZW50KCkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiIGVsc2UgIik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRFbHNlU3RhdGVtZW50KCkuYWNjZXB0KHRoaXMpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChJbXBvcnREZWNsYXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoImltcG9ydCAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJaWYgKG5vZGUuaXNPbkRlbWFuZCgpKSB7CisJCQlidWZmZXIuYXBwZW5kKCIuKiIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoSW5maXhFeHByZXNzaW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7CisJCW5vZGUuZ2V0TGVmdE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkpOworCQlub2RlLmdldFJpZ2h0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuZXh0ZW5kZWRPcGVyYW5kcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpKTsKKwkJCUV4cHJlc3Npb24gZSA9IChFeHByZXNzaW9uKSBpdC5uZXh0KCk7CisJCQllLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24pCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgeworCQlub2RlLmdldExlZnRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIgaW5zdGFuY2VvZiAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoSW5pdGlhbGl6ZXIpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgeworCQlpZiAobm9kZS5nZXRKYXZhZG9jKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRKYXZhZG9jKCkuYWNjZXB0KHRoaXMpOworCQl9CisJCXByaW50TW9kaWZpZXJzKG5vZGUuZ2V0TW9kaWZpZXJzKCkpOworCQlub2RlLmdldEJvZHkoKS5hY2NlcHQodGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChKYXZhZG9jKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KEphdmFkb2Mgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0Q29tbWVudCgpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KExhYmVsZWRTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7CisJCW5vZGUuZ2V0TGFiZWwoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIjogIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldEJvZHkoKS5hY2NlcHQodGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChNZXRob2REZWNsYXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CisJCWlmIChub2RlLmdldEphdmFkb2MoKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEphdmFkb2MoKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CisJCWlmICghbm9kZS5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCW5vZGUuZ2V0UmV0dXJuVHlwZSgpLmFjY2VwdCh0aGlzKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCisJCX0KKwkJbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5wYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gdiA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7CisJCQl2LmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCisJCWlmICghbm9kZS50aHJvd25FeGNlcHRpb25zKCkuaXNFbXB0eSgpKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgdGhyb3dzICIpOy8vJE5PTi1OTFMtMSQKKwkJCWZvciAoSXRlcmF0b3IgaXQgPSBub2RlLnRocm93bkV4Y2VwdGlvbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJCU5hbWUgbiA9IChOYW1lKSBpdC5uZXh0KCk7CisJCQkJbi5hY2NlcHQodGhpcyk7CisJCQkJaWYgKGl0Lmhhc05leHQoKSkgeworCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChub2RlLmdldEJvZHkoKSA9PSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJbm9kZS5nZXRCb2R5KCkuYWNjZXB0KHRoaXMpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChNZXRob2RJbnZvY2F0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgeworCQlpZiAobm9kZS5nZXRFeHByZXNzaW9uKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQkJYnVmZmVyLmFwcGVuZCgiLiIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCisJCWZvciAoSXRlcmF0b3IgaXQgPSBub2RlLmFyZ3VtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlFeHByZXNzaW9uIGUgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOworCQkJZS5hY2NlcHQodGhpcyk7CisJCQlpZiAoaXQuaGFzTmV4dCgpKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlidWZmZXIuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTnVsbExpdGVyYWwpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJudWxsIik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoTnVtYmVyTGl0ZXJhbCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZChub2RlLmdldFRva2VuKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFBvc3RmaXhFeHByZXNzaW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKKwkJbm9kZS5nZXRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFByZWZpeEV4cHJlc3Npb24pCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkpOworCQlub2RlLmdldE9wZXJhbmQoKS5hY2NlcHQodGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChQcmltaXRpdmVUeXBlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0UHJpbWl0aXZlVHlwZUNvZGUoKS50b1N0cmluZygpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFF1YWxpZmllZE5hbWUpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7CisJCW5vZGUuZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIuIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChSZXR1cm5TdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgicmV0dXJuIik7Ly8kTk9OLU5MUy0xJAorCQlpZiAobm9kZS5nZXRFeHByZXNzaW9uKCkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoU2ltcGxlTmFtZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZChub2RlLmdldElkZW50aWZpZXIoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTaW1wbGVUeXBlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgeworCQlwcmludE1vZGlmaWVycyhub2RlLmdldE1vZGlmaWVycygpKTsKKwkJbm9kZS5nZXRUeXBlKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAorCQlub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcyk7CisJCWlmIChub2RlLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiPSIpOy8vJE5PTi1OTFMtMSQKKwkJCW5vZGUuZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFN0cmluZ0xpdGVyYWwpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CisJCWlmIChub2RlLmdldEV4cHJlc3Npb24oKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWJ1ZmZlci5hcHBlbmQoInN1cGVyKCIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuYXJndW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUV4cHJlc3Npb24gZSA9IChFeHByZXNzaW9uKSBpdC5uZXh0KCk7CisJCQllLmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIik7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoU3VwZXJGaWVsZEFjY2VzcykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKKwkJaWYgKG5vZGUuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcyk7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWJ1ZmZlci5hcHBlbmQoInN1cGVyLiIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisJCWlmIChub2RlLmdldFF1YWxpZmllcigpICE9IG51bGwpIHsKKwkJCW5vZGUuZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMpOworCQkJYnVmZmVyLmFwcGVuZCgiLiIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlidWZmZXIuYXBwZW5kKCJzdXBlci4iKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuYXJndW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUV4cHJlc3Npb24gZSA9IChFeHByZXNzaW9uKSBpdC5uZXh0KCk7CisJCQllLmFjY2VwdCh0aGlzKTsKKwkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTd2l0Y2hDYXNlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJjYXNlICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCI6ICIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFN3aXRjaFN0YXRlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgeworCQlidWZmZXIuYXBwZW5kKCJzd2l0Y2ggKCIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuc3RhdGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlTdGF0ZW1lbnQgcyA9IChTdGF0ZW1lbnQpIGl0Lm5leHQoKTsKKwkJCXMuYWNjZXB0KHRoaXMpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgic3luY2hyb25pemVkICgiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiKSAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0Qm9keSgpLmFjY2VwdCh0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFRoaXNFeHByZXNzaW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKKwkJaWYgKG5vZGUuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcyk7CisJCQlidWZmZXIuYXBwZW5kKCIuIik7Ly8kTk9OLU5MUy0xJAorCQl9CisJCWJ1ZmZlci5hcHBlbmQoInRoaXMiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChUaHJvd1N0YXRlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoInRocm93ICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoVHJ5U3RhdGVtZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7CisJCWJ1ZmZlci5hcHBlbmQoInRyeSAiKTsvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0Qm9keSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuY2F0Y2hDbGF1c2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUNhdGNoQ2xhdXNlIGNjID0gKENhdGNoQ2xhdXNlKSBpdC5uZXh0KCk7CisJCQljYy5hY2NlcHQodGhpcyk7CisJCX0KKwkJaWYgKG5vZGUuZ2V0RmluYWxseSgpICE9IG51bGwpIHsKKwkJCW5vZGUuZ2V0RmluYWxseSgpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoVHlwZURlY2xhcmF0aW9uKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7CisJCWlmIChub2RlLmdldEphdmFkb2MoKSAhPSBudWxsKSB7CisJCQlub2RlLmdldEphdmFkb2MoKS5hY2NlcHQodGhpcyk7CisJCX0KKwkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CisJCWJ1ZmZlci5hcHBlbmQobm9kZS5pc0ludGVyZmFjZSgpID8gImludGVyZmFjZSAiIDogImNsYXNzICIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCW5vZGUuZ2V0TmFtZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJaWYgKG5vZGUuZ2V0U3VwZXJjbGFzcygpICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoImV4dGVuZHMgIik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRTdXBlcmNsYXNzKCkuYWNjZXB0KHRoaXMpOworCQkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoIW5vZGUuc3VwZXJJbnRlcmZhY2VzKCkuaXNFbXB0eSgpKSB7CisJCQlidWZmZXIuYXBwZW5kKG5vZGUuaXNJbnRlcmZhY2UoKSA/ICJleHRlbmRzICIgOiAiaW1wbGVtZW50cyAiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuc3VwZXJJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCQlOYW1lIG4gPSAoTmFtZSkgaXQubmV4dCgpOworCQkJCW4uYWNjZXB0KHRoaXMpOworCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlidWZmZXIuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS5ib2R5RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUJvZHlEZWNsYXJhdGlvbiBkID0gKEJvZHlEZWNsYXJhdGlvbikgaXQubmV4dCgpOworCQkJZC5hY2NlcHQodGhpcyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgeworCQlub2RlLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFR5cGVMaXRlcmFsKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKKwkJbm9kZS5nZXRUeXBlKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CisJCXByaW50TW9kaWZpZXJzKG5vZGUuZ2V0TW9kaWZpZXJzKCkpOworCQlub2RlLmdldFR5cGUoKS5hY2NlcHQodGhpcyk7CisJCWJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCisJCWZvciAoSXRlcmF0b3IgaXQgPSBub2RlLmZyYWdtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGl0Lm5leHQoKTsKKwkJCWYuYWNjZXB0KHRoaXMpOworCQkJaWYgKGl0Lmhhc05leHQoKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKKwkJbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCk7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCgiW10iKTsvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCI9Iik7Ly8kTk9OLU5MUy0xJAorCQkJbm9kZS5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIEFTVFZpc2l0b3IjdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKKwkJcHJpbnRNb2RpZmllcnMobm9kZS5nZXRNb2RpZmllcnMoKSk7CisJCW5vZGUuZ2V0VHlwZSgpLmFjY2VwdCh0aGlzKTsKKwkJYnVmZmVyLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vZGUuZnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgaXQubmV4dCgpOworCQkJZi5hY2NlcHQodGhpcyk7CisJCQlpZiAoaXQuaGFzTmV4dCgpKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBBU1RWaXNpdG9yI3Zpc2l0KFdoaWxlU3RhdGVtZW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIHZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKKwkJYnVmZmVyLmFwcGVuZCgid2hpbGUgKCIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQlidWZmZXIuYXBwZW5kKCIpICIpOy8vJE5PTi1OTFMtMSQKKwkJbm9kZS5nZXRCb2R5KCkuYWNjZXB0KHRoaXMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTNmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05hbWUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IG5hbWVzLgorICogVGhlcmUgYXJlIGV4YWN0bHkgdHdvIGtpbmRzIG9mIG5hbWU6IHNpbXBsZSBvbmVzIAorICogKDxjb2RlPlNpbXBsZU5hbWU8L2NvZGU+KSBhbmQgcXVhbGlmaWVkIG9uZXMgKDxjb2RlPlF1YWxpZmllZE5hbWU8L2NvZGU+KS4KKyAqIDxwPgorICogPHByZT4KKyAqIE5hbWU6CisgKiAgICAgU2ltcGxlTmFtZQorICogICAgIFF1YWxpZmllZE5hbWUKKyAqIDwvcHJlPgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBuYW1lIG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCU5hbWUoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBuYW1lIGlzIGEgc2ltcGxlIG5hbWUKKwkgKiAoPGNvZGU+U2ltcGxlTmFtZTwvY29kZT4pLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHNpbXBsZSBuYW1lLCBhbmQgCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzU2ltcGxlTmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzIGluc3RhbmNlb2YgU2ltcGxlTmFtZSk7CisJfQorCQkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBuYW1lIGlzIGEgcXVhbGlmaWVkIG5hbWUKKwkgKiAoPGNvZGU+UXVhbGlmaWVkTmFtZTwvY29kZT4pLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHF1YWxpZmllZCBuYW1lLCBhbmQgCisJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzUXVhbGlmaWVkTmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSk7CisJfQorCisJLyoqCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSBlbnRpdHkgcmVmZXJyZWQgdG8gYnkgdGhpcyBuYW1lLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKiAgICByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgZmluYWwgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlTmFtZSh0aGlzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bGxMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bGxMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViNTY1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVsbExpdGVyYWwuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBOdWxsIGxpdGVyYWwgbm9kZS4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgTnVsbExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbnVsbCBsaXRlcmFsIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJTnVsbExpdGVyYWwoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBOVUxMX0xJVEVSQUw7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCXJldHVybiBuZXcgTnVsbExpdGVyYWwodGFyZ2V0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIG1lbVNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVtYmVyTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdW1iZXJMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczNGZjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVtYmVyTGl0ZXJhbC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CisKKy8qKgorICogTnVtYmVyIGxpdGVyYWwgbm9kZXMuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIE51bWJlckxpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCS8qKgorCSAqIFRoZSB0b2tlbiBzdHJpbmc7IGRlZmF1bHRzIHRvIHRoZSBpbnRlZ2VyIGxpdGVyYWwgIjAiLgorCSAqLworCXByaXZhdGUgU3RyaW5nIHRva2VuVmFsdWUgPSAiMCI7Ly8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIG51bWJlciBsaXRlcmFsIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiBCeSBkZWZhdWx0LCB0aGUgbnVtYmVyIGxpdGVyYWwgaXMgdGhlIHRva2VuICI8Y29kZT4wPC9jb2RlPiIuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCU51bWJlckxpdGVyYWwoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBOVU1CRVJfTElURVJBTDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJTnVtYmVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgTnVtYmVyTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0VG9rZW4oZ2V0VG9rZW4oKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdG9rZW4gb2YgdGhpcyBudW1iZXIgbGl0ZXJhbCBub2RlLiBUaGUgdmFsdWUgaXMgdGhlIHNlcXVlbmNlCisJICogb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIHByb2dyYW0uCisJICogCisJICogQHJldHVybiB0aGUgbnVtZXJpYyBsaXRlcmFsIHRva2VuCisJICovIAorCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisJCXJldHVybiB0b2tlblZhbHVlOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgdG9rZW4gb2YgdGhpcyBudW1iZXIgbGl0ZXJhbCBub2RlLiBUaGUgdmFsdWUgaXMgdGhlIHNlcXVlbmNlCisJICogb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIHByb2dyYW0uCisJICogCisJICogQHBhcmFtIHRva2VuIHRoZSBudW1lcmljIGxpdGVyYWwgdG9rZW4KKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgaW5jb3JyZWN0CisJICovIAorCXB1YmxpYyB2b2lkIHNldFRva2VuKFN0cmluZyB0b2tlbikgeworCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGgoKSA9PSAwKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJU2Nhbm5lciBzY2FubmVyID0gZ2V0QVNUKCkuc2Nhbm5lcjsKKwkJY2hhcltdIHNvdXJjZSA9IHRva2VuLnRvQ2hhckFycmF5KCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CisJCXNjYW5uZXIucmVzZXRUbygwLCBzb3VyY2UubGVuZ3RoKTsKKwkJdHJ5IHsKKwkJCWludCB0b2tlblR5cGUgPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJc3dpdGNoKHRva2VuVHlwZSkgeworCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVEb3VibGVMaXRlcmFsOgorCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDoKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw6CisJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxvbmdMaXRlcmFsOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTUlOVVMgOgorCQkJCQl0b2tlblR5cGUgPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCQlzd2l0Y2godG9rZW5UeXBlKSB7CisJCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lRG91YmxlTGl0ZXJhbDoKKwkJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDoKKwkJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDoKKwkJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMb25nTGl0ZXJhbDoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCQl9CisJCQkJCWJyZWFrOwkJCisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMudG9rZW5WYWx1ZSA9IHRva2VuOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0OworCQlpZiAodG9rZW5WYWx1ZSAhPSBudWxsKSB7CisJCQlzaXplICs9IEhFQURFUlMgKyAyICogNCArIEhFQURFUlMgKyAyICogdG9rZW5WYWx1ZS5sZW5ndGgoKTsKKwkJfQorCQlyZXR1cm4gc2l6ZTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gbWVtU2l6ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU1ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKKworLyoqCisgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBwYWNrYWdlIGJpbmRpbmdzLgorICovCitjbGFzcyBQYWNrYWdlQmluZGluZyBpbXBsZW1lbnRzIElQYWNrYWdlQmluZGluZyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19OQU1FX0NPTVBPTkVOVFMgPSBuZXcgU3RyaW5nWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTk5BTUVEID0gIlVOTkFNRUQiOy8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBBQ0tBR0VfTkFNRV9TRVBBUkFUT1IgPSAnLic7CisJCisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nIGJpbmRpbmc7CisJcHJpdmF0ZSBCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXI7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZ1tdIGNvbXBvbmVudHM7CisJCQorCVBhY2thZ2VCaW5kaW5nKEJpbmRpbmdSZXNvbHZlciByZXNvbHZlciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyBiaW5kaW5nKSB7CisJCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJY29tcHV0ZU5hbWVBbmRDb21wb25lbnRzKCk7CisJCX0KKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoKKwkgKiBAc2VlIElQYWNrYWdlQmluZGluZyNpc1VubmFtZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5uYW1lZCgpIHsKKwkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoVU5OQU1FRCk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQYWNrYWdlQmluZGluZyNnZXROYW1lQ29tcG9uZW50cygpCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldE5hbWVDb21wb25lbnRzKCkgeworCQlpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CisJCQljb21wdXRlTmFtZUFuZENvbXBvbmVudHMoKTsKKwkJfQorCQlyZXR1cm4gY29tcG9uZW50czsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0S2luZCgpCisJICovCisJcHVibGljIGludCBnZXRLaW5kKCkgeworCQlyZXR1cm4gSUJpbmRpbmcuUEFDS0FHRTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0TW9kaWZpZXJzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQHNlZSBJQmluZGluZyNpc0RlcHJlY2F0ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJpbmRpbmcjaXNTeW50aGV0aWMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldEtleSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBnZXROYW1lKCk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGNvbmNhdChTdHJpbmdbXSBhcnJheSwgY2hhciBjKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcnJheS5sZW5ndGg7IGkgPCBtYXggLSAxOyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoYXJyYXlbaV0pLmFwcGVuZChjKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdKTsKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlTmFtZUFuZENvbXBvbmVudHMoKSB7CisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IHRoaXMuYmluZGluZy5jb21wb3VuZE5hbWU7CisJCWlmIChjb21wb3VuZE5hbWUgPT0gVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyIHx8IGNvbXBvdW5kTmFtZSA9PSBudWxsKSB7CisJCQluYW1lID0gVU5OQU1FRDsKKwkJCWNvbXBvbmVudHMgPSBOT19OQU1FX0NPTVBPTkVOVFM7CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsKKwkJCWNvbXBvbmVudHMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKKwkJCQljb21wb25lbnRzW2ldID0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbaV0pOworCQkJCWJ1ZmZlci5hcHBlbmQoY29tcG91bmROYW1lW2ldKS5hcHBlbmQoUEFDS0FHRV9OQU1FX1NFUEFSQVRPUik7CisJCQl9CisJCQljb21wb25lbnRzW2xlbmd0aCAtIDFdID0gbmV3IFN0cmluZyhjb21wb3VuZE5hbWVbbGVuZ3RoIC0gMV0pOworCQkJYnVmZmVyLmFwcGVuZChjb21wb3VuZE5hbWVbbGVuZ3RoIC0gMV0pOworCQkJbmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOworCQl9CisJfQkJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNjMjdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogUGFja2FnZSBkZWNsYXJhdGlvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBQYWNrYWdlRGVjbGFyYXRpb246CisgKiAgICA8Yj5wYWNrYWdlPC9iPiBOYW1lIDxiPjs8L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUGFja2FnZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIEphdmEgcGFja2FnZSBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgTmFtZSBwYWNrYWdlTmFtZSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHBhY2thZ2UgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlCisJICogZ2l2ZW4gQVNULiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpbml0aWFsbHkgaGFzIGFuIHVuc3BlY2lmaWVkLAorCSAqIGJ1dCBsZWdhbCwgSmF2YSBpZGVudGlmaWVyLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGU7IGFsbCBzdWJjbGFzc2VzIG11c3QgYmUgCisJICogZGVjbGFyZWQgaW4gdGhlIHNhbWUgcGFja2FnZTsgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGRlY2xhcmUgCisJICogYWRkaXRpb25hbCBzdWJjbGFzc2VzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJUGFja2FnZURlY2xhcmF0aW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gUEFDS0FHRV9ERUNMQVJBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJUGFja2FnZURlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBQYWNrYWdlRGVjbGFyYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldE5hbWUoKE5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TmFtZSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBub2RlCisJICovIAorCXB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CisJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIHBhY2thZ2VOYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uIHRvIHRoZSBnaXZlbiBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgcGFja2FnZSBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWZgOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLnBhY2thZ2VOYW1lLCBuYW1lLCBmYWxzZSk7CisJCXRoaXMucGFja2FnZU5hbWUgPSBuYW1lOworCX0KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIHBhY2thZ2UgZGVjbGFyZWQgaW4gdGhpcyBwYWNrYWdlCisJICogZGVjbGFyYXRpb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQorCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqICAgIHJlc29sdmVkCisJICovCQorCXB1YmxpYyBJUGFja2FnZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlUGFja2FnZSh0aGlzKTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChwYWNrYWdlTmFtZT09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmI2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjoKKyAqICAgICA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUGFyZW50aGVzaXplZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKwkvKioKKwkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBoYXMgYW4gdW5zcGVjaWZpZWQsIGJ1dAorCSAqIGxlZ2FsLCBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFBBUkVOVEhFU0laRURfRVhQUkVTU0lPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5ldyBleHByZXNzaW9uIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG1heSBvY2N1ciBpbnNpZGUgYW4gRXhwcmVzc2lvbiAKKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAoZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUG9zdGZpeEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUG9zdGZpeEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzNjIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUG9zdGZpeCBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFBvc3RmaXhFeHByZXNzaW9uOgorICogICAgRXhwcmVzc2lvbiBQb3N0Zml4T3BlcmF0b3IKKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBQb3N0Zml4RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisJLyoqCisgCSAqIFBvc3RmaXggb3BlcmF0b3JzICh0eXBlc2FmZSBlbnVtZXJhdGlvbikuCisJICogPHByZT4KKwkgKiBQb3N0Zml4T3BlcmF0b3I6CisJICogICAgPGI+PGNvZGU+Kys8L2NvZGU+PC9iPiAgPGNvZGU+SU5DUkVNRU5UPC9jb2RlPgorCSAqICAgIDxiPjxjb2RlPi0tPC9jb2RlPjwvYj4gIDxjb2RlPkRFQ1JFTUVOVDwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdG9yIHsKKwkKKwkJLyoqCisJCSAqIFRoZSB0b2tlbiBmb3IgdGhlIG9wZXJhdG9yLgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgdG9rZW47CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBwb3N0Zml4IG9wZXJhdG9yIHdpdGggdGhlIGdpdmVuIHRva2VuLgorCQkgKiA8cD4KKwkJICogTm90ZTogdGhpcyBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLiBUaGUgb25seSBpbnN0YW5jZXMKKwkJICogZXZlciBjcmVhdGVkIGFyZSB0aGUgb25lcyBmb3IgdGhlIHN0YW5kYXJkIG9wZXJhdG9ycy4KKwkJICogPC9wPgorCQkgKiAKKwkJICogQHBhcmFtIHRva2VuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKi8KKwkJcHJpdmF0ZSBPcGVyYXRvcihTdHJpbmcgdG9rZW4pIHsKKwkJCXRoaXMudG9rZW4gPSB0b2tlbjsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yLgorCQkgKiAKKwkJICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gdG9rZW47CisJCX0KKwkJCisJCS8qKiBQb3N0Zml4IGluY3JlbWVudCAiKysiIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIElOQ1JFTUVOVCA9IG5ldyBPcGVyYXRvcigiKysiKTsvLyROT04tTkxTLTEkCisJCS8qKiBQb3N0Zml4IGRlY3JlbWVudCAiLS0iIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIERFQ1JFTUVOVCA9IG5ldyBPcGVyYXRvcigiLS0iKTsvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogTWFwIGZyb20gdG9rZW4gdG8gb3BlcmF0b3IgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OworCQkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5PcGVyYXRvcjwvY29kZT4pLgorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPREVTOworCQlzdGF0aWMgeworCQkJQ09ERVMgPSBuZXcgSGFzaE1hcCgyMCk7CisJCQlPcGVyYXRvcltdIG9wcyA9IHsKKwkJCQkJSU5DUkVNRU5ULAorCQkJCQlERUNSRU1FTlQsCisJCQkJfTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7CisJCQkJQ09ERVMucHV0KG9wc1tpXS50b1N0cmluZygpLCBvcHNbaV0pOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHBvc3RmaXggb3BlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc3RyaW5nLAorCQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCQkgKiA8cD4KKwkJICogPGNvZGU+dG9PcGVyYXRvcjwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKKwkJICogdGhhdCBpcywgPGNvZGU+T3BlcmF0b3IudG9PcGVyYXRvcihvcC50b1N0cmluZygpKSA9PSBvcDwvY29kZT4gZm9yIAorCQkgKiBhbGwgb3BlcmF0b3JzIDxjb2RlPm9wPC9jb2RlPi4KKwkJICogPC9wPgorCQkgKiAKKwkJICogQHBhcmFtIHRva2VuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKiBAcmV0dXJuIHRoZSBwb3N0Zml4IG9wZXJhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJCSAqLworCQlwdWJsaWMgc3RhdGljIE9wZXJhdG9yIHRvT3BlcmF0b3IoU3RyaW5nIHRva2VuKSB7CisJCQlyZXR1cm4gKE9wZXJhdG9yKSBDT0RFUy5nZXQodG9rZW4pOworCQl9CisJfQorCQorCS8qKgorCSAqIFRoZSBvcGVyYXRvcjsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQgcG9zdGZpeCBvcGVyYXRvci4KKwkgKi8KKwlwcml2YXRlIFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yIG9wZXJhdG9yID0gCisJCVBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVDsKKworCS8qKgorCSAqIFRoZSBvcGVyYW5kOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLAorCSAqIGJ1dCBsZWdhbCwgc2ltcGxlIG5hbWUuCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIG9wZXJhbmQgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYW4gcG9zdGZpeCBleHByZXNzaW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSBvcGVyYXRvciBhbmQgCisJICogb3BlcmFuZC4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJUG9zdGZpeEV4cHJlc3Npb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBQT1NURklYX0VYUFJFU1NJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVBvc3RmaXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0T3BlcmF0b3IoZ2V0T3BlcmF0b3IoKSk7CisJCXJlc3VsdC5zZXRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE9wZXJhbmQoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBwb3N0Zml4IGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgb3BlcmF0b3IKKwkgKi8gCisJcHVibGljIFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yIGdldE9wZXJhdG9yKCkgeworCQlyZXR1cm4gb3BlcmF0b3I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBwb3N0Zml4IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIG9wZXJhdG9yIHRoZSBvcGVyYXRvcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IpIHsKKwkJaWYgKG9wZXJhdG9yID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wZXJhbmQgb2YgdGhpcyBwb3N0Zml4IGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgb3BlcmFuZCBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0T3BlcmFuZCgpIHsKKwkJaWYgKG9wZXJhbmQgID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldE9wZXJhbmQobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gb3BlcmFuZDsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIG9wZXJhbmQgb2YgdGhpcyBwb3N0Zml4IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG9wZXJhbmQgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRPcGVyYW5kKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBQb3N0Zml4RXhwcmVzc2lvbiBtYXkgb2NjdXIgaW5zaWRlIGEgRXhwcmVzc2lvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wZXJhbmQsIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLm9wZXJhbmQgPSBleHByZXNzaW9uOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAob3BlcmFuZCA9PSBudWxsID8gMCA6IGdldE9wZXJhbmQoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUHJlZml4RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGM0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFByZWZpeCBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFByZWZpeEV4cHJlc3Npb246CisgKiAgICBQcmVmaXhPcGVyYXRvciBFeHByZXNzaW9uIAorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFByZWZpeEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCS8qKgorIAkgKiBQcmVmaXggb3BlcmF0b3JzICh0eXBlc2FmZSBlbnVtZXJhdGlvbikuCisJICogPHByZT4KKwkgKiBQcmVmaXhPcGVyYXRvcjoKKwkgKiAgICA8Yj48Y29kZT4rKzwvY29kZT48L2I+ICA8Y29kZT5JTkNSRU1FTlQ8L2NvZGU+CisJICogICAgPGI+PGNvZGU+LS08L2NvZGU+PC9iPiAgPGNvZGU+REVDUkVNRU5UPC9jb2RlPgorCSAqICAgIDxiPjxjb2RlPis8L2NvZGU+PC9iPiAgPGNvZGU+UExVUzwvY29kZT4KKwkgKiAgICA8Yj48Y29kZT4tPC9jb2RlPjwvYj4gIDxjb2RlPk1JTlVTPC9jb2RlPgorCSAqICAgIDxiPjxjb2RlPn48L2NvZGU+PC9iPiAgPGNvZGU+Q09NUExFTUVOVDwvY29kZT4KKwkgKiAgICA8Yj48Y29kZT4hPC9jb2RlPjwvYj4gIDxjb2RlPk5PVDwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdG9yIHsKKwkKKwkJLyoqCisJCSAqIFRoZSB0b2tlbiBmb3IgdGhlIG9wZXJhdG9yLgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgdG9rZW47CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBwcmVmaXggb3BlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uCisJCSAqIDxwPgorCQkgKiBOb3RlOiB0aGlzIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuIFRoZSBvbmx5IGluc3RhbmNlcworCQkgKiBldmVyIGNyZWF0ZWQgYXJlIHRoZSBvbmVzIGZvciB0aGUgc3RhbmRhcmQgb3BlcmF0b3JzLgorCQkgKiA8L3A+CisJCSAqIAorCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCisJCSAqLworCQlwcml2YXRlIE9wZXJhdG9yKFN0cmluZyB0b2tlbikgeworCQkJdGhpcy50b2tlbiA9IHRva2VuOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGZvciB0aGUgb3BlcmF0b3IuCisJCSAqIAorCQkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZm9yIHRoZSBvcGVyYXRvcgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiB0b2tlbjsKKwkJfQorCQkKKwkJLyoqIFByZWZpeCBpbmNyZW1lbnQgIisrIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBJTkNSRU1FTlQgPSBuZXcgT3BlcmF0b3IoIisrIik7Ly8kTk9OLU5MUy0xJAorCQkvKiogUHJlZml4IGRlY3JlbWVudCAiLS0iIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIERFQ1JFTUVOVCA9IG5ldyBPcGVyYXRvcigiLS0iKTsvLyROT04tTkxTLTEkCisJCS8qKiBVbmFyeSBwbHVzICIrIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBQTFVTID0gbmV3IE9wZXJhdG9yKCIrIik7Ly8kTk9OLU5MUy0xJAorCQkvKiogVW5hcnkgbWludXMgIi0iIG9wZXJhdG9yLiAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIE1JTlVTID0gbmV3IE9wZXJhdG9yKCItIik7Ly8kTk9OLU5MUy0xJAorCQkvKiogQml0d2lzZSBjb21wbGVtZW50ICJ+IiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBDT01QTEVNRU5UID0gbmV3IE9wZXJhdG9yKCJ+Iik7Ly8kTk9OLU5MUy0xJAorCQkvKiogTG9naWNhbCBjb21wbGVtZW50ICIhIiBvcGVyYXRvci4gKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBOT1QgPSBuZXcgT3BlcmF0b3IoIiEiKTsvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogTWFwIGZyb20gdG9rZW4gdG8gb3BlcmF0b3IgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OworCQkgKiB2YWx1ZSB0eXBlOiA8Y29kZT5PcGVyYXRvcjwvY29kZT4pLgorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPREVTOworCQlzdGF0aWMgeworCQkJQ09ERVMgPSBuZXcgSGFzaE1hcCgyMCk7CisJCQlPcGVyYXRvcltdIG9wcyA9IHsKKwkJCQkJSU5DUkVNRU5ULAorCQkJCQlERUNSRU1FTlQsCisJCQkJCVBMVVMsCisJCQkJCU1JTlVTLAorCQkJCQlDT01QTEVNRU5ULAorCQkJCQlOT1QsCisJCQkJfTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7CisJCQkJQ09ERVMucHV0KG9wc1tpXS50b1N0cmluZygpLCBvcHNbaV0pOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHByZWZpeCBvcGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBzdHJpbmcsCisJCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJCSAqIDxwPgorCQkgKiA8Y29kZT50b09wZXJhdG9yPC9jb2RlPiBpcyB0aGUgY29udmVyc2Ugb2YgPGNvZGU+dG9TdHJpbmc8L2NvZGU+OgorCQkgKiB0aGF0IGlzLCA8Y29kZT5PcGVyYXRvci50b09wZXJhdG9yKG9wLnRvU3RyaW5nKCkpID09IG9wPC9jb2RlPiBmb3IgCisJCSAqIGFsbCBvcGVyYXRvcnMgPGNvZGU+b3A8L2NvZGU+LgorCQkgKiA8L3A+CisJCSAqIAorCQkgKiBAcGFyYW0gdG9rZW4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBmb3IgdGhlIG9wZXJhdG9yCisJCSAqIEByZXR1cm4gdGhlIHByZWZpeCBvcGVyYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBPcGVyYXRvciB0b09wZXJhdG9yKFN0cmluZyB0b2tlbikgeworCQkJcmV0dXJuIChPcGVyYXRvcikgQ09ERVMuZ2V0KHRva2VuKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBUaGUgb3BlcmF0b3I7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkIHByZWZpeCBvcGVyYXRvci4KKwkgKi8KKwlwcml2YXRlIFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IgPSAKKwkJUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTOworCisJLyoqCisJICogVGhlIG9wZXJhbmQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogYnV0IGxlZ2FsLCBzaW1wbGUgbmFtZS4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gb3BlcmFuZCA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhbiBwcmVmaXggZXhwcmVzc2lvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgbm9kZSBoYXMgdW5zcGVjaWZpZWQgKGJ1dCBsZWdhbCkgb3BlcmF0b3IgYW5kIAorCSAqIG9wZXJhbmQuCisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVByZWZpeEV4cHJlc3Npb24oQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBQUkVGSVhfRVhQUkVTU0lPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJUHJlZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJlZml4RXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0T3BlcmF0b3IoZ2V0T3BlcmF0b3IoKSk7CisJCXJlc3VsdC5zZXRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE9wZXJhbmQoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgb3BlcmF0b3Igb2YgdGhpcyBwcmVmaXggZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBvcGVyYXRvcgorCSAqLyAKKwlwdWJsaWMgUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKwkJcmV0dXJuIG9wZXJhdG9yOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG9wZXJhdG9yIG9mIHRoaXMgcHJlZml4IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIG9wZXJhdG9yIHRoZSBvcGVyYXRvcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgeworCQlpZiAob3BlcmF0b3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgb3BlcmFuZCBvZiB0aGlzIHByZWZpeCBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9wZXJhbmQgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldE9wZXJhbmQoKSB7CisJCWlmIChvcGVyYW5kICA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRPcGVyYW5kKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIG9wZXJhbmQ7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBvcGVyYW5kIG9mIHRoaXMgcHJlZml4IGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG9wZXJhbmQgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRPcGVyYW5kKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBQcmVmaXhFeHByZXNzaW9uIG1heSBvY2N1ciBpbnNpZGUgYSBFeHByZXNzaW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3BlcmFuZCwgZXhwcmVzc2lvbiwgdHJ1ZSk7CisJCXRoaXMub3BlcmFuZCA9IGV4cHJlc3Npb247CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrIChvcGVyYW5kID09IG51bGwgPyAwIDogZ2V0T3BlcmFuZCgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QcmltaXRpdmVUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByaW1pdGl2ZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdiYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QcmltaXRpdmVUeXBlLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBQcmltaXRpdmUgdHlwZSBub2Rlcy4KKyAqIDxwcmU+CisgKiBQcmltaXRpdmVUeXBlOgorICogICAgPGI+Ynl0ZTwvYj4KKyAqICAgIDxiPnNob3J0PC9iPgorICogICAgPGI+Y2hhcjwvYj4KKyAqICAgIDxiPmludDwvYj4KKyAqICAgIDxiPmxvbmc8L2I+CisgKiAgICA8Yj5mbG9hdDwvYj4KKyAqICAgIDxiPmRvdWJsZTwvYj4KKyAqICAgIDxiPmJvb2xlYW48L2I+CisgKiAgICA8Yj52b2lkPC9iPgorICogPC9wcmU+CisgKiA8cD4KKyAqIE5vdGUgdGhhdCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBBU1Qgbm9kZXMgYmVsb25nIHRvIGEgc3BlY2lmaWMgQVNUIGFuZAorICogaGF2ZSBhIHNwZWNpZmljIHBhcmVudCwgdGhlcmUgbmVlZHMgdG8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZXNlCisgKiBub2Rlcy4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworCQorCS8qKgorIAkgKiBQcmltaXRpdmUgdHlwZSBjb2RlcyAodHlwZXNhZmUgZW51bWVyYXRpb24pLgorCSAqIDxwcmU+CisJICogICAgPGI+Ynl0ZTwvYj4gCUJZVEUKKwkgKiAgICA8Yj5zaG9ydDwvYj4gCVNIT1JUCisJICogICAgPGI+Y2hhcjwvYj4gCUNIQVIKKwkgKiAgICA8Yj5pbnQ8L2I+ICAJSU5UCisJICogICAgPGI+bG9uZzwvYj4gIAlMT05HCisJICogICAgPGI+ZmxvYXQ8L2I+ICAJRkxPQVQKKwkgKiAgICA8Yj5kb3VibGU8L2I+IAlET1VCTEUKKwkgKiAgICA8Yj5ib29sZWFuPC9iPglCT09MRUFOCisJICogICAgPGI+dm9pZDwvYj4gIAlWT0lECisJICogPC9wcmU+CisJICovCisJcHVibGljIHN0YXRpYyBjbGFzcyBDb2RlIHsKKwkKKwkJLyoqCisJCSAqIFRoZSBuYW1lIG9mIHRoZSB0eXBlLgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHByaW1pdGl2ZSB0eXBlIGNvZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkJICogPHA+CisJCSAqIE5vdGU6IHRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLiBUaGUgb25seSBpbnN0YW5jZXMKKwkJICogZXZlciBjcmVhdGVkIGFyZSB0aGUgb25lcyBmb3IgdGhlIHN0YW5kYXJkIHByaW1pdGl2ZSB0eXBlcy4KKwkJICogPC9wPgorCQkgKiAKKwkJICogQHBhcmFtIG5hbWUgdGhlIHN0YW5kYXJkIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlCisJCSAqLworCQlDb2RlKFN0cmluZyBuYW1lKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgc3RhbmRhcmQgbmFtZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUuCisJCSAqIAorCQkgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBuYW1lIG9mIHRoZSBwcmltaXRpdmUgdHlwZQorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisJfQkJCisJCisJLyoqIFR5cGUgY29kZSBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlICJpbnQiLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29kZSBJTlQgPSBuZXcgQ29kZSgiaW50Iik7Ly8kTk9OLU5MUy0xJAorCS8qKiBUeXBlIGNvZGUgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSAiY2hhciIuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIENIQVIgPSBuZXcgQ29kZSgiY2hhciIpOy8vJE5PTi1OTFMtMSQKKwkvKiogVHlwZSBjb2RlIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgImJvb2xlYW4iLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29kZSBCT09MRUFOID0gbmV3IENvZGUoImJvb2xlYW4iKTsvLyROT04tTkxTLTEkCisJLyoqIFR5cGUgY29kZSBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlICJzaG9ydCIuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIFNIT1JUID0gbmV3IENvZGUoInNob3J0Iik7Ly8kTk9OLU5MUy0xJAorCS8qKiBUeXBlIGNvZGUgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSAibG9uZyIuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIExPTkcgPSBuZXcgQ29kZSgibG9uZyIpOy8vJE5PTi1OTFMtMSQKKwkvKiogVHlwZSBjb2RlIGZvciB0aGUgcHJpbWl0aXZlIHR5cGUgImZsb2F0Ii4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvZGUgRkxPQVQgPSBuZXcgQ29kZSgiZmxvYXQiKTsvLyROT04tTkxTLTEkCisJLyoqIFR5cGUgY29kZSBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlICJkb3VibGUiLiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29kZSBET1VCTEUgPSBuZXcgQ29kZSgiZG91YmxlIik7Ly8kTk9OLU5MUy0xJAorCS8qKiBUeXBlIGNvZGUgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSAiYnl0ZSIuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb2RlIEJZVEUgPSBuZXcgQ29kZSgiYnl0ZSIpOy8vJE5PTi1OTFMtMSQKKworCS8qKiBUeXBlIGNvZGUgZm9yIHRoZSBwcmltaXRpdmUgdHlwZSAidm9pZCIuIE5vdGUgdGhhdCAidm9pZCIgaXMKKwkgKiBzcGVjaWFsIGluIHRoYXQgaXRzIG9ubHkgbGVnaXRpbWF0ZSB1c2VzIGFyZSBhcyBhIG1ldGhvZCByZXR1cm4KKwkgKiB0eXBlIGFuZCBhcyBhIHR5cGUgbGl0ZXJhbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvZGUgVk9JRCA9IG5ldyBDb2RlKCJ2b2lkIik7Ly8kTk9OLU5MUy0xJAorCQkKKwkvKiogCisJICogVGhlIHByaW1pdGl2ZSB0eXBlIGNvZGU7IG9uZSBvZiB0aGUgUHJpbWl0aXZlVHlwZSBjb25zdGFudHM7IGRlZmF1bHQKKwkgKiBpcyBpbnQuCisJICovCisJcHJpdmF0ZSBQcmltaXRpdmVUeXBlLkNvZGUgdHlwZUNvZGUgPSBJTlQ7CisJCisJLyoqCisJICogTWFwIGZyb20gdG9rZW4gdG8gcHJpbWl0aXZlIHR5cGUgY29kZSAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47CisJICogdmFsdWUgdHlwZTogPGNvZGU+UHJpbWl0aXZlVHlwZS5Db2RlPC9jb2RlPikuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPREVTOworCXN0YXRpYyB7CisJCUNPREVTID0gbmV3IEhhc2hNYXAoMjApOworCQlDb2RlW10gb3BzID0geworCQkJCUlOVCwKKwkJCQlCWVRFLAorCQkJCUNIQVIsCisJCQkJQk9PTEVBTiwKKwkJCQlTSE9SVCwKKwkJCQlMT05HLAorCQkJCUZMT0FULAorCQkJCURPVUJMRSwKKwkJCQlWT0lELAorCQkJfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKKwkJCUNPREVTLnB1dChvcHNbaV0udG9TdHJpbmcoKSwgb3BzW2ldKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHN0cmluZywKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorCSAqIDxwPgorCSAqIDxjb2RlPnRvQ29kZTwvY29kZT4gaXMgdGhlIGNvbnZlcnNlIG9mIDxjb2RlPnRvU3RyaW5nPC9jb2RlPjoKKwkgKiB0aGF0IGlzLCAKKwkgKiA8Y29kZT5QcmltaXRpdmVUeXBlLkNvZGUudG9Db2RlKGNvZGUudG9TdHJpbmcoKSkgPT0gY29kZTwvY29kZT4KKwkgKiBmb3IgYWxsIHR5cGUgY29kZSA8Y29kZT5jb2RlPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHRva2VuIHRoZSBzdGFuZGFyZCBuYW1lIG9mIHRoZSBwcmltaXRpdmUgdHlwZQorCSAqIEByZXR1cm4gdGhlIHByaW1pdGl2ZSB0eXBlIGNvZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFByaW1pdGl2ZVR5cGUuQ29kZSB0b0NvZGUoU3RyaW5nIHRva2VuKSB7CisJCXJldHVybiAoUHJpbWl0aXZlVHlwZS5Db2RlKSBDT0RFUy5nZXQodG9rZW4pOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYSBwcmltaXRpdmUgdHlwZSBvd25lZCBieSB0aGUgZ2l2ZW4KKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBub2RlIGhhcyB0eXBlICJpbnQiLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlQcmltaXRpdmVUeXBlKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFBSSU1JVElWRV9UWVBFOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlQcmltaXRpdmVUeXBlIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVUeXBlKHRhcmdldCk7CisJCXJlc3VsdC5zZXRQcmltaXRpdmVUeXBlQ29kZShnZXRQcmltaXRpdmVUeXBlQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlLgorCSAqIAorCSAqIEByZXR1cm4gb25lIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlIGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGlzCisJICogICAgY2xhc3MKKwkgKi8KKwlwdWJsaWMgUHJpbWl0aXZlVHlwZS5Db2RlIGdldFByaW1pdGl2ZVR5cGVDb2RlKCkgeworCQlyZXR1cm4gdHlwZUNvZGU7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHByaW1pdGl2ZSB0eXBlIGNvZGUuCisJICogCisJICogQHBhcmFtIHR5cGVDb2RlIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZSBjb25zdGFudHMgZGVjbGFyZWQgaW4gCisJICogICAgdGhpcyBjbGFzcworCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcmltaXRpdmVUeXBlQ29kZShQcmltaXRpdmVUeXBlLkNvZGUgdHlwZUNvZGUpIHsKKwkJaWYgKHR5cGVDb2RlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy50eXBlQ29kZSA9IHR5cGVDb2RlOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIG1lbVNpemUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1F1YWxpZmllZE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUXVhbGlmaWVkTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDQ3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1F1YWxpZmllZE5hbWUuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQVNUIG5vZGUgZm9yIGEgcXVhbGlmaWVkIG5hbWUuIEEgcXVhbGlmaWVkIG5hbWUgaXMgZGVmaW5lZCByZWN1cnNpdmVseQorICogYXMgYSBzaW1wbGUgbmFtZSBwcmVjZWRlZCBieSBhIG5hbWUsIHdoaWNoIHF1YWxpZmllcyBpdC4gRXhwcmVzc2luZyBpdCB0aGlzCisgKiB3YXkgbWVhbnMgdGhhdCB0aGUgcXVhbGlmaWVyIGFuZCB0aGUgc2ltcGxlIG5hbWUgZ2V0IHRoZWlyIG93biBBU1Qgbm9kZXMuCisgKiA8cHJlPgorICogUXVhbGlmaWVkTmFtZToKKyAqICAgIE5hbWUgPGI+LjwvYj4gU2ltcGxlTmFtZQorICogPC9wcmU+CisgKgorICogUmFuZ2UgMDogZmlyc3QgY2hhcmFjdGVyIG9mIHF1YWxpZmllZCBuYW1lIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyCisgKiBvZiB0aGUgc2ltcGxlIG5hbWUuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZSBleHRlbmRzIE5hbWUgeworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsIGxlZ2FsIAorCSAqIEphdmEgaWRlbnRpZmllci4KKwkgKi8KKwlwcml2YXRlIE5hbWUgcXVhbGlmaWVyID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUgbmFtZSBiZWluZyBxdWFsaWZpZWQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKKwkgKiBsZWdhbCBKYXZhIGlkZW50aWZpZXIuCisJICovCisJcHJpdmF0ZSBTaW1wbGVOYW1lIG5hbWUgPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgcXVhbGlmaWVkIG5hbWUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVF1YWxpZmllZE5hbWUoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gUVVBTElGSUVEX05BTUU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZE5hbWUodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFF1YWxpZmllcigoTmFtZSkgZ2V0UXVhbGlmaWVyKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFF1YWxpZmllcigpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE5hbWUoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcXVhbGlmaWVyIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZXIgcGFydCBvZiB0aGlzIHF1YWxpZmllZCBuYW1lCisJICovIAorCXB1YmxpYyBOYW1lIGdldFF1YWxpZmllcigpIHsKKwkJaWYgKHF1YWxpZmllciA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRRdWFsaWZpZXIobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gcXVhbGlmaWVyOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGhlIHF1YWxpZmllciBvZiB0aGlzIHF1YWxpZmllZCBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoTmFtZSBxdWFsaWZpZXIpIHsKKwkJaWYgKHF1YWxpZmllciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBRdWFsaWZpZWROYW1lIG1heSBvY2N1ciBpbnNpZGUgYSBRdWFsaWZpZWROYW1lIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKChBU1ROb2RlKSB0aGlzLnF1YWxpZmllciwgKEFTVE5vZGUpIHF1YWxpZmllciwgdHJ1ZSk7CisJCXRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIGJlaW5nIHF1YWxpZmllZCAKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBuYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIHBhcnQgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZSB0byB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBxdWFsaWZpZWQgbmFtZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCh0aGlzLm5hbWUsIG5hbWUsIGZhbHNlKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAobmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKQorCQkJKyAocXVhbGlmaWVyID09IG51bGwgPyAwIDogZ2V0UXVhbGlmaWVyKCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JldHVyblN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZXR1cm5TdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ2ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogUmV0dXJuIHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBSZXR1cm5TdGF0ZW1lbnQ6CisgKiAgICA8Yj5yZXR1cm48L2I+IFsgRXhwcmVzc2lvbiBdIDxiPjs8L2I+CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkJCQorCS8qKgorCSAqIFRoZSBleHByZXNzaW9uOyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZTsgZGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gb3B0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIHJldHVybiBzdGF0ZW1lbnQgb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHN0YXRlbWVudCBoYXMgbm8gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJUmV0dXJuU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gUkVUVVJOX1NUQVRFTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJUmV0dXJuU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigKKwkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhwcmVzc2lvbigpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHJldHVybiBzdGF0ZW1lbnQsIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCXJldHVybiBvcHRpb25hbEV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgcmV0dXJuIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQkvLyBhIFJldHVyblN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbEV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLm9wdGlvbmFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKG9wdGlvbmFsRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiNTA4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlTmFtZS5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CisKKy8qKgorICogQVNUIG5vZGUgZm9yIGEgc2ltcGxlIG5hbWUuIEEgc2ltcGxlIG5hbWUgaXMgYW4gaWRlbnRpZmllciBvdGhlciB0aGFuCisgKiBhIGtleXdvcmQsIGJvb2xlYW4gbGl0ZXJhbCAoInRydWUiLCAiZmFsc2UiKSBvciBudWxsIGxpdGVyYWwgKCJudWxsIikuCisgKiA8cD4KKyAqIFJhbmdlIDA6IGZpcnN0IGNoYXJhY3RlciB0aHJvdWdoIGxhc3QgY2hhcmFjdGVyIG9mIGlkZW50aWZpZXIuCisgKiA8L3A+CisgKiA8cHJlPgorICogU2ltcGxlTmFtZToKKyAqICAgICBJZGVudGlmaWVyCisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlTmFtZSBleHRlbmRzIE5hbWUgeworCisJLyoqCisJICogQW4gdW5zcGVjaWZpZWQgKGJ1dCBleHRlcm5hbGx5IG9ic2VydmFibGUpIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19JREVOVElGSUVSID0gIk1JU1NJTkciOy8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllcjsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgbGVnYWwgSmF2YSBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGlkZW50aWZpZXIgPSBNSVNTSU5HX0lERU5USUZJRVI7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBzaW1wbGUgbmFtZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIFRoZSBuZXcgbm9kZSBoYXMgYW4gdW5zcGVjaWZpZWQsIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVNpbXBsZU5hbWUoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gU0lNUExFX05BTUU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVNpbXBsZU5hbWUgcmVzdWx0ID0gbmV3IFNpbXBsZU5hbWUodGFyZ2V0KTsKKwkJcmVzdWx0LnNldElkZW50aWZpZXIoZ2V0SWRlbnRpZmllcigpKTsKKwkJaW50IHN0YXJ0UG9zaXRpb24gPSBnZXRTdGFydFBvc2l0aW9uKCk7CisJCWludCBsZW5ndGggPSBnZXRMZW5ndGgoKTsKKwkJaWYgKHN0YXJ0UG9zaXRpb24gPj0gMCAmJiBsZW5ndGggPiAwKSB7CisJCQlyZXN1bHQuc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgbGVuZ3RoKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBub2RlJ3MgaWRlbnRpZmllci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgbm9kZQorCSAqLyAKKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZGVudGlmaWVyOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgbm9kZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCisJICogVGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGxlZ2FsIGFjY29yZGluZyB0byB0aGUgcnVsZXMKKwkgKiBvZiB0aGUgSmF2YSBsYW5ndWFnZS4gTm90ZSB0aGF0IGtleXdvcmRzIGFyZSBub3QgbGVnYWwKKwkgKiBpZGVudGlmaWVycy4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhlIGxpc3Qgb2Yga2V5d29yZHMgbWF5IGRlcGVuZCBvbiB0aGUgdmVyc2lvbiBvZiB0aGUKKwkgKiBsYW5ndWFnZSAoZGV0ZXJtaW5lZCB3aGVuIHRoZSBBU1Qgb2JqZWN0IHdhcyBjcmVhdGVkKS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGlkZW50aWZpZXIgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGlkZW50aWZpZXIgaXMgaW52YWxpZAorCSAqIEBzZWUgQVNUI0FTVChqYXZhLnV0aWwuTWFwKQorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CisJCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlTY2FubmVyIHNjYW5uZXIgPSBnZXRBU1QoKS5zY2FubmVyOworCQljaGFyW10gc291cmNlID0gaWRlbnRpZmllci50b0NoYXJBcnJheSgpOworCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOworCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW5UeXBlID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCXN3aXRjaCh0b2tlblR5cGUpIHsKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2ltcGxlIG5hbWUgcmVwcmVzZW50cyBhIG5hbWUgdGhhdCBpcyBiZWluZyBkZWZpbmVkLAorCSAqIGFzIG9wcG9zZWQgdG8gb25lIGJlaW5nIHJlZmVyZW5jZWQuIFRoZSBmb2xsb3dpbmcgcG9zaXRpb25zIGFyZSBjb25zaWRlcmVkCisJICogb25lcyB3aGVyZSBhIG5hbWUgaXMgZGVmaW5lZDoKKwkgKiA8dWw+CisJICogPGxpPlRoZSB0eXBlIG5hbWUgaW4gYSA8Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+IG5vZGUuPC9saT4KKwkgKiA8bGk+VGhlIG1ldGhvZCBuYW1lIGluIGEgPGNvZGU+TWV0aG9kRGVjbGFyYXRpb248L2NvZGU+IG5vZGUKKwkgKiBwcm92aWRpbmcgPGNvZGU+aXNDb25zdHJ1Y3RvcjwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+CisJICogPGxpPlRoZSB2YXJpYWJsZSBuYW1lIGluIGFueSB0eXBlIG9mIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb248L2NvZGU+CisJICogbm9kZS48L2xpPgorCSAqIDwvdWw+CisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBzaW1wbHkgY2hlY2tzIHdoZXRoZXIKKwkgKiB0aGlzIG5vZGUgYXBwZWFycyBpbiB0aGUgZGVjbGFyYXRpb24gcG9zaXRpb24gcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KKwkgKiBJdCBhbHdheXMgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhpcyBub2RlIGlzIHVucGFyZW50ZWQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBub2RlIGRlY2xhcmVzIGEgbmFtZSwgYW5kIAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8gCisJcHVibGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvbigpIHsKKwkJQVNUTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQkvLyB1bnBhcmVudGVkIG5vZGUKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCQkvLyBjb3VsZCBvbmx5IGJlIHRoZSBuYW1lIG9mIHRoZSB0eXBlCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCS8vIGNvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb3IgY29uc3RydWN0b3IKKwkJCU1ldGhvZERlY2xhcmF0aW9uIHAgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcmVudDsKKwkJCXJldHVybiAhcC5pc0NvbnN0cnVjdG9yKCk7CisJCX0KKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKKwkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcCA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJlbnQ7CisJCQkvLyBtYWtlIHN1cmUgaXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSAobm90IHRoZSBpbml0aWFsaXplcikKKwkJCXJldHVybiAocC5nZXROYW1lKCkgPT0gdGhpcyk7CisJCX0KKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgeworCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHAgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBwYXJlbnQ7CisJCQkvLyBtYWtlIHN1cmUgaXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSAobm90IHRoZSBpbml0aWFsaXplcikKKwkJCXJldHVybiAocC5nZXROYW1lKCkgPT0gdGhpcyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCWludCBzaXplID0gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKKwkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgeworCQkJc2l6ZSArPSBIRUFERVJTICsgMiAqIDQgKyBIRUFERVJTICsgMiAqIGlkZW50aWZpZXIubGVuZ3RoKCk7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIG1lbVNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyODNiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBUeXBlIG5vZGUgZm9yIGEgbmFtZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUuCisgKiA8cD4KKyAqIFRoaXMga2luZCBvZiBub2RlIGlzIHVzZWQgdG8gY29udmVydCBhIG5hbWUgKDxjb2RlPk5hbWU8L2NvZGU+KSBpbnRvIGEgdHlwZQorICogKDxjb2RlPlR5cGU8L2NvZGU+KSBieSB3cmFwcGluZyBpdC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVHlwZSBleHRlbmRzIFR5cGUgeworCS8qKiAKKwkgKiBUaGUgdHlwZSBuYW1lIG5vZGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB0eXBlIHdpdGgKKwkgKiBhbiB1bnNwZWNmaWVkLCBidXQgbGVnYWwsIG5hbWUuCisJICovCisJcHJpdmF0ZSBOYW1lIHR5cGVOYW1lID0gbnVsbDsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbm9kZSBmb3IgYSBzaW1wbGUgdHlwZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIEJ5IGRlZmF1bHQsIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWUuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVNpbXBsZVR5cGUoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBTSU1QTEVfVFlQRTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU2ltcGxlVHlwZSByZXN1bHQgPSBuZXcgU2ltcGxlVHlwZSh0YXJnZXQpOworCQlyZXN1bHQuc2V0TmFtZSgoTmFtZSkgKChBU1ROb2RlKSBnZXROYW1lKCkpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBzaW1wbGUgdHlwZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc2ltcGxlIHR5cGUKKwkgKi8gCisJcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBzaW1wbGUgdHlwZSB0byB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoaXMgc2ltcGxlIHR5cGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldE5hbWUoTmFtZSB0eXBlTmFtZSkgeworCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJlcGxhY2VDaGlsZCgoQVNUTm9kZSkgdGhpcy50eXBlTmFtZSwgKEFTVE5vZGUpIHR5cGVOYW1lLCBmYWxzZSk7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgQ29kZSBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAodHlwZU5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOGM0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiBBU1Qgbm9kZSB0eXBlLiBVbmlvbiBvZiBmaWVsZCBkZWNsYXJhdGlvbiwKKyAqIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLCBhbmQgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4KKyAqCisgKiA8cHJlPgorICogRmllbGREZWNsYXJhdGlvbjoKKyAqICAgIHsgTW9kaWZpZXIgfSBUeXBlIElkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0gWyA8Yj49PC9iPiBFeHByZXNzaW9uIF0KKyAqICAgICAgICB7IDxiPiw8L2I+IElkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0gWyA8Yj49PC9iPiBFeHByZXNzaW9uXSB9CisgKiAgICAgICAgPGI+OzwvYj4KKyAqIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjoKKyAqICAgIHsgPGI+ZmluYWw8L2I+IH0gVHlwZQorICogCQlJZGVudGlmaWVyIHsgPGI+WzwvYj48Yj5dPC9iPiB9IFsgPGI+PTwvYj4gRXhwcmVzc2lvbiBdCisgKiAgICAgIHsgPGI+LDwvYj4gSWRlbnRpZmllciB7IDxiPls8L2I+PGI+XTwvYj4gfSBbIDxiPj08L2I+IEV4cHJlc3Npb25dIH0KKyAqICAgICAgPGI+OzwvYj4KKyAqIEZvcm1hbFBhcmFtZXRlcjoKKyAqICAgIHsgPGI+ZmluYWw8L2I+IH0gVHlwZSBJZGVudGlmaWVyIHsgPGI+WzwvYj48Yj5dPC9iPiB9CisgKiA8L3ByZT4KKyAqIFNpbXBsaWZpZWQgbm9ybWFsaXplZCBmb3JtOgorICogPHByZT4KKyAqIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb246CisgKiAgICB7IE1vZGlmaWVyIH0gVHlwZSBJZGVudGlmaWVyIFsgPGI+PTwvYj4gRXhwcmVzc2lvbiBdCisgKiBGaWVsZERlY2xhcmF0aW9uOgorICogICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA8Yj47PC9iPgorICogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uOgorICogICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA8Yj47PC9iPgorICogRm9ybWFsUGFyYW1ldGVyOgorICogICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBWYXJpYWJsZURlY2xhcmF0aW9uIHsKKwkKKwkvKioKKwkgKiBNYXNrIGNvbnRhaW5pbmcgYWxsIGxlZ2FsIG1vZGlmaWVycyBmb3IgdGhpcyBjb25zdHJ1Y3QuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFR0FMX01PRElGSUVSUyA9IAorCQlNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuUFJPVEVDVEVECisJCXwgTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5WT0xBVElMRQorCQl8IE1vZGlmaWVyLlRSQU5TSUVOVDsKKworCS8qKgorCSAqIFRoZSBtb2RpZmllcnM7IGJpdC13aXNlIG9yIG9mIE1vZGlmaWVyIGZsYWdzLgorCSAqIERlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBpbnQgbW9kaWZpZXJzID0gTW9kaWZpZXIuTk9ORTsKKwkKKwkvKioKKwkgKiBUaGUgdmFyaWFibGUgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIEphdmEgaWRlbnRpZmllci4KKwkgKi8KKwlwcml2YXRlIFNpbXBsZU5hbWUgdmFyaWFibGVOYW1lID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSB0eXBlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGEgdW5zcGVjaWZpZWQsCisJICogbGVnYWwgdHlwZS4KKwkgKi8KKwlwcml2YXRlIFR5cGUgdHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsKKwkgKiBkZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBvcHRpb25hbEluaXRpYWxpemVyID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGhhczogbm8gbW9kaWZpZXJzLCBhbiAKKwkgKiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLCBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB2YXJpYWJsZSBuYW1lLCAKKwkgKiBubyBpbml0aWFsaXplci4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFNJTkdMRV9WQVJJQUJMRV9ERUNMQVJBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0TW9kaWZpZXJzKGdldE1vZGlmaWVycygpKTsKKwkJcmVzdWx0LnNldFR5cGUoKFR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldEluaXRpYWxpemVyKAorCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRJbml0aWFsaXplcigpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUeXBlKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TmFtZSgpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEluaXRpYWxpemVyKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGUgZmluYWwgbW9kaWZpZXIgaXMgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBmb3IgbG9jYWwKKwkgKiB2YXJpYWJsZSBhbmQgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICovIAorCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gbW9kaWZpZXJzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgbW9kaWZpZXJzIGFyZSB2YWxpZCBmb3IgZmllbGRzOiBwdWJsaWMsIHByaXZhdGUsIHByb3RlY3RlZCwKKwkgKiBzdGF0aWMsIGZpbmFsLCB2b2xhdGlsZSwgYW5kIHRyYW5zaWVudC4gRm9yIGxvY2FsIHZhcmlhYmxlIGFuZCBmb3JtYWwKKwkgKiBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLCB0aGUgb25seSBtZWFuaW5nZnVsIG1vZGlmaWVyIGlzIGZpbmFsLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaXQtd2lzZSBvciBvZiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gY29uc3RhbnRzCisJICogQHNlZSBNb2RpZmllcgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtb2RpZmllcnMgYXJlIGlsbGVnYWwKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKwkJaWYgKChtb2RpZmllcnMgJiB+TEVHQUxfTU9ESUZJRVJTKSAhPSAwKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgorCSAqLyAKKwlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworCQlpZiAodmFyaWFibGVOYW1lID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gdmFyaWFibGVOYW1lOworCX0KKwkJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCisJICovIAorCXB1YmxpYyB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSB2YXJpYWJsZU5hbWUpIHsKKwkJaWYgKHZhcmlhYmxlTmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMudmFyaWFibGVOYW1lLCB2YXJpYWJsZU5hbWUsIGZhbHNlKTsKKwkJdGhpcy52YXJpYWJsZU5hbWUgPSB2YXJpYWJsZU5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB0eXBlCisJICovIAorCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFR5cGUoZ2V0QVNUKCkubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOworCQl9CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gdG8gCisJICogdGhlIGdpdmVuIHR5cGUuCisJICogCisJICogQHBhcmFtIHR5cGUgdGhlIG5ldyB0eXBlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMudHlwZSwgdHlwZSwgZmFsc2UpOworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRJbml0aWFsaXplcigpIHsKKwkJcmV0dXJuIG9wdGlvbmFsSW5pdGlhbGl6ZXI7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXplcihFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CisJCS8vIGEgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gCisJCS8vIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wdGlvbmFsSW5pdGlhbGl6ZXIsIGluaXRpYWxpemVyLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbEluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgNCAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrICh0eXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCisJCQkrICh2YXJpYWJsZU5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKKwkJCSsgKG9wdGlvbmFsSW5pdGlhbGl6ZXIgPT0gbnVsbCA/IDAgOiBnZXRJbml0aWFsaXplcigpLnRyZWVTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTg1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIEFTVCBub2RlcyB0aGF0IHJlcHJlc2VudCBzdGF0ZW1lbnRzLgorICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2Ygc3RhdGVtZW50cy4KKyAqIDxwPgorICogVGhlIGdyYW1tYXIgY29tYmluZXMgYm90aCBTdGF0ZW1lbnQgYW5kIEJsb2NrU3RhdGVtZW50LgorICogPHByZT4KKyAqIFN0YXRlbWVudDoKKyAqICAgIEJsb2NrCisgKiAgICBJZlN0YXRlbWVudAorICogICAgRm9yU3RhdGVtZW50CisgKiAgICBXaGlsZVN0YXRlbWVudAorICogICAgRG9TdGF0ZW1lbnQKKyAqICAgIFRyeVN0YXRlbWVudAorICogICAgU3dpdGNoU3RhdGVtZW50CisgKiAgICBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQKKyAqICAgIFJldHVyblN0YXRlbWVudAorICogICAgVGhyb3dTdGF0ZW1lbnQKKyAqICAgIEJyZWFrU3RhdGVtZW50CisgKiAgICBDb250aW51ZVN0YXRlbWVudAorICogICAgRW1wdHlTdGF0ZW1lbnQKKyAqICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQKKyAqICAgIExhYmVsZWRTdGF0ZW1lbnQKKyAqICAgIEFzc2VydFN0YXRlbWVudAorICogICAgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudAorICogICAgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50CisgKiAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24KKyAqICAgIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uCisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSB7CisJCisJLyoqCisJICogVGhlIGxlYWRpbmcgY29tbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgU3RyaW5nIG9wdGlvbmFsTGVhZGluZ0NvbW1lbnQgPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgc3RhdGVtZW50IG93bmVkIGJ5IHRoZSBnaXZlbiBBU1QuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVN0YXRlbWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxlYWRpbmcgY29tbWVudCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcKKwkgKiBhbmQgZW5kaW5nIGNvbW1lbnQgZGVsaW1pdGVycywgYW5kIGFueSBlbWJlZGRlZCBsaW5lIGJyZWFrcy4KKwkgKiA8cD4KKwkgKiBBIGxlYWRpbmcgY29tbWVudCBpcyBvbmUgdGhhdCBhcHBlYXJzIGJlZm9yZSB0aGUgc3RhdGVtZW50LgorCSAqIEl0IG1heSBiZSBlaXRoZXIgYW4gZW5kLW9mLWxpbmUgb3IgYSBtdWx0aS1saW5lIGNvbW1lbnQuCisJICogTXVsdGktbGluZSBjb21tZW50cyBtYXkgY29udGFpbiBsaW5lIGJyZWFrczsgZW5kLW9mLWxpbmUKKwkgKiBjb21tZW50cyBtdXN0IG5vdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgY29tbWVudCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExlYWRpbmdDb21tZW50KCkgeworCQlyZXR1cm4gb3B0aW9uYWxMZWFkaW5nQ29tbWVudDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgbGVhZGluZyBjb21tZW50IHN0cmluZy4gVGhlIGNvbW1lbnQKKwkgKiBzdHJpbmcgbXVzdCBpbmNsdWRlIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIGNvbW1lbnQgZGVsaW1pdGVycywKKwkgKiBhbmQgYW55IGVtYmVkZGVkIGxpbmVicmVha3MuCisJICogPHA+CisJICogQSBsZWFkaW5nIGNvbW1lbnQgaXMgb25lIHRoYXQgYXBwZWFycyBiZWZvcmUgdGhlIHN0YXRlbWVudC4KKwkgKiBJdCBtYXkgYmUgZWl0aGVyIGFuIGVuZC1vZi1saW5lIG9yIGEgbXVsdGktbGluZSBjb21tZW50LgorCSAqIE11bHRpLWxpbmUgY29tbWVudHMgbWF5IGNvbnRhaW4gbGluZSBicmVha3M7IGVuZC1vZi1saW5lCisJICogY29tbWVudHMgbXVzdCBub3QuCisJICogPC9wPgorCSAqIDxwPgorCSAqIEV4YW1wbGVzOgorCSAqIDxjb2RlPgorCSAqIDxwcmU+CisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8mIzQyOyBzaW5nbGUtbGluZSBjb21tZW50ICYjNDI7LyIpIC0gY29ycmVjdAorCSAqIHNldExlYWRpbmdDb21tZW50KCJtaXNzaW5nIGNvbW1lbnQgZGVsaW1pdGVycyIpIC0gd3JvbmchCisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8mIzQyOyB1bnRlcm1pbmF0ZWQgY29tbWVudCAiKSAtIHdyb25nIQorCSAqIHNldExlYWRpbmdDb21tZW50KCIvLyBlbmQtb2YtbGluZSBjb21tZW50IikgLSBjb3JyZWN0CisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8mIzQyOyBtdWx0aS1saW5lXG4gY29tbWVudCAmIzQyOy8iKSAgLSBjb3JyZWN0CisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8vIGJyb2tlbiBlbmQtb2YtbGluZVxuIGNvbW1lbnQgIikgLSB3cm9uZyEKKwkgKiA8L3ByZT4KKwkgKiA8L2NvZGU+CisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb21tZW50IHN0cmluZyBpcyBpbnZhbGlkCisJICovCisJcHVibGljIHZvaWQgc2V0TGVhZGluZ0NvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKwkJaWYgKGNvbW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKGNvbW1lbnQuc3RhcnRzV2l0aCgiLyoiKSAmJiBjb21tZW50LmVuZHNXaXRoKCIqLyIpICYmIGNvbW1lbnQubGVuZ3RoKCkgPj0gNCkgey8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQkJLy8gdGhpcyBpcyBvaworCQkJfSBlbHNlIGlmIChjb21tZW50LnN0YXJ0c1dpdGgoIi8vIikgJiYgY29tbWVudC5pbmRleE9mKCdcbicpIDwgMCkgey8vJE5PTi1OTFMtMSQKKwkJCQkvLyB0aGlzIGlzIG9rIHRvbworCQkJfSBlbHNlIHsKKwkJCQkvLyBidXQgYW55dGhpbmcgZWxzZSBpZiBub3QgZ29vZAorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5vcHRpb25hbExlYWRpbmdDb21tZW50ID0gY29tbWVudDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCWludCBzaXplID0gQkFTRV9OT0RFX1NJWkUgKyAxICogNDsKKwkJU3RyaW5nIHMgPSBnZXRMZWFkaW5nQ29tbWVudCgpOworCQlpZiAocyAhPSBudWxsKSB7CisJCQlzaXplICs9IEhFQURFUlMgKyAyICogNCArIEhFQURFUlMgKyAyICogcy5sZW5ndGgoKTsKKwkJfQorCQlyZXR1cm4gc2l6ZTsKKwl9Cit9CQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cmluZ0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RyaW5nTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGQwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cmluZ0xpdGVyYWwuamF2YQpAQCAtMCwwICsxLDM0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworCisvKioKKyAqIFN0cmluZyBsaXRlcmFsIG5vZGVzLgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwkvKioKKwkgKiBUaGUgbGl0ZXJhbCBzdHJpbmcsIGluY2x1ZGluZyBxdW90ZXMgYW5kIGVzY2FwZXM7IGRlZmF1bHRzIHRvIHRoZSAKKwkgKiBsaXRlcmFsIGZvciB0aGUgZW1wdHkgc3RyaW5nLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGVzY2FwZWRWYWx1ZSA9ICJcIlwiIjsvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgc3RyaW5nIGxpdGVyYWwgbm9kZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIEJ5IGRlZmF1bHQsIHRoZSBzdHJpbmcgbGl0ZXJhbCBkZW5vdGVzIHRoZSBlbXB0eSBzdHJpbmcuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVN0cmluZ0xpdGVyYWwoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBTVFJJTkdfTElURVJBTDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU3RyaW5nTGl0ZXJhbCByZXN1bHQgPSBuZXcgU3RyaW5nTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0RXNjYXBlZFZhbHVlKGdldEVzY2FwZWRWYWx1ZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUgdG8gdGhlIGdpdmVuIHN0cmluZworCSAqIGxpdGVyYWwgdG9rZW4uIFRoZSB0b2tlbiBpcyB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGFwcGVhcgorCSAqIGluIHRoZSBzb3VyY2UgcHJvZ3JhbSwgaW5jbHVkaW5nIGVuY2xvc2luZyBkb3VibGUgcXVvdGVzIGFuZCBlbWJlZGRlZAorCSAqIGVzY2FwZXMuCisJICogCisJICogQHJldHVybiB0aGUgc3RyaW5nIGxpdGVyYWwgdG9rZW4sIGluY2x1ZGluZyBlbmNsb3NpbmcgZG91YmxlCisJICogICAgcXVvdGVzIGFuZCBlbWJlZGRlZCBlc2NhcGVzCisJICovIAorCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgeworCQlyZXR1cm4gZXNjYXBlZFZhbHVlOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlIHRvIHRoZSBnaXZlbiBzdHJpbmcgbGl0ZXJhbAorCSAqIHRva2VuLiBUaGUgdG9rZW4gaXMgdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBhcHBlYXIgaW4gdGhlCisJICogc291cmNlIHByb2dyYW0sIGluY2x1ZGluZyBlbmNsb3NpbmcgZG91YmxlIHF1b3RlcyBhbmQgZW1iZWRkZWQgZXNjYXBlcy4KKwkgKiBGb3IgZXhhbXBsZSwKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPiIiPC9jb2RlPiA8Y29kZT5zZXRMaXRlcmFsKCJcIlwiIik8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImhlbGxvIHdvcmxkIjwvY29kZT4gPGNvZGU+c2V0TGl0ZXJhbCgiXCJoZWxsbyB3b3JsZFwiIik8L2NvZGU+PC9saT4KKwkgKiA8bGk+PGNvZGU+ImJvb1xuaG9vIjwvY29kZT4gPGNvZGU+c2V0TGl0ZXJhbCgiXCJib29cXG5ob29cIiIpPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIHN0cmluZyBsaXRlcmFsIHRva2VuLCBpbmNsdWRpbmcgZW5jbG9zaW5nIGRvdWJsZQorCSAqICAgIHF1b3RlcyBhbmQgZW1iZWRkZWQgZXNjYXBlcworCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBpbmNvcnJlY3QKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlKFN0cmluZyB0b2tlbikgeworCQlpZiAodG9rZW4gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCVNjYW5uZXIgc2Nhbm5lciA9IGdldEFTVCgpLnNjYW5uZXI7CisJCWNoYXJbXSBzb3VyY2UgPSB0b2tlbi50b0NoYXJBcnJheSgpOworCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOworCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW5UeXBlID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCXN3aXRjaCh0b2tlblR5cGUpIHsKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJbW9kaWZ5aW5nKCk7CisJCXRoaXMuZXNjYXBlZFZhbHVlID0gdG9rZW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBsaXRlcmFsIG5vZGUuIAorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlLAorCSAqIDxjb2RlPgorCSAqIDxwcmU+CisJICogU3RyaW5nTGl0ZXJhbCBzOworCSAqIHMuc2V0RXNjYXBlZFZhbHVlKCJcImhlbGxvXFxud29ybGRcIiIpOworCSAqIGFzc2VydCBzLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaGVsbG9cbndvcmxkIik7CisJICogPC9wcmU+CisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29udmVydHMgZnJvbSB0aGUgc3RvcmVkIAorCSAqIHN0cmluZyBsaXRlcmFsIHRva2VuIHJldHVybmVkIGJ5IDxjb2RlPmdldEVzY2FwZWRMaXRlcmFsPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgc3RyaW5nIHZhbHVlIHdpdGhvdXQgZW5jbG9zaW5nIGRvdWJsZSBxdW90ZXMgYW5kIGVtYmVkZGVkCisJICogICAgZXNjYXBlcworCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsaXRlcmFsIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQKKwkgKi8gCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsVmFsdWUoKSB7CisJCVN0cmluZyBzID0gZ2V0RXNjYXBlZFZhbHVlKCk7CisJCWludCBsZW4gPSBzLmxlbmd0aCgpOworCQlpZiAobGVuIDwgMiB8fCBzLmNoYXJBdCgwKSAhPSAnXCInIHx8IHMuY2hhckF0KGxlbi0xKSAhPSAnXCInICkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gLSAyKTsKKwkJZm9yIChpbnQgaSA9IDE7IGk8IGxlbiAtIDE7IGkrKykgeworCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7CisJCQlpZiAoYyA9PSAnXCInKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCS8vIGxlZ2FsOiBiLCB0LCBuLCBmLCByLCAiLCAnLCBcLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCBvciA3CisJCQkJY2hhciBuZXh0Q2hhcjsKKwkJCQlpZiAoKGkgKyAxKSA8IGxlbiAtIDEpIHsKKwkJCQkJbmV4dENoYXIgPSBzLmNoYXJBdChpICsgMSk7CisJCQkJCWkrKzsKKwkJCQkJc3dpdGNoKG5leHRDaGFyKSB7CisJCQkJCQljYXNlICdiJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1xiJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICd0JyA6CisJCQkJCQkJYi5hcHBlbmQoJ1x0Jyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICduJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1xuJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdmJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1xmJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdyJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1xyJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdcIic6CisJCQkJCQkJYi5hcHBlbmQoJ1wiJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdcJyc6CisJCQkJCQkJYi5hcHBlbmQoJ1wnJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdcXCc6CisJCQkJCQkJYi5hcHBlbmQoJ1xcJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICcwJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1wwJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICcxJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1wxJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICcyJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1wyJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICczJyA6CisJCQkJCQkJYi5hcHBlbmQoJ1wzJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICc0JyA6CisJCQkJCQkJYi5hcHBlbmQoJ1w0Jyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICc1JyA6CisJCQkJCQkJYi5hcHBlbmQoJ1w1Jyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICc2JyA6CisJCQkJCQkJYi5hcHBlbmQoJ1w2Jyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICc3JyA6CisJCQkJCQkJYi5hcHBlbmQoJ1w3Jyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICd1JyA6CisJCQkJCQkJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KKwkJCQkJCQlpbnQgY3VycmVudFBvc2l0aW9uID0gaSArIDE7CisJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1CisJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKKwkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQorCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1CisJCQkJCQkJCXx8IGM0IDwgMCl7CisJCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RyaW5nIGxpdGVyYWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWIuYXBwZW5kKChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KSk7CisJCQkJCQkJCWkgPSBjdXJyZW50UG9zaXRpb24gLSAxOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RyaW5nIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQliLmFwcGVuZChjKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYi50b1N0cmluZygpOwkJCQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgbGl0ZXJhbCBub2RlLiAKKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwKKwkgKiA8Y29kZT4KKwkgKiA8cHJlPgorCSAqIFN0cmluZ0xpdGVyYWwgczsKKwkgKiBzLnNldExpdGVyYWxWYWx1ZSgiaGVsbG9cbndvcmxkIik7CisJICogYXNzZXJ0IHMuZ2V0RXNjYXBlZFZhbHVlKCJcImhlbGxvXFxud29ybGRcIiIpOworCSAqIGFzc2VydCBzLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaGVsbG9cbndvcmxkIik7CisJICogPC9wcmU+CisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29udmVydHMgdG8gdGhlIHN0b3JlZCAKKwkgKiBzdHJpbmcgbGl0ZXJhbCB0b2tlbiBhY2NlcHRhYmxlIHRvIDxjb2RlPnNldEVzY2FwZWRMaXRlcmFsPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGxpdGVyYWwgdGhlIHN0cmluZyB2YWx1ZSB3aXRob3V0IGVuY2xvc2luZyBkb3VibGUgcXVvdGVzIGFuZCAKKwkgKiAgICBlbWJlZGRlZCBlc2NhcGVzCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGluY29ycmVjdAorCSAqLworCXB1YmxpYyB2b2lkIHNldExpdGVyYWxWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CisJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAyKTsKKwkJCisJCWIuYXBwZW5kKCJcIiIpOyAvLyBvcGVuaW5nIGRlbGltaXRlciAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKwkJCXN3aXRjaChjKSB7CisJCQkJY2FzZSAnXGInIDoKKwkJCQkJYi5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1x0JyA6CisJCQkJCWIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcbicgOgorCQkJCQliLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXGYnIDoKKwkJCQkJYi5hcHBlbmQoIlxcZiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xyJyA6CisJCQkJCWIuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcIic6CisJCQkJCWIuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXCcnOgorCQkJCQliLmFwcGVuZCgiXFxcJyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xcJzoKKwkJCQkJYi5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMCcgOgorCQkJCQliLmFwcGVuZCgiXFwwIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDEnIDoKKwkJCQkJYi5hcHBlbmQoIlxcMSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wyJyA6CisJCQkJCWIuYXBwZW5kKCJcXDIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMycgOgorCQkJCQliLmFwcGVuZCgiXFwzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDQnIDoKKwkJCQkJYi5hcHBlbmQoIlxcNCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1w1JyA6CisJCQkJCWIuYXBwZW5kKCJcXDUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcNicgOgorCQkJCQliLmFwcGVuZCgiXFw2Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDcnIDoKKwkJCQkJYi5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOwkJCQorCQkJCWRlZmF1bHQ6CisJCQkJCWIuYXBwZW5kKGMpOworCQkJfQorCQl9CisJCWIuYXBwZW5kKCJcIiIpOyAvLyBjbG9zaW5nIGRlbGltaXRlciAvLyROT04tTkxTLTEkCisJCXNldEVzY2FwZWRWYWx1ZShiLnRvU3RyaW5nKCkpOworCX0KKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0OworCQlpZiAoZXNjYXBlZFZhbHVlICE9IG51bGwpIHsKKwkJCXNpemUgKz0gSEVBREVSUyArIDIgKiA0ICsgSEVBREVSUyArIDIgKiBlc2NhcGVkVmFsdWUubGVuZ3RoKCk7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIG1lbVNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FjNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbjoKKyAqCQlbIEV4cHJlc3Npb24gPGI+LjwvYj4gXSA8Yj5zdXBlcjwvYj4KKyAqIAkJCQk8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj4sPC9iPiBFeHByZXNzaW9uIH0gXSA8Yj4pPC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwkvKioKKwkgKiBUaGUgZXhwcmVzc2lvbjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsRXhwcmVzc2lvbiA9IG51bGw7CisJCisJLyoqCisJICogVGhlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgKGVsZW1lbnQgdHlwZTogCisJICogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgorCSAqLworCXByaXZhdGUgQVNUTm9kZS5Ob2RlTGlzdCBhcmd1bWVudHMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBFeHByZXNzaW9uLmNsYXNzKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGFuIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50CisJICogb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgYW4gZW1wdHkgbGlzdCBvZiBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsJCisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFNVUEVSX0NPTlNUUlVDVE9SX0lOVk9DQVRJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAorCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKKwkJcmVzdWx0LmFyZ3VtZW50cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGFyZ3VtZW50cygpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBhcmd1bWVudHMpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudCwKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlyZXR1cm4gb3B0aW9uYWxFeHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24KKwkgKiBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJLy8gYSBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24KKwkJLy8gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxFeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbEV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHRoaXMgc3VwZXIKKwkgKiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYXJndW1lbnQgZXhwcmVzc2lvbnMgCisJICogICAgKGVsZW1lbnQgdHlwZTogPGNvZGU+RXhwcmVzc2lvbjwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IGFyZ3VtZW50cygpIHsKKwkJcmV0dXJuIGFyZ3VtZW50czsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGNvbnN0cnVjdG9yIGludm9rZWQgYnkgdGhpcworCSAqIGV4cHJlc3Npb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQorCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgY29uc3RydWN0b3IgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcKKwkgKiAgICBjYW5ub3QgYmUgcmVzb2x2ZWQKKwkgKi8JCisJcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlQ29uc3RydWN0b3IodGhpcyk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQorCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgKG9wdGlvbmFsRXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKQorCQkJKyBhcmd1bWVudHMubGlzdFNpemUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyRmllbGRBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZWI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyRmllbGRBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogU2ltcGxlIG9yIHF1YWxpZmllZCAic3VwZXIiIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFN1cGVyRmllbGRBY2Nlc3M6CisgKiAgICAgWyBDbGFzc05hbWUgPGI+LjwvYj4gXSA8Yj5zdXBlcjwvYj4gPGI+LjwvYj4gSWRlbnRpZmllcgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFN1cGVyRmllbGRBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCS8qKgorCSAqIFRoZSBvcHRpb25hbCBxdWFsaWZpZXI7IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgTmFtZSBvcHRpb25hbFF1YWxpZmllciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgZmllbGQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogYnV0IGxlZ2FsLCBzaW1wbGUgZmllbGQgbmFtZS4KKwkgKi8KKwlwcml2YXRlIFNpbXBsZU5hbWUgZmllbGROYW1lID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBub2RlIGZvciBhIHN1cGVyIGZpZWxkIGFjY2VzcyBleHByZXNzaW9uIG93bmVkCisJICogYnkgdGhlIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgZmllbGQgbmFtZSBpcyBhbiB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCAKKwkgKiBuYW1lLCBhbmQgdGhlcmUgaXMgbm8gcXVhbGlmaWVyLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlTdXBlckZpZWxkQWNjZXNzKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gU1VQRVJfRklFTERfQUNDRVNTOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlTdXBlckZpZWxkQWNjZXNzIHJlc3VsdCA9IG5ldyBTdXBlckZpZWxkQWNjZXNzKHRhcmdldCk7CisJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0TmFtZSgpKSk7CisJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRRdWFsaWZpZXIoKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJzdXBlciIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24sIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CisJCXJldHVybiBvcHRpb25hbFF1YWxpZmllcjsKKwl9CisJCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJzdXBlciIgZmllbGQgYWNjZXNzIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIHF1YWxpZmllciBuYW1lIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihOYW1lIG5hbWUpIHsKKwkJLy8gYSBTdXBlckZpZWxkQWNjZXNzIGNhbm5vdCBvY2N1ciBpbnNpZGUgYSBOYW1lIC0gbm8gY3ljbGUgY2hlY2sKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxRdWFsaWZpZXIsIG5hbWUsIGZhbHNlKTsKKwkJdGhpcy5vcHRpb25hbFF1YWxpZmllciA9IG5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYWNjZXNzZWQgaW4gdGhpcyAic3VwZXIiIGZpZWxkIGFjY2VzcyAKKwkgKiBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpZWxkIG5hbWUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSB7CisJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCX0KKwkJcmV0dXJuIGZpZWxkTmFtZTsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFjY2Vzc2VkIGluIHRoaXMgInN1cGVyIiBmaWVsZCBhY2Nlc3MgCisJICogZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBmaWVsZCBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgZmllbGROYW1lKSB7CisJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgRmllbGRBY2Nlc3MgY2Fubm90IG9jY3VyIGluc2lkZSBhIFNpbXBsZU5hbWUKKwkJcmVwbGFjZUNoaWxkKHRoaXMuZmllbGROYW1lLCBmaWVsZE5hbWUsIGZhbHNlKTsKKwkJdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IENvZGUgYXMgZnJlZQorCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAyICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgKG9wdGlvbmFsUXVhbGlmaWVyID09IG51bGwgPyAwIDogZ2V0UXVhbGlmaWVyKCkudHJlZVNpemUoKSkKKwkJCSsgKGZpZWxkTmFtZSA9PSBudWxsID8gMCA6IGdldE5hbWUoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJNZXRob2RJbnZvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyTWV0aG9kSW52b2NhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyTWV0aG9kSW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFNpbXBsZSBvciBxdWFsaWZpZWQgInN1cGVyIiBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFN1cGVyTWV0aG9kSW52b2NhdGlvbjoKKyAqICAgICBbIENsYXNzTmFtZSA8Yj4uPC9iPiBdIDxiPnN1cGVyPC9iPiA8Yj4uPC9iPiBJZGVudGlmaWVyCisgKiAJCQk8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj4sPC9iPiBFeHByZXNzaW9uIH0gXSA8Yj4pPC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBleHRlbmRzIEV4cHJlc3Npb24geworCQorCS8qKgorCSAqIFRoZSBvcHRpb25hbCBxdWFsaWZpZXI7IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBkZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgTmFtZSBvcHRpb25hbFF1YWxpZmllciA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwKKwkgKiBsZWdhbCBKYXZhIG1ldGhvZCBuYW1lLgorCSAqLworCXByaXZhdGUgU2ltcGxlTmFtZSBtZXRob2ROYW1lID0gbnVsbDsKKwkKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAoZWxlbWVudCB0eXBlOiAKKwkgKiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikuIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGFyZ3VtZW50cyA9CisJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIEV4cHJlc3Npb24uY2xhc3MpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSAic3VwZXIiIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gb3duZWQKKwkgKiBieSB0aGUgZ2l2ZW4gQVNULiBCeSBkZWZhdWx0LCBubyBxdWFsaWZpZXIsIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIAorCSAqIG1ldGhvZCBuYW1lLCBhbmQgYW4gZW1wdHkgbGlzdCBvZiBhcmd1bWVudHMuCisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVN1cGVyTWV0aG9kSW52b2NhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CQorCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBTVVBFUl9NRVRIT0RfSU5WT0NBVElPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBTdXBlck1ldGhvZEludm9jYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldFF1YWxpZmllcigoTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFF1YWxpZmllcigpKSk7CisJCXJlc3VsdC5hcmd1bWVudHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBhcmd1bWVudHMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRRdWFsaWZpZXIoKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgYXJndW1lbnRzKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZXIgb2YgdGhpcyAic3VwZXIiIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24sIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CisJCXJldHVybiBvcHRpb25hbFF1YWxpZmllcjsKKwl9CisJCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJzdXBlciIgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKE5hbWUgbmFtZSkgeworCQkvLyBhIFN1cGVyTWV0aG9kSW52b2NhdGlvbiBjYW5ub3Qgb2NjdXIgaW5zaWRlIGEgTmFtZQorCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbFF1YWxpZmllciwgbmFtZSwgZmFsc2UpOworCQl0aGlzLm9wdGlvbmFsUXVhbGlmaWVyID0gbmFtZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludm9rZWQgaW4gdGhpcyBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIG5vZGUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBtZXRob2ROYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW52b2tlZCBpbiB0aGlzIGV4cHJlc3Npb24gdG8gdGhlCisJICogZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG1ldGhvZCBuYW1lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFNpbXBsZU5hbWUgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMubWV0aG9kTmFtZSwgbmFtZSwgZmFsc2UpOworCQl0aGlzLm1ldGhvZE5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHRoaXMgCisJICogInN1cGVyIiBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyAKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgYXJndW1lbnRzKCkgeworCQlyZXR1cm4gYXJndW1lbnRzOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBDb2RlIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMyAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrIChvcHRpb25hbFF1YWxpZmllciA9PSBudWxsID8gMCA6IGdldFF1YWxpZmllcigpLnRyZWVTaXplKCkpCisJCQkrIChtZXRob2ROYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpCisJCQkrIGFyZ3VtZW50cy5saXN0U2l6ZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE0NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hDYXNlLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFN3aXRjaCBjYXNlIEFTVCBub2RlIHR5cGUuIEEgc3dpdGNoIGNhc2UgaXMgYSBzcGVjaWFsIGtpbmQgb2Ygbm9kZSB1c2VkIG9ubHkKKyAqIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBJdCBpcyBhIDxjb2RlPlN0YXRlbWVudDwvY29kZT4gaW4gbmFtZSBvbmx5LgorICogPHA+CisgKiA8cHJlPgorICogU3dpdGNoQ2FzZToKKyAqCQk8Yj5jYXNlPC9iPiBFeHByZXNzaW9uICA8Yj46PC9iPgorICoJCTxiPmRlZmF1bHQ8L2I+IDxiPjo8L2I+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU3dpdGNoQ2FzZSBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IDxjb2RlPm51bGw8L2NvZGU+IGZvciBub25lOyBsYXppbHkgaW5pdGlhbGl6ZWQgKGJ1dAorCSAqIGRvZXMgPGI+bm90PC9iPiBkZWZhdWx0IHRvIG5vbmUpLgorCSAqIEBzZWUgI2V4cHJlc3Npb25Jbml0aWFsaXplZAorCSAqLworCXByaXZhdGUgRXhwcmVzc2lvbiBvcHRpb25hbEV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogSW5kaWNhdGVzIHdoZXRoZXIgPGNvZGU+b3B0aW9uYWxFeHByZXNzaW9uPC9jb2RlPiBoYXMgYmVlbiBpbml0aWFsaXplZC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZXhwcmVzc2lvbkluaXRpYWxpemVkID0gZmFsc2U7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBzd2l0Y2ggY2FzZSBwc2V1ZG8tc3RhdGVtZW50IG93bmVkIGJ5IHRoZSAKKwkgKiBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIGV4cHJlc3Npb24uCisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVN3aXRjaENhc2UoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBTV0lUQ0hfQ0FTRTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU3dpdGNoQ2FzZSByZXN1bHQgPSBuZXcgU3dpdGNoQ2FzZSh0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAorCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3dpdGNoIGNhc2UsIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUgKHRoZSAiZGVmYXVsdDoiIGNhc2UpLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlpZiAoIWV4cHJlc3Npb25Jbml0aWFsaXplZCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBvcHRpb25hbEV4cHJlc3Npb247CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzd2l0Y2ggY2FzZSwgb3IgY2xlYXJzIGl0ICh0dXJucyBpdCBpbnRvCisJICogdGhlICAiZGVmYXVsdDoiIGNhc2UpLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIAorCSAqICAgIHR1cm4gaXQgaW50byB0aGUgICJkZWZhdWx0OiIgY2FzZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJLy8gYSBSZXR1cm5TdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMub3B0aW9uYWxFeHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5vcHRpb25hbEV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCQlleHByZXNzaW9uSW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN3aXRjaCBjYXNlIHJlcHJlc2VudHMgdGhlICJkZWZhdWx0OiIgY2FzZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisJICogPGNvZGU+Z2V0RXhwcmVzc2lvbigpID09IG51bGw8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgdGhlIGRlZmF1bHQgc3dpdGNoIGNhc2UsIGFuZAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbm9uLWRlZmF1bHQgc3dpdGNoIGNhc2UKKwkgKi8gCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgIHsKKwkJcmV0dXJuIGdldEV4cHJlc3Npb24oKSA9PSBudWxsOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDIgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChvcHRpb25hbEV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBvcHRpb25hbEV4cHJlc3Npb24udHJlZVNpemUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5YzIxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogU3dpdGNoIHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICogPHA+CisgKiA8cHJlPgorICogU3dpdGNoU3RhdGVtZW50OgorICoJCTxiPnN3aXRjaDwvYj4gPGI+KDwvYj4gRXhwcmVzc2lvbiA8Yj4pPC9iPiAKKyAqIAkJCTxiPns8L2I+IHsgU3dpdGNoQ2FzZSB8IFN0YXRlbWVudCB9IH0gPGI+fTwvYj4KKyAqIFN3aXRjaENhc2U6CisgKgkJPGI+Y2FzZTwvYj4gRXhwcmVzc2lvbiAgPGI+OjwvYj4KKyAqCQk8Yj5kZWZhdWx0PC9iPiA8Yj46PC9iPgorICogPC9wcmU+CisgKiA8Y29kZT5Td2l0Y2hDYXNlPC9jb2RlPiBub2RlcyBhcmUgdHJlYXRlZCBhcyBhIGtpbmQgb2YKKyAqIDxjb2RlPlN0YXRlbWVudDwvY29kZT4uCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFN3aXRjaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCQkKKwkvKioKKwkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgc3RhdGVtZW50cyBhbmQgU3dpdGNoQ2FzZSBub2RlcworCSAqIChlbGVtZW50IHR5cGU6IDxjb2RlPlN0YXRlbWVudDwvY29kZT4pLgorCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN0YXRlbWVudHMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBTdGF0ZW1lbnQuY2xhc3MpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzd2l0Y2ggc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHN3aWN0aCBzdGF0ZW1lbnQgaGFzIGFuIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhwcmVzc2lvbiwgYW5kIGFuIGVtcHR5IGxpc3Qgb2Ygc3dpdGNoIGdyb3Vwcy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJU3dpdGNoU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gU1dJVENIX1NUQVRFTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJU3dpdGNoU3RhdGVtZW50IHJlc3VsdCA9IG5ldyBTd2l0Y2hTdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc3RhdGVtZW50cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHN0YXRlbWVudHMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgc3RhdGVtZW50cyk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBuZXcgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBTd2l0Y2hTdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIAorCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl2ZSBvcmRlcmVkIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgorCSAqIFdpdGhpbiB0aGlzIGxpc3QsIDxjb2RlPlN3aXRjaENhc2U8L2NvZGU+IG5vZGVzIG1hcmsgdGhlIHN0YXJ0IG9mIAorCSAqIHRoZSBzd2l0Y2ggZ3JvdXBzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpdmUgbGlzdCBvZiBzd2l0Y2ggZ3JvdXAgbm9kZXMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5Td2l0Y2hHcm91cHM8L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBzdGF0ZW1lbnRzKCkgeworCQlyZXR1cm4gc3RhdGVtZW50czsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKQorCQkJKyAoZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKQorCQkJKyBzdGF0ZW1lbnRzLmxpc3RTaXplKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NDFlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFN5bmNocm9uaXplZCBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KKyAqCisgKiA8cHJlPgorICogU3luY2hyb25pemVkU3RhdGVtZW50OgorICogICAgPGI+c3luY2hyb25pemVkPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IEJsb2NrCisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCS8qKgorCSAqIFRoZSBleHByZXNzaW9uOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLCBidXQgCisJICogbGVnYWwsIGV4cHJlc3Npb24uCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOworCisJLyoqCisJICogVGhlIGJvZHk7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgYmxvY2suCisJICovCisJcHJpdmF0ZSBCbG9jayBib2R5ID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaXMgdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgYW5kIHRoZQorCSAqIGJsb2R5IGlzIGFuIGVtcHR5IGJsb2NrLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBTWU5DSFJPTklaRURfU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0Qm9keSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3luY2hyb25pemVkIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBleHByZXNzaW9uOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgc3luY2hyb25pemVkIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uCisJCS8vIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb24sIHRydWUpOworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGJvZHkgb2YgdGhpcyBzeW5jaHJvbml6ZWQgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJvZHkgYmxvY2sgbm9kZQorCSAqLyAKKwlwdWJsaWMgQmxvY2sgZ2V0Qm9keSgpIHsKKwkJaWYgKGJvZHkgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0Qm9keShuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gYm9keTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGJsb2NrIHRoZSBib2R5IHN0YXRlbWVudCBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRCb2R5KEJsb2NrIGJsb2NrKSB7CisJCWlmIChibG9jayA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBXaGlsZVN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGEgU3RhdGVtZW50IC0gbXVzdCBjaGVjayBjeWNsZXMKKwkJcmVwbGFjZUNoaWxkKHRoaXMuYm9keSwgYmxvY2ssIHRydWUpOworCQl0aGlzLmJvZHkgPSBibG9jazsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAyICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKQorCQkJKyAoZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKQorCQkJKyAoYm9keSA9PSBudWxsID8gMCA6IGdldEJvZHkoKS50cmVlU2l6ZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaGlzRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaGlzRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTYwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RoaXNFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFNpbXBsZSBvciBxdWFsaWZpZWQgInRoaXMiIEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFRoaXNFeHByZXNzaW9uOgorICogICAgIFsgQ2xhc3NOYW1lIDxiPi48L2I+IF0gPGI+dGhpczwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUaGlzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCQkJCisJLyoqCisJICogVGhlIG9wdGlvbmFsIHF1YWxpZmllcjsgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmU7IGRlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBOYW1lIG9wdGlvbmFsUXVhbGlmaWVyID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgInRoaXMiIGV4cHJlc3Npb24gb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gcXVhbGlmaWVyLgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlUaGlzRXhwcmVzc2lvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFRISVNfRVhQUkVTU0lPTjsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJVGhpc0V4cHJlc3Npb24gcmVzdWx0ID0gbmV3IFRoaXNFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRRdWFsaWZpZXIoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcXVhbGlmaWVyIG9mIHRoaXMgInRoaXMiIGV4cHJlc3Npb24sIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgcXVhbGlmaWVyIG5hbWUgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgTmFtZSBnZXRRdWFsaWZpZXIoKSB7CisJCXJldHVybiBvcHRpb25hbFF1YWxpZmllcjsKKwl9CisJCisJLyoqCisJICogU2V0cyBvciBjbGVhcnMgdGhlIHF1YWxpZmllciBvZiB0aGlzICJ0aGlzIiBleHByZXNzaW9uLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBxdWFsaWZpZXIgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoTmFtZSBuYW1lKSB7CisJCS8vIGEgVGhpc0V4cHJlc3Npb24gY2Fubm90IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uCisJCXJlcGxhY2VDaGlsZCh0aGlzLm9wdGlvbmFsUXVhbGlmaWVyLCBuYW1lLCBmYWxzZSk7CisJCXRoaXMub3B0aW9uYWxRdWFsaWZpZXIgPSBuYW1lOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAob3B0aW9uYWxRdWFsaWZpZXIgPT0gbnVsbCA/IDAgOiBnZXRRdWFsaWZpZXIoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Rocm93U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Rocm93U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4ZTNkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhyb3dTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogVGhyb3cgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFRocm93U3RhdGVtZW50OgorICogICAgPGI+dGhyb3c8L2I+IEV4cHJlc3Npb24gPGI+OzwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJvd1N0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCQkKKwkvKioKKwkgKiBUaGUgZXhwcmVzc2lvbjsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsCisJICogZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgdGhyb3cgc3RhdGVtZW50IG5vZGUgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHRocm93IHN0YXRlbWVudCBoYXMgYW4gdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwKKwkgKiBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlUaHJvd1N0YXRlbWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFRIUk9XX1NUQVRFTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJVGhyb3dTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFRocm93U3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHRocm93IHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIG5vZGUKKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBleHByZXNzaW9uOworCX0KKwkJCisJLyoqCisJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHRocm93IHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbmV3IGV4cHJlc3Npb24gbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPGxpPmEgY3ljbGUgaW4gd291bGQgYmUgY3JlYXRlZDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgVGhyb3dTdGF0ZW1lbnQgbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIAorCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCXJldHVybiBzdXBlci5tZW1TaXplKCkgKyAxICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4KKwkJCW1lbVNpemUoKQorCQkJKyAoZXhwcmVzc2lvbiA9PSBudWxsID8gMCA6IGdldEV4cHJlc3Npb24oKS50cmVlU2l6ZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UcnlTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHJ5U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjYmFiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHJ5U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVHJ5IHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBUcnlTdGF0ZW1lbnQ6CisgKiAgICA8Yj50cnk8L2I+IEJsb2NrIAorICogCQkJeyBDYXRjaENsYXVzZSB9CisgKiAJCQlbIDxiPmZpbmFsbHk8L2I+IEJsb2NrIF0KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUcnlTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCQorCS8qKgorCSAqIFRoZSBib2R5OyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGJsb2NrLgorCSAqLworCXByaXZhdGUgQmxvY2sgYm9keSA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2F0Y2ggY2xhdXNlcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5DYXRjaENsYXVzZTwvY29kZT4pLgorCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IGNhdGNoQ2xhdXNlcyA9CisJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIENhdGNoQ2xhdXNlLmNsYXNzKTsKKwkKKwkvKioKKwkgKiBUaGUgZmluYWxseSBibG9jaywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgQmxvY2sgb3B0aW9uYWxGaW5hbGx5Qm9keSA9IG51bGw7CisKKwkJCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdHJ5IHN0YXRlbWVudCBvd25lZCBieSB0aGUgZ2l2ZW4gCisJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgdHJ5IHN0YXRlbWVudCBoYXMgYW4gZW1wdHkgYmxvY2ssIG5vIGNhdGNoCisJICogY2xhdXNlcywgYW5kIG5vIGZpbmFsbHkgYmxvY2suCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVRyeVN0YXRlbWVudChBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFRSWV9TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVRyeVN0YXRlbWVudCByZXN1bHQgPSBuZXcgVHJ5U3RhdGVtZW50KHRhcmdldCk7CisJCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldEJvZHkoKEJsb2NrKSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5jYXRjaENsYXVzZXMoKS5hZGRBbGwoCisJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGNhdGNoQ2xhdXNlcygpKSk7CisJCXJlc3VsdC5zZXRGaW5hbGx5KAorCQkJKEJsb2NrKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RmluYWxseSgpKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEJvZHkoKSk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBjYXRjaENsYXVzZXMpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RmluYWxseSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgdHJ5IHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSB0cnkgYm9keQorCSAqLyAKKwlwdWJsaWMgQmxvY2sgZ2V0Qm9keSgpIHsKKwkJaWYgKGJvZHkgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0Qm9keShuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gYm9keTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIHRyeSBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGJvZHkgdGhlIGJsb2NrIG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEJvZHkoQmxvY2sgYm9keSkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBUcnlTdGF0ZW1lbnQgbWF5IG9jY3VyIGluIGEgQmxvY2sgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5ib2R5LCBib2R5LCB0cnVlKTsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBjYXRjaCBjbGF1c2VzIGZvciB0aGlzIHRyeSBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGNhdGNoIGNsYXVzZXMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5DYXRjaENsYXVzZTwvY29kZT4pCisJICovIAorCXB1YmxpYyBMaXN0IGNhdGNoQ2xhdXNlcygpIHsKKwkJcmV0dXJuIGNhdGNoQ2xhdXNlczsKKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZpbmFsbHkgYmxvY2sgb2YgdGhpcyB0cnkgc3RhdGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiB0aGlzIHRyeSBzdGF0ZW1lbnQgaGFzIDxiPm5vPC9iPiBmaW5hbGx5IGJsb2NrLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpbmFsbHkgYmxvY2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdHJ5IHN0YXRlbWVudAorCSAqICAgIGhhcyBub25lCisJICovIAorCXB1YmxpYyBCbG9jayBnZXRGaW5hbGx5KCkgeworCQlyZXR1cm4gb3B0aW9uYWxGaW5hbGx5Qm9keTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgZmluYWxseSBibG9jayBvZiB0aGlzIHRyeSBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIGJsb2NrIHRoZSBmaW5hbGx5IGJsb2NrIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEZpbmFsbHkoQmxvY2sgYmxvY2spIHsKKwkJLy8gYSBUcnlTdGF0ZW1lbnQgbWF5IG9jY3VyIGluIGEgQmxvY2sgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbEZpbmFsbHlCb2R5LCBibG9jaywgdHJ1ZSk7CisJCXRoaXMub3B0aW9uYWxGaW5hbGx5Qm9keSA9IGJsb2NrOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpCisJCQkrIGNhdGNoQ2xhdXNlcy5saXN0U2l6ZSgpCisJCQkrIChvcHRpb25hbEZpbmFsbHlCb2R5ID09IG51bGwgPyAwIDogZ2V0RmluYWxseSgpLnRyZWVTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5ODA0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGFsbCB0eXBlIEFTVCBub2RlIHR5cGVzLiBBIHR5cGUgbm9kZSByZXByZXNlbnRzIGEgCisgKiByZWZlcmVuY2UgdG8gYSBwcmltaXRpdmUgdHlwZSAoaW5jbHVkaW5nIHZvaWQpLCB0byBhIG5hbWVkIGNsYXNzIG9yIAorICogaW50ZXJmYWNlIHR5cGUsIG9yIHRvIGFuIGFycmF5IHR5cGUuCisgKiA8cD4KKyAqIDxwcmU+CisgKiBUeXBlOgorICogICAgUHJpbWl0aXZlVHlwZQorICogICAgU2ltcGxlVHlwZQorICogICAgQXJyYXlUeXBlCisgKiBQcmltaXRpdmVUeXBlOgorICogICAgPGI+Ynl0ZTwvYj4KKyAqICAgIDxiPnNob3J0PC9iPgorICogICAgPGI+Y2hhcjwvYj4KKyAqICAgIDxiPmludDwvYj4KKyAqICAgIDxiPmxvbmc8L2I+CisgKiAgICA8Yj5mbG9hdDwvYj4KKyAqICAgIDxiPmRvdWJsZTwvYj4KKyAqICAgIDxiPmJvb2xlYW48L2I+CisgKiAgICA8Yj52b2lkPC9iPgorICogU2ltcGxlVHlwZToKKyAqICAgIFR5cGVOYW1lCisgKiBBcnJheVR5cGU6CisgKiAgICBUeXBlIDxiPls8L2I+IDxiPl08L2I+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZSBleHRlbmRzIEFTVE5vZGUgeworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdHlwZSBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlUeXBlKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHByaW1pdGl2ZSB0eXBlCisJICogKDxjb2RlPlByaW1pdGl2ZVR5cGU8L2NvZGU+KS4gCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcHJpbWl0aXZlIHR5cGUsIGFuZCAKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKCkgeworCQlyZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBQcmltaXRpdmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgc2ltcGxlIHR5cGUgCisJICogKDxjb2RlPlNpbXBsZVR5cGU8L2NvZGU+KS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBzaW1wbGUgdHlwZSwgYW5kIAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKSB7CisJCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIFNpbXBsZVR5cGUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgaXMgYW4gYXJyYXkgdHlwZQorCSAqICg8Y29kZT5BcnJheVR5cGU8L2NvZGU+KS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYW4gYXJyYXkgdHlwZSwgYW5kIAorCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FycmF5VHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzIGluc3RhbmNlb2YgQXJyYXlUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhpcyB0eXBlLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHR5cGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqICAgIHJlc29sdmVkCisJICovCQorCXB1YmxpYyBmaW5hbCBJVHlwZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CisJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlVHlwZSh0aGlzKTsKKwl9CisJCisvLyBKU1ItMDE0CisvLwkvKioKKy8vCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUgCisvLyAgICogKDxjb2RlPlBhcmFtZXRlcml6ZWRUeXBlPC9jb2RlPikuCisvLwkgKiAKKy8vCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSwgYW5kIAorLy8JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorLy8JICovCisvLwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1BhcmFtZXRlcml6ZWRUeXBlKCkgeworLy8JCXJldHVybiAodGhpcyBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKTsKKy8vCX0KKworLy8JcHVibGljIElCaW5kaW5nIHJlc29sdmVkVHlwZSgpOworfQorCisvLy8vIEpTUi0wMTQKKy8vcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRUeXBlIGV4dGVuZHMgVHlwZSB7CisvLwlwdWJsaWMgUGFyYW1ldGVyaXplZFR5cGUoQVNUIGFzdCkgeworLy8JCXN1cGVyKGFzdCk7CisvLwl9CisvLworLy8JcHVibGljIFR5cGUgZ2V0R2VuZXJpY1R5cGUoKTsKKy8vCXB1YmxpYyB2b2lkIHNldEdlbmVyaWNUeXBlKFR5cGUgZ2VuZXJpY1R5cGUpOworLy8KKy8vCXB1YmxpYyBOb2RlTGlzdDxUeXBlPiBwYXJhbWV0ZXJzKCk7CisvL30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDc2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0MDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CYXNlVHlwZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdHlwZSBiaW5kaW5ncy4KKyAqLworY2xhc3MgVHlwZUJpbmRpbmcgaW1wbGVtZW50cyBJVHlwZUJpbmRpbmcgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVHlwZUJpbmRpbmdbXSBOT19JTlRFUkZBQ0VTID0gbmV3IElUeXBlQmluZGluZ1swXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVHlwZUJpbmRpbmdbXSBOT19ERUNMQVJFRF9UWVBFUyA9IG5ldyBJVHlwZUJpbmRpbmdbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZhcmlhYmxlQmluZGluZ1tdIE5PX0RFQ0xBUkVEX0ZJRUxEUyA9IG5ldyBJVmFyaWFibGVCaW5kaW5nWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElNZXRob2RCaW5kaW5nW10gTk9fREVDTEFSRURfTUVUSE9EUyA9IG5ldyBJTWV0aG9kQmluZGluZ1swXTsKKwkKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgYmluZGluZzsKKwlwcml2YXRlIEJpbmRpbmdSZXNvbHZlciByZXNvbHZlcjsKKwlwcml2YXRlIElWYXJpYWJsZUJpbmRpbmdbXSBmaWVsZHM7CisJcHJpdmF0ZSBJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHM7CisJCisJcHVibGljIFR5cGVCaW5kaW5nKEJpbmRpbmdSZXNvbHZlciByZXNvbHZlciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyBiaW5kaW5nKSB7CisJCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNpc1ByaW1pdGl2ZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisJCXJldHVybiBiaW5kaW5nLmlzQmFzZVR5cGUoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVR5cGVCaW5kaW5nI2lzQXJyYXkoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CisJCXJldHVybiBiaW5kaW5nLmlzQXJyYXlUeXBlKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNnZXRFbGVtZW50VHlwZSgpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXRFbGVtZW50VHlwZSgpIHsKKwkJaWYgKCF0aGlzLmlzQXJyYXkoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmc7CisJCXJldHVybiByZXNvbHZlci5nZXRUeXBlQmluZGluZyhhcnJheUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUpOworCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjZ2V0RGltZW5zaW9ucygpCisJICovCisJcHVibGljIGludCBnZXREaW1lbnNpb25zKCkgeworCQlpZiAoIXRoaXMuaXNBcnJheSgpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYmluZGluZzsKKwkJcmV0dXJuIGFycmF5QmluZGluZy5kaW1lbnNpb25zOworCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNDbGFzcygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuYmluZGluZy5pc0NsYXNzKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNpc0ludGVyZmFjZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzQW5vbnltb3VzVHlwZSgpKSB7CisJCQkJcmV0dXJuIE5PX05BTUU7CisJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCQljaGFyW10gbmFtZSA9IHJlZmVyZW5jZUJpbmRpbmcuY29tcG91bmROYW1lW3JlZmVyZW5jZUJpbmRpbmcuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdOworCQkJCXJldHVybiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignJCcsIG5hbWUpICsgMSwgbmFtZS5sZW5ndGgpKTsKKwkJCX0gZWxzZSBpZiAocmVmZXJlbmNlQmluZGluZy5pc0xvY2FsVHlwZSgpKSB7CisJCQkJY2hhcltdIG5hbWUgPSByZWZlcmVuY2VCaW5kaW5nLmNvbXBvdW5kTmFtZVtyZWZlcmVuY2VCaW5kaW5nLmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXTsKKwkJCQlyZXR1cm4gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyQnLCBuYW1lKSArIDEsIG5hbWUubGVuZ3RoKSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBuZXcgU3RyaW5nKHJlZmVyZW5jZUJpbmRpbmcuY29tcG91bmROYW1lW3JlZmVyZW5jZUJpbmRpbmcuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdKTsKKwkJCX0KKwkJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcuaXNBcnJheVR5cGUoKSkgeworCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCWludCBkaW1lbnNpb25zID0gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnM7CisJCQljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07CisJCQlmb3IgKGludCBpID0gZGltZW5zaW9ucyAqIDIgLSAxOyBpID49IDA7IGkgLT0gMikgeworCQkJCWJyYWNrZXRzW2ldID0gJ10nOworCQkJCWJyYWNrZXRzW2kgLSAxXSA9ICdbJzsKKwkJCX0KKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIGxlYWZDb21wb25lbnRUeXBlQmluZGluZyA9IGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZTsKKwkJCWlmIChsZWFmQ29tcG9uZW50VHlwZUJpbmRpbmcuaXNDbGFzcygpIHx8IGxlYWZDb21wb25lbnRUeXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nMiA9IChSZWZlcmVuY2VCaW5kaW5nKSBsZWFmQ29tcG9uZW50VHlwZUJpbmRpbmc7CisJCQkJaWYgKHJlZmVyZW5jZUJpbmRpbmcyLmlzTWVtYmVyVHlwZSgpKSB7CisJCQkJCWNoYXJbXSBuYW1lID0gcmVmZXJlbmNlQmluZGluZzIuY29tcG91bmROYW1lW3JlZmVyZW5jZUJpbmRpbmcyLmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXTsKKwkJCQkJYnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyQnLCBuYW1lKSArIDEsIG5hbWUubGVuZ3RoKSk7CisJCQkJfSBlbHNlIGlmIChyZWZlcmVuY2VCaW5kaW5nMi5pc0xvY2FsVHlwZSgpKSB7CisJCQkJCWNoYXJbXSBuYW1lID0gcmVmZXJlbmNlQmluZGluZzIuY29tcG91bmROYW1lW3JlZmVyZW5jZUJpbmRpbmcyLmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXTsKKwkJCQkJYnVmZmVyLmFwcGVuZChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyQnLCBuYW1lKSArIDEsIG5hbWUubGVuZ3RoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnVmZmVyLmFwcGVuZChyZWZlcmVuY2VCaW5kaW5nMi5jb21wb3VuZE5hbWVbcmVmZXJlbmNlQmluZGluZzIuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQobGVhZkNvbXBvbmVudFR5cGVCaW5kaW5nLnJlYWRhYmxlTmFtZSgpKTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoYnJhY2tldHMpOworCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5iaW5kaW5nLnJlYWRhYmxlTmFtZSgpKTsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjZ2V0UGFja2FnZSgpCisJICovCisJcHVibGljIElQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQmFzZVR5cGUoKSB8fCB0aGlzLmJpbmRpbmcuaXNBcnJheVR5cGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZXIuZ2V0UGFja2FnZUJpbmRpbmcocmVmZXJlbmNlQmluZGluZy5nZXRQYWNrYWdlKCkpOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJpbmdDbGFzcygpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXREZWNsYXJpbmdDbGFzcygpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0FycmF5VHlwZSgpIHx8IHRoaXMuYmluZGluZy5pc0Jhc2VUeXBlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCWlmIChyZWZlcmVuY2VCaW5kaW5nLmlzTmVzdGVkVHlwZSgpKSB7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZyhyZWZlcmVuY2VCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjZ2V0U3VwZXJjbGFzcygpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXRTdXBlcmNsYXNzKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQXJyYXlUeXBlKCkgfHwgdGhpcy5iaW5kaW5nLmlzQmFzZVR5cGUoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gcmVmZXJlbmNlQmluZGluZy5zdXBlcmNsYXNzKCk7CisJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKHN1cGVyY2xhc3MpOwkJCisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNnZXRJbnRlcmZhY2VzKCkKKwkgKi8KKwlwdWJsaWMgSVR5cGVCaW5kaW5nW10gZ2V0SW50ZXJmYWNlcygpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0FycmF5VHlwZSgpIHx8IHRoaXMuYmluZGluZy5pc0Jhc2VUeXBlKCkpIHsKKwkJCXJldHVybiBOT19JTlRFUkZBQ0VTOworCQl9CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gcmVmZXJlbmNlQmluZGluZy5zdXBlckludGVyZmFjZXMoKTsKKwkJaW50IGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBOT19JTlRFUkZBQ0VTOworCQl9IGVsc2UgeworCQkJSVR5cGVCaW5kaW5nW10gbmV3SW50ZXJmYWNlcyA9IG5ldyBJVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQluZXdJbnRlcmZhY2VzW2ldID0gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZyhpbnRlcmZhY2VzW2ldKTsKKwkJCX0KKwkJCXJldHVybiBuZXdJbnRlcmZhY2VzOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldE1vZGlmaWVycygpCisJICovCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCWlmICh0aGlzLmJpbmRpbmcuaXNDbGFzcygpKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNBbm9ueW1vdXNUeXBlKCkpIHsKKwkJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5nZXRBY2Nlc3NGbGFncygpICYgfk1vZGlmaWVyLkZJTkFMOworCQkJfQorCQkJcmV0dXJuIHJlZmVyZW5jZUJpbmRpbmcuZ2V0QWNjZXNzRmxhZ3MoKTsKKwkJfSBlbHNlIGlmICh0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCS8vIGNsZWFyIHRoZSBBY2NBYnN0cmFjdCBhbmQgdGhlIEFjY0ludGVyZmFjZSBiaXRzCisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5nZXRBY2Nlc3NGbGFncygpICYgfihNb2RpZmllci5BQlNUUkFDVCB8IDB4MjAwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJlZE1vZGlmaWVycygpCisJICovCisJcHVibGljIGludCBnZXREZWNsYXJlZE1vZGlmaWVycygpIHsKKwkJcmV0dXJuIGdldE1vZGlmaWVycygpOworCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNUb3BMZXZlbCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUb3BMZXZlbCgpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlyZXR1cm4gIXJlZmVyZW5jZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNOZXN0ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCXJldHVybiByZWZlcmVuY2VCaW5kaW5nLmlzTmVzdGVkVHlwZSgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVR5cGVCaW5kaW5nI2lzTWVtYmVyKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01lbWJlcigpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5pc01lbWJlclR5cGUoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNpc0xvY2FsKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCXJldHVybiByZWZlcmVuY2VCaW5kaW5nLmlzTG9jYWxUeXBlKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNBbm9ueW1vdXMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCXJldHVybiByZWZlcmVuY2VCaW5kaW5nLmlzQW5vbnltb3VzVHlwZSgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVR5cGVCaW5kaW5nI2dldERlY2xhcmVkVHlwZXMoKQorCSAqLworCXB1YmxpYyBJVHlwZUJpbmRpbmdbXSBnZXREZWNsYXJlZFR5cGVzKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBtZW1iZXJzID0gcmVmZXJlbmNlQmluZGluZy5tZW1iZXJUeXBlcygpOworCQkJaW50IGxlbmd0aCA9IG1lbWJlcnMubGVuZ3RoOworCQkJSVR5cGVCaW5kaW5nW10gbmV3TWVtYmVycyA9IG5ldyBJVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQluZXdNZW1iZXJzW2ldID0gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZyhtZW1iZXJzW2ldKTsKKwkJCX0KKwkJCXJldHVybiBuZXdNZW1iZXJzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5PX0RFQ0xBUkVEX1RZUEVTOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNnZXREZWNsYXJlZEZpZWxkcygpCisJICovCisJcHVibGljIElWYXJpYWJsZUJpbmRpbmdbXSBnZXREZWNsYXJlZEZpZWxkcygpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSByZWZlcmVuY2VCaW5kaW5nLmZpZWxkcygpOworCQkJaW50IGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7CisJCQlJVmFyaWFibGVCaW5kaW5nW10gbmV3RmllbGRzID0gbmV3IElWYXJpYWJsZUJpbmRpbmdbbGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQluZXdGaWVsZHNbaV0gPSB0aGlzLnJlc29sdmVyLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZHNbaV0pOworCQkJfQorCQkJcmV0dXJuIG5ld0ZpZWxkczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBOT19ERUNMQVJFRF9GSUVMRFM7CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSVR5cGVCaW5kaW5nI2dldERlY2xhcmVkTWV0aG9kcygpCisJICovCisJcHVibGljIElNZXRob2RCaW5kaW5nW10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgeworCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgeworCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSByZWZlcmVuY2VCaW5kaW5nLm1ldGhvZHMoKTsKKwkJCWludCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsKKwkJCUlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG5ldyBJTWV0aG9kQmluZGluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCW5ld01ldGhvZHNbaV0gPSB0aGlzLnJlc29sdmVyLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kc1tpXSk7CisJCQl9CisJCQlyZXR1cm4gbmV3TWV0aG9kczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBOT19ERUNMQVJFRF9NRVRIT0RTOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElUeXBlQmluZGluZyNpc0Zyb21Tb3VyY2UoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRnJvbVNvdXJjZSgpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlyZXR1cm4gIXJlZmVyZW5jZUJpbmRpbmcuaXNCaW5hcnlCaW5kaW5nKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJQmluZGluZyNnZXRLaW5kKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEtpbmQoKSB7CisJCXJldHVybiBJQmluZGluZy5UWVBFOworCX0KKworCS8qCisJICogQHNlZSBJQmluZGluZyNpc0RlcHJlY2F0ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHsKKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmJpbmRpbmc7CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5pc0RlcHJlY2F0ZWQoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBJQmluZGluZyNpc1N5bnRoZXRpYygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0S2V5KCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJaWYgKGlzTG9jYWwoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMuYmluZGluZy5pc0NsYXNzKCkgfHwgdGhpcy5iaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKGdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisJCQkJLmFwcGVuZCgnLicpCisJCQkJLmFwcGVuZChnZXROYW1lKCkpOworCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9IGVsc2UgaWYgKHRoaXMuYmluZGluZy5pc0FycmF5VHlwZSgpKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VHlwZSgpLmdldEtleSgpICsgdGhpcy5nZXREaW1lbnNpb25zKCk7CisJCX0KKwkJLy8gdGhpcyBpcyBhIHByaW1pdGl2ZSB0eXBlCisJCXJldHVybiB0aGlzLmdldE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUeXBlQmluZGluZyNpc051bGxUeXBlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc051bGxUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5iaW5kaW5nID09IEJhc2VUeXBlcy5OdWxsQmluZGluZzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NGI2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUeXBlIGRlY2xhcmF0aW9uIEFTVCBub2RlIHR5cGUuIEEgdHlwZSBkZWNsYXJhdGlvbgorICogaXMgdGhlIHVuaW9uIG9mIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIGFuIGludGVyZmFjZSBkZWNsYXJhdGlvbi4KKyAqCisgKiA8cHJlPgorICogVHlwZURlY2xhcmF0aW9uOgorICogCQlDbGFzc0RlY2xhcmF0aW9uCisgKiAJCUludGVyZmFjZURlY2xhcmF0aW9uCisgKiBDbGFzc0RlY2xhcmF0aW9uOgorICogICAgICBbIEphdmFkb2MgXSB7IE1vZGlmaWVyIH0gPGI+Y2xhc3M8L2I+IElkZW50aWZpZXIKKyAqCQkJWyA8Yj5leHRlbmRzPC9iPiBUeXBlXQorICoJCQlbIDxiPmltcGxlbWVudHM8L2I+IFR5cGUgeyA8Yj4sPC9iPiBUeXBlIH0gXQorICoJCQk8Yj57PC9iPiB7IENsYXNzQm9keURlY2xhcmF0aW9uIHwgPGI+OzwvYj4gfSA8Yj59PC9iPgorICogSW50ZXJmYWNlRGVjbGFyYXRpb246CisgKiAgICAgIFsgSmF2YWRvYyBdIHsgTW9kaWZpZXIgfSA8Yj5pbnRlcmZhY2U8L2I+IElkZW50aWZpZXIKKyAqCQkJWyA8Yj5leHRlbmRzPC9iPiBUeXBlXQorICogCQkJPGI+ezwvYj4geyBJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24gfCA8Yj47PC9iPiB9IDxiPn08L2I+CisgKiA8L3ByZT4KKyAqIDxwPgorICogV2hlbiBhIEphdmFkb2MgY29tbWVudCBpcyBwcmVzZW50LCB0aGUgc291cmNlCisgKiByYW5nZSBiZWdpbnMgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSAiLyoqIiBjb21tZW50IGRlbGltaXRlci4KKyAqIFdoZW4gdGhlcmUgaXMgbm8gSmF2YWRvYyBjb21tZW50LCB0aGUgc291cmNlIHJhbmdlIGJlZ2lucyB3aXRoIHRoZSBmaXJzdAorICogY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCBtb2RpZmllciBrZXl3b3JkIChpZiBtb2RpZmllcnMpLCBvciB0aGUKKyAqIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgImNsYXNzIiBvciAiaW50ZXJmYWNlIjoga2V5d29yZCAoaWYgbm8gbW9kaWZpZXJzKS4KKyAqIFRoZSBzb3VyY2UgcmFuZ2UgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgIjsiIHRva2VuIChpZgorICogbm8gYm9keSksIG9yIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgIn0iIHRva2VuIGZvbGxvd2luZyB0aGUgYm9keQorICogZGVjbGFyYXRpb25zLgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24geworCQorCS8qKgorCSAqIE1hc2sgY29udGFpbmluZyBhbGwgbGVnYWwgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVHQUxfTU9ESUZJRVJTID0gCisJCU1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5QUk9URUNURUQKKwkJfCBNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLkFCU1RSQUNUCisJCXwgTW9kaWZpZXIuU1RSSUNURlA7CisJCQorCS8qKgorCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhbiBpbnRlcmZhY2UsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgYSBjbGFzcy4KKwkgKiBEZWZhdWx0cyB0byBjbGFzcy4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBUaGUgbW9kaWZpZXJzOyBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBmbGFncy4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgaW50IG1vZGlmaWVycyA9IE1vZGlmaWVyLk5PTkU7CisJCisJLyoqCisJICogVGhlIHR5cGUgbmFtZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIEphdmEgY2xhc3MgaWRlbnRpZmllci4KKwkgKi8KKwlwcml2YXRlIFNpbXBsZU5hbWUgdHlwZU5hbWUgPSBudWxsOworCisJLyoqCisJICogVGhlIG9wdGlvbmFsIHN1cGVyY2xhc3MgbmFtZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiBEZWZhdWx0cyB0byBub25lLiBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBub3QgdXNlZCBmb3IKKwkgKiBpbnRlcmZhY2UgZGVjbGFyYXRpb25zLgorCSAqLworCXByaXZhdGUgTmFtZSBvcHRpb25hbFN1cGVyY2xhc3NOYW1lID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBzdXBlcmludGVyZmFjZSBuYW1lcyAoZWxlbWVudCB0eXBlOiA8Y29kZT5OYW1lPC9jb2RlPikuIAorCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHN1cGVySW50ZXJmYWNlTmFtZXMgPQorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdChmYWxzZSwgTmFtZS5jbGFzcyk7CisKKwkvKioKKwkgKiBUaGUgYm9keSBkZWNsYXJhdGlvbnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPikuCisJICogRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IAorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBCb2R5RGVjbGFyYXRpb24uY2xhc3MpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB0eXBlIGRlY2xhcmF0aW9uIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzIGZvciBhIGNsYXNzIG9mIGFuCisJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgbmFtZTsgbm8gbW9kaWZpZXJzOyBubyBqYXZhZG9jOyAKKwkgKiBubyBzdXBlcmNsYXNzIG9yIHN1cGVyaW50ZXJmYWNlczsgYW5kIGFuIGVtcHR5IGxpc3Qgb2YgYm9keQorCSAqIGRlY2xhcmF0aW9ucy4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlOyBhbGwgc3ViY2xhc3NlcyBtdXN0IGJlIAorCSAqIGRlY2xhcmVkIGluIHRoZSBzYW1lIHBhY2thZ2U7IGNsaWVudHMgYXJlIHVuYWJsZSB0byBkZWNsYXJlIAorCSAqIGFkZGl0aW9uYWwgc3ViY2xhc3Nlcy4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVR5cGVEZWNsYXJhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFRZUEVfREVDTEFSQVRJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOworCQlyZXN1bHQuc2V0SmF2YWRvYygKKwkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwoQVNUTm9kZSkgZ2V0SmF2YWRvYygpKSk7CisJCXJlc3VsdC5zZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UoKSk7CisJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRTdXBlcmNsYXNzKAorCQkJKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LChBU1ROb2RlKSBnZXRTdXBlcmNsYXNzKCkpKTsKKwkJcmVzdWx0LnN1cGVySW50ZXJmYWNlcygpLmFkZEFsbCgKKwkJCUFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgc3VwZXJJbnRlcmZhY2VzKCkpKTsKKwkJcmVzdWx0LmJvZHlEZWNsYXJhdGlvbnMoKS5hZGRBbGwoCisJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGJvZHlEZWNsYXJhdGlvbnMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0SmF2YWRvYygpKTsKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldE5hbWUoKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRTdXBlcmNsYXNzKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgc3VwZXJJbnRlcmZhY2VOYW1lcyk7CisJCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBib2R5RGVjbGFyYXRpb25zKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgY2xhc3Mgb3IgYW4gCisJICogaW50ZXJmYWNlLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24sCisJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2xhc3MgZGVjbGFyYXRpb24KKwkgKi8gCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiBpc0ludGVyZmFjZTsKKwl9CisJCisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBkZWNsYXJlcyBhIGNsYXNzIG9yIGFuIAorCSAqIGludGVyZmFjZS4KKwkgKiAKKwkgKiBAcGFyYW0gaXNJbnRlcmZhY2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UKKwkgKiAgICBkZWNsYXJhdGlvbiwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIGlzIGEgY2xhc3MKKwkgKiAJICBkZWNsYXJhdGlvbgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoYm9vbGVhbiBpc0ludGVyZmFjZSkgeworCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5pc0ludGVyZmFjZSA9IGlzSW50ZXJmYWNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBkZXByZWNhdGVkIGlzIG5vdCBpbmNsdWRlZC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYml0LXdpc2Ugb3Igb2YgTW9kaWZpZXIgY29uc3RhbnRzCisJICogQHNlZSBNb2RpZmllcgorCSAqLyAKKwlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJcmV0dXJuIG1vZGlmaWVyczsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgbW9kaWZpZXJzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoaXMgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogVGhlIGZvbGxvd2luZyBtb2RpZmllcnMgYXJlIHZhbGlkIGZvciB0eXBlczogcHVibGljLCBwcml2YXRlLCBwcm90ZWN0ZWQsCisJICogc3RhdGljLCBmaW5hbCwgYWJzdHJhY3QsIGFuZCBzdHJpY3RmcC4KKwkgKiA8L3A+CisJICogPHA+CisJICogT25seSBhIHN1YnNldCBvZiBtb2RpZmllcnMgYXJlIGxlZ2FsIGluIGFueSBnaXZlbiBzaXR1YXRpb24uCisJICogTm90ZSB0aGF0IGRlcHJlY2F0ZWQgaXMgbm90IGluY2x1ZGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1vZGlmaWVycyBhcmUgaWxsZWdhbAorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgeworCQlpZiAoKG1vZGlmaWVycyAmIH5MRUdBTF9NT0RJRklFUlMpICE9IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIHR5cGUgZGVjbGFyYXRpb24uCisJICogCisJICogQHJldHVybiB0aGUgdHlwZSBuYW1lIG5vZGUKKwkgKi8gCisJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiB0byB0aGUKKwkgKiBnaXZlbiBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgbmV3IHR5cGUgbmFtZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIHR5cGVOYW1lKSB7CisJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMudHlwZU5hbWUsIHR5cGVOYW1lLCBmYWxzZSk7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisKKy8vCUpTUi0wMTQgZmVhdHVyZQorLy8JcHVibGljIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMoKSB7CisvLwkJdGhyb3cgUnVudGltZUV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIHlldCIpOworLy8JfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKKwkgKiBkZWNsYXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm9uZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBjaGlsZCBpcyBub3QgcmVsZXZhbnQgZm9yIGludGVyZmFjZSBkZWNsYXJhdGlvbnMKKwkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucykuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN1cGVyY2xhc3MgbmFtZSBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiAgICB0aGVyZSBpcyBub25lCisJICovIAorCXB1YmxpYyBOYW1lIGdldFN1cGVyY2xhc3MoKSB7CisJCXJldHVybiBvcHRpb25hbFN1cGVyY2xhc3NOYW1lOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIG9yIGNsZWFycyB0aGUgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKKwkgKiBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBjaGlsZCBpcyBub3QgcmVsZXZhbnQgZm9yIGludGVyZmFjZSBkZWNsYXJhdGlvbnMKKwkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucykuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBzdXBlcmNsYXNzTmFtZSB0aGUgc3VwZXJjbGFzcyBuYW1lIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorCSAqICAgIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldFN1cGVyY2xhc3MoTmFtZSBzdXBlcmNsYXNzTmFtZSkgeworCQlyZXBsYWNlQ2hpbGQoCisJCQkoQVNUTm9kZSkgdGhpcy5vcHRpb25hbFN1cGVyY2xhc3NOYW1lLAorCQkJKEFTVE5vZGUpIHN1cGVyY2xhc3NOYW1lLCBmYWxzZSk7CisJCXRoaXMub3B0aW9uYWxTdXBlcmNsYXNzTmFtZSA9IHN1cGVyY2xhc3NOYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdmUgb3JkZXJlZCBsaXN0IG9mIG5hbWVzIG9mIHN1cGVyaW50ZXJmYWNlcyBvZiB0aGlzIHR5cGUgCisJICogZGVjbGFyYXRpb24uIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgdGhlIG5hbWVzIG9mIHRoZQorCSAqIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHM7IGZvciBhbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24sCisJICogdGhlc2UgYXJlIHRoZSBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGV4dGVuZHMuCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGludGVyZmFjZSBuYW1lcworCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPk5hbWU8L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBzdXBlckludGVyZmFjZXMoKSB7CisJCXJldHVybiBzdXBlckludGVyZmFjZU5hbWVzOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXZlIG9yZGVyZWQgbGlzdCBvZiBib2R5IGRlY2xhcmF0aW9ucyBvZiB0aGlzIHR5cGUgCisJICogZGVjbGFyYXRpb24uIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgdGhlCisJICogaW5pdGlhbGl6ZXIsIGZpZWxkLCBtZXRob2QsIGNvbnN0cnVjdG9yLCBhbmQgbWVtYmVyIHR5cGUKKwkgKiBkZWNsYXJhdGlvbnM7IGZvciBhbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24sIHRoZXNlIGFyZSAKKwkgKiB0aGUgY29uc3RhbnQsIG1ldGhvZCwgYW5kIG1lbWJlciB0eXBlIGRlY2xhcmF0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXZlIGxpc3Qgb2YgYm9keSBkZWNsYXJhdGlvbnMKKwkgKiAgICAoZWxlbWVudCB0eXBlOiA8Y29kZT5Cb2R5RGVjbGFyYXRpb248L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBib2R5RGVjbGFyYXRpb25zKCkgeworCQlyZXR1cm4gYm9keURlY2xhcmF0aW9uczsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgb3JkZXJlZCBsaXN0IG9mIGZpZWxkIGRlY2xhcmF0aW9ucyBvZiB0aGlzIHR5cGUgCisJICogZGVjbGFyYXRpb24uIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgdGhlCisJICogZmllbGQgZGVjbGFyYXRpb25zOyBmb3IgYW4gaW50ZXJmYWNlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUKKwkgKiB0aGUgY29uc3RhbnQgZGVjbGFyYXRpb25zLgorCSAqIDxwPgorCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHJldHVybnMgdGhpcyBub2RlJ3MgYm9keSBkZWNsYXJhdGlvbnMKKwkgKiB3aXRoIG5vbi1maWVsZHMgZmlsdGVyZWQgb3V0LiBVbmxpa2UgPGNvZGU+Ym9keURlY2xhcmF0aW9uczwvY29kZT4sCisJICogdGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgbGl2ZSByZXN1bHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBmaWVsZCBkZWNsYXJhdGlvbnMKKwkgKi8gCisJcHVibGljIEZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHMoKSB7CisJCUxpc3QgYmQgPSBib2R5RGVjbGFyYXRpb25zKCk7CisJCWludCBmaWVsZENvdW50ID0gMDsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGJkLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJaWYgKGl0Lm5leHQoKSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCQlmaWVsZENvdW50Kys7CisJCQl9CisJCX0KKwkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW2ZpZWxkQ291bnRdOworCQlpbnQgbmV4dCA9IDA7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBiZC5saXN0SXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCU9iamVjdCBkZWNsID0gaXQubmV4dCgpOworCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJCQkJZmllbGRzW25leHQrK10gPSAoRmllbGREZWNsYXJhdGlvbikgZGVjbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmllbGRzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9yZGVyZWQgbGlzdCBvZiBtZXRob2QgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZSAKKwkgKiBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCByZXR1cm5zIHRoaXMgbm9kZSdzIGJvZHkgZGVjbGFyYXRpb25zCisJICogd2l0aCBub24tbWV0aG9kcyBmaWx0ZXJlZCBvdXQuIFVubGlrZSA8Y29kZT5ib2R5RGVjbGFyYXRpb25zPC9jb2RlPiwKKwkgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYSBsaXZlIHJlc3VsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIG1ldGhvZCAoYW5kIGNvbnN0cnVjdG9yKSAKKwkgKiAgICBkZWNsYXJhdGlvbnMKKwkgKi8gCisJcHVibGljIE1ldGhvZERlY2xhcmF0aW9uW10gZ2V0TWV0aG9kcygpIHsKKwkJTGlzdCBiZCA9IGJvZHlEZWNsYXJhdGlvbnMoKTsKKwkJaW50IG1ldGhvZENvdW50ID0gMDsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGJkLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJaWYgKGl0Lm5leHQoKSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkJbWV0aG9kQ291bnQrKzsKKwkJCX0KKwkJfQorCQlNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb25bbWV0aG9kQ291bnRdOworCQlpbnQgbmV4dCA9IDA7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBiZC5saXN0SXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCU9iamVjdCBkZWNsID0gaXQubmV4dCgpOworCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworCQkJCW1ldGhvZHNbbmV4dCsrXSA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWV0aG9kczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3Qgb2YgbWVtYmVyIHR5cGUgZGVjbGFyYXRpb25zIG9mIHRoaXMgdHlwZSAKKwkgKiBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCByZXR1cm5zIHRoaXMgbm9kZSdzIGJvZHkgZGVjbGFyYXRpb25zCisJICogd2l0aCBub24tdHlwZXMgZmlsdGVyZWQgb3V0LiBVbmxpa2UgPGNvZGU+Ym9keURlY2xhcmF0aW9uczwvY29kZT4sCisJICogdGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgbGl2ZSByZXN1bHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBtZW1iZXIgdHlwZSBkZWNsYXJhdGlvbnMKKwkgKi8gCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzKCkgeworCQlMaXN0IGJkID0gYm9keURlY2xhcmF0aW9ucygpOworCQlpbnQgdHlwZUNvdW50ID0gMDsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGJkLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworCQkJaWYgKGl0Lm5leHQoKSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeworCQkJCXR5cGVDb3VudCsrOworCQkJfQorCQl9CisJCVR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvblt0eXBlQ291bnRdOworCQlpbnQgbmV4dCA9IDA7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBiZC5saXN0SXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCU9iamVjdCBkZWNsID0gaXQubmV4dCgpOworCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKwkJCQltZW1iZXJUeXBlc1tuZXh0KytdID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWVtYmVyVHlwZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBpcyBhIHBhY2thZ2UgbWVtYmVyICh0aGF0IGlzLAorCSAqIGEgdG9wLWxldmVsIHR5cGUpLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2ltcGx5IGNoZWNrcyB3aGV0aGVyCisJICogdGhpcyBub2RlJ3MgcGFyZW50IGlzIGEgY29tcGlsYXRpb24gdW5pdCBub2RlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBpcyBhIGNoaWxkIG9mCisJICogICBhIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8gCisJcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlTWVtYmVyVHlwZURlY2xhcmF0aW9uKCkgeworCQlBU1ROb2RlIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlyZXR1cm4gKHBhcmVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBkZWNsYXJhdGlvbiBpcyBhIHR5cGUgbWVtYmVyLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2ltcGx5IGNoZWNrcyB3aGV0aGVyCisJICogdGhpcyBub2RlJ3MgcGFyZW50IGlzIGEgdHlwZSBkZWNsYXJhdGlvbiBub2RlIG9yIGFuIGFub255bW91cyAKKwkgKiBjbGFzcyBkZWNsYXJhdGlvbi4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgZGVjbGFyYXRpb24gaXMgYSBjaGlsZCBvZgorCSAqICAgYSB0eXBlIGRlY2xhcmF0aW9uIG5vZGUgb3IgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBub2RlLCBhbmQgCisJICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovIAorCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyVHlwZURlY2xhcmF0aW9uKCkgeworCQlBU1ROb2RlIHBhcmVudCA9IGdldFBhcmVudCgpOworCQlyZXR1cm4gKHBhcmVudCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikKKwkJCXx8IChwYXJlbnQgaW5zdGFuY2VvZiBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgbG9jYWwgdHlwZS4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHNpbXBseSBjaGVja3Mgd2hldGhlcgorCSAqIHRoaXMgbm9kZSdzIHBhcmVudCBpcyBhIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIGRlY2xhcmF0aW9uIGlzIGEgY2hpbGQgb2YKKwkgKiAgIGEgdHlwZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgbm9kZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8gCisJcHVibGljIGJvb2xlYW4gaXNMb2NhbFR5cGVEZWNsYXJhdGlvbigpIHsKKwkJQVNUTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKwkJcmV0dXJuIChwYXJlbnQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOworCX0KKwkKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJlZCBpbgorCSAqIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgYmluZGluZ3MgYXJlIGdlbmVyYWxseSB1bmF2YWlsYWJsZSB1bmxlc3MgcmVxdWVzdGVkIHdoZW4gdGhlCisJICogQVNUIGlzIGJlaW5nIGJ1aWx0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBjYW5ub3QgYmUgCisJICogICAgcmVzb2x2ZWQKKwkgKi8JCisJcHVibGljIElUeXBlQmluZGluZyByZXNvbHZlQmluZGluZygpIHsKKwkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVUeXBlKHRoaXMpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFwcGVuZERlYnVnU3RyaW5nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJYnVmZmVyLmFwcGVuZCgiVHlwZURlY2xhcmF0aW9uWyIpOy8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChpc0ludGVyZmFjZSgpID8gImludGVyZmFjZSAiIDogImNsYXNzICIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCisJCWZvciAoSXRlcmF0b3IgaXQgPSBib2R5RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKwkJCUJvZHlEZWNsYXJhdGlvbiBkID0gKEJvZHlEZWNsYXJhdGlvbikgaXQubmV4dCgpOworCQkJZC5hcHBlbmREZWJ1Z1N0cmluZyhidWZmZXIpOworCQkJaWYgKGl0Lmhhc05leHQoKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgiXSIpOy8vJE5PTi1OTFMtMSQKKwl9CisJCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgNiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGdldEphdmFkb2MoKSA9PSBudWxsID8gMCA6IGdldEphdmFkb2MoKS50cmVlU2l6ZSgpKQorCQkJKyAodHlwZU5hbWUgPT0gbnVsbCA/IDAgOiBnZXROYW1lKCkudHJlZVNpemUoKSkKKwkJCSsgKG9wdGlvbmFsU3VwZXJjbGFzc05hbWUgPT0gbnVsbCA/IDAgOiBnZXRTdXBlcmNsYXNzKCkudHJlZVNpemUoKSkKKwkJCSsgc3VwZXJJbnRlcmZhY2VOYW1lcy5saXN0U2l6ZSgpCisJCQkrIGJvZHlEZWNsYXJhdGlvbnMubGlzdFNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzgzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBMb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBBU1Qgbm9kZSB0eXBlLgorICogPHA+CisgKiBUaGlzIGtpbmQgb2Ygbm9kZSBpcyB1c2VkIHRvIGNvbnZlcnQgYSB0eXBlIGRlY2xhcmF0aW9uCisgKiAoPGNvZGU+VHlwZURlY2xhcmF0aW9uPC9jb2RlPikgaW50byBhIHN0YXRlbWVudAorICogKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pIGJ5IHdyYXBwaW5nIGl0LgorICogPC9wPgorICogPHByZT4KKyAqIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDoKKyAqICAgIFR5cGVEZWNsYXJhdGlvbgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJLyoqCisJICogVGhlIHR5cGUgZGVjbGFyYXRpb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYSB1bnNwZWNpZmllZCwgCisJICogYnV0IGxlZ2FsLCB0eXBlIGRlY2xhcmF0aW9uLgorCSAqLworCXByaXZhdGUgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCBub2RlIG93bmVkIAorCSAqIGJ5IHRoZSBnaXZlbiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIGlzIGFuCisJICogdW5zcGVjaWZpZWQsIGJ1dCBsZWdhbCwgdHlwZSBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gVFlQRV9ERUNMQVJBVElPTl9TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCByZXN1bHQgPSAKKwkJCW5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0VHlwZURlY2xhcmF0aW9uKAorCQkJKFR5cGVEZWNsYXJhdGlvbikgZ2V0VHlwZURlY2xhcmF0aW9uKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUeXBlRGVjbGFyYXRpb24oKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24KKwkgKiBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBub2RlCisJICovIAorCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKCkgeworCQlpZiAodHlwZURlY2wgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0VHlwZURlY2xhcmF0aW9uKG5ldyBUeXBlRGVjbGFyYXRpb24oZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gdHlwZURlY2w7CisJfQorCQkKKwkvKioKKwkgKiBTZXRzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIG9mIHRoaXMgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbgorCSAqIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVjbCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIGRlY2wpIHsKKwkJaWYgKGRlY2wgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCS8vIGEgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYW4gCisJCS8vIFR5cGVEZWNsYXJhdGlvbiAtIG11c3QgY2hlY2sgY3ljbGVzCisJCXJlcGxhY2VDaGlsZCh0aGlzLnR5cGVEZWNsLCBkZWNsLCB0cnVlKTsKKwkJdGhpcy50eXBlRGVjbD0gZGVjbDsKKwl9CisJLyoqCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyZWQgaW4KKwkgKiB0aGlzIHR5cGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSAKKwkgKiAgICByZXNvbHZlZAorCSAqLwkKKwlwdWJsaWMgSVR5cGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCkgeworCQkvLyBmb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHdyYXBwZWQgdHlwZSBkZWNsYXJhdGlvbgorCQlUeXBlRGVjbGFyYXRpb24gZCA9IGdldFR5cGVEZWNsYXJhdGlvbigpOworCQlyZXR1cm4gZC5yZXNvbHZlQmluZGluZygpOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDEgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrICh0eXBlRGVjbCA9PSBudWxsID8gMCA6IGdldFR5cGVEZWNsYXJhdGlvbigpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzZiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVMaXRlcmFsLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCisvKioKKyAqIFR5cGUgbGl0ZXJhbCBBU1Qgbm9kZSB0eXBlLgorICoKKyAqIDxwcmU+CisgKiBUeXBlTGl0ZXJhbDoKKyAqICAgICAoIFR5cGUgfCA8Yj52b2lkPC9iPiApIDxiPi48L2I+IDxiPmNsYXNzPC9iPgorICogPC9wcmU+CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFR5cGVMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwkvKioKKwkgKiBUaGUgdHlwZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byBhIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIHR5cGUuCisJICovCisJcHJpdmF0ZSBUeXBlIHR5cGUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB0eXBlIGxpdGVyYWwgb3duZWQgYnkgdGhlIGdpdmVuIAorCSAqIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGV4cHJlc3Npb24gaGFzIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVR5cGVMaXRlcmFsKEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gVFlQRV9MSVRFUkFMOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlUeXBlTGl0ZXJhbCByZXN1bHQgPSBuZXcgVHlwZUxpdGVyYWwodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFR5cGUoKFR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VHlwZSgpKTsKKwkJfQorCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIGluIHRoaXMgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24uCisJICogCisJICogQHJldHVybiB0aGUgdHlwZQorCSAqLyAKKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRUeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB0eXBlIGluIHRoaXMgdHlwZSBsaXRlcmFsIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHR5cGUuCisJICogCisJICogQHBhcmFtIHR5cGUgdGhlIG5ldyB0eXBlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKChBU1ROb2RlKSB0aGlzLnR5cGUsIChBU1ROb2RlKSB0eXBlLCBmYWxzZSk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IG1lbVNpemUoKSB7CisJCS8vIHRyZWF0IE9wZXJhdG9yIGFzIGZyZWUKKwkJcmV0dXJuIEJBU0VfTk9ERV9TSVpFICsgMSAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuIAorCQkJbWVtU2l6ZSgpCisJCQkrICh0eXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiYmQwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CisKKy8qKgorICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdmFyaWFibGUgYmluZGluZ3MuCisgKi8KK2NsYXNzIFZhcmlhYmxlQmluZGluZyBpbXBsZW1lbnRzIElWYXJpYWJsZUJpbmRpbmcgeworCisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZyBiaW5kaW5nOworCXByaXZhdGUgQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBJVHlwZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3M7CisJcHJpdmF0ZSBJVHlwZUJpbmRpbmcgdHlwZTsKKworCVZhcmlhYmxlQmluZGluZyhCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcpIHsKKwkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOworCQl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworCX0KKworCS8qCisJICogQHNlZSBJVmFyaWFibGVCaW5kaW5nI2lzRmllbGQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmc7CisJfQorCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CisJCQl0aGlzLm5hbWUgPSBuZXcgU3RyaW5nKHRoaXMuYmluZGluZy5uYW1lKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCS8qCisJICogQHNlZSBJVmFyaWFibGVCaW5kaW5nI2dldERlY2xhcmluZ0NsYXNzKCkKKwkgKi8KKwlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldERlY2xhcmluZ0NsYXNzKCkgeworCQlpZiAoaXNGaWVsZCgpKSB7CisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nOworCQkJaWYgKHRoaXMuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeworCQkJCXRoaXMuZGVjbGFyaW5nQ2xhc3MgPSB0aGlzLnJlc29sdmVyLmdldFR5cGVCaW5kaW5nKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQl9CisJCQlyZXR1cm4gdGhpcy5kZWNsYXJpbmdDbGFzczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElWYXJpYWJsZUJpbmRpbmcjZ2V0VHlwZSgpCisJICovCisJcHVibGljIElUeXBlQmluZGluZyBnZXRUeXBlKCkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0eXBlID0gdGhpcy5yZXNvbHZlci5nZXRUeXBlQmluZGluZyh0aGlzLmJpbmRpbmcudHlwZSk7CisJCX0KKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoKKwkgKiBAc2VlIElCaW5kaW5nI2dldEtpbmQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKwkJcmV0dXJuIElCaW5kaW5nLlZBUklBQkxFOworCX0KKworCS8qCisJICogQHNlZSBJQmluZGluZyNnZXRNb2RpZmllcnMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlpZiAoaXNGaWVsZCgpKSB7CisJCQlyZXR1cm4gKChGaWVsZEJpbmRpbmcpIHRoaXMuYmluZGluZykuZ2V0QWNjZXNzRmxhZ3MoKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjaXNEZXByZWNhdGVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKSB7CisJCWlmIChpc0ZpZWxkKCkpIHsKKwkJCXJldHVybiAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5pc0RlcHJlY2F0ZWQoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBJQmluZGluZyNpc1N5bnRoZXRpYygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJCWlmIChpc0ZpZWxkKCkpIHsKKwkJCXJldHVybiAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5pc1N5bnRoZXRpYygpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUJpbmRpbmcjZ2V0S2V5KCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJaWYgKGlzRmllbGQoKSkgeworCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWlmICh0aGlzLmdldERlY2xhcmluZ0NsYXNzKCkgIT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXREZWNsYXJpbmdDbGFzcygpLmdldEtleSgpKTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXROYW1lKCkpOworCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9CQkJCisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKgorCSAqIEBzZWUgSVZhcmlhYmxlQmluZGluZyNnZXRWYXJpYWJsZUlkKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhcmlhYmxlSWQoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcuaWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzM4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgQVNUIG5vZGUgdHlwZXMgdGhhdCBkZWNsYXJlIGEgc2luZ2xlIGxvY2FsIAorICogdmFyaWFibGUuCisgKiA8cD4KKyAqIDxwcmU+CisgKiBWYXJpYWJsZURlY2xhcmF0aW9uOgorICogICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgorICogICAgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCisgKiBAc2VlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgeworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gYXN0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhpcyBub2RlCisJICovCisJVmFyaWFibGVEZWNsYXJhdGlvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCisJICogCisJICogQHJldHVybiB0aGUgdmFyaWFibGUgbmFtZSBub2RlCisJICovIAorCXB1YmxpYyBhYnN0cmFjdCBTaW1wbGVOYW1lIGdldE5hbWUoKTsKKwkJCisJLyoqCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiAKKwkgKiB0byB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuZXcgdmFyaWFibGUgbmFtZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIG5vZGUgYmVsb25ncyB0byBhIGRpZmZlcmVudCBBU1Q8L2xpPgorCSAqIDxsaT50aGUgbm9kZSBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisJICogPC91bD4KKwkgKi8gCisJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIHZhcmlhYmxlTmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplciBvZiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uLCBvciAKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogICAgdGhlcmUgaXMgbm9uZQorCSAqLyAKKwlwdWJsaWMgYWJzdHJhY3QgRXhwcmVzc2lvbiBnZXRJbml0aWFsaXplcigpOworCQorCS8qKgorCSAqIFNldHMgb3IgY2xlYXJzIHRoZSBpbml0aWFsaXplciBvZiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBpbml0aWFsaXplciB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgIGlmIHRoZXJlIGlzIG5vbmUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEluaXRpYWxpemVyKEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpOworCisJLyoqCisJICogUmVzb2x2ZXMgYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIHRoZSB2YXJpYWJsZSBkZWNsYXJlZCBpbiB0aGlzCisJICogdmFyaWFibGUgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQorCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90IGJlIAorCSAqICAgIHJlc29sdmVkCisJICovCQorCXB1YmxpYyBJVmFyaWFibGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCkgeworCQlyZXR1cm4gZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZVZhcmlhYmxlKHRoaXMpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QwMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIExvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqIDxwPgorICogVGhpcyBraW5kIG9mIG5vZGUgY29sbGVjdHMgdG9nZXRoZXIgc2V2ZXJhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMKKyAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgc2luZ2xlIGV4cHJlc3Npb24KKyAqICg8Y29kZT5FeHByZXNzaW9uPC9jb2RlPiksIGFsbCBzaGFyaW5nIHRoZSBzYW1lIG1vZGlmaWVycyBhbmQgYmFzZSB0eXBlLgorICogVGhpcyB0eXBlIG9mIG5vZGUgaXMgdXNlZCAob25seSkgYXMgdGhlIGluaXRpYWxpemVyIG9mIGEKKyAqIDxjb2RlPkZvclN0YXRlbWVudDwvY29kZT4uCisgKiA8L3A+CisgKiA8cHJlPgorICogVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb246CisgKiAgICB7IE1vZGlmaWVyIH0gVHlwZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKKyAqICAgICAgICAgeyA8Yj4sPC9iPiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgfSAKKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCQorCS8qKgorCSAqIE1hc2sgY29udGFpbmluZyBhbGwgbGVnYWwgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVHQUxfTU9ESUZJRVJTID0gTW9kaWZpZXIuRklOQUw7CisKKwkvKioKKwkgKiBUaGUgbW9kaWZpZXJzOyBiaXQtd2lzZSBvciBvZiBNb2RpZmllciBmbGFncy4KKwkgKiBEZWZhdWx0cyB0byBub25lLgorCSAqLworCXByaXZhdGUgaW50IG1vZGlmaWVycyA9IE1vZGlmaWVyLk5PTkU7CisJCQorCS8qKgorCSAqIFRoZSBiYXNlIHR5cGU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogbGVnYWwgdHlwZS4KKwkgKi8KKwlwcml2YXRlIFR5cGUgYmFzZVR5cGUgPSBudWxsOworCisJLyoqCisJICogVGhlIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIChlbGVtZW50IHR5cGU6IAorCSAqIDxjb2RlIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4pLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdC4KKwkgKi8KKwlwcml2YXRlIEFTVE5vZGUuTm9kZUxpc3QgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50cyA9IAorCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCAgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmNsYXNzKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5wYXJlbnRlZCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBleHByZXNzaW9uIG5vZGUKKwkgKiBvd25lZCBieSB0aGUgZ2l2ZW4gQVNULiAgQnkgZGVmYXVsdCwgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGhhczogbm8KKwkgKiBtb2RpZmllcnMsIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUsIGFuZCBhbiBlbXB0eSBsaXN0IG9mIHZhcmlhYmxlCisJICogZGVjbGFyYXRpb24gZnJhZ21lbnRzICh3aGljaCBpcyBzeW50YWN0aWNhbGx5IGlsbGVnYWwpLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihBU1QgYXN0KSB7CisJCXN1cGVyKGFzdCk7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIFZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT047CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHJlc3VsdCA9IAorCQkJbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOworCQlyZXN1bHQuc2V0VHlwZSgoVHlwZSkgZ2V0VHlwZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkQWxsKAorCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBmcmFnbWVudHMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRUeXBlKCkpOworCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50cyk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbW9kaWZpZXJzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoaXMgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBmaW5hbCBtb2RpZmllciBpcyB0aGUgb25seSBtZWFuaW5nZnVsIG1vZGlmaWVyIGZvciBsb2NhbAorCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYml0LXdpc2Ugb3Igb2YgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKi8gCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiBtb2RpZmllcnM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbW9kaWZpZXJzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoaXMgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBmaW5hbCBtb2RpZmllciBpcyB0aGUgb25seSBtZWFuaW5nZnVsIG1vZGlmaWVyIGZvciBsb2NhbAorCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYml0LXdpc2Ugb3Igb2YgPGNvZGU+TW9kaWZpZXI8L2NvZGU+IGNvbnN0YW50cworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpZXJzIGFyZSBpbGxlZ2FsCisJICovIAorCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisJCWlmICgobW9kaWZpZXJzICYgfkxFR0FMX01PRElGSUVSUykgIT0gMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBiYXNlIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKwkgKiA8cD4KKwkgKiBOLkIuIFRoZSBpbmRpdmlkdWFsIGNoaWxkIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBtYXkgc3BlY2lmeSAKKwkgKiBhZGRpdGlvbmFsIGFycmF5IGRpbWVuc2lvbnMuIFNvIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSBhcmUgbm90IAorCSAqIG5lY2Vzc2FyaWx5IGV4YWN0bHkgdGhpcyB0eXBlLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUKKwkgKi8gCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJaWYgKGJhc2VUeXBlID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldFR5cGUoZ2V0QVNUKCkubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOworCQl9CisJCXJldHVybiBiYXNlVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBiYXNlIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byB0aGUgZ2l2ZW4KKwkgKiB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgYmFzZSB0eXBlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMuYmFzZVR5cGUsIHR5cGUsIGZhbHNlKTsKKwkJdGhpcy5iYXNlVHlwZSA9IHR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIAorCSAqIGV4cHJlc3Npb24uIEFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMgZnJvbSB0aGlzIGxpc3QgYWZmZWN0cyB0aGlzIG5vZGUKKwkgKiBkeW5hbWljYWxseS4gQWxsIG5vZGVzIGluIHRoaXMgbGlzdCBtdXN0IGJlIAorCSAqIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT5zOyBhdHRlbXB0cyB0byBhZGQgYW55IG90aGVyCisJICogdHlwZSBvZiBub2RlIHdpbGwgdHJpZ2dlciBhbiBleGNlcHRpb24uCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIAorCSAqICAgIGV4cHJlc3Npb24gKGVsZW1lbnQgdHlwZTogPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPikKKwkgKi8gCisJcHVibGljIExpc3QgZnJhZ21lbnRzKCkgeworCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50czsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJLy8gdHJlYXQgT3BlcmF0b3IgYXMgZnJlZQorCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJaW50IHRyZWVTaXplKCkgeworCQlyZXR1cm4gCisJCQltZW1TaXplKCkKKwkJCSsgKGJhc2VUeXBlID09IG51bGwgPyAwIDogZ2V0VHlwZSgpLnRyZWVTaXplKCkpCisJCQkrIHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMubGlzdFNpemUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWI0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKKworLyoqCisgKiBWYXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCBBU1Qgbm9kZSB0eXBlLCB1c2VkIGluIGZpZWxkIGRlY2xhcmF0aW9ucywgCisgKiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMsIGFuZCA8Y29kZT5Gb3JTdGF0ZW1lbnQ8L2NvZGU+IGluaXRpYWxpemVycy4KKyAqIEl0IGNvbnRyYXN0IHRvIDxjb2RlPlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb248L2NvZGU+LCBmcmFnbWVudHMgYXJlCisgKiBtaXNzaW5nIHRoZSBtb2RpZmllcnMgYW5kIHRoZSB0eXBlOyB0aGVzZSBhcmUgbG9jYXRlZCBpbiB0aGUgZnJhZ21lbnQncworICogcGFyZW50IG5vZGUuCisgKgorICogPHByZT4KKyAqIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDoKKyAqICAgIElkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0gWyA8Yj49PC9iPiBFeHByZXNzaW9uIF0KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZXh0ZW5kcyBWYXJpYWJsZURlY2xhcmF0aW9uIHsKKwkJCisJLyoqCisJICogVGhlIHZhcmlhYmxlIG5hbWU7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsCisJICogbGVnYWwgSmF2YSBpZGVudGlmaWVyLgorCSAqLworCXByaXZhdGUgU2ltcGxlTmFtZSB2YXJpYWJsZU5hbWUgPSBudWxsOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zIHRoYXQgdGhpcyB2YXJpYWJsZTsKKwkgKiBkZWZhdWx0cyB0byAwLgorCSAqLworCXByaXZhdGUgaW50IGV4dHJhQXJyYXlEaW1lbnNpb25zID0gMDsKKworCS8qKgorCSAqIFRoZSBpbml0aWFsaXplciBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOworCSAqIGRlZmF1bHRzIHRvIG5vbmUuCisJICovCisJcHJpdmF0ZSBFeHByZXNzaW9uIG9wdGlvbmFsSW5pdGlhbGl6ZXIgPSBudWxsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQVNUIG5vZGUgZm9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnQgb3duZWQgYnkgdGhlIAorCSAqIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGhhczogYW4gdW5zcGVjaWZpZWQgCisJICogKGJ1dCBsZWdhbCkgdmFyaWFibGUgbmFtZSwgbm8gaW5pdGlhbGl6ZXIsIGFuZCBubyBleHRyYSBhcnJheSBkaW1lbnNpb25zLgorCSAqIDxwPgorCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhc3QgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGlzIG5vZGUKKwkgKi8KKwlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBWQVJJQUJMRV9ERUNMQVJBVElPTl9GUkFHTUVOVDsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHJlc3VsdCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKKwkJcmVzdWx0LnNldEV4dHJhRGltZW5zaW9ucyhnZXRFeHRyYURpbWVuc2lvbnMoKSk7CisJCXJlc3VsdC5zZXRJbml0aWFsaXplcigKKwkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0SW5pdGlhbGl6ZXIoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1YnRyZWVNYXRjaChBU1RNYXRjaGVyIG1hdGNoZXIsIE9iamVjdCBvdGhlcikgeworCQkvLyBkaXNwYXRjaCB0byBjb3JyZWN0IG92ZXJsb2FkZWQgbWF0Y2ggbWV0aG9kCisJCXJldHVybiBtYXRjaGVyLm1hdGNoKHRoaXMsIG90aGVyKTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB7CisJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOworCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0SW5pdGlhbGl6ZXIoKSk7CisJCX0KKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisJCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCisJICovIAorCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisJCWlmICh2YXJpYWJsZU5hbWUgPT0gbnVsbCkgeworCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiB2YXJpYWJsZU5hbWU7CisJfQorCQkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0TmFtZShTaW1wbGVOYW1lIHZhcmlhYmxlTmFtZSkgeworCQlpZiAodmFyaWFibGVOYW1lID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlyZXBsYWNlQ2hpbGQodGhpcy52YXJpYWJsZU5hbWUsIHZhcmlhYmxlTmFtZSwgZmFsc2UpOworCQl0aGlzLnZhcmlhYmxlTmFtZSA9IHZhcmlhYmxlTmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyB0aGlzIHZhcmlhYmxlIGhhcyBvdmVyCisJICogYW5kIGFib3ZlIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlLCBpbiB0aGUgQVNUIGZvciA8Y29kZT5pbnRbXSBpLCBqW10sIGtbXVtdPC9jb2RlPiB0aGUgCisJICogdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIGZvciB0aGUgdmFyaWFibGVzIDxjb2RlPmk8L2NvZGU+LAorCSAqIDxjb2RlPmo8L2NvZGU+LCBhbmQgPGNvZGU+azwvY29kZT4sIGhhdmUgMCwgMSwgYW5kIDIgZXh0cmEgYXJyYXkKKwkgKiBkaW1lbnNpb25zLCByZXNwZWN0aXZlbHkuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zCisJICovIAorCXB1YmxpYyBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCkgeworCQlyZXR1cm4gZXh0cmFBcnJheURpbWVuc2lvbnM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgdGhpcyB2YXJpYWJsZSBoYXMgb3ZlcgorCSAqIGFuZCBhYm92ZSB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVuY2xvc2luZyBkZWNsYXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucworCSAqIEBzZWUgTW9kaWZpZXIKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMgbmVnYXRpdmUKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXh0cmFEaW1lbnNpb25zKGludCBkaW1lbnNpb25zKSB7CisJCWlmIChkaW1lbnNpb25zIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmV4dHJhQXJyYXlEaW1lbnNpb25zID0gZGltZW5zaW9uczsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KKwkgKi8gCisJcHVibGljIEV4cHJlc3Npb24gZ2V0SW5pdGlhbGl6ZXIoKSB7CisJCXJldHVybiBvcHRpb25hbEluaXRpYWxpemVyOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KKwkgKi8gCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoRXhwcmVzc2lvbiBpbml0aWFsaXplcikgeworCQkvLyBhIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbWF5IG9jY3VyIGluc2lkZSBhbiBFeHByZXNzaW9uIAorCQkvLyBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5vcHRpb25hbEluaXRpYWxpemVyLCBpbml0aWFsaXplciwgdHJ1ZSk7CisJCXRoaXMub3B0aW9uYWxJbml0aWFsaXplciA9IGluaXRpYWxpemVyOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCisJCXJldHVybiBCQVNFX05PREVfU0laRSArIDMgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybiAKKwkJCW1lbVNpemUoKQorCQkJKyAodmFyaWFibGVOYW1lID09IG51bGwgPyAwIDogZ2V0TmFtZSgpLnRyZWVTaXplKCkpCisJCQkrIChvcHRpb25hbEluaXRpYWxpemVyID09IG51bGwgPyAwIDogZ2V0SW5pdGlhbGl6ZXIoKS50cmVlU2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDViOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBMb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgQVNUIG5vZGUgdHlwZS4KKyAqIDxwPgorICogVGhpcyBraW5kIG9mIG5vZGUgY29sbGVjdHMgc2V2ZXJhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMKKyAqICg8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KSBpbnRvIGEgc3RhdGVtZW50IAorICogKDxjb2RlPlN0YXRlbWVudDwvY29kZT4pLCBhbGwgc2hhcmluZyB0aGUgc2FtZSBtb2RpZmllcnMgYW5kIGJhc2UgdHlwZS4KKyAqIDwvcD4KKyAqIDxwcmU+CisgKiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OgorICogICAgeyBNb2RpZmllciB9IFR5cGUgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IAorICogICAgICAgIHsgPGI+LDwvYj4gVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IH0gPGI+OzwvYj4KKyAqIDwvcHJlPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwkvKioKKwkgKiBNYXNrIGNvbnRhaW5pbmcgYWxsIGxlZ2FsIG1vZGlmaWVycyBmb3IgdGhpcyBjb25zdHJ1Y3QuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFR0FMX01PRElGSUVSUyA9IE1vZGlmaWVyLkZJTkFMOworCisJLyoqCisJICogVGhlIG1vZGlmaWVyczsgYml0LXdpc2Ugb3Igb2YgTW9kaWZpZXIgZmxhZ3MuCisJICogRGVmYXVsdHMgdG8gbm9uZS4KKwkgKi8KKwlwcml2YXRlIGludCBtb2RpZmllcnMgPSBNb2RpZmllci5OT05FOworCQkKKwkvKioKKwkgKiBUaGUgYmFzZSB0eXBlOyBsYXppbHkgaW5pdGlhbGl6ZWQ7IGRlZmF1bHRzIHRvIGFuIHVuc3BlY2lmaWVkLAorCSAqIGxlZ2FsIHR5cGUuCisJICovCisJcHJpdmF0ZSBUeXBlIGJhc2VUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBsaXN0IG9mIHZhcmlhYmxlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyAoZWxlbWVudCB0eXBlOiAKKwkgKiA8Y29kZSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KS4gIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCisJICovCisJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMgPSAKKwkJbmV3IEFTVE5vZGUuTm9kZUxpc3QodHJ1ZSwgIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5jbGFzcyk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVucGFyZW50ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IG5vZGUgb3duZWQgCisJICogYnkgdGhlIGdpdmVuIEFTVC4gIEJ5IGRlZmF1bHQsIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBoYXM6IG5vIG1vZGlmaWVycywKKwkgKiBhbiB1bnNwZWNpZmllZCAoYnV0IGxlZ2FsKSB0eXBlLCBhbmQgYW4gZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSAKKwkgKiBkZWNsYXJhdGlvbiBmcmFnbWVudHMgKHdoaWNoIGlzIHN5bnRhY3RpY2FsbHkgaWxsZWdhbCkuCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoQVNUIGFzdCkgeworCQlzdXBlcihhc3QpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJCXJldHVybiBWQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CisJCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgcmVzdWx0ID0gCisJCQluZXcgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh0YXJnZXQpOworCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOworCQlyZXN1bHQuc2V0VHlwZSgoVHlwZSkgZ2V0VHlwZSgpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkQWxsKAorCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBmcmFnbWVudHMoKSkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdWJ0cmVlTWF0Y2goQVNUTWF0Y2hlciBtYXRjaGVyLCBPYmplY3Qgb3RoZXIpIHsKKwkJLy8gZGlzcGF0Y2ggdG8gY29ycmVjdCBvdmVybG9hZGVkIG1hdGNoIG1ldGhvZAorCQlyZXR1cm4gbWF0Y2hlci5tYXRjaCh0aGlzLCBvdGhlcik7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgeworCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgorCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0VHlwZSgpKTsKKwkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGUgZmluYWwgbW9kaWZpZXIgaXMgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBmb3IgbG9jYWwKKwkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICovIAorCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gbW9kaWZpZXJzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1vZGlmaWVycyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGlzIGRlY2xhcmF0aW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGUgZmluYWwgbW9kaWZpZXIgaXMgdGhlIG9ubHkgbWVhbmluZ2Z1bCBtb2RpZmllciBmb3IgbG9jYWwKKwkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJpdC13aXNlIG9yIG9mIDxjb2RlPk1vZGlmaWVyPC9jb2RlPiBjb25zdGFudHMKKwkgKiBAc2VlIE1vZGlmaWVyCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1vZGlmaWVycyBhcmUgaWxsZWdhbAorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgeworCQlpZiAoKG1vZGlmaWVycyAmIH5MRUdBTF9NT0RJRklFUlMpICE9IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50LgorCSAqIDxwPgorCSAqIE4uQi4gVGhlIGluZGl2aWR1YWwgY2hpbGQgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJhZ21lbnRzIG1heSBzcGVjaWZ5CisJICogYWRkaXRpb25hbCBhcnJheSBkaW1lbnNpb25zLiBTbyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgYXJlIG5vdCAKKwkgKiBuZWNlc3NhcmlseSBleGFjdGx5IHRoaXMgdHlwZS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgYmFzZSB0eXBlCisJICovIAorCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisJCWlmIChiYXNlVHlwZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRUeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKKwkJfQorCQlyZXR1cm4gYmFzZVR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgYmFzZSB0eXBlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IHRvIAorCSAqIHRoZSBnaXZlbiB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgYmFzZSB0eXBlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJcmVwbGFjZUNoaWxkKHRoaXMuYmFzZVR5cGUsIHR5cGUsIGZhbHNlKTsKKwkJdGhpcy5iYXNlVHlwZSA9IHR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIHN0YXRlbWVudC4KKwkgKiBBZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzIGZyb20gdGhpcyBsaXN0IGFmZmVjdHMgdGhpcyBub2RlIGR5bmFtaWNhbGx5LgorCSAqIEFsbCBub2RlcyBpbiB0aGlzIGxpc3QgbXVzdCBiZSA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+czsKKwkgKiBhdHRlbXB0cyB0byBhZGQgYW55IG90aGVyIHR5cGUgb2Ygbm9kZSB3aWxsIHRyaWdnZXIgYW4KKwkgKiBleGNlcHRpb24uCisJICogCisJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50cyBpbiB0aGlzIAorCSAqICAgIHN0YXRlbWVudCAoZWxlbWVudCB0eXBlOiA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ8L2NvZGU+KQorCSAqLyAKKwlwdWJsaWMgTGlzdCBmcmFnbWVudHMoKSB7CisJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzOworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgbWVtU2l6ZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDMgKiA0OworCX0KKwkKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlpbnQgdHJlZVNpemUoKSB7CisJCXJldHVybgorCQkJbWVtU2l6ZSgpCisJCQkrIChiYXNlVHlwZSA9PSBudWxsID8gMCA6IGdldFR5cGUoKS50cmVlU2l6ZSgpKQorCQkJKyB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRzLmxpc3RTaXplKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1doaWxlU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1doaWxlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlOGUxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vV2hpbGVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CisKKy8qKgorICogV2hpbGUgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCisgKgorICogPHByZT4KKyAqIFdoaWxlU3RhdGVtZW50OgorICogICAgPGI+d2hpbGU8L2I+IDxiPig8L2I+IEV4cHJlc3Npb24gPGI+KTwvYj4gU3RhdGVtZW50CisgKiA8L3ByZT4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgV2hpbGVTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJLyoqCisJICogVGhlIGV4cHJlc3Npb247IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gdW5zcGVjaWZpZWQsIGJ1dCAKKwkgKiBsZWdhbCwgZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgYm9keSBzdGF0ZW1lbnQ7IGxhemlseSBpbml0aWFsaXplZDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgYmxvY2sgCisJICogc3RhdGVtZW50LgorCSAqLworCXByaXZhdGUgU3RhdGVtZW50IGJvZHkgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bnBhcmVudGVkIHdoaWxlIHN0YXRlbWVudCBub2RlIG93bmVkIGJ5IHRoZSBnaXZlbiAKKwkgKiBBU1QuIEJ5IGRlZmF1bHQsIHRoZSBleHByZXNzc2lvbiBpcyB1bnNwZWNpZmllZCwgYnV0IGxlZ2FsLCBhbmQKKwkgKiB0aGUgYm9keSBzdGF0ZW1lbnQgaXMgYW4gZW1wdHkgYmxvY2suCisJICogPHA+CisJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGFzdCB0aGUgQVNUIHRoYXQgaXMgdG8gb3duIHRoaXMgbm9kZQorCSAqLworCVdoaWxlU3RhdGVtZW50KEFTVCBhc3QpIHsKKwkJc3VwZXIoYXN0KTsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCQlyZXR1cm4gV0hJTEVfU1RBVEVNRU5UOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgeworCQlXaGlsZVN0YXRlbWVudCByZXN1bHQgPSBuZXcgV2hpbGVTdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOworCQlyZXN1bHQuc2V0Qm9keSgoU3RhdGVtZW50KSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCisJICovCisJcHVibGljIGJvb2xlYW4gc3VidHJlZU1hdGNoKEFTVE1hdGNoZXIgbWF0Y2hlciwgT2JqZWN0IG90aGVyKSB7CisJCS8vIGRpc3BhdGNoIHRvIGNvcnJlY3Qgb3ZlcmxvYWRlZCBtYXRjaCBtZXRob2QKKwkJcmV0dXJuIG1hdGNoZXIubWF0Y2godGhpcywgb3RoZXIpOworCX0KKworCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCXZvaWQgYWNjZXB0MChBU1RWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKKwkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKKwkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRCb2R5KCkpOworCQl9CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyB3aGlsZSBzdGF0ZW1lbnQuCisJICogCisJICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICovIAorCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJfQorCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIHdoaWxlIHN0YXRlbWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiBub2RlCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWY6CisJICogPHVsPgorCSAqIDxsaT50aGUgbm9kZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEFTVDwvbGk+CisJICogPGxpPnRoZSBub2RlIGFscmVhZHkgaGFzIGEgcGFyZW50PC9saT4KKwkgKiA8bGk+YSBjeWNsZSBpbiB3b3VsZCBiZSBjcmVhdGVkPC9saT4KKwkgKiA8L3VsPgorCSAqLyAKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gYSBXaGlsZVN0YXRlbWVudCBtYXkgb2NjdXIgaW5zaWRlIGFuIEV4cHJlc3Npb24gLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uLCB0cnVlKTsKKwkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgd2hpbGUgc3RhdGVtZW50LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKKwkgKi8gCisJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlpZiAoYm9keSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlzZXRCb2R5KG5ldyBCbG9jayhnZXRBU1QoKSkpOworCQl9CisJCXJldHVybiBib2R5OworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBib2R5IG9mIHRoaXMgd2hpbGUgc3RhdGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIGJvZHkgc3RhdGVtZW50IG5vZGUKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKKwkgKiA8dWw+CisJICogPGxpPnRoZSBub2RlIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgQVNUPC9saT4KKwkgKiA8bGk+dGhlIG5vZGUgYWxyZWFkeSBoYXMgYSBwYXJlbnQ8L2xpPgorCSAqIDxsaT5hIGN5Y2xlIGluIHdvdWxkIGJlIGNyZWF0ZWQ8L2xpPgorCSAqIDwvdWw+CisJICovIAorCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RhdGVtZW50IHN0YXRlbWVudCkgeworCQlpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBhIFdoaWxlU3RhdGVtZW50IG1heSBvY2N1ciBpbnNpZGUgYSBTdGF0ZW1lbnQgLSBtdXN0IGNoZWNrIGN5Y2xlcworCQlyZXBsYWNlQ2hpbGQodGhpcy5ib2R5LCBzdGF0ZW1lbnQsIHRydWUpOworCQl0aGlzLmJvZHkgPSBzdGF0ZW1lbnQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCBtZW1TaXplKCkgeworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgMiAqIDQ7CisJfQorCQorCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBU1ROb2RlLgorCSAqLworCWludCB0cmVlU2l6ZSgpIHsKKwkJcmV0dXJuCisJCQltZW1TaXplKCkKKwkJCSsgKGV4cHJlc3Npb24gPT0gbnVsbCA/IDAgOiBnZXRFeHByZXNzaW9uKCkudHJlZVNpemUoKSkKKwkJCSsgKGJvZHkgPT0gbnVsbCA/IDAgOiBnZXRCb2R5KCkudHJlZVNpemUoKSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3BhY2thZ2UuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDg2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzMgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1RoZSBKYXZhIERPTSBpcyB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBtb2RlbCBKYXZhIHByb2dyYW0gYXMgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgorCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorCis8cD48YnI+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIERPTSBjbGFzc2VzLiBBbiBBUEkgZm9yIG1hbmlwdWxhdGluZyBhIEphdmEgcHJvZ3JhbSAKK2FzIGEgc3RydWN0dXJlZCBkb2N1bWVudC4gSW4gcGFydGljdWxhciwgaXQgcHJvdmlkZXMgYSBmdWxsIGFic3RyYWN0IHN5bnRheCB0cmVlLCB3aGljaCAKK2NhbiBiZSBxdWVyaWVkIGZvciByZXNvbHZlZCB0eXBlIGluZm9ybWF0aW9uLCBhbmQgbW9kaWZpZWQuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzMzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFsbG9jYXRpb25FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBDb2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uIGV4dGVuZHMgQWxsb2NhdGlvbkV4cHJlc3Npb24gaW1wbGVtZW50cyBQcm9ibGVtUmVhc29ucywgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQ7CisJRmllbGRCaW5kaW5nIGRlbGVnYXRlVGhpczsKKy8qKgorICogQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorICovCitwdWJsaWMgQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbihFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgeworCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQgPSBldmFsdWF0aW9uQ29udGV4dDsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZSgKKwlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgCisJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCAKKwlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKKworCWlmIChiaW5kaW5nLmNhbkJlU2VlbkJ5KGFsbG9jYXRlZFR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJY29kZVN0cmVhbS5uZXdfKGFsbG9jYXRlZFR5cGUpOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJfQorCQkvLyBiZXR0ZXIgaGlnaGxpZ2h0IGZvciBhbGxvY2F0aW9uOiBkaXNwbGF5IHRoZSB0eXBlIGluZGl2aWR1YWxseQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHR5cGUuc291cmNlU3RhcnQpOworCisJCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbgorCQlpZiAoYWxsb2NhdGVkVHlwZS5pc05lc3RlZFR5cGUoKSkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0FyZ3VtZW50VmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwgCisJCQkJYWxsb2NhdGVkVHlwZSwgCisJCQkJZW5jbG9zaW5nSW5zdGFuY2UoKSwgCisJCQkJdGhpcyk7IAorCQl9CisJCS8vIGdlbmVyYXRlIHRoZSBhcmd1bWVudHMgZm9yIGNvbnN0cnVjdG9yCisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9CisJCX0KKwkJLy8gaW52b2tlIGNvbnN0cnVjdG9yCisJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChiaW5kaW5nKTsKKwl9IGVsc2UgeworCQkvLyBwcml2YXRlIGVtdWxhdGlvbiB1c2luZyByZWZsZWN0CisJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGlvbkZvckNvbnN0cnVjdG9yKGN1cnJlbnRTY29wZSwgYmluZGluZyk7CisJCS8vIGdlbmVyYXRlIGFyZ3VtZW50cworCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoYXJnc0xlbmd0aCk7CisJCQljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZSwgbmV3IEFycmF5QmluZGluZyhjdXJyZW50U2NvcGUuZ2V0VHlwZShUeXBlQmluZGluZy5KQVZBX0xBTkdfT0JKRUNUKSwgMSkpOworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnc0xlbmd0aDsgaSsrKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsKKwkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA9IGJpbmRpbmcucGFyYW1ldGVyc1tpXTsKKwkJCQlpZiAocGFyYW1ldGVyQmluZGluZy5pc0Jhc2VUeXBlKCkgJiYgcGFyYW1ldGVyQmluZGluZyAhPSBOdWxsQmluZGluZykgeworCQkJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSljb2RlU3RyZWFtKS5nZW5lcmF0ZU9iamVjdFdyYXBwZXJGb3JUeXBlKGJpbmRpbmcucGFyYW1ldGVyc1tpXSk7CisJCQkJfQorCQkJCWNvZGVTdHJlYW0uYWFzdG9yZSgpOworCQkJCWlmIChpIDwgYXJnc0xlbmd0aCAtIDEpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQl9CQorCQkJfQorCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKKwkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY3VycmVudFNjb3BlLCBuZXcgQXJyYXlCaW5kaW5nKGN1cnJlbnRTY29wZS5nZXRUeXBlKFR5cGVCaW5kaW5nLkpBVkFfTEFOR19PQkpFQ1QpLCAxKSk7CQkJCisJCX0KKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmludm9rZUphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yTmV3SW5zdGFuY2UoKTsKKwkJY29kZVN0cmVhbS5jaGVja2Nhc3QoYWxsb2NhdGVkVHlwZSk7CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CisvKiBJbm5lciBlbXVsYXRpb24gY29uc2lzdHMgaW4gZWl0aGVyIHJlY29yZGluZyBhIGRlcGVuZGVuY3kgCisgKiBsaW5rIG9ubHksIG9yIHBlcmZvcm1pbmcgb25lIGxldmVsIG9mIHByb3BhZ2F0aW9uLgorICoKKyAqIERlcGVuZGVuY3kgbWVjaGFuaXNtIGlzIHVzZWQgd2hlbmV2ZXIgZGVhbGluZyB3aXRoIHNvdXJjZSB0YXJnZXQKKyAqIHR5cGVzLCBzaW5jZSBieSB0aGUgdGltZSB3ZSByZWFjaCB0aGVtLCB3ZSBtaWdodCBub3QgeWV0IGtub3cgdGhlaXIKKyAqIGV4YWN0IG5lZWQuCisgKi8KK3B1YmxpYyB2b2lkIG1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKwkvLyBub3Qgc3VwcG9ydGVkIHlldAorfQorcHVibGljIHZvaWQgbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gUHJvcGFnYXRlIHRoZSB0eXBlIGNoZWNraW5nIHRvIHRoZSBhcmd1bWVudHMsIGFuZCBjaGVjayBpZiB0aGUgY29uc3RydWN0b3IgaXMgZGVmaW5lZC4KKwljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOyAvLyB3aWxsIGNoZWNrIGZvciBudWxsIGFmdGVyIGFyZ3MgYXJlIHJlc29sdmVkCisKKwkvLyBidWZmZXJpbmcgdGhlIGFyZ3VtZW50cycgdHlwZXMKKwlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBOb1BhcmFtZXRlcnM7CisJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsKKwkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IGFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCisJCQkJYXJnSGFzRXJyb3IgPSB0cnVlOworCQlpZiAoYXJnSGFzRXJyb3IpCisJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJfQorCWlmICh0eXBlQmluZGluZyA9PSBudWxsKQorCQlyZXR1cm4gbnVsbDsKKworCWlmICghdHlwZUJpbmRpbmcuY2FuQmVJbnN0YW50aWF0ZWQoKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnN0YW50aWF0ZSh0eXBlLCB0eXBlQmluZGluZyk7CisJCXJldHVybiB0eXBlQmluZGluZzsKKwl9CisJUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nOworCWlmICghKGJpbmRpbmcgPSBzY29wZS5nZXRDb25zdHJ1Y3RvcihhbGxvY2F0ZWRUeXBlLCBhcmd1bWVudFR5cGVzLCB0aGlzKSkuaXNWYWxpZEJpbmRpbmcoKSkgeworCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1NZXRob2RCaW5kaW5nCisJCQkmJiAoKFByb2JsZW1NZXRob2RCaW5kaW5nKSBiaW5kaW5nKS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKSB7CisJCQlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5kZWNsYXJpbmdUeXBlTmFtZSAhPSBudWxsKSB7CisJCQkJZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKKwkJCQlpZiAoZGVsZWdhdGVUaGlzID09IG51bGwpIHsKKwkJCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKKwkJCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7CisJCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCisJCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsKKwkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQl9CisJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CQkJCisJCQlNZXRob2RCaW5kaW5nIHByaXZhdGVCaW5kaW5nID0gbG9jYWxTY29wZS5nZXRDb25zdHJ1Y3RvcigoUmVmZXJlbmNlQmluZGluZylkZWxlZ2F0ZVRoaXMudHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcyk7CisJCQlpZiAoIXByaXZhdGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKQorCQkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGVkVHlwZTsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7CisJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJfSBlbHNlIHsKKwkJCQliaW5kaW5nID0gcHJpdmF0ZUJpbmRpbmc7CisJCQl9CQkJCQorCQl9IGVsc2UgeworCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKKwkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGVkVHlwZTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsKKwkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJfQorCX0KKwlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZE1ldGhvZChiaW5kaW5nLCB0aGlzKTsKKworCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspCisJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhiaW5kaW5nLnBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50VHlwZXNbaV0pOworCXJldHVybiBhbGxvY2F0ZWRUeXBlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENsYXNzRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENsYXNzRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTljYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q2xhc3NGaWxlLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBDb2RlU25pcHBldENsYXNzRmlsZSBleHRlbmRzIENsYXNzRmlsZSB7CisvKioKKyAqIENvZGVTbmlwcGV0Q2xhc3NGaWxlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKiBAcGFyYW0gYVR5cGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZworICogQHBhcmFtIGVuY2xvc2luZ0NsYXNzRmlsZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlCisgKiBAcGFyYW0gY3JlYXRpbmdQcm9ibGVtVHlwZSBib29sZWFuCisgKi8KK3B1YmxpYyBDb2RlU25pcHBldENsYXNzRmlsZSgKKwlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nIGFUeXBlLAorCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlLAorCWJvb2xlYW4gY3JlYXRpbmdQcm9ibGVtVHlwZSkgeworCS8qKgorCSAqIElOVEVSTkFMIFVTRS1PTkxZCisJICogVGhpcyBtZXRob2RzIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgorCSAqCisJICogQHBhcmFtIGFUeXBlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmcKKwkgKiBAcGFyYW0gZW5jbG9zaW5nQ2xhc3NGaWxlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNsYXNzRmlsZQorCSAqIEBwYXJhbSBjcmVhdGluZ1Byb2JsZW1UeXBlIDxDT0RFPmJvb2xlYW48L0NPREU+CisJICovCisJcmVmZXJlbmNlQmluZGluZyA9IGFUeXBlOworCWhlYWRlciA9IG5ldyBieXRlW0lOSVRJQUxfSEVBREVSX1NJWkVdOworCS8vIGdlbmVyYXRlIHRoZSBtYWdpYyBudW1iZXJzIGluc2lkZSB0aGUgaGVhZGVyCisJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IChieXRlKSAoMHhDQUZFQkFCRUwgPj4gMjQpOworCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAoYnl0ZSkgKDB4Q0FGRUJBQkVMID4+IDE2KTsKKwloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiA4KTsKKwloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gKGJ5dGUpICgweENBRkVCQUJFTCA+PiAwKTsKKwlpZiAoKChTb3VyY2VUeXBlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykuc2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLnRhcmdldEpESyA+PSBDb21waWxlck9wdGlvbnMuSkRLMV8yKSB7CisJCS8vIENvbXBhdGlibGUgd2l0aCBKREsgMS4yCisJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOworCQkvLyBtaW5vclZlcnNpb24gPSAwIG1lYW5zIHdlIGp1c3QgbmVlZCB0byBvZmZzZXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGJ5IDIKKwkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7CisJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAwOworCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gNDY7CisJfSBlbHNlIHsKKwkJLy8gQ29tcGF0aWJsZSB3aXRoIEpESyAxLjEKKwkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDA7CisJCWhlYWRlcltoZWFkZXJPZmZzZXQrK10gPSAzOworCQloZWFkZXJbaGVhZGVyT2Zmc2V0KytdID0gMDsKKwkJaGVhZGVyW2hlYWRlck9mZnNldCsrXSA9IDQ1OworCX0KKwljb25zdGFudFBvb2xPZmZzZXQgPSBoZWFkZXJPZmZzZXQ7CisJaGVhZGVyT2Zmc2V0ICs9IDI7CisJY29uc3RhbnRQb29sID0gbmV3IENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKHRoaXMpOworCWludCBhY2Nlc3NGbGFncyA9IGFUeXBlLmdldEFjY2Vzc0ZsYWdzKCkgfCBBY2NTdXBlcjsKKwlpZiAoYVR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJaWYgKGFUeXBlLmlzU3RhdGljKCkpIHsKKwkJCS8vIGNsZWFyIEFjY19TdGF0aWMKKwkJCWFjY2Vzc0ZsYWdzICY9IH5BY2NTdGF0aWM7CisJCX0KKwkJaWYgKGFUeXBlLmlzUHJpdmF0ZSgpKSB7CisJCQkvLyBjbGVhciBBY2NfUHJpdmF0ZSBhbmQgQWNjX1B1YmxpYworCQkJYWNjZXNzRmxhZ3MgJj0gfihBY2NQcml2YXRlIHwgQWNjUHVibGljKTsKKwkJfQorCQlpZiAoYVR5cGUuaXNQcm90ZWN0ZWQoKSkgeworCQkJLy8gY2xlYXIgQWNjX1Byb3RlY3RlZCBhbmQgc2V0IEFjY19QdWJsaWMKKwkJCWFjY2Vzc0ZsYWdzICY9IH5BY2NQcm90ZWN0ZWQ7CisJCQlhY2Nlc3NGbGFncyB8PSBBY2NQdWJsaWM7CisJCX0KKwl9CisJLy8gY2xlYXIgQWNjX1N0cmljdGZwCisJYWNjZXNzRmxhZ3MgJj0gfkFjY1N0cmljdGZwOworCisJdGhpcy5lbmNsb3NpbmdDbGFzc0ZpbGUgPSBlbmNsb3NpbmdDbGFzc0ZpbGU7CisJLy8gaW5uZXJjbGFzc2VzIGdldCB0aGVpciBuYW1lcyBjb21wdXRlZCBhdCBjb2RlIGdlbiB0aW1lCisJaWYgKGFUeXBlLmlzTG9jYWxUeXBlKCkpIHsKKwkJKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkuY29uc3RhbnRQb29sTmFtZSgKKwkJCWNvbXB1dGVDb25zdGFudFBvb2xOYW1lKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkpOworCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSBhVHlwZS5tZW1iZXJUeXBlcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCSgoTG9jYWxUeXBlQmluZGluZykgbWVtYmVyVHlwZXNbaV0pLmNvbnN0YW50UG9vbE5hbWUoCisJCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKSk7CisJCX0KKwl9CisJY29udGVudHMgPSBuZXcgYnl0ZVtJTklUSUFMX0NPTlRFTlRTX1NJWkVdOworCS8vIG5vdyB3ZSBjb250aW51ZSB0byBnZW5lcmF0ZSB0aGUgYnl0ZXMgaW5zaWRlIHRoZSBjb250ZW50cyBhcnJheQorCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsKKwljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBhY2Nlc3NGbGFnczsKKwlpbnQgY2xhc3NOYW1lSW5kZXggPSBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFUeXBlKTsKKwljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoY2xhc3NOYW1lSW5kZXggPj4gOCk7CisJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY2xhc3NOYW1lSW5kZXg7CisJaW50IHN1cGVyY2xhc3NOYW1lSW5kZXg7CisJaWYgKGFUeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJc3VwZXJjbGFzc05hbWVJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ09iamVjdCgpOworCX0gZWxzZSB7CisJCXN1cGVyY2xhc3NOYW1lSW5kZXggPQorCQkJKGFUeXBlLnN1cGVyY2xhc3MgPT0gbnVsbCA/IDAgOiBjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KGFUeXBlLnN1cGVyY2xhc3MpKTsKKwl9CisJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgKHN1cGVyY2xhc3NOYW1lSW5kZXggPj4gOCk7CisJY29udGVudHNbY29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgc3VwZXJjbGFzc05hbWVJbmRleDsKKwlSZWZlcmVuY2VCaW5kaW5nW10gc3VwZXJJbnRlcmZhY2VzQmluZGluZyA9IGFUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCWludCBpbnRlcmZhY2VzQ291bnQgPSBzdXBlckludGVyZmFjZXNCaW5kaW5nLmxlbmd0aDsKKwljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZXJmYWNlc0NvdW50ID4+IDgpOworCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIGludGVyZmFjZXNDb3VudDsKKwlpZiAoc3VwZXJJbnRlcmZhY2VzQmluZGluZyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlc0NvdW50OyBpKyspIHsKKwkJCWludCBpbnRlcmZhY2VJbmRleCA9IGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXgoc3VwZXJJbnRlcmZhY2VzQmluZGluZ1tpXSk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoaW50ZXJmYWNlSW5kZXggPj4gOCk7CisJCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBpbnRlcmZhY2VJbmRleDsKKwkJfQorCX0KKwlwcm9kdWNlRGVidWdBdHRyaWJ1dGVzID0KKwkJKChTb3VyY2VUeXBlQmluZGluZykgcmVmZXJlbmNlQmluZGluZykKKwkJCS5zY29wZQorCQkJLmVudmlyb25tZW50KCkKKwkJCS5vcHRpb25zCisJCQkucHJvZHVjZURlYnVnQXR0cmlidXRlczsKKwlpbm5lckNsYXNzZXNCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW0lOTkVSX0NMQVNTRVNfU0laRV07CisJdGhpcy5jcmVhdGluZ1Byb2JsZW1UeXBlID0gY3JlYXRpbmdQcm9ibGVtVHlwZTsKKwljb2RlU3RyZWFtID0gbmV3IENvZGVTbmlwcGV0Q29kZVN0cmVhbSh0aGlzKTsKKworCS8vIHJldHJpZXZlIHRoZSBlbmNsb3Npbmcgb25lIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG9uZSBtYXRjaGluZyB0aGUgcHJvcGFnYXRlZCBmbG93IGluZm8KKwkvLyAxRkY5WkJVOiBMRkNPTTpBTEwgLSBMb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzIGJ1c3RlZCAoU2FuaXR5IGNoZWNrKQorCUNsYXNzRmlsZSBvdXRlcm1vc3RDbGFzc0ZpbGUgPSB0aGlzLm91dGVyTW9zdEVuY2xvc2luZ0NsYXNzRmlsZSgpOworCWlmICh0aGlzID09IG91dGVybW9zdENsYXNzRmlsZSkgeworCQljb2RlU3RyZWFtLm1heEZpZWxkQ291bnQgPSBhVHlwZS5zY29wZS5yZWZlcmVuY2VUeXBlKCkubWF4RmllbGRDb3VudDsKKwl9IGVsc2UgeworCQljb2RlU3RyZWFtLm1heEZpZWxkQ291bnQgPSBvdXRlcm1vc3RDbGFzc0ZpbGUuY29kZVN0cmVhbS5tYXhGaWVsZENvdW50OworCX0KK30KKy8qKgorICogSU5URVJOQUwgVVNFLU9OTFkKKyAqIFJlcXVlc3QgdGhlIGNyZWF0aW9uIG9mIGEgQ2xhc3NGaWxlIGNvbXBhdGlibGUgcmVwcmVzZW50YXRpb24gb2YgYSBwcm9ibGVtYXRpYyB0eXBlCisgKgorICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbgorICogQHBhcmFtIHVuaXRSZXN1bHQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uVW5pdFJlc3VsdAorICovCitwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUHJvYmxlbVR5cGUoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CisJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDb2RlU25pcHBldENsYXNzRmlsZSh0eXBlQmluZGluZywgbnVsbCwgdHJ1ZSk7CisKKwkvLyBpbm5lciBhdHRyaWJ1dGVzCisJaWYgKHR5cGVCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKQorCQljbGFzc0ZpbGUucmVjb3JkRW5jbG9zaW5nVHlwZUF0dHJpYnV0ZXModHlwZUJpbmRpbmcpOworCisJLy8gYWRkIGl0cyBmaWVsZHMKKwlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSB0eXBlQmluZGluZy5maWVsZHM7CisJaWYgKChmaWVsZHMgIT0gbnVsbCkgJiYgKGZpZWxkcyAhPSBOb0ZpZWxkcykpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGZpZWxkc1tpXS5jb25zdGFudCA9PSBudWxsKSB7CisJCQkJRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoZmllbGRzW2ldLCBmYWxzZSwgbnVsbCwgbnVsbCwgMCk7CisJCQl9CisJCX0KKwkJY2xhc3NGaWxlLmFkZEZpZWxkSW5mb3MoKTsKKwl9IGVsc2UgeworCQkvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0byBiZSBlcXVhbHMgdG8gMAorCQljbGFzc0ZpbGUuY29udGVudHNbY2xhc3NGaWxlLmNvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY2xhc3NGaWxlLmNvbnRlbnRzW2NsYXNzRmlsZS5jb250ZW50c09mZnNldCsrXSA9IDA7CisJfQorCS8vIGxlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBtZXRob2RDb3VudAorCWNsYXNzRmlsZS5zZXRGb3JNZXRob2RJbmZvcygpOworCS8vIGFkZCBpdHMgdXNlciBkZWZpbmVkIG1ldGhvZHMKKwlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLm1ldGhvZHM7CisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOworCWludCBtYXhNZXRob2REZWNsID0gbWV0aG9kRGVjbGFyYXRpb25zID09IG51bGwgPyAwIDogbWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aDsKKwlpbnQgcHJvYmxlbXNMZW5ndGg7CisJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHVuaXRSZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwlpZiAocHJvYmxlbXMgPT0gbnVsbCkgeworCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVswXTsKKwl9CisJSVByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgSVByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOworCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJaWYgKHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpIHsKKwkJCS8vIHdlIGNhbm5vdCBjcmVhdGUgcHJvYmxlbSBtZXRob2RzIGZvciBhbiBpbnRlcmZhY2UuIFNvIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBjbGluaXQKKwkJCS8vIHdoaWNoIHNob3VsZCBjb250YWluIGFsbCB0aGUgcHJvYmxlbQorCQkJY2xhc3NGaWxlLmFkZFByb2JsZW1DbGluaXQocHJvYmxlbXNDb3B5KTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nOworCQkJCWlmICgobWV0aG9kQmluZGluZyA9IG1ldGhvZHNbaV0pICE9IG51bGwpIHsKKwkJCQkJLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZGVjbGFyYXRpb24KKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXhNZXRob2REZWNsOyBqKyspIHsKKwkJCQkJCWlmICgobWV0aG9kRGVjbGFyYXRpb25zW2pdICE9IG51bGwpICYmIChtZXRob2REZWNsYXJhdGlvbnNbal0uYmluZGluZyA9PSBtZXRob2RzW2ldKSkgeworCQkJCQkJCWlmICghbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQkJCQkJY2xhc3NGaWxlLmFkZEFic3RyYWN0TWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uc1tqXSwgbWV0aG9kQmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQkJCQorCQl9IGVsc2UgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmc7CisJCQkJaWYgKChtZXRob2RCaW5kaW5nID0gbWV0aG9kc1tpXSkgIT0gbnVsbCkgeworCQkJCQkvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBkZWNsYXJhdGlvbgorCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1heE1ldGhvZERlY2w7IGorKykgeworCQkJCQkJaWYgKChtZXRob2REZWNsYXJhdGlvbnNbal0gIT0gbnVsbCkgJiYgKG1ldGhvZERlY2xhcmF0aW9uc1tqXS5iaW5kaW5nID09IG1ldGhvZHNbaV0pKSB7CisJCQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsOworCQkJCQkJCWlmICgobWV0aG9kRGVjbCA9IG1ldGhvZERlY2xhcmF0aW9uc1tqXSkuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IobWV0aG9kRGVjbCwgbWV0aG9kQmluZGluZywgcHJvYmxlbXNDb3B5KTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbU1ldGhvZChtZXRob2REZWNsLCBtZXRob2RCaW5kaW5nLCBwcm9ibGVtc0NvcHkpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBhZGQgYWJzdHJhY3QgbWV0aG9kcworCQljbGFzc0ZpbGUuYWRkRGVmYXVsdEFic3RyYWN0TWV0aG9kcygpOworCX0KKwkvLyBwcm9wYWdhdGUgZ2VuZXJhdGlvbiBvZiAocHJvYmxlbSkgbWVtYmVyIHR5cGVzCisJaWYgKHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlID0gdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzW2ldOworCQkJaWYgKG1lbWJlclR5cGUuYmluZGluZyAhPSBudWxsKSB7CisJCQkJY2xhc3NGaWxlLnJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShtZW1iZXJUeXBlLmJpbmRpbmcpOworCQkJCUNsYXNzRmlsZS5jcmVhdGVQcm9ibGVtVHlwZShtZW1iZXJUeXBlLCB1bml0UmVzdWx0KTsKKwkJCX0KKwkJfQorCX0KKwljbGFzc0ZpbGUuYWRkQXR0cmlidXRlcygpOworCXVuaXRSZXN1bHQucmVjb3JkKHR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSwgY2xhc3NGaWxlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb2RlU3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29kZVN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDU1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29kZVN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uUXVhbGlmaWVkTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0Q29kZVN0cmVhbSBleHRlbmRzIENvZGVTdHJlYW0geworCXN0YXRpYyBJbnZvY2F0aW9uU2l0ZSBOT19JTlZPQ0FUSU9OX1NJVEUgPSAKKwkJbmV3IEludm9jYXRpb25TaXRlKCl7CQorCQkJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpeyByZXR1cm4gZmFsc2U7IH0KKwkJCXB1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpIHsgcmV0dXJuIGZhbHNlOyB9CisJCQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxSZWNlaXZlclR5cGUoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHt9CisJCQlwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpIHt9CisJCQlwdWJsaWMgdm9pZCBzZXRGaWVsZEluZGV4KGludCBkZXB0aCl7fQorCQl9OworLyoqCisgKiBDb2RlU25pcHBldENvZGVTdHJlYW0gY29uc3RydWN0b3IgY29tbWVudC4KKyAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZQorICovCitwdWJsaWMgQ29kZVNuaXBwZXRDb2RlU3RyZWFtKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJc3VwZXIoY2xhc3NGaWxlKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNoZWNrY2FzdChpbnQgYmFzZUlkKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19jaGVja2Nhc3Q7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfY2hlY2tjYXN0KTsKKwl9CisJc3dpdGNoIChiYXNlSWQpIHsKKwkJY2FzZSBUX2J5dGUgOgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0J5dGUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdTaG9ydCgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQ2hhcmFjdGVyKCkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9pbnQgOgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0ludGVnZXIoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0xvbmcoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdGbG9hdCgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfZG91YmxlIDoKKwkJCXdyaXRlVW5zaWduZWRTaG9ydChjb25zdGFudFBvb2wubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdEb3VibGUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJd3JpdGVVbnNpZ25lZFNob3J0KGNvbnN0YW50UG9vbC5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Jvb2xlYW4oKSk7CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVFbXVsYXRlZEFjY2Vzc0Zvck1ldGhvZChTY29wZSBzY29wZSwgTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJQ29kZVNuaXBwZXRDb2RlU3RyZWFtIGxvY2FsQ29kZVN0cmVhbSA9IChDb2RlU25pcHBldENvZGVTdHJlYW0pIHRoaXM7CisJbG9jYWxDb2RlU3RyZWFtLmdlbmVyYXRlRW11bGF0aW9uRm9yTWV0aG9kKHNjb3BlLCBtZXRob2RCaW5kaW5nKTsKKwlsb2NhbENvZGVTdHJlYW0uaW52b2tlSmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKKwlDb2RlU25pcHBldENvZGVTdHJlYW0gbG9jYWxDb2RlU3RyZWFtID0gKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgdGhpczsKKwlsb2NhbENvZGVTdHJlYW0uZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChmaWVsZEJpbmRpbmcpOworCS8vIHN3YXAgIHRoZSBmaWVsZCB3aXRoIHRoZSByZWNlaXZlcgorCXRoaXMuc3dhcCgpOworCWxvY2FsQ29kZVN0cmVhbS5pbnZva2VKYXZhTGFuZ1JlZmxlY3RGaWVsZEdldHRlcihmaWVsZEJpbmRpbmcudHlwZS5pZCk7CisJaWYgKCFmaWVsZEJpbmRpbmcudHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJdGhpcy5jaGVja2Nhc3QoZmllbGRCaW5kaW5nLnR5cGUpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKKwlDb2RlU25pcHBldENvZGVTdHJlYW0gbG9jYWxDb2RlU3RyZWFtID0gKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgdGhpczsKKwlsb2NhbENvZGVTdHJlYW0uaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRTZXR0ZXIoZmllbGRCaW5kaW5nLnR5cGUuaWQpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVFbXVsYXRpb25Gb3JDb25zdHJ1Y3RvcihTY29wZSBzY29wZSwgTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJLy8gbGVhdmUgYSBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBvYmplY3Qgb24gdGhlIHN0YWNrCisJQ29kZVNuaXBwZXRDb2RlU3RyZWFtIGxvY2FsQ29kZVN0cmVhbSA9IChDb2RlU25pcHBldENvZGVTdHJlYW0pIHRoaXM7CisJdGhpcy5sZGMoU3RyaW5nLnZhbHVlT2YobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKKwl0aGlzLmludm9rZUNsYXNzRm9yTmFtZSgpOworCWludCBwYXJhbUxlbmd0aCA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CisJdGhpcy5nZW5lcmF0ZUlubGluZWRWYWx1ZShwYXJhbUxlbmd0aCk7CisJdGhpcy5uZXdBcnJheShzY29wZSwgbmV3IEFycmF5QmluZGluZyhzY29wZS5nZXRUeXBlKFR5cGVCaW5kaW5nLkpBVkFfTEFOR19DTEFTUyksIDEpKTsKKwlpZiAocGFyYW1MZW5ndGggPiAwKSB7CisJCXRoaXMuZHVwKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgeworCQkJdGhpcy5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsJCisJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXIgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV07CisJCQlpZiAocGFyYW1ldGVyLmlzQmFzZVR5cGUoKSkgeworCQkJCXRoaXMuZ2V0VFlQRShwYXJhbWV0ZXIuaWQpOworCQkJfSBlbHNlIGlmIChwYXJhbWV0ZXIuaXNBcnJheVR5cGUoKSkgeworCQkJCUFycmF5QmluZGluZyBhcnJheSA9IChBcnJheUJpbmRpbmcpcGFyYW1ldGVyOworCQkJCWlmIChhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCQkJdGhpcy5nZXRUWVBFKGFycmF5LmxlYWZDb21wb25lbnRUeXBlLmlkKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKKwkJCQkJdGhpcy5pbnZva2VDbGFzc0Zvck5hbWUoKTsKKwkJCQl9CisJCQkJaW50IGRpbWVuc2lvbnMgPSBhcnJheS5kaW1lbnNpb25zOworCQkJCXRoaXMuZ2VuZXJhdGVJbmxpbmVkVmFsdWUoZGltZW5zaW9ucyk7CisJCQkJdGhpcy5uZXdhcnJheShUX2ludCk7CQorCQkJCXRoaXMuaW52b2tlQXJyYXlOZXdJbnN0YW5jZSgpOworCQkJCXRoaXMuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gcGFyYW1ldGVyIGlzIGEgcmVmZXJlbmNlIGJpbmRpbmcKKwkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOworCQkJCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJCQl9CisJCQl0aGlzLmFhc3RvcmUoKTsKKwkJCWlmIChpIDwgcGFyYW1MZW5ndGggLSAxKSB7CisJCQkJdGhpcy5kdXAoKTsKKwkJCX0KKwkJfQorCX0KKwlsb2NhbENvZGVTdHJlYW0uaW52b2tlQ2xhc3NHZXREZWNsYXJlZENvbnN0cnVjdG9yKCk7CisJdGhpcy5kdXAoKTsKKwl0aGlzLmljb25zdF8xKCk7CisJbG9jYWxDb2RlU3RyZWFtLmludm9rZUFjY2Vzc2libGVPYmplY3RTZXRBY2Nlc3NpYmxlKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkKEZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcpIHsKKwkvLyBsZWF2ZSBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIG9iamVjdCBvbiB0aGUgc3RhY2sKKwlDb2RlU25pcHBldENvZGVTdHJlYW0gbG9jYWxDb2RlU3RyZWFtID0gKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgdGhpczsKKwl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY29uc3RhbnRQb29sTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKSk7CisJdGhpcy5pbnZva2VDbGFzc0Zvck5hbWUoKTsKKwl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihmaWVsZEJpbmRpbmcubmFtZSkpOworCWxvY2FsQ29kZVN0cmVhbS5pbnZva2VDbGFzc0dldERlY2xhcmVkRmllbGQoKTsKKwl0aGlzLmR1cCgpOworCXRoaXMuaWNvbnN0XzEoKTsKKwlsb2NhbENvZGVTdHJlYW0uaW52b2tlQWNjZXNzaWJsZU9iamVjdFNldEFjY2Vzc2libGUoKTsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlRW11bGF0aW9uRm9yTWV0aG9kKFNjb3BlIHNjb3BlLCBNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwkvLyBsZWF2ZSBhIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIG9iamVjdCBvbiB0aGUgc3RhY2sKKwlDb2RlU25pcHBldENvZGVTdHJlYW0gbG9jYWxDb2RlU3RyZWFtID0gKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgdGhpczsKKwl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOworCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJdGhpcy5sZGMoU3RyaW5nLnZhbHVlT2YobWV0aG9kQmluZGluZy5zZWxlY3RvcikpOworCWludCBwYXJhbUxlbmd0aCA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGg7CisJdGhpcy5nZW5lcmF0ZUlubGluZWRWYWx1ZShwYXJhbUxlbmd0aCk7CisJdGhpcy5uZXdBcnJheShzY29wZSwgbmV3IEFycmF5QmluZGluZyhzY29wZS5nZXRUeXBlKFR5cGVCaW5kaW5nLkpBVkFfTEFOR19DTEFTUyksIDEpKTsKKwlpZiAocGFyYW1MZW5ndGggPiAwKSB7CisJCXRoaXMuZHVwKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgeworCQkJdGhpcy5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsJCisJCQlUeXBlQmluZGluZyBwYXJhbWV0ZXIgPSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbaV07CisJCQlpZiAocGFyYW1ldGVyLmlzQmFzZVR5cGUoKSkgeworCQkJCXRoaXMuZ2V0VFlQRShwYXJhbWV0ZXIuaWQpOworCQkJfSBlbHNlIGlmIChwYXJhbWV0ZXIuaXNBcnJheVR5cGUoKSkgeworCQkJCUFycmF5QmluZGluZyBhcnJheSA9IChBcnJheUJpbmRpbmcpcGFyYW1ldGVyOworCQkJCWlmIChhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCQkJdGhpcy5nZXRUWVBFKGFycmF5LmxlYWZDb21wb25lbnRUeXBlLmlkKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihhcnJheS5sZWFmQ29tcG9uZW50VHlwZS5jb25zdGFudFBvb2xOYW1lKCkpLnJlcGxhY2UoJy8nLCAnLicpKTsKKwkJCQkJdGhpcy5pbnZva2VDbGFzc0Zvck5hbWUoKTsKKwkJCQl9CisJCQkJaW50IGRpbWVuc2lvbnMgPSBhcnJheS5kaW1lbnNpb25zOworCQkJCXRoaXMuZ2VuZXJhdGVJbmxpbmVkVmFsdWUoZGltZW5zaW9ucyk7CisJCQkJdGhpcy5uZXdhcnJheShUX2ludCk7CQorCQkJCXRoaXMuaW52b2tlQXJyYXlOZXdJbnN0YW5jZSgpOworCQkJCXRoaXMuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gcGFyYW1ldGVyIGlzIGEgcmVmZXJlbmNlIGJpbmRpbmcKKwkJCQl0aGlzLmxkYyhTdHJpbmcudmFsdWVPZihtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbnN0YW50UG9vbE5hbWUoKSkucmVwbGFjZSgnLycsICcuJykpOworCQkJCXRoaXMuaW52b2tlQ2xhc3NGb3JOYW1lKCk7CisJCQl9CisJCQl0aGlzLmFhc3RvcmUoKTsKKwkJCWlmIChpIDwgcGFyYW1MZW5ndGggLSAxKSB7CisJCQkJdGhpcy5kdXAoKTsKKwkJCX0KKwkJfQorCX0KKwlsb2NhbENvZGVTdHJlYW0uaW52b2tlQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCgpOworCXRoaXMuZHVwKCk7CisJdGhpcy5pY29uc3RfMSgpOworCWxvY2FsQ29kZVN0cmVhbS5pbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVPYmplY3RXcmFwcGVyRm9yVHlwZShUeXBlQmluZGluZyB2YWx1ZVR5cGUpIHsKKworCS8qIFRoZSB0b3Agb2Ygc3RhY2sgbXVzdCBiZSBlbmNhcHN1bGF0ZWQgaW5zaWRlIAorCSAqIGEgd3JhcHBlciBvYmplY3QgaWYgaXQgY29ycmVzcG9uZHMgdG8gYSBiYXNlIHR5cGUKKwkgKi8KKwljaGFyW11bXSB3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG51bGw7CisJc3dpdGNoICh2YWx1ZVR5cGUuaWQpIHsKKwkJY2FzZSBUX2ludCA6IC8vIG5ldzogamF2YS5sYW5nLkludGVnZXIKKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJJbnRlZ2VyIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKKwkJCWJyZWFrOworCQljYXNlIFRfYm9vbGVhbiA6IC8vIG5ldzogamF2YS5sYW5nLkJvb2xlYW4KKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJCb29sZWFuIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKKwkJCWJyZWFrOworCQljYXNlIFRfYnl0ZSA6IC8vIG5ldzogamF2YS5sYW5nLkJ5dGUKKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJCeXRlIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6IC8vIG5ldzogamF2YS5sYW5nLkNoYXJhY3RlcgorCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi50b0NoYXJBcnJheSgpLCAibGFuZyIudG9DaGFyQXJyYXkoKSwgIkNoYXJhY3RlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDogLy8gbmV3OiBqYXZhLmxhbmcuRmxvYXQKKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJGbG9hdCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6IC8vIG5ldzogamF2YS5sYW5nLkRvdWJsZQorCQkJd3JhcHBlclR5cGVDb21wb3VuZE5hbWUgPSBuZXcgY2hhcltdW10geyJqYXZhIi50b0NoYXJBcnJheSgpLCAibGFuZyIudG9DaGFyQXJyYXkoKSwgIkRvdWJsZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDogLy8gbmV3OiBqYXZhLmxhbmcuU2hvcnQKKwkJCXdyYXBwZXJUeXBlQ29tcG91bmROYW1lID0gbmV3IGNoYXJbXVtdIHsiamF2YSIudG9DaGFyQXJyYXkoKSwgImxhbmciLnRvQ2hhckFycmF5KCksICJTaG9ydCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOiAvLyBuZXc6IGphdmEubGFuZy5Mb25nCisJCQl3cmFwcGVyVHlwZUNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW11bXSB7ImphdmEiLnRvQ2hhckFycmF5KCksICJsYW5nIi50b0NoYXJBcnJheSgpLCAiTG9uZyIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCisJCQlicmVhazsKKwl9CisJVHlwZUJpbmRpbmcgd3JhcHBlclR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5zY29wZS5nZXRUeXBlKHdyYXBwZXJUeXBlQ29tcG91bmROYW1lKTsKKwluZXdfKHdyYXBwZXJUeXBlKTsKKwlpZiAodmFsdWVUeXBlLmlkID09IFRfbG9uZyB8fCB2YWx1ZVR5cGUuaWQgPT0gVF9kb3VibGUpIHsKKwkJZHVwX3gyKCk7CisJCWR1cF94MigpOworCQlwb3AoKTsKKwl9IGVsc2UgeworCQlkdXBfeDEoKTsKKwkJc3dhcCgpOworCX0KKwlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2REZWNsYXJhdGlvbi5zY29wZS5nZXRNZXRob2QoCisJCQkJd3JhcHBlclR5cGUsIAorCQkJCVF1YWxpZmllZE5hbWVzQ29uc3RhbnRzLkluaXQsIAorCQkJCW5ldyBUeXBlQmluZGluZ1tdIHt2YWx1ZVR5cGV9LCAKKwkJCQlOT19JTlZPQ0FUSU9OX1NJVEUpOworCWludm9rZXNwZWNpYWwobWV0aG9kQmluZGluZyk7Cit9CitwdWJsaWMgdm9pZCBnZXRCYXNlVHlwZVZhbHVlKGludCBiYXNlVHlwZUlEKSB7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwlzd2l0Y2ggKGJhc2VUeXBlSUQpIHsKKwkJY2FzZSBUX2J5dGUgOgorCQkJLy8gaW52b2tldmlydHVhbDogYnl0ZVZhbHVlKCkKKwkJCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQnl0ZUJ5dGVWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfc2hvcnQgOgorCQkJLy8gaW52b2tldmlydHVhbDogc2hvcnRWYWx1ZSgpCisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0U2hvcnRWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQkvLyBpbnZva2V2aXJ0dWFsOiBjaGFyVmFsdWUoKQorCQkJd3JpdGVVbnNpZ25lZFNob3J0KCgoQ29kZVNuaXBwZXRDb25zdGFudFBvb2wpIGNvbnN0YW50UG9vbCkubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXJDaGFyVmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2ludCA6CisJCQkvLyBpbnZva2V2aXJ0dWFsOiBpbnRWYWx1ZSgpCisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0ludGVnZXJJbnRWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQkvLyBpbnZva2V2aXJ0dWFsOiBsb25nVmFsdWUoKQorCQkJc3RhY2tEZXB0aCsrOworCQkJaWYgKHN0YWNrRGVwdGggPiBzdGFja01heCkKKwkJCQlzdGFja01heCA9IHN0YWNrRGVwdGg7CisJCQl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0xvbmdMb25nVmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Zsb2F0IDoKKwkJCS8vIGludm9rZXZpcnR1YWw6IGZsb2F0VmFsdWUoKQorCQkJd3JpdGVVbnNpZ25lZFNob3J0KCgoQ29kZVNuaXBwZXRDb25zdGFudFBvb2wpIGNvbnN0YW50UG9vbCkubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdGbG9hdEZsb2F0VmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2RvdWJsZSA6CisJCQkvLyBpbnZva2V2aXJ0dWFsOiBkb3VibGVWYWx1ZSgpCisJCQlzdGFja0RlcHRoKys7CisJCQlpZiAoc3RhY2tEZXB0aCA+IHN0YWNrTWF4KQorCQkJCXN0YWNrTWF4ID0gc3RhY2tEZXB0aDsKKwkJCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEZvckphdmFMYW5nRG91YmxlRG91YmxlVmFsdWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJLy8gaW52b2tldmlydHVhbDogYm9vbGVhblZhbHVlKCkKKwkJCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEZvckphdmFMYW5nQm9vbGVhbkJvb2xlYW5WYWx1ZSgpKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBpbnZva2VBY2Nlc3NpYmxlT2JqZWN0U2V0QWNjZXNzaWJsZSgpIHsKKwkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoWilWOworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2V2aXJ0dWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KCgoQ29kZVNuaXBwZXRDb25zdGFudFBvb2wpIGNvbnN0YW50UG9vbCkubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0QWNjZXNzaWJsZU9iamVjdFNldEFjY2Vzc2libGUoKSk7CisJc3RhY2tEZXB0aC09MjsKK30KK3Byb3RlY3RlZCB2b2lkIGludm9rZUFycmF5TmV3SW5zdGFuY2UoKSB7CisJLy8gaW52b2tlc3RhdGljOiBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShMamF2YS5sYW5nLkNsYXNzO2ludFtdKUxqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXN0YXRpYzsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2VzdGF0aWMpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RBcnJheU5ld0luc3RhbmNlKCkpOworCXN0YWNrRGVwdGgtLTsKK30KK3Byb3RlY3RlZCB2b2lkIGludm9rZUNsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpIHsKKwkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuQ2xhc3MgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihbTGphdmEubGFuZy5DbGFzcylMamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzR2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpKTsKKwlzdGFja0RlcHRoLS07Cit9Citwcm90ZWN0ZWQgdm9pZCBpbnZva2VDbGFzc0dldERlY2xhcmVkRmllbGQoKSB7CisJLy8gaW52b2tldmlydHVhbDogamF2YS5sYW5nLkNsYXNzLmdldERlY2xhcmVkRmllbGQoTGphdmEubGFuZy5TdHJpbmcpTGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCWNvdW50TGFiZWxzID0gMDsKKwl0cnkgeworCQlwb3NpdGlvbisrOworCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSBPUENfaW52b2tldmlydHVhbDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KE9QQ19pbnZva2V2aXJ0dWFsKTsKKwl9CisJd3JpdGVVbnNpZ25lZFNob3J0KCgoQ29kZVNuaXBwZXRDb25zdGFudFBvb2wpIGNvbnN0YW50UG9vbCkubGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0dldERlY2xhcmVkRmllbGQoKSk7CisJc3RhY2tEZXB0aC0tOworfQorcHJvdGVjdGVkIHZvaWQgaW52b2tlQ2xhc3NHZXREZWNsYXJlZE1ldGhvZCgpIHsKKwkvLyBpbnZva2V2aXJ0dWFsOiBqYXZhLmxhbmcuQ2xhc3MgZ2V0RGVjbGFyZWRNZXRob2QoTGphdmEubGFuZy5TdHJpbmcsIFtMamF2YS5sYW5nLkNsYXNzKUxqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisJY291bnRMYWJlbHMgPSAwOworCXRyeSB7CisJCXBvc2l0aW9uKys7CisJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IE9QQ19pbnZva2V2aXJ0dWFsOworCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlyZXNpemVCeXRlQXJyYXkoT1BDX2ludm9rZXZpcnR1YWwpOworCX0KKwl3cml0ZVVuc2lnbmVkU2hvcnQoKChDb2RlU25pcHBldENvbnN0YW50UG9vbCkgY29uc3RhbnRQb29sKS5saXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzR2V0RGVjbGFyZWRNZXRob2QoKSk7CisJc3RhY2tEZXB0aC09MjsKK30KK3Byb3RlY3RlZCB2b2lkIGludm9rZUphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yTmV3SW5zdGFuY2UoKSB7CisJLy8gaW52b2tldmlydHVhbDogamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoW0xqYXZhLmxhbmcuT2JqZWN0OylMamF2YS5sYW5nLk9iamVjdDsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXZpcnR1YWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tldmlydHVhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdENvbnN0cnVjdG9yTmV3SW5zdGFuY2UoKSk7CisJc3RhY2tEZXB0aC0tOworfQorcHJvdGVjdGVkIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRHZXR0ZXIoaW50IHR5cGVJRCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgdXNlZFR5cGVJRDsKKwlpZiAodHlwZUlEID09IFRfbnVsbCkKKwkJdXNlZFR5cGVJRCA9IFRfT2JqZWN0OworCWVsc2UKKwkJdXNlZFR5cGVJRCA9IHR5cGVJRDsKKwkvLyBpbnZva2V2aXJ0dWFsCisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXZpcnR1YWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tldmlydHVhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEphdmFMYW5nUmVmbGVjdEZpZWxkR2V0dGVyKHR5cGVJRCkpOworCWlmICgodXNlZFR5cGVJRCAhPSBUX2xvbmcpICYmICh1c2VkVHlwZUlEICE9IFRfZG91YmxlKSkgeworCQlzdGFja0RlcHRoLS07CisJfQorfQorcHJvdGVjdGVkIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0RmllbGRTZXR0ZXIoaW50IHR5cGVJRCkgeworCWNvdW50TGFiZWxzID0gMDsKKwlpbnQgdXNlZFR5cGVJRDsKKwlpZiAodHlwZUlEID09IFRfbnVsbCkKKwkJdXNlZFR5cGVJRCA9IFRfT2JqZWN0OworCWVsc2UKKwkJdXNlZFR5cGVJRCA9IHR5cGVJRDsKKwkvLyBpbnZva2V2aXJ0dWFsCisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXZpcnR1YWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tldmlydHVhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEphdmFMYW5nUmVmbGVjdEZpZWxkU2V0dGVyKHR5cGVJRCkpOworCWlmICgodXNlZFR5cGVJRCAhPSBUX2xvbmcpICYmICh1c2VkVHlwZUlEICE9IFRfZG91YmxlKSkgeworCQlzdGFja0RlcHRoLT0zOworCX0gZWxzZSB7CisJCXN0YWNrRGVwdGgtPTQ7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgaW52b2tlSmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCkgeworCS8vIGludm9rZXZpcnR1YWw6IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTGphdmEubGFuZy5PYmplY3Q7W0xqYXZhLmxhbmcuT2JqZWN0OylMamF2YS5sYW5nLk9iamVjdDsKKwljb3VudExhYmVscyA9IDA7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gT1BDX2ludm9rZXZpcnR1YWw7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXJlc2l6ZUJ5dGVBcnJheShPUENfaW52b2tldmlydHVhbCk7CisJfQorCXdyaXRlVW5zaWduZWRTaG9ydCgoKENvZGVTbmlwcGV0Q29uc3RhbnRQb29sKSBjb25zdGFudFBvb2wpLmxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdE1ldGhvZEludm9rZSgpKTsKKwlzdGFja0RlcHRoLT0yOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDEwN2FhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQ29tcGlsZXJSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklFcnJvckhhbmRsaW5nUG9saWN5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworCisvKioKKyAqIEEgY29tcGlsZXIgdGhhdCBjb21waWxlcyBjb2RlIHNuaXBwZXRzLiAKKyAqLworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0Q29tcGlsZXIgZXh0ZW5kcyBDb21waWxlciB7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IGNvbXBpbGVyIGluaXRpYWxpemVkIHdpdGggYSBjb2RlIHNuaXBwZXQgcGFyc2VyLgorICovCitwdWJsaWMgQ29kZVNuaXBwZXRDb21waWxlcigKKwkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgCisJCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwgCisJCU1hcCBzZXR0aW5ncywgCisJCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsIAorCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksCisJCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0LAorCQlpbnQgY29kZVNuaXBwZXRTdGFydCwKKwkJaW50IGNvZGVTbmlwcGV0RW5kKSB7CisJc3VwZXIoZW52aXJvbm1lbnQsIHBvbGljeSwgc2V0dGluZ3MsIHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnkpOworCXRoaXMucGFyc2VyID0gCisJCW5ldyBDb2RlU25pcHBldFBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIGV2YWx1YXRpb25Db250ZXh0LCB0aGlzLm9wdGlvbnMucGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cywgdGhpcy5vcHRpb25zLmFzc2VydE1vZGUsIGNvZGVTbmlwcGV0U3RhcnQsIGNvZGVTbmlwcGV0RW5kKTsKKwl0aGlzLnBhcnNlVGhyZXNob2xkID0gMTsgLy8gZnVsbHkgcGFyc2Ugb25seSB0aGUgY29kZSBzbmlwcGV0IGNvbXBpbGF0aW9uIHVuaXQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb25zdGFudFBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb25zdGFudFBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTkxODNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbnN0YW50UG9vbC5qYXZhCkBAIC0wLDAgKzEsMTg1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqIFRoaXMgY29uc3RhbnQgcG9vbCBpcyB1c2VkIHRvIG1hbmFnZSB3ZWxsIGtub3duIG1ldGhvZHMgYW5kIGZpZWxkcyByZWxhdGVkIHNwZWNpZmljYWxseSB0byB0aGUKKyAqIGNvZGUgc25pcHBldCBjb2RlIGdlbmVyYXRpb24gKGphdmEubGFuZy5yZWZsZWN0IGNsYXNzZXMpLgorICovCitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRDb25zdGFudFBvb2wgZXh0ZW5kcyBDb25zdGFudFBvb2wgaW1wbGVtZW50cyBUeXBlQ29uc3RhbnRzIHsKKworCS8vIHByZWRlZmluZWQgdHlwZSBjb25zdGFudCBuYW1lcworCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRCA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkZpZWxkIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9BQ0NFU1NJQkxFT0JKRUNUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCAiQWNjZXNzaWJsZU9iamVjdCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdW10gSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCAiTWV0aG9kIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW11bXSBKQVZBX0xBTkdfUkVGTEVDVF9BUlJBWSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgUkVGTEVDVCwgIkFycmF5Ii50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCisJLy8gcHJlZGVmaW5lZCBtZXRob2RzIGNvbnN0YW50IG5hbWVzCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRERUNMQVJFREZJRUxEX05BTUUgPSAiZ2V0RGVjbGFyZWRGaWVsZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURGSUVMRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRBQ0NFU1NJQkxFX05BTUUgPSAic2V0QWNjZXNzaWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUQUNDRVNTSUJMRV9TSUdOQVRVUkUgPSAiKFopViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gSkFWQUxBTkdSRUZMRUNURklFTERfQ09OU1RBTlRQT09MTkFNRSA9ICJqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gSkFWQUxBTkdSRUZMRUNUQUNDRVNTSUJMRU9CSkVDVF9DT05TVEFOVFBPT0xOQU1FID0gImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVEFSUkFZX0NPTlNUQU5UUE9PTE5BTUUgPSAiamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEpBVkFMQU5HUkVGTEVDVE1FVEhPRF9DT05TVEFOVFBPT0xOQU1FID0gImphdmEvbGFuZy9yZWZsZWN0L01ldGhvZCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0lOVF9NRVRIT0RfTkFNRSA9ICJnZXRJbnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9MT05HX01FVEhPRF9OQU1FID0gImdldExvbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9ET1VCTEVfTUVUSE9EX05BTUUgPSAiZ2V0RG91YmxlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRkxPQVRfTUVUSE9EX05BTUUgPSAiZ2V0RmxvYXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CWVRFX01FVEhPRF9OQU1FID0gImdldEJ5dGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9DSEFSX01FVEhPRF9OQU1FID0gImdldENoYXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CT09MRUFOX01FVEhPRF9OQU1FID0gImdldEJvb2xlYW4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9PQkpFQ1RfTUVUSE9EX05BTUUgPSAiZ2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfU0hPUlRfTUVUSE9EX05BTUUgPSAiZ2V0U2hvcnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEFSUkFZX05FV0lOU1RBTkNFX05BTUUgPSAibmV3SW5zdGFuY2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9JTlRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9MT05HX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylKIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRE9VQkxFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylEIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9CWVRFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylCIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBHRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDspQyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KVoiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVF9PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0OylTIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfSU5UX01FVEhPRF9OQU1FID0gInNldEludCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0xPTkdfTUVUSE9EX05BTUUgPSAic2V0TG9uZyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0RPVUJMRV9NRVRIT0RfTkFNRSA9ICJzZXREb3VibGUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9GTE9BVF9NRVRIT0RfTkFNRSA9ICJzZXRGbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JZVEVfTUVUSE9EX05BTUUgPSAic2V0Qnl0ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0NIQVJfTUVUSE9EX05BTUUgPSAic2V0Q2hhciIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUgPSAic2V0Qm9vbGVhbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX09CSkVDVF9NRVRIT0RfTkFNRSA9ICJzZXQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9TSE9SVF9NRVRIT0RfTkFNRSA9ICJzZXRTaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0lOVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtJKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9MT05HX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0opViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0RPVUJMRV9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtEKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9GTE9BVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtGKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9CWVRFX01FVEhPRF9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvT2JqZWN0O0IpViIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0VUX0NIQVJfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7QylWIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBTRVRfQk9PTEVBTl9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtaKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIFNFVF9TSE9SVF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtTKVYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVETUVUSE9EX05BTUUgPSAiZ2V0RGVjbGFyZWRNZXRob2QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVETUVUSE9EX1NJR05BVFVSRSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBBUlJBWV9ORVdJTlNUQU5DRV9TSUdOQVRVUkUgPSAiKExqYXZhL2xhbmcvQ2xhc3M7W0kpTGphdmEvbGFuZy9PYmplY3Q7Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBJTlZPS0VfTUVUSE9EX01FVEhPRF9OQU1FID0gImludm9rZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gSU5WT0tFX01FVEhPRF9NRVRIT0RfU0lHTkFUVVJFID0gIihMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gQllURVZBTFVFX0JZVEVfTUVUSE9EX05BTUUgPSAiYnl0ZVZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBCWVRFVkFMVUVfQllURV9NRVRIT0RfU0lHTkFUVVJFID0gIigpQiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfTkFNRSA9ICJzaG9ydFZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX05BTUUgPSAiZG91YmxlVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX05BTUUgPSAiZmxvYXRWYWx1ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gSU5UVkFMVUVfSU5URUdFUl9NRVRIT0RfTkFNRSA9ICJpbnRWYWx1ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gQ0hBUlZBTFVFX0NIQVJBQ1RFUl9NRVRIT0RfTkFNRSA9ICJjaGFyVmFsdWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEJPT0xFQU5WQUxVRV9CT09MRUFOX01FVEhPRF9OQU1FID0gImJvb2xlYW5WYWx1ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gTE9OR1ZBTFVFX0xPTkdfTUVUSE9EX05BTUUgPSAibG9uZ1ZhbHVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUgPSAiKClTIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUYiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIElOVFZBTFVFX0lOVEVHRVJfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUkiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIENIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EX1NJR05BVFVSRSA9ICIoKUMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEJPT0xFQU5WQUxVRV9CT09MRUFOX01FVEhPRF9TSUdOQVRVUkUgPSAiKClaIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIGNoYXJbXSBMT05HVkFMVUVfTE9OR19NRVRIT0RfU0lHTkFUVVJFID0gIigpSiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBjaGFyW10gR0VUREVDTEFSRURDT05TVFJVQ1RPUl9OQU1FID0gImdldERlY2xhcmVkQ29uc3RydWN0b3IiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgY2hhcltdIEdFVERFQ0xBUkVEQ09OU1RSVUNUT1JfU0lHTkFUVVJFID0gIihbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQorCS8vIHByZWRlZmluZWQgY29uc3RhbnQgaW5kZXggZm9yIHdlbGwga25vd24gdHlwZXMKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19SRUZMRUNUX0ZJRUxEX1RZUEUgPSAwOworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EX1RZUEUgPSAxOworCWZpbmFsIHN0YXRpYyBpbnQgSkFWQV9MQU5HX1JFRkxFQ1RfQUNDRVNTSUJMRU9CSkVDVF9UWVBFID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IEpBVkFfTEFOR19SRUZMRUNUX0FSUkFZX1RZUEUgPSAzOworCisJLy8gcHJlZGVmaW5lZCBjb25zdGFudCBpbmRleCBmb3Igd2VsbCBrbm93biBtZXRob2RzCisJZmluYWwgc3RhdGljIGludCBHRVRERUNMQVJFREZJRUxEX0NMQVNTX01FVEhPRCA9IDA7CisJZmluYWwgc3RhdGljIGludCBTRVRBQ0NFU1NJQkxFX0FDQ0VTU0lCTEVPQkpFQ1RfTUVUSE9EID0gMTsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9JTlRfTUVUSE9EID0gMjsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9MT05HX01FVEhPRCA9IDM7CisJZmluYWwgc3RhdGljIGludCBHRVRfRE9VQkxFX01FVEhPRCA9IDQ7CisJZmluYWwgc3RhdGljIGludCBHRVRfRkxPQVRfTUVUSE9EID0gNTsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9CWVRFX01FVEhPRCA9IDY7CisJZmluYWwgc3RhdGljIGludCBHRVRfQ0hBUl9NRVRIT0QgPSA3OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0JPT0xFQU5fTUVUSE9EID0gODsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9PQkpFQ1RfTUVUSE9EID0gOTsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9TSE9SVF9NRVRIT0QgPSAxMDsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9JTlRfTUVUSE9EID0gMTE7CisJZmluYWwgc3RhdGljIGludCBTRVRfTE9OR19NRVRIT0QgPSAxMjsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9ET1VCTEVfTUVUSE9EID0gMTM7CisJZmluYWwgc3RhdGljIGludCBTRVRfRkxPQVRfTUVUSE9EID0gMTQ7CisJZmluYWwgc3RhdGljIGludCBTRVRfQllURV9NRVRIT0QgPSAxNTsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9DSEFSX01FVEhPRCA9IDE2OworCWZpbmFsIHN0YXRpYyBpbnQgU0VUX0JPT0xFQU5fTUVUSE9EID0gMTc7CisJZmluYWwgc3RhdGljIGludCBTRVRfT0JKRUNUX01FVEhPRCA9IDE4OworCWZpbmFsIHN0YXRpYyBpbnQgU0VUX1NIT1JUX01FVEhPRCA9IDE5OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUREVDTEFSRURNRVRIT0RfQ0xBU1NfTUVUSE9EID0gMjA7CisJZmluYWwgc3RhdGljIGludCBORVdJTlNUQU5DRV9BUlJBWV9NRVRIT0QgPSAyMTsKKwlmaW5hbCBzdGF0aWMgaW50IElOVk9LRV9NRVRIT0RfTUVUSE9EID0gMjI7CisJZmluYWwgc3RhdGljIGludCBCWVRFVkFMVUVfQllURV9NRVRIT0QgPSAyMzsKKwlmaW5hbCBzdGF0aWMgaW50IFNIT1JUVkFMVUVfU0hPUlRfTUVUSE9EID0gMjQ7CisJZmluYWwgc3RhdGljIGludCBET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EID0gMjU7CisJZmluYWwgc3RhdGljIGludCBGTE9BVFZBTFVFX0ZMT0FUX01FVEhPRCA9IDI2OworCWZpbmFsIHN0YXRpYyBpbnQgSU5UVkFMVUVfSU5URUdFUl9NRVRIT0QgPSAyNzsKKwlmaW5hbCBzdGF0aWMgaW50IENIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EID0gMjg7CisJZmluYWwgc3RhdGljIGludCBCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0QgPSAyOTsKKwlmaW5hbCBzdGF0aWMgaW50IExPTkdWQUxVRV9MT05HX01FVEhPRCA9IDMwOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUREVDTEFSRURDT05TVFJVQ1RPUl9DTEFTU19NRVRIT0QgPSAzMTsKKwkKKwkvLyBwcmVkZWZpbmVkIGNvbnN0YW50IGluZGV4IGZvciB3ZWxsIGtub3duIG5hbWUgYW5kIHR5cGUgZm9yIG1ldGhvZHMKKwlmaW5hbCBzdGF0aWMgaW50IEdFVERFQ0xBUkVERklFTERfQ0xBU1NfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAwOworCWZpbmFsIHN0YXRpYyBpbnQgU0VUQUNDRVNTSUJMRV9BQ0NFU1NJQkxFT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVF9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAzOworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDQ7CisJZmluYWwgc3RhdGljIGludCBHRVRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA1OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0JZVEVfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA2OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA3OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEUgPSA4OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDk7CisJZmluYWwgc3RhdGljIGludCBHRVRfU0hPUlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxMDsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxMTsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTI7CisJZmluYWwgc3RhdGljIGludCBTRVRfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTM7CisJZmluYWwgc3RhdGljIGludCBTRVRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxNDsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9CWVRFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMTU7CisJZmluYWwgc3RhdGljIGludCBTRVRfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDE2OworCWZpbmFsIHN0YXRpYyBpbnQgU0VUX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxNzsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9PQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAxODsKKwlmaW5hbCBzdGF0aWMgaW50IFNFVF9TSE9SVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDE5OworCWZpbmFsIHN0YXRpYyBpbnQgR0VUREVDTEFSRURNRVRIT0RfQ0xBU1NfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAyMDsKKwlmaW5hbCBzdGF0aWMgaW50IEFSUkFZX05FV0lOU1RBTkNFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjE7CisJZmluYWwgc3RhdGljIGludCBJTlZPS0VfTUVUSE9EX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjI7CisJZmluYWwgc3RhdGljIGludCBCWVRFVkFMVUVfQllURV9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDIzOworCWZpbmFsIHN0YXRpYyBpbnQgU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDI0OworCWZpbmFsIHN0YXRpYyBpbnQgRE9VQkxFVkFMVUVfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjU7CisJZmluYWwgc3RhdGljIGludCBGTE9BVFZBTFVFX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjY7CisJZmluYWwgc3RhdGljIGludCBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjc7CisJZmluYWwgc3RhdGljIGludCBDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9OQU1FX0FORF9UWVBFID0gMjg7CisJZmluYWwgc3RhdGljIGludCBCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRSA9IDI5OworCWZpbmFsIHN0YXRpYyBpbnQgTE9OR1ZBTFVFX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAzMDsKKwlmaW5hbCBzdGF0aWMgaW50IEdFVERFQ0xBUkVEQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EX05BTUVfQU5EX1RZUEUgPSAzMTsKKwkKKwlpbnRbXSB3ZWxsS25vd25UeXBlcyA9IG5ldyBpbnRbNF07CisJaW50W10gd2VsbEtub3duTWV0aG9kcyA9IG5ldyBpbnRbMzJdOworCWludFtdIHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlcyA9IG5ldyBpbnRbMzJdOwkKKy8qKgorICogQ29kZVNuaXBwZXRDb25zdGFudFBvb2wgY29uc3RydWN0b3IgY29tbWVudC4KKyAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZQorICovCitwdWJsaWMgQ29kZVNuaXBwZXRDb25zdGFudFBvb2wob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwlzdXBlcihjbGFzc0ZpbGUpOworfQorLyoqCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBAbWV0aG9kQmluZGluZy4KKyAqCisgKiBSZXR1cm5zIC0xIGlmIHRoZSBAbWV0aG9kQmluZGluZyBpcyBub3QgYSBwcmVkZWZpbmVkIG1ldGhvZEJpbmRpbmcsIAorICogdGhlIHJpZ2h0IGluZGV4IG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gbWV0aG9kQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGluZGV4T2ZXZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZShNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKKwlpbnQgaW5kZXggPSBzdXBlci5pbmRleE9mV2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGUobWV0aG9kQmluZGluZyk7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCWNoYXIgZmlyc3RDaGFyID0gbWV0aG9kQmluZGluZy5zZWxlY3RvclswXTsKKwkJc3dpdGNoKGZpcnN0Q2hhcikgeworCQkJY2FzZSAnZyc6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ1N0cmluZworCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRERUNMQVJFREZJRUxEX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoKChSZWZlcmVuY2VCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpLmNvbXBvdW5kTmFtZSxKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRCkpIHsKKwkJCQkJCXJldHVybiBHRVRERUNMQVJFREZJRUxEX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfSmF2YUxhbmdDbGFzcworCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRERUNMQVJFRE1FVEhPRF9OQU1FKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKCgoUmVmZXJlbmNlQmluZGluZykgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlKS5jb21wb3VuZE5hbWUsSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EKSkgeworCQkJCQkJcmV0dXJuIEdFVERFQ0xBUkVETUVUSE9EX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfSmF2YUxhbmdDbGFzcworCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRERUNMQVJFRENPTlNUUlVDVE9SX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoKChSZWZlcmVuY2VCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUpLmNvbXBvdW5kTmFtZSxKQVZBX0xBTkdfUkVGTEVDVF9DT05TVFJVQ1RPUikpIHsKKwkJCQkJCXJldHVybiBHRVRERUNMQVJFRENPTlNUUlVDVE9SX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX09iamVjdCkgeworCQkJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCkgeworCQkJCQkJCWNhc2UgVF9pbnQgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0lOVF9NRVRIT0RfTkFNRSkKKwkJCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2ludCkgeworCQkJCQkJCQkJcmV0dXJuIEdFVF9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2J5dGUgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0JZVEVfTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9ieXRlKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0JZVEVfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CQkJCQkKKwkJCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX1NIT1JUX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfc2hvcnQpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfU0hPUlRfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2NoYXIgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0NIQVJfTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9jaGFyKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfRE9VQkxFX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfZG91YmxlKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0ZMT0FUX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfZmxvYXQpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2xvbmcgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0xPTkdfTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9sb25nKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0JPT0xFQU5fTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9ib29sZWFuKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX09iamVjdCA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfT0JKRUNUX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQkJCQl9CisJCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9pbnQpIHsKKwkJCQkJCXJldHVybiBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0CisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgSU5WT0tFX01FVEhPRF9NRVRIT0RfTkFNRSkKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QpIHsKKwkJCQkJCXJldHVybiBJTlZPS0VfTUVUSE9EX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0JCQkKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfTkFNRSkKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfc2hvcnQpIHsKKwkJCQkJCXJldHVybiBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX2Jvb2xlYW4KKwkJCQkJJiYgbWV0aG9kQmluZGluZy5zZWxlY3Rvci5sZW5ndGggPT0gMTMKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUQUNDRVNTSUJMRV9OQU1FKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkKSB7CisJCQkJCQlyZXR1cm4gU0VUQUNDRVNTSUJMRV9BQ0NFU1NJQkxFT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZAorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDIKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkID09IFRfT2JqZWN0KSB7CisJCQkJCQlzd2l0Y2gobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSB7CisJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0uaWQgPT0gVF9pbnQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0lOVF9NRVRIT0RfTkFNRSkKKwkJCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX3ZvaWQpIHsKKwkJCQkJCQkJCXJldHVybiBTRVRfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2J5dGUgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0JZVEVfTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0JZVEVfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CQkJCQkKKwkJCQkJCQljYXNlIFRfc2hvcnQgOgorCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlkID09IFRfc2hvcnQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX1NIT1JUX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZCkgeworCQkJCQkJCQkJcmV0dXJuIFNFVF9TSE9SVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0uaWQgPT0gVF9jaGFyICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9DSEFSX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZCkgeworCQkJCQkJCQkJcmV0dXJuIFNFVF9DSEFSX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlkID09IFRfZG91YmxlICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9ET1VCTEVfTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfZmxvYXQgOgorCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlkID09IFRfZmxvYXQgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0ZMT0FUX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZCkgeworCQkJCQkJCQkJcmV0dXJuIFNFVF9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0uaWQgPT0gVF9sb25nICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9MT05HX01FVEhPRF9OQU1FKQorCQkJCQkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfdm9pZCkgeworCQkJCQkJCQkJcmV0dXJuIFNFVF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2Jvb2xlYW4gJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUpCisJCQkJCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX09iamVjdCA6CisJCQkJCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0uaWQgPT0gVF9PYmplY3QgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX09CSkVDVF9NRVRIT0RfTkFNRSkKKwkJCQkJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX3ZvaWQpIHsKKwkJCQkJCQkJCXJldHVybiBTRVRfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCQkJCQl9CisJCQkJCQl9CisJCQkJfQkJCQorCQkJCWJyZWFrOworCQkJY2FzZSAnZic6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBGTE9BVFZBTFVFX0ZMT0FUX01FVEhPRF9OQU1FKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF9mbG9hdCkgeworCQkJCQkJcmV0dXJuIEZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2RvdWJsZSkgeworCQkJCQkJcmV0dXJuIERPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdjJzoKKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIENIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2NoYXIpIHsKKwkJCQkJCXJldHVybiBDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2Jvb2xlYW4pIHsKKwkJCQkJCXJldHVybiBCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQl9CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBCWVRFVkFMVUVfQllURV9NRVRIT0RfTkFNRSkKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkID09IFRfYnl0ZSkgeworCQkJCQkJcmV0dXJuIEJZVEVWQUxVRV9CWVRFX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCWlmIChtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgTE9OR1ZBTFVFX0xPTkdfTUVUSE9EX05BTUUpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCA9PSBUX2xvbmcpIHsKKwkJCQkJCXJldHVybiBMT05HVkFMVUVfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlzQXJyYXlUeXBlKCkKKwkJCQkJJiYgKChBcnJheUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXSkubGVhZkNvbXBvbmVudFR5cGUuaWQgPT0gVF9pbnQKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgQVJSQVlfTkVXSU5TVEFOQ0VfTkFNRSkKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5yZXR1cm5UeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZworCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscygoKFJlZmVyZW5jZUJpbmRpbmcpIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSkuY29tcG91bmROYW1lLEpBVkFfTEFOR19SRUZMRUNUX0FSUkFZKSkgeworCQkJCQkJcmV0dXJuIEFSUkFZX05FV0lOU1RBTkNFX01FVEhPRF9OQU1FX0FORF9UWVBFOworCQkJCX0KKwkJfQorCisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgQG1ldGhvZEJpbmRpbmcuCisgKgorICogUmV0dXJucyAtMSBpZiB0aGUgQG1ldGhvZEJpbmRpbmcgaXMgbm90IGEgcHJlZGVmaW5lZCBtZXRob2RCaW5kaW5nLCAKKyAqIHRoZSByaWdodCBpbmRleCBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIG1ldGhvZEJpbmRpbmdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGluZGV4T2ZXZWxsS25vd25NZXRob2RzKE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCWludCBpbmRleCA9IHN1cGVyLmluZGV4T2ZXZWxsS25vd25NZXRob2RzKG1ldGhvZEJpbmRpbmcpOworCWlmIChpbmRleCA9PSAtMSkgeworCQljaGFyIGZpcnN0Q2hhciA9IG1ldGhvZEJpbmRpbmcuc2VsZWN0b3JbMF07CisJCXN3aXRjaChmaXJzdENoYXIpIHsKKwkJCWNhc2UgJ2cnOgorCQkJCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkID09IFRfSmF2YUxhbmdDbGFzcworCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkID09IFRfSmF2YUxhbmdTdHJpbmcKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUREVDTEFSRURGSUVMRF9OQU1FKSkgeworCQkJCQkJcmV0dXJuIEdFVERFQ0xBUkVERklFTERfQ0xBU1NfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUX0phdmFMYW5nQ2xhc3MKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nU3RyaW5nCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfSmF2YUxhbmdDbGFzcworCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRERUNMQVJFRE1FVEhPRF9OQU1FKSkgeworCQkJCQkJcmV0dXJuIEdFVERFQ0xBUkVETUVUSE9EX0NMQVNTX01FVEhPRDsKKwkJCQl9CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVF9KYXZhTGFuZ0NsYXNzCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaXNBcnJheVR5cGUoKQorCQkJCQkmJiAoKEFycmF5QmluZGluZykgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdKS5sZWFmQ29tcG9uZW50VHlwZS5pZCA9PSBUX0phdmFMYW5nQ2xhc3MKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUREVDTEFSRURDT05TVFJVQ1RPUl9OQU1FKSkgeworCQkJCQkJcmV0dXJuIEdFVERFQ0xBUkVEQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb21wb3VuZE5hbWUsIEpBVkFfTEFOR19SRUZMRUNUX0ZJRUxEKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDEKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzBdLmlkID09IFRfT2JqZWN0KSB7CisJCQkJCQlzd2l0Y2gobWV0aG9kQmluZGluZy5yZXR1cm5UeXBlLmlkKSB7CisJCQkJCQkJY2FzZSBUX2ludCA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfSU5UX01FVEhPRF9OQU1FKSkgeworCQkJCQkJCQkJcmV0dXJuIEdFVF9JTlRfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIEdFVF9CWVRFX01FVEhPRF9OQU1FKSkgeworCQkJCQkJCQkJcmV0dXJuIEdFVF9CWVRFX01FVEhPRDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsJCQkJCQorCQkJCQkJCWNhc2UgVF9zaG9ydCA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfU0hPUlRfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX1NIT1JUX01FVEhPRDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfY2hhciA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfQ0hBUl9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfQ0hBUl9NRVRIT0Q7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfRE9VQkxFX01FVEhPRF9OQU1FKSkgeworCQkJCQkJCQkJcmV0dXJuIEdFVF9ET1VCTEVfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9mbG9hdCA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfRkxPQVRfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0ZMT0FUX01FVEhPRDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBHRVRfTE9OR19NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfTE9OR19NRVRIT0Q7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX0JPT0xFQU5fTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gR0VUX0JPT0xFQU5fTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9PYmplY3QgOgorCQkJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgR0VUX09CSkVDVF9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCQkJCXJldHVybiBHRVRfT0JKRUNUX01FVEhPRDsKKwkJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCWlmIChtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkID09IFRfSmF2YUxhbmdJbnRlZ2VyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FKSkgeworCQkJCQkJcmV0dXJuIElOVFZBTFVFX0lOVEVHRVJfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb21wb3VuZE5hbWUsIEpBVkFfTEFOR19SRUZMRUNUX01FVEhPRCkKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAyCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1swXS5pZCA9PSBUX0phdmFMYW5nT2JqZWN0CisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfSmF2YUxhbmdPYmplY3QKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgSU5WT0tFX01FVEhPRF9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCXJldHVybiBJTlZPS0VfTUVUSE9EX01FVEhPRDsKKwkJCQl9CQkJCisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUX0phdmFMYW5nQnl0ZQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgQllURVZBTFVFX0JZVEVfTUVUSE9EX05BTUUpKSB7CisJCQkJCQlyZXR1cm4gQllURVZBTFVFX0JZVEVfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUX0phdmFMYW5nQm9vbGVhbgorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EX05BTUUpKSB7CisJCQkJCQlyZXR1cm4gQk9PTEVBTlZBTFVFX0JPT0xFQU5fTUVUSE9EOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOiAJCQkJCisJCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVF9KYXZhTGFuZ1Nob3J0CisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FKSkgeworCQkJCQkJcmV0dXJuIFNIT1JUVkFMVUVfU0hPUlRfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb21wb3VuZE5hbWUsIEpBVkFfTEFOR19SRUZMRUNUX0FDQ0VTU0lCTEVPQkpFQ1QpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9ib29sZWFuCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IubGVuZ3RoID09IDEzCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVEFDQ0VTU0lCTEVfTkFNRSkpIHsKKwkJCQkJCXJldHVybiBTRVRBQ0NFU1NJQkxFX0FDQ0VTU0lCTEVPQkpFQ1RfTUVUSE9EOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jb21wb3VuZE5hbWUsIEpBVkFfTEFOR19SRUZMRUNUX0ZJRUxEKQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQgPT0gVF92b2lkCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMgorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9PYmplY3QpIHsKKwkJCQkJCXN3aXRjaChtZXRob2RCaW5kaW5nLnJldHVyblR5cGUuaWQpIHsKKwkJCQkJCQljYXNlIFRfaW50IDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2ludCAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBTRVRfSU5UX01FVEhPRF9OQU1FKSkgeworCQkJCQkJCQkJcmV0dXJuIFNFVF9JTlRfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9ieXRlIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2J5dGUgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0JZVEVfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0JZVEVfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOwkJCQkJCisJCQkJCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX3Nob3J0ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9TSE9SVF9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCQkJCXJldHVybiBTRVRfU0hPUlRfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9jaGFyIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2NoYXIgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0NIQVJfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0NIQVJfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9kb3VibGUgOgorCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlkID09IFRfZG91YmxlICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9ET1VCTEVfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0RPVUJMRV9NRVRIT0Q7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2Zsb2F0ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9GTE9BVF9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCQkJCXJldHVybiBTRVRfRkxPQVRfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9sb25nIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2xvbmcgJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0xPTkdfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0xPTkdfTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQkJCQkJaWYgKG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pZCA9PSBUX2Jvb2xlYW4gJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX0JPT0xFQU5fTUVUSE9EOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVF9PYmplY3QgOgorCQkJCQkJCQlpZiAobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzWzFdLmlkID09IFRfT2JqZWN0ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIFNFVF9PQkpFQ1RfTUVUSE9EX05BTUUpKSB7CisJCQkJCQkJCQlyZXR1cm4gU0VUX09CSkVDVF9NRVRIT0Q7CisJCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CQkJCisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUX0phdmFMYW5nRmxvYXQKKwkJCQkJJiYgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIEZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX05BTUUpKSB7CisJCQkJCQlyZXR1cm4gRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0Q7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVF9KYXZhTGFuZ0RvdWJsZQorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgRE9VQkxFVkFMVUVfRE9VQkxFX01FVEhPRF9OQU1FKSkgeworCQkJCQkJcmV0dXJuIERPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0Q7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgPT0gVF9KYXZhTGFuZ0NoYXJhY3RlcgorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgQ0hBUlZBTFVFX0NIQVJBQ1RFUl9NRVRIT0RfTkFNRSkpIHsKKwkJCQkJCXJldHVybiBDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdsJzoKKwkJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCA9PSBUX0phdmFMYW5nTG9uZworCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kQmluZGluZy5zZWxlY3RvciwgTE9OR1ZBTFVFX0xPTkdfTUVUSE9EX05BTUUpKSB7CisJCQkJCQlyZXR1cm4gTE9OR1ZBTFVFX0xPTkdfTUVUSE9EOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNvbXBvdW5kTmFtZSwgSkFWQV9MQU5HX1JFRkxFQ1RfQVJSQVkpCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycy5sZW5ndGggPT0gMgorCQkJCQkmJiBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMF0uaWQgPT0gVF9KYXZhTGFuZ0NsYXNzCisJCQkJCSYmIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyc1sxXS5pc0FycmF5VHlwZSgpCisJCQkJCSYmICgoQXJyYXlCaW5kaW5nKSBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnNbMV0pLmxlYWZDb21wb25lbnRUeXBlLmlkID09IFRfaW50CisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIEFSUkFZX05FV0lOU1RBTkNFX05BTUUpKSB7CisJCQkJCQlyZXR1cm4gTkVXSU5TVEFOQ0VfQVJSQVlfTUVUSE9EOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIEB0eXBlQmluZGluZworICoKKyAqIFJldHVybnMgLTEgaWYgdGhlIEB0eXBlQmluZGluZyBpcyBub3QgYSBwcmVkZWZpbmVkIGJpbmRpbmcsIHRoZSByaWdodCBpbmRleCAKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdHlwZUJpbmRpbmcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgaW5kZXhPZldlbGxLbm93blR5cGVzKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJaW50IGluZGV4ID0gc3VwZXIuaW5kZXhPZldlbGxLbm93blR5cGVzKHR5cGVCaW5kaW5nKTsKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJaWYgKCF0eXBlQmluZGluZy5pc0Jhc2VUeXBlKCkgJiYgIXR5cGVCaW5kaW5nLmlzQXJyYXlUeXBlKCkpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJCWlmICh0eXBlLmNvbXBvdW5kTmFtZS5sZW5ndGggPT0gNCkgeworCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRCwgdHlwZS5jb21wb3VuZE5hbWUpKSB7CisJCQkJCXJldHVybiBKQVZBX0xBTkdfUkVGTEVDVF9GSUVMRF9UWVBFOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9ELCB0eXBlLmNvbXBvdW5kTmFtZSkpIHsKKwkJCQkJcmV0dXJuIEpBVkFfTEFOR19SRUZMRUNUX01FVEhPRF9UWVBFOworCQkJCX0KKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSkFWQV9MQU5HX1JFRkxFQ1RfQVJSQVksIHR5cGUuY29tcG91bmROYW1lKSkgeworCQkJCQlyZXR1cm4gSkFWQV9MQU5HX1JFRkxFQ1RfQVJSQVlfVFlQRTsKKwkJCQl9CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKEpBVkFfTEFOR19SRUZMRUNUX0FDQ0VTU0lCTEVPQkpFQ1QsIHR5cGUuY29tcG91bmROYW1lKSkgeworCQkJCQlyZXR1cm4gSkFWQV9MQU5HX1JFRkxFQ1RfQUNDRVNTSUJMRU9CSkVDVF9UWVBFOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHBhcmFtIE1ldGhvZEJpbmRpbmcgYU1ldGhvZEJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleChNZXRob2RCaW5kaW5nIGFNZXRob2RCaW5kaW5nKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCWludCBpbmRleFdlbGxLbm93bk1ldGhvZDsKKwlpZiAoKGluZGV4V2VsbEtub3duTWV0aG9kID0gc3VwZXIuaW5kZXhPZldlbGxLbm93bk1ldGhvZHMoYU1ldGhvZEJpbmRpbmcpKSA9PSAtMSkgeworCQlpZiAoKGluZGV4V2VsbEtub3duTWV0aG9kID0gaW5kZXhPZldlbGxLbm93bk1ldGhvZHMoYU1ldGhvZEJpbmRpbmcpKSA9PSAtMSkgeworCQkJaWYgKGFNZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQkvLyBMb29raW5mIGludG8gdGhlIGludGVyZmFjZSBtZXRob2QgcmVmIHRhYmxlCisJCQkJaWYgKChpbmRleCA9IGludGVyZmFjZU1ldGhvZENhY2hlLmdldChhTWV0aG9kQmluZGluZykpIDwgMCkgeworCQkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQlsaXRlcmFsSW5kZXhGb3JNZXRob2RzKAorCQkJCQkJCWxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCkpLAorCQkJCQkJCWxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5zaWduYXR1cmUoKSksCisJCQkJCQkJYU1ldGhvZEJpbmRpbmcpOworCQkJCQlpbmRleCA9IGludGVyZmFjZU1ldGhvZENhY2hlLnB1dChhTWV0aG9kQmluZGluZywgY3VycmVudEluZGV4KyspOworCQkJCQkvLyBXcml0ZSB0aGUgaW50ZXJmYWNlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCQl3cml0ZVUxKEludGVyZmFjZU1ldGhvZFJlZlRhZyk7CisJCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIExvb2tpbmYgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCQkJCWlmICgoaW5kZXggPSBtZXRob2RDYWNoZS5nZXQoYU1ldGhvZEJpbmRpbmcpKSA8IDApIHsKKwkJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcygKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKSwKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCkpLAorCQkJCQkJCWFNZXRob2RCaW5kaW5nKTsKKwkJCQkJaW5kZXggPSBtZXRob2RDYWNoZS5wdXQoYU1ldGhvZEJpbmRpbmcsIGN1cnJlbnRJbmRleCsrKTsKKwkJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBUaGlzIGlzIGEgd2VsbCBrbm93biBtZXRob2QKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW2luZGV4V2VsbEtub3duTWV0aG9kXSkgPT0gMCkgeworCQkJCS8vIHRoaXMgbWV0aG9kcyB3YXMgbm90IGluc2VydGVkIHlldAorCQkJCWlmIChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCS8vIExvb2tpbmYgaW50byB0aGUgaW50ZXJmYWNlIG1ldGhvZCByZWYgdGFibGUKKwkJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcygKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKSwKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCkpLAorCQkJCQkJCWFNZXRob2RCaW5kaW5nKTsKKwkJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW2luZGV4V2VsbEtub3duTWV0aG9kXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQkvLyBXcml0ZSB0aGUgaW50ZXJmYWNlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCQl3cml0ZVUxKEludGVyZmFjZU1ldGhvZFJlZlRhZyk7CisJCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBMb29raW5mIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwkJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleChhTWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcygKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKSwKKwkJCQkJCQlsaXRlcmFsSW5kZXgoYU1ldGhvZEJpbmRpbmcuc2lnbmF0dXJlKCkpLAorCQkJCQkJCWFNZXRob2RCaW5kaW5nKTsKKwkJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW2luZGV4V2VsbEtub3duTWV0aG9kXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWluZGV4ID0gc3VwZXIubGl0ZXJhbEluZGV4KGFNZXRob2RCaW5kaW5nKTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleChUeXBlQmluZGluZyBhVHlwZUJpbmRpbmcpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVJbmRleDsKKwlpbnQgaW5kZXhXZWxsS25vd25UeXBlOworCWlmICgoaW5kZXhXZWxsS25vd25UeXBlID0gc3VwZXIuaW5kZXhPZldlbGxLbm93blR5cGVzKGFUeXBlQmluZGluZykpID09IC0xKSB7CisJCWlmICgoaW5kZXhXZWxsS25vd25UeXBlID0gaW5kZXhPZldlbGxLbm93blR5cGVzKGFUeXBlQmluZGluZykpID09IC0xKSB7CisJCQlpZiAoKGluZGV4ID0gY2xhc3NDYWNoZS5nZXQoYVR5cGVCaW5kaW5nKSkgPCAwKSB7CisJCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoYVR5cGVCaW5kaW5nLmNvbnN0YW50UG9vbE5hbWUoKSk7CisJCQkJaW5kZXggPSBjbGFzc0NhY2hlLnB1dChhVHlwZUJpbmRpbmcsIGN1cnJlbnRJbmRleCsrKTsKKwkJCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbaW5kZXhXZWxsS25vd25UeXBlXSkgPT0gMCkgeworCQkJCS8vIE5lZWQgdG8gaW5zZXJ0IHRoYXQgYmluZGluZworCQkJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChhVHlwZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpKTsKKwkJCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW2luZGV4V2VsbEtub3duVHlwZV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbmRleCA9IHN1cGVyLmxpdGVyYWxJbmRleChhVHlwZUJpbmRpbmcpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCb29sZWFuQm9vbGVhblZhbHVlKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0Jvb2xlYW4oKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0JPT0xFQU5WQUxVRV9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEJPT0xFQU5WQUxVRV9CT09MRUFOX01FVEhPRF9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tCT09MRUFOVkFMVUVfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nQnl0ZUJ5dGVWYWx1ZSgpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQllURVZBTFVFX0JZVEVfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdCeXRlKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tCWVRFVkFMVUVfQllURV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoQllURVZBTFVFX0JZVEVfTUVUSE9EX05BTUUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChCWVRFVkFMVUVfQllURV9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbQllURVZBTFVFX0JZVEVfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbQllURVZBTFVFX0JZVEVfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXJDaGFyVmFsdWUoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0NIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDaGFyYWN0ZXIoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0NIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KENIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EX05BTUUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tDSEFSVkFMVUVfQ0hBUkFDVEVSX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0NIQVJWQUxVRV9DSEFSQUNURVJfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0dldERlY2xhcmVkQ29uc3RydWN0b3IoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVERFQ0xBUkVEQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzcygpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUREVDTEFSRURDT05TVFJVQ1RPUl9DTEFTU19NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUREVDTEFSRURDT05TVFJVQ1RPUl9OQU1FKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUREVDTEFSRURDT05TVFJVQ1RPUl9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRERUNMQVJFRENPTlNUUlVDVE9SX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVERFQ0xBUkVEQ09OU1RSVUNUT1JfQ0xBU1NfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0dldERlY2xhcmVkRmllbGQoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVERFQ0xBUkVERklFTERfQ0xBU1NfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzcygpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUREVDTEFSRURGSUVMRF9DTEFTU19NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUREVDTEFSRURGSUVMRF9OQU1FKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUREVDTEFSRURGSUVMRF9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRERUNMQVJFREZJRUxEX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVERFQ0xBUkVERklFTERfQ0xBU1NfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdDbGFzc0dldERlY2xhcmVkTWV0aG9kKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRERUNMQVJFRE1FVEhPRF9DTEFTU19NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0NsYXNzKCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRERUNMQVJFRE1FVEhPRF9DTEFTU19NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUREVDTEFSRURNRVRIT0RfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVERFQ0xBUkVETUVUSE9EX1NJR05BVFVSRSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVERFQ0xBUkVETUVUSE9EX0NMQVNTX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVERFQ0xBUkVETUVUSE9EX0NMQVNTX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nRG91YmxlRG91YmxlVmFsdWUoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0RPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0RvdWJsZSgpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbRE9VQkxFVkFMVUVfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX05BTUUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EX1NJR05BVFVSRSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0RPVUJMRVZBTFVFX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tET1VCTEVWQUxVRV9ET1VCTEVfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdGbG9hdEZsb2F0VmFsdWUoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0ZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EXSkgPT0gMCkgeworCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdGbG9hdCgpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0ZMT0FUVkFMVUVfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbRkxPQVRWQUxVRV9GTE9BVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0ludGVnZXJJbnRWYWx1ZSgpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbSU5UVkFMVUVfSU5URUdFUl9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0ludGVnZXIoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0lOVFZBTFVFX0lOVEVHRVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KElOVFZBTFVFX0lOVEVHRVJfTUVUSE9EX05BTUUpOworCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tJTlRWQUxVRV9JTlRFR0VSX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0lOVFZBTFVFX0lOVEVHRVJfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdMb25nTG9uZ1ZhbHVlKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tMT05HVkFMVUVfTE9OR19NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ0xvbmcoKTsKKwkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0xPTkdWQUxVRV9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChMT05HVkFMVUVfTE9OR19NRVRIT0RfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KExPTkdWQUxVRV9MT05HX01FVEhPRF9TSUdOQVRVUkUpOworCQkJbmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tMT05HVkFMVUVfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tMT05HVkFMVUVfTE9OR19NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RBY2Nlc3NpYmxlT2JqZWN0KCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1JFRkxFQ1RfQUNDRVNTSUJMRU9CSkVDVF9UWVBFXSkgPT0gMCkgeworCQlpbnQgbmFtZUluZGV4OworCQkvLyBUaGUgZW50cnkgZG9lc24ndCBleGl0IHlldAorCQluYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoSkFWQUxBTkdSRUZMRUNUQUNDRVNTSUJMRU9CSkVDVF9DT05TVEFOVFBPT0xOQU1FKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfUkVGTEVDVF9BQ0NFU1NJQkxFT0JKRUNUX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0QWNjZXNzaWJsZU9iamVjdFNldEFjY2Vzc2libGUoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVEFDQ0VTU0lCTEVfQUNDRVNTSUJMRU9CSkVDVF9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RBY2Nlc3NpYmxlT2JqZWN0KCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRBQ0NFU1NJQkxFX0FDQ0VTU0lCTEVPQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEVdKSA9PSAwKSB7CisJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVEFDQ0VTU0lCTEVfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVEFDQ0VTU0lCTEVfU0lHTkFUVVJFKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUQUNDRVNTSUJMRV9BQ0NFU1NJQkxFT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVEFDQ0VTU0lCTEVfQUNDRVNTSUJMRU9CSkVDVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RBcnJheSgpIHsKKwlpbnQgaW5kZXg7CisJaWYgKChpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19SRUZMRUNUX0FSUkFZX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChKQVZBTEFOR1JFRkxFQ1RBUlJBWV9DT05TVEFOVFBPT0xOQU1FKTsKKwkJaW5kZXggPSB3ZWxsS25vd25UeXBlc1tKQVZBX0xBTkdfUkVGTEVDVF9BUlJBWV9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQl3cml0ZVUxKENsYXNzVGFnKTsKKwkJLy8gVGhlbiBhZGQgdGhlIDggYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBsb25nCisJCXdyaXRlVTIobmFtZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEFycmF5TmV3SW5zdGFuY2UoKSB7CisJaW50IGluZGV4OworCWludCBuYW1lQW5kVHlwZUluZGV4OworCWludCBjbGFzc0luZGV4OworCS8vIExvb2tpbmcgaW50byB0aGUgbWV0aG9kIHJlZiB0YWJsZQorCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW05FV0lOU1RBTkNFX0FSUkFZX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEFycmF5KCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tBUlJBWV9ORVdJTlNUQU5DRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoQVJSQVlfTkVXSU5TVEFOQ0VfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEFSUkFZX05FV0lOU1RBTkNFX1NJR05BVFVSRSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0FSUkFZX05FV0lOU1RBTkNFX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCX0KKwkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW05FV0lOU1RBTkNFX0FSUkFZX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1JFRkxFQ1RfRklFTERfVFlQRV0pID09IDApIHsKKwkJaW50IG5hbWVJbmRleDsKKwkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KEpBVkFMQU5HUkVGTEVDVEZJRUxEX0NPTlNUQU5UUE9PTE5BTUUpOworCQlpbmRleCA9IHdlbGxLbm93blR5cGVzW0pBVkFfTEFOR19SRUZMRUNUX0ZJRUxEX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0TWV0aG9kKCkgeworCWludCBpbmRleDsKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EX1RZUEVdKSA9PSAwKSB7CisJCWludCBuYW1lSW5kZXg7CisJCS8vIFRoZSBlbnRyeSBkb2Vzbid0IGV4aXQgeWV0CisJCW5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChKQVZBTEFOR1JFRkxFQ1RNRVRIT0RfQ09OU1RBTlRQT09MTkFNRSk7CisJCWluZGV4ID0gd2VsbEtub3duVHlwZXNbSkFWQV9MQU5HX1JFRkxFQ1RfTUVUSE9EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCXdyaXRlVTEoQ2xhc3NUYWcpOworCQkvLyBUaGVuIGFkZCB0aGUgOCBieXRlcyByZXByZXNlbnRpbmcgdGhlIGxvbmcKKwkJd3JpdGVVMihuYW1lSW5kZXgpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0TWV0aG9kSW52b2tlKCkgeworCWludCBpbmRleDsKKwlpbnQgbmFtZUFuZFR5cGVJbmRleDsKKwlpbnQgY2xhc3NJbmRleDsKKwkvLyBMb29raW5nIGludG8gdGhlIG1ldGhvZCByZWYgdGFibGUKKwlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tJTlZPS0VfTUVUSE9EX01FVEhPRF0pID09IDApIHsKKwkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdE1ldGhvZCgpOworCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbSU5WT0tFX01FVEhPRF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pID09IDApIHsKKwkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoSU5WT0tFX01FVEhPRF9NRVRIT0RfTkFNRSk7CisJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KElOVk9LRV9NRVRIT0RfTUVUSE9EX1NJR05BVFVSRSk7CisJCQluYW1lQW5kVHlwZUluZGV4ID0gd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0lOVk9LRV9NRVRIT0RfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJfQorCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbSU5WT0tFX01FVEhPRF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJfQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnRQb29sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogbWV0aG9kIGRlc2NyaXB0b3IuIEl0IGNhbiBiZSBlaXRoZXIgYW4gaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQKKyAqIG9yIGEgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudC4KKyAqCisgKiBAcmV0dXJuIDxDT0RFPmludDwvQ09ERT4KKyAqLworcHVibGljIGludCBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0U2hvcnRWYWx1ZSgpIHsKKwlpbnQgaW5kZXg7CisJaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJaW50IGNsYXNzSW5kZXg7CisJLy8gTG9va2luZyBpbnRvIHRoZSBtZXRob2QgcmVmIHRhYmxlCisJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RdKSA9PSAwKSB7CisJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1Nob3J0KCk7CisJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkgPT0gMCkgeworCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF9OQU1FKTsKKwkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCW5hbWVBbmRUeXBlSW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0hPUlRWQUxVRV9TSE9SVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQl9CisJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTSE9SVFZBTFVFX1NIT1JUX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyAKKyAqIG5hbWVBbmRUeXBlIGNvbnN0YW50IHdpdGggbmFtZUluZGV4LCB0eXBlSW5kZXguCisgKgorICogQHBhcmFtIGludCBuYW1lSW5kZXgKKyAqIEBwYXJhbSBpbnQgbmFtZUluZGV4CisgKiBAcGFyYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIGEgbWV0aG9kQmluZGluZworICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4Rm9yTWV0aG9kcyhpbnQgbmFtZUluZGV4LCBpbnQgdHlwZUluZGV4LCBNZXRob2RCaW5kaW5nIGtleSkgeworCWludCBpbmRleDsKKwlpbnQgaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlOworCWlmICgoaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlID0gc3VwZXIuaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlKGtleSkpID09IC0xKSB7CisJCWlmICgoaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlID0gaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlKGtleSkpID09IC0xKSB7CisJCQkvLyBjaGVjayBpZiB0aGUgZW50cnkgZXhpc3RzCisJCQlpZiAoKGluZGV4ID0gbmFtZUFuZFR5cGVDYWNoZUZvck1ldGhvZHMuZ2V0KGtleSkpID09IC0xKSB7CisJCQkJLy8gVGhlIGVudHJ5IGRvZXNuJ3QgZXhpdCB5ZXQKKwkJCQlpbmRleCA9IG5hbWVBbmRUeXBlQ2FjaGVGb3JNZXRob2RzLnB1dChrZXksIGN1cnJlbnRJbmRleCsrKTsKKwkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tpbmRleE9mV2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVdKSA9PSAwKSB7CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbaW5kZXhPZldlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbmRleCA9IHN1cGVyLmxpdGVyYWxJbmRleEZvck1ldGhvZHMobmFtZUluZGV4LHR5cGVJbmRleCxrZXkpOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50UG9vbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKyAqIG1ldGhvZCBkZXNjcmlwdG9yLiBJdCBjYW4gYmUgZWl0aGVyIGFuIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50CisgKiBvciBhIG1ldGhvZCByZWZlcmVuY2UgY29uc3RhbnQuCisgKgorICogQHJldHVybiA8Q09ERT5pbnQ8L0NPREU+CisgKi8KK3B1YmxpYyBpbnQgbGl0ZXJhbEluZGV4SmF2YUxhbmdSZWZsZWN0RmllbGRHZXR0ZXIoaW50IHR5cGVJRCkgeworCWludCBpbmRleCA9IDA7CisJaW50IG5hbWVBbmRUeXBlSW5kZXggPSAwOworCWludCBjbGFzc0luZGV4ID0gMDsKKwlzd2l0Y2ggKHR5cGVJRCkgeworCQljYXNlIFRfaW50IDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9JTlRfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVF9JTlRfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVF9JTlRfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9JTlRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9JTlRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2J5dGUgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX0JZVEVfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfQllURV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pCisJCQkJCT09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChHRVRfQllURV9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0JZVEVfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9CWVRFX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRfQllURV9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfc2hvcnQgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX1NIT1JUX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUX1NIT1JUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVF9TSE9SVF9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX1NIT1JUX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfU0hPUlRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9TSE9SVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfbG9uZyA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRfTE9OR19NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVF9MT05HX01FVEhPRF9OQU1FKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChHRVRfTE9OR19NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUX0xPTkdfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9MT05HX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9mbG9hdCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRfRkxPQVRfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0ZMT0FUX01FVEhPRF9OQU1FKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChHRVRfRkxPQVRfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9GTE9BVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX0ZMT0FUX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9kb3VibGUgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX0RPVUJMRV9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9ET1VCTEVfTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0RPVUJMRV9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0RPVUJMRV9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUX0RPVUJMRV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPQorCQkJCQkJCWN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRfRE9VQkxFX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9jaGFyIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9DSEFSX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0NIQVJfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KEdFVF9DSEFSX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfQ0hBUl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX0NIQVJfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX0JPT0xFQU5fTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tHRVRfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pCisJCQkJCT09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChHRVRfQk9PTEVBTl9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX0JPT0xFQU5fTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9CT09MRUFOX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9CisJCQkJCQkJY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW0dFVF9CT09MRUFOX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbR0VUX09CSkVDVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW0dFVF9PQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX09CSkVDVF9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoR0VUX09CSkVDVF9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbR0VUX09CSkVDVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPQorCQkJCQkJCWN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tHRVRfT0JKRUNUX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQl9CisJcmV0dXJuIGluZGV4OworfQorLyoqCisgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudFBvb2wgY29ycmVzcG9uZGluZyB0byB0aGUgCisgKiBtZXRob2QgZGVzY3JpcHRvci4gSXQgY2FuIGJlIGVpdGhlciBhbiBpbnRlcmZhY2UgbWV0aG9kIHJlZmVyZW5jZSBjb25zdGFudAorICogb3IgYSBtZXRob2QgcmVmZXJlbmNlIGNvbnN0YW50LgorICoKKyAqIEByZXR1cm4gPENPREU+aW50PC9DT0RFPgorICovCitwdWJsaWMgaW50IGxpdGVyYWxJbmRleEphdmFMYW5nUmVmbGVjdEZpZWxkU2V0dGVyKGludCB0eXBlSUQpIHsKKwlpbnQgaW5kZXggPSAwOworCWludCBuYW1lQW5kVHlwZUluZGV4ID0gMDsKKwlpbnQgY2xhc3NJbmRleCA9IDA7CisJc3dpdGNoICh0eXBlSUQpIHsKKwkJY2FzZSBUX2ludCA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfSU5UX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX0lOVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pCisJCQkJCT09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChTRVRfSU5UX01FVEhPRF9OQU1FKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChTRVRfSU5UX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfSU5UX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfSU5UX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9ieXRlIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9CWVRFX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX0JZVEVfTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoU0VUX0JZVEVfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9CWVRFX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfQllURV9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0VUX0JZVEVfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX3Nob3J0IDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9TSE9SVF9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NFVF9TSE9SVF9NRVRIT0RfTkFNRV9BTkRfVFlQRV0pCisJCQkJCT09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChTRVRfU0hPUlRfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9TSE9SVF9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX1NIT1JUX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfU0hPUlRfTUVUSE9EXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCS8vIFdyaXRlIHRoZSBtZXRob2QgcmVmIGNvbnN0YW50IGludG8gdGhlIGNvbnN0YW50IHBvb2wKKwkJCQkvLyBGaXJzdCBhZGQgdGhlIHRhZworCQkJCXdyaXRlVTEoTWV0aG9kUmVmVGFnKTsKKwkJCQkvLyBUaGVuIHdyaXRlIHRoZSBjbGFzcyBpbmRleAorCQkJCXdyaXRlVTIoY2xhc3NJbmRleCk7CisJCQkJLy8gVGhlIHdyaXRlIHRoZSBuYW1lQW5kVHlwZSBpbmRleAorCQkJCXdyaXRlVTIobmFtZUFuZFR5cGVJbmRleCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUX2xvbmcgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0VUX0xPTkdfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfTE9OR19NRVRIT0RfTkFNRV9BTkRfVFlQRV0pCisJCQkJCT09IDApIHsKKwkJCQkJaW50IG5hbWVJbmRleCA9IGxpdGVyYWxJbmRleChTRVRfTE9OR19NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoU0VUX0xPTkdfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NFVF9MT05HX01FVEhPRF9OQU1FX0FORF9UWVBFXSA9IGN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfTE9OR19NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfZmxvYXQgOgorCQkJaWYgKChpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0VUX0ZMT0FUX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX0ZMT0FUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9GTE9BVF9NRVRIT0RfTkFNRSk7CisJCQkJCWludCB0eXBlSW5kZXggPSBsaXRlcmFsSW5kZXgoU0VUX0ZMT0FUX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfRkxPQVRfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9GTE9BVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfZG91YmxlIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9ET1VCTEVfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfRE9VQkxFX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9ET1VCTEVfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9ET1VCTEVfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NFVF9ET1VCTEVfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0KKwkJCQkJCQljdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0VUX0RPVUJMRV9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRfY2hhciA6CisJCQlpZiAoKGluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfQ0hBUl9NRVRIT0RdKSA9PSAwKSB7CisJCQkJY2xhc3NJbmRleCA9IGxpdGVyYWxJbmRleEZvckphdmFMYW5nUmVmbGVjdEZpZWxkKCk7CisJCQkJaWYgKChuYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NFVF9DSEFSX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9DSEFSX01FVEhPRF9OQU1FKTsKKwkJCQkJaW50IHR5cGVJbmRleCA9IGxpdGVyYWxJbmRleChTRVRfQ0hBUl9NRVRIT0RfU0lHTkFUVVJFKTsKKwkJCQkJbmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX0NIQVJfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0gY3VycmVudEluZGV4Kys7CisJCQkJCXdyaXRlVTEoTmFtZUFuZFR5cGVUYWcpOworCQkJCQl3cml0ZVUyKG5hbWVJbmRleCk7CisJCQkJCXdyaXRlVTIodHlwZUluZGV4KTsKKwkJCQl9CisJCQkJaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9DSEFSX01FVEhPRF0gPSBjdXJyZW50SW5kZXgrKzsKKwkJCQkvLyBXcml0ZSB0aGUgbWV0aG9kIHJlZiBjb25zdGFudCBpbnRvIHRoZSBjb25zdGFudCBwb29sCisJCQkJLy8gRmlyc3QgYWRkIHRoZSB0YWcKKwkJCQl3cml0ZVUxKE1ldGhvZFJlZlRhZyk7CisJCQkJLy8gVGhlbiB3cml0ZSB0aGUgY2xhc3MgaW5kZXgKKwkJCQl3cml0ZVUyKGNsYXNzSW5kZXgpOworCQkJCS8vIFRoZSB3cml0ZSB0aGUgbmFtZUFuZFR5cGUgaW5kZXgKKwkJCQl3cml0ZVUyKG5hbWVBbmRUeXBlSW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVF9ib29sZWFuIDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9CT09MRUFOX01FVEhPRF0pID09IDApIHsKKwkJCQljbGFzc0luZGV4ID0gbGl0ZXJhbEluZGV4Rm9ySmF2YUxhbmdSZWZsZWN0RmllbGQoKTsKKwkJCQlpZiAoKG5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQl3ZWxsS25vd25NZXRob2ROYW1lQW5kVHlwZXNbU0VUX0JPT0xFQU5fTUVUSE9EX05BTUVfQU5EX1RZUEVdKQorCQkJCQk9PSAwKSB7CisJCQkJCWludCBuYW1lSW5kZXggPSBsaXRlcmFsSW5kZXgoU0VUX0JPT0xFQU5fTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9CT09MRUFOX01FVEhPRF9TSUdOQVRVUkUpOworCQkJCQluYW1lQW5kVHlwZUluZGV4ID0KKwkJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfQk9PTEVBTl9NRVRIT0RfTkFNRV9BTkRfVFlQRV0gPQorCQkJCQkJCWN1cnJlbnRJbmRleCsrOworCQkJCQl3cml0ZVUxKE5hbWVBbmRUeXBlVGFnKTsKKwkJCQkJd3JpdGVVMihuYW1lSW5kZXgpOworCQkJCQl3cml0ZVUyKHR5cGVJbmRleCk7CisJCQkJfQorCQkJCWluZGV4ID0gd2VsbEtub3duTWV0aG9kc1tTRVRfQk9PTEVBTl9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWlmICgoaW5kZXggPSB3ZWxsS25vd25NZXRob2RzW1NFVF9PQkpFQ1RfTUVUSE9EXSkgPT0gMCkgeworCQkJCWNsYXNzSW5kZXggPSBsaXRlcmFsSW5kZXhGb3JKYXZhTGFuZ1JlZmxlY3RGaWVsZCgpOworCQkJCWlmICgobmFtZUFuZFR5cGVJbmRleCA9CisJCQkJCXdlbGxLbm93bk1ldGhvZE5hbWVBbmRUeXBlc1tTRVRfT0JKRUNUX01FVEhPRF9OQU1FX0FORF9UWVBFXSkKKwkJCQkJPT0gMCkgeworCQkJCQlpbnQgbmFtZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9PQkpFQ1RfTUVUSE9EX05BTUUpOworCQkJCQlpbnQgdHlwZUluZGV4ID0gbGl0ZXJhbEluZGV4KFNFVF9PQkpFQ1RfTUVUSE9EX1NJR05BVFVSRSk7CisJCQkJCW5hbWVBbmRUeXBlSW5kZXggPQorCQkJCQkJd2VsbEtub3duTWV0aG9kTmFtZUFuZFR5cGVzW1NFVF9PQkpFQ1RfTUVUSE9EX05BTUVfQU5EX1RZUEVdID0KKwkJCQkJCQljdXJyZW50SW5kZXgrKzsKKwkJCQkJd3JpdGVVMShOYW1lQW5kVHlwZVRhZyk7CisJCQkJCXdyaXRlVTIobmFtZUluZGV4KTsKKwkJCQkJd3JpdGVVMih0eXBlSW5kZXgpOworCQkJCX0KKwkJCQlpbmRleCA9IHdlbGxLbm93bk1ldGhvZHNbU0VUX09CSkVDVF9NRVRIT0RdID0gY3VycmVudEluZGV4Kys7CisJCQkJLy8gV3JpdGUgdGhlIG1ldGhvZCByZWYgY29uc3RhbnQgaW50byB0aGUgY29uc3RhbnQgcG9vbAorCQkJCS8vIEZpcnN0IGFkZCB0aGUgdGFnCisJCQkJd3JpdGVVMShNZXRob2RSZWZUYWcpOworCQkJCS8vIFRoZW4gd3JpdGUgdGhlIGNsYXNzIGluZGV4CisJCQkJd3JpdGVVMihjbGFzc0luZGV4KTsKKwkJCQkvLyBUaGUgd3JpdGUgdGhlIG5hbWVBbmRUeXBlIGluZGV4CisJCQkJd3JpdGVVMihuYW1lQW5kVHlwZUluZGV4KTsKKwkJCX0KKwkJfQorCXJldHVybiBpbmRleDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEVudmlyb25tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2MTlhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqIEFuIGVudmlyb25tZW50IHRoYXQgd3JhcHMgdGhlIGNsaWVudCdzIG5hbWUgZW52aXJvbm1lbnQuCisgKiBUaGlzIHdyYXBwZXIgYWx3YXlzIGNvbnNpZGVycyB0aGUgd3JhcHBlZCBlbnZpcm9ubWVudCB0aGVuIGlmIHRoZSBuYW1lIGlzCisgKiBub3QgZm91bmQsIGl0IHNlYXJjaCBpbiB0aGUgY29kZSBzbmlwcGV0IHN1cHBvcnQuIFRoaXMgaW5jbHVkZXMgdGhlIHN1cGVyIGNsYXNzCisgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQgYXMgd2VsbCBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2RlU25pcHBldEVudmlyb25tZW50IGltcGxlbWVudHMgSU5hbWVFbnZpcm9ubWVudCwgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJSU5hbWVFbnZpcm9ubWVudCBlbnY7CisJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dDsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgKi8KK3B1YmxpYyBDb2RlU25pcHBldEVudmlyb25tZW50KElOYW1lRW52aXJvbm1lbnQgZW52LCBFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJdGhpcy5lbnYgPSBlbnY7CisJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKK30KKy8qKgorICogQHNlZSBJTmFtZUVudmlyb25tZW50I2ZpbmRUeXBlKGNoYXJbXVtdKQorICovCitwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kVHlwZU5hbWUpIHsKKwlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgcmVzdWx0ID0gdGhpcy5lbnYuZmluZFR5cGUoY29tcG91bmRUeXBlTmFtZSk7CisJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZFR5cGVOYW1lLCBST09UX0NPTVBPVU5EX05BTUUpKSB7CisJCUlCaW5hcnlUeXBlIGJpbmFyeSA9IHRoaXMuY29udGV4dC5nZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKTsKKwkJaWYgKGJpbmFyeSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKGJpbmFyeSk7CisJCX0KKwl9CisJVmFyaWFibGVzSW5mbyBpbnN0YWxsZWRWYXJzID0gdGhpcy5jb250ZXh0Lmluc3RhbGxlZFZhcnM7CisJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IGluc3RhbGxlZFZhcnMuY2xhc3NGaWxlczsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRmlsZXMubGVuZ3RoOyBpKyspIHsKKwkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGNsYXNzRmlsZXNbaV07CisJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjb21wb3VuZFR5cGVOYW1lLCBjbGFzc0ZpbGUuZ2V0Q29tcG91bmROYW1lKCkpKSB7CisJCQlDbGFzc0ZpbGVSZWFkZXIgYmluYXJ5ID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJYmluYXJ5ID0gbmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGUuZ2V0Qnl0ZXMoKSwgbnVsbCk7CisJCQl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgY29tcGlsZWQgdGhpcyB0eXBlCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihiaW5hcnkpOworCQl9CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIElOYW1lRW52aXJvbm1lbnQjZmluZFR5cGUoY2hhcltdLCBjaGFyW11bXSkKKyAqLworcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW10gdHlwZU5hbWUsIGNoYXJbXVtdIHBhY2thZ2VOYW1lKSB7CisJTmFtZUVudmlyb25tZW50QW5zd2VyIHJlc3VsdCA9IHRoaXMuZW52LmZpbmRUeXBlKHR5cGVOYW1lLCBwYWNrYWdlTmFtZSk7CisJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCXJldHVybiBmaW5kVHlwZShDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KHBhY2thZ2VOYW1lLCB0eXBlTmFtZSkpOworfQorLyoqCisgKiBAc2VlIElOYW1lRW52aXJvbm1lbnQjaXNQYWNrYWdlKGNoYXJbXVtdLCBjaGFyW10pCisgKi8KK3B1YmxpYyBib29sZWFuIGlzUGFja2FnZShjaGFyW11bXSBwYXJlbnRQYWNrYWdlTmFtZSwgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJcmV0dXJuIHRoaXMuZW52LmlzUGFja2FnZShwYXJlbnRQYWNrYWdlTmFtZSwgcGFja2FnZU5hbWUpOworfQorcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKwl0aGlzLmVudi5jbGVhbnVwKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RXZhbHVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYzRmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogQSBjb2RlIHNuaXBwZXQgZXZhbHVhdG9yIGNvbXBpbGVzIGFuZCByZXR1cm5zIGNsYXNzIGZpbGUgZm9yIGEgY29kZSBzbmlwcGV0LgorICogT3IgaXQgcmVwb3J0cyBwcm9ibGVtcyBhZ2FpbnN0IHRoZSBjb2RlIHNuaXBwZXQuIAorICovCitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRFdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3IgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKKwkvKioKKwkgKiBXaGV0aGVyIHRoZSBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzIHNob3VsZCBiZSBmb3VuZCBpbiB0aGUgcHJvdmlkZWQgbmFtZSBlbnZpcm9ubWVudAorCSAqIG9yIG9uIGRpc2suCisJICovCisJZmluYWwgc3RhdGljIGJvb2xlYW4gREVWRUxPUE1FTlRfTU9ERSA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNvZGUgc25pcHBldCB0byBldmFsdWF0ZS4KKwkgKi8KKwljaGFyW10gY29kZVNuaXBwZXQ7CisKKwkvKioKKwkgKiBUaGUgY29kZSBzbmlwcGV0IHRvIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0IG1hcHBlcgorCSAqLworCUNvZGVTbmlwcGV0VG9DdU1hcHBlciBtYXBwZXI7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IGV2YWx1YXRvci4KKyAqLworQ29kZVNuaXBwZXRFdmFsdWF0b3IoY2hhcltdIGNvZGVTbmlwcGV0LCBFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0LCBJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCBNYXAgb3B0aW9ucywgSVJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgeworCXN1cGVyKGNvbnRleHQsIGVudmlyb25tZW50LCBvcHRpb25zLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsKKwl0aGlzLmNvZGVTbmlwcGV0ID0gY29kZVNuaXBwZXQ7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdG9yCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFkZEV2YWx1YXRpb25SZXN1bHRGb3JDb21waWxhdGlvblByb2JsZW0oTWFwIHJlc3VsdHNCeUlEcywgSVByb2JsZW0gcHJvYmxlbSwgY2hhcltdIGN1U291cmNlKSB7CisJQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IGdldE1hcHBlcigpOworCWludCBwYkxpbmVOdW1iZXIgPSBwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKTsKKwlpbnQgZXZhbHVhdGlvblR5cGUgPSBtYXBwZXIuZ2V0RXZhbHVhdGlvblR5cGUocGJMaW5lTnVtYmVyKTsKKworCWNoYXJbXSBldmFsdWF0aW9uSUQgPSBudWxsOworCXN3aXRjaChldmFsdWF0aW9uVHlwZSkgeworCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9QQUNLQUdFOgorCQkJZXZhbHVhdGlvbklEID0gdGhpcy5jb250ZXh0LnBhY2thZ2VOYW1lOworCQkJCisJCQkvLyBzaGlmdCBsaW5lIG51bWJlciwgc291cmNlIHN0YXJ0IGFuZCBzb3VyY2UgZW5kCisJCQlwcm9ibGVtLnNldFNvdXJjZUxpbmVOdW1iZXIoMSk7CisJCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KDApOworCQkJcHJvYmxlbS5zZXRTb3VyY2VFbmQoZXZhbHVhdGlvbklELmxlbmd0aCAtIDEpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBFdmFsdWF0aW9uUmVzdWx0LlRfSU1QT1JUOgorCQkJZXZhbHVhdGlvbklEID0gbWFwcGVyLmdldEltcG9ydChwYkxpbmVOdW1iZXIpOworCisJCQkvLyBzaGlmdCBsaW5lIG51bWJlciwgc291cmNlIHN0YXJ0IGFuZCBzb3VyY2UgZW5kCisJCQlwcm9ibGVtLnNldFNvdXJjZUxpbmVOdW1iZXIoMSk7CisJCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KDApOworCQkJcHJvYmxlbS5zZXRTb3VyY2VFbmQoZXZhbHVhdGlvbklELmxlbmd0aCAtIDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVUOgorCQkJZXZhbHVhdGlvbklEID0gdGhpcy5jb2RlU25pcHBldDsKKwkJCisJCQkvLyBzaGlmdCBsaW5lIG51bWJlciwgc291cmNlIHN0YXJ0IGFuZCBzb3VyY2UgZW5kCisJCQlwcm9ibGVtLnNldFNvdXJjZUxpbmVOdW1iZXIocGJMaW5lTnVtYmVyIC0gdGhpcy5tYXBwZXIubGluZU51bWJlck9mZnNldCk7CisJCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSAtIHRoaXMubWFwcGVyLnN0YXJ0UG9zT2Zmc2V0KTsKKwkJCXByb2JsZW0uc2V0U291cmNlRW5kKHByb2JsZW0uZ2V0U291cmNlRW5kKCkgLSB0aGlzLm1hcHBlci5zdGFydFBvc09mZnNldCk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9JTlRFUk5BTDoKKwkJCWV2YWx1YXRpb25JRCA9IGN1U291cmNlOworCQkJYnJlYWs7CisJfQorCisJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSAoRXZhbHVhdGlvblJlc3VsdClyZXN1bHRzQnlJRHMuZ2V0KGV2YWx1YXRpb25JRCk7CisJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCXJlc3VsdHNCeUlEcy5wdXQoZXZhbHVhdGlvbklELCBuZXcgRXZhbHVhdGlvblJlc3VsdChldmFsdWF0aW9uSUQsIGV2YWx1YXRpb25UeXBlLCBuZXcgSVByb2JsZW1bXSB7cHJvYmxlbX0pKTsKKwl9IGVsc2UgeworCQlyZXN1bHQuYWRkUHJvYmxlbShwcm9ibGVtKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdG9yCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2V0Q2xhc3NOYW1lKCkgeworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChDT0RFX1NOSVBQRVRfQ0xBU1NfTkFNRV9QUkVGSVgsIEludGVnZXIudG9TdHJpbmcodGhpcy5jb250ZXh0LkNPREVfU05JUFBFVF9DT1VOVEVSICsgMSkudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIEBzZWUgRXZhbHVhdG9yLgorICovCitDb21waWxlciBnZXRDb21waWxlcihJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJQ29tcGlsZXIgY29tcGlsZXIgPSBudWxsOworCWlmICghREVWRUxPUE1FTlRfTU9ERSkgeworCQkvLyBJZiB3ZSBhcmUgbm90IGRldmVsb3BwaW5nIHRoZSBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzLAorCQkvLyB1c2UgYSByZWd1bGFyIGNvbXBpbGVyIGFuZCBmZWVkIGl0cyBsb29rdXAgZW52aXJvbm1lbnQgd2l0aCAKKwkJLy8gdGhlIGNvZGUgc25pcHBldCBzdXBwb3J0IGNsYXNzZXMKKworCQljb21waWxlciA9IAorCQkJbmV3IENvZGVTbmlwcGV0Q29tcGlsZXIoCisJCQkJdGhpcy5lbnZpcm9ubWVudCwgCisJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5leGl0QWZ0ZXJBbGxQcm9ibGVtcygpLCAKKwkJCQl0aGlzLm9wdGlvbnMsIAorCQkJCXJlcXVlc3RvciwgCisJCQkJdGhpcy5wcm9ibGVtRmFjdG9yeSwKKwkJCQl0aGlzLmNvbnRleHQsCisJCQkJZ2V0TWFwcGVyKCkuc3RhcnRQb3NPZmZzZXQsCisJCQkJZ2V0TWFwcGVyKCkuc3RhcnRQb3NPZmZzZXQgKyBjb2RlU25pcHBldC5sZW5ndGggLSAxKTsKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29tcGlsZXIncyBsb29rdXAgZW52aXJvbm1lbnQgd2l0aCB0aGUgYWxyZWFkeSBjb21waWxlZCBzdXBlciBjbGFzc2VzCisJCUlCaW5hcnlUeXBlIGJpbmFyeSA9IHRoaXMuY29udGV4dC5nZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKTsKKwkJaWYgKGJpbmFyeSAhPSBudWxsKSB7CisJCQljb21waWxlci5sb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5KTsKKwkJfQorCQlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnMgPSB0aGlzLmNvbnRleHQuaW5zdGFsbGVkVmFyczsKKwkJaWYgKGluc3RhbGxlZFZhcnMgIT0gbnVsbCkgeworCQkJQ2xhc3NGaWxlW10gZ2xvYmFsQ2xhc3NGaWxlcyA9IGluc3RhbGxlZFZhcnMuY2xhc3NGaWxlczsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2xvYmFsQ2xhc3NGaWxlcy5sZW5ndGg7IGkrKykgeworCQkJCUNsYXNzRmlsZVJlYWRlciBiaW5hcnlUeXBlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQliaW5hcnlUeXBlID0gbmV3IENsYXNzRmlsZVJlYWRlcihnbG9iYWxDbGFzc0ZpbGVzW2ldLmdldEJ5dGVzKCksIG51bGwpOworCQkJCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSB3ZSBjb21waWxlZCB0aGlzIHR5cGUKKwkJCQl9CisJCQkJY29tcGlsZXIubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGJpbmFyeVR5cGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLy8gSWYgd2UgYXJlIGRldmVsb3BwaW5nIHRoZSBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzLAorCQkvLyB1c2UgYSB3cmFwcGVkIGVudmlyb25tZW50IHNvIHRoYXQgaWYgdGhlIGNvZGUgc25pcHBldCBjbGFzc2VzIGFyZSBub3QgZm91bmQKKwkJLy8gdGhlbiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuCisKKwkJY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoCisJCQlnZXRXcmFwcGVyRW52aXJvbm1lbnQoKSwgCisJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksIAorCQkJdGhpcy5vcHRpb25zLCAKKwkJCXJlcXVlc3RvciwgCisJCQl0aGlzLnByb2JsZW1GYWN0b3J5KTsKKwl9CisJcmV0dXJuIGNvbXBpbGVyOworfQorcHJpdmF0ZSBDb2RlU25pcHBldFRvQ3VNYXBwZXIgZ2V0TWFwcGVyKCkgeworCWlmICh0aGlzLm1hcHBlciA9PSBudWxsKSB7CisJCWNoYXJbXSB2YXJDbGFzc05hbWUgPSBudWxsOworCQlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnMgPSB0aGlzLmNvbnRleHQuaW5zdGFsbGVkVmFyczsKKwkJaWYgKGluc3RhbGxlZFZhcnMgIT0gbnVsbCkgeworCQkJY2hhcltdIHN1cGVyUGFja2FnZU5hbWUgPSBpbnN0YWxsZWRWYXJzLnBhY2thZ2VOYW1lOworCQkJaWYgKHN1cGVyUGFja2FnZU5hbWUgIT0gbnVsbCAmJiBzdXBlclBhY2thZ2VOYW1lLmxlbmd0aCAhPSAwKSB7CisJCQkJdmFyQ2xhc3NOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc3VwZXJQYWNrYWdlTmFtZSwgaW5zdGFsbGVkVmFycy5jbGFzc05hbWUsICcuJyk7CisJCQl9IGVsc2UgeworCQkJCXZhckNsYXNzTmFtZSA9IGluc3RhbGxlZFZhcnMuY2xhc3NOYW1lOworCQkJfQorCQkJCisJCX0KKwkJdGhpcy5tYXBwZXIgPSBuZXcgQ29kZVNuaXBwZXRUb0N1TWFwcGVyKAorCQkJdGhpcy5jb2RlU25pcHBldCwgCisJCQl0aGlzLmNvbnRleHQucGFja2FnZU5hbWUsCisJCQl0aGlzLmNvbnRleHQuaW1wb3J0cywKKwkJCWdldENsYXNzTmFtZSgpLAorCQkJdmFyQ2xhc3NOYW1lLAorCQkJdGhpcy5jb250ZXh0LmxvY2FsVmFyaWFibGVOYW1lcywgCisJCQl0aGlzLmNvbnRleHQubG9jYWxWYXJpYWJsZVR5cGVOYW1lcywgCisJCQl0aGlzLmNvbnRleHQubG9jYWxWYXJpYWJsZU1vZGlmaWVycywgCisJCQl0aGlzLmNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWUJCQkKKwkJKTsKKworCX0KKwlyZXR1cm4gdGhpcy5tYXBwZXI7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdG9yCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2V0U291cmNlKCkgeworCXJldHVybiBnZXRNYXBwZXIoKS5jdVNvdXJjZTsKK30KKy8qKgorICogUmV0dXJucyBhbiBlbnZpcm9ubWVudCB0aGF0IHdyYXBzIHRoZSBjbGllbnQncyBuYW1lIGVudmlyb25tZW50LgorICogVGhpcyB3cmFwcGVyIGFsd2F5cyBjb25zaWRlcnMgdGhlIHdyYXBwZWQgZW52aXJvbm1lbnQgdGhlbiBpZiB0aGUgbmFtZSBpcworICogbm90IGZvdW5kLCBpdCBzZWFyY2ggaW4gdGhlIGNvZGUgc25pcHBldCBzdXBwb3J0LiBUaGlzIGluY2x1ZGVzIHRoZSBzdXBlcmNsYXNzCisgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQgYXMgd2VsbCBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzZXMuCisgKi8KK3ByaXZhdGUgSU5hbWVFbnZpcm9ubWVudCBnZXRXcmFwcGVyRW52aXJvbm1lbnQoKSB7CisJcmV0dXJuIG5ldyBDb2RlU25pcHBldEVudmlyb25tZW50KHRoaXMuZW52aXJvbm1lbnQsIHRoaXMuY29udGV4dCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODgzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisgCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcG91bmRBc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW50TGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRoaXNSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZSBleHRlbmRzIEZpZWxkUmVmZXJlbmNlIGltcGxlbWVudHMgUHJvYmxlbVJlYXNvbnMsIEV2YWx1YXRpb25Db25zdGFudHMgeworCisJRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQ7CisJRmllbGRCaW5kaW5nIGRlbGVnYXRlVGhpczsKKy8qKgorICogQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQHBhcmFtIHNvdXJjZSBjaGFyW10KKyAqIEBwYXJhbSBwb3MgbG9uZworICovCitwdWJsaWMgQ29kZVNuaXBwZXRGaWVsZFJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcywgRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQpIHsKKwlzdXBlcihzb3VyY2UsIHBvcyk7CisJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCA9IGV2YWx1YXRpb25Db250ZXh0OworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIXRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CisJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCB0aGlzLmNvZGVnZW5CaW5kaW5nLCBudWxsLCB2YWx1ZVJlcXVpcmVkKTsKKwl9IGVsc2UgeworCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIXRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSk7CisJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpIHsgLy8gbmVlZCBhIHJlY2VpdmVyPworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQl9CisJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQl9CisJCX0KKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCX0KKwlpZiAodmFsdWVSZXF1aXJlZCl7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCX0KK30KKy8qKgorICogRmllbGQgcmVmZXJlbmNlIGNvZGUgZ2VuZXJhdGlvbgorICoKKyAqIEBwYXJhbSBjdXJyZW50U2NvcGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKiBAcGFyYW0gY29kZVN0cmVhbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtCisgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfQorCX0gZWxzZSB7CisJCWJvb2xlYW4gaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCk7CisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQgJiYgKCFpc1N0YXRpYykgJiYgKHRoaXMuY29kZWdlbkJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7IC8vIGFycmF5IGxlbmd0aAorCQkJCQljb2RlU3RyZWFtLmFycmF5bGVuZ3RoKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJCQlpZiAoaXNTdGF0aWMpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChpc1N0YXRpYykgeworCQkJCQkJCS8vIHdlIG5lZWQgYSBudWxsIG9uIHRoZSBzdGFjayB0byB1c2UgdGhlIHJlZmxlY3QgZW11bGF0aW9uCisJCQkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJCQkJfQorCQkJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCX0KKwkJCQl9CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb2RlZ2VuQmluZGluZy5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0KKwkJfQorCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkKKwlib29sZWFuIGlzU3RhdGljOworCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhKGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpKSk7CisJCWlmIChpc1N0YXRpYykgeworCQkJY29kZVN0cmVhbS5nZXRzdGF0aWModGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCX0gZWxzZSB7CisJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJY29kZVN0cmVhbS5nZXRmaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJfQorCQlpbnQgb3BlcmF0aW9uVHlwZUlEOworCQlpZiAoKG9wZXJhdGlvblR5cGVJRCA9IGltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX1N0cmluZykgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0FwcGVuZChjdXJyZW50U2NvcGUsIG51bGwsIGV4cHJlc3Npb24pOworCQl9IGVsc2UgeworCQkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOworCQkJLy8gZ2VuZXJhdGUgdGhlIGluY3JlbWVudCB2YWx1ZSAod2lsbCBieSBpdHNlbGYgIGJlIHByb21vdGVkIHRvIHRoZSBvcGVyYXRpb24gdmFsdWUpCisJCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSl7IC8vIHByZWZpeCBvcGVyYXRpb24KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsJCQkKKwkJCX0gZWxzZSB7CisJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0JCQorCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgdGhpcy5jb2RlZ2VuQmluZGluZywgbnVsbCwgdmFsdWVSZXF1aXJlZCk7CisJfSBlbHNlIHsKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIShpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOworCQlpZiAoaXNTdGF0aWMpIHsKKwkJCS8vIHVzZWQgdG8gc3RvcmUgdGhlIHZhbHVlCisJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKworCQkJLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHZhbHVlCisJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZCh0aGlzLmNvZGVnZW5CaW5kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHVzZWQgdG8gc3RvcmUgdGhlIHZhbHVlCisJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChiaW5kaW5nKTsKKwkJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICEoaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKTsKKworCQkJLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHZhbHVlCisJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCQkJCQkJCisJCX0KKwkJaW50IG9wZXJhdGlvblR5cGVJRDsKKwkJaWYgKChvcGVyYXRpb25UeXBlSUQgPSBpbXBsaWNpdENvbnZlcnNpb24gPj4gNCkgPT0gVF9TdHJpbmcpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTdHJpbmdBcHBlbmQoY3VycmVudFNjb3BlLCBudWxsLCBleHByZXNzaW9uKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHByb21vdGUgdGhlIGFycmF5IHJlZmVyZW5jZSB0byB0aGUgc3VpdGFibGUgb3BlcmF0aW9uIHR5cGUKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQkJaWYgKGV4cHJlc3Npb24gPT0gSW50TGl0ZXJhbC5PbmUpeyAvLyBwcmVmaXggb3BlcmF0aW9uCisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CQkJCisJCQl9IGVsc2UgeworCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9CQkKKwkJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3Iob3BlcmF0b3IsIG9wZXJhdGlvblR5cGVJRCk7CisJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJfQorCQkvLyBjdXJyZW50IHN0YWNrIGlzOgorCQkvLyBmaWVsZCByZWNlaXZlciB2YWx1ZQorCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8ICh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQljb2RlU3RyZWFtLmR1cDJfeDIoKTsKKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKKwkJCX0KKwkJfQorCQkvLyBjdXJyZW50IHN0YWNrIGlzOgorCQkvLyB2YWx1ZSBmaWVsZCByZWNlaXZlciB2YWx1ZQkJCQkKKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJYm9vbGVhbiBpc1N0YXRpYzsKKwlpZiAodGhpcy5jb2RlZ2VuQmluZGluZy5jYW5CZVNlZW5CeShyZWNlaXZlclR5cGUsIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIShpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkpOworCQlpZiAoaXNTdGF0aWMpIHsKKwkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCX0KKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmIChpc1N0YXRpYykgeworCQkJCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KKwkJCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihwb3N0SW5jcmVtZW50Lm9wZXJhdG9yLCB0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUuaWQpOworCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQuYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7CisJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgdGhpcy5jb2RlZ2VuQmluZGluZywgbnVsbCwgZmFsc2UpOworCX0gZWxzZSB7CisJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICEoaXNTdGF0aWMgPSB0aGlzLmNvZGVnZW5CaW5kaW5nLmlzU3RhdGljKCkpKTsKKwkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQl9CisJCS8vIHRoZSBhY3R1YWwgc3RhY2sgaXM6IHJlY2VpdmVyCisJCWNvZGVTdHJlYW0uZHVwKCk7CisJCS8vIHRoZSBhY3R1YWwgc3RhY2sgaXM6IHJlY2VpdmVyIHJlY2VpdmVyCisJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKHRoaXMuY29kZWdlbkJpbmRpbmcpOworCQkvLyB0aGUgYWN0dWFsIHN0YWNrIGlzOiByZWNlaXZlciB2YWx1ZQorCQkvLyByZWNlaXZlciB2YWx1ZQorCQkvLyB2YWx1ZSByZWNlaXZlciB2YWx1ZSAJCQkJCQkJZHVwX3gxIG9yIGR1cDJfeDEgaWYgdmFsdWUgcmVxdWlyZWQKKwkJLy8gdmFsdWUgdmFsdWUgcmVjZWl2ZXIgdmFsdWUJCQkJCQlkdXBfeDEgb3IgZHVwMl94MQorCQkvLyB2YWx1ZSB2YWx1ZSByZWNlaXZlcgkJCQkJCQkJcG9wIG9yIHBvcDIKKwkJLy8gdmFsdWUgdmFsdWUgcmVjZWl2ZXIgZmllbGQJCQkJCQlnZW5lcmF0ZUVtdWxhdGlvbkZvckZpZWxkCisJCS8vIHZhbHVlIHZhbHVlIGZpZWxkIHJlY2VpdmVyIAkJCQkJCXN3YXAKKwkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUgZmllbGQgcmVjZWl2ZXIgCQlkdXAyX3gxIG9yIGR1cDJfeDIKKwkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUgCQkJCSAJCXBvcDIKKwkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgbmV3dmFsdWUgCQkJCSAJZ2VuZXJhdGUgY29uc3RhbnQgKyBvcAorCQkvLyB2YWx1ZSAJCQkJCQkJCQkJCXN0b3JlCisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKHRoaXMuY29kZWdlbkJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJfQorCQl9CisJCWlmICgodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAodGhpcy5jb2RlZ2VuQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQljb2RlU3RyZWFtLmR1cDJfeDEoKTsKKwkJCWNvZGVTdHJlYW0ucG9wMigpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXBfeDEoKTsKKwkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCX0KKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJCWNvZGVTdHJlYW0uc3dhcCgpOworCQkKKwkJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8ICh0aGlzLmNvZGVnZW5CaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCWNvZGVTdHJlYW0uZHVwMl94MigpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXAyX3gxKCk7CisJCX0KKwkJY29kZVN0cmVhbS5wb3AyKCk7CisKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KHBvc3RJbmNyZW1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgdGhpcy5jb2RlZ2VuQmluZGluZy50eXBlLmlkKTsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihwb3N0SW5jcmVtZW50LmFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRlZFdyaXRlQWNjZXNzRm9yRmllbGQodGhpcy5jb2RlZ2VuQmluZGluZyk7CisJfQorfQorLyoKKyAqIE5vIG5lZWQgdG8gZW11bGF0ZSBhY2Nlc3MgdG8gcHJvdGVjdGVkIGZpZWxkcyBzaW5jZSBub3QgaW1wbGljaXRseSBhY2Nlc3NlZAorICovCitwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpeworCS8vIFRoZSBwcml2YXRlIGFjY2VzcyB3aWxsIGJlIG1hbmFnZWQgdGhyb3VnaCB0aGUgY29kZSBnZW5lcmF0aW9uCisKKwkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KKwkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZworCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5yZWNlaXZlclR5cGUKKwkJJiYgIXRoaXMucmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKKwkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsIC8vIGFycmF5Lmxlbmd0aAorCQkmJiBiaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAorCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KSAvL25vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcyAoaW4gY2FzZSB0aGVyZSB3YXMpCisJCQl8fCAhYmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSl7CisJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkRmllbGRCaW5kaW5nKGJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlY2VpdmVyVHlwZSk7CisJfQorfQorLyoKKyAqIE5vIG5lZWQgdG8gZW11bGF0ZSBhY2Nlc3MgdG8gcHJvdGVjdGVkIGZpZWxkcyBzaW5jZSBub3QgaW1wbGljaXRseSBhY2Nlc3NlZAorICovCitwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNXcml0ZUFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKXsKKwkvLyBUaGUgcHJpdmF0ZSBhY2Nlc3Mgd2lsbCBiZSBtYW5hZ2VkIHRocm91Z2ggdGhlIGNvZGUgZ2VuZXJhdGlvbgorCisJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMucmVjZWl2ZXJUeXBlCisJCSYmICF0aGlzLnJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCisJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKKwkJJiYgYmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80CisJCQkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkgLy9ubyBjaGFuZ2UgZm9yIE9iamVjdCBmaWVsZHMgKGluIGNhc2UgdGhlcmUgd2FzKQorCQkJfHwgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpeworCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhiaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZWNlaXZlclR5cGUpOworCX0KK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gQW5zd2VyIHRoZSBzaWduYXR1cmUgdHlwZSBvZiB0aGUgZmllbGQuCisJLy8gY29uc3RhbnRzIGFyZSBwcm9wYWdlZCB3aGVuIHRoZSBmaWVsZCBpcyBmaW5hbAorCS8vIGFuZCBpbml0aWFsaXplZCB3aXRoIGEgKGNvbXBpbGUgdGltZSkgY29uc3RhbnQgCisKKwkvLyByZWd1bGFyIHJlY2VpdmVyIHJlZmVyZW5jZSAKKwlyZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7CisJaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKXsKKwkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCXJldHVybiBudWxsOworCX0KKwkvLyB0aGUgY2FzZSByZWNlaXZlclR5cGUuaXNBcnJheVR5cGUgYW5kIHRva2VuID0gJ2xlbmd0aCcgaXMgaGFuZGxlZCBieSB0aGUgc2NvcGUgQVBJCisJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IHNjb3BlLmdldEZpZWxkKHJlY2VpdmVyVHlwZSwgdG9rZW4sIHRoaXMpOworCUZpZWxkQmluZGluZyBmaXJzdEF0dGVtcHQgPSBiaW5kaW5nOworCWJvb2xlYW4gaXNOb3RWaXNpYmxlID0gZmFsc2U7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nCisJCQkmJiAoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpIHsKKwkJCQlpc05vdFZpc2libGUgPSB0cnVlOworCQkJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lICE9IG51bGwpIHsKKwkJCQkJZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKKwkJCQkJaWYgKGRlbGVnYXRlVGhpcyA9PSBudWxsKXsgOyAvLyBpZiBub3QgZm91bmQgdGhlbiBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAorCQkJCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgcmVjZWl2ZXJUeXBlKTsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCByZWNlaXZlclR5cGUpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CisJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KGRlbGVnYXRlVGhpcy50eXBlLCB0b2tlbiwgdGhpcyk7CisJCX0KKwl9CisKKwlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJaWYgKGlzTm90VmlzaWJsZSkgeworCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IGZpcnN0QXR0ZW1wdDsKKwkJfQorCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRmllbGQodGhpcywgcmVjZWl2ZXJUeXBlKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGJpbmRpbmcsIHRoaXMpOworCisJLy8gY2hlY2sgZm9yIHRoaXMueCBpbiBzdGF0aWMgaXMgZG9uZSBpbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVjZWl2ZXIKKwljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGJpbmRpbmcsIHJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0LCB0aGlzLCBzY29wZSwgMCk7CisJaWYgKCFyZWNlaXZlci5pc1RoaXMoKSkKKwkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisKKwlyZXR1cm4gYmluZGluZy50eXBlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldE1lc3NhZ2VTZW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0TWVzc2FnZVNlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI0YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldE1lc3NhZ2VTZW5kLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXNzYWdlU2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbU1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0TWVzc2FnZVNlbmQgZXh0ZW5kcyBNZXNzYWdlU2VuZCBpbXBsZW1lbnRzIFByb2JsZW1SZWFzb25zLCBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKKwlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKKwlGaWVsZEJpbmRpbmcgZGVsZWdhdGVUaGlzOworLyoqCisgKiBDb2RlU25pcHBldE1lc3NhZ2VTZW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBDb2RlU25pcHBldE1lc3NhZ2VTZW5kKEV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0KSB7CisJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCA9IGV2YWx1YXRpb25Db250ZXh0OworfQorLyoqCisgKiBNZXNzYWdlU2VuZCBjb2RlIGdlbmVyYXRpb24KKyAqCisgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQorICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgorICovCitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoCisJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAorCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKworCWlmIChiaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkvLyBnZW5lcmF0ZSByZWNlaXZlci9lbmNsb3NpbmcgaW5zdGFuY2UgYWNjZXNzCisJCWJvb2xlYW4gaXNTdGF0aWMgPSBiaW5kaW5nLmlzU3RhdGljKCk7CisJCS8vIG91dGVyIGFjY2VzcyA/CisJCWlmICghaXNTdGF0aWMgJiYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSkgeworCQkJLy8gb3V0ZXIgbWV0aG9kIGNhbiBiZSByZWFjaGVkIHRocm91Z2ggZW11bGF0aW9uCisJCQlPYmplY3RbXSBwYXRoID0KKwkJCQljdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKAorCQkJCQljdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgKKwkJCQkJCShiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7CisJCQlpZiAocGF0aCA9PSBudWxsKSB7CisJCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCisJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJfSBlbHNlIHsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sICFpc1N0YXRpYyk7CisJCX0KKwkJLy8gZ2VuZXJhdGUgYXJndW1lbnRzCisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0KKwkJfQorCQkvLyBhY3R1YWwgbWVzc2FnZSBpbnZvY2F0aW9uCisJCWlmIChpc1N0YXRpYykgeworCQkJY29kZVN0cmVhbS5pbnZva2VzdGF0aWMoYmluZGluZyk7CisJCX0gZWxzZSB7CisJCQlpZiAocmVjZWl2ZXIuaXNTdXBlcigpKSB7CisJCQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKGJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tlaW50ZXJmYWNlKGJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tldmlydHVhbChiaW5kaW5nKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JNZXRob2QoY3VycmVudFNjb3BlLCBiaW5kaW5nKTsKKwkJLy8gZ2VuZXJhdGUgcmVjZWl2ZXIvZW5jbG9zaW5nIGluc3RhbmNlIGFjY2VzcworCQlib29sZWFuIGlzU3RhdGljID0gYmluZGluZy5pc1N0YXRpYygpOworCQkvLyBvdXRlciBhY2Nlc3MgPworCQlpZiAoIWlzU3RhdGljICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkpIHsKKwkJCS8vIG5vdCBzdXBwb3J0ZWQgeWV0CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOworCQl9CisJCWlmIChpc1N0YXRpYykgeworCQkJLy8gd2UgbmVlZCBhbiBvYmplY3Qgb24gdGhlIHN0YWNrIHdoaWNoIGlzIGlnbm9yZWQgZm9yIHRoZSBtZXRob2QgaW52b2NhdGlvbgorCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQl9CisJCS8vIGdlbmVyYXRlIGFyZ3VtZW50cworCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoYXJnc0xlbmd0aCk7CisJCQljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZSwgbmV3IEFycmF5QmluZGluZyhjdXJyZW50U2NvcGUuZ2V0VHlwZShUeXBlQmluZGluZy5KQVZBX0xBTkdfT0JKRUNUKSwgMSkpOworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnc0xlbmd0aDsgaSsrKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShpKTsKKwkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJVHlwZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA9IGJpbmRpbmcucGFyYW1ldGVyc1tpXTsKKwkJCQlpZiAocGFyYW1ldGVyQmluZGluZy5pc0Jhc2VUeXBlKCkgJiYgcGFyYW1ldGVyQmluZGluZyAhPSBOdWxsQmluZGluZykgeworCQkJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSljb2RlU3RyZWFtKS5nZW5lcmF0ZU9iamVjdFdyYXBwZXJGb3JUeXBlKGJpbmRpbmcucGFyYW1ldGVyc1tpXSk7CisJCQkJfQorCQkJCWNvZGVTdHJlYW0uYWFzdG9yZSgpOworCQkJCWlmIChpIDwgYXJnc0xlbmd0aCAtIDEpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQl9CQorCQkJfQorCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSgwKTsKKwkJCWNvZGVTdHJlYW0ubmV3QXJyYXkoY3VycmVudFNjb3BlLCBuZXcgQXJyYXlCaW5kaW5nKGN1cnJlbnRTY29wZS5nZXRUeXBlKFR5cGVCaW5kaW5nLkpBVkFfTEFOR19PQkpFQ1QpLCAxKSk7CQkJCisJCX0KKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmludm9rZUphdmFMYW5nUmVmbGVjdE1ldGhvZEludm9rZSgpOworCisJCS8vIGNvbnZlcnQgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBmb3IgcHJpbWl0aXZlIHR5cGVzCisJCWlmIChiaW5kaW5nLnJldHVyblR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCQlpbnQgdHlwZUlEID0gYmluZGluZy5yZXR1cm5UeXBlLmlkOworCQkJaWYgKHR5cGVJRCA9PSBUX3ZvaWQpIHsKKwkJCQkvLyByZW1vdmUgdGhlIG51bGwgZnJvbSB0aGUgc3RhY2sKKwkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJfQorCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmNoZWNrY2FzdCh0eXBlSUQpOworCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdldEJhc2VUeXBlVmFsdWUodHlwZUlEKTsKKwkJfSBlbHNlIHsKKwkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KGJpbmRpbmcucmV0dXJuVHlwZSk7CisJCX0KKwl9CisJLy8gb3BlcmF0aW9uIG9uIHRoZSByZXR1cm5lZCB2YWx1ZQorCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCS8vIGltcGxpY2l0IGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwl9IGVsc2UgeworCQkvLyBwb3AgcmV0dXJuIHZhbHVlIGlmIGFueQorCQlzd2l0Y2ggKGJpbmRpbmcucmV0dXJuVHlwZS5pZCkgeworCQkJY2FzZSBUX2xvbmcgOgorCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJY29kZVN0cmVhbS5wb3AyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRfdm9pZCA6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQljb2RlU3RyZWFtLnBvcCgpOworCQl9CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7Cit9CitwdWJsaWMgdm9pZCBtYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgeworCisJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKKwkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4JCisJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5xdWFsaWZ5aW5nVHlwZQorCQkmJiAhdGhpcy5xdWFsaWZ5aW5nVHlwZS5pc0FycmF5VHlwZSgpCisJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCSYmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCB8fCAhYmluZGluZy5pc1N0YXRpYygpKQorCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IG1ldGhvZHMKKwkJCXx8ICFiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKSB7CisJCWNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkTWV0aG9kQmluZGluZyhiaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5xdWFsaWZ5aW5nVHlwZSk7CisJfQkKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gQW5zd2VyIHRoZSBzaWduYXR1cmUgcmV0dXJuIHR5cGUKKwkvLyBCYXNlIHR5cGUgcHJvbW90aW9uCisKKwljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwl0aGlzLnF1YWxpZnlpbmdUeXBlID0gdGhpcy5yZWNlaXZlclR5cGUgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7IAorCS8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKKwlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBOb1BhcmFtZXRlcnM7CisJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWJvb2xlYW4gYXJnSGFzRXJyb3IgPSBmYWxzZTsgLy8gdHlwZUNoZWNrcyBhbGwgYXJndW1lbnRzIAorCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJYXJndW1lbnRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tsZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKKwkJCQlhcmdIYXNFcnJvciA9IHRydWU7CisJCWlmIChhcmdIYXNFcnJvcikKKwkJCXJldHVybiBudWxsOworCX0KKwlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwpIAorCQlyZXR1cm4gbnVsbDsKKworCS8vIGJhc2UgdHlwZSBjYW5ub3QgcmVjZWl2ZSBhbnkgbWVzc2FnZQorCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yTm9NZXRob2RGb3IodGhpcywgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJYmluZGluZyA9IAorCQlyZWNlaXZlciA9PSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdAorCQkJPyBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgdGhpcykKKwkJCTogc2NvcGUuZ2V0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOyAKKwlpZiAoIWJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1NZXRob2RCaW5kaW5nCisJCQkmJiAoKFByb2JsZW1NZXRob2RCaW5kaW5nKSBiaW5kaW5nKS5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlKSB7CisJCQlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5kZWNsYXJpbmdUeXBlTmFtZSAhPSBudWxsKSB7CisJCQkJZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKKwkJCQlpZiAoZGVsZWdhdGVUaGlzID09IG51bGwpeyA7IC8vIGlmIG5vdCBmb3VuZCB0aGVuIGludGVybmFsIGVycm9yLCBmaWVsZCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kCisJCQkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkTWV0aG9kKHRoaXMsIGJpbmRpbmcpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRNZXRob2QodGhpcywgYmluZGluZyk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CQkJCisJCQlNZXRob2RCaW5kaW5nIHByaXZhdGVCaW5kaW5nID0gCisJCQkJcmVjZWl2ZXIgaW5zdGFuY2VvZiBDb2RlU25pcHBldFRoaXNSZWZlcmVuY2UgJiYgKChDb2RlU25pcHBldFRoaXNSZWZlcmVuY2UpIHJlY2VpdmVyKS5pc0ltcGxpY2l0CisJCQkJCT8gbG9jYWxTY29wZS5nZXRJbXBsaWNpdE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZylkZWxlZ2F0ZVRoaXMudHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpCisJCQkJCTogbG9jYWxTY29wZS5nZXRNZXRob2QoZGVsZWdhdGVUaGlzLnR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsgCisJCQlpZiAoIXByaXZhdGVCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CisJCQkJCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwkJCQkJfSBlbHNlIHsgLy8gcmVhbGx5IGJhZCBlcnJvciAuLi4uCisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvck5vTWV0aG9kRm9yKHRoaXMsIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcyk7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkTWV0aG9kKHRoaXMsIGJpbmRpbmcpOworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQliaW5kaW5nID0gcHJpdmF0ZUJpbmRpbmc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKSB7CisJCQkJaWYgKHJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CisJCQkJfSBlbHNlIHsgLy8gcmVhbGx5IGJhZCBlcnJvciAuLi4uCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yTm9NZXRob2RGb3IodGhpcywgcmVjZWl2ZXJUeXBlLCBhcmd1bWVudFR5cGVzKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE1ldGhvZCh0aGlzLCBiaW5kaW5nKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCWlmICghYmluZGluZy5pc1N0YXRpYygpKSB7CisJCS8vIHRoZSAicmVjZWl2ZXIiIG11c3Qgbm90IGJlIGEgdHlwZSwgaS5lLiBhIE5hbWVSZWZlcmVuY2UgdGhhdCB0aGUgVEMgaGFzIGJvdW5kIHRvIGEgVHlwZQorCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7CisJCQlpZiAoKCgoTmFtZVJlZmVyZW5jZSkgcmVjZWl2ZXIpLmJpdHMgJiBCaW5kaW5nSWRzLlRZUEUpICE9IDApIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tdXN0VXNlQVN0YXRpY01ldGhvZCh0aGlzLCBiaW5kaW5nKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYXJndW1lbnRzICE9IG51bGwpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQorCQkJYXJndW1lbnRzW2ldLmltcGxpY2l0V2lkZW5pbmcoYmluZGluZy5wYXJhbWV0ZXJzW2ldLCBhcmd1bWVudFR5cGVzW2ldKTsKKworCS8vLS0tLS0tLW1lc3NhZ2Ugc2VuZCB0aGF0IGFyZSBrbm93biB0byBmYWlsIGF0IGNvbXBpbGUgdGltZS0tLS0tLS0tLS0tCisJaWYgKGJpbmRpbmcuaXNBYnN0cmFjdCgpKSB7CisJCWlmIChyZWNlaXZlci5pc1N1cGVyKCkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdERpcmVjbHlJbnZva2VBYnN0cmFjdE1ldGhvZCh0aGlzLCBiaW5kaW5nKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGFic3RyYWN0IHByaXZhdGUgbWV0aG9kcyBjYW5ub3Qgb2NjdXIgbm9yIGFic3RyYWN0IHN0YXRpYy4uLi4uLi4uLi4uLgorCX0KKwlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZE1ldGhvZChiaW5kaW5nLCB0aGlzKTsKKworCXJldHVybiBiaW5kaW5nLnJldHVyblR5cGU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3OGUxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDY4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworCisvKioKKyAqIEEgcGFyc2VyIGZvciBjb2RlIHNuaXBwZXRzLgorICovCitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKKwlpbnQgY29kZVNuaXBwZXRTdGFydCwgY29kZVNuaXBwZXRFbmQ7CisJYm9vbGVhbiBoYXNSZWNvdmVyZWRPbkV4cHJlc3Npb247CisJaW50IHByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5ID0gMDsKKwlpbnQgbGFzdFN0YXRlbWVudCA9IC0xOyAvLyBlbmQgb2YgbGFzdCB0b3AgbGV2ZWwgc3RhdGVtZW50CisKKwlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dDsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb2RlIHNuaXBwZXQgcGFyc2VyLgorICovCitwdWJsaWMgQ29kZVNuaXBwZXRQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQsIGJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscywgYm9vbGVhbiBhc3NlcnRNb2RlLCBpbnQgY29kZVNuaXBwZXRTdGFydCwgaW50IGNvZGVTbmlwcGV0RW5kKSB7CisJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLCBhc3NlcnRNb2RlKTsKKwl0aGlzLmNvZGVTbmlwcGV0U3RhcnQgPSBjb2RlU25pcHBldFN0YXJ0OworCXRoaXMuY29kZVNuaXBwZXRFbmQgPSBjb2RlU25pcHBldEVuZDsKKwl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBjbGFzc0luc3RhbmNlQ3JlYXRpb24oYm9vbGVhbiBhbHdheXNRdWFsaWZpZWQpIHsKKwkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0CisKKwkvLyBDbGFzc0JvZHlvcHQgcHJvZHVjZXMgYSBudWxsIGl0ZW0gb24gdGhlIGFzdFN0YWsgaWYgaXQgcHJvZHVjZXMgTk8gY2xhc3MgYm9keQorCS8vIEFuIGVtcHR5IGNsYXNzIGJvZHkgcHJvZHVjZXMgYSAwIG9uIHRoZSBsZW5ndGggc3RhY2suLi4uLgorCisJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2M7CisJaW50IGxlbmd0aDsKKwlpZiAoKChsZW5ndGggPSBhc3RMZW5ndGhTdGFja1thc3RMZW5ndGhQdHItLV0pID09IDEpCisJCSYmIChhc3RTdGFja1thc3RQdHJdID09IG51bGwpKSB7CisJCS8vTk8gQ2xhc3NCb2R5CisJCWFzdFB0ci0tOworCQlpZiAoYWx3YXlzUXVhbGlmaWVkKSB7CisJCQlhbGxvYyA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQl9IGVsc2UgeworCQkJYWxsb2MgPSBuZXcgQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbihldmFsdWF0aW9uQ29udGV4dCk7CisJCX0KKwkJYWxsb2Muc291cmNlRW5kID0gZW5kUG9zaXRpb247IC8vdGhlIHBvc2l0aW9uIGhhcyBiZWVuIHN0b3JlZCBleHBsaWNpdGx5CisKKwkJaWYgKChsZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0tXSkgIT0gMCkgeworCQkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWV4cHJlc3Npb25TdGFjaywgCisJCQkJZXhwcmVzc2lvblB0ciArIDEsIAorCQkJCWFsbG9jLmFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF0sIAorCQkJCTAsIAorCQkJCWxlbmd0aCk7IAorCQl9CisJCWFsbG9jLnR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOworCQkvL3RoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50CisJCS8vd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCBieSB0aGUgVEMgKHNlZSBjcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcldpdGhCaW5kaW5nKQorCQlhbGxvYy5zb3VyY2VTdGFydCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFsbG9jKTsKKwl9IGVsc2UgeworCQlkaXNwYXRjaERlY2xhcmF0aW9uSW50byhsZW5ndGgpOworCQlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24gPSAoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIGFzdFN0YWNrW2FzdFB0cl07CisJCWFub255bW91c1R5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IGVuZFN0YXRlbWVudFBvc2l0aW9uOworCQlpZiAoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24gIT0gbnVsbCkgeworCQkJYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uLmFsbG9jYXRpb24uc291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247CisJCX0JCQorCQlhc3RQdHItLTsKKwkJYXN0TGVuZ3RoUHRyLS07CisKKwkJLy8gbWFyayBmaWVsZHMgYW5kIGluaXRpYWxpemVyIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAorCQltYXJrRmllbGRzV2l0aExvY2FsVHlwZShhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24pOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCkgeworCXN1cGVyLmNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlck5hbWUoKSB7CisJLy8gQ2xhc3NIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgJ2NsYXNzJyAnSWRlbnRpZmllcicKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w7CisJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSA9PSAwKSB7CisJCWlmIChuZXN0ZWRUeXBlICE9IDApIHsKKwkJCXR5cGVEZWNsID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlRGVjbCA9IG5ldyBDb2RlU25pcHBldFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCisJCXR5cGVEZWNsID0gbmV3IExvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJCWJsb2NrUmVhbCgpOworCX0KKworCS8vaGlnaGxpZ2h0IHRoZSBuYW1lIG9mIHRoZSB0eXBlCisJbG9uZyBwb3MgPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXTsKKwl0eXBlRGVjbC5zb3VyY2VFbmQgPSAoaW50KSBwb3M7CisJdHlwZURlY2wuc291cmNlU3RhcnQgPSAoaW50KSAocG9zID4+PiAzMik7CisJdHlwZURlY2wubmFtZSA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyLS1dOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKworCS8vY29tcHV0ZSB0aGUgZGVjbGFyYXRpb24gc291cmNlIHRvbworCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07IAorCWludFB0ci0tOworCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggYW4gaW50IHBvc2l0aW9uCisJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCWlmICh0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwKSB7CisJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9CisJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc291cmNlRW5kICsgMTsKKwlwdXNoT25Bc3RTdGFjayh0eXBlRGVjbCk7CisKKwlsaXN0TGVuZ3RoID0gMDsgLy8gd2lsbCBiZSB1cGRhdGVkIHdoZW4gcmVhZGluZyBzdXBlci1pbnRlcmZhY2VzCisJLy8gcmVjb3ZlcnkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7IAorCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGVEZWNsLmJvZHlTdGFydDsKKwkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQodHlwZURlY2wsIDApOworCQlsYXN0SWdub3JlZFRva2VuID0gLTE7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5U3RhdGVtZW50KCkgeworCXN1cGVyLmNvbnN1bWVFbXB0eVN0YXRlbWVudCgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpIHsKKwlzdXBlci5jb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRmllbGRBY2Nlc3MoYm9vbGVhbiBpc1N1cGVyQWNjZXNzKSB7CisJLy8gRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJworCS8vIEZpZWxkQWNjZXNzIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicKKworCUZpZWxkUmVmZXJlbmNlIGZyID0KKwkJbmV3IENvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UoCisJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sCisJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dLAorCQkJZXZhbHVhdGlvbkNvbnRleHQpOworCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwlpZiAoaXNTdXBlckFjY2VzcykgeworCQkvL2NvbnNpZGVyYXRlcyB0aGUgZmllbGRSZWZlcmVuY2UgYmVnaW5uaW5nIGF0IHRoZSAnc3VwZXInIC4uLi4JCisJCWZyLnNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCQlwcm9ibGVtUmVwb3J0ZXIoKS5jb2RlU25pcHBldE1pc3NpbmdDbGFzcyhudWxsLDAsIDApOworCQlmci5yZWNlaXZlciA9IG5ldyBDb2RlU25pcHBldFN1cGVyUmVmZXJlbmNlKGZyLnNvdXJjZVN0YXJ0LCBlbmRQb3NpdGlvbiwgZXZhbHVhdGlvbkNvbnRleHQpOworCQlwdXNoT25FeHByZXNzaW9uU3RhY2soZnIpOworCX0gZWxzZSB7CisJCS8vb3B0aW1pemUgcHVzaC9wb3AKKwkJaWYgKChmci5yZWNlaXZlciA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSkuaXNUaGlzKCkpIHsKKwkJCS8vZmllbGRyZWZlcmVuY2UgYmVnaW5zIGF0IHRoZSB0aGlzCisJCQlmci5zb3VyY2VTdGFydCA9IGZyLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OworCQl9CisJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGZyOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCkgeworCS8vIEludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicKKwlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w7CisJaWYgKG5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXSA9PSAwKSB7CisJCWlmIChuZXN0ZWRUeXBlICE9IDApIHsKKwkJCXR5cGVEZWNsID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlRGVjbCA9IG5ldyBDb2RlU25pcHBldFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCisJCXR5cGVEZWNsID0gbmV3IExvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7IAorCQlibG9ja1JlYWwoKTsKKwl9CisKKwkvL2hpZ2hsaWdodCB0aGUgbmFtZSBvZiB0aGUgdHlwZQorCWxvbmcgcG9zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl07CisJdHlwZURlY2wuc291cmNlRW5kID0gKGludCkgcG9zOworCXR5cGVEZWNsLnNvdXJjZVN0YXJ0ID0gKGludCkgKHBvcyA+Pj4gMzIpOworCXR5cGVEZWNsLm5hbWUgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CisKKwkvL2NvbXB1dGUgdGhlIGRlY2xhcmF0aW9uIHNvdXJjZSB0b28KKwl0eXBlRGVjbC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gaW50U3RhY2tbaW50UHRyLS1dOworCWludFB0ci0tOworCS8vICdjbGFzcycgYW5kICdpbnRlcmZhY2UnIHB1c2ggYW4gaW50IHBvc2l0aW9uCisJdHlwZURlY2wubW9kaWZpZXJzU291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJdHlwZURlY2wubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOworCWlmICh0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydCA+PSAwKSB7CisJCXR5cGVEZWNsLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSB0eXBlRGVjbC5tb2RpZmllcnNTb3VyY2VTdGFydDsKKwl9CisJdHlwZURlY2wuYm9keVN0YXJ0ID0gdHlwZURlY2wuc291cmNlRW5kICsgMTsKKwlwdXNoT25Bc3RTdGFjayh0eXBlRGVjbCk7CisJbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcworCS8vIHJlY292ZXJ5CisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAvLyBpcyByZWNvdmVyaW5nCisJCWxhc3RDaGVja1BvaW50ID0gdHlwZURlY2wuYm9keVN0YXJ0OworCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCh0eXBlRGVjbCwgMCk7CisJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7CisJc3VwZXIuY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9CisvKioKKyAqIEluIGNhc2UgZW11bGF0aW5nIGxvY2FsIHZhcmlhYmxlcywgd3JhcCB0aGUgKHJlY292ZXJlZCkgc3RhdGVtZW50cyBpbnNpZGUgYSAKKyAqIHRyeSBzdGF0ZW1lbnQgc28gYXMgdG8gYWNoaWV2ZSBsb2NhbCBzdGF0ZSBjb21taXRpbmcgKGNvcHkgbG9jYWwgdmFycyBiYWNrIHRvIGZpZWxkcykuCisgKiBUaGUgQ1NUb0N1TWFwcGVyIGNvdWxkIG5vdCBiZSB1c2VkLCBzaW5jZSBpdCBjb3VsZCBoYXZlIGludGVyZmVyZWQgd2l0aAorICogdGhlIHN5bnRheCByZWNvdmVyeSBzcGVjaWZpYyB0byBjb2RlIHNuaXBwZXRzLgorICovCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oYm9vbGVhbiBpc05vdEFic3RyYWN0KSB7CisJLy8gTWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBNZXRob2RCb2R5CisJLy8gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyICc7JworCisJc3VwZXIuY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGlzTm90QWJzdHJhY3QpOworCQorCS8vIG5vdyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhIG1ldGhvZCBkZWNsYXJhdGlvbiBhdCB0aGUgdG9wIG9mIHRoZSBhc3Qgc3RhY2sKKwlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKE1ldGhvZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOworCisJLy8gYXV0b21hdGljYWxseSB3cmFwIHRoZSBsYXN0IHN0YXRlbWVudCBpbnNpZGUgYSByZXR1cm4gc3RhdGVtZW50LCBpZiBpdCBpcyBhbiBleHByZXNzaW9uCisJLy8gc3VwcG9ydCBoYXZlIHRvIGJlIGRlZmluZWQgYXQgdG9wbGV2ZWwgb25seQorCWlmICh0aGlzLmlzVG9wTGV2ZWxUeXBlKCkpIHsKKwkJaW50IGxhc3QgPSBtZXRob2REZWNsLnN0YXRlbWVudHMgPT0gbnVsbCA/IC0xIDogbWV0aG9kRGVjbC5zdGF0ZW1lbnRzLmxlbmd0aCAtIDE7CisJCWlmIChsYXN0ID49IDAgJiYgbWV0aG9kRGVjbC5zdGF0ZW1lbnRzW2xhc3RdIGluc3RhbmNlb2YgRXhwcmVzc2lvbil7CisJCQlFeHByZXNzaW9uIGxhc3RFeHByZXNzaW9uID0gKEV4cHJlc3Npb24pIG1ldGhvZERlY2wuc3RhdGVtZW50c1tsYXN0XTsKKwkJCW1ldGhvZERlY2wuc3RhdGVtZW50c1tsYXN0XSA9IG5ldyBDb2RlU25pcHBldFJldHVyblN0YXRlbWVudCgKKwkJCQkJCQkJCQkJbGFzdEV4cHJlc3Npb24sIAorCQkJCQkJCQkJCQlsYXN0RXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgCisJCQkJCQkJCQkJCWxhc3RFeHByZXNzaW9uLnNvdXJjZUVuZCwKKwkJCQkJCQkJCQkJZXZhbHVhdGlvbkNvbnRleHQpOworCQl9CisJfQorCQorCWludCBzdGFydCA9IG1ldGhvZERlY2wuYm9keVN0YXJ0LTEsIGVuZCA9IHN0YXJ0OworCWxvbmcgcG9zaXRpb24gPSAoc3RhcnQgPDwgMzIpICsgZW5kOworCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tde3Bvc2l0aW9ufTsKKwlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5sb2NhbFZhcmlhYmxlTmFtZXMgIT0gbnVsbCkgeworCisJCWludCB2YXJDb3VudCA9IHRoaXMuZXZhbHVhdGlvbkNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzLmxlbmd0aDsgLy8gbiBsb2NhbCBkZWNscysgdHJ5IHN0YXRlbWVudAorCisJCS8vIGdlbmVyYXRlIG4gbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zOiBbdHlwZV0gW25hbWVdID0gdmFsJFtuYW1lXTsKKwkJU3RhdGVtZW50W10gbmV3U3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbdmFyQ291bnQrMV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyQ291bnQ7IGkrKyl7CisJCQljaGFyW10gdHJpbW1lZFR5cGVOYW1lID0gdGhpcy5ldmFsdWF0aW9uQ29udGV4dC5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzW2ldOworCQkJaW50IG5hbWVFbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJ1snLCB0cmltbWVkVHlwZU5hbWUpOworCQkJaWYgKG5hbWVFbmQgPj0gMCkgdHJpbW1lZFR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0cmltbWVkVHlwZU5hbWUsIDAsIG5hbWVFbmQpOworCQkJbmFtZUVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignICcsIHRyaW1tZWRUeXBlTmFtZSk7CisJCQlpZiAobmFtZUVuZCA+PSAwKSB0cmltbWVkVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHRyaW1tZWRUeXBlTmFtZSwgMCwgbmFtZUVuZCk7CisJCQkKKwkJCVR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSA9IG5ldyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKAorCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHRyaW1tZWRUeXBlTmFtZSksCisJCQkJcG9zaXRpb25zKTsKKwkJCWludCBkaW1Db3VudCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCdbJywgdGhpcy5ldmFsdWF0aW9uQ29udGV4dC5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzW2ldKTsKKwkJCWlmIChkaW1Db3VudCA+IDApIHsKKwkJCQl0eXBlUmVmZXJlbmNlID0gdGhpcy5jb3B5RGltcyh0eXBlUmVmZXJlbmNlLCBkaW1Db3VudCk7CisJCQl9CisJCQlOYW1lUmVmZXJlbmNlIGluaXQgPSBuZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSgKKwkJCQkJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KExPQ0FMX1ZBUl9QUkVGSVgsIHRoaXMuZXZhbHVhdGlvbkNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzW2ldKSwgcG9zaXRpb24pOworCQkJTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG5ldyBMb2NhbERlY2xhcmF0aW9uKGluaXQsIHRoaXMuZXZhbHVhdGlvbkNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzW2ldLCBzdGFydCwgZW5kKTsKKwkJCWRlY2xhcmF0aW9uLnR5cGUgPSB0eXBlUmVmZXJlbmNlOworCQkJZGVjbGFyYXRpb24ubW9kaWZpZXJzID0gdGhpcy5ldmFsdWF0aW9uQ29udGV4dC5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzW2ldOworCQkJbmV3U3RhdGVtZW50c1tpXSA9IGRlY2xhcmF0aW9uOworCQl9CisKKwkJLy8gZ2VuZXJhdGUgdHJ5IHsgW3NuaXBwZXRdIH0gZmluYWxseSB7IFtzYXZlIGxvY2FscyB0byBmaWVsZHNdIH0KKwkJLy8gdHJ5IGJsb2NrCisJCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSBuZXcgVHJ5U3RhdGVtZW50KCk7CisJCUJsb2NrIHRyeUJsb2NrID0gbmV3IEJsb2NrKG1ldGhvZERlY2wuZXhwbGljaXREZWNsYXJhdGlvbnMpOworCQl0cnlCbG9jay5zb3VyY2VTdGFydCA9IHN0YXJ0OworCQl0cnlCbG9jay5zb3VyY2VFbmQgPSBlbmQ7CisJCXRyeUJsb2NrLnN0YXRlbWVudHMgPSBtZXRob2REZWNsLnN0YXRlbWVudHM7IC8vIHNuaXBwZXQgc3RhdGVtZW50cworCQl0cnlTdGF0ZW1lbnQudHJ5QmxvY2sgPSB0cnlCbG9jazsKKwkJLy8gZmluYWxseSBibG9jaworCQlCbG9jayBmaW5hbGx5QmxvY2sgPSBuZXcgQmxvY2soMCk7CisJCWZpbmFsbHlCbG9jay5zb3VyY2VTdGFydCA9IHN0YXJ0OworCQlmaW5hbGx5QmxvY2suc291cmNlRW5kID0gZW5kOworCQlmaW5hbGx5QmxvY2suc3RhdGVtZW50cyA9IG5ldyBTdGF0ZW1lbnRbdmFyQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckNvdW50OyBpKyspeworCQkJZmluYWxseUJsb2NrLnN0YXRlbWVudHNbaV0gPSBuZXcgQXNzaWdubWVudCgKKwkJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZShDaGFyT3BlcmF0aW9uLmNvbmNhdChMT0NBTF9WQVJfUFJFRklYLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSksIHBvc2l0aW9uKSwKKwkJCQluZXcgU2luZ2xlTmFtZVJlZmVyZW5jZSh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lc1tpXSwgcG9zaXRpb24pLAorCQkJCShpbnQpIHBvc2l0aW9uKTsKKwkJfQorCQl0cnlTdGF0ZW1lbnQuZmluYWxseUJsb2NrID0gZmluYWxseUJsb2NrOworCisJCW5ld1N0YXRlbWVudHNbdmFyQ291bnRdID0gdHJ5U3RhdGVtZW50OworCQltZXRob2REZWNsLnN0YXRlbWVudHMgPSBuZXdTdGF0ZW1lbnRzOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgeworCS8vIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKKworCWlmIChzY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gdGhpcy5jb2RlU25pcHBldFN0YXJ0CisJCSYmIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmNvZGVTbmlwcGV0RW5kICsgMSArIFV0aWwuTElORV9TRVBBUkFUT1JfQ0hBUlMubGVuZ3RoIC8vIDE0ODM4CisJCSYmIGlzVG9wTGV2ZWxUeXBlKCkpIHsKKwkJCQorCQkvLyB3aGVuIHRoZSBuYW1lIGlzIG9ubHkgYW4gaWRlbnRpZmllci4uLndlIGhhdmUgYSBtZXNzYWdlIHNlbmQgdG8gInRoaXMiIChpbXBsaWNpdCkKKworCQlNZXNzYWdlU2VuZCBtID0gbmV3TWVzc2FnZVNlbmQoKTsKKwkJbS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7CisJCW0uc291cmNlU3RhcnQgPSAKKwkJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXSkgPj4+IDMyKTsgCisJCW0uc2VsZWN0b3IgPSBpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0ci0tXTsKKwkJaWYgKGlkZW50aWZpZXJMZW5ndGhTdGFja1tpZGVudGlmaWVyTGVuZ3RoUHRyXSA9PSAxKSB7CisJCQltLnJlY2VpdmVyID0gbmV3IENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZSgwLDAsZXZhbHVhdGlvbkNvbnRleHQsIHRydWUpOworCQkJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCQl9IGVsc2UgeworCQkJaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdLS07CisJCQltLnJlY2VpdmVyID0gZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2UoKTsKKwkJCW0uc291cmNlU3RhcnQgPSBtLnJlY2VpdmVyLnNvdXJjZVN0YXJ0OwkJCisJCX0KKwkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG0pOworCX0gZWxzZSB7CisJCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsKKwkvLyBNZXRob2RJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKKworCU1lc3NhZ2VTZW5kIG0gPSBuZXdNZXNzYWdlU2VuZCgpOworCW0uc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJbS5zb3VyY2VFbmQgPSByUGFyZW5Qb3M7CisJbS5uYW1lU291cmNlUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXTsKKwltLnNlbGVjdG9yID0gaWRlbnRpZmllclN0YWNrW2lkZW50aWZpZXJQdHItLV07CisJaWRlbnRpZmllckxlbmd0aFB0ci0tOworCW0ucmVjZWl2ZXIgPSBuZXcgQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZShtLnNvdXJjZVN0YXJ0LCBlbmRQb3NpdGlvbiwgdGhpcy5ldmFsdWF0aW9uQ29udGV4dCk7CisJcHVzaE9uRXhwcmVzc2lvblN0YWNrKG0pOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCkgeworCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSAndGhpcycKKworCWlmIChzY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gdGhpcy5jb2RlU25pcHBldFN0YXJ0CisJCSYmIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmNvZGVTbmlwcGV0RW5kICsgMSArIFV0aWwuTElORV9TRVBBUkFUT1JfQ0hBUlMubGVuZ3RoIC8vIDE0ODM4CisJCSYmIGlzVG9wTGV2ZWxUeXBlKCkpIHsKKwkJcHVzaE9uRXhwcmVzc2lvblN0YWNrKAorCQkJbmV3IENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0sIGVuZFBvc2l0aW9uLCB0aGlzLmV2YWx1YXRpb25Db250ZXh0LCBmYWxzZSkpOworCX0gZWxzZSB7CisJCXN1cGVyLmNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVRoaXMoKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50QnJlYWsoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudEJyZWFrKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGVtZW50QnJlYWtXaXRoTGFiZWwoKTsKKwkvKiByZWNvdmVyeSAqLworCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudENhdGNoKCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50Q29udGludWUoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudENvbnRpbnVlKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZVdpdGhMYWJlbCgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGVtZW50Q29udGludWVXaXRoTGFiZWwoKTsKKwkvKiByZWNvdmVyeSAqLworCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudERvKCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnREbygpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50Rm9yKCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRGb3IoKTsKKwkvKiByZWNvdmVyeSAqLworCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRJZk5vRWxzZSgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudExhYmVsKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSB7CisJLy8gUmV0dXJuU3RhdGVtZW50IDo6PSAncmV0dXJuJyBFeHByZXNzaW9ub3B0ICc7JworCisJLy8gcmV0dXJuZWQgdmFsdWUgaW50ZXJjZXB0ZWQgYnkgY29kZSBzbmlwcGV0IAorCS8vIHN1cHBvcnQgaGF2ZSB0byBiZSBkZWZpbmVkIGF0IHRvcGxldmVsIG9ubHkKKwlpZiAoKHRoaXMuaGFzUmVjb3ZlcmVkT25FeHByZXNzaW9uCisJCQl8fCAoc2Nhbm5lci5zdGFydFBvc2l0aW9uID49IGNvZGVTbmlwcGV0U3RhcnQgJiYgc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IGNvZGVTbmlwcGV0RW5kKzErVXRpbC5MSU5FX1NFUEFSQVRPUl9DSEFSUy5sZW5ndGggLyogMTQ4MzgqLykpCisJCSYmIHRoaXMuZXhwcmVzc2lvbkxlbmd0aFN0YWNrW3RoaXMuZXhwcmVzc2lvbkxlbmd0aFB0cl0gIT0gMAorCQkmJiBpc1RvcExldmVsVHlwZSgpKSB7CisJCXRoaXMuZXhwcmVzc2lvbkxlbmd0aFB0ci0tOworCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHItLV07CisJCXB1c2hPbkFzdFN0YWNrKAorCQkJbmV3IENvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50KAorCQkJCWV4cHJlc3Npb24sIAorCQkJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsIAorCQkJCWV4cHJlc3Npb24uc291cmNlRW5kLAorCQkJCWV2YWx1YXRpb25Db250ZXh0KSk7CisJfSBlbHNlIHsKKwkJc3VwZXIuY29uc3VtZVN0YXRlbWVudFJldHVybigpOworCX0KKwkvKiByZWNvdmVyeSAqLworCXJlY29yZExhc3RTdGF0ZW1lbnRJZk5lZWRlZCgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpIHsKKwlzdXBlci5jb25zdW1lU3RhdGVtZW50U3dpdGNoKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudFN5bmNocm9uaXplZCgpOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50VGhyb3coKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudFRocm93KCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRUcnkoYm9vbGVhbiBhcmdfMCkgeworCXN1cGVyLmNvbnN1bWVTdGF0ZW1lbnRUcnkoYXJnXzApOworCS8qIHJlY292ZXJ5ICovCisJcmVjb3JkTGFzdFN0YXRlbWVudElmTmVlZGVkKCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudFdoaWxlKCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KK3Byb3RlY3RlZCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBlbmRQYXJzZShpbnQgYWN0KSB7CisJaWYgKHRoaXMuaGFzUmVjb3ZlcmVkT25FeHByZXNzaW9uKSB7CisJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdDsKKwkJaWYgKGFjdCAhPSBFUlJPUl9BQ1RJT04pIHsgLy8gZXhwcmVzc2lvbiByZWNvdmVyeSB3b3JrZWQKKwkJCS8vIGZsdXNoIHByZXZpb3VzbHkgcmVjb3JkZWQgcHJvYmxlbXMKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pdFJlc3VsdC5wcm9ibGVtQ291bnQ7IGkrKykgeworCQkJCXVuaXRSZXN1bHQucHJvYmxlbXNbaV0gPSBudWxsOyAvLyBkaXNjYXJkIHByb2JsZW0KKwkJCX0KKwkJCXVuaXRSZXN1bHQucHJvYmxlbUNvdW50ID0gMDsKKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB7CisJCQkJKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXRoaXMucmVmZXJlbmNlQ29udGV4dCkuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSBmYWxzZTsKKwkJCX0KKwkJCWlmICh0aGlzLnJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikgeworCQkJCSgoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IGZhbHNlOworCQkJfQorCisJCQkvLyBjb25zdW1lIGV4cHJlc2lvbiBhcyBhIHJldHVybiBzdGF0ZW1lbnQKKwkJCWNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKTsKKwkJCWludCBmaWVsZHNDb3VudCA9IAorCQkJCSh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmxvY2FsVmFyaWFibGVOYW1lcyA9PSBudWxsID8gMCA6IHRoaXMuZXZhbHVhdGlvbkNvbnRleHQubG9jYWxWYXJpYWJsZU5hbWVzLmxlbmd0aCkKKwkJCQkrICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lID09IG51bGwgPyAwIDogMSk7CisJCQlpZiAodGhpcy5hc3RQdHIgPiAodGhpcy5kaWV0ID8gMCA6IDIgKyBmaWVsZHNDb3VudCkpIHsgCisJCQkJCS8vIGluIGRpZXQgbW9kZSwgdGhlIGFzdCBzdGFjayB3YXMgZW1wdHkgd2hlbiB3ZSB3ZW50IGZvciBtZXRob2QgYm9keQorCQkJCQkvLyBvdGhlcndpc2UgaXQgY29udGFpbmVkIHRoZSB0eXBlLCB0aGUgZ2VuZXJhdGVkIGZpZWxkcyBmb3IgbG9jYWwgdmFyaWFibGVzLCAKKwkJCQkJLy8gdGhlIGdlbmVyYXRlZCBmaWVsZCBmb3IgJ3RoaXMnIGFuZCB0aGUgbWV0aG9kCisJCQkJY29uc3VtZUJsb2NrU3RhdGVtZW50cygpOworCQkJfQorCQkJY29uc3VtZU1ldGhvZEJvZHkoKTsKKwkJCWlmICghdGhpcy5kaWV0KSB7CisJCQkJY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOworCQkJCWlmIChmaWVsZHNDb3VudCA+IDApIHsKKwkJCQkJY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOworCQkJCX0KKwkJCQljb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7CisJCQkJY29uc3VtZUNsYXNzRGVjbGFyYXRpb24oKTsKKwkJCQljb25zdW1lVHlwZURlY2xhcmF0aW9uc29wdCgpOworCQkJCWNvbnN1bWVDb21waWxhdGlvblVuaXQoKTsKKwkJCX0KKwkJCXRoaXMubGFzdEFjdCA9IEFDQ0VQVF9BQ1RJT047CisJCX0gZWxzZSB7CisJCQkvLyBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgZXJyb3IgcmVjb3JkZWQ6CisJCQkvLyAxLiBkdXJpbmcgcmVndWxhciBwYXJzZQorCQkJLy8gMi4gZHVyaW5nIGV4cHJlc3Npb24gcmVjb3ZlcnkKKwkJCS8vIC0+IG11c3QgZmlsdGVyIG91dCBvbmUgb2YgdGhlbSwgdGhlIGVhcmxpZXN0IG9uZSBpcyBsZXNzIGFjY3VyYXRlCisJCQlpbnQgbWF4UmVndWxhclBvcyA9IDAsIHByb2JsZW1Db3VudCA9IHVuaXRSZXN1bHQucHJvYmxlbUNvdW50OworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5OyBpKyspIHsKKwkJCQkvLyBza2lwIHVubWF0Y2hlZCBicmFja2V0IHByb2JsZW1zCisJCQkJaWYgKHVuaXRSZXN1bHQucHJvYmxlbXNbaV0uZ2V0SUQoKSA9PSBJUHJvYmxlbS5Vbm1hdGNoZWRCcmFja2V0KSBjb250aW51ZTsKKwkJCQkKKwkJCQlpbnQgc3RhcnQgPSB1bml0UmVzdWx0LnByb2JsZW1zW2ldLmdldFNvdXJjZVN0YXJ0KCk7CisJCQkJaWYgKHN0YXJ0ID4gbWF4UmVndWxhclBvcyAmJiBzdGFydCA8PSB0aGlzLmNvZGVTbmlwcGV0RW5kKSB7CisJCQkJCW1heFJlZ3VsYXJQb3MgPSBzdGFydDsKKwkJCQl9CisJCQl9CisJCQlpbnQgbWF4UmVjb3ZlcnlQb3MgPSAwOworCQkJZm9yIChpbnQgaSA9IHRoaXMucHJvYmxlbUNvdW50QmVmb3JlUmVjb3Zlcnk7IGkgPCBwcm9ibGVtQ291bnQ7IGkrKykgeworCQkJCS8vIHNraXAgdW5tYXRjaGVkIGJyYWNrZXQgcHJvYmxlbXMKKwkJCQlpZiAodW5pdFJlc3VsdC5wcm9ibGVtc1tpXS5nZXRJRCgpID09IElQcm9ibGVtLlVubWF0Y2hlZEJyYWNrZXQpIGNvbnRpbnVlOworCQkJCQorCQkJCWludCBzdGFydCA9IHVuaXRSZXN1bHQucHJvYmxlbXNbaV0uZ2V0U291cmNlU3RhcnQoKTsKKwkJCQlpZiAoc3RhcnQgPiBtYXhSZWNvdmVyeVBvcyAmJiBzdGFydCA8PSB0aGlzLmNvZGVTbmlwcGV0RW5kKSB7CisJCQkJCW1heFJlY292ZXJ5UG9zID0gc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJaWYgKG1heFJlY292ZXJ5UG9zID4gbWF4UmVndWxhclBvcykgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodW5pdFJlc3VsdC5wcm9ibGVtcywgdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeSwgdW5pdFJlc3VsdC5wcm9ibGVtcywgMCwgcHJvYmxlbUNvdW50IC0gdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeSk7CisJCQkJdW5pdFJlc3VsdC5wcm9ibGVtQ291bnQgLT0gdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeTsJCQkJCisJCQl9IGVsc2UgeworCQkJCXVuaXRSZXN1bHQucHJvYmxlbUNvdW50IC09IChwcm9ibGVtQ291bnQgLSB0aGlzLnByb2JsZW1Db3VudEJlZm9yZVJlY292ZXJ5KTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSB1bml0UmVzdWx0LnByb2JsZW1Db3VudDsgaSA8IHByb2JsZW1Db3VudDsgaSsrKSB7CisJCQkJdW5pdFJlc3VsdC5wcm9ibGVtc1tpXSA9IG51bGw7IC8vIGRpc2NhcmQgcHJvYmxlbQorCQkJfQorCisJCX0KKwl9CisJcmV0dXJuIHN1cGVyLmVuZFBhcnNlKGFjdCk7Cit9Citwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpIHsKKwkvKiBidWlsZCBhICh1bnNwZWNpZmllZCkgTmFtZVJlZmVyZW5jZSB3aGljaCBtYXkgYmUgcXVhbGlmaWVkKi8KKworCWlmIChzY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gY29kZVNuaXBwZXRTdGFydCAKKwkJJiYgc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IGNvZGVTbmlwcGV0RW5kKzErVXRpbC5MSU5FX1NFUEFSQVRPUl9DSEFSUy5sZW5ndGggLyoxNDgzOCovKXsKKwkJaW50IGxlbmd0aDsKKwkJTmFtZVJlZmVyZW5jZSByZWY7CisJCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpCisJCQkvLyBzaW5nbGUgdmFyaWFibGUgcmVmZXJlbmNlCisJCQlyZWYgPSAKKwkJCQluZXcgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKAorCQkJCQlpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0sIAorCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyLS1dLAorCQkJCQl0aGlzLmV2YWx1YXRpb25Db250ZXh0KTsgCisJCWVsc2UKKwkJCS8vUXVhbGlmaWVkIHZhcmlhYmxlIHJlZmVyZW5jZQorCQkJeworCQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJaWRlbnRpZmllclB0ciAtPSBsZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGlkZW50aWZpZXJTdGFjaywgaWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKKwkJCXJlZiA9IAorCQkJCW5ldyBDb2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UodG9rZW5zLCAKKwkJCQkJKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyAxXSA+PiAzMiksIC8vIHNvdXJjZVN0YXJ0CisJCQkJCShpbnQpIGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHIgKyBsZW5ndGhdLAorCQkJCQlldmFsdWF0aW9uQ29udGV4dCk7IC8vIHNvdXJjZUVuZAorCQl9OworCQlyZXR1cm4gcmVmOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOworCX0KK30KK3Byb3RlY3RlZCBOYW1lUmVmZXJlbmNlIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlT3B0aW1pemVkKCkgeworCS8qIGJ1aWxkIGEgKHVuc3BlY2lmaWVkKSBOYW1lUmVmZXJlbmNlIHdoaWNoIG1heSBiZSBxdWFsaWZpZWQKKwlUaGUgb3B0aW1pemF0aW9uIG9jY3VycyBmb3IgcXVhbGlmaWVkIHJlZmVyZW5jZSB3aGlsZSB3ZSBhcmUKKwljZXJ0YWluIGluIHRoaXMgY2FzZSB0aGUgbGFzdCBpdGVtIG9mIHRoZSBxdWFsaWZpZWQgbmFtZSBpcworCWEgZmllbGQgYWNjZXNzLiBUaGlzIG9wdGltaXphdGlvbiBpcyBJTVBPUlRBTlQgd2hpbGUgaXQgcmVzdWx0cworCXRoYXQgd2hlbiBhIE5hbWVSZWZlcmVuY2UgaXMgYnVpbGQsIHRoZSB0eXBlIGNoZWNrZXIgc2hvdWxkIGFsd2F5cworCWxvb2sgZm9yIHRoYXQgaXQgaXMgbm90IGEgdHlwZSByZWZlcmVuY2UgKi8KKworCWlmIChzY2FubmVyLnN0YXJ0UG9zaXRpb24gPj0gY29kZVNuaXBwZXRTdGFydCAKKwkJJiYgc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IGNvZGVTbmlwcGV0RW5kKzErVXRpbC5MSU5FX1NFUEFSQVRPUl9DSEFSUy5sZW5ndGggLyoxNDgzOCovKXsKKwkJaW50IGxlbmd0aDsKKwkJTmFtZVJlZmVyZW5jZSByZWY7CisJCWlmICgobGVuZ3RoID0gaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHItLV0pID09IDEpIHsKKwkJCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKKwkJCXJlZiA9IAorCQkJCW5ldyBDb2RlU25pcHBldFNpbmdsZU5hbWVSZWZlcmVuY2UoCisJCQkJCWlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyXSwgCisJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV0sCisJCQkJCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQpOyAKKwkJCXJlZi5iaXRzICY9IH5Bc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0s7CisJCQlyZWYuYml0cyB8PSBMT0NBTCB8IEZJRUxEOworCQkJcmV0dXJuIHJlZjsKKwkJfQorCisJCS8vUXVhbGlmaWVkLXZhcmlhYmxlLXJlZmVyZW5jZQorCQkvL0luIGZhY3QgaXQgaXMgdmFyaWFibGUtcmVmZXJlbmNlIERPVCBmaWVsZC1yZWYgLCBidXQgaXQgd291bGQgcmVzdWx0IGluIGEgdHlwZQorCQkvL2NvbmZsaWN0IHRoYSBjYW4gYmUgb25seSByZWR1Y2UgYnkgbWFraW5nIGEgc3VwZXJjbGFzcyAob3IgaW5ldHJmYWNlICkgYmV0d2VlbgorCQkvL25hbWVSZWZlcmVuY2UgYW5kIEZpbGVkUmVmZXJlbmNlIG9yIHB1dHRpbmcgRmllbGRSZWZlcmVuY2UgdW5kZXIgTmFtZVJlZmVyZW5jZQorCQkvL29yIGVsc2UuLi4uLi4uLi4uVGhpcyBvcHRpbWlzYXRpb24gaXMgbm90IHJlYWxseSByZWxldmFudCBzbyBqdXN0IGxlYXZlIGFzIGl0IGlzCisKKwkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlpZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGlkZW50aWZpZXJQdHIgKyAxLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCXJlZiA9IG5ldyBDb2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UoCisJCQkJdG9rZW5zLCAKKwkJCQkoaW50KSAoaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0ciArIDFdID4+IDMyKSwgLy8gc291cmNlU3RhcnQKKwkJCQkoaW50KSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyICsgbGVuZ3RoXSwKKwkJCQlldmFsdWF0aW9uQ29udGV4dCk7IC8vIHNvdXJjZUVuZAorCQlyZWYuYml0cyAmPSB+QXN0Tm9kZS5SZXN0cmljdGl2ZUZsYWdNQVNLOworCQlyZWYuYml0cyB8PSBMT0NBTCB8IEZJRUxEOworCQlyZXR1cm4gcmVmOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGlnbm9yZUV4cHJlc3Npb25Bc3NpZ25tZW50KCkgeworCXN1cGVyLmlnbm9yZUV4cHJlc3Npb25Bc3NpZ25tZW50KCk7CisJLyogcmVjb3ZlcnkgKi8KKwlyZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKTsKK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHdlIGFyZSBwYXJzaW5nIGEgdG9wIGxldmVsIHR5cGUgb3Igbm90LgorICovCitwcml2YXRlIGJvb2xlYW4gaXNUb3BMZXZlbFR5cGUoKSB7CisJcmV0dXJuIHRoaXMubmVzdGVkVHlwZSA9PSAodGhpcy5kaWV0ID8gMCA6IDEpOworfQorcHJvdGVjdGVkIE1lc3NhZ2VTZW5kIG5ld01lc3NhZ2VTZW5kKCkgeworCS8vICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisJLy8gdGhlIGFyZ3VtZW50cyBhcmUgb24gdGhlIGV4cHJlc3Npb24gc3RhY2sKKworCUNvZGVTbmlwcGV0TWVzc2FnZVNlbmQgbSA9IG5ldyBDb2RlU25pcHBldE1lc3NhZ2VTZW5kKGV2YWx1YXRpb25Db250ZXh0KTsKKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pICE9IDApIHsKKwkJZXhwcmVzc2lvblB0ciAtPSBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlleHByZXNzaW9uU3RhY2ssIAorCQkJZXhwcmVzc2lvblB0ciArIDEsIAorCQkJbS5hcmd1bWVudHMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdLCAKKwkJCTAsIAorCQkJbGVuZ3RoKTsgCisJfTsKKwlyZXR1cm4gbTsKK30KKy8qKgorICogUmVjb3JkcyB0aGUgc2Nhbm5lciBwb3NpdGlvbiBpZiB3ZSdyZSBwYXJzaW5nIGEgdG9wIGxldmVsIHR5cGUuCisgKi8KK3ByaXZhdGUgdm9pZCByZWNvcmRMYXN0U3RhdGVtZW50SWZOZWVkZWQoKSB7CisJaWYgKChpc1RvcExldmVsVHlwZSgpKSAmJiAodGhpcy5zY2FubmVyLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5jb2RlU25pcHBldEVuZCtVdGlsLkxJTkVfU0VQQVJBVE9SX0NIQVJTLmxlbmd0aCAvKjE0ODM4Ki8pKSB7CisJCXRoaXMubGFzdFN0YXRlbWVudCA9IHRoaXMuc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIHJlcG9ydFN5bnRheEVycm9yKGludCBhY3QsIGludCBjdXJyZW50S2luZCwgaW50IHN0YXRlU3RhY2tUb3ApIHsKKwlpZiAoIXRoaXMuZGlldCkgeworCQl0aGlzLnNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uID0gdGhpcy5jb2RlU25pcHBldFN0YXJ0OyAvLyBmb3IgY29ycmVjdCBicmFja2V0IG1hdGNoIGRpYWdub3NpcworCQl0aGlzLnNjYW5uZXIuZW9mUG9zaXRpb24gPSB0aGlzLmNvZGVTbmlwcGV0RW5kICsgMTsgLy8gc3RvcCBhZnRlciBleHByZXNzaW9uIAorCX0KKwlzdXBlci5yZXBvcnRTeW50YXhFcnJvcihhY3QsIGN1cnJlbnRLaW5kLCBzdGF0ZVN0YWNrVG9wKTsKK30KKy8qCisgKiBBIHN5bnRheCBlcnJvciB3YXMgZGV0ZWN0ZWQuIElmIGEgbWV0aG9kIGlzIGJlaW5nIHBhcnNlZCwgcmVjb3JkcyB0aGUgbnVtYmVyIG9mIGVycm9ycyBhbmQKKyAqIGF0dGVtcHRzIHRvIHJlc3RhcnQgZnJvbSB0aGUgbGFzdCBzdGF0ZW1lbnQgYnkgZ29pbmcgZm9yIGFuIGV4cHJlc3Npb24uCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHJlc3VtZU9uU3ludGF4RXJyb3IoKSB7CisJaWYgKHRoaXMuZGlldCB8fCB0aGlzLmhhc1JlY292ZXJlZE9uRXhwcmVzc2lvbikgeyAvLyBubyByZWVudGVyaW5nIGluc2lkZSBleHByZXNzaW9uIHJlY292ZXJ5CisJCXJldHVybiBzdXBlci5yZXN1bWVPblN5bnRheEVycm9yKCk7CisJfQorCQorCS8vIHJlY29yZCBwcmV2aW91cyBlcnJvciwgaW4gY2FzZSBtb3JlIGFjY3VyYXRlIHRoYW4gcG90ZW50aWFsIG9uZSBpbiBleHByZXNzaW9uIHJlY292ZXJ5CisJLy8gZS5nLiAicmV0dXJuIGZvbyhhIGEpOyAxKzMiCisJdGhpcy5wcm9ibGVtQ291bnRCZWZvcmVSZWNvdmVyeSA9IHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0LnByb2JsZW1Db3VudDsKKworCS8vIHJlcG9zaXRpb24gZm9yIGV4cHJlc3Npb24gcGFyc2luZworCWlmICh0aGlzLmxhc3RTdGF0ZW1lbnQgPCAwKSB7CisJCXRoaXMubGFzdFN0YXRlbWVudCA9IHRoaXMuY29kZVNuaXBwZXRTdGFydDsgLy8gbm8gc3RhdGVtZW50IHJlZHVjZWQgcHJpb3IgdG8gZXJyb3IgcG9pbnQKKwl9CisJdGhpcy5zY2FubmVyLmluaXRpYWxQb3NpdGlvbiA9IHRoaXMubGFzdFN0YXRlbWVudDsKKwl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHRoaXMubGFzdFN0YXRlbWVudDsKKwl0aGlzLnNjYW5uZXIuY3VycmVudFBvc2l0aW9uID0gdGhpcy5sYXN0U3RhdGVtZW50OworCXRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbiA9IHRoaXMuY29kZVNuaXBwZXRFbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IHRoaXMuY29kZVNuaXBwZXRFbmQgKyAxIDogdGhpcy5jb2RlU25pcHBldEVuZDsgLy8gc3RvcCBhZnRlciBleHByZXNzaW9uIAorCXRoaXMuc2Nhbm5lci5jb21tZW50UHRyID0gLTE7CisKKwkvLyByZXNldCBzdGFja3MgaW4gY29uc2lzdGVudCBzdGF0ZQorCXRoaXMuZXhwcmVzc2lvblB0ciA9IC0xOworCXRoaXMuaWRlbnRpZmllclB0ciA9IC0xOworCXRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA9IC0xOworCisJLy8gZ28gZm9yIHRoZSBleHByc3Npb24KKwlnb0ZvckV4cHJlc3Npb24oKTsKKwl0aGlzLmhhc1JlY292ZXJlZE9uRXhwcmVzc2lvbiA9IHRydWU7CisJdGhpcy5oYXNSZXBvcnRlZEVycm9yID0gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAyOTExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21wb3VuZEFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbnRMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW52b2NhdGlvblNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFZhcmlhYmxlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBDb2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cywgSW52b2NhdGlvblNpdGUsIFByb2JsZW1SZWFzb25zIHsKKworCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0OworCUZpZWxkQmluZGluZyBkZWxlZ2F0ZVRoaXM7CisvKioKKyAqIENvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQHBhcmFtIHNvdXJjZXMgY2hhcltdW10KKyAqIEBwYXJhbSBzb3VyY2VTdGFydCBpbnQKKyAqIEBwYXJhbSBzb3VyY2VFbmQgaW50CisgKi8KK3B1YmxpYyBDb2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UoY2hhcltdW10gc291cmNlcywgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgeworCXN1cGVyKHNvdXJjZXMsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQgPSBldmFsdWF0aW9uQ29udGV4dDsJCit9CisvKioKKyAqIENoZWNrIGFuZC9vciByZWRpcmVjdCB0aGUgZmllbGQgYWNjZXNzIHRvIHRoZSBkZWxlZ2F0ZSByZWNlaXZlciBpZiBhbnkKKyAqLworcHVibGljIFR5cGVCaW5kaW5nIGNoZWNrRmllbGRBY2Nlc3MoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGNoZWNrIGZvciBmb3J3YXJkIHJlZmVyZW5jZXMKKwliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCisJYml0cyB8PSBGSUVMRDsKKwlyZXR1cm4gZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKHNjb3BlKTsKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJLy8gdGhlIGxhc3QgZmllbGQgYWNjZXNzIGlzIGEgd3JpdGUgYWNjZXNzCisJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCBsYXN0RmllbGRCaW5kaW5nLCBudWxsLCB2YWx1ZVJlcXVpcmVkKTsKKwl9IGVsc2UgeworCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJY29kZVN0cmVhbS5zd2FwKCk7CisJCWFzc2lnbm1lbnQuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQl9CisJCX0KKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOwkKKwl9CisJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJfSBlbHNlIHsKKwkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCisJCQkJY29kZVN0cmVhbS5hcnJheWxlbmd0aCgpOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCS8vIGlubGluZSB0aGUgbGFzdCBmaWVsZCBjb25zdGFudAorCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQl9IGVsc2UgewkKKwkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQl9CQorCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQorCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CisJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQl9CisJCS8vIHRoZSBsYXN0IGZpZWxkIGFjY2VzcyBpcyBhIHdyaXRlIGFjY2VzcworCQkvLyBwZXJmb3JtIHRoZSBhY3R1YWwgY29tcG91bmQgb3BlcmF0aW9uCisJCWludCBvcGVyYXRpb25UeXBlSUQ7CisJCWlmICgob3BlcmF0aW9uVHlwZUlEID0gaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfU3RyaW5nKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJCX0gZWxzZSB7CisJCQkvLyBwcm9tb3RlIHRoZSBhcnJheSByZWZlcmVuY2UgdG8gdGhlIHN1aXRhYmxlIG9wZXJhdGlvbiB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkvLyBnZW5lcmF0ZSB0aGUgaW5jcmVtZW50IHZhbHVlICh3aWxsIGJ5IGl0c2VsZiAgYmUgcHJvbW90ZWQgdG8gdGhlIG9wZXJhdGlvbiB2YWx1ZSkKKwkJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKXsgLy8gcHJlZml4IG9wZXJhdGlvbgorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwkJCQorCQkJfSBlbHNlIHsKKwkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfQorCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCS8vIGFjdHVhbCBhc3NpZ25tZW50CisJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgbGFzdEZpZWxkQmluZGluZywgbnVsbCwgdmFsdWVSZXF1aXJlZCk7CisJfSBlbHNlIHsKKwkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CisJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCWNvZGVTdHJlYW0uc3dhcCgpOworCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJY29kZVN0cmVhbS5zd2FwKCk7CisKKwkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQljb2RlU3RyZWFtLnN3YXAoKTsKKwkJCWNvZGVTdHJlYW0uZHVwKCk7CisKKwkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQl9CisJCS8vIHRoZSBsYXN0IGZpZWxkIGFjY2VzcyBpcyBhIHdyaXRlIGFjY2VzcworCQkvLyBwZXJmb3JtIHRoZSBhY3R1YWwgY29tcG91bmQgb3BlcmF0aW9uCisJCWludCBvcGVyYXRpb25UeXBlSUQ7CisJCWlmICgob3BlcmF0aW9uVHlwZUlEID0gaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfU3RyaW5nKSB7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJCX0gZWxzZSB7CisJCQkvLyBwcm9tb3RlIHRoZSBhcnJheSByZWZlcmVuY2UgdG8gdGhlIHN1aXRhYmxlIG9wZXJhdGlvbiB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkvLyBnZW5lcmF0ZSB0aGUgaW5jcmVtZW50IHZhbHVlICh3aWxsIGJ5IGl0c2VsZiAgYmUgcHJvbW90ZWQgdG8gdGhlIG9wZXJhdGlvbiB2YWx1ZSkKKwkJCWlmIChleHByZXNzaW9uID09IEludExpdGVyYWwuT25lKXsgLy8gcHJlZml4IG9wZXJhdGlvbgorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwkJCQorCQkJfSBlbHNlIHsKKwkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfQorCQkJLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCisJCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJCS8vIGNhc3QgdGhlIHZhbHVlIGJhY2sgdG8gdGhlIGFycmF5IHJlZmVyZW5jZSB0eXBlCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJCS8vIGFjdHVhbCBhc3NpZ25tZW50CisKKwkJLy8gY3VycmVudCBzdGFjayBpczoKKwkJLy8gZmllbGQgcmVjZWl2ZXIgdmFsdWUKKwkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQl9IGVsc2UgeworCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQl9CisJCX0KKwkJLy8gY3VycmVudCBzdGFjayBpczoKKwkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUJCQkJCisJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwl9Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisKKwlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKKwkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCX0JCisJCS8vIGR1cGxpY2F0ZSB0aGUgb2xkIGZpZWxkIHZhbHVlCisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJaWYgKChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQl9CisJCQl9IGVsc2UgeyAvLyBTdGFjazogIFtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXSAgLS0tPiBbb2xkIGZpZWxkIHZhbHVlXVtvd25lcl1bb2xkIGZpZWxkIHZhbHVlXQorCQkJCWlmICgobGFzdEZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobGFzdEZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGxhc3RGaWVsZEJpbmRpbmcudHlwZS5pZCk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCisJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgbGFzdEZpZWxkQmluZGluZywgbnVsbCwgZmFsc2UpOworCX0gZWxzZSB7CisJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJaWYgKChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCX0KKwkJfQorCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJaWYgKChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChsYXN0RmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJCX0KKwkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQljb2RlU3RyZWFtLnBvcCgpOwkJCQkJCisJCX0gZWxzZSB7CisJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQl9IGVsc2UgeworCQkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9CisJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJY29kZVN0cmVhbS5wb3AoKTsJCQkJCQorCQl9CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGxhc3RGaWVsZEJpbmRpbmcudHlwZS5pZCk7CisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCX0KK30KKy8qCisgKiBHZW5lcmF0ZSBjb2RlIGZvciBhbGwgYmluZGluZ3MgKGxvY2FsIGFuZCBmaWVsZHMpIGV4Y2x1ZGluZyB0aGUgbGFzdCBvbmUsIHdoaWNoIG1heSB0aGVuIGJlIGdlbmVyYXRlZCBjb2RlCisgKiBmb3IgYSByZWFkIG9yIHdyaXRlIGFjY2Vzcy4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVSZWFkU2VxdWVuY2UoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkvLyBkZXRlcm1pbmUgdGhlIHJhbmsgdW50aWwgd2hpY2ggd2Ugbm93IHdlIGRvIG5vdCBuZWVkIGFueSBhY3R1YWwgdmFsdWUgZm9yIHRoZSBmaWVsZCBhY2Nlc3MKKwlpbnQgb3RoZXJCaW5kaW5nc0NvdW50ID0gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSBudWxsID8gMCA6IG90aGVyQ29kZWdlbkJpbmRpbmdzLmxlbmd0aDsKKwlpbnQgaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZDsKKwlpZiAodmFsdWVSZXF1aXJlZCkgeworCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50OworCQl3aGlsZSAoaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA+IDApIHsKKwkJCUZpZWxkQmluZGluZyBvdGhlckJpbmRpbmcgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2luZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgLSAxXTsKKwkJCWlmIChvdGhlckJpbmRpbmcuaXNTdGF0aWMoKSB8fCBvdGhlckJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQorCQkJCWJyZWFrOyAvLyBubyBsb25nZXIgbmVlZCBhbnkgdmFsdWUgYmVmb3JlIHRoaXMgcG9pbnQKKwkJCWluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQtLTsKKwkJfQorCX0gZWxzZSB7CisJCWluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPSBvdGhlckJpbmRpbmdzQ291bnQgKyAxOworCX0KKwlpZiAoaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9PSAwKSB7CisJCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCWNhc2UgRklFTEQgOgorCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCQkJCS8vIGlmIGZpcnN0IGZpZWxkIGlzIGFjdHVhbGx5IGNvbnN0YW50LCB3ZSBjYW4gaW5saW5lIGl0CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50LCAwKTsgLy8gbm8gaW1wbGljaXQgY29udmVyc2lvbgorCQkJCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsgLy8gd2lsbCBub3QgZ2VuZXJhdGUgaXQgYWdhaW4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKKwkJCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKKwkJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJCS8vIG5vdCB5ZXQgc3VwcG9ydGVkCisJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBMT0NBTCA6IC8vIHJlYWRpbmcgdGhlIGZpcnN0IGxvY2FsIHZhcmlhYmxlCisJCQkJbGFzdEZpZWxkQmluZGluZyA9IG51bGw7CisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCisJCQkJLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSByZWFkCisJCQkJaWYgKGxvY2FsQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGxvY2FsQmluZGluZy5jb25zdGFudCwgMCk7IC8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBvdXRlciBsb2NhbD8KKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQkvLyBvdXRlciBsb2NhbCBjYW4gYmUgcmVhY2hlZCBlaXRoZXIgdGhyb3VnaCBhIHN5bnRoZXRpYyBhcmcgb3IgYSBzeW50aGV0aWMgZmllbGQKKwkJCQkJCVZhcmlhYmxlQmluZGluZ1tdIHBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChsb2NhbEJpbmRpbmcpOworCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgeworCQkJCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQorCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOworCX0KKwkvLyBhbGwgaW50ZXJtZWRpYXRlIGZpZWxkIGFjY2Vzc2VzIGFyZSByZWFkIGFjY2Vzc2VzCisJLy8gb25seSB0aGUgbGFzdCBmaWVsZCBiaW5kaW5nIGlzIGEgd3JpdGUgYWNjZXNzCisJaWYgKG90aGVyQmluZGluZ3MgIT0gbnVsbCkgeworCQlpbnQgc3RhcnQgPSBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDAgPyAwIDogaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDE7CisJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7CisJCQlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsKSB7CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkKKwkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCQllbHNlCisJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGxhc3RGaWVsZEJpbmRpbmcpOworCQkJCX0KKwkJCX0KKworCQkJbGFzdEZpZWxkQmluZGluZyA9IHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbaV07CisJCQlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsICYmICFsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVSZWNlaXZlcihDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKKwljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwlpZiAoZGVsZWdhdGVUaGlzICE9IG51bGwpIGNvZGVTdHJlYW0uZ2V0ZmllbGQoZGVsZWdhdGVUaGlzKTsgLy8gZGVsZWdhdGVkIGZpZWxkIGFjY2VzcworfQorcHVibGljIFR5cGVCaW5kaW5nIGdldE90aGVyRmllbGRCaW5kaW5ncyhCbG9ja1Njb3BlIHNjb3BlKSB7CisJLy8gQXQgdGhpcyBwb2ludCByZXN0cmljdGl2ZUZsYWcgbWF5IE9OTFkgaGF2ZSB0d28gcG90ZW50aWFsIHZhbHVlIDogRklFTEQgTE9DQUwgKGkuZSBjYXN0IDw8KFZhcmlhYmxlQmluZGluZykgYmluZGluZz4+IGlzIHZhbGlkKQorCisJaWYgKChiaXRzICYgRklFTEQpICE9IDApIHsKKwkJaWYgKCEoKEZpZWxkQmluZGluZykgYmluZGluZykuaXNTdGF0aWMoKSkgeyAvL211c3QgY2hlY2sgZm9yIHRoZSBzdGF0aWMgc3RhdHVzLi4uLgorCQkJaWYgKGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKSB7CisJCQkJLy90aGUgZmllbGQgaXMgdGhlIGZpcnN0IHRva2VuIG9mIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlLi4uLgorCQkJCWlmIChzY29wZS5tZXRob2RTY29wZSgpLmlzU3RhdGljKSB7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSh0aGlzLCAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfSBlbHNlIHsgLy9hY2Nlc3NpbmcgdG8gYSBmaWVsZCB1c2luZyBhIHR5cGUgYXMgInJlY2VpdmVyIiBpcyBhbGxvd2VkIG9ubHkgd2l0aCBzdGF0aWMgZmllbGQJCisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKHRoaXMsIChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZCgoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCBzY29wZSkpCisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoKEZpZWxkQmluZGluZykgYmluZGluZywgdGhpcyk7CisJfQorCisJVHlwZUJpbmRpbmcgdHlwZSA9ICgoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS50eXBlOworCWludCBpbmRleCA9IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKKwlpbnQgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKKwlpZiAoaW5kZXggPT0gbGVuZ3RoKSB7IC8vCXJlc3RyaWN0aXZlRmxhZyA9PSBGSUVMRAorCQljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcsIGZhbHNlLCB0aGlzLCBzY29wZSwgaW5kZXggLSAxKTsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLy8gYWxsb2NhdGlvbiBvZiB0aGUgZmllbGRCaW5kaW5ncyBhcnJheQlhbmQgaXRzIHJlc3BlY3RpdmUgY29uc3RhbnRzCisJaW50IG90aGVyQmluZGluZ3NMZW5ndGggPSBsZW5ndGggLSBpbmRleDsKKwl0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID0gdGhpcy5vdGhlckJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1tvdGhlckJpbmRpbmdzTGVuZ3RoXTsKKwkKKwkvLyBmaWxsIHRoZSBmaXJzdCBjb25zdGFudCAodGhlIG9uZSBvZiB0aGUgYmluZGluZykKKwljb25zdGFudCA9CisJCSgoYml0cyAmIEZJRUxEKSAhPSAwKQorCQkJPyBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcigoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCBmYWxzZSwgdGhpcywgc2NvcGUsIGluZGV4IC0gMSkKKwkJCTogKChWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpLmNvbnN0YW50OworCisJLy8gaXRlcmF0aW9uIG9uIGVhY2ggZmllbGQJCisJd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CisJCWNoYXJbXSB0b2tlbiA9IHRva2Vuc1tpbmRleF07CisJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOyAvLyBjb3VsZCBub3QgcmVzb2x2ZSB0eXBlIHByaW9yIHRvIHRoaXMgcG9pbnQKKwkJRmllbGRCaW5kaW5nIGZpZWxkID0gc2NvcGUuZ2V0RmllbGQodHlwZSwgdG9rZW4sIHRoaXMpOworCQlpbnQgcGxhY2UgPSBpbmRleCAtIGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKKwkJb3RoZXJCaW5kaW5nc1twbGFjZV0gPSBmaWVsZDsKKwkJaWYgKCFmaWVsZC5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkvLyB0cnkgdG8gcmV0cmlldmUgdGhlIGZpZWxkIGFzIHByaXZhdGUgZmllbGQKKwkJCUNvZGVTbmlwcGV0U2NvcGUgbG9jYWxTY29wZSA9IG5ldyBDb2RlU25pcHBldFNjb3BlKHNjb3BlKTsKKwkJCWlmIChkZWxlZ2F0ZVRoaXMgPT0gbnVsbCkgeworCQkJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmRlY2xhcmluZ1R5cGVOYW1lICE9IG51bGwpIHsKKwkJCQkJZGVsZWdhdGVUaGlzID0gc2NvcGUuZ2V0RmllbGQoc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLCBERUxFR0FURV9USElTLCB0aGlzKTsKKwkJCQkJaWYgKGRlbGVnYXRlVGhpcyA9PSBudWxsKXsgOyAvLyBpZiBub3QgZm91bmQgdGhlbiBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAorCQkJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBzdXBlci5yZXBvcnRFcnJvcihzY29wZSk7CisJCQkJfQorCQkJfQorCQkJZmllbGQgPSBsb2NhbFNjb3BlLmdldEZpZWxkRm9yQ29kZVNuaXBwZXQoZGVsZWdhdGVUaGlzLnR5cGUsIHRva2VuLCB0aGlzKTsKKwkJCW90aGVyQmluZGluZ3NbcGxhY2VdID0gZmllbGQ7CisJCX0KKwkJaWYgKGZpZWxkLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZCwgc2NvcGUpKQorCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZCwgdGhpcyk7CisJCQlDb25zdGFudCBzb21lQ29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZCwgZmFsc2UsIHRoaXMsIHNjb3BlLCBwbGFjZSk7CisJCQkvLyBjb25zdGFudCBwcm9wYWdhdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYXMgbG9uZyBhcyB0aGUgcHJldmlvdXMgb25lIGlzIGEgY29uc3RhbnQgdG9vLgorCQkJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCl7CisJCQkJY29uc3RhbnQgPSBzb21lQ29uc3RhbnQ7CisJCQl9CisJCQl0eXBlID0gZmllbGQudHlwZTsKKwkJCWluZGV4Kys7CisJCX0gZWxzZSB7CisJCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsgLy9kb24ndCBmaWxsIG90aGVyIGNvbnN0YW50cyBzbG90cy4uLgorCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIGZpZWxkLCBpbmRleCwgdHlwZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwlyZXR1cm4gKG90aGVyQmluZGluZ3Nbb3RoZXJCaW5kaW5nc0xlbmd0aCAtIDFdKS50eXBlOworfQorLyoqCisgKiBDaGVjayBhbmQvb3IgcmVkaXJlY3QgdGhlIGZpZWxkIGFjY2VzcyB0byB0aGUgZGVsZWdhdGUgcmVjZWl2ZXIgaWYgYW55CisgKi8KK3B1YmxpYyBUeXBlQmluZGluZyBnZXRSZWNlaXZlclR5cGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUpIHsKKwlpZiAocmVjZWl2ZXJUeXBlICE9IG51bGwpIHJldHVybiByZWNlaXZlclR5cGU7CisJU2NvcGUgc2NvcGUgPSBjdXJyZW50U2NvcGUucGFyZW50OworCXdoaWxlICh0cnVlKSB7CisJCQlzd2l0Y2ggKHNjb3BlLmtpbmQpIHsKKwkJCQljYXNlIFNjb3BlLkNMQVNTX1NDT1BFIDoKKwkJCQkJcmV0dXJuIHJlY2VpdmVyVHlwZSA9ICgoQ2xhc3NTY29wZSkgc2NvcGUpLnJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJCQlkZWZhdWx0OgorCQkJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJCX0KKwl9Cit9CisJCQorCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeSgKKwkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCisJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcsCisJCVR5cGVCaW5kaW5nIGxhc3RSZWNlaXZlclR5cGUsCisJCWludCBpbmRleCkgeworCisJCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgorCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZworCQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQlib29sZWFuIHVzZURlbGVnYXRlID0gaW5kZXggPT0gMCAmJiB0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsOworCQlpZiAodXNlRGVsZWdhdGUpIGxhc3RSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcy50eXBlOworCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbGFzdFJlY2VpdmVyVHlwZQorCQkJJiYgIWxhc3RSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQkJCQorCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKKwkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCQkmJiAoaW5kZXggPiAwIHx8IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA+IDEgfHwgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKQorCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCisJCQkJfHwgISh1c2VEZWxlZ2F0ZQorCQkJCQkJPyBuZXcgQ29kZVNuaXBwZXRTY29wZShjdXJyZW50U2NvcGUpLmNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZSkKKwkJCQkJCTogZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKSl7CisJCQlpZiAoaW5kZXggPT0gMCl7CisJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKWxhc3RSZWNlaXZlclR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSB0aGlzLm90aGVyQmluZGluZ3MpeworCQkJCQlpbnQgbCA9IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdGhlckJpbmRpbmdzLCAwLCB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1tsXSwgMCwgbCk7CisJCQkJfQorCQkJCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbaW5kZXgtMV0gPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoZmllbGRCaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZylsYXN0UmVjZWl2ZXJUeXBlKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIE5vIG5lZWQgdG8gZW11bGF0ZSBhY2Nlc3MgdG8gcHJvdGVjdGVkIGZpZWxkcyBzaW5jZSBub3QgaW1wbGljaXRseSBhY2Nlc3NlZAorCSAqLworCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY1dyaXRlQWNjZXNzSWZOZWNlc3NhcnkoCisJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAorCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nLAorCQlUeXBlQmluZGluZyBsYXN0UmVjZWl2ZXJUeXBlKSB7CisKKwkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCisJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCisJCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCWJvb2xlYW4gdXNlRGVsZWdhdGUgPSBmaWVsZEJpbmRpbmcgPT0gYmluZGluZyAmJiB0aGlzLmRlbGVnYXRlVGhpcyAhPSBudWxsOworCQlpZiAodXNlRGVsZWdhdGUpIGxhc3RSZWNlaXZlclR5cGUgPSB0aGlzLmRlbGVnYXRlVGhpcy50eXBlOworCisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbGFzdFJlY2VpdmVyVHlwZQorCQkJJiYgIWxhc3RSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQkJCQorCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKKwkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJCQkmJiAoZmllbGRCaW5kaW5nICE9IGJpbmRpbmcgfHwgaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID4gMSB8fCAhZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkKKwkJCQl8fCAhKHVzZURlbGVnYXRlCisJCQkJCQk/IG5ldyBDb2RlU25pcHBldFNjb3BlKGN1cnJlbnRTY29wZSkuY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLmRlbGVnYXRlVGhpcy50eXBlKQorCQkJCQkJOiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpKXsKKwkJCWlmIChmaWVsZEJpbmRpbmcgPT0gYmluZGluZyl7CisJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhmaWVsZEJpbmRpbmcsIChSZWZlcmVuY2VCaW5kaW5nKWxhc3RSZWNlaXZlclR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSB0aGlzLm90aGVyQmluZGluZ3MpeworCQkJCQlpbnQgbCA9IHRoaXMub3RoZXJCaW5kaW5ncy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5vdGhlckJpbmRpbmdzLCAwLCB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzID0gbmV3IEZpZWxkQmluZGluZ1tsXSwgMCwgbCk7CisJCQkJfQorCQkJCXRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGgtMV0gPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoZmllbGRCaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZylsYXN0UmVjZWl2ZXJUeXBlKTsKKwkJCX0KKwkJfQorCX0KKworLyoqCisgKiBOb3JtYWwgZmllbGQgYmluZGluZyBkaWQgbm90IHdvcmssIHRyeSB0byBiaW5kIHRvIGEgZmllbGQgb2YgdGhlIGRlbGVnYXRlIHJlY2VpdmVyLgorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgcmVwb3J0RXJyb3IoQmxvY2tTY29wZSBzY29wZSkgeworCisJaWYgKHRoaXMuZXZhbHVhdGlvbkNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWUgIT0gbnVsbCkgeworCQlkZWxlZ2F0ZVRoaXMgPSBzY29wZS5nZXRGaWVsZChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIERFTEVHQVRFX1RISVMsIHRoaXMpOworCQlpZiAoZGVsZWdhdGVUaGlzID09IG51bGwpeyA7IC8vIGlmIG5vdCBmb3VuZCB0aGVuIGludGVybmFsIGVycm9yLCBmaWVsZCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kCisJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKKwl9CisKKwlpZiAoKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nICYmICgoUHJvYmxlbUZpZWxkQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpCisJCXx8IChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUJpbmRpbmcgJiYgKChQcm9ibGVtQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpKXsKKwkJLy8gd2lsbCBub3Qgc3VwcG9ydCBpbm5lcmNsYXNzIGVtdWxhdGlvbiBpbnNpZGUgZGVsZWdhdGUKKwkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHNjb3BlLmdldEZpZWxkKGRlbGVnYXRlVGhpcy50eXBlLCB0aGlzLnRva2Vuc1swXSwgdGhpcyk7CisJCWlmICghZmllbGRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmICgoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGZpZWxkQmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkgeworCQkJCS8vIG1hbmFnZSB0aGUgYWNjZXNzIHRvIGEgcHJpdmF0ZSBmaWVsZCBvZiB0aGUgZW5jbG9zaW5nIHR5cGUKKwkJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CisJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IGxvY2FsU2NvcGUuZ2V0RmllbGRGb3JDb2RlU25pcHBldChkZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbnNbMF0sIHRoaXMpOworCQkJCWlmIChiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOwkJCQkJCQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBzdXBlci5yZXBvcnRFcnJvcihzY29wZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOworCQkJfQorCQl9CisJCXRoaXMuY29kZWdlbkJpbmRpbmcgPSBiaW5kaW5nID0gZmllbGRCaW5kaW5nOworCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CisJfQorCisJVHlwZUJpbmRpbmcgcmVzdWx0OworCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUZpZWxkQmluZGluZworCQkmJiAoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGJpbmRpbmcpLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpIHsKKwkJcmVzdWx0ID0gcmVzb2x2ZVR5cGVWaXNpYmlsaXR5KHNjb3BlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKKwkJaWYgKHJlc3VsdC5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZVZpc2liaWxpdHkoQmxvY2tTY29wZSBzY29wZSkgeworCS8vIGZpZWxkIGFuZC9vciBsb2NhbCBhcmUgZG9uZSBiZWZvcmUgdHlwZSBsb29rdXBzCisKKwkvLyB0aGUgb25seSBhdmFpbGFibGUgdmFsdWUgZm9yIHRoZSByZXN0cmljdGl2ZUZsYWcgQkVGT1JFCisJLy8gdGhlIFRDIGlzIEZsYWdfVHlwZSBGbGFnX0xvY2FsRmllbGQgYW5kIEZsYWdfVHlwZUxvY2FsRmllbGQgCisKKwlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CisJaWYgKCh0aGlzLmNvZGVnZW5CaW5kaW5nID0gYmluZGluZyA9IGxvY2FsU2NvcGUuZ2V0QmluZGluZyh0b2tlbnMsIGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLLCB0aGlzLCAoUmVmZXJlbmNlQmluZGluZykgZGVsZWdhdGVUaGlzLnR5cGUpKS5pc1ZhbGlkQmluZGluZygpKSB7CisJCWJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKKwkJYml0cyB8PSBGSUVMRDsKKwkJcmV0dXJuIGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CisJfQorCS8vPT09PT09PT1lcnJvciBjYXNlcz09PT09PT09PT09PT09PQorCXJldHVybiBzdXBlci5yZXBvcnRFcnJvcihzY29wZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0YjYyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZXR1cm5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UcnlTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKKy8qKgorICogQSByZXR1cm4gc3RhdGVtZW50IGluc2lkZSBhIGNvZGUgc25pcHBldC4gRHVyaW5nIHRoZSBjb2RlIGdlbiwKKyAqIGl0IHVzZXMgYSBtYWNybyB0byBzZXQgdGhlIHJlc3VsdCBvZiB0aGUgY29kZSBzbmlwcGV0IGluc3RlYWQKKyAqIG9mIHJldHVybmluZyBpdC4KKyAqLworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgUmV0dXJuU3RhdGVtZW50IGltcGxlbWVudHMgSW52b2NhdGlvblNpdGUsIEV2YWx1YXRpb25Db25zdGFudHMgeworCU1ldGhvZEJpbmRpbmcgc2V0UmVzdWx0TWV0aG9kOworcHVibGljIENvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwciwgaW50IHMsIGludCBlLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgeworCXN1cGVyKGV4cHIsIHMsIGUpOworfQorCitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCUZsb3dJbmZvIGluZm8gPSBzdXBlci5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisJLy8gd2UgbmVlZCB0byByZW1vdmUgdGhpcyBvcHRpbWl6YXRpb24gaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgaW5saW5pbmcgb2YgdGhlIHJldHVybiBieXRlY29kZQorCS8vIDFHSDBBVTc6IElUUEpDT1JFOkFMTCAtIEV2YWwgLSBWZXJpZnlFcnJvciBpbiBzY3JhcGJvb2sgcGFnZQorCXRoaXMuZXhwcmVzc2lvbi5iaXRzICY9IH5WYWx1ZUZvclJldHVybk1BU0s7CisJcmV0dXJuIGluZm87Cit9CisKKy8qKgorICogRHVtcCB0aGUgc3VpdGFibGUgcmV0dXJuIGJ5dGVjb2RlIGZvciBhIHJldHVybiBzdGF0ZW1lbnQKKyAqCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCQorCS8vIG91dHB1dCB0aGUgcmV0dXJuIGJ5dGVjb2RlCisJY29kZVN0cmVhbS5yZXR1cm5fKCk7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN0b3JlU2F2ZVZhbHVlSWZOZWNlc3NhcnkoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSl7CisKKwkvLyBwdXNoIHJlY2VpdmVyCisJY29kZVN0cmVhbS5hbG9hZF8wKCk7CisKKwkvLyBwdXNoIHRoZSAyIHBhcmFtZXRlcnMgb2YgInNldFJlc3VsdChPYmplY3QsIENsYXNzKSIKKwlpZiAodGhpcy5leHByZXNzaW9uID09IG51bGwgfHwgdGhpcy5leHByZXNzaW9uVHlwZSA9PSBWb2lkQmluZGluZykgeyAvLyBleHByZXNzaW9uVHlwZSA9PSBWb2lkQmluZGluZyBpZiBjb2RlIHNuaXBwZXQgaXMgdGhlIGV4cHJlc3Npb24gIlN5c3RlbS5vdXQucHJpbnRsbigpIgorCQkvLyBwdXNoIG51bGwKKwkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCisJCS8vIHZvaWQuY2xhc3MKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUoVm9pZEJpbmRpbmcsIG51bGwpOworCX0gZWxzZSB7CisJCS8vIHN3YXAgd2l0aCBleHByZXNzaW9uCisJCWludCB2YWx1ZVR5cGVJRCA9IHRoaXMuZXhwcmVzc2lvblR5cGUuaWQ7CisJCWlmICh2YWx1ZVR5cGVJRCA9PSBUX2xvbmcgfHwgdmFsdWVUeXBlSUQgPT0gVF9kb3VibGUpIHsKKwkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQljb2RlU3RyZWFtLnBvcCgpOworCQl9IGVsc2UgeworCQkJY29kZVN0cmVhbS5zd2FwKCk7CisJCX0KKworCQkvLyBnZW5lcmF0ZSB3cmFwcGVyIGlmIG5lZWRlZAorCQlpZiAodGhpcy5leHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkgJiYgdGhpcy5leHByZXNzaW9uVHlwZSAhPSBOdWxsQmluZGluZykgeyAKKwkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKWNvZGVTdHJlYW0pLmdlbmVyYXRlT2JqZWN0V3JhcHBlckZvclR5cGUodGhpcy5leHByZXNzaW9uVHlwZSk7CisJCX0KKworCQkvLyBnZW5lcmF0ZSB0aGUgZXhwcmVzc2lvbiB0eXBlCisJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDbGFzc0xpdGVyYWxBY2Nlc3NGb3JUeXBlKHRoaXMuZXhwcmVzc2lvblR5cGUsIG51bGwpOworCX0KKworCS8vIGdlbmVyYXRlIHRoZSBpbnZva2UgdmlydHVhbCB0byAic2V0UmVzdWx0KE9iamVjdCxDbGFzcykiCisJY29kZVN0cmVhbS5pbnZva2V2aXJ0dWFsKHRoaXMuc2V0UmVzdWx0TWV0aG9kKTsKK30KK3B1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKSB7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGJvb2xlYW4gaXNUeXBlQWNjZXNzKCkgeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBib29sZWFuIG5lZWRWYWx1ZSgpeworCXJldHVybiB0cnVlOworfQorcHVibGljIHZvaWQgcHJlcGFyZVNhdmVWYWx1ZUxvY2F0aW9uKFRyeVN0YXRlbWVudCB0YXJnZXRUcnlTdGF0ZW1lbnQpeworCQkKKwkvLyBkbyBub3RoaW5nOiBubyBzdG9yYWdlIGlzIG5lY2Vzc2FyeSBmb3Igc25pcHBldHMKK30KK3B1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCWlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkgeworCQlpZiAoKHRoaXMuZXhwcmVzc2lvblR5cGUgPSB0aGlzLmV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpKSAhPSBudWxsKSB7CisJCQlUeXBlQmluZGluZyBqYXZhTGFuZ0NsYXNzID0gc2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpOworCQkJaWYgKCFqYXZhTGFuZ0NsYXNzLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb2RlU25pcHBldE1pc3NpbmdDbGFzcygiamF2YS5sYW5nLkNsYXNzIiwgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuOworCQkJfQorCQkJVHlwZUJpbmRpbmcgamF2YUxhbmdPYmplY3QgPSBzY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOworCQkJaWYgKCFqYXZhTGFuZ09iamVjdC5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MoImphdmEubGFuZy5PYmplY3QiLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm47CisJCQl9CisJCQlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbXSB7amF2YUxhbmdPYmplY3QsIGphdmFMYW5nQ2xhc3N9OworCQkJdGhpcy5zZXRSZXN1bHRNZXRob2QgPSBzY29wZS5nZXRJbXBsaWNpdE1ldGhvZChTRVRSRVNVTFRfU0VMRUNUT1IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOworCQkJaWYgKCF0aGlzLnNldFJlc3VsdE1ldGhvZC5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29kZVNuaXBwZXRNaXNzaW5nTWV0aG9kKFJPT1RfRlVMTF9DTEFTU19OQU1FLCBuZXcgU3RyaW5nKFNFVFJFU1VMVF9TRUxFQ1RPUiksIG5ldyBTdHJpbmcoU0VUUkVTVUxUX0FSR1VNRU5UUyksIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBpbiBjb25zdGFudCBjYXNlLCB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBjYW5ub3QgYmUgbGVmdCB1bmluaXRpYWxpemVkCisJCQlpZiAodGhpcy5leHByZXNzaW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJCS8vIGZha2UgJ25vIGltcGxpY2l0IGNvbnZlcnNpb24nICh0aGUgcmV0dXJuIHR5cGUgaXMgYWx3YXlzIHZvaWQpCisJCQkJdGhpcy5leHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA9IHRoaXMuZXhwcmVzc2lvbi5jb25zdGFudC50eXBlSUQoKSA8PCA0OworCQkJfQorCQl9CisJfQorfQorcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJLy8gaWdub3JlZAorfQorcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKSB7CisJLy8gaWdub3JlZAorfQorcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgZGVwdGgpIHsKKwkvLyBpZ25vcmVkCit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMTEyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTY29wZS5qYXZhCkBAIC0wLDAgKzEsNzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW52b2NhdGlvblNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKKworLyoqCisgKiBUaGlzIHNjb3BlIGlzIHVzZWQgZm9yIGNvZGUgc25pcHBldCBsb29rdXAgdG8gZW11bGF0ZSBwcml2YXRlLCBwcm90ZWN0ZWQgYW5kIGRlZmF1bHQgYWNjZXNzLgorICogVGhlc2UgYWNjZXNzZXMgaW5zaWRlIGlubmVyIGNsYXNzZXMgYXJlIG5vdCBtYW5hZ2VkIHlldC4KKyAqLworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0U2NvcGUgZXh0ZW5kcyBCbG9ja1Njb3BlIHsKKy8qKgorICogQ29kZVNuaXBwZXRTY29wZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQHBhcmFtIGtpbmQgaW50CisgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGUKKyAqLworcHJvdGVjdGVkIENvZGVTbmlwcGV0U2NvcGUoaW50IGtpbmQsIFNjb3BlIHBhcmVudCkgeworCXN1cGVyKGtpbmQsIHBhcmVudCk7Cit9CisvKioKKyAqIENvZGVTbmlwcGV0U2NvcGUgY29uc3RydWN0b3IgY29tbWVudC4KKyAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlCisgKi8KK3B1YmxpYyBDb2RlU25pcHBldFNjb3BlKEJsb2NrU2NvcGUgcGFyZW50KSB7CisJc3VwZXIocGFyZW50KTsKK30KKy8qKgorICogQ29kZVNuaXBwZXRTY29wZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGUKKyAqIEBwYXJhbSB2YXJpYWJsZUNvdW50IGludAorICovCitwdWJsaWMgQ29kZVNuaXBwZXRTY29wZShCbG9ja1Njb3BlIHBhcmVudCwgaW50IHZhcmlhYmxlQ291bnQpIHsKKwlzdXBlcihwYXJlbnQsIHZhcmlhYmxlQ291bnQpOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHZpc2libGUgdG8gdGhlIHR5cGUgcHJvdmlkZWQgYnkgdGhlIHNjb3BlLgorKiBJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIGlzU3VwZXJBY2Nlc3MoKSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogaWYgdGhlIHJlY2VpdmVyIGlzIHByb3RlY3RlZC4KKyoKKyogTk9URTogQ2Fubm90IGludm9rZSB0aGlzIG1ldGhvZCB3aXRoIGEgY29tcGlsYXRpb24gdW5pdCBzY29wZS4KKyovCisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQoRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAoZmllbGRCaW5kaW5nLmlzUHVibGljKCkpIHJldHVybiB0cnVlOworCisJUmVmZXJlbmNlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CisJaWYgKGludm9jYXRpb25UeXBlID09IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7CisKKwlpZiAoZmllbGRCaW5kaW5nLmlzUHJvdGVjdGVkKCkpIHsKKwkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIGludm9jYXRpb25UeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcyBvciB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlCisJCS8vIE9SIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBkZWNsYXJpbmdDbGFzcworCQkvLyAgICBBTkQgdGhlIHJlY2VpdmVyVHlwZSBpcyB0aGUgaW52b2NhdGlvblR5cGUgb3IgaXRzIHN1YmNsYXNzCisJCS8vICAgIE9SIHRoZSBmaWVsZCBpcyBhIHN0YXRpYyBmaWVsZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQorCQlpZiAoaW52b2NhdGlvblR5cGUgPT0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlID09IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIHRydWU7CisJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2YoaW52b2NhdGlvblR5cGUpKSB7CisJCQlpZiAoaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpKSByZXR1cm4gdHJ1ZTsKKwkJCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwkJCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKGludm9jYXRpb25UeXBlID09IHJlY2VpdmVyVHlwZSB8fCBpbnZvY2F0aW9uVHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsgLy8gc2VlIDFGTUVQREwgLSByZXR1cm4gaW52b2NhdGlvblNpdGUuaXNUeXBlQWNjZXNzKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChmaWVsZEJpbmRpbmcuaXNQcml2YXRlKCkpIHsKKwkJLy8gYW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3MKKwkJLy8gQU5EIHRoZSBpbnZvY2F0aW9uVHlwZSBhbmQgdGhlIGRlY2xhcmluZ0NsYXNzIGhhdmUgYSBjb21tb24gZW5jbG9zaW5nVHlwZQorCQlpZiAocmVjZWl2ZXJUeXBlICE9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcykgcmV0dXJuIGZhbHNlOworCisJCWlmIChpbnZvY2F0aW9uVHlwZSAhPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IGludm9jYXRpb25UeXBlOworCQkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQkJb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IHRlbXA7CisJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCisJCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVyRGVjbGFyaW5nQ2xhc3MgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCQl0ZW1wID0gb3V0ZXJEZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCk7CisJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQkJb3V0ZXJEZWNsYXJpbmdDbGFzcyA9IHRlbXA7CisJCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQkJfQorCQkJaWYgKG91dGVySW52b2NhdGlvblR5cGUgIT0gb3V0ZXJEZWNsYXJpbmdDbGFzcykgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8vIGlzRGVmYXVsdCgpCisJaWYgKGludm9jYXRpb25UeXBlLmZQYWNrYWdlICE9IGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIGZhbHNlOworCisJLy8gcmVjZWl2ZXJUeXBlIGNhbiBiZSBhbiBhcnJheSBiaW5kaW5nIGluIG9uZSBjYXNlLi4uIHNlZSBpZiB5b3UgY2FuIGNoYW5nZSBpdAorCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpCisJCXJldHVybiBmYWxzZTsKKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOworCVBhY2thZ2VCaW5kaW5nIGRlY2xhcmluZ1BhY2thZ2UgPSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2U7CisJZG8geworCQlpZiAoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IHR5cGUpIHJldHVybiB0cnVlOworCQlpZiAoZGVjbGFyaW5nUGFja2FnZSAhPSB0eXBlLmZQYWNrYWdlKSByZXR1cm4gZmFsc2U7CisJfSB3aGlsZSAoKHR5cGUgPSB0eXBlLnN1cGVyY2xhc3MoKSkgIT0gbnVsbCk7CisJcmV0dXJuIGZhbHNlOworfQorLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIHZpc2libGUgdG8gdGhlIHR5cGUgcHJvdmlkZWQgYnkgdGhlIHNjb3BlLgorKiBJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIGlzU3VwZXJBY2Nlc3MoKSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogaWYgdGhlIHJlY2VpdmVyIGlzIHByb3RlY3RlZC4KKyoKKyogTk9URTogQ2Fubm90IGludm9rZSB0aGlzIG1ldGhvZCB3aXRoIGEgY29tcGlsYXRpb24gdW5pdCBzY29wZS4KKyovCitwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KE1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZywgVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKKwlpZiAobWV0aG9kQmluZGluZy5pc1B1YmxpYygpKSByZXR1cm4gdHJ1ZTsKKworCVJlZmVyZW5jZUJpbmRpbmcgaW52b2NhdGlvblR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOworCWlmIChpbnZvY2F0aW9uVHlwZSA9PSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICYmIGludm9jYXRpb25UeXBlID09IHJlY2VpdmVyVHlwZSkgcmV0dXJuIHRydWU7CisKKwlpZiAobWV0aG9kQmluZGluZy5pc1Byb3RlY3RlZCgpKSB7CisJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQorCQkvLyBPUiB0aGUgaW52b2NhdGlvblR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyaW5nQ2xhc3MKKwkJLy8gICAgQU5EIHRoZSByZWNlaXZlclR5cGUgaXMgdGhlIGludm9jYXRpb25UeXBlIG9yIGl0cyBzdWJjbGFzcworCQkvLyAgICBPUiB0aGUgbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZCBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoIGEgdHlwZQorCQlpZiAoaW52b2NhdGlvblR5cGUgPT0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykgcmV0dXJuIHRydWU7CisJCWlmIChpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2YoaW52b2NhdGlvblR5cGUpKSB7CisJCQlpZiAoaW52b2NhdGlvblNpdGUuaXNTdXBlckFjY2VzcygpKSByZXR1cm4gdHJ1ZTsKKwkJCS8vIHJlY2VpdmVyVHlwZSBjYW4gYmUgYW4gYXJyYXkgYmluZGluZyBpbiBvbmUgY2FzZS4uLiBzZWUgaWYgeW91IGNhbiBjaGFuZ2UgaXQKKwkJCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKGludm9jYXRpb25UeXBlID09IHJlY2VpdmVyVHlwZSB8fCBpbnZvY2F0aW9uVHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJcmV0dXJuIHRydWU7IC8vIHNlZSAxRk1FUERMIC0gcmV0dXJuIGludm9jYXRpb25TaXRlLmlzVHlwZUFjY2VzcygpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAobWV0aG9kQmluZGluZy5pc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXJUeXBlIGlzIHRoZSBkZWNsYXJpbmdDbGFzcworCQkvLyBBTkQgdGhlIGludm9jYXRpb25UeXBlIGFuZCB0aGUgZGVjbGFyaW5nQ2xhc3MgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCisJCWlmIChyZWNlaXZlclR5cGUgIT0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcykgcmV0dXJuIGZhbHNlOworCisJCWlmIChpbnZvY2F0aW9uVHlwZSAhPSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSB7CisJCQlSZWZlcmVuY2VCaW5kaW5nIG91dGVySW52b2NhdGlvblR5cGUgPSBpbnZvY2F0aW9uVHlwZTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgdGVtcCA9IG91dGVySW52b2NhdGlvblR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgeworCQkJCW91dGVySW52b2NhdGlvblR5cGUgPSB0ZW1wOworCQkJCXRlbXAgPSB0ZW1wLmVuY2xvc2luZ1R5cGUoKTsKKwkJCX0KKworCQkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCXRlbXAgPSBvdXRlckRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKKwkJCQl0ZW1wID0gdGVtcC5lbmNsb3NpbmdUeXBlKCk7CisJCQl9CisJCQlpZiAob3V0ZXJJbnZvY2F0aW9uVHlwZSAhPSBvdXRlckRlY2xhcmluZ0NsYXNzKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gaXNEZWZhdWx0KCkKKwlpZiAoaW52b2NhdGlvblR5cGUuZlBhY2thZ2UgIT0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5mUGFja2FnZSkgcmV0dXJuIGZhbHNlOworCisJLy8gcmVjZWl2ZXJUeXBlIGNhbiBiZSBhbiBhcnJheSBiaW5kaW5nIGluIG9uZSBjYXNlLi4uIHNlZSBpZiB5b3UgY2FuIGNoYW5nZSBpdAorCWlmIChyZWNlaXZlclR5cGUgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpCisJCXJldHVybiBmYWxzZTsKKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOworCVBhY2thZ2VCaW5kaW5nIGRlY2xhcmluZ1BhY2thZ2UgPSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlOworCWRvIHsKKwkJaWYgKG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gdHlwZSkgcmV0dXJuIHRydWU7CisJCWlmIChkZWNsYXJpbmdQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpIHJldHVybiBmYWxzZTsKKwl9IHdoaWxlICgodHlwZSA9IHR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCisqIEludm9jYXRpb25TaXRlIGltcGxlbWVudHMgaXNTdXBlckFjY2VzcygpIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiBpZiB0aGUgcmVjZWl2ZXIgaXMgcHJvdGVjdGVkLgorKgorKiBOT1RFOiBDYW5ub3QgaW52b2tlIHRoaXMgbWV0aG9kIHdpdGggYSBjb21waWxhdGlvbiB1bml0IHNjb3BlLgorKi8KKworcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldChSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcsIFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CisKKwlpZiAocmVjZWl2ZXJUeXBlID09IHJlZmVyZW5jZUJpbmRpbmcpIHJldHVybiB0cnVlOworCisJaWYgKHJlZmVyZW5jZUJpbmRpbmcuaXNQcm90ZWN0ZWQoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgKG9yIGl0cyBlbmNsb3NpbmcgdHlwZSkgaXMgdGhlIHN1cGVyY2xhc3MgCisJCS8vCW9mIHRoZSByZWNlaXZlclR5cGUgb3IgaW4gdGhlIHNhbWUgcGFja2FnZQorCQlyZXR1cm4gcmVjZWl2ZXJUeXBlLmZQYWNrYWdlID09IHJlZmVyZW5jZUJpbmRpbmcuZlBhY2thZ2UgCisJCQkJfHwgcmVmZXJlbmNlQmluZGluZy5pc1N1cGVyY2xhc3NPZihyZWNlaXZlclR5cGUpCisJCQkJfHwgcmVmZXJlbmNlQmluZGluZy5lbmNsb3NpbmdUeXBlKCkuaXNTdXBlcmNsYXNzT2YocmVjZWl2ZXJUeXBlKTsgLy8gcHJvdGVjdGVkIHR5cGVzIGFsd2F5cyBoYXZlIGFuIGVuY2xvc2luZyBvbmUKKwl9CisKKwlpZiAocmVmZXJlbmNlQmluZGluZy5pc1ByaXZhdGUoKSkgeworCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgYW5kIHRoZSByZWNlaXZlclR5cGUgaGF2ZSBhIGNvbW1vbiBlbmNsb3NpbmdUeXBlCisJCS8vIGFscmVhZHkga25vdyB0aGV5IGFyZSBub3QgdGhlIGlkZW50aWNhbCB0eXBlCisJCVJlZmVyZW5jZUJpbmRpbmcgb3V0ZXJJbnZvY2F0aW9uVHlwZSA9IHJlY2VpdmVyVHlwZTsKKwkJUmVmZXJlbmNlQmluZGluZyB0ZW1wID0gb3V0ZXJJbnZvY2F0aW9uVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKKwkJCW91dGVySW52b2NhdGlvblR5cGUgPSB0ZW1wOworCQkJdGVtcCA9IHRlbXAuZW5jbG9zaW5nVHlwZSgpOworCQl9CisKKwkJUmVmZXJlbmNlQmluZGluZyBvdXRlckRlY2xhcmluZ0NsYXNzID0gcmVmZXJlbmNlQmluZGluZzsKKwkJdGVtcCA9IG91dGVyRGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpOworCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7CisJCQlvdXRlckRlY2xhcmluZ0NsYXNzID0gdGVtcDsKKwkJCXRlbXAgPSB0ZW1wLmVuY2xvc2luZ1R5cGUoKTsKKwkJfQorCQlyZXR1cm4gb3V0ZXJJbnZvY2F0aW9uVHlwZSA9PSBvdXRlckRlY2xhcmluZ0NsYXNzOworCX0KKworCS8vIGlzRGVmYXVsdCgpCisJcmV0dXJuIHJlY2VpdmVyVHlwZS5mUGFja2FnZSA9PSByZWZlcmVuY2VCaW5kaW5nLmZQYWNrYWdlOworfQorLy8gSW50ZXJuYWwgdXNlIG9ubHkKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmRFeGFjdE1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJTWV0aG9kQmluZGluZyBleGFjdE1ldGhvZCA9IHJlY2VpdmVyVHlwZS5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcyk7CisJaWYgKGV4YWN0TWV0aG9kICE9IG51bGwpeworCQlpZiAocmVjZWl2ZXJUeXBlLmlzSW50ZXJmYWNlKCkgfHwgY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldChleGFjdE1ldGhvZCwgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCisJCQlyZXR1cm4gZXhhY3RNZXRob2Q7CisJfQorCXJldHVybiBudWxsOworfQorLy8gSW50ZXJuYWwgdXNlIG9ubHkKKworLyoJQW5zd2VyIHRoZSBmaWVsZCBiaW5kaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGROYW1lLgorCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIHJlY2VpdmVyVHlwZS4KKwlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzCisJCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBmaWVsZCBpcyB2aXNpYmxlLgorCU9ubHkgZmllbGRzIGRlZmluZWQgYnkgdGhlIHJlY2VpdmVyVHlwZSBvciBpdHMgc3VwZXJ0eXBlcyBhcmUgYW5zd2VyZWQ7CisJYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgdHlwZSB3aWxsIG5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIEFQSS4KKworCUlmIG5vIHZpc2libGUgZmllbGQgaXMgZGlzY292ZXJlZCwgbnVsbCBpcyBhbnN3ZXJlZC4KKyovCisKK3B1YmxpYyBGaWVsZEJpbmRpbmcgZmluZEZpZWxkRm9yQ29kZVNuaXBwZXQoVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBjaGFyW10gZmllbGROYW1lLCBJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCWlmIChyZWNlaXZlclR5cGUuaXNCYXNlVHlwZSgpKQorCQlyZXR1cm4gbnVsbDsKKwlpZiAocmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkTmFtZSwgTEVOR1RIKSkKKwkJCXJldHVybiBBcnJheUJpbmRpbmcuTGVuZ3RoRmllbGQ7CisJCXJldHVybiBudWxsOworCX0KKworCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOworCWlmICghY3VycmVudFR5cGUuY2FuQmVTZWVuQnkodGhpcykpCisJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhjdXJyZW50VHlwZSwgZmllbGROYW1lLCBOb3RWaXNpYmxlKTsgLy8gKioqIE5lZWQgYSBuZXcgcHJvYmxlbSBpZCAtIFR5cGVOb3RWaXNpYmxlPworCisJRmllbGRCaW5kaW5nIGZpZWxkID0gY3VycmVudFR5cGUuZ2V0RmllbGQoZmllbGROYW1lKTsKKwlpZiAoZmllbGQgIT0gbnVsbCkgeworCQlpZiAoY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldChmaWVsZCwgY3VycmVudFR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkKKwkJCXJldHVybiBmaWVsZDsKKwkJZWxzZQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLCBmaWVsZE5hbWUsIE5vdFZpc2libGUpOworCX0KKworCS8vIGNvbGxlY3QgYWxsIHN1cGVyaW50ZXJmYWNlcyBvZiByZWNlaXZlclR5cGUgdW50aWwgdGhlIGZpZWxkIGlzIGZvdW5kIGluIGEgc3VwZXJ0eXBlCisJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBudWxsOworCWludCBsYXN0UG9zaXRpb24gPSAtMTsKKwlGaWVsZEJpbmRpbmcgdmlzaWJsZUZpZWxkID0gbnVsbDsKKwlib29sZWFuIGtlZXBMb29raW5nID0gdHJ1ZTsKKwlib29sZWFuIG5vdFZpc2libGUgPSBmYWxzZTsgLy8gd2UgY291bGQgaG9sZCBvbnRvIHRoZSBub3QgdmlzaWJsZSBmaWVsZCBmb3IgZXh0cmEgZXJyb3IgcmVwb3J0aW5nCisJd2hpbGUgKGtlZXBMb29raW5nKSB7CisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgPT0gbnVsbCkKKwkJCQlpbnRlcmZhY2VzVG9WaXNpdCA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzVdW107CisJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlc1RvVmlzaXQsIDAsIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwgMCwgbGFzdFBvc2l0aW9uKTsKKwkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQl9CisJCWlmICgoY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCkpID09IG51bGwpCisJCQlicmVhazsKKworCQlpZiAoKGZpZWxkID0gY3VycmVudFR5cGUuZ2V0RmllbGQoZmllbGROYW1lKSkgIT0gbnVsbCkgeworCQkJa2VlcExvb2tpbmcgPSBmYWxzZTsKKwkJCWlmIChjYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KGZpZWxkLCByZWNlaXZlclR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkgeworCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkKKwkJCQkJdmlzaWJsZUZpZWxkID0gZmllbGQ7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcodmlzaWJsZUZpZWxkLmRlY2xhcmluZ0NsYXNzLCBmaWVsZE5hbWUsIEFtYmlndW91cyk7CisJCQl9IGVsc2UgeworCQkJCW5vdFZpc2libGUgPSB0cnVlOworCQkJfQorCQl9CisJfQorCisJLy8gd2FsayBhbGwgdmlzaWJsZSBpbnRlcmZhY2VzIHRvIGZpbmQgYW1iaWd1b3VzIHJlZmVyZW5jZXMKKwlpZiAoaW50ZXJmYWNlc1RvVmlzaXQgIT0gbnVsbCkgeworCQlQcm9ibGVtRmllbGRCaW5kaW5nIGFtYmlndW91cyA9IG51bGw7CisJCWRvbmUgOiBmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKwkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbal07CisJCQkJaWYgKChhbkludGVyZmFjZS50YWdCaXRzICYgSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeyAvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkCisJCQkJCWFuSW50ZXJmYWNlLnRhZ0JpdHMgfD0gSW50ZXJmYWNlVmlzaXRlZDsKKwkJCQkJaWYgKChmaWVsZCA9IGFuSW50ZXJmYWNlLmdldEZpZWxkKGZpZWxkTmFtZSkpICE9IG51bGwpIHsKKwkJCQkJCWlmICh2aXNpYmxlRmllbGQgPT0gbnVsbCkgeworCQkJCQkJCXZpc2libGVGaWVsZCA9IGZpZWxkOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlhbWJpZ3VvdXMgPSBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyh2aXNpYmxlRmllbGQuZGVjbGFyaW5nQ2xhc3MsIGZpZWxkTmFtZSwgQW1iaWd1b3VzKTsKKwkJCQkJCQlicmVhayBkb25lOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBhbkludGVyZmFjZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbnRlcmZhY2VzVG9WaXNpdCwgMCwgaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLCAwLCBsYXN0UG9zaXRpb24pOworCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gYml0IHJlaW5pdGlhbGl6YXRpb24KKwkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykKKwkJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7CisJCX0KKwkJaWYgKGFtYmlndW91cyAhPSBudWxsKSByZXR1cm4gYW1iaWd1b3VzOworCX0KKworCWlmICh2aXNpYmxlRmllbGQgIT0gbnVsbCkKKwkJcmV0dXJuIHZpc2libGVGaWVsZDsKKwlpZiAobm90VmlzaWJsZSkKKwkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGN1cnJlbnRUeXBlLCBmaWVsZE5hbWUsIE5vdFZpc2libGUpOworCXJldHVybiBudWxsOworfQorLy8gSW50ZXJuYWwgdXNlIG9ubHkKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGZpbmRNZXRob2QoCisJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJY2hhcltdIHNlbGVjdG9yLAorCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywKKwlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSkgeworCisJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSByZWNlaXZlclR5cGU7CisJCU1ldGhvZEJpbmRpbmcgbWF0Y2hpbmdNZXRob2QgPSBudWxsOworCQlPYmplY3RWZWN0b3IgZm91bmQgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisKKwkJLy9jb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UocmVjZWl2ZXJUeXBlKTsKKwkJLy9jb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2VzKGFyZ3VtZW50VHlwZXMpOworCisJCWlmIChjdXJyZW50VHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQlNZXRob2RCaW5kaW5nW10gY3VycmVudE1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsKKwkJCWludCBjdXJyZW50TGVuZ3RoID0gY3VycmVudE1ldGhvZHMubGVuZ3RoOworCQkJaWYgKGN1cnJlbnRMZW5ndGggPT0gMSkgeworCQkJCW1hdGNoaW5nTWV0aG9kID0gY3VycmVudE1ldGhvZHNbMF07CisJCQl9IGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggPiAxKSB7CisJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBjdXJyZW50TGVuZ3RoOyBmKyspCisJCQkJCWZvdW5kLmFkZChjdXJyZW50TWV0aG9kc1tmXSk7CisJCQl9CisJCQltYXRjaGluZ01ldGhvZCA9IGZpbmRNZXRob2RJblN1cGVySW50ZXJmYWNlcyhjdXJyZW50VHlwZSwgc2VsZWN0b3IsIGZvdW5kLCBtYXRjaGluZ01ldGhvZCk7CisJCQljdXJyZW50VHlwZSA9IGdldEphdmFMYW5nT2JqZWN0KCk7CisJCX0KKworCQkvLyBzdXBlcmNsYXNzIGxvb2t1cAorCQlSZWZlcmVuY2VCaW5kaW5nIGNsYXNzSGllcmFyY2h5U3RhcnQgPSBjdXJyZW50VHlwZTsKKwkJCisJCXdoaWxlIChjdXJyZW50VHlwZSAhPSBudWxsKSB7CisJCQlNZXRob2RCaW5kaW5nW10gY3VycmVudE1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKHNlbGVjdG9yKTsKKwkJCWludCBjdXJyZW50TGVuZ3RoID0gY3VycmVudE1ldGhvZHMubGVuZ3RoOworCQkJaWYgKGN1cnJlbnRMZW5ndGggPT0gMSAmJiBtYXRjaGluZ01ldGhvZCA9PSBudWxsICYmIGZvdW5kLnNpemUgPT0gMCkgeworCQkJCW1hdGNoaW5nTWV0aG9kID0gY3VycmVudE1ldGhvZHNbMF07CisJCQl9IGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggPiAwKSB7CisJCQkJaWYgKGZvdW5kLnNpemUgPT0gMCAmJiBtYXRjaGluZ01ldGhvZCAhPSBudWxsKQorCQkJCQlmb3VuZC5hZGQobWF0Y2hpbmdNZXRob2QpOworCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgY3VycmVudExlbmd0aDsgZisrKQorCQkJCQlmb3VuZC5hZGQoY3VycmVudE1ldGhvZHNbZl0pOworCQkJfQorCQkJY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5zdXBlcmNsYXNzKCk7CisJCX0KKworCQlpbnQgZm91bmRTaXplID0gZm91bmQuc2l6ZTsKKwkJaWYgKGZvdW5kU2l6ZSA9PSAwKSB7CisJCQlpZiAobWF0Y2hpbmdNZXRob2QgPT0gbnVsbCl7CisJCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPSBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBtYXRjaGluZ01ldGhvZCwgZm91bmQpOworCQkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZDsKKwkJCX0KKwkJCXJldHVybiBtYXRjaGluZ01ldGhvZDsgLy8gbWF5IGJlIG51bGwgLSBoYXZlIG5vdCBjaGVja2VkIGFyZyB0eXBlcyBvciB2aXNpYmlsaXR5CisJCX0KKwkJTWV0aG9kQmluZGluZ1tdIGNhbmRpZGF0ZXMgPSBuZXcgTWV0aG9kQmluZGluZ1tmb3VuZFNpemVdOworCQlpbnQgY2FuZGlkYXRlc0NvdW50ID0gMDsKKworCQkvLyBhcmd1bWVudCB0eXBlIGNvbXBhdGliaWxpdHkgY2hlY2sKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZFNpemU7IGkrKykgeworCQkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKE1ldGhvZEJpbmRpbmcpIGZvdW5kLmVsZW1lbnRBdChpKTsKKwkJCWlmIChhcmVQYXJhbWV0ZXJzQXNzaWduYWJsZShtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIGFyZ3VtZW50VHlwZXMpKQorCQkJCWNhbmRpZGF0ZXNbY2FuZGlkYXRlc0NvdW50KytdID0gbWV0aG9kQmluZGluZzsKKwkJfQorCQlpZiAoY2FuZGlkYXRlc0NvdW50ID09IDEpIHsKKwkJCS8vY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhjYW5kaWRhdGVzWzBdLnRocm93bkV4Y2VwdGlvbnMpOworCQkJcmV0dXJuIGNhbmRpZGF0ZXNbMF07IC8vIGhhdmUgbm90IGNoZWNrZWQgdmlzaWJpbGl0eQorCQl9CisJCWlmIChjYW5kaWRhdGVzQ291bnQgPT0gMCkgeyAvLyB0cnkgdG8gZmluZCBhIGNsb3NlIG1hdGNoIHdoZW4gdGhlIHBhcmFtZXRlciBvcmRlciBpcyB3cm9uZyBvciBtaXNzaW5nIHNvbWUgcGFyYW1ldGVycworCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPSBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBtYXRjaGluZ01ldGhvZCwgZm91bmQpOworCQkJaWYgKGludGVyZmFjZU1ldGhvZCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kOworCisJCQlpbnQgYXJnTGVuZ3RoID0gYXJndW1lbnRUeXBlcy5sZW5ndGg7CisJCQlmb3VuZFNpemUgPSBmb3VuZC5zaXplOworCQkJbmV4dE1ldGhvZCA6IGZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRTaXplOyBpKyspIHsKKwkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KGkpOworCQkJCVR5cGVCaW5kaW5nW10gcGFyYW1zID0gbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzOworCQkJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisJCQkJbmV4dEFyZzogZm9yIChpbnQgYSA9IDA7IGEgPCBhcmdMZW5ndGg7IGErKykgeworCQkJCQlUeXBlQmluZGluZyBhcmcgPSBhcmd1bWVudFR5cGVzW2FdOworCQkJCQlmb3IgKGludCBwID0gMDsgcCA8IHBhcmFtTGVuZ3RoOyBwKyspCisJCQkJCQlpZiAocGFyYW1zW3BdID09IGFyZykKKwkJCQkJCQljb250aW51ZSBuZXh0QXJnOworCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCX0KKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwkJCX0KKwkJCXJldHVybiAoTWV0aG9kQmluZGluZykgZm91bmQuZWxlbWVudEF0KDApOyAvLyBubyBnb29kIG1hdGNoIHNvIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgZm91bmQKKwkJfQorCisJCS8vIHZpc2liaWxpdHkgY2hlY2sKKwkJaW50IHZpc2libGVzQ291bnQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXNDb3VudDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBjYW5kaWRhdGVzW2ldOworCQkJaWYgKGNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQobWV0aG9kQmluZGluZywgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpIHsKKwkJCQlpZiAodmlzaWJsZXNDb3VudCAhPSBpKSB7CisJCQkJCWNhbmRpZGF0ZXNbaV0gPSBudWxsOworCQkJCQljYW5kaWRhdGVzW3Zpc2libGVzQ291bnRdID0gbWV0aG9kQmluZGluZzsKKwkJCQl9CisJCQkJdmlzaWJsZXNDb3VudCsrOworCQkJfQorCQl9CisJCWlmICh2aXNpYmxlc0NvdW50ID09IDEpIHsKKwkJCS8vY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhjYW5kaWRhdGVzWzBdLnRocm93bkV4Y2VwdGlvbnMpOworCQkJcmV0dXJuIGNhbmRpZGF0ZXNbMF07CisJCX0KKwkJaWYgKHZpc2libGVzQ291bnQgPT0gMCkgeworCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPSBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBtYXRjaGluZ01ldGhvZCwgZm91bmQpOworCQkJaWYgKGludGVyZmFjZU1ldGhvZCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kOworCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQljYW5kaWRhdGVzWzBdLnNlbGVjdG9yLAorCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJY2FuZGlkYXRlc1swXS5kZWNsYXJpbmdDbGFzcywKKwkJCQlOb3RWaXNpYmxlKTsKKwkJfQkKKwkJaWYgKGNhbmRpZGF0ZXNbMF0uZGVjbGFyaW5nQ2xhc3MuaXNDbGFzcygpKSB7CisJCQlyZXR1cm4gbW9zdFNwZWNpZmljQ2xhc3NNZXRob2RCaW5kaW5nKGNhbmRpZGF0ZXMsIHZpc2libGVzQ291bnQpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG1vc3RTcGVjaWZpY0ludGVyZmFjZU1ldGhvZEJpbmRpbmcoY2FuZGlkYXRlcywgdmlzaWJsZXNDb3VudCk7CisJCX0KKwl9CisKKy8vIEludGVybmFsIHVzZSBvbmx5CitwdWJsaWMgTWV0aG9kQmluZGluZyBmaW5kTWV0aG9kRm9yQXJyYXkoQXJyYXlCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIHNlbGVjdG9yLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJUmVmZXJlbmNlQmluZGluZyBvYmplY3QgPSBnZXRKYXZhTGFuZ09iamVjdCgpOworCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG9iamVjdC5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcyk7CisJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgeworCQkvLyBoYW5kbGUgdGhlIG1ldGhvZCBjbG9uZSgpIHNwZWNpYWxseS4uLiBjYW5ub3QgYmUgcHJvdGVjdGVkIG9yIHRocm93IGV4Y2VwdGlvbnMKKwkJaWYgKGFyZ3VtZW50VHlwZXMgPT0gTm9QYXJhbWV0ZXJzICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBDTE9ORSkpCisJCQlyZXR1cm4gbmV3IE1ldGhvZEJpbmRpbmcoKG1ldGhvZEJpbmRpbmcubW9kaWZpZXJzIF4gQWNjUHJvdGVjdGVkKSB8IEFjY1B1YmxpYywgQ0xPTkUsIG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZSwgYXJndW1lbnRUeXBlcywgbnVsbCwgb2JqZWN0KTsKKwkJaWYgKGNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQobWV0aG9kQmluZGluZywgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCisJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwl9CisKKwkvLyBhbnN3ZXJzIGNsb3Nlc3QgYXBwcm94aW1hdGlvbiwgbWF5IG5vdCBjaGVjayBhcmd1bWVudFR5cGVzIG9yIHZpc2liaWxpdHkKKwltZXRob2RCaW5kaW5nID0gZmluZE1ldGhvZChvYmplY3QsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBpbnZvY2F0aW9uU2l0ZSk7CisJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkKKwkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOworCWlmIChtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJaWYgKCFhcmVQYXJhbWV0ZXJzQXNzaWduYWJsZShtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIGFyZ3VtZW50VHlwZXMpKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2RCaW5kaW5nLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOworCQlpZiAoIWNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQobWV0aG9kQmluZGluZywgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCBOb3RWaXNpYmxlKTsKKwl9CisJcmV0dXJuIG1ldGhvZEJpbmRpbmc7Cit9CisvKiBBUEkKKwlmbGFnIGlzIGEgbWFzayBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBWQVJJQUJMRSAoPSBGSUVMRCBvciBMT0NBTCksIFRZUEUuCisJT25seSBiaW5kaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXNrIHdpbGwgYmUgYW5zd2VyZWQuCisKKwlpZiB0aGUgVkFSSUFCTEUgbWFzayBpcyBzZXQgdGhlbgorCQlJZiB0aGUgZmlyc3QgbmFtZSBwcm92aWRlZCBpcyBhIGZpZWxkIChvciBsb2NhbCkgdGhlbiB0aGUgZmllbGQgKG9yIGxvY2FsKSBpcyBhbnN3ZXJlZAorCQlPdGhlcndpc2UsIHBhY2thZ2UgbmFtZXMgYW5kIHR5cGUgbmFtZXMgYXJlIGNvbnN1bWVkIHVudGlsIGEgZmllbGQgaXMgZm91bmQuCisJCUluIHRoaXMgY2FzZSwgdGhlIGZpZWxkIGlzIGFuc3dlcmVkLgorCisJaWYgdGhlIFRZUEUgbWFzayBpcyBzZXQsCisJCXBhY2thZ2UgbmFtZXMgYW5kIHR5cGUgbmFtZXMgYXJlIGNvbnN1bWVkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0LgorCQlPbmx5IGlmIGFsbCBvZiB0aGUgaW5wdXQgaXMgY29uc3VtZWQgaXMgdGhlIHR5cGUgYW5zd2VyZWQKKworCUFsbCBvdGhlciBjb25kaXRpb25zIGFyZSBlcnJvcnMsIGFuZCBhIHByb2JsZW0gYmluZGluZyBpcyByZXR1cm5lZC4KKwkKKwlOT1RFOiBJZiBhIHByb2JsZW0gYmluZGluZyBpcyByZXR1cm5lZCwgc2VuZGVycyBzaG91bGQgZXh0cmFjdCB0aGUgY29tcG91bmQgbmFtZQorCWZyb20gdGhlIGJpbmRpbmcgJiBub3QgYXNzdW1lIHRoZSBwcm9ibGVtIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb3VuZE5hbWUuCisKKwlUaGUgVkFSSUFCTEUgbWFzayBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBUWVBFIG1hc2suCisKKwlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzCisJCWlzU3VwZXJBY2Nlc3MoKTsgdGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZGlzY292ZXJlZCBmaWVsZCBpcyB2aXNpYmxlLgorCQlzZXRGaWVsZEluZGV4KGludCk7IHRoaXMgaXMgdXNlZCB0byByZWNvcmQgdGhlIG51bWJlciBvZiBuYW1lcyB0aGF0IHdlcmUgY29uc3VtZWQuCisKKwlGb3IgZXhhbXBsZSwgZ2V0QmluZGluZyh7ImZvbyIsInkiLCJxIiwgVkFSSUFCTEUsIHNpdGUpIHdpbGwgYW5zd2VyCisJdGhlIGJpbmRpbmcgZm9yIHRoZSBmaWVsZCBvciBsb2NhbCBuYW1lZCAiZm9vIiAob3IgYW4gZXJyb3IgYmluZGluZyBpZiBub25lIGV4aXN0cykuCisJSW4gYWRkaXRpb24sIHNldEZpZWxkSW5kZXgoMSkgd2lsbCBiZSBzZW50IHRvIHRoZSBpbnZvY2F0aW9uIHNpdGUuCisJSWYgYSB0eXBlIG5hbWVkICJmb28iIGV4aXN0cywgaXQgd2lsbCBub3QgYmUgZGV0ZWN0ZWQgKGFuZCBhbiBlcnJvciBiaW5kaW5nIHdpbGwgYmUgYW5zd2VyZWQpCisKKwlJTVBPUlRBTlQgTk9URTogVGhpcyBtZXRob2QgaXMgd3JpdHRlbiB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGNvbXBvdW5kTmFtZSBpcyBsb25nZXIgdGhhbiBsZW5ndGggMS4KKyovCisKK3B1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoY2hhcltdW10gY29tcG91bmROYW1lLCBpbnQgbWFzaywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsIFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CisJQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZyhjb21wb3VuZE5hbWVbMF0sIG1hc2sgfCBUWVBFIHwgUEFDS0FHRSwgaW52b2NhdGlvblNpdGUpOworCWludm9jYXRpb25TaXRlLnNldEZpZWxkSW5kZXgoMSk7CisJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwgYmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykKKwkJcmV0dXJuIGJpbmRpbmc7CisKKwlpbnQgbGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsKKwlpbnQgY3VycmVudEluZGV4ID0gMTsKKwlmb3VuZFR5cGU6IGlmIChiaW5kaW5nIGluc3RhbmNlb2YgUGFja2FnZUJpbmRpbmcpIHsKKwkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSAoUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7CisKKwkJd2hpbGUgKGN1cnJlbnRJbmRleCA8IGxlbmd0aCkgeworCQkJYmluZGluZyA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGVPclBhY2thZ2UoY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXSk7CisJCQlpbnZvY2F0aW9uU2l0ZS5zZXRGaWVsZEluZGV4KGN1cnJlbnRJbmRleCk7CisgCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCSAJCQlpZiAoY3VycmVudEluZGV4ID09IGxlbmd0aCkgLy8gbXVzdCBiZSBhIHR5cGUgaWYgaXRzIHRoZSBsYXN0IG5hbWUsIG90aGVyd2lzZSB3ZSBoYXZlIG5vIGlkZWEgaWYgaXRzIGEgcGFja2FnZSBvciB0eXBlCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIE5vdEZvdW5kKTsKKwkJCQllbHNlCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIE5vdEZvdW5kKTsKKyAJCQl9CisgCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJIAkJCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCBiaW5kaW5nLnByb2JsZW1JZCgpKTsKKwkgCQkJaWYgKCF0aGlzLmNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQoKFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcsIHJlY2VpdmVyVHlwZSkpCisJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wb3VuZE5hbWUsIDAsIGN1cnJlbnRJbmRleCksIGJpbmRpbmcsIE5vdFZpc2libGUpOworCSAJCQlicmVhayBmb3VuZFR5cGU7CisgCQkJfQorIAkJCXBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQl9CisKKwkJLy8gSXQgaXMgaWxsZWdhbCB0byByZXF1ZXN0IGEgUEFDS0FHRSBmcm9tIHRoaXMgbWV0aG9kLgorCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCBOb3RGb3VuZCk7CisJfQorCisJLy8ga25vdyBiaW5kaW5nIGlzIG5vdyBhIFJlZmVyZW5jZUJpbmRpbmcKKwl3aGlsZSAoY3VycmVudEluZGV4IDwgbGVuZ3RoKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKKwkJY2hhcltdIG5leHROYW1lID0gY29tcG91bmROYW1lW2N1cnJlbnRJbmRleCsrXTsKKwkJaW52b2NhdGlvblNpdGUuc2V0RmllbGRJbmRleChjdXJyZW50SW5kZXgpOworCQlpZiAoKGJpbmRpbmcgPSBmaW5kRmllbGRGb3JDb2RlU25pcHBldCh0eXBlQmluZGluZywgbmV4dE5hbWUsIGludm9jYXRpb25TaXRlKSkgIT0gbnVsbCkgeworCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKCgoRmllbGRCaW5kaW5nKWJpbmRpbmcpLmRlY2xhcmluZ0NsYXNzLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgYmluZGluZy5wcm9ibGVtSWQoKSk7CisJCQlicmVhazsgLy8gYmluZGluZyBpcyBub3cgYSBmaWVsZAorCQl9CisJCWlmICgoYmluZGluZyA9IGZpbmRNZW1iZXJUeXBlKG5leHROYW1lLCB0eXBlQmluZGluZykpID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCB0eXBlQmluZGluZywgTm90Rm91bmQpOworCQkgaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpCisJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcG91bmROYW1lLCAwLCBjdXJyZW50SW5kZXgpLCBiaW5kaW5nLnByb2JsZW1JZCgpKTsKKwl9CisKKwlpZiAoKG1hc2sgJiBGSUVMRCkgIT0gMCAmJiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykpIHsgLy8gd2FzIGxvb2tpbmcgZm9yIGEgZmllbGQgYW5kIGZvdW5kIGEgZmllbGQKKwkJRmllbGRCaW5kaW5nIGZpZWxkID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKKwkJaWYgKCFmaWVsZC5pc1N0YXRpYygpKQorCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KTsKKwkJcmV0dXJuIGJpbmRpbmc7CisJfQorCWlmICgobWFzayAmIFRZUEUpICE9IDAgJiYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgeyAvLyB3YXMgbG9va2luZyBmb3IgYSB0eXBlIGFuZCBmb3VuZCBhIHR5cGUKKwkJcmV0dXJuIGJpbmRpbmc7CisJfQorCisJLy8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gYSBmaWVsZCBvciB0eXBlIHdhcyBhc2tlZCBmb3IgYnV0IHdlIHJlc29sdmVkIHRoZSBjb21wb3VuZE5hbWUgdG8gYSB0eXBlIG9yIGZpZWxkCisJcmV0dXJuIG5ldyBQcm9ibGVtQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgY3VycmVudEluZGV4KSwgTm90Rm91bmQpOworfQorLyogQVBJCisKKwlBbnN3ZXIgdGhlIGNvbnN0cnVjdG9yIGJpbmRpbmcgdGhhdCBjb3JyZXNwb25kcyB0byByZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMuCisKKwlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIAorCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgY29uc3RydWN0b3IgaXMgdmlzaWJsZS4KKworCUlmIG5vIHZpc2libGUgY29uc3RydWN0b3IgaXMgZGlzY292ZXJlZCwgYW4gZXJyb3IgYmluZGluZyBpcyBhbnN3ZXJlZC4KKyovCisKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGdldENvbnN0cnVjdG9yKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMsIEludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gcmVjZWl2ZXJUeXBlLmdldEV4YWN0Q29uc3RydWN0b3IoYXJndW1lbnRUeXBlcyk7CisJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkKKwkJaWYgKGNhbkJlU2VlbkJ5Rm9yQ29kZVNuaXBwZXQobWV0aG9kQmluZGluZywgcmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCisJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKworCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gcmVjZWl2ZXJUeXBlLmdldE1ldGhvZHMoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5Db25zdGFudFBvb2xOYW1lKTsKKwlpZiAobWV0aG9kcyA9PSBOb01ldGhvZHMpCisJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5Db25zdGFudFBvb2xOYW1lLCBhcmd1bWVudFR5cGVzLCBOb3RGb3VuZCk7CisKKwlNZXRob2RCaW5kaW5nW10gY29tcGF0aWJsZSA9IG5ldyBNZXRob2RCaW5kaW5nW21ldGhvZHMubGVuZ3RoXTsKKwlpbnQgY29tcGF0aWJsZUluZGV4ID0gMDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1ldGhvZHNbaV0ucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpCisJCQljb21wYXRpYmxlW2NvbXBhdGlibGVJbmRleCsrXSA9IG1ldGhvZHNbaV07CisJaWYgKGNvbXBhdGlibGVJbmRleCA9PSAwKQorCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOyAvLyBuZWVkIGEgbW9yZSBkZXNjcmlwdGl2ZSBlcnJvci4uLiBjYW5ub3QgY29udmVydCBmcm9tIFggdG8gWQorCisJTWV0aG9kQmluZGluZ1tdIHZpc2libGUgPSBuZXcgTWV0aG9kQmluZGluZ1tjb21wYXRpYmxlSW5kZXhdOworCWludCB2aXNpYmxlSW5kZXggPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUluZGV4OyBpKyspIHsKKwkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBjb21wYXRpYmxlW2ldOworCQlpZiAoY2FuQmVTZWVuQnlGb3JDb2RlU25pcHBldChtZXRob2QsIHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQorCQkJdmlzaWJsZVt2aXNpYmxlSW5kZXgrK10gPSBtZXRob2Q7CisJfQorCWlmICh2aXNpYmxlSW5kZXggPT0gMSkKKwkJcmV0dXJuIHZpc2libGVbMF07CisJaWYgKHZpc2libGVJbmRleCA9PSAwKQorCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwgYXJndW1lbnRUeXBlcywgTm90VmlzaWJsZSk7CisJcmV0dXJuIG1vc3RTcGVjaWZpY0NsYXNzTWV0aG9kQmluZGluZyh2aXNpYmxlLCB2aXNpYmxlSW5kZXgpOworfQorLyogQVBJCisKKwlBbnN3ZXIgdGhlIGZpZWxkIGJpbmRpbmcgdGhhdCBjb3JyZXNwb25kcyB0byBmaWVsZE5hbWUuCisJU3RhcnQgdGhlIGxvb2t1cCBhdCB0aGUgcmVjZWl2ZXJUeXBlLgorCUludm9jYXRpb25TaXRlIGltcGxlbWVudHMKKwkJaXNTdXBlckFjY2VzcygpOyB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNjb3ZlcmVkIGZpZWxkIGlzIHZpc2libGUuCisJT25seSBmaWVsZHMgZGVmaW5lZCBieSB0aGUgcmVjZWl2ZXJUeXBlIG9yIGl0cyBzdXBlcnR5cGVzIGFyZSBhbnN3ZXJlZDsKKwlhIGZpZWxkIG9mIGFuIGVuY2xvc2luZyB0eXBlIHdpbGwgbm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgQVBJLgorCisJSWYgbm8gdmlzaWJsZSBmaWVsZCBpcyBkaXNjb3ZlcmVkLCBhbiBlcnJvciBiaW5kaW5nIGlzIGFuc3dlcmVkLgorKi8KKworcHVibGljIEZpZWxkQmluZGluZyBnZXRGaWVsZEZvckNvZGVTbmlwcGV0KFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIGZpZWxkTmFtZSwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKwlGaWVsZEJpbmRpbmcgZmllbGQgPSBmaW5kRmllbGRGb3JDb2RlU25pcHBldChyZWNlaXZlclR5cGUsIGZpZWxkTmFtZSwgaW52b2NhdGlvblNpdGUpOworCWlmIChmaWVsZCA9PSBudWxsKQorCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcocmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyA/IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGUgOiBudWxsLCBmaWVsZE5hbWUsIE5vdEZvdW5kKTsKKwllbHNlCisJCXJldHVybiBmaWVsZDsKK30KKy8qIEFQSQorCisJQW5zd2VyIHRoZSBtZXRob2QgYmluZGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLgorCVN0YXJ0IHRoZSBsb29rdXAgYXQgdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlci4KKwlJbnZvY2F0aW9uU2l0ZSBpbXBsZW1lbnRzIAorCQlpc1N1cGVyQWNjZXNzKCk7IHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGRpc2NvdmVyZWQgbWV0aG9kIGlzIHZpc2libGUuCisJCXNldERlcHRoKGludCk7IHRoaXMgaXMgdXNlZCB0byByZWNvcmQgdGhlIGRlcHRoIG9mIHRoZSBkaXNjb3ZlcmVkIG1ldGhvZAorCQkJcmVsYXRpdmUgdG8gdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlci4gKElmIHRoZSBtZXRob2QgaXMgZGVmaW5lZAorCQkJaW4gdGhlIGVuY2xvc2luZyB0eXBlIG9mIHRoZSByZWNlaXZlciwgdGhlIGRlcHRoIGlzIDA7IGluIHRoZSBuZXh0IGVuY2xvc2luZworCQkJdHlwZSwgdGhlIGRlcHRoIGlzIDE7IGFuZCBzbyBvbgorCisJSWYgbm8gdmlzaWJsZSBtZXRob2QgaXMgZGlzY292ZXJlZCwgYW4gZXJyb3IgYmluZGluZyBpcyBhbnN3ZXJlZC4KKyovCisKK3B1YmxpYyBNZXRob2RCaW5kaW5nIGdldEltcGxpY2l0TWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLCBjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKwlib29sZWFuIGluc2lkZVN0YXRpY0NvbnRleHQgPSBmYWxzZTsKKwlib29sZWFuIGluc2lkZUNvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOworCU1ldGhvZEJpbmRpbmcgZm91bmRNZXRob2QgPSBudWxsOworCVByb2JsZW1NZXRob2RCaW5kaW5nIGZvdW5kRnV6enlQcm9ibGVtID0gbnVsbDsgLy8gdGhlIHdlaXJkIG1ldGhvZCBsb29rdXAgY2FzZSAobWF0Y2hlcyBtZXRob2QgbmFtZSBpbiBzY29wZSwgdGhlbiBhcmcgdHlwZXMsIHRoZW4gdmlzaWJpbGl0eSkKKwlQcm9ibGVtTWV0aG9kQmluZGluZyBmb3VuZEluc2lkZVByb2JsZW0gPSBudWxsOyAvLyBpbnNpZGUgQ29uc3RydWN0b3IgY2FsbCBvciBpbnNpZGUgc3RhdGljIGNvbnRleHQKKwlTY29wZSBzY29wZSA9IHRoaXM7CisJYm9vbGVhbiBpc0V4YWN0TWF0Y2ggPSB0cnVlOworCS8vIHJldHJpZXZlIGFuIGV4YWN0IHZpc2libGUgbWF0Y2ggKGlmIHBvc3NpYmxlKQorCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9CisJCShmb3VuZE1ldGhvZCA9PSBudWxsKQorCQkJPyBmaW5kRXhhY3RNZXRob2QocmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpCisJCQk6IGZpbmRFeGFjdE1ldGhvZChyZWNlaXZlclR5cGUsIGZvdW5kTWV0aG9kLnNlbGVjdG9yLCBmb3VuZE1ldGhvZC5wYXJhbWV0ZXJzLCBpbnZvY2F0aW9uU2l0ZSk7CisvLwkJCQkJCT8gZmluZEV4YWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlKQorLy8JCQkJCQk6IGZpbmRFeGFjdE1ldGhvZChyZWNlaXZlclR5cGUsIGZvdW5kTWV0aG9kLnNlbGVjdG9yLCBmb3VuZE1ldGhvZC5wYXJhbWV0ZXJzLCBpbnZvY2F0aW9uU2l0ZSk7CisJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCAmJiBmb3VuZE1ldGhvZCA9PSBudWxsKSB7CisJCS8vIGFuc3dlcnMgY2xvc2VzdCBhcHByb3hpbWF0aW9uLCBtYXkgbm90IGNoZWNrIGFyZ3VtZW50VHlwZXMgb3IgdmlzaWJpbGl0eQorCQlpc0V4YWN0TWF0Y2ggPSBmYWxzZTsKKwkJbWV0aG9kQmluZGluZyA9IGZpbmRNZXRob2QocmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUpOworLy8JCQkJCW1ldGhvZEJpbmRpbmcgPSBmaW5kTWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlKTsKKwl9CisJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgeyAvLyBza2lwIGl0IGlmIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZworCQlpZiAobWV0aG9kQmluZGluZy5wcm9ibGVtSWQoKSA9PSBBbWJpZ3VvdXMpIHsKKwkJCWlmIChmb3VuZE1ldGhvZCA9PSBudWxsIHx8IGZvdW5kTWV0aG9kLnByb2JsZW1JZCgpID09IE5vdFZpc2libGUpCisJCQkJLy8gc3VwZXJjZWRlcyBhbnkgcG90ZW50aWFsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgcHJvYmxlbQorCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJZWxzZQorCQkJCS8vIG1ha2UgdGhlIHVzZXIgcXVhbGlmeSB0aGUgbWV0aG9kLCBsaWtlbHkgd2FudHMgdGhlIGZpcnN0IGluaGVyaXRlZCBtZXRob2QgKGphdmFjIGdlbmVyYXRlcyBhbiBhbWJpZ3VvdXMgZXJyb3IgaW5zdGVhZCkKKwkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKKwkJfQorCisJCVByb2JsZW1NZXRob2RCaW5kaW5nIGZ1enp5UHJvYmxlbSA9IG51bGw7CisJCVByb2JsZW1NZXRob2RCaW5kaW5nIGluc2lkZVByb2JsZW0gPSBudWxsOworCQlpZiAobWV0aG9kQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlpZiAoIWlzRXhhY3RNYXRjaCkgeworCQkJCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBhcmd1bWVudFR5cGVzKSkgeworCQkJCQlmdXp6eVByb2JsZW0gPSBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZywgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdEZvdW5kKTsKKwkJCQl9IGVsc2UgaWYgKCFjYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KG1ldGhvZEJpbmRpbmcsIHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKSB7CQorCQkJCQkvLyB1c2luZyA8Y2xhc3NTY29wZT4gaW5zdGVhZCBvZiA8dGhpcz4gZm9yIHZpc2liaWxpdHkgY2hlY2sgZG9lcyBncmFudCBhbGwgYWNjZXNzIHRvIGlubmVyY2xhc3MKKwkJCQkJZnV6enlQcm9ibGVtID0gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLCBOb3RWaXNpYmxlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZnV6enlQcm9ibGVtID09IG51bGwgJiYgIW1ldGhvZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWlmIChpbnNpZGVDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCQkJaW5zaWRlUHJvYmxlbSA9IG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIE5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsKKwkJCQl9IGVsc2UgaWYgKGluc2lkZVN0YXRpY0NvbnRleHQpIHsKKwkJCQkJaW5zaWRlUHJvYmxlbSA9IG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2RCaW5kaW5nLnNlbGVjdG9yLCBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIE5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlY2VpdmVyVHlwZSA9PSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzIHx8IChyZWNlaXZlclR5cGUuZ2V0TWV0aG9kcyhzZWxlY3RvcikpICE9IE5vTWV0aG9kcykgeworCQkJCS8vIGZvdW5kIGEgdmFsaWQgbWV0aG9kIGluIHRoZSAnaW1tZWRpYXRlJyBzY29wZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJLy8gT1IgdGhlIHJlY2VpdmVyVHlwZSBpbXBsZW1lbnRlZCBhIG1ldGhvZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWUKKwkJCQlpZiAoZm91bmRNZXRob2QgPT0gbnVsbCkgeworCQkJCQkvLyByZXR1cm4gdGhlIG1ldGhvZEJpbmRpbmcgaWYgaXQgaXMgbm90IGRlY2xhcmVkIGluIGEgc3VwZXJjbGFzcyBvZiB0aGUgc2NvcGUncyBiaW5kaW5nIChpLmUuICJpbmhlcml0ZWQiKQorCQkJCQlpZiAoZnV6enlQcm9ibGVtICE9IG51bGwpCisJCQkJCQlyZXR1cm4gZnV6enlQcm9ibGVtOworCQkJCQlpZiAoaW5zaWRlUHJvYmxlbSAhPSBudWxsKQorCQkJCQkJcmV0dXJuIGluc2lkZVByb2JsZW07CisJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJCX0KKwkJCQkvLyBpZiBhIG1ldGhvZCB3YXMgZm91bmQsIGNvbXBsYWluIHdoZW4gYW5vdGhlciBpcyBmb3VuZCBpbiBhbiAnaW1tZWRpYXRlJyBlbmNsb3NpbmcgdHlwZSAoaWUuIG5vdCBpbmhlcml0ZWQpCisJCQkJLy8gTk9URTogVW5saWtlIGZpZWxkcywgYSBub24gdmlzaWJsZSBtZXRob2QgaGlkZXMgYSB2aXNpYmxlIG1ldGhvZAorCQkJCWlmIChmb3VuZE1ldGhvZC5kZWNsYXJpbmdDbGFzcyAhPSBtZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSAvLyBpZS4gaGF2ZSB3ZSBmb3VuZCB0aGUgc2FtZSBtZXRob2QgLSBkbyBub3QgdHJ1c3QgZmllbGQgaWRlbnRpdHkgeWV0CisJCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZy5zZWxlY3RvciwgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZE1ldGhvZCA9PSBudWxsIHx8IChmb3VuZE1ldGhvZC5wcm9ibGVtSWQoKSA9PSBOb3RWaXNpYmxlICYmIG1ldGhvZEJpbmRpbmcucHJvYmxlbUlkKCkgIT0gTm90VmlzaWJsZSkpIHsKKwkJCS8vIG9ubHkgcmVtZW1iZXIgdGhlIG1ldGhvZEJpbmRpbmcgaWYgaXRzIHRoZSBmaXJzdCBvbmUgZm91bmQgb3IgdGhlIHByZXZpb3VzIG9uZSB3YXMgbm90IHZpc2libGUgJiBtZXRob2RCaW5kaW5nIGlzLi4uCisJCQkvLyByZW1lbWJlciB0aGF0IHByaXZhdGUgbWV0aG9kcyBhcmUgdmlzaWJsZSBpZiBkZWZpbmVkIGRpcmVjdGx5IGJ5IGFuIGVuY2xvc2luZyBjbGFzcworCQkJZm91bmRGdXp6eVByb2JsZW0gPSBmdXp6eVByb2JsZW07CisJCQlmb3VuZEluc2lkZVByb2JsZW0gPSBpbnNpZGVQcm9ibGVtOworCQkJaWYgKGZ1enp5UHJvYmxlbSA9PSBudWxsKQorCQkJCWZvdW5kTWV0aG9kID0gbWV0aG9kQmluZGluZzsgLy8gb25seSBrZWVwIGl0IGlmIG5vIGVycm9yIHdhcyBmb3VuZAorCQl9CisJfQorCWluc2lkZVN0YXRpY0NvbnRleHQgfD0gcmVjZWl2ZXJUeXBlLmlzU3RhdGljKCk7CisJLy8gMUVYNUk4WiAtIGFjY2Vzc2luZyBvdXRlciBmaWVsZHMgd2l0aGluIGEgY29uc3RydWN0b3IgY2FsbCBpcyBwZXJtaXR0ZWQKKwkvLyBpbiBvcmRlciB0byBkbyBzbywgd2UgY2hhbmdlIHRoZSBmbGFnIGFzIHdlIGV4aXQgZnJvbSB0aGUgdHlwZSwgbm90IHRoZSBtZXRob2QKKwkvLyBpdHNlbGYsIGJlY2F1c2UgdGhlIGNsYXNzIHNjb3BlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpZWxkcy4KKwlNZXRob2RTY29wZSBlbmNsb3NpbmdNZXRob2RTY29wZSA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7CisJaW5zaWRlQ29uc3RydWN0b3JDYWxsID0gZW5jbG9zaW5nTWV0aG9kU2NvcGUgPT0gbnVsbCA/IGZhbHNlIDogZW5jbG9zaW5nTWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGw7CisKKwlpZiAoZm91bmRGdXp6eVByb2JsZW0gIT0gbnVsbCkKKwkJcmV0dXJuIGZvdW5kRnV6enlQcm9ibGVtOworCWlmIChmb3VuZEluc2lkZVByb2JsZW0gIT0gbnVsbCkKKwkJcmV0dXJuIGZvdW5kSW5zaWRlUHJvYmxlbTsKKwlpZiAoZm91bmRNZXRob2QgIT0gbnVsbCkKKwkJcmV0dXJuIGZvdW5kTWV0aG9kOworCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdEZvdW5kKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWI0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJpbmFyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21wb3VuZEFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbnRMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbUZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKKworLyoqCisgKiBBIHNpbmdsZSBuYW1lIHJlZmVyZW5jZSBpbnNpZGUgYSBjb2RlIHNuaXBwZXQgY2FuIGRlbm90ZSBhIGZpZWxkIG9mIGEgcmVtb3RlCisgKiByZWNlaXZlciBvYmplY3QgKGkuZS4mbmJzcDt0aGUgb25lIG9mIHRoZSBjb250ZXh0IGluIHRoZSBzdGFjayBmcmFtZSkuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2RlU25pcHBldFNpbmdsZU5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVOYW1lUmVmZXJlbmNlIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cywgSW52b2NhdGlvblNpdGUsIFByb2JsZW1SZWFzb25zIHsKKworCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0OworCUZpZWxkQmluZGluZyBkZWxlZ2F0ZVRoaXM7CitwdWJsaWMgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgeworCXN1cGVyKHNvdXJjZSwgcG9zKTsKKwl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7Cit9CitwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbywgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CisJCWNhc2UgRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKKwkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAorCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKKwkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKSkgeworCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIExPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmc7CisJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykpIHsKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCX0KKwkJCWlmICghZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpIGxvY2FsQmluZGluZy51c2VkID0gdHJ1ZTsJCQkKKwl9CisJcmV0dXJuIGZsb3dJbmZvOworfQorLyoqCisgKiBDaGVjayBhbmQvb3IgcmVkaXJlY3QgdGhlIGZpZWxkIGFjY2VzcyB0byB0aGUgZGVsZWdhdGUgcmVjZWl2ZXIgaWYgYW55CisgKi8KK3B1YmxpYyBUeXBlQmluZGluZyBjaGVja0ZpZWxkQWNjZXNzKEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCWlmIChkZWxlZ2F0ZVRoaXMgPT0gbnVsbCkgcmV0dXJuIHN1cGVyLmNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOworCQorCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCWJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKKwliaXRzIHw9IEZJRUxEOworCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJLy8gbXVzdCBjaGVjayBmb3IgdGhlIHN0YXRpYyBzdGF0dXMuLi4uCisJCWlmICh0aGlzLmV2YWx1YXRpb25Db250ZXh0LmlzU3RhdGljKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdGF0aWNGaWVsZEFjY2Vzc1RvTm9uU3RhdGljVmFyaWFibGUoCisJCQkJdGhpcywKKwkJCQlmaWVsZEJpbmRpbmcpOworCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkQmluZGluZywgdHJ1ZSwgdGhpcywgc2NvcGUsIDApOworCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZEJpbmRpbmcsIHNjb3BlKSkKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisKKwlyZXR1cm4gZmllbGRCaW5kaW5nLnR5cGU7CisKK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJLy8gb3B0aW1pemluZyBhc3NpZ25tZW50IGxpa2U6IGkgPSBpICsgMSBvciBpID0gMSArIGkKKwlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uLmlzQ29tcGFjdGFibGVPcGVyYXRpb24oKSkgeworCQlCaW5hcnlFeHByZXNzaW9uIG9wZXJhdGlvbiA9IChCaW5hcnlFeHByZXNzaW9uKSBhc3NpZ25tZW50LmV4cHJlc3Npb247CisJCVNpbmdsZU5hbWVSZWZlcmVuY2UgdmFyaWFibGVSZWZlcmVuY2U7CisJCWlmICgob3BlcmF0aW9uLmxlZnQgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSAmJiAoKHZhcmlhYmxlUmVmZXJlbmNlID0gKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG9wZXJhdGlvbi5sZWZ0KS5iaW5kaW5nID09IGJpbmRpbmcpKSB7CisJCQkvLyBpID0gaSArIHZhbHVlLCB0aGVuIHVzZSB0aGUgdmFyaWFibGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSwgc2luY2UgaXQgaGFzIHRoZSBjb3JyZWN0IGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCXZhcmlhYmxlUmVmZXJlbmNlLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgc3ludGhldGljQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljQWNjZXNzb3JzW1dSSVRFXSwgb3BlcmF0aW9uLnJpZ2h0LCAob3BlcmF0aW9uLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQsIG9wZXJhdGlvbi5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAvKnNob3VsZCBiZSBlcXVpdmFsZW50IHRvIG5vIGNvbnZlcnNpb24qLywgdmFsdWVSZXF1aXJlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IG9wZXJhdG9yID0gKG9wZXJhdGlvbi5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUOworCQlpZiAoKG9wZXJhdGlvbi5yaWdodCBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpCisJCQkmJiAoKG9wZXJhdG9yID09IFBMVVMpIHx8IChvcGVyYXRvciA9PSBNVUxUSVBMWSkpIC8vIG9ubHkgY29tbXV0YXRpdmUgb3BlcmF0aW9ucworCQkJJiYgKCh2YXJpYWJsZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBvcGVyYXRpb24ucmlnaHQpLmJpbmRpbmcgPT0gYmluZGluZykKKwkJCSYmIChvcGVyYXRpb24ubGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIC8vIGV4Y2x1ZGUgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zLCBzaW5jZSBjb3VsZCBoYXZlIHNpZGUtZWZmZWN0CisJCQkmJiAoKG9wZXJhdGlvbi5sZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAhPSBUX1N0cmluZykgLy8gZXhjbHVkZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3aGljaCB3b3VsZCBvY2N1ciBiYWNrd2FyZHMKKwkJCSYmICgob3BlcmF0aW9uLnJpZ2h0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAhPSBUX1N0cmluZykpIHsgLy8gZXhjbHVkZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3aGljaCB3b3VsZCBvY2N1ciBiYWNrd2FyZHMKKwkJCS8vIGkgPSB2YWx1ZSArIGksIHRoZW4gdXNlIHRoZSB2YXJpYWJsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBzaW5jZSBpdCBoYXMgdGhlIGNvcnJlY3QgaW1wbGljaXQgY29udmVyc2lvbgorCQkJdmFyaWFibGVSZWZlcmVuY2UuZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBzeW50aGV0aWNBY2Nlc3NvcnMgPT0gbnVsbCA/IG51bGwgOiBzeW50aGV0aWNBY2Nlc3NvcnNbV1JJVEVdLCBvcGVyYXRpb24ubGVmdCwgb3BlcmF0b3IsIG9wZXJhdGlvbi5yaWdodC5pbXBsaWNpdENvbnZlcnNpb24gLypzaG91bGQgYmUgZXF1aXZhbGVudCB0byBubyBjb252ZXJzaW9uKi8sIHZhbHVlUmVxdWlyZWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBGSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCWlmIChmaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgeworCQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CisJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJZmllbGRTdG9yZShjb2RlU3RyZWFtLCBmaWVsZEJpbmRpbmcsIG51bGwsIHZhbHVlUmVxdWlyZWQpOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7IC8vIG5lZWQgYSByZWNlaXZlcj8KKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJLy8gbm90IHlldCBzdXBwb3J0ZWQKKwkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRoaXMuZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCQl9CisJCQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWlmICgoZmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCQl9CisJCQkJfQorCQkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkV3JpdGVBY2Nlc3NGb3JGaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJCX0KKwkJCX0KKwkJCXJldHVybjsKKwkJY2FzZSBMT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlCisJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29kZWdlbkJpbmRpbmc7CisJCQlpZiAobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKKwkJCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhc3NpZ25tZW50LmV4cHJlc3Npb24uY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCS8vIGFzc2lnbmluZyBhbiB1bnVzZWQgbG9jYWwgdG8gYSBjb25zdGFudCB2YWx1ZSA9IG5vIGFjdHVhbCBhc3NpZ25tZW50IGlzIG5lY2Vzc2FyeQorCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGFzc2lnbm1lbnQuZXhwcmVzc2lvbi5jb25zdGFudCwgYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJCQkvKiBFdmVuIHRob3VnaCB0aGUgdmFsdWUgbWF5IG5vdCBiZSByZXF1aXJlZCwgd2UgZm9yY2UgaXQgdG8gYmUgcHJvZHVjZWQsIGFuZCBkaXNjYXJkIGl0IGxhdGVyCisJCQkJCW9uIGlmIGl0IHdhcyBhY3R1YWxseSBub3QgbmVjZXNzYXJ5LCBzbyBhcyB0byBwcm92aWRlIHRoZSBzYW1lIGJlaGF2aW9yIGFzIEpESzEuMmJldGEzLgkqLworCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7IC8vIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgobG9jYWxCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChsb2NhbEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJCWNvZGVTdHJlYW0ucG9wMigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIG5vcm1hbCBsb2NhbCBhc3NpZ25tZW50IChzaW5jZSBjYW5ub3Qgc3RvcmUgaW4gb3V0ZXIgbG9jYWwgd2hpY2ggYXJlIGZpbmFsIGxvY2F0aW9ucykKKwkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCWlmICgoYml0cyAmIEZpcnN0QXNzaWdubWVudFRvTG9jYWxNQVNLKSAhPSAwKSB7IC8vIGZvciBsb2NhbCB2YXJpYWJsZSBkZWJ1ZyBhdHRyaWJ1dGVzCisJCQkJbG9jYWxCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKKwkJCX0KKwkJCS8vIGltcGxpY2l0IGNvbnZlcnNpb24KKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50LmltcGxpY2l0Q29udmVyc2lvbik7CisJCQl9CisJfQorfQorcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBGSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nKS5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQpIHsgLy8gZGlyZWN0bHkgdXNlIGlubGluZWQgdmFsdWUgZm9yIGNvbnN0YW50IGZpZWxkcworCQkJCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCQkJCSAvLyBkaXJlY3RseSB1c2UgaW5saW5lZCB2YWx1ZSBmb3IgY29uc3RhbnQgZmllbGRzCisJCQkJCQkJYm9vbGVhbiBpc1N0YXRpYzsKKwkJCQkJCQlpZiAoIShpc1N0YXRpYyA9IGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSkgeworCQkJCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7CisJCQkJCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7CisJCQkJCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKKwkJCQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkvLyBtYW5hZ2luZyBwcml2YXRlIGFjY2VzcwkJCQkJCQkKKwkJCQkJCQlpZiAoaXNTdGF0aWMpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMoZmllbGRCaW5kaW5nKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmdldGZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBtYW5hZ2luZyBwcml2YXRlIGFjY2VzcworCQkJCQkJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJCQkJLy8gbm90IHlldCBzdXBwb3J0ZWQKKwkJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQkJCQkJfQorCQkJCQkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKWNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQkJfSBlbHNlIHsgLy8gZGlyZWN0bHkgdXNlIHRoZSBpbmxpbmVkIHZhbHVlCisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoZmllbGRCaW5kaW5nLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBMT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbAorCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQkvLyBvdXRlciBsb2NhbD8KKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQkvLyBvdXRlciBsb2NhbCBjYW4gYmUgcmVhY2hlZCBlaXRoZXIgdGhyb3VnaCBhIHN5bnRoZXRpYyBhcmcgb3IgYSBzeW50aGV0aWMgZmllbGQKKwkJCQkJCVZhcmlhYmxlQmluZGluZ1tdIHBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChsb2NhbEJpbmRpbmcpOworCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgeworCQkJCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQorCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyByZWd1bGFyIGxvY2FsIHZhcmlhYmxlIHJlYWQKKwkJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQl9CisJCX0KKwl9CisJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKK30KKy8qCisgKiBUaGUgQVBJcyB3aXRoIGFuIGV4dHJhIGFyZ3VtZW50IGlzIHVzZWQgd2hlbmV2ZXIgdGhlcmUgYXJlIHR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHZhcmlhYmxlIHdoaWNoCisgKiBhcmUgb3B0aW1pemVkIGluIG9uZSBhY2Nlc3M6IGUuZyAiYSA9IGEgKyAxIiBvcHRpbWl6ZWQgaW50byAiYSsrIi4KKyAqLworcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgTWV0aG9kQmluZGluZyB3cml0ZUFjY2Vzc29yLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBGSUVMRCA6IC8vIGFzc2lnbmluZyB0byBhIGZpZWxkCisJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCWlmIChmaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMoZmllbGRCaW5kaW5nKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZQorCQkJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRpb25Gb3JGaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisKKwkJCQkJLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHZhbHVlCisJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChmaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgeworCQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0CisJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKKwkJCQkJCS8vIG5vdCB5ZXQgc3VwcG9ydGVkCisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJCX0KKwkJCQkJLy8gdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUKKwkJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKKworCQkJCQkvLyB1c2VkIHRvIHJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBMT0NBTCA6IC8vIGFzc2lnbmluZyB0byBhIGxvY2FsIHZhcmlhYmxlIChjYW5ub3QgYXNzaWduIHRvIG91dGVyIGxvY2FsKQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJQ29uc3RhbnQgYXNzaWduQ29uc3RhbnQ7CisJCQlpbnQgaW5jcmVtZW50OworCQkJLy8gdXNpbmcgaW5jciBieXRlY29kZSBpZiBwb3NzaWJsZQorCQkJc3dpdGNoIChsb2NhbEJpbmRpbmcudHlwZS5pZCkgeworCQkJCWNhc2UgVF9TdHJpbmcgOgorCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgdGhpcywgZXhwcmVzc2lvbik7CisJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cCgpOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0uc3RvcmUobG9jYWxCaW5kaW5nLCBmYWxzZSk7CisJCQkJCXJldHVybjsKKwkJCQljYXNlIFRfaW50IDoKKwkJCQkJaWYgKCgoYXNzaWduQ29uc3RhbnQgPSBleHByZXNzaW9uLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQpIAorCQkJCQkJJiYgKGFzc2lnbkNvbnN0YW50LnR5cGVJRCgpICE9IFRfZmxvYXQpIC8vIG9ubHkgZm9yIGludGVncmFsIHR5cGVzCisJCQkJCQkmJiAoYXNzaWduQ29uc3RhbnQudHlwZUlEKCkgIT0gVF9kb3VibGUpCQkKKwkJCQkJCSYmICgoaW5jcmVtZW50ID0gYXNzaWduQ29uc3RhbnQuaW50VmFsdWUoKSkgPT0gKHNob3J0KSBpbmNyZW1lbnQpKSB7IC8vIDE2IGJpdHMgdmFsdWUKKwkJCQkJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCQkJCQljYXNlIFBMVVMgOgorCQkJCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIGluY3JlbWVudCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJY2FzZSBNSU5VUyA6CisJCQkJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgLWluY3JlbWVudCk7CisJCQkJCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQlkZWZhdWx0IDoKKwkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQl9CisJfQorCS8vIHBlcmZvcm0gdGhlIGFjdHVhbCBjb21wb3VuZCBvcGVyYXRpb24KKwlpbnQgb3BlcmF0aW9uVHlwZUlEOworCWlmICgob3BlcmF0aW9uVHlwZUlEID0gaW1wbGljaXRDb252ZXJzaW9uID4+IDQpID09IFRfU3RyaW5nIHx8IG9wZXJhdGlvblR5cGVJRCA9PSBUX09iamVjdCkgeworCQljb2RlU3RyZWFtLmdlbmVyYXRlU3RyaW5nQXBwZW5kKGN1cnJlbnRTY29wZSwgbnVsbCwgZXhwcmVzc2lvbik7CisJfSBlbHNlIHsKKwkJLy8gcHJvbW90ZSB0aGUgYXJyYXkgcmVmZXJlbmNlIHRvIHRoZSBzdWl0YWJsZSBvcGVyYXRpb24gdHlwZQorCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CisJCS8vIGdlbmVyYXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgKHdpbGwgYnkgaXRzZWxmICBiZSBwcm9tb3RlZCB0byB0aGUgb3BlcmF0aW9uIHZhbHVlKQorCQlpZiAoZXhwcmVzc2lvbiA9PSBJbnRMaXRlcmFsLk9uZSl7IC8vIHByZWZpeCBvcGVyYXRpb24KKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwkJCQorCQl9IGVsc2UgeworCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJfQkJCisJCS8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorCQljb2RlU3RyZWFtLnNlbmRPcGVyYXRvcihvcGVyYXRvciwgb3BlcmF0aW9uVHlwZUlEKTsKKwkJLy8gY2FzdCB0aGUgdmFsdWUgYmFjayB0byB0aGUgYXJyYXkgcmVmZXJlbmNlIHR5cGUKKwkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwl9CisJLy8gc3RvcmUgdGhlIHJlc3VsdCBiYWNrIGludG8gdGhlIHZhcmlhYmxlCisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCWZpZWxkU3RvcmUoY29kZVN0cmVhbSwgZmllbGRCaW5kaW5nLCB3cml0ZUFjY2Vzc29yLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gY3VycmVudCBzdGFjayBpczoKKwkJCQkvLyBmaWVsZCByZWNlaXZlciB2YWx1ZQorCQkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJCWlmICgoZmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJY29kZVN0cmVhbS5kdXAyX3gyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cF94MigpOworCQkJCQl9CisJCQkJfQorCQkJCS8vIGN1cnJlbnQgc3RhY2sgaXM6CisJCQkJLy8gdmFsdWUgZmllbGQgcmVjZWl2ZXIgdmFsdWUJCQkJCisJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQl9CisJCQlyZXR1cm47CisJCWNhc2UgTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQlpZiAoKGxvY2FsQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobG9jYWxCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAyKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQl9CisJCQl9CisJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOworCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEZJRUxEIDogLy8gYXNzaWduaW5nIHRvIGEgZmllbGQKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgeworCQkJCWlmIChmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhmaWVsZEJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKKwkJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKKwkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAorCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQl9CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLy8gU3RhY2s6ICBbb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0gIC0tLT4gW29sZCBmaWVsZCB2YWx1ZV1bb3duZXJdW29sZCBmaWVsZCB2YWx1ZV0KKwkJCQkJCWlmICgoZmllbGRCaW5kaW5nLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChmaWVsZEJpbmRpbmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCQkJCWNvZGVTdHJlYW0uZHVwMl94MSgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChwb3N0SW5jcmVtZW50LmV4cHJlc3Npb24uY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgZmllbGRCaW5kaW5nLnR5cGUuaWQpOworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24ocG9zdEluY3JlbWVudC5hc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGZpZWxkQmluZGluZywgbnVsbCwgZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKKwkJCQkJCS8vIG5vdCB5ZXQgc3VwcG9ydGVkCisJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOworCQkJCQl9CisJCQkJfQorCQkJCSgoQ29kZVNuaXBwZXRDb2RlU3RyZWFtKSBjb2RlU3RyZWFtKS5nZW5lcmF0ZUVtdWxhdGVkUmVhZEFjY2Vzc0ZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKKwkJCQkJaWYgKChmaWVsZEJpbmRpbmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGZpZWxkQmluZGluZy50eXBlID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQkJCQljb2RlU3RyZWFtLmR1cDIoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZGVTdHJlYW0uZHVwKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0aW9uRm9yRmllbGQoZmllbGRCaW5kaW5nKTsKKwkJCQlpZiAoKGZpZWxkQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAoZmllbGRCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJY29kZVN0cmVhbS5kdXBfeDIoKTsKKwkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJaWYgKGZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOworCQkJCQl9CisJCQkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CisJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CQkJCQkKKwkJCQl9IGVsc2UgeworCQkJCQljb2RlU3RyZWFtLmR1cF94MSgpOworCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQlpZiAoZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CisJCQkJCX0KKwkJCQkJY29kZVN0cmVhbS5kdXBfeDEoKTsKKwkJCQkJY29kZVN0cmVhbS5wb3AoKTsJCQkJCQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGZpZWxkQmluZGluZy50eXBlLmlkKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQuYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7CisJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRXcml0ZUFjY2Vzc0ZvckZpZWxkKGZpZWxkQmluZGluZyk7CisJCQl9CisJCQlyZXR1cm47CisJCWNhc2UgTE9DQUwgOiAvLyBhc3NpZ25pbmcgdG8gYSBsb2NhbCB2YXJpYWJsZQorCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJLy8gdXNpbmcgaW5jciBieXRlY29kZSBpZiBwb3NzaWJsZQorCQkJaWYgKGxvY2FsQmluZGluZy50eXBlID09IEludEJpbmRpbmcpIHsKKwkJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKKwkJCQl9CisJCQkJaWYgKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IgPT0gUExVUykgeworCQkJCQljb2RlU3RyZWFtLmlpbmMobG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb24sIDEpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0uaWluYyhsb2NhbEJpbmRpbmcucmVzb2x2ZWRQb3NpdGlvbiwgLTEpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJaWYgKHZhbHVlUmVxdWlyZWQpeworCQkJCQlpZiAoKGxvY2FsQmluZGluZy50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobG9jYWxCaW5kaW5nLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKKwkJCQkJCWNvZGVTdHJlYW0uZHVwMigpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQocG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOworCQkJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIGxvY2FsQmluZGluZy50eXBlLmlkKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKHBvc3RJbmNyZW1lbnQuYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7CisKKwkJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgZmFsc2UpOworCQkJfQorCX0KK30KK3B1YmxpYyB2b2lkIGdlbmVyYXRlUmVjZWl2ZXIoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CisJY29kZVN0cmVhbS5hbG9hZF8wKCk7CisJaWYgKGRlbGVnYXRlVGhpcyAhPSBudWxsKSBjb2RlU3RyZWFtLmdldGZpZWxkKGRlbGVnYXRlVGhpcyk7IC8vIGRlbGVnYXRlZCBmaWVsZCBhY2Nlc3MKK30KKy8qKgorICogQ2hlY2sgYW5kL29yIHJlZGlyZWN0IHRoZSBmaWVsZCBhY2Nlc3MgdG8gdGhlIGRlbGVnYXRlIHJlY2VpdmVyIGlmIGFueQorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0UmVjZWl2ZXJUeXBlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CisJaWYgKHJlY2VpdmVyVHlwZSAhPSBudWxsKSByZXR1cm4gcmVjZWl2ZXJUeXBlOworCVNjb3BlIHNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKKwl3aGlsZSAodHJ1ZSkgeworCQkJc3dpdGNoIChzY29wZS5raW5kKSB7CisJCQkJY2FzZSBTY29wZS5DTEFTU19TQ09QRSA6CisJCQkJCXJldHVybiByZWNlaXZlclR5cGUgPSAoKENsYXNzU2NvcGUpIHNjb3BlKS5yZWZlcmVuY2VDb250ZXh0LmJpbmRpbmc7CisJCQkJZGVmYXVsdDoKKwkJCQkJc2NvcGUgPSBzY29wZS5wYXJlbnQ7CisJCQl9CisJfQorfQorLyoqCisgKiBOb3JtYWwgZmllbGQgYmluZGluZyBkaWQgbm90IHdvcmssIHRyeSB0byBiaW5kIHRvIGEgZmllbGQgb2YgdGhlIGRlbGVnYXRlIHJlY2VpdmVyLgorICovCitwdWJsaWMgVHlwZUJpbmRpbmcgcmVwb3J0RXJyb3IoQmxvY2tTY29wZSBzY29wZSkgeworCisJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtRmllbGRCaW5kaW5nICYmICgoUHJvYmxlbUZpZWxkQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpeworCQlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5kZWNsYXJpbmdUeXBlTmFtZSAhPSBudWxsKSB7CisJCQlkZWxlZ2F0ZVRoaXMgPSBzY29wZS5nZXRGaWVsZChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIERFTEVHQVRFX1RISVMsIHRoaXMpOworCQkJaWYgKGRlbGVnYXRlVGhpcyAhPSBudWxsKXsgOyAvLyBpZiBub3QgZm91bmQgdGhlbiBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAorCQkJCS8vIHdpbGwgbm90IHN1cHBvcnQgaW5uZXJjbGFzcyBlbXVsYXRpb24gaW5zaWRlIGRlbGVnYXRlCisJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGJpbmRpbmcgPSBzY29wZS5nZXRGaWVsZChkZWxlZ2F0ZVRoaXMudHlwZSwgdGhpcy50b2tlbiwgdGhpcyk7CisJCQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiBzdXBlci5yZXBvcnRFcnJvcihzY29wZSk7CisJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOworCQkJfQorCQl9CisJfQorCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbUJpbmRpbmcgJiYgKChQcm9ibGVtQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90Rm91bmQpeworCQlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5kZWNsYXJpbmdUeXBlTmFtZSAhPSBudWxsKSB7CisJCQlkZWxlZ2F0ZVRoaXMgPSBzY29wZS5nZXRGaWVsZChzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksIERFTEVHQVRFX1RISVMsIHRoaXMpOworCQkJaWYgKGRlbGVnYXRlVGhpcyAhPSBudWxsKXsgOyAvLyBpZiBub3QgZm91bmQgdGhlbiBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAorCQkJCS8vIHdpbGwgbm90IHN1cHBvcnQgaW5uZXJjbGFzcyBlbXVsYXRpb24gaW5zaWRlIGRlbGVnYXRlCisJCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IHNjb3BlLmdldEZpZWxkKGRlbGVnYXRlVGhpcy50eXBlLCB0aGlzLnRva2VuLCB0aGlzKTsKKwkJCQlpZiAoIWZpZWxkQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCWlmICgoKFByb2JsZW1GaWVsZEJpbmRpbmcpIGZpZWxkQmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkgeworCQkJCQkJLy8gbWFuYWdlIHRoZSBhY2Nlc3MgdG8gYSBwcml2YXRlIGZpZWxkIG9mIHRoZSBlbmNsb3NpbmcgdHlwZQorCQkJCQkJQ29kZVNuaXBwZXRTY29wZSBsb2NhbFNjb3BlID0gbmV3IENvZGVTbmlwcGV0U2NvcGUoc2NvcGUpOworCQkJCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGJpbmRpbmcgPSBsb2NhbFNjb3BlLmdldEZpZWxkRm9yQ29kZVNuaXBwZXQoZGVsZWdhdGVUaGlzLnR5cGUsIHRoaXMudG9rZW4sIHRoaXMpOworCQkJCQkJcmV0dXJuIGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOwkJCQkJCQorCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gYmluZGluZyA9IGZpZWxkQmluZGluZzsKKwkJCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTa2VsZXRvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlOGMwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTa2VsZXRvbi5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlOZXN0ZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogVGhlIHNrZWxldG9uIG9mIHRoZSBjbGFzcyAnb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwudGFyZ2V0LkNvZGVTbmlwcGV0JworICogdXNlZCBhdCBjb21waWxlIHRpbWUuIE5vdGUgdGhhdCB0aGUgbWV0aG9kIHJ1bigpIGlzIGRlY2xhcmVkIHRvCisgKiB0aHJvdyBUaHJvd2FibGUgc28gdGhhdCB0aGUgdXNlciBjYW4gd3JpdGUgYSBjb2RlIHNuaXBldCB0aGF0CisgKiB0aHJvd3MgY2hlY2tlZCBleGNlcHRpbyB3aXRob3V0IGhhdmluZyB0byBjYXRjaCB0aG9zZS4KKyAqLworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0U2tlbGV0b24gaW1wbGVtZW50cyBJQmluYXJ5VHlwZSwgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJSUJpbmFyeU1ldGhvZFtdIG1ldGhvZHMgPSBuZXcgSUJpbmFyeU1ldGhvZFtdIHsKKwkJbmV3IEJpbmFyeU1ldGhvZFNrZWxldG9uKAorCQkJIjxpbml0PiIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAorCQkJIigpViIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAorCQkJbmV3IGNoYXJbXVtdIHt9LAorCQkJdHJ1ZQorCQkpLAorCQluZXcgQmluYXJ5TWV0aG9kU2tlbGV0b24oCisJCQkicnVuIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCQkiKClWIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCQluZXcgY2hhcltdW10geyJqYXZhL2xhbmcvVGhyb3dhYmxlIi50b0NoYXJBcnJheSgpfSwgLy8kTk9OLU5MUy0xJAorCQkJZmFsc2UKKwkJKSwKKwkJbmV3IEJpbmFyeU1ldGhvZFNrZWxldG9uKAorCQkJInNldFJlc3VsdCIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAorCQkJIihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL0NsYXNzOylWIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCisJCQluZXcgY2hhcltdW10ge30sCisJCQlmYWxzZQorCQkpCisJfTsKKworCXB1YmxpYyBjbGFzcyBCaW5hcnlNZXRob2RTa2VsZXRvbiBpbXBsZW1lbnRzIElCaW5hcnlNZXRob2QgeworCQljaGFyW11bXSBleGNlcHRpb25UeXBlTmFtZXM7CisJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yOworCQljaGFyW10gc2VsZWN0b3I7CisJCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcjsKKwkJCisJCXB1YmxpYyBCaW5hcnlNZXRob2RTa2VsZXRvbihjaGFyW10gc2VsZWN0b3IsIGNoYXJbXSBtZXRob2REZXNjcmlwdG9yLCBjaGFyW11bXSBleGNlcHRpb25UeXBlTmFtZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworCQkJdGhpcy5tZXRob2REZXNjcmlwdG9yID0gbWV0aG9kRGVzY3JpcHRvcjsKKwkJCXRoaXMuZXhjZXB0aW9uVHlwZU5hbWVzID0gZXhjZXB0aW9uVHlwZU5hbWVzOworCQkJdGhpcy5pc0NvbnN0cnVjdG9yID0gdGhpcy5pc0NvbnN0cnVjdG9yOworCQl9CisJCQorCQlwdWJsaWMgY2hhcltdW10gZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCkgeworCQkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uVHlwZU5hbWVzOworCQl9CisJCQorCQlwdWJsaWMgY2hhcltdIGdldE1ldGhvZERlc2NyaXB0b3IoKSB7CisJCQlyZXR1cm4gdGhpcy5tZXRob2REZXNjcmlwdG9yOworCQl9CisJCQorCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJCXJldHVybiBJQ29uc3RhbnRzLkFjY1B1YmxpYzsKKwkJfQorCQkKKwkJcHVibGljIGNoYXJbXSBnZXRTZWxlY3RvcigpIHsKKwkJCXJldHVybiB0aGlzLnNlbGVjdG9yOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc0NsaW5pdCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKwkJCXJldHVybiB0aGlzLmlzQ29uc3RydWN0b3I7CisJCX0KKwkJLyoqCisJCSAqIEBzZWUgSUdlbmVyaWNNZXRob2QjZ2V0QXJndW1lbnROYW1lcygpCisJCSAqLworCQlwdWJsaWMgY2hhcltdW10gZ2V0QXJndW1lbnROYW1lcygpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisNCit9CisJCisvKioKKyAqIENvZGVTbmlwcGV0U2tlbGV0b24gY29uc3RydWN0b3IgY29tbWVudC4KKyAqLworcHVibGljIENvZGVTbmlwcGV0U2tlbGV0b24oKSB7CisJc3VwZXIoKTsKK30KK3B1YmxpYyBjaGFyW10gZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSB7CisJcmV0dXJuIG51bGw7Cit9CitwdWJsaWMgSUJpbmFyeUZpZWxkW10gZ2V0RmllbGRzKCkgeworCXJldHVybiBudWxsOworfQorcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ09ERV9TTklQUEVUX05BTUUsICIuamF2YSIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKK30KK3B1YmxpYyBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBJQmluYXJ5TmVzdGVkVHlwZVtdIGdldE1lbWJlclR5cGVzKCkgeworCXJldHVybiBudWxsOworfQorcHVibGljIElCaW5hcnlNZXRob2RbXSBnZXRNZXRob2RzKCkgeworCXJldHVybiB0aGlzLm1ldGhvZHM7Cit9CitwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwlyZXR1cm4gSUNvbnN0YW50cy5BY2NQdWJsaWM7Cit9CitwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7CisJcmV0dXJuIENPREVfU05JUFBFVF9OQU1FOworfQorcHVibGljIGNoYXJbXSBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KK3B1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBib29sZWFuIGlzTWVtYmVyKCkgeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBjaGFyW10gc291cmNlRmlsZU5hbWUoKSB7CisJcmV0dXJuIG51bGw7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOWI4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3VwZXJSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuSW52b2NhdGlvblNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKKy8qKgorICogQSBzdXBlciByZWZlcmVuY2UgaW5zaWRlIGEgY29kZSBzbmlwcGV0IGRlbm90ZXMgYSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyIHR5cGUgb2YgCisgKiB0aGUgcmVtb3RlIHJlY2VpdmVyIG9iamVjdCAoaS5lLiZuYnNwO3RoZSBvbmUgb2YgdGhlIGNvbnRleHQgaW4gdGhlIHN0YWNrIGZyYW1lKS4gVGhpcyBpcyAKKyAqIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yIHRocm91Z2ggSmF2YU1vZGVsRXhjZXB0aW9uIGFjY29yZGluZyB0byB0aGUgZmFjdCB0aGF0IHN1cGVyCisgKiByZWZlcmVuY2UgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gY29kZSBzbmlwcGV0LgorICovCitwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZSBleHRlbmRzIFN1cGVyUmVmZXJlbmNlIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cywgSW52b2NhdGlvblNpdGUgeworCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0OworCQorcHVibGljIENvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UoaW50IHBvcywgaW50IHNvdXJjZUVuZCwgCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0KSB7CisJc3VwZXIocG9zLCBzb3VyY2VFbmQpOworCXRoaXMuZXZhbHVhdGlvbkNvbnRleHQgPSBldmFsdWF0aW9uQ29udGV4dDsKK30KKworcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90VXNlU3VwZXJJbkNvZGVTbmlwcGV0KHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbnVsbDsKK30KK3B1YmxpYyBib29sZWFuIGlzU3VwZXJBY2Nlc3MoKXsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgYm9vbGVhbiBpc1R5cGVBY2Nlc3MoKXsKKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgdm9pZCBzZXRBY3R1YWxSZWNlaXZlclR5cGUoUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsKKwkvLyBpZ25vcmVkCit9CitwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpeworCS8vIGlnbm9yZWQKK30KK3B1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGluZGV4KXsKKwkvLyBpZ25vcmVkCit9CisKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5OTI2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRoaXNSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5JbnZvY2F0aW9uU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOworCisvKioKKyAqIEEgdGhpcyByZWZlcmVuY2UgaW5zaWRlIGEgY29kZSBzbmlwcGV0IGRlbm90ZXMgYSByZW1vdGUKKyAqIHJlY2VpdmVyIG9iamVjdCAoaS5lLiZuYnNwO3RoZSBvbmUgb2YgdGhlIGNvbnRleHQgaW4gdGhlIHN0YWNrCisgKiBmcmFtZSkKKyAqLworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZSBleHRlbmRzIFRoaXNSZWZlcmVuY2UgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzLCBJbnZvY2F0aW9uU2l0ZSB7CisJRXZhbHVhdGlvbkNvbnRleHQgZXZhbHVhdGlvbkNvbnRleHQ7CisJRmllbGRCaW5kaW5nIGRlbGVnYXRlVGhpczsKKwlib29sZWFuIGlzSW1wbGljaXQ7CisvKioKKyAqIENvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQHBhcmFtIHMgaW50CisgKiBAcGFyYW0gc291cmNlRW5kIGludAorICovCitwdWJsaWMgQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlKGludCBzLCBpbnQgc291cmNlRW5kLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCwgYm9vbGVhbiBpc0ltcGxpY2l0KSB7CisJc3VwZXIocywgc291cmNlRW5kKTsKKwl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7CisJdGhpcy5pc0ltcGxpY2l0ID0gaXNJbXBsaWNpdDsKK30KK3Byb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXNzKE1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlKSB7CisJLy8gdGhpcy9zdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBjb25zdHJ1Y3RvciBjYWxsCisJaWYgKGV2YWx1YXRpb25Db250ZXh0LmlzQ29uc3RydWN0b3JDYWxsKSB7CisJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKKwlpZiAodGhpcy5ldmFsdWF0aW9uQ29udGV4dC5kZWNsYXJpbmdUeXBlTmFtZSA9PSBudWxsIHx8IGV2YWx1YXRpb25Db250ZXh0LmlzU3RhdGljKSB7CisJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yVGhpc1N1cGVySW5TdGF0aWModGhpcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwlpZiAodmFsdWVSZXF1aXJlZCkgeworCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJY29kZVN0cmVhbS5nZXRmaWVsZChkZWxlZ2F0ZVRoaXMpOworCX0KKwljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworfQorcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpeworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKKwkvLyBpbXBsaWNpdCB0aGlzCisJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJVHlwZUJpbmRpbmcgc25pcHBldFR5cGUgPSBudWxsOworCWlmICh0aGlzLmlzSW1wbGljaXQgfHwgY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSkpeworCQlzbmlwcGV0VHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwl9CisJaWYgKHNuaXBwZXRUeXBlID09IG51bGwpIHJldHVybiBudWxsOworCQorCWRlbGVnYXRlVGhpcyA9IHNjb3BlLmdldEZpZWxkKHNuaXBwZXRUeXBlLCBERUxFR0FURV9USElTLCB0aGlzKTsKKwlpZiAoZGVsZWdhdGVUaGlzID09IG51bGwpIHJldHVybiBudWxsOyAvLyBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAorCWlmIChkZWxlZ2F0ZVRoaXMuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIGRlbGVnYXRlVGhpcy50eXBlOworCXJldHVybiBzbmlwcGV0VHlwZTsKK30KK3B1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCS8vIGlnbm9yZWQKK30KK3B1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCl7CisJLy8gaWdub3JlZAorfQorcHVibGljIHZvaWQgc2V0RmllbGRJbmRleChpbnQgaW5kZXgpeworCS8vIGlnbm9yZWQKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKKwljaGFyW10gZGVjbGFyaW5nVHlwZSA9IHRoaXMuZXZhbHVhdGlvbkNvbnRleHQuZGVjbGFyaW5nVHlwZU5hbWU7CisJcmV0dXJuICIoIiArIChkZWNsYXJpbmdUeXBlID09IG51bGwgPyAiPE5PIERFQ0xBUklORyBUWVBFPiIgOiBuZXcgU3RyaW5nKGRlY2xhcmluZ1R5cGUpKSArICIpdGhpcyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBmOTRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VsZWN0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworLyoqCisgKiBNYXBzIGJhY2sgYW5kIGZvcnRoIGEgY29kZSBzbmlwcGV0IHRvIGEgY29tcGlsYXRpb24gdW5pdC4KKyAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgYXMgZm9sbG93czoKKyAqIFtwYWNrYWdlIDxwYWNrYWdlIG5hbWU+O10KKyAqIFtpbXBvcnQgPGltcG9ydCBuYW1lPjtdKgorICogcHVibGljIGNsYXNzIDxjb2RlIHNuaXBwZXQgY2xhc3MgbmFtZT4gZXh0ZW5kcyA8Z2xvYmFsIHZhcmlhYmxlIGNsYXNzIG5hbWU+IHsKKyAqICAgcHVibGljIHZvaWQgcnVuKCkgeworICogICAgIDxjb2RlIHNuaXBwZXQ+CisgKiAgIH0KKyAqIH0KKyAqLworY2xhc3MgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJLyoqCisJICogVGhlIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0LgorCSAqLworCXB1YmxpYyBjaGFyW10gY3VTb3VyY2U7CisJCisJLyoqCisJICogV2hlcmUgdGhlIGNvZGUgc25pcHBldCBzdGFydHMgaW4gdGhlIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0LgorCSAqLworCXB1YmxpYyBpbnQgbGluZU51bWJlck9mZnNldCA9IDA7CisJcHVibGljIGludCBzdGFydFBvc09mZnNldCA9IDA7CisKKwkvLyBJbnRlcm5hbCBmaWVsZHMKKwlwcml2YXRlIGNoYXJbXSBjb2RlU25pcHBldDsKKwlwcml2YXRlIGNoYXJbXSBwYWNrYWdlTmFtZTsKKwlwcml2YXRlIGNoYXJbXVtdIGltcG9ydHM7CisJY2hhcltdIGNsYXNzTmFtZTsgLy8gTkI6IE1ha2UgaXQgcGFja2FnZSBkZWZhdWx0IHZpc2liaWxpdHkgdG8gb3B0aW1pemUgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3NlcworCXByaXZhdGUgY2hhcltdIHZhckNsYXNzTmFtZTsKKworCS8vIE1hcHBpbmcgb2YgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGVzCisJcHJpdmF0ZSBjaGFyW11bXSBsb2NhbFZhck5hbWVzOworCXByaXZhdGUgY2hhcltdW10gbG9jYWxWYXJUeXBlTmFtZXM7CisJcHJpdmF0ZSBpbnRbXSBsb2NhbFZhck1vZGlmaWVyczsKKwlwcml2YXRlIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZTsKKworLyoqCisgKiBSZWJ1aWxkIHNvdXJjZSBpbiBwcmVzZW5jZSBvZiBleHRlcm5hbCBsb2NhbCB2YXJpYWJsZXMKKyAqLworIHB1YmxpYyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoY2hhcltdIGNvZGVTbmlwcGV0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXVtdIGltcG9ydHMsIGNoYXJbXSBjbGFzc05hbWUsIGNoYXJbXSB2YXJDbGFzc05hbWUsIGNoYXJbXVtdIGxvY2FsVmFyTmFtZXMsIGNoYXJbXVtdIGxvY2FsVmFyVHlwZU5hbWVzLCBpbnRbXSBsb2NhbFZhck1vZGlmaWVycywgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lKSB7CisJdGhpcy5jb2RlU25pcHBldCA9IGNvZGVTbmlwcGV0OworCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKwl0aGlzLmltcG9ydHMgPSBpbXBvcnRzOworCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworCXRoaXMudmFyQ2xhc3NOYW1lID0gdmFyQ2xhc3NOYW1lOworCXRoaXMubG9jYWxWYXJOYW1lcyA9IGxvY2FsVmFyTmFtZXM7CisJdGhpcy5sb2NhbFZhclR5cGVOYW1lcyA9IGxvY2FsVmFyVHlwZU5hbWVzOworCXRoaXMubG9jYWxWYXJNb2RpZmllcnMgPSBsb2NhbFZhck1vZGlmaWVyczsKKwl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lID0gZGVjbGFyaW5nVHlwZU5hbWU7CisJdGhpcy5idWlsZENVU291cmNlKCk7Cit9Citwcml2YXRlIHZvaWQgYnVpbGRDVVNvdXJjZSgpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJLy8gcGFja2FnZSBkZWNsYXJhdGlvbgorCWlmICh0aGlzLnBhY2thZ2VOYW1lICE9IG51bGwgJiYgdGhpcy5wYWNrYWdlTmFtZS5sZW5ndGggIT0gMCkgeworCQlidWZmZXIuYXBwZW5kKCJwYWNrYWdlICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQodGhpcy5wYWNrYWdlTmFtZSk7CisJCWJ1ZmZlci5hcHBlbmQoIjsiKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5saW5lTnVtYmVyT2Zmc2V0Kys7CisJfQorCisJLy8gaW1wb3J0IGRlY2xhcmF0aW9ucworCWNoYXJbXVtdIGltcG9ydHMgPSB0aGlzLmltcG9ydHM7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoImltcG9ydCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKGltcG9ydHNbaV0pOworCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCQl0aGlzLmxpbmVOdW1iZXJPZmZzZXQrKzsKKwl9CisKKwkvLyBjbGFzcyBkZWNsYXJhdGlvbgorCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5jbGFzc05hbWUpOworCisJLy8gc3VwZXIgY2xhc3MgaXMgZWl0aGVyIGEgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzIG9yIHRoZSBDb2RlU25pcHBldCBjbGFzcworCWlmICh0aGlzLnZhckNsYXNzTmFtZSAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQodGhpcy52YXJDbGFzc05hbWUpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoUEFDS0FHRV9OQU1FKTsKKwkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoUk9PVF9DTEFTU19OQU1FKTsKKwl9CisJYnVmZmVyLmFwcGVuZCgiIHsiKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmxpbmVOdW1iZXJPZmZzZXQrKzsKKworCWlmICh0aGlzLmRlY2xhcmluZ1R5cGVOYW1lICE9IG51bGwpeworCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQodGhpcy5kZWNsYXJpbmdUeXBlTmFtZSk7CisJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKERFTEVHQVRFX1RISVMpOyAvLyB2YWwkdGhpcworCQlidWZmZXIuYXBwZW5kKCc7JykuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCQl0aGlzLmxpbmVOdW1iZXJPZmZzZXQrKzsKKwl9CisJLy8gYWRkIHNvbWUgc3RvcmFnZSBsb2NhdGlvbiBmb3IgbG9jYWwgdmFyaWFibGUgcGVyc2lzdGVkIHN0YXRlCisJaWYgKGxvY2FsVmFyTmFtZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbG9jYWxWYXJOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCgiICAgICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKGxvY2FsVmFyVHlwZU5hbWVzW2ldKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChMT0NBTF9WQVJfUFJFRklYKTsgLy8gdmFsJC4uLgorCQkJYnVmZmVyLmFwcGVuZChsb2NhbFZhck5hbWVzW2ldKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCQl0aGlzLmxpbmVOdW1iZXJPZmZzZXQrKzsKKwkJfQorCX0KKwkvLyBydW4oKSBtZXRob2QgZGVjbGFyYXRpb24KKwlidWZmZXIuYXBwZW5kKCJwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgVGhyb3dhYmxlIHsiKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmxpbmVOdW1iZXJPZmZzZXQrKzsKKwlzdGFydFBvc09mZnNldCA9IGJ1ZmZlci5sZW5ndGgoKTsKKwlidWZmZXIuYXBwZW5kKGNvZGVTbmlwcGV0KTsKKwkvLyBhIGxpbmUgc2VwYXJhdG9yIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBjb2RlIHNuaXBwZXQgc291cmNlIGNvZGUKKwkvLyBpbiBjYXNlIHRoZSBjb2RlIHNuaXBwZXQgc291cmNlIGNvZGUgZW5kcyB3aXRoIGEgbGluZSBjb21tZW50CisJLy8gaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzOAorCWJ1ZmZlci5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUikuYXBwZW5kKCd9JykuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCisJLy8gZW5kIG9mIGNsYXNzIGRlY2xhcmF0aW9uCisJYnVmZmVyLmFwcGVuZCgnfScpLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKKworCS8vIHN0b3JlIHJlc3VsdAorCWludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7CisJdGhpcy5jdVNvdXJjZSA9IG5ldyBjaGFyW2xlbmd0aF07CisJYnVmZmVyLmdldENoYXJzKDAsIGxlbmd0aCwgdGhpcy5jdVNvdXJjZSwgMCk7Cit9CisvKioKKyAqIFJldHVybnMgYSBjb21wbGV0aW9uIHJlcXVlc3RvciB0aGF0IHdyYXBzIHRoZSBnaXZlbiByZXF1ZXN0b3IgYW5kIHNoaWZ0IHRoZSByZXN1bHRzCisgKiBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0IG9mZnNldCBhbmQgbGluZSBudW1iZXIgb2Zmc2V0IG9mIHRoZSBjb2RlIHNuaXBwZXQgaW4gdGhlIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0LiAKKyAqLworcHVibGljIElDb21wbGV0aW9uUmVxdWVzdG9yIGdldENvbXBsZXRpb25SZXF1ZXN0b3IoZmluYWwgSUNvbXBsZXRpb25SZXF1ZXN0b3Igb3JpZ2luYWxSZXF1ZXN0b3IpIHsKKwlmaW5hbCBpbnQgc3RhcnRQb3NPZmZzZXQgPSB0aGlzLnN0YXJ0UG9zT2Zmc2V0OworCWZpbmFsIGludCBsaW5lTnVtYmVyT2Zmc2V0ID0gdGhpcy5saW5lTnVtYmVyT2Zmc2V0OworCXJldHVybiBuZXcgSUNvbXBsZXRpb25SZXF1ZXN0b3IoKSB7CisJCXB1YmxpYyB2b2lkIGFjY2VwdEFub255bW91c1R5cGUoY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSBzdXBlclR5cGVOYW1lLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRBbm9ueW1vdXNUeXBlKHN1cGVyVHlwZVBhY2thZ2VOYW1lLCBzdXBlclR5cGVOYW1lLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcywgcGFyYW1ldGVyTmFtZXMsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCAtIHN0YXJ0UG9zT2Zmc2V0LCBjb21wbGV0aW9uRW5kIC0gc3RhcnRQb3NPZmZzZXQsIHJlbGV2YW5jZSk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJLy8gUmVtb3ZlIGNvbXBsZXRpb24gb24gZ2VuZXJhdGVkIGNsYXNzIG5hbWUgb3IgZ2VuZXJhdGVkIGdsb2JhbCB2YXJpYWJsZSBjbGFzcyBuYW1lCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocGFja2FnZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnBhY2thZ2VOYW1lKSAKKwkJCQkJJiYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNsYXNzTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMuY2xhc3NOYW1lKQorCQkJCQkJfHwgQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2xhc3NOYW1lLCBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy52YXJDbGFzc05hbWUpKSkgcmV0dXJuOworCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIGNsYXNzTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRFcnJvcihJUHJvYmxlbSBlcnJvcikgeworCisJCQllcnJvci5zZXRTb3VyY2VTdGFydChlcnJvci5nZXRTb3VyY2VTdGFydCgpIC0gc3RhcnRQb3NPZmZzZXQpOworCQkJZXJyb3Iuc2V0U291cmNlRW5kKGVycm9yLmdldFNvdXJjZUVuZCgpIC0gc3RhcnRQb3NPZmZzZXQpOworCQkJZXJyb3Iuc2V0U291cmNlTGluZU51bWJlcihlcnJvci5nZXRTb3VyY2VMaW5lTnVtYmVyKCkgLSBsaW5lTnVtYmVyT2Zmc2V0KTsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdEVycm9yKGVycm9yKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdEZpZWxkKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIG5hbWUsIHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCAtIHN0YXJ0UG9zT2Zmc2V0LCBjb21wbGV0aW9uRW5kIC0gc3RhcnRQb3NPZmZzZXQsIHJlbGV2YW5jZSk7CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGludGVyZmFjZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZShwYWNrYWdlTmFtZSwgaW50ZXJmYWNlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRLZXl3b3JkKGNoYXJbXSBrZXl3b3JkTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdEtleXdvcmQoa2V5d29yZE5hbWUsIGNvbXBsZXRpb25TdGFydCAtIHN0YXJ0UG9zT2Zmc2V0LCBjb21wbGV0aW9uRW5kIC0gc3RhcnRQb3NPZmZzZXQsIHJlbGV2YW5jZSk7CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0TGFiZWwoY2hhcltdIGxhYmVsTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdExhYmVsKGxhYmVsTmFtZSwgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKG5hbWUsIHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2QoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gc2VsZWN0b3IsIGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHJldHVyblR5cGVOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQkvLyBSZW1vdmUgY29tcGxldGlvbiBvbiBnZW5lcmF0ZWQgbWV0aG9kCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy5wYWNrYWdlTmFtZSkgCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGRlY2xhcmluZ1R5cGVOYW1lLCBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy5jbGFzc05hbWUpCisJCQkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCAicnVuIi50b0NoYXJBcnJheSgpKSkgcmV0dXJuOyAvLyROT04tTkxTLTEkCisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRNZXRob2QoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgc2VsZWN0b3IsIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgcGFyYW1ldGVyVHlwZU5hbWVzLCBwYXJhbWV0ZXJOYW1lcywgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2REZWNsYXJhdGlvbihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gcmV0dXJuVHlwZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCS8vIFJlbW92ZSBjb21wbGV0aW9uIG9uIGdlbmVyYXRlZCBtZXRob2QKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnBhY2thZ2VOYW1lKSAKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZU5hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLmNsYXNzTmFtZSkKKwkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsICJydW4iLnRvQ2hhckFycmF5KCkpKSByZXR1cm47Ly8kTk9OLU5MUy0xJAorCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgc2VsZWN0b3IsIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgcGFyYW1ldGVyVHlwZU5hbWVzLCBwYXJhbWV0ZXJOYW1lcywgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRNb2RpZmllcihjaGFyW10gbW9kaWZpZXJOYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0TW9kaWZpZXIobW9kaWZpZXJOYW1lLCBjb21wbGV0aW9uU3RhcnQgLSBzdGFydFBvc09mZnNldCwgY29tcGxldGlvbkVuZCAtIHN0YXJ0UG9zT2Zmc2V0LCByZWxldmFuY2UpOworCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VOYW1lLCBjb21wbGV0aW9uTmFtZSwgY29tcGxldGlvblN0YXJ0IC0gc3RhcnRQb3NPZmZzZXQsIGNvbXBsZXRpb25FbmQgLSBzdGFydFBvc09mZnNldCwgcmVsZXZhbmNlKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQkvLyBSZW1vdmUgY29tcGxldGlvbiBvbiBnZW5lcmF0ZWQgY2xhc3MgbmFtZSBvciBnZW5lcmF0ZWQgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzIG5hbWUKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhwYWNrYWdlTmFtZSwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyLnRoaXMucGFja2FnZU5hbWUpIAorCQkJCQkmJiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY2xhc3NOYW1lLCBDb2RlU25pcHBldFRvQ3VNYXBwZXIudGhpcy5jbGFzc05hbWUpCisJCQkJCQl8fCBDaGFyT3BlcmF0aW9uLmVxdWFscyhjbGFzc05hbWUsIENvZGVTbmlwcGV0VG9DdU1hcHBlci50aGlzLnZhckNsYXNzTmFtZSkpKSByZXR1cm47CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRUeXBlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIGNvbXBsZXRpb25TdGFydCAtIHN0YXJ0UG9zT2Zmc2V0LCBjb21wbGV0aW9uRW5kIC0gc3RhcnRQb3NPZmZzZXQsIHJlbGV2YW5jZSk7CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0VmFyaWFibGVOYW1lKGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIG5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0VmFyaWFibGVOYW1lKHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIG5hbWUsIGNvbXBsZXRpb25OYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQsIHJlbGV2YW5jZSk7CisJCX0KKwl9OworfQorcHVibGljIGNoYXJbXSBnZXRDVVNvdXJjZSgpIHsKKwlpZiAodGhpcy5jdVNvdXJjZSA9PSBudWxsKSB7CisJCWJ1aWxkQ1VTb3VyY2UoKTsKKwl9CisJcmV0dXJuIHRoaXMuY3VTb3VyY2U7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgb2YgZXZhbHVhdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBpbnQgZ2V0RXZhbHVhdGlvblR5cGUoaW50IGxpbmVOdW1iZXIpIHsKKwlpbnQgY3VycmVudExpbmUgPSAxOworCisJLy8gY2hlY2sgcGFja2FnZSBkZWNsYXJhdGlvbgkKKwlpZiAodGhpcy5wYWNrYWdlTmFtZSAhPSBudWxsICYmIHRoaXMucGFja2FnZU5hbWUubGVuZ3RoICE9IDApIHsKKwkJaWYgKGxpbmVOdW1iZXIgPT0gMSkgeworCQkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVF9QQUNLQUdFOworCQl9CisJCWN1cnJlbnRMaW5lKys7CisJfQorCisJLy8gY2hlY2sgaW1wb3J0cworCWNoYXJbXVtdIGltcG9ydHMgPSB0aGlzLmltcG9ydHM7CisJaWYgKChjdXJyZW50TGluZSA8PSBsaW5lTnVtYmVyKSAmJiAobGluZU51bWJlciA8IChjdXJyZW50TGluZSArIGltcG9ydHMubGVuZ3RoKSkpIHsKKwkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVF9JTVBPUlQ7CisJfQorCWN1cnJlbnRMaW5lICs9IGltcG9ydHMubGVuZ3RoICsgMTsgLy8gKyAxIHRvIHNraXAgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIGxpbmUKKworCS8vIGNoZWNrIGdlbmVyYXRlZCBmaWVsZHMKKwljdXJyZW50TGluZSArPQorCQkodGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9PSBudWxsID8gMCA6IDEpIAorCQkrICh0aGlzLmxvY2FsVmFyTmFtZXMgPT0gbnVsbCA/IDAgOiB0aGlzLmxvY2FsVmFyTmFtZXMubGVuZ3RoKTsKKwlpZiAoY3VycmVudExpbmUgPiBsaW5lTnVtYmVyKSB7CisJCXJldHVybiBFdmFsdWF0aW9uUmVzdWx0LlRfSU5URVJOQUw7CisJfQorCWN1cnJlbnRMaW5lICsrOyAvLyArIDEgdG8gc2tpcCB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIGxpbmUKKworCS8vIGNoZWNrIGNvZGUgc25pcHBldAorCWlmIChjdXJyZW50TGluZSA+PSB0aGlzLmxpbmVOdW1iZXJPZmZzZXQpIHsKKwkJcmV0dXJuIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQ7CisJfQorCisJLy8gZGVmYXVsdAorCXJldHVybiBFdmFsdWF0aW9uUmVzdWx0LlRfSU5URVJOQUw7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGltcG9ydCBkZWZpbmVkIGF0IHRoZSBnaXZlbiBsaW5lIG51bWJlci4gCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0SW1wb3J0KGludCBsaW5lTnVtYmVyKSB7CisJaW50IGltcG9ydFN0YXJ0TGluZSA9IHRoaXMubGluZU51bWJlck9mZnNldCAtIDEgLSB0aGlzLmltcG9ydHMubGVuZ3RoOworCXJldHVybiB0aGlzLmltcG9ydHNbbGluZU51bWJlciAtIGltcG9ydFN0YXJ0TGluZV07Cit9CisvKioKKyAqIFJldHVybnMgYSBzZWxlY3Rpb24gcmVxdWVzdG9yIHRoYXQgd3JhcHMgdGhlIGdpdmVuIHJlcXVlc3RvciBhbmQgc2hpZnQgdGhlIHByb2JsZW1zCisgKiBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0IG9mZnNldCBhbmQgbGluZSBudW1iZXIgb2Zmc2V0IG9mIHRoZSBjb2RlIHNuaXBwZXQgaW4gdGhlIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0LiAKKyAqLworcHVibGljIElTZWxlY3Rpb25SZXF1ZXN0b3IgZ2V0U2VsZWN0aW9uUmVxdWVzdG9yKGZpbmFsIElTZWxlY3Rpb25SZXF1ZXN0b3Igb3JpZ2luYWxSZXF1ZXN0b3IpIHsKKwlmaW5hbCBpbnQgc3RhcnRQb3NPZmZzZXQgPSB0aGlzLnN0YXJ0UG9zT2Zmc2V0OworCWZpbmFsIGludCBsaW5lTnVtYmVyT2Zmc2V0ID0gdGhpcy5saW5lTnVtYmVyT2Zmc2V0OworCXJldHVybiBuZXcgSVNlbGVjdGlvblJlcXVlc3RvcigpIHsKKwkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKSB7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRDbGFzcyhwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCBuZWVkUXVhbGlmaWNhdGlvbik7CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpIHsKKwkJCWVycm9yLnNldFNvdXJjZUxpbmVOdW1iZXIoZXJyb3IuZ2V0U291cmNlTGluZU51bWJlcigpIC0gbGluZU51bWJlck9mZnNldCk7CisJCQllcnJvci5zZXRTb3VyY2VTdGFydChlcnJvci5nZXRTb3VyY2VTdGFydCgpIC0gc3RhcnRQb3NPZmZzZXQpOworCQkJZXJyb3Iuc2V0U291cmNlRW5kKGVycm9yLmdldFNvdXJjZUVuZCgpIC0gc3RhcnRQb3NPZmZzZXQpOworCQkJb3JpZ2luYWxSZXF1ZXN0b3IuYWNjZXB0RXJyb3IoZXJyb3IpOworCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdEZpZWxkKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIG5hbWUpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdEZpZWxkKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIG5hbWUpOworCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBpbnRlcmZhY2VOYW1lLCBib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKSB7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsIG5lZWRRdWFsaWZpY2F0aW9uKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2QoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gc2VsZWN0b3IsIGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKKwkJCW9yaWdpbmFsUmVxdWVzdG9yLmFjY2VwdE1ldGhvZChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLCBzZWxlY3RvciwgcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIGlzQ29uc3RydWN0b3IpOworCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCQlvcmlnaW5hbFJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKKwkJfQorCX07Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzYWExOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0VHlwZTsKKworcHVibGljIGNsYXNzIENvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIHsKKworcHVibGljIENvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KXsKKwlzdXBlcihjb21waWxhdGlvblJlc3VsdCk7Cit9CisKKy8qKgorICogR2VuZXJpYyBieXRlY29kZSBnZW5lcmF0aW9uIGZvciB0eXBlCisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlKSB7CisJaWYgKGhhc0JlZW5HZW5lcmF0ZWQpIHJldHVybjsKKwloYXNCZWVuR2VuZXJhdGVkID0gdHJ1ZTsKKwkKKwlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pIHsKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJQ29kZVNuaXBwZXRDbGFzc0ZpbGUuY3JlYXRlUHJvYmxlbVR5cGUodGhpcywgc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQpOworCQlyZXR1cm47CisJfQorCXRyeSB7CisJCS8vIGNyZWF0ZSB0aGUgcmVzdWx0IGZvciBhIGNvbXBpbGVkIHR5cGUKKwkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDb2RlU25pcHBldENsYXNzRmlsZShiaW5kaW5nLCBlbmNsb3NpbmdDbGFzc0ZpbGUsIGZhbHNlKTsKKwkJLy8gZ2VuZXJhdGUgYWxsIGZpZWxzCisJCWNsYXNzRmlsZS5hZGRGaWVsZEluZm9zKCk7CisKKwkJLy8gcmVjb3JkIHRoZSBpbm5lciB0eXBlIGluc2lkZSBpdHMgb3duIC5jbGFzcyBmaWxlIHRvIGJlIGFibGUKKwkJLy8gdG8gZ2VuZXJhdGUgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGVzCisJCWlmIChiaW5kaW5nLmlzTWVtYmVyVHlwZSgpKQorCQkJY2xhc3NGaWxlLnJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKGJpbmRpbmcpOworCQlpZiAoYmluZGluZy5pc0xvY2FsVHlwZSgpKSB7CisJCQllbmNsb3NpbmdDbGFzc0ZpbGUucmVjb3JkTmVzdGVkTG9jYWxBdHRyaWJ1dGUoYmluZGluZyk7CisJCQljbGFzc0ZpbGUucmVjb3JkTmVzdGVkTG9jYWxBdHRyaWJ1dGUoYmluZGluZyk7CisJCX0KKwkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCS8vIHJlY29yZCB0aGUgaW5uZXIgdHlwZSBpbnNpZGUgaXRzIG93biAuY2xhc3MgZmlsZSB0byBiZSBhYmxlCisJCQkJLy8gdG8gZ2VuZXJhdGUgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGVzCisJCQkJY2xhc3NGaWxlLnJlY29yZE5lc3RlZE1lbWJlckF0dHJpYnV0ZShtZW1iZXJUeXBlc1tpXS5iaW5kaW5nKTsKKwkJCQltZW1iZXJUeXBlc1tpXS5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNsYXNzRmlsZSk7CisJCQl9CisJCX0KKwkJLy8gZ2VuZXJhdGUgYWxsIG1ldGhvZHMKKwkJY2xhc3NGaWxlLnNldEZvck1ldGhvZEluZm9zKCk7CisJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJbWV0aG9kc1tpXS5nZW5lcmF0ZUNvZGUoc2NvcGUsIGNsYXNzRmlsZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIGdlbmVyYXRlIGFsbCBtZXRob2RzCisJCWNsYXNzRmlsZS5hZGRTcGVjaWFsTWV0aG9kcygpOworCisJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbil7IC8vIHRyaWdnZXIgcHJvYmxlbSB0eXBlIGdlbmVyYXRpb24gZm9yIGNvZGUgZ2VuIGVycm9ycworCQkJdGhyb3cgbmV3IEFib3J0VHlwZShzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdCk7CisJCX0KKworCQkvLyBmaW5hbGl6ZSB0aGUgY29tcGlsZWQgdHlwZSByZXN1bHQKKwkJY2xhc3NGaWxlLmFkZEF0dHJpYnV0ZXMoKTsKKwkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQucmVjb3JkKGJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLCBjbGFzc0ZpbGUpOworCX0gY2F0Y2ggKEFib3J0VHlwZSBlKSB7CisJCWlmIChiaW5kaW5nID09IG51bGwpCisJCQlyZXR1cm47CisJCUNvZGVTbmlwcGV0Q2xhc3NGaWxlLmNyZWF0ZVByb2JsZW1UeXBlKHRoaXMsIHNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0KTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmQyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ09ERV9TTklQUEVUX0NMQVNTX05BTUVfUFJFRklYID0gIkNvZGVTbmlwcGV0XyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEdMT0JBTF9WQVJTX0NMQVNTX05BTUVfUFJFRklYID0gIkdsb2JhbFZhcmlhYmxlc18iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBQQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwudGFyZ2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gQ09ERV9TTklQUEVUX05BTUUgPSAib3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUk9PVF9DTEFTU19OQU1FID0gIkNvZGVTbmlwcGV0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9GVUxMX0NMQVNTX05BTUUgPSBuZXcgU3RyaW5nKFBBQ0tBR0VfTkFNRSkgKyAiLiIgKyBuZXcgU3RyaW5nKFJPT1RfQ0xBU1NfTkFNRSk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTRVRSRVNVTFRfU0VMRUNUT1IgPSAic2V0UmVzdWx0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VUUkVTVUxUX0FSR1VNRU5UUyA9ICJMamF2YS5sYW5nLk9iamVjdDtMamF2YS5sYW5nLkNsYXNzOyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gUk9PVF9DT01QT1VORF9OQU1FID0gQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdChDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBQQUNLQUdFX05BTUUpLCBST09UX0NMQVNTX05BTUUpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9NRVRIT0QgPSAicnVuIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9WQUxVRV9GSUVMRCA9ICJyZXN1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfVFlQRV9GSUVMRCA9ICJyZXN1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIExPQ0FMX1ZBUl9QUkVGSVggPSAidmFsJCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIERFTEVHQVRFX1RISVMgPSAidmFsJHRoaXMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAyMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuQ29tcGxldGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VsZWN0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LlNlbGVjdGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1TZXZlcml0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dAorICovCitwdWJsaWMgY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKKwkvKioKKwkgKiBXaGV0aGVyIHRpbWluZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgb3V0cHV0IHRvIHRoZSBzdGRvdXQKKwkgKi8KKwlzdGF0aWMgZmluYWwgYm9vbGVhbiBUSU1JTkcgPSBmYWxzZTsKKworCS8qKgorCSAqIEdsb2JhbCBjb3VudGVycyBzbyB0aGF0IHNldmVyYWwgZXZhbHVhdGlvbiBjb250ZXh0IGNhbiBkZXBsb3kgb24gdGhlIHNhbWUgcnVudGltZS4KKwkgKi8KKwlzdGF0aWMgaW50IFZBUl9DTEFTU19DT1VOVEVSID0gMDsKKwlzdGF0aWMgaW50IENPREVfU05JUFBFVF9DT1VOVEVSID0gMDsKKworCUdsb2JhbFZhcmlhYmxlW10gdmFyaWFibGVzID0gbmV3IEdsb2JhbFZhcmlhYmxlWzVdOworCWludCB2YXJpYWJsZUNvdW50ID0gMDsKKwljaGFyW11bXSBpbXBvcnRzID0gbmV3IGNoYXJbMF1bXTsKKwljaGFyW10gcGFja2FnZU5hbWUgPSBuZXcgY2hhclswXTsKKwlib29sZWFuIHZhcnNDaGFuZ2VkID0gdHJ1ZTsKKwlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnM7CisJSUJpbmFyeVR5cGUgY29kZVNuaXBwZXRCaW5hcnk7CisKKwkvKiBkbyBuYW1lcyBpbXBsaWNpdGx5IHJlZmVyIHRvIGEgZ2l2ZW4gdHlwZSAqLworCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZTsKKwlpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzOworCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXM7CisJY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzOworCQorCS8qIGNhbiAndGhpcycgYmUgdXNlZCBpbiB0aGlzIGNvbnRleHQgKi8KKwlib29sZWFuIGlzU3RhdGljID0gdHJ1ZTsKKwlib29sZWFuIGlzQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZXZhbHVhdGlvbiBjb250ZXh0LgorICovCitwdWJsaWMgRXZhbHVhdGlvbkNvbnRleHQoKSB7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGdsb2JhbCB2YXJpYWJsZXMgb2YgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBjcmVhdGVkIGluLgorICovCitwdWJsaWMgR2xvYmFsVmFyaWFibGVbXSBhbGxWYXJpYWJsZXMoKSB7CisJR2xvYmFsVmFyaWFibGVbXSByZXN1bHQgPSBuZXcgR2xvYmFsVmFyaWFibGVbdGhpcy52YXJpYWJsZUNvdW50XTsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudmFyaWFibGVzLCAwLCByZXN1bHQsIDAsIHRoaXMudmFyaWFibGVDb3VudCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogQ29tcHV0ZXMgYSBjb21wbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGNvZGUgc25pcHBldC4KKyAqIChOb3RlIHRoYXQgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQncyBWTSBkb2Vzbid0IG5lZWQgdG8gYmUgcnVubmluZy4pCisgKgorICogIEBwYXJhbSBlbnZpcm9ubWVudCAKKyAqICAgICAgdXNlZCB0byByZXNvbHZlIHR5cGUvcGFja2FnZSByZWZlcmVuY2VzIGFuZCBzZWFyY2ggZm9yIHR5cGVzL3BhY2thZ2VzCisgKiAgICAgIGJhc2VkIG9uIHBhcnRpYWwgbmFtZXMuCisgKgorICogIEBwYXJhbSByZXF1ZXN0b3IgCisgKiAgICAgIHNpbmNlIHRoZSBlbmdpbmUgbWlnaHQgcHJvZHVjZSBhbnN3ZXJzIG9mIHZhcmlvdXMgZm9ybXMsIHRoZSBlbmdpbmUgCisgKiAgICAgIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlcXVlc3RvciBhYmxlIHRvIGFjY2VwdCBhbGwgcG9zc2libGUgY29tcGxldGlvbnMuCisgKgorICogIEBwYXJhbSBvcHRpb25zCisgKgkJc2V0IG9mIG9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIGNvZGUgYXNzaXN0IGVuZ2luZS4KKyAqLworcHVibGljIHZvaWQgY29tcGxldGUoY2hhcltdIGNvZGVTbmlwcGV0LCBpbnQgY29tcGxldGlvblBvc2l0aW9uLCBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLCBNYXAgb3B0aW9ucykgeworCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRDb21wbGV0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IG5ldyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoCisJCWNvZGVTbmlwcGV0LCAKKwkJdGhpcy5wYWNrYWdlTmFtZSwgCisJCXRoaXMuaW1wb3J0cywgCisJCWNsYXNzTmFtZSwgCisJCXRoaXMuaW5zdGFsbGVkVmFycyA9PSBudWxsID8gbnVsbCA6IHRoaXMuaW5zdGFsbGVkVmFycy5jbGFzc05hbWUsCisJCXRoaXMubG9jYWxWYXJpYWJsZU5hbWVzLCAKKwkJdGhpcy5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCAKKwkJdGhpcy5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzLCAKKwkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZQkJCisJKTsKKwlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWUsICJqYXZhIi50b0NoYXJBcnJheSgpLCAnLicpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkJCXJldHVybiBtYXBwZXIuZ2V0Q1VTb3VyY2UoKTsKKwkJfQorCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwkJCXJldHVybiBjbGFzc05hbWU7CisJCX0KKwkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIG1hcHBlci5nZXRDb21wbGV0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIG9wdGlvbnMpOworCWVuZ2luZS5jb21wbGV0ZShzb3VyY2VVbml0LCBtYXBwZXIuc3RhcnRQb3NPZmZzZXQgKyBjb21wbGV0aW9uUG9zaXRpb24sIDApOworfQorLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiB2YXJpYWJsZSBmcm9tIHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgdGFrZSBlZmZlY3QgaW4gdGhlIHRhcmdldCBWTSBvbmx5CisgKiB0aGUgbmV4dCB0aW1lIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGluc3RhbGxlZC4KKyAqLworcHVibGljIHZvaWQgZGVsZXRlVmFyaWFibGUoR2xvYmFsVmFyaWFibGUgdmFyaWFibGUpIHsKKwlHbG9iYWxWYXJpYWJsZVtdIHZhcnMgPSB0aGlzLnZhcmlhYmxlczsKKwlpbnQgaW5kZXggPSAtMTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudmFyaWFibGVDb3VudDsgaSsrKSB7CisJCWlmICh2YXJzW2ldLmVxdWFscyh2YXJpYWJsZSkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpbmRleCA9PSAtMSkgeworCQlyZXR1cm47CisJfQorCWludCBlbGVtZW50Q291bnQgPSB0aGlzLnZhcmlhYmxlQ291bnQtLTsKKwlpbnQgaiA9IGVsZW1lbnRDb3VudCAtIGluZGV4IC0gMTsKKwlpZiAoaiA+IDApIHsKKwkgICAgU3lzdGVtLmFycmF5Y29weSh2YXJzLCBpbmRleCArIDEsIHZhcnMsIGluZGV4LCBqKTsKKwl9CisJdmFyc1tlbGVtZW50Q291bnQgLSAxXSA9IG51bGw7CisJdGhpcy52YXJzQ2hhbmdlZCA9IHRydWU7Cit9Citwcml2YXRlIHZvaWQgZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKElSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJaWYgKHRoaXMuY29kZVNuaXBwZXRCaW5hcnkgPT0gbnVsbCkgeworCQkvLyBEZXBsb3kgQ29kZVNuaXBwZXQgY2xhc3MgKG9ubHkgb25jZSkKKwkJcmVxdWVzdG9yLmFjY2VwdENsYXNzRmlsZXMoCisJCQluZXcgQ2xhc3NGaWxlW10geworCQkJCW5ldyBDbGFzc0ZpbGUoKSB7CisJCQkJCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisJCQkJCQlyZXR1cm4gZ2V0Q29kZVNuaXBwZXRCeXRlcygpOworCQkJCQl9CisJCQkJCXB1YmxpYyBjaGFyW11bXSBnZXRDb21wb3VuZE5hbWUoKSB7CisJCQkJCQlyZXR1cm4gRXZhbHVhdGlvbkNvbnN0YW50cy5ST09UX0NPTVBPVU5EX05BTUU7CisJCQkJCX0KKwkJCQl9CisJCQl9LCAKKwkJCW51bGwpOworCX0KK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dAorICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBjb2RlIHNuaXBwZXQgY2xhc3MgZmlsZXMgY291bGQgbm90IGJlIGRlcGxveWVkLgorICovCitwdWJsaWMgdm9pZCBldmFsdWF0ZSgKKwljaGFyW10gY29kZVNuaXBwZXQsIAorCWNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsCisJY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLCAKKwlpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwlib29sZWFuIGlzU3RhdGljLAorCWJvb2xlYW4gaXNDb25zdHJ1Y3RvckNhbGwsCisJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgCisJTWFwIG9wdGlvbnMsIAorCWZpbmFsIElSZXF1ZXN0b3IgcmVxdWVzdG9yLCAKKwlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIHsKKworCS8vIEluaXRpYWxpYWxpemUgY29udGV4dAorCXRoaXMubG9jYWxWYXJpYWJsZVR5cGVOYW1lcyA9IGxvY2FsVmFyaWFibGVUeXBlTmFtZXM7CisJdGhpcy5sb2NhbFZhcmlhYmxlTmFtZXMgPSBsb2NhbFZhcmlhYmxlTmFtZXM7CisJdGhpcy5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzID0gbG9jYWxWYXJpYWJsZU1vZGlmaWVyczsKKwl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lID0gZGVjbGFyaW5nVHlwZU5hbWU7CisJdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworCXRoaXMuaXNDb25zdHJ1Y3RvckNhbGwgPSBpc0NvbnN0cnVjdG9yQ2FsbDsKKworCXRoaXMuZGVwbG95Q29kZVNuaXBwZXRDbGFzc0lmTmVlZGVkKHJlcXVlc3Rvcik7CisKKwl0cnkgeworCQkvLyBJbnN0YWxsIG5ldyB2YXJpYWJsZXMgaWYgbmVlZGVkCisJCWNsYXNzIEZvcndhcmRpbmdSZXF1ZXN0b3IgaW1wbGVtZW50cyBJUmVxdWVzdG9yIHsKKwkJCWJvb2xlYW4gaGFzRXJyb3JzID0gZmFsc2U7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDbGFzc0ZpbGVzKENsYXNzRmlsZVtdIGNsYXNzRmlsZXMsIGNoYXJbXSBjb2RlU25pcHBldENsYXNzTmFtZSkgeworCQkJCXJldHVybiByZXF1ZXN0b3IuYWNjZXB0Q2xhc3NGaWxlcyhjbGFzc0ZpbGVzLCBjb2RlU25pcHBldENsYXNzTmFtZSk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0sIGNoYXJbXSBmcmFnbWVudFNvdXJjZSwgaW50IGZyYWdtZW50S2luZCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKHByb2JsZW0sIGZyYWdtZW50U291cmNlLCBmcmFnbWVudEtpbmQpOworCQkJCWlmIChwcm9ibGVtLmlzRXJyb3IoKSkgeworCQkJCQloYXNFcnJvcnMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJRm9yd2FyZGluZ1JlcXVlc3RvciBmb3J3YXJkaW5nUmVxdWVzdG9yID0gbmV3IEZvcndhcmRpbmdSZXF1ZXN0b3IoKTsKKwkJaWYgKHRoaXMudmFyc0NoYW5nZWQpIHsKKwkJCWV2YWx1YXRlVmFyaWFibGVzKGVudmlyb25tZW50LCBvcHRpb25zLCBmb3J3YXJkaW5nUmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSk7CisJCX0KKwkJCisJCS8vIENvbXBpbGUgY29kZSBzbmlwcGV0IGlmIHRoZXJlIHdhcyBubyBlcnJvcnMgd2hpbGUgZXZhbHVhdGluZyB0aGUgdmFyaWFibGVzCisJCWlmICghZm9yd2FyZGluZ1JlcXVlc3Rvci5oYXNFcnJvcnMpIHsKKwkJCUV2YWx1YXRvciBldmFsdWF0b3IgPSAKKwkJCQluZXcgQ29kZVNuaXBwZXRFdmFsdWF0b3IoCisJCQkJCWNvZGVTbmlwcGV0LAorCQkJCQl0aGlzLCAKKwkJCQkJZW52aXJvbm1lbnQsCisJCQkJCW9wdGlvbnMsIAorCQkJCQlyZXF1ZXN0b3IsIAorCQkJCQlwcm9ibGVtRmFjdG9yeSk7CisJCQlDbGFzc0ZpbGVbXSBjbGFzc2VzID0gbnVsbDsKKwkJCWlmIChUSU1JTkcpIHsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJY2xhc3NlcyA9IGV2YWx1YXRvci5nZXRDbGFzc2VzKCk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRvIGNvbXBpbGUgWyIgKyBuZXcgU3RyaW5nKGNvZGVTbmlwcGV0KSArICJdIHdhcyAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWNsYXNzZXMgPSBldmFsdWF0b3IuZ2V0Q2xhc3NlcygpOworCQkJfQorCQkJLy8gU2VuZCBjb2RlIHNuaXBwZXQgb24gdGFyZ2V0CisJCQlpZiAoY2xhc3NlcyAhPSBudWxsICYmIGNsYXNzZXMubGVuZ3RoID4gMCkgeworCQkJCWNoYXJbXSBzaW1wbGVDbGFzc05hbWUgPSBldmFsdWF0b3IuZ2V0Q2xhc3NOYW1lKCk7CisJCQkJY2hhcltdIHBhY2thZ2VOYW1lID0gdGhpcy5nZXRQYWNrYWdlTmFtZSgpOworCQkJCWNoYXJbXSBxdWFsaWZpZWRDbGFzc05hbWUgPQorCQkJCQlwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCA/CisJCQkJCQlzaW1wbGVDbGFzc05hbWUgOgorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHNpbXBsZUNsYXNzTmFtZSwgJy4nKTsKKwkJCQlDT0RFX1NOSVBQRVRfQ09VTlRFUisrOworCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzc0ZpbGVzKGNsYXNzZXMsIHF1YWxpZmllZENsYXNzTmFtZSk7CisJCQl9CisJCX0KKwl9IGZpbmFsbHkgeworCQkvLyBSZWluaXRpYWxpemUgY29udGV4dCB0byBkZWZhdWx0IHZhbHVlcworCQl0aGlzLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMgPSBudWxsOworCQl0aGlzLmxvY2FsVmFyaWFibGVOYW1lcyA9IG51bGw7CisJCXRoaXMubG9jYWxWYXJpYWJsZU1vZGlmaWVycyA9IG51bGw7CisJCXRoaXMuZGVjbGFyaW5nVHlwZU5hbWUgPSBudWxsOworCQl0aGlzLmlzU3RhdGljID0gdHJ1ZTsKKwkJdGhpcy5pc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOworCX0KK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dAorICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JbnN0YWxsRXhjZXB0aW9uIGlmIHRoZSBjb2RlIHNuaXBwZXQgY2xhc3MgZmlsZXMgY291bGQgbm90IGJlIGRlcGxveWVkLgorICovCitwdWJsaWMgdm9pZCBldmFsdWF0ZShjaGFyW10gY29kZVNuaXBwZXQsIElOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIE1hcCBvcHRpb25zLCBmaW5hbCBJUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB0aHJvd3MgSW5zdGFsbEV4Y2VwdGlvbiB7CisJdGhpcy5ldmFsdWF0ZSgKKwkJY29kZVNuaXBwZXQsCisJCW51bGwsCisJCW51bGwsCisJCW51bGwsCisJCW51bGwsCisJCXRydWUsCisJCWZhbHNlLAorCQllbnZpcm9ubWVudCwKKwkJb3B0aW9ucywKKwkJcmVxdWVzdG9yLAorCQlwcm9ibGVtRmFjdG9yeSk7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JRXZhbHVhdGlvbkNvbnRleHQKKyAqLworcHVibGljIHZvaWQgZXZhbHVhdGVJbXBvcnRzKElOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW1wb3J0cy5sZW5ndGg7IGkrKykgeworCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gbmV3IElQcm9ibGVtW10ge251bGx9OworCQljaGFyW10gaW1wb3J0RGVjbGFyYXRpb24gPSB0aGlzLmltcG9ydHNbaV07CisJCWNoYXJbXVtdIHNwbGl0RGVjbGFyYXRpb24gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBpbXBvcnREZWNsYXJhdGlvbik7CisJCWludCBzcGxpdExlbmd0aCA9IHNwbGl0RGVjbGFyYXRpb24ubGVuZ3RoOworCQlpZiAoc3BsaXRMZW5ndGggPiAwKSB7CisJCQljaGFyW10gcGFja2FnZU5hbWUgPSBzcGxpdERlY2xhcmF0aW9uW3NwbGl0TGVuZ3RoIC0gMV07CisJCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDEgJiYgcGFja2FnZU5hbWVbMF0gPT0gJyonKSB7CisJCQkJY2hhcltdW10gcGFyZW50TmFtZTsKKwkJCQlzd2l0Y2ggKHNwbGl0TGVuZ3RoKSB7CisJCQkJCWNhc2UgMToKKwkJCQkJCXBhcmVudE5hbWUgPSBudWxsOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCXBhcmVudE5hbWUgPSBudWxsOworCQkJCQkJcGFja2FnZU5hbWUgPSBzcGxpdERlY2xhcmF0aW9uW3NwbGl0TGVuZ3RoIC0gMl07CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXBhcmVudE5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNwbGl0RGVjbGFyYXRpb24sIDAsIHNwbGl0TGVuZ3RoIC0gMik7CisJCQkJCQlwYWNrYWdlTmFtZSA9IHNwbGl0RGVjbGFyYXRpb25bc3BsaXRMZW5ndGggLSAyXTsKKwkJCQl9CisJCQkJaWYgKCFlbnZpcm9ubWVudC5pc1BhY2thZ2UocGFyZW50TmFtZSwgcGFja2FnZU5hbWUpKSB7CisJCQkJCXByb2JsZW1zWzBdID0gcHJvYmxlbUZhY3RvcnkuY3JlYXRlUHJvYmxlbShpbXBvcnREZWNsYXJhdGlvbiwgSVByb2JsZW0uSW1wb3J0Tm90Rm91bmQsIG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbXBvcnREZWNsYXJhdGlvbil9LCBQcm9ibGVtU2V2ZXJpdGllcy5XYXJuaW5nLCAwLCBpbXBvcnREZWNsYXJhdGlvbi5sZW5ndGggLSAxLCBpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChlbnZpcm9ubWVudC5maW5kVHlwZShzcGxpdERlY2xhcmF0aW9uKSA9PSBudWxsKSB7CisJCQkJCXByb2JsZW1zWzBdID0gcHJvYmxlbUZhY3RvcnkuY3JlYXRlUHJvYmxlbShpbXBvcnREZWNsYXJhdGlvbiwgSVByb2JsZW0uSW1wb3J0Tm90Rm91bmQsIG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbXBvcnREZWNsYXJhdGlvbil9LCBQcm9ibGVtU2V2ZXJpdGllcy5XYXJuaW5nLCAwLCBpbXBvcnREZWNsYXJhdGlvbi5sZW5ndGggLSAxLCBpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW1wb3J0RGVjbGFyYXRpb24pfSwgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CisJCX0KKwkJaWYgKHByb2JsZW1zWzBdICE9IG51bGwpIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKHByb2JsZW1zWzBdLCBpbXBvcnREZWNsYXJhdGlvbiwgRXZhbHVhdGlvblJlc3VsdC5UX0lNUE9SVCk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JRXZhbHVhdGlvbkNvbnRleHQKKyAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgY29kZSBzbmlwcGV0IGNsYXNzIGZpbGVzIGNvdWxkIG5vdCBiZSBkZXBsb3llZC4KKyAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2xvYmFsIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgeWV0LgorICovCitwdWJsaWMgdm9pZCBldmFsdWF0ZVZhcmlhYmxlKEdsb2JhbFZhcmlhYmxlIHZhcmlhYmxlLCBJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCBNYXAgb3B0aW9ucywgSVJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgdGhyb3dzIEluc3RhbGxFeGNlcHRpb24geworCXRoaXMuZXZhbHVhdGUodmFyaWFibGUuZ2V0TmFtZSgpLCBlbnZpcm9ubWVudCwgb3B0aW9ucywgcmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSk7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JRXZhbHVhdGlvbkNvbnRleHQKKyAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbiBpZiB0aGUgY29kZSBzbmlwcGV0IGNsYXNzIGZpbGVzIGNvdWxkIG5vdCBiZSBkZXBsb3llZC4KKyAqLworcHVibGljIHZvaWQgZXZhbHVhdGVWYXJpYWJsZXMoSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgTWFwIG9wdGlvbnMsIElSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHRocm93cyBJbnN0YWxsRXhjZXB0aW9uIHsKKwl0aGlzLmRlcGxveUNvZGVTbmlwcGV0Q2xhc3NJZk5lZWRlZChyZXF1ZXN0b3IpOworCVZhcmlhYmxlc0V2YWx1YXRvciBldmFsdWF0b3IgPSBuZXcgVmFyaWFibGVzRXZhbHVhdG9yKHRoaXMsIGVudmlyb25tZW50LCBvcHRpb25zLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsKKwlDbGFzc0ZpbGVbXSBjbGFzc2VzID0gZXZhbHVhdG9yLmdldENsYXNzZXMoKTsKKwlpZiAoY2xhc3NlcyAhPSBudWxsKSB7CisJCWlmIChjbGFzc2VzLmxlbmd0aCA+IDApIHsKKwkJCS8vIFNlbmQgY2xhc3NlcworCQkJaWYgKCFyZXF1ZXN0b3IuYWNjZXB0Q2xhc3NGaWxlcyhjbGFzc2VzLCBudWxsKSkgeworCQkJCXRocm93IG5ldyBJbnN0YWxsRXhjZXB0aW9uKCk7CisJCQl9CisKKwkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW5zdGFsbGVkCisJCQlpbnQgdmFyaWFibGVDb3VudCA9IHRoaXMudmFyaWFibGVDb3VudDsKKwkJCUdsb2JhbFZhcmlhYmxlW10gdmFyaWFibGVzQ29weSA9IG5ldyBHbG9iYWxWYXJpYWJsZVt2YXJpYWJsZUNvdW50XTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy52YXJpYWJsZXMsIDAsIHZhcmlhYmxlc0NvcHksIDAsIHZhcmlhYmxlQ291bnQpOyAKKwkJCXRoaXMuaW5zdGFsbGVkVmFycyA9IG5ldyBWYXJpYWJsZXNJbmZvKGV2YWx1YXRvci5nZXRQYWNrYWdlTmFtZSgpLCBldmFsdWF0b3IuZ2V0Q2xhc3NOYW1lKCksIGNsYXNzZXMsIHZhcmlhYmxlc0NvcHksIHZhcmlhYmxlQ291bnQpOworCQkJVkFSX0NMQVNTX0NPVU5URVIrKzsKKwkJfQorCQl0aGlzLnZhcnNDaGFuZ2VkID0gZmFsc2U7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBieXRlcyBvZiB0aGUgQ29kZVNuaXBwZXQgY2xhc3MuCisgKiBHZW5lcmF0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQ6CitbamF2YS5pby5CdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihuZXcgamF2YS5pby5GaWxlV3JpdGVyKCJkOi90ZW1wL0NvZGVTbmlwcGV0LmphdmEiKSk7Cit3cml0ZXIud3JpdGUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnRleHQuZ2V0Q29kZVNuaXBwZXRTb3VyY2UoKSk7Cit3cml0ZXIuY2xvc2UoKTsKK29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluLmNvbXBpbGUoCisJImQ6L3RlbXAvQ29kZVNuaXBwZXQuamF2YSAtZCBkOi90ZW1wIC1jbGFzc3BhdGggZDovamRrMS4yLjIvanJlL2xpYi9ydC5qYXIgLXZlcmJvc2UiKTsKK2phdmEuaW8uRmlsZUlucHV0U3RyZWFtIHJlYWRlciA9ICBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oImQ6L3RlbXAvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0LmNsYXNzIik7CitieXRlW10gYnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLnJlYWRDb250ZW50c0FzQnl0ZXMocmVhZGVyKTsKK3JlYWRlci5jbG9zZSgpOworU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKK2J1ZmZlci5hcHBlbmQoInByaXZhdGUgYnl0ZVtdIGdldENvZGVTbmlwcGV0Qnl0ZXMoKSB7XG4iKTsKK2J1ZmZlci5hcHBlbmQoIglyZXR1cm4gbmV3IGJ5dGVbXSB7XG4iKTsKK2J1ZmZlci5hcHBlbmQoIgkJIik7Citmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisJYnVmZmVyLmFwcGVuZChieXRlc1tpXSk7CisJaWYgKGkgPT0gYnl0ZXMubGVuZ3RoIC0gMSkgeworCQlidWZmZXIuYXBwZW5kKCJcbiIpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoIiwgIik7CisJfQorfQorYnVmZmVyLmFwcGVuZCgiCX07XG4iKTsKK2J1ZmZlci5hcHBlbmQoIn0iKTsKK2J1ZmZlci50b1N0cmluZygpCitdCisgKi8KK3ByaXZhdGUgYnl0ZVtdIGdldENvZGVTbmlwcGV0Qnl0ZXMoKSB7CisJcmV0dXJuIG5ldyBieXRlW10geworCQktNTQsIC0yLCAtNzAsIC02NiwgMCwgMywgMCwgNDUsIDAsIDM1LCAxLCAwLCA0OCwgMTExLCAxMTQsIDEwMywgNDcsIDEwMSwgOTksIDEwOCwgMTA1LCAxMTIsIDExNSwgMTAxLCA0NywgMTA2LCAxMDAsIDExNiwgNDcsIDEwNSwgMTEwLCAxMTYsIDEwMSwgMTE0LCAxMTAsIDk3LCAxMDgsIDQ3LCAxMDEsIDExOCwgOTcsIDEwOCwgNDcsIDExNiwgOTcsIDExNCwgMTAzLCAxMDEsIDExNiwgNDcsIDY3LCAxMTEsIDEwMCwgMTAxLCA4MywgMTEwLCAxMDUsIDExMiwgMTEyLCAxMDEsIDExNiwgNywgMCwgMSwgMSwgMCwgMTYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDc5LCA5OCwgMTA2LCAxMDEsIDk5LCAxMTYsIDcsIDAsIDMsIDEsIDAsIDEwLCAxMTQsIDEwMSwgMTE1LCAxMTcsIDEwOCwgMTE2LCA4NCwgMTIxLCAxMTIsIDEwMSwgMSwgMCwgMTcsIDc2LCAxMDYsIDk3LCAxMTgsIDk3LCA0NywgMTA4LCA5NywgMTEwLCAxMDMsIDQ3LCA2NywgMTA4LCA5NywgMTE1LCAxMTUsIDU5LCAxLCAwLCAxMSwgMTE0LCAxMDEsIDExNSwgMTE3LCAxMDgsIDExNiwgODYsIDk3LCAxMDgsIDExNywgMTAxLCAxLCAwLCAxOCwgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDc5LCA5OCwgMTA2LCAxMDEsIDk5LCAxMTYsIDU5LCAxLCAwLCA3LCA5OSwgMTA4LCA5NywgMTE1LCAxMTUsIDM2LCA0OCwgMSwgMCwgOSwgODMsIDEyMSwgMTEwLCAxMTYsIDEwNCwgMTAxLCAxMTYsIDEwNSwgOTksIDEsIDAsIDYsIDYwLCAxMDUsIDExMCwgMTA1LCAxMTYsIDYyLCAxLCAwLCAzLCA0MCwgNDEsIDg2LCAxLCAwLCA0LCA2NywgMTExLCAxMDAsIDEwMSwgMTIsIDAsIDExLCAwLCAxMiwgMTAsIDAsIDQsIDAsIDE0LCAxLCAwLCAxNCwgMTA2LCA5NywgMTE4LCA5NywgNDcsIDEwOCwgOTcsIDExMCwgMTAzLCA0NywgODYsIDExMSwgMTA1LCAxMDAsIDcsIDAsIDE2LCAxLCAwLCA0LCA4NCwgODksIDgwLCA2OSwgMTIsIDAsIDE4LCAwLCA2LCA5LCAwLCAxNywgMCwgMTksIDEyLCAwLCA1LCAwLCA2LCA5LCAwLCAyLCAwLCAyMSwgMTIsIDAsIDcsIDAsIDgsIDksIDAsIDIsIDAsIDIzLCAxLCAwLCAxNSwgNzYsIDEwNSwgMTEwLCAxMDEsIDc4LCAxMTcsIDEwOSwgOTgsIDEwMSwgMTE0LCA4NCwgOTcsIDk4LCAxMDgsIDEwMSwgMSwgMCwgMTMsIDEwMywgMTAxLCAxMTYsIDgyLCAxMDEsIDExNSwgMTE3LCAxMDgsIDExNiwgODQsIDEyMSwgMTEyLCAxMDEsIDEsIDAsIDE5LCA0MCwgNDEsIDc2LCAxMDYsIDk3LCAxMTgsIDk3LCA0NywgMTA4LCA5NywgMTEwLCAxMDMsIDQ3LCA2NywgMTA4LCA5NywgMTE1LCAxMTUsIDU5LCAxLCAwLCAxNCwgMTAzLCAxMDEsIDExNiwgODIsIDEwMSwgMTE1LCAxMTcsIDEwOCwgMTE2LCA4NiwgOTcsIDEwOCwgMTE3LCAxMDEsIDEsIDAsIDIwLCA0MCwgNDEsIDc2LCAxMDYsIDk3LCAxMTgsIDk3LCA0NywgMTA4LCA5NywgMTEwLCAxMDMsIDQ3LCA3OSwgOTgsIDEwNiwgMTAxLCA5OSwgMTE2LCA1OSwgMSwgMCwgMywgMTE0LCAxMTcsIDExMCwgMSwgMCwgOSwgMTE1LCAxMDEsIDExNiwgODIsIDEwMSwgMTE1LCAxMTcsIDEwOCwgMTE2LCAxLCAwLCAzOCwgNDAsIDc2LCAxMDYsIDk3LCAxMTgsIDk3LCA0NywgMTA4LCA5NywgMTEwLCAxMDMsIDQ3LCA3OSwgOTgsIDEwNiwgMTAxLCA5OSwgMTE2LCA1OSwgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDY3LCAxMDgsIDk3LCAxMTUsIDExNSwgNTksIDQxLCA4NiwgMSwgMCwgMTAsIDgzLCAxMTEsIDExNywgMTE0LCA5OSwgMTAxLCA3MCwgMTA1LCAxMDgsIDEwMSwgMSwgMCwgMTYsIDY3LCAxMTEsIDEwMCwgMTAxLCA4MywgMTEwLCAxMDUsIDExMiwgMTEyLCAxMDEsIDExNiwgNDYsIDEwNiwgOTcsIDExOCwgOTcsIDAsIDMzLCAwLCAyLCAwLCA0LCAwLCAwLCAwLCAzLCAwLCAyLCAwLCA1LCAwLCA2LCAwLCAwLCAwLCAyLCAwLCA3LCAwLCA4LCAwLCAwLCAwLCA4LCAwLCA5LCAwLCA2LCAwLCAxLCAwLCAxMCwgMCwgMCwgMCwgMCwgMCwgNSwgMCwgMSwgMCwgMTEsIDAsIDEyLCAwLCAxLCAwLCAxMywgMCwgMCwgMCwgNTMsIDAsIDIsIDAsIDEsIDAsIDAsIDAsIDE3LCA0MiwgLTczLCAwLCAxNSwgNDIsIC03OCwgMCwgMjAsIC03NSwgMCwgMjIsIDQyLCAxLCAtNzUsIDAsIDI0LCAtNzksIDAsIDAsIDAsIDEsIDAsIDI1LCAwLCAwLCAwLCAxOCwgMCwgNCwgMCwgMCwgMCwgMTcsIDAsIDQsIDAsIDE4LCAwLCAxMSwgMCwgMTksIDAsIDE2LCAwLCAxNywgMCwgMSwgMCwgMjYsIDAsIDI3LCAwLCAxLCAwLCAxMywgMCwgMCwgMCwgMjksIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDUsIDQyLCAtNzYsIDAsIDIyLCAtODAsIDAsIDAsIDAsIDEsIDAsIDI1LCAwLCAwLCAwLCA2LCAwLCAxLCAwLCAwLCAwLCAyNCwgMCwgMSwgMCwgMjgsIDAsIDI5LCAwLCAxLCAwLCAxMywgMCwgMCwgMCwgMjksIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDUsIDQyLCAtNzYsIDAsIDI0LCAtODAsIDAsIDAsIDAsIDEsIDAsIDI1LCAwLCAwLCAwLCA2LCAwLCAxLCAwLCAwLCAwLCAzMCwgMCwgMSwgMCwgMzAsIDAsIDEyLCAwLCAxLCAwLCAxMywgMCwgMCwgMCwgMjUsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIC03OSwgMCwgMCwgMCwgMSwgMCwgMjUsIDAsIDAsIDAsIDYsIDAsIDEsIDAsIDAsIDAsIDM2LCAwLCAxLCAwLCAzMSwgMCwgMzIsIDAsIDEsIDAsIDEzLCAwLCAwLCAwLCA0MywgMCwgMiwgMCwgMywgMCwgMCwgMCwgMTEsIDQyLCA0MywgLTc1LCAwLCAyNCwgNDIsIDQ0LCAtNzUsIDAsIDIyLCAtNzksIDAsIDAsIDAsIDEsIDAsIDI1LCAwLCAwLCAwLCAxNCwgMCwgMywgMCwgMCwgMCwgNDIsIDAsIDUsIDAsIDQzLCAwLCAxMCwgMCwgNDEsIDAsIDEsIDAsIDMzLCAwLCAwLCAwLCAyLCAwLCAzNAorCX07Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgQ29kZVNuaXBwZXQgY2xhc3MuCisgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGJpbmFyeSBvZiB0aGUgQ29kZVNuaXBwZXRDbGFzcworICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2RlU25pcHBldFNvdXJjZSgpIHsKKwlyZXR1cm4KKwkJInBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwudGFyZ2V0O1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIi8qXG4iICsgLy8kTk9OLU5MUy0xJAorCQkiICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS5cbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIi8qKlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqIFRoZSByb290IG9mIGFsbCBjb2RlIHNuaXBwZXQgY2xhc3Nlcy4gQ29kZSBzbmlwcGV0IGNsYXNzZXNcbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKiBhcmUgc3VwcG9zZWQgdG8gb3ZlcmlkZSB0aGUgcnVuKCkgbWV0aG9kLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqIDxwPlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqIElNUE9SVEFOVCBOT1RFOlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqIEFsbCBtZXRob2RzIGluIHRoaXMgY2xhc3MgbXVzdCBiZSBwdWJsaWMgc2luY2UgdGhpcyBjbGFzcyBpcyBnb2luZyB0byBiZSBsb2FkZWQgYnkgdGhlXG4iICsgLy8kTk9OLU5MUy0xJAorCQkiICogYm9vdHN0cmFwIGNsYXNzIGxvYWRlciwgYW5kIHRoZSBvdGhlciBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzIG1pZ2h0IGJlIGxvYWRlZCBieSBcbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKiBhbm90aGVyIGNsYXNzIGxvYWRlciAoc28gdGhlaXIgcnVudGltZSBwYWNrYWdlcyBhcmUgZ29pbmcgdG8gYmUgZGlmZmVyZW50KS5cbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkCisJCSJwdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXQge1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIglwcml2YXRlIENsYXNzIHJlc3VsdFR5cGUgPSB2b2lkLmNsYXNzO1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIglwcml2YXRlIE9iamVjdCByZXN1bHRWYWx1ZSA9IG51bGw7XG4iICsgLy8kTk9OLU5MUy0xJAorCQkiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAorCQkiICogUmV0dXJucyB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJInB1YmxpYyBDbGFzcyBnZXRSZXN1bHRUeXBlKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIglyZXR1cm4gdGhpcy5yZXN1bHRUeXBlO1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIn1cbiIgKyAvLyROT04tTkxTLTEkCisJCSIvKipcbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKiBSZXR1cm5zIHRoZSByZXN1bHQgdmFsdWUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJInB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0VmFsdWUoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAorCQkiCXJldHVybiB0aGlzLnJlc3VsdFZhbHVlO1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIn1cbiIgKyAvLyROT04tTkxTLTEkCisJCSIvKipcbiIgKyAvLyROT04tTkxTLTEkCisJCSIgKiBUaGUgY29kZSBzbmlwcGV0LiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBhIHRyYW5zZm9ybWVkIGNvZGUgc25pcHBldFxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqIHRoYXQgc3RvcmVzIHRoZSByZXN1bHQgdXNpbmcgc2V0UmVzdWx0KENsYXNzLCBPYmplY3QpLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJInB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAvLyROT04tTkxTLTEkCisJCSJ9XG4iICsgLy8kTk9OLU5MUy0xJAorCQkiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAorCQkiICogU3RvcmVzIHRoZSByZXN1bHQgdHlwZSBhbmQgdmFsdWUgb2YgdGhlIGNvZGUgc25pcHBldCBldmFsdWF0aW9uLlxuIiArIC8vJE5PTi1OTFMtMSQKKwkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJInB1YmxpYyB2b2lkIHNldFJlc3VsdChPYmplY3QgcmVzdWx0VmFsdWUsIENsYXNzIHJlc3VsdFR5cGUpIHtcbiIgKyAvLyROT04tTkxTLTEkCisJCSIJdGhpcy5yZXN1bHRWYWx1ZSA9IHJlc3VsdFZhbHVlO1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIgl0aGlzLnJlc3VsdFR5cGUgPSByZXN1bHRUeXBlO1xuIiArIC8vJE5PTi1OTFMtMSQKKwkJIn1cbiIgKyAvLyROT04tTkxTLTEkCisJCSJ9XG4iOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFJldHVybnMgdGhlIGltcG9ydHMgb2YgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIEFuIGltcG9ydCBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKKyAqIG9yIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIHR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudCBvZgorICogYSBjb21waWxhdGlvbiB1bml0LgorICovCitwdWJsaWMgY2hhcltdW10gZ2V0SW1wb3J0cygpIHsKKwlyZXR1cm4gdGhpcy5pbXBvcnRzOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29kZSBzbmlwcGV0cyBhcmUgcnVuIGludG8uCisgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIAorICogdGhlIHBhY2thZ2UgbmFtZSBoYXMgbmV2ZXIgYmVlbiBzZXQuCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0UGFja2FnZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7Cit9CisvKioKKyAqIFJldHVybiB0aGUgYmluYXJ5IGZvciB0aGUgcm9vdCBjb2RlIHNuaXBwZXQgY2xhc3MgKGllLiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQpLgorICovCitJQmluYXJ5VHlwZSBnZXRSb290Q29kZVNuaXBwZXRCaW5hcnkoKSB7CisJaWYgKGNvZGVTbmlwcGV0QmluYXJ5ID09IG51bGwpIHsKKwkJdGhpcy5jb2RlU25pcHBldEJpbmFyeSA9IG5ldyBDb2RlU25pcHBldFNrZWxldG9uKCk7CisJfQorCXJldHVybiB0aGlzLmNvZGVTbmlwcGV0QmluYXJ5OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIChpbmNsdWRpbmcgdGhlIHBhY2thZ2UgbmFtZSkgb2YgdGhlIGdpdmVuIGNsYXNzIGZpbGUuCisgKiBUaGUgc2ltcGxlIG5hbWUgZG9lc24ndCBjb250YWluIHRoZSBleHRlbnNpb24gIi5jbGFzcyIuCisgKiBUaGUgcmV0dXJuZWQgbmFtZSBkb2Vzbid0IHN0YXJ0IHdpdGggYSAiLyIKKyAqLworcHJpdmF0ZSBTdHJpbmcgZ2V0U3VwcG9ydENsYXNzRmlsZU5hbWUoU3RyaW5nIHNpbXBsZU5hbWUpIHsKKwljaGFyIHNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKwljaGFyW11bXSBjb21wb3VuZFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgUEFDS0FHRV9OQU1FKTsKKwlyZXR1cm4gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmRQYWNrYWdlTmFtZSwgc2VwYXJhdG9yKSkgKyBzZXBhcmF0b3IgKyBzaW1wbGVOYW1lICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdHlwZSBhbmQgaW5pdGlhbGl6ZXIuCisgKiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGluaXRpYWxpemVkLCB0aGUgaW5pdGlhbGl6ZXIgY2FuIGJlIG51bGwuCisgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGluc3RhbGwgaXQgdG8gdGhpcyBldmFsdWF0aW9uIGNvbnRleHQncyBWTS4KKyAqCisgKiBAc2VlIEdsb2JhbFZhcmlhYmxlCisgKi8KK3B1YmxpYyBHbG9iYWxWYXJpYWJsZSBuZXdWYXJpYWJsZShjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW10gaW5pdGlhbGl6ZXIpIHsKKwlHbG9iYWxWYXJpYWJsZSB2YXIgPSBuZXcgR2xvYmFsVmFyaWFibGUodHlwZU5hbWUsIG5hbWUsIGluaXRpYWxpemVyKTsKKwl0cnkgeworCQl0aGlzLnZhcmlhYmxlc1t0aGlzLnZhcmlhYmxlQ291bnQrK10gPSB2YXI7CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IGluZGV4ID0gdGhpcy52YXJpYWJsZUNvdW50IC0gMTsKKwkJR2xvYmFsVmFyaWFibGVbXSBvbGRWYXJzID0gdGhpcy52YXJpYWJsZXM7CisJCUdsb2JhbFZhcmlhYmxlW10gbmV3VmFycyA9IG5ldyBHbG9iYWxWYXJpYWJsZVtpbmRleCAqIDJdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFZhcnMsIDAsIG5ld1ZhcnMsIDAsIGluZGV4KTsKKwkJbmV3VmFyc1tpbmRleF0gPSB2YXI7CisJCXRoaXMudmFyaWFibGVzID0gbmV3VmFyczsKKwl9CisJdGhpcy52YXJzQ2hhbmdlZCA9IHRydWU7CisJcmV0dXJuIHZhcjsKK30KKy8qKgorICogQ29tcHV0ZXMgdGhlIHNlbGVjdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9ucyBvZiB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0LgorICogKE5vdGUgdGhhdCB0aGlzIGV2YWx1YXRpb24gY29udGV4dCdzIFZNIGRvZXNuJ3QgbmVlZCB0byBiZSBydW5uaW5nLikKKyAqICBAcGFyYW0gY29kZVNuaXBwZXQgY2hhcltdCisgKiAJCVRoZSBjb2RlIHNuaXBwZXIgc291cmNlCisgKiAKKyAqICBAcGFyYW0gc2VsZWN0aW9uU291cmNlU3RhcnQgaW50CisgKiAKKyAqICBAcGFyYW0gc2VsZWN0aW9uU291cmNlRW5kIGludAorICogCisgKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50CisgKiAgICAgIHVzZWQgdG8gcmVzb2x2ZSB0eXBlL3BhY2thZ2UgcmVmZXJlbmNlcyBhbmQgc2VhcmNoIGZvciB0eXBlcy9wYWNrYWdlcworICogICAgICBiYXNlZCBvbiBwYXJ0aWFsIG5hbWVzLgorICoKKyAqICBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3IKKyAqICAgICAgc2luY2UgdGhlIGVuZ2luZSBtaWdodCBwcm9kdWNlIGFuc3dlcnMgb2YgdmFyaW91cyBmb3JtcywgdGhlIGVuZ2luZSAKKyAqICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVxdWVzdG9yIGFibGUgdG8gYWNjZXB0IGFsbCBwb3NzaWJsZSBzZWxlY3Rpb25zLgorICoKKyAqICBAcGFyYW0gb3B0aW9ucyBqYXZhLnV0aWwuTWFwCisgKgkJc2V0IG9mIG9wdGlvbnMgdXNlZCB0byBjb25maWd1cmUgdGhlIGNvZGUgYXNzaXN0IGVuZ2luZS4KKyAqLworcHVibGljIHZvaWQgc2VsZWN0KCAKKwljaGFyW10gY29kZVNuaXBwZXQsCisJaW50IHNlbGVjdGlvblNvdXJjZVN0YXJ0LAorCWludCBzZWxlY3Rpb25Tb3VyY2VFbmQsCisJSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIAorCUlTZWxlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yLAorCU1hcCBvcHRpb25zKSB7CisJCQorCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRTZWxlY3Rpb24iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBDb2RlU25pcHBldFRvQ3VNYXBwZXIgbWFwcGVyID0gbmV3IENvZGVTbmlwcGV0VG9DdU1hcHBlcigKKwkJY29kZVNuaXBwZXQsIAorCQl0aGlzLnBhY2thZ2VOYW1lLCAKKwkJdGhpcy5pbXBvcnRzLCAKKwkJY2xhc3NOYW1lLCAKKwkJdGhpcy5pbnN0YWxsZWRWYXJzID09IG51bGwgPyBudWxsIDogdGhpcy5pbnN0YWxsZWRWYXJzLmNsYXNzTmFtZSwKKwkJdGhpcy5sb2NhbFZhcmlhYmxlTmFtZXMsIAorCQl0aGlzLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIAorCQl0aGlzLmxvY2FsVmFyaWFibGVNb2RpZmllcnMsIAorCQl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lCisJKTsKKwlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChjbGFzc05hbWUsICJqYXZhIi50b0NoYXJBcnJheSgpLCAnLicpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkJCXJldHVybiBtYXBwZXIuZ2V0Q1VTb3VyY2UoKTsKKwkJfQorCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwkJCXJldHVybiBjbGFzc05hbWU7CisJCX0KKwkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCBtYXBwZXIuZ2V0U2VsZWN0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIG9wdGlvbnMpOworCWVuZ2luZS5zZWxlY3Qoc291cmNlVW5pdCwgbWFwcGVyLnN0YXJ0UG9zT2Zmc2V0ICsgc2VsZWN0aW9uU291cmNlU3RhcnQsIG1hcHBlci5zdGFydFBvc09mZnNldCArIHNlbGVjdGlvblNvdXJjZUVuZCk7Cit9CisvKioKKyAqIFNldHMgdGhlIGltcG9ydHMgb2YgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIEFuIGltcG9ydCBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKKyAqIG9yIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIHR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudCBvZgorICogYSBjb21waWxhdGlvbiB1bml0IChzZWUgdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbnMgZm9yIG1vcmUgZGV0YWlscykuCisgKi8KK3B1YmxpYyB2b2lkIHNldEltcG9ydHMoY2hhcltdW10gaW1wb3J0cykgeworCXRoaXMuaW1wb3J0cyA9IGltcG9ydHM7CisJdGhpcy52YXJzQ2hhbmdlZCA9IHRydWU7IC8vIHRoaXMgbWF5IGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdmFyaWFibGUncyB0eXBlcworfQorLyoqCisgKiBTZXRzIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29kZSBzbmlwcGV0cyBhcmUgcmFuIGludG8uCisgKiBUaGUgZGVmYXVsdCBwYWNrYWdlIG5hbWUgaXMgYW4gZW1wdHkgYXJyYXkuCisgKi8KK3B1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKGNoYXJbXSBwYWNrYWdlTmFtZSkgeworCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKwl0aGlzLnZhcnNDaGFuZ2VkID0gdHJ1ZTsgLy8gdGhpcyBtYXkgY2hhbmdlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB2YXJpYWJsZSdzIHR5cGVzCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzU3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKKworLyoqCisgKiBBbiBFdmFsdWF0aW9uUmVzdWx0IGlzIHRoZSByZXN1bHQgb2YgYSBjb2RlIHNuaXBwZXQgZXZhbHVhdGlvbiwgYSBnbG9iYWwgCisgKiB2YXJpYWJsZSBldmFsdWF0aW9uIG9yIGl0IGlzIHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIGFnYWluc3QgaW1wb3J0cyBhbmQKKyAqIHBhY2thZ2UgZGVjbGFyYXRpb24uCisgKiBJdCBwcmltYXJpbHkgY29udGFpbnMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgdmFsdWUgKGVnLiBpdHMgCisgKiB0b1N0cmluZygpIHJlcHJlc2VudGF0aW9uKS4gSG93ZXZlciBpZiB0aGUgY29kZSBzbmlwcGV0LCBhIGdsb2JhbCB2YXJpYWJsZSAKKyAqIGRlZmluaXRpb24sIGFuIGltcG9ydCBvciB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQsIGl0IAorICogY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gcHJvYmxlbXMuCisgKi8KK3B1YmxpYyBjbGFzcyBFdmFsdWF0aW9uUmVzdWx0IHsKKworCXN0YXRpYyBmaW5hbCBJUHJvYmxlbVtdIE5PX1BST0JMRU1TID0gbmV3IElQcm9ibGVtWzBdOworCQorCWNoYXJbXSBldmFsdWF0aW9uSUQ7CisJaW50IGV2YWx1YXRpb25UeXBlOworCUlQcm9ibGVtW10gcHJvYmxlbXM7CisJY2hhcltdIGRpc3BsYXlTdHJpbmc7CisJY2hhcltdIHR5cGVOYW1lOworCisJLyoqCisJICogVGhlIGV2YWx1YXRpb24gcmVzdWx0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yCisJICogaXQgcmVwb3J0cyBhIHByb2JsZW0gb24gYSB2YXJpYWJsZS4gTm90ZSB0aGF0IGlmIHRoZSBwcm9ibGVtIGlzCisJICogb24gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLCB0aGUgc291cmNlIGxpbmUgbnVtYmVyIGlzIC0xLiBJZiB0aGUKKwkgKiBwcm9ibGVtIGlzIG9uIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSwgdGhlIHNvdXJjZSBsaW5lIG51bWJlciBpcyAwLgorCSAqIE90aGVyd2lzZSB0aGUgc291cmNlIGxpbmUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBpbml0aWFsaXplciBjb2RlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfVkFSSUFCTEUgPSAxOworCisJLyoqCisJICogVGhlIGV2YWx1YXRpb24gcmVzdWx0IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvZGUgc25pcHBldCBvcgorCSAqIGl0IHJlcG9ydHMgYSBwcm9ibGVtIG9uIGEgY29kZSBzbmlwcGV0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfQ09ERV9TTklQUEVUID0gMjsKKworCS8qKgorCSAqIFRoZSBldmFsdWF0aW9uIHJlc3VsdCByZXBvcnRzIGEgcHJvYmxlbSBvbiBhbiBpbXBvcnQgZGVjbGFyYXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9JTVBPUlQgPSAzOworCisJLyoqCisJICogVGhlIGV2YWx1YXRpb24gcmVzdWx0IHJlcG9ydHMgYSBwcm9ibGVtIG9uIGEgcGFja2FnZSBkZWNsYXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX1BBQ0tBR0UgPSA0OworCisJLyoqCisJICogVGhlIGV2YWx1YXRpb24gcmVzdWx0IHJlcG9ydHMgYW4gaW50ZXJuYWwgcHJvYmxlbS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX0lOVEVSTkFMID0gNTsKKwkKK3B1YmxpYyBFdmFsdWF0aW9uUmVzdWx0KGNoYXJbXSBldmFsdWF0aW9uSUQsIGludCBldmFsdWF0aW9uVHlwZSwgY2hhcltdIGRpc3BsYXlTdHJpbmcsIGNoYXJbXSB0eXBlTmFtZSkgeworCXRoaXMuZXZhbHVhdGlvbklEID0gZXZhbHVhdGlvbklEOworCXRoaXMuZXZhbHVhdGlvblR5cGUgPSBldmFsdWF0aW9uVHlwZTsKKwl0aGlzLmRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOworCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl0aGlzLnByb2JsZW1zID0gTk9fUFJPQkxFTVM7Cit9CitwdWJsaWMgRXZhbHVhdGlvblJlc3VsdChjaGFyW10gZXZhbHVhdGlvbklELCBpbnQgZXZhbHVhdGlvblR5cGUsIElQcm9ibGVtW10gcHJvYmxlbXMpIHsKKwl0aGlzLmV2YWx1YXRpb25JRCA9IGV2YWx1YXRpb25JRDsKKwl0aGlzLmV2YWx1YXRpb25UeXBlID0gZXZhbHVhdGlvblR5cGU7CisJdGhpcy5wcm9ibGVtcyA9IHByb2JsZW1zOworfQorLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBwcm9ibGVtIHRvIHRoZSBsaXN0IG9mIHByb2JsZW1zIG9mIHRoaXMgZXZhbHVhdGlvbiByZXN1bHQuCisgKi8KK3ZvaWQgYWRkUHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7CisJSVByb2JsZW1bXSBleGlzdGluZ1Byb2JsZW1zID0gdGhpcy5wcm9ibGVtczsKKwlpbnQgZXhpc3RpbmdMZW5ndGggPSBleGlzdGluZ1Byb2JsZW1zLmxlbmd0aDsKKwl0aGlzLnByb2JsZW1zID0gbmV3IElQcm9ibGVtW2V4aXN0aW5nTGVuZ3RoICsgMV07CisJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ1Byb2JsZW1zLCAwLCB0aGlzLnByb2JsZW1zLCAwLCBleGlzdGluZ0xlbmd0aCk7CisJdGhpcy5wcm9ibGVtc1tleGlzdGluZ0xlbmd0aF0gPSBwcm9ibGVtOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgZXZhbHVhdGlvbi4KKyAqIElmIHRoZSByZXN1bHQgaXMgYWJvdXQgYSBnbG9iYWwgdmFyaWFibGUsIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorICogSWYgdGhlIHJlc3VsdCBpcyBhYm91dCBhIGNvZGUgc25pcHBldCwgcmV0dXJucyB0aGUgY29kZSBzbmlwcGV0LgorICogSWYgdGhlIHJlc3VsdCBpcyBhYm91dCBhbiBpbXBvcnQsIHJldHVybnMgdGhlIGltcG9ydC4KKyAqIElmIHRoZSByZXN1bHQgaXMgYWJvdXQgYSBwYWNrYWdlIGRlY2xhcmF0aW9uLCByZXR1cm5zIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uLgorICovCitwdWJsaWMgY2hhcltdIGdldEV2YWx1YXRpb25JRCgpIHsKKwlyZXR1cm4gdGhpcy5ldmFsdWF0aW9uSUQ7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgb2YgZXZhbHVhdGlvbiB0aGlzIHJlc3VsdCBpcyBhYm91dC4KKyAqIFRoaXMgaW5kaWNhdGVzIGlmIHRoZSByZXN1bHQgaXMgYWJvdXQgYSBnbG9iYWwgdmFyaWFibGUsCisgKiBhIGNvZGUgc25pcHBldCwgYW4gaW1wb3J0IG9yIGEgcGFja2FnZSBkZWNsYXJhdGlvbi4KKyAqIFVzZSBnZXRFdmFsdWF0aW9uSUQoKSB0byBnZXQgdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KK3B1YmxpYyBpbnQgZ2V0RXZhbHVhdGlvblR5cGUoKSB7CisJcmV0dXJuIHRoaXMuZXZhbHVhdGlvblR5cGU7Cit9CisvKioKKyAqIFJldHVybnMgYW4gYXJyYXkgb2YgcHJvYmxlbXMgKGVycm9ycyBhbmQgd2FybmluZ3MpIGVuY291bnRlcmVkCisgKiBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIGEgY29kZSBzbmlwcGV0IG9yIGEgZ2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb24sCisgKiBvciBkdXJpbmcgdGhlIGFuYWx5c2lzIG9mIGEgcGFja2FnZSBuYW1lIG9yIGFuIGltcG9ydC4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHByb2JsZW1zLgorICovCitwdWJsaWMgSVByb2JsZW1bXSBnZXRQcm9ibGVtcygpIHsKKwlyZXR1cm4gdGhpcy5wcm9ibGVtczsKK30KKy8qKgorICogUmV0dXJucyBhIHByb3h5IG9iamVjdCBvbiB0aGlzIHJlc3VsdCdzIHZhbHVlLgorICogUmV0dXJucyBudWxsIGlmIHRoZSByZXN1bHQncyB2YWx1ZSBpcyBudWxsLgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyByZXN1bHQuCisgKiBUaGUgcHJveHkgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGFuc3dlciBxdWVzdGlvbnMgbGlrZToKKyAqICAgLSBXaGF0IGlzIHRoZSBwcm94eSB0eXBlIGZvciB0aGlzIG9iamVjdD8KKyAqCSAtIFdoYXQgaXMgdGhlIHRvU3RyaW5nKCkgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMgb2JqZWN0PworICogICAtIFdoYXQgYXJlIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGlzIG9iamVjdD8KKyAqICAgLSBXaGF0IGlzIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBmaWVsZCBuYW1lPworICogU3BlY2lhbCBwcm94eSBvYmplY3RzIGFyZSBleHBlY3RlZCBpZiB0aGUgdmFsdWUgaXMgYSBwcmltaXRpdmUgdHlwZS4KKyAqLworcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKwlyZXR1cm4gbnVsbDsgLy8gTm90IHlldCBpbXBsZW1lbnRlZAorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlc3VsdCdzIHZhbHVlLgorICogVGhpcyBpcyBvYnRhaW5lZCBieSBzZW5kaW5nIHRvU3RyaW5nKCkgdG8gdGhlIHJlc3VsdCBvYmplY3Qgb24gdGhlIHRhcmdldCBzaWRlCisgKiBpZiBpdCBpcyBub3QgYSBwcmltaXRpdmUgdmFsdWUuIElmIGl0IGlzIGEgcHJpbWl0aXZlIHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZworICogc3RhdGljIHRvU3RyaW5nKC4uLikgaXMgdXNlZCwgZWcuIEludGVnZXIudG9TdHJpbmcoaW50IG4pIGlmIGl0IGlzIGFuIGludC4KKyAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4KKyAqLworcHVibGljIGNoYXJbXSBnZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSB7CisJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZzsKK30KKy8qKgorICogUmV0dXJucyB0aGUgZG90LXNlcGFyYXRlZCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHJlc3VsdCdzIHZhbHVlIHR5cGUuCisgKiBJZiB0aGUgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUsIHJldHVybnMgdGhlIHRvU3RyaW5nKCkgcmVwcmVzZW50YXRpb24gb2YgaXRzIHR5cGUKKyAqIChlZy4gImludCIsICJib29sZWFuIiwgZXRjLikKKyAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4KKyAqLworcHVibGljIGNoYXJbXSBnZXRWYWx1ZVR5cGVOYW1lKCkgeworCXJldHVybiB0aGlzLnR5cGVOYW1lOworfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGVycm9ycyBpbiB0aGUgY29kZSBzbmlwcGV0IG9yIHRoZSBnbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgeworCWlmICh0aGlzLnByb2JsZW1zID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHRoaXMucHJvYmxlbXNbaV0uaXNFcnJvcigpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGFyZSBwcm9ibGVtcyBpbiB0aGUgY29kZSBzbmlwcGV0IG9yIHRoZSBnbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbXMoKSB7CisJcmV0dXJuICh0aGlzLnByb2JsZW1zICE9IG51bGwpICYmICh0aGlzLnByb2JsZW1zLmxlbmd0aCAhPSAwKTsKK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVzdWx0IGhhcyBhIHZhbHVlLgorICovCitwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZSgpIHsKKwlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nICE9IG51bGw7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGVyZSBhcmUgd2FybmluZ3MgaW4gdGhlIGNvZGUgc25pcHBldCBvciB0aGUgZ2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb24uCisgKi8KK3B1YmxpYyBib29sZWFuIGhhc1dhcm5pbmdzKCkgeworCWlmICh0aGlzLnByb2JsZW1zID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHRoaXMucHJvYmxlbXNbaV0uaXNXYXJuaW5nKCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIGEgcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZXN1bHQuCisgKiBUaGlzIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5LgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJc3dpdGNoICh0aGlzLmV2YWx1YXRpb25UeXBlKSB7CisJCWNhc2UgVF9DT0RFX1NOSVBQRVQ6CisJCQlidWZmZXIuYXBwZW5kKCJDb2RlIHNuaXBwZXQiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVF9JTVBPUlQ6CisJCQlidWZmZXIuYXBwZW5kKCJJbXBvcnQiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVF9JTlRFUk5BTDoKKwkJCWJ1ZmZlci5hcHBlbmQoIkludGVybmFsIHByb2JsZW0iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVF9QQUNLQUdFOgorCQkJYnVmZmVyLmFwcGVuZCgiUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUX1ZBUklBQkxFOgorCQkJYnVmZmVyLmFwcGVuZCgiR2xvYmFsIHZhcmlhYmxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0aGlzLmV2YWx1YXRpb25JRCk7CisJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCWlmIChoYXNQcm9ibGVtcygpKSB7CisJCWJ1ZmZlci5hcHBlbmQoIlByb2JsZW1zOlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1zLmxlbmd0aDsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKHRoaXMucHJvYmxlbXNbaV0udG9TdHJpbmcoKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaGFzVmFsdWUoKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZU5hbWUpOworCQkJYnVmZmVyLmFwcGVuZCgiKSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmRpc3BsYXlTdHJpbmcpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZCgiKE5vIGV4cGxpY2l0IHJldHVybiB2YWx1ZSkiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MWRmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBBIGV2YWx1YXRvciBidWlsZHMgYSBjb21waWxhdGlvbiB1bml0IGFuZCBjb21waWxlcyBpdCBpbnRvIGNsYXNzIGZpbGVzLgorICogSWYgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIHByb2JsZW1zLCByZXBvcnRzIHRoZSBwcm9ibGVtcyB1c2luZyB0aGUKKyAqIHJlcXVlc3Rvci4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV2YWx1YXRvciB7CisJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dDsKKwlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50OworCU1hcCBvcHRpb25zOworCUlSZXF1ZXN0b3IgcmVxdWVzdG9yOworCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeTsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBldmFsdWF0b3IuCisgKi8KK0V2YWx1YXRvcihFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0LCBJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCBNYXAgb3B0aW9ucywgSVJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgeworCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OworCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJdGhpcy5wcm9ibGVtRmFjdG9yeSA9IHByb2JsZW1GYWN0b3J5OworfQorLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBwcm9ibGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIGV2YWx1YXRpb24gcmVzdWx0IGluIHRoZSBnaXZlbiB0YWJsZS4gSWYgdGhlIGV2YWx1YXRpb24KKyAqIHJlc3VsdCBkb2Vzbid0IGV4aXN0IHlldCwgYWRkcyBpdCBpbiB0aGUgdGFibGUuIEl0cyBldmFsdWF0aW9uIGlkIGFuZCBldmFsdWF0aW9uIHR5cGUKKyAqIGFyZSBjb21wdXRlZCBzbyB0aGF0IHRoZXkgY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gcHJvYmxlbS4gSWYgaXQgaXMgZm91bmQgdG8gYmUgYW4gaW50ZXJuYWwgcHJvYmxlbSwKKyAqIHRoZW4gdGhlIGV2YWx1YXRpb24gaWQgb2YgdGhlIHJlc3VsdCBpcyB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBzb3VyY2UuCisgKi8KK2Fic3RyYWN0IHByb3RlY3RlZCB2b2lkIGFkZEV2YWx1YXRpb25SZXN1bHRGb3JDb21waWxhdGlvblByb2JsZW0oTWFwIHJlc3VsdHNCeUlEcyxJUHJvYmxlbSBwcm9ibGVtLCBjaGFyW10gY3VTb3VyY2UpOworLyoqCisgKiBSZXR1cm5zIHRoZSBldmFsdWF0aW9uIHJlc3VsdHMgdGhhdCBjb252ZXJ0cyB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gcmVzdWx0IHRoYXQgaGFzIHByb2JsZW1zLgorICogSWYgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdCBoYXMgbW9yZSB0aGFuIG9uZSBwcm9ibGVtLCB0aGVuIHRoZSBwcm9ibGVtcyBhcmUgYnJva2VuIGRvd24gc28gdGhhdAorICogZWFjaCBldmFsdWF0aW9uIHJlc3VsdCBoYXMgdGhlIHNhbWUgZXZhbHVhdGlvbiBpZC4gCisgKi8KK3Byb3RlY3RlZCBFdmFsdWF0aW9uUmVzdWx0W10gZXZhbHVhdGlvblJlc3VsdHNGb3JDb21waWxhdGlvblByb2JsZW1zKENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIGN1U291cmNlKSB7CisJLy8gQnJlYWsgZG93biB0aGUgcHJvYmxlbXMgYW5kIGdyb3VwIHRoZW0gYnkgaWRzIGluIGV2YWx1YXRpb24gcmVzdWx0cworCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwlIYXNoTWFwIHJlc3VsdHNCeUlEcyA9IG5ldyBIYXNoTWFwKDUpOworCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKKwkJYWRkRXZhbHVhdGlvblJlc3VsdEZvckNvbXBpbGF0aW9uUHJvYmxlbShyZXN1bHRzQnlJRHMsIHByb2JsZW1zW2ldLCBjdVNvdXJjZSk7CisJfQorCisJLy8gQ29weSByZXN1bHRzCisJaW50IHNpemUgPSByZXN1bHRzQnlJRHMuc2l6ZSgpOworCUV2YWx1YXRpb25SZXN1bHRbXSBldmFsUmVzdWx0cyA9IG5ldyBFdmFsdWF0aW9uUmVzdWx0W3NpemVdOworCUl0ZXJhdG9yIHJlc3VsdHMgPSByZXN1bHRzQnlJRHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlldmFsUmVzdWx0c1tpXSA9IChFdmFsdWF0aW9uUmVzdWx0KXJlc3VsdHMubmV4dCgpOworCX0KKworCXJldHVybiBldmFsUmVzdWx0czsKK30KKy8qKgorICogQ29tcGlsZXMgYW5kIHJldHVybnMgdGhlIGNsYXNzIGRlZmluaXRpb25zIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgorICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzLgorICovCitDbGFzc0ZpbGVbXSBnZXRDbGFzc2VzKCkgeworCWZpbmFsIGNoYXJbXSBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKKwlmaW5hbCBBcnJheUxpc3QgY2xhc3NEZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKworCS8vIFRoZSByZXF1ZXN0b3IgY29sbGVjdHMgdGhlIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcm9ibGVtcworCWNsYXNzIENvbXBpbGVyUmVxdWVzdG9yIGltcGxlbWVudHMgSUNvbXBpbGVyUmVxdWVzdG9yIHsKKwkJYm9vbGVhbiBoYXNFcnJvcnMgPSBmYWxzZTsKKwkJcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdC5oYXNQcm9ibGVtcygpKSB7CisJCQkJRXZhbHVhdGlvblJlc3VsdFtdIGV2YWxSZXN1bHRzID0gZXZhbHVhdGlvblJlc3VsdHNGb3JDb21waWxhdGlvblByb2JsZW1zKHJlc3VsdCwgc291cmNlKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV2YWxSZXN1bHRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCUV2YWx1YXRpb25SZXN1bHQgZXZhbFJlc3VsdCA9IGV2YWxSZXN1bHRzW2ldOworCQkJCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gZXZhbFJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2JsZW1zLmxlbmd0aDsgaisrKSB7CisJCQkJCQlFdmFsdWF0b3IudGhpcy5yZXF1ZXN0b3IuYWNjZXB0UHJvYmxlbShwcm9ibGVtc1tqXSwgZXZhbFJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSwgZXZhbFJlc3VsdC5nZXRFdmFsdWF0aW9uVHlwZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChyZXN1bHQuaGFzRXJyb3JzKCkpIHsKKwkJCQloYXNFcnJvcnMgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzID0gcmVzdWx0LmdldENsYXNzRmlsZXMoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRmlsZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGNsYXNzRmlsZXNbaV07CisvKiAKKwkJCQorCQkJCQljaGFyW10gZmlsZW5hbWUgPSBjbGFzc0ZpbGUuZmlsZU5hbWUoKTsKKwkJCQkJaW50IGxlbmd0aCA9IGZpbGVuYW1lLmxlbmd0aDsKKwkJCQkJY2hhcltdIHJlbGF0aXZlTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDZdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVuYW1lLCAwLCByZWxhdGl2ZU5hbWUsIDAsIGxlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoIi5jbGFzcyIudG9DaGFyQXJyYXkoKSwgMCwgcmVsYXRpdmVOYW1lLCBsZW5ndGgsIDYpOworCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UocmVsYXRpdmVOYW1lLCAnLycsIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKKwkJCQkJQ2xhc3NGaWxlLndyaXRlVG9EaXNrKCJkOi90ZXN0L3NuaXBwZXQiLCBuZXcgU3RyaW5nKHJlbGF0aXZlTmFtZSksIGNsYXNzRmlsZS5nZXRCeXRlcygpKTsKKwkJCQkJU3RyaW5nIHN0ciA9ICJkOi90ZXN0L3NuaXBwZXQiICsgIi8iICsgbmV3IFN0cmluZyhyZWxhdGl2ZU5hbWUpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ob3JnLmVjbGlwc2UuamR0LmNvcmUudG9vbHMuY2xhc3NmbXQuZGlzYXNzZW1ibGVyLkNsYXNzRmlsZURpc2Fzc2VtYmxlci5kaXNhc3NlbWJsZShzdHIpKTsJCQkJCisgKi8JCisJCQkJCWNsYXNzRGVmaW5pdGlvbnMuYWRkKGNsYXNzRmlsZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gQ29tcGlsZSBjb21waWxhdGlvbiB1bml0CisJQ29tcGlsZXJSZXF1ZXN0b3IgY29tcGlsZXJSZXF1ZXN0b3IgPSBuZXcgQ29tcGlsZXJSZXF1ZXN0b3IoKTsKKwlDb21waWxlciBjb21waWxlciA9IGdldENvbXBpbGVyKGNvbXBpbGVyUmVxdWVzdG9yKTsKKwljb21waWxlci5jb21waWxlKG5ldyBJQ29tcGlsYXRpb25Vbml0W10ge25ldyBJQ29tcGlsYXRpb25Vbml0KCkgeworCQlwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgeworCQkJIC8vIE5hbWUgb2YgY2xhc3MgaXMgbmFtZSBvZiBDVQorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KEV2YWx1YXRvci50aGlzLmdldENsYXNzTmFtZSgpLCAiLmphdmEiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkJCXJldHVybiBzb3VyY2U7CisJCX0KKwkJcHVibGljIGNoYXJbXSBnZXRNYWluVHlwZU5hbWUoKSB7CisJCQlyZXR1cm4gRXZhbHVhdG9yLnRoaXMuZ2V0Q2xhc3NOYW1lKCk7CisJCX0KKwkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9fSk7CisJaWYgKGNvbXBpbGVyUmVxdWVzdG9yLmhhc0Vycm9ycykgeworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCQlDbGFzc0ZpbGVbXSByZXN1bHQgPSBuZXcgQ2xhc3NGaWxlW2NsYXNzRGVmaW5pdGlvbnMuc2l6ZSgpXTsKKwkJY2xhc3NEZWZpbml0aW9ucy50b0FycmF5KHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGNsYXNzLiBUaGlzIGlzIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgKiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZXh0ZW5zaW9uICIuamF2YSIgbm9yIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLgorICovCithYnN0cmFjdCBwcm90ZWN0ZWQgY2hhcltdIGdldENsYXNzTmFtZSgpOworLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29tcGlsZXIgZm9yIHRoaXMgZXZhbHVhdG9yLgorICovCitDb21waWxlciBnZXRDb21waWxlcihJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJcmV0dXJuIG5ldyBDb21waWxlcigKKwkJdGhpcy5lbnZpcm9ubWVudCwgCisJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKSwgCisJCXRoaXMub3B0aW9ucywgCisJCXJlcXVlc3RvciwgCisJCXRoaXMucHJvYmxlbUZhY3RvcnkpOworfQorLyoqCisgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIHNvdXJjZSBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4KKyAqLworYWJzdHJhY3QgcHJvdGVjdGVkIGNoYXJbXSBnZXRTb3VyY2UoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvR2xvYmFsVmFyaWFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvR2xvYmFsVmFyaWFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDM4Y2VlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9HbG9iYWxWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOworCisvKioKKyAqIEEgZ2xvYmFsIHZhcmlhYmxlIGlzIGEgdmFyaWFibGUgZGVmaW5lZCBmb3IgYW4gZXZhbHVhdGlvbiBjb250ZXh0IGFuZCB0aGF0IHBlcnNpc3RzCisgKiBhY2Nyb3NzIGV2YWx1YXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsVmFyaWFibGUgeworCWNoYXJbXSB0eXBlTmFtZTsKKwljaGFyW10gbmFtZTsKKwljaGFyW10gaW5pdGlhbGl6ZXI7CisJaW50IGRlY2xhcmF0aW9uU3RhcnQgPSAtMSwgaW5pdGlhbGl6ZXJTdGFydCA9IC0xLCBpbml0RXhwcmVzc2lvblN0YXJ0OyAvLyBwb3NpdGlvbnMgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBjbGFzcyBkZWZpbml0aW9uCisJaW50IGluaXRpYWxpemVyTGluZVN0YXJ0ID0gLTE7IC8vIGxpbmUgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBjbGFzcyBkZWZpbml0aW9uCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHR5cGUgbmFtZSwgbmFtZSBhbmQgaW5pdGlhbGl6ZXIuCisgKiBpbml0aWFsaXplciBjYW4gYmUgbnVsbCBpZiB0aGVyZSBpcyBub25lLgorICovCitwdWJsaWMgR2xvYmFsVmFyaWFibGUoY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gbmFtZSwgY2hhcltdIGluaXRpYWxpemVyKSB7CisJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplciBvZiB0aGlzIGdsb2JhbCB2YXJpYWJsZS4gVGhlIGluaXRpYWxpemVyIGlzIGEKKyAqIHZhcmlhYmxlIGluaXRpYWxpemVyIChpZS4gYW4gZXhwcmVzc2lvbiBvciBhbiBhcnJheSBpbml0aWFsaXplcikgYXMgZGVmaW5lZCAKKyAqIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb25zLgorICovCitwdWJsaWMgY2hhcltdIGdldEluaXRpYWxpemVyKCkgeworCXJldHVybiB0aGlzLmluaXRpYWxpemVyOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLgorICovCitwdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7CisJcmV0dXJuIHRoaXMubmFtZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgZG90IHNlcGFyYXRlZCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGlzIGdsb2JhbCB2YXJpYWJsZSwKKyAqIG9yIGl0cyBzaW1wbGUgcmVwcmVzZW50YXRpb24gaWYgaXQgaXMgYSBwcmltaXRpdmUgdHlwZSAoZWcuIGludCwgYm9vbGVhbiwgZXRjLikKKyAqLworcHVibGljIGNoYXJbXSBnZXRUeXBlTmFtZSgpIHsKKwlyZXR1cm4gdGhpcy50eXBlTmFtZTsKK30KKy8qKgorICogUmV0dXJucyBhIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlci4KKyAqIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkuCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMudHlwZU5hbWUpOworCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lKTsKKwlpZiAodGhpcy5pbml0aWFsaXplciAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoIj0gIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmluaXRpYWxpemVyKTsKKwl9CisJYnVmZmVyLmFwcGVuZCgiOyIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0lSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NlNmVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworCisvKioKKyAqIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgY29kZSBzbmlwcGV0IGV2YWx1YXRpb24gcmVzdWx0cy4KKyAqLworcHVibGljIGludGVyZmFjZSBJUmVxdWVzdG9yIHsKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklDb2RlU25pcHBldFJlcXVlc3RvcgorICovCitib29sZWFuIGFjY2VwdENsYXNzRmlsZXMoQ2xhc3NGaWxlW10gY2xhc3NGaWxlcywgY2hhcltdIGNvZGVTbmlwcGV0Q2xhc3NOYW1lKTsKKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklDb2RlU25pcHBldFJlcXVlc3RvcgorICovCit2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgY2hhcltdIGZyYWdtZW50U291cmNlLCBpbnQgZnJhZ21lbnRLaW5kKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSW5zdGFsbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JbnN0YWxsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZDBhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSW5zdGFsbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOworCisvKioKKyAqIEEgPGNvZGU+SW5zdGFsbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duIHdoZW4gaW5zdGFsbGluZyBjbGFzcyBmaWxlcyBvbiBhIHRhcmdldCBoYXMgZmFpbGVkCisgKiBmb3IgYW55IHJlYXNvbi4KKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworLyoqCisgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+SW5zdGFsbEV4Y2VwdGlvbjwvY29kZT4gd2l0aCBubyBkZXRhaWwgIG1lc3NhZ2UuCisgKi8KK3B1YmxpYyBJbnN0YWxsRXhjZXB0aW9uKCkgeworCXN1cGVyKCk7Cit9CisvKioKKyAqIENvbnN0cnVjdHMgYSA8Y29kZT5JbnN0YWxsRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgCisgKiBkZXRhaWwgbWVzc2FnZS4gCisgKgorICogQHBhcmFtICAgcyAgIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAqLworcHVibGljIEluc3RhbGxFeGNlcHRpb24oU3RyaW5nIHMpIHsKKwlzdXBlcihzKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzRXZhbHVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNThkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsMzEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUNvbXBpbGVyUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworCisvKioKKyAqIEEgdmFyaWFibGVzIGV2YWx1YXRvciBjb21waWxlcyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBvZiBhbiBldmFsdWF0aW9uIGNvbnRleHQgYW5kIHJldHVybnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGVzLiBPciBpdCByZXBvcnRzIHByb2JsZW1zIGFnYWluc3QgdGhlc2UgdmFyaWFibGVzLgorICovCitwdWJsaWMgY2xhc3MgVmFyaWFibGVzRXZhbHVhdG9yIGV4dGVuZHMgRXZhbHVhdG9yIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cyB7CisJaW50IHN0YXJ0UG9zT2Zmc2V0ID0gMDsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBnbG9iYWwgdmFyaWFibGVzIGV2YWx1YXRvci4KKyAqLworVmFyaWFibGVzRXZhbHVhdG9yKEV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIElOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIE1hcCBvcHRpb25zLCBJUmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisJc3VwZXIoY29udGV4dCwgZW52aXJvbm1lbnQsIG9wdGlvbnMsIHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnkpOworfQorLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRvcgorICovCitwcm90ZWN0ZWQgdm9pZCBhZGRFdmFsdWF0aW9uUmVzdWx0Rm9yQ29tcGlsYXRpb25Qcm9ibGVtKE1hcCByZXN1bHRzQnlJRHMsIElQcm9ibGVtIHByb2JsZW0sIGNoYXJbXSBjdVNvdXJjZSkgeworCS8vIHNldCBldmFsdWF0aW9uIGlkIGFuZCB0eXBlIHRvIGFuIGludGVybmFsIHByb2JsZW0gYnkgZGVmYXVsdAorCWNoYXJbXSBldmFsdWF0aW9uSUQgPSBjdVNvdXJjZTsKKwlpbnQgZXZhbHVhdGlvblR5cGUgPSBFdmFsdWF0aW9uUmVzdWx0LlRfSU5URVJOQUw7CisKKwlpbnQgcGJMaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7CisJaW50IGN1cnJlbnRMaW5lID0gMTsKKworCS8vIGNoZWNrIHBhY2thZ2UgZGVjbGFyYXRpb24JCisJY2hhcltdIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKKwlpZiAocGFja2FnZU5hbWUubGVuZ3RoID4gMCkgeworCQlpZiAocGJMaW5lID09IDEpIHsKKwkJCS8vIHNldCBldmFsdWF0aW9uIGlkIGFuZCB0eXBlCisJCQlldmFsdWF0aW9uSUQgPSBwYWNrYWdlTmFtZTsKKwkJCWV2YWx1YXRpb25UeXBlID0gRXZhbHVhdGlvblJlc3VsdC5UX1BBQ0tBR0U7CisKKwkJCS8vIHNoaWZ0IGxpbmUgbnVtYmVyLCBzb3VyY2Ugc3RhcnQgYW5kIHNvdXJjZSBlbmQKKwkJCXByb2JsZW0uc2V0U291cmNlTGluZU51bWJlcigxKTsKKwkJCXByb2JsZW0uc2V0U291cmNlU3RhcnQoMCk7CisJCQlwcm9ibGVtLnNldFNvdXJjZUVuZChldmFsdWF0aW9uSUQubGVuZ3RoIC0gMSk7CisJCX0KKwkJY3VycmVudExpbmUrKzsKKwl9CisKKwkvLyBjaGVjayBpbXBvcnRzCisJY2hhcltdW10gaW1wb3J0cyA9IHRoaXMuY29udGV4dC5pbXBvcnRzOworCWlmICgoY3VycmVudExpbmUgPD0gcGJMaW5lKSAmJiAocGJMaW5lIDwgKGN1cnJlbnRMaW5lICsgaW1wb3J0cy5sZW5ndGgpKSkgeworCQkvLyBzZXQgZXZhbHVhdGlvbiBpZCBhbmQgdHlwZQorCQlldmFsdWF0aW9uSUQgPSBpbXBvcnRzW3BiTGluZSAtIGN1cnJlbnRMaW5lXTsKKwkJZXZhbHVhdGlvblR5cGUgPSBFdmFsdWF0aW9uUmVzdWx0LlRfSU1QT1JUOworCisJCS8vIHNoaWZ0IGxpbmUgbnVtYmVyLCBzb3VyY2Ugc3RhcnQgYW5kIHNvdXJjZSBlbmQKKwkJcHJvYmxlbS5zZXRTb3VyY2VMaW5lTnVtYmVyKDEpOworCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KDApOworCQlwcm9ibGVtLnNldFNvdXJjZUVuZChldmFsdWF0aW9uSUQubGVuZ3RoIC0gMSk7CisJfQorCWN1cnJlbnRMaW5lICs9IGltcG9ydHMubGVuZ3RoICsgMTsgLy8gKyAxIHRvIHNraXAgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIGxpbmUKKworCS8vIGNoZWNrIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworCWludCB2YXJDb3VudCA9IHRoaXMuY29udGV4dC52YXJpYWJsZUNvdW50OworCWlmICgoY3VycmVudExpbmUgPD0gcGJMaW5lKSAmJiAocGJMaW5lIDwgY3VycmVudExpbmUgKyB2YXJDb3VudCkpIHsKKwkJR2xvYmFsVmFyaWFibGUgdmFyID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlc1twYkxpbmUgLSBjdXJyZW50TGluZV07CisJCQorCQkvLyBzZXQgZXZhbHVhdGlvbiBpZCBhbmQgdHlwZQorCQlldmFsdWF0aW9uSUQgPSB2YXIuZ2V0TmFtZSgpOworCQlldmFsdWF0aW9uVHlwZSA9IEV2YWx1YXRpb25SZXN1bHQuVF9WQVJJQUJMRTsKKworCQkvLyBzaGlmdCBsaW5lIG51bWJlciwgc291cmNlIHN0YXJ0IGFuZCBzb3VyY2UgZW5kCisJCWludCBwYlN0YXJ0ID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpIC0gdmFyLmRlY2xhcmF0aW9uU3RhcnQ7CisJCWludCBwYkVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCkgLSB2YXIuZGVjbGFyYXRpb25TdGFydDsKKwkJaW50IHR5cGVMZW5ndGggPSB2YXIuZ2V0VHlwZU5hbWUoKS5sZW5ndGg7CisJCWlmICgoMCA8PSBwYlN0YXJ0KSAmJiAocGJFbmQgPCB0eXBlTGVuZ3RoKSkgeworCQkJLy8gcHJvYmxlbSBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUKKwkJCXByb2JsZW0uc2V0U291cmNlTGluZU51bWJlcigtMSk7CisJCX0gZWxzZSB7CisJCQkvLyBwcm9ibGVtIG9uIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQorCQkJcGJTdGFydCAtPSB0eXBlTGVuZ3RoICsgMTsgLy8gdHlwZSBsZW5ndGggKyBzcGFjZQorCQkJcGJFbmQgLT0gdHlwZUxlbmd0aCArIDE7IC8vIHR5cGUgbGVuZ3RoICsgc3BhY2UKKwkJCXByb2JsZW0uc2V0U291cmNlTGluZU51bWJlcigwKTsKKwkJfQorCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KHBiU3RhcnQpOworCQlwcm9ibGVtLnNldFNvdXJjZUVuZChwYkVuZCk7CisJfQorCWN1cnJlbnRMaW5lID0gLTE7IC8vIG5vdCBuZWVkZWQgYW55IGxvbmdlcgorCisJLy8gY2hlY2sgdmFyaWFibGUgaW5pdGlhbGl6ZXJzCisJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJDb3VudDsgaSsrKSB7CisJCUdsb2JhbFZhcmlhYmxlIHZhciA9IHRoaXMuY29udGV4dC52YXJpYWJsZXNbaV07CisJCWNoYXJbXSBpbml0aWFsaXplciA9IHZhci5nZXRJbml0aWFsaXplcigpOworCQlpbnQgaW5pdGlhbGl6ZXJMZW5ndGggPSBpbml0aWFsaXplciA9PSBudWxsID8gMCA6IGluaXRpYWxpemVyLmxlbmd0aDsKKwkJaWYgKCh2YXIuaW5pdGlhbGl6ZXJTdGFydCA8PSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpICYmIChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIDwgdmFyLmluaXRpYWxpemVyU3RhcnQgKyB2YXIubmFtZS5sZW5ndGgpKSB7CisJCQkvKiBQcm9ibGVtIHdpdGggdGhlIHZhcmlhYmxlIG5hbWUuCisJCQkgICBJZ25vcmUgYmVjYXVzZSBpdCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHJlcG9ydGVkCisJCQkgICB3aGVuIGNoZWNraW5nIHRoZSBkZWNsYXJhdGlvbi4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKCh2YXIuaW5pdEV4cHJlc3Npb25TdGFydCA8PSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpICYmIChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIDwgdmFyLmluaXRFeHByZXNzaW9uU3RhcnQgKyBpbml0aWFsaXplckxlbmd0aCkpIHsKKwkJCS8vIHNldCBldmFsdWF0aW9uIGlkIGFuZCB0eXBlCisJCQlldmFsdWF0aW9uSUQgPSB2YXIubmFtZTsKKwkJCWV2YWx1YXRpb25UeXBlID0gRXZhbHVhdGlvblJlc3VsdC5UX1ZBUklBQkxFOworCisJCQkvLyBzaGlmdCBsaW5lIG51bWJlciwgc291cmNlIHN0YXJ0IGFuZCBzb3VyY2UgZW5kCisJCQlwcm9ibGVtLnNldFNvdXJjZUxpbmVOdW1iZXIocGJMaW5lIC0gdmFyLmluaXRpYWxpemVyTGluZVN0YXJ0ICsgMSk7CisJCQlwcm9ibGVtLnNldFNvdXJjZVN0YXJ0KHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSAtIHZhci5pbml0RXhwcmVzc2lvblN0YXJ0KTsKKwkJCXByb2JsZW0uc2V0U291cmNlRW5kKHByb2JsZW0uZ2V0U291cmNlRW5kKCkgLSB2YXIuaW5pdEV4cHJlc3Npb25TdGFydCk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSAoRXZhbHVhdGlvblJlc3VsdClyZXN1bHRzQnlJRHMuZ2V0KGV2YWx1YXRpb25JRCk7CisJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCXJlc3VsdHNCeUlEcy5wdXQoZXZhbHVhdGlvbklELCBuZXcgRXZhbHVhdGlvblJlc3VsdChldmFsdWF0aW9uSUQsIGV2YWx1YXRpb25UeXBlLCBuZXcgSVByb2JsZW1bXSB7cHJvYmxlbX0pKTsKKwl9IGVsc2UgeworCQlyZXN1bHQuYWRkUHJvYmxlbShwcm9ibGVtKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdG9yCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2V0Q2xhc3NOYW1lKCkgeworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLmNvbnRleHQuR0xPQkFMX1ZBUlNfQ0xBU1NfTkFNRV9QUkVGSVgsIEludGVnZXIudG9TdHJpbmcodGhpcy5jb250ZXh0LlZBUl9DTEFTU19DT1VOVEVSICsgMSkudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjb21waWxlciBmb3IgdGhpcyBldmFsdWF0b3IuCisgKi8KK0NvbXBpbGVyIGdldENvbXBpbGVyKElDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwlDb21waWxlciBjb21waWxlciA9IHN1cGVyLmdldENvbXBpbGVyKHJlcXVlc3Rvcik7CisJCisJLy8gSW5pdGlhbGl6ZSB0aGUgY29tcGlsZXIncyBsb29rdXAgZW52aXJvbm1lbnQgd2l0aCB0aGUgYWxyZWFkeSBjb21waWxlZCBzdXBlciBjbGFzcworCUlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSB0aGlzLmNvbnRleHQuZ2V0Um9vdENvZGVTbmlwcGV0QmluYXJ5KCk7CisJaWYgKGJpbmFyeVR5cGUgIT0gbnVsbCkgeworCQljb21waWxlci5sb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSk7CisJfQorCisJLy8gYW5kIHRoZSBpbnN0YWxsZWQgZ2xvYmFsIHZhcmlhYmxlIGNsYXNzZXMKKwlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnMgPSB0aGlzLmNvbnRleHQuaW5zdGFsbGVkVmFyczsKKwlpZiAoaW5zdGFsbGVkVmFycyAhPSBudWxsKSB7CisJCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBpbnN0YWxsZWRWYXJzLmNsYXNzRmlsZXM7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NGaWxlcy5sZW5ndGg7IGkrKykgeworCQkJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGNsYXNzRmlsZXNbaV07CisJCQlJQmluYXJ5VHlwZSBiaW5hcnkgPSBudWxsOworCQkJdHJ5IHsKKwkJCQliaW5hcnkgPSBuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzRmlsZS5nZXRCeXRlcygpLCBudWxsKTsKKwkJCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOyAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIGNvbXBpbGVkIHRoaXMgdHlwZQorCQkJfQorCQkJY29tcGlsZXIubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGJpbmFyeSk7CisJCX0KKwl9CisJCisJcmV0dXJuIGNvbXBpbGVyOwkKK30KKy8qKgorICogUmV0dXJucyB0aGUgbmFtZSBvZiBwYWNrYWdlIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2V0UGFja2FnZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMuY29udGV4dC5wYWNrYWdlTmFtZTsKK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5FdmFsdWF0b3IKKyAqLworcHJvdGVjdGVkIGNoYXJbXSBnZXRTb3VyY2UoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlpbnQgbGluZU51bWJlck9mZnNldCA9IDE7CisJCisJLy8gcGFja2FnZSBkZWNsYXJhdGlvbgorCWNoYXJbXSBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7CisJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCAhPSAwKSB7CisJCWJ1ZmZlci5hcHBlbmQoInBhY2thZ2UgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChwYWNrYWdlTmFtZSk7CisJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCWxpbmVOdW1iZXJPZmZzZXQrKzsKKwl9CisKKwkvLyBpbXBvcnQgZGVjbGFyYXRpb25zCisJY2hhcltdW10gaW1wb3J0cyA9IHRoaXMuY29udGV4dC5pbXBvcnRzOworCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKCJpbXBvcnQgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChpbXBvcnRzW2ldKTsKKwkJYnVmZmVyLmFwcGVuZCgnOycpLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKKwkJbGluZU51bWJlck9mZnNldCsrOworCX0KKworCS8vIGNsYXNzIGRlY2xhcmF0aW9uCisJYnVmZmVyLmFwcGVuZCgicHVibGljIGNsYXNzICIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZChnZXRDbGFzc05hbWUoKSk7CisJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKFBBQ0tBR0VfTkFNRSk7CisJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZChST09UX0NMQVNTX05BTUUpOworCWJ1ZmZlci5hcHBlbmQoIiB7IikuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJbGluZU51bWJlck9mZnNldCsrOworCXN0YXJ0UG9zT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCgpOworCisJLy8gZmllbGQgZGVjbGFyYXRpb25zCisJR2xvYmFsVmFyaWFibGVbXSB2YXJzID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlczsKKwlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnMgPSB0aGlzLmNvbnRleHQuaW5zdGFsbGVkVmFyczsKKwlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY29udGV4dC52YXJpYWJsZUNvdW50OyBpKyspeworCQlHbG9iYWxWYXJpYWJsZSB2YXIgPSB2YXJzW2ldOworCQlidWZmZXIuYXBwZW5kKCJcdHB1YmxpYyBzdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKKwkJdmFyLmRlY2xhcmF0aW9uU3RhcnQgPSBidWZmZXIubGVuZ3RoKCk7CisJCWJ1ZmZlci5hcHBlbmQodmFyLnR5cGVOYW1lKTsKKwkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCWNoYXJbXSB2YXJOYW1lID0gdmFyLm5hbWU7CisJCWJ1ZmZlci5hcHBlbmQodmFyTmFtZSk7CisJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCWxpbmVOdW1iZXJPZmZzZXQrKzsKKwl9CisKKwkvLyBmaWVsZCBpbml0aWFsaXphdGlvbnMKKwlidWZmZXIuYXBwZW5kKCJcdHN0YXRpYyB7IikuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJbGluZU51bWJlck9mZnNldCsrOworCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb250ZXh0LnZhcmlhYmxlQ291bnQ7IGkrKyl7CisJCUdsb2JhbFZhcmlhYmxlIHZhciA9IHZhcnNbaV07CisJCWNoYXJbXSB2YXJOYW1lID0gdmFyLm5hbWU7CisJCUdsb2JhbFZhcmlhYmxlIGluc3RhbGxlZFZhciA9IGluc3RhbGxlZFZhcnMgPT0gbnVsbCA/IG51bGwgOiBpbnN0YWxsZWRWYXJzLnZhck5hbWVkKHZhck5hbWUpOworCQlpZiAoaW5zdGFsbGVkVmFyID09IG51bGwgfHwgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGluc3RhbGxlZFZhci50eXBlTmFtZSwgdmFyLnR5cGVOYW1lKSkgeworCQkJLy8gSW5pdGlhbGl6ZSB3aXRoIGluaXRpYWxpemVyIGlmIHRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZQorCQkJY2hhcltdIGluaXRpYWxpemVyID0gdmFyLmluaXRpYWxpemVyOworCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJcdFx0dHJ5IHsiKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwkJCQlsaW5lTnVtYmVyT2Zmc2V0Kys7CisJCQkJdmFyLmluaXRpYWxpemVyTGluZVN0YXJ0ID0gbGluZU51bWJlck9mZnNldDsKKwkJCQlidWZmZXIuYXBwZW5kKCJcdFx0XHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXZhci5pbml0aWFsaXplclN0YXJ0ID0gYnVmZmVyLmxlbmd0aCgpOworCQkJCWJ1ZmZlci5hcHBlbmQodmFyTmFtZSk7CisJCQkJYnVmZmVyLmFwcGVuZCgiPSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXZhci5pbml0RXhwcmVzc2lvblN0YXJ0ID0gYnVmZmVyLmxlbmd0aCgpOworCQkJCWJ1ZmZlci5hcHBlbmQoaW5pdGlhbGl6ZXIpOworCQkJCWxpbmVOdW1iZXJPZmZzZXQgKz0gbnVtYmVyT2ZDUnMoaW5pdGlhbGl6ZXIpOworCQkJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCQkJYnVmZmVyLmFwcGVuZCgiXHRcdH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7IikuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJCQkJYnVmZmVyLmFwcGVuZCgiXHRcdFx0ZS5wcmludFN0YWNrVHJhY2UoKTsiKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwkJCQlidWZmZXIuYXBwZW5kKCJcdFx0fSIpLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAorCQkJCWxpbmVOdW1iZXJPZmZzZXQgKz0gNDsgLy8gNCBDUnMKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIEluaXRpYWxpemUgd2l0aCBwcmV2aW91cyB2YWx1ZSBpZiBuYW1lIGFuZCB0eXBlIGFyZSB0aGUgc2FtZQorCQkJYnVmZmVyLmFwcGVuZCgiXHRcdCIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHZhck5hbWUpOworCQkJYnVmZmVyLmFwcGVuZCgiPSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJY2hhcltdIGluc3RhbGxlZFBhY2thZ2VOYW1lID0gaW5zdGFsbGVkVmFycy5wYWNrYWdlTmFtZTsKKwkJCWlmIChpbnN0YWxsZWRQYWNrYWdlTmFtZSAhPSBudWxsICYmIGluc3RhbGxlZFBhY2thZ2VOYW1lLmxlbmd0aCAhPSAwKSB7CisJCQkJYnVmZmVyLmFwcGVuZChpbnN0YWxsZWRQYWNrYWdlTmFtZSk7CisJCQkJYnVmZmVyLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlidWZmZXIuYXBwZW5kKGluc3RhbGxlZFZhcnMuY2xhc3NOYW1lKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZCh2YXJOYW1lKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJzsnKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7CisJCQlsaW5lTnVtYmVyT2Zmc2V0Kys7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgiXHR9IikuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJCisJLy8gZW5kIG9mIGNsYXNzIGRlY2xhcmF0aW9uCisJYnVmZmVyLmFwcGVuZCgnfScpLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKKworCS8vIHJldHVybiByZXN1bHQKKwlpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOworCWJ1ZmZlci5nZXRDaGFycygwLCBsZW5ndGgsIHJlc3VsdCwgMCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNhcmlhZ2UgcmV0dXJucyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gc291cmNlLgorICovCitwcml2YXRlIGludCBudW1iZXJPZkNScyhjaGFyW10gc291cmNlKSB7CisJaW50IG51bWJlck9mQ1JzID0gMDsKKwlib29sZWFuIGxhc3RXYXNDUiA9IGZhbHNlOworCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7CisJCWNoYXIgY3VycmVudENoYXIgPSBzb3VyY2VbaV07CisJCXN3aXRjaChjdXJyZW50Q2hhcil7CisJCQljYXNlICdccicgOgorCQkJCWxhc3RXYXNDUiA9IHRydWU7CisJCQkJbnVtYmVyT2ZDUnMrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xuJyA6CisJCQkJaWYgKCFsYXN0V2FzQ1IpIG51bWJlck9mQ1JzKys7IC8vIG1lcmdlIENSLUxGCisJCQkJbGFzdFdhc0NSID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlsYXN0V2FzQ1IgPSBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gbnVtYmVyT2ZDUnM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmZkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0luZm8uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0YWxsZWQgdmFyaWFibGVzIHN1Y2ggYXMKKyAqIHRoZWlyIG5hbWVzLCB0aGVpciB0eXBlcywgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGVtLAorICogdGhlIGJpbmFyeSBvZiB0aGUgY2xhc3MgKHRvIGJlIHBhc3NlZCB0byB0aGUgbmFtZSBlbnZpcm9ubWVudCB3aGVuCisgKiBjb21waWxpbmcgdGhlIGNvZGUgc25pcHBldCkuCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZXNJbmZvIHsKKwlHbG9iYWxWYXJpYWJsZVtdIHZhcmlhYmxlczs7CisJaW50IHZhcmlhYmxlQ291bnQ7CisJY2hhcltdIHBhY2thZ2VOYW1lOworCWNoYXJbXSBjbGFzc05hbWU7CisJQ2xhc3NGaWxlW10gY2xhc3NGaWxlczsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB2YXJpYWJsZXMgaW5mby4KKyAqIFRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgY2xhc3MgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgY2xhc3MuCisgKiBUaGUgcGFja2FnZSBuYW1lIGNhbiBiZSBudWxsIGlmIHRoZSB2YXJpYWJsZXMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gdGhlIGRlZmF1bHQgcGFja2FnZS4KKyAqLworcHVibGljIFZhcmlhYmxlc0luZm8oY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzLCBHbG9iYWxWYXJpYWJsZVtdIHZhcmlhYmxlcywgaW50IHZhcmlhYmxlQ291bnQpIHsKKwl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJdGhpcy5jbGFzc0ZpbGVzID0gY2xhc3NGaWxlczsKKwl0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKKwl0aGlzLnZhcmlhYmxlQ291bnQgPSB2YXJpYWJsZUNvdW50OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gdmFyaWFibGUuCisgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4KKyAqLworaW50IGluZGV4T2YoR2xvYmFsVmFyaWFibGUgdmFyKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnZhcmlhYmxlQ291bnQ7IGkrKykgeworCQlpZiAodmFyLmVxdWFscyh0aGlzLnZhcmlhYmxlc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9OworCXJldHVybiAtMTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuCisgKi8KK0dsb2JhbFZhcmlhYmxlIHZhck5hbWVkKGNoYXJbXSBuYW1lKSB7CisJR2xvYmFsVmFyaWFibGVbXSB2YXJzID0gdGhpcy52YXJpYWJsZXM7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnZhcmlhYmxlQ291bnQ7IGkrKykgeworCQlHbG9iYWxWYXJpYWJsZSB2YXIgPSB2YXJzW2ldOworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgdmFyLm5hbWUpKQorCQkJcmV0dXJuIHZhcjsKKwl9OworCXJldHVybiBudWxsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTJkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwyNTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbmZpZ3VyYWJsZU9wdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5pbXBsLkZvcm1hdHRlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5pbXBsLlNwbGl0TGluZTsKKworLyoqIDxoMj5Ib3cgdG8gZm9ybWF0IGEgcGllY2Ugb2YgY29kZSA/PC9oMj4KKyAqIDx1bD48bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPkNvZGVGb3JtYXR0ZXI8L2NvZGU+CisgKiA8bGk+VXNlIHRoZSBtZXRob2QgPGNvZGU+dm9pZCBmb3JtYXQoYVN0cmluZyk8L2NvZGU+CisgKiBvbiB0aGlzIGluc3RhbmNlIHRvIGZvcm1hdCA8Y29kZT5hU3RyaW5nPC9jb2RlPi4KKyAqIEl0IHdpbGwgcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLjwvdWw+CisqLworcHVibGljIGNsYXNzIENvZGVGb3JtYXR0ZXIgaW1wbGVtZW50cyBJVGVybWluYWxTeW1ib2xzLCBJQ29kZUZvcm1hdHRlciB7CisKKwlwdWJsaWMgRm9ybWF0dGVyT3B0aW9ucyBvcHRpb25zOworCisJLyoqIAorCSAqIFJlcHJlc2VudHMgYSBibG9jayBpbiB0aGUgPGNvZGU+Y29uc3RydWN0aW9uczwvY29kZT4gc3RhY2suCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0sgPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRTsKKworCS8qKiAKKwkgKiBSZXByZXNlbnRzIGEgYmxvY2sgZm9sbG93aW5nIGEgY29udHJvbCBzdGF0ZW1lbnQgaW4gdGhlIDxjb2RlPmNvbnN0cnVjdGlvbnM8L2NvZGU+IHN0YWNrLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTklOREVOVF9CTE9DSyA9IC0xMDA7CisKKwkvKiogCisJICogQ29udGFpbnMgdGhlIGZvcm1hdHRlZCBvdXRwdXQuCisJICovCisJU3RyaW5nQnVmZmVyIGZvcm1hdHRlZFNvdXJjZTsKKworCS8qKiAKKwkgKiBDb250YWlucyB0aGUgY3VycmVudCBsaW5lLjxicj4KKwkgKiBXaWxsIGJlIGR1bXBlZCBhdCB0aGUgbmV4dCAibmV3bGluZSIKKwkgKi8KKwlTdHJpbmdCdWZmZXIgY3VycmVudExpbmVCdWZmZXI7CisKKwkvKiogCisJICogVXNlZCBkdXJpbmcgdGhlIGZvcm1hdHRpbmcgdG8gZ2V0IGVhY2ggdG9rZW4uCisJICovCisJU2Nhbm5lciBzY2FubmVyOworCisJLyoqIAorCSAqIENvbnRhaW5zIHRoZSB0b2tlbnMgcmVzcG9uc2libGUgZm9yIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsCisJICogYW5kIHRoZSBibG9ja3Mgbm90IGNsb3NlZCB5ZXQuCisJICovCisJcHJpdmF0ZSBpbnRbXSBjb25zdHJ1Y3Rpb25zOworCisJLyoqIAorCSAqIEluZGV4IGluIHRoZSA8Y29kZT5jb25zdHJ1Y3Rpb25zPC9jb2RlPiBhcnJheS4KKwkgKi8KKwlwcml2YXRlIGludCBjb25zdHJ1Y3Rpb25zQ291bnQ7CisKKwkvKiogCisJICogTGV2ZWwgb2YgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG51bWJlciBvZiB0YWIgY2hhciBwdXQgaW4gZnJvbnQgb2YgaXQpLgorCSAqLworCXByaXZhdGUgaW50IGluZGVudGF0aW9uTGV2ZWw7CisKKwkvKiogCisJICogUmVndWxhciBsZXZlbCBvZiBpbmRlbnRhdGlvbiBvZiBhbGwgdGhlIGxpbmVzCisJICovCisJcHJpdmF0ZSBpbnQgaW5pdGlhbEluZGVudGF0aW9uTGV2ZWw7CisKKwkvKiogCisJICogVXNlZCB0byBzcGxpdCBhIGxpbmUuCisJICovCisJU2Nhbm5lciBzcGxpdFNjYW5uZXI7CisKKwkvKiogCisJICogVG8gcmVtZW1iZXIgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYW5kIHRoZQorCSAqIGJlZ2lubmluZyBvZiB0aGUgY29tbWVudC4KKwkgKi8KKwlpbnQgY3VycmVudENvbW1lbnRPZmZzZXQ7CisJaW50IGN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbDsKKwlpbnQgbWF4TGluZVNpemUgPSAzMDsKKwlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNPcGVuQ2xvc2VCcmFjZXM7CisJcHJpdmF0ZSBpbnQgaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlczsKKworCS8qKgorCSAqIENvbGxlY3Rpb25zIG9mIHBvc2l0aW9ucyB0byBtYXAKKwkgKi8KKwlwcml2YXRlIGludFtdIHBvc2l0aW9uc1RvTWFwOworCisJLyoqCisJICogQ29sbGVjdGlvbnMgb2YgbWFwcGVkIHBvc2l0aW9ucworCSAqLworCXByaXZhdGUgaW50W10gbWFwcGVkUG9zaXRpb25zOworCisJcHJpdmF0ZSBpbnQgaW5kZXhUb01hcDsKKworCXByaXZhdGUgaW50IGluZGV4SW5NYXA7CisKKwlwcml2YXRlIGludCBnbG9iYWxEZWx0YTsKKworCXByaXZhdGUgaW50IGxpbmVEZWx0YTsKKworCXByaXZhdGUgaW50IHNwbGl0RGVsdGE7CisKKwlwcml2YXRlIGludCBiZWdpbm5pbmdPZkxpbmVJbmRleDsKKworCXByaXZhdGUgaW50IG11bHRpcGxlTGluZUNvbW1lbnRDb3VudGVyOworCQorCS8qKiAKKwkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIENvZGUgRm9ybWF0dGVyIHVzaW5nIHRoZSBnaXZlbiBzZXR0aW5ncy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQorCSAqLworCXB1YmxpYyBDb2RlRm9ybWF0dGVyKENvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzKSB7CisJCXRoaXMoY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoc2V0dGluZ3MpKTsKKwl9CisJCisJLyoqIAorCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQ29kZSBGb3JtYXR0ZXIgdXNpbmcgdGhlIEZvcm1hdHRpbmdPcHRpb25zIG9iamVjdAorCSAqIGdpdmVuIGFzIGFyZ3VtZW50CisJICogQGRlcHJlY2F0ZWQgVXNlIENvZGVGb3JtYXR0ZXIoQ29uZmlndXJhYmxlT3B0aW9uW10pIGluc3RlYWQKKwkgKi8KKwlwdWJsaWMgQ29kZUZvcm1hdHRlcigpIHsKKwkJdGhpcygoTWFwKW51bGwpOworCX0KKwkvKiogCisJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBDb2RlIEZvcm1hdHRlciB1c2luZyB0aGUgZ2l2ZW4gc2V0dGluZ3MuCisJICovCisJcHVibGljIENvZGVGb3JtYXR0ZXIoTWFwIHNldHRpbmdzKSB7CisKKwkJLy8gaW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZQorCQljb25zdHJ1Y3Rpb25zQ291bnQgPSAwOworCQljb25zdHJ1Y3Rpb25zID0gbmV3IGludFsxMF07CisJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgPSBpbml0aWFsSW5kZW50YXRpb25MZXZlbDsKKwkJY3VycmVudENvbW1lbnRPZmZzZXQgPSAtMTsKKworCQkvLyBpbml0aWFsaXplIHByaW1hcnkgYW5kIHNlY29uZGFyeSBzY2FubmVycworCQlzY2FubmVyID0gbmV3IFNjYW5uZXIodHJ1ZSwgdHJ1ZSk7IC8vIHJlZ3VsYXIgc2Nhbm5lciBmb3IgZm9ybWluZyBsaW5lcworCQlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSB0cnVlOworCQkvLyB0byByZW1pbmQgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCisJCXNwbGl0U2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsIHRydWUpOworCQkvLyBzZWNvbmRhcnkgc2Nhbm5lciB0byBzcGxpdCBsb25nIGxpbmVzIGZvcm1lZCBieSBwcmltYXJ5IHNjYW5uaW5nCisKKwkJLy8gaW5pdGlhbGl6ZSBjdXJyZW50IGxpbmUgYnVmZmVyCisJCWN1cnJlbnRMaW5lQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0aGlzLm9wdGlvbnMgPSBuZXcgRm9ybWF0dGVyT3B0aW9ucyhzZXR0aW5ncyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIGEgbGluZVNlcGFyYXRvciBoYXMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIDxjb2RlPm9wZXJhdG9yPC9jb2RlPgorCSAqIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJyZWFrTGluZUJlZm9yZU9wZXJhdG9yKGludCBvcGVyYXRvcikgeworCQlzd2l0Y2ggKG9wZXJhdG9yKSB7CisJCQljYXNlIFRva2VuTmFtZUNPTU1BIDoKKwkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDoKKwkJCWNhc2UgVG9rZW5OYW1lRVFVQUwgOgorCQkJCXJldHVybiBmYWxzZTsKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiB0cnVlOworCQl9CisJfQorCQorCQkvKiogCisJICogQGRlcHJlY2F0ZWQgYmFja3BvcnQgMS4wIGludGVybmFsIGZ1bmN0aW9uYWxpdHkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXAgY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoQ29uZmlndXJhYmxlT3B0aW9uW10gc2V0dGluZ3MpIHsKKwkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2V0dGluZ3MubGVuZ3RoOyBpKyspIHsKKwkJCWlmKHNldHRpbmdzW2ldLmdldENvbXBvbmVudE5hbWUoKS5lcXVhbHMoQ29kZUZvcm1hdHRlci5jbGFzcy5nZXROYW1lKCkpKXsKKwkJCQlTdHJpbmcgb3B0aW9uTmFtZSA9IHNldHRpbmdzW2ldLmdldE9wdGlvbk5hbWUoKTsKKwkJCQlpbnQgdmFsdWVJbmRleCA9IHNldHRpbmdzW2ldLmdldEN1cnJlbnRWYWx1ZUluZGV4KCk7CisJCQkJCisJCQkJaWYob3B0aW9uTmFtZS5lcXVhbHMoIm5ld2xpbmUub3BlbmluZ0JyYWNlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUub3BlbmluZ0JyYWNlIiwgdmFsdWVJbmRleCA9PSAwID8gImluc2VydCIgOiAiZG8gbm90IGluc2VydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQorCQkJCX0gZWxzZSBpZihvcHRpb25OYW1lLmVxdWFscygibmV3bGluZS5jb250cm9sU3RhdGVtZW50IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUuY29udHJvbFN0YXRlbWVudCIsICB2YWx1ZUluZGV4ID09IDAgPyAiaW5zZXJ0IiA6ICJkbyBub3QgaW5zZXJ0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCisJCQkJfSBlbHNlIGlmKG9wdGlvbk5hbWUuZXF1YWxzKCJuZXdsaW5lLmNsZWFyQWxsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUuY2xlYXJBbGwiLCAgdmFsdWVJbmRleCA9PSAwID8gImNsZWFyIGFsbCIgOiAicHJlc2VydmUgb25lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCisJCQkJfSBlbHNlIGlmKG9wdGlvbk5hbWUuZXF1YWxzKCJuZXdsaW5lLmVsc2VJZiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb3B0aW9ucy5wdXQoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmVsc2VJZiIsICB2YWx1ZUluZGV4ID09IDAgPyAiZG8gbm90IGluc2VydCIgOiAiaW5zZXJ0IiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQorCQkJCX0gZWxzZSBpZihvcHRpb25OYW1lLmVxdWFscygibmV3bGluZS5lbXB0eUJsb2NrIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUuZW1wdHlCbG9jayIsICB2YWx1ZUluZGV4ID09IDAgPyAiaW5zZXJ0IiA6ICJkbyBub3QgaW5zZXJ0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCisJCQkJfSBlbHNlIGlmKG9wdGlvbk5hbWUuZXF1YWxzKCJsaW5lU3BsaXQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KCJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IiwgU3RyaW5nLnZhbHVlT2YodmFsdWVJbmRleCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkKKwkJCQl9IGVsc2UgaWYob3B0aW9uTmFtZS5lcXVhbHMoInN0eWxlLmFzc2lnbm1lbnQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KCJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuc3R5bGUuYXNzaWdubWVudCIsICB2YWx1ZUluZGV4ID09IDAgPyAiY29tcGFjdCIgOiAibm9ybWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCisJCQkJfSBlbHNlIGlmKG9wdGlvbk5hbWUuZXF1YWxzKCJ0YWJ1bGF0aW9uLmNoYXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KCJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyIiwgIHZhbHVlSW5kZXggPT0gMCA/ICJ0YWIiIDogInNwYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCisJCQkJfSBlbHNlIGlmKG9wdGlvbk5hbWUuZXF1YWxzKCJ0YWJ1bGF0aW9uLnNpemUiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KCJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIiwgU3RyaW5nLnZhbHVlT2YodmFsdWVJbmRleCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBvcHRpb25zOworCX0KKworCS8qKiAKKwkgKiBSZXR1cm5zIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBjb2RlLgorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvcHlSZW1haW5pbmdTb3VyY2UoKSB7CisJCWNoYXIgc3RyW10gPSBzY2FubmVyLnNvdXJjZTsKKwkJaW50IHN0YXJ0UG9zaXRpb24gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCWludCBsZW5ndGggPSBzdHIubGVuZ3RoIC0gc3RhcnRQb3NpdGlvbjsKKwkJU3RyaW5nQnVmZmVyIGJ1ZnIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7CisJCWlmIChzdGFydFBvc2l0aW9uIDwgc3RyLmxlbmd0aCkgeworCQkJYnVmci5hcHBlbmQoc3RyLCBzdGFydFBvc2l0aW9uLCBsZW5ndGgpOworCQl9CisJCXJldHVybiAoYnVmci50b1N0cmluZygpKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnRzIDxjb2RlPnRhYkNvdW50PC9jb2RlPiB0YWIgY2hhcmFjdGVyIG9yIHRoZWlyIGVxdWl2YWxlbnQgbnVtYmVyIG9mIHNwYWNlcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZHVtcFRhYihpbnQgdGFiQ291bnQpIHsKKwkJaWYgKG9wdGlvbnMuaW5kZW50V2l0aFRhYikgeworCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0YWJDb3VudDsgaisrKSB7CisJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnXHQnKTsKKwkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gb3B0aW9ucy50YWJTaXplICogdGFiQ291bnQ7IGkgPCBtYXg7IGkrKykgeworCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBEdW1wcyA8Y29kZT5jdXJyZW50TGluZUJ1ZmZlcjwvY29kZT4gaW50byB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgZmx1c2hCdWZmZXIoKSB7CisJCVN0cmluZyBjdXJyZW50U3RyaW5nID0gY3VycmVudExpbmVCdWZmZXIudG9TdHJpbmcoKTsKKwkJc3BsaXREZWx0YSA9IDA7CisJCWJlZ2lubmluZ09mTGluZUluZGV4ID0gZm9ybWF0dGVkU291cmNlLmxlbmd0aCgpOworCQlpZiAoY29udGFpbnNPcGVuQ2xvc2VCcmFjZXMpIHsKKwkJCWNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzID0gZmFsc2U7CisJCQlvdXRwdXRMaW5lKAorCQkJCWN1cnJlbnRTdHJpbmcsCisJCQkJZmFsc2UsCisJCQkJaW5kZW50YXRpb25MZXZlbEZvck9wZW5DbG9zZUJyYWNlcywKKwkJCQkwLAorCQkJCS0xLAorCQkJCW51bGwsCisJCQkJMCk7CisJCQlpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzID0gY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsOworCQl9IGVsc2UgeworCQkJb3V0cHV0TGluZShjdXJyZW50U3RyaW5nLCBmYWxzZSwgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsLCAwLCAtMSwgbnVsbCwgMCk7CisJCX0KKwkJaW50IHNjYW5uZXJTb3VyY2VMZW5ndGggPSBzY2FubmVyLnNvdXJjZS5sZW5ndGg7CisJCWlmIChzY2FubmVyU291cmNlTGVuZ3RoID4gMikgeworCQkJaWYgKHNjYW5uZXIuc291cmNlW3NjYW5uZXJTb3VyY2VMZW5ndGggLSAxXSA9PSAnXG4nICYmIAorCQkJCXNjYW5uZXIuc291cmNlW3NjYW5uZXJTb3VyY2VMZW5ndGggLSAyXSA9PSAnXHInKSB7CisJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJCQlpbmNyZWFzZUdsb2JhbERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCAtIDIpOworCQkJfSBlbHNlIGlmIChzY2FubmVyLnNvdXJjZVtzY2FubmVyU291cmNlTGVuZ3RoIC0gMV0gPT0gJ1xuJykgeworCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJCWluY3JlYXNlR2xvYmFsRGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoIC0gMSk7CisJCQl9IGVsc2UgaWYgKHNjYW5uZXIuc291cmNlW3NjYW5uZXJTb3VyY2VMZW5ndGggLSAxXSA9PSAnXHInKSB7CisJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7CisJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGggLSAxKTsKKwkJCX0KKwkJfQorCQl1cGRhdGVNYXBwZWRQb3NpdGlvbnMoc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwl9CisKKwkvKiogCisJICogRm9ybWF0cyB0aGUgaW5wdXQgc3RyaW5nLgorCSAqLworCXByaXZhdGUgdm9pZCBmb3JtYXQoKSB7CisJCWludCB0b2tlbiA9IDA7CisJCWludCBwcmV2aW91c1Rva2VuID0gMDsKKwkJaW50IHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID0gMDsKKwkJaW50IGluZGVudGF0aW9uT2Zmc2V0ID0gMDsKKwkJaW50IG5ld0xpbmVzSW5XaGl0ZXNwYWNlID0gMDsKKworCQkvLyBudW1iZXIgb2YgbmV3IGxpbmVzIGluIHRoZSBwcmV2aW91cyB3aGl0ZXNwYWNlIHRva2VuCisJCS8vICh1c2VkIHRvIGxlYXZlIGJsYW5rIGxpbmVzIGJlZm9yZSBjb21tZW50cykKKwkJaW50IHBlbmRpbmdOZXdMaW5lcyA9IDA7CisJCWJvb2xlYW4gZXhwZWN0aW5nT3BlbkJyYWNlID0gZmFsc2U7CisJCWJvb2xlYW4gY2xlYXJOb25CbG9ja0luZGVudHMgPSBmYWxzZTsKKwkJLy8gdHJ1ZSBpZiBhbGwgaW5kZW50YXRpb25zIHRpbGwgdGhlIDFzdCB7ICh1c2VmdWxsIGFmdGVyIH0gb3IgOykKKwkJYm9vbGVhbiBwZW5kaW5nU3BhY2UgPSB0cnVlOworCQlib29sZWFuIHBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IGZhbHNlOworCQkvLyB0cnVlIHdoZW4gYSBjciBpcyB0byBiZSBwdXQgYWZ0ZXIgYSApIChpbiBjb25kaXRpb25hbCBzdGF0ZW1lbnRzKQorCQlib29sZWFuIGluQXNzaWdubWVudCA9IGZhbHNlOworCQlib29sZWFuIGluQXJyYXlBc3NpZ25tZW50ID0gZmFsc2U7CisJCWJvb2xlYW4gaW5UaHJvd3NDbGF1c2UgPSBmYWxzZTsKKwkJYm9vbGVhbiBpbkNsYXNzT3JJbnRlcmZhY2VIZWFkZXIgPSBmYWxzZTsKKworCQkvLyBvcGVuQnJhY2tldENvdW50IGlzIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBvcGVuIGJyYWNrZXRzIG5vdCBjbG9zZWQgeWV0LgorCQlpbnQgb3BlbkJyYWNrZXRDb3VudCA9IDA7CisJCWludCB1bmFyeVNpZ25Nb2RpZmllciA9IDA7CisKKwkJLy8gb3BlblBhcmVudGhlc2lzWzBdIGlzIHVzZWQgdG8gY291bnQgdGhlIHBhcmVudGhlc2lzIG5vdCBiZWxvbmdpbmcgdG8gYSBjb25kaXRpb24KKwkJLy8gKGVnIGZvbygpOykuIHBhcmVudGhlc2lzIGluIGZvciAoLi4uKSBhcmUgY291bnQgZWxzZXdoZXJlIGluIHRoZSBhcnJheS4KKwkJaW50IG9wZW5QYXJlbnRoZXNpc0NvdW50ID0gMTsKKwkJaW50W10gb3BlblBhcmVudGhlc2lzID0gbmV3IGludFsxMF07CisKKwkJLy8gdG9rZW5CZWZvcmVDb2xvbiBpcyB1c2VkIHRvIGtub3cgd2hhdCB0b2tlbiBnb2VzIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgOgorCQkvLyBpdCBjYW4gYmUgY2FzZSBvciA/CisJCWludCB0b2tlbkJlZm9yZUNvbG9uQ291bnQgPSAwOworCQlpbnRbXSB0b2tlbkJlZm9yZUNvbG9uID0gbmV3IGludFsxMF07CisKKwkJY29uc3RydWN0aW9uc0NvdW50ID0gMDsgLy8gaW5pdGlhbGl6ZXMgdGhlIGNvbnN0cnVjdGlvbnMgY291bnQuCisKKwkJLy8gY29udGFpbnMgRE8gaWYgaW4gYSBETy4uV0hJTEUgc3RhdGVtZW50LCBVTklUSUFMSVpFRCBvdGhlcndpc2UuCisJCWludCBubGljc1Rva2VuID0gMDsKKworCQkvLyBmaXggZm9yIDFGRjE3WFk6IExGQ09NOkFMTCAtIEZvcm1hdCBwcm9ibGVtIG9uIG5vdCBtYXRjaGluZyB9IGFuZCBlbHNlIAorCQlib29sZWFuIHNwZWNpYWxFbHNlID0gZmFsc2U7CisKKwkJLy8gT1BUSU9OIChJbmRlbnRhdGlvbkxldmVsKTogaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbCBtYXkgYmUgbm9uLXplcm8uCisJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCArPSBjb25zdHJ1Y3Rpb25zQ291bnQ7CisKKwkJLy8gQW4gSW52YWxpZElucHV0RXhjZXB0aW9uIGV4Y2VwdGlvbiBtaWdodCBjYXVzZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBsb29wLgorCQl0cnkgeworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQkvLyBHZXQgdGhlIG5leHQgdG9rZW4uICBDYXRjaCBpbnZhbGlkIGlucHV0IGFuZCBvdXRwdXQgaXQKKwkJCQkvLyB3aXRoIG1pbmltYWwgZm9ybWF0dGluZywgYWxzbyBjYXRjaCBlbmQgb2YgaW5wdXQgYW5kCisJCQkJLy8gZXhpdCB0aGUgbG9vcC4KKwkJCQl0cnkgeworCQkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKCFoYW5kbGVJbnZhbGlkVG9rZW4oZSkpIHsKKwkJCQkJCXRocm93IGU7CisJCQkJCX0KKwkJCQkJdG9rZW4gPSAwOworCQkJCX0KKwkJCQlpZiAodG9rZW4gPT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpCisJCQkJCWJyZWFrOworCisJCQkJLyogIyMgTU9ESUZZSU5HIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBiZWZvcmUgZ2VuZXJhdGluZyBuZXcgbGluZXMKKwkJCQlhbmQgaW5kZW50YXRpb24gaW4gdGhlIG91dHB1dCBzdHJpbmcKKwkJCQkqLworCisJCQkJLy8gUmVtb3ZlcyBhbGwgdGhlIGluZGVudGF0aW9ucyBtYWRlIGJ5IHN0YXRlbWVudHMgbm90IGZvbGxvd2VkIGJ5IGEgYmxvY2sKKwkJCQkvLyBleGNlcHQgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgRUxTRSwgQ0FUQ0ggb3IgaWYgd2UgYXJlIGluIGEgc3dpdGNoL2Nhc2UKKwkJCQlpZiAoY2xlYXJOb25CbG9ja0luZGVudHMgJiYgKHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSkpIHsKKwkJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQkJY2FzZSBUb2tlbk5hbWVlbHNlIDoKKwkJCQkJCQlpZiAoY29uc3RydWN0aW9uc0NvdW50ID4gMAorCQkJCQkJCQkmJiBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IFRva2VuTmFtZWVsc2UpIHsKKwkJCQkJCQkJcGVuZGluZ05ld0xpbmVzID0gMTsKKwkJCQkJCQkJc3BlY2lhbEVsc2UgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcEluY2x1c2l2ZVVudGlsKFRva2VuTmFtZWlmKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVG9rZW5OYW1lY2F0Y2ggOgorCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWwoVG9rZW5OYW1lY2F0Y2gpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBUb2tlbk5hbWVmaW5hbGx5IDoKKwkJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcEluY2x1c2l2ZVVudGlsKFRva2VuTmFtZWNhdGNoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVG9rZW5OYW1ld2hpbGUgOgorCQkJCQkJCWlmIChubGljc1Rva2VuID09IFRva2VuTmFtZWRvKSB7CisJCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wKFRva2VuTmFtZWRvKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3BFeGNsdXNpdmVVbnRpbEJsb2NrT3JDYXNlKCk7CisJCQkJCQkJLy8gY2xlYXIgdW50aWwgYSBDQVNFLCBERUZBVUxUIG9yIEJMT0NLIGlzIGVuY291bnRlcmVkLgorCQkJCQkJCS8vIFRodXMsIHRoZSBpbmRlbnRhdGlvbkxldmVsIGlzIGNvcnJlY3RseSBjbGVhcmVkIGVpdGhlcgorCQkJCQkJCS8vIGluIGEgc3dpdGNoL2Nhc2Ugc3RhdGVtZW50IG9yIGluIGFueSBvdGhlciBzaXR1YXRpb24uCisJCQkJCX0KKwkJCQkJY2xlYXJOb25CbG9ja0luZGVudHMgPSBmYWxzZTsKKwkJCQl9CisJCQkJLy8gcmV0dXJucyB0byB0aGUgaW5kZW50YXRpb24gbGV2ZWwgY3JlYXRlZCBieSB0aGUgU1dJVENIIGtleXdvcmQKKwkJCQkvLyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIENBU0Ugb3IgYSBERUZBVUxUCisJCQkJaWYgKHRva2VuID09IFRva2VuTmFtZWNhc2UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lZGVmYXVsdCkgeworCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHBvcChUb2tlbk5hbWVjYXNlKTsKKwkJCQl9CisJCQkJaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1ldGhyb3dzKSB7CisJCQkJCWluVGhyb3dzQ2xhdXNlID0gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKCh0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZWNsYXNzIHx8IHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1laW50ZXJmYWNlKSAmJiBwcmV2aW91c1Rva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lRE9UKSB7CisJCQkJCWluQ2xhc3NPckludGVyZmFjZUhlYWRlciA9IHRydWU7CisJCQkJfQorCisJCQkJLyogIyMgQVBQRU5EIG5ld2xpbmVzIGFuZCBpbmRlbnRhdGlvbnMgdG8gdGhlIG91dHB1dCBzdHJpbmcKKwkJCQkqLworCQkJCS8vIERvIG5vdCBhZGQgYSBuZXcgbGluZSBiZXR3ZWVuIEVMU0UgYW5kIElGLCBpZiB0aGUgb3B0aW9uIGVsc2VJZk9uU2FtZUxpbmUgaXMgdHJ1ZS4KKwkJCQkvLyBGaXggZm9yIDFFVExXUFo6IElWSkNPTTpBTEwgLSBpbmNvcnJlY3QgImVsc2UgaWYiIGZvcm1hdHRpbmcKKwkJCQlpZiAocGVuZGluZ05ld2xpbmVBZnRlclBhcmVuCisJCQkJCSYmIHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZWVsc2UKKwkJCQkJJiYgdG9rZW4gPT0gVG9rZW5OYW1laWYKKwkJCQkJJiYgb3B0aW9ucy5jb21wYWN0RWxzZUlmTW9kZSkgeworCQkJCQlwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSBmYWxzZTsKKwkJCQkJcGVuZGluZ05ld0xpbmVzID0gMDsKKwkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3AoVG9rZW5OYW1lZWxzZSk7CisJCQkJCS8vIGJlY2F1c2UgZWxzZSBpZiBpcyBub3cgb25lIHNpbmdsZSBzdGF0ZW1lbnQsCisJCQkJCS8vIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBhZnRlciBpdCBpcyBpbmNyZWFzZWQgYnkgb25lIGFuZCBub3QgYnkgMgorCQkJCQkvLyAoZWxzZSA9IDEgaW5kZW50LCBpZiA9IDEgaW5kZW50LCBidXQgZWxzZSBpZiA9IDEgaW5kZW50LCBub3QgMikuCisJCQkJfQorCQkJCS8vIEFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgdG8gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugc3RyaW5nIGlmCisJCQkJLy8gYSBmb3IvaWYtZWxzZS93aGlsZSBzdGF0ZW1lbnQgd2FzIHNjYW5uZWQgYW5kIHRoZXJlIGlzIG5vIGJsb2NrCisJCQkJLy8gZm9sbG93aW5nIGl0LgorCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9CisJCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbgorCQkJCQkJfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTiAmJiB0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpOworCQkJCWlmIChwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gJiYgdG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7CisJCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IGZhbHNlOworCisJCQkJCS8vIERvIHRvIGFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgc2VxdWVuY2UgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYW4KKwkJCQkJLy8gb3BlbiBicmFjZSBvciBhIHBlcmlvZCBvciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHNlbWktY29sb24gYW5kIHRoZQorCQkJCQkvLyBwcmV2aW91cyB0b2tlbiBpcyBhIGNsb3NlIHBhcmVuLgorCQkJCQkvLyBhZGQgYSBuZXcgbGluZSBpZiBhIHBhcmVudGhlc2lzIGJlbG9uZ2luZyB0byBhIGZvcigpIHN0YXRlbWVudAorCQkJCQkvLyBoYXMgYmVlbiBjbG9zZWQgYW5kIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCBhbiBvcGVuaW5nIGJyYWNlCisJCQkJCWlmICh0b2tlbiAhPSBUb2tlbk5hbWVMQlJBQ0UKKwkJCQkJCSYmICFpc0NvbW1lbnQodG9rZW4pIC8vIHRvIGF2b2lkIGFkZGluZyBuZXcgbGluZSBiZXR3ZWVuIGVsc2UgYW5kIGEgY29tbWVudAorCQkJCQkJJiYgdG9rZW4gIT0gVG9rZW5OYW1lRE9UCisJCQkJCQkmJiAhKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTiAmJiB0b2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pKSB7CisJCQkJCQluZXdMaW5lKDEpOworCQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDA7CisJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgb3B0aW9ucy5uZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZSkgeworCQkJCQkJCW5ld0xpbmUoMSk7CisJCQkJCQkJaWYgKGNvbnN0cnVjdGlvbnNDb3VudCA+IDAKKwkJCQkJCQkJJiYgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSAhPSBCTE9DSworCQkJCQkJCQkmJiBjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdICE9IE5PTklOREVOVF9CTE9DSykgeworCQkJCQkJCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsIC0gMTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsOworCQkJCQkJCX0KKwkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAwOworCQkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UKKwkJCQkJJiYgb3B0aW9ucy5uZXdMaW5lQmVmb3JlT3BlbmluZ0JyYWNlTW9kZQorCQkJCQkmJiBjb25zdHJ1Y3Rpb25zQ291bnQgPiAwCisJCQkJCSYmIGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gVG9rZW5OYW1lZG8pIHsKKwkJCQkJbmV3TGluZSgxKTsKKwkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCAtIDE7CisJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDA7CisJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCX0KKwkJCQkvLyBzZWUgUFIgMUc1RzhFQworCQkJCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgaW5UaHJvd3NDbGF1c2UpIHsKKwkJCQkJaW5UaHJvd3NDbGF1c2UgPSBmYWxzZTsKKwkJCQkJaWYgKG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUpIHsKKwkJCQkJCW5ld0xpbmUoMSk7CisJCQkJCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsOworCQkJCQkJcGVuZGluZ05ld0xpbmVzID0gMDsKKwkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJCS8vIHNlZSBQUiAxRzVHODJHCisJCQkJaWYgKHRva2VuID09IFRva2VuTmFtZUxCUkFDRSAmJiBpbkNsYXNzT3JJbnRlcmZhY2VIZWFkZXIpIHsKKwkJCQkJaW5DbGFzc09ySW50ZXJmYWNlSGVhZGVyID0gZmFsc2U7CisJCQkJCWlmIChvcHRpb25zLm5ld0xpbmVCZWZvcmVPcGVuaW5nQnJhY2VNb2RlKSB7CisJCQkJCQluZXdMaW5lKDEpOworCQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbDsKKwkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDA7CisJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBBZGQgcGVuZGluZyBuZXcgbGluZXMgdG8gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugc3RyaW5nLgorCQkJCS8vIE5vdGU6IHBlbmRpbmcgbmV3IGxpbmVzIGFyZSBub3QgYWRkZWQgaWYgdGhlIGN1cnJlbnQgdG9rZW4KKwkJCQkvLyBpcyBhIHNpbmdsZSBsaW5lIGNvbW1lbnQgb3Igd2hpdGVzcGFjZS4KKwkJCQkvLyBpZiB0aGUgY29tbWVudCBpcyBiZXR3ZWVuIHBhcmVudGhlc2lzLCB0aGVyZSBpcyBubyBibGFuayBsaW5lIHByZXNlcnZhdGlvbgorCQkJCS8vIChpZiBpdCdzIGEgb25lLWxpbmUgY29tbWVudCwgYSBibGFuayBsaW5lIGlzIGFkZGVkIGFmdGVyIGl0KS4KKwkJCQlpZiAoKChwZW5kaW5nTmV3TGluZXMgPiAwICYmICghaXNDb21tZW50KHRva2VuKSkpCisJCQkJCXx8IChuZXdMaW5lc0luV2hpdGVzcGFjZSA+IDAgJiYgKG9wZW5QYXJlbnRoZXNpc0NvdW50IDw9IDEgJiYgaXNDb21tZW50KHRva2VuKSkpCisJCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkKKwkJCQkJJiYgdG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7CisKKwkJCQkJLy8gRG8gbm90IGFkZCBuZXdsaW5lICYgaW5kZW50IGJldHdlZW4gYW4gYWRqb2luaW5nIGNsb3NlIGJyYWNlIGFuZAorCQkJCQkvLyBjbG9zZSBwYXJlbi4gIEFub255bW91cyBpbm5lciBjbGFzc2VzIG1heSB1c2UgdGhpcyBmb3JtLgorCQkJCQlib29sZWFuIGNsb3NlQnJhY2VBbmRDbG9zZVBhcmVuID0KKwkJCQkJCXByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZVJQQVJFTjsKKworCQkJCQkvLyBPUFRJT04gKE5ld0xpbmVJbkNvbXBvdW5kU3RhdGVtZW50KTogZG8gbm90IGFkZCBuZXdsaW5lICYgaW5kZW50CisJCQkJCS8vIGJldHdlZW4gY2xvc2UgYnJhY2UgYW5kIGVsc2UsIChkbykgd2hpbGUsIGNhdGNoLCBhbmQgZmluYWxseSBpZgorCQkJCQkvLyBuZXdsaW5lSW5Db21wb3VuZFN0YXRlbWVudCBpcyB0cnVlLgorCQkJCQlib29sZWFuIG5saWNzT3B0aW9uID0KKwkJCQkJCXByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFCisJCQkJCQkJJiYgIW9wdGlvbnMubmV3bGluZUluQ29udHJvbFN0YXRlbWVudE1vZGUKKwkJCQkJCQkmJiAodG9rZW4gPT0gVG9rZW5OYW1lZWxzZQorCQkJCQkJCQl8fCAodG9rZW4gPT0gVG9rZW5OYW1ld2hpbGUgJiYgbmxpY3NUb2tlbiA9PSBUb2tlbk5hbWVkbykKKwkJCQkJCQkJfHwgdG9rZW4gPT0gVG9rZW5OYW1lY2F0Y2gKKwkJCQkJCQkJfHwgdG9rZW4gPT0gVG9rZW5OYW1lZmluYWxseSk7CisKKwkJCQkJLy8gRG8gbm90IGFkZCBhIG5ld2xpbmUgJiBpbmRlbnQgYmV0d2VlbiBhIGNsb3NlIGJyYWNlIGFuZCBzZW1pLWNvbG9uLgorCQkJCQlib29sZWFuIHNlbWlDb2xvbkFuZENsb3NlQnJhY2UgPQorCQkJCQkJcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OOworCisJCQkJCS8vIERvIG5vdCBhZGQgYSBuZXcgbGluZSAmIGluZGVudCBiZXR3ZWVuIGEgbXVsdGlsaW5lIGNvbW1lbnQgYW5kIGEgb3BlbmluZyBicmFjZQorCQkJCQlib29sZWFuIGNvbW1lbnRBbmRPcGVuQnJhY2UgPQorCQkJCQkJcHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgJiYgdG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFOworCisJCQkJCS8vIERvIG5vdCBhZGQgYSBuZXdsaW5lICYgaW5kZW50IGJldHdlZW4gYSBjbG9zZSBicmFjZSBhbmQgYSBjb2xvbiAoaW4gYXJyYXkgYXNzaWdubWVudHMsIGZvciBleGFtcGxlKS4KKwkJCQkJYm9vbGVhbiBjb21tYUFuZENsb3NlQnJhY2UgPQorCQkJCQkJcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0UgJiYgdG9rZW4gPT0gVG9rZW5OYW1lQ09NTUE7CisKKwkJCQkJLy8gQWRkIGEgbmV3bGluZSBhbmQgaW5kZW50LCBpZiBhcHByb3ByaWF0ZS4KKwkJCQkJaWYgKHNwZWNpYWxFbHNlCisJCQkJCQl8fCAoIWNvbW1lbnRBbmRPcGVuQnJhY2UKKwkJCQkJCQkmJiAhY2xvc2VCcmFjZUFuZENsb3NlUGFyZW4KKwkJCQkJCQkmJiAhbmxpY3NPcHRpb24KKwkJCQkJCQkmJiAhc2VtaUNvbG9uQW5kQ2xvc2VCcmFjZQorCQkJCQkJCSYmICFjb21tYUFuZENsb3NlQnJhY2UpKSB7CisKKwkJCQkJCS8vIGlmIGNsZWFyQWxsQmxhbmtMaW5lc01vZGU9ZmFsc2UsIGxlYXZlcyB0aGUgYmxhbmsgbGluZXMKKwkJCQkJCS8vIGluc2VydGVkIGJ5IHRoZSB1c2VyCisJCQkJCQkvLyBpZiBjbGVhckFsbEJsYW5rTGluZXNNb2RlPXRydWUsIHJlbW92ZXMgYWxsIG9mIHRoZW4KKwkJCQkJCS8vIGFuZCBpbnNlcnQgb25seSBibGFuayBsaW5lcyByZXF1aXJlZCBieSB0aGUgZm9ybWF0dGluZy4KKwkJCQkJCWlmICghb3B0aW9ucy5jbGVhckFsbEJsYW5rTGluZXNNb2RlKSB7CisJCQkJCQkJLy8gIChpc0NvbW1lbnQodG9rZW4pKQorCQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9CisJCQkJCQkJCShwZW5kaW5nTmV3TGluZXMgPCBuZXdMaW5lc0luV2hpdGVzcGFjZSkKKwkJCQkJCQkJCT8gbmV3TGluZXNJbldoaXRlc3BhY2UKKwkJCQkJCQkJCTogcGVuZGluZ05ld0xpbmVzOworCQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IChwZW5kaW5nTmV3TGluZXMgPiAyKSA/IDIgOiBwZW5kaW5nTmV3TGluZXM7CisJCQkJCQl9CisJCQkJCQlpZiAocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNFICYmIHRva2VuID09IFRva2VuTmFtZVJCUkFDRSkgeworCQkJCQkJCWNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzID0gdHJ1ZTsKKwkJCQkJCQlpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzID0gY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsOworCQkJCQkJCWlmIChpc0NvbW1lbnQocHJldmlvdXNUb2tlbikpIHsKKwkJCQkJCQkJbmV3TGluZShwZW5kaW5nTmV3TGluZXMpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8qICBpZiAoIShjb25zdHJ1Y3Rpb25zQ291bnQgPiAxCisJCQkJCQkJCSAgICAgICAgJiYgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMV0gPT0gTk9OSU5ERU5UX0JMT0NLCisJCQkJCQkJCSAgICAgICAgJiYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50LTJdID09IFRva2VuTmFtZWZvciAKKwkJCQkJCQkJICAgICAgICAgfHwgY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQtMl0gPT0gVG9rZW5OYW1ld2hpbGUpKSkgeyovCisJCQkJCQkJCWlmIChvcHRpb25zLm5ld0xpbmVJbkVtcHR5QmxvY2tNb2RlKSB7CisJCQkJCQkJCQlpZiAoaW5BcnJheUFzc2lnbm1lbnQpIHsKKwkJCQkJCQkJCQluZXdMaW5lKDEpOyAvLyBhcnJheSBhc3NpZ21lbnQgd2l0aCBhbiBlbXB0eSBibG9jaworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQluZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gfQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gc2VlIFBSIDFGS0tDM1U6IExGQ09NOldJTk5UIC0gRm9ybWF0IHByb2JsZW0gd2l0aCBhIGNvbW1lbnQgYmVmb3JlIHRoZSAnOycKKwkJCQkJCQlpZiAoISgocHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sKKwkJCQkJCQkJfHwgcHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQykKKwkJCQkJCQkJJiYgdG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKSkgeworCQkJCQkJCQluZXdMaW5lKHBlbmRpbmdOZXdMaW5lcyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKCgocHJldmlvdXNDb21waWxhYmxlVG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKQorCQkJCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UpCisJCQkJCQkJfHwgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJCUkFDRSkKKwkJCQkJCQl8fCAoaXNDb21tZW50KHByZXZpb3VzVG9rZW4pKSkKKwkJCQkJCQkmJiAodG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkgeworCQkJCQkJCWluZGVudGF0aW9uT2Zmc2V0ID0gLTE7CisJCQkJCQkJaW5kZW50YXRpb25MZXZlbCArPSBwb3BFeGNsdXNpdmVVbnRpbEJsb2NrKCk7CisJCQkJCQl9CisJCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSAmJiBpbkFzc2lnbm1lbnQpIHsKKwkJCQkJCQkvLyBQUiAxRkk1SVBPCisJCQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgKyBpbmRlbnRhdGlvbk9mZnNldDsKKwkJCQkJCX0KKwkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJaW5kZW50YXRpb25PZmZzZXQgPSAwOworCQkJCQl9CisJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDA7CisJCQkJCW5ld0xpbmVzSW5XaGl0ZXNwYWNlID0gMDsKKwkJCQkJc3BlY2lhbEVsc2UgPSBmYWxzZTsKKworCQkJCQlpZiAobmxpY3NUb2tlbiA9PSBUb2tlbk5hbWVkbyAmJiB0b2tlbiA9PSBUb2tlbk5hbWV3aGlsZSkgeworCQkJCQkJbmxpY3NUb2tlbiA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQljYXNlIFRva2VuTmFtZWVsc2UgOgorCQkJCQljYXNlIFRva2VuTmFtZWZpbmFsbHkgOgorCQkJCQkJZXhwZWN0aW5nT3BlbkJyYWNlID0gdHJ1ZTsKKwkJCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHRydWU7CisJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHRva2VuKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZWNhc2UgOgorCQkJCQljYXNlIFRva2VuTmFtZWRlZmF1bHQgOgorCQkJCQkJaWYgKHRva2VuQmVmb3JlQ29sb25Db3VudCA9PSB0b2tlbkJlZm9yZUNvbG9uLmxlbmd0aCkgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJCXRva2VuQmVmb3JlQ29sb24sCisJCQkJCQkJCTAsCisJCQkJCQkJCSh0b2tlbkJlZm9yZUNvbG9uID0gbmV3IGludFt0b2tlbkJlZm9yZUNvbG9uQ291bnQgKiAyXSksCisJCQkJCQkJCTAsCisJCQkJCQkJCXRva2VuQmVmb3JlQ29sb25Db3VudCk7CisJCQkJCQl9CisJCQkJCQl0b2tlbkJlZm9yZUNvbG9uW3Rva2VuQmVmb3JlQ29sb25Db3VudCsrXSA9IFRva2VuTmFtZWNhc2U7CisJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KFRva2VuTmFtZWNhc2UpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOgorCQkJCQkJaWYgKHRva2VuQmVmb3JlQ29sb25Db3VudCA9PSB0b2tlbkJlZm9yZUNvbG9uLmxlbmd0aCkgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJCXRva2VuQmVmb3JlQ29sb24sCisJCQkJCQkJCTAsCisJCQkJCQkJCSh0b2tlbkJlZm9yZUNvbG9uID0gbmV3IGludFt0b2tlbkJlZm9yZUNvbG9uQ291bnQgKiAyXSksCisJCQkJCQkJCTAsCisJCQkJCQkJCXRva2VuQmVmb3JlQ29sb25Db3VudCk7CisJCQkJCQl9CisJCQkJCQl0b2tlbkJlZm9yZUNvbG9uW3Rva2VuQmVmb3JlQ29sb25Db3VudCsrXSA9IHRva2VuOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lc3dpdGNoIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVmb3IgOgorCQkJCQljYXNlIFRva2VuTmFtZWlmIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWV3aGlsZSA6CisJCQkJCQlpZiAob3BlblBhcmVudGhlc2lzQ291bnQgPT0gb3BlblBhcmVudGhlc2lzLmxlbmd0aCkgeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJCW9wZW5QYXJlbnRoZXNpcywKKwkJCQkJCQkJMCwKKwkJCQkJCQkJKG9wZW5QYXJlbnRoZXNpcyA9IG5ldyBpbnRbb3BlblBhcmVudGhlc2lzQ291bnQgKiAyXSksCisJCQkJCQkJCTAsCisJCQkJCQkJCW9wZW5QYXJlbnRoZXNpc0NvdW50KTsKKwkJCQkJCX0KKwkJCQkJCW9wZW5QYXJlbnRoZXNpc1tvcGVuUGFyZW50aGVzaXNDb3VudCsrXSA9IDA7CisJCQkJCQlleHBlY3RpbmdPcGVuQnJhY2UgPSB0cnVlOworCisJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHRva2VuKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZXRyeSA6CisJCQkJCQlwZW5kaW5nTmV3bGluZUFmdGVyUGFyZW4gPSB0cnVlOworCQkJCQljYXNlIFRva2VuTmFtZWNhdGNoIDoKKwkJCQkJCS8vIHNldmVyYWwgQ0FUQ0ggc3RhdGVtZW50cyBjYW4gYmUgY29udGlndW91cy4KKwkJCQkJCS8vIGEgQ0FUQ0ggaXMgZW5jb3VudGVyZWQgcG9wIHVudGlsIGZpcnN0IENBVENIIChpZiBhIENBVENIIGZvbGxvd3MgYSBUUlkgaXQgd29ya3MgdGhlIHNhbWUgd2F5LAorCQkJCQkJLy8gYXMgQ0FUQ0ggYW5kIFRSWSBhcmUgdGhlIHNhbWUgdG9rZW4gaW4gdGhlIHN0YWNrKS4KKwkJCQkJCWV4cGVjdGluZ09wZW5CcmFjZSA9IHRydWU7CisJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KFRva2VuTmFtZWNhdGNoKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgVG9rZW5OYW1lZG8gOgorCQkJCQkJZXhwZWN0aW5nT3BlbkJyYWNlID0gdHJ1ZTsKKwkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaENvbnRyb2xTdGF0ZW1lbnQodG9rZW4pOworCQkJCQkJbmxpY3NUb2tlbiA9IHRva2VuOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lbmV3IDoKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZUxQQVJFTiA6CisJCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVzeW5jaHJvbml6ZWQpIHsKKwkJCQkJCQlpbmRlbnRhdGlvbkxldmVsICs9IHB1c2hDb250cm9sU3RhdGVtZW50KHByZXZpb3VzVG9rZW4pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBQdXQgYSBzcGFjZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCB0b2tlbiBpZiB0aGUKKwkJCQkJCQkvLyBwcmV2aW91cyB0b2tlbiB3YXMgbm90IGEga2V5d29yZCwgb3BlbiBwYXJlbiwgbG9naWNhbAorCQkJCQkJCS8vIGNvbXBsaW1lbnQgKGVnOiAhKSwgc2VtaS1jb2xvbiwgb3BlbiBicmFjZSwgY2xvc2UgYnJhY2UsCisJCQkJCQkJLy8gc3VwZXIsIG9yIHRoaXMuCisJCQkJCQkJaWYgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuICE9IFRva2VuTmFtZUxCUkFDS0VUCisJCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lSWRlbnRpZmllcgorCQkJCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IDAKKwkJCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVOT1QKKwkJCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVMUEFSRU4KKwkJCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWVUV0lERExFCisJCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lU0VNSUNPTE9OCisJCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lTEJSQUNFCisJCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lUkJSQUNFCisJCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lc3VwZXIKKwkJCQkJCQkJJiYgcHJldmlvdXNUb2tlbiAhPSBUb2tlbk5hbWV0aGlzKSB7CisJCQkJCQkJCXNwYWNlKCk7CisJCQkJCQkJfQorCQkJCQkJCS8vIElmIGluIGEgZm9yL2lmL3doaWxlIHN0YXRlbWVudCwgaW5jcmVhc2UgdGhlIHBhcmVudGhlc2lzIGNvdW50CisJCQkJCQkJLy8gZm9yIHRoZSBjdXJyZW50IG9wZW5QYXJlbnRoZXNpc0NvdW50CisJCQkJCQkJLy8gZWxzZSBpbmNyZWFzZSB0aGUgY291bnQgZm9yIHN0YW5kIGFsb25lIHBhcmVudGhlc2lzLgorCQkJCQkJCWlmIChvcGVuUGFyZW50aGVzaXNDb3VudCA+IDApCisJCQkJCQkJCW9wZW5QYXJlbnRoZXNpc1tvcGVuUGFyZW50aGVzaXNDb3VudCAtIDFdKys7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNbMF0rKzsKKwkKKwkJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZVJQQVJFTiA6CisKKwkJCQkJCS8vIERlY3JlYXNlIHRoZSBwYXJlbnRoZXNpcyBjb3VudAorCQkJCQkJLy8gaWYgdGhlcmUgaXMgbm8gbW9yZSB1bmNsb3NlZCBwYXJlbnRoZXNpcywKKwkJCQkJCS8vIGEgbmV3IGxpbmUgYW5kIGluZGVudCBtYXkgYmUgYXBwZW5kIChkZXBlbmRpbmcgb24gdGhlIG5leHQgdG9rZW4pLgorCQkJCQkJaWYgKChvcGVuUGFyZW50aGVzaXNDb3VudCA+IDEpCisJCQkJCQkJJiYgKG9wZW5QYXJlbnRoZXNpc1tvcGVuUGFyZW50aGVzaXNDb3VudCAtIDFdID4gMCkpIHsKKwkJCQkJCQlvcGVuUGFyZW50aGVzaXNbb3BlblBhcmVudGhlc2lzQ291bnQgLSAxXS0tOworCQkJCQkJCWlmIChvcGVuUGFyZW50aGVzaXNbb3BlblBhcmVudGhlc2lzQ291bnQgLSAxXSA8PSAwKSB7CisJCQkJCQkJCXBlbmRpbmdOZXdsaW5lQWZ0ZXJQYXJlbiA9IHRydWU7CisJCQkJCQkJCWluQXNzaWdubWVudCA9IGZhbHNlOworCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNDb3VudC0tOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJb3BlblBhcmVudGhlc2lzWzBdLS07CisJCQkJCQl9CisJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6CisJCQkJCQlpZiAoKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJCUkFDS0VUKQorCQkJCQkJCXx8IChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVFUVVBTCkpIHsKKwkJCQkJCQkvLyAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgeworCQkJCQkJCWluQXJyYXlBc3NpZ25tZW50ID0gdHJ1ZTsKKwkJCQkJCQlpbkFzc2lnbm1lbnQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChpbkFycmF5QXNzaWdubWVudCkgeworCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaEJsb2NrKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIEFkZCBuZXcgbGluZSBhbmQgaW5jcmVhc2UgaW5kZW50YXRpb24gbGV2ZWwgYWZ0ZXIgb3BlbiBicmFjZS4KKwkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOworCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcHVzaEJsb2NrKCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0UgOgorCQkJCQkJaWYgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTikgeworCQkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJaWYgKGluQXJyYXlBc3NpZ25tZW50KSB7CisJCQkJCQkJaW5BcnJheUFzc2lnbm1lbnQgPSBmYWxzZTsKKwkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOworCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWxCbG9jaygpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOworCQkJCQkJCWluZGVudGF0aW9uTGV2ZWwgKz0gcG9wSW5jbHVzaXZlVW50aWxCbG9jaygpOworCisJCQkJCQkJaWYgKHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZVJQQVJFTikgeworCQkJCQkJCQkvLyBmaXggZm9yIDFGR0REVjY6IExGQ09NOldJTjk4IC0gV2VpcmQgc3BsaXR0aW5nIG9uIG1lc3NhZ2UgZXhwcmVzc2lvbgorCQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJCQkJCQlpbmNyZWFzZUxpbmVEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoY29uc3RydWN0aW9uc0NvdW50ID4gMCkgeworCQkJCQkJCQlzd2l0Y2ggKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0pIHsKKwkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lZm9yIDoKKwkJCQkJCQkJCQkvL2luZGVudGF0aW9uTGV2ZWwgKz0gcG9wRXhjbHVzaXZlVW50aWxCbG9jaygpOworCQkJCQkJCQkJCS8vYnJlYWs7CisJCQkJCQkJCQljYXNlIFRva2VuTmFtZXN3aXRjaCA6CisJCQkJCQkJCQljYXNlIFRva2VuTmFtZWlmIDoKKwkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lZWxzZSA6CisJCQkJCQkJCQljYXNlIFRva2VuTmFtZXRyeSA6CisJCQkJCQkJCQljYXNlIFRva2VuTmFtZWNhdGNoIDoKKwkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lZmluYWxseSA6CisJCQkJCQkJCQljYXNlIFRva2VuTmFtZXdoaWxlIDoKKwkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lZG8gOgorCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVzeW5jaHJvbml6ZWQgOgorCQkJCQkJCQkJCWNsZWFyTm9uQmxvY2tJbmRlbnRzID0gdHJ1ZTsKKwkJCQkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJCQkJb3BlbkJyYWNrZXRDb3VudCsrOworCQkJCQkJcGVuZGluZ1NwYWNlID0gZmFsc2U7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0tFVCA6CisJCQkJCQlvcGVuQnJhY2tldENvdW50IC09IChvcGVuQnJhY2tldENvdW50ID4gMCkgPyAxIDogMDsKKwkJCQkJCS8vIGlmIHRoZXJlIGlzIG5vIGxlZnQgYnJhY2tldCB0byBjbG9zZSwgdGhlIHJpZ2h0IGJyYWNrZXQgaXMgaWdub3JlZC4KKwkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lQ09NTUEgOgorCQkJCQljYXNlIFRva2VuTmFtZURPVCA6CisJCQkJCQlwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6CisKKwkJCQkJCS8vIERvIG5vdCBnZW5lcmF0ZSBsaW5lIHRlcm1pbmF0b3JzIGluIHRoZSBkZWZpbml0aW9uIG9mCisJCQkJCQkvLyB0aGUgZm9yIHN0YXRlbWVudC4KKwkJCQkJCS8vIGlmIG5vdCBpbiB0aGlzIGNhc2UsIGp1bXAgYSBsaW5lIGFuZCByZWR1Y2UgaW5kZW50YXRpb24gYWZ0ZXIgdGhlIGJyYWNlCisJCQkJCQkvLyBpZiB0aGUgYmxvY2sgaXQgY2xvc2VzIGJlbG9uZ3MgdG8gYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgKGlmLCB3aGlsZSwgZG8uLi4pLgorCQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc0NvdW50IDw9IDEpIHsKKwkJCQkJCQlwZW5kaW5nTmV3TGluZXMgPSAxOworCQkJCQkJCWlmIChleHBlY3RpbmdPcGVuQnJhY2UpIHsKKwkJCQkJCQkJY2xlYXJOb25CbG9ja0luZGVudHMgPSB0cnVlOworCQkJCQkJCQlleHBlY3RpbmdPcGVuQnJhY2UgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpbkFzc2lnbm1lbnQgPSBmYWxzZTsKKwkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lUExVU19QTFVTIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVNSU5VU19NSU5VUyA6CisKKwkJCQkJCS8vIERvIG5vdCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgcG9zdC1pbmNyZW1lbnQvZGVjcmVtZW50CisJCQkJCQkvLyBhbmQgdGhlIGlkZW50aWZpZXIgYmVpbmcgbW9kaWZpZWQuCisJCQkJCQlpZiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCisJCQkJCQkJfHwgcHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0tFVCkgeworCQkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lUExVUyA6IC8vIHByZXZpb3VzbHkgQURESVRJT04KKwkJCQkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6CisKKwkJCQkJCS8vIEhhbmRsZSB0aGUgdW5hcnkgb3BlcmF0b3JzIHBsdXMgYW5kIG1pbnVzIHZpYSBhIGZsYWcKKwkJCQkJCWlmICghaXNMaXRlcmFsVG9rZW4ocHJldmlvdXNUb2tlbikKKwkJCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZUlkZW50aWZpZXIKKwkJCQkJCQkmJiBwcmV2aW91c1Rva2VuICE9IFRva2VuTmFtZVJQQVJFTgorCQkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gVG9rZW5OYW1lUkJSQUNLRVQpIHsKKwkJCQkJCQl1bmFyeVNpZ25Nb2RpZmllciA9IDE7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVDT0xPTiA6CisJCQkJCQkvLyBJbiBhIHN3aXRjaC9jYXNlIHN0YXRlbWVudCwgYWRkIGEgbmV3bGluZSAmIGluZGVudAorCQkJCQkJLy8gd2hlbiBhIGNvbG9uIGlzIGVuY291bnRlcmVkLgorCQkJCQkJaWYgKHRva2VuQmVmb3JlQ29sb25Db3VudCA+IDApIHsKKwkJCQkJCQlpZiAodG9rZW5CZWZvcmVDb2xvblt0b2tlbkJlZm9yZUNvbG9uQ291bnQgLSAxXSA9PSBUb2tlbk5hbWVjYXNlKSB7CisJCQkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7CisJCQkJCQkJfQorCQkJCQkJCXRva2VuQmVmb3JlQ29sb25Db3VudC0tOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lRVFVQUwgOgorCQkJCQkJaW5Bc3NpZ25tZW50ID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FIDoKKwkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7CisJCQkJCQlpZiAoaW5Bc3NpZ25tZW50KSB7CisJCQkJCQkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsgLy8gYSBsaW5lIGlzIGFsd2F5cyBpbnNlcnRlZCBhZnRlciBhIG9uZS1saW5lIGNvbW1lbnQKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQyA6CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0JMT0NLIDoKKwkJCQkJCWN1cnJlbnRDb21tZW50T2Zmc2V0ID0gZ2V0Q3VycmVudENvbW1lbnRPZmZzZXQoKTsKKwkJCQkJCXBlbmRpbmdOZXdMaW5lcyA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UgOgorCisJCQkJCQkvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmUgdGVybWluYXRvcnMgaW4gdGhlIHdoaXRlc3BhY2Ugc28KKwkJCQkJCS8vIGxpbmUgc3BhY2luZyBjYW4gYmUgcHJlc2VydmVkIG5lYXIgY29tbWVudHMuCisJCQkJCQljaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7CisJCQkJCQluZXdMaW5lc0luV2hpdGVzcGFjZSA9IDA7CisJCQkJCQlmb3IgKGludCBpID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBtYXggPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQlpIDwgbWF4OworCQkJCQkJCWkrKykgeworCQkJCQkJCWlmIChzb3VyY2VbaV0gPT0gJ1xyJykgeworCQkJCQkJCQlpZiAoaSA8IG1heCAtIDEpIHsKKwkJCQkJCQkJCWlmIChzb3VyY2VbKytpXSA9PSAnXG4nKSB7CisJCQkJCQkJCQkJbmV3TGluZXNJbldoaXRlc3BhY2UrKzsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJbmV3TGluZXNJbldoaXRlc3BhY2UrKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCW5ld0xpbmVzSW5XaGl0ZXNwYWNlKys7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKHNvdXJjZVtpXSA9PSAnXG4nKSB7CisJCQkJCQkJCQluZXdMaW5lc0luV2hpdGVzcGFjZSsrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWluY3JlYXNlTGluZURlbHRhKHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmICgodG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcikKKwkJCQkJCQl8fCBpc0xpdGVyYWxUb2tlbih0b2tlbikKKwkJCQkJCQl8fCB0b2tlbiA9PSBUb2tlbk5hbWVzdXBlcgorCQkJCQkJCXx8IHRva2VuID09IFRva2VuTmFtZXRoaXMpIHsKKworCQkJCQkJCS8vIERvIG5vdCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgdW5hcnkgb3BlcmF0b3IKKwkJCQkJCQkvLyAoZWc6ICsrLCAtLSwgKywgLSkgYW5kIHRoZSBpZGVudGlmaWVyIGJlaW5nIG1vZGlmaWVkLgorCQkJCQkJCWlmIChwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZVBMVVNfUExVUworCQkJCQkJCQl8fCBwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZU1JTlVTX01JTlVTCisJCQkJCQkJCXx8IChwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZVBMVVMgJiYgdW5hcnlTaWduTW9kaWZpZXIgPiAwKQorCQkJCQkJCQl8fCAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVNSU5VUyAmJiB1bmFyeVNpZ25Nb2RpZmllciA+IDApKSB7CisJCQkJCQkJCXBlbmRpbmdTcGFjZSA9IGZhbHNlOworCQkJCQkJCX0KKwkJCQkJCQl1bmFyeVNpZ25Nb2RpZmllciA9IDA7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gRG8gbm90IG91dHB1dCB3aGl0ZXNwYWNlIHRva2Vucy4KKwkJCQlpZiAodG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFKSB7CisKKwkJCQkJLyogQWRkIHBlbmRpbmcgc3BhY2UgdG8gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugc3RyaW5nLgorCQkJCQlEbyBub3Qgb3V0cHV0IGEgc3BhY2UgdW5kZXIgdGhlIGZvbGxvd2luZyBjaXJjdW1zdGFuY2VzOgorCQkJCQkxKSB0aGlzIGlzIHRoZSBmaXJzdCBwYXNzCisJCQkJCTIpIHByZXZpb3VzIHRva2VuIGlzIGFuIG9wZW4gcGFyZW4KKwkJCQkJMykgcHJldmlvdXMgdG9rZW4gaXMgYSBwZXJpb2QKKwkJCQkJNCkgcHJldmlvdXMgdG9rZW4gaXMgdGhlIGxvZ2ljYWwgY29tcGxpbWVudCAoZWc6ICEpCisJCQkJCTUpIHByZXZpb3VzIHRva2VuIGlzIHRoZSBiaXR3aXNlIGNvbXBsaW1lbnQgKGVnOiB+KQorCQkJCQk2KSBwcmV2aW91cyB0b2tlbiBpcyB0aGUgb3BlbiBicmFja2V0IChlZzogWykKKwkJCQkJNykgaW4gYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQsIGlmIHRoZSBwcmV2aW91cyB0b2tlbiBpcyBhbiAKKwkJCQkJb3BlbiBicmFjZSBvciB0aGUgY3VycmVudCB0b2tlbiBpcyBhIGNsb3NlIGJyYWNlCisJCQkJCTgpIHByZXZpb3VzIHRva2VuIGlzIGEgc2luZ2xlIGxpbmUgY29tbWVudAorCQkJCQkqLworCQkJCQlib29sZWFuIG9wZW5BbmRDbG9zZUJyYWNlID0KKwkJCQkJCXByZXZpb3VzQ29tcGlsYWJsZVRva2VuID09IFRva2VuTmFtZUxCUkFDRSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVSQlJBQ0U7CisKKwkJCQkJaWYgKHBlbmRpbmdTcGFjZQorCQkJCQkJJiYgaW5zZXJ0U3BhY2VBZnRlcihwcmV2aW91c1Rva2VuKQorCQkJCQkJJiYgIShpbkFzc2lnbm1lbnQKKwkJCQkJCQkmJiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkKKwkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUpIHsKKwkJCQkJCWlmICgoIShvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVFUVVBTCkpCisJCQkJCQkJJiYgIW9wZW5BbmRDbG9zZUJyYWNlKQorCQkJCQkJCXNwYWNlKCk7CisJCQkJCX0KKwkJCQkJLy8gQWRkIHRoZSBuZXh0IHRva2VuIHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZy4KKwkJCQkJb3V0cHV0Q3VycmVudFRva2VuKHRva2VuKTsKKwkJCQkJaWYgKHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FICYmIG9wZW5QYXJlbnRoZXNpc0NvdW50ID4gMSkgeworCQkJCQkJcGVuZGluZ05ld0xpbmVzID0gMDsKKwkJCQkJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7CisJCQkJCQlpbmNyZWFzZUxpbmVEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOworCQkJCQl9CisJCQkJCXBlbmRpbmdTcGFjZSA9IHRydWU7CisJCQkJfQorCQkJCS8vIFdoaXRlc3BhY2UgdG9rZW5zIGRvIG5vdCBuZWVkIHRvIGJlIHJlbWVtYmVyZWQuCisJCQkJaWYgKHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSkgeworCQkJCQlwcmV2aW91c1Rva2VuID0gdG9rZW47CisJCQkJCWlmICh0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sKKwkJCQkJCSYmIHRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9MSU5FCisJCQkJCQkmJiB0b2tlbiAhPSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQykgeworCQkJCQkJcHJldmlvdXNDb21waWxhYmxlVG9rZW4gPSB0b2tlbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCW91dHB1dChjb3B5UmVtYWluaW5nU291cmNlKCkpOworCQkJZmx1c2hCdWZmZXIoKTsgLy8gZHVtcCB0aGUgbGFzdCB0b2tlbiBvZiB0aGUgc291cmNlIGluIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgorCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJb3V0cHV0KGNvcHlSZW1haW5pbmdTb3VyY2UoKSk7CisJCQlmbHVzaEJ1ZmZlcigpOyAvLyBkdW1wIHRoZSBsYXN0IHRva2VuIG9mIHRoZSBzb3VyY2UgaW4gdGhlIGZvcm1hdHRlZCBvdXRwdXQuCisJCX0KKwl9CisKKwkvKiogCisJICogRm9ybWF0cyB0aGUgY2hhciBhcnJheSA8Y29kZT5zb3VyY2VTdHJpbmc8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB2ZXJzaW9uLgorCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBvdXB1dC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGZvcm1hdFNvdXJjZVN0cmluZyhTdHJpbmcgc291cmNlU3RyaW5nKSB7CisJCWNoYXJbXSBzb3VyY2VDaGFycyA9IHNvdXJjZVN0cmluZy50b0NoYXJBcnJheSgpOworCQlmb3JtYXR0ZWRTb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZUNoYXJzLmxlbmd0aCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZUNoYXJzKTsKKwkJZm9ybWF0KCk7CisJCXJldHVybiBmb3JtYXR0ZWRTb3VyY2UudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogCisJICogRm9ybWF0cyB0aGUgY2hhciBhcnJheSA8Y29kZT5zb3VyY2VTdHJpbmc8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB2ZXJzaW9uLgorCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBmb3JtYXQKKwkgKiBAcGFyYW0gaW5kZW50YXRpb25MZXZlbCB0aGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbAorCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBvdXB1dC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZW50YXRpb25MZXZlbCkgeworCQlyZXR1cm4gZm9ybWF0KHN0cmluZywgaW5kZW50YXRpb25MZXZlbCwgKGludFtdKW51bGwpOworCX0JCisJCisJLyoqIAorCSAqIEZvcm1hdHMgdGhlIGNoYXIgYXJyYXkgPGNvZGU+c291cmNlU3RyaW5nPC9jb2RlPiwKKwkgKiBhbmQgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmb3JtYXR0ZWQgdmVyc2lvbi4KKwkgKiBUaGUgcG9zaXRpb25zIGFycmF5IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG1hcHBlZCBwb3NpdGlvbnMuCisJICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIGZvcm1hdAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbml0aWFsIGluZGVudGF0aW9uIGxldmVsCisJICogQHBhcmFtIHBvc2l0aW9ucyB0aGUgYXJyYXkgb2YgcG9zaXRpb25zIHRvIG1hcAorCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBvdXB1dC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZW50YXRpb25MZXZlbCwgaW50W10gcG9zaXRpb25zKSB7CisJCXJldHVybiB0aGlzLmZvcm1hdChzdHJpbmcsIGluZGVudGF0aW9uTGV2ZWwsIHBvc2l0aW9ucywgbnVsbCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBzdHJpbmcsIGludCBpbmRlbnRhdGlvbkxldmVsLCBpbnRbXSBwb3NpdGlvbnMsIFN0cmluZyBsaW5lU2VwYXJhdG9yKSB7CisJCWlmIChsaW5lU2VwYXJhdG9yICE9IG51bGwpeworCQkJdGhpcy5vcHRpb25zLnNldExpbmVTZXBhcmF0b3IobGluZVNlcGFyYXRvcik7CisJCX0KKwkJaWYgKHBvc2l0aW9ucyAhPSBudWxsKSB7CisJCQl0aGlzLnNldFBvc2l0aW9uc1RvTWFwKHBvc2l0aW9ucyk7CisJCQl0aGlzLnNldEluaXRpYWxJbmRlbnRhdGlvbkxldmVsKGluZGVudGF0aW9uTGV2ZWwpOworCQkJU3RyaW5nIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMuZm9ybWF0U291cmNlU3RyaW5nKHN0cmluZyk7CisJCQlpbnRbXSBtYXBwZWRQb3NpdGlvbnMgPSB0aGlzLmdldE1hcHBlZFBvc2l0aW9ucygpOworCQkJU3lzdGVtLmFycmF5Y29weShtYXBwZWRQb3NpdGlvbnMsIDAsIHBvc2l0aW9ucywgMCwgcG9zaXRpb25zLmxlbmd0aCk7CisJCQlyZXR1cm4gZm9ybWF0dGVkU3RyaW5nOworCQl9IGVsc2UgeworCQkJdGhpcy5zZXRJbml0aWFsSW5kZW50YXRpb25MZXZlbChpbmRlbnRhdGlvbkxldmVsKTsKKwkJCXJldHVybiB0aGlzLmZvcm1hdFNvdXJjZVN0cmluZyhzdHJpbmcpOworCQl9CisJfQkKKwkvKiogCisJICogRm9ybWF0cyB0aGUgY2hhciBhcnJheSA8Y29kZT5zb3VyY2VTdHJpbmc8L2NvZGU+LAorCSAqIGFuZCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCB2ZXJzaW9uLiBUaGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbCBpcyAwLgorCSAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBmb3JtYXQKKwkgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgb3VwdXQuCisJICovCisJcHVibGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHN0cmluZykgeworCQlyZXR1cm4gdGhpcy5mb3JtYXQoc3RyaW5nLCAwLCAoaW50W10pbnVsbCk7CisJfQorCQorCS8qKiAKKwkgKiBGb3JtYXRzIGEgZ2l2ZW4gc291cmNlIHN0cmluZywgc3RhcnRpbmcgaW5kZW50aW5nIGl0IGF0IGEgcGFydGljdWxhciAKKwkgKiBkZXB0aCBhbmQgdXNpbmcgdGhlIGdpdmVuIG9wdGlvbnMKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgaW5pdGlhbEluZGVudGF0aW9uTGV2ZWwsIENvbmZpZ3VyYWJsZU9wdGlvbltdIG9wdGlvbnMpIHsKKwkJQ29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQ29kZUZvcm1hdHRlcihvcHRpb25zKTsKKwkJZm9ybWF0dGVyLnNldEluaXRpYWxJbmRlbnRhdGlvbkxldmVsKGluaXRpYWxJbmRlbnRhdGlvbkxldmVsKTsKKwkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRTb3VyY2VTdHJpbmcoc291cmNlU3RyaW5nKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYW5kIHRhYiBjaGFyIGJldHdlZW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQorCSAqIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21tZW50LgorCSAqLworCXByaXZhdGUgaW50IGdldEN1cnJlbnRDb21tZW50T2Zmc2V0KCkgeworCQlpbnQgbGluZVB0ciA9IHNjYW5uZXIubGluZVB0cjsKKwkJLy8gaWYgdGhlcmUgaXMgbm8gYmVnaW5uaW5nIG9mIGxpbmUsIHJldHVybiAwLgorCQlpZiAobGluZVB0ciA8IDApCisJCQlyZXR1cm4gMDsKKwkJaW50IG9mZnNldCA9IDA7CisJCWludCBiZWdpbm5pbmdPZkxpbmUgPSBzY2FubmVyLmxpbmVFbmRzW2xpbmVQdHJdOworCQlpbnQgY3VycmVudFN0YXJ0UG9zaXRpb24gPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCWNoYXJbXSBzb3VyY2UgPSBzY2FubmVyLnNvdXJjZTsKKworCQkvLyBmaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKKwkJd2hpbGUgKGJlZ2lubmluZ09mTGluZSA+IGN1cnJlbnRTdGFydFBvc2l0aW9uKSB7CisJCQlpZiAobGluZVB0ciA+IDApIHsKKwkJCQliZWdpbm5pbmdPZkxpbmUgPSBzY2FubmVyLmxpbmVFbmRzWy0tbGluZVB0cl07CisJCQl9IGVsc2UgeworCQkJCWJlZ2lubmluZ09mTGluZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IGN1cnJlbnRTdGFydFBvc2l0aW9uIC0gMTsgaSA+PSBiZWdpbm5pbmdPZkxpbmUgOyBpLS0pIHsKKwkJCWNoYXIgY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtpXTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXJhY3RlcikgeworCQkJCWNhc2UgJ1x0JyA6CisJCQkJCW9mZnNldCArPSBvcHRpb25zLnRhYlNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyAnIDoKKwkJCQkJb2Zmc2V0Kys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xyJyA6CisJCQkJY2FzZSAnXG4nIDoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIG9mZnNldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gb2Zmc2V0OworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCSAqIFRoZSBkZXNjcmlwdGlvbnMgbWF5IGJlIGNoYW5nZWQgYW5kIHBhc3NlZCBiYWNrIHRvIGEgZGlmZmVyZW50CisJICogY29tcGlsZXIuCisJICogCisJICogQGRlcHJlY2F0ZWQgYmFja3BvcnQgMS4wIGludGVybmFsIGZ1bmN0aW9uYWxpdHkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldERlZmF1bHRPcHRpb25zKExvY2FsZSBsb2NhbGUpIHsKKwkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBDb2RlRm9ybWF0dGVyLmNsYXNzLmdldE5hbWUoKTsKKwkJRm9ybWF0dGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IEZvcm1hdHRlck9wdGlvbnMoKTsKKwkJcmV0dXJuIG5ldyBDb25maWd1cmFibGVPcHRpb25bXSB7CisJCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJuZXdsaW5lLm9wZW5pbmdCcmFjZSIsICBsb2NhbGUsIG9wdGlvbnMubmV3TGluZUJlZm9yZU9wZW5pbmdCcmFjZU1vZGUgPyAwIDogMSksIC8vJE5PTi1OTFMtMSQKKwkJCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgIm5ld2xpbmUuY29udHJvbFN0YXRlbWVudCIsICBsb2NhbGUsIG9wdGlvbnMubmV3bGluZUluQ29udHJvbFN0YXRlbWVudE1vZGUgPyAwIDogMSksIC8vJE5PTi1OTFMtMSQKKwkJCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgIm5ld2xpbmUuY2xlYXJBbGwiLCAgbG9jYWxlLCBvcHRpb25zLmNsZWFyQWxsQmxhbmtMaW5lc01vZGUgPyAwIDogMSksIC8vJE5PTi1OTFMtMSQKKwkJCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgIm5ld2xpbmUuZWxzZUlmIiwgIGxvY2FsZSwgb3B0aW9ucy5jb21wYWN0RWxzZUlmTW9kZSA/IDAgOiAxKSwgLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAibmV3bGluZS5lbXB0eUJsb2NrIiwgIGxvY2FsZSwgb3B0aW9ucy5uZXdMaW5lSW5FbXB0eUJsb2NrTW9kZSA/IDAgOiAxKSwgLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAibGluZS5zcGxpdCIsICBsb2NhbGUsIG9wdGlvbnMubWF4TGluZUxlbmd0aCksLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAic3R5bGUuY29tcGFjdEFzc2lnbm1lbnQiLCAgbG9jYWxlLCBvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSA/IDAgOiAxKSwgLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAidGFidWxhdGlvbi5jaGFyIiwgIGxvY2FsZSwgb3B0aW9ucy5pbmRlbnRXaXRoVGFiID8gMCA6IDEpLCAvLyROT04tTkxTLTEkCisJCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJ0YWJ1bGF0aW9uLnNpemUiLCAgbG9jYWxlLCBvcHRpb25zLnRhYlNpemUpCS8vJE5PTi1OTFMtMSQKKwkJfTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBtYXBwZWQgcG9zaXRpb25zLgorCSAqIFJldHVybnMgbnVsbCBpcyBubyBwb3NpdGlvbnMgaGF2ZSBiZWVuIHNldC4KKwkgKiBAcmV0dXJuIGludFtdCisJICogQGRlcHJlY2F0ZWQgVGhlcmUgaXMgbm8gbmVlZCB0byByZXRyaWV2ZSB0aGUgbWFwcGVkIHBvc2l0aW9ucyBhbnltb3JlLgorCSAqLworCXB1YmxpYyBpbnRbXSBnZXRNYXBwZWRQb3NpdGlvbnMoKSB7CisJCXJldHVybiBtYXBwZWRQb3NpdGlvbnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRva2VuIGdpdmVuIGFzIGFyZ3VtZW50PGJyPgorCSAqIFRoZSBtb3N0IHByaW9yaXRhcnkgdGhlIHRva2VuIGlzLCB0aGUgc21hbGxlc3QgdGhlIHJldHVybiB2YWx1ZSBpcy4KKwkgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiA8Y29kZT50b2tlbjwvY29kZT4KKwkgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIG9mIHdoaWNoIHRoZSBwcmlvcml0eSBpcyByZXF1ZXN0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VG9rZW5Qcmlvcml0eShpbnQgdG9rZW4pIHsKKwkJc3dpdGNoICh0b2tlbikgeworCQkJY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoKKwkJCWNhc2UgVG9rZW5OYW1laW1wbGVtZW50cyA6CisJCQljYXNlIFRva2VuTmFtZXRocm93cyA6CisJCQkJcmV0dXJuIDEwOworCQkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOiAvLyA7CisJCQkJcmV0dXJuIDIwOworCQkJY2FzZSBUb2tlbk5hbWVDT01NQSA6IC8vICwKKwkJCQlyZXR1cm4gMjU7CisJCQljYXNlIFRva2VuTmFtZUVRVUFMIDogLy8gPQorCQkJCXJldHVybiAzMDsKKwkJCWNhc2UgVG9rZW5OYW1lQU5EX0FORCA6IC8vICYmIAorCQkJY2FzZSBUb2tlbk5hbWVPUl9PUiA6IC8vIHx8IAorCQkJCXJldHVybiA0MDsKKwkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOiAvLyA/IAorCQkJY2FzZSBUb2tlbk5hbWVDT0xPTiA6IC8vIDoKKwkJCQlyZXR1cm4gNTA7IC8vIGl0J3MgYmV0dGVyIGN1dHRpbmcgb24gPzogdGhhbiBvbiA7CisJCQljYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMIDogLy8gPT0gCisJCQljYXNlIFRva2VuTmFtZU5PVF9FUVVBTCA6IC8vICE9IAorCQkJCXJldHVybiA2MDsKKwkJCWNhc2UgVG9rZW5OYW1lTEVTUyA6IC8vIDwgCisJCQljYXNlIFRva2VuTmFtZUxFU1NfRVFVQUwgOiAvLyA8PSAKKwkJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6IC8vID4gCisJCQljYXNlIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgOiAvLyA+PSAKKwkJCWNhc2UgVG9rZW5OYW1laW5zdGFuY2VvZiA6IC8vIGluc3RhbmNlb2YKKwkJCQlyZXR1cm4gNzA7CisJCQljYXNlIFRva2VuTmFtZVBMVVMgOiAvLyArIAorCQkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6IC8vIC0gCisJCQkJcmV0dXJuIDgwOworCQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWSA6IC8vICogCisJCQljYXNlIFRva2VuTmFtZURJVklERSA6IC8vIC8gCisJCQljYXNlIFRva2VuTmFtZVJFTUFJTkRFUiA6IC8vICUgCisJCQkJcmV0dXJuIDkwOworCQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDogLy8gPDwgCisJCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUIDogLy8gPj4gCisJCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDogLy8gPj4+IAorCQkJCXJldHVybiAxMDA7CisJCQljYXNlIFRva2VuTmFtZUFORCA6IC8vICYKKwkJCWNhc2UgVG9rZW5OYW1lT1IgOiAvLyB8IAorCQkJY2FzZSBUb2tlbk5hbWVYT1IgOiAvLyBeIAorCQkJCXJldHVybiAxMTA7CisJCQljYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDogLy8gKj0gCisJCQljYXNlIFRva2VuTmFtZURJVklERV9FUVVBTCA6IC8vIC89IAorCQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgOiAvLyAlPSAKKwkJCWNhc2UgVG9rZW5OYW1lUExVU19FUVVBTCA6IC8vICs9IAorCQkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6IC8vIC09IAorCQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMIDogLy8gPDw9IAorCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+PSAKKwkJCWNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwgOiAvLyA+Pj49CisJCQljYXNlIFRva2VuTmFtZUFORF9FUVVBTCA6IC8vICY9IAorCQkJY2FzZSBUb2tlbk5hbWVYT1JfRVFVQUwgOiAvLyBePSAKKwkJCWNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOiAvLyB8PSAKKwkJCQlyZXR1cm4gMTIwOworCQkJY2FzZSBUb2tlbk5hbWVET1QgOiAvLyAuCisJCQkJcmV0dXJuIDEzMDsKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZXMgdGhlIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBpbnZhbGlkIHRva2VuIGlzIGVuY291bnRlcmVkLgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhcyBiZWVuIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFuZGxlSW52YWxpZFRva2VuKEV4Y2VwdGlvbiBlKSB7CisJCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCkKKwkJCXx8IGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhTY2FubmVyLklOVkFMSURfQ0hBUl9JTl9TVFJJTkcpCisJCQl8fCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoU2Nhbm5lci5JTlZBTElEX0VTQ0FQRSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGZpbmFsIHZvaWQgaW5jcmVhc2VHbG9iYWxEZWx0YShpbnQgb2Zmc2V0KSB7CisJCWdsb2JhbERlbHRhICs9IG9mZnNldDsKKwl9CisKKwlwcml2YXRlIGZpbmFsIHZvaWQgaW5jcmVhc2VMaW5lRGVsdGEoaW50IG9mZnNldCkgeworCQlsaW5lRGVsdGEgKz0gb2Zmc2V0OworCX0KKworCXByaXZhdGUgZmluYWwgdm9pZCBpbmNyZWFzZVNwbGl0RGVsdGEoaW50IG9mZnNldCkgeworCQlzcGxpdERlbHRhICs9IG9mZnNldDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgYSBzcGFjZSBoYXMgdG8gYmUgaW5zZXJ0ZWQgYWZ0ZXIgPGNvZGU+b3BlcmF0b3I8L2NvZGU+CisJICogZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpbnNlcnRTcGFjZUFmdGVyKGludCB0b2tlbikgeworCQlzd2l0Y2ggKHRva2VuKSB7CisJCQljYXNlIFRva2VuTmFtZUxQQVJFTiA6CisJCQljYXNlIFRva2VuTmFtZU5PVCA6CisJCQljYXNlIFRva2VuTmFtZVRXSURETEUgOgorCQkJY2FzZSBUb2tlbk5hbWVET1QgOgorCQkJY2FzZSAwIDogLy8gbm8gdG9rZW4KKwkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSA6CisJCQkJcmV0dXJuIGZhbHNlOworCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgYSBzcGFjZSBoYXMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIDxjb2RlPm9wZXJhdG9yPC9jb2RlPgorCSAqIGZhbHNlIG90aGVyd2lzZS48YnI+CisJICogQ2Fubm90IGJlIHN0YXRpYyBhcyBpdCB1c2VzIHRoZSBjb2RlIGZvcm1hdHRlciBvcHRpb25zCisJICogKHRvIGtub3cgaWYgdGhlIGNvbXBhY3QgYXNzaWdubWVudCBtb2RlIGlzIG9uKS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaW5zZXJ0U3BhY2VCZWZvcmUoaW50IHRva2VuKSB7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgVG9rZW5OYW1lRVFVQUwgOgorCQkJCXJldHVybiAoIW9wdGlvbnMuY29tcGFjdEFzc2lnbm1lbnRNb2RlKTsKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KGludCB0b2tlbikgeworCQlib29sZWFuIHJlc3VsdCA9CisJCQl0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sKKwkJCQl8fCB0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORQorCQkJCXx8IHRva2VuID09IFNjYW5uZXIuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaXRlcmFsVG9rZW4oaW50IHRva2VuKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0KKwkJCXRva2VuID09IFRva2VuTmFtZUludGVnZXJMaXRlcmFsCisJCQkJfHwgdG9rZW4gPT0gVG9rZW5OYW1lTG9uZ0xpdGVyYWwKKwkJCQl8fCB0b2tlbiA9PSBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbAorCQkJCXx8IHRva2VuID09IFRva2VuTmFtZURvdWJsZUxpdGVyYWwKKwkJCQl8fCB0b2tlbiA9PSBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsCisJCQkJfHwgdG9rZW4gPT0gVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIDxjb2RlPm9uZUxpbmVCdWZmZXI8L2NvZGU+IGV4Y2VlZHMgPGNvZGU+bWF4TGluZUxlbmd0aDwvY29kZT4sCisJICogaXQgaXMgc3BsaXQgYW5kIHRoZSByZXN1bHQgaXMgZHVtcGVkIGluIDxjb2RlPmZvcm1hdHRlZFNvdXJjZTwvY29kZT4KKwkgKiBAcGFyYW0gbmV3TGluZUNvdW50IHRoZSBudW1iZXIgb2YgbmV3IGxpbmVzIHRvIGFwcGVuZAorCSAqLworCXByaXZhdGUgdm9pZCBuZXdMaW5lKGludCBuZXdMaW5lQ291bnQpIHsKKworCQkvLyBmb3JtYXQgY3VycmVudCBsaW5lCisJCXNwbGl0RGVsdGEgPSAwOworCQliZWdpbm5pbmdPZkxpbmVJbmRleCA9IGZvcm1hdHRlZFNvdXJjZS5sZW5ndGgoKTsKKwkJU3RyaW5nIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmVCdWZmZXIudG9TdHJpbmcoKTsKKwkJaWYgKGNvbnRhaW5zT3BlbkNsb3NlQnJhY2VzKSB7CisJCQljb250YWluc09wZW5DbG9zZUJyYWNlcyA9IGZhbHNlOworCQkJb3V0cHV0TGluZSgKKwkJCQljdXJyZW50TGluZSwKKwkJCQlmYWxzZSwKKwkJCQlpbmRlbnRhdGlvbkxldmVsRm9yT3BlbkNsb3NlQnJhY2VzLAorCQkJCTAsCisJCQkJLTEsCisJCQkJbnVsbCwKKwkJCQkwKTsKKwkJCWluZGVudGF0aW9uTGV2ZWxGb3JPcGVuQ2xvc2VCcmFjZXMgPSBjdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWw7CisJCX0gZWxzZSB7CisJCQlvdXRwdXRMaW5lKGN1cnJlbnRMaW5lLCBmYWxzZSwgY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsLCAwLCAtMSwgbnVsbCwgMCk7CisJCX0KKwkJLy8gZHVtcCBsaW5lIGJyZWFrKHMpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3TGluZUNvdW50OyBpKyspIHsKKwkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJaW5jcmVhc2VTcGxpdERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCk7CisJCX0KKwkJLy8gcmVzZXQgZm9ybWF0dGVyIGZvciBuZXh0IGxpbmUKKwkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TGluZS5sZW5ndGgoKTsKKwkJY3VycmVudExpbmVCdWZmZXIgPQorCQkJbmV3IFN0cmluZ0J1ZmZlcigKKwkJCQljdXJyZW50TGVuZ3RoID4gbWF4TGluZVNpemUgPyBtYXhMaW5lU2l6ZSA9IGN1cnJlbnRMZW5ndGggOiBtYXhMaW5lU2l6ZSk7CisKKwkJaW5jcmVhc2VHbG9iYWxEZWx0YShzcGxpdERlbHRhKTsKKwkJaW5jcmVhc2VHbG9iYWxEZWx0YShsaW5lRGVsdGEpOworCQlsaW5lRGVsdGEgPSAwOworCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbml0aWFsSW5kZW50YXRpb25MZXZlbDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBvcGVyYXRvclN0cmluZyhpbnQgb3BlcmF0b3IpIHsKKwkJc3dpdGNoIChvcGVyYXRvcikgeworCQkJY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoKKwkJCQlyZXR1cm4gImV4dGVuZHMiOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1laW1wbGVtZW50cyA6CisJCQkJcmV0dXJuICJpbXBsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZXRocm93cyA6CisJCQkJcmV0dXJuICJ0aHJvd3MiOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDogLy8gOworCQkJCXJldHVybiAiOyI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVDT01NQSA6IC8vICwKKwkJCQlyZXR1cm4gIiwiOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lRVFVQUwgOiAvLyA9CisJCQkJcmV0dXJuICI9IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZUFORF9BTkQgOiAvLyAmJiAoMTUuMjIpCisJCQkJcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVPUl9PUiA6IC8vIHx8ICgxNS4yMykKKwkJCQlyZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZVFVRVNUSU9OIDogLy8gPyAoMTUuMjQpCisJCQkJcmV0dXJuICI/IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZUNPTE9OIDogLy8gOiAoMTUuMjQpCisJCQkJcmV0dXJuICI6IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZUVRVUFMX0VRVUFMIDogLy8gPT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQorCQkJCXJldHVybiAiPT0iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQorCQkJCXJldHVybiAiIT0iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lTEVTUyA6IC8vIDwgKDE1LjE5LjEpCisJCQkJcmV0dXJuICI8IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZUxFU1NfRVFVQUwgOiAvLyA8PSAoMTUuMTkuMSkKKwkJCQlyZXR1cm4gIjw9IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZUdSRUFURVIgOiAvLyA+ICgxNS4xOS4xKQorCQkJCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMIDogLy8gPj0gKDE1LjE5LjEpCisJCQkJcmV0dXJuICI+PSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVpbnN0YW5jZW9mIDogLy8gaW5zdGFuY2VvZgorCQkJCXJldHVybiAiaW5zdGFuY2VvZiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVQTFVTIDogLy8gKyAoMTUuMTcsIDE1LjE3LjIpCisJCQkJcmV0dXJuICIrIjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZU1JTlVTIDogLy8gLSAoMTUuMTcuMikKKwkJCQlyZXR1cm4gIi0iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOiAvLyAqICgxNS4xNi4xKQorCQkJCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVESVZJREUgOiAvLyAvICgxNS4xNi4yKQorCQkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOiAvLyAlICgxNS4xNi4zKQorCQkJCXJldHVybiAiJSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDogLy8gPDwgKDE1LjE4KQorCQkJCXJldHVybiAiPDwiOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOiAvLyA+PiAoMTUuMTgpCisJCQkJcmV0dXJuICI+PiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA6IC8vID4+PiAoMTUuMTgpCisJCQkJcmV0dXJuICI+Pj4iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lQU5EIDogLy8gJiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpCisJCQkJcmV0dXJuICImIjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZU9SIDogLy8gfCAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpCisJCQkJcmV0dXJuICJ8IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZVhPUiA6IC8vIF4gKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQorCQkJCXJldHVybiAiXiI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA6IC8vICo9ICgxNS4yNS4yKQorCQkJCXJldHVybiAiKj0iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDogLy8gLz0gKDE1LjI1LjIpCisJCQkJcmV0dXJuICIvPSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgOiAvLyAlPSAoMTUuMjUuMikKKwkJCQlyZXR1cm4gIiU9IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOiAvLyArPSAoMTUuMjUuMikKKwkJCQlyZXR1cm4gIis9IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZU1JTlVTX0VRVUFMIDogLy8gLT0gKDE1LjI1LjIpCisJCQkJcmV0dXJuICItPSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMIDogLy8gPDw9ICgxNS4yNS4yKQorCQkJCXJldHVybiAiPDw9IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMIDogLy8gPj49ICgxNS4yNS4yKQorCQkJCXJldHVybiAiPj49IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDogLy8gPj4+PSAoMTUuMjUuMikKKwkJCQlyZXR1cm4gIj4+Pj0iOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDogLy8gJj0gKDE1LjI1LjIpCisJCQkJcmV0dXJuICImPSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVYT1JfRVFVQUwgOiAvLyBePSAoMTUuMjUuMikKKwkJCQlyZXR1cm4gIl49IjsgLy8kTk9OLU5MUy0xJAorCisJCQljYXNlIFRva2VuTmFtZU9SX0VRVUFMIDogLy8gfD0gKDE1LjI1LjIpCisJCQkJcmV0dXJuICJ8PSI7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBUb2tlbk5hbWVET1QgOiAvLyAuCisJCQkJcmV0dXJuICIuIjsgLy8kTk9OLU5MUy0xJAorCisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKiAKKwkgKiBBcHBlbmRzIDxjb2RlPnN0cmluZ1RvT3V0cHV0PC9jb2RlPiB0byB0aGUgZm9ybWF0dGVkIG91dHB1dC48YnI+CisJICogSWYgaXQgY29udGFpbnMgXG4sIGFwcGVuZCBhIExJTkVfU0VQQVJBVE9SIGFuZCBpbmRlbnQgYWZ0ZXIgaXQuCisJICovCisJcHJpdmF0ZSB2b2lkIG91dHB1dChTdHJpbmcgc3RyaW5nVG9PdXRwdXQpIHsKKwkJY2hhciBjdXJyZW50Q2hhcmFjdGVyOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RyaW5nVG9PdXRwdXQubGVuZ3RoKCk7IGkgPCBtYXg7IGkrKykgeworCQkJY3VycmVudENoYXJhY3RlciA9IHN0cmluZ1RvT3V0cHV0LmNoYXJBdChpKTsKKwkJCWlmIChjdXJyZW50Q2hhcmFjdGVyICE9ICdcdCcpIHsKKwkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7CisJCQl9CisJCX0KKwl9CisKKwkvKiogCisJICogQXBwZW5kcyA8Y29kZT50b2tlbjwvY29kZT4gdG8gdGhlIGZvcm1hdHRlZCBvdXRwdXQuPGJyPgorCSAqIElmIGl0IGNvbnRhaW5zIDxjb2RlPlxuPC9jb2RlPiwgYXBwZW5kIGEgTElORV9TRVBBUkFUT1IgYW5kIGluZGVudCBhZnRlciBpdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgb3V0cHV0Q3VycmVudFRva2VuKGludCB0b2tlbikgeworCQljaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7CisJCWludCBzdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOgorCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgorCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfTElORSA6CisJCQkJYm9vbGVhbiBlbmRPZkxpbmUgPSBmYWxzZTsKKwkJCQlpbnQgY3VycmVudENvbW1lbnRPZmZzZXQgPSBnZXRDdXJyZW50Q29tbWVudE9mZnNldCgpOworCQkJCWludCBiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOworCQkJCWVuZE9mTGluZSA9IGZhbHNlOworCQkJCWN1cnJlbnRDb21tZW50T2Zmc2V0ID0gZ2V0Q3VycmVudENvbW1lbnRPZmZzZXQoKTsKKwkJCQliZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOworCQkJCWJvb2xlYW4gcGVuZGluZ0NhcnJpYWdlUmV0dXJuID0gZmFsc2U7CisJCQkJZm9yIChpbnQgaSA9IHN0YXJ0UG9zaXRpb24sIG1heCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJY2hhciBjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2ldOworCQkJCQl1cGRhdGVNYXBwZWRQb3NpdGlvbnMoaSk7CisJCQkJCXN3aXRjaCAoY3VycmVudENoYXJhY3RlcikgeworCQkJCQkJY2FzZSAnXHInIDoKKwkJCQkJCQlwZW5kaW5nQ2FycmlhZ2VSZXR1cm4gPSB0cnVlOworCQkJCQkJCWVuZE9mTGluZSA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdcbicgOgorCQkJCQkJCWlmIChwZW5kaW5nQ2FycmlhZ2VSZXR1cm4pIHsKKwkJCQkJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGggLSAyKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpbmNyZWFzZUdsb2JhbERlbHRhKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlLmxlbmd0aCAtIDEpOworCQkJCQkJCX0KKwkJCQkJCQlwZW5kaW5nQ2FycmlhZ2VSZXR1cm4gPSBmYWxzZTsKKwkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJCQkJCWJlZ2lubmluZ09mTGluZVNwYWNlcyA9IDA7CisJCQkJCQkJZW5kT2ZMaW5lID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ1x0JyA6CisJCQkJCQkJaWYgKHBlbmRpbmdDYXJyaWFnZVJldHVybikgeworCQkJCQkJCQlwZW5kaW5nQ2FycmlhZ2VSZXR1cm4gPSBmYWxzZTsKKwkJCQkJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGggLSAxKTsKKwkJCQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsKKwkJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID0gMDsKKwkJCQkJCQkJZW5kT2ZMaW5lID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGVuZE9mTGluZSkgeworCQkJCQkJCQkvLyB3ZSByZW1vdmUgYSBtYXhpbXVtIG9mIGN1cnJlbnRDb21tZW50T2Zmc2V0IGNoYXJhY3RlcnMgKHRhYnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZSBudW1iZXJzKS4KKwkJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzICs9IG9wdGlvbnMudGFiU2l6ZTsKKwkJCQkJCQkJaWYgKGJlZ2lubmluZ09mTGluZVNwYWNlcyA+IGN1cnJlbnRDb21tZW50T2Zmc2V0KSB7CisJCQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpbmNyZWFzZUdsb2JhbERlbHRhKC0xKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZChjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICcgJyA6CisJCQkJCQkJaWYgKHBlbmRpbmdDYXJyaWFnZVJldHVybikgeworCQkJCQkJCQlwZW5kaW5nQ2FycmlhZ2VSZXR1cm4gPSBmYWxzZTsKKwkJCQkJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGggLSAxKTsKKwkJCQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsKKwkJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID0gMDsKKwkJCQkJCQkJZW5kT2ZMaW5lID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGVuZE9mTGluZSkgeworCQkJCQkJCQkvLyB3ZSByZW1vdmUgYSBtYXhpbXVtIG9mIGN1cnJlbnRDb21tZW50T2Zmc2V0IGNoYXJhY3RlcnMgKHRhYnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZSBudW1iZXJzKS4KKwkJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzKys7CisJCQkJCQkJCWlmIChiZWdpbm5pbmdPZkxpbmVTcGFjZXMgPiBjdXJyZW50Q29tbWVudE9mZnNldCkgeworCQkJCQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YSgtMSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJaWYgKHBlbmRpbmdDYXJyaWFnZVJldHVybikgeworCQkJCQkJCQlwZW5kaW5nQ2FycmlhZ2VSZXR1cm4gPSBmYWxzZTsKKwkJCQkJCQkJaW5jcmVhc2VHbG9iYWxEZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGggLSAxKTsKKwkJCQkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsKKwkJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lU3BhY2VzID0gMDsKKwkJCQkJCQkJZW5kT2ZMaW5lID0gdHJ1ZTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQliZWdpbm5pbmdPZkxpbmVTcGFjZXMgPSAwOworCQkJCQkJCQljdXJyZW50TGluZUJ1ZmZlci5hcHBlbmQoY3VycmVudENoYXJhY3Rlcik7CisJCQkJCQkJCWVuZE9mTGluZSA9IGZhbHNlOwkJCQkJCQkJCisJCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXVwZGF0ZU1hcHBlZFBvc2l0aW9ucyhzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEpOworCQkJCW11bHRpcGxlTGluZUNvbW1lbnRDb3VudGVyKys7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlmb3IgKGludCBpID0gc3RhcnRQb3NpdGlvbiwgbWF4ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247IGkgPCBtYXg7IGkrKykgeworCQkJCQljaGFyIGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbaV07CisJCQkJCXVwZGF0ZU1hcHBlZFBvc2l0aW9ucyhpKTsKKwkJCQkJY3VycmVudExpbmVCdWZmZXIuYXBwZW5kKGN1cnJlbnRDaGFyYWN0ZXIpOworCQkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBPdXRwdXRzIDxjb2RlPmN1cnJlbnRTdHJpbmc8L2NvZGU+Ojxicj4KKwkgKiA8dWw+PGxpPklmIGl0cyBsZW5ndGggaXMgPCBtYXhMaW5lTGVuZ3RoLCBvdXRwdXQKKwkgKiA8bGk+T3RoZXJ3aXNlIGl0IGlzIHNwbGl0LjwvdWw+CisJICogQHBhcmFtIGN1cnJlbnRTdHJpbmcgc3RyaW5nIHRvIG91dHB1dAorCSAqIEBwYXJhbSBwcmVJbmRlbnRlZCB3aGV0aGVyIHRoZSBzdHJpbmcgdG8gb3V0cHV0IHdhcyBwcmUtaW5kZW50ZWQKKwkgKiBAcGFyYW0gZGVwdGggbnVtYmVyIG9mIGluZGVudGF0aW9uIHRvIHB1dCBpbiBmcm9udCBvZiA8Y29kZT5jdXJyZW50U3RyaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBvcGVyYXRvciB2YWx1ZSBvZiB0aGUgb3BlcmF0b3IgYmVsb25naW5nIHRvIDxjb2RlPmN1cnJlbnRTdHJpbmc8L2NvZGU+LgorCSAqLworCXByaXZhdGUgdm9pZCBvdXRwdXRMaW5lKAorCQlTdHJpbmcgY3VycmVudFN0cmluZywKKwkJYm9vbGVhbiBwcmVJbmRlbnRlZCwKKwkJaW50IGRlcHRoLAorCQlpbnQgb3BlcmF0b3IsCisJCWludCBzdWJzdHJpbmdJbmRleCwKKwkJaW50W10gc3RhcnRTdWJzdHJpbmdJbmRleGVzLAorCQlpbnQgb2Zmc2V0SW5HbG9iYWxMaW5lKSB7CisKKwkJYm9vbGVhbiBlbXB0eUZpcnN0U3ViU3RyaW5nID0gZmFsc2U7CisJCVN0cmluZyBvcGVyYXRvclN0cmluZyA9IG9wZXJhdG9yU3RyaW5nKG9wZXJhdG9yKTsKKwkJYm9vbGVhbiBwbGFjZU9wZXJhdG9yQmVoaW5kID0gIWJyZWFrTGluZUJlZm9yZU9wZXJhdG9yKG9wZXJhdG9yKTsKKwkJYm9vbGVhbiBwbGFjZU9wZXJhdG9yQWhlYWQgPSAhcGxhY2VPcGVyYXRvckJlaGluZDsKKworCQkvLyBkdW1wIHByZWZpeCBvcGVyYXRvcj8KKwkJaWYgKHBsYWNlT3BlcmF0b3JBaGVhZCkgeworCQkJaWYgKCFwcmVJbmRlbnRlZCkgeworCQkJCWR1bXBUYWIoZGVwdGgpOworCQkJCXByZUluZGVudGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWlmIChvcGVyYXRvciAhPSAwKSB7CisJCQkJaWYgKGluc2VydFNwYWNlQmVmb3JlKG9wZXJhdG9yKSkgeworCQkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKCcgJyk7CisJCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsKKwkJCQl9CisJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcGVyYXRvclN0cmluZyk7CisJCQkJaW5jcmVhc2VTcGxpdERlbHRhKG9wZXJhdG9yU3RyaW5nLmxlbmd0aCgpKTsKKworCQkJCWlmIChpbnNlcnRTcGFjZUFmdGVyKG9wZXJhdG9yKQorCQkJCQkmJiBvcGVyYXRvciAhPSBUb2tlbk5hbWVpbXBsZW1lbnRzCisJCQkJCSYmIG9wZXJhdG9yICE9IFRva2VuTmFtZWV4dGVuZHMKKwkJCQkJJiYgb3BlcmF0b3IgIT0gVG9rZW5OYW1ldGhyb3dzKSB7CisJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQkJaW5jcmVhc2VTcGxpdERlbHRhKDEpOworCQkJCX0KKwkJCX0KKwkJfQorCQlTcGxpdExpbmUgc3BsaXRMaW5lID0gbnVsbDsKKwkJaWYgKG9wdGlvbnMubWF4TGluZUxlbmd0aCA9PSAwCisJCQl8fCBnZXRMZW5ndGgoY3VycmVudFN0cmluZywgZGVwdGgpIDwgb3B0aW9ucy5tYXhMaW5lTGVuZ3RoCisJCQl8fCAoc3BsaXRMaW5lID0gc3BsaXQoY3VycmVudFN0cmluZywgb2Zmc2V0SW5HbG9iYWxMaW5lKSkgPT0gbnVsbCkgeworCisJCQkvLyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2Ygb3BlcmF0b3IsIG91dHB1dHMgbmV3IGxpbmUgYmVmb3JlIG9mIGFmdGVyIGR1bXBpbmcgaXQKKwkJCS8vIGluZGVudCBiZWZvcmUgcG9zdGZpeCBvcGVyYXRvcgorCQkJLy8gaW5kZW50IGFsc28gd2hlbiB0aGUgbGluZSBjYW5ub3QgYmUgc3BsaXQKKwkJCWlmIChvcGVyYXRvciA9PSBUb2tlbk5hbWVleHRlbmRzCisJCQkJfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1laW1wbGVtZW50cworCQkJCXx8IG9wZXJhdG9yID09IFRva2VuTmFtZXRocm93cykgeworCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7CisJCQl9CisJCQlpZiAocGxhY2VPcGVyYXRvckJlaGluZCkgeworCQkJCWlmICghcHJlSW5kZW50ZWQpIHsKKwkJCQkJZHVtcFRhYihkZXB0aCk7CisJCQkJfQorCQkJfQorCQkJaW50IG1heCA9IGN1cnJlbnRTdHJpbmcubGVuZ3RoKCk7CisJCQlpZiAobXVsdGlwbGVMaW5lQ29tbWVudENvdW50ZXIgIT0gMCkgeworCQkJCXRyeSB7CisJCQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGN1cnJlbnRTdHJpbmcpKTsKKwkJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworCQkJCQkJdXBkYXRlTWFwcGVkUG9zaXRpb25zV2hpbGVTcGxpdHRpbmcoCisJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lSW5kZXgsCisJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lSW5kZXggKyBsaW5lLmxlbmd0aCgpICsgb3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsKKwkJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQobGluZSk7CisJCQkJCQliZWdpbm5pbmdPZkxpbmVJbmRleCA9IGJlZ2lubmluZ09mTGluZUluZGV4ICsgbGluZS5sZW5ndGgoKTsKKwkJCQkJCWlmICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7CisJCQkJCQkJYmVnaW5uaW5nT2ZMaW5lSW5kZXggKz0gb3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoOworCQkJCQkJCWR1bXBUYWIoY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVwZGF0ZU1hcHBlZFBvc2l0aW9uc1doaWxlU3BsaXR0aW5nKAorCQkJCQliZWdpbm5pbmdPZkxpbmVJbmRleCwKKwkJCQkJYmVnaW5uaW5nT2ZMaW5lSW5kZXggKyBtYXgpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJY2hhciBjdXJyZW50Q2hhciA9IGN1cnJlbnRTdHJpbmcuY2hhckF0KGkpOworCQkJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7CisJCQkJCQljYXNlICdccicgOgorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnXG4nIDoKKwkJCQkJCQlpZiAoaSAhPSBtYXggLSAxKSB7CisJCQkJCQkJCS8vIGZpeCBmb3IgMUZGWUw1QzogTEZDT006QUxMIC0gSW5jb3JyZWN0IGluZGVudGF0aW9uIHdoZW4gc3BsaXQgd2l0aCBhIGNvbW1lbnQgaW5zaWRlIGEgY29uZGl0aW9uCisJCQkJCQkJCS8vIGEgc3Vic3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBhIGxpbmVTZXBhcmF0b3JTZXF1ZW5jZSwKKwkJCQkJCQkJLy8gZXhjZXB0IGlmIGl0IGhhcyBiZWVuIGFkZGVkIGJ5IGZvcm1hdCgpIGFmdGVyIGEgb25lLWxpbmUgY29tbWVudAorCQkJCQkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsKKwkKKwkJCQkJCQkJLy8gMUZHRERWNjogTEZDT006V0lOOTggLSBXZWlyZCBzcGxpdHRpbmcgb24gbWVzc2FnZSBleHByZXNzaW9uCisJCQkJCQkJCWR1bXBUYWIoZGVwdGggLSAxKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0IDoKKwkJCQkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKGN1cnJlbnRDaGFyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIHVwZGF0ZSBwb3NpdGlvbnMgaW5zaWRlIHRoZSBtYXBwZWRQb3NpdGlvbnMgdGFibGUKKwkJCWlmIChzdWJzdHJpbmdJbmRleCAhPSAtMSkgeworCQkJCWlmIChtdWx0aXBsZUxpbmVDb21tZW50Q291bnRlciA9PSAwKSB7CisJCQkJCWludCBzdGFydFBvc2l0aW9uID0KKwkJCQkJCWJlZ2lubmluZ09mTGluZUluZGV4ICsgc3RhcnRTdWJzdHJpbmdJbmRleGVzW3N1YnN0cmluZ0luZGV4XTsKKwkJCQkJdXBkYXRlTWFwcGVkUG9zaXRpb25zV2hpbGVTcGxpdHRpbmcoc3RhcnRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbiArIG1heCk7CisJCQkJfQorCisJCQkJLy8gY29tcHV0ZSB0aGUgc3BsaXREZWx0YSByZXN1bHRpbmcgd2l0aCB0aGUgb3BlcmF0b3IgYW5kIGJsYW5rIHJlbW92YWwKKwkJCQlpZiAoc3Vic3RyaW5nSW5kZXggKyAxICE9IHN0YXJ0U3Vic3RyaW5nSW5kZXhlcy5sZW5ndGgpIHsKKwkJCQkJaW5jcmVhc2VTcGxpdERlbHRhKAorCQkJCQkJc3RhcnRTdWJzdHJpbmdJbmRleGVzW3N1YnN0cmluZ0luZGV4XQorCQkJCQkJCSsgbWF4CisJCQkJCQkJLSBzdGFydFN1YnN0cmluZ0luZGV4ZXNbc3Vic3RyaW5nSW5kZXggKyAxXSk7CisJCQkJfQorCQkJfQorCQkJLy8gZHVtcCBwb3N0Zml4IG9wZXJhdG9yPworCQkJaWYgKHBsYWNlT3BlcmF0b3JCZWhpbmQpIHsKKwkJCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmUob3BlcmF0b3IpKSB7CisJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQkJaWYgKG9wZXJhdG9yICE9IDApIHsKKwkJCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsKKwkJCQlpZiAob3BlcmF0b3IgIT0gMCkgeworCQkJCQlpbmNyZWFzZVNwbGl0RGVsdGEob3BlcmF0b3JTdHJpbmcubGVuZ3RoKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkvLyBmaXggZm9yIDFGRzBCQTM6IExGQ09NOldJTjk4IC0gV2VpcmQgc3BsaXR0aW5nIG9uIGludGVyZmFjZXMKKwkJLy8gZXh0ZW5kcyBoYXMgdG8gc3RhbmQgYWxvbmUgb24gYSBsaW5lIHdoZW4gY3VycmVudFN0cmluZyBoYXMgYmVlbiBzcGxpdC4KKwkJaWYgKG9wdGlvbnMubWF4TGluZUxlbmd0aCAhPSAwCisJCQkmJiBzcGxpdExpbmUgIT0gbnVsbAorCQkJJiYgKG9wZXJhdG9yID09IFRva2VuTmFtZWV4dGVuZHMKKwkJCQl8fCBvcGVyYXRvciA9PSBUb2tlbk5hbWVpbXBsZW1lbnRzCisJCQkJfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1ldGhyb3dzKSkgeworCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZChvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZSk7CisJCQlpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsKKwkJCWR1bXBUYWIoZGVwdGggKyAxKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcGVyYXRvciA9PSBUb2tlbk5hbWVleHRlbmRzCisJCQkJfHwgb3BlcmF0b3IgPT0gVG9rZW5OYW1laW1wbGVtZW50cworCQkJCXx8IG9wZXJhdG9yID09IFRva2VuTmFtZXRocm93cykgeworCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQlpbmNyZWFzZVNwbGl0RGVsdGEoMSk7CisJCQl9CisJCX0KKwkJLy8gcGVyZm9ybSBhY3R1YWwgc3BsaXR0aW5nCisJCVN0cmluZyByZXN1bHRbXSA9IHNwbGl0TGluZS5zdWJzdHJpbmdzOworCQlpbnRbXSBzcGxpdE9wZXJhdG9ycyA9IHNwbGl0TGluZS5vcGVyYXRvcnM7CisKKwkJaWYgKHJlc3VsdFswXS5sZW5ndGgoKSA9PSAwKSB7CisJCQkvLyB3aGVuIHRoZSBzdWJzdHJpbmcgMCBpcyBudWxsLCB0aGUgc3Vic3RyaW5nIDEgaXMgY29ycmVjdGx5IGluZGVudGVkLgorCQkJZGVwdGgtLTsKKwkJCWVtcHR5Rmlyc3RTdWJTdHJpbmcgPSB0cnVlOworCQl9CisJCS8vIHRoZSBvcGVyYXRvciBnb2luZyBpbiBmcm9udCBvZiB0aGUgcmVzdWx0WzBdIHN0cmluZyBpcyB0aGUgb3BlcmF0b3IgcGFyYW1ldGVyCisJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXN1bHQubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCS8vIHRoZSBuZXcgZGVwdGggaXMgdGhlIGN1cnJlbnQgb25lIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnN0cmluZywKKwkJCS8vIHRoZSBjdXJyZW50IG9uZSArIDEgb3RoZXJ3aXNlLgorCQkJLy8gaWYgdGhlIHN1YnN0cmluZyBpcyBhIGNvbW1lbnQsIHVzZSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBMZXZlbCBpbnN0ZWFkIG9mIHRoZSBkZXB0aAorCQkJLy8gKC0xIGJlY2F1c2UgdGhlIG91cHV0bGluZSBpbmNyZWFzZXMgZGVwdGgpLgorCQkJLy8gKGZpeCBmb3IgMUZGQzcyUjogTEZDT006QUxMIC0gSW5jb3JyZWN0IGxpbmUgc3BsaXQgaW4gcHJlc2VuY2Ugb2YgbGluZSBjb21tZW50cykKKwkJCVN0cmluZyBjdXJyZW50UmVzdWx0ID0gcmVzdWx0W2ldOworCisJCQlpZiAoY3VycmVudFJlc3VsdC5sZW5ndGgoKSAhPSAwIHx8IHNwbGl0T3BlcmF0b3JzW2ldICE9IDApIHsKKwkJCQkJaW50IG5ld0RlcHRoID0KKwkJCQkJCShjdXJyZW50UmVzdWx0LnN0YXJ0c1dpdGgoIi8qIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXx8IGN1cnJlbnRSZXN1bHQuc3RhcnRzV2l0aCgiLy8iKSkgLy8kTk9OLU5MUy0xJCAKKwkJCQkJCQkJPyBpbmRlbnRhdGlvbkxldmVsIC0gMSA6IGRlcHRoOworCQkJCW91dHB1dExpbmUoCisJCQkJCWN1cnJlbnRSZXN1bHQsCisJCQkJCWkgPT0gMCB8fCAoaSA9PSAxICYmIGVtcHR5Rmlyc3RTdWJTdHJpbmcpID8gcHJlSW5kZW50ZWQgOiBmYWxzZSwKKwkJCQkJaSA9PSAwID8gbmV3RGVwdGggOiBuZXdEZXB0aCArIDEsCisJCQkJCXNwbGl0T3BlcmF0b3JzW2ldLAorCQkJCQlpLAorCQkJCQlzcGxpdExpbmUuc3RhcnRTdWJzdHJpbmdzSW5kZXhlcywKKwkJCQkJY3VycmVudFN0cmluZy5pbmRleE9mKGN1cnJlbnRSZXN1bHQpKTsKKwkJCQlpZiAoaSAhPSBtYXggLSAxKSB7CisJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UpOworCQkJCQlpbmNyZWFzZVNwbGl0RGVsdGEob3B0aW9ucy5saW5lU2VwYXJhdG9yU2VxdWVuY2UubGVuZ3RoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHJlc3VsdC5sZW5ndGggPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoIC0gMSkgeworCQkJaW50IGxhc3RPcGVyYXRvciA9IHNwbGl0T3BlcmF0b3JzW3Jlc3VsdC5sZW5ndGhdOworCQkJU3RyaW5nIGxhc3RPcGVyYXRvclN0cmluZyA9IG9wZXJhdG9yU3RyaW5nKGxhc3RPcGVyYXRvcik7CisJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKG9wdGlvbnMubGluZVNlcGFyYXRvclNlcXVlbmNlKTsKKwkJCWluY3JlYXNlU3BsaXREZWx0YShvcHRpb25zLmxpbmVTZXBhcmF0b3JTZXF1ZW5jZS5sZW5ndGgpOworCisJCQlpZiAoYnJlYWtMaW5lQmVmb3JlT3BlcmF0b3IobGFzdE9wZXJhdG9yKSkgeworCQkJCWR1bXBUYWIoZGVwdGggKyAxKTsKKwkJCQlpZiAobGFzdE9wZXJhdG9yICE9IDApIHsKKwkJCQkJaWYgKGluc2VydFNwYWNlQmVmb3JlKGxhc3RPcGVyYXRvcikpIHsKKwkJCQkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQoJyAnKTsKKwkJCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsKKwkJCQkJfQorCQkJCQlmb3JtYXR0ZWRTb3VyY2UuYXBwZW5kKGxhc3RPcGVyYXRvclN0cmluZyk7CisJCQkJCWluY3JlYXNlU3BsaXREZWx0YShsYXN0T3BlcmF0b3JTdHJpbmcubGVuZ3RoKCkpOworCisJCQkJCWlmIChpbnNlcnRTcGFjZUFmdGVyKGxhc3RPcGVyYXRvcikKKwkJCQkJCSYmIGxhc3RPcGVyYXRvciAhPSBUb2tlbk5hbWVpbXBsZW1lbnRzCisJCQkJCQkmJiBsYXN0T3BlcmF0b3IgIT0gVG9rZW5OYW1lZXh0ZW5kcworCQkJCQkJJiYgbGFzdE9wZXJhdG9yICE9IFRva2VuTmFtZXRocm93cykgeworCQkJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOworCQkJCQkJaW5jcmVhc2VTcGxpdERlbHRhKDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwbGFjZU9wZXJhdG9yQmVoaW5kKSB7CisJCQlpZiAoaW5zZXJ0U3BhY2VCZWZvcmUob3BlcmF0b3IpKSB7CisJCQkJZm9ybWF0dGVkU291cmNlLmFwcGVuZCgnICcpOworCQkJCWluY3JlYXNlU3BsaXREZWx0YSgxKTsKKwkJCX0KKwkJCWZvcm1hdHRlZFNvdXJjZS5hcHBlbmQob3BlcmF0b3JTdHJpbmcpOworCQkJLy9pbmNyZWFzZVNwbGl0RGVsdGEob3BlcmF0b3JTdHJpbmcubGVuZ3RoKCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIFBvcHMgdGhlIHRvcCBzdGF0ZW1lbnQgb2YgdGhlIHN0YWNrIGlmIGl0IGlzIDxjb2RlPnRva2VuPC9jb2RlPgorCSAqLworCXByaXZhdGUgaW50IHBvcChpbnQgdG9rZW4pIHsKKwkJaW50IGRlbHRhID0gMDsKKwkJaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQgPiAwKQorCQkJJiYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gdG9rZW4pKSB7CisJCQlkZWx0YS0tOworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCX0KKwkJcmV0dXJuIGRlbHRhOworCX0KKwkKKwkvKioKKwkgKiBQb3BzIHRoZSB0b3Agc3RhdGVtZW50IG9mIHRoZSBzdGFjayBpZiBpdCBpcyBhIDxjb2RlPkJMT0NLPC9jb2RlPiBvciBhIDxjb2RlPk5PTklOREVOVF9CTE9DSzwvY29kZT4uCisJICovCisJcHJpdmF0ZSBpbnQgcG9wQmxvY2soKSB7CisJCWludCBkZWx0YSA9IDA7CisJCWlmICgoY29uc3RydWN0aW9uc0NvdW50ID4gMCkKKwkJCSYmICgoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSA9PSBCTE9DSykKKwkJCQl8fCAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSA9PSBOT05JTkRFTlRfQkxPQ0spKSkgeworCQkJaWYgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gQkxPQ0spCisJCQkJZGVsdGEtLTsKKwkJCWNvbnN0cnVjdGlvbnNDb3VudC0tOworCQl9CisJCXJldHVybiBkZWx0YTsKKwl9CisJCisJLyoqCisJICogUG9wcyBlbGVtZW50cyB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkgb3IgdGhlIHRvcCBlbGVtZW50IGlzIDxjb2RlPnRva2VuPC9jb2RlPi48YnI+CisJICogRG9lcyBub3QgcmVtb3ZlIDxjb2RlPnRva2VuPC9jb2RlPiBmcm9tIHRoZSBzdGFjay4KKwkgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHRvIGJlIGxlZnQgYXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sKKwkgKi8KKwlwcml2YXRlIGludCBwb3BFeGNsdXNpdmVVbnRpbChpbnQgdG9rZW4pIHsKKwkJaW50IGRlbHRhID0gMDsKKwkJaW50IHN0YXJ0Q291bnQgPSBjb25zdHJ1Y3Rpb25zQ291bnQ7CisJCWZvciAoaW50IGkgPSBzdGFydENvdW50IC0gMTsgaSA+PSAwICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gdG9rZW47IGktLSkgeworCQkJaWYgKGNvbnN0cnVjdGlvbnNbaV0gIT0gTk9OSU5ERU5UX0JMT0NLKQorCQkJCWRlbHRhLS07CisJCQljb25zdHJ1Y3Rpb25zQ291bnQtLTsKKwkJfQorCQlyZXR1cm4gZGVsdGE7CisJfQorCQorCS8qKgorCSAqIFBvcHMgZWxlbWVudHMgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5IG9yIHRoZSB0b3AgZWxlbWVudCBpcworCSAqIGEgPGNvZGU+QkxPQ0s8L2NvZGU+IG9yIGEgPGNvZGU+Tk9OSU5ERU5UX0JMT0NLPC9jb2RlPi48YnI+CisJICogRG9lcyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlIHN0YWNrLgorCSAqLworCXByaXZhdGUgaW50IHBvcEV4Y2x1c2l2ZVVudGlsQmxvY2soKSB7CisJCWludCBzdGFydENvdW50ID0gY29uc3RydWN0aW9uc0NvdW50OworCQlpbnQgZGVsdGEgPSAwOworCQlmb3IgKGludCBpID0gc3RhcnRDb3VudCAtIDE7CisJCQlpID49IDAgJiYgY29uc3RydWN0aW9uc1tpXSAhPSBCTE9DSyAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IE5PTklOREVOVF9CTE9DSzsKKwkJCWktLSkgeworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCQlkZWx0YS0tOworCQl9CisJCXJldHVybiBkZWx0YTsKKwl9CisJCisJLyoqCisJICogUG9wcyBlbGVtZW50cyB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkgb3IgdGhlIHRvcCBlbGVtZW50IGlzCisJICogYSA8Y29kZT5CTE9DSzwvY29kZT4sIGEgPGNvZGU+Tk9OSU5ERU5UX0JMT0NLPC9jb2RlPiBvciBhIDxjb2RlPkNBU0U8L2NvZGU+Ljxicj4KKwkgKiBEb2VzIG5vdCByZW1vdmUgaXQgZnJvbSB0aGUgc3RhY2suCisJICovCisJcHJpdmF0ZSBpbnQgcG9wRXhjbHVzaXZlVW50aWxCbG9ja09yQ2FzZSgpIHsKKwkJaW50IHN0YXJ0Q291bnQgPSBjb25zdHJ1Y3Rpb25zQ291bnQ7CisJCWludCBkZWx0YSA9IDA7CisJCWZvciAoaW50IGkgPSBzdGFydENvdW50IC0gMTsKKwkJCWkgPj0gMAorCQkJCSYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gQkxPQ0sKKwkJCQkmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IE5PTklOREVOVF9CTE9DSworCQkJCSYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gVG9rZW5OYW1lY2FzZTsKKwkJCWktLSkgeworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCQlkZWx0YS0tOworCQl9CisJCXJldHVybiBkZWx0YTsKKwl9CisJCisJLyoqCisJICogUG9wcyBlbGVtZW50cyB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkgb3IgdGhlIHRvcCBlbGVtZW50IGlzIDxjb2RlPnRva2VuPC9jb2RlPi48YnI+CisJICogUmVtb3ZlcyA8Y29kZT50b2tlbjwvY29kZT4gZnJvbSB0aGUgc3RhY2sgdG9vLgorCSAqIEBwYXJhbSB0b2tlbiB0aGUgdG9rZW4gdG8gcmVtb3ZlIGZyb20gdGhlIHN0YWNrCisJICovCisJcHJpdmF0ZSBpbnQgcG9wSW5jbHVzaXZlVW50aWwoaW50IHRva2VuKSB7CisJCWludCBzdGFydENvdW50ID0gY29uc3RydWN0aW9uc0NvdW50OworCQlpbnQgZGVsdGEgPSAwOworCQlmb3IgKGludCBpID0gc3RhcnRDb3VudCAtIDE7IGkgPj0gMCAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IHRva2VuOyBpLS0pIHsKKwkJCWlmIChjb25zdHJ1Y3Rpb25zW2ldICE9IE5PTklOREVOVF9CTE9DSykKKwkJCQlkZWx0YS0tOworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCX0KKwkJaWYgKGNvbnN0cnVjdGlvbnNDb3VudCA+IDApIHsKKwkJCWlmIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdICE9IE5PTklOREVOVF9CTE9DSykKKwkJCQlkZWx0YS0tOworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCX0KKwkJcmV0dXJuIGRlbHRhOworCX0KKwkKKwkvKioKKwkgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMKKwkgKiBhIDxjb2RlPkJMT0NLPC9jb2RlPiBvciBhIDxjb2RlPk5PTklOREVOVF9CTE9DSzwvY29kZT4uPGJyPgorCSAqIERvZXMgbm90IHJlbW92ZSBpdCBmcm9tIHRoZSBzdGFjay4KKwkgKi8KKwlwcml2YXRlIGludCBwb3BJbmNsdXNpdmVVbnRpbEJsb2NrKCkgeworCQlpbnQgc3RhcnRDb3VudCA9IGNvbnN0cnVjdGlvbnNDb3VudDsKKwkJaW50IGRlbHRhID0gMDsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0Q291bnQgLSAxOworCQkJaSA+PSAwICYmIChjb25zdHJ1Y3Rpb25zW2ldICE9IEJMT0NLICYmIGNvbnN0cnVjdGlvbnNbaV0gIT0gTk9OSU5ERU5UX0JMT0NLKTsKKwkJCWktLSkgeworCQkJZGVsdGEtLTsKKwkJCWNvbnN0cnVjdGlvbnNDb3VudC0tOworCQl9CisJCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPiAwKSB7CisJCQlpZiAoY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQgLSAxXSA9PSBCTE9DSykKKwkJCQlkZWx0YS0tOworCQkJY29uc3RydWN0aW9uc0NvdW50LS07CisJCX0KKwkJcmV0dXJuIGRlbHRhOworCX0KKwkKKwkvKiogCisJICogUHVzaGVzIGEgYmxvY2sgaW4gdGhlIHN0YWNrLjxicj4KKwkgKiBQdXNoZXMgYSA8Y29kZT5CTE9DSzwvY29kZT4gaWYgdGhlIHN0YWNrIGlzIGVtcHR5IG9yIGlmIHRoZSB0b3AgZWxlbWVudCBpcyBhIDxjb2RlPkJMT0NLPC9jb2RlPiwKKwkgKiBwdXNoZXMgPGNvZGU+Tk9OSU5ERU5UX0JMT0NLPC9jb2RlPiBvdGhlcndpc2UuCisJICogQ3JlYXRlcyBhIG5ldyBiaWdnZXIgYXJyYXkgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuCisJICovCisJcHJpdmF0ZSBpbnQgcHVzaEJsb2NrKCkgeworCQlpbnQgZGVsdGEgPSAwOworCQlpZiAoY29uc3RydWN0aW9uc0NvdW50ID09IGNvbnN0cnVjdGlvbnMubGVuZ3RoKQorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQljb25zdHJ1Y3Rpb25zLAorCQkJCTAsCisJCQkJKGNvbnN0cnVjdGlvbnMgPSBuZXcgaW50W2NvbnN0cnVjdGlvbnNDb3VudCAqIDJdKSwKKwkJCQkwLAorCQkJCWNvbnN0cnVjdGlvbnNDb3VudCk7CisKKwkJaWYgKChjb25zdHJ1Y3Rpb25zQ291bnQgPT0gMCkKKwkJCXx8IChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IEJMT0NLKQorCQkJfHwgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gTk9OSU5ERU5UX0JMT0NLKQorCQkJfHwgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gVG9rZW5OYW1lY2FzZSkpIHsKKwkJCWRlbHRhKys7CisJCQljb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCsrXSA9IEJMT0NLOworCQl9IGVsc2UgeworCQkJY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQrK10gPSBOT05JTkRFTlRfQkxPQ0s7CisJCX0KKwkJcmV0dXJuIGRlbHRhOworCX0KKwkKKwkvKiogCisJICogUHVzaGVzIDxjb2RlPnRva2VuPC9jb2RlPi48YnI+CisJICogQ3JlYXRlcyBhIG5ldyBiaWdnZXIgYXJyYXkgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuCisJICovCisJcHJpdmF0ZSBpbnQgcHVzaENvbnRyb2xTdGF0ZW1lbnQoaW50IHRva2VuKSB7CisJCWlmIChjb25zdHJ1Y3Rpb25zQ291bnQgPT0gY29uc3RydWN0aW9ucy5sZW5ndGgpCisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWNvbnN0cnVjdGlvbnMsCisJCQkJMCwKKwkJCQkoY29uc3RydWN0aW9ucyA9IG5ldyBpbnRbY29uc3RydWN0aW9uc0NvdW50ICogMl0pLAorCQkJCTAsCisJCQkJY29uc3RydWN0aW9uc0NvdW50KTsKKwkJY29uc3RydWN0aW9uc1tjb25zdHJ1Y3Rpb25zQ291bnQrK10gPSB0b2tlbjsKKwkJcmV0dXJuIDE7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVGaXJzdEFyZ3VtZW50T24oaW50IGN1cnJlbnRUb2tlbikgeworCQkvL3JldHVybiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUNPTU1BIHx8IGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVTRU1JQ09MT04pOworCQlyZXR1cm4gY3VycmVudFRva2VuICE9IFRva2VuTmFtZWlmCisJCQkmJiBjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1lTFBBUkVOCisJCQkmJiBjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1lTk9UCisJCQkmJiBjdXJyZW50VG9rZW4gIT0gVG9rZW5OYW1ld2hpbGUKKwkJCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVmb3IKKwkJCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVzd2l0Y2g7CisJfQorCQorCS8qKgorCSAqIFNldCB0aGUgcG9zaXRpb25zIHRvIG1hcC4gVGhlIG1hcHBlZCBwb3NpdGlvbnMgc2hvdWxkIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKKwkgKiBnZXRNYXBwZWRQb3NpdGlvbnMoKSBtZXRob2QuCisJICogQHBhcmFtIHBvc2l0aW9ucyBpbnRbXQorCSAqIEBkZXByZWNhdGVkIFNldCB0aGUgcG9zaXRpb25zIHRvIG1hcCB1c2luZyB0aGUgZm9ybWF0KFN0cmluZywgaW50LCBpbnRbXSkgbWV0aG9kLgorCSAqIAorCSAqIEBzZWUgI2dldE1hcHBlZFBvc2l0aW9ucygpCisJICovCisJcHVibGljIHZvaWQgc2V0UG9zaXRpb25zVG9NYXAoaW50W10gcG9zaXRpb25zKSB7CisJCXBvc2l0aW9uc1RvTWFwID0gcG9zaXRpb25zOworCQlsaW5lRGVsdGEgPSAwOworCQlnbG9iYWxEZWx0YSA9IDA7CisJCW1hcHBlZFBvc2l0aW9ucyA9IG5ldyBpbnRbcG9zaXRpb25zLmxlbmd0aF07CisJfQorCQkKKwkvKiogCisJICogQXBwZW5kcyBhIHNwYWNlIGNoYXJhY3RlciB0byB0aGUgY3VycmVudCBsaW5lIGJ1ZmZlci4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc3BhY2UoKSB7CisJCWN1cnJlbnRMaW5lQnVmZmVyLmFwcGVuZCgnICcpOworCQlpbmNyZWFzZUxpbmVEZWx0YSgxKTsKKwl9CisJCisJLyoqCisJICogU3BsaXRzIDxjb2RlPnN0cmluZ1RvU3BsaXQ8L2NvZGU+IG9uIHRoZSB0b3AgbGV2ZWwgdG9rZW48YnI+CisJICogSWYgdGhlcmUgYXJlIHNldmVyYWwgaWRlbnRpY2FsIHRva2VuIGF0IHRoZSBzYW1lIGxldmVsLAorCSAqIHRoZSBzdHJpbmcgaXMgY3V0IGludG8gbWFueSBwaWVjZXMuCisJICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3BlcmF0b3IgYW5kIGFsbCB0aGUgc3Vic3RyaW5ncworCSAqIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgc3BsaXQKKwkgKi8KKwlwdWJsaWMgU3BsaXRMaW5lIHNwbGl0KFN0cmluZyBzdHJpbmdUb1NwbGl0KSB7CisJCXJldHVybiBzcGxpdChzdHJpbmdUb1NwbGl0LCAwKTsKKwl9CisJCisJLyoqCisJICogU3BsaXRzIDxjb2RlPnN0cmluZ1RvU3BsaXQ8L2NvZGU+IG9uIHRoZSB0b3AgbGV2ZWwgdG9rZW48YnI+CisJICogSWYgdGhlcmUgYXJlIHNldmVyYWwgaWRlbnRpY2FsIHRva2VuIGF0IHRoZSBzYW1lIGxldmVsLAorCSAqIHRoZSBzdHJpbmcgaXMgY3V0IGludG8gbWFueSBwaWVjZXMuCisJICogQHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3BlcmF0b3IgYW5kIGFsbCB0aGUgc3Vic3RyaW5ncworCSAqIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgc3BsaXQKKwkgKi8KKwlwdWJsaWMgU3BsaXRMaW5lIHNwbGl0KFN0cmluZyBzdHJpbmdUb1NwbGl0LCBpbnQgb2Zmc2V0SW5HbG9iYWxMaW5lKSB7CisJCS8qCisJCSAqIFNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTQwIGFuZAorCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzg3IAorCQkgKi8KKwkJaWYgKHN0cmluZ1RvU3BsaXQuaW5kZXhPZigiLy8kTk9OLU5MUyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBudWxsOworCQl9CisJCS8vIGxvY2FsIHZhcmlhYmxlcworCQlpbnQgY3VycmVudFRva2VuID0gMDsKKwkJaW50IHNwbGl0VG9rZW5UeXBlID0gMDsKKwkJaW50IHNwbGl0VG9rZW5EZXB0aCA9IEludGVnZXIuTUFYX1ZBTFVFOworCQlpbnQgc3BsaXRUb2tlblByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKwkJaW50W10gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFsxMF07CisJCS8vIGNvbnRhaW5zIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBzdWJzdHJpbmdzCisJCWludFtdIHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50WzEwXTsKKwkJLy8gY29udGFpbnMgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHN1YnN0cmluZ3MKKwkJaW50IHN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQorCQlpbnRbXSBzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbMTBdOworCQkvLyBjb250YWlucyB0aGUgc3RhcnQgcG9zaXRpb24gb2Ygc3Vic3RyaW5ncworCQlpbnQgc3BsaXRPcGVyYXRvcnNDb3VudCA9IDA7IC8vIGluZGV4IGluIHRoZSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbiBhcnJheQorCQlpbnRbXSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA9IG5ldyBpbnRbMTBdOworCQlpbnQgb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9IDA7CisJCWludCBwb3NpdGlvbiA9IDA7CisJCWludCBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSAtMTsKKwkJLy8gdXNlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIDFzdCBvcGVuIHBhcmVudGhlc2lzCisJCS8vIG5lZWRlZCBmb3IgYSBwYXR0ZXJuIGxpa2U6IEEuQihDKTsgd2Ugd2FudCBmb3JtYXR0ZWQgbGlrZSBBLkIoIHNwbGl0IEMpOworCQkvLyBzZXR1cCB0aGUgc2Nhbm5lciB3aXRoIGEgbmV3IHNvdXJjZQorCQlpbnQgbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID0gLTE7CisJCS8vIHRvIHJlbWVtYmVyIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjb21tZW50CisJCWludCBmaXJzdFRva2VuT25MaW5lID0gLTE7CisJCS8vIHRvIHJlbWVtYmVyIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgbGluZQorCQlpbnQgcHJldmlvdXNUb2tlbiA9IC0xOworCQkvLyB0byByZW1lbWJlciB0aGUgcHJldmlvdXMgdG9rZW4uCisJCXNwbGl0U2Nhbm5lci5zZXRTb3VyY2Uoc3RyaW5nVG9TcGxpdC50b0NoYXJBcnJheSgpKTsKKworCQl0cnkgeworCQkJLy8gc3RhcnQgdGhlIGxvb3AKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJLy8gdGFrZXMgdGhlIG5leHQgdG9rZW4KKwkJCQl0cnkgeworCQkJCQlpZiAoY3VycmVudFRva2VuICE9IFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSkKKwkJCQkJCXByZXZpb3VzVG9rZW4gPSBjdXJyZW50VG9rZW47CisJCQkJCWN1cnJlbnRUb2tlbiA9IHNwbGl0U2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQlpZiAoIWhhbmRsZUludmFsaWRUb2tlbihlKSkKKwkJCQkJCXRocm93IGU7CisJCQkJCWN1cnJlbnRUb2tlbiA9IDA7IC8vIHRoaXMgdmFsdWUgaXMgbm90IG1vZGlmeSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisJCQkJfQorCQkJCWlmIChjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lRU9GKQorCQkJCQlicmVhazsKKworCQkJCWlmIChmaXJzdFRva2VuT25MaW5lID09IC0xKSB7CisJCQkJCWZpcnN0VG9rZW5PbkxpbmUgPSBjdXJyZW50VG9rZW47CisJCQkJfQorCQkJCXN3aXRjaCAoY3VycmVudFRva2VuKSB7CisJCQkJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOgorCQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPiAwKSB7CisJCQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gMQorCQkJCQkJCQkmJiBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPCBvcGVuUGFyZW50aGVzaXNQb3NpdGlvblswXSkgeworCQkJCQkJCQlsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvblswXTsKKwkJCQkJCQl9IGVsc2UgaWYgKAorCQkJCQkJCQkoc3BsaXRUb2tlbkRlcHRoID09IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJCQkJCQkJfHwgKHNwbGl0VG9rZW5EZXB0aCA+IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQKKwkJCQkJCQkJCQkmJiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IDEpKSB7CisJCQkJCQkJCXNwbGl0VG9rZW5UeXBlID0gMDsKKwkJCQkJCQkJc3BsaXRUb2tlbkRlcHRoID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudDsKKwkJCQkJCQkJc3BsaXRUb2tlblByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCQkJCQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1swXSA9IDA7CisJCQkJCQkJCS8vIGJldHRlciB0b2tlbiBtZWFucyB0aGUgd2hvbGUgbGluZSB1bnRpbCBub3cgaXMgdGhlIGZpcnN0IHN1YnN0cmluZworCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQgPSAxOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MKKwkJCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1swXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdOworCQkJCQkJCQkvLyBzdWJzdHJpbmcgZW5kcyBvbiBvcGVyYXRvciBzdGFydAorCQkJCQkJCQlwb3NpdGlvbiA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uWzBdOworCQkJCQkJCQkvLyB0aGUgc3RyaW5nIG11c3RuJ3QgYmUgY3V0IGJlZm9yZSB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyBidXQgYWZ0ZXIgdGhlIG9wZW5pbmcgb25lLgorCQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMKKwkJCQkJCQkJc3BsaXRPcGVyYXRvcnNbMF0gPSAwOworCQkJCQkJCX0KKwkJCQkJCQlvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50LS07CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOgorCQkJCQljYXNlIFRva2VuTmFtZUxQQVJFTiA6CisJCQkJCQlpZiAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbi5sZW5ndGgpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNQb3NpdGlvbiwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uID0gbmV3IGludFtvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ICogMl0pLAorCQkJCQkJCQkwLAorCQkJCQkJCQlvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50KTsKKwkJCQkJCX0KKwkJCQkJCW9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW29wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQrK10gPQorCQkJCQkJCXNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQlpZiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZUxQQVJFTiAmJiBwcmV2aW91c1Rva2VuID09IFRva2VuTmFtZVJQQVJFTikgeworCQkJCQkJCW9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW29wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgLSAxXSA9CisJCQkJCQkJCXNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVG9rZW5OYW1lU0VNSUNPTE9OIDogLy8gOworCQkJCQljYXNlIFRva2VuTmFtZUNPTU1BIDogLy8gLAorCQkJCQljYXNlIFRva2VuTmFtZUVRVUFMIDogLy8gPQorCQkJCQkJaWYgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPCBzcGxpdFRva2VuRGVwdGgKKwkJCQkJCQl8fCAob3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudCA9PSBzcGxpdFRva2VuRGVwdGgKKwkJCQkJCQkJJiYgc3BsaXRUb2tlblByaW9yaXR5ID4gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKSkgeworCQkJCQkJCS8vIHRoZSBjdXJyZW50IHRva2VuIGlzIGJldHRlciB0aGFuIHRoZSBvbmUgd2UgY3VycmVudGx5IGhhdmUKKwkJCQkJCQkvLyAoaW4gbGV2ZWwgb3IgaW4gcHJpb3JpdHkgaWYgc2FtZSBsZXZlbCkKKwkJCQkJCQkvLyByZXNldCB0aGUgc3Vic3RyaW5nc0NvdW50CisJCQkJCQkJc3BsaXRUb2tlbkRlcHRoID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudDsKKwkJCQkJCQlzcGxpdFRva2VuVHlwZSA9IGN1cnJlbnRUb2tlbjsKKwkJCQkJCQlzcGxpdFRva2VuUHJpb3JpdHkgPSBnZXRUb2tlblByaW9yaXR5KGN1cnJlbnRUb2tlbik7CisJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zWzBdID0gMDsKKwkJCQkJCQkvLyBiZXR0ZXIgdG9rZW4gbWVhbnMgdGhlIHdob2xlIGxpbmUgdW50aWwgbm93IGlzIHRoZSBmaXJzdCBzdWJzdHJpbmcKKworCQkJCQkJCWlmIChzZXBhcmF0ZUZpcnN0QXJndW1lbnRPbihmaXJzdFRva2VuT25MaW5lKQorCQkJCQkJCQkmJiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID4gMCkgeworCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MKKworCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzBdID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25bc3BsaXRUb2tlbkRlcHRoIC0gMV07CisJCQkJCQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1sxXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW3NwbGl0VG9rZW5EZXB0aCAtIDFdOworCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzFdID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHNwbGl0IG9wZXJhdG9ycworCQkJCQkJCQlzcGxpdE9wZXJhdG9yc1swXSA9IDA7CisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzWzFdID0gY3VycmVudFRva2VuOworCQkJCQkJCQlwb3NpdGlvbiA9IHNwbGl0U2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJCQkJCS8vIG5leHQgc3Vic3RyaW5nIHdpbGwgc3RhcnQgZnJvbSBvcGVyYXRvciBlbmQKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQgPSAxOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MKKworCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzBdID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJCS8vIHN1YnN0cmluZyBlbmRzIG9uIG9wZXJhdG9yIHN0YXJ0CisJCQkJCQkJCXBvc2l0aW9uID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQkJLy8gbmV4dCBzdWJzdHJpbmcgd2lsbCBzdGFydCBmcm9tIG9wZXJhdG9yIGVuZAorCQkJCQkJCQlzcGxpdE9wZXJhdG9yc0NvdW50ID0gMTsgLy8gcmVzZXRzIHRoZSBjb3VudCBvZiBzcGxpdCBvcGVyYXRvcnMKKwkJCQkJCQkJc3BsaXRPcGVyYXRvcnNbMF0gPSBjdXJyZW50VG9rZW47CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoCisJCQkJCQkJCSYmIHNwbGl0VG9rZW5Qcmlvcml0eSA9PSBnZXRUb2tlblByaW9yaXR5KGN1cnJlbnRUb2tlbikpCisJCQkJCQkJCSYmIHNwbGl0VG9rZW5UeXBlICE9IFRva2VuTmFtZUVRVUFMCisJCQkJCQkJCSYmIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVFUVVBTCkgeworCQkJCQkJCQkvLyBmaXggZm9yIDFGRzBCQ046IExGQ09NOldJTjk4IC0gTWlzc2luZyBvbmUgaW5kZW50YXRpb24gYWZ0ZXIgc3BsaXQKKwkJCQkJCQkJLy8gdGFrZSBvbmx5IHRoZSAxc3QgPSBpbnRvIGFjY291bnQuCisJCQkJCQkJCS8vIGlmIGFub3RoZXIgdG9rZW4gd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyBmb3VuZCwKKwkJCQkJCQkJLy8gcHVzaCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHN1YnN0cmluZyBhbmQKKwkJCQkJCQkJLy8gcHVzaCB0aGUgdG9rZW4gaW50byB0aGUgc3RhY2suCisJCQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhcnJheSBvYmplY3QgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuCisJCQkJCQkJCWlmIChzdWJzdHJpbmdzQ291bnQgPT0gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLmxlbmd0aCkgeworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsCisJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnQgKiAyXSksCisJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQpOworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCXN1YnN0cmluZ3NDb3VudCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHNwbGl0T3BlcmF0b3JzQ291bnQgPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoKSB7CisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJCXNwbGl0T3BlcmF0b3JzLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJc3BsaXRPcGVyYXRvcnNDb3VudCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudF0gPSBwb3NpdGlvbjsKKwkJCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnQrK10gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQkJLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQKKwkJCQkJCQkJcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kCisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzW3NwbGl0T3BlcmF0b3JzQ291bnQrK10gPSBjdXJyZW50VG9rZW47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBUb2tlbk5hbWVDT0xPTiA6IC8vIDogKDE1LjI0KQorCQkJCQkJLy8gc2VlIDFGSzdDNVIsIHdlIG9ubHkgc3BsaXQgb24gYSBjb2xvbiwgd2hlbiBpdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBxdWVzdGlvbi1tYXJrLgorCQkJCQkJLy8gaW5kZWVkIGl0IG1pZ2h0IGFwcGVhciBhbHNvIGJlaGluZCBhIGNhc2Ugc3RhdGVtZW50LCBhbmQgd2UgZG8gbm90IHRvIGJyZWFrIGF0IHRoaXMgcG9pbnQuCisJCQkJCQlpZiAoKHNwbGl0T3BlcmF0b3JzQ291bnQgPT0gMCkKKwkJCQkJCQl8fCBzcGxpdE9wZXJhdG9yc1tzcGxpdE9wZXJhdG9yc0NvdW50IC0gMV0gIT0gVG9rZW5OYW1lUVVFU1RJT04pIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJY2FzZSBUb2tlbk5hbWVleHRlbmRzIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWVpbXBsZW1lbnRzIDoKKwkJCQkJY2FzZSBUb2tlbk5hbWV0aHJvd3MgOgorCisJCQkJCWNhc2UgVG9rZW5OYW1lRE9UIDogLy8gLgorCQkJCQljYXNlIFRva2VuTmFtZU1VTFRJUExZIDogLy8gKiAoMTUuMTYuMSkKKwkJCQkJY2FzZSBUb2tlbk5hbWVESVZJREUgOiAvLyAvICgxNS4xNi4yKQorCQkJCQljYXNlIFRva2VuTmFtZVJFTUFJTkRFUiA6IC8vICUgKDE1LjE2LjMpCisJCQkJCWNhc2UgVG9rZW5OYW1lUExVUyA6IC8vICsgKDE1LjE3LCAxNS4xNy4yKQorCQkJCQljYXNlIFRva2VuTmFtZU1JTlVTIDogLy8gLSAoMTUuMTcuMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUIDogLy8gPDwgKDE1LjE4KQorCQkJCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUIDogLy8gPj4gKDE1LjE4KQorCQkJCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDogLy8gPj4+ICgxNS4xOCkKKwkJCQkJY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCAoMTUuMTkuMSkKKwkJCQkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDogLy8gPD0gKDE1LjE5LjEpCisJCQkJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6IC8vID4gKDE1LjE5LjEpCisJCQkJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUl9FUVVBTCA6IC8vID49ICgxNS4xOS4xKQorCQkJCQljYXNlIFRva2VuTmFtZWluc3RhbmNlb2YgOiAvLyBpbnN0YW5jZW9mCisJCQkJCWNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOiAvLyA9PSAoMTUuMjAsIDE1LjIwLjEsIDE1LjIwLjIsIDE1LjIwLjMpCisJCQkJCWNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQorCQkJCQljYXNlIFRva2VuTmFtZUFORCA6IC8vICYgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQorCQkJCQljYXNlIFRva2VuTmFtZU9SIDogLy8gfCAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lWE9SIDogLy8gXiAoMTUuMjEsIDE1LjIxLjEsIDE1LjIxLjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lQU5EX0FORCA6IC8vICYmICgxNS4yMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVPUl9PUiA6IC8vIHx8ICgxNS4yMykKKwkJCQkJY2FzZSBUb2tlbk5hbWVRVUVTVElPTiA6IC8vID8gKDE1LjI0KQorCQkJCQljYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDogLy8gKj0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDogLy8gLz0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSX0VRVUFMIDogLy8gJT0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lUExVU19FUVVBTCA6IC8vICs9ICgxNS4yNS4yKQorCQkJCQljYXNlIFRva2VuTmFtZU1JTlVTX0VRVUFMIDogLy8gLT0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTCA6IC8vIDw8PSAoMTUuMjUuMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+PSAoMTUuMjUuMikKKwkJCQkJY2FzZSBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+Pj0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDogLy8gJj0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDogLy8gXj0gKDE1LjI1LjIpCisJCQkJCWNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOiAvLyB8PSAoMTUuMjUuMikKKworCQkJCQkJaWYgKChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50IDwgc3BsaXRUb2tlbkRlcHRoCisJCQkJCQkJfHwgKG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uQ291bnQgPT0gc3BsaXRUb2tlbkRlcHRoCisJCQkJCQkJCSYmIHNwbGl0VG9rZW5Qcmlvcml0eSA+IGdldFRva2VuUHJpb3JpdHkoY3VycmVudFRva2VuKSkpCisJCQkJCQkJJiYgISgoY3VycmVudFRva2VuID09IFRva2VuTmFtZVBMVVMgfHwgY3VycmVudFRva2VuID09IFRva2VuTmFtZU1JTlVTKQorCQkJCQkJCQkmJiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UKKwkJCQkJCQkJCXx8IHByZXZpb3VzVG9rZW4gPT0gVG9rZW5OYW1lTEJSQUNLRVQKKwkJCQkJCQkJCXx8IHNwbGl0U2Nhbm5lci5zdGFydFBvc2l0aW9uID09IDApKSkgeworCQkJCQkJCS8vIHRoZSBjdXJyZW50IHRva2VuIGlzIGJldHRlciB0aGFuIHRoZSBvbmUgd2UgY3VycmVudGx5IGhhdmUKKwkJCQkJCQkvLyAoaW4gbGV2ZWwgb3IgaW4gcHJpb3JpdHkgaWYgc2FtZSBsZXZlbCkKKwkJCQkJCQkvLyByZXNldCB0aGUgc3Vic3RyaW5nc0NvdW50CisJCQkJCQkJc3BsaXRUb2tlbkRlcHRoID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25Db3VudDsKKwkJCQkJCQlzcGxpdFRva2VuVHlwZSA9IGN1cnJlbnRUb2tlbjsKKwkJCQkJCQlzcGxpdFRva2VuUHJpb3JpdHkgPSBnZXRUb2tlblByaW9yaXR5KGN1cnJlbnRUb2tlbik7CisJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zWzBdID0gMDsKKwkJCQkJCQkvLyBiZXR0ZXIgdG9rZW4gbWVhbnMgdGhlIHdob2xlIGxpbmUgdW50aWwgbm93IGlzIHRoZSBmaXJzdCBzdWJzdHJpbmcKKworCQkJCQkJCWlmIChzZXBhcmF0ZUZpcnN0QXJndW1lbnRPbihmaXJzdFRva2VuT25MaW5lKQorCQkJCQkJCQkmJiBvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID4gMCkgeworCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHN1YnN0cmluZ3MKKworCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzBdID0gb3BlblBhcmVudGhlc2lzUG9zaXRpb25bc3BsaXRUb2tlbkRlcHRoIC0gMV07CisJCQkJCQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1sxXSA9IG9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uW3NwbGl0VG9rZW5EZXB0aCAtIDFdOworCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zWzFdID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzQ291bnQgPSAzOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHNwbGl0IG9wZXJhdG9ycworCQkJCQkJCQlzcGxpdE9wZXJhdG9yc1swXSA9IDA7CisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzWzFdID0gMDsKKwkJCQkJCQkJc3BsaXRPcGVyYXRvcnNbMl0gPSBjdXJyZW50VG9rZW47CisJCQkJCQkJCXBvc2l0aW9uID0gc3BsaXRTY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJCQkJLy8gbmV4dCBzdWJzdHJpbmcgd2lsbCBzdGFydCBmcm9tIG9wZXJhdG9yIGVuZAorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXN1YnN0cmluZ3NDb3VudCA9IDE7IC8vIHJlc2V0cyB0aGUgY291bnQgb2Ygc3Vic3RyaW5ncworCisJCQkJCQkJCXN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbMF0gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQkJLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQKKwkJCQkJCQkJcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kCisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzQ291bnQgPSAyOyAvLyByZXNldHMgdGhlIGNvdW50IG9mIHNwbGl0IG9wZXJhdG9ycworCQkJCQkJCQlzcGxpdE9wZXJhdG9yc1swXSA9IDA7CisJCQkJCQkJCS8vIG5vdGhpbmcgZm9yIGZpcnN0IG9wZXJhbmQgc2luY2Ugb3BlcmF0b3Igd2lsbCBiZSBpbnNlcnRlZCBpbiBmcm9udCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQKKwkJCQkJCQkJc3BsaXRPcGVyYXRvcnNbMV0gPSBjdXJyZW50VG9rZW47CisKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChvcGVuUGFyZW50aGVzaXNQb3NpdGlvbkNvdW50ID09IHNwbGl0VG9rZW5EZXB0aAorCQkJCQkJCQkmJiBzcGxpdFRva2VuUHJpb3JpdHkgPT0gZ2V0VG9rZW5Qcmlvcml0eShjdXJyZW50VG9rZW4pKSB7CisJCQkJCQkJCS8vIGlmIGFub3RoZXIgdG9rZW4gd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyBmb3VuZCwKKwkJCQkJCQkJLy8gcHVzaCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHN1YnN0cmluZyBhbmQKKwkJCQkJCQkJLy8gcHVzaCB0aGUgdG9rZW4gaW50byB0aGUgc3RhY2suCisJCQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhcnJheSBvYmplY3QgaWYgdGhlIGN1cnJlbnQgb25lIGlzIGZ1bGwuCisJCQkJCQkJCWlmIChzdWJzdHJpbmdzQ291bnQgPT0gc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLmxlbmd0aCkgeworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsCisJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnQgKiAyXSksCisJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQlzdWJzdHJpbmdzQ291bnQpOworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwKKwkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCXN1YnN0cmluZ3NDb3VudCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHNwbGl0T3BlcmF0b3JzQ291bnQgPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoKSB7CisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJCXNwbGl0T3BlcmF0b3JzLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLAorCQkJCQkJCQkJCTAsCisJCQkJCQkJCQkJc3BsaXRPcGVyYXRvcnNDb3VudCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudF0gPSBwb3NpdGlvbjsKKwkJCQkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnQrK10gPSBzcGxpdFNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQkJCQkJLy8gc3Vic3RyaW5nIGVuZHMgb24gb3BlcmF0b3Igc3RhcnQKKwkJCQkJCQkJcG9zaXRpb24gPSBzcGxpdFNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJCQkvLyBuZXh0IHN1YnN0cmluZyB3aWxsIHN0YXJ0IGZyb20gb3BlcmF0b3IgZW5kCisJCQkJCQkJCXNwbGl0T3BlcmF0b3JzW3NwbGl0T3BlcmF0b3JzQ291bnQrK10gPSBjdXJyZW50VG9rZW47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoaXNDb21tZW50KGN1cnJlbnRUb2tlbikpIHsKKwkJCQkJbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID0gc3BsaXRTY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJfSBlbHNlIHsKKwkJCQkJbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uID0gLTE7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgc3BsaXQsIHJldHVybiBudWxsLgorCQlpZiAoc3BsaXRPcGVyYXRvcnNDb3VudCA9PSAwKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gIyMgU1BFQ0lBTCBDQVNFUyBCRUdJTgorCQlpZiAoKChzcGxpdE9wZXJhdG9yc0NvdW50ID09IDIKKwkJCSYmIHNwbGl0T3BlcmF0b3JzWzFdID09IFRva2VuTmFtZURPVAorCQkJJiYgc3BsaXRUb2tlbkRlcHRoID09IDAKKwkJCSYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA+IC0xKQorCQkJfHwgKHNwbGl0T3BlcmF0b3JzQ291bnQgPiAyCisJCQkJJiYgc3BsaXRPcGVyYXRvcnNbMV0gPT0gVG9rZW5OYW1lRE9UCisJCQkJJiYgc3BsaXRUb2tlbkRlcHRoID09IDAKKwkJCQkmJiBsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24gPiAtMQorCQkJCSYmIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA8PSBvcHRpb25zLm1heExpbmVMZW5ndGgpCisJCQl8fCAoc2VwYXJhdGVGaXJzdEFyZ3VtZW50T24oZmlyc3RUb2tlbk9uTGluZSkKKwkJCQkmJiBzcGxpdFRva2VuRGVwdGggPiAwCisJCQkJJiYgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uID4gLTEpKQorCQkJJiYgKGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiA8IHNwbGl0U2Nhbm5lci5zb3VyY2UubGVuZ3RoCisJCQkJJiYgc3BsaXRTY2FubmVyLnNvdXJjZVtsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb25dICE9ICcpJykpIHsKKwkJCS8vIGZpeCBmb3IgMUZINEoySDogTEZDT006V0lOTlQgLSBGb3JtYXR0ZXIgLSBFbXB0eSBwYXJlbnRoZXNpcyBzaG91bGQgbm90IGJlIGJyb2tlbiBvbiB0d28gbGluZXMKKwkJCS8vIG9ubHkgb25lIHNwbGl0IG9uIGEgdG9wIGxldmVsIC4KKwkJCS8vIG9yIG1vcmUgdGhhbiBvbmUgc3BsaXQgb24gLiBhbmQgc3Vic3RyaW5nIGJlZm9yZSBvcGVuIHBhcmVudGhlc2lzIGZpdHMgb25lIGxpbmUuCisJCQkvLyBvciBzcGxpdCBpbnNpZGUgcGFyZW50aGVzaXMgYW5kIGZpcnN0IHRva2VuIGlzIG5vdCBhIGZvci93aGlsZS9pZgorCQkJU3BsaXRMaW5lIHNsID0KKwkJCQlzcGxpdCgKKwkJCQkJc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcobGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKSwKKwkJCQkJbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKTsKKwkJCWlmIChzbCA9PSBudWxsIHx8IHNsLm9wZXJhdG9yc1swXSAhPSBUb2tlbk5hbWVDT01NQSkgeworCQkJCS8vIHRyaW0oKSBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgZXh0cmEgYmxhbmtzIGF0IHRoZSBlbmQgb2YgdGhlIHN1YnN0cmluZy4gU2VlIFBSIDFGR1lQSTEKKwkJCQlyZXR1cm4gbmV3IFNwbGl0TGluZSgKKwkJCQkJbmV3IGludFtdIHsgMCwgMCB9LAorCQkJCQluZXcgU3RyaW5nW10geworCQkJCQkJc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcoMCwgbGFzdE9wZW5QYXJlbnRoZXNpc1Bvc2l0aW9uKS50cmltKCksCisJCQkJCQlzdHJpbmdUb1NwbGl0LnN1YnN0cmluZyhsYXN0T3BlblBhcmVudGhlc2lzUG9zaXRpb24pfSwKKwkJCQkJbmV3IGludFtdIHsKKwkJCQkJCW9mZnNldEluR2xvYmFsTGluZSwKKwkJCQkJCWxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbiArIG9mZnNldEluR2xvYmFsTGluZSB9KTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gcmlnaHQgc3Vic3RyaW5nIGNhbiBiZSBzcGxpdCBhbmQgaXMgc3BsaXQgb24gY29tbWEKKwkJCQkvLyBjb3B5IHN1YnN0cmluZ3MgYW5kIG9wZXJhdG9ycworCQkJCS8vIGV4Y2VwdCBpZiB0aGUgMXN0IHN0cmluZyBpcyBlbXB0eS4KKwkJCQlpbnQgc3RhcnRJbmRleCA9IChzbC5zdWJzdHJpbmdzWzBdLmxlbmd0aCgpID09IDApID8gMSA6IDA7CisJCQkJaW50IHN1YlN0cmluZ3NMZW5ndGggPSBzbC5zdWJzdHJpbmdzLmxlbmd0aCArIDEgLSBzdGFydEluZGV4OworCQkJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc3ViU3RyaW5nc0xlbmd0aF07CisJCQkJaW50W10gc3RhcnRJbmRleGVzID0gbmV3IGludFtzdWJTdHJpbmdzTGVuZ3RoXTsKKwkJCQlpbnQgb3BlcmF0b3JzTGVuZ3RoID0gc2wub3BlcmF0b3JzLmxlbmd0aCArIDEgLSBzdGFydEluZGV4OworCQkJCWludFtdIG9wZXJhdG9ycyA9IG5ldyBpbnRbb3BlcmF0b3JzTGVuZ3RoXTsKKworCQkJCXJlc3VsdFswXSA9IHN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKDAsIGxhc3RPcGVuUGFyZW50aGVzaXNQb3NpdGlvbik7CisJCQkJb3BlcmF0b3JzWzBdID0gMDsKKworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXNsLnN0YXJ0U3Vic3RyaW5nc0luZGV4ZXMsCisJCQkJCXN0YXJ0SW5kZXgsCisJCQkJCXN0YXJ0SW5kZXhlcywKKwkJCQkJMSwKKwkJCQkJc3ViU3RyaW5nc0xlbmd0aCAtIDEpOworCQkJCWZvciAoaW50IGkgPSBzdWJTdHJpbmdzTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQkJc3RhcnRJbmRleGVzW2ldICs9IG9mZnNldEluR2xvYmFsTGluZTsKKwkJCQl9CisJCQkJU3lzdGVtLmFycmF5Y29weShzbC5zdWJzdHJpbmdzLCBzdGFydEluZGV4LCByZXN1bHQsIDEsIHN1YlN0cmluZ3NMZW5ndGggLSAxKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHNsLm9wZXJhdG9ycywgc3RhcnRJbmRleCwgb3BlcmF0b3JzLCAxLCBvcGVyYXRvcnNMZW5ndGggLSAxKTsKKworCQkJCXJldHVybiBuZXcgU3BsaXRMaW5lKG9wZXJhdG9ycywgcmVzdWx0LCBzdGFydEluZGV4ZXMpOworCQkJfQorCQl9CisJCS8vIGlmIHRoZSBsYXN0IHRva2VuIGlzIGEgY29tbWVudCBhbmQgdGhlIHN1YnN0cmluZyBiZWZvcmUgdGhlIGNvbW1lbnQgZml0cyBvbiBhIGxpbmUsCisJCS8vIHNwbGl0IGJlZm9yZSB0aGUgY29tbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisJCWlmIChsYXN0Q29tbWVudFN0YXJ0UG9zaXRpb24gPiAtMQorCQkJJiYgbGFzdENvbW1lbnRTdGFydFBvc2l0aW9uIDwgb3B0aW9ucy5tYXhMaW5lTGVuZ3RoCisJCQkmJiBzcGxpdFRva2VuUHJpb3JpdHkgPiA1MCkgeworCQkJaW50IGVuZCA9IGxhc3RDb21tZW50U3RhcnRQb3NpdGlvbjsKKwkJCWludCBzdGFydCA9IGxhc3RDb21tZW50U3RhcnRQb3NpdGlvbjsKKwkJCWlmIChzdHJpbmdUb1NwbGl0LmNoYXJBdChlbmQgLSAxKSA9PSAnICcpIHsKKwkJCQllbmQtLTsKKwkJCX0KKwkJCWlmIChzdGFydCAhPSBlbmQgJiYgc3RyaW5nVG9TcGxpdC5jaGFyQXQoc3RhcnQpID09ICcgJykgeworCQkJCXN0YXJ0Kys7CisJCQl9CisJCQlyZXR1cm4gbmV3IFNwbGl0TGluZSgKKwkJCQluZXcgaW50W10geyAwLCAwIH0sCisJCQkJbmV3IFN0cmluZ1tdIHsgc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcoMCwgZW5kKSwgc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcoc3RhcnQpfSwKKwkJCQluZXcgaW50W10geyAwLCBzdGFydCB9KTsKKwkJfQorCQlpZiAocG9zaXRpb24gIT0gc3RyaW5nVG9TcGxpdC5sZW5ndGgoKSkgeworCQkJaWYgKHN1YnN0cmluZ3NDb3VudCA9PSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLAorCQkJCQkwLAorCQkJCQkoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnQgKiAyXSksCisJCQkJCTAsCisJCQkJCXN1YnN0cmluZ3NDb3VudCk7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywKKwkJCQkJMCwKKwkJCQkJKHN1YnN0cmluZ3NFbmRQb3NpdGlvbnMgPSBuZXcgaW50W3N1YnN0cmluZ3NDb3VudCAqIDJdKSwKKwkJCQkJMCwKKwkJCQkJc3Vic3RyaW5nc0NvdW50KTsKKwkJCX0KKwkJCS8vIGF2b2lkIGVtcHR5IGV4dHJhIHN1YnN0cmluZywgZS5nLiBsaW5lIHRlcm1pbmF0ZWQgd2l0aCBhIHNlbWktY29sb24KKwkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tzdWJzdHJpbmdzQ291bnRdID0gcG9zaXRpb247CisJCQlzdWJzdHJpbmdzRW5kUG9zaXRpb25zW3N1YnN0cmluZ3NDb3VudCsrXSA9IHN0cmluZ1RvU3BsaXQubGVuZ3RoKCk7CisJCX0KKwkJaWYgKHNwbGl0T3BlcmF0b3JzQ291bnQgPT0gc3BsaXRPcGVyYXRvcnMubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXNwbGl0T3BlcmF0b3JzLAorCQkJCTAsCisJCQkJKHNwbGl0T3BlcmF0b3JzID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50ICogMl0pLAorCQkJCTAsCisJCQkJc3BsaXRPcGVyYXRvcnNDb3VudCk7CisJCX0KKwkJc3BsaXRPcGVyYXRvcnNbc3BsaXRPcGVyYXRvcnNDb3VudF0gPSAwOworCisJCS8vIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHN0YWNrIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIFN0cmluZ1RvU1BsaXQKKwkJLy8gKzEgYmVjYXVzZSB0aGUgc3Vic3RyaW5nIG1ldGhvZCBleGNsdWRlcyB0aGUgbGFzdCBjaGFyYWN0ZXIKKwkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzdWJzdHJpbmdzQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0cmluZ3NDb3VudDsgaSsrKSB7CisJCQlpbnQgc3RhcnQgPSBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbaV07CisJCQlpbnQgZW5kID0gc3Vic3RyaW5nc0VuZFBvc2l0aW9uc1tpXTsKKwkJCWlmIChzdHJpbmdUb1NwbGl0LmNoYXJBdChzdGFydCkgPT0gJyAnKSB7CisJCQkJc3RhcnQrKzsKKwkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnNbaV0rKzsKKwkJCX0KKwkJCWlmIChlbmQgIT0gc3RhcnQgJiYgc3RyaW5nVG9TcGxpdC5jaGFyQXQoZW5kIC0gMSkgPT0gJyAnKSB7CisJCQkJZW5kLS07CisJCQl9CisJCQlyZXN1bHRbaV0gPSBzdHJpbmdUb1NwbGl0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKKwkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXSArPSBvZmZzZXRJbkdsb2JhbExpbmU7CisJCX0KKwkJaWYgKHNwbGl0T3BlcmF0b3JzQ291bnQgPiBzdWJzdHJpbmdzQ291bnQpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zLAorCQkJCTAsCisJCQkJKHN1YnN0cmluZ3NTdGFydFBvc2l0aW9ucyA9IG5ldyBpbnRbc3BsaXRPcGVyYXRvcnNDb3VudF0pLAorCQkJCTAsCisJCQkJc3Vic3RyaW5nc0NvdW50KTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJc3Vic3RyaW5nc0VuZFBvc2l0aW9ucywKKwkJCQkwLAorCQkJCShzdWJzdHJpbmdzRW5kUG9zaXRpb25zID0gbmV3IGludFtzcGxpdE9wZXJhdG9yc0NvdW50XSksCisJCQkJMCwKKwkJCQlzdWJzdHJpbmdzQ291bnQpOworCQkJZm9yIChpbnQgaSA9IHN1YnN0cmluZ3NDb3VudDsgaSA8IHNwbGl0T3BlcmF0b3JzQ291bnQ7IGkrKykgeworCQkJCXN1YnN0cmluZ3NTdGFydFBvc2l0aW9uc1tpXSA9IHBvc2l0aW9uOworCQkJCXN1YnN0cmluZ3NFbmRQb3NpdGlvbnNbaV0gPSBwb3NpdGlvbjsKKwkJCX0KKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJc3BsaXRPcGVyYXRvcnMsCisJCQkJMCwKKwkJCQkoc3BsaXRPcGVyYXRvcnMgPSBuZXcgaW50W3NwbGl0T3BlcmF0b3JzQ291bnRdKSwKKwkJCQkwLAorCQkJCXNwbGl0T3BlcmF0b3JzQ291bnQpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMsCisJCQkJMCwKKwkJCQkoc3Vic3RyaW5nc1N0YXJ0UG9zaXRpb25zID0gbmV3IGludFtzdWJzdHJpbmdzQ291bnRdKSwKKwkJCQkwLAorCQkJCXN1YnN0cmluZ3NDb3VudCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXN1YnN0cmluZ3NFbmRQb3NpdGlvbnMsCisJCQkJMCwKKwkJCQkoc3Vic3RyaW5nc0VuZFBvc2l0aW9ucyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50XSksCisJCQkJMCwKKwkJCQlzdWJzdHJpbmdzQ291bnQpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlzcGxpdE9wZXJhdG9ycywKKwkJCQkwLAorCQkJCShzcGxpdE9wZXJhdG9ycyA9IG5ldyBpbnRbc3Vic3RyaW5nc0NvdW50XSksCisJCQkJMCwKKwkJCQlzdWJzdHJpbmdzQ291bnQpOworCQl9CisJCVNwbGl0TGluZSBzcGxpdExpbmUgPQorCQkJbmV3IFNwbGl0TGluZShzcGxpdE9wZXJhdG9ycywgcmVzdWx0LCBzdWJzdHJpbmdzU3RhcnRQb3NpdGlvbnMpOworCQlyZXR1cm4gc3BsaXRMaW5lOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVNYXBwZWRQb3NpdGlvbnMoaW50IHN0YXJ0UG9zaXRpb24pIHsKKwkJaWYgKHBvc2l0aW9uc1RvTWFwID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQljaGFyW10gc291cmNlID0gc2Nhbm5lci5zb3VyY2U7CisJCWludCBzb3VyY2VMZW5ndGggPSBzb3VyY2UubGVuZ3RoOworCQl3aGlsZSAoaW5kZXhUb01hcCA8IHBvc2l0aW9uc1RvTWFwLmxlbmd0aAorCQkJJiYgcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF0gPD0gc3RhcnRQb3NpdGlvbikgeworCQkJaW50IHBvc1RvTWFwID0gcG9zaXRpb25zVG9NYXBbaW5kZXhUb01hcF07CisJCQlpZiAocG9zVG9NYXAgPCAwCisJCQkJfHwgcG9zVG9NYXAgPj0gc291cmNlTGVuZ3RoKSB7IC8vIHByb3RlY3Rpb24gYWdhaW5zdCBvdXQgb2YgYm91bmRzIHBvc2l0aW9uCisJCQkJaWYgKHBvc1RvTWFwID09IHNvdXJjZUxlbmd0aCkgeworCQkJCQltYXBwZWRQb3NpdGlvbnNbaW5kZXhUb01hcF0gPSBmb3JtYXR0ZWRTb3VyY2UubGVuZ3RoKCk7CisJCQkJfQorCQkJCWluZGV4VG9NYXAgPSBwb3NpdGlvbnNUb01hcC5sZW5ndGg7IC8vIG5vIG1vcmUgbWFwcGluZworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNvdXJjZVtwb3NUb01hcF0pKSB7CisJCQkJbWFwcGVkUG9zaXRpb25zW2luZGV4VG9NYXBdID0gc3RhcnRQb3NpdGlvbiArIGdsb2JhbERlbHRhICsgbGluZURlbHRhOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocG9zVG9NYXAgPT0gc291cmNlTGVuZ3RoIC0gMSkgeworCQkJCQltYXBwZWRQb3NpdGlvbnNbaW5kZXhUb01hcF0gPSBzdGFydFBvc2l0aW9uICsgZ2xvYmFsRGVsdGEgKyBsaW5lRGVsdGE7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWFwcGVkUG9zaXRpb25zW2luZGV4VG9NYXBdID0gcG9zVG9NYXAgKyBnbG9iYWxEZWx0YSArIGxpbmVEZWx0YTsKKwkJCQl9CisJCQl9CisJCQlpbmRleFRvTWFwKys7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcHBlZFBvc2l0aW9uc1doaWxlU3BsaXR0aW5nKAorCQlpbnQgc3RhcnRQb3NpdGlvbiwKKwkJaW50IGVuZFBvc2l0aW9uKSB7CisJCWlmIChtYXBwZWRQb3NpdGlvbnMgPT0gbnVsbCB8fCBtYXBwZWRQb3NpdGlvbnMubGVuZ3RoID09IGluZGV4SW5NYXApCisJCQlyZXR1cm47CisKKwkJd2hpbGUgKGluZGV4SW5NYXAgPCBtYXBwZWRQb3NpdGlvbnMubGVuZ3RoCisJCQkmJiBzdGFydFBvc2l0aW9uIDw9IG1hcHBlZFBvc2l0aW9uc1tpbmRleEluTWFwXQorCQkJJiYgbWFwcGVkUG9zaXRpb25zW2luZGV4SW5NYXBdIDwgZW5kUG9zaXRpb24KKwkJCSYmIGluZGV4SW5NYXAgPCBpbmRleFRvTWFwKSB7CisJCQltYXBwZWRQb3NpdGlvbnNbaW5kZXhJbk1hcF0gKz0gc3BsaXREZWx0YTsKKwkJCWluZGV4SW5NYXArKzsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGludCBnZXRMZW5ndGgoU3RyaW5nIHMsIGludCB0YWJEZXB0aCkgeworCQlpbnQgbGVuZ3RoID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJEZXB0aDsgaSsrKSB7CisJCQlsZW5ndGggKz0gb3B0aW9ucy50YWJTaXplOworCQl9CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzLmxlbmd0aCgpOyBpIDwgbWF4OyBpKyspIHsKKwkJCWNoYXIgY3VycmVudENoYXIgPSBzLmNoYXJBdChpKTsKKwkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQljYXNlICdcdCcgOgorCQkJCQlsZW5ndGggKz0gb3B0aW9ucy50YWJTaXplOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJbGVuZ3RoKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisJCisJLyoqIAorCSogU2V0cyB0aGUgaW5pdGlhbCBpbmRlbnRhdGlvbiBsZXZlbAorCSogQHBhcmFtIGluZGVudGF0aW9uTGV2ZWwgbmV3IGluZGVudGF0aW9uIGxldmVsCisJKiAKKwkqIEBkZXByZWNhdGVkCisJKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsSW5kZW50YXRpb25MZXZlbChpbnQgbmV3SW5kZW50YXRpb25MZXZlbCkgeworCQl0aGlzLmluaXRpYWxJbmRlbnRhdGlvbkxldmVsID0KKwkJCWN1cnJlbnRMaW5lSW5kZW50YXRpb25MZXZlbCA9IGluZGVudGF0aW9uTGV2ZWwgPSBuZXdJbmRlbnRhdGlvbkxldmVsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2ltcGwvRm9ybWF0dGVyT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWE2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL1NwbGl0TGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9TcGxpdExpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRkOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9TcGxpdExpbmUuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKKworLyoqIFJlcHJlc2VudHMgYSBzcGxpdCBsaW5lOiBjb250YWlucyBhbiBvcGVyYXRvciBhbmQgYWxsIHN1YnN0cmluZ3MKKyovCitwdWJsaWMgY2xhc3MgU3BsaXRMaW5lIGltcGxlbWVudHMgSVRlcm1pbmFsU3ltYm9sc3sKKwlwdWJsaWMgaW50W10gb3BlcmF0b3JzOyAvLyB0aGUgb3BlcmF0b3Igb24gd2hpY2ggdGhlIHN0cmluZyB3YXMgc3BsaXQuCisJcHVibGljIFN0cmluZ1tdIHN1YnN0cmluZ3M7CisJcHVibGljIGludFtdIHN0YXJ0U3Vic3RyaW5nc0luZGV4ZXM7CisvKioKKyAqIFNwbGl0TGluZSBjb25zdHJ1Y3RvciBjb21tZW50LgorICovCitwdWJsaWMgU3BsaXRMaW5lKGludFtdIG9wZXJhdG9ycywgU3RyaW5nW10gc3Vic3RyaW5ncykgeworCXRoaXMob3BlcmF0b3JzLCBzdWJzdHJpbmdzLCBudWxsKTsKK30KKy8qKgorICogU3BsaXRMaW5lIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBTcGxpdExpbmUoaW50W10gb3BlcmF0b3JzLCBTdHJpbmdbXSBzdWJzdHJpbmdzLCBpbnRbXSBzdGFydEluZGV4ZXMpIHsKKwlzdXBlcigpOworCXRoaXMub3BlcmF0b3JzPW9wZXJhdG9yczsKKwl0aGlzLnN1YnN0cmluZ3M9c3Vic3RyaW5nczsKKwl0aGlzLnN0YXJ0U3Vic3RyaW5nc0luZGV4ZXMgPSBzdGFydEluZGV4ZXM7Cit9CisvKioKKyAqIFByaW50cyBhIG5pY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyCisgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0PW5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmcgb3BlcmF0b3JTdHJpbmcgPSBuZXcgU3RyaW5nKCk7CisJCQorCWZvciAoaW50IGk9MCxtYXg9c3Vic3RyaW5ncy5sZW5ndGg7aTxtYXg7aSsrKXsKKwkJaW50IGN1cnJlbnRPcGVyYXRvciA9IG9wZXJhdG9yc1tpXTsKKwkJU3RyaW5nIGN1cnJlbnRTdHJpbmcgPSBzdWJzdHJpbmdzW2ldOworCQlib29sZWFuIHBsYWNlT3BlcmF0b3JBaGVhZCA9IGN1cnJlbnRPcGVyYXRvciAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1BICYmIGN1cnJlbnRPcGVyYXRvciAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVNFTUlDT0xPTjsKKwkJYm9vbGVhbiBwbGFjZU9wZXJhdG9yQmVoaW5kID0gY3VycmVudE9wZXJhdG9yID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudE9wZXJhdG9yID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lU0VNSUNPTE9OOworCQkKKworCisJc3dpdGNoIChjdXJyZW50T3BlcmF0b3IpeworCQljYXNlIFRva2VuTmFtZWV4dGVuZHM6CisJCQlvcGVyYXRvclN0cmluZz0iZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZWltcGxlbWVudHM6CisJCQlvcGVyYXRvclN0cmluZz0iaW1wbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZXRocm93czoKKwkJCW9wZXJhdG9yU3RyaW5nPSJ0aHJvd3MiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT04gOiAvLyA7CisJCQlvcGVyYXRvclN0cmluZz0iOyI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZUNPTU1BIDogLy8gLAorCQkJb3BlcmF0b3JTdHJpbmc9IiwiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVFUVVBTCA6IC8vID0KKwkJCW9wZXJhdG9yU3RyaW5nPSI9IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lQU5EX0FORCA6IC8vICYmICgxNS4yMikKKwkJCW9wZXJhdG9yU3RyaW5nPSImJiI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZU9SX09SIDogLy8gfHwgKDE1LjIzKQorCQkJb3BlcmF0b3JTdHJpbmc9Inx8IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOiAvLyA/ICgxNS4yNCkKKwkJCW9wZXJhdG9yU3RyaW5nPSI/IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVDT0xPTiA6IC8vIDogKDE1LjI0KQorCQkJb3BlcmF0b3JTdHJpbmc9IjoiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVFUVVBTF9FUVVBTCA6IC8vID09ICgxNS4yMCwgMTUuMjAuMSwgMTUuMjAuMiwgMTUuMjAuMykKKwkJCW9wZXJhdG9yU3RyaW5nPSI9PSI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgVG9rZW5OYW1lTk9UX0VRVUFMIDogLy8gIT0gKDE1LjIwLCAxNS4yMC4xLCAxNS4yMC4yLCAxNS4yMC4zKQorCQkJb3BlcmF0b3JTdHJpbmc9IiE9IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVMRVNTIDogLy8gPCAoMTUuMTkuMSkKKwkJCW9wZXJhdG9yU3RyaW5nPSI8IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDogLy8gPD0gKDE1LjE5LjEpCisJCQlvcGVyYXRvclN0cmluZz0iPD0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZUdSRUFURVIgOiAvLyA+ICgxNS4xOS4xKQorCQkJb3BlcmF0b3JTdHJpbmc9Ij4iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZUdSRUFURVJfRVFVQUwgOiAvLyA+PSAoMTUuMTkuMSkKKwkJCW9wZXJhdG9yU3RyaW5nPSI+PSI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgVG9rZW5OYW1laW5zdGFuY2VvZiA6IC8vIGluc3RhbmNlb2YKKwkJCW9wZXJhdG9yU3RyaW5nPSJpbnN0YW5jZW9mIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lUExVUyA6IC8vICsgKDE1LjE3LCAxNS4xNy4yKQorCQkJb3BlcmF0b3JTdHJpbmc9IisiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZU1JTlVTIDogLy8gLSAoMTUuMTcuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSItIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lTVVMVElQTFkgOiAvLyAqICgxNS4xNi4xKQorCQkJb3BlcmF0b3JTdHJpbmc9IioiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZURJVklERSA6IC8vIC8gKDE1LjE2LjIpCisJCQlvcGVyYXRvclN0cmluZz0iLyI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSIDogLy8gJSAoMTUuMTYuMykKKwkJCW9wZXJhdG9yU3RyaW5nPSIlIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVCA6IC8vIDw8ICgxNS4xOCkKKwkJCW9wZXJhdG9yU3RyaW5nPSI8PCI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgVG9rZW5OYW1lUklHSFRfU0hJRlQgOiAvLyA+PiAoMTUuMTgpCisJCQlvcGVyYXRvclN0cmluZz0iPj4iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDogLy8gPj4+ICgxNS4xOCkKKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj4iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVBTkQgOiAvLyAmICgxNS4yMSwgMTUuMjEuMSwgMTUuMjEuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSImIjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVPUiA6IC8vIHwgKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQorCQkJb3BlcmF0b3JTdHJpbmc9InwiOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZVhPUiA6IC8vIF4gKDE1LjIxLCAxNS4yMS4xLCAxNS4yMS4yKQorCQkJb3BlcmF0b3JTdHJpbmc9Il4iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWV9FUVVBTCA6IC8vICo9ICgxNS4yNS4yKQorCQkJb3BlcmF0b3JTdHJpbmc9Iio9IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVESVZJREVfRVFVQUwgOiAvLyAvPSAoMTUuMjUuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSIvPSI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTCA6IC8vICU9ICgxNS4yNS4yKQorCQkJb3BlcmF0b3JTdHJpbmc9IiU9IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVQTFVTX0VRVUFMIDogLy8gKz0gKDE1LjI1LjIpCisJCQlvcGVyYXRvclN0cmluZz0iKz0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZU1JTlVTX0VRVUFMIDogLy8gLT0gKDE1LjI1LjIpCisJCQlvcGVyYXRvclN0cmluZz0iLT0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgOiAvLyA8PD0gKDE1LjI1LjIpCisJCQlvcGVyYXRvclN0cmluZz0iPDw9IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA6IC8vID4+PSAoMTUuMjUuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDogLy8gPj4+PSAoMTUuMjUuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSI+Pj49IjsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisKKwkJY2FzZSBUb2tlbk5hbWVBTkRfRVFVQUwgOiAvLyAmPSAoMTUuMjUuMikKKwkJCW9wZXJhdG9yU3RyaW5nPSImPSI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWNhc2UgVG9rZW5OYW1lWE9SX0VRVUFMIDogLy8gXj0gKDE1LjI1LjIpCisJCQlvcGVyYXRvclN0cmluZz0iXj0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKworCQljYXNlIFRva2VuTmFtZU9SX0VRVUFMIDogLy8gfD0gKDE1LjI1LjIpCisJCQlvcGVyYXRvclN0cmluZz0ifD0iOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVET1QgOiAvLyAuCisJCQlvcGVyYXRvclN0cmluZz0iLiI7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlvcGVyYXRvclN0cmluZz0iIjsgLy8kTk9OLU5MUy0xJAorCX0KKwkJaWYgKHBsYWNlT3BlcmF0b3JBaGVhZCl7CisJCQlyZXN1bHQuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsKKwkJfQorCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnRTdHJpbmcpOworCQlpZiAocGxhY2VPcGVyYXRvckJlaGluZCl7CisJCQlyZXN1bHQuYXBwZW5kKG9wZXJhdG9yU3RyaW5nKTsKKwkJfQorCQlyZXN1bHQuYXBwZW5kKCdcbicpOworCX0KKwlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2pkdENvbXBpbGVyQWRhcHRlci5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9qZHRDb21waWxlckFkYXB0ZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjMzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9qZHRDb21waWxlckFkYXB0ZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0J1ZmZlckNoYW5nZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0ZDY2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0J1ZmZlckNoYW5nZWRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBBIGJ1ZmZlciBjaGFuZ2VkIGV2ZW50IGRlc2NyaWJlcyBob3cgYSBidWZmZXIgaGFzIGNoYW5nZWQuIFRoZXNlIGV2ZW50cyBhcmUKKyAqIHVzZWQgaW4gPGNvZGU+SUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcjwvY29kZT4gbm90aWZpY2F0aW9ucy4KKyAqIDxwPgorICogRm9yIHRleHQgaW5zZXJ0aW9ucywgPGNvZGU+Z2V0T2Zmc2V0PC9jb2RlPiBpcyB0aGUgb2Zmc2V0CisgKiBvZiB0aGUgZmlyc3QgaW5zZXJ0ZWQgY2hhcmFjdGVyLCA8Y29kZT5nZXRUZXh0PC9jb2RlPiBpcyB0aGUKKyAqIGluc2VydGVkIHRleHQsIGFuZCA8Y29kZT5nZXRMZW5ndGg8L2NvZGU+IGlzIDAuCisgKiA8L3A+CisgKiA8cD4KKyAqIEZvciB0ZXh0IHJlbW92YWxzLCA8Y29kZT5nZXRPZmZzZXQ8L2NvZGU+IGlzIHRoZSBvZmZzZXQKKyAqIG9mIHRoZSBmaXJzdCByZW1vdmVkIGNoYXJhY3RlciwgPGNvZGU+Z2V0VGV4dDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sCisgKiBhbmQgPGNvZGU+Z2V0TGVuZ3RoPC9jb2RlPiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHRoYXQgd2FzIHJlbW92ZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIEZvciByZXBsYWNlbWVudHMgKGluY2x1ZGluZyA8Y29kZT5JQnVmZmVyLnNldENvbnRlbnRzPC9jb2RlPiksIAorICogPGNvZGU+Z2V0T2Zmc2V0PC9jb2RlPiBpcyB0aGUgb2Zmc2V0CisgKiBvZiB0aGUgZmlyc3QgcmVwbGFjZWQgY2hhcmFjdGVyLCA8Y29kZT5nZXRUZXh0PC9jb2RlPiBpcyB0aGUgcmVwbGFjZW1lbnQKKyAqIHRleHQsIGFuZCA8Y29kZT5nZXRMZW5ndGg8L2NvZGU+IGlzIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIHRleHQKKyAqIHRoYXQgd2FzIHJlcGxhY2VkLgorICogPC9wPgorICogPHA+CisgKiBXaGVuIGEgYnVmZmVyIGlzIGNsb3NlZCwgPGNvZGU+Z2V0T2Zmc2V0PC9jb2RlPiBpcyAwLCA8Y29kZT5nZXRMZW5ndGg8L2NvZGU+CisgKiBpcyAwLCBhbmQgPGNvZGU+Z2V0VGV4dDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBKYXZhIG1vZGVsLgorICogPC9wPgorICoKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgY2xhc3MgQnVmZmVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisJLyoqCisJICogVGhlIGxlbmd0aCBvZiB0ZXh0IHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwlwcml2YXRlIGludCBsZW5ndGg7CisKKwkvKioKKwkgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgbW9kaWZpY2F0aW9uIHRvb2sgcGxhY2UuCisJICovCisJcHJpdmF0ZSBpbnQgb2Zmc2V0OworCisJLyoqCisJICogVGhlIHRleHQgdGhhdCB3YXMgbW9kaWZpZWQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGJ1ZmZlciBjaGFuZ2VkIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgZ2l2ZW4gYnVmZmVyIGhhcyBjaGFuZ2VkLgorICovCitwdWJsaWMgQnVmZmVyQ2hhbmdlZEV2ZW50KElCdWZmZXIgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgeworCXN1cGVyKGJ1ZmZlcik7CisJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJdGhpcy50ZXh0ID0gdGV4dDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgYnVmZmVyIHdoaWNoIGhhcyBjaGFuZ2VkLgorICoKKyAqIEByZXR1cm4gdGhlIGJ1ZmZlciBhZmZlY3RlZCBieSB0aGUgY2hhbmdlCisgKi8KK3B1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKKwlyZXR1cm4gKElCdWZmZXIpIHNvdXJjZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgcmVtb3ZlZCBvciByZXBsYWNlZCBpbiB0aGUgYnVmZmVyLCBvcgorICogMCBpZiB0ZXh0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIHRleHQgZnJhZ21lbnQgbW9kaWZpZWQgYnkgdGhlIAorICogICBidWZmZXIgY2hhbmdlICg8Y29kZT4gMCA8L2NvZGU+IGluIGNhc2Ugb2YgaW5zZXJ0aW9uKS4KKyAqLworcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJcmV0dXJuIHRoaXMubGVuZ3RoOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluc2VydGVkLCByZW1vdmVkLCBvciByZXBsYWNlZAorICogaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2Zmc2V0IG9mIHRoZSB0ZXh0dWFsIG1hbmlwdWxhdGlvbiBpbiB0aGUgYnVmZmVyCisgKi8KK3B1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworCXJldHVybiB0aGlzLm9mZnNldDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdGV4dCB0aGF0IHdhcyBpbnNlcnRlZCwgdGhlIHJlcGxhY2VtZW50IHRleHQsCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0ZXh0IGhhcyBiZWVuIHJlbW92ZWQuCisgKgorICogQHJldHVybiB0aGUgdGV4dCBjb3JyZXNwb25kaW5nIHRvIHRoZSBidWZmZXIgY2hhbmdlICg8Y29kZT4gbnVsbCA8L2NvZGU+CisgKiAgIGluIGNhc2Ugb2YgZGVsZXRpb24pLgorICovCitwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJcmV0dXJuIHRoaXMudGV4dDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDA1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplci4KKyAqIENsYXNzcGF0aCB2YXJpYWJsZSBjb250YWluZXJzIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgKiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiIGV4dGVuc2lvbiBwb2ludC4KKyAqIDxwPgorICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyB0byBpbXBsZW1lbnQgYSBzcGVjaWZpYyBjbGFzc3BhdGgKKyAqIGNvbnRhaW5lciBpbml0aWFsaXplci4gVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50CisgKiBjb25zdHJ1Y3RvciBhbmQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5yZXNvbHZlPC9jb2RlPi4KKyAqIDxwPgorICogTXVsdGlwbGUgY2xhc3NwYXRoIGNvbnRhaW5lcnMgY2FuIGJlIHJlZ2lzdGVyZWQsIGVhY2ggb2YgdGhlbSBkZWNsYXJlcworICogdGhlIGNvbnRhaW5lciBJRCB0aGV5IGNhbiBoYW5kbGUsIHNvIGFzIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGNvbnRhaW5lcnMgdGhleQorICogY2FuIHJlc29sdmUsIGkuZS4gYSBjb250YWluZXIgaW5pdGlhbGl6ZXIgaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGFjdGl2YXRlZCB0byAKKyAqIHJlc29sdmUgY29udGFpbmVycyB3aGljaCBtYXRjaCB0aGUgSUQgdGhleSByZWdpc3RlcmVkIG9udG8uCisgKiA8cD4KKyAqIEluIGNhc2UgbXVsdGlwbGUgY29udGFpbmVyIGluaXRpYWxpemVycyBjb2xsaWRlIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBJRCwgdGhlIGZpcnN0CisgKiByZWdpc3RlcmVkIG9uZSB3aWxsIGJlIGludm9rZWQuCisgKiAKKyAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CisgKiBAc2VlIElDbGFzc3BhdGhDb250YWluZXIKKyAqIEBzaW5jZSAyLjAKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgeworCQorICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBjbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVyLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGNsYXNzcGF0aCBjb250YWluZXIgdG8gYSA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiBmb3IgYSBnaXZlbiBwcm9qZWN0LAorICAgICAqIG9yIHNpbGVudGx5IGZhaWxzIGlmIHVuYWJsZSB0byBkbyBzby4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGNvbnRhaW5lciBpcyBpZGVudGlmaWVkIGJ5IGEgY29udGFpbmVyIHBhdGgsIHdoaWNoIG11c3QgYmUgZm9ybWVkIG9mIHR3byBzZWdtZW50cy4KKyAgICAgKiBUaGUgZmlyc3Qgc2VnbWVudCBpcyB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgKHdoaWNoIHRoaXMgaW5pdGlhbGl6ZXIgZGlkIHJlZ2lzdGVyIG9udG8pLCBhbmQKKyAgICAgKiB0aGUgc2Vjb25kIHNlZ21lbnQgY2FuIGJlIHVzZWQgYXMgYW4gYWRkaXRpb25hbCBoaW50IHdoZW4gcGVyZm9ybWluZyB0aGUgcmVzb2x1dGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaW5pdGlhbGl6ZXIgaXMgaW52b2tlZCBpZiBhIGNvbnRhaW5lciBwYXRoIG5lZWRzIHRvIGJlIHJlc29sdmVkIGZvciBhIGdpdmVuIHByb2plY3QsIGFuZCBubworICAgICAqIHZhbHVlIGZvciBpdCB3YXMgcmVjb3JkZWQgc28gZmFyLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGluaXRpYWxpemVyIGNhbiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgICAgICogY29udGFpbmVyIHVzaW5nIDxjb2RlPkphdmFDb3JlI3NldENsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4uCisgICAgICogPHA+CisgICAgICogQHBhcmFtIGNvbnRhaW5lclBhdGggYSB0d28tc2VnbWVudCBwYXRoIChJRC9oaW50KSBpZGVudGlmeWluZyB0aGUgY29udGFpbmVyIHRoYXQgbmVlZHMgCisgICAgICogCXRvIGJlIHJlc29sdmVkCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIEphdmEgcHJvamVjdCBpbiB3aGljaCBjb250ZXh0IHRoZSBjb250YWluZXIgaXMgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogICAgVGhpcyBhbGxvd3MgZ2VuZXJpYyBjb250YWluZXJzIHRvIGJlIGJvdW5kIHdpdGggcHJvamVjdCBzcGVjaWZpYyB2YWx1ZXMuCisgICAgICogCisgICAgICogQHNlZSBKYXZhQ29yZSNnZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCkKKyAgICAgKiBAc2VlIEphdmFDb3JlI3NldENsYXNzcGF0aENvbnRhaW5lcihJUGF0aCwgSUphdmFQcm9qZWN0W10sIElDbGFzc3BhdGhDb250YWluZXJbXSwgSVByb2dyZXNzTW9uaXRvcikKKyAgICAgKiBAc2VlIElDbGFzc3BhdGhDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjc1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXJzLgorICogQ2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIGV4dGVuc2lvbiBwb2ludC4KKyAqIDxwPgorICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyB0byBpbXBsZW1lbnQgYSBzcGVjaWZpYyBjbGFzc3BhdGgKKyAqIHZhcmlhYmxlIGluaXRpYWxpemVyLiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQKKyAqIGNvbnN0cnVjdG9yIGFuZCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmluaXRpYWxpemU8L2NvZGU+LgorICogCisgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIHZhbHVlIHRvIHRoZSB3b3Jrc3BhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsCisgICAgICogb3IgZmFpbHMgc2lsZW50bHkgaWYgdGhpcyBjYW5ub3QgYmUgZG9uZS4gCisgICAgICogPHA+CisgICAgICogQSB2YXJpYWJsZSBpbml0aWFsaXplciBpcyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCB3aGVuZXZlciBhIHZhcmlhYmxlIHZhbHVlCisgICAgICogaXMgbmVlZGVkIGFuZCBub25lIGhhcyBiZWVuIHJlY29yZGVkIHNvIGZhci4gVGhlIGltcGxlbWVudGF0aW9uIG9mCisgICAgICogdGhlIGluaXRpYWxpemVyIGNhbiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdXNpbmcgCisgICAgICogPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoVmFyaWFibGU8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlIGNsYXNzcGF0aCB2YXJpYWJsZQorICAgICAqICAgIHRoYXQgcmVxdWlyZXMgYSBiaW5kaW5nCisgICAgICogCisgICAgICogQHNlZSBKYXZhQ29yZSNnZXRDbGFzc3BhdGhWYXJpYWJsZShTdHJpbmcpCisgICAgICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZShTdHJpbmcsIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQorICAgICAqIEBzZWUgSmF2YUNvcmUjc2V0Q2xhc3NwYXRoVmFyaWFibGVzKFN0cmluZ1tdLCBJUGF0aFtdLCBJUHJvZ3Jlc3NNb25pdG9yKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHZhcmlhYmxlKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25SZXF1ZXN0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDkzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworCisvKioKKyAqIEFkYXB0ZXIgb2YgdGhlIHJlcXVlc3RvciBpbnRlcmZhY2UgPGNvZGU+SUNvbXBsZXRpb25SZXF1ZXN0b3I8L2NvZGU+LgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbmNpYXRlZCBhbmQgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKKyAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXF1ZXN0b3JBZGFwdGVyIGltcGxlbWVudHMgSUNvbXBsZXRpb25SZXF1ZXN0b3IgeworCisJLyoKKwkgKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdEFub255bW91c1R5cGUoY2hhcltdLCBjaGFyW10sIGNoYXJbXVtdLCBjaGFyW11bXSwgY2hhcltdW10sIGNoYXJbXSwgaW50LCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKAorCQljaGFyW10gc3VwZXJUeXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSBzdXBlclR5cGVOYW1lLAorCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwkJaW50IG1vZGlmaWVycywKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0Q2xhc3MoY2hhcltdLCBjaGFyW10sIGNoYXJbXSwgaW50LCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcygKKwkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQljaGFyW10gY2xhc3NOYW1lLAorCQljaGFyW10gY29tcGxldGlvbk5hbWUsCisJCWludCBtb2RpZmllcnMsCisJCWludCBjb21wbGV0aW9uU3RhcnQsCisJCWludCBjb21wbGV0aW9uRW5kLAorCQlpbnQgcmVsZXZhbmNlKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdEVycm9yKElQcm9ibGVtKQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEVycm9yKElQcm9ibGVtIGVycm9yKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdEZpZWxkKGNoYXJbXSwgY2hhcltdLCBjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBjaGFyW10sIGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0RmllbGQoCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwkJY2hhcltdIG5hbWUsCisJCWNoYXJbXSB0eXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSB0eXBlTmFtZSwKKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCQlpbnQgbW9kaWZpZXJzLAorCQlpbnQgY29tcGxldGlvblN0YXJ0LAorCQlpbnQgY29tcGxldGlvbkVuZCwKKwkJaW50IHJlbGV2YW5jZSkgeworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHRJbnRlcmZhY2UoY2hhcltdLCBjaGFyW10sIGNoYXJbXSwgaW50LCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJY2hhcltdIGludGVyZmFjZU5hbWUsCisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwkJaW50IG1vZGlmaWVycywKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0S2V5d29yZChjaGFyW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEtleXdvcmQoCisJCWNoYXJbXSBrZXl3b3JkTmFtZSwKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0TGFiZWwoY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRMYWJlbCgKKwkJY2hhcltdIGxhYmVsTmFtZSwKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0TG9jYWxWYXJpYWJsZShjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoCisJCWNoYXJbXSBuYW1lLAorCQljaGFyW10gdHlwZVBhY2thZ2VOYW1lLAorCQljaGFyW10gdHlwZU5hbWUsCisJCWludCBtb2RpZmllcnMsCisJCWludCBjb21wbGV0aW9uU3RhcnQsCisJCWludCBjb21wbGV0aW9uRW5kLAorCQlpbnQgcmVsZXZhbmNlKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdE1ldGhvZChjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBjaGFyW11bXSwgY2hhcltdW10sIGNoYXJbXVtdLCBjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZCgKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCQljaGFyW10gc2VsZWN0b3IsCisJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywKKwkJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAorCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwKKwkJY2hhcltdIHJldHVyblR5cGVOYW1lLAorCQljaGFyW10gY29tcGxldGlvbk5hbWUsCisJCWludCBtb2RpZmllcnMsCisJCWludCBjb21wbGV0aW9uU3RhcnQsCisJCWludCBjb21wbGV0aW9uRW5kLAorCQlpbnQgcmVsZXZhbmNlKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yI2FjY2VwdE1ldGhvZERlY2xhcmF0aW9uKGNoYXJbXSwgY2hhcltdLCBjaGFyW10sIGNoYXJbXVtdLCBjaGFyW11bXSwgY2hhcltdW10sIGNoYXJbXSwgY2hhcltdLCBjaGFyW10sIGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwkJY2hhcltdIHNlbGVjdG9yLAorCQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCWNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCQlpbnQgbW9kaWZpZXJzLAorCQlpbnQgY29tcGxldGlvblN0YXJ0LAorCQlpbnQgY29tcGxldGlvbkVuZCwKKwkJaW50IHJlbGV2YW5jZSkgeworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHRNb2RpZmllcihjaGFyW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdE1vZGlmaWVyKAorCQljaGFyW10gbW9kaWZpZXJOYW1lLAorCQlpbnQgY29tcGxldGlvblN0YXJ0LAorCQlpbnQgY29tcGxldGlvbkVuZCwKKwkJaW50IHJlbGV2YW5jZSkgeworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHRQYWNrYWdlKGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKAorCQljaGFyW10gcGFja2FnZU5hbWUsCisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IjYWNjZXB0VHlwZShjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKAorCQljaGFyW10gcGFja2FnZU5hbWUsCisJCWNoYXJbXSB0eXBlTmFtZSwKKwkJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCQlpbnQgY29tcGxldGlvblN0YXJ0LAorCQlpbnQgY29tcGxldGlvbkVuZCwKKwkJaW50IHJlbGV2YW5jZSkgeworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHRWYXJpYWJsZU5hbWUoY2hhcltdLCBjaGFyW10sIGNoYXJbXSwgY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoCisJCWNoYXJbXSB0eXBlUGFja2FnZU5hbWUsCisJCWNoYXJbXSB0eXBlTmFtZSwKKwkJY2hhcltdIG5hbWUsCisJCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwkJaW50IGNvbXBsZXRpb25TdGFydCwKKwkJaW50IGNvbXBsZXRpb25FbmQsCisJCWludCByZWxldmFuY2UpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db3JyZWN0aW9uRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db3JyZWN0aW9uRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0ODQ5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvcnJlY3Rpb25FbmdpbmUuamF2YQpAQCAtMCwwICsxLDQxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHNvdXJjZSBjb3JyZWN0aW9ucy4KKyAqIAorICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogCisgKiBAc2luY2UgMi4wIAorICovCitwdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkVuZ2luZSBpbXBsZW1lbnRzIFByb2JsZW1SZWFzb25zIHsKKwkKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25TdGFydDsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25FbmQ7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnQuCisJICovCisJcHJvdGVjdGVkIGludCBwcmVmaXhMZW5ndGg7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnQuCisJICovCisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdW5pdDsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgSUNvcnJlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yOworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY2xpZW50LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENMQVNTRVMgPSAweDAwMDAwMDAxOworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY2xpZW50LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOVEVSRkFDRVMgPSAweDAwMDAwMDAyOworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY2xpZW50LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElNUE9SVCA9IDB4MDAwMDAwMDQ7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnQuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EID0gMHgwMDAwMDAwODsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSUVMRCA9IDB4MDAwMDAwMTA7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnQuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAweDAwMDAwMDIwOworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY2xpZW50LgorCSAqLworCXByb3RlY3RlZCBpbnQgZmlsdGVyOworCQkKKwkvKioKKwkgKiBUaGUgQ29ycmVjdGlvbkVuZ2luZSBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHByb2JsZW0gY29ycmVjdGlvbnMuCisJICoKKwkgKiAgQHBhcmFtIHNldHRpbmcgamF2YS51dGlsLk1hcAorCSAqCQlzZXQgb2Ygb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY29kZSBjb3JyZWN0aW9uIGVuZ2luZS4KKwkgKiAJCUNVUlJFTlRMWSBUSEVSRSBJUyBOTyBDT1JSRUNUSU9OIFNQRUNJRklDIFNFVFRJTkdTLgorCSAqLworCXB1YmxpYyBDb3JyZWN0aW9uRW5naW5lKE1hcCBzZXR0aW5nKSB7CisJCQorCX0KKwkKKwkvKioKKwkgKiBQZXJmb3JtcyBjb2RlIGNvcnJlY3Rpb24gZm9yIHRoZSBnaXZlbiBtYXJrZXIsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvcnJlY3Rpb24gcmVxdWVzdG9yLgorCSAqIAorCSAqIENvcnJlY3Rpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gbWFya2VyCisJICogCQl0aGUgbWFya2VyIHdoaWNoIGRlc2NyaWJlIHRoZSBwcm9ibGVtIHRvIGNvcnJlY3QuCisJICogCisJICogQHBhcmFtIHRhcmdldFVuaXQKKwkgKiAJCXJlcGxhY2UgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZ2l2ZW4gYnkgdGhlIG1hcmtlci4gSWdub3JlZCBpZiBudWxsLgorCSAqIAorCSAqIEBwYXJhbSBwb3NpdGlvbk9mZnNldAorCSAqIAkJdGhlIG9mZnNldCBvZiBwb3NpdGlvbiBnaXZlbiBieSB0aGUgbWFya2VyLgorCSAqCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cmVxdWVzdG9yPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGN1cnJlbnRseSB0aGlzIGV4Y2VwdGlvbiBpcyBuZXZlciB0aHJvd24sIGJ1dCB0aGUgb3Bwb3J0dW5pdHkgdG8gdGhyb3duIGFuIGV4Y2VwdGlvbgorCSAqIAl3aGVuIHRoZSBjb3JyZWN0aW9uIGZhaWxlZCBpcyBrZXB0IGZvciBsYXRlci4gCisJICogQHNpbmNlIDIuMCAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wdXRlQ29ycmVjdGlvbnMoSU1hcmtlciBtYXJrZXIsIElDb21waWxhdGlvblVuaXQgdGFyZ2V0VW5pdCwgaW50IHBvc2l0aW9uT2Zmc2V0LCBJQ29ycmVjdGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSB0YXJnZXRVbml0ID09IG51bGwgPyBKYXZhQ29yZS5jcmVhdGUobWFya2VyLmdldFJlc291cmNlKCkpIDogdGFyZ2V0VW5pdDsKKwkJCisJCWlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpKQorCQkJcmV0dXJuOworCQkJCisJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OworCQkKKwkJaW50IGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCAtMSk7CisJCVN0cmluZ1tdIGFyZ3MgPSBVdGlsLmdldFByb2JsZW1Bcmd1bWVudHNGcm9tTWFya2VyKG1hcmtlci5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5BUkdVTUVOVFMsICIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaW50IHN0YXJ0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKTsKKwkJaW50IGVuZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgLTEpOworCQkKKwkJY29tcHV0ZUNvcnJlY3Rpb25zKHVuaXQsIGlkLCBzdGFydCArIHBvc2l0aW9uT2Zmc2V0LCBlbmQgKyBwb3NpdGlvbk9mZnNldCwgYXJncywgcmVxdWVzdG9yKTsKKwl9CisJCisJLyoqCisJICogUGVyZm9ybXMgY29kZSBjb3JyZWN0aW9uIGZvciB0aGUgZ2l2ZW4gSVByb2JsZW0sCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvcnJlY3Rpb24gcmVxdWVzdG9yLgorCSAqIAorCSAqIENvcnJlY3Rpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvYmxlbQorCSAqIAkJdGhlIHByb2JsZW0gd2hpY2ggZGVzY3JpYmUgdGhlIHByb2JsZW0gdG8gY29ycmVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0VW5pdAorCSAqIAkJZGVub3RlIHRoZSBjb21waWxhdGlvbiB1bml0IGluIHdoaWNoIGNvcnJlY3Rpb24gb2NjdXJzLiBDYW5ub3QgYmUgbnVsbC4KKwkgKiAKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT50YXJnZXRVbml0PC9jb2RlPiBvciA8Y29kZT5yZXF1ZXN0b3I8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gY3VycmVudGx5IHRoaXMgZXhjZXB0aW9uIGlzIG5ldmVyIHRocm93biwgYnV0IHRoZSBvcHBvcnR1bml0eSB0byB0aHJvd24gYW4gZXhjZXB0aW9uCisJICogCXdoZW4gdGhlIGNvcnJlY3Rpb24gZmFpbGVkIGlzIGtlcHQgZm9yIGxhdGVyLgorCSAqIEBzaW5jZSAyLjAgCisJICovCisJcHVibGljIHZvaWQgY29tcHV0ZUNvcnJlY3Rpb25zKElQcm9ibGVtIHByb2JsZW0sIElDb21waWxhdGlvblVuaXQgdGFyZ2V0VW5pdCwgSUNvcnJlY3Rpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29ycmVjdGlvbi5udWxsVW5pdCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMuY29tcHV0ZUNvcnJlY3Rpb25zKAorCQkJdGFyZ2V0VW5pdCwgcHJvYmxlbS5nZXRJRCgpLCAKKwkJCXByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSwgCisJCQlwcm9ibGVtLmdldFNvdXJjZUVuZCgpLCAKKwkJCXByb2JsZW0uZ2V0QXJndW1lbnRzKCksCisJCQlyZXF1ZXN0b3IpOworCX0KKworCS8qKgorCSAqIEFzayB0aGUgZW5naW5lIHRvIGNvbXB1dGUgYSBjb3JyZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHByb2JsZW0KKwkgKiBvZiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4KKwkgKiBDb3JyZWN0aW9uIHJlc3VsdHMgYXJlIGFuc3dlcmVkIHRocm91Z2ggYSByZXF1ZXN0b3IuCisJICoKKwkgKiAgQHBhcmFtIHVuaXQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSUNvbXBpbGF0aW9uVW5pdAorCSAqICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisJICogIAorCSAqIAlAcGFyYW0gaWQgaW50CisJICogCQl0aGUgaWQgb2YgdGhlIHByb2JsZW0uCisJICogCisJICogCUBwYXJhbSBzdGFydCBpbnQKKwkgKiAJCWEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgZXJyb3IgYmVnaW4uCisJICoKKwkgKiAgQHBhcmFtIGVuZCBpbnQKKwkgKiAgICAgIGEgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgZXJyb3IgZmluaXNoLiAKKwkgKiAKKwkgKiAJQHBhcmFtIGFyZ3VtZW50cyBTdHJpbmdbXQorCSAqIAkJYXJndW1lbnRzIG9mIHRoZSBwcm9ibGVtLgorCSAqIAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnJlcXVlc3RvcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBjdXJyZW50bHkgdGhpcyBleGNlcHRpb24gaXMgbmV2ZXIgdGhyb3duLCBidXQgdGhlIG9wcG9ydHVuaXR5IHRvIHRocm93biBhbiBleGNlcHRpb24KKwkgKiAJd2hlbiB0aGUgY29ycmVjdGlvbiBmYWlsZWQgaXMga2VwdCBmb3IgbGF0ZXIuCisJICogQHNpbmNlIDIuMAorCSAqLworCXByaXZhdGUgdm9pZCBjb21wdXRlQ29ycmVjdGlvbnMoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBpbnQgaWQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nW10gYXJndW1lbnRzLCBJQ29ycmVjdGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb257CisKKwkJaWYoaWQgPT0gLTEgfHwgYXJndW1lbnRzID09IG51bGwgfHwgc3RhcnQgPT0gLTEgfHwgZW5kID09IC0xKQorCQkJcmV0dXJuOwkJCisJCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImNvcnJlY3Rpb24ubnVsbFJlcXVlc3RvciIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKKwkJdGhpcy5jb3JyZWN0aW9uU3RhcnQgPSBzdGFydDsKKwkJdGhpcy5jb3JyZWN0aW9uRW5kID0gZW5kOworCQl0aGlzLnVuaXQgPSB1bml0OworCQkKKwkJU3RyaW5nIGFyZ3VtZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXN3aXRjaCAoaWQpIHsKKwkJCQkvLyBUeXBlIGNvcnJlY3Rpb24KKwkJCQljYXNlIElQcm9ibGVtLkZpZWxkVHlwZU5vdEZvdW5kIDoKKwkJCQljYXNlIElQcm9ibGVtLkFyZ3VtZW50VHlwZU5vdEZvdW5kIDoKKwkJCQkJZmlsdGVyID0gQ0xBU1NFUyB8IElOVEVSRkFDRVM7CisJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzJdOworCQkJCQlicmVhazsKKwkJCQljYXNlIElQcm9ibGVtLlN1cGVyY2xhc3NOb3RGb3VuZCA6CisJCQkJCWZpbHRlciA9IENMQVNTRVM7CisJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzBdOworCQkJCQlicmVhazsKKwkJCQljYXNlIElQcm9ibGVtLkludGVyZmFjZU5vdEZvdW5kIDoKKwkJCQkJZmlsdGVyID0gSU5URVJGQUNFUzsKKwkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMF07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVByb2JsZW0uRXhjZXB0aW9uVHlwZU5vdEZvdW5kIDoKKwkJCQkJZmlsdGVyID0gQ0xBU1NFUzsKKwkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMV07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVByb2JsZW0uUmV0dXJuVHlwZU5vdEZvdW5kIDoKKwkJCQkJZmlsdGVyID0gQ0xBU1NFUyB8IElOVEVSRkFDRVM7CisJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzFdOworCQkJCQlicmVhazsKKwkJCQljYXNlIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kIDoKKwkJCQkJZmlsdGVyID0gSU1QT1JUOworCQkJCQlhcmd1bWVudCA9IGFyZ3VtZW50c1swXTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUHJvYmxlbS5VbmRlZmluZWRUeXBlIDoKKwkJCQkJZmlsdGVyID0gQ0xBU1NFUyB8IElOVEVSRkFDRVM7CisJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzBdOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJLy8gTWV0aG9kIGNvcnJlY3Rpb24KKwkJCQljYXNlIElQcm9ibGVtLlVuZGVmaW5lZE1ldGhvZCA6CisJCQkJCWZpbHRlciA9IE1FVEhPRDsKKwkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMV07CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkvLyBGaWVsZCBhbmQgbG9jYWwgdmFyaWFibGUgY29ycmVjdGlvbgorCQkJCWNhc2UgSVByb2JsZW0uVW5kZWZpbmVkRmllbGQgOgorCQkJCQlmaWx0ZXIgPSBGSUVMRDsKKwkJCQkJYXJndW1lbnQgPSBhcmd1bWVudHNbMF07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVByb2JsZW0uVW5kZWZpbmVkTmFtZSA6CisJCQkJCWZpbHRlciA9IEZJRUxEIHwgTE9DQUw7CisJCQkJCWFyZ3VtZW50ID0gYXJndW1lbnRzWzBdOworCQkJCQlicmVhazsKKwkJCX0KKwkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZihhcmd1bWVudCAhPSBudWxsKSB7CisJCQljb3JyZWN0KGFyZ3VtZW50LnRvQ2hhckFycmF5KCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvcnJlY3QoY2hhcltdIGFyZ3VtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBzb3VyY2UgPSB1bml0LmdldFNvdXJjZSgpOworCQkJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTsKKwkJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKKwkJCQorCQkJc2Nhbm5lci5yZXNldFRvKGNvcnJlY3Rpb25TdGFydCwgY29ycmVjdGlvbkVuZCk7CisJCQlpbnQgdG9rZW4gPSAwOworCQkJY2hhcltdIGFyZ3VtZW50U291cmNlID0gbmV3IGNoYXJbMF07CisJCQkKKwkJCS8vIHNlYXJjaCBsYXN0IHNlZ21lbnQgcG9zaXRpb24KKwkJCXdoaWxlKHRydWUpIHsKKwkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQkJaWYgKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSByZXR1cm47CisJCQkJCisJCQkJY2hhcltdIHRva2VuU291cmNlID0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKKwkJCQkKKwkJCQlhcmd1bWVudFNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGFyZ3VtZW50U291cmNlLCB0b2tlblNvdXJjZSk7CisJCQkJaWYoIUNoYXJPcGVyYXRpb24uc3RhcnRzV2l0aChhcmd1bWVudCwgYXJndW1lbnRTb3VyY2UpKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMoYXJndW1lbnQsIGFyZ3VtZW50U291cmNlKSkgeworCQkJCQljb3JyZWN0aW9uU3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJCWNvcnJlY3Rpb25FbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkJcHJlZml4TGVuZ3RoID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIGFyZ3VtZW50KSArIDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCisJCQkvLyBzZWFyY2ggY29tcGxldGlvbiBwb3NpdGlvbgorCQkJaW50IGNvbXBsZXRpb25Qb3NpdGlvbiA9IGNvcnJlY3Rpb25TdGFydDsKKwkJCXNjYW5uZXIucmVzZXRUbyhjb21wbGV0aW9uUG9zaXRpb24sIGNvcnJlY3Rpb25FbmQpOworCQkJaW50IHBvc2l0aW9uID0gY29tcGxldGlvblBvc2l0aW9uOworCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCWlmKHNjYW5uZXIuZ2V0TmV4dENoYXJBc0phdmFJZGVudGlmaWVyUGFydCgpKSB7CisJCQkJCWNvbXBsZXRpb25Qb3NpdGlvbiA9IHBvc2l0aW9uOworCQkJCQlwb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCX0gZWxzZSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCQorCQkJdW5pdC5jb2RlQ29tcGxldGUoCisJCQkJY29tcGxldGlvblBvc2l0aW9uLAorCQkJCWNvbXBsZXRpb25SZXF1ZXN0b3IKKwkJCSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm47CisJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbXBsZXRpb25SZXF1ZXN0b3IgY29tcGxldGlvblJlcXVlc3RvciA9IG5ldyBJQ29tcGxldGlvblJlcXVlc3RvcigpIHsKKwkJcHVibGljIHZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZShjaGFyW10gc3VwZXJUeXBlUGFja2FnZU5hbWUsY2hhcltdIHN1cGVyVHlwZU5hbWUsY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7fQorCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIGNsYXNzTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQlpZigoZmlsdGVyICYgKENMQVNTRVMgfCBJTlRFUkZBQ0VTKSkgIT0gMCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcygKKwkJCQkJcGFja2FnZU5hbWUsCisJCQkJCWNsYXNzTmFtZSwKKwkJCQkJQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wbGV0aW9uTmFtZSwgcHJlZml4TGVuZ3RoLCBjb21wbGV0aW9uTmFtZS5sZW5ndGgpLAorCQkJCQltb2RpZmllcnMsCisJCQkJCWNvcnJlY3Rpb25TdGFydCwKKwkJCQkJY29ycmVjdGlvbkVuZCk7CisJCQl9IGVsc2UgaWYoKGZpbHRlciAmIElNUE9SVCkgIT0gMCkgeworCQkJCWNoYXJbXSBmdWxsTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsICcuJyk7CisJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAorCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJY2xhc3NOYW1lLAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGZ1bGxOYW1lLCBwcmVmaXhMZW5ndGgsIGZ1bGxOYW1lLmxlbmd0aCksCisJCQkJCW1vZGlmaWVycywKKwkJCQkJY29ycmVjdGlvblN0YXJ0LAorCQkJCQljb3JyZWN0aW9uRW5kKTsKKwkJCX0KKwkJfQorCQlwdWJsaWMgdm9pZCBhY2NlcHRFcnJvcihJUHJvYmxlbSBlcnJvcikge30KKwkJcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsY2hhcltdIG5hbWUsY2hhcltdIHR5cGVQYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJaWYoKGZpbHRlciAmIEZJRUxEKSAhPSAwKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkKAorCQkJCQlkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJCQkJCWRlY2xhcmluZ1R5cGVOYW1lLAorCQkJCQluYW1lLAorCQkJCQl0eXBlUGFja2FnZU5hbWUsCisJCQkJCXR5cGVOYW1lLAorCQkJCQluYW1lLAorCQkJCQltb2RpZmllcnMsCisJCQkJCWNvcnJlY3Rpb25TdGFydCwKKwkJCQkJY29ycmVjdGlvbkVuZCk7CisJCQl9CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gaW50ZXJmYWNlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQlpZigoZmlsdGVyICYgKENMQVNTRVMgfCBJTlRFUkZBQ0VTKSkgIT0gMCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCisJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQlpbnRlcmZhY2VOYW1lLAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBsZXRpb25OYW1lLCBwcmVmaXhMZW5ndGgsIGNvbXBsZXRpb25OYW1lLmxlbmd0aCksCisJCQkJCW1vZGlmaWVycywKKwkJCQkJY29ycmVjdGlvblN0YXJ0LAorCQkJCQljb3JyZWN0aW9uRW5kKTsKKwkJCX0gZWxzZSBpZigoZmlsdGVyICYgSU1QT1JUKSAhPSAwKSB7CisJCQkJY2hhcltdIGZ1bGxOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsICcuJyk7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgKKwkJCQkJcGFja2FnZU5hbWUsCisJCQkJCWludGVyZmFjZU5hbWUsCisJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkoZnVsbE5hbWUsIHByZWZpeExlbmd0aCwgZnVsbE5hbWUubGVuZ3RoKSwKKwkJCQkJbW9kaWZpZXJzLAorCQkJCQljb3JyZWN0aW9uU3RhcnQsCisJCQkJCWNvcnJlY3Rpb25FbmQpOworCQkJfQorCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdEtleXdvcmQoY2hhcltdIGtleXdvcmROYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHt9CisJCXB1YmxpYyB2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkge30KKwkJcHVibGljIHZvaWQgYWNjZXB0TG9jYWxWYXJpYWJsZShjaGFyW10gbmFtZSxjaGFyW10gdHlwZVBhY2thZ2VOYW1lLGNoYXJbXSB0eXBlTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCWlmKChmaWx0ZXIgJiBMT0NBTCkgIT0gMCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKAorCQkJCQluYW1lLAorCQkJCQl0eXBlUGFja2FnZU5hbWUsCisJCQkJCXR5cGVOYW1lLAorCQkJCQltb2RpZmllcnMsCisJCQkJCWNvcnJlY3Rpb25TdGFydCwKKwkJCQkJY29ycmVjdGlvbkVuZCk7CisJCQl9CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLGNoYXJbXSBzZWxlY3RvcixjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsY2hhcltdIHJldHVyblR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCWlmKChmaWx0ZXIgJiBNRVRIT0QpICE9IDApIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAorCQkJCQlkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJCQkJCWRlY2xhcmluZ1R5cGVOYW1lLAorCQkJCQlzZWxlY3RvciwKKwkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMsCisJCQkJCXBhcmFtZXRlck5hbWVzLAorCQkJCQlyZXR1cm5UeXBlUGFja2FnZU5hbWUsCisJCQkJCXJldHVyblR5cGVOYW1lLAorCQkJCQlzZWxlY3RvciwKKwkJCQkJbW9kaWZpZXJzLAorCQkJCQljb3JyZWN0aW9uU3RhcnQsCisJCQkJCWNvcnJlY3Rpb25FbmQpOworCQkJfQorCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLGNoYXJbXSBzZWxlY3RvcixjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsY2hhcltdIHJldHVyblR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHt9CisJCXB1YmxpYyB2b2lkIGFjY2VwdE1vZGlmaWVyKGNoYXJbXSBtb2RpZmllck5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkge30KKwkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCWlmKChmaWx0ZXIgJiAoQ0xBU1NFUyB8IElOVEVSRkFDRVMgfCBJTVBPUlQpKSAhPSAwKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UoCisJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhY2thZ2VOYW1lLCBwcmVmaXhMZW5ndGgsIHBhY2thZ2VOYW1lLmxlbmd0aCksCisJCQkJCWNvcnJlY3Rpb25TdGFydCwKKwkJCQkJY29ycmVjdGlvbkVuZCk7CisJCQl9CisJCX0KKwkJcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7fQorCQlwdWJsaWMgdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoY2hhcltdIHR5cGVQYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsY2hhcltdIG5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHt9CisJfTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9FbGVtZW50Q2hhbmdlZEV2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9FbGVtZW50Q2hhbmdlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MDlhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0VsZW1lbnRDaGFuZ2VkRXZlbnQuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKKy8qKgorICogQW4gZWxlbWVudCBjaGFuZ2VkIGV2ZW50IGRlc2NyaWJlcyBhIGNoYW5nZSB0byB0aGUgc3RydWN0dXJlIG9yIGNvbnRlbnRzCisgKiBvZiBhIHRyZWUgb2YgSmF2YSBlbGVtZW50cy4gVGhlIGNoYW5nZXMgdG8gdGhlIGVsZW1lbnRzIGFyZSBkZXNjcmliZWQgYnkKKyAqIHRoZSBhc3NvY2lhdGVkIGRlbHRhIG9iamVjdCBjYXJyaWVkIGJ5IHRoaXMgZXZlbnQuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBKYXZhIG1vZGVsLgorICogPC9wPgorICoKKyAqIEBzZWUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqLworcHVibGljIGNsYXNzIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisJCisJLyoqCisJICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCisJICogcmVwb3J0IG9mIGNyZWF0aW9ucywgZGVsZXRpb25zLCBhbmQgbW9kaWZpY2F0aW9ucworCSAqIHRvIG9uZSBvciBtb3JlIEphdmEgZWxlbWVudChzKSBleHByZXNzZWQgYXMgYSBoaWVyYXJjaGljYWwKKwkgKiBqYXZhIGVsZW1lbnQgZGVsdGEgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0RGVsdGEoKTwvY29kZT4uCisJICoKKwkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIFBPU1RfQ0hBTkdFCisJICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiwgYW5kIGNvbnRhaW5zIGEgZnVsbCBkZWx0YSBhY2NvdW50aW5nIGZvcgorCSAqIGFueSBKYXZhTW9kZWwgb3BlcmF0aW9uICBhbmQvb3IgcmVzb3VyY2UgY2hhbmdlLgorCSAqCisJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQKKwkgKiBAc2VlICNnZXREZWx0YSgpCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfQ0hBTkdFID0gMTsKKworCS8qKgorCSAqIEV2ZW50IHR5cGUgY29uc3RhbnQgKGJpdCBtYXNrKSBpbmRpY2F0aW5nIGFuIGFmdGVyLXRoZS1mYWN0IAorCSAqIHJlcG9ydCBvZiBjcmVhdGlvbnMsIGRlbGV0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMKKwkgKiB0byBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnQocykgZXhwcmVzc2VkIGFzIGEgaGllcmFyY2hpY2FsCisJICogamF2YSBlbGVtZW50IGRlbHRhIGFzIHJldHVybmVkIGJ5IDxjb2RlPmdldERlbHRhPC9jb2RlPi4KKwkgKgorCSAqIE5vdGU6IHRoaXMgbm90aWZpY2F0aW9uIG9jY3VycyBkdXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgUFJFX0FVVE9fQlVJTEQKKwkgKiByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLiBUaGUgZGVsdGEsIHdoaWNoIGlzIG5vdGlmaWVkIGhlcmUsIG9ubHkgY29udGFpbnMKKwkgKiBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgSmF2YU1vZGVsIG9wZXJhdGlvbnMgKGkuZS4gaWdub3JlcyB0aGUKKwkgKiBwb3NzaWJsZSByZXNvdXJjZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIG91dHNpZGUgSmF2YSBvcGVyYXRpb25zKS4gSW4KKwkgKiBwYXJ0aWN1bGFyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBKYXZhTW9kZWwgYmUgaW5jb25zaXN0ZW50IHdpdGggcmVzcGVjdCB0bworCSAqIHJlc291cmNlcywgd2hpY2ggZ290IG1vZGlmaWVkIG91dHNpZGUgSmF2YU1vZGVsIG9wZXJhdGlvbnMgKGl0IHdpbGwgb25seSBiZQorCSAqIGZ1bGx5IGNvbnNpc3RlbnQgb25jZSB0aGUgUE9TVF9DSEFOR0Ugbm90aWZpY2F0aW9uIGhhcyBvY2N1cnJlZCkuCisJICogCisJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQKKwkgKiBAc2VlICNnZXREZWx0YSgpCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9BVVRPX0JVSUxEID0gMjsKKworCS8qKgorCSAqIEV2ZW50IHR5cGUgY29uc3RhbnQgKGJpdCBtYXNrKSBpbmRpY2F0aW5nIGFuIGFmdGVyLXRoZS1mYWN0IAorCSAqIHJlcG9ydCBvZiBjcmVhdGlvbnMsIGRlbGV0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMKKwkgKiB0byBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnQocykgZXhwcmVzc2VkIGFzIGEgaGllcmFyY2hpY2FsCisJICogamF2YSBlbGVtZW50IGRlbHRhIGFzIHJldHVybmVkIGJ5IDxjb2RlPmdldERlbHRhPC9jb2RlPi4KKwkgKgorCSAqIE5vdGU6IHRoaXMgbm90aWZpY2F0aW9uIG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHdvcmtpbmcgY29weSByZWNvbmNpbGUKKwkgKiBvcGVyYXRpb24uCisJICoKKwkgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudAorCSAqIEBzZWUgI2dldERlbHRhKCkKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCVBPU1RfUkVDT05DSUxFID0gNDsJCisJLyoKKwkgKiBFdmVudCB0eXBlIGluZGljYXRpbmcgdGhlIG5hdHVyZSBvZiB0aGlzIGV2ZW50LiAKKwkgKiBJdCBjYW4gYmUgYSBjb21iaW5hdGlvbiBlaXRoZXI6CisJICogIC0gUE9TVF9DSEFOR0UKKwkgKiAgLSBQUkVfQVVUT19CVUlMRAorCSAqICAtIFBPU1RfUkVDT05DSUxFCisJICovCisJcHJpdmF0ZSBpbnQgdHlwZTsgCisJCisJLyoqCisJICogQ3JlYXRlcyBhbiBuZXcgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IChiYXNlZCBvbiBhIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPikuCisJICoKKwkgKiBAcGFyYW0gZGVsdGEgdGhlIEphdmEgZWxlbWVudCBkZWx0YS4KKwkgKi8KKwlwdWJsaWMgRWxlbWVudENoYW5nZWRFdmVudChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IHR5cGUpIHsKKwkJc3VwZXIoZGVsdGEpOworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWx0YSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBkZWx0YSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50RGVsdGEgZ2V0RGVsdGEoKSB7CisJCXJldHVybiAoSUphdmFFbGVtZW50RGVsdGEpIHNvdXJjZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiBldmVudCBiZWluZyByZXBvcnRlZC4KKwkgKgorCSAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlIGNvbnN0YW50cworCSAqIEBzZWUgI1BPU1RfQ0hBTkdFCisJICogQHNlZSAjUFJFX0FVVE9fQlVJTEQKKwkgKiBAc2VlICNQT1NUX1JFQ09OQ0lMRQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnR5cGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRmxhZ3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlMzY1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEKQEAgLTAsMCArMSwyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGRlY29kaW5nIG1vZGlmaWVyIGZsYWdzIGluIEphdmEgZWxlbWVudHMuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCisgKiBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKKyAqIEBzZWUgSU1lbWJlciNnZXRGbGFncworICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmxhZ3MgeworCisJLyoqCisJICogUHVibGljIGFjY2VzcyBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjUHVibGljID0gSUNvbnN0YW50cy5BY2NQdWJsaWM7CisJLyoqCisJICogUHJpdmF0ZSBhY2Nlc3MgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1ByaXZhdGUgPSBJQ29uc3RhbnRzLkFjY1ByaXZhdGU7CisJLyoqCisJICogUHJvdGVjdGVkIGFjY2VzcyBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjUHJvdGVjdGVkID0gSUNvbnN0YW50cy5BY2NQcm90ZWN0ZWQ7CisJLyoqCisJICogU3RhdGljIGFjY2VzcyBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjU3RhdGljID0gSUNvbnN0YW50cy5BY2NTdGF0aWM7CisJLyoqCisJICogRmluYWwgYWNjZXNzIGZsYWcuIFNlZSBUaGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBY2NGaW5hbCA9IElDb25zdGFudHMuQWNjRmluYWw7CisJLyoqCisJICogU3luY2hyb25pemVkIGFjY2VzcyBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjU3luY2hyb25pemVkID0gSUNvbnN0YW50cy5BY2NTeW5jaHJvbml6ZWQ7CisJLyoqCisJICogVm9sYXRpbGUgcHJvcGVydHkgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1ZvbGF0aWxlID0gSUNvbnN0YW50cy5BY2NWb2xhdGlsZTsKKwkvKioKKwkgKiBUcmFuc2llbnQgcHJvcGVydHkgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1RyYW5zaWVudCA9IElDb25zdGFudHMuQWNjVHJhbnNpZW50OworCS8qKgorCSAqIE5hdGl2ZSBwcm9wZXJ0eSBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjTmF0aXZlID0gSUNvbnN0YW50cy5BY2NOYXRpdmU7CisJLyoqCisJICogSW50ZXJmYWNlIHByb3BlcnR5IGZsYWcuIFNlZSBUaGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBY2NJbnRlcmZhY2UgPSBJQ29uc3RhbnRzLkFjY0ludGVyZmFjZTsKKwkvKioKKwkgKiBBYnN0cmFjdCBwcm9wZXJ0eSBmbGFnLiBTZWUgVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQWNjQWJzdHJhY3QgPSBJQ29uc3RhbnRzLkFjY0Fic3RyYWN0OworCS8qKgorCSAqIFN0cmljdGZwIHByb3BlcnR5IGZsYWcuIFNlZSBUaGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBY2NTdHJpY3RmcCA9IElDb25zdGFudHMuQWNjU3RyaWN0ZnA7CisJLyoqCisJICogU3VwZXIgcHJvcGVydHkgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1N1cGVyID0gSUNvbnN0YW50cy5BY2NTdXBlcjsKKwkvKioKKwkgKiBTeW50aGV0aWMgcHJvcGVydHkgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY1N5bnRoZXRpYyA9IElDb25zdGFudHMuQWNjU3ludGhldGljOworCS8qKgorCSAqIERlcHJlY2F0ZWQgcHJvcGVydHkgZmxhZy4gU2VlIFRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFjY0RlcHJlY2F0ZWQgPSBJQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQ7CisJCisJLyoqCisJICogTm90IGluc3RhbnRpYWJsZS4KKwkgKi8KKwlwcml2YXRlIEZsYWdzKCkgeworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPmFic3RyYWN0PC9jb2RlPiBtb2RpZmllci4KKwkgKgorCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5hYnN0cmFjdDwvY29kZT4gbW9kaWZpZXIgaXMgaW5jbHVkZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnN0cmFjdChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIEFjY0Fic3RyYWN0KSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIGluZGljYXRpb24gdGhhdCB0aGUgCisJICogZWxlbWVudCBpcyBkZXByZWNhdGVkICg8Y29kZT5AZGVwcmVjYXRlZDwvY29kZT4gdGFnIGluIEphdmFkb2MgY29tbWVudCkuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBBY2NEZXByZWNhdGVkKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPmZpbmFsPC9jb2RlPiBtb2RpZmllci4KKwkgKgorCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5maW5hbDwvY29kZT4gbW9kaWZpZXIgaXMgaW5jbHVkZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaW5hbChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIEFjY0ZpbmFsKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPmludGVyZmFjZTwvY29kZT4gbW9kaWZpZXIuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+aW50ZXJmYWNlPC9jb2RlPiBtb2RpZmllciBpcyBpbmNsdWRlZAorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBBY2NJbnRlcmZhY2UpICE9IDA7CisJfQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBpbmNsdWRlcyB0aGUgPGNvZGU+bmF0aXZlPC9jb2RlPiBtb2RpZmllci4KKwkgKgorCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5uYXRpdmU8L2NvZGU+IG1vZGlmaWVyIGlzIGluY2x1ZGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmF0aXZlKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgQWNjTmF0aXZlKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPnByaXZhdGU8L2NvZGU+IG1vZGlmaWVyLgorCSAqCisJICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPnByaXZhdGU8L2NvZGU+IG1vZGlmaWVyIGlzIGluY2x1ZGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpdmF0ZShpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIEFjY1ByaXZhdGUpICE9IDA7CisJfQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBpbmNsdWRlcyB0aGUgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiBtb2RpZmllci4KKwkgKgorCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5wcm90ZWN0ZWQ8L2NvZGU+IG1vZGlmaWVyIGlzIGluY2x1ZGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvdGVjdGVkKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgQWNjUHJvdGVjdGVkKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPnB1YmxpYzwvY29kZT4gbW9kaWZpZXIuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+cHVibGljPC9jb2RlPiBtb2RpZmllciBpcyBpbmNsdWRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmxpYyhpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIEFjY1B1YmxpYykgIT0gMDsKKwl9CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBpbnRlZ2VyIGluY2x1ZGVzIHRoZSA8Y29kZT5zdGF0aWM8L2NvZGU+IG1vZGlmaWVyLgorCSAqCisJICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPnN0YXRpYzwvY29kZT4gbW9kaWZpZXIgaXMgaW5jbHVkZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWMoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBBY2NTdGF0aWMpICE9IDA7CisJfQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBpbmNsdWRlcyB0aGUgPGNvZGU+c3RyaWN0ZnA8L2NvZGU+IG1vZGlmaWVyLgorCSAqCisJICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPnN0cmljdGZwPC9jb2RlPiBtb2RpZmllciBpcyBpbmNsdWRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmljdGZwKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgQWNjU3RyaWN0ZnApICE9IDA7CisJfQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaW50ZWdlciBpbmNsdWRlcyB0aGUgPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPiBtb2RpZmllci4KKwkgKgorCSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5zeW5jaHJvbml6ZWQ8L2NvZGU+IG1vZGlmaWVyIGlzIGluY2x1ZGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY2hyb25pemVkKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgQWNjU3luY2hyb25pemVkKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIGluZGljYXRpb24gdGhhdCB0aGUgCisJICogZWxlbWVudCBpcyBzeW50aGV0aWMuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBtYXJrZWQgc3ludGhldGljCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ludGhldGljKGludCBmbGFncykgeworCQlyZXR1cm4gKGZsYWdzICYgQWNjU3ludGhldGljKSAhPSAwOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGludGVnZXIgaW5jbHVkZXMgdGhlIDxjb2RlPnRyYW5zaWVudDwvY29kZT4gbW9kaWZpZXIuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+dHJhbnNpZW50PC9jb2RlPiBtb2RpZmllciBpcyBpbmNsdWRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYW5zaWVudChpbnQgZmxhZ3MpIHsKKwkJcmV0dXJuIChmbGFncyAmIEFjY1RyYW5zaWVudCkgIT0gMDsKKwl9CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBpbnRlZ2VyIGluY2x1ZGVzIHRoZSA8Y29kZT52b2xhdGlsZTwvY29kZT4gbW9kaWZpZXIuCisJICoKKwkgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+dm9sYXRpbGU8L2NvZGU+IG1vZGlmaWVyIGlzIGluY2x1ZGVkCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVm9sYXRpbGUoaW50IGZsYWdzKSB7CisJCXJldHVybiAoZmxhZ3MgJiBBY2NWb2xhdGlsZSkgIT0gMDsKKwl9CisJLyoqCisJICogUmV0dXJucyBhIHN0YW5kYXJkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBtb2RpZmllciBmbGFncy4KKwkgKiBPbmx5IG1vZGlmaWVyIGZsYWdzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0OyB0aGUgZGVwcmVjYXRlZCBhbmQKKwkgKiBzeW50aGV0aWMgZmxhZ3MgYXJlIGlnbm9yZWQgaWYgc2V0LgorCSAqIDxwPgorCSAqIFRoZSBmbGFncyBhcmUgb3V0cHV0IGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJICogPHByZT4KKwkgKiAgIDxjb2RlPnB1YmxpYzwvY29kZT4gPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiA8Y29kZT5wcml2YXRlPC9jb2RlPiAKKwkgKiAgIDxjb2RlPnN0YXRpYzwvY29kZT4gCisJICogICA8Y29kZT5hYnN0cmFjdDwvY29kZT4gPGNvZGU+ZmluYWw8L2NvZGU+IDxjb2RlPm5hdGl2ZTwvY29kZT4gPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPiA8Y29kZT50cmFuc2llbnQ8L2NvZGU+IDxjb2RlPnZvbGF0aWxlPC9jb2RlPiA8Y29kZT5zdHJpY3RmcDwvY29kZT4KKwkgKiA8L3ByZT4KKwkgKiBUaGlzIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHRoZSBvcmRlcnMgc3BlY2lmaWVkIGluIHNlY3Rpb25zIDguMS4xLAorCSAqIDguMy4xLCA4LjQuMywgOC44LjMsIDkuMS4xLCBhbmQgOS4zIG9mIDxlbT5UaGUgSmF2YSBMYW5ndWFnZSAKKwkgKiBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbjwvZW0+IChKTFMyKS4KKwkgKiA8L3A+IAorCSAqIDxwPgorCSAqIEV4YW1wbGVzIHJlc3VsdHM6CisJICogPHByZT4KKwkgKgkgIDxjb2RlPiJwdWJsaWMgc3RhdGljIGZpbmFsIjwvY29kZT4KKwkgKgkgIDxjb2RlPiJwcml2YXRlIG5hdGl2ZSI8L2NvZGU+CisJICogPC9wcmU+CisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncworCSAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmxhZ3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhpbnQgZmxhZ3MpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCWlmIChpc1B1YmxpYyhmbGFncykpCisJCQlzYi5hcHBlbmQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaXNQcm90ZWN0ZWQoZmxhZ3MpKQorCQkJc2IuYXBwZW5kKCJwcm90ZWN0ZWQgIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlzUHJpdmF0ZShmbGFncykpCisJCQlzYi5hcHBlbmQoInByaXZhdGUgIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlzU3RhdGljKGZsYWdzKSkKKwkJCXNiLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc0Fic3RyYWN0KGZsYWdzKSkKKwkJCXNiLmFwcGVuZCgiYWJzdHJhY3QgIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlzRmluYWwoZmxhZ3MpKQorCQkJc2IuYXBwZW5kKCJmaW5hbCAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaXNOYXRpdmUoZmxhZ3MpKQorCQkJc2IuYXBwZW5kKCJuYXRpdmUgIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlzU3luY2hyb25pemVkKGZsYWdzKSkKKwkJCXNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc1RyYW5zaWVudChmbGFncykpCisJCQlzYi5hcHBlbmQoInRyYW5zaWVudCAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaXNWb2xhdGlsZShmbGFncykpCisJCQlzYi5hcHBlbmQoInZvbGF0aWxlICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc1N0cmljdGZwKGZsYWdzKSkKKwkJCXNiLmFwcGVuZCgic3RyaWN0ZnAgIik7IC8vJE5PTi1OTFMtMSQKKworCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQlzYi5zZXRMZW5ndGgobGVuIC0gMSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlZjliYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXIuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKKy8qKgorICogQSBidWZmZXIgY29udGFpbnMgdGhlIHRleHQgY29udGVudHMgb2YgYSByZXNvdXJjZS4gSXQgaXMgbm90IGxhbmd1YWdlLXNwZWNpZmljLgorICogVGhlIGNvbnRlbnRzIG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBlZGl0ZWQsIGRpZmZlcmluZyBmcm9tIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIAorICogdW5kZXJseWluZyByZXNvdXJjZS4gQSBidWZmZXIgaGFzIGFuIG93bmVyLCB3aGljaCBpcyBhbiA8Y29kZT5JT3BlbmFibGU8L2NvZGU+LiAKKyAqIElmIGEgYnVmZmVyIGRvZXMgbm90IGhhdmUgYW4gdW5kZXJseWluZyByZXNvdXJjZSwgc2F2aW5nIHRoZSBidWZmZXIgaGFzIG5vIGVmZmVjdC4gCisgKiBCdWZmZXJzIGNhbiBiZSByZWFkLW9ubHkuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCBqYXZhIG1vZGVsIG9wZXJhdGlvbnMgdGhhdCBtYW5pcHVsYXRlIGFuIDxjb2RlPklCdWZmZXI8L2NvZGU+IChlLmcuIAorICogPGNvZGU+SVR5cGUuY3JlYXRlTWV0aG9kKC4uLik8L2NvZGU+KSBlbnN1cmVzIHRoYXQgdGhlIHNhbWUgbGluZSBkZWxpbWl0ZXIgCisgKiAoaS5lLiBlaXRoZXIgPGNvZGU+IlxuIjwvY29kZT4gb3IgPGNvZGU+IlxyIjwvY29kZT4gb3IgPGNvZGU+IlxyXG4iPC9jb2RlPikgaXMgCisgKiB1c2VkIGFjcm9zcyB0aGUgd2hvbGUgYnVmZmVyLiBUaHVzIHRoZXNlIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSB0aGUgbGluZSBkZWxpbWl0ZXIocykgCisgKiBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHRvIGJlIGFwcGVuZCwgb3IgcmVwbGFjZWQuCisgKiBIb3dldmVyIGltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgYXdhcmUgdGhhdCBvdGhlciBjbGllbnRzIG9mIDxjb2RlPklCdWZmZXI8L2NvZGU+CisgKiBtaWdodCBub3QgZG8gc3VjaCB0cmFuc2Zvcm1hdGlvbnMgYmVmb3JlaGFuZC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUJ1ZmZlciB7CisJCisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgYnVmZmVyLgorICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG9yIGlmIHRoZSBidWZmZXIKKyAqIGlzIGNsb3NlZC4KKyAqCisgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIG9mIGJ1ZmZlciBjaGFuZ2VzCisgKi8KK3B1YmxpYyB2b2lkIGFkZEJ1ZmZlckNoYW5nZWRMaXN0ZW5lcihJQnVmZmVyQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKy8qKgorICogQXBwZW5kcyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFycmF5IHRvIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICogVGhpcyBidWZmZXIgd2lsbCBub3cgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuCisgKiBBbnkgY2xpZW50IGNhbiBhcHBlbmQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIsIG5vdCBqdXN0IHRoZSBvd25lciBvZiB0aGUgYnVmZmVyLgorICogUmVwb3J0cyBhIGJ1ZmZlciBjaGFuZ2VkIGV2ZW50LgorICogPHA+CisgKiBIYXMgbm8gZWZmZWN0IGlmIHRoaXMgYnVmZmVyIGlzIHJlYWQtb25seS4KKyAqIDxwPgorICogQSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPiBtaWdodCBiZSB0aHJvd24gaWYgdGhlIGJ1ZmZlciBpcyBjbG9zZWQuCisgKgorICogQHBhcmFtIHRleHQgdGhlIGdpdmVuIGNoYXJhY3RlciBhcnJheSB0byBhcHBlbmQgdG8gY29udGVudHMgb2YgdGhlIGJ1ZmZlcgorICovCitwdWJsaWMgdm9pZCBhcHBlbmQoY2hhcltdIHRleHQpOworLyoqCisgKiBBcHBlbmRzIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgKiBUaGlzIGJ1ZmZlciB3aWxsIG5vdyBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4KKyAqIEFueSBjbGllbnQgY2FuIGFwcGVuZCB0byB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciwgbm90IGp1c3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXIuCisgKiBSZXBvcnRzIGEgYnVmZmVyIGNoYW5nZWQgZXZlbnQuCisgKiA8cD4KKyAqIEhhcyBubyBlZmZlY3QgaWYgdGhpcyBidWZmZXIgaXMgcmVhZC1vbmx5LgorICogPHA+CisgKiBBIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IG1pZ2h0IGJlIHRocm93biBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqCisgKiBAcGFyYW0gdGV4dCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBhcHBlbmQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIKKyAqLworcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyB0ZXh0KTsKKy8qKgorICogQ2xvc2VzIHRoZSBidWZmZXIuIEFueSB1bnNhdmVkIGNoYW5nZXMgYXJlIGxvc3QuIFJlcG9ydHMgYSBidWZmZXIgY2hhbmdlZCBldmVudAorICogd2l0aCBhIDAgb2Zmc2V0IGFuZCBhIDAgbGVuZ3RoLiBXaGVuIHRoaXMgZXZlbnQgaXMgZmlyZWQsIHRoZSBidWZmZXIgc2hvdWxkIGFscmVhZHkKKyAqIGJlIGNsb3NlZC4KKyAqIDxwPgorICogRnVydGhlciBvcGVyYXRpb25zIG9uIHRoZSBidWZmZXIgYXJlIG5vdCBhbGxvd2VkLCBleGNlcHQgZm9yIGNsb3NlLiAgSWYgYW4KKyAqIGF0dGVtcHQgaXMgbWFkZSB0byBjbG9zZSBhbiBhbHJlYWR5IGNsb3NlZCBidWZmZXIsIHRoZSBzZWNvbmQgYXR0ZW1wdCBoYXMgbm8gZWZmZWN0LgorICovCitwdWJsaWMgdm9pZCBjbG9zZSgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoaXMgYnVmZmVyLgorICogPHA+CisgKiBBIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IG1pZ2h0IGJlIHRocm93biBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqCisgKiBAcGFyYW0gcG9zaXRpb24gYSB6ZXJvLWJhc2VkIHNvdXJjZSBvZmZzZXQgaW4gdGhpcyBidWZmZXIKKyAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhpcyBidWZmZXIKKyAqLworcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgcG9zaXRpb24pOworLyoqCisgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcyBhIGNoYXJhY3RlciBhcnJheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAqIHRoZSBidWZmZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgorICogPHA+CisgKiBDYWxsZXJzIHNob3VsZCBtYWtlIG5vIGFzc3VtcHRpb24gYWJvdXQgd2hldGhlciB0aGUgcmV0dXJuZWQgY2hhcmFjdGVyIGFycmF5CisgKiBpcyBvciBpcyBub3QgdGhlIGdlbnVpbmUgYXJ0aWNsZSBvciBhIGNvcHkuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgY2xpZW50CisgKiB3aXNoZXMgdG8gY2hhbmdlIHRoaXMgYXJyYXksIHRoZXkgc2hvdWxkIG1ha2UgYSBjb3B5LiBMaWtld2lzZSwgaWYgdGhlCisgKiBjbGllbnQgd2lzaGVzIHRvIGhhbmcgb24gdG8gdGhlIGFycmF5IGluIGl0cyBjdXJyZW50IHN0YXRlLCB0aGV5IHNob3VsZAorICogbWFrZSBhIGNvcHkuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4gbWlnaHQgYmUgdGhyb3duIGlmIHRoZSBidWZmZXIgaXMgY2xvc2VkLgorICoKKyAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRoaXMgYnVmZmVyCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0Q2hhcmFjdGVycygpOworLyoqCisgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4uIExpa2UgYWxsIHN0cmluZ3MsCisgKiB0aGUgcmVzdWx0IGlzIGFuIGltbXV0YWJsZSB2YWx1ZSBvYmplY3QuLCBJdCBjYW4gYWxzbyBhbnN3ZXIgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAqIHRoZSBidWZmZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgorICogPHA+CisgKiBBIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IG1pZ2h0IGJlIHRocm93biBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4KKyAqLworcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpOworLyoqCisgKiBSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0b3JlZCBpbiB0aGlzIGJ1ZmZlci4KKyAqIDxwPgorICogQSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPiBtaWdodCBiZSB0aHJvd24gaWYgdGhlIGJ1ZmZlciBpcyBjbG9zZWQuCisgKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBidWZmZXIKKyAqLworcHVibGljIGludCBnZXRMZW5ndGgoKTsKKy8qKgorICogUmV0dXJucyB0aGUgSmF2YSBvcGVuYWJsZSBlbGVtZW50IG93bmluZyBvZiB0aGlzIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuIHRoZSBvcGVuYWJsZSBlbGVtZW50IG93bmluZyB0aGlzIGJ1ZmZlcgorICovCitwdWJsaWMgSU9wZW5hYmxlIGdldE93bmVyKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGdpdmVuIHJhbmdlIG9mIHRleHQgaW4gdGhpcyBidWZmZXIuCisgKiA8cD4KKyAqIEEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4gbWlnaHQgYmUgdGhyb3duIGlmIHRoZSBidWZmZXIgaXMgY2xvc2VkLgorICoKKyAqIEBwYXJhbSBvZmZzZXQgdGhlICB6ZXJvLWJhc2VkIHN0YXJ0aW5nIG9mZnNldAorICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0cmlldmUKKyAqIEByZXR1cm4gdGhlIGdpdmVuIHJhbmdlIG9mIHRleHQgaW4gdGhpcyBidWZmZXIKKyAqLworcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpOworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZvciB3aGljaCB0aGlzIGJ1ZmZlciB3YXMgb3BlbmVkLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBidWZmZXIgd2FzIG5vdCBvcGVuZWQgb24gYSByZXNvdXJjZS4KKyAqCisgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZvciB0aGlzIGJ1ZmZlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqICBpZiBub25lLgorICovCitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgaXQKKyAqIHdhcyBvcGVuZWQgb3Igc2luY2UgaXQgd2FzIGxhc3Qgc2F2ZWQuCisgKiBJZiBhIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UsIHRoaXMgbWV0aG9kIGFsd2F5cworICogcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KKyAqCisgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyBwcmVzZW5jZSBvZiB1bnNhdmVkIGNoYW5nZXMgKGluCisgKiAgIHRoZSBhYnNlbmNlIG9mIGFueSB1bmRlcmx5aW5nIHJlc291cmNlLCBpdCB3aWxsIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgorICovCitwdWJsaWMgYm9vbGVhbiBoYXNVbnNhdmVkQ2hhbmdlcygpOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGJlZW4gY2xvc2VkLgorICoKKyAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgY2xvc2VkLgorICovCitwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgcmVhZC1vbmx5LgorICoKKyAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBidWZmZXIgaXMgcmVhZC1vbmx5CisgKi8KK3B1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKKy8qKgorICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIGJ1ZmZlci4KKyAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkIG9yIGlmIHRoZSBidWZmZXIgaXMgY2xvc2VkLgorICoKKyAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKKyAqLworcHVibGljIHZvaWQgcmVtb3ZlQnVmZmVyQ2hhbmdlZExpc3RlbmVyKElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworLyoqCisgKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGlzIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiB0ZXh0LgorICogPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCA8Y29kZT5wb3NpdGlvbiArIGxlbmd0aDwvY29kZT4gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsIGdldExlbmd0aCgpXS4KKyAqIDxjb2RlPmxlbmd0aDwvY29kZT4gbXVzdCBub3QgYmUgbmVnYXRpdmUuCisgKiA8cD4KKyAqIEEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4gbWlnaHQgYmUgdGhyb3duIGlmIHRoZSBidWZmZXIgaXMgY2xvc2VkLgorICoKKyAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgemVyby1iYXNlZCBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgYWZmZWN0ZWQgdGV4dCByYW5nZSBpbiB0aGlzIGJ1ZmZlcgorICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBhZmZlY3RlZCB0ZXh0IHJhbmdlIGluIHRoaXMgYnVmZmVyCisgKiBAcGFyYW0gdGV4dCB0aGUgcmVwbGFjaW5nIHRleHQgYXMgYSBjaGFyYWN0ZXIgYXJyYXkKKyAqLworcHVibGljIHZvaWQgcmVwbGFjZShpbnQgcG9zaXRpb24sIGludCBsZW5ndGgsIGNoYXJbXSB0ZXh0KTsKKy8qKgorICogUmVwbGFjZXMgdGhlIGdpdmVuIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KKyAqIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgPGNvZGU+cG9zaXRpb24gKyBsZW5ndGg8L2NvZGU+IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLCBnZXRMZW5ndGgoKV0uCisgKiA8Y29kZT5sZW5ndGg8L2NvZGU+IG11c3Qgbm90IGJlIG5lZ2F0aXZlLgorICogPHA+CisgKiBBIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IG1pZ2h0IGJlIHRocm93biBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqCisgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHplcm8tYmFzZWQgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGFmZmVjdGVkIHRleHQgcmFuZ2UgaW4gdGhpcyBidWZmZXIKKyAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgYWZmZWN0ZWQgdGV4dCByYW5nZSBpbiB0aGlzIGJ1ZmZlcgorICogQHBhcmFtIHRleHQgdGhlIHJlcGxhY2luZyB0ZXh0IGFzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgorICovCitwdWJsaWMgdm9pZCByZXBsYWNlKGludCBwb3NpdGlvbiwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpOworLyoqCisgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIgdG8gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UuIElmCisgKiBzdWNjZXNzZnVsLCB0aGlzIGJ1ZmZlciB3aWxsIGhhdmUgbm8gdW5zYXZlZCBjaGFuZ2VzLgorICogVGhlIGJ1ZmZlciBpcyBsZWZ0IG9wZW4uIFNhdmluZyBhIGJ1ZmZlciB3aXRoIG5vIHVuc2F2ZWQKKyAqIGNoYW5nZXMgaGFzIG5vIGVmZmVjdCAtIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGlzIG5vdCBjaGFuZ2VkLgorICogSWYgdGhlIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGFuIHVuZGVybHlpbmcgcmVzb3VyY2Ugb3IgaXMgcmVhZC1vbmx5LCB0aGlzCisgKiBoYXMgbm8gZWZmZWN0LgorICogPHA+CisgKiBUaGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyBob3cgdGhpcyBtZXRob2QgZGVhbHMgd2l0aAorICogY2FzZXMgd2hlcmUgdGhlIHdvcmtiZW5jaCBpcyBub3QgY29tcGxldGVseSBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgorICogSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHNwZWNpZmllZCwgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGF0dGVtcHQKKyAqIHRvIG92ZXJ3cml0ZSBhIGNvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gcHJvdmlkZWQKKyAqIGl0IGlzIGluIHN5bmMgd2l0aCB0aGUgd29ya2JlbmNoLiBUaGlzIG9wdGlvbiBlbnN1cmVzIHRoZXJlIGlzIG5vIAorICogdW5pbnRlbmRlZCBkYXRhIGxvc3M7IGl0IGlzIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5nLgorICogSG93ZXZlciwgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZQorICogdG8gd3JpdGUgYSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCAKKyAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBvbmUgaWYgbmVlZCBiZS4KKyAqIEluIGVpdGhlciBjYXNlLCBpZiB0aGlzIG1ldGhvZCBzdWNjZWVkcywgdGhlIHJlc291cmNlIHdpbGwgYmUgbWFya2VkIAorICogYXMgYmVpbmcgbG9jYWwgKGV2ZW4gaWYgaXQgd2Fzbid0IGJlZm9yZSkuCisgKiA8cD4KKyAqIEEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4gbWlnaHQgYmUgdGhyb3duIGlmIHRoZSBidWZmZXIgaXMgY2xvc2VkLgorICoKKyAqIEBwYXJhbSBwcm9ncmVzcyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBub3RpZnkKKyAqIEBwYXJhbSBmb3JjZSBhIDxjb2RlPiBib29sZWFuIDwvY29kZT4gZmxhZyBpbmRpY2F0aW5nIGhvdyB0byBkZWFsIHdpdGggcmVzb3VyY2UKKyAqICAgaW5jb25zaXN0ZW5jaWVzLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSBidWZmZXIKKyAqCXRvIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSNzZXRDb250ZW50cyhqYXZhLmlvLklucHV0U3RyZWFtLCBib29sZWFuLCBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFycmF5LgorICogVGhpcyBidWZmZXIgd2lsbCBub3cgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuCisgKiBBbnkgY2xpZW50IGNhbiBzZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIsIG5vdCBqdXN0IHRoZSBvd25lciBvZiB0aGUgYnVmZmVyLgorICogUmVwb3J0cyBhIGJ1ZmZlciBjaGFuZ2VkIGV2ZW50LgorICogPHA+CisgKiBFcXVpdmFsZW50IHRvIDxjb2RlPnJlcGxhY2UoMCxnZXRMZW5ndGgoKSxjb250ZW50cyk8L2NvZGU+LgorICogPC9wPgorICogPHA+CisgKiBIYXMgbm8gZWZmZWN0IGlmIHRoaXMgYnVmZmVyIGlzIHJlYWQtb25seS4KKyAqIDxwPgorICogQSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPiBtaWdodCBiZSB0aHJvd24gaWYgdGhlIGJ1ZmZlciBpcyBjbG9zZWQuCisgKgorICogQHBhcmFtIGNvbnRlbnRzIHRoZSBuZXcgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXMgYSBjaGFyYWN0ZXIgYXJyYXkKKyAqLworcHVibGljIHZvaWQgc2V0Q29udGVudHMoY2hhcltdIGNvbnRlbnRzKTsKKy8qKgorICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhpcyBidWZmZXIgdG8gdGhlIGdpdmVuIDxjb2RlPlN0cmluZzwvY29kZT4uCisgKiBUaGlzIGJ1ZmZlciB3aWxsIG5vdyBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4KKyAqIEFueSBjbGllbnQgY2FuIHNldCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciwgbm90IGp1c3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXIuCisgKiBSZXBvcnRzIGEgYnVmZmVyIGNoYW5nZWQgZXZlbnQuCisgKiA8cD4KKyAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+cmVwbGFjZSgwLGdldExlbmd0aCgpLGNvbnRlbnRzKTwvY29kZT4uCisgKiA8L3A+CisgKiA8cD4KKyAqIEhhcyBubyBlZmZlY3QgaWYgdGhpcyBidWZmZXIgaXMgcmVhZC1vbmx5LgorICogPHA+CisgKiBBIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IG1pZ2h0IGJlIHRocm93biBpZiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqCisgKiBAcGFyYW0gY29udGVudHMgdGhlIG5ldyBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4KKyAqLworcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNvbnRlbnRzKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYwZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEEgbGlzdGVuZXIsIHdoaWNoIGdldHMgbm90aWZpZWQgd2hlbiB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBidWZmZXIKKyAqIGhhdmUgY2hhbmdlZCwgb3Igd2hlbiB0aGUgYnVmZmVyIGlzIGNsb3NlZC4KKyAqIFdoZW4gYSBidWZmZXIgaXMgY2xvc2VkLCB0aGUgbGlzdGVuZXIgaXMgbm90aWZpZWQgPGVtPmFmdGVyPC9lbT4gdGhlIGJ1ZmZlciBoYXMgYmVlbiBjbG9zZWQuCisgKiBBIGxpc3RlbmVyIGlzIG5vdCBub3RpZmllZCB3aGVuIGEgYnVmZmVyIGlzIHNhdmVkLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJQnVmZmVyQ2hhbmdlZExpc3RlbmVyIHsKKworCS8qKiAKKwkgKiBOb3RpZmllcyB0aGF0IHRoZSBnaXZlbiBldmVudCBoYXMgb2NjdXJyZWQuCisJICoKKwkgKiBAcGFyYW0gZXZlbnQgdGhlIGNoYW5nZSBldmVudAorCSAqLworCXB1YmxpYyB2b2lkIGJ1ZmZlckNoYW5nZWQoQnVmZmVyQ2hhbmdlZEV2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDM0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEEgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgPGNvZGU+SUJ1ZmZlcjwvY29kZT5zIGZvciBvcGVuYWJsZXMuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElCdWZmZXJGYWN0b3J5IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBidWZmZXIgZm9yIHRoZSBnaXZlbiBvd25lci4KKwkgKiBUaGUgbmV3IGJ1ZmZlciB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciAKKwkgKiBpZiBhbmQgb25seSBpZiBpdCB3YXMgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgYnkgdGhlIGZhY3RvcnkgKGEgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQgaWYgCisJICogaXRzIGNvbnRlbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4pLgorCSAqIAorCSAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIgb2YgdGhlIGJ1ZmZlcgorCSAqIEBzZWUgSUJ1ZmZlcgorCSAqLworCUlCdWZmZXIgY3JlYXRlQnVmZmVyKElPcGVuYWJsZSBvd25lcik7Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGVhYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gZW50aXJlIGJpbmFyeSB0eXBlIChzaW5nbGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlKS4gCisgKiBBIGNsYXNzIGZpbGUgaGFzIGEgc2luZ2xlIGNoaWxkIG9mIHR5cGUgPGNvZGU+SVR5cGU8L2NvZGU+LgorICogQ2xhc3MgZmlsZSBlbGVtZW50cyBuZWVkIHRvIGJlIG9wZW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgbmF2aWdhdGVkLgorICogSWYgYSBjbGFzcyBmaWxlIGNhbm5vdCBiZSBwYXJzZWQsIGl0cyBzdHJ1Y3R1cmUgcmVtYWlucyB1bmtub3duLiBVc2UgCisgKiA8Y29kZT5JSmF2YUVsZW1lbnQuaXNTdHJ1Y3R1cmVLbm93bjwvY29kZT4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUKKyAqIGNhc2UuCisgKiA8cD4KKyAqIE5vdGU6IDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+IGV4dGVuZHMgPGNvZGU+SVNvdXJjZVJlZmVyZW5jZTwvY29kZT4uCisgKiBTb3VyY2UgY2FuIGJlIG9idGFpbmVkIGZvciBhIGNsYXNzIGZpbGUgaWYgYW5kIG9ubHkgaWYgc291cmNlIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoaXMKKyAqIGNsYXNzIGZpbGUuIFRoZSBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MgZmlsZSBpcyB0aGUgc291cmNlIGNvZGUgb2YKKyAqIHRoZSBjb21waWxhdGlvbiB1bml0IGl0IHdhcyAobm9taW5hbGx5KSBnZW5lcmF0ZWQgZnJvbS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNhdHRhY2hTb3VyY2UKKyAqLworIAorcHVibGljIGludGVyZmFjZSBJQ2xhc3NGaWxlIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJUGFyZW50LCBJT3BlbmFibGUsIElTb3VyY2VSZWZlcmVuY2UsIElDb2RlQXNzaXN0IHsKKy8qKgorICogUmV0dXJucyB0aGUgc21hbGxlc3QgZWxlbWVudCB3aXRoaW4gdGhpcyBjbGFzcyBmaWxlIHRoYXQgCisgKiBpbmNsdWRlcyB0aGUgZ2l2ZW4gc291cmNlIHBvc2l0aW9uIChhIG1ldGhvZCwgZmllbGQsIGV0Yy4pLCBvcgorICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBvdGhlciB0aGFuIHRoZSBjbGFzcyBmaWxlCisgKiBpdHNlbGYgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBvciBpZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgbm90CisgKiB3aXRoaW4gdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIGNsYXNzIGZpbGUuCisgKgorICogQHBhcmFtIHBvc2l0aW9uIGEgc291cmNlIHBvc2l0aW9uIGluc2lkZSB0aGUgY2xhc3MgZmlsZQorICogQHJldHVybiB0aGUgaW5uZXJtb3N0IEphdmEgZWxlbWVudCBlbmNsb3NpbmcgYSBnaXZlbiBzb3VyY2UgcG9zaXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqICBpZiBub25lIChleGNsdWRpbmcgdGhlIGNsYXNzIGZpbGUpLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudEF0KGludCBwb3NpdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBjb250YWluZWQgaW4gdGhpcyBjbGFzcyBmaWxlLgorICoKKyAqIEByZXR1cm4gdGhlIHR5cGUgY29udGFpbmVkIGluIHRoaXMgY2xhc3MgZmlsZQorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyBhIHdvcmtpbmcgY29weSBvbiB0aGUgc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzIGZpbGUgdXNpbmcgdGhlIGdpdmVuIAorICogZmFjdG9yeSB0byBjcmVhdGUgdGhlIGJ1ZmZlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc291cmNlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGNsYXNzIGZpbGUuCisgKiA8cD4KKyAqIFRoZSBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggdGhlIHNvdXJjZSBvZiB0aGUgY2xhc3MgZmlsZQorICogdXBvbiBjcmVhdGlvbi4KKyAqIDxwPgorICogVGhlIG9ubHkgdmFsaWQgb3BlcmF0aW9ucyBvbiB0aGlzIHdvcmtpbmcgY29weSBhcmUgPGNvZGU+Z2V0QnVmZmVyKCk8L2NvZGU+IG9yIDxjb2RlPmdldE9yaWdpbmFsRWxlbWVudDwvY29kZT4uCisgKgorICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIHdoaWxlIG9wZW5pbmcgdGhpcyBjb21waWxhdGlvbiB1bml0CisgKiAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIAorICogQHBhcmFtIGZhY3RvcnkgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgYnVmZmVyIHRoYXQgaXMgdXNlZCB0byBnZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHdvcmtpbmcgY29weQorICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnRlcm5hbCBmYWN0b3J5IHNob3VsZCBiZSB1c2VkCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIG9mIHRoaXMgY2xhc3MgZmlsZSBjYW4KKyAqICAgbm90IGJlIGRldGVybWluZWQuIFJlYXNvbnMgaW5jbHVkZToKKyAqIDx1bD4KKyAqIDxsaT4gVGhpcyBjbGFzcyBmaWxlIGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8L3VsPgorICogQHNpbmNlIDIuMAorICovCitJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSBjbGFzcy4gVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZQorICogaW5zdGFudGFuZW91cywgYXMgaXQgbWF5IHJlcXVpcmUgcGFyc2luZyB0aGUgdW5kZXJseWluZyBmaWxlLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIGZpbGUgcmVwcmVzZW50cyBhIGNsYXNzLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitib29sZWFuIGlzQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvCisgKiBiZSBpbnN0YW50YW5lb3VzLCBhcyBpdCBtYXkgcmVxdWlyZSBwYXJzaW5nIHRoZSB1bmRlcmx5aW5nIGZpbGUuIAorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsYXNzIGZpbGUgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisgKi8KK2Jvb2xlYW4gaXNJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2M5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworCisvKiogCisgKiBJbnRlcmZhY2Ugb2YgYSBjbGFzc3BhdGggY29udGFpbmVyLgorICogQSBjbGFzc3BhdGggY29udGFpbmVyIHByb3ZpZGVzIGEgd2F5IHRvIGluZGlyZWN0bHkgcmVmZXJlbmNlIGEgc2V0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHRocm91Z2gKKyAqIGEgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX0NPTlRBSU5FUjwvY29kZT4uIFR5cGljYWxseSwgYSBjbGFzc3BhdGggY29udGFpbmVyIGNhbgorICogYmUgdXNlZCB0byBkZXNjcmliZSBhIGNvbXBsZXggbGlicmFyeSBjb21wb3NlZCBvZiBtdWx0aXBsZSBKQVJzIG9yIHByb2plY3RzLAorICogY29uc2lkZXJpbmcgYWxzbyB0aGF0IGNvbnRhaW5lcnMgY2FuIG1hcCB0byBkaWZmZXJlbnQgc2V0IG9mIGVudHJpZXMgb24gZWFjaCBwcm9qZWN0LCBpLmUuIHNldmVyYWwgCisgKiBwcm9qZWN0cyBjYW4gcmVmZXJlbmNlIHRoZSBzYW1lIGdlbmVyaWMgY29udGFpbmVyIHBhdGgsIGJ1dCBoYXZlIGVhY2ggb2YgdGhlbSBhY3R1YWxseSBib3VuZCAKKyAqIHRvIGEgZGlmZmVyZW50IGNvbnRhaW5lciBvYmplY3QuCisgKiA8cD4KKyAqIFRoZSBzZXQgb2YgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYSBjbGFzc3BhdGggY29udGFpbmVyIG1heSBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICogPHVsPgorICogPGxpPiBsaWJyYXJ5IGVudHJpZXMgKDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPikgPC9saT4KKyAqIDxsaT4gcHJvamVjdCBlbnRyaWVzICg8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4pIDwvbGk+CisgKiA8L3VsPgorICogSW4gcGFydGljdWxhciwgYSBjbGFzc3BhdGggY29udGFpbmVyIGNhbiBuZWl0aGVyIHJlZmVyZW5jZSBmdXJ0aGVyIGNsYXNzcGF0aCBjb250YWluZXJzIG9yIGNsYXNzcGF0aCB2YXJpYWJsZXMuCisgKiA8cD4KKyAqIENsYXNzcGF0aCBjb250YWluZXIgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBidXQgYXJlIG5vdCBwcmVzZXJ2ZWQgZnJvbSBhIAorICogc2Vzc2lvbiB0byBhbm90aGVyLiBJdCBpcyB0aHVzIGhpZ2hseSByZWNvbW1lbmRlZCB0byByZWdpc3RlciBhIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPiAKKyAqIGZvciBlYWNoIHJlZmVyZW5jZWQgY29udGFpbmVyICh0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIikuCisgKiA8cD4KKyAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGludGVyZmFjZSBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKKwkKKwkvKioKKwkgKiBLaW5kIGZvciBhIGNvbnRhaW5lciBtYXBwaW5nIHRvIGFuIGFwcGxpY2F0aW9uIGxpYnJhcnkKKwkgKi8KKwlpbnQgS19BUFBMSUNBVElPTiA9IDE7CisKKwkvKioKKwkgKiBLaW5kIGZvciBhIGNvbnRhaW5lciBtYXBwaW5nIHRvIGEgc3lzdGVtIGxpYnJhcnkKKwkgKi8KKwlpbnQgS19TWVNURU0gPSAyOworCisJLyoqCisJICogS2luZCBmb3IgYSBjb250YWluZXIgbWFwcGluZyB0byBhIGRlZmF1bHQgc3lzdGVtIGxpYnJhcnksIGltcGxpY2l0bHkgY29udHJpYnV0ZWQgYnkgdGhlIHJ1bnRpbWUKKwkgKi8KKwlpbnQgS19ERUZBVUxUX1NZU1RFTSA9IDM7CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBzZXQgb2YgY2xhc3NwYXRoIGVudHJpZXMgdGhpcyBjb250YWluZXIgaXMgbWFwcGluZyB0by4KKwkgKiA8cD4KKwkgKiBUaGUgc2V0IG9mIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBtYXkgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKwkgKiA8dWw+CisJICogPGxpPiBsaWJyYXJ5IGVudHJpZXMgKDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPikgPC9saT4KKwkgKiA8bGk+IHByb2plY3QgZW50cmllcyAoPGNvZGU+Q1BFX1BST0pFQ1Q8L2NvZGU+KSA8L2xpPgorCSAqIDwvdWw+CisJICogQSBjbGFzc3BhdGggY29udGFpbmVyIGNhbiBuZWl0aGVyIHJlZmVyZW5jZSBmdXJ0aGVyIGNsYXNzcGF0aCBjb250YWluZXJzIG9yIGNsYXNzcGF0aCB2YXJpYWJsZXMuCisJICogCisJICogQHJldHVybiBJQ2xhc3NwYXRoRW50cnlbXSAtIHRoZSBjbGFzc3BhdGggZW50cmllcyB0aGlzIGNvbnRhaW5lciByZXByZXNlbnRzCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKi8JCisgICAgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpOworCisJLyoqCisJICogQW5zd2VycyBhIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgY29udGFpbmVyCisJICogCisJICogQHJldHVybiBTdHJpbmcgLSBhIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGFpbmVyCisJICovCQorICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogQW5zd2VycyB0aGUga2luZCBvZiB0aGlzIGNvbnRhaW5lci4gQ2FuIGJlIGVpdGhlcjoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPktfQVBQTElDQVRJT048L2NvZGU+IGlmIHRoaXMgY29udGFpbmVyIG1hcHMgdG8gYW4gYXBwbGljYXRpb24gbGlicmFyeTwvbGk+CisJICogPGxpPjxjb2RlPktfU1lTVEVNPC9jb2RlPiBpZiB0aGlzIGNvbnRhaW5lciBtYXBzIHRvIGEgc3lzdGVtIGxpYnJhcnk8L2xpPgorCSAqIDxsaT48Y29kZT5LX0RFRkFVTFRfU1lTVEVNPC9jb2RlPiBpZiB0aGlzIGNvbnRhaW5lciBtYXBzIHRvIGEgZGVmYXVsdCBzeXN0ZW0gbGlicmFyeSAobGlicmFyeQorCSAqIAlpbXBsaWNpdGx5IGNvbnRyaWJ1dGVkIGJ5IHRoZSBydW50aW1lKS48L2xpPgorCSAqIDwvdWw+CisJICogVHlwaWNhbGx5LCBzeXN0ZW0gY29udGFpbmVycyBzaG91bGQgYmUgcGxhY2VkIGZpcnN0IG9uIGEgYnVpbGQgcGF0aC4KKwkgKi8JCisgICAgaW50IGdldEtpbmQoKTsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGNvbnRhaW5lciBwYXRoIGlkZW50aWZ5aW5nIHRoaXMgY29udGFpbmVyLgorCSAqIEEgY29udGFpbmVyIHBhdGggaXMgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLCB3aGljaCAKKwkgKiBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHZpbmcgdG8gdGhpcyBjb250YWluZXIuCisJICogPHA+CisJICogVGhlIGNvbnRhaW5lciBJRCBpcyBhbHNvIHVzZWQgdG8gaWRlbnRpZnkgYTxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPgorCSAqIHJlZ2lzdGVyZWQgb24gdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLCB3aGljaCBjYW4KKwkgKiBiZSBpbnZva2VkIGlmIG5lZWRpbmcgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGJlZm9yZSBpdCBpcyBleHBsaWNpdGx5IHNldC4KKwkgKiA8cD4KKwkgKiBAcmV0dXJuIElQYXRoIC0gdGhlIGNvbnRhaW5lciBwYXRoIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyCisJICovCQorICAgIElQYXRoIGdldFBhdGgoKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJlYTUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworCisvKiogCisgKiBBbiBlbnRyeSBvbiBhIEphdmEgcHJvamVjdCBjbGFzc3BhdGggaWRlbnRpZnlpbmcgb25lIG9yIG1vcmUgcGFja2FnZSBmcmFnbWVudAorICogcm9vdHMuIEEgY2xhc3NwYXRoIGVudHJ5IGhhcyBhIGNvbnRlbnQga2luZCAoZWl0aGVyIHNvdXJjZSwgCisgKiA8Y29kZT5LX1NPVVJDRTwvY29kZT4sIG9yIGJpbmFyeSwgPGNvZGU+S19CSU5BUlk8L2NvZGU+KSwgd2hpY2ggaXMgaW5oZXJpdGVkCisgKiBieSBlYWNoIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBhbmQgcGFja2FnZSBmcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LgorICogPHA+CisgKiBBIGNsYXNzcGF0aCBlbnRyeSBjYW4gcmVmZXIgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6PHVsPgorICogCisgKgk8bGk+U291cmNlIGNvZGUgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4gSW4gdGhpcyBjYXNlLCB0aGUgZW50cnkgaWRlbnRpZmllcyBhCisgKgkJcm9vdCBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCBjb250YWluaW5nIHBhY2thZ2UgZnJhZ21lbnRzIGFuZAorICoJCTxjb2RlPi5qYXZhPC9jb2RlPiBzb3VyY2UgZmlsZXMuIFRoZSByb290IGZvbGRlciBpdHNlbGYgcmVwcmVzZW50cyBhIGRlZmF1bHQKKyAqCQlwYWNrYWdlLCBzdWJmb2xkZXJzIHJlcHJlc2VudCBwYWNrYWdlIGZyYWdtZW50cywgYW5kIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcworICoJCXJlcHJlc2VudCBjb21waWxhdGlvbiB1bml0cy4gQWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdpbGwgYmUgY29tcGlsZWQgd2hlbgorICogCQl0aGUgcHJvamVjdCBpcyBidWlsdC4gVGhlIGNsYXNzcGF0aCBlbnRyeSBtdXN0IHNwZWNpZnkgdGhlCisgKgkJYWJzb2x1dGUgcGF0aCB0byB0aGUgcm9vdCBmb2xkZXIuIEVudHJpZXMgb2YgdGhpcyBraW5kIGFyZSAKKyAqCQlhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGNvbnN0YW50LjwvbGk+CisgKiAKKyAqCTxsaT5BIGJpbmFyeSBsaWJyYXJ5IGluIHRoZSBjdXJyZW50IHByb2plY3QsIGluIGFub3RoZXIgcHJvamVjdCwgb3IgaW4gdGhlIGV4dGVybmFsCisgKgkJZmlsZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB0aGUgZW50cnkgaWRlbnRpZmllcyBhIEpBUiAob3Igcm9vdCBmb2xkZXIpIGNvbnRhaW5pbmcKKyAqCQlwYWNrYWdlIGZyYWdtZW50cyBhbmQgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy4gIFRoZSBjbGFzc3BhdGggZW50cnkKKyAqCQltdXN0IHNwZWNpZnkgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIEpBUiAob3Igcm9vdCBmb2xkZXIpLCBhbmQgaW4gY2FzZSBpdCByZWZlcnMKKyAqCQl0byBhbiBleHRlcm5hbCBKQVIsIHRoZW4gdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCByZXNvdXJjZSBpbiB0aGUgd29ya2JlbmNoLiBFbnRyaWVzIAorICoJCW9mIHRoaXMga2luZCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5DUEVfTElCUkFSWTwvY29kZT4gY29uc3RhbnQuPC9saT4KKyAqIAorICoJPGxpPkEgcmVxdWlyZWQgcHJvamVjdC4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyeSBpZGVudGlmaWVzIGFub3RoZXIgcHJvamVjdCBpbgorICoJCXRoZSB3b3Jrc3BhY2UuIFRoZSByZXF1aXJlZCBwcm9qZWN0IGlzIHVzZWQgYXMgYSBiaW5hcnkgbGlicmFyeSB3aGVuIGNvbXBpbGluZworICoJCSh0aGF0IGlzLCB0aGUgYnVpbGRlciBsb29rcyBpbiB0aGUgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSByZXF1aXJlZCBwcm9qZWN0CisgKgkJZm9yIHJlcXVpcmVkIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgd2hlbiBidWlsZGluZykuIFdoZW4gcGVyZm9ybWluZyBvdGhlcgorICoJCSJkZXZlbG9wbWVudCIgb3BlcmF0aW9ucyAtIHN1Y2ggYXMgY29kZSBhc3Npc3QsIGNvZGUgcmVzb2x2ZSwgdHlwZSBoaWVyYXJjaHkKKyAqCQljcmVhdGlvbiwgZXRjLiAtIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcHJvamVjdCBpcyByZWZlcnJlZCB0by4gVGh1cywgZGV2ZWxvcG1lbnQKKyAqCQlpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIHJlcXVpcmVkIHByb2plY3QncyBzb3VyY2UgY29kZSwgYW5kIGNvbXBpbGF0aW9uIGlzIAorICoJCXBlcmZvcm1lZCBhZ2FpbnN0IGEgcmVxdWlyZWQgcHJvamVjdCdzIGxhc3QgYnVpbHQgc3RhdGUuICBUaGUKKyAqCQljbGFzc3BhdGggZW50cnkgbXVzdCBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZQorICoJCXByb2plY3QuIEVudHJpZXMgb2YgdGhpcyBraW5kIGFyZSAgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4KKyAqCQljb25zdGFudC4gCisgKiAJCU5vdGU6IHJlZmVyZW5jaW5nIGEgcmVxdWlyZWQgcHJvamVjdCB3aXRoIGEgY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byB0aGUgc291cmNlIAorICogICAgIGNvZGUgb3IgYXNzb2NpYXRlZCA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGxvY2F0ZWQgaW4gaXRzIG91dHB1dCBsb2NhdGlvbi4gCisgKiAgICAgSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbnkgb3RoZXIgbGlicmFyaWVzIG9yIHByb2plY3RzIHRoYXQgdGhlIHJlcXVpcmVkIHByb2plY3QncyBjbGFzc3BhdGggCisgKiAgICAgcmVmZXJzIHRvLCBpZmYgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJpZXMgYXJlIHRhZ2dlZCBhcyBiZWluZyBleHBvcnRlZCAKKyAqICAgICAoPGNvZGU+SUNsYXNzcGF0aEVudHJ5I2lzRXhwb3J0ZWQ8L2NvZGU+KS4gCisgKiAgICBVbmxlc3MgZXhwb3J0aW5nIHNvbWUgY2xhc3NwYXRoIGVudHJpZXMsIGNsYXNzcGF0aHMgYXJlIG5vdCBjaGFpbmVkIGJ5IGRlZmF1bHQgLSAKKyAqICAgIGVhY2ggcHJvamVjdCBtdXN0IHNwZWNpZnkgaXRzIG93biBjbGFzc3BhdGggaW4gaXRzIGVudGlyZXR5LjwvbGk+CisgKiAKKyAqICA8bGk+IEEgcGF0aCBiZWdpbm5pbmcgaW4gYSBjbGFzc3BhdGggdmFyaWFibGUgZGVmaW5lZCBnbG9iYWxseSB0byB0aGUgd29ya3NwYWNlLgorICoJCUVudHJpZXMgb2YgdGhpcyBraW5kIGFyZSAgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5DUEVfVkFSSUFCTEU8L2NvZGU+IGNvbnN0YW50LiAgCisgKiAgICAgIENsYXNzcGF0aCB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgdXNpbmcgPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoVmFyaWFibGU8L2NvZGU+LAorICogCQlhbmQgZ2V0cyByZXNvbHZlZCwgdG8gZWl0aGVyIGEgcHJvamVjdCBvciBsaWJyYXJ5IGVudHJ5LCB1c2luZworICogICAgICA8Y29kZT5KYXZhQ29yZSNnZXRSZXNvbHZlZENsYXNzcGF0aFZhcmlhYmxlPC9jb2RlPi4KKyAqCQlJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIGFuIGF1dG9tYXRpYyBpbml0aWFsaXplciAoPGNvZGU+Q2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvY29kZT4pLAorICogCXdoaWNoIHdpbGwgYmUgaW52b2tlZCB0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiLgorICogCUFmdGVyIHJlc29sdXRpb24sIGEgY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJ5IG1heSBlaXRoZXIgY29ycmVzcG9uZCB0byBhIHByb2plY3Qgb3IgYSBsaWJyYXJ5IGVudHJ5LiA8L2xpPgorICogCisgKiAgPGxpPiBBIG5hbWVkIGNsYXNzcGF0aCBjb250YWluZXIgaWRlbnRpZmllZCBieSBpdHMgY29udGFpbmVyIHBhdGguCisgKiAgICAgQSBjbGFzc3BhdGggY29udGFpbmVyIHByb3ZpZGVzIGEgd2F5IHRvIGluZGlyZWN0bHkgcmVmZXJlbmNlIGEgc2V0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHRocm91Z2gKKyAqICAgICBhIGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9DT05UQUlORVI8L2NvZGU+LiBUeXBpY2FsbHksIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW4KKyAqICAgICBiZSB1c2VkIHRvIGRlc2NyaWJlIGEgY29tcGxleCBsaWJyYXJ5IGNvbXBvc2VkIG9mIG11bHRpcGxlIEpBUnMsIHByb2plY3RzIG9yIGNsYXNzcGF0aCB2YXJpYWJsZXMsCisgKiAgICAgY29uc2lkZXJpbmcgYWxzbyB0aGF0IGNvbnRhaW5lcnMgY2FuIGJlIG1hcHBlZCBkaWZmZXJlbnRseSBvbiBlYWNoIHByb2plY3QuIFNldmVyYWwgcHJvamVjdHMgY2FuCisgKiAgICAgcmVmZXJlbmNlIHRoZSBzYW1lIGdlbmVyaWMgY29udGFpbmVyIHBhdGgsIGJ1dCBoYXZlIGVhY2ggb2YgdGhlbSBhY3R1YWxseSBib3VuZCB0byBhIGRpZmZlcmVudAorICogICAgIGNvbnRhaW5lciBvYmplY3QuCisgKiAgICAgVGhlIGNvbnRhaW5lciBwYXRoIGlzIGEgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLCAKKyAqICAgICB3aGljaCBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHZpbmcgdGhpcyBjb250YWluZXIgcmVmZXJlbmNlLiBJZiBubyBjb250YWluZXIgd2FzIGV2ZXIgCisgKiAgICAgcmVjb3JkZWQgZm9yIHRoaXMgY29udGFpbmVyIHBhdGggb250byB0aGlzIHByb2plY3QgKHVzaW5nIDxjb2RlPnNldENsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4sIAorICogCXRoZW4gYSA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gd2lsbCBiZSBhY3RpdmF0ZWQgaWYgYW55IHdhcyByZWdpc3RlcmVkIGZvciB0aGlzIAorICogCWNvbnRhaW5lciBJRCBvbnRvIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi4KKyAqIAlBIGNsYXNzcGF0aCBjb250YWluZXIgZW50cnkgY2FuIGJlIHJlc29sdmVkIGV4cGxpY2l0bHkgdXNpbmcgPGNvZGU+SmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPgorICogCWFuZCB0aGUgcmVzdWx0aW5nIGNvbnRhaW5lciBlbnRyaWVzIGNhbiBjb250YWluIGFueSBub24tY29udGFpbmVyIGVudHJ5LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXkgY29udGFpbiB2YXJpYWJsZQorICogICAgIGVudHJpZXMsIHdoaWNoIGluIHR1cm4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGJlaW5nIGRpcmVjdGx5IHVzZWQuIAorICogCTxicj4gQWxzbyBub3RlIHRoYXQgdGhlIGNvbnRhaW5lciByZXNvbHV0aW9uIEFQSXMgaW5jbHVkZSBhbiBJSmF2YVByb2plY3QgYXJndW1lbnQsIHNvIGFzIHRvIGFsbG93IHRoZSBzYW1lCisgKiAJY29udGFpbmVyIHBhdGggdG8gYmUgaW50ZXJwcmV0ZWQgaW4gZGlmZmVyZW50IHdheXMgZm9yIGRpZmZlcmVudCBwcm9qZWN0cy4gPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBUaGUgcmVzdWx0IG9mIDxjb2RlPklKYXZhUHJvamVjdCNnZXRSZXNvbHZlZENsYXNzcGF0aDwvY29kZT4gd2lsbCBoYXZlIGFsbCBlbnRyaWVzIG9mIHR5cGUKKyAqIDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4gYW5kIDxjb2RlPkNQRV9DT05UQUlORVI8L2NvZGU+IHJlc29sdmVkIHRvIGEgc2V0IG9mIAorICogPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4sIDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPiBvciA8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4KKyAqIGNsYXNzcGF0aCBlbnRyaWVzLgorICogPHA+CisgKiBBbnkgY2xhc3NwYXRoIGVudHJ5IG90aGVyIHRoYW4gYSBzb3VyY2UgZm9sZGVyIChraW5kIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+KSBjYW4KKyAqIGJlIG1hcmtlZCBhcyBiZWluZyBleHBvcnRlZC4gRXhwb3J0ZWQgZW50cmllcyBhcmUgYXV0b21hdGljYWxseSBjb250cmlidXRlZCB0bworICogZGVwZW5kZW50IHByb2plY3RzLCBhbG9uZyB3aXRoIHRoZSBwcm9qZWN0J3Mgb3V0cHV0IGZvbGRlciwgd2hpY2ggaXMgaW1wbGljaXRseQorICogZXhwb3J0ZWQuIFRoZSBwcm9qZWN0J3Mgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgbGlzdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUKKyAqIGFueSBleHBvcnRlZCBlbnRyaWVzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIENsYXNzcGF0aCBlbnRyaWVzIGNhbiBiZSBjcmVhdGVkIHZpYSBtZXRob2RzIG9uIDxjb2RlPkphdmFDb3JlPC9jb2RlPi4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIEphdmFDb3JlI25ld0xpYnJhcnlFbnRyeQorICogQHNlZSBKYXZhQ29yZSNuZXdQcm9qZWN0RW50cnkKKyAqIEBzZWUgSmF2YUNvcmUjbmV3U291cmNlRW50cnkKKyAqIEBzZWUgSmF2YUNvcmUjbmV3VmFyaWFibGVFbnRyeQorICogQHNlZSBKYXZhQ29yZSNuZXdDb250YWluZXJFbnRyeQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aEVudHJ5IHsKKworCS8qKgorCSAqIEVudHJ5IGtpbmQgY29uc3RhbnQgZGVzY3JpYmluZyBhIGNsYXNzcGF0aCBlbnRyeSBpZGVudGlmeWluZyBhCisJICogbGlicmFyeS4gQSBsaWJyYXJ5IGlzIGEgZm9sZGVyIG9yIEpBUiBjb250YWluaW5nIHBhY2thZ2UKKwkgKiBmcmFnbWVudHMgY29uc2lzdGluZyBvZiBwcmUtY29tcGlsZWQgYmluYXJpZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BFX0xJQlJBUlkgPSAxOworCisJLyoqCisJICogRW50cnkga2luZCBjb25zdGFudCBkZXNjcmliaW5nIGEgY2xhc3NwYXRoIGVudHJ5IGlkZW50aWZ5aW5nIGEKKwkgKiByZXF1aXJlZCBwcm9qZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENQRV9QUk9KRUNUID0gMjsKKworCS8qKgorCSAqIEVudHJ5IGtpbmQgY29uc3RhbnQgZGVzY3JpYmluZyBhIGNsYXNzcGF0aCBlbnRyeSBpZGVudGlmeWluZyBhCisJICogZm9sZGVyIGNvbnRhaW5pbmcgcGFja2FnZSBmcmFnbWVudHMgd2l0aCBzb3VyY2UgY29kZQorCSAqIHRvIGJlIGNvbXBpbGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENQRV9TT1VSQ0UgPSAzOworCisJLyoqCisJICogRW50cnkga2luZCBjb25zdGFudCBkZXNjcmliaW5nIGEgY2xhc3NwYXRoIGVudHJ5IGRlZmluZWQgdXNpbmcKKwkgKiBhIHBhdGggdGhhdCBiZWdpbnMgd2l0aCBhIGNsYXNzcGF0aCB2YXJpYWJsZSByZWZlcmVuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BFX1ZBUklBQkxFID0gNDsKKworCS8qKgorCSAqIEVudHJ5IGtpbmQgY29uc3RhbnQgZGVzY3JpYmluZyBhIGNsYXNzcGF0aCBlbnRyeSByZXByZXNlbnRpbmcKKwkgKiBhIG5hbWUgY2xhc3NwYXRoIGNvbnRhaW5lci4KKwkgKiAKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BFX0NPTlRBSU5FUiA9IDU7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGZpbGVzIGZvdW5kIGluIHRoZSBwYWNrYWdlIGZyYWdtZW50cyBpZGVudGlmaWVkIGJ5IHRoaXMKKwkgKiBjbGFzc3BhdGggZW50cnkuCisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFPC9jb2RlPiBmb3IgZmlsZXMgY29udGFpbmluZworCSAqICAgc291cmNlIGNvZGUsIGFuZCA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWTwvY29kZT4gZm9yIGJpbmFyeQorCSAqICAgY2xhc3MgZmlsZXMuCisJICogICBUaGVyZSBpcyBubyBzcGVjaWZpZWQgdmFsdWUgZm9yIGFuIGVudHJ5IGRlbm90aW5nIGEgdmFyaWFibGUgKDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4pCisJICogICBvciBhIGNsYXNzcGF0aCBjb250YWluZXIgKDxjb2RlPkNQRV9DT05UQUlORVI8L2NvZGU+KS4KKwkgKi8KKwlpbnQgZ2V0Q29udGVudEtpbmQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBjbGFzc3BhdGggZW50cnkuCisJICoKKwkgKiBAcmV0dXJuIG9uZSBvZjoKKwkgKiA8dWw+CisJICogPGxpPjxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IC0gdGhpcyBlbnRyeSBkZXNjcmliZXMgYSBzb3VyY2Ugcm9vdCBpbgorCSAJCWl0cyBwcm9qZWN0CisJICogPGxpPjxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPiAtIHRoaXMgZW50cnkgZGVzY3JpYmVzIGEgZm9sZGVyIG9yIEpBUgorCSAJCWNvbnRhaW5pbmcgYmluYXJpZXMKKwkgKiA8bGk+PGNvZGU+Q1BFX1BST0pFQ1Q8L2NvZGU+IC0gdGhpcyBlbnRyeSBkZXNjcmliZXMgYW5vdGhlciBwcm9qZWN0CisJICoKKwkgKiA8bGk+PGNvZGU+Q1BFX1ZBUklBQkxFPC9jb2RlPiAtIHRoaXMgZW50cnkgZGVzY3JpYmVzIGEgcHJvamVjdCBvciBsaWJyYXJ5CisJICogIAlpbmRpcmVjdGx5IHZpYSBhIGNsYXNzcGF0aCB2YXJpYWJsZSBpbiB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aAorCSAqICoKKwkgKiA8bGk+PGNvZGU+Q1BFX0NPTlRBSU5FUjwvY29kZT4gLSB0aGlzIGVudHJ5IGRlc2NyaWJlcyBzZXQgb2YgZW50cmllcworCSAqICAJcmVmZXJlbmNlZCBpbmRpcmVjdGx5IHZpYSBhIGNsYXNzcGF0aCBjb250YWluZXIKKwkgKiA8L3VsPgorCSAqLworCWludCBnZXRFbnRyeUtpbmQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhpcyBjbGFzc3BhdGggZW50cnkuCisJICoKKwkgKiBUaGUgbWVhbmluZyBvZiB0aGUgcGF0aCBvZiBhIGNsYXNzcGF0aCBlbnRyeSBkZXBlbmRzIG9uIGl0cyBlbnRyeSBraW5kOjx1bD4KKwkgKgk8bGk+U291cmNlIGNvZGUgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCAoPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4pIC0gIAorCSAqICAgICAgVGhlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50cnkgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJvb3QgZm9sZGVyLiA8L2xpPgorCSAqCTxsaT5BIGJpbmFyeSBsaWJyYXJ5IGluIHRoZSBjdXJyZW50IHByb2plY3QgKDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPikgLSB0aGUgcGF0aAorCSAqCQlhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeSBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgSkFSIChvciByb290IGZvbGRlciksIGFuZCAKKwkgKgkJaW4gY2FzZSBpdCByZWZlcnMgdG8gYW4gZXh0ZXJuYWwgSkFSLCB0aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UgaW4gCisJICoJCXRoZSB3b3JrYmVuY2guCisJICoJPGxpPkEgcmVxdWlyZWQgcHJvamVjdCAoPGNvZGU+Q1BFX1BST0pFQ1Q8L2NvZGU+KSAtIHRoZSBwYXRoIG9mIHRoZSBlbnRyeSBkZW5vdGVzIHRoZQorCSAqCQlwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcmVzb3VyY2UuPC9saT4KKwkgKiAgPGxpPkEgdmFyaWFibGUgZW50cnkgKDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4pIC0gdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGggCisJICogICAgICBpcyB0aGUgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZS4gSWYgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUKKwkgKgkJaXMgYm91bmQgdG8gdGhlIHBhdGggPGl0PlA8L2l0PiwgdGhlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJ5CisJICoJCWlzIGNvbXB1dGVkIGJ5IGFwcGVuZGluZyB0byA8aXQ+UDwvaXQ+IHRoZSBzZWdtZW50cyBvZiB0aGUgcmV0dXJuZWQKKwkgKgkJcGF0aCB3aXRob3V0IHRoZSB2YXJpYWJsZS48L2xpPgorCSAqICA8bGk+IEEgY29udGFpbmVyIGVudHJ5ICg8Y29kZT5DUEVfQ09OVEFJTkVSPC9jb2RlPikgLSB0aGUgcGF0aCBvZiB0aGUgZW50cnkKKwkgKiAJaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCBjb250YWluZXIsIHdoaWNoIGNhbiBiZSBib3VuZCBpbmRpcmVjdGx5IHRvIGEgc2V0IG9mIGNsYXNzcGF0aCAKKwkgKiAJZW50cmllcyBhZnRlciByZXNvbHV0aW9uLiBUaGUgY29udGFpbmVyUGF0aCBpcyBhIGZvcm1lZCBieSBhIGZpcnN0IElEIHNlZ21lbnQgZm9sbG93ZWQgd2l0aCAKKwkgKiAgICAgZXh0cmEgc2VnbWVudHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHZpbmcgdGhpcyBjb250YWluZXIgCisJICogCXJlZmVyZW5jZSAoYWxzbyBzZWUgPGNvZGU+SUNsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4pLgorCSAqIDwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHBhdGggb2YgdGhpcyBjbGFzc3BhdGggZW50cnkKKwkgKi8KKwlJUGF0aCBnZXRQYXRoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjbGFzc3BhdGggZW50cnkgaGFzIG5vCisJICogc291cmNlIGF0dGFjaG1lbnQuCisJICogPHA+CisJICogT25seSBsaWJyYXJ5IGFuZCB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcyBtYXkgaGF2ZSBzb3VyY2UgYXR0YWNobWVudHMuCisJICogRm9yIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJpZXMsIHRoZSByZXN1bHQgcGF0aCAoaWYgcHJlc2VudCkgbG9jYXRlcyBhIHNvdXJjZQorCSAqIGFyY2hpdmUuIEZvciB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcywgdGhlIHJlc3VsdCBwYXRoIChpZiBwcmVzZW50KSBoYXMKKwkgKiBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUgdmFyaWFibGUgcGF0aCwgbmFtZWx5IHRoZSBmaXJzdCBzZWdtZW50IAorCSAqIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBhcmNoaXZlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSB3aGVyZSBwYWNrYWdlIGZyYWdtZW50cworCSAqIGFyZSBsb2NhdGVkLiBBbiBlbXB0eSBwYXRoIGluZGljYXRlcyB0aGF0IHBhY2thZ2VzIGFyZSBsb2NhdGVkIGF0CisJICogdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSBhcmNoaXZlLiBSZXR1cm5zIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHZhbHVlCisJICogaWYgYW5kIG9ubHkgaWYgPGNvZGU+Z2V0U291cmNlQXR0YWNobWVudFBhdGg8L2NvZGU+IHJldHVybnMgCisJICogYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwYXRoIHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogICAgbm90IGFwcGxpY2FibGUKKwkgKi8KKwlJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBleHBvcnRlZCB0byBkZXBlbmRlbnQgcHJvamVjdHMuCisJICogQWx3YXlzIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBzb3VyY2UgZW50cmllcyAoa2luZAorCSAqIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+KSwgd2hpY2ggY2Fubm90IGJlIGV4cG9ydGVkLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXhwb3J0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICogQHNpbmNlIDIuMAorCSAqLworCWJvb2xlYW4gaXNFeHBvcnRlZCgpOworCQorCS8qKgorCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgZGVub3RlZCAKKwkgKiBieSBhbiBlbnRyeSAoaWYgaXQgaXMgYSB2YXJpYWJsZSBlbnRyeSkuIEl0IGlzIG9idGFpbmVkIGJ5IHJlc29sdmluZyB0aGUgdmFyaWFibGUgCisJICogcmVmZXJlbmNlIGluIHRoZSBmaXJzdCBzZWdtZW50LiBSZXR1cm5zIDxub2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZXNvbHZlIHVzaW5nIAorCSAqIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorCSAqIDx1bD4KKwkgKiA8bGk+IGlmIHZhcmlhYmxlIHNlZ21lbnQgY2Fubm90IGJlIHJlc29sdmVkLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KKwkgKiA8bGk+IGZpbmRzIGEgcHJvamVjdCwgSkFSIG9yIGJpbmFyeSBmb2xkZXIgaW4gdGhlIHdvcmtzcGFjZSBhdCB0aGUgcmVzb2x2ZWQgcGF0aCBsb2NhdGlvbjwvbGk+CisJICogPGxpPiBpZiBub25lIGZpbmRzIGFuIGV4dGVybmFsIEpBUiBmaWxlIG9yIGZvbGRlciBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgYXQgdGhlIHJlc29sdmVkIHBhdGggbG9jYXRpb24gPC9saT4KKwkgKiA8bGk+IGlmIG5vbmUgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiA8cD4KKwkgKiBWYXJpYWJsZSBzb3VyY2UgYXR0YWNobWVudCBpcyBhbHNvIHJlc29sdmVkIGFuZCByZWNvcmRlZCBpbiB0aGUgcmVzdWx0aW5nIGNsYXNzcGF0aCBlbnRyeS4KKwkgKiA8cD4KKwkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBsaWJyYXJ5IG9yIHByb2plY3QgY2xhc3NwYXRoIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqICAgaWYgdGhlIGdpdmVuIHBhdGggY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGEgY2xhc3NwYXRoIGVudHJ5CisJICoJPHA+IAorCSAqIE5vdGUgdGhhdCB0aGlzIGRlcHJlY2F0ZWQgQVBJIGRvZXNuJ3QgaGFuZGxlIENQRV9DT05UQUlORVIgZW50cmllcy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCAtIHVzZSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KC4uLikKKwkgKi8KKwlJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRFbnRyeSgpOwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUFzc2lzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVBc3Npc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGRkNTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVBc3Npc3QuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHNvdXJjZSBjb2RlIGFzc2lzdCBhbmQgY29kZQorICogcmVzb2x2ZS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvZGVBc3Npc3QgeworCisJLyoqCisJICogUGVyZm9ybXMgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LAorCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4gVGhlIDxjb2RlPm9mZnNldDwvY29kZT4KKwkgKiBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLCBhZnRlciB3aGljaCBjb2RlIGFzc2lzdCBpcyBkZXNpcmVkLgorCSAqIEFuIDxjb2RlPm9mZnNldDwvY29kZT4gb2YgLTEgaW5kaWNhdGVzIHRvIGNvZGUgYXNzaXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcworCSAqIGNvbXBpbGF0aW9uIHVuaXQuCisJICoKKwkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24KKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3RvcgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgYXNzaXN0IGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIFJlYXNvbnMgaW5jbHVkZTo8dWw+CisJICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqICA8bGk+IFRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaXMgPCAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhpcyBjb21waWxhdGlvbiB1bml0J3MKKwkgKiAgICAgIHNvdXJjZSBsZW5ndGggKElOREVYX09VVF9PRl9CT1VORFMpCisJICogPC91bD4KKwkgKgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnJlcXVlc3RvcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAc2luY2UgMi4wCisJICogCSAqLworCXZvaWQgY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIElDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkvKioKKwkgKiBQZXJmb3JtcyBjb2RlIHNlbGVjdGlvbiBvbiB0aGUgZ2l2ZW4gc2VsZWN0ZWQgdGV4dCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiByZXF1ZXN0b3IuIFRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+CisJICogaXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGZpcnN0IHNlbGVjdGVkIGNoYXJhY3Rlci4gVGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gCisJICogaXMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzLgorCSAqIAorCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGdpdmVuIG9mZnNldCBwb3NpdGlvbgorCSAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBjb2RlIHJlc29sdmUgY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqICA8bGk+VGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiAgPGxpPiBUaGUgcmFuZ2Ugc3BlY2lmaWVkIGlzIG5vdCB3aXRoaW4gdGhpcyBlbGVtZW50J3MKKwkgKiAgICAgIHNvdXJjZSByYW5nZSAoSU5ERVhfT1VUX09GX0JPVU5EUykKKwkgKiA8L3VsPgorCSAqCisJICovCisJSUphdmFFbGVtZW50W10gY29kZVNlbGVjdChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUGVyZm9ybXMgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LAorCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4gVGhlIDxjb2RlPm9mZnNldDwvY29kZT4KKwkgKiBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLCBhZnRlciB3aGljaCBjb2RlIGFzc2lzdCBpcyBkZXNpcmVkLgorCSAqIEFuIDxjb2RlPm9mZnNldDwvY29kZT4gb2YgLTEgaW5kaWNhdGVzIHRvIGNvZGUgYXNzaXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcworCSAqIGNvbXBpbGF0aW9uIHVuaXQuCisJICogCisJICogQHBhcmFtIG9mZnNldCB0aGUgZ2l2ZW4gb2Zmc2V0IHBvc2l0aW9uCisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgZ2l2ZW4gY29tcGxldGlvbiByZXF1ZXN0b3IKKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgYXNzaXN0IGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIFJlYXNvbnMgaW5jbHVkZTo8dWw+CisJICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqICA8bGk+IFRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaXMgPCAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhpcyBjb21waWxhdGlvbiB1bml0J3MKKwkgKiAgICAgIHNvdXJjZSBsZW5ndGggKElOREVYX09VVF9PRl9CT1VORFMpCisJICogPC91bD4KKwkgKgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnJlcXVlc3RvcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAZGVwcmVjYXRlZCAtIHVzZSBjb2RlQ29tcGxldGUoaW50LCBJQ29tcGxldGlvblJlcXVlc3RvcikgaW5zdGVhZAorCSAqLworCXZvaWQgY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIElDb2RlQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWM0YzljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKKworLyoqCisgKiBBIGNvbXBsZXRpb24gcmVxdWVzdG9yIGFjY2VwdHMgcmVzdWx0cyBhcyB0aGV5IGFyZSBjb21wdXRlZCBhbmQgaXMgYXdhcmUKKyAqIG9mIHNvdXJjZSBwb3NpdGlvbnMgdG8gY29tcGxldGUgdGhlIHZhcmlvdXMgZGlmZmVyZW50IHJlc3VsdHMuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKKyAqIEBzZWUgSUNvZGVBc3Npc3QKKyAqIEBkZXByZWNhdGVkIFVzZSBhbiBJQ29tcGxldGlvblJlcXVlc3RvciBpbnN0ZWFkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgY2xhc3MgY29tcGxldGlvbi4KKyAqIAorICogQHJldHVybiB2b2lkIC0gTm90aGluZyBpcyBhbnN3ZXJlZCBiYWNrIHRvIGNvZGUgYXNzaXN0IGVuZ2luZQorICoKKyAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcy4KKyAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSBjbGFzcy4KKyAqICAgQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCBjbGFzc2VzLgorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcy4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRDbGFzcygKKwljaGFyW10gcGFja2FnZU5hbWUsCisJY2hhcltdIGNsYXNzTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgY29tcGlsYXRpb24gZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIGNvbXBsZXRpb24uCisgKiAgQHBhcmFtIGVycm9yIE9ubHkgcHJvYmxlbXMgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGFzIGVycm9ycyBhcmUgbm90aWZpZWQgdG8gdGhlIHJlcXVlc3RvciwKKyAqCQl3YXJuaW5ncyBhcmUgc2lsZW50bHkgaWdub3JlZC4KKyAqCQlJbiBjYXNlIGFuIGVycm9yIGdvdCBzaWduYWxlZCwgbm8gb3RoZXIgY29tcGxldGlvbnMgbWlnaHQgYmUgYXZhaWxhYmxlLAorICoJCXRoZXJlZm9yZSB0aGUgcHJvYmxlbSBtZXNzYWdlIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisgKgkJVGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHByb2JsZW0gYXJlIHJlbGF0ZWQgdG8gdGhlIHNvdXJjZSB3aGVyZSBpdCB3YXMKKyAqCQlkZXRlY3RlZCAobWlnaHQgYmUgaW4gYW5vdGhlciBjb21waWxhdGlvbiB1bml0LCBpZiBpdCB3YXMgaW5kaXJlY3RseSByZXF1ZXN0ZWQKKyAqCQlkdXJpbmcgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3MpLgorICogICAgICBOb3RlOiB0aGUgcHJvYmxlbSBrbm93cyBpdHMgb3JpZ2luYXRpbmcgZmlsZSBuYW1lLgorICovCit2b2lkIGFjY2VwdEVycm9yKElNYXJrZXIgbWFya2VyKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgZmllbGQgY29tcGxldGlvbi4KKyAqCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLgorICogCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgZmllbGQuCisgKiAKKyAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkLgorICogCisgKiBAcGFyYW0gdHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgb2YgdGhpcyBmaWVsZCBpcyBkZWNsYXJlZC4KKyAqIAorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZC4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgZmllbGQuCisgKiAKKyAqIEBwYXJhbSBtb2RpZmllcnMgVGhlIG1vZGlmaWVycyBvZiB0aGlzIGZpZWxkLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4KKyAqCisgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKyAqICAgIEJhc2UgdHlwZXMgYXJlIGluIHRoZSBmb3JtICJpbnQiIG9yICJib29sZWFuIi4KKyAqICAgIEFycmF5IHR5cGVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIk1bXSIgb3IgImludFtdIi4KKyAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdEZpZWxkKAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCWNoYXJbXSBuYW1lLAorCWNoYXJbXSB0eXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHR5cGVOYW1lLAorCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYW4gaW50ZXJmYWNlIGNvbXBsZXRpb24uCisgKgorICogQHBhcmFtIHBhY2thZ2VOYW1lIERlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgaW50ZXJmYWNlLgorICogICBDYW4gaW5jbHVkZSAnOycgZm9yIGltcG9ydGVkIGludGVyZmFjZXMuCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4KKyAqCisgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKyAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdEludGVyZmFjZSgKKwljaGFyW10gcGFja2FnZU5hbWUsCisJY2hhcltdIGludGVyZmFjZU5hbWUsCisJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCWludCBtb2RpZmllcnMsCisJaW50IGNvbXBsZXRpb25TdGFydCwKKwlpbnQgY29tcGxldGlvbkVuZCk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGtleXdvcmQgY29tcGxldGlvbi4KKyAqCisgKiBAcGFyYW0ga2V5d29yZE5hbWUgVGhlIGtleXdvcmQgc291cmNlLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMga2V5d29yZC4KKyAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMga2V5d29yZC4KKyAqLwordm9pZCBhY2NlcHRLZXl3b3JkKGNoYXJbXSBrZXl3b3JkTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBsYWJlbCBjb21wbGV0aW9uLgorICoKKyAqIEByZXR1cm4gdm9pZCAtIE5vdGhpbmcgaXMgYW5zd2VyZWQgYmFjayB0byBjb2RlIGFzc2lzdCBlbmdpbmUKKyAqCisgKiBAcGFyYW0gbGFiZWxOYW1lIFRoZSBsYWJlbCBzb3VyY2UuCisgKiAKKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGxhYmVsLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGxhYmVsLgorICovCit2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUgY29tcGxldGlvbi4KKyAqCisgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBuZXcgbG9jYWwgdmFyaWFibGUuCisgKiAKKyAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KKyAqIAorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuCisgKiAKKyAqIEBwYXJhbSBtb2RpZmllcnMgVGhlIG1vZGlmaWVycyBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZS4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZS4KKyAqCisgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKyAqICAgIEJhc2UgdHlwZXMgYXJlIGluIHRoZSBmb3JtICJpbnQiIG9yICJib29sZWFuIi4KKyAqICAgIEFycmF5IHR5cGVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIk1bXSIgb3IgImludFtdIi4KKyAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoCisJY2hhcltdIG5hbWUsCisJY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwKKwljaGFyW10gdHlwZU5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbWV0aG9kIGNvbXBsZXRpb24uCisgKgorICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBuZXcgbWV0aG9kIGlzIGRlY2xhcmVkLgorICogCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLgorICogCisgKiBAcGFyYW0gc2VsZWN0b3IgTmFtZSBvZiB0aGUgbmV3IG1ldGhvZC4KKyAqIAorICogQHBhcmFtIHBhcmFtZXRlclBhY2thZ2VOYW1lcyBOYW1lcyBvZiB0aGUgcGFja2FnZXMgaW4gd2hpY2ggdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgZGVjbGFyZWQuCisgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJUeXBlTmFtZXMuCisgKiAKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZXMgTmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZXMuCisgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMuCisgKiAKKyAqIEBwYXJhbSByZXR1cm5UeXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgcmV0dXJuIHR5cGUgaXMgZGVjbGFyZWQuCisgKiAKKyAqIEBwYXJhbSByZXR1cm5UeXBlTmFtZSBOYW1lIG9mIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG5ldyBtZXRob2QsIHNob3VsZCBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBjb25zdHJ1Y3Rvci4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgbWV0aG9kLgorICogICAJQ2FuIGluY2x1ZGUgemVybywgb25lIG9yIHR3byBicmFja2V0cy4gSWYgdGhlIGNsb3NpbmcgYnJhY2tldCBpcyBpbmNsdWRlZCwgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYmVmb3JlIGl0LgorICogCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhpcyBuZXcgbWV0aG9kLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbWV0aG9kLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtZXRob2QuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuCisgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqCisgKiBOT1RFOiBwYXJhbWV0ZXIgbmFtZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIG1ldGhvZC4KKyAqLwordm9pZCBhY2NlcHRNZXRob2QoCisJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwKKwljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCisJY2hhcltdIHNlbGVjdG9yLAorCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywKKwljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsCisJY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwKKwljaGFyW10gcmV0dXJuVHlwZU5hbWUsCisJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCWludCBtb2RpZmllcnMsCisJaW50IGNvbXBsZXRpb25TdGFydCwKKwlpbnQgY29tcGxldGlvbkVuZCk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1vZGlmaWVyIGNvbXBsZXRpb24uCisgKgorICogQHJldHVybiB2b2lkIC0gTm90aGluZyBpcyBhbnN3ZXJlZCBiYWNrIHRvIGNvZGUgYXNzaXN0IGVuZ2luZQorICoKKyAqIEBwYXJhbSBtb2RpZmllck5hbWUgVGhlIG5ldyBtb2RpZmllci4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtb2RpZmllci4KKyAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IG1vZGlmaWVyLgorICovCit2b2lkIGFjY2VwdE1vZGlmaWVyKGNoYXJbXSBtb2RpZmllck5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgcGFja2FnZSBjb21wbGV0aW9uLgorICoKKyAqIEByZXR1cm4gdm9pZCAtIE5vdGhpbmcgaXMgYW5zd2VyZWQgYmFjayB0byBjb2RlIGFzc2lzdCBlbmdpbmUKKyAqCisgKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIHBhY2thZ2UuCisgKiAgIENhbiBpbmNsdWRlICcuKjsnIGZvciBpbXBvcnRzLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IHBhY2thZ2UuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBwYWNrYWdlLgorICoKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRQYWNrYWdlKAorCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IGNvbXBsZXRpb25TdGFydCwKKwlpbnQgY29tcGxldGlvbkVuZCk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIHR5cGUgY29tcGxldGlvbi4KKyAqIAorICogQHJldHVybiB2b2lkIC0gTm90aGluZyBpcyBhbnN3ZXJlZCBiYWNrIHRvIGNvZGUgYXNzaXN0IGVuZ2luZQorICoKKyAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSB0eXBlLgorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUuCisgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSB0eXBlLgorICogICBDYW4gaW5jbHVkZSAnOycgZm9yIGltcG9ydGVkIHR5cGVzLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSB0eXBlLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIHR5cGUuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRUeXBlKAorCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwljaGFyW10gdHlwZU5hbWUsCisJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmZDIwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogU3BlY2lmaWNhdGlvbiBmb3IgYSBnZW5lcmljIHNvdXJjZSBjb2RlIGZvcm1hdHRlci4gQ2xpZW50IHBsdWctaW5zIGNhbiBjb250cmlidXRlCisgKiBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gSUNvZGVGb3JtYXR0ZXIsIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciIuCisgKiBJbiBjYXNlIG5vbmUgaXMgZm91bmQsIGEgZGVmYXVsdCBmb3JtYXR0ZXIgY2FuIGJlIHByb3ZpZGVkIHRocm91Z2ggdGhlIFRvb2xGYWN0b3J5LgorICogCisgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoKQorICogQHNlZSBUb29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcihNYXAgb3B0aW9ucykKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29kZUZvcm1hdHRlciB7CisKKwkvKiogCisJICogRm9ybWF0cyB0aGUgU3RyaW5nIDxjb2RlPnNvdXJjZVN0cmluZzwvY29kZT4sCisJICogYW5kIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZm9ybWF0dGVkIHZlcnNpb24uCisJICogCisJICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIGZvcm1hdAorCSAqIEBwYXJhbSBpbmRlbnRhdGlvbkxldmVsIHRoZSBpbml0aWFsIGluZGVudGF0aW9uIGxldmVsLCB1c2VkIAorCSAqICAgICAgdG8gc2hpZnQgbGVmdC9yaWdodCB0aGUgZW50aXJlIHNvdXJjZSBmcmFnbWVudC4gQW4gaW5pdGlhbCBpbmRlbnRhdGlvbgorCSAqICAgICAgbGV2ZWwgb2YgemVybyBoYXMgbm8gZWZmZWN0LgorCSAqIEBwYXJhbSBwb3NpdGlvbnMgYW4gYXJyYXkgb2YgcG9zaXRpb25zIHRvIG1hcC4gVGhlc2UgYXJlCisJICogICAgICBjaGFyYWN0ZXItYmFzZWQgc291cmNlIHBvc2l0aW9ucyBpbnNpZGUgdGhlIG9yaWdpbmFsIHNvdXJjZSwKKwkgKiAgICAgZm9yIHdoaWNoIGNvcnJlc3BvbmRpbmcgcG9zaXRpb25zIGluIHRoZSBmb3JtYXR0ZWQgc291cmNlIHdpbGwKKwkgKiAgICAgYmUgY29tcHV0ZWQgKHNvIGFzIHRvIHJlbG9jYXRlIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwKKwkgKiAgICAgc291cmNlKS4gSXQgdXBkYXRlcyB0aGUgcG9zaXRpb25zIGFycmF5IHdpdGggdXBkYXRlZCBwb3NpdGlvbnMuCisJICogICAgIElmIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBubyBwb3NpdGlvbnMgYXJlIG1hcHBlZC4KKwkgKiBAcGFyYW0gbGluZVNlcGFyYXRvciB0aGUgbGluZSBzZXBhcmF0b3IgdG8gdXNlIGluIGZvcm1hdHRlZCBzb3VyY2UsCisJICogICAgIGlmIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgcGxhdGZvcm0gZGVmYXVsdCBvbmUgd2lsbCBiZSB1c2VkLgorCSAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBvdXRwdXQgc3RyaW5nLgorCSAqLworCVN0cmluZyBmb3JtYXQoU3RyaW5nIHN0cmluZywgaW50IGluZGVudGF0aW9uTGV2ZWwsIGludFtdIHBvc2l0aW9ucywgU3RyaW5nIGxpbmVTZXBhcmF0b3IpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBlbnRpcmUgSmF2YSBjb21waWxhdGlvbiB1bml0ICg8Y29kZT4uamF2YTwvY29kZT4gc291cmNlIGZpbGUpLgorICogQ29tcGlsYXRpb24gdW5pdCBlbGVtZW50cyBuZWVkIHRvIGJlIG9wZW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgbmF2aWdhdGVkIG9yIG1hbmlwdWxhdGVkLgorICogVGhlIGNoaWxkcmVuIGFyZSBvZiB0eXBlIDxjb2RlPklQYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+LAorICogPGNvZGU+SUltcG9ydENvbnRhaW5lcjwvY29kZT4sIGFuZCA8Y29kZT5JVHlwZTwvY29kZT4sCisgKiBhbmQgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZCBpbiB0aGUgc291cmNlLgorICogSWYgYSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSBjYW5ub3QgYmUgcGFyc2VkLCBpdHMgc3RydWN0dXJlIHJlbWFpbnMgdW5rbm93bi4KKyAqIFVzZSA8Y29kZT5JSmF2YUVsZW1lbnQuaXNTdHJ1Y3R1cmVLbm93bjwvY29kZT4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyAKKyAqIHRoZSBjYXNlLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgSUphdmFFbGVtZW50LCBJU291cmNlUmVmZXJlbmNlLCBJUGFyZW50LCBJT3BlbmFibGUsIElXb3JraW5nQ29weSwgSVNvdXJjZU1hbmlwdWxhdGlvbiwgSUNvZGVBc3Npc3QgeworLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGltcG9ydCBkZWNsYXJhdGlvbiBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgKiA8cD4KKyAqIE9wdGlvbmFsbHksIHRoZSBuZXcgZWxlbWVudCBjYW4gYmUgcG9zaXRpb25lZCBiZWZvcmUgdGhlIHNwZWNpZmllZAorICogc2libGluZy4gSWYgbm8gc2libGluZyBpcyBzcGVjaWZpZWQsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWQKKyAqIGFzIHRoZSBsYXN0IGltcG9ydCBkZWNsYXJhdGlvbiBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgKiA8cD4KKyAqIElmIHRoZSBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgaW5jbHVkZXMgdGhlIHNwZWNpZmllZCBpbXBvcnQgZGVjbGFyYXRpb24sCisgKiB0aGUgaW1wb3J0IGlzIG5vdCBnZW5lcmF0ZWQgKGl0IGRvZXMgbm90IGdlbmVyYXRlIGR1cGxpY2F0ZXMpLgorICogTm90ZSB0aGF0IGl0IGlzIHZhbGlkIHRvIHNwZWNpZnkgYm90aCBhIHNpbmdsZS10eXBlIGltcG9ydCBhbmQgYW4gb24tZGVtYW5kIGltcG9ydAorICogZm9yIHRoZSBzYW1lIHBhY2thZ2UsIGZvciBleGFtcGxlIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiBhbmQKKyAqIDxjb2RlPiJqYXZhLmlvLioiPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSBib3RoIGFyZSBwcmVzZXJ2ZWQgc2luY2UgdGhlIHNlbWFudGljcworICogb2YgdGhpcyBhcmUgbm90IHRoZSBzYW1lIGFzIGp1c3QgaW1wb3J0aW5nIDxjb2RlPiJqYXZhLmlvLioiPC9jb2RlPi4KKyAqIEltcG9ydGluZyA8Y29kZT4iamF2YS5sYW5nLioiPC9jb2RlPiwgb3IgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIGNvbXBpbGF0aW9uIHVuaXQKKyAqIGlzIGRlZmluZWQsIGFyZSBub3QgdHJlYXRlZCBhcyBzcGVjaWFsIGNhc2VzLiAgSWYgdGhleSBhcmUgc3BlY2lmaWVkLCB0aGV5IGFyZQorICogaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIHRvIGFkZCBhcyBkZWZpbmVkIGJ5IEpMUzIgNy41LiAoRm9yIGV4YW1wbGU6IDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiBvcgorICogIDxjb2RlPiJqYXZhLmF3dC4qIjwvY29kZT4pCisgKiBAcGFyYW0gc2libGluZyB0aGUgZXhpc3RpbmcgZWxlbWVudCB3aGljaCB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIHdpbGwgYmUgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIChpZgorICoJPGNvZGU+IG51bGwgPC9jb2RlPiwgdGhlbiB0aGlzIGltcG9ydCB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IGltcG9ydCBkZWNsYXJhdGlvbi4KKyAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIG5vdGlmeQorICogQHJldHVybiB0aGUgbmV3bHkgaW5zZXJ0ZWQgaW1wb3J0IGRlY2xhcmF0aW9uIChvciB0aGUgcHJldmlvdXNseSBleGlzdGluZyBvbmUgaW4gY2FzZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSkKKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciB0aGUgc3BlY2lmaWVkIHNpYmxpbmcgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKyAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisgKiA8bGk+IFRoZSBzcGVjaWZpZWQgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgKElOVkFMSURfU0lCTElORykKKyAqIDxsaT4gVGhlIG5hbWUgaXMgbm90IGEgdmFsaWQgaW1wb3J0IG5hbWUgKElOVkFMSURfTkFNRSkKKyAqIDwvdWw+CisgKi8KK0lJbXBvcnREZWNsYXJhdGlvbiBjcmVhdGVJbXBvcnQoU3RyaW5nIG5hbWUsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBwYWNrYWdlIGRlY2xhcmF0aW9uIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdAorICogd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lLgorICoKKyAqIDxwPklmIHRoZSBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgaW5jbHVkZXMgdGhlIHNwZWNpZmllZCBwYWNrYWdlIGRlY2xhcmF0aW9uLAorICogaXQgaXMgbm90IGdlbmVyYXRlZCAoaXQgZG9lcyBub3QgZ2VuZXJhdGUgZHVwbGljYXRlcykuCisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gdG8gYWRkIGFzIGRlZmluZWQgYnkgSkxTMiA3LjQuIChGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEubGFuZyI8L2NvZGU+KQorICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gbm90aWZ5CisgKiBAcmV0dXJuIHRoZSBuZXdseSBpbnNlcnRlZCBwYWNrYWdlIGRlY2xhcmF0aW9uIChvciB0aGUgcHJldmlvdXNseSBleGlzdGluZyBvbmUgaW4gY2FzZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSkKKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPlRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQorICogPGxpPiBUaGUgbmFtZSBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUgKElOVkFMSURfTkFNRSkKKyAqIDwvdWw+CisgKi8KKyBJUGFja2FnZURlY2xhcmF0aW9uIGNyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOyAgIAorLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUKKyAqIGdpdmVuIGNvbnRlbnRzLiBJZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgZG9lcyBub3QgZXhpc3QsIG9uZQorICogd2lsbCBiZSBjcmVhdGVkIHdpdGggYW4gYXBwcm9wcmlhdGUgcGFja2FnZSBkZWNsYXJhdGlvbi4KKyAqIDxwPgorICogT3B0aW9uYWxseSwgdGhlIG5ldyB0eXBlIGNhbiBiZSBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkCisgKiBzaWJsaW5nLiBJZiA8Y29kZT5zaWJsaW5nPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIHR5cGUgd2lsbCBiZSBhcHBlbmRlZAorICogdG8gdGhlIGVuZCBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgKgorICogPHA+SXQgaXMgcG9zc2libGUgdGhhdCBhIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KKyAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yY2U8L2NvZGU+IHBhcmFtZXRlciBlZmZlY3RzIHRoZSByZXNvbHV0aW9uIG9mCisgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgorICogPGxpPiA8Y29kZT50cnVlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSB0aGUgdHlwZSBpcyBjcmVhdGVkIHdpdGggdGhlIG5ldyBjb250ZW50czwvbGk+CisgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KKyAqIDwvdWw+CisgKgorICogQHBhcmFtIGNvbnRlbnRzIHRoZSBzb3VyY2UgY29udGVudHMgb2YgdGhlIHR5cGUgZGVjbGFyYXRpb24gdG8gYWRkLgorICogQHBhcmFtIHNpYmxpbmcgdGhlIGV4aXN0aW5nIGVsZW1lbnQgd2hpY2ggdGhlIHR5cGUgd2lsbCBiZSBpbnNlcnRlZCBpbW1lZGlhdGVseSBiZWZvcmUgKGlmCisgKgk8Y29kZT4gbnVsbCA8L2NvZGU+LCB0aGVuIHRoaXMgdHlwZSB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IHR5cGUgZGVjbGFyYXRpb24uCisgKiBAcGFyYW0gZm9yY2UgYSA8Y29kZT4gYm9vbGVhbiA8L2NvZGU+IGZsYWcgaW5kaWNhdGluZyBob3cgdG8gZGVhbCB3aXRoIGR1cGxpY2F0ZXMKKyAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIG5vdGlmeQorICogQHJldHVybiB0aGUgbmV3bHkgaW5zZXJ0ZWQgdHlwZQorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiA8bGk+VGhlIHNwZWNpZmllZCBzaWJsaW5nIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKyAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisgKiA8bGk+IFRoZSBzcGVjaWZpZWQgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgKElOVkFMSURfU0lCTElORykKKyAqIDxsaT4gVGhlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSByZWNvZ25pemVkIGFzIGEgdHlwZSBkZWNsYXJhdGlvbiAoSU5WQUxJRF9DT05URU5UUykKKyAqIDxsaT4gVGhlcmUgd2FzIGEgbmFtaW5nIGNvbGxpc2lvbiB3aXRoIGFuIGV4aXN0aW5nIHR5cGUgKE5BTUVfQ09MTElTSU9OKQorICogPC91bD4KKyAqLworSVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgYWxsIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpbiB0aGUgb3JkZXIKKyAqIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UuIAorICogVGhpcyBpbmNsdWRlcyBhbGwgdG9wLWxldmVsIHR5cGVzIGFuZCBuZXN0ZWQgbWVtYmVyIHR5cGVzLgorICogSXQgZG9lcyBOT1QgaW5jbHVkZSBsb2NhbCB0eXBlcyAodHlwZXMgZGVmaW5lZCBpbiBtZXRob2RzKS4KKyAqCisgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB0b3AtbGV2ZWwgYW5kIG1lbWJlciB0eXBlcyBkZWZpbmVkIGluIGEgY29tcGlsYXRpb24gdW5pdCwgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJVHlwZVtdIGdldEFsbFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgc21hbGxlc3QgZWxlbWVudCB3aXRoaW4gdGhpcyBjb21waWxhdGlvbiB1bml0IHRoYXQgCisgKiBpbmNsdWRlcyB0aGUgZ2l2ZW4gc291cmNlIHBvc2l0aW9uICh0aGF0IGlzLCBhIG1ldGhvZCwgZmllbGQsIGV0Yy4pLCBvcgorICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBvdGhlciB0aGFuIHRoZSBjb21waWxhdGlvbgorICogdW5pdCBpdHNlbGYgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBvciBpZiB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgbm90CisgKiB3aXRoaW4gdGhlIHNvdXJjZSByYW5nZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgKgorICogQHBhcmFtIHBvc2l0aW9uIGEgc291cmNlIHBvc2l0aW9uIGluc2lkZSB0aGUgY29tcGlsYXRpb24gdW5pdAorICogQHJldHVybiB0aGUgaW5uZXJtb3N0IEphdmEgZWxlbWVudCBlbmNsb3NpbmcgYSBnaXZlbiBzb3VyY2UgcG9zaXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqCWlmIG5vbmUgKGV4Y2x1ZGluZyB0aGUgY29tcGlsYXRpb24gdW5pdCkuCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gdW5pdCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisgKi8KK0lKYXZhRWxlbWVudCBnZXRFbGVtZW50QXQoaW50IHBvc2l0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBpbXBvcnQgZGVjbGFyYXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIG5hbWUuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiBUaGUgaW1wb3J0IGRlY2xhcmF0aW9uIG1heSBvciBtYXkgbm90IGV4aXN0LiBUaGlzCisgKiBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCAtIGltcG9ydHMgY2FuIGFsc28gYmUgYWNjZXNzZWQgZnJvbSBhIGNvbXBpbGF0aW9uIHVuaXQncworICogaW1wb3J0IGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0IHRvIGZpbmQgYXMgZGVmaW5lZCBieSBKTFMyIDcuNS4gKEZvciBleGFtcGxlOiA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4gCisgKiAJb3IgPGNvZGU+ImphdmEuYXd0LioiPC9jb2RlPikKKyAqIEByZXR1cm4gYSBoYW5kbGUgb250byB0aGUgY29ycmVzcG9uZGluZyBpbXBvcnQgZGVjbGFyYXRpb24uIFRoZSBpbXBvcnQgZGVjbGFyYXRpb24gbWF5IG9yIG1heSBub3QgZXhpc3QuCisgKi8KK0lJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIG5hbWUpIDsKKy8qKgorICogUmV0dXJucyB0aGUgaW1wb3J0IGNvbnRhaW5lciBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gVGhlIGltcG9ydCBjb250YWluZXIgbWF5IG9yCisgKiBtYXkgbm90IGV4aXN0LiBUaGUgaW1wb3J0IGNvbnRhaW5lciBjYW4gdXNlZCB0byBhY2Nlc3MgdGhlIAorICogaW1wb3J0cy4KKyAqIEByZXR1cm4gYSBoYW5kbGUgb250byB0aGUgY29ycmVzcG9uZGluZyBpbXBvcnQgY29udGFpbmVyLiBUaGUgCisgKgkJaW1wb3J0IGNvbnRhaW4gbWF5IG9yIG1heSBub3QgZXhpc3QuCisgKi8KK0lJbXBvcnRDb250YWluZXIgZ2V0SW1wb3J0Q29udGFpbmVyKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGltcG9ydCBkZWNsYXJhdGlvbnMgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0CisgKiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZS4gVGhpcyBpcworICogYSBjb252ZW5pZW5jZSBtZXRob2QgLSBpbXBvcnQgZGVjbGFyYXRpb25zIGNhbiBhbHNvIGJlCisgKiBhY2Nlc3NlZCBmcm9tIGEgY29tcGlsYXRpb24gdW5pdCdzIGltcG9ydCBjb250YWluZXIuCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqLworSUltcG9ydERlY2xhcmF0aW9uW10gZ2V0SW1wb3J0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IHBhY2thZ2UgZGVjbGFyYXRpb24gaW4gdGhpcyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIHBhY2thZ2UgbmFtZQorICogKHRoZXJlIG5vcm1hbGx5IGlzIGF0IG1vc3Qgb25lIHBhY2thZ2UgZGVjbGFyYXRpb24pLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gVGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gbWF5IG9yIG1heSBub3QgZXhpc3QuCisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gYXMgZGVmaW5lZCBieSBKTFMyIDcuNC4gKEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS5sYW5nIjwvY29kZT4pCisgKi8KK0lQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZURlY2xhcmF0aW9uKFN0cmluZyBuYW1lKTsKKy8qKgorICogUmV0dXJucyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0CisgKiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZS4KKyAqIFRoZXJlIG5vcm1hbGx5IGlzIGF0IG1vc3Qgb25lIHBhY2thZ2UgZGVjbGFyYXRpb24uCisgKgorICogQHJldHVybiBhbiBhcnJheSBvZiBwYWNrYWdlIGRlY2xhcmF0aW9uIChub3JtYWxseSBvZiBzaXplIG9uZSkKKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJUGFja2FnZURlY2xhcmF0aW9uW10gZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIHRvcC1sZXZlbCB0eXBlIGRlY2xhcmVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiBzaW1wbGUgdHlwZSBuYW1lLgorICogVGhlIHR5cGUgbmFtZSBoYXMgdG8gYmUgYSB2YWxpZCBjb21waWxhdGlvbiB1bml0IG5hbWUuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiBUaGUgdHlwZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGluIHRoZSBjb21waWxhdGlvbiB1bml0CisgKiBAcmV0dXJuIGEgaGFuZGxlIG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZS4gVGhlIHR5cGUgbWF5IG9yIG1heSBub3QgZXhpc3QuCisgKiBAc2VlIEphdmFDb252ZW50aW9ucyN2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUoU3RyaW5nIG5hbWUpCisgKi8KK0lUeXBlIGdldFR5cGUoU3RyaW5nIG5hbWUpOworLyoqCisgKiBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0CisgKiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZS4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJVHlwZVtdIGdldFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBsZXRpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjNzUyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSw0MDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CisKKy8qKgorICogQSBjb21wbGV0aW9uIHJlcXVlc3RvciBhY2NlcHRzIHJlc3VsdHMgYXMgdGhleSBhcmUgY29tcHV0ZWQgYW5kIGlzIGF3YXJlCisgKiBvZiBzb3VyY2UgcG9zaXRpb25zIHRvIGNvbXBsZXRlIHRoZSB2YXJpb3VzIGRpZmZlcmVudCByZXN1bHRzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIElDb2RlQXNzaXN0CisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXRpb25SZXF1ZXN0b3IgeworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYW4gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24gY29tcGxldGlvbi4KKyAqIEBwYXJhbSBzdXBlclR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHN1cGVyIHR5cGUgb2YgdGhpcyAKKyAqIAkJbmV3IGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uIC4KKyAqIAorICogQHBhcmFtIHN1cGVyVHlwZU5hbWUgTmFtZSBvZiB0aGUgc3VwZXIgdHlwZSBvZiB0aGlzIG5ldyBhbm9ueW1vdXMgdHlwZSBkZWNsYXJhdGlvbi4KKyAqIAorICogQHBhcmFtIHBhcmFtZXRlclBhY2thZ2VOYW1lcyBOYW1lcyBvZiB0aGUgcGFja2FnZXMgaW4gd2hpY2ggdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgZGVjbGFyZWQuCisgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJUeXBlTmFtZXMuCisgKiAKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZXMgTmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZXMuIAorICogCQlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclBhY2thZ2VOYW1lcy4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24uCisgKiAJCUNhbiBpbmNsdWRlIHplcm8sIG9uZSBvciB0d28gYnJhY2tldHMuIElmIHRoZSBjbG9zaW5nIGJyYWNrZXQgaXMgaW5jbHVkZWQsCisgKiAJCXRoZW4gdGhlIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSBpdC4KKyAqIAorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoZSBjb25zdHJ1Y3Rvci4KKyAqIAorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uLgorICogCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBhbm9ueW1vdXMgdHlwZSBkZWNsYXJhdGlvbi4KKyAqIAorICogQHBhcmFtIHJlbGV2YW5jZSBUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCisgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCisgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQorICogCQl2YWx1ZSBpcyBoaWdoZXIuCisgKiAKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgorICogICAgQXJyYXkgdHlwZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiTVtdIiBvciAiaW50W10iLgorICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKyAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisgKgorICogTk9URTogcGFyYW1ldGVyIG5hbWVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsIGFmdGVyIHRoZSB1c2VyIHNlbGVjdHMgYSBzcGVjaWZpYyBtZXRob2QuCisgKi8KK3ZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZSgKKwljaGFyW10gc3VwZXJUeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHN1cGVyVHlwZU5hbWUsCisJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKwljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kLAorCWludCByZWxldmFuY2UpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBjbGFzcyBjb21wbGV0aW9uLgorICogCisgKiBAcGFyYW0gcGFja2FnZU5hbWUgRGVjbGFyaW5nIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gY2xhc3NOYW1lIE5hbWUgb2YgdGhlIGNsYXNzLgorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgY2xhc3MuCUNhbiBpbmNsdWRlICc7JyBmb3IgaW1wb3J0ZWQgY2xhc3Nlcy4KKyAqIEBwYXJhbSBtb2RpZmllcnMgVGhlIG1vZGlmaWVycyBvZiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICogQHBhcmFtIHJlbGV2YW5jZSBUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCisgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCisgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQorICogCQl2YWx1ZSBpcyBoaWdoZXIuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRDbGFzcygKKwljaGFyW10gcGFja2FnZU5hbWUsCisJY2hhcltdIGNsYXNzTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kLAorCWludCByZWxldmFuY2UpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBjb21waWxhdGlvbiBlcnJvciBkZXRlY3RlZCBkdXJpbmcgY29tcGxldGlvbi4KKyAqICBAcGFyYW0gZXJyb3IgT25seSBwcm9ibGVtcyB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYXMgbm9uLXN5bnRheCBlcnJvcnMgYXJlIG5vdGlmaWVkIHRvIHRoZSAKKyAqICAgICByZXF1ZXN0b3IsIHdhcm5pbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICoJCUluIGNhc2UgYW4gZXJyb3IgZ290IHNpZ25hbGxlZCwgbm8gb3RoZXIgY29tcGxldGlvbnMgbWlnaHQgYmUgYXZhaWxhYmxlLAorICoJCXRoZXJlZm9yZSB0aGUgcHJvYmxlbSBtZXNzYWdlIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisgKgkJVGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHByb2JsZW0gYXJlIHJlbGF0ZWQgdG8gdGhlIHNvdXJjZSB3aGVyZSBpdCB3YXMKKyAqCQlkZXRlY3RlZCAobWlnaHQgYmUgaW4gYW5vdGhlciBjb21waWxhdGlvbiB1bml0LCBpZiBpdCB3YXMgaW5kaXJlY3RseSByZXF1ZXN0ZWQKKyAqCQlkdXJpbmcgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3MpLgorICogICAgICBOb3RlOiB0aGUgcHJvYmxlbSBrbm93cyBpdHMgb3JpZ2luYXRpbmcgZmlsZSBuYW1lLgorICovCit2b2lkIGFjY2VwdEVycm9yKElQcm9ibGVtIGVycm9yKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgZmllbGQgY29tcGxldGlvbi4KKyAqIAorICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZCBpcyBkZWNsYXJlZC4KKyAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmluZyB0aGlzIG5ldyBmaWVsZC4KKyAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMgZGVjbGFyZWQuCisgKiBAcGFyYW0gdHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgZmllbGQuCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhpcyBmaWVsZC4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICogCisgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKyAqICAgIEJhc2UgdHlwZXMgYXJlIGluIHRoZSBmb3JtICJpbnQiIG9yICJib29sZWFuIi4KKyAqICAgIEFycmF5IHR5cGVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIk1bXSIgb3IgImludFtdIi4KKyAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdEZpZWxkKAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCWNoYXJbXSBuYW1lLAorCWNoYXJbXSB0eXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHR5cGVOYW1lLAorCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQsCisJaW50IHJlbGV2YW5jZSk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhbiBpbnRlcmZhY2UgY29tcGxldGlvbi4KKyAqIAorICogQHBhcmFtIHBhY2thZ2VOYW1lIERlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjbGFzc05hbWUgTmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgaW50ZXJmYWNlLglDYW4gaW5jbHVkZSAnOycgZm9yIGltcG9ydGVkIGludGVyZmFjZXMuCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICoKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKyAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisgKi8KK3ZvaWQgYWNjZXB0SW50ZXJmYWNlKAorCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwljaGFyW10gaW50ZXJmYWNlTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kLAorCWludCByZWxldmFuY2UpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBrZXl3b3JkIGNvbXBsZXRpb24uCisgKiBAcGFyYW0ga2V5d29yZE5hbWUgVGhlIGtleXdvcmQgc291cmNlLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMga2V5d29yZC4KKyAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMga2V5d29yZC4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICovCit2b2lkIGFjY2VwdEtleXdvcmQoY2hhcltdIGtleXdvcmROYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGxhYmVsIGNvbXBsZXRpb24uCisgKiAKKyAqIEBwYXJhbSBsYWJlbE5hbWUgVGhlIGxhYmVsIHNvdXJjZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGxhYmVsLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBsYWJlbC4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICovCit2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUgY29tcGxldGlvbi4KKyAqIAorICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbmV3IGxvY2FsIHZhcmlhYmxlLgorICogQHBhcmFtIHR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZS4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICoKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgorICogICAgQXJyYXkgdHlwZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiTVtdIiBvciAiaW50W10iLgorICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKyAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisgKi8KK3ZvaWQgYWNjZXB0TG9jYWxWYXJpYWJsZSgKKwljaGFyW10gbmFtZSwKKwljaGFyW10gdHlwZVBhY2thZ2VOYW1lLAorCWNoYXJbXSB0eXBlTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQsCisJaW50IHJlbGV2YW5jZSk7CisvKioKKyAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBjb21wbGV0aW9uLgorICogCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLgorICogQHBhcmFtIHNlbGVjdG9yIE5hbWUgb2YgdGhlIG5ldyBtZXRob2QuCisgKiBAcGFyYW0gcGFyYW1ldGVyUGFja2FnZU5hbWVzIE5hbWVzIG9mIHRoZSBwYWNrYWdlcyBpbiB3aGljaCB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBkZWNsYXJlZC4KKyAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclR5cGVOYW1lcy4KKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlTmFtZXMgTmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZXMuCisgKiAgICAJU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMuCisgKiBAcGFyYW0gcmV0dXJuVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHJldHVybiB0eXBlIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIHJldHVyblR5cGVOYW1lIE5hbWUgb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbmV3IG1ldGhvZCwgc2hvdWxkIGJlIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGNvbnN0cnVjdG9yLgorICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIFRoZSBjb21wbGV0aW9uIGZvciB0aGUgbWV0aG9kLiBDYW4gaW5jbHVkZSB6ZXJvLCBvbmUgb3IgdHdvIGJyYWNrZXRzLiBJZiB0aGUgY2xvc2luZyBicmFja2V0IGlzIGluY2x1ZGVkLCB0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgaXQuCisgKiBAcGFyYW0gbW9kaWZpZXJzIFRoZSBtb2RpZmllcnMgb2YgdGhpcyBuZXcgbWV0aG9kLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IG1ldGhvZC4KKyAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IG1ldGhvZC4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICoKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgorICogICAgQXJyYXkgdHlwZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiTVtdIiBvciAiaW50W10iLgorICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKyAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisgKgorICogTk9URTogcGFyYW1ldGVyIG5hbWVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsIGFmdGVyIHRoZSB1c2VyIHNlbGVjdHMgYSBzcGVjaWZpYyBtZXRob2QuCisgKi8KK3ZvaWQgYWNjZXB0TWV0aG9kKAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCWNoYXJbXSBzZWxlY3RvciwKKwljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAorCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCWNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHJldHVyblR5cGVOYW1lLAorCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQsCisJaW50IHJlbGV2YW5jZSk7CisKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbWV0aG9kIGNvbXBsZXRpb24uCisgKiAKKyAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgbmV3IG1ldGhvZCBpcyBkZWNsYXJlZC4KKyAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmluZyB0aGlzIG5ldyBtZXRob2QuCisgKiBAcGFyYW0gc2VsZWN0b3IgTmFtZSBvZiB0aGUgbmV3IG1ldGhvZC4KKyAqIEBwYXJhbSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgTmFtZXMgb2YgdGhlIHBhY2thZ2VzIGluIHdoaWNoIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGRlY2xhcmVkLgorICogICAgCVNob3VsZCBjb250YWluIGFzIG1hbnkgZWxlbWVudHMgYXMgcGFyYW1ldGVyVHlwZU5hbWVzLgorICogQHBhcmFtIHBhcmFtZXRlclR5cGVOYW1lcyBOYW1lcyBvZiB0aGUgcGFyYW1ldGVycyB0eXBlcy4KKyAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclBhY2thZ2VOYW1lcy4KKyAqIEBwYXJhbSByZXR1cm5UeXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgcmV0dXJuIHR5cGUgaXMgZGVjbGFyZWQuCisgKiBAcGFyYW0gcmV0dXJuVHlwZU5hbWUgTmFtZSBvZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBuZXcgbWV0aG9kLCBzaG91bGQgYmUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgY29uc3RydWN0b3IuCisgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSBtZXRob2QuIENhbiBpbmNsdWRlIHplcm8sIG9uZSBvciB0d28gYnJhY2tldHMuIElmIHRoZSBjbG9zaW5nIGJyYWNrZXQgaXMgaW5jbHVkZWQsIHRoZW4gdGhlIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSBpdC4KKyAqIEBwYXJhbSBtb2RpZmllcnMgVGhlIG1vZGlmaWVycyBvZiB0aGlzIG5ldyBtZXRob2QuCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbWV0aG9kLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbWV0aG9kLgorICogQHBhcmFtIHJlbGV2YW5jZSBUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCisgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCisgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQorICogCQl2YWx1ZSBpcyBoaWdoZXIuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuCisgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqCisgKiBOT1RFOiBwYXJhbWV0ZXIgbmFtZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIG1ldGhvZC4KKyAqLwordm9pZCBhY2NlcHRNZXRob2REZWNsYXJhdGlvbigKKwljaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwljaGFyW10gc2VsZWN0b3IsCisJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKwljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwljaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLAorCWNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kLAorCWludCByZWxldmFuY2UpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBtb2RpZmllciBjb21wbGV0aW9uLgorICogCisgKiBAcGFyYW0gbW9kaWZpZXJOYW1lIFRoZSBuZXcgbW9kaWZpZXIuCisgKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbW9kaWZpZXIuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtb2RpZmllci4KKyAqIEBwYXJhbSByZWxldmFuY2UgVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbAorICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLgorICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UKKyAqIAkJdmFsdWUgaXMgaGlnaGVyLgorICovCit2b2lkIGFjY2VwdE1vZGlmaWVyKGNoYXJbXSBtb2RpZmllck5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgcGFja2FnZSBjb21wbGV0aW9uLgorICogCisgKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIHBhY2thZ2UuIENhbiBpbmNsdWRlICcuKjsnIGZvciBpbXBvcnRzLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IHBhY2thZ2UuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBwYWNrYWdlLgorICogQHBhcmFtIHJlbGV2YW5jZSBUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCisgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCisgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQorICogCQl2YWx1ZSBpcyBoaWdoZXIuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdFBhY2thZ2UoCisJY2hhcltdIHBhY2thZ2VOYW1lLAorCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKKwlpbnQgY29tcGxldGlvblN0YXJ0LAorCWludCBjb21wbGV0aW9uRW5kLAorCWludCByZWxldmFuY2UpOworLyoqCisgKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSB0eXBlIGNvbXBsZXRpb24uCisgKiAKKyAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSB0eXBlLgorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUuCisgKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgVGhlIGNvbXBsZXRpb24gZm9yIHRoZSB0eXBlLiBDYW4gaW5jbHVkZSAnOycgZm9yIGltcG9ydGVkIHR5cGVzLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSB0eXBlLgorICogQHBhcmFtIGNvbXBsZXRpb25FbmQgVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIHR5cGUuCisgKiBAcGFyYW0gcmVsZXZhbmNlIFRoZSByZWxldmFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwKKyAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4KKyAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlCisgKiAJCXZhbHVlIGlzIGhpZ2hlci4KKyAqCisgKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOgorICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4KKyAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdFR5cGUoCisJY2hhcltdIHBhY2thZ2VOYW1lLAorCWNoYXJbXSB0eXBlTmFtZSwKKwljaGFyW10gY29tcGxldGlvbk5hbWUsCisJaW50IGNvbXBsZXRpb25TdGFydCwKKwlpbnQgY29tcGxldGlvbkVuZCwKKwlpbnQgcmVsZXZhbmNlKTsKKwkKKy8qKgorICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgdmFyaWFibGUgbmFtZSBjb21wbGV0aW9uLgorICogCisgKiBAcGFyYW0gdHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KKyAqIEBwYXJhbSB0eXBlTmFtZSBOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuCisgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YXJpYWJsZS4KKyAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBUaGUgY29tcGxldGlvbiBmb3IgdGhlIHZhcmlhYmxlLgorICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUuCisgKiBAcGFyYW0gY29tcGxldGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIHZhcmlhYmxlLgorICogQHBhcmFtIHJlbGV2YW5jZSBUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCisgKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuCisgKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQorICogCQl2YWx1ZSBpcyBoaWdoZXIuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuCisgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoCisJY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwKKwljaGFyW10gdHlwZU5hbWUsCisJY2hhcltdIG5hbWUsCisJY2hhcltdIGNvbXBsZXRpb25OYW1lLAorCWludCBjb21wbGV0aW9uU3RhcnQsCisJaW50IGNvbXBsZXRpb25FbmQsCisJaW50IHJlbGV2YW5jZSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29ycmVjdGlvblJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvcnJlY3Rpb25SZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODkxN2JhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvcnJlY3Rpb25SZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBqYXZhIHByb2JsZW0gY29ycmVjdGlvbi4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElDb3JyZWN0aW9uUmVxdWVzdG9yIHsKKy8qKgorICogTm90aWZpY2F0aW9uIG9mIGEgY2xhc3MgY29ycmVjdGlvbi4KKyAqIAorICogQHBhcmFtIHBhY2thZ2VOYW1lIERlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLgorICogQHBhcmFtIGNsYXNzTmFtZSBOYW1lIG9mIHRoZSBjbGFzcy4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uTmFtZSBUaGUgY29ycmVjdGlvbiBmb3IgdGhlIGNsYXNzLgorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcy4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgY29ycmVjdGlvbiBvZiB0aGUgY2xhc3MuCisgKiBAcGFyYW0gY29ycmVjdGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgY29ycmVjdGlvbiBvZiB0aGUgY2xhc3MuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRDbGFzcygKKwljaGFyW10gcGFja2FnZU5hbWUsCisJY2hhcltdIGNsYXNzTmFtZSwKKwljaGFyW10gY29ycmVjdGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29ycmVjdGlvblN0YXJ0LAorCWludCBjb3JyZWN0aW9uRW5kKTsKKy8qKgorICogTm90aWZpY2F0aW9uIG9mIGEgZmllbGQgY29ycmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgZmllbGQuCisgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZC4KKyAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIHR5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZC4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uTmFtZSBUaGUgY29ycmVjdGlvbiBmb3IgdGhlIGZpZWxkLgorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoaXMgZmllbGQuCisgKiBAcGFyYW0gY29ycmVjdGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIGNvcnJlY3Rpb24gb2YgdGhpcyBmaWVsZC4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBjb3JyZWN0aW9uIG9mIHRoaXMgZmllbGQuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuCisgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRGaWVsZCgKKwljaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKwljaGFyW10gbmFtZSwKKwljaGFyW10gdHlwZVBhY2thZ2VOYW1lLAorCWNoYXJbXSB0eXBlTmFtZSwKKwljaGFyW10gY29ycmVjdGlvbk5hbWUsCisJaW50IG1vZGlmaWVycywKKwlpbnQgY29ycmVjdGlvblN0YXJ0LAorCWludCBjb3JyZWN0aW9uRW5kKTsKKy8qKgorICogTm90aWZpY2F0aW9uIG9mIGFuIGludGVyZmFjZSBjb3JyZWN0aW9uLgorICoKKyAqIEBwYXJhbSBwYWNrYWdlTmFtZSBEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UuCisgKiBAcGFyYW0gY2xhc3NOYW1lIE5hbWUgb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uTmFtZSBUaGUgY29ycmVjdGlvbiBmb3IgdGhlIGludGVyZmFjZS4KKyAqICAgQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCBpbnRlcmZhY2VzLgorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoZSBpbnRlcmZhY2UuCisgKiBAcGFyYW0gY29ycmVjdGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIGNvcnJlY3Rpb24gb2YgdGhlIGludGVyZmFjZS4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBjb3JyZWN0aW9uIG9mIHRoZSBpbnRlcmZhY2UuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRJbnRlcmZhY2UoCisJY2hhcltdIHBhY2thZ2VOYW1lLAorCWNoYXJbXSBpbnRlcmZhY2VOYW1lLAorCWNoYXJbXSBjb3JyZWN0aW9uTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb3JyZWN0aW9uU3RhcnQsCisJaW50IGNvcnJlY3Rpb25FbmQpOworLyoqCisgKiBOb3RpZmljYXRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSBjb3JyZWN0aW9uLgorICoKKyAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLgorICogQHBhcmFtIHR5cGVQYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSB0eXBlIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQuCisgKiBAcGFyYW0gdHlwZU5hbWUgTmFtZSBvZiB0aGUgdHlwZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlLgorICogQHBhcmFtIG1vZGlmaWVycyBUaGUgbW9kaWZpZXJzIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCisgKiBAcGFyYW0gY29ycmVjdGlvblN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIGNvcnJlY3Rpb24gb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBjb3JyZWN0aW9uIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuCisgKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuCisgKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLgorICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4KKyAqLwordm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKAorCWNoYXJbXSBuYW1lLAorCWNoYXJbXSB0eXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHR5cGVOYW1lLAorCWludCBtb2RpZmllcnMsCisJaW50IGNvcnJlY3Rpb25TdGFydCwKKwlpbnQgY29ycmVjdGlvbkVuZCk7CisvKioKKyAqIE5vdGlmaWNhdGlvbiBvZiBhIG1ldGhvZCBjb3JyZWN0aW9uLgorICoKKyAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgbWV0aG9kIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIGRlY2xhcmluZ1R5cGVOYW1lIE5hbWUgb2YgdGhlIHR5cGUgZGVjbGFyaW5nIHRoaXMgbWV0aG9kLgorICogQHBhcmFtIHNlbGVjdG9yIE5hbWUgb2YgdGhlIG1ldGhvZC4KKyAqIEBwYXJhbSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgTmFtZXMgb2YgdGhlIHBhY2thZ2VzIGluIHdoaWNoIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGRlY2xhcmVkLgorICogICAgU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJUeXBlTmFtZXMuCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWVzIE5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGVzLgorICogICAgU2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMuCisgKiBAcGFyYW0gcmV0dXJuVHlwZVBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHJldHVybiB0eXBlIGlzIGRlY2xhcmVkLgorICogQHBhcmFtIHJldHVyblR5cGVOYW1lIE5hbWUgb2YgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kLCBzaG91bGQgYmUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgY29uc3RydWN0b3IuCisgKiBAcGFyYW0gY29ycmVjdGlvbk5hbWUgVGhlIGNvcnJlY3Rpb24gZm9yIHRoZSBtZXRob2QuCisgKiAgIENhbiBpbmNsdWRlIHplcm8sIG9uZSBvciB0d28gYnJhY2tldHMuIElmIHRoZSBjbG9zaW5nIGJyYWNrZXQgaXMgaW5jbHVkZWQsIHRoZW4gdGhlIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSBpdC4KKyAqIEBwYXJhbSBtb2RpZmllcnMgVGhlIG1vZGlmaWVycyBvZiB0aGlzIG1ldGhvZC4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgY29ycmVjdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uRW5kIFRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBjb3JyZWN0aW9uIG9mIHRoaXMgbWV0aG9kLgorICoKKyAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06CisgKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLgorICogICAgQmFzZSB0eXBlcyBhcmUgaW4gdGhlIGZvcm0gImludCIgb3IgImJvb2xlYW4iLgorICogICAgQXJyYXkgdHlwZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiTVtdIiBvciAiaW50W10iLgorICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4KKyAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCisgKgorICogTk9URTogcGFyYW1ldGVyIG5hbWVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsIGFmdGVyIHRoZSB1c2VyIHNlbGVjdHMgYSBzcGVjaWZpYyBtZXRob2QuCisgKi8KK3ZvaWQgYWNjZXB0TWV0aG9kKAorCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorCWNoYXJbXSBzZWxlY3RvciwKKwljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAorCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCWNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCisJY2hhcltdIHJldHVyblR5cGVOYW1lLAorCWNoYXJbXSBjb3JyZWN0aW9uTmFtZSwKKwlpbnQgbW9kaWZpZXJzLAorCWludCBjb3JyZWN0aW9uU3RhcnQsCisJaW50IGNvcnJlY3Rpb25FbmQpOworLyoqCisgKiBOb3RpZmljYXRpb24gb2YgYSBwYWNrYWdlIGNvcnJlY3Rpb24uCisgKgorICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUuCisgKiBAcGFyYW0gY29ycmVjdGlvbk5hbWUgVGhlIGNvcnJlY3Rpb24gZm9yIHRoZSBwYWNrYWdlLgorICogICBDYW4gaW5jbHVkZSAnLio7JyBmb3IgaW1wb3J0cy4KKyAqIEBwYXJhbSBjb3JyZWN0aW9uU3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgY29ycmVjdGlvbiBvZiB0aGlzIHBhY2thZ2UuCisgKiBAcGFyYW0gY29ycmVjdGlvbkVuZCBUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgY29ycmVjdGlvbiBvZiB0aGlzIHBhY2thZ2UuCisgKgorICogTk9URSAtIEFsbCBwYWNrYWdlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToKKyAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuCisgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgorICovCit2b2lkIGFjY2VwdFBhY2thZ2UoCisJY2hhcltdIHBhY2thZ2VOYW1lLAorCWNoYXJbXSBjb3JyZWN0aW9uTmFtZSwKKwlpbnQgY29ycmVjdGlvblN0YXJ0LAorCWludCBjb3JyZWN0aW9uRW5kKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjdhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEFuIGVsZW1lbnQgY2hhbmdlZCBsaXN0ZW5lciByZWNlaXZlcyBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzCisgKiBtYWludGFpbmVkIGJ5IHRoZSBKYXZhIG1vZGVsLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7CisJCisvKioKKyAqIE5vdGlmaWVzIHRoYXQgb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvZiBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnRzIGhhdmUgY2hhbmdlZC4KKyAqIFRoZSBzcGVjaWZpYyBkZXRhaWxzIG9mIHRoZSBjaGFuZ2UgYXJlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gZXZlbnQuCisgKgorICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnQKKyAqLworcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODlhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZmllbGQgZGVjbGFyZWQgaW4gYSB0eXBlLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRmllbGQgZXh0ZW5kcyBJTWVtYmVyIHsKKy8qKgorICogUmV0dXJucyB0aGUgY29uc3RhbnQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGQKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmllbGQgaGFzIG5vbmUuCisgKiBSZXR1cm5zIGVpdGhlciBhIHN1YmNsYXNzIG9mIDxjb2RlPk51bWJlcjwvY29kZT4sIG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiwKKyAqIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpZWxkIGlzIG9mIHR5cGUgPGNvZGU+c2hvcnQ8L2NvZGU+LCB0aGlzIHJldHVybnMKKyAqIGEgPGNvZGU+U2hvcnQ8L2NvZGU+LgorICoKKyAqIEByZXR1cm4gIHRoZSBjb25zdGFudCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGZpZWxkIGhhcyBub25lLgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisgKi8KK3B1YmxpYyBPYmplY3QgZ2V0Q29uc3RhbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGlzIGZpZWxkLgorICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyBmaWVsZC4KKyAqLworU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoaXMgZmllbGQuCisgKgorICogQHNlZSBTaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoaXMgZmllbGQuCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqLworU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbXBvcnQgY29udGFpbmVyIGlzIGEgY2hpbGQgb2YgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBjb250YWlucworICogYWxsIChhbmQgb25seSkgdGhlIGltcG9ydCBkZWNsYXJhdGlvbnMuIElmIGEgY29tcGlsYXRpb24gdW5pdCBoYXMgbm8gaW1wb3J0CisgKiBkZWNsYXJhdGlvbnMsIG5vIGltcG9ydCBjb250YWluZXIgd2lsbCBiZSBwcmVzZW50LgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJSW1wb3J0Q29udGFpbmVyIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJUGFyZW50LCBJU291cmNlUmVmZXJlbmNlIHsKKy8qKgorICogUmV0dXJucyB0aGUgZmlyc3QgaW1wb3J0IGRlY2xhcmF0aW9uIGluIHRoaXMgaW1wb3J0IGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gVGhlIGltcG9ydCBkZWNsYXJhdGlvbiBtYXkgb3IgbWF5IG5vdCBleGlzdC4KKyAqIAorICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKyAqIAorICogQHJldHVybiB0aGUgZmlyc3QgaW1wb3J0IGRlY2xhcmF0aW9uIGluIHRoaXMgaW1wb3J0IGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKi8KK0lJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY3MTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbXBvcnQgZGVjbGFyYXRpb24gaW4gSmF2YSBjb21waWxhdGlvbiB1bml0LgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJSW1wb3J0RGVjbGFyYXRpb24gZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElTb3VyY2VSZWZlcmVuY2UsIElTb3VyY2VNYW5pcHVsYXRpb24geworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgaGFzIGJlZW4gaW1wb3J0ZWQuIAorICogRm9yIGFuIG9uLWRlbWFuZCBpbXBvcnQsIHRoaXMgaW5jbHVkZXMgdGhlIHRyYWlsaW5nIDxjb2RlPiIuKiI8L2NvZGU+LgorICogRm9yIGV4YW1wbGUsIGZvciB0aGUgc3RhdGVtZW50IDxjb2RlPiJpbXBvcnQgamF2YS51dGlsLioiPC9jb2RlPiwKKyAqIHRoaXMgcmV0dXJucyA8Y29kZT4iamF2YS51dGlsLioiPC9jb2RlPi4KKyAqIEZvciB0aGUgc3RhdGVtZW50IDxjb2RlPiJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZSI8L2NvZGU+LAorICogdGhpcyByZXR1cm5zIDxjb2RlPiJqYXZhLnV0aWwuSGFzaHRhYmxlIjwvY29kZT4uCisgKiAKKyAqIEByZXR1cm4gdGhlIG5hbWUgdGhhdCBoYXMgYmVlbiBpbXBvcnRlZAorICovCitTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbXBvcnQgaXMgb24tZGVtYW5kLiBBbiBpbXBvcnQgaXMgb24tZGVtYW5kIGlmIGl0IGVuZHMKKyAqIHdpdGggPGNvZGU+Ii4qIjwvY29kZT4uCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltcG9ydCBpcyBvbi1kZW1hbmQsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGlzT25EZW1hbmQoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MTI0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzdGFuZC1hbG9uZSBpbnN0YW5jZSBvciBjbGFzcyAoc3RhdGljKSBpbml0aWFsaXplciBpbiBhIHR5cGUuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElJbml0aWFsaXplciBleHRlbmRzIElNZW1iZXIgeworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2I3MGJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgZm9yIGFsbCBlbGVtZW50cyBwcm92aWRlZCBieSB0aGUgSmF2YSBtb2RlbC4KKyAqIEphdmEgbW9kZWwgZWxlbWVudHMgYXJlIGV4cG9zZWQgdG8gY2xpZW50cyBhcyBoYW5kbGVzIHRvIHRoZSBhY3R1YWwgdW5kZXJseWluZyBlbGVtZW50LgorICogVGhlIEphdmEgbW9kZWwgbWF5IGhhbmQgb3V0IGFueSBudW1iZXIgb2YgaGFuZGxlcyBmb3IgZWFjaCBlbGVtZW50LiBIYW5kbGVzCisgKiB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGVsZW1lbnQgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwsIGJ1dCBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLgorICogPHA+CisgKiBNZXRob2RzIGFubm90YXRlZCBhcyAiaGFuZGxlLW9ubHkiIGRvIG5vdCByZXF1aXJlIHVuZGVybHlpbmcgZWxlbWVudHMgdG8gZXhpc3QuIAorICogTWV0aG9kcyB0aGF0IHJlcXVpcmUgdW5kZXJseWluZyBlbGVtZW50cyB0byBleGlzdCB0aHJvdworICogYSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IHdoZW4gYW4gdW5kZXJseWluZyBlbGVtZW50IGlzIG1pc3NpbmcuCisgKiA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb24uaXNEb2VzTm90RXhpc3Q8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZQorICogdGhpcyBjb21tb24gc3BlY2lhbCBjYXNlLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJSmF2YUVsZW1lbnQgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKKworCS8qKgorCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgbW9kZWwgKHdvcmtzcGFjZSBsZXZlbCBvYmplY3QpLgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX01PREVMID0gMTsKKworCS8qKgorCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgcHJvamVjdC4KKwkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1BST0pFQ1QgPSAyOworCisJLyoqCisJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBmcmFnbWVudCByb290LgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9GUkFHTUVOVF9ST09UID0gMzsKKworCS8qKgorCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIHBhY2thZ2UgZnJhZ21lbnQuCisJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfRlJBR01FTlQgPSA0OworCisJLyoqCisJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgSmF2YSBjb21waWxhdGlvbiB1bml0LgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QSUxBVElPTl9VTklUID0gNTsKKworCS8qKgorCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIGNsYXNzIGZpbGUuCisJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0ZJTEUgPSA2OworCisJLyoqCisJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgdHlwZSAoYSBjbGFzcyBvciBpbnRlcmZhY2UpLgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JVHlwZTwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDc7CisKKwkvKioKKwkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBmaWVsZC4KKwkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUZpZWxkPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRCA9IDg7CisKKwkvKioKKwkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCisJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklNZXRob2Q8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDk7CisKKwkvKioKKwkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBzdGFuZC1hbG9uZSBpbnN0YW5jZSBvciBjbGFzcyBpbml0aWFsaXplci4KKwkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpFUiA9IDEwOworCisJLyoqCisJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0LgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZURlY2xhcmF0aW9uPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gMTE7CisKKwkvKioKKwkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYWxsIGltcG9ydCBkZWNsYXJhdGlvbnMgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4KKwkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUltcG9ydENvbnRhaW5lcjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUX0NPTlRBSU5FUiA9IDEyOworCisJLyoqCisJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGltcG9ydCBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0LgorCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JSW1wb3J0RGVjbGFyYXRpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVF9ERUNMQVJBVElPTiA9IDEzOworCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBleGlzdHMgaW4gdGhlIG1vZGVsLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGV4aXN0cyBpbiB0aGUgSmF2YSBtb2RlbAorICovCitib29sZWFuIGV4aXN0cygpOworLyoqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBhbmNlc3RvciBvZiB0aGlzIEphdmEgZWxlbWVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdHlwZS4KKyAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhbiBhbmNlc3RvciBjYW4gYmUgZm91bmQuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICogCisgKiBAcGFyYW0gYW5jZXN0b3JUeXBlIHRoZSBnaXZlbiB0eXBlCisgKiBAcmV0dXJuIHRoZSBmaXJzdCBhbmNlc3RvciBvZiB0aGlzIEphdmEgZWxlbWVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdHlwZSwgbnVsbCBpZiBubyBzdWNoIGFuIGFuY2VzdG9yIGNhbiBiZSBmb3VuZAorICogQHNpbmNlIDIuMAorICovCitJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSk7CisvKioKKyAqIFJldHVybnMgdGhlIHJlc291cmNlIHRoYXQgY29ycmVzcG9uZHMgZGlyZWN0bHkgdG8gdGhpcyBlbGVtZW50LAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyB0bworICogdGhpcyBlbGVtZW50LgorICogPHA+CisgKiBGb3IgZXhhbXBsZSwgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZm9yIGFuIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+CisgKiBpcyBpdHMgdW5kZXJseWluZyA8Y29kZT5JRmlsZTwvY29kZT4uIFRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIGZvcgorICogYW4gPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT4gdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGFuIGFyY2hpdmUgCisgKiBpcyBpdHMgdW5kZXJseWluZyA8Y29kZT5JRm9sZGVyPC9jb2RlPi4gQW4gPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT4KKyAqIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlIGhhcyBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlLiBTaW1pbGFybHksIHRoZXJlCisgKiBhcmUgbm8gY29ycmVzcG9uZGluZyByZXNvdXJjZXMgZm9yIDxjb2RlPklNZXRob2RzPC9jb2RlPiwKKyAqIDxjb2RlPklGaWVsZHM8L2NvZGU+LCBldGMuCisgKiA8cD4KKyAqCisgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitJUmVzb3VyY2UgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKgorICogQHJldHVybiB0aGUgZWxlbWVudCBuYW1lCisgKi8KK1N0cmluZyBnZXRFbGVtZW50TmFtZSgpOworLyoqCisgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIGtpbmQgZW5jb2RlZCBhcyBhbiBpbnRlZ2VyLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGVsZW1lbnQ7IG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlY2xhcmVkIGluCisgKiAgIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4KKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBpbnQgZ2V0RWxlbWVudFR5cGUoKTsKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGVsZW1lbnQgaGFuZGxlLiBUaGUgZm9ybWF0IG9mCisgKiB0aGUgc3RyaW5nIGlzIG5vdCBzcGVjaWZpZWQ7IGhvd2V2ZXIsIHRoZSBpZGVudGlmaWVyIGlzIHN0YWJsZSBhY3Jvc3MKKyAqIHdvcmtzcGFjZSBzZXNzaW9ucywgYW5kIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoaXMgaGFuZGxlIHZpYSB0aGUgCisgKiA8Y29kZT5KYXZhQ29yZS5jcmVhdGUoU3RyaW5nKTwvY29kZT4gbWV0aG9kLgorICoKKyAqIEByZXR1cm4gdGhlIHN0cmluZyBoYW5kbGUgaWRlbnRpZmllcgorICogQHNlZSBKYXZhQ29yZSNjcmVhdGUoamF2YS5sYW5nLlN0cmluZykKKyAqLworU3RyaW5nIGdldEhhbmRsZUlkZW50aWZpZXIoKTsKKy8qKgorICogUmV0dXJucyB0aGUgSmF2YSBtb2RlbC4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKgorICogQHJldHVybiB0aGUgSmF2YSBtb2RlbAorICovCitJSmF2YU1vZGVsIGdldEphdmFNb2RlbCgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgdGhpcyBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiwKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBub3QgY29udGFpbmVkIGluIGFueSBKYXZhIHByb2plY3QKKyAqIChmb3IgaW5zdGFuY2UsIHRoZSA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPiBpcyBub3QgY29udGFpbmVkIGluIGFueSBKYXZhIAorICogcHJvamVjdCkuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICoKKyAqIEByZXR1cm4gdGhlIGNvbnRhaW5pbmcgSmF2YSBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMKKyAqICAgbm90IGNvbnRhaW5lZCBpbiBhIEphdmEgcHJvamVjdAorICovCitJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKKy8qKgorICogUmV0dXJucyB0aGUgZmlyc3Qgb3BlbmFibGUgcGFyZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgb3BlbmFibGUsIHRoZSBlbGVtZW50CisgKiBpdHNlbGYgaXMgcmV0dXJuZWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXNuJ3QgaGF2ZQorICogYW4gb3BlbmFibGUgcGFyZW50LgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqIAorICogQHJldHVybiB0aGUgZmlyc3Qgb3BlbmFibGUgcGFyZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBkb2Vzbid0IGhhdmUKKyAqIGFuIG9wZW5hYmxlIHBhcmVudC4KKyAqIEBzaW5jZSAyLjAKKyAqLworSU9wZW5hYmxlIGdldE9wZW5hYmxlKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGVsZW1lbnQgZGlyZWN0bHkgY29udGFpbmluZyB0aGlzIGVsZW1lbnQsCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIHBhcmVudC4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKgorICogQHJldHVybiB0aGUgcGFyZW50IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gcGFyZW50CisgKi8KK0lKYXZhRWxlbWVudCBnZXRQYXJlbnQoKTsKKy8qKgorICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQuIAorICogSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLCAKKyAqIHRoZSBwYXRoIHJldHVybmVkIGlzIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLCAKKyAqIHJlbGF0aXZlIHRvIHRoZSB3b3JrYmVuY2guIAorICogSWYgdGhpcyBlbGVtZW50IGlzIGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUsIAorICogdGhlIHBhdGggcmV0dXJuZWQgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGFyY2hpdmUgaW4gdGhlIGZpbGUgc3lzdGVtLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqIAorICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQKKyAqIEBzaW5jZSAyLjAKKyAqLworSVBhdGggZ2V0UGF0aCgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudC4gCisgKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gYXJjaGl2ZSBhbmQgdGhpcyBhcmNoaXZlIGlzIG5vdCBleHRlcm5hbCwgCisgKiB0aGlzIGlzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyY2hpdmUuIAorICogSWYgdGhpcyBlbGVtZW50IGlzIGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUsIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpcyByZXR1cm5lZC4KKyAqIElmIHRoaXMgZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICogCisgKiBAcmV0dXJuIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyAKKyAqIGVsZW1lbnQgaXMgYSB3b3JraW5nIGNvcHkgb3IgaXMgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgYXJjaGl2ZQorICogQHNpbmNlIDIuMAorICovCitJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKKy8qKgorICogUmV0dXJucyB0aGUgc21hbGxlc3QgdW5kZXJseWluZyByZXNvdXJjZSB0aGF0IGNvbnRhaW5zCisgKiB0aGlzIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBub3QgY29udGFpbmVkCisgKiBpbiBhIHJlc291cmNlLgorICoKKyAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlCisgKi8KK0lSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBKYXZhIGVsZW1lbnQgaXMgcmVhZC1vbmx5LiBBbiBlbGVtZW50IGlzIHJlYWQtb25seQorICogaWYgaXRzIHN0cnVjdHVyZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGphdmEgbW9kZWwuIAorICogPHA+CisgKiBOb3RlIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gSVJlc291cmNlLmlzUmVhZE9ubHkoKS4gRm9yIGV4YW1wbGUsIC5qYXIKKyAqIGZpbGVzIGFyZSByZWFkLW9ubHkgYXMgdGhlIGphdmEgbW9kZWwgZG9lc24ndCBrbm93IGhvdyB0byBhZGQvcmVtb3ZlIAorICogZWxlbWVudHMgaW4gdGhpcyBmaWxlLCBidXQgdGhlIHVuZGVybHlpbmcgSUZpbGUgY2FuIGJlIHdyaXRhYmxlLgorICogPHA+CisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIHJlYWQtb25seQorICovCitib29sZWFuIGlzUmVhZE9ubHkoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50IGlzIGtub3duLiBGb3IgZXhhbXBsZSwgZm9yIGEKKyAqIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBjb3VsZCBub3QgYmUgcGFyc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCisgKiBJZiB0aGUgc3RydWN0dXJlIG9mIGFuIGVsZW1lbnQgaXMgdW5rbm93biwgbmF2aWdhdGlvbnMgd2lsbCByZXR1cm4gcmVhc29uYWJsZQorICogZGVmYXVsdHMuIEZvciBleGFtcGxlLCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gd2lsbCByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbi4KKyAqIDxwPgorICogTm90ZTogVGhpcyBkb2VzIG5vdCBpbXBseSBhbnl0aGluZyBhYm91dCBjb25zaXN0ZW5jeSB3aXRoIHRoZQorICogdW5kZXJseWluZyByZXNvdXJjZS9idWZmZXIgY29udGVudHMuCisgKiA8L3A+CisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZWxlbWVudCBpcyBrbm93bgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqLworYm9vbGVhbiBpc1N0cnVjdHVyZUtub3duKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudERlbHRhLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnREZWx0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjlhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnREZWx0YS5qYXZhCkBAIC0wLDAgKzEsMzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworCisvKioKKyAqIEEgSmF2YSBlbGVtZW50IGRlbHRhIGRlc2NyaWJlcyBjaGFuZ2VzIGluIEphdmEgZWxlbWVudCBiZXR3ZWVuIHR3byBkaXNjcmV0ZQorICogcG9pbnRzIGluIHRpbWUuICBHaXZlbiBhIGRlbHRhLCBjbGllbnRzIGNhbiBhY2Nlc3MgdGhlIGVsZW1lbnQgdGhhdCBoYXMgCisgKiBjaGFuZ2VkLCBhbmQgYW55IGNoaWxkcmVuIHRoYXQgaGF2ZSBjaGFuZ2VkLgorICogPHA+CisgKiBEZWx0YXMgaGF2ZSBhIGRpZmZlcmVudCBzdGF0dXMgZGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIGNoYW5nZSB0aGV5IHJlcHJlc2VudC4gIAorICogVGhlIGxpc3QgYmVsb3cgc3VtbWFyaXplcyBlYWNoIHN0YXR1cyAoYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0S2luZDwvY29kZT4pCisgKiBhbmQgaXRzIG1lYW5pbmcgKHNlZSBpbmRpdmlkdWFsIGNvbnN0YW50cyBmb3IgYSBtb3JlIGRldGFpbGxlZCBkZXNjcmlwdGlvbik6CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+QURERUQ8L2NvZGU+IC0gVGhlIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZSBkZWx0YSBoYXMgYmVlbiBhZGRlZC48L2xpPgorICogPGxpPjxjb2RlPlJFTU9WRUQ8L2NvZGU+IC0gVGhlIGVsZW1lbnQgZGVzY3JpYmVkIGJ5IHRoZSBkZWx0YSBoYXMgYmVlbiByZW1vdmVkLjwvbGk+CisgKiA8bGk+PGNvZGU+Q0hBTkdFRDwvY29kZT4gLSBUaGUgZWxlbWVudCBkZXNjcmliZWQgYnkgdGhlIGRlbHRhIGhhcyBiZWVuIGNoYW5nZWQgaW4gc29tZSB3YXkuICAKKyAqIFNwZWNpZmljYXRpb24gb2YgdGhlIHR5cGUgb2YgY2hhbmdlIGlzIHByb3ZpZGVkIGJ5IDxjb2RlPmdldEZsYWdzPC9jb2RlPiB3aGljaCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogPHVsPgorICogPGxpPjxjb2RlPkZfQURERURfVE9fQ0xBU1NQQVRIPC9jb2RlPiAtIEEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQKKyAqIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPi48L2xpPgorICogPGxpPjxjb2RlPkZfQVJDSElWRV9DT05URU5UX0NIQU5HRUQ8L2NvZGU+IC0gVGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUKKyAqIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4KKyAqIHdoaWNoIGlzIGFuIGFyY2hpdmUuPC9saT4KKyAqIDxsaT48Y29kZT5GX0NISUxEUkVOPC9jb2RlPiAtIEEgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgaW4gc29tZSB3YXkuICBUaGlzIGZsYWcKKyAqIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gPGNvZGU+SVBhcmVudDwvY29kZT4uPC9saT4KKyAqIDxsaT48Y29kZT5GX0NMQVNTUEFUSF9SRU9SREVSPC9jb2RlPiAtIEEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQKKyAqIGhhcyBjaGFuZ2VkIHBvc2l0aW9uIGluIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiAKKyAqIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPi48L2xpPgorICogPGxpPjxjb2RlPkZfQ0xPU0VEPC9jb2RlPiAtIFRoZSB1bmRlcmx5aW5nIDxjb2RlPklQcm9qZWN0PC9jb2RlPgorICogaGFzIGJlZW4gY2xvc2VkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+LjwvbGk+CisgKiA8bGk+PGNvZGU+Rl9DT05URU5UPC9jb2RlPiAtIFRoZSBjb250ZW50cyBvZiB0aGUgZWxlbWVudCBoYXZlIGJlZW4gYWx0ZXJlZC4gIFRoaXMgZmxhZworICogaXMgb25seSB2YWxpZCBmb3IgZWxlbWVudHMgd2hpY2ggY29ycmVzcG9uZCB0byBmaWxlcy48L2xpPgorICo8bGk+PGNvZGU+Rl9GSU5FX0dSQUlORUQ8L2NvZGU+IC0gVGhlIGRlbHRhIGlzIGEgZmluZS1ncmFpbmVkIGRlbHRhLCBpLmUuJm5ic3A7YW4gYW5hbHlzaXMgZG93bgorICogdG8gdGhlIG1lbWJlcnMgbGV2ZWwgd2FzIGRvbmUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHdlcmUgc3RydWN0dXJhbCBjaGFuZ2VzIHRvIG1lbWJlcnMgb2YgdGhlIGVsZW1lbnQuPC9saT4KKyAqIDxsaT48Y29kZT5GX01PRElGSUVSUzwvY29kZT4gLSBUaGUgbW9kaWZpZXJzIG9uIHRoZSBlbGVtZW50IGhhdmUgY2hhbmdlZCBpbiBzb21lIHdheS4gCisgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JTWVtYmVyPC9jb2RlPi48L2xpPgorICogPGxpPjxjb2RlPkZfT1BFTkVEPC9jb2RlPiAtIFRoZSB1bmRlcmx5aW5nIDxjb2RlPklQcm9qZWN0PC9jb2RlPgorICogaGFzIGJlZW4gb3BlbmVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+LjwvbGk+CisgKiA8bGk+PGNvZGU+Rl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIPC9jb2RlPiAtIEEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgCisgKiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIAorICogPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+LjwvbGk+CisgKiA8bGk+PGNvZGU+Rl9TT1VSQ0VBVFRBQ0hFRDwvY29kZT4gLSBUaGUgc291cmNlIGF0dGFjaG1lbnQgcGF0aCBvciB0aGUgc291cmNlIGF0dGFjaG1lbnQgcm9vdCBwYXRoCisgKiBvZiBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IHdhcyBhZGRlZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gCisgKiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uPC9saT4KKyAqIDxsaT48Y29kZT5GX1NPVVJDRURFVEFDSEVEPC9jb2RlPiAtIFRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGgKKyAqIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIAorICogPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+LjwvbGk+CisgKiA8bGk+PGNvZGU+Rl9TVVBFUl9UWVBFUzwvY29kZT4gLSBPbmUgb2YgdGhlIHN1cGVydHlwZXMgb2YgYW4gPGNvZGU+SVR5cGU8L2NvZGU+IGhhcyBjaGFuZ2VkPC9saT4uCisgKiA8L3VsPgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIE1vdmUgb3BlcmF0aW9ucyBhcmUgaW5kaWNhdGVkIGJ5IG90aGVyIGNoYW5nZSBmbGFncywgbGF5ZXJlZCBvbiB0b3AKKyAqIG9mIHRoZSBjaGFuZ2UgZmxhZ3MgZGVzY3JpYmVkIGFib3ZlLiBJZiBlbGVtZW50IEEgaXMgbW92ZWQgdG8gYmVjb21lIEIsCisgKiB0aGUgZGVsdGEgZm9yIHRoZSAgY2hhbmdlIGluIEEgd2lsbCBoYXZlIHN0YXR1cyA8Y29kZT5SRU1PVkVEPC9jb2RlPiwKKyAqIHdpdGggY2hhbmdlIGZsYWcgPGNvZGU+Rl9NT1ZFRF9UTzwvY29kZT4uIEluIHRoaXMgY2FzZSwKKyAqIDxjb2RlPmdldE1vdmVkVG9FbGVtZW50PC9jb2RlPiBvbiBkZWx0YSBBIHdpbGwgcmV0dXJuIHRoZSBoYW5kbGUgZm9yIEIuCisgKiBUaGUgIGRlbHRhIGZvciBCIHdpbGwgaGF2ZSBzdGF0dXMgPGNvZGU+QURERUQ8L2NvZGU+LCB3aXRoIGNoYW5nZSBmbGFnCisgKiA8Y29kZT5GX01PVkVEX0ZST008L2NvZGU+LCBhbmQgPGNvZGU+Z2V0TW92ZWRGcm9tRWxlbWVudDwvY29kZT4gb24gZGVsdGEKKyAqIEIgd2lsbCByZXR1cm4gdGhlIGhhbmRsZSBmb3IgQS4gKE5vdGUsIHRoZSBoYW5kbGUgdG8gQSBpbiB0aGlzIGNhc2UgcmVwcmVzZW50cworICogYW4gZWxlbWVudCB0aGF0IG5vIGxvbmdlciBleGlzdHMpLgorICogPC9wPgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlIG1vdmUgY2hhbmdlIGZsYWdzIG9ubHkgZGVzY3JpYmUgdGhlIGNoYW5nZXMgdG8gYSBzaW5nbGUgZWxlbWVudCwgdGhleQorICogZG8gbm90IGltcGx5IGFueXRoaW5nIGFib3V0IHRoZSBwYXJlbnQgb3IgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSA8Y29kZT5GX0FEREVEX1RPX0NMQVNTUEFUSDwvY29kZT4sIDxjb2RlPkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSDwvY29kZT4gYW5kCisgKiA8Y29kZT5GX0NMQVNTUEFUSF9SRU9SREVSPC9jb2RlPiBmbGFncyBhcmUgdHJpZ2dlcmVkIGJ5IGNoYW5nZXMgdG8gYSBwcm9qZWN0J3MgY2xhc3NwYXRoLiBUaGV5IGRvIG5vdCBtZWFuIHRoYXQKKyAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHdhcyBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgaWYgYSBwcm9qZWN0IFAgYWxyZWFkeSBjb250YWlucyBhIGZvbGRlciBzcmMsIHRoZW4gCisgKiBhZGRpbmcgYSBjbGFzc3BhdGggZW50cnkgd2l0aCB0aGUgJ1Avc3JjJyBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpbGwgcmVzdWx0IGluIGFuIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPiAKKyAqIHdpdGggdGhlIDxjb2RlPkZfQURERURfVE9fQ0xBU1NQQVRIPC9jb2RlPiBmbGFnIGZvciB0aGUgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+IFAvc3JjLgorICogT24gdGhlIGNvbnRyYXJ5LCBpZiBhIHJlc291cmNlIGlzIHBoeXNpY2FsbHkgYWRkZWQsIHJlbW92ZWQgb3IgY2hhbmdlZCBhbmQgdGhpcyByZXNvdXJjZSBjb3JyZXNwb25kcyB0byBhIGNsYXNzcGF0aAorICogZW50cnkgb2YgdGhlIHByb2plY3QsIHRoZW4gYW4gPGNvZGU+SUphdmFFbGVtZW50RGVsdGE8L2NvZGU+IHdpdGggdGhlIDxjb2RlPkFEREVEPC9jb2RlPiwgCisgKiA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgb3IgPGNvZGU+Q0hBTkdFRDwvY29kZT4ga2luZCB3aWxsIGJlIGZpcmVkLgorICogPC9wPgorICogPHA+CisgKiBOb3RlIHRoYXQgd2hlbiBhIHNvdXJjZSBhdHRhY2htZW50IHBhdGggb3IgYSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggaXMgY2hhbmdlZCwgdGhlbiB0aGUgZmxhZ3Mgb2YgdGhlIGRlbHRhIGNvbnRhaW4KKyAqIGJvdGggPGNvZGU+Rl9TT1VSQ0VBVFRBQ0hFRDwvY29kZT4gYW5kIDxjb2RlPkZfU09VUkNFREVUVEFDSEVEPC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogTm8gYXNzdW1wdGlvbnMgc2hvdWxkIGJlIG1hZGUgb24gd2hldGhlciB0aGUgamF2YSBlbGVtZW50IGRlbHRhIHRyZWUgaXMgcm9vdGVkIGF0IHRoZSA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPgorICogbGV2ZWwgb3Igbm90LgorICogPC9wPgorICogPHA+CisgKiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4gb2JqZWN0IGFyZSBub3QgdmFsaWQgb3V0c2lkZSB0aGUgZHluYW1pYyBzY29wZQorICogb2YgdGhlIG5vdGlmaWNhdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbGVtZW50RGVsdGEgeworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBoYXMgYmVlbiBhZGRlZC4KKwkgKiBOb3RlIHRoYXQgYW4gYWRkZWQgamF2YSBlbGVtZW50IGRlbHRhIGhhcyBubyBjaGlsZHJlbiwgYXMgdGhleSBhcmUgYWxsIGltcGxpY2l0ZWx5IGFkZGVkLgorCSAqLworCXB1YmxpYyBpbnQgQURERUQgPSAxOworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkLgorCSAqIE5vdGUgdGhhdCBhIHJlbW92ZWQgamF2YSBlbGVtZW50IGRlbHRhIGhhcyBubyBjaGlsZHJlbiwgYXMgdGhleSBhcmUgYWxsIGltcGxpY2l0ZWx5IHJlbW92ZWQuCisJICovCisJcHVibGljIGludCBSRU1PVkVEID0gMjsKKworCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwKKwkgKiBhcyBkZXNjcmliZWQgYnkgdGhlIGNoYW5nZSBmbGFncy4KKwkgKiAKKwkgKiBAc2VlIGdldEZsYWdzCisJICovCisJcHVibGljIGludCBDSEFOR0VEID0gNDsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBoYXMgY2hhbmdlZC4KKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBmb3IgZWxlbWVudHMgd2hpY2ggY29ycmVzcG9uZCB0byBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgaW50IEZfQ09OVEVOVCA9IDB4MDAwMTsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kaWZpZXJzIG9mIHRoZSBlbGVtZW50IGhhdmUgY2hhbmdlZC4KKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JTWVtYmVyPC9jb2RlPi4gCisJICovCisJcHVibGljIGludCBGX01PRElGSUVSUyA9IDB4MDAwMjsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuCisJICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gPGNvZGU+SVBhcmVudDwvY29kZT4uIAorCSAqLworCXB1YmxpYyBpbnQgRl9DSElMRFJFTiA9IDB4MDAwODsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCB3YXMgbW92ZWQgZnJvbSBhbm90aGVyIGxvY2F0aW9uLgorCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgb2xkIGVsZW1lbnQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRNb3ZlZEZyb21FbGVtZW50PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgaW50IEZfTU9WRURfRlJPTSA9IDB4MDAxMDsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZWxlbWVudCB3YXMgbW92ZWQgdG8gYW5vdGhlciBsb2NhdGlvbi4KKwkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIG5ldyBlbGVtZW50IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0TW92ZWRUb0VsZW1lbnQ8L2NvZGU+LgorCSAqLworCXB1YmxpYyBpbnQgRl9NT1ZFRF9UTyA9IDB4MDAyMDsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLiAKKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uCisJICovCisJcHVibGljIGludCBGX0FEREVEX1RPX0NMQVNTUEFUSCA9IDB4MDA0MDsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdCdzIAorCSAqIGNsYXNzcGF0aC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+LgorCSAqLworCXB1YmxpYyBpbnQgRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIID0gMHgwMDgwOworCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgcG9zaXRpb24gaW4gdGhlIHByb2plY3QncyAKKwkgKiBjbGFzc3BhdGguIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgaW50IEZfQ0xBU1NQQVRIX1JFT1JERVIgPSAweDAxMDA7CisKKwkvKioKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+SVByb2plY3Q8L2NvZGU+IGhhcyBiZWVuCisJICogb3BlbmVkLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+LiAKKwkgKi8KKwlwdWJsaWMgaW50IEZfT1BFTkVEID0gMHgwMjAwOworCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB1bmRlcmx5aW5nIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBoYXMgYmVlbgorCSAqIGNsb3NlZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4gCisJICovCisJcHVibGljIGludCBGX0NMT1NFRCA9IDB4MDQwMDsKKworCS8qKgorCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCBvbmUgb2YgdGhlIHN1cGVydHlwZXMgb2YgYW4gPGNvZGU+SVR5cGU8L2NvZGU+CisJICogaGFzIGNoYW5nZWQuCisJICovCisJcHVibGljIGludCBGX1NVUEVSX1RZUEVTID0gMHgwODAwOworCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggb2YgYSBjbGFzc3BhdGggZW50cnkgCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCB3YXMgYWRkZWQuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbGVtZW50IGlzIGFuIAorCSAqIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgaW50IEZfU09VUkNFQVRUQUNIRUQgPSAweDEwMDA7CQorCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIG9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggb2YgYSBjbGFzc3BhdGggZW50cnkgCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZC4gVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gCisJICogPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+LgorCSAqLworCXB1YmxpYyBpbnQgRl9TT1VSQ0VERVRBQ0hFRCA9IDB4MjAwMDsJCisJCisJLyoqCisJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYSBmaW5lLWdyYWluZWQgZGVsdGEsIGkuZS4mbmJzcDthbiBhbmFseXNpcyBkb3duCisJICogdG8gdGhlIG1lbWJlcnMgbGV2ZWwgd2FzIGRvbmUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHdlcmUgc3RydWN0dXJhbCBjaGFuZ2VzIHRvCisJICogbWVtYmVycy4KKwkgKiA8cD4KKwkgKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBmbGFnIHRvIGZpbmQgb3V0IGlmIGEgY29tcGlsYXRpb24gdW5pdCAKKyAgICAgKiB0aGF0IGhhdmUgYSA8Y29kZT5GX0NPTlRFTlQ8L2NvZGU+IGNoYW5nZSBzaG91bGQgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIAorICAgICAqIG5vIGZpbmVyIGdyYWluZWQgY2hhbmdlcyAoPGNvZGU+Rl9GSU5FX0dSQUlORUQ8L2NvZGU+IGlzIHNldCkgb3IgaWYgCisgICAgICogZmluZXIgZ3JhaW5lZCBjaGFuZ2VzIHdlcmUgbm90IGNvbnNpZGVyZWQgKDxjb2RlPkZfRklORV9HUkFJTkVEPC9jb2RlPiAKKyAgICAgKiBpcyBub3Qgc2V0KS4gCisgICAgICogCisgICAgICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBpbnQgRl9GSU5FX0dSQUlORUQgPSAweDQwMDA7CisKKwkvKioKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQncyBhcmNoaXZlIGNvbnRlbnQgb24gdGhlIGNsYXNzcGF0aCBoYXMgY2hhbmdlZC4KKwkgKiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4KKwkgKiB3aGljaCBpcyBhbiBhcmNoaXZlLgorCSAqIAorCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjaXNBcmNoaXZlCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBpbnQgRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCA9IDB4ODAwMDsKKworLyoqCisgKiBSZXR1cm5zIGRlbHRhcyBmb3IgdGhlIGNoaWxkcmVuIHRoYXQgaGF2ZSBiZWVuIGFkZGVkLgorICovCitwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRBZGRlZENoaWxkcmVuKCk7CisvKioKKyAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQgKGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkKSBjaGlsZHJlbi4KKyAqIEByZXR1cm4gZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQgKGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkKSBjaGlsZHJlbgorICovCitwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKCk7CisvKioKKyAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgY2hpbGRyZW4gd2hpY2ggaGF2ZSBjaGFuZ2VkLgorICogQHJldHVybiBkZWx0YXMgZm9yIHRoZSBjaGlsZHJlbiB3aGljaCBoYXZlIGNoYW5nZWQKKyAqLworcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZ2V0Q2hhbmdlZENoaWxkcmVuKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCB0aGlzIGRlbHRhIGRlc2NyaWJlcyBhIGNoYW5nZSB0by4KKyAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB0aGlzIGRlbHRhIGRlc2NyaWJlcyBhIGNoYW5nZSB0bworICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldEVsZW1lbnQoKTsKKy8qKgorICogUmV0dXJucyBmbGFncyB0aGF0IGRlc2NyaWJlIGhvdyBhbiBlbGVtZW50IGhhcyBjaGFuZ2VkLiAKKyAqIFN1Y2ggZmxhZ3Mgc2hvdWxkIGJlIHRlc3RlZCB1c2luZyB0aGUgPGNvZGU+JjwvY29kZT4gb3BlcmFuZCwgZS5nLgorICogPHByZT4KKyAqIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCkgIT0gMCkgeworICogCS8vIHRoZSBkZWx0YSBpbmRpY2F0ZXMgYSBjb250ZW50IGNoYW5nZQorICogfQorICogPC9wcmU+CisgKgorICogQHJldHVybiBmbGFncyB0aGF0IGRlc2NyaWJlIGhvdyBhbiBlbGVtZW50IGhhcyBjaGFuZ2VkCisgKi8KK3B1YmxpYyBpbnQgZ2V0RmxhZ3MoKTsKKy8qKgorICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIGRlbHRhIC0gb25lIG9mIDxjb2RlPkFEREVEPC9jb2RlPiwgPGNvZGU+UkVNT1ZFRDwvY29kZT4sCisgKiBvciA8Y29kZT5DSEFOR0VEPC9jb2RlPi4KKyAqIAorICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIGRlbHRhCisgKi8KK3B1YmxpYyBpbnQgZ2V0S2luZCgpOworLyoqCisgKiBSZXR1cm5zIGFuIGVsZW1lbnQgZGVzY3JpYmluZyB0aGlzIGVsZW1lbnQgYmVmb3JlIGl0IHdhcyBtb3ZlZAorICogdG8gaXRzIGN1cnJlbnQgbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICogPGNvZGU+Rl9NT1ZFRF9GUk9NPC9jb2RlPiBjaGFuZ2UgZmxhZyBpcyBub3Qgc2V0LiAKKyAqIAorICogQHJldHVybiBhbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBlbGVtZW50IGJlZm9yZSBpdCB3YXMgbW92ZWQKKyAqIHRvIGl0cyBjdXJyZW50IGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAqIDxjb2RlPkZfTU9WRURfRlJPTTwvY29kZT4gY2hhbmdlIGZsYWcgaXMgbm90IHNldAorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldE1vdmVkRnJvbUVsZW1lbnQoKTsKKy8qKgorICogUmV0dXJucyBhbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBlbGVtZW50IGluIGl0cyBuZXcgbG9jYXRpb24sCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgPGNvZGU+Rl9NT1ZFRF9UTzwvY29kZT4gY2hhbmdlCisgKiBmbGFnIGlzIG5vdCBzZXQuCisgKiAKKyAqIEByZXR1cm4gYW4gZWxlbWVudCBkZXNjcmliaW5nIHRoaXMgZWxlbWVudCBpbiBpdHMgbmV3IGxvY2F0aW9uLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPkZfTU9WRURfVE88L2NvZGU+IGNoYW5nZQorICogZmxhZyBpcyBub3Qgc2V0CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0TW92ZWRUb0VsZW1lbnQoKTsKKy8qKgorICogUmV0dXJucyBkZWx0YXMgZm9yIHRoZSBjaGlsZHJlbiB3aGljaCBoYXZlIGJlZW4gcmVtb3ZlZC4KKyAqIAorICogQHJldHVybiBkZWx0YXMgZm9yIHRoZSBjaGlsZHJlbiB3aGljaCBoYXZlIGJlZW4gcmVtb3ZlZAorICovCitwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRSZW1vdmVkQ2hpbGRyZW4oKTsKKy8qKgorICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZSBkZWx0YXMuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCByZXNvdXJjZSBkZWx0YXMsIGxpa2UgSmF2YSBlbGVtZW50IGRlbHRhcywgYXJlIGdlbmVyYWxseSBvbmx5IHZhbGlkCisgKiBmb3IgdGhlIGR5bmFtaWMgc2NvcGUgb2YgYW4gZXZlbnQgbm90aWZpY2F0aW9uLiBDbGllbnRzIG11c3Qgbm90IGhhbmcgb24gdG8KKyAqIHRoZXNlIG9iamVjdHMuCisgKiA8L3A+CisgKgorICogQHJldHVybiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBkZWx0YXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqLworcHVibGljIElSZXNvdXJjZURlbHRhW10gZ2V0UmVzb3VyY2VEZWx0YXMoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBkNGNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKKy8qKgorICogUmVwcmVzZW50IHRoZSByb290IEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSB3b3Jrc3BhY2UuIAorICogU2luY2UgdGhlcmUgaXMgb25seSBvbmUgc3VjaCByb290IGVsZW1lbnQsIGl0IGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzCisgKiA8ZW0+dGhlPC9lbT4gSmF2YSBtb2RlbCBlbGVtZW50LgorICogVGhlIEphdmEgbW9kZWwgZWxlbWVudCBuZWVkcyB0byBiZSBvcGVuZWQgYmVmb3JlIGl0IGNhbiBiZSBuYXZpZ2F0ZWQgb3IgbWFuaXB1bGF0ZWQuCisgKiBUaGUgSmF2YSBtb2RlbCBlbGVtZW50IGhhcyBubyBwYXJlbnQgKGl0IGlzIHRoZSByb290IG9mIHRoZSBKYXZhIGVsZW1lbnQgCisgKiBoaWVyYXJjaHkpLiBJdHMgY2hpbGRyZW4gYXJlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT5zLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBwZXJmb3JtaW5nIGNvcHksIG1vdmUsIHJlbmFtZSwgYW5kCisgKiBkZWxldGUgb3BlcmF0aW9ucyBvbiBtdWx0aXBsZSBKYXZhIGVsZW1lbnRzLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gQW4gaW5zdGFuY2UKKyAqIG9mIG9uZSBvZiB0aGVzZSBoYW5kbGVzIGNhbiBiZSBjcmVhdGVkIHZpYQorICogPGNvZGU+SmF2YUNvcmUuY3JlYXRlKHdvcmtzcGFjZS5nZXRSb290KCkpPC9jb2RlPi4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIEphdmFDb3JlI2NyZWF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCkKKyAqLworcHVibGljIGludGVyZmFjZSBJSmF2YU1vZGVsIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJT3BlbmFibGUsIElQYXJlbnQgeworLyoqCisgKiBDb3BpZXMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyKHMpLgorICogSWYgb25lIGNvbnRhaW5lciBpcyBzcGVjaWZpZWQsIGFsbCBlbGVtZW50cyBhcmUgY29waWVkIHRvIHRoYXQKKyAqIGNvbnRhaW5lci4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWluZXIgaXMgc3BlY2lmaWVkLCB0aGUgbnVtYmVyIG9mCisgKiBlbGVtZW50cyBhbmQgY29udGFpbmVycyBtdXN0IG1hdGNoLCBhbmQgZWFjaCBlbGVtZW50IGlzIGNvcGllZCB0bworICogaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyLgorICogPHA+CisgKiBPcHRpb25hbGx5LCBlYWNoIGNvcHkgY2FuIHBvc2l0aW9uZWQgYmVmb3JlIGEgc2libGluZworICogZWxlbWVudC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkIGZvciBhIGdpdmVuIHNpYmxpbmcsIHRoZSBjb3B5CisgKiBpcyBpbnNlcnRlZCBhcyB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIE9wdGlvbmFsbHksIGVhY2ggY29weSBjYW4gYmUgcmVuYW1lZC4gSWYgCisgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQgZm9yIHRoZSBuZXcgbmFtZSwgdGhlIGNvcHkKKyAqIGlzIG5vdCByZW5hbWVkLiAKKyAqIDwvcD4KKyAqIDxwPgorICogT3B0aW9uYWxseSwgYW55IGV4aXN0aW5nIGNoaWxkIGluIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgd2l0aAorICogdGhlIHNhbWUgbmFtZSBjYW4gYmUgcmVwbGFjZWQgYnkgc3BlY2lmeWluZyA8Y29kZT50cnVlPC9jb2RlPiBmb3IKKyAqIGZvcmNlLiBPdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgZXZlbnQgdGhhdCBhIG5hbWUKKyAqIGNvbGxpc2lvbiBvY2N1cnMuCisgKiA8L3A+CisgKgorICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0byBjb3B5CisgKiBAcGFyYW0gY29udGFpbmVycyB0aGUgY29udGFpbmVyLCBvciBsaXN0IG9mIGNvbnRhaW5lcnMKKyAqIEBwYXJhbSBzaWJsaW5ncyB0aGUgbGlzdCBvZiBzaWJsaW5ncyBlbGVtZW50IGFueSBvZiB3aGljaCBtYXkgYmUKKyAqICAgPGNvZGU+bnVsbDwvY29kZT47IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBAcGFyYW0gcmVuYW1pbmdzIHRoZSBsaXN0IG9mIG5ldyBuYW1lcyBhbnkgb2Ygd2hpY2ggbWF5IGJlCisgKiAgIDxjb2RlPm51bGw8L2NvZGU+OyBvciA8Y29kZT5udWxsPC9jb2RlPgorICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IGV4aXN0aW5nIGNoaWxkIGluIGEgdGFyZ2V0IGNvbnRhaW5lcgorICogICB3aXRoIHRoZSB0YXJnZXQgbmFtZSBzaG91bGQgYmUgcmVwbGFjZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdGhyb3cgYW4KKyAqICAgZXhjZXB0aW9uIGluIHRoZSBldmVudCBvZiBhIG5hbWUgY29sbGlzaW9uCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVsZW1lbnQgY291bGQgbm90IGJlIGNvcGllZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50LCBjb250YWluZXIsIG9yIHNpYmxpbmcgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKyAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisgKiA8bGk+IEEgY29udGFpbmVyIGlzIG9mIGFuIGluY29tcGF0aWJsZSB0eXBlICg8Y29kZT5JTlZBTElEX0RFU1RJTkFUSU9OPC9jb2RlPikKKyAqIDxsaT4gQSBzaWJsaW5nIGlzIG5vdCBhIGNoaWxkIG9mIGl0IGFzc29jaWF0ZWQgY29udGFpbmVyICg8Y29kZT5JTlZBTElEX1NJQkxJTkc8L2NvZGU+KQorICogPGxpPiBBIG5ldyBuYW1lIGlzIGludmFsaWQgKDxjb2RlPklOVkFMSURfTkFNRTwvY29kZT4pCisgKiA8bGk+IEEgY2hpbGQgaW4gaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUKKyAqIAkJbmFtZSBhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiAoPGNvZGU+TkFNRV9DT0xMSVNJT048L2NvZGU+KQorICogPGxpPiBBIGNvbnRhaW5lciBvciBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgCisgKiA8L3VsPgorICovCit2b2lkIGNvcHkoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBlbGVtZW50cywgZm9yY2luZyB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeSBhbmQgc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gZGVsZXRlCisgKiBAcGFyYW0gZm9yY2UgYSBmbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgdW5kZXJseWluZyByZXNvdXJjZXMgdGhhdCBhcmUgbm90CisgKiAgICBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHdpbGwgYmUgdG9sZXJhdGVkCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVsZW1lbnQgY291bGQgbm90IGJlIGRlbGV0ZWQuIFJlYXNvbnMgaW5jbHVkZToKKyAqIDx1bD4KKyAqIDxsaT4gQSBzcGVjaWZpZWQgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKyAqIDxsaT4gQW4gZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pIAorICogPC91bD4KKyAqLwordm9pZCBkZWxldGUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgSmF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuIAorICogVGhlIHByb2plY3QgbWF5IG9yIG1heSBub3QgZXhpc3QuCisgKiAKKyAqIEByZXR1cm4gdGhlIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKi8KK0lKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChTdHJpbmcgbmFtZSk7CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdHMgaW4gdGhpcyBKYXZhIG1vZGVsLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZQorICogYXJlIG5vbmUuCisgKgorICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0cyBpbiB0aGlzIEphdmEgbW9kZWwsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlCisgKiBhcmUgbm9uZQorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyByZXF1ZXN0IGZhaWxzLgorICovCitJSmF2YVByb2plY3RbXSBnZXRKYXZhUHJvamVjdHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YSBtb2RlbC4KKyAqIAorICogQHJldHVybiB0aGUgd29ya3NwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEphdmEgbW9kZWwKKyAqLworSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKTsKKy8qKgorICogTW92ZXMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyKHMpLgorICogSWYgb25lIGNvbnRhaW5lciBpcyBzcGVjaWZpZWQsIGFsbCBlbGVtZW50cyBhcmUgbW92ZWQgdG8gdGhhdAorICogY29udGFpbmVyLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhaW5lciBpcyBzcGVjaWZpZWQsIHRoZSBudW1iZXIgb2YKKyAqIGVsZW1lbnRzIGFuZCBjb250YWluZXJzIG11c3QgbWF0Y2gsIGFuZCBlYWNoIGVsZW1lbnQgaXMgbW92ZWQgdG8KKyAqIGl0cyBhc3NvY2lhdGVkIGNvbnRhaW5lci4KKyAqIDxwPgorICogT3B0aW9uYWxseSwgZWFjaCBlbGVtZW50IGNhbiBwb3NpdGlvbmVkIGJlZm9yZSBhIHNpYmxpbmcKKyAqIGVsZW1lbnQuIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZCBmb3Igc2libGluZywgdGhlIGVsZW1lbnQKKyAqIGlzIGluc2VydGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBhc3NvY2lhdGVkIGNvbnRhaW5lci4KKyAqIDwvcD4KKyAqIDxwPgorICogT3B0aW9uYWxseSwgZWFjaCBlbGVtZW50IGNhbiBiZSByZW5hbWVkLiBJZiAKKyAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZCBmb3IgdGhlIG5ldyBuYW1lLCB0aGUgZWxlbWVudAorICogaXMgbm90IHJlbmFtZWQuIAorICogPC9wPgorICogPHA+CisgKiBPcHRpb25hbGx5LCBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoCisgKiB0aGUgc2FtZSBuYW1lIGNhbiBiZSByZXBsYWNlZCBieSBzcGVjaWZ5aW5nIDxjb2RlPnRydWU8L2NvZGU+IGZvcgorICogZm9yY2UuIE90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBldmVudCB0aGF0IGEgbmFtZQorICogY29sbGlzaW9uIG9jY3Vycy4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIG1vdmUKKyAqIEBwYXJhbSBjb250YWluZXJzIHRoZSBjb250YWluZXIsIG9yIGxpc3Qgb2YgY29udGFpbmVycworICogQHBhcmFtIHNpYmxpbmdzIHRoZSBsaXN0IG9mIHNpYmxpbmdzIGVsZW1lbnQgYW55IG9mIHdoaWNoIG1heSBiZQorICogICA8Y29kZT5udWxsPC9jb2RlPjsgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEBwYXJhbSByZW5hbWluZ3MgdGhlIGxpc3Qgb2YgbmV3IG5hbWVzIGFueSBvZiB3aGljaCBtYXkgYmUKKyAqICAgPGNvZGU+bnVsbDwvY29kZT47IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBAcGFyYW0gcmVwbGFjZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gYSB0YXJnZXQgY29udGFpbmVyCisgKiAgIHdpdGggdGhlIHRhcmdldCBuYW1lIHNob3VsZCBiZSByZXBsYWNlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB0aHJvdyBhbgorICogICBleGNlcHRpb24gaW4gdGhlIGV2ZW50IG9mIGEgbmFtZSBjb2xsaXNpb24KKyAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbW92ZWQuIFJlYXNvbnMgaW5jbHVkZToKKyAqIDx1bD4KKyAqIDxsaT4gQSBzcGVjaWZpZWQgZWxlbWVudCwgY29udGFpbmVyLCBvciBzaWJsaW5nIGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQorICogPGxpPiBBIGNvbnRhaW5lciBpcyBvZiBhbiBpbmNvbXBhdGlibGUgdHlwZSAoPGNvZGU+SU5WQUxJRF9ERVNUSU5BVElPTjwvY29kZT4pCisgKiA8bGk+IEEgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiBpdCBhc3NvY2lhdGVkIGNvbnRhaW5lciAoPGNvZGU+SU5WQUxJRF9TSUJMSU5HPC9jb2RlPikKKyAqIDxsaT4gQSBuZXcgbmFtZSBpcyBpbnZhbGlkICg8Y29kZT5JTlZBTElEX05BTUU8L2NvZGU+KQorICogPGxpPiBBIGNoaWxkIGluIGl0cyBhc3NvY2lhdGVkIGNvbnRhaW5lciBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lCisgKiAJCW5hbWUgYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4gKDxjb2RlPk5BTUVfQ09MTElTSU9OPC9jb2RlPikKKyAqIDxsaT4gQSBjb250YWluZXIgb3IgZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pIAorICogPC91bD4KKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhbnkgZWxlbWVudCBvciBjb250YWluZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqLwordm9pZCBtb3ZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzLCBJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncywgU3RyaW5nW10gcmVuYW1pbmdzLCBib29sZWFuIHJlcGxhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmlnZ2VycyBhbiB1cGRhdGUgb2YgdGhlIEphdmFNb2RlbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlZmVyZW5jZWQgZXh0ZXJuYWwgYXJjaGl2ZXMuCisgKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGlzc3VlIGEgSmF2YU1vZGVsIGRlbHRhIGRlc2NyaWJpbmcgdGhlIGRpc2NvdmVyZWQgY2hhbmdlcywgaW4gdGVybQorICogb2YgSmF2YSBlbGVtZW50IHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYWRkZWQsIHJlbW92ZWQgb3IgY2hhbmdlZC4KKyAqIE5vdGUgdGhhdCBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgY2FuIGJlIHBhc3NlZCBzbyBhcyB0byBuYXJyb3cgdGhlIHNldCBvZiBhcmNoaXZlcworICogdG8gcmVmcmVzaCAocGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBhbG9uZyBpcyBlcXVpdmFsZW50IHRvIHJlZnJlc2hpbmcgdGhlIGVudGlyZSBtb2RlKS4gCisgKiBUaGUgZWxlbWVudHMgY2FuIGJlOgorICogPHVsPgorICogPGxpPiBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGNvcnJlc3BvbmRpbmcgdG8gZXh0ZXJuYWwgYXJjaGl2ZXMKKyAqIDxsaT4gSmF2YSBwcm9qZWN0cywgd2hpY2ggcmVmZXJlbmNlZCBleHRlcm5hbCBhcmNoaXZlcyB3aWxsIGJlIHJlZnJlc2hlZAorICogPGxpPiBKYXZhIG1vZGVsLCBhbGwgcmVmZXJlbmNlZCBleHRlcm5hbCBhcmNoaXZlcyB3aWxsIGJlIHJlZnJlc2hlZC4KKyAqIDwvdWw+CisgKiA8cD4gSW4gY2FzZSBhbiBhcmNoaXZlIGlzIHVzZWQgYnkgbXVsdGlwbGUgcHJvamVjdHMsIHRoZSBkZWx0YSBpc3N1ZWQgd2lsbCBhY2NvdW50IGZvcgorICogYWxsIG9mIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCBldmVuIGlmIGEgcHJvamVjdCB3YXMgbm90IHBhcnQgb2YgdGhlIGVsZW1lbnRzIHNjb3BlLCBpdAorICogbWF5IHN0aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgaWYgaXQgaXMgcmVmZXJlbmNpbmcgYSBsaWJyYXJ5IGNvbXByaXNlZCBpbiB0aGUgc2NvcGUuCisgKiA8cD4KKyAqIEBwYXJhbSBlbGVtZW50c1Njb3BlIC0gYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGRlZmluaW5nIHRoZSBzY29wZSBvZiB0aGUgcmVmcmVzaAorICogQHBhcmFtIG1vbml0b3IgLSBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGluIG9uZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzaXR1YXRpb246CisgKiA8dWw+CisgKiAgICA8bGk+IGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIHByb2plY3QgcmVzb3VyY2VzIDwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisgKiBAc2luY2UgMi4wCisgKi8KK3ZvaWQgcmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMoSUphdmFFbGVtZW50W10gZWxlbWVudHNTY29wZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIFJlbmFtZXMgdGhlIGdpdmVuIGVsZW1lbnRzIGFzIHNwZWNpZmllZC4KKyAqIElmIG9uZSBjb250YWluZXIgaXMgc3BlY2lmaWVkLCBhbGwgZWxlbWVudHMgYXJlIHJlbmFtZWQgd2l0aGluIHRoYXQKKyAqIGNvbnRhaW5lci4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWluZXIgaXMgc3BlY2lmaWVkLCB0aGUgbnVtYmVyIG9mCisgKiBlbGVtZW50cyBhbmQgY29udGFpbmVycyBtdXN0IG1hdGNoLCBhbmQgZWFjaCBlbGVtZW50IGlzIHJlbmFtZWQgd2l0aGluCisgKiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIuCisgKgorICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0byByZW5hbWUKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbnMgdGhlIGNvbnRhaW5lciwgb3IgbGlzdCBvZiBjb250YWluZXJzCisgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgbmV3IG5hbWVzCisgKiBAcGFyYW0gcmVwbGFjZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiBleGlzdGluZyBjaGlsZCBpbiBhIHRhcmdldCBjb250YWluZXIKKyAqICAgd2l0aCB0aGUgdGFyZ2V0IG5hbWUgc2hvdWxkIGJlIHJlcGxhY2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHRocm93IGFuCisgKiAgIGV4Y2VwdGlvbiBpbiB0aGUgZXZlbnQgb2YgYSBuYW1lIGNvbGxpc2lvbgorICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBhbiBlbGVtZW50IGNvdWxkIG5vdCBiZSByZW5hbWVkLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiA8bGk+IEEgc3BlY2lmaWVkIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKyAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisgKiA8bGk+IEEgbmV3IG5hbWUgaXMgaW52YWxpZCAoPGNvZGU+SU5WQUxJRF9OQU1FPC9jb2RlPikKKyAqIDxsaT4gQSBjaGlsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4gKDxjb2RlPk5BTUVfQ09MTElTSU9OPC9jb2RlPikKKyAqIDxsaT4gQW4gZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pIAorICogPC91bD4KKyAqLwordm9pZCByZW5hbWUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGRlc3RpbmF0aW9ucywgU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3YWZlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBNYXJrZXJzIHVzZWQgYnkgdGhlIEphdmEgbW9kZWwuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlY2xhcmVzIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKKyAqIG9yIGV4dGVuZGVkLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhTW9kZWxNYXJrZXIgeworCisJLyoqCisJICogSmF2YSBtb2RlbCBwcm9ibGVtIG1hcmtlciB0eXBlICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSI8L2NvZGU+KS4KKwkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSB0aG9zZSBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBmbGFnIHByb2JsZW1zIAorCSAqIGRldGVjdGVkIGJ5IHRoZSBKYXZhIHRvb2xpbmcgZHVyaW5nIGNvbXBpbGF0aW9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLnByb2JsZW0iOyAvLyROT04tTkxTLTEkCisKKworCS8qKgorCSAqIEphdmEgbW9kZWwgdHJhbnNpZW50IHByb2JsZW0gbWFya2VyIHR5cGUgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS50cmFuc2llbnRfcHJvYmxlbSI8L2NvZGU+KS4KKwkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSB0aG9zZSBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBmbGFnIHRyYW5zaWVudAorCSAqIHByb2JsZW1zIGRldGVjdGVkIGJ5IHRoZSBKYXZhIHRvb2xpbmcgKHN1Y2ggYXMgYSBwcm9ibGVtCisJICogZGV0ZWN0ZWQgYnkgdGhlIG91dGxpbmVyLCBvciBhIHByb2JsZW0gZGV0ZWN0ZWQgZHVyaW5nIGEgY29kZSBjb21wbGV0aW9uKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSUVOVF9QUk9CTEVNID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi50cmFuc2llbnRfcHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKKyAgICAKKyAgICAvKiogCisJICogSWQgbWFya2VyIGF0dHJpYnV0ZSAodmFsdWUgPGNvZGU+ImFyZ3VtZW50cyI8L2NvZGU+KS4KKwkgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKwkgKiAKKwkgKiBAc2luY2UgMi4wCisJICovCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UUyA9ICJhcmd1bWVudHMiOyAvLyROT04tTkxTLTEkCisgICAgCisJLyoqIAorCSAqIElkIG1hcmtlciBhdHRyaWJ1dGUgKHZhbHVlIDxjb2RlPiJpZCI8L2NvZGU+KS4KKwkgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKwkgKi8KKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCisKKwkvKiogCisJICogRmxhZ3MgbWFya2VyIGF0dHJpYnV0ZSAodmFsdWUgPGNvZGU+ImZsYWdzIjwvY29kZT4pLgorCSAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorCSAqLworCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHUyA9ICJmbGFncyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKiAKKwkgKiBDeWNsZSBkZXRlY3RlZCBtYXJrZXIgYXR0cmlidXRlICh2YWx1ZSA8Y29kZT4iY3ljbGVEZXRlY3RlZCI8L2NvZGU+KS4KKwkgKiBVc2VkIG9ubHkgb24gYnVpbGRwYXRoIHByb2JsZW0gbWFya2Vycy4KKwkgKiBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgZWl0aGVyICJ0cnVlIiBvciAiZmFsc2UiLgorCSAqLworCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWUNMRV9ERVRFQ1RFRCA9ICJjeWNsZURldGVjdGVkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQnVpbGQgcGF0aCBwcm9ibGVtIG1hcmtlciB0eXBlICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRwYXRoX3Byb2JsZW0iPC9jb2RlPikuCisJICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgdGhvc2UgbWFya2VycyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgZmxhZyBwcm9ibGVtcyAKKwkgKiBkZXRlY3RlZCBieSB0aGUgSmF2YSB0b29saW5nIGR1cmluZyBjbGFzc3BhdGggc2V0dGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIgPSBKYXZhQ29yZS5QTFVHSU5fSUQgKyAiLmJ1aWxkcGF0aF9wcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKiAKKwkgKiBDbGFzc3BhdGggZmlsZSBmb3JtYXQgbWFya2VyIGF0dHJpYnV0ZSAodmFsdWUgPGNvZGU+ImNsYXNzcGF0aEZpbGVGb3JtYXQiPC9jb2RlPikuCisJICogVXNlZCBvbmx5IG9uIGJ1aWxkcGF0aCBwcm9ibGVtIG1hcmtlcnMuCisJICogVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGVpdGhlciAidHJ1ZSIgb3IgImZhbHNlIi4KKwkgKiAKKwkgKiBAc2luY2UgMi4wCisJICovCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9GSUxFX0ZPUk1BVCA9ICJjbGFzc3BhdGhGaWxlRm9ybWF0IjsgLy8kTk9OLU5MUy0xJAorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWE4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgb3V0Y29tZSBvZiBhbiBKYXZhIG1vZGVsIG9wZXJhdGlvbi4gU3RhdHVzIG9iamVjdHMgYXJlCisgKiB1c2VkIGluc2lkZSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IG9iamVjdHMgdG8gaW5kaWNhdGUgd2hhdCB3ZW50CisgKiB3cm9uZy4KKyAqIDxwPgorICogSmF2YSBtb2RlbCBzdGF0dXMgb2JqZWN0IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIHBsdWctaW4gaWQ6CisgKiA8Y29kZT5nZXRQbHVnaW48L2NvZGU+IHJldHVybnMgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlIjwvY29kZT4uCisgKiA8Y29kZT5nZXRDb2RlPC9jb2RlPiByZXR1cm5zIG9uZSBvZiB0aGUgc3RhdHVzIGNvZGVzIGRlY2xhcmVkIGluCisgKiA8Y29kZT5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzPC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogQSBKYXZhIG1vZGVsIHN0YXR1cyBtYXkgYWxzbyBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh0aGF0IGlzLCBpbiAKKyAqIGFkZGl0aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBkZWZpbmVkIGluIDxjb2RlPklTdGF0dXM8L2NvZGU+KToKKyAqIDx1bD4KKyAqICAgPGxpPmVsZW1lbnRzIC0gb3B0aW9uYWwgaGFuZGxlcyB0byBKYXZhIGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFpbHVyZTwvbGk+CisgKiAgIDxsaT5zdHJpbmcgLSBvcHRpb25hbCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBmYWlsdXJlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cworICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhTW9kZWxTdGF0dXMgZXh0ZW5kcyBJU3RhdHVzIHsKKy8qKgorICogUmV0dXJucyBhbnkgSmF2YSBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGZhaWx1cmUgKHNlZSBzcGVjaWZpY2F0aW9uCisgKiBvZiB0aGUgc3RhdHVzIGNvZGUpLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyBlbGVtZW50cyBhcmUgcmVsYXRlZCB0byB0aGlzCisgKiBwYXJ0aWN1bGFyIHN0YXR1cyBjb2RlLgorICoKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgSmF2YSBlbGVtZW50IGN1bHByaXRzCisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMKKyAqLworSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIGZhaWx1cmUgKHNlZSBzcGVjaWZpY2F0aW9uCisgKiBvZiB0aGUgc3RhdHVzIGNvZGUpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmFpbHVyZSBpcyBub3QgCisgKiBvbmUgb2YgPGNvZGU+REVWSUNFX1BBVEg8L2NvZGU+LCA8Y29kZT5JTlZBTElEX1BBVEg8L2NvZGU+LCAKKyAqIDxjb2RlPlBBVEhfT1VUU0lERV9QUk9KRUNUPC9jb2RlPiwgb3IgPGNvZGU+UkVMQVRJVkVfUEFUSDwvY29kZT4uCisgKgorICogQHJldHVybiB0aGUgcGF0aCB0aGF0IGNhdXNlZCB0aGUgZmFpbHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzI0RFVklDRV9QQVRICisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjSU5WQUxJRF9QQVRICisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjUEFUSF9PVVRTSURFX1BST0pFQ1QKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cyNSRUxBVElWRV9QQVRICisgKi8KK0lQYXRoIGdldFBhdGgoKTsKKy8qKgorICogUmV0dXJucyB0aGUgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFpbHVyZSAoc2VlIHNwZWNpZmljYXRpb24KKyAqIG9mIHRoZSBzdGF0dXMgY29kZSksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN0cmluZyBpcyByZWxhdGVkIHRvIHRoaXMKKyAqIHBhcnRpY3VsYXIgc3RhdHVzIGNvZGUuCisgKgorICogQHJldHVybiB0aGUgc3RyaW5nIGN1bHByaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cworICovCitTdHJpbmcgZ2V0U3RyaW5nKCk7CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCBhIEphdmEgbW9kZWwgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKyAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KKyAqIDxjb2RlPmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1Q8L2NvZGU+LgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0YXR1cyBjb2RlIGluZGljYXRlcyB0aGF0IGEgSmF2YSBtb2RlbAorICogICBlbGVtZW50IGRvZXMgbm90IGV4aXN0CisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMjRUxFTUVOVF9ET0VTX05PVF9FWElTVAorICovCitib29sZWFuIGlzRG9lc05vdEV4aXN0KCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1MmFjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogU3RhdHVzIGNvZGVzIHVzZWQgd2l0aCBKYXZhIG1vZGVsIHN0YXR1cyBvYmplY3RzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBkZWNsYXJlcyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCisgKiBvciBleHRlbmRlZC4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKKyAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0Q29kZSgpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cyB7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgY29udGFpbmVyIHBhdGggd2FzIHJlc29sdmVkCisJICogdG8gaW52YWxpZCBlbnRyaWVzIChudWxsIG9yIGNvbnRhaW5lcikuCisJICogCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ1BfQ09OVEFJTkVSX0VOVFJZID0gOTYyOworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIGNvbnRhaW5lciBwYXRoIHdhcyBub3QgcmVzb2x2YWJsZQorCSAqIGluZGljYXRpbmcgZWl0aGVyIHRoZSByZWZlcnJlZCBjb250YWluZXIgaXMgdW5kZWZpbmVkLCB1bmJvdW5kLgorCSAqIAorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUF9DT05UQUlORVJfUEFUSF9VTkJPVU5EID0gOTYzOworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSB3YXMgaW52YWxpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ0xBU1NQQVRIID0gOTY0OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHZhcmlhYmxlIHBhdGggd2FzIG5vdCByZXNvbHZhYmxlCisJICogaW5kaWNhdGluZyBlaXRoZXIgdGhlIHJlZmVycmVkIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdW5ib3VuZCBvciB0aGUgcmVzb2x2ZWQKKwkgKiB2YXJpYWJsZSBwYXRoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW4gZXhpc3RpbmcgZmlsZSBvciBmb2xkZXIuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BfVkFSSUFCTEVfUEFUSF9VTkJPVU5EID0gOTY1OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgYSBjb3JlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKwkgKiBVc2UgPGNvZGU+Z2V0RXhjZXB0aW9uPC9jb2RlPiB0byByZXRyaWV2ZSBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUkVfRVhDRVBUSU9OID0gOTY2OworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIG9uZSBvciBtb3JlIG9mIHRoZSBlbGVtZW50cworCSAqIHN1cHBsaWVkIGFyZSBub3Qgb2YgYSB2YWxpZCB0eXBlIGZvciB0aGUgb3BlcmF0aW9uIHRvCisJICogcHJvY2Vzcy4gCisJICogVGhlIGVsZW1lbnQocykgY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gb24gdGhlIHN0YXR1cyBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9FTEVNRU5UX1RZUEVTID0gOTY3OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBubyBlbGVtZW50cyB3ZXJlCisJICogcHJvdmlkZWQgdG8gdGhlIG9wZXJhdGlvbiBmb3IgcHJvY2Vzc2luZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19FTEVNRU5UU19UT19QUk9DRVNTID0gOTY4OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBvbmUgb3IgbW9yZSBlbGVtZW50cworCSAqIHN1cHBsaWVkIGRvIG5vdCBleGlzdC4gCisJICogVGhlIGVsZW1lbnQocykgY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gb24gdGhlIHN0YXR1cyBvYmplY3QuCisJICoKKwkgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMjaXNEb2VzTm90RXhpc3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0RPRVNfTk9UX0VYSVNUID0gOTY5OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIDxjb2RlPm51bGw8L2NvZGU+IHBhdGggd2FzCisJICogc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX1BBVEggPSA5NzA7CisgICAgCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIHBhdGggb3V0c2lkZSBvZiB0aGUKKwkgKiBwcm9qZWN0IHdhcyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uLiBUaGUgcGF0aCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIAorCSAqIDxjb2RlPmdldFBhdGg8L2NvZGU+IG9uIHRoZSBzdGF0dXMgb2JqZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBVEhfT1VUU0lERV9QUk9KRUNUID0gOTcxOworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSByZWxhdGl2ZSBwYXRoIAorCSAqIHdhcyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIHdoZW4gYW4gYWJzb2x1dGUgcGF0aCBpcworCSAqIHJlcXVpcmVkLiBUaGUgcGF0aCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPmdldFBhdGg8L2NvZGU+IG9uIHRoZQorCSAqIHN0YXR1cyBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfUEFUSCA9IDk3MjsKKyAgICAKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgcGF0aCBzcGVjaWZ5aW5nIGEgZGV2aWNlCisJICogd2FzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24gd2hlbiBhIHBhdGggd2l0aCBubyBkZXZpY2UgaXMKKwkgKiByZXF1aXJlZC4gVGhlIHBhdGggY2FuIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5nZXRQYXRoPC9jb2RlPiBvbiB0aGUKKwkgKiBzdGF0dXMgb2JqZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QQVRIID0gOTczOworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBzdHJpbmcKKwkgKiB3YXMgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiB0aGF0IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX1NUUklORyA9IDk3NDsKKyAgICAKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gZW5jb3VudGVyZWQKKwkgKiBhIHJlYWQtb25seSBlbGVtZW50LgorCSAqIFRoZSBlbGVtZW50KHMpIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0RWxlbWVudHM8L2NvZGU+IG9uIHRoZSBzdGF0dXMgb2JqZWN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfT05MWSA9IDk3NjsKKyAgICAKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgbmFtaW5nIGNvbGxpc2lvbiB3b3VsZCBvY2N1cgorCSAqIGlmIHRoZSBvcGVyYXRpb24gcHJvY2VlZGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MTElTSU9OID0gOTc3OworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBkZXN0aW5hdGlvbiBwcm92aWRlZCBmb3IgYSBjb3B5L21vdmUvcmVuYW1lIG9wZXJhdGlvbiAKKwkgKiBpcyBpbnZhbGlkLiAKKwkgKiBUaGUgZGVzdGluYXRpb24gZWxlbWVudCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBvbiB0aGUgc3RhdHVzIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RFU1RJTkFUSU9OID0gOTc4OworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSBwYXRoIHByb3ZpZGVkIHRvIGFuIG9wZXJhdGlvbiAKKwkgKiBpcyBpbnZhbGlkLiBUaGUgcGF0aCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPmdldFBhdGg8L2NvZGU+IG9uIHRoZQorCSAqIHN0YXR1cyBvYmplY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QQVRIID0gOTc5OworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRFWF9PVVRfT0ZfQk9VTkRTID0gOTgwOworICAgIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIHVwZGF0ZSBjb25mbGljdAorCSAqIGZvciBhIHdvcmtpbmcgY29weS4gVGhlIGNvbXBpbGF0aW9uIHVuaXQgb24gd2hpY2ggdGhlCisJICogd29ya2luZyBjb3B5IGlzIGJhc2VkIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSB3b3JraW5nIGNvcHkKKwkgKiB3YXMgY3JlYXRlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfQ09ORkxJQ1QgPSA5ODE7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IDxjb2RlPm51bGw8L2NvZGU+IHdhcyBzcGVjaWZpZWQKKwkgKiBhcyBhIG5hbWUgYXJndW1lbnQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9OQU1FID0gOTgyOworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCBhIG5hbWUgcHJvdmlkZWQgaXMgbm90IHN5bnRhY3RpY2FsbHkgY29ycmVjdC4KKwkgKiBUaGUgbmFtZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gPGNvZGU+Z2V0U3RyaW5nPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUUgPSA5ODM7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBzcGVjaWZpZWQgY29udGVudHMKKwkgKiBhcmUgbm90IHZhbGlkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ09OVEVOVFMgPSA5ODQ7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGFuIDxjb2RlPmphdmEuaW8uSU9FeGNlcHRpb248L2NvZGU+CisJICogb2NjdXJyZWQuIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElPX0VYQ0VQVElPTiA9IDk4NTsKKworCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+CisJICogb2NjdXJyZWQuIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPTV9FWENFUFRJT04gPSA5ODY7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgPGNvZGU+VGFyZ2V0RXhjZXB0aW9uPC9jb2RlPgorCSAqIG9jY3VycmVkLiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVJHRVRfRVhDRVBUSU9OID0gOTg3OworCisJLyoqCisJICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgSmF2YSBidWlsZGVyCisJICogY291bGQgbm90IGJlIGluaXRpYWxpemVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxERVJfSU5JVElBTElaQVRJT05fRVJST1IgPSA5OTA7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBKYXZhIGJ1aWxkZXIncyBsYXN0IGJ1aWx0IHN0YXRlCisJICogY291bGQgbm90IGJlIHNlcmlhbGl6ZWQgb3IgZGVzZXJpYWxpemVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxERVJfU0VSSUFMSVpBVElPTl9FUlJPUiA9IDk5MTsKKworCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIHdoaWxlCisJICogdHJ5aW5nIHRvIGV2YWx1YXRlIGEgY29kZSBzbmlwcGV0LCBvciBvdGhlciBpdGVtLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWQUxVQVRJT05fRVJST1IgPSA5OTI7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgc2libGluZyBzcGVjaWZpZWQgaXMgbm90IHZhbGlkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0lCTElORyA9IDk5MzsKKworCS8qKgorCSAqIFN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgYSBKYXZhIGVsZW1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQgYmVjYXVzZQorCSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGlzIGludmFsaWQuCisJICogQHNlZSBKYXZhQ29yZQorCSAqLworCSBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFU09VUkNFID0gOTk1OworCisJLyoqCisJICogU3RhdHVzIGluZGljYXRpbmcgdGhhdCBhIEphdmEgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCBiZWNhdXNlCisJICogdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaXMgbm90IG9mIGFuIGFwcHJvcHJpYXRlIHR5cGUuCisJICogQHNlZSBKYXZhQ29yZQorCSAqLworCSBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFU09VUkNFX1RZUEUgPSA5OTY7CisKKwkvKioKKwkgKiBTdGF0dXMgaW5kaWNhdGluZyB0aGF0IGEgSmF2YSBlbGVtZW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGJlY2F1c2UKKwkgKiB0aGUgcHJvamVjdCBvd25pbmcgdW5kZXJseWluZyByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIHRoZSBKYXZhIG5hdHVyZS4KKwkgKiBAc2VlIEphdmFDb3JlCisJICovCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPSkVDVCA9IDk5NzsKKworCS8qKgorCSAqIFN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gaW4gYSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPgorCSAqIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+IGl0IGJlbG9uZ3MgdG8uCisJICogVGhlIDxjb2RlPmdldFN0cmluZzwvY29kZT4gbWV0aG9kIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXR1cyBvYmplY3QKKwkgKiBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gaXMKKwkgKiBkZWNsYXJlZC4KKwkgKi8KKwkgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QQUNLQUdFID0gOTk4OworCisJLyoqCisJICogU3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBoYXMgbm8gbG9jYWwgY29udGVudHMgeWV0LgorCSAqIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgYSByZXNvdXJjZSBiZWZvcmUgaXRzIGNvbnRlbnRzCisJICogaGFzIGJlZW4gbWFkZSBsb2NhbGx5IGF2YWlsYWJsZS4KKwkgKi8KKwkgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTE9DQUxfQ09OVEVOVFMgPSA5OTk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YVByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YVByb2plY3QuamF2YQpAQCAtMCwwICsxLDUwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JRXZhbHVhdGlvbkNvbnRleHQ7CisKKy8qKgorICogQSBKYXZhIHByb2plY3QgcmVwcmVzZW50cyBhIHZpZXcgb2YgYSBwcm9qZWN0IHJlc291cmNlIGluIHRlcm1zIG9mIEphdmEgCisgKiBlbGVtZW50cyBzdWNoIGFzIHBhY2thZ2UgZnJhZ21lbnRzLCB0eXBlcywgbWV0aG9kcyBhbmQgZmllbGRzLgorICogQSBwcm9qZWN0IG1heSBjb250YWluIHNldmVyYWwgcGFja2FnZSByb290cywgd2hpY2ggY29udGFpbiBwYWNrYWdlIGZyYWdtZW50cy4gCisgKiBBIHBhY2thZ2Ugcm9vdCBjb3JyZXNwb25kcyB0byBhbiB1bmRlcmx5aW5nIGZvbGRlciBvciBKQVIuCisgKiA8cD4KKyAqIEVhY2ggSmF2YSBwcm9qZWN0IGhhcyBhIGNsYXNzcGF0aCwgZGVmaW5pbmcgd2hpY2ggZm9sZGVycyBjb250YWluIHNvdXJjZSBjb2RlIGFuZAorICogd2hlcmUgcmVxdWlyZWQgbGlicmFyaWVzIGFyZSBsb2NhdGVkLiBFYWNoIEphdmEgcHJvamVjdCBhbHNvIGhhcyBhbiBvdXRwdXQgbG9jYXRpb24sCisgKiBkZWZpbmluZyB3aGVyZSB0aGUgYnVpbGRlciB3cml0ZXMgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy4gQSBwcm9qZWN0IHRoYXQKKyAqIHJlZmVyZW5jZXMgcGFja2FnZXMgaW4gYW5vdGhlciBwcm9qZWN0IGNhbiBhY2Nlc3MgdGhlIHBhY2thZ2VzIGJ5IGluY2x1ZGluZworICogdGhlIHJlcXVpcmVkIHByb2plY3QgaW4gYSBjbGFzc3BhdGggZW50cnkuIFRoZSBKYXZhIG1vZGVsIHdpbGwgcHJlc2VudCB0aGUKKyAqIHNvdXJjZSBlbGVtZW50cyBpbiB0aGUgcmVxdWlyZWQgcHJvamVjdCwgYW5kIHdoZW4gYnVpbGRpbmcsIHRoZSBjb21waWxlciB3aWxsCisgKiB1c2UgdGhlIGJpbmFyaWVzIGZyb20gdGhhdCBwcm9qZWN0ICh0aGF0IGlzLCB0aGUgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSAKKyAqIHJlcXVpcmVkIHByb2plY3QgaXMgdXNlZCBhcyBhIGxpYnJhcnkpLiBUaGUgY2xhc3NwYXRoIGZvcm1hdCBpcyBhIHNlcXVlbmNlIAorICogb2YgY2xhc3NwYXRoIGVudHJpZXMgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gYW5kIGNvbnRlbnRzIG9mIHBhY2thZ2UgZnJhZ21lbnQKKyAqIHJvb3RzLgorICogPC9wPgorICogSmF2YSBwcm9qZWN0IGVsZW1lbnRzIG5lZWQgdG8gYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSBuYXZpZ2F0ZWQgb3IgbWFuaXB1bGF0ZWQuCisgKiBUaGUgY2hpbGRyZW4gb2YgYSBKYXZhIHByb2plY3QgYXJlIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIHRoYXQgYXJlIAorICogZGVmaW5lZCBieSB0aGUgY2xhc3NwYXRoIGFuZCBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0IChpbiBvdGhlciB3b3JkcywgaXQKKyAqIGRvZXMgbm90IGluY2x1ZGUgcGFja2FnZSBmcmFnbWVudCByb290cyBmb3Igb3RoZXIgcHJvamVjdHMpLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gQW4gaW5zdGFuY2UKKyAqIG9mIG9uZSBvZiB0aGVzZSBoYW5kbGVzIGNhbiBiZSBjcmVhdGVkIHZpYSAKKyAqIDxjb2RlPkphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTwvY29kZT4uCisgKiA8L3A+CisgKgorICogQHNlZSBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCisgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvamVjdCBleHRlbmRzIElQYXJlbnQsIElKYXZhRWxlbWVudCwgSU9wZW5hYmxlIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKwkgKiBjbGFzc3BhdGgtcmVsYXRpdmUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCAKKwkgKiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGlzIGZvdW5kLiBUaGUgcmVzdWx0IGlzIG9uZSBvZiBhbgorCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LCA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiwgb3IKKwkgKiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPi4gCisJICogPHA+CisJICogV2hlbiBsb29raW5nIGZvciBhIHBhY2thZ2UgZnJhZ21lbnQsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgcG90ZW50aWFsCisJICogbWF0Y2hlczsgb25seSBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KKwkgKgorCSAqIDxwPkZvciBleGFtcGxlLCB0aGUgcGF0aCAiamF2YS9sYW5nL09iamVjdC5qYXZhIiwgd291bGQgcmVzdWx0IGluIHRoZQorCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+IG9yIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8KKwkgKiAiamF2YS5sYW5nLk9iamVjdCIuIFRoZSBwYXRoICJqYXZhL2xhbmciIHdvdWxkIHJlc3VsdCBpbiB0aGUKKwkgKiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPiBmb3IgImphdmEubGFuZyIuCisJICogQHBhcmFtIHBhdGggdGhlIGdpdmVuIGNsYXNzcGF0aC1yZWxhdGl2ZSBwYXRoCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgb3IgYWJzb2x1dGUKKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisJICogY2xhc3NwYXRoLXJlbGF0aXZlIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggCisJICogPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPiBpcyBmb3VuZAorCSAqLworCUlKYXZhRWxlbWVudCBmaW5kRWxlbWVudChJUGF0aCBwYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKKwkgKiB3aG9zZSBwYXRoIG1hdGNoZXMgdGhlIGdpdmVuIChhYnNvbHV0ZSkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIGV4aXN0LgorCSAqIFRoZSBwYXRoIGNhbiBiZToKKwkgKiAJLSBpbnRlcm5hbCB0byB0aGUgd29ya2JlbmNoOiAiL1Byb2plY3Qvc3JjIgorCSAqICAtIGV4dGVybmFsIHRvIHRoZSB3b3JrYmVuY2g6ICJjOi9qZGsvY2xhc3Nlcy56aXAvamF2YS9sYW5nIgorCSAqIEBwYXJhbSBwYXRoIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICogQHJldHVybiB0aGUgZmlyc3QgZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKKwkgKiB3aG9zZSBwYXRoIG1hdGNoZXMgdGhlIGdpdmVuIChhYnNvbHV0ZSkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIGV4aXN0CisJICovCisJSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50KElQYXRoIHBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb24gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoCisJICogd2hvc2UgcGF0aCBtYXRjaGVzIHRoZSBnaXZlbiAoYWJzb2x1dGUpIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogb25lIGRvZXMgbm90IGV4aXN0LgorCSAqIFRoZSBwYXRoIGNhbiBiZToKKwkgKgktIGludGVybmFsIHRvIHRoZSB3b3JrYmVuY2g6ICIvQ29tcGlsZXIvc3JjIgorCSAqCS0gZXh0ZXJuYWwgdG8gdGhlIHdvcmtiZW5jaDogImM6L2pkay9jbGFzc2VzLnppcCIKKwkgKiBAcGFyYW0gcGF0aCB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorCSAqIEByZXR1cm4gdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgKKwkgKiB3aG9zZSBwYXRoIG1hdGNoZXMgdGhlIGdpdmVuIChhYnNvbHV0ZSkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiBvbmUgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlJUGFja2FnZUZyYWdtZW50Um9vdCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdChJUGF0aCBwYXRoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kLgorCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gRm9yIGV4YW1wbGUsCisJICogYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgdHlwZSBvZiBhIGNsYXNzIEEgaW4gcGFja2FnZSB4Lnkgc2hvdWxkIGhhdmUgYSAKKwkgKiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgIngueS5BLkIiLgorCSAqIAorCSAqIEBwYXJhbSBmdWxseVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoIAorCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZm91bmQKKwkgKiBAc2VlIElUeXBlI2dldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoaXMgcHJvamVjdCdzIGNsYXNzcGF0aCAKKwkgKiB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgcXVhbGlmaWVkIG5hbWUKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kLgorCSAqIFRoZSBwYWNrYWdlIG5hbWUgaXMgYSBkb3Qtc2VwYXJhdGVkIG5hbWUuCisJICogVGhlIHR5cGUgcXVhbGlmaWVkIG5hbWUgaXMgYWxzbyBhIGRvdC1zZXBhcmF0ZWQgbmFtZS4gRm9yIGV4YW1wbGUsCisJICogYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgdHlwZSBvZiBhIGNsYXNzIEEgc2hvdWxkIGhhdmUgdGhlIAorCSAqIHR5cGUgcXVhbGlmaWVkIG5hbWUgIkEuQiIuCisJICogCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKKwkgKiBAcGFyYW0gdHlwZVF1YWxpZmllZE5hbWUgdGhlIGdpdmVuIHR5cGUgcXVhbGlmaWVkIG5hbWUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCisJICogd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGFuZCB0eXBlIHF1YWxpZmllZCBuYW1lCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZAorCSAqIEBzZWUgSVR5cGUjZ2V0VHlwZVF1YWxpZmllZE5hbWUoY2hhcikKKwkgKiBAc2luY2UgMi4wCisJICovCisJSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBvZiB0aGUgZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290cyB0aGF0IGV4aXN0CisJICogb24gdGhlIGNsYXNzcGF0aCwgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGRlZmluZWQgYnkgdGhlIGNsYXNzcGF0aC4KKwkgKgorCSAqIEByZXR1cm4gYWxsIG9mIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIHRoYXQgZXhpc3QKKwkgKiBvbiB0aGUgY2xhc3NwYXRoCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICovCisJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBkaXJlY3RseSBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0LgorCSAqIEl0IGRvZXMgbm90IHRyYW5zaXRpdmVseSBhbnN3ZXIgbm9uLUphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiBmb2xkZXJzOworCSAqIHRoZXNlIHdvdWxkIGhhdmUgdG8gYmUgZXhwbGljaXRseSBpdGVyYXRlZCBvdmVyLgorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiB0aGlzIHByb2plY3QKKwkgKi8KKwlPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBidWlsZGVyIHdyaXRlcyAKKwkgKiA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICogQHJldHVybiB0aGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgYnVpbGRlciB3cml0ZXMgCisJICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcworCSAqLworCUlQYXRoIGdldE91dHB1dExvY2F0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZm9yIHRoZSBKQVIgYXQgdGhlIHNwZWNpZmllZCBmaWxlIHN5c3RlbSBwYXRoLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuICBUaGUgdW5kZXJseWluZyA8Y29kZT5qYXZhLmlvLkZpbGU8L2NvZGU+CisJICogbWF5IG9yIG1heSBub3QgZXhpc3QuIE5vIHJlc291cmNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvY2FsIEpBUgorCSAqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KKwkgKiAKKwkgKiBAcGFyYW0gamFyUGF0aCB0aGUgamFycydzIGZpbGUgc3lzdGVtIHBhdGgKKwkgKiBAcmV0dXJuIGEgcGFja2FnZSBmcmFnbWVudCByb290IGZvciB0aGUgSkFSIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0gcGF0aAorCSAqLworCUlQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIGphclBhdGgpOworCisJLyoqCisJICogUmV0dXJucyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLCB3aGljaAorCSAqIG11c3QgZWl0aGVyIGJlIGEgZm9sZGVyIHJlcHJlc2VudGluZyB0aGUgdG9wIG9mIGEgcGFja2FnZSBoaWVyYXJjaHksCisJICogb3IgYSA8Y29kZT4uamFyPC9jb2RlPiBvciA8Y29kZT4uemlwPC9jb2RlPiBmaWxlLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuICBUaGUgdW5kZXJseWluZyByZXNvdXJjZSBtYXkgb3IgbWF5IG5vdCBleGlzdC4gCisJICogCisJICogQHBhcmFtIHJlc291cmNlIHRoZSBnaXZlbiByZXNvdXJjZQorCSAqIEByZXR1cm4gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZm9yIHRoZSBnaXZlbiByZXNvdXJjZSwgd2hpY2gKKwkgKiBtdXN0IGVpdGhlciBiZSBhIGZvbGRlciByZXByZXNlbnRpbmcgdGhlIHRvcCBvZiBhIHBhY2thZ2UgaGllcmFyY2h5LAorCSAqIG9yIGEgPGNvZGU+LmphcjwvY29kZT4gb3IgPGNvZGU+LnppcDwvY29kZT4gZmlsZQorCSAqLworCUlQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIG9mIHRoZSAgcGFja2FnZSBmcmFnbWVudCByb290cyBjb250YWluZWQgaW4gdGhpcworCSAqIHByb2plY3QsIGlkZW50aWZpZWQgb24gdGhpcyBwcm9qZWN0J3MgcmVzb2x2ZWQgY2xhc3NwYXRoLiBUaGUgcmVzdWx0CisJICogZG9lcyBub3QgaW5jbHVkZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGluIG90aGVyIHByb2plY3RzIHJlZmVyZW5jZWQKKwkgKiBvbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGguCisJICoKKwkgKiA8cD5OT1RFOiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+Z2V0Q2hpbGRyZW4oKTwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgY29udGFpbmVkIGluIHRoaXMKKwkgKiBwcm9qZWN0LCBpZGVudGlmaWVkIG9uIHRoaXMgcHJvamVjdCdzIHJlc29sdmVkIGNsYXNzcGF0aAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorCSAqLworCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBlbnRyeS4KKwkgKiBOb3RlIHRoYXQgYSBjbGFzc3BhdGggZW50cnkgdGhhdCByZWZlcnMgdG8gYW5vdGhlciBwcm9qZWN0IG1heQorCSAqIGhhdmUgbW9yZSB0aGFuIG9uZSByb290IChpZiB0aGF0IHByb2plY3QgaGFzIG1vcmUgdGhhbiBvbiByb290CisJICogY29udGFpbmluZyBzb3VyY2UpLCBhbmQgY2xhc3NwYXRoIGVudHJpZXMgd2l0aGluIHRoZSBjdXJyZW50CisJICogcHJvamVjdCBpZGVudGlmeSBhIHNpbmdsZSByb290LgorCSAqIDxwPgorCSAqIElmIHRoZSBjbGFzc3BhdGggZW50cnkgZGVub3RlcyBhIHZhcmlhYmxlLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFuZCByZXR1cm4KKwkgKiB0aGUgcm9vdHMgb2YgdGhlIHRhcmdldCBlbnRyeSAoZW1wdHkgaWYgbm90IHJlc29sdmFibGUpLgorCSAqIDxwPgorCSAqIElmIHRoZSBjbGFzc3BhdGggZW50cnkgZGVub3RlcyBhIGNvbnRhaW5lciwgaXQgd2lsbCBiZSByZXNvbHZlZCBhbmQgcmV0dXJuCisJICogdGhlIHJvb3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNldCBvZiBjb250YWluZXIgZW50cmllcyAoZW1wdHkgaWYgbm90IHJlc29sdmFibGUpLgorCSAqIAorCSAqIEBwYXJhbSBlbnRyeSB0aGUgZ2l2ZW4gZW50cnkKKwkgKiBAcmV0dXJuIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5CisJICogQHNlZSBJQ2xhc3NwYXRoQ29udGFpbmVyCisJICovCisJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgZW50cnkpOworCisJLyoqCisJICogUmV0dXJucyBhbGwgcGFja2FnZSBmcmFnbWVudHMgaW4gYWxsIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgY29udGFpbmVkCisJICogaW4gdGhpcyBwcm9qZWN0LiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGNvcnJlc3BvbmRzIHRvIHRoZSByZXNvbHZlZAorCSAqIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdC4KKwkgKgorCSAqIEByZXR1cm4gYWxsIHBhY2thZ2UgZnJhZ21lbnRzIGluIGFsbCBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGNvbnRhaW5lZAorCSAqIGluIHRoaXMgcHJvamVjdAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorCSAqLworCUlQYWNrYWdlRnJhZ21lbnRbXSBnZXRQYWNrYWdlRnJhZ21lbnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBvbiB3aGljaCB0aGlzIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KKwkgKiB3YXMgY3JlYXRlZC4gVGhpcyBpcyBoYW5kbGUtb25seSBtZXRob2QuCisJICogCisJICogQHJldHVybiB0aGUgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9uIHdoaWNoIHRoaXMgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgorCSAqIHdhcyBjcmVhdGVkCisJICovCisJSVByb2plY3QgZ2V0UHJvamVjdCgpOworCisJLyoqCisJICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMsIAorCSAqIHdoZXJlIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYW5kIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgZmluYWwgdGFyZ2V0IGVudHJpZXMuCisJICogPHA+CisJICogQSByZXNvbHZlZCBjbGFzc3BhdGggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSByYXcgY2xhc3NwYXRoIGJvdW5kIGluIHRoZSBjb250ZXh0IG9mIAorCSAqIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgcmVmZXJyZWQgdmFyaWFibGVzLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHBlcnNpc3RlZC4KKwkgKiA8cD4KKwkgKiBBIGNsYXNzcGF0aCB2YXJpYWJsZSBwcm92aWRlcyBhbiBpbmRpcmVjdGlvbiBsZXZlbCBmb3IgYmV0dGVyIHNoYXJpbmcgYSBjbGFzc3BhdGguIEFzIGFuIGV4YW1wbGUsIGl0IGFsbG93cworCSAqIGEgY2xhc3NwYXRoIHRvIG5vIGxvbmdlciByZWZlciBkaXJlY3RseSB0byBleHRlcm5hbCBKQVJzIGxvY2F0ZWQgaW4gc29tZSB1c2VyIHNwZWNpZmljIGxvY2F0aW9uLiBUaGUgY2xhc3NwYXRoCisJICogY2FuIHNpbXBseSByZWZlciB0byBzb21lIHZhcmlhYmxlcyBkZWZpbmluZyB0aGUgcHJvcGVyIGxvY2F0aW9ucyBvZiB0aGVzZSBleHRlcm5hbCBKQVJzLgorCSAqIDxwPgorCSAqIFRoZSBib29sZWFuIGFyZ3VtZW50IDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZTwvY29kZT4gYWxsb3dzIHRvIHNwZWNpZnkgaG93IHRvIGhhbmRsZSB1bnJlc29sdmFibGUgdmFyaWFibGVzLAorCSAqIHdoZW4gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBtaXNzaW5nIHZhcmlhYmxlcyBhcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSByZXN1bHRpbmcgcGF0aCBpcyB0aGVuIG9ubHkgZm9ybWVkIG9mIHRoZQorCSAqIHJlc29sdmFibGUgZW50cmllcywgd2l0aG91dCBhbnkgaW5kaWNhdGlvbiBhYm91dCB3aGljaCB2YXJpYWJsZShzKSB3YXMgaWdub3JlZC4gV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBhCisJICogSmF2YU1vZGVsRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZvciB0aGUgZmlyc3QgdW5yZXNvbHZlZCB2YXJpYWJsZSAoZnJvbSBsZWZ0IHRvIHJpZ2h0KS4KKwkgKiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpbiBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2l0dWF0aW9uOgorCSAqIDx1bD4KKwkgKiAgICA8bGk+IHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCA8L2xpPgorCSAqICAgIDxsaT4gYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgPC9saT4KKwkgKiAgICA8bGk+IGEgY2xhc3NwYXRoIHZhcmlhYmxlIHdhcyBub3QgcmVzb2x2YWJsZSBhbmQgPGNvZGU+aWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlPC9jb2RlPiB3YXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gPC9saT4KKwkgKiA8L3VsPgorCSAqIEByZXR1cm4gCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkgCisJICovCisvLwlJQ2xhc3NwYXRoRW50cnlbXSBnZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSkKKy8vCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcmF3IGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QsIGFzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZXhhY3Qgc2V0CisJICogb2YgZW50cmllcyB3aGljaCB3ZXJlIGFzc2lnbmVkIHVzaW5nIDxjb2RlPnNldFJhd0NsYXNzcGF0aDwvY29kZT4sIGluIHBhcnRpY3VsYXIgc3VjaCBhIGNsYXNzcGF0aCBtYXkgY29udGFpbgorCSAqIGNsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzLiBDbGFzc3BhdGggdmFyaWFibGUgZW50cmllcyBjYW4gYmUgcmVzb2x2ZWQgaW5kaXZpZHVhbGx5IChzZWUgPGNvZGU+SmF2YUNvcmUjZ2V0Q2xhc3NwYXRoVmFyaWFibGU8L2NvZGU+KSwKKwkgKiBvciB0aGUgZnVsbCBjbGFzc3BhdGggY2FuIGJlIHJlc29sdmVkIGF0IG9uY2UgdXNpbmcgdGhlIGhlbHBlciBtZXRob2QgPGNvZGU+Z2V0UmVzb2x2ZWRDbGFzc3BhdGg8L2NvZGU+LgorCSAqIDxwPgorCSAqIEEgY2xhc3NwYXRoIHZhcmlhYmxlIHByb3ZpZGVzIGFuIGluZGlyZWN0aW9uIGxldmVsIGZvciBiZXR0ZXIgc2hhcmluZyBhIGNsYXNzcGF0aC4gQXMgYW4gZXhhbXBsZSwgaXQgYWxsb3dzCisJICogYSBjbGFzc3BhdGggdG8gbm8gbG9uZ2VyIHJlZmVyIGRpcmVjdGx5IHRvIGV4dGVybmFsIEpBUnMgbG9jYXRlZCBpbiBzb21lIHVzZXIgc3BlY2lmaWMgbG9jYXRpb24uIFRoZSBjbGFzc3BhdGgKKwkgKiBjYW4gc2ltcGx5IHJlZmVyIHRvIHNvbWUgdmFyaWFibGVzIGRlZmluaW5nIHRoZSBwcm9wZXIgbG9jYXRpb25zIG9mIHRoZXNlIGV4dGVybmFsIEpBUnMuCisJICogIDxwPgorCSAqIE5vdGUgdGhhdCBpbiBjYXNlIHRoZSBwcm9qZWN0IGlzbid0IHlldCBvcGVuZWQsIHRoZSBjbGFzc3BhdGggd2lsbCBkaXJlY3RseSBiZSByZWFkIGZyb20gdGhlIGFzc29jaWF0ZWQgPHR0Pi5jbGFzc3BhdGg8L3R0PiBmaWxlLgorCSAqIDxwPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHJhdyBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorCSAqLworCUlDbGFzc3BhdGhFbnRyeVtdIGdldFJhd0NsYXNzcGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgcHJvamVjdHMgdGhhdCBhcmUgZGlyZWN0bHkgcmVxdWlyZWQgYnkgdGhpcworCSAqIHByb2plY3QuIEEgcHJvamVjdCBpcyByZXF1aXJlZCBpZiBpdCBpcyBpbiBpdHMgY2xhc3NwYXRoLgorCSAqCisJICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHByb2plY3RzIHRoYXQgYXJlIGRpcmVjdGx5IHJlcXVpcmVkIGJ5IHRoaXMKKwkgKiBwcm9qZWN0CisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICovCisJU3RyaW5nW10gZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMsIAorCSAqIHdoZXJlIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYW5kIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgZmluYWwgdGFyZ2V0IGVudHJpZXMuCisJICogPHA+CisJICogQSByZXNvbHZlZCBjbGFzc3BhdGggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSByYXcgY2xhc3NwYXRoIGJvdW5kIGluIHRoZSBjb250ZXh0IG9mIAorCSAqIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgcmVmZXJyZWQgdmFyaWFibGVzLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHBlcnNpc3RlZC4KKwkgKiA8cD4KKwkgKiBBIGNsYXNzcGF0aCB2YXJpYWJsZSBwcm92aWRlcyBhbiBpbmRpcmVjdGlvbiBsZXZlbCBmb3IgYmV0dGVyIHNoYXJpbmcgYSBjbGFzc3BhdGguIEFzIGFuIGV4YW1wbGUsIGl0IGFsbG93cworCSAqIGEgY2xhc3NwYXRoIHRvIG5vIGxvbmdlciByZWZlciBkaXJlY3RseSB0byBleHRlcm5hbCBKQVJzIGxvY2F0ZWQgaW4gc29tZSB1c2VyIHNwZWNpZmljIGxvY2F0aW9uLiBUaGUgY2xhc3NwYXRoCisJICogY2FuIHNpbXBseSByZWZlciB0byBzb21lIHZhcmlhYmxlcyBkZWZpbmluZyB0aGUgcHJvcGVyIGxvY2F0aW9ucyBvZiB0aGVzZSBleHRlcm5hbCBKQVJzLgorCSAqIDxwPgorCSAqIFRoZSBib29sZWFuIGFyZ3VtZW50IDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZTwvY29kZT4gYWxsb3dzIHRvIHNwZWNpZnkgaG93IHRvIGhhbmRsZSB1bnJlc29sdmFibGUgdmFyaWFibGVzLAorCSAqIHdoZW4gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBtaXNzaW5nIHZhcmlhYmxlcyBhcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSByZXN1bHRpbmcgcGF0aCBpcyB0aGVuIG9ubHkgZm9ybWVkIG9mIHRoZQorCSAqIHJlc29sdmFibGUgZW50cmllcywgd2l0aG91dCBhbnkgaW5kaWNhdGlvbiBhYm91dCB3aGljaCB2YXJpYWJsZShzKSB3YXMgaWdub3JlZC4gV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBhCisJICogSmF2YU1vZGVsRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZvciB0aGUgZmlyc3QgdW5yZXNvbHZlZCB2YXJpYWJsZSAoZnJvbSBsZWZ0IHRvIHJpZ2h0KS4KKwkgKiAKKwkgKiBAcGFyYW0gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlIHNwZWNpZnkgaG93IHRvIGhhbmRsZSB1bnJlc29sdmFibGUgdmFyaWFibGVzCisJICogQHJldHVybiB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdCwgYXMgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzLCAKKwkgKiB3aGVyZSBhbGwgY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGFuZCBzdWJzdGl0dXRlZCB3aXRoIHRoZWlyIGZpbmFsIHRhcmdldCBlbnRyaWVzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaW4gb25lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpdHVhdGlvbjoKKwkgKiA8dWw+CisJICogICAgPGxpPiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgPC9saT4KKwkgKiAgICA8bGk+IGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlIDwvbGk+CisJICogICAgPGxpPiBhIGNsYXNzcGF0aCB2YXJpYWJsZSB3YXMgbm90IHJlc29sdmFibGUgYW5kIDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZTwvY29kZT4gd2FzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIDwvbGk+CisJICogPC91bD4KKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSAKKwkgKi8KKwlJQ2xhc3NwYXRoRW50cnlbXSBnZXRSZXNvbHZlZENsYXNzcGF0aChib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb2plY3QgaGFzIGJlZW4gYnVpbHQgYXQgbGVhc3Qgb25jZSBhbmQgdGh1cyB3aGV0aGVyIGl0IGhhcyBhIGJ1aWxkIHN0YXRlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHByb2plY3QgaGFzIGJlZW4gYnVpbHQgYXQgbGVhc3Qgb25jZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBoYXNCdWlsZFN0YXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggdG8gdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyaWVzCisJICogd291bGQgcmVzdWx0IGluIGEgY3ljbGUuCisJICoKKwkgKiBJZiB0aGUgc2V0IG9mIGVudHJpZXMgY29udGFpbnMgc29tZSB2YXJpYWJsZXMsIHRob3NlIGFyZSByZXNvbHZlZCBpbiBvcmRlciB0byBkZXRlcm1pbmUKKwkgKiBjeWNsZXMuCisJICogCisJICogQHBhcmFtIGVudHJpZXMgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyaWVzCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzc3BhdGggZW50cmllcyB3b3VsZCByZXN1bHQgaW4gYSBjeWNsZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBoYXNDbGFzc3BhdGhDeWNsZShJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKTsKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsIGZhbHNlIG90aGVyd2lzZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlib29sZWFuIGlzT25DbGFzc3BhdGgoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGV2YWx1YXRpb24gY29udGV4dC4KKwkgKiBAcmV0dXJuIGEgbmV3IGV2YWx1YXRpb24gY29udGV4dC4KKwkgKi8KKwlJRXZhbHVhdGlvbkNvbnRleHQgbmV3RXZhbHVhdGlvbkNvbnRleHQoKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgYWxsIHR5cGVzIGluIHRoZSBnaXZlbgorCSAqIHJlZ2lvbiwgY29uc2lkZXJpbmcgc3VidHlwZXMgd2l0aGluIHRoYXQgcmVnaW9uLgorCSAqCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAcGFyYW0gcmVnaW9uIHRoZSBnaXZlbiByZWdpb24KKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiByZWdpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIGEgdHlwZSBoaWVyYXJjaHkgZm9yIGFsbCB0eXBlcyBpbiB0aGUgZ2l2ZW4KKwkgKiByZWdpb24sIGNvbnNpZGVyaW5nIHN1YnR5cGVzIHdpdGhpbiB0aGF0IHJlZ2lvbgorCSAqLworCUlUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSVJlZ2lvbiByZWdpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhlIGdpdmVuIHR5cGUgY29uc2lkZXJpbmcKKwkgKiBzdWJ0eXBlcyBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gbW9uaXRvcgorCSAqIEBwYXJhbSByZWdpb24gdGhlIGdpdmVuIHJlZ2lvbgorCSAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCisJICogCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICoKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0eXBlIG9yIHJlZ2lvbiBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhlIGdpdmVuIHR5cGUgY29uc2lkZXJpbmcKKwkgKiBzdWJ0eXBlcyBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbgorCSAqLworCUlUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoCisJCUlUeXBlIHR5cGUsCisJCUlSZWdpb24gcmVnaW9uLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBTZXRzIHRoZSBvdXRwdXQgbG9jYXRpb24gb2YgdGhpcyBwcm9qZWN0IHRvIHRoZSBsb2NhdGlvbgorCSAqIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBwYXRoIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqCTxsaT5UaGUgcGF0aCByZWZlcnMgdG8gYSBsb2NhdGlvbiBub3QgY29udGFpbmVkIGluIHRoaXMgcHJvamVjdCAoPGNvZGU+UEFUSF9PVVRTSURFX1BST0pFQ1Q8L2NvZGU+KQorCSAqCTxsaT5UaGUgcGF0aCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCAoPGNvZGU+UkVMQVRJVkVfUEFUSDwvY29kZT4pCisJICogIDxsaT5UaGUgcGF0aCBpcyBuZXN0ZWQgaW5zaWRlIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoaXMgcHJvamVjdCAoPGNvZGU+SU5WQUxJRF9QQVRIPC9jb2RlPikKKwkgKiAgPGxpPiBUaGUgb3V0cHV0IGxvY2F0aW9uIGlzIGJlaW5nIG1vZGlmaWVkIGR1cmluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uIChDT1JFX0VYQ0VQVElPTikJIAorCSAqIDwvdWw+CisJICovCisJdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjbGFzc3BhdGggb2YgdGhpcyBwcm9qZWN0IHVzaW5nIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcy4gSW4gcGFydGljdWxhciBzdWNoIGEgY2xhc3NwYXRoIG1heSBjb250YWluCisJICogY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMuIENsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGNhbiBiZSByZXNvbHZlZCBpbmRpdmlkdWFsbHkgKHNlZSA8Y29kZT5KYXZhQ29yZSNnZXRDbGFzc3BhdGhWYXJpYWJsZTwvY29kZT4pLAorCSAqIG9yIHRoZSBmdWxsIGNsYXNzcGF0aCBjYW4gYmUgcmVzb2x2ZWQgYXQgb25jZSB1c2luZyB0aGUgaGVscGVyIG1ldGhvZCA8Y29kZT5nZXRSZXNvbHZlZENsYXNzcGF0aDwvY29kZT4uCisJICogPHA+CisJICogQSBjbGFzc3BhdGggdmFyaWFibGUgcHJvdmlkZXMgYW4gaW5kaXJlY3Rpb24gbGV2ZWwgZm9yIGJldHRlciBzaGFyaW5nIGEgY2xhc3NwYXRoLiBBcyBhbiBleGFtcGxlLCBpdCBhbGxvd3MKKwkgKiBhIGNsYXNzcGF0aCB0byBubyBsb25nZXIgcmVmZXIgZGlyZWN0bHkgdG8gZXh0ZXJuYWwgSkFScyBsb2NhdGVkIGluIHNvbWUgdXNlciBzcGVjaWZpYyBsb2NhdGlvbi4gVGhlIGNsYXNzcGF0aAorCSAqIGNhbiBzaW1wbHkgcmVmZXIgdG8gc29tZSB2YXJpYWJsZXMgZGVmaW5pbmcgdGhlIHByb3BlciBsb2NhdGlvbnMgb2YgdGhlc2UgZXh0ZXJuYWwgSkFScy4KKwkgKiA8cD4KKwkgKiBTZXR0aW5nIHRoZSBjbGFzc3BhdGggdG8gPGNvZGU+bnVsbDwvY29kZT4gc3BlY2lmaWVzIGEgZGVmYXVsdCBjbGFzc3BhdGgKKwkgKiAodGhlIHByb2plY3Qgcm9vdCkuIFNldHRpbmcgdGhlIGNsYXNzcGF0aCB0byBhbiBlbXB0eSBhcnJheSBzcGVjaWZpZXMgYW4KKwkgKiBlbXB0eSBjbGFzc3BhdGguCisJICogPHA+CisJICogSWYgYSBjeWNsZSBpcyBkZXRlY3RlZCB3aGlsZSBzZXR0aW5nIHRoaXMgY2xhc3NwYXRoLCBhbiBlcnJvciBtYXJrZXIgd2lsbCBiZSBhZGRlZAorCSAqIHRvIHRoZSBwcm9qZWN0IGNsb3NpbmcgdGhlIGN5Y2xlLgorCSAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgdXNlIDxjb2RlPmhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpPC9jb2RlPgorCSAqIGJlZm9yZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGguCisJICoKKwkgKiBAcGFyYW0gZW50cmllcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjbGFzc3BhdGggY291bGQgbm90IGJlIHNldC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPGxpPiBUaGUgY2xhc3NwYXRoIGlzIGJlaW5nIG1vZGlmaWVkIGR1cmluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uIChDT1JFX0VYQ0VQVElPTikKKwkgKiA8bGk+IFRoZSBjbGFzc3BhdGggZmFpbGVkIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGFzIGRlZmluZWQgYnkgPGNvZGU+SmF2YUNvbnZlbnRpb25zI3ZhbGlkYXRlQ2xhc3NwYXRoPC9jb2RlPgorCSAqIDwvdWw+CisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKi8KKwl2b2lkIHNldFJhd0NsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCQorCS8qKgorCSAqIFNldHMgdGhlIGJvdGggdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QgYW5kIGl0cyBvdXRwdXQgbG9jYXRpb24gYXQgb25jZS4KKwkgKiBUaGUgY2xhc3NwYXRoIGlzIGRlZmluZWQgdXNpbmcgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzLiBJbiBwYXJ0aWN1bGFyIHN1Y2ggYSBjbGFzc3BhdGggbWF5IGNvbnRhaW4KKwkgKiBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcy4gQ2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgY2FuIGJlIHJlc29sdmVkIGluZGl2aWR1YWxseSAoc2VlIDxjb2RlPkphdmFDb3JlI2dldENsYXNzcGF0aFZhcmlhYmxlPC9jb2RlPiksCisJICogb3IgdGhlIGZ1bGwgY2xhc3NwYXRoIGNhbiBiZSByZXNvbHZlZCBhdCBvbmNlIHVzaW5nIHRoZSBoZWxwZXIgbWV0aG9kIDxjb2RlPmdldFJlc29sdmVkQ2xhc3NwYXRoPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBBIGNsYXNzcGF0aCB2YXJpYWJsZSBwcm92aWRlcyBhbiBpbmRpcmVjdGlvbiBsZXZlbCBmb3IgYmV0dGVyIHNoYXJpbmcgYSBjbGFzc3BhdGguIEFzIGFuIGV4YW1wbGUsIGl0IGFsbG93cworCSAqIGEgY2xhc3NwYXRoIHRvIG5vIGxvbmdlciByZWZlciBkaXJlY3RseSB0byBleHRlcm5hbCBKQVJzIGxvY2F0ZWQgaW4gc29tZSB1c2VyIHNwZWNpZmljIGxvY2F0aW9uLiBUaGUgY2xhc3NwYXRoCisJICogY2FuIHNpbXBseSByZWZlciB0byBzb21lIHZhcmlhYmxlcyBkZWZpbmluZyB0aGUgcHJvcGVyIGxvY2F0aW9ucyBvZiB0aGVzZSBleHRlcm5hbCBKQVJzLgorCSAqIDxwPgorCSAqIFNldHRpbmcgdGhlIGNsYXNzcGF0aCB0byA8Y29kZT5udWxsPC9jb2RlPiBzcGVjaWZpZXMgYSBkZWZhdWx0IGNsYXNzcGF0aAorCSAqICh0aGUgcHJvamVjdCByb290KS4gU2V0dGluZyB0aGUgY2xhc3NwYXRoIHRvIGFuIGVtcHR5IGFycmF5IHNwZWNpZmllcyBhbgorCSAqIGVtcHR5IGNsYXNzcGF0aC4KKwkgKiA8cD4KKwkgKiBJZiBhIGN5Y2xlIGlzIGRldGVjdGVkIHdoaWxlIHNldHRpbmcgdGhpcyBjbGFzc3BhdGgsIGFuIGVycm9yIG1hcmtlciB3aWxsIGJlIGFkZGVkCisJICogdG8gdGhlIHByb2plY3QgY2xvc2luZyB0aGUgY3ljbGUuCisJICogVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB1c2UgPGNvZGU+aGFzQ2xhc3NwYXRoQ3ljbGUoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyk8L2NvZGU+CisJICogYmVmb3JlIHNldHRpbmcgdGhlIGNsYXNzcGF0aC4KKwkgKgorCSAqIEBwYXJhbSBlbnRyaWVzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIHRoZSBnaXZlbiBvdXRwdXQgbG9jYXRpb24KKwkgKiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqIDxsaT4gVHdvIG9yIG1vcmUgZW50cmllcyBzcGVjaWZ5IHNvdXJjZSByb290cyB3aXRoIHRoZSBzYW1lIG9yIG92ZXJsYXBwaW5nIHBhdGhzIChOQU1FX0NPTExJU0lPTikKKwkgKiA8bGk+IEEgZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4gcmVmZXJzIHRvIHRoaXMgcHJvamVjdCAoSU5WQUxJRF9QQVRIKQorCSAqICA8bGk+VGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKgk8bGk+VGhlIG91dHB1dCBsb2NhdGlvbiBwYXRoIHJlZmVycyB0byBhIGxvY2F0aW9uIG5vdCBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0ICg8Y29kZT5QQVRIX09VVFNJREVfUFJPSkVDVDwvY29kZT4pCisJICoJPGxpPlRoZSBvdXRwdXQgbG9jYXRpb24gcGF0aCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCAoPGNvZGU+UkVMQVRJVkVfUEFUSDwvY29kZT4pCisJICogIDxsaT5UaGUgb3V0cHV0IGxvY2F0aW9uIHBhdGggaXMgbmVzdGVkIGluc2lkZSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGlzIHByb2plY3QgKDxjb2RlPklOVkFMSURfUEFUSDwvY29kZT4pCisJICogPGxpPiBUaGUgY2xhc3NwYXRoIGlzIGJlaW5nIG1vZGlmaWVkIGR1cmluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uIChDT1JFX0VYQ0VQVElPTikKKwkgKiA8L3VsPgorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5CisJICogQHNpbmNlIDIuMAorCSAqLworCXZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIElQYXRoIG91dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MGM0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWVtYmVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogQ29tbW9uIHByb3RvY29sIGZvciBKYXZhIGVsZW1lbnRzIHRoYXQgY2FuIGJlIG1lbWJlcnMgb2YgdHlwZXMuCisgKiBUaGlzIHNldCBjb25zaXN0cyBvZiA8Y29kZT5JVHlwZTwvY29kZT4sIDxjb2RlPklNZXRob2Q8L2NvZGU+LCAKKyAqIDxjb2RlPklGaWVsZDwvY29kZT4sIGFuZCA8Y29kZT5JSW5pdGlhbGl6ZXI8L2NvZGU+LgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJTWVtYmVyIGV4dGVuZHMgSUphdmFFbGVtZW50LCBJU291cmNlUmVmZXJlbmNlLCBJU291cmNlTWFuaXB1bGF0aW9uIHsKKy8qKgorICogUmV0dXJucyB0aGUgY2xhc3MgZmlsZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiBhIGNsYXNzIGZpbGUgKGZvciBleGFtcGxlLCBhIHNvdXJjZSB0eXBlKS4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKiAKKyAqIEByZXR1cm4gdGhlIGNsYXNzIGZpbGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpZiB0aGlzIG1lbWJlciBpcyBub3QgZGVjbGFyZWQgaW4gYSBjbGFzcyBmaWxlIChmb3IgZXhhbXBsZSwgYSBzb3VyY2UgdHlwZSkKKyAqLworSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKiAKKyAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpZiB0aGlzIG1lbWJlciBpcyBub3QgZGVjbGFyZWQgaW4gYSBjb21waWxhdGlvbiB1bml0IChmb3IgZXhhbXBsZSwgYSBiaW5hcnkgdHlwZSkKKyAqLworSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKTsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoaXMgbWVtYmVyIGlzIG5vdCBkZWNsYXJlZCBpbiBhIHR5cGUgKGZvciBleGFtcGxlLCBhIHRvcC1sZXZlbCB0eXBlKS4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKiAKKyAqIEByZXR1cm4gdGhlIHR5cGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgZGVjbGFyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpZiB0aGlzIG1lbWJlciBpcyBub3QgZGVjbGFyZWQgaW4gYSB0eXBlIChmb3IgZXhhbXBsZSwgYSB0b3AtbGV2ZWwgdHlwZSkKKyAqLworSVR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBtb2RpZmllciBmbGFncyBmb3IgdGhpcyBtZW1iZXIuIFRoZSBmbGFncyBjYW4gYmUgZXhhbWluZWQgdXNpbmcgY2xhc3MKKyAqIDxjb2RlPkZsYWdzPC9jb2RlPi4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisgKiBAcmV0dXJuIHRoZSBtb2RpZmllciBmbGFncyBmb3IgdGhpcyBtZW1iZXIKKyAqIEBzZWUgRmxhZ3MKKyAqLworaW50IGdldEZsYWdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIG9mIHRoaXMgbWVtYmVyJ3Mgc2ltcGxlIG5hbWUsCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1lbWJlciBkb2VzIG5vdCBoYXZlIGEgbmFtZQorICogKGZvciBleGFtcGxlLCBhbiBpbml0aWFsaXplciksIG9yIGlmIHRoaXMgbWVtYmVyIGRvZXMgbm90IGhhdmUKKyAqIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgKGZvciBleGFtcGxlLCBhIGJpbmFyeSB0eXBlKS4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBtZW1iZXIncyBzaW1wbGUgbmFtZSwKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbWVtYmVyIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiAoZm9yIGV4YW1wbGUsIGFuIGluaXRpYWxpemVyKSwgb3IgaWYgdGhpcyBtZW1iZXIgZG9lcyBub3QgaGF2ZQorICogYXNzb2NpYXRlZCBzb3VyY2UgY29kZSAoZm9yIGV4YW1wbGUsIGEgYmluYXJ5IHR5cGUpCisgKi8KK0lTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtZW1iZXIgaXMgZnJvbSBhIGNsYXNzIGZpbGUuCisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZnJvbSBhIGNsYXNzIGZpbGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYKKyAqICAgZnJvbSBhIGNvbXBpbGF0aW9uIHVuaXQKKyAqLworYm9vbGVhbiBpc0JpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2U5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWV0aG9kLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtZXRob2QgKG9yIGNvbnN0cnVjdG9yKSBkZWNsYXJlZCBpbiBhIHR5cGUuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNZXRob2QgZXh0ZW5kcyBJTWVtYmVyIHsKKy8qKgorICogUmV0dXJucyB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyBtZXRob2QuCisgKiBGb3IgYSBjb25zdHJ1Y3RvciwgdGhpcyByZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZGVjbGFyaW5nIHR5cGUuCisgKiBOb3RlOiBUaGlzIGhvbGRzIHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIGFwcGVhcnMgaW4gYSBzb3VyY2Ugb3IgYmluYXJ5IHR5cGUKKyAqIChldmVuIHRob3VnaCBjbGFzcyBmaWxlcyBpbnRlcm5hbGx5IGRlZmluZSBjb25zdHJ1Y3RvciBuYW1lcyB0byBiZSA8Y29kZT4iJmx0O2luaXQmZ3Q7IjwvY29kZT4pLgorICogRm9yIHRoZSBjbGFzcyBpbml0aWFsaXphdGlvbiBtZXRob2RzIGluIGJpbmFyeSB0eXBlcywgdGhpcyByZXR1cm5zCisgKiB0aGUgc3BlY2lhbCBuYW1lIDxjb2RlPiImbHQ7Y2xpbml0Jmd0OyI8L2NvZGU+LgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqLworU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgZXhjZXB0aW9ucyB0aGlzIG1ldGhvZCB0aHJvd3MsCisgKiBpbiB0aGUgb3JkZXIgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZS4gUmV0dXJucyBhbiBlbXB0eSBhcnJheQorICogaWYgdGhpcyBtZXRob2QgdGhyb3dzIG5vIGV4Y2VwdGlvbnMuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGEgc291cmNlIG1ldGhvZCBkZWNsYXJpbmcgPGNvZGU+InRocm93cyBJT0V4Y2VwdGlvbiI8L2NvZGU+LAorICogd291bGQgcmV0dXJuIHRoZSBhcnJheSA8Y29kZT57IlFJT0V4Y2VwdGlvbjsifTwvY29kZT4uCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmVzIG9mIHRoZSBleGNlcHRpb25zIHRoaXMgbWV0aG9kIHRocm93cywKKyAqIGluIHRoZSBvcmRlciBkZWNsYXJlZCBpbiB0aGUgc291cmNlLCBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIG1ldGhvZCB0aHJvd3Mgbm8gZXhjZXB0aW9ucworICogQHNlZSBTaWduYXR1cmUKKyAqLworU3RyaW5nW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZC4KKyAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisgKiAKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kCisgKi8KK2ludCBnZXROdW1iZXJPZlBhcmFtZXRlcnMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZXMgb2YgcGFyYW1ldGVycyBpbiB0aGlzIG1ldGhvZC4KKyAqIEZvciBiaW5hcnkgdHlwZXMsIHRoZXNlIG5hbWVzIGFyZSBpbnZlbnRlZCBhcyAiYXJnIitpLCB3aGVyZSBpIHN0YXJ0cyBhdCAxIAorICogKGV2ZW4gaWYgc291cmNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluYXJ5KS4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBtZXRob2QgaGFzIG5vIHBhcmFtZXRlcnMuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGEgbWV0aG9kIGRlY2xhcmVkIGFzIDxjb2RlPnB1YmxpYyB2b2lkIGZvbyhTdHJpbmcgdGV4dCwgaW50IGxlbmd0aCk8L2NvZGU+CisgKiB3b3VsZCByZXR1cm4gdGhlIGFycmF5IDxjb2RlPnsidGV4dCIsImxlbmd0aCJ9PC9jb2RlPi4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiBwYXJhbWV0ZXJzIGluIHRoaXMgbWV0aG9kLCBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICovCitTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlcyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QuCisgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgYSBzb3VyY2UgbWV0aG9kIGRlY2xhcmVkIGFzIDxjb2RlPnB1YmxpYyB2b2lkIGZvbyhTdHJpbmcgdGV4dCwgaW50IGxlbmd0aCk8L2NvZGU+CisgKiB3b3VsZCByZXR1cm4gdGhlIGFycmF5IDxjb2RlPnsiUVN0cmluZzsiLCJJIn08L2NvZGU+LgorICogCisgKiBAcmV0dXJuIHRoZSB0eXBlIHNpZ25hdHVyZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLCBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICogQHNlZSBTaWduYXR1cmUKKyAqLworU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC4KKyAqIEZvciBjb25zdHJ1Y3RvcnMsIHRoaXMgcmV0dXJucyB0aGUgc2lnbmF0dXJlIGZvciB2b2lkLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBhIHNvdXJjZSBtZXRob2QgZGVjbGFyZWQgYXMgPGNvZGU+cHVibGljIFN0cmluZyBnZXROYW1lKCk8L2NvZGU+CisgKiB3b3VsZCByZXR1cm4gPGNvZGU+IlFTdHJpbmc7IjwvY29kZT4uCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCwgdm9pZCAgZm9yIGNvbnN0cnVjdG9ycworICogQHNlZSBTaWduYXR1cmUKKyAqLworU3RyaW5nIGdldFJldHVyblR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZC4gVGhpcyBpbmNsdWRlcyB0aGUgc2lnbmF0dXJlcyBmb3IgdGhlIHBhcmFtZXRlcgorICogdHlwZXMgYW5kIHJldHVybiB0eXBlLCBidXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWV0aG9kIG5hbWUgb3IgZXhjZXB0aW9uIHR5cGVzLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBhIHNvdXJjZSBtZXRob2QgZGVjbGFyZWQgYXMgPGNvZGU+cHVibGljIHZvaWQgZm9vKFN0cmluZyB0ZXh0LCBpbnQgbGVuZ3RoKTwvY29kZT4KKyAqIHdvdWxkIHJldHVybiA8Y29kZT4iKFFTdHJpbmc7SSlWIjwvY29kZT4uCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICoKKyAqIEBzZWUgU2lnbmF0dXJlCisgKi8KK1N0cmluZyBnZXRTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisgKiAKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGEgbWFpbiBtZXRob2QuCisgKiBJdCBpcyBhIG1haW4gbWV0aG9kIGlmOgorICogPHVsPgorICogPGxpPml0cyBuYW1lIGlzIGVxdWFsIHRvIDxjb2RlPiJtYWluIjwvY29kZT48L2xpPgorICogPGxpPml0cyByZXR1cm4gdHlwZSBpcyA8Y29kZT52b2lkPC9jb2RlPjwvbGk+CisgKiA8bGk+aXQgaXMgPGNvZGU+c3RhdGljPC9jb2RlPiBhbmQgPGNvZGU+cHVibGljPC9jb2RlPjwvbGk+CisgKiA8bGk+aXQgZGVmaW5lcyBvbmUgcGFyYW1ldGVyIHdob3NlIHR5cGUncyBzaW1wbGUgbmFtZSBpcyA8L2NvZGU+U3RyaW5nW108L2NvZGU+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKyAqIEBzaW5jZSAyLjAKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBhIG1haW4gbWV0aG9kLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbGVhbiBpc01haW5NZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB0aGUgZ2l2ZW4gbWV0aG9kLgorICogVHdvIG1ldGhvZHMgYXJlIHNpbWlsYXIgaWY6CisgKiA8dWw+CisgKiA8bGk+dGhlaXIgZWxlbWVudCBuYW1lcyBhcmUgZXF1YWw8L2xpPgorICogPGxpPnRoZXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1ldGVyczwvbGk+CisgKiA8bGk+dGhlIHNpbXBsZSBuYW1lcyBvZiB0aGVpciBwYXJhbWV0ZXIgdHlwZXMgYXJlIGVxdWFsPC9saT4KKyAqIDwvdWw+CisgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorICogCisgKiBAcGFyYW0gbWV0aG9kIHRoZSBnaXZlbiBtZXRob2QKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHRoZSBnaXZlbiBtZXRob2QuCisgKiBAc2VlIFNpZ25hdHVyZSNnZXRTaW1wbGVOYW1lCisgKiBAc2luY2UgMi4wCisgKi8KK2Jvb2xlYW4gaXNTaW1pbGFyKElNZXRob2QgbWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU9wZW5hYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjMjVkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCisvKioKKyAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IG11c3QgYmUgb3BlbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSAKKyAqIG5hdmlnYXRlZCBvciBtb2RpZmllZC4gT3BlbmluZyBhIHRleHR1YWwgZWxlbWVudCAoc3VjaCBhcyBhIGNvbXBpbGF0aW9uIHVuaXQpCisgKiBpbnZvbHZlcyBvcGVuaW5nIGEgYnVmZmVyIG9uIGl0cyBjb250ZW50cy4gIFdoaWxlIG9wZW4sIGFueSBjaGFuZ2VzIHRvIHRoZSBidWZmZXIKKyAqIGNhbiBiZSByZWZsZWN0ZWQgaW4gdGhlIGVsZW1lbnQncyBzdHJ1Y3R1cmU7IAorICogc2VlIDxjb2RlPmlzQ29uc2lzdGVudDwvY29kZT4gYW5kIDxjb2RlPm1ha2VDb25zaXN0ZW50KElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4KKyAqIDxwPgorICogVG8gcmVkdWNlIGNvbXBsZXhpdHkgaW4gY2xpZW50cywgZWxlbWVudHMgYXJlIGF1dG9tYXRpY2FsbHkgb3BlbmVkCisgKiBieSB0aGUgSmF2YSBtb2RlbCBhcyBlbGVtZW50IHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgSmF2YSBtb2RlbCBtYWludGFpbnMKKyAqIGFuIExSVSBjYWNoZSBvZiBvcGVuIGVsZW1lbnRzLCBhbmQgYXV0b21hdGljYWxseSBjbG9zZXMgZWxlbWVudHMgYXMgdGhleQorICogYXJlIHN3YXBwZWQgb3V0IG9mIHRoZSBjYWNoZSB0byBtYWtlIHJvb20gZm9yIG90aGVyIGVsZW1lbnRzLiBFbGVtZW50cyB3aXRoCisgKiB1bnNhdmVkIGNoYW5nZXMgYXJlIG5ldmVyIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUsIGFuZCB0aHVzLCBpZiB0aGUgY2xpZW50CisgKiBtYWludGFpbnMgbWFueSBvcGVuIGVsZW1lbnRzIHdpdGggdW5zYXZlZAorICogY2hhbmdlcywgdGhlIExSVSBjYWNoZSBjYW4gZ3JvdyBpbiBzaXplIChpbiB0aGlzIGNhc2UgdGhlIGNhY2hlIGlzIG5vdAorICogYm91bmRlZCkuIEhvd2V2ZXIsIGFzIGVsZW1lbnRzIGFyZSBzYXZlZCwgdGhlIGNhY2hlIHdpbGwgc2hyaW5rIGJhY2sgdG8gaXRzCisgKiBvcmlnaW5hbCBib3VuZGVkIHNpemUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRvIG9wZW4gYW4gZWxlbWVudCwgYWxsIG9wZW5hYmxlIHBhcmVudCBlbGVtZW50cyBtdXN0IGJlIG9wZW4uCisgKiBUaGUgSmF2YSBtb2RlbCBhdXRvbWF0aWNhbGx5IG9wZW5zIHBhcmVudCBlbGVtZW50cywgYXMgaXQgYXV0b21hdGljYWxseSBvcGVucyBlbGVtZW50cy4KKyAqIE9wZW5pbmcgYW4gZWxlbWVudCBtYXkgcHJvdmlkZSBhY2Nlc3MgdG8gZGlyZWN0IGNoaWxkcmVuIGFuZCBvdGhlciBkZXNjZW5kYW50cywKKyAqIGJ1dCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IG9wZW4gYW55IGRlc2NlbmRlbnRzIHdoaWNoIGFyZSB0aGVtc2VsdmVzIDxjb2RlPklPcGVuYWJsZTwvY29kZT4uCisgKiBGb3IgZXhhbXBsZSwgb3BlbmluZyBhIGNvbXBpbGF0aW9uIHVuaXQgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBpdHMgY29uc3RpdHVlbnQgZWxlbWVudHMsCisgKiBidXQgb3BlbmluZyBhIHBhY2thZ2UgZnJhZ21lbnQgZG9lcyBub3Qgb3BlbiBhbGwgY29tcGlsYXRpb24gdW5pdHMgaW4gdGhlIHBhY2thZ2UgZnJhZ21lbnQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElPcGVuYWJsZSB7CisKKy8qKgorICogQ2xvc2VzIHRoaXMgZWxlbWVudCBhbmQgaXRzIGJ1ZmZlciAoaWYgYW55KS4KKyAqIENsb3NpbmcgYW4gZWxlbWVudCB3aGljaCBpcyBub3Qgb3BlbiBoYXMgbm8gZWZmZWN0LgorICoKKyAqIDxwPk5vdGU6IGFsdGhvdWdoIDxjb2RlPmNsb3NlPC9jb2RlPiBpcyBleHBvc2VkIGluIHRoZSBBUEksIGNsaWVudHMgYXJlCisgKiBub3QgZXhwZWN0ZWQgdG8gb3BlbiBhbmQgY2xvc2UgZWxlbWVudHMgLSB0aGUgSmF2YSBtb2RlbCBkb2VzIHRoaXMgYXV0b21hdGljYWxseQorICogYXMgZWxlbWVudHMgYXJlIGFjY2Vzc2VkLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjbG9zaW5nIHRoaXMgZWxlbWVudAorICovCitwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIGJ1ZmZlciBvcGVuZWQgZm9yIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgYnVmZmVyLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHJldHVybiB0aGUgYnVmZmVyIG9wZW5lZCBmb3IgdGhpcyBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICogaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBidWZmZXIKKyAqLworcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgb3BlbiBhbmQ6CisgKiA8dWw+CisgKiA8bGk+aXRzIGJ1ZmZlciBoYXMgdW5zYXZlZCBjaGFuZ2VzLCBvcgorICogPGxpPm9uZSBvZiBpdHMgZGVzY2VuZGFudHMgaGFzIHVuc2F2ZWQgY2hhbmdlcywgb3IKKyAqIDxsaT5hIHdvcmtpbmcgY29weSBoYXMgYmVlbiBjcmVhdGVkIG9uIG9uZSBvZiB0aGlzCisgKiBlbGVtZW50J3MgY2hpbGRyZW4gYW5kIGhhcyBub3QgeWV0IGRlc3Ryb3llZAorICogPC91bD4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG9wZW4gYW5kOgorICogPHVsPgorICogPGxpPml0cyBidWZmZXIgaGFzIHVuc2F2ZWQgY2hhbmdlcywgb3IKKyAqIDxsaT5vbmUgb2YgaXRzIGRlc2NlbmRhbnRzIGhhcyB1bnNhdmVkIGNoYW5nZXMsIG9yCisgKiA8bGk+YSB3b3JraW5nIGNvcHkgaGFzIGJlZW4gY3JlYXRlZCBvbiBvbmUgb2YgdGhpcworICogZWxlbWVudCdzIGNoaWxkcmVuIGFuZCBoYXMgbm90IHlldCBkZXN0cm95ZWQKKyAqIDwvdWw+CisgKi8KK2Jvb2xlYW4gaGFzVW5zYXZlZENoYW5nZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29uc2lzdGVudCB3aXRoIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlIG9yIGJ1ZmZlci4KKyAqIFRoZSBlbGVtZW50IGlzIGNvbnNpc3RlbnQgd2hlbiBvcGVuZWQsIGFuZCBpcyBjb25zaXN0ZW50IGlmIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlCisgKiBvciBidWZmZXIgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0IHdhcyBsYXN0IGNvbnNpc3RlbnQuCisgKgorICogPHA+Tk9URTogQ2hpbGQgY29uc2lzdGVuY3kgaXMgbm90IGNvbnNpZGVyZWQuIEZvciBleGFtcGxlLCBhIHBhY2thZ2UgZnJhZ21lbnQKKyAqIHJlc3BvbmRzIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gaXQga25vd3MgYWJvdXQgYWxsIG9mIGl0cworICogY29tcGlsYXRpb24gdW5pdHMgcHJlc2VudCBpbiBpdHMgdW5kZXJseWluZyBmb2xkZXIuIEhvd2V2ZXIsIG9uZSBvciBtb3JlIG9mCisgKiB0aGUgY29tcGlsYXRpb24gdW5pdHMgY291bGQgYmUgaW5jb25zaXN0ZW50LgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIGNvbnNpc3RlbnQgd2l0aCBpdHMgdW5kZXJseWluZyByZXNvdXJjZSBvciBidWZmZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAqIEBzZWUgSU9wZW5hYmxlI21ha2VDb25zaXN0ZW50CisgKi8KK2Jvb2xlYW4gaXNDb25zaXN0ZW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgb3BlbmFibGUgaXMgb3Blbi4gVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZW5hYmxlIGlzIG9wZW4sIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGlzT3BlbigpOworLyoqCisgKiBNYWtlcyB0aGlzIGVsZW1lbnQgY29uc2lzdGVudCB3aXRoIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlIG9yIGJ1ZmZlciAKKyAqIGJ5IHVwZGF0aW5nIHRoZSBlbGVtZW50J3Mgc3RydWN0dXJlIGFuZCBwcm9wZXJ0aWVzIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gcHJvZ3Jlc3MgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGlzIHVuYWJsZSB0byBhY2Nlc3MgdGhlIGNvbnRlbnRzCisgKiAJCW9mIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiAgPGxpPlRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8L3VsPgorICogQHNlZSBJT3BlbmFibGUjaXNDb25zaXN0ZW50CisgKi8KK3ZvaWQgbWFrZUNvbnNpc3RlbnQoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogT3BlbnMgdGhpcyBlbGVtZW50IGFuZCBhbGwgcGFyZW50IGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IG9wZW4uCisgKiBGb3IgY29tcGlsYXRpb24gdW5pdHMsIGEgYnVmZmVyIGlzIG9wZW5lZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuCisgKgorICogPHA+Tm90ZTogYWx0aG91Z2ggPGNvZGU+b3BlbjwvY29kZT4gaXMgZXhwb3NlZCBpbiB0aGUgQVBJLCBjbGllbnRzIGFyZQorICogbm90IGV4cGVjdGVkIHRvIG9wZW4gYW5kIGNsb3NlIGVsZW1lbnRzIC0gdGhlIEphdmEgbW9kZWwgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkKKyAqIGFzIGVsZW1lbnRzIGFyZSBhY2Nlc3NlZC4KKyAqCisgKiBAcGFyYW0gcHJvZ3Jlc3MgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGNvbnRlbnRzCisgKiAJCW9mIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiAgPGxpPlRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgdm9pZCBvcGVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFNhdmVzIGFueSBjaGFuZ2VzIGluIHRoaXMgZWxlbWVudCdzIGJ1ZmZlciB0byBpdHMgdW5kZXJseWluZyByZXNvdXJjZQorICogdmlhIGEgd29ya3NwYWNlIHJlc291cmNlIG9wZXJhdGlvbi4gVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBlbGVtZW50IGhhcyBubyB1bmRlcmx5aW5nCisgKiBidWZmZXIsIG9yIGlmIHRoZXJlIGFyZSBubyB1bnNhdmVkIGNoYW5nZWQgaW4gdGhlIGJ1ZmZlci4KKyAqIDxwPgorICogVGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgY29udHJvbHMgaG93IHRoaXMgbWV0aG9kIGRlYWxzIHdpdGgKKyAqIGNhc2VzIHdoZXJlIHRoZSB3b3JrYmVuY2ggaXMgbm90IGNvbXBsZXRlbHkgaW4gc3luYyB3aXRoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KKyAqIElmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIHdpbGwgb25seSBhdHRlbXB0CisgKiB0byBvdmVyd3JpdGUgYSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHByb3ZpZGVkCisgKiBpdCBpcyBpbiBzeW5jIHdpdGggdGhlIHdvcmtiZW5jaC4gVGhpcyBvcHRpb24gZW5zdXJlcyB0aGVyZSBpcyBubyAKKyAqIHVuaW50ZW5kZWQgZGF0YSBsb3NzOyBpdCBpcyB0aGUgcmVjb21tZW5kZWQgc2V0dGluZy4KKyAqIEhvd2V2ZXIsIGlmIDxjb2RlPnRydWU8L2NvZGU+IGlzIHNwZWNpZmllZCwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUKKyAqIHRvIHdyaXRlIGEgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgCisgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3Rpbmcgb25lIGlmIG5lZWQgYmUuCisgKiBJbiBlaXRoZXIgY2FzZSwgaWYgdGhpcyBtZXRob2Qgc3VjY2VlZHMsIHRoZSByZXNvdXJjZSB3aWxsIGJlIG1hcmtlZCAKKyAqIGFzIGJlaW5nIGxvY2FsIChldmVuIGlmIGl0IHdhc24ndCBiZWZvcmUpLgorICogPHA+CisgKiBBcyBhIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiwgdGhlIGVsZW1lbnQgaXMgY29uc2lzdGVudCB3aXRoIGl0cyB1bmRlcmx5aW5nIAorICogcmVzb3VyY2Ugb3IgYnVmZmVyLiAKKyAqCisgKiBAcGFyYW0gcHJvZ3Jlc3MgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKyAqIEBwYXJhbSBmb3JjZSBpdCBjb250cm9scyBob3cgdGhpcyBtZXRob2QgZGVhbHMgd2l0aAorICogY2FzZXMgd2hlcmUgdGhlIHdvcmtiZW5jaCBpcyBub3QgY29tcGxldGVseSBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgYWNjZXNzaW5nIHRoZSBjb250ZW50cworICogCQlvZiBpdHMgdW5kZXJseWluZyByZXNvdXJjZS4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBpcyByZWFkLW9ubHkgKFJFQURfT05MWSk8L2xpPgorICogPC91bD4KKyAqLworcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcGFja2FnZSBkZWNsYXJhdGlvbiBpbiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlRGVjbGFyYXRpb24gZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElTb3VyY2VSZWZlcmVuY2UgeworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoZSBzdGF0ZW1lbnQgcmVmZXJzIHRvLgorICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKyAqLworU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4MDcyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworLyoqCisgKiBBIHBhY2thZ2UgZnJhZ21lbnQgaXMgYSBwb3J0aW9uIG9mIHRoZSB3b3Jrc3BhY2UgY29ycmVzcG9uZGluZyB0byBhbiBlbnRpcmUgcGFja2FnZSwKKyAqIG9yIHRvIGEgcG9ydGlvbiB0aGVyZW9mLiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHBhY2thZ2UgZnJhZ21lbnQgYW5kIGEgcGFja2FnZQorICogaXMgdGhhdCBhIHBhY2thZ2Ugd2l0aCBzb21lIG5hbWUgaXMgdGhlIHVuaW9uIG9mIGFsbCBwYWNrYWdlIGZyYWdtZW50cyBpbiB0aGUgY2xhc3MgcGF0aAorICogd2hpY2ggaGF2ZSB0aGUgc2FtZSBuYW1lLgorICogPHA+CisgKiBQYWNrYWdlIGZyYWdtZW50cyBlbGVtZW50cyBuZWVkIHRvIGJlIG9wZW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgbmF2aWdhdGVkIG9yIG1hbmlwdWxhdGVkLgorICogVGhlIGNoaWxkcmVuIGFyZSBvZiB0eXBlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+IChyZXByZXNlbnRpbmcgYSBzb3VyY2UgZmlsZSkgb3IgCisgKiA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiAocmVwcmVzZW50aW5nIGEgYmluYXJ5IGNsYXNzIGZpbGUpLgorICogVGhlIGNoaWxkcmVuIGFyZSBsaXN0ZWQgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2VGcmFnbWVudCBleHRlbmRzIElQYXJlbnQsIElKYXZhRWxlbWVudCwgSU9wZW5hYmxlLCBJU291cmNlTWFuaXB1bGF0aW9uIHsKKworCS8qKgkKKwkgKiA8cD4KKwkgKiBUaGUgbmFtZSBvZiBwYWNrYWdlIGZyYWdtZW50IGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlICh2YWx1ZTogdGhlIGVtcHR5IAorCSAqIHN0cmluZywgPGNvZGU+IiI8L2NvZGU+KS4KKwkgKiA8L3A+CisgCSovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZyYWdtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBKYXZhIHJlc291cmNlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBKYXZhIHJlc291cmNlLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGNvbnRhaW5zSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvbXBpbGF0aW9uIHVuaXQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IAorCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBjb250ZW50cy4gTm8gdmVyaWZpY2F0aW9uIGlzIHBlcmZvcm1lZAorCSAqIG9uIHRoZSBjb250ZW50cy4KKwkgKgorCSAqIDxwPkl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIAorCSAqIHBhY2thZ2UgZnJhZ21lbnQuCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKwkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgorCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIGNvbXBpbGF0aW9uIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3IGNvbnRlbnRzPC9saT4KKwkgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIGNvbnRlbnRzIHRoZSBnaXZlbiBjb250ZW50cworCSAqIEBwYXJhbSBmb3JjZSBzcGVjaWZ5IGhvdyB0byBoYW5kbGUgY29uZmxpY3QgaXMgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkgKiA8bGk+IFRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSAoSU5WQUxJRF9OQU1FKQorCSAqIDxsaT4gVGhlIGNvbnRlbnRzIGFyZSA8Y29kZT5udWxsPC9jb2RlPiAoSU5WQUxJRF9DT05URU5UUykKKwkgKiA8L3VsPgorCSAqIEByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0IGluIHRoaXMgcGFja2FnZSBmcmFnbWVudCAKKwkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudHMKKwkgKi8KKwlJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgY2xhc3MgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorCSAqIGluIHRoaXMgcGFja2FnZSAoZm9yIGV4YW1wbGUsIDxjb2RlPiJPYmplY3QuY2xhc3MiPC9jb2RlPikuCisJICogVGhlICIuY2xhc3MiIHN1ZmZpeCBpcyByZXF1aXJlZC4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIGNsYXNzIGZpbGUgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudC4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorCSAqIEByZXR1cm4gdGhlIGNsYXNzIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBwYWNrYWdlCisJICovCisJSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoU3RyaW5nIG5hbWUpOworCS8qKgorCSAqIFJldHVybnMgYWxsIG9mIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuCisJICoKKwkgKiA8cD5Ob3RlOiBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgcGFja2FnZSBmcmFnbWVudCBjb250YWlucyBvbmx5CisJICogY29tcGlsYXRpb24gdW5pdHMgKGkuZS4gaXRzIGtpbmQgaXMgPGNvZGU+S19TT1VSQ0U8L2NvZGU+KSwgaW4KKwkgKiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbi4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgY2xhc3MgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50CisJICovCisJSUNsYXNzRmlsZVtdIGdldENsYXNzRmlsZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKwkgKiBpbiB0aGlzIHBhY2thZ2UgKGZvciBleGFtcGxlLCA8Y29kZT4iT2JqZWN0LmphdmEiPC9jb2RlPikuCisJICogVGhlIG5hbWUgaGFzIHRvIGJlIGEgdmFsaWQgY29tcGlsYXRpb24gdW5pdCBuYW1lLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuICBUaGUgY29tcGlsYXRpb24gdW5pdCBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LgorCSAqIEBzZWUgSmF2YUNvbnZlbnRpb25zI3ZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZQorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHBhY2thZ2UKKwkgKi8KKwlJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChTdHJpbmcgbmFtZSk7CisJLyoqCisJICogUmV0dXJucyBhbGwgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudC4KKwkgKgorCSAqIDxwPk5vdGU6IGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IGNvbnRhaW5zIG9ubHkKKwkgKiBjbGFzcyBmaWxlcyAoaS5lLiBpdHMga2luZCBpcyA8Y29kZT5LX0JJTkFSWTwvY29kZT4pLCBpbiB3aGljaAorCSAqIGNhc2UgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gYWxsIG9mIHRoZSBjb21waWxhdGlvbiB1bml0cyBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQKKwkgKi8KKwlJQ29tcGlsYXRpb25Vbml0W10gZ2V0Q29tcGlsYXRpb25Vbml0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgb2YgdGhpcyBmcmFnbWVudCwgZm9yIGV4YW1wbGUKKwkgKiA8Y29kZT4iamF2YS5sYW5nIjwvY29kZT4sIG9yIDxjb2RlPiIiPC9jb2RlPiAodGhlIGVtcHR5IHN0cmluZyksCisJICogZm9yIHRoZSBkZWZhdWx0IHBhY2thZ2UuCisJICogCisJICogQHJldHVybiB0aGUgZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgb2YgdGhpcyBmcmFnbWVudAorCSAqLworCVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhpcyBwYWNrYWdlIGZyYWdtZW50J3Mgcm9vdCBraW5kIGVuY29kZWQgYXMgYW4gaW50ZWdlci4KKwkgKiBBIHBhY2thZ2UgZnJhZ21lbnQgY2FuIGNvbnRhaW4gPGNvZGU+LmphdmE8L2NvZGU+IHNvdXJjZSBmaWxlcywKKwkgKiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLgorCSAqCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNLX1NPVVJDRQorCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjS19CSU5BUlkKKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoaXMgcGFja2FnZSBmcmFnbWVudCdzIHJvb3Qga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIKKwkgKi8KKwlpbnQgZ2V0S2luZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tSmF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50CisJICovCisJT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSBmcmFnbWVudCdzIG5hbWUgaXMKKwkgKiBhIHByZWZpeCBvZiBvdGhlciBwYWNrYWdlIGZyYWdtZW50cyBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQncworCSAqIHJvb3QuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCdzIG5hbWUgaXMgYSBwcmVmaXggb2Ygb3RoZXIgcGFja2FnZSBmcmFnbWVudHMgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50J3Mgcm9vdCwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBoYXNTdWJwYWNrYWdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSBmcmFnbWVudCBpcyBhIGRlZmF1bHQgcGFja2FnZS4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgaXMgYSBkZWZhdWx0IHBhY2thZ2UKKwkgKi8KKwlib29sZWFuIGlzRGVmYXVsdFBhY2thZ2UoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWQzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworLyoqCisgKiBBIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb250YWlucyBhIHNldCBvZiBwYWNrYWdlIGZyYWdtZW50cy4KKyAqIEl0IGNvcnJlc3BvbmRzIHRvIGFuIHVuZGVybHlpbmcgcmVzb3VyY2Ugd2hpY2ggaXMgZWl0aGVyIGEgZm9sZGVyLAorICogSkFSLCBvciB6aXAuICBJbiB0aGUgY2FzZSBvZiBhIGZvbGRlciwgYWxsIGRlc2NlbmRhbnQgZm9sZGVycyByZXByZXNlbnQKKyAqIHBhY2thZ2UgZnJhZ21lbnRzLiAgRm9yIGEgZ2l2ZW4gY2hpbGQgZm9sZGVyIHJlcHJlc2VudGluZyBhIHBhY2thZ2UgZnJhZ21lbnQsIAorICogdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBuYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBmb2xkZXIgbmFtZXMgYmV0d2VlbiB0aGUgZm9sZGVyIAorICogZm9yIHRoaXMgcm9vdCBhbmQgdGhlIGNoaWxkIGZvbGRlciByZXByZXNlbnRpbmcgdGhlIHBhY2thZ2UsIHNlcGFyYXRlZCBieSAnLicuCisgKiBJbiB0aGUgY2FzZSBvZiBhIEpBUiBvciB6aXAsIHRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBkaWN0YXRlcyAKKyAqIHRoZSBzZXQgb2YgcGFja2FnZSBmcmFnbWVudHMgaW4gYW4gYW5hbG9nb3VzIG1hbm5lci4KKyAqIFBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgbmVlZCB0byBiZSBvcGVuZWQgYmVmb3JlIHRoZXkgY2FuIGJlIG5hdmlnYXRlZCBvciBtYW5pcHVsYXRlZC4KKyAqIFRoZSBjaGlsZHJlbiBhcmUgb2YgdHlwZSA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPiwgYW5kIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJUGFja2FnZUZyYWdtZW50Um9vdAorCWV4dGVuZHMgSVBhcmVudCwgSUphdmFFbGVtZW50LCBJT3BlbmFibGUgeworCS8qKgorCSAqIEtpbmQgY29uc3RhbnQgZm9yIGEgc291cmNlIHBhdGggcm9vdC4gSW5kaWNhdGVzIHRoaXMgcm9vdAorCSAqIG9ubHkgY29udGFpbnMgc291cmNlIGZpbGVzLgorCSAqLworCWludCBLX1NPVVJDRSA9IDE7CisJLyoqCisJICogS2luZCBjb25zdGFudCBmb3IgYSBiaW5hcnkgcGF0aCByb290LiBJbmRpY2F0ZXMgdGhpcworCSAqIHJvb3Qgb25seSBjb250YWlucyBiaW5hcnkgZmlsZXMuCisJICovCisJaW50IEtfQklOQVJZID0gMjsKKwkvKioKKwkgKiBFbXB0eSByb290IHBhdGgKKwkgKi8KKwlTdHJpbmcgREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBBdHRhY2hlcyB0aGUgc291cmNlIGFyY2hpdmUgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCB0byB0aGlzCisJICogSkFSIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4gPGNvZGU+cm9vdFBhdGg8L2NvZGU+IHNwZWNpZmllcyB0aGUgbG9jYXRpb24KKwkgKiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIGFyY2hpdmUgKDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IHNwZWNpZmllcyB0aGUgZGVmYXVsdCByb290KS4KKwkgKiBPbmNlIGEgc291cmNlIGFyY2hpdmUgaXMgYXR0YWNoZWQgdG8gdGhlIEpBUiwKKwkgKiB0aGUgPGNvZGU+Z2V0U291cmNlPC9jb2RlPiBhbmQgPGNvZGU+Z2V0U291cmNlUmFuZ2U8L2NvZGU+CisJICogbWV0aG9kcyBiZWNvbWUgb3BlcmF0aW9uYWwgZm9yIGJpbmFyeSB0eXBlcy9tZW1iZXJzLgorCSAqIFRvIGRldGFjaCBhIHNvdXJjZSBhcmNoaXZlIGZyb20gYSBKQVIsIHNwZWNpZnkgPGNvZGU+bnVsbDwvY29kZT4gYXMgdGhlCisJICogYXJjaGl2ZVBhdGguCisJICoKKwkgKiBAcGFyYW0gYXJjaGl2ZVBhdGggdGhlIGdpdmVuIGFic29sdXRlIHBhdGggdG8gdGhpcyBKQVIgcGFja2FnZSBmcmFnbWVudCByb290CisJICogQHBhcmFtIHJvb3RQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlICg8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdCkKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzLiBSZWFzb25zIGluY2x1ZGU6CisJICogPHVsPgorCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYSBzZXJ2ZXIgcHJvcGVydHkKKwkgKiA8bGk+IFRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIG5vdCBhIEpBUiAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQorCSAqIDxsaT4gVGhlIHBhdGggcHJvdmlkZWQgaXMgbm90IGFic29sdXRlIChSRUxBVElWRV9QQVRIKQorCSAqIDwvdWw+CisJICovCisJdm9pZCBhdHRhY2hTb3VyY2UoSVBhdGggYXJjaGl2ZVBhdGgsIElQYXRoIHJvb3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBwYWNrYWdlIGZyYWdtZW50IGluIHRoaXMgcm9vdCB3aXRoIHRoZSAKKwkgKiBnaXZlbiBkb3Qtc2VwYXJhdGVkIHBhY2thZ2UgbmFtZS4gIEFuIGVtcHR5IHN0cmluZyBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcGFja2FnZS4gCisJICogVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFsbCBwYWNrYWdlCisJICogZnJhZ21lbnRzIHRoYXQgYXJlIGEgcHJlZml4IG9mIHRoZSBuZXcgcGFja2FnZSBmcmFnbWVudCB3aGljaAorCSAqIGRvIG5vdCBleGlzdCB5ZXQuIElmIHRoZSBwYWNrYWdlIGZyYWdtZW50IGFscmVhZHkgZXhpc3RzLCB0aGlzCisJICogaGFzIG5vIGVmZmVjdC4KKwkgKgorCSAqIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gZmxhZywgc2VlIDxjb2RlPklGb2xkZXIuY3JlYXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHBhY2thZ2UgbmFtZQorCSAqIEBwYXJhbSBmb3JjZSBhIGZsYWcgY29udHJvbGxpbmcgaG93IHRvIGRlYWwgd2l0aCByZXNvdXJjZXMgdGhhdAorCSAqICAgIGFyZSBub3QgaW4gc3luYyB3aXRoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisJICogPGxpPiBUaGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyByZWFkIG9ubHkgKFJFQURfT05MWSkKKwkgKiA8bGk+IFRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZSAoSU5WQUxJRF9OQU1FKQorCSAqIDwvdWw+CisJICogQHJldHVybiBhIHBhY2thZ2UgZnJhZ21lbnQgaW4gdGhpcyByb290IHdpdGggdGhlIGdpdmVuIGRvdC1zZXBhcmF0ZWQgcGFja2FnZSBuYW1lCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyI2NyZWF0ZQorCSAqLworCUlQYWNrYWdlRnJhZ21lbnQgY3JlYXRlUGFja2FnZUZyYWdtZW50KAorCQlTdHJpbmcgbmFtZSwKKwkJYm9vbGVhbiBmb3JjZSwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3Mga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIuCisJICogQSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY2FuIGNvbnRhaW4gPGNvZGU+LmphdmE8L2NvZGU+IHNvdXJjZSBmaWxlcywKKwkgKiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLCBidXQgbm90IGJvdGguCisJICogSWYgdGhlIHVuZGVybHlpbmcgZm9sZGVyIG9yIGFyY2hpdmUgY29udGFpbnMgb3RoZXIga2luZHMgb2YgZmlsZXMsIHRoZXkgYXJlIGlnbm9yZWQuCisJICogSW4gcGFydGljdWxhciwgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBhcmUgaWdub3JlZCB1bmRlciBhIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsCisJICogYW5kIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyBhcmUgaWdub3JlZCB1bmRlciBhIGJpbmFyeSBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisJICoKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290I0tfU09VUkNFCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNLX0JJTkFSWQorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBraW5kIGVuY29kZWQgYXMgYW4gaW50ZWdlcgorCSAqLworCWludCBnZXRLaW5kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiBub24tSmF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CisJICovCisJT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCisJICogQW4gZW1wdHkgc3RyaW5nIGluZGljYXRlcyB0aGUgZGVmYXVsdCBwYWNrYWdlLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBvcGVyYXRpb24uICBUaGUgcGFja2FnZSBmcmFnbWVudAorCSAqIG1heSBvciBtYXkgbm90IGV4aXN0LgorCSAqIAorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCisJICogQHJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKKwkgKi8KKwlJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmcgcGFja2FnZU5hbWUpOworCQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgcmF3IGNsYXNzcGF0aCBlbnRyeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgcGFja2FnZQorCSAqIGZyYWdtZW50IHJvb3QuCisJICogQSByYXcgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRzIHRvIGEgcGFja2FnZSBmcmFnbWVudCByb290IGlmIG9uY2UgcmVzb2x2ZWQKKwkgKiB0aGlzIGVudHJ5J3MgcGF0aCBpcyBlcXVhbCB0byB0aGUgcm9vdCdzIHBhdGguIAorCSAqIAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCByYXcgY2xhc3NwYXRoIGVudHJ5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QKKwkgKiBAc2luY2UgMi4wCisJICovCisJSUNsYXNzcGF0aEVudHJ5IGdldFJhd0NsYXNzcGF0aEVudHJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSBhdHRhY2hlZCB0bworCSAqIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3MgYmluYXJ5IGFyY2hpdmUuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCAKKwkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3MgYmluYXJ5IGFyY2hpdmUKKwkgKiAgIGhhcyBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCBvciBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorCSAqICAgaXMgbm90IGEgYmluYXJ5IGFyY2hpdmUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBmYWlscworCSAqLworCUlQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHNvdXJjZSBhcmNoaXZlLiAKKwkgKiBBbiBlbXB0eSBwYXRoIGluZGljYXRlcyB0aGF0IHBhY2thZ2VzIGFyZSBsb2NhdGVkIGF0IHRoZSByb290IG9mIHRoZQorCSAqIHNvdXJjZSBhcmNoaXZlLgorCSAqCisJICogQHJldHVybiB0aGUgcGF0aCB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIAorCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBiaW5hcnkgYXJjaGl2ZQorCSAqICAgaGFzIG5vIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIG9yIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CisJICogICBpcyBub3QgYSBiaW5hcnkgYXJjaGl2ZQorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzCisJICovCisJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyB1bmRlcmx5aW5nCisJICogcmVzb3VyY2UgaXMgYSBiaW5hcnkgYXJjaGl2ZSAoYSBKQVIgb3IgemlwIGZpbGUpLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UgcmFnbWVudCByb290J3MgdW5kZXJseWluZyByZXNvdXJjZSBpcyBhIGJpbmFyeSBhcmNoaXZlLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FyY2hpdmUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwKKwkgKiB0byB0aGUgd29ya2JlbmNoICh0aGF0IGlzLCBhIGxvY2FsIGZpbGUpLCBhbmQgaGFzIG5vCisJICogdW5kZXJseWluZyByZXNvdXJjZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwKKwkgKiB0byB0aGUgd29ya2JlbmNoICh0aGF0IGlzLCBhIGxvY2FsIGZpbGUpLCBhbmQgaGFzIG5vCisJICogdW5kZXJseWluZyByZXNvdXJjZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBpc0V4dGVybmFsKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhcmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTJjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFyZW50LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKKy8qKgorICogQ29tbW9uIHByb3RvY29sIGZvciBKYXZhIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvdGhlciBKYXZhIGVsZW1lbnRzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJUGFyZW50IHsKKy8qKgorICogUmV0dXJucyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4KKyAqIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBpbXBsZW1lbnRpbmcgZWxlbWVudCwKKyAqIHRoZSBjaGlsZHJlbiBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqIEByZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQKKyAqLworSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbGVtZW50IGhhcyBvbmUgb3IgbW9yZSBpbW1lZGlhdGUgY2hpbGRyZW4uCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBhbmQgbWF5IGJlIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAqIHRlc3Rpbmcgd2hldGhlciA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgYW4gZW1wdHkgYXJyYXkuCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKiAgICAgIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUHJvYmxlbVJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUHJvYmxlbVJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBqYXZhIHByb2JsZW0gYXMgdGhleSBhcmUgZGlzY292ZXJlZAorICogYnkgc29tZSBKYXZhIG9wZXJhdGlvbi4KKyAqIAorICogQHNlZSBJUHJvYmxlbQorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtUmVxdWVzdG9yIHsKKwkKKwkvKioKKwkgKiBOb3RpZmljYXRpb24gb2YgYSBKYXZhIHByb2JsZW0uCisJICogCisJICogQHBhcmFtIHByb2JsZW0gSVByb2JsZW0gLSBUaGUgZGlzY292ZXJlZCBKYXZhIHByb2JsZW0uCisJICovCQorCXZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKTsKKworCS8qKgorCSAqIE5vdGlmaWNhdGlvbiBzZW50IGJlZm9yZSBzdGFydGluZyB0aGUgcHJvYmxlbSBkZXRlY3Rpb24gcHJvY2Vzcy4KKwkgKiBUeXBpY2FsbHksIHRoaXMgd291bGQgdGVsbCBhIHByb2JsZW0gY29sbGVjdG9yIHRvIGNsZWFyIHByZXZpb3VzbHkgcmVjb3JkZWQgcHJvYmxlbXMuCisJICovCisJdm9pZCBiZWdpblJlcG9ydGluZygpOworCisJLyoqCisJICogTm90aWZpY2F0aW9uIHNlbnQgYWZ0ZXIgaGF2aW5nIGNvbXBsZXRlZCBwcm9ibGVtIGRldGVjdGlvbiBwcm9jZXNzLgorCSAqIFR5cGljYWxseSwgdGhpcyB3b3VsZCB0ZWxsIGEgcHJvYmxlbSBjb2xsZWN0b3IgdGhhdCBubyBtb3JlIHByb2JsZW1zIHNob3VsZCBiZSBleHBlY3RlZCBpbiB0aGlzCisJICogaXRlcmF0aW9uLgorCSAqLworCXZvaWQgZW5kUmVwb3J0aW5nKCk7CisKKwkvKioKKwkgKiBQcmVkaWNhdGUgYWxsb3dpbmcgdGhlIHByb2JsZW0gcmVxdWVzdG9yIHRvIHNpZ25hbCB3aGV0aGVyIG9yIG5vdCBpdCBpcyBjdXJyZW50bHkKKwkgKiBpbnRlcmVzdGVkIGJ5IHByb2JsZW0gcmVwb3J0cy4gV2hlbiBhbnN3ZXJpbmcgPGNvZGU+ZmFsc2U8L2ZhbHNlPiwgcHJvYmxlbSB3aWxsCisJICogbm90IGJlIGRpc2NvdmVyZWQgYW55IG1vcmUgdW50aWwgdGhlIG5leHQgaXRlcmF0aW9uLgorCSAqIAorCSAqIFRoaXMgIHByZWRpY2F0ZSB3aWxsIGJlIGludm9rZWQgb25jZSBwcmlvciB0byBlYWNoIHByb2JsZW0gZGV0ZWN0aW9uIGl0ZXJhdGlvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gLSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdG9yIGlzIGN1cnJlbnRseSBpbnRlcmVzdGVkIGJ5IHByb2JsZW1zLgorCSAqLworCWJvb2xlYW4gaXNBY3RpdmUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU4ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVJlZ2lvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEEgSmF2YSBtb2RlbCByZWdpb24gZGVzY3JpYmVzIGEgaGllcmFyY2hpY2FsIHNldCBvZiBlbGVtZW50cy4KKyAqIFJlZ2lvbnMgYXJlIG9mdGVuIHVzZWQgdG8gZGVzY3JpYmUgYSBzZXQgb2YgZWxlbWVudHMgdG8gYmUgY29uc2lkZXJlZAorICogd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnM7IGZvciBleGFtcGxlLCB0aGUgc2V0IG9mIGVsZW1lbnRzIHRvIGJlCisgKiBjb25zaWRlcmVkIGR1cmluZyBhIHNlYXJjaC4gQSByZWdpb24gbWF5IGluY2x1ZGUgZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQKKyAqIHByb2plY3RzLgorICogPHA+CisgKiBXaGVuIGFuIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYSByZWdpb24sIGFsbCBvZiBpdHMgY2hpbGRyZW4KKyAqIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluY2x1ZGVkLiBDaGlsZHJlbiBvZiBhbiBpbmNsdWRlZCBlbGVtZW50IAorICogPGI+Y2Fubm90PC9iPiBiZSBzZWxlY3RpdmVseSBleGNsdWRlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiBJbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQgdmlhIHRoZSA8Y29kZT5KYXZhQ29yZS5uZXdSZWdpb248L2NvZGU+LgorICogPC9wPgorICoKKyAqIEBzZWUgSmF2YUNvcmUjbmV3UmVnaW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVJlZ2lvbiB7CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kZW50cyB0byB0aGlzIHJlZ2lvbi4KKwkgKiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxyZWFkeSBpbmNsdWRlZCwgb3Igb25lIG9mIGl0cworCSAqIGFuY2VzdG9ycyBpcyBhbHJlYWR5IGluY2x1ZGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuIElmIHRoZSBlbGVtZW50CisJICogYmVpbmcgYWRkZWQgaXMgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGlzCisJICogcmVnaW9uLCB0aGUgYW5jZXN0b3Igc3Vic3VtZXMgdGhlIGRlc2NlbmRlbnQuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKKwkgKi8KKwl2b2lkIGFkZChJSmF2YUVsZW1lbnQgZWxlbWVudCk7CisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiB0aGlzIHJlZ2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZ2l2ZW4gZWxlbWVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBjb250YWluZWQgaW4gdGhpcyByZWdpb24sIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gY29udGFpbnMoSUphdmFFbGVtZW50IGVsZW1lbnQpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHRvcCBsZXZlbCBlbGVtZW50cyBpbiB0aGlzIHJlZ2lvbi4KKwkgKiBBbGwgZGVzY2VuZGVudHMgb2YgdGhlc2UgZWxlbWVudHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhpcyByZWdpb24uCisJICogCisJICogQHJldHVybiB0aGUgdG9wIGxldmVsIGVsZW1lbnRzIGluIHRoaXMgcmVnaW9uCisJICovCisJSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKTsKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSByZWdpb24gYW5kIHJldHVybnMKKwkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHJlbW92ZQorCSAqIGZhaWxzLiBJZiBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBpbmNsdWRlZCwgdGhlCisJICogcmVtb3ZlIGZhaWxzIChpLmUuIG5vdCBwb3NzaWJsZSB0byBzZWxlY3RpdmVseQorCSAqIGV4Y2x1ZGUgZGVzY2VuZGFudHMgb2YgaW5jbHVkZWQgYW5jZXN0b3JzKS4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZ2l2ZW4gZWxlbWVudAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSByZW1vdmUgZmFpbHMKKwkgKi8KKwlib29sZWFuIHJlbW92ZShJSmF2YUVsZW1lbnQgZWxlbWVudCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlTWFuaXB1bGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlTWFuaXB1bGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MmI4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VNYW5pcHVsYXRpb24uamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHNvdXJjZSBjb2RlIG1hbmlwdWxhdGlvbnMgc3VjaAorICogYXMgY29weSwgbW92ZSwgcmVuYW1lLCBhbmQgZGVsZXRlLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJU291cmNlTWFuaXB1bGF0aW9uIHsKKy8qKgorICogQ29waWVzIHRoaXMgZWxlbWVudCB0byB0aGUgZ2l2ZW4gY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lcgorICogQHBhcmFtIHNpYmxpbmcgdGhlIHNpYmxpbmcgZWxlbWVudCBiZWZvcmUgd2hpY2ggdGhlIGNvcHkgc2hvdWxkIGJlIGluc2VydGVkLAorICogICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29weSBzaG91bGQgYmUgaW5zZXJ0ZWQgYXMgdGhlIGxhc3QgY2hpbGQgb2YKKyAqICAgdGhlIGNvbnRhaW5lcgorICogQHBhcmFtIHJlbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29weQorICogICByZXRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudAorICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IGV4aXN0aW5nIGNoaWxkIGluIHRoZSBjb250YWluZXIgd2l0aAorICogICB0aGUgdGFyZ2V0IG5hbWUgc2hvdWxkIGJlIHJlcGxhY2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHRocm93IGFuCisgKiAgIGV4Y2VwdGlvbiBpbiB0aGUgZXZlbnQgb2YgYSBuYW1lIGNvbGxpc2lvbgorICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgY291bGQgbm90IGJlIGNvcGllZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCwgY29udGFpbmVyIGVsZW1lbnQsIG9yIHNpYmxpbmcgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKyAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisgKiA8bGk+IFRoZSBjb250YWluZXIgaXMgb2YgYW4gaW5jb21wYXRpYmxlIHR5cGUgKElOVkFMSURfREVTVElOQVRJT04pCisgKiA8bGk+IFRoZSBzaWJsaW5nIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBnaXZlbiBjb250YWluZXIgKElOVkFMSURfU0lCTElORykKKyAqIDxsaT4gVGhlIG5ldyBuYW1lIGlzIGludmFsaWQgKElOVkFMSURfTkFNRSkKKyAqIDxsaT4gQSBjaGlsZCBpbiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUgbmFtZSAoTkFNRV9DT0xMSVNJT04pCisgKgkJYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIDxsaT4gVGhlIGNvbnRhaW5lciBvciB0aGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5IChSRUFEX09OTFkpIAorICogPC91bD4KKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBjb250YWluZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqLwordm9pZCBjb3B5KElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIHJlcGxhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogRGVsZXRlcyB0aGlzIGVsZW1lbnQsIGZvcmNpbmcgaWYgc3BlY2lmaWVkIGFuZCBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIGZvcmNlIGEgZmxhZyBjb250cm9sbGluZyB3aGV0aGVyIHVuZGVybHlpbmcgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdAorICogICAgaW4gc3luYyB3aXRoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB3aWxsIGJlIHRvbGVyYXRlZCAoc2FtZSBhcyB0aGUgZm9yY2UgZmxhZworICoJICBpbiBJUmVzb3VyY2Ugb3BlcmF0aW9ucykuCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBjb3VsZCBub3QgYmUgZGVsZXRlZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UgKENPUkVfRVhDRVBUSU9OKTwvbGk+CisgKiA8bGk+IFRoaXMgZWxlbWVudCBpcyByZWFkLW9ubHkgKFJFQURfT05MWSk8L2xpPgorICogPC91bD4KKyAqLwordm9pZCBkZWxldGUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBNb3ZlcyB0aGlzIGVsZW1lbnQgdG8gdGhlIGdpdmVuIGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIKKyAqIEBwYXJhbSBzaWJsaW5nIHRoZSBzaWJsaW5nIGVsZW1lbnQgYmVmb3JlIHdoaWNoIHRoZSBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZCwKKyAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mCisgKiAgIHRoZSBjb250YWluZXIKKyAqIEBwYXJhbSByZW5hbWUgdGhlIG5ldyBuYW1lIGZvciB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgKiAgIGVsZW1lbnQgcmV0YWlucyBpdHMgbmFtZQorICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IGV4aXN0aW5nIGNoaWxkIGluIHRoZSBjb250YWluZXIgd2l0aAorICogICB0aGUgdGFyZ2V0IG5hbWUgc2hvdWxkIGJlIHJlcGxhY2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHRocm93IGFuCisgKiAgIGV4Y2VwdGlvbiBpbiB0aGUgZXZlbnQgb2YgYSBuYW1lIGNvbGxpc2lvbgorICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgY291bGQgbm90IGJlIG1vdmVkLiBSZWFzb25zIGluY2x1ZGU6CisgKiA8dWw+CisgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50LCBjb250YWluZXIgZWxlbWVudCwgb3Igc2libGluZyBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKyAqIDxsaT4gVGhlIGNvbnRhaW5lciBpcyBvZiBhbiBpbmNvbXBhdGlibGUgdHlwZSAoSU5WQUxJRF9ERVNUSU5BVElPTikKKyAqIDxsaT4gVGhlIHNpYmxpbmcgaXMgbm90IGEgY2hpbGQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciAoSU5WQUxJRF9TSUJMSU5HKQorICogPGxpPiBUaGUgbmV3IG5hbWUgaXMgaW52YWxpZCAoSU5WQUxJRF9OQU1FKQorICogPGxpPiBBIGNoaWxkIGluIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIChOQU1FX0NPTExJU0lPTikKKyAqCQlhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPgorICogPGxpPiBUaGUgY29udGFpbmVyIG9yIHRoaXMgZWxlbWVudCBpcyByZWFkLW9ubHkgKFJFQURfT05MWSkgCisgKiA8L3VsPgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGNvbnRhaW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCit2b2lkIG1vdmUoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBSZW5hbWVzIHRoaXMgZWxlbWVudCB0byB0aGUgZ2l2ZW4gbmFtZS4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSBlbGVtZW50CisgKiBAcGFyYW0gcmVwbGFjZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZXhpc3RpbmcgZWxlbWVudCB3aXRoIHRoZSB0YXJnZXQgbmFtZQorICogICBzaG91bGQgYmUgcmVwbGFjZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHRoZQorICogICBldmVudCBvZiBhIG5hbWUgY29sbGlzaW9uCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBjb3VsZCBub3QgYmUgcmVuYW1lZC4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKyAqIDxsaT4gVGhlIG5ldyBuYW1lIGlzIGludmFsaWQgKElOVkFMSURfTkFNRSkKKyAqIDxsaT4gQSBjaGlsZCBpbiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUgbmFtZSAoTkFNRV9DT0xMSVNJT04pCisgKgkJYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIDxsaT4gVGhpcyBlbGVtZW50IGlzIHJlYWQtb25seSAoUkVBRF9PTkxZKSAKKyAqIDwvdWw+CisgKi8KK3ZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIHJlcGxhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSYW5nZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZVJhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5MjNlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSYW5nZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEEgc291cmNlIHJhbmdlIGRlZmluZXMgYW4gZWxlbWVudCdzIHNvdXJjZSBjb29yZGluYXRlcyByZWxhdGl2ZSB0bworICogaXRzIHNvdXJjZSBidWZmZXIuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VSYW5nZSB7CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIGVsZW1lbnQsCisgKiByZWxhdGl2ZSB0byB0aGUgc291cmNlIGJ1ZmZlciBpbiB3aGljaCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkLgorICogCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMgZWxlbWVudCwKKyAqIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgYnVmZmVyIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQKKyAqLworaW50IGdldExlbmd0aCgpOworLyoqCisgKiBSZXR1cm5zIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIGVsZW1lbnQsCisgKiByZWxhdGl2ZSB0byB0aGUgc291cmNlIGJ1ZmZlciBpbiB3aGljaCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkLgorICogCisgKiBAcmV0dXJuIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIGVsZW1lbnQsCisgKiByZWxhdGl2ZSB0byB0aGUgc291cmNlIGJ1ZmZlciBpbiB3aGljaCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkCisgKi8KK2ludCBnZXRPZmZzZXQoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg2NmJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZVJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIENvbW1vbiBwcm90b2NvbCBmb3IgSmF2YSBlbGVtZW50cyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBzb3VyY2UgY29kZS4KKyAqIFRoaXMgc2V0IGNvbnNpc3RzIG9mIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+LCA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiwKKyAqIDxjb2RlPklQYWNrYWdlRGVjbGFyYXRpb248L2NvZGU+LCA8Y29kZT5JSW1wb3J0RGVjbGFyYXRpb248L2NvZGU+LAorICogPGNvZGU+SUltcG9ydENvbnRhaW5lcjwvY29kZT4sIDxjb2RlPklUeXBlPC9jb2RlPiwgPGNvZGU+SUZpZWxkPC9jb2RlPiwKKyAqIDxjb2RlPklNZXRob2Q8L2NvZGU+LCBhbmQgPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPi4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIE5vdGU6IEZvciA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPiwgPGNvZGU+SVR5cGU8L2NvZGU+IGFuZCBvdGhlciBtZW1iZXJzCisgKiBkZXJpdmVkIGZyb20gYSBiaW5hcnkgdHlwZSwgdGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgc291cmNlIGlmZiB0aGUKKyAqIGVsZW1lbnQgaGFzIGF0dGFjaGVkIHNvdXJjZSBjb2RlLgorICogPC9wPgorICogPHA+CisgKiBTb3VyY2UgcmVmZXJlbmNlIGVsZW1lbnRzIG1heSBiZSB3b3JraW5nIGNvcGllcyBpZiB0aGV5IHdlcmUgY3JlYXRlZCBmcm9tCisgKiBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBhIHdvcmtpbmcgY29weS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNhdHRhY2hTb3VyY2UKKyAqLworcHVibGljIGludGVyZmFjZSBJU291cmNlUmVmZXJlbmNlIHsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZWxlbWVudCBleGlzdHMgaW4gdGhlIG1vZGVsLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGV4aXN0cyBpbiB0aGUgSmF2YSBtb2RlbAorICogQHNpbmNlIDIuMAorICovCitib29sZWFuIGV4aXN0cygpOworCQorLyoqCisgKiBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50LgorICogVGhpcyBleHRyYWN0cyB0aGUgc3Vic3RyaW5nIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgY29udGFpbmluZyB0aGlzIHNvdXJjZQorICogZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIHJhbmdlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKKyAqIDxjb2RlPmdldFNvdXJjZVJhbmdlPC9jb2RlPi4KKyAqIDxwPgorICogRm9yIGNsYXNzIGZpbGVzLCB0aGlzIHJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQgCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuCisgKiA8L3A+CisgKgorICogQHJldHVybiB0aGUgc291cmNlIGNvZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gCisgKiAgIGFzc29jaWF0ZWQgc291cmNlIGNvZGUKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorICogICAgICBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQorICovCitTdHJpbmcgZ2V0U291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgc291cmNlIHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuCisgKiA8cD4KKyAqIEZvciBjbGFzcyBmaWxlcywgdGhpcyByZXR1cm5zIHRoZSByYW5nZSBvZiB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQgCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuCisgKiA8L3A+CisgKgorICogQHJldHVybiB0aGUgc291cmNlIHJhbmdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIAorICogICBhc3NvY2lhdGVkIHNvdXJjZSBjb2RlCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKyAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqLworSVNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmIzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgZWl0aGVyIGEgc291cmNlIHR5cGUgaW4gYSBjb21waWxhdGlvbiB1bml0IChlaXRoZXIgYSB0b3AtbGV2ZWwKKyAqIHR5cGUgb3IgYSBtZW1iZXIgdHlwZSkgb3IgYSBiaW5hcnkgdHlwZSBpbiBhIGNsYXNzIGZpbGUuCisgKiA8cD4KKyAqIElmIGEgYmluYXJ5IHR5cGUgY2Fubm90IGJlIHBhcnNlZCwgaXRzIHN0cnVjdHVyZSByZW1haW5zIHVua25vd24uCisgKiBVc2UgPGNvZGU+SUphdmFFbGVtZW50LmlzU3RydWN0dXJlS25vd248L2NvZGU+IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMKKyAqIGlzIHRoZSBjYXNlLgorICogPC9wPgorICogPHA+CisgKiBUaGUgY2hpbGRyZW4gYXJlIG9mIHR5cGUgPGNvZGU+SU1lbWJlcjwvY29kZT4sIHdoaWNoIGluY2x1ZGVzIDxjb2RlPklGaWVsZDwvY29kZT4sCisgKiA8Y29kZT5JTWV0aG9kPC9jb2RlPiwgPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPiBhbmQgPGNvZGU+SVR5cGU8L2NvZGU+LgorICogVGhlIGNoaWxkcmVuIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2Ugb3IgY2xhc3MgZmlsZS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJTWVtYmVyLCBJUGFyZW50IHsKKwkvKioKKwkgKiBEbyBjb2RlIGNvbXBsZXRpb24gaW5zaWRlIGEgY29kZSBzbmlwcGV0IGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHR5cGUuCisJICogCisJICogSWYgdGhlIHR5cGUgY2FuIGFjY2VzcyB0byBoaXMgc291cmNlIGNvZGUgYW5kIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgdmFsaWQsCisJICogdGhlbiBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHNvdXJjZS4gT3RoZXJ3aXNlIHRoZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZAorCSAqIGFnYWluc3QgdHlwZSBzdHJ1Y3R1cmUgYW5kIGdpdmVuIGxvY2FscyB2YXJpYWJsZXMuCisJICogCisJICogQHBhcmFtIHNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAorCSAqIEBwYXJhbSBpbnNlcnRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc291cmNlIHdoZXJlIHRoZSBzbmlwcGV0CisJICogaXMgaW5zZXJ0ZWQuIFRoaXMgcG9zaXRpb24gbXVzdCBub3QgYmUgaW4gY29tbWVudHMuCisJICogQSBwb3NzaWJsZSB2YWx1ZSBpcyAtMSwgaWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBrbm93bi4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdpdGggaW4gc25pcHBldCB3aGVyZSB0aGUgdXNlciAKKwkgKiBpcyBwZXJmb3JtaW5nIGNvZGUgYXNzaXN0LgorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlVHlwZXNOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGZ1bGx5IHF1YWxpZmllZCAKKwkgKiB0eXBlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlCisJICogQHBhcmFtIGxvY2FsVmFyaWFibGVOYW1lcyBhbiBhcnJheSAocG9zc2libHkgZW1wdHkpIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIAorCSAqIHRoYXQgYXJlIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUKKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyBhbiBhcnJheSAocG9zc2libGUgZW1wdHkpIG9mIG1vZGlmaWVycyBmb3IgCisJICogbG9jYWwgdmFyaWFibGVzCisJICogQHBhcmFtIGlzU3RhdGljIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2NvcGUgaXMgaW4gYSBzdGF0aWMgY29udGV4dAorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdG9yCisJICogQHNpbmNlIDIuMAorCSAqLworCXZvaWQgY29kZUNvbXBsZXRlKAorCQljaGFyW10gc25pcHBldCwKKwkJaW50IGluc2VydGlvbiwKKwkJaW50IHBvc2l0aW9uLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCQljaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsCisJCWludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsCisJCWJvb2xlYW4gaXNTdGF0aWMsCisJCUlDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBmaWVsZCBpbiB0aGlzIHR5cGUgd2l0aCB0aGUKKwkgKiBnaXZlbiBjb250ZW50cy4KKwkgKiA8cD4KKwkgKiBPcHRpb25hbGx5LCB0aGUgbmV3IGVsZW1lbnQgY2FuIGJlIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQKKwkgKiBzaWJsaW5nLiBJZiBubyBzaWJsaW5nIGlzIHNwZWNpZmllZCwgdGhlIGVsZW1lbnQgd2lsbCBiZSBpbnNlcnRlZAorCSAqIGFzIHRoZSBsYXN0IGZpZWxkIGRlY2xhcmF0aW9uIGluIHRoaXMgdHlwZS48L3A+CisJICoKKwkgKiA8cD5JdCBpcyBwb3NzaWJsZSB0aGF0IGEgZmllbGQgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgdHlwZS4KKwkgKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgZWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgorCSAqIHN1Y2ggYSBjb25mbGljdDo8dWw+CisJICogPGxpPiA8Y29kZT50cnVlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSB0aGUgZmllbGQgaXMgY3JlYXRlZCB3aXRoIHRoZSBuZXcgY29udGVudHM8L2xpPgorCSAqIDxsaT4gPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd248L2xpPgorCSAqIDwvdWw+PC9wPgorCSAqCisJICogQHBhcmFtIGNvbnRlbnRzIHRoZSBnaXZlbiBjb250ZW50cworCSAqIEBwYXJhbSBzaWJsaW5nIHRoZSBnaXZlbiBzaWJsaW5nCisJICogQHBhcmFtIGZvcmNlIGEgZmxhZyBpbiBjYXNlIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyB0eXBlCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkgKiA8bGk+IFRoZSBzcGVjaWZpZWQgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIHR5cGUgKElOVkFMSURfU0lCTElORykKKwkgKiA8bGk+IFRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgcmVjb2duaXplZCBhcyBhIGZpZWxkIGRlY2xhcmF0aW9uIChJTlZBTElEX0NPTlRFTlRTKQorCSAqIDxsaT4gVGhpcyB0eXBlIGlzIHJlYWQtb25seSAoYmluYXJ5KSAoUkVBRF9PTkxZKQorCSAqIDxsaT4gVGhlcmUgd2FzIGEgbmFtaW5nIGNvbGxpc2lvbiB3aXRoIGFuIGV4aXN0aW5nIGZpZWxkIChOQU1FX0NPTExJU0lPTikKKwkgKiA8L3VsPgorCSAqIEByZXR1cm4gYSBmaWVsZCBpbiB0aGlzIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudHMKKwkgKi8KKwlJRmllbGQgY3JlYXRlRmllbGQoU3RyaW5nIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RhdGljIGluaXRpYWxpemVyIGluIHRoaXMgdHlwZSB3aXRoIHRoZQorCSAqIGdpdmVuIGNvbnRlbnRzLgorCSAqIDxwPgorCSAqIE9wdGlvbmFsbHksIHRoZSBuZXcgZWxlbWVudCBjYW4gYmUgcG9zaXRpb25lZCBiZWZvcmUgdGhlIHNwZWNpZmllZAorCSAqIHNpYmxpbmcuIElmIG5vIHNpYmxpbmcgaXMgc3BlY2lmaWVkLCB0aGUgbmV3IGluaXRpYWxpemVyIGlzIHBvc2l0aW9uZWQKKwkgKiBhZnRlciB0aGUgbGFzdCBleGlzdGluZyBpbml0aWFsaXplciBkZWNsYXJhdGlvbiwgb3IgYXMgdGhlIGZpcnN0IG1lbWJlcgorCSAqIGluIHRoZSB0eXBlIGlmIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMuPC9wPgorCSAqCisJICogQHBhcmFtIGNvbnRlbnRzIHRoZSBnaXZlbiBjb250ZW50cworCSAqIEBwYXJhbSBzaWJsaW5nIHRoZSBnaXZlbiBzaWJsaW5nCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdAorCSAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisJICogPGxpPiBUaGUgc3BlY2lmaWVkIHNpYmxpbmcgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyB0eXBlIChJTlZBTElEX1NJQkxJTkcpCisJICogPGxpPiBUaGUgY29udGVudHMgY291bGQgbm90IGJlIHJlY29nbml6ZWQgYXMgYW4gaW5pdGlhbGl6ZXIgZGVjbGFyYXRpb24gKElOVkFMSURfQ09OVEVOVFMpCisJICogPGxpPiBUaGlzIHR5cGUgaXMgcmVhZC1vbmx5IChiaW5hcnkpIChSRUFEX09OTFkpCisJICogPC91bD4KKwkgKiBAcmV0dXJuIGEgc3RhdGljIGluaXRpYWxpemVyIGluIHRoaXMgdHlwZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50cworCSAqLworCUlJbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcihTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IgaW4gdGhpcyB0eXBlIHdpdGggdGhlCisJICogZ2l2ZW4gY29udGVudHMuCisJICogPHA+CisJICogT3B0aW9uYWxseSwgdGhlIG5ldyBlbGVtZW50IGNhbiBiZSBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkCisJICogc2libGluZy4gSWYgbm8gc2libGluZyBpcyBzcGVjaWZpZWQsIHRoZSBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWQKKwkgKiB0byB0aGlzIHR5cGUuCisJICoKKwkgKiA8cD5JdCBpcyBwb3NzaWJsZSB0aGF0IGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgdHlwZS4KKwkgKiBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvcmNlPC9jb2RlPiBwYXJhbWV0ZXIgZWZmZWN0cyB0aGUgcmVzb2x1dGlvbiBvZgorCSAqIHN1Y2ggYSBjb25mbGljdDo8dWw+CisJICogPGxpPiA8Y29kZT50cnVlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSB0aGUgbWV0aG9kIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbmV3IGNvbnRlbnRzPC9saT4KKwkgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KKwkgKiA8L3VsPjwvcD4KKwkgKgorCSAqIEBwYXJhbSBjb250ZW50cyB0aGUgZ2l2ZW4gY29udGVudHMKKwkgKiBAcGFyYW0gc2libGluZyB0aGUgZ2l2ZW4gc2libGluZworCSAqIEBwYXJhbSBmb3JjZSBhIGZsYWcgaW4gY2FzZSB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgdHlwZQorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCisJICogPGxpPiBUaGUgc3BlY2lmaWVkIHNpYmxpbmcgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyB0eXBlIChJTlZBTElEX1NJQkxJTkcpCisJICogPGxpPiBUaGUgY29udGVudHMgY291bGQgbm90IGJlIHJlY29nbml6ZWQgYXMgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IKKwkgKgkJZGVjbGFyYXRpb24gKElOVkFMSURfQ09OVEVOVFMpCisJICogPGxpPiBUaGlzIHR5cGUgaXMgcmVhZC1vbmx5IChiaW5hcnkpIChSRUFEX09OTFkpCisJICogPGxpPiBUaGVyZSB3YXMgYSBuYW1pbmcgY29sbGlzaW9uIHdpdGggYW4gZXhpc3RpbmcgbWV0aG9kIChOQU1FX0NPTExJU0lPTikKKwkgKiA8L3VsPgorCSAqIEByZXR1cm4gYSBtZXRob2Qgb3IgY29uc3RydWN0b3IgaW4gdGhpcyB0eXBlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRzCisJICovCisJSU1ldGhvZCBjcmVhdGVNZXRob2QoU3RyaW5nIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBpbiB0aGlzIHR5cGUgd2l0aCB0aGUKKwkgKiBnaXZlbiBjb250ZW50cy4KKwkgKiA8cD4KKwkgKiBPcHRpb25hbGx5LCB0aGUgbmV3IHR5cGUgY2FuIGJlIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQKKwkgKiBzaWJsaW5nLiBJZiBubyBzaWJsaW5nIGlzIHNwZWNpZmllZCwgdGhlIHR5cGUgd2lsbCBiZSBhcHBlbmRlZAorCSAqIHRvIHRoaXMgdHlwZS4KKwkgKgorCSAqIDxwPkl0IGlzIHBvc3NpYmxlIHRoYXQgYSB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHR5cGUuCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKwkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgorCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIHR5cGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBuZXcgY29udGVudHM8L2xpPgorCSAqIDxsaT4gPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd248L2xpPgorCSAqIDwvdWw+PC9wPgorCSAqCisJICogQHBhcmFtIGNvbnRlbnRzIHRoZSBnaXZlbiBjb250ZW50cworCSAqIEBwYXJhbSBzaWJsaW5nIHRoZSBnaXZlbiBzaWJsaW5nCisJICogQHBhcmFtIGZvcmNlIGEgZmxhZyBpbiBjYXNlIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyB0eXBlCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkgKiA8bGk+IFRoZSBzcGVjaWZpZWQgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIHR5cGUgKElOVkFMSURfU0lCTElORykKKwkgKiA8bGk+IFRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgcmVjb2duaXplZCBhcyBhIHR5cGUgZGVjbGFyYXRpb24gKElOVkFMSURfQ09OVEVOVFMpCisJICogPGxpPiBUaGlzIHR5cGUgaXMgcmVhZC1vbmx5IChiaW5hcnkpIChSRUFEX09OTFkpCisJICogPGxpPiBUaGVyZSB3YXMgYSBuYW1pbmcgY29sbGlzaW9uIHdpdGggYW4gZXhpc3RpbmcgZmllbGQgKE5BTUVfQ09MTElTSU9OKQorCSAqIDwvdWw+CisJICogQHJldHVybiBhIHR5cGUgaW4gdGhpcyB0eXBlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRzCisJICovCisJSVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCQorCS8qKiAKKwkgKiBGaW5kcyB0aGUgbWV0aG9kcyBpbiB0aGlzIHR5cGUgdGhhdCBjb3JyZXNwb25kIHRvCisJICogdGhlIGdpdmVuIG1ldGhvZC4KKwkgKiBBIG1ldGhvZCBtMSBjb3JyZXNwb25kcyB0byBhbm90aGVyIG1ldGhvZCBtMiBpZjoKKwkgKiA8dWw+CisJICogPGxpPm0xIGhhcyB0aGUgc2FtZSBlbGVtZW50IG5hbWUgYXMgbTIuCisJICogPGxpPm0xIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIG0yIGFuZAorCSAqICAgICB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBhcmd1bWVudCB0eXBlcyBtdXN0IGJlIGVxdWFscy4KKwkgKiA8bGk+bTEgZXhpc3RzLgorCSAqIDwvdWw+CisJICogQHBhcmFtIG1ldGhvZCB0aGUgZ2l2ZW4gbWV0aG9kCisJICogQHJldHVybiB0aGUgZm91bmQgbWV0aG9kIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggbWV0aG9kcyBjYW4gYmUgZm91bmQuCisJICogCisJICogQHNpbmNlIDIuMCAKKwkgKi8KKwlJTWV0aG9kW10gZmluZE1ldGhvZHMoSU1ldGhvZCBtZXRob2QpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgdHlwZSwgdW5xdWFsaWZpZWQgYnkgcGFja2FnZSBvciBlbmNsb3NpbmcgdHlwZS4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgdHlwZQorCSAqLworCVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisJICogaW4gdGhpcyB0eXBlIChmb3IgZXhhbXBsZSwgPGNvZGU+ImJhciI8L2NvZGU+KS4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIGZpZWxkIG1heSBvciBtYXkgbm90IGV4aXN0LgorCSAqIAorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHJldHVybiB0aGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyB0eXBlCisJICovCisJSUZpZWxkIGdldEZpZWxkKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaWVsZHMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlLgorCSAqIElmIHRoaXMgaXMgYSBzb3VyY2UgdHlwZSwgdGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIKKwkgKiBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlLCBvdGhlcndpc2UsIHRoZSByZXN1bHRzIGFyZQorCSAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuICBGb3IgYmluYXJ5IHR5cGVzLCB0aGlzIGluY2x1ZGVzIHN5bnRoZXRpYyBmaWVsZHMuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHJldHVybiB0aGUgZmllbGRzIGRlY2xhcmVkIGJ5IHRoaXMgdHlwZQorCSAqLworCUlGaWVsZFtdIGdldEZpZWxkcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLCAKKwkgKiBpbmNsdWRpbmcgcXVhbGlmaWNhdGlvbiBmb3IgYW55IGNvbnRhaW5pbmcgdHlwZXMgYW5kIHBhY2thZ2VzLgorCSAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGZvbGxvd2VkIGJ5IDxjb2RlPicuJzwvY29kZT4sCisJICogZm9sbG93ZWQgYnkgdGhlIHR5cGUtcXVhbGlmaWVkIG5hbWUuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKgorCSAqIEBzZWUgSVR5cGUjZ2V0VHlwZVF1YWxpZmllZE5hbWUoKQorCSAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZQorCSAqLworCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUsIAorCSAqIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgY29udGFpbmluZyB0eXBlcyBhbmQgcGFja2FnZXMuCisJICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgZm9sbG93ZWQgYnkgPGNvZGU+Jy4nPC9jb2RlPiwKKwkgKiBmb2xsb3dlZCBieSB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSB1c2luZyB0aGUgPGNvZGU+ZW5jbG9zaW5nVHlwZVNlcGFyYXRvcjwvY29kZT4uCisJICogCisJICogRm9yIGV4YW1wbGU6CisJICogPHVsPgorCSAqIDxsaT50aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgb2YgYSBjbGFzcyBBIGluIGEgY29tcGlsYXRpb24gdW5pdCBBLmphdmEgCisJICogICAgIGluIGEgcGFja2FnZSB4LnkgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIngueS5BLkIiPC9saT4KKwkgKiA8bGk+dGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIG9mIGEgY2xhc3MgQSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgQS5qYXZhIAorCSAqICAgICBpbiBhIHBhY2thZ2UgeC55IHVzaW5nIHRoZSAnJCcgc2VwYXJhdG9yIGlzICJ4LnkuQSRCIjwvbGk+CisJICogPGxpPnRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGJpbmFyeSB0eXBlIHdob3NlIGNsYXNzIGZpbGUgaXMgeC95L0EkQi5jbGFzcworCSAqICAgICB1c2luZyB0aGUgJy4nIHNlcGFyYXRvciBpcyAieC55LkEuQiI8L2xpPgorCSAqIDxsaT50aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBiaW5hcnkgdHlwZSB3aG9zZSBjbGFzcyBmaWxlIGlzIHgveS9BJEIuY2xhc3MKKwkgKiAgICAgdXNpbmcgdGhlICckJyBzZXBhcmF0b3IgaXMgIngueS5BJEIiPC9saT4KKwkgKiA8bGk+dGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGFub255bW91cyBiaW5hcnkgdHlwZSB3aG9zZSBjbGFzcyBmaWxlIGlzIHgveS9BJDEuY2xhc3MKKwkgKiAgICAgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIngueS5BJDEiPC9saT4KKwkgKiA8L3VsPgorCSAqIAorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICoKKwkgKiBAcGFyYW0gZW5jbG9zaW5nVHlwZVNlcGFyYXRvciB0aGUgZ2l2ZW4gZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCisJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLCBpbmNsdWRpbmcgcXVhbGlmaWNhdGlvbiBmb3IgYW55IGNvbnRhaW5pbmcgdHlwZXMgYW5kIHBhY2thZ2VzCisJICogQHNlZSBJVHlwZSNnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyKQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvCisJICogdGhlIG9yZGVyIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIHNvdXJjZS4KKwkgKiBOdW1iZXJpbmcgc3RhcnRzIGF0IDEgKGkuZS4gdGhlIGZpcnN0IG9jY3VycmVuY2UgaXMgb2NjdXJyZW5jZSAxLCBub3Qgb2NjdXJyZW5jZSAwKS4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLiAgVGhlIGluaXRpYWxpemVyIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQuCisJICogCisJICogQHBhcmFtIG9jY3VycmVuY2VDb3VudCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisJICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBzb3VyY2UKKwkgKi8KKwlJSW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXIoaW50IG9jY3VycmVuY2VDb3VudCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXJzIGRlY2xhcmVkIGJ5IHRoaXMgdHlwZS4KKwkgKiBGb3IgYmluYXJ5IHR5cGVzIHRoaXMgaXMgYW4gZW1wdHkgY29sbGVjdGlvbi4KKwkgKiBJZiB0aGlzIGlzIGEgc291cmNlIHR5cGUsIHRoZSByZXN1bHRzIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyCisJICogaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXplcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlCisJICovCisJSUluaXRpYWxpemVyW10gZ2V0SW5pdGlhbGl6ZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlciB0eXBlcworCSAqIGluIHRoaXMgdHlwZSAoZm9yIGV4YW1wbGUsIDxjb2RlPiJmb28iLCB7IkkiLCAiUVN0cmluZzsifTwvY29kZT4pLiBUbyBnZXQgdGhlCisJICogaGFuZGxlIGZvciBhIGNvbnN0cnVjdG9yLCB0aGUgbmFtZSBzcGVjaWZpZWQgbXVzdCBiZSB0aGUgc2ltcGxlCisJICogbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHR5cGUuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gIFRoZSBtZXRob2QgbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudC4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgZ2l2ZW4gbmFtZQorCSAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHR5cGVzCisJICogQHJldHVybiB0aGUgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIgdHlwZXMgaW4gdGhpcyB0eXBlCisJICovCisJSU1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlLgorCSAqIEZvciBiaW5hcnkgdHlwZXMsIHRoaXMgbWF5IGluY2x1ZGUgdGhlIHNwZWNpYWwgPGNvZGU+Jmx0O2NsaW5pdCZndDwvY29kZT47IG1ldGhvZCAKKwkgKiBhbmQgc3ludGhldGljIG1ldGhvZHMuCisJICogSWYgdGhpcyBpcyBhIHNvdXJjZSB0eXBlLCB0aGUgcmVzdWx0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlcgorCSAqIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UsIG90aGVyd2lzZSwgdGhlIHJlc3VsdHMgYXJlCisJICogaW4gbm8gcGFydGljdWxhciBvcmRlci4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRoZSBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlCisJICovCisJSU1ldGhvZFtdIGdldE1ldGhvZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaW4gd2hpY2ggdGhpcyBlbGVtZW50IGlzIGRlZmluZWQuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50IGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBkZWZpbmVkCisJICovCisJSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogZm9yIHNvdXJjZSB0eXBlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGEgc3VwZXJjbGFzcy4KKwkgKiBGb3IgaW50ZXJmYWNlcywgdGhlIHN1cGVyY2xhc3MgbmFtZSBpcyBhbHdheXMgPGNvZGU+ImphdmEubGFuZy5PYmplY3QiPC9jb2RlPi4KKwkgKiBGb3Igc291cmNlIHR5cGVzLCB0aGUgbmFtZSBhcyBkZWNsYXJlZCBpcyByZXR1cm5lZCwgZm9yIGJpbmFyeSB0eXBlcywKKwkgKiB0aGUgcmVzb2x2ZWQsIHF1YWxpZmllZCBuYW1lIGlzIHJldHVybmVkLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlJ3Mgc3VwZXJjbGFzcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHNvdXJjZSB0eXBlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGEgc3VwZXJjbGFzcworCSAqLworCVN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsCisJICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgc291cmNlLgorCSAqIEZvciBjbGFzc2VzLCB0aGlzIGdpdmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLgorCSAqIEZvciBpbnRlcmZhY2VzLCB0aGlzIGdpdmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZXh0ZW5kcy4KKwkgKiBBbiBlbXB0eSBjb2xsZWN0aW9uIGlzIHJldHVybmVkIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCBpbXBsZW1lbnQgb3IKKwkgKiBleHRlbmQgYW55IGludGVyZmFjZXMuIEZvciBzb3VyY2UgdHlwZXMsIHNpbXBsZXMgbmFtZSBhcmUgcmV0dXJuZWQsCisJICogZm9yIGJpbmFyeSB0eXBlcywgcXVhbGlmaWVkIG5hbWVzIGFyZSByZXR1cm5lZC4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuICB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIHNvdXJjZSwgCisJICogYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCisJICovCisJU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbWVtYmVyIHR5cGUgZGVjbGFyZWQgaW4gdGhpcyB0eXBlIHdpdGggdGhlIGdpdmVuIHNpbXBsZSBuYW1lLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuIFRoZSB0eXBlIG1heSBvciBtYXkgbm90IGV4aXN0LgorCSAqIAorCSAqIEBwYXJhbSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKKwkgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdHlwZSBkZWNsYXJlZCBpbiB0aGlzIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUKKwkgKi8KKwlJVHlwZSBnZXRUeXBlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlLXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSwgCisJICogaW5jbHVkaW5nIHF1YWxpZmljYXRpb24gZm9yIGFueSBlbmNsb3NpbmcgdHlwZXMsCisJICogYnV0IG5vdCBpbmNsdWRpbmcgcGFja2FnZSBxdWFsaWZpY2F0aW9uLgorCSAqIEZvciBzb3VyY2UgdHlwZXMsIHRoaXMgY29uc2lzdHMgb2YgdGhlIHNpbXBsZSBuYW1lcyBvZgorCSAqIGFueSBlbmNsb3NpbmcgdHlwZXMsIHNlcGFyYXRlZCBieSA8Y29kZT4iJCI8L2NvZGU+LCBmb2xsb3dlZCBieSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyB0eXBlLgorCSAqIEZvciBiaW5hcnkgdHlwZXMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGZpbGUgd2l0aG91dCB0aGUgIi5jbGFzcyIgc3VmZml4LgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICogCisJICogQHJldHVybiB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUKKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlLXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgdHlwZSwgCisJICogaW5jbHVkaW5nIHF1YWxpZmljYXRpb24gZm9yIGFueSBlbmNsb3NpbmcgdHlwZXMsCisJICogYnV0IG5vdCBpbmNsdWRpbmcgcGFja2FnZSBxdWFsaWZpY2F0aW9uLgorCSAqIFRoaXMgY29uc2lzdHMgb2YgdGhlIHNpbXBsZSBuYW1lcyBvZiBhbnkgZW5jbG9zaW5nIHR5cGVzLCAKKwkgKiBzZXBhcmF0ZWQgYnkgdGhlIDxjb2RlPmVuY2xvc2luZ1R5cGVTZXBhcmF0b3I8L2NvZGU+LCAKKwkgKiBmb2xsb3dlZCBieSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhpcyB0eXBlLgorCSAqIAorCSAqIEZvciBleGFtcGxlOgorCSAqIDx1bD4KKwkgKiA8bGk+dGhlIHR5cGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgb2YgYSBjbGFzcyBBCisJICogICAgIHVzaW5nIHRoZSAnLicgc2VwYXJhdG9yIGlzICJBLkIiPC9saT4KKwkgKiA8bGk+dGhlIHR5cGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBCIGRlZmluZWQgYXMgYSBtZW1iZXIgb2YgYSBjbGFzcyBBCisJICogICAgIHVzaW5nIHRoZSAnJCcgc2VwYXJhdG9yIGlzICJBJEIiPC9saT4KKwkgKiA8bGk+dGhlIHR5cGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBiaW5hcnkgdHlwZSB3aG9zZSBjbGFzcyBmaWxlIGlzIEEkQi5jbGFzcworCSAqICAgICB1c2luZyB0aGUgJy4nIHNlcGFyYXRvciBpcyAiQS5CIjwvbGk+CisJICogPGxpPnRoZSB0eXBlIHF1YWxpZmllZCBuYW1lIG9mIGEgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyBBJEIuY2xhc3MKKwkgKiAgICAgdXNpbmcgdGhlICckJyBzZXBhcmF0b3IgaXMgIkEkQiI8L2xpPgorCSAqIDxsaT50aGUgdHlwZSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBhbm9ueW1vdXMgYmluYXJ5IHR5cGUgd2hvc2UgY2xhc3MgZmlsZSBpcyBBJDEuY2xhc3MKKwkgKiAgICAgdXNpbmcgdGhlICcuJyBzZXBhcmF0b3IgaXMgIkEkMSI8L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yIHRoZSBzcGVjaWZpZWQgZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCisJICogQHJldHVybiB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUKKwkgKiBAc2luY2UgMi4wCisJICovCisJU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgaW1tZWRpYXRlIG1lbWJlciB0eXBlcyBkZWNsYXJlZCBieSB0aGlzIHR5cGUuCisJICogVGhlIHJlc3VsdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBvciBjbGFzcyBmaWxlLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gdGhlIGltbWVkaWF0ZSBtZW1iZXIgdHlwZXMgZGVjbGFyZWQgYnkgdGhpcyB0eXBlCisJICovCisJSVR5cGVbXSBnZXRUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGFub255bW91cyB0eXBlLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgcmVwcmVzZW50cyBhbiBhbm9ueW1vdXMgdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQHNpbmNlIDIuMAorCSAqLworCWJvb2xlYW4gaXNBbm9ueW1vdXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgY2xhc3MuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgY2xhc3MsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGludGVyZmFjZS4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGlzSW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSBsb2NhbCB0eXBlLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgcmVwcmVzZW50cyBhIGxvY2FsIHR5cGUsIGZhbHNlIG90aGVyd2lzZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlib29sZWFuIGlzTG9jYWwoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgbWVtYmVyIHR5cGUuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgbWVtYmVyIHR5cGUsIGZhbHNlIG90aGVyd2lzZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlib29sZWFuIGlzTWVtYmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKKwkgKiB0aGlzIHR5cGUgYW5kIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcy4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgorCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcgdGhpcyB0eXBlIGFuZCBhbGwgb2YgaXRzIHN1cGVydHlwZXMKKwkgKi8KKwlJVHlwZUhpZXJhcmNoeSBuZXdTdXBlcnR5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKKwkgKiB0aGlzIHR5cGUgYW5kIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgY29uc2lkZXJpbmcgdHlwZXMgaW4gdGhlIGdpdmVuIAorCSAqIHdvcmtpbmcgY29waWVzLiBJbiBvdGhlciB3b3JkcywgdGhlIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgd2lsbCB0YWtlIAorCSAqIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGVtcHR5IHdvcmtpbmcgY29weSB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgorCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKgorCSAqIEBwYXJhbSB3b3JraW5nQ29waWVzIHRoZSB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAcmV0dXJuIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nIHRoaXMgdHlwZSBhbmQgYWxsIG9mIGl0cyBzdXBlcnR5cGVzCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlJVHlwZUhpZXJhcmNoeSBuZXdTdXBlcnR5cGVIaWVyYXJjaHkoSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzIGluIHRoZSB3b3Jrc3BhY2UuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAcmV0dXJuIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzIGluIHRoZSB3b3Jrc3BhY2UKKwkgKi8KKwlJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzIGluIHRoZSB3b3Jrc3BhY2UsIAorCSAqIGNvbnNpZGVyaW5nIHR5cGVzIGluIHRoZSBnaXZlbiB3b3JraW5nIGNvcGllcy4gSW4gb3RoZXIgd29yZHMsIHRoZSBsaXN0IG9mIHdvcmtpbmcgCisJICogY29waWVzIHRoYXQgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgd29ya3NwYWNlLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGVtcHR5IHdvcmtpbmcgY29weSB3aWxsIGJlIGFzIGlmIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbgorCSAqIHVuaXQgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKgorCSAqIEBwYXJhbSB3b3JraW5nQ29waWVzIHRoZSB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzCisJICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKwkgKiBAcmV0dXJuIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCisJICogdGhpcyB0eXBlLCBhbGwgb2YgaXRzIHN1cGVydHlwZXMsIGFuZCBhbGwgaXRzIHN1YnR5cGVzIGluIHRoZSB3b3Jrc3BhY2UKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisJICogQHNpbmNlIDIuMAorCSAqLworCUlUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKKwkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgCisJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QuCisJICoKKwkgKiBAcGFyYW0gcHJvamVjdCB0aGUgZ2l2ZW4gcHJvamVjdAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorCSAqIEByZXR1cm4gYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhpcyB0eXBlIGNvbnRhaW5pbmcKKwkgKiB0aGlzIHR5cGUsIGFsbCBvZiBpdHMgc3VwZXJ0eXBlcywgYW5kIGFsbCBpdHMgc3VidHlwZXMgCisJICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdpdmVuIHByb2plY3QKKwkgKi8KKwlJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmVzb2x2ZXMgdGhlIGdpdmVuIHR5cGUgbmFtZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB0eXBlIChkZXBlbmRpbmcgb24gdGhlIHR5cGUgaGllcmFyY2h5IAorCSAqIGFuZCBpdHMgaW1wb3J0cykuIE11bHRpcGxlIGFuc3dlcnMgbWlnaHQgYmUgZm91bmQgaW4gY2FzZSB0aGVyZSBhcmUgYW1iaWd1b3VzIG1hdGNoZXMuCisJICoKKwkgKiBFYWNoIG1hdGNoaW5nIHR5cGUgbmFtZSBpcyBkZWNvbXBvc2VkIGFzIGFuIGFycmF5IG9mIHR3byBzdHJpbmdzLCB0aGUgZmlyc3QgZGVub3RpbmcgdGhlIHBhY2thZ2UKKwkgKiBuYW1lIChkb3Qtc2VwYXJhdGVkKSBhbmQgdGhlIHNlY29uZCBiZWluZyB0aGUgdHlwZSBuYW1lLgorCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGZpbmQgYW55IG1hdGNoaW5nIHR5cGUuCisJICoKKwkgKiBGb3IgZXhhbXBsZSwgcmVzb2x1dGlvbiBvZiA8Y29kZT4iT2JqZWN0IjwvY29kZT4gd291bGQgdHlwaWNhbGx5IHJldHVybgorCSAqIDxjb2RlPnt7ImphdmEubGFuZyIsICJPYmplY3QifX08L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgZ2l2ZW4gdHlwZSBuYW1lCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgY29kZSByZXNvbHZlIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuIAorCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHR5cGUgbmFtZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGZpbmQgYW55IG1hdGNoaW5nIHR5cGUKKwkgKi8KKwlTdHJpbmdbXVtdIHJlc29sdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYWI0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeS5qYXZhCkBAIC0wLDAgKzEsMjc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCisvKioKKyAqIEEgdHlwZSBoaWVyYXJjaHkgcHJvdmlkZXMgbmF2aWdhdGlvbnMgYmV0d2VlbiBhIHR5cGUgYW5kIGl0cyByZXNvbHZlZAorICogc3VwZXJ0eXBlcyBhbmQgc3VidHlwZXMgZm9yIGEgc3BlY2lmaWMgdHlwZSBvciBmb3IgYWxsIHR5cGVzIHdpdGhpbiBhIHJlZ2lvbi4KKyAqIFN1cGVydHlwZXMgbWF5IGV4dGVuZCBvdXRzaWRlIG9mIHRoZSB0eXBlIGhpZXJhcmNoeSdzIHJlZ2lvbiBpbiB3aGljaCBpdCB3YXMKKyAqIGNyZWF0ZWQgc3VjaCB0aGF0IHRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgaXMgYWx3YXlzIGluY2x1ZGVkLiBGb3IgZXhhbXBsZSwgaWYgYSB0eXBlCisgKiBoaWVyYXJjaHkgaXMgY3JlYXRlZCBmb3IgYSA8Y29kZT5qYXZhLmlvLkZpbGU8L2NvZGU+LCBhbmQgdGhlIHJlZ2lvbiB0aGUgaGllcmFyY2h5IHdhcworICogY3JlYXRlZCBpbiBpcyB0aGUgcGFja2FnZSBmcmFnbWVudCA8Y29kZT5qYXZhLmlvPC9jb2RlPiwgdGhlIHN1cGVydHlwZQorICogPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4gd2lsbCBzdGlsbCBiZSBpbmNsdWRlZC4KKyAqIDxwPgorICogQSB0eXBlIGhpZXJhcmNoeSBpcyBzdGF0aWMgYW5kIGNhbiBiZWNvbWUgc3RhbGUuIEFsdGhvdWdoIGNvbnNpc3RlbnQgd2hlbiAKKyAqIGNyZWF0ZWQsIGl0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdHJhY2sgY2hhbmdlcyBpbiB0aGUgbW9kZWwuCisgKiBBcyBjaGFuZ2VzIGluIHRoZSBtb2RlbCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlIHRoZSBoaWVyYXJjaHksIGNoYW5nZSBub3RpZmljYXRpb25zCisgKiBhcmUgc2VudCB0byByZWdpc3RlcmVkIDxjb2RlPklUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyPC9jb2RlPnMuIExpc3RlbmVycyBzaG91bGQKKyAqIHVzZSB0aGUgPGNvZGU+ZXhpc3RzPC9jb2RlPiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBoaWVyYXJjaHkgaGFzIGJlY29tZSBjb21wbGV0ZWx5CisgKiBpbnZhbGlkIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdHlwZSBvciBwcm9qZWN0IHRoZSBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgb24KKyAqIGhhcyBiZWVuIHJlbW92ZWQpLiBUbyByZWZyZXNoIGEgaGllcmFyY2h5LCB1c2UgdGhlIDxjb2RlPnJlZnJlc2g8L2NvZGU+IG1ldGhvZC4gCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSB0eXBlIGhpZXJhcmNoeSBtYXkgY29udGFpbiBjeWNsZXMgZHVlIHRvIG1hbGZvcm1lZCBzdXBlcnR5cGUgZGVjbGFyYXRpb25zLgorICogTW9zdCB0eXBlIGhpZXJhcmNoeSBxdWVyaWVzIGFyZSBvYmxpdmlvdXMgdG8gY3ljbGVzOyB0aGUgPGNvZGU+Z2V0QWxsKiA8L2NvZGU+CisgKiBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBzdWNoIHRoYXQgdGhleSBhcmUgdW5hZmZlY3RlZCBieSBjeWNsZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUeXBlSGllcmFyY2h5IHsKKy8qKgorICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyB0eXBlIGhpZXJhcmNoeS4gTGlzdGVuZXJzIGFyZQorICogbm90aWZpZWQgd2hlbiB0aGlzIHR5cGUgaGllcmFyY2h5IGNoYW5nZXMgYW5kIG5lZWRzIHRvIGJlIHJlZnJlc2hlZC4KKyAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisgKi8KK3ZvaWQgYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcihJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBwYXJ0IG9mIHRoaXMgaGllcmFyY2h5LgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIGlzIHBhcnQgb2YgdGhpcyBoaWVyYXJjaHksIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGNvbnRhaW5zKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHR5cGUgYW5kIHByb2plY3QgdGhpcyBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgb24gZXhpc3QuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgYW5kIHByb2plY3QgdGhpcyBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgb24gZXhpc3QsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sZWFuIGV4aXN0cygpOworLyoqCisgKiBSZXR1cm5zIGFsbCBjbGFzc2VzIGluIHRoaXMgdHlwZSBoaWVyYXJjaHkncyBncmFwaCwgaW4gbm8gcGFydGljdWxhcgorICogb3JkZXIuIEFueSBjbGFzc2VzIGluIHRoZSBjcmVhdGlvbiByZWdpb24gd2hpY2ggd2VyZSBub3QgcmVzb2x2ZWQgdG8KKyAqIGhhdmUgYW55IHN1YnR5cGVzIG9yIHN1cGVydHlwZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgorICogCisgKiBAcmV0dXJuIGFsbCBjbGFzc2VzIGluIHRoaXMgdHlwZSBoaWVyYXJjaHkncyBncmFwaAorICovCitJVHlwZVtdIGdldEFsbENsYXNzZXMoKTsKKy8qKgorICogUmV0dXJucyBhbGwgaW50ZXJmYWNlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgsIGluIG5vIHBhcnRpY3VsYXIKKyAqIG9yZGVyLiBBbnkgaW50ZXJmYWNlcyBpbiB0aGUgY3JlYXRpb24gcmVnaW9uIHdoaWNoIHdlcmUgbm90IHJlc29sdmVkIHRvCisgKiBoYXZlIGFueSBzdWJ0eXBlcyBvciBzdXBlcnR5cGVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4KKyAqIAorICogQHJldHVybiBhbGwgaW50ZXJmYWNlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgKKyAqLworSVR5cGVbXSBnZXRBbGxJbnRlcmZhY2VzKCk7CisvKioKKyAqIFJldHVybnMgYWxsIHJlc29sdmVkIHN1YnR5cGVzIChkaXJlY3QgYW5kIGluZGlyZWN0KSBvZiB0aGUKKyAqIGdpdmVuIHR5cGUsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIGxpbWl0ZWQgdG8gdGhlCisgKiB0eXBlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGguIEFuIGVtcHR5IGFycmF5CisgKiBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgbm8gcmVzb2x2ZWQgc3VidHlwZXMgZm9yIHRoZQorICogZ2l2ZW4gdHlwZS4KKyAqIAorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKKyAqIEByZXR1cm4gYWxsIHJlc29sdmVkIHN1YnR5cGVzIChkaXJlY3QgYW5kIGluZGlyZWN0KSBvZiB0aGUgZ2l2ZW4gdHlwZQorICovCitJVHlwZVtdIGdldEFsbFN1YnR5cGVzKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIGFsbCByZXNvbHZlZCBzdXBlcmNsYXNzZXMgb2YgdGhlCisgKiBnaXZlbiBjbGFzcywgaW4gYm90dG9tLXVwIG9yZGVyLiBBbiBlbXB0eSBhcnJheQorICogaXMgcmV0dXJuZWQgaWYgdGhlcmUgYXJlIG5vIHJlc29sdmVkIHN1cGVyY2xhc3NlcyBmb3IgdGhlCisgKiBnaXZlbiBjbGFzcy4KKyAqCisgKiA8cD5OT1RFOiBvbmNlIGEgdHlwZSBoaWVyYXJjaHkgaGFzIGJlZW4gY3JlYXRlZCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8KKyAqIHF1ZXJ5IHRoZSBoaWVyYXJjaHkgZm9yIHN1cGVyY2xhc3NlcyB0aGFuIHRvIHF1ZXJ5IGEgY2xhc3MgcmVjdXJzaXZlbHkgdXAKKyAqIHRoZSBzdXBlcmNsYXNzIGNoYWluLiBRdWVyeWluZyBhbiBlbGVtZW50IHBlcmZvcm1zIGEgZHluYW1pYyByZXNvbHV0aW9uLAorICogd2hlcmVhcyB0aGUgaGllcmFyY2h5IHJldHVybnMgYSBwcmUtY29tcHV0ZWQgcmVzdWx0LgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiBhbGwgcmVzb2x2ZWQgc3VwZXJjbGFzc2VzIG9mIHRoZSBnaXZlbiBjbGFzcywgaW4gYm90dG9tLXVwIG9yZGVyLCBhbiBlbXB0eQorICogYXJyYXkgaWYgbm9uZS4KKyAqLworSVR5cGVbXSBnZXRBbGxTdXBlcmNsYXNzZXMoSVR5cGUgdHlwZSk7CisvKioKKyAqIFJldHVybnMgYWxsIHJlc29sdmVkIHN1cGVyaW50ZXJmYWNlcyAoZGlyZWN0IGFuZCBpbmRpcmVjdCkgb2YgdGhlIGdpdmVuIHR5cGUuCisgKiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIGNsYXNzLCB0aGlzIGluY2x1ZGVzIGFsbCBzdXBlcmludGVyZmFjZXMgb2YgYWxsIHN1cGVyY2xhc3Nlcy4KKyAqIEFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBubyByZXNvbHZlZCBzdXBlcmludGVyZmFjZXMgZm9yIHRoZQorICogZ2l2ZW4gdHlwZS4KKyAqCisgKiA8cD5OT1RFOiBvbmNlIGEgdHlwZSBoaWVyYXJjaHkgaGFzIGJlZW4gY3JlYXRlZCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8KKyAqIHF1ZXJ5IHRoZSBoaWVyYXJjaHkgZm9yIHN1cGVyaW50ZXJmYWNlcyB0aGFuIHRvIHF1ZXJ5IGEgdHlwZSByZWN1cnNpdmVseS4KKyAqIFF1ZXJ5aW5nIGFuIGVsZW1lbnQgcGVyZm9ybXMgYSBkeW5hbWljIHJlc29sdXRpb24sCisgKiB3aGVyZWFzIHRoZSBoaWVyYXJjaHkgcmV0dXJucyBhIHByZS1jb21wdXRlZCByZXN1bHQuCisgKiAKKyAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCisgKiBAcmV0dXJuIGFsbCByZXNvbHZlZCBzdXBlcmludGVyZmFjZXMgKGRpcmVjdCBhbmQgaW5kaXJlY3QpIG9mIHRoZSBnaXZlbiB0eXBlLCBhbiBlbXB0eSBhcnJheSBpZiBub25lCisgKi8KK0lUeXBlW10gZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIGFsbCByZXNvbHZlZCBzdXBlcnR5cGVzIG9mIHRoZQorICogZ2l2ZW4gY2xhc3MsIGluIGJvdHRvbS11cCBvcmRlci4gQW4gZW1wdHkgYXJyYXkKKyAqIGlzIHJldHVybmVkIGlmIHRoZXJlIGFyZSBubyByZXNvbHZlZCBzdXBlcnR5cGVzIGZvciB0aGUKKyAqIGdpdmVuIGNsYXNzLgorICoKKyAqIDxwPk5PVEU6IG9uY2UgYSB0eXBlIGhpZXJhcmNoeSBoYXMgYmVlbiBjcmVhdGVkLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0bworICogcXVlcnkgdGhlIGhpZXJhcmNoeSBmb3Igc3VwZXJ0eXBlcyB0aGFuIHRvIHF1ZXJ5IGEgdHlwZSByZWN1cnNpdmVseSB1cAorICogdGhlIHN1cGVydHlwZSBjaGFpbi4gUXVlcnlpbmcgYW4gZWxlbWVudCBwZXJmb3JtcyBhIGR5bmFtaWMgcmVzb2x1dGlvbiwKKyAqIHdoZXJlYXMgdGhlIGhpZXJhcmNoeSByZXR1cm5zIGEgcHJlLWNvbXB1dGVkIHJlc3VsdC4KKyAqIAorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUKKyAqIEByZXR1cm4gYWxsIHJlc29sdmVkIHN1cGVydHlwZXMgb2YgdGhlIGdpdmVuIGNsYXNzLCBpbiBib3R0b20tdXAgb3JkZXIsIGFuIGVtcHR5IGFycmF5CisgKiBpZiBub25lCisgKi8KK0lUeXBlW10gZ2V0QWxsU3VwZXJ0eXBlcyhJVHlwZSB0eXBlKTsKKy8qKgorICogUmV0dXJucyBhbGwgdHlwZXMgaW4gdGhpcyB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLCBpbiBubyBwYXJ0aWN1bGFyCisgKiBvcmRlci4gQW55IHR5cGVzIGluIHRoZSBjcmVhdGlvbiByZWdpb24gd2hpY2ggd2VyZSBub3QgcmVzb2x2ZWQgdG8KKyAqIGhhdmUgYW55IHN1YnR5cGVzIG9yIHN1cGVydHlwZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgorICogCisgKiBAcmV0dXJuIGFsbCB0eXBlcyBpbiB0aGlzIHR5cGUgaGllcmFyY2h5J3MgZ3JhcAorICovCitJVHlwZVtdIGdldEFsbFR5cGVzKCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlICh3b3VsZCBiZSBlcXVpdmFsZW50IHRvIDxjb2RlPklNZW1iZXIuZ2V0RmxhZ3MoKTwvY29kZT4pLAorICogb3IgPGNvZGU+LTE8L2NvZGU+IGlmIHRoaXMgaW5mb3JtYXRpb24gd2Fzbid0IGNhY2hlZCBvbiB0aGUgaGllcmFyY2h5IGR1cmluZyBpdHMgY29tcHV0YXRpb24uCisgKiAKKyAqIEByZXR1cm4gdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIG1lbWJlcgorICogQHNlZSBGbGFncworICogQHNpbmNlIDIuMAorICovCitpbnQgZ2V0Q2FjaGVkRmxhZ3MoSVR5cGUgdHlwZSk7CisKKy8qKgorICogUmV0dXJucyBhbGwgaW50ZXJmYWNlcyByZXNvbHZlZCB0byBleHRlbmQgdGhlIGdpdmVuIGludGVyZmFjZSwKKyAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIGxpbWl0ZWQgdG8gdGhlIGludGVyZmFjZXMgaW4gdGhpcworICogaGllcmFyY2h5J3MgZ3JhcGguCisgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgdGhlIGdpdmVuIHR5cGUgaXMgYSBjbGFzcywgb3IKKyAqIGlmIG5vIGludGVyZmFjZXMgd2VyZSByZXNvbHZlZCB0byBleHRlbmQgdGhlIGdpdmVuIGludGVyZmFjZS4KKyAqIAorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUgCisgKiBAcmV0dXJuIGFsbCBpbnRlcmZhY2VzIHJlc29sdmVkIHRvIGV4dGVuZCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGxpbWl0ZWQgdG8gdGhlIGludGVyZmFjZXMgaW4gdGhpcworICogaGllcmFyY2h5J3MgZ3JhcGgsIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUuCisgKi8KK0lUeXBlW10gZ2V0RXh0ZW5kaW5nSW50ZXJmYWNlcyhJVHlwZSB0eXBlKTsKKy8qKgorICogUmV0dXJucyBhbGwgY2xhc3NlcyByZXNvbHZlZCB0byBpbXBsZW1lbnQgdGhlIGdpdmVuIGludGVyZmFjZSwKKyAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIGxpbWl0ZWQgdG8gdGhlIGNsYXNzZXMgaW4gdGhpcyB0eXBlCisgKiBoaWVyYXJjaHkncyAgZ3JhcGguIFJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhCisgKiBjbGFzcywgb3IgaWYgbm8gY2xhc3NlcyB3ZXJlIHJlc29sdmVkIHRvIGltcGxlbWVudCB0aGUgZ2l2ZW4KKyAqIGludGVyZmFjZS4KKyAqIAorICogQHBhcmFtIHR5cGUgdGhlIGdpdmVuIHR5cGUgCisgKiBAcmV0dXJuIGFsbCBjbGFzc2VzIHJlc29sdmVkIHRvIGltcGxlbWVudCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGxpbWl0ZWQgdG8gdGhlIGNsYXNzZXMgaW4gdGhpcyB0eXBlCisgKiBoaWVyYXJjaHkncyAgZ3JhcGgsIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKyAqLworSVR5cGVbXSBnZXRJbXBsZW1lbnRpbmdDbGFzc2VzKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIGFsbCBjbGFzc2VzIGluIHRoZSBncmFwaCB3aGljaCBoYXZlIG5vIHJlc29sdmVkIHN1cGVyY2xhc3MsCisgKiBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICogCisgKiBAcmV0dXJuIGFsbCBjbGFzc2VzIGluIHRoZSBncmFwaCB3aGljaCBoYXZlIG5vIHJlc29sdmVkIHN1cGVyY2xhc3MKKyAqLworSVR5cGVbXSBnZXRSb290Q2xhc3NlcygpOworLyoqCisgKiBSZXR1cm5zIGFsbCBpbnRlcmZhY2VzIGluIHRoZSBncmFwaCB3aGljaCBoYXZlIG5vIHJlc29sdmVkIHN1cGVyaW50ZXJmYWNlcywKKyAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisgKiAKKyAqIEByZXR1cm4gYWxsIGludGVyZmFjZXMgaW4gdGhlIGdyYXBoIHdoaWNoIGhhdmUgbm8gcmVzb2x2ZWQgc3VwZXJpbnRlcmZhY2VzCisgKi8KK0lUeXBlW10gZ2V0Um9vdEludGVyZmFjZXMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgZGlyZWN0IHJlc29sdmVkIHN1YmNsYXNzZXMgb2YgdGhlIGdpdmVuIGNsYXNzLAorICogaW4gbm8gcGFydGljdWxhciBvcmRlciwgbGltaXRlZCB0byB0aGUgY2xhc3NlcyBpbiB0aGlzCisgKiB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLgorICogUmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoZSBnaXZlbiB0eXBlIGlzIGFuIGludGVyZmFjZSwKKyAqIG9yIGlmIG5vIGNsYXNzZXMgd2VyZSByZXNvbHZlZCB0byBiZSBzdWJjbGFzc2VzIG9mIHRoZSBnaXZlbgorICogY2xhc3MuCisgKiAKKyAqIEBwYXJhbSB0eXBlIHRoZSBnaXZlbiB0eXBlCisgKiBAcmV0dXJuIHRoZSBkaXJlY3QgcmVzb2x2ZWQgc3ViY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gY2xhc3MgbGltaXRlZCB0byB0aGUgY2xhc3NlcyBpbiB0aGlzCisgKiB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoLCBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUuCisgKi8KK0lUeXBlW10gZ2V0U3ViY2xhc3NlcyhJVHlwZSB0eXBlKTsKKy8qKgorICogUmV0dXJucyB0aGUgZGlyZWN0IHJlc29sdmVkIHN1YnR5cGVzIG9mIHRoZSBnaXZlbiB0eXBlLAorICogaW4gbm8gcGFydGljdWxhciBvcmRlciwgbGltaXRlZCB0byB0aGUgdHlwZXMgaW4gdGhpcworICogdHlwZSBoaWVyYXJjaHkncyBncmFwaC4KKyAqIElmIHRoZSB0eXBlIGlzIGEgY2xhc3MsIHRoaXMgcmV0dXJucyB0aGUgcmVzb2x2ZWQgc3ViY2xhc3Nlcy4KKyAqIElmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZSwgdGhpcyByZXR1cm5zIGJvdGggdGhlIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IAorICogdGhlIGludGVyZmFjZSBhbmQgdGhlIGludGVyZmFjZXMgd2hpY2ggZXh0ZW5kIGl0LgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiB0aGUgZGlyZWN0IHJlc29sdmVkIHN1YnR5cGVzIG9mIHRoZSBnaXZlbiB0eXBlIGxpbWl0ZWQgdG8gdGhlIHR5cGVzIGluIHRoaXMKKyAqIHR5cGUgaGllcmFyY2h5J3MgZ3JhcGgKKyAqLworSVR5cGVbXSBnZXRTdWJ0eXBlcyhJVHlwZSB0eXBlKTsKKy8qKgorICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgc3VwZXJjbGFzcyBvZiB0aGUgZ2l2ZW4gY2xhc3MsIAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGNsYXNzIGhhcyBubyBzdXBlcmNsYXNzLAorICogdGhlIHN1cGVyY2xhc3MgY291bGQgbm90IGJlIHJlc29sdmVkLCBvciBpZiB0aGUgZ2l2ZW4KKyAqIHR5cGUgaXMgYW4gaW50ZXJmYWNlLgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiB0aGUgcmVzb2x2ZWQgc3VwZXJjbGFzcyBvZiB0aGUgZ2l2ZW4gY2xhc3MsIAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGNsYXNzIGhhcyBubyBzdXBlcmNsYXNzLAorICogdGhlIHN1cGVyY2xhc3MgY291bGQgbm90IGJlIHJlc29sdmVkLCBvciBpZiB0aGUgZ2l2ZW4KKyAqIHR5cGUgaXMgYW4gaW50ZXJmYWNlCisgKi8KK0lUeXBlIGdldFN1cGVyY2xhc3MoSVR5cGUgdHlwZSk7CisvKioKKyAqIFJldHVybnMgdGhlIGRpcmVjdCByZXNvbHZlZCBpbnRlcmZhY2VzIHRoYXQgdGhlIGdpdmVuIHR5cGUgaW1wbGVtZW50cyBvciBleHRlbmRzLAorICogaW4gbm8gcGFydGljdWxhciBvcmRlciwgbGltaXRlZCB0byB0aGUgaW50ZXJmYWNlcyBpbiB0aGlzIHR5cGUKKyAqIGhpZXJhcmNoeSdzIGdyYXBoLgorICogRm9yIGNsYXNzZXMsIHRoaXMgZ2l2ZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGUgY2xhc3MgaW1wbGVtZW50cy4KKyAqIEZvciBpbnRlcmZhY2VzLCB0aGlzIGdpdmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhlIGludGVyZmFjZSBleHRlbmRzLgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiB0aGUgZGlyZWN0IHJlc29sdmVkIGludGVyZmFjZXMgdGhhdCB0aGUgZ2l2ZW4gdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMgbGltaXRlZCB0byB0aGUgaW50ZXJmYWNlcyBpbiB0aGlzIHR5cGUKKyAqIGhpZXJhcmNoeSdzIGdyYXBoCisgKi8KK0lUeXBlW10gZ2V0U3VwZXJJbnRlcmZhY2VzKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIG9mIHRoZSBnaXZlbiB0eXBlLAorICogaW4gbm8gcGFydGljdWxhciBvcmRlciwgbGltaXRlZCB0byB0aGUgdHlwZXMgaW4gdGhpcworICogdHlwZSBoaWVyYXJjaHkncyBncmFwaC4KKyAqIEZvciBjbGFzc2VzLCB0aGlzIHJldHVybnMgaXRzIHN1cGVyY2xhc3MgYW5kIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhlIGNsYXNzIGltcGxlbWVudHMuCisgKiBGb3IgaW50ZXJmYWNlcywgdGhpcyByZXR1cm5zIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhlIGludGVyZmFjZSBleHRlbmRzLgorICogCisgKiBAcGFyYW0gdHlwZSB0aGUgZ2l2ZW4gdHlwZQorICogQHJldHVybiB0aGUgcmVzb2x2ZWQgc3VwZXJ0eXBlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBsaW1pdGVkIHRvIHRoZSB0eXBlcyBpbiB0aGlzCisgKiB0eXBlIGhpZXJhcmNoeSdzIGdyYXBoCisgKi8KK0lUeXBlW10gZ2V0U3VwZXJ0eXBlcyhJVHlwZSB0eXBlKTsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSB0aGlzIGhpZXJhcmNoeSB3YXMgY29tcHV0ZWQgZm9yLgorICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGhpZXJhcmNoeSB3YXMgY29tcHV0ZWQgZm9yIGEgcmVnaW9uLgorICogCisgKiBAcmV0dXJuIHRoZSB0eXBlIHRoaXMgaGllcmFyY2h5IHdhcyBjb21wdXRlZCBmb3IKKyAqLworSVR5cGUgZ2V0VHlwZSgpOworLyoqCisgKiBSZS1jb21wdXRlcyB0aGUgdHlwZSBoaWVyYXJjaHkgcmVwb3J0aW5nIHByb2dyZXNzLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHVuYWJsZSB0byByZWZyZXNoIHRoZSBoaWVyYXJjaHkKKyAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisgKi8KK3ZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJlbW92ZXMgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhpcyB0eXBlIGhpZXJhcmNoeS4KKyAqIEhhcyBubyBhZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKKyAqLwordm9pZCByZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjQ5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworCisvKioKKyAqIEEgbGlzdGVuZXIgd2hpY2ggZ2V0cyBub3RpZmllZCB3aGVuIGEgcGFydGljdWxhciB0eXBlIGhpZXJhcmNoeSBvYmplY3QKKyAqIGNoYW5nZXMuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyIHsKKwkvKioKKwkgKiBOb3RpZmllcyB0aGF0IHRoZSBnaXZlbiB0eXBlIGhpZXJhcmNoeSBoYXMgY2hhbmdlZCBpbiBzb21lIHdheSBhbmQgc2hvdWxkCisJICogYmUgcmVmcmVzaGVkIGF0IHNvbWUgcG9pbnQgdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YKKwkgKiB0aGUgSmF2YSBtb2RlbC4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZUhpZXJhcmNoeSB0aGUgZ2l2ZW4gdHlwZSBoaWVyYXJjaHkKKwkgKi8KKwl2b2lkIHR5cGVIaWVyYXJjaHlDaGFuZ2VkKElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVdvcmtpbmdDb3B5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JV29ya2luZ0NvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMxYWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVdvcmtpbmdDb3B5LmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJCisgKiAgICBJQk0gQ29ycG9yYXRpb24sIDIwMDIvMDMvMDEtIGFkZGVkIG5vdGlvbiBvZiBzaGFyZWQgd29ya2luZyBjb3B5CisgKiAgICBJQk0gQ29ycG9yYXRpb24sIDIwMDIvMjYvMDEtIGFkZGVkIG5vdGlvbiBvZiBJUHJvYmxlbVJlcXVlc3RvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgZm9yIEphdmEgZWxlbWVudHMgdGhhdCBzdXBwb3J0IHdvcmtpbmcgY29waWVzLgorICogPHA+CisgKiBBIHdvcmtpbmcgY29weSBvZiBhIEphdmEgZWxlbWVudCBhY3RzIGp1c3QgbGlrZSBhIHJlZ3VsYXIgZWxlbWVudCAoaGFuZGxlKSwKKyAqIGV4Y2VwdCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYW4gdW5kZXJseWluZyByZXNvdXJjZS4gQSB3b3JraW5nIGNvcHkgaXMgbm90CisgKiB2aXNpYmxlIHRvIHRoZSByZXN0IG9mIHRoZSBKYXZhIG1vZGVsLiBDaGFuZ2VzIGluIGEgd29ya2luZyBjb3B5J3MKKyAqIGJ1ZmZlciBhcmUgbm90IHJlYWxpemVkIGluIGEgcmVzb3VyY2UuIFRvIGJyaW5nIHRoZSBKYXZhIG1vZGVsIHVwLXRvLWRhdGUgd2l0aCBhIHdvcmtpbmcKKyAqIGNvcHkncyBjb250ZW50cywgYW4gZXhwbGljaXQgY29tbWl0IG11c3QgYmUgcGVyZm9ybWVkIG9uIHRoZSB3b3JraW5nIGNvcHkuIAorICogT3RoZXIgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gYSB3b3JraW5nIGNvcHkgdXBkYXRlIHRoZQorICogY29udGVudHMgb2YgdGhlIHdvcmtpbmcgY29weSdzIGJ1ZmZlciBidXQgZG8gbm90IGNvbW1pdCB0aGUgY29udGVudHMKKyAqIG9mIHRoZSB3b3JraW5nIGNvcHkuCisgKiA8L3A+CisgKiA8cD4KKyAqIE5vdGU6IFRoZSBjb250ZW50cyBvZiBhIHdvcmtpbmcgY29weSBpcyBkZXRlcm1pbmVkIHdoZW4gYSB3b3JraW5nCisgKiBjb3B5IGlzIGNyZWF0ZWQsIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgdGhlIHdvcmtpbmcKKyAqIGNvcHkgaXMgY3JlYXRlZCBmcm9tLiBJZiBhIHdvcmtpbmcgY29weSBpcyBhbiA8Y29kZT5JT3BlbmFibGU8L2NvZGU+IGFuZCBpcyBleHBsaWNpdGx5CisgKiBjbG9zZWQsIHRoZSB3b3JraW5nIGNvcHkncyBidWZmZXIgd2lsbCBiZSB0aHJvd24gYXdheS4gSG93ZXZlciwgY2xpZW50cyBzaG91bGQgbm90CisgKiBleHBsaWNpdGx5IG9wZW4gYW5kIGNsb3NlIHdvcmtpbmcgY29waWVzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgY2xpZW50IHRoYXQgY3JlYXRlcyBhIHdvcmtpbmcgY29weSBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGRlc3Ryb3lpbmcgdGhlIHdvcmtpbmcgY29weS4gVGhlIEphdmEgbW9kZWwgd2lsbCBuZXZlciBhdXRvbWF0aWNhbGx5CisgKiBkZXN0cm95IG9yIGNsb3NlIGEgd29ya2luZyBjb3B5LiAoTm90ZSB0aGF0IGRlc3Ryb3lpbmcgYSB3b3JraW5nIGNvcHkKKyAqIGRvZXMgbm90IGNvbW1pdCBpdCB0byB0aGUgbW9kZWwsIGl0IG9ubHkgZnJlZXMgdXAgdGhlIG1lbW9yeSBvY2N1cGllZCBieQorICogdGhlIGVsZW1lbnQpLiBBZnRlciBhIHdvcmtpbmcgY29weSBpcyBkZXN0cm95ZWQsIHRoZSB3b3JraW5nIGNvcHkgY2Fubm90CisgKiBiZSBhY2Nlc3NlZCBhZ2Fpbi4gTm9uLWhhbmRsZSBtZXRob2RzIHdpbGwgdGhyb3cgYSAKKyAqIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGluZyB0aGUgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorICogPC9wPgorICogPHA+CisgKiBBIHdvcmtpbmcgY29weSBjYW5ub3QgYmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgd29ya2luZyBjb3B5LgorICogQ2FsbGluZyA8Y29kZT5nZXRXb3JraW5nQ29weTwvY29kZT4gb24gYSB3b3JraW5nIGNvcHkgcmV0dXJucyB0aGUgcmVjZWl2ZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElXb3JraW5nQ29weSB7CisJCisJLyoqCisJICogQ29tbWl0cyB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkgdG8gaXRzIG9yaWdpbmFsIGVsZW1lbnQKKwkgKiBhbmQgdW5kZXJseWluZyByZXNvdXJjZSwgYnJpbmdpbmcgdGhlIEphdmEgbW9kZWwgdXAtdG8tZGF0ZSB3aXRoCisJICogdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHdvcmtpbmcgY29weS4KKwkgKgorCSAqIDxwPkl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKKwkgKiBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCwgaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBhbiB1cGRhdGUgY29uZmxpY3QuCisJICogVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5mb3JjZTwvY29kZT4gcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKwkgKiBzdWNoIGEgY29uZmxpY3Q6PHVsPgorCSAqIDxsaT4gPGNvZGU+dHJ1ZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IGFyZSBhcHBsaWVkIHRvCisJICogCXRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGV2ZW4gdGhvdWdoIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGJlZm9yZQorCSAqCWEgc3Vic2VxdWVudCBjaGFuZ2UgaW4gdGhlIHJlc291cmNlPC9saT4KKwkgKiA8bGk+IDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIGZvcmNlIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKKwkgKiBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZAorCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyB3b3JraW5nIGNvcHkgY291bGQgbm90IGNvbW1pdC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoZSBvcmlnaW5hbCBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQorCSAqIDxsaT4gVGhpcyBlbGVtZW50IGlzIG5vdCBhIHdvcmtpbmcgY29weSAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQorCSAqIDxsaT4gQSB1cGRhdGUgY29uZmxpY3QgKGRlc2NyaWJlZCBhYm92ZSkgKFVQREFURV9DT05GTElDVCkKKwkgKiA8L3VsPgorCSAqLworCXZvaWQgY29tbWl0KGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkKKwkvKioKKwkgKiBEZXN0cm95cyB0aGlzIHdvcmtpbmcgY29weSwgY2xvc2luZyBpdHMgYnVmZmVyIGFuZCBkaXNjYXJkaW5nCisJICogaXRzIHN0cnVjdHVyZS4gU3Vic2VxdWVudCBhdHRlbXB0cyB0byBhY2Nlc3Mgbm9uLWhhbmRsZSBpbmZvcm1hdGlvbgorCSAqIGZvciB0aGlzIHdvcmtpbmcgY29weSB3aWxsIHJlc3VsdCBpbiA8Y29kZT5JSmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPnMuIEhhcworCSAqIG5vIGVmZmVjdCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90IGEgd29ya2luZyBjb3B5LgorCSAqIDxwPgorCSAqIElmIHRoaXMgd29ya2luZyBjb3B5IGlzIHNoYXJlZCwgaXQgaXMgZGVzdHJveWVkIG9ubHkgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvCisJICogPGNvZGU+ZGVzdHJveSgpPC9jb2RlPiBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIDxjb2RlPgorCSAqIGdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5KTwvY29kZT4uIAorCSAqIEEgUkVNT1ZFRCBJSmF2YUVsZW1lbnREZWx0YSBpcyB0aGVuIHJlcG9ydGVkIG9uIHRoaXMgd29ya2luZyBjb3B5LgorCSAqLworCXZvaWQgZGVzdHJveSgpOworCQorCS8qKgorCSAqIEZpbmRzIHRoZSBzaGFyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzIGVsZW1lbnQsIGdpdmVuIGEgPGNvZGU+SUJ1ZmZlcjwvY29kZT4gZmFjdG9yeS4gCisJICogSWYgbm8gd29ya2luZyBjb3B5IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIGJ1ZmZlciBmYWN0b3J5LCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIDxwPgorCSAqIFVzZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgbm90IGRlc3Ryb3kgdGhlIHJlc3VsdGluZyB3b3JraW5nIGNvcHkuIAorCSAqIAorCSAqIEBwYXJhbSBidWZmZXJGYWN0b3J5IHRoZSBnaXZlbiA8Y29kZT5JQnVmZmVyPC9jb2RlPiBmYWN0b3J5CisJICogQHJldHVybiB0aGUgZm91bmQgc2hhcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBlbGVtZW50LCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHNlZSBJQnVmZmVyRmFjdG9yeQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlJSmF2YUVsZW1lbnQgZmluZFNoYXJlZFdvcmtpbmdDb3B5KElCdWZmZXJGYWN0b3J5IGJ1ZmZlckZhY3RvcnkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgb3JpZ2luYWwgZWxlbWVudCB0aGUgc3BlY2lmaWVkIHdvcmtpbmcgY29weSBlbGVtZW50IHdhcyBjcmVhdGVkIGZyb20sCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkgZWxlbWVudC4gIFRoaXMgaXMgYSBoYW5kbGUKKwkgKiBvbmx5IG1ldGhvZCwgdGhlIHJldHVybmVkIGVsZW1lbnQgbWF5IG9yIG1heSBub3QgZXhpc3QuCisJICogCisJICogQHJldHVybiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0aGUgc3BlY2lmaWVkIHdvcmtpbmcgY29weSBlbGVtZW50IHdhcyBjcmVhdGVkIGZyb20sCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkgZWxlbWVudAorCSAqLworCUlKYXZhRWxlbWVudCBnZXRPcmlnaW5hbChJSmF2YUVsZW1lbnQgd29ya2luZ0NvcHlFbGVtZW50KTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGZyb20sCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkuCisJICogCisJICogQHJldHVybiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCBmcm9tLAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMgbm90IGEgd29ya2luZyBjb3B5CisJICovCisJSUphdmFFbGVtZW50IGdldE9yaWdpbmFsRWxlbWVudCgpOworCQorCS8qKiAKKwkgKiBGaW5kcyB0aGUgZWxlbWVudHMgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0IHRoYXQgY29ycmVzcG9uZCB0bworCSAqIHRoZSBnaXZlbiBlbGVtZW50LgorCSAqIEFuIGVsZW1lbnQgQSBjb3JyZXNwb25kcyB0byBhbiBlbGVtZW50IEIgaWY6CisJICogPHVsPgorCSAqIDxsaT5BIGhhcyB0aGUgc2FtZSBlbGVtZW50IG5hbWUgYXMgQi4KKwkgKiA8bGk+SWYgQSBpcyBhIG1ldGhvZCwgQSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcworCSAqICAgICBCIGFuZCB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBhcmd1bWVudCB0eXBlcyBtdXN0IGJlIGVxdWFscy4KKwkgKiA8bGk+VGhlIHBhcmVudCBvZiBBIGNvcnJlc3BvbmRzIHRvIHRoZSBwYXJlbnQgb2YgQiByZWN1cnNpdmVseSB1cCB0bworCSAqICAgICB0aGVpciByZXNwZWN0aXZlIGNvbXBpbGF0aW9uIHVuaXRzLgorCSAqIDxsaT5BIGV4aXN0cy4KKwkgKiA8L3VsPgorCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBqYXZhIGVsZW1lbnRzIGNhbiBiZSBmb3VuZAorCSAqIG9yIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCisJICogCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKKwkgKiBAcmV0dXJuIHRoZSBmb3VuZCBlbGVtZW50cyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBlbGVtZW50CisJICogQHNpbmNlIDIuMCAKKwkgKi8KKwlJSmF2YUVsZW1lbnRbXSBmaW5kRWxlbWVudHMoSUphdmFFbGVtZW50IGVsZW1lbnQpOworCQorCS8qKgorCSAqIEZpbmRzIHRoZSBwcmltYXJ5IHR5cGUgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0IChpLmUuJm5ic3A7dGhlIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQorCSAqIGNvbXBpbGF0aW9uIHVuaXQpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGEgdHlwZSBleGlzdHMuCisJICogCisJICogQHJldHVybiB0aGUgZm91bmQgcHJpbWFyeSB0eXBlIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhIHR5cGUgZXhpc3RzCisJICogQHNpbmNlIDIuMAorCSAqLworCUlUeXBlIGZpbmRQcmltYXJ5VHlwZSgpOworCQorCS8qKgorCSAqIFJldHVybnMgYSBzaGFyZWQgd29ya2luZyBjb3B5IG9uIHRoaXMgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSB0byBjcmVhdGUKKwkgKiB0aGUgYnVmZmVyLCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkuCisJICogVGhpcyBBUEkgY2FuIG9ubHkgYW5zd2VyIGFuIGFscmVhZHkgZXhpc3Rpbmcgd29ya2luZyBjb3B5IGlmIGl0IGlzIGJhc2VkIG9uIHRoZSBzYW1lCisJICogb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBBTkQgd2FzIHVzaW5nIHRoZSBzYW1lIGJ1ZmZlciBmYWN0b3J5IChpLmUuIGFzIGRlZmluZWQgYnkgPGNvZGU+T2JqZWN0I2VxdWFsczwvY29kZT4pLgkgCisJICogPHA+CisJICogVGhlIGxpZmUgdGltZSBvZiBhIHNoYXJlZCB3b3JraW5nIGNvcHkgaXMgYXMgZm9sbG93czoKKwkgKiA8dWw+CisJICogPGxpPlRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPmdldFNoYXJlZFdvcmtpbmdDb3B5KC4uLik8L2NvZGU+IGNyZWF0ZXMgYSBuZXcgd29ya2luZyBjb3B5IGZvciB0aGlzCisJICogICAgIGVsZW1lbnQ8L2xpPgorCSAqIDxsaT5TdWJzZXF1ZW50IGNhbGxzIGluY3JlbWVudCBhbiBpbnRlcm5hbCBjb3VudGVyLjwvbGk+CisJICogPGxpPkEgY2FsbCB0byA8Y29kZT5kZXN0cm95KCk8L2NvZGU+IGRlY3JlbWVudHMgdGhlIGludGVybmFsIGNvdW50ZXIuPC9saT4KKwkgKiA8bGk+V2hlbiB0aGlzIGNvdW50ZXIgaXMgMCwgdGhlIHdvcmtpbmcgY29weSBpcyBkZXN0cm95ZWQuCisJICogPC91bD4KKwkgKiBTbyB1c2VycyBvZiB0aGlzIG1ldGhvZCBtdXN0IGRlc3Ryb3kgZXhhY3RseSBvbmNlIHRoZSB3b3JraW5nIGNvcHkuCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBidWZmZXIgZmFjdG9yeSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBsaWZlIHRpbWUgb2YgdGhpcyB3b3JraW5nIGNvcHksIGkuZS4gaWYgdGhlIAorCSAqIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW5lZCwgdGhpcyBmYWN0b3J5IHdpbGwgYmUgdXNlZC4KKwkgKiBUaGUgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHRoZSBvcmlnaW5hbCdzIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudAorCSAqIHVwb24gY3JlYXRpb24uCisJICogPHA+CisJICogV2hlbiB0aGUgc2hhcmVkIHdvcmtpbmcgY29weSBpbnN0YW5jZSBpcyBjcmVhdGVkLCBhbiBBRERFRCBJSmF2YUVsZW1lbnREZWx0YSBpcyByZXBvcnRlZCBvbiB0aGlzCisJICogd29ya2luZyBjb3B5LgorCSAqCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIHdoaWxlIG9wZW5pbmcgdGhpcyBjb21waWxhdGlvbiB1bml0CisJICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCAKKwkgKiBAcGFyYW0gZmFjdG9yeSB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBidWZmZXIgdGhhdCBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudCBvZiB0aGUgd29ya2luZyBjb3B5CisJICogICAgICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnRlcm5hbCBmYWN0b3J5IHNob3VsZCBiZSB1c2VkCisJICogQHBhcmFtIHByb2JsZW1SZXF1ZXN0b3IgYSByZXF1ZXN0b3Igd2hpY2ggd2lsbCBnZXQgbm90aWZpZWQgb2YgcHJvYmxlbXMgZGV0ZWN0ZWQgZHVyaW5nCisJICogCXJlY29uY2lsaW5nIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuIFRoZSByZXF1ZXN0b3IgY2FuIGJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nCisJICogCXRoYXQgdGhlIGNsaWVudCBpcyBub3QgaW50ZXJlc3RlZCBpbiBwcm9ibGVtcy4KKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBlbGVtZW50IGNhbgorCSAqICAgbm90IGJlIGRldGVybWluZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqIDwvdWw+CisJICogQHJldHVybiBhIHNoYXJlZCB3b3JraW5nIGNvcHkgb24gdGhpcyBlbGVtZW50IHVzaW5nIHRoZSBnaXZlbiBmYWN0b3J5IHRvIGNyZWF0ZQorCSAqIHRoZSBidWZmZXIsIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weQorCSAqIEBzZWUgSUJ1ZmZlckZhY3RvcnkKKwkgKiBAc2VlIElQcm9ibGVtUmVxdWVzdG9yCisJICogQHNpbmNlIDIuMAorCSAqLworCUlKYXZhRWxlbWVudCBnZXRTaGFyZWRXb3JraW5nQ29weSgKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAorCQlJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LAorCQlJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IHdvcmtpbmcgY29weSBvZiB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIG5vdAorCSAqIGEgd29ya2luZyBjb3B5LCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkuCisJICoKKwkgKiBOb3RlOiBpZiBpbnRlbmRpbmcgdG8gc2hhcmUgYSB3b3JraW5nIGNvcHkgYW1vbmdzdCBzZXZlcmFsIGNsaWVudHMsIHRoZW4gCisJICogPGNvZGU+I2dldFNoYXJlZFdvcmtpbmdDb3B5PC9jb2RlPiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorCSAqIAorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCisJICogICBub3QgYmUgZGV0ZXJtaW5lZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPC91bD4KKwkgKiBAcmV0dXJuIGEgbmV3IHdvcmtpbmcgY29weSBvZiB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIG5vdAorCSAqIGEgd29ya2luZyBjb3B5LCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkKKwkgKi8KKwlJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSB0byBjcmVhdGUKKwkgKiB0aGUgYnVmZmVyLCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkuCisJICogTm90ZSB0aGF0IHRoaXMgZmFjdG9yeSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBsaWZlIHRpbWUgb2YgdGhpcyB3b3JraW5nIGNvcHksIGkuZS4gaWYgdGhlIAorCSAqIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW5lZCwgdGhpcyBmYWN0b3J5IHdpbGwgYmUgcmV1c2VkLgorCSAqIFRoZSBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggdGhlIG9yaWdpbmFsJ3MgY29tcGlsYXRpb24gdW5pdCBjb250ZW50CisJICogdXBvbiBjcmVhdGlvbi4KKwkgKgorCSAqIE5vdGU6IGlmIGludGVuZGluZyB0byBzaGFyZSBhIHdvcmtpbmcgY29weSBhbW9uZ3N0IHNldmVyYWwgY2xpZW50cywgdGhlbiAKKwkgKiA8Y29kZT4jZ2V0U2hhcmVkV29ya2luZ0NvcHk8L2NvZGU+IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisJICoKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3Mgd2hpbGUgb3BlbmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIAorCSAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIGJ1ZmZlciB0aGF0IGlzIHVzZWQgdG8gZ2V0IHRoZSBjb250ZW50IG9mIHRoZSB3b3JraW5nIGNvcHkKKwkgKiAgICAgICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGludGVybmFsIGZhY3Rvcnkgc2hvdWxkIGJlIHVzZWQKKwkgKiBAcGFyYW0gcHJvYmxlbVJlcXVlc3RvciBhIHJlcXVlc3RvciB3aGljaCB3aWxsIGdldCBub3RpZmllZCBvZiBwcm9ibGVtcyBkZXRlY3RlZCBkdXJpbmcKKwkgKiAJcmVjb25jaWxpbmcgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4gVGhlIHJlcXVlc3RvciBjYW4gYmUgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcKKwkgKiAJdGhhdCB0aGUgY2xpZW50IGlzIG5vdCBpbnRlcmVzdGVkIGluIHByb2JsZW1zLgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCisJICogICBub3QgYmUgZGV0ZXJtaW5lZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPC91bD4KKwkgKiBAcmV0dXJuIGEgbmV3IHdvcmtpbmcgY29weSBvZiB0aGlzIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGZhY3RvcnkgdG8gY3JlYXRlCisJICogdGhlIGJ1ZmZlciwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5CisJICogQHNpbmNlIDIuMAorCSAqLworCUlKYXZhRWxlbWVudCBnZXRXb3JraW5nQ29weSgKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAorCQlJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LAorCQlJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCQkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB3b3JraW5nIGNvcHkncyBvcmlnaW5hbCBlbGVtZW50J3MgY29udGVudAorCSAqIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgaW5jZXB0aW9uIG9mIHRoaXMgd29ya2luZyBjb3B5LgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHdvcmtpbmcgY29weSdzIG9yaWdpbmFsIGVsZW1lbnQncyBjb250ZW50CisJICogaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBpbmNlcHRpb24gb2YgdGhpcyB3b3JraW5nIGNvcHksIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNCYXNlZE9uKElSZXNvdXJjZSByZXNvdXJjZSk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlbGVtZW50IGlzIGEgd29ya2luZyBjb3B5LCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKKwkKKwkvKioKKwkgKiBSZWNvbmNpbGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIHdvcmtpbmcgY29weS4KKwkgKiBJdCBwZXJmb3JtcyB0aGUgcmVjb25jaWxpYXRpb24gYnkgbG9jYWxseSBjYWNoaW5nIHRoZSBjb250ZW50cyBvZiAKKwkgKiB0aGUgd29ya2luZyBjb3B5LCB1cGRhdGluZyB0aGUgY29udGVudHMsIHRoZW4gY3JlYXRpbmcgYSBkZWx0YSAKKwkgKiBvdmVyIHRoZSBjYWNoZWQgY29udGVudHMgYW5kIHRoZSBuZXcgY29udGVudHMsIGFuZCBmaW5hbGx5IGZpcmluZworCSAqIHRoaXMgZGVsdGEuCisJICogPHA+CisJICogSWYgdGhlIHdvcmtpbmcgY29weSBoYXNuJ3QgY2hhbmdlZCwgdGhlbiBubyBwcm9ibGVtIHdpbGwgYmUgZGV0ZWN0ZWQsCisJICogdGhpcyBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPklXb3JraW5nQ29weSNyZWNvbmNpbGUoZmFsc2UsIG51bGwpPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBDb21waWxhdGlvbiBwcm9ibGVtcyBmb3VuZCBpbiB0aGUgbmV3IGNvbnRlbnRzIGFyZSBub3RpZmllZCB0aHJvdWdoIHRoZQorCSAqIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPiBpbnRlcmZhY2Ugd2hpY2ggd2FzIHBhc3NlZCBhdAorCSAqIGNyZWF0aW9uLCBhbmQgbm8gbG9uZ2VyIGFzIHRyYW5zaWVudCBtYXJrZXJzLiBUaGVyZWZvcmUgdGhpcyBBUEkgd2lsbAorCSAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBOb3RlOiBJdCBoYXMgYmVlbiBhc3N1bWVkIHRoYXQgYWRkZWQgaW5uZXIgdHlwZXMgc2hvdWxkCisJICogbm90IGdlbmVyYXRlIGNoYW5nZSBkZWx0YXMuICBUaGUgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4KKwkgKiBtb2RpZmllZCB0byByZWZsZWN0IHRoaXMgYXNzdW1wdGlvbi4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudAorCSAqCQljYW5ub3QgYmUgYWNjZXNzZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGUgb3JpZ2luYWwgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPC91bD4KKwkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJSU1hcmtlcltdIHJlY29uY2lsZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJCisJLyoqCisJICogUmVjb25jaWxlcyB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkuCisJICogSXQgcGVyZm9ybXMgdGhlIHJlY29uY2lsaWF0aW9uIGJ5IGxvY2FsbHkgY2FjaGluZyB0aGUgY29udGVudHMgb2YgCisJICogdGhlIHdvcmtpbmcgY29weSwgdXBkYXRpbmcgdGhlIGNvbnRlbnRzLCB0aGVuIGNyZWF0aW5nIGEgZGVsdGEgCisJICogb3ZlciB0aGUgY2FjaGVkIGNvbnRlbnRzIGFuZCB0aGUgbmV3IGNvbnRlbnRzLCBhbmQgZmluYWxseSBmaXJpbmcKKwkgKiB0aGlzIGRlbHRhLgorCSAqIDxwPgorCSAqIFRoZSBib29sZWFuIGFyZ3VtZW50IGFsbG93cyB0byBmb3JjZSBwcm9ibGVtIGRldGVjdGlvbiBldmVuIGlmIHRoZQorCSAqIHdvcmtpbmcgY29weSBpcyBhbHJlYWR5IGNvbnNpc3RlbnQuCisJICogPHA+CisJICogQ29tcGlsYXRpb24gcHJvYmxlbXMgZm91bmQgaW4gdGhlIG5ldyBjb250ZW50cyBhcmUgbm90aWZpZWQgdGhyb3VnaCB0aGUKKwkgKiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4gaW50ZXJmYWNlIHdoaWNoIHdhcyBwYXNzZWQgYXQKKwkgKiBjcmVhdGlvbiwgYW5kIG5vIGxvbmdlciBhcyB0cmFuc2llbnQgbWFya2Vycy4gVGhlcmVmb3JlIHRoaXMgQVBJIGFuc3dlcnMKKwkgKiBub3RoaW5nLgorCSAqIDxwPgorCSAqIE5vdGU6IEl0IGhhcyBiZWVuIGFzc3VtZWQgdGhhdCBhZGRlZCBpbm5lciB0eXBlcyBzaG91bGQKKwkgKiBub3QgZ2VuZXJhdGUgY2hhbmdlIGRlbHRhcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbgorCSAqIG1vZGlmaWVkIHRvIHJlZmxlY3QgdGhpcyBhc3N1bXB0aW9uLgorCSAqCisJICogQHBhcmFtIGZvcmNlUHJvYmxlbURldGVjdGlvbiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBwcm9ibGVtIHNob3VsZCBiZSByZWNvbXB1dGVkCisJICogICBldmVuIGlmIHRoZSBzb3VyY2UgaGFzbid0IGNoYW5nZWQuCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50CisJICoJCWNhbm5vdCBiZSBhY2Nlc3NlZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+IFRoZSBvcmlnaW5hbCBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8L3VsPgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwl2b2lkIHJlY29uY2lsZShib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCisJLyoqCisJICogUmVzdG9yZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mCisJICogdGhpcyB3b3JraW5nIGNvcHkncyBvcmlnaW5hbCBlbGVtZW50LiBIYXMgbm8gZWZmZWN0IGlmIHRoaXMgZWxlbWVudAorCSAqIGlzIG5vdCBhIHdvcmtpbmcgY29weS4KKwkgKgorCSAqIDxwPk5vdGU6IFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgY29tbWl0dGluZyB0aGUgY29udGVudCBvZiB0aGUKKwkgKiB3b3JraW5nIGNvcHkgdG8gdGhlIG9yaWdpbmFsIGVsZW1lbnQgd2l0aCA8Y29kZT5jb21taXQoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+LgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50CisJICoJCWNhbm5vdCBiZSBhY2Nlc3NlZC4gIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGUgb3JpZ2luYWwgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPC91bD4KKwkgKi8KKwl2b2lkIHJlc3RvcmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvbnZlbnRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4OWMwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb252ZW50aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworCisvKioKKyAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGNoZWNraW5nIEphdmEtc3BlY2lmaWMgY29udmVudGlvbnMgc3VjaCBhcyBuYW1lIHN5bnRheC4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQorICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb252ZW50aW9ucyB7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhciBmZ0RvdD0gJy4nOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmZ0pBVkE9ICJKQVZBIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIFNjYW5uZXIgU0NBTk5FUiA9IG5ldyBTY2FubmVyKCk7CisvKioKKyAqIE5vdCBpbnN0YW50aWFibGUuCisgKi8KK3ByaXZhdGUgSmF2YUNvbnZlbnRpb25zKCkge30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcGF0aHMgYXJlIGNvbnNpZGVyZWQKKyAqIHRvIG92ZXJsYXAuCisgKiA8cD4KKyAqIFR3byByb290IHBhdGhzIG92ZXJsYXAgaWYgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgb3IgdGhleSBwb2ludCB0bworICogdGhlIHNhbWUgbG9jYXRpb24uIEhvd2V2ZXIsIGEgSkFSIGlzIGFsbG93ZWQgdG8gYmUgbmVzdGVkIGluIGEgcm9vdC4KKyAqCisgKiBAcGFyYW0gcm9vdFBhdGgxIHRoZSBmaXJzdCByb290IHBhdGgKKyAqIEBwYXJhbSByb290UGF0aDIgdGhlIHNlY29uZCByb290IHBhdGgKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCByb290IHBhdGhzIGFyZSBjb25zaWRlcmVkIHRvIG92ZXJsYXAsIGZhbHNlIG90aGVyd2lzZQorICovCitwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPdmVybGFwcGluZ1Jvb3RzKElQYXRoIHJvb3RQYXRoMSwgSVBhdGggcm9vdFBhdGgyKSB7CisJaWYgKHJvb3RQYXRoMSA9PSBudWxsIHx8IHJvb3RQYXRoMiA9PSBudWxsKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJU3RyaW5nIGV4dGVuc2lvbjEgPSByb290UGF0aDEuZ2V0RmlsZUV4dGVuc2lvbigpOworCVN0cmluZyBleHRlbnNpb24yID0gcm9vdFBhdGgyLmdldEZpbGVFeHRlbnNpb24oKTsKKwlTdHJpbmcgamFyRXh0ZW5zaW9uID0gIkpBUiI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgemlwRXh0ZW5zaW9uID0gIlpJUCI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZXh0ZW5zaW9uMSAhPSBudWxsICYmIChleHRlbnNpb24xLmVxdWFsc0lnbm9yZUNhc2UoamFyRXh0ZW5zaW9uKSB8fCBleHRlbnNpb24xLmVxdWFsc0lnbm9yZUNhc2UoemlwRXh0ZW5zaW9uKSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0gCisJaWYgKGV4dGVuc2lvbjIgIT0gbnVsbCAmJiAoZXh0ZW5zaW9uMi5lcXVhbHNJZ25vcmVDYXNlKGphckV4dGVuc2lvbikgfHwgZXh0ZW5zaW9uMi5lcXVhbHNJZ25vcmVDYXNlKHppcEV4dGVuc2lvbikpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHJvb3RQYXRoMS5pc1ByZWZpeE9mKHJvb3RQYXRoMikgfHwgcm9vdFBhdGgyLmlzUHJlZml4T2Yocm9vdFBhdGgxKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBpZGVudGlmaWVyIGV4dHJhY3RlZCBieSB0aGUgc2Nhbm5lciAoaWUuIHdpdGhvdXQgdW5pY29kZXMpCisgKiBmcm9tIHRoZSBnaXZlbiBpZC4KKyAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlkIHdhcyBub3QgdmFsaWQuCisgKi8KK3ByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBjaGFyW10gc2Nhbm5lZElkZW50aWZpZXIoU3RyaW5nIGlkKSB7CisJaWYgKGlkID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCVN0cmluZyB0cmltbWVkID0gaWQudHJpbSgpOworCWlmICghdHJpbW1lZC5lcXVhbHMoaWQpKSB7CisJCXJldHVybiBudWxsOworCX0KKwl0cnkgeworCQlTQ0FOTkVSLnNldFNvdXJjZShpZC50b0NoYXJBcnJheSgpKTsKKwkJaW50IHRva2VuID0gU0NBTk5FUi5nZXROZXh0VG9rZW4oKTsKKwkJY2hhcltdIGN1cnJlbnRJZGVudGlmaWVyOworCQl0cnkgeworCQkJY3VycmVudElkZW50aWZpZXIgPSBTQ0FOTkVSLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7CisJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgbmV4dFRva2VuPSBTQ0FOTkVSLmdldE5leHRUb2tlbigpOworCQlpZiAodG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyIAorCQkJJiYgbmV4dFRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GCisJCQkmJiBTQ0FOTkVSLnN0YXJ0UG9zaXRpb24gPT0gU0NBTk5FUi5zb3VyY2UubGVuZ3RoKSB7IC8vIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHdlIGhhZCBhbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gCisJCQkJCQkJCQkJCQkJCQkgICAgIC8vIHdoaWxlIHJlYWRpbmcgdGhlIGxhc3QgdG9rZW4KKwkJCXJldHVybiBjdXJyZW50SWRlbnRpZmllcjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIFZhbGlkYXRlIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IG5hbWUuCisgKiBBIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZyBydWxlczoKKyAqIDx1bD4KKyAqIDxsaT4gaXQgbXVzdCBub3QgYmUgbnVsbAorICogPGxpPiBpdCBtdXN0IGluY2x1ZGUgdGhlIDxjb2RlPiIuamF2YSI8L2NvZGU+IHN1ZmZpeAorICogPGxpPiBpdHMgcHJlZml4IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCisgKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisgKgkJICAgb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCisgKiA8L3VsPgorICogPC9wPgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBjb21waWxhdGlvbiB1bml0CisgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKyAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQorICovCitwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKFN0cmluZyBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlTdHJpbmcgaWRlbnRpZmllcjsKKwlpbnQgaW5kZXg7CisJaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi51bml0Lm5vdEphdmFOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJfQorCWlkZW50aWZpZXIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcik7CisJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICghVXRpbC5pc0phdmFGaWxlTmFtZShuYW1lKSkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogVmFsaWRhdGUgdGhlIGdpdmVuIC5jbGFzcyBmaWxlIG5hbWUuCisgKiBBIC5jbGFzcyBmaWxlIG5hbWUgbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKiA8dWw+CisgKiA8bGk+IGl0IG11c3Qgbm90IGJlIG51bGwKKyAqIDxsaT4gaXQgbXVzdCBpbmNsdWRlIHRoZSA8Y29kZT4iLmNsYXNzIjwvY29kZT4gc3VmZml4CisgKiA8bGk+IGl0cyBwcmVmaXggbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKyAqIDxsaT4gaXQgbXVzdCBub3QgY29udGFpbiBhbnkgY2hhcmFjdGVycyBvciBzdWJzdHJpbmdzIHRoYXQgYXJlIG5vdCB2YWxpZCAKKyAqCQkgICBvbiB0aGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZC4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIC5jbGFzcyBmaWxlCisgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKyAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIC5jbGFzcyBmaWxlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKyAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlQ2xhc3NGaWxlTmFtZShTdHJpbmcgbmFtZSkgeworCWlmIChuYW1lID09IG51bGwpIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmNsYXNzRmlsZS5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlTdHJpbmcgaWRlbnRpZmllcjsKKwlpbnQgaW5kZXg7CisJaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5jbGFzc0ZpbGUubm90SmF2YU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWRlbnRpZmllciA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKCFVdGlsLmlzQ2xhc3NGaWxlTmFtZShuYW1lKSkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uY2xhc3NGaWxlLm5vdENsYXNzRmlsZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRklMRSk7CisJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWVsZCBuYW1lLgorICogPHA+CisgKiBTeW50YXggb2YgYSBmaWVsZCBuYW1lIGNvcnJlc3BvbmRzIHRvIFZhcmlhYmxlRGVjbGFyYXRvcklkIChKTFMyIDguMykuCisgKiBGb3IgZXhhbXBsZSwgPGNvZGU+IngiPC9jb2RlPi4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGZpZWxkCisgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKyAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGZpZWxkIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKyAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKKyAqLworcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRmllbGROYW1lKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHZhbGlkYXRlSWRlbnRpZmllcihuYW1lKTsKK30KKy8qKgorICogVmFsaWRhdGUgdGhlIGdpdmVuIEphdmEgaWRlbnRpZmllci4KKyAqIFRoZSBpZGVudGlmaWVyIG11c3QgaGF2ZSB0aGUgc2FtZSBzcGVsbGluZyBhcyBhIEphdmEga2V5d29yZCwKKyAqIGJvb2xlYW4gbGl0ZXJhbCAoPGNvZGU+InRydWUiPC9jb2RlPiwgPGNvZGU+ImZhbHNlIjwvY29kZT4pLCBvciBudWxsIGxpdGVyYWwgKDxjb2RlPiJudWxsIjwvY29kZT4pLgorICogU2VlIHNlY3Rpb24gMy44IG9mIHRoZSA8ZW0+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbjwvZW0+IChKTFMyKS4KKyAqIEEgdmFsaWQgaWRlbnRpZmllciBjYW4gYWN0IGFzIGEgc2ltcGxlIHR5cGUgbmFtZSwgbWV0aG9kIG5hbWUgb3IgZmllbGQgbmFtZS4KKyAqCisgKiBAcGFyYW0gaWQgdGhlIEphdmEgaWRlbnRpZmllcgorICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCisgKgkJdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIsIG90aGVyd2lzZSBhIHN0YXR1cyAKKyAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGlkZW50aWZpZXIKKyAqLworcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKKwlpZiAoc2Nhbm5lZElkZW50aWZpZXIoaWQpICE9IG51bGwpIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIiLCBpZCksIG51bGwpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIG5hbWUuCisgKiA8cD4KKyAqIFRoZSBuYW1lIG9mIGFuIGltcG9ydCBjb3JyZXNwb25kcyB0byBhIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUKKyAqIG9yIGFuIG9uLWRlbWFuZCBwYWNrYWdlIG5hbWUgYXMgZGVmaW5lZCBieSBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLgorICogRm9yIGV4YW1wbGUsIDxjb2RlPiJqYXZhLnV0aWwuKiI8L2NvZGU+IG9yIDxjb2RlPiJqYXZhLnV0aWwuSGFzaHRhYmxlIjwvY29kZT4uCisgKgorICogQHBhcmFtIG5hbWUgdGhlIGltcG9ydCBkZWNsYXJhdGlvbgorICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCisgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLCBvdGhlcndpc2UgYSBzdGF0dXMgCisgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisgKi8KK3B1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUltcG9ydERlY2xhcmF0aW9uKFN0cmluZyBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmltcG9ydC5udWxsSW1wb3J0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJfSAKKwlpZiAobmFtZS5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDEpID09ICcqJykgeworCQlpZiAobmFtZS5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDIpID09ICcuJykgeworCQkJcmV0dXJuIHZhbGlkYXRlUGFja2FnZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbXBvcnQudW5xdWFsaWZpZWRJbXBvcnQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwlyZXR1cm4gdmFsaWRhdGVQYWNrYWdlTmFtZShuYW1lKTsKK30KKy8qKgorICogVmFsaWRhdGUgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZC4KKyAqIEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS5sYW5nLk9iamVjdCI8L2NvZGU+LCBvciA8Y29kZT4iT2JqZWN0IjwvY29kZT4uCisgKiA8cD4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHR5cGUKKyAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIAorICogICAgICBhIHN0YXR1cyB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5XQVJOSU5HPC9jb2RlPgorICoJCWluZGljYXRpbmcgd2h5IHRoZSBnaXZlbiBuYW1lIGlzIGRpc2NvdXJhZ2VkLCAKKyAqICAgICAgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCAKKyAqICAgICAgdGhlIG5hbWUKKyAqLworcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlTdHJpbmcgdHJpbW1lZCA9IG5hbWUudHJpbSgpOworCWlmICghbmFtZS5lcXVhbHModHJpbW1lZCkpIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUubmFtZVdpdGhCbGFua3MiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworCWNoYXJbXSBzY2FubmVkSUQ7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCS8vIHNpbXBsZSBuYW1lCisJCXNjYW5uZWRJRCA9IHNjYW5uZWRJZGVudGlmaWVyKG5hbWUpOworCX0gZWxzZSB7CisJCS8vIHF1YWxpZmllZCBuYW1lCisJCVN0cmluZyBwa2cgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOworCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlUGFja2FnZU5hbWUocGtnKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCVN0cmluZyB0eXBlID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCk7CisJCXNjYW5uZWRJRCA9IHNjYW5uZWRJZGVudGlmaWVyKHR5cGUpOworCX0KKworCWlmIChzY2FubmVkSUQgIT0gbnVsbCkgeworCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmV3IFN0cmluZyhzY2FubmVkSUQpLCBJUmVzb3VyY2UuRklMRSk7CisJCWlmICghc3RhdHVzLmlzT0soKSkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlpZiAoQ2hhck9wZXJhdGlvbi5jb250YWlucygnJCcsIHNjYW5uZWRJRCkpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUuZG9sbGFyTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoc2Nhbm5lZElELmxlbmd0aCA+IDAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHNjYW5uZWRJRFswXSkpKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmxvd2VyY2FzZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmludmFsaWROYW1lIiwgbmFtZSksIG51bGwpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWUuCisgKiBUaGUgc3BlY2lhbCBuYW1lcyAiJmx0O2luaXQmZ3Q7IiBhbmQgIiZsdDtjbGluaXQmZ3Q7IiBhcmUgbm90IHZhbGlkLgorICogPHA+CisgKiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZCAgbmFtZSBpcyBkZWZpbmVkIGJ5IElkZW50aWZpZXIKKyAqIG9mIE1ldGhvZERlY2xhcmF0b3IgKEpMUzIgOC40KS4gRm9yIGV4YW1wbGUgInByaW50bG4iLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgbWV0aG9kCisgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKyAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIG1ldGhvZCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisgKi8KK3B1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU1ldGhvZE5hbWUoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpOworfQorLyoqCisgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lLgorICogPHA+CisgKiBUaGUgc3ludGF4IG9mIGEgcGFja2FnZSBuYW1lIGNvcnJlc3BvbmRzIHRvIFBhY2thZ2VOYW1lIGFzCisgKiBkZWZpbmVkIGJ5IFBhY2thZ2VEZWNsYXJhdGlvbiAoSkxTMiA3LjQpLiBGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEubGFuZyI8L2NvZGU+LgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlIGdpdmVuIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBwYWNrYWdlIG5hbWUgKGllLiBhdHRlbXB0aW5nIHRvCisgKiB2YWxpZGF0ZSB0aGUgZGVmYXVsdCBwYWNrYWdlIHdpbGwgcmV0dXJuIGFuIGVycm9yIHN0YXR1cy4pCisgKiBBbHNvIGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisgKiBvbiB0aGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZC4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKKyAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgcGFja2FnZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisgKi8KK3B1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhY2thZ2VOYW1lKFN0cmluZyBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpbnQgbGVuZ3RoOworCWlmICgobGVuZ3RoID0gbmFtZS5sZW5ndGgoKSkgPT0gMCkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5lbXB0eU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKG5hbWUuY2hhckF0KDApID09IGZnRG90IHx8IG5hbWUuY2hhckF0KGxlbmd0aC0xKSA9PSBmZ0RvdCkgeworCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5kb3ROYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KDApKSB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSkpIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UubmFtZVdpdGhCbGFua3MiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaW50IGRvdCA9IDA7CisJd2hpbGUgKGRvdCAhPSAtMSAmJiBkb3QgPCBsZW5ndGgtMSkgeworCQlpZiAoKGRvdCA9IG5hbWUuaW5kZXhPZihmZ0RvdCwgZG90KzEpKSAhPSAtMSAmJiBkb3QgPCBsZW5ndGgtMSAmJiBuYW1lLmNoYXJBdChkb3QrMSkgPT0gZmdEb3QpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLmNvbnNlY3V0aXZlRG90c05hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwl9CisJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCBuZXcgU3RyaW5nKG5ldyBjaGFyW10ge2ZnRG90fSkpOworCWJvb2xlYW4gZmlyc3RUb2tlbiA9IHRydWU7CisJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQlTdHJpbmcgdHlwZU5hbWUgPSBzdC5uZXh0VG9rZW4oKTsKKwkJdHlwZU5hbWUgPSB0eXBlTmFtZS50cmltKCk7IC8vIGdyYW1tYXIgYWxsb3dzIHNwYWNlcworCQljaGFyW10gc2Nhbm5lZElEID0gc2Nhbm5lZElkZW50aWZpZXIodHlwZU5hbWUpOworCQlpZiAoc2Nhbm5lZElEID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbGxlZ2FsSWRlbnRpZmllciIsIHR5cGVOYW1lKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUobmV3IFN0cmluZyhzY2FubmVkSUQpLCBJUmVzb3VyY2UuRk9MREVSKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWlmIChmaXJzdFRva2VuICYmIHNjYW5uZWRJRC5sZW5ndGggPiAwICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzY2FubmVkSURbMF0pKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLnVwcGVyY2FzZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlmaXJzdFRva2VuID0gZmFsc2U7CisJfQorCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCit9CisKKy8qKgorICogVmFsaWRhdGUgdGhlIGdpdmVuIGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICogPHVsPgorICogICA8bGk+IE5vIGR1cGxpY2F0ZSBwYXRoIGFtb25nc3QgY2xhc3NwYXRoIGVudHJpZXMuCisgKiAgIDxsaT4gT3V0cHV0IGxvY2F0aW9uIHBhdGggaXMgbm90IG51bGwsIGl0IGlzIGFic29sdXRlIGFuZCBsb2NhdGVkIGluc2lkZSB0aGUgcHJvamVjdC4KKyAqICAgPGxpPiBBIHByb2plY3QgY2Fubm90IGRlcGVuZCBvbiBpdHNlbGYgZGlyZWN0bHkuCisgKiAgIDxsaT4gU291cmNlL2xpYnJhcnkgZm9sZGVycyBjYW5ub3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYmluYXJ5IG91dHB1dCwgYW5kIHJlY2lwcm9jYWxseS4KKyAqICAgPGxpPiBTb3VyY2UvbGlicmFyeSBmb2xkZXJzIGNhbm5vdCBiZSBuZXN0ZWQgaW4gZWFjaCBvdGhlci4KKyAqICAgPGxpPiBPdXRwdXQgbG9jYXRpb24gbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHByb2plY3QuCisgKiA8L3VsPgorICogCisgKiAgTm90ZSB0aGF0IHRoZSBjbGFzc3BhdGggZW50cmllcyBhcmUgbm90IHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5LiBPbmx5IGJvdW5kIHZhcmlhYmxlcyBvciBjb250YWluZXJzIGFyZSBjb25zaWRlcmVkIAorICogIGluIHRoZSBjaGVja2luZyBwcm9jZXNzICh0aGlzIGFsbG93cyB0byBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgb24gYSBjbGFzc3BhdGggd2hpY2ggaGFzIHJlZmVyZW5jZXMgdG8KKyAqICB5ZXQgbm9uIGV4aXN0aW5nIHByb2plY3RzLCBmb2xkZXJzLCAuLi4pLgorICogCisgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIGphdmEgcHJvamVjdAorICogQHBhcmFtIGNsYXNzcGF0aCBhIGdpdmVuIGNsYXNzcGF0aAorICogQHBhcmFtIG91dHB1dExvY2F0aW9uIGEgZ2l2ZW4gb3V0cHV0IGxvY2F0aW9uCisgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKyAqCQl0aGUgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gYXJlIGNvbXBhdGlibGUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKyAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGNsYXNzcGF0aCBvciBvdXRwdXQgbG9jYXRpb24KKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgeworCisJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwlJUGF0aCBwcm9qZWN0UGF0aD0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOworCisJLyogdmFsaWRhdGUgb3V0cHV0IGxvY2F0aW9uICovCisJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OVUxMX1BBVEgpOworCX0KKwlpZiAob3V0cHV0TG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7CisJCWlmICghcHJvamVjdFBhdGguaXNQcmVmaXhPZihvdXRwdXRMb2NhdGlvbikpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUEFUSF9PVVRTSURFX1BST0pFQ1QsIGphdmFQcm9qZWN0LCBvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVMQVRJVkVfUEFUSCwgb3V0cHV0TG9jYXRpb24pOworCX0KKworCWJvb2xlYW4gYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSBmYWxzZTsKKwlib29sZWFuIGhhc1NvdXJjZSA9IGZhbHNlOworCisJLy8gdG9sZXJhdGUgbnVsbCBwYXRoLCBpdCB3aWxsIGJlIHJlc2V0IHRvIGRlZmF1bHQKKwlpbnQgbGVuZ3RoID0gY2xhc3NwYXRoID09IG51bGwgPyAwIDogY2xhc3NwYXRoLmxlbmd0aDsgCisKKwlBcnJheUxpc3QgcmVzb2x2ZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlDbGFzc3BhdGhFbnRyeSByYXdFbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJc3dpdGNoKHJhd0VudHJ5LmdldEVudHJ5S2luZCgpKXsKKwkJCQorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKKwkJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkocmF3RW50cnkpOworCQkJCWlmIChyZXNvbHZlZEVudHJ5ICE9IG51bGwpeworCQkJCQkvLyBjaGVjayBpZiBhbnkgc291cmNlIGVudHJpZXMgY29pbmNpZGF0ZXMgd2l0aCBiaW5hcnkgb3V0cHV0IC0gaW4gd2hpY2ggY2FzZSBuZXN0aW5nIGluc2lkZSBvdXRwdXQgaXMgbGVnYWwKKwkJCQkJaWYgKHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsKKwkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgorCQkJCXRyeSB7CisJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHJhd0VudHJ5LmdldFBhdGgoKSwgamF2YVByb2plY3QpOworCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpeworCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisJCQkJCQlpZiAoY29udGFpbmVyRW50cmllcyAhPSBudWxsKXsKKwkJCQkJCQlmb3IgKGludCBqID0gMCwgY29udGFpbmVyTGVuZ3RoID0gY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGogPCBjb250YWluZXJMZW5ndGg7IGorKyl7CisJCQkJCQkJCS8vcmVzb2x2ZWRFbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoY29udGFpbmVyRW50cmllc1tqXSk7CisJCQkJCQkJCXJlc29sdmVkRW50cnkgPSBjb250YWluZXJFbnRyaWVzW2pdOworCQkJCQkJCQlpZiAocmVzb2x2ZWRFbnRyeSAhPSBudWxsKXsKKwkJCQkJCQkJCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbAorCQkJCQkJCQkJaWYgKHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsKKwkJCQkJCQkJCXJlc29sdmVkRW50cmllcy5hZGQocmVzb2x2ZWRFbnRyeSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CisJCQkJaGFzU291cmNlID0gdHJ1ZTsKKwkJCWRlZmF1bHQgOgorCQkJCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbAorCQkJCWlmIChyYXdFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG91dHB1dExvY2F0aW9uKSkgYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSB0cnVlOworCQkJCXJlc29sdmVkRW50cmllcy5hZGQocmF3RW50cnkpOworCQkJCWJyZWFrOworCQl9CisJfQorCWlmICghaGFzU291cmNlKSBhbGxvd05lc3RpbmdJbk91dHB1dCA9IHRydWU7IC8vIGlmIG5vIHNvdXJjZSwgdGhlbiBhbGxvd2VkCisJCisJbGVuZ3RoID0gcmVzb2x2ZWRFbnRyaWVzLnNpemUoKTsKKwljbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aF07CisJcmVzb2x2ZWRFbnRyaWVzLnRvQXJyYXkoY2xhc3NwYXRoKTsKKwkKKwlIYXNoU2V0IHBhdGhlcyA9IG5ldyBIYXNoU2V0KGxlbmd0aCk7CisJCisJLy8gY2hlY2sgYWxsIGVudHJpZXMKKwlmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CisKKwkJaWYgKGVudHJ5ID09IG51bGwpIGNvbnRpbnVlOworCisJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJaW50IGtpbmQgPSBlbnRyeS5nZXRFbnRyeUtpbmQoKTsKKworCQkvLyBjb21wbGFpbiBpZiBkdXBsaWNhdGUgcGF0aAorCQlpZiAoIXBhdGhlcy5hZGQoZW50cnlQYXRoKSl7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCBVdGlsLmJpbmQoImNsYXNzcGF0aC5kdXBsaWNhdGVFbnRyeVBhdGgiLCBlbnRyeVBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gbm8gZnVydGhlciBjaGVjayBpZiBlbnRyeSBjb2luY2lkYXRlcyB3aXRoIHByb2plY3Qgb3Igb3V0cHV0IGxvY2F0aW9uCisJCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSl7CisJCQkvLyBjb21wbGFpbiBpZiBzZWxmLXJlZmVycmluZyBwcm9qZWN0IGVudHJ5CisJCQlpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpeworCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3RSZWZlclRvSXRzZWxmIiwgZW50cnlQYXRoLnRvU3RyaW5nKCkpKTsvLyROT04tTkxTLTEkCisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIHByZXZlbnQgbmVzdGluZyBzb3VyY2UgZW50cmllcyBpbiBlYWNoIG90aGVyCisJCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIAorCQkJCXx8IChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShlbnRyeVBhdGgubGFzdFNlZ21lbnQoKSkpKXsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NwYXRoLmxlbmd0aDsgaisrKXsKKwkJCQlJQ2xhc3NwYXRoRW50cnkgb3RoZXJFbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQlpZiAob3RoZXJFbnRyeSA9PSBudWxsKSBjb250aW51ZTsKKwkJCQlpbnQgb3RoZXJLaW5kID0gb3RoZXJFbnRyeS5nZXRFbnRyeUtpbmQoKTsKKwkJCQlpZiAoZW50cnkgIT0gb3RoZXJFbnRyeSAKKwkJCQkJJiYgKG90aGVyS2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSAKKwkJCQkJCQl8fCAob3RoZXJLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAKKwkJCQkJCQkJCSYmICFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKG90aGVyRW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpKSkpeworCQkJCQlpZiAob3RoZXJFbnRyeS5nZXRQYXRoKCkuaXNQcmVmaXhPZihlbnRyeVBhdGgpKXsKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdE5lc3RFbnRyeUluRW50cnkiLCBlbnRyeVBhdGgudG9TdHJpbmcoKSwgb3RoZXJFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gcHJldmVudCBuZXN0aW5nIG91dHB1dCBsb2NhdGlvbiBpbnNpZGUgZW50cnkKKwkJaWYgKCFlbnRyeVBhdGguZXF1YWxzKG91dHB1dExvY2F0aW9uKSAmJiBlbnRyeVBhdGguaXNQcmVmaXhPZihvdXRwdXRMb2NhdGlvbikpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdE5lc3RFbnRyeUluT3V0cHV0IixlbnRyeVBhdGgudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQkvLyBwcmV2ZW50IG5lc3RpbmcgZW50cnkgaW5zaWRlIG91dHB1dCBsb2NhdGlvbiAtIHdoZW4gZGlzdGluY3QgZnJvbSBwcm9qZWN0IG9yIGEgc291cmNlIGZvbGRlcgorCQlpZiAoIWFsbG93TmVzdGluZ0luT3V0cHV0ICYmIG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoZW50cnlQYXRoKSkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluRW50cnkiLCBvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpLCBlbnRyeVBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsJCit9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgamF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwgCisJICogYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgZmluZS4KKwkgKiAoaS5lLiBpZiB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGVudHJ5IGRlbm90ZXMgYSB2YWxpZCBlbGVtZW50IHRvIGJlIHJlZmVyZW5jZWQgb250byBhIGNsYXNzcGF0aCkuCisJICogCisJICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBnaXZlbiBqYXZhIHByb2plY3QKKwkgKiBAcGFyYW0gZW50cnkgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyeQorCSAqIEBwYXJhbSBjaGVja1NvdXJjZUF0dGFjaG1lbnQgYSBmbGFnIHRvIGRldGVybWluZSBpZiBzb3VyY2UgYXR0YWNoZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQKKwkgKiBAcmV0dXJuIGEgamF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwgYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgZmluZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgYm9vbGVhbiBjaGVja1NvdXJjZUF0dGFjaG1lbnQpeworCQkKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CQkJCisJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQorCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpeworCisJCQkvLyBjb250YWluZXIgZW50cnkgY2hlY2sKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgorCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+PSAxKXsKKwkJCQkJdHJ5IHsKKwkJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHBhdGgsIGphdmFQcm9qZWN0KTsKKwkJCQkJCS8vIGNvbnRhaW5lciByZXRyaWV2YWwgaXMgcGVyZm9ybWluZyB2YWxpZGF0aW9uIGNoZWNrIG9uIGNvbnRhaW5lciBlbnRyeSBraW5kcy4KKwkJCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCl7CisJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZENvbnRhaW5lclBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisJCQkJCQlpZiAoY29udGFpbmVyRW50cmllcyAhPSBudWxsKXsKKwkJCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQkJCQkJCUlDbGFzc3BhdGhFbnRyeSBjb250YWluZXJFbnRyeSA9IGNvbnRhaW5lckVudHJpZXNbaV07CisJCQkJCQkJCWludCBraW5kID0gY29udGFpbmVyRW50cnkgPT0gbnVsbCA/IDAgOiBjb250YWluZXJFbnRyeS5nZXRFbnRyeUtpbmQoKTsKKwkJCQkJCQkJaWYgKGNvbnRhaW5lckVudHJ5ID09IG51bGwKKwkJCQkJCQkJCXx8IGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UKKwkJCQkJCQkJCXx8IGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRQorCQkJCQkJCQkJfHwga2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUil7CisJCQkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DUF9DT05UQUlORVJfRU5UUlksCisJCQkJCQkJCQkJCWNvbnRhaW5lci5nZXRQYXRoKCkudG9TdHJpbmcoKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJSUphdmFNb2RlbFN0YXR1cyBjb250YWluZXJFbnRyeVN0YXR1cyA9IHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoamF2YVByb2plY3QsIGNvbnRhaW5lckVudHJ5LCBjaGVja1NvdXJjZUF0dGFjaG1lbnQpOworCQkJCQkJCQlpZiAoIWNvbnRhaW5lckVudHJ5U3RhdHVzLmlzT0soKSl7CisJCQkJCQkJCQlyZXR1cm4gY29udGFpbmVyRW50cnlTdGF0dXM7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsQ29udGFpbmVyUGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOwkJCQkJIC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkKKwkJCS8vIHZhcmlhYmxlIGVudHJ5IGNoZWNrCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgorCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+PSAxKXsKKwkJCQkJZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKKwkJCQkJaWYgKGVudHJ5ID09IG51bGwpeworCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFZhcmlhYmxlUGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJcmV0dXJuIHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoamF2YVByb2plY3QsIGVudHJ5LCBjaGVja1NvdXJjZUF0dGFjaG1lbnQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxWYXJpYWJsZVBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsJCQkJCSAvLyROT04tTkxTLTEkCisJCQkJfQorCisJCQkvLyBsaWJyYXJ5IGVudHJ5IGNoZWNrCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CisJCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsKKwkJCQkJSVBhdGggc291cmNlQXR0YWNobWVudCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7CisJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIHRydWUpOworCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKKwkJCQkJCUlSZXNvdXJjZSByZXNvbHZlZFJlc291cmNlID0gKElSZXNvdXJjZSkgdGFyZ2V0OworCQkJCQkJc3dpdGNoKHJlc29sdmVkUmVzb3VyY2UuZ2V0VHlwZSgpKXsKKwkJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJCQkJCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pIHx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSl7IC8vIGludGVybmFsIGJpbmFyeSBhcmNoaXZlIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCAKKwkJCQkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwKKwkJCQkJCQkJCQkmJiAhc291cmNlQXR0YWNobWVudC5pc0VtcHR5KCkKKwkJCQkJCQkJCQkmJiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHNvdXJjZUF0dGFjaG1lbnQsIHRydWUpID09IG51bGwpeworCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50Iiwgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CS8vIGludGVybmFsIGJpbmFyeSBmb2xkZXIKKwkJCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCAKKwkJCQkJCQkJCSYmIHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbCAKKwkJCQkJCQkJCSYmICFzb3VyY2VBdHRhY2htZW50LmlzRW1wdHkoKQorCQkJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsKKwkJCQkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlQXR0YWNobWVudCIsIHNvdXJjZUF0dGFjaG1lbnQudG9TdHJpbmcoKSwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpeworCQkJCQkJaWYgKGNoZWNrU291cmNlQXR0YWNobWVudCAKKwkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwgCisJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpCisJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsKKwkJCQkJCQlyZXR1cm4gIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLCBzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kTGlicmFyeSIsIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsTGlicmFyeVBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlicmVhazsKKworCQkJLy8gcHJvamVjdCBlbnRyeSBjaGVjaworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5pc0Fic29sdXRlKCkgJiYgIXBhdGguaXNFbXB0eSgpKSB7CisJCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSB8fCAhcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSl7CisJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFByb2plY3QiLCBwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpeworCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNsb3NlZFByb2plY3QiLCBwYXRoLnNlZ21lbnQoMCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kUHJvamVjdCIsIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmlsbGVnYWxQcm9qZWN0UGF0aCIsIHBhdGguc2VnbWVudCgwKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCS8vIHByb2plY3Qgc291cmNlIGZvbGRlcgorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CisJCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmlzQWJzb2x1dGUoKSAmJiAhcGF0aC5pc0VtcHR5KCkpIHsKKwkJCQkJSVBhdGggcHJvamVjdFBhdGg9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQkJCQlpZiAoIXByb2plY3RQYXRoLmlzUHJlZml4T2YocGF0aCkgfHwgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBwYXRoLCB0cnVlKSA9PSBudWxsKXsKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VGb2xkZXIiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFNvdXJjZUZvbGRlclBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CQkKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTcxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhCkBAIC0wLDAgKzEsMjU0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CdWZmZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5TZXRDbGFzc3BhdGhPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworLyoqCisgKiBUaGUgcGx1Zy1pbiBydW50aW1lIGNsYXNzIGZvciB0aGUgSmF2YSBtb2RlbCBwbHVnLWluIGNvbnRhaW5pbmcgdGhlIGNvcmUKKyAqIChVSS1mcmVlKSBzdXBwb3J0IGZvciBKYXZhIHByb2plY3RzLgorICogPHA+CisgKiBMaWtlIGFsbCBwbHVnLWluIHJ1bnRpbWUgY2xhc3NlcyAoc3ViY2xhc3NlcyBvZiA8Y29kZT5QbHVnaW48L2NvZGU+KSwgdGhpcworICogY2xhc3MgaXMgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZWQgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhlIHBsdWctaW4gZ2V0cworICogYWN0aXZhdGVkLiBDbGllbnRzIG11c3Qgbm90IGF0dGVtcHQgdG8gaW5zdGFudGlhdGUgcGx1Zy1pbiBydW50aW1lIGNsYXNzZXMKKyAqIGRpcmVjdGx5LgorICogPC9wPgorICogPHA+CisgKiBUaGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYW55IHBsdWctaW4gZGVjbGFyaW5nCisgKiB0aGUgSmF2YSBtb2RlbCBwbHVnLWluIGFzIGEgcHJlcmVxdWlzaXRlIHZpYSAKKyAqIDxjb2RlPkphdmFDb3JlLmdldEphdmFDb3JlKCk8L2NvZGU+LiBUaGUgSmF2YSBtb2RlbCBwbHVnLWluIHdpbGwgYmUgYWN0aXZhdGVkCisgKiBhdXRvbWF0aWNhbGx5IGlmIG5vdCBhbHJlYWR5IGFjdGl2ZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb3JlIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24geworCisJcHJpdmF0ZSBzdGF0aWMgUGx1Z2luIEpBVkFfQ09SRV9QTFVHSU4gPSBudWxsOyAKKwkvKioKKwkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIGNvcmUgc3VwcG9ydAorCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUiPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlIiA7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSmF2YSBidWlsZGVyCisJICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlciI8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gUExVR0lOX0lEICsgIi5qYXZhYnVpbGRlciIgOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEphdmEgbW9kZWwKKwkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFtb2RlbCI8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9JRCA9IFBMVUdJTl9JRCArICIuamF2YW1vZGVsIiA7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSmF2YSBuYXR1cmUKKwkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPC9jb2RlPikuCisJICogVGhlIHByZXNlbmNlIG9mIHRoaXMgbmF0dXJlIG9uIGEgcHJvamVjdCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyAKKwkgKiBKYXZhLWNhcGFibGUuCisJICoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0I2hhc05hdHVyZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRCA9IFBMVUdJTl9JRCArICIuamF2YW5hdHVyZSIgOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBOYW1lIG9mIHRoZSBoYW5kbGUgaWQgYXR0cmlidXRlIGluIGEgSmF2YSBtYXJrZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEFORExFX0lEID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXIuaGFuZGxlSWQiIDsgLy8kTk9OLU5MUy0xJAorCisJLy8gKioqKioqKioqKioqKioqIFBvc3NpYmxlIElEcyBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMuICoqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucygpCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfTElORV9OVU1CRVJfQVRUUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuZGVidWcubGluZU51bWJlciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1NPVVJDRV9GSUxFX0FUVFIgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNID0gUExVR0lOX0lEICsgIi5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9JTlZBTElEX0lNUE9SVCA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSW1wb3J0IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfT1ZFUlJJRElOR19QQUNLQUdFX0RFRkFVTFRfTUVUSE9EID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX01FVEhPRF9XSVRIX0NPTlNUUlVDVE9SX05BTUUgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2siOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfTE9DQUwgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfSU1QT1JUID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1NZTlRIRVRJQ19BQ0NFU1NfRU1VTEFUSU9OID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9OT05fTkxTX1NUUklOR19MSVRFUkFMID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9NQVhfUEVSX1VOSVQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1NPVVJDRSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX0NPTVBMSUFOQ0UgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLmNvbXBsaWFuY2UiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0pBVkFfQlVJTERfT1JERVIgPSBQTFVHSU5fSUQgKyAiLmNvbXB1dGVKYXZhQnVpbGRPcmRlciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0pBVkFfQlVJTERfUkVTT1VSQ0VfQ09QWV9GSUxURVIgPSBQTFVHSU5fSUQgKyAiLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCA9IFBMVUdJTl9JRCArICIuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfRU5DT0RJTkcgPSBQTFVHSU5fSUQgKyAiLmVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVdMSU5FX09QRU5JTkdfQlJBQ0UgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXdsaW5lLm9wZW5pbmdCcmFjZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVXTElORV9DT05UUk9MID0gUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubmV3bGluZS5jb250cm9sU3RhdGVtZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9ORVdMSU5FX0VMU0VfSUYgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXdsaW5lLmVsc2VJZiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVXTElORV9FTVBUWV9CTE9DSyA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLm5ld2xpbmUuZW1wdHlCbG9jayI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfQ0xFQVJfQkxBTktfTElORVMgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5uZXdsaW5lLmNsZWFyQWxsIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9MSU5FX1NQTElUID0gUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubGluZVNwbGl0IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9DT01QQUNUX0FTU0lHTk1FTlQgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5zdHlsZS5hc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9UQUJfQ0hBUiA9IFBMVUdJTl9JRCArICIuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhciI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfVEFCX1NJWkUgPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9WSVNJQklMSVRZX0NIRUNLID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfSU1QTElDSVRfUVVBTElGSUNBVElPTiA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmZvcmNlSW1wbGljaXRRdWFsaWZpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gKioqKioqKioqKioqKioqIFBvc3NpYmxlIHZhbHVlcyBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMuICoqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURSA9ICJnZW5lcmF0ZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX05PVF9HRU5FUkFURSA9ICJkbyBub3QgZ2VuZXJhdGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElNSVpFX09VVCA9ICJvcHRpbWl6ZSBvdXQiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfMSA9ICIxLjEiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OXzFfMiA9ICIxLjIiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl8xXzMgPSAiMS4zIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fMV80ID0gIjEuNCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQk9SVCA9ICJhYm9ydCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SID0gImVycm9yIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJ3YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFID0gImlnbm9yZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBVVEUgPSAiY29tcHV0ZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlQgPSAiaW5zZXJ0IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX05PVF9JTlNFUlQgPSAiZG8gbm90IGluc2VydCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9PTkUgPSAicHJlc2VydmUgb25lIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTCA9ICJjbGVhciBhbGwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQUNUID0gImNvbXBhY3QiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gInRhYiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgSmF2YSBjb3JlIHBsdWctaW4uCisJICovCisJcHVibGljIEphdmFDb3JlKElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IpIHsKKwkJc3VwZXIocGx1Z2luRGVzY3JpcHRvcik7CisJCUpBVkFfQ09SRV9QTFVHSU4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMuCisJICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgorCSAqCisJICogVGhpcyBsaXN0ZW5lciB3aWxsIG9ubHkgYmUgbm90aWZpZWQgZHVyaW5nIHRoZSBQT1NUX0NIQU5HRSByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCisJICogYW5kIGFueSByZWNvbmNpbGUgb3BlcmF0aW9uIChQT1NUX1JFQ09OQ0lMRSkuCisJICogRm9yIGZpbmVyIGNvbnRyb2wgb2YgdGhlIG5vdGlmaWNhdGlvbiwgdXNlIDxjb2RlPmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIsaW50KTwvY29kZT4sCisJICogd2hpY2ggYWxsb3dzIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZXZlbnRNYXNrLgorCSAqIAorCSAqIEBzZWUgRWxlbWVudENoYW5nZWRFdmVudAorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlhZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIHwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gSmF2YSBlbGVtZW50cy4KKwkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisJICogQWZ0ZXIgY29tcGxldGlvbiBvZiB0aGlzIG1ldGhvZCwgdGhlIGdpdmVuIGxpc3RlbmVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBmb3IgZXhhY3RseQorCSAqIHRoZSBzcGVjaWZpZWQgZXZlbnRzLiAgSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmb3Igb3RoZXIgZXZlbnRzLCB0aGV5CisJICogd2lsbCBiZSBkZXJlZ2lzdGVyZWQuICAKKwkgKiA8cD4KKwkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0bworCSAqIGphdmEgZWxlbWVudHMgaW4gdGhlIG1vZGVsLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUgCisJICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZXBsYWNlZCBvciByZW1vdmVkLiAKKwkgKiA8L3A+CisJICogPHA+CisJICogTGlzdGVuZXJzIGNhbiBsaXN0ZW4gZm9yIHNldmVyYWwgdHlwZXMgb2YgZXZlbnQgYXMgZGVmaW5lZCBpbiA8Y29kZT5FbGVtZW50Q2hhbmdlRXZlbnQ8L2NvZGU+LgorCSAqIENsaWVudHMgYXJlIGZyZWUgdG8gcmVnaXN0ZXIgZm9yIGFueSBudW1iZXIgb2YgZXZlbnQgdHlwZXMgaG93ZXZlciBpZiB0aGV5IHJlZ2lzdGVyCisJICogZm9yIG1vcmUgdGhhbiBvbmUsIGl0IGlzIHRoZWlyIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGV5IGNvcnJlY3RseSBoYW5kbGUgdGhlCisJICogY2FzZSB3aGVyZSB0aGUgc2FtZSBqYXZhIGVsZW1lbnQgY2hhbmdlIHNob3dzIHVwIGluIG11bHRpcGxlIG5vdGlmaWNhdGlvbnMuICAKKwkgKiBDbGllbnRzIGFyZSBndWFyYW50ZWVkIHRvIHJlY2VpdmUgb25seSB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisJICogQHBhcmFtIGV2ZW50TWFzayB0aGUgYml0LXdpc2UgT1Igb2YgYWxsIGV2ZW50IHR5cGVzIG9mIGludGVyZXN0IHRvIHRoZSBsaXN0ZW5lcgorCSAqIEBzZWUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIKKwkgKiBAc2VlIEVsZW1lbnRDaGFuZ2VkRXZlbnQKKwkgKiBAc2VlICNyZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyKQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgeworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIG1hcmtlciBhdHRyaWJ1dGUgbWFwIGZvciB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50LgorCSAqIFVzZWQgZm9yIG1hcmtlcnMsIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIG11dGFibGUgbWFya2VyIGF0dHJpYnV0ZSBtYXAgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+LAorCSAqICAgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgSmF2YSBlbGVtZW50IGZvciB3aGljaCB0aGUgbWFya2VyIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSmF2YUVsZW1lbnRNYXJrZXJBdHRyaWJ1dGVzKAorCQlNYXAgYXR0cmlidXRlcywKKwkJSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKQorCQkJZWxlbWVudCA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0Q2xhc3NGaWxlKCk7CisJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwgJiYgZWxlbWVudCAhPSBudWxsKQorCQkJYXR0cmlidXRlcy5wdXQoQVRUX0hBTkRMRV9JRCwgZWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCkpOworCX0KKwkKKwkvKioKKwkgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBtYXJrZXIgZm9yIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQuCisJICogVXNlZCBmb3IgbWFya2Vycywgd2hpY2ggZGVub3RlIGEgSmF2YSBlbGVtZW50IHJhdGhlciB0aGFuIGEgcmVzb3VyY2UuCisJICoKKwkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY29uZmlndXJlZAorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBKYXZhIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBtYXJrZXIgbmVlZHMgdG8gYmUgY29uZmlndXJlZAorCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SU1hcmtlci5zZXRBdHRyaWJ1dGU8L2NvZGU+IG9uIHRoZSBtYXJrZXIgZmFpbHMKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25maWd1cmVKYXZhRWxlbWVudE1hcmtlcihJTWFya2VyIG1hcmtlciwgSUphdmFFbGVtZW50IGVsZW1lbnQpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKQorCQkJZWxlbWVudCA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0Q2xhc3NGaWxlKCk7CisJCWlmIChtYXJrZXIgIT0gbnVsbCAmJiBlbGVtZW50ICE9IG51bGwpCisJCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVF9IQU5ETEVfSUQsIGVsZW1lbnQuZ2V0SGFuZGxlSWRlbnRpZmllcigpKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgSmF2YSBtb2RlbCBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGhhbmRsZSBpZGVudGlmaWVyCisJICogZ2VuZXJhdGVkIGJ5IDxjb2RlPklKYXZhRWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCk8L2NvZGU+LCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoU3RyaW5nIGhhbmRsZUlkZW50aWZpZXIpIHsKKwkJaWYgKGhhbmRsZUlkZW50aWZpZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRIYW5kbGVGcm9tTWVtZW50byhoYW5kbGVJZGVudGlmaWVyKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIEphdmEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmaWxlLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZpbGUKKwkgKiB3aXRoIGEgSmF2YSBlbGVtZW50LgorCSAqCisJICogPHA+VGhlIGZpbGUgbXVzdCBiZSBvbmUgb2Y6PHVsPgorCSAqCTxsaT5hIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT48L2xpPgorCSAqCTxsaT5hIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+PC9saT4KKwkgKgk8bGk+YSA8Y29kZT4uamFyPC9jb2RlPiBmaWxlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+PC9saT4KKwkgKgk8L3VsPgorCSAqIDxwPgorCSAqIENyZWF0aW5nIGEgSmF2YSBlbGVtZW50IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQorCSAqIGVsZW1lbnQncyBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCB5ZXQgb3Blbi4KKwkgKiAKKwkgKiBAcGFyYW0gdGhlIGdpdmVuIGZpbGUKKwkgKiBAcmV0dXJuIHRoZSBKYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmlsZSwgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBmaWxlCisJICogd2l0aCBhIEphdmEgZWxlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShJRmlsZSBmaWxlKSB7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZShmaWxlLCBudWxsKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCBvciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZm9sZGVyLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZvbGRlciB3aXRoIGEgSmF2YSBlbGVtZW50LgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiBhIGRlZmF1bHQgcGFja2FnZS4KKwkgKiA8cD4KKwkgKiBDcmVhdGluZyBhIEphdmEgZWxlbWVudCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGFsbCBvZiB0aGUKKwkgKiBlbGVtZW50J3MgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgeWV0IG9wZW4uCisJICogCisJICogQHBhcmFtIHRoZSBnaXZlbiBmb2xkZXIKKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50IG9yIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmb2xkZXIsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgZ2l2ZW4gZm9sZGVyIHdpdGggYSBKYXZhIGVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElKYXZhRWxlbWVudCBjcmVhdGUoSUZvbGRlciBmb2xkZXIpIHsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuY3JlYXRlKGZvbGRlciwgbnVsbCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9qZWN0LgorCSAqIDxwPgorCSAqIENyZWF0aW5nIGEgSmF2YSBQcm9qZWN0IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQorCSAqIHByb2plY3QncyBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCB5ZXQgb3Blbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgbm8gY2hlY2sgaXMgZG9uZSBhdCB0aGlzIHRpbWUgb24gdGhlIGV4aXN0ZW5jZSBvciB0aGUgamF2YSBuYXR1cmUgb2YgdGhpcyBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBnaXZlbiBwcm9qZWN0CisJICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QsIG51bGwgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKTsKKwkJcmV0dXJuIGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHJlc291cmNlLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIHJlc291cmNlCisJICogd2l0aCBhIEphdmEgZWxlbWVudC4KKwkgKiA8cD4KKwkgKiBUaGUgcmVzb3VyY2UgbXVzdCBiZSBvbmUgb2Y6PHVsPgorCSAqCTxsaT5hIHByb2plY3QgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+PC9saT4KKwkgKgk8bGk+YSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+PC9saT4KKwkgKgk8bGk+YSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPjwvbGk+CisJICoJPGxpPmEgPGNvZGU+LmphcjwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CisJICogIDxsaT5hIGZvbGRlciAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPgorCSAqCQkJb3IgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT48L2xpPgorCSAqICA8bGk+dGhlIHdvcmtzcGFjZSByb290IHJlc291cmNlIC0gdGhlIGVsZW1lbnQgcmV0dXJuZWQgaXMgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+PC9saT4KKwkgKgk8L3VsPgorCSAqIDxwPgorCSAqIENyZWF0aW5nIGEgSmF2YSBlbGVtZW50IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYW5kIG9wZW5pbmcgYWxsIG9mIHRoZQorCSAqIGVsZW1lbnQncyBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCB5ZXQgb3Blbi4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIGdpdmVuIHJlc291cmNlCisJICogQHJldHVybiB0aGUgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHJlc291cmNlLCBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIHJlc291cmNlCisJICogd2l0aCBhIEphdmEgZWxlbWVudAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50IGNyZWF0ZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuY3JlYXRlKHJlc291cmNlLCBudWxsKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgSmF2YSBtb2RlbC4KKwkgKiAKKwkgKiBAcGFyYW0gcm9vdCB0aGUgZ2l2ZW4gcm9vdAorCSAqIEByZXR1cm4gdGhlIEphdmEgbW9kZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByb290IGlzIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWwgY3JlYXRlKElXb3Jrc3BhY2VSb290IHJvb3QpIHsKKwkJaWYgKHJvb3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY2xhc3MgZmlsZSBlbGVtZW50IGZvcgorCSAqIHRoZSBnaXZlbiA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlCisJICogdG8gcmVjb2duaXplIHRoZSBjbGFzcyBmaWxlLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlIHRoZSBnaXZlbiA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUKKwkgKiBAcmV0dXJuIGEgY2xhc3MgZmlsZSBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUKKwkgKiB0byByZWNvZ25pemUgdGhlIGNsYXNzIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc0ZpbGUgY3JlYXRlQ2xhc3NGaWxlRnJvbShJRmlsZSBmaWxlKSB7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZUNsYXNzRmlsZUZyb20oZmlsZSwgbnVsbCk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBjb21waWxhdGlvbiB1bml0IGVsZW1lbnQgZm9yCisJICogdGhlIGdpdmVuIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZQorCSAqIHRvIHJlY29nbml6ZSB0aGUgY29tcGlsYXRpb24gdW5pdC4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZSB0aGUgZ2l2ZW4gPGNvZGU+LmphdmE8L2NvZGU+IGZpbGUKKwkgKiBAcmV0dXJuIGEgY29tcGlsYXRpb24gdW5pdCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gPGNvZGU+LmphdmE8L2NvZGU+IGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZQorCSAqIHRvIHJlY29nbml6ZSB0aGUgY29tcGlsYXRpb24gdW5pdAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlLCBudWxsKTsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIGdpdmVuIEpBUiBmaWxlLgorCSAqIFRoZSBKYXZhIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFSJ3MgcHJvamVjdCBtYXkgYmUKKwkgKiBjcmVhdGVkIGFzIGEgc2lkZSBlZmZlY3QuIAorCSAqIAorCSAqIEBwYXJhbSBmaWxlIHRoZSBnaXZlbiBKQVIgZmlsZQorCSAqIEByZXR1cm4gYSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBKQVIgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEpBUiBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisJICogKGZvciBleGFtcGxlLCBpZiB0aGUgSkFSIGZpbGUgcmVwcmVzZW50cyBhIG5vbi1KYXZhIHJlc291cmNlKQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlSmFyUGFja2FnZUZyYWdtZW50Um9vdEZyb20oSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5jcmVhdGVKYXJQYWNrYWdlRnJhZ21lbnRSb290RnJvbShmaWxlLCBudWxsKTsKKwl9CisKKwkvKiogCisJICogQW5zd2VycyB0aGUgcHJvamVjdCBzcGVjaWZpYyB2YWx1ZSBmb3IgYSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyLgorCSAqIEluIGNhc2UgdGhpcyBjb250YWluZXIgcGF0aCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQsIHRoZW4gd2lsbCBhbnN3ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQm90aCB0aGUgY29udGFpbmVyIHBhdGggYW5kIHRoZSBwcm9qZWN0IGNvbnRleHQgYXJlIHN1cHBvc2VkIHRvIGJlIG5vbi1udWxsLgorCSAqIDxwPgorCSAqIFRoZSBjb250YWluZXJQYXRoIGlzIGEgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLCB3aGljaCBjYW4gYmUgCisJICogdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzIGZvciByZXNvbHV0aW9uLiBJZiBubyBjb250YWluZXIgd2FzIGV2ZXIgcmVjb3JkZWQgZm9yIHRoaXMgY29udGFpbmVyIHBhdGggCisJICogb250byB0aGlzIHByb2plY3QgKHVzaW5nIDxjb2RlPnNldENsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4sIHRoZW4gYSAKKwkgKiA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gd2lsbCBiZSBhY3RpdmF0ZWQgaWYgYW55IHdhcyByZWdpc3RlcmVkIGZvciB0aGlzIGNvbnRhaW5lciAKKwkgKiBJRCBvbnRvIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi4KKwkgKiA8cD4KKwkgKiBUaGVyZSBpcyBubyBhc3N1bXB0aW9uIHRoYXQgdGhlIHJldHVybmVkIGNvbnRhaW5lciBtdXN0IGFuc3dlciB0aGUgZXhhY3Qgc2FtZSBjb250YWluZXJQYXRoCisJICogd2hlbiByZXF1ZXN0ZWQgPGNvZGU+SUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoPC9jb2RlPi4gCisJICogSW5kZWVkLCB0aGUgY29udGFpbmVyUGF0aCBpcyBqdXN0IGFuIGluZGljYXRpb24gZm9yIHJlc29sdmluZyBpdCB0byBhbiBhY3R1YWwgY29udGFpbmVyIG9iamVjdC4KKwkgKiA8cD4KKwkgKiBDbGFzc3BhdGggY29udGFpbmVyIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYnV0IAorCSAqIGFyZSBub3QgcHJlc2VydmVkIGZyb20gYSBzZXNzaW9uIHRvIGFub3RoZXIuIEl0IGlzIHRodXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHJlZ2lzdGVyIGEgCisJICogPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IGZvciBlYWNoIHJlZmVyZW5jZWQgY29udGFpbmVyIAorCSAqICh0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIikuCisJICogPHA+CisJICogQHBhcmFtIGNvbnRhaW5lclBhdGggdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciwgd2hpY2ggbmVlZHMgdG8gYmUgcmVzb2x2ZWQKKwkgKiBAcGFyYW0gcHJvamVjdCBhIHNwZWNpZmljIHByb2plY3QgaW4gd2hpY2ggdGhlIGNvbnRhaW5lciBpcyBiZWluZyByZXNvbHZlZAorCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gZmluZCBvbmUuCisJICogCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyB0aGUgY29udGFpbmVyLCBvciBpZiB0aGUgcmVzb2x2ZWQgY29udGFpbmVyCisJICogICBjb250YWlucyBpbGxlZ2FsIGVudHJpZXMgKGNvbnRhaW5zIENQRV9DT05UQUlORVIgZW50cmllcyBvciBudWxsIGVudHJpZXMpLgkgCisJICogCisJICogQHNlZSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgorCSAqIEBzZWUgSUNsYXNzcGF0aENvbnRhaW5lcgorCSAqIEBzZWUgI3NldENsYXNzcGF0aENvbnRhaW5lcihJUGF0aCwgSUphdmFQcm9qZWN0W10sIElDbGFzc3BhdGhDb250YWluZXJbXSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGdldENsYXNzcGF0aENvbnRhaW5lcihmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJTWFwIHByb2plY3RDb250YWluZXJzID0gKE1hcClKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMuZ2V0KHByb2plY3QpOworCQlpZiAocHJvamVjdENvbnRhaW5lcnMgPT0gbnVsbCl7CisJCQlwcm9qZWN0Q29udGFpbmVycyA9IG5ldyBIYXNoTWFwKDEpOworCQkJSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzLnB1dChwcm9qZWN0LCBwcm9qZWN0Q29udGFpbmVycyk7CisJCX0KKwkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcilwcm9qZWN0Q29udGFpbmVycy5nZXQoY29udGFpbmVyUGF0aCk7CisKKwkJaWYgKGNvbnRhaW5lciA9PSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lckluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlCisJCWlmIChjb250YWluZXIgPT0gbnVsbCl7CisJCQlmaW5hbCBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBpbml0aWFsaXplciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoY29udGFpbmVyUGF0aC5zZWdtZW50KDApKTsKKwkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKXsKKwkJCQlwcm9qZWN0Q29udGFpbmVycy5wdXQoY29udGFpbmVyUGF0aCwgSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpOyAvLyBhdm9pZCBpbml0aWFsaXphdGlvbiBjeWNsZXMKKwkJCQlib29sZWFuIG9rID0gZmFsc2U7CisJCQkJdHJ5IHsKKwkJCQkJLy8gd3JhcCBpbml0aWFsaXplciBjYWxsIHdpdGggU2FmZSBydW5uYWJsZSBpbiBjYXNlIGluaXRpYWxpemVyIHdvdWxkIGJlIGNhdXNpbmcgc29tZSBncmllZgorCQkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQkJCVV0aWwubG9nKGV4Y2VwdGlvbiwgIkV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBjbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVyOiAiK2luaXRpYWxpemVyKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCQkJaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJCQorCQkJCQkvLyByZXRyaWV2ZSB2YWx1ZSAoaWYgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwpCisJCQkJCWNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKXByb2plY3RDb250YWluZXJzLmdldChjb250YWluZXJQYXRoKTsKKwkJCQkJaWYgKGNvbnRhaW5lciA9PSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lckluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlCisJCQkJCW9rID0gdHJ1ZTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlpZiAoIW9rKSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMucHV0KHByb2plY3QsIG51bGwpOyAvLyBmbHVzaCBjYWNoZQorCQkJCX0KKwkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpeworCQkJCQlwcm9qZWN0Q29udGFpbmVycy5wdXQoY29udGFpbmVyUGF0aCwgY29udGFpbmVyKTsKKwkJCQl9CisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCQkJU3lzdGVtLm91dC5wcmludCgiQ1BDb250YWluZXIgSU5JVCAtIGFmdGVyIHJlc29sdXRpb246ICIgKyBjb250YWluZXJQYXRoICsgIiAtLT4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCl7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJjb250YWluZXI6ICIrY29udGFpbmVyLmdldERlc2NyaXB0aW9uKCkrIiB7Iik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKKwkJCQkJCWlmIChlbnRyaWVzICE9IG51bGwpeworCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKyl7CisJCQkJCQkJCWlmIChpID4gMCkgU3lzdGVtLm91dC5wcmludGxuKCIsICIpOy8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXNbaV0pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigifSIpOy8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigie3VuYm91bmR9Iik7Ly8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBjb250YWluZXI7CQkJCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGF0aCBoZWxkIGluIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuCisJICogUmV0dXJucyA8bm9kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYmluZC4KKwkgKiA8cD4KKwkgKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgY2xhc3NwYXRoIHZhcmlhYmxlcyBjYW4gYmUgY29udHJpYnV0ZWQgcmVnaXN0ZXJlZCBpbml0aWFsaXplcnMgZm9yLAorCSAqIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiLgorCSAqCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlCisJICogQHJldHVybiB0aGUgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSAKKwkgKiBAc2VlICNzZXRDbGFzc3BhdGhWYXJpYWJsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q2xhc3NwYXRoVmFyaWFibGUoZmluYWwgU3RyaW5nIHZhcmlhYmxlTmFtZSkgeworCisJCUlQYXRoIHZhcmlhYmxlUGF0aCA9IChJUGF0aCkgSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZUdldCh2YXJpYWJsZU5hbWUpOworCQlpZiAodmFyaWFibGVQYXRoID09IEphdmFNb2RlbE1hbmFnZXIuVmFyaWFibGVJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpIHJldHVybiBudWxsOyAvLyBicmVhayBjeWNsZQorCQkKKwkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKXsKKwkJCWZpbmFsIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBnZXRDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyKHZhcmlhYmxlTmFtZSk7CisJCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCl7CisJCQkJSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZVB1dCh2YXJpYWJsZU5hbWUsIEphdmFNb2RlbE1hbmFnZXIuVmFyaWFibGVJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpOyAvLyBhdm9pZCBpbml0aWFsaXphdGlvbiBjeWNsZXMKKwkJCQkvLyB3cmFwIGluaXRpYWxpemVyIGNhbGwgd2l0aCBTYWZlIHJ1bm5hYmxlIGluIGNhc2UgaW5pdGlhbGl6ZXIgd291bGQgYmUgY2F1c2luZyBzb21lIGdyaWVmCisJCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQkJVXRpbC5sb2coZXhjZXB0aW9uLCAiRXhjZXB0aW9uIG9jY3VycmVkIGluIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplcjogIitpbml0aWFsaXplcik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJCWluaXRpYWxpemVyLmluaXRpYWxpemUodmFyaWFibGVOYW1lKTsKKwkJCQkJfQorCQkJCX0pOworCQkJCXZhcmlhYmxlUGF0aCA9IChJUGF0aCkgSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZUdldCh2YXJpYWJsZU5hbWUpOyAvLyByZXRyeQorCQkJCWlmICh2YXJpYWJsZVBhdGggPT0gSmF2YU1vZGVsTWFuYWdlci5WYXJpYWJsZUluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlCisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDUFZhcmlhYmxlIElOSVQgLSBhZnRlciBpbml0aWFsaXphdGlvbjogIiArIHZhcmlhYmxlTmFtZSArICIgLS0+ICIgKyB2YXJpYWJsZVBhdGgpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFyaWFibGVQYXRoOworCX0KKworCS8qKgorIAkgKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplciByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHZhcmlhYmxlIGlmIGFueQorIAkgKiAKKyAJICogQHBhcmFtIHRoZSBnaXZlbiB2YXJpYWJsZQorIAkgKiBAcmV0dXJuIHRoZSBjbGllbnQgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVyIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gdmFyaWFibGUsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAJICovCisJcHJpdmF0ZSBzdGF0aWMgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciBnZXRDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyKFN0cmluZyB2YXJpYWJsZSl7CisJCQorCQlQbHVnaW4gamR0Q29yZVBsdWdpbiA9IEphdmFDb3JlLmdldFBsdWdpbigpOworCQlpZiAoamR0Q29yZVBsdWdpbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uID0gamR0Q29yZVBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSmF2YU1vZGVsTWFuYWdlci5DUFZBUklBQkxFX0lOSVRJQUxJWkVSX0VYVFBPSU5UX0lEKTsKKwkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7CisJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9ICBleHRlbnNpb24uZ2V0RXh0ZW5zaW9ucygpOworCQkJZm9yKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspeworCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQkJCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbiA9IGV4dGVuc2lvbi5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCk7CisJCQkJCWlmIChwbHVnaW4uaXNQbHVnaW5BY3RpdmF0ZWQoKSkgeworCQkJCQkJZm9yKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKXsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlTdHJpbmcgdmFyQXR0cmlidXRlID0gY29uZmlnRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKCJ2YXJpYWJsZSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWlmICh2YXJpYWJsZS5lcXVhbHModmFyQXR0cmlidXRlKSkgeworCQkJCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKSB7CisJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDUFZhcmlhYmxlIElOSVQgLSBmb3VuZCBpbml0aWFsaXplcjogIit2YXJpYWJsZSsiIC0tPiAiICsgY29uZmlnRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCX0JCQkJCQkKKwkJCQkJCQkJCU9iamVjdCBleGVjRXh0ID0gY29uZmlnRWxlbWVudHNbal0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJaWYgKGV4ZWNFeHQgaW5zdGFuY2VvZiBDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyKXsKKwkJCQkJCQkJCQlyZXR1cm4gKENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIpZXhlY0V4dDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCX0JCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwga25vd24gY2xhc3NwYXRoIHZhcmlhYmxlcy4KKwkgKiA8cD4KKwkgKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4KKwkgKiA8cD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVzCisJICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENsYXNzcGF0aFZhcmlhYmxlTmFtZXMoKSB7CisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlTmFtZXMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgdGFibGUgb2YgYWxsIGtub3duIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisJICogVGhlc2Ugb3B0aW9ucyBhbGxvdyB0byBjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgdW5kZXJseWluZyBjb21wb25lbnRzLgorCSAqIFRoZSBjbGllbnQgbWF5IHNhZmVseSB1c2UgdGhlIHJlc3VsdCBhcyBhIHRlbXBsYXRlIHRoYXQgdGhleSBjYW4gbW9kaWZ5IGFuZAorCSAqIHRoZW4gcGFzcyB0byA8Y29kZT5zZXRPcHRpb25zPC9jb2RlPi4KKwkgKiAKKwkgKiBIZWxwZXIgY29uc3RhbnRzIGhhdmUgYmVlbiBkZWZpbmVkIG9uIEphdmFDb3JlIGZvciBlYWNoIG9mIHRoZSBvcHRpb24gSUQgYW5kIAorCSAqIHRoZWlyIHBvc3NpYmxlIGNvbnN0YW50IHZhbHVlcy4KKwkgKiAKKwkgKiBOb3RlOiBtb3JlIG9wdGlvbnMgbWlnaHQgYmUgYWRkZWQgaW4gZnVydGhlciByZWxlYXNlcy4KKwkgKiA8cHJlPgorCSAqIFJFQ09HTklaRUQgT1BUSU9OUzoKKwkgKglDT01QSUxFUiAvIEdlbmVyYXRpbmcgTG9jYWwgVmFyaWFibGUgRGVidWcgQXR0cmlidXRlCisgCSAqCQlXaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgbG9jYWwgdmFyaWFibGUgbmFtZXMgCisJICoJCXRvIGJlIGRpc3BsYXllZCBpbiBkZWJ1Z2dlciwgb25seSBpbiBwbGFjZSB3aGVyZSB2YXJpYWJsZXMgYXJlIAorCSAqCQlkZWZpbml0ZWx5IGFzc2lnbmVkICguY2xhc3MgZmlsZSBpcyB0aGVuIGJpZ2dlcikKKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImdlbmVyYXRlIgorCSAqCisJICoJQ09NUElMRVIgLyBHZW5lcmF0aW5nIExpbmUgTnVtYmVyIERlYnVnIEF0dHJpYnV0ZSAKKwkgKgkJV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHNvdXJjZSBjb2RlIGhpZ2hsaWdodGluZyBpbiBkZWJ1Z2dlciAKKwkgKgkJKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKS4KKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImdlbmVyYXRlIgorCSAqCQkKKwkgKglDT01QSUxFUiAvIEdlbmVyYXRpbmcgU291cmNlIERlYnVnIEF0dHJpYnV0ZSAKKwkgKgkJV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHRoZSBkZWJ1Z2dlciB0byBwcmVzZW50IHRoZSAKKwkgKgkJY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4KKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImdlbmVyYXRlIgorCSAqCQkKKwkgKglDT01QSUxFUiAvIFByZXNlcnZpbmcgVW51c2VkIExvY2FsIFZhcmlhYmxlcworCSAqCQlVbmxlc3MgcmVxdWVzdGVkIHRvIHByZXNlcnZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMgKGkuZS4gbmV2ZXIgcmVhZCksIHRoZSAKKwkgKgkJY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIG91dCwgcG90ZW50aWFsbHkgYWx0ZXJpbmcgZGVidWdnaW5nCisJICogICAgIAkJLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCIKKwkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAicHJlc2VydmUiLCAib3B0aW1pemUgb3V0IiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJwcmVzZXJ2ZSIKKwkgKiAKKwkgKglDT01QSUxFUiAvIERlZmluaW5nIFRhcmdldCBKYXZhIFBsYXRmb3JtCisJICoJCUZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSByZWFzb24sIC5jbGFzcyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIHdpdGggY2VydGFpbiBWTSB2ZXJzaW9ucyBhbmQgbGF0ZXIuCisJICoJCU5vdGUgdGhhdCAiMS40IiB0YXJnZXQgcmVxdWlyZSB0byB0b2dnbGUgY29tcGxpYW5jZSBtb2RlIHRvICIxLjQiIHRvby4KKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJIjEuMSIKKwkgKgorCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIFVucmVhY2hhYmxlIENvZGUKKwkgKgkJVW5yZWFjaGFibGUgY29kZSBjYW4gb3B0aW9uYWxseSBiZSByZXBvcnRlZCBhcyBhbiBlcnJvciwgd2FybmluZyBvciBzaW1wbHkgCisJICoJCWlnbm9yZWQuIFRoZSBieXRlY29kZSBnZW5lcmF0aW9uIHdpbGwgYWx3YXlzIG9wdGltaXplZCBpdCBvdXQuCisJICogICAgIAkJLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiCisJICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJlcnJvciIKKwkgKgorCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIEludmFsaWQgSW1wb3J0CisJICoJCUFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgbWlnaHQgb3B0aW9uYWxseSBiZSByZXBvcnRlZCAKKwkgKgkJYXMgYW4gZXJyb3IsIGFzIGEgd2FybmluZyBvciBpZ25vcmVkLgorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEltcG9ydCIKKwkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImVycm9yIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgQXR0ZW1wdCB0byBPdmVycmlkZSBQYWNrYWdlLURlZmF1bHQgTWV0aG9kCisJICoJCUEgcGFja2FnZSBkZWZhdWx0IG1ldGhvZCBpcyBub3QgdmlzaWJsZSBpbiBhIGRpZmZlcmVudCBwYWNrYWdlLCBhbmQgdGh1cyAKKwkgKgkJY2Fubm90IGJlIG92ZXJyaWRkZW4uIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCAKKwkgKgkJc3VjaCBzY2VuYXJpaSBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAJCS0gZGVmYXVsdDoJCQkid2FybmluZyIKKwkgKgorCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIE1ldGhvZCBXaXRoIENvbnN0cnVjdG9yIE5hbWUKKwkgKgkJTmFtaW5nIGEgbWV0aG9kIHdpdGggYSBjb25zdHJ1Y3RvciBuYW1lIGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHBvb3IgCisJICoJCXN0eWxlIHByb2dyYW1taW5nLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgc3VjaCAKKwkgKgkJc2NlbmFyaWkgZWl0aGVyIGFzIGFuIGVycm9yIG9yIGEgd2FybmluZy4KKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUiCisJICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJ3YXJuaW5nIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgRGVwcmVjYXRpb24KKwkgKgkJV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgdXNlIG9mIGRlcHJlY2F0ZWQgQVBJIGVpdGhlciBhcyBhbiAKKwkgKgkJZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb24iCisJICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJ3YXJuaW5nIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgSGlkZGVuIENhdGNoIEJsb2NrCisJICoJCUxvY2FsbHkgdG8gYSB0cnkgc3RhdGVtZW50LCBzb21lIGNhdGNoIGJsb2NrcyBtYXkgaGlkZSBvdGhlcnMgLCBlLmcuCisJICoJCQl0cnkgewl0aHJvdyBuZXcgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbigpOworCSAqCQkJfSBjYXRjaCAoamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbiBlKSB7CisJICogIAkgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7fS4gCisJICoJCVdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgaGlkZGVuIAorCSAqCQljYXRjaCBibG9ja3MgY29ycmVzcG9uZGluZyB0byBjaGVja2VkIGV4Y2VwdGlvbnMKKwkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2siCisJICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJ3YXJuaW5nIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIExvY2FsCisJICoJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgbG9jYWwgCisJICoJCXZhcmlhYmxlcyAoaS5lLiB2YXJpYWJsZXMgbmV2ZXIgcmVhZCBmcm9tKQorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWwiCisJICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIAkJLSBkZWZhdWx0OgkJCSJpZ25vcmUiCisJICoKKwkgKglDT01QSUxFUiAvIFJlcG9ydGluZyBVbnVzZWQgUGFyYW1ldGVyCisJICoJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgbWV0aG9kIAorCSAqCQlwYXJhbWV0ZXJzIChpLmUuIHBhcmFtZXRlcnMgbmV2ZXIgcmVhZCBmcm9tKQorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIEltcG9ydAorCSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgdW51c2VkIGltcG9ydCAKKwkgKgkJcmVmZXJlbmNlIAorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0IgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgU3ludGhldGljIEFjY2VzcyBFbXVsYXRpb24KKwkgKgkJV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgaXQgZW11bGF0ZXMgCisJICoJCWFjY2VzcyB0byBhIG5vbi1hY2Nlc3NpYmxlIG1lbWJlciBvZiBhbiBlbmNsb3NpbmcgdHlwZS4gU3VjaCBhY2Nlc3MgY2FuIGhhdmUKKwkgKgkJcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uIgorCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqCisJICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgTm9uLUV4dGVybmFsaXplZCBTdHJpbmcgTGl0ZXJhbAorCSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3Igbm9uIGV4dGVybmFsaXplZCAKKwkgKgkJU3RyaW5nIGxpdGVyYWwgKGkuZS4gbm9uIHRhZ2dlZCB3aXRoIC8vJE5PTi1OTFMtPG4+JCkuIAorCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCIKKwkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImlnbm9yZSIKKwkgKiAKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVc2FnZSBvZiAnYXNzZXJ0JyBJZGVudGlmaWVyCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgJ2Fzc2VydCcgaXMgCisJICogICAgdXNlZCBhcyBhbiBpZGVudGlmaWVyIChyZXNlcnZlZCBrZXl3b3JkIGluIDEuNCkKKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqIAorCSAqIENPTVBJTEVSIC8gU2V0dGluZyBTb3VyY2UgQ29tcGF0aWJpbGl0eSBNb2RlCisJICogICAgU3BlY2lmeSB3aGV0aGVyIHNvdXJjZSBpcyAxLjMgb3IgMS40IGNvbXBhdGlibGUuIEZyb20gMS40IG9uLCAnYXNzZXJ0JyBpcyBhIGtleXdvcmQKKwkgKiAgICByZXNlcnZlZCBmb3IgYXNzZXJ0aW9uIHN1cHBvcnQuIEFsc28gbm90ZSwgdGhhbiB3aGVuIHRvZ2dsaW5nIHRvIDEuNCBtb2RlLCB0aGUgdGFyZ2V0IFZNCisJICogICBsZXZlbCBzaG91bGQgYmUgc2V0IHRvICIxLjQiIGFuZCB0aGUgY29tcGxpYW5jZSBtb2RlIHNob3VsZCBiZSAiMS40Ii4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgIjEuMyIsICIxLjQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OgkJCSIxLjMiCisJICogCisJICogQ09NUElMRVIgLyBTZXR0aW5nIENvbXBsaWFuY2UgTGV2ZWwKKwkgKiAgICBTZWxlY3QgdGhlIGNvbXBsaWFuY2UgbGV2ZWwgZm9yIHRoZSBjb21waWxlci4gSW4gIjEuMyIgbW9kZSwgc291cmNlIGFuZCB0YXJnZXQgc2V0dGluZ3MKKwkgKiAgICBzaG91bGQgbm90IGdvIGJleW9uZCAiMS4zIiBsZXZlbC4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICIxLjMiLCAiMS40IiB9CisJICogICAgIC0gZGVmYXVsdDoJCQkiMS4zIgorCSAqIAorCSAqIENPTVBJTEVSIC8gTWF4aW11bSBudW1iZXIgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgcGVyIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiAgICBTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBvbiBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CSI8bj4iIHdoZXJlIDxuPiBpcyB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlciAoaWYgemVybyB0aGVuIGFsbCBwcm9ibGVtcyBhcmUgcmVwb3J0ZWQpLgorCSAqICAgICAtIGRlZmF1bHQ6CQkJIjEwMCIKKwkgKiAKKwkgKiBCVUlMREVSIC8gU3BlY2lmeWluZyBGaWx0ZXJzIGZvciBSZXNvdXJjZSBDb3B5aW5nIENvbnRyb2wKKwkgKiAgICBBbGxvdyB0byBzcGVjaWZ5IHNvbWUgZmlsdGVycyB0byBjb250cm9sIHRoZSByZXNvdXJjZSBjb3B5IHByb2Nlc3MuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgIjxuYW1lPlssPG5hbWU+XSogfSB3aGVyZSA8bmFtZT4gaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAob25seSAqIHdpbGQtY2FyZHMgYWxsb3dlZCkKKwkgKiAgICAgICBvciB0aGUgbmFtZSBvZiBhIGZvbGRlciB3aGljaCBlbmRzIHdpdGggJy8nCisJICogICAgIC0gZGVmYXVsdDoJCQkiIgorCSAqIAorCSAqIEJVSUxERVIgLyBBYm9ydCBpZiBJbnZhbGlkIENsYXNzcGF0aAorCSAqICAgIEFsbG93IHRvIHRvZ2dsZSB0aGUgYnVpbGRlciB0byBhYm9ydCBpZiB0aGUgY2xhc3NwYXRoIGlzIGludmFsaWQKKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImFib3J0IiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJImlnbm9yZSIKKwkgKiAKKwkgKglKQVZBQ09SRSAvIENvbXB1dGluZyBQcm9qZWN0IEJ1aWxkIE9yZGVyCisJICogICAgSW5kaWNhdGUgd2hldGhlciBKYXZhQ29yZSBzaG91bGQgZW5mb3JjZSB0aGUgcHJvamVjdCBidWlsZCBvcmRlciB0byBiZSBiYXNlZCBvbgorCSAqICAgIHRoZSBjbGFzc3BhdGggcHJlcmVxdWlzaXRlIGNoYWluLiBXaGVuIHJlcXVlc3RpbmcgdG8gY29tcHV0ZSwgdGhpcyB0YWtlcyBvdmVyCisJICogICAgdGhlIHBsYXRmb3JtIGRlZmF1bHQgb3JkZXIgKGJhc2VkIG9uIHByb2plY3QgcmVmZXJlbmNlcykuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21wdXRlSmF2YUJ1aWxkT3JkZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJjb21wdXRlIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJImlnbm9yZSIJIAorCSAqIAorCSAqIEpBVkFDT1JFIC8gU3BlY2lmeSBEZWZhdWx0IFNvdXJjZSBFbmNvZGluZyBGb3JtYXQKKwkgKiAgICBHZXQgdGhlIGVuY29kaW5nIGZvcm1hdCBmb3IgY29tcGlsZWQgc291cmNlcy4gVGhpcyBzZXR0aW5nIGlzIHJlYWQtb25seSwgaXQgaXMgZXF1aXZhbGVudAorCSAqICAgIHRvICdSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKScuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5lbmNvZGluZyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgYW55IG9mIHRoZSBzdXBwb3J0ZWQgZW5jb2RpbmcgbmFtZX0uCisJICogICAgIC0gZGVmYXVsdDoJCQk8cGxhdGZvcm0gZGVmYXVsdD4KKwkgKiAKKwkgKglGT1JNQVRURVIgLyBJbnNlcnRpbmcgTmV3IExpbmUgQmVmb3JlIE9wZW5pbmcgQnJhY2UKKwkgKiAgICBXaGVuIEluc2VydCwgYSBuZXcgbGluZSBpcyBpbnNlcnRlZCBiZWZvcmUgYW4gb3BlbmluZyBicmFjZSwgb3RoZXJ3aXNlIG5vdGhpbmcKKwkgKiAgICBpcyBpbnNlcnRlZAorCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUub3BlbmluZ0JyYWNlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OgkJCSJkbyBub3QgaW5zZXJ0IgorCSAqIAorCSAqCUZPUk1BVFRFUiAvIEluc2VydGluZyBOZXcgTGluZSBJbnNpZGUgQ29udHJvbCBTdGF0ZW1lbnQKKwkgKiAgICBXaGVuIEluc2VydCwgYSBuZXcgbGluZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIH0gYW5kIGZvbGxvd2luZyBlbHNlLCBjYXRjaCwgZmluYWxseQorCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUuY29udHJvbFN0YXRlbWVudCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9CisJICogICAgIC0gZGVmYXVsdDoJCQkiZG8gbm90IGluc2VydCIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBDbGVhcmluZyBCbGFuayBMaW5lcworCSAqICAgIFdoZW4gQ2xlYXIgYWxsLCBhbGwgYmxhbmsgbGluZXMgYXJlIHJlbW92ZWQuIFdoZW4gUHJlc2VydmUgb25lLCBvbmx5IG9uZSBpcyBrZXB0CisJICogICAgYW5kIGFsbCBvdGhlcnMgcmVtb3ZlZC4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmNsZWFyQWxsIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiY2xlYXIgYWxsIiwgInByZXNlcnZlIG9uZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJInByZXNlcnZlIG9uZSIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBJbnNlcnRpbmcgTmV3IExpbmUgQmV0d2VlbiBFbHNlL0lmIAorCSAqICAgIFdoZW4gSW5zZXJ0LCBhIGJsYW5rIGxpbmUgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBhbiBlbHNlIGFuZCBhbiBpZiB3aGVuIHRoZXkgYXJlIAorCSAqICAgIGNvbnRpZ3VvdXMuIFdoZW4gY2hvb3NpbmcgdG8gbm90IGluc2VydCwgZWxzZS1pZiB3aWxsIGJlIGtlcHQgb24gdGhlIHNhbWUKKwkgKiAgICBsaW5lIHdoZW4gcG9zc2libGUuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5lbHNlSWYiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJpbnNlcnQiLCAiZG8gbm90IGluc2VydCIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJImRvIG5vdCBpbnNlcnQiCisJICogCisJICoJRk9STUFUVEVSIC8gSW5zZXJ0aW5nIE5ldyBMaW5lIEluIEVtcHR5IEJsb2NrCisJICogICAgV2hlbiBpbnNlcnQsIGEgbGluZSBicmVhayBpcyBpbnNlcnRlZCBiZXR3ZWVuIGNvbnRpZ3VvdXMgeyBhbmQgfSwgaWYgfSBpcyBub3QgZm9sbG93ZWQKKwkgKiAgICBieSBhIGtleXdvcmQuCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5lbXB0eUJsb2NrIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OgkJCSJpbnNlcnQiCisJICogCisJICoJRk9STUFUVEVSIC8gU3BsaXR0aW5nIExpbmVzIEV4Y2VlZGluZyBMZW5ndGgKKwkgKiAgICBFbmFibGUgc3BsaXR0aW5nIG9mIGxvbmcgbGluZXMgKGV4Y2VlZGluZyB0aGUgY29uZmlndXJhYmxlIGxlbmd0aCkuIExlbmd0aCBvZiAwIHdpbGwKKwkgKiAgICBkaXNhYmxlIGxpbmUgc3BsaXR0aW5nCisJICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJIjxuPiIsIHdoZXJlIG4gaXMgemVybyBvciBhIHBvc2l0aXZlIGludGVnZXIKKwkgKiAgICAgLSBkZWZhdWx0OgkJCSI4MCIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBDb21wYWN0aW5nIEFzc2lnbm1lbnQKKwkgKiAgICBBc3NpZ25tZW50cyBjYW4gYmUgZm9ybWF0dGVkIGFzeW1tZXRyaWNhbGx5LCBlLmcuICdpbnQgeD0gMjsnLCB3aGVuIE5vcm1hbCwgYSBzcGFjZQorCSAqICAgIGlzIGluc2VydGVkIGJlZm9yZSB0aGUgYXNzaWdubWVudCBvcGVyYXRvcgorCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnN0eWxlLmFzc2lnbm1lbnQiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJjb21wYWN0IiwgIm5vcm1hbCIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJIm5vcm1hbCIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBEZWZpbmluZyBJbmRlbnRhdGlvbiBDaGFyYWN0ZXIKKwkgKiAgICBFaXRoZXIgY2hvb3NlIHRvIGluZGVudCB3aXRoIHRhYiBjaGFyYWN0ZXJzIG9yIHNwYWNlcworCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgInRhYiIsICJzcGFjZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6CQkJInRhYiIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBEZWZpbmluZyBTcGFjZSBJbmRlbnRhdGlvbiBMZW5ndGgKKwkgKiAgICBXaGVuIHVzaW5nIHNwYWNlcywgc2V0IHRoZSBhbW91bnQgb2Ygc3BhY2UgY2hhcmFjdGVycyB0byB1c2UgZm9yIGVhY2ggCisJICogICAgaW5kZW50YXRpb24gbWFyay4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemUiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgkiPG4+Iiwgd2hlcmUgbiBpcyBhIHBvc2l0aXZlIGludGVnZXIKKwkgKiAgICAgLSBkZWZhdWx0OgkJCSI0IgorCSAqIAorCSAqCUNPREVBU1NJU1QgLyBBY3RpdmF0ZSBWaXNpYmlsaXR5IFNlbnNpdGl2ZSBDb21wbGV0aW9uCisJICogICAgV2hlbiBhY3RpdmUsIGNvbXBsZXRpb24gZG9lc24ndCBzaG93IHRoYXQgeW91IGNhbiBub3Qgc2VlCisJICogICAgKGUuZy4geW91IGNhbiBub3Qgc2VlIHByaXZhdGUgbWV0aG9kcyBvZiBhIHN1cGVyIGNsYXNzKS4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS52aXNpYmlsaXR5Q2hlY2siCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisJICogICAgIC0gZGVmYXVsdDoJCQkiZGlzYWJsZWQiCisJICogCisJICoJQ09ERUFTU0lTVCAvIEF1dG9tYXRpYyBRdWFsaWZpY2F0aW9uIG9mIEltcGxpY2l0IE1lbWJlcnMKKwkgKiAgICBXaGVuIGFjdGl2ZSwgY29tcGxldGlvbiBhdXRvbWF0aWNhbGx5IHF1YWxpZmllcyBjb21wbGV0aW9uIG9uIGltcGxpY2l0CisJICogICAgZmllbGQgcmVmZXJlbmNlcyBhbmQgbWVzc2FnZSBleHByZXNzaW9ucy4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OgkJCSJkaXNhYmxlZCIKKwkgKiA8L3ByZT4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgbXV0YWJsZSB0YWJsZSBjb250YWluaW5nIHRoZSBkZWZhdWx0IHNldHRpbmdzIG9mIGFsbCBrbm93biBvcHRpb25zCisJICogICAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCisJICogQHNlZSAjc2V0T3B0aW9ucworCSAqLworIAlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXREZWZhdWx0T3B0aW9ucygpeworCQorCQlIYXNodGFibGUgZGVmYXVsdE9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKKworCQkvLyBzZWUgI2luaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSBmb3IgY2hhbmdpbmcgZGVmYXVsdCBzZXR0aW5ncworCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCUhhc2hTZXQgb3B0aW9uTmFtZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5PcHRpb25OYW1lczsKKwkJCisJCS8vIGdldCBwcmVmZXJlbmNlcyBzZXQgdG8gdGhlaXIgZGVmYXVsdAorCQlTdHJpbmdbXSBkZWZhdWx0UHJvcGVydHlOYW1lcyA9IHByZWZlcmVuY2VzLmRlZmF1bHRQcm9wZXJ0eU5hbWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdFByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspeworCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGRlZmF1bHRQcm9wZXJ0eU5hbWVzW2ldOworCQkJaWYgKG9wdGlvbk5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKKwkJCQlkZWZhdWx0T3B0aW9ucy5wdXQocHJvcGVydHlOYW1lLCBwcmVmZXJlbmNlcy5nZXREZWZhdWx0U3RyaW5nKHByb3BlcnR5TmFtZSkpOworCQkJfQorCQl9CQkKKwkJLy8gZ2V0IHByZWZlcmVuY2VzIG5vdCBzZXQgdG8gdGhlaXIgZGVmYXVsdAorCQlTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzID0gcHJlZmVyZW5jZXMucHJvcGVydHlOYW1lcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspeworCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07CisJCQlpZiAob3B0aW9uTmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKSkgeworCQkJCWRlZmF1bHRPcHRpb25zLnB1dChwcm9wZXJ0eU5hbWUsIHByZWZlcmVuY2VzLmdldERlZmF1bHRTdHJpbmcocHJvcGVydHlOYW1lKSk7CisJCQl9CisJCX0JCQorCQkvLyBnZXQgZW5jb2RpbmcgdGhyb3VnaCByZXNvdXJjZSBwbHVnaW4KKwkJZGVmYXVsdE9wdGlvbnMucHV0KENPUkVfRU5DT0RJTkcsIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpKTsgCisJCQorCQlyZXR1cm4gZGVmYXVsdE9wdGlvbnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbiBydW50aW1lIGNsYXNzLgorCSAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+KEphdmFDb3JlKSBnZXRQbHVnaW4oKTwvY29kZT4uCisJICogCisJICogQHJldHVybiB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbiBydW50aW1lIGNsYXNzCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQ29yZSBnZXRKYXZhQ29yZSgpIHsKKwkJcmV0dXJuIChKYXZhQ29yZSkgZ2V0UGx1Z2luKCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIGdpdmVuIDxjb2RlPklQcm9qZWN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisJICogcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgSmF2YSBuYXR1cmUuCisJICogCisJICogQHBhcmFtIHRoZSBnaXZlbiA8Y29kZT5JUHJvamVjdDwvY29kZT4KKwkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgKiBnaXZlbiA8Y29kZT5JUHJvamVjdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorCSAqIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhIEphdmEgbmF0dXJlCisJICovCisJcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQl0cnkgeworCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKE5BVFVSRV9JRCkpIHsKKwkJCQlKYXZhTW9kZWwgbW9kZWwgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKTsKKwkJCQlpZiAobW9kZWwgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogSGVscGVyIG1ldGhvZCBmb3IgcmV0dXJuaW5nIG9uZSBvcHRpb24gdmFsdWUgb25seS4gRXF1aXZhbGVudCB0byA8Y29kZT4oU3RyaW5nKUphdmFDb3JlLmdldE9wdGlvbnMoKS5nZXQob3B0aW9uTmFtZSk8L2NvZGU+CisJICogTm90ZSB0aGF0IGl0IG1heSBhbnN3ZXIgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcHRpb24gZG9lcyBub3QgZXhpc3QuCisJICogPHA+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gb3B0aW9uTmFtZSB0aGUgbmFtZSBvZiBhbiBvcHRpb24KKwkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgb2YgYSBnaXZlbiBvcHRpb24KKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSkgeworCQkKKwkJaWYgKENPUkVfRU5DT0RJTkcuZXF1YWxzKG9wdGlvbk5hbWUpKXsKKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTsKKwkJfQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuT3B0aW9uTmFtZXMuY29udGFpbnMob3B0aW9uTmFtZSkpeworCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldFN0cmluZyhvcHRpb25OYW1lKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdGFibGUgb2YgdGhlIGN1cnJlbnQgb3B0aW9ucy4gSW5pdGlhbGx5LCBhbGwgb3B0aW9ucyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLAorCSAqIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgdGFibGUgdGhhdCBpbmNsdWRlcyBhbGwga25vd24gb3B0aW9ucy4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gdGFibGUgb2YgY3VycmVudCBzZXR0aW5ncyBvZiBhbGwgb3B0aW9ucyAKKwkgKiAgIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPikKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0T3B0aW9ucygpIHsKKwkJCisJCUhhc2h0YWJsZSBvcHRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7CisKKwkJLy8gc2VlICNpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgZm9yIGNoYW5naW5nIGRlZmF1bHQgc2V0dGluZ3MKKwkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuT3B0aW9uTmFtZXM7CisJCQorCQkvLyBnZXQgcHJlZmVyZW5jZXMgc2V0IHRvIHRoZWlyIGRlZmF1bHQKKwkJU3RyaW5nW10gZGVmYXVsdFByb3BlcnR5TmFtZXMgPSBwcmVmZXJlbmNlcy5kZWZhdWx0UHJvcGVydHlOYW1lcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRQcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBkZWZhdWx0UHJvcGVydHlOYW1lc1tpXTsKKwkJCWlmIChvcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKXsKKwkJCQlvcHRpb25zLnB1dChwcm9wZXJ0eU5hbWUsIHByZWZlcmVuY2VzLmdldFN0cmluZyhwcm9wZXJ0eU5hbWUpKTsKKwkJCX0KKwkJfQkJCisJCS8vIGdldCBwcmVmZXJlbmNlcyBub3Qgc2V0IHRvIHRoZWlyIGRlZmF1bHQKKwkJU3RyaW5nW10gcHJvcGVydHlOYW1lcyA9IHByZWZlcmVuY2VzLnByb3BlcnR5TmFtZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzW2ldOworCQkJaWYgKG9wdGlvbk5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpeworCQkJCW9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHByb3BlcnR5TmFtZSkpOworCQkJfQorCQl9CQkKKwkJLy8gZ2V0IGVuY29kaW5nIHRocm91Z2ggcmVzb3VyY2UgcGx1Z2luCisJCW9wdGlvbnMucHV0KENPUkVfRU5DT0RJTkcsIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpKTsKKworCQlyZXR1cm4gb3B0aW9uczsKKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgSmF2YSBjb3JlIHBsdWctaW4gcnVudGltZSBjbGFzcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIEphdmEgY29yZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBsdWdpbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBKQVZBX0NPUkVfUExVR0lOOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgZGVub3RlZCAKKwkgKiBieSBhIGdpdmVuIGVudHJ5IChpZiBpdCBpcyBhIHZhcmlhYmxlIGVudHJ5KS4gSXQgaXMgb2J0YWluZWQgYnkgcmVzb2x2aW5nIHRoZSB2YXJpYWJsZSAKKwkgKiByZWZlcmVuY2UgaW4gdGhlIGZpcnN0IHNlZ21lbnQuIFJldHVybnMgPG5vZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlc29sdmUgdXNpbmcgCisJICogdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisJICogPHVsPgorCSAqIDxsaT4gaWYgdmFyaWFibGUgc2VnbWVudCBjYW5ub3QgYmUgcmVzb2x2ZWQsIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT48L2xpPgorCSAqIDxsaT4gZmluZHMgYSBwcm9qZWN0LCBKQVIgb3IgYmluYXJ5IGZvbGRlciBpbiB0aGUgd29ya3NwYWNlIGF0IHRoZSByZXNvbHZlZCBwYXRoIGxvY2F0aW9uPC9saT4KKwkgKiA8bGk+IGlmIG5vbmUgZmluZHMgYW4gZXh0ZXJuYWwgSkFSIGZpbGUgb3IgZm9sZGVyIG91dHNpZGUgdGhlIHdvcmtzcGFjZSBhdCB0aGUgcmVzb2x2ZWQgcGF0aCBsb2NhdGlvbiA8L2xpPgorCSAqIDxsaT4gaWYgbm9uZSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqIDxwPgorCSAqIFZhcmlhYmxlIHNvdXJjZSBhdHRhY2htZW50IHBhdGggYW5kIHJvb3QgcGF0aCBhcmUgYWxzbyByZXNvbHZlZCBhbmQgcmVjb3JkZWQgaW4gdGhlIHJlc3VsdGluZyBjbGFzc3BhdGggZW50cnkuCisJICogPHA+CisJICogTk9URTogVGhpcyBoZWxwZXIgbWV0aG9kIGRvZXMgbm90IGhhbmRsZSBjbGFzc3BhdGggY29udGFpbmVycywgZm9yIHdoaWNoIHNob3VsZCByYXRoZXIgYmUgdXNlZAorCSAqIDxjb2RlPkphdmFDb3JlI2dldFJlc29sdmVkQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiAKKwkgKiBAcGFyYW0gZW50cnkgdGhlIGdpdmVuIHZhcmlhYmxlIGVudHJ5CisJICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbGlicmFyeSBvciBwcm9qZWN0IGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiAgIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBlbnRyeSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYSB2YWxpZCBjbGFzc3BhdGggZW50cnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgeworCisJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKQorCQkJcmV0dXJuIGVudHJ5OworCisJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOworCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCByZXNvbHZlZFBhdGgsIGZhbHNlKTsKKwkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gaW5zaWRlIHRoZSB3b3Jrc3BhY2UKKwkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJSVJlc291cmNlIHJlc29sdmVkUmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7CisJCQlpZiAocmVzb2x2ZWRSZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJc3dpdGNoIChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSkgeworCQkJCQkKKwkJCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6ICAKKwkJCQkJCS8vIGludGVybmFsIHByb2plY3QKKwkJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocmVzb2x2ZWRQYXRoLCBlbnRyeS5pc0V4cG9ydGVkKCkpOworCQkJCQkJCisJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOiAKKwkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvbHZlZFJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkgfHwgInppcCIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSB7ICAvLyROT04tTkxTLTEkCisJCQkJCQkJLy8gaW50ZXJuYWwgYmluYXJ5IGFyY2hpdmUKKwkJCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KAorCQkJCQkJCQkJcmVzb2x2ZWRQYXRoLAorCQkJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksCisJCQkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSksCisJCQkJCQkJCQllbnRyeS5pc0V4cG9ydGVkKCkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCQkKKwkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDogCisJCQkJCQkvLyBpbnRlcm5hbCBiaW5hcnkgZm9sZGVyCisJCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KAorCQkJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQkJCWdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpLAorCQkJCQkJCQlnZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSksCisJCQkJCQkJCWVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vIG91dHNpZGUgdGhlIHdvcmtzcGFjZQorCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmlsZSkgeworCQkJRmlsZSBleHRlcm5hbEZpbGUgPSAoRmlsZSkgdGFyZ2V0OworCQkJaWYgKGV4dGVybmFsRmlsZS5pc0ZpbGUoKSkgeworCQkJCVN0cmluZyBmaWxlTmFtZSA9IGV4dGVybmFsRmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiICAvLyROT04tTkxTLTEkCisJCQkJCSkgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiICAvLyROT04tTkxTLTEkCisJCQkJCSkpIHsgLy8gZXh0ZXJuYWwgYmluYXJ5IGFyY2hpdmUKKwkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKKwkJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpLAorCQkJCQkJCWVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcgorCQkJCWlmIChyZXNvbHZlZFBhdGguaXNBYnNvbHV0ZSgpKXsKKwkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKKwkJCQkJCQlyZXNvbHZlZFBhdGgsCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSksCisJCQkJCQkJZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpLAorCQkJCQkJCWVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCisJLyoqCisJICogUmVzb2x2ZSBhIHZhcmlhYmxlIHBhdGggKGhlbHBlciBtZXRob2QpCisJICogCisJICogQHBhcmFtIHZhcmlhYmxlUGF0aCB0aGUgZ2l2ZW4gdmFyaWFibGUgcGF0aAorCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHZhcmlhYmxlIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgoSVBhdGggdmFyaWFibGVQYXRoKSB7CisKKwkJaWYgKHZhcmlhYmxlUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWludCBjb3VudCA9IHZhcmlhYmxlUGF0aC5zZWdtZW50Q291bnQoKTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBsb29rdXAgdmFyaWFibGUJCisJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZVBhdGguc2VnbWVudCgwKTsKKwkJSVBhdGggcmVzb2x2ZWRQYXRoID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lKTsKKwkJaWYgKHJlc29sdmVkUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gYXBwZW5kIHBhdGggc3VmZml4CisJCWlmIChjb3VudCA+IDEpIHsKKwkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkUGF0aC5hcHBlbmQodmFyaWFibGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOworCQl9CisJCXJldHVybiByZXNvbHZlZFBhdGg7IAorCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIHNoYXJlZCB3b3JraW5nIGNvcGllcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBidWZmZXIgZmFjdG9yeS4gCisJICogV29ya2luZyBjb3BpZXMgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGNsaWVudHMgdXNpbmcgdGhlIHNhbWUgYnVmZmVyIGZhY3Rvcnksc2VlIAorCSAqIDxjb2RlPklXb3JraW5nQ29weSMjZ2V0U2hhcmVkV29ya2luZ0NvcHk8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBmYWN0b3J5IHRoZSBnaXZlbiBidWZmZXIgZmFjdG9yeQorCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2hhcmVkIHdvcmtpbmcgY29waWVzIGZvciBhIGdpdmVuIGJ1ZmZlciBmYWN0b3J5CisJICogQHNlZSBJV29ya2luZ0NvcHkKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJV29ya2luZ0NvcHlbXSBnZXRTaGFyZWRXb3JraW5nQ29waWVzKElCdWZmZXJGYWN0b3J5IGZhY3RvcnkpeworCQkKKwkJLy8gaWYgZmFjdG9yeSBpcyBudWxsLCBkZWZhdWx0IGZhY3RvcnkgbXVzdCBiZSB1c2VkCisJCWlmIChmYWN0b3J5ID09IG51bGwpIGZhY3RvcnkgPSBCdWZmZXJNYW5hZ2VyLmdldERlZmF1bHRCdWZmZXJNYW5hZ2VyKCkuZ2V0RGVmYXVsdEJ1ZmZlckZhY3RvcnkoKTsKKwkJTWFwIHNoYXJlZFdvcmtpbmdDb3BpZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5zaGFyZWRXb3JraW5nQ29waWVzOworCQkKKwkJTWFwIHBlckZhY3RvcnlXb3JraW5nQ29waWVzID0gKE1hcCkgc2hhcmVkV29ya2luZ0NvcGllcy5nZXQoZmFjdG9yeSk7CisJCWlmIChwZXJGYWN0b3J5V29ya2luZ0NvcGllcyA9PSBudWxsKSByZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5Ob1dvcmtpbmdDb3B5OworCQlDb2xsZWN0aW9uIGNvcGllcyA9IHBlckZhY3RvcnlXb3JraW5nQ29waWVzLnZhbHVlcygpOworCQlJV29ya2luZ0NvcHlbXSByZXN1bHQgPSBuZXcgSVdvcmtpbmdDb3B5W2NvcGllcy5zaXplKCldOworCQljb3BpZXMudG9BcnJheShyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBzZXR0aW5ncyBmb3IgdGhpcyBwbHVnLWluLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7CisJCQorCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCUhhc2hTZXQgb3B0aW9uTmFtZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5PcHRpb25OYW1lczsKKwkJCisJCS8vIENvbXBpbGVyIHNldHRpbmdzCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUiwgR0VORVJBVEUpOworCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9MSU5FX05VTUJFUl9BVFRSLCBHRU5FUkFURSk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfTElORV9OVU1CRVJfQVRUUik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9TT1VSQ0VfRklMRV9BVFRSLCBHRU5FUkFURSk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfU09VUkNFX0ZJTEVfQVRUUik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9DT0RFR0VOX1VOVVNFRF9MT0NBTCwgUFJFU0VSVkUpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX0NPREVHRU5fVU5VU0VEX0xPQ0FMKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBWRVJTSU9OXzFfMSk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0pOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfVU5SRUFDSEFCTEVfQ09ERSwgRVJST1IpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX1VOUkVBQ0hBQkxFX0NPREUpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfSU5WQUxJRF9JTVBPUlQsIEVSUk9SKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9JTlZBTElEX0lNUE9SVCk7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9PVkVSUklESU5HX1BBQ0tBR0VfREVGQVVMVF9NRVRIT0QsIFdBUk5JTkcpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX09WRVJSSURJTkdfUEFDS0FHRV9ERUZBVUxUX01FVEhPRCk7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9NRVRIT0RfV0lUSF9DT05TVFJVQ1RPUl9OQU1FLCBXQVJOSU5HKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9NRVRIT0RfV0lUSF9DT05TVFJVQ1RPUl9OQU1FKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OLCBXQVJOSU5HKTsKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgV0FSTklORyk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX1VOVVNFRF9MT0NBTCwgSUdOT1JFKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9VTlVTRURfTE9DQUwpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUiwgSUdOT1JFKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX1VOVVNFRF9JTVBPUlQsIElHTk9SRSk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfVU5VU0VEX0lNUE9SVCk7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9TWU5USEVUSUNfQUNDRVNTX0VNVUxBVElPTiwgSUdOT1JFKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9TWU5USEVUSUNfQUNDRVNTX0VNVUxBVElPTik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9OT05fTkxTX1NUUklOR19MSVRFUkFMLCBJR05PUkUpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX05PTl9OTFNfU1RSSU5HX0xJVEVSQUwpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIElHTk9SRSk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfU09VUkNFLCBWRVJTSU9OXzFfMyk7CisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9TT1VSQ0UpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfQ09NUExJQU5DRSwgVkVSU0lPTl8xXzMpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX0NPTVBMSUFOQ0UpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfTUFYX1BFUl9VTklULCAiMTAwIik7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX01BWF9QRVJfVU5JVCk7CisJCQorCQkvLyBCdWlsZGVyIHNldHRpbmdzCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfSkFWQV9CVUlMRF9SRVNPVVJDRV9DT1BZX0ZJTFRFUik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgsIEFCT1JUKTsgCisJCW9wdGlvbk5hbWVzLmFkZChDT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgpOworCQkKKwkJLy8gSmF2YUNvcmUgc2V0dGluZ3MKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT1JFX0pBVkFfQlVJTERfT1JERVIsIElHTk9SRSk7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfSkFWQV9CVUlMRF9PUkRFUik7CisJCisJCS8vIEZvcm1hdHRlciBzZXR0aW5ncworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEZPUk1BVFRFUl9ORVdMSU5FX09QRU5JTkdfQlJBQ0UsIERPX05PVF9JTlNFUlQpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKEZPUk1BVFRFUl9ORVdMSU5FX09QRU5JTkdfQlJBQ0UpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX05FV0xJTkVfQ09OVFJPTCwgRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfTkVXTElORV9DT05UUk9MKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEZPUk1BVFRFUl9DTEVBUl9CTEFOS19MSU5FUywgUFJFU0VSVkVfT05FKTsgCisJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfQ0xFQVJfQkxBTktfTElORVMpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX05FV0xJTkVfRUxTRV9JRiwgRE9fTk9UX0lOU0VSVCk7CisJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfTkVXTElORV9FTFNFX0lGKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEZPUk1BVFRFUl9ORVdMSU5FX0VNUFRZX0JMT0NLLCBJTlNFUlQpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKEZPUk1BVFRFUl9ORVdMSU5FX0VNUFRZX0JMT0NLKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEZPUk1BVFRFUl9MSU5FX1NQTElULCAiODAiKTsgLy8kTk9OLU5MUy0xJAorCQlvcHRpb25OYW1lcy5hZGQoRk9STUFUVEVSX0xJTkVfU1BMSVQpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX0NPTVBBQ1RfQVNTSUdOTUVOVCwgTk9STUFMKTsgCisJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfQ09NUEFDVF9BU1NJR05NRU5UKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEZPUk1BVFRFUl9UQUJfQ0hBUiwgVEFCKTsgCisJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfVEFCX0NIQVIpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX1RBQl9TSVpFLCAiNCIpOyAvLyROT04tTkxTLTEkIAorCQlvcHRpb25OYW1lcy5hZGQoRk9STUFUVEVSX1RBQl9TSVpFKTsKKwkJCisJCS8vIENvZGVBc3Npc3Qgc2V0dGluZ3MKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX1ZJU0lCSUxJVFlfQ0hFQ0ssIERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAorCQlvcHRpb25OYW1lcy5hZGQoQ09ERUFTU0lTVF9WSVNJQklMSVRZX0NIRUNLKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPREVBU1NJU1RfSU1QTElDSVRfUVVBTElGSUNBVElPTiwgRElTQUJMRUQpOyAvLyROT04tTkxTLTEkCisJCW9wdGlvbk5hbWVzLmFkZChDT0RFQVNTSVNUX0lNUExJQ0lUX1FVQUxJRklDQVRJT04pOworCQkKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrZXIgcmVmZXJlbmNlcyB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50LgorCSAqIFVzZWQgZm9yIG1hcmtlcnMsIHdoaWNoIGRlbm90ZSBhIEphdmEgZWxlbWVudCByYXRoZXIgdGhhbiBhIHJlc291cmNlLgorCSAqCisJICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKKwkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXJrZXIgcmVmZXJlbmNlcyB0aGUgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5JTWFya2VyLmdldEF0dHJpYnV0ZTwvY29kZT4gb24gdGhlIG1hcmtlciBmYWlscyAJIAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRCeShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCS8vIG9ubHkgbWF0Y2ggdW5pdHMgb3IgY2xhc3NmaWxlcworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpeworCQkJSU1lbWJlciBtZW1iZXIgPSAoSU1lbWJlcikgZWxlbWVudDsKKwkJCWlmIChtZW1iZXIuaXNCaW5hcnkoKSl7CisJCQkJZWxlbWVudCA9IG1lbWJlci5nZXRDbGFzc0ZpbGUoKTsKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudCA9IG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJCX0KKwkJfQorCQlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CQkJCisJCWlmIChtYXJrZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisJCVN0cmluZyBtYXJrZXJIYW5kbGVJZCA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShBVFRfSEFORExFX0lEKTsKKwkJaWYgKG1hcmtlckhhbmRsZUlkID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCisJCUlKYXZhRWxlbWVudCBtYXJrZXJFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKG1hcmtlckhhbmRsZUlkKTsKKwkJd2hpbGUgKHRydWUpeworCQkJaWYgKGVsZW1lbnQuZXF1YWxzKG1hcmtlckVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsgLy8gZXh0ZXJuYWwgZWxlbWVudHMgbWF5IHN0aWxsIGJlIGVxdWFsIHdpdGggZGlmZmVyZW50IGhhbmRsZUlEcy4KKwkJCQorCQkJLy8gY3ljbGUgdGhyb3VnaCBlbmNsb3NpbmcgdHlwZXMgaW4gY2FzZSBtYXJrZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3NmaWxlICgxNTU2OCkKKwkJCWlmIChtYXJrZXJFbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzRmlsZSl7CisJCQkJSVR5cGUgZW5jbG9zaW5nVHlwZSA9ICgoSUNsYXNzRmlsZSltYXJrZXJFbGVtZW50KS5nZXRUeXBlKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwpeworCQkJCQltYXJrZXJFbGVtZW50ID0gZW5jbG9zaW5nVHlwZS5nZXRDbGFzc0ZpbGUoKTsgLy8gcmV0cnkgd2l0aCBpbW1lZGlhdGUgZW5jbG9zaW5nIGNsYXNzZmlsZQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrZXIgZGVsdGEgcmVmZXJlbmNlcyB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50LgorCSAqIFVzZWQgZm9yIG1hcmtlcnMgZGVsdGFzLCB3aGljaCBkZW5vdGUgYSBKYXZhIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSByZXNvdXJjZS4KKwkgKgorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50CisJICogQHBhcmFtIG1hcmtlckRlbHRhIHRoZSBtYXJrZXIgZGVsdGEKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXJrZXIgZGVsdGEgcmVmZXJlbmNlcyB0aGUgZWxlbWVudAorCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgIDxjb2RlPklNYXJrZXJEZWx0YS5nZXRBdHRyaWJ1dGU8L2NvZGU+IG9uIHRoZSBtYXJrZXIgZGVsdGEgZmFpbHMgCSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQnkoSUphdmFFbGVtZW50IGVsZW1lbnQsIElNYXJrZXJEZWx0YSBtYXJrZXJEZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJLy8gb25seSBtYXRjaCB1bml0cyBvciBjbGFzc2ZpbGVzCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcil7CisJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBlbGVtZW50OworCQkJaWYgKG1lbWJlci5pc0JpbmFyeSgpKXsKKwkJCQllbGVtZW50ID0gbWVtYmVyLmdldENsYXNzRmlsZSgpOworCQkJfSBlbHNlIHsKKwkJCQllbGVtZW50ID0gbWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQkJfQorCQl9CisJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsJCQkKKwkJaWYgKG1hcmtlckRlbHRhID09IG51bGwpIHJldHVybiBmYWxzZTsKKworCQlTdHJpbmcgbWFya2VyRGVsdGFySGFuZGxlSWQgPSAoU3RyaW5nKW1hcmtlckRlbHRhLmdldEF0dHJpYnV0ZShBVFRfSEFORExFX0lEKTsKKwkJaWYgKG1hcmtlckRlbHRhckhhbmRsZUlkID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCisJCUlKYXZhRWxlbWVudCBtYXJrZXJFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKG1hcmtlckRlbHRhckhhbmRsZUlkKTsKKwkJd2hpbGUgKHRydWUpeworCQkJaWYgKGVsZW1lbnQuZXF1YWxzKG1hcmtlckVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsgLy8gZXh0ZXJuYWwgZWxlbWVudHMgbWF5IHN0aWxsIGJlIGVxdWFsIHdpdGggZGlmZmVyZW50IGhhbmRsZUlEcy4KKwkJCQorCQkJLy8gY3ljbGUgdGhyb3VnaCBlbmNsb3NpbmcgdHlwZXMgaW4gY2FzZSBtYXJrZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3NmaWxlICgxNTU2OCkKKwkJCWlmIChtYXJrZXJFbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzRmlsZSl7CisJCQkJSVR5cGUgZW5jbG9zaW5nVHlwZSA9ICgoSUNsYXNzRmlsZSltYXJrZXJFbGVtZW50KS5nZXRUeXBlKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwpeworCQkJCQltYXJrZXJFbGVtZW50ID0gZW5jbG9zaW5nVHlwZS5nZXRDbGFzc0ZpbGUoKTsgLy8gcmV0cnkgd2l0aCBpbW1lZGlhdGUgZW5jbG9zaW5nIGNsYXNzZmlsZQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfQ09OVEFJTkVSPC9jb2RlPgorCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIHBhdGggb2YgdGhlIGNvbnRhaW5lciB3aWxsIGJlIHVzZWQgZHVyaW5nIHJlc29sdXRpb24gc28gYXMgdG8gbWFwIHRoaXMKKwkgKiBjb250YWluZXIgZW50cnkgdG8gYSBzZXQgb2Ygb3RoZXIgY2xhc3NwYXRoIGVudHJpZXMgdGhlIGNvbnRhaW5lciBpcyBhY3RpbmcgZm9yLgorCSAqIDxwPgorCSAqIEEgY29udGFpbmVyIGVudHJ5IGFsbG93cyB0byBleHByZXNzIGluZGlyZWN0IHJlZmVyZW5jZXMgdG8gYSBzZXQgb2YgbGlicmFyaWVzLCBwcm9qZWN0cyBhbmQgdmFyaWFibGUgZW50cmllcywKKwkgKiB3aGljaCBjYW4gYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgZm9yIGVhY2ggSmF2YSBwcm9qZWN0IHdoZXJlIGl0IGlzIHVzZWQuCisJICogQSBjbGFzc3BhdGggY29udGFpbmVyIGVudHJ5IGNhbiBiZSByZXNvbHZlZCB1c2luZyA8Y29kZT5KYXZhQ29yZSNnZXRSZXNvbHZlZENsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4sCisJICogYW5kIHVwZGF0ZWQgd2l0aCA8Y29kZT5KYXZhQ29yZSNjbGFzc3BhdGhDb250YWluZXJDaGFuZ2VkPC9jb2RlPgorCSAqIDxwPgorCSAqIEEgY29udGFpbmVyIGlzIGV4Y2x1c2l2ZWx5IHJlc29sdmVkIGJ5IGEgPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IHJlZ2lzdGVyZWQgb250byB0aGUKKwkgKiBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi4KKwkgKiA8cD4KKwkgKiBBIGNvbnRhaW5lciBwYXRoIG11c3QgYmUgZm9ybWVkIG9mIGF0IGxlYXN0IG9uZSBzZWdtZW50LCB3aGVyZTogPHVsPgorCSAqIDxsaT4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBjb250YWluZXIsIHRoZXJlIG11c3QgYmUgYSBjb250YWluZXIgaW5pdGlhbGl6ZXIgcmVnaXN0ZXJlZAorCSAqIAlvbnRvIHRoaXMgSUQgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uIHBvaW50ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLiA8L2xpPgorCSAqIDxsaT4gdGhlIHJlbWFpbmluZyBzZWdtZW50cyB3aWxsIGJlIHBhc3NlZCBvbnRvIHRoZSBpbml0aWFsaXplciwgYW5kIGNhbiBiZSB1c2VkIGFzIGFkZGl0aW9uYWwKKwkgKiAJaGludHMgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS4gPC9saT4KKwkgKiA8L3VsPgorCSAqIDxwPgorCSAqIEV4YW1wbGUgb2YgYW4gQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZm9yIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBkZW5vdGluZyBhIGRlZmF1bHQgSkRLIGNvbnRhaW5lcjoKKwkgKiAKKwkgKiBjb250YWluZXJFbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKCJNeVByb3ZpZGVkSkRLL2RlZmF1bHQiKSk7CisJICogCisJICogPGV4dGVuc2lvbgorCSAqICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+CisJICogICAgPGNvbnRhaW5lckluaXRpYWxpemVyCisJICogICAgICAgaWQ9Ik15UHJvdmlkZWRKREsiCisJICogICAgICAgY2xhc3M9ImNvbS5leGFtcGxlLk15SW5pdGlhbGl6ZXIiLz4gCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG8gdmFsaWRhdGUgY2xhc3NwYXRoIGNvbnRhaW5lcnMKKwkgKiBvciBhY2Nlc3MgdGhlIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuCisJICogPHA+CisJICogVGhlIHJlc3VsdGluZyBlbnRyeSBpcyBub3QgZXhwb3J0ZWQgdG8gZGVwZW5kZW50IHByb2plY3RzLiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisJICogPGNvZGU+bmV3Q29udGFpbmVyRW50cnkoLSxmYWxzZSk8L2NvZGU+LgorCSAqIDxwPgorCSAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBwYXRoIGlkZW50aWZ5aW5nIHRoZSBjb250YWluZXIsIGl0IG11c3QgYmUgZm9ybWVkIG9mIHR3bworCSAqIAlzZWdtZW50cworCSAqIEByZXR1cm4gYSBuZXcgY29udGFpbmVyIGNsYXNzcGF0aCBlbnRyeQorCSAqIAorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpCisJICogQHNlZSBKYXZhQ29yZSNuZXdDb250YWluZXJFbnRyeShJUGF0aCwgYm9vbGVhbikKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3Q29udGFpbmVyRW50cnkoSVBhdGggY29udGFpbmVyUGF0aCkgeworCQkJCisJCXJldHVybiBuZXdDb250YWluZXJFbnRyeShjb250YWluZXJQYXRoLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfQ09OVEFJTkVSPC9jb2RlPgorCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIHBhdGggb2YgdGhlIGNvbnRhaW5lciB3aWxsIGJlIHVzZWQgZHVyaW5nIHJlc29sdXRpb24gc28gYXMgdG8gbWFwIHRoaXMKKwkgKiBjb250YWluZXIgZW50cnkgdG8gYSBzZXQgb2Ygb3RoZXIgY2xhc3NwYXRoIGVudHJpZXMgdGhlIGNvbnRhaW5lciBpcyBhY3RpbmcgZm9yLgorCSAqIDxwPgorCSAqIEEgY29udGFpbmVyIGVudHJ5IGFsbG93cyB0byBleHByZXNzIGluZGlyZWN0IHJlZmVyZW5jZXMgdG8gYSBzZXQgb2YgbGlicmFyaWVzLCBwcm9qZWN0cyBhbmQgdmFyaWFibGUgZW50cmllcywKKwkgKiB3aGljaCBjYW4gYmUgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgZm9yIGVhY2ggSmF2YSBwcm9qZWN0IHdoZXJlIGl0IGlzIHVzZWQuCisJICogQSBjbGFzc3BhdGggY29udGFpbmVyIGVudHJ5IGNhbiBiZSByZXNvbHZlZCB1c2luZyA8Y29kZT5KYXZhQ29yZSNnZXRSZXNvbHZlZENsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4sCisJICogYW5kIHVwZGF0ZWQgd2l0aCA8Y29kZT5KYXZhQ29yZSNjbGFzc3BhdGhDb250YWluZXJDaGFuZ2VkPC9jb2RlPgorCSAqIDxwPgorCSAqIEEgY29udGFpbmVyIGlzIGV4Y2x1c2l2ZWx5IHJlc29sdmVkIGJ5IGEgPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IHJlZ2lzdGVyZWQgb250byB0aGUKKwkgKiBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi4KKwkgKiA8cD4KKwkgKiBBIGNvbnRhaW5lciBwYXRoIG11c3QgYmUgZm9ybWVkIG9mIGF0IGxlYXN0IG9uZSBzZWdtZW50LCB3aGVyZTogPHVsPgorCSAqIDxsaT4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBjb250YWluZXIsIHRoZXJlIG11c3QgYmUgYSBjb250YWluZXIgaW5pdGlhbGl6ZXIgcmVnaXN0ZXJlZAorCSAqIAlvbnRvIHRoaXMgSUQgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uIHBvaW50ICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLiA8L2xpPgorCSAqIDxsaT4gdGhlIHJlbWFpbmluZyBzZWdtZW50cyB3aWxsIGJlIHBhc3NlZCBvbnRvIHRoZSBpbml0aWFsaXplciwgYW5kIGNhbiBiZSB1c2VkIGFzIGFkZGl0aW9uYWwKKwkgKiAJaGludHMgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS4gPC9saT4KKwkgKiA8L3VsPgorCSAqIDxwPgorCSAqIEV4YW1wbGUgb2YgYW4gQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZm9yIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBkZW5vdGluZyBhIGRlZmF1bHQgSkRLIGNvbnRhaW5lcjoKKwkgKiAKKwkgKiBjb250YWluZXJFbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKCJNeVByb3ZpZGVkSkRLL2RlZmF1bHQiKSk7CisJICogCisJICogPGV4dGVuc2lvbgorCSAqICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+CisJICogICAgPGNvbnRhaW5lckluaXRpYWxpemVyCisJICogICAgICAgaWQ9Ik15UHJvdmlkZWRKREsiCisJICogICAgICAgY2xhc3M9ImNvbS5leGFtcGxlLk15SW5pdGlhbGl6ZXIiLz4gCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG8gdmFsaWRhdGUgY2xhc3NwYXRoIGNvbnRhaW5lcnMKKwkgKiBvciBhY2Nlc3MgdGhlIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuCisJICogPHA+CisJICogQHBhcmFtIGNvbnRhaW5lclBhdGggdGhlIHBhdGggaWRlbnRpZnlpbmcgdGhlIGNvbnRhaW5lciwgaXQgbXVzdCBiZSBmb3JtZWQgb2YgYXQgbGVhc3QKKwkgKiAJb25lIHNlZ21lbnQgKElEK2hpbnRzKQorCSAqIEBwYXJhbSBpc0V4cG9ydGVkIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBjb250cmlidXRlZCB0byBkZXBlbmRlbnQKKwkgKgkJcHJvamVjdHMgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dCBsb2NhdGlvbgorCSAqIEByZXR1cm4gYSBuZXcgY29udGFpbmVyIGNsYXNzcGF0aCBlbnRyeQorCSAqIAorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpCisJICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdFtdLCBJQ2xhc3NwYXRoQ29udGFpbmVyW10sIElQcm9ncmVzc01vbml0b3IpCisJICogQHNlZSBKYXZhQ29yZSNuZXdDb250YWluZXJFbnRyeShJUGF0aCwgYm9vbGVhbikKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3Q29udGFpbmVyRW50cnkoSVBhdGggY29udGFpbmVyUGF0aCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7CisJCQkKKwkJQXNzZXJ0LmlzVHJ1ZSgKKwkJCWNvbnRhaW5lclBhdGggIT0gbnVsbCAmJiBjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsQ29udGFpbmVyUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KAorCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsCisJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiwKKwkJCWNvbnRhaW5lclBhdGgsCisJCQludWxsLAorCQkJbnVsbCwKKwkJCWlzRXhwb3J0ZWQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgbm9uLWV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPiBmb3IgdGhlIAorCSAqIEpBUiBvciBmb2xkZXIgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgCisJICogd2l0aGluIHRoZSByb290IHdpbGwgaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+LgorCSAqIDxwPgorCSAqIEEgbGlicmFyeSBlbnRyeSBpcyB1c2VkIHRvIGRlbm90ZSBhIHByZXJlcXVpc2l0ZSBKQVIgb3Igcm9vdCBmb2xkZXIgY29udGFpbmluZyBiaW5hcmllcy4KKwkgKiBUaGUgdGFyZ2V0IEpBUiBvciBmb2xkZXIgY2FuIGVpdGhlciBiZSBkZWZpbmVkIGludGVybmFsbHkgdG8gdGhlIHdvcmtzcGFjZSAoYWJzb2x1dGUgcGF0aCByZWxhdGl2ZQorCSAqIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCkgb3IgZXh0ZXJuYWxseSB0byB0aGUgd29ya3NwYWNlIChhYnNvbHV0ZSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSkuCisJICogPHA+CisJICogZS5nLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGJpbmFyeSBwYXRoIHVzYWdlPHVsPgorCSAqCTxsaT48Y29kZT4gImM6L2pkazEuMi4yL2pyZS9saWIvcnQuamFyIiA8L2NvZGU+IC0gcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIEpBUjwvbGk+CisJICoJPGxpPjxjb2RlPiAiL1Byb2plY3Qvc29tZUxpYi5qYXIiIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwgSkFSIDwvbGk+CisJICoJPGxpPjxjb2RlPiAiYzovY2xhc3Nlcy8iIDwvY29kZT4gLSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgYmluYXJ5IGZvbGRlcjwvbGk+CisJICogPC91bD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0byB2YWxpZGF0ZSBvciBhY2Nlc3MgdGhlIAorCSAqIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuCisJICogPHA+CisJICogVGhlIHJlc3VsdGluZyBlbnRyeSBpcyBub3QgZXhwb3J0ZWQgdG8gZGVwZW5kZW50IHByb2plY3RzLiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisJICogPGNvZGU+bmV3TGlicmFyeUVudHJ5KC0sLSwtLGZhbHNlKTwvY29kZT4uCisJICogPHA+CisJICogCisJICogQHBhcmFtIHBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGJpbmFyeSBhcmNoaXZlCisJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlLCAKKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZQorCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIDxjb2RlPmFyY2hpdmVQYXRoPC9jb2RlPiBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiBhIG5ldyBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeQorCSAqIAorCSAqIEBzZWUgI25ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeSgKKwkJSVBhdGggcGF0aCwKKwkJSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsCisJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgeworCQkJCisJCXJldHVybiBuZXdMaWJyYXJ5RW50cnkocGF0aCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX0xJQlJBUlk8L2NvZGU+IGZvciB0aGUgSkFSIG9yIGZvbGRlcgorCSAqIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguIFRoaXMgc3BlY2lmaWVzIHRoYXQgYWxsIHBhY2thZ2UgZnJhZ21lbnRzIHdpdGhpbiB0aGUgcm9vdCAKKwkgKiB3aWxsIGhhdmUgY2hpbGRyZW4gb2YgdHlwZSA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBBIGxpYnJhcnkgZW50cnkgaXMgdXNlZCB0byBkZW5vdGUgYSBwcmVyZXF1aXNpdGUgSkFSIG9yIHJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgYmluYXJpZXMuCisJICogVGhlIHRhcmdldCBKQVIgb3IgZm9sZGVyIGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBpbnRlcm5hbGx5IHRvIHRoZSB3b3Jrc3BhY2UgKGFic29sdXRlIHBhdGggcmVsYXRpdmUKKwkgKiB0byB0aGUgd29ya3NwYWNlIHJvb3QpIG9yIGV4dGVybmFsbHkgdG8gdGhlIHdvcmtzcGFjZSAoYWJzb2x1dGUgcGF0aCBpbiB0aGUgZmlsZSBzeXN0ZW0pLgorCSAqCTxwPgorCSAqIGUuZy4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBiaW5hcnkgcGF0aCB1c2FnZTx1bD4KKwkgKgk8bGk+PGNvZGU+ICJjOi9qZGsxLjIuMi9qcmUvbGliL3J0LmphciIgPC9jb2RlPiAtIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBKQVI8L2xpPgorCSAqCTxsaT48Y29kZT4gIi9Qcm9qZWN0L3NvbWVMaWIuamFyIiA8L2NvZGU+IC0gcmVmZXJlbmNlIHRvIGFuIGludGVybmFsIEpBUiA8L2xpPgorCSAqCTxsaT48Y29kZT4gImM6L2NsYXNzZXMvIiA8L2NvZGU+IC0gcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIGJpbmFyeSBmb2xkZXI8L2xpPgorCSAqIDwvdWw+CisJICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG8gdmFsaWRhdGUgb3IgYWNjZXNzIHRoZSAKKwkgKiByZXNvdXJjZXMgYXQgdGhlIGdpdmVuIHBhdGhzLgorCSAqIDxwPgorCSAqIAorCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBiaW5hcnkgYXJjaGl2ZQorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSwgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUKKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5hcmNoaXZlUGF0aDwvY29kZT4gaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBpc0V4cG9ydGVkIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZW50cnkgaXMgY29udHJpYnV0ZWQgdG8gZGVwZW5kZW50CisJICogCSAgcHJvamVjdHMgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dCBsb2NhdGlvbgorCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSBjbGFzc3BhdGggZW50cnkKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KAorCQlJUGF0aCBwYXRoLAorCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKKwkJCQorCQlBc3NlcnQuaXNUcnVlKAorCQkJcGF0aC5pc0Fic29sdXRlKCksCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5uZWVkQWJzb2x1dGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSwKKwkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSwKKwkJCUphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpLAorCQkJc291cmNlQXR0YWNobWVudFBhdGgsCisJCQlzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCisJCQlpc0V4cG9ydGVkKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4KKwkgKiBmb3IgdGhlIHByb2plY3QgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4KKwkgKiA8cD4KKwkgKiBBIHByb2plY3QgZW50cnkgaXMgdXNlZCB0byBkZW5vdGUgYSBwcmVyZXF1aXNpdGUgcHJvamVjdCBvbiBhIGNsYXNzcGF0aC4KKwkgKiBUaGUgcmVmZXJlbmNlZCBwcm9qZWN0IHdpbGwgYmUgY29udHJpYnV0ZWQgYXMgYSB3aG9sZSwgZWl0aGVyIGFzIHNvdXJjZXMgKGluIHRoZSBKYXZhIE1vZGVsLCBpdAorCSAqIGNvbnRyaWJ1dGVzIGFsbCBpdHMgcGFja2FnZSBmcmFnbWVudCByb290cykgb3IgYXMgYmluYXJpZXMgKHdoZW4gYnVpbGRpbmcsIGl0IGNvbnRyaWJ1dGVzIGl0cyAKKwkgKiB3aG9sZSBvdXRwdXQgbG9jYXRpb24pLgorCSAqIDxwPgorCSAqIEEgcHJvamVjdCByZWZlcmVuY2UgYWxsb3dzIHRvIGluZGlyZWN0IHRocm91Z2ggYW5vdGhlciBwcm9qZWN0LCBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGludGVybmFsIGxheW91dC4gCisJICogPHA+CisJICogVGhlIHByZXJlcXVpc2l0ZSBwcm9qZWN0IGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290LgorCSAqIDxwPgorCSAqIFRoZSByZXN1bHRpbmcgZW50cnkgaXMgbm90IGV4cG9ydGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cy4gVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bworCSAqIDxjb2RlPm5ld1Byb2plY3RFbnRyeShfLGZhbHNlKTwvY29kZT4uCisJICogPHA+CisJICogCisJICogQHBhcmFtIHBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGJpbmFyeSBhcmNoaXZlCisJICogQHJldHVybiBhIG5ldyBwcm9qZWN0IGNsYXNzcGF0aCBlbnRyeQorCSAqIAorCSAqIEBzZWUgSmF2YUNvcmUjbmV3UHJvamVjdEVudHJ5KElQYXRoLCBib29sZWFuKQorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoKSB7CisJCXJldHVybiBuZXdQcm9qZWN0RW50cnkocGF0aCwgZmFsc2UpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9QUk9KRUNUPC9jb2RlPgorCSAqIGZvciB0aGUgcHJvamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoLgorCSAqIDxwPgorCSAqIEEgcHJvamVjdCBlbnRyeSBpcyB1c2VkIHRvIGRlbm90ZSBhIHByZXJlcXVpc2l0ZSBwcm9qZWN0IG9uIGEgY2xhc3NwYXRoLgorCSAqIFRoZSByZWZlcmVuY2VkIHByb2plY3Qgd2lsbCBiZSBjb250cmlidXRlZCBhcyBhIHdob2xlLCBlaXRoZXIgYXMgc291cmNlcyAoaW4gdGhlIEphdmEgTW9kZWwsIGl0CisJICogY29udHJpYnV0ZXMgYWxsIGl0cyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzKSBvciBhcyBiaW5hcmllcyAod2hlbiBidWlsZGluZywgaXQgY29udHJpYnV0ZXMgaXRzIAorCSAqIHdob2xlIG91dHB1dCBsb2NhdGlvbikuCisJICogPHA+CisJICogQSBwcm9qZWN0IHJlZmVyZW5jZSBhbGxvd3MgdG8gaW5kaXJlY3QgdGhyb3VnaCBhbm90aGVyIHByb2plY3QsIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgaW50ZXJuYWwgbGF5b3V0LiAKKwkgKiA8cD4KKwkgKiBUaGUgcHJlcmVxdWlzaXRlIHByb2plY3QgaXMgcmVmZXJyZWQgdG8gdXNpbmcgYW4gYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIHJvb3QuCisJICogPHA+CisJICogCisJICogQHBhcmFtIHBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHByZXJlcXVpc2l0ZSBwcm9qZWN0CisJICogQHBhcmFtIGlzRXhwb3J0ZWQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlbnRyeSBpcyBjb250cmlidXRlZCB0byBkZXBlbmRlbnQKKwkgKiAJICBwcm9qZWN0cyBpbiBhZGRpdGlvbiB0byB0aGUgb3V0cHV0IGxvY2F0aW9uCisJICogQHJldHVybiBhIG5ldyBwcm9qZWN0IGNsYXNzcGF0aCBlbnRyeQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdQcm9qZWN0RW50cnkoSVBhdGggcGF0aCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7CisJCUFzc2VydC5pc1RydWUoCisJCQlwYXRoLmlzQWJzb2x1dGUoKSwKKwkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLm5lZWRBYnNvbHV0ZVBhdGgiICkpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKKwkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCwKKwkJCXBhdGgsCisJCQludWxsLAorCQkJbnVsbCwKKwkJCWlzRXhwb3J0ZWQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgZW1wdHkgcmVnaW9uLgorCSAqIAorCSAqIEByZXR1cm4gYSBuZXcgZW1wdHkgcmVnaW9uCisJICovCisJcHVibGljIHN0YXRpYyBJUmVnaW9uIG5ld1JlZ2lvbigpIHsKKwkJcmV0dXJuIG5ldyBSZWdpb24oKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGZvciB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgCisJICogaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgCisJICogaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSBzb3VyY2UgZm9sZGVyIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290LCBlLmcuIDxjb2RlPiIvUHJvamVjdC9zcmMiPC9jb2RlPi4KKwkgKiA8L3A+CisJICogPHA+CisJICogQSBzb3VyY2UgZW50cnkgaXMgdXNlZCB0byBzZXQgdXAgdGhlIGludGVybmFsIHNvdXJjZSBsYXlvdXQgb2YgYSBwcm9qZWN0LCBhbmQgY2Fubm90IGJlIHVzZWQgb3V0IG9mIHRoZQorCSAqIGNvbnRleHQgb2YgdGhlIGNvbnRhaW5pbmcgcHJvamVjdCAoYSBzb3VyY2UgZW50cnkgIlByb2oxL3NyYyIgY2Fubm90IGJlIHVzZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBQcm9qMikuCisJICogPC9wPgorCSAqIDxwPgorCSAqIEEgcGFydGljdWxhciBzb3VyY2UgZW50cnkgY2Fubm90IGJlIGV4cG9ydGVkIHRvIG90aGVyIHByb2plY3RzLiBBbGwgc291cmNlcy9iaW5hcmllcyBpbnNpZGUgYSBwcm9qZWN0IGFyZQorCSAqIGNvbnRyaWJ1dGVkIGFzIGEgd2hvbGUgdGhyb3VnaCBhIHByb2plY3QgZW50cnkgKHNlZSA8Y29kZT5KYXZhQ29yZS5uZXdQcm9qZWN0RW50cnk8L2NvZGU+KS4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIHBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgYSBzb3VyY2UgZm9sZGVyCisJICogQHJldHVybiBhIG5ldyBzb3VyY2UgY2xhc3NwYXRoIGVudHJ5CisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3U291cmNlRW50cnkoSVBhdGggcGF0aCkgeworCQlBc3NlcnQuaXNUcnVlKAorCQkJcGF0aC5pc0Fic29sdXRlKCksCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5uZWVkQWJzb2x1dGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KAorCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsCisJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSwKKwkJCXBhdGgsCisJCQludWxsLAorCQkJbnVsbCwKKwkJCWZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cnkgb2Yga2luZCA8Y29kZT5DUEVfVkFSSUFCTEU8L2NvZGU+CisJICogZm9yIHRoZSBnaXZlbiBwYXRoLiBUaGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aCBpcyB0aGUgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZS4KKwkgKiBUaGUgdHJhaWxpbmcgc2VnbWVudHMgb2YgdGhlIHBhdGggd2lsbCBiZSBhcHBlbmRlZCB0byByZXNvbHZlZCB2YXJpYWJsZSBwYXRoLgorCSAqIDxwPgorCSAqIEEgdmFyaWFibGUgZW50cnkgYWxsb3dzIHRvIGV4cHJlc3MgaW5kaXJlY3QgcmVmZXJlbmNlcyBvbiBhIGNsYXNzcGF0aCB0byBvdGhlciBwcm9qZWN0cyBvciBsaWJyYXJpZXMsCisJICogZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZSBpcyByZWZlcnJpbmcuCisJICogPHA+CisJICoJSXQgaXMgcG9zc2libGUgdG8gcmVnaXN0ZXIgYW4gYXV0b21hdGljIGluaXRpYWxpemVyICg8Y29kZT5DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC9jb2RlPiksCisJICogd2hpY2ggd2lsbCBiZSBpbnZva2VkIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIuCisJICogQWZ0ZXIgcmVzb2x1dGlvbiwgYSBjbGFzc3BhdGggdmFyaWFibGUgZW50cnkgbWF5IGVpdGhlciBjb3JyZXNwb25kIHRvIGEgcHJvamVjdCBvciBhIGxpYnJhcnkgZW50cnkuIDwvbGk+CSAKKwkgKiA8cD4KKwkgKiBlLmcuIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdmFyaWFibGUgcGF0aCB1c2FnZTx1bD4KKwkgKiA8bGk+ICJKRFRDT1JFIiB3aGVyZSB2YXJpYWJsZSA8Y29kZT5KRFRDT1JFPC9jb2RlPiBpcyAKKwkgKgkJYm91bmQgdG8gImM6L2phcnMvamR0Y29yZS5qYXIiLiBUaGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGlzIGRlbm90aW5nIHRoZSBsaWJyYXJ5ICJjOlxqYXJzXGpkdGNvcmUuamFyIjwvbGk+CisJICogPGxpPiAiSkRUQ09SRSIgd2hlcmUgdmFyaWFibGUgPGNvZGU+SkRUQ09SRTwvY29kZT4gaXMgCisJICoJCWJvdW5kIHRvICIvUHJvamVjdF9KRFRDT1JFIi4gVGhlIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgcHJvamVjdCAiL1Byb2plY3RfSkRUQ09SRSI8L2xpPgorCSAqIDxsaT4gIlBMVUdJTlMvY29tLmV4YW1wbGUvZXhhbXBsZS5qYXIiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPlBMVUdJTlM8L2NvZGU+CisJICogICAgICBpcyBib3VuZCB0byAiYzovZWNsaXBzZS9wbHVnaW5zIi4gVGhlIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeSBpcyBkZW5vdGluZyB0aGUgbGlicmFyeSAiYzovZWNsaXBzZS9wbHVnaW5zL2NvbS5leGFtcGxlL2V4YW1wbGUuamFyIjwvbGk+CisJICogPC91bD4KKwkgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgYXR0ZW1wdCB0byB2YWxpZGF0ZSBjbGFzc3BhdGggdmFyaWFibGVzCisJICogb3IgYWNjZXNzIHRoZSByZXNvdXJjZXMgYXQgdGhlIGdpdmVuIHBhdGhzLgorCSAqIDxwPgorCSAqIFRoZSByZXN1bHRpbmcgZW50cnkgaXMgbm90IGV4cG9ydGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cy4gVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bworCSAqIDxjb2RlPm5ld1ZhcmlhYmxlRW50cnkoLSwtLC0sZmFsc2UpPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiAKKwkgKiBAcGFyYW0gdmFyaWFibGVQYXRoIHRoZSBwYXRoIG9mIHRoZSBiaW5hcnkgYXJjaGl2ZTsgZmlyc3Qgc2VnbWVudCBpcyB0aGUKKwkgKiAgIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUKKwkgKiBAcGFyYW0gdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSwgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgaWYgcHJlc2VudCwgdGhlIGZpcnN0IHNlZ21lbnQgaXMgdGhlCisJICogICAgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZSAobm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIHZhcmlhYmxlCisJICogICAgYXMgdGhlIG9uZSB0aGF0IGJlZ2lucyA8Y29kZT52YXJpYWJsZVBhdGg8L2NvZGU+KQorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUKKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5hcmNoaXZlUGF0aDwvY29kZT4gaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSBjbGFzc3BhdGggZW50cnkKKwkgKiAKKwkgKiBAc2VlIEphdmFDb3JlI25ld1ZhcmlhYmxlRW50cnkoSVBhdGgsIElQYXRoLCBJUGF0aCwgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdWYXJpYWJsZUVudHJ5KAorCQlJUGF0aCB2YXJpYWJsZVBhdGgsCisJCUlQYXRoIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsCisJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgeworCQlBc3NlcnQuaXNUcnVlKAorCQkJdmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsVmFyaWFibGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbmV3VmFyaWFibGVFbnRyeSh2YXJpYWJsZVBhdGgsIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgbm9uLWV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4KKwkgKiBmb3IgdGhlIGdpdmVuIHBhdGguIFRoZSBmaXJzdCBzZWdtZW50IG9mIHRoZSBwYXRoIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqIFRoZSB0cmFpbGluZyBzZWdtZW50cyBvZiB0aGUgcGF0aCB3aWxsIGJlIGFwcGVuZGVkIHRvIHJlc29sdmVkIHZhcmlhYmxlIHBhdGguCisJICogPHA+CisJICogQSB2YXJpYWJsZSBlbnRyeSBhbGxvd3MgdG8gZXhwcmVzcyBpbmRpcmVjdCByZWZlcmVuY2VzIG9uIGEgY2xhc3NwYXRoIHRvIG90aGVyIHByb2plY3RzIG9yIGxpYnJhcmllcywKKwkgKiBkZXBlbmRpbmcgb24gd2hhdCB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGlzIHJlZmVycmluZy4KKwkgKiA8cD4KKwkgKglJdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciBhbiBhdXRvbWF0aWMgaW5pdGlhbGl6ZXIgKDxjb2RlPkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L2NvZGU+KSwKKwkgKiB3aGljaCB3aWxsIGJlIGludm9rZWQgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uIHBvaW50ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIi4KKwkgKiBBZnRlciByZXNvbHV0aW9uLCBhIGNsYXNzcGF0aCB2YXJpYWJsZSBlbnRyeSBtYXkgZWl0aGVyIGNvcnJlc3BvbmQgdG8gYSBwcm9qZWN0IG9yIGEgbGlicmFyeSBlbnRyeS4gPC9saT4JIAorCSAqIDxwPgorCSAqIGUuZy4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB2YXJpYWJsZSBwYXRoIHVzYWdlPHVsPgorCSAqIDxsaT4gIkpEVENPUkUiIHdoZXJlIHZhcmlhYmxlIDxjb2RlPkpEVENPUkU8L2NvZGU+IGlzIAorCSAqCQlib3VuZCB0byAiYzovamFycy9qZHRjb3JlLmphciIuIFRoZSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkgaXMgZGVub3RpbmcgdGhlIGxpYnJhcnkgImM6XGphcnNcamR0Y29yZS5qYXIiPC9saT4KKwkgKiA8bGk+ICJKRFRDT1JFIiB3aGVyZSB2YXJpYWJsZSA8Y29kZT5KRFRDT1JFPC9jb2RlPiBpcyAKKwkgKgkJYm91bmQgdG8gIi9Qcm9qZWN0X0pEVENPUkUiLiBUaGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGlzIGRlbm90aW5nIHRoZSBwcm9qZWN0ICIvUHJvamVjdF9KRFRDT1JFIjwvbGk+CisJICogPGxpPiAiUExVR0lOUy9jb20uZXhhbXBsZS9leGFtcGxlLmphciIgd2hlcmUgdmFyaWFibGUgPGNvZGU+UExVR0lOUzwvY29kZT4KKwkgKiAgICAgIGlzIGJvdW5kIHRvICJjOi9lY2xpcHNlL3BsdWdpbnMiLiBUaGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGVudHJ5IGlzIGRlbm90aW5nIHRoZSBsaWJyYXJ5ICJjOi9lY2xpcHNlL3BsdWdpbnMvY29tLmV4YW1wbGUvZXhhbXBsZS5qYXIiPC9saT4KKwkgKiA8L3VsPgorCSAqIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIHZhbGlkYXRlIGNsYXNzcGF0aCB2YXJpYWJsZXMKKwkgKiBvciBhY2Nlc3MgdGhlIHJlc291cmNlcyBhdCB0aGUgZ2l2ZW4gcGF0aHMuCisJICogPHA+CisJICoKKwkgKiBAcGFyYW0gdmFyaWFibGVQYXRoIHRoZSBwYXRoIG9mIHRoZSBiaW5hcnkgYXJjaGl2ZTsgZmlyc3Qgc2VnbWVudCBpcyB0aGUKKwkgKiAgIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUKKwkgKiBAcGFyYW0gdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSwgCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZTsgaWYgcHJlc2VudCwgdGhlIGZpcnN0IHNlZ21lbnQgaXMgdGhlCisJICogICAgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZSAobm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIHZhcmlhYmxlCisJICogICAgYXMgdGhlIG9uZSB0aGF0IGJlZ2lucyA8Y29kZT52YXJpYWJsZVBhdGg8L2NvZGU+KQorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUKKwkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5hcmNoaXZlUGF0aDwvY29kZT4gaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBpc0V4cG9ydGVkIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZW50cnkgaXMgY29udHJpYnV0ZWQgdG8gZGVwZW5kZW50CisJICogCSAgcHJvamVjdHMgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dCBsb2NhdGlvbgorCSAqIEByZXR1cm4gYSBuZXcgdmFyaWFibGUgY2xhc3NwYXRoIGVudHJ5CisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1ZhcmlhYmxlRW50cnkoCisJCUlQYXRoIHZhcmlhYmxlUGF0aCwKKwkJSVBhdGggdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKKwkJCQorCQlBc3NlcnQuaXNUcnVlKAorCQkJdmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCisJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsVmFyaWFibGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCisJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKKwkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUsCisJCQl2YXJpYWJsZVBhdGgsCisJCQl2YXJpYWJsZVNvdXJjZUF0dGFjaG1lbnRQYXRoLAorCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQkJaXNFeHBvcnRlZCk7CisJfQorCisJLyoqCisJICogUmVtb3ZlZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLiBEb2VzIG5vdGhpbmcgaWYgbm8gdmFsdWUgd2FzCisJICogc2V0IGZvciB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLgorCSAqIDxwPgorCSAqIENsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBsb2NhbGx5IHRvIHRoZSB3b3Jrc3BhY2UsIGFuZCAKKwkgKiBhcmUgcHJlc2VydmVkIGZyb20gc2Vzc2lvbiB0byBzZXNzaW9uLgorCSAqIDxwPgorCSAqCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlCisJICogQHNlZSAjc2V0Q2xhc3NwYXRoVmFyaWFibGUKKwkgKgorCSAqIEBkZXByZWNhdGVkIC0gdXNlIHZlcnNpb24gd2l0aCBleHRyYSBJUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNsYXNzcGF0aFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKKwkJcmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVkIHRoZSBnaXZlbiBjbGFzc3BhdGggdmFyaWFibGUuIERvZXMgbm90aGluZyBpZiBubyB2YWx1ZSB3YXMKKwkgKiBzZXQgZm9yIHRoaXMgY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqIDxwPgorCSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW5ub3QgYmUgdXNlZCB3aGlsZSB0aGUgcmVzb3VyY2UgdHJlZSBpcyBsb2NrZWQuCisJICogPHA+CisJICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIAorCSAqIGFyZSBwcmVzZXJ2ZWQgZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24uCisJICogPHA+CisJICoKKwkgKiBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggdmFyaWFibGUKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MKKwkgKiBAc2VlICNzZXRDbGFzc3BhdGhWYXJpYWJsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDbGFzc3BhdGhWYXJpYWJsZSgKKwkJU3RyaW5nIHZhcmlhYmxlTmFtZSwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisKKwkJdHJ5IHsKKwkJCXVwZGF0ZVZhcmlhYmxlVmFsdWVzKG5ldyBTdHJpbmdbXXsgdmFyaWFibGVOYW1lfSwgbmV3IElQYXRoW117IG51bGwgfSwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGNoYW5nZWQgbGlzdGVuZXIuCisJICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCisJICoKKwkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCisJLyoqIAorCSAqIEJpbmQgYSBjb250YWluZXIgcmVmZXJlbmNlIHBhdGggdG8gc29tZSBhY3R1YWwgY29udGFpbmVycyAoPGNvZGU+SUNsYXNzcGF0aENvbnRhaW5lcjwvY29kZT4pLgorCSAqIFRoaXMgQVBJIG11c3QgYmUgaW52b2tlZCB3aGVuZXZlciBjaGFuZ2VzIGluIGNvbnRhaW5lciBuZWVkIHRvIGJlIHJlZmxlY3RlZCBvbnRvIHRoZSBKYXZhTW9kZWwuCisJICogQ29udGFpbmVycyBjYW4gaGF2ZSBkaXN0aW5jdCB2YWx1ZXMgaW4gZGlmZmVyZW50IHByb2plY3RzLCB0aGVyZWZvcmUgdGhpcyBBUEkgY29uc2lkZXJzIGEKKwkgKiBzZXQgb2YgcHJvamVjdHMgd2l0aCB0aGVpciByZXNwZWN0aXZlIGNvbnRhaW5lcnMuCisJICogPHA+CisJICogPGNvZGU+Y29udGFpbmVyUGF0aDwvY29kZT4gaXMgdGhlIHBhdGggdW5kZXIgd2hpY2ggdGhlc2UgdmFsdWVzIGNhbiBiZSByZWZlcmVuY2VkIHRocm91Z2gKKwkgKiBjb250YWluZXIgY2xhc3NwYXRoIGVudHJpZXMgKDxjb2RlPklDbGFzc3BhdGhFbnRyeSNDUEVfQ09OVEFJTkVSPC9jb2RlPikuIEEgY29udGFpbmVyIHBhdGggCisJICogaXMgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhZGRpdGlvbmFsIGhpbnRzCisJICogZm9yIHRoZSByZXNvbHV0aW9uLiBUaGUgY29udGFpbmVyIElEIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gCisJICogcmVnaXN0ZXJlZCBvbiB0aGUgZXh0ZW5zaW9uIHBvaW50ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIuCisJICogPHA+CisJICogVGhlcmUgaXMgbm8gYXNzdW1wdGlvbiB0aGF0IGVhY2ggaW5kaXZpZHVhbCBjb250YWluZXIgdmFsdWUgcGFzc2VkIGluIGFyZ3VtZW50IAorCSAqICg8Y29kZT5yZXNwZWN0aXZlQ29udGFpbmVyczwvY29kZT4pIG11c3QgYW5zd2VyIHRoZSBleGFjdCBzYW1lIHBhdGggd2hlbiByZXF1ZXN0ZWQgCisJICogPGNvZGU+SUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoPC9jb2RlPi4gCisJICogSW5kZWVkLCB0aGUgY29udGFpbmVyUGF0aCBpcyBqdXN0IGFuIGluZGljYXRpb24gZm9yIHJlc29sdmluZyBpdCB0byBhbiBhY3R1YWwgY29udGFpbmVyIG9iamVjdC4gSXQgY2FuIGJlIAorCSAqIGRlbGVnYXRlZCB0byBhIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPiwgd2hpY2ggY2FuIGJlIGFjdGl2YXRlZCB0aHJvdWdoIHRoZSBleHRlbnNpb24KKwkgKiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiKS4gCisJICogPHA+CisJICogSW4gcmVhY3Rpb24gdG8gY2hhbmdpbmcgY29udGFpbmVyIHZhbHVlcywgdGhlIEphdmFNb2RlbCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV3CisJICogc3RhdGUgb2YgdGhlIHVwZGF0ZWQgY29udGFpbmVyLiAKKwkgKiA8cD4KKwkgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2Fubm90IGJlIHVzZWQgd2hpbGUgdGhlIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLgorCSAqIDxwPgorCSAqIENsYXNzcGF0aCBjb250YWluZXIgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBidXQgCisJICogYXJlIG5vdCBwcmVzZXJ2ZWQgZnJvbSBhIHNlc3Npb24gdG8gYW5vdGhlci4gSXQgaXMgdGh1cyBoaWdobHkgcmVjb21tZW5kZWQgdG8gcmVnaXN0ZXIgYSAKKwkgKiA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gZm9yIGVhY2ggcmVmZXJlbmNlZCBjb250YWluZXIgCisJICogKHRocm91Z2ggdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiKS4KKwkgKiA8cD4KKwkgKiAKKwkgKiBAcGFyYW0gY29udGFpbmVyUGF0aCAtIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcmVmZXJlbmNlLCB3aGljaCBpcyBiZWluZyB1cGRhdGVkCisJICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdHMgLSB0aGUgc2V0IG9mIHByb2plY3RzIGZvciB3aGljaCB0aGlzIGNvbnRhaW5lciBpcyBiZWluZyBib3VuZAorCSAqIEBwYXJhbSByZXNwZWN0aXZlQ29udGFpbmVycyAtIHRoZSBzZXQgb2YgcmVzcGVjdGl2ZSBjb250YWluZXJzIGZvciB0aGUgYWZmZWN0ZWQgcHJvamVjdHMKKwkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzCisJICogCisJICogQHNlZSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgorCSAqIEBzZWUgI2dldENsYXNzcGF0aENvbnRhaW5lcihJUGF0aCwgSUphdmFQcm9qZWN0KQorCSAqIEBzZWUgSUNsYXNzcGF0aENvbnRhaW5lcgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdFtdIGFmZmVjdGVkUHJvamVjdHMsIElDbGFzc3BhdGhDb250YWluZXJbXSByZXNwZWN0aXZlQ29udGFpbmVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlBc3NlcnQuaXNUcnVlKGFmZmVjdGVkUHJvamVjdHMubGVuZ3RoID09IHJlc3BlY3RpdmVDb250YWluZXJzLmxlbmd0aCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgubWlzbWF0Y2hQcm9qZWN0c0NvbnRhaW5lcnMiICkpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCisJCWludCBwcm9qZWN0TGVuZ3RoID0gYWZmZWN0ZWRQcm9qZWN0cy5sZW5ndGg7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlJQ2xhc3NwYXRoRW50cnlbXVtdIG9sZFJlc29sdmVkUGF0aHMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Byb2plY3RMZW5ndGhdW107CisKKwkJLy8gZmlsdGVyIG91dCB1bm1vZGlmaWVkIHByb2plY3QgY29udGFpbmVycworCQlpbnQgcmVtYWluaW5nID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TGVuZ3RoOyBpKyspeworCisJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisKKwkJCUlKYXZhUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBhZmZlY3RlZFByb2plY3RzW2ldOworCQkJSUNsYXNzcGF0aENvbnRhaW5lciBuZXdDb250YWluZXIgPSByZXNwZWN0aXZlQ29udGFpbmVyc1tpXTsKKwkJCQorCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJaWYgKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpeworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJhd0NsYXNzcGF0aCA9IGFmZmVjdGVkUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJCQlmb3IgKGludCBqID0gMCwgY3BMZW5ndGggPSByYXdDbGFzc3BhdGgubGVuZ3RoOyBqIDxjcExlbmd0aDsgaisrKSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJhd0NsYXNzcGF0aFtqXTsKKwkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmIGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY29udGFpbmVyUGF0aCkpeworCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIWZvdW5kKXsKKwkJCQlhZmZlY3RlZFByb2plY3RzW2ldID0gbnVsbDsgLy8gZmlsdGVyIG91dCB0aGlzIHByb2plY3QgLSBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lciBwYXRoCisJCQl9CisJCQkKKwkJCU1hcCBwZXJQcm9qZWN0Q29udGFpbmVycyA9IChNYXApSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzLmdldChhZmZlY3RlZFByb2plY3QpOworCQkJaWYgKHBlclByb2plY3RDb250YWluZXJzID09IG51bGwpeworCQkJCXBlclByb2plY3RDb250YWluZXJzID0gbmV3IEhhc2hNYXAoKTsKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMucHV0KGFmZmVjdGVkUHJvamVjdCwgcGVyUHJvamVjdENvbnRhaW5lcnMpOworCQkJfSBlbHNlIHsKKwkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBwZXJQcm9qZWN0Q29udGFpbmVycy5nZXQoY29udGFpbmVyUGF0aCk7CisJCQkJaWYgKG9sZENvbnRhaW5lciAhPSBudWxsICYmIG9sZENvbnRhaW5lci5lcXVhbHMocmVzcGVjdGl2ZUNvbnRhaW5lcnNbaV0pKXsKKwkJCQkJYWZmZWN0ZWRQcm9qZWN0c1tpXSA9IG51bGw7IC8vIGZpbHRlciBvdXQgdGhpcyBwcm9qZWN0IC0gY29udGFpbmVyIGRpZCBub3QgY2hhbmdlCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChmb3VuZCl7CisJCQkJcmVtYWluaW5nKys7CisJCQkJb2xkUmVzb2x2ZWRQYXRoc1tpXSA9IGFmZmVjdGVkUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKKwkJCX0KKwkJCXBlclByb2plY3RDb250YWluZXJzLnB1dChjb250YWluZXJQYXRoLCBuZXdDb250YWluZXIpOworCQl9CisJCQorCQlpZiAocmVtYWluaW5nID09IDApIHJldHVybjsKKwkJCisJCS8vIHRyaWdnZXIgbW9kZWwgcmVmcmVzaAorCQlib29sZWFuIHdhc0ZpcmluZyA9IG1hbmFnZXIuaXNGaXJpbmcoKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJdHJ5IHsKKwkJCWlmICh3YXNGaXJpbmcpCisJCQkJbWFuYWdlci5zdG9wRGVsdGFzKCk7CisJCQkJCisJCQlmb3IoaW50IGkgPSAwOyBpIDwgcHJvamVjdExlbmd0aDsgaSsrKXsKKworCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKworCQkJCUphdmFQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IChKYXZhUHJvamVjdClhZmZlY3RlZFByb2plY3RzW2ldOworCQkJCWlmIChhZmZlY3RlZFByb2plY3QgPT0gbnVsbCkgY29udGludWU7IC8vIHdhcyBmaWx0ZXJlZCBvdXQKKwkJCQkKKwkJCQlpZiAoKytjb3VudCA9PSByZW1haW5pbmcpIHsgLy8gcmUtZW5hYmxlIGZpcmluZyBmb3IgdGhlIGxhc3Qgb3BlcmF0aW9uCisJCQkJCWlmICh3YXNGaXJpbmcpIHsKKwkJCQkJCXdhc0ZpcmluZyA9IGZhbHNlOworCQkJCQkJbWFuYWdlci5zdGFydERlbHRhcygpOworCQkJCQl9CisJCQkJfQorCQkJCisJCQkJLy8gZm9yY2UgYSByZWZyZXNoIG9mIHRoZSBhZmZlY3RlZCBwcm9qZWN0ICh3aWxsIGNvbXB1dGUgZGVsdGFzKQorCQkJCWFmZmVjdGVkUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoCisJCQkJCQlhZmZlY3RlZFByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksCisJCQkJCQlTZXRDbGFzc3BhdGhPcGVyYXRpb24uUmV1c2VPdXRwdXRMb2NhdGlvbiwKKwkJCQkJCW1vbml0b3IsCisJCQkJCQkhSmF2YU1vZGVsTWFuYWdlci5Jc1Jlc291cmNlVHJlZUxvY2tlZCwgLy8gY2FuIHNhdmUgcmVzb3VyY2VzCisJCQkJCQkhSmF2YU1vZGVsTWFuYWdlci5Jc1Jlc291cmNlVHJlZUxvY2tlZCAmJiBhZmZlY3RlZFByb2plY3QuZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSwgLy8gZm9yY2Ugc2F2ZT8KKwkJCQkJCW9sZFJlc29sdmVkUGF0aHNbaV0sCisJCQkJCQlyZW1haW5pbmcgPT0gMSwgLy8gbm8gaW5kaXZpZHVhbCBjeWNsZSBjaGVjayBpZiBtb3JlIHRoYW4gMSBwcm9qZWN0CisJCQkJCQlmYWxzZSk7IC8vIHVwZGF0aW5nIC0gbm8gdmFsaWRhdGlvbgorCQkJfQorCQkJaWYgKHJlbWFpbmluZyA+IDEpeworCQkJCS8vIHVzZSB3b3Jrc3BhY2UgcnVubmFibGUgc28gYXMgdG8gYWxsb3cgbWFya2VyIGNyZWF0aW9uIC0gd29ya2Fyb3VuZCBidWcgMTQ3MzMKKy8vCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oCisvLwkJCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKKy8vCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQkJCUphdmFQcm9qZWN0LnVwZGF0ZUFsbEN5Y2xlTWFya2VycygpOyAvLyB1cGRhdGUgdGhlbSBhbGwgYXQgb25jZQorLy8JCQkJCQl9CisvLwkJCQkJfSwgCisvLwkJCQkJbW9uaXRvcik7CQkJCQkKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh3YXNGaXJpbmcpIHsKKwkJCQltYW5hZ2VyLnN0YXJ0RGVsdGFzKCk7CisJCQkJLy8gaW4gY2FzZSBvZiBleGNlcHRpb24gdHJhdmVyc2luZywgZGVsdGFzIG1heSBiZSBmaXJlZCBvbmx5IGluIHRoZSBuZXh0ICNmaXJlKCkgaXRlcmF0aW9uCisJCQl9CisJCX0KKwkJCQkJCisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZS4KKwkgKiBUaGUgcGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQuCisJICogPHA+CisJICogVGhpcyBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkIHdoaWxlIHRoZSByZXNvdXJjZSB0cmVlIGlzIGxvY2tlZC4KKwkgKiA8cD4KKwkgKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCisJICogQHNlZSAjZ2V0Q2xhc3NwYXRoVmFyaWFibGUKKwkgKgorCSAqIEBkZXByZWNhdGVkIC0gdXNlIEFQSSB3aXRoIElQcm9ncmVzc01vbml0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgSVBhdGggcGF0aCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJc2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGVOYW1lLCBwYXRoLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqIFRoZSBwYXRoIG11c3Qgbm90IGJlIG51bGwuCisJICogPHA+CisJICogVGhpcyBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkIHdoaWxlIHRoZSByZXNvdXJjZSB0cmVlIGlzIGxvY2tlZC4KKwkgKiA8cD4KKwkgKiBDbGFzc3BhdGggdmFyaWFibGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBhbmQgCisJICogYXJlIHByZXNlcnZlZCBmcm9tIHNlc3Npb24gdG8gc2Vzc2lvbi4KKwkgKiA8cD4KKwkgKiBVcGRhdGluZyBhIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgdmFsdWUgaGFzIG5vIGVmZmVjdC4KKwkgKgorCSAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCisJICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcworCSAqIEBzZWUgI2dldENsYXNzcGF0aFZhcmlhYmxlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aFZhcmlhYmxlKAorCQlTdHJpbmcgdmFyaWFibGVOYW1lLAorCQlJUGF0aCBwYXRoLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCUFzc2VydC5pc1RydWUocGF0aCAhPSBudWxsLCBVdGlsLmJpbmQoImNsYXNzcGF0aC5udWxsVmFyaWFibGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRDbGFzc3BhdGhWYXJpYWJsZXMobmV3IFN0cmluZ1tde3ZhcmlhYmxlTmFtZX0sIG5ldyBJUGF0aFtdeyBwYXRoIH0sIG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlcyBvZiBhbGwgdGhlIGdpdmVuIGNsYXNzcGF0aCB2YXJpYWJsZXMgYXQgb25jZS4KKwkgKiBOdWxsIHBhdGhzIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY29ycmVzcG9uZGluZyB2YXJpYWJsZSByZW1vdmFsLgorCSAqIDxwPgorCSAqIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW5ub3QgYmUgdXNlZCB3aGlsZSB0aGUgcmVzb3VyY2UgdHJlZSBpcyBsb2NrZWQuCisJICogPHA+CisJICogQ2xhc3NwYXRoIHZhcmlhYmxlIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYW5kIAorCSAqIGFyZSBwcmVzZXJ2ZWQgZnJvbSBzZXNzaW9uIHRvIHNlc3Npb24uCisJICogPHA+CisJICogVXBkYXRpbmcgYSB2YXJpYWJsZSB3aXRoIHRoZSBzYW1lIHZhbHVlIGhhcyBubyBlZmZlY3QuCisJICogCisJICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgYW4gYXJyYXkgb2YgbmFtZXMgZm9yIHRoZSB1cGRhdGVkIGNsYXNzcGF0aCB2YXJpYWJsZXMKKwkgKiBAcGFyYW0gcGF0aHMgYW4gYXJyYXkgb2YgcGF0aCB1cGRhdGVzIGZvciB0aGUgbW9kaWZpZWQgY2xhc3NwYXRoIHZhcmlhYmxlcyAobnVsbAorCSAqICAgICAgIG1lYW5pbmcgdGhhdCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHJlbW92ZWQKKwkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzCisJICogQHNlZSAjZ2V0Q2xhc3NwYXRoVmFyaWFibGUKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aFZhcmlhYmxlcygKKwkJU3RyaW5nW10gdmFyaWFibGVOYW1lcywKKwkJSVBhdGhbXSBwYXRocywKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlBc3NlcnQuaXNUcnVlKHZhcmlhYmxlTmFtZXMubGVuZ3RoID09IHBhdGhzLmxlbmd0aCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgubWlzbWF0Y2hOYW1lUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJdXBkYXRlVmFyaWFibGVWYWx1ZXModmFyaWFibGVOYW1lcywgcGF0aHMsIG1vbml0b3IpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUV4ZWN1dGFibGVFeHRlbnNpb24uCisJICogUmVjb3JkIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gZGF0YSBmcm9tIHRoZSBwbHVnaW4uCisJICovCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKAorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywKKwkJU3RyaW5nIHByb3BlcnR5TmFtZSwKKwkJT2JqZWN0IGRhdGEpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjdXJyZW50IHRhYmxlIG9mIG9wdGlvbnMuIEFsbCBhbmQgb25seSB0aGUgb3B0aW9ucyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBnaXZlbiB0YWJsZSAKKwkgKiBhcmUgcmVtZW1iZXJlZDsgYWxsIHByZXZpb3VzIG9wdGlvbiBzZXR0aW5ncyBhcmUgZm9yZ290dGVuLCBpbmNsdWRpbmcgb25lcyBub3QgZXhwbGljaXRseQorCSAqIG1lbnRpb25lZC4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBuZXdPcHRpb25zIHRoZSBuZXcgb3B0aW9ucyAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pLAorCSAqICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVzZXQgYWxsIG9wdGlvbnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldE9wdGlvbnMoSGFzaHRhYmxlIG5ld09wdGlvbnMpIHsKKwkJCisJCS8vIHNlZSAjaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIGZvciBjaGFuZ2luZyBkZWZhdWx0IHNldHRpbmdzCisJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKworCQlpZiAobmV3T3B0aW9ucyA9PSBudWxsKXsKKwkJCW5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXREZWZhdWx0T3B0aW9ucygpOworCQl9CisJCUVudW1lcmF0aW9uIGtleXMgPSBuZXdPcHRpb25zLmtleXMoKTsKKwkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpeworCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworCQkJaWYgKGtleS5lcXVhbHMoQ09SRV9FTkNPRElORykpIGNvbnRpbnVlOyAvLyBza2lwcGVkLCBjb250cmlidXRlZCBieSByZXNvdXJjZSBwcmVmcworCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyluZXdPcHRpb25zLmdldChrZXkpOworCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7CisJCX0KKwkJCisJCS8vIHBlcnNpc3Qgb3B0aW9ucworCQlnZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwl9CisJCisJLyoqCisJICogU2h1dGRvd24gdGhlIEphdmFDb3JlIHBsdWdpbgorCSAqIDxwPgorCSAqIERlLXJlZ2lzdGVycyB0aGUgSmF2YU1vZGVsTWFuYWdlciBhcyBhIHJlc291cmNlIGNoYW5nZWQgbGlzdGVuZXIgYW5kIHNhdmUgcGFydGljaXBhbnQuCisJICogPHA+CisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3NodXRkb3duKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKworCQlzYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yKTsKKwkJd29ya3NwYWNlLnJlbW92ZVNhdmVQYXJ0aWNpcGFudCh0aGlzKTsKKworCQkoKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKS5zaHV0ZG93bigpOworCX0KKworCS8qKgorCSAqIEluaXRpYXRlIHRoZSBiYWNrZ3JvdW5kIGluZGV4aW5nIHByb2Nlc3MuCisJICogVGhpcyBzaG91bGQgYmUgZGVmZXJyZWQgYWZ0ZXIgdGhlIHBsdWdpbiBhY3RpdmF0aW9uLgorCSAqLworCXByaXZhdGUgdm9pZCBzdGFydEluZGV4aW5nKCkgeworCisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLnJlc2V0KCk7CisJfQorCisJLyoqCisJICogU3RhcnR1cCBvZiB0aGUgSmF2YUNvcmUgcGx1Z2luCisJICogPHA+CisJICogUmVnaXN0ZXJzIHRoZSBKYXZhTW9kZWxNYW5hZ2VyIGFzIGEgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lciBhbmQgc2F2ZSBwYXJ0aWNpcGFudC4KKwkgKiBTdGFydHMgdGhlIGJhY2tncm91bmQgaW5kZXhpbmcsIGFuZCByZXN0b3JlIHNhdmVkIGNsYXNzcGF0aCB2YXJpYWJsZSB2YWx1ZXMuCisJICogPHA+CisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7CisJCQorCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJdHJ5IHsKKwkJCW1hbmFnZXIuY29uZmlndXJlUGx1Z2luRGVidWdPcHRpb25zKCk7CisKKwkJCS8vIHJlcXVlc3Qgc3RhdGUgZm9sZGVyIGNyZWF0aW9uICh3b3JrYXJvdW5kIDE5ODg1KQorCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCisJCQkvLyByZXRyaWV2ZSB2YXJpYWJsZSB2YWx1ZXMKKwkJCUphdmFDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSmF2YU1vZGVsTWFuYWdlci5QbHVnaW5QcmVmZXJlbmNlc0xpc3RlbmVyKCkpOworCQkJbWFuYWdlci5sb2FkVmFyaWFibGVzKCk7CisKKwkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQkJd29ya3NwYWNlLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCisJCQkJbWFuYWdlci5kZWx0YVByb2Nlc3NvciwKKwkJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQVVUT19CVUlMRAorCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFCisJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURQorCQkJCQl8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSk7CisKKwkJCXN0YXJ0SW5kZXhpbmcoKTsKKwkJCXdvcmtzcGFjZS5hZGRTYXZlUGFydGljaXBhbnQodGhpcywgbWFuYWdlcik7CisJCQkKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJbWFuYWdlci5zaHV0ZG93bigpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCisJLyoqCisJICogSW50ZXJuYWwgdXBkYXRpbmcgb2YgYSB2YXJpYWJsZSB2YWx1ZXMgKG51bGwgcGF0aCBtZWFuaW5nIHJlbW92YWwpLCBhbGxvd2luZyB0byBjaGFuZ2UgbXVsdGlwbGUgdmFyaWFibGUgdmFsdWVzIGF0IG9uY2UuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVWYXJpYWJsZVZhbHVlcygKKwkJU3RyaW5nW10gdmFyaWFibGVOYW1lcywKKwkJSVBhdGhbXSB2YXJpYWJsZVBhdGhzLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKwkJCisJCWJvb2xlYW4gbmVlZEN5Y2xlQ2hlY2sgPSBmYWxzZTsKKwkJaW50IHZhckxlbmd0aCA9IHZhcmlhYmxlTmFtZXMubGVuZ3RoOworCQkKKwkJLy8gZ2F0aGVyIGNsYXNzcGF0aCBpbmZvcm1hdGlvbiBmb3IgdXBkYXRpbmcKKwkJSGFzaE1hcCBhZmZlY3RlZFByb2plY3RzID0gbmV3IEhhc2hNYXAoNSk7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlJSmF2YU1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRKYXZhTW9kZWwoKTsKKworCQkvLyBmaWx0ZXIgb3V0IHVubW9kaWZpZWQgdmFyaWFibGVzCisJCWludCBkaXNjYXJkQ291bnQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKXsKKwkJCUlQYXRoIG9sZFBhdGggPSAoSVBhdGgpSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZUdldCh2YXJpYWJsZU5hbWVzW2ldKTsKKwkJCWlmIChvbGRQYXRoID09IEphdmFNb2RlbE1hbmFnZXIuVmFyaWFibGVJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpIG9sZFBhdGggPSBudWxsOworCQkJaWYgKG9sZFBhdGggIT0gbnVsbCAmJiBvbGRQYXRoLmVxdWFscyh2YXJpYWJsZVBhdGhzW2ldKSl7CisJCQkJdmFyaWFibGVOYW1lc1tpXSA9IG51bGw7CisJCQkJZGlzY2FyZENvdW50Kys7CisJCQl9CisJCX0KKwkJaWYgKGRpc2NhcmRDb3VudCA+IDApeworCQkJaWYgKGRpc2NhcmRDb3VudCA9PSB2YXJMZW5ndGgpIHJldHVybjsKKwkJCWludCBjaGFuZ2VkTGVuZ3RoID0gdmFyTGVuZ3RoIC0gZGlzY2FyZENvdW50OworCQkJU3RyaW5nW10gY2hhbmdlZFZhcmlhYmxlTmFtZXMgPSBuZXcgU3RyaW5nW2NoYW5nZWRMZW5ndGhdOworCQkJSVBhdGhbXSBjaGFuZ2VkVmFyaWFibGVQYXRocyA9IG5ldyBJUGF0aFtjaGFuZ2VkTGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCB2YXJMZW5ndGg7IGkrKyl7CisJCQkJaWYgKHZhcmlhYmxlTmFtZXNbaV0gIT0gbnVsbCl7CisJCQkJCWNoYW5nZWRWYXJpYWJsZU5hbWVzW2luZGV4XSA9IHZhcmlhYmxlTmFtZXNbaV07CisJCQkJCWNoYW5nZWRWYXJpYWJsZVBhdGhzW2luZGV4XSA9IHZhcmlhYmxlUGF0aHNbaV07CisJCQkJCWluZGV4Kys7CisJCQkJfQorCQkJfQorCQkJdmFyaWFibGVOYW1lcyA9IGNoYW5nZWRWYXJpYWJsZU5hbWVzOworCQkJdmFyaWFibGVQYXRocyA9IGNoYW5nZWRWYXJpYWJsZVBhdGhzOworCQkJdmFyTGVuZ3RoID0gY2hhbmdlZExlbmd0aDsKKwkJfQorCQkKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCisJCWlmIChtb2RlbCAhPSBudWxsKSB7CisJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOworCQkJbmV4dFByb2plY3QgOiBmb3IgKGludCBpID0gMCwgcHJvamVjdExlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IHByb2plY3RMZW5ndGg7IGkrKyl7CisJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCQkJCQorCQkJCS8vIGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIG1vZGlmaWVkIHZhcmlhYmxlcyBpcyBwcmVzZW50IG9uIHRoZSBjbGFzc3BhdGgKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQkJCWZvciAoaW50IGogPSAwLCBjcExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjcExlbmd0aDsgaisrKXsKKwkJCQkJCisJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB2YXJMZW5ndGg7IGsrKyl7CisKKwkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZU5hbWVzW2tdOwkJCQkJCQorCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09ICBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKXsKKworCQkJCQkJCWlmICh2YXJpYWJsZU5hbWUuZXF1YWxzKGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKSl7CisJCQkJCQkJCWFmZmVjdGVkUHJvamVjdHMucHV0KHByb2plY3QsICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkpOworCQkJCQkJCQkKKwkJCQkJCQkJLy8gYWxzbyBjaGVjayB3aGV0aGVyIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBwcm9qIHJlZmVyZW5jZXMgYW5kIGN5Y2xlIG1hcmtlcnMKKwkJCQkJCQkJaWYgKCFuZWVkQ3ljbGVDaGVjayAmJiBlbnRyeS5nZXRQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gIDEpeworCQkJCQkJCQkJSVBhdGggb2xkUGF0aCA9IChJUGF0aClKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7CisJCQkJCQkJCQlpZiAob2xkUGF0aCA9PSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKSBvbGRQYXRoID0gbnVsbDsKKwkJCQkJCQkJCWlmIChvbGRQYXRoICE9IG51bGwgJiYgb2xkUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CisJCQkJCQkJCQkJbmVlZEN5Y2xlQ2hlY2sgPSB0cnVlOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlJUGF0aCBuZXdQYXRoID0gdmFyaWFibGVQYXRoc1trXTsKKwkJCQkJCQkJCQlpZiAobmV3UGF0aCAhPSBudWxsICYmIG5ld1BhdGguc2VnbWVudENvdW50KCkgPT0gMSkgeworCQkJCQkJCQkJCQluZWVkQ3ljbGVDaGVjayA9IHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0OworCQkJCQkJCX0KKwkJCQkJCQlJUGF0aCBzb3VyY2VQYXRoLCBzb3VyY2VSb290UGF0aDsKKwkJCQkJCQlpZiAoKChzb3VyY2VQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSkgIT0gbnVsbAkmJiB2YXJpYWJsZU5hbWUuZXF1YWxzKHNvdXJjZVBhdGguc2VnbWVudCgwKSkpCisJCQkJCQkJCXx8ICgoc291cmNlUm9vdFBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSkgIT0gbnVsbAkmJiB2YXJpYWJsZU5hbWUuZXF1YWxzKHNvdXJjZVJvb3RQYXRoLnNlZ21lbnQoMCkpKSkgeworCisJCQkJCQkJCWFmZmVjdGVkUHJvamVjdHMucHV0KHByb2plY3QsICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkpOworCQkJCQkJCQljb250aW51ZSBuZXh0UHJvamVjdDsKKwkJCQkJCQl9CisJCQkJCQl9CQkJCQkJCQkJCQkJCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gdXBkYXRlIHZhcmlhYmxlcworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhckxlbmd0aDsgaSsrKXsKKwkJCUlQYXRoIHBhdGggPSB2YXJpYWJsZVBhdGhzW2ldOworCQkJSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZVB1dCh2YXJpYWJsZU5hbWVzW2ldLCBwYXRoKTsKKwkJfQorCQkJCQorCQkvLyB1cGRhdGUgYWZmZWN0ZWQgcHJvamVjdCBjbGFzc3BhdGhzCisJCWludCBzaXplID0gYWZmZWN0ZWRQcm9qZWN0cy5zaXplKCk7CisJCQorCQlpZiAoIWFmZmVjdGVkUHJvamVjdHMuaXNFbXB0eSgpKSB7CisJCQlib29sZWFuIHdhc0ZpcmluZyA9IG1hbmFnZXIuaXNGaXJpbmcoKTsKKwkJCXRyeSB7CisJCQkJaWYgKHdhc0ZpcmluZykKKwkJCQkJbWFuYWdlci5zdG9wRGVsdGFzKCk7CisJCQkJLy8gcHJvcGFnYXRlIGNsYXNzcGF0aCBjaGFuZ2UKKwkJCQlJdGVyYXRvciBwcm9qZWN0c1RvVXBkYXRlID0gYWZmZWN0ZWRQcm9qZWN0cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChwcm9qZWN0c1RvVXBkYXRlLmhhc05leHQoKSkgeworCisJCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKworCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0c1RvVXBkYXRlLm5leHQoKTsKKwkJCQkJCisJCQkJCWlmICghcHJvamVjdHNUb1VwZGF0ZS5oYXNOZXh0KCkpIHsKKwkJCQkJCS8vIHJlLWVuYWJsZSBmaXJpbmcgZm9yIHRoZSBsYXN0IG9wZXJhdGlvbgorCQkJCQkJaWYgKHdhc0ZpcmluZykgeworCQkJCQkJCXdhc0ZpcmluZyA9IGZhbHNlOworCQkJCQkJCW1hbmFnZXIuc3RhcnREZWx0YXMoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwcm9qZWN0CisJCQkJCQkuc2V0UmF3Q2xhc3NwYXRoKAorCQkJCQkJCXByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksCisJCQkJCQkJU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLlJldXNlT3V0cHV0TG9jYXRpb24sCisJCQkJCQkJbW9uaXRvciwKKwkJCQkJCQkhSmF2YU1vZGVsTWFuYWdlci5Jc1Jlc291cmNlVHJlZUxvY2tlZCwgLy8gY2FuIGNoYW5nZSByZXNvdXJjZXMKKwkJCQkJCQkhSmF2YU1vZGVsTWFuYWdlci5Jc1Jlc291cmNlVHJlZUxvY2tlZCAmJiBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCksLy8gZm9yY2UgYnVpbGQgaWYgaW4gYXV0byBidWlsZCBtb2RlCisJCQkJCQkJKElDbGFzc3BhdGhFbnRyeVtdKSBhZmZlY3RlZFByb2plY3RzLmdldChwcm9qZWN0KSwKKwkJCQkJCQlzaXplID09IDEgJiYgbmVlZEN5Y2xlQ2hlY2ssIC8vIG5vIGluZGl2aWR1YWwgY2hlY2sgaWYgbW9yZSB0aGFuIDEgcHJvamVjdCB0byB1cGRhdGUKKwkJCQkJCQlmYWxzZSk7IC8vIHVwZGF0aW5nIC0gbm8gdmFsaWRhdGlvbgorCQkJCX0KKwkJCQlpZiAoc2l6ZSA+IDEgJiYgbmVlZEN5Y2xlQ2hlY2speworCQkJCQkvLyB1c2Ugd29ya3NwYWNlIHJ1bm5hYmxlIGZvciBwcm90ZWN0aW5nIG1hcmtlciBtYW5pcHVsYXRpb24KKy8vCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKAorLy8JCQkJCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworLy8JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQkJCQlKYXZhUHJvamVjdC51cGRhdGVBbGxDeWNsZU1hcmtlcnMoKTsgLy8gdXBkYXRlIHRoZW0gYWxsIGF0IG9uY2UKKy8vCQkJCQkJCX0KKy8vCQkJCQkJfSwgCisvLwkJCQkJCW1vbml0b3IpOwkJCQkJCisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAod2FzRmlyaW5nKSB7CisJCQkJCW1hbmFnZXIuc3RhcnREZWx0YXMoKTsKKwkJCQkJLy8gaW4gY2FzZSBvZiBleGNlcHRpb24gdHJhdmVyc2luZywgZGVsdGFzIG1heSBiZSBmaXJlZCBvbmx5IGluIHRoZSBuZXh0ICNmaXJlKCkgaXRlcmF0aW9uCisJCQkJfQorCQkJfQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YU1vZGVsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3MTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsU3RhdHVzOworCisvKioKKyAqIEEgY2hlY2tlZCBleGNlcHRpb24gcmVwcmVzZW50aW5nIGEgZmFpbHVyZSBpbiB0aGUgSmF2YSBtb2RlbC4KKyAqIEphdmEgbW9kZWwgZXhjZXB0aW9ucyBjb250YWluIGEgSmF2YS1zcGVjaWZpYyBzdGF0dXMgb2JqZWN0IGRlc2NyaWJpbmcgdGhlCisgKiBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEluc3RhbmNlcyBvZiB0aGlzCisgKiBjbGFzcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBKYXZhIG1vZGVsIHdoZW4gcHJvYmxlbXMgYXJpc2UsIHNvCisgKiB0aGVyZSBpcyBnZW5lcmFsbHkgbm8gbmVlZCBmb3IgY2xpZW50cyB0byBjcmVhdGUgaW5zdGFuY2VzLgorICogPC9wPgorICoKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhTW9kZWxFeGNlcHRpb24gZXh0ZW5kcyBDb3JlRXhjZXB0aW9uIHsKKwlDb3JlRXhjZXB0aW9uIG5lc3RlZENvcmVFeGNlcHRpb247CisvKioKKyAqIENyZWF0ZXMgYSBKYXZhIG1vZGVsIGV4Y2VwdGlvbiB0aGF0IHdyYXBwZXJzIHRoZSBnaXZlbiA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgorICogVGhlIGV4Y2VwdGlvbiBjb250YWlucyBhIEphdmEtc3BlY2lmaWMgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5CisgKiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgdGhlIGdpdmVuIHN0YXR1cyBjb2RlLgorICoKKyAqIEBwYXJhbSBleGNlcHRpb24gdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4KKyAqIEBwYXJhbSBjb2RlIG9uZSBvZiB0aGUgSmF2YS1zcGVjaWZpYyBzdGF0dXMgY29kZXMgZGVjbGFyZWQgaW4KKyAqICAgPGNvZGU+SUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czwvY29kZT4KKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cworICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUgorICovCitwdWJsaWMgSmF2YU1vZGVsRXhjZXB0aW9uKFRocm93YWJsZSBlLCBpbnQgY29kZSkgeworCXRoaXMobmV3IEphdmFNb2RlbFN0YXR1cyhjb2RlLCBlKSk7IAorfQorLyoqCisgKiBDcmVhdGVzIGEgSmF2YSBtb2RlbCBleGNlcHRpb24gZm9yIHRoZSBnaXZlbiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KKyAqIEVxdWl2YWxlbnQgdG8gCisgKiA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb24oZXhjZXB0aW9uLElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuQ09SRV9FWENFUFRJT048L2NvZGU+LgorICoKKyAqIEBwYXJhbSBleGNlcHRpb24gdGhlIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+CisgKi8KK3B1YmxpYyBKYXZhTW9kZWxFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwlzdXBlcihleGNlcHRpb24uZ2V0U3RhdHVzKCkpOworCXRoaXMubmVzdGVkQ29yZUV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKK30KKy8qKgorICogQ3JlYXRlcyBhIEphdmEgbW9kZWwgZXhjZXB0aW9uIGZvciB0aGUgZ2l2ZW4gSmF2YS1zcGVjaWZpYyBzdGF0dXMgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBzdGF0dXMgdGhlIEphdmEtc3BlY2lmaWMgc3RhdHVzIG9iamVjdAorICovCitwdWJsaWMgSmF2YU1vZGVsRXhjZXB0aW9uKElKYXZhTW9kZWxTdGF0dXMgc3RhdHVzKSB7CisJc3VwZXIoc3RhdHVzKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IHRoYXQgY2F1c2VkIHRoZSBmYWlsdXJlLgorICoKKyAqIEByZXR1cm4gdGhlIHdyYXBwZXJlZCA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAqICAgZGlyZWN0IGNhc2Ugb2YgdGhlIGZhaWx1cmUgd2FzIGF0IHRoZSBKYXZhIG1vZGVsIGxheWVyCisgKi8KK3B1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgeworCWlmICh0aGlzLm5lc3RlZENvcmVFeGNlcHRpb24gPT0gbnVsbCkgeworCQlyZXR1cm4gZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMubmVzdGVkQ29yZUV4Y2VwdGlvbjsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgbW9kZWwgc3RhdHVzIG9iamVjdCBmb3IgdGhpcyBleGNlcHRpb24uCisgKiBFcXVpdmFsZW50IHRvIDxjb2RlPihJSmF2YU1vZGVsU3RhdHVzKSBnZXRTdGF0dXMoKTwvY29kZT4uCisgKgorICogQHJldHVybiBhIHN0YXR1cyBvYmplY3QKKyAqLworcHVibGljIElKYXZhTW9kZWxTdGF0dXMgZ2V0SmF2YU1vZGVsU3RhdHVzKCkgeworCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoKTsKKwlpZiAoc3RhdHVzIGluc3RhbmNlb2YgSUphdmFNb2RlbFN0YXR1cykgeworCQlyZXR1cm4gKElKYXZhTW9kZWxTdGF0dXMpc3RhdHVzOworCX0gZWxzZSB7CisJCS8vIEEgcmVndWxhciBJU3RhdHVzIGlzIGNyZWF0ZWQgb25seSBpbiB0aGUgY2FzZSBvZiBhIENvcmVFeGNlcHRpb24uCisJCS8vIFNlZSBidWcgMTM0OTIgU2hvdWxkIGhhbmRsZSBKYXZhTW9kZWxFeGNlcHRpb25zIHRoYXQgY29udGFpbnMgQ29yZUV4Y2VwdGlvbiBtb3JlIGdyYWNlZnVsbHkgIAorCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyh0aGlzLm5lc3RlZENvcmVFeGNlcHRpb24pOworCX0KK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXhjZXB0aW9uIGluZGljYXRlcyB0aGF0IGEgSmF2YSBtb2RlbCBlbGVtZW50IGRvZXMgbm90CisgKiBleGlzdC4gU3VjaCBleGNlcHRpb25zIGhhdmUgYSBzdGF0dXMgd2l0aCBhIGNvZGUgb2YKKyAqIDxjb2RlPklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVDwvY29kZT4uCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBleGNlcHRpb24gaW5kaWNhdGVzIHRoYXQgYSBKYXZhIG1vZGVsCisgKiAgIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cyNpc0RvZXNOb3RFeGlzdAorICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzI0VMRU1FTlRfRE9FU19OT1RfRVhJU1QKKyAqLworcHVibGljIGJvb2xlYW4gaXNEb2VzTm90RXhpc3QoKSB7CisJSUphdmFNb2RlbFN0YXR1cyBqYXZhTW9kZWxTdGF0dXMgPSBnZXRKYXZhTW9kZWxTdGF0dXMoKTsKKwlyZXR1cm4gamF2YU1vZGVsU3RhdHVzICE9IG51bGwgJiYgamF2YU1vZGVsU3RhdHVzLmlzRG9lc05vdEV4aXN0KCk7Cit9CisvKioKKyAqIFJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBleGNlcHRpb24gc3VpdGFibGUgZm9yIGRlYnVnZ2luZworICogcHVycG9zZXMgb25seS4KKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJYnVmZmVyLmFwcGVuZCgiSmF2YSBNb2RlbCBFeGNlcHRpb246ICIpOyAvLyROT04tTkxTLTEkCisJaWYgKGdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKKwkJaWYgKGdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgeworCQkJQ29yZUV4Y2VwdGlvbiBjPSAoQ29yZUV4Y2VwdGlvbilnZXRFeGNlcHRpb24oKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIkNvcmUgRXhjZXB0aW9uIFtjb2RlICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKGMuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIl0gIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoYy5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChnZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsKKwkJfQorCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0U3RhdHVzKCkudG9TdHJpbmcoKSk7CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1NpZ25hdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxYzYyYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1NpZ25hdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTM4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBtZXRob2RzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdHlwZSBhbmQgbWV0aG9kIHNpZ25hdHVyZSBzdHJpbmdzLgorICogPHA+CisgKiBUaGUgc3ludGF4IGZvciBhIHR5cGUgc2lnbmF0dXJlIGlzOgorICogPHByZT4KKyAqIHR5cGVTaWduYXR1cmUgOjo9CisgKiAgICAgIkIiICAvLyBieXRlCisgKiAgIHwgIkMiICAvLyBjaGFyCisgKiAgIHwgIkQiICAvLyBkb3VibGUKKyAqICAgfCAiRiIgIC8vIGZsb2F0CisgKiAgIHwgIkkiICAvLyBpbnQKKyAqICAgfCAiSiIgIC8vIGxvbmcKKyAqICAgfCAiUyIgIC8vIHNob3J0CisgKiAgIHwgIlYiICAvLyB2b2lkCisgKiAgIHwgIloiICAvLyBib29sZWFuCisgKiAgIHwgIkwiICsgYmluYXJ5VHlwZU5hbWUgKyAiOyIgIC8vIHJlc29sdmVkIG5hbWVkIHR5cGUgKGkuZS4sIGluIGNvbXBpbGVkIGNvZGUpCisgKiAgIHwgIlEiICsgc291cmNlVHlwZU5hbWUgKyAiOyIgIC8vIHVucmVzb2x2ZWQgbmFtZWQgdHlwZSAoaS5lLiwgaW4gc291cmNlIGNvZGUpCisgKiAgIHwgIlsiICsgdHlwZVNpZ25hdHVyZSAgLy8gYXJyYXkgb2YgdHlwZSBkZW5vdGVkIGJ5IHR5cGVTaWduYXR1cmUKKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDx1bD4KKyAqICAgPGxpPjxjb2RlPiJbW0kiPC9jb2RlPiBkZW5vdGVzIDxjb2RlPmludFtdW108L2NvZGU+PC9saT4KKyAqICAgPGxpPjxjb2RlPiJMamF2YS5sYW5nLlN0cmluZzsiPC9jb2RlPiBkZW5vdGVzIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IGluIGNvbXBpbGVkIGNvZGU8L2xpPgorICogICA8bGk+PGNvZGU+IlFTdHJpbmciPC9jb2RlPiBkZW5vdGVzIDxjb2RlPlN0cmluZzwvY29kZT4gaW4gc291cmNlIGNvZGU8L2xpPgorICogICA8bGk+PGNvZGU+IlFqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gZGVub3RlcyA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPiBpbiBzb3VyY2UgY29kZTwvbGk+CisgKiAgIDxsaT48Y29kZT4iW1FTdHJpbmciPC9jb2RlPiBkZW5vdGVzIDxjb2RlPlN0cmluZ1tdPC9jb2RlPiBpbiBzb3VyY2UgY29kZTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGUgc3ludGF4IGZvciBhIG1ldGhvZCBzaWduYXR1cmUgaXM6CisgKiA8cHJlPgorICogbWV0aG9kU2lnbmF0dXJlIDo6PSAiKCIgKyBwYXJhbVR5cGVTaWduYXR1cmUqICsgIikiICsgcmV0dXJuVHlwZVNpZ25hdHVyZQorICogcGFyYW1UeXBlU2lnbmF0dXJlIDo6PSB0eXBlU2lnbmF0dXJlCisgKiByZXR1cm5UeXBlU2lnbmF0dXJlIDo6PSB0eXBlU2lnbmF0dXJlCisgKiA8L3ByZT4KKyAqIDxwPgorICogRXhhbXBsZXM6CisgKiA8dWw+CisgKiAgIDxsaT48Y29kZT4iKClJIjwvY29kZT4gZGVub3RlcyA8Y29kZT5pbnQgZm9vKCk8L2NvZGU+PC9saT4KKyAqICAgPGxpPjxjb2RlPiIoW0xqYXZhLmxhbmcuU3RyaW5nOylWIjwvY29kZT4gZGVub3RlcyA8Y29kZT52b2lkIGZvbyhqYXZhLmxhbmcuU3RyaW5nW10pPC9jb2RlPiBpbiBjb21waWxlZCBjb2RlPC9saT4KKyAqICAgPGxpPjxjb2RlPiIoUVN0cmluZzspUU9iamVjdDsiPC9jb2RlPiBkZW5vdGVzIDxjb2RlPk9iamVjdCBmb28oU3RyaW5nKTwvY29kZT4gaW4gc291cmNlIGNvZGU8L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQorICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpZ25hdHVyZSB7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgYm9vbGVhbiBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nWic8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0JPT0xFQU4gCQk9ICdaJzsKKworCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBwcmltaXRpdmUgdHlwZSBieXRlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidCJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQllURSAJCT0gJ0InOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGNoYXIgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0MnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19DSEFSIAkJPSAnQyc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgZG91YmxlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidEJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRE9VQkxFIAkJPSAnRCc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgcHJpbWl0aXZlIHR5cGUgZmxvYXQgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0YnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19GTE9BVCAJCT0gJ0YnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGludCBpbiBhIHNpZ25hdHVyZS4KKwkgKiBWYWx1ZSBpcyA8Y29kZT4nSSc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0lOVCAJCQk9ICdJJzsKKwkKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc2VtaWNvbG9uIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPic7JzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfU0VNSUNPTE9OIAkJCT0gJzsnOworCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIGxvbmcgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J0onPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19MT05HCQkJPSAnSic7CisJCisJLyoqCisJICogQ2hhcmFjdGVyIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIHByaW1pdGl2ZSB0eXBlIHNob3J0IGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidTJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfU0hPUlQJCT0gJ1MnOworCQorCS8qKgorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHJlc3VsdCB0eXBlIHZvaWQgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+J1YnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19WT0lECQkJPSAnVic7CisJCisJLyoqIAorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBkb3QgaW4gYSBzaWduYXR1cmUuIAorCSAqIFZhbHVlIGlzIDxjb2RlPicuJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfRE9UCQkJPSAnLic7CisJCisJLyoqIAorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBkb2xsYXIgaW4gYSBzaWduYXR1cmUuCisJICogVmFsdWUgaXMgPGNvZGU+JyQnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19ET0xMQVIJCQk9ICckJzsKKworCS8qKiAKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyBhbiBhcnJheSB0eXBlIGluIGEgc2lnbmF0dXJlLgorCSAqIFZhbHVlIGlzIDxjb2RlPidbJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfQVJSQVkJCT0gJ1snOworCisJLyoqIAorCSAqIENoYXJhY3RlciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiBhIHJlc29sdmVkLCBuYW1lZCB0eXBlIGluIGEgCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nTCc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1JFU09MVkVECQk9ICdMJzsKKworCS8qKiAKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYW4gdW5yZXNvbHZlZCwgbmFtZWQgdHlwZSBpbiBhCisJICogc2lnbmF0dXJlLiBWYWx1ZSBpcyA8Y29kZT4nUSc8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX1VOUkVTT0xWRUQJPSAnUSc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEgbmFtZWQgdHlwZSBpbiBhIHNpZ25hdHVyZS4gCisJICogVmFsdWUgaXMgPGNvZGU+JzsnPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19OQU1FX0VORAkJPSAnOyc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgYSBwYXJhbWV0ZXIgdHlwZSBsaXN0IGluIGEKKwkgKiBzaWduYXR1cmUuIFZhbHVlIGlzIDxjb2RlPicoJzwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSQU1fU1RBUlQJPSAnKCc7CisKKwkvKioKKwkgKiBDaGFyYWN0ZXIgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIGEgcGFyYW1ldGVyIHR5cGUgbGlzdCBpbiBhIAorCSAqIHNpZ25hdHVyZS4gVmFsdWUgaXMgPGNvZGU+JyknPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ19QQVJBTV9FTkQJPSAnKSc7CisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGJvb2xlYW4uCisJICogVmFsdWUgaXMgPGNvZGU+IloiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfQk9PTEVBTiAJCT0gIloiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGJ5dGUuIAorCSAqIFZhbHVlIGlzIDxjb2RlPiJCIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0JZVEUgCQk9ICJCIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjaGFyLgorCSAqIFZhbHVlIGlzIDxjb2RlPiJDIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX0NIQVIgCQk9ICJDIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBkb3VibGUuCisJICogVmFsdWUgaXMgPGNvZGU+IkQiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRE9VQkxFIAkJPSAiRCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgZmxvYXQuCisJICogVmFsdWUgaXMgPGNvZGU+IkYiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfRkxPQVQgCQk9ICJGIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBpbnQuCisJICogVmFsdWUgaXMgPGNvZGU+IkkiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfSU5UIAkJCT0gIkkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIGxvbmcuCisJICogVmFsdWUgaXMgPGNvZGU+IkoiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfTE9ORwkJCT0gIkoiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlIHNob3J0LgorCSAqIFZhbHVlIGlzIDxjb2RlPiJTIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX1NIT1JUCQk9ICJTIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIHNpZ25hdHVyZSBvZiByZXN1bHQgdHlwZSB2b2lkLgorCSAqIFZhbHVlIGlzIDxjb2RlPiJWIjwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX1ZPSUQJCQk9ICJWIjsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBOT19DSEFSID0gbmV3IGNoYXJbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gTk9fQ0hBUl9DSEFSID0gbmV3IGNoYXJbMF1bXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQk9PTEVBTiA9IHsnYicsICdvJywgJ28nLCAnbCcsICdlJywgJ2EnLCAnbid9OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCWVRFID0geydiJywgJ3knLCAndCcsICdlJ307CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENIQVIgPSB7J2MnLCAnaCcsICdhJywgJ3InfTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFID0geydkJywgJ28nLCAndScsICdiJywgJ2wnLCAnZSd9OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGTE9BVCA9IHsnZicsICdsJywgJ28nLCAnYScsICd0J307CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIElOVCA9IHsnaScsICduJywgJ3QnfTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gTE9ORyA9IHsnbCcsICdvJywgJ24nLCAnZyd9OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSE9SVCA9IHsncycsICdoJywgJ28nLCAncicsICd0J307CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFZPSUQgPSB7J3YnLCAnbycsICdpJywgJ2QnfTsKKwkKKwkKKy8qKgorICogTm90IGluc3RhbnRpYWJsZS4KKyAqLworcHJpdmF0ZSBTaWduYXR1cmUoKSB7fQorCitwcml2YXRlIHN0YXRpYyBsb25nIGNvcHlUeXBlKGNoYXJbXSBzaWduYXR1cmUsIGludCBzaWdQb3MsIGNoYXJbXSBkZXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzKSB7CisJaW50IGFycmF5Q291bnQgPSAwOworCWxvb3A6IHdoaWxlICh0cnVlKSB7CisJCXN3aXRjaCAoc2lnbmF0dXJlW3NpZ1BvcysrXSkgeworCQkJY2FzZSBDX0FSUkFZIDoKKwkJCQlhcnJheUNvdW50Kys7CisJCQkJYnJlYWs7CisJCQljYXNlIENfQk9PTEVBTiA6CisJCQkJaW50IGxlbmd0aCA9IEJPT0xFQU4ubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkoQk9PTEVBTiwgMCwgZGVzdCwgaW5kZXgsIGxlbmd0aCk7CisJCQkJaW5kZXggKz0gbGVuZ3RoOworCQkJCWJyZWFrIGxvb3A7CisJCQljYXNlIENfQllURSA6CisJCQkJbGVuZ3RoID0gQllURS5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShCWVRFLCAwLCBkZXN0LCBpbmRleCwgbGVuZ3RoKTsKKwkJCQlpbmRleCArPSBsZW5ndGg7CisJCQkJYnJlYWsgbG9vcDsKKwkJCWNhc2UgQ19DSEFSIDoKKwkJCQlsZW5ndGggPSBDSEFSLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KENIQVIsIDAsIGRlc3QsIGluZGV4LCBsZW5ndGgpOworCQkJCWluZGV4ICs9IGxlbmd0aDsKKwkJCQlicmVhayBsb29wOworCQkJY2FzZSBDX0RPVUJMRSA6CisJCQkJbGVuZ3RoID0gRE9VQkxFLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KERPVUJMRSwgMCwgZGVzdCwgaW5kZXgsIGxlbmd0aCk7CisJCQkJaW5kZXggKz0gbGVuZ3RoOworCQkJCWJyZWFrIGxvb3A7CisJCQljYXNlIENfRkxPQVQgOgorCQkJCWxlbmd0aCA9IEZMT0FULmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KEZMT0FULCAwLCBkZXN0LCBpbmRleCwgbGVuZ3RoKTsKKwkJCQlpbmRleCArPSBsZW5ndGg7CisJCQkJYnJlYWsgbG9vcDsKKwkJCWNhc2UgQ19JTlQgOgorCQkJCWxlbmd0aCA9IElOVC5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShJTlQsIDAsIGRlc3QsIGluZGV4LCBsZW5ndGgpOworCQkJCWluZGV4ICs9IGxlbmd0aDsKKwkJCQlicmVhayBsb29wOworCQkJY2FzZSBDX0xPTkcgOgorCQkJCWxlbmd0aCA9IExPTkcubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkoTE9ORywgMCwgZGVzdCwgaW5kZXgsIGxlbmd0aCk7CisJCQkJaW5kZXggKz0gbGVuZ3RoOworCQkJCWJyZWFrIGxvb3A7CisJCQljYXNlIENfU0hPUlQgOgorCQkJCWxlbmd0aCA9IFNIT1JULmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KFNIT1JULCAwLCBkZXN0LCBpbmRleCwgbGVuZ3RoKTsKKwkJCQlpbmRleCArPSBsZW5ndGg7CisJCQkJYnJlYWsgbG9vcDsKKwkJCWNhc2UgQ19WT0lEIDoKKwkJCQlsZW5ndGggPSBWT0lELmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KFZPSUQsIDAsIGRlc3QsIGluZGV4LCBsZW5ndGgpOworCQkJCWluZGV4ICs9IGxlbmd0aDsKKwkJCQlicmVhayBsb29wOworCQkJY2FzZSBDX1JFU09MVkVEIDoKKwkJCWNhc2UgQ19VTlJFU09MVkVEIDoKKwkJCQlpbnQgZW5kID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfU0VNSUNPTE9OLCBzaWduYXR1cmUsIHNpZ1Bvcyk7CisJCQkJaWYgKGVuZCA9PSAtMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCWludCBzdGFydDsKKwkJCQlpZiAoZnVsbHlRdWFsaWZ5VHlwZU5hbWVzKSB7CisJCQkJCXN0YXJ0ID0gc2lnUG9zOworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihDX0RPVCwgc2lnbmF0dXJlLCBzaWdQb3MsIGVuZCkrMTsKKwkJCQkJaWYgKHN0YXJ0ID09IDApIHN0YXJ0ID0gc2lnUG9zOworCQkJCX0gCisJCQkJbGVuZ3RoID0gZW5kLXN0YXJ0OworCQkJCVN5c3RlbS5hcnJheWNvcHkoc2lnbmF0dXJlLCBzdGFydCwgZGVzdCwgaW5kZXgsIGxlbmd0aCk7CisJCQkJc2lnUG9zID0gZW5kKzE7CisJCQkJaW5kZXggKz0gbGVuZ3RoOworCQkJCWJyZWFrIGxvb3A7CisJCX0KKwl9CisJd2hpbGUgKGFycmF5Q291bnQtLSA+IDApIHsKKwkJZGVzdFtpbmRleCsrXSA9ICdbJzsKKwkJZGVzdFtpbmRleCsrXSA9ICddJzsKKwl9CisJcmV0dXJuICgoKGxvbmcpIGluZGV4KSA8PCAzMikgKyBzaWdQb3M7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGFycmF5IG5lc3RpbmcgYWRkZWQgCisgKiB0byB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gYXJyYXlDb3VudCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbGV2ZWxzIG9mIGFycmF5IG5lc3RpbmcKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgYXJyYXkgdHlwZSBzaWduYXR1cmUKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVBcnJheVNpZ25hdHVyZShjaGFyW10gdHlwZVNpZ25hdHVyZSwgaW50IGFycmF5Q291bnQpIHsKKwlpZiAoYXJyYXlDb3VudCA9PSAwKSByZXR1cm4gdHlwZVNpZ25hdHVyZTsKKwlpbnQgc2lnTGVuZ3RoID0gdHlwZVNpZ25hdHVyZS5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5Q291bnQgKyBzaWdMZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlDb3VudDsgaSsrKSB7CisJCXJlc3VsdFtpXSA9IENfQVJSQVk7CisJfQorCVN5c3RlbS5hcnJheWNvcHkodHlwZVNpZ25hdHVyZSwgMCwgcmVzdWx0LCBhcnJheUNvdW50LCBzaWdMZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IG9mIGFycmF5IG5lc3RpbmcgYWRkZWQgCisgKiB0byB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gYXJyYXlDb3VudCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgbGV2ZWxzIG9mIGFycmF5IG5lc3RpbmcKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgYXJyYXkgdHlwZSBzaWduYXR1cmUKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQXJyYXlTaWduYXR1cmUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIGludCBhcnJheUNvdW50KSB7CisJcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlQXJyYXlTaWduYXR1cmUodHlwZVNpZ25hdHVyZS50b0NoYXJBcnJheSgpLCBhcnJheUNvdW50KSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBtZXRob2Qgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGUgCisgKiBzaWduYXR1cmVzLiBUaGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlIGlzIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQHBhcmFtIHJldHVyblR5cGUgdGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gY3JlYXRlTWV0aG9kU2lnbmF0dXJlKGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW10gcmV0dXJuVHlwZSkgeworCWludCBwYXJhbWV0ZXJUeXBlc0xlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwlpbnQgcGFyYW1ldGVyTGVuZ3RoID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzTGVuZ3RoOyBpKyspIHsKKwkJcGFyYW1ldGVyTGVuZ3RoICs9IHBhcmFtZXRlclR5cGVzW2ldLmxlbmd0aDsKKwkJCisJfQorCWludCByZXR1cm5UeXBlTGVuZ3RoID0gcmV0dXJuVHlwZS5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyWzEgKyBwYXJhbWV0ZXJMZW5ndGggKyAxICsgcmV0dXJuVHlwZUxlbmd0aF07CisJcmVzdWx0WzBdID0gQ19QQVJBTV9TVEFSVDsKKwlpbnQgaW5kZXggPSAxOworCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXNMZW5ndGg7IGkrKykgeworCQljaGFyW10gcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzW2ldOworCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyVHlwZS5sZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZSwgMCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoKTsKKwkJaW5kZXggKz0gbGVuZ3RoOworCX0KKwlyZXN1bHRbaW5kZXhdID0gQ19QQVJBTV9FTkQ7CisJU3lzdGVtLmFycmF5Y29weShyZXR1cm5UeXBlLCAwLCByZXN1bHQsIGluZGV4KzEsIHJldHVyblR5cGVMZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBtZXRob2Qgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGUgCisgKiBzaWduYXR1cmVzLiBUaGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlIGlzIGRvdC1iYXNlZC4KKyAqCisgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQHBhcmFtIHJldHVyblR5cGUgdGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgZW5jb2RlZCBtZXRob2Qgc2lnbmF0dXJlCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU1ldGhvZFNpZ25hdHVyZShTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcywgU3RyaW5nIHJldHVyblR5cGUpIHsKKwlpbnQgcGFyYW1ldGVyVHlwZXNMZW50aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwljaGFyW11bXSBwYXJhbWV0ZXJzID0gbmV3IGNoYXJbcGFyYW1ldGVyVHlwZXNMZW50aF1bXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzTGVudGg7IGkrKykgeworCQlwYXJhbWV0ZXJzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0udG9DaGFyQXJyYXkoKTsKKwl9CisJcmV0dXJuIG5ldyBTdHJpbmcoY3JlYXRlTWV0aG9kU2lnbmF0dXJlKHBhcmFtZXRlcnMsIHJldHVyblR5cGUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHR5cGUgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHR5cGUgbmFtZSBlbmNvZGVkIGFzIGEgY2hhcmFjdGVyCisgKiBhcnJheS4gVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bworICogPGNvZGU+Y3JlYXRlVHlwZVNpZ25hdHVyZShuZXcgU3RyaW5nKHR5cGVOYW1lKSxpc1Jlc29sdmVkKTwvY29kZT4sIGFsdGhvdWdoCisgKiBtb3JlIGVmZmljaWVudCBmb3IgY2FsbGVycyB3aXRoIGNoYXJhY3RlciBhcnJheXMgcmF0aGVyIHRoYW4gc3RyaW5ncy4gSWYgdGhlIAorICogdHlwZSBuYW1lIGlzIHF1YWxpZmllZCwgdGhlbiBpdCBpcyBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCisgKgorICogQHBhcmFtIHR5cGVOYW1lIHRoZSBwb3NzaWJseSBxdWFsaWZpZWQgdHlwZSBuYW1lCisgKiBAcGFyYW0gaXNSZXNvbHZlZCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZSBuYW1lIGlzIHRvIGJlIGNvbnNpZGVyZWQKKyAqICAgcmVzb2x2ZWQgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmcm9tIGEgYmluYXJ5IGNsYXNzIGZpbGUpLCBhbmQgCisgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdHlwZSBuYW1lIGlzIHRvIGJlIGNvbnNpZGVyZWQgdW5yZXNvbHZlZAorICogICAoZm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lIGZvdW5kIGluIHNvdXJjZSBjb2RlKQorICogQHJldHVybiB0aGUgZW5jb2RlZCB0eXBlIHNpZ25hdHVyZQorICogQHNlZSAjY3JlYXRlVHlwZVNpZ25hdHVyZShqYXZhLmxhbmcuU3RyaW5nLGJvb2xlYW4pCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKKwlyZXR1cm4gbmV3IFN0cmluZyhjcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBpc1Jlc29sdmVkKSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgZ2l2ZW4gdHlwZSBuYW1lIGVuY29kZWQgYXMgYSBjaGFyYWN0ZXIKKyAqIGFycmF5LiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisgKiA8Y29kZT5jcmVhdGVUeXBlU2lnbmF0dXJlKG5ldyBTdHJpbmcodHlwZU5hbWUpLGlzUmVzb2x2ZWQpLnRvQ2hhckFycmF5KCk8L2NvZGU+LCBhbHRob3VnaAorICogbW9yZSBlZmZpY2llbnQgZm9yIGNhbGxlcnMgd2l0aCBjaGFyYWN0ZXIgYXJyYXlzIHJhdGhlciB0aGFuIHN0cmluZ3MuIElmIHRoZSAKKyAqIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsIHRoZW4gaXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgcG9zc2libHkgcXVhbGlmaWVkIHR5cGUgbmFtZQorICogQHBhcmFtIGlzUmVzb2x2ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkCisgKiAgIHJlc29sdmVkIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZnJvbSBhIGJpbmFyeSBjbGFzcyBmaWxlKSwgYW5kIAorICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHR5cGUgbmFtZSBpcyB0byBiZSBjb25zaWRlcmVkIHVucmVzb2x2ZWQKKyAqICAgKGZvciBleGFtcGxlLCBhIHR5cGUgbmFtZSBmb3VuZCBpbiBzb3VyY2UgY29kZSkKKyAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKKyAqIEBzZWUgI2NyZWF0ZVR5cGVTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZyxib29sZWFuKQorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdIGNyZWF0ZUNoYXJBcnJheVR5cGVTaWduYXR1cmUoY2hhcltdIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKKwl0cnkgeworCQlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcigpOworCQlzY2FubmVyLnNldFNvdXJjZSh0eXBlTmFtZSk7CisJCWludCB0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCWJvb2xlYW4gcHJpbWl0aXZlID0gdHJ1ZTsKKwkJY2hhciBwcmltaXRpdmVTaWcgPSAnICc7CisJCVN0cmluZ0J1ZmZlciBzaWcgPSBudWxsOworCQlpbnQgYXJyYXlDb3VudCA9IDA7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyIDoKKwkJCQljaGFyW10gaWRTb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCk7CisJCQkJc2lnID0gbmV3IFN0cmluZ0J1ZmZlcihpZFNvdXJjZS5sZW5ndGgpOworCQkJCXNpZy5hcHBlbmQoaWRTb3VyY2UpOworCQkJCXByaW1pdGl2ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW4gOgorCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX0JPT0xFQU47CisJCQkJYnJlYWs7CisJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYnl0ZSA6CisJCQkJcHJpbWl0aXZlU2lnID0gU2lnbmF0dXJlLkNfQllURTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVjaGFyIDoKKwkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19DSEFSOworCQkJCWJyZWFrOworCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZSA6CisJCQkJcHJpbWl0aXZlU2lnID0gU2lnbmF0dXJlLkNfRE9VQkxFOworCQkJCWJyZWFrOworCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWZsb2F0IDoKKwkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19GTE9BVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbnQgOgorCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX0lOVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVsb25nIDoKKwkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19MT05HOworCQkJCWJyZWFrOworCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXNob3J0IDoKKwkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19TSE9SVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV2b2lkIDoKKwkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19WT0lEOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJd2hpbGUgKCFwcmltaXRpdmUgJiYgdG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1QpIHsKKwkJCXNpZy5hcHBlbmQoc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpKTsKKwkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCWlmICh0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCQlzaWcuYXBwZW5kKHNjYW5uZXIuZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSk7CisJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCX0KKwkJd2hpbGUgKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNLRVQpIHsKKwkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCWlmICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VUKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCWFycmF5Q291bnQrKzsKKwkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJfQorCQlpZiAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWNoYXJbXSByZXN1bHQ7CisJCWlmIChwcmltaXRpdmUpIHsKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW2FycmF5Q291bnQrMV07CisJCQlyZXN1bHRbYXJyYXlDb3VudF0gPSBwcmltaXRpdmVTaWc7CisJCX0gZWxzZSB7CisJCQlpbnQgc2lnTGVuZ3RoID0gc2lnLmxlbmd0aCgpOyAKKwkJCWludCByZXN1bHRMZW5ndGggPSBhcnJheUNvdW50ICsgMSArIHNpZ0xlbmd0aCArIDE7IC8vIGUuZy4gJ1tbW0xqYXZhLmxhbmcuU3RyaW5nOycKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbmd0aF07CisJCQlzaWcuZ2V0Q2hhcnMoMCwgc2lnTGVuZ3RoLCByZXN1bHQsIGFycmF5Q291bnQgKyAxKTsKKwkJCXJlc3VsdFthcnJheUNvdW50XSA9IGlzUmVzb2x2ZWQgPyBDX1JFU09MVkVEIDogQ19VTlJFU09MVkVEOworCQkJcmVzdWx0W3Jlc3VsdExlbmd0aC0xXSA9IENfTkFNRV9FTkQ7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUNvdW50OyBpKyspIHsKKwkJCXJlc3VsdFtpXSA9IENfQVJSQVk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQorfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHR5cGUgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHR5cGUgbmFtZS4gSWYgdGhlIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsCisgKiB0aGVuIGl0IGlzIGV4cGVjdGVkIHRvIGJlIGRvdC1iYXNlZC4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBjcmVhdGVUeXBlU2lnbmF0dXJlKCJpbnQiLCBodWNhaXJ6KSAtPiAiSSIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCB0cnVlKSAtPiAiTGphdmEubGFuZy5TdHJpbmc7IgorICogY3JlYXRlVHlwZVNpZ25hdHVyZSgiU3RyaW5nIiwgZmFsc2UpIC0+ICJRU3RyaW5nOyIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEubGFuZy5TdHJpbmciLCBmYWxzZSkgLT4gIlFqYXZhLmxhbmcuU3RyaW5nOyIKKyAqIGNyZWF0ZVR5cGVTaWduYXR1cmUoImludCBbXSIsIGZhbHNlKSAtPiAiW0kiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIHBvc3NpYmx5IHF1YWxpZmllZCB0eXBlIG5hbWUKKyAqIEBwYXJhbSBpc1Jlc29sdmVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZAorICogICByZXNvbHZlZCAoZm9yIGV4YW1wbGUsIGEgdHlwZSBuYW1lIGZyb20gYSBiaW5hcnkgY2xhc3MgZmlsZSksIGFuZCAKKyAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB0eXBlIG5hbWUgaXMgdG8gYmUgY29uc2lkZXJlZCB1bnJlc29sdmVkCisgKiAgIChmb3IgZXhhbXBsZSwgYSB0eXBlIG5hbWUgZm91bmQgaW4gc291cmNlIGNvZGUpCisgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgc2lnbmF0dXJlCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVR5cGVTaWduYXR1cmUoU3RyaW5nIHR5cGVOYW1lLCBib29sZWFuIGlzUmVzb2x2ZWQpIHsKKwlyZXR1cm4gY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZS50b0NoYXJBcnJheSgpLCBpc1Jlc29sdmVkKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgYXJyYXkgY291bnQgKGFycmF5IG5lc3RpbmcgZGVwdGgpIG9mIHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGFycmF5IG5lc3RpbmcgZGVwdGgsIG9yIDAgaWYgbm90IGFuIGFycmF5CisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5CisgKiAgIGNvcnJlY3QKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheUNvdW50KGNoYXJbXSB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsJCisJdHJ5IHsKKwkJaW50IGNvdW50ID0gMDsKKwkJd2hpbGUgKHR5cGVTaWduYXR1cmVbY291bnRdID09IENfQVJSQVkpIHsKKwkJCSsrY291bnQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBpZiBsYXN0IGNoYXJhY3RlciBpcyBDX0FSUkFZCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGFycmF5IGNvdW50IChhcnJheSBuZXN0aW5nIGRlcHRoKSBvZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCisgKgorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBhcnJheSBuZXN0aW5nIGRlcHRoLCBvciAwIGlmIG5vdCBhbiBhcnJheQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQorICogICBjb3JyZWN0CisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGdldEFycmF5Q291bnQoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXJldHVybiBnZXRBcnJheUNvdW50KHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIHdpdGhvdXQgYW55IGFycmF5IG5lc3RpbmcuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0RWxlbWVudFR5cGUoeydbJywgJ1snLCAnSSd9KSAtLT4geydJJ30uCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSB0eXBlIHNpZ25hdHVyZSB3aXRob3V0IGFycmF5cworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQorICogICBjb3JyZWN0CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0RWxlbWVudFR5cGUoY2hhcltdIHR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWludCBjb3VudCA9IGdldEFycmF5Q291bnQodHlwZVNpZ25hdHVyZSk7CisJaWYgKGNvdW50ID09IDApIHJldHVybiB0eXBlU2lnbmF0dXJlOworCWludCBsZW5ndGggPSB0eXBlU2lnbmF0dXJlLmxlbmd0aDsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoLWNvdW50XTsKKwlTeXN0ZW0uYXJyYXljb3B5KHR5cGVTaWduYXR1cmUsIGNvdW50LCByZXN1bHQsIDAsIGxlbmd0aC1jb3VudCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBzaWduYXR1cmUgd2l0aG91dCBhbnkgYXJyYXkgbmVzdGluZy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRFbGVtZW50VHlwZSgiW1tJIikgLS0+ICJJIi4KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICogCisgKiBAcGFyYW0gdHlwZVNpZ25hdHVyZSB0aGUgdHlwZSBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIHdpdGhvdXQgYXJyYXlzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5CisgKiAgIGNvcnJlY3QKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXJldHVybiBuZXcgU3RyaW5nKGdldEVsZW1lbnRUeXBlKHR5cGVTaWduYXR1cmUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIHR5cGVzIGluIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5CisgKiAgIGNvcnJlY3QKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaW50IGkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKSArIDE7CisJCWlmIChpID09IDApCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWZvciAoOzspIHsKKwkJCWNoYXIgYyA9IG1ldGhvZFNpZ25hdHVyZVtpKytdOworCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSBDX0FSUkFZIDoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX0JPT0xFQU4gOgorCQkJCWNhc2UgQ19CWVRFIDoKKwkJCQljYXNlIENfQ0hBUiA6CisJCQkJY2FzZSBDX0RPVUJMRSA6CisJCQkJY2FzZSBDX0ZMT0FUIDoKKwkJCQljYXNlIENfSU5UIDoKKwkJCQljYXNlIENfTE9ORyA6CisJCQkJY2FzZSBDX1NIT1JUIDoKKwkJCQljYXNlIENfVk9JRCA6CisJCQkJCSsrY291bnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ19SRVNPTFZFRCA6CisJCQkJY2FzZSBDX1VOUkVTT0xWRUQgOgorCQkJCQlpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfU0VNSUNPTE9OLCBtZXRob2RTaWduYXR1cmUsIGkpICsgMTsKKwkJCQkJaWYgKGkgPT0gMCkKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQkJKytjb3VudDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX1BBUkFNX0VORCA6CisJCQkJCXJldHVybiBjb3VudDsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQl9CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyBpbiB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3Qgc3ludGFjdGljYWxseQorICogICBjb3JyZWN0CisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlckNvdW50KFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXJldHVybiBnZXRQYXJhbWV0ZXJDb3VudChtZXRob2RTaWduYXR1cmUudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSBwYXJhbWV0ZXIgdHlwZSBzaWduYXR1cmVzIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIAorICogVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0UGFyYW1ldGVyVHlwZXMoY2hhcltdIG1ldGhvZFNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJaW50IGNvdW50ID0gZ2V0UGFyYW1ldGVyQ291bnQobWV0aG9kU2lnbmF0dXJlKTsKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbY291bnRdW107CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaW50IGkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKSArIDE7CisJCWNvdW50ID0gMDsKKwkJaW50IHN0YXJ0ID0gaTsKKwkJZm9yICg7OykgeworCQkJY2hhciBjID0gbWV0aG9kU2lnbmF0dXJlW2krK107CisJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlIENfQVJSQVkgOgorCQkJCQkvLyBhcnJheSBkZXB0aCBpcyBpIC0gc3RhcnQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ19CT09MRUFOIDoKKwkJCQljYXNlIENfQllURSA6CisJCQkJY2FzZSBDX0NIQVIgOgorCQkJCWNhc2UgQ19ET1VCTEUgOgorCQkJCWNhc2UgQ19GTE9BVCA6CisJCQkJY2FzZSBDX0lOVCA6CisJCQkJY2FzZSBDX0xPTkcgOgorCQkJCWNhc2UgQ19TSE9SVCA6CisJCQkJY2FzZSBDX1ZPSUQgOgorCQkJCQkvLyBjb21tb24gY2FzZSBvZiBiYXNlIHR5cGVzCisJCQkJCWlmIChpIC0gc3RhcnQgPT0gMSkgeworCQkJCQkJc3dpdGNoIChjKSB7CisJCQkJCQkJY2FzZSBDX0JPT0xFQU4gOgorCQkJCQkJCQlyZXN1bHRbY291bnQrK10gPSBuZXcgY2hhcltdIHtDX0JPT0xFQU59OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIENfQllURSA6CisJCQkJCQkJCXJlc3VsdFtjb3VudCsrXSA9IG5ldyBjaGFyW10ge0NfQllURX07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQ19DSEFSIDoKKwkJCQkJCQkJcmVzdWx0W2NvdW50KytdID0gbmV3IGNoYXJbXSB7Q19DSEFSfTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBDX0RPVUJMRSA6CisJCQkJCQkJCXJlc3VsdFtjb3VudCsrXSA9IG5ldyBjaGFyW10ge0NfRE9VQkxFfTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBDX0ZMT0FUIDoKKwkJCQkJCQkJcmVzdWx0W2NvdW50KytdID0gbmV3IGNoYXJbXSB7Q19GTE9BVH07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQ19JTlQgOgorCQkJCQkJCQlyZXN1bHRbY291bnQrK10gPSBuZXcgY2hhcltdIHtDX0lOVH07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQ19MT05HIDoKKwkJCQkJCQkJcmVzdWx0W2NvdW50KytdID0gbmV3IGNoYXJbXSB7Q19MT05HfTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBDX1NIT1JUIDoKKwkJCQkJCQkJcmVzdWx0W2NvdW50KytdID0gbmV3IGNoYXJbXSB7Q19TSE9SVH07CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQ19WT0lEIDoKKwkJCQkJCQkJcmVzdWx0W2NvdW50KytdID0gbmV3IGNoYXJbXSB7Q19WT0lEfTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXN1bHRbY291bnQrK10gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG1ldGhvZFNpZ25hdHVyZSwgc3RhcnQsIGkpOworCQkJCQl9CisJCQkJCXN0YXJ0ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX1JFU09MVkVEIDoKKwkJCQljYXNlIENfVU5SRVNPTFZFRCA6CisJCQkJCWkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19TRU1JQ09MT04sIG1ldGhvZFNpZ25hdHVyZSwgaSkgKyAxOworCQkJCQlpZiAoaSA9PSAwKQorCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJCQlyZXN1bHRbY291bnQrK10gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG1ldGhvZFNpZ25hdHVyZSwgc3RhcnQsIGkpOworCQkJCQlzdGFydCA9IGk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ19QQVJBTV9FTkQ6CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJZGVmYXVsdCA6CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwl9Cit9CisvKioKKyAqIEV4dHJhY3RzIHRoZSBwYXJhbWV0ZXIgdHlwZSBzaWduYXR1cmVzIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIAorICogVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcworICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzID0gZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpOworCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CisJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0W2ldID0gbmV3IFN0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIFJldHVybnMgYSBjaGFyIGFycmF5IGNvbnRhaW5pbmcgYWxsIGJ1dCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBnaXZlbiAKKyAqIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuIFJldHVybnMgdGhlIGVtcHR5IGNoYXIgYXJyYXkgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRRdWFsaWZpZXIoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ08nLCAnYicsICdqJywgJ2UnLCAnYycsICd0J30pIC0+IHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnfQorICogZ2V0UXVhbGlmaWVyKHsnTycsICd1JywgJ3QnLCAnZScsICdyJywgJy4nLCAnSScsICduJywgJ24nLCAnZScsICdyJ30pIC0+IHsnTycsICd1JywgJ3QnLCAnZScsICdyJ30KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZXIgcHJlZml4LCBvciB0aGUgZW1wdHkgY2hhciBhcnJheSBpZiB0aGUgbmFtZSBjb250YWlucyBubworICogICBkb3RzCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UXVhbGlmaWVyKGNoYXJbXSBuYW1lKSB7CisJaW50IGxhc3REb3QgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfRE9ULCBuYW1lKTsKKwlpZiAobGFzdERvdCA9PSAtMSkgeworCQlyZXR1cm4gTk9fQ0hBUjsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCAwLCBsYXN0RG90KTsKK30KKy8qKgorICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGFsbCBidXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZ2l2ZW4gCisgKiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBnZXRRdWFsaWZpZXIoImphdmEubGFuZy5PYmplY3QiKSAtPiAiamF2YS5sYW5nIgorICogZ2V0UXVhbGlmaWVyKCJPdXRlci5Jbm5lciIpIC0+ICJPdXRlciIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZXIgcHJlZml4LCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSBuYW1lIGNvbnRhaW5zIG5vCisgKiAgIGRvdHMKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0UXVhbGlmaWVyKG5hbWUudG9DaGFyQXJyYXkoKSkpOworfQorLyoqCisgKiBFeHRyYWN0cyB0aGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4gVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgCisgKiBleHBlY3RlZCB0byBiZSBkb3QtYmFzZWQuCisgKgorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB0eXBlCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIHN5bnRhY3RpY2FsbHkKKyAqICAgaW5jb3JyZWN0CisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UmV0dXJuVHlwZShjaGFyW10gbWV0aG9kU2lnbmF0dXJlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpbnQgaSA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoQ19QQVJBTV9FTkQsIG1ldGhvZFNpZ25hdHVyZSk7CisJaWYgKGkgPT0gLTEpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShtZXRob2RTaWduYXR1cmUsIGkgKyAxLCBtZXRob2RTaWduYXR1cmUubGVuZ3RoKTsKK30KKy8qKgorICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIAorICogZXhwZWN0ZWQgdG8gYmUgZG90LWJhc2VkLgorICoKKyAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSByZXR1cm4gdHlwZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpZ25hdHVyZSBpcyBzeW50YWN0aWNhbGx5CisgKiAgIGluY29ycmVjdAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXJldHVybiBuZXcgU3RyaW5nKGdldFJldHVyblR5cGUobWV0aG9kU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgorICogUmV0dXJucyB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIGdldFNpbXBsZU5hbWUoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ08nLCAnYicsICdqJywgJ2UnLCAnYycsICd0J30pIC0+IHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfQorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm4gdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRTaW1wbGVOYW1lKGNoYXJbXSBuYW1lKSB7CisJaW50IGxhc3REb3QgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfRE9ULCBuYW1lKTsKKwlpZiAobGFzdERvdCA9PSAtMSkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgbGFzdERvdCArIDEsIG5hbWUubGVuZ3RoKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgorICogUmV0dXJucyB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIGdldFNpbXBsZU5hbWUoImphdmEubGFuZy5PYmplY3QiKSAtPiAiT2JqZWN0IgorICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm4gdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgU3RyaW5nKGdldFNpbXBsZU5hbWUobmFtZS50b0NoYXJBcnJheSgpKSk7Cit9CisvKioKKyAqIFJldHVybnMgYWxsIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgorICogUmV0dXJucyBhbiBhcnJheSB3aXRoIG9ubHkgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIG5hbWUgaXMgZW1wdHkuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2ltcGxlTmFtZXMoeydqJywgJ2EnLCAndicsICdhJywgJy4nLCAnbCcsICdhJywgJ24nLCAnZycsICcuJywgJ08nLCAnYicsICdqJywgJ2UnLCAnYycsICd0J30pIC0+IHt7J2onLCAnYScsICd2JywgJ2EnfSwgeydsJywgJ2EnLCAnbicsICdnJ30sIHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0KKyAqIGdldFNpbXBsZU5hbWVzKHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfSkgLT4ge3snTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0KKyAqIGdldFNpbXBsZU5hbWVzKCIiKSAtPiB7fQorICogPC9jb2RlPgorICogPC9wcmU+CisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2ltcGxlIG5hbWVzLCBwb3NzaWJseSBlbXB0eQorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0U2ltcGxlTmFtZXMoY2hhcltdIG5hbWUpIHsKKwlpZiAobmFtZS5sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gTk9fQ0hBUl9DSEFSOworCX0KKwlpbnQgZG90ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfRE9ULCBuYW1lKTsKKwlpZiAoZG90ID09IC0xKSB7CisJCXJldHVybiBuZXcgY2hhcltdW10ge25hbWV9OworCX0KKwlpbnQgbiA9IDE7CisJd2hpbGUgKChkb3QgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19ET1QsIG5hbWUsIGRvdCArIDEpKSAhPSAtMSkgeworCQkrK247CisJfQorCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW24gKyAxXVtdOworCWludCBzZWdTdGFydCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJZG90ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKENfRE9ULCBuYW1lLCBzZWdTdGFydCk7CisJCXJlc3VsdFtpXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkobmFtZSwgc2VnU3RhcnQsIGRvdCk7CisJCXNlZ1N0YXJ0ID0gZG90ICsgMTsKKwl9CisJcmVzdWx0W25dID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCBzZWdTdGFydCwgbmFtZS5sZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIFJldHVybnMgYWxsIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgorICogUmV0dXJucyBhbiBhcnJheSB3aXRoIG9ubHkgdGhlIGdpdmVuIG5hbWUgaWYgaXQgaXMgbm90IHF1YWxpZmllZC4KKyAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIG5hbWUgaXMgZW1wdHkuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogZ2V0U2ltcGxlTmFtZXMoImphdmEubGFuZy5PYmplY3QiKSAtPiB7ImphdmEiLCAibGFuZyIsICJPYmplY3QifQorICogZ2V0U2ltcGxlTmFtZXMoIk9iamVjdCIpIC0+IHsiT2JqZWN0In0KKyAqIGdldFNpbXBsZU5hbWVzKCIiKSAtPiB7fQorICogPC9jb2RlPgorICogPC9wcmU+CisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc2ltcGxlIG5hbWVzLCBwb3NzaWJseSBlbXB0eQorICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNpbXBsZU5hbWVzKFN0cmluZyBuYW1lKSB7CisJY2hhcltdW10gc2ltcGxlTmFtZXMgPSBnZXRTaW1wbGVOYW1lcyhuYW1lLnRvQ2hhckFycmF5KCkpOworCWludCBsZW5ndGggPSBzaW1wbGVOYW1lcy5sZW5ndGg7CisJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0W2ldID0gbmV3IFN0cmluZyhzaW1wbGVOYW1lc1tpXSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENvbnZlcnRzIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgZm9ybS4gVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8KKyAqIGJlIGRvdC1iYXNlZC4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiB0b1N0cmluZygiKFtMamF2YS5sYW5nLlN0cmluZzspViIsICJtYWluIiwgbmV3IFN0cmluZ1tdIHsiYXJncyJ9LCBmYWxzZSwgdHJ1ZSkgLT4gInZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICogCisgKiBAcGFyYW0gbWV0aG9kU2lnbmF0dXJlIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yIAorICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtZXRob2QgbmFtZSBpcyB0byBiZSBpbmNsdWRlZAorICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIHRoZSBwYXJhbWV0ZXIgbmFtZXMgdG8gaW5zZXJ0IGluIHRoZSByZXN1bHQsIG9yIAorICogICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwYXJhbWV0ZXIgbmFtZXMgYXJlIHRvIGJlIGluY2x1ZGVkOyBpZiBzdXBwbGllZCwKKyAqICAgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgbmFtZXMgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBAcGFyYW0gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHR5cGUgbmFtZXMgc2hvdWxkIGJlIGZ1bGx5CisgKiAgIHF1YWxpZmllZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2Ugb25seSBzaW1wbGUgbmFtZXMKKyAqIEBwYXJhbSBpbmNsdWRlUmV0dXJuVHlwZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgdG8gYmUKKyAqICAgaW5jbHVkZWQKKyAqIEByZXR1cm4gdGhlIGNoYXIgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJBcnJheShjaGFyW10gbWV0aG9kU2lnbmF0dXJlLCBjaGFyW10gbWV0aG9kTmFtZSwgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGJvb2xlYW4gZnVsbHlRdWFsaWZ5VHlwZU5hbWVzLCBib29sZWFuIGluY2x1ZGVSZXR1cm5UeXBlKSB7CisJdHJ5IHsKKwkJaW50IGZpcnN0UGFyZW4gPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19QQVJBTV9TVEFSVCwgbWV0aG9kU2lnbmF0dXJlKTsKKwkJaWYgKGZpcnN0UGFyZW4gPT0gLTEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCisJCWludCBzaWdMZW5ndGggPSBtZXRob2RTaWduYXR1cmUubGVuZ3RoOworCQkKKwkJLy8gY29tcHV0ZSByZXN1bHQgbGVuZ3RoCisJCQorCQkvLyBtZXRob2Qgc2lnbmF0dXJlCisJCWludCBwYXJhbUNvdW50ID0gMDsKKwkJaW50IGxhc3RQYXJlbiA9IC0xOworCQlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKKwkJc2lnbmF0dXJlOiBmb3IgKGludCBpID0gZmlyc3RQYXJlbjsgaSA8IHNpZ0xlbmd0aDsgaSsrKSB7CisJCQlzd2l0Y2ggKG1ldGhvZFNpZ25hdHVyZVtpXSkgeworCQkJCWNhc2UgQ19BUlJBWSA6CisJCQkJCXJlc3VsdExlbmd0aCArPSAyOyAvLyBbXQorCQkJCQljb250aW51ZSBzaWduYXR1cmU7CisJCQkJY2FzZSBDX0JPT0xFQU4gOgorCQkJCQlyZXN1bHRMZW5ndGggKz0gQk9PTEVBTi5sZW5ndGg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ19CWVRFIDoKKwkJCQkJcmVzdWx0TGVuZ3RoICs9IEJZVEUubGVuZ3RoOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfQ0hBUiA6CisJCQkJCXJlc3VsdExlbmd0aCArPSBDSEFSLmxlbmd0aDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX0RPVUJMRSA6CisJCQkJCXJlc3VsdExlbmd0aCArPSBET1VCTEUubGVuZ3RoOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfRkxPQVQgOgorCQkJCQlyZXN1bHRMZW5ndGggKz0gRkxPQVQubGVuZ3RoOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfSU5UIDoKKwkJCQkJcmVzdWx0TGVuZ3RoICs9IElOVC5sZW5ndGg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ19MT05HIDoKKwkJCQkJcmVzdWx0TGVuZ3RoICs9IExPTkcubGVuZ3RoOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfU0hPUlQgOgorCQkJCQlyZXN1bHRMZW5ndGggKz0gU0hPUlQubGVuZ3RoOworCQkJCQlicmVhazsKKwkJCQljYXNlIENfVk9JRCA6CisJCQkJCXJlc3VsdExlbmd0aCArPSBWT0lELmxlbmd0aDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX1JFU09MVkVEIDoKKwkJCQljYXNlIENfVU5SRVNPTFZFRCA6CisJCQkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19TRU1JQ09MT04sIG1ldGhvZFNpZ25hdHVyZSwgaSk7CisJCQkJCWlmIChlbmQgPT0gLTEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQkJaW50IHN0YXJ0OworCQkJCQlpZiAoZnVsbHlRdWFsaWZ5VHlwZU5hbWVzKSB7CisJCQkJCQlzdGFydCA9IGkrMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0YXJ0ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihDX0RPVCwgbWV0aG9kU2lnbmF0dXJlLCBpLCBlbmQpICsgMTsKKwkJCQkJCWlmIChzdGFydCA9PSAwKSBzdGFydCA9IGkrMTsKKwkJCQkJfSAKKwkJCQkJcmVzdWx0TGVuZ3RoICs9IGVuZC1zdGFydDsKKwkJCQkJaSA9IGVuZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDX1BBUkFNX1NUQVJUIDoKKwkJCQkJLy8gYWRkIHNwYWNlIGZvciAiKCIKKwkJCQkJcmVzdWx0TGVuZ3RoKys7CisJCQkJCWNvbnRpbnVlIHNpZ25hdHVyZTsKKwkJCQljYXNlIENfUEFSQU1fRU5EIDoKKwkJCQkJbGFzdFBhcmVuID0gaTsKKwkJCQkJaWYgKGluY2x1ZGVSZXR1cm5UeXBlKSB7CisJCQkJCQlpZiAocGFyYW1Db3VudCA+IDApIHsKKwkJCQkJCQkvLyByZW1vdmUgc3BhY2UgZm9yICIsICIgdGhhdCB3YXMgYWRkZWQgd2l0aCBsYXN0IHBhcmFtZXRlciBhbmQgcmVtb3ZlIHNwYWNlIHRoYXQgaXMgZ29pbmcgdG8gYmUgYWRkZWQgZm9yICIsICIgYWZ0ZXIgcmV0dXJuIHR5cGUgCisJCQkJCQkJLy8gYW5kIGFkZCBzcGFjZSBmb3IgIikgIgorCQkJCQkJCXJlc3VsdExlbmd0aCAtPSAyOworCQkJCQkJfSAvL2Vsc2UKKwkJCQkJCQkvLyByZW1vdmUgc3BhY2UgdGhhdCBpcyBnb2luZyB0byBiZSBhZGRlZCBmb3IgIiwgIiBhZnRlciByZXR1cm4gdHlwZSAKKwkJCQkJCQkvLyBhbmQgYWRkIHNwYWNlIGZvciAiKSAiCisJCQkJCQkJLy8gLT4gbm9vcAorCQkJCQkJCisJCQkJCQkvLyBkZWNyZW1lbnQgcGFyYW0gY291bnQgYmVjYXVzZSBpdCBpcyBnb2luZyB0byBiZSBhZGRlZCBmb3IgcmV0dXJuIHR5cGUKKwkJCQkJCXBhcmFtQ291bnQtLTsKKwkJCQkJCWNvbnRpbnVlIHNpZ25hdHVyZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChwYXJhbUNvdW50ID4gMCkgeworCQkJCQkJCS8vIHJlbW92ZSBzcGFjZSBmb3IgIiwgIiB0aGF0IHdhcyBhZGRlZCB3aXRoIGxhc3QgcGFyYW1ldGVyIGFuZCBhZGQgc3BhY2UgZm9yICIpIgorCQkJCQkJCXJlc3VsdExlbmd0aC0tOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBhZGQgc3BhY2UgZm9yICIpIgorCQkJCQkJCXJlc3VsdExlbmd0aCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWsgc2lnbmF0dXJlOworCQkJCQl9CisJCQkJZGVmYXVsdCA6CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCXJlc3VsdExlbmd0aCArPSAyOyAvLyBhZGQgc3BhY2UgZm9yICIsICIKKwkJCXBhcmFtQ291bnQrKzsKKwkJfQorCQkKKwkJLy8gcGFyYW1ldGVyIG5hbWVzCisJCWludCBwYXJhbWV0ZXJOYW1lc0xlbmd0aCA9IHBhcmFtZXRlck5hbWVzID09IG51bGwgPyAwIDogcGFyYW1ldGVyTmFtZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8cGFyYW1ldGVyTmFtZXNMZW5ndGg7IGkrKykgeworCQkJcmVzdWx0TGVuZ3RoICs9IHBhcmFtZXRlck5hbWVzW2ldLmxlbmd0aCArIDE7IC8vIHBhcmFtZXRlciBuYW1lICsgc3BhY2UKKwkJfQorCQkKKwkJLy8gc2VsZWN0b3IKKwkJaW50IHNlbGVjdG9yTGVuZ3RoID0gbWV0aG9kTmFtZSA9PSBudWxsID8gMCA6IG1ldGhvZE5hbWUubGVuZ3RoOworCQlyZXN1bHRMZW5ndGggKz0gc2VsZWN0b3JMZW5ndGg7CisJCQorCQkvLyBjcmVhdGUgcmVzdWx0aW5nIGNoYXIgYXJyYXkKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbmd0aF07CisJCQorCQkvLyByZXR1cm5lZCB0eXBlCisJCWludCBpbmRleCA9IDA7CisJCWlmIChpbmNsdWRlUmV0dXJuVHlwZSkgeworCQkJbG9uZyBwb3MgPSBjb3B5VHlwZShtZXRob2RTaWduYXR1cmUsIGxhc3RQYXJlbisxLCByZXN1bHQsIGluZGV4LCBmdWxseVF1YWxpZnlUeXBlTmFtZXMpOworCQkJaW5kZXggPSAoaW50KSAocG9zID4+PiAzMik7CisJCQlyZXN1bHRbaW5kZXgrK10gPSAnICc7CisJCX0KKwkJCisJCS8vIHNlbGVjdG9yCisJCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kTmFtZSwgMCwgcmVzdWx0LCBpbmRleCwgc2VsZWN0b3JMZW5ndGgpOworCQkJaW5kZXggKz0gc2VsZWN0b3JMZW5ndGg7CisJCX0KKwkJCisJCS8vIHBhcmFtZXRlcnMKKwkJcmVzdWx0W2luZGV4KytdID0gQ19QQVJBTV9TVEFSVDsKKwkJaW50IHNpZ1BvcyA9IGZpcnN0UGFyZW4rMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUNvdW50OyBpKyspIHsKKwkJCWxvbmcgcG9zID0gY29weVR5cGUobWV0aG9kU2lnbmF0dXJlLCBzaWdQb3MsIHJlc3VsdCwgaW5kZXgsIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyk7CisJCQlpbmRleCA9IChpbnQpIChwb3MgPj4+IDMyKTsKKwkJCXNpZ1BvcyA9IChpbnQpcG9zOworCQkJaWYgKHBhcmFtZXRlck5hbWVzICE9IG51bGwpIHsKKwkJCQlyZXN1bHRbaW5kZXgrK10gPSAnICc7CisJCQkJY2hhcltdIHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXJOYW1lc1tpXTsKKwkJCQlpbnQgcGFyYW1MZW5ndGggPSBwYXJhbWV0ZXJOYW1lLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlck5hbWUsIDAsIHJlc3VsdCwgaW5kZXgsIHBhcmFtTGVuZ3RoKTsKKwkJCQlpbmRleCArPSBwYXJhbUxlbmd0aDsKKwkJCX0KKwkJCWlmIChpICE9IHBhcmFtQ291bnQtMSkgeworCQkJCXJlc3VsdFtpbmRleCsrXSA9ICcsJzsKKwkJCQlyZXN1bHRbaW5kZXgrK10gPSAnICc7CisJCQl9CisJCX0KKwkJaWYgKHNpZ1BvcyA+PSBzaWdMZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gc2hvdWxkIGJlIG9uIGxhc3QgcGFyZW4KKwkJfQorCQlyZXN1bHRbaW5kZXgrK10gPSBDX1BBUkFNX0VORDsKKwkJCisJCXJldHVybiByZXN1bHQ7CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0JCQorfQorLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBzdHJpbmcuIFRoZSBzaWduYXR1cmUgaXMgZXhwZWN0ZWQgdG8KKyAqIGJlIGRvdC1iYXNlZC4KKyAqIAorICogPHA+CisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIHRvU3RyaW5nKHsnWycsICdMJywgJ2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnUycsICd0JywgJ3InLCAnaScsICduJywgJ2cnLCAnOyd9KSAtPiB7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnUycsICd0JywgJ3InLCAnaScsICduJywgJ2cnLCAnWycsICddJ30KKyAqIHRvU3RyaW5nKHsnSSd9KSAtPiB7J2knLCAnbicsICd0J30KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgYSB0eXBlIHNpZ25hdHVyZSBjb250YWluaW5nIGEgPGNvZGU+JyQnPC9jb2RlPgorICogaXMgYW4gaW5uZXIgdHlwZSBzaWduYXR1cmUuIFdoaWxlIHRoaXMgaXMgY29ycmVjdCBpbiBtb3N0IGNhc2VzLCBzb21lb25lIGNvdWxkIAorICogZGVmaW5lIGEgbm9uLWlubmVyIHR5cGUgbmFtZSBjb250YWluaW5nIGEgPGNvZGU+JyQnPC9jb2RlPi4gSGFuZGxpbmcgdGhpcyAKKyAqIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMgd291bGQgaGF2ZSByZXF1aXJlZCByZXNvbHZpbmcgdGhlIHNpZ25hdHVyZSwgd2hpY2ggCisgKiBnZW5lcmFsbHkgbm90IGZlYXNpYmxlLgorICogPC9wPgorICoKKyAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHR5cGUgc2lnbmF0dXJlCisgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IHN5bnRhY3RpY2FsbHkKKyAqICAgY29ycmVjdAorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgY2hhcltdIHRvQ2hhckFycmF5KGNoYXJbXSBzaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCXRyeSB7CisJCWludCBzaWdMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOworCisJCWlmIChzaWdMZW5ndGggPT0gMCB8fCBzaWduYXR1cmVbMF0gPT0gQ19QQVJBTV9TVEFSVCkgeworCQkJcmV0dXJuIHRvQ2hhckFycmF5KHNpZ25hdHVyZSwgTk9fQ0hBUiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CisJCX0KKwkJCisJCS8vIGNvbXB1dGUgcmVzdWx0IGxlbmd0aAorCQlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKKwkJaW50IGluZGV4ID0gLTE7CisJCXdoaWxlIChzaWduYXR1cmVbKytpbmRleF0gPT0gQ19BUlJBWSkgeworCQkJcmVzdWx0TGVuZ3RoICs9IDI7IC8vIFtdCisJCX0KKwkJc3dpdGNoIChzaWduYXR1cmVbaW5kZXhdKSB7CisJCQljYXNlIENfQk9PTEVBTiA6CisJCQkJcmVzdWx0TGVuZ3RoICs9IEJPT0xFQU4ubGVuZ3RoOworCQkJCWJyZWFrOworCQkJY2FzZSBDX0JZVEUgOgorCQkJCXJlc3VsdExlbmd0aCArPSBCWVRFLmxlbmd0aDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19DSEFSIDoKKwkJCQlyZXN1bHRMZW5ndGggKz0gQ0hBUi5sZW5ndGg7CisJCQkJYnJlYWs7CisJCQljYXNlIENfRE9VQkxFIDoKKwkJCQlyZXN1bHRMZW5ndGggKz0gRE9VQkxFLmxlbmd0aDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19GTE9BVCA6CisJCQkJcmVzdWx0TGVuZ3RoICs9IEZMT0FULmxlbmd0aDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19JTlQgOgorCQkJCXJlc3VsdExlbmd0aCArPSBJTlQubGVuZ3RoOworCQkJCWJyZWFrOworCQkJY2FzZSBDX0xPTkcgOgorCQkJCXJlc3VsdExlbmd0aCArPSBMT05HLmxlbmd0aDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19TSE9SVCA6CisJCQkJcmVzdWx0TGVuZ3RoICs9IFNIT1JULmxlbmd0aDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ19WT0lEIDoKKwkJCQlyZXN1bHRMZW5ndGggKz0gVk9JRC5sZW5ndGg7CisJCQkJYnJlYWs7CisJCQljYXNlIENfUkVTT0xWRUQgOgorCQkJY2FzZSBDX1VOUkVTT0xWRUQgOgorCQkJCWludCBlbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19TRU1JQ09MT04sIHNpZ25hdHVyZSwgaW5kZXgpOworCQkJCWlmIChlbmQgPT0gLTEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQlpbnQgc3RhcnQgPSBpbmRleCArIDE7CisJCQkJcmVzdWx0TGVuZ3RoICs9IGVuZC1zdGFydDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQkKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbmd0aF07CisJCWNvcHlUeXBlKHNpZ25hdHVyZSwgMCwgcmVzdWx0LCAwLCB0cnVlKTsKKworCQkvKioKKwkJICogQ29udmVydHMgJyQnIHNlcGFyYXRlZCB0eXBlIHNpZ25hdHVyZXMgaW50byAnLicgc2VwYXJhdGVkIHR5cGUgc2lnbmF0dXJlLgorCQkgKiBOT1RFOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdHlwZSBzaWduYXR1cmUgaXMgYW4gaW5uZXIgdHlwZSBzaWduYXR1cmUuCisJCSAqICAgICAgIFRoaXMgaXMgdHJ1ZSBpbiBtb3N0IGNhc2VzLCBidXQgc29tZW9uZSBjYW4gZGVmaW5lIGEgbm9uLWlubmVyIHR5cGUgCisJCSAqICAgICAgIG5hbWUgY29udGFpbmluZyBhICckJy4gSG93ZXZlciB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlLCB3ZSB3b3VsZCBoYXZlCisJCSAqICAgICAgIHRvIHJlc29sdmUgdGhlIHNpZ25hdHVyZSwgd2hpY2ggY2Fubm90IGJlIGRvbmUgYXQgdGhpcyBwb2ludC4KKwkJICovCisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShyZXN1bHQsIENfRE9MTEFSLCBDX0RPVCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJfQkKK30KKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIGFycmF5IG9mIHF1YWxpZmllZCBuYW1lIHNlZ21lbnRzIHRvIGEgcXVhbGlmaWVkIG5hbWUuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogdG9RdWFsaWZpZWROYW1lKHt7J2onLCAnYScsICd2JywgJ2EnfSwgeydsJywgJ2EnLCAnbicsICdnJ30sIHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0pIC0+IHsnaicsICdhJywgJ3YnLCAnYScsICcuJywgJ2wnLCAnYScsICduJywgJ2cnLCAnLicsICdPJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCd9CisgKiB0b1F1YWxpZmllZE5hbWUoe3snTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX0pIC0+IHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfQorICogdG9RdWFsaWZpZWROYW1lKHt7fX0pIC0+IHt9CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gc2VnbWVudHMgdGhlIGxpc3Qgb2YgbmFtZSBzZWdtZW50cywgcG9zc2libHkgZW1wdHkKKyAqIEByZXR1cm4gdGhlIGRvdC1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSB0b1F1YWxpZmllZE5hbWUoY2hhcltdW10gc2VnbWVudHMpIHsKKwlpbnQgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIE5PX0NIQVI7CisJaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gc2VnbWVudHNbMF07CisJCisJaW50IHJlc3VsdExlbmd0aCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlyZXN1bHRMZW5ndGggKz0gc2VnbWVudHNbaV0ubGVuZ3RoKzE7CisJfQorCXJlc3VsdExlbmd0aC0tOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZXN1bHRMZW5ndGhdOworCWludCBpbmRleCA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljaGFyW10gc2VnbWVudCA9IHNlZ21lbnRzW2ldOworCQlpbnQgc2VnbWVudExlbmd0aCA9IHNlZ21lbnQubGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnQsIDAsIHJlc3VsdCwgaW5kZXgsIHNlZ21lbnRMZW5ndGgpOworCQlpbmRleCArPSBzZWdtZW50TGVuZ3RoOworCQlpZiAoaSAhPSBsZW5ndGgtMSkgeworCQkJcmVzdWx0W2luZGV4KytdID0gQ19ET1Q7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIGFycmF5IG9mIHF1YWxpZmllZCBuYW1lIHNlZ21lbnRzIHRvIGEgcXVhbGlmaWVkIG5hbWUuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogdG9RdWFsaWZpZWROYW1lKG5ldyBTdHJpbmdbXSB7ImphdmEiLCAibGFuZyIsICJPYmplY3QifSkgLT4gImphdmEubGFuZy5PYmplY3QiCisgKiB0b1F1YWxpZmllZE5hbWUobmV3IFN0cmluZ1tdIHsiT2JqZWN0In0pIC0+ICJPYmplY3QiCisgKiB0b1F1YWxpZmllZE5hbWUobmV3IFN0cmluZ1swXSkgLT4gIiIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBwYXJhbSBzZWdtZW50cyB0aGUgbGlzdCBvZiBuYW1lIHNlZ21lbnRzLCBwb3NzaWJseSBlbXB0eQorICogQHJldHVybiB0aGUgZG90LXNlcGFyYXRlZCBxdWFsaWZpZWQgbmFtZSwgb3IgdGhlIGVtcHR5IHN0cmluZworICovCitwdWJsaWMgc3RhdGljIFN0cmluZyB0b1F1YWxpZmllZE5hbWUoU3RyaW5nW10gc2VnbWVudHMpIHsKKwlpbnQgbGVuZ3RoID0gc2VnbWVudHMubGVuZ3RoOworCWNoYXJbXVtdIGNoYXJBcnJheXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljaGFyQXJyYXlzW2ldID0gc2VnbWVudHNbaV0udG9DaGFyQXJyYXkoKTsKKwl9CisJcmV0dXJuIG5ldyBTdHJpbmcodG9RdWFsaWZpZWROYW1lKGNoYXJBcnJheXMpKTsKK30KKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIHRvIGEgcmVhZGFibGUgc3RyaW5nLiBUaGUgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvCisgKiBiZSBkb3QtYmFzZWQuCisgKiAKKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogPGNvZGU+CisgKiB0b1N0cmluZygiW0xqYXZhLmxhbmcuU3RyaW5nOyIpIC0+ICJqYXZhLmxhbmcuU3RyaW5nW10iCisgKiB0b1N0cmluZygiSSIpIC0+ICJpbnQiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogTm90ZTogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IGEgdHlwZSBzaWduYXR1cmUgY29udGFpbmluZyBhIDxjb2RlPickJzwvY29kZT4KKyAqIGlzIGFuIGlubmVyIHR5cGUgc2lnbmF0dXJlLiBXaGlsZSB0aGlzIGlzIGNvcnJlY3QgaW4gbW9zdCBjYXNlcywgc29tZW9uZSBjb3VsZCAKKyAqIGRlZmluZSBhIG5vbi1pbm5lciB0eXBlIG5hbWUgY29udGFpbmluZyBhIDxjb2RlPickJzwvY29kZT4uIEhhbmRsaW5nIHRoaXMgCisgKiBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzIHdvdWxkIGhhdmUgcmVxdWlyZWQgcmVzb2x2aW5nIHRoZSBzaWduYXR1cmUsIHdoaWNoIAorICogZ2VuZXJhbGx5IG5vdCBmZWFzaWJsZS4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBzeW50YWN0aWNhbGx5CisgKiAgIGNvcnJlY3QKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIHNpZ25hdHVyZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJcmV0dXJuIG5ldyBTdHJpbmcodG9DaGFyQXJyYXkoc2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKTsKK30KKy8qKgorICogQ29udmVydHMgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgdG8gYSByZWFkYWJsZSBzdHJpbmcuIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGlzIGV4cGVjdGVkIHRvCisgKiBiZSBkb3QtYmFzZWQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogdG9TdHJpbmcoIihbTGphdmEubGFuZy5TdHJpbmc7KVYiLCAibWFpbiIsIG5ldyBTdHJpbmdbXSB7ImFyZ3MifSwgZmFsc2UsIHRydWUpIC0+ICJ2b2lkIG1haW4oU3RyaW5nW10gYXJncykiCisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIAorICogQHBhcmFtIG1ldGhvZFNpZ25hdHVyZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBjb252ZXJ0CisgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvciAKKyAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gbWV0aG9kIG5hbWUgaXMgdG8gYmUgaW5jbHVkZWQKKyAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lcyB0aGUgcGFyYW1ldGVyIG5hbWVzIHRvIGluc2VydCBpbiB0aGUgcmVzdWx0LCBvciAKKyAqICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVyIG5hbWVzIGFyZSB0byBiZSBpbmNsdWRlZDsgaWYgc3VwcGxpZWQsCisgKiAgIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIG5hbWVzIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogQHBhcmFtIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0eXBlIG5hbWVzIHNob3VsZCBiZSBmdWxseQorICogICBxdWFsaWZpZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIG9ubHkgc2ltcGxlIG5hbWVzCisgKiBAcGFyYW0gaW5jbHVkZVJldHVyblR5cGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJldHVybiB0eXBlIGlzIHRvIGJlCisgKiAgIGluY2x1ZGVkCisgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIG1ldGhvZFNpZ25hdHVyZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlck5hbWVzLCBib29sZWFuIGZ1bGx5UXVhbGlmeVR5cGVOYW1lcywgYm9vbGVhbiBpbmNsdWRlUmV0dXJuVHlwZSkgeworCWNoYXJbXVtdIHBhcmFtczsKKwlpZiAocGFyYW1ldGVyTmFtZXMgPT0gbnVsbCkgeworCQlwYXJhbXMgPSBudWxsOworCX0gZWxzZSB7CisJCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsKKwkJcGFyYW1zID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1MZW5ndGg7IGkrKykgeworCQkJcGFyYW1zW2ldID0gcGFyYW1ldGVyTmFtZXNbaV0udG9DaGFyQXJyYXkoKTsKKwkJfQorCX0KKwlyZXR1cm4gbmV3IFN0cmluZyh0b0NoYXJBcnJheShtZXRob2RTaWduYXR1cmUudG9DaGFyQXJyYXkoKSwgbWV0aG9kTmFtZSA9PSBudWxsID8gbnVsbCA6IG1ldGhvZE5hbWUudG9DaGFyQXJyYXkoKSwgcGFyYW1zLCBmdWxseVF1YWxpZnlUeXBlTmFtZXMsIGluY2x1ZGVSZXR1cm5UeXBlKSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Ub29sRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvVG9vbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDI0Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvVG9vbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuRGlzYXNzZW1ibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlcjsKKworLyoqCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyB2YXJpb3VzIGNvbXBpbGVyIHRvb2xzLCBzdWNoIGFzIHNjYW5uZXJzLCBwYXJzZXJzIGFuZCBjb21waWxlcnMuCisgKiA8cD4KKyAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICogPC9wPgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUb29sRmFjdG9yeSB7CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb2RlIGZvcm1hdHRlci4gQSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29udHJpYnV0ZWQgdmlhIHRoZSAKKwkgKiBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVGb3JtYXR0ZXIiLiBJZiB1bmFibGUgdG8gZmluZCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uLCB0aGUgZmFjdG9yeSAKKwkgKiB3aWxsIGRlZmF1bHQgdG8gdXNpbmcgdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuCisJICogCisJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBhIGNvZGUgZm9ybWF0dGVyCisJICogQHNlZSBJQ29kZUZvcm1hdHRlcgorCSAqIEBzZWUgVG9vbEZhY3RvcnkjY3JlYXRlRGVmYXVsdENvZGVGb3JtYXR0ZXIoTWFwKQorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNvZGVGb3JtYXR0ZXIgY3JlYXRlQ29kZUZvcm1hdHRlcigpeworCQkKKwkJCVBsdWdpbiBqZHRDb3JlUGx1Z2luID0gSmF2YUNvcmUuZ2V0UGx1Z2luKCk7CisJCQlpZiAoamR0Q29yZVBsdWdpbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCisJCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uID0gamR0Q29yZVBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSmF2YU1vZGVsTWFuYWdlci5GT1JNQVRURVJfRVhUUE9JTlRfSUQpOworCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7CisJCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSAgZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKTsKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyl7CisJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQkJCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW4gPSBleHRlbnNpb24uZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpOworCQkJCQkJaWYgKHBsdWdpbi5pc1BsdWdpbkFjdGl2YXRlZCgpKSB7CisJCQkJCQkJZm9yKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKXsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCU9iamVjdCBleGVjRXh0ID0gY29uZmlnRWxlbWVudHNbal0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJaWYgKGV4ZWNFeHQgaW5zdGFuY2VvZiBJQ29kZUZvcm1hdHRlcil7CisJCQkJCQkJCQkJLy8gdXNlIGZpcnN0IGNvbnRyaWJ1dGlvbiBmb3VuZAorCQkJCQkJCQkJCXJldHVybiAoSUNvZGVGb3JtYXR0ZXIpZXhlY0V4dDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpeworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0JCisJCQl9CisJCS8vIG5vIHByb3BlciBjb250cmlidXRpb24gZm91bmQsIHVzZSBkZWZhdWx0IGZvcm1hdHRlcgkJCQorCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENvZGVGb3JtYXR0ZXIobnVsbCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdC1pbiBjb2RlIGZvcm1hdHRlci4gQSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29udHJpYnV0ZWQgdmlhIHRoZSAKKwkgKiBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVGb3JtYXR0ZXIiLiBJZiB1bmFibGUgdG8gZmluZCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uLCB0aGUgZmFjdG9yeSB3aWxsIAorCSAqIGRlZmF1bHQgdG8gdXNpbmcgdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuCisJICogCisJICogQHBhcmFtIG9wdGlvbnMgLSB0aGUgb3B0aW9ucyBtYXAgdG8gdXNlIGZvciBmb3JtYXR0aW5nIHdpdGggdGhlIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIuIFJlY29nbml6ZWQgb3B0aW9ucworCSAqIAlhcmUgZG9jdW1lbnRlZCBvbiA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPi4gSWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHVzZSAKKwkgKiAJdGhlIGN1cnJlbnQgc2V0dGluZ3MgZnJvbSA8Y29kZT5KYXZhQ29yZSNnZXRPcHRpb25zPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdC1pbiBjb2RlIGZvcm1hdHRlcgorCSAqIEBzZWUgSUNvZGVGb3JtYXR0ZXIKKwkgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXIoKQorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0T3B0aW9ucygpCisJICovCisJcHVibGljIHN0YXRpYyBJQ29kZUZvcm1hdHRlciBjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcihNYXAgb3B0aW9ucyl7CisKKwkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKKwkJcmV0dXJuIG5ldyBDb2RlRm9ybWF0dGVyKG9wdGlvbnMpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBjbGFzc2ZpbGUgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyLCBhYmxlIHRvIHByb2R1Y2UgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUuCisJICogCisJICogQHJldHVybiBhIGNsYXNzZmlsZSBieXRlY29kZSBkaXNhc3NlbWJsZXIKKwkgKiBAc2VlIElDbGFzc0ZpbGVEaXNhc3NlbWJsZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc0ZpbGVEaXNhc3NlbWJsZXIgY3JlYXRlRGVmYXVsdENsYXNzRmlsZURpc2Fzc2VtYmxlcigpeworCQlyZXR1cm4gbmV3IERpc2Fzc2VtYmxlcigpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGUgYSBkZWZhdWx0IGNsYXNzZmlsZSByZWFkZXIsIGFibGUgdG8gZXhwb3NlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGdpdmVuIGNsYXNzZmlsZQorCSAqIGFjY29yZGluZyB0byB0aGUgZGVjb2RpbmcgZmxhZyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJlYWRlci4KKwkgKiBBbnN3ZXIgbnVsbCBpZiB0aGUgZmlsZSBuYW1lZCBmaWxlTmFtZSBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIC5jbGFzcyBmaWxlLgorCSAqIAorCSAqIFRoZSBkZWNvZGluZyBmbGFncyBhcmUgZGVzY3JpYmVkIGluIElDbGFzc0ZpbGVSZWFkZXIuCisJICogCisJICogQHBhcmFtIGZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHJlYWQKKwkgKiBAcGFyYW0gZGVjb2RpbmdGbGFnIHRoZSBmbGFnIHVzZWQgdG8gZGVjb2RlIHRoZSBjbGFzcyBmaWxlIHJlYWRlci4KKwkgKiBAcmV0dXJuIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyCisJICogCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlUmVhZGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoU3RyaW5nIGZpbGVOYW1lLCBpbnQgZGVjb2RpbmdGbGFnKXsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgQ2xhc3NGaWxlUmVhZGVyKFV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KG5ldyBGaWxlKGZpbGVOYW1lKSksIGRlY29kaW5nRmxhZyk7CisJCX0gY2F0Y2goQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CQorCQorCS8qKgorCSAqIENyZWF0ZSBhIGNsYXNzZmlsZSByZWFkZXIgb250byBhIGNsYXNzZmlsZSBKYXZhIGVsZW1lbnQuCisJICogQ3JlYXRlIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyLCBhYmxlIHRvIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIGRlY29kaW5nIGZsYWcgdXNlZCB0byBpbml0aWFsaXplIHRoZSByZWFkZXIuCisJICogQW5zd2VyIG51bGwgaWYgdGhlIGZpbGUgbmFtZWQgZmlsZU5hbWUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAuY2xhc3MgZmlsZS4KKwkgKiAKKwkgKiBUaGUgZGVjb2RpbmcgZmxhZ3MgYXJlIGRlc2NyaWJlZCBpbiBJQ2xhc3NGaWxlUmVhZGVyLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc2ZpbGUgdGhlIGNsYXNzZmlsZSBlbGVtZW50IHRvIGludHJvc3BlY3QKKwkgKiBAcGFyYW0gZGVjb2RpbmdGbGFnIHRoZSBmbGFnIHVzZWQgdG8gZGVjb2RlIHRoZSBjbGFzcyBmaWxlIHJlYWRlci4KKwkgKiBAcmV0dXJuIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyCisJICogCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlUmVhZGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoSUNsYXNzRmlsZSBjbGFzc2ZpbGUsIGludCBkZWNvZGluZ0ZsYWcpeworCisJCUlQYXRoIGZpbGVQYXRoID0gY2xhc3NmaWxlLmdldFBhdGgoKTsKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgY2xhc3NmaWxlLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOworCQlpZiAocm9vdCAhPSBudWxsKXsKKwkJCXRyeSB7CisJCQkJSVBhdGggcm9vdFBhdGggPSByb290LmdldFBhdGgoKTsKKwkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCQkJCQorCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSAoKEphclBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdCkuZ2V0SmFyKCkuZ2V0TmFtZSgpOworCQkJCQlTdHJpbmcgZW50cnlOYW1lID0gY2xhc3NmaWxlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7CisJCQkJCWVudHJ5TmFtZSA9IGVudHJ5TmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKKwkJCQkJaWYgKGVudHJ5TmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWVudHJ5TmFtZSArPSBjbGFzc2ZpbGUuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVudHJ5TmFtZSArPSAnLycgKyBjbGFzc2ZpbGUuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihhcmNoaXZlTmFtZSwgZW50cnlOYW1lLCBkZWNvZGluZ0ZsYWcpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKGNsYXNzZmlsZS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgZGVjb2RpbmdGbGFnKTsKKwkJCQl9CisJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyLCBhYmxlIHRvIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIGRlY29kaW5nIGZsYWcgdXNlZCB0byBpbml0aWFsaXplIHRoZSByZWFkZXIuCisJICogQW5zd2VyIG51bGwgaWYgdGhlIGZpbGUgbmFtZWQgemlwRmlsZU5hbWUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCB6aXAgZmlsZSBvciBpZiB0aGUgemlwRW50cnlOYW1lCisJICogaXMgbm90IGEgdmFsaWQgZW50cnkgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCB6aXAgZmlsZSBvciBpZiB0aGUgYnl0ZXMgZG9uJ3QgcmVwcmVzZW50IGEgdmFsaWQKKwkgKiAuY2xhc3MgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBUaGUgZGVjb2RpbmcgZmxhZ3MgYXJlIGRlc2NyaWJlZCBpbiBJQ2xhc3NGaWxlUmVhZGVyLgorCSAqIAorCSAqIEBwYXJhbSB6aXBGaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgemlwIGZpbGUKKwkgKiBAcGFyYW0gemlwRW50cnlOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgemlwIGZpbGUgdG8gYmUgcmVhZAorCSAqIEBwYXJhbSBkZWNvZGluZ0ZsYWcgdGhlIGZsYWcgdXNlZCB0byBkZWNvZGUgdGhlIGNsYXNzIGZpbGUgcmVhZGVyLgorCSAqIEByZXR1cm4gYSBkZWZhdWx0IGNsYXNzZmlsZSByZWFkZXIKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDbGFzc0ZpbGVSZWFkZXIgY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihTdHJpbmcgemlwRmlsZU5hbWUsIFN0cmluZyB6aXBFbnRyeU5hbWUsIGludCBkZWNvZGluZ0ZsYWcpeworCQl0cnkgeworCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwRmlsZU5hbWUpOworCQkJWmlwRW50cnkgemlwRW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHppcEVudHJ5TmFtZSk7CisJCQlpZiAoemlwRW50cnkgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKCF6aXBFbnRyeU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlieXRlIGNsYXNzRmlsZUJ5dGVzW10gPSBVdGlsLmdldFppcEVudHJ5Qnl0ZUNvbnRlbnQoemlwRW50cnksIHppcEZpbGUpOworCQkJcmV0dXJuIG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlQnl0ZXMsIGRlY29kaW5nRmxhZyk7CisJCX0gY2F0Y2goQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CQorCQorCS8qKgorCSAqIENyZWF0ZSBhIHNjYW5uZXIsIGluZGljYXRpbmcgdGhlIGxldmVsIG9mIGRldGFpbCByZXF1ZXN0ZWQgZm9yIHRva2VuaXppbmcuIFRoZSBzY2FubmVyIGNhbiB0aGVuIGJlCisJICogdXNlZCB0byB0b2tlbml6ZSBzb21lIHNvdXJjZSBpbiBhIEphdmEgYXdhcmUgd2F5LgorCSAqIEhlcmUgaXMgYSB0eXBpY2FsIHNjYW5uaW5nIGxvb3A6CisJICogCisJICogPGNvZGU+CisJICogPHByZT4KKwkgKiAgIElTY2FubmVyIHNjYW5uZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVTY2FubmVyKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwkgKiAgIHNjYW5uZXIuc2V0U291cmNlKCJpbnQgaSA9IDA7Ii50b0NoYXJBcnJheSgpKTsKKwkgKiAgIHdoaWxlICh0cnVlKSB7CisJICogICAgIGludCB0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJICogICAgIGlmICh0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgYnJlYWs7CisJICogICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b2tlbiArICIgOiAiICsgbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSk7CisJICogICB9CisJICogPC9wcmU+CisJICogPC9jb2RlPgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbml6ZUNvbW1lbnRzIGlmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIGNvbW1lbnRzIHdpbGwgYmUgc2lsZW50bHkgY29uc3VtZWQKKwkgKiBAcGFyYW0gdG9rZW5pemVXaGl0ZVNwYWNlIGlmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHdoaXRlIHNwYWNlcyB3aWxsIGJlIHNpbGVudGx5IGNvbnN1bWVkLAorCSAqIEBwYXJhbSBhc3NlcnRLZXl3b3JkIGlmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIG9jY3VycmVuY2VzIG9mICdhc3NlcnQnIHdpbGwgYmUgcmVwb3J0ZWQgYXMgaWRlbnRpZmllcnMKKwkgKiAoPGNvZGU+SVRlcm1pbmFsU3ltYm9scyNUb2tlbk5hbWVJZGVudGlmaWVyPC9jb2RlPiksIHdoZXJlYXMgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBpdAorCSAqIHdvdWxkIHJlcG9ydCBhc3NlcnQga2V5d29yZHMgKDxjb2RlPklUZXJtaW5hbFN5bWJvbHMjVG9rZW5OYW1lYXNzZXJ0PC9jb2RlPikuIEphdmEgMS40IGhhcyBpbnRyb2R1Y2VkCisJICogYSBuZXcgJ2Fzc2VydCcga2V5d29yZC4KKwkgKiBAcGFyYW0gcmVjb3JkTGluZVNlcGFyYXRvciBpZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBzY2FubmVyIHdpbGwgcmVjb3JkIHBvc2l0aW9ucyBvZiBlbmNvdW50ZXJlZCBsaW5lIAorCSAqIHNlcGFyYXRvciBlbmRzLiBJbiBjYXNlIG9mIG11bHRpLWNoYXJhY3RlciBsaW5lIHNlcGFyYXRvcnMsIHRoZSBsYXN0IGNoYXJhY3RlciBwb3NpdGlvbiBpcyBjb25zaWRlcmVkLiBUaGVzZSBwb3NpdGlvbnMKKwkgKiBjYW4gdGhlbiBiZSBleHRyYWN0ZWQgdXNpbmcgPGNvZGU+SVNjYW5uZXIjZ2V0TGluZUVuZHM8L2NvZGU+CisgIAkgKiBAcmV0dXJuIGEgc2Nhbm5lcgorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVNjYW5uZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTY2FubmVyIGNyZWF0ZVNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgYm9vbGVhbiBhc3NlcnRNb2RlLCBib29sZWFuIHJlY29yZExpbmVTZXBhcmF0b3IpeworCisJCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRva2VuaXplQ29tbWVudHMsIHRva2VuaXplV2hpdGVTcGFjZSwgZmFsc2UsIGFzc2VydE1vZGUpOworCQlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSByZWNvcmRMaW5lU2VwYXJhdG9yOworCQlyZXR1cm4gc2Nhbm5lcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lDb2RlU25pcHBldFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgyNWEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnN0YW50czsKKworLyoqCisgKiBBIGNvZGUgc25pcHBldCByZXF1ZXN0b3IgaW1wbGVtZW50cyBhIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgaW5zdGFsbGluZyAKKyAqIHRoZSBjbGFzcyBmaWxlcyBmb3IgYSBjb2RlIHNuaXBwZXQgb24gdGhlIHRhcmdldCBhbmQgcnVubmluZyBpdC4gCisgKiBJbiBhZGRpdGlvbiwgaXQgcmVjZWl2ZXMgY29tcGlsYXRpb24gcHJvYmxlbXMgZGV0ZWN0ZWQgZHVyaW5nIGNvZGUgc25pcHBldAorICogY29tcGlsYXRpb24uCisgKiA8cD4KKyAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBwcm92aWRlIGEgYnJpZGdlIGEgcnVubmluZyBKYXZhIFZNLgorICogPC9wPgorICoKKyAqIEBzZWUgSUV2YWx1YXRpb25Db250ZXh0I2V2YWx1YXRlQ29kZVNuaXBwZXQKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IgeworCQorCS8qKgorCSAqIFRoZSBwcmVmaXggb2YgZmllbGRzIHRoYXQgcmVwcmVzZW50IHRoZSBsb2NhbCB2YXJpYWJsZXMgaW4gYSBzbmlwcGV0CisJICogY2xhc3MuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfVkFSX1BSRUZJWCA9IG5ldyBTdHJpbmcoRXZhbHVhdGlvbkNvbnN0YW50cy5MT0NBTF9WQVJfUFJFRklYKTsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHJlcHJlc2VudCAndGhpcycgaW4gYSBzbmlwcGV0IGNsYXNzCisJICogaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfVEhJUyA9IG5ldyBTdHJpbmcoRXZhbHVhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9USElTKTsKKworCS8qKiAKKwkgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgbWV0aG9kIGluIHRoZSBzbmlwcGV0IGNsYXNzIHRoYXQgcnVucyB0aGUgY29kZSAKKwkgKiBzbmlwcGV0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9NRVRIT0QgPSBFdmFsdWF0aW9uQ29uc3RhbnRzLlJVTl9NRVRIT0Q7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4pIG9uIHRoZSBjb2RlIAorCSAqIHNuaXBwZXQgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgcmV0dXJuZWQgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1ZBTFVFX0ZJRUxEID0gRXZhbHVhdGlvbkNvbnN0YW50cy5SRVNVTFRfVkFMVUVfRklFTEQ7CisKKwkvKioKKwkgKiBUaGUgZmllbGQgb2YgdHlwZSBqYXZhLmxhbmcuQ2xhc3Mgb24gdGhlIGNvZGUgc25pcHBldCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KKwkgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLkNsYXNzPC9jb2RlPikgb24gdGhlIGNvZGUgCisJICogc25pcHBldCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9UWVBFX0ZJRUxEID0gRXZhbHVhdGlvbkNvbnN0YW50cy5SRVNVTFRfVFlQRV9GSUVMRDsKKworCS8qCisJICogUkVQT1JUSU5HIEEgUFJPQkxFTSBPRiBDT01QSUxBVElPTiBJTiBUSEUgQ09ERSBTTklQUEVUCisJICovCisJIAorCS8qKgorCSAqIEluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHByb2JsZW0gcmVsYXRlZCB0byBhIGdsb2JhbCB2YXJpYWJsZS4KKwkgKiA8cD4KKwkgKiBOb3RlOiBpZiB0aGUgcHJvYmxlbSBpcyBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUsIHRoZSBtYXJrZXIKKwkgKiBzb3VyY2UgbGluZSBudW1iZXIgaXMgLTE7IGlmIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSwgbGluZSBudW1iZXIgaXMgMDsKKwkgKiBvdGhlcndpc2UsIHRoZSBtYXJrZXIgc291cmNlIGxpbmUgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBpbml0aWFsaXplciAKKwkgKiBjb2RlLgorCSAqIDwvcD4KKwkgKgorCSAqIEBzZWUgI2FjY2VwdFByb2JsZW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRSA9IDE7CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgYSBjb21waWxhdGlvbiBwcm9ibGVtIHJlbGF0ZWQgdG8gYSBjb2RlIHNuaXBwZXQuCisJICoKKwkgKiBAc2VlICNhY2NlcHRQcm9ibGVtCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ERV9TTklQUEVUID0gMjsKKworCS8qKgorCSAqIEluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHByb2JsZW0gcmVsYXRlZCB0byBhbiBpbXBvcnQgZGVjbGFyYXRpb24uCisJICoKKwkgKiBAc2VlICNhY2NlcHRQcm9ibGVtCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUID0gMzsKKworCS8qKgorCSAqIEluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHByb2JsZW0gcmVsYXRlZCB0byBhIHBhY2thZ2UgZGVjbGFyYXRpb24uCisJICoKKwkgKiBAc2VlICNhY2NlcHRQcm9ibGVtCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRSA9IDQ7CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgYW4gaW50ZXJuYWwgcHJvYmxlbS4KKwkgKgorCSAqIEBzZWUgI2FjY2VwdFByb2JsZW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTCA9IDU7CQkKKy8qKgorICogU2VuZHMgdGhlIGdpdmVuIGNsYXNzIGZpbGVzIHRvIHRoZSB0YXJnZXQgYW5kIGxvYWRzIHRoZW0uIElmIHRoZSBnaXZlbgorICogY2xhc3MgbmFtZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHJ1biB0aGUgY29kZSBzbmlwcGV0IHdpdGggdGhpcyBjbGFzcworICogbmFtZS4gUmV0dXJucyB3aGV0aGVyIHRoZSBjb2RlIHNuaXBwZXQgY291bGQgYmUgZGVwbG95ZWQuIE5vdGUgaXQgbXVzdCAKKyAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBldmVuIGlmIHJ1bm5pbmcgdGhlIGNvZGUgc25pcHBldCB0aHJldyBhbiBleGNlcHRpb24uCisgKiA8cD4KKyAqIFRoZSBkZXRhaWxzIG9mIHNlbmRpbmcgYW5kIGxvYWRpbmcgdGhlIGNsYXNzIGZpbGVzIGFyZSBsZWZ0IHVwIHRvIAorICogaW1wbGVtZW50YXRpb25zLgorICogPC9wPgorICogPHA+CisgKiBUbyBydW4gYSBjb2RlIHNuaXBwZXQsIGFuIGltcGxlbWVudGF0aW9uIHNob3VsZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgCisgKiB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0IGNsYXNzIGFuZCBjYWxsIChkaXJlY3RseSBvciB1c2luZyBhbm90aGVyIG1lYW5zKSBpdHMgCisgKiA8Y29kZT5SVU5fTUVUSE9EPC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogQWxzbyBiZWZvcmUgdGhlIGNhbGwsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY29weSB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCAKKyAqIHZhcmlhYmxlcyAoaWYgYW55KSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLiAKKyAqIEEgZmllbGQgbmFtZSBpcyBmb3JtZWQgb2YgPGNvZGU+TE9DQUxfVkFSX1BSRUZJWDwvY29kZT4gCisgKiBwcmVjZWRlZCB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuIEZvciBleGFtcGxlLCB0aGUgZmllbGQgbmFtZSBmb3IgCisgKiBsb2NhbCB2YXJpYWJsZSA8Y29kZT4ibXlMb2NhbCI8L2NvZGU+IGlzIDxjb2RlPiJ2YWwkbXlMb2NhbCI8L2NvZGU+IChhc3N1bWluZyB0aGUgCisgKiB2YWx1ZSBvZiA8Y29kZT5MT0NBTF9WQVJfUFJFRklYPC9jb2RlPiBpcyAidmFsJCIpLiBJbiB0aGUgCisgKiBzYW1lIHdheSwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBjb3B5IHRoZSB2YWx1ZSBvZiB0aGUgJ3RoaXMnIG9iamVjdCBpbnRvIHRoZSAKKyAqIGZpZWxkIGNhbGxlZCA8Y29kZT5ERUxFR0FURV9USElTPC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogQWZ0ZXIgY2FsbGluZyB0aGUgPGNvZGU+UlVOX01FVEhPRDwvY29kZT4sIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsCisgKiB2YXJpYWJsZXMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC4gVGhlIGltcGxlbWVudGF0aW9uIG11c3QgY29weSB0aGUKKyAqIHZhbHVlcyBvZiB0aGUgZmllbGRzIGJhY2sgaW50byB0aGUgbG9jYWwgdmFyaWFibGVzLgorICogPC9wPgorICogPHA+CisgKiBGaW5hbGx5LCB0aGUgb3ZlcmFsbCB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZSBzbmlwcGV0IGNhbiBiZSByZXRyaWV2ZWQgCisgKiBmcm9tIHRoZSBzcGVjaWFsIGZpZWxkIDxjb2RlPlJFU1VMVF9WQUxVRV9GSUVMRDwvY29kZT4gCisgKiBvbiB0aGUgY29kZSBzbmlwcGV0IGluc3RhbmNlLiAKKyAqIFRoZSA8Y29kZT5DbGFzczwvY29kZT4gdGhhdCBpcyB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUKKyAqIHJldHJpZXZlZCBmcm9tIHRoZSBzcGVjaWFsIGZpZWxkIDxjb2RlPlJFU1VMVF9UWVBFX0ZJRUxEPC9jb2RlPi4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgdGhlIGxpc3Qgb2YgY2xhc3MgZmlsZSBieXRlcworICogQHBhcmFtIGNsYXNzRmlsZUNvbXBvdW5kTmFtZXMgdGhlIGNvcnJlc3BvbmRpbmcgbGlzdCBvZiBjbGFzcyBmaWxlIHR5cGUgCisgKiAgIGNvbXBvdW5kIG5hbWVzIChleGFtcGxlIG9mIGEgY29tcG91bmQgbmFtZTogeyJqYXZhIiwgImxhbmciLCAiT2JqZWN0In0pCisgKiBAcGFyYW0gY29kZVNuaXBwZXRDbGFzc05hbWUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIHRvIGluc3RhbnRpYXRlIGFuZCBydW4sCisgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvZGUgc25pcHBldCB3YXMgc3VjY2Vzc2Z1bGx5IGRlcGxveWVkCisgKi8KK3B1YmxpYyBib29sZWFuIGFjY2VwdENsYXNzRmlsZXMoYnl0ZVtdW10gY2xhc3NGaWxlQnl0ZXMsIFN0cmluZ1tdW10gY2xhc3NGaWxlQ29tcG91bmROYW1lcywgU3RyaW5nIGNvZGVTbmlwcGV0Q2xhc3NOYW1lKTsKKy8qKgorICogTm90aWZpZXMgb2YgYW4gZXZhbHVhdGlvbiBwcm9ibGVtLgorICogUHJvYmxlbXMgY2FuIGFyaXNlIGZvciBzb3VyY2Ugb2YgdGhlIGZvbGxvd2luZyBraW5kczoKKyAqIDxwPgorICogPHVsPgorICogICA8bGk+Z2xvYmFsIHZhcmlhYmxlICg8Y29kZT5WQVJJQUJMRTwvY29kZT4pIC0gZnJhZ21lbnQgc291cmNlIGlzIG5hbWUgb2YKKyAqICAgICB2YXJpYWJsZTwvbGk+CisgKiAgIDxsaT5jb2RlIHNuaXBwZXQgKDxjb2RlPkNPREVfU05JUFBFVDwvY29kZT4pIC0gZnJhZ21lbnQgc291cmNlIGlzIGNvZGUKKyAqICAgICBzbmlwcGV0PC9saT4KKyAqICAgPGxpPmltcG9ydCBkZWNsYXJhdGlvbiAoPGNvZGU+SU1QT1JUPC9jb2RlPikgLSBmcmFnbWVudCBzb3VyY2UgaXMgCisgKiAgICAgaW1wb3J0PC9saT4KKyAqICAgPGxpPnBhY2thZ2UgZGVjbGFyYXRpb24gKDxjb2RlPlBBQ0tBR0U8L2NvZGU+KSAtIGZyYWdtZW50IHNvdXJjZSBpcworICogICAgIHBhY2thZ2UgZGVjbGFyYXRpb248L2xpPgorICogICA8bGk+b3RoZXIgKDxjb2RlPklOVEVSTkFMPC9jb2RlPikgLSBubyBmcmFnbWVudCBzb3VyY2UgaXMgaW52b2x2ZWQsIGludGVybmFsIGVycm9yIG9jY3VycmVkLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogQHBhcmFtIHByb2JsZW1NYXJrZXIgdGhlIHByb2JsZW0gbWFya2VyIChjYW5ub3QgYmUgbnVsbCkKKyAqIEBwYXJhbSBmcmFnbWVudFNvdXJjZSB0aGUgZnJhZ21lbnQgc291cmNlCisgKiBAcGFyYW0gZnJhZ21lbnRLaW5kIHRoZSBraW5kIG9mIHNvdXJjZSBmcmFnbWVudDsgb25lIG9mOiAKKyAqICAgPGNvZGU+VkFSSUFCTEU8L2NvZGU+LCA8Y29kZT5DT0RFX1NOSVBQRVQ8L2NvZGU+LCA8Y29kZT5JTVBPUlQ8L2NvZGU+LAorICogICA8Y29kZT5QQUNLQUdFPC9jb2RlPiwgb3IgPGNvZGU+SU5URVJOQUw8L2NvZGU+CisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSU1hcmtlciBwcm9ibGVtTWFya2VyLCBTdHJpbmcgZnJhZ21lbnRTb3VyY2UsIGludCBmcmFnbWVudEtpbmQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JRXZhbHVhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUV2YWx1YXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjNmY0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUV2YWx1YXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQW4gZXZhbHVhdGlvbiBjb250ZXh0IHN1cHBvcnRzIGV2YWx1YXRpbmcgY29kZSBzbmlwcGV0cy4KKyAqIDxwPgorICogQSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IG11Y2ggYW55IHZhbGlkIHBpZWNlIG9mIEphdmEgY29kZSB0aGF0IGNvdWxkIGJlCisgKiBwYXN0ZWQgaW50byB0aGUgYm9keSBvZiBhIG1ldGhvZCBhbmQgY29tcGlsZWQuIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gCisgKiBhcmVhcyB3aGVyZSB0aGUgcnVsZXMgYXJlIHNsaWdodGx5IG1vcmUgbGliZXJhbC4KKyAqIDxwPgorICogRmlyc3QsIGEgY29kZSBzbmlwcGV0IGNhbiByZXR1cm4gaGV0ZXJvZ2VuZW91cyB0eXBlcy4gSW5zaWRlIHRoZSBzYW1lIGNvZGUKKyAqIHNuaXBwZXQgYW4gPGNvZGU+aW50PC9jb2RlPiBjb3VsZCBiZSByZXR1cm5lZCBvbiBvbmUgbGluZSwgYW5kIGEgCisgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9uIHRoZSBuZXh0LCBldGMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdvdWxkIGJlCisgKiBjb25zaWRlcmVkIGEgdmFsaWQgY29kZSBzbmlwcGV0OgorICogPHByZT4KKyAqIDxjb2RlPgorICogY2hhciBjID0gJzMnOworICogc3dpdGNoIChjKSB7CisgKiAgIGNhc2UgJzEnOiByZXR1cm4gMTsKKyAqICAgY2FzZSAnMic6IHJldHVybiAnMic7CisgKiAgIGNhc2UgJzMnOiByZXR1cm4gIjMiOworICogICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAqIH0KKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBTZWNvbmQsIGlmIHRoZSBsYXN0IHN0YXRlbWVudCBpcyBvbmx5IGFuIGV4cHJlc3Npb24sIHRoZSA8Y29kZT5yZXR1cm48L2NvZGU+IAorICoga2V5d29yZCBpcyBpbXBsaWVkLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPjogCisgKiA8cHJlPgorICogPGNvZGU+CisgKiBpbnQgaSA9IDE7CisgKiBpID09IDIKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBHbG9iYWwgdmFyaWFibGVzIGFyZSBhbiBhZGRpdGlvbmFsIGZlYXR1cmUgb2YgZXZhbHVhdGlvbiBjb250ZXh0cy4gV2l0aGluIGFuCisgKiBldmFsdWF0aW9uIGNvbnRleHQsIGdsb2JhbCB2YXJpYWJsZXMgbWFpbnRhaW4gdGhlaXIgdmFsdWUgYWNyb3NzIGV2YWx1YXRpb25zLgorICogVGhlc2UgdmFyaWFibGVzIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBzdG9yaW5nIHRoZSByZXN1bHQgb2YgYW4KKyAqIGV2YWx1YXRpb24gZm9yIHVzZSBpbiBzdWJzZXF1ZW50IGV2YWx1YXRpb25zLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZXZhbHVhdGlvbiBjb250ZXh0IHJlbWVtYmVycyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCBjb2RlCisgKiBzbmlwcGV0cyBhcmUgcnVuLiBUaGUgdXNlciBjYW4gc2V0IHRoaXMgdG8gYW55IHBhY2thZ2UsIHRoZXJlYnkgZ2FpbmluZworICogYWNjZXNzIHRvIHR5cGVzIHRoYXQgYXJlIG5vcm1hbGx5IG9ubHkgdmlzaWJsZSB3aXRoaW4gdGhhdCBwYWNrYWdlLgorICogPC9wPgorICogPHA+CisgKiBGaW5hbGx5LCB0aGUgZXZhbHVhdGlvbiBjb250ZXh0IHJlbWVtYmVycyBhIGxpc3Qgb2YgaW1wb3J0IGRlY2xhcmF0aW9ucy4gVGhlCisgKiB1c2VyIGNhbiBpbXBvcnQgYW55IHBhY2thZ2VzIGFuZCB0eXBlcyBzbyB0aGF0IHRoZSBjb2RlIHNuaXBwZXRzIG1heSByZWZlcgorICogdG8gdHlwZXMgYnkgdGhlaXIgc2hvcnRlciBzaW1wbGUgbmFtZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUgb2YgdXNlOgorICogPHByZT4KKyAqIDxjb2RlPgorICogSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOworICogSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQgPSBwcm9qZWN0Lm5ld0V2YWx1YXRpb25Db250ZXh0KCk7CisgKiBTdHJpbmcgY29kZVNuaXBwZXQgPSAiaW50IGk9IDA7IGkrKyI7CisgKiBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IgcmVxdWVzdG9yID0gLi4uOworICogY29udGV4dC5ldmFsdWF0ZUNvZGVTbmlwcGV0KGNvZGVTbmlwcGV0LCByZXF1ZXN0b3IsIHByb2dyZXNzTW9uaXRvcik7CisgKiA8L2NvZGU+CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAorICogPGNvZGU+SUphdmFQcm9qZWN0Lm5ld0V2YWx1YXRpb25Db250ZXh0PC9jb2RlPiBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYW4KKyAqIGluc3RhbmNlLgorICogPC9wPgorICoKKyAqIEBzZWUgSUphdmFQcm9qZWN0I25ld0V2YWx1YXRpb25Db250ZXh0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUV2YWx1YXRpb25Db250ZXh0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBnbG9iYWwgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0LgorCSAqIFRoZSB2YXJpYWJsZXMgYXJlIG1haW50YWluZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNyZWF0ZWQgaW4uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZXMKKwkgKi8KKwlwdWJsaWMgSUdsb2JhbFZhcmlhYmxlW10gYWxsVmFyaWFibGVzKCk7CisJLyoqCisJICogUGVyZm9ybXMgYSBjb2RlIGNvbXBsZXRpb24gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQsCisJICogcmVwb3J0aW5nIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGNvbXBsZXRpb24gcmVxdWVzdG9yLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBjb2RlIGNvbXBsZXRpb24gZG9lcyBub3QgaW52b2x2ZSBldmFsdWF0aW9uLgorCSAqIDxwPgorCSAqCisJICogQHBhcmFtIGNvZGVTbmlwcGV0IHRoZSBjb2RlIHNuaXBwZXQgdG8gY29tcGxldGUgaW4KKwkgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgY29kZSBzbmlwcGV0IHRvIGNvbXBsZXRlIGF0LAorCSAqICAgb3IgLTEgaW5kaWNhdGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzbmlwcGV0CisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29kZSBjb21wbGV0aW9uIHJlcXVlc3RvciBjYXBhYmxlIG9mIGFjY2VwdGluZyBhbGwKKwkgKiAgICBwb3NzaWJsZSB0eXBlcyBvZiBjb21wbGV0aW9ucworCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgY29tcGxldGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLiBSZWFzb25zIGluY2x1ZGU6CisJICogIDx1bD4KKwkgKgkgIDxsaT5UaGUgcG9zaXRpb24gc3BlY2lmaWVkIGlzIGxlc3MgdGhhbiAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhlIHNuaXBwZXQncworCSAqCSAgICBsZW5ndGggKElOREVYX09VVF9PRl9CT1VORFMpPC9saT4KKwkgKiAgPC91bD4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKAorCQlTdHJpbmcgY29kZVNuaXBwZXQsCisJCWludCBwb3NpdGlvbiwKKwkJSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBKYXZhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvdXJjZQorCSAqIGNvZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9ucyBpbiB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0LgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBjb2RlIHNlbGVjdCBkb2VzIG5vdCBpbnZvbHZlIGV2YWx1YXRpb24sIGFuZCBwcm9ibGVtcyBhcmUgbmV2ZXIKKwkgKiByZXBvcnRlZC4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBjb2RlU25pcHBldCB0aGUgY29kZSBzbmlwcGV0IHRvIHJlc29sdmUgaW4KKwkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwkgKiAgIG9mIHRoZSBjb2RlIHRvIHJlc29sdmUKKwkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGVkIGNvZGUgdG8gcmVzb2x2ZQorCSAqIEByZXR1cm4gdGhlIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBzZWxlY3Rpb24gSmF2YSBlbGVtZW50cworCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGNvZGUgcmVzb2x2ZSBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLgorCSAqICAgUmVhc29ucyBpbmNsdWRlOgorCSAqICAgPHVsPgorCSAqCSAgIDxsaT5UaGUgcG9zaXRpb24gc3BlY2lmaWVkIGlzIGxlc3MgdGhhbiAtMSBvciBpcyBncmVhdGVyIHRoYW4gdGhlIHNuaXBwZXQncworCSAqCSAgICAgbGVuZ3RoIChJTkRFWF9PVVRfT0ZfQk9VTkRTKTwvbGk+CisJICogICA8L3VsPgorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBjb2RlU2VsZWN0KFN0cmluZyBjb2RlU25pcHBldCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkvKioKKwkgKiBEZWxldGVzIHRoZSBnaXZlbiB2YXJpYWJsZSBmcm9tIHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0LiBEb2VzIG5vdGhpbmcgaWYKKwkgKiB0aGUgZ2l2ZW4gdmFyaWFibGUgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkLgorCSAqCisJICogQHBhcmFtIHZhcmlhYmxlIHRoZSBnbG9iYWwgdmFyaWFibGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVWYXJpYWJsZShJR2xvYmFsVmFyaWFibGUgdmFyaWFibGUpOworCS8qKgorCSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0IGluIHRoZSBjb250ZXh0IG9mIGEgc3VzcGVuZGVkIHRocmVhZC4KKwkgKiBUaGUgY29kZSBzbmlwcGV0IGlzIGNvbXBpbGVkIGFsb25nIHdpdGggdGhpcyBjb250ZXh0J3MgcGFja2FnZSBkZWNsYXJhdGlvbiwKKwkgKiBpbXBvcnRzLCBhbmQgZ2xvYmFsIHZhcmlhYmxlcy4gVGhlIGdpdmVuIHJlcXVlc3RvcidzIAorCSAqIDxjb2RlPmFjY2VwdFByb2JsZW08L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgZm9yIGVhY2ggY29tcGlsYXRpb24gcHJvYmxlbSB0aGF0CisJICogaXMgZGV0ZWN0ZWQuIFRoZW4gdGhlIHJlc3VsdGluZyBjbGFzcyBmaWxlcyBhcmUgaGFuZGVkIHRvIHRoZSBnaXZlbiAKKwkgKiByZXF1ZXN0b3IncyA8Y29kZT5hY2NlcHRDbGFzc0ZpbGVzPC9jb2RlPiBtZXRob2QgdG8gZGVwbG95IGFuZCBydW4uCisJICogPHA+CisJICogVGhlIHJlcXVlc3RvciBpcyBleHBlY3RlZCB0bzoKKwkgKiA8b2w+CisJICogICA8bGk+c2VuZCB0aGUgY2xhc3MgZmlsZXMgdG8gdGhlIHRhcmdldCBWTSwgCisJICogICA8bGk+bG9hZCB0aGVtIChzdGFydGluZyB3aXRoIHRoZSBjb2RlIHNuaXBwZXQgY2xhc3MpLAorCSAqICAgPGxpPmNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29kZSBzbmlwcGV0IGNsYXNzLAorCSAqICAgPGxpPnJ1biB0aGUgbWV0aG9kIDxjb2RlPnJ1bigpPC9jb2RlPiBvZiB0aGUgY29kZSBzbmlwcGV0LAorCSAqICAgPGxpPnJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywKKwkgKiAgIDxsaT5yZXRyaWV2ZSB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIGNvZGUgc25pcHBldAorCSAqIDwvb2w+CisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKKwkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gY29kZVNuaXBwZXQgdGhlIGNvZGUgc25pcHBldAorCSAqIEBwYXJhbSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzIHRoZSBkb3Qtc2VwYXJhdGVkIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBvZiB0aGUgdHlwZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcy4KKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGFzIHRoZXkgYXJlIGRlY2xhcmVkIGluIHRoZSB1c2VyJ3MgY29kZS4KKwkgKiBAcGFyYW0gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgKGRlZmF1bHQgbW9kaWZpZXIgb3IgZmluYWwgbW9kaWZpZXIpLgorCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlIHRoZSB0eXBlIGluIHdoaWNoIHRoZSBjb2RlIHNuaXBwZXQgaXMgZXZhbHVhdGVkLgorCSAqIEBwYXJhbSBpc1N0YXRpYyB3aGV0aGVyIHRoZSBjb2RlIHNuaXBwZXQgaXMgZXZhbHVhdGVkIGluIGEgc3RhdGljIG1lbWJlciBvZiB0aGUgZGVjbGFyaW5nIHR5cGUuCisJICogQHBhcmFtIGlzQ29uc3RydWN0b3JDYWxsIHdoZXRoZXIgdGhlIGNvZGUgc25pcHBldCBpcyBldmFsdWF0ZWQgaW4gYSBjb25zdHJ1Y3RvciBvZiB0aGUgZGVjbGFyaW5nIHR5cGUuCisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29kZSBzbmlwcGV0IHJlcXVlc3RvcgorCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYSBydW50aW1lIHByb2JsZW0gb2NjdXJyZWQgb3IgaWYgdGhpcworCSAqICAgY29udGV4dCdzIHByb2plY3QgaGFzIG5vIGJ1aWxkIHN0YXRlCisJICovCisJcHVibGljIHZvaWQgZXZhbHVhdGVDb2RlU25pcHBldCgKKwkJU3RyaW5nIGNvZGVTbmlwcGV0LAorCQlTdHJpbmdbXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLAorCQlTdHJpbmdbXSBsb2NhbFZhcmlhYmxlTmFtZXMsCisJCWludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsCisJCUlUeXBlIGRlY2xhcmluZ1R5cGUsCisJCWJvb2xlYW4gaXNTdGF0aWMsCisJCWJvb2xlYW4gaXNDb25zdHJ1Y3RvckNhbGwsCisJCUlDb2RlU25pcHBldFJlcXVlc3RvciByZXF1ZXN0b3IsCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0LiBUaGUgY29kZSBzbmlwcGV0IGlzCisJICogY29tcGlsZWQgYWxvbmcgd2l0aCB0aGlzIGNvbnRleHQncyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBpbXBvcnRzLCBhbmQKKwkgKiBnbG9iYWwgdmFyaWFibGVzLiBUaGUgZ2l2ZW4gcmVxdWVzdG9yJ3MgPGNvZGU+YWNjZXB0UHJvYmxlbTwvY29kZT4gbWV0aG9kCisJICogaXMgY2FsbGVkIGZvciBlYWNoIGNvbXBpbGF0aW9uIHByb2JsZW0gdGhhdCBpcyBkZXRlY3RlZC4gVGhlbiB0aGUgcmVzdWx0aW5nCisJICogY2xhc3MgZmlsZXMgYXJlIGhhbmRlZCB0byB0aGUgZ2l2ZW4gcmVxdWVzdG9yJ3MgPGNvZGU+YWNjZXB0Q2xhc3NGaWxlczwvY29kZT4KKwkgKiBtZXRob2QgdG8gZGVwbG95IGFuZCBydW4uIFRoZSByZXF1ZXN0b3IgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUKKwkgKiByZXN1bHQgYmFjay4gCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgbG9uZy1ydW5uaW5nOyBwcm9ncmVzcyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBwcm92aWRlZAorCSAqIGJ5IHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBjb2RlU25pcHBldCB0aGUgY29kZSBzbmlwcGV0CisJICogQHBhcmFtIHJlcXVlc3RvciB0aGUgY29kZSBzbmlwcGV0IHJlcXVlc3RvcgorCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYSBydW50aW1lIHByb2JsZW0gb2NjdXJyZWQgb3IgaWYgdGhpcworCSAqICAgY29udGV4dCdzIHByb2plY3QgaGFzIG5vIGJ1aWxkIHN0YXRlCisJICovCisJcHVibGljIHZvaWQgZXZhbHVhdGVDb2RlU25pcHBldCgKKwkJU3RyaW5nIGNvZGVTbmlwcGV0LAorCQlJQ29kZVNuaXBwZXRSZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkvKioKKwkgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGdsb2JhbCB2YXJpYWJsZS4gRHVyaW5nIHRoaXMgb3BlcmF0aW9uLCAKKwkgKiB0aGlzIGNvbnRleHQncyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBpbXBvcnRzLCBhbmQgPGl0PmFsbDwvaXQ+IGl0cyBkZWNsYXJlZCAKKwkgKiB2YXJpYWJsZXMgYXJlIHZlcmlmaWVkLiBUaGUgZ2l2ZW4gcmVxdWVzdG9yJ3MgPGNvZGU+YWNjZXB0UHJvYmxlbTwvY29kZT4KKwkgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcHJvYmxlbSB0aGF0IGlzIGRldGVjdGVkLgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKKwkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gdmFyaWFibGUgdGhlIGdsb2JhbCB2YXJpYWJsZQorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvZGUgc25pcHBldCByZXF1ZXN0b3IKKwkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGEgcnVudGltZSBwcm9ibGVtIG9jY3VycmVkIG9yIGlmIHRoaXMKKwkgKiAgIGNvbnRleHQncyBwcm9qZWN0IGhhcyBubyBidWlsZCBzdGF0ZQorCSAqLworCXB1YmxpYyB2b2lkIGV2YWx1YXRlVmFyaWFibGUoCisJCUlHbG9iYWxWYXJpYWJsZSB2YXJpYWJsZSwKKwkJSUNvZGVTbmlwcGV0UmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgaW1wb3J0IGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIFJldHVybnMgYW5kIGVtcHR5CisJICogbGlzdCBpZiB0aGVyZSBhcmUgbm8gaW1wb3J0cyAodGhlIGRlZmF1bHQgaWYgdGhlIGltcG9ydHMgaGF2ZSBuZXZlciBiZWVuIHNldCkuCisJICogVGhlIHN5bnRheCBmb3IgdGhlIGltcG9ydCBjb3JyZXNwb25kcyB0byBhIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUsIG9yIHRvCisJICogYW4gb24tZGVtYW5kIHBhY2thZ2UgbmFtZSBhcyBkZWZpbmVkIGJ5IEltcG9ydERlY2xhcmF0aW9uIChKTFMyIDcuNSkuIEZvcgorCSAqIGV4YW1wbGUsIDxjb2RlPiJqYXZhLnV0aWwuSGFzaHRhYmxlIjwvY29kZT4gb3IgPGNvZGU+ImphdmEudXRpbC4qIjwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGltcG9ydCBuYW1lcworCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRJbXBvcnRzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCBjb2RlIHNuaXBwZXRzIGFyZSB0byBiZSBjb21waWxlZCBhbmQKKwkgKiBydW4uIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlICh0aGUgZGVmYXVsdCBpZiB0aGUKKwkgKiBwYWNrYWdlIG5hbWUgaGFzIG5ldmVyIGJlZW4gc2V0KS4gRm9yIGV4YW1wbGUsIDxjb2RlPiJjb20uZXhhbXBsZS5teWFwcCI8L2NvZGU+LgorCSAqCisJICogQHJldHVybiB0aGUgZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaW5kaWNhdGluZyB0aGUKKwkgKiAgIGRlZmF1bHQgcGFja2FnZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQgd2FzIGNyZWF0ZWQgZm9yLgorCSAqCisJICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0CisJICovCisJcHVibGljIElKYXZhUHJvamVjdCBnZXRQcm9qZWN0KCk7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdHlwZSwgYW5kIGluaXRpYWxpemVyLgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT50eXBlTmFtZTwvY29kZT4gYW5kIDxjb2RlPmluaXRpYWxpemVyPC9jb2RlPiBhcmUgaW50ZXJwcmV0ZWQgaW4gCisJICogdGhlIGNvbnRleHQgb2YgdGhpcyBjb250ZXh0J3MgcGFja2FnZSBhbmQgaW1wb3J0IGRlY2xhcmF0aW9ucy4KKwkgKiA8L3A+CisJKiA8cD4KKwkgKiBUaGUgc3ludGF4IGZvciBhIHR5cGUgbmFtZSBjb3JyZXNwb25kcyB0byBUeXBlIGluIEZpZWxkIERlY2xhcmF0aW9uIChKTFMyIDguMykuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHR5cGVOYW1lIHRoZSB0eXBlIG5hbWUKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZ2xvYmFsIHZhcmlhYmxlCisJICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKwkgKiAgIHZhcmlhYmxlIGlzIG5vdCBpbml0aWFsaXplZAorCSAqLworCXB1YmxpYyBJR2xvYmFsVmFyaWFibGUgbmV3VmFyaWFibGUoCisJCVN0cmluZyB0eXBlTmFtZSwKKwkJU3RyaW5nIG5hbWUsCisJCVN0cmluZyBpbml0aWFsaXplcik7CisJLyoqCisJICogU2V0cyB0aGUgaW1wb3J0IGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBldmFsdWF0aW9uIGNvbnRleHQuIEFuIGVtcHR5CisJICogbGlzdCBpbmRpY2F0ZXMgdGhlcmUgYXJlIG5vIGltcG9ydHMuIFRoZSBzeW50YXggZm9yIHRoZSBpbXBvcnQgY29ycmVzcG9uZHMgdG8gYSAKKwkgKiBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lLCBvciB0byBhbiBvbi1kZW1hbmQgcGFja2FnZSBuYW1lIGFzIGRlZmluZWQgYnkKKwkgKiBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLiBGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEudXRpbC5IYXNodGFibGUiPC9jb2RlPgorCSAqIG9yIDxjb2RlPiJqYXZhLnV0aWwuKiI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGltcG9ydHMgdGhlIGxpc3Qgb2YgaW1wb3J0IG5hbWVzCisJICovCisJcHVibGljIHZvaWQgc2V0SW1wb3J0cyhTdHJpbmdbXSBpbXBvcnRzKTsKKwkvKioKKwkgKiBTZXRzIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggY29kZSBzbmlwcGV0cyBhcmUgCisJICogdG8gYmUgY29tcGlsZWQgYW5kIHJ1bi4gRm9yIGV4YW1wbGUsIDxjb2RlPiJjb20uZXhhbXBsZS5teWFwcCI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIHBhY2thZ2UgbmFtZSwgb3IgdGhlIGVtcHR5IHN0cmluZyAKKwkgKiAgIGluZGljYXRpbmcgdGhlIGRlZmF1bHQgcGFja2FnZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7CisJLyoqCisJICogVmFsaWRhdGVzIHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0J3MgaW1wb3J0IGRlY2xhcmF0aW9ucy4gVGhlIGdpdmVuIHJlcXVlc3RvcidzCisJICogPGNvZGU+YWNjZXB0UHJvYmxlbTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBwcm9ibGVtIHRoYXQgaXMgZGV0ZWN0ZWQuCisJICoKKwkgKiBAcGFyYW0gcmVxdWVzdG9yIHRoZSBjb2RlIHNuaXBwZXQgcmVxdWVzdG9yCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBjb250ZXh0J3MgcHJvamVjdCBoYXMgbm8gYnVpbGQgc3RhdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUltcG9ydHMoSUNvZGVTbmlwcGV0UmVxdWVzdG9yIHJlcXVlc3RvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFBlcmZvcm1zIGEgY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0LAorCSAqIHJlcG9ydGluZyByZXN1bHRzIHRvIHRoZSBnaXZlbiBjb21wbGV0aW9uIHJlcXVlc3Rvci4KKwkgKiA8cD4KKwkgKiBOb3RlIHRoYXQgY29kZSBjb21wbGV0aW9uIGRvZXMgbm90IGludm9sdmUgZXZhbHVhdGlvbi4KKwkgKiA8cD4KKwkgKgorCSAqIEBwYXJhbSBjb2RlU25pcHBldCB0aGUgY29kZSBzbmlwcGV0IHRvIGNvbXBsZXRlIGluCisJICogQHBhcmFtIHBvc2l0aW9uIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGNvZGUgc25pcHBldCB0byBjb21wbGV0ZSBhdCwKKwkgKiAgIG9yIC0xIGluZGljYXRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgc25pcHBldAorCSAqIEBwYXJhbSByZXF1ZXN0b3IgdGhlIGNvZGUgY29tcGxldGlvbiByZXF1ZXN0b3IgY2FwYWJsZSBvZiBhY2NlcHRpbmcgYWxsCisJICogICAgcG9zc2libGUgdHlwZXMgb2YgY29tcGxldGlvbnMKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBjb2RlIGNvbXBsZXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZC4gUmVhc29ucyBpbmNsdWRlOgorCSAqICA8dWw+CisJICoJICA8bGk+VGhlIHBvc2l0aW9uIHNwZWNpZmllZCBpcyBsZXNzIHRoYW4gLTEgb3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBzbmlwcGV0J3MKKwkgKgkgICAgbGVuZ3RoIChJTkRFWF9PVVRfT0ZfQk9VTkRTKTwvbGk+CisJICogIDwvdWw+CisJICogQGRlcHJlY2F0ZWQgLSB1c2UgY29kZUNvbXBsZXRlKFN0cmluZywgaW50LCBJQ29tcGxldGlvblJlcXVlc3RvcikgaW5zdGVhZAorCSAqLworCXB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZSgKKwkJU3RyaW5nIGNvZGVTbmlwcGV0LAorCQlpbnQgcG9zaXRpb24sCisJCUlDb2RlQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lHbG9iYWxWYXJpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JR2xvYmFsVmFyaWFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzlmNjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JR2xvYmFsVmFyaWFibGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsOworCisvKioKKyAqIEEgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmVkIGluIGFuIGV2YWx1YXRpb24gY29udGV4dC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAorICogPGNvZGU+SUV2YWx1YXRpb25Db250ZXh0Lm5ld1ZhcmlhYmxlPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYW4gaW5zdGFuY2UuCisgKiA8L3A+CisgKgorICogQHNlZSBJRXZhbHVhdGlvbkNvbnRleHQjbmV3VmFyaWFibGUKKyAqLworcHVibGljIGludGVyZmFjZSBJR2xvYmFsVmFyaWFibGUgeworLyoqCisgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXplciBvZiB0aGlzIGdsb2JhbCB2YXJpYWJsZS4gCisgKiBUaGUgc3ludGF4IGZvciBhbiBpbml0aWFsaXplciBjb3JyZXNwb25kcyB0byBWYXJpYWJsZUluaXRpYWxpemVyIChKTFMyIDguMykuCisgKgorICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBnbG9iYWwgZG9lcworICogICAgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIKKyAqLworcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXplcigpOworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLgorICoKKyAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZQorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBnbG9iYWwKKyAqIHZhcmlhYmxlLCBvciBpdHMgc2ltcGxlIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUgCisgKiAoPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+Ym9vbGVhbjwvY29kZT4sIGV0Yy4pLgorICogPHA+CisgKiBUaGUgc3ludGF4IGZvciBhIHR5cGUgbmFtZSBjb3JyZXNwb25kcyB0byBUeXBlIGluIEZpZWxkIERlY2xhcmF0aW9uIChKTFMyIDguMykuCisgKiA8L3A+CisgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9wYWNrYWdlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI3ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjczIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitQcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgZXZhbHVhdGlvbiBvZiBjb2RlIHNuaXBwZXRzCitpbiBhIHNjcmFwYm9vayBvciBpbnNpZGUgdGhlIGRlYnVnZ2VyLgorPGgyPgorUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KK1RoaXMgcGFja2FnZXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGV2YWx1YXRpb24gb2YgY29kZSBzbmlwcGV0cyBpbiBhCitzY3JhcGJvb2sgb3IgaW5zaWRlIHRoZSBkZWJ1Z2dlci4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjY1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CisKKy8qKgorICogVW5jaGVja2VkIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBpbGxlZ2FsIG1hbmlwdWxhdGlvbiBvZiB0aGUgSkRPTSBpcyAKKyAqIHBlcmZvcm1lZCwgb3Igd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWNjZXNzL3NldCBhbiBhdHRyaWJ1dGUgb2YgYQorICogSkRPTSBub2RlIHRoYXQgc291cmNlIGluZGV4ZXMgY2Fubm90IGJlIGRldGVybWluZWQgZm9yIChpbiBjYXNlIHRoZSBzb3VyY2UKKyAqIHdhcyBzeW50YWN0aWNhbGx5IGluY29ycmVjdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBET01FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZS4KKyAqLworcHVibGljIERPTUV4Y2VwdGlvbigpIHt9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRldGFpbCBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZQorICovCitwdWJsaWMgRE9NRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJc3VwZXIobWVzc2FnZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTUyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbS5ET01CdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb20uU2ltcGxlRE9NQnVpbGRlcjsKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JRE9NRmFjdG9yeTwvY29kZT4sIGFuZCB0aGUgb25seSBtZWFucworICogb2YgY3JlYXRpbmcgSkRPTXMgYW5kIGRvY3VtZW50IGZyYWdtZW50cy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIERPTUZhY3RvcnkgaW1wbGVtZW50cyBJRE9NRmFjdG9yeSB7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgRE9NIGZhY3RvcnkuCisgKi8KK3B1YmxpYyBET01GYWN0b3J5KCkge30KKy8qIChub24tSmF2YWRvYykKKyAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4KKyAqLworcHVibGljIElET01Db21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkgeworCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjaGFyW10gc291cmNlQ29kZSwgU3RyaW5nIG5hbWUpICB7CisJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0JCQorCXJldHVybiAobmV3IFNpbXBsZURPTUJ1aWxkZXIoKSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHNvdXJjZUNvZGUsIG5hbWUudG9DaGFyQXJyYXkoKSk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgc291cmNlQ29kZSwgU3RyaW5nIG5hbWUpIHsKKwlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQkKKwlyZXR1cm4gKG5ldyBTaW1wbGVET01CdWlsZGVyKCkpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCksIG5hbWUudG9DaGFyQXJyYXkoKSk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoKSB7CisJcmV0dXJuIGNyZWF0ZUZpZWxkKCJPYmplY3QgYUZpZWxkOyIrIFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoU3RyaW5nIHNvdXJjZUNvZGUpIHsKKwlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQkJCisJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVGaWVsZChzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOworfQorLyogKG5vbi1KYXZhZG9jKQorICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5LgorICovCitwdWJsaWMgSURPTUltcG9ydCBjcmVhdGVJbXBvcnQoKSB7CisJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVJbXBvcnQoKTsKK30KKy8qIChub24tSmF2YWRvYykKKyAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4KKyAqLworcHVibGljIElET01JbXBvcnQgY3JlYXRlSW1wb3J0KFN0cmluZyBzb3VyY2VDb2RlKSB7CisJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0JCQorCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlSW1wb3J0KHNvdXJjZUNvZGUudG9DaGFyQXJyYXkoKSk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXIoKSB7CisJcmV0dXJuIGNyZWF0ZUluaXRpYWxpemVyKCJzdGF0aWMge30iKyBVdGlsLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAorfQorLyogKG5vbi1KYXZhZG9jKQorICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5LgorICovCitwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKFN0cmluZyBzb3VyY2VDb2RlKSB7CisJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0JCQorCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlSW5pdGlhbGl6ZXIoc291cmNlQ29kZS50b0NoYXJBcnJheSgpKTsKK30KKy8qIChub24tSmF2YWRvYykKKyAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4KKyAqLworcHVibGljIElET01NZXRob2QgY3JlYXRlTWV0aG9kKCkgeworCXJldHVybiBjcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG5ld01ldGhvZCgpIHsiKyBVdGlsLkxJTkVfU0VQQVJBVE9SKyJ9IisgVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorLyogKG5vbi1KYXZhZG9jKQorICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5LgorICovCitwdWJsaWMgSURPTU1ldGhvZCBjcmVhdGVNZXRob2QoU3RyaW5nIHNvdXJjZUNvZGUpIHsKKwlpZihzb3VyY2VDb2RlID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQkJCisJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVNZXRob2Qoc291cmNlQ29kZS50b0NoYXJBcnJheSgpKTsKK30KKy8qIChub24tSmF2YWRvYykKKyAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRE9NRmFjdG9yeS4KKyAqLworcHVibGljIElET01QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoKSB7CisJcmV0dXJuIChuZXcgRE9NQnVpbGRlcigpKS5jcmVhdGVQYWNrYWdlKCk7Cit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NUGFja2FnZSBjcmVhdGVQYWNrYWdlKFN0cmluZyBzb3VyY2VDb2RlKSB7CisJaWYoc291cmNlQ29kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0JCQorCXJldHVybiAobmV3IERPTUJ1aWxkZXIoKSkuY3JlYXRlUGFja2FnZShzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCkpOworfQorLyogKG5vbi1KYXZhZG9jKQorICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5LgorICovCitwdWJsaWMgSURPTVR5cGUgY3JlYXRlVHlwZSgpIHsKKwlyZXR1cm4gY3JlYXRlVHlwZSgicHVibGljIGNsYXNzIEFDbGFzcyB7IisgVXRpbC5MSU5FX1NFUEFSQVRPUiArIn0iKyBVdGlsLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NVHlwZSBjcmVhdGVDbGFzcygpIHsKKwlyZXR1cm4gY3JlYXRlVHlwZSgicHVibGljIGNsYXNzIEFDbGFzcyB7IisgVXRpbC5MSU5FX1NFUEFSQVRPUiArIn0iKyBVdGlsLkxJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9CisvKiAobm9uLUphdmFkb2MpCisgKiBNZXRob2QgZGVjbGFyZWQgb24gSURPTUZhY3RvcnkuCisgKi8KK3B1YmxpYyBJRE9NVHlwZSBjcmVhdGVJbnRlcmZhY2UoKSB7CisJcmV0dXJuIGNyZWF0ZVR5cGUoInB1YmxpYyBpbnRlcmZhY2UgQW5JbnRlcmZhY2UgeyIrIFV0aWwuTElORV9TRVBBUkFUT1IgKyJ9IisgVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorfQorLyogKG5vbi1KYXZhZG9jKQorICogTWV0aG9kIGRlY2xhcmVkIG9uIElET01GYWN0b3J5LgorICovCitwdWJsaWMgSURPTVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgc291cmNlQ29kZSkgeworCWlmKHNvdXJjZUNvZGUgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CQkKKwlyZXR1cm4gKG5ldyBET01CdWlsZGVyKCkpLmNyZWF0ZVR5cGUoc291cmNlQ29kZS50b0NoYXJBcnJheSgpKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMDUxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CisKKy8qKgorICogUmVwcmVzZW50cyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCAoPGNvZGU+LmphdmE8L2NvZGU+IHNvdXJjZSBmaWxlKS4gCisgKiBUaGUgY29ycmVzcG9uZGluZyBzeW50YWN0aWMgdW5pdCBpcyBDb21waWxhdGlvblVuaXQgKEpMUzIgNy4zKS4gIAorICogQWxsb3dhYmxlIGNoaWxkIHR5cGVzIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgYXJlIDxjb2RlPklET01QYWNrYWdlPC9jb2RlPiwgPGNvZGU+SURPTUltcG9ydDwvY29kZT4sCisgKiBhbmQgPGNvZGU+SURPTVR5cGU8L2NvZGU+LgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRE9NQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgSURPTU5vZGUgeworLyoqCisgKiBSZXR1cm5zIHRoZSBoZWFkZXIgY29tbWVudCBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LiBUaGUgaGVhZGVyIGNvbW1lbnQKKyAqIGFwcGVhcnMgYmVmb3JlIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCisgKiBUaGUgc3ludGF4IGZvciBhIGNvbW1lbnQgY29ycmVzcG9uZHMgdG8gQ29tbWVudHMgKEpMUzIgMy43KSwgPGI+aW5jbHVkaW5nPC9iPgorICogY29tbWVudCBkZWxpbWl0ZXJzLgorICoKKyAqIEByZXR1cm4gdGhlIGhlYWRlciBjb21tZW50IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgKiAgIG5vIGhlYWRlciBjb21tZW50IGlzIHByZXNlbnQKKyAqLworcHVibGljIFN0cmluZyBnZXRIZWFkZXIoKTsKKy8qKgorICogVGhlIDxjb2RlPklET01Db21waWxhdGlvbk5vZGU8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KKyAqIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KKyAqCisgKiA8cD5UaGUgbmFtZSBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IHRvcC1sZXZlbCBwdWJsaWMgdHlwZQorICogZGVmaW5lZCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCwgc3VmZml4ZWQgd2l0aCAiLmphdmEiLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0CisgKiB0b3AtbGV2ZWwgcHVibGljIHR5cGUgZGVmaW5lZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFzIHRoZSBuYW1lICJIYW5vaSIsCisgKiB0aGVuIG5hbWUgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0IGlzICJIYW5vaS5qYXZhIi48L3A+CisgKgorICogPHA+SW4gdGhlIGFic2VuY2Ugb2YgYSBwdWJsaWMgdG9wLWxldmVsIHR5cGUsIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCB0b3AtbGV2ZWwKKyAqIHR5cGUgaXMgdXNlZC4gSW4gdGhlIGFic2VuY2Ugb2YgYW55IHR5cGUsIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi48L3A+CisgKgorICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAqLworcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisvKioKKyAqIFNldHMgdGhlIGhlYWRlciBjb21tZW50IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIFRoZSBoZWFkZXIgY29tbWVudAorICogYXBwZWFycyBiZWZvcmUgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIGluIGEgY29tcGlsYXRpb24gdW5pdC4KKyAqIFRoZSBzeW50YXggZm9yIGEgY29tbWVudCBjb3JyZXNwb25kcyB0byBDb21tZW50cyAoSkxTMiAzLjcpLCA8Yj5pbmNsdWRpbmc8L2I+CisgKiBjb21tZW50IGRlbGltaXRlcnMuCisgKgorICogQHBhcmFtIGNvbW1lbnQgdGhlIGhlYWRlciBjb21tZW50IGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgKiAgIGluZGljYXRpbmcgbm8gaGVhZGVyIGNvbW1lbnQKKyAqLworcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBjb21tZW50KTsKKy8qKgorICogVGhlIDxjb2RlPklET01Db21waWxhdGlvbk5vZGU8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KKyAqIG1ldGhvZCBoYXMgbm8gZWZmZWN0ICh0aGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHRoZSB0eXBlcyBkZWNsYXJlZCB3aXRoaW4gaXQpLgorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWZlMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOworCisvKioKKyAqIEEgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBkb2N1bWVudCBmcmFnbWVudCAoREYpIG5vZGVzLiBBbiAKKyAqIDxjb2RlPklET01Db21waWxhdGlvblVuaXQ8L2NvZGU+IHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgYSBjb21wbGV0ZSBKRE9NICh0aGF0CisgKiBpcywgYSAiLmphdmEiIGZpbGUpLiBPdGhlciBub2RlIHR5cGVzIHJlcHJlc2VudCBmcmFnbWVudHMgb2YgYSBjb21waWxhdGlvbgorICogdW5pdC4KKyAqIDxwPgorICogVGhlIGZhY3RvcnkgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGVtcHR5IERGcyBvciBpdCBjYW4gY3JlYXRlIERGcyBmcm9tIHNvdXJjZQorICogc3RyaW5ncy4gQWxsIERGcyBjcmVhdGVkIGVtcHR5IGFyZSBhc3NpZ25lZCBkZWZhdWx0IHZhbHVlcyBhcyByZXF1aXJlZCwgc3VjaAorICogdGhhdCBhIGNhbGwgdG8gPGNvZGU+SURPTU5vZGUuZ2V0Q29udGVudHM8L2NvZGU+IHdpbGwgZ2VuZXJhdGUgYSB2YWxpZCBzb3VyY2UKKyAqIHN0cmluZy4gU2VlIGluZGl2aWR1YWwgPGNvZGU+Y3JlYXRlPC9jb2RlPiBtZXRob2RzIGZvciBkZXRhaWxzIG9uIHRoZSBkZWZhdWx0CisgKiB2YWx1ZXMgc3VwcGxpZWQuIFRoZSBmYWN0b3J5IGRvZXMgaXRzIGJlc3QgdG8gcmVjb2duaXplIEphdmEgc3RydWN0dXJlcyBpbgorICogdGhlIHNvdXJjZSBwcm92aWRlZC4gSWYgdGhlIGZhY3RvcnkgaXMgY29tcGxldGVseSB1bmFibGUgdG8gcmVjb2duaXplIHNvdXJjZQorICogY29uc3RydWN0cywgdGhlIGZhY3RvcnkgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgKiA8L3A+CisgKiA8cD4KKyAqIEV2ZW4gaWYgYSBERiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBmcm9tIHNvdXJjZSBjb2RlLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUKKyAqIHRoYXQgdGhlIHNvdXJjZSBjb2RlIHdpbGwgY29tcGlsZSBlcnJvciBmcmVlLiBTaW1pbGFybHksIHRoZSBjb250ZW50cyBvZiBhIERGCisgKiBhcmUgbm90IGd1YXJhbnRlZWQgdG8gY29tcGlsZSBlcnJvciBmcmVlLiBIb3dldmVyLCBzeW50YWN0aWNhbGx5IGNvcnJlY3QgCisgKiBzb3VyY2UgY29kZSBpcyBndWFyYW50ZWVkIHRvIGJlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZSBhIERGLgorICogU2ltaWxhcmx5LCBpZiBhbGwgb2YgdGhlIGZyYWdtZW50cyBvZiBhIEpET00gYXJlIHN5bnRhY3RpY2FsbHkgY29ycmVjdCwgdGhlCisgKiBjb250ZW50cyBvZiB0aGUgZW50aXJlIGRvY3VtZW50IHdpbGwgYmUgY29ycmVjdCB0b28uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBmYWN0b3J5IGRvZXMgbm90IHBlcmZvcm0gb3IgcHJvdmlkZSBhbnkgY29kZSBmb3JtYXR0aW5nLiBEb2N1bWVudCAKKyAqIGZyYWdtZW50cyBjcmVhdGVkIG9uIHNvdXJjZSBzdHJpbmdzIG11c3QgYmUgcHJlLWZvcm1hdHRlZC4gVGhlIEpET00gYXR0ZW1wdHMKKyAqIHRvIG1haW50YWluIHRoZSBmb3JtYXR0aW5nIG9mIGRvY3VtZW50cyBhcyBiZXN0IGFzIHBvc3NpYmxlLiBGb3IgdGhpcyByZWFzb24sCisgKiBkb2N1bWVudCBmcmFnbWVudHMgY3JlYXRlZCBmb3Igbm9kZXMgdGhhdCBhcmUgdG8gYmUgc3RydW5nIHRvZ2V0aGVyIHNob3VsZCAKKyAqIGVuZCB3aXRoIGEgbmV3LWxpbmUgY2hhcmFjdGVyLiBGYWlsaW5nIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGEgZG9jdW1lbnQKKyAqIHRoYXQgaGFzIGVsZW1lbnRzIHN0cnVuZyB0b2dldGhlciBvbiB0aGUgc2FtZSBsaW5lLiBUaGlzIGlzIGVzcGVjaWFsbHkKKyAqIGltcG9ydGFudCBpZiBhIHNvdXJjZSBzdHJpbmcgZW5kcyB3aXRoIGEgLy8gY29tbWVudC4gSW4gdGhpcyBjYXNlLCBpdCB3b3VsZAorICogYmUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgdG8gb21pdCB0aGUgbmV3IGxpbmUgY2hhcmFjdGVyLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIElET01Ob2RlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURPTUZhY3RvcnkgeworLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm4gYW4gZW1wdHkgSkRPTS4gVGhlIGluaXRpYWwgY29udGVudCBpcyBhbiBlbXB0eSBzdHJpbmcuCisgKgorICogQHJldHVybiB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXQKKyAqLworcHVibGljIElET01Db21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7CisvKioKKyAqIENyZWF0ZXMgYSBKRE9NIG9uIHRoZSBnaXZlbiBzb3VyY2UgY29kZS4gVGhlIHN5bnRheCBmb3IgdGhlIGdpdmVuIHNvdXJjZQorICogY29kZSBjb3JyZXNwb25kcyB0byBDb21waWxhdGlvblVuaXQgKEpMUzIgNy4zKS4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSB0aGUgc291cmNlIGNvZGUgY2hhcmFjdGVyIGFycmF5LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKKyAqIEByZXR1cm4gdGhlIG5ldyBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gcmVjb2duaXplCisgKiAgIHRoZSBzb3VyY2UgY29kZSwgb3IgaWYgdGhlIHNvdXJjZSBjb2RlIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgKi8KK3B1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjaGFyW10gc291cmNlQ29kZSwgU3RyaW5nIG5hbWUpOworLyoqCisgKiBDcmVhdGVzIGEgSkRPTSBvbiB0aGUgZ2l2ZW4gc291cmNlIGNvZGUuIFRoZSBzeW50YXggZm9yIHRoZSBnaXZlbiBzb3VyY2UKKyAqIGNvZGUgY29ycmVzcG9uZHMgdG8gQ29tcGlsYXRpb25Vbml0IChKTFMyIDcuMykuCisgKgorICogQHBhcmFtIHNvdXJjZUNvZGUgdGhlIHNvdXJjZSBjb2RlIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisgKiBAcmV0dXJuIHRoZSBuZXcgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlY29nbml6ZQorICogICB0aGUgc291cmNlIGNvZGUsIG9yIGlmIHRoZSBzb3VyY2UgY29kZSBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCitwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZUNvZGUsIFN0cmluZyBuYW1lKTsKKy8qKgorICogQ3JlYXRlcyBhIGRlZmF1bHQgZmllbGQgZG9jdW1lbnQgZnJhZ21lbnQuIEluaXRpYWxseSB0aGUgZmllbGQgd2lsbCBoYXZlCisgKiBkZWZhdWx0IHByb3RlY3Rpb24sIHR5cGUgPGNvZGU+Ik9iamVjdCI8L2NvZGU+LCBuYW1lIDxjb2RlPiJhRmllbGQiPC9jb2RlPiwKKyAqIG5vIGNvbW1lbnQsIGFuZCBubyBpbml0aWFsaXplci4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXcgZmllbGQKKyAqLworcHVibGljIElET01GaWVsZCBjcmVhdGVGaWVsZCgpOworLyoqCisgKiBDcmVhdGVzIGEgZmllbGQgZG9jdW1lbnQgZnJhZ21lbnQgb24gdGhlIGdpdmVuIHNvdXJjZSBjb2RlLiBUaGUgZ2l2ZW4gc291cmNlCisgKiBzdHJpbmcgY29ycmVzcG9uZHMgdG8gRmllbGREZWNsYXJhdGlvbiAoSkxTMiA4LjMpIGFuZCBDb25zdGFudERlY2xhcmF0aW9uIAorICogKEpMUzIgOS4zKSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIFZhcmlhYmxlRGVjbGFyYXRvciBjbGF1c2UuCisgKgorICogQHBhcmFtIHNvdXJjZUNvZGUgdGhlIHNvdXJjZSBjb2RlCisgKiBAcmV0dXJuIHRoZSBuZXcgZmllbGQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZWNvZ25pemUKKyAqICAgdGhlIHNvdXJjZSBjb2RlLCBpZiB0aGUgc291cmNlIGNvZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIG9yIHdoZW4gdGhlIHNvdXJjZQorICogICBjb250YWlucyBtb3JlIHRoYW4gb25lIFZhcmlhYmxlRGVjbGFyYXRvciBjbGF1c2UKKyAqLworcHVibGljIElET01GaWVsZCBjcmVhdGVGaWVsZChTdHJpbmcgc291cmNlQ29kZSk7CisvKioKKyAqIENyZWF0ZXMgYW4gZW1wdHkgaW1wb3J0IGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIGltcG9ydCB3aWxsIGhhdmUKKyAqIG5hbWUgPGNvZGU+ImphdmEubGFuZy4qIjwvY29kZT4uCisgKgorICogQHJldHVybiB0aGUgbmV3IGltcG9ydAorICovCitwdWJsaWMgSURPTUltcG9ydCBjcmVhdGVJbXBvcnQoKTsKKy8qKgorICogQ3JlYXRlcyBhbiBpbXBvcnQgZG9jdW1lbnQgZnJhZ21lbnQgb24gdGhlIGdpdmVuIHNvdXJjZSBjb2RlLiBUaGUgc3ludGF4IGZvcgorICogdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgY29ycmVzcG9uZHMgdG8gSW1wb3J0RGVjbGFyYXRpb24gKEpMUzIgNy41KS4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSB0aGUgc291cmNlIGNvZGUKKyAqIEByZXR1cm4gdGhlIG5ldyBpbXBvcnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZWNvZ25pemUKKyAqICAgdGhlIHNvdXJjZSBjb2RlLCBvciBpZiB0aGUgc291cmNlIGNvZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqLworcHVibGljIElET01JbXBvcnQgY3JlYXRlSW1wb3J0KFN0cmluZyBzb3VyY2VDb2RlKTsKKy8qKgorICogQ3JlYXRlcyBhbiBlbXB0eSBpbml0aWFsaXplciBkb2N1bWVudCBmcmFnbWVudC4gSW5pdGlhbGx5IHRoZSBpbml0aWFsaXplcgorICogd2lsbCBiZSBzdGF0aWMgYW5kIGhhdmUgbm8gYm9keSBvciBjb21tZW50LgorICoKKyAqIEByZXR1cm4gdGhlIG5ldyBpbml0aWFsaXplcgorICovCitwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCk7CisvKioKKyAqIENyZWF0ZXMgYW4gaW5pdGlhbGl6ZXIgZG9jdW1lbnQgZnJhZ21lbnQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGNvZGUuIFRoZQorICogc3ludGF4IGZvciB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBJbnN0YW5jZUluaXRpYWxpemVyIAorICogKEpMUzIgOC42KSBhbmQgU3RhdGljRGVjbGFyYXRpb24gKEpMUzIgOC43KS4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSB0aGUgc291cmNlIGNvZGUKKyAqIEByZXR1cm4gdGhlIG5ldyBpbml0aWFsaXplciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlY29nbml6ZQorICogICB0aGUgc291cmNlIGNvZGUsIG9yIGlmIHRoZSBzb3VyY2UgY29kZSBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCitwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKFN0cmluZyBzb3VyY2VDb2RlKTsKKy8qKgorICogQ3JlYXRlcyBhIGRlZmF1bHQgbWV0aG9kIGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIG1ldGhvZAorICogd2lsbCBoYXZlIHB1YmxpYyB2aXNpYmlsaXR5LCByZXR1cm4gdHlwZSA8Y29kZT4idm9pZCI8L2NvZGU+LCBiZSBuYW1lZCAKKyAqIDxjb2RlPiJuZXdNZXRob2QiPC9jb2RlPiwgaGF2ZSBubyBwYXJhbWV0ZXJzLCBubyBjb21tZW50LCBhbmQgYW4gZW1wdHkgYm9keS4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXcgbWV0aG9kCisgKi8KK3B1YmxpYyBJRE9NTWV0aG9kIGNyZWF0ZU1ldGhvZCgpOworLyoqCisgKiBDcmVhdGVzIGEgbWV0aG9kIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiBzb3VyY2UgY29kZS4gVGhlIHN5bnRheCBmb3IKKyAqIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRzIHRvIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCksICAKKyAqIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKEpMUzIgOC44KSwgYW5kIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gKEpMUzIgOS40KS4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSB0aGUgc291cmNlIGNvZGUKKyAqIEByZXR1cm4gdGhlIG5ldyBtZXRob2QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZWNvZ25pemUKKyAqICAgdGhlIHNvdXJjZSBjb2RlLCBvciBpZiB0aGUgc291cmNlIGNvZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqLworcHVibGljIElET01NZXRob2QgY3JlYXRlTWV0aG9kKFN0cmluZyBzb3VyY2VDb2RlKTsKKy8qKgorICogQ3JlYXRlcyBhbiBlbXB0eSBwYWNrYWdlIGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIHBhY2thZ2UgCisgKiBkZWNsYXJhdGlvbiB3aWxsIGhhdmUgbm8gbmFtZS4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXcgcGFja2FnZQorICovCitwdWJsaWMgSURPTVBhY2thZ2UgY3JlYXRlUGFja2FnZSgpOworLyoqCisgKiBDcmVhdGVzIGEgcGFja2FnZSBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gc291cmNlIGNvZGUuIFRoZSBzeW50YXggZm9yCisgKiB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBjb3JyZXNwb25kcyB0byBQYWNrYWdlRGVjbGFyYXRpb24gKEpMUzIgNy40KS4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSB0aGUgc291cmNlIGNvZGUKKyAqIEByZXR1cm4gdGhlIG5ldyBwYWNrYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gcmVjb2duaXplCisgKiAgIHRoZSBzb3VyY2UgY29kZSwgb3IgaWYgdGhlIHNvdXJjZSBjb2RlIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgKi8KK3B1YmxpYyBJRE9NUGFja2FnZSBjcmVhdGVQYWNrYWdlKFN0cmluZyBzb3VyY2VDb2RlKTsKKy8qKgorICogQ3JlYXRlcyBhIGRlZmF1bHQgdHlwZSBkb2N1bWVudCBmcmFnbWVudC4gSW5pdGlhbGx5IHRoZSB0eXBlIHdpbGwgYmUKKyAqIGEgcHVibGljIGNsYXNzIG5hbWVkIDxjb2RlPiJBQ2xhc3MiPC9jb2RlPiwgd2l0aCBubyBtZW1iZXJzIG9yIGNvbW1lbnQuCisgKgorICogQHJldHVybiB0aGUgbmV3IHR5cGUKKyAqLworcHVibGljIElET01UeXBlIGNyZWF0ZVR5cGUoKTsKKy8qKgorICogQ3JlYXRlcyBhIGRlZmF1bHQgdHlwZSBkb2N1bWVudCBmcmFnbWVudC4gSW5pdGlhbGx5IHRoZSB0eXBlIHdpbGwgYmUKKyAqIGEgcHVibGljIGNsYXNzIG5hbWVkIDxjb2RlPiJBQ2xhc3MiPC9jb2RlPiwgd2l0aCBubyBtZW1iZXJzIG9yIGNvbW1lbnQuCisgKgorICogQHJldHVybiB0aGUgbmV3IGNsYXNzCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBJRE9NVHlwZSBjcmVhdGVDbGFzcygpOworLyoqCisgKiBDcmVhdGVzIGEgZGVmYXVsdCB0eXBlIGRvY3VtZW50IGZyYWdtZW50LiBJbml0aWFsbHkgdGhlIHR5cGUgd2lsbCBiZQorICogYSBwdWJsaWMgaW50ZXJmYWNlIG5hbWVkIDxjb2RlPiJBbkludGVyZmFjZSI8L2NvZGU+LCB3aXRoIG5vIG1lbWJlcnMgb3IgY29tbWVudC4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXcgaW50ZXJmYWNlCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBJRE9NVHlwZSBjcmVhdGVJbnRlcmZhY2UoKTsKKy8qKgorICogQ3JlYXRlcyBhIHR5cGUgZG9jdW1lbnQgZnJhZ21lbnQgb24gdGhlIGdpdmVuIHNvdXJjZSBjb2RlLiBUaGUgc3ludGF4IGZvciB0aGUKKyAqIGdpdmVuIHNvdXJjZSBzdHJpbmcgY29ycmVzcG9uZHMgdG8gQ2xhc3NEZWNsYXJhdGlvbiAoSkxTMiA4LjEpIGFuZCAKKyAqIEludGVyZmFjZURlY2xhcmF0aW9uIChKTFMyIDkuMSkuCisgKgorICogQHBhcmFtIHNvdXJjZUNvZGUgdGhlIHNvdXJjZSBjb2RlCisgKiBAcmV0dXJuIHRoZSBuZXcgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlY29nbml6ZQorICogICB0aGUgc291cmNlIGNvZGUsIG9yIGlmIHRoZSBzb3VyY2UgY29kZSBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCitwdWJsaWMgSURPTVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgc291cmNlQ29kZSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY5ODMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBmaWVsZCBkZWNsYXJhdGlvbi4gVGhlIGNvcnJlc3BvbmRpbmcKKyAqIHN5bnRhY3RpYyB1bml0cyBhcmUgRmllbGREZWNsYXJhdGlvbiAoSkxTMiA4LjMpIGFuZCBDb25zdGFudERlY2xhcmF0aW9uCisgKiAoSkxTMiA5LjMpIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgVmFyaWFibGVEZWNsYXJhdG9yIGNsYXVzZS4KKyAqIEEgZmllbGQgaGFzIG5vIGNoaWxkcmVuLiBUaGUgcGFyZW50IG9mIGEgZmllbGQgaXMgYSB0eXBlLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRE9NRmllbGQgZXh0ZW5kcyBJRE9NTWVtYmVyIHsKKy8qKgorICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBmb3IgdGhpcyBmaWVsZC4KKyAqIFRoZSBzeW50YXggZm9yIGFuIGluaXRpYWxpemVyIGNvcnJlc3BvbmRzIHRvIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKEpMUzIgOC4zKS4gCisgKiA8cD4KKyAqIE5vdGU6IFRoZSBleHByZXNzaW9uIGRvZXMgbm90IGluY2x1ZGUgYSAiPGNvZGU+PTwvY29kZT4iLgorICogPC9wPgorICoKKyAqIEByZXR1cm4gdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmllbGQgZG9lcworICogICAgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIKKyAqLworcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXplcigpOworLyoqCisgKiBUaGUgPGNvZGU+SURPTUZpZWxkPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkLiBUaGUgc3ludGF4IGZvciB0aGUgbmFtZSBvZiBhIGZpZWxkCisgKiBjb3JyZXNwb25kcyB0byBWYXJpYWJsZURlY2xhcmF0b3JJZCAoSkxTMiA4LjMpLgorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBuYW1lIG9mIHRoaXMgZmllbGQuIFRoZSBzeW50YXggZm9yIGEgdHlwZSBuYW1lIG9mIGEgZmllbGQKKyAqIGNvcnJlc3BvbmRzIHRvIFR5cGUgaW4gRmllbGQgRGVjbGFyYXRpb24gKEpMUzIgOC4zKS4KKyAqCisgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlKCk7CisvKioKKyAqIFNldHMgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gZm9yIHRoaXMgZmllbGQuCisgKiBUaGUgc3ludGF4IGZvciBhbiBpbml0aWFsaXplciBjb3JyZXNwb25kcyB0byBWYXJpYWJsZUluaXRpYWxpemVyIChKTFMyIDguMykuIAorICogPHA+CisgKiBOb3RlOiBUaGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBpbmNsdWRlIGEgIjxjb2RlPj08L2NvZGU+Ii4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcKKyAqICAgdGhlIGZpZWxkIGRvZXMgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIKKyAqLworcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoU3RyaW5nIGluaXRpYWxpemVyKTsKKy8qKgorICogVGhlIDxjb2RlPklET01GaWVsZDwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHNldHMgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4gVGhlIHN5bnRheCBmb3IgdGhlIG5hbWUgb2YgYSBmaWVsZAorICogY29ycmVzcG9uZHMgdG8gVmFyaWFibGVEZWNsYXJhdG9ySWQgKEpMUzIgOC4zKS4KKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKy8qKgorICogU2V0cyB0aGUgdHlwZSBuYW1lIG9mIHRoaXMgZmllbGQuIFRoZSBzeW50YXggZm9yIGEgdHlwZSBuYW1lIG9mIGEgZmllbGQKKyAqIGNvcnJlc3BvbmRzIHRvIFR5cGUgaW4gRmllbGQgRGVjbGFyYXRpb24gKEpMUzIgOC4zKS4gVHlwZSBuYW1lcyBtdXN0IGJlIAorICogc3BlY2lmaWVkIGFzIHRoZXkgc2hvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yIGV4YW1wbGU6IAorICogPGNvZGU+IlN0cmluZyI8L2NvZGU+LCA8Y29kZT4iaW50W10iPC9jb2RlPiwgb3IgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LgorICoKKyAqIEBwYXJhbSB0eXBlTmFtZSB0aGUgdHlwZSBuYW1lCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQKKyAqLworcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzU5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLgorICogVGhlIGNvcnJlc3BvbmRpbmcgc3ludGFjdGljIHVuaXQgaXMgSW1wb3J0RGVjbGFyYXRpb24gKEpMUzIgNy41KS4KKyAqIEFuIGltcG9ydCBoYXMgbm8gY2hpbGRyZW4gYW5kIGl0cyBwYXJlbnQgaXMgYSBjb21waWxhdGlvbiB1bml0LgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRE9NSW1wb3J0IGV4dGVuZHMgSURPTU5vZGUgeworLyoqCisgKiBUaGUgPGNvZGU+SURPTUltcG9ydDwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBpbXBvcnQuIFRoZSBzeW50YXggZm9yIGFuIGltcG9ydCBuYW1lIAorICogY29ycmVzcG9uZHMgdG8gYSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lLCBvciB0byBhbiBvbi1kZW1hbmQgcGFja2FnZSBuYW1lCisgKiBhcyBkZWZpbmVkIGJ5IEltcG9ydERlY2xhcmF0aW9uIChKTFMyIDcuNSkuCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbXBvcnQgZGVjbGFyYXRpb24gZW5kcyB3aXRoIDxjb2RlPiIuKiI8L2NvZGU+LgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbiBhbiBvbi1kZW1hbmQgaW1wb3J0CisgKi8KK3B1YmxpYyBib29sZWFuIGlzT25EZW1hbmQoKTsKKy8qKgorICogVGhlIDxjb2RlPklET01JbXBvcnQ8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KKyAqIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoaXMgaW1wb3J0LiBUaGUgc3ludGF4IGZvciBhbiBpbXBvcnQgbmFtZSAKKyAqIGNvcnJlc3BvbmRzIHRvIGEgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSwgb3IgdG8gYW4gb24tZGVtYW5kIHBhY2thZ2UgbmFtZQorICogYXMgZGVmaW5lZCBieSBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZAorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Jbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzU5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbml0aWFsaXplci4gVGhlIGNvcnJlc3BvbmRpbmcgc3ludGFjdGljCisgKiB1bml0cyBhcmUgSW5zdGFuY2VJbml0aWFsaXplciAoSkxTMiA4LjYpIGFuZCBTdGF0aWNEZWNsYXJhdGlvbiAoSkxTMiA4LjcpLgorICogQW4gaW5pdGlhbGl6ZXIgaGFzIG5vIGNoaWxkcmVuIGFuZCBpdHMgcGFyZW50IGlzIGEgdHlwZS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURPTUluaXRpYWxpemVyIGV4dGVuZHMgSURPTU1lbWJlciB7CisvKioKKyAqIFJldHVybnMgdGhlIGJvZHkgb2YgdGhpcyBpbml0aWFsaXplci4gVGhlIHN5bnRheCBmb3IgYSBib2R5IGNvcnJlc3BvbmRzIHRvCisgKiBJbnN0YW5jZUluaXRpYWxpemVyIChKTFMyIDguNikgYW5kIFN0YXRpY0RlY2xhcmF0aW9uIChKTFMyIDguNykuCisgKgorICogQHJldHVybiBhbiBpbml0aWFsaXplciBib2R5LCBpbmNsdWRpbmcgYnJhY2VzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICogICBubyBib2R5IGlzIHByZXNlbnQKKyAqLworcHVibGljIFN0cmluZyBnZXRCb2R5KCk7CisvKioKKyAqIFRoZSA8Y29kZT5JRE9NSW5pdGlhbGl6ZXI8L2NvZGU+IHJlZmluZW1lbnQgb2YgdGhpcyA8Y29kZT5JRE9NTm9kZTwvY29kZT4KKyAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBBbiBpbml0aWFsaXplciBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KKyAqLworcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisvKioKKyAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBpbml0aWFsaXplci4gVGhlIHN5bnRheCBmb3IgYSBib2R5IGNvcnJlc3BvbmRzIHRvCisgKiBJbnN0YW5jZUluaXRpYWxpemVyIChKTFMyIDguNikgYW5kIFN0YXRpY0RlY2xhcmF0aW9uIChKTFMyIDguNykuIE5vIGZvcm1hdHRpbmcKKyAqIG9yIHN5bnRheCBjaGVja2luZyBpcyBwZXJmb3JtZWQgb24gdGhlIGJvZHkuIEJyYWNlcyA8Yj5tdXN0PC9iPiBiZSBpbmNsdWRlZC4KKyAqCisgKiBAcGFyYW0gYm9keSBhbiBpbml0aWFsaXplciBib2R5LCBpbmNsdWRpbmcgYnJhY2VzLCBvciA8Y29kZT5udWxsPC9jb2RlPiAKKyAqICAgaW5kaWNhdGluZyBubyBib2R5CisgKi8KK3B1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpOworLyoqCisgKiBUaGUgPGNvZGU+SURPTUluaXRpYWxpemVyPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKiBtZXRob2QgZG9lcyBub3RoaW5nLgorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWVtYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZmM3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CisKKy8qKgorICogQW4gPGNvZGU+SURPTU1lbWJlcjwvY29kZT4gZGVmaW5lcyBmdW5jdGlvbmFsaXR5IGNvbW1vbiB0byBub2Rlcywgd2hpY2gKKyAqIGNhbiBiZSBtZW1iZXJzIG9mIHR5cGVzLgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIElET01UeXBlCisgKiBAc2VlIElET01NZXRob2QKKyAqIEBzZWUgSURPTUZpZWxkCisgKiBAc2VlIElET01Jbml0aWFsaXplcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElET01NZW1iZXIgZXh0ZW5kcyBJRE9NTm9kZSB7CisvKioKKyAqIFJldHVybnMgdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVtYmVyIChpbmNsdWRpbmcgY29tbWVudCBkZWxpbWl0ZXJzKS4KKyAqCisgKiBAcmV0dXJuIHRoZSBjb21tZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG1lbWJlciBoYXMgbm8gYXNzb2NpYXRlZAorICogICBjb21tZW50CisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBmbGFncyBmb3IgdGhpcyBtZW1iZXIuIFRoZSBmbGFncyBjYW4gYmUgZXhhbWluZWQgdXNpbmcgdGhlCisgKiA8Y29kZT5GbGFnczwvY29kZT4gY2xhc3MuCisgKgorICogQHJldHVybiB0aGUgZmxhZ3MKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKyAqLworcHVibGljIGludCBnZXRGbGFncygpOworLyoqCisgKiBTZXRzIHRoZSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lbWJlci4gVGhlIGNvbW1lbnQgd2lsbCBhcHBlYXIKKyAqIGJlZm9yZSB0aGUgbWVtYmVyIGluIHRoZSBzb3VyY2UuIFRoZSBjb21tZW50IG11c3QgYmUgcHJvcGVybHkgZm9ybWF0dGVkLCBpbmNsdWRpbmcKKyAqIGRlbGltaXRlcnMuIEEgPGNvZGU+bnVsbDwvY29kZT4gY29tbWVudCBpbmRpY2F0ZXMgbm8gY29tbWVudC4gVGhpcyBtZW1iZXIncworICogZGVwcmVjYXRlZCBmbGFnIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHJlZmxlY3QgdGhlIGRlcHJlY2F0ZWQgdGFnIGluIHRoZQorICogY29tbWVudC4KKyAqCisgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCwgaW5jbHVkaW5nIGNvbW1lbnQgZGVsaW1pdGVycywgb3IgCisgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhpcyBtZW1iZXIgc2hvdWxkIGhhdmUgbm8gYXNzb2NpYXRlZCBjb21tZW50CisgKiBAc2VlICNzZXRGbGFncworICovCitwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KTsKKy8qKgorICogU2V0cyB0aGUgZmxhZ3MgZm9yIHRoaXMgbWVtYmVyLiBUaGUgZmxhZ3MgY2FuIGJlIGV4YW1pbmVkIHVzaW5nIHRoZQorICogPGNvZGU+RmxhZ3M8L2NvZGU+IGNsYXNzLiBUaGUgZGVwcmVjYXRlZCBmbGFnIHBhc3NlZCBpbiBpcyBpZ25vcmVkLgorICoKKyAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKyAqLworcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzOWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtZXRob2QgZGVjbGFyYXRpb24uCisgKiBUaGUgY29ycmVzcG9uZGluZyBzeW50YWN0aWMgdW5pdHMgYXJlIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCksCisgKiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIChKTFMyIDguOCksIGFuZCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDkuNCkuCisgKiBBIG1ldGhvZCBoYXMgbm8gY2hpbGRyZW4gYW5kIGl0cyBwYXJlbnQgaXMgYSB0eXBlLgorICogTG9jYWwgY2xhc3NlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBib2R5IG9mIGEgbWV0aG9kLCBub3QgYSBjaGlsZC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURPTU1ldGhvZCBleHRlbmRzIElET01NZW1iZXIgeworLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBleGNlcHRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoaXMgbWV0aG9kCisgKiBpcyBkZWNsYXJlZCB0byB0aHJvdy4KKyAqIFRoZSBzeW50YXggZm9yIGFuIGV4Y2VwdGlvbiB0eXBlIG5hbWUgaXMgZGVmaW5lZCBieSBNZXRob2QgVGhyb3dzIChKTFMyIDguNC40KS4KKyAqIFR5cGUgbmFtZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciAKKyAqIGV4YW1wbGU6IDxjb2RlPiJJT0V4Y2VwdGlvbiI8L2NvZGU+IG9yIDxjb2RlPiJqYXZhLmlvLklPRXhjZXB0aW9uIjwvY29kZT4uCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciA8Y29kZT5zZXRFeGNlcHRpb25zPC9jb2RlPi4KKyAqCisgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSB0aGUgZXhjZXB0aW9uIHR5cGUKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZAorICogQHNlZSAjc2V0RXhjZXB0aW9ucworICovCitwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvblR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIHBhcmFtZXRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciA8Y29kZT5zZXRQYXJhbWV0ZXJzPC9jb2RlPi4KKyAqIFRoZSBzeW50YXggZm9yIHBhcmFtZXRlciBuYW1lcyBpcyBkZWZpbmVkIGJ5IEZvcm1hbCBQYXJhbWV0ZXJzIChKTFMyIDguNC4xKS4KKyAqIFRoZSBzeW50YXggZm9yIHR5cGUgbmFtZXMgaXMgZGVmaW5lZCBieSBGb3JtYWwgUGFyYW1ldGVycyAoSkxTMiA4LjQuMSkuIAorICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yCisgKiBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sIG9yIAorICogPGNvZGU+ImludFtdIjwvY29kZT4uCisgKiAKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG5hbWUKKyAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkIGZvcgorICogICBlaXRoZXIgdGhlIHR5cGUgb3IgdGhlIG5hbWUKKyAqIEBzZWUgI3NldFBhcmFtZXRlcnMKKyAqLworcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZC4gVGhlIG1ldGhvZCBib2R5IGluY2x1ZGVzIGFsbCBjb2RlIGZvbGxvd2luZworICogdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiwgaW5jbHVkaW5nIHRoZSBlbmNsb3NpbmcgYnJhY2VzLiAKKyAqCisgKiBAcmV0dXJuIHRoZSBib2R5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGhhcyBubyBib2R5IChmb3IKKyAqICAgZXhhbXBsZSwgZm9yIGFuIGFic3RyYWN0IG9yIG5hdGl2ZSBtZXRob2QpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZXhjZXB0aW9uIHR5cGVzIHRoaXMgbWV0aG9kIHRocm93cworICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIHRoZSBzb3VyY2UsIG9yIGFuIGVtcHR5IGFycmF5CisgKiBpZiB0aGlzIG1ldGhvZCBkZWNsYXJlcyBubyBleGNlcHRpb24gdHlwZXMuCisgKiBUaGUgc3ludGF4IGZvciBhbiBleGNlcHRpb24gdHlwZSBuYW1lIGlzIGRlZmluZWQgYnkgTWV0aG9kIFRocm93cyAoSkxTMiA4LjQuNCkuCisgKiBUeXBlIG5hbWVzIGFwcGVhciBhcyB0aGV5IHdvdWxkIGluIHNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZTogCisgKiA8Y29kZT4iSU9FeGNlcHRpb24iPC9jb2RlPiBvciA8Y29kZT4iamF2YS5pby5JT0V4Y2VwdGlvbiI8L2NvZGU+LgorICoKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZXhjZXB0aW9uIHR5cGVzCisgKi8KK3B1YmxpYyBTdHJpbmdbXSBnZXRFeGNlcHRpb25zKCk7CisvKioKKyAqIFRoZSA8Y29kZT5JRE9NTWV0aG9kPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBmb3IKKyAqIGNvbnN0cnVjdG9ycy4gVGhlIHN5bnRheCBmb3IgYSBtZXRob2QgIG5hbWUgaXMgZGVmaW5lZCBieSBJZGVudGlmaWVyCisgKiBvZiBNZXRob2REZWNsYXJhdG9yIChKTFMyIDguNCkuCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBwYXJhbWV0ZXJzIGluIHRoaXMgbWV0aG9kIGluIHRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZCwKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkLgorICogVGhlIHN5bnRheCBmb3IgcGFyYW1ldGVyIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLgorICogCisgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycworICogIGFyZSBkZWNsYXJlZAorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBuYW1lcyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycyBhcmUgZGVjbGFyZWQuCisgKiBUaGUgc3ludGF4IGZvciB0eXBlIG5hbWVzIGlzIGRlZmluZWQgYnkgRm9ybWFsIFBhcmFtZXRlcnMgKEpMUzIgOC40LjEpLiAKKyAqIFR5cGUgbmFtZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvcgorICogZXhhbXBsZTogPGNvZGU+IkZpbGUiPC9jb2RlPiwgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LCBvciAKKyAqIDxjb2RlPiJpbnRbXSI8L2NvZGU+LgorICogCisgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGFyYW1ldGVycworICogIGFyZSBkZWNsYXJlZAorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKy8qKgorICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uIAorICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgY29uc3RydWN0b3JzLgorICogVGhlIHN5bnRheCBmb3IgcmV0dXJuIHR5cGUgbmFtZSBjb3JyZXNwb25kcyB0byBSZXR1cm5UeXBlIGluIAorICogTWV0aG9kRGVjbGFyYXRpb24gKEpMUzIgOC40KS4gTmFtZXMgYXJlIHJldHVybmVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UKKyAqIGNvZGU7IGZvciBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sCisgKiA8Y29kZT4iaW50W10iPC9jb2RlPiwgb3IgPGNvZGU+InZvaWQiPC9jb2RlPi4KKyAqCisgKiBAcmV0dXJuIHRoZSByZXR1cm4gdHlwZQorICovCitwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGEgY29uc3RydWN0b3IuCisgKgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgY29uc3RydWN0b3JzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBtZXRob2RzCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKTsKKy8qKgorICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZC4gVGhlIG1ldGhvZCBib2R5IGluY2x1ZGVzIGFsbCBjb2RlIGZvbGxvd2luZworICogdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiwgaW5jbHVkaW5nIHRoZSBlbmNsb3NpbmcgYnJhY2VzLiBObyBmb3JtYXR0aW5nIG9yCisgKiBzeW50YXggY2hlY2tpbmcgaXMgcGVyZm9ybWVkIG9uIHRoZSBib2R5LgorICoKKyAqIEByZXR1cm4gdGhlIGJvZHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhlIG1ldGhvZCBoYXMgbm8gYm9keSAoZm9yCisgKiAgIGV4YW1wbGUsIGZvciBhbiBhYnN0cmFjdCBvciBuYXRpdmUgbWV0aG9kKQorICovCitwdWJsaWMgdm9pZCBzZXRCb2R5KFN0cmluZyBib2R5KTsKKy8qKgorICogU2V0cyB3aGV0aGVyIHRoaXMgbWV0aG9kIHJlcHJlc2VudHMgYSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gYiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgY29uc3RydWN0b3JzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBtZXRob2RzCisgKi8KK3B1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gYik7CisvKioKKyAqIFNldHMgdGhlIG5hbWVzIG9mIHRoZSBleGNlcHRpb24gdHlwZXMgdGhpcyBtZXRob2QgdGhyb3dzLAorICogaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIHRoZSBzb3VyY2UuIEFuIGVtcHR5IGFycmF5CisgKiBpbmRpY2F0ZXMgdGhpcyBtZXRob2QgZGVjbGFyZXMgbm8gZXhjZXB0aW9uIHR5cGVzLgorICogVGhlIHN5bnRheCBmb3IgYW4gZXhjZXB0aW9uIHR5cGUgbmFtZSBpcyBkZWZpbmVkIGJ5IE1ldGhvZCBUaHJvd3MgKEpMUzIgOC40LjQpLgorICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yIAorICogZXhhbXBsZTogPGNvZGU+IklPRXhjZXB0aW9uIjwvY29kZT4gb3IgPGNvZGU+ImphdmEuaW8uSU9FeGNlcHRpb24iPC9jb2RlPi4KKyAqCisgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZXMgdGhlIGxpc3Qgb2YgZXhjZXB0aW9uIHR5cGVzCisgKi8KK3B1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnMoU3RyaW5nW10gZXhjZXB0aW9uVHlwZXMpOworLyoqCisgKiBUaGUgPGNvZGU+SURPTU1ldGhvZDwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHNldHMgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QuIFRoZSBzeW50YXggZm9yIGEgbWV0aG9kIAorICogbmFtZSBpcyBkZWZpbmVkIGJ5IElkZW50aWZlciBvZiBNZXRob2REZWNsYXJhdG9yIChKTFMyIDguNCkuCisgKiA8cD4KKyAqIFRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgaXMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aHVzIGl0CisgKiBtdXN0IG5vdCBiZSBzZXQuCisgKiA8L3A+CisgKgorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkCisgKi8KK3B1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisvKioKKyAqIFNldHMgdGhlIHR5cGVzIGFuZCBuYW1lcyBvZiBwYXJhbWV0ZXJzIGluIHRoaXMgbWV0aG9kIGluIHRoZSBvcmRlciB0aGV5IGFyZQorICogdG8gYmUgZGVjbGFyZWQuIElmIGJvdGggPGNvZGU+dHlwZXM8L2NvZGU+IGFuZCA8Y29kZT5uYW1lczwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+IAorICogdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycy4KKyAqIFRoZSBzeW50YXggZm9yIHBhcmFtZXRlciBuYW1lcyBpcyBkZWZpbmVkIGJ5IEZvcm1hbCBQYXJhbWV0ZXJzIChKTFMyIDguNC4xKS4KKyAqIFRoZSBzeW50YXggZm9yIHR5cGUgbmFtZXMgaXMgZGVmaW5lZCBieSBGb3JtYWwgUGFyYW1ldGVycyAoSkxTMiA4LjQuMSkuIAorICogVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4gRm9yCisgKiBleGFtcGxlOiA8Y29kZT4iRmlsZSI8L2NvZGU+LCA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4sIG9yIAorICogPGNvZGU+ImludFtdIjwvY29kZT4uCisgKiAKKyAqIEBwYXJhbSB0eXBlcyB0aGUgbGlzdCBvZiB0eXBlIG5hbWVzCisgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWUKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgdHlwZXMgYW5kIG5hbWVzIGRvIG5vdCAKKyAqICAgbWF0Y2gsIG9yIGlmIGVpdGhlciBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCitwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFN0cmluZ1tdIHR5cGVzLCBTdHJpbmdbXSBuYW1lcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKy8qKgorICogU2V0cyB0aGUgcmV0dXJuIHR5cGUgbmFtZS4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIGNvbnN0cnVjdG9ycy4KKyAqIFRoZSBzeW50YXggZm9yIHJldHVybiB0eXBlIG5hbWUgY29ycmVzcG9uZHMgdG8gUmV0dXJuVHlwZSBpbiAKKyAqIE1ldGhvZERlY2xhcmF0aW9uIChKTFMyIDguNCkuIFR5cGUgbmFtZXMgYXJlIHNwZWNpZmllZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUgCisgKiBzb3VyY2UgY29kZTsgZm9yIGV4YW1wbGU6IDxjb2RlPiJGaWxlIjwvY29kZT4sIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiwKKyAqIDxjb2RlPiJpbnRbXSI8L2NvZGU+LCBvciA8Y29kZT4idm9pZCI8L2NvZGU+LgorICoKKyAqIEBwYXJhbSB0eXBlIHRoZSByZXR1cm4gdHlwZQorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkCisgKi8KK3B1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoU3RyaW5nIHR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Ob2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjYWNjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU5vZGUuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKKworLyoqCisgKiBOb2RlcyByZXByZXNlbnQgc3RydWN0dXJhbCBmcmFnbWVudHMgb2YgYSBKYXZhIHNvdXJjZSBmaWxlLCBhbHNvIGtub3duIGFzIGRvY3VtZW50IGZyYWdtZW50cy4gVGhlaXIgaW1wbGVtZW50YXRpb24KKyAqIGlzIGtub3duIGFzIGEgRE9NIChEb2N1bWVudCBPYmplY3QgTW9kZWwpIC0gIGluIHRoaXMgY2FzZSBhIEpET00gKEphdmEgRE9NKS4gQSByb290IG5vZGUgKG5vZGUKKyAqIHdpdGggbm8gcGFyZW50IG9yIHNpYmxpbmdzKSByZXByZXNlbnRzIHRoZSByb290IG9mIGEgZG9jdW1lbnQgZnJhZ21lbnQgKERGKS4gQSBjb21wbGV0ZSBKYXZhIGRvY3VtZW50IGlzCisgKiByZXByZXNlbnRlZCBieSBhIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSAoPGNvZGU+SURPTUNvbXBpbGF0aW9uVW5pdDwvY29kZT4pLiBJbiB0aGlzIHdheSwgYSBERiBpcworICogY29tcHJpc2VkIG9mIERGcywgYW5kIGEgZG9jdW1lbnQgaXRzZWxmIChjb21waWxhdGlvbiB1bml0KSBpcyBhbHNvIGEgREYuCisgKiA8cD4KKyAqIEEgREYgbWF5IGJlIGNyZWF0ZWQgZW1wdHkgYW5kIHByb2dyYW1tYXRpY2FsbHkgZmlsbGVkLCBvciBpdCBtYXkgYmUgY3JlYXRlZCBmcm9tCisgKiBhIHNvdXJjZSBjb2RlIHN0cmluZy4gVGhlIDxjb2RlPklET01GYWN0b3J5PC9jb2RlPiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGFsbCBraW5kcworICogb2Ygbm9kZXMgZnJvbSBzb3VyY2UgY29kZSBzdHJpbmdzLiBNYW5pcHVsYXRpb25zIHBlcmZvcm1lZCBvbiBhIERGIGFyZSBpbW1lZGlhdGVseQorICogcmVmbGVjdGVkIGluIHRoZSBERidzIGNvbnRlbnRzLgorICogPC9wPgorICogPHA+CisgKiBDaGlsZHJlbiBmcmFnbWVudHMgYXJlIHJlcHJlc2VudGVkIGFzIGEgbGlua2VkIGxpc3Qgb2Ygbm9kZXMuIENoaWxkcmVuIGFyZSBpbnNlcnRlZCB2aWEgdGhlaXIgcGFyZW50IG5vZGUsIGFuZAorICogYXJlIGF1dG9tYXRpY2FsbHkgbGlua2VkIHVwIHdpdGggcHJldmlvdXMgYW5kIG5leHQgbm9kZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBjb250ZW50cyBvZiBhbnkgbm9kZSAoREYpIG1heSBiZSByZXRyaWV2ZWQgYXQgYW55IHRpbWUuIEluIHRoaXMgd2F5IGl0IGlzIHBvc3NpYmxlIHRvIHJldHJpZXZlCisgKiBzb3VyY2UgY29kZSByZXByZXNlbnRpbmcgZnJhZ21lbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IChmb3IgZXhhbXBsZSwgYSB0eXBlIG9yIGEgbWV0aG9kKSwgc2luY2UKKyAqIHRoZSBjb250ZW50cyBvZiBhbnkgbm9kZSAobm90IGp1c3QgdGhlIHJvb3Qgbm9kZSkgbWF5IGJlIG9idGFpbmVkLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG1hbmlwdWxhdGlvbnMgb24gREZzIGFyZSBkaXN0aW5jdDoKKyAqIDx1bD4KKyAqIDxsaT5jbG9uZSAtIHRoaXMgY3JlYXRlcyBhIHN0YW5kLWFsb25lIGNvcHkgb2YgdGhlIERGIHRoYXQgaXMgaW4gbm8gd2F5IGRlcGVuZGVudCBvbiB0aGUgREYgdGhhdCBpdCB3YXMgY2xvbmVkIGZyb208L2xpPgorICogPGxpPnJlbW92ZSAtIHRoaXMgb3JwaGFucyBhIERGIGZyb20gaXRzIGhvc3QgREYuIFRoZSByZW1vdmVkIERGIG1heSBzdGlsbCBiZSBkZXBlbmRlbnQgb24gaXRzIHByZXZpb3VzIGhvc3QKKyAqICAgIChwZXJoYXBzIHRvIGdlbmVyYXRlIGl0cyBjb250ZW50cyksIGFuZCBoYW5naW5nIG9udG8gdGhlIGZyYWdtZW50IG1lYW5zIHRoYXQgaXRzIHByZXZpb3VzIGhvc3QgaXMgYWxzbworICogICAgcmV0YWluZWQgaW4gbWVtb3J5LjwvbGk+CisgKiA8bGk+YWRkL2luc2VydCAtIHRoaXMgc3BsaWNlcyBhbiB1bi1wYXJlbnRlZCBERiAob25lIHRoYXQgaGFzIGJlZW4gY2xvbmVkLCByZW1vdmVkLCBvciBjcmVhdGVkIHN0YW5kLWFsb25lKSwKKyAqICAgIGludG8gYW4gZXhpc3RpbmcgREYgc3VjaCB0aGF0IHRoZSBuZXdseSBpbnNlcnRlZCBERiBpcyBvbmx5IGRlcGVuZGVudCBvbiBpdHMgbmV3IGhvc3QuPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZXJldmVyIHR5cGVzIGFyZSBzcGVjaWZpZWQgaW4gRE9NIEFQSXMsIHR5cGUgbmFtZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIKKyAqIGluIHNvdXJjZSBjb2RlLiBUaGUgRE9NIGRvZXMgbm90IGhhdmUgYSBub3Rpb24gb2YgdHlwZSBzaWduYXR1cmVzLCBvbmx5IHJhdyB0ZXh0LiBFeGFtcGxlIHR5cGUKKyAqIG5hbWVzIGFyZSA8Y29kZT4iT2JqZWN0IjwvY29kZT4sIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPiwgYW5kIDxjb2RlPiJpbnRbXSI8L2NvZGU+LgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBJRE9NTm9kZSBleHRlbmRzIENsb25lYWJsZSAgeworCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBjb21waWxhdGlvbiB1bml0LgorCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NQ29tcGlsYXRpb25Vbml0PC9jb2RlPi4KKwkgKiBAc2VlICNnZXROb2RlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IENPTVBJTEFUSU9OX1VOSVQ9IDE7CisJCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBwYWNrYWdlIGRlY2xhcmF0aW9uLgorCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NUGFja2FnZTwvY29kZT4uCisJKiBAc2VlICNnZXROb2RlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFBBQ0tBR0U9IDI7CisJCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYW4gaW1wb3J0IGRlY2xhcmF0aW9uLgorCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NSW1wb3J0PC9jb2RlPi4KKwkgKiBAc2VlICNnZXROb2RlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IElNUE9SVD0gMzsKKwkKKwkvKioKKwkgKiBOb2RlIHR5cGUgY29uc3RhbnQgaW5kaWNhdGluZyBhIHR5cGUgZGVjbGFyYXRpb24uCisJICogTm9kZXMgb2YgdGhpcyB0eXBlIG1heWJlIGJ5IHNhZmVseSBjYXN0IHRvIDxjb2RlPklET01UeXBlPC9jb2RlPi4KKwkgKiBAc2VlICNnZXROb2RlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IFRZUEU9IDQ7CisJCisJLyoqCisJICogTm9kZSB0eXBlIGNvbnN0YW50IGluZGljYXRpbmcgYSBmaWVsZCBkZWNsYXJhdGlvbi4KKwkgKiBOb2RlcyBvZiB0aGlzIHR5cGUgbWF5YmUgYnkgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SURPTUZpZWxkPC9jb2RlPi4KKwkgKiBAc2VlICNnZXROb2RlVHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IEZJRUxEPSA1OworCQorCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGEgbWV0aG9kIChvciBjb25zdHJ1Y3RvcikgZGVjbGFyYXRpb24uCisJICogTm9kZXMgb2YgdGhpcyB0eXBlIG1heWJlIGJ5IHNhZmVseSBjYXN0IHRvIDxjb2RlPklET01NZXRob2Q8L2NvZGU+LgorCSAqIEBzZWUgI2dldE5vZGVUeXBlCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgTUVUSE9EPSA2OworCQorCS8qKgorCSAqIE5vZGUgdHlwZSBjb25zdGFudCBpbmRpY2F0aW5nIGFuIGluaXRpYWxpemVyIGRlY2xhcmF0aW9uLgorCSAqIE5vZGVzIG9mIHRoaXMgdHlwZSBtYXliZSBieSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JRE9NSW5pdGlhbGl6ZXI8L2NvZGU+LgorCSAqIEBzZWUgI2dldE5vZGVUeXBlCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgSU5JVElBTElaRVI9IDc7CisJCisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIHVuLXBhcmVudGVkIG5vZGUgKGRvY3VtZW50IGZyYWdtZW50KSBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGlzIG5vZGUuCisgKgorICogQHBhcmFtIGNoaWxkIHRoZSBuZXcgY2hpbGQgbm9kZQorICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24gaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkOjx1bD4KKyAqIDxsaT50aGlzIG5vZGUgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbiw8L2xpPgorICogPGxpPnRoZSBjaGlsZCBpcyBub3Qgb2YgYW4gYWxsb3dhYmxlIHR5cGU8L2xpPgorICogPGxpPnRoZSBjaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisgKiA8bGk+dGhlIGNoaWxkIGlzIGFuIGFuY2VzdG9yIG9mIHRoaXMgbm9kZTwvbGk+CisgKiA8L3VsPgorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNoaWxkIGlzIDxjb2RlPm51bGw8L2NvZGU+CisgKgorICogQHNlZSAjaW5zZXJ0U2libGluZworICogQHNlZSAjcmVtb3ZlCisgKi8KK3B1YmxpYyB2b2lkIGFkZENoaWxkKElET01Ob2RlIGNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgaXMgYWxsb3dlZCB0byBoYXZlIGNoaWxkcmVuLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBub2RlIGNhbiBoYXZlIGNoaWxkcmVuCisgKi8KK3B1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpOworLyoqCisgKiBSZXR1cm5zIGEgc3RhbmQtYWxvbmUgY29weSBvZiB0aGUgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBub2RlIHRoYXQKKyAqIGlzIGluIG5vIHdheSBkZXBlbmRlbnQgb24gdGhlIGRvY3VtZW50IHRoaXMgbm9kZSBpcyBwYXJ0IG9mLgorICoKKyAqIEByZXR1cm4gYSBjb3B5IG9mIHR5cGUgPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKiBAc2VlICNhZGRDaGlsZAorICogQHNlZSAjaW5zZXJ0U2libGluZworICogQHNlZSAjcmVtb3ZlCisgKi8KK3B1YmxpYyBPYmplY3QgY2xvbmUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50IGZyYWdtZW50IGFzIGEgY2hhcmFjdGVyIGFycmF5LgorICogPHA+CisgKiBOb3RlOiBUbyBvYnRhaW4gY29tcGxldGUgc291cmNlIGZvciB0aGUgIi5qYXZhIiBmaWxlLCBhc2sgYSBjb21waWxhdGlvbiB1bml0CisgKiBub2RlIGZvciBpdHMgY29udGVudHMuCisgKiA8L3A+CisgKgorICogQHJldHVybiB0aGUgY29udGVudHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBoYXMgbm8gY29udGVudHMKKyAqLworcHVibGljIGNoYXJbXSBnZXRDaGFyYWN0ZXJzKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IG5hbWVkIGNoaWxkIG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgKiBAcmV0dXJuIHRoZSBjaGlsZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGNoaWxkIGV4aXN0cworICovCitwdWJsaWMgSURPTU5vZGUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpOworLyoqCisgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4gUmV0dXJucyBhbiBlbXB0eSBlbnVtZXJhdGlvbgorICogaWYgdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbiAoaW5jbHVkaW5nIG5vZGVzIHRoYXQgY2Fubm90IGhhdmUgY2hpbGRyZW4pLiAKKyAqIENoaWxkcmVuIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZSBjb2RlLgorICoKKyAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGNoaWxkcmVuCisgKi8KK3B1YmxpYyBFbnVtZXJhdGlvbiBnZXRDaGlsZHJlbigpOworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoaXMgZG9jdW1lbnQgZnJhZ21lbnQuCisgKiA8cD4KKyAqIE5vdGU6IFRvIG9idGFpbiBjb21wbGV0ZSBzb3VyY2UgZm9yIHRoZSAiLmphdmEiIGZpbGUsIGFzayBhIGNvbXBpbGF0aW9uIHVuaXQKKyAqIG5vZGUgZm9yIGl0cyBjb250ZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAcmV0dXJuIHRoZSBjb250ZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGhhcyBubyBjb250ZW50cworICovCitwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCk7CisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4KKyAqIENoaWxkcmVuIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBleGlzdCBpbiB0aGUgc291cmNlIGNvZGUuCisgKgorICogQHJldHVybiB0aGUgZmlyc3QgY2hpbGQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBoYXMgbm8gY2hpbGRyZW4KKyAqIEBzZWUgI2dldENoaWxkcmVuCisgKi8KK3B1YmxpYyBJRE9NTm9kZSBnZXRGaXJzdENoaWxkKCk7CisvKioKKyAqIFJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBKYXZhIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgCisgKiBkb2N1bWVudCBmcmFnbWVudCwgYmFzZWQgb24gdGhlIHBhcmVudCBKYXZhIGVsZW1lbnQuCisgKgorICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IEphdmEgZWxlbWVudAorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBlbGVtZW50IGlzIG5vdAorICogICBvZiBhIHZhbGlkIHBhcmVudCB0eXBlIGZvciB0aGlzIG5vZGUKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgcGFyZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworLyoqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAqIE1vcmUgZGV0YWlscyBhcmUgcHJvdmlkZWQgaW4gZWFjaCBvZiB0aGUgc3VidHlwZXMuCisgKgorICogQHJldHVybiB0aGUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIG5hbWUKKyAqLworcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisvKioKKyAqIFJldHVybnMgdGhlIHNpYmxpbmcgbm9kZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBub2RlLgorICoKKyAqIEByZXR1cm4gdGhlIG5leHQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZm9sbG93aW5nIG5vZGUKKyAqLworcHVibGljIElET01Ob2RlIGdldE5leHROb2RlKCk7CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBub2RlLgorICoKKyAqIEByZXR1cm4gb25lIG9mIHRoZSBub2RlIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4gPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKi8KK3B1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqCisgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSAKKyAqICAgcGFyZW50CisgKi8KK3B1YmxpYyBJRE9NTm9kZSBnZXRQYXJlbnQoKTsKKy8qKgorICogUmV0dXJucyB0aGUgc2libGluZyBub2RlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGlzIG5vZGUuCisgKgorICogQHJldHVybiB0aGUgcHJldmlvdXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcHJlY2VkaW5nIG5vZGUKKyAqLworcHVibGljIElET01Ob2RlIGdldFByZXZpb3VzTm9kZSgpOworLyoqCisgKiBJbnNlcnRzIHRoZSBnaXZlbiB1bi1wYXJlbnRlZCBub2RlIGFzIGEgc2libGluZyBvZiB0aGlzIG5vZGUsIGltbWVkaWF0ZWx5IGJlZm9yZQorICogdGhpcyBub2RlLgorICoKKyAqIEBwYXJhbSBzaWJsaW5nIHRoZSBuZXcgc2libGluZyBub2RlCisgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQ6PHVsPgorICogPGxpPnRoaXMgbm9kZSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IHJvb3Q8L2xpPgorICogPGxpPnRoZSBzaWJsaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlPC9saT4KKyAqIDxsaT50aGUgc2libGluZyBhbHJlYWR5IGhhcyBhIHBhcmVudDwvbGk+CisgKiA8bGk+dGhpcyBzaWJsaW5nIGlzIGFuIGFuY2VzdG9yIG9mIHRoaXMgbm9kZTwvbGk+CisgKiA8L3VsPgorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpYmxpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqCisgKiBAc2VlICNhZGRDaGlsZAorICogQHNlZSAjY2xvbmUKKyAqIEBzZWUgI3JlbW92ZQorICovCitwdWJsaWMgdm9pZCBpbnNlcnRTaWJsaW5nKElET01Ob2RlIHNpYmxpbmcpIHRocm93cyBET01FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGFuIGFsbG93YWJsZSBjaGlsZCBmb3IgdGhpcyBub2RlLgorICoKKyAqIEBwYXJhbSBub2RlIHRoZSBwb3RlbnRpYWwgY2hpbGQgbm9kZQorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBhbiBhbGxvd2FibGUgY2hpbGQKKyAqLworcHVibGljIGJvb2xlYW4gaXNBbGxvd2FibGVDaGlsZChJRE9NTm9kZSBub2RlKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSdzIHNpZ25hdHVyZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbgorICogbm9kZSdzIHNpZ25hdHVyZS4gSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBub2RlcyB3ZXJlIHNpYmxpbmdzLAorICogd291bGQgdGhlIGRlY2xhcmF0aW9ucyBjb2xsaWRlIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgZGVjbGFyYXRpb24uCisgKgorICogQHBhcmFtIG5vZGUgdGhlIG90aGVyIG5vZGUKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5vZGVzIGhhdmUgZXF1aXZhbGVudCBzaWduYXR1cmVzCisgKi8KK3B1YmxpYyBib29sZWFuIGlzU2lnbmF0dXJlRXF1YWwoSURPTU5vZGUgbm9kZSk7CisvKioKKyAqIFNlcGFyYXRlcyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50IGFuZCBzaWJsaW5ncywgbWFpbnRhaW5pbmcgYW55IHRpZXMgdGhhdCB0aGlzIG5vZGUKKyAqIGhhcyB0byB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBmcmFnbWVudC4gQSBkb2N1bWVudCBmcmFnbWVudCB0aGF0IGlzIHJlbW92ZWQKKyAqIGZyb20gaXRzIGhvc3QgZG9jdW1lbnQgbWF5IHN0aWxsIGJlIGRlcGVuZGVudCBvbiB0aGF0IGhvc3QgZG9jdW1lbnQgdW50aWwgaXQgaXMKKyAqIGluc2VydGVkIGludG8gYSBkaWZmZXJlbnQgZG9jdW1lbnQuIFJlbW92aW5nIGEgcm9vdCBub2RlIGhhcyBubyBlZmZlY3QuCisgKgorICogQHNlZSAjYWRkQ2hpbGQKKyAqIEBzZWUgI2Nsb25lCisgKiBAc2VlICNpbnNlcnRTaWJsaW5nCisgKi8KK3B1YmxpYyB2b2lkIHJlbW92ZSgpOworLyoqCisgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4gTmFtZSBmb3JtYXQgZGVwZW5kcyBvbiBub2RlIHR5cGUuCisgKiBNb3JlIGRldGFpbHMgYXJlIHByb3ZpZGVkIGluIGVhY2ggb2YgdGhlIHN1YnR5cGVzLgorICoKKyAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgbmFtZQorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmY2MmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CisvKioKKyAqIFJlcHJlc2VudHMgYSBwYWNrYWdlIGRlY2xhcmF0aW9uLiAKKyAqIFRoZSBjb3JyZXNwb25kaW5nIHN5bnRhY3RpYyB1bml0IGlzIFBhY2thZ2VEZWNsYXJhdGlvbiAoSkxTMiA3LjQpLiAKKyAqIEEgUGFja2FnZSBoYXMgbm8gY2hpbGRyZW4sIGFuZCBpdHMgcGFyZW50IGlzIGEgY29tcGlsYXRpb24gdW5pdC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURPTVBhY2thZ2UgZXh0ZW5kcyBJRE9NTm9kZSB7CisvKioKKyAqIFRoZSA8Y29kZT5JRE9NUGFja2FnZTwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICogaWYgaXQgaGFzIG5vbmUuIFRoZSBzeW50YXggZm9yIGEgcGFja2FnZSBuYW1lIGNvcnJlc3BvbmRzIHRvIFBhY2thZ2VOYW1lCisgKiBhcyBkZWZpbmVkIGJ5IFBhY2thZ2VEZWNsYXJhdGlvbiAoSkxTMiA3LjQpLgorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKy8qKgorICogVGhlIDxjb2RlPklET01QYWNrYWdlPC9jb2RlPiByZWZpbmVtZW50IG9mIHRoaXMgPGNvZGU+SURPTU5vZGU8L2NvZGU+CisgKiBtZXRob2Qgc2V0cyB0aGUgbmFtZSBvZiB0aGlzIHBhY2thZ2UgZGVjbGFyYXRpb24uIFRoZSBzeW50YXggZm9yIGEgcGFja2FnZQorICogbmFtZSBjb3JyZXNwb25kcyB0byBQYWNrYWdlTmFtZSBhcyBkZWZpbmVkIGJ5IFBhY2thZ2VEZWNsYXJhdGlvbiAoSkxTMiA3LjQpLgorICogQSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGluZGljYXRlcyBhbiBlbXB0eSBwYWNrYWdlIGRlY2xhcmF0aW9uOyB0aGF0IGlzLAorICogPGNvZGU+Z2V0Q29udGVudHM8L2NvZGU+IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3ZWRiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVR5cGUuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc291cmNlIHR5cGUgaW4gYSBjb21waWxhdGlvbiB1bml0LCBlaXRoZXIgYXMgYSB0b3AtbGV2ZWwgdHlwZSBvciBhIG1lbWJlciB0eXBlLgorICogVGhlIGNvcnJlc3BvbmRpbmcgc3ludGFjdGljIHVuaXRzIGFyZSBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSkgYW5kIEludGVyZmFjZURlY2xhcmF0aW9uIChKTFMyIDkuMSkuCisgKiA8cD4KKyAqIEFsbG93YWJsZSBjaGlsZCB0eXBlcyBmb3IgYSB0eXBlIGFyZSA8Y29kZT5JRE9NVHlwZTwvY29kZT4sIDxjb2RlPklET01GaWVsZDwvY29kZT4sIAorICogPGNvZGU+SURPTU1ldGhvZDwvY29kZT4sIGFuZCA8Y29kZT5JRE9NSW5pdGlhbGl6ZXI8L2NvZGU+LgorICogQ2hpbGRyZW4gYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZS4gVGhlIHBhcmVudCBvZiBhIHR5cGUKKyAqIGlzIGEgdHlwZSAoaW4gdGhlIGNhc2Ugb2YgYSBtZW1iZXIgdHlwZSkgb3IgYSBjb21waWxhdGlvbiB1bml0IChpbiB0aGUgY2FzZSBvZiBhIHRvcC1sZXZlbCB0eXBlKS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURPTVR5cGUgZXh0ZW5kcyBJRE9NTWVtYmVyIHsKKy8qKgorICogQWRkcyB0aGUgZ2l2ZW4gaW50ZXJmYWNlIG5hbWUgdG8gdGhlIG5hbWVzIG9mIGludGVyZmFjZXMgdGhhdCB0aGlzIHR5cGUgaW1wbGVtZW50cyBvciBleHRlbmRzCisgKiAodGhlIG5hbWUgd2lsbCBiZSBhZGRlZCBhZnRlciB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlIG5hbWVzKS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZC4KKyAqCisgKiBGb3IgY2xhc3NlcywgdGhpcyByZXByZXNlbnRzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLgorICogRm9yIGludGVyZmFjZXMsIHRoaXMgcmVwcmVzZW50cyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGV4dGVuZHMuCisgKiBUaGUgbmFtZSBtYXkgb3IgbWF5IG5vdCBiZSBmdWxseSBxdWFsaWZpZWQuCisgKgorICogQHBhcmFtIGludGVyZmFjZU5hbWUgdGhlIHN5bnRheCBmb3IgYW4gaW50ZXJmYWNlIG5hbWUgaXMgZGVmaW5lZCBieQorICogIEludGVyZmFjZXMgaW4gQ2xhc3NEZWNsYXJhdGlvbiAoSkxTMiA4LjEpLiBUeXBlIG5hbWVzIG11c3QgYmUgc3BlY2lmaWVkIGFzIHRoZXkgd291bGQKKyAqICBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiAiQ2xvbmVhYmxlIiwgImphdmEuaW8uU2VyaWFsaXphYmxlIi4KKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQKKyAqLworcHVibGljIHZvaWQgYWRkU3VwZXJJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisvKioKKyAqIFRoZSA8Y29kZT5JRE9NVHlwZTwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB0eXBlLiBUaGUgbmFtZSBvZiBhIGNsYXNzIGlzIGRlZmluZWQgYnkgCisgKiBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSk7IHRoZSBuYW1lIG9mIGFuIGludGVyZmFjZSBpcyBkZWZpbmVkIGJ5CisgKiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAoSkxTMiA5LjEpLgorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHR5cGUncyBzdXBlcmNsYXNzLiBUaGUgc3ludGF4IGZvciBhIHN1cGVyY2xhc3MgbmFtZQorICogaXMgc3BlY2lmaWVkIGJ5IFN1cGVyIGluIENsYXNzRGVjbGFyYXRpb24gKEpMUzIgOC4xKS4gVHlwZSBuYW1lcyBtdXN0IGJlCisgKiBzcGVjaWZpZWQgYXMgdGhleSB3b3VsZCBhcHBlYXIgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiAKKyAqIDxjb2RlPiJPYmplY3QiPC9jb2RlPiwgb3IgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+LgorICoKKyAqIEByZXR1cm4gdGhlIHN1cGVyY2xhc3MgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0eXBlIHJlcHJlc2VudHMKKyAqICAgYW4gaW50ZXJmYWNlIG9yIGlmIG5vIHN1cGVyY2xhc3MgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhpcyBjbGFzcworICovCitwdWJsaWMgU3RyaW5nIGdldFN1cGVyY2xhc3MoKTsKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyB0aGF0IHRoaXMgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsCisgKiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgbGlzdGVkIGluIHRoZSBzb3VyY2UsIG9yIGFuIGVtcHR5IGFycmF5CisgKiBpZiBubyBzdXBlcmludGVyZmFjZXMgYXJlIHByZXNlbnQuIFRoZSBzeW50YXggZm9yIGludGVyZmFjZSBuYW1lcyBpcworICogZGVmaW5lZCBieSBJbnRlcmZhY2VzIGluIENsYXNzRGVjbGFyYXRpb24gKEpMUzIgOC4xKS4gVHlwZSBuYW1lcyBhcHBlYXIKKyAqIGFzIHRoZXkgd291bGQgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiA8Y29kZT4iQ2xvbmVhYmxlIjwvY29kZT4sCisgKiBvciA8Y29kZT4iamF2YS5pby5TZXJpYWxpemFibGUiPC9jb2RlPi4KKyAqIDxwPgorICogRm9yIGNsYXNzZXMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuCisgKiBGb3IgaW50ZXJmYWNlcywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGV4dGVuZHMuCisgKiA8L3A+CisgKiAKKyAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlIG5hbWVzCisgKi8KK3B1YmxpYyBTdHJpbmdbXSBnZXRTdXBlckludGVyZmFjZXMoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIGNsYXNzLgorICoKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGNsYXNzZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGludGVyZmFjZXMKKyAqLworcHVibGljIGJvb2xlYW4gaXNDbGFzcygpOworLyoqCisgKiBTZXRzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlLiBJZiB0aGlzIHR5cGUgaXMKKyAqIGEgY2xhc3MsIGFuZCBpcyBjaGFuZ2VkIHRvIGFuIGludGVyZmFjZSwgdGhpcyB0eXBlJ3Mgc3VwZXJjbGFzcworICogYmVjb21lcyA8Y29kZT5udWxsPC9jb2RlPi4gV2hlbiBhIGNsYXNzIGJlY29tZXMgYW4gaW50ZXJmYWNlIG9yIGFuCisgKiBpbnRlcmZhY2UgYmVjb21lcyBhIGNsYXNzLCBzdXBlcmludGVyZmFjZXMgcmVtYWluIChhcyBwYXJ0IG9mIGFuCisgKiA8Y29kZT5pbXBsZW1lbnRzPC9jb2RlPiBjbGF1c2UgZm9yIGNsYXNzZXMsIG9yIGFuIDxjb2RlPmV4dGVuZHM8L2NvZGU+CisgKiBjbGF1c2UgZm9yIGludGVyZmFjZXMpLgorICoKKyAqIEBwYXJhbSBiIDxjb2RlPnRydWU8L2NvZGU+IGZvciBjbGFzc2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBpbnRlcmZhY2VzCisgKi8KK3B1YmxpYyB2b2lkIHNldENsYXNzKGJvb2xlYW4gYik7CisvKioKKyAqIFRoZSA8Y29kZT5JRE9NVHlwZTwvY29kZT4gcmVmaW5lbWVudCBvZiB0aGlzIDxjb2RlPklET01Ob2RlPC9jb2RlPgorICogbWV0aG9kIHNldHMgdGhlIG5hbWUgb2YgdGhpcyB0eXBlLiBUaGUgbmFtZSBvZiBhIGNsYXNzIGlzIGRlZmluZWQgYnkgCisgKiBDbGFzc0RlY2xhcmF0aW9uIChKTFMyIDguMSk7IHRoZSBuYW1lIG9mIGFuIGludGVyZmFjZSBpcyBkZWZpbmVkIGJ5CisgKiBJbnRlcmZhY2VEZWNsYXJhdGlvbiAoSkxTMiA5LjEpLgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZAorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworLyoqCisgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MuIEhhcyBubyBlZmZlY3QgaWYgdGhpcyB0eXBlCisgKiByZXByZXNlbnRzIGFuIGludGVyZmFjZS4gQSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGluZGljYXRlcyB0aGF0IG5vIAorICogc3VwZXJjbGFzcyBuYW1lIChleHRlbmRzIGNsYXVzZSkgc2hvdWxkIGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuCisgKiBUaGUgc3ludGF4IGZvciBhIHN1cGVyY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQgYnkgU3VwZXIgaW4gQ2xhc3NEZWNsYXJhdGlvbgorICogKEpMUzIgOC4xKS4gVHlwZSBuYW1lcyBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGV5IHdvdWxkIGFwcGVhciBpbiBzb3VyY2UgY29kZS4KKyAqIEZvciBleGFtcGxlOiA8Y29kZT4iT2JqZWN0IjwvY29kZT4sIG9yIDxjb2RlPiJqYXZhLmlvLkZpbGUiPC9jb2RlPi4KKyAqCisgKiBAcGFyYW0gc3VwZXJjbGFzc05hbWUgdGhlIHN1cGVyY2xhc3MgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0eXBlCisgKiAgIHNob3VsZCBoYXZlIHRvIG5vIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHN1cGVyY2xhc3MKKyAqLworcHVibGljIHZvaWQgc2V0U3VwZXJjbGFzcyhTdHJpbmcgc3VwZXJjbGFzc05hbWUpOworLyoqCisgKiBTZXRzIHRoZSBuYW1lcyBvZiBpbnRlcmZhY2VzIHRoYXQgdGhpcyB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcywKKyAqIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSB0byBiZSBsaXN0ZWQgaW4gdGhlIHNvdXJjZS4gQW4gZW1wdHkgYXJyYXkKKyAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhhdCBubyBzdXBlcmludGVyZmFjZXMgYXJlIHByZXNlbnQuIFRoZSBzeW50YXggZm9yCisgKiBpbnRlcmZhY2UgbmFtZXMgaXMgZGVmaW5lZCBieSBJbnRlcmZhY2VzIGluIENsYXNzRGVjbGFyYXRpb24gKEpMUzIgOC4xKS4KKyAqIFR5cGUgbmFtZXMgYXBwZWFyIGFzIHRoZXkgd291bGQgaW4gc291cmNlIGNvZGUuIEZvciBleGFtcGxlOiAKKyAqIDxjb2RlPiJDbG9uZWFibGUiPC9jb2RlPiwgb3IgPGNvZGU+ImphdmEuaW8uU2VyaWFsaXphYmxlIjwvY29kZT4uCisgKiA8cD4KKyAqIEZvciBjbGFzc2VzLCB0aGlzIG1ldGhvZCBzZXRzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLgorICogRm9yIGludGVyZmFjZXMsIHRoaXMgbWV0aG9kIHNldHMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGludGVyZmFjZSBleHRlbmRzLgorICogPC9wPgorICogCisgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZXMgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlIG5hbWVzCisgKi8KK3B1YmxpYyB2b2lkIHNldFN1cGVySW50ZXJmYWNlcyhTdHJpbmdbXSBpbnRlcmZhY2VOYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL3BhY2thZ2UuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTY3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1Byb3ZpZGVzIGEgc3VwcG9ydCBmb3IgamF2YSBkb2N1bWVudCBtYW5pcHVsYXRpb24KK3Rocm91Z2ggdGhlIEpET00gbW9kZWwuCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgc3VwcG9ydCBmb3IgamF2YSBkb2N1bWVudCBtYW5pcHVsYXRpb24gdGhyb3VnaHQKK3RoZSBKRE9NIG1vZGVsLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvcGFja2FnZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjAzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjczIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitUaGUgSmF2YSBtb2RlbCBpcyB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBtb2RlbCB0aGUKK29iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYnVpbGRpbmcgYSBKYXZhIHByb2dyYW0uCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorCis8cD48YnI+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIG1vZGVsIGNsYXNzZXMsIHdoaWNoIGltcGxlbWVudCBKYXZhCitzcGVjaWZpYyBiZWhhdmlvdXIgZm9yIHJlc291cmNlcyBhbmQgZnVydGhlciBkZWNvbXBvc2UgamF2YSByZXNvdXJjZXMgaW50bworbW9kZWwgZWxlbWVudHMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0J5dGVDb2RlVmlzaXRvckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQnl0ZUNvZGVWaXNpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzlhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0J5dGVDb2RlVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEyODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogQWRhcHRlciB0aGF0IGltcGxlbWVudHMgdGhlIElCeXRlY29kZVZpc2l0b3IuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8KKyAqIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgQnl0ZUNvZGVWaXNpdG9yQWRhcHRlciBpbXBsZW1lbnRzIElCeXRlY29kZVZpc2l0b3IgeworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWFsb2FkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYWFsb2FkKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWFzdG9yZShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fhc3RvcmUoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hY29uc3RfbnVsbChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fjb25zdF9udWxsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWxvYWRfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fsb2FkXzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hbG9hZF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYWxvYWRfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Fsb2FkXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hbG9hZF8yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fsb2FkXzMoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYWxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FuZXdhcnJheShpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9hbmV3YXJyYXkoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXJldHVybihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FycmF5bGVuZ3RoKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXJyYXlsZW5ndGgoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hc3RvcmVfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FzdG9yZV8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hc3RvcmVfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FzdG9yZV8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXN0b3JlXzIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hc3RvcmVfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FzdG9yZV8zKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXN0b3JlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2F0aHJvdyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2F0aHJvdyhpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2JhbG9hZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2JhbG9hZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Jhc3RvcmUoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9iYXN0b3JlKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYmlwdXNoKGludCwgYnl0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYmlwdXNoKGludCBwYywgYnl0ZSBfYnl0ZSkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfY2Fsb2FkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfY2Fsb2FkKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfY2FzdG9yZShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Nhc3RvcmUoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19jaGVja2Nhc3QoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfY2hlY2tjYXN0KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZDJmKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZDJmKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZDJpKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZDJpKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZDJsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZDJsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGFkZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RhZGQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kYWxvYWQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGFzdG9yZShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RjbXBnKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGNtcGcoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kY21wbChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RjbXBsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGNvbnN0XzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kY29uc3RfMChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rjb25zdF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGNvbnN0XzEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kZGl2KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGRpdihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rsb2FkXzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kbG9hZF8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGxvYWRfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Rsb2FkXzEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kbG9hZF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGxvYWRfMihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rsb2FkXzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kbG9hZF8zKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGxvYWQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Rsb2FkKGludCBwYywgaW50IGluZGV4KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kbXVsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZG11bChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RuZWcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kbmVnKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RyZW0oaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHJldHVybihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RzdG9yZV8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHN0b3JlXzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kc3RvcmVfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RzdG9yZV8xKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHN0b3JlXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kc3RvcmVfMihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RzdG9yZV8zKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHN0b3JlXzMoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kc3RvcmUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RzdG9yZShpbnQgcGMsIGludCBpbmRleCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHN1YihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RzdWIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXBfeDEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXBfeDEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXBfeDIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXBfeDIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXAyX3gxKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHVwMl94MShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2R1cDJfeDIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXAyX3gyKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHVwMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2R1cDIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mMmQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mMmQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mMmkoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mMmkoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mMmwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mMmwoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mYWRkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmFkZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZhbG9hZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZhbG9hZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zhc3RvcmUoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mYXN0b3JlKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmNtcGcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mY21wZyhpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZjbXBsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmNtcGwoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mY29uc3RfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zjb25zdF8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmNvbnN0XzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mY29uc3RfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zjb25zdF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmNvbnN0XzIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mZGl2KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmRpdihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zsb2FkXzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mbG9hZF8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmxvYWRfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zsb2FkXzEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mbG9hZF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmxvYWRfMihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zsb2FkXzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mbG9hZF8zKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmxvYWQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zsb2FkKGludCBwYywgaW50IGluZGV4KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mbXVsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZm11bChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZuZWcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mbmVnKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZnJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZyZW0oaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZnJldHVybihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZzdG9yZV8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZnN0b3JlXzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mc3RvcmVfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZzdG9yZV8xKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZnN0b3JlXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mc3RvcmVfMihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZzdG9yZV8zKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZnN0b3JlXzMoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mc3RvcmUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZzdG9yZShpbnQgcGMsIGludCBpbmRleCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZnN1YihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZzdWIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19nZXRmaWVsZChpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9nZXRmaWVsZChpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2dldHN0YXRpYyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9nZXRzdGF0aWMoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRGaWVsZHJlZikgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZ290b193KGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9nb3RvX3coaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19nb3RvKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9nb3RvKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJiKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJiKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJjKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJjKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJkKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJmKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJmKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJzKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJzKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWFkZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lhZGQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pYWxvYWQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pYW5kKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWFuZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lhc3RvcmUoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pYXN0b3JlKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0XzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pY29uc3RfMChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ljb25zdF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0XzEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pY29uc3RfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ljb25zdF8yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0XzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pY29uc3RfMyhpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ljb25zdF80KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0XzQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pY29uc3RfNShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ljb25zdF81KGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0X20xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0X20xKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWRpdihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lkaXYoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9hY21wZXEoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2FjbXBlcShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2FjbXBuZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfYWNtcG5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZfaWNtcGVxKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZl9pY21wZXEoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9pY21wZ2UoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2ljbXBnZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2ljbXBndChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfaWNtcGd0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZfaWNtcGxlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZl9pY21wbGUoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9pY21wbHQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2ljbXBsdChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2ljbXBuZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfaWNtcG5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZlcShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZlcShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmZ2UoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmZ2UoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZmd0KGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZmd0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZsZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZsZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmbHQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmbHQoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZm5lKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZm5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZub25udWxsKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZm5vbm51bGwoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZm51bGwoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmbnVsbChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lpbmMoaW50LCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWluYyhpbnQgcGMsIGludCBpbmRleCwgaW50IF9jb25zdCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWxvYWRfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lsb2FkXzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbG9hZF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWxvYWRfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lsb2FkXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbG9hZF8yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lsb2FkXzMoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ltdWwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbXVsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW5lZyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2luZWcoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbnN0YW5jZW9mKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2luc3RhbmNlb2YoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbnZva2VpbnRlcmZhY2UoaW50LCBpbnQsIGJ5dGUsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW52b2tlaW50ZXJmYWNlKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJYnl0ZSBuYXJncywKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50SW50ZXJmYWNlTWV0aG9kcmVmKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbnZva2VzcGVjaWFsKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2ludm9rZXNwZWNpYWwoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRNZXRob2RyZWYpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZXN0YXRpYyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbnZva2VzdGF0aWMoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRNZXRob2RyZWYpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZXZpcnR1YWwoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW52b2tldmlydHVhbCgKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudE1ldGhvZHJlZikgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW9yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW9yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lyZW0oaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXJldHVybihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzaGwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc2hsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXNocihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzaHIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pc3RvcmVfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzdG9yZV8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc3RvcmVfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzdG9yZV8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXN0b3JlXzIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pc3RvcmVfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzdG9yZV8zKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXN0b3JlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzdWIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc3ViKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXVzaHIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pdXNocihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2l4b3IoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9peG9yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfanNyX3coaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2pzcl93KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfanNyKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9qc3IoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sMmQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sMmQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sMmYoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sMmYoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sMmkoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sMmkoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sYWRkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGFkZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xhbG9hZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xhbG9hZChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xhbmQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sYW5kKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGFzdG9yZShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xhc3RvcmUoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sY21wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGNtcChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xjb25zdF8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGNvbnN0XzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sY29uc3RfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xjb25zdF8xKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGRjX3coaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGRjX3coaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGRjKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2xkYyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sZGMyX3coaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGRjMl93KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xkaXYoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sZGl2KGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGxvYWRfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xsb2FkXzAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sbG9hZF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGxvYWRfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xsb2FkXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sbG9hZF8yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xsb2FkXzMoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xtdWwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sbXVsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbG5lZyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xuZWcoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sb29rdXBzd2l0Y2goaW50LCBpbnQsIGludCwgaW50W11bXSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbG9va3Vwc3dpdGNoKAorCQlpbnQgcGMsCisJCWludCBkZWZhdWx0b2Zmc2V0LAorCQlpbnQgbnBhaXJzLAorCQlpbnRbXVtdIG9mZnNldF9wYWlycykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbG9yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbG9yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xyZW0oaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19scmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHJldHVybihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xzaGwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc2hsKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHNocihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzaHIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sc3RvcmVfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzdG9yZV8wKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc3RvcmVfMShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xzdG9yZV8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHN0b3JlXzIoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sc3RvcmVfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzdG9yZV8zKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHN0b3JlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xzdWIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc3ViKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHVzaHIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sdXNocihpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2x4b3IoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9seG9yKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbW9uaXRvcmVudGVyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbW9uaXRvcmVudGVyKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbW9uaXRvcmV4aXQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9tb25pdG9yZXhpdChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX211bHRpYW5ld2FycmF5KGludCwgaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbXVsdGlhbmV3YXJyYXkoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlpbnQgZGltZW5zaW9ucywKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50Q2xhc3MpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX25ldyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9uZXcoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19uZXdhcnJheShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbmV3YXJyYXkoaW50IHBjLCBpbnQgYXR5cGUpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX25vcChpbnQpCisJICovCisJcHVibGljIHZvaWQgX25vcChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3BvcChpbnQpCisJICovCisJcHVibGljIHZvaWQgX3BvcChpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3BvcDIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9wb3AyKGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfcHV0ZmllbGQoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcHV0ZmllbGQoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19wdXRzdGF0aWMoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcHV0c3RhdGljKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3JldChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcmV0KGludCBwYywgaW50IGluZGV4KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19yZXR1cm4oaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9yZXR1cm4oaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19zYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9zYWxvYWQoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19zYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc2FzdG9yZShpbnQgcGMpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3NpcHVzaChpbnQsIHNob3J0KQorCSAqLworCXB1YmxpYyB2b2lkIF9zaXB1c2goaW50IHBjLCBzaG9ydCB2YWx1ZSkgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfc3dhcChpbnQpCisJICovCisJcHVibGljIHZvaWQgX3N3YXAoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI190YWJsZXN3aXRjaChpbnQsIGludCwgaW50LCBpbnQsIGludFtdKQorCSAqLworCXB1YmxpYyB2b2lkIF90YWJsZXN3aXRjaCgKKwkJaW50IHBjLAorCQlpbnQgZGVmYXVsdG9mZnNldCwKKwkJaW50IGxvdywKKwkJaW50IGhpZ2gsCisJCWludFtdIGp1bXBfb2Zmc2V0cykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfd2lkZShpbnQsIGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX3dpZGUoaW50IHBjLCBpbnQgaWluY29wY29kZSwgaW50IGluZGV4LCBpbnQgX2NvbnN0KSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI193aWRlKGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX3dpZGUoaW50IHBjLCBpbnQgb3Bjb2RlLCBpbnQgaW5kZXgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2JyZWFrcG9pbnQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9icmVha3BvaW50KGludCBwYykgeworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW1wZGVwMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ltcGRlcDEoaW50IHBjKSB7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbXBkZXAyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW1wZGVwMihpbnQgcGMpIHsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGb3JtYXRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGb3JtYXRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWMyMmNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biBieSBhIGNsYXNzIGZpbGUgcmVhZGVyIHdoZW4gZW5jb3VudGVyaW5nIGEgZXJyb3IgaW4gZGVjb2RpbmcKKyAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhIC5jbGFzcyBmaWxlLgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTUFMRk9STUVEX1VURjggPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1RSVU5DQVRFRF9JTlBVVCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT09fTUFOWV9CWVRFUyA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9BUkdVTUVOVFNfRk9SX0lOVk9LRUlOVEVSRkFDRSA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9CWVRFQ09ERSA9IDY7CisJCisJcHJpdmF0ZSBpbnQgZXJyb3JJRDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgQ2xhc3NGb3JtYXRFeGNlcHRpb24uCisJICovCisJcHVibGljIENsYXNzRm9ybWF0RXhjZXB0aW9uKGludCBlcnJvcklEKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZXJyb3JJRCA9IGVycm9ySUQ7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIENsYXNzRm9ybWF0RXhjZXB0aW9uLgorCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uCisJICovCisJcHVibGljIENsYXNzRm9ybWF0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTBlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYXR0cmlidXRlIG5hbWVzIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorICogCisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cyB7CisJY2hhcltdIFNZTlRIRVRJQyA9IG5ldyBjaGFyW10geydTJywgJ3knLCAnbicsICd0JywgJ2gnLCAnZScsICd0JywgJ2knLCAnYyd9OworCWNoYXJbXSBDT05TVEFOVF9WQUxVRSA9IG5ldyBjaGFyW10geydDJywgJ28nLCAnbicsICdzJywgJ3QnLCAnYScsICduJywgJ3QnLCAnVicsICdhJywgJ2wnLCAndScsICdlJ307CisJY2hhcltdIExJTkVfTlVNQkVSPSBuZXcgY2hhcltdIHsnTCcsICdpJywgJ24nLCAnZScsICdOJywgJ3UnLCAnbScsICdiJywgJ2UnLCAncicsICdUJywgJ2EnLCAnYicsICdsJywgJ2UnfTsKKwljaGFyW10gTE9DQUxfVkFSSUFCTEUgPSBuZXcgY2hhcltdIHsnTCcsICdvJywgJ2MnLCAnYScsICdsJywgJ1YnLCAnYScsICdyJywgJ2knLCAnYScsICdiJywgJ2wnLCAnZScsICdUJywgJ2EnLCAnYicsICdsJywgJ2UnfTsKKwljaGFyW10gSU5ORVJfQ0xBU1NFUyA9IG5ldyBjaGFyW10geydJJywgJ24nLCAnbicsICdlJywgJ3InLCAnQycsICdsJywgJ2EnLCAncycsICdzJywgJ2UnLCAncyd9OworCWNoYXJbXSBDT0RFID0gbmV3IGNoYXJbXSB7J0MnLCAnbycsICdkJywgJ2UnfTsKKwljaGFyW10gRVhDRVBUSU9OUyA9IG5ldyBjaGFyW10geydFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbicsICdzJ307CisJY2hhcltdIFNPVVJDRSA9IG5ldyBjaGFyW10geydTJywgJ28nLCAndScsICdyJywgJ2MnLCAnZScsICdGJywgJ2knLCAnbCcsICdlJ307CisJY2hhcltdIERFUFJFQ0FURUQgPSBuZXcgY2hhcltdIHsnRCcsICdlJywgJ3AnLCAncicsICdlJywgJ2MnLCAnYScsICd0JywgJ2UnLCAnZCd9OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQnl0ZWNvZGVWaXNpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lCeXRlY29kZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njk3YjkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQnl0ZWNvZGVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBKYXZhIG9wY29kZXMgdmlzaXRvci4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byB3YWxrIHRoZSBvcGNvZGVzCisgKiBvZiBhIElDb2RlQXR0cmlidXRlLgorICogCisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUJ5dGVjb2RlVmlzaXRvciB7CisKKwl2b2lkIF9hYWxvYWQoaW50IHBjKTsKKwl2b2lkIF9hYXN0b3JlKGludCBwYyk7CisJdm9pZCBfYWNvbnN0X251bGwoaW50IHBjKTsKKwl2b2lkIF9hbG9hZChpbnQgcGMsIGludCBpbmRleCk7CisJdm9pZCBfYWxvYWRfMChpbnQgcGMpOworCXZvaWQgX2Fsb2FkXzEoaW50IHBjKTsKKwl2b2lkIF9hbG9hZF8yKGludCBwYyk7CisJdm9pZCBfYWxvYWRfMyhpbnQgcGMpOworCXZvaWQgX2FuZXdhcnJheSgKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKTsKKwl2b2lkIF9hcmV0dXJuKGludCBwYyk7CisJdm9pZCBfYXJyYXlsZW5ndGgoaW50IHBjKTsKKwl2b2lkIF9hc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX2FzdG9yZV8wKGludCBwYyk7CisJdm9pZCBfYXN0b3JlXzEoaW50IHBjKTsKKwl2b2lkIF9hc3RvcmVfMihpbnQgcGMpOworCXZvaWQgX2FzdG9yZV8zKGludCBwYyk7CisJdm9pZCBfYXRocm93KGludCBwYyk7CisJdm9pZCBfYmFsb2FkKGludCBwYyk7CisJdm9pZCBfYmFzdG9yZShpbnQgcGMpOworCXZvaWQgX2JpcHVzaChpbnQgcGMsIGJ5dGUgX2J5dGUpOworCXZvaWQgX2NhbG9hZChpbnQgcGMpOworCXZvaWQgX2Nhc3RvcmUoaW50IHBjKTsKKwl2b2lkIF9jaGVja2Nhc3QoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcyk7CisJdm9pZCBfZDJmKGludCBwYyk7CisJdm9pZCBfZDJpKGludCBwYyk7CisJdm9pZCBfZDJsKGludCBwYyk7CisJdm9pZCBfZGFkZChpbnQgcGMpOworCXZvaWQgX2RhbG9hZChpbnQgcGMpOworCXZvaWQgX2Rhc3RvcmUoaW50IHBjKTsKKwl2b2lkIF9kY21wZyhpbnQgcGMpOworCXZvaWQgX2RjbXBsKGludCBwYyk7CisJdm9pZCBfZGNvbnN0XzAoaW50IHBjKTsKKwl2b2lkIF9kY29uc3RfMShpbnQgcGMpOworCXZvaWQgX2RkaXYoaW50IHBjKTsKKwl2b2lkIF9kbG9hZChpbnQgcGMsIGludCBpbmRleCk7CisJdm9pZCBfZGxvYWRfMChpbnQgcGMpOworCXZvaWQgX2Rsb2FkXzEoaW50IHBjKTsKKwl2b2lkIF9kbG9hZF8yKGludCBwYyk7CisJdm9pZCBfZGxvYWRfMyhpbnQgcGMpOworCXZvaWQgX2RtdWwoaW50IHBjKTsKKwl2b2lkIF9kbmVnKGludCBwYyk7CisJdm9pZCBfZHJlbShpbnQgcGMpOworCXZvaWQgX2RyZXR1cm4oaW50IHBjKTsKKwl2b2lkIF9kc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX2RzdG9yZV8wKGludCBwYyk7CisJdm9pZCBfZHN0b3JlXzEoaW50IHBjKTsKKwl2b2lkIF9kc3RvcmVfMihpbnQgcGMpOworCXZvaWQgX2RzdG9yZV8zKGludCBwYyk7CisJdm9pZCBfZHN1YihpbnQgcGMpOworCXZvaWQgX2R1cChpbnQgcGMpOworCXZvaWQgX2R1cF94MShpbnQgcGMpOworCXZvaWQgX2R1cF94MihpbnQgcGMpOworCXZvaWQgX2R1cDIoaW50IHBjKTsKKwl2b2lkIF9kdXAyX3gxKGludCBwYyk7CisJdm9pZCBfZHVwMl94MihpbnQgcGMpOworCXZvaWQgX2YyZChpbnQgcGMpOworCXZvaWQgX2YyaShpbnQgcGMpOworCXZvaWQgX2YybChpbnQgcGMpOworCXZvaWQgX2ZhZGQoaW50IHBjKTsKKwl2b2lkIF9mYWxvYWQoaW50IHBjKTsKKwl2b2lkIF9mYXN0b3JlKGludCBwYyk7CisJdm9pZCBfZmNtcGcoaW50IHBjKTsKKwl2b2lkIF9mY21wbChpbnQgcGMpOworCXZvaWQgX2Zjb25zdF8wKGludCBwYyk7CisJdm9pZCBfZmNvbnN0XzEoaW50IHBjKTsKKwl2b2lkIF9mY29uc3RfMihpbnQgcGMpOworCXZvaWQgX2ZkaXYoaW50IHBjKTsKKwl2b2lkIF9mbG9hZChpbnQgcGMsIGludCBpbmRleCk7CisJdm9pZCBfZmxvYWRfMChpbnQgcGMpOworCXZvaWQgX2Zsb2FkXzEoaW50IHBjKTsKKwl2b2lkIF9mbG9hZF8yKGludCBwYyk7CisJdm9pZCBfZmxvYWRfMyhpbnQgcGMpOworCXZvaWQgX2ZtdWwoaW50IHBjKTsKKwl2b2lkIF9mbmVnKGludCBwYyk7CisJdm9pZCBfZnJlbShpbnQgcGMpOworCXZvaWQgX2ZyZXR1cm4oaW50IHBjKTsKKwl2b2lkIF9mc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX2ZzdG9yZV8wKGludCBwYyk7CisJdm9pZCBfZnN0b3JlXzEoaW50IHBjKTsKKwl2b2lkIF9mc3RvcmVfMihpbnQgcGMpOworCXZvaWQgX2ZzdG9yZV8zKGludCBwYyk7CisJdm9pZCBfZnN1YihpbnQgcGMpOworCXZvaWQgX2dldGZpZWxkKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpOworCXZvaWQgX2dldHN0YXRpYygKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKTsKKwl2b2lkIF9nb3RvKGludCBwYywgaW50IGJyYW5jaE9mZnNldCk7CisJdm9pZCBfZ290b193KGludCBwYywgaW50IGJyYW5jaE9mZnNldCk7CisJdm9pZCBfaTJiKGludCBwYyk7CisJdm9pZCBfaTJjKGludCBwYyk7CisJdm9pZCBfaTJkKGludCBwYyk7CisJdm9pZCBfaTJmKGludCBwYyk7CisJdm9pZCBfaTJsKGludCBwYyk7CisJdm9pZCBfaTJzKGludCBwYyk7CisJdm9pZCBfaWFkZChpbnQgcGMpOworCXZvaWQgX2lhbG9hZChpbnQgcGMpOworCXZvaWQgX2lhbmQoaW50IHBjKTsKKwl2b2lkIF9pYXN0b3JlKGludCBwYyk7CisJdm9pZCBfaWNvbnN0X20xKGludCBwYyk7CisJdm9pZCBfaWNvbnN0XzAoaW50IHBjKTsKKwl2b2lkIF9pY29uc3RfMShpbnQgcGMpOworCXZvaWQgX2ljb25zdF8yKGludCBwYyk7CisJdm9pZCBfaWNvbnN0XzMoaW50IHBjKTsKKwl2b2lkIF9pY29uc3RfNChpbnQgcGMpOworCXZvaWQgX2ljb25zdF81KGludCBwYyk7CisJdm9pZCBfaWRpdihpbnQgcGMpOworCXZvaWQgX2lmX2FjbXBlcShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2FjbXBuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBlcShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBsdChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBnZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBndChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmX2ljbXBsZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmZXEoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KTsKKwl2b2lkIF9pZm5lKGludCBwYywgaW50IGJyYW5jaE9mZnNldCk7CisJdm9pZCBfaWZsdChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmZ2UoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KTsKKwl2b2lkIF9pZmd0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCk7CisJdm9pZCBfaWZsZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmbm9ubnVsbChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lmbnVsbChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2lpbmMoaW50IHBjLCBpbnQgaW5kZXgsIGludCBfY29uc3QpOworCXZvaWQgX2lsb2FkKGludCBwYywgaW50IGluZGV4KTsKKwl2b2lkIF9pbG9hZF8wKGludCBwYyk7CisJdm9pZCBfaWxvYWRfMShpbnQgcGMpOworCXZvaWQgX2lsb2FkXzIoaW50IHBjKTsKKwl2b2lkIF9pbG9hZF8zKGludCBwYyk7CisJdm9pZCBfaW11bChpbnQgcGMpOworCXZvaWQgX2luZWcoaW50IHBjKTsKKwl2b2lkIF9pbnN0YW5jZW9mKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50Q2xhc3MpOworCXZvaWQgX2ludm9rZWludGVyZmFjZSgKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCWJ5dGUgbmFyZ3MsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEludGVyZmFjZU1ldGhvZHJlZik7CisJdm9pZCBfaW52b2tlc3BlY2lhbCgKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudE1ldGhvZHJlZik7CisJdm9pZCBfaW52b2tlc3RhdGljKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKTsKKwl2b2lkIF9pbnZva2V2aXJ0dWFsKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKTsKKwl2b2lkIF9pb3IoaW50IHBjKTsKKwl2b2lkIF9pcmVtKGludCBwYyk7CisJdm9pZCBfaXJldHVybihpbnQgcGMpOworCXZvaWQgX2lzaGwoaW50IHBjKTsKKwl2b2lkIF9pc2hyKGludCBwYyk7CisJdm9pZCBfaXN0b3JlKGludCBwYywgaW50IGluZGV4KTsKKwl2b2lkIF9pc3RvcmVfMChpbnQgcGMpOworCXZvaWQgX2lzdG9yZV8xKGludCBwYyk7CisJdm9pZCBfaXN0b3JlXzIoaW50IHBjKTsKKwl2b2lkIF9pc3RvcmVfMyhpbnQgcGMpOworCXZvaWQgX2lzdWIoaW50IHBjKTsKKwl2b2lkIF9pdXNocihpbnQgcGMpOworCXZvaWQgX2l4b3IoaW50IHBjKTsKKwl2b2lkIF9qc3IoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KTsKKwl2b2lkIF9qc3JfdyhpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpOworCXZvaWQgX2wyZChpbnQgcGMpOworCXZvaWQgX2wyZihpbnQgcGMpOworCXZvaWQgX2wyaShpbnQgcGMpOworCXZvaWQgX2xhZGQoaW50IHBjKTsKKwl2b2lkIF9sYWxvYWQoaW50IHBjKTsKKwl2b2lkIF9sYW5kKGludCBwYyk7CisJdm9pZCBfbGFzdG9yZShpbnQgcGMpOworCXZvaWQgX2xjbXAoaW50IHBjKTsKKwl2b2lkIF9sY29uc3RfMChpbnQgcGMpOworCXZvaWQgX2xjb25zdF8xKGludCBwYyk7CisJdm9pZCBfbGRjKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpOworCXZvaWQgX2xkY193KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpOworCXZvaWQgX2xkYzJfdyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KTsKKwl2b2lkIF9sZGl2KGludCBwYyk7CisJdm9pZCBfbGxvYWQoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX2xsb2FkXzAoaW50IHBjKTsKKwl2b2lkIF9sbG9hZF8xKGludCBwYyk7CisJdm9pZCBfbGxvYWRfMihpbnQgcGMpOworCXZvaWQgX2xsb2FkXzMoaW50IHBjKTsKKwl2b2lkIF9sbXVsKGludCBwYyk7CisJdm9pZCBfbG5lZyhpbnQgcGMpOworCXZvaWQgX2xvb2t1cHN3aXRjaCgKKwkJaW50IHBjLAorCQlpbnQgZGVmYXVsdG9mZnNldCwKKwkJaW50IG5wYWlycywKKwkJaW50W11bXSBvZmZzZXRfcGFpcnMpOworCXZvaWQgX2xvcihpbnQgcGMpOworCXZvaWQgX2xyZW0oaW50IHBjKTsKKwl2b2lkIF9scmV0dXJuKGludCBwYyk7CisJdm9pZCBfbHNobChpbnQgcGMpOworCXZvaWQgX2xzaHIoaW50IHBjKTsKKwl2b2lkIF9sc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX2xzdG9yZV8wKGludCBwYyk7CisJdm9pZCBfbHN0b3JlXzEoaW50IHBjKTsKKwl2b2lkIF9sc3RvcmVfMihpbnQgcGMpOworCXZvaWQgX2xzdG9yZV8zKGludCBwYyk7CisJdm9pZCBfbHN1YihpbnQgcGMpOworCXZvaWQgX2x1c2hyKGludCBwYyk7CisJdm9pZCBfbHhvcihpbnQgcGMpOworCXZvaWQgX21vbml0b3JlbnRlcihpbnQgcGMpOworCXZvaWQgX21vbml0b3JleGl0KGludCBwYyk7CisJdm9pZCBfbXVsdGlhbmV3YXJyYXkoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlpbnQgZGltZW5zaW9ucywKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50Q2xhc3MpOworCXZvaWQgX25ldygKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKTsKKwl2b2lkIF9uZXdhcnJheShpbnQgcGMsIGludCBhdHlwZSk7CisJdm9pZCBfbm9wKGludCBwYyk7CisJdm9pZCBfcG9wKGludCBwYyk7CisJdm9pZCBfcG9wMihpbnQgcGMpOworCXZvaWQgX3B1dGZpZWxkKAorCQlpbnQgcGMsCisJCWludCBpbmRleCwKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpOworCXZvaWQgX3B1dHN0YXRpYygKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKTsKKwl2b2lkIF9yZXQoaW50IHBjLCBpbnQgaW5kZXgpOworCXZvaWQgX3JldHVybihpbnQgcGMpOworCXZvaWQgX3NhbG9hZChpbnQgcGMpOworCXZvaWQgX3Nhc3RvcmUoaW50IHBjKTsKKwl2b2lkIF9zaXB1c2goaW50IHBjLCBzaG9ydCB2YWx1ZSk7CisJdm9pZCBfc3dhcChpbnQgcGMpOworCXZvaWQgX3RhYmxlc3dpdGNoKAorCQlpbnQgcGMsIAorCQlpbnQgZGVmYXVsdG9mZnNldCwKKwkJaW50IGxvdywKKwkJaW50IGhpZ2gsCisJCWludFtdIGp1bXBfb2Zmc2V0cyk7CisJdm9pZCBfd2lkZSgKKwkJaW50IHBjLAorCQlpbnQgb3Bjb2RlLAorCQlpbnQgaW5kZXgpOworCXZvaWQgX3dpZGUoCisJCWludCBwYywKKwkJaW50IGlpbmNvcGNvZGUsCisJCWludCBpbmRleCwKKwkJaW50IF9jb25zdCk7CisJdm9pZCBfYnJlYWtwb2ludChpbnQgcGMpOworCXZvaWQgX2ltcGRlcDEoaW50IHBjKTsKKwl2b2lkIF9pbXBkZXAyKGludCBwYyk7CQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZ2VuZXJpYyBjbGFzcyBmaWxlIGF0dHJpYnV0ZS4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQKKyAqIGZvciBhbnkgbmV3IGF0dHJpYnV0ZS4KKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElDbGFzc0ZpbGVBdHRyaWJ1dGUgeworCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbCBhcyBzcGVjaWZpZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sCisJICovCisJaW50IGdldEF0dHJpYnV0ZU5hbWVJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBuYW1lIGFzIHNwZWNpZmllZAorCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlIG5hbWUKKwkgKi8KKwljaGFyW10gZ2V0QXR0cmlidXRlTmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBsZW5ndGggYXMgc3BlY2lmaWVkCisJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoCisJICovCisJbG9uZyBnZXRBdHRyaWJ1dGVMZW5ndGgoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlRGlzYXNzZW1ibGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViM2M2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgdG8gZGlzYXNzZW1ibGUKKyAqIElDbGFzc0ZpbGVSZWFkZXIgb250byBhIFN0cmluZyB1c2luZyB0aGUgcHJvcGVyIGxpbmUgc2VwYXJhdG9yLgorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNsYXNzRmlsZURpc2Fzc2VtYmxlciB7CisJCisJLyoqCisJICogVGhlIG1vZGUgaXMgdGhlIGRldGFpbGVkIG1vZGUgdG8gZGlzYXNzZW1ibGUgSUNsYXNzRmlsZVJlYWRlci4gSXQgcmV0dXJucyB0aGUgbWFnaWMKKwkgKiBudW1iZXJzLCB0aGUgdmVyc2lvbiBudW1iZXJzIGFuZCBmaWVsZCBhbmQgbWV0aG9kIGRlc2NyaXB0b3JzLgorCSAqLworCWludCBERVRBSUxFRCA9IDE7CisJCisJLyoqCisJICogVGhlIG1vZGUgaXMgdGhlIGRlZmF1bHQgbW9kZSB0byBkaXNhc3NlbWJsZSBJQ2xhc3NGaWxlUmVhZGVyLgorCSAqLworCWludCBERUZBVUxUICA9IDI7CisJLyoqCisJICogQW5zd2VycyBiYWNrIHRoZSBkaXNhc3NlbWJsZWQgc3RyaW5nIG9mIHRoZSBJQ2xhc3NGaWxlUmVhZGVyIHVzaW5nIHRoZSBkZWZhdWx0CisJICogbW9kZS4KKwkgKiBUaGlzIGlzIGFuIG91dHB1dCBxdWl0ZSBzaW1pbGFyIHRvIHRoZSBqYXZhcCB0b29sLCB1c2luZyBERUZBVUxUIG1vZGUuCisJICogCisJICogQHBhcmFtIGNsYXNzRmlsZVJlYWRlciBUaGUgY2xhc3NGaWxlUmVhZGVyIHRvIGJlIGRpc2Fzc2VtYmxlZAorCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuCisJICogCisJICogQHJldHVybiB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgSUNsYXNzRmlsZVJlYWRlciB1c2luZyB0aGUgZGVmYXVsdCBtb2RlLgorCSAqLworCVN0cmluZyBkaXNhc3NlbWJsZShJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IpOworCisJLyoqCisJICogQW5zd2VycyBiYWNrIHRoZSBkaXNhc3NlbWJsZWQgc3RyaW5nIG9mIHRoZSBJQ2xhc3NGaWxlUmVhZGVyIGFjY29yZGluZyB0byB0aGUKKwkgKiBtb2RlLgorCSAqIFRoaXMgaXMgYW4gb3V0cHV0IHF1aXRlIHNpbWlsYXIgdG8gdGhlIGphdmFwIHRvb2wuCisJICogCisJICogQHBhcmFtIGNsYXNzRmlsZVJlYWRlciBUaGUgY2xhc3NGaWxlUmVhZGVyIHRvIGJlIGRpc2Fzc2VtYmxlZAorCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuCisJICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgdXNlZCB0byBkaXNhc3NlbWJsZSB0aGUgSUNsYXNzRmlsZVJlYWRlcgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBtb2RlCisJICovCisJU3RyaW5nIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IG1vZGUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTEzNmIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSAuY2xhc3MgZmlsZS4gVGhpcyBjbGFzcyByZWlmaWVzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSAuY2xhc3MKKyAqIGZpbGUgZm9sbG93aW5nIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisgKiAgCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ2xhc3NGaWxlUmVhZGVyIHsKKwkvKioKKwkgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIHJlYWQgY29tcGxldGVseSBlYWNoIHBhcnQgb2YgYSAuY2xhc3MgZmlsZS4KKwkgKi8KKwlpbnQgQUxMIAkJCQkJPSAweEZGRkY7CisJCisJLyoqCisJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIG9ubHkgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcyBvZiBhIC5jbGFzcyBmaWxlLgorCSAqLworCWludCBDT05TVEFOVF9QT09MIAkJCT0gMHgwMDAxOworCisJLyoqCisJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMgYW5kIAorCSAqIHRoZSBtZXRob2QgaW5mb3Mgb2YgYSAuY2xhc3MgZmlsZS4KKwkgKi8KKwlpbnQgTUVUSE9EX0lORk9TIAkJCT0gMHgwMDAyICsgQ09OU1RBTlRfUE9PTDsKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZCAKKwkgKiB0aGUgZmllbGQgaW5mb3Mgb2YgYSAuY2xhc3MgZmlsZS4KKwkgKi8KKwlpbnQgRklFTERfSU5GT1MgCQkJPSAweDAwMDQgKyBDT05TVEFOVF9QT09MOworCisJLyoqCisJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMgYW5kIAorCSAqIHRoZSBzdXBlciBpbnRlcmZhY2UgbmFtZXMgb2YgYSAuY2xhc3MgZmlsZS4KKwkgKi8KKwlpbnQgU1VQRVJfSU5URVJGQUNFUyAJCT0gMHgwMDA4ICsgQ09OU1RBTlRfUE9PTDsKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFuZCAKKwkgKiB0aGUgYXR0cmlidXRlcyBvZiBhIC5jbGFzcyBmaWxlLgorCSAqLworCWludCBDTEFTU0ZJTEVfQVRUUklCVVRFUyAJPSAweDAwMTAgKyBDT05TVEFOVF9QT09MOworCisJLyoqCisJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSBtZXRob2QgYm9kaWVzLgorCSAqIEl0IGhhcyB0byBiZSB1c2VkIHdpdGggTUVUSE9EX0lORk9TLgorCSAqLworCWludCBNRVRIT0RfQk9ESUVTIAkJCT0gMHgwMDIwOworCisJLyoqCisJICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgdXNlZCB0byByZWFkIHRoZSB3aG9sZSBjb250ZW50cyBvZiB0aGUgLmNsYXNzIGZpbGUgZXhjZXB0IHRoZQorCSAqIG1ldGhvZCBib2RpZXMuCisJICovCisJaW50IEFMTF9CVVRfTUVUSE9EX0JPRElFUyAgID0gQUxMICYgfk1FVEhPRF9CT0RJRVM7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFjY2VzcyBmbGFnIG9mIHRoZSAuY2xhc3MgZmlsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGUgLmNsYXNzIGZpbGUKKwkgKi8KKwlpbnQgZ2V0QWNjZXNzRmxhZ3MoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgYXJyYXkgb2YgZmllbGQgaW5mb3Mgb2YgdGhlIC5jbGFzcyBmaWxlLCAKKwkgKiBhbiBlbXB0eSBhcnJheSBpZiBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZpZWxkIGluZm9zIG9mIHRoZSAuY2xhc3MgZmlsZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQorCSAqLworCUlGaWVsZEluZm9bXSBnZXRGaWVsZEluZm9zKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIC5jbGFzcyBmaWxlLAorCSAqIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUuIFRoZSBuYW1lcyBhcmUgcmV0dXJuZWQgYXMgZGVzY3JpYmVkIGluIHRoZSAKKwkgKiBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZXMgb2YgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIC5jbGFzcyBmaWxlLCBhbiBlbXB0eSBhcnJheSBpZiBub25lCisJICovCisJY2hhcltdW10gZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBpbmRleGVzIGluIHRoZSBjb25zdGFudCBwb29sIG9mIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgCisJICogYnkgdGhpcyAuY2xhc3MgZmlsZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbmRleGVzIGluIHRoZSBjb25zdGFudCBwb29sIG9mIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgCisJICogYnkgdGhpcyAuY2xhc3MgZmlsZSwgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQorCSAqLworCWludFtdIGdldEludGVyZmFjZUluZGV4ZXMoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBvZiB0aGlzIC5jbGFzcyBmaWxlLCBudWxsIGlmIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgb2YgdGhpcyAuY2xhc3MgZmlsZSwgbnVsbCBpZiBub25lCisJICovCisJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBnZXRJbm5lckNsYXNzZXNBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBhcnJheSBvZiBtZXRob2QgaW5mb3Mgb2YgdGhpcyAuY2xhc3MgZmlsZSwKKwkgKiBhbiBlbXB0eSBhcnJheSBpZiBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG1ldGhvZCBpbmZvcyBvZiB0aGlzIC5jbGFzcyBmaWxlLAorCSAqIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKwkgKi8KKwlJTWV0aG9kSW5mb1tdIGdldE1ldGhvZEluZm9zKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIC5jbGFzcyBmaWxlLgorCSAqIFRoZSBuYW1lIGlzIHJldHVybmVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqICAKKwkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgLmNsYXNzIGZpbGUKKwkgKi8KKwljaGFyW10gZ2V0Q2xhc3NOYW1lKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW5kZXggb2YgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wgCisJICogb2YgdGhlIC5jbGFzcyBmaWxlLgorCSAqICAKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgY29uc3RhbnQgcG9vbCAKKwkgKi8KKwlpbnQgZ2V0Q2xhc3NJbmRleCgpOworCQkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3Mgb2YgdGhpcyAuY2xhc3MgZmlsZS4KKwkgKiBUaGUgbmFtZSBpcyByZXR1cm5lZCBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIG51bGwgaWYgCisJICogZ2V0U3VwZXJjbGFzc0luZGV4KCkgaXMgemVyby4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIC5jbGFzcyBmaWxlLCBudWxsIGlmIGdldFN1cGVyY2xhc3NJbmRleCgpIGlzIHplcm8KKwkgKi8KKwljaGFyW10gZ2V0U3VwZXJjbGFzc05hbWUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBpbmRleCBvZiB0aGUgc3VwZXJjbGFzcyBuYW1lIGluIHRoZSBjb25zdGFudCBwb29sIAorCSAqIG9mIHRoZSAuY2xhc3MgZmlsZS4gQW5zd2VyIDAgaWYgdGhpcyAuY2xhc3MgZmlsZSByZXByZXNlbnRzIGphdmEubGFuZy5PYmplY3QuCisJICogIAorCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzdXBlcmNsYXNzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wgCisJICogb2YgdGhlIC5jbGFzcyBmaWxlLCAwIGlmIHRoaXMgLmNsYXNzIGZpbGUgcmVwcmVzZW50cyBqYXZhLmxhbmcuT2JqZWN0LgorCSAqLworCWludCBnZXRTdXBlcmNsYXNzSW5kZXgoKTsKKworCS8qKgorCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgLmNsYXNzIGZpbGUgcmVwcmVzZW50cyBhbiBjbGFzcywgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIC5jbGFzcyBmaWxlIHJlcHJlc2VudHMgYW4gY2xhc3MsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNDbGFzcygpOworCisJLyoqCisJICogQW5zd2VyIHRydWUgaWYgdGhpcyAuY2xhc3MgZmlsZSByZXByZXNlbnRzIGFuIGludGVyZmFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIC5jbGFzcyBmaWxlIHJlcHJlc2VudHMgYW4gaW50ZXJmYWNlLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGlzSW50ZXJmYWNlKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZSwgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKKwkgKi8KKwlJU291cmNlQXR0cmlidXRlIGdldFNvdXJjZUZpbGVBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIEFuc3dlciB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIC5jbGFzcyBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyAuY2xhc3MgZmlsZQorCSAqLworCUlDb25zdGFudFBvb2wgZ2V0Q29uc3RhbnRQb29sKCk7CisJCisJLyoqCisJICogQW5zd2VyIHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoaXMgLmNsYXNzIGZpbGUuCisJICogCisJICogQHJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIC5jbGFzcyBmaWxlCisJICovCisJaW50IGdldE1pbm9yVmVyc2lvbigpOworCisJLyoqCisJICogQW5zd2VyIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoaXMgLmNsYXNzIGZpbGUuCisJICogCisJICogQHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGlzIC5jbGFzcyBmaWxlCisJICovCisJaW50IGdldE1ham9yVmVyc2lvbigpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIC5jbGFzcyBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIC5jbGFzcyBmaWxlCisJICovCisJaW50IGdldEF0dHJpYnV0ZUNvdW50KCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGluZm8uIEl0IAorCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZXMsIGV0Yy4gQW5zd2VycyBhbiBlbXB0eQorCSAqIGFycmF5IGlmIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQgaW5mby4gSXQgCisJICogaW5jbHVkZXMgU3ludGhldGljQXR0cmlidXRlLCBDb25zdGFudFZhbHVlQXR0cmlidXRlcywgZXRjLiBBbnN3ZXJzIGFuIGVtcHR5CisJICogYXJyYXkgaWYgbm9uZQorCSAqLworCUlDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG1hZ2ljIG51bWJlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtYWdpYyBudW1iZXIKKwkgKi8KKwlpbnQgZ2V0TWFnaWMoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGZpZWxkIGluZm9zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWVsZCBpbmZvcworCSAqLworCWludCBnZXRGaWVsZHNDb3VudCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG51bWJlciBvZiBtZXRob2QgaW5mb3MuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1ldGhvZCBpbmZvcworCSAqLworCWludCBnZXRNZXRob2RzQ291bnQoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb2RlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb2RlQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhOGM2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIGNvZGUgYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorICogCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvZGVBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbWF4IGxvY2FscyB2YWx1ZSBvZiB0aGUgY29kZSBhdHRyaWJ1dGUuCisJICogCisJICogQHJldHVybiB0aGUgbWF4IGxvY2FscyB2YWx1ZSBvZiB0aGUgY29kZSBhdHRyaWJ1dGUKKwkgKi8KKwlpbnQgZ2V0TWF4TG9jYWxzKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbWF4IHN0YWNrIHZhbHVlIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBtYXggc3RhY2sgdmFsdWUgb2YgdGhlIGNvZGUgYXR0cmlidXRlCisJICovCisJaW50IGdldE1heFN0YWNrKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbGluZSBudW1iZXIgYXR0cmlidXRlLCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSwgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZQorCSAqLworCUlMaW5lTnVtYmVyQXR0cmlidXRlIGdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuCisJICogCisJICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlLCBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCisJICovCisJSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgZ2V0TG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFycmF5IG9mIGV4Y2VwdGlvbiBlbnRyaWVzLCBpZiB0aGV5IGFyZSBwcmVzZW50LgorCSAqIEFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBleGNlcHRpb24gZW50cmllcywgaWYgdGhleSBhcmUgcHJlc2VudC4KKwkgKiBBbiBlbXB0eSBhcnJheSBvdGhlcndpc2UKKwkgKi8KKwlJRXhjZXB0aW9uVGFibGVFbnRyeVtdIGdldEV4Y2VwdGlvblRhYmxlKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFycmF5IG9mIGJ5dGVzLCB3aGljaCByZXByZXNlbnRzIGFsbCB0aGUgb3Bjb2RlcyBhcyBkZXNjcmliZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGJ5dGVzLCB3aGljaCByZXByZXNlbnRzIGFsbCB0aGUgb3Bjb2RlcyBhcyBkZXNjcmliZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJYnl0ZVtdIGdldEJ5dGVjb2RlcygpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZWNvZGUgY29udGVudHMuCisJICogCisJICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlY29kZSBjb250ZW50cworCSAqLworCWxvbmcgZ2V0Q29kZUxlbmd0aCgpOworCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBhdHRyaWJ1dGUgbnVtYmVyIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbnVtYmVyIG9mIHRoZSBjb2RlIGF0dHJpYnV0ZQorCSAqLworCWludCBnZXRBdHRyaWJ1dGVzQ291bnQoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdCAKKwkgKiBpbmNsdWRlcyB0aGUgTGluZU51bWJlckF0dHJpYnV0ZSBhbmQgdGhlIExvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZS4KKwkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdCAKKwkgKiBpbmNsdWRlcyB0aGUgTGluZU51bWJlckF0dHJpYnV0ZSBhbmQgdGhlIExvY2FsVmFyaWFibGVUYWJsZUF0dHJpYnV0ZS4KKwkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQorCSAqLworCUlDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZXhjZXB0aW9uIHRhYmxlIGxlbmd0aCBvZiB0aGUgY29kZSBhdHRyaWJ1dGUuCisJICogCisJICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHRhYmxlIGxlbmd0aCBvZiB0aGUgY29kZSBhdHRyaWJ1dGUKKwkgKi8KKwlpbnQgZ2V0RXhjZXB0aW9uVGFibGVMZW5ndGgoKTsKKwkKKwkvKioKKwkgKiBEZWZpbmUgYSBKYXZhIG9wY29kZXMgd2Fsa2VyLiBBbGwgYWN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgdmlzaXRvci4KKwkgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZGlzYXNzZW1ibGUgb3V0cHV0CisJICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgVGhlIGxpbmUgc2VwYXJhdG9yIHVzZWQgdG8gcHV0IGVhY2ggb3Bjb2RlIG9uIGl0cyBvd24gbGluZQorCSAqIEBwYXJhbSB0YWJOdW1iZXIgdGhlIG51bWJlciBvZiBpbmRlbnRhdGlvbiAoU1BBQ0Ugb3IgVEFCKQorCSAqIEBwYXJhbSB2aXNpdG9yIFRoZSB2aXNpdG9yIHRvIHVzZSB0byB3YWxrIHRoZSBvcGNvZGVzLgorCSAqIAorCSAqIEBleGNlcHRpb24gQ2xhc3NGb3JtYXRFeGNlcHRpb24gRXhjZXB0aW9uIHRocm93biBpZiB0aGUgb3Bjb2RlcyBjb250YWluIGludmFsaWQgYnl0ZXMKKwkgKi8KKwl2b2lkIHRyYXZlcnNlKElCeXRlY29kZVZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzMTFiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCBwb29sIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorICogCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50UG9vbCB7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuCisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wKKwkgKi8KKwlpbnQgZ2V0Q29uc3RhbnRQb29sQ291bnQoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSB0eXBlIG9mIHRoZSBlbnRyeSBhdCB0aGUgaW5kZXggQGluZGV4CisJICogaW4gdGhlIGNvbnN0YW50IHBvb2wuCisJICogCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wKKwkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBlbnRyeSBhdCB0aGUgaW5kZXggQGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sCisJICovCisJaW50IGdldEVudHJ5S2luZChpbnQgaW5kZXgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGVudHJ5IGF0IHRoZSBpbmRleCBAaW5kZXgKKwkgKiBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKwkgKiAKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbAorCSAqIEByZXR1cm4gdGhlIGVudHJ5IGF0IHRoZSBpbmRleCBAaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wKKwkgKi8KKwlJQ29uc3RhbnRQb29sRW50cnkgZGVjb2RlRW50cnkoaW50IGluZGV4KTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbENvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xDb25zdGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xDb25zdGFudC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgY29uc3RhbnQgcG9vbCBjb25zdGFudHMgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisgKiAKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqICAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQgeworCisJaW50IENPTlNUQU5UX0NsYXNzID0gNzsKKwlpbnQgQ09OU1RBTlRfRmllbGRyZWYgPSA5OworCWludCBDT05TVEFOVF9NZXRob2RyZWYgPSAxMDsKKwlpbnQgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmID0gMTE7CisJaW50IENPTlNUQU5UX1N0cmluZyA9IDg7CisJaW50IENPTlNUQU5UX0ludGVnZXIgPSAzOworCWludCBDT05TVEFOVF9GbG9hdCA9IDQ7CisJaW50IENPTlNUQU5UX0xvbmcgPSA1OworCWludCBDT05TVEFOVF9Eb3VibGUgPSA2OworCWludCBDT05TVEFOVF9OYW1lQW5kVHlwZSA9IDEyOworCWludCBDT05TVEFOVF9VdGY4ID0gMTsKKwkKKwlpbnQgQ09OU1RBTlRfTWV0aG9kcmVmX1NJWkUgPSA1OworCWludCBDT05TVEFOVF9DbGFzc19TSVpFID0gMzsKKwlpbnQgQ09OU1RBTlRfRG91YmxlX1NJWkUgPSA5OworCWludCBDT05TVEFOVF9GaWVsZHJlZl9TSVpFID0gNTsKKwlpbnQgQ09OU1RBTlRfRmxvYXRfU0laRSA9IDU7CisJaW50IENPTlNUQU5UX0ludGVnZXJfU0laRSA9IDU7CisJaW50IENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZl9TSVpFID0gNTsKKwlpbnQgQ09OU1RBTlRfTG9uZ19TSVpFID0gOTsKKwlpbnQgQ09OU1RBTlRfU3RyaW5nX1NJWkUgPSAzOworCWludCBDT05TVEFOVF9VdGY4X1NJWkUgPSAzOworCWludCBDT05TVEFOVF9OYW1lQW5kVHlwZV9TSVpFID0gNTsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ZWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbEVudHJ5LmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCBwb29sIGVudHJ5IGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorICogSXRzIGNvbnRlbnRzIGlzIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBpdHMga2luZC4KKyAqIAorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50UG9vbEVudHJ5IHsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSB0eXBlIG9mIHRoaXMgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGVudHJ5CisJICovCisJaW50IGdldEtpbmQoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIGluZGV4IGZvciBhIENPTlNUQU5UX0NsYXNzIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBpbmRleCBmb3IgYSBDT05TVEFOVF9DbGFzcyB0eXBlIGVudHJ5CisJICovCisJaW50IGdldENsYXNzSW5mb05hbWVJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGNsYXNzIGluZGV4IGZvciBhIENPTlNUQU5UX0ZpZWxkcmVmLAorCSAqIENPTlNUQU5UX01ldGhvZHJlZiwgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgY2xhc3MgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCisJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeQorCSAqLworCWludCBnZXRDbGFzc0luZGV4KCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZUFuZFR5cGUgaW5kZXggZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYsCisJICogQ09OU1RBTlRfTWV0aG9kcmVmLCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBuYW1lQW5kVHlwZSBpbmRleCBmb3IgYSBDT05TVEFOVF9GaWVsZHJlZiwKKwkgKiBDT05TVEFOVF9NZXRob2RyZWYsIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiB0eXBlIGVudHJ5CisJICovCisJaW50IGdldE5hbWVBbmRUeXBlSW5kZXgoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgc3RyaW5nIGluZGV4IGZvciBhIENPTlNUQU5UX1N0cmluZyB0eXBlIGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN0cmluZyBpbmRleCBmb3IgYSBDT05TVEFOVF9TdHJpbmcgdHlwZSBlbnRyeQorCSAqLworCWludCBnZXRTdHJpbmdJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIHN0cmluZyB2YWx1ZSBmb3IgYSBDT05TVEFOVF9TdHJpbmcgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGEgQ09OU1RBTlRfU3RyaW5nIHR5cGUgZW50cnkKKwkgKi8KKwlTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW50ZWdlciB2YWx1ZSBmb3IgYSBDT05TVEFOVF9JbnRlZ2VyIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBmb3IgYSBDT05TVEFOVF9JbnRlZ2VyIHR5cGUgZW50cnkKKwkgKi8KKwlpbnQgZ2V0SW50ZWdlclZhbHVlKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZmxvYXQgdmFsdWUgZm9yIGEgQ09OU1RBTlRfRmxvYXQgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmbG9hdCB2YWx1ZSBmb3IgYSBDT05TVEFOVF9GbG9hdCB0eXBlIGVudHJ5CisJICovCisJZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGRvdWJsZSB2YWx1ZSBmb3IgYSBDT05TVEFOVF9Eb3VibGUgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkb3VibGUgdmFsdWUgZm9yIGEgQ09OU1RBTlRfRG91YmxlIHR5cGUgZW50cnkKKwkgKi8KKwlkb3VibGUgZ2V0RG91YmxlVmFsdWUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBsb25nIHZhbHVlIGZvciBhIENPTlNUQU5UX0xvbmcgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsb25nIHZhbHVlIGZvciBhIENPTlNUQU5UX0xvbmcgdHlwZSBlbnRyeQorCSAqLworCWxvbmcgZ2V0TG9uZ1ZhbHVlKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGRlc2NyaXB0b3IgaW5kZXggZm9yIGEgQ09OU1RBTlRfTmFtZUFuZFR5cGUgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGluZGV4IGZvciBhIENPTlNUQU5UX05hbWVBbmRUeXBlIHR5cGUgZW50cnkKKwkgKi8KKwlpbnQgZ2V0TmFtZUFuZFR5cGVJbmZvRGVzY3JpcHRvckluZGV4KCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBpbmRleCBmb3IgYSBDT05TVEFOVF9OYW1lQW5kVHlwZSB0eXBlIGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggZm9yIGEgQ09OU1RBTlRfTmFtZUFuZFR5cGUgdHlwZSBlbnRyeQorCSAqLworCWludCBnZXROYW1lQW5kVHlwZUluZm9OYW1lSW5kZXgoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBjbGFzcyBuYW1lIGZvciBhIENPTlNUQU5UX0NsYXNzIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgYSBDT05TVEFOVF9DbGFzcyB0eXBlIGVudHJ5CisJICovCisJY2hhcltdIGdldENsYXNzSW5mb05hbWUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBjbGFzcyBuYW1lIGZvciBhIENPTlNUQU5UX0ZpZWxkcmVmLAorCSAqIENPTlNUQU5UX01ldGhvZHJlZiwgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVmIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgYSBDT05TVEFOVF9GaWVsZHJlZiwKKwkgKiBDT05TVEFOVF9NZXRob2RyZWYsIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiB0eXBlIGVudHJ5CisJICovCisJY2hhcltdIGdldENsYXNzTmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGZpZWxkIG5hbWUgZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYgdHlwZSBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmaWVsZCBuYW1lIGZvciBhIENPTlNUQU5UX0ZpZWxkcmVmIHR5cGUgZW50cnkKKwkgKi8KKwljaGFyW10gZ2V0RmllbGROYW1lKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGZpZWxkIG5hbWUgZm9yIGEgQ09OU1RBTlRfTWV0aG9kcmVmIG9yIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZAorCSAqIHR5cGUgZW50cnkuCisJICogCisJICogQHJldHVybiB0aGUgZmllbGQgbmFtZSBmb3IgYSBDT05TVEFOVF9NZXRob2RyZWYgb3IgQ09OU1RBTlRfSW50ZXJmYWNlTWV0aG9kcmVkCisJICogdHlwZSBlbnRyeQorCSAqLworCWNoYXJbXSBnZXRNZXRob2ROYW1lKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZmllbGQgZGVzY3JpcHRvciB2YWx1ZSBmb3IgYSBDT05TVEFOVF9GaWVsZHJlZiB0eXBlIGVudHJ5LiBUaGlzIHZhbHVlCisJICogaXMgc2V0IG9ubHkgd2hlbiBkZWNvZGluZyB0aGUgQ09OU1RBTlRfRmllbGRyZWYgZW50cnkuIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpZWxkIGRlc2NyaXB0b3IgdmFsdWUgZm9yIGEgQ09OU1RBTlRfRmllbGRyZWYgdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZQorCSAqIGlzIHNldCBvbmx5IHdoZW4gZGVjb2RpbmcgdGhlIENPTlNUQU5UX0ZpZWxkcmVmIGVudHJ5CisJICovCisJY2hhcltdIGdldEZpZWxkRGVzY3JpcHRvcigpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG1ldGhvZCBkZXNjcmlwdG9yIHZhbHVlIGZvciBhIENPTlNUQU5UX01ldGhvZHJlZiBvcgorCSAqIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiB0eXBlIGVudHJ5LiBUaGlzIHZhbHVlIGlzIHNldCBvbmx5IHdoZW4gZGVjb2RpbmcgdGhlIAorCSAqIENPTlNUQU5UX01ldGhvZHJlZiBvciBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgZW50cnkuIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBkZXNjcmlwdG9yIHZhbHVlIGZvciBhIENPTlNUQU5UX01ldGhvZHJlZiBvcgorCSAqIENPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZiB0eXBlIGVudHJ5LiBUaGlzIHZhbHVlIGlzIHNldCBvbmx5IHdoZW4gZGVjb2RpbmcgdGhlIAorCSAqIENPTlNUQU5UX01ldGhvZHJlZiBvciBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgZW50cnkKKwkgKi8KKwljaGFyW10gZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSB1dGY4IHZhbHVlIGZvciBhIENPTlNUQU5UX1V0ZjggdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuCisJICogZGVjb2RpbmcgYSBVVEY4IGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHV0ZjggdmFsdWUgZm9yIGEgQ09OU1RBTlRfVXRmOCB0eXBlIGVudHJ5LiBUaGlzIHZhbHVlIGlzIHNldCBvbmx5IHdoZW4KKwkgKiBkZWNvZGluZyBhIFVURjggZW50cnkKKwkgKi8KKwljaGFyW10gZ2V0VXRmOFZhbHVlKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIHV0ZjggbGVuZ3RoIGZvciBhIENPTlNUQU5UX1V0ZjggdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuCisJICogZGVjb2RpbmcgYSBVVEY4IGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHV0ZjggbGVuZ3RoIGZvciBhIENPTlNUQU5UX1V0ZjggdHlwZSBlbnRyeS4gVGhpcyB2YWx1ZSBpcyBzZXQgb25seSB3aGVuCisJICogZGVjb2RpbmcgYSBVVEY4IGVudHJ5CisJICovCisJaW50IGdldFV0ZjhMZW5ndGgoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc4ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBzcGVjaWZpY2F0aW9ucy4KKyAqIAorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgY29uc3RhbnQgdmFsdWUgaW5kZXguCisJICogCisJICogQHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgaW5kZXgKKwkgKi8KKwlpbnQgZ2V0Q29uc3RhbnRWYWx1ZUluZGV4KCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdGhhdCByZXByZXNlbnRzIHRoZSBjb25zdGFudAorCSAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdGhhdCByZXByZXNlbnRzIHRoZSBjb25zdGFudAorCSAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCisJICovCisJSUNvbnN0YW50UG9vbEVudHJ5IGdldENvbnN0YW50VmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkMmE5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElFeGNlcHRpb25BdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9ucyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZXhjZXB0aW9ucyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZQorCSAqLworCWludCBnZXRFeGNlcHRpb25zTnVtYmVyKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZXhjZXB0aW9uIG5hbWVzIG9mIHRoZSBleGNlcHRpb24gYXR0cmlidXRlLiBBbnN3ZXJzIGFuCisJICogZW1wdHkgY29sbGVjdGlvbiBpZiBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiBuYW1lcyBvZiB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZS4gQW5zd2VycyBhbgorCSAqIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQorCSAqLworCWNoYXJbXVtdIGdldEV4Y2VwdGlvbk5hbWVzKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZXhjZXB0aW9uIGluZGV4ZXMgb2YgdGhlIGV4Y2VwdGlvbiBhdHRyaWJ1dGUuIEFuc3dlcnMgYW4KKwkgKiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgZXhjZXB0aW9uIGluZGV4ZXMgb2YgdGhlIGV4Y2VwdGlvbiBhdHRyaWJ1dGUuIEFuc3dlcnMgYW4KKwkgKiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKKwkgKi8KKwlpbnRbXSBnZXRFeGNlcHRpb25JbmRleGVzKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25UYWJsZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViNjc0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvblRhYmxlRW50cnkuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOworCisvKioKKyAqIFRoZSBjbGFzcyByZXByZXNlbnRzIGFuIGVudHJ5IGluIHRoZSBleGNlcHRpb24gdGFibGUgb2YgYSBJQ29kZUF0dHJpYnV0ZSBhcyAKKyAqIHNwZWNpZmllZCBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorICogCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJRXhjZXB0aW9uVGFibGVFbnRyeSB7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgc3RhcnQgcGMgb2YgdGhpcyBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdGFydCBwYyBvZiB0aGlzIGVudHJ5CisJICovCisJaW50IGdldFN0YXJ0UEMoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBlbmQgcGMgb2YgdGhpcyBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBlbmQgcGMgb2YgdGhpcyBlbnRyeQorCSAqLworCWludCBnZXRFbmRQQygpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGhhbmRsZXIgcGMgb2YgdGhpcyBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBoYW5kbGVyIHBjIG9mIHRoaXMgZW50cnkKKwkgKi8KKwlpbnQgZ2V0SGFuZGxlclBDKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgY2F0Y2ggdHlwZSBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjYXRjaCB0eXBlIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sCisJICovCisJaW50IGdldENhdGNoVHlwZUluZGV4KCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgY2F0Y2ggdHlwZSBuYW1lLCBudWxsIGlmIGdldENhdGNoVHlwZUluZGV4KCkgcmV0dXJucyAwLgorCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGFueSBleGNlcHRpb24gaGFuZGxlci4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjYXRjaCB0eXBlIG5hbWUsIG51bGwgaWYgZ2V0Q2F0Y2hUeXBlSW5kZXgoKSByZXR1cm5zIDAuCisJICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgYW55IGV4Y2VwdGlvbiBoYW5kbGVyCisJICovCisJY2hhcltdIGdldENhdGNoVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRmllbGRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lGaWVsZEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRlMDRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRmllbGRJbmZvLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBmaWVsZCBpbmZvIGFzIGRlc2NyaWJlZCBpbiB0aGUgSlZNIAorICogc3BlY2lmaWNhdGlvbnMuCisgKiAgCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJRmllbGRJbmZvIHsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhpcyBmaWVsZCBpbmZvIGlmIHNwZWNpZmllZCwgCisJICogbnVsbCBvdGhlcndpc2UuCisJICogCisJICogQHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgYXR0cmlidXRlIG9mIHRoaXMgZmllbGQgaW5mbyBpZiBzcGVjaWZpZWQsIAorCSAqIG51bGwgb3RoZXJ3aXNlCisJICovCisJSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgZ2V0Q29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFjY2VzcyBmbGFnIG9mIHRoaXMgZmllbGQgaW5mby4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGlzIGZpZWxkIGluZm8KKwkgKi8KKwlpbnQgZ2V0QWNjZXNzRmxhZ3MoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIGluZm8uIFRoZSBuYW1lIGlzIHJldHVybmVkIGFzCisJICogc3BlY2lmaWVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIGluZm8uIFRoZSBuYW1lIGlzIHJldHVybmVkIGFzCisJICogc3BlY2lmaWVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKKwkgKi8KKwljaGFyW10gZ2V0TmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbmZvLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggb2YgdGhpcyBmaWVsZCBpbmZvCisJICovCisJaW50IGdldE5hbWVJbmRleCgpOworCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgZmllbGQgaW5mby4gVGhlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQgYXMKKwkgKiBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgZmllbGQgaW5mby4gVGhlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQgYXMKKwkgKiBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWNoYXJbXSBnZXREZXNjcmlwdG9yKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIGZpZWxkIGluZm8uCisJICogCisJICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIGZpZWxkIGluZm8KKwkgKi8KKwlpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaW5mbyBoYXMgYSBjb25zdGFudCB2YWx1ZSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGluZm8gaGFzIGEgY29uc3RhbnQgdmFsdWUgYXR0cmlidXRlLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGhhc0NvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBpbmZvIGhhcyBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGluZm8gaGFzIGEgc3ludGhldGljIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBpc1N5bnRoZXRpYygpOworCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGluZm8gaGFzIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpZWxkIGluZm8gaGFzIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNEZXByZWNhdGVkKCk7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIGZpZWxkIGluZm8uCisJICogCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlIG51bWJlciBvZiB0aGUgZmllbGQgaW5mbworCSAqLworCWludCBnZXRBdHRyaWJ1dGVDb3VudCgpOworCisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGluZm8uIEl0IAorCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZXMsIGV0Yy4KKwkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBpbmZvLiBJdCAKKwkgKiBpbmNsdWRlcyBTeW50aGV0aWNBdHRyaWJ1dGUsIENvbnN0YW50VmFsdWVBdHRyaWJ1dGVzLCBldGMuCisJICogUmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKKwkgKi8KKwlJQ2xhc3NGaWxlQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwZDY2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBpbm5lciBjbGFzcyBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGUgZXh0ZW5kcyBJQ2xhc3NGaWxlQXR0cmlidXRlIHsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbnVtYmVyIG9mIGlubmVyIGNsYXNzZXMgaW5mb3MgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW5uZXIgY2xhc3NlcyBpbmZvcyBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJaW50IGdldE51bWJlck9mQ2xhc3NlcygpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFycmF5IG9mIGlubmVyIGF0dHJpYnV0ZSBlbnRyaWVzIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgYXJyYXkgb2YgaW5uZXIgYXR0cmlidXRlIGVudHJpZXMgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQorCSAqLworCUlJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeVtdIGdldElubmVyQ2xhc3NBdHRyaWJ1dGVzRW50cmllcygpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxMTQxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIGlubmVyIGNsYXNzIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSB7CisJCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFjY2VzcyBmbGFnIG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgZmxhZyBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKKwkgKi8KKwlpbnQgZ2V0QWNjZXNzRmxhZ3MoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBpbm5lciBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbm5lciBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWludCBnZXRJbm5lck5hbWVJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG91dGVyIGNsYXNzIG5hbWUgaW5kZXggb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG91dGVyIGNsYXNzIG5hbWUgaW5kZXggb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJaW50IGdldE91dGVyQ2xhc3NOYW1lSW5kZXgoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBpbm5lciBjbGFzcyBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbm5lciBjbGFzcyBuYW1lIGluZGV4IG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWludCBnZXRJbm5lckNsYXNzTmFtZUluZGV4KCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgaW5uZXIgbmFtZSBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMsIG51bGwgaWYgaW5uZXIgbmFtZSBpbmRleCBpcyBlcXVhbHMgdG8gemVyby4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbm5lciBuYW1lIG9mIHRoaXMgaW5uZXIgY2xhc3NlcyBhdHRyaWJ1dGUgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucywgbnVsbCBpZiBpbm5lciBuYW1lIGluZGV4IGlzIGVxdWFscyB0byB6ZXJvCisJICovCisJY2hhcltdIGdldElubmVyTmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG91dGVyIGNsYXNzIG5hbWUgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLCBudWxsIGlmIG91dGVyIGNsYXNzIG5hbWUgaW5kZXggaXMgZXF1YWxzIHRvIHplcm8uCisJICogCisJICogQHJldHVybiB0aGUgb3V0ZXIgY2xhc3MgbmFtZSBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMsIG51bGwgaWYgb3V0ZXIgY2xhc3MgbmFtZSBpbmRleCBpcyBlcXVhbHMgdG8gemVybworCSAqLworCWNoYXJbXSBnZXRPdXRlckNsYXNzTmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGlubmVyIGNsYXNzIG5hbWUgb2YgdGhpcyBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLCBudWxsIGlmIGlubmVyIGNsYXNzIG5hbWUgaW5kZXggaXMgZXF1YWxzIHRvIHplcm8uCisJICogCisJICogQHJldHVybiB0aGUgaW5uZXIgY2xhc3MgbmFtZSBvZiB0aGlzIGlubmVyIGNsYXNzZXMgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMsIG51bGwgaWYgaW5uZXIgY2xhc3MgbmFtZSBpbmRleCBpcyBlcXVhbHMgdG8gemVybworCSAqLworCWNoYXJbXSBnZXRJbm5lckNsYXNzTmFtZSgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjhkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElMaW5lTnVtYmVyQXR0cmlidXRlIGV4dGVuZHMgSUNsYXNzRmlsZUF0dHJpYnV0ZSB7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbGluZSBudW1iZXIgdGFibGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgdGFibGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKKwkgKi8KKwlpbnQgZ2V0TGluZU51bWJlclRhYmxlTGVuZ3RoKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgYXJyYXkgb2YgcGFpcnMgKHN0YXJ0IHBjLCBsaW5lIG51bWJlcikgYXMgc3BlY2lmaWVkIGluIHRoZSAKKwkgKiBKVk0gc3BlY2lmaWNhdGlvbnMuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBhaXJzIChzdGFydCBwYywgbGluZSBudW1iZXIpIGFzIHNwZWNpZmllZCBpbiB0aGUgCisJICogSlZNIHNwZWNpZmljYXRpb25zLiBBbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZQorCSAqLworCWludFtdW10gZ2V0TGluZU51bWJlclRhYmxlKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNmNjNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisgKiAgCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgeworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGxvY2FsIHZhcmlhYmxlIHRhYmxlIGxlbmd0aCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgdGFibGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWludCBnZXRMb2NhbFZhcmlhYmxlVGFibGVMZW5ndGgoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBsb2NhbCB2YXJpYWJsZSB0YWJsZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuIEFuc3dlciBhbiBlbXB0eSBhcnJheSBpZiBub25lLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlIHRhYmxlIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4gQW5zd2VyIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUKKwkgKi8KKwlJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnlbXSBnZXRMb2NhbFZhcmlhYmxlVGFibGUoKTsKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YmQ5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBsb2NhbCB2YXJpYWJsZSB0YWJsZSBlbnRyeSBhcyBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKyAqIAorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIAorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IHsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgc3RhcnQgcGMgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN0YXJ0IHBjIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWludCBnZXRTdGFydFBDKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbGVuZ3RoIG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJaW50IGdldExlbmd0aCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJaW50IGdldE5hbWVJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGRlc2NyaXB0b3IgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJaW50IGdldERlc2NyaXB0b3JJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGluZGV4IG9mIHRoaXMgZW50cnkgYXMgc3BlY2lmaWVkIGluCisJICogdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKKwkgKi8KKwlpbnQgZ2V0SW5kZXgoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgbmFtZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGVudHJ5IGFzIHNwZWNpZmllZCBpbgorCSAqIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMKKwkgKi8KKwljaGFyW10gZ2V0TmFtZSgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBlbnRyeSBhcyBzcGVjaWZpZWQgaW4KKwkgKiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJY2hhcltdIGdldERlc2NyaXB0b3IoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1ldGhvZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1ldGhvZEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYzYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTWV0aG9kSW5mby5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIGEgbWV0aG9kIGluZm8gYXMgZGVzY3JpYmVkIGluIHRoZSBKVk0gCisgKiBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElNZXRob2RJbmZvIHsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBtZXRob2QgZGVzY3JpcHRvciBvZiB0aGlzIG1ldGhvZCBpbmZvIGFzIHNwZWNpZmllZAorCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgbWV0aG9kIGRlc2NyaXB0b3Igb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJY2hhcltdIGdldERlc2NyaXB0b3IoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBkZXNjcmlwdG9yIGluZGV4IG9mIHRoaXMgbWV0aG9kIGluZm8uCisJICogCisJICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBpbmRleCBvZiB0aGlzIG1ldGhvZCBpbmZvCisJICovCisJaW50IGdldERlc2NyaXB0b3JJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGlzIG1ldGhvZCBpbmZvIGFzIHNwZWNpZmllZAorCSAqIGluIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisJICogCisJICogQHJldHVybiB0aGUgYWNjZXNzIGZsYWdzIG9mIHRoaXMgbWV0aG9kIGluZm8gYXMgc3BlY2lmaWVkCisJICogaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucworCSAqLworCWludCBnZXRBY2Nlc3NGbGFncygpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaW5mbyBhcyBzcGVjaWZpZWQKKwkgKiBpbiB0aGUgSlZNIHNwZWNpZmljYXRpb25zCisJICovCisJY2hhcltdIGdldE5hbWUoKTsKKworCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBuYW1lIGluZGV4IG9mIHRoaXMgbWV0aG9kIGluZm8uCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBpbmRleCBvZiB0aGlzIG1ldGhvZCBpbmZvCisJICovCisJaW50IGdldE5hbWVJbmRleCgpOworCQorCS8qKgorCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gcmVwcmVzZW50cyBhICZsdDtjbGluaXQmZ3Q7IG1ldGhvZCwKKwkgKiBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gcmVwcmVzZW50cyBhICZsdDtjbGluaXQmZ3Q7IG1ldGhvZCwKKwkgKiBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGlzQ2xpbml0KCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpbmZvIHJlcHJlc2VudHMgYSBjb25zdHJ1Y3RvciwKKwkgKiBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gcmVwcmVzZW50cyBhIGNvbnN0cnVjdG9yLAorCSAqIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOworCisJLyoqCisJICogQW5zd2VyIHRydWUgaWYgdGhpcyBtZXRob2QgaW5mbyBoYXMgYSBzeW50aGV0aWMgYXR0cmlidXRlLAorCSAqIGZhbHNlIG90aGVyd2lzZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaW5mbyBoYXMgYSBzeW50aGV0aWMgYXR0cmlidXRlLAorCSAqIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNTeW50aGV0aWMoKTsKKworCS8qKgorCSAqIEFuc3dlciB0cnVlIGlmIHRoaXMgbWV0aG9kIGluZm8gaGFzIGEgZGVwcmVjYXRlZCBhdHRyaWJ1dGUsCisJICogZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpbmZvIGhhcyBhIGRlcHJlY2F0ZWQgYXR0cmlidXRlLAorCSAqIGZhbHNlIG90aGVyd2lzZQorCSAqLworCWJvb2xlYW4gaXNEZXByZWNhdGVkKCk7CisKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGNvZGUgYXR0cmlidXRlIG9mIHRoaXMgbWV0aG9kIGluZm8sIG51bGwgaWYgbm9uZSBvciBpZiB0aGUgZGVjb2RpbmcKKwkgKiBmbGFnIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNvZGUgYXR0cmlidXRlIG9mIHRoaXMgbWV0aG9kIGluZm8sIG51bGwgaWYgbm9uZSBvciBpZiB0aGUgZGVjb2RpbmcKKwkgKiBmbGFnIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTCisJICovCisJSUNvZGVBdHRyaWJ1dGUgZ2V0Q29kZUF0dHJpYnV0ZSgpOworCQorCS8qKgorCSAqIEFuc3dlciB0aGUgZXhjZXB0aW9uIGF0dHJpYnV0ZSBvZiB0aGlzIG1ldGhvZCBpbmZvLCBudWxsIGlzIG5vbmUuCisJICogCisJICogCUByZXR1cm4gdGhlIGV4Y2VwdGlvbiBhdHRyaWJ1dGUgb2YgdGhpcyBtZXRob2QgaW5mbywgbnVsbCBpcyBub25lCisJICovCisJSUV4Y2VwdGlvbkF0dHJpYnV0ZSBnZXRFeGNlcHRpb25BdHRyaWJ1dGUoKTsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYmFjayB0aGUgYXR0cmlidXRlIG51bWJlciBvZiB0aGUgbWV0aG9kIGluZm8uIEl0IGluY2x1ZGVzIHRoZSBDb2RlQXR0cmlidXRlCisJICogaWYgYW55IGV2ZW4gaWYgdGhlIGRlY29kaW5nIGZsYWdzIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSBudW1iZXIgb2YgdGhlIG1ldGhvZCBpbmZvLiBJdCBpbmNsdWRlcyB0aGUgQ29kZUF0dHJpYnV0ZQorCSAqIGlmIGFueSBldmVuIGlmIHRoZSBkZWNvZGluZyBmbGFncyBkb2Vzbid0IGluY2x1ZGUgTUVUSE9EX0JPRElFUworCSAqLworCWludCBnZXRBdHRyaWJ1dGVDb3VudCgpOworCQorCS8qKgorCSAqIEFuc3dlciBiYWNrIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaW5mby4gSXQgCisJICogaW5jbHVkZXMgU3ludGhldGljQXR0cmlidXRlLCBDb2RlQXR0cmlidXRlcywgZXRjLiBJdCBkb2Vzbid0IGluY2x1ZGUgdGhlCisJICogQ29kZUF0dHJpYnV0ZSBpZiB0aGUgZGVjb2RpbmcgZmxhZ3MgZG9lc24ndCBpbmNsdWRlIE1FVEhPRF9CT0RJRVMuCisJICogUmV0dXJucyBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUuCisJICogCisJICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBhbGwgYXR0cmlidXRlcyBvZiB0aGUgbWV0aG9kIGluZm8uIEl0IAorCSAqIGluY2x1ZGVzIFN5bnRoZXRpY0F0dHJpYnV0ZSwgQ29kZUF0dHJpYnV0ZXMsIGV0Yy4gSXQgZG9lc24ndCBpbmNsdWRlIHRoZQorCSAqIENvZGVBdHRyaWJ1dGUgaWYgdGhlIGRlY29kaW5nIGZsYWdzIGRvZXNuJ3QgaW5jbHVkZSBNRVRIT0RfQk9ESUVTLgorCSAqIFJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCisJICovCisJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNb2RpZmllckNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTW9kaWZpZXJDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM5ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTW9kaWZpZXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOworCisvKioKKyAqIERlZmluaXRpb24gb2YgdGhlIG1vZGlmaWVyIGNvbnN0YW50cyBhcyBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb2RpZmllckNvbnN0YW50cyB7CisKKwlpbnQgQUNDX1BVQkxJQyAgICAgICA9IDB4MDAwMTsKKwlpbnQgQUNDX1BSSVZBVEUgICAgICA9IDB4MDAwMjsKKwlpbnQgQUNDX1BST1RFQ1RFRCAgICA9IDB4MDAwNDsKKwlpbnQgQUNDX1NUQVRJQyAgICAgICA9IDB4MDAwODsKKwlpbnQgQUNDX0ZJTkFMICAgICAgICA9IDB4MDAxMDsKKwlpbnQgQUNDX1NVUEVSICAgICAgICA9IDB4MDAyMDsKKwlpbnQgQUNDX1NZTkNIUk9OSVpFRCA9IDB4MDAyMDsKKwlpbnQgQUNDX1ZPTEFUSUxFICAgICA9IDB4MDA0MDsKKwlpbnQgQUNDX1RSQU5TSUVOVCAgICA9IDB4MDA4MDsKKwlpbnQgQUNDX05BVElWRSAgICAgICA9IDB4MDEwMDsKKwlpbnQgQUNDX0lOVEVSRkFDRSAgICA9IDB4MDIwMDsKKwlpbnQgQUNDX0FCU1RSQUNUICAgICA9IDB4MDQwMDsKKwlpbnQgQUNDX1NUUklDVCAgICAgICA9IDB4MDgwMDsJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lPcGNvZGVNbmVtb25pY3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU9wY29kZU1uZW1vbmljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzhlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lPcGNvZGVNbmVtb25pY3MuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBlYWNoIG9wY29kZSBtbmVtb25pYyBhY2NvcmRpbmcgdG8gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKyAqICAKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAKKyAqIAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElPcGNvZGVNbmVtb25pY3MgeworCisJaW50IE5PUCA9IDB4MDA7CisJaW50IEFDT05TVF9OVUxMID0gMHgwMTsKKwlpbnQgSUNPTlNUX00xID0gMHgwMjsKKwlpbnQgSUNPTlNUXzAgPSAweDAzOworCWludCBJQ09OU1RfMSA9IDB4MDQ7CisJaW50IElDT05TVF8yID0gMHgwNTsKKwlpbnQgSUNPTlNUXzMgPSAweDA2OworCWludCBJQ09OU1RfNCA9IDB4MDc7CisJaW50IElDT05TVF81ID0gMHgwODsKKwlpbnQgTENPTlNUXzAgPSAweDA5OworCWludCBMQ09OU1RfMSA9IDB4MEE7CisJaW50IEZDT05TVF8wID0gMHgwQjsKKwlpbnQgRkNPTlNUXzEgPSAweDBDOworCWludCBGQ09OU1RfMiA9IDB4MEQ7CisJaW50IERDT05TVF8wID0gMHgwRTsKKwlpbnQgRENPTlNUXzEgPSAweDBGOworCWludCBCSVBVU0ggPSAweDEwOworCWludCBTSVBVU0ggPSAweDExOworCWludCBMREMgPSAweDEyOworCWludCBMRENfVyA9IDB4MTM7CisJaW50IExEQzJfVz0gMHgxNDsKKwlpbnQgSUxPQUQgPSAweDE1OworCWludCBMTE9BRCA9IDB4MTY7CisJaW50IEZMT0FEID0gMHgxNzsKKwlpbnQgRExPQUQgPSAweDE4OworCWludCBBTE9BRCA9IDB4MTk7CisJaW50IElMT0FEXzAgPSAweDFBOworCWludCBJTE9BRF8xID0gMHgxQjsKKwlpbnQgSUxPQURfMiA9IDB4MUM7CisJaW50IElMT0FEXzMgPSAweDFEOworCWludCBMTE9BRF8wID0gMHgxRTsKKwlpbnQgTExPQURfMSA9IDB4MUY7CisJaW50IExMT0FEXzIgPSAweDIwOworCWludCBMTE9BRF8zID0gMHgyMTsKKwlpbnQgRkxPQURfMCA9IDB4MjI7CisJaW50IEZMT0FEXzEgPSAweDIzOworCWludCBGTE9BRF8yID0gMHgyNDsKKwlpbnQgRkxPQURfMyA9IDB4MjU7CisJaW50IERMT0FEXzAgPSAweDI2OworCWludCBETE9BRF8xID0gMHgyNzsKKwlpbnQgRExPQURfMiA9IDB4Mjg7CisJaW50IERMT0FEXzMgPSAweDI5OworCWludCBBTE9BRF8wID0gMHgyQTsKKwlpbnQgQUxPQURfMSA9IDB4MkI7CisJaW50IEFMT0FEXzIgPSAweDJDOworCWludCBBTE9BRF8zID0gMHgyRDsKKwlpbnQgSUFMT0FEID0gMHgyRTsKKwlpbnQgTEFMT0FEID0gMHgyRjsKKwlpbnQgRkFMT0FEID0gMHgzMDsKKwlpbnQgREFMT0FEID0gMHgzMTsKKwlpbnQgQUFMT0FEID0gMHgzMjsKKwlpbnQgQkFMT0FEID0gMHgzMzsKKwlpbnQgQ0FMT0FEID0gMHgzNDsKKwlpbnQgU0FMT0FEID0gMHgzNTsKKwlpbnQgSVNUT1JFID0gMHgzNjsKKwlpbnQgTFNUT1JFID0gMHgzNzsKKwlpbnQgRlNUT1JFID0gMHgzODsKKwlpbnQgRFNUT1JFID0gMHgzOTsKKwlpbnQgQVNUT1JFID0gMHgzQTsKKwlpbnQgSVNUT1JFXzAgPSAweDNCOworCWludCBJU1RPUkVfMSA9IDB4M0M7CisJaW50IElTVE9SRV8yID0gMHgzRDsKKwlpbnQgSVNUT1JFXzMgPSAweDNFOworCWludCBMU1RPUkVfMCA9IDB4M0Y7CisJaW50IExTVE9SRV8xID0gMHg0MDsKKwlpbnQgTFNUT1JFXzIgPSAweDQxOworCWludCBMU1RPUkVfMyA9IDB4NDI7CisJaW50IEZTVE9SRV8wID0gMHg0MzsKKwlpbnQgRlNUT1JFXzEgPSAweDQ0OworCWludCBGU1RPUkVfMiA9IDB4NDU7CisJaW50IEZTVE9SRV8zID0gMHg0NjsKKwlpbnQgRFNUT1JFXzAgPSAweDQ3OworCWludCBEU1RPUkVfMSA9IDB4NDg7CisJaW50IERTVE9SRV8yID0gMHg0OTsKKwlpbnQgRFNUT1JFXzMgPSAweDRBOworCWludCBBU1RPUkVfMCA9IDB4NEI7CisJaW50IEFTVE9SRV8xID0gMHg0QzsKKwlpbnQgQVNUT1JFXzIgPSAweDREOworCWludCBBU1RPUkVfMyA9IDB4NEU7CisJaW50IElBU1RPUkUgPSAweDRGOworCWludCBMQVNUT1JFID0gMHg1MDsKKwlpbnQgRkFTVE9SRSA9IDB4NTE7CisJaW50IERBU1RPUkUgPSAweDUyOworCWludCBBQVNUT1JFID0gMHg1MzsKKwlpbnQgQkFTVE9SRSA9IDB4NTQ7CisJaW50IENBU1RPUkUgPSAweDU1OworCWludCBTQVNUT1JFID0gMHg1NjsKKwlpbnQgUE9QID0gMHg1NzsKKwlpbnQgUE9QMiA9IDB4NTg7CisJaW50IERVUCA9IDB4NTk7CisJaW50IERVUF9YMSA9IDB4NUE7CisJaW50IERVUF9YMiA9IDB4NUI7CisJaW50IERVUDIgPSAweDVDOworCWludCBEVVAyX1gxID0gMHg1RDsKKwlpbnQgRFVQMl9YMiA9IDB4NUU7CisJaW50IFNXQVAgPSAweDVGOworCWludCBJQUREID0gMHg2MDsKKwlpbnQgTEFERCA9IDB4NjE7CisJaW50IEZBREQgPSAweDYyOworCWludCBEQUREID0gMHg2MzsKKwlpbnQgSVNVQiA9IDB4NjQ7CisJaW50IExTVUIgPSAweDY1OworCWludCBGU1VCID0gMHg2NjsKKwlpbnQgRFNVQiA9IDB4Njc7CisJaW50IElNVUwgPSAweDY4OworCWludCBMTVVMID0gMHg2OTsKKwlpbnQgRk1VTCA9IDB4NkE7CisJaW50IERNVUwgPSAweDZCOworCWludCBJRElWID0gMHg2QzsKKwlpbnQgTERJViA9IDB4NkQ7CisJaW50IEZESVYgPSAweDZFOworCWludCBERElWID0gMHg2RjsKKwlpbnQgSVJFTSA9IDB4NzA7CisJaW50IExSRU0gPSAweDcxOworCWludCBGUkVNID0gMHg3MjsKKwlpbnQgRFJFTSA9IDB4NzM7CisJaW50IElORUcgPSAweDc0OworCWludCBMTkVHID0gMHg3NTsKKwlpbnQgRk5FRyA9IDB4NzY7CisJaW50IERORUcgPSAweDc3OworCWludCBJU0hMID0gMHg3ODsKKwlpbnQgTFNITCA9IDB4Nzk7CisJaW50IElTSFIgPSAweDdBOworCWludCBMU0hSID0gMHg3QjsKKwlpbnQgSVVTSFIgPSAweDdDOworCWludCBMVVNIUiA9IDB4N0Q7CisJaW50IElBTkQgPSAweDdFOworCWludCBMQU5EID0gMHg3RjsKKwlpbnQgSU9SID0gMHg4MDsKKwlpbnQgTE9SID0gMHg4MTsKKwlpbnQgSVhPUiA9IDB4ODI7CisJaW50IExYT1IgPSAweDgzOworCWludCBJSU5DID0gMHg4NDsKKwlpbnQgSTJMID0gMHg4NTsKKwlpbnQgSTJGID0gMHg4NjsKKwlpbnQgSTJEID0gMHg4NzsKKwlpbnQgTDJJID0gMHg4ODsKKwlpbnQgTDJGID0gMHg4OTsKKwlpbnQgTDJEID0gMHg4QTsKKwlpbnQgRjJJID0gMHg4QjsKKwlpbnQgRjJMID0gMHg4QzsKKwlpbnQgRjJEID0gMHg4RDsKKwlpbnQgRDJJID0gMHg4RTsKKwlpbnQgRDJMID0gMHg4RjsKKwlpbnQgRDJGID0gMHg5MDsKKwlpbnQgSTJCID0gMHg5MTsKKwlpbnQgSTJDID0gMHg5MjsKKwlpbnQgSTJTID0gMHg5MzsKKwlpbnQgTENNUCA9IDB4OTQ7CisJaW50IEZDTVBMID0gMHg5NTsKKwlpbnQgRkNNUEcgPSAweDk2OworCWludCBEQ01QTCA9IDB4OTc7CisJaW50IERDTVBHID0gMHg5ODsKKwlpbnQgSUZFUSA9IDB4OTk7CisJaW50IElGTkUgPSAweDlBOworCWludCBJRkxUID0gMHg5QjsKKwlpbnQgSUZHRSA9IDB4OUM7CisJaW50IElGR1QgPSAweDlEOworCWludCBJRkxFID0gMHg5RTsKKwlpbnQgSUZfSUNNUEVRID0gMHg5RjsKKwlpbnQgSUZfSUNNUE5FID0gMHhBMDsKKwlpbnQgSUZfSUNNUExUID0gMHhBMTsKKwlpbnQgSUZfSUNNUEdFID0gMHhBMjsKKwlpbnQgSUZfSUNNUEdUID0gMHhBMzsKKwlpbnQgSUZfSUNNUExFID0gMHhBNDsKKwlpbnQgSUZfQUNNUEVRID0gMHhBNTsKKwlpbnQgSUZfQUNNUE5FID0gMHhBNjsKKwlpbnQgR09UTyA9IDB4QTc7CisJaW50IEpTUiA9IDB4QTg7CisJaW50IFJFVCA9IDB4QTk7CisJaW50IFRBQkxFU1dJVENIID0gMHhBQTsKKwlpbnQgTE9PS1VQU1dJVENIID0gMHhBQjsKKwlpbnQgSVJFVFVSTiA9IDB4QUM7CisJaW50IExSRVRVUk4gPSAweEFEOworCWludCBGUkVUVVJOID0gMHhBRTsKKwlpbnQgRFJFVFVSTiA9IDB4QUY7CisJaW50IEFSRVRVUk4gPSAweEIwOworCWludCBSRVRVUk4gPSAweEIxOworCWludCBHRVRTVEFUSUMgPSAweEIyOworCWludCBQVVRTVEFUSUMgPSAweEIzOworCWludCBHRVRGSUVMRCA9IDB4QjQ7CisJaW50IFBVVEZJRUxEID0gMHhCNTsKKwlpbnQgSU5WT0tFVklSVFVBTCA9IDB4QjY7CisJaW50IElOVk9LRVNQRUNJQUwgPSAweEI3OworCWludCBJTlZPS0VTVEFUSUMgPSAweEI4OworCWludCBJTlZPS0VJTlRFUkZBQ0UgPSAweEI5OworCWludCBORVcgPSAweEJCOworCWludCBORVdBUlJBWSA9IDB4QkM7CisJaW50IEFORVdBUlJBWSA9IDB4QkQ7CisJaW50IEFSUkFZTEVOR1RIID0gMHhCRTsKKwlpbnQgQVRIUk9XID0gMHhCRjsKKwlpbnQgQ0hFQ0tDQVNUID0gMHhDMDsKKwlpbnQgSU5TVEFOQ0VPRiA9IDB4QzE7CisJaW50IE1PTklUT1JFTlRFUiA9IDB4QzI7CisJaW50IE1PTklUT1JFWElUID0gMHhDMzsKKwlpbnQgV0lERSA9IDB4QzQ7CisJaW50IE1VTFRJQU5FV0FSUkFZID0gMHhDNTsKKwlpbnQgSUZOVUxMID0gMHhDNjsKKwlpbnQgSUZOT05OVUxMID0gMHhDNzsKKwlpbnQgR09UT19XID0gMHhDODsKKwlpbnQgSlNSX1cgPSAweEM5OworCisJaW50IEJSRUFLUE9JTlQgPSAweENBOworCWludCBJTVBERVAxID0gMHhGRTsKKwlpbnQgSU1QREVQMiA9IDB4RkY7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTb3VyY2VBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNvdXJjZUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2YwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lTb3VyY2VBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOworCisvKioKKyAqIERlc2NyaXB0aW9uIG9mIGEgc291cmNlIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gdGhlIEpWTSAKKyAqIHNwZWNpZmljYXRpb25zLgorICogCisgKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gCisgKiAgCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUF0dHJpYnV0ZSBleHRlbmRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgeworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIHNvdXJjZSBmaWxlIGluZGV4IG9mIHRoaXMgYXR0cmlidXRlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBmaWxlIGluZGV4IG9mIHRoaXMgYXR0cmlidXRlCisJICovCisJaW50IGdldFNvdXJjZUZpbGVJbmRleCgpOworCisJLyoqCisJICogQW5zd2VyIGJhY2sgdGhlIHNvdXJjZSBmaWxlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisJICogCisJICogQHJldHVybiB0aGUgc291cmNlIGZpbGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZQorCSAqLworCWNoYXJbXSBnZXRTb3VyY2VGaWxlTmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL09wY29kZVN0cmluZ1ZhbHVlcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9PcGNvZGVTdHJpbmdWYWx1ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBkMzdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9PcGNvZGVTdHJpbmdWYWx1ZXMuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBlYWNoIG9wY29kZSBtbmVtb25pYyBhY2NvcmRpbmcgdG8gdGhlIEpWTSBzcGVjaWZpY2F0aW9ucy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqICAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIE9wY29kZVN0cmluZ1ZhbHVlcyBpbXBsZW1lbnRzIElPcGNvZGVNbmVtb25pY3MgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCWVRFQ09ERV9OQU1FUyA9IG5ldyBTdHJpbmdbMjU2XTsKKwlzdGF0aWMgeworCQlCWVRFQ09ERV9OQU1FU1tOT1BdID0gIm5vcCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQUNPTlNUX05VTExdID0gImFjb25zdF9udWxsIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJQ09OU1RfTTFdID0gImljb25zdF9tMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUNPTlNUXzBdID0gImljb25zdF8wIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJQ09OU1RfMV0gPSAiaWNvbnN0XzEiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lDT05TVF8yXSA9ICJpY29uc3RfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUNPTlNUXzNdID0gImljb25zdF8zIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJQ09OU1RfNF0gPSAiaWNvbnN0XzQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lDT05TVF81XSA9ICJpY29uc3RfNSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTENPTlNUXzBdID0gImxjb25zdF8wIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMQ09OU1RfMV0gPSAibGNvbnN0XzEiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0ZDT05TVF8wXSA9ICJmY29uc3RfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkNPTlNUXzFdID0gImZjb25zdF8xIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGQ09OU1RfMl0gPSAiZmNvbnN0XzIiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0RDT05TVF8wXSA9ICJkY29uc3RfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRENPTlNUXzFdID0gImRjb25zdF8xIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tCSVBVU0hdID0gImJpcHVzaCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbU0lQVVNIXSA9ICJzaXB1c2giOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xEQ10gPSAibGRjIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMRENfV10gPSAibGRjX3ciOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xEQzJfV10gPSAibGRjMl93IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJTE9BRF0gPSAiaWxvYWQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xMT0FEXSA9ICJsbG9hZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkxPQURdID0gImZsb2FkIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tETE9BRF0gPSAiZGxvYWQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0FMT0FEXSA9ICJhbG9hZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUxPQURfMF0gPSAiaWxvYWRfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUxPQURfMV0gPSAiaWxvYWRfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUxPQURfMl0gPSAiaWxvYWRfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUxPQURfM10gPSAiaWxvYWRfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTExPQURfMF0gPSAibGxvYWRfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTExPQURfMV0gPSAibGxvYWRfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTExPQURfMl0gPSAibGxvYWRfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTExPQURfM10gPSAibGxvYWRfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkxPQURfMF0gPSAiZmxvYWRfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkxPQURfMV0gPSAiZmxvYWRfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkxPQURfMl0gPSAiZmxvYWRfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkxPQURfM10gPSAiZmxvYWRfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRExPQURfMF0gPSAiZGxvYWRfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRExPQURfMV0gPSAiZGxvYWRfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRExPQURfMl0gPSAiZGxvYWRfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRExPQURfM10gPSAiZGxvYWRfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQUxPQURfMF0gPSAiYWxvYWRfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQUxPQURfMV0gPSAiYWxvYWRfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQUxPQURfMl0gPSAiYWxvYWRfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQUxPQURfM10gPSAiYWxvYWRfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUFMT0FEXSA9ICJpYWxvYWQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xBTE9BRF0gPSAibGFsb2FkIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGQUxPQURdID0gImZhbG9hZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbREFMT0FEXSA9ICJkYWxvYWQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0FBTE9BRF0gPSAiYWFsb2FkIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tCQUxPQURdID0gImJhbG9hZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQ0FMT0FEXSA9ICJjYWxvYWQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW1NBTE9BRF0gPSAic2Fsb2FkIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJU1RPUkVdID0gImlzdG9yZSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNUT1JFXSA9ICJsc3RvcmUiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0ZTVE9SRV0gPSAiZnN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tEU1RPUkVdID0gImRzdG9yZSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQVNUT1JFXSA9ICJhc3RvcmUiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lTVE9SRV8wXSA9ICJpc3RvcmVfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVNUT1JFXzFdID0gImlzdG9yZV8xIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJU1RPUkVfMl0gPSAiaXN0b3JlXzIiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lTVE9SRV8zXSA9ICJpc3RvcmVfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNUT1JFXzBdID0gImxzdG9yZV8wIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMU1RPUkVfMV0gPSAibHN0b3JlXzEiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xTVE9SRV8yXSA9ICJsc3RvcmVfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNUT1JFXzNdID0gImxzdG9yZV8zIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGU1RPUkVfMF0gPSAiZnN0b3JlXzAiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0ZTVE9SRV8xXSA9ICJmc3RvcmVfMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRlNUT1JFXzJdID0gImZzdG9yZV8yIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGU1RPUkVfM10gPSAiZnN0b3JlXzMiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0RTVE9SRV8wXSA9ICJkc3RvcmVfMCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFNUT1JFXzFdID0gImRzdG9yZV8xIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tEU1RPUkVfMl0gPSAiZHN0b3JlXzIiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0RTVE9SRV8zXSA9ICJkc3RvcmVfMyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQVNUT1JFXzBdID0gImFzdG9yZV8wIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tBU1RPUkVfMV0gPSAiYXN0b3JlXzEiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0FTVE9SRV8yXSA9ICJhc3RvcmVfMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQVNUT1JFXzNdID0gImFzdG9yZV8zIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJQVNUT1JFXSA9ICJpYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMQVNUT1JFXSA9ICJsYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGQVNUT1JFXSA9ICJmYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tEQVNUT1JFXSA9ICJkYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tBQVNUT1JFXSA9ICJhYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tCQVNUT1JFXSA9ICJiYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tDQVNUT1JFXSA9ICJjYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tTQVNUT1JFXSA9ICJzYXN0b3JlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tQT1BdID0gInBvcCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbUE9QMl0gPSAicG9wMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFVQXSA9ICJkdXAiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0RVUF9YMV0gPSAiZHVwX3gxIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tEVVBfWDJdID0gImR1cF94MiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFVQMl0gPSAiZHVwMiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFVQMl9YMV0gPSAiZHVwMl94MSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFVQMl9YMl0gPSAiZHVwMl94MiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbU1dBUF0gPSAic3dhcCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUFERF0gPSAiaWFkZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTEFERF0gPSAibGFkZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkFERF0gPSAiZmFkZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbREFERF0gPSAiZGFkZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVNVQl0gPSAiaXN1YiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNVQl0gPSAibHN1YiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRlNVQl0gPSAiZnN1YiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFNVQl0gPSAiZHN1YiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSU1VTF0gPSAiaW11bCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTE1VTF0gPSAibG11bCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRk1VTF0gPSAiZm11bCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRE1VTF0gPSAiZG11bCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSURJVl0gPSAiaWRpdiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTERJVl0gPSAibGRpdiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkRJVl0gPSAiZmRpdiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRERJVl0gPSAiZGRpdiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVJFTV0gPSAiaXJlbSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFJFTV0gPSAibHJlbSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRlJFTV0gPSAiZnJlbSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFJFTV0gPSAiZHJlbSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSU5FR10gPSAiaW5lZyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTE5FR10gPSAibG5lZyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRk5FR10gPSAiZm5lZyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRE5FR10gPSAiZG5lZyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVNITF0gPSAiaXNobCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNITF0gPSAibHNobCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVNIUl0gPSAiaXNociI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFNIUl0gPSAibHNociI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVVTSFJdID0gIml1c2hyIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMVVNIUl0gPSAibHVzaHIiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lBTkRdID0gImlhbmQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0xBTkRdID0gImxhbmQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lPUl0gPSAiaW9yIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMT1JdID0gImxvciI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVhPUl0gPSAiaXhvciI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFhPUl0gPSAibHhvciI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUlOQ10gPSAiaWluYyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSTJMXSA9ICJpMmwiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0kyRl0gPSAiaTJmIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJMkRdID0gImkyZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTDJJXSA9ICJsMmkiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0wyRl0gPSAibDJmIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMMkRdID0gImwyZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRjJJXSA9ICJmMmkiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0YyTF0gPSAiZjJsIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGMkRdID0gImYyZCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRDJJXSA9ICJkMmkiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0QyTF0gPSAiZDJsIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tEMkZdID0gImQyZiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSTJCXSA9ICJpMmIiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0kyQ10gPSAiaTJjIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJMlNdID0gImkycyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTENNUF0gPSAibGNtcCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRkNNUExdID0gImZjbXBsIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tGQ01QR10gPSAiZmNtcGciOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0RDTVBMXSA9ICJkY21wbCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRENNUEddID0gImRjbXBnIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRkVRXSA9ICJpZmVxIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRk5FXSA9ICJpZm5lIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRkxUXSA9ICJpZmx0IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRkdFXSA9ICJpZmdlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRkdUXSA9ICJpZmd0IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRkxFXSA9ICJpZmxlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRl9JQ01QRVFdID0gImlmX2ljbXBlcSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUZfSUNNUE5FXSA9ICJpZl9pY21wbmUiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lGX0lDTVBMVF0gPSAiaWZfaWNtcGx0IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRl9JQ01QR0VdID0gImlmX2ljbXBnZSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUZfSUNNUEdUXSA9ICJpZl9pY21wZ3QiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lGX0lDTVBMRV0gPSAiaWZfaWNtcGxlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRl9BQ01QRVFdID0gImlmX2FjbXBlcSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSUZfQUNNUE5FXSA9ICJpZl9hY21wbmUiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0dPVE9dID0gImdvdG8iOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0pTUl0gPSAianNyIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tSRVRdID0gInJldCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbVEFCTEVTV0lUQ0hdID0gInRhYmxlc3dpdGNoIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tMT09LVVBTV0lUQ0hdID0gImxvb2t1cHN3aXRjaCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSVJFVFVSTl0gPSAiaXJldHVybiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTFJFVFVSTl0gPSAibHJldHVybiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRlJFVFVSTl0gPSAiZnJldHVybiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbRFJFVFVSTl0gPSAiZHJldHVybiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQVJFVFVSTl0gPSAiYXJldHVybiI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbUkVUVVJOXSA9ICJyZXR1cm4iOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0dFVFNUQVRJQ10gPSAiZ2V0c3RhdGljIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tQVVRTVEFUSUNdID0gInB1dHN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbR0VURklFTERdID0gImdldGZpZWxkIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tQVVRGSUVMRF0gPSAicHV0ZmllbGQiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lOVk9LRVZJUlRVQUxdID0gImludm9rZXZpcnR1YWwiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lOVk9LRVNQRUNJQUxdID0gImludm9rZXNwZWNpYWwiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lOVk9LRVNUQVRJQ10gPSAiaW52b2tlc3RhdGljIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJTlZPS0VJTlRFUkZBQ0VdID0gImludm9rZWludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTkVXXSA9ICJuZXciOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW05FV0FSUkFZXSA9ICJuZXdhcnJheSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQU5FV0FSUkFZXSA9ICJhbmV3YXJyYXkiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0FSUkFZTEVOR1RIXSA9ICJhcnJheWxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQVRIUk9XXSA9ICJhdGhyb3ciOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0NIRUNLQ0FTVF0gPSAiY2hlY2tjYXN0IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJTlNUQU5DRU9GXSA9ICJpbnN0YW5jZW9mIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tNT05JVE9SRU5URVJdID0gIm1vbml0b3JlbnRlciI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbTU9OSVRPUkVYSVRdID0gIm1vbml0b3JleGl0IjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tXSURFXSA9ICJ3aWRlIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tNVUxUSUFORVdBUlJBWV0gPSAibXVsdGlhbmV3YXJyYXkiOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0lGTlVMTF0gPSAiaWZudWxsIjsgLy8kTk9OLU5MUy0xJAorCQlCWVRFQ09ERV9OQU1FU1tJRk5PTk5VTExdID0gImlmbm9ubnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbR09UT19XXSA9ICJnb3RvX3ciOyAvLyROT04tTkxTLTEkCisJCUJZVEVDT0RFX05BTUVTW0pTUl9XXSA9ICJqc3JfdyI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbQlJFQUtQT0lOVF0gPSAiYnJlYWtwb2ludCI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSU1QREVQMV0gPSAiaW1wZGVwMSI7IC8vJE5PTi1OTFMtMSQKKwkJQllURUNPREVfTkFNRVNbSU1QREVQMl0gPSAiaW1wZGVwMiI7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL3BhY2thZ2UuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZGNhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE0IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1Byb3ZpZGVzIGEgc2V0IG9mIHRvb2xzIGFuZCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyAuY2xhc3MgZmlsZXMgYW5kIEphdmEgbW9kZWwgZWxlbWVudHMuCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgc2V0IG9mIHRvb2xzIGFuZCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyAuY2xhc3MgZmlsZXMgYW5kIEphdmEgbW9kZWwgZWxlbWVudHMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Fzc2VydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2VmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7CisvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCitwcml2YXRlIEFzc2VydCgpIHsKK30KKy8qKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzCisgKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KKyAqIGlzIHRocm93bi4KKyAqCisgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCisgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKKyAqLworcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7CisJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCit9CisvKiogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcworICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgKiBpcyB0aHJvd24uCisgKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KKyAqCisgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KKyAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAorICovCitwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7CisJaWYgKCFleHByZXNzaW9uKQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOworCXJldHVybiBleHByZXNzaW9uOworfQorLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcworICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgKiAKKyAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KKyAqLworcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7CisJaXNOb3ROdWxsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCit9CisvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzCisgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgorICoKKyAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgorICovCitwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7CisJaWYgKG9iamVjdCA9PSBudWxsKQorCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFV0aWwuYmluZCgiYXNzZXJ0Lm51bGxBcmd1bWVudCIsbWVzc2FnZSkpOyAvLyROT04tTkxTLTEkCit9CisvKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzCisgKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAqCisgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCisgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCisgKi8KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7CisJcmV0dXJuIGlzVHJ1ZShleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKKyAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgorICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCisgKgorICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KKyAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCisgKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCisgKi8KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgeworCWlmICghZXhwcmVzc2lvbikKKwkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihVdGlsLmJpbmQoImFzc2VydC5mYWlsZWQiLCBtZXNzYWdlKSk7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gZXhwcmVzc2lvbjsKK30KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7CisJCX0KKwkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7CisJCQlzdXBlcihkZXRhaWwpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Jhc2ljQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWZhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworLyoqCisgKiBBIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+CisgKiBmb3IgdXNlIGluIHRoZSA8Y29kZT5Tb3VyY2VNYXBwZXI8L2NvZGU+LgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0CisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY0NvbXBpbGF0aW9uVW5pdCBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXQgeworCXByb3RlY3RlZCBjaGFyW10gY29udGVudHM7CisJcHJvdGVjdGVkIGNoYXJbXSBmaWxlTmFtZTsKKwlwcm90ZWN0ZWQgY2hhcltdW10gcGFja2FnZU5hbWU7CisJcHJvdGVjdGVkIGNoYXJbXSBtYWluVHlwZU5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZzsKKwkKK3B1YmxpYyBCYXNpY0NvbXBpbGF0aW9uVW5pdChjaGFyW10gY29udGVudHMsIGNoYXJbXVtdIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBlbmNvZGluZykgeworCXRoaXMuY29udGVudHMgPSBjb250ZW50czsKKwl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWUudG9DaGFyQXJyYXkoKTsKKwl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisKKwlpbnQgc3RhcnQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMTsgLy8kTk9OLU5MUy0xJAorCWlmIChzdGFydCA9PSAwIHx8IHN0YXJ0IDwgZmlsZU5hbWUubGFzdEluZGV4T2YoIlxcIikpIC8vJE5PTi1OTFMtMSQKKwkJc3RhcnQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSArIDE7IC8vJE5PTi1OTFMtMSQKKworCWludCBlbmQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCisJaWYgKGVuZCA9PSAtMSkKKwkJZW5kID0gZmlsZU5hbWUubGVuZ3RoKCk7CisKKwl0aGlzLm1haW5UeXBlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKS50b0NoYXJBcnJheSgpOworCXRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKK30KK3B1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJaWYgKHRoaXMuY29udGVudHMgIT0gbnVsbCkKKwkJcmV0dXJuIHRoaXMuY29udGVudHM7ICAgLy8gYW5zd2VyIHRoZSBjYWNoZWQgc291cmNlCisKKwkvLyBvdGhlcndpc2UgcmV0cmlldmUgaXQKKwl0cnkgeworCQlyZXR1cm4gVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobmV3IEZpbGUobmV3IFN0cmluZyhmaWxlTmFtZSkpLCB0aGlzLmVuY29kaW5nKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBuZXcgY2hhclswXTsKK30KK3B1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Cit9CitwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5tYWluVHlwZU5hbWU7Cit9CitwdWJsaWMgY2hhcltdW10gZ2V0UGFja2FnZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJcmV0dXJuICJDb21waWxhdGlvblVuaXQ6ICIrbmV3IFN0cmluZyhmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDBhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlGaWVsZC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CisKKy8qKgorICogQHNlZSBJRmllbGQKKyAqLworCisvKiBwYWNrYWdlICovIGNsYXNzIEJpbmFyeUZpZWxkIGV4dGVuZHMgQmluYXJ5TWVtYmVyIGltcGxlbWVudHMgSUZpZWxkIHsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgaGFuZGxlIHRvIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBzcGVjaWZpZWQgdHlwZS4gCisgKi8KK3Byb3RlY3RlZCBCaW5hcnlGaWVsZChJVHlwZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoRklFTEQsIHBhcmVudCwgbmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSUZpZWxkCisgKi8KK3B1YmxpYyBPYmplY3QgZ2V0Q29uc3RhbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQmluYXJ5RmllbGQgaW5mbyA9IChJQmluYXJ5RmllbGQpIGdldFJhd0luZm8oKTsKKwlyZXR1cm4gY29udmVydENvbnN0YW50KGluZm8uZ2V0Q29uc3RhbnQoKSk7Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgaW50IGdldEZsYWdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIGluZm8uZ2V0TW9kaWZpZXJzKCk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCisgKi8KK3Byb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7CisJcmV0dXJuIEphdmFFbGVtZW50LkpFTV9GSUVMRDsKK30KKy8qKgorICogQHNlZSBJRmllbGQKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIG5ldyBTdHJpbmcoQ2xhc3NGaWxlLnRyYW5zbGF0ZWROYW1lKGluZm8uZ2V0VHlwZU5hbWUoKSkpOworfQorLyoqCisgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgaWYgKGluZm8gPT0gTk9fSU5GTykgeworCQlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyh0aGlzLmdldFR5cGVTaWduYXR1cmUoKSkpOworCQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlidWZmZXIuYXBwZW5kKCI8SmF2YU1vZGVsRXhjZXB0aW9uIGluIHRvU3RyaW5nIG9mICIgKyBnZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZW1iZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU4OTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgQmluYXJ5IG1lbWJlciBoYW5kbGVzLgorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5TWVtYmVyIGV4dGVuZHMgTWVtYmVyIHsKKy8qKgorICogQ29uc3RydWN0cyBhIGJpbmFyeSBtZW1iZXIuCisgKi8KK3Byb3RlY3RlZCBCaW5hcnlNZW1iZXIoaW50IHR5cGUsIElKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIodHlwZSwgcGFyZW50LCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlTWFuaXB1bGF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIGNvcHkoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCB0aGlzKSk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVJlZmVyZW5jZQorICovCitwdWJsaWMgSVNvdXJjZVJhbmdlIGdldE5hbWVSYW5nZSgpIHsKKwlTb3VyY2VNYXBwZXIgbWFwcGVyPSBnZXRTb3VyY2VNYXBwZXIoKTsKKwlpZiAobWFwcGVyICE9IG51bGwpIHsKKwkJcmV0dXJuIG1hcHBlci5nZXROYW1lUmFuZ2UodGhpcyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFNvdXJjZU1hcHBlci5mZ1Vua25vd25SYW5nZTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVJlZmVyZW5jZQorICovCitwdWJsaWMgSVNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU291cmNlTWFwcGVyIG1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7CisJaWYgKG1hcHBlciAhPSBudWxsKSB7CisJCXJldHVybiBtYXBwZXIuZ2V0U291cmNlUmFuZ2UodGhpcyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFNvdXJjZU1hcHBlci5mZ1Vua25vd25SYW5nZTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3R1cmVLbm93bigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiAoKElKYXZhRWxlbWVudClnZXRPcGVuYWJsZVBhcmVudCgpKS5pc1N0cnVjdHVyZUtub3duKCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgdGhpcykpOworfQorLyoqCisgKiBPcGVucyB0aGlzIGVsZW1lbnQgYW5kIGFsbCBwYXJlbnRzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IG9wZW4uCisgKgorICogQGV4Y2VwdGlvbiBOb3RQcmVzZW50RXhjZXB0aW9uIHRoaXMgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvciBhY2Nlc3NhYmxlCisgKi8KK3Byb3RlY3RlZCB2b2lkIG9wZW5IaWVyYXJjaHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlPcGVuYWJsZSBvcGVuYWJsZVBhcmVudCA9IChPcGVuYWJsZSlnZXRPcGVuYWJsZVBhcmVudCgpOworCWlmIChvcGVuYWJsZVBhcmVudCAhPSBudWxsKSB7CisJCUphdmFFbGVtZW50SW5mbyBvcGVuYWJsZVBhcmVudEluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKChJSmF2YUVsZW1lbnQpIG9wZW5hYmxlUGFyZW50KTsKKwkJaWYgKG9wZW5hYmxlUGFyZW50SW5mbyA9PSBudWxsKSB7CisJCQlvcGVuYWJsZVBhcmVudC5vcGVuV2hlbkNsb3NlZChudWxsKTsKKwkJCW9wZW5hYmxlUGFyZW50SW5mbyA9IChKYXZhRWxlbWVudEluZm8pIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZm8oKElKYXZhRWxlbWVudCkgb3BlbmFibGVQYXJlbnQpOworCQl9CisJCUNsYXNzRmlsZUluZm8gY2ZpID0gKENsYXNzRmlsZUluZm8pIG9wZW5hYmxlUGFyZW50SW5mbzsKKwkJY2ZpLmdldEJpbmFyeUNoaWxkcmVuKCk7IC8vIGZvcmNlcyB0aGUgaW5pdGlhbGl6YXRpb24KKwl9Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCB0aGlzKSk7Cit9CisvKioKKyAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWxlbWVudC4KKyAqIFRocm93cyBhbiBleGNlcHRpb24gYXMgdGhpcyBlbGVtZW50IGlzIHJlYWQgb25seS4KKyAqLworcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNvbnRlbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgdGhpcykpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIzYmQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWV0aG9kLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CisKKy8qKgorICogQHNlZSBJTWV0aG9kCisgKi8KKworLyogcGFja2FnZSAqLyBjbGFzcyBCaW5hcnlNZXRob2QgZXh0ZW5kcyBCaW5hcnlNZW1iZXIgaW1wbGVtZW50cyBJTWV0aG9kIHsKKwkKKwljbGFzcyBEZWNvZGVQYXJhbWV0ZXJzTmFtZXMgZXh0ZW5kcyBTb3VyY2VFbGVtZW50UmVxdWVzdG9yQWRhcHRlciB7CisJCQlTdHJpbmdbXSBwYXJhbWV0ZXJzTmFtZXM7CisJCQorCQkJcHVibGljIHZvaWQgZW50ZXJNZXRob2QoCisJCQkJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJCQkJaW50IG1vZGlmaWVycywKKwkJCQljaGFyW10gcmV0dXJuVHlwZSwKKwkJCQljaGFyW10gbmFtZSwKKwkJCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCQkJCWludCBuYW1lU291cmNlRW5kLAorCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCQkJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKSB7CisJCQkJCWlmIChwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7CisJCQkJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyTmFtZXMubGVuZ3RoOworCQkJCQkJdGhpcy5wYXJhbWV0ZXJzTmFtZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJdGhpcy5wYXJhbWV0ZXJzTmFtZXNbaV0gPSBuZXcgU3RyaW5nKHBhcmFtZXRlck5hbWVzW2ldKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCXB1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoCisJCQkJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJCQkJaW50IG1vZGlmaWVycywKKwkJCQljaGFyW10gbmFtZSwKKwkJCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCQkJCWludCBuYW1lU291cmNlRW5kLAorCQkJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCQkJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKSB7CisJCQkJCWlmIChwYXJhbWV0ZXJOYW1lcyAhPSBudWxsKSB7CisJCQkJCQlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyTmFtZXMubGVuZ3RoOworCQkJCQkJdGhpcy5wYXJhbWV0ZXJzTmFtZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJdGhpcy5wYXJhbWV0ZXJzTmFtZXNbaV0gPSBuZXcgU3RyaW5nKHBhcmFtZXRlck5hbWVzW2ldKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyc05hbWVzKCkgeworCQkJCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzTmFtZXM7CisJCQkJfQorCX0KKworCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBzaWduYXR1cmVzIG9mIHRoZSBtZXRob2QgLSBzdG9yZWQgbG9jYWxseQorCSAqIHRvIHBlcmZvcm0gZXF1YWxpdHkgdGVzdC4gPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIG5vCisJICogcGFyYW1ldGVycy4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZlBhcmFtZXRlclR5cGVzOworCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgbmFtZXMgZm9yIHRoZSBtZXRob2QuCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1tdIGZQYXJhbWV0ZXJOYW1lczsKKworCS8qKgorCSAqIEFuIGVtcHR5IGxpc3Qgb2YgU3RyaW5ncworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gZmdFbXB0eUxpc3Q9IG5ldyBTdHJpbmdbXSB7fTsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZkV4Y2VwdGlvblR5cGVzOworCXByb3RlY3RlZCBTdHJpbmcgZlJldHVyblR5cGU7Citwcm90ZWN0ZWQgQmluYXJ5TWV0aG9kKElUeXBlIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzKSB7CisJc3VwZXIoTUVUSE9ELCBwYXJlbnQsIG5hbWUpOworCUFzc2VydC5pc1RydWUobmFtZS5pbmRleE9mKCcuJykgPT0gLTEpOworCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7CisJCWZQYXJhbWV0ZXJUeXBlcz0gZmdFbXB0eUxpc3Q7CisJfSBlbHNlIHsKKwkJZlBhcmFtZXRlclR5cGVzPSBwYXJhbWV0ZXJUeXBlczsKKwl9Cit9CitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pICYmIFV0aWwuZXF1YWxBcnJheXNPck51bGwoZlBhcmFtZXRlclR5cGVzLCAoKEJpbmFyeU1ldGhvZClvKS5mUGFyYW1ldGVyVHlwZXMpOworfQorLyoqCisgKiBAc2VlIElNZXRob2QKKyAqLworcHVibGljIFN0cmluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGZFeGNlcHRpb25UeXBlcyA9PSBudWxsKSB7CisJCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJCWNoYXJbXVtdIGVUeXBlTmFtZXMgPSBpbmZvLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpOworCQlpZiAoZVR5cGVOYW1lcyA9PSBudWxsIHx8IGVUeXBlTmFtZXMubGVuZ3RoID09IDApIHsKKwkJCWZFeGNlcHRpb25UeXBlcyA9IGZnRW1wdHlMaXN0OworCQl9IGVsc2UgeworCQkJZVR5cGVOYW1lcyA9IENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZXMoZVR5cGVOYW1lcyk7CisJCQlmRXhjZXB0aW9uVHlwZXMgPSBuZXcgU3RyaW5nW2VUeXBlTmFtZXMubGVuZ3RoXTsKKwkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBlVHlwZU5hbWVzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJLy8gMUcwMUhSWTogSVRQSkNPUkU6V0lOTlQgLSBtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZSBub3QgaW4gY29ycmVjdCBmb3JtYXQKKwkJCQlpbnQgbmFtZUxlbmd0aCA9IGVUeXBlTmFtZXNbal0ubGVuZ3RoOworCQkJCWNoYXJbXSBjb252ZXJ0ZWROYW1lID0gbmV3IGNoYXJbbmFtZUxlbmd0aCArIDJdOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZVR5cGVOYW1lc1tqXSwgMCwgY29udmVydGVkTmFtZSwgMSwgbmFtZUxlbmd0aCk7CisJCQkJY29udmVydGVkTmFtZVswXSA9ICdMJzsKKwkJCQljb252ZXJ0ZWROYW1lW25hbWVMZW5ndGggKyAxXSA9ICc7JzsKKwkJCQlmRXhjZXB0aW9uVHlwZXNbal0gPSBuZXcgU3RyaW5nKGNvbnZlcnRlZE5hbWUpOworCQkJfQorCQl9CisJfQorCXJldHVybiBmRXhjZXB0aW9uVHlwZXM7Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgaW50IGdldEZsYWdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldFJhd0luZm8oKTsKKwlyZXR1cm4gaW5mby5nZXRNb2RpZmllcnMoKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRIYW5kbGVNZW1lbnRvKCkgeworCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigoKEphdmFFbGVtZW50KSBnZXRQYXJlbnQoKSkuZ2V0SGFuZGxlTWVtZW50bygpKTsKKwlidWZmLmFwcGVuZChnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkpOworCWJ1ZmYuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCWZvciAoaW50IGkgPSAwOyBpIDwgZlBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmYuYXBwZW5kKGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSk7CisJCWJ1ZmYuYXBwZW5kKGZQYXJhbWV0ZXJUeXBlc1tpXSk7CisJfQorCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCisgKi8KK3Byb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7CisJcmV0dXJuIEphdmFFbGVtZW50LkpFTV9NRVRIT0Q7Cit9CisvKioKKyAqIEBzZWUgSU1ldGhvZAorICovCitwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1ldGVycygpIHsKKwlyZXR1cm4gZlBhcmFtZXRlclR5cGVzID09IG51bGwgPyAwIDogZlBhcmFtZXRlclR5cGVzLmxlbmd0aDsKK30KKy8qKgorICogQHNlZSBJTWV0aG9kCisgKiBMb29rIGZvciBzb3VyY2UgYXR0YWNobWVudCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSB0aGUgYWN0dWFsIHBhcmFtZXRlciBuYW1lcyBhcyBzdGF0ZWQgaW4gc291cmNlLgorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZlBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKKworCQkvLyBmb3JjZSBzb3VyY2UgbWFwcGluZyBpZiBub3QgYWxyZWFkeSBkb25lCisJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGdldFBhcmVudCgpOworCQlTb3VyY2VNYXBwZXIgbWFwcGVyID0gZ2V0U291cmNlTWFwcGVyKCk7CisJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBtYXBwZXIuZ2V0TWV0aG9kUGFyYW1ldGVyTmFtZXModGhpcyk7CisJCQkKKwkJCS8vIG1hcCBzb3VyY2UgYW5kIHRyeSB0byBmaW5kIHBhcmFtZXRlciBuYW1lcworCQkJaWYocGFyYW1ldGVyTmFtZXMgPT0gbnVsbCkgeworCQkJCWNoYXJbXSBzb3VyY2UgPSBtYXBwZXIuZmluZFNvdXJjZSh0eXBlKTsKKwkJCQlpZiAoc291cmNlICE9IG51bGwpeworCQkJCQltYXBwZXIubWFwU291cmNlKHR5cGUsIHNvdXJjZSk7CisJCQkJfQorCQkJCXBhcmFtZXRlck5hbWVzID0gbWFwcGVyLmdldE1ldGhvZFBhcmFtZXRlck5hbWVzKHRoaXMpOworCQkJfQorCQkJCisJCQkvLyBpZiBwYXJhbWV0ZXIgbmFtZXMgZXhpc3QsIGNvbnZlcnQgcGFyYW1ldGVyIG5hbWVzIHRvIFN0cmluZyBhcnJheQorCQkJaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCkgeworCQkJCWZQYXJhbWV0ZXJOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyTmFtZXMubGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWZQYXJhbWV0ZXJOYW1lc1tpXSA9IG5ldyBTdHJpbmcocGFyYW1ldGVyTmFtZXNbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBpZiBzdGlsbCBubyBwYXJhbWV0ZXIgbmFtZXMsIHByb2R1Y2UgZmFrZSBvbmVzCisJCWlmIChmUGFyYW1ldGVyTmFtZXMgPT0gbnVsbCkgeworCQkJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldFJhd0luZm8oKTsKKwkJCWludCBwYXJhbUNvdW50ID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlckNvdW50KG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwkJCWZQYXJhbWV0ZXJOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1Db3VudF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgeworCQkJCWZQYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCXJldHVybiBmUGFyYW1ldGVyTmFtZXM7Cit9CisvKioKKyAqIEBzZWUgSU1ldGhvZAorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CisJcmV0dXJuIGZQYXJhbWV0ZXJUeXBlczsKK30KKy8qKgorICogQHNlZSBJTWV0aG9kCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJaWYgKGZSZXR1cm5UeXBlID09IG51bGwpIHsKKwkJU3RyaW5nIHJldHVyblR5cGU9IFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwkJZlJldHVyblR5cGU9IG5ldyBTdHJpbmcoQ2xhc3NGaWxlLnRyYW5zbGF0ZWROYW1lKHJldHVyblR5cGUudG9DaGFyQXJyYXkoKSkpOworCX0KKwlyZXR1cm4gZlJldHVyblR5cGU7Cit9CisvKioKKyAqIEBzZWUgSU1ldGhvZAorICovCitwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpOworfQorLyoqCisgKiBAc2VlIElNZXRob2QKKyAqLworcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIGluZm8uaXNDb25zdHJ1Y3RvcigpOworfQorLyoqCisgKiBAc2VlIElNZXRob2QjaXNNYWluTWV0aG9kKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNNYWluTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMuaXNNYWluTWV0aG9kKHRoaXMpOworfQorCisvKioKKyAqIEBzZWUgSU1ldGhvZCNpc1NpbWlsYXIoSU1ldGhvZCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNTaW1pbGFyKElNZXRob2QgbWV0aG9kKSB7CisJcmV0dXJuIAorCQl0aGlzLmFyZVNpbWlsYXJNZXRob2RzKAorCQkJdGhpcy5nZXRFbGVtZW50TmFtZSgpLCB0aGlzLmdldFBhcmFtZXRlclR5cGVzKCksCisJCQltZXRob2QuZ2V0RWxlbWVudE5hbWUoKSwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCksCisJCQludWxsKTsKK30KKworLyoqCisgKi8KK3B1YmxpYyBTdHJpbmcgcmVhZGFibGVOYW1lKCkgeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIucmVhZGFibGVOYW1lKCkpOworCWJ1ZmZlci5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAorCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gdGhpcy5nZXRQYXJhbWV0ZXJUeXBlcygpOworCWludCBsZW5ndGg7CisJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwgJiYgKGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgPiAwKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVzW2ldKSk7CisJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgaWYgKGluZm8gPT0gTk9fSU5GTykgeworCQlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlpZiAoRmxhZ3MuaXNTdGF0aWModGhpcy5nZXRGbGFncygpKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKCF0aGlzLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKHRoaXMuZ2V0UmV0dXJuVHlwZSgpKSk7CisJCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEVsZW1lbnROYW1lKCkpOworCQkJYnVmZmVyLmFwcGVuZCgnKCcpOworCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSB0aGlzLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCQlpbnQgbGVuZ3RoOworCQkJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwgJiYgKGxlbmd0aCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgPiAwKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSkpOworCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxKYXZhTW9kZWxFeGNlcHRpb24gaW4gdG9TdHJpbmcgb2YgIiArIGdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZDU3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGUuamF2YQpAQCAtMCwwICsxLDU0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5Db21wbGV0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBQYXJlbnQgaXMgYW4gSUNsYXNzRmlsZS4KKyAqCisgKiBAc2VlIElUeXBlCisgKi8KKworcHVibGljIGNsYXNzIEJpbmFyeVR5cGUgZXh0ZW5kcyBCaW5hcnlNZW1iZXIgaW1wbGVtZW50cyBJVHlwZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpZWxkW10gTk9fRklFTERTID0gbmV3IElGaWVsZFswXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWV0aG9kW10gTk9fTUVUSE9EUyA9IG5ldyBJTWV0aG9kWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElUeXBlW10gTk9fVFlQRVMgPSBuZXcgSVR5cGVbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUluaXRpYWxpemVyW10gTk9fSU5JVElBTElaRVJTID0gbmV3IElJbml0aWFsaXplclswXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19TVFJJTkdTID0gbmV3IFN0cmluZ1swXTsKKwkKK3Byb3RlY3RlZCBCaW5hcnlUeXBlKElKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoVFlQRSwgcGFyZW50LCBuYW1lKTsKKwlBc3NlcnQuaXNUcnVlKG5hbWUuaW5kZXhPZignLicpID09IC0xKTsKK30KKy8qKgorICogQHNlZSBJT3BlbmFibGUjY2xvc2UoKQorICovCitwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQorCU9iamVjdCBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucGVla0F0SW5mbyh0aGlzKTsKKwlpZiAoaW5mbyAhPSBudWxsKSB7CisJCUNsYXNzRmlsZUluZm8gY2ZpID0gZ2V0Q2xhc3NGaWxlSW5mbygpOworCQlpZiAoY2ZpLmhhc1JlYWRCaW5hcnlDaGlsZHJlbigpKSB7CisJCQl0cnkgeworCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IHNpemU7ICsraSkgeworCQkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CisJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJpbmFyeVR5cGUpIHsKKwkJCQkJCSgoSU9wZW5hYmxlKWNoaWxkLmdldFBhcmVudCgpKS5jbG9zZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hpbGQuY2xvc2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJY2xvc2luZyhpbmZvKTsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlSW5mbyh0aGlzKTsKKwkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IFBhY2thZ2UgY2FjaGUgc2l6ZSA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5wa2dTaXplKCkpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IE9wZW5hYmxlIGNhY2hlIGZpbGxpbmcgcmF0aW8gPSAiICsgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2FjaGUub3BlbmFibGVGaWxsaW5nUmF0aW8oKSArICIlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKwl9Cit9CisvKioKKyAqIFJlbW92ZSBteSBjYWNoZWQgY2hpbGRyZW4gZnJvbSB0aGUgSmF2YSBNb2RlbAorICovCitwcm90ZWN0ZWQgdm9pZCBjbG9zaW5nKE9iamVjdCBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDTE9TSU5HIEVsZW1lbnQgKCIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkrIik6ICIgKyB0aGlzLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJfQorCUNsYXNzRmlsZUluZm8gY2ZpID0gZ2V0Q2xhc3NGaWxlSW5mbygpOworCWNmaS5yZW1vdmVCaW5hcnlDaGlsZHJlbigpOworCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IFBhY2thZ2UgY2FjaGUgc2l6ZSA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5wa2dTaXplKCkpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gT3BlbmFibGUgY2FjaGUgZmlsbGluZyByYXRpbyA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5vcGVuYWJsZUZpbGxpbmdSYXRpbygpICsgIiUiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwl9Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjY29kZUNvbXBsZXRlKGNoYXJbXSwgaW50LCBpbnQsIGNoYXJbXVtdLCBjaGFyW11bXSwgaW50W10sIGJvb2xlYW4sIElDb21wbGV0aW9uUmVxdWVzdG9yKQorICovCitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoY2hhcltdIHNuaXBwZXQsaW50IGluc2VydGlvbixpbnQgcG9zaXRpb24sY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyxjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycyxib29sZWFuIGlzU3RhdGljLElDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHJlcXVlc3RvciA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJjb2RlQXNzaXN0Lm51bGxSZXF1ZXN0b3IiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9ICgoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCkpLmdldE5hbWVMb29rdXAoKTsKKwlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCBuZXcgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIocmVxdWVzdG9yLG5hbWVMb29rdXApLCBKYXZhQ29yZS5nZXRPcHRpb25zKCkpOworCQorCVN0cmluZyBzb3VyY2UgPSBnZXRDbGFzc0ZpbGUoKS5nZXRTb3VyY2UoKTsKKwlpZiAoc291cmNlICE9IG51bGwgJiYgaW5zZXJ0aW9uID4gLTEgJiYgaW5zZXJ0aW9uIDwgc291cmNlLmxlbmd0aCgpKSB7CisJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsgCisJCQorCQljaGFyW10gcHJlZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc291cmNlLnN1YnN0cmluZygwLCBpbnNlcnRpb24pLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW117J3snfSk7CisJCWNoYXJbXSBzdWZmaXggPSAgQ2hhck9wZXJhdGlvbi5jb25jYXQobmV3IGNoYXJbXXsnfSd9LCBzb3VyY2Uuc3Vic3RyaW5nKGluc2VydGlvbikudG9DaGFyQXJyYXkoKSk7CisJCWNoYXJbXSBmYWtlU291cmNlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocHJlZml4LCBzbmlwcGV0LCBzdWZmaXgpOworCQkKKwkJQmFzaWNDb21waWxhdGlvblVuaXQgY3UgPSAKKwkJCW5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdCgKKwkJCQlmYWtlU291cmNlLCAKKwkJCQludWxsLAorCQkJCWdldEVsZW1lbnROYW1lKCksCisJCQkJZW5jb2RpbmcpOyAKKworCQllbmdpbmUuY29tcGxldGUoY3UsIHByZWZpeC5sZW5ndGggKyBwb3NpdGlvbiwgcHJlZml4Lmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJZW5naW5lLmNvbXBsZXRlKHRoaXMsIHNuaXBwZXQsIHBvc2l0aW9uLCBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCBsb2NhbFZhcmlhYmxlTmFtZXMsIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIGlzU3RhdGljKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjY3JlYXRlRmllbGQoU3RyaW5nLCBJSmF2YUVsZW1lbnQsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyBJRmllbGQgY3JlYXRlRmllbGQoU3RyaW5nIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIHRoaXMpKTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNjcmVhdGVJbml0aWFsaXplcihTdHJpbmcsIElKYXZhRWxlbWVudCwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIElJbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcihTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgdGhpcykpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2NyZWF0ZU1ldGhvZChTdHJpbmcsIElKYXZhRWxlbWVudCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIElNZXRob2QgY3JlYXRlTWV0aG9kKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCB0aGlzKSk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjY3JlYXRlVHlwZShTdHJpbmcsIElKYXZhRWxlbWVudCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoU3RyaW5nIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIHRoaXMpKTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNmaW5kTWV0aG9kcyhJTWV0aG9kKQorICovCitwdWJsaWMgSU1ldGhvZFtdIGZpbmRNZXRob2RzKElNZXRob2QgbWV0aG9kKSB7CisJdHJ5IHsKKwkJcmV0dXJuIHRoaXMuZmluZE1ldGhvZHMobWV0aG9kLCB0aGlzLmdldE1ldGhvZHMoKSk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJLy8gaWYgdHlwZSBkb2Vzbid0IGV4aXN0LCBubyBtYXRjaGluZyBtZXRob2QgY2FuIGV4aXN0CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJUGFyZW50I2dldENoaWxkcmVuKCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJLy8gZW5zdXJlIHByZXNlbnQKKwkvLyBmaXggZm9yIDFGV1dWWVQKKwlpZiAoIWV4aXN0cygpKSB7CisJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwl9CisJLy8gZ2V0IGNoaWxkcmVuCisJQ2xhc3NGaWxlSW5mbyBjZmkgPSBnZXRDbGFzc0ZpbGVJbmZvKCk7CisJcmV0dXJuIGNmaS5nZXRCaW5hcnlDaGlsZHJlbigpOworfQorcHJvdGVjdGVkIENsYXNzRmlsZUluZm8gZ2V0Q2xhc3NGaWxlSW5mbygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUNsYXNzRmlsZSBjZiA9IChDbGFzc0ZpbGUpIGZQYXJlbnQ7CisJcmV0dXJuIChDbGFzc0ZpbGVJbmZvKSBjZi5nZXRFbGVtZW50SW5mbygpOworfQorLyoqCisgKiBAc2VlIElNZW1iZXIjZ2V0RGVjbGFyaW5nVHlwZSgpCisgKi8KK3B1YmxpYyBJVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgeworCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdGhpcy5nZXRDbGFzc0ZpbGUoKTsKKwlpZiAoY2xhc3NGaWxlLmlzT3BlbigpKSB7CisJCXRyeSB7CisJCQljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUgPSAoKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCkpLmdldEVuY2xvc2luZ1R5cGVOYW1lKCk7CisJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkgCWVuY2xvc2luZ1R5cGVOYW1lID0gQ2xhc3NGaWxlLnVucXVhbGlmaWVkTmFtZShlbmNsb3NpbmdUeXBlTmFtZSk7CisJCSAJCisJCQkvLyB3b3JrYXJvdW5kIHByb2JsZW0gd2l0aCBjbGFzcyBmaWxlcyBjb21waWxlZCB3aXRoIGphdmFjIDEuMS4qIAorCQkJLy8gdGhhdCByZXR1cm4gYSBub24tbnVsbCBlbmNsb3NpbmcgdHlwZSBuYW1lIGZvciBsb2NhbCB0eXBlcyBkZWZpbmVkIGluIGFub255bW91cyAoZS5nLiBBJDEkQikKKwkJCWlmIChjbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA+IGVuY2xvc2luZ1R5cGVOYW1lLmxlbmd0aCsxIAorCQkJCQkmJiBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKS5jaGFyQXQoZW5jbG9zaW5nVHlwZU5hbWUubGVuZ3RoKzEpKSkgeworCQkJCXJldHVybiBudWxsOworCQkJfSAKKwkJCQorCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudCgpLmdldENsYXNzRmlsZShuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGVOYW1lKSArICIuY2xhc3MiKS5nZXRUeXBlKCk7IC8vJE5PTi1OTFMtMSQ7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfSBlbHNlIHsKKwkJLy8gY2Fubm90IGFjY2VzcyAuY2xhc3MgZmlsZSB3aXRob3V0IG9wZW5pbmcgaXQgCisJCS8vIGFuZCBnZXREZWNsYXJpbmdUeXBlKCkgaXMgc3VwcG9zZWQgdG8gYmUgYSBoYW5kbGUtb25seSBtZXRob2QsCisJCS8vIHNvIGRlZmF1bHQgdG8gYXNzdW1pbmcgJCBpcyBhbiBlbmNsb3NpbmcgdHlwZSBzZXBhcmF0b3IKKwkJU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKTsKKwkJaW50IGxhc3REb2xsYXIgPSAtMTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzRmlsZU5hbWUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJY2hhciBjID0gY2xhc3NGaWxlTmFtZS5jaGFyQXQoaSk7CisJCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYykgJiYgbGFzdERvbGxhciA9PSBpLTEpIHsKKwkJCQkvLyBhbm9ueW1vdXMgb3IgbG9jYWwgdHlwZQorCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIGlmIChjID09ICckJykgeworCQkJCWxhc3REb2xsYXIgPSBpOworCQkJfQorCQl9CisJCWlmIChsYXN0RG9sbGFyID09IC0xKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBlbmNsb3NpbmdOYW1lID0gY2xhc3NGaWxlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvbGxhcik7CisJCQlTdHJpbmcgZW5jbG9zaW5nQ2xhc3NGaWxlTmFtZSA9IGVuY2xvc2luZ05hbWUgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIAorCQkJCW5ldyBCaW5hcnlUeXBlKAorCQkJCQl0aGlzLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldENsYXNzRmlsZShlbmNsb3NpbmdDbGFzc0ZpbGVOYW1lKSwKKwkJCQkJZW5jbG9zaW5nTmFtZS5zdWJzdHJpbmcoZW5jbG9zaW5nTmFtZS5sYXN0SW5kZXhPZignJCcpKzEpKTsKKwkJfQorCX0KK30KKy8qKgorICogQHNlZSBJVHlwZSNnZXRGaWVsZChTdHJpbmcgbmFtZSkKKyAqLworcHVibGljIElGaWVsZCBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgQmluYXJ5RmllbGQodGhpcywgbmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0RmllbGRzKCkKKyAqLworcHVibGljIElGaWVsZFtdIGdldEZpZWxkcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoRklFTEQpOworCWludCBzaXplOworCWlmICgoc2l6ZSA9IGxpc3Quc2l6ZSgpKSA9PSAwKSB7CisJCXJldHVybiBOT19GSUVMRFM7CisJfSBlbHNlIHsKKwkJSUZpZWxkW10gYXJyYXk9IG5ldyBJRmllbGRbc2l6ZV07CisJCWxpc3QudG9BcnJheShhcnJheSk7CisJCXJldHVybiBhcnJheTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlciNnZXRGbGFncygpCisgKi8KK3B1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIGluZm8uZ2V0TW9kaWZpZXJzKCk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisJcmV0dXJuIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvcikKKyAqLworcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhciBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yKSB7CisJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKKwlpZiAocGFja2FnZU5hbWUuZXF1YWxzKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpKSB7CisJCXJldHVybiBnZXRUeXBlUXVhbGlmaWVkTmFtZShlbmNsb3NpbmdUeXBlU2VwYXJhdG9yKTsKKwl9CisJcmV0dXJuIHBhY2thZ2VOYW1lICsgJy4nICsgZ2V0VHlwZVF1YWxpZmllZE5hbWUoZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0SW5pdGlhbGl6ZXIoaW50IG9jY3VycmVuY2VDb3VudCkKKyAqLworcHVibGljIElJbml0aWFsaXplciBnZXRJbml0aWFsaXplcihpbnQgb2NjdXJyZW5jZUNvdW50KSB7CisJcmV0dXJuIG5ldyBJbml0aWFsaXplcih0aGlzLCBvY2N1cnJlbmNlQ291bnQpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldEluaXRpYWxpemVycygpCisgKi8KK3B1YmxpYyBJSW5pdGlhbGl6ZXJbXSBnZXRJbml0aWFsaXplcnMoKSB7CisJcmV0dXJuIE5PX0lOSVRJQUxJWkVSUzsKK30KKy8qKgorICogQHNlZSBJVHlwZSNnZXRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKQorICovCitwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKSB7CisJcmV0dXJuIG5ldyBCaW5hcnlNZXRob2QodGhpcywgbmFtZSwgcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldE1ldGhvZHMoKQorICovCitwdWJsaWMgSU1ldGhvZFtdIGdldE1ldGhvZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKE1FVEhPRCk7CisJaW50IHNpemU7CisJaWYgKChzaXplID0gbGlzdC5zaXplKCkpID09IDApIHsKKwkJcmV0dXJuIE5PX01FVEhPRFM7CisJfSBlbHNlIHsKKwkJSU1ldGhvZFtdIGFycmF5PSBuZXcgSU1ldGhvZFtzaXplXTsKKwkJbGlzdC50b0FycmF5KGFycmF5KTsKKwkJcmV0dXJuIGFycmF5OworCX0KK30KKy8qKgorICogQHNlZSBJVHlwZSNnZXRQYWNrYWdlRnJhZ21lbnQoKQorICovCitwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoKSB7CisJSUphdmFFbGVtZW50IHBhcmVudCA9IGZQYXJlbnQ7CisJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisJCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgeworCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBwYXJlbnQ7CisJCX0KKwkJZWxzZSB7CisJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCX0KKwl9CisJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7ICAvLyBzaG91bGQgbm90IGhhcHBlbgorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFN1cGVyY2xhc3NOYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldFJhd0luZm8oKTsKKwljaGFyW10gc3VwZXJjbGFzc05hbWUgPSBpbmZvLmdldFN1cGVyY2xhc3NOYW1lKCk7CisJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXJldHVybiBuZXcgU3RyaW5nKENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZShzdXBlcmNsYXNzTmFtZSkpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFN1cGVySW50ZXJmYWNlTmFtZXMoKQorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldFJhd0luZm8oKTsKKwljaGFyW11bXSBuYW1lcz0gaW5mby5nZXRJbnRlcmZhY2VOYW1lcygpOworCWludCBsZW5ndGg7CisJaWYgKG5hbWVzID09IG51bGwgfHwgKGxlbmd0aCA9IG5hbWVzLmxlbmd0aCkgPT0gMCkgeworCQlyZXR1cm4gTk9fU1RSSU5HUzsKKwl9CisJbmFtZXM9IENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZXMobmFtZXMpOworCVN0cmluZ1tdIHN0cmluZ3M9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJc3RyaW5nc1tpXT0gbmV3IFN0cmluZyhuYW1lc1tpXSk7CisJfQorCXJldHVybiBzdHJpbmdzOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFR5cGUoU3RyaW5nKQorICovCitwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgbmFtZSkgeworCUlDbGFzc0ZpbGUgY2xhc3NGaWxlPSBnZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDbGFzc0ZpbGUoZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSArICIkIiArIG5hbWUgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCXJldHVybiBuZXcgQmluYXJ5VHlwZShjbGFzc0ZpbGUsIG5hbWUpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFR5cGVRdWFsaWZpZWROYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5nZXRUeXBlUXVhbGlmaWVkTmFtZSgnJCcpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0VHlwZVF1YWxpZmllZE5hbWUoY2hhciBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yKSB7CisJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZSgpOworCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIHsKKwkJU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSB0aGlzLmdldENsYXNzRmlsZSgpLmdldEVsZW1lbnROYW1lKCk7CisJCWlmIChjbGFzc0ZpbGVOYW1lLmluZGV4T2YoJyQnKSA9PSAtMSkgeworCQkJLy8gdG9wIGxldmVsIGNsYXNzIGZpbGU6IG5hbWUgb2YgdHlwZSBpcyBzYW1lIGFzIG5hbWUgb2YgY2xhc3MgZmlsZQorCQkJcmV0dXJuIGZOYW1lOworCQl9IGVsc2UgeworCQkJLy8gYW5vbnltb3VzIG9yIGxvY2FsIGNsYXNzIGZpbGUKKwkJCXJldHVybiBjbGFzc0ZpbGVOYW1lLnN1YnN0cmluZygwLCBjbGFzc0ZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOyAvLyByZW1vdmUgLmNsYXNzCisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gCisJCQlkZWNsYXJpbmdUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpCisJCQkrIGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IKKwkJCSsgZk5hbWU7CisJfQorfQorLyoqCisgKiBAc2VlIElUeXBlI2dldFR5cGVzKCkKKyAqLworcHVibGljIElUeXBlW10gZ2V0VHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKFRZUEUpOworCWludCBzaXplOworCWlmICgoc2l6ZSA9IGxpc3Quc2l6ZSgpKSA9PSAwKSB7CisJCXJldHVybiBOT19UWVBFUzsKKwl9IGVsc2UgeworCQlJVHlwZVtdIGFycmF5PSBuZXcgSVR5cGVbc2l6ZV07CisJCWxpc3QudG9BcnJheShhcnJheSk7CisJCXJldHVybiBhcnJheTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVBhcmVudCNoYXNDaGlsZHJlbigpCisgKi8KK3B1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKK30KKy8qKgorICogQHNlZSBJVHlwZSNpc0Fub255bW91cygpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0UmF3SW5mbygpOworCXJldHVybiBpbmZvLmlzQW5vbnltb3VzKCk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjaXNDbGFzcygpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gIWlzSW50ZXJmYWNlKCk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjaXNJbnRlcmZhY2UoKQorICovCitwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldFJhd0luZm8oKTsKKwlyZXR1cm4gaW5mby5pc0ludGVyZmFjZSgpOworfQorCisvKioKKyAqIEBzZWUgSVR5cGUjaXNMb2NhbCgpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIGluZm8uaXNMb2NhbCgpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2lzTWVtYmVyKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCk7CisJcmV0dXJuIGluZm8uaXNNZW1iZXIoKTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNuZXdTdXBlcnR5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwsIG1vbml0b3IpOworfQorLyoqCisgKiBAc2VlIElUeXBlI25ld1N1cGVydHlwZUhpZXJhcmNoeShJV29ya2luZ0NvcHlbXSwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIElUeXBlSGllcmFyY2h5IG5ld1N1cGVydHlwZUhpZXJhcmNoeSgKKwlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24odGhpcywgd29ya2luZ0NvcGllcywgU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksIGZhbHNlKTsKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKK30KKworLyoqCisgKiBAc2VlIElUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBuZXdUeXBlSGllcmFyY2h5KChJV29ya2luZ0NvcHlbXSludWxsLCBtb25pdG9yKTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNuZXdUeXBlSGllcmFyY2h5KElXb3JraW5nQ29weVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeSgKKwlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKHRoaXMsIHdvcmtpbmdDb3BpZXMsIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCB0cnVlKTsKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKK30KKworLyoqCisgKiBAc2VlIElUeXBlI25ld1R5cGVIaWVyYXJjaHkoSUphdmFQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKyAqLworcHVibGljIElUeXBlSGllcmFyY2h5IG5ld1R5cGVIaWVyYXJjaHkoSUphdmFQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiaGllcmFyY2h5Lm51bGxQcm9qZWN0IikpOyAvLyROT04tTkxTLTEkCisJfQorCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKAorCQl0aGlzLCAKKwkJbnVsbCwgLy8gbm8gd29ya2luZyBjb3BpZXMKKwkJU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3Byb2plY3R9KSwgCisJCXRydWUpOworCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CisJcmV0dXJuIG9wLmdldFJlc3VsdCgpOworfQorLyoqCisgKiBSZW1vdmVzIGFsbCBjYWNoZWQgaW5mbyBmcm9tIHRoZSBKYXZhIE1vZGVsLCBpbmNsdWRpbmcgYWxsIGNoaWxkcmVuLAorICogYnV0IGRvZXMgbm90IGNsb3NlIHRoaXMgZWxlbWVudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW5mbygpIHsKKwlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7CisJaWYgKGluZm8gIT0gbnVsbCkgeworCQl0cnkgeworCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKKwkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CisJCQkJY2hpbGQucmVtb3ZlSW5mbygpOworCQkJfQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl9CisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUluZm8odGhpcyk7CisJCXRyeSB7CisJCQlDbGFzc0ZpbGVJbmZvIGNmaSA9IGdldENsYXNzRmlsZUluZm8oKTsKKwkJCWNmaS5yZW1vdmVCaW5hcnlDaGlsZHJlbigpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCX0KKwl9Cit9CitwdWJsaWMgU3RyaW5nW11bXSByZXNvbHZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCS8vIG5vdCBpbXBsZW1lbnRlZCBmb3IgYmluYXJ5IHR5cGVzCisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEVsZW1lbnROYW1lKCkpOworCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIGlmIChpbmZvID09IE5PX0lORk8pIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwl9IGVsc2UgeworCQl0cnkgeworCQkJaWYgKHRoaXMuaXNJbnRlcmZhY2UoKSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJjbGFzcyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmdldEVsZW1lbnROYW1lKCkpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiICsgZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYmE1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5CdWZmZXJDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIGNsYXNzIEJ1ZmZlciBpbXBsZW1lbnRzIElCdWZmZXIgeworCXByb3RlY3RlZCBJRmlsZSBmaWxlOworCXByb3RlY3RlZCBpbnQgZmxhZ3M7CisJcHJvdGVjdGVkIGNoYXJbXSBjb250ZW50czsKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoYW5nZUxpc3RlbmVyczsKKwlwcm90ZWN0ZWQgSU9wZW5hYmxlIG93bmVyOworCXByb3RlY3RlZCBpbnQgZ2FwU3RhcnQ9IC0xOworCXByb3RlY3RlZCBpbnQgZ2FwRW5kPSAtMTsKKworCXByb3RlY3RlZCBPYmplY3QgbG9jaz0gbmV3IE9iamVjdCgpOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRl9IQVNfVU5TQVZFRF9DSEFOR0VTPSAxOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZfSVNfUkVBRF9PTkxZPSAyOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZfSVNfQ0xPU0VEPSA0OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgYnVmZmVyIG9uIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UuCisgKi8KK3Byb3RlY3RlZCBCdWZmZXIoSUZpbGUgZmlsZSwgSU9wZW5hYmxlIG93bmVyLCBib29sZWFuIHJlYWRPbmx5KSB7CisJdGhpcy5maWxlID0gZmlsZTsKKwl0aGlzLm93bmVyID0gb3duZXI7CisJaWYgKGZpbGUgPT0gbnVsbCkgeworCQlzZXRSZWFkT25seShyZWFkT25seSk7CisJfQorfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIHZvaWQgYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPT0gbnVsbCkgeworCQl0aGlzLmNoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoNSk7CisJfQorCWlmICghdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7CisJCXRoaXMuY2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorfQorLyoqCisgKiBBcHBlbmQgdGhlIDxjb2RlPnRleHQ8L2NvZGU+IHRvIHRoZSBhY3R1YWwgY29udGVudCwgdGhlIGdhcCBpcyBtb3ZlZAorICogdG8gdGhlIGVuZCBvZiB0aGUgPGNvZGU+dGV4dDwvY29kZT4uCisgKi8KK3B1YmxpYyB2b2lkIGFwcGVuZChjaGFyW10gdGV4dCkgeworCWlmICghaXNSZWFkT25seSgpKSB7CisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBsZW5ndGggPSBnZXRMZW5ndGgoKTsKKwkJbW92ZUFuZFJlc2l6ZUdhcChsZW5ndGgsIHRleHQubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCAwLCB0aGlzLmNvbnRlbnRzLCBsZW5ndGgsIHRleHQubGVuZ3RoKTsKKwkJdGhpcy5nYXBTdGFydCArPSB0ZXh0Lmxlbmd0aDsKKwkJdGhpcy5mbGFncyB8PSBGX0hBU19VTlNBVkVEX0NIQU5HRVM7CisJCW5vdGlmeUNoYW5nZWQobmV3IEJ1ZmZlckNoYW5nZWRFdmVudCh0aGlzLCBsZW5ndGgsIDAsIG5ldyBTdHJpbmcodGV4dCkpKTsKKwl9Cit9CisvKioKKyAqIEFwcGVuZCB0aGUgPGNvZGU+dGV4dDwvY29kZT4gdG8gdGhlIGFjdHVhbCBjb250ZW50LCB0aGUgZ2FwIGlzIG1vdmVkCisgKiB0byB0aGUgZW5kIG9mIHRoZSA8Y29kZT50ZXh0PC9jb2RlPi4KKyAqLworcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyB0ZXh0KSB7CisJaWYgKHRleHQgPT0gbnVsbCkgeworCQlyZXR1cm47CisJfQorCXRoaXMuYXBwZW5kKHRleHQudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCUJ1ZmZlckNoYW5nZWRFdmVudCBldmVudCA9IG51bGw7CisJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKKwkJaWYgKGlzQ2xvc2VkKCkpCisJCQlyZXR1cm47CisJCWV2ZW50ID0gbmV3IEJ1ZmZlckNoYW5nZWRFdmVudCh0aGlzLCAwLCAwLCBudWxsKTsKKwkJdGhpcy5jb250ZW50cyA9IG51bGw7CisJCXRoaXMuZmxhZ3MgfD0gRl9JU19DTE9TRUQ7CisJfQorCW5vdGlmeUNoYW5nZWQoZXZlbnQpOyAvLyBub3RpZnkgb3V0c2lkZSBvZiBzeW5jaHJvbml6ZWQgYmxvY2sKKwl0aGlzLmNoYW5nZUxpc3RlbmVycyA9IG51bGw7Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3NpdGlvbikgeworCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7CisJCWlmIChwb3NpdGlvbiA8IHRoaXMuZ2FwU3RhcnQpIHsKKwkJCXJldHVybiB0aGlzLmNvbnRlbnRzW3Bvc2l0aW9uXTsKKwkJfQorCQlpbnQgZ2FwTGVuZ3RoID0gdGhpcy5nYXBFbmQgLSB0aGlzLmdhcFN0YXJ0OworCQlyZXR1cm4gdGhpcy5jb250ZW50c1twb3NpdGlvbiArIGdhcExlbmd0aF07CisJfQorfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIGNoYXJbXSBnZXRDaGFyYWN0ZXJzKCkgeworCWlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHJldHVybiBudWxsOworCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7CisJCWlmICh0aGlzLmdhcFN0YXJ0IDwgMCkgeworCQkJcmV0dXJuIHRoaXMuY29udGVudHM7CisJCX0KKwkJaW50IGxlbmd0aCA9IHRoaXMuY29udGVudHMubGVuZ3RoOworCQljaGFyW10gbmV3Q29udGVudHMgPSBuZXcgY2hhcltsZW5ndGggLSB0aGlzLmdhcEVuZCArIHRoaXMuZ2FwU3RhcnRdOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIDAsIG5ld0NvbnRlbnRzLCAwLCB0aGlzLmdhcFN0YXJ0KTsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvbnRlbnRzLCB0aGlzLmdhcEVuZCwgbmV3Q29udGVudHMsIHRoaXMuZ2FwU3RhcnQsIGxlbmd0aCAtIHRoaXMuZ2FwRW5kKTsKKwkJcmV0dXJuIG5ld0NvbnRlbnRzOworCX0KK30KKy8qKgorICogQHNlZSBJQnVmZmVyCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoKSB7CisJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5nZXRDaGFyYWN0ZXJzKCkpOworfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKKwkJaW50IGxlbmd0aCA9IHRoaXMuZ2FwRW5kIC0gdGhpcy5nYXBTdGFydDsKKwkJcmV0dXJuICh0aGlzLmNvbnRlbnRzLmxlbmd0aCAtIGxlbmd0aCk7CisJfQorfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIElPcGVuYWJsZSBnZXRPd25lcigpIHsKKwlyZXR1cm4gdGhpcy5vd25lcjsKK30KKy8qKgorICogQHNlZSBJQnVmZmVyCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkKKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKKwkJaWYgKG9mZnNldCArIGxlbmd0aCA8IHRoaXMuZ2FwU3RhcnQpCisJCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmNvbnRlbnRzLCBvZmZzZXQsIGxlbmd0aCk7CisJCWlmICh0aGlzLmdhcFN0YXJ0IDwgb2Zmc2V0KSB7CisJCQlpbnQgZ2FwTGVuZ3RoID0gdGhpcy5nYXBFbmQgLSB0aGlzLmdhcFN0YXJ0OworCQkJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5jb250ZW50cywgb2Zmc2V0ICsgZ2FwTGVuZ3RoLCBsZW5ndGgpOworCQl9CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWJ1Zi5hcHBlbmQodGhpcy5jb250ZW50cywgb2Zmc2V0LCB0aGlzLmdhcFN0YXJ0IC0gb2Zmc2V0KTsKKwkJYnVmLmFwcGVuZCh0aGlzLmNvbnRlbnRzLCB0aGlzLmdhcEVuZCwgb2Zmc2V0ICsgbGVuZ3RoIC0gdGhpcy5nYXBTdGFydCk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKKwlyZXR1cm4gdGhpcy5maWxlOworfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIGJvb2xlYW4gaGFzVW5zYXZlZENoYW5nZXMoKSB7CisJcmV0dXJuICh0aGlzLmZsYWdzICYgRl9IQVNfVU5TQVZFRF9DSEFOR0VTKSAhPSAwOworfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisJcmV0dXJuICh0aGlzLmZsYWdzICYgRl9JU19DTE9TRUQpICE9IDA7Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkgeworCQlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBGX0lTX1JFQURfT05MWSkgIT0gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5maWxlLmlzUmVhZE9ubHkoKTsKKwl9Cit9CisvKioKKyAqIE1vdmVzIHRoZSBnYXAgdG8gbG9jYXRpb24gYW5kIGFkanVzdCBpdHMgc2l6ZSB0byB0aGUKKyAqIGFudGljaXBhdGVkIGNoYW5nZSBzaXplLiBUaGUgc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCAKKyAqIHJhbmdlIG9mIHRoZSBnYXAgdGhhdCB3aWxsIGJlIGZpbGxlZCBhZnRlciB0aGUgZ2FwIGhhcyBiZWVuIG1vdmVkLgorICogVGh1cyB0aGUgZ2FwIGlzIHJlc2l6ZWQgdG8gYWN0dWFsIHNpemUgKyB0aGUgc3BlY2lmaWVkIHNpemUgYW5kCisgKiBtb3ZlZCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1vdmVBbmRSZXNpemVHYXAoaW50IHBvc2l0aW9uLCBpbnQgc2l6ZSkgeworCWNoYXJbXSBjb250ZW50ID0gbnVsbDsKKwlpbnQgb2xkU2l6ZSA9IHRoaXMuZ2FwRW5kIC0gdGhpcy5nYXBTdGFydDsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJaWYgKG9sZFNpemUgPiAwKSB7CisJCQljb250ZW50ID0gbmV3IGNoYXJbdGhpcy5jb250ZW50cy5sZW5ndGggLSBvbGRTaXplXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb250ZW50cywgMCwgY29udGVudCwgMCwgdGhpcy5nYXBTdGFydCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIHRoaXMuZ2FwRW5kLCBjb250ZW50LCB0aGlzLmdhcFN0YXJ0LCBjb250ZW50Lmxlbmd0aCAtIHRoaXMuZ2FwU3RhcnQpOworCQkJdGhpcy5jb250ZW50cyA9IGNvbnRlbnQ7CisJCX0KKwkJdGhpcy5nYXBTdGFydCA9IHRoaXMuZ2FwRW5kID0gcG9zaXRpb247CisJCXJldHVybjsKKwl9CisJY29udGVudCA9IG5ldyBjaGFyW3RoaXMuY29udGVudHMubGVuZ3RoICsgKHNpemUgLSBvbGRTaXplKV07CisJaW50IG5ld0dhcFN0YXJ0ID0gcG9zaXRpb247CisJaW50IG5ld0dhcEVuZCA9IG5ld0dhcFN0YXJ0ICsgc2l6ZTsKKwlpZiAob2xkU2l6ZSA9PSAwKSB7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb250ZW50cywgMCwgY29udGVudCwgMCwgbmV3R2FwU3RhcnQpOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIG5ld0dhcFN0YXJ0LCBjb250ZW50LCBuZXdHYXBFbmQsIGNvbnRlbnQubGVuZ3RoIC0gbmV3R2FwRW5kKTsKKwl9IGVsc2UKKwkJaWYgKG5ld0dhcFN0YXJ0IDwgdGhpcy5nYXBTdGFydCkgeworCQkJaW50IGRlbHRhID0gdGhpcy5nYXBTdGFydCAtIG5ld0dhcFN0YXJ0OworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmNvbnRlbnRzLCAwLCBjb250ZW50LCAwLCBuZXdHYXBTdGFydCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIG5ld0dhcFN0YXJ0LCBjb250ZW50LCBuZXdHYXBFbmQsIGRlbHRhKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb250ZW50cywgdGhpcy5nYXBFbmQsIGNvbnRlbnQsIG5ld0dhcEVuZCArIGRlbHRhLCB0aGlzLmNvbnRlbnRzLmxlbmd0aCAtIHRoaXMuZ2FwRW5kKTsKKwkJfSBlbHNlIHsKKwkJCWludCBkZWx0YSA9IG5ld0dhcFN0YXJ0IC0gdGhpcy5nYXBTdGFydDsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jb250ZW50cywgMCwgY29udGVudCwgMCwgdGhpcy5nYXBTdGFydCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIHRoaXMuZ2FwRW5kLCBjb250ZW50LCB0aGlzLmdhcFN0YXJ0LCBkZWx0YSk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY29udGVudHMsIHRoaXMuZ2FwRW5kICsgZGVsdGEsIGNvbnRlbnQsIG5ld0dhcEVuZCwgY29udGVudC5sZW5ndGggLSBuZXdHYXBFbmQpOworCQl9CisJdGhpcy5jb250ZW50cyA9IGNvbnRlbnQ7CisJdGhpcy5nYXBTdGFydCA9IG5ld0dhcFN0YXJ0OworCXRoaXMuZ2FwRW5kID0gbmV3R2FwRW5kOworfQorLyoqCisgKiBOb3RpZnkgdGhlIGxpc3RlbmVycyB0aGF0IHRoaXMgYnVmZmVyIGhhcyBjaGFuZ2VkLgorICogVG8gYXZvaWQgZGVhZGxvY2ssIHRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gYSBzeW5jaHJvbml6ZWQgYmxvY2suCisgKi8KK3Byb3RlY3RlZCB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgQnVmZmVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJaWYgKHRoaXMuY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSB0aGlzLmNoYW5nZUxpc3RlbmVycy5zaXplKCk7IGkgPCBzaXplOyArK2kpIHsKKwkJCWZpbmFsIElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcikgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuZ2V0KGkpOworCQkJUGxhdGZvcm0ucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCVV0aWwubG9nKGV4Y2VwdGlvbiwgIkV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBsaXN0ZW5lciBvZiBidWZmZXIgY2hhbmdlIG5vdGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQlsaXN0ZW5lci5idWZmZXJDaGFuZ2VkKGV2ZW50KTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQl9CisJfQorfQorLyoqCisgKiBAc2VlIElCdWZmZXIKKyAqLworcHVibGljIHZvaWQgcmVtb3ZlQnVmZmVyQ2hhbmdlZExpc3RlbmVyKElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgeworCQl0aGlzLmNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCQlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKwkJCXRoaXMuY2hhbmdlTGlzdGVuZXJzID0gbnVsbDsKKwkJfQorCX0KK30KKy8qKgorICogUmVwbGFjZXMgPGNvZGU+bGVuZ3RoPC9jb2RlPiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gPGNvZGU+cG9zaXRpb248L2NvZGU+IHdpdGggPGNvZGU+dGV4dDxjb2RlPi4KKyAqIEFmdGVyIHRoYXQgb3BlcmF0aW9uLCB0aGUgZ2FwIGlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSAKKyAqIGluc2VydGVkIDxjb2RlPnRleHQ8L2NvZGU+LgorICovCitwdWJsaWMgdm9pZCByZXBsYWNlKGludCBwb3NpdGlvbiwgaW50IGxlbmd0aCwgY2hhcltdIHRleHQpIHsKKwlpZiAoIWlzUmVhZE9ubHkoKSkgeworCQlpbnQgdGV4dExlbmd0aCA9IHRleHQgPT0gbnVsbCA/IDAgOiB0ZXh0Lmxlbmd0aDsKKwkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKKwkJCS8vIG1vdmUgZ2FwCisJCQltb3ZlQW5kUmVzaXplR2FwKHBvc2l0aW9uICsgbGVuZ3RoLCB0ZXh0TGVuZ3RoIC0gbGVuZ3RoKTsKKworCQkJLy8gb3ZlcndyaXRlCisJCQlpbnQgbWluID0gTWF0aC5taW4odGV4dExlbmd0aCwgbGVuZ3RoKTsKKwkJCWlmIChtaW4gPiAwKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCAwLCB0aGlzLmNvbnRlbnRzLCBwb3NpdGlvbiwgbWluKTsKKwkJCX0KKwkJCWlmIChsZW5ndGggPiB0ZXh0TGVuZ3RoKSB7CisJCQkJLy8gZW5sYXJnZSB0aGUgZ2FwCisJCQkJdGhpcy5nYXBTdGFydCAtPSBsZW5ndGggLSB0ZXh0TGVuZ3RoOworCQkJfSBlbHNlIGlmICh0ZXh0TGVuZ3RoID4gbGVuZ3RoKSB7CisJCQkJLy8gc2hyaW5rIGdhcAorCQkJCXRoaXMuZ2FwU3RhcnQgKz0gdGV4dExlbmd0aCAtIGxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRleHQsIDAsIHRoaXMuY29udGVudHMsIHBvc2l0aW9uLCB0ZXh0TGVuZ3RoKTsKKwkJCX0KKwkJfQorCQl0aGlzLmZsYWdzIHw9IEZfSEFTX1VOU0FWRURfQ0hBTkdFUzsKKwkJU3RyaW5nIHN0cmluZyA9IG51bGw7CisJCWlmICh0ZXh0TGVuZ3RoID4gMCkgeworCQkJc3RyaW5nID0gbmV3IFN0cmluZyh0ZXh0KTsKKwkJfQorCQlub3RpZnlDaGFuZ2VkKG5ldyBCdWZmZXJDaGFuZ2VkRXZlbnQodGhpcywgcG9zaXRpb24sIGxlbmd0aCwgc3RyaW5nKSk7CisJfQorfQorLyoqCisgKiBSZXBsYWNlcyA8Y29kZT5sZW5ndGg8L2NvZGU+IGNoYXJhY3RlcnMgc3RhcnRpbmcgZnJvbSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gd2l0aCA8Y29kZT50ZXh0PGNvZGU+LgorICogQWZ0ZXIgdGhhdCBvcGVyYXRpb24sIHRoZSBnYXAgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIAorICogaW5zZXJ0ZWQgPGNvZGU+dGV4dDwvY29kZT4uCisgKi8KK3B1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvc2l0aW9uLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgeworCXRoaXMucmVwbGFjZShwb3NpdGlvbiwgbGVuZ3RoLCB0ZXh0ID09IG51bGwgPyBudWxsIDogdGV4dC50b0NoYXJBcnJheSgpKTsKK30KKy8qKgorICogQHNlZSBJQnVmZmVyCisgKi8KK3B1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkvLyBkZXRlcm1pbmUgaWYgc2F2aW5nIGlzIHJlcXVpcmVkIAorCWlmIChpc1JlYWRPbmx5KCkgfHwgdGhpcy5maWxlID09IG51bGwpIHsKKwkJcmV0dXJuOworCX0KKwlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgeworCQlpZiAoIWhhc1Vuc2F2ZWRDaGFuZ2VzKCkpCisJCQlyZXR1cm47CisJCQkKKwkJLy8gdXNlIGEgcGxhdGZvcm0gb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGUgcmVzb3VyY2UgY29udGVudHMKKwkJdHJ5IHsKKwkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCVN0cmluZyBjb250ZW50cyA9IHRoaXMuZ2V0Q29udGVudHMoKTsKKwkJCWlmIChjb250ZW50cyA9PSBudWxsKSByZXR1cm47CisJCQlieXRlW10gYnl0ZXMgPSBlbmNvZGluZyA9PSBudWxsIAorCQkJCT8gY29udGVudHMuZ2V0Qnl0ZXMoKSAKKwkJCQk6IGNvbnRlbnRzLmdldEJ5dGVzKGVuY29kaW5nKTsKKwkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CisKKwkJCXRoaXMuZmlsZS5zZXRDb250ZW50cygKKwkJCQlzdHJlYW0sIAorCQkJCWZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCW51bGwpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisKKwkJLy8gdGhlIHJlc291cmNlIG5vIGxvbmdlciBoYXMgdW5zYXZlZCBjaGFuZ2VzCisJCXRoaXMuZmxhZ3MgJj0gfiAoRl9IQVNfVU5TQVZFRF9DSEFOR0VTKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgdm9pZCBzZXRDb250ZW50cyhjaGFyW10gbmV3Q29udGVudHMpIHsKKwkvLyBhbGxvdyBzcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGluaXRpYWxpemF0aW9uIAorCS8vIGFmdGVyIGNyZWF0aW9uIGJ5IGJ1ZmZlciBmYWN0b3J5CisJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkgeworCQl0aGlzLmNvbnRlbnRzID0gbmV3Q29udGVudHM7CisJCXRoaXMuZmxhZ3MgJj0gfiAoRl9IQVNfVU5TQVZFRF9DSEFOR0VTKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIWlzUmVhZE9ubHkoKSkgeworCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKKwkJaWYgKG5ld0NvbnRlbnRzICE9IG51bGwpIHsKKwkJCXN0cmluZyA9IG5ldyBTdHJpbmcobmV3Q29udGVudHMpOworCQl9CisJCUJ1ZmZlckNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBCdWZmZXJDaGFuZ2VkRXZlbnQodGhpcywgMCwgdGhpcy5nZXRMZW5ndGgoKSwgc3RyaW5nKTsKKwkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKKwkJCXRoaXMuY29udGVudHMgPSBuZXdDb250ZW50czsKKwkJCXRoaXMuZmxhZ3MgfD0gRl9IQVNfVU5TQVZFRF9DSEFOR0VTOworCQkJdGhpcy5nYXBTdGFydCA9IC0xOworCQkJdGhpcy5nYXBFbmQgPSAtMTsKKwkJfQorCQlub3RpZnlDaGFuZ2VkKGV2ZW50KTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSUJ1ZmZlcgorICovCitwdWJsaWMgdm9pZCBzZXRDb250ZW50cyhTdHJpbmcgbmV3Q29udGVudHMpIHsKKwl0aGlzLnNldENvbnRlbnRzKG5ld0NvbnRlbnRzLnRvQ2hhckFycmF5KCkpOworfQorLyoqCisgKiBTZXRzIHRoaXMgPGNvZGU+QnVmZmVyPC9jb2RlPiB0byBiZSByZWFkIG9ubHkuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKKwlpZiAocmVhZE9ubHkpIHsKKwkJdGhpcy5mbGFncyB8PSBGX0lTX1JFQURfT05MWTsKKwl9IGVsc2UgeworCQl0aGlzLmZsYWdzICY9IH4oRl9JU19SRUFEX09OTFkpOworCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCJPd25lcjogIiArICgoSmF2YUVsZW1lbnQpdGhpcy5vd25lcikudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCgiXG5IYXMgdW5zYXZlZCBjaGFuZ2VzOiAiICsgdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcygpKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIlxuSXMgcmVhZG9ubHk6ICIgKyB0aGlzLmlzUmVhZE9ubHkoKSk7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCJcbklzIGNsb3NlZDogIiArIHRoaXMuaXNDbG9zZWQoKSk7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCJcbkNvbnRlbnRzOlxuIik7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gY29udGVudHMgPSB0aGlzLmdldENoYXJhY3RlcnMoKTsKKwlpZiAoY29udGVudHMgPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCI8bnVsbD4iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWludCBsZW5ndGggPSBjb250ZW50cy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWNoYXIgY2FyID0gY29udGVudHNbaV07CisJCQlzd2l0Y2ggKGNhcikgeworCQkJCWNhc2UgJ1xuJzogCisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxcblxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHInOgorCQkJCQlpZiAoaSA8IGxlbmd0aC0xICYmIHRoaXMuY29udGVudHNbaSsxXSA9PSAnXG4nKSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKCJcXHJcXG5cbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQlpKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKCJcXHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnVmZmVyLmFwcGVuZChjYXIpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyZDkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyQ2FjaGUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5MUlVDYWNoZTsKKworLyoqCisgKiBBbiBMUlUgY2FjaGUgb2YgPGNvZGU+SUJ1ZmZlcnM8L2NvZGU+LgorICovCitwdWJsaWMgY2xhc3MgQnVmZmVyQ2FjaGUgZXh0ZW5kcyBPdmVyZmxvd2luZ0xSVUNhY2hlIHsKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgY2FjaGUgb2YgdGhlIGdpdmVuIHNpemUuCisgKi8KK3B1YmxpYyBCdWZmZXJDYWNoZShpbnQgc2l6ZSkgeworCXN1cGVyKHNpemUpOworfQorLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBjYWNoZSBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAqLworcHVibGljIEJ1ZmZlckNhY2hlKGludCBzaXplLCBpbnQgb3ZlcmZsb3cpIHsKKwlzdXBlcihzaXplLCBvdmVyZmxvdyk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBjbG9zZWQgYW5kCisgKiByZW1vdmVkIGZyb20gdGhlIGNhY2hlLCBvdGhlcndpc2UgZmFsc2UuCisgKgorICogPHA+Tk9URTogdGhpcyB0cmlnZ2VycyBhbiBleHRlcm5hbCByZW1vdmFsIG9mIHRoaXMgYnVmZmVyCisgKiBieSBjbG9zaW5nIHRoZSBidWZmZXIuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGNsb3NlKExSVUNhY2hlRW50cnkgZW50cnkpIHsKKwlJQnVmZmVyIGJ1ZmZlcj0gKElCdWZmZXIpIGVudHJ5Ll9mVmFsdWU7CisJaWYgKGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlidWZmZXIuY2xvc2UoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2lldmVyLgorCSAqLworCXByb3RlY3RlZCBMUlVDYWNoZSBuZXdJbnN0YW5jZShpbnQgc2l6ZSwgaW50IG92ZXJmbG93KSB7CisJCXJldHVybiBuZXcgQnVmZmVyQ2FjaGUoc2l6ZSwgb3ZlcmZsb3cpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlck1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFlNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7CisKKy8qKgorICogVGhlIGJ1ZmZlciBtYW5hZ2VyIG1hbmFnZXMgdGhlIHNldCBvZiBvcGVuIGJ1ZmZlcnMuCisgKiBJdCBpbXBsZW1lbnRzIGFuIExSVSBjYWNoZSBvZiBidWZmZXJzLgorICovCitwdWJsaWMgY2xhc3MgQnVmZmVyTWFuYWdlciBpbXBsZW1lbnRzIElCdWZmZXJGYWN0b3J5IHsKKworCXByb3RlY3RlZCBzdGF0aWMgQnVmZmVyTWFuYWdlciBERUZBVUxUX0JVRkZFUl9NQU5BR0VSOworCisJLyoqCisJICogTFJVIGNhY2hlIG9mIGJ1ZmZlcnMuIFRoZSBrZXkgYW5kIHZhbHVlIGZvciBhbiBlbnRyeQorCSAqIGluIHRoZSB0YWJsZSBpcyB0aGUgaWRlbnRpY2FsIGJ1ZmZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgT3ZlcmZsb3dpbmdMUlVDYWNoZSBvcGVuQnVmZmVycyA9IG5ldyBCdWZmZXJDYWNoZSg2MCk7CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBidWZmZXIgbWFuYWdlci4KKyAqLworcHVibGljIEJ1ZmZlck1hbmFnZXIoKSB7Cit9CisvKioKKyAqIEFkZHMgYSBidWZmZXIgdG8gdGhlIHRhYmxlIG9mIG9wZW4gYnVmZmVycy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkQnVmZmVyKElCdWZmZXIgYnVmZmVyKSB7CisJb3BlbkJ1ZmZlcnMucHV0KGJ1ZmZlci5nZXRPd25lcigpLCBidWZmZXIpOworfQorLyoqCisgKiBAc2VlIElCdWZmZXJGYWN0b3J5I2NyZWF0ZUJ1ZmZlcihJT3BlbmFibGUpCisgKi8KK3B1YmxpYyBJQnVmZmVyIGNyZWF0ZUJ1ZmZlcihJT3BlbmFibGUgb3duZXIpIHsKKwlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpb3duZXI7CisJSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRSZXNvdXJjZSgpOworCXJldHVybiAKKwkJbmV3IEJ1ZmZlcigKKwkJCXJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgPyAoSUZpbGUpcmVzb3VyY2UgOiBudWxsLCAKKwkJCW93bmVyLCAKKwkJCWVsZW1lbnQuaXNSZWFkT25seSgpKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBvcGVuIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG93bmVyLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG93bmVyIGRvZXMgbm90IGhhdmUgYW4gb3BlbgorICogYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKElPcGVuYWJsZSBvd25lcikgeworCXJldHVybiAoSUJ1ZmZlcilvcGVuQnVmZmVycy5nZXQob3duZXIpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGJ1ZmZlciBtYW5hZ2VyLgorICovCitwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBCdWZmZXJNYW5hZ2VyIGdldERlZmF1bHRCdWZmZXJNYW5hZ2VyKCkgeworCWlmIChERUZBVUxUX0JVRkZFUl9NQU5BR0VSID09IG51bGwpIHsKKwkJREVGQVVMVF9CVUZGRVJfTUFOQUdFUiA9IG5ldyBCdWZmZXJNYW5hZ2VyKCk7CisJfQorCXJldHVybiBERUZBVUxUX0JVRkZFUl9NQU5BR0VSOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGJ1ZmZlciBmYWN0b3J5LgorICovCitwdWJsaWMgSUJ1ZmZlckZhY3RvcnkgZ2V0RGVmYXVsdEJ1ZmZlckZhY3RvcnkoKSB7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIG9wZW4gYnVmZmVycy4KKyAqIDxwPiAKKyAqIFRoZSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gYW5zd2VyZWQgaXMgdGhyZWFkIHNhZmUuCisgKgorICogQHNlZSBPdmVyZmxvd2luZ0xSVUNhY2hlCisgKiBAcmV0dXJuIEVudW1lcmF0aW9uIG9mIElCdWZmZXIKKyAqLworcHVibGljIEVudW1lcmF0aW9uIGdldE9wZW5CdWZmZXJzKCkgeworCXN5bmNocm9uaXplZCAob3BlbkJ1ZmZlcnMpIHsKKwkJb3BlbkJ1ZmZlcnMuc2hyaW5rKCk7CisJCXJldHVybiBvcGVuQnVmZmVycy5lbGVtZW50cygpOworCX0KK30KKworCisvKioKKyAqIFJlbW92ZXMgYSBidWZmZXIgZnJvbSB0aGUgdGFibGUgb2Ygb3BlbiBidWZmZXJzLgorICovCitwcm90ZWN0ZWQgdm9pZCByZW1vdmVCdWZmZXIoSUJ1ZmZlciBidWZmZXIpIHsKKwlvcGVuQnVmZmVycy5yZW1vdmUoYnVmZmVyLmdldE93bmVyKCkpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFmZGMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEKQEAgLTAsMCArMSw1OTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFyZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKKworLyoqCisgKiBAc2VlIElDbGFzc0ZpbGUKKyAqLworCitwdWJsaWMgY2xhc3MgQ2xhc3NGaWxlIGV4dGVuZHMgT3BlbmFibGUgaW1wbGVtZW50cyBJQ2xhc3NGaWxlIHsKKwlwcm90ZWN0ZWQgQmluYXJ5VHlwZSBmQmluYXJ5VHlwZSA9IG51bGw7CisvKgorICogQ3JlYXRlcyBhIGhhbmRsZSB0byBhIGNsYXNzIGZpbGUuCisgKgorICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNwZXRpb24gaWYgdGhlIG5hbWUgZG9lcyBub3QgZW5kIHdpdGggIi5jbGFzcyIKKyAqLworcHJvdGVjdGVkIENsYXNzRmlsZShJUGFja2FnZUZyYWdtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihDTEFTU19GSUxFLCBwYXJlbnQsIG5hbWUpOworCWlmICghVXRpbC5pc0NsYXNzRmlsZU5hbWUobmFtZSkpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaW52YWxpZENsYXNzRmlsZU5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisKKy8qKgorICogQHNlZSBJQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBJQ29tcGxldGlvblJlcXVlc3RvcikKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIElDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOworCWlmIChzb3VyY2UgIT0gbnVsbCkgeworCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCQorCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9IAorCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAorCQkJCWdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCksIAorCQkJCW51bGwsCisJCQkJZ2V0RWxlbWVudE5hbWUoKSArICIuamF2YSIsIC8vJE5PTi1OTFMtMSQKKwkJCQllbmNvZGluZyk7IAorCQljb2RlQ29tcGxldGUoY3UsIGN1LCBvZmZzZXQsIHJlcXVlc3Rvcik7CisJfQorfQorLyoqCisgKiBAc2VlIElDb2RlQXNzaXN0I2NvZGVTZWxlY3QoaW50LCBpbnQpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnRbXSBjb2RlU2VsZWN0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisJY2hhcltdIGNvbnRlbnRzOworCWlmIChidWZmZXIgIT0gbnVsbCAmJiAoY29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpKSAhPSBudWxsKSB7CisJCUlUeXBlIGN1cnJlbnQgPSB0aGlzLmdldFR5cGUoKTsKKwkJSVR5cGUgcGFyZW50OworCQl3aGlsZSAoKHBhcmVudCA9IGN1cnJlbnQuZ2V0RGVjbGFyaW5nVHlwZSgpKSAhPSBudWxsKXsKKwkJCWN1cnJlbnQgPSBwYXJlbnQ7CisJCX0KKwkJQmFzaWNDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQmFzaWNDb21waWxhdGlvblVuaXQoY29udGVudHMsIG51bGwsIGN1cnJlbnQuZ2V0RWxlbWVudE5hbWUoKSArICIuamF2YSIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzdXBlci5jb2RlU2VsZWN0KGN1LCBvZmZzZXQsIGxlbmd0aCk7CisJfSBlbHNlIHsKKwkJLy9oYXMgbm8gYXNzb2NpYXRlZCBzb3VjZQorCQlyZXR1cm4gbmV3IElKYXZhRWxlbWVudFtdIHt9OworCX0KK30KKy8qKgorICogUmV0dXJucyBhIG5ldyBlbGVtZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudC4KKyAqLworcHJvdGVjdGVkIE9wZW5hYmxlRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oKSB7CisJcmV0dXJuIG5ldyBDbGFzc0ZpbGVJbmZvKHRoaXMpOworfQorLyoqCisgKiBGaW5kcyB0aGUgZGVlcGVzdCA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGluIHRoZSBoaWVyYXJjaHkgb2YKKyAqIDxjb2RlPmVsdDwvZWx0PidzIGNoaWxkcmVuIChpbmNsdWRpbmcgPGNvZGU+ZWx0PC9jb2RlPiBpdHNlbGYpCisgKiB3aGljaCBoYXMgYSBzb3VyY2UgcmFuZ2UgdGhhdCBlbmNsb3NlcyA8Y29kZT5wb3NpdGlvbjwvY29kZT4KKyAqIGFjY29yZGluZyB0byA8Y29kZT5tYXBwZXI8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGZpbmRFbGVtZW50KElKYXZhRWxlbWVudCBlbHQsIGludCBwb3NpdGlvbiwgU291cmNlTWFwcGVyIG1hcHBlcikgeworCVNvdXJjZVJhbmdlIHJhbmdlID0gbWFwcGVyLmdldFNvdXJjZVJhbmdlKGVsdCk7CisJaWYgKHJhbmdlID09IG51bGwgfHwgcG9zaXRpb24gPCByYW5nZS5nZXRPZmZzZXQoKSB8fCByYW5nZS5nZXRPZmZzZXQoKSArIHJhbmdlLmdldExlbmd0aCgpIC0gMSA8IHBvc2l0aW9uKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpZiAoZWx0IGluc3RhbmNlb2YgSVBhcmVudCkgeworCQl0cnkgeworCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElQYXJlbnQpIGVsdCkuZ2V0Q2hpbGRyZW4oKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlJSmF2YUVsZW1lbnQgbWF0Y2ggPSBmaW5kRWxlbWVudChjaGlsZHJlbltpXSwgcG9zaXRpb24sIG1hcHBlcik7CisJCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG1hdGNoOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQl9CisJfQorCXJldHVybiBlbHQ7Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIGZvciB0aGlzIGNsYXNzIGZpbGUgYWRkaW5nIHRoZSByZXN1bHRpbmcKKyAqIG5ldyBoYW5kbGVzIGFuZCBpbmZvIG9iamVjdHMgdG8gdGhlIG5ld0VsZW1lbnRzIHRhYmxlLiBSZXR1cm5zIHRydWUKKyAqIGlmIHN1Y2Nlc3NmdWwsIG9yIGZhbHNlIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHBhcnNpbmcgdGhlIGNsYXNzIGZpbGUuCisgKiAKKyAqIEBzZWUgT3BlbmFibGUKKyAqIEBzZWUgU2lnbmF0dXJlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlSW5mb3MoT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBNYXAgbmV3RWxlbWVudHMsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCaW5hcnlUeXBlIHR5cGVJbmZvID0gZ2V0QmluYXJ5VHlwZUluZm8oKElGaWxlKSB1bmRlcmx5aW5nUmVzb3VyY2UpOworCWlmICh0eXBlSW5mbyA9PSBudWxsKSB7CisJCS8vIFRoZSBzdHJ1Y3R1cmUgb2YgYSBjbGFzcyBmaWxlIGlzIHVua25vd24gaWYgYSBjbGFzcyBmaWxlIGZvcm1hdCBlcnJvcnMgb2NjdXJyZWQKKwkJLy9kdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBkaWV0IGNsYXNzIGZpbGUgcmVwcmVzZW50YXRpdmUgb2YgdGhpcyBDbGFzc0ZpbGUuCisJCWluZm8uc2V0Q2hpbGRyZW4obmV3IElKYXZhRWxlbWVudFtdIHt9KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIE1ha2UgdGhlIHR5cGUKKwlJVHlwZSB0eXBlID0gbmV3IEJpbmFyeVR5cGUodGhpcywgbmV3IFN0cmluZyhzaW1wbGVOYW1lKHR5cGVJbmZvLmdldE5hbWUoKSkpKTsKKwlpbmZvLmFkZENoaWxkKHR5cGUpOworCW5ld0VsZW1lbnRzLnB1dCh0eXBlLCB0eXBlSW5mbyk7CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPkNsYXNzRmlsZVJlYWRlcjwvY29kZT5zcGVjaWZpYyBmb3IgdGhpcyBJQ2xhc3NGaWxlLCBiYXNlZAorICogb24gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBjcmVhdGUKKyAqIHRoZSBkaWV0IGNsYXNzIGZpbGUuCisgKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHRvIGNvbnNpZGVyOjx1bD4KKyAqIDxsaT5hIGNsYXNzIGZpbGUgY29ycmVzcG9uZGluZyB0byBhbiBJRmlsZSByZXNvdXJjZTwvbGk+CisgKiA8bGk+YSBjbGFzcyBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYSB6aXAgZW50cnkgaW4gYSBKQVI8L2xpPgorICogPC91bD4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiB3aGVuIHRoZSBJRmlsZSByZXNvdXJjZSBvciBKQVIgaXMgbm90IGF2YWlsYWJsZQorICogb3Igd2hlbiB0aGlzIGNsYXNzIGZpbGUgaXMgbm90IHByZXNlbnQgaW4gdGhlIEpBUgorICovCitwcml2YXRlIElCaW5hcnlUeXBlIGdldEJpbmFyeVR5cGVJbmZvKElGaWxlIGZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUphdmFFbGVtZW50IGxlID0gKEphdmFFbGVtZW50KSBnZXRQYXJlbnQoKTsKKwlpZiAobGUgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnQpIHsKKwkJdHJ5IHsKKwkJCUphclBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBsZS5nZXRQYXJlbnQoKTsKKwkJCUlCaW5hcnlUeXBlIGluZm8gPSBudWxsOworCQkJWmlwRmlsZSB6aXAgPSBudWxsOworCQkJdHJ5IHsKKwkJCQl6aXAgPSByb290LmdldEphcigpOworCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBnZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOworCQkJCWVudHJ5TmFtZSA9IGVudHJ5TmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKKwkJCQlpZiAoZW50cnlOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQllbnRyeU5hbWUgKz0gZ2V0RWxlbWVudE5hbWUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQllbnRyeU5hbWUgKz0gJy8nICsgZ2V0RWxlbWVudE5hbWUoKTsKKwkJCQl9CisJCQkJaW5mbyA9IENsYXNzRmlsZVJlYWRlci5yZWFkKHppcCwgZW50cnlOYW1lLCB0cnVlKTsKKwkJCX0gZmluYWxseSB7CisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2xvc2VaaXBGaWxlKHppcCk7CisJCQl9CisJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQkJfQorCQkJcmV0dXJuIGluZm87CisJCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGNmZSkgeworCQkJLy90aGUgc3RydWN0dXJlIHJlbWFpbnMgdW5rbm93bgorCQkJcmV0dXJuIG51bGw7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihpb2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJfSBlbHNlIHsKKwkJYnl0ZVtdIGNvbnRlbnRzID0gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNCeXRlQXJyYXkoZmlsZSk7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IENsYXNzRmlsZVJlYWRlcihjb250ZW50cywgZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gY2ZlKSB7CisJCQkvL3RoZSBzdHJ1Y3R1cmUgcmVtYWlucyB1bmtub3duCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBJQ2xhc3NGaWxlIGdldENsYXNzRmlsZSgpIHsKKwlyZXR1cm4gdGhpczsKK30KKy8qKgorICogQSBjbGFzcyBmaWxlIGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgdW5sZXNzIGl0IGlzIGNvbnRhaW5lZAorICogaW4gYSBqYXIuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJcmV0dXJuIG51bGw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCX0KK30KKy8qKgorICogQHNlZSBJQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudEF0KGludCBwb3NpdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUphdmFFbGVtZW50IHBhcmVudCA9IGdldFBhcmVudCgpOworCXdoaWxlIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKSB7CisJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwl9CisJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIHBhcmVudDsKKwlTb3VyY2VNYXBwZXIgbWFwcGVyID0gcm9vdC5nZXRTb3VyY2VNYXBwZXIoKTsKKwlpZiAobWFwcGVyID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfSBlbHNlIHsKKwkJSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKKwkJcmV0dXJuIGZpbmRFbGVtZW50KHR5cGUsIHBvc2l0aW9uLCBtYXBwZXIpOworCX0KK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpIHsKKwlyZXR1cm4gSmF2YUVsZW1lbnQuSkVNX0NMQVNTRklMRTsKK30KKy8qCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKwlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQlyZXR1cm4gcm9vdC5nZXRQYXRoKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpLmFwcGVuZCh0aGlzLmdldEVsZW1lbnROYW1lKCkpOworCX0KK30KKy8qCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CisJCXJldHVybiByb290LmdldFJlc291cmNlKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgoSUNvbnRhaW5lcil0aGlzLmdldFBhcmVudCgpLmdldFJlc291cmNlKCkpLmdldEZpbGUobmV3IFBhdGgodGhpcy5nZXRFbGVtZW50TmFtZSgpKSk7CisJfQorfQorLyoqCisgKiBAc2VlIElTb3VyY2VSZWZlcmVuY2UKKyAqLworcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlcigpOworCWlmIChidWZmZXIgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIGJ1ZmZlci5nZXRDb250ZW50cygpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VSZWZlcmVuY2UKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisJaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisJCVN0cmluZyBjb250ZW50cyA9IGJ1ZmZlci5nZXRDb250ZW50cygpOworCQlpZiAoY29udGVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiBuZXcgU291cmNlUmFuZ2UoMCwgY29udGVudHMubGVuZ3RoKCkpOworCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyBJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGZCaW5hcnlUeXBlID09IG51bGwpIHsKKwkJLy8gUmVtb3ZlIHRoZSAiLmNsYXNzIiBmcm9tIHRoZSBuYW1lIG9mIHRoZSBDbGFzc0ZpbGUgLSBhbHdheXMgd29ya3MKKwkJLy8gc2luY2UgY29uc3RydWN0b3IgZmFpbHMgaWYgbmFtZSBkb2VzIG5vdCBlbmQgd2l0aCAiLmNsYXNzIgorCQlTdHJpbmcgbmFtZSA9IGZOYW1lLnN1YnN0cmluZygwLCBmTmFtZS5sYXN0SW5kZXhPZignLicpKTsKKwkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOworCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCckJyk7CisJCWlmIChpbmRleCA+IC0xKSB7CisJCQlpZiAobmFtZS5sZW5ndGgoKSA+IChpbmRleCArIDEpICYmICFDaGFyYWN0ZXIuaXNEaWdpdChuYW1lLmNoYXJBdChpbmRleCArIDEpKSkgeworCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOworCQkJfQorCQl9CisJCWZCaW5hcnlUeXBlID0gbmV3IEJpbmFyeVR5cGUodGhpcywgbmFtZSk7CisJfQorCXJldHVybiBmQmluYXJ5VHlwZTsKK30KKy8qKgorICogQHNlZSBJQ2xhc3NGaWxlCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkvLyBnZXQgdGhlIHNvdXJjZSBpZiBwb3NzaWJsZQorCWNoYXJbXSBjb250ZW50cyA9IG51bGw7CisJU291cmNlTWFwcGVyIG1hcHBlciA9IHRoaXMuZ2V0U291cmNlTWFwcGVyKCk7CisJaWYgKG1hcHBlciAhPSBudWxsKSB7CisJCWNvbnRlbnRzID0gbWFwcGVyLmZpbmRTb3VyY2UoZ2V0VHlwZSgpKTsKKwl9CisJaWYgKGNvbnRlbnRzID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQ2xhc3NGaWxlV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBuZXcgQ2xhc3NGaWxlV29ya2luZ0NvcHkoKTsKKwlJQnVmZmVyIGJ1ZmZlciA9IGZhY3RvcnkgPT0gbnVsbCA/IHRoaXMuZ2V0QnVmZmVyKCkgOiBmYWN0b3J5LmNyZWF0ZUJ1ZmZlcih3b3JraW5nQ29weSk7CisJd29ya2luZ0NvcHkuYnVmZmVyID0gYnVmZmVyOworCQorCS8vIHNldCB0aGUgYnVmZmVyIHNvdXJjZQorCWlmIChidWZmZXIgIT0gbnVsbCAmJiBidWZmZXIuZ2V0Q2hhcmFjdGVycygpID09IG51bGwpeworCQlidWZmZXIuc2V0Q29udGVudHMoY29udGVudHMpOworCX0KKwlyZXR1cm4gd29ya2luZ0NvcHk7Cit9CisvKioKKyAqIEBzZWUgT3BlbmFibGUKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaGFzQnVmZmVyKCkgeworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBJZiBJIGFtIG5vdCBvcGVuLCByZXR1cm4gdHJ1ZSB0byBhdm9pZCBwYXJzaW5nLgorICoKKyAqIEBzZWUgSVBhcmVudCAKKyAqLworcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoaXNPcGVuKCkpIHsKKwkJcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSUNsYXNzRmlsZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIGdldFR5cGUoKS5pc0NsYXNzKCk7Cit9CisvKioKKyAqIEBzZWUgSUNsYXNzRmlsZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBnZXRUeXBlKCkuaXNJbnRlcmZhY2UoKTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIC0gY2xhc3MgZmlsZXMgYXJlIGFsd2F5cyByZWFkIG9ubHkuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIE9wZW5zIGFuZCByZXR1cm5zIGJ1ZmZlciBvbiB0aGUgc291cmNlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZmlsZS4KKyAqIE1hcHMgdGhlIHNvdXJjZSBjb2RlIHRvIHRoZSBjaGlsZHJlbiBlbGVtZW50cyBvZiB0aGlzIGNsYXNzIGZpbGUuCisgKiBJZiBubyBzb3VyY2UgY29kZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBmaWxlLCAKKyAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICogCisgKiBAc2VlIE9wZW5hYmxlCisgKi8KK3Byb3RlY3RlZCBJQnVmZmVyIG9wZW5CdWZmZXIoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU291cmNlTWFwcGVyIG1hcHBlciA9IGdldFNvdXJjZU1hcHBlcigpOworCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQljaGFyW10gY29udGVudHMgPSBtYXBwZXIuZmluZFNvdXJjZShnZXRUeXBlKCkpOworCQlpZiAoY29udGVudHMgIT0gbnVsbCkgeworCQkJLy8gY3JlYXRlIGJ1ZmZlcgorCQkJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXJGYWN0b3J5KCkuY3JlYXRlQnVmZmVyKHRoaXMpOworCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCUJ1ZmZlck1hbmFnZXIgYnVmTWFuYWdlciA9IGdldEJ1ZmZlck1hbmFnZXIoKTsKKwkJCWJ1Zk1hbmFnZXIuYWRkQnVmZmVyKGJ1ZmZlcik7CisJCQkKKwkJCS8vIHNldCB0aGUgYnVmZmVyIHNvdXJjZQorCQkJaWYgKGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgPT0gbnVsbCl7CisJCQkJYnVmZmVyLnNldENvbnRlbnRzKGNvbnRlbnRzKTsKKwkJCX0KKwkJCQorCQkJLy8gbGlzdGVuIHRvIGJ1ZmZlciBjaGFuZ2VzCisJCQlidWZmZXIuYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwkKKwkJCQkJCisJCQkvLyBkbyB0aGUgc291cmNlIG1hcHBpbmcKKwkJCW1hcHBlci5tYXBTb3VyY2UoZ2V0VHlwZSgpLCBjb250ZW50cyk7CisJCQkKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwl9IGVsc2UgeworCQkvLyBBdHRlbXB0cyB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGphdmEgZmlsZQorCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IGdldFR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkJTmFtZUxvb2t1cCBsb29rdXAgPSAoKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpKS5nZXROYW1lTG9va3VwKCk7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBsb29rdXAuZmluZENvbXBpbGF0aW9uVW5pdChxdWFsaWZpZWROYW1lKTsKKwkJaWYgKGN1ICE9IG51bGwpIHsKKwkJCXJldHVybiBjdS5nZXRCdWZmZXIoKTsKKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qCisgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCByb290ZWRBdChJSmF2YVByb2plY3QgcHJvamVjdCkgeworCXJldHVybgorCQluZXcgQ2xhc3NGaWxlKAorCQkJKElQYWNrYWdlRnJhZ21lbnQpKChKYXZhRWxlbWVudClmUGFyZW50KS5yb290ZWRBdChwcm9qZWN0KSwgCisJCQlmTmFtZSk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgTW9kZWwgZm9ybWF0IG9mIHRoZSBzaW1wbGUgY2xhc3MgbmFtZSBmb3IgdGhlCisgKiBnaXZlbiBjbGFzc05hbWUgd2hpY2ggaXMgcHJvdmlkZWQgaW4gZGlldCBjbGFzcyBmaWxlIGZvcm1hdCwKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiBjbGFzc05hbWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgKiAoVGhpcyByZW1vdmVzIHBhY2thZ2UgbmFtZSBhbmQgZW5jbG9zaW5nIHR5cGUgbmFtZXMpLgorICoKKyAqIDxwPjxjb2RlPkNsYXNzRmlsZVJlYWRlcjwvY29kZT4gZm9ybWF0IGlzIHNpbWlsYXIgdG8gImphdmEvbGFuZy9PYmplY3QiLAorICogYW5kIGNvcnJlc3BvbmRpbmcgSmF2YSBNb2RlbCBzaW1wbGUgbmFtZSBmb3JtYXQgaXMgIk9iamVjdCIuCisgKi8KKworLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIHNpbXBsZU5hbWUoY2hhcltdIGNsYXNzTmFtZSkgeworCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJY2xhc3NOYW1lID0gdW5xdWFsaWZpZWROYW1lKGNsYXNzTmFtZSk7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgbGFzdFBvc2l0aW9uID0gY2xhc3NOYW1lLmxlbmd0aCAtIDE7CisJZm9yIChpbnQgaSA9IGxhc3RQb3NpdGlvbjsgaSA+IC0xOyBpLS0pIHsKKwkJaWYgKGNsYXNzTmFtZVtpXSA9PSAnJCcgJiYgKGkgIT0gbGFzdFBvc2l0aW9uKSkgeworCQkJY2hhcltdIG5hbWUgPSBuZXcgY2hhcltjb3VudF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzTmFtZSwgaSArIDEsIG5hbWUsIDAsIGNvdW50KTsKKwkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChuYW1lWzBdKSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNsYXNzTmFtZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgSmF2YSBNb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbmFtZQorICogd2hpY2ggaXMgcHJvdmlkZWQgaW4gZGlldCBjbGFzcyBmaWxlIGZvcm1hdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoZSBnaXZlbiBuYW1lIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICoKKyAqIDxwPjxjb2RlPkNsYXNzRmlsZVJlYWRlcjwvY29kZT4gZm9ybWF0IGlzIHNpbWlsYXIgdG8gImphdmEvbGFuZy9PYmplY3QiLAorICogYW5kIGNvcnJlc3BvbmRpbmcgSmF2YSBNb2RlbCBmb3JtYXQgaXMgImphdmEubGFuZy5PYmplY3QiLgorICovCisKK3B1YmxpYyBzdGF0aWMgY2hhcltdIHRyYW5zbGF0ZWROYW1lKGNoYXJbXSBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJaW50IG5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aDsKKwljaGFyW10gbmV3TmFtZT0gbmV3IGNoYXJbbmFtZUxlbmd0aF07CisJZm9yIChpbnQgaT0gMDsgaSA8IG5hbWVMZW5ndGg7IGkrKykgeworCQlpZiAobmFtZVtpXSA9PSAnLycpIHsKKwkJCW5ld05hbWVbaV09ICcuJzsKKwkJfSBlbHNlIHsKKwkJCW5ld05hbWVbaV09IG5hbWVbaV07CisJCX0KKwl9CisJcmV0dXJuIG5ld05hbWU7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgTW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG5hbWVzCisgKiB3aGljaCBhcmUgcHJvdmlkZWQgaW4gZGlldCBjbGFzcyBmaWxlIGZvcm1hdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIHRoZSBnaXZlbiBuYW1lcyBhcmUgPGNvZGU+bnVsbDwvY29kZT4uCisgKgorICogPHA+PGNvZGU+Q2xhc3NGaWxlUmVhZGVyPC9jb2RlPiBmb3JtYXQgaXMgc2ltaWxhciB0byAiamF2YS9sYW5nL09iamVjdCIsCisgKiBhbmQgY29ycmVzcG9uZGluZyBKYXZhIE1vZGVsIGZvcm1hdCBpcyAiamF2YS5sYW5nLk9iamVjdCIuCisgKi8KKworLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdW10gdHJhbnNsYXRlZE5hbWVzKGNoYXJbXVtdIG5hbWVzKSB7CisJaWYgKG5hbWVzID09IG51bGwpCisJCXJldHVybiBudWxsOworCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7CisJY2hhcltdW10gbmV3TmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCW5ld05hbWVzW2ldID0gdHJhbnNsYXRlZE5hbWUobmFtZXNbaV0pOworCX0KKwlyZXR1cm4gbmV3TmFtZXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgTW9kZWwgZm9ybWF0IG9mIHRoZSB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUKKyAqIGdpdmVuIGNsYXNzTmFtZSB3aGljaCBpcyBwcm92aWRlZCBpbiBkaWV0IGNsYXNzIGZpbGUgZm9ybWF0LAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGdpdmVuIGNsYXNzTmFtZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAqIChUaGlzIHJlbW92ZXMgdGhlIHBhY2thZ2UgbmFtZSwgYnV0IG5vdCBlbmNsb3NpbmcgdHlwZSBuYW1lcykuCisgKgorICogPHA+PGNvZGU+Q2xhc3NGaWxlUmVhZGVyPC9jb2RlPiBmb3JtYXQgaXMgc2ltaWxhciB0byAiamF2YS9sYW5nL09iamVjdCIsCisgKiBhbmQgY29ycmVzcG9uZGluZyBKYXZhIE1vZGVsIHNpbXBsZSBuYW1lIGZvcm1hdCBpcyAiT2JqZWN0Ii4KKyAqLworCisvKiBwYWNrYWdlICovIHN0YXRpYyBjaGFyW10gdW5xdWFsaWZpZWROYW1lKGNoYXJbXSBjbGFzc05hbWUpIHsKKwlpZiAoY2xhc3NOYW1lID09IG51bGwpCisJCXJldHVybiBudWxsOworCWludCBjb3VudCA9IDA7CisJZm9yIChpbnQgaSA9IGNsYXNzTmFtZS5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkgeworCQlpZiAoY2xhc3NOYW1lW2ldID09ICcvJykgeworCQkJY2hhcltdIG5hbWUgPSBuZXcgY2hhcltjb3VudF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzTmFtZSwgaSArIDEsIG5hbWUsIDAsIGNvdW50KTsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCWNvdW50Kys7CisJfQorCXJldHVybiBjbGFzc05hbWU7Cit9CisKKy8qKgorICogQHNlZSBJQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IpCisgKiBAZGVwcmVjYXRlZCAtIHNob3VsZCB1c2UgY29kZUNvbXBsZXRlKGludCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IpIGluc3RlYWQKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIGZpbmFsIElDb2RlQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQorCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCl7CisJCWNvZGVDb21wbGV0ZShvZmZzZXQsIChJQ29tcGxldGlvblJlcXVlc3RvciludWxsKTsKKwkJcmV0dXJuOworCX0KKwljb2RlQ29tcGxldGUoCisJCW9mZnNldCwKKwkJbmV3IElDb21wbGV0aW9uUmVxdWVzdG9yKCl7CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKGNoYXJbXSBzdXBlclR5cGVQYWNrYWdlTmFtZSxjaGFyW10gc3VwZXJUeXBlTmFtZSwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBjbGFzc05hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIGNsYXNzTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEVycm9yKElQcm9ibGVtIGVycm9yKSB7CisJCQkJaWYgKHRydWUpIHJldHVybjsgLy8gd2FzIGRpc2FibGVkIGluIDEuMAorCisJCQkJdHJ5IHsKKwkJCQkJSU1hcmtlciBtYXJrZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLlRSQU5TSUVOVF9QUk9CTEVNKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCBlcnJvci5nZXRJRCgpKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIGVycm9yLmdldFNvdXJjZVN0YXJ0KCkpOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIGVycm9yLmdldFNvdXJjZUVuZCgpICsgMSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgZXJyb3IuZ2V0U291cmNlTGluZU51bWJlcigpKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIGVycm9yLmdldE1lc3NhZ2UoKSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRFcnJvcihtYXJrZXIpOworCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCQl9CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbmFtZSwgdHlwZVBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIGludGVyZmFjZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRLZXl3b3JkKGNoYXJbXSBrZXl3b3JkTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0S2V5d29yZChrZXl3b3JkTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJcmVxdWVzdG9yLmFjY2VwdExhYmVsKGxhYmVsTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoY2hhcltdIG5hbWUsY2hhcltdIHR5cGVQYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSxjaGFyW10gc2VsZWN0b3IsY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyxjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSByZXR1cm5UeXBlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQkvLyBza2lwIHBhcmFtZXRlciBuYW1lcworCQkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2QoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgc2VsZWN0b3IsIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgcGFyYW1ldGVyVHlwZU5hbWVzLCByZXR1cm5UeXBlUGFja2FnZU5hbWUsIHJldHVyblR5cGVOYW1lLCBjb21wbGV0aW9uTmFtZSwgbW9kaWZpZXJzLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsY2hhcltdIHNlbGVjdG9yLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSxjaGFyW10gcmV0dXJuVHlwZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRNb2RpZmllcihjaGFyW10gbW9kaWZpZXJOYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCXJlcXVlc3Rvci5hY2NlcHRNb2RpZmllcihtb2RpZmllck5hbWUsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2UocGFja2FnZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0VHlwZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0VmFyaWFibGVOYW1lKGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGNoYXJbXSBuYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzMzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZUluZm8uamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlOZXN0ZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CisKKy8qKgorICogRWxlbWVudCBpbmZvIGZvciA8Y29kZT5DbGFzc0ZpbGU8L2NvZGU+IGhhbmRsZXMuCisgKi8KKyAKKy8qIHBhY2thZ2UgKi8gY2xhc3MgQ2xhc3NGaWxlSW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8geworCS8qKiAKKwkgKiBUaGUgY2hpbGRyZW4gb2YgdGhlIDxjb2RlPkJpbmFyeVR5cGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gb3VyCisJICogPGNvZGU+Q2xhc3NGaWxlPC9jb2RlPi4gVGhlc2UgYXJlIGtlcHQgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUKKwkgKiBhY2Nlc3MgdG8gdGhlIDxjb2RlPkJpbmFyeVR5cGU8L2NvZGU+IGluZm8gKDxjb2RlPkNsYXNzRmlsZVJlYWRlcjwvY29kZT4pLgorCSAqIDxwPgorCSAqIFRoZSBjaGlsZHJlbiBhcmUgbGF6aWx5IGluaXRpYWxpemVkLCBvbiB0aGUgZmlyc3QgY2FsbCB0bworCSAqIDxjb2RlPmdldEJpbmFyeUNoaWxkcmVuKCk8L2NvZGU+LCB3aGljaCBpbiB0dXJuIGlzIGNhbGxlZCBieQorCSAqIDxjb2RlPkJpbmFyeVR5cGUuZ2V0Q2hpbGRyZW4oKTwvY29kZT4uIAorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBmQmluYXJ5Q2hpbGRyZW4gPSBudWxsOworCS8qKgorCSAqIEJhY2stcG9pbnRlciB0byB0aGUgSUNsYXNzRmlsZSB0byBhbGxvdyBsYXp5IGluaXRpYWxpemF0aW9uLgorCSAqLworCXByb3RlY3RlZCBJQ2xhc3NGaWxlIGZDbGFzc0ZpbGUgPSBudWxsOworLyoqCisgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzRmlsZUluZm88L2NvZGU+IGZvciA8Y29kZT5jbGFzc0ZpbGU8L2NvZGU+LgorICovCitDbGFzc0ZpbGVJbmZvKElDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJZkNsYXNzRmlsZSA9IGNsYXNzRmlsZTsKK30KKy8qKgorICogQ3JlYXRlcyB0aGUgaGFuZGxlcyBhbmQgaW5mb3MgZm9yIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGJpbmFyeSB0eXBlLgorICogQWRkcyBuZXcgaGFuZGxlcyB0byB0aGUgZ2l2ZW4gdmVjdG9yLgorICovCitwcml2YXRlIHZvaWQgZ2VuZXJhdGVGaWVsZEluZm9zKElUeXBlIHR5cGUsIElCaW5hcnlUeXBlIHR5cGVJbmZvLCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKKwkvLyBNYWtlIHRoZSBmaWVsZHMKKwlJQmluYXJ5RmllbGRbXSBmaWVsZHMgPSB0eXBlSW5mby5nZXRGaWVsZHMoKTsKKwlpZiAoZmllbGRzID09IG51bGwpIHsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGludCBpID0gMCwgZmllbGRDb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBmaWVsZENvdW50OyBpKyspIHsKKwkJSUJpbmFyeUZpZWxkIGZpZWxkSW5mbyA9IGZpZWxkc1tpXTsKKwkJSUZpZWxkIGZpZWxkID0gbmV3IEJpbmFyeUZpZWxkKHR5cGUsIG5ldyBTdHJpbmcoZmllbGRJbmZvLmdldE5hbWUoKSkpOworCQluZXdFbGVtZW50cy5wdXQoZmllbGQsIGZpZWxkSW5mbyk7CisJCWNoaWxkcmVuLmFkZChmaWVsZCk7CisJfQorfQorLyoqCisgKiBDcmVhdGVzIHRoZSBoYW5kbGVzIGFuZCBpbmZvcyBmb3IgdGhlIGlubmVyIHR5cGVzIG9mIHRoZSBnaXZlbiBiaW5hcnkgdHlwZS4KKyAqIEFkZHMgbmV3IGhhbmRsZXMgdG8gdGhlIGdpdmVuIHZlY3Rvci4KKyAqLworcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW5uZXJDbGFzc0luZm9zKElUeXBlIHR5cGUsIElCaW5hcnlUeXBlIHR5cGVJbmZvLCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKKwkvLyBBZGQgaW5uZXIgdHlwZXMKKwkvLyBJZiB0aGUgY3VycmVudCB0eXBlIGlzIGFuIGlubmVyIHR5cGUsIGlubmVyQ2xhc3NlcyByZXR1cm5zCisJLy8gYW4gZXh0cmEgZW50cnkgZm9yIHRoZSBjdXJyZW50IHR5cGUuICBUaGlzIGVudHJ5IG11c3QgYmUgcmVtb3ZlZC4KKwkvLyBDYW4gYWxzbyByZXR1cm4gYW4gZW50cnkgZm9yIHRoZSBlbmNsb3NpbmcgdHlwZSBvZiBhbiBpbm5lciB0eXBlLgorCUlCaW5hcnlOZXN0ZWRUeXBlW10gaW5uZXJUeXBlcyA9IHR5cGVJbmZvLmdldE1lbWJlclR5cGVzKCk7CisJaWYgKGlubmVyVHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgdHlwZUNvdW50ID0gaW5uZXJUeXBlcy5sZW5ndGg7IGkgPCB0eXBlQ291bnQ7IGkrKykgeworCQkJSUJpbmFyeU5lc3RlZFR5cGUgYmluYXJ5VHlwZSA9IGlubmVyVHlwZXNbaV07CisJCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZT0gKChJUGFja2FnZUZyYWdtZW50KWZDbGFzc0ZpbGUuZ2V0UGFyZW50KCkpLmdldENsYXNzRmlsZShuZXcgU3RyaW5nKENsYXNzRmlsZS51bnF1YWxpZmllZE5hbWUoYmluYXJ5VHlwZS5nZXROYW1lKCkpKSArICIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJSVR5cGUgaW5uZXJUeXBlID0gbmV3IEJpbmFyeVR5cGUoY2xhc3NGaWxlLCBuZXcgU3RyaW5nKENsYXNzRmlsZS5zaW1wbGVOYW1lKGJpbmFyeVR5cGUuZ2V0TmFtZSgpKSkpOworCQkJY2hpbGRyZW4uYWRkKGlubmVyVHlwZSk7CisJCX0KKwl9Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIGhhbmRsZXMgYW5kIGluZm9zIGZvciB0aGUgbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gYmluYXJ5IHR5cGUuCisgKiBBZGRzIG5ldyBoYW5kbGVzIHRvIHRoZSBnaXZlbiB2ZWN0b3IuCisgKi8KK3ByaXZhdGUgdm9pZCBnZW5lcmF0ZU1ldGhvZEluZm9zKElUeXBlIHR5cGUsIElCaW5hcnlUeXBlIHR5cGVJbmZvLCBIYXNoTWFwIG5ld0VsZW1lbnRzLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKKwlJQmluYXJ5TWV0aG9kW10gbWV0aG9kcyA9IHR5cGVJbmZvLmdldE1ldGhvZHMoKTsKKwlpZiAobWV0aG9kcyA9PSBudWxsKSB7CisJCXJldHVybjsKKwl9CisJZm9yIChpbnQgaSA9IDAsIG1ldGhvZENvdW50ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtZXRob2RDb3VudDsgaSsrKSB7CisJCUlCaW5hcnlNZXRob2QgbWV0aG9kSW5mbyA9IG1ldGhvZHNbaV07CisJCVN0cmluZ1tdIHBOYW1lcz0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwkJY2hhcltdW10gcGFyYW1OYW1lcz0gbmV3IGNoYXJbcE5hbWVzLmxlbmd0aF1bXTsKKwkJZm9yIChpbnQgaj0gMDsgaiA8IHBOYW1lcy5sZW5ndGg7IGorKykgeworCQkJcGFyYW1OYW1lc1tqXT0gcE5hbWVzW2pdLnRvQ2hhckFycmF5KCk7CisJCX0KKwkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWVzKHBhcmFtTmFtZXMpOworCQlTdHJpbmcgc2VsZWN0b3IgPSBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0U2VsZWN0b3IoKSk7CisJCWlmIChtZXRob2RJbmZvLmlzQ29uc3RydWN0b3IoKSkgeworCQkJc2VsZWN0b3IgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7CisJCX0KKwkJZm9yIChpbnQgaj0gMDsgaiA8IHBOYW1lcy5sZW5ndGg7IGorKykgeworCQkJcE5hbWVzW2pdPSBuZXcgU3RyaW5nKHBhcmFtZXRlclR5cGVzW2pdKTsKKwkJfQorCQlJTWV0aG9kIG1ldGhvZCA9IG5ldyBCaW5hcnlNZXRob2QodHlwZSwgc2VsZWN0b3IsIHBOYW1lcyk7CisJCWNoaWxkcmVuLmFkZChtZXRob2QpOworCQluZXdFbGVtZW50cy5wdXQobWV0aG9kLCBtZXRob2RJbmZvKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gKDxjb2RlPkJpbmFyeU1lbWJlcjwvY29kZT5zKSBvZiB0aGUKKyAqIDxjb2RlPkJpbmFyeVR5cGU8L2NvZGU+IG9mIG91ciA8Y29kZT5DbGFzc0ZpbGU8L2NvZGU+LgorICovCitJSmF2YUVsZW1lbnRbXSBnZXRCaW5hcnlDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChmQmluYXJ5Q2hpbGRyZW4gPT0gbnVsbCkgeworCQlyZWFkQmluYXJ5Q2hpbGRyZW4oKTsKKwl9CisJcmV0dXJuIGZCaW5hcnlDaGlsZHJlbjsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiB0aGUgPGNvZGU+cmVhZEJpbmFyeUNoaWxkcmVuPC9jb2RlPiBoYXMgYWxyZWFkeQorICogYmVlbiBjYWxsZWQuCisgKi8KK2Jvb2xlYW4gaGFzUmVhZEJpbmFyeUNoaWxkcmVuKCkgeworCXJldHVybiBmQmluYXJ5Q2hpbGRyZW4gIT0gbnVsbDsKK30KKy8qKgorICogQ3JlYXRlcyB0aGUgaGFuZGxlcyBmb3IgPGNvZGU+QmluYXJ5TWVtYmVyPC9jb2RlPnMgZGVmaW5lZCBpbiB0aGlzCisgKiA8Y29kZT5DbGFzc0ZpbGU8L2NvZGU+IGFuZCBhZGRzIHRoZW0gdG8gdGhlCisgKiA8Y29kZT5KYXZhTW9kZWxNYW5hZ2VyPC9jb2RlPidzIGNhY2hlLgorICovCitwcml2YXRlIHZvaWQgcmVhZEJpbmFyeUNoaWxkcmVuKCkgeworCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwlIYXNoTWFwIG5ld0VsZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKwlCaW5hcnlUeXBlIHR5cGUgPSBudWxsOworCUlCaW5hcnlUeXBlIHR5cGVJbmZvID0gbnVsbDsKKwlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSAoSmF2YU1vZGVsTWFuYWdlcikgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJdHJ5IHsKKwkJdHlwZSA9IChCaW5hcnlUeXBlKSBmQ2xhc3NGaWxlLmdldFR5cGUoKTsKKwkJdHlwZUluZm8gPSAoSUJpbmFyeVR5cGUpIG1hbmFnZXIuZ2V0SW5mbyh0eXBlKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHR5cGVJbmZvICE9IG51bGwpIHsgLy9tYXkgbm90IGJlIGEgdmFsaWQgY2xhc3MgZmlsZQorCQlnZW5lcmF0ZUZpZWxkSW5mb3ModHlwZSwgdHlwZUluZm8sIG5ld0VsZW1lbnRzLCBjaGlsZHJlbik7CisJCWdlbmVyYXRlTWV0aG9kSW5mb3ModHlwZSwgdHlwZUluZm8sIG5ld0VsZW1lbnRzLCBjaGlsZHJlbik7CisJCWdlbmVyYXRlSW5uZXJDbGFzc0luZm9zKHR5cGUsIHR5cGVJbmZvLCBuZXdFbGVtZW50cywgY2hpbGRyZW4pOworCX0KKwkKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdFbGVtZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKwkJbWFuYWdlci5wdXRJbmZvKAorCQkJKElKYXZhRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIAorCQkJZW50cnkuZ2V0VmFsdWUoKSk7CisJfQorCWZCaW5hcnlDaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbY2hpbGRyZW4uc2l6ZSgpXTsKKwljaGlsZHJlbi50b0FycmF5KGZCaW5hcnlDaGlsZHJlbik7Cit9CisvKioKKyAqIFJlbW92ZXMgdGhlIGJpbmFyeSBjaGlsZHJlbiBoYW5kbGVzIGFuZCByZW1vdmUgdGhlaXIgaW5mb3MgZnJvbQorICogdGhlIDxjb2RlPkphdmFNb2RlbE1hbmFnZXI8L2NvZGU+J3MgY2FjaGUuCisgKi8KK3ZvaWQgcmVtb3ZlQmluYXJ5Q2hpbGRyZW4oKSB7CisJaWYgKGZCaW5hcnlDaGlsZHJlbiAhPSBudWxsKSB7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IChKYXZhTW9kZWxNYW5hZ2VyKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPGZCaW5hcnlDaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJbWFuYWdlci5yZW1vdmVJbmZvKGZCaW5hcnlDaGlsZHJlbltpXSk7CisJCX0KKwkJZkJpbmFyeUNoaWxkcmVuID0gZmdFbXB0eUNoaWxkcmVuOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZVdvcmtpbmdDb3B5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVXb3JraW5nQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDBmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVXb3JraW5nQ29weS5qYXZhCkBAIC0wLDAgKzEsNTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21wbGV0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHdvcmtpbmcgY29weSBvbiBhbiA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPi4KKyAqIE9ubHkgdGhlIDxjb2RlPmdldEJ1ZmZlcigpPC9jb2RlPiBhbmQgPGNvZGU+Z2V0T3JpZ2luYWxFbGVtZW50KCk8L2NvZGU+IG9wZXJhdGlvbnMgYXJlIHZhbGlkLgorICogQWxsIG90aGVyIG9wZXJhdGlvbnMgcmV0dXJuIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBvciB0aHJvdyBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4uCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0ZpbGVXb3JraW5nQ29weSBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXQgeworCQorCXB1YmxpYyBJQnVmZmVyIGJ1ZmZlcjsKKwkKKworCS8qCisJICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NyZWF0ZUltcG9ydChTdHJpbmcsIElKYXZhRWxlbWVudCwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUltcG9ydERlY2xhcmF0aW9uIGNyZWF0ZUltcG9ydCgKKwkJU3RyaW5nIG5hbWUsCisJCUlKYXZhRWxlbWVudCBzaWJsaW5nLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY3JlYXRlUGFja2FnZURlY2xhcmF0aW9uKFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VEZWNsYXJhdGlvbiBjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oCisJCVN0cmluZyBuYW1lLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY3JlYXRlVHlwZShTdHJpbmcsIElKYXZhRWxlbWVudCwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSVR5cGUgY3JlYXRlVHlwZSgKKwkJU3RyaW5nIGNvbnRlbnRzLAorCQlJSmF2YUVsZW1lbnQgc2libGluZywKKwkJYm9vbGVhbiBmb3JjZSwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldEFsbFR5cGVzKCkKKwkgKi8KKwlwdWJsaWMgSVR5cGVbXSBnZXRBbGxUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0RWxlbWVudEF0KGludCkKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IGdldEVsZW1lbnRBdChpbnQgcG9zaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0SW1wb3J0KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSUltcG9ydERlY2xhcmF0aW9uIGdldEltcG9ydChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNnZXRJbXBvcnRDb250YWluZXIoKQorCSAqLworCXB1YmxpYyBJSW1wb3J0Q29udGFpbmVyIGdldEltcG9ydENvbnRhaW5lcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0SW1wb3J0cygpCisJICovCisJcHVibGljIElJbXBvcnREZWNsYXJhdGlvbltdIGdldEltcG9ydHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0T3BlbmFibGUoKQorCSAqLworCXB1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldFBhY2thZ2VEZWNsYXJhdGlvbihTdHJpbmcpCisJICovCisJcHVibGljIElQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZURlY2xhcmF0aW9uKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldFBhY2thZ2VEZWNsYXJhdGlvbnMoKQorCSAqLworCXB1YmxpYyBJUGFja2FnZURlY2xhcmF0aW9uW10gZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0VHlwZShTdHJpbmcpCisJICovCisJcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0VHlwZXMoKQorCSAqLworCXB1YmxpYyBJVHlwZVtdIGdldFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2V4aXN0cygpCisJICovCisJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorLyoKKyAqIEBzZWUgSVdvcmtpbmdDb3B5CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnRbXSBmaW5kRWxlbWVudHMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgSVR5cGUgZmluZFByaW1hcnlUeXBlKCkgeworCXJldHVybiBudWxsOworfQorCisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKQorCSAqLworCXB1YmxpYyBJUmVzb3VyY2UgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2dldEVsZW1lbnROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2dldEVsZW1lbnRUeXBlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2dldEhhbmRsZUlkZW50aWZpZXIoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlSWRlbnRpZmllcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRKYXZhTW9kZWwoKQorCSAqLworCXB1YmxpYyBJSmF2YU1vZGVsIGdldEphdmFNb2RlbCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRKYXZhUHJvamVjdCgpCisJICovCisJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRQYXJlbnQoKQorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJcmV0dXJuIG51bGw7Cit9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKworCS8qCisJICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkKKwkgKi8KKwlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudCNpc1JlYWRPbmx5KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlUmVmZXJlbmNlI2dldFNvdXJjZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJU291cmNlUmVmZXJlbmNlI2dldFNvdXJjZVJhbmdlKCkKKwkgKi8KKwlwdWJsaWMgSVNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBhcmVudCNnZXRDaGlsZHJlbigpCisJICovCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBhcmVudCNoYXNDaGlsZHJlbigpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJT3BlbmFibGUjY2xvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJfQorCisJLyoKKwkgKiBAc2VlIElPcGVuYWJsZSNnZXRCdWZmZXIoKQorCSAqLworCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5idWZmZXI7CisJfQorCisJLyoKKwkgKiBAc2VlIElPcGVuYWJsZSNoYXNVbnNhdmVkQ2hhbmdlcygpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzVW5zYXZlZENoYW5nZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJT3BlbmFibGUjaXNDb25zaXN0ZW50KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBJT3BlbmFibGUjaXNPcGVuKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSU9wZW5hYmxlI21ha2VDb25zaXN0ZW50KElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgbWFrZUNvbnNpc3RlbnQoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSU9wZW5hYmxlI29wZW4oSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBvcGVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElPcGVuYWJsZSNzYXZlKElQcm9ncmVzc01vbml0b3IsIGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzLCBib29sZWFuIGZvcmNlKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJV29ya2luZ0NvcHkjY29tbWl0KGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVdvcmtpbmdDb3B5I2Rlc3Ryb3koKQorCSAqLworCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElXb3JraW5nQ29weSNmaW5kU2hhcmVkV29ya2luZ0NvcHkoSUJ1ZmZlckZhY3RvcnkpCisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBmaW5kU2hhcmVkV29ya2luZ0NvcHkoSUJ1ZmZlckZhY3RvcnkgYnVmZmVyRmFjdG9yeSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVdvcmtpbmdDb3B5I2dldE9yaWdpbmFsKElKYXZhRWxlbWVudCkKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IGdldE9yaWdpbmFsKElKYXZhRWxlbWVudCB3b3JraW5nQ29weUVsZW1lbnQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElXb3JraW5nQ29weSNnZXRPcmlnaW5hbEVsZW1lbnQoKQorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0T3JpZ2luYWxFbGVtZW50KCkgeworCQlyZXR1cm4gbmV3IENsYXNzRmlsZSgoSVBhY2thZ2VGcmFnbWVudClnZXRQYXJlbnQoKSwgZ2V0RWxlbWVudE5hbWUoKSk7CisJfQorCisJCS8qCisJICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpCisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBnZXRTaGFyZWRXb3JraW5nQ29weSgKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAorCQlJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LAorCQlJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKworCS8qCisJICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0V29ya2luZ0NvcHkoKQorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKwkvKgorCSAqIEBzZWUgSVdvcmtpbmdDb3B5I2dldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3RvcikKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IGdldFdvcmtpbmdDb3B5KAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCisJCUlCdWZmZXJGYWN0b3J5IGZhY3RvcnksCisJCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IpIAorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworCX0KKwkvKgorCSAqIEBzZWUgSVdvcmtpbmdDb3B5I2hhc01hbmFnZWRXb3JraW5nQ29weSgpCisJICovCisKKwkvKgorCSAqIEBzZWUgSVdvcmtpbmdDb3B5I2lzQmFzZWRPbihJUmVzb3VyY2UpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCYXNlZE9uKElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElXb3JraW5nQ29weSNpc1dvcmtpbmdDb3B5KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weSNyZWNvbmNpbGUoKQorCSAqLworCXB1YmxpYyBJTWFya2VyW10gcmVjb25jaWxlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElXb3JraW5nQ29weSNyZWNvbmNpbGUoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWNvbmNpbGUoCisJCWJvb2xlYW4gZm9yY2VQcm9ibGVtRGV0ZWN0aW9uLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHkjcmVzdG9yZSgpCisJICovCisJcHVibGljIHZvaWQgcmVzdG9yZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlTWFuaXB1bGF0aW9uI2NvcHkoSUphdmFFbGVtZW50LCBJSmF2YUVsZW1lbnQsIFN0cmluZywgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb3B5KAorCQlJSmF2YUVsZW1lbnQgY29udGFpbmVyLAorCQlJSmF2YUVsZW1lbnQgc2libGluZywKKwkJU3RyaW5nIHJlbmFtZSwKKwkJYm9vbGVhbiByZXBsYWNlLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlTWFuaXB1bGF0aW9uI2RlbGV0ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlTWFuaXB1bGF0aW9uI21vdmUoSUphdmFFbGVtZW50LCBJSmF2YUVsZW1lbnQsIFN0cmluZywgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBtb3ZlKAorCQlJSmF2YUVsZW1lbnQgY29udGFpbmVyLAorCQlJSmF2YUVsZW1lbnQgc2libGluZywKKwkJU3RyaW5nIHJlbmFtZSwKKwkJYm9vbGVhbiByZXBsYWNlLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlTWFuaXB1bGF0aW9uI3JlbmFtZShTdHJpbmcsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIHJlcGxhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIElDb21wbGV0aW9uUmVxdWVzdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUFzc2lzdCNjb2RlU2VsZWN0KGludCwgaW50KQorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBjb2RlU2VsZWN0KGludCBvZmZzZXQsIGludCBsZW5ndGgpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCB0aGlzKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IpCisJICogQGRlcHJlY2F0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0QW5jZXN0b3IoaW50KQorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODQ4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CisKKy8qKgorICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKyAqLworcHVibGljIGNsYXNzIENsYXNzcGF0aEVudHJ5IGltcGxlbWVudHMgSUNsYXNzcGF0aEVudHJ5IHsKKworCS8qKgorCSAqIERlc2NyaWJlcyB0aGUga2luZCBvZiBjbGFzc3BhdGggZW50cnkgLSBvbmUgb2YgCisJICogQ1BFX1BST0pFQ1QsIENQRV9MSUJSQVJZLCBDUEVfU09VUkNFLCBDUEVfVkFSSUFCTEUgb3IgQ1BFX0NPTlRBSU5FUgorCSAqLworCXByb3RlY3RlZCBpbnQgZW50cnlLaW5kOworCisJLyoqCisJICogRGVzY3JpYmVzIHRoZSBraW5kIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgZm91bmQgb24KKwkgKiB0aGlzIGNsYXNzcGF0aCBlbnRyeSAtIGVpdGhlciBLX0JJTkFSWSBvciBLX1NPVVJDRSBvcgorCSAqIEtfT1VUUFVULgorCSAqLworCXByb3RlY3RlZCBpbnQgY29udGVudEtpbmQ7CisKKwkvKioKKwkgKiBUaGUgbWVhbmluZyBvZiB0aGUgcGF0aCBvZiBhIGNsYXNzcGF0aCBlbnRyeSBkZXBlbmRzIG9uIGl0cyBlbnRyeSBraW5kOjx1bD4KKwkgKgk8bGk+U291cmNlIGNvZGUgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCAoPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4pIC0gIAorCSAqICAgICAgVGhlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50cnkgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJvb3QgZm9sZGVyLiA8L2xpPgorCSAqCTxsaT5BIGJpbmFyeSBsaWJyYXJ5IGluIHRoZSBjdXJyZW50IHByb2plY3QgKDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPikgLSB0aGUgcGF0aAorCSAqCQlhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeSBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgSkFSIChvciByb290IGZvbGRlciksIGFuZCAKKwkgKgkJaW4gY2FzZSBpdCByZWZlcnMgdG8gYW4gZXh0ZXJuYWwgSkFSLCB0aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UgaW4gCisJICoJCXRoZSB3b3JrYmVuY2guCisJICoJPGxpPkEgcmVxdWlyZWQgcHJvamVjdCAoPGNvZGU+Q1BFX1BST0pFQ1Q8L2NvZGU+KSAtIHRoZSBwYXRoIG9mIHRoZSBlbnRyeSBkZW5vdGVzIHRoZQorCSAqCQlwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcmVzb3VyY2UuPC9saT4KKwkgKiAgPGxpPkEgdmFyaWFibGUgZW50cnkgKDxjb2RlPkNQRV9WQVJJQUJMRTwvY29kZT4pIC0gdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGggCisJICogICAgICBpcyB0aGUgbmFtZSBvZiBhIGNsYXNzcGF0aCB2YXJpYWJsZS4gSWYgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUKKwkgKgkJaXMgYm91bmQgdG8gdGhlIHBhdGggPGl0PlA8L2l0PiwgdGhlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGVudHJ5CisJICoJCWlzIGNvbXB1dGVkIGJ5IGFwcGVuZGluZyB0byA8aXQ+UDwvaXQ+IHRoZSBzZWdtZW50cyBvZiB0aGUgcmV0dXJuZWQKKwkgKgkJcGF0aCB3aXRob3V0IHRoZSB2YXJpYWJsZS48L2xpPgorCSAqICA8bGk+IEEgY29udGFpbmVyIGVudHJ5ICg8Y29kZT5DUEVfQ09OVEFJTkVSPC9jb2RlPikgLSB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aCBpcyBkZW5vdGluZworCSAqICAgICB0aGUgdW5pcXVlIGNvbnRhaW5lciBpZGVudGlmaWVyIChmb3Igd2hpY2ggYSA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gY291bGQgYmUKKwkgKiAJcmVnaXN0ZXJlZCksIGFuZCB0aGUgcmVtYWluaW5nIHNlZ21lbnRzIGFyZSB1c2VkIGFzIGFkZGl0aW9uYWwgaGludHMgZm9yIHJlc29sdmluZyB0aGUgY29udGFpbmVyIGVudHJ5IHRvCisJICogCWFuIGFjdHVhbCA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPi48L2xpPgorCSAqLworCXByb3RlY3RlZCBJUGF0aCBwYXRoOworCisJLyoqCisJICogRGVzY3JpYmVzIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjbGFzc3BhdGggZW50cnkgaGFzIG5vCisJICogc291cmNlIGF0dGFjaG1lbnQuCisJICogPHA+CisJICogT25seSBsaWJyYXJ5IGFuZCB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcyBtYXkgaGF2ZSBzb3VyY2UgYXR0YWNobWVudHMuCisJICogRm9yIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJpZXMsIHRoZSByZXN1bHQgcGF0aCAoaWYgcHJlc2VudCkgbG9jYXRlcyBhIHNvdXJjZQorCSAqIGFyY2hpdmUuIEZvciB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcywgdGhlIHJlc3VsdCBwYXRoIChpZiBwcmVzZW50KSBoYXMKKwkgKiBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUgdmFyaWFibGUgcGF0aCwgbmFtZWx5IHRoZSBmaXJzdCBzZWdtZW50IAorCSAqIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqLworCXByb3RlY3RlZCBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKKworCS8qKgorCSAqIERlc2NyaWJlcyB0aGUgcGF0aCB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlIHdoZXJlIHBhY2thZ2UgZnJhZ21lbnRzCisJICogYXJlIGxvY2F0ZWQuIEFuIGVtcHR5IHBhdGggaW5kaWNhdGVzIHRoYXQgcGFja2FnZXMgYXJlIGxvY2F0ZWQgYXQKKwkgKiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIGFyY2hpdmUuIFJldHVybnMgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUKKwkgKiBpZiBhbmQgb25seSBpZiA8Y29kZT5nZXRTb3VyY2VBdHRhY2htZW50UGF0aDwvY29kZT4gcmV0dXJucyAKKwkgKiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOworCisJLyoqCisJICogQSBjb25zdGFudCBpbmRpY2F0aW5nIGFuIG91dHB1dCBsb2NhdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX09VVFBVVCA9IDEwOworCisJLyoqCisJICogVGhlIGV4cG9ydCBmbGFnCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBvcnRlZDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBjbGFzcyBwYXRoIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQga2luZCB3aXRoIHRoZSBnaXZlbiBwYXRoLgorCSAqLworCXB1YmxpYyBDbGFzc3BhdGhFbnRyeSgKKwkJaW50IGNvbnRlbnRLaW5kLAorCQlpbnQgZW50cnlLaW5kLAorCQlJUGF0aCBwYXRoLAorCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKKworCQl0aGlzLmNvbnRlbnRLaW5kID0gY29udGVudEtpbmQ7CisJCXRoaXMuZW50cnlLaW5kID0gZW50cnlLaW5kOworCQl0aGlzLnBhdGggPSBwYXRoOworCQl0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gc291cmNlQXR0YWNobWVudFBhdGg7CisJCXRoaXMuc291cmNlQXR0YWNobWVudFJvb3RQYXRoID0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoOworCQl0aGlzLmlzRXhwb3J0ZWQgPSBpc0V4cG9ydGVkOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGNsYXNzcGF0aCBlbnRyeQorCSAqIHdpdGggZXF1aXZhbGVudCBhdHRyaWJ1dGVzLgorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmICh0aGlzID09IG9iamVjdCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNsYXNzcGF0aEVudHJ5KSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgb3RoZXJFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIG9iamVjdDsKKworCQkJaWYgKHRoaXMuY29udGVudEtpbmQgIT0gb3RoZXJFbnRyeS5nZXRDb250ZW50S2luZCgpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaWYgKHRoaXMuZW50cnlLaW5kICE9IG90aGVyRW50cnkuZ2V0RW50cnlLaW5kKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQlpZiAodGhpcy5pc0V4cG9ydGVkICE9IG90aGVyRW50cnkuaXNFeHBvcnRlZCgpKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJaWYgKCF0aGlzLnBhdGguZXF1YWxzKG90aGVyRW50cnkuZ2V0UGF0aCgpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCUlQYXRoIG90aGVyUGF0aCA9IG90aGVyRW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwkJCWlmICh0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXJQYXRoICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCF0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoLmVxdWFscyhvdGhlclBhdGgpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCW90aGVyUGF0aCA9IG90aGVyRW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7CisJCQlpZiAodGhpcy5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPT0gbnVsbCkgeworCQkJCWlmIChvdGhlclBhdGggIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXRoaXMuc291cmNlQXR0YWNobWVudFJvb3RQYXRoLmVxdWFscyhvdGhlclBhdGgpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKi8KKwlwdWJsaWMgaW50IGdldENvbnRlbnRLaW5kKCkgeworCQlyZXR1cm4gdGhpcy5jb250ZW50S2luZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RW50cnlLaW5kKCkgeworCQlyZXR1cm4gdGhpcy5lbnRyeUtpbmQ7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKi8KKwlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHRoaXMucGF0aDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQorCSAqLworCXB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpIHsKKwkJcmV0dXJuIHRoaXMuc291cmNlQXR0YWNobWVudFBhdGg7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKi8KKwlwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgeworCQlyZXR1cm4gdGhpcy5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIGNsYXNzcGF0aCBlbnRyeQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLnBhdGguaGFzaENvZGUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNpc0V4cG9ydGVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydGVkKCkgeworCQlyZXR1cm4gdGhpcy5pc0V4cG9ydGVkOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzc3BhdGggZW50cnkuCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRQYXRoKCkudG9TdHJpbmcoKSk7CisJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKKwkJc3dpdGNoIChnZXRFbnRyeUtpbmQoKSkgeworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9MSUJSQVJZIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJDUEVfUFJPSkVDVCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJDUEVfU09VUkNFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6CisJCQkJYnVmZmVyLmFwcGVuZCgiQ1BFX1ZBUklBQkxFIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgorCQkJCWJ1ZmZlci5hcHBlbmQoIkNQRV9DT05UQUlORVIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIl1bIik7IC8vJE5PTi1OTFMtMSQKKwkJc3dpdGNoIChnZXRDb250ZW50S2luZCgpKSB7CisJCQljYXNlIElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJLX0JJTkFSWSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJLX1NPVVJDRSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUIDoKKwkJCQlidWZmZXIuYXBwZW5kKCJLX09VVFBVVCIpOyAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCgnXScpOworCQlpZiAoZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCJbc291cmNlUGF0aDoiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKwkJfQorCQlpZiAoZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiW3Jvb3RQYXRoOiIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKCJbaXNFeHBvcnRlZDoiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHRoaXMuaXNFeHBvcnRlZCk7CisJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXJzIGFuIElEIHdoaWNoIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggZW50cmllcyBkdXJpbmcgcGFja2FnZQorCSAqIGZyYWdtZW50IHJvb3QgY29tcHV0YXRpb25zCisJICovCisJcHVibGljIFN0cmluZyByb290SUQoKXsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOworCQlidWZmZXIuYXBwZW5kKCdbJyk7CisJCXN3aXRjaCh0aGlzLmVudHJ5S2luZCl7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CisJCQkJcmV0dXJuICJbTElCXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCXJldHVybiAiW1BSSl0iK3RoaXMucGF0aDsgIC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgorCQkJCXJldHVybiAiW1NSQ10iK3RoaXMucGF0aDsgIC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6CisJCQkJcmV0dXJuICJbVkFSXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6CisJCQkJcmV0dXJuICJbQ09OXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyoqCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRFbnRyeSgpIHsKKwkKKwkJcmV0dXJuIEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkodGhpcyk7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjE2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIENvbW1pdHMgdGhlIGNvbnRlbnRzIG9mIGEgd29ya2luZyBjb3B5IGNvbXBpbGF0aW9uCisgKiB1bml0IHRvIGl0cyBvcmlnaW5hbCBlbGVtZW50IGFuZCByZXNvdXJjZSwgYnJpbmdpbmcKKyAqIHRoZSBKYXZhIE1vZGVsIHVwLXRvLWRhdGUgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgd29ya2luZworICogY29weS4KKyAqCisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIG9yaWdpbmFsIHJlc291cmNlIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkLAorICogaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBhbiB1cGRhdGUgY29uZmxpY3QuIFRoaXMgb3BlcmF0aW9uIGFsbG93cworICogZm9yIHR3byBzZXR0aW5ncyB0byByZXNvbHZlIGNvbmZsaWN0IHNldCBieSB0aGUgPGNvZGU+ZkZvcmNlPC9jb2RlPiBmbGFnOjx1bD4KKyAqIDxsaT5mb3JjZSBmbGFnIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiAtIGluIHRoaXMgY2FzZSBhbiA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+CisgKiAJaXMgdGhyb3duPC9saT4KKyAqIDxsaT5mb3JjZSBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+IC0gaW4gdGhpcyBjYXNlIHRoZSBjb250ZW50cyBvZgorICogCXRoZSB3b3JraW5nIGNvcHkgYXJlIGFwcGxpZWQgdG8gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZXZlbiB0aG91Z2gKKyAqIAl0aGUgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGJlZm9yZSBhIHN1YnNlcXVlbnQgY2hhbmdlIGluIHRoZQorICogCXJlc291cmNlPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+VGhlIGRlZmF1bHQgY29uZmxpY3QgcmVzb2x1dGlvbiBzZXR0aW5nIGlzIHRoZSBmb3JjZSBmbGFnIGlzIDxjb2RlPmZhbHNlPC9jb2RlPgorICoKKyAqIEEgSmF2YU1vZGVsT3BlcmF0aW9uIGV4Y2VwdGlvbiBpcyB0aHJvd24gZWl0aGVyIGlmIHRoZSBjb21taXQgY291bGQgbm90CisgKiBiZSBwZXJmb3JtZWQgb3IgaWYgdGhlIG5ldyBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHZpb2xhdGVzIHNvbWUgSmF2YSBNb2RlbAorICogY29uc3RyYWludCAoZS5nLiBpZiB0aGUgbmV3IHBhY2thZ2UgZGVjbGFyYXRpb24gZG9lc24ndCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyCisgKiBjb250YWluaW5nIHRoZSBjb21waWxhdGlvbiB1bml0KS4KKyAqLworcHVibGljIGNsYXNzIENvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKKy8qKgorICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdG8gY29tbWl0IHRoZSBjb250ZW50cyBvZiBhIHdvcmtpbmcgY29weQorICogdG8gaXRzIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbihJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIGJvb2xlYW4gZm9yY2UpIHsKKwlzdXBlcihuZXcgSUphdmFFbGVtZW50W10ge2VsZW1lbnR9LCBmb3JjZSk7Cit9CisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGluIHRoZSBjb21waWxhdGlvbiB1bml0IG1hdGNoZXMgdGhlIGFjdHVhbAorICogcGFja2FnZSBmcmFnbWVudCB0aGUgQ1UgaXMgZGVmaW5lZCBpbi4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiB3aXRoIGFuIDxjb2RlPklOVkFMSURfUEFDS0FHRTwvY29kZT4gSmF2YU1vZGVsU3RhdHVzIGlmIHRoZQorICogcGFja2FnZSBkZWNsYXJhdGlvbiBpcyBpbnZhbGlkLgorICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFDS0FHRQorICovCitwcml2YXRlIHZvaWQgY2hlY2tQYWNrYWdlRGVjbGFyYXRpb24oSUNvbXBpbGF0aW9uVW5pdCBjdSkKKwl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUGFja2FnZUZyYWdtZW50IGZyYWcgPSAoSVBhY2thZ2VGcmFnbWVudCkgY3UuZ2V0UGFyZW50KCk7CisJSVBhY2thZ2VEZWNsYXJhdGlvbltdIGRlY2xzID0gY3UuZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpOworCVN0cmluZyBwa2dOYW1lID0gZnJhZy5nZXRFbGVtZW50TmFtZSgpOworCWlmIChwa2dOYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgeworCQlpZiAoZGVjbHMgIT0gbnVsbCAmJiBkZWNscy5sZW5ndGggPiAwKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKAorCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQUNLQUdFLCAKKwkJCQkJY3UsIAorCQkJCQlkZWNsc1swXS5nZXRFbGVtZW50TmFtZSgpKSk7IAorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRlY2xzID09IG51bGwKKwkJCXx8IGRlY2xzLmxlbmd0aCAhPSAxCisJCQl8fCAhcGtnTmFtZS5lcXVhbHMoZGVjbHNbMF0uZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oCisJCQkJbmV3IEphdmFNb2RlbFN0YXR1cygKKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBQ0tBR0UsIAorCQkJCQljdSwgCisJCQkJCShkZWNscyA9PSBudWxsIHx8IGRlY2xzLmxlbmd0aCA9PSAwKSA/IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUgOiBkZWNsc1swXS5nZXRFbGVtZW50TmFtZSgpKSk7IAorCQl9CisJfQorfQorLyoqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBzZXR0aW5nIHRoZSBzb3VyY2UKKyAqIAlvZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBmYWlscworICovCitwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJYmVnaW5UYXNrKFV0aWwuYmluZCgid29ya2luZ0NvcHkuY29tbWl0IiksIDIpOyAvLyROT04tTkxTLTEkCisJCVdvcmtpbmdDb3B5IGNvcHkgPSAoV29ya2luZ0NvcHkpZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSAoSUNvbXBpbGF0aW9uVW5pdCkgY29weS5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwkKKwkJCisJCS8vIGNyZWF0ZXMgdGhlIGRlbHRhIGJ1aWxkZXIgKHRoaXMgcmVtZW1iZXJzIHRoZSBjb250ZW50IG9mIHRoZSBjdSkJCisJCWlmICghb3JpZ2luYWwuaXNPcGVuKCkpIHsKKwkJCS8vIGZvcmNlIG9wZW5pbmcgc28gdGhhdCB0aGUgZGVsdGEgYnVpbGRlciBjYW4gZ2V0IHRoZSBvbGQgaW5mbworCQkJb3JpZ2luYWwub3BlbihudWxsKTsKKwkJfQorCQlKYXZhRWxlbWVudERlbHRhQnVpbGRlciBkZWx0YUJ1aWxkZXIgPSBuZXcgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIob3JpZ2luYWwpOworCQorCQkvLyBzYXZlIHRoZSBjdQorCQlJQnVmZmVyIG9yaWdpbmFsQnVmZmVyID0gb3JpZ2luYWwuZ2V0QnVmZmVyKCk7CisJCWlmIChvcmlnaW5hbEJ1ZmZlciA9PSBudWxsKSByZXR1cm47CisJCWNoYXJbXSBvcmlnaW5hbENvbnRlbnRzID0gb3JpZ2luYWxCdWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQlib29sZWFuIGhhc1NhdmVkID0gZmFsc2U7CisJCXRyeSB7CisJCQlJQnVmZmVyIGNvcHlCdWZmZXIgPSBjb3B5LmdldEJ1ZmZlcigpOworCQkJaWYgKGNvcHlCdWZmZXIgPT0gbnVsbCkgcmV0dXJuOworCQkJb3JpZ2luYWxCdWZmZXIuc2V0Q29udGVudHMoY29weUJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkpOworCQkJb3JpZ2luYWwuc2F2ZShmTW9uaXRvciwgZkZvcmNlKTsKKwkJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJCQloYXNTYXZlZCA9IHRydWU7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIWhhc1NhdmVkKXsKKwkJCQkvLyByZXN0b3JlIG9yaWdpbmFsIGJ1ZmZlciBjb250ZW50cyBzaW5jZSBzb21ldGhpbmcgd2VudCB3cm9uZworCQkJCW9yaWdpbmFsQnVmZmVyLnNldENvbnRlbnRzKG9yaWdpbmFsQ29udGVudHMpOworCQkJfQorCQl9CisJCS8vIG1ha2Ugc3VyZSB3b3JraW5nIGNvcHkgaXMgaW4gc3luYworCQljb3B5LnVwZGF0ZVRpbWVTdGFtcCgoQ29tcGlsYXRpb25Vbml0KW9yaWdpbmFsKTsKKwkJY29weS5tYWtlQ29uc2lzdGVudCh0aGlzKTsKKwkJd29ya2VkKDEpOworCQorCQkvLyBidWlsZCB0aGUgZGVsdGFzCisJCWRlbHRhQnVpbGRlci5idWlsZERlbHRhcygpOworCQorCQkvLyBhZGQgdGhlIGRlbHRhcyB0byB0aGUgbGlzdCBvZiBkZWx0YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24KKwkJaWYgKGRlbHRhQnVpbGRlci5kZWx0YSAhPSBudWxsKSB7CisJCQlhZGREZWx0YShkZWx0YUJ1aWxkZXIuZGVsdGEpOworCQl9CisJCXdvcmtlZCgxKTsKKwl9IGZpbmFsbHkgewkKKwkJZG9uZSgpOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGlzIG9wZXJhdGlvbiBpcyB3b3JraW5nIG9uLgorICovCitwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KWdldEVsZW1lbnRUb1Byb2Nlc3MoKTsKK30KKy8qKgorICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KKyAqCTxsaT5JTlZBTElEX0VMRU1FTlRfVFlQRVMgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBzdXBwbGllZCB0byB0aGlzCisgKgkJb3BlcmF0aW9uIGlzIG5vdCBhIHdvcmtpbmcgY29weQorICogIDxsaT5FTEVNRU5UX05PVF9QUkVTRU5UIC0gdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhlIHdvcmtpbmcgY29weSBpcworICoJCWJhc2VkIG9uIG5vIGxvbmdlciBleGlzdHMuCisgKiAgPGxpPlVQREFURV9DT05GTElDVCAtIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0IGhhcyBjaGFuZ2VkIHNpbmNlCisgKgkJdGhlIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCBhbmQgdGhlIG9wZXJhdGlvbiBzcGVjaWZpZXMgbm8gZm9yY2UKKyAqICA8bGk+UkVBRF9PTkxZIC0gdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gcmVhZC1vbmx5IG1vZGUKKyAqICA8L3VsPgorICovCitwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOworCWlmICghY3UuaXNXb3JraW5nQ29weSgpKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBjdSk7CisJfQorCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldE9yaWdpbmFsRWxlbWVudCgpOworCUlSZXNvdXJjZSByZXNvdXJjZT0gbnVsbDsKKwl0cnkgeworCQlyZXNvdXJjZSA9IG9yaWdpbmFsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOworCX0KKwlpZiAoIWN1LmlzQmFzZWRPbihyZXNvdXJjZSkgJiYgIWZGb3JjZSkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVQREFURV9DT05GTElDVCk7CisJfQorCS8vIG5vIHJlYWQtb25seSBjaGVjaywgc2luY2Ugc29tZSByZXBvc2l0b3J5IGFkYXB0ZXJzIGNhbiBjaGFuZ2UgdGhlIGZsYWcgb24gc2F2ZQorCS8vIG9wZXJhdGlvbi4JCisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5ZDY5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsOTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CisvKioKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdAorICovCisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXQgZXh0ZW5kcyBPcGVuYWJsZSBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXQsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCB7CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIFNIQVJFRF9XQ19WRVJCT1NFID0gZmFsc2U7CisKKy8qKgorICogQ29uc3RydWN0cyBhIGhhbmRsZSB0byBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUKKyAqIHNwZWNpZmllZCBwYWNrYWdlLgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisgKiBkb2VzIG5vdCBlbmQgd2l0aCAiLmphdmEiCisgKi8KK3Byb3RlY3RlZCBDb21waWxhdGlvblVuaXQoSVBhY2thZ2VGcmFnbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoQ09NUElMQVRJT05fVU5JVCwgcGFyZW50LCBuYW1lKTsKKwlpZiAoIVV0aWwuaXNKYXZhRmlsZU5hbWUobmFtZSkpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKy8qKgorICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbnRvIHRoZSBwYXJzZWQgdHJlZSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIGFmdGVyCisgKiBoYXZpbmcgcnVubmVkIHRoZSBuYW1lIHJlc29sdXRpb24uCisgKiBUaGUgdmlzaXRvcidzIGNvcnJlc3BvbmRpbmcgPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgcGFyc2UgdHJlZS4gSWYgdGhlIHZpc2l0b3IgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBtZXRob2QKKyAqIHZpc2l0cyB0aGlzIHBhcnNlIG5vZGUncyBtZW1iZXJzLgorICoKKyAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscy4gUmVhc29ucyBpbmNsdWRlOgorICogPHVsPgorICogPGxpPiBUaGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuPC9saT4KKyAqIDxsaT4gVGhlIHZpc2l0b3IgZmFpbGVkIHdpdGggdGhpcyBleGNlcHRpb24uPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdChJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlDb21waWxhdGlvblVuaXRWaXNpdG9yLnZpc2l0KHRoaXMsIHZpc2l0b3IpOworfSAKKworcHJvdGVjdGVkIHZvaWQgYnVpbGRTdHJ1Y3R1cmUoT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCisJLy8gcmVtb3ZlIGV4aXN0aW5nIChvbGQpIGluZm9zCisJcmVtb3ZlSW5mbygpOworCisJSGFzaE1hcCBuZXdFbGVtZW50cyA9IG5ldyBIYXNoTWFwKDExKTsKKwlpbmZvLnNldElzU3RydWN0dXJlS25vd24oZ2VuZXJhdGVJbmZvcyhpbmZvLCBtb25pdG9yLCBuZXdFbGVtZW50cywgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpKTsKKwlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRFbGVtZW50c091dE9mU3luY2hXaXRoQnVmZmVycygpLnJlbW92ZSh0aGlzKTsKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdFbGVtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJSUphdmFFbGVtZW50IGtleSA9IChJSmF2YUVsZW1lbnQpIGl0ZXIubmV4dCgpOworCQlPYmplY3QgdmFsdWUgPSBuZXdFbGVtZW50cy5nZXQoa2V5KTsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucHV0SW5mbyhrZXksIHZhbHVlKTsKKwl9CisJLy8gcHJvYmxlbSBkZXRlY3Rpb24gCisJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCisJSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvciA9IHRoaXMuZ2V0UHJvYmxlbVJlcXVlc3RvcigpOworCWlmIChwcm9ibGVtUmVxdWVzdG9yICE9IG51bGwgJiYgcHJvYmxlbVJlcXVlc3Rvci5pc0FjdGl2ZSgpKXsKKwkJcHJvYmxlbVJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOworCQlDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnJlc29sdmUodGhpcywgcHJvYmxlbVJlcXVlc3RvciwgbW9uaXRvcik7CisJCXByb2JsZW1SZXF1ZXN0b3IuZW5kUmVwb3J0aW5nKCk7CisJfQorCQorCS8vIGFkZCB0aGUgaW5mbyBmb3IgdGhpcyBhdCB0aGUgZW5kLCB0byBlbnN1cmUgdGhhdCBhIGdldEluZm8gY2Fubm90IHJlcGx5IG51bGwgaW4gY2FzZSB0aGUgTFJVIGNhY2hlIG5lZWRzCisJLy8gdG8gYmUgZmx1c2hlZC4gTWlnaHQgbGVhZCB0byBwZXJmb3JtYW5jZSBpc3N1ZXMuCisJLy8gc2VlIFBSIDFHMks1Uzc6IElUUEpDT1JFOkFMTCAtIE5QRSB3aGVuIGFjY2Vzc2luZyBzb3VyY2UgZm9yIGEgYmluYXJ5IHR5cGUKKwlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wdXRJbmZvKHRoaXMsIGluZm8pOwkKK30KKworLyoqCisgKiBAc2VlIElDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIElDb21wbGV0aW9uUmVxdWVzdG9yKQorICovCitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwljb2RlQ29tcGxldGUodGhpcywgaXNXb3JraW5nQ29weSgpID8gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCkgZ2V0T3JpZ2luYWxFbGVtZW50KCkgOiB0aGlzLCBvZmZzZXQsIHJlcXVlc3Rvcik7Cit9CisvKioKKyAqIEBzZWUgSUNvZGVBc3Npc3QjY29kZVNlbGVjdChpbnQsIGludCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGNvZGVTZWxlY3QoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHN1cGVyLmNvZGVTZWxlY3QodGhpcywgb2Zmc2V0LCBsZW5ndGgpOworfQorLyoqCisgKiBAc2VlIElXb3JraW5nQ29weSNjb21taXQoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCB0aGlzKSk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbiNjb3B5KElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50LCBTdHJpbmcsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIGNvcHkoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJSUphdmFFbGVtZW50W10gY29udGFpbmVycyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y29udGFpbmVyfTsKKwlTdHJpbmdbXSByZW5hbWluZ3MgPSBudWxsOworCWlmIChyZW5hbWUgIT0gbnVsbCkgeworCQlyZW5hbWluZ3MgPSBuZXcgU3RyaW5nW10ge3JlbmFtZX07CisJfQorCWdldEphdmFNb2RlbCgpLmNvcHkoZWxlbWVudHMsIGNvbnRhaW5lcnMsIG51bGwsIHJlbmFtaW5ncywgZm9yY2UsIG1vbml0b3IpOworfQorLyoqCisgKiBSZXR1cm5zIGEgbmV3IGVsZW1lbnQgaW5mbyBmb3IgdGhpcyBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgT3BlbmFibGVFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbygpIHsKKwlyZXR1cm4gbmV3IENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvKCk7Cit9CisvKioKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNjcmVhdGVJbXBvcnQoU3RyaW5nLCBJSmF2YUVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyBJSW1wb3J0RGVjbGFyYXRpb24gY3JlYXRlSW1wb3J0KFN0cmluZyBuYW1lLCBJSmF2YUVsZW1lbnQgc2libGluZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlDcmVhdGVJbXBvcnRPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlSW1wb3J0T3BlcmF0aW9uKG5hbWUsIHRoaXMpOworCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJb3AuY3JlYXRlQmVmb3JlKHNpYmxpbmcpOworCX0KKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCXJldHVybiBnZXRJbXBvcnQobmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nLCBJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgSVBhY2thZ2VEZWNsYXJhdGlvbiBjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCisJQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uIG9wPSBuZXcgQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uKG5hbWUsIHRoaXMpOworCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CisJcmV0dXJuIGdldFBhY2thZ2VEZWNsYXJhdGlvbihuYW1lKTsKK30KKy8qKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NyZWF0ZVR5cGUoU3RyaW5nLCBJSmF2YUVsZW1lbnQsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyBJVHlwZSBjcmVhdGVUeXBlKFN0cmluZyBjb250ZW50LCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoIWV4aXN0cygpKSB7CisJCS8vYXV0b2dlbmVyYXRlIHRoaXMgY29tcGlsYXRpb24gdW5pdAorCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBnZXRQYXJlbnQoKTsKKwkJU3RyaW5nIHNvdXJjZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCWlmIChwa2cuZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA+IDApIHsKKwkJCS8vbm90IHRoZSBkZWZhdWx0IHBhY2thZ2UuLi5hZGQgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KKwkJCXNvdXJjZSA9ICJwYWNrYWdlICIgKyBwa2cuZ2V0RWxlbWVudE5hbWUoKSArICI7IiAgKyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkxJTkVfU0VQQVJBVE9SICsgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5MSU5FX1NFUEFSQVRPUjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uIG9wID0gbmV3IENyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbihwa2csIGZOYW1lLCBzb3VyY2UsIGZvcmNlKTsKKwkJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwl9CisJQ3JlYXRlVHlwZU9wZXJhdGlvbiBvcCA9IG5ldyBDcmVhdGVUeXBlT3BlcmF0aW9uKHRoaXMsIGNvbnRlbnQsIGZvcmNlKTsKKwlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCW9wLmNyZWF0ZUJlZm9yZShzaWJsaW5nKTsKKwl9CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gKElUeXBlKSBvcC5nZXRSZXN1bHRFbGVtZW50cygpWzBdOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24jZGVsZXRlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIGRlbGV0ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OworCWdldEphdmFNb2RlbCgpLmRlbGV0ZShlbGVtZW50cywgZm9yY2UsIG1vbml0b3IpOworfQorLyoqCisgKiBUaGlzIGlzIG5vdCBhIHdvcmtpbmcgY29weSwgZG8gbm90aGluZy4KKyAqCisgKiBAc2VlIElXb3JraW5nQ29weSNkZXN0cm95KCkKKyAqLworcHVibGljIHZvaWQgZGVzdHJveSgpIHsKK30KKworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhbmRsZSByZXByZXNlbnRzIHRoZSBzYW1lIEphdmEgZWxlbWVudAorICogYXMgdGhlIGdpdmVuIGhhbmRsZS4KKyAqCisgKiA8cD5Db21waWxhdGlvbiB1bml0cyBtdXN0IGFsc28gY2hlY2sgd29ya2luZyBjb3B5IHN0YXRlOworICoKKyAqIEBzZWUgT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICovCitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pICYmICEoKElDb21waWxhdGlvblVuaXQpbykuaXNXb3JraW5nQ29weSgpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2VxdWFsc0RPTU5vZGUoSURPTU5vZGUpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU3RyaW5nIG5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOworCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuQ09NUElMQVRJT05fVU5JVCAmJiBuYW1lICE9IG51bGwgKSB7CisJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOworCQlpZiAobm9kZU5hbWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwkJCisJCWlmIChuYW1lLmVxdWFscyhub2RlTmFtZSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgdHlwZXMgaW5zaWRlIHRoZSByZWNlaXZlciBhbmQgc2VlIGlmIG9uZSBvZiB0aGVtIGNhbiBmaXQKKwkJCUlUeXBlW10gdHlwZXMgPSBnZXRUeXBlcygpOworCQkJU3RyaW5nIHR5cGVOb2RlTmFtZSA9IG5vZGVOYW1lLnN1YnN0cmluZygwLCBub2RlTmFtZS5pbmRleE9mKCIuamF2YSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKHR5cGVzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHR5cGVOb2RlTmFtZSkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjZmluZEVsZW1lbnRzKElKYXZhRWxlbWVudCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGZpbmRFbGVtZW50cyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwl3aGlsZSAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7CisJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCX0KKwlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlJSmF2YUVsZW1lbnQgY3VycmVudEVsZW1lbnQgPSB0aGlzOworCWZvciAoaW50IGkgPSBjaGlsZHJlbi5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKwkJSUphdmFFbGVtZW50IGNoaWxkID0gKElKYXZhRWxlbWVudCljaGlsZHJlbi5nZXQoaSk7CisJCXN3aXRjaCAoY2hpbGQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjoKKwkJCQljdXJyZW50RWxlbWVudCA9ICgoSUNvbXBpbGF0aW9uVW5pdCljdXJyZW50RWxlbWVudCkuZ2V0UGFja2FnZURlY2xhcmF0aW9uKGNoaWxkLmdldEVsZW1lbnROYW1lKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuSU1QT1JUX0NPTlRBSU5FUjoKKwkJCQljdXJyZW50RWxlbWVudCA9ICgoSUNvbXBpbGF0aW9uVW5pdCljdXJyZW50RWxlbWVudCkuZ2V0SW1wb3J0Q29udGFpbmVyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT046CisJCQkJY3VycmVudEVsZW1lbnQgPSAoKElJbXBvcnRDb250YWluZXIpY3VycmVudEVsZW1lbnQpLmdldEltcG9ydChjaGlsZC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6CisJCQkJaWYgKGN1cnJlbnRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJCQkJY3VycmVudEVsZW1lbnQgPSAoKElDb21waWxhdGlvblVuaXQpY3VycmVudEVsZW1lbnQpLmdldFR5cGUoY2hpbGQuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3VycmVudEVsZW1lbnQgPSAoKElUeXBlKWN1cnJlbnRFbGVtZW50KS5nZXRUeXBlKGNoaWxkLmdldEVsZW1lbnROYW1lKCkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LklOSVRJQUxJWkVSOgorCQkJCWN1cnJlbnRFbGVtZW50ID0gKChJVHlwZSljdXJyZW50RWxlbWVudCkuZ2V0SW5pdGlhbGl6ZXIoKChKYXZhRWxlbWVudCljaGlsZCkuZ2V0T2NjdXJyZW5jZUNvdW50KCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6CisJCQkJY3VycmVudEVsZW1lbnQgPSAoKElUeXBlKWN1cnJlbnRFbGVtZW50KS5nZXRGaWVsZChjaGlsZC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKKwkJCQlyZXR1cm4gKChJVHlwZSljdXJyZW50RWxlbWVudCkuZmluZE1ldGhvZHMoKElNZXRob2QpY2hpbGQpOworCQl9CisJCQorCX0KKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudC5leGlzdHMoKSkgeworCQlyZXR1cm4gbmV3IElKYXZhRWxlbWVudFtdIHtjdXJyZW50RWxlbWVudH07CisJfSBlbHNlIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorLyoqCisgKiBAc2VlIElXb3JraW5nQ29weSNmaW5kUHJpbWFyeVR5cGUoKQorICovCitwdWJsaWMgSVR5cGUgZmluZFByaW1hcnlUeXBlKCkgeworCVN0cmluZyB0eXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRRdWFsaWZpZXIodGhpcy5nZXRFbGVtZW50TmFtZSgpKTsKKwlJVHlwZSBwcmltYXJ5VHlwZT0gdGhpcy5nZXRUeXBlKHR5cGVOYW1lKTsKKwlpZiAocHJpbWFyeVR5cGUuZXhpc3RzKCkpIHsKKwkJcmV0dXJuIHByaW1hcnlUeXBlOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBAc2VlIElXb3JraW5nQ29weSNmaW5kU2hhcmVkV29ya2luZ0NvcHkoSUJ1ZmZlckZhY3RvcnkpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZmluZFNoYXJlZFdvcmtpbmdDb3B5KElCdWZmZXJGYWN0b3J5IGZhY3RvcnkpIHsKKworCS8vIGlmIGZhY3RvcnkgaXMgbnVsbCwgZGVmYXVsdCBmYWN0b3J5IG11c3QgYmUgdXNlZAorCWlmIChmYWN0b3J5ID09IG51bGwpIGZhY3RvcnkgPSB0aGlzLmdldEJ1ZmZlck1hbmFnZXIoKS5nZXREZWZhdWx0QnVmZmVyRmFjdG9yeSgpOworCisJLy8gSW4gb3JkZXIgdG8gYmUgc2hhcmVkLCB3b3JraW5nIGNvcGllcyBoYXZlIHRvIGRlbm90ZSB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IAorCS8vIEFORCB1c2UgdGhlIHNhbWUgYnVmZmVyIGZhY3RvcnkuCisJLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBsaXR0bGUgc2V0IG9mIGJ1ZmZlciBmYWN0b3JpZXMsIHRoZW4gdXNlIGEgMiBsZXZlbCBNYXAgY2FjaGUuCisJTWFwIHNoYXJlZFdvcmtpbmdDb3BpZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5zaGFyZWRXb3JraW5nQ29waWVzOworCQorCU1hcCBwZXJGYWN0b3J5V29ya2luZ0NvcGllcyA9IChNYXApIHNoYXJlZFdvcmtpbmdDb3BpZXMuZ2V0KGZhY3RvcnkpOworCWlmIChwZXJGYWN0b3J5V29ya2luZ0NvcGllcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlyZXR1cm4gKFdvcmtpbmdDb3B5KXBlckZhY3RvcnlXb3JraW5nQ29waWVzLmdldCh0aGlzKTsKK30KKworcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVJbmZvcyhPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIElQcm9ncmVzc01vbml0b3IgcG0sIE1hcCBuZXdFbGVtZW50cywgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnQpIHsKKwkJLy8gaWdub3JlIC5qYXZhIGZpbGVzIGluIGphcgorCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJfSBlbHNlIHsKKwkJLy8gcHV0IHRoZSBpbmZvIG5vdywgYmVjYXVzZSBnZXR0aW5nIHRoZSBjb250ZW50cyByZXF1aXJlcyBpdAorCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wdXRJbmZvKHRoaXMsIGluZm8pOworCQlDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyB1bml0SW5mbyA9IChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgaW5mbzsKKworCQkvLyBnZW5lcmF0ZSBzdHJ1Y3R1cmUKKwkJQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IodGhpcywgdW5pdEluZm8sIG5ld0VsZW1lbnRzKTsKKwkJSVByb2JsZW1GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCk7CisJCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gbmV3IFNvdXJjZUVsZW1lbnRQYXJzZXIocmVxdWVzdG9yLCBmYWN0b3J5LCBuZXcgQ29tcGlsZXJPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSkpOworCQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQodGhpcywgZmFsc2UpOworCQlpZiAoaXNXb3JraW5nQ29weSgpKSB7CisJCQlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSAoQ29tcGlsYXRpb25Vbml0KSBnZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwkJCXVuaXRJbmZvLmZUaW1lc3RhbXAgPSAoKElGaWxlKSBvcmlnaW5hbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKKwkJCWlmKHVuaXRJbmZvLmZUaW1lc3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVApeworCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUkVTT1VSQ0UpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdW5pdEluZm8uaXNTdHJ1Y3R1cmVLbm93bigpOworCX0KK30KKy8qKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldEFsbFR5cGVzKCkKKyAqLworcHVibGljIElUeXBlW10gZ2V0QWxsVHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnRbXSB0eXBlcyA9IGdldFR5cGVzKCk7CisJaW50IGk7CisJQXJyYXlMaXN0IGFsbFR5cGVzID0gbmV3IEFycmF5TGlzdCh0eXBlcy5sZW5ndGgpOworCUFycmF5TGlzdCB0eXBlc1RvVHJhdmVyc2UgPSBuZXcgQXJyYXlMaXN0KHR5cGVzLmxlbmd0aCk7CisJZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCXR5cGVzVG9UcmF2ZXJzZS5hZGQodHlwZXNbaV0pOworCX0KKwl3aGlsZSAoIXR5cGVzVG9UcmF2ZXJzZS5pc0VtcHR5KCkpIHsKKwkJSVR5cGUgdHlwZSA9IChJVHlwZSkgdHlwZXNUb1RyYXZlcnNlLmdldCgwKTsKKwkJdHlwZXNUb1RyYXZlcnNlLnJlbW92ZSh0eXBlKTsKKwkJYWxsVHlwZXMuYWRkKHR5cGUpOworCQl0eXBlcyA9IHR5cGUuZ2V0VHlwZXMoKTsKKwkJZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQl0eXBlc1RvVHJhdmVyc2UuYWRkKHR5cGVzW2ldKTsKKwkJfQorCX0gCisJSVR5cGVbXSBhcnJheU9mQWxsVHlwZXMgPSBuZXcgSVR5cGVbYWxsVHlwZXMuc2l6ZSgpXTsKKwlhbGxUeXBlcy50b0FycmF5KGFycmF5T2ZBbGxUeXBlcyk7CisJcmV0dXJuIGFycmF5T2ZBbGxUeXBlczsKK30KKy8qKgorICogQHNlZSBJTWVtYmVyI2dldENvbXBpbGF0aW9uVW5pdCgpCisgKi8KK3B1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKKwlyZXR1cm4gdGhpczsKK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQjZ2V0Q29udGVudHMoKQorICovCitwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgeworCXRyeSB7CisJCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTsKKwkJcmV0dXJuIGJ1ZmZlciA9PSBudWxsID8gbnVsbCA6IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7CisJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeyAvLyBidWZmZXIgY291bGQgYmUgbnVsbAorCQlyZXR1cm4gbmV3IGNoYXJbMF07CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG5ldyBjaGFyWzBdOworCX0KK30KKy8qKgorICogQSBjb21waWxhdGlvbiB1bml0IGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgdW5sZXNzIGl0IGlzIGNvbnRhaW5lZAorICogaW4gYSBqYXIuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJcmV0dXJuIG51bGw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCX0KK30KKy8qKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldEVsZW1lbnRBdChpbnQpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudEF0KGludCBwb3NpdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlJSmF2YUVsZW1lbnQgZT0gZ2V0U291cmNlRWxlbWVudEF0KHBvc2l0aW9uKTsKKwlpZiAoZSA9PSB0aGlzKSB7CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCXJldHVybiBlOworCX0KK30KK3B1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKXsKKwlyZXR1cm4gZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKQorICovCitwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCXJldHVybiBKYXZhRWxlbWVudC5KRU1fQ09NUElMQVRJT05VTklUOworfQorLyoqCisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0SW1wb3J0KFN0cmluZykKKyAqLworcHVibGljIElJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gbmV3IEltcG9ydERlY2xhcmF0aW9uKGdldEltcG9ydENvbnRhaW5lcigpLCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldEltcG9ydENvbnRhaW5lcigpCisgKi8KK3B1YmxpYyBJSW1wb3J0Q29udGFpbmVyIGdldEltcG9ydENvbnRhaW5lcigpIHsKKwlyZXR1cm4gbmV3IEltcG9ydENvbnRhaW5lcih0aGlzKTsKK30KKworCisvKioKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNnZXRJbXBvcnRzKCkKKyAqLworcHVibGljIElJbXBvcnREZWNsYXJhdGlvbltdIGdldEltcG9ydHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSW1wb3J0Q29udGFpbmVyIGNvbnRhaW5lcj0gZ2V0SW1wb3J0Q29udGFpbmVyKCk7CisJaWYgKGNvbnRhaW5lci5leGlzdHMoKSkgeworCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7CisJCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcHJ0cz0gbmV3IElJbXBvcnREZWNsYXJhdGlvbltlbGVtZW50cy5sZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCBpbXBydHMsIDAsIGVsZW1lbnRzLmxlbmd0aCk7CisJCXJldHVybiBpbXBydHM7CisJfSBlbHNlIGlmICghZXhpc3RzKCkpIHsKKwkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbmV3IElJbXBvcnREZWNsYXJhdGlvblswXTsKKwl9CisKK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQjZ2V0TWFpblR5cGVOYW1lKCkKKyAqLworcHVibGljIGNoYXJbXSBnZXRNYWluVHlwZU5hbWUoKXsKKwlTdHJpbmcgbmFtZT0gZ2V0RWxlbWVudE5hbWUoKTsKKwkvL3JlbW92ZSB0aGUgLmphdmEKKwluYW1lPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNSk7CisJcmV0dXJuIG5hbWUudG9DaGFyQXJyYXkoKTsKK30KKy8qKgorICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkuCisgKgorICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0T3JpZ2luYWwoSUphdmFFbGVtZW50KQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldE9yaWdpbmFsKElKYXZhRWxlbWVudCB3b3JraW5nQ29weUVsZW1lbnQpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgdGhpcyBpcyBub3QgYSB3b3JraW5nIGNvcHkuCisgKgorICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0T3JpZ2luYWxFbGVtZW50KCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRPcmlnaW5hbEVsZW1lbnQoKSB7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNnZXRQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nKQorICovCitwdWJsaWMgSVBhY2thZ2VEZWNsYXJhdGlvbiBnZXRQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbih0aGlzLCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2dldFBhY2thZ2VEZWNsYXJhdGlvbnMoKQorICovCitwdWJsaWMgSVBhY2thZ2VEZWNsYXJhdGlvbltdIGdldFBhY2thZ2VEZWNsYXJhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKFBBQ0tBR0VfREVDTEFSQVRJT04pOworCUlQYWNrYWdlRGVjbGFyYXRpb25bXSBhcnJheT0gbmV3IElQYWNrYWdlRGVjbGFyYXRpb25bbGlzdC5zaXplKCldOworCWxpc3QudG9BcnJheShhcnJheSk7CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCNnZXRQYWNrYWdlTmFtZSgpCisgKi8KK3B1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0UGF0aCgpCisgKi8KK3B1YmxpYyBJUGF0aCBnZXRQYXRoKCkgeworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CisJCXJldHVybiByb290LmdldFBhdGgoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRQYXRoKCkuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJfQorfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRSZXNvdXJjZSgpCisgKi8KK3B1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJcmV0dXJuIHJvb3QuZ2V0UmVzb3VyY2UoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKChJQ29udGFpbmVyKXRoaXMuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKSkuZ2V0RmlsZShuZXcgUGF0aCh0aGlzLmdldEVsZW1lbnROYW1lKCkpKTsKKwl9Cit9CisKKy8qCisgKiBBbnN3ZXIgcmVxdWVzdG9yIHRvIG5vdGlmeSB3aXRoIHByb2JsZW1zCisgKi8KK3B1YmxpYyBJUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKCl7CisJcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQHNlZSBJU291cmNlUmVmZXJlbmNlI2dldFNvdXJjZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXIoKTsKKwlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIuZ2V0Q29udGVudHMoKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlUmVmZXJlbmNlI2dldFNvdXJjZVJhbmdlKCkKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiAoKENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpKS5nZXRTb3VyY2VSYW5nZSgpOworfQorLyoqCisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0VHlwZShTdHJpbmcpCisgKi8KK3B1YmxpYyBJVHlwZSBnZXRUeXBlKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBTb3VyY2VUeXBlKHRoaXMsIG5hbWUpOworfQorLyoqCisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZ2V0VHlwZXMoKQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoVFlQRSk7CisJSVR5cGVbXSBhcnJheT0gbmV3IElUeXBlW2xpc3Quc2l6ZSgpXTsKKwlsaXN0LnRvQXJyYXkoYXJyYXkpOworCXJldHVybiBhcnJheTsKK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IgcG0sIElCdWZmZXJGYWN0b3J5IGZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQorCS8vIGlmIGZhY3RvcnkgaXMgbnVsbCwgZGVmYXVsdCBmYWN0b3J5IG11c3QgYmUgdXNlZAorCWlmIChmYWN0b3J5ID09IG51bGwpIGZhY3RvcnkgPSB0aGlzLmdldEJ1ZmZlck1hbmFnZXIoKS5nZXREZWZhdWx0QnVmZmVyRmFjdG9yeSgpOworCisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCisJLy8gSW4gb3JkZXIgdG8gYmUgc2hhcmVkLCB3b3JraW5nIGNvcGllcyBoYXZlIHRvIGRlbm90ZSB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IAorCS8vIEFORCB1c2UgdGhlIHNhbWUgYnVmZmVyIGZhY3RvcnkuCisJLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBsaXR0bGUgc2V0IG9mIGJ1ZmZlciBmYWN0b3JpZXMsIHRoZW4gdXNlIGEgMiBsZXZlbCBNYXAgY2FjaGUuCisJTWFwIHNoYXJlZFdvcmtpbmdDb3BpZXMgPSBtYW5hZ2VyLnNoYXJlZFdvcmtpbmdDb3BpZXM7CisJCisJTWFwIHBlckZhY3RvcnlXb3JraW5nQ29waWVzID0gKE1hcCkgc2hhcmVkV29ya2luZ0NvcGllcy5nZXQoZmFjdG9yeSk7CisJaWYgKHBlckZhY3RvcnlXb3JraW5nQ29waWVzID09IG51bGwpeworCQlwZXJGYWN0b3J5V29ya2luZ0NvcGllcyA9IG5ldyBIYXNoTWFwKCk7CisJCXNoYXJlZFdvcmtpbmdDb3BpZXMucHV0KGZhY3RvcnksIHBlckZhY3RvcnlXb3JraW5nQ29waWVzKTsKKwl9CisJV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoV29ya2luZ0NvcHkpcGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMuZ2V0KHRoaXMpOworCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7CisJCXdvcmtpbmdDb3B5LnVzZUNvdW50Kys7CisKKwkJaWYgKFNIQVJFRF9XQ19WRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluY3JlbWVudGluZyB1c2UgY291bnQgb2Ygc2hhcmVkIHdvcmtpbmcgY29weSAiICsgd29ya2luZ0NvcHkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlyZXR1cm4gd29ya2luZ0NvcHk7CisJfSBlbHNlIHsKKwkJd29ya2luZ0NvcHkgPSAoV29ya2luZ0NvcHkpdGhpcy5nZXRXb3JraW5nQ29weShwbSwgZmFjdG9yeSwgcHJvYmxlbVJlcXVlc3Rvcik7CisJCXBlckZhY3RvcnlXb3JraW5nQ29waWVzLnB1dCh0aGlzLCB3b3JraW5nQ29weSk7CisKKwkJaWYgKFNIQVJFRF9XQ19WRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIHNoYXJlZCB3b3JraW5nIGNvcHkgIiArIHdvcmtpbmdDb3B5LnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJLy8gcmVwb3J0IGFkZGVkIGphdmEgZGVsdGEKKwkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHRoaXMuZ2V0SmF2YU1vZGVsKCkpOworCQlkZWx0YS5hZGRlZCh3b3JraW5nQ29weSk7CisJCW1hbmFnZXIuZmlyZShkZWx0YSwgSmF2YU1vZGVsTWFuYWdlci5ERUZBVUxUX0NIQU5HRV9FVkVOVCk7CisKKwkJcmV0dXJuIHdvcmtpbmdDb3B5OworCX0KK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0V29ya2luZ0NvcHkoKQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMuZ2V0V29ya2luZ0NvcHkobnVsbCwgbnVsbCwgbnVsbCk7Cit9CisKKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IgcG0sIElCdWZmZXJGYWN0b3J5IGZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gbmV3IFdvcmtpbmdDb3B5KChJUGFja2FnZUZyYWdtZW50KWdldFBhcmVudCgpLCBnZXRFbGVtZW50TmFtZSgpLCBmYWN0b3J5LCBwcm9ibGVtUmVxdWVzdG9yKTsKKwkvLyBvcGVuIHRoZSB3b3JraW5nIGNvcHkgbm93IHRvIGVuc3VyZSBjb250ZW50cyBhcmUgdGhhdCBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIGVsZW1lbnQKKwl3b3JraW5nQ29weS5vcGVuKHBtKTsKKwlyZXR1cm4gd29ya2luZ0NvcHk7Cit9CisKKy8qKgorICogQHNlZSBPcGVuYWJsZSNoYXNCdWZmZXIoKQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCdWZmZXIoKSB7CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIElmIEkgYW0gbm90IG9wZW4sIHJldHVybiB0cnVlIHRvIGF2b2lkIHBhcnNpbmcuCisgKgorICogQHNlZSBJUGFyZW50I2hhc0NoaWxkcmVuKCkKKyAqLworcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoaXNPcGVuKCkpIHsKKwkJcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgZmFsc2UsIHRoaXMgaXMgbm90IGEgd29ya2luZyBjb3B5LgorICoKKyAqIEBzZWUgSVdvcmtpbmdDb3B5I2lzQmFzZWRPbihJUmVzb3VyY2UpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQmFzZWRPbihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSU9wZW5hYmxlI2lzQ29uc2lzdGVudCgpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRFbGVtZW50c091dE9mU3luY2hXaXRoQnVmZmVycygpLmdldCh0aGlzKSA9PSBudWxsOworfQorLyoqCisgKiBAc2VlIE9wZW5hYmxlI2lzU291cmNlRWxlbWVudCgpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzU291cmNlRWxlbWVudCgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjaXNXb3JraW5nQ29weSgpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBAc2VlIElPcGVuYWJsZSNtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgdm9pZCBtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoIWlzQ29uc2lzdGVudCgpKSB7CisJCS8vIGNyZWF0ZSBhIG5ldyBpbmZvIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IGluZm8KKwkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvID0gY3JlYXRlRWxlbWVudEluZm8oKTsKKwkJYnVpbGRTdHJ1Y3R1cmUoaW5mbywgcG0pOworCX0KK30KKworLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24jbW92ZShJSmF2YUVsZW1lbnQsIElKYXZhRWxlbWVudCwgU3RyaW5nLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9OworCQorCVN0cmluZ1tdIHJlbmFtaW5ncz0gbnVsbDsKKwlpZiAocmVuYW1lICE9IG51bGwpIHsKKwkJcmVuYW1pbmdzPSBuZXcgU3RyaW5nW10ge3JlbmFtZX07CisJfQorCWdldEphdmFNb2RlbCgpLm1vdmUoZWxlbWVudHMsIGNvbnRhaW5lcnMsIG51bGwsIHJlbmFtaW5ncywgZm9yY2UsIG1vbml0b3IpOworfQorCisvKioKKyAqIENoYW5nZXMgdGhlIHNvdXJjZSBlbmQgaW5kZXggb2YgdGhpcyBlbGVtZW50IGFuZCBhbGwgY2hpbGRyZW4gKGZvbGxvd2luZworICogPGNvZGU+Y2hpbGQ8L2NvZGU+KS4gCisgKi8KK3B1YmxpYyB2b2lkIG9mZnNldFNvdXJjZUVuZEFuZENoaWxkcmVuKGludCBhbW91bnQsIElKYXZhRWxlbWVudCBjaGlsZCkgeworCXRyeSB7CisJCUNvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvIGN1SW5mbyA9IChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwkJY3VJbmZvLnNldFNvdXJjZUxlbmd0aChjdUluZm8uZ2V0U291cmNlTGVuZ3RoKCkgKyBhbW91bnQpOworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWJvb2xlYW4gYWZ0ZXJDaGlsZCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgYUNoaWxkID0gY2hpbGRyZW5baV07CisJCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBhQ2hpbGQuZXF1YWxzKGNoaWxkKSkgeworCQkJCWFmdGVyQ2hpbGQgPSB0cnVlOworCQkJfSBlbHNlCisJCQkJaWYgKGFmdGVyQ2hpbGQpIHsKKwkJCQkJKChKYXZhRWxlbWVudCkgYUNoaWxkKS5vZmZzZXRTb3VyY2VSYW5nZShhbW91bnQpOworCQkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KKy8qKgorICogQ2hhbmdlcyB0aGUgc291cmNlIGluZGV4ZXMgb2YgdGhpcyBlbGVtZW50IGFuZCBhbGwgY2hpbGRyZW4gZWxlbWVudHMuCisgKi8KK3B1YmxpYyB2b2lkIG9mZnNldFNvdXJjZVJhbmdlKGludCBhbW91bnQpIHsKKwl0cnkgeworCQlDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyBjdUluZm8gPSAoQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJCWN1SW5mby5zZXRTb3VyY2VMZW5ndGgoY3VJbmZvLmdldFNvdXJjZUxlbmd0aCgpICsgYW1vdW50KTsKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgYUNoaWxkID0gY2hpbGRyZW5baV07CisJCQkoKEphdmFFbGVtZW50KSBhQ2hpbGQpLm9mZnNldFNvdXJjZVJhbmdlKGFtb3VudCk7CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybjsKKwl9Cit9CisvKioKKyAqIEBzZWUgT3BlbmFibGUjb3BlbkJ1ZmZlcihJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwcm90ZWN0ZWQgSUJ1ZmZlciBvcGVuQnVmZmVyKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJLy8gY3JlYXRlIGJ1ZmZlciAtICBjb21waWxhdGlvbiB1bml0cyBvbmx5IHVzZSBkZWZhdWx0IGJ1ZmZlciBmYWN0b3J5CisJQnVmZmVyTWFuYWdlciBidWZNYW5hZ2VyID0gZ2V0QnVmZmVyTWFuYWdlcigpOworCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyRmFjdG9yeSgpLmNyZWF0ZUJ1ZmZlcih0aGlzKTsKKwlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOworCQorCS8vIHNldCB0aGUgYnVmZmVyIHNvdXJjZQorCWlmIChidWZmZXIuZ2V0Q2hhcmFjdGVycygpID09IG51bGwpeworCQlidWZmZXIuc2V0Q29udGVudHMoVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoKElGaWxlKXRoaXMuZ2V0UmVzb3VyY2UoKSkpOworCX0KKworCS8vIGFkZCBidWZmZXIgdG8gYnVmZmVyIGNhY2hlCisJYnVmTWFuYWdlci5hZGRCdWZmZXIoYnVmZmVyKTsKKwkJCQorCS8vIGxpc3RlbiB0byBidWZmZXIgY2hhbmdlcworCWJ1ZmZlci5hZGRCdWZmZXJDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCisJcmV0dXJuIGJ1ZmZlcjsKK30KKy8qCisgKiBAc2VlIE9wZW5hYmxlI29wZW5QYXJlbnQoSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHJvdGVjdGVkIHZvaWQgb3BlblBhcmVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0cnkgeworCQlzdXBlci5vcGVuUGFyZW50KHBtKTsKKwl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJLy8gYWxsb3cgcGFyZW50IHRvIG5vdCBleGlzdCBmb3IgZmFrZSB1bml0cyBkZWZpbmVkIG91dHNpZGUgY2xhc3NwYXRoCisJCS8vIHdpbGwgYmUgb2sgZm9yIGJvdGggd29ya2luZyBjb3BpZXMgYW5kIGNvbXBpbGF0aW9uIHVuaXRzCisJCWlmICghZS5pc0RvZXNOb3RFeGlzdCgpKXsgCisJCQl0aHJvdyBlOworCQl9CisJfQorfQorLyoqCisgKiAgQW5zd2VycyB0cnVlIGlmIHRoZSBwYXJlbnQgZXhpc3RzIChudWxsIHBhcmVudCBpcyBhbnN3ZXJpbmcgdHJ1ZSkKKyAqIAorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBwYXJlbnRFeGlzdHMoKXsKKwkKKwlyZXR1cm4gdHJ1ZTsgLy8gdG9sZXJhdGUgdW5pdHMgb3V0c2lkZSBjbGFzc3BhdGgKK30KKworLyoqCisgKiBAc2VlIElXb3JraW5nQ29weSNyZWNvbmNpbGUoKQorICovCitwdWJsaWMgSU1hcmtlcltdIHJlY29uY2lsZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCS8vIFJlY29uY2lsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gbm9uIHdvcmtpbmcgY29waWVzCisJcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkjcmVjb25jaWxlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIHJlY29uY2lsZSgKKwlib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwKKwlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJLy8gUmVjb25jaWxpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiBub24gd29ya2luZyBjb3BpZXMKK30KKworLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24jcmVuYW1lKFN0cmluZywgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChuYW1lID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsKKwlJSmF2YUVsZW1lbnRbXSBkZXN0cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzLmdldFBhcmVudCgpfTsKKwlTdHJpbmdbXSByZW5hbWluZ3M9IG5ldyBTdHJpbmdbXSB7bmFtZX07CisJZ2V0SmF2YU1vZGVsKCkucmVuYW1lKGVsZW1lbnRzLCBkZXN0cywgcmVuYW1pbmdzLCBmb3JjZSwgbW9uaXRvcik7Cit9CisvKioKKyAqIERvZXMgbm90aGluZyAtIHRoaXMgaXMgbm90IGEgd29ya2luZyBjb3B5LgorICoKKyAqIEBzZWUgSVdvcmtpbmdDb3B5I3Jlc3RvcmUoKQorICovCitwdWJsaWMgdm9pZCByZXN0b3JlICgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworfQorLyoqCisgKiBVcGRhdGVzIHRoZSBzb3VyY2UgZW5kIGluZGV4IGZvciB0aGlzIGVsZW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VFbmRPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKKwl0cnkgeworCQlDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyBjdUluZm8gPSAoQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKKwkJY3VJbmZvLnNldFNvdXJjZUxlbmd0aChjdUluZm8uZ2V0U291cmNlTGVuZ3RoKCkgKyBhbW91bnQpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KKy8qKgorICogVXBkYXRlcyB0aGUgc291cmNlIGluZGV4ZXMgZm9yIHRoaXMgZWxlbWVudC4KKyAqLworcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZVJhbmdlT2Zmc2V0KGludCBhbW91bnQsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kKSB7CisJdHJpZ2dlclNvdXJjZUVuZE9mZnNldChhbW91bnQsIG5hbWVTdGFydCwgbmFtZUVuZCk7Cit9CisvKioKKyAqIEBzZWUgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yKQorICogQGRlcHJlY2F0ZWQgLSB1c2UgY29kZUNvbXBsZXRlKGludCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IpCisgKi8KK3B1YmxpYyB2b2lkIGNvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBmaW5hbCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkKKwlpZiAocmVxdWVzdG9yID09IG51bGwpeworCQljb2RlQ29tcGxldGUob2Zmc2V0LCAoSUNvbXBsZXRpb25SZXF1ZXN0b3IpbnVsbCk7CisJCXJldHVybjsKKwl9CisJY29kZUNvbXBsZXRlKAorCQlvZmZzZXQsCisJCW5ldyBJQ29tcGxldGlvblJlcXVlc3RvcigpeworCQkJcHVibGljIHZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZShjaGFyW10gc3VwZXJUeXBlUGFja2FnZU5hbWUsY2hhcltdIHN1cGVyVHlwZU5hbWUsY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcyhwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCBjb21wbGV0aW9uTmFtZSwgbW9kaWZpZXJzLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpIHsKKwkJCQlpZiAodHJ1ZSkgcmV0dXJuOyAvLyB3YXMgZGlzYWJsZWQgaW4gMS4wCisKKwkJCQl0cnkgeworCQkJCQlJTWFya2VyIG1hcmtlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuVFJBTlNJRU5UX1BST0JMRU0pOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuSUQsIGVycm9yLmdldElEKCkpOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgZXJyb3IuZ2V0U291cmNlU3RhcnQoKSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgZXJyb3IuZ2V0U291cmNlRW5kKCkgKyAxKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCBlcnJvci5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyb3IuZ2V0TWVzc2FnZSgpKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdEVycm9yKG1hcmtlcik7CisJCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpeworCQkJCX0KKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEZpZWxkKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIG5hbWUsIGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLCBuYW1lLCB0eXBlUGFja2FnZU5hbWUsIHR5cGVOYW1lLCBjb21wbGV0aW9uTmFtZSwgbW9kaWZpZXJzLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gaW50ZXJmYWNlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZShwYWNrYWdlTmFtZSwgaW50ZXJmYWNlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEtleXdvcmQoY2hhcltdIGtleXdvcmROYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCXJlcXVlc3Rvci5hY2NlcHRLZXl3b3JkKGtleXdvcmROYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TGFiZWwoY2hhcltdIGxhYmVsTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TGFiZWwobGFiZWxOYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TG9jYWxWYXJpYWJsZShjaGFyW10gbmFtZSxjaGFyW10gdHlwZVBhY2thZ2VOYW1lLGNoYXJbXSB0eXBlTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLGNoYXJbXSBzZWxlY3RvcixjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsY2hhcltdIHJldHVyblR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCS8vIHNraXAgcGFyYW1ldGVyIG5hbWVzCisJCQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLCBzZWxlY3RvciwgcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIHJldHVyblR5cGVQYWNrYWdlTmFtZSwgcmV0dXJuVHlwZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2REZWNsYXJhdGlvbihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSxjaGFyW10gc2VsZWN0b3IsY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyxjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSByZXR1cm5UeXBlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE1vZGlmaWVyKGNoYXJbXSBtb2RpZmllck5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJcmVxdWVzdG9yLmFjY2VwdE1vZGlmaWVyKG1vZGlmaWVyTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShwYWNrYWdlTmFtZSwgY29tcGxldGlvbk5hbWUsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoY2hhcltdIHR5cGVQYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsY2hhcltdIG5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQl9KTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNyb290ZWRBdChJSmF2YVByb2plY3QpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgcm9vdGVkQXQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwlyZXR1cm4KKwkJbmV3IENvbXBpbGF0aW9uVW5pdCgKKwkJCShJUGFja2FnZUZyYWdtZW50KSgoSmF2YUVsZW1lbnQpZlBhcmVudCkucm9vdGVkQXQocHJvamVjdCksIAorCQkJZk5hbWUpOworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTM2MzU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKKworLyogcGFja2FnZSAqLyBjbGFzcyBDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8geworCisJLyoqCisJICogVGhlIGxlbmd0aCBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQncyBzb3VyY2UgY29kZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisJICovCisJcHJvdGVjdGVkIGludCBmU291cmNlTGVuZ3RoOworCisJLyoqIAorCSAqIFRpbWVzdGFtcCBvZiBvcmlnaW5hbCByZXNvdXJjZSBhdCB0aGUgdGltZSB0aGlzIGVsZW1lbnQKKwkgKiB3YXMgb3BlbmVkIG9yIGxhc3QgdXBkYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBmVGltZXN0YW1wOworLyoqCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBzdHJpbmcuCisgKi8KK3B1YmxpYyBpbnQgZ2V0U291cmNlTGVuZ3RoKCkgeworCXJldHVybiBmU291cmNlTGVuZ3RoOworfQorcHJvdGVjdGVkIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHsKKwlyZXR1cm4gbmV3IFNvdXJjZVJhbmdlKDAsIGZTb3VyY2VMZW5ndGgpOworfQorLyoqCisgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBzdHJpbmcuCisgKi8KK3B1YmxpYyB2b2lkIHNldFNvdXJjZUxlbmd0aChpbnQgbmV3U291cmNlTGVuZ3RoKSB7CisJZlNvdXJjZUxlbmd0aCA9IG5ld1NvdXJjZUxlbmd0aDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI0MWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogUmVzcG9uc2libGUgZm9yIHJlc29sdmluZyB0eXBlcyBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0IGJlaW5nIHJlY29uY2lsZWQsCisgKiByZXBvcnRpbmcgdGhlIGRpc2NvdmVyZWQgcHJvYmxlbXMgdG8gYSBnaXZlbiBJUHJvYmxlbVJlcXVlc3Rvci4KKyAqLworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIgZXh0ZW5kcyBDb21waWxlciB7CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBuZXcgQ29tcGlsYXRpb25Vbml0VmlzaXRvciB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgb3B0aW9ucy4KKwkgKiBUaGUgZW52aXJvbm1lbnQgYW5kIG9wdGlvbnMgd2lsbCBiZSBpbiBlZmZlY3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcGlsZXIuCisJICogV2hlbiB0aGUgY29tcGlsZXIgaXMgcnVuLCBjb21waWxhdGlvbiByZXN1bHRzIGFyZSBzZW50IHRvIHRoZSBnaXZlbiByZXF1ZXN0b3IuCisJICoKKwkgKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuZW52LklOYW1lRW52aXJvbm1lbnQKKwkgKiAgICAgIEVudmlyb25tZW50IHVzZWQgYnkgdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlc29sdmUgdHlwZSBhbmQgcGFja2FnZQorCSAqICAgICAgbmFtZXMuIFRoZSBuYW1lIGVudmlyb25tZW50IGltcGxlbWVudHMgdGhlIGFjdHVhbCBjb25uZWN0aW9uIG9mIHRoZSBjb21waWxlcgorCSAqICAgICAgdG8gdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gaW4gYmF0Y2ggbW9kZSB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBwZXJmb3JtaW5nCisJICogICAgICBwdXJlIGZpbGUgYWNjZXNzZXMsIHJldXNlIHByZXZpb3VzIGJ1aWxkIHN0YXRlIG9yIGNvbm5lY3Rpb24gdG8gcmVwb3NpdG9yaWVzKS4KKwkgKiAgICAgIE5vdGU6IHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFjdHVhbCBjbGFzc3BhdGgKKwkgKiAgICAgICAgICAgIHJ1bGVzLgorCSAqCisJICogIEBwYXJhbSBwb2xpY3kgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklFcnJvckhhbmRsaW5nUG9saWN5CisJICogICAgICBDb25maWd1cmFibGUgcGFydCBmb3IgcHJvYmxlbSBoYW5kbGluZywgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIGNsaWVudCB0bworCSAqICAgICAgc3BlY2lmeSB0aGUgcnVsZXMgZm9yIGhhbmRsaW5nIHByb2JsZW1zIChzdG9wIG9uIGZpcnN0IGVycm9yIG9yIGFjY3VtdWxhdGUKKwkgKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cKKwkgKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuCisJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzCisJICogCisJICoJQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyB0byB1c2UgZm9yIHRoZSByZXNvbHV0aW9uLgorCSAqICAgICAgCisJICogIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5JQ29tcGlsZXJSZXF1ZXN0b3IKKwkgKiAgICAgIENvbXBvbmVudCB3aGljaCB3aWxsIHJlY2VpdmUgYW5kIHBlcnNpc3QgYWxsIGNvbXBpbGF0aW9uIHJlc3VsdHMgYW5kIGlzIGludGVuZGVkCisJICogICAgICB0byBjb25zdW1lIHRoZW0gYXMgdGhleSBhcmUgcHJvZHVjZWQuIFR5cGljYWxseSwgaW4gYSBiYXRjaCBjb21waWxlciwgaXQgaXMgCisJICogICAgICByZXNwb25zaWJsZSBmb3Igd3JpdGluZyBvdXQgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgorCSAqICAgICAgQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLkNvbXBpbGF0aW9uUmVzdWx0CisJICoKKwkgKiAgQHBhcmFtIHByb2JsZW1GYWN0b3J5IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkucHJvYmxlbS5JUHJvYmxlbUZhY3RvcnkKKwkgKiAgICAgIEZhY3RvcnkgdXNlZCBpbnNpZGUgdGhlIGNvbXBpbGVyIHRvIGNyZWF0ZSBwcm9ibGVtIGRlc2NyaXB0b3JzLiBJdCBhbGxvd3MgdGhlCisJICogICAgICBjb21waWxlciBjbGllbnQgdG8gc3VwcGx5IGl0cyBvd24gcmVwcmVzZW50YXRpb24gb2YgY29tcGlsYXRpb24gcHJvYmxlbXMgaW4KKwkgKiAgICAgIG9yZGVyIHRvIGF2b2lkIG9iamVjdCBjb252ZXJzaW9ucy4gTm90ZSB0aGF0IHRoZSBmYWN0b3J5IGlzIG5vdCBzdXBwb3NlZAorCSAqICAgICAgdG8gYWNjdW11bGF0ZSB0aGUgY3JlYXRlZCBwcm9ibGVtcywgdGhlIGNvbXBpbGVyIHdpbGwgZ2F0aGVyIHRoZW0gYWxsIGFuZCBoYW5kCisJICogICAgICB0aGVtIGJhY2sgYXMgcGFydCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCByZXN1bHQuCisJICovCisJcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIoCisJCUlOYW1lRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCisJCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwKKwkJTWFwIHNldHRpbmdzLAorCQlJQ29tcGlsZXJSZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKKworCQlzdXBlcihlbnZpcm9ubWVudCwgcG9saWN5LCBzZXR0aW5ncywgcmVxdWVzdG9yLCBwcm9ibGVtRmFjdG9yeSwgdHJ1ZSk7CisJfQorCisJLyoqCisJICogQWRkIGFkZGl0aW9uYWwgc291cmNlIHR5cGVzCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9CisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZXNbMF0uZ2V0RmlsZU5hbWUoKSwgMSwgMSwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCS8vIG5lZWQgdG8gaG9sZCBvbnRvIHRoaXMKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAorCQkJCXNvdXJjZVR5cGVzLAorCQkJCXRydWUsCisJCQkJdHJ1ZSwKKwkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCisJCQkJcmVzdWx0KTsKKworCQlpZiAodW5pdCAhPSBudWxsKSB7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOworCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0LCB0cnVlKTsKKwkJfQorCX0KKworCS8qCisJICogIExvdy1sZXZlbCBBUEkgcGVyZm9ybWluZyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBnZXRIYW5kbGluZ1BvbGljeSgpIHsKKwkJcmV0dXJuIERlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSU5hbWVFbnZpcm9ubWVudCBnZXROYW1lRW52aXJvbm1lbnQoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIChTZWFyY2hhYmxlRW52aXJvbm1lbnQpICgoSmF2YVByb2plY3QpIHNvdXJjZVVuaXQuZ2V0SmF2YVByb2plY3QoKSkKKwkJCS5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJfQorCisJLyoKKwkgKiBBbnN3ZXIgdGhlIGNvbXBvbmVudCB0byB3aGljaCB3aWxsIGJlIGhhbmRlZCBiYWNrIGNvbXBpbGF0aW9uIHJlc3VsdHMgZnJvbSB0aGUgY29tcGlsZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElDb21waWxlclJlcXVlc3RvciBnZXRSZXF1ZXN0b3IoKSB7CisJCXJldHVybiBuZXcgSUNvbXBpbGVyUmVxdWVzdG9yKCkgeworCQkJcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiByZXNvbHZlKAorCQlJQ29tcGlsYXRpb25Vbml0IHVuaXRFbGVtZW50LCAKKwkJSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQljaGFyW10gZmlsZU5hbWUgPSB1bml0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQorCQlDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyIHByb2JsZW1GaW5kZXIgPQorCQkJbmV3IENvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIoCisJCQkJZ2V0TmFtZUVudmlyb25tZW50KHVuaXRFbGVtZW50KSwKKwkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAorCQkJCUphdmFDb3JlLmdldE9wdGlvbnMoKSwKKwkJCQlnZXRSZXF1ZXN0b3IoKSwKKwkJCQlnZXRQcm9ibGVtRmFjdG9yeShmaWxlTmFtZSwgcHJvYmxlbVJlcXVlc3RvciwgbW9uaXRvcikpOworCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworCQkJCisJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KXVuaXRFbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKKwkJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSBudWxsOworCQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKXsKKwkJCQlleHBlY3RlZFBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJCQl9CisJCQl1bml0ID0gcHJvYmxlbUZpbmRlci5yZXNvbHZlKAorCQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQkJCQl1bml0RWxlbWVudC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpLAorCQkJCQkJZXhwZWN0ZWRQYWNrYWdlTmFtZSwKKwkJCQkJCW5ldyBTdHJpbmcoZmlsZU5hbWUpLAorCQkJCQkJZW5jb2RpbmcpKTsKKwkJCXJldHVybiB1bml0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJfQorCQkJcHJvYmxlbUZpbmRlci5sb29rdXBFbnZpcm9ubWVudC5yZXNldCgpOwkJCQorCQl9CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgSVByb2JsZW1GYWN0b3J5IGdldFByb2JsZW1GYWN0b3J5KAorCQlmaW5hbCBjaGFyW10gZmlsZU5hbWUsIAorCQlmaW5hbCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yLAorCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKworCQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSB7CisJCQlwdWJsaWMgSVByb2JsZW0gY3JlYXRlUHJvYmxlbSgKKwkJCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJCQlpbnQgcHJvYmxlbUlkLAorCQkJCVN0cmluZ1tdIGFyZ3VtZW50cywKKwkJCQlpbnQgc2V2ZXJpdHksCisJCQkJaW50IHN0YXJ0UG9zaXRpb24sCisJCQkJaW50IGVuZFBvc2l0aW9uLAorCQkJCWludCBsaW5lTnVtYmVyKSB7CisKKwkJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKXsKKwkJCQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbnVsbCk7IC8vIHNpbGVudCBhYm9ydAorCQkJCX0KKwkJCQkKKwkJCQlJUHJvYmxlbSBwcm9ibGVtID0KKwkJCQkJc3VwZXIuY3JlYXRlUHJvYmxlbSgKKwkJCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUsCisJCQkJCQlwcm9ibGVtSWQsCisJCQkJCQlhcmd1bWVudHMsCisJCQkJCQlzZXZlcml0eSwKKwkJCQkJCXN0YXJ0UG9zaXRpb24sCisJCQkJCQllbmRQb3NpdGlvbiwKKwkJCQkJCWxpbmVOdW1iZXIpOworCQkJCS8vIG9ubHkgcmVwb3J0IGxvY2FsIHByb2JsZW1zCisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG9yaWdpbmF0aW5nRmlsZU5hbWUsIGZpbGVOYW1lKSl7CisJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpeworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQUk9CTEVNIEZPVU5EIHdoaWxlIHJlY29uY2lsaW5nIDogIitwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ly8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCXByb2JsZW1SZXF1ZXN0b3IuYWNjZXB0UHJvYmxlbShwcm9ibGVtKTsKKwkJCQl9CisJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSl7CisJCQkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHRydWUsIG51bGwpOyAvLyBzaWxlbnQgYWJvcnQKKwkJCQl9CisKKwkJCQlyZXR1cm4gcHJvYmxlbTsKKwkJCX0KKwkJfTsKKwl9CisKK30JCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2ZjQzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsNTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuUmVmZXJlbmNlSW5mb0FkYXB0ZXI7CisKKy8qKgorICogQSByZXF1ZXN0b3IgZm9yIHRoZSBmdXp6eSBwYXJzZXIsIHVzZWQgdG8gY29tcHV0ZSB0aGUgY2hpbGRyZW4gb2YgYW4gSUNvbXBpbGF0aW9uVW5pdC4KKyAqLworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3RvciBleHRlbmRzIFJlZmVyZW5jZUluZm9BZGFwdGVyIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgeworCisJLyoqCisJICogVGhlIGhhbmRsZSB0byB0aGUgY29tcGlsYXRpb24gdW5pdCBiZWluZyBwYXJzZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBmVW5pdDsKKworCS8qKgorCSAqIFRoZSBpbmZvIG9iamVjdCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYmVpbmcgcGFyc2VkCisJICovCisJcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvIGZVbml0SW5mbzsKKworCS8qKgorCSAqIFRoZSBpbXBvcnQgY29udGFpbmVyIGluZm8gLSBudWxsIHVudGlsIGNyZWF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YUVsZW1lbnRJbmZvIGZJbXBvcnRDb250YWluZXJJbmZvPSBudWxsOworCisJLyoqCisJICogSGFzaHRhYmxlIG9mIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorCSAqIENoaWxkcmVuIGFyZSBhZGRlZCB0byB0aGUgdGFibGUgYXMgdGhleSBhcmUgZm91bmQgYnkKKwkgKiB0aGUgcGFyc2VyLiBLZXlzIGFyZSBoYW5kbGVzLCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcKKwkgKiBpbmZvIG9iamVjdHMuCisJICovCisJcHJvdGVjdGVkIE1hcCBmTmV3RWxlbWVudHM7CisKKwkvKioKKwkgKiBTdGFjayBvZiBwYXJlbnQgc2NvcGUgaW5mbyBvYmplY3RzIC0gaS5lLiB0aGUgaW5mbyBvbiB0aGUKKwkgKiB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBwYXJlbnQgb2YgdGhlIG5leHQgZWxlbWVudCBmb3VuZC4KKwkgKiBGb3IgZXhhbXBsZSwgd2hlbiB3ZSBsb2NhdGUgYSBtZXRob2QsIHRoZSBwYXJlbnQgaW5mbyBvYmplY3QKKwkgKiB3aWxsIGJlIHRoZSB0eXBlIHRoZSBtZXRob2QgaXMgY29udGFpbmVkIGluLgorCSAqLworCXByb3RlY3RlZCBTdGFjayBmSW5mb1N0YWNrOworCisJLyoqCisJICogU3RhY2sgb2YgcGFyZW50IGhhbmRsZXMsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZm8gc3RhY2suIFdlCisJICoga2VlcCBib3RoLCBzaW5jZSBpbmZvIG9iamVjdHMgZG8gbm90IGhhdmUgYmFjayBwb2ludGVycyB0bworCSAqIGhhbmRsZXMuCisJICovCisJcHJvdGVjdGVkIFN0YWNrIGZIYW5kbGVTdGFjazsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBiZWluZyBwYXJzZWQuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSBmU291cmNlRmlsZU5hbWU9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgZG90LXNlcGFyYXRlZCBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoZSBjb21waWxhdGlvbiB1bml0CisJICogaXMgY29udGFpbmVkIGluIC0gYmFzZWQgb24gdGhlIHBhY2thZ2Ugc3RhdGVtZW50IGluIHRoZQorCSAqIGNvbXBpbGF0aW9uIHVuaXQsIGFuZCBpbml0aWFsaXplZCBieSAjYWNjZXB0UGFja2FnZS4KKwkgKiBJbml0aWFsaXplZCB0byA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgY2hhcltdIGZQYWNrYWdlTmFtZT0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyByZXBvcnRlZCB0aHVzIGZhci4gVXNlZCB0bworCSAqIGV4cGFuZCB0aGUgYXJyYXlzIG9mIHJlZmVyZW5jZSBraW5kcyBhbmQgbmFtZXMuCisJICovCisJcHJvdGVjdGVkIGludCBmUmVmQ291bnQ9IDA7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWZlcmVuY2Uga2luZCBhbmQgbmFtZQorCSAqIGFycmF5cy4gSWYgdGhlIGFycmF5cyBmaWxsLCB0aGV5IGFyZSBkb3VibGVkIGluCisJICogc2l6ZQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IGZnUmVmZXJlbmNlQWxsb2NhdGlvbj0gNTA7CisKKwkvKioKKwkgKiBQcm9ibGVtIHJlcXVlc3RvciB3aGljaCB3aWxsIGdldCBub3RpZmllZCBvZiBkaXNjb3ZlcmVkIHByb2JsZW1zCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3ludGF4RXJyb3JzID0gZmFsc2U7CisJCisJLyoqCisJICogRW1wdHkgY29sbGVjdGlvbnMgdXNlZCBmb3IgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBmZ0VtcHR5U3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nWzBdOworCXByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGZnRW1wdHlCeXRlPSBuZXcgYnl0ZVtde307CisJcHJvdGVjdGVkIHN0YXRpYyBjaGFyW11bXSBmZ0VtcHR5Q2hhckNoYXI9IG5ldyBjaGFyW11bXXt9OworCXByb3RlY3RlZCBzdGF0aWMgY2hhcltdIGZnRW1wdHlDaGFyPSBuZXcgY2hhcltde307CisKKworCXByb3RlY3RlZCBIYXNodGFibGVPZk9iamVjdCBmaWVsZFJlZkNhY2hlOworCXByb3RlY3RlZCBIYXNodGFibGVPZk9iamVjdCBtZXNzYWdlUmVmQ2FjaGU7CisJcHJvdGVjdGVkIEhhc2h0YWJsZU9mT2JqZWN0IHR5cGVSZWZDYWNoZTsKKwlwcm90ZWN0ZWQgSGFzaHRhYmxlT2ZPYmplY3QgdW5rbm93blJlZkNhY2hlOworCitwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yKElDb21waWxhdGlvblVuaXQgdW5pdCwgQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8gdW5pdEluZm8sIE1hcCBuZXdFbGVtZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhpcy5mVW5pdCA9IHVuaXQ7CisJdGhpcy5mVW5pdEluZm8gPSB1bml0SW5mbzsKKwl0aGlzLmZOZXdFbGVtZW50cyA9IG5ld0VsZW1lbnRzOworCXRoaXMuZlNvdXJjZUZpbGVOYW1lPSB1bml0LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKK30gCisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lLCBib29sZWFuIG9uRGVtYW5kKSB7CisJSmF2YUVsZW1lbnRJbmZvIHBhcmVudEluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSBmSW5mb1N0YWNrLnBlZWsoKTsKKwlKYXZhRWxlbWVudCBwYXJlbnRIYW5kbGU9IChKYXZhRWxlbWVudClmSGFuZGxlU3RhY2sucGVlaygpOworCWlmICghKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSkgeworCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgLy8gU2hvdWxkIG5vdCBoYXBwZW4KKwl9CisKKwlJQ29tcGlsYXRpb25Vbml0IHBhcmVudENVPSAoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnRIYW5kbGU7CisJLy9jcmVhdGUgdGhlIGltcG9ydCBjb250YWluZXIgYW5kIGl0cyBpbmZvCisJSUltcG9ydENvbnRhaW5lciBpbXBvcnRDb250YWluZXI9IHBhcmVudENVLmdldEltcG9ydENvbnRhaW5lcigpOworCWlmIChmSW1wb3J0Q29udGFpbmVySW5mbyA9PSBudWxsKSB7CisJCWZJbXBvcnRDb250YWluZXJJbmZvPSBuZXcgSmF2YUVsZW1lbnRJbmZvKCk7CisJCWZJbXBvcnRDb250YWluZXJJbmZvLnNldElzU3RydWN0dXJlS25vd24odHJ1ZSk7CisJCXBhcmVudEluZm8uYWRkQ2hpbGQoaW1wb3J0Q29udGFpbmVyKTsKKwkJZk5ld0VsZW1lbnRzLnB1dChpbXBvcnRDb250YWluZXIsIGZJbXBvcnRDb250YWluZXJJbmZvKTsKKwl9CisJCisJLy8gdGFjayBvbiB0aGUgJy4qJyBpZiBpdCBpcyBvbkRlbWFuZAorCVN0cmluZyBpbXBvcnROYW1lOworCWlmIChvbkRlbWFuZCkgeworCQlpbXBvcnROYW1lPSBuZXcgU3RyaW5nKG5hbWUpICsgIi4qIjsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWltcG9ydE5hbWU9IG5ldyBTdHJpbmcobmFtZSk7CisJfQorCQorCUltcG9ydERlY2xhcmF0aW9uIGhhbmRsZSA9IG5ldyBJbXBvcnREZWNsYXJhdGlvbihpbXBvcnRDb250YWluZXIsIGltcG9ydE5hbWUpOworCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7CisJCisJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IG5ldyBTb3VyY2VSZWZFbGVtZW50SW5mbygpOworCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydChkZWNsYXJhdGlvblN0YXJ0KTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKworCWZJbXBvcnRDb250YWluZXJJbmZvLmFkZENoaWxkKGhhbmRsZSk7CisJZk5ld0VsZW1lbnRzLnB1dChoYW5kbGUsIGluZm8pOworfQorLyoKKyAqIFRhYmxlIG9mIGxpbmUgc2VwYXJhdG9yIHBvc2l0aW9uLiBUaGlzIHRhYmxlIGlzIHBhc3NlZCBvbmNlIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBwYXJzZSBhY3Rpb24sIHNvIGFzIHRvIGFsbG93IGNvbXB1dGF0aW9uIG9mIG5vcm1hbGl6ZWQgcmFuZ2VzLgorICoKKyAqIEEgbGluZSBzZXBhcmF0b3IgbWlnaHQgY29ycmVzcG9uZHMgdG8gc2V2ZXJhbCBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2UsCisgKiAKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHt9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBjaGFyW10gbmFtZSkgeworCisJCUphdmFFbGVtZW50SW5mbyBwYXJlbnRJbmZvID0gKEphdmFFbGVtZW50SW5mbykgZkluZm9TdGFjay5wZWVrKCk7CisJCUphdmFFbGVtZW50IHBhcmVudEhhbmRsZT0gKEphdmFFbGVtZW50KWZIYW5kbGVTdGFjay5wZWVrKCk7CisJCUlQYWNrYWdlRGVjbGFyYXRpb24gaGFuZGxlID0gbnVsbDsKKwkJZlBhY2thZ2VOYW1lPSBuYW1lOworCQkKKwkJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CisJCQloYW5kbGUgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKChJQ29tcGlsYXRpb25Vbml0KSBwYXJlbnRIYW5kbGUsIG5ldyBTdHJpbmcobmFtZSkpOworCQl9CisJCWVsc2UgeworCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCisJCX0KKwkJcmVzb2x2ZUR1cGxpY2F0ZXMoaGFuZGxlKTsKKwkJCisJCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSBuZXcgU291cmNlUmVmRWxlbWVudEluZm8oKTsKKwkJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGRlY2xhcmF0aW9uU3RhcnQpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKworCQlwYXJlbnRJbmZvLmFkZENoaWxkKGhhbmRsZSk7CisJCWZOZXdFbGVtZW50cy5wdXQoaGFuZGxlLCBpbmZvKTsKKworfQorcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7CisJaWYgKChwcm9ibGVtLmdldElEKCkgJiBJUHJvYmxlbS5TeW50YXgpICE9IDApeworCQl0aGlzLmhhc1N5bnRheEVycm9ycyA9IHRydWU7CisJfQorfQorLyoqCisgKiBDb252ZXJ0IHRoZXNlIHR5cGUgbmFtZXMgdG8gc2lnbmF0dXJlcy4KKyAqIEBzZWUgU2lnbmF0dXJlLgorICovCisvKiBkZWZhdWx0ICovIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0VHlwZU5hbWVzVG9TaWdzKGNoYXJbXVtdIHR5cGVOYW1lcykgeworCWlmICh0eXBlTmFtZXMgPT0gbnVsbCkKKwkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsKKwlpbnQgbiA9IHR5cGVOYW1lcy5sZW5ndGg7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsKKwlTdHJpbmdbXSB0eXBlU2lncyA9IG5ldyBTdHJpbmdbbl07CisJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJdHlwZVNpZ3NbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZXNbaV0sIGZhbHNlKTsKKwl9CisJcmV0dXJuIHR5cGVTaWdzOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ2xhc3MoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50IG1vZGlmaWVycywKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCWludCBuYW1lU291cmNlRW5kLAorCWNoYXJbXSBzdXBlcmNsYXNzLAorCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCisJZW50ZXJUeXBlKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgbmFtZSwgbmFtZVNvdXJjZVN0YXJ0LCBuYW1lU291cmNlRW5kLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMpOworCit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZW50ZXJDb21waWxhdGlvblVuaXQoKSB7CisJZkluZm9TdGFjayA9IG5ldyBTdGFjaygpOworCWZIYW5kbGVTdGFjaz0gbmV3IFN0YWNrKCk7CisJZkluZm9TdGFjay5wdXNoKGZVbml0SW5mbyk7CisJZkhhbmRsZVN0YWNrLnB1c2goZlVuaXQpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50IG1vZGlmaWVycywKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCWludCBuYW1lU291cmNlRW5kLAorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKSB7CisKKwkJZW50ZXJNZXRob2QoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBudWxsLCBuYW1lLCBuYW1lU291cmNlU3RhcnQsCisJCQluYW1lU291cmNlRW5kLAlwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyTmFtZXMsIGV4Y2VwdGlvblR5cGVzLCB0cnVlKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBlbnRlckZpZWxkKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludCBtb2RpZmllcnMsCisJY2hhcltdIHR5cGUsCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTb3VyY2VTdGFydCwKKwlpbnQgbmFtZVNvdXJjZUVuZCkgeworCisJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBwYXJlbnRJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgZkluZm9TdGFjay5wZWVrKCk7CisJCUphdmFFbGVtZW50IHBhcmVudEhhbmRsZT0gKEphdmFFbGVtZW50KWZIYW5kbGVTdGFjay5wZWVrKCk7CisJCUlGaWVsZCBoYW5kbGUgPSBudWxsOworCQkKKwkJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCQloYW5kbGUgPSBuZXcgU291cmNlRmllbGQoKElUeXBlKSBwYXJlbnRIYW5kbGUsIG5ldyBTdHJpbmcobmFtZSkpOworCQl9CisJCWVsc2UgeworCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCisJCX0KKwkJcmVzb2x2ZUR1cGxpY2F0ZXMoaGFuZGxlKTsKKwkJCisJCVNvdXJjZUZpZWxkRWxlbWVudEluZm8gaW5mbyA9IG5ldyBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKCk7CisJCWluZm8uc2V0TmFtZShuYW1lKTsKKwkJaW5mby5zZXROYW1lU291cmNlU3RhcnQobmFtZVNvdXJjZVN0YXJ0KTsKKwkJaW5mby5zZXROYW1lU291cmNlRW5kKG5hbWVTb3VyY2VFbmQpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoZGVjbGFyYXRpb25TdGFydCk7CisJCWluZm8uc2V0RmxhZ3MobW9kaWZpZXJzKTsKKwkJaW5mby5zZXRUeXBlTmFtZSh0eXBlKTsKKworCQlwYXJlbnRJbmZvLmFkZENoaWxkKGhhbmRsZSk7CisJCWZOZXdFbGVtZW50cy5wdXQoaGFuZGxlLCBpbmZvKTsKKworCQlmSW5mb1N0YWNrLnB1c2goaW5mbyk7CisJCWZIYW5kbGVTdGFjay5wdXNoKGhhbmRsZSk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZW50ZXJJbml0aWFsaXplcigKKwlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwlpbnQgbW9kaWZpZXJzKSB7CisJCUphdmFFbGVtZW50SW5mbyBwYXJlbnRJbmZvID0gKEphdmFFbGVtZW50SW5mbykgZkluZm9TdGFjay5wZWVrKCk7CisJCUphdmFFbGVtZW50IHBhcmVudEhhbmRsZT0gKEphdmFFbGVtZW50KWZIYW5kbGVTdGFjay5wZWVrKCk7CisJCUlJbml0aWFsaXplciBoYW5kbGUgPSBudWxsOworCQkKKwkJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCQloYW5kbGUgPSAoKElUeXBlKSBwYXJlbnRIYW5kbGUpLmdldEluaXRpYWxpemVyKDEpOworCQl9CisJCWVsc2UgeworCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCisJCX0KKwkJcmVzb2x2ZUR1cGxpY2F0ZXMoaGFuZGxlKTsKKwkJCisJCUluaXRpYWxpemVyRWxlbWVudEluZm8gaW5mbyA9IG5ldyBJbml0aWFsaXplckVsZW1lbnRJbmZvKCk7CisJCWluZm8uc2V0U291cmNlUmFuZ2VTdGFydChkZWNsYXJhdGlvblNvdXJjZVN0YXJ0KTsKKwkJaW5mby5zZXRGbGFncyhtb2RpZmllcnMpOworCisJCXBhcmVudEluZm8uYWRkQ2hpbGQoaGFuZGxlKTsKKwkJZk5ld0VsZW1lbnRzLnB1dChoYW5kbGUsIGluZm8pOworCisJCWZJbmZvU3RhY2sucHVzaChpbmZvKTsKKwkJZkhhbmRsZVN0YWNrLnB1c2goaGFuZGxlKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBlbnRlckludGVyZmFjZSgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgbW9kaWZpZXJzLAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU291cmNlU3RhcnQsCisJaW50IG5hbWVTb3VyY2VFbmQsCisJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisKKwllbnRlclR5cGUoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBuYW1lLCBuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQsIG51bGwsIHN1cGVyaW50ZXJmYWNlcyk7CisKK30KKy8qKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBlbnRlck1ldGhvZCgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgbW9kaWZpZXJzLAorCWNoYXJbXSByZXR1cm5UeXBlLAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU291cmNlU3RhcnQsCisJaW50IG5hbWVTb3VyY2VFbmQsCisJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKKworCQllbnRlck1ldGhvZChkZWNsYXJhdGlvblN0YXJ0LCBtb2RpZmllcnMsIHJldHVyblR5cGUsIG5hbWUsIG5hbWVTb3VyY2VTdGFydCwKKwkJCW5hbWVTb3VyY2VFbmQsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJOYW1lcywgZXhjZXB0aW9uVHlwZXMsIGZhbHNlKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorICovCitwcm90ZWN0ZWQgdm9pZCBlbnRlck1ldGhvZCgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgbW9kaWZpZXJzLAorCWNoYXJbXSByZXR1cm5UeXBlLAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU291cmNlU3RhcnQsCisJaW50IG5hbWVTb3VyY2VFbmQsCisJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsCisJYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7CisKKwkJU291cmNlVHlwZUVsZW1lbnRJbmZvIHBhcmVudEluZm8gPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKSBmSW5mb1N0YWNrLnBlZWsoKTsKKwkJSmF2YUVsZW1lbnQgcGFyZW50SGFuZGxlPSAoSmF2YUVsZW1lbnQpZkhhbmRsZVN0YWNrLnBlZWsoKTsKKwkJSU1ldGhvZCBoYW5kbGUgPSBudWxsOworCisJCS8vIHRyYW5zbGF0ZSBudWxscyB0byBlbXB0eSBhcnJheXMKKwkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwpIHsKKwkJCXBhcmFtZXRlclR5cGVzPSBmZ0VtcHR5Q2hhckNoYXI7CisJCX0KKwkJaWYgKHBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKKwkJCXBhcmFtZXRlck5hbWVzPSBmZ0VtcHR5Q2hhckNoYXI7CisJCX0KKwkJaWYgKGV4Y2VwdGlvblR5cGVzID09IG51bGwpIHsKKwkJCWV4Y2VwdGlvblR5cGVzPSBmZ0VtcHR5Q2hhckNoYXI7CisJCX0KKwkJCisJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWdzID0gY29udmVydFR5cGVOYW1lc1RvU2lncyhwYXJhbWV0ZXJUeXBlcyk7CisJCWlmIChwYXJlbnRIYW5kbGUuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQkJaGFuZGxlID0gbmV3IFNvdXJjZU1ldGhvZCgoSVR5cGUpIHBhcmVudEhhbmRsZSwgbmV3IFN0cmluZyhuYW1lKSwgcGFyYW1ldGVyVHlwZVNpZ3MpOworCQl9CisJCWVsc2UgeworCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCisJCX0KKwkJcmVzb2x2ZUR1cGxpY2F0ZXMoaGFuZGxlKTsKKwkJCisJCVNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvIGluZm8gPSBuZXcgU291cmNlTWV0aG9kRWxlbWVudEluZm8oKTsKKwkJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGRlY2xhcmF0aW9uU3RhcnQpOworCQlpbnQgZmxhZ3MgPSBtb2RpZmllcnM7CisJCWluZm8uc2V0TmFtZShuYW1lKTsKKwkJaW5mby5zZXROYW1lU291cmNlU3RhcnQobmFtZVNvdXJjZVN0YXJ0KTsKKwkJaW5mby5zZXROYW1lU291cmNlRW5kKG5hbWVTb3VyY2VFbmQpOworCQlpbmZvLnNldENvbnN0cnVjdG9yKGlzQ29uc3RydWN0b3IpOworCQlpbmZvLnNldEZsYWdzKGZsYWdzKTsKKwkJaW5mby5zZXRBcmd1bWVudE5hbWVzKHBhcmFtZXRlck5hbWVzKTsKKwkJaW5mby5zZXRBcmd1bWVudFR5cGVOYW1lcyhwYXJhbWV0ZXJUeXBlcyk7CisJCWluZm8uc2V0UmV0dXJuVHlwZShyZXR1cm5UeXBlID09IG51bGwgPyBuZXcgY2hhcltdeyd2JywgJ28nLCdpJywgJ2QnfSA6IHJldHVyblR5cGUpOworCQlpbmZvLnNldEV4Y2VwdGlvblR5cGVOYW1lcyhleGNlcHRpb25UeXBlcyk7CisKKwkJcGFyZW50SW5mby5hZGRDaGlsZChoYW5kbGUpOworCQlmTmV3RWxlbWVudHMucHV0KGhhbmRsZSwgaW5mbyk7CisJCWZJbmZvU3RhY2sucHVzaChpbmZvKTsKKwkJZkhhbmRsZVN0YWNrLnB1c2goaGFuZGxlKTsKK30KKy8qKgorICogQ29tbW9uIHByb2Nlc3NpbmcgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGVudGVyVHlwZSgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnQgbW9kaWZpZXJzLAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU291cmNlU3RhcnQsCisJaW50IG5hbWVTb3VyY2VFbmQsCisJY2hhcltdIHN1cGVyY2xhc3MsCisJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisKKwljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWU9IG51bGw7CisJY2hhcltdIHF1YWxpZmllZE5hbWU9IG51bGw7CisJCisJSmF2YUVsZW1lbnRJbmZvIHBhcmVudEluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSBmSW5mb1N0YWNrLnBlZWsoKTsKKwlKYXZhRWxlbWVudCBwYXJlbnRIYW5kbGU9IChKYXZhRWxlbWVudClmSGFuZGxlU3RhY2sucGVlaygpOworCUlUeXBlIGhhbmRsZSA9IG51bGw7CisJU3RyaW5nIG5hbWVTdHJpbmc9IG5ldyBTdHJpbmcobmFtZSk7CisJCisJaWYgKHBhcmVudEhhbmRsZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CisJCWhhbmRsZSA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgcGFyZW50SGFuZGxlKS5nZXRUeXBlKG5hbWVTdHJpbmcpOworCQlpZiAoZlBhY2thZ2VOYW1lID09IG51bGwpIHsKKwkJCXF1YWxpZmllZE5hbWU9IG5hbWVTdHJpbmcudG9DaGFyQXJyYXkoKTsKKwkJfSBlbHNlIHsKKwkJCXF1YWxpZmllZE5hbWU9IChuZXcgU3RyaW5nKGZQYWNrYWdlTmFtZSkgKyAiLiIgKyBuYW1lU3RyaW5nKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJZWxzZSBpZiAocGFyZW50SGFuZGxlLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJaGFuZGxlID0gKChJVHlwZSkgcGFyZW50SGFuZGxlKS5nZXRUeXBlKG5hbWVTdHJpbmcpOworCQllbmNsb3NpbmdUeXBlTmFtZT0gKChTb3VyY2VUeXBlRWxlbWVudEluZm8pcGFyZW50SW5mbykuZ2V0TmFtZSgpOworCQlxdWFsaWZpZWROYW1lPSAobmV3IFN0cmluZygoKFNvdXJjZVR5cGVFbGVtZW50SW5mbylwYXJlbnRJbmZvKS5nZXRRdWFsaWZpZWROYW1lKCkpICsgIi4iICsgbmFtZVN0cmluZykudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCX0KKwllbHNlIHsKKwkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7IC8vIFNob3VsZCBub3QgaGFwcGVuCisJfQorCXJlc29sdmVEdXBsaWNhdGVzKGhhbmRsZSk7CisJCisJU291cmNlVHlwZUVsZW1lbnRJbmZvIGluZm8gPSBuZXcgU291cmNlVHlwZUVsZW1lbnRJbmZvKCk7CisJaW5mby5zZXRIYW5kbGUoaGFuZGxlKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoZGVjbGFyYXRpb25TdGFydCk7CisJaW5mby5zZXRGbGFncyhtb2RpZmllcnMpOworCWluZm8uc2V0TmFtZShuYW1lKTsKKwlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChuYW1lU291cmNlU3RhcnQpOworCWluZm8uc2V0TmFtZVNvdXJjZUVuZChuYW1lU291cmNlRW5kKTsKKwlpbmZvLnNldFN1cGVyY2xhc3NOYW1lKHN1cGVyY2xhc3MpOworCWluZm8uc2V0U3VwZXJJbnRlcmZhY2VOYW1lcyhzdXBlcmludGVyZmFjZXMpOworCWluZm8uc2V0RW5jbG9zaW5nVHlwZU5hbWUoZW5jbG9zaW5nVHlwZU5hbWUpOworCWluZm8uc2V0U291cmNlRmlsZU5hbWUoZlNvdXJjZUZpbGVOYW1lKTsKKwlpbmZvLnNldFBhY2thZ2VOYW1lKGZQYWNrYWdlTmFtZSk7CisJaW5mby5zZXRRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpOworCWZvciAoSXRlcmF0b3IgaXRlciA9IGZOZXdFbGVtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspeworCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSW1wb3J0RGVjbGFyYXRpb24pCisJCQlpbmZvLmFkZEltcG9ydCgoKElJbXBvcnREZWNsYXJhdGlvbilvYmplY3QpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJfQorCQorCisJcGFyZW50SW5mby5hZGRDaGlsZChoYW5kbGUpOworCWZOZXdFbGVtZW50cy5wdXQoaGFuZGxlLCBpbmZvKTsKKworCWZJbmZvU3RhY2sucHVzaChpbmZvKTsKKwlmSGFuZGxlU3RhY2sucHVzaChoYW5kbGUpOworCit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZXhpdENsYXNzKGludCBkZWNsYXJhdGlvbkVuZCkgeworCisJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlmVW5pdEluZm8uc2V0U291cmNlTGVuZ3RoKGRlY2xhcmF0aW9uRW5kICsgMSk7CisKKwkvLyBkZXRlcm1pbmUgaWYgdGhlcmUgd2VyZSBhbnkgcGFyc2luZyBlcnJvcnMKKwlmVW5pdEluZm8uc2V0SXNTdHJ1Y3R1cmVLbm93bighdGhpcy5oYXNTeW50YXhFcnJvcnMpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRDb25zdHJ1Y3RvcihpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBleGl0RmllbGQoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZXhpdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvbkVuZCkgeworCWV4aXRNZW1iZXIoZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqIGNvbW1vbiBwcm9jZXNzaW5nIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4aXRNZW1iZXIoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VSZWZFbGVtZW50SW5mbykgZkluZm9TdGFjay5wb3AoKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwlmSGFuZGxlU3RhY2sucG9wKCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKK30KKy8qKgorICogUmVzb2x2ZXMgZHVwbGljYXRlIGhhbmRsZXMgYnkgaW5jcmVtZW50aW5nIHRoZSBvY2N1cnJlbmNlIGNvdW50CisgKiBvZiB0aGUgaGFuZGxlIGJlaW5nIGNyZWF0ZWQgdW50aWwgdGhlcmUgaXMgbm8gY29uZmxpY3QuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHJlc29sdmVEdXBsaWNhdGVzKElKYXZhRWxlbWVudCBoYW5kbGUpIHsKKwl3aGlsZSAoZk5ld0VsZW1lbnRzLmNvbnRhaW5zS2V5KGhhbmRsZSkpIHsKKwkJSmF2YUVsZW1lbnQgaCA9IChKYXZhRWxlbWVudCkgaGFuZGxlOworCQloLnNldE9jY3VycmVuY2VDb3VudChoLmdldE9jY3VycmVuY2VDb3VudCgpICsgMSk7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0VmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0VmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0VmlzaXRvciBleHRlbmRzIENvbXBpbGVyIHsKKwkKKwkvKioKKwkgKiBBbnN3ZXIgYSBuZXcgQ29tcGlsYXRpb25Vbml0VmlzaXRvciB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgb3B0aW9ucy4KKwkgKiBUaGUgZW52aXJvbm1lbnQgYW5kIG9wdGlvbnMgd2lsbCBiZSBpbiBlZmZlY3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcGlsZXIuCisJICogV2hlbiB0aGUgY29tcGlsZXIgaXMgcnVuLCBjb21waWxhdGlvbiByZXN1bHRzIGFyZSBzZW50IHRvIHRoZSBnaXZlbiByZXF1ZXN0b3IuCisJICoKKwkgKiAgQHBhcmFtIGVudmlyb25tZW50IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hcGkuZW52LklOYW1lRW52aXJvbm1lbnQKKwkgKiAgICAgIEVudmlyb25tZW50IHVzZWQgYnkgdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvIHJlc29sdmUgdHlwZSBhbmQgcGFja2FnZQorCSAqICAgICAgbmFtZXMuIFRoZSBuYW1lIGVudmlyb25tZW50IGltcGxlbWVudHMgdGhlIGFjdHVhbCBjb25uZWN0aW9uIG9mIHRoZSBjb21waWxlcgorCSAqICAgICAgdG8gdGhlIG91dHNpZGUgd29ybGQgKGUuZy4gaW4gYmF0Y2ggbW9kZSB0aGUgbmFtZSBlbnZpcm9ubWVudCBpcyBwZXJmb3JtaW5nCisJICogICAgICBwdXJlIGZpbGUgYWNjZXNzZXMsIHJldXNlIHByZXZpb3VzIGJ1aWxkIHN0YXRlIG9yIGNvbm5lY3Rpb24gdG8gcmVwb3NpdG9yaWVzKS4KKwkgKiAgICAgIE5vdGU6IHRoZSBuYW1lIGVudmlyb25tZW50IGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFjdHVhbCBjbGFzc3BhdGgKKwkgKiAgICAgICAgICAgIHJ1bGVzLgorCSAqCisJICogIEBwYXJhbSBwb2xpY3kgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFwaS5wcm9ibGVtLklFcnJvckhhbmRsaW5nUG9saWN5CisJICogICAgICBDb25maWd1cmFibGUgcGFydCBmb3IgcHJvYmxlbSBoYW5kbGluZywgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIGNsaWVudCB0bworCSAqICAgICAgc3BlY2lmeSB0aGUgcnVsZXMgZm9yIGhhbmRsaW5nIHByb2JsZW1zIChzdG9wIG9uIGZpcnN0IGVycm9yIG9yIGFjY3VtdWxhdGUKKwkgKiAgICAgIHRoZW0gYWxsKSBhbmQgYXQgdGhlIHNhbWUgdGltZSBwZXJmb3JtIHNvbWUgYWN0aW9ucyBzdWNoIGFzIG9wZW5pbmcgYSBkaWFsb2cKKwkgKiAgICAgIGluIFVJIHdoZW4gY29tcGlsaW5nIGludGVyYWN0aXZlbHkuCisJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzCisJICogICAgICAKKwkgKiAgQHBhcmFtIHJlcXVlc3RvciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLklDb21waWxlclJlcXVlc3RvcgorCSAqICAgICAgQ29tcG9uZW50IHdoaWNoIHdpbGwgcmVjZWl2ZSBhbmQgcGVyc2lzdCBhbGwgY29tcGlsYXRpb24gcmVzdWx0cyBhbmQgaXMgaW50ZW5kZWQKKwkgKiAgICAgIHRvIGNvbnN1bWUgdGhlbSBhcyB0aGV5IGFyZSBwcm9kdWNlZC4gVHlwaWNhbGx5LCBpbiBhIGJhdGNoIGNvbXBpbGVyLCBpdCBpcyAKKwkgKiAgICAgIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIG91dCB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisJICogICAgICBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdAorCSAqCisJICogIEBwYXJhbSBwcm9ibGVtRmFjdG9yeSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXBpLnByb2JsZW0uSVByb2JsZW1GYWN0b3J5CisJICogICAgICBGYWN0b3J5IHVzZWQgaW5zaWRlIHRoZSBjb21waWxlciB0byBjcmVhdGUgcHJvYmxlbSBkZXNjcmlwdG9ycy4gSXQgYWxsb3dzIHRoZQorCSAqICAgICAgY29tcGlsZXIgY2xpZW50IHRvIHN1cHBseSBpdHMgb3duIHJlcHJlc2VudGF0aW9uIG9mIGNvbXBpbGF0aW9uIHByb2JsZW1zIGluCisJICogICAgICBvcmRlciB0byBhdm9pZCBvYmplY3QgY29udmVyc2lvbnMuIE5vdGUgdGhhdCB0aGUgZmFjdG9yeSBpcyBub3Qgc3VwcG9zZWQKKwkgKiAgICAgIHRvIGFjY3VtdWxhdGUgdGhlIGNyZWF0ZWQgcHJvYmxlbXMsIHRoZSBjb21waWxlciB3aWxsIGdhdGhlciB0aGVtIGFsbCBhbmQgaGFuZAorCSAqICAgICAgdGhlbSBiYWNrIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVzdWx0LgorCSAqLworCXB1YmxpYyBDb21waWxhdGlvblVuaXRWaXNpdG9yKAorCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LAorCQlJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3ksCisJCU1hcCBzZXR0aW5ncywKKwkJSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisKKwkJc3VwZXIoZW52aXJvbm1lbnQsIHBvbGljeSwgc2V0dGluZ3MsIHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIEFkZCBhZGRpdGlvbmFsIHNvdXJjZSB0eXBlcworCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgeworCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPQorCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGVzWzBdLmdldEZpbGVOYW1lKCksIDEsIDEsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQorCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKKwkJCQlzb3VyY2VUeXBlcywKKwkJCQl0cnVlLAorCQkJCXRydWUsCisJCQkJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLAorCQkJCXJlc3VsdCk7CisKKwkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0KTsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqICBMb3ctbGV2ZWwgQVBJIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBjb21waWxhdGlvbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUVycm9ySGFuZGxpbmdQb2xpY3kgZ2V0SGFuZGxpbmdQb2xpY3koKSB7CisKKwkJLy8gcGFzc2VzIHRoZSBpbml0aWFsIHNldCBvZiBmaWxlcyB0byB0aGUgYmF0Y2ggb3JhY2xlICh0byBhdm9pZCBmaW5kaW5nIG1vcmUgdGhhbiBvbmNlIHRoZSBzYW1lIHVuaXRzIHdoZW4gY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCkJCisJCXJldHVybiBuZXcgSUVycm9ySGFuZGxpbmdQb2xpY3koKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBzdG9wT25GaXJzdEVycm9yKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIHByb2NlZWRPbkVycm9ycygpIHsKKwkJCQlyZXR1cm4gZmFsc2U7IC8vIHN0b3AgaWYgdGhlcmUgYXJlIHNvbWUgZXJyb3JzIAorCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSU5hbWVFbnZpcm9ubWVudCBnZXROYW1lRW52aXJvbm1lbnQoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIChTZWFyY2hhYmxlRW52aXJvbm1lbnQpICgoSmF2YVByb2plY3QpIHNvdXJjZVVuaXQuZ2V0SmF2YVByb2plY3QoKSkKKwkJCS5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJfQorCisJLyoKKwkgKiBBbnN3ZXIgdGhlIGNvbXBvbmVudCB0byB3aGljaCB3aWxsIGJlIGhhbmRlZCBiYWNrIGNvbXBpbGF0aW9uIHJlc3VsdHMgZnJvbSB0aGUgY29tcGlsZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElDb21waWxlclJlcXVlc3RvciBnZXRSZXF1ZXN0b3IoKSB7CisJCXJldHVybiBuZXcgSUNvbXBpbGVyUmVxdWVzdG9yKCkgeworCQkJcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0KAorCQlJQ29tcGlsYXRpb25Vbml0IHVuaXRFbGVtZW50LAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlDb21waWxhdGlvblVuaXRWaXNpdG9yIGNvbXBpbGF0aW9uVW5pdFZpc2l0b3IgPQorCQkJbmV3IENvbXBpbGF0aW9uVW5pdFZpc2l0b3IoCisJCQkJZ2V0TmFtZUVudmlyb25tZW50KHVuaXRFbGVtZW50KSwKKwkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAorCQkJCUphdmFDb3JlLmdldE9wdGlvbnMoKSwKKwkJCQlnZXRSZXF1ZXN0b3IoKSwKKwkJCQlnZXRQcm9ibGVtRmFjdG9yeSh2aXNpdG9yKSk7CisKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisKKwkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpdW5pdEVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOworCQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IG51bGw7CisJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpeworCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCX0KKwkJCXVuaXQgPQorCQkJCWNvbXBpbGF0aW9uVW5pdFZpc2l0b3IucmVzb2x2ZSgKKwkJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAorCQkJCQkJdW5pdEVsZW1lbnQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwKKwkJCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUsCisJCQkJCQl1bml0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLAorCQkJCQkJZW5jb2RpbmcpKTsKKwkJCWlmICh1bml0ICE9IG51bGwpIHsKKwkJCQl1bml0LnRyYXZlcnNlKHZpc2l0b3IsIHVuaXQuc2NvcGUpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJCXVuaXQuY2xlYW5VcCgpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBJUHJvYmxlbUZhY3RvcnkgZ2V0UHJvYmxlbUZhY3RvcnkoZmluYWwgSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvcikgeworCisJCXJldHVybiBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpIHsKKwkJCXB1YmxpYyBJUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAorCQkJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAorCQkJCWludCBwcm9ibGVtSWQsCisJCQkJU3RyaW5nW10gYXJndW1lbnRzLAorCQkJCWludCBzZXZlcml0eSwKKwkJCQlpbnQgc3RhcnRQb3NpdGlvbiwKKwkJCQlpbnQgZW5kUG9zaXRpb24sCisJCQkJaW50IGxpbmVOdW1iZXIpIHsKKworCQkJCUlQcm9ibGVtIHByb2JsZW0gPQorCQkJCQlzdXBlci5jcmVhdGVQcm9ibGVtKAorCQkJCQkJb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJCQkJCXByb2JsZW1JZCwKKwkJCQkJCWFyZ3VtZW50cywKKwkJCQkJCXNldmVyaXR5LAorCQkJCQkJc3RhcnRQb3NpdGlvbiwKKwkJCQkJCWVuZFBvc2l0aW9uLAorCQkJCQkJbGluZU51bWJlcik7CisJCQkJdmlzaXRvci5hY2NlcHRQcm9ibGVtKHByb2JsZW0pOworCQkJCXJldHVybiBwcm9ibGVtOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQwYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDM1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuQ29tcGxldGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIgaW1wbGVtZW50cyBJQ29tcGxldGlvblJlcXVlc3RvciB7CisJc3RhdGljIGZpbmFsIGNoYXJbXSBBUkcgPSAiYXJnIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAorCQorCUlDb21wbGV0aW9uUmVxdWVzdG9yIGNsaWVudFJlcXVlc3RvcjsKKwlOYW1lTG9va3VwIG5hbWVMb29rdXA7CisJCitwdWJsaWMgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIoSUNvbXBsZXRpb25SZXF1ZXN0b3IgY2xpZW50UmVxdWVzdG9yLCBOYW1lTG9va3VwIG5hbWVMb29rdXApeworCXRoaXMuY2xpZW50UmVxdWVzdG9yID0gY2xpZW50UmVxdWVzdG9yOworCXRoaXMubmFtZUxvb2t1cCA9IG5hbWVMb29rdXA7Cit9CitwdWJsaWMgdm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKGNoYXJbXSBzdXBlclR5cGVQYWNrYWdlTmFtZSxjaGFyW10gc3VwZXJUeXBlTmFtZSxjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCWlmKHBhcmFtZXRlck5hbWVzID09IG51bGwpCisJCXBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKHN1cGVyVHlwZVBhY2thZ2VOYW1lLCBzdXBlclR5cGVOYW1lLCBzdXBlclR5cGVOYW1lLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdEFub255bW91c1R5cGUiLCAgbmV3IFN0cmluZ1tdeyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcudmFsdWVPZihzdXBlclR5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihzdXBlclR5cGVOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKHBhcmFtZXRlclBhY2thZ2VOYW1lcyksCisJCQlTdHJpbmcudmFsdWVPZihwYXJhbWV0ZXJUeXBlTmFtZXMpLAorCQkJU3RyaW5nLnZhbHVlT2YocGFyYW1ldGVyTmFtZXMpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbk5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YobW9kaWZpZXJzKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkKKwkJfSk7CisJfQorCXRoaXMuY2xpZW50UmVxdWVzdG9yLmFjY2VwdEFub255bW91c1R5cGUoc3VwZXJUeXBlUGFja2FnZU5hbWUsIHN1cGVyVHlwZU5hbWUsIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgcGFyYW1ldGVyVHlwZU5hbWVzLCBwYXJhbWV0ZXJOYW1lcywgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCisJaWYoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgeworCQlwcmludERlYnVnKCJhY2NlcHRDbGFzcyIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKHBhY2thZ2VOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNsYXNzTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihtb2RpZmllcnMpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIGNsYXNzTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpIHsKKwkKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCVN5c3RlbS5vdXQucHJpbnQoIkNPTVBMRVRJT04gLSBhY2NlcHRFcnJvcigiKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50KGVycm9yKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0RXJyb3IoZXJyb3IpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gbmFtZSwgY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCisJaWYoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgeworCQlwcmludERlYnVnKCJhY2NlcHRGaWVsZCIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihkZWNsYXJpbmdUeXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihuYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKHR5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZih0eXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihtb2RpZmllcnMpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbmFtZSwgdHlwZVBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGludGVyZmFjZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdEludGVyZmFjZSIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKHBhY2thZ2VOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGludGVyZmFjZU5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbk5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YobW9kaWZpZXJzKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkKKwkJfSk7CisJfQorCXRoaXMuY2xpZW50UmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZShwYWNrYWdlTmFtZSwgaW50ZXJmYWNlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0S2V5d29yZChjaGFyW10ga2V5d29yZE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCisJaWYoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgeworCQlwcmludERlYnVnKCJhY2NlcHRLZXl3b3JkIiwgIG5ldyBTdHJpbmdbXXsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nLnZhbHVlT2Yoa2V5d29yZE5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0S2V5d29yZChrZXl3b3JkTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TGFiZWwoY2hhcltdIGxhYmVsTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdExhYmVsIiwgIG5ldyBTdHJpbmdbXXsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nLnZhbHVlT2YobGFiZWxOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkKKwkJfSk7CisJfQorCXRoaXMuY2xpZW50UmVxdWVzdG9yLmFjY2VwdExhYmVsKGxhYmVsTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TG9jYWxWYXJpYWJsZShjaGFyW10gbmFtZSwgY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQorCWlmKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKKwkJcHJpbnREZWJ1ZygiYWNjZXB0TG9jYWxWYXJpYWJsZSIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKG5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YodHlwZVBhY2thZ2VOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKHR5cGVOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKG1vZGlmaWVycyksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uU3RhcnQpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCksCisJCQlTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpCisJCX0pOworCX0KKwl0aGlzLmNsaWVudFJlcXVlc3Rvci5hY2NlcHRMb2NhbFZhcmlhYmxlKG5hbWUsIHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIHNlbGVjdG9yLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCWlmKHBhcmFtZXRlck5hbWVzID09IG51bGwpCisJCXBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcyk7CisKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdE1ldGhvZCIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihkZWNsYXJpbmdUeXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihzZWxlY3RvciksCisJCQlTdHJpbmcudmFsdWVPZihwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpLAorCQkJU3RyaW5nLnZhbHVlT2YocGFyYW1ldGVyVHlwZU5hbWVzKSwKKwkJCVN0cmluZy52YWx1ZU9mKHBhcmFtZXRlck5hbWVzKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJldHVyblR5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihyZXR1cm5UeXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihtb2RpZmllcnMpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcywgcGFyYW1ldGVyTmFtZXMsIHJldHVyblR5cGVQYWNrYWdlTmFtZSwgcmV0dXJuVHlwZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCwgcmVsZXZhbmNlKTsKK30KKy8qKgorICogU2VlIElDb21wbGV0aW9uUmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIHNlbGVjdG9yLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCWlmKHBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKKwkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7CisJCQorCQlwYXJhbWV0ZXJOYW1lcyA9IGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGVOYW1lLCBzZWxlY3RvciwgcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQkKKwkJU3RyaW5nQnVmZmVyIGNvbXBsZXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKGNvbXBsZXRpb25OYW1lLmxlbmd0aCk7CisJCQkKKwkJaW50IHN0YXJ0ID0gMDsKKwkJaW50IGVuZCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignJScsIGNvbXBsZXRpb25OYW1lKTsKKworCQljb21wbGV0aW9uLmFwcGVuZChDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBsZXRpb25OYW1lLCBzdGFydCwgZW5kKSk7CisJCQorCQlmb3IoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKyl7CisJCQljb21wbGV0aW9uLmFwcGVuZChwYXJhbWV0ZXJOYW1lc1tpXSk7CisJCQlzdGFydCA9IGVuZCArIDE7CisJCQllbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyUnLCBjb21wbGV0aW9uTmFtZSwgc3RhcnQpOworCQkJaWYoZW5kID4gLTEpeworCQkJCWNvbXBsZXRpb24uYXBwZW5kKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoY29tcGxldGlvbk5hbWUsIHN0YXJ0LCBlbmQpKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tcGxldGlvbi5hcHBlbmQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb21wbGV0aW9uTmFtZSwgc3RhcnQsIGNvbXBsZXRpb25OYW1lLmxlbmd0aCkpOworCQkJfQorCQl9CisJCQorCQljb21wbGV0aW9uTmFtZSA9IGNvbXBsZXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCX0JCisJCisJaWYoQ29tcGxldGlvbkVuZ2luZS5ERUJVRykgeworCQlwcmludERlYnVnKCJhY2NlcHRNZXRob2REZWNsYXJhdGlvbiIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihkZWNsYXJpbmdUeXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihzZWxlY3RvciksCisJCQlTdHJpbmcudmFsdWVPZihwYXJhbWV0ZXJQYWNrYWdlTmFtZXMpLAorCQkJU3RyaW5nLnZhbHVlT2YocGFyYW1ldGVyVHlwZU5hbWVzKSwKKwkJCVN0cmluZy52YWx1ZU9mKHBhcmFtZXRlck5hbWVzKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJldHVyblR5cGVQYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihyZXR1cm5UeXBlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihtb2RpZmllcnMpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgc2VsZWN0b3IsIHBhcmFtZXRlclBhY2thZ2VOYW1lcywgcGFyYW1ldGVyVHlwZU5hbWVzLCBwYXJhbWV0ZXJOYW1lcywgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TW9kaWZpZXIoY2hhcltdIG1vZGlmaWVyTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdE1vZGlmaWVyIiwgIG5ldyBTdHJpbmdbXXsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nLnZhbHVlT2YobW9kaWZpZXJOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkKKwkJfSk7CisJfQorCXRoaXMuY2xpZW50UmVxdWVzdG9yLmFjY2VwdE1vZGlmaWVyKG1vZGlmaWVyTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkKKwlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7CisJCXByaW50RGVidWcoImFjY2VwdFBhY2thZ2UiLCAgbmV3IFN0cmluZ1tdeyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcudmFsdWVPZihwYWNrYWdlTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uTmFtZSksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uU3RhcnQpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCksCisJCQlTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpCisJCX0pOworCX0KKwl0aGlzLmNsaWVudFJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VOYW1lLCBjb21wbGV0aW9uTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorLyoqCisgKiBTZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQorCWlmKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKKwkJcHJpbnREZWJ1ZygiYWNjZXB0VHlwZSIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZy52YWx1ZU9mKHBhY2thZ2VOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKHR5cGVOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25OYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCksCisJCQlTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSwKKwkJCVN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkKKwkJfSk7CisJfQorCXRoaXMuY2xpZW50UmVxdWVzdG9yLmFjY2VwdFR5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBjb21wbGV0aW9uTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kLCByZWxldmFuY2UpOworfQorcHVibGljIHZvaWQgYWNjZXB0VmFyaWFibGVOYW1lKGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIG5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQorCWlmKENvbXBsZXRpb25FbmdpbmUuREVCVUcpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDT01QTEVUSU9OIC0gYWNjZXB0VmFyaWFibGVOYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJpbnREZWJ1ZygiYWNjZXB0VmFyaWFibGVOYW1lIiwgIG5ldyBTdHJpbmdbXXsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nLnZhbHVlT2YodHlwZVBhY2thZ2VOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKHR5cGVOYW1lKSwKKwkJCVN0cmluZy52YWx1ZU9mKG5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbk5hbWUpLAorCQkJU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSwKKwkJCVN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpLAorCQkJU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKQorCQl9KTsKKwl9CisJdGhpcy5jbGllbnRSZXF1ZXN0b3IuYWNjZXB0VmFyaWFibGVOYW1lKHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIG5hbWUsIGNvbXBsZXRpb25OYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQsIHJlbGV2YW5jZSk7Cit9Citwcml2YXRlIGNoYXJbXVtdIGZpbmRNZXRob2RQYXJhbWV0ZXJOYW1lcyhjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMpeworCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gbnVsbDsKKwlpbnQgbGVuZ3RoID0gcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsKKwkKKwljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsZGVjbGFyaW5nVHlwZU5hbWUsJy4nKTsKKwlJVHlwZSB0eXBlID0gbmFtZUxvb2t1cC5maW5kVHlwZShuZXcgU3RyaW5nKHR5cGVOYW1lKSwgZmFsc2UsIE5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgJiBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwlpZih0eXBlIGluc3RhbmNlb2YgQmluYXJ5VHlwZSl7CisJCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCWZvcihpbnQgaSA9IDA7CWk8IGxlbmd0aCA7IGkrKyl7CisJCQljaGFyW10gcGFyYW1ldGVyVHlwZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSxwYXJhbWV0ZXJUeXBlTmFtZXNbaV0sJy4nKTsKKwkJCWFyZ3NbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJUeXBlLHRydWUpOworCQl9CisJCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QobmV3IFN0cmluZyhzZWxlY3RvciksYXJncyk7CisJCXRyeXsKKwkJCXBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJU3RyaW5nW10gcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7CisJCQlmb3IoaW50IGkgPSAwOwlpPCBsZW5ndGggOyBpKyspeworCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gcGFyYW1zW2ldLnRvQ2hhckFycmF5KCk7CisJCQl9CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkJcGFyYW1ldGVyTmFtZXMgPSBudWxsOworCQl9CisJCQkKKwl9CisJLy8gZGVmYXVsdCBwYXJhbWV0ZXJzIG5hbWUKKwlpZihwYXJhbWV0ZXJOYW1lcyA9PSBudWxsKSB7CisJCXBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFSRywgU3RyaW5nLnZhbHVlT2YoaSkudG9DaGFyQXJyYXkoKSk7CisJCX0KKwl9CisJcmV0dXJuIHBhcmFtZXRlck5hbWVzOworfQorCitwcml2YXRlIHZvaWQgcHJpbnREZWJ1ZyhTdHJpbmcgaGVhZGVyLCBTdHJpbmdbXSBwYXJhbSl7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCJDT01QTEVUSU9OIC0gIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKGhlYWRlcik7CisJYnVmZmVyLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKKwkKKwlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSB7CisJCWlmKGkgIT0gMCkKKwkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKHBhcmFtW2ldKTsKKwl9CisKKwlidWZmZXIuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAorCVN5c3RlbS5vdXQucHJpbnRsbihidWZmZXIudG9TdHJpbmcoKSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlFbGVtZW50c09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjIyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhcmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gY29waWVzL21vdmVzIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBmcm9tIHRoZWlyIGN1cnJlbnQKKyAqIGNvbnRhaW5lciB0byBhIG5ldyBjb250YWluZXIsIG9wdGlvbmFsbHkgcmVuYW1pbmcgdGhlCisgKiBlbGVtZW50cy4KKyAqIDxwPk5vdGVzOjx1bD4KKyAqICAgIDxsaT5JZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGluCisgKiAgICB0aGUgbmV3IGNvbnRhaW5lciwgdGhlIG9wZXJhdGlvbiBlaXRoZXIgb3ZlcndyaXRlcyBvciBhYm9ydHMsCisgKiAgICBkZXBlbmRpbmcgb24gdGhlIGNvbGxpc2lvbiBwb2xpY3kgc2V0dGluZy4gVGhlIGRlZmF1bHQgc2V0dGluZyBpcworICoJICBhYm9ydC4KKyAqCisgKiAgICA8bGk+V2hlbiBjb25zdHJ1Y3RvcnMgYXJlIGNvcGllZCB0byBhIHR5cGUsIHRoZSBjb25zdHJ1Y3RvcnMKKyAqICAgIGFyZSBhdXRvbWF0aWNhbGx5IHJlbmFtZWQgdG8gdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uCisgKiAgICB0eXBlLgorICoKKyAqCSAgPGxpPldoZW4gbWFpbiB0eXBlcyBhcmUgcmVuYW1lZCAobW92ZSB3aXRoaW4gdGhlIHNhbWUgcGFyZW50KSwKKyAqCQl0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY29uc3RydWN0b3JzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbmFtZWQKKyAqCisgKiAgICA8bGk+VGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgYmVpbmcgY29waWVkIG11c3QgYWxsIHNoYXJlIHRoZQorICogICAgc2FtZSB0eXBlIG9mIGNvbnRhaW5lciAoZm9yIGV4YW1wbGUsIG11c3QgYWxsIGJlIHR5cGUgbWVtYmVycykuCisgKgorICogICAgPGxpPlRoZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG5ldyBjb250YWluZXIgaW4gdGhlIG9yZGVyIGdpdmVuLgorICoKKyAqICAgIDxsaT5UaGUgZWxlbWVudHMgY2FuIGJlIHBvc2l0aW9uZWQgaW4gdGhlIG5ldyBjb250YWluZXIgLSBzZWUgI3NldEluc2VydEJlZm9yZS4KKyAqICAgIEJ5IGRlZmF1bHQsIHRoZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgYmFzZWQgb24gdGhlIGRlZmF1bHQgcG9zaXRpb25zIGFzIHNwZWNpZmllZCBpbgorICogCXRoZSBjcmVhdGlvbiBvcGVyYXRpb24gZm9yIHRoYXQgZWxlbWVudCB0eXBlLgorICoKKyAqICAgIDxsaT5UaGlzIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byBjb3B5IGFuZCByZW5hbWUgZWxlbWVudHMgd2l0aGluCisgKiAgICB0aGUgc2FtZSBjb250YWluZXIuIAorICoKKyAqICAgIDxsaT5UaGlzIG9wZXJhdGlvbiBvbmx5IGNvcGllcyBlbGVtZW50cyBjb250YWluZWQgd2l0aGluIGNvbXBpbGF0aW9uIHVuaXRzLiAKKyAqIDwvdWw+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ29weUVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgTXVsdGlPcGVyYXRpb24geworCisJCisJcHJpdmF0ZSBNYXAgZlNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZQorICogZ2l2ZW4gY29udGFpbmVycy4gIFRoZSBlbGVtZW50cyBhbmQgZGVzdGluYXRpb24gY29udGFpbmVycyBtdXN0IGJlIGluCisgKiB0aGUgY29ycmVjdCBvcmRlci4gSWYgdGhlcmUgaXMgPiAxIGRlc3RpbmF0aW9uLCB0aGUgbnVtYmVyIG9mIGRlc3RpbmF0aW9ucworICogbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGJlaW5nIGNvcGllZC9tb3ZlZC9yZW5hbWVkLgorICovCitwdWJsaWMgQ29weUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Db3B5LCBJSmF2YUVsZW1lbnRbXSBkZXN0Q29udGFpbmVycywgYm9vbGVhbiBmb3JjZSkgeworCXN1cGVyKGVsZW1lbnRzVG9Db3B5LCBkZXN0Q29udGFpbmVycywgZm9yY2UpOworfQorLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZQorICogZ2l2ZW4gY29udGFpbmVyLgorICovCitwdWJsaWMgQ29weUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Db3B5LCBJSmF2YUVsZW1lbnQgZGVzdENvbnRhaW5lciwgYm9vbGVhbiBmb3JjZSkgeworCXRoaXMoZWxlbWVudHNUb0NvcHksIG5ldyBJSmF2YUVsZW1lbnRbXXtkZXN0Q29udGFpbmVyfSwgZm9yY2UpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHVzZSBhcyB0aGUgbWFpbiB0YXNrIG5hbWUKKyAqIGZvciBwcm9ncmVzcyBtb25pdG9yaW5nLgorICovCitwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY29weUVsZW1lbnRQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFJldHVybnMgdGhlIG5lc3RlZCBvcGVyYXRpb24gdG8gdXNlIGZvciBwcm9jZXNzaW5nIHRoaXMgZWxlbWVudAorICovCitwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uIGdldE5lc3RlZE9wZXJhdGlvbihJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXRyeSB7CisJCUlKYXZhRWxlbWVudCBkZXN0ID0gZ2V0RGVzdGluYXRpb25QYXJlbnQoZWxlbWVudCk7CisJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OIDoKKwkJCQlyZXR1cm4gbmV3IENyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbihlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIChJQ29tcGlsYXRpb25Vbml0KSBkZXN0KTsKKwkJCWNhc2UgSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTiA6CisJCQkJcmV0dXJuIG5ldyBDcmVhdGVJbXBvcnRPcGVyYXRpb24oZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCAoSUNvbXBpbGF0aW9uVW5pdCkgZGVzdCk7CisJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKKwkJCQlpZiAoaXNSZW5hbWluZ01haW5UeXBlKGVsZW1lbnQsIGRlc3QpKSB7CisJCQkJCXJldHVybiBuZXcgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihuZXcgSUphdmFFbGVtZW50W10ge2Rlc3R9LCBuZXcgSUphdmFFbGVtZW50W10ge2Rlc3QuZ2V0UGFyZW50KCl9LCBuZXcgU3RyaW5nW117Z2V0TmV3TmFtZUZvcihlbGVtZW50KSArICIuamF2YSJ9LCBmRm9yY2UpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG5ldyBDcmVhdGVUeXBlT3BlcmF0aW9uKGRlc3QsIGdldFNvdXJjZUZvcihlbGVtZW50KSArIFV0aWwuTElORV9TRVBBUkFUT1IsIGZGb3JjZSk7CisJCQkJfQorCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EIDoKKwkJCQlyZXR1cm4gbmV3IENyZWF0ZU1ldGhvZE9wZXJhdGlvbigoSVR5cGUpIGRlc3QsIGdldFNvdXJjZUZvcihlbGVtZW50KSArIFV0aWwuTElORV9TRVBBUkFUT1IsIGZGb3JjZSk7CisJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRCA6CisJCQkJcmV0dXJuIG5ldyBDcmVhdGVGaWVsZE9wZXJhdGlvbigoSVR5cGUpIGRlc3QsIGdldFNvdXJjZUZvcihlbGVtZW50KSArIFV0aWwuTElORV9TRVBBUkFUT1IsIGZGb3JjZSk7CisJCQljYXNlIElKYXZhRWxlbWVudC5JTklUSUFMSVpFUiA6CisJCQkJcmV0dXJuIG5ldyBDcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbigoSVR5cGUpIGRlc3QsIGdldFNvdXJjZUZvcihlbGVtZW50KSArIFV0aWwuTElORV9TRVBBUkFUT1IpOworCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgY2FjaGVkIHNvdXJjZSBmb3IgdGhpcyBlbGVtZW50IG9yIGNvbXB1dGUgaXQgaWYgbm90IGFscmVhZHkgY2FjaGVkLgorICovCitwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVN0cmluZyBzb3VyY2UgPSAoU3RyaW5nKSBmU291cmNlcy5nZXQoZWxlbWVudCk7CisJaWYgKHNvdXJjZSA9PSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7CisJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpZWxlbWVudDsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJU3RyaW5nIGN1U291cmNlID0gY3UuZ2V0U291cmNlKCk7CisJCUlET01Db21waWxhdGlvblVuaXQgZG9tQ1UgPSBuZXcgRE9NRmFjdG9yeSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjdVNvdXJjZSwgY3UuZ2V0RWxlbWVudE5hbWUoKSk7CisJCUlET01Ob2RlIG5vZGUgPSAoKEphdmFFbGVtZW50KWVsZW1lbnQpLmZpbmROb2RlKGRvbUNVKTsKKwkJc291cmNlID0gbmV3IFN0cmluZyhub2RlLmdldENoYXJhY3RlcnMoKSk7CisJCWZTb3VyY2VzLnB1dChlbGVtZW50LCBzb3VyY2UpOworCX0KKwlyZXR1cm4gc291cmNlOworfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyB0aGUgbWFpbiB0eXBlIG9mIGl0cyBjb21waWxhdGlvbiB1bml0LgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbmFtaW5nTWFpblR5cGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0KSB7CisJaWYgKChpc1JlbmFtZSgpIHx8IGdldE5ld05hbWVGb3IoZWxlbWVudCkgIT0gbnVsbCkKKwkJJiYgZGVzdC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CisJCVN0cmluZyB0eXBlTmFtZSA9IGRlc3QuZ2V0RWxlbWVudE5hbWUoKTsKKwkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKKwkJcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModHlwZU5hbWUpICYmIGVsZW1lbnQuZ2V0UGFyZW50KCkuZXF1YWxzKGRlc3QpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIENvcHkvbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBzb3VyY2UgdG8gZGVzdGluYXRpb24sIHJlbmFtaW5nCisgKiB0aGUgZWxlbWVudHMgYXMgc3BlY2lmaWVkLCBob25vcmluZyB0aGUgY29sbGlzaW9uIHBvbGljeS4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHVuYWJsZSB0bworICogYmUgY29tcGxldGVkCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlKYXZhTW9kZWxPcGVyYXRpb24gb3AgPSBnZXROZXN0ZWRPcGVyYXRpb24oZWxlbWVudCk7CisJYm9vbGVhbiBjcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiA9b3AgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbjsKKwlpZiAob3AgPT0gbnVsbCkgeworCQlyZXR1cm47CisJfQorCWlmIChjcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbikgeworCQlJSmF2YUVsZW1lbnQgc2libGluZyA9IChJSmF2YUVsZW1lbnQpIGZJbnNlcnRCZWZvcmVFbGVtZW50cy5nZXQoZWxlbWVudCk7CisJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJCSgoQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24pIG9wKS5zZXRSZWxhdGl2ZVBvc2l0aW9uKHNpYmxpbmcsIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLklOU0VSVF9CRUZPUkUpOworCQl9IGVsc2UKKwkJCWlmIChpc1JlbmFtZSgpKSB7CisJCQkJSUphdmFFbGVtZW50IGFuY2hvciA9IHJlc29sdmVSZW5hbWVBbmNob3IoZWxlbWVudCk7CisJCQkJaWYgKGFuY2hvciAhPSBudWxsKSB7CisJCQkJCSgoQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24pIG9wKS5zZXRSZWxhdGl2ZVBvc2l0aW9uKGFuY2hvciwgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uSU5TRVJUX0FGVEVSKTsgLy8gaW5zZXJ0IGFmdGVyIHNvIHRoYXQgdGhlIGFuY2hvciBpcyBmb3VuZCBiZWZvcmUgd2hlbiBkZWxldGVkIGJlbG93CisJCQkJfQorCQkJfQorCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWVGb3IoZWxlbWVudCk7CisJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKKwkJCSgoQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24pIG9wKS5zZXRBbHRlcmVkTmFtZShuZXdOYW1lKTsKKwkJfQorCX0KKwlleGVjdXRlTmVzdGVkT3BlcmF0aW9uKG9wLCAxKTsKKworCUphdmFFbGVtZW50IGRlc3RpbmF0aW9uID0gKEphdmFFbGVtZW50KSBnZXREZXN0aW5hdGlvblBhcmVudChlbGVtZW50KTsKKwlJQ29tcGlsYXRpb25Vbml0IHVuaXQ9IGRlc3RpbmF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOworCWlmICghdW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJdW5pdC5jbG9zZSgpOworCX0KKworCWlmIChjcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiAmJiBpc01vdmUoKSAmJiAhaXNSZW5hbWluZ01haW5UeXBlKGVsZW1lbnQsIGRlc3RpbmF0aW9uKSkgeworCQlEZWxldGVFbGVtZW50c09wZXJhdGlvbiBkZWxldGVPcCA9IG5ldyBEZWxldGVFbGVtZW50c09wZXJhdGlvbihuZXcgSUphdmFFbGVtZW50W10geyBlbGVtZW50IH0sIGZGb3JjZSk7CisJCWV4ZWN1dGVOZXN0ZWRPcGVyYXRpb24oZGVsZXRlT3AsIDEpOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgYW5jaG9yIHVzZWQgZm9yIHBvc2l0aW9uaW5nIGluIHRoZSBkZXN0aW5hdGlvbiBmb3IgCisgKiB0aGUgZWxlbWVudCBiZWluZyByZW5hbWVkLiBGb3IgcmVuYW1pbmcsIGlmIG5vIGFuY2hvciBoYXMKKyAqIGV4cGxpY2l0bHkgYmVlbiBwcm92aWRlZCwgdGhlIGVsZW1lbnQgaXMgYW5jaG9yZWQgaW4gdGhlIHNhbWUgcG9zaXRpb24uCisgKi8KK3ByaXZhdGUgSUphdmFFbGVtZW50IHJlc29sdmVSZW5hbWVBbmNob3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlQYXJlbnQgcGFyZW50ID0gKElQYXJlbnQpIGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCUlKYXZhRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQuZXF1YWxzKGVsZW1lbnQpKSB7CisJCQlyZXR1cm4gY2hpbGQ7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIFBvc3NpYmxlIGZhaWx1cmVzOgorICogPHVsPgorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gbm8gZWxlbWVudHMgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorICoJPGxpPklOREVYX09VVF9PRl9CT1VORFMgLSB0aGUgbnVtYmVyIG9mIHJlbmFtaW5ncyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uCisgKgkJZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdlcmUgc3VwcGxpZWQuCisgKiA8L3VsPgorICovCitwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKGZSZW5hbWluZ3NMaXN0ICE9IG51bGwgJiYgZlJlbmFtaW5nc0xpc3QubGVuZ3RoICE9IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICoKKyAqIFBvc3NpYmxlIGZhaWx1cmUgY29kZXM6CisgKiA8dWw+CisgKgorICoJPGxpPkVMRU1FTlRfRE9FU19OT1RfRVhJU1QgLSA8Y29kZT5lbGVtZW50PC9jb2RlPiBvciBpdHMgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGlzCisgKgkJaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZG9lcyBub3QgZXhpc3QuIElmIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCBpcworICoJCXN1cHBsaWVkLCBubyBlbGVtZW50IGlzIHByb3ZpZGVkIGluIHRoZSBzdGF0dXMsIG90aGVyd2lzZSwgdGhlIG5vbi1leGlzdGFudCBlbGVtZW50CisgKgkJaXMgc3VwcGxpZWQgaW4gdGhlIHN0YXR1cy4KKyAqCTxsaT5JTlZBTElEX0VMRU1FTlRfVFlQRVMgLSA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyBub3QgY29udGFpbmVkIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCisgKgkJVGhpcyBvcGVyYXRpb24gb25seSBvcGVyYXRlcyBvbiBlbGVtZW50cyBjb250YWluZWQgd2l0aGluIGNvbXBpbGF0aW9uIHVuaXRzLgorICogIDxsaT5SRUFEX09OTFkgLSA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyByZWFkIG9ubHkuCisgKgk8bGk+SU5WQUxJRF9ERVNUSU5BVElPTiAtIFRoZSBkZXN0aW5hdGlvbiBwYXJlbnQgc3BlY2lmaWVkIGZvciA8Y29kZT5lbGVtZW50PC9jb2RlPgorICoJCWlzIG9mIGFuIGluY29tcGF0aWJsZSB0eXBlLiBUaGUgZGVzdGluYXRpb24gZm9yIGEgcGFja2FnZSBkZWNsYXJhdGlvbiBvciBpbXBvcnQgZGVjbGFyYXRpb24gbXVzdAorICoJCWJlIGEgY29tcGlsYXRpb24gdW5pdDsgdGhlIGRlc3RpbmF0aW9uIGZvciBhIHR5cGUgbXVzdCBiZSBhIHR5cGUgb3IgY29tcGlsYXRpb24KKyAqCQl1bml0OyB0aGUgZGVzdGluYWlvbiBmb3IgYW55IHR5cGUgbWVtYmVyIChvdGhlciB0aGFuIGEgdHlwZSkgbXVzdCBiZSBhIHR5cGUuIFdoZW4KKyAqCQl0aGlzIGVycm9yIG9jY3VycywgdGhlIGVsZW1lbnQgcHJvdmlkZWQgaW4gdGhlIG9wZXJhdGlvbiBzdGF0dXMgaXMgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LgorICoJPGxpPklOVkFMSURfTkFNRSAtIHRoZSBuZXcgbmFtZSBmb3IgPGNvZGU+ZWxlbWVudDwvY29kZT4gZG9lcyBub3QgaGF2ZSB2YWxpZCBzeW50YXguCisgKiAgICAgIEluIHRoaXMgY2FzZSB0aGUgZWxlbWVudCBhbmQgbmFtZSBhcmUgcHJvdmlkZWQgaW4gdGhlIHN0YXR1cy4KKworICogPC91bD4KKyAqLworcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQorCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnQpOworCisJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA8IElKYXZhRWxlbWVudC5UWVBFKQorCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisKKwlpZiAoZWxlbWVudC5pc1JlYWRPbmx5KCkpCisJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCBlbGVtZW50KTsKKworCUlKYXZhRWxlbWVudCBkZXN0ID0gZ2V0RGVzdGluYXRpb25QYXJlbnQoZWxlbWVudCk7CisJdmVyaWZ5RGVzdGluYXRpb24oZWxlbWVudCwgZGVzdCk7CisJdmVyaWZ5U2libGluZyhlbGVtZW50LCBkZXN0KTsKKwlpZiAoZlJlbmFtaW5nc0xpc3QgIT0gbnVsbCkgeworCQl2ZXJpZnlSZW5hbWluZyhlbGVtZW50KTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VlN2FiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDU4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLkRPTUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworCisvKioKKyAqIFRoaXMgb3BlcmF0aW9uIGNvcGllcy9tb3Zlcy9yZW5hbWVzIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgZnJvbSB0aGVpciBjdXJyZW50CisgKiBjb250YWluZXIgdG8gYSBuZXcgY29udGFpbmVyLCBvcHRpb25hbGx5IHJlbmFtaW5nIHRoZQorICogZWxlbWVudHMuCisgKiA8cD5Ob3Rlczo8dWw+CisgKiAgICA8bGk+SWYgdGhlcmUgaXMgYWxyZWFkeSBhbiByZXNvdXJjZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4KKyAqICAgIHRoZSBuZXcgY29udGFpbmVyLCB0aGUgb3BlcmF0aW9uIGVpdGhlciBvdmVyd3JpdGVzIG9yIGFib3J0cywKKyAqICAgIGRlcGVuZGluZyBvbiB0aGUgY29sbGlzaW9uIHBvbGljeSBzZXR0aW5nLiBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzCisgKgkgIGFib3J0LgorICoKKyAqICAgIDxsaT5XaGVuIGEgY29tcGlsYXRpb24gdW5pdCBpcyBjb3BpZWQgdG8gYSBuZXcgcGFja2FnZSwgdGhlCisgKiAgICBwYWNrYWdlIGRlY2xhcmF0aW9uIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4KKyAqCisgKiAgICA8bGk+VGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgYmVpbmcgY29waWVkIG11c3QgYWxsIHNoYXJlIHRoZQorICogICAgc2FtZSB0eXBlIG9mIGNvbnRhaW5lci4KKyAqCisgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gY29weSBhbmQgcmVuYW1lIGVsZW1lbnRzIHdpdGhpbgorICogICAgdGhlIHNhbWUgY29udGFpbmVyLiAKKyAqCisgKiAgICA8bGk+VGhpcyBvcGVyYXRpb24gb25seSBjb3BpZXMgY29tcGlsYXRpb24gdW5pdHMgYW5kIHBhY2thZ2UgZnJhZ21lbnRzLgorICogICAgSXQgZG9lcyBub3QgY29weSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIC0gYSBwbGF0Zm9ybSBvcGVyYXRpb24gbXVzdCBiZSB1c2VkIGZvciB0aGF0LgorICogPC91bD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDb3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbiBleHRlbmRzIE11bHRpT3BlcmF0aW9uIHsKKwkvKioKKwkgKiBBIGNvbGxlY3Rpb24gb2YgcmVuYW1lZCBjb21waWxhdGlvbiB1bml0cy4gIFRoZXNlIGN1cyBkbworCSAqIG5vdCBuZWVkIHRvIGJlIHNhdmVkIGFzIHRoZXkgbm8gbG9uZ2VyIGV4aXN0LgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZlJlbmFtZWRDb21waWxhdGlvblVuaXRzID0gbnVsbDsKKwkvKioKKwkgKiBUYWJsZSBzcGVjaWZ5aW5nIGRlbHRhcyBmb3IgZWxlbWVudHMgYmVpbmcgCisJICogY29waWVkL21vdmVkL3JlbmFtZWQuIEtleWVkIGJ5IGVsZW1lbnRzJyBwcm9qZWN0KHMpLCBhbmQKKwkgKiB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIGRlbHRhcy4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGZEZWx0YXNQZXJQcm9qZWN0PSBuZXcgSGFzaE1hcCgxKTsKKwkvKioKKwkgKiBUaGUgPGNvZGU+RE9NRmFjdG9yeTwvY29kZT4gdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzb3VyY2UgY29kZSBvZgorCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBET01GYWN0b3J5IGZGYWN0b3J5OworCS8qKgorCSAqIFRoZSBsaXN0IG9mIG5ldyByZXNvdXJjZXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uCisJICovCisJcHJvdGVjdGVkIEFycmF5TGlzdCBmQ3JlYXRlZEVsZW1lbnRzOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKKyAqIGdpdmVuIGNvbnRhaW5lcnMuICBUaGUgcmVzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbiBjb250YWluZXJzIG11c3QgYmUgaW4KKyAqIHRoZSBjb3JyZWN0IG9yZGVyLiBJZiB0aGVyZSBpcyA+IDEgZGVzdGluYXRpb24sIHRoZSBudW1iZXIgb2YgZGVzdGluYXRpb25zCisgKiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGJlaW5nIGNvcGllZC9tb3ZlZC4KKyAqLworcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50W10gZGVzdENvbnRhaW5lcnMsIGJvb2xlYW4gZm9yY2UpIHsKKwlzdXBlcihyZXNvdXJjZXNUb0NvcHksIGRlc3RDb250YWluZXJzLCBmb3JjZSk7CisJZkZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOworfQorLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKKyAqIGdpdmVuIGNvbnRhaW5lci4KKyAqLworcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50IGRlc3RDb250YWluZXIsIGJvb2xlYW4gZm9yY2UpIHsKKwl0aGlzKHJlc291cmNlc1RvQ29weSwgbmV3IElKYXZhRWxlbWVudFtde2Rlc3RDb250YWluZXJ9LCBmb3JjZSk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIDxjb2RlPnNvdXJjZTwvY29kZT4gd2hpY2ggYXJlIGFmZmVjdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICogSWYgPGNvZGU+c291cmNlPC9jb2RlPiBpcyBhIDxjb2RlPktfU09VUkNFPC9jb2RlPiwgdGhlc2UgYXJlIHRoZSA8Y29kZT4uamF2YTwvY29kZT4KKyAqIGZpbGVzLCBpZiBpdCBpcyBhIDxjb2RlPktfQklOQVJZPC9jb2RlPiwgdGhleSBhcmUgdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuCisgKi8KK3ByaXZhdGUgSVJlc291cmNlW10gY29sbGVjdFJlc291cmNlc09mSW50ZXJlc3QoSVBhY2thZ2VGcmFnbWVudCBzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gc291cmNlLmdldENoaWxkcmVuKCk7CisJaW50IGNoaWxkT2ZJbnRlcmVzdCA9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOworCWlmIChzb3VyY2UuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKSB7CisJCWNoaWxkT2ZJbnRlcmVzdCA9IElKYXZhRWxlbWVudC5DTEFTU19GSUxFOworCX0KKwlBcnJheUxpc3QgY29ycmVjdEtpbmRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCUlKYXZhRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQuZ2V0RWxlbWVudFR5cGUoKSA9PSBjaGlsZE9mSW50ZXJlc3QpIHsKKwkJCWNvcnJlY3RLaW5kQ2hpbGRyZW4uYWRkKGNoaWxkLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKKwkJfQorCX0KKwkvLyBHYXRoZXIgbm9uLWphdmEgcmVzb3VyY2VzCisJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IHNvdXJjZS5nZXROb25KYXZhUmVzb3VyY2VzKCk7CisJaW50IGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50ID0gMDsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gbm9uSmF2YVJlc291cmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCWlmIChub25KYXZhUmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSBhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCsrOworCX0KKwlJUmVzb3VyY2VbXSBhY3R1YWxOb25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVthY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudF07CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoLCBpbmRleCA9IDA7IGkgPCBtYXg7IGkrKyl7CisJCWlmIChub25KYXZhUmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSBhY3R1YWxOb25KYXZhUmVzb3VyY2VzW2luZGV4KytdID0gKElSZXNvdXJjZSlub25KYXZhUmVzb3VyY2VzW2ldOworCX0KKwkKKwlpZiAoYWN0dWFsTm9uSmF2YVJlc291cmNlQ291bnQgIT0gMCkgeworCQlpbnQgY29ycmVjdEtpbmRDaGlsZHJlblNpemUgPSBjb3JyZWN0S2luZENoaWxkcmVuLnNpemUoKTsKKwkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVtjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSArIGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50XTsKKwkJY29ycmVjdEtpbmRDaGlsZHJlbi50b0FycmF5KHJlc3VsdCk7CisJCVN5c3RlbS5hcnJheWNvcHkoYWN0dWFsTm9uSmF2YVJlc291cmNlcywgMCwgcmVzdWx0LCBjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSwgYWN0dWFsTm9uSmF2YVJlc291cmNlQ291bnQpOworCQlyZXR1cm4gcmVzdWx0OworCX0gZWxzZSB7CisJCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbY29ycmVjdEtpbmRDaGlsZHJlbi5zaXplKCldOworCQljb3JyZWN0S2luZENoaWxkcmVuLnRvQXJyYXkocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisvKioKKyAqIENyZWF0ZXMgYW55IGRlc3RpbmF0aW9uIHBhY2thZ2UgZnJhZ21lbnQocykgd2hpY2ggZG8gbm90IGV4aXN0cyB5ZXQuCisgKi8KK3ByaXZhdGUgdm9pZCBjcmVhdGVOZWVkZWRQYWNrYWdlRnJhZ21lbnRzKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZyBuZXdGcmFnTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSA9IGdldERlbHRhRm9yKHJvb3QuZ2V0SmF2YVByb2plY3QoKSk7CisJU3RyaW5nW10gbmFtZXMgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMobmV3RnJhZ05hbWUpOworCVN0cmluZ0J1ZmZlciBzaWRlRWZmZWN0UGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworCQlTdHJpbmcgc3ViRm9sZGVyTmFtZSA9IG5hbWVzW2ldOworCQlzaWRlRWZmZWN0UGFja2FnZU5hbWUuYXBwZW5kKHN1YkZvbGRlck5hbWUpOworCQlJUmVzb3VyY2Ugc3ViRm9sZGVyID0gcGFyZW50Rm9sZGVyLmZpbmRNZW1iZXIoc3ViRm9sZGVyTmFtZSk7CisJCWlmIChzdWJGb2xkZXIgPT0gbnVsbCkgeworCQkJY3JlYXRlRm9sZGVyKHBhcmVudEZvbGRlciwgc3ViRm9sZGVyTmFtZSwgZkZvcmNlKTsKKwkJCXBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOworCQkJSVBhY2thZ2VGcmFnbWVudCBzaWRlRWZmZWN0UGFja2FnZSA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHNpZGVFZmZlY3RQYWNrYWdlTmFtZS50b1N0cmluZygpKTsKKwkJCWlmIChpIDwgbmFtZXMubGVuZ3RoIC0gMSkgeyAvLyBhbGwgYnV0IHRoZSBsYXN0IG9uZSBhcmUgc2lkZSBlZmZlY3QgcGFja2FnZXMKKwkJCQlwcm9qZWN0RGVsdGEuYWRkZWQoc2lkZUVmZmVjdFBhY2thZ2UpOworCQkJfQorCQkJZkNyZWF0ZWRFbGVtZW50cy5hZGQoc2lkZUVmZmVjdFBhY2thZ2UpOworCQl9IGVsc2UgeworCQkJcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHN1YkZvbGRlcjsKKwkJfQorCQlzaWRlRWZmZWN0UGFja2FnZU5hbWUuYXBwZW5kKCcuJyk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSA8Y29kZT5KYXZhRWxlbWVudERlbHRhPC9jb2RlPiBmb3IgPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+LAorICogY3JlYXRpbmcgaXQgYW5kIHB1dHRpbmcgaXQgaW4gPGNvZGU+ZkRlbHRhc1BlclByb2plY3Q8L2NvZGU+IGlmCisgKiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCisgKi8KK3ByaXZhdGUgSmF2YUVsZW1lbnREZWx0YSBnZXREZWx0YUZvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKwlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKEphdmFFbGVtZW50RGVsdGEpIGZEZWx0YXNQZXJQcm9qZWN0LmdldChqYXZhUHJvamVjdCk7CisJaWYgKGRlbHRhID09IG51bGwpIHsKKwkJZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShqYXZhUHJvamVjdCk7CisJCWZEZWx0YXNQZXJQcm9qZWN0LnB1dChqYXZhUHJvamVjdCwgZGVsdGEpOworCX0KKwlyZXR1cm4gZGVsdGE7Cit9CisvKioKKyAqIEBzZWUgTXVsdGlPcGVyYXRpb24KKyAqLworcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7CisJcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwuYmluZCgib3BlcmF0aW9uLmNvcHlSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogU2V0cyB0aGUgZGVsdGFzIHRvIHJlZ2lzdGVyIHRoZSBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgb3BlcmF0aW9uCisgKiBmb3IgdGhpcyBzb3VyY2UgZWxlbWVudCBhbmQgaXRzIGRlc3RpbmF0aW9uLgorICogSWYgdGhlIG9wZXJhdGlvbiBpcyBhIGNyb3NzIHByb2plY3Qgb3BlcmF0aW9uPHVsPgorICogPGxpPk9uIGEgY29weSwgdGhlIGRlbHRhIHNob3VsZCBiZSByb290ZWQgaW4gdGhlIGRlc3QgcHJvamVjdAorICogPGxpPk9uIGEgbW92ZSwgdHdvIGRlbHRhcyBhcmUgZ2VuZXJhdGVkPHVsPgorICogCQkJPGxpPm9uZSByb290ZWQgaW4gdGhlIHNvdXJjZSBwcm9qZWN0CisgKgkJCTxsaT5vbmUgcm9vdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0PC91bD48L3VsPgorICogSWYgdGhlIG9wZXJhdGlvbiBpcyByb290ZWQgaW4gYSBzaW5nbGUgcHJvamVjdCwgdGhlIGRlbHRhIGlzIHJvb3RlZCBpbiB0aGF0IHByb2plY3QKKyAqIAkgCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByZXBhcmVEZWx0YXMoSUphdmFFbGVtZW50IHNvdXJjZUVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbkVsZW1lbnQpIHsKKwlJSmF2YVByb2plY3QgZGVzdFByb2plY3QgPSBkZXN0aW5hdGlvbkVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwlpZiAoaXNNb3ZlKCkpIHsKKwkJSUphdmFQcm9qZWN0IHNvdXJjZVByb2plY3QgPSBzb3VyY2VFbGVtZW50LmdldEphdmFQcm9qZWN0KCk7CisJCWdldERlbHRhRm9yKHNvdXJjZVByb2plY3QpLm1vdmVkRnJvbShzb3VyY2VFbGVtZW50LCBkZXN0aW5hdGlvbkVsZW1lbnQpOworCQlnZXREZWx0YUZvcihkZXN0UHJvamVjdCkubW92ZWRUbyhkZXN0aW5hdGlvbkVsZW1lbnQsIHNvdXJjZUVsZW1lbnQpOworCX0gZWxzZSB7CisJCWdldERlbHRhRm9yKGRlc3RQcm9qZWN0KS5hZGRlZChkZXN0aW5hdGlvbkVsZW1lbnQpOworCX0KK30KKy8qKgorICogQ29waWVzL21vdmVzIGEgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBuYW1lIDxjb2RlPm5ld0NVTmFtZTwvY29kZT4KKyAqIHRvIHRoZSBkZXN0aW5hdGlvbiBwYWNrYWdlLjxicj4KKyAqIFRoZSBwYWNrYWdlIHN0YXRlbWVudCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyB1cGRhdGVkIGlmIG5lY2Vzc2FyeS4KKyAqIFRoZSBtYWluIHR5cGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgcmVuYW1lZCBpZiBuZWNlc3NhcnkuCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyB1bmFibGUgdG8KKyAqIGNvbXBsZXRlCisgKi8KK3ByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIElQYWNrYWdlRnJhZ21lbnQgZGVzdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU3RyaW5nIG5ld0NVTmFtZSA9IGdldE5ld05hbWVGb3Ioc291cmNlKTsKKwlTdHJpbmcgZGVzdE5hbWUgPSAobmV3Q1VOYW1lICE9IG51bGwpID8gbmV3Q1VOYW1lIDogc291cmNlLmdldEVsZW1lbnROYW1lKCk7CisJU3RyaW5nIG5ld0NvbnRlbnQgPSB1cGRhdGVkQ29udGVudChzb3VyY2UsIGRlc3QsIG5ld0NVTmFtZSk7IC8vIG51bGwgaWYgdW5jaGFuZ2VkCisKKwkvLyBjb3B5IHJlc291cmNlCisJSUZpbGUgc291cmNlUmVzb3VyY2UgPSAoSUZpbGUpKHNvdXJjZS5pc1dvcmtpbmdDb3B5KCkgPyBzb3VyY2UuZ2V0T3JpZ2luYWxFbGVtZW50KCkgOiBzb3VyY2UpLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOworCUlDb250YWluZXIgZGVzdEZvbGRlciA9IChJQ29udGFpbmVyKWRlc3QuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7IC8vIGNhbiBiZSBhbiBJRm9sZGVyIG9yIGFuIElQcm9qZWN0CisJSUZpbGUgZGVzdEZpbGUgPSBkZXN0Rm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZGVzdE5hbWUpKTsKKwlpZiAoIWRlc3RGaWxlLmVxdWFscyhzb3VyY2VSZXNvdXJjZSkpIHsKKwkJdHJ5IHsKKwkJCWlmIChkZXN0RmlsZS5leGlzdHMoKSkgeworCQkJCWlmIChmRm9yY2UpIHsKKwkJCQkJLy8gd2UgY2FuIHJlbW92ZSBpdAorCQkJCQlkZWxldGVSZXNvdXJjZShkZXN0RmlsZSwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gYWJvcnQKKwkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pKTsKKwkJCQl9CisJCQl9CisJCQlpbnQgZmxhZ3MgPSBuZXdDb250ZW50ICE9IG51bGwgPyBJUmVzb3VyY2UuTk9ORSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlk7CisJCQlpZiAoZkZvcmNlKSBmbGFncyB8PSBJUmVzb3VyY2UuRk9SQ0U7CisJCQlpZiAodGhpcy5pc01vdmUoKSkgeworCQkJCXNvdXJjZVJlc291cmNlLm1vdmUoZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKSwgZmxhZ3MsIGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQl9IGVsc2UgeworCQkJCXNvdXJjZVJlc291cmNlLmNvcHkoZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKSwgZmxhZ3MsIGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQl9CisJCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisKKwkJLy8gdXBkYXRlIG5ldyByZXNvdXJjZSBjb250ZW50CisJCXRyeSB7CisJCQlpZiAobmV3Q29udGVudCAhPSBudWxsKXsKKwkJCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCQkJZGVzdEZpbGUuc2V0Q29udGVudHMoCisJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGluZyA9PSBudWxsID8gbmV3Q29udGVudC5nZXRCeXRlcygpIDogbmV3Q29udGVudC5nZXRCeXRlcyhlbmNvZGluZykpLCAKKwkJCQkJZkZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksCisJCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQl9CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJfQorCQorCQkvLyByZWdpc3RlciB0aGUgY29ycmVjdCBjaGFuZ2UgZGVsdGFzCisJCUlDb21waWxhdGlvblVuaXQgZGVzdENVID0gZGVzdC5nZXRDb21waWxhdGlvblVuaXQoZGVzdE5hbWUpOworCQlwcmVwYXJlRGVsdGFzKHNvdXJjZSwgZGVzdENVKTsKKwkJaWYgKG5ld0NVTmFtZSAhPSBudWxsKSB7CisJCQkvL3RoZSBtYWluIHR5cGUgaGFzIGJlZW4gcmVuYW1lZAorCQkJU3RyaW5nIG9sZE5hbWUgPSBzb3VyY2UuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCW9sZE5hbWUgPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxlbmd0aCgpIC0gNSk7CisJCQlTdHJpbmcgbmV3TmFtZSA9IG5ld0NVTmFtZTsKKwkJCW5ld05hbWUgPSBuZXdOYW1lLnN1YnN0cmluZygwLCBuZXdOYW1lLmxlbmd0aCgpIC0gNSk7CisJCQlwcmVwYXJlRGVsdGFzKHNvdXJjZS5nZXRUeXBlKG9sZE5hbWUpLCBkZXN0Q1UuZ2V0VHlwZShuZXdOYW1lKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWZGb3JjZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pKTsKKwkJfQorCQkvLyB1cGRhdGUgbmV3IHJlc291cmNlIGNvbnRlbnQKKwkJLy8gaW4gY2FzZSB3ZSBkbyBhIHNhdmVhcyBvbiB0aGUgc2FtZSByZXNvdXJjZSB3ZSBoYXZlIHRvIHNpbXBseSB1cGRhdGUgdGhlIGNvbnRlbnRzCisJCS8vIHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNTEKKwkJdHJ5IHsKKwkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpeworCQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCQlkZXN0RmlsZS5zZXRDb250ZW50cygKKwkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kaW5nID09IG51bGwgPyBuZXdDb250ZW50LmdldEJ5dGVzKCkgOiBuZXdDb250ZW50LmdldEJ5dGVzKGVuY29kaW5nKSksIAorCQkJCQlmRm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCisJCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQl9CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJfQorCX0KK30KKy8qKgorICogUHJvY2VzcyBhbGwgb2YgdGhlIGNoYW5nZWQgZGVsdGFzIGdlbmVyYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAqLworcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlbHRhcygpIHsKKwlmb3IgKEl0ZXJhdG9yIGRlbHRhcyA9IHRoaXMuZkRlbHRhc1BlclByb2plY3QudmFsdWVzKCkuaXRlcmF0b3IoKTsgZGVsdGFzLmhhc05leHQoKTspeworCQlhZGREZWx0YSgoSUphdmFFbGVtZW50RGVsdGEpIGRlbHRhcy5uZXh0KCkpOworCX0KK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICogVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIDxjb2RlPnByb2Nlc3NDb21waWxhdGlvblVuaXRSZXNvdXJjZTwvY29kZT4gb3IKKyAqIDxjb2RlPnByb2Nlc3NQYWNrYWdlRnJhZ21lbnRSZXNvdXJjZTwvY29kZT4sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZgorICogPGNvZGU+ZWxlbWVudDwvY29kZT4uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnQgZGVzdCA9IGdldERlc3RpbmF0aW9uUGFyZW50KGVsZW1lbnQpOworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdFJlc291cmNlKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50LCAoSVBhY2thZ2VGcmFnbWVudCkgZGVzdCk7CisJCQlmQ3JlYXRlZEVsZW1lbnRzLmFkZCgoKElQYWNrYWdlRnJhZ21lbnQpIGRlc3QpLmdldENvbXBpbGF0aW9uVW5pdChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCXByb2Nlc3NQYWNrYWdlRnJhZ21lbnRSZXNvdXJjZSgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgKElQYWNrYWdlRnJhZ21lbnRSb290KSBkZXN0LCBnZXROZXdOYW1lRm9yKGVsZW1lbnQpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCkpOworCX0KK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICogT3ZlcnJpZGRlbiB0byBhbGxvdyBzcGVjaWFsIHByb2Nlc3Npbmcgb2YgPGNvZGU+SmF2YUVsZW1lbnREZWx0YTwvY29kZT5zCisgKiBhbmQgPGNvZGU+ZlJlc3VsdEVsZW1lbnRzPC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJZkNyZWF0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCk7CisJdHJ5IHsKKwkJc3VwZXIucHJvY2Vzc0VsZW1lbnRzKCk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQl0aHJvdyBqbWU7CisJfSBmaW5hbGx5IHsKKwkJZlJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtmQ3JlYXRlZEVsZW1lbnRzLnNpemUoKV07CisJCWZDcmVhdGVkRWxlbWVudHMudG9BcnJheShmUmVzdWx0RWxlbWVudHMpOworCQlwcm9jZXNzRGVsdGFzKCk7CisJfQorfQorLyoqCisgKiBDb3BpZXMvbW92ZXMgYSBwYWNrYWdlIGZyYWdtZW50IHdpdGggdGhlIG5hbWUgPGNvZGU+bmV3TmFtZTwvY29kZT4KKyAqIHRvIHRoZSBkZXN0aW5hdGlvbiBwYWNrYWdlLjxicj4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHVuYWJsZSB0bworICogY29tcGxldGUKKyAqLworcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYWNrYWdlRnJhZ21lbnRSZXNvdXJjZShJUGFja2FnZUZyYWdtZW50IHNvdXJjZSwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRyeSB7CisJCVN0cmluZyBuZXdGcmFnTmFtZSA9IChuZXdOYW1lID09IG51bGwpID8gc291cmNlLmdldEVsZW1lbnROYW1lKCkgOiBuZXdOYW1lOworCQljcmVhdGVOZWVkZWRQYWNrYWdlRnJhZ21lbnRzKHJvb3QsIG5ld0ZyYWdOYW1lKTsKKwkJSVBhY2thZ2VGcmFnbWVudCBuZXdGcmFnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQobmV3RnJhZ05hbWUpOworCisJCS8vIHByb2Nlc3MgdGhlIGxlYWYgcmVzb3VyY2VzCisJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbGxlY3RSZXNvdXJjZXNPZkludGVyZXN0KHNvdXJjZSk7CisJCWlmIChyZXNvdXJjZXMubGVuZ3RoID4gMCkgeworCQkJSVBhdGggZGVzdFBhdGggPSBuZXdGcmFnLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7CisJCQlpZiAoaXNSZW5hbWUoKSkgeworCQkJCWlmICghIGRlc3RQYXRoLmVxdWFscyhzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSkpIHsKKwkJCQkJbW92ZVJlc291cmNlcyhyZXNvdXJjZXMsIGRlc3RQYXRoKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGlzTW92ZSgpKSB7CisJCQkJLy8gd2UgbmVlZCB0byBkZWxldGUgdGhpcyByZXNvdXJjZSBpZiB0aGlzIG9wZXJhdGlvbiB3YW50cyB0byBvdmVycmlkZSBleGlzdGluZyByZXNvdXJjZXMKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJCUlSZXNvdXJjZSBkZXN0aW5hdGlvblJlc291cmNlID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZGVzdFBhdGguYXBwZW5kKHJlc291cmNlc1tpXS5nZXROYW1lKCkpKTsKKwkJCQkJaWYgKGRlc3RpbmF0aW9uUmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJaWYgKGZGb3JjZSkgeworCQkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUmVzb3VyY2UsIElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCW1vdmVSZXNvdXJjZXMocmVzb3VyY2VzLCBkZXN0UGF0aCk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdlIG5lZWQgdG8gZGVsZXRlIHRoaXMgcmVzb3VyY2UgaWYgdGhpcyBvcGVyYXRpb24gd2FudHMgdG8gb3ZlcnJpZGUgZXhpc3RpbmcgcmVzb3VyY2VzCisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQlJUmVzb3VyY2UgZGVzdGluYXRpb25SZXNvdXJjZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGRlc3RQYXRoLmFwcGVuZChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpKSk7CisJCQkJCWlmIChkZXN0aW5hdGlvblJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCWlmIChmRm9yY2UpIHsKKwkJCQkJCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlIGlmIHRoaXMgb3BlcmF0aW9uIHdhbnRzIHRvIG92ZXJyaWRlIGV4aXN0aW5nIHJlc291cmNlcworCQkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUmVzb3VyY2UsIElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNvcHlSZXNvdXJjZXMocmVzb3VyY2VzLCBkZXN0UGF0aCk7CisJCQl9CisJCQlpZiAoIW5ld0ZyYWcuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoc291cmNlLmdldEVsZW1lbnROYW1lKCkpKSB7IC8vIGlmIHBhY2thZ2UgaGFzIGJlZW4gcmVuYW1lZCwgdXBkYXRlIHRoZSBjb21waWxhdGlvbiB1bml0cworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCS8vIHdlIG9ubHkgY29uc2lkZXIgcG90ZW50aWFsIGNvbXBpbGF0aW9uIHVuaXRzCisJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3RnJhZy5nZXRDb21waWxhdGlvblVuaXQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7CisJCQkJCQlJRE9NQ29tcGlsYXRpb25Vbml0IGRvbUNVID0gZkZhY3RvcnkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGN1LmdldFNvdXJjZSgpLCBjdS5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCWlmIChkb21DVSAhPSBudWxsKSB7CisJCQkJCQkJdXBkYXRlUGFja2FnZVN0YXRlbWVudChkb21DVSwgbmV3RnJhZ05hbWUpOworCQkJCQkJCUlCdWZmZXIgYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7CisJCQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSBjb250aW51ZTsKKwkJCQkJCQlTdHJpbmcgYnVmZmVyQ29udGVudHMgPSBidWZmZXIuZ2V0Q29udGVudHMoKTsKKwkJCQkJCQlpZiAoYnVmZmVyQ29udGVudHMgPT0gbnVsbCkgY29udGludWU7CisJCQkJCQkJU3RyaW5nIGRvbUNVQ29udGVudHMgPSBkb21DVS5nZXRDb250ZW50cygpOworCQkJCQkJCVN0cmluZyBjdUNvbnRlbnRzID0gbnVsbDsKKwkJCQkJCQlpZiAoZG9tQ1VDb250ZW50cyAhPSBudWxsKSB7CisJCQkJCQkJCWN1Q29udGVudHMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLm5vcm1hbGl6ZUNScyhkb21DVS5nZXRDb250ZW50cygpLCBidWZmZXJDb250ZW50cyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gU2VlIFBSIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyODUKKwkJCQkJCQkJY3VDb250ZW50cyA9IGJ1ZmZlckNvbnRlbnRzOy8vJE5PTi1OTFMtMSQKKwkJCQkJCQl9CisJCQkJCQkJYnVmZmVyLnNldENvbnRlbnRzKGN1Q29udGVudHMpOworCQkJCQkJCWN1LnNhdmUobnVsbCwgZmFsc2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gZGlzY2FyZCBlbXB0eSBvbGQgcGFja2FnZSAoaWYgc3RpbGwgZW1wdHkgYWZ0ZXIgdGhlIHJlbmFtZSkKKwkJaWYgKGlzTW92ZSgpKSB7CisJCQkvLyBkZWxldGUgcmVtYWluaW5nIGZpbGVzIGluIHRoaXMgcGFja2FnZSAoLmNsYXNzIGZpbGUgaW4gdGhlIGNhc2Ugd2hlcmUgUHJvaj1zcmM9YmluKQorCQkJSVJlc291cmNlW10gcmVtYWluZ0ZpbGVzID0gKChJQ29udGFpbmVyKXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkubWVtYmVycygpOworCQkJYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZW1haW5nRmlsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJUmVzb3VyY2UgZmlsZSA9IHJlbWFpbmdGaWxlc1tpXTsKKwkJCQlpZiAoZmlsZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCXRoaXMuZGVsZXRlUmVzb3VyY2UoZmlsZSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaXNFbXB0eSA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCWlmIChpc0VtcHR5KSB7CisJCQkJLy8gZGVsZXRlIHJlY3Vyc2l2ZWx5IGVtcHR5IGZvbGRlcnMKKwkJCQlkZWxldGVFbXB0eVBhY2thZ2VGcmFnbWVudChzb3VyY2UsIGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCS8vcmVnaXN0ZXIgdGhlIGNvcnJlY3QgY2hhbmdlIGRlbHRhcworCQlwcmVwYXJlRGVsdGFzKHNvdXJjZSwgbmV3RnJhZyk7CisJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGRvbSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGRvbSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5ET01fRVhDRVBUSU9OKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl0aHJvdyBlOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7CisJfQorfQorLyoqCisgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIDxjb2RlPmN1PC9jb2RlPiwgbW9kaWZ5aW5nIHRoZSB0eXBlIG5hbWUgYW5kL29yIHBhY2thZ2UKKyAqIGRlY2xhcmF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXcgc291cmNlCisgKi8KK3ByaXZhdGUgU3RyaW5nIHVwZGF0ZWRDb250ZW50KElDb21waWxhdGlvblVuaXQgY3UsIElQYWNrYWdlRnJhZ21lbnQgZGVzdCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVN0cmluZyBjdXJyUGFja2FnZU5hbWUgPSBjdS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOworCVN0cmluZyBkZXN0UGFja2FnZU5hbWUgPSBkZXN0LmdldEVsZW1lbnROYW1lKCk7CisJaWYgKGN1cnJQYWNrYWdlTmFtZS5lcXVhbHMoZGVzdFBhY2thZ2VOYW1lKSAmJiBuZXdOYW1lID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7IC8vbm90aGluZyB0byBjaGFuZ2UKKwl9IGVsc2UgeworCQlTdHJpbmcgdHlwZU5hbWUgPSBjdS5nZXRFbGVtZW50TmFtZSgpOworCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5sZW5ndGgoKSAtIDUpOworCQlJRE9NQ29tcGlsYXRpb25Vbml0IGN1RE9NID0gbnVsbDsKKwkJSUJ1ZmZlciBidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJY2hhcltdIGNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJaWYgKGNvbnRlbnRzID09IG51bGwpIHJldHVybiBudWxsOworCQljdURPTSA9IGZGYWN0b3J5LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb250ZW50cywgdHlwZU5hbWUpOworCQl1cGRhdGVUeXBlTmFtZShjdSwgY3VET00sIGN1LmdldEVsZW1lbnROYW1lKCksIG5ld05hbWUpOworCQl1cGRhdGVQYWNrYWdlU3RhdGVtZW50KGN1RE9NLCBkZXN0UGFja2FnZU5hbWUpOworCQlyZXR1cm4gY3VET00uZ2V0Q29udGVudHMoKTsKKwl9Cit9CisvKioKKyAqIE1ha2VzIHN1cmUgdGhhdCA8Y29kZT5jdTwvY29kZT4gZGVjbGFyZXMgdG8gYmUgaW4gdGhlIDxjb2RlPnBrZ05hbWU8L2NvZGU+IHBhY2thZ2UuCisgKi8KK3ByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlU3RhdGVtZW50KElET01Db21waWxhdGlvblVuaXQgZG9tQ1UsIFN0cmluZyBwa2dOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlib29sZWFuIGRlZmF1bHRQYWNrYWdlID0gcGtnTmFtZS5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7CisJYm9vbGVhbiBzZWVuUGFja2FnZU5vZGUgPSBmYWxzZTsKKwlFbnVtZXJhdGlvbiBlbnVtID0gZG9tQ1UuZ2V0Q2hpbGRyZW4oKTsKKwl3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBlbnVtLm5leHRFbGVtZW50KCk7CisJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuUEFDS0FHRSkgeworCQkJaWYgKCEgZGVmYXVsdFBhY2thZ2UpIHsKKwkJCQlub2RlLnNldE5hbWUocGtnTmFtZSk7CisJCQl9IGVsc2UgeworCQkJCW5vZGUucmVtb3ZlKCk7CisJCQl9CisJCQlzZWVuUGFja2FnZU5vZGUgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzZWVuUGFja2FnZU5vZGUgJiYgIWRlZmF1bHRQYWNrYWdlKSB7CisJCS8vdGhlIGN1IHdhcyBpbiBhIGRlZmF1bHQgcGFja2FnZS4uLm5vIHBhY2thZ2UgZGVjbGFyYXRpb24KKwkJLy9jcmVhdGUgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY3UKKwkJSURPTVBhY2thZ2UgcGtnID0gZkZhY3RvcnkuY3JlYXRlUGFja2FnZSgicGFja2FnZSAiICsgcGtnTmFtZSArICI7IiArIFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IGRvbUNVLmdldEZpcnN0Q2hpbGQoKTsKKwkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkgeworCQkJZmlyc3RDaGlsZC5pbnNlcnRTaWJsaW5nKHBrZyk7CisJCX0gLy8gZWxzZSB0aGUgY3Ugd2FzIGVtcHR5OiBsZWF2ZSBpdCBlbXB0eQorCX0KK30KKwkvKioKKwkgKiBSZW5hbWVzIHRoZSBtYWluIHR5cGUgaW4gPGNvZGU+Y3U8L2NvZGU+LgorCSAqLworCXByaXZhdGUgdm9pZCB1cGRhdGVUeXBlTmFtZShJQ29tcGlsYXRpb25Vbml0IGN1LCBJRE9NQ29tcGlsYXRpb25Vbml0IGRvbUNVLCBTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7CisJCQlpZiAoZlJlbmFtZWRDb21waWxhdGlvblVuaXRzID09IG51bGwpIHsKKwkJCQlmUmVuYW1lZENvbXBpbGF0aW9uVW5pdHM9IG5ldyBBcnJheUxpc3QoMSk7CisJCQl9CisJCQlmUmVuYW1lZENvbXBpbGF0aW9uVW5pdHMuYWRkKGN1KTsKKwkJCVN0cmluZyBvbGRUeXBlTmFtZT0gb2xkTmFtZS5zdWJzdHJpbmcoMCwgb2xkTmFtZS5sZW5ndGgoKSAtIDUpOworCQkJU3RyaW5nIG5ld1R5cGVOYW1lPSBuZXdOYW1lLnN1YnN0cmluZygwLCBuZXdOYW1lLmxlbmd0aCgpIC0gNSk7CisJCQkvLyB1cGRhdGUgbWFpbiB0eXBlIG5hbWUKKwkJCUlUeXBlW10gdHlwZXMgPSBjdS5nZXRUeXBlcygpOworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0eXBlc1tpXTsKKwkJCQlpZiAoY3VycmVudFR5cGUuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMob2xkVHlwZU5hbWUpKSB7CisJCQkJCUlET01Ob2RlIHR5cGVOb2RlID0gKChKYXZhRWxlbWVudCkgY3VycmVudFR5cGUpLmZpbmROb2RlKGRvbUNVKTsKKwkJCQkJaWYgKHR5cGVOb2RlICE9IG51bGwpIHsKKwkJCQkJCXR5cGVOb2RlLnNldE5hbWUobmV3VHlwZU5hbWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorLyoqCisgKiBQb3NzaWJsZSBmYWlsdXJlczoKKyAqIDx1bD4KKyAqICA8bGk+Tk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyAtIG5vIGVsZW1lbnRzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24KKyAqCTxsaT5JTkRFWF9PVVRfT0ZfQk9VTkRTIC0gdGhlIG51bWJlciBvZiByZW5hbWluZ3Mgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorICoJCWRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB3ZXJlIHN1cHBsaWVkLgorICogPC91bD4KKyAqLworcHJvdGVjdGVkIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gc3VwZXIudmVyaWZ5KCk7CisJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKGZSZW5hbWluZ3NMaXN0ICE9IG51bGwgJiYgZlJlbmFtaW5nc0xpc3QubGVuZ3RoICE9IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChlbGVtZW50ID09IG51bGwgfHwgIWVsZW1lbnQuZXhpc3RzKCkpCisJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgZWxlbWVudCk7CisJCQorCWlmIChlbGVtZW50LmlzUmVhZE9ubHkoKSAmJiAoaXNSZW5hbWUoKSB8fCBpc01vdmUoKSkpCisJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCBlbGVtZW50KTsKKworCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKKworCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQlpZiAoaXNNb3ZlKCkgJiYgKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpCisJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisJfSBlbHNlIGlmIChlbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgeworCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisJfQorCQorCUphdmFFbGVtZW50IGRlc3QgPSAoSmF2YUVsZW1lbnQpIGdldERlc3RpbmF0aW9uUGFyZW50KGVsZW1lbnQpOworCXZlcmlmeURlc3RpbmF0aW9uKGVsZW1lbnQsIGRlc3QpOworCWlmIChmUmVuYW1pbmdzICE9IG51bGwpIHsKKwkJdmVyaWZ5UmVuYW1pbmcoZWxlbWVudCk7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdjNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiA8cD5UaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgY29tcGlsYXRpb24gdW5pdCAoQ1UpLgorICogSWYgdGhlIENVIGRvZXNuJ3QgZXhpc3QgeWV0LCBhIG5ldyBjb21waWxhdGlvbiB1bml0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBjb250ZW50IHByb3ZpZGVkLgorICogT3RoZXJ3aXNlIHRoZSBvcGVyYXRpb24gd2lsbCBvdmVycmlkZSB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgQ1Ugd2l0aCB0aGUgbmV3IGNvbnRlbnQuCisgKgorICogPHA+Tm90ZTogSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgQ1UgYXV0b21hdGljYWxseSB3aGVuIGNyZWF0aW5nIGEKKyAqIGNsYXNzIG9yIGludGVyZmFjZS4gVGh1cywgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgY3JlYXRpbmcgYSBDVSBpcworICogdG8gcGVyZm9ybSBhIGNyZWF0ZSB0eXBlIG9wZXJhdGlvbiByYXRoZXIgdGhhbgorICogZmlyc3QgY3JlYXRpbmcgYSBDVSBhbmQgc2Vjb25kbHkgY3JlYXRpbmcgYSB0eXBlIGluc2lkZSB0aGUgQ1UuCisgKgorICogPHA+UmVxdWlyZWQgQXR0cmlidXRlczo8dWw+CisgKiAgPGxpPlRoZSBwYWNrYWdlIGZyYWdtZW50IGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgY29tcGlsYXRpb24gdW5pdC4KKyAqICA8bGk+VGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICAKKyAqICAgICAgRG8gbm90IGluY2x1ZGUgdGhlIDxjb2RlPiIuamF2YSI8L2NvZGU+IHN1ZmZpeCAoZXguIDxjb2RlPiJPYmplY3QiPC9jb2RlPiAtCisgKiAJCXRoZSA8Y29kZT4iLmphdmEiPC9jb2RlPiB3aWxsIGJlIGFkZGVkIGZvciB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4pCisgKiAgPGxpPgorICAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBDcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYmVpbmcgY3JlYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lOworCS8qKgorCSAqIFRoZSBzb3VyY2UgY29kZSB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZTb3VyY2U9IG51bGw7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGEgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogVGhlIG5hbWUgc2hvdWxkIGhhdmUgdGhlICIuamF2YSIgc3VmZml4LgorICovCitwdWJsaWMgQ3JlYXRlQ29tcGlsYXRpb25Vbml0T3BlcmF0aW9uKElQYWNrYWdlRnJhZ21lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZm9yY2UpIHsKKwlzdXBlcihudWxsLCBuZXcgSUphdmFFbGVtZW50W10ge3BhcmVudEVsZW1lbnR9LCBmb3JjZSk7CisJZk5hbWUgPSBuYW1lOworCWZTb3VyY2UgPSBzb3VyY2U7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBjb21waWxhdGlvbiB1bml0LgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0cnkgeworCQliZWdpblRhc2soVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlVW5pdFByb2dyZXNzIiksIDIpOyAvLyROT04tTkxTLTEkCisJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7CisJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOworCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBnZXRQYXJlbnRFbGVtZW50KCk7CisJCUlDb250YWluZXIgZm9sZGVyID0gKElDb250YWluZXIpIHBrZy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJd29ya2VkKDEpOworCQlJRmlsZSBjb21waWxhdGlvblVuaXRGaWxlID0gZm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZk5hbWUpKTsKKwkJaWYgKGNvbXBpbGF0aW9uVW5pdEZpbGUuZXhpc3RzKCkpIHsKKwkJCS8vIHVwZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIHVuaXQgaWYgZkZvcmNlIGlzIHRydWUKKwkJCWlmIChmRm9yY2UpIHsKKwkJCQlJQnVmZmVyIGJ1ZmZlciA9IHVuaXQuZ2V0QnVmZmVyKCk7CisJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm47CisJCQkJYnVmZmVyLnNldENvbnRlbnRzKGZTb3VyY2UpOworCQkJCXVuaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBmYWxzZSk7CisJCQkJZlJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHt1bml0fTsKKwkJCQlpZiAodW5pdC5nZXRQYXJlbnQoKS5leGlzdHMoKSkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZXN1bHRFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJZGVsdGEuY2hhbmdlZChmUmVzdWx0RWxlbWVudHNbaV0sIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7CisJCQkJCX0KKwkJCQkJYWRkRGVsdGEoZGVsdGEpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGluZyA9PSBudWxsID8gZlNvdXJjZS5nZXRCeXRlcygpIDogZlNvdXJjZS5nZXRCeXRlcyhlbmNvZGluZykpOworCQkJCWNyZWF0ZUZpbGUoZm9sZGVyLCB1bml0LmdldEVsZW1lbnROYW1lKCksIHN0cmVhbSwgZmFsc2UpOworCQkJCWZSZXN1bHRFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dW5pdH07CisJCQkJaWYgKHVuaXQuZ2V0UGFyZW50KCkuZXhpc3RzKCkpIHsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVzdWx0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWRlbHRhLmFkZGVkKGZSZXN1bHRFbGVtZW50c1tpXSk7CisJCQkJCX0KKwkJCQkJYWRkRGVsdGEoZGVsdGEpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJCX0KKwkJfSAKKwkJd29ya2VkKDEpOworCX0gZmluYWxseSB7CisJCWRvbmUoKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0Q29tcGlsYXRpb25Vbml0KCkKKyAqLworcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgeworCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXQoZk5hbWUpOworfQorLyoqCisgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gdGhlIHBhY2thZ2UgZnJhZ21lbnQgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiBpcworICogCQk8Y29kZT5udWxsPC9jb2RlPi4KKyAqCTxsaT5JTlZBTElEX05BTUUgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBuYW1lIHByb3ZpZGVkIHRvIHRoZSBvcGVyYXRpb24gCisgKiAJCWlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGhhcyBhbiBpbnZhbGlkIHN5bnRheAorICogIDxsaT5JTlZBTElEX0NPTlRFTlRTIC0gdGhlIHNvdXJjZSBzcGVjaWZpZWQgZm9yIHRoZSBjb21waWxpYXRpb24gdW5pdCBpcyBudWxsCisgKiA8L3VsPgorICovCitwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJaWYgKGdldFBhcmVudEVsZW1lbnQoKSA9PSBudWxsKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyk7CisJfQorCWlmIChKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKGZOYW1lKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX05BTUUsIGZOYW1lKTsKKwl9CisJaWYgKGZTb3VyY2UgPT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ09OVEVOVFMpOworCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMmRkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tLkRPTU5vZGU7CisKKy8qKgorICogPHA+VGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIGJlaGF2aW9yIGNvbW1vbiB0byA8Y29kZT5DcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbnM8L2NvZGU+LgorICogVG8gY3JlYXRlIGEgY29tcGlsYXRpb24gdW5pdCwgb3IgYW4gZWxlbWVudCBjb250YWluZWQgaW4gYSBjb21waWxhdGlvbiB1bml0LCB0aGUKKyAqIHNvdXJjZSBjb2RlIGZvciB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQgaXMgdXBkYXRlZCBhbmQgc2F2ZWQuCisgKgorICogPHA+VGhlIGVsZW1lbnQgYmVpbmcgY3JlYXRlZCBjYW4gYmUgcG9zaXRpb25lZCByZWxhdGl2ZSB0byBhbiBleGlzdGluZworICogZWxlbWVudCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCB2aWEgdGhlIG1ldGhvZHMgPGNvZGU+I2NyZWF0ZUFmdGVyPC9jb2RlPgorICogYW5kIDxjb2RlPiNjcmVhdGVCZWZvcmU8L2NvZGU+LiBCeSBkZWZhdWx0LCB0aGUgbmV3IGVsZW1lbnQgaXMgcG9zaXRpb25lZAorICogYXMgdGhlIGxhc3QgY2hpbGQgb2YgaXRzIHBhcmVudCBlbGVtZW50LgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKKwkvKioKKwkgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBET00gdXNlZCBmb3IgdGhpcyBvcGVyYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgSURPTUNvbXBpbGF0aW9uVW5pdCBmQ1VET007CisJLyoqCisJICogQSBjb25zdGFudCBtZWFuaW5nIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudAorCSAqIGFzIHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBJTlNFUlRfTEFTVCA9IDE7CisJLyoqCisJICogQSBjb25zdGFudCBtZWFuaW5nIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudAorCSAqIGFmdGVyIHRoZSBlbGVtZW50IGRlZmluZWQgYnkgPGNvZGU+ZkFuY2hvckVsZW1lbnQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOU0VSVF9BRlRFUiA9IDI7CisKKwkvKioKKwkgKiBBIGNvbnN0YW50IG1lYW5pbmcgdG8gcG9zaXRpb24gdGhlIG5ldyBlbGVtZW50CisJICogYmVmb3JlIHRoZSBlbGVtZW50IGRlZmluZWQgYnkgPGNvZGU+ZkFuY2hvckVsZW1lbnQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOU0VSVF9CRUZPUkUgPSAzOworCS8qKgorCSAqIE9uZSBvZiB0aGUgcG9zaXRpb24gY29uc3RhbnRzLCBkZXNjcmliaW5nIHdoZXJlCisJICogdG8gcG9zaXRpb24gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZJbnNlcnRpb25Qb2xpY3kgPSBJTlNFUlRfTEFTVDsKKwkvKioKKwkgKiBUaGUgZWxlbWVudCB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgaXMKKwkgKiBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvLCBhcyBkZXNjcmliZWQgYnkKKwkgKiA8Y29kZT5mSW5zZXJ0UG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgd2lsbCBiZSBwb3NpdGlvbmVkCisJICogbGFzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGZBbmNob3JFbGVtZW50ID0gbnVsbDsKKwkvKioKKwkgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGNyZWF0aW9uIG9mIGEgbmV3IGVsZW1lbnQgb2NjdXJyZWQuCisJICogQSByZXF1ZXN0IGZvciBjcmVhdGluZyBhIGR1cGxpY2F0ZSBlbGVtZW50IHdvdWxkIHJlcXVlc3QgaW4gdGhpcworCSAqIGZsYWcgYmVpbmcgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gRW5zdXJlcyB0aGF0IG5vIGRlbHRhcyBhcmUgZ2VuZXJhdGVkCisJICogd2hlbiBjcmVhdGlvbiBkb2VzIG5vdCBvY2N1ci4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmQ3JlYXRpb25PY2N1cnJlZCA9IHRydWU7CisJLyoqCisJICogVGhlIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBET01Ob2RlIGZDcmVhdGVkRWxlbWVudDsKKwkvKioKKwkgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBpbnQgZkluc2VydGlvblBvc2l0aW9uID0gLTE7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSBuZXcgZWxlbWVudCByZXBsYWNlcywKKwkgKiBvciAwIGlmIHRoZSBuZXcgZWxlbWVudCBpcyBpbnNlcnRlZCwKKwkgKiBvciAtMSBpZiB0aGUgbmV3IGVsZW1lbnQgaXMgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIENVLgorCSAqLworCXByb3RlY3RlZCBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoID0gLTE7CisvKioKKyAqIENvbnN0cnVjdHMgYW4gb3BlcmF0aW9uIHRoYXQgY3JlYXRlcyBhIEphdmEgTGFuZ3VhZ2UgRWxlbWVudCB3aXRoCisgKiB0aGUgc3BlY2lmaWVkIHBhcmVudCwgY29udGFpbmVkIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbihJSmF2YUVsZW1lbnQgcGFyZW50RWxlbWVudCkgeworCXN1cGVyKG51bGwsIG5ldyBJSmF2YUVsZW1lbnRbXXtwYXJlbnRFbGVtZW50fSk7CisJaW5pdGlhbGl6ZURlZmF1bHRQb3NpdGlvbigpOworfQorLyoqCisgKiBPbmx5IGFsbG93IGNhbmNlbGxpbmcgaWYgdGhpcyBvcGVyYXRpb24gaXMgbm90IG5lc3RlZC4KKyAqLworcHJvdGVjdGVkIHZvaWQgY2hlY2tDYW5jZWxlZCgpIHsKKwlpZiAoIWZOZXN0ZWQpIHsKKwkJc3VwZXIuY2hlY2tDYW5jZWxlZCgpOworCX0KK30KKy8qKgorICogSW5zdHJ1Y3RzIHRoaXMgb3BlcmF0aW9uIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudCBhZnRlcgorICogdGhlIGdpdmVuIHNpYmxpbmcsIG9yIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQgYXMgdGhlIGxhc3QgY2hpbGQKKyAqIG9mIGl0cyBwYXJlbnQgaWYgPGNvZGU+bnVsbDwvY29kZT4uCisgKi8KK3B1YmxpYyB2b2lkIGNyZWF0ZUFmdGVyKElKYXZhRWxlbWVudCBzaWJsaW5nKSB7CisJc2V0UmVsYXRpdmVQb3NpdGlvbihzaWJsaW5nLCBJTlNFUlRfQUZURVIpOworfQorLyoqCisgKiBJbnN0cnVjdHMgdGhpcyBvcGVyYXRpb24gdG8gcG9zaXRpb24gdGhlIG5ldyBlbGVtZW50IGJlZm9yZQorICogdGhlIGdpdmVuIHNpYmxpbmcsIG9yIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQgYXMgdGhlIGxhc3QgY2hpbGQKKyAqIG9mIGl0cyBwYXJlbnQgaWYgPGNvZGU+bnVsbDwvY29kZT4uCisgKi8KK3B1YmxpYyB2b2lkIGNyZWF0ZUJlZm9yZShJSmF2YUVsZW1lbnQgc2libGluZykgeworCXNldFJlbGF0aXZlUG9zaXRpb24oc2libGluZywgSU5TRVJUX0JFRk9SRSk7Cit9CisvKioKKyAqIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiAtIGdlbmVyYXRlIG5ldyBzb3VyY2UgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0CisgKiBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHVuYWJsZSB0byBjb21wbGV0ZQorICovCitwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJYmVnaW5UYXNrKGdldE1haW5UYXNrTmFtZSgpLCBnZXRNYWluQW1vdW50T2ZXb3JrKCkpOworCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3SmF2YUVsZW1lbnREZWx0YSgpOworCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKKwkJZ2VuZXJhdGVOZXdDb21waWxhdGlvblVuaXRET00odW5pdCk7CisJCWlmIChmQ3JlYXRpb25PY2N1cnJlZCkgeworCQkJLy9hIGNoYW5nZSBoYXMgcmVhbGx5IG9jY3VycmVkCisJCQlJQnVmZmVyIGJ1ZmZlciA9IHVuaXQuZ2V0QnVmZmVyKCk7CisJCQlpZiAoYnVmZmVyICA9PSBudWxsKSByZXR1cm47CisJCQljaGFyW10gYnVmZmVyQ29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQkJaWYgKGJ1ZmZlckNvbnRlbnRzID09IG51bGwpIHJldHVybjsKKwkJCWNoYXJbXSBlbGVtZW50Q29udGVudHMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLm5vcm1hbGl6ZUNScyhmQ3JlYXRlZEVsZW1lbnQuZ2V0Q2hhcmFjdGVycygpLCBidWZmZXJDb250ZW50cyk7CisJCQlzd2l0Y2ggKGZSZXBsYWNlbWVudExlbmd0aCkgeworCQkJCWNhc2UgLTEgOiAKKwkJCQkJLy8gZWxlbWVudCBpcyBhcHBlbmQgYXQgdGhlIGVuZAorCQkJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRDb250ZW50cyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMCA6CisJCQkJCS8vIGVsZW1lbnQgaXMgaW5zZXJ0ZWQKKwkJCQkJYnVmZmVyLnJlcGxhY2UoZkluc2VydGlvblBvc2l0aW9uLCAwLCBlbGVtZW50Q29udGVudHMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJLy8gZWxlbWVudCBpcyByZXBsYWNpbmcgdGhlIHByZXZpb3VzIG9uZQorCQkJCQlidWZmZXIucmVwbGFjZShmSW5zZXJ0aW9uUG9zaXRpb24sIGZSZXBsYWNlbWVudExlbmd0aCwgZWxlbWVudENvbnRlbnRzKTsKKwkJCX0KKwkJCXVuaXQuc2F2ZShudWxsLCBmYWxzZSk7CisJCQlib29sZWFuIGlzV29ya2luZ0NvcHkgPSB1bml0LmlzV29ya2luZ0NvcHkoKTsKKwkJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9ICFpc1dvcmtpbmdDb3B5OworCQkJd29ya2VkKDEpOworCQkJZlJlc3VsdEVsZW1lbnRzID0gZ2VuZXJhdGVSZXN1bHRIYW5kbGVzKCk7CisJCQlpZiAoIWlzV29ya2luZ0NvcHkpIHsgLy8gaWYgdW5pdCBpcyB3b3JraW5nIGNvcHksIHRoZW4gc2F2ZSB3aWxsIGhhdmUgYWxyZWFkeSBmaXJlZCB0aGUgZGVsdGEKKwkJCQlpZiAodW5pdC5nZXRQYXJlbnQoKS5leGlzdHMoKSkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZXN1bHRFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCQkJZGVsdGEuYWRkZWQoZlJlc3VsdEVsZW1lbnRzW2ldKTsKKwkJCQkJfQorCQkJCQlhZGREZWx0YShkZWx0YSk7CisJCQkJfSAvLyBlbHNlIHVuaXQgaXMgY3JlYXRlZCBvdXRzaWRlIGNsYXNzcGF0aAorCQkJCSAgLy8gbm9uLWphdmEgcmVzb3VyY2UgZGVsdGEgd2lsbCBiZSBub3RpZmllZCBieSBkZWx0YSBwcm9jZXNzb3IKKwkJCX0KKwkJfQorCX0gZmluYWxseSB7CisJCWRvbmUoKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgYSBKRE9NIGRvY3VtZW50IGZyYWdtZW50IGZvciB0aGUgZWxlbWVudCBiZWluZyBjcmVhdGVkLgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3QgSURPTU5vZGUgZ2VuZXJhdGVFbGVtZW50RE9NKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUmV0dXJucyB0aGUgRE9NIHdpdGggdGhlIG5ldyBzb3VyY2UgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4KKyAqLworcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVOZXdDb21waWxhdGlvblVuaXRET00oSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJ1ZmZlciBidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKKwlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybjsKKwljaGFyW10gcHJldlNvdXJjZSA9IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7CisJaWYgKHByZXZTb3VyY2UgPT0gbnVsbCkgcmV0dXJuOworCisJLy8gY3JlYXRlIGEgSkRPTSBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQKKwlmQ1VET00gPSAobmV3IERPTUZhY3RvcnkoKSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHByZXZTb3VyY2UsIGN1LmdldEVsZW1lbnROYW1lKCkpOworCUlET01Ob2RlIGNoaWxkID0gZ2VuZXJhdGVFbGVtZW50RE9NKCk7CisJaWYgKGNoaWxkICE9IG51bGwpIHsKKwkJaW5zZXJ0RE9NTm9kZShmQ1VET00sIGNoaWxkKTsKKwl9CisJd29ya2VkKDEpOworfQorLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBoYW5kbGUgZm9yIHRoZSBlbGVtZW50IHRoaXMgb3BlcmF0aW9uIGNyZWF0ZWQuCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCBJSmF2YUVsZW1lbnQgZ2VuZXJhdGVSZXN1bHRIYW5kbGUoKTsKKy8qKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgaGFuZGxlcyBmb3IgdGhlIGVsZW1lbnRzIHRoaXMgb3BlcmF0aW9uIGNyZWF0ZWQuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBnZW5lcmF0ZVJlc3VsdEhhbmRsZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gbmV3IElKYXZhRWxlbWVudFtde2dlbmVyYXRlUmVzdWx0SGFuZGxlKCl9OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IGluIHdoaWNoIHRoZSBuZXcgZWxlbWVudCBpcyBiZWluZyBjcmVhdGVkLgorICovCitwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdEZvcihnZXRQYXJlbnRFbGVtZW50KCkpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygd29yayBmb3IgdGhlIG1haW4gdGFzayBvZiB0aGlzIG9wZXJhdGlvbiBmb3IKKyAqIHByb2dyZXNzIHJlcG9ydGluZy4KKyAqLworcHJvdGVjdGVkIGludCBnZXRNYWluQW1vdW50T2ZXb3JrKCl7CisJcmV0dXJuIDI7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1haW4gdGFzayBvZiB0aGlzIG9wZXJhdGlvbiBmb3IKKyAqIHByb2dyZXNzIHJlcG9ydGluZy4KKyAqLworcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNYWluVGFza05hbWUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgZWxlbWVudHMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGdldFJlc3VsdEVsZW1lbnRzKCkgeworCXJldHVybiBmUmVzdWx0RWxlbWVudHM7Cit9CisvKioKKyAqIFNldHMgdGhlIGRlZmF1bHQgcG9zaXRpb24gaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBuZXcgdHlwZQorICogbWVtYmVyLiBCeSBkZWZhdWx0LCB0aGUgbmV3IGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhcyB0aGUKKyAqIGxhc3QgY2hpbGQgb2YgdGhlIHBhcmVudCBlbGVtZW50IGluIHdoaWNoIGl0IGlzIGNyZWF0ZWQuCisgKiBPcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBhIGRpZmZlcmVudCBkZWZhdWx0IHBvc2l0aW9uIG11c3QKKyAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICovCitwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBvc2l0aW9uKCkgeworCit9CisvKioKKyAqIEluc2VydHMgdGhlIGdpdmVuIGNoaWxkIGludG8gdGhlIGdpdmVuIEpET00sIAorICogYmFzZWQgb24gdGhlIHBvc2l0aW9uIHNldHRpbmdzIG9mIHRoaXMgb3BlcmF0aW9uLgorICoKKyAqIEBzZWUgY3JlYXRlQWZ0ZXIoSUphdmFFbGVtZW50KQorICogQHNlZSBjcmVhdGVCZWZvcmUoSUphdmFFbGVtZW50KTsKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RE9NTm9kZShJRE9NTm9kZSBwYXJlbnQsIElET01Ob2RlIGNoaWxkKSB7CisJaWYgKGZJbnNlcnRpb25Qb2xpY3kgIT0gSU5TRVJUX0xBU1QpIHsKKwkJSURPTU5vZGUgc2libGluZyA9ICgoSmF2YUVsZW1lbnQpZkFuY2hvckVsZW1lbnQpLmZpbmROb2RlKGZDVURPTSk7CisJCWlmIChzaWJsaW5nICE9IG51bGwgJiYgZkluc2VydGlvblBvbGljeSA9PSBJTlNFUlRfQUZURVIpIHsKKwkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHROb2RlKCk7CisJCX0KKwkJaWYgKHNpYmxpbmcgIT0gbnVsbCkgeworCQkJc2libGluZy5pbnNlcnRTaWJsaW5nKGNoaWxkKTsKKwkJCWZDcmVhdGVkRWxlbWVudCA9IChET01Ob2RlKWNoaWxkOworCQkJZkluc2VydGlvblBvc2l0aW9uID0gKChET01Ob2RlKXNpYmxpbmcpLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCWZSZXBsYWNlbWVudExlbmd0aCA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLy9hZGQgYXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50CisJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKKwlmQ3JlYXRlZEVsZW1lbnQgPSAoRE9NTm9kZSljaGlsZDsKKwlET01Ob2RlIGxhc3RDaGlsZCA9IChET01Ob2RlKWZDcmVhdGVkRWxlbWVudC5nZXRQcmV2aW91c05vZGUoKTsKKwlmSW5zZXJ0aW9uUG9zaXRpb24gPSAoKERPTU5vZGUpcGFyZW50KS5nZXRJbnNlcnRpb25Qb3NpdGlvbigpOworLy8JZkluc2VydGlvblBvc2l0aW9uID0gbGFzdENoaWxkID09IG51bGwgPyAoKERPTU5vZGUpcGFyZW50KS5nZXRJbnNlcnRpb25Qb3NpdGlvbigpIDogbGFzdENoaWxkLmdldEluc2VydGlvblBvc2l0aW9uKCk7CisJZlJlcGxhY2VtZW50TGVuZ3RoID0gcGFyZW50LmdldFBhcmVudCgpID09IG51bGwgPyAtMSA6IDA7Cit9CisvKioKKyAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPkRPTU5vZGU8L2NvZGU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgKiBjcmVhdGUgdGhpcyBuZXcgZWxlbWVudC4KKyAqIFVzZWQgYnkgdGhlIDxjb2RlPkNvcHlFbGVtZW50c09wZXJhdGlvbjwvY29kZT4gZm9yIHJlbmFtaW5nLgorICogT25seSB1c2VkIGZvciA8Y29kZT5DcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uPC9jb2RlPgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRBbHRlcmVkTmFtZShTdHJpbmcgbmV3TmFtZSkgeworfQorLyoqCisgKiBJbnN0cnVjdHMgdGhpcyBvcGVyYXRpb24gdG8gcG9zaXRpb24gdGhlIG5ldyBlbGVtZW50IHJlbGF0aXZlCisgKiB0byB0aGUgZ2l2ZW4gc2libGluZywgb3IgdG8gYWRkIHRoZSBuZXcgZWxlbWVudCBhcyB0aGUgbGFzdCBjaGlsZAorICogb2YgaXRzIHBhcmVudCBpZiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIDxjb2RlPnBvc2l0aW9uPC9jb2RlPgorICogbXVzdCBiZSBvbmUgb2YgdGhlIHBvc2l0aW9uIGNvbnN0YW50cy4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0UmVsYXRpdmVQb3NpdGlvbihJSmF2YUVsZW1lbnQgc2libGluZywgaW50IHBvbGljeSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHNpYmxpbmcgPT0gbnVsbCkgeworCQlmQW5jaG9yRWxlbWVudCA9IG51bGw7CisJCWZJbnNlcnRpb25Qb2xpY3kgPSBJTlNFUlRfTEFTVDsKKwl9IGVsc2UgeworCQlmQW5jaG9yRWxlbWVudCA9IHNpYmxpbmc7CisJCWZJbnNlcnRpb25Qb2xpY3kgPSBwb2xpY3k7CisJfQorfQorLyoqCisgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gdGhlIGNvbXBpbGF0aW9uIHVuaXQgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiBpcworICogCQk8Y29kZT5udWxsPC9jb2RlPi4KKyAqICA8bGk+SU5WQUxJRF9OQU1FIC0gbm8gbmFtZSwgYSBuYW1lIHdhcyBudWxsIG9yIG5vdCBhIHZhbGlkCisgKiAJCWltcG9ydCBkZWNsYXJhdGlvbiBuYW1lLgorICogIDxsaT5JTlZBTElEX1NJQkxJTkcgLSB0aGUgc2libGluZyBwcm92aWRlZCBmb3IgcG9zaXRpb25pbmcgaXMgbm90IHZhbGlkLgorICogPC91bD4KKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworICogQHNlZSBKYXZhQ29udmVudGlvbnMKKyAqLworcHVibGljIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCWlmIChnZXRQYXJlbnRFbGVtZW50KCkgPT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOworCX0KKwlpZiAoZkFuY2hvckVsZW1lbnQgIT0gbnVsbCkgeworCQlJSmF2YUVsZW1lbnQgZG9tUHJlc2VudFBhcmVudCA9IGZBbmNob3JFbGVtZW50LmdldFBhcmVudCgpOworCQlpZiAoZG9tUHJlc2VudFBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5JTVBPUlRfQ09OVEFJTkVSKSB7CisJCQlkb21QcmVzZW50UGFyZW50ID0gZG9tUHJlc2VudFBhcmVudC5nZXRQYXJlbnQoKTsKKwkJfQorCQlpZiAoIWRvbVByZXNlbnRQYXJlbnQuZXF1YWxzKGdldFBhcmVudEVsZW1lbnQoKSkpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9TSUJMSU5HLCBmQW5jaG9yRWxlbWVudCk7CisJCX0KKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUZpZWxkT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVGaWVsZE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTNjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVGaWVsZE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01GaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworCisvKioKKyAqIDxwPlRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBmaWVsZCBkZWNsYXJhdGlvbiBpbiBhIHR5cGUuCisgKgorICogPHA+UmVxdWlyZWQgQXR0cmlidXRlczo8dWw+CisgKiAgPGxpPkNvbnRhaW5pbmcgVHlwZQorICogIDxsaT5UaGUgc291cmNlIGNvZGUgZm9yIHRoZSBkZWNsYXJhdGlvbi4gTm8gdmVyaWZpY2F0aW9uIG9mIHRoZSBzb3VyY2UgaXMKKyAqICAgICAgcGVyZm9ybWVkLgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIENyZWF0ZUZpZWxkT3BlcmF0aW9uIGV4dGVuZHMgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbiB7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGEgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICogaW4gdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZS4KKyAqCisgKiA8cD5CeSBkZWZhdWx0IHRoZSBuZXcgZmllbGQgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBleGlzdGluZyBmaWVsZAorICogZGVjbGFyYXRpb24sIG9yIGFzIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIHR5cGUgaWYgdGhlcmUgYXJlIG5vCisgKiBmaWVsZCBkZWNsYXJhdGlvbnMuCisgKi8KK3B1YmxpYyBDcmVhdGVGaWVsZE9wZXJhdGlvbihJVHlwZSBwYXJlbnRFbGVtZW50LCBTdHJpbmcgc291cmNlLCBib29sZWFuIGZvcmNlKSB7CisJc3VwZXIocGFyZW50RWxlbWVudCwgc291cmNlLCBmb3JjZSk7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbiNnZW5lcmF0ZUVsZW1lbnRET00KKyAqLworcHJvdGVjdGVkIElET01Ob2RlIGdlbmVyYXRlRWxlbWVudERPTSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChmRE9NTm9kZSA9PSBudWxsKSB7CisJCWZET01Ob2RlID0gKG5ldyBET01GYWN0b3J5KCkpLmNyZWF0ZUZpZWxkKGZTb3VyY2UpOworCQlpZiAoZkRPTU5vZGUgPT0gbnVsbCkgeworCQkJZkRPTU5vZGUgPSBnZW5lcmF0ZVN5bnRheEluY29ycmVjdERPTSgpOworCQl9CisJCWlmIChmQWx0ZXJlZE5hbWUgIT0gbnVsbCAmJiBmRE9NTm9kZSAhPSBudWxsKSB7CisJCQlmRE9NTm9kZS5zZXROYW1lKGZBbHRlcmVkTmFtZSk7CisJCX0KKwl9CisJaWYgKCEoZkRPTU5vZGUgaW5zdGFuY2VvZiBJRE9NRmllbGQpKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gZkRPTU5vZGU7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2VuZXJhdGVSZXN1bHRIYW5kbGUKKyAqLworcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZW5lcmF0ZVJlc3VsdEhhbmRsZSgpIHsKKwlyZXR1cm4gZ2V0VHlwZSgpLmdldEZpZWxkKGZET01Ob2RlLmdldE5hbWUoKSk7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsKKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlRmllbGRQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIEJ5IGRlZmF1bHQgdGhlIG5ldyBmaWVsZCBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBsYXN0IGV4aXN0aW5nIGZpZWxkCisgKiBkZWNsYXJhdGlvbiwgb3IgYXMgdGhlIGZpcnN0IG1lbWJlciBpbiB0aGUgdHlwZSBpZiB0aGVyZSBhcmUgbm8KKyAqIGZpZWxkIGRlY2xhcmF0aW9ucy4KKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQb3NpdGlvbigpIHsKKwlJVHlwZSBwYXJlbnRFbGVtZW50ID0gZ2V0VHlwZSgpOworCXRyeSB7CisJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gcGFyZW50RWxlbWVudC5nZXRGaWVsZHMoKTsKKwkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgeworCQkJY3JlYXRlQWZ0ZXIoZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0pOworCQl9IGVsc2UgeworCQkJZWxlbWVudHMgPSBwYXJlbnRFbGVtZW50LmdldENoaWxkcmVuKCk7CisJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7CisJCQkJY3JlYXRlQmVmb3JlKGVsZW1lbnRzWzBdKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorfQorLyoqCisgKiBAc2VlIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24jdmVyaWZ5TmFtZUNvbGxpc2lvbgorICovCitwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnlOYW1lQ29sbGlzaW9uKCkgeworCUlUeXBlIHR5cGU9IGdldFR5cGUoKTsKKwlpZiAodHlwZS5nZXRGaWVsZChmRE9NTm9kZS5nZXROYW1lKCkpLmV4aXN0cygpKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOworCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW1wb3J0T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzI4NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW1wb3J0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01JbXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKKworLyoqCisgKiA8cD5UaGlzIG9wZXJhdGlvbiBhZGRzIGFuIGltcG9ydCBkZWNsYXJhdGlvbiB0byBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0LgorICogSWYgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYWxyZWFkeSBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkIGltcG9ydCBkZWNsYXJhdGlvbiwKKyAqIHRoZSBpbXBvcnQgaXMgbm90IGdlbmVyYXRlZCAoaXQgZG9lcyBub3QgZ2VuZXJhdGUgZHVwbGljYXRlcykuCisgKiBOb3RlIHRoYXQgaXQgaXMgdmFsaWQgdG8gc3BlY2lmeSBib3RoIGEgc2luZ2xlLXR5cGUgaW1wb3J0IGFuZCBhbiBvbi1kZW1hbmQgaW1wb3J0CisgKiBmb3IgdGhlIHNhbWUgcGFja2FnZSwgZm9yIGV4YW1wbGUgPGNvZGU+ImphdmEuaW8uRmlsZSI8L2NvZGU+IGFuZAorICogPGNvZGU+ImphdmEuaW8uKiI8L2NvZGU+LCBpbiB3aGljaCBjYXNlIGJvdGggYXJlIHByZXNlcnZlZCBzaW5jZSB0aGUgc2VtYW50aWNzCisgKiBvZiB0aGlzIGFyZSBub3QgdGhlIHNhbWUgYXMganVzdCBpbXBvcnRpbmcgPGNvZGU+ImphdmEuaW8uKiI8L2NvZGU+LgorICogSW1wb3J0aW5nIDxjb2RlPiJqYXZhLmxhbmcuKiI8L2NvZGU+LCBvciB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgY29tcGlsYXRpb24gdW5pdAorICogaXMgZGVmaW5lZCwgYXJlIG5vdCB0cmVhdGVkIGFzIHNwZWNpYWwgY2FzZXMuICBJZiB0aGV5IGFyZSBzcGVjaWZpZWQsIHRoZXkgYXJlCisgKiBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgorICoKKyAqIDxwPlJlcXVpcmVkIEF0dHJpYnV0ZXM6PHVsPgorICogIDxsaT5Db21waWxhdGlvbiB1bml0CisgKiAgPGxpPkltcG9ydCBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGltcG9ydCB0byBhZGQgdG8gdGhlCisgKiAgICAgIGNvbXBpbGF0aW9uIHVuaXQuIEZvciBleGFtcGxlOiA8Y29kZT4iamF2YS5pby5GaWxlIjwvY29kZT4gb3IgPGNvZGU+ImphdmEuYXd0LioiPC9jb2RlPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIENyZWF0ZUltcG9ydE9wZXJhdGlvbiBleHRlbmRzIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uIHsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBpbXBvcnQgdG8gYmUgY3JlYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZJbXBvcnROYW1lOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCBhbiBpbXBvcnQgdG8gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBDcmVhdGVJbXBvcnRPcGVyYXRpb24oU3RyaW5nIGltcG9ydE5hbWUsIElDb21waWxhdGlvblVuaXQgcGFyZW50RWxlbWVudCkgeworCXN1cGVyKHBhcmVudEVsZW1lbnQpOworCWZJbXBvcnROYW1lID0gaW1wb3J0TmFtZTsKK30KKy8qKgorICogQHNlZSBDcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uI2dlbmVyYXRlRWxlbWVudERPTQorICovCitwcm90ZWN0ZWQgSURPTU5vZGUgZ2VuZXJhdGVFbGVtZW50RE9NKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGZDVURPTS5nZXRDaGlsZChmSW1wb3J0TmFtZSkgPT0gbnVsbCkgeworCQlET01GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOworCQkvL25vdCBhIGR1cGxpY2F0ZQorCQlJRE9NSW1wb3J0IGltcCA9IGZhY3RvcnkuY3JlYXRlSW1wb3J0KCk7CisJCWltcC5zZXROYW1lKGZJbXBvcnROYW1lKTsKKwkJcmV0dXJuIGltcDsKKwl9CisJCisJLy9ubyBuZXcgaW1wb3J0IHdhcyBnZW5lcmF0ZWQKKwlmQ3JlYXRpb25PY2N1cnJlZCA9IGZhbHNlOworCS8vYWxsIHRoZSB3b3JrIGhhcyBhbHJlYWR5IGJlZW4gZG9uZQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dlbmVyYXRlUmVzdWx0SGFuZGxlCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2VuZXJhdGVSZXN1bHRIYW5kbGUoKSB7CisJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdCgpLmdldEltcG9ydChmSW1wb3J0TmFtZSk7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jZ2V0TWFpblRhc2tOYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRNYWluVGFza05hbWUoKXsKKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlSW1wb3J0c1Byb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogU2V0cyB0aGUgY29ycmVjdCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBpbXBvcnQ6PHVsPgorICogPGxpPiBhZnRlciB0aGUgbGFzdCBpbXBvcnQKKyAqIDxsaT4gaWYgbm8gaW1wb3J0cywgYmVmb3JlIHRoZSBmaXJzdCB0eXBlCisgKiA8bGk+IGlmIG5vIHR5cGUsIGFmdGVyIHRoZSBwYWNrYWdlIHN0YXRlbWVudAorICogPGxpPiBhbmQgaWYgbm8gcGFja2FnZSBzdGF0ZW1lbnQgLSBmaXJzdCB0aGluZyBpbiB0aGUgQ1UKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQb3NpdGlvbigpIHsKKwl0cnkgeworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHMgPSBjdS5nZXRJbXBvcnRzKCk7CisJCWlmIChpbXBvcnRzLmxlbmd0aCA+IDApIHsKKwkJCWNyZWF0ZUFmdGVyKGltcG9ydHNbaW1wb3J0cy5sZW5ndGggLSAxXSk7CisJCQlyZXR1cm47CisJCX0KKwkJSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CisJCWlmICh0eXBlcy5sZW5ndGggPiAwKSB7CisJCQljcmVhdGVCZWZvcmUodHlwZXNbMF0pOworCQkJcmV0dXJuOworCQl9CisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gY3UuZ2V0Q2hpbGRyZW4oKTsKKwkJLy9sb29rIGZvciB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbgorCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoY2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgeworCQkJCWNyZWF0ZUFmdGVyKGNoaWxkcmVuW2ldKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJfQorfQorLyoqCisgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gdGhlIGNvbXBpbGF0aW9uIHVuaXQgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiBpcworICogCQk8Y29kZT5udWxsPC9jb2RlPi4KKyAqICA8bGk+SU5WQUxJRF9OQU1FIC0gbm90IGEgdmFsaWQgaW1wb3J0IGRlY2xhcmF0aW9uIG5hbWUuCisgKiA8L3VsPgorICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzCisgKiBAc2VlIEphdmFDb252ZW50aW9ucworICovCitwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUltcG9ydERlY2xhcmF0aW9uKGZJbXBvcnROYW1lKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX05BTUUsIGZJbXBvcnROYW1lKTsKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUluaXRpYWxpemVyT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWZlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CisKKy8qKgorICogPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIGluaXRpYWxpemVyIGluIGEgdHlwZS4KKyAqCisgKiA8cD5SZXF1aXJlZCBBdHRyaWJ1dGVzOjx1bD4KKyAqICA8bGk+Q29udGFpbmluZyBUeXBlCisgKiAgPGxpPlRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGluaXRpYWxpemVyLiBObyB2ZXJpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBpcworICogICAgICBwZXJmb3JtZWQuCisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24gZXh0ZW5kcyBDcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uIHsKKwkvKioKKwkgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgaW5pdGlhbGl6ZXJzIGluIHRoZSBwYXJlbnQgdHlwZS4KKwkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBoYW5kbGUgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgaW5pdGlhbGl6ZXIuCisJICovCisJcHJvdGVjdGVkIGludCBmTnVtYmVyT2ZJbml0aWFsaXplcnM9IDE7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGFuIGluaXRpYWxpemVyIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAqIGluIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UuCisgKgorICogPHA+QnkgZGVmYXVsdCB0aGUgbmV3IGluaXRpYWxpemVyIGlzIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIGxhc3QgZXhpc3RpbmcgaW5pdGlhbGl6ZXIKKyAqIGRlY2xhcmF0aW9uLCBvciBhcyB0aGUgZmlyc3QgbWVtYmVyIGluIHRoZSB0eXBlIGlmIHRoZXJlIGFyZSBubworICogaW5pdGlhbGl6ZXJzLgorICovCitwdWJsaWMgQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24oSVR5cGUgcGFyZW50RWxlbWVudCwgU3RyaW5nIHNvdXJjZSkgeworCXN1cGVyKHBhcmVudEVsZW1lbnQsIHNvdXJjZSwgZmFsc2UpOworfQorLyoqCisgKiBAc2VlIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24jZ2VuZXJhdGVFbGVtZW50RE9NCisgKi8KK3Byb3RlY3RlZCBJRE9NTm9kZSBnZW5lcmF0ZUVsZW1lbnRET00oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJRE9NSW5pdGlhbGl6ZXIgZG9tSW5pdGlhbGl6ZXIgPSAobmV3IERPTUZhY3RvcnkoKSkuY3JlYXRlSW5pdGlhbGl6ZXIoZlNvdXJjZSk7CisJaWYgKGRvbUluaXRpYWxpemVyID09IG51bGwpIHsKKwkJSURPTU5vZGUgbm9kZSA9IGdlbmVyYXRlU3ludGF4SW5jb3JyZWN0RE9NKCk7CisJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBJRE9NSW5pdGlhbGl6ZXIpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlkb21Jbml0aWFsaXplciA9IChJRE9NSW5pdGlhbGl6ZXIpIG5vZGU7CisJfQorCXJldHVybiBkb21Jbml0aWFsaXplcjsKK30KKy8qKgorICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZW5lcmF0ZVJlc3VsdEhhbmRsZQorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdlbmVyYXRlUmVzdWx0SGFuZGxlKCkgeworCXRyeSB7CisJCS8vdXBkYXRlIHRoZSBjaGlsZHJlbiB0byBiZSBjdXJyZW50CisJCWdldFR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKS5jbG9zZSgpOworCQlpZiAoZkFuY2hvckVsZW1lbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFR5cGUoKS5nZXRJbml0aWFsaXplcihmTnVtYmVyT2ZJbml0aWFsaXplcnMpOworCQl9IGVsc2UgeworCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRUeXBlKCkuZ2V0Q2hpbGRyZW4oKTsKKwkJCWludCBjb3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07CisJCQkJaWYgKGNoaWxkLmVxdWFscyhmQW5jaG9yRWxlbWVudCkpIHsKKwkJCQkJaWYgKGNoaWxkIC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5JTklUSUFMSVpFUiAmJiBmSW5zZXJ0aW9uUG9saWN5ID09IENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLklOU0VSVF9BRlRFUikgeworCQkJCQkJY291bnQrKzsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZ2V0VHlwZSgpLmdldEluaXRpYWxpemVyKGNvdW50KTsKKwkJCQl9IGVsc2UKKwkJCQkJaWYgKGNoaWxkLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LklOSVRJQUxJWkVSKSB7CisJCQkJCQljb3VudCsrOworCQkJCQl9CisJCQl9CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7CisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZUluaXRpYWxpemVyUHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBCeSBkZWZhdWx0IHRoZSBuZXcgaW5pdGlhbGl6ZXIgaXMgcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBleGlzdGluZyBpbml0aWFsaXplcgorICogZGVjbGFyYXRpb24sIG9yIGFzIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIHR5cGUgaWYgdGhlcmUgYXJlIG5vCisgKiBpbml0aWFsaXplcnMuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UG9zaXRpb24oKSB7CisJSVR5cGUgcGFyZW50RWxlbWVudCA9IGdldFR5cGUoKTsKKwl0cnkgeworCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IHBhcmVudEVsZW1lbnQuZ2V0SW5pdGlhbGl6ZXJzKCk7CisJCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKKwkJCWZOdW1iZXJPZkluaXRpYWxpemVycz0gZWxlbWVudHMubGVuZ3RoOworCQkJY3JlYXRlQWZ0ZXIoZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0pOworCQl9IGVsc2UgeworCQkJZWxlbWVudHMgPSBwYXJlbnRFbGVtZW50LmdldENoaWxkcmVuKCk7CisJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7CisJCQkJY3JlYXRlQmVmb3JlKGVsZW1lbnRzWzBdKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVNZXRob2RPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTBjNWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01NZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKKworLyoqCisgKiA8cD5UaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGFuIGluc3RhbmNlIG1ldGhvZC4gCisgKgorICogPHA+UmVxdWlyZWQgQXR0cmlidXRlczo8dWw+CisgKiAgPGxpPkNvbnRhaW5pbmcgdHlwZQorICogIDxsaT5UaGUgc291cmNlIGNvZGUgZm9yIHRoZSBtZXRob2QuIE5vIHZlcmlmaWNhdGlvbiBvZiB0aGUgc291cmNlIGlzCisgKiAgICAgIHBlcmZvcm1lZC4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBDcmVhdGVNZXRob2RPcGVyYXRpb24gZXh0ZW5kcyBDcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZlBhcmFtZXRlclR5cGVzOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNyZWF0ZSBhIG1ldGhvZAorICogaW4gdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZS4KKyAqLworcHVibGljIENyZWF0ZU1ldGhvZE9wZXJhdGlvbihJVHlwZSBwYXJlbnRFbGVtZW50LCBTdHJpbmcgc291cmNlLCBib29sZWFuIGZvcmNlKSB7CisJc3VwZXIocGFyZW50RWxlbWVudCwgc291cmNlLCBmb3JjZSk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlcyBvZiB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZQorICogY3VycmVudCA8Y29kZT5ET01NZXRob2Q8L2NvZGU+CisgKi8KK3Byb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0RE9NTWV0aG9kVHlwZXNUb1NpZ25hdHVyZXMoKSB7CisJaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7CisJCWlmIChmRE9NTm9kZSAhPSBudWxsKSB7CisJCQlTdHJpbmdbXSBkb21QYXJhbWV0ZXJUeXBlcyA9ICgoSURPTU1ldGhvZClmRE9NTm9kZSkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwkJCWlmIChkb21QYXJhbWV0ZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJZlBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1tkb21QYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOworCQkJCS8vIGNvbnZlcnQgdGhlIERPTSB0eXBlcyB0byBzaWduYXR1cmVzCisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IGZQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJCQlmUGFyYW1ldGVyVHlwZXNbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShkb21QYXJhbWV0ZXJUeXBlc1tpXS50b0NoYXJBcnJheSgpLCBmYWxzZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbiNnZW5lcmF0ZUVsZW1lbnRET00KKyAqLworcHJvdGVjdGVkIElET01Ob2RlIGdlbmVyYXRlRWxlbWVudERPTSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChmRE9NTm9kZSA9PSBudWxsKSB7CisJCWZET01Ob2RlID0gKG5ldyBET01GYWN0b3J5KCkpLmNyZWF0ZU1ldGhvZChmU291cmNlKTsKKwkJaWYgKGZET01Ob2RlID09IG51bGwpIHsgLy9zeW50YWN0aWNhbGx5IGluY29ycmVjdCBzb3VyY2UKKwkJCWZET01Ob2RlID0gZ2VuZXJhdGVTeW50YXhJbmNvcnJlY3RET00oKTsKKwkJfQorCQlpZiAoZkFsdGVyZWROYW1lICE9IG51bGwgJiYgZkRPTU5vZGUgIT0gbnVsbCkgeworCQkJZkRPTU5vZGUuc2V0TmFtZShmQWx0ZXJlZE5hbWUpOworCQl9CisJfQorCWlmICghKGZET01Ob2RlIGluc3RhbmNlb2YgSURPTU1ldGhvZCkpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXJldHVybiBmRE9NTm9kZTsKK30KKy8qKgorICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZW5lcmF0ZVJlc3VsdEhhbmRsZQorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdlbmVyYXRlUmVzdWx0SGFuZGxlKCkgeworCVN0cmluZ1tdIHR5cGVzID0gY29udmVydERPTU1ldGhvZFR5cGVzVG9TaWduYXR1cmVzKCk7CisJU3RyaW5nIG5hbWU7CisJaWYgKCgoSURPTU1ldGhvZCkgZkRPTU5vZGUpLmlzQ29uc3RydWN0b3IoKSkgeworCQluYW1lID0gZkRPTU5vZGUuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOworCX0gZWxzZSB7CisJCW5hbWUgPSBmRE9NTm9kZS5nZXROYW1lKCk7CisJfQorCXJldHVybiBnZXRUeXBlKCkuZ2V0TWV0aG9kKG5hbWUsIHR5cGVzKTsKK30KKy8qKgorICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZXRNYWluVGFza05hbWUoKQorICovCitwdWJsaWMgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpeworCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5jcmVhdGVNZXRob2RQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIEBzZWUgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbiN2ZXJpZnlOYW1lQ29sbGlzaW9uCisgKi8KK3Byb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeU5hbWVDb2xsaXNpb24oKSB7CisJaWYgKGZET01Ob2RlICE9IG51bGwpIHsKKwkJSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKKwkJU3RyaW5nIG5hbWUgPSBmRE9NTm9kZS5nZXROYW1lKCk7CisJCWlmIChuYW1lID09IG51bGwpIHsgLy9jb25zdHJ1Y3RvcgorCQkJbmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKKwkJfQorCQlTdHJpbmdbXSB0eXBlcyA9IGNvbnZlcnRET01NZXRob2RUeXBlc1RvU2lnbmF0dXJlcygpOworCQlpZiAodHlwZS5nZXRNZXRob2QobmFtZSwgdHlwZXMpLmV4aXN0cygpKSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKKwkJfQorCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25PcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQyMGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZURlY2xhcmF0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tLkRPTU5vZGU7CisKKy8qKgorICogPHA+VGhpcyBvcGVyYXRpb24gYWRkcy9yZXBsYWNlcyBhIHBhY2thZ2UgZGVjbGFyYXRpb24gaW4gYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdC4KKyAqIElmIHRoZSBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgaW5jbHVkZXMgdGhlIHNwZWNpZmllZCBwYWNrYWdlIGRlY2xhcmF0aW9uLAorICogaXQgaXMgbm90IGdlbmVyYXRlZCAoaXQgZG9lcyBub3QgZ2VuZXJhdGUgZHVwbGljYXRlcykuCisgKgorICogPHA+UmVxdWlyZWQgQXR0cmlidXRlczo8dWw+CisgKiAgPGxpPkNvbXBpbGF0aW9uIHVuaXQgZWxlbWVudAorICogIDxsaT5QYWNrYWdlIG5hbWUKKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBDcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiB7CisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gYmVpbmcgY3JlYXRlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZk5hbWUgPSBudWxsOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGFkZCBhIHBhY2thZ2UgZGVjbGFyYXRpb24gdG8gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBDcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25PcGVyYXRpb24oU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgcGFyZW50RWxlbWVudCkgeworCXN1cGVyKHBhcmVudEVsZW1lbnQpOworCWZOYW1lPSBuYW1lOworfQorLyoqCisgKiBAc2VlIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24jZ2VuZXJhdGVFbGVtZW50RE9NCisgKi8KK3Byb3RlY3RlZCBJRE9NTm9kZSBnZW5lcmF0ZUVsZW1lbnRET00oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldENoaWxkcmVuKCk7CisJLy9sb29rIGZvciBhbiBleGlzdGluZyBwYWNrYWdlIGRlY2xhcmF0aW9uCisJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQlpZiAoY2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSA9PSAgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKKwkJCUlQYWNrYWdlRGVjbGFyYXRpb24gcGNrID0gKElQYWNrYWdlRGVjbGFyYXRpb24pIGNoaWxkcmVuW2ldOworCQkJSURPTVBhY2thZ2UgcGFjayA9IChJRE9NUGFja2FnZSkgKChKYXZhRWxlbWVudClwY2spLmZpbmROb2RlKGZDVURPTSk7CisJCQlpZiAoIXBhY2suZ2V0TmFtZSgpLmVxdWFscyhmTmFtZSkpIHsKKwkJCQkgLy8gZ2V0IHRoZSBpbnNlcnRpb24gcG9zaXRpb24gYmVmb3JlIHNldHRpbmcgdGhlIG5hbWUsIGFzIHRoaXMgbWFrZXMgaXQgYSBkZXRhaWxlZCBub2RlCisJCQkJIC8vIHRodXMgdGhlIHN0YXJ0IHBvc2l0aW9uIGlzIGFsd2F5cyAwCisJCQkJRE9NTm9kZSBub2RlID0gKERPTU5vZGUpcGFjazsKKwkJCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQlmUmVwbGFjZW1lbnRMZW5ndGggPSBub2RlLmdldEVuZFBvc2l0aW9uKCkgLSBmSW5zZXJ0aW9uUG9zaXRpb24gKyAxOworCQkJCXBhY2suc2V0TmFtZShmTmFtZSk7CisJCQkJZkNyZWF0ZWRFbGVtZW50ID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb20uRE9NTm9kZSlwYWNrOworCQkJfSBlbHNlIHsKKwkJCQkvL2VxdWl2YWxlbnQgcGFja2FnZSBkZWNsYXJhdGlvbiBhbHJlYWR5IGV4aXN0cworCQkJCWZDcmVhdGlvbk9jY3VycmVkPSBmYWxzZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJSURPTVBhY2thZ2UgcGFjayA9IChuZXcgRE9NRmFjdG9yeSgpKS5jcmVhdGVQYWNrYWdlKCk7CisJcGFjay5zZXROYW1lKGZOYW1lKTsKKwlyZXR1cm4gcGFjazsKK30KKy8qKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgaGFuZGxlIGZvciB0aGUgZWxlbWVudCB0aGlzIG9wZXJhdGlvbiBjcmVhdGVkLgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdlbmVyYXRlUmVzdWx0SGFuZGxlKCkgeworCXJldHVybiBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oZk5hbWUpOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7CisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVBhY2thZ2VQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFNldHMgdGhlIGNvcnJlY3QgcG9zaXRpb24gZm9yIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uOjx1bD4KKyAqIDxsaT4gYmVmb3JlIHRoZSBmaXJzdCBpbXBvcnQKKyAqIDxsaT4gaWYgbm8gaW1wb3J0cywgYmVmb3JlIHRoZSBmaXJzdCB0eXBlCisgKiA8bGk+IGlmIG5vIHR5cGUgLSBmaXJzdCB0aGluZyBpbiB0aGUgQ1UKKyAqIDxsaT4gCisgKi8KK3Byb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UG9zaXRpb24oKSB7CisJdHJ5IHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOworCQlJSW1wb3J0RGVjbGFyYXRpb25bXSBpbXBvcnRzID0gY3UuZ2V0SW1wb3J0cygpOworCQlpZiAoaW1wb3J0cy5sZW5ndGggPiAwKSB7CisJCQljcmVhdGVCZWZvcmUoaW1wb3J0c1swXSk7CisJCQlyZXR1cm47CisJCX0KKwkJSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CisJCWlmICh0eXBlcy5sZW5ndGggPiAwKSB7CisJCQljcmVhdGVCZWZvcmUodHlwZXNbMF0pOworCQkJcmV0dXJuOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCX0KK30KKy8qKgorICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KKyAqICA8bGk+Tk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyAtIG5vIGNvbXBpbGF0aW9uIHVuaXQgd2FzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24gCisgKiAgPGxpPklOVkFMSURfTkFNRSAtIGEgbmFtZSBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIHdhcyBub3QgYSB2YWxpZAorICogCQlwYWNrYWdlIGRlY2xhcmF0aW9uIG5hbWUuCisgKiA8L3VsPgorICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzCisgKiBAc2VlIEphdmFDb252ZW50aW9ucworICovCitwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKGZOYW1lKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX05BTUUsIGZOYW1lKTsKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlMTJlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBwYWNrYWdlIGZyYWdtZW50IHVuZGVyIGEgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCByb290LiAKKyAqIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzcGVjaWZpZWQ6IDx1bD4KKyAqIDxsaT50aGUgcGFja2FnZSBmcmFnbWVudCByb290CisgKiA8bGk+dGhlIHBhY2thZ2UgbmFtZQorICogPC91bD4KKyAqIDxwPkFueSBuZWVkZWQgZm9sZGVycy9wYWNrYWdlIGZyYWdtZW50cyBhcmUgY3JlYXRlZC4KKyAqIElmIHRoZSBwYWNrYWdlIGZyYWdtZW50IGFscmVhZHkgZXhpc3RzLCB0aGlzIG9wZXJhdGlvbiBoYXMgbm8gZWZmZWN0LgorICogVGhlIHJlc3VsdCBlbGVtZW50cyBpbmNsdWRlIHRoZSA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPiBjcmVhdGVkIGFuZCBhbnkgc2lkZSBlZmZlY3QKKyAqIHBhY2thZ2UgZnJhZ21lbnRzIHRoYXQgd2VyZSBjcmVhdGVkLgorICoKKyAqIDxwPk5PVEU6IEEgZGVmYXVsdCBwYWNrYWdlIGZyYWdtZW50IGV4aXN0cyBieSBkZWZhdWx0IGZvciBhIGdpdmVuIHJvb3QuCisgKgorICogPHA+UG9zc2libGUgZXhjZXB0aW9uIGNvbmRpdGlvbnM6IDx1bD4KKyAqICA8bGk+UGFja2FnZSBmcmFnbWVudCByb290IGlzIHJlYWQtb25seQorICogIDxsaT5QYWNrYWdlIGZyYWdtZW50J3MgbmFtZSBpcyB0YWtlbiBieSBhIHNpbXBsZSAobm9uLWZvbGRlcikgcmVzb3VyY2UKKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBDcmVhdGVQYWNrYWdlRnJhZ21lbnRPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCS8qKgorCSAqIFRoZSBmdWxseSBxdWFsaWZpZWQsIGRvdC1kZWxpbWl0ZWQsIHBhY2thZ2UgbmFtZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lOworLyoqCisgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNyZWF0ZSBhIHBhY2thZ2UgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICogdW5kZXIgdGhlIGdpdmVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4gVGhlIGRvdC1zZXBhcmF0ZWQgbmFtZSBpcyBicm9rZW4gaW50bworICogc2VnbWVudHMuIEludGVybWVkaWF0ZSBmb2xkZXJzIGFyZSBjcmVhdGVkIGFzIHJlcXVpcmVkIGZvciBlYWNoIHNlZ21lbnQuCisgKiBJZiB0aGUgZm9sZGVycyBhbHJlYWR5IGV4aXN0LCB0aGlzIG9wZXJhdGlvbiBoYXMgbm8gZWZmZWN0LgorICovCitwdWJsaWMgQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uKElQYWNrYWdlRnJhZ21lbnRSb290IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBmb3JjZSkgeworCXN1cGVyKG51bGwsIG5ldyBJSmF2YUVsZW1lbnRbXXtwYXJlbnRFbGVtZW50fSwgZm9yY2UpOworCWZOYW1lID0gcGFja2FnZU5hbWU7Cit9CisvKioKKyAqIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiAtIGNyZWF0ZXMgdGhlIG5ldyBwYWNrYWdlIGZyYWdtZW50IGFuZCBhbnkKKyAqIHNpZGUgZWZmZWN0IHBhY2thZ2UgZnJhZ21lbnRzLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgdW5hYmxlIHRvIGNvbXBsZXRlCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3SmF2YUVsZW1lbnREZWx0YSgpOworCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGdldFBhcmVudEVsZW1lbnQoKTsKKwlTdHJpbmdbXSBuYW1lcyA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lcyhmTmFtZSk7CisJYmVnaW5UYXNrKFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVBhY2thZ2VGcmFnbWVudFByb2dyZXNzIiksIG5hbWVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKKwlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCVN0cmluZyBzaWRlRWZmZWN0UGFja2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCUFycmF5TGlzdCByZXN1bHRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QobmFtZXMubGVuZ3RoKTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJU3RyaW5nIHN1YkZvbGRlck5hbWUgPSBuYW1lc1tpXTsKKwkJc2lkZUVmZmVjdFBhY2thZ2VOYW1lICs9IHN1YkZvbGRlck5hbWU7CisJCUlSZXNvdXJjZSBzdWJGb2xkZXIgPSBwYXJlbnRGb2xkZXIuZmluZE1lbWJlcihzdWJGb2xkZXJOYW1lKTsKKwkJaWYgKHN1YkZvbGRlciA9PSBudWxsKSB7CisJCQljcmVhdGVGb2xkZXIocGFyZW50Rm9sZGVyLCBzdWJGb2xkZXJOYW1lLCBmRm9yY2UpOworCQkJcGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChzdWJGb2xkZXJOYW1lKSk7CisJCQlJUGFja2FnZUZyYWdtZW50IGFkZGVkRnJhZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHNpZGVFZmZlY3RQYWNrYWdlTmFtZSk7CisJCQlkZWx0YS5hZGRlZChhZGRlZEZyYWcpOworCQkJcmVzdWx0RWxlbWVudHMuYWRkKGFkZGVkRnJhZyk7CisJCX0gZWxzZSB7CisJCQlwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgc3ViRm9sZGVyOworCQl9CisJCXNpZGVFZmZlY3RQYWNrYWdlTmFtZSArPSAnLic7CisJCXdvcmtlZCgxKTsKKwl9CisJaWYgKHJlc3VsdEVsZW1lbnRzLnNpemUoKSA+IDApIHsKKwkJZlJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtyZXN1bHRFbGVtZW50cy5zaXplKCldOworCQlyZXN1bHRFbGVtZW50cy50b0FycmF5KGZSZXN1bHRFbGVtZW50cyk7CisJCWFkZERlbHRhKGRlbHRhKTsKKwl9CisJZG9uZSgpOworfQorLyoqCisgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gdGhlIHJvb3Qgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbiBpcworICogCQk8Y29kZT5udWxsPC9jb2RlPi4KKyAqCTxsaT5JTlZBTElEX05BTUUgLSB0aGUgbmFtZSBwcm92aWRlZCB0byB0aGUgb3BlcmF0aW9uIAorICogCQlpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIGZyYWdtZW50IG5hbWUuCisgKgk8bGk+UkVBRF9PTkxZIC0gdGhlIHJvb3QgcHJvdmlkZWQgdG8gdGhpcyBvcGVyYXRpb24gaXMgcmVhZCBvbmx5LgorICoJPGxpPk5BTUVfQ09MTElTSU9OIC0gdGhlcmUgaXMgYSBwcmUtZXhpc3RpbmcgcmVzb3VyY2UgKGZpbGUpCisgKiAJCXdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZvbGRlciBpbiB0aGUgcGFja2FnZSBmcmFnbWVudCdzIGhpZXJhcmNoeS4KKyAqCTxsaT5FTEVNRU5UX05PVF9QUkVTRU5UIC0gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZm9yIHRoZSByb290IGlzIG1pc3NpbmcKKyAqIDwvdWw+CisgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKKyAqIEBzZWUgSmF2YUNvbnZlbnRpb25zCisgKi8KK3B1YmxpYyBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwlpZiAoZ2V0UGFyZW50RWxlbWVudCgpID09IG51bGwpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKKwl9CisJCisJaWYgKGZOYW1lID09IG51bGwgfHwgKGZOYW1lLmxlbmd0aCgpID4gMCAmJiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShmTmFtZSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSwgZk5hbWUpOworCX0KKwlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBnZXRQYXJlbnRFbGVtZW50KCk7CisJaWYgKHJvb3QuaXNSZWFkT25seSgpKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCByb290KTsKKwl9CisJU3RyaW5nW10gbmFtZXMgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMoZk5hbWUpOworCXRyeSB7CisJCUlDb250YWluZXIgcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlSZXNvdXJjZSBzdWJGb2xkZXIgPSBwYXJlbnRGb2xkZXIuZmluZE1lbWJlcihuYW1lc1tpXSk7CisJCQlpZiAoc3ViRm9sZGVyICE9IG51bGwpIHsKKwkJCQlpZiAoc3ViRm9sZGVyLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOworCQkJCX0KKwkJCQlwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgc3ViRm9sZGVyOworCQkJfQorCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQlyZXR1cm4gbnBlLmdldEphdmFNb2RlbFN0YXR1cygpOworCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGQwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeS5SZWdpb25CYXNlZFR5cGVIaWVyYXJjaHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5LlR5cGVIaWVyYXJjaHk7CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhbiA8Y29kZT5JVHlwZUhpZXJhcmNoeTwvY29kZT4gZm9yIGEgc3BlY2lmaWMgdHlwZSB3aXRoaW4KKyAqIGEgc3BlY2lmaWVkIHJlZ2lvbiwgb3IgZm9yIGFsbCB0eXBlcyB3aXRoaW4gYSByZWdpb24uIFRoZSBzcGVjaWZpZWQKKyAqIHJlZ2lvbiBsaW1pdHMgdGhlIG51bWJlciBvZiByZXNvbHZlZCBzdWJ0eXBlcyAoaS5lLiB0byB0aGUgc3Vic2V0IG9mCisgKiB0eXBlcyBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbikuIFRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIG1heSBnbyBvdXRzaWRlCisgKiBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBvcmRlciB0byByZWFjaCB0aGUgcm9vdChzKSBvZiB0aGUgdHlwZQorICogaGllcmFyY2h5LiBBIEphdmEgUHJvamVjdCBpcyByZXF1aXJlZCB0byBwcm92aWRlIGEgY29udGV4dCAoY2xhc3NwYXRoKQorICogdG8gdXNlIHdoaWxlIHJlc29sdmluZyBzdXBlcnR5cGVzIGFuZCBzdWJ0eXBlcy4KKyAqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KKworcHVibGljIGNsYXNzIENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCS8qKgorCSAqIFRoZSBnZW5lcmF0ZWQgdHlwZSBoaWVyYXJjaHkKKwkgKi8KKwlwcm90ZWN0ZWQgVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5OworCQorCXB1YmxpYyBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzOworCQorLyoqCisgKiBDb25zdHJ1Y3RzIGFuIG9wZXJhdGlvbiB0byBjcmVhdGUgYSB0eXBlIGhpZXJhcmNoeSBmb3IgdGhlCisgKiBnaXZlbiB0eXBlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiwgaW4gdGhlIGNvbnRleHQgb2YKKyAqIHRoZSBnaXZlbiBwcm9qZWN0LgorICovCitwdWJsaWMgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbihJVHlwZSBlbGVtZW50LCBJUmVnaW9uIHJlZ2lvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlzdXBlcihlbGVtZW50KTsKKwl0aGlzLnR5cGVIaWVyYXJjaHkgPSBuZXcgUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5KHJlZ2lvbiwgcHJvamVjdCwgZWxlbWVudCwgY29tcHV0ZVN1YnR5cGVzKTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZQorICogZ2l2ZW4gdHlwZSBhbmQgd29ya2luZyBjb3BpZXMuCisgKi8KK3B1YmxpYyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKElUeXBlIGVsZW1lbnQsIElXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlzdXBlcihlbGVtZW50KTsKKwl0aGlzLnR5cGVIaWVyYXJjaHkgPSBuZXcgVHlwZUhpZXJhcmNoeShlbGVtZW50LCBzY29wZSwgY29tcHV0ZVN1YnR5cGVzKTsKKwl0aGlzLndvcmtpbmdDb3BpZXMgPSB3b3JraW5nQ29waWVzOworfQorLyoqCisgKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIC0gY3JlYXRlcyB0aGUgdHlwZSBoaWVyYXJjaHkKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KKyAqLworcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRoaXMudHlwZUhpZXJhcmNoeS5yZWZyZXNoKHRoaXMpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgdHlwZSBoaWVyYXJjaHkuCisgKi8KK3B1YmxpYyBJVHlwZUhpZXJhcmNoeSBnZXRSZXN1bHQoKSB7CisJcmV0dXJuIHRoaXMudHlwZUhpZXJhcmNoeTsKK30KKy8qKgorICogQHNlZSBKYXZhTW9kZWxPcGVyYXRpb24KKyAqLworcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KKyAqCTxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gYXQgbGVhc3Qgb25lIG9mIGEgdHlwZSBvciByZWdpb24gbXVzdAorICoJCQliZSBwcm92aWRlZCB0byBnZW5lcmF0ZSBhIHR5cGUgaGllcmFyY2h5LgorICoJPGxpPkVMRU1FTlRfTk9UX1BSRVNFTlQgLSB0aGUgcHJvdmlkZWQgdHlwZSBvciB0eXBlJ3MgcHJvamVjdCBkb2VzIG5vdCBleGlzdAorICogPC91bD4KKyAqLworcHVibGljIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCUlKYXZhRWxlbWVudCBlbGVtZW50VG9Qcm9jZXNzPSBnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgPT0gbnVsbCAmJiAhKHRoaXMudHlwZUhpZXJhcmNoeSBpbnN0YW5jZW9mIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSkpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKKwl9CisJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgIT0gbnVsbCAmJiAhZWxlbWVudFRvUHJvY2Vzcy5leGlzdHMoKSkgeworCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnRUb1Byb2Nlc3MpOworCX0KKwlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMudHlwZUhpZXJhcmNoeS5qYXZhUHJvamVjdCgpOworCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXhpc3RzKCkpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNULCBwcm9qZWN0KTsKKwl9CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI2Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLkRPTUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworLyoqCisgKiBJbXBsZW1lbnRzIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvCisgKiBvcGVyYXRpb25zIHRoYXQgY3JlYXRlIHR5cGUgbWVtYmVycy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiB7CisJLyoqCisJICogVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgbmV3IG1lbWJlci4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZTb3VyY2UgPSBudWxsOworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5ET01Ob2RlPC9jb2RlPiB0aGF0IG1heSBiZSB1c2VkIHRvCisJICogY3JlYXRlIHRoaXMgbmV3IGVsZW1lbnQuCisJICogVXNlZCBieSB0aGUgPGNvZGU+Q29weUVsZW1lbnRzT3BlcmF0aW9uPC9jb2RlPiBmb3IgcmVuYW1pbmcKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZBbHRlcmVkTmFtZTsKKwkvKioKKwkgKiBUaGUgSkRPTSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnQgdGhhdAorCSAqIHRoaXMgb3BlcmF0aW9uIGNyZWF0ZWQuIAorCSAqLworCSBwcm90ZWN0ZWQgSURPTU5vZGUgZkRPTU5vZGU7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY3JlYXRlIGEgdHlwZSBtZW1iZXIKKyAqIGluIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlLgorICovCitwdWJsaWMgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbihJSmF2YUVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBmb3JjZSkgeworCXN1cGVyKHBhcmVudEVsZW1lbnQpOworCWZTb3VyY2U9IHNvdXJjZTsKKwlmRm9yY2U9IGZvcmNlOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dlbmVyYXRlTmV3Q29tcGlsYXRpb25Vbml0RE9NCisgKi8KK3Byb3RlY3RlZCB2b2lkIGdlbmVyYXRlTmV3Q29tcGlsYXRpb25Vbml0RE9NKElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlCdWZmZXIgYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7CisJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm47CisJY2hhcltdIHByZXZTb3VyY2UgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCWlmIChwcmV2U291cmNlID09IG51bGwpIHJldHVybjsKKworCS8vIGNyZWF0ZSBhIEpET00gZm9yIHRoZSBjb21waWxhdGlvbiB1bml0CisJZkNVRE9NID0gKG5ldyBET01GYWN0b3J5KCkpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwcmV2U291cmNlLCBjdS5nZXRFbGVtZW50TmFtZSgpKTsKKwlJRE9NTm9kZSBwYXJlbnQgPSAoKEphdmFFbGVtZW50KSBnZXRQYXJlbnRFbGVtZW50KCkpLmZpbmROb2RlKGZDVURPTSk7CisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCS8vI2ZpbmROb2RlIGRvZXMgbm90IHdvcmsgZm9yIGF1dG9nZW5lcmF0ZWQgQ1VzIGFzIHRoZSBjb250ZW50cyBhcmUgZW1wdHkKKwkJcGFyZW50ID0gZkNVRE9NOworCX0KKwlJRE9NTm9kZSBjaGlsZCA9IGdlbmVyYXRlRWxlbWVudERPTSgpOworCWlmIChjaGlsZCAhPSBudWxsKSB7CisJCWluc2VydERPTU5vZGUocGFyZW50LCBjaGlsZCk7CisJfQorCXdvcmtlZCgxKTsKK30KKy8qKgorICogR2VuZXJhdGVzIGEgPGNvZGU+SURPTU5vZGU8L2NvZGU+IGJhc2VkIG9uIHRoZSBzb3VyY2Ugb2YgdGhpcyBvcGVyYXRpb24KKyAqIHdoZW4gdGhlcmUgaXMgbGlrZWx5IGEgc3ludGF4IGVycm9yIGluIHRoZSBzb3VyY2UuCisgKi8KK3Byb3RlY3RlZCBJRE9NTm9kZSBnZW5lcmF0ZVN5bnRheEluY29ycmVjdERPTSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCS8vY3JlYXRlIHNvbWUgZHVtbXkgc291cmNlIHRvIGdlbmVyYXRlIGEgZG9tIG5vZGUKKwlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SICsgIiBwdWJsaWMgY2xhc3MgQSB7IiArIFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJYnVmZi5hcHBlbmQoZlNvdXJjZSk7CisJYnVmZi5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUikuYXBwZW5kKCd9Jyk7CisJSURPTUNvbXBpbGF0aW9uVW5pdCBkb21DVSA9IChuZXcgRE9NRmFjdG9yeSgpKS5jcmVhdGVDb21waWxhdGlvblVuaXQoYnVmZi50b1N0cmluZygpLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQKKwlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBkb21DVS5nZXRDaGlsZCgiQSIpLmdldENoaWxkcmVuKCkubmV4dEVsZW1lbnQoKTsgLy8kTk9OLU5MUy0xJAorCWlmIChub2RlICE9IG51bGwpIHsKKwkJbm9kZS5yZW1vdmUoKTsKKwl9CisJcmV0dXJuIG5vZGU7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIElUeXBlIHRoZSBtZW1iZXIgaXMgdG8gYmUgY3JlYXRlZCBpbi4KKyAqLworcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7CisJcmV0dXJuIChJVHlwZSlnZXRQYXJlbnRFbGVtZW50KCk7Cit9CisvKioKKyAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPkRPTU5vZGU8L2NvZGU+IHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgKiBjcmVhdGUgdGhpcyBuZXcgZWxlbWVudC4KKyAqIFVzZWQgYnkgdGhlIDxjb2RlPkNvcHlFbGVtZW50c09wZXJhdGlvbjwvY29kZT4gZm9yIHJlbmFtaW5nCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldEFsdGVyZWROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJZkFsdGVyZWROYW1lID0gbmV3TmFtZTsKK30KKy8qKgorICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KKyAqICA8bGk+Tk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyAtIHRoZSBwYXJlbnQgZWxlbWVudCBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIGlzCisgKiAJCTxjb2RlPm51bGw8L2NvZGU+LgorICoJPGxpPklOVkFMSURfQ09OVEVOVFMgLSBUaGUgc291cmNlIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGhhcyBzZXJpb3VzIHN5bnRheCBlcnJvcnMuCisgICoJPGxpPk5BTUVfQ09MTElTSU9OIC0gQSBuYW1lIGNvbGxpc2lvbiBvY2N1cnJlZCBpbiB0aGUgZGVzdGluYXRpb24KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZlcmlmeSgpOworCWlmICghc3RhdHVzLmlzT0soKSkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAoZlNvdXJjZSA9PSBudWxsKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DT05URU5UUyk7CisJfQorCWlmICghZkZvcmNlKSB7CisJCS8vY2hlY2sgZm9yIG5hbWUgY29sbGlzaW9ucworCQl0cnkgeworCQkJSURPTU5vZGUgbm9kZT0gZ2VuZXJhdGVFbGVtZW50RE9NKCk7CisJCQlpZiAobm9kZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NPTlRFTlRTKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQl9CisJCXJldHVybiB2ZXJpZnlOYW1lQ29sbGlzaW9uKCk7CisJfQorCQorCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7Cit9CisvKioKKyAqIFZlcmlmeSBmb3IgYSBuYW1lIGNvbGxpc2lvbiBpbiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyLgorICovCitwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnlOYW1lQ29sbGlzaW9uKCkgeworCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwNWJkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTVR5cGU7CisKKy8qKgorICogPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIGNsYXNzIG9yIGludGVyZmFjZS4KKyAqCisgKiA8cD5SZXF1aXJlZCBBdHRyaWJ1dGVzOjx1bD4KKyAqICA8bGk+UGFyZW50IGVsZW1lbnQgLSBtdXN0IGJlIGEgY29tcGlsYXRpb24gdW5pdCwgb3IgdHlwZS4KKyAqICA8bGk+VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdHlwZS4gTm8gdmVyaWZpY2F0aW9uIG9mIHRoZSBzb3VyY2UgaXMKKyAqICAgICAgcGVyZm9ybWVkLgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIENyZWF0ZVR5cGVPcGVyYXRpb24gZXh0ZW5kcyBDcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uIHsKKy8qKgorICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCBjcmVhdGUgYSB0eXBlIHVuaXQKKyAqIGluIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudCAoYSBjb21waWxhdGlvbiB1bml0LCB0eXBlKQorICovCitwdWJsaWMgQ3JlYXRlVHlwZU9wZXJhdGlvbihJSmF2YUVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBmb3JjZSkgeworCXN1cGVyKHBhcmVudEVsZW1lbnQsIHNvdXJjZSwgZm9yY2UpOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dlbmVyYXRlRWxlbWVudERPTSgpCisgKi8KK3Byb3RlY3RlZCBJRE9NTm9kZSBnZW5lcmF0ZUVsZW1lbnRET00oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZkRPTU5vZGUgPT0gbnVsbCkgeworCQlmRE9NTm9kZSA9IChuZXcgRE9NRmFjdG9yeSgpKS5jcmVhdGVUeXBlKGZTb3VyY2UpOworCQlpZiAoZkRPTU5vZGUgPT0gbnVsbCkgeworCQkJZkRPTU5vZGUgPSBnZW5lcmF0ZVN5bnRheEluY29ycmVjdERPTSgpOworCQl9CisJCWlmIChmQWx0ZXJlZE5hbWUgIT0gbnVsbCAmJiBmRE9NTm9kZSAhPSBudWxsKSB7CisJCQlmRE9NTm9kZS5zZXROYW1lKGZBbHRlcmVkTmFtZSk7CisJCX0KKwl9CisJaWYgKCEoZkRPTU5vZGUgaW5zdGFuY2VvZiBJRE9NVHlwZSkpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXJldHVybiBmRE9NTm9kZTsKK30KKy8qKgorICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNnZW5lcmF0ZVJlc3VsdEhhbmRsZSgpCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2VuZXJhdGVSZXN1bHRIYW5kbGUoKSB7CisJSUphdmFFbGVtZW50IHBhcmVudD0gZ2V0UGFyZW50RWxlbWVudCgpOworCWludCB0eXBlPSBwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKTsKKwlpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQlyZXR1cm4gKChJVHlwZSlwYXJlbnQpLmdldFR5cGUoZkRPTU5vZGUuZ2V0TmFtZSgpKTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldFR5cGUoZkRPTU5vZGUuZ2V0TmFtZSgpKTsKKwl9IAorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2dldE1haW5UYXNrTmFtZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCl7CisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNyZWF0ZVR5cGVQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPklUeXBlPC9jb2RlPiB0aGUgbWVtYmVyIGlzIHRvIGJlIGNyZWF0ZWQgaW4uCisgKi8KK3Byb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgeworCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBnZXRQYXJlbnRFbGVtZW50KCk7CisJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCXJldHVybiAoSVR5cGUpIHBhcmVudDsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbiN2ZXJpZnlOYW1lQ29sbGlzaW9uCisgKi8KK3Byb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeU5hbWVDb2xsaXNpb24oKSB7CisJSUphdmFFbGVtZW50IHBhcmVudCA9IGdldFBhcmVudEVsZW1lbnQoKTsKKwlpbnQgdHlwZSA9IHBhcmVudC5nZXRFbGVtZW50VHlwZSgpOworCWlmICh0eXBlID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCWlmICgoKElUeXBlKSBwYXJlbnQpLmdldFR5cGUoZkRPTU5vZGUuZ2V0TmFtZSgpKS5leGlzdHMoKSkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7CisJCX0KKwl9IGVsc2UKKwkJaWYgKHR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJCWlmICgoKElDb21waWxhdGlvblVuaXQpIHBhcmVudCkuZ2V0VHlwZShmRE9NTm9kZS5nZXROYW1lKCkpLmV4aXN0cygpKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7CisJCQl9CisJCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmMjJjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tLkRPTU5vZGU7CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gZGVsZXRlcyBhIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgKGFuZAorICogYWxsIG9mIHRoZWlyIGNoaWxkcmVuKS4KKyAqIElmIGFuIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGlnbm9yZWQuCisgKgorICogPHA+Tk9URTogVGhpcyBvcGVyYXRpb24gb25seSBkZWxldGVzIGVsZW1lbnRzIGNvbnRhaW5lZCB3aXRoaW4gbGVhZiByZXNvdXJjZXMgLQorICogaS5lLiBlbGVtZW50cyB3aXRoaW4gY29tcGlsYXRpb24gdW5pdHMuIFRvIGRlbGV0ZSBhIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAqIGEgcGFja2FnZSwgZXRjIChpLmUuIGFuIGFjdHVhbCByZXNvdXJjZSksIGEgRGVsZXRlUmVzb3VyY2VzT3BlcmF0aW9uCisgKiBzaG91bGQgYmUgdXNlZC4KKyAqLworcHVibGljIGNsYXNzIERlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgTXVsdGlPcGVyYXRpb24geworCWNoYXJbXSBOT19DSEFSID0gbmV3IGNoYXJbMF07CisJLyoqCisJICogVGhlIGVsZW1lbnRzIHRoaXMgb3BlcmF0aW9uIHByb2Nlc3NlcyBncm91cGVkIGJ5IGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBAc2VlIHByb2Nlc3NFbGVtZW50cygpLiBLZXlzIGFyZSBjb21waWxhdGlvbiB1bml0cywKKwkgKiB2YWx1ZXMgYXJlIDxjb2RlPklSZWdpb248L2NvZGU+cyBvZiBlbGVtZW50cyB0byBiZSBwcm9jZXNzZWQgaW4gZWFjaAorCSAqIGNvbXBpbGF0aW9uIHVuaXQuCisJICovIAorCXByb3RlY3RlZCBNYXAgZkNoaWxkcmVuVG9SZW1vdmU7CisJLyoqCisJICogVGhlIDxjb2RlPkRPTUZhY3Rvcnk8L2NvZGU+IHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgc291cmNlIGNvZGUgb2YKKwkgKiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPnMuCisJICovCisJcHJvdGVjdGVkIERPTUZhY3RvcnkgZkZhY3Rvcnk7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgZGVsZXRlIHRoZSBnaXZlbiBlbGVtZW50cy4gVGhlIGVsZW1lbnRzCisgKiB0byBkZWxldGUgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCBhbmQgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEKKyAqIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KK3B1YmxpYyBEZWxldGVFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvRGVsZXRlLCBib29sZWFuIGZvcmNlKSB7CisJc3VwZXIoZWxlbWVudHNUb0RlbGV0ZSwgZm9yY2UpOworCWZGYWN0b3J5ID0gbmV3IERPTUZhY3RvcnkoKTsKK30KKworLyoqCisgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgeworCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBHcm91cHMgdGhlIGVsZW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGVpciBjb21waWxhdGlvbiB1bml0LgorICogSWYgcGFyZW50L2NoaWxkIGNvbWJpbmF0aW9ucyBhcmUgcHJlc2VudCwgY2hpbGRyZW4gYXJlCisgKiBkaXNjYXJkZWQgKG9ubHkgdGhlIHBhcmVudHMgYXJlIHByb2Nlc3NlZCkuIFJlbW92ZXMgYW55CisgKiBkdXBsaWNhdGVzIHNwZWNpZmllZCBpbiBlbGVtZW50cyB0byBiZSBwcm9jZXNzZWQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGdyb3VwRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlmQ2hpbGRyZW5Ub1JlbW92ZSA9IG5ldyBIYXNoTWFwKDEpOworCWludCB1bmlxdWVDVXMgPSAwOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUphdmFFbGVtZW50IGUgPSBmRWxlbWVudHNUb1Byb2Nlc3NbaV07CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXRGb3IoZSk7CisJCWlmIChjdSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSmF2YU1vZGVsU3RhdHVzLlJFQURfT05MWSwgZSkpOworCQl9IGVsc2UgeworCQkJSVJlZ2lvbiByZWdpb24gPSAoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGN1KTsKKwkJCWlmIChyZWdpb24gPT0gbnVsbCkgeworCQkJCXJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKwkJCQlmQ2hpbGRyZW5Ub1JlbW92ZS5wdXQoY3UsIHJlZ2lvbik7CisJCQkJdW5pcXVlQ1VzICs9IDE7CisJCQl9CisJCQlyZWdpb24uYWRkKGUpOworCQl9CisJfQorCWZFbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbdW5pcXVlQ1VzXTsKKwlJdGVyYXRvciBpdGVyID0gZkNoaWxkcmVuVG9SZW1vdmUua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwlpbnQgaSA9IDA7CisJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCWZFbGVtZW50c1RvUHJvY2Vzc1tpKytdID0gKElKYXZhRWxlbWVudCkgaXRlci5uZXh0KCk7CisJfQorfQorLyoqCisgKiBEZWxldGVzIHRoaXMgZWxlbWVudCBmcm9tIGl0cyBjb21waWxhdGlvbiB1bml0LgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OworCisJLy8ga2VlcCB0cmFjayBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudHMgLSBpZiBhbGwgYXJlIHJlbW92ZWQsIGRlbGV0ZQorCS8vIHRoZSBpbXBvcnQgY29udGFpbmVyIChpLmUuIHJlcG9ydCBpdCBpbiB0aGUgZGVsdGEpCisJaW50IG51bWJlck9mSW1wb3J0cyA9IGN1LmdldEltcG9ydHMoKS5sZW5ndGg7CisKKwlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOworCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuOworCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShjdSk7CisJSUphdmFFbGVtZW50W10gY3VFbGVtZW50cyA9ICgoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGN1KSkuZ2V0RWxlbWVudHMoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY3VFbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJSmF2YUVsZW1lbnQgZSA9IGN1RWxlbWVudHNbaV07CisJCWlmIChlLmV4aXN0cygpKSB7CisJCQljaGFyW10gY29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIGNvbnRpbnVlOworCQkJSURPTUNvbXBpbGF0aW9uVW5pdCBjdURPTSA9IGZGYWN0b3J5LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb250ZW50cywgY3UuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQlET01Ob2RlIG5vZGUgPSAoRE9NTm9kZSkoKEphdmFFbGVtZW50KSBlKS5maW5kTm9kZShjdURPTSk7CisJCQkvLyBUQkQKKwkJCUFzc2VydC5pc1RydWUobm9kZSAhPSBudWxsLCBVdGlsLmJpbmQoImVsZW1lbnQuY2Fubm90TG9jYXRlIiwgZS5nZXRFbGVtZW50TmFtZSgpLCBjdURPTS5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0UG9zaXRpb24sIG5vZGUuZ2V0RW5kUG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gKyAxLCBOT19DSEFSKTsKKwkJCWRlbHRhLnJlbW92ZWQoZSk7CisJCQlpZiAoZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04pIHsKKwkJCQludW1iZXJPZkltcG9ydHMtLTsKKwkJCQlpZiAobnVtYmVyT2ZJbXBvcnRzID09IDApIHsKKwkJCQkJZGVsdGEucmVtb3ZlZChjdS5nZXRJbXBvcnRDb250YWluZXIoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkgeworCQljdS5zYXZlKGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSwgZkZvcmNlKTsKKwkJaWYgKCFjdS5pc1dvcmtpbmdDb3B5KCkpIHsgLy8gaWYgdW5pdCBpcyB3b3JraW5nIGNvcHksIHRoZW4gc2F2ZSB3aWxsIGhhdmUgYWxyZWFkeSBmaXJlZCB0aGUgZGVsdGEKKwkJCWFkZERlbHRhKGRlbHRhKTsKKwkJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgTXVsdGlPcGVyYXRpb24KKyAqIFRoaXMgbWV0aG9kIGZpcnN0IGdyb3VwIHRoZSBlbGVtZW50cyBieSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiwKKyAqIGFuZCB0aGVuIHByb2Nlc3NlcyB0aGUgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWdyb3VwRWxlbWVudHMoKTsKKwlzdXBlci5wcm9jZXNzRWxlbWVudHMoKTsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChJUmVnaW9uKSBmQ2hpbGRyZW5Ub1JlbW92ZS5nZXQoZWxlbWVudCkpLmdldEVsZW1lbnRzKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQlJSmF2YUVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpICE9IG51bGwpCisJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgY2hpbGQpOworCQlpZiAoY2hpbGQuaXNSZWFkT25seSgpKQorCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIGNoaWxkKTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzNjAxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgb3BlcmF0aW9uIGRlbGV0ZXMgYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyBhbmQgYWxsIG9mIHRoZWlyIGNoaWxkcmVuLgorICogSXQgZG9lcyBub3QgZGVsZXRlIHJlc291cmNlcyB3aGljaCBkbyBub3QgYmVsb25nIHRvIHRoZSBKYXZhIE1vZGVsCisgKiAoZWcgR0lGIGZpbGVzKS4KKyAqLworcHVibGljIGNsYXNzIERlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24gZXh0ZW5kcyBNdWx0aU9wZXJhdGlvbiB7CisvKioKKyAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgZGVsZXRlIHRoZSBnaXZlbiBlbGVtZW50cy4gVGhlIGVsZW1lbnRzCisgKiB0byBkZWxldGUgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCBhbmQgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZworICogcmVzb3VyY2UuCisgKi8KK3Byb3RlY3RlZCBEZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Qcm9jZXNzLCBib29sZWFuIGZvcmNlKSB7CisJc3VwZXIoZWxlbWVudHNUb1Byb2Nlc3MsIGZvcmNlKTsKK30KKy8qKgorICogRGVsZXRlcyB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIDxjb2RlPmZyYWc8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gaXRzIGtpbmQKKyAqIChLX1NPVVJDRSBvciBLX0JJTkFSWSksIGFuZCBkZWxldGVzIHRoZSBjb3JyZXNwb25kaW5nIGZvbGRlciBpZiBpdCBpcyB0aGVuCisgKiBlbXB0eS4KKyAqLworcHJpdmF0ZSB2b2lkIGRlbGV0ZVBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IGZyYWcpCisJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVJlc291cmNlIHJlcyA9IGZyYWcuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7CisJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgeworCQkvLyBjb2xsZWN0IHRoZSBjaGlsZHJlbiB0byByZW1vdmUKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW5PZkludGVyZXN0ID0gZnJhZy5nZXRDaGlsZHJlbigpOworCQlpZiAoY2hpbGRyZW5PZkludGVyZXN0Lmxlbmd0aCA+IDApIHsKKwkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbY2hpbGRyZW5PZkludGVyZXN0Lmxlbmd0aF07CisJCQkvLyByZW1vdmUgdGhlIGNoaWxkcmVuCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuT2ZJbnRlcmVzdC5sZW5ndGg7IGkrKykgeworCQkJCXJlc291cmNlc1tpXSA9IGNoaWxkcmVuT2ZJbnRlcmVzdFtpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKKwkJCX0KKwkJCWRlbGV0ZVJlc291cmNlcyhyZXNvdXJjZXMsIGZGb3JjZSk7CisJCX0KKworCQkvLyBEaXNjYXJkIG5vbi1qYXZhIHJlc291cmNlcworCQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gZnJhZy5nZXROb25KYXZhUmVzb3VyY2VzKCk7CisJCWludCBhY3R1YWxSZXNvdXJjZUNvdW50ID0gMDsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJaWYgKG5vbkphdmFSZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIGFjdHVhbFJlc291cmNlQ291bnQrKzsKKwkJfQorCQlJUmVzb3VyY2VbXSBhY3R1YWxOb25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVthY3R1YWxSZXNvdXJjZUNvdW50XTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoLCBpbmRleCA9IDA7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAobm9uSmF2YVJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgYWN0dWFsTm9uSmF2YVJlc291cmNlc1tpbmRleCsrXSA9IChJUmVzb3VyY2Upbm9uSmF2YVJlc291cmNlc1tpXTsKKwkJfQorCQlkZWxldGVSZXNvdXJjZXMoYWN0dWFsTm9uSmF2YVJlc291cmNlcywgZkZvcmNlKTsKKwkJCisJCS8vIGRlbGV0ZSByZW1haW5pbmcgZmlsZXMgaW4gdGhpcyBwYWNrYWdlICguY2xhc3MgZmlsZSBpbiB0aGUgY2FzZSB3aGVyZSBQcm9qPXNyYz1iaW4pCisJCUlSZXNvdXJjZVtdIHJlbWFpbmluZ0ZpbGVzOworCQl0cnkgeworCQkJcmVtYWluaW5nRmlsZXMgPSAoKElGb2xkZXIpIHJlcykubWVtYmVycygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGNlKTsKKwkJfQorCQlib29sZWFuIGlzRW1wdHkgPSB0cnVlOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVtYWluaW5nRmlsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlSZXNvdXJjZSBmaWxlID0gcmVtYWluaW5nRmlsZXNbaV07CisJCQlpZiAoZmlsZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJdGhpcy5kZWxldGVSZXNvdXJjZShmaWxlLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKKwkJCX0gZWxzZSB7CisJCQkJaXNFbXB0eSA9IGZhbHNlOworCQkJfQorCQl9CisJCWlmIChpc0VtcHR5KSB7CisJCQkvLyBkZWxldGUgcmVjdXJzaXZlbHkgZW1wdHkgZm9sZGVycworCQkJZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoZnJhZywgZmFsc2UpOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgeworCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbi4gVGhpcyBtZXRob2QgZGVsZWdhdGUgdG8gPGNvZGU+ZGVsZXRlUmVzb3VyY2U8L2NvZGU+IG9yCisgKiA8Y29kZT5kZWxldGVQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEUgOgorCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKKwkJCWRlbGV0ZVJlc291cmNlKGVsZW1lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCksIGZGb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCWRlbGV0ZVBhY2thZ2VGcmFnbWVudCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSmF2YU1vZGVsU3RhdHVzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCkpOworCX0KKwkvLyBlbnN1cmUgdGhlIGVsZW1lbnQgaXMgY2xvc2VkCisJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJT3BlbmFibGUpIHsKKwkJKChJT3BlbmFibGUpZWxlbWVudCkuY2xvc2UoKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgTXVsdGlPcGVyYXRpb24KKyAqLworcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQorCQllcnJvcihKYXZhTW9kZWxTdGF0dXMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgZWxlbWVudCk7CisKKwlpbnQgdHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKKwlpZiAodHlwZSA8PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIHx8IHR5cGUgPiBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkKKwkJZXJyb3IoSmF2YU1vZGVsU3RhdHVzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisJZWxzZSBpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50KQorCQllcnJvcihKYXZhTW9kZWxTdGF0dXMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc29yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Njk2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTg1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IDxjb2RlPkphdmFNb2RlbE1hbmFnZXI8L2NvZGU+IHRvIGNvbnZlcnQKKyAqIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPnMgaW50byA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT5zLgorICogSXQgYWxzbyBkb2VzIHNvbWUgcHJvY2Vzc2luZyBvbiB0aGUgPGNvZGU+SmF2YUVsZW1lbnQ8L2NvZGU+cyBpbnZvbHZlZAorICogKGUuZy4gY2xvc2luZyB0aGVtIG9yIHVwZGF0aW5nIGNsYXNzcGF0aHMpLgorICovCitwdWJsaWMgY2xhc3MgRGVsdGFQcm9jZXNzb3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7CisJCisJZmluYWwgc3RhdGljIGludCBJR05PUkUgPSAwOworCWZpbmFsIHN0YXRpYyBpbnQgU09VUkNFID0gMTsKKwlmaW5hbCBzdGF0aWMgaW50IEJJTkFSWSA9IDI7CisJCisJZmluYWwgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9KQVJfQURERUQgPSAiZXh0ZXJuYWwgamFyIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURVJOQUxfSkFSX1JFTU9WRUQgPSAiZXh0ZXJuYWwgamFyIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCisJZmluYWwgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9KQVJfQ0hBTkdFRCA9ICJleHRlcm5hbCBqYXIgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVSTkFMX0pBUl9VTkNIQU5HRUQgPSAiZXh0ZXJuYWwgamFyIHVuY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSTkFMX0pBUl9JR05PUkUgPSAiaW50ZXJuYWwgamFyIGlnbm9yZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBUaGUgPGNvZGU+SmF2YUVsZW1lbnREZWx0YTwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgPGNvZGU+SVJlc291cmNlRGVsdGE8L2NvZGU+IGJlaW5nIHRyYW5zbGF0ZWQuCisJICovCisJcHJvdGVjdGVkIEphdmFFbGVtZW50RGVsdGEgZkN1cnJlbnREZWx0YTsKKwkKKwlwcm90ZWN0ZWQgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG5ldyBJbmRleE1hbmFnZXIoKTsKKwkJCisJLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBJSmF2YVByb2plY3QgKi8KKwlNYXAgcm9vdHM7CisJCisJLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBIYXNoU2V0IG9mIElKYXZhUHJvamVjdAorCSAqIFVzZWQgd2hlbiBhbiBJUGF0aCBjb3JyZXNwb25kcyB0byBtb3JlIHRoYW4gb25lIHJvb3QgKi8KKwlNYXAgb3RoZXJSb290czsKKwkKKwkvKiBUaGUgamF2YSBlbGVtZW50IHRoYXQgd2FzIGxhc3QgY3JlYXRlZCAoc2VlIGNyZWF0ZUVsZW1lbnQoSVJlc291cmNlKS4gCisJICogVGhpcyBpcyB1c2VkIGFzIGEgc3RhY2sgb2YgamF2YSBlbGVtZW50cyAodXNpbmcgZ2V0UGFyZW50KCkgdG8gcG9wIGl0LCBhbmQgCisJICogdXNpbmcgdGhlIHZhcmlvdXMgZ2V0KiguLi4pIHRvIHB1c2ggaXQuICovCisJT3BlbmFibGUgY3VycmVudEVsZW1lbnQ7CisJCisJLyoKKwkgKiBUaGUgdHlwZSBvZiB0aGUgY3VycmVudCBldmVudCBiZWluZyBwcm9jZXNzZWQgKHNlZSBDaGFuZ2VkRWxlbWVudEV2ZW50KQorCSAqLworCWludCBjdXJyZW50RXZlbnRUeXBlOworCQorCXB1YmxpYyBIYXNoTWFwIGV4dGVybmFsVGltZVN0YW1wcyA9IG5ldyBIYXNoTWFwKCk7CisJcHVibGljIEhhc2hTZXQgcHJvamVjdHNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0KCk7CisJLy8gbGlzdCBvZiByb290IHByb2plY3RzIHdoaWNoIG5hbWVsb29rdXAgY2FjaGVzIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgZGVwZW5kZW50cworCXB1YmxpYyBIYXNoU2V0IHByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2ggPSBuZXcgSGFzaFNldCgpOyAgCisJCisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyOworCisJc3RhdGljIGZpbmFsIElKYXZhRWxlbWVudERlbHRhW10gTk9fREVMVEEgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbMF07CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOworCisJRGVsdGFQcm9jZXNzb3IoSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyKSB7CisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisJfQorCisJLyoKKwkgKiBBZGRzIHRoZSBkZXBlbmRlbnRzIG9mIHRoZSBnaXZlbiBwcm9qZWN0IHRvIHRoZSBsaXN0IG9mIHRoZSBwcm9qZWN0cworCSAqIHRvIHVwZGF0ZS4KKwkgKi8KKwl2b2lkIGFkZERlcGVuZGVudFByb2plY3RzKElQYXRoIHByb2plY3RQYXRoLCBIYXNoU2V0IHJlc3VsdCkgeworCQl0cnkgeworCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOworCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVAorCQkJCQkJCQkmJiBlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHByb2plY3RQYXRoKSkgeworCQkJCQkJCXJlc3VsdC5hZGQocHJvamVjdCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisJLyoKKwkgKiBBZGRzIHRoZSBnaXZlbiBwcm9qZWN0IGFuZCBpdHMgZGVwZW5kZW50cyB0byB0aGUgbGlzdCBvZiB0aGUgcHJvamVjdHMKKwkgKiB0byB1cGRhdGUuCisJICovCisJdm9pZCBhZGRUb1Byb2plY3RzVG9VcGRhdGVXaXRoRGVwZW5kZW50cyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMucHJvamVjdHNUb1VwZGF0ZS5hZGQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKKwkJdGhpcy5hZGREZXBlbmRlbnRQcm9qZWN0cyhwcm9qZWN0LmdldEZ1bGxQYXRoKCksIHRoaXMucHJvamVjdHNUb1VwZGF0ZSk7CisJfQorCQorCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIGNoaWxkIGhhbmRsZSB0byBpdHMgcGFyZW50J3MgY2FjaGUgb2YgY2hpbGRyZW4uIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFRvUGFyZW50SW5mbyhPcGVuYWJsZSBjaGlsZCkgeworCisJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKKwkJCXRyeSB7CisJCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSBwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQlpbmZvLmFkZENoaWxkKGNoaWxkKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gZG8gbm90aGluZyAtIHdlIGFscmVhZHkgY2hlY2tlZCBpZiBvcGVuCisJCQl9CisJCX0KKwl9CisKKworCisJLyoqCisJICogQ2xvc2VzIHRoZSBnaXZlbiBlbGVtZW50LCB3aGljaCByZW1vdmVzIGl0IGZyb20gdGhlIGNhY2hlIG9mIG9wZW4gZWxlbWVudHMuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsb3NlKE9wZW5hYmxlIGVsZW1lbnQpIHsKKworCQl0cnkgeworCQkJZWxlbWVudC5jbG9zZSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJfQorCisKK3ByaXZhdGUgdm9pZCBjbG9uZUN1cnJlbnREZWx0YShJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgeworCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSAoSmF2YUVsZW1lbnREZWx0YSlmQ3VycmVudERlbHRhLmZpbmQocm9vdCk7CisJaWYgKGRlbHRhID09IG51bGwpIHJldHVybjsKKwlKYXZhRWxlbWVudERlbHRhIGNsb25lID0gKEphdmFFbGVtZW50RGVsdGEpZGVsdGEuY2xvbmUocHJvamVjdCk7CisJZkN1cnJlbnREZWx0YS5pbnNlcnREZWx0YVRyZWUoY2xvbmUuZ2V0RWxlbWVudCgpLCBjbG9uZSk7CisJc3dpdGNoIChjbG9uZS5nZXRLaW5kKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKKwkJCXRoaXMuYWRkVG9QYXJlbnRJbmZvKChPcGVuYWJsZSljbG9uZS5nZXRFbGVtZW50KCkpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRDoKKwkJCU9wZW5hYmxlIGVsZW1lbnQgPSAoT3BlbmFibGUpY2xvbmUuZ2V0RWxlbWVudCgpOworCQkJaWYgKGVsZW1lbnQuaXNPcGVuKCkpIHsKKwkJCQl0cnkgeworCQkJCQllbGVtZW50LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCQl0aGlzLnJlbW92ZUZyb21QYXJlbnRJbmZvKGVsZW1lbnQpOworCQkJYnJlYWs7CisJfQorfQorCisKKwkvKioKKwkgKiBHZW5lcmljIHByb2Nlc3NpbmcgZm9yIGVsZW1lbnRzIHdpdGggY2hhbmdlZCBjb250ZW50czo8dWw+CisJICogPGxpPlRoZSBlbGVtZW50IGlzIGNsb3NlZCBzdWNoIHRoYXQgYW55IHN1YnNlcXVlbnQgYWNjZXNzZXMgd2lsbCByZS1vcGVuCisJICogdGhlIGVsZW1lbnQgcmVmbGVjdGluZyBpdHMgbmV3IHN0cnVjdHVyZS4KKwkgKiA8bGk+QW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgZGVsdGEgcmVwb3J0aW5nIGEgY29udGVudCBjaGFuZ2UgKEtfQ0hBTkdFIHdpdGggRl9DT05URU5UIGZsYWcgc2V0KS4KKwkgKiA8L3VsPgorCSAqIERlbHRhIGFyZ3VtZW50IGNvdWxkIGJlIG51bGwgaWYgcHJvY2Vzc2luZyBhbiBleHRlcm5hbCBKQVIgY2hhbmdlCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29udGVudENoYW5nZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKworCQljbG9zZShlbGVtZW50KTsKKwkJaW50IGZsYWdzID0gSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpeworCQkJZmxhZ3MgfD0gSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRDsKKwkJfQorCQlmQ3VycmVudERlbHRhLmNoYW5nZWQoZWxlbWVudCwgZmxhZ3MpOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayBhbGwgZXh0ZXJuYWwgYXJjaGl2ZSAocmVmZXJlbmNlZCBieSBnaXZlbiByb290cywgcHJvamVjdHMgb3IgbW9kZWwpIHN0YXR1cyBhbmQgaXNzdWUgYSBjb3JyZXNwb25kaW5nIHJvb3QgZGVsdGEuCisJICogQWxzbyB0cmlnZ2VycyBpbmRleCB1cGRhdGVzCisJICovCisJcHVibGljIHZvaWQgY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKElKYXZhRWxlbWVudFtdIHJlZnJlc2hlZEVsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0cnkgeworCQkJSGFzaE1hcCBleHRlcm5hbEFyY2hpdmVzU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKKwkJCUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7CQkJCisJCQkKKwkJCS8vIGZpbmQgSkFScyB0byByZWZyZXNoCisJCQlIYXNoU2V0IGFyY2hpdmVQYXRoc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7CisJCQlmb3IgKGludCBpID0gMCwgZWxlbWVudHNMZW5ndGggPSByZWZyZXNoZWRFbGVtZW50cy5sZW5ndGg7IGkgPCBlbGVtZW50c0xlbmd0aDsgaSsrKXsKKwkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHJlZnJlc2hlZEVsZW1lbnRzW2ldOworCQkJCXN3aXRjaChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpeworCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgorCQkJCQkJYXJjaGl2ZVBhdGhzVG9SZWZyZXNoLmFkZChlbGVtZW50LmdldFBhdGgoKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKKwkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9ICgoSUphdmFQcm9qZWN0KSBlbGVtZW50KS5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQkJCWZvciAoaW50IGogPSAwLCBjcExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjcExlbmd0aDsgaisrKXsKKwkJCQkJCQlpZiAoY2xhc3NwYXRoW2pdLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSl7CisJCQkJCQkJCWFyY2hpdmVQYXRoc1RvUmVmcmVzaC5hZGQoY2xhc3NwYXRoW2pdLmdldFBhdGgoKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgorCQkJCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtYW5hZ2VyLmdldEphdmFNb2RlbCgpLmdldE9sZEphdmFQcm9qZWN0c0xpc3QoKTsKKwkJCQkJCWZvciAoaW50IGogPSAwLCBwcm9qZWN0c0xlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaiA8IHByb2plY3RzTGVuZ3RoOyBqKyspeworCQkJCQkJCWNsYXNzcGF0aCA9ICgoSUphdmFQcm9qZWN0KSBwcm9qZWN0c1tqXSkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJCQkJZm9yIChpbnQgayA9IDAsIGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgayA8IGNwTGVuZ3RoOyBrKyspeworCQkJCQkJCQlpZiAoY2xhc3NwYXRoW2tdLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSl7CisJCQkJCQkJCQlhcmNoaXZlUGF0aHNUb1JlZnJlc2guYWRkKGNsYXNzcGF0aFtrXS5nZXRQYXRoKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gcGVyZm9ybSByZWZyZXNoCisJCQlmQ3VycmVudERlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEobW9kZWwpOworCQkJYm9vbGVhbiBoYXNEZWx0YSA9IGZhbHNlOworCisJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZ2V0T2xkSmF2YVByb2plY3RzTGlzdCgpOworCQkJSVdvcmtzcGFjZVJvb3Qgd2tzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkKKwkJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47IAorCQkJCQorCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKXsKKwkJCQkJaWYgKGVudHJpZXNbal0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7CisJCQkJCQkKKwkJCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJpZXNbal0uZ2V0UGF0aCgpOworCQkJCQkJCisJCQkJCQlpZiAoIWFyY2hpdmVQYXRoc1RvUmVmcmVzaC5jb250YWlucyhlbnRyeVBhdGgpKSBjb250aW51ZTsgLy8gbm90IHN1cHBvc2VkIHRvIGJlIHJlZnJlc2hlZAorCQkJCQkJCisJCQkJCQlTdHJpbmcgc3RhdHVzID0gKFN0cmluZylleHRlcm5hbEFyY2hpdmVzU3RhdHVzLmdldChlbnRyeVBhdGgpOyAKKwkJCQkJCWlmIChzdGF0dXMgPT0gbnVsbCl7CisJCQkJCQkJCisJCQkJCQkJLy8gY29tcHV0ZSBzaGFyZWQgc3RhdHVzCisJCQkJCQkJT2JqZWN0IHRhcmdldExpYnJhcnkgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdrc1Jvb3QsIGVudHJ5UGF0aCwgdHJ1ZSk7CisKKwkJCQkJCQlpZiAodGFyZ2V0TGlicmFyeSA9PSBudWxsKXsgLy8gbWlzc2luZyBKQVIKKwkJCQkJCQkJaWYgKHRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLmNvbnRhaW5zS2V5KGVudHJ5UGF0aCkpeworCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucmVtb3ZlKGVudHJ5UGF0aCk7CisJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9SRU1PVkVEKTsKKwkJCQkJCQkJCS8vIHRoZSBqYXIgd2FzIHBoeXNpY2FsbHkgcmVtb3ZlZDogcmVtb3ZlIHRoZSBpbmRleAorCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4KGVudHJ5UGF0aCk7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gZWxzZSBpZiAodGFyZ2V0TGlicmFyeSBpbnN0YW5jZW9mIEZpbGUpeyAvLyBleHRlcm5hbCBKQVIKKworCQkJCQkJCQlGaWxlIGV4dGVybmFsRmlsZSA9IChGaWxlKXRhcmdldExpYnJhcnk7CisJCQkJCQkJCQorCQkJCQkJCQkvLyBjaGVjayB0aW1lc3RhbXAgdG8gZmlndXJlIGlmIEpBUiBoYXMgY2hhbmdlZCBpbiBzb21lIHdheQorCQkJCQkJCQlMb25nIG9sZFRpbWVzdGFtcCA9KExvbmcpIHRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLmdldChlbnRyeVBhdGgpOworCQkJCQkJCQlsb25nIG5ld1RpbWVTdGFtcCA9IGdldFRpbWVTdGFtcChleHRlcm5hbEZpbGUpOworCQkJCQkJCQlpZiAob2xkVGltZXN0YW1wICE9IG51bGwpeworCisJCQkJCQkJCQlpZiAobmV3VGltZVN0YW1wID09IDApeyAvLyBmaWxlIGRvZXNuJ3QgZXhpc3QKKwkJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9SRU1PVkVEKTsKKwkJCQkJCQkJCQl0aGlzLmV4dGVybmFsVGltZVN0YW1wcy5yZW1vdmUoZW50cnlQYXRoKTsKKwkJCQkJCQkJCQkvLyByZW1vdmUgdGhlIGluZGV4CisJCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4KGVudHJ5UGF0aCk7CisKKwkJCQkJCQkJCX0gZWxzZSBpZiAob2xkVGltZXN0YW1wLmxvbmdWYWx1ZSgpICE9IG5ld1RpbWVTdGFtcCl7CisJCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfQ0hBTkdFRCk7CisJCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucHV0KGVudHJ5UGF0aCwgbmV3IExvbmcobmV3VGltZVN0YW1wKSk7CisJCQkJCQkJCQkJLy8gZmlyc3QgcmVtb3ZlIHRoZSBpbmRleCBzbyB0aGF0IGl0IGlzIGZvcmNlZCB0byBiZSByZS1pbmRleGVkCisJCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4KGVudHJ5UGF0aCk7CisJCQkJCQkJCQkJLy8gdGhlbiBpbmRleCB0aGUgamFyCisJCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLmluZGV4TGlicmFyeShlbnRyeVBhdGgsIHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfVU5DSEFOR0VEKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlmIChuZXdUaW1lU3RhbXAgPT0gMCl7IC8vIGphciBzdGlsbCBkb2Vzbid0IGV4aXN0CisJCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfVU5DSEFOR0VEKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfQURERUQpOworCQkJCQkJCQkJCXRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLnB1dChlbnRyeVBhdGgsIG5ldyBMb25nKG5ld1RpbWVTdGFtcCkpOworCQkJCQkJCQkJCS8vIGluZGV4IHRoZSBuZXcgamFyCisJCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLmluZGV4TGlicmFyeShlbnRyeVBhdGgsIHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7IC8vIGludGVybmFsIEpBUgorCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIElOVEVSTkFMX0pBUl9JR05PUkUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIGFjY29yZGluZyB0byBjb21wdXRlZCBzdGF0dXMsIGdlbmVyYXRlIGEgZGVsdGEKKwkJCQkJCXN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsgCisJCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpeworCQkJCQkJCWlmIChzdGF0dXMgPT0gRVhURVJOQUxfSkFSX0FEREVEKXsKKwkJCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGVudHJ5UGF0aC50b1N0cmluZygpKTsKKwkJCQkJCQkJaWYgKFZFUkJPU0UpeworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEV4dGVybmFsIEpBUiBBRERFRCwgYWZmZWN0aW5nIHJvb3Q6ICIrcm9vdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9IAorCQkJCQkJCQllbGVtZW50QWRkZWQocm9vdCwgbnVsbCk7CisJCQkJCQkJCWhhc0RlbHRhID0gdHJ1ZTsKKwkJCQkJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBFWFRFUk5BTF9KQVJfQ0hBTkdFRCkgeworCQkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvU3RyaW5nKCkpOworCQkJCQkJCQlpZiAoVkVSQk9TRSl7CisJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gRXh0ZXJuYWwgSkFSIENIQU5HRUQsIGFmZmVjdGluZyByb290OiAiK3Jvb3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyByZXNldCB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IGJ1aWx0IHN0YXRlLCBzaW5jZSB0aGUgYnVpbGRlciB3b3VsZCBtaXNzIHRoaXMgY2hhbmdlCisJCQkJCQkJCXRoaXMubWFuYWdlci5zZXRMYXN0QnVpbHRTdGF0ZShwcm9qZWN0LmdldFByb2plY3QoKSwgbnVsbCAvKm5vIHN0YXRlKi8pOworCQkJCQkJCQljb250ZW50Q2hhbmdlZChyb290LCBudWxsKTsKKwkJCQkJCQkJaGFzRGVsdGEgPSB0cnVlOworCQkJCQkJCX0gZWxzZSBpZiAoc3RhdHVzID09IEVYVEVSTkFMX0pBUl9SRU1PVkVEKSB7CisJCQkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgudG9TdHJpbmcoKSk7CisJCQkJCQkJCWlmIChWRVJCT1NFKXsKKwkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLSBFeHRlcm5hbCBKQVIgUkVNT1ZFRCwgYWZmZWN0aW5nIHJvb3Q6ICIrcm9vdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9CisJCQkJCQkJCWVsZW1lbnRSZW1vdmVkKHJvb3QsIG51bGwpOworCQkJCQkJCQloYXNEZWx0YSA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGhhc0RlbHRhKXsKKwkJCQl0aGlzLm1hbmFnZXIuZmlyZShmQ3VycmVudERlbHRhLCBKYXZhTW9kZWxNYW5hZ2VyLkRFRkFVTFRfQ0hBTkdFX0VWRU5UKTsJCQkKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWZDdXJyZW50RGVsdGEgPSBudWxsOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisJCisJLyoKKwkgKiBQcm9jZXNzIHRoZSBnaXZlbiBkZWx0YSBhbmQgbG9vayBmb3IgcHJvamVjdHMgYmVpbmcgYWRkZWQsIG9wZW5lZCwgY2xvc2VkIG9yCisJICogd2l0aCBhIGphdmEgbmF0dXJlIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQuCisJICogTm90ZSB0aGF0IHByb2plY3RzIGJlaW5nIGRlbGV0ZWQgYXJlIGNoZWNrZWQgaW4gZGVsZXRpbmcoSVByb2plY3QpLgorCSAqIEluIGFsbCBjYXNlcywgYWRkIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW50cyB0byB0aGUgbGlzdCBvZiBwcm9qZWN0cyB0byB1cGRhdGUKKwkgKiBzbyB0aGF0IHRoZSBjbGFzc3BhdGggcmVsYXRlZCBtYXJrZXJzIGNhbiBiZSB1cGRhdGVkLgorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrUHJvamVjdHNCZWluZ0FkZGVkT3JSZW1vdmVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CisJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKKwkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKKwkJCQlpZiAodGhpcy5tYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID09IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXRoaXMubWFuYWdlci5qYXZhUHJvamVjdHNDYWNoZSA9IHRoaXMubWFuYWdlci5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQl0aGlzLmNoZWNrUHJvamVjdHNCZWluZ0FkZGVkT3JSZW1vdmVkKGNoaWxkcmVuW2ldKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkvLyBOQjogTm8gbmVlZCB0byBjaGVjayBwcm9qZWN0J3MgbmF0dXJlIGFzIGlmIHRoZSBwcm9qZWN0IGlzIG5vdCBhIGphdmEgcHJvamVjdDoKKwkJCQkvLyAgICAgLSBpZiB0aGUgcHJvamVjdCBpcyBhZGRlZCBvciBjaGFuZ2VkIHRoaXMgaXMgYSBub29wIGZvciBwcm9qZWN0c0JlaW5nRGVsZXRlZAorCQkJCS8vICAgICAtIGlmIHRoZSBwcm9qZWN0IGlzIGNsb3NlZCwgaXQgaGFzIGFscmVhZHkgbG9zdCBpdHMgamF2YSBuYXR1cmUKKwkJCQlpbnQgZGVsdGFLaW5kID0gZGVsdGEuZ2V0S2luZCgpOworCQkJCWlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKKwkJCQkJLy8gcmVtZW1iZXIgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVudHMKKwkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClyZXNvdXJjZTsKKwkJCQkJdGhpcy5hZGRUb1Byb2plY3RzVG9VcGRhdGVXaXRoRGVwZW5kZW50cyhwcm9qZWN0KTsKKwkJCQkJCisJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorCQkJCQlpZiAodGhpcy5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSB7CisJCQkJCQl0aGlzLmFkZFRvUGFyZW50SW5mbygoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgeworCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KXJlc291cmNlOworCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSB7CisJCQkJCQkvLyBwcm9qZWN0IG9wZW5lZCBvciBjbG9zZWQ6IHJlbWVtYmVyICBwcm9qZWN0IGFuZCBpdHMgZGVwZW5kZW50cworCQkJCQkJdGhpcy5hZGRUb1Byb2plY3RzVG9VcGRhdGVXaXRoRGVwZW5kZW50cyhwcm9qZWN0KTsKKwkJCQkJCQorCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQgCisJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgeworCQkJCQkJCWlmICh0aGlzLmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsKKwkJCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCl0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZmluZEphdmFQcm9qZWN0KHByb2plY3QpOworCQkJCQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlqYXZhUHJvamVjdC5jbG9zZSgpOworCQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkJCQl9CisJCQkJCQkJCXRoaXMucmVtb3ZlRnJvbVBhcmVudEluZm8oamF2YVByb2plY3QpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSAhPSAwKSB7CisJCQkJCQlib29sZWFuIHdhc0phdmFQcm9qZWN0ID0gdGhpcy5tYW5hZ2VyLmdldEphdmFNb2RlbCgpLmZpbmRKYXZhUHJvamVjdChwcm9qZWN0KSAhPSBudWxsOworCQkJCQkJYm9vbGVhbiBpc0phdmFQcm9qZWN0ID0gdGhpcy5oYXNKYXZhTmF0dXJlKHByb2plY3QpOworCQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0ICE9IGlzSmF2YVByb2plY3QpIHsKKwkJCQkJCQkvLyBqYXZhIG5hdHVyZSBhZGRlZCBvciByZW1vdmVkOiByZW1lbWJlciAgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVudHMKKwkJCQkJCQl0aGlzLmFkZFRvUHJvamVjdHNUb1VwZGF0ZVdpdGhEZXBlbmRlbnRzKHByb2plY3QpOworCisJCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQgCisJCQkJCQkJaWYgKGlzSmF2YVByb2plY3QpIHsKKwkJCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJamF2YVByb2plY3QuY2xvc2UoKTsKKwkJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJfQorCQkJCQkJCQl0aGlzLnJlbW92ZUZyb21QYXJlbnRJbmZvKGphdmFQcm9qZWN0KTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGluIGNhc2UgdGhlIHByb2plY3Qgd2FzIHJlbW92ZWQgdGhlbiBhZGRlZCB0aGVuIGNoYW5nZWQgKHNlZSBidWcgMTk3OTkpCisJCQkJCQkJaWYgKHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeyAvLyBuZWVkIG5hdHVyZSBjaGVjayAtIDE4Njk4CisJCQkJCQkJCXRoaXMuYWRkVG9QYXJlbnRJbmZvKChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorCQkJCQkJLy8gaW4gY2FzZSB0aGUgcHJvamVjdCB3YXMgcmVtb3ZlZCB0aGVuIGFkZGVkIHRoZW4gY2hhbmdlZAorCQkJCQkJaWYgKHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeyAvLyBuZWVkIG5hdHVyZSBjaGVjayAtIDE4Njk4CisJCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisJCQkJCQl9CQkJCQkJCisJCQkJCX0JCQkJCQorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG9wZW5hYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVzb3VyY2UuCisJICogUmV0dXJucyBudWxsIGlmIG5vbmUgd2FzIGZvdW5kLgorCSAqLworCXByb3RlY3RlZCBPcGVuYWJsZSBjcmVhdGVFbGVtZW50KElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGVsZW1lbnRUeXBlLCBJSmF2YVByb2plY3QgcHJvamVjdCkgeworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQorCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBudWxsOworCQlzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7CisJCQkKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKKwkJCQorCQkJCS8vIG5vdGUgdGhhdCBub24tamF2YSByZXNvdXJjZXMgcm9vdGVkIGF0IHRoZSBwcm9qZWN0IGxldmVsIHdpbGwgYWxzbyBlbnRlciB0aGlzIGNvZGUgd2l0aAorCQkJCS8vIGFuIGVsZW1lbnRUeXBlIEpBVkFfUFJPSkVDVCAoc2VlICNlbGVtZW50VHlwZSguLi4pKS4KKwkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCl7CisKKwkJCQkJdGhpcy5wb3BVbnRpbFByZWZpeE9mKHBhdGgpOworCQkJCQkKKwkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgIT0gbnVsbCAKKwkJCQkJCSYmIHRoaXMuY3VycmVudEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCisJCQkJCQkmJiAoKElKYXZhUHJvamVjdCl0aGlzLmN1cnJlbnRFbGVtZW50KS5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlc291cmNlKSkgeworCQkJCQkJcmV0dXJuIHRoaXMuY3VycmVudEVsZW1lbnQ7CisJCQkJCX0KKwkJCQkJaWYgIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlc291cmNlKSl7CisJCQkJCQllbGVtZW50ID0gKE9wZW5hYmxlKXByb2plY3Q7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KXJlc291cmNlOworCQkJCQlib29sZWFuIGlzT3BlbmVkID0gcHJvai5pc09wZW4oKTsKKwkJCQkJaWYgKGlzT3BlbmVkICYmIHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qKSkgeworCQkJCQkJZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGphdmEgcHJvamVjdCBtYXkgaGF2ZSBiZWVuIGJlZW4gY2xvc2VkIG9yIHJlbW92ZWQgKGxvb2sgZm9yCisJCQkJCQkvLyBlbGVtZW50IGFtb25nc3Qgb2xkIGphdmEgcHJvamVjdCBzIGxpc3QpLgorCQkJCQkJZWxlbWVudCA9ICAoT3BlbmFibGUpIG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZmluZEphdmFQcm9qZWN0KHByb2opOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgorCQkJCWVsZW1lbnQgPSBwcm9qZWN0ID09IG51bGwgPyBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpIDogcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CisJCQkJLy8gZmluZCB0aGUgZWxlbWVudCB0aGF0IGVuY2xvc2VzIHRoZSByZXNvdXJjZQorCQkJCXRoaXMucG9wVW50aWxQcmVmaXhPZihwYXRoKTsKKwkJCQkKKwkJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsKSB7CisJCQkJCWVsZW1lbnQgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jcmVhdGUocmVzb3VyY2UsIHByb2plY3QpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGZpbmQgdGhlIHJvb3QKKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuY3VycmVudEVsZW1lbnQuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCQkJCQlpZiAocm9vdCA9PSBudWxsKSB7CisJCQkJCQllbGVtZW50ID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY3JlYXRlKHJlc291cmNlLCBwcm9qZWN0KTsKKwkJCQkJfSBlbHNlIGlmICghSmF2YU1vZGVsTWFuYWdlci5jb25mbGljdHNXaXRoT3V0cHV0TG9jYXRpb24ocGF0aCwgKEphdmFQcm9qZWN0KXJvb3QuZ2V0SmF2YVByb2plY3QoKSkpIHsKKwkJCQkJCS8vIGNyZWF0ZSBwYWNrYWdlIGhhbmRsZQorCQkJCQkJSVBhdGggcGtnUGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290LmdldFBhdGgoKS5zZWdtZW50Q291bnQoKSk7CisJCQkJCQlTdHJpbmcgcGtnID0gVXRpbC5wYWNrYWdlTmFtZShwa2dQYXRoKTsKKwkJCQkJCWlmIChwa2cgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJCQllbGVtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGtnKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOgorCQkJCS8vIGZpbmQgdGhlIGVsZW1lbnQgdGhhdCBlbmNsb3NlcyB0aGUgcmVzb3VyY2UKKwkJCQl0aGlzLnBvcFVudGlsUHJlZml4T2YocGF0aCk7CisJCQkJCisJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQllbGVtZW50ID0gZWxlbWVudCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNyZWF0ZShyZXNvdXJjZSwgcHJvamVjdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZmluZCB0aGUgcGFja2FnZQorCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZ0ZyYWdtZW50ID0gbnVsbDsKKwkJCQkJc3dpdGNoICh0aGlzLmN1cnJlbnRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKKwkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXRoaXMuY3VycmVudEVsZW1lbnQ7CisJCQkJCQkJSVBhdGggcm9vdFBhdGggPSByb290LmdldFBhdGgoKTsKKwkJCQkJCQlJUGF0aCBwa2dQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CisJCQkJCQkJU3RyaW5nIHBrZ05hbWUgPSBVdGlsLnBhY2thZ2VOYW1lKHBrZ1BhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290UGF0aC5zZWdtZW50Q291bnQoKSkpOworCQkJCQkJCWlmIChwa2dOYW1lICE9IG51bGwpIHsKKwkJCQkJCQkJcGtnRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJCQkJCU9wZW5hYmxlIHBrZyA9IChPcGVuYWJsZSl0aGlzLmN1cnJlbnRFbGVtZW50OworCQkJCQkJCWlmIChwa2cuZ2V0UGF0aCgpLmVxdWFscyhwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSkpIHsKKwkJCQkJCQkJcGtnRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudClwa2c7CisJCQkJCQkJfSAvLyBlbHNlIGNhc2Ugb2YgcGFja2FnZSB4IHdoaWNoIGlzIGEgcHJlZml4IG9mIHgueQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKKwkJCQkJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQkJCQkJcGtnRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCl0aGlzLmN1cnJlbnRFbGVtZW50LmdldFBhcmVudCgpOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChwa2dGcmFnbWVudCA9PSBudWxsKSB7CisJCQkJCQllbGVtZW50ID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY3JlYXRlKHJlc291cmNlLCBwcm9qZWN0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQkJCQkJCS8vIGNyZWF0ZSBjb21waWxhdGlvbiB1bml0IGhhbmRsZSAKKwkJCQkJCQkvLyBmaWxlTmFtZSB2YWxpZGF0aW9uIGhhcyBiZWVuIGRvbmUgaW4gZWxlbWVudFR5cGUoSVJlc291cmNlRGVsdGEsIGludCwgYm9vbGVhbikKKwkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7CisJCQkJCQkJZWxlbWVudCA9IHBrZ0ZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGNyZWF0ZSBjbGFzcyBmaWxlIGhhbmRsZQorCQkJCQkJCS8vIGZpbGVOYW1lIHZhbGlkYXRpb24gaGFzIGJlZW4gZG9uZSBpbiBlbGVtZW50VHlwZShJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKQorCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKKwkJCQkJCQllbGVtZW50ID0gcGtnRnJhZ21lbnQuZ2V0Q2xhc3NGaWxlKGZpbGVOYW1lKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpZWxlbWVudDsKKwkJCXJldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50OworCQl9CisJfQorCS8qKgorCSAqIE5vdGUgdGhhdCB0aGUgcHJvamVjdCBpcyBhYm91dCB0byBiZSBkZWxldGVkLgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0aW5nKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCisJCXRyeSB7CisJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisJCQlqYXZhUHJvamVjdC5jbG9zZSgpOworCisJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAgCisJCQlpZiAodGhpcy5tYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID09IG51bGwpIHsKKwkJCQl0aGlzLm1hbmFnZXIuamF2YVByb2plY3RzQ2FjaGUgPSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CisJCQl9CisJCQl0aGlzLnJlbW92ZUZyb21QYXJlbnRJbmZvKGphdmFQcm9qZWN0KTsKKworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl9CisJCQorCQl0aGlzLmFkZERlcGVuZGVudFByb2plY3RzKHByb2plY3QuZ2V0RnVsbFBhdGgoKSwgdGhpcy5wcm9qZWN0c1RvVXBkYXRlKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzaW5nIGZvciBhbiBlbGVtZW50IHRoYXQgaGFzIGJlZW4gYWRkZWQ6PHVsPgorCSAqIDxsaT5JZiB0aGUgZWxlbWVudCBpcyBhIHByb2plY3QsIGRvIG5vdGhpbmcsIGFuZCBkbyBub3QgcHJvY2VzcworCSAqIGNoaWxkcmVuLCBhcyB3aGVuIGEgcHJvamVjdCBpcyBjcmVhdGVkIGl0IGRvZXMgbm90IHlldCBoYXZlIGFueQorCSAqIG5hdHVyZXMgLSBzcGVjaWZpY2FsbHkgYSBqYXZhIG5hdHVyZS4KKwkgKiA8bGk+SWYgdGhlIGVsZW1ldCBpcyBub3QgYSBwcm9qZWN0LCBwcm9jZXNzIGl0IGFzIGFkZGVkIChzZWUKKwkgKiA8Y29kZT5iYXNpY0VsZW1lbnRBZGRlZDwvY29kZT4uCisJICogPC91bD4KKwkgKiBEZWx0YSBhcmd1bWVudCBjb3VsZCBiZSBudWxsIGlmIHByb2Nlc3NpbmcgYW4gZXh0ZXJuYWwgSkFSIGNoYW5nZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRBZGRlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7CisJCQorCQlpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgeworCQkJLy8gcHJvamVjdCBhZGQgaXMgaGFuZGxlZCBieSBKYXZhUHJvamVjdC5jb25maWd1cmUoKSBiZWNhdXNlCisJCQkvLyB3aGVuIGEgcHJvamVjdCBpcyBjcmVhdGVkLCBpdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGphdmEgbmF0dXJlCisJCQlpZiAoZGVsdGEgIT0gbnVsbCAmJiBoYXNKYXZhTmF0dXJlKChJUHJvamVjdClkZWx0YS5nZXRSZXNvdXJjZSgpKSkgeworCQkJCWFkZFRvUGFyZW50SW5mbyhlbGVtZW50KTsKKwkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7CisJCQkJCU9wZW5hYmxlIG1vdmVkRnJvbUVsZW1lbnQgPSAoT3BlbmFibGUpZWxlbWVudC5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCkubGFzdFNlZ21lbnQoKSk7CisJCQkJCWZDdXJyZW50RGVsdGEubW92ZWRUbyhlbGVtZW50LCBtb3ZlZEZyb21FbGVtZW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlmQ3VycmVudERlbHRhLmFkZGVkKGVsZW1lbnQpOworCQkJCX0KKwkJCQl0aGlzLnByb2plY3RzVG9VcGRhdGUuYWRkKGVsZW1lbnQpOworCQkJCXRoaXMudXBkYXRlUm9vdHMoZWxlbWVudC5nZXRQYXRoKCksIGRlbHRhKTsKKwkJCX0KKwkJfSBlbHNlIHsJCQkKKwkJCWFkZFRvUGFyZW50SW5mbyhlbGVtZW50KTsKKwkJCQorCQkJLy8gRm9yY2UgdGhlIGVsZW1lbnQgdG8gYmUgY2xvc2VkIGFzIGl0IG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQgCisJCQkvLyBiZWZvcmUgdGhlIHJlc291cmNlIG1vZGlmaWNhdGlvbiBjYW1lIGluIGFuZCBpdCBtaWdodCBoYXZlIGEgbmV3IGNoaWxkCisJCQkvLyBGb3IgZXhhbXBsZSwgaW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlOgorCQkJLy8gMS4gY3JlYXRlIGEgcGFja2FnZSBmcmFnbWVudCBwIHVzaW5nIGEgamF2YSBtb2RlbCBvcGVyYXRpb24KKwkJCS8vIDIuIG9wZW4gcGFja2FnZSBwCisJCQkvLyAzLiBhZGQgZmlsZSBYLmphdmEgaW4gZm9sZGVyIHAKKwkJCS8vIFdoZW4gdGhlIHJlc291cmNlIGRlbHRhIGNvbWVzIGluLCBvbmx5IHRoZSBhZGRpdGlvbiBvZiBwIGlzIG5vdGlmaWVkLCAKKwkJCS8vIGJ1dCB0aGUgcGFja2FnZSBwIGlzIGFscmVhZHkgb3BlbmVkLCB0aHVzIGl0cyBjaGlsZHJlbiBhcmUgbm90IHJlY29tcHV0ZWQKKwkJCS8vIGFuZCBpdCBhcHBlYXJzIGVtcHR5LgorCQkJY2xvc2UoZWxlbWVudCk7CisJCQkKKwkJCWlmIChkZWx0YSAhPSBudWxsICYmIChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkgeworCQkJCUlQYXRoIG1vdmVkRnJvbVBhdGggPSBkZWx0YS5nZXRNb3ZlZEZyb21QYXRoKCk7CisJCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCQkJSVJlc291cmNlIG1vdmVkRnJvbVJlczsKKwkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCQkJbW92ZWRGcm9tUmVzID0gcmVzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG1vdmVkRnJvbVBhdGgpOworCQkJCX0gZWxzZSB7CisJCQkJCW1vdmVkRnJvbVJlcyA9IHJlcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG1vdmVkRnJvbVBhdGgpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBmaW5kIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIG1vdmVkIGZyb20gZWxlbWVudAorCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290ID0gKElKYXZhUHJvamVjdCl0aGlzLnJvb3RzLmdldChtb3ZlZEZyb21QYXRoKTsKKwkJCQlib29sZWFuIGlzUGtnRnJhZ21lbnRSb290ID0gCisJCQkJCXByb2plY3RPZlJvb3QgIT0gbnVsbCAKKwkJCQkJJiYgKHByb2plY3RPZlJvb3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihtb3ZlZEZyb21QYXRoKSk7CisJCQkJaW50IG1vdmVkRnJvbVR5cGUgPSAKKwkJCQkJdGhpcy5lbGVtZW50VHlwZSgKKwkJCQkJCW1vdmVkRnJvbVJlcywgCisJCQkJCQlkZWx0YS5nZXRLaW5kKCksCisJCQkJCQlkZWx0YS5nZXRGbGFncygpLAorCQkJCQkJZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpLCAKKwkJCQkJCWlzUGtnRnJhZ21lbnRSb290KTsKKwkJCQkKKwkJCQkvLyBjcmVhdGUgdGhlIG1vdmVkIGZyb20gZWxlbWVudAorCQkJCU9wZW5hYmxlIG1vdmVkRnJvbUVsZW1lbnQgPSAKKwkJCQkJZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCAmJiBtb3ZlZEZyb21UeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgPyAKKwkJCQkJCW51bGwgOiAvLyBvdXRzaWRlIGNsYXNzcGF0aAorCQkJCQkJdGhpcy5jcmVhdGVFbGVtZW50KG1vdmVkRnJvbVJlcywgbW92ZWRGcm9tVHlwZSwgbnVsbCk7IC8vIHBhc3MgbnVsbCBmb3IgdGhlIHByb2plY3QgaW4gY2FzZSB0aGUgZWxlbWVudCBpcyBtb3ZpbmcgdG8gYW5vdGhlciBwcm9qZWN0CisJCQkJaWYgKG1vdmVkRnJvbUVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQkvLyBtb3ZlZCBmcm9tIG91dHNpZGUgY2xhc3NwYXRoCisJCQkJCWZDdXJyZW50RGVsdGEuYWRkZWQoZWxlbWVudCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZkN1cnJlbnREZWx0YS5tb3ZlZFRvKGVsZW1lbnQsIG1vdmVkRnJvbUVsZW1lbnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZkN1cnJlbnREZWx0YS5hZGRlZChlbGVtZW50KTsKKwkJCX0KKwkJCQorCQkJc3dpdGNoIChlbGVtZW50VHlwZSkgeworCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6CisJCQkJCS8vIHdoZW4gYSByb290IGlzIGFkZGVkLCBhbmQgaXMgb24gdGhlIGNsYXNzcGF0aCwgdGhlIHByb2plY3QgbXVzdCBiZSB1cGRhdGVkCisJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQkJdGhpcy5wcm9qZWN0c1RvVXBkYXRlLmFkZChwcm9qZWN0KTsKKwkJCQkJdGhpcy5wcm9qZWN0c0ZvckRlcGVuZGVudE5hbWVsb29rdXBSZWZyZXNoLmFkZChwcm9qZWN0KTsKKwkJCQkJCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJCQkvLyBnZXQgcmlkIG9mIG5hbWVsb29rdXAgc2luY2UgaXQgaG9sZHMgb250byBvYnNvbGV0ZSBjYWNoZWQgaW5mbyAKKwkJCQkJcHJvamVjdCA9IChKYXZhUHJvamVjdCkgZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOworCQkJCQl0cnkgeworCQkJCQkJcHJvamVjdC5nZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCkuc2V0TmFtZUxvb2t1cChudWxsKTsKKwkJCQkJCXRoaXMucHJvamVjdHNGb3JEZXBlbmRlbnROYW1lbG9va3VwUmVmcmVzaC5hZGQocHJvamVjdCk7CQkJCQkJCisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQkJLy8gYWRkIHN1YnBhY2thZ2VzCisJCQkJCWlmIChkZWx0YSAhPSBudWxsKXsKKwkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGVsZW1lbnQuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCQkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7CisJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjaGlsZC5nZXRSZXNvdXJjZSgpOworCQkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkJCQkJU3RyaW5nIHN1YnBrZ05hbWUgPSAKKwkJCQkJCQkJCW5hbWUubGVuZ3RoKCkgPT0gMCA/IAorCQkJCQkJCQkJCXJlc291cmNlLmdldE5hbWUoKSA6IAorCQkJCQkJCQkJCW5hbWUgKyAiLiIgKyByZXNvdXJjZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJT3BlbmFibGUgc3VicGtnID0gKE9wZW5hYmxlKXJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHN1YnBrZ05hbWUpOworCQkJCQkJCQl0aGlzLnVwZGF0ZUluZGV4KHN1YnBrZywgY2hpbGQpOworCQkJCQkJCQl0aGlzLmVsZW1lbnRBZGRlZChzdWJwa2csIGNoaWxkKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKworCisKKworCS8qKgorCSAqIEdlbmVyaWMgcHJvY2Vzc2luZyBmb3IgYSByZW1vdmVkIGVsZW1lbnQ6PHVsPgorCSAqIDxsaT5DbG9zZSB0aGUgZWxlbWVudCwgcmVtb3ZpbmcgaXRzIHN0cnVjdHVyZSBmcm9tIHRoZSBjYWNoZQorCSAqIDxsaT5SZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSBpdHMgcGFyZW50J3MgY2FjaGUgb2YgY2hpbGRyZW4KKwkgKiA8bGk+QWRkIGEgUkVNT1ZFRCBlbnRyeSBpbiB0aGUgZGVsdGEKKwkgKiA8L3VsPgorCSAqIERlbHRhIGFyZ3VtZW50IGNvdWxkIGJlIG51bGwgaWYgcHJvY2Vzc2luZyBhbiBleHRlcm5hbCBKQVIgY2hhbmdlCisJICovCisJcHJvdGVjdGVkIHZvaWQgZWxlbWVudFJlbW92ZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCisJCWlmIChlbGVtZW50LmlzT3BlbigpKSB7CisJCQljbG9zZShlbGVtZW50KTsKKwkJfQorCQlyZW1vdmVGcm9tUGFyZW50SW5mbyhlbGVtZW50KTsKKwkJaW50IGVsZW1lbnRUeXBlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpOworCQlpZiAoZGVsdGEgIT0gbnVsbCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7CisJCQlJUGF0aCBtb3ZlZFRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7CisJCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCUlSZXNvdXJjZSBtb3ZlZFRvUmVzOworCQkJc3dpdGNoIChyZXMuZ2V0VHlwZSgpKSB7CisJCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKKwkJCQkJbW92ZWRUb1JlcyA9IHJlcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtb3ZlZFRvUGF0aC5sYXN0U2VnbWVudCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgorCQkJCQltb3ZlZFRvUmVzID0gcmVzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobW92ZWRUb1BhdGgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZS5GSUxFOgorCQkJCQltb3ZlZFRvUmVzID0gcmVzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG1vdmVkVG9QYXRoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBmaW5kIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIG1vdmVkIGZyb20gZWxlbWVudAorCQkJSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QgPSAoSUphdmFQcm9qZWN0KXRoaXMucm9vdHMuZ2V0KG1vdmVkVG9QYXRoKTsKKwkJCWJvb2xlYW4gaXNQa2dGcmFnbWVudFJvb3QgPSAKKwkJCQlwcm9qZWN0T2ZSb290ICE9IG51bGwgCisJCQkJJiYgKHByb2plY3RPZlJvb3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihtb3ZlZFRvUGF0aCkpOworCQkJaW50IG1vdmVkVG9UeXBlID0gCisJCQkJdGhpcy5lbGVtZW50VHlwZSgKKwkJCQkJbW92ZWRUb1JlcywgCisJCQkJCWRlbHRhLmdldEtpbmQoKSwKKwkJCQkJZGVsdGEuZ2V0RmxhZ3MoKSwKKwkJCQkJZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpLCAKKwkJCQkJaXNQa2dGcmFnbWVudFJvb3QpOworCQkJCisJCQkvLyBjcmVhdGUgdGhlIG1vdmVkIFRvIGVsZW1lbnQKKwkJCU9wZW5hYmxlIG1vdmVkVG9FbGVtZW50ID0gCisJCQkJZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCAmJiBtb3ZlZFRvVHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUID8gCisJCQkJCW51bGwgOiAvLyBvdXRzaWRlIGNsYXNzcGF0aAorCQkJCQl0aGlzLmNyZWF0ZUVsZW1lbnQobW92ZWRUb1JlcywgbW92ZWRUb1R5cGUsIG51bGwpOyAvLyBwYXNzIG51bGwgZm9yIHRoZSBwcm9qZWN0IGluIGNhc2UgdGhlIGVsZW1lbnQgaXMgbW92aW5nIHRvIGFub3RoZXIgcHJvamVjdAorCQkJaWYgKG1vdmVkVG9FbGVtZW50ID09IG51bGwpIHsKKwkJCQkvLyBtb3ZlZCBvdXRzaWRlIGNsYXNzcGF0aAorCQkJCWZDdXJyZW50RGVsdGEucmVtb3ZlZChlbGVtZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJZkN1cnJlbnREZWx0YS5tb3ZlZEZyb20oZWxlbWVudCwgbW92ZWRUb0VsZW1lbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJZkN1cnJlbnREZWx0YS5yZW1vdmVkKGVsZW1lbnQpOworCQl9CisKKwkJc3dpdGNoIChlbGVtZW50VHlwZSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6CisJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVzZXQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6CisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlUGVyUHJvamVjdEluZm8oCisJCQkJCShKYXZhUHJvamVjdCkgZWxlbWVudCk7CisJCQkJdGhpcy51cGRhdGVSb290cyhlbGVtZW50LmdldFBhdGgoKSwgZGVsdGEpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKKwkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7CisJCQkJdGhpcy5wcm9qZWN0c1RvVXBkYXRlLmFkZChwcm9qZWN0KTsKKwkJCQl0aGlzLnByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2guYWRkKHByb2plY3QpOwkJCQkKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJCS8vMUcxVFcyVCAtIGdldCByaWQgb2YgbmFtZWxvb2t1cCBzaW5jZSBpdCBob2xkcyBvbnRvIG9ic29sZXRlIGNhY2hlZCBpbmZvIAorCQkJCXByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQl0cnkgeworCQkJCQlwcm9qZWN0LmdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKS5zZXROYW1lTG9va3VwKG51bGwpOyAKKwkJCQkJdGhpcy5wcm9qZWN0c0ZvckRlcGVuZGVudE5hbWVsb29rdXBSZWZyZXNoLmFkZChwcm9qZWN0KTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeyAKKwkJCQl9CisJCQkJLy8gcmVtb3ZlIHN1YnBhY2thZ2VzCisJCQkJaWYgKGRlbHRhICE9IG51bGwpeworCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBlbGVtZW50LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwkJCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7CisJCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkLmdldFJlc291cmNlKCk7CisJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJCQkJU3RyaW5nIHN1YnBrZ05hbWUgPSAKKwkJCQkJCQkJbmFtZS5sZW5ndGgoKSA9PSAwID8gCisJCQkJCQkJCQlyZXNvdXJjZS5nZXROYW1lKCkgOiAKKwkJCQkJCQkJCW5hbWUgKyAiLiIgKyByZXNvdXJjZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlPcGVuYWJsZSBzdWJwa2cgPSAoT3BlbmFibGUpcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoc3VicGtnTmFtZSk7CisJCQkJCQkJdGhpcy51cGRhdGVJbmRleChzdWJwa2csIGNoaWxkKTsKKwkJCQkJCQl0aGlzLmVsZW1lbnRSZW1vdmVkKHN1YnBrZywgY2hpbGQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoqCisJICogRmlsdGVycyB0aGUgZ2VuZXJhdGVkIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+cyB0byByZW1vdmUgdGhvc2UKKwkgKiB3aGljaCBzaG91bGQgbm90IGJlIGZpcmVkIChiZWNhdXNlIHRoZXkgZG9uJ3QgcmVwcmVzZW50IGEgcmVhbCBjaGFuZ2UKKwkgKiBpbiB0aGUgSmF2YSBNb2RlbCkuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudERlbHRhW10gZmlsdGVyUmVhbERlbHRhcyhJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcykgeworCisJCWludCBsZW5ndGggPSBkZWx0YXMubGVuZ3RoOworCQlJSmF2YUVsZW1lbnREZWx0YVtdIHJlYWxEZWx0YXMgPSBudWxsOworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKEphdmFFbGVtZW50RGVsdGEpZGVsdGFzW2ldOworCQkJaWYgKGRlbHRhID09IG51bGwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMAorCQkJCXx8IGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRAorCQkJCXx8IGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVECisJCQkJfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMAorCQkJCXx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9PUEVORUQpICE9IDAKKwkJCQl8fCBkZWx0YS5yZXNvdXJjZURlbHRhc0NvdW50ZXIgPiAwKSB7CisKKwkJCQlpZiAocmVhbERlbHRhcyA9PSBudWxsKSB7CisJCQkJCXJlYWxEZWx0YXMgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbbGVuZ3RoXTsKKwkJCQl9CisJCQkJcmVhbERlbHRhc1tpbmRleCsrXSA9IGRlbHRhOworCQkJfQorCQl9CisJCWlmIChpbmRleCA+IDApIHsKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gcmVzdWx0ID0gbmV3IElKYXZhRWxlbWVudERlbHRhW2luZGV4XTsKKwkJCVN5c3RlbS5hcnJheWNvcHkocmVhbERlbHRhcywgMCwgcmVzdWx0LCAwLCBpbmRleCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5PX0RFTFRBOworCQl9CisJfQorCisJLyoqCisJICogQW5zd2VyIGEgY29tYmluYXRpb24gb2YgdGhlIGxhc3RNb2RpZmllZCBzdGFtcCBhbmQgdGhlIHNpemUuCisJICogVXNlZCBmb3IgZGV0ZWN0aW5nIGV4dGVybmFsIEpBUiBjaGFuZ2VzCisJICovCisJcHVibGljIHN0YXRpYyBsb25nIGdldFRpbWVTdGFtcChGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCkgKyBmaWxlLmxlbmd0aCgpOworCX0KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBjb250YWluZWQgaW4gYW4gb3BlbiBwcm9qZWN0CisgKiB3aXRoIGEgamF2YSBuYXR1cmUsIG90aGVyd2lzZSBmYWxzZS4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaGFzSmF2YU5hdHVyZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkvLyBlbnN1cmUgdGhlIHByb2plY3QgaGFzIGEgamF2YSBuYXR1cmUgKGlmIG9wZW4pCisJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKKwlpZiAocHJvamVjdC5pc09wZW4oKSkgeworCQl0cnkgeworCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworCitwcml2YXRlIEphdmFNb2RlbEV4Y2VwdGlvbiBuZXdJbnZhbGlkRWxlbWVudFR5cGUoKSB7CisJcmV0dXJuIG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUykpOworfQorCS8qKgorCSAqIEdlbmVyaWMgcHJvY2Vzc2luZyBmb3IgZWxlbWVudHMgd2l0aCBjaGFuZ2VkIGNvbnRlbnRzOjx1bD4KKwkgKiA8bGk+VGhlIGVsZW1lbnQgaXMgY2xvc2VkIHN1Y2ggdGhhdCBhbnkgc3Vic2VxdWVudCBhY2Nlc3NlcyB3aWxsIHJlLW9wZW4KKwkgKiB0aGUgZWxlbWVudCByZWZsZWN0aW5nIGl0cyBuZXcgc3RydWN0dXJlLgorCSAqIDxsaT5BbiBlbnRyeSBpcyBtYWRlIGluIHRoZSBkZWx0YSByZXBvcnRpbmcgYSBjb250ZW50IGNoYW5nZSAoS19DSEFOR0Ugd2l0aCBGX0NPTlRFTlQgZmxhZyBzZXQpLgorCSAqIDwvdWw+CisJICovCisJcHJvdGVjdGVkIHZvaWQgbm9uSmF2YVJlc291cmNlc0NoYW5nZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCS8vIHJlc2V0IG5vbi1qYXZhIHJlc291cmNlcyBpZiBlbGVtZW50IHdhcyBvcGVuCisJCWlmIChlbGVtZW50LmlzT3BlbigpKSB7CisJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IGVsZW1lbnQuZ2V0RWxlbWVudEluZm8oKTsKKwkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKKwkJCQkJKChKYXZhUHJvamVjdEVsZW1lbnRJbmZvKSBpbmZvKS5zZXROb25KYXZhUmVzb3VyY2VzKG51bGwpOworCQorCQkJCQkvLyBpZiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyB0aGUgcHJvamVjdCwgY2xlYXIgaXQgdG9vCisJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3QgcHJvamVjdFJvb3QgPQorCQkJCQkJKFBhY2thZ2VGcmFnbWVudFJvb3QpICgoSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoCisJCQkJCQkJbmV3IFBhdGgoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSkpOworCQkJCQlpZiAocHJvamVjdFJvb3QuaXNPcGVuKCkpIHsKKwkJCQkJCSgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIHByb2plY3RSb290LmdldEVsZW1lbnRJbmZvKCkpLnNldE5vbkphdmFSZXNvdXJjZXMoCisJCQkJCQkJbnVsbCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6CisJCQkJCSAoKFBhY2thZ2VGcmFnbWVudEluZm8pIGluZm8pLnNldE5vbkphdmFSZXNvdXJjZXMobnVsbCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6CisJCQkJCSAoKFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBpbmZvKS5zZXROb25KYXZhUmVzb3VyY2VzKG51bGwpOworCQkJfQorCQl9CisKKwkJSmF2YUVsZW1lbnREZWx0YSBlbGVtZW50RGVsdGEgPSBmQ3VycmVudERlbHRhLmZpbmQoZWxlbWVudCk7CisJCWlmIChlbGVtZW50RGVsdGEgPT0gbnVsbCkgeworCQkJZkN1cnJlbnREZWx0YS5jaGFuZ2VkKGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCk7CisJCQllbGVtZW50RGVsdGEgPSBmQ3VycmVudERlbHRhLmZpbmQoZWxlbWVudCk7CisJCX0KKwkJZWxlbWVudERlbHRhLmFkZFJlc291cmNlRGVsdGEoZGVsdGEpOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSB1cGRhdGVkIGZpbGUgaXMgYWZmZWN0aW5nIHNvbWUgb2YgdGhlIHByb3BlcnRpZXMgb2YgYSBnaXZlbiBwcm9qZWN0IChsaWtlCisJICogaXRzIGNsYXNzcGF0aCBwZXJzaXN0ZWQgYXMgYSBmaWxlKS4KKwkgKiBBbHNvIGZvcmNlIGNsYXNzcGF0aCBwcm9ibGVtcyB0byBiZSByZWZyZXNoIGlmIG5vdCBydW5uaW5nIGluIGF1dG9idWlsZCBtb2RlLgorCSAqIE5PVEU6IEl0IGNhbiBpbmR1Y2UgcmVzb3VyY2UgY2hhbmdlcywgYW5kIGNhbm5vdCBiZSBjYWxsZWQgZHVyaW5nIFBPU1RfQ0hBTkdFIG5vdGlmaWNhdGlvbi4KKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHBlcmZvcm1QcmVCdWlsZENoZWNrKAorCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSwKKwkJSUphdmFFbGVtZW50IHBhcmVudCkgeworCQorCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOworCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7CisJCWJvb2xlYW4gcHJvY2Vzc0NoaWxkcmVuID0gZmFsc2U7CisJCisJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CisJCisJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKKwkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKKwkJCQkJcHJvY2Vzc0NoaWxkcmVuID0gdHJ1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkvLyBkbyBub3QgdmlzaXQgbm9uLWphdmEgcHJvamVjdHMgKHNlZSBidWcgMTYxNDAgTm9uLWphdmEgcHJvamVjdCBnZXRzIC5jbGFzc3BhdGgpCisJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIHRoaXMuaGFzSmF2YU5hdHVyZShyZXNvdXJjZSkpIHsKKwkJCQkJcHJvY2Vzc0NoaWxkcmVuID0gdHJ1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgeworCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKKwkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgcGFyZW50OworCQorCQkJCQkvKiBjaGVjayBjbGFzc3BhdGggcHJvcGVydHkgZmlsZSBjaGFuZ2UgKi8KKwkJCQkJUXVhbGlmaWVkTmFtZSBjbGFzc3BhdGhQcm9wOworCQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKAorCQkJCQkJCXByb2plY3QuY29tcHV0ZVNoYXJlZFByb3BlcnR5RmlsZU5hbWUoCisJCQkJCQkJCWNsYXNzcGF0aFByb3AgPSBwcm9qZWN0LmdldENsYXNzcGF0aFByb3BlcnR5TmFtZSgpKSkpIHsKKwkKKwkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDogLy8gcmVjcmVhdGUgb25lIGJhc2VkIG9uIGluLW1lbW9yeSBwYXRoCisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlwcm9qZWN0LnNhdmVDbGFzc3BhdGgocHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCWlmIChwcm9qZWN0LmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgeworCQkJCQkJCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3Qgc2F2ZSBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CisJCQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApCisJCQkJCQkJCQlicmVhazsgLy8gb25seSBjb25zaWRlciBjb250ZW50IGNoYW5nZQorCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgorCQkJCQkJCQkvLyBjaGVjayBpZiBhbnkgYWN0dWFsIGRpZmZlcmVuY2UKKwkJCQkJCQkJcHJvamVjdC5mbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKGZhbHNlLCB0cnVlKTsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCS8vIGZvcmNlIHRvIChyZSlyZWFkIHRoZSBwcm9wZXJ0eSBmaWxlCisJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBmaWxlRW50cmllcyA9IG51bGw7CisJCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJCVN0cmluZyBmaWxlQ2xhc3NwYXRoU3RyaW5nID0gcHJvamVjdC5sb2FkQ2xhc3NwYXRoKCk7CisJCQkJCQkJCQkJaWYgKGZpbGVDbGFzc3BhdGhTdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJCQkJCQlmaWxlRW50cmllcyA9IHByb2plY3QucmVhZFBhdGhzKGZpbGVDbGFzc3BhdGhTdHJpbmcpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJCQkJCQkJVXRpbC5sb2coZSwgCisJCQkJCQkJCQkJCQkiRXhjZXB0aW9uIHdoaWxlIHJldHJpZXZpbmcgIisgcHJvamVjdC5nZXRQYXRoKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkJKyIvLmNsYXNzcGF0aCwgaWdub3JlIGNoYW5nZSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCXByb2plY3QuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcigKKwkJCQkJCQkJCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90UmVhZENsYXNzcGF0aEZpbGUiLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IsCisJCQkJCQkJCQkJCWZhbHNlLAkvLyAgY3ljbGUgZXJyb3IKKwkJCQkJCQkJCQkJdHJ1ZSk7CS8vCWZpbGUgZm9ybWF0IGVycm9yCisJCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQkJaWYgKHByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7CisJCQkJCQkJCQkJCVV0aWwubG9nKGUsIAorCQkJCQkJCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHByb2plY3QuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJCSsiLy5jbGFzc3BhdGgsIGlnbm9yZSBjaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlwcm9qZWN0LmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCisJCQkJCQkJCQkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdFJlYWRDbGFzc3BhdGhGaWxlIiwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQlJTWFya2VyLlNFVkVSSVRZX0VSUk9SLAorCQkJCQkJCQkJCQlmYWxzZSwJLy8gIGN5Y2xlIGVycm9yCisJCQkJCQkJCQkJCXRydWUpOwkvLwlmaWxlIGZvcm1hdCBlcnJvcgorCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKGZpbGVFbnRyaWVzID09IG51bGwpCisJCQkJCQkJCQkJYnJlYWs7IC8vIGNvdWxkIG5vdCByZWFkLCBpZ25vcmUgCisJCQkJCQkJCQlpZiAocHJvamVjdC5pc0NsYXNzcGF0aEVxdWFsc1RvKHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSwgZmlsZUVudHJpZXMpKQorCQkJCQkJCQkJCWJyZWFrOworCQorCQkJCQkJCQkJLy8gd2lsbCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGNsYXNzcGF0aC9vdXRwdXQgbG9jYXRpb24gYmFzZWQgb24gdGhlIGZpbGUgaW5mb3JtYXRpb24KKwkJCQkJCQkJCS8vIGV4dHJhY3Qgb3V0IHRoZSBvdXRwdXQgbG9jYXRpb24KKwkJCQkJCQkJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKKwkJCQkJCQkJCWlmIChmaWxlRW50cmllcyAhPSBudWxsICYmIGZpbGVFbnRyaWVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBmaWxlRW50cmllc1tmaWxlRW50cmllcy5sZW5ndGggLSAxXTsKKwkJCQkJCQkJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgeworCQkJCQkJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbZmlsZUVudHJpZXMubGVuZ3RoIC0gMV07CisJCQkJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZmlsZUVudHJpZXMsIDAsIGNvcHksIDAsIGNvcHkubGVuZ3RoKTsKKwkJCQkJCQkJCQkJZmlsZUVudHJpZXMgPSBjb3B5OworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vIHJlc3RvcmUgb3V0cHV0IGxvY2F0aW9uCQkJCQorCQkJCQkJCQkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKKwkJCQkJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IFNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uOworCQkJCQkJCQkJfQorCQkJCQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoCisJCQkJCQkJCQkJZmlsZUVudHJpZXMsIAorCQkJCQkJCQkJCW91dHB1dExvY2F0aW9uLCAKKwkJCQkJCQkJCQludWxsLCAvLyBtb25pdG9yCisJCQkJCQkJCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UKKwkJCQkJCQkJCQlmYWxzZSwgLy8gZm9yY2VTYXZlCisJCQkJCQkJCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgLy8gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlCisJCQkJCQkJCQkJdHJ1ZSwgLy8gbmVlZEN5Y2xlQ2hlY2sKKwkJCQkJCQkJCQl0cnVlKTsgLy8gbmVlZFZhbGlkYXRpb24KKwkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQkvLyBzZXRSYXdDbGFzc3BhdGggbWlnaHQgZmlyZSBhIGRlbHRhLCBhbmQgYSBsaXN0ZW5lciBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uCisJCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJCQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJCQkJLy8gaGFwcGVucyBpZiB0aGUgLmNsYXNzcGF0aCBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byBkaXNrCisJCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJCQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlpZiAocHJvY2Vzc0NoaWxkcmVuKSB7CisJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCXBlcmZvcm1QcmVCdWlsZENoZWNrKGNoaWxkcmVuW2ldLCBlbGVtZW50KTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgcG9wVW50aWxQcmVmaXhPZihJUGF0aCBwYXRoKSB7CisJCXdoaWxlICh0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJCUlQYXRoIGN1cnJlbnRFbGVtZW50UGF0aCA9IG51bGw7CisJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJY3VycmVudEVsZW1lbnRQYXRoID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCl0aGlzLmN1cnJlbnRFbGVtZW50KS5nZXRQYXRoKCk7CisJCQl9IGVsc2UgeworCQkJCUlSZXNvdXJjZSBjdXJyZW50RWxlbWVudFJlc291cmNlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQljdXJyZW50RWxlbWVudFJlc291cmNlID0gdGhpcy5jdXJyZW50RWxlbWVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCQlpZiAoY3VycmVudEVsZW1lbnRSZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCWN1cnJlbnRFbGVtZW50UGF0aCA9IGN1cnJlbnRFbGVtZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY3VycmVudEVsZW1lbnRQYXRoICE9IG51bGwpIHsKKwkJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQgCisJCQkJCSYmIHRoaXMuY3VycmVudEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwCisJCQkJCSYmIGN1cnJlbnRFbGVtZW50UGF0aC5zZWdtZW50Q291bnQoKSAhPSBwYXRoLnNlZ21lbnRDb3VudCgpLTEpIHsKKwkJCQkJCS8vIGRlZmF1bHQgcGFja2FnZSBhbmQgcGF0aCBpcyBub3QgYSBkaXJlY3QgY2hpbGQKKwkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpdGhpcy5jdXJyZW50RWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCQl9CisJCQkJaWYgKGN1cnJlbnRFbGVtZW50UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gKE9wZW5hYmxlKXRoaXMuY3VycmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQ29udmVydHMgYSA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4gcm9vdGVkIGluIGEgPGNvZGU+V29ya3NwYWNlPC9jb2RlPiBpbnRvCisJICogdGhlIGNvcnJlc3BvbmRpbmcgc2V0IG9mIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPiwgcm9vdGVkIGluIHRoZQorCSAqIHJlbGV2YW50IDxjb2RlPkphdmFNb2RlbDwvY29kZT5zLgorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnREZWx0YVtdIHByb2Nlc3NSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGNoYW5nZXMsIGludCBldmVudFR5cGUpIHsKKworCQl0cnkgeworCQkJdGhpcy5jdXJyZW50RXZlbnRUeXBlID0gZXZlbnRUeXBlOworCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQkJaWYgKCFtb2RlbC5pc09wZW4oKSkgeworCQkJCS8vIGZvcmNlIG9wZW5pbmcgb2YgamF2YSBtb2RlbCBzbyB0aGF0IGphdmEgZWxlbWVudCBkZWx0YSBhcmUgcmVwb3J0ZWQKKwkJCQl0cnkgeworCQkJCQltb2RlbC5vcGVuKG51bGwpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCWlmIChWRVJCT1NFKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9CisJCQkJCXJldHVybiBOT19ERUxUQTsKKwkJCQl9CisJCQl9CisJCQl0aGlzLmluaXRpYWxpemVSb290cyhtb2RlbCk7CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gbnVsbDsKKwkJCQorCQkJLy8gZ2V0IHRoZSB3b3Jrc3BhY2UgZGVsdGEsIGFuZCBzdGFydCBwcm9jZXNzaW5nIHRoZXJlLgorCQkJSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBjaGFuZ2VzLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gdHJhbnNsYXRlZERlbHRhcyA9IG5ldyBKYXZhRWxlbWVudERlbHRhW2RlbHRhcy5sZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGRlbHRhc1tpXTsKKwkJCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCQlmQ3VycmVudERlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEobW9kZWwpOworCQkJCQorCQkJCS8vIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGRlbHRhIGlzIGEgcGFja2FnZSBmcmFnbWVudCByb290CisJCQkJSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QgPSAoSUphdmFQcm9qZWN0KXRoaXMucm9vdHMuZ2V0KHJlcy5nZXRGdWxsUGF0aCgpKTsKKwkJCQlib29sZWFuIGlzUGtnRnJhZ21lbnRSb290ID0gcHJvamVjdE9mUm9vdCAhPSBudWxsOworCQkJCWludCBlbGVtZW50VHlwZSA9IAorCQkJCQl0aGlzLmVsZW1lbnRUeXBlKAorCQkJCQkJcmVzLCAKKwkJCQkJCWRlbHRhLmdldEtpbmQoKSwKKwkJCQkJCWRlbHRhLmdldEZsYWdzKCksCisJCQkJCQlJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCwgCisJCQkJCQlpc1BrZ0ZyYWdtZW50Um9vdCk7CisJCQkJCisJCQkJdGhpcy50cmF2ZXJzZURlbHRhKGRlbHRhLCBlbGVtZW50VHlwZSwgcHJvamVjdE9mUm9vdCwgbnVsbCwgSUdOT1JFKTsgLy8gdHJhdmVyc2UgZGVsdGEKKwkJCQl0cmFuc2xhdGVkRGVsdGFzW2ldID0gZkN1cnJlbnREZWx0YTsKKwkJCX0KKwkJCQorCQkJLy8gdXBkYXRlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb2YgcHJvamVjdHMgdGhhdCB3ZXJlIGFmZmVjdGVkCisJCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucHJvamVjdHNUb1VwZGF0ZS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpaXRlcmF0b3IubmV4dCgpOworCQkJCXByb2plY3QudXBkYXRlUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCX0KKwkKKwkJCXVwZGF0ZURlcGVuZGVudE5hbWVsb29rdXBzKCk7CisKKwkJCXJldHVybiBmaWx0ZXJSZWFsRGVsdGFzKHRyYW5zbGF0ZWREZWx0YXMpOworCQl9IGZpbmFsbHkgeworCQkJdGhpcy5wcm9qZWN0c1RvVXBkYXRlLmNsZWFyKCk7CisJCQl0aGlzLnByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2guY2xlYXIoKTsKKwkJfQorCX0KKwkKKy8qCisgKiBVcGRhdGUgdGhlIGN1cnJlbnQgZGVsdGEgKGllLiBhZGQvcmVtb3ZlL2NoYW5nZSB0aGUgZ2l2ZW4gZWxlbWVudCkgYW5kIHVwZGF0ZSB0aGUgY29ycmVwb25kaW5nIGluZGV4LgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZGVsdGEgbXVzdCBiZSBwcm9jZXNzZWQuCisgKiBAdGhyb3dzIGEgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBkZWx0YSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBqYXZhIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiB1cGRhdGVDdXJyZW50RGVsdGFBbmRJbmRleChJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IGVsZW1lbnRUeXBlLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJT3BlbmFibGUgZWxlbWVudDsKKwlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCUlSZXNvdXJjZSBkZWx0YVJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KGRlbHRhUmVzLCBlbGVtZW50VHlwZSwgcHJvamVjdCk7CisJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7CisJCQkJLy8gcmVzb3VyY2UgbWlnaHQgYmUgY29udGFpbmluZyBzaGFyZWQgcm9vdHMgKHNlZSBidWcgMTkwNTgpCisJCQkJdGhpcy51cGRhdGVSb290cyhkZWx0YVJlcy5nZXRGdWxsUGF0aCgpLCBkZWx0YSk7CisJCQkJdGhyb3cgbmV3SW52YWxpZEVsZW1lbnRUeXBlKCk7CisJCQl9CisJCQl0aGlzLnVwZGF0ZUluZGV4KGVsZW1lbnQsIGRlbHRhKTsKKwkJCXRoaXMuZWxlbWVudEFkZGVkKGVsZW1lbnQsIGRlbHRhKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKKwkJCWRlbHRhUmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCWVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZGVsdGFSZXMsIGVsZW1lbnRUeXBlLCBwcm9qZWN0KTsKKwkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKKwkJCQkvLyByZXNvdXJjZSBtaWdodCBiZSBjb250YWluaW5nIHNoYXJlZCByb290cyAoc2VlIGJ1ZyAxOTA1OCkKKwkJCQl0aGlzLnVwZGF0ZVJvb3RzKGRlbHRhUmVzLmdldEZ1bGxQYXRoKCksIGRlbHRhKTsKKwkJCQl0aHJvdyBuZXdJbnZhbGlkRWxlbWVudFR5cGUoKTsKKwkJCX0KKwkJCXRoaXMudXBkYXRlSW5kZXgoZWxlbWVudCwgZGVsdGEpOworCQkJdGhpcy5lbGVtZW50UmVtb3ZlZChlbGVtZW50LCBkZWx0YSk7CisKKwkJCWlmIChkZWx0YVJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpewkJCQorCQkJCS8vIHJlc2V0IHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgYnVpbHQgc3RhdGUsIHNpbmNlIGNhbm5vdCByZXVzZSBpZiBhZGRlZCBiYWNrCisJCQkJdGhpcy5tYW5hZ2VyLnNldExhc3RCdWlsdFN0YXRlKChJUHJvamVjdClkZWx0YVJlcywgbnVsbCAvKm5vIHN0YXRlKi8pOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKKwkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSB7CisJCQkJLy8gY29udGVudCBoYXMgY2hhbmdlZAorCQkJCWVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZGVsdGEuZ2V0UmVzb3VyY2UoKSwgZWxlbWVudFR5cGUsIHByb2plY3QpOworCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHRocm93IG5ld0ludmFsaWRFbGVtZW50VHlwZSgpOworCQkJCXRoaXMudXBkYXRlSW5kZXgoZWxlbWVudCwgZGVsdGEpOworCQkJCXRoaXMuY29udGVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOworCQkJfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7CisJCQkJaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKKwkJCQkJLy8gcHJvamVjdCBoYXMgYmVlbiBvcGVuZWQgb3IgY2xvc2VkCisJCQkJCUlQcm9qZWN0IHJlcyA9IChJUHJvamVjdClkZWx0YS5nZXRSZXNvdXJjZSgpOworCQkJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KHJlcywgZWxlbWVudFR5cGUsIHByb2plY3QpOworCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7CisJCQkJCQkvLyByZXNvdXJjZSBtaWdodCBiZSBjb250YWluaW5nIHNoYXJlZCByb290cyAoc2VlIGJ1ZyAxOTA1OCkKKwkJCQkJCXRoaXMudXBkYXRlUm9vdHMocmVzLmdldEZ1bGxQYXRoKCksIGRlbHRhKTsKKwkJCQkJCXRocm93IG5ld0ludmFsaWRFbGVtZW50VHlwZSgpOworCQkJCQl9CisJCQkJCWlmIChyZXMuaXNPcGVuKCkpIHsKKwkJCQkJCWlmICh0aGlzLmhhc0phdmFOYXR1cmUocmVzKSkgeworCQkJCQkJCXRoaXMuZWxlbWVudEFkZGVkKGVsZW1lbnQsIGRlbHRhKTsKKwkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5pbmRleEFsbChyZXMpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQkJCQkJYm9vbGVhbiB3YXNKYXZhUHJvamVjdCA9IGphdmFNb2RlbC5maW5kSmF2YVByb2plY3QocmVzKSAhPSBudWxsOworCQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0KSB7CisJCQkJCQkJdGhpcy5lbGVtZW50UmVtb3ZlZChlbGVtZW50LCBkZWx0YSk7CisJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5yZW1vdmVJbmRleEZhbWlseShyZXMuZ2V0RnVsbFBhdGgoKSk7CisJCQkJCQkJCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuIGZhbHNlOyAvLyB3aGVuIGEgcHJvamVjdCBpcyBvcGVuL2Nsb3NlZCBkb24ndCBwcm9jZXNzIGNoaWxkcmVuCisJCQkJfQorCQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTikgIT0gMCkgeworCQkJCQlJUHJvamVjdCByZXMgPSAoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQkJCQlib29sZWFuIHdhc0phdmFQcm9qZWN0ID0gamF2YU1vZGVsLmZpbmRKYXZhUHJvamVjdChyZXMpICE9IG51bGw7CisJCQkJCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IHRoaXMuaGFzSmF2YU5hdHVyZShyZXMpOworCQkJCQlpZiAod2FzSmF2YVByb2plY3QgIT0gaXNKYXZhUHJvamVjdCkgeworCQkJCQkJLy8gcHJvamVjdCdzIG5hdHVyZSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkCisJCQkJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KHJlcywgZWxlbWVudFR5cGUsIHByb2plY3QpOworCQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgdGhyb3cgbmV3SW52YWxpZEVsZW1lbnRUeXBlKCk7IC8vIG5vdGUgaXRzIHJlc291cmNlcyBhcmUgc3RpbGwgdmlzaWJsZSBhcyByb290cyB0byBvdGhlciBwcm9qZWN0cworCQkJCQkJaWYgKGlzSmF2YVByb2plY3QpIHsKKwkJCQkJCQl0aGlzLmVsZW1lbnRBZGRlZChlbGVtZW50LCBkZWx0YSk7CisJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuaW5kZXhBbGwocmVzKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGhpcy5lbGVtZW50UmVtb3ZlZChlbGVtZW50LCBkZWx0YSk7CisJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5yZW1vdmVJbmRleEZhbWlseShyZXMuZ2V0RnVsbFBhdGgoKSk7CisJCQkJCQkJLy8gcmVzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBidWlsdCBzdGF0ZSwgc2luY2UgY2Fubm90IHJldXNlIGlmIGFkZGVkIGJhY2sKKwkJCQkJCQl0aGlzLm1hbmFnZXIuc2V0TGFzdEJ1aWx0U3RhdGUocmVzLCBudWxsIC8qbm8gc3RhdGUqLyk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIHdoZW4gYSBwcm9qZWN0J3MgbmF0dXJlIGlzIGFkZGVkL3JlbW92ZWQgZG9uJ3QgcHJvY2VzcyBjaGlsZHJlbgorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiB0cnVlOworfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIGl0cyBwYXJlbnRzIGNhY2hlIG9mIGNoaWxkcmVuLiBJZiB0aGUKKwkgKiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBwYXJlbnQsIG9yIHRoZSBwYXJlbnQgaXMgbm90IGN1cnJlbnRseSBvcGVuLAorCSAqIHRoaXMgaGFzIG5vIGVmZmVjdC4gCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVBhcmVudEluZm8oT3BlbmFibGUgY2hpbGQpIHsKKworCQlPcGVuYWJsZSBwYXJlbnQgPSAoT3BlbmFibGUpIGNoaWxkLmdldFBhcmVudCgpOworCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzT3BlbigpKSB7CisJCQl0cnkgeworCQkJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQkJaW5mby5yZW1vdmVDaGlsZChjaGlsZCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIGRvIG5vdGhpbmcgLSB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgb3BlbgorCQkJfQorCQl9CisJfQorCS8qKgorCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHNvbWUgcmVzb3VyY2UgY2hhbmdlcyBoYXZlIGhhcHBlbmVkCisJICogb24gdGhlIHBsYXRmb3JtLCBhbmQgdGhhdCB0aGUgSmF2YSBNb2RlbCBzaG91bGQgdXBkYXRlIGFueSByZXF1aXJlZAorCSAqIGludGVybmFsIHN0cnVjdHVyZXMgc3VjaCB0aGF0IGl0cyBlbGVtZW50cyByZW1haW4gY29uc2lzdGVudC4KKwkgKiBUcmFuc2xhdGVzIDxjb2RlPklSZXNvdXJjZURlbHRhczwvY29kZT4gaW50byA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YXM8L2NvZGU+LgorCSAqCisJICogQHNlZSBJUmVzb3VyY2VEZWx0YQorCSAqIEBzZWUgSVJlc291cmNlIAorCSAqLworCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCisJCUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQgPSBmYWxzZTsKKwkJCisJCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7CisJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCQkKKwkJCXN3aXRjaChldmVudC5nZXRUeXBlKCkpeworCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6CisJCQkJCXRyeSB7CisJCQkJCQlpZihyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgCisJCQkJCQkJJiYgKChJUHJvamVjdCkgcmVzb3VyY2UpLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7CisJCQkJCQkJCQorCQkJCQkJCXRoaXMuZGVsZXRpbmcoKElQcm9qZWN0KXJlc291cmNlKTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpeworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQkJCisJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQVVUT19CVUlMRCA6CisJCQkJCWlmKGRlbHRhICE9IG51bGwpIHsKKwkJCQkJCXRoaXMuY2hlY2tQcm9qZWN0c0JlaW5nQWRkZWRPclJlbW92ZWQoZGVsdGEpOworCQkJCQkJCisJCQkJCQkvLyB1cGRhdGUgdGhlIGNsYXNzcGF0aCByZWxhdGVkIG1hcmtlcnMKKwkJCQkJCXRoaXMudXBkYXRlQ2xhc3NwYXRoTWFya2VycygpOworCisJCQkJCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgY2xvc2UgcHJvamVjdCBpZiBhZmZlY3RlZCBieSB0aGUgcHJvcGVydHkgZmlsZSBjaGFuZ2UKKwkJCQkJCXRyeSB7CisJCQkJCQkJLy8gZG9uJ3QgZmlyZSBjbGFzc3BhdGggY2hhbmdlIGRlbHRhcyByaWdodCBhd2F5LCBidXQgYmF0Y2ggdGhlbQorCQkJCQkJCXRoaXMubWFuYWdlci5zdG9wRGVsdGFzKCk7CisJCQkJCQkJdGhpcy5wZXJmb3JtUHJlQnVpbGRDaGVjayhkZWx0YSwgbnVsbCk7IAorCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQl0aGlzLm1hbmFnZXIuc3RhcnREZWx0YXMoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBvbmx5IGZpcmUgYWxyZWFkeSBjb21wdXRlZCBkZWx0YXMgKHJlc291cmNlIG9uZXMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gcG9zdCBjaGFuZ2Ugb25seSkKKwkJCQkJdGhpcy5tYW5hZ2VyLmZpcmUobnVsbCwgRWxlbWVudENoYW5nZWRFdmVudC5QUkVfQVVUT19CVUlMRCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDoKKwkJCQkJdHJ5IHsKKwkJCQkJCUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQgPSB0cnVlOworCQkJCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKKwkJCQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIHRyYW5zbGF0ZWREZWx0YXMgPSB0aGlzLnByb2Nlc3NSZXNvdXJjZURlbHRhKGRlbHRhLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsKKwkJCQkJCQlpZiAodHJhbnNsYXRlZERlbHRhcy5sZW5ndGggPiAwKSB7IAorCQkJCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgdHJhbnNsYXRlZERlbHRhcy5sZW5ndGg7IGkrKykgeworCQkJCQkJCQkJdGhpcy5tYW5hZ2VyLnJlZ2lzdGVySmF2YU1vZGVsRGVsdGEodHJhbnNsYXRlZERlbHRhc1tpXSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5tYW5hZ2VyLmZpcmUobnVsbCwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7CisJCQkJCQl9CQkKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorCQkJCQkJdGhpcy5tYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID0gbnVsbDsKKwkJCQkJCUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQgPSBmYWxzZTsKKwkJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ29udmVydHMgYW4gPGNvZGU+SVJlc291cmNlRGVsdGE8L2NvZGU+IGFuZCBpdHMgY2hpbGRyZW4gaW50bworCSAqIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPnMuCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGRlbHRhIGNvcnJlc3BvbmRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KKwkgKiBJZiBpdCBpcyBub3QgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLCBpdCB3aWxsIGJlIGFkZGVkIGFzIGEgbm9uLWphdmEKKwkgKiByZXNvdXJjZSBieSB0aGUgc2VuZGVyIG9mIHRoaXMgbWV0aG9kLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHRyYXZlcnNlRGVsdGEoCisJCUlSZXNvdXJjZURlbHRhIGRlbHRhLCAKKwkJaW50IGVsZW1lbnRUeXBlLCAKKwkJSUphdmFQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LAorCQlJUGF0aCBjdXJyZW50T3V0cHV0LAorCQlpbnQgb3V0cHV0VHJhdmVyc2VNb2RlKSB7CisJCQkKKwkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCQorCQkvLyBwcm9jZXNzIGN1cnJlbnQgZGVsdGEKKwkJYm9vbGVhbiBwcm9jZXNzQ2hpbGRyZW4gPSB0cnVlOworCQlpZiAoY3VycmVudFByb2plY3QgIT0gbnVsbCB8fCByZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCB8fCAhdGhpcy5jdXJyZW50RWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmVxdWFscyhjdXJyZW50UHJvamVjdCkpIHsKKwkJCQkvLyBmb3JjZSB0aGUgY3VycmVudFByb2plY3QgdG8gYmUgdXNlZAorCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpY3VycmVudFByb2plY3Q7CisJCQl9CisJCQl0cnkgeworCQkJCXByb2Nlc3NDaGlsZHJlbiA9IHRoaXMudXBkYXRlQ3VycmVudERlbHRhQW5kSW5kZXgoZGVsdGEsIGVsZW1lbnRUeXBlLCBjdXJyZW50UHJvamVjdCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIG5vbiBqYXZhIHJlc291cmNlIG9yIGludmFsaWQgcHJvamVjdAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIG5vdCB5ZXQgaW5zaWRlIGEgcGFja2FnZSBmcmFnbWVudCByb290CisJCQlwcm9jZXNzQ2hpbGRyZW4gPSB0cnVlOworCQl9CisJCQorCQkvLyBnZXQgdGhlIHByb2plY3QncyBvdXRwdXQgbG9jYXRpb24KKwkJaWYgKGN1cnJlbnRPdXRwdXQgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlJSmF2YVByb2plY3QgcHJvaiA9CisJCQkJCWN1cnJlbnRQcm9qZWN0ID09IG51bGwgPworCQkJCQkJKElKYXZhUHJvamVjdCl0aGlzLmNyZWF0ZUVsZW1lbnQocmVzLmdldFByb2plY3QoKSwgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCwgbnVsbCkgOgorCQkJCQkJY3VycmVudFByb2plY3Q7CisJCQkJaWYgKHByb2ogIT0gbnVsbCkgeworCQkJCQljdXJyZW50T3V0cHV0ID0gcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJCQlpZiAocHJvai5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoY3VycmVudE91dHB1dCkpeyAvLyBjYXNlIG9mIHByb2o9PWJpbj09c3JjCisJCQkJCQlvdXRwdXRUcmF2ZXJzZU1vZGUgPSBTT1VSQ0U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBjaGVjayBjYXNlIG9mIHNyYz09YmluCisJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJCQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhjdXJyZW50T3V0cHV0KSkgeworCQkJCQkJCQlvdXRwdXRUcmF2ZXJzZU1vZGUgPSAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpID8gU09VUkNFIDogQklOQVJZOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisKKwkJLy8gcHJvY2VzcyBjaGlsZHJlbiBpZiBuZWVkZWQKKwkJaWYgKHByb2Nlc3NDaGlsZHJlbikgeworCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCWJvb2xlYW4gb25lQ2hpbGRPbkNsYXNzcGF0aCA9IGZhbHNlOworCQkJaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJCUlSZXNvdXJjZURlbHRhW10gb3JwaGFuQ2hpbGRyZW4gPSBuZXcgSVJlc291cmNlRGVsdGFbbGVuZ3RoXTsKKwkJCU9wZW5hYmxlIHBhcmVudCA9IG51bGw7CisJCQlib29sZWFuIGlzVmFsaWRQYXJlbnQgPSB0cnVlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlSZXNvdXJjZURlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQkJSVJlc291cmNlIGNoaWxkUmVzID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKKwkJCQlJUGF0aCBjaGlsZFBhdGggPSBjaGlsZFJlcy5nZXRGdWxsUGF0aCgpOworCisJCQkJLy8gZmluZCBvdXQgd2hldGhlciB0aGUgY2hpbGQgaXMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2YgdGhlIGN1cnJlbnQgcHJvamVjdAorCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290ID0gKElKYXZhUHJvamVjdCl0aGlzLnJvb3RzLmdldChjaGlsZFBhdGgpOworCQkJCWJvb2xlYW4gaXNQa2dGcmFnbWVudFJvb3QgPSAKKwkJCQkJcHJvamVjdE9mUm9vdCAhPSBudWxsIAorCQkJCQkmJiAocHJvamVjdE9mUm9vdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKGNoaWxkUGF0aCkpOworCQkJCWludCBjaGlsZFR5cGUgPSAKKwkJCQkJdGhpcy5lbGVtZW50VHlwZSgKKwkJCQkJCWNoaWxkUmVzLCAKKwkJCQkJCWNoaWxkLmdldEtpbmQoKSwKKwkJCQkJCWNoaWxkLmdldEZsYWdzKCksCisJCQkJCQllbGVtZW50VHlwZSwgCisJCQkJCQlpc1BrZ0ZyYWdtZW50Um9vdCk7CisJCQkJCisJCQkJLy8gZmlsdGVyIG91dCBjaGFuZ2VzIGluIG91dHB1dCBsb2NhdGlvbgorCQkJCWlmIChjdXJyZW50T3V0cHV0ICE9IG51bGwgJiYgY3VycmVudE91dHB1dC5pc1ByZWZpeE9mKGNoaWxkUGF0aCkpIHsKKwkJCQkJaWYgKG91dHB1dFRyYXZlcnNlTW9kZSAhPSBJR05PUkUpIHsKKwkJCQkJCS8vIGNhc2Ugb2YgYmluPXNyYworCQkJCQkJaWYgKG91dHB1dFRyYXZlcnNlTW9kZSA9PSBTT1VSQ0UgJiYgY2hpbGRUeXBlID09IElKYXZhRWxlbWVudC5DTEFTU19GSUxFKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQkvLyBjYXNlIG9mIC5jbGFzcyBmaWxlIHVuZGVyIHByb2plY3QgYW5kIG5vIHNvdXJjZSBmb2xkZXIKKwkJCQkJCS8vIHByb2o9YmluCisJCQkJCQlpZiAoY2hpbGRUeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgCisJCQkJCQkJJiYgY2hpbGRSZXMgaW5zdGFuY2VvZiBJRmlsZSAKKwkJCQkJCQkmJiBVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGNoaWxkUmVzLmdldE5hbWUoKSkpIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8vIHRyYXZlcnNlIGRlbHRhIGZvciBjaGlsZCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQkJaWYgKGNoaWxkVHlwZSA9PSAtMQorCQkJCQl8fCAhdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBjaGlsZFR5cGUsIChjdXJyZW50UHJvamVjdCA9PSBudWxsICYmIGlzUGtnRnJhZ21lbnRSb290KSA/IHByb2plY3RPZlJvb3QgOiBjdXJyZW50UHJvamVjdCwgY3VycmVudE91dHB1dCwgb3V0cHV0VHJhdmVyc2VNb2RlKSkgeworCQkJCQl0cnkgeworCQkJCQkJaWYgKGN1cnJlbnRQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQkJCQlpZiAoIWlzVmFsaWRQYXJlbnQpIGNvbnRpbnVlOyAKKwkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCB8fCAhdGhpcy5jdXJyZW50RWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmVxdWFscyhjdXJyZW50UHJvamVjdCkpIHsKKwkJCQkJCQkJCS8vIGZvcmNlIHRoZSBjdXJyZW50UHJvamVjdCB0byBiZSB1c2VkCisJCQkJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gKE9wZW5hYmxlKWN1cnJlbnRQcm9qZWN0OworCQkJCQkJCQl9CisJCQkJCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCisJCQkJCQkJCQl8fCAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCAmJiByZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsgCisJCQkJCQkJCQkvLyBOQjogYXR0YWNoIG5vbi1qYXZhIHJlc291cmNlIHRvIHByb2plY3QgKG5vdCB0byBpdHMgcGFja2FnZSBmcmFnbWVudCByb290KQorCQkJCQkJCQkJcGFyZW50ID0gKE9wZW5hYmxlKWN1cnJlbnRQcm9qZWN0OworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJcGFyZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KHJlcywgZWxlbWVudFR5cGUsIGN1cnJlbnRQcm9qZWN0KTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJCQkJCQkJCWlzVmFsaWRQYXJlbnQgPSBmYWxzZTsKKwkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCS8vIGFkZCBjaGlsZCBhcyBub24gamF2YSByZXNvdXJjZQorCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDaGFuZ2VkKHBhcmVudCwgY2hpbGQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlvcnBoYW5DaGlsZHJlbltpXSA9IGNoaWxkOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJb25lQ2hpbGRPbkNsYXNzcGF0aCA9IHRydWU7CisJCQkJfQorCQkJCQorCQkJCS8vIGlmIGNoaWxkIGlzIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIGFub3RoZXIgcHJvamVjdCwgdHJhdmVyc2UgZGVsdGEgdG9vCisJCQkJaWYgKHByb2plY3RPZlJvb3QgIT0gbnVsbCAmJiAhaXNQa2dGcmFnbWVudFJvb3QpIHsKKwkJCQkJdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09ULCBwcm9qZWN0T2ZSb290LCBudWxsLCBJR05PUkUpOyAvLyBiaW5hcnkgb3V0cHV0IG9mIHByb2plY3RPZlJvb3QgY2Fubm90IGJlIHRoaXMgcm9vdAorCQkJCQkvLyBOQjogTm8gbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGFzIHRoZSBjaGlsZCBjYW4gb25seSBiZSBvbiB0aGUgY2xhc3NwYXRoCisJCQkJfQorCQkJCQorCQkJCS8vIGlmIHRoZSBjaGlsZCBpcyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiBvbmUgb3Igc2V2ZXJhbCBvdGhlciBwcm9qZWN0cworCQkJCUhhc2hTZXQgc2V0OworCQkJCWlmICgoc2V0ID0gKEhhc2hTZXQpdGhpcy5vdGhlclJvb3RzLmdldChjaGlsZFBhdGgpKSAhPSBudWxsKSB7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IGN1cnJlbnRSb290ID0gCisJCQkJCQkoY3VycmVudFByb2plY3QgPT0gbnVsbCA/IAorCQkJCQkJCXByb2plY3RPZlJvb3QgOiAKKwkJCQkJCQljdXJyZW50UHJvamVjdCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChjaGlsZFJlcyk7CisJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJCQkJdGhpcy5jbG9uZUN1cnJlbnREZWx0YShwcm9qZWN0LCBjdXJyZW50Um9vdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAob25lQ2hpbGRPbkNsYXNzcGF0aCB8fCByZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJCS8vIGFkZCBvcnBoYW4gY2hpbGRyZW4gKGNhc2Ugb2Ygbm9uIGphdmEgcmVzb3VyY2VzIHVuZGVyIHByb2plY3QpCisJCQkJSVByb2plY3QgcnNjUHJvamVjdCA9IHJlcy5nZXRQcm9qZWN0KCk7CisJCQkJSmF2YVByb2plY3QgYWRvcHRpdmVQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmdldEphdmFDb3JlKCkuY3JlYXRlKHJzY1Byb2plY3QpOworCQkJCWlmIChhZG9wdGl2ZVByb2plY3QgIT0gbnVsbCAKKwkJCQkJJiYgdGhpcy5oYXNKYXZhTmF0dXJlKHJzY1Byb2plY3QpKSB7IC8vIGRlbHRhIGlmZiBKYXZhIHByb2plY3QgKDE4Njk4KQorCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAob3JwaGFuQ2hpbGRyZW5baV0gIT0gbnVsbCkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDaGFuZ2VkKGFkb3B0aXZlUHJvamVjdCwgb3JwaGFuQ2hpbGRyZW5baV0pOworCQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSAvLyBlbHNlIHJlc291cmNlIGRlbHRhIHdpbGwgYmUgYWRkZWQgYnkgcGFyZW50CisJCQlyZXR1cm4gaXNWYWxpZFBhcmVudCAmJiAoY3VycmVudFByb2plY3QgIT0gbnVsbCB8fCBvbmVDaGlsZE9uQ2xhc3NwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGlmIG5vdCBvbiBjbGFzc3BhdGggb3IgaWYgdGhlIGVsZW1lbnQgdHlwZSBpcyAtMSwgCisJCQkvLyBpdCdzIGEgbm9uLWphdmEgcmVzb3VyY2UKKwkJCXJldHVybiBjdXJyZW50UHJvamVjdCAhPSBudWxsICYmIGVsZW1lbnRUeXBlICE9IC0xOworCQl9CisJfQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgY2xhc3NwYXRoIG1hcmtlcnMgYW5kIGN5Y2xlIG1hcmtlcnMgZm9yIHRoZSBwcm9qZWN0cyB0byB1cGRhdGUuCisJICovCisJdm9pZCB1cGRhdGVDbGFzc3BhdGhNYXJrZXJzKCkgeworCQl0cnkgeworCQkJaWYgKCFSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKSkgeworCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5wcm9qZWN0c1RvVXBkYXRlLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQl0cnkgeworCQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClpdGVyYXRvci5uZXh0KCk7CisJCQkJCQkKKwkJCQkJCSAvLyBmb3JjZSBjbGFzc3BhdGggbWFya2VyIHJlZnJlc2gKKwkJCQkJCXByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoCisJCQkJCQkJdHJ1ZSwgLy8gaWdub3JlVW5yZXNvbHZlZEVudHJ5CisJCQkJCQkJdHJ1ZSk7IC8vIGdlbmVyYXRlTWFya2VyT25FcnJvcgorCQkJCQkJCisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIXRoaXMucHJvamVjdHNUb1VwZGF0ZS5pc0VtcHR5KCkpeworCQkJCXRyeSB7CisJCQkJCS8vIHVwZGF0ZSBhbGwgY3ljbGUgbWFya2VycworCQkJCQlKYXZhUHJvamVjdC51cGRhdGVBbGxDeWNsZU1hcmtlcnMoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0JCQkJCisJCX0gZmluYWxseSB7CisJCQl0aGlzLnByb2plY3RzVG9VcGRhdGUgPSBuZXcgSGFzaFNldCgpOworCQl9CisJfQorCisJLyoqCisJICogVHJhdmVyc2UgdGhlIHNldCBvZiBwcm9qZWN0cyB3aGljaCBoYXZlIGNoYW5nZWQgbmFtZXNwYWNlLCBhbmQgcmVmcmVzaCB0aGVpciBkZXBlbmRlbnRzCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlRGVwZW5kZW50TmFtZWxvb2t1cHMoKSB7CisJCUl0ZXJhdG9yIGl0ZXJhdG9yOworCQkvLyB1cGRhdGUgbmFtZWxvb2t1cCBvZiBkZXBlbmRlbnQgcHJvamVjdHMKKwkJaXRlcmF0b3IgPSB0aGlzLnByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2guaXRlcmF0b3IoKTsKKwkJSGFzaFNldCBhZmZlY3RlZERlcGVuZGVudHMgPSBuZXcgSGFzaFNldCgpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KWl0ZXJhdG9yLm5leHQoKTsKKwkJCWFkZERlcGVuZGVudFByb2plY3RzKHByb2plY3QuZ2V0UGF0aCgpLCBhZmZlY3RlZERlcGVuZGVudHMpOworCQl9CisJCWl0ZXJhdG9yID0gYWZmZWN0ZWREZXBlbmRlbnRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChwcm9qZWN0LmlzT3BlbigpKXsKKwkJCQl0cnkgeworCQkJCQkoKEphdmFQcm9qZWN0RWxlbWVudEluZm8pcHJvamVjdC5nZXRFbGVtZW50SW5mbygpKS5zZXROYW1lTG9va3VwKG51bGwpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCS8qCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgamF2YSBlbGVtZW50IHRoZSBnaXZlbiBkZWx0YSBtYXRjaGVzIHRvLgorCSAqIFJldHVybnMgLTEgaWYgdW5rbm93biAoZS5nLiBhIG5vbi1qYXZhIHJlc291cmNlLikKKwkgKi8KKwlwcml2YXRlIGludCBlbGVtZW50VHlwZShJUmVzb3VyY2UgcmVzLCBpbnQga2luZCwgaW50IGZsYWdzLCBpbnQgcGFyZW50VHlwZSwgYm9vbGVhbiBpc1BrZ0ZyYWdtZW50Um9vdCkgeworCQlzd2l0Y2ggKHBhcmVudFR5cGUpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CisJCQkJaWYgKGtpbmQgIT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgeworCQkJCQkvLyBjaGFuZ2Ugb24gdGhlIHByb2plY3QgaXRzZWxmCisJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOworCQkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgeworCQkJCQkvLyBwcm9qZWN0IGlzIG9wZW5lZCBvciBjbG9zZWQKKwkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q7CisJCQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5ERVNDUklQVElPTikgIT0gMCkgeworCQkJCQkJLy8gcHJvamVjdCdzIGRlc2NyaXB0aW9uIGhhcyBjaGFuZ2VkOiBuZWVkIHRvIGNoZWNrIGlmIGphdmEgbmF0dXJlIGhhcyBjaGFuZ2VkCisJCQkJCQlJUHJvamVjdCBwcm9qID0gcmVzLmdldFByb2plY3QoKTsKKwkJCQkJCWJvb2xlYW4gd2FzSmF2YVByb2plY3QgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKS5maW5kSmF2YVByb2plY3QocHJvaikgIT0gbnVsbDsKKwkJCQkJCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qKTsKKwkJCQkJCWlmICh3YXNKYXZhUHJvamVjdCAhPSBpc0phdmFQcm9qZWN0KSB7CisJCQkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q7CisJCQkJCQl9CisJCQkJfSAvLyBlbHNlIHNlZSBiZWxvdworCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgorCQkJCWlmIChpc1BrZ0ZyYWdtZW50Um9vdCkgeworCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDsgLy8gbm90IHlldCBpbiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorCQkJCX0KKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CisJCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkJaWYgKFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKHJlcy5nZXROYW1lKCkpKSB7CisJCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXMuZ2V0TmFtZSgpOworCQkJCQlpZiAoVXRpbC5pc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShmaWxlTmFtZSkpIHsKKwkJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDsKKwkJCQkJfSBlbHNlIGlmIChVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGZpbGVOYW1lKSkgeworCQkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOworCQkJCQl9IGVsc2UgaWYgKHRoaXMucm9vdHMuZ2V0KHJlcy5nZXRGdWxsUGF0aCgpKSAhPSBudWxsKSB7CisJCQkJCQkvLyBjYXNlIG9mIHByb2o9c3JjPWJpbiBhbmQgcmVzb3VyY2UgaXMgYSBqYXIgZmlsZSBvbiB0aGUgY2xhc3NwYXRoCisJCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQorcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSb290cyhJSmF2YU1vZGVsIG1vZGVsKSB7CisJdGhpcy5yb290cyA9IG5ldyBIYXNoTWFwKCk7CisJdGhpcy5vdGhlclJvb3RzID0gbmV3IEhhc2hNYXAoKTsKKwlJSmF2YVByb2plY3RbXSBwcm9qZWN0czsKKwl0cnkgeworCQlwcm9qZWN0cyA9ICgoSmF2YU1vZGVsKW1vZGVsKS5nZXRPbGRKYXZhUHJvamVjdHNMaXN0KCk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJLy8gbm90aGluZyBjYW4gYmUgZG9uZQorCQlyZXR1cm47CisJfQorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOworCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg7CisJCXRyeSB7CisJCQljbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gY29udGludWUgd2l0aCBuZXh0IHByb2plY3QKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoaW50IGo9IDAsIGNsYXNzcGF0aExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjbGFzc3BhdGhMZW5ndGg7IGorKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOworCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgY29udGludWU7CisJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJaWYgKHRoaXMucm9vdHMuZ2V0KHBhdGgpID09IG51bGwpIHsKKwkJCQl0aGlzLnJvb3RzLnB1dChwYXRoLCBwcm9qZWN0KTsKKwkJCX0gZWxzZSB7CisJCQkJSGFzaFNldCBzZXQgPSAoSGFzaFNldCl0aGlzLm90aGVyUm9vdHMuZ2V0KHBhdGgpOworCQkJCWlmIChzZXQgPT0gbnVsbCkgeworCQkJCQlzZXQgPSBuZXcgSGFzaFNldCgpOworCQkJCQl0aGlzLm90aGVyUm9vdHMucHV0KHBhdGgsIHNldCk7CisJCQkJfQorCQkJCXNldC5hZGQocHJvamVjdCk7CisJCQl9CisJCX0KKwl9Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElQYXRoIHBhdGgpIHsKKwlyZXR1cm4gdGhpcy5yb290cy5nZXQocGF0aCkgIT0gbnVsbDsKK30KKworcHJvdGVjdGVkIHZvaWQgdXBkYXRlSW5kZXgoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKworCWlmIChpbmRleE1hbmFnZXIgPT0gbnVsbCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKKwkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLmluZGV4QWxsKGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCQl0aGlzLmluZGV4TWFuYWdlci5kaXNjYXJkSm9icyhlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQkJCQl0aGlzLmluZGV4TWFuYWdlci5yZW1vdmVJbmRleEZhbWlseShlbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOworCQkJCQlicmVhazsKKwkJCQkvLyBOQjogVXBkYXRlIG9mIGluZGV4IGlmIHByb2plY3QgaXMgb3BlbmVkLCBjbG9zZWQsIG9yIGl0cyBqYXZhIG5hdHVyZSBpcyBhZGRlZCBvciByZW1vdmVkCisJCQkJLy8gICAgIGlzIGRvbmUgaW4gdXBkYXRlQ3VycmVudERlbHRhQW5kSW5kZXgKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJSmFyUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudDsKKwkJCQkvLyBpbmRleCBqYXIgZmlsZSBvbmx5IG9uY2UgKGlmIHRoZSByb290IGlzIGluIGl0cyBkZWNsYXJpbmcgcHJvamVjdCkKKwkJCQlJUGF0aCBqYXJQYXRoID0gcm9vdC5nZXRQYXRoKCk7CisJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKKwkJCQkJCS8vIGluZGV4IHRoZSBuZXcgamFyCisJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KGphclBhdGgsIHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKKwkJCQkJCS8vIGZpcnN0IHJlbW92ZSB0aGUgaW5kZXggc28gdGhhdCBpdCBpcyBmb3JjZWQgdG8gYmUgcmUtaW5kZXhlZAorCQkJCQkJaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4KGphclBhdGgpOworCQkJCQkJLy8gdGhlbiBpbmRleCB0aGUgamFyCisJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KGphclBhdGgsIHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKKwkJCQkJCS8vIHRoZSBqYXIgd2FzIHBoeXNpY2FsbHkgcmVtb3ZlZDogcmVtb3ZlIHRoZSBpbmRleAorCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoamFyUGF0aC50b1N0cmluZygpKTsKKwkJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4KGphclBhdGgpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKKwkJCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50OworCQkJCQl0aGlzLnVwZGF0ZVJvb3RJbmRleChyb290LCByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIiksIGRlbHRhKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBkb24ndCBicmVhayBhcyBwYWNrYWdlcyBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IGNhbiBiZSBpbmRleGVkIGJlbG93CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgorCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKKwkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBudWxsOworCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7CisJCQkJCQlwa2cgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBrZyA9IChJUGFja2FnZUZyYWdtZW50KWVsZW1lbnQ7CisJCQkJCX0KKwkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlJUmVzb3VyY2VEZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQkJCQlpZiAoImphdmEiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJCU9wZW5hYmxlIGN1ID0gKE9wZW5hYmxlKXBrZy5nZXRDb21waWxhdGlvblVuaXQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkJCQkJdGhpcy51cGRhdGVJbmRleChjdSwgY2hpbGQpOworCQkJCQkJCX0gZWxzZSBpZiAoImNsYXNzIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlPcGVuYWJsZSBjbGFzc0ZpbGUgPSAoT3BlbmFibGUpcGtnLmdldENsYXNzRmlsZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQkJCQl0aGlzLnVwZGF0ZUluZGV4KGNsYXNzRmlsZSwgY2hpbGQpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKKwkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7CisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJCUlQYXRoIGJpbmFyeUZvbGRlclBhdGggPSBlbGVtZW50LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5nZXRQYXRoKCk7CisJCQkvLyBpZiB0aGUgY2xhc3MgZmlsZSBpcyBwYXJ0IG9mIHRoZSBiaW5hcnkgb3V0cHV0LCBpdCBoYXMgYmVlbiBjcmVhdGVkIGJ5CisJCQkvLyB0aGUgamF2YSBidWlsZGVyIC0+IGlnbm9yZQorCQkJdHJ5IHsKKwkJCQlpZiAoYmluYXJ5Rm9sZGVyUGF0aC5lcXVhbHMocHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCQkvLyBubyBuZWVkIHRvIGluZGV4IGlmIHRoZSBjb250ZW50IGhhcyBub3QgY2hhbmdlZAorCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCWluZGV4TWFuYWdlci5hZGRCaW5hcnkoZmlsZSwgYmluYXJ5Rm9sZGVyUGF0aCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCWluZGV4TWFuYWdlci5yZW1vdmUoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGJpbmFyeUZvbGRlclBhdGgpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKKwkJCWZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7CisJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CisJCQkJCS8vIG5vIG5lZWQgdG8gaW5kZXggaWYgdGhlIGNvbnRlbnQgaGFzIG5vdCBjaGFuZ2VkCisJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApCisJCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQkJaW5kZXhNYW5hZ2VyLmFkZFNvdXJjZShmaWxlLCBmaWxlLmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCWluZGV4TWFuYWdlci5yZW1vdmUoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZpbGUuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJfQorfQorLyoqCisgKiBVcGFkdGVzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gcm9vdCAoYXNzdW1pbmcgaXQncyBhbiBhZGRpdGlvbiBvciBhIHJlbW92YWwpLgorICogVGhpcyBpcyBkb25lIHJlY3VzaXZlbHksIHBrZyBiZWluZyB0aGUgY3VycmVudCBwYWNrYWdlLgorICovCitwcml2YXRlIHZvaWQgdXBkYXRlUm9vdEluZGV4KElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIElQYWNrYWdlRnJhZ21lbnQgcGtnLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCXRoaXMudXBkYXRlSW5kZXgoKE9wZW5hYmxlKXBrZywgZGVsdGEpOworCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJU3RyaW5nIG5hbWUgPSBwa2cuZ2V0RWxlbWVudE5hbWUoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJSVJlc291cmNlIHJlc291cmNlID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKKwkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJU3RyaW5nIHN1YnBrZ05hbWUgPSAKKwkJCQluYW1lLmxlbmd0aCgpID09IDAgPyAKKwkJCQkJcmVzb3VyY2UuZ2V0TmFtZSgpIDogCisJCQkJCW5hbWUgKyAiLiIgKyByZXNvdXJjZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJCUlQYWNrYWdlRnJhZ21lbnQgc3VicGtnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoc3VicGtnTmFtZSk7CisJCQl0aGlzLnVwZGF0ZVJvb3RJbmRleChyb290LCBzdWJwa2csIGNoaWxkKTsKKwkJfQorCX0KK30KKy8qCisgKiBVcGRhdGUgdGhlIHJvb3RzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZSBhZGRpdGlvbiBvciB0aGUgcmVtb3ZhbCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIHJlc291cmNlLgorICovCitwcml2YXRlIHZvaWQgdXBkYXRlUm9vdHMoSVBhdGggY29udGFpbmVyUGF0aCwgSVJlc291cmNlRGVsdGEgY29udGFpbmVyRGVsdGEpIHsKKwlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucm9vdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCUlQYXRoIHBhdGggPSAoSVBhdGgpaXRlcmF0b3IubmV4dCgpOworCQlpZiAoY29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKHBhdGgpICYmICFjb250YWluZXJQYXRoLmVxdWFscyhwYXRoKSkgeworCQkJSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gY29udGFpbmVyRGVsdGEuZmluZE1lbWJlcihwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOworCQkJaWYgKHJvb3REZWx0YSA9PSBudWxsKSBjb250aW51ZTsKKwkJCUlKYXZhUHJvamVjdCByb290UHJvamVjdCA9IChJSmF2YVByb2plY3QpdGhpcy5yb290cy5nZXQocGF0aCk7CisJCQl0cnkgeworCQkJCXRoaXMudXBkYXRlQ3VycmVudERlbHRhQW5kSW5kZXgocm9vdERlbHRhLCBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09ULCByb290UHJvamVjdCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQkJSGFzaFNldCBzZXQgPSAoSGFzaFNldCl0aGlzLm90aGVyUm9vdHMuZ2V0KHBhdGgpOworCQkJaWYgKHNldCAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3Igb3RoZXJQcm9qZWN0cyA9IHNldC5pdGVyYXRvcigpOworCQkJCXdoaWxlIChvdGhlclByb2plY3RzLmhhc05leHQoKSkgeworCQkJCQlyb290UHJvamVjdCA9IChJSmF2YVByb2plY3Qpb3RoZXJQcm9qZWN0cy5uZXh0KCk7CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdFByb2plY3QpOworCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRWxlbWVudENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FbGVtZW50Q2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjE2NGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRWxlbWVudENhY2hlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuTFJVQ2FjaGU7CisKKy8qKgorICogQW4gTFJVIGNhY2hlIG9mIDxjb2RlPkphdmFFbGVtZW50czwvY29kZT4uCisgKi8KK3B1YmxpYyBjbGFzcyBFbGVtZW50Q2FjaGUgZXh0ZW5kcyBPdmVyZmxvd2luZ0xSVUNhY2hlIHsKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBlbGVtZW50IGNhY2hlIG9mIHRoZSBnaXZlbiBzaXplLgorICovCitwdWJsaWMgRWxlbWVudENhY2hlKGludCBzaXplKSB7CisJc3VwZXIoc2l6ZSk7Cit9CisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgZWxlbWVudCBjYWNoZSBvZiB0aGUgZ2l2ZW4gc2l6ZS4KKyAqLworcHVibGljIEVsZW1lbnRDYWNoZShpbnQgc2l6ZSwgaW50IG92ZXJmbG93KSB7CisJc3VwZXIoc2l6ZSwgb3ZlcmZsb3cpOworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNsb3NlZCBhbmQKKyAqIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUsIG90aGVyd2lzZSBmYWxzZS4KKyAqCisgKiA8cD5OT1RFOiB0aGlzIHRyaWdnZXJzIGFuIGV4dGVybmFsIHJlbW92YWwgb2YgdGhpcyBlbGVtZW50CisgKiBieSBjbG9zaW5nIHRoZSBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBjbG9zZShMUlVDYWNoZUVudHJ5IGVudHJ5KSB7CisJSU9wZW5hYmxlIGVsZW1lbnQgPSAoSU9wZW5hYmxlKSBlbnRyeS5fZktleTsKKwl0cnkgeworCQlpZiAoZWxlbWVudC5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvLyBXZSBtdXN0IGNsb3NlIGFuIGVudGlyZSBKYXJQYWNrYWdlRnJhZ21lbnRSb290IGF0IG9uY2UuCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudCkgeworCQkJCUphclBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ9IChKYXJQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7CisJCQkJSmFyUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHBhY2thZ2VGcmFnbWVudC5nZXRQYXJlbnQoKTsKKwkJCQlyb290LmNsb3NlKCk7CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQuY2xvc2UoKTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2lldmVyLgorCSAqLworCXByb3RlY3RlZCBMUlVDYWNoZSBuZXdJbnN0YW5jZShpbnQgc2l6ZSwgaW50IG92ZXJmbG93KSB7CisJCXJldHVybiBuZXcgRWxlbWVudENhY2hlKHNpemUsIG92ZXJmbG93KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9GYWlsZWRSZWNvbmNpbGlhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRmFpbGVkUmVjb25jaWxpYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIzMThkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRmFpbGVkUmVjb25jaWxpYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworcHVibGljIGNsYXNzIEZhaWxlZFJlY29uY2lsaWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisvKioKKyAqIEZhaWxSZWNvbmNpbGlhdGlvbkV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorICovCitwdWJsaWMgRmFpbGVkUmVjb25jaWxpYXRpb25FeGNlcHRpb24oKSB7CisJc3VwZXIoKTsKK30KKy8qKgorICogRmFpbFJlY29uY2lsaWF0aW9uRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCisgKi8KK3B1YmxpYyBGYWlsZWRSZWNvbmNpbGlhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcykgeworCXN1cGVyKHMpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSGFuZGxlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSGFuZGxlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTM2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9IYW5kbGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkphckZpbGVFbnRyeURvY3VtZW50OworCisvKioKKyAqIENyZWF0ZXMgamF2YSBlbGVtZW50IGhhbmRsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBIYW5kbGVGYWN0b3J5IHsKKworCS8qKgorCSAqIENhY2hlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSBzcGVlZCBwZXJmb3JtYW5jZS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBsYXN0UGtnRnJhZ21lbnRSb290UGF0aDsKKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGxhc3RQa2dGcmFnbWVudFJvb3Q7CisKKwkvKioKKwkgKiBDYWNoZSBwYWNrYWdlIGhhbmRsZXMgdG8gb3B0aW1pemUgbWVtb3J5LgorCSAqLworCXByaXZhdGUgTWFwIHBhY2thZ2VIYW5kbGVzOworCisJcHJpdmF0ZSBJV29ya3NwYWNlIHdvcmtzcGFjZTsKKwlwcml2YXRlIEphdmFNb2RlbCBqYXZhTW9kZWw7CisKKworCXB1YmxpYyBIYW5kbGVGYWN0b3J5KElXb3Jrc3BhY2Ugd29ya3NwYWNlKSB7CisJCXRoaXMud29ya3NwYWNlID0gd29ya3NwYWNlOworCQl0aGlzLmphdmFNb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIE9wZW5hYmxlIGhhbmRsZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoLgorCSAqIFRoZSByZXNvdXJjZSBwYXRoIGNhbiBiZSBhIHBhdGggdG8gYSBmaWxlIGluIHRoZSB3b3JrYmVuY2ggKGVnLiAvUHJvai9jb20vaWJtL2pkdC9jb3JlL0hhbmRsZUZhY3RvcnkuamF2YSkKKwkgKiBvciBhIHBhdGggdG8gYSBmaWxlIGluIGEgamFyIGZpbGUgLSBpdCB0aGVuIGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSBqYXIgZmlsZSBhbmQgdGhlIHBhdGggdG8gdGhlIGZpbGUgaW4gdGhlIGphcgorCSAqIChlZy4gYzovamRrMS4yLjIvanJlL2xpYi9ydC5qYXJ8amF2YS9sYW5nL09iamVjdC5jbGFzcyBvciAvUHJvai9ydC5qYXJ8amF2YS9sYW5nL09iamVjdC5jbGFzcykKKwkgKiBOT1RFOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcmVzb3VyY2UgcGF0aCBpcyB0aGUgdG9TdHJpbmcoKSBvZiBhbiBJUGF0aCwgCisJICogICAgICAgaS5lLiBpdCB1c2VzIHRoZSBJUGF0aC5TRVBBUkFUT1IgZm9yIGZpbGUgcGF0aAorCSAqICAgICAgICAgICAgYW5kIGl0IHVzZXMgJy8nIGZvciBlbnRyaWVzIGluIGEgemlwIGZpbGUuCisJICovCisJcHVibGljIE9wZW5hYmxlIGNyZWF0ZU9wZW5hYmxlKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKwkJaW50IHNlcGFyYXRvckluZGV4OworCQlpZiAoKHNlcGFyYXRvckluZGV4PSByZXNvdXJjZVBhdGguaW5kZXhPZihKYXJGaWxlRW50cnlEb2N1bWVudC5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IpKSA+IC0xKSB7CisJCQkvLyBwYXRoIHRvIGEgY2xhc3MgZmlsZSBpbnNpZGUgYSBqYXIKKwkJCVN0cmluZyBqYXJQYXRoPSByZXNvdXJjZVBhdGguc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KTsKKwkJCS8vIE9wdGltaXphdGlvbjogY2FjaGUgcGFja2FnZSBmcmFnbWVudCByb290IGhhbmRsZSBhbmQgcGFja2FnZSBoYW5kbGVzCisJCQlpZiAoIWphclBhdGguZXF1YWxzKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGgpKSB7CisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gdGhpcy5nZXRKYXJQa2dGcmFnbWVudFJvb3QoamFyUGF0aCk7CisJCQkJaWYgKHJvb3QgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIG51bGw7IC8vIG1hdGNoIGlzIG91dHNpZGUgY2xhc3NwYXRoCisJCQkJdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aD0gamFyUGF0aDsKKwkJCQl0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3Q9IHJvb3Q7CisJCQkJdGhpcy5wYWNrYWdlSGFuZGxlcz0gbmV3IEhhc2hNYXAoNSk7CisJCQl9CisJCQkvLyBjcmVhdGUgaGFuZGxlCisJCQlTdHJpbmcgY2xhc3NGaWxlUGF0aD0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpOworCQkJaW50IGxhc3RTbGFzaD0gY2xhc3NGaWxlUGF0aC5sYXN0SW5kZXhPZignLycpOworCQkJU3RyaW5nIHBhY2thZ2VOYW1lPSBsYXN0U2xhc2ggPiAtMSA/IGNsYXNzRmlsZVBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkucmVwbGFjZSgnLycsICcuJykgOiBJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FOworCQkJSVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnbWVudD0gKElQYWNrYWdlRnJhZ21lbnQpIHRoaXMucGFja2FnZUhhbmRsZXMuZ2V0KHBhY2thZ2VOYW1lKTsKKwkJCWlmIChwa2dGcmFnbWVudCA9PSBudWxsKSB7CisJCQkJcGtnRnJhZ21lbnQ9IHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOworCQkJCXRoaXMucGFja2FnZUhhbmRsZXMucHV0KHBhY2thZ2VOYW1lLCBwa2dGcmFnbWVudCk7CisJCQl9CisJCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZT0gcGtnRnJhZ21lbnQuZ2V0Q2xhc3NGaWxlKGNsYXNzRmlsZVBhdGguc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpKTsKKwkJCXJldHVybiAoT3BlbmFibGUpIGNsYXNzRmlsZTsKKwkJfSBlbHNlIHsKKwkJCS8vIHBhdGggdG8gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisJCQkvLyBPcHRpbWl6YXRpb246IGNhY2hlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBoYW5kbGUgYW5kIHBhY2thZ2UgaGFuZGxlcworCQkJaW50IGxlbmd0aCA9IC0xOworCQkJaWYgKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGggPT0gbnVsbCAKKwkJCQl8fCAhKHJlc291cmNlUGF0aC5zdGFydHNXaXRoKHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGgpIAorCQkJCQkmJiAobGVuZ3RoID0gdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aC5sZW5ndGgoKSkgPiAwCisJCQkJCSYmIHJlc291cmNlUGF0aC5jaGFyQXQobGVuZ3RoKSA9PSAnLycpKSB7CisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gdGhpcy5nZXRQa2dGcmFnbWVudFJvb3QocmVzb3VyY2VQYXRoKTsKKwkJCQlpZiAocm9vdCA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgKKwkJCQl0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3Q9IHJvb3Q7CisJCQkJdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290UGF0aD0gdGhpcy5sYXN0UGtnRnJhZ21lbnRSb290LmdldFBhdGgoKS50b1N0cmluZygpOworCQkJCXRoaXMucGFja2FnZUhhbmRsZXM9IG5ldyBIYXNoTWFwKDUpOworCQkJfQorCQkJLy8gY3JlYXRlIGhhbmRsZQorCQkJaW50IGxhc3RTbGFzaD0gcmVzb3VyY2VQYXRoLmxhc3RJbmRleE9mKElQYXRoLlNFUEFSQVRPUik7CisJCQlTdHJpbmcgcGFja2FnZU5hbWU9IGxhc3RTbGFzaCA+IChsZW5ndGg9IHRoaXMubGFzdFBrZ0ZyYWdtZW50Um9vdFBhdGgubGVuZ3RoKCkpID8gcmVzb3VyY2VQYXRoLnN1YnN0cmluZyhsZW5ndGggKyAxLCBsYXN0U2xhc2gpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpIDogSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsKKwkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnRnJhZ21lbnQ9IChJUGFja2FnZUZyYWdtZW50KSB0aGlzLnBhY2thZ2VIYW5kbGVzLmdldChwYWNrYWdlTmFtZSk7CisJCQlpZiAocGtnRnJhZ21lbnQgPT0gbnVsbCkgeworCQkJCXBrZ0ZyYWdtZW50PSB0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKKwkJCQl0aGlzLnBhY2thZ2VIYW5kbGVzLnB1dChwYWNrYWdlTmFtZSwgcGtnRnJhZ21lbnQpOworCQkJfQorCQkJU3RyaW5nIHNpbXBsZU5hbWU9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7CisJCQlpZiAoVXRpbC5pc0phdmFGaWxlTmFtZShzaW1wbGVOYW1lKSkgeworCQkJCUlDb21waWxhdGlvblVuaXQgdW5pdD0gcGtnRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KHNpbXBsZU5hbWUpOworCQkJCXJldHVybiAoT3BlbmFibGUpIHVuaXQ7CisJCQl9IGVsc2UgeworCQkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlPSBwa2dGcmFnbWVudC5nZXRDbGFzc0ZpbGUoc2ltcGxlTmFtZSk7CisJCQkJcmV0dXJuIChPcGVuYWJsZSkgY2xhc3NGaWxlOworCQkJfQorCQl9CisJfQorLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGphciBwYXRoLgorCSAqIFNlZSBjcmVhdGVPcGVuYWJsZSguLi4pIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBqYXIgcGF0aCBzdHJpbmcuCisJICovCisJcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXJQa2dGcmFnbWVudFJvb3QoU3RyaW5nIGphclBhdGhTdHJpbmcpIHsKKworCQlJUGF0aCBqYXJQYXRoPSBuZXcgUGF0aChqYXJQYXRoU3RyaW5nKTsKKwkJCisJCUlSZXNvdXJjZSBqYXJGaWxlPSB0aGlzLndvcmtzcGFjZS5nZXRSb290KCkuZmluZE1lbWJlcihqYXJQYXRoKTsKKwkJaWYgKGphckZpbGUgIT0gbnVsbCkgeworCQkJLy8gaW50ZXJuYWwgamFyOiBpcyBpdCBvbiB0aGUgY2xhc3NwYXRoIG9mIGl0cyBwcm9qZWN0PworCQkJLy8gIGUuZy4gb3JnLmVjbGlwc2Uuc3d0LndpbjMyL3dzL3dpbjMyL3N3dC5qYXIgCisJCQkvLyAgICAgICAgaXMgTk9UIG9uIHRoZSBjbGFzc3BhdGggb2Ygb3JnLmVjbGlwc2Uuc3d0LndpbjMyCisJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChqYXJGaWxlKTsKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXM7CisJCQl0cnkgeworCQkJCWNsYXNzcGF0aEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQlmb3IgKGludCBqPSAwLCBlbnRyeUNvdW50PSBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaiA8IGVudHJ5Q291bnQ7IGorKykgeworCQkJCQlpZiAoY2xhc3NwYXRoRW50cmllc1tqXS5nZXRQYXRoKCkuZXF1YWxzKGphclBhdGgpKSB7CisJCQkJCQlyZXR1cm4gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChqYXJGaWxlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlIGFuZCB0cnkgdG8gZmluZCBhbm90aGVyIHByb2plY3QKKwkJCX0KKwkJfQorCQkKKwkJLy8gd2FsayBhbGwgcHJvamVjdHMgYW5kIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGhhcyB0aGUgZ2l2ZW4gamFyIHBhdGggaW4gaXRzIGNsYXNzcGF0aAorCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0czsKKwkJdHJ5IHsKKwkJCXByb2plY3RzID0gdGhpcy5qYXZhTW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBqYXZhIG1vZGVsIGlzIG5vdCBhY2Nlc3NpYmxlCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKGludCBpPSAwLCBwcm9qZWN0Q291bnQ9IHByb2plY3RzLmxlbmd0aDsgaSA8IHByb2plY3RDb3VudDsgaSsrKSB7CisJCQl0cnkgeworCQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0PSAoSmF2YVByb2plY3QpcHJvamVjdHNbaV07CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcz0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaj0gMCwgZW50cnlDb3VudD0gY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGogPCBlbnRyeUNvdW50OyBqKyspIHsKKwkJCQkJaWYgKGNsYXNzcGF0aEVudHJpZXNbal0uZ2V0UGF0aCgpLmVxdWFscyhqYXJQYXRoKSkgeworCQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkgeworCQkJCQkJCS8vIGludGVybmFsIGphcgorCQkJCQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGphckZpbGUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBleHRlcm5hbCBqYXIKKwkJCQkJCQlyZXR1cm4gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAoamFyUGF0aFN0cmluZyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIEphdmFNb2RlbEV4Y2VwdGlvbiBmcm9tIGdldFJlc29sdmVkQ2xhc3NwYXRoIC0gYSBwcm9ibGVtIG9jY3VyZWQgd2hpbGUgYWNjZXNzaW5nIHByb2plY3Q6IG5vdGhpbmcgd2UgY2FuIGRvLCBpZ25vcmUKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKwkgKi8KKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBrZ0ZyYWdtZW50Um9vdChTdHJpbmcgcGF0aFN0cmluZykgeworCisJCUlQYXRoIHBhdGg9IG5ldyBQYXRoKHBhdGhTdHJpbmcpOworCQlJUHJvamVjdFtdIHByb2plY3RzPSB0aGlzLndvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJZm9yIChpbnQgaT0gMCwgbWF4PSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpIAorCQkJCQl8fCAhcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgY29udGludWU7CisJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0PSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKKwkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOworCQkJCWZvciAoaW50IGo9IDAsIHJvb3RDb3VudD0gcm9vdHMubGVuZ3RoOyBqIDwgcm9vdENvdW50OyBqKyspIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gcm9vdHNbal07CisJCQkJCWlmIChyb290LmdldFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpKSB7CisJCQkJCQlyZXR1cm4gcm9vdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vIENvcmVFeGNlcHRpb24gZnJvbSBoYXNOYXR1cmUgLSBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IGlzIGFjY2Vzc2libGUKKwkJCQkvLyBKYXZhTW9kZWxFeGNlcHRpb24gZnJvbSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyAtIGEgcHJvYmxlbSBvY2N1cmVkIHdoaWxlIGFjY2Vzc2luZyBwcm9qZWN0OiBub3RoaW5nIHdlIGNhbiBkbywgaWdub3JlCisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSUphdmFFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDg2NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSUphdmFFbGVtZW50UmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IElSZXF1ZXN0b3JOYW1lTG9va3VwLiBBcyByZXN1bHRzCisgKiBhcmUgZm91bmQgYnkgSVJlcXVlc3Rvck5hbWVMb29rdXAsIHRoZXkgYXJlIHJlcG9ydGVkIHRvIHRoaXMKKyAqIGludGVyZmFjZS4gQW4gSUphdmFFbGVtZW50UmVxdWVzdG9yIGlzIGFibGUgdG8gY2FuY2VsCisgKiBhdCBhbnkgdGltZSAoaS5lLiBzdG9wIHJlY2VpdmluZyByZXN1bHRzKSwgYnkgcmVzcG9uZGluZworICogPGNvZGU+dHJ1ZTwvY29kZT4gdG8gPGNvZGU+I2lzQ2FuY2VsbGVkPC9jb2RlPi4KKyAqLworcHVibGljIGludGVyZmFjZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgeworcHVibGljIHZvaWQgYWNjZXB0RmllbGQoSUZpZWxkIGZpZWxkKTsKK3B1YmxpYyB2b2lkIGFjY2VwdEluaXRpYWxpemVyKElJbml0aWFsaXplciBpbml0aWFsaXplcik7CitwdWJsaWMgdm9pZCBhY2NlcHRNZW1iZXJUeXBlKElUeXBlIHR5cGUpOworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKElNZXRob2QgbWV0aG9kKTsKK3B1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCk7CitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKElUeXBlIHR5cGUpOworLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgSUphdmFFbGVtZW50UmVxdWVzdG9yIGRvZXMKKyAqIG5vdCB3YW50IHRvIHJlY2VpdmUgYW55IG1vcmUgcmVzdWx0cy4KKyAqLworYm9vbGVhbiBpc0NhbmNlbGVkKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JUGF0aFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSVBhdGhSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg3M2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSVBhdGhSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworcHVibGljIGludGVyZmFjZSBJUGF0aFJlcXVlc3RvciB7CisJdm9pZCBhY2NlcHRQYXRoKFN0cmluZyBwYXRoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTFjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBAc2VlIElJbXBvcnRDb250YWluZXIKKyAqLworcHVibGljIGNsYXNzIEltcG9ydENvbnRhaW5lciBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJSW1wb3J0Q29udGFpbmVyIHsKK3Byb3RlY3RlZCBJbXBvcnRDb250YWluZXIoSUNvbXBpbGF0aW9uVW5pdCBwYXJlbnQpIHsKKwlzdXBlcihJTVBPUlRfQ09OVEFJTkVSLCBwYXJlbnQsICIiKTsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwdWJsaWMgU3RyaW5nIGdldEhhbmRsZU1lbWVudG8oKXsKKwlyZXR1cm4gKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0SGFuZGxlTWVtZW50bygpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCUFzc2VydC5pc1RydWUoZmFsc2UsIFV0aWwuYmluZCgiYXNzZXJ0LnNob3VsZE5vdEltcGxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAwOworfQorLyoqCisgKiBAc2VlIElJbXBvcnRDb250YWluZXIKKyAqLworcHVibGljIElJbXBvcnREZWNsYXJhdGlvbiBnZXRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gbmV3IEltcG9ydERlY2xhcmF0aW9uKHRoaXMsIG5hbWUpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VSZWZlcmVuY2UKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGltcG9ydHM9IGdldENoaWxkcmVuKCk7CisJSVNvdXJjZVJhbmdlIGZpcnN0UmFuZ2U9ICgoSVNvdXJjZVJlZmVyZW5jZSlpbXBvcnRzWzBdKS5nZXRTb3VyY2VSYW5nZSgpOworCUlTb3VyY2VSYW5nZSBsYXN0UmFuZ2U9ICgoSVNvdXJjZVJlZmVyZW5jZSlpbXBvcnRzW2ltcG9ydHMubGVuZ3RoIC0gMV0pLmdldFNvdXJjZVJhbmdlKCk7CisJU291cmNlUmFuZ2UgcmFuZ2U9IG5ldyBTb3VyY2VSYW5nZShmaXJzdFJhbmdlLmdldE9mZnNldCgpLCBsYXN0UmFuZ2UuZ2V0T2Zmc2V0KCkgKyBsYXN0UmFuZ2UuZ2V0TGVuZ3RoKCkgLSBmaXJzdFJhbmdlLmdldE9mZnNldCgpKTsKKwlyZXR1cm4gcmFuZ2U7Cit9CisvKioKKyAqIEltcG9ydCBjb250YWluZXJzIG9ubHkgZXhpc3QgaWYgdGhleSBoYXZlIGNoaWxkcmVuLgorICogQHNlZSBJUGFyZW50CisgKi8KK3B1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqLworcHVibGljIFN0cmluZyByZWFkYWJsZU5hbWUoKSB7CisKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7CisJaWYgKGluZm8gPT0gbnVsbCB8fCAhKGluZm8gaW5zdGFuY2VvZiBKYXZhRWxlbWVudEluZm8pKSByZXR1cm47CisJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylpbmZvKS5nZXRDaGlsZHJlbigpOworCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCSgoSmF2YUVsZW1lbnQpY2hpbGRyZW5baV0pLnRvU3RyaW5nKHRhYiwgYnVmZmVyKTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDE0NWRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworCisvKioKKyAqIEBzZWUgSUltcG9ydERlY2xhcmF0aW9uCisgKi8KKworLyogcGFja2FnZSAqLyBjbGFzcyBJbXBvcnREZWNsYXJhdGlvbiBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJSW1wb3J0RGVjbGFyYXRpb24geworCisKKy8qKgorICogQ29uc3RydWN0cyBhbiBJbXBvcnREZWNsYXJ0YWlvbiBpbiB0aGUgZ2l2ZW4gaW1wb3J0IGNvbnRhaW5lcgorICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAqLworcHJvdGVjdGVkIEltcG9ydERlY2xhcmF0aW9uKElJbXBvcnRDb250YWluZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKElNUE9SVF9ERUNMQVJBVElPTiwgcGFyZW50LCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNlcXVhbHNET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuSU1QT1JUKSAmJiBnZXRFbGVtZW50TmFtZSgpLmVxdWFscyhub2RlLmdldE5hbWUoKSk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCisgKi8KK3Byb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7CisJcmV0dXJuIEphdmFFbGVtZW50LkpFTV9JTVBPUlRERUNMQVJBVElPTjsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbXBvcnQgaXMgb24tZGVtYW5kIChlbmRzIHdpdGggIi4qIikKKyAqLworcHVibGljIGJvb2xlYW4gaXNPbkRlbWFuZCgpIHsKKwlyZXR1cm4gZk5hbWUuZW5kc1dpdGgoIi4qIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICovCitwdWJsaWMgU3RyaW5nIHJlYWRhYmxlTmFtZSgpIHsKKworCXJldHVybiBudWxsOworfQorLyoqCisgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKCJpbXBvcnQgIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYzg5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CisKKy8qKgorICogQHNlZSBJSW5pdGlhbGl6ZXIKKyAqLworCisvKiBwYWNrYWdlICovIGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgTWVtYmVyIGltcGxlbWVudHMgSUluaXRpYWxpemVyIHsKKworcHJvdGVjdGVkIEluaXRpYWxpemVyKElUeXBlIHBhcmVudCwgaW50IG9jY3VycmVuY2VDb3VudCkgeworCXN1cGVyKElOSVRJQUxJWkVSLCBwYXJlbnQsICIiKTsgLy8kTk9OLU5MUy0xJAorCS8vIDAgaXMgbm90IHZhbGlkOiB0aGlzIGZpcnN0IG9jY3VycmVuY2UgaXMgb2NjdXJyZW5jZSAxLgorCWlmIChvY2N1cnJlbmNlQ291bnQgPD0gMCkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCWZPY2N1cnJlbmNlQ291bnQgPSBvY2N1cnJlbmNlQ291bnQ7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZXF1YWxzRE9NTm9kZQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbHNET01Ob2RlKElET01Ob2RlIG5vZGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuSU5JVElBTElaRVIpIHsKKwkJcmV0dXJuIG5vZGUuZ2V0Q29udGVudHMoKS50cmltKCkuZXF1YWxzKGdldFNvdXJjZSgpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwdWJsaWMgU3RyaW5nIGdldEhhbmRsZU1lbWVudG8oKXsKKwlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcigoKEphdmFFbGVtZW50KWdldFBhcmVudCgpKS5nZXRIYW5kbGVNZW1lbnRvKCkpOworCWJ1ZmYuYXBwZW5kKGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSk7CisJYnVmZi5hcHBlbmQoZk9jY3VycmVuY2VDb3VudCk7CisJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpIHsKKwlyZXR1cm4gSmF2YUVsZW1lbnQuSkVNX0lOSVRJQUxJWkVSOworfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKGZQYXJlbnQuaGFzaENvZGUoKSwgZk9jY3VycmVuY2VDb3VudCk7Cit9CisvKioKKyAqLworcHVibGljIFN0cmluZyByZWFkYWJsZU5hbWUoKSB7CisKKwlyZXR1cm4gKChKYXZhRWxlbWVudClnZXREZWNsYXJpbmdUeXBlKCkpLnJlYWRhYmxlTmFtZSgpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24KKyAqLworcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgdGhpcykpOworfQorLyoqCisgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoIjxpbml0aWFsaXplcj4iKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIGlmIChpbmZvID09IE5PX0lORk8pIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwl9IGVsc2UgeworCQl0cnkgeworCQkJaWYgKEZsYWdzLmlzU3RhdGljKHRoaXMuZ2V0RmxhZ3MoKSkpIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJzdGF0aWMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoImluaXRpYWxpemVyIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxKYXZhTW9kZWxFeGNlcHRpb24gaW4gdG9TdHJpbmcgb2YgIiArIGdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplckVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplckVsZW1lbnRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3ZjRhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyRWxlbWVudEluZm8uamF2YQpAQCAtMCwwICsxLDE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworLyoqIAorICogRWxlbWVudCBpbmZvIGZvciBJSW5pdGlhbGl6ZXIgZWxlbWVudHMuIAorICovCisvKiBwYWNrYWdlICovIGNsYXNzIEluaXRpYWxpemVyRWxlbWVudEluZm8gZXh0ZW5kcyBNZW1iZXJFbGVtZW50SW5mbyB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTBiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQSBqYXIgZW50cnkgdGhhdCByZXByZXNlbnRzIGEgbm9uLWphdmEgcmVzb3VyY2UgZm91bmQgaW4gYSBKQVIuCisgKgorICogQHNlZSBJU3RvcmFnZQorICovCitwdWJsaWMgY2xhc3MgSmFyRW50cnlGaWxlIGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJU3RvcmFnZSB7CisJcHJpdmF0ZSBTdHJpbmcgZW50cnlOYW1lOworCXByaXZhdGUgU3RyaW5nIHppcE5hbWU7CisJcHJpdmF0ZSBJUGF0aCBwYXRoOworCQorCXB1YmxpYyBKYXJFbnRyeUZpbGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIHppcE5hbWUpeworCQl0aGlzLmVudHJ5TmFtZSA9IGVudHJ5TmFtZTsKKwkJdGhpcy56aXBOYW1lID0gemlwTmFtZTsKKwkJdGhpcy5wYXRoID0gbmV3IFBhdGgodGhpcy5lbnRyeU5hbWUpOworCX0KK3B1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCXRyeSB7CisJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmFyRW50cnlGaWxlLmdldENvbnRlbnRzKCldIENyZWF0aW5nIFppcEZpbGUgb24gIiArIHRoaXMuemlwTmFtZSk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAorCQl9CisJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuemlwTmFtZSk7IAorCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkodGhpcy5lbnRyeU5hbWUpOworCQlpZiAoemlwRW50cnkgPT0gbnVsbCl7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIHRoaXMuZW50cnlOYW1lKSk7CisJCX0KKwkJcmV0dXJuIHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oemlwRW50cnkpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVN0b3JhZ2UjZ2V0RnVsbFBhdGgKKyAqLworcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgeworCXJldHVybiB0aGlzLnBhdGg7Cit9CisvKioKKyAqIEBzZWUgSVN0b3JhZ2UjZ2V0TmFtZQorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIHRoaXMucGF0aC5sYXN0U2VnbWVudCgpOworfQorLyoqCisgKiBAc2VlIElTdG9yYWdlI2lzUmVhZE9ubHkoKQorICovCitwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIElTdG9yYWdlI2lzUmVhZE9ubHkoKQorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiSmFyRW50cnlGaWxlWyIrdGhpcy56aXBOYW1lKyI6OiIrdGhpcy5lbnRyeU5hbWUrIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDA1ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQSBwYWNrYWdlIGZyYWdtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBhY2thZ2UgZnJhZ21lbnQgZm91bmQgaW4gYSBKQVIuCisgKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50CisgKi8KK2NsYXNzIEphclBhY2thZ2VGcmFnbWVudCBleHRlbmRzIFBhY2thZ2VGcmFnbWVudCB7CisvKioKKyAqIENvbnN0cnVjdHMgYSBwYWNrYWdlIGZyYWdtZW50IHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBhIGphciBvciBhIHppcC4KKyAqLworcHJvdGVjdGVkIEphclBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKHJvb3QsIG5hbWUpOworfQorLyoqCisgKiBDb21wdXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuIENoaWxkcmVuIG9mIGphciBwYWNrYWdlIGZyYWdtZW50cworICogY2FuIG9ubHkgYmUgSUNsYXNzRmlsZSAocmVwcmVzZW50aW5nIC5jbGFzcyBmaWxlcykuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGNvbXB1dGVDaGlsZHJlbihPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8pIHsKKwlKYXJQYWNrYWdlRnJhZ21lbnRJbmZvIGpJbmZvPSAoSmFyUGFja2FnZUZyYWdtZW50SW5mbylpbmZvOworCWlmIChqSW5mby5mRW50cnlOYW1lcyAhPSBudWxsKXsKKwkJQXJyYXlMaXN0IHZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gakluZm8uZkVudHJ5TmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgY2hpbGQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKwkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gZ2V0Q2xhc3NGaWxlKGNoaWxkKTsKKwkJCXZDaGlsZHJlbi5hZGQoY2xhc3NGaWxlKTsKKwkJfQorCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbj0gbmV3IElKYXZhRWxlbWVudFt2Q2hpbGRyZW4uc2l6ZSgpXTsKKwkJdkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pOworCQlpbmZvLnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKwl9IGVsc2UgeworCQlpbmZvLnNldENoaWxkcmVuKEphdmFFbGVtZW50SW5mby5mZ0VtcHR5Q2hpbGRyZW4pOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogQ29tcHV0ZSBhbGwgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBhY2NvcmRpbmcgdG8gdGhlIGVudHJ5IG5hbWUgZm91bmQgaW4gdGhlIGphciBmaWxlLgorICovCisvKiBwYWNrYWdlICovIHZvaWQgY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoU3RyaW5nW10gcmVzTmFtZXMsIEphclBhY2thZ2VGcmFnbWVudEluZm8gaW5mbywgU3RyaW5nIHppcE5hbWUpIHsKKwlpZiAocmVzTmFtZXMgPT0gbnVsbCkgeworCQlpbmZvLnNldE5vbkphdmFSZXNvdXJjZXMobnVsbCk7CisJCXJldHVybjsKKwl9CisJaW50IG1heCA9IHJlc05hbWVzLmxlbmd0aDsKKwlPYmplY3RbXSByZXMgPSBuZXcgT2JqZWN0W21heF07CisJaW50IGluZGV4ID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCVN0cmluZyByZXNOYW1lID0gcmVzTmFtZXNbaV07CisJCS8vIGNvbnNpZGVyIHRoYXQgYSAuamF2YSBmaWxlIGlzIG5vdCBhIG5vbi1qYXZhIHJlc291cmNlIChzZWUgYnVnIDEyMjQ2IFBhY2thZ2VzIHZpZXcgc2hvd3MgLmNsYXNzIGFuZCAuamF2YSBmaWxlcyB3aGVuIEpBUiBoYXMgc291cmNlKQorCQlpZiAoIXJlc05hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCisJCQlpZiAoIXRoaXMuaXNEZWZhdWx0UGFja2FnZSgpKSB7CisJCQkJcmVzTmFtZSA9IHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIHJlc05hbWU7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQkJcmVzW2luZGV4KytdID0gbmV3IEphckVudHJ5RmlsZShyZXNOYW1lLCB6aXBOYW1lKTsKKwkJfQorCX0gCisJaWYgKGluZGV4ICE9IG1heCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHJlcywgMCwgcmVzID0gbmV3IE9iamVjdFtpbmRleF0sIDAsIGluZGV4KTsKKwl9CisJaW5mby5zZXROb25KYXZhUmVzb3VyY2VzKHJlcyk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBqYXZhIHJlc291cmNlLgorICogUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiAoKEphclBhY2thZ2VGcmFnbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmNvbnRhaW5zSmF2YVJlc291cmNlcygpOworfQorLyoqCisgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnQKKyAqLworcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudHMsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCB0aGlzKSk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQKKyAqLworcHJvdGVjdGVkIE9wZW5hYmxlRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oKSB7CisJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRJbmZvKCk7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudAorICovCitwdWJsaWMgSUNsYXNzRmlsZVtdIGdldENsYXNzRmlsZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKENMQVNTX0ZJTEUpOworCUlDbGFzc0ZpbGVbXSBhcnJheT0gbmV3IElDbGFzc0ZpbGVbbGlzdC5zaXplKCldOworCWxpc3QudG9BcnJheShhcnJheSk7CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBBIGphciBwYWNrYWdlIGZyYWdtZW50IG5ldmVyIGNvbnRhaW5zIGNvbXBpbGF0aW9uIHVuaXRzLgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50CisgKi8KK3B1YmxpYyBJQ29tcGlsYXRpb25Vbml0W10gZ2V0Q29tcGlsYXRpb25Vbml0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBmZ0VtcHR5Q29tcGlsYXRpb25Vbml0TGlzdDsKK30KKy8qKgorICogQSBwYWNrYWdlIGZyYWdtZW50IGluIGEgamFyIGhhcyBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgorICoKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJUmVzb3VyY2UgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCisgKi8KK3B1YmxpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHRoaXMuaXNEZWZhdWx0UGFja2FnZSgpKSB7CisJCS8vIFdlIGRvbid0IHdhbnQgdG8gc2hvdyBub24gamF2YSByZXNvdXJjZXMgb2YgdGhlIGRlZmF1bHQgcGFja2FnZSAoc2VlIFBSICMxRzU4TkI4KQorCQlyZXR1cm4gSmF2YUVsZW1lbnRJbmZvLk5PX05PTl9KQVZBX1JFU09VUkNFUzsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpcy5zdG9yZWROb25KYXZhUmVzb3VyY2VzKCk7CisJfQorfQorLyoqCisgKiBKYXJzIGFuZCBqYXIgZW50cmllcyBhcmUgYWxsIHJlYWQgb25seQorICovCitwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIE9wZW5hYmxlI29wZW5XaGVuQ2xvc2VkKCkKKyAqLworcHJvdGVjdGVkIHZvaWQgb3BlbldoZW5DbG9zZWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJLy8gT3BlbiBteSBqYXIKKwlnZXRPcGVuYWJsZVBhcmVudCgpLm9wZW4ocG0pOworfQorLyoqCisgKiBBIHBhY2thZ2UgZnJhZ21lbnQgaW4gYW4gYXJjaGl2ZSBjYW5ub3QgcmVmcmVzaCBpdHMgY2hpbGRyZW4uCisgKi8KK3B1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKKwkvLyBkbyBub3RoaW5nCit9CisvKgorICogQHNlZSBKYXZhRWxlbWVudCNyb290ZWRBdChJSmF2YVByb2plY3QpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgcm9vdGVkQXQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwlyZXR1cm4KKwkJbmV3IEphclBhY2thZ2VGcmFnbWVudCgKKwkJCShJUGFja2FnZUZyYWdtZW50Um9vdCkoKEphdmFFbGVtZW50KWZQYXJlbnQpLnJvb3RlZEF0KHByb2plY3QpLCAKKwkJCWZOYW1lKTsKK30KK3Byb3RlY3RlZCBPYmplY3RbXSBzdG9yZWROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuICgoSmFyUGFja2FnZUZyYWdtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZ2V0Tm9uSmF2YVJlc291cmNlcygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEVsZW1lbnQgaW5mbyBmb3IgSmFyUGFja2FnZUZyYWdtZW50cy4gIENhY2hlcyB0aGUgemlwIGVudHJ5IG5hbWVzCisgKiBvZiB0aGUgdHlwZXMgKC5jbGFzcyBmaWxlcykgb2YgdGhlIEphclBhY2thZ2VGcmFnbWVudC4gIFRoZSBlbnRyaWVzCisgKiBhcmUgdXNlZCB0byBjb21wdXRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgSmFyUGFja2FnZUZyYWdtZW50LgorICovCitjbGFzcyBKYXJQYWNrYWdlRnJhZ21lbnRJbmZvIGV4dGVuZHMgUGFja2FnZUZyYWdtZW50SW5mbyB7CisJLyoqCisJICogVGhlIG5hbWVzIG9mIHRoZSB6aXAgZW50cmllcyB0aGF0IGFyZSB0aGUgY2xhc3MgZmlsZXMgYXNzb2NpYXRlZAorCSAqIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IGluZm8gaW4gdGhlIEpBUiBmaWxlIG9mIHRoZSBKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby4KKwkgKi8KKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZFbnRyeU5hbWVzOworLyoqCisgKi8KK2Jvb2xlYW4gY29udGFpbnNKYXZhUmVzb3VyY2VzKCkgeworCXJldHVybiBmRW50cnlOYW1lcyAhPSBudWxsICYmIGZFbnRyeU5hbWVzLnNpemUoKSAhPSAwOworfQorLyoqCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgorICovCitPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgeworCXJldHVybiBmTm9uSmF2YVJlc291cmNlczsKK30KKy8qKgorICogU2V0IHRoZSBuYW1lcyBvZiB0aGUgemlwIGVudHJpZXMgdGhhdCBhcmUgdGhlIHR5cGVzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IGluZm8gaW4gdGhlIEpBUiBmaWxlIG9mIHRoZSBKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0RW50cnlOYW1lcyhBcnJheUxpc3QgZW50cmllcykgeworCWZFbnRyeU5hbWVzID0gZW50cmllczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI4ZjAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCkBAIC0wLDAgKzEsNjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgLmphciBvciAuemlwLgorICoKKyAqIDxwPk5PVEU6IFRoZSBvbmx5IHZpc2libGUgZW50cmllcyBmcm9tIGEgLmphciBvciAuemlwIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorICogYXJlIC5jbGFzcyBmaWxlcy4KKyAqIDxwPk5PVEU6IEEgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgcmVzb3VyY2UuCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdAorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbworICovCitwdWJsaWMgY2xhc3MgSmFyUGFja2FnZUZyYWdtZW50Um9vdCBleHRlbmRzIFBhY2thZ2VGcmFnbWVudFJvb3QgeworCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gTk9fU1RSSU5HUyA9IG5ldyBTdHJpbmdbMF07CisJcHVibGljIGZpbmFsIHN0YXRpYyBBcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKioKKwkgKiBUaGUgcGF0aCB0byB0aGUgamFyIGZpbGUKKwkgKiAoYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBpZiB0aGUgamFyIGlzIGludGVybmFsLAorCSAqIG9yIGFuIE9TIHBhdGggaWYgdGhlIGphciBpcyBleHRlcm5hbCkKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSVBhdGggamFyUGF0aDsKKworCS8qKgorCSAqIFRoZSBkZWxpbWl0ZXIgYmV0d2VlbiB0aGUgemlwIHBhdGggYW5kIHNvdXJjZSBwYXRoIGluIHRoZQorCSAqIGF0dGFjaG1lbnQgc2VydmVyIHByb3BlcnR5LgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhciBBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUj0gJyonOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIG1ldGEtaW5mIGRpcmVjdG9yeSBub3QgdG8gYmUgaW5jbHVkZWQgYXMgYSAKKwkgKiBqYXIgcGFja2FnZSBmcmFnbWVudC4KKwkgKiBAc2VlICNjb21wdXRlSmFyQ2hpbGRyZW4KKwkgKi8KKwkvL3Byb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFfSU5GX05BTUUgPSAiTUVUQS1JTkYvIjsKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCByb290IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBKYXZhIHBhY2thZ2UgZGlyZWN0b3J5IGhpZXJhcmNoeSAKKwkgKiBiYXNlZCBvbiBhIEpBUiBmaWxlIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYW5kCisJICogZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIEphclBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIGphclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKG51bGwsIHByb2plY3QsIGphclBhdGgpOworCQl0aGlzLmphclBhdGggPSBuZXcgUGF0aChqYXJQYXRoKTsKKwl9CisJLyoqCisJICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkgCisJICogYmFzZWQgb24gYSBKQVIgZmlsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSmFyUGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCXN1cGVyKHJlc291cmNlLCBwcm9qZWN0KTsKKwkJdGhpcy5qYXJQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwl9CisJLyoqCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorCSAqLworCXB1YmxpYyB2b2lkIGF0dGFjaFNvdXJjZShJUGF0aCB6aXBQYXRoLCBJUGF0aCByb290UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXZlcmlmeUF0dGFjaFNvdXJjZSh6aXBQYXRoKTsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVsZW1lbnQuYXR0YWNoaW5nU291cmNlIiksIDIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlTb3VyY2VNYXBwZXIgbWFwcGVyPSBudWxsOworCQkJU291cmNlTWFwcGVyIG9sZE1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7CisJCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCk7CisJCQlib29sZWFuIHJvb3ROZWVkc1RvQmVDbG9zZWQ9IGZhbHNlOworCisJCQlpZiAoemlwUGF0aCA9PSBudWxsKSB7CisJCQkJLy9zb3VyY2UgYmVpbmcgZGV0YWNoZWQKKwkJCQlyb290TmVlZHNUb0JlQ2xvc2VkPSB0cnVlOworCQkJLyogRGlzYWJsZSBkZWx0YXMgKHNlZSAxR0RUVVNEKQorCQkJCS8vIGZpcmUgYSBkZWx0YSB0byBub3RpZnkgdGhlIFVJIGFib3V0IHRoZSBzb3VyY2UgZGV0YWNoZW1lbnQuCisJCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJCUphdmFNb2RlbCBtb2RlbCA9IChKYXZhTW9kZWwpIGdldEphdmFNb2RlbCgpOworCQkJCUphdmFFbGVtZW50RGVsdGEgYXR0YWNoZWRTb3VyY2VEZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKG1vZGVsKTsKKwkJCQlhdHRhY2hlZFNvdXJjZURlbHRhIC5zb3VyY2VEZXRhY2hlZCh0aGlzKTsgLy8gdGhpcyB3b3VsZCBiZSBhIEphclBhY2thZ2VGcmFnbWVudFJvb3QKKwkJCQltYW5hZ2VyLnJlZ2lzdGVyUmVzb3VyY2VEZWx0YShhdHRhY2hlZFNvdXJjZURlbHRhICk7CisJCQkJbWFuYWdlci5maXJlKCk7IC8vIG1heWJlIHlvdSB3YW50IHRvIGZpcmUgdGhlIGNoYW5nZSBsYXRlci4gTGV0IHVzIGtub3cgYWJvdXQgaXQuCisJCQkqLworCQkJfSBlbHNlIHsKKwkJCS8qCisJCQkJLy8gZmlyZSBhIGRlbHRhIHRvIG5vdGlmeSB0aGUgVUkgYWJvdXQgdGhlIHNvdXJjZSBhdHRhY2hlbWVudC4KKwkJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSAoSmF2YU1vZGVsTWFuYWdlcikgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQkJSmF2YU1vZGVsIG1vZGVsID0gKEphdmFNb2RlbCkgZ2V0SmF2YU1vZGVsKCk7CisJCQkJSmF2YUVsZW1lbnREZWx0YSBhdHRhY2hlZFNvdXJjZURlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEobW9kZWwpOworCQkJCWF0dGFjaGVkU291cmNlRGVsdGEgLnNvdXJjZUF0dGFjaGVkKHRoaXMpOyAvLyB0aGlzIHdvdWxkIGJlIGEgSmFyUGFja2FnZUZyYWdtZW50Um9vdAorCQkJCW1hbmFnZXIucmVnaXN0ZXJSZXNvdXJjZURlbHRhKGF0dGFjaGVkU291cmNlRGVsdGEgKTsKKwkJCQltYW5hZ2VyLmZpcmUoKTsgLy8gbWF5YmUgeW91IHdhbnQgdG8gZmlyZSB0aGUgY2hhbmdlIGxhdGVyLiBMZXQgdXMga25vdyBhYm91dCBpdC4KKwkJCSAqLworCisJCQkJLy9jaGVjayBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBhdHRhY2htZW50CisJCQkJSVBhdGggc3RvcmVkWmlwUGF0aD0gZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwkJCQlJUGF0aCBzdG9yZWRSb290UGF0aD0gZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7CisJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCQl9CisJCQkJaWYgKHN0b3JlZFppcFBhdGggIT0gbnVsbCkgeworCQkJCQlpZiAoIShzdG9yZWRaaXBQYXRoLmVxdWFscyh6aXBQYXRoKSAmJiByb290UGF0aC5lcXVhbHMoc3RvcmVkUm9vdFBhdGgpKSkgeworCQkJCQkJcm9vdE5lZWRzVG9CZUNsb3NlZD0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKHppcFBhdGguaXNBYnNvbHV0ZSgpICYmIHdvcmtzcGFjZS5nZXRSb290KCkuZmluZE1lbWJlcih6aXBQYXRoKSAhPSBudWxsKSB8fCAhemlwUGF0aC5pc0Fic29sdXRlKCkpIHsKKwkJCQkJLy8gaW50ZXJuYWwgdG8gdGhlIHdvcmtiZW5jaAorCQkJCQkvLyBhIHJlc291cmNlCisJCQkJCUlSZXNvdXJjZSB6aXBGaWxlPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoemlwUGF0aCk7CisJCQkJCWlmICh6aXBGaWxlID09IG51bGwpIHsKKwkJCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQkJCX0KKwkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwgemlwUGF0aCkpOworCQkJCQl9CisJCQkJCWlmICghKHppcEZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkgeworCQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCQkJCW1vbml0b3IuZG9uZSgpOworCQkJCQkJfQorCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCB6aXBQYXRoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJbWFwcGVyPSBuZXcgU291cmNlTWFwcGVyKHppcFBhdGgsIHJvb3RQYXRoLnRvT1NTdHJpbmcoKSk7CisJCQl9CisJCQlzZXRTb3VyY2VNYXBwZXIobWFwcGVyKTsKKwkJCWlmICh6aXBQYXRoID09IG51bGwpIHsKKwkJCQlzZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkobnVsbCk7IC8vcmVtb3ZlIHRoZSBwcm9wZXJ0eQorCQkJfSBlbHNlIHsKKwkJCQkvL3NldCB0aGUgcHJvcGVydHkgdG8gdGhlIHBhdGggb2YgdGhlIG1hcHBlZCB6aXAKKwkJCQlzZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoemlwUGF0aC50b1N0cmluZygpICsgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIgKyByb290UGF0aC50b1N0cmluZygpKTsKKwkJCX0KKwkJCWlmIChyb290TmVlZHNUb0JlQ2xvc2VkKSB7CisJCQkJaWYgKG9sZE1hcHBlciAhPSBudWxsKSB7CisJCQkJCW9sZE1hcHBlci5jbG9zZSgpOworCQkJCX0KKwkJCQlCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEJ1ZmZlck1hbmFnZXIuZ2V0RGVmYXVsdEJ1ZmZlck1hbmFnZXIoKTsKKwkJCQlFbnVtZXJhdGlvbiBvcGVuQnVmZmVycz0gbWFuYWdlci5nZXRPcGVuQnVmZmVycygpOworCQkJCXdoaWxlIChvcGVuQnVmZmVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCQlJQnVmZmVyIGJ1ZmZlcj0gKElCdWZmZXIpIG9wZW5CdWZmZXJzLm5leHRFbGVtZW50KCk7CisJCQkJCUlPcGVuYWJsZSBwb3NzaWJsZUphck1lbWJlcj0gYnVmZmVyLmdldE93bmVyKCk7CisJCQkJCWlmIChpc0FuY2VzdG9yT2YoKElKYXZhRWxlbWVudCkgcG9zc2libGVKYXJNZW1iZXIpKSB7CisJCQkJCQlidWZmZXIuY2xvc2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShudWxsKTsgLy8gbG9vc2UgaW5mbyAtIHdpbGwgYmUgcmVjb21wdXRlZAorCQkJdGhyb3cgZTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfQorCX0KKwkvKioKKwkgKiBDbG9zZSB0aGUgYXNzb2NpYXRlZCBKQVIgZmlsZSBzdG9yZWQgaW4gdGhlIGluZm8gb2YgdGhpcyBlbGVtZW50LiBJZgorCSAqIHRoaXMgamFyIGhhcyBhbiBhc3NvY2lhdGVkIFpJUCBzb3VyY2UgYXR0YWNobWVudCwgY2xvc2UgaXQgdG9vLgorCSAqCisJICogQHNlZSBJT3BlbmFibGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjbG9zaW5nKE9iamVjdCBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJU291cmNlTWFwcGVyIG1hcHBlcj0gZ2V0U291cmNlTWFwcGVyKCk7CisJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJbWFwcGVyLmNsb3NlKCk7CisJCX0KKwkJc3VwZXIuY2xvc2luZyhpbmZvKTsKKwl9CisJLyoqCisJICogQ29tcHV0ZSB0aGUgcGFja2FnZSBmcmFnbWVudCBjaGlsZHJlbiBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KKwkgKiBUaGVzZSBhcmUgYWxsIG9mIHRoZSBkaXJlY3RvcnkgemlwIGVudHJpZXMsIGFuZCBhbnkgZGlyZWN0b3JpZXMgaW1wbGllZAorCSAqIGJ5IHRoZSBwYXRoIG9mIGNsYXNzIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgamFyIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290LgorCSAqIEhhcyB0aGUgc2lkZSBlZmZlY3Qgb2Ygb3BlbmluZyB0aGUgcGFja2FnZSBmcmFnbWVudCBjaGlsZHJlbi4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlQ2hpbGRyZW4oT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJQXJyYXlMaXN0IHZDaGlsZHJlbj0gbmV3IEFycmF5TGlzdCgpOworCQljb21wdXRlSmFyQ2hpbGRyZW4oKEphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBpbmZvLCB2Q2hpbGRyZW4pOworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbj0gbmV3IElKYXZhRWxlbWVudFt2Q2hpbGRyZW4uc2l6ZSgpXTsKKwkJdkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pOworCQlpbmZvLnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKwkJcmV0dXJuIHRydWU7CisJfQorLyoqCisgKiBEZXRlcm1pbmUgYWxsIG9mIHRoZSBwYWNrYWdlIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisgKiBDYWNoZSB0aGUgemlwIGVudHJpZXMgZm9yIGVhY2ggcGFja2FnZSBmcmFnbWVudCBpbiB0aGUgaW5mbyBmb3IgdGhlIHBhY2thZ2UgZnJhZ21lbnQuCisgKiBUaGUgcGFja2FnZSBmcmFnbWVudCBjaGlsZHJlbiBhcmUgYWxsIG9wZW5lZC4KKyAqIEFkZCBhbGwgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIHRvIHZDaGlsZHJlbi4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBUaGUgcmVzb3VyY2UgKHRoZSBqYXIpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBkb2VzIG5vdCBleGlzdAorICovCitwcm90ZWN0ZWQgdm9pZCBjb21wdXRlSmFyQ2hpbGRyZW4oSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8gaW5mbywgQXJyYXlMaXN0IHZDaGlsZHJlbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJZmluYWwgaW50IEpBVkEgPSAwOworCWZpbmFsIGludCBOT05fSkFWQSA9IDE7CisJWmlwRmlsZSBqYXI9IG51bGw7CisJdHJ5IHsKKwkJamFyPSBnZXRKYXIoKTsKKworCQlpZiAoaXNFeHRlcm5hbCgpKXsKKwkJCS8vIHJlbWVtYmVyIHRoZSB0aW1lc3RhbXAgb2YgdGhpcyBsaWJyYXJ5CisJCQlsb25nIHRpbWVzdGFtcCA9IERlbHRhUHJvY2Vzc29yLmdldFRpbWVTdGFtcChuZXcgRmlsZShnZXRQYXRoKCkudG9PU1N0cmluZygpKSk7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVByb2Nlc3Nvci5leHRlcm5hbFRpbWVTdGFtcHMucHV0KGdldFBhdGgoKSwgbmV3IExvbmcodGltZXN0YW1wKSk7CQkJCisJCX0KKworCQlIYXNoTWFwIHBhY2thZ2VGcmFnVG9UeXBlcz0gbmV3IEhhc2hNYXAoKTsKKworCQkvLyBhbHdheXMgY3JlYXRlIHRoZSBkZWZhdWx0IHBhY2thZ2UKKwkJcGFja2FnZUZyYWdUb1R5cGVzLnB1dChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FLCBuZXcgQXJyYXlMaXN0W10geyBFTVBUWV9MSVNULCBFTVBUWV9MSVNUIH0pOworCisJCWZvciAoRW51bWVyYXRpb24gZT0gamFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKwkJCVppcEVudHJ5IG1lbWJlcj0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisJCQlTdHJpbmcgZW50cnlOYW1lPSBtZW1iZXIuZ2V0TmFtZSgpOworCisJCQlpZiAobWVtYmVyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkKKwkJCQlpbnQgbGFzdCA9IGVudHJ5TmFtZS5sZW5ndGgoKSAtIDE7CisJCQkJZW50cnlOYW1lPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJCWVudHJ5TmFtZT0gZW50cnlOYW1lLnJlcGxhY2UoJy8nLCAnLicpOworCisJCQkJLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgJiBhbGwgb2YgaXRzIHBhcmVudCBwYWNrYWdlcworCQkJCXdoaWxlICh0cnVlKSB7CisJCQkJCS8vIGV4dHJhY3QgdGhlIHBhY2thZ2UgbmFtZQorCQkJCQlpZiAocGFja2FnZUZyYWdUb1R5cGVzLmNvbnRhaW5zS2V5KGVudHJ5TmFtZSkpIGJyZWFrOworCQkJCQlwYWNrYWdlRnJhZ1RvVHlwZXMucHV0KGVudHJ5TmFtZSwgbmV3IEFycmF5TGlzdFtdIHsgRU1QVFlfTElTVCwgRU1QVFlfTElTVCB9KTsKKwkJCQkJCisJCQkJCWlmICgobGFzdCA9IGVudHJ5TmFtZS5sYXN0SW5kZXhPZignLicpKSA8IDApIGJyZWFrOworCQkJCQllbnRyeU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy9zdG9yZSB0aGUgY2xhc3MgZmlsZSAvIG5vbi1qYXZhIHJzYyBlbnRyeSBuYW1lIHRvIGJlIGNhY2hlZCBpbiB0aGUgYXBwcm9wcmlhdGUgcGFja2FnZSBmcmFnbWVudAorCQkJCS8vemlwIGVudHJpZXMgb25seSB1c2UgJy8nCisJCQkJaW50IGxhc3RTZXBhcmF0b3I9IGVudHJ5TmFtZS5sYXN0SW5kZXhPZignLycpOworCQkJCVN0cmluZyBwYWNrYWdlTmFtZTsKKwkJCQlTdHJpbmcgZmlsZU5hbWU7CisJCQkJaWYgKGxhc3RTZXBhcmF0b3IgIT0gLTEpIHsgLy9ub3QgaW4gdGhlIGRlZmF1bHQgcGFja2FnZQorCQkJCQllbnRyeU5hbWU9IGVudHJ5TmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKKwkJCQkJZmlsZU5hbWU9IGVudHJ5TmFtZS5zdWJzdHJpbmcobGFzdFNlcGFyYXRvciArIDEpOworCQkJCQlwYWNrYWdlTmFtZT0gZW50cnlOYW1lLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9yKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmaWxlTmFtZSA9IGVudHJ5TmFtZTsKKwkJCQkJcGFja2FnZU5hbWUgPSAgSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsKKwkJCQl9CisJCQkJCisJCQkJLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgJiBhbGwgb2YgaXRzIHBhcmVudCBwYWNrYWdlcworCQkJCVN0cmluZyBjdXJyZW50UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKwkJCQl3aGlsZSAodHJ1ZSkgeworCQkJCQkvLyBleHRyYWN0IHRoZSBwYWNrYWdlIG5hbWUKKwkJCQkJaWYgKHBhY2thZ2VGcmFnVG9UeXBlcy5jb250YWluc0tleShjdXJyZW50UGFja2FnZU5hbWUpKSBicmVhazsKKwkJCQkJcGFja2FnZUZyYWdUb1R5cGVzLnB1dChjdXJyZW50UGFja2FnZU5hbWUsIG5ldyBBcnJheUxpc3RbXSB7IEVNUFRZX0xJU1QsIEVNUFRZX0xJU1QgfSk7CisJCQkJCQorCQkJCQlpbnQgbGFzdDsKKwkJCQkJaWYgKChsYXN0ID0gY3VycmVudFBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCcuJykpIDwgMCkgYnJlYWs7CisJCQkJCWN1cnJlbnRQYWNrYWdlTmFtZSA9IGN1cnJlbnRQYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdCk7CisJCQkJfQorCQkJCS8vIGFkZCBjbGFzc2ZpbGUgaW5mbyBhbW9uZ3N0IGNoaWxkcmVuCisJCQkJQXJyYXlMaXN0W10gY2hpbGRyZW4gPSAoQXJyYXlMaXN0W10pIHBhY2thZ2VGcmFnVG9UeXBlcy5nZXQocGFja2FnZU5hbWUpOworCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShlbnRyeU5hbWUpKSB7CisJCQkJCWlmIChjaGlsZHJlbltKQVZBXSA9PSBFTVBUWV9MSVNUKSBjaGlsZHJlbltKQVZBXSA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJY2hpbGRyZW5bSkFWQV0uYWRkKGZpbGVOYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY2hpbGRyZW5bTk9OX0pBVkFdID09IEVNUFRZX0xJU1QpIGNoaWxkcmVuW05PTl9KQVZBXSA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJY2hpbGRyZW5bTk9OX0pBVkFdLmFkZChmaWxlTmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vbG9vcCB0aHJvdWdoIGFsbCBvZiByZWZlcmVuY2VkIHBhY2thZ2VzLCBjcmVhdGluZyBwYWNrYWdlIGZyYWdtZW50cyBpZiBuZWNlc3NhcnkKKwkJLy8gYW5kIGNhY2hlIHRoZSBlbnRyeSBuYW1lcyBpbiB0aGUgaW5mb3MgY3JlYXRlZCBmb3IgdGhvc2UgcGFja2FnZSBmcmFnbWVudHMKKwkJSXRlcmF0b3IgcGFja2FnZXMgPSBwYWNrYWdlRnJhZ1RvVHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKHBhY2thZ2VzLmhhc05leHQoKSkgeworCQkJU3RyaW5nIHBhY2tOYW1lID0gKFN0cmluZykgcGFja2FnZXMubmV4dCgpOworCQkJCisJCQlBcnJheUxpc3RbXSBlbnRyaWVzPSAoQXJyYXlMaXN0W10pIHBhY2thZ2VGcmFnVG9UeXBlcy5nZXQocGFja05hbWUpOworCQkJSmFyUGFja2FnZUZyYWdtZW50IHBhY2tGcmFnPSAoSmFyUGFja2FnZUZyYWdtZW50KSBnZXRQYWNrYWdlRnJhZ21lbnQocGFja05hbWUpOworCQkJSmFyUGFja2FnZUZyYWdtZW50SW5mbyBmcmFnSW5mbz0gKEphclBhY2thZ2VGcmFnbWVudEluZm8pIHBhY2tGcmFnLmNyZWF0ZUVsZW1lbnRJbmZvKCk7CisJCQlpZiAoZW50cmllc1swXS5zaXplKCkgPiAwKXsKKwkJCQlmcmFnSW5mby5zZXRFbnRyeU5hbWVzKGVudHJpZXNbSkFWQV0pOworCQkJfQorCQkJaW50IHJlc0xlbmd0aD0gZW50cmllc1tOT05fSkFWQV0uc2l6ZSgpOworCQkJaWYgKHJlc0xlbmd0aCA9PSAwKSB7CisJCQkJcGFja0ZyYWcuY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoTk9fU1RSSU5HUywgZnJhZ0luZm8sIGphci5nZXROYW1lKCkpOworCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmdbXSByZXNOYW1lcz0gbmV3IFN0cmluZ1tyZXNMZW5ndGhdOworCQkJCWVudHJpZXNbTk9OX0pBVkFdLnRvQXJyYXkocmVzTmFtZXMpOworCQkJCXBhY2tGcmFnLmNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKHJlc05hbWVzLCBmcmFnSW5mbywgamFyLmdldE5hbWUoKSk7CisJCQl9CisJCQlwYWNrRnJhZy5jb21wdXRlQ2hpbGRyZW4oZnJhZ0luZm8pOworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucHV0SW5mbyhwYWNrRnJhZywgZnJhZ0luZm8pOworCQkJdkNoaWxkcmVuLmFkZChwYWNrRnJhZyk7CisJCX0KKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwl9IGZpbmFsbHkgeworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jbG9zZVppcEZpbGUoamFyKTsKKwl9Cit9CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBlbGVtZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgT3BlbmFibGVFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbygpIHsKKwkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbygpOworCX0KKwkvKioKKwkgKiBBIEphciBpcyBhbHdheXMgS19CSU5BUlkuCisJICoKKwkgKiBAZXhjZXB0aW9uIE5vdFByZXNlbnRFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgYW5kIHJvb3QgZG8KKwkgKiAgICAgIG5vdCBleGlzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGRldGVybWluZUtpbmQoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGFuZGxlIHJlcHJlc2VudHMgdGhlIHNhbWUgamFyCisJICogYXMgdGhlIGdpdmVuIGhhbmRsZS4gVHdvIGphcnMgYXJlIGVxdWFsIGlmIHRoZXkgc2hhcmUKKwkgKiB0aGUgc2FtZSB6aXAgZmlsZS4KKwkgKgorCSAqIEBzZWUgT2JqZWN0I2VxdWFscworCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAodGhpcyA9PSBvKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvIGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgeworCQkJSmFyUGFja2FnZUZyYWdtZW50Um9vdCBvdGhlcj0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIG87CisJCQlyZXR1cm4gdGhpcy5qYXJQYXRoLmVxdWFscyhvdGhlci5qYXJQYXRoKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorcHVibGljIElDbGFzc3BhdGhFbnRyeSBmaW5kU291cmNlQXR0YWNobWVudFJlY29tbWVuZGF0aW9uKCkgeworCisJdHJ5IHsKKworCQlJUGF0aCByb290UGF0aCA9IHRoaXMuZ2V0UGF0aCgpOworCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7CisJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQkKKwkJLy8gdHJ5IG9uIGVuY2xvc2luZyBwcm9qZWN0IGZpcnN0CisJCUphdmFQcm9qZWN0IHBhcmVudFByb2plY3QgPSAoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCk7CisJCXRyeSB7CisJCQllbnRyeSA9IHBhcmVudFByb2plY3QuZ2V0Q2xhc3NwYXRoRW50cnlGb3Iocm9vdFBhdGgpOworCQkJaWYgKGVudHJ5ICE9IG51bGwpeworCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIHRydWUpOworCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSl7CisJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHRhcmdldDsKKwkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpIHx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKXsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSl7CisJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0OworCQkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQkJCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi5qYXIiKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKXsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQl9CisJCQorCQkvLyBpdGVyYXRlIG92ZXIgYWxsIHByb2plY3RzCisJCUlKYXZhTW9kZWwgbW9kZWwgPSBnZXRKYXZhTW9kZWwoKTsKKwkJSUphdmFQcm9qZWN0W10galByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBqUHJvamVjdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJSmF2YVByb2plY3QgalByb2plY3QgPSAoSmF2YVByb2plY3QpIGpQcm9qZWN0c1tpXTsKKwkJCWlmIChqUHJvamVjdCA9PSBwYXJlbnRQcm9qZWN0KSBjb250aW51ZTsgLy8gYWxyZWFkeSBkb25lCisJCQl0cnkgeworCQkJCWVudHJ5ID0galByb2plY3QuZ2V0Q2xhc3NwYXRoRW50cnlGb3Iocm9vdFBhdGgpOworCQkJCWlmIChlbnRyeSAhPSBudWxsKXsKKwkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgdHJ1ZSk7CisJCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSl7CisJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB0YXJnZXQ7CisJCQkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQkJCQkJaWYgKFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuamFyIikgfHwgVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi56aXAiKSl7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXJldHVybiBlbnRyeTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKXsKKwkJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0OworCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJCQkJCWlmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIpIHx8IFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuemlwIikpeyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJCX0KKwkJfQorCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCX0KKworCXJldHVybiBudWxsOworfQorCisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgWmlwRmlsZSBmb3IgdGhpcyBKYXIgcGFja2FnZSBmcmFnbWVudCByb290LgorCSAqCisJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBhY2Nlc3NpbmcgdGhlIGphcgorCSAqLworCXB1YmxpYyBaaXBGaWxlIGdldEphcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFppcEZpbGUoZ2V0UGF0aCgpKTsKKwl9CisJLyoqCisJICogQHNlZSBJSmF2YUVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgeworCQlJSmF2YUVsZW1lbnQgcGFyZW50PSBnZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBwYXJlbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisJICovCisJcHVibGljIGludCBnZXRLaW5kKCkgeworCQlyZXR1cm4gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlk7CisJfQorCS8qKgorCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCisJICovCisJcHVibGljIE9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJLy8gV2Ugd2FudCB0byBzaG93IG5vbiBqYXZhIHJlc291cmNlcyBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlIGF0IHRoZSByb290IChzZWUgUFIgIzFHNThOQjgpCisJCXJldHVybiAoKEphclBhY2thZ2VGcmFnbWVudCkgdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSkpLnN0b3JlZE5vbkphdmFSZXNvdXJjZXMoKTsKKwl9CisJLyoqCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKworCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudCh0aGlzLCBwYWNrYWdlTmFtZSk7CisJfQorCS8qKgorCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKwkgKi8KKwlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKwkJaWYgKGZSZXNvdXJjZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5qYXJQYXRoOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmdldFBhdGgoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisJICovCisJcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzZXJ2ZXJQYXRoU3RyaW5nPSBnZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoKTsKKwkJaWYgKHNlcnZlclBhdGhTdHJpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaW50IGluZGV4PSBzZXJ2ZXJQYXRoU3RyaW5nLmxhc3RJbmRleE9mKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSKTsKKwkJaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7CisJCVN0cmluZyBzZXJ2ZXJaaXBQYXRoU3RyaW5nPSBzZXJ2ZXJQYXRoU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCk7CisJCXJldHVybiBuZXcgUGF0aChzZXJ2ZXJaaXBQYXRoU3RyaW5nKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgc2VydmVyIHByb3BlcnR5IGZvciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzCisJICogc291cmNlIGF0dGFjaGVtZW50LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVN0cmluZyBwcm9wZXJ0eVN0cmluZyA9IG51bGw7CisJCVF1YWxpZmllZE5hbWUgcU5hbWU9IGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eU5hbWUoKTsKKwkJdHJ5IHsKKwkJCXByb3BlcnR5U3RyaW5nID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShxTmFtZSk7CisJCQkKKwkJCS8vIGlmIG5vIGV4aXN0aW5nIHNvdXJjZSBhdHRhY2htZW50IGluZm9ybWF0aW9uLCB0aGVuIGxvb2t1cCBhIHJlY29tbWVuZGF0aW9uIGZyb20gY2xhc3NwYXRoIGVudHJpZXMKKwkJCWlmIChwcm9wZXJ0eVN0cmluZyA9PSBudWxsIHx8IHByb3BlcnR5U3RyaW5nLmxhc3RJbmRleE9mKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSKSA8IDApeworCQkJCUlDbGFzc3BhdGhFbnRyeSByZWNvbW1lbmRhdGlvbiA9IGZpbmRTb3VyY2VBdHRhY2htZW50UmVjb21tZW5kYXRpb24oKTsKKwkJCQlpZiAocmVjb21tZW5kYXRpb24gIT0gbnVsbCl7CisJCQkJCXByb3BlcnR5U3RyaW5nID0gcmVjb21tZW5kYXRpb24uZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKS50b1N0cmluZygpIAorCQkJCQkJCQkJCSsgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIgCisJCQkJCQkJCQkJKyAocmVjb21tZW5kYXRpb24uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgPT0gbnVsbCA/ICIiIDogcmVjb21tZW5kYXRpb24uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KHByb3BlcnR5U3RyaW5nKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcHJvcGVydHlTdHJpbmc7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oY2UpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpeworCQl0cnkgeworCQkJZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnNldFBlcnNpc3RlbnRQcm9wZXJ0eSh0aGlzLmdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHkpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzb3VyY2UgYXR0YWNobWVudCBwcm9wZXJ0eQorCSAqIG9mIHRoaXMgamFyLgorCSAqLworCXByb3RlY3RlZCBRdWFsaWZpZWROYW1lIGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eU5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKEphdmFDb3JlLlBMVUdJTl9JRCwgInNvdXJjZWF0dGFjaG1lbnQ6ICIgKyB0aGlzLmphclBhdGgudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkvKioKKwkgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisJICovCisJcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlTdHJpbmcgc2VydmVyUGF0aFN0cmluZz0gZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KCk7CisJCWlmIChzZXJ2ZXJQYXRoU3RyaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWludCBpbmRleD0gc2VydmVyUGF0aFN0cmluZy5sYXN0SW5kZXhPZihBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUik7CisJCVN0cmluZyBzZXJ2ZXJSb290UGF0aFN0cmluZz0gSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIOworCQlpZiAoaW5kZXggIT0gc2VydmVyUGF0aFN0cmluZy5sZW5ndGgoKSAtIDEpIHsKKwkJCXNlcnZlclJvb3RQYXRoU3RyaW5nPSBzZXJ2ZXJQYXRoU3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpOworCQl9CisJCXJldHVybiBuZXcgUGF0aChzZXJ2ZXJSb290UGF0aFN0cmluZyk7CisJfQorCS8qKgorCSAqIEBzZWUgSmF2YUVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgU291cmNlTWFwcGVyIGdldFNvdXJjZU1hcHBlcigpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAoKEphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBnZXRFbGVtZW50SW5mbygpKS5nZXRTb3VyY2VNYXBwZXIoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKGZSZXNvdXJjZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBzdXBlci5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBJZiBJIGFtIG5vdCBvcGVuLCByZXR1cm4gdHJ1ZSB0byBhdm9pZCBwYXJzaW5nLgorCSAqCisJICogQHNlZSBJUGFyZW50IAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChpc09wZW4oKSkgeworCQkJcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLmphclBhdGguaGFzaENvZGUoKTsKKwl9CisJLyoqCisJICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgeworCQlyZXR1cm4gZlJlc291cmNlID09IG51bGw7CisJfQorCS8qKgorCSAqIEphcnMgYW5kIGphciBlbnRyaWVzIGFyZSBhbGwgcmVhZCBvbmx5CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIEBzZWUgT3BlbmFibGUjb3BlbldoZW5DbG9zZWQoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIG9wZW5XaGVuQ2xvc2VkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlzdXBlci5vcGVuV2hlbkNsb3NlZChwbSk7CisJCXRyeSB7CisJCQkvL3Jlc3RvcmUgYW55IHN0b3JlZCBhdHRhY2hlZCBzb3VyY2UgemlwCisJCQlJUGF0aCB6aXBQYXRoPSBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworCQkJaWYgKHppcFBhdGggIT0gbnVsbCkgeworCQkJCUlQYXRoIHJvb3RQYXRoPSBnZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKKwkJCQlhdHRhY2hTb3VyY2UoemlwUGF0aCwgcm9vdFBhdGgsIHBtKTsKKwkJCX0KKwkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7IC8vIG5vIGF0dGFjaGVkIHNvdXJjZQorCQl9CisJfQorCS8qKgorCSAqIEFuIGFyY2hpdmUgY2Fubm90IHJlZnJlc2ggaXRzIGNoaWxkcmVuLgorCSAqLworCXB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKy8qCisgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCByb290ZWRBdChJSmF2YVByb2plY3QgcHJvamVjdCkgeworCWlmIChmUmVzb3VyY2UgPT0gbnVsbCkgeworCQlyZXR1cm4KKwkJCW5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KAorCQkJCXRoaXMuamFyUGF0aC50b1N0cmluZygpLAorCQkJCXByb2plY3QpOworCX0gZWxzZSB7CisJCXJldHVybgorCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoCisJCQkJZlJlc291cmNlLAorCQkJCXByb2plY3QpOworCX0KK30KKworCS8qKgorCSAqIEZvciB1c2UgYnkgPGNvZGU+QXR0YWNoU291cmNlT3BlcmF0aW9uPC9jb2RlPiBvbmx5LgorCSAqIFNldHMgdGhlIHNvdXJjZSBtYXBwZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgamFyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFNvdXJjZU1hcHBlcihTb3VyY2VNYXBwZXIgbWFwcGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJKChKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuc2V0U291cmNlTWFwcGVyKG1hcHBlcik7CisJfQorCS8qKgorCSAqIFBvc3NpYmxlIGZhaWx1cmVzOiA8dWw+CisJICogIDxsaT5SRUxBVElWRV9QQVRIIC0gdGhlIHBhdGggc3VwcGxpZWQgdG8gdGhpcyBvcGVyYXRpb24gbXVzdCBiZQorCSAqICAgICAgYW4gYWJzb2x1dGUgcGF0aAorCSAqICA8bGk+RUxFTUVOVF9OT1RfUFJFU0VOVCAtIHRoZSBqYXIgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorCSAqICAgICAgZG9lcyBub3QgZXhpc3QKKwkgKiA8L3VsPgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUF0dGFjaFNvdXJjZShJUGF0aCB6aXBQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKCFleGlzdHMoKSkgeworCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQl9IGVsc2UgaWYgKHppcFBhdGggIT0gbnVsbCAmJiAhemlwUGF0aC5pc0Fic29sdXRlKCkpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFTEFUSVZFX1BBVEgsIHppcFBhdGgpKTsKKwkJfQorCX0KKworLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwdWJsaWMgU3RyaW5nIGdldEhhbmRsZU1lbWVudG8oKXsKKwlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcigoKEphdmFFbGVtZW50KWdldFBhcmVudCgpKS5nZXRIYW5kbGVNZW1lbnRvKCkpOworCWJ1ZmYuYXBwZW5kKGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSk7CisJYnVmZi5hcHBlbmQodGhpcy5qYXJQYXRoLnRvU3RyaW5nKCkpOyAvLyAxR0VQNTFVCisJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjNiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCisvKioKKyAqIFRoZSBlbGVtZW50IGluZm8gZm9yIDxjb2RlPkphclBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+cy4KKyAqLworY2xhc3MgSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8gZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnRSb290SW5mbyB7CisJLyoqCisJICogVGhlIFNvdXJjZU1hcHBlciBmb3IgdGhpcyBKQVIgKG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogdGhpcyBKQVIgZG9lcyBub3QgaGF2ZSBzb3VyY2UgYXR0YWNoZWQpLgorCSAqLworCXByb3RlY3RlZCBTb3VyY2VNYXBwZXIgZlNvdXJjZU1hcHBlcj0gbnVsbDsKKy8qKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KKyAqLworcHVibGljIE9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB7CisJZk5vbkphdmFSZXNvdXJjZXMgPSBOT19OT05fSkFWQV9SRVNPVVJDRVM7CisJcmV0dXJuIGZOb25KYXZhUmVzb3VyY2VzOworfQorLyoqCisgKiBSZXR1bnMgdGhlIFNvdXJjZU1hcHBlciBmb3IgdGhpcyBKQVIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpZiB0aGlzIEpBUiBkb2VzIG5vdCBoYXZlIGF0dGFjaGVkIHNvdXJjZS4KKyAqLworcHJvdGVjdGVkIFNvdXJjZU1hcHBlciBnZXRTb3VyY2VNYXBwZXIoKSB7CisJcmV0dXJuIGZTb3VyY2VNYXBwZXI7Cit9CisvKioKKyAqIFNldHMgdGhlIFNvdXJjZU1hcHBlciBmb3IgdGhpcyBKQVIuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFNvdXJjZU1hcHBlcihTb3VyY2VNYXBwZXIgbWFwcGVyKSB7CisJZlNvdXJjZU1hcHBlcj0gbWFwcGVyOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNDhjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEKQEAgLTAsMCArMSw2NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYXJlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworCisvKioKKyAqIFJvb3Qgb2YgSmF2YSBlbGVtZW50IGhhbmRsZSBoaWVyYXJjaHkuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFbGVtZW50IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJSmF2YUVsZW1lbnQgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9KQVZBUFJPSkVDVD0gJz0nOworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBKRU1fUEFDS0FHRUZSQUdNRU5UUk9PVD0gUGF0aC5TRVBBUkFUT1I7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9QQUNLQUdFRlJBR01FTlQ9ICc8JzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSkVNX0ZJRUxEPSAnXic7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9NRVRIT0Q9ICd+JzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSkVNX0lOSVRJQUxJWkVSPSAnfCc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9DT01QSUxBVElPTlVOSVQ9ICd7JzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSkVNX0NMQVNTRklMRT0gJygnOworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBKRU1fVFlQRT0gJ1snOworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBKRU1fUEFDS0FHRURFQ0xBUkFUSU9OPSAnJSc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEpFTV9JTVBPUlRERUNMQVJBVElPTj0gJyMnOworCisJLyoqCisJICogQSBjb3VudCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGVsZW1lbnQgaW4gdGhlIGNhc2UKKwkgKiB0aGF0IGEgZHVwbGljYXRlIG5hbWVkIGVsZW1lbnQgZXhpc3RzLiBGb3IgZXhhbXBsZSwgaWYKKwkgKiB0aGVyZSBhcmUgdHdvIGZpZWxkcyBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUKKwkgKiBzYW1lIG5hbWUsIHRoZSBvY2N1cnJlbmNlIGNvdW50IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2gKKwkgKiB0aGVtLiAgVGhlIG9jY3VycmVuY2UgY291bnQgc3RhcnRzIGF0IDEgKGkuZS4gdGhlIGZpcnN0IAorCSAqIG9jY3VycmVuY2UgaXMgb2NjdXJyZW5jZSAxLCBub3Qgb2NjdXJyZW5jZSAwKS4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZPY2N1cnJlbmNlQ291bnQgPSAxOworCisKKwkvKioKKwkgKiBUaGlzIGVsZW1lbnQncyB0eXBlIC0gb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZAorCSAqIGluIElKYXZhTGFuZ3VhZ2VFbGVtZW50VHlwZXMuCisJICovCisJcHJvdGVjdGVkIGludCBmTEVUeXBlID0gMDsKKworCS8qKgorCSAqIFRoaXMgZWxlbWVudCdzIHBhcmVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcworCSAqIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGZQYXJlbnQ7CisKKwkvKioKKwkgKiBUaGlzIGVsZW1lbnQncyBuYW1lLCBvciBhbiBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IGlmIHRoaXMKKwkgKiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBuYW1lLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZk5hbWU7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBOT19JTkZPID0gbmV3IE9iamVjdCgpOworCQorLyoqCisgKiBDb25zdHJ1Y3RzIGEgaGFuZGxlIGZvciBhIGphdmEgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUsIHdpdGgKKyAqIHRoZSBnaXZlbiBwYXJlbnQgZWxlbWVudCBhbmQgbmFtZS4KKyAqCisgKiBAcGFyYW0gdHlwZSAtIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gSUphdmFMYW5ndWFnZUVsZW1lbnQKKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgb25lIG9mIHRoZSB2YWxpZAorICoJCUphdmEgZWxlbWVudCB0eXBlIGNvbnN0YW50cworICoKKyAqLworcHJvdGVjdGVkIEphdmFFbGVtZW50KGludCB0eXBlLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHR5cGUgPCBKQVZBX01PREVMIHx8IHR5cGUgPiBJTVBPUlRfREVDTEFSQVRJT04pIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaW52YWxpZFR5cGUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJZkxFVHlwZT0gdHlwZTsKKwlmUGFyZW50PSBwYXJlbnQ7CisJZk5hbWU9IG5hbWU7Cit9CisvKioKKyAqIEBzZWUgSU9wZW5hYmxlCisgKi8KK3B1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJT2JqZWN0IGluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wZWVrQXRJbmZvKHRoaXMpOworCWlmIChpbmZvICE9IG51bGwpIHsKKwkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzIGluc3RhbmNlb2YgSmF2YU1vZGVsKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNMT1NJTkcgSmF2YSBNb2RlbCIpOyAgLy8kTk9OLU5MUy0xJAorCQkJLy8gZG9uZSBvbmx5IHdoZW4gZXhpdGluZyB0aGUgd29ya2JlbmNoOiBkaXNhYmxlIHZlcmJvc2UKKwkJCUphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSA9IGZhbHNlOwkJCisJCX0KKwkJaWYgKHRoaXMgaW5zdGFuY2VvZiBJUGFyZW50KSB7CisJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSmF2YUVsZW1lbnRJbmZvKSBpbmZvKS5nZXRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKKwkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CisJCQkJY2hpbGQuY2xvc2UoKTsKKwkJCX0KKwkJfQorCQljbG9zaW5nKGluZm8pOworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVJbmZvKHRoaXMpOworCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gUGFja2FnZSBjYWNoZSBzaXplID0gIiArIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNhY2hlLnBrZ1NpemUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gT3BlbmFibGUgY2FjaGUgZmlsbGluZyByYXRpbyA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5vcGVuYWJsZUZpbGxpbmdSYXRpbygpICsgIiUiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KK30KKy8qKgorICogVGhpcyBlbGVtZW50IGlzIGJlaW5nIGNsb3NlZC4gIERvIGFueSBuZWNlc3NhcnkgY2xlYW51cC4KKyAqLworcHJvdGVjdGVkIHZvaWQgY2xvc2luZyhPYmplY3QgaW5mbykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSl7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0xPU0lORyBFbGVtZW50ICgiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpKyIpOiAiICsgdGhpcy50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCX0KK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGFuZGxlIHJlcHJlc2VudHMgdGhlIHNhbWUgSmF2YSBlbGVtZW50CisgKiBhcyB0aGUgZ2l2ZW4gaGFuZGxlLiBCeSBkZWZhdWx0LCB0d28gaGFuZGxlcyByZXByZXNlbnQgdGhlIHNhbWUKKyAqIGVsZW1lbnQgaWYgdGhleSBhcmUgaWRlbnRpY2FsIG9yIGlmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHR5cGUKKyAqIG9mIGVsZW1lbnQsIGhhdmUgZXF1YWwgbmFtZXMsIHBhcmVudHMsIGFuZCBvY2N1cnJlbmNlIGNvdW50cy4KKyAqCisgKiA8cD5JZiBhIHN1YmNsYXNzIGhhcyBvdGhlciByZXF1aXJlbWVudHMgZm9yIGVxdWFsaXR5LCB0aGlzIG1ldGhvZAorICogbXVzdCBiZSBvdmVycmlkZGVuLgorICoKKyAqIEBzZWUgT2JqZWN0I2VxdWFscworICovCitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkKKwlpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKworCS8vIEphdmEgbW9kZWwgcGFyZW50IGlzIG51bGwKKwlpZiAoZlBhcmVudCA9PSBudWxsKSByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworCisJaWYgKG8gaW5zdGFuY2VvZiBKYXZhRWxlbWVudCkgeworCQlKYXZhRWxlbWVudCBvdGhlciA9IChKYXZhRWxlbWVudCkgbzsKKwkJaWYgKGZMRVR5cGUgIT0gb3RoZXIuZkxFVHlwZSkgcmV0dXJuIGZhbHNlOworCQkKKwkJcmV0dXJuIGZOYW1lLmVxdWFscyhvdGhlci5mTmFtZSkgJiYKKwkJCQlmUGFyZW50LmVxdWFscyhvdGhlci5mUGFyZW50KSAmJgorCQkJCWZPY2N1cnJlbmNlQ291bnQgPT0gb3RoZXIuZk9jY3VycmVuY2VDb3VudDsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyA8Y29kZT5KYXZhRWxlbWVudDwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4KKyAqIDxjb2RlPklET01Ob2RlPC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxzRE9NTm9kZShJRE9NTm9kZSBub2RlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKwkKKwl0cnkgeworCQlnZXRSYXdJbmZvKCk7CisJCXJldHVybiB0cnVlOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSA8Y29kZT5JRE9NTm9kZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIDxjb2RlPkphdmFFbGVtZW50PC9jb2RlPgorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBub2RlLgorICovCitwdWJsaWMgSURPTU5vZGUgZmluZE5vZGUoSURPTUNvbXBpbGF0aW9uVW5pdCBkb20pIHsKKwlpbnQgdHlwZSA9IGdldEVsZW1lbnRUeXBlKCk7CisJaWYgKHR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgfHwgCisJCXR5cGUgPT0gSUphdmFFbGVtZW50LkZJRUxEIHx8IAorCQl0eXBlID09IElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04gfHwgCisJCXR5cGUgPT0gSUphdmFFbGVtZW50LklOSVRJQUxJWkVSIHx8IAorCQl0eXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QgfHwgCisJCXR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04gfHwgCisJCXR5cGUgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJQXJyYXlMaXN0IHBhdGggPSBuZXcgQXJyYXlMaXN0KCk7CisJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gdGhpczsKKwkJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LklNUE9SVF9DT05UQUlORVIpIHsKKwkJCQkvLyB0aGUgRE9NIGRvZXMgbm90IGhhdmUgaW1wb3J0IGNvbnRhaW5lcnMsIHNvIHNraXAgdGhlbQorCQkJCXBhdGguYWRkKDAsIGVsZW1lbnQpOworCQkJfQorCQkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKHBhdGguc2l6ZSgpID09IDApIHsKKwkJCXRyeSB7CisJCQkJaWYgKGVxdWFsc0RPTU5vZGUoZG9tKSkgeworCQkJCQlyZXR1cm4gZG9tOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKChKYXZhRWxlbWVudCkgcGF0aC5nZXQoMCkpLmZvbGxvd1BhdGgocGF0aCwgMCwgZG9tLmdldEZpcnN0Q2hpbGQoKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorLyoqCisgKi8KK3Byb3RlY3RlZCBJRE9NTm9kZSBmb2xsb3dQYXRoKEFycmF5TGlzdCBwYXRoLCBpbnQgcG9zaXRpb24sIElET01Ob2RlIG5vZGUpIHsKKworCXRyeSB7CisJCWlmIChlcXVhbHNET01Ob2RlKG5vZGUpKSB7CisJCQlpZiAocG9zaXRpb24gPT0gKHBhdGguc2l6ZSgpIC0gMSkpIHsKKwkJCQlyZXR1cm4gbm9kZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKKwkJCQkJcG9zaXRpb24rKzsKKwkJCQkJcmV0dXJuICgoSmF2YUVsZW1lbnQpcGF0aC5nZXQocG9zaXRpb24pKS5mb2xsb3dQYXRoKHBhdGgsIHBvc2l0aW9uLCBub2RlLmdldEZpcnN0Q2hpbGQoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG5vZGUuZ2V0TmV4dE5vZGUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZm9sbG93UGF0aChwYXRoLCBwb3NpdGlvbiwgbm9kZS5nZXROZXh0Tm9kZSgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSkgeworCQorCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gdGhpczsKKwl3aGlsZSAoZWxlbWVudCAhPSBudWxsKSB7CisJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gYW5jZXN0b3JUeXBlKSAgcmV0dXJuIGVsZW1lbnQ7CisJCWVsZW1lbnQ9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJfQorCXJldHVybiBudWxsOwkJCQkKK30KKy8qKgorICogQHNlZSBJUGFyZW50IAorICovCitwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0RWxlbWVudEluZm8oKS5nZXRDaGlsZHJlbigpOworfQorLyoqCisgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiAoaW1tZWRpYXRlKSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgb2YgdGhlCisgKiBzcGVjaWZpZWQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHlwZSAtIG9uZSBvZiBjb25zdGFudHMgZGVmaW5lZCBieSBJSmF2YUxhbmd1YWdlRWxlbWVudFR5cGVzCisgKi8KK3B1YmxpYyBBcnJheUxpc3QgZ2V0Q2hpbGRyZW5PZlR5cGUoaW50IHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKKwlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKKwlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKwkJSmF2YUVsZW1lbnQgZWx0ID0gKEphdmFFbGVtZW50KWNoaWxkcmVuW2ldOworCQlpZiAoZWx0LmdldEVsZW1lbnRUeXBlKCkgPT0gdHlwZSkgeworCQkJbGlzdC5hZGQoZWx0KTsKKwkJfQorCX0KKwlyZXR1cm4gbGlzdDsKK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBJQ2xhc3NGaWxlIGdldENsYXNzRmlsZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgaW5mbyBmb3IgdGhpcyBoYW5kbGUuICAKKyAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBvcGVuLCBpdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIGFyZSBvcGVuZWQuCisgKiBEb2VzIG5vdCByZXR1cm4gbnVsbC4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvciBub3QgYWNjZXNzaWJsZQorICovCitwdWJsaWMgSmF2YUVsZW1lbnRJbmZvIGdldEVsZW1lbnRJbmZvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyOworCXN5bmNocm9uaXplZChtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkpeworCQlPYmplY3QgaW5mbyA9IG1hbmFnZXIuZ2V0SW5mbyh0aGlzKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkgeworCQkJb3BlbkhpZXJhcmNoeSgpOworCQkJaW5mbz0gbWFuYWdlci5nZXRJbmZvKHRoaXMpOworCQkJaWYgKGluZm8gPT0gbnVsbCkgeworCQkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKEphdmFFbGVtZW50SW5mbylpbmZvOworCX0KK30KKy8qKgorICogQHNlZSBJQWRhcHRhYmxlCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJcmV0dXJuIGZOYW1lOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgeworCXJldHVybiBmTEVUeXBlOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgU3RyaW5nIGdldEhhbmRsZUlkZW50aWZpZXIoKSB7CisJcmV0dXJuIGdldEhhbmRsZU1lbWVudG8oKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRIYW5kbGVNZW1lbnRvKCl7CisJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0SGFuZGxlTWVtZW50bygpKTsKKwlidWZmLmFwcGVuZChnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkpOworCWJ1ZmYuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoaXMgaGFuZGxlcworICogY29udHJpYnV0aW9uIHRvIGEgbWVtZW50by4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpOworLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7CisJcmV0dXJuIGdldFBhcmVudCgpLmdldEphdmFNb2RlbCgpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBKYXZhTW9kZWxNYW5hZ2VyCisgKi8KK3B1YmxpYyBKYXZhTW9kZWxNYW5hZ2VyIGdldEphdmFNb2RlbE1hbmFnZXIoKSB7CisJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgeworCXJldHVybiBnZXRQYXJlbnQoKS5nZXRKYXZhUHJvamVjdCgpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoZSBoYW5kbGUuCisgKi8KK3Byb3RlY3RlZCBpbnQgZ2V0T2NjdXJyZW5jZUNvdW50KCkgeworCXJldHVybiBmT2NjdXJyZW5jZUNvdW50OworfQorLyoKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoKSB7CisJcmV0dXJuIHRoaXMuZ2V0T3BlbmFibGVQYXJlbnQoKTsJCit9CisvKioKKyAqIFJldHVybiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgSU9wZW5hYmxlIGluIHRoZSBwYXJlbnQKKyAqIGhpZXJhcmNoeSBvZiB0aGlzIGVsZW1lbnQuCisgKgorICogPHA+U3ViY2xhc3NlcyB0aGF0IGFyZSBub3QgSU9wZW5hYmxlJ3MgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAqLworcHVibGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZVBhcmVudCgpIHsKKwkKKwlyZXR1cm4gKElPcGVuYWJsZSlmUGFyZW50OworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFBhcmVudCgpIHsKKwlyZXR1cm4gZlBhcmVudDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBpbmZvIGZvciB0aGlzIGhhbmRsZS4gIAorICogSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IG9wZW4sIGl0IGFuZCBhbGwgb2YgaXRzIHBhcmVudHMgYXJlIG9wZW5lZC4KKyAqIERvZXMgbm90IHJldHVybiBudWxsLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9yIG5vdCBhY2Nlc3NpYmxlCisgKi8KK3B1YmxpYyBPYmplY3QgZ2V0UmF3SW5mbygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXN5bmNocm9uaXplZChKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSl7CisJCU9iamVjdCBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyh0aGlzKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkgeworCQkJb3BlbkhpZXJhcmNoeSgpOworCQkJaW5mbz0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbyh0aGlzKTsKKwkJCWlmIChpbmZvID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCX0gCisJCXJldHVybiBpbmZvOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IGlzIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIHNvdXJjZSBwb3NpdGlvbgorICogaW4gdGhpcyBlbGVtZW50LiAgVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIDxjb2RlPklDb21waWxhdGlvblVuaXQjZ2V0RWxlbWVudEF0PC9jb2RlPiwKKyAqIGFuZCBvbmx5IHdvcmtzIG9uIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCB0eXBlcy4gVGhlIHBvc2l0aW9uIGdpdmVuIGlzCisgKiBrbm93biB0byBiZSB3aXRoaW4gdGhpcyBlbGVtZW50J3Mgc291cmNlIHJhbmdlIGFscmVhZHksIGFuZCBpZiBubyBmaW5lcgorICogZ3JhaW5lZCBlbGVtZW50IGlzIGZvdW5kIGF0IHRoZSBwb3NpdGlvbiwgdGhpcyBlbGVtZW50IGlzIHJldHVybmVkLgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldFNvdXJjZUVsZW1lbnRBdChpbnQgcG9zaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmICh0aGlzIGluc3RhbmNlb2YgSVNvdXJjZVJlZmVyZW5jZSkgeworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCWlmIChhQ2hpbGQgaW5zdGFuY2VvZiBTb3VyY2VSZWZFbGVtZW50KSB7CisJCQkJU291cmNlUmVmRWxlbWVudCBjaGlsZCA9IChTb3VyY2VSZWZFbGVtZW50KSBjaGlsZHJlbltpXTsKKwkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBjaGlsZC5nZXRTb3VyY2VSYW5nZSgpOworCQkJCWlmIChwb3NpdGlvbiA8IHJhbmdlLmdldE9mZnNldCgpICsgcmFuZ2UuZ2V0TGVuZ3RoKCkgJiYgcG9zaXRpb24gPj0gcmFuZ2UuZ2V0T2Zmc2V0KCkpIHsKKwkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVBhcmVudCkgeworCQkJCQkJcmV0dXJuIGNoaWxkLmdldFNvdXJjZUVsZW1lbnRBdChwb3NpdGlvbik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gY2hpbGQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKKwl9CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIFNvdXJjZU1hcHBlciBmYWNpbGl0eSBmb3IgdGhpcyBlbGVtZW50LCBvcgorICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGhhdmUgYQorICogU291cmNlTWFwcGVyLgorICovCitwdWJsaWMgU291cmNlTWFwcGVyIGdldFNvdXJjZU1hcHBlcigpIHsKKwlyZXR1cm4gKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0U291cmNlTWFwcGVyKCk7Cit9CitwdWJsaWMgYWJzdHJhY3QgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCisgKi8KK3B1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKKwlyZXR1cm4gZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBKYXZhIGVsZW1lbnQuIEJ5IGRlZmF1bHQsCisgKiB0aGUgaGFzaCBjb2RlIGZvciBhbiBlbGVtZW50IGlzIGEgY29tYmluYXRpb24gb2YgaXRzIG5hbWUKKyAqIGFuZCBwYXJlbnQncyBoYXNoIGNvZGUuIEVsZW1lbnRzIHdpdGggb3RoZXIgcmVxdWlyZW1lbnRzIG11c3QKKyAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICovCitwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCWlmIChmUGFyZW50ID09IG51bGwpIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworCXJldHVybiBVdGlsLmNvbWJpbmVIYXNoQ29kZXMoZk5hbWUuaGFzaENvZGUoKSwgZlBhcmVudC5oYXNoQ29kZSgpKTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwKKyAqIG90aGVyd2lzZSBmYWxzZS4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNBbmNlc3Rvck9mKElKYXZhRWxlbWVudCBlKSB7CisJSUphdmFFbGVtZW50IHBhcmVudD0gZS5nZXRQYXJlbnQoKTsKKwl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5lcXVhbHModGhpcykpIHsKKwkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJfQorCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKK30KKworLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3R1cmVLbm93bigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBnZXRFbGVtZW50SW5mbygpLmlzU3RydWN0dXJlS25vd24oKTsKK30KKy8qKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbmQgbm90IHByZXNlbnQgZXhjZXB0aW9uIGZvciB0aGlzIGVsZW1lbnQuCisgKi8KK3Byb3RlY3RlZCBKYXZhTW9kZWxFeGNlcHRpb24gbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpIHsKKwlyZXR1cm4gbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgdGhpcykpOworfQorLyoqCisgKiBEZWZhdWx0IGlzIHRvIG5vdCBkbyBhbnkgc291cmNlIGluZGljZXMgdXBkYXRlcy4KKyAqLworcHVibGljIHZvaWQgb2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oaW50IGFtb3VudCwgSUphdmFFbGVtZW50IGNoaWxkKSB7CisJCit9CisvKioKKyAqIERlZmF1bHQgYmVoYXZpb3VyIGlzIG5vdCB0byBjaGFuZ2UgdGhlIHNvdXJjZSByYW5nZQorICogZm9yIHRoZSBKYXZhIGVsZW1lbnQKKyAqLworcHVibGljIHZvaWQgb2Zmc2V0U291cmNlUmFuZ2UoaW50IGFtb3VudCkgeworfQorLyoqCisgKiBPcGVucyB0aGlzIGVsZW1lbnQgYW5kIGFsbCBwYXJlbnRzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IG9wZW4uCisgKgorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9yIGFjY2Vzc2libGUKKyAqLworcHJvdGVjdGVkIHZvaWQgb3BlbkhpZXJhcmNoeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmICh0aGlzIGluc3RhbmNlb2YgSU9wZW5hYmxlKSB7CisJCSgoT3BlbmFibGUpIHRoaXMpLm9wZW5XaGVuQ2xvc2VkKG51bGwpOworCX0gZWxzZSB7CisJCU9wZW5hYmxlIG9wZW5hYmxlUGFyZW50ID0gKE9wZW5hYmxlKWdldE9wZW5hYmxlUGFyZW50KCk7CisJCWlmIChvcGVuYWJsZVBhcmVudCAhPSBudWxsKSB7CisJCQlKYXZhRWxlbWVudEluZm8gb3BlbmFibGVQYXJlbnRJbmZvID0gKEphdmFFbGVtZW50SW5mbykgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbygoSUphdmFFbGVtZW50KSBvcGVuYWJsZVBhcmVudCk7CisJCQlpZiAob3BlbmFibGVQYXJlbnRJbmZvID09IG51bGwpIHsKKwkJCQlvcGVuYWJsZVBhcmVudC5vcGVuV2hlbkNsb3NlZChudWxsKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQkJfQorCQl9CisJfQorfQorLyoqCisgKiBUaGlzIGVsZW1lbnQgaGFzIGp1c3QgYmVlbiBvcGVuZWQuICBEbyBhbnkgbmVjZXNzYXJ5IHNldHVwLgorICovCitwcm90ZWN0ZWQgdm9pZCBvcGVuaW5nKE9iamVjdCBpbmZvKSB7Cit9CisKKworCisvKioKKyAqLworcHVibGljIFN0cmluZyByZWFkYWJsZU5hbWUoKSB7CisKKwlyZXR1cm4gdGhpcy5nZXRFbGVtZW50TmFtZSgpOworfQorCisvKioKKyAqIFJlbW92ZXMgYWxsIGNhY2hlZCBpbmZvIGZyb20gdGhlIEphdmEgTW9kZWwsIGluY2x1ZGluZyBhbGwgY2hpbGRyZW4sCisgKiBidXQgZG9lcyBub3QgY2xvc2UgdGhpcyBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbmZvKCkgeworCU9iamVjdCBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucGVla0F0SW5mbyh0aGlzKTsKKwlpZiAoaW5mbyAhPSBudWxsKSB7CisJCWlmICh0aGlzIGluc3RhbmNlb2YgSVBhcmVudCkgeworCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbylpbmZvKS5nZXRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKKwkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CisJCQkJY2hpbGQucmVtb3ZlSW5mbygpOworCQkJfQorCQl9CisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUluZm8odGhpcyk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGVsZW1lbnQgcm9vdGVkIGF0IHRoZSBnaXZlbiBwcm9qZWN0LgorICovCitwdWJsaWMgYWJzdHJhY3QgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KTsKKy8qKgorICogUnVucyBhIEphdmEgTW9kZWwgT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHJ1bk9wZXJhdGlvbihKYXZhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IpOworfQorLyoqCisgKiBTZXRzIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoZSBoYW5kbGUuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldE9jY3VycmVuY2VDb3VudChpbnQgY291bnQpIHsKKwlmT2NjdXJyZW5jZUNvdW50ID0gY291bnQ7Cit9Citwcm90ZWN0ZWQgU3RyaW5nIHRhYlN0cmluZyhpbnQgdGFiKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlmb3IgKGludCBpID0gdGFiOyBpID4gMDsgaS0tKQorCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHVibGljIFN0cmluZyB0b0RlYnVnU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJdGhpcy50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBOT19JTkZPKTsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisvKioKKyAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXRvU3RyaW5nKDAsIGJ1ZmZlcik7CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiAgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwlPYmplY3QgaW5mbyA9IHRoaXMudG9TdHJpbmdJbmZvKHRhYiwgYnVmZmVyKTsKKwlpZiAodGFiID09IDApIHsKKwkJdGhpcy50b1N0cmluZ0FuY2VzdG9ycyhidWZmZXIpOworCX0KKwl0aGlzLnRvU3RyaW5nQ2hpbGRyZW4odGFiLCBidWZmZXIsIGluZm8pOworfQorLyoqCisgKiAgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJdGhpcy50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBOT19JTkZPKTsKKwl0aGlzLnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiAgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nQW5jZXN0b3JzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwlKYXZhRWxlbWVudCBwYXJlbnQgPSAoSmF2YUVsZW1lbnQpdGhpcy5nZXRQYXJlbnQoKTsKKwlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiIFtpbiAiKTsgLy8kTk9OLU5MUy0xJAorCQlwYXJlbnQudG9TdHJpbmdJbmZvKDAsIGJ1ZmZlciwgTk9fSU5GTyk7CisJCXBhcmVudC50b1N0cmluZ0FuY2VzdG9ycyhidWZmZXIpOworCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisvKioKKyAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdDaGlsZHJlbihpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgeworCWlmIChpbmZvID09IG51bGwgfHwgIShpbmZvIGluc3RhbmNlb2YgSmF2YUVsZW1lbnRJbmZvKSkgcmV0dXJuOworCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChKYXZhRWxlbWVudEluZm8paW5mbykuZ2V0Q2hpbGRyZW4oKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJKChKYXZhRWxlbWVudCljaGlsZHJlbltpXSkudG9TdHJpbmcodGFiICsgMSwgYnVmZmVyKTsKKwl9Cit9CisvKioKKyAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHVibGljIE9iamVjdCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCU9iamVjdCBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucGVla0F0SW5mbyh0aGlzKTsKKwl0aGlzLnRvU3RyaW5nSW5mbyh0YWIsIGJ1ZmZlciwgaW5mbyk7CisJcmV0dXJuIGluZm87Cit9CisvKioKKyAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKy8qKgorICogVXBkYXRlcyB0aGUgc291cmNlIGVuZCBwb3NpdGlvbiBmb3IgdGhpcyBlbGVtZW50LgorICogRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZy4KKyAqLworcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZUVuZE9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgeworfQorLyoqCisgKiBVcGRhdGVzIHRoZSBzb3VyY2UgcG9zaXRpb25zIGZvciB0aGlzIGVsZW1lbnQuCisgKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nLgorICovCitwdWJsaWMgdm9pZCB0cmlnZ2VyU291cmNlUmFuZ2VPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKKworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTg3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhLmphdmEKQEAgLTAsMCArMSw3MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CisKKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorICovCitwdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnREZWx0YSBpbXBsZW1lbnRzIElKYXZhRWxlbWVudERlbHRhIHsKKwkvKioKKwkgKiBUaGUgZWxlbWVudCB0aGF0IHRoaXMgZGVsdGEgZGVzY3JpYmVzIHRoZSBjaGFuZ2UgdG8uCisJICogQHNlZSAjZ2V0RWxlbWVudCgpCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBmQ2hhbmdlZEVsZW1lbnQ7CisJLyoqCisJICogQHNlZSAjZ2V0S2luZCgpCisJICovCisJcHJpdmF0ZSBpbnQgZktpbmQgPSAwOworCS8qKgorCSAqIEBzZWUgI2dldEZsYWdzKCkKKwkgKi8KKwlwcml2YXRlIGludCBmQ2hhbmdlRmxhZ3MgPSAwOworCS8qKgorCSAqIEBzZWUgI2dldEFmZmVjdGVkQ2hpbGRyZW4oKQorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnREZWx0YVtdIGZBZmZlY3RlZENoaWxkcmVuID0gZmdFbXB0eURlbHRhOworCisJLyoqCisJICogQ29sbGVjdGlvbiBvZiByZXNvdXJjZSBkZWx0YXMgdGhhdCBjb3JyZXNwb25kIHRvIG5vbiBqYXZhIHJlc291cmNlcyBkZWx0YXMuCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZURlbHRhW10gcmVzb3VyY2VEZWx0YXMgPSBudWxsOworCisJLyoqCisJICogQ291bnRlciBvZiByZXNvdXJjZSBkZWx0YXMKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHJlc291cmNlRGVsdGFzQ291bnRlcjsKKwkvKioKKwkgKiBAc2VlICNnZXRNb3ZlZEZyb21IYW5kbGUoKQorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZk1vdmVkRnJvbUhhbmRsZSA9IG51bGw7CisJLyoqCisJICogQHNlZSAjZ2V0TW92ZWRUb0hhbmRsZSgpCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBmTW92ZWRUb0hhbmRsZSA9IG51bGw7CisJLyoqCisJICogRW1wdHkgYXJyYXkgb2YgSUphdmFFbGVtZW50RGVsdGEKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljICBJSmF2YUVsZW1lbnREZWx0YVtdIGZnRW1wdHlEZWx0YT0gbmV3IElKYXZhRWxlbWVudERlbHRhW10ge307CisvKioKKyAqIENyZWF0ZXMgdGhlIHJvb3QgZGVsdGEuIFRvIGNyZWF0ZSB0aGUgbmVzdGVkIGRlbHRhCisgKiBoaWVyYXJjaGllcyB1c2UgdGhlIGZvbGxvd2luZyBjb252ZW5pZW5jZSBtZXRob2RzLiBUaGUgcm9vdAorICogZGVsdGEgY2FuIGJlIGNyZWF0ZWQgYXQgYW55IGxldmVsIChpLmUuIHByb2plY3QsIHBhY2thZ2Ugcm9vdCwKKyAqIHBhY2thZ2UgZnJhZ21lbnQuLi4pLgorICogPHVsPgorICogPGxpPjxjb2RlPmFkZGVkKElKYXZhRWxlbWVudCk8L2NvZGU+CisgKiA8bGk+PGNvZGU+Y2hhbmdlZChJSmF2YUVsZW1lbnQpPC9jb2RlPgorICogPGxpPjxjb2RlPm1vdmVkKElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50KTwvY29kZT4KKyAqIDxsaT48Y29kZT5yZW1vdmVkKElKYXZhRWxlbWVudCk8L2NvZGU+CisgKiA8bGk+PGNvZGU+cmVuYW1lZChJSmF2YUVsZW1lbnQsIElKYXZhRWxlbWVudCk8L2NvZGU+CisgKiA8L3VsPgorICovCitwdWJsaWMgSmF2YUVsZW1lbnREZWx0YShJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXN1cGVyKCk7CisJZkNoYW5nZWRFbGVtZW50ID0gZWxlbWVudDsKK30KKy8qKgorICogQWRkcyB0aGUgY2hpbGQgZGVsdGEgdG8gdGhlIGNvbGxlY3Rpb24gb2YgYWZmZWN0ZWQgY2hpbGRyZW4uICBJZiB0aGUKKyAqIGNoaWxkIGlzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24sIHdhbGsgZG93biB0aGUgaGllcmFyY2h5LgorICovCitwcm90ZWN0ZWQgdm9pZCBhZGRBZmZlY3RlZENoaWxkKEphdmFFbGVtZW50RGVsdGEgY2hpbGQpIHsKKwlzd2l0Y2ggKGZLaW5kKSB7CisJCWNhc2UgQURERUQ6CisJCWNhc2UgUkVNT1ZFRDoKKwkJCS8vIG5vIG5lZWQgdG8gYWRkIGEgY2hpbGQgaWYgdGhpcyBwYXJlbnQgaXMgYWRkZWQgb3IgcmVtb3ZlZAorCQkJcmV0dXJuOworCQljYXNlIENIQU5HRUQ6CisJCQlmQ2hhbmdlRmxhZ3MgfD0gRl9DSElMRFJFTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZktpbmQgPSBDSEFOR0VEOworCQkJZkNoYW5nZUZsYWdzIHw9IEZfQ0hJTERSRU47CisJfQorCisJLy8gaWYgYSBjaGlsZCBkZWx0YSBpcyBhZGRlZCB0byBhIGNvbXBpbGF0aW9uIHVuaXQgZGVsdGEgb3IgYmVsb3csIAorCS8vIGl0J3MgYSBmaW5lIGdyYWluZWQgZGVsdGEKKwlpZiAoZkNoYW5nZWRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPj0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJdGhpcy5maW5lR3JhaW5lZCgpOworCX0KKwkKKwlpZiAoZkFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoID09IDApIHsKKwkJZkFmZmVjdGVkQ2hpbGRyZW4gPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7Y2hpbGR9OworCQlyZXR1cm47CisJfQorCUlKYXZhRWxlbWVudERlbHRhIGV4aXN0aW5nQ2hpbGQgPSBudWxsOworCWludCBleGlzdGluZ0NoaWxkSW5kZXggPSAtMTsKKwlpZiAoZkFmZmVjdGVkQ2hpbGRyZW4gIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGZBZmZlY3RlZENoaWxkcmVuW2ldLmdldEVsZW1lbnQoKSwgY2hpbGQuZ2V0RWxlbWVudCgpKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQkJZXhpc3RpbmdDaGlsZCA9IGZBZmZlY3RlZENoaWxkcmVuW2ldOworCQkJCWV4aXN0aW5nQ2hpbGRJbmRleCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKGV4aXN0aW5nQ2hpbGQgPT0gbnVsbCkgeyAvL25ldyBhZmZlY3RlZCBjaGlsZAorCQlmQWZmZWN0ZWRDaGlsZHJlbj0gZ3Jvd0FuZEFkZFRvQXJyYXkoZkFmZmVjdGVkQ2hpbGRyZW4sIGNoaWxkKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGV4aXN0aW5nQ2hpbGQuZ2V0S2luZCgpKSB7CisJCQljYXNlIEFEREVEOgorCQkJCXN3aXRjaCAoY2hpbGQuZ2V0S2luZCgpKSB7CisJCQkJCWNhc2UgQURERUQ6IC8vIGNoaWxkIHdhcyBhZGRlZCB0aGVuIGFkZGVkIC0+IGl0IGlzIGFkZGVkCisJCQkJCWNhc2UgQ0hBTkdFRDogLy8gY2hpbGQgd2FzIGFkZGVkIHRoZW4gY2hhbmdlZCAtPiBpdCBpcyBhZGRlZAorCQkJCQkJcmV0dXJuOworCQkJCQljYXNlIFJFTU9WRUQ6IC8vIGNoaWxkIHdhcyBhZGRlZCB0aGVuIHJlbW92ZWQgLT4gbm9vcAorCQkJCQkJZkFmZmVjdGVkQ2hpbGRyZW4gPSB0aGlzLnJlbW92ZUFuZFNocmlua0FycmF5KGZBZmZlY3RlZENoaWxkcmVuLCBleGlzdGluZ0NoaWxkSW5kZXgpOworCQkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUkVNT1ZFRDoKKwkJCQlzd2l0Y2ggKGNoaWxkLmdldEtpbmQoKSkgeworCQkJCQljYXNlIEFEREVEOiAvLyBjaGlsZCB3YXMgcmVtb3ZlZCB0aGVuIGFkZGVkIC0+IGl0IGlzIGNoYW5nZWQKKwkJCQkJCWNoaWxkLmZLaW5kID0gQ0hBTkdFRDsKKwkJCQkJCWZBZmZlY3RlZENoaWxkcmVuW2V4aXN0aW5nQ2hpbGRJbmRleF0gPSBjaGlsZDsKKwkJCQkJCXJldHVybjsKKwkJCQkJY2FzZSBDSEFOR0VEOiAvLyBjaGlsZCB3YXMgcmVtb3ZlZCB0aGVuIGNoYW5nZWQgLT4gaXQgaXMgcmVtb3ZlZAorCQkJCQljYXNlIFJFTU9WRUQ6IC8vIGNoaWxkIHdhcyByZW1vdmVkIHRoZW4gcmVtb3ZlZCAtPiBpdCBpcyByZW1vdmVkCisJCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDSEFOR0VEOgorCQkJCXN3aXRjaCAoY2hpbGQuZ2V0S2luZCgpKSB7CisJCQkJCWNhc2UgQURERUQ6IC8vIGNoaWxkIHdhcyBjaGFuZ2VkIHRoZW4gYWRkZWQgLT4gaXQgaXMgYWRkZWQKKwkJCQkJY2FzZSBSRU1PVkVEOiAvLyBjaGlsZCB3YXMgY2hhbmdlZCB0aGVuIHJlbW92ZWQgLT4gaXQgaXMgcmVtb3ZlZAorCQkJCQkJZkFmZmVjdGVkQ2hpbGRyZW5bZXhpc3RpbmdDaGlsZEluZGV4XSA9IGNoaWxkOworCQkJCQkJcmV0dXJuOworCQkJCQljYXNlIENIQU5HRUQ6IC8vIGNoaWxkIHdhcyBjaGFuZ2VkIHRoZW4gY2hhbmdlZCAtPiBpdCBpcyBjaGFuZ2VkCisJCQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gY2hpbGQuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCQkJCUphdmFFbGVtZW50RGVsdGEgY2hpbGRzQ2hpbGQgPSAoSmF2YUVsZW1lbnREZWx0YSkgY2hpbGRyZW5baV07CisJCQkJCQkJKChKYXZhRWxlbWVudERlbHRhKSBleGlzdGluZ0NoaWxkKS5hZGRBZmZlY3RlZENoaWxkKGNoaWxkc0NoaWxkKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJLy8gdXBkYXRlIGZsYWdzIGlmIG5lZWRlZAorCQkJCQkJc3dpdGNoICgoKEphdmFFbGVtZW50RGVsdGEpIGV4aXN0aW5nQ2hpbGQpLmZDaGFuZ2VGbGFncykgeworCQkJCQkJCWNhc2UgRl9BRERFRF9UT19DTEFTU1BBVEg6CisJCQkJCQkJY2FzZSBGX1JFTU9WRURfRlJPTV9DTEFTU1BBVEg6CisJCQkJCQkJY2FzZSBGX1NPVVJDRUFUVEFDSEVEOgorCQkJCQkJCWNhc2UgRl9TT1VSQ0VERVRBQ0hFRDoKKwkJCQkJCQkJKChKYXZhRWxlbWVudERlbHRhKSBleGlzdGluZ0NoaWxkKS5mQ2hhbmdlRmxhZ3MgfD0gKChKYXZhRWxlbWVudERlbHRhKSBjaGlsZCkuZkNoYW5nZUZsYWdzOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJLy8gYWRkIHRoZSBub24tamF2YSByZXNvdXJjZSBkZWx0YXMgaWYgbmVlZGVkCisJCQkJCQkvLyBub3RlIHRoYXQgdGhlIGNoaWxkIGRlbHRhIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBleGlzdGluZyBjaGlsZCBkZWx0YQorCQkJCQkJLy8gYXMgbm9uLWphdmEgcmVzb3VyY2UgZGVsdGFzIGFyZSBhbHdheXMgY3JlYXRlZCBsYXN0IChieSB0aGUgRGVsdGFQcm9jZXNzb3IpCisJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIHJlc0RlbHRhcyA9IGNoaWxkLmdldFJlc291cmNlRGVsdGFzKCk7CisJCQkJCQlpZiAocmVzRGVsdGFzICE9IG51bGwpIHsKKwkJCQkJCQkoKEphdmFFbGVtZW50RGVsdGEpZXhpc3RpbmdDaGlsZCkucmVzb3VyY2VEZWx0YXMgPSByZXNEZWx0YXM7CisJCQkJCQkJKChKYXZhRWxlbWVudERlbHRhKWV4aXN0aW5nQ2hpbGQpLnJlc291cmNlRGVsdGFzQ291bnRlciA9IGNoaWxkLnJlc291cmNlRGVsdGFzQ291bnRlcjsKKwkJCQkJCX0KKwkJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAKKwkJCQkvLyB1bmtub3duIC0+IGV4aXN0aW5nIGNoaWxkIGJlY29tZXMgdGhlIGNoaWxkIHdpdGggdGhlIGV4aXN0aW5nIGNoaWxkJ3MgZmxhZ3MKKwkJCQlpbnQgZmxhZ3MgPSBleGlzdGluZ0NoaWxkLmdldEZsYWdzKCk7CisJCQkJZkFmZmVjdGVkQ2hpbGRyZW5bZXhpc3RpbmdDaGlsZEluZGV4XSA9IGNoaWxkOworCQkJCWNoaWxkLmZDaGFuZ2VGbGFncyB8PSBmbGFnczsKKwkJfQorCX0KK30KKy8qKgorICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhcyByZXN1bHRpbmcgZnJvbSBhbiBhZGQgb3BlcmF0aW9uLgorICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhZGQgZGVsdGFzLgorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKKyAqIGFuZCB0aGVuIGFuIGFkZCBvcGVyYXRpb24gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QuCisgKi8KK3B1YmxpYyB2b2lkIGFkZGVkKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJSmF2YUVsZW1lbnREZWx0YSBhZGRlZERlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoZWxlbWVudCk7CisJYWRkZWREZWx0YS5mS2luZCA9IEFEREVEOworCWluc2VydERlbHRhVHJlZShlbGVtZW50LCBhZGRlZERlbHRhKTsKK30KKy8qKgorICogQWRkcyB0aGUgY2hpbGQgZGVsdGEgdG8gdGhlIGNvbGxlY3Rpb24gb2YgYWZmZWN0ZWQgY2hpbGRyZW4uICBJZiB0aGUKKyAqIGNoaWxkIGlzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24sIHdhbGsgZG93biB0aGUgaGllcmFyY2h5LgorICovCitwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGNoaWxkKSB7CisJc3dpdGNoIChmS2luZCkgeworCQljYXNlIEFEREVEOgorCQljYXNlIFJFTU9WRUQ6CisJCQkvLyBubyBuZWVkIHRvIGFkZCBhIGNoaWxkIGlmIHRoaXMgcGFyZW50IGlzIGFkZGVkIG9yIHJlbW92ZWQKKwkJCXJldHVybjsKKwkJY2FzZSBDSEFOR0VEOgorCQkJZkNoYW5nZUZsYWdzIHw9IEZfQ09OVEVOVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZktpbmQgPSBDSEFOR0VEOworCQkJZkNoYW5nZUZsYWdzIHw9IEZfQ09OVEVOVDsKKwl9CisJaWYgKHJlc291cmNlRGVsdGFzID09IG51bGwpIHsKKwkJcmVzb3VyY2VEZWx0YXMgPSBuZXcgSVJlc291cmNlRGVsdGFbNV07CisJCXJlc291cmNlRGVsdGFzW3Jlc291cmNlRGVsdGFzQ291bnRlcisrXSA9IGNoaWxkOworCQlyZXR1cm47CisJfQorCWlmIChyZXNvdXJjZURlbHRhcy5sZW5ndGggPT0gcmVzb3VyY2VEZWx0YXNDb3VudGVyKSB7CisJCS8vIG5lZWQgYSByZXNpemUKKwkJU3lzdGVtLmFycmF5Y29weShyZXNvdXJjZURlbHRhcywgMCwgKHJlc291cmNlRGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW3Jlc291cmNlRGVsdGFzQ291bnRlciAqIDJdKSwgMCwgcmVzb3VyY2VEZWx0YXNDb3VudGVyKTsKKwl9CisJcmVzb3VyY2VEZWx0YXNbcmVzb3VyY2VEZWx0YXNDb3VudGVyKytdID0gY2hpbGQ7Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgcmVzdWx0aW5nIGZyb20gYSBjaGFuZ2Ugb3BlcmF0aW9uLgorICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBjaGFuZ2UgZGVsdGFzLgorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKKyAqIGFuZCB0aGVuIGEgY2hhbmdlIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KKyAqLworcHVibGljIHZvaWQgY2hhbmdlZChJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGNoYW5nZUZsYWcpIHsKKwlKYXZhRWxlbWVudERlbHRhIGNoYW5nZWREZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGVsZW1lbnQpOworCWNoYW5nZWREZWx0YS5mS2luZCA9IENIQU5HRUQ7CisJY2hhbmdlZERlbHRhLmZDaGFuZ2VGbGFncyB8PSBjaGFuZ2VGbGFnOworCWluc2VydERlbHRhVHJlZShlbGVtZW50LCBjaGFuZ2VkRGVsdGEpOworfQorLyoqCisgKiBDbG9uZSB0aGlzIGRlbHRhIHNvIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSByb290ZWQgYXQgdGhlIGdpdmVuIHByb2plY3QuCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnREZWx0YSBjbG9uZShJSmF2YVByb2plY3QgcHJvamVjdCkgeworCUphdmFFbGVtZW50RGVsdGEgY2xvbmUgPSAKKwkJbmV3IEphdmFFbGVtZW50RGVsdGEoKChKYXZhRWxlbWVudClmQ2hhbmdlZEVsZW1lbnQpLnJvb3RlZEF0KHByb2plY3QpKTsKKwlpZiAoZkFmZmVjdGVkQ2hpbGRyZW4gIT0gZmdFbXB0eURlbHRhKSB7CisJCWludCBsZW5ndGggPSBmQWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7CisJCUlKYXZhRWxlbWVudERlbHRhW10gY2xvbmVDaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnREZWx0YVtsZW5ndGhdOworCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWNsb25lQ2hpbGRyZW5baV0gPSAoKEphdmFFbGVtZW50RGVsdGEpZkFmZmVjdGVkQ2hpbGRyZW5baV0pLmNsb25lKHByb2plY3QpOworCQl9CisJCWNsb25lLmZBZmZlY3RlZENoaWxkcmVuID0gY2xvbmVDaGlsZHJlbjsKKwl9CQorCWNsb25lLmZDaGFuZ2VGbGFncyA9IGZDaGFuZ2VGbGFnczsKKwljbG9uZS5mS2luZCA9IGZLaW5kOworCWlmIChmTW92ZWRGcm9tSGFuZGxlICE9IG51bGwpIHsKKwkJY2xvbmUuZk1vdmVkRnJvbUhhbmRsZSA9ICgoSmF2YUVsZW1lbnQpZk1vdmVkRnJvbUhhbmRsZSkucm9vdGVkQXQocHJvamVjdCk7CisJfQorCWlmIChmTW92ZWRUb0hhbmRsZSAhPSBudWxsKSB7CisJCWNsb25lLmZNb3ZlZFRvSGFuZGxlID0gKChKYXZhRWxlbWVudClmTW92ZWRUb0hhbmRsZSkucm9vdGVkQXQocHJvamVjdCk7CisJfQorCWNsb25lLnJlc291cmNlRGVsdGFzID0gdGhpcy5yZXNvdXJjZURlbHRhczsKKwljbG9uZS5yZXNvdXJjZURlbHRhc0NvdW50ZXIgPSB0aGlzLnJlc291cmNlRGVsdGFzQ291bnRlcjsKKwlyZXR1cm4gY2xvbmU7Cit9CisKKy8qKgorICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhcyBmb3IgYSBjbG9zZWQgZWxlbWVudC4KKyAqLworcHVibGljIHZvaWQgY2xvc2VkKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGVsZW1lbnQpOworCWRlbHRhLmZLaW5kID0gQ0hBTkdFRDsKKwlkZWx0YS5mQ2hhbmdlRmxhZ3MgfD0gRl9DTE9TRUQ7CisJaW5zZXJ0RGVsdGFUcmVlKGVsZW1lbnQsIGRlbHRhKTsKK30KKy8qKgorICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhIGRlbHRhcyBiYXNlZCBvbiB0aGUgYWZmZWN0ZWQgZWxlbWVudAorICogaXRzIGRlbHRhLCBhbmQgdGhlIHJvb3Qgb2YgdGhpcyBkZWx0YSB0cmVlLiBSZXR1cm5zIHRoZSByb290CisgKiBvZiB0aGUgY3JlYXRlZCBkZWx0YSB0cmVlLgorICovCitwcm90ZWN0ZWQgSmF2YUVsZW1lbnREZWx0YSBjcmVhdGVEZWx0YVRyZWUoSUphdmFFbGVtZW50IGVsZW1lbnQsIEphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwlKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgPSBkZWx0YTsKKwlBcnJheUxpc3QgYW5jZXN0b3JzPSBnZXRBbmNlc3RvcnMoZWxlbWVudCk7CisJaWYgKGFuY2VzdG9ycyA9PSBudWxsKSB7CisJCWlmICh0aGlzLmVxdWFsc0FuZFNhbWVQYXJlbnQoZGVsdGEuZ2V0RWxlbWVudCgpLCBnZXRFbGVtZW50KCkpKSB7IC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwkJCS8vIHRoZSBlbGVtZW50IGJlaW5nIGNoYW5nZWQgaXMgdGhlIHJvb3QgZWxlbWVudAorCQkJZktpbmQ9IGRlbHRhLmZLaW5kOworCQkJZkNoYW5nZUZsYWdzID0gZGVsdGEuZkNoYW5nZUZsYWdzOworCQkJZk1vdmVkVG9IYW5kbGUgPSBkZWx0YS5mTW92ZWRUb0hhbmRsZTsKKwkJCWZNb3ZlZEZyb21IYW5kbGUgPSBkZWx0YS5mTW92ZWRGcm9tSGFuZGxlOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBhbmNlc3RvcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgYW5jZXN0b3IgPSAoSUphdmFFbGVtZW50KSBhbmNlc3RvcnMuZ2V0KGkpOworCQkJSmF2YUVsZW1lbnREZWx0YSBhbmNlc3RvckRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoYW5jZXN0b3IpOworCQkJYW5jZXN0b3JEZWx0YS5hZGRBZmZlY3RlZENoaWxkKGNoaWxkRGVsdGEpOworCQkJY2hpbGREZWx0YSA9IGFuY2VzdG9yRGVsdGE7CisJCX0KKwl9CisJcmV0dXJuIGNoaWxkRGVsdGE7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgdHdvIGphdmEgZWxlbWVudHMgYXJlIGVxdWFscyBhbmQgaGF2ZSB0aGUgc2FtZSBwYXJlbnQuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0FuZFNhbWVQYXJlbnQoSUphdmFFbGVtZW50IGUxLCBJSmF2YUVsZW1lbnQgZTIpIHsKKwlJSmF2YUVsZW1lbnQgcGFyZW50MTsKKwlyZXR1cm4gZTEuZXF1YWxzKGUyKSAmJiAoKHBhcmVudDEgPSBlMS5nZXRQYXJlbnQoKSkgIT0gbnVsbCkgJiYgcGFyZW50MS5lcXVhbHMoZTIuZ2V0UGFyZW50KCkpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSA8Y29kZT5KYXZhRWxlbWVudERlbHRhPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKKyAqIGluIHRoZSBkZWx0YSB0cmVlLCBvciBudWxsLCBpZiBubyBkZWx0YSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZm91bmQuCisgKi8KK3Byb3RlY3RlZCBKYXZhRWxlbWVudERlbHRhIGZpbmQoSUphdmFFbGVtZW50IGUpIHsKKwlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGZDaGFuZ2VkRWxlbWVudCwgZSkpIHsgLy8gaGFuZGxlIGNhc2Ugb2YgdHdvIGphcnMgdGhhdCBjYW4gYmUgZXF1YWxzIGJ1dCBub3QgaW4gdGhlIHNhbWUgcHJvamVjdAorCQlyZXR1cm4gdGhpczsKKwl9IGVsc2UgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKChKYXZhRWxlbWVudERlbHRhKWZBZmZlY3RlZENoaWxkcmVuW2ldKS5maW5kKGUpOworCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZGVsdGE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIE1hcmsgdGhpcyBkZWx0YSBhcyBhIGZpbmUtZ3JhaW5lZCBkZWx0YS4KKyAqLworcHVibGljIHZvaWQgZmluZUdyYWluZWQoKSB7CisJZkNoYW5nZUZsYWdzIHw9IEZfRklORV9HUkFJTkVEOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnREZWx0YVtdIGdldEFkZGVkQ2hpbGRyZW4oKSB7CisJcmV0dXJuIGdldENoaWxkcmVuT2ZUeXBlKEFEREVEKTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorICovCitwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKCkgeworCXJldHVybiBmQWZmZWN0ZWRDaGlsZHJlbjsKK30KKy8qKgorICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIHRoZSBwYXJlbnRzIG9mIHRoaXMgZWxlbWVudCB1cCB0byAoYnV0CisgKiBub3QgaW5jbHVkaW5nKSB0aGUgcm9vdCBvZiB0aGlzIHRyZWUgaW4gYm90dG9tLXVwIG9yZGVyLiBJZiB0aGUgZ2l2ZW4KKyAqIGVsZW1lbnQgaXMgbm90IGEgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBvZiB0aGlzIHRyZWUsIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpcyByZXR1cm5lZC4KKyAqLworcHJpdmF0ZSBBcnJheUxpc3QgZ2V0QW5jZXN0b3JzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJSUphdmFFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlBcnJheUxpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKwl3aGlsZSAoIXBhcmVudC5lcXVhbHMoZkNoYW5nZWRFbGVtZW50KSkgeworCQlwYXJlbnRzLmFkZChwYXJlbnQpOworCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJcGFyZW50cy50cmltVG9TaXplKCk7CisJcmV0dXJuIHBhcmVudHM7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqLworcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZ2V0Q2hhbmdlZENoaWxkcmVuKCkgeworCXJldHVybiBnZXRDaGlsZHJlbk9mVHlwZShDSEFOR0VEKTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50RGVsdGFbXSBnZXRDaGlsZHJlbk9mVHlwZShpbnQgdHlwZSkgeworCWludCBsZW5ndGggPSBmQWZmZWN0ZWRDaGlsZHJlbi5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7fTsKKwl9CisJQXJyYXlMaXN0IGNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KGxlbmd0aCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAoZkFmZmVjdGVkQ2hpbGRyZW5baV0uZ2V0S2luZCgpID09IHR5cGUpIHsKKwkJCWNoaWxkcmVuLmFkZChmQWZmZWN0ZWRDaGlsZHJlbltpXSk7CisJCX0KKwl9CisKKwlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuT2ZUeXBlID0gbmV3IElKYXZhRWxlbWVudERlbHRhW2NoaWxkcmVuLnNpemUoKV07CisJY2hpbGRyZW4udG9BcnJheShjaGlsZHJlbk9mVHlwZSk7CisJCisJcmV0dXJuIGNoaWxkcmVuT2ZUeXBlOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBkZWx0YSBmb3IgYSBnaXZlbiBlbGVtZW50LiAgT25seSBsb29rcyBiZWxvdyB0aGlzCisgKiBkZWx0YS4KKyAqLworcHJvdGVjdGVkIEphdmFFbGVtZW50RGVsdGEgZ2V0RGVsdGFGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGdldEVsZW1lbnQoKSwgZWxlbWVudCkpIC8vIGhhbmRsZSBjYXNlIG9mIHR3byBqYXJzIHRoYXQgY2FuIGJlIGVxdWFscyBidXQgbm90IGluIHRoZSBzYW1lIHByb2plY3QKKwkJcmV0dXJuIHRoaXM7CisJaWYgKGZBZmZlY3RlZENoaWxkcmVuLmxlbmd0aCA9PSAwKQorCQlyZXR1cm4gbnVsbDsKKwlpbnQgY2hpbGRyZW5Db3VudCA9IGZBZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuQ291bnQ7IGkrKykgeworCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKEphdmFFbGVtZW50RGVsdGEpZkFmZmVjdGVkQ2hpbGRyZW5baV07CisJCWlmICh0aGlzLmVxdWFsc0FuZFNhbWVQYXJlbnQoZGVsdGEuZ2V0RWxlbWVudCgpLCBlbGVtZW50KSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQlyZXR1cm4gZGVsdGE7CisJCX0gZWxzZSB7CisJCQlkZWx0YSA9ICgoSmF2YUVsZW1lbnREZWx0YSlkZWx0YSkuZ2V0RGVsdGFGb3IoZWxlbWVudCk7CisJCQlpZiAoZGVsdGEgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZGVsdGE7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRFbGVtZW50KCkgeworCXJldHVybiBmQ2hhbmdlZEVsZW1lbnQ7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqLworcHVibGljIGludCBnZXRGbGFncygpIHsKKwlyZXR1cm4gZkNoYW5nZUZsYWdzOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisgKi8KK3B1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKwlyZXR1cm4gZktpbmQ7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRNb3ZlZEZyb21FbGVtZW50KCkgeworCXJldHVybiBmTW92ZWRGcm9tSGFuZGxlOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0TW92ZWRUb0VsZW1lbnQoKSB7CisJcmV0dXJuIGZNb3ZlZFRvSGFuZGxlOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnREZWx0YVtdIGdldFJlbW92ZWRDaGlsZHJlbigpIHsKKwlyZXR1cm4gZ2V0Q2hpbGRyZW5PZlR5cGUoUkVNT1ZFRCk7Cit9CisvKioKKyAqIFJldHVybiB0aGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZSBkZWx0YXMuIFJldHVybiBudWxsIGlmIG5vbmUuCisgKi8KK3B1YmxpYyBJUmVzb3VyY2VEZWx0YVtdIGdldFJlc291cmNlRGVsdGFzKCkgeworCWlmIChyZXNvdXJjZURlbHRhcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlpZiAocmVzb3VyY2VEZWx0YXMubGVuZ3RoICE9IHJlc291cmNlRGVsdGFzQ291bnRlcikgeworCQlTeXN0ZW0uYXJyYXljb3B5KHJlc291cmNlRGVsdGFzLCAwLCByZXNvdXJjZURlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtyZXNvdXJjZURlbHRhc0NvdW50ZXJdLCAwLCByZXNvdXJjZURlbHRhc0NvdW50ZXIpOworCX0KKwlyZXR1cm4gcmVzb3VyY2VEZWx0YXM7Cit9CisvKioKKyAqIEFkZHMgdGhlIG5ldyBlbGVtZW50IHRvIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgb2xkIGFycmF5LgorICogUmV0dXJucyB0aGUgbmV3IGFycmF5LgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50RGVsdGFbXSBncm93QW5kQWRkVG9BcnJheShJSmF2YUVsZW1lbnREZWx0YVtdIGFycmF5LCBJSmF2YUVsZW1lbnREZWx0YSBhZGRpdGlvbikgeworCUlKYXZhRWxlbWVudERlbHRhW10gb2xkID0gYXJyYXk7CisJYXJyYXkgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbb2xkLmxlbmd0aCArIDFdOworCVN5c3RlbS5hcnJheWNvcHkob2xkLCAwLCBhcnJheSwgMCwgb2xkLmxlbmd0aCk7CisJYXJyYXlbb2xkLmxlbmd0aF0gPSBhZGRpdGlvbjsKKwlyZXR1cm4gYXJyYXk7Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIGRlbHRhIHRyZWUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IGFuZCBkZWx0YSwgYW5kIHRoZW4KKyAqIGluc2VydHMgdGhlIHRyZWUgYXMgYW4gYWZmZWN0ZWQgY2hpbGQgb2YgdGhpcyBub2RlLgorICovCitwcm90ZWN0ZWQgdm9pZCBpbnNlcnREZWx0YVRyZWUoSUphdmFFbGVtZW50IGVsZW1lbnQsIEphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwlKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGE9IGNyZWF0ZURlbHRhVHJlZShlbGVtZW50LCBkZWx0YSk7CisJaWYgKCF0aGlzLmVxdWFsc0FuZFNhbWVQYXJlbnQoZWxlbWVudCwgZ2V0RWxlbWVudCgpKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCWFkZEFmZmVjdGVkQ2hpbGQoY2hpbGREZWx0YSk7CisJfQorfQorLyoqCisgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgZGVsdGFzIHJlc3VsdGluZyBmcm9tIGFuIG1vdmUgb3BlcmF0aW9uLgorICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgIm1vdmUgZnJvbSIgZGVsdGEuCisgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogYW5kIHRoZW4gdGhlIG1vdmUgb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgorICovCitwdWJsaWMgdm9pZCBtb3ZlZEZyb20oSUphdmFFbGVtZW50IG1vdmVkRnJvbUVsZW1lbnQsIElKYXZhRWxlbWVudCBtb3ZlZFRvRWxlbWVudCkgeworCUphdmFFbGVtZW50RGVsdGEgcmVtb3ZlZERlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEobW92ZWRGcm9tRWxlbWVudCk7CisJcmVtb3ZlZERlbHRhLmZLaW5kID0gUkVNT1ZFRDsKKwlyZW1vdmVkRGVsdGEuZkNoYW5nZUZsYWdzIHw9IEZfTU9WRURfVE87CisJcmVtb3ZlZERlbHRhLmZNb3ZlZFRvSGFuZGxlID0gbW92ZWRUb0VsZW1lbnQ7CisJaW5zZXJ0RGVsdGFUcmVlKG1vdmVkRnJvbUVsZW1lbnQsIHJlbW92ZWREZWx0YSk7Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgcmVzdWx0aW5nIGZyb20gYW4gbW92ZSBvcGVyYXRpb24uCisgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIHRoZSAibW92ZSB0byIgZGVsdGEuCisgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogYW5kIHRoZW4gdGhlIG1vdmUgb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgorICovCitwdWJsaWMgdm9pZCBtb3ZlZFRvKElKYXZhRWxlbWVudCBtb3ZlZFRvRWxlbWVudCwgSUphdmFFbGVtZW50IG1vdmVkRnJvbUVsZW1lbnQpIHsKKwlKYXZhRWxlbWVudERlbHRhIGFkZGVkRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShtb3ZlZFRvRWxlbWVudCk7CisJYWRkZWREZWx0YS5mS2luZCA9IEFEREVEOworCWFkZGVkRGVsdGEuZkNoYW5nZUZsYWdzIHw9IEZfTU9WRURfRlJPTTsKKwlhZGRlZERlbHRhLmZNb3ZlZEZyb21IYW5kbGUgPSBtb3ZlZEZyb21FbGVtZW50OworCWluc2VydERlbHRhVHJlZShtb3ZlZFRvRWxlbWVudCwgYWRkZWREZWx0YSk7Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgZm9yIGFuIG9wZW5lZCBlbGVtZW50LgorICovCitwdWJsaWMgdm9pZCBvcGVuZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoZWxlbWVudCk7CisJZGVsdGEuZktpbmQgPSBDSEFOR0VEOworCWRlbHRhLmZDaGFuZ2VGbGFncyB8PSBGX09QRU5FRDsKKwlpbnNlcnREZWx0YVRyZWUoZWxlbWVudCwgZGVsdGEpOworfQorLyoqCisgKiBSZW1vdmVzIHRoZSBjaGlsZCBkZWx0YSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFmZmVjdGVkIGNoaWxkcmVuLgorICovCitwcm90ZWN0ZWQgdm9pZCByZW1vdmVBZmZlY3RlZENoaWxkKEphdmFFbGVtZW50RGVsdGEgY2hpbGQpIHsKKwlpbnQgaW5kZXggPSAtMTsKKwlpZiAoZkFmZmVjdGVkQ2hpbGRyZW4gIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5lcXVhbHNBbmRTYW1lUGFyZW50KGZBZmZlY3RlZENoaWxkcmVuW2ldLmdldEVsZW1lbnQoKSwgY2hpbGQuZ2V0RWxlbWVudCgpKSkgeyAvLyBoYW5kbGUgY2FzZSBvZiB0d28gamFycyB0aGF0IGNhbiBiZSBlcXVhbHMgYnV0IG5vdCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQkJaW5kZXggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChpbmRleCA+PSAwKSB7CisJCWZBZmZlY3RlZENoaWxkcmVuPSByZW1vdmVBbmRTaHJpbmtBcnJheShmQWZmZWN0ZWRDaGlsZHJlbiwgaW5kZXgpOworCX0KK30KKy8qKgorICogUmVtb3ZlcyB0aGUgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4KKyAqIFJldHVybnMgdGhlIGEgbmV3IGFycmF5IHdoaWNoIGhhcyBzaHJ1bmsuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnREZWx0YVtdIHJlbW92ZUFuZFNocmlua0FycmF5KElKYXZhRWxlbWVudERlbHRhW10gb2xkLCBpbnQgaW5kZXgpIHsKKwlJSmF2YUVsZW1lbnREZWx0YVtdIGFycmF5ID0gbmV3IElKYXZhRWxlbWVudERlbHRhW29sZC5sZW5ndGggLSAxXTsKKwlpZiAoaW5kZXggPiAwKQorCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgYXJyYXksIDAsIGluZGV4KTsKKwlpbnQgcmVzdCA9IG9sZC5sZW5ndGggLSBpbmRleCAtIDE7CisJaWYgKHJlc3QgPiAwKQorCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgaW5kZXggKyAxLCBhcnJheSwgaW5kZXgsIHJlc3QpOworCXJldHVybiBhcnJheTsKK30KKy8qKgorICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhcyByZXN1bHRpbmcgZnJvbSBhbiBkZWxldGUgb3BlcmF0aW9uLgorICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyByZW1vdmVkIGRlbHRhcy4KKyAqIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3QgZGVsdGEgCisgKiBhbmQgdGhlbiB0aGUgZGVsZXRlIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KKyAqLworcHVibGljIHZvaWQgcmVtb3ZlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCUphdmFFbGVtZW50RGVsdGEgcmVtb3ZlZERlbHRhPSBuZXcgSmF2YUVsZW1lbnREZWx0YShlbGVtZW50KTsKKwlpbnNlcnREZWx0YVRyZWUoZWxlbWVudCwgcmVtb3ZlZERlbHRhKTsKKwlKYXZhRWxlbWVudERlbHRhIGFjdHVhbERlbHRhID0gZ2V0RGVsdGFGb3IoZWxlbWVudCk7CisJaWYgKGFjdHVhbERlbHRhICE9IG51bGwpIHsKKwkJYWN0dWFsRGVsdGEuZktpbmQgPSBSRU1PVkVEOworCQlhY3R1YWxEZWx0YS5mQ2hhbmdlRmxhZ3MgPSAwOworCQlhY3R1YWxEZWx0YS5mQWZmZWN0ZWRDaGlsZHJlbiA9IGZnRW1wdHlEZWx0YTsKKwl9Cit9CisvKioKKyAqIENyZWF0ZXMgdGhlIG5lc3RlZCBkZWx0YXMgcmVzdWx0aW5nIGZyb20gYSBjaGFuZ2Ugb3BlcmF0aW9uLgorICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBjaGFuZ2UgZGVsdGFzLgorICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBkZWx0YSAKKyAqIGFuZCB0aGVuIGEgY2hhbmdlIG9wZXJhdGlvbiBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZC4KKyAqLworcHVibGljIHZvaWQgc291cmNlQXR0YWNoZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlKYXZhRWxlbWVudERlbHRhIGF0dGFjaGVkRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShlbGVtZW50KTsKKwlhdHRhY2hlZERlbHRhLmZLaW5kID0gQ0hBTkdFRDsKKwlhdHRhY2hlZERlbHRhLmZDaGFuZ2VGbGFncyB8PSBGX1NPVVJDRUFUVEFDSEVEOworCWluc2VydERlbHRhVHJlZShlbGVtZW50LCBhdHRhY2hlZERlbHRhKTsKK30KKy8qKgorICogQ3JlYXRlcyB0aGUgbmVzdGVkIGRlbHRhcyByZXN1bHRpbmcgZnJvbSBhIGNoYW5nZSBvcGVyYXRpb24uCisgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGNoYW5nZSBkZWx0YXMuCisgKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IGRlbHRhIAorICogYW5kIHRoZW4gYSBjaGFuZ2Ugb3BlcmF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kLgorICovCitwdWJsaWMgdm9pZCBzb3VyY2VEZXRhY2hlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCUphdmFFbGVtZW50RGVsdGEgZGV0YWNoZWREZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGVsZW1lbnQpOworCWRldGFjaGVkRGVsdGEuZktpbmQgPSBDSEFOR0VEOworCWRldGFjaGVkRGVsdGEuZkNoYW5nZUZsYWdzIHw9IEZfU09VUkNFREVUQUNIRUQ7CisJaW5zZXJ0RGVsdGFUcmVlKGVsZW1lbnQsIGRldGFjaGVkRGVsdGEpOworfQorLyoqIAorICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRlbHRhJ3MKKyAqIHN0cnVjdHVyZSBzdWl0YWJsZSBmb3IgZGVidWcgcHVycG9zZXMuCisgKgorICogQHNlZSAjdG9TdHJpbmcoKQorICovCitwdWJsaWMgU3RyaW5nIHRvRGVidWdTdHJpbmcoaW50IGRlcHRoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlmb3IgKGludCBpPSAwOyBpIDwgZGVwdGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKCdcdCcpOworCX0KKwlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnQpZ2V0RWxlbWVudCgpKS50b0RlYnVnU3RyaW5nKCkpOworCWJ1ZmZlci5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaCAoZ2V0S2luZCgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOgorCQkJYnVmZmVyLmFwcGVuZCgnKycpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCA6CisJCQlidWZmZXIuYXBwZW5kKCctJyk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDoKKwkJCWJ1ZmZlci5hcHBlbmQoJyonKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWJ1ZmZlci5hcHBlbmQoJz8nKTsKKwkJCWJyZWFrOworCX0KKwlidWZmZXIuYXBwZW5kKCJdOiB7Iik7IC8vJE5PTi1OTFMtMSQKKwlpbnQgY2hhbmdlRmxhZ3MgPSBnZXRGbGFncygpOworCWJvb2xlYW4gcHJldiA9IGZhbHNlOworCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiQ0hJTERSRU4iKTsgLy8kTk9OLU5MUy0xJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCkgIT0gMCkgeworCQlpZiAocHJldikKKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIkNPTlRFTlQiKTsgLy8kTk9OLU5MUy0xJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9WRURfRlJPTSkgIT0gMCkgeworCQlpZiAocHJldikKKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIk1PVkVEX0ZST00oIiArICgoSmF2YUVsZW1lbnQpZ2V0TW92ZWRGcm9tRWxlbWVudCgpKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9WRURfVE8pICE9IDApIHsKKwkJaWYgKHByZXYpCisJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJNT1ZFRF9UTygiICsgKChKYXZhRWxlbWVudClnZXRNb3ZlZFRvRWxlbWVudCgpKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJaWYgKChjaGFuZ2VGbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiQURERUQgVE8gQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDApIHsKKwkJaWYgKHByZXYpCisJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJSRU1PVkVEIEZST00gQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9SRU9SREVSKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiUkVPUkRFUkVEIElOIENMQVNTUEFUSCIpOyAvLyROT04tTkxTLTEkCisJCXByZXYgPSB0cnVlOworCX0KKwlpZiAoKGNoYW5nZUZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCkgIT0gMCkgeworCQlpZiAocHJldikKKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIkFSQ0hJVkUgQ09OVEVOVCBDSEFOR0VEIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRUFUVEFDSEVEKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiU09VUkNFIEFUVEFDSEVEIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiU09VUkNFIERFVEFDSEVEIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PRElGSUVSUykgIT0gMCkgeworCQlpZiAocHJldikKKwkJCWJ1ZmZlci5hcHBlbmQoIiB8ICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIk1PRElGSUVSUyBDSEFOR0VEIik7IC8vJE5PTi1OTFMtMSQKKwkJcHJldiA9IHRydWU7CisJfQorCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1NVUEVSX1RZUEVTKSAhPSAwKSB7CisJCWlmIChwcmV2KQorCQkJYnVmZmVyLmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiU1VQRVIgVFlQRVMgQ0hBTkdFRCIpOyAvLyROT04tTkxTLTEkCisJCXByZXYgPSB0cnVlOworCX0KKwlpZiAoKGNoYW5nZUZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9GSU5FX0dSQUlORUQpICE9IDApIHsKKwkJaWYgKHByZXYpCisJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJGSU5FIEdSQUlORUQiKTsgLy8kTk9OLU5MUy0xJAorCQlwcmV2ID0gdHJ1ZTsKKwl9CisJYnVmZmVyLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCisJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CisJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnREZWx0YSkgY2hpbGRyZW5baV0pLnRvRGVidWdTdHJpbmcoZGVwdGggKyAxKSk7CisJCX0KKwl9CisJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZURlbHRhc0NvdW50ZXI7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKCJcbiIpOy8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXB0aCsxOyBqKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1x0Jyk7CisJCX0KKwkJSVJlc291cmNlRGVsdGEgcmVzb3VyY2VEZWx0YSA9IHJlc291cmNlRGVsdGFzW2ldOworCQlidWZmZXIuYXBwZW5kKHJlc291cmNlRGVsdGEudG9TdHJpbmcoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCQlzd2l0Y2ggKHJlc291cmNlRGVsdGEuZ2V0S2luZCgpKSB7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQlidWZmZXIuYXBwZW5kKCcrJyk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCWJ1ZmZlci5hcHBlbmQoJy0nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CisJCQkJYnVmZmVyLmFwcGVuZCgnKicpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJYnVmZmVyLmFwcGVuZCgnPycpOworCQkJCWJyZWFrOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisvKiogCisgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGVsdGEncworICogc3RydWN0dXJlIHN1aXRhYmxlIGZvciBkZWJ1ZyBwdXJwb3Nlcy4KKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gdG9EZWJ1Z1N0cmluZygwKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGFCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGM0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFyZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqIEEgamF2YSBlbGVtZW50IGRlbHRhIGJpdWxkZXIgY3JlYXRlcyBhIGphdmEgZWxlbWVudCBkZWx0YSBvbgorICogYSBqYXZhIGVsZW1lbnQgYmV0d2VlbiB0aGUgdmVyc2lvbiBvZiB0aGUgamF2YSBlbGVtZW50CisgKiBhdCB0aGUgdGltZSB0aGUgY29tcGFyYXRvciB3YXMgY3JlYXRlZCBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbiAKKyAqIG9mIHRoZSBqYXZhIGVsZW1lbnQuCisgKgorICogSXQgcGVyZm9ybXMgdGhpcyBvcGVyYXRpb24gYnkgbG9jYWxseSBjYWNoaW5nIHRoZSBjb250ZW50cyBvZiAKKyAqIHRoZSBqYXZhIGVsZW1lbnQgd2hlbiBpdCBpcyBjcmVhdGVkLiBXaGVuIHRoZSBtZXRob2QKKyAqIGNyZWF0ZURlbHRhcygpIGlzIGNhbGxlZCwgaXQgY3JlYXRlcyBhIGRlbHRhIG92ZXIgdGhlIGNhY2hlZCAKKyAqIGNvbnRlbnRzIGFuZCB0aGUgbmV3IGNvbnRlbnRzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIgeworCS8qKgorCSAqIFRoZSBqYXZhIGVsZW1lbnQgaGFuZGxlCisJICovCisJSUphdmFFbGVtZW50IGphdmFFbGVtZW50OworCisJLyoqCisJICogVGhlIG1heGltdW0gZGVwdGggaW4gdGhlIGphdmEgZWxlbWVudCBjaGlsZHJlbiB3ZSBzaG91bGQgbG9vayBpbnRvCisJICovCisJaW50IG1heERlcHRoID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKwkvKioKKwkgKiBUaGUgb2xkIGhhbmRsZSB0byBpbmZvIHJlbGF0aW9uc2hpcHMKKwkgKi8KKwlNYXAgaW5mb3M7CisKKwkvKioKKwkgKiBUaGUgb2xkIHBvc2l0aW9uIGluZm8KKwkgKi8KKwlNYXAgb2xkUG9zaXRpb25zOworCisJLyoqCisJICogVGhlIG5ldyBwb3NpdGlvbiBpbmZvCisJICovCisJTWFwIG5ld1Bvc2l0aW9uczsKKworCS8qKgorCSAqIENoYW5nZSBkZWx0YQorCSAqLworCUphdmFFbGVtZW50RGVsdGEgZGVsdGE7CisKKwkvKioKKwkgKiBMaXN0IG9mIGFkZGVkIGVsZW1lbnRzCisJICovCisJQXJyYXlMaXN0IGFkZGVkOworCisJLyoqCisJICogTGlzdCBvZiByZW1vdmVkIGVsZW1lbnRzCisJICovCisJQXJyYXlMaXN0IHJlbW92ZWQ7CisJCisJLyoqCisJICogRG91Ymx5IGxpbmtlZCBsaXN0IGl0ZW0KKwkgKi8KKwljbGFzcyBMaXN0SXRlbSB7CisJCXB1YmxpYyBJSmF2YUVsZW1lbnQgcHJldmlvdXM7CisJCXB1YmxpYyBJSmF2YUVsZW1lbnQgbmV4dDsKKworCQlwdWJsaWMgTGlzdEl0ZW0oSUphdmFFbGVtZW50IHByZXZpb3VzLCBJSmF2YUVsZW1lbnQgbmV4dCkgeworCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOworCQkJdGhpcy5uZXh0ID0gbmV4dDsKKwkJfQorCX0KKy8qKgorICogQ3JlYXRlcyBhIGphdmEgZWxlbWVudCBjb21wYXJhdG9yIG9uIGEgamF2YSBlbGVtZW50CisgKiBsb29raW5nIGFzIGRlZXAgYXMgbmVjZXNzYXJ5LgorICovCitwdWJsaWMgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7CisJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50OworCXRoaXMuaW5pdGlhbGl6ZSgpOworCXRoaXMucmVjb3JkRWxlbWVudEluZm8oCisJCWphdmFFbGVtZW50LCAKKwkJKEphdmFNb2RlbCl0aGlzLmphdmFFbGVtZW50LmdldEphdmFNb2RlbCgpLAorCQkwKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIGphdmEgZWxlbWVudCBjb21wYXJhdG9yIG9uIGEgamF2YSBlbGVtZW50CisgKiBsb29raW5nIG9ubHkgJ21heERlcHRoJyBsZXZlbHMgZGVlcC4KKyAqLworcHVibGljIEphdmFFbGVtZW50RGVsdGFCdWlsZGVyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgaW50IG1heERlcHRoKSB7CisJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50OworCXRoaXMubWF4RGVwdGggPSBtYXhEZXB0aDsKKwl0aGlzLmluaXRpYWxpemUoKTsKKwl0aGlzLnJlY29yZEVsZW1lbnRJbmZvKAorCQlqYXZhRWxlbWVudCwgCisJCShKYXZhTW9kZWwpdGhpcy5qYXZhRWxlbWVudC5nZXRKYXZhTW9kZWwoKSwKKwkJMCk7Cit9CisvKioKKyAqIFJlcGFpcnMgdGhlIHBvc2l0aW9uaW5nIGluZm9ybWF0aW9uCisgKiBhZnRlciBhbiBlbGVtZW50IGhhcyBiZWVuIGFkZGVkCisgKi8KK3ByaXZhdGUgdm9pZCBhZGRlZChJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXRoaXMuYWRkZWQuYWRkKGVsZW1lbnQpOworCUxpc3RJdGVtIGN1cnJlbnQgPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGVsZW1lbnQpOworCUxpc3RJdGVtIHByZXZpb3VzID0gbnVsbCwgbmV4dCA9IG51bGw7CisJaWYgKGN1cnJlbnQucHJldmlvdXMgIT0gbnVsbCkKKwkJcHJldmlvdXMgPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGN1cnJlbnQucHJldmlvdXMpOworCWlmIChjdXJyZW50Lm5leHQgIT0gbnVsbCkKKwkJbmV4dCA9IHRoaXMuZ2V0TmV3UG9zaXRpb24oY3VycmVudC5uZXh0KTsKKwlpZiAocHJldmlvdXMgIT0gbnVsbCkKKwkJcHJldmlvdXMubmV4dCA9IGN1cnJlbnQubmV4dDsKKwlpZiAobmV4dCAhPSBudWxsKQorCQluZXh0LnByZXZpb3VzID0gY3VycmVudC5wcmV2aW91czsKK30KKy8qKgorICogQnVpbGRzIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGFzIGJldHdlZW4gdGhlIG9sZCBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbgorICogdW5pdCBhbmQgaXRzIG5ldyBjb250ZW50LgorICovCitwdWJsaWMgdm9pZCBidWlsZERlbHRhcygpIHsKKwl0aGlzLnJlY29yZE5ld1Bvc2l0aW9ucyh0aGlzLmphdmFFbGVtZW50LCAwKTsKKwl0aGlzLmZpbmRBZGRpdGlvbnModGhpcy5qYXZhRWxlbWVudCwgMCk7CisJdGhpcy5maW5kRGVsZXRpb25zKCk7CisJdGhpcy5maW5kQ2hhbmdlc0luUG9zaXRpb25pbmcodGhpcy5qYXZhRWxlbWVudCwgMCk7CisJdGhpcy50cmltRGVsdGEodGhpcy5kZWx0YSk7Cit9CisvKioKKyAqIEZpbmRzIGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCBvciBjaGFuZ2VkLgorICovCitwcml2YXRlIHZvaWQgZmluZEFkZGl0aW9ucyhJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCwgaW50IGRlcHRoKSB7CisJSmF2YUVsZW1lbnRJbmZvIG9sZEluZm8gPSB0aGlzLmdldEVsZW1lbnRJbmZvKG5ld0VsZW1lbnQpOworCWlmIChvbGRJbmZvID09IG51bGwgJiYgZGVwdGggPCB0aGlzLm1heERlcHRoKSB7CisJCXRoaXMuZGVsdGEuYWRkZWQobmV3RWxlbWVudCk7CisJCWFkZGVkKG5ld0VsZW1lbnQpOworCX0gZWxzZSB7CisJCXRoaXMucmVtb3ZlRWxlbWVudEluZm8obmV3RWxlbWVudCk7CisJfQorCQorCWlmIChkZXB0aCA+PSB0aGlzLm1heERlcHRoKSB7CisJCS8vIG1hcmsgZWxlbWVudCBhcyBjaGFuZ2VkCisJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQlyZXR1cm47CisJfQorCisJSmF2YUVsZW1lbnRJbmZvIG5ld0luZm8gPSBudWxsOworCXRyeSB7IAorCQluZXdJbmZvID0gKChKYXZhRWxlbWVudCluZXdFbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KKwkKKwl0aGlzLmZpbmRDb250ZW50Q2hhbmdlKG9sZEluZm8sIG5ld0luZm8sIG5ld0VsZW1lbnQpOworCQkKKwlpZiAob2xkSW5mbyAhPSBudWxsICYmIG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50KSB7CisKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBuZXdJbmZvLmdldENoaWxkcmVuKCk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOworCQkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5maW5kQWRkaXRpb25zKGNoaWxkcmVuW2ldLCBkZXB0aCArIDEpOworCQkJfQorCQl9CQkKKwl9Cit9CisvKioKKyAqIExvb2tzIGZvciBjaGFuZ2VkIHBvc2l0aW9uaW5nIG9mIGVsZW1lbnRzLgorICovCitwcml2YXRlIHZvaWQgZmluZENoYW5nZXNJblBvc2l0aW9uaW5nKElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgZGVwdGgpIHsKKwlpZiAoZGVwdGggPj0gdGhpcy5tYXhEZXB0aCB8fCB0aGlzLmFkZGVkLmNvbnRhaW5zKGVsZW1lbnQpIHx8IHRoaXMucmVtb3ZlZC5jb250YWlucyhlbGVtZW50KSkKKwkJcmV0dXJuOworCQkKKwlpZiAoIWlzUG9zaXRpb25lZENvcnJlY3RseShlbGVtZW50KSkgeworCQl0aGlzLmRlbHRhLnJlbW92ZWQoZWxlbWVudCk7CisJCXRoaXMuZGVsdGEuYWRkZWQoZWxlbWVudCk7CisJfSAKKwkKKwlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYXJlbnQpIHsKKwkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSBudWxsOworCQl0cnkgeyAKKwkJCWluZm8gPSAoKEphdmFFbGVtZW50KWVsZW1lbnQpLmdldEVsZW1lbnRJbmZvKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gaW5mby5nZXRDaGlsZHJlbigpOworCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCXRoaXMuZmluZENoYW5nZXNJblBvc2l0aW9uaW5nKGNoaWxkcmVuW2ldLCBkZXB0aCArIDEpOworCQkJfQorCQl9CQkKKwl9Cit9CisvKioKKyAqIFRoZSBlbGVtZW50cyBhcmUgZXF1aXZhbGVudCwgYnV0IG1pZ2h0IGhhdmUgY29udGVudCBjaGFuZ2VzLgorICovCitwcml2YXRlIHZvaWQgZmluZENvbnRlbnRDaGFuZ2UoSmF2YUVsZW1lbnRJbmZvIG9sZEluZm8sIEphdmFFbGVtZW50SW5mbyBuZXdJbmZvLCBJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCkgeworCWlmIChvbGRJbmZvIGluc3RhbmNlb2YgTWVtYmVyRWxlbWVudEluZm8gJiYgbmV3SW5mbyBpbnN0YW5jZW9mIE1lbWJlckVsZW1lbnRJbmZvKSB7CisJCWlmICgoKE1lbWJlckVsZW1lbnRJbmZvKW9sZEluZm8pLmdldE1vZGlmaWVycygpICE9ICgoTWVtYmVyRWxlbWVudEluZm8pbmV3SW5mbykuZ2V0TW9kaWZpZXJzKCkpIHsKKwkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX01PRElGSUVSUyk7CisJCX0gZWxzZSBpZiAob2xkSW5mbyBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VNZXRob2RFbGVtZW50SW5mbykgeworCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscygKKwkJCQkJKChTb3VyY2VNZXRob2RFbGVtZW50SW5mbylvbGRJbmZvKS5nZXRSZXR1cm5UeXBlTmFtZSgpLCAKKwkJCQkJKChTb3VyY2VNZXRob2RFbGVtZW50SW5mbyluZXdJbmZvKS5nZXRSZXR1cm5UeXBlTmFtZSgpKSkgeworCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQkJfQorCQl9IGVsc2UgaWYgKG9sZEluZm8gaW5zdGFuY2VvZiBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKSB7CisJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKAorCQkJCQkoKFNvdXJjZUZpZWxkRWxlbWVudEluZm8pb2xkSW5mbykuZ2V0VHlwZU5hbWUoKSwgCisJCQkJCSgoU291cmNlRmllbGRFbGVtZW50SW5mbyluZXdJbmZvKS5nZXRUeXBlTmFtZSgpKSkgeworCQkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQkJfQorCQl9CisJfQorCWlmIChvbGRJbmZvIGluc3RhbmNlb2YgU291cmNlVHlwZUVsZW1lbnRJbmZvICYmIG5ld0luZm8gaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8pIHsKKwkJU291cmNlVHlwZUVsZW1lbnRJbmZvIG9sZFNvdXJjZVR5cGVJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbylvbGRJbmZvOworCQlTb3VyY2VUeXBlRWxlbWVudEluZm8gbmV3U291cmNlVHlwZUluZm8gPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKW5ld0luZm87CisJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMob2xkU291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKSkgCisJCQl8fCAhQ2hhck9wZXJhdGlvbi5lcXVhbHMob2xkU291cmNlVHlwZUluZm8uZ2V0SW50ZXJmYWNlTmFtZXMoKSwgbmV3U291cmNlVHlwZUluZm8uZ2V0SW50ZXJmYWNlTmFtZXMoKSkpIHsKKwkJCXRoaXMuZGVsdGEuY2hhbmdlZChuZXdFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX1NVUEVSX1RZUEVTKTsKKwkJfQorCX0KK30KKy8qKgorICogQWRkcyByZW1vdmVkIGRlbHRhcyBmb3IgYW55IGhhbmRsZXMgbGVmdCBpbiB0aGUgdGFibGUKKyAqLworcHJpdmF0ZSB2b2lkIGZpbmREZWxldGlvbnMoKSB7CisJSXRlcmF0b3IgaXRlciA9IHRoaXMuaW5mb3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwl3aGlsZShpdGVyLmhhc05leHQoKSkgeworCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChJSmF2YUVsZW1lbnQpaXRlci5uZXh0KCk7CisJCXRoaXMuZGVsdGEucmVtb3ZlZChlbGVtZW50KTsKKwkJdGhpcy5yZW1vdmVkKGVsZW1lbnQpOworCX0KK30KK3ByaXZhdGUgSmF2YUVsZW1lbnRJbmZvIGdldEVsZW1lbnRJbmZvKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJcmV0dXJuIChKYXZhRWxlbWVudEluZm8pdGhpcy5pbmZvcy5nZXQoZWxlbWVudCk7Cit9Citwcml2YXRlIExpc3RJdGVtIGdldE5ld1Bvc2l0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJcmV0dXJuIChMaXN0SXRlbSl0aGlzLm5ld1Bvc2l0aW9ucy5nZXQoZWxlbWVudCk7Cit9Citwcml2YXRlIExpc3RJdGVtIGdldE9sZFBvc2l0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJcmV0dXJuIChMaXN0SXRlbSl0aGlzLm9sZFBvc2l0aW9ucy5nZXQoZWxlbWVudCk7Cit9Citwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwl0aGlzLmluZm9zID0gbmV3IEhhc2hNYXAoMjApOworCXRoaXMub2xkUG9zaXRpb25zID0gbmV3IEhhc2hNYXAoMjApOworCXRoaXMubmV3UG9zaXRpb25zID0gbmV3IEhhc2hNYXAoMjApOworCXRoaXMucHV0T2xkUG9zaXRpb24odGhpcy5qYXZhRWxlbWVudCwgbmV3IExpc3RJdGVtKG51bGwsIG51bGwpKTsKKwl0aGlzLnB1dE5ld1Bvc2l0aW9uKHRoaXMuamF2YUVsZW1lbnQsIG5ldyBMaXN0SXRlbShudWxsLCBudWxsKSk7CisJdGhpcy5kZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGphdmFFbGVtZW50KTsKKwkKKwkvLyBpZiBidWlsZGluZyBhIGRlbHRhIG9uIGEgY29tcGlsYXRpb24gdW5pdCBvciBiZWxvdywgCisJLy8gaXQncyBhIGZpbmUgZ3JhaW5lZCBkZWx0YQorCWlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID49IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CisJCXRoaXMuZGVsdGEuZmluZUdyYWluZWQoKTsKKwl9CisJCisJdGhpcy5hZGRlZCA9IG5ldyBBcnJheUxpc3QoNSk7CisJdGhpcy5yZW1vdmVkID0gbmV3IEFycmF5TGlzdCg1KTsKK30KKy8qKgorICogSW5zZXJ0cyBwb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVsZW1lbnRzIGludG8gdGhlIG5ldyBvciBvbGQgcG9zaXRpb25zIHRhYmxlCisgKi8KK3ByaXZhdGUgdm9pZCBpbnNlcnRQb3NpdGlvbnMoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gaXNOZXcpIHsKKwlpbnQgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCUlKYXZhRWxlbWVudCBwcmV2aW91cyA9IG51bGwsIGN1cnJlbnQgPSBudWxsLCBuZXh0ID0gKGxlbmd0aCA+IDApID8gZWxlbWVudHNbMF0gOiBudWxsOworCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlwcmV2aW91cyA9IGN1cnJlbnQ7CisJCWN1cnJlbnQgPSBuZXh0OworCQluZXh0ID0gKGkgKyAxIDwgbGVuZ3RoKSA/IGVsZW1lbnRzW2kgKyAxXSA6IG51bGw7CisJCWlmIChpc05ldykgeworCQkJdGhpcy5wdXROZXdQb3NpdGlvbihjdXJyZW50LCBuZXcgTGlzdEl0ZW0ocHJldmlvdXMsIG5leHQpKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucHV0T2xkUG9zaXRpb24oY3VycmVudCwgbmV3IExpc3RJdGVtKHByZXZpb3VzLCBuZXh0KSk7CisJCX0KKwl9Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZWxlbWVudHMgcmVwcmVzZW50IHRoZSBhbiBlcXVpdmFsZW50IGRlY2xhcmF0aW9uLgorICoKKyAqIDxwPk5PVEU6IFNpbmNlIHRoaXMgY29tcGFyaXNvbiBjYW4gYmUgZG9uZSB3aXRoIGhhbmRsZSBpbmZvIG9ubHksCisgKiBub25lIG9mIHRoZSBpbnRlcm5hbCBjYWxscyBuZWVkIHRvIHVzZSB0aGUgbG9jYWxseSBjYWNoZWQgY29udGVudHMKKyAqIG9mIHRoZSBvbGQgY29tcGlsYXRpb24gdW5pdC4KKyAqLworcHJpdmF0ZSBib29sZWFuIGlzSWRlbnRpY2FsKEphdmFFbGVtZW50IGUxLCBKYXZhRWxlbWVudCBlMikgeworCWlmIChlMSA9PSBudWxsIF4gZTIgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChlMSA9PSBudWxsKQorCQlyZXR1cm4gdHJ1ZTsKKwkJCisJaWYgKGUxLmZMRVR5cGUgPT0gZTIuZkxFVHlwZSkgeworCQlpZiAoZTEuZ2V0T2NjdXJyZW5jZUNvdW50KCkgIT0gZTIuZ2V0T2NjdXJyZW5jZUNvdW50KCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXN3aXRjaCAoZTEuZkxFVHlwZSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6CisJCQljYXNlIElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT046CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKKwkJCQlyZXR1cm4gZTEuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZTIuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgorCQkJCUlUeXBlIHQxPSAoSVR5cGUpZTE7CisJCQkJSVR5cGUgdDI9IChJVHlwZSllMjsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gKCEodDEuaXNDbGFzcygpIF4gdDIuaXNDbGFzcygpKSAmJiB0MS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0Mi5nZXRFbGVtZW50TmFtZSgpKSk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKKwkJCQlJTWV0aG9kIG0xPSAoSU1ldGhvZCllMTsKKwkJCQlJTWV0aG9kIG0yPSAoSU1ldGhvZCllMjsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gbTEuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobTIuZ2V0RWxlbWVudE5hbWUoKSkgJiYgbTEuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKG0yLmdldFNpZ25hdHVyZSgpKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJY2FzZSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVI6CisJCQljYXNlIElKYXZhRWxlbWVudC5JTVBPUlRfQ09OVEFJTkVSOgorCQkJCXJldHVybiB0cnVlOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorLyoqCisgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZC4KKyAqIFRha2VzIGludG8gYWNjb3VudCBhZGRpdGlvbnMgc28gdGhhdCBlbGVtZW50cyBmb2xsb3dpbmcKKyAqIG5ldyBlbGVtZW50cyB3aWxsIG5vdCBhcHBlYXIgb3V0IG9mIHBsYWNlLgorICovCitwcml2YXRlIGJvb2xlYW4gaXNQb3NpdGlvbmVkQ29ycmVjdGx5KElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJTGlzdEl0ZW0gb2xkTGlzdEl0ZW0gPSB0aGlzLmdldE9sZFBvc2l0aW9uKGVsZW1lbnQpOworCWlmIChvbGRMaXN0SXRlbSA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7CisJSUphdmFFbGVtZW50IG9sZFByZXZpb3VzID0gb2xkTGlzdEl0ZW0ucHJldmlvdXM7CisJTGlzdEl0ZW0gbmV3TGlzdEl0ZW0gPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGVsZW1lbnQpOworCWlmIChuZXdMaXN0SXRlbSA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7CisJSUphdmFFbGVtZW50IG5ld1ByZXZpb3VzID0gbmV3TGlzdEl0ZW0ucHJldmlvdXM7IAorCWlmIChvbGRQcmV2aW91cyA9PSBuZXdQcmV2aW91cykKKwkJcmV0dXJuIHRydWU7CisJSUphdmFFbGVtZW50IGxhc3ROZXdQcmV2aW91cyA9IG51bGw7CisJd2hpbGUobGFzdE5ld1ByZXZpb3VzICE9IG5ld1ByZXZpb3VzKSB7CisJCWlmIChpc0lkZW50aWNhbCgoSmF2YUVsZW1lbnQpb2xkUHJldmlvdXMsIChKYXZhRWxlbWVudCluZXdQcmV2aW91cykpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJbGFzdE5ld1ByZXZpb3VzID0gbmV3UHJldmlvdXM7CisJCS8vIGlmIG5ld1ByZXZpb3VzIGlzIG51bGwgYXQgdGhpcyB0aW1lIHdlIHNob3VsZCBleGl0IHRoZSBsb29wLgorCQlpZiAobmV3UHJldmlvdXMgPT0gbnVsbCkgYnJlYWs7CisJCW5ld1ByZXZpb3VzID0gKHRoaXMuZ2V0TmV3UG9zaXRpb24obmV3UHJldmlvdXMpKS5wcmV2aW91czsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJpdmF0ZSB2b2lkIHB1dEVsZW1lbnRJbmZvKElKYXZhRWxlbWVudCBlbGVtZW50LCBKYXZhRWxlbWVudEluZm8gaW5mbykgeworCXRoaXMuaW5mb3MucHV0KGVsZW1lbnQsIGluZm8pOworfQorcHJpdmF0ZSB2b2lkIHB1dE5ld1Bvc2l0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50LCBMaXN0SXRlbSBwb3NpdGlvbikgeworCXRoaXMubmV3UG9zaXRpb25zLnB1dChlbGVtZW50LCBwb3NpdGlvbik7Cit9Citwcml2YXRlIHZvaWQgcHV0T2xkUG9zaXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIExpc3RJdGVtIHBvc2l0aW9uKSB7CisJdGhpcy5vbGRQb3NpdGlvbnMucHV0KGVsZW1lbnQsIHBvc2l0aW9uKTsKK30KKy8qKgorICogUmVjb3JkcyB0aGlzIGVsZW1lbnRzIGluZm8sIGFuZCBhdHRlbXB0cworICogdG8gcmVjb3JkIHRoZSBpbmZvIGZvciB0aGUgY2hpbGRyZW4uCisgKi8KK3ByaXZhdGUgdm9pZCByZWNvcmRFbGVtZW50SW5mbyhJSmF2YUVsZW1lbnQgZWxlbWVudCwgSmF2YU1vZGVsIG1vZGVsLCBpbnQgZGVwdGgpIHsKKwlpZiAoZGVwdGggPj0gdGhpcy5tYXhEZXB0aCkgeworCQlyZXR1cm47CisJfQorCUphdmFFbGVtZW50SW5mbyBpbmZvID0gKEphdmFFbGVtZW50SW5mbylKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKGVsZW1lbnQpOworCWlmIChpbmZvID09IG51bGwpIC8vIG5vIGxvbmdlciBpbiB0aGUgamF2YSBtb2RlbC4KKwkJcmV0dXJuOworCXRoaXMucHV0RWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7CisJCQorCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgeworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGluZm8uZ2V0Q2hpbGRyZW4oKTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWluc2VydFBvc2l0aW9ucyhjaGlsZHJlbiwgZmFsc2UpOworCQkJZm9yKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJcmVjb3JkRWxlbWVudEluZm8oY2hpbGRyZW5baV0sIG1vZGVsLCBkZXB0aCArIDEpOworCQl9CisJfQorfQorLyoqCisgKiBGaWxscyB0aGUgbmV3UG9zaXRpb25zIGhhc2h0YWJsZSB3aXRoIHRoZSBuZXcgcG9zaXRpb24gaW5mb3JtYXRpb24KKyAqLworcHJpdmF0ZSB2b2lkIHJlY29yZE5ld1Bvc2l0aW9ucyhJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCwgaW50IGRlcHRoKSB7CisJaWYgKGRlcHRoIDwgdGhpcy5tYXhEZXB0aCAmJiBuZXdFbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgeworCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IG51bGw7CisJCXRyeSB7IAorCQkJaW5mbyA9ICgoSmF2YUVsZW1lbnQpbmV3RWxlbWVudCkuZ2V0RWxlbWVudEluZm8oKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBpbmZvLmdldENoaWxkcmVuKCk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQlpbnNlcnRQb3NpdGlvbnMoY2hpbGRyZW4sIHRydWUpOworCQkJZm9yKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlyZWNvcmROZXdQb3NpdGlvbnMoY2hpbGRyZW5baV0sIGRlcHRoICsgMSk7CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIFJlcGFpcnMgdGhlIHBvc2l0aW9uaW5nIGluZm9ybWF0aW9uCisgKiBhZnRlciBhbiBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQKKyAqLworcHJpdmF0ZSB2b2lkIHJlbW92ZWQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwl0aGlzLnJlbW92ZWQuYWRkKGVsZW1lbnQpOworCUxpc3RJdGVtIGN1cnJlbnQgPSB0aGlzLmdldE9sZFBvc2l0aW9uKGVsZW1lbnQpOworCUxpc3RJdGVtIHByZXZpb3VzID0gbnVsbCwgbmV4dCA9IG51bGw7CisJaWYgKGN1cnJlbnQucHJldmlvdXMgIT0gbnVsbCkKKwkJcHJldmlvdXMgPSB0aGlzLmdldE9sZFBvc2l0aW9uKGN1cnJlbnQucHJldmlvdXMpOworCWlmIChjdXJyZW50Lm5leHQgIT0gbnVsbCkKKwkJbmV4dCA9IHRoaXMuZ2V0T2xkUG9zaXRpb24oY3VycmVudC5uZXh0KTsKKwlpZiAocHJldmlvdXMgIT0gbnVsbCkKKwkJcHJldmlvdXMubmV4dCA9IGN1cnJlbnQubmV4dDsKKwlpZiAobmV4dCAhPSBudWxsKQorCQluZXh0LnByZXZpb3VzID0gY3VycmVudC5wcmV2aW91czsKKwkKK30KK3ByaXZhdGUgdm9pZCByZW1vdmVFbGVtZW50SW5mbyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXRoaXMuaW5mb3MucmVtb3ZlKGVsZW1lbnQpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJ1ZmZlci5hcHBlbmQoIkJ1aWx0IGRlbHRhOlxuIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMuZGVsdGEudG9TdHJpbmcoKSk7CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiBUcmltcyBkZWxldGlvbiBkZWx0YXMgdG8gb25seSByZXBvcnQgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgZGVsZXRpb24KKyAqLworcHJpdmF0ZSB2b2lkIHRyaW1EZWx0YShKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7CisJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCWZvcihpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlkZWx0YS5yZW1vdmVBZmZlY3RlZENoaWxkKChKYXZhRWxlbWVudERlbHRhKWNoaWxkcmVuW2ldKTsKKwkJfQorCX0gZWxzZSB7CisJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCWZvcihpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0cmltRGVsdGEoKEphdmFFbGVtZW50RGVsdGEpY2hpbGRyZW5baV0pOworCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU5YjljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworCisvKioKKyAqIEhvbGRzIGNhY2hlZCBzdHJ1Y3R1cmUgYW5kIHByb3BlcnRpZXMgZm9yIGEgSmF2YSBlbGVtZW50LgorICogU3ViY2xhc3NlZCB0byBjYXJyeSBwcm9wZXJ0aWVzIGZvciBzcGVjaWZpYyBraW5kcyBvZiBlbGVtZW50cy4KKyAqLworLyogcGFja2FnZSAqLyBjbGFzcyBKYXZhRWxlbWVudEluZm8geworCisJLyoqCisJICogQ29sbGVjdGlvbiBvZiBoYW5kbGVzIG9mIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGlzCisJICogb2JqZWN0LiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoaXMgZWxlbWVudCBoYXMKKwkgKiBubyBjaGlsZHJlbi4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZkNoaWxkcmVuOworCisJLyoqCisJICogU2hhcmVkIGVtcHR5IGNvbGxlY3Rpb24gdXNlZCBmb3IgZWZmaWNpZW5jeS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElKYXZhRWxlbWVudFtdIGZnRW1wdHlDaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbXXt9OworCS8qKgorCSAqIElzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50IGtub3duCisJICogQHNlZSBJSmF2YUVsZW1lbnQjaXNTdHJ1Y3R1cmVLbm93bigpCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZklzU3RydWN0dXJlS25vd24gPSBmYWxzZTsKKworCS8qKgorCSAqIFNoYXJlZCBlbXB0eSBjb2xsZWN0aW9uIHVzZWQgZm9yIGVmZmljaWVuY3kuCisJICovCisJc3RhdGljIE9iamVjdFtdIE5PX05PTl9KQVZBX1JFU09VUkNFUyA9IG5ldyBPYmplY3RbXSB7fTsJCisJcHJvdGVjdGVkIEphdmFFbGVtZW50SW5mbygpIHsKKwkJZkNoaWxkcmVuID0gZmdFbXB0eUNoaWxkcmVuOworCX0KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChJSmF2YUVsZW1lbnQgY2hpbGQpIHsKKwkJaWYgKGZDaGlsZHJlbiA9PSBmZ0VtcHR5Q2hpbGRyZW4pIHsKKwkJCXNldENoaWxkcmVuKG5ldyBJSmF2YUVsZW1lbnRbXSB7Y2hpbGR9KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghaW5jbHVkZXNDaGlsZChjaGlsZCkpIHsKKwkJCQlzZXRDaGlsZHJlbihncm93QW5kQWRkVG9BcnJheShmQ2hpbGRyZW4sIGNoaWxkKSk7CisJCQl9CisJCX0KKwl9CisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzdXBlci5jbG9uZSgpOworCQl9CisJCWNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoKTsKKwkJfQorCX0KKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7CisJCXJldHVybiBmQ2hpbGRyZW47CisJfQorCS8qKgorCSAqIEFkZHMgdGhlIG5ldyBlbGVtZW50IHRvIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgb2xkIGFycmF5LgorCSAqIFJldHVybnMgdGhlIG5ldyBhcnJheS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ3Jvd0FuZEFkZFRvQXJyYXkoSUphdmFFbGVtZW50W10gYXJyYXksIElKYXZhRWxlbWVudCBhZGRpdGlvbikgeworCQlJSmF2YUVsZW1lbnRbXSBvbGQgPSBhcnJheTsKKwkJYXJyYXkgPSBuZXcgSUphdmFFbGVtZW50W29sZC5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGFycmF5LCAwLCBvbGQubGVuZ3RoKTsKKwkJYXJyYXlbb2xkLmxlbmd0aF0gPSBhZGRpdGlvbjsKKwkJcmV0dXJuIGFycmF5OworCX0KKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY2hpbGQgaXMgaW4gbXkgY2hpbGRyZW4gY29sbGVjdGlvbgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVzQ2hpbGQoSUphdmFFbGVtZW50IGNoaWxkKSB7CisJCQorCQlmb3IgKGludCBpPSAwOyBpIDwgZkNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZkNoaWxkcmVuW2ldLmVxdWFscyhjaGlsZCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFFbGVtZW50I2lzU3RydWN0dXJlS25vd24oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB7CisJCXJldHVybiBmSXNTdHJ1Y3R1cmVLbm93bjsKKwl9CisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCB0aGUgc2FtZSBlbGVtZW50cyBhcyB0aGUgc3BlY2lmaWVkIGFycmF5IGV4Y2VwdCBmb3IKKwkgKiB0aGUgZWxlbWVudCB0byByZW1vdmUuIEFzc3VtZXMgdGhhdCB0aGUgZGVsZXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBhcnJheS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gcmVtb3ZlQW5kU2hyaW5rQXJyYXkoSUphdmFFbGVtZW50W10gYXJyYXksIElKYXZhRWxlbWVudCBkZWxldGlvbikgeworCQlJSmF2YUVsZW1lbnRbXSBvbGQgPSBhcnJheTsKKwkJYXJyYXkgPSBuZXcgSUphdmFFbGVtZW50W29sZC5sZW5ndGggLSAxXTsKKwkJaW50IGogPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZC5sZW5ndGg7IGkrKykgeworCQkJaWYgKCFvbGRbaV0uZXF1YWxzKGRlbGV0aW9uKSkgeworCQkJCWFycmF5W2pdID0gb2xkW2ldOworCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgaSArIDEsIGFycmF5LCBqLCBvbGQubGVuZ3RoIC0gKGkgKyAxKSk7CisJCQkJcmV0dXJuIGFycmF5OworCQkJfQorCQkJaisrOworCQl9CisJCXJldHVybiBhcnJheTsKKwl9CisJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoSUphdmFFbGVtZW50IGNoaWxkKSB7CisJCWlmIChpbmNsdWRlc0NoaWxkKGNoaWxkKSkgeworCQkJc2V0Q2hpbGRyZW4ocmVtb3ZlQW5kU2hyaW5rQXJyYXkoZkNoaWxkcmVuLCBjaGlsZCkpOworCQl9CisJfQorCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKElKYXZhRWxlbWVudFtdIGNoaWxkcmVuKSB7CisJCWZDaGlsZHJlbiA9IGNoaWxkcmVuOworCX0KKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGVsZW1lbnQga25vd24KKwkgKiBAc2VlIElKYXZhRWxlbWVudCNpc1N0cnVjdHVyZUtub3duKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJc1N0cnVjdHVyZUtub3duKGJvb2xlYW4gbmV3SXNTdHJ1Y3R1cmVLbm93bikgeworCQlmSXNTdHJ1Y3R1cmVLbm93biA9IG5ld0lzU3RydWN0dXJlS25vd247CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyYjk4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworCisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KKworcHVibGljIGNsYXNzIEphdmFFbGVtZW50UmVxdWVzdG9yIGltcGxlbWVudHMgSUphdmFFbGVtZW50UmVxdWVzdG9yIHsKKwkvKioKKwkgKiBUcnVlIGlmIHRoaXMgcmVxdWVzdG9yIG5vIGxvbmdlciB3YW50cyB0byByZWNlaXZlCisJICogcmVzdWx0cyBmcm9tIGl0cyA8Y29kZT5JUmVxdWVzdG9yTmFtZUxvb2t1cDwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZkNhbmNlbGVkPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyBmaWVsZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gZmllbGQgcmVzdWx0cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCisJICovCisJcHJvdGVjdGVkIEFycmF5TGlzdCBmRmllbGRzPSBudWxsOworCisJLyoqCisJICogQSBjb2xsZWN0aW9uIG9mIHRoZSByZXN1bHRpbmcgaW5pdGlhbGl6ZXJzLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIG5vIGluaXRpYWxpemVyIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZkluaXRpYWxpemVycz0gbnVsbDsKKworCS8qKgorCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgcmVzdWx0aW5nIG1lbWJlciB0eXBlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBubyBtZW1iZXIgdHlwZSByZXN1bHRzIGhhdmUgYmVlbiByZWNlaXZlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZNZW1iZXJUeXBlcz0gbnVsbDsKKworCS8qKgorCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgcmVzdWx0aW5nIG1ldGhvZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gbWV0aG9kIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZk1ldGhvZHM9IG51bGw7CisKKwkvKioKKwkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyBwYWNrYWdlIGZyYWdtZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBubyBwYWNrYWdlIGZyYWdtZW50IHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZlBhY2thZ2VGcmFnbWVudHM9IG51bGw7CisKKwkvKioKKwkgKiBBIGNvbGxlY3Rpb24gb2YgdGhlIHJlc3VsdGluZyB0eXBlcywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBubyB0eXBlIHJlc3VsdHMgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZlR5cGVzPSBudWxsOworCisJLyoqCisJICogRW1wdHkgYXJyYXlzIHVzZWQgZm9yIGVmZmljaWVuY3kKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElGaWVsZFtdIGZnRW1wdHlGaWVsZEFycmF5PSBuZXcgSUZpZWxkWzBdOworCXByb3RlY3RlZCBzdGF0aWMgSUluaXRpYWxpemVyW10gZmdFbXB0eUluaXRpYWxpemVyQXJyYXk9IG5ldyBJSW5pdGlhbGl6ZXJbMF07CisJcHJvdGVjdGVkIHN0YXRpYyBJVHlwZVtdIGZnRW1wdHlUeXBlQXJyYXk9IG5ldyBJVHlwZVswXTsKKwlwcm90ZWN0ZWQgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRbXSBmZ0VtcHR5UGFja2FnZUZyYWdtZW50QXJyYXk9IG5ldyBJUGFja2FnZUZyYWdtZW50WzBdOworCXByb3RlY3RlZCBzdGF0aWMgSU1ldGhvZFtdIGZnRW1wdHlNZXRob2RBcnJheT0gbmV3IElNZXRob2RbMF07CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEZpZWxkKElGaWVsZCBmaWVsZCkgeworCWlmIChmRmllbGRzID09IG51bGwpIHsKKwkJZkZpZWxkcz0gbmV3IEFycmF5TGlzdCgpOworCX0KKwlmRmllbGRzLmFkZChmaWVsZCk7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEluaXRpYWxpemVyKElJbml0aWFsaXplciBpbml0aWFsaXplcikgeworCWlmIChmSW5pdGlhbGl6ZXJzID09IG51bGwpIHsKKwkJZkluaXRpYWxpemVycz0gbmV3IEFycmF5TGlzdCgpOworCX0KKwlmSW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1lbWJlclR5cGUoSVR5cGUgdHlwZSkgeworCWlmIChmTWVtYmVyVHlwZXMgPT0gbnVsbCkgeworCQlmTWVtYmVyVHlwZXM9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisJZk1lbWJlclR5cGVzLmFkZCh0eXBlKTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7CisJaWYgKGZNZXRob2RzID09IG51bGwpIHsKKwkJZk1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCWZNZXRob2RzLmFkZChtZXRob2QpOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKKwlpZiAoZlBhY2thZ2VGcmFnbWVudHM9PSBudWxsKSB7CisJCWZQYWNrYWdlRnJhZ21lbnRzPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCWZQYWNrYWdlRnJhZ21lbnRzLmFkZChwYWNrYWdlRnJhZ21lbnQpOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKElUeXBlIHR5cGUpIHsKKwlpZiAoZlR5cGVzID09IG51bGwpIHsKKwkJZlR5cGVzPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCWZUeXBlcy5hZGQodHlwZSk7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyBJRmllbGRbXSBnZXRGaWVsZHMoKSB7CisJaWYgKGZGaWVsZHMgPT0gbnVsbCkgeworCQlyZXR1cm4gZmdFbXB0eUZpZWxkQXJyYXk7CisJfQorCWludCBzaXplID0gZkZpZWxkcy5zaXplKCk7CisJSUZpZWxkW10gcmVzdWx0cyA9IG5ldyBJRmllbGRbc2l6ZV07CisJZkZpZWxkcy50b0FycmF5KHJlc3VsdHMpOworCXJldHVybiByZXN1bHRzOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgSUluaXRpYWxpemVyW10gZ2V0SW5pdGlhbGl6ZXJzKCkgeworCWlmIChmSW5pdGlhbGl6ZXJzID09IG51bGwpIHsKKwkJcmV0dXJuIGZnRW1wdHlJbml0aWFsaXplckFycmF5OworCX0KKwlpbnQgc2l6ZSA9IGZJbml0aWFsaXplcnMuc2l6ZSgpOworCUlJbml0aWFsaXplcltdIHJlc3VsdHMgPSBuZXcgSUluaXRpYWxpemVyW3NpemVdOworCWZJbml0aWFsaXplcnMudG9BcnJheShyZXN1bHRzKTsKKwlyZXR1cm4gcmVzdWx0czsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIElUeXBlW10gZ2V0TWVtYmVyVHlwZXMoKSB7CisJaWYgKGZNZW1iZXJUeXBlcyA9PSBudWxsKSB7CisJCXJldHVybiBmZ0VtcHR5VHlwZUFycmF5OworCX0KKwlpbnQgc2l6ZSA9IGZNZW1iZXJUeXBlcy5zaXplKCk7CisJSVR5cGVbXSByZXN1bHRzID0gbmV3IElUeXBlW3NpemVdOworCWZNZW1iZXJUeXBlcy50b0FycmF5KHJlc3VsdHMpOworCXJldHVybiByZXN1bHRzOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgSU1ldGhvZFtdIGdldE1ldGhvZHMoKSB7CisJaWYgKGZNZXRob2RzID09IG51bGwpIHsKKwkJcmV0dXJuIGZnRW1wdHlNZXRob2RBcnJheTsKKwl9CisJaW50IHNpemUgPSBmTWV0aG9kcy5zaXplKCk7CisJSU1ldGhvZFtdIHJlc3VsdHMgPSBuZXcgSU1ldGhvZFtzaXplXTsKKwlmTWV0aG9kcy50b0FycmF5KHJlc3VsdHMpOworCXJldHVybiByZXN1bHRzOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFtdIGdldFBhY2thZ2VGcmFnbWVudHMoKSB7CisJaWYgKGZQYWNrYWdlRnJhZ21lbnRzPT0gbnVsbCkgeworCQlyZXR1cm4gZmdFbXB0eVBhY2thZ2VGcmFnbWVudEFycmF5OworCX0KKwlpbnQgc2l6ZSA9IGZQYWNrYWdlRnJhZ21lbnRzLnNpemUoKTsKKwlJUGFja2FnZUZyYWdtZW50W10gcmVzdWx0cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50W3NpemVdOworCWZQYWNrYWdlRnJhZ21lbnRzLnRvQXJyYXkocmVzdWx0cyk7CisJcmV0dXJuIHJlc3VsdHM7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldFR5cGVzKCkgeworCWlmIChmVHlwZXM9PSBudWxsKSB7CisJCXJldHVybiBmZ0VtcHR5VHlwZUFycmF5OworCX0KKwlpbnQgc2l6ZSA9IGZUeXBlcy5zaXplKCk7CisJSVR5cGVbXSByZXN1bHRzID0gbmV3IElUeXBlW3NpemVdOworCWZUeXBlcy50b0FycmF5KHJlc3VsdHMpOworCXJldHVybiByZXN1bHRzOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgeworCXJldHVybiBmQ2FuY2VsZWQ7Cit9CisvKioKKyAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGlzIHJlcXVlc3Rvci4KKyAqLworcHVibGljIHZvaWQgcmVzZXQoKSB7CisJZkNhbmNlbGVkID0gZmFsc2U7CisJZkZpZWxkcyA9IG51bGw7CisJZkluaXRpYWxpemVycyA9IG51bGw7CisJZk1lbWJlclR5cGVzID0gbnVsbDsKKwlmTWV0aG9kcyA9IG51bGw7CisJZlBhY2thZ2VGcmFnbWVudHMgPSBudWxsOworCWZUeXBlcyA9IG51bGw7Cit9CisvKioKKyAqIFNldHMgdGhlICNpc0NhbmNlbGVkIHN0YXRlIG9mIHRoaXMgcmVxdWVzdG9yIHRvIHRydWUgb3IgZmFsc2UuCisgKi8KK3B1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgeworCWZDYW5jZWxlZD0gYjsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2YzhjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SUphdmFNb2RlbDxjb2RlPi4gVGhlIEphdmEgTW9kZWwgbWFpbnRhaW5zIGEgY2FjaGUgb2YKKyAqIGFjdGl2ZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+cyBpbiBhIHdvcmtzcGFjZS4gQSBKYXZhIE1vZGVsIGlzIHNwZWNpZmljIHRvIGEKKyAqIHdvcmtzcGFjZS4gVG8gcmV0cmlldmUgYSB3b3Jrc3BhY2UncyBtb2RlbCwgdXNlIHRoZQorICogPGNvZGU+I2dldEphdmFNb2RlbChJV29ya3NwYWNlKTwvY29kZT4gbWV0aG9kLgorICoKKyAqIEBzZWUgSUphdmFNb2RlbAorICovCitwdWJsaWMgY2xhc3MgSmF2YU1vZGVsIGV4dGVuZHMgT3BlbmFibGUgaW1wbGVtZW50cyBJSmF2YU1vZGVsIHsKKworCS8qKgorCSAqIEEgc2V0IG9mIGphdmEuaW8uRmlsZXMgdXNlZCBhcyBhIGNhY2hlIG9mIGV4dGVybmFsIGphcnMgdGhhdCAKKwkgKiBhcmUga25vd24gdG8gYmUgZXhpc3RpbmcuCisJICogTm90ZSB0aGlzIGNhY2hlIGlzIGtlcHQgZm9yIHRoZSB3aG9sZSBzZXNzaW9uLgorCSAqLyAKKwlwdWJsaWMgc3RhdGljIEhhc2hTZXQgZXhpc3RpbmdFeHRlcm5hbEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKKwkJCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YSBNb2RlbCBvbiB0aGUgZ2l2ZW4gd29ya3NwYWNlLgorICogTm90ZSB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIEphdmFNb2RlbCBoYW5kbGUgc2hvdWxkIGV2ZXIgYmUgY3JlYXRlZC4KKyAqIE9uZSBzaG91bGQgb25seSBpbmRpcmVjdCB0aHJvdWdoIEphdmFNb2RlbE1hbmFnZXIjZ2V0SmF2YU1vZGVsKCkgdG8gZ2V0CisgKiBhY2Nlc3MgdG8gaXQuCisgKiAKKyAqIEBleGNlcHRpb24gRXJyb3IgaWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCisgKi8KK3Byb3RlY3RlZCBKYXZhTW9kZWwoKSB0aHJvd3MgRXJyb3IgeworCXN1cGVyKEpBVkFfTU9ERUwsIG51bGwsICIiIC8qd29ya3NwYWNlIGhhcyBlbXB0eSBuYW1lKi8pOyAvLyROT04tTkxTLTEkCit9CisKKworCisvKioKKyAqIEBzZWUgSUphdmFNb2RlbAorICovCitwdWJsaWMgdm9pZCBjb3B5KElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzLCBJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncywgU3RyaW5nW10gcmVuYW1pbmdzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzWzBdICE9IG51bGwgJiYgZWxlbWVudHNbMF0uZ2V0RWxlbWVudFR5cGUoKSA8IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCXJ1bk9wZXJhdGlvbihuZXcgQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24oZWxlbWVudHMsIGNvbnRhaW5lcnMsIGZvcmNlKSwgZWxlbWVudHMsIHNpYmxpbmdzLCByZW5hbWluZ3MsIG1vbml0b3IpOworCX0gZWxzZSB7CisJCXJ1bk9wZXJhdGlvbihuZXcgQ29weUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBjb250YWluZXJzLCBmb3JjZSksIGVsZW1lbnRzLCBzaWJsaW5ncywgcmVuYW1pbmdzLCBtb25pdG9yKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgYSBuZXcgZWxlbWVudCBpbmZvIGZvciB0aGlzIGVsZW1lbnQuCisgKi8KK3Byb3RlY3RlZCBPcGVuYWJsZUVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKCkgeworCXJldHVybiBuZXcgSmF2YU1vZGVsSW5mbygpOworfQorCisvKioKKyAqIEBzZWUgSUphdmFNb2RlbAorICovCitwdWJsaWMgdm9pZCBkZWxldGUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHNbMF0gIT0gbnVsbCAmJiBlbGVtZW50c1swXS5nZXRFbGVtZW50VHlwZSgpIDwgSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJcnVuT3BlcmF0aW9uKG5ldyBEZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBmb3JjZSksIG1vbml0b3IpOworCX0gZWxzZSB7CisJCXJ1bk9wZXJhdGlvbihuZXcgRGVsZXRlRWxlbWVudHNPcGVyYXRpb24oZWxlbWVudHMsIGZvcmNlKSwgbW9uaXRvcik7CisJfQorfQorLyoqCisgKiBGaW5kcyB0aGUgZ2l2ZW4gcHJvamVjdCBpbiB0aGUgbGlzdCBvZiB0aGUgamF2YSBtb2RlbCdzIGNoaWxkcmVuLgorICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC4KKyAqLworcHVibGljIElKYXZhUHJvamVjdCBmaW5kSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCXRyeSB7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gdGhpcy5nZXRPbGRKYXZhUHJvamVjdHNMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQlpZiAocHJvamVjdC5lcXVhbHMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgeworCQkJCXJldHVybiBqYXZhUHJvamVjdDsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBudWxsOworfQorCisvKioKKyAqIEZsdXNoZXMgdGhlIGNhY2hlIG9mIGV4dGVybmFsIGZpbGVzIGtub3duIHRvIGJlIGV4aXN0aW5nLgorICovCitwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2hFeHRlcm5hbEZpbGVDYWNoZSgpIHsKKwlleGlzdGluZ0V4dGVybmFsRmlsZXMgPSBuZXcgSGFzaFNldCgpOworfQorCisvKioKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVJbmZvcygKKwlPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sCisJSVByb2dyZXNzTW9uaXRvciBwbSwKKwlNYXAgbmV3RWxlbWVudHMsCisJSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wdXRJbmZvKHRoaXMsIGluZm8pOworCS8vIGRldGVybWluZSBteSBjaGlsZHJlbgorCXRyeSB7CisJCUlQcm9qZWN0W10gcHJvamVjdHMgPSB0aGlzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCWlmIChwcm9qZWN0LmlzT3BlbigpICYmIHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKKwkJCQlpbmZvLmFkZENoaWxkKGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPiByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgorICogbWVtZW50by4KKyAqIEBzZWUgZ2V0SGFuZGxlTWVtZW50bygpCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0SGFuZGxlRnJvbU1lbWVudG9Gb3JCaW5hcnlNZW1iZXJzKFN0cmluZyBtZW1lbnRvLCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBpbnQgcm9vdEVuZCwgaW50IGVuZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkvL2RlYWwgd2l0aCBjbGFzcyBmaWxlIGFuZCBiaW5hcnkgbWVtYmVycworCUlQYWNrYWdlRnJhZ21lbnQgZnJhZyA9IG51bGw7CisJaWYgKHJvb3RFbmQgPT0gZW5kIC0gMSkgeworCQkvL2RlZmF1bHQgcGFja2FnZQorCQlmcmFnPSByb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsKKwl9IGVsc2UgeworCQlmcmFnPSByb290LmdldFBhY2thZ2VGcmFnbWVudChtZW1lbnRvLnN1YnN0cmluZyhyb290RW5kICsgMSwgZW5kKSk7CisJfQorCWludCBvbGRFbmQgPSBlbmQ7CisJZW5kID0gbWVtZW50by5pbmRleE9mKEphdmFFbGVtZW50LkpFTV9UWVBFLCBvbGRFbmQpOworCWlmIChlbmQgPT0gLTEpIHsKKwkJLy93ZSBlbmRlZCB3aXRoIGEgY2xhc3MgZmlsZSAKKwkJcmV0dXJuIGZyYWcuZ2V0Q2xhc3NGaWxlKG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEpKTsKKwl9CisJSUNsYXNzRmlsZSBjZiA9IGZyYWcuZ2V0Q2xhc3NGaWxlKG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEsIGVuZCkpOworCW9sZEVuZCA9IGVuZDsKKwllbmQgPSBtZW1lbnRvLmluZGV4T2YoSmF2YUVsZW1lbnQuSkVNX1RZUEUsIG9sZEVuZCk7CisJb2xkRW5kID0gZW5kOworCWVuZCA9IG1lbWVudG8uaW5kZXhPZihKYXZhRWxlbWVudC5KRU1fRklFTEQsIGVuZCk7CisJaWYgKGVuZCAhPSAtMSkgeworCQkvL2JpbmFyeSBmaWVsZAorCQlJVHlwZSB0eXBlID0gY2YuZ2V0VHlwZSgpOworCQlyZXR1cm4gdHlwZS5nZXRGaWVsZChtZW1lbnRvLnN1YnN0cmluZyhlbmQgKyAxKSk7CisJfQorCWVuZCA9IG1lbWVudG8uaW5kZXhPZihKYXZhRWxlbWVudC5KRU1fTUVUSE9ELCBvbGRFbmQpOworCWlmIChlbmQgIT0gLTEpIHsKKwkJLy9iaW5hcnkgbWV0aG9kCisJCW9sZEVuZCA9IGVuZDsKKwkJSVR5cGUgdHlwZSA9IGNmLmdldFR5cGUoKTsKKwkJU3RyaW5nIG1ldGhvZE5hbWU7CisJCWVuZCA9IG1lbWVudG8ubGFzdEluZGV4T2YoSmF2YUVsZW1lbnQuSkVNX01FVEhPRCk7CisJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbnVsbDsKKwkJaWYgKGVuZCA9PSBvbGRFbmQpIHsKKwkJCW1ldGhvZE5hbWUgPSBtZW1lbnRvLnN1YnN0cmluZyhlbmQgKyAxKTsKKwkJCS8vbm8gcGFyYW1ldGVyIHR5cGVzCisJCQlwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbXSB7fTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBwYXJhbWV0ZXJzID0gbWVtZW50by5zdWJzdHJpbmcob2xkRW5kICsgMSk7CisJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbWV0ZXJzLCBuZXcgU3RyaW5nKG5ldyBjaGFyW10ge0phdmFFbGVtZW50LkpFTV9NRVRIT0R9KSk7CisJCQlwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbdG9rZW5pemVyLmNvdW50VG9rZW5zKCkgLSAxXTsKKwkJCW1ldGhvZE5hbWU9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCWludCBpID0gMDsKKwkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJaSsrOworCQkJfQorCQl9CisJCXJldHVybiB0eXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7CisJfQorCisJLy9iaW5hcnkgdHlwZQorCXJldHVybiBjZi5nZXRUeXBlKCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KKyAqIG1lbWVudG8uCisgKiBAc2VlIGdldEhhbmRsZU1lbWVudG8oKQorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldEhhbmRsZUZyb21NZW1lbnRvRm9yU291cmNlTWVtYmVycyhTdHJpbmcgbWVtZW50bywgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgaW50IHJvb3RFbmQsIGludCBlbmQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJLy9kZWFsIHdpdGggY29tcGlsYXRpb24gdW5pdHMgYW5kIHNvdXJjZSBtZW1iZXJzCisJSVBhY2thZ2VGcmFnbWVudCBmcmFnID0gbnVsbDsKKwlpZiAocm9vdEVuZCA9PSBlbmQgLSAxKSB7CisJCS8vZGVmYXVsdCBwYWNrYWdlCisJCWZyYWc9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOworCX0gZWxzZSB7CisJCWZyYWc9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG1lbWVudG8uc3Vic3RyaW5nKHJvb3RFbmQgKyAxLCBlbmQpKTsKKwl9CisJaW50IG9sZEVuZCA9IGVuZDsKKwllbmQgPSBtZW1lbnRvLmluZGV4T2YoSmF2YUVsZW1lbnQuSkVNX1BBQ0tBR0VERUNMQVJBVElPTiwgZW5kKTsKKwlpZiAoZW5kICE9IC0xKSB7CisJCS8vcGFja2FnZSBkZWNsYXJhdGlvbgorCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnJhZy5nZXRDb21waWxhdGlvblVuaXQobWVtZW50by5zdWJzdHJpbmcob2xkRW5kICsgMSwgZW5kKSk7CisJCXJldHVybiBjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb24obWVtZW50by5zdWJzdHJpbmcoZW5kICsgMSkpOworCX0KKwllbmQgPSBtZW1lbnRvLmluZGV4T2YoSmF2YUVsZW1lbnQuSkVNX0lNUE9SVERFQ0xBUkFUSU9OLCBvbGRFbmQpOworCWlmIChlbmQgIT0gLTEpIHsKKwkJLy9pbXBvcnQgZGVjbGFyYXRpb24KKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEsIGVuZCkpOworCQlyZXR1cm4gY3UuZ2V0SW1wb3J0KG1lbWVudG8uc3Vic3RyaW5nKGVuZCArIDEpKTsKKwl9CisJaW50IHR5cGVTdGFydCA9IG1lbWVudG8uaW5kZXhPZihKYXZhRWxlbWVudC5KRU1fVFlQRSwgb2xkRW5kKTsKKwlpZiAodHlwZVN0YXJ0ID09IC0xKSB7CisJCS8vd2UgZW5kZWQgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQKKwkJcmV0dXJuIGZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEpKTsKKwl9CisKKwkvL3NvdXJjZSBtZW1iZXJzCisJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEsIHR5cGVTdGFydCkpOworCWVuZCA9IG1lbWVudG8uaW5kZXhPZihKYXZhRWxlbWVudC5KRU1fRklFTEQsIG9sZEVuZCk7CisJaWYgKGVuZCAhPSAtMSkgeworCQkvL3NvdXJjZSBmaWVsZAorCQlJVHlwZSB0eXBlID0gZ2V0SGFuZGxlRnJvbU1lbWVudG9Gb3JTb3VyY2VUeXBlKG1lbWVudG8sIGN1LCB0eXBlU3RhcnQsIGVuZCk7CisJCXJldHVybiB0eXBlLmdldEZpZWxkKG1lbWVudG8uc3Vic3RyaW5nKGVuZCArIDEpKTsKKwl9CisJZW5kID0gbWVtZW50by5pbmRleE9mKEphdmFFbGVtZW50LkpFTV9NRVRIT0QsIG9sZEVuZCk7CisJaWYgKGVuZCAhPSAtMSkgeworCQkvL3NvdXJjZSBtZXRob2QKKwkJSVR5cGUgdHlwZSA9IGdldEhhbmRsZUZyb21NZW1lbnRvRm9yU291cmNlVHlwZShtZW1lbnRvLCBjdSwgdHlwZVN0YXJ0LCBlbmQpOworCQlvbGRFbmQgPSBlbmQ7CisJCVN0cmluZyBtZXRob2ROYW1lOworCQllbmQgPSBtZW1lbnRvLmxhc3RJbmRleE9mKEphdmFFbGVtZW50LkpFTV9NRVRIT0QpOworCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG51bGw7CisJCWlmIChlbmQgPT0gb2xkRW5kKSB7CisJCQltZXRob2ROYW1lID0gbWVtZW50by5zdWJzdHJpbmcoZW5kICsgMSk7CisJCQkvL25vIHBhcmFtZXRlciB0eXBlcworCQkJcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW10ge307CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgcGFyYW1ldGVycyA9IG1lbWVudG8uc3Vic3RyaW5nKG9sZEVuZCArIDEpOworCQkJU3RyaW5nVG9rZW5pemVyIG1Ub2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhcmFtZXRlcnMsIG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7SmF2YUVsZW1lbnQuSkVNX01FVEhPRH0pKTsKKwkJCXBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1ttVG9rZW5pemVyLmNvdW50VG9rZW5zKCkgLSAxXTsKKwkJCW1ldGhvZE5hbWUgPSBtVG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKG1Ub2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSBtVG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOworCX0KKwkKKwllbmQgPSBtZW1lbnRvLmluZGV4T2YoSmF2YUVsZW1lbnQuSkVNX0lOSVRJQUxJWkVSLCBvbGRFbmQpOworCWlmIChlbmQgIT0gLTEgKSB7CisJCS8vaW5pdGlhbGl6ZXIKKwkJSVR5cGUgdHlwZSA9IGdldEhhbmRsZUZyb21NZW1lbnRvRm9yU291cmNlVHlwZShtZW1lbnRvLCBjdSwgdHlwZVN0YXJ0LCBlbmQpOworCQlyZXR1cm4gdHlwZS5nZXRJbml0aWFsaXplcihJbnRlZ2VyLnBhcnNlSW50KG1lbWVudG8uc3Vic3RyaW5nKGVuZCArIDEpKSk7CisJfQorCS8vc291cmNlIHR5cGUKKwlyZXR1cm4gZ2V0SGFuZGxlRnJvbU1lbWVudG9Gb3JTb3VyY2VUeXBlKG1lbWVudG8sIGN1LCB0eXBlU3RhcnQsIG1lbWVudG8ubGVuZ3RoKCkpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IHJlcHJlc2VudGVkIGJ5IHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgKiBtZW1lbnRvLgorICogQHNlZSBnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIElUeXBlIGdldEhhbmRsZUZyb21NZW1lbnRvRm9yU291cmNlVHlwZShTdHJpbmcgbWVtZW50bywgSUNvbXBpbGF0aW9uVW5pdCBjdSwgaW50IHR5cGVTdGFydCwgaW50IHR5cGVFbmQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWludCBlbmQgPSBtZW1lbnRvLmxhc3RJbmRleE9mKEphdmFFbGVtZW50LkpFTV9UWVBFKTsKKwlJVHlwZSB0eXBlID0gbnVsbDsKKwlpZiAoZW5kID09IHR5cGVTdGFydCkgeworCQlTdHJpbmcgdHlwZU5hbWUgPSBtZW1lbnRvLnN1YnN0cmluZyh0eXBlU3RhcnQgKyAxLCB0eXBlRW5kKTsKKwkJdHlwZSA9IGN1LmdldFR5cGUodHlwZU5hbWUpOworCQkKKwl9IGVsc2UgeworCQlTdHJpbmcgdHlwZU5hbWVzID0gbWVtZW50by5zdWJzdHJpbmcodHlwZVN0YXJ0ICsgMSwgdHlwZUVuZCk7CisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGVOYW1lcywgbmV3IFN0cmluZyhuZXcgY2hhcltdIHtKYXZhRWxlbWVudC5KRU1fVFlQRX0pKTsKKwkJdHlwZSA9IGN1LmdldFR5cGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKwkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCS8vZGVhbCB3aXRoIGlubmVyIHR5cGVzCisJCQl0eXBlPSB0eXBlLmdldFR5cGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKwkJfQorCX0KKwlyZXR1cm4gdHlwZTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRIYW5kbGVNZW1lbnRvKCl7CisJcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoaXMgaGFuZGxlcworICogY29udHJpYnV0aW9uIHRvIGEgbWVtZW50by4KKyAqLworcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpeworCUFzc2VydC5pc1RydWUoZmFsc2UsIFV0aWwuYmluZCgiYXNzZXJ0LnNob3VsZE5vdEltcGxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAwOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSUphdmFNb2RlbAorICovCitwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBKYXZhUHJvamVjdCh0aGlzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpLCB0aGlzKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgYWN0aXZlIEphdmEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICogcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIEphdmEgcHJvamVjdCB5ZXQgZXhpc3RzCisgKiBmb3IgdGhlIHJlc291cmNlLgorICoKKyAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByZXNvdXJjZQorICogaXMgbm90IG9uZSBvZiBhbiBJUHJvamVjdCwgSUZvbGRlciwgb3IgSUZpbGUuCisgKi8KK3B1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7CisJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCXJldHVybiBuZXcgSmF2YVByb2plY3QoKChJRm9sZGVyKXJlc291cmNlKS5nZXRQcm9qZWN0KCksIHRoaXMpOworCX0gZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCXJldHVybiBuZXcgSmF2YVByb2plY3QoKChJRmlsZSlyZXNvdXJjZSkuZ2V0UHJvamVjdCgpLCB0aGlzKTsKKwl9IGVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeworCQlyZXR1cm4gbmV3IEphdmFQcm9qZWN0KChJUHJvamVjdClyZXNvdXJjZSwgdGhpcyk7CisJfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaW52YWxpZFJlc291cmNlRm9yUHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKy8qKgorICogQHNlZSBJSmF2YU1vZGVsCisgKi8KK3B1YmxpYyBJSmF2YVByb2plY3RbXSBnZXRKYXZhUHJvamVjdHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKEpBVkFfUFJPSkVDVCk7CisJSUphdmFQcm9qZWN0W10gYXJyYXk9IG5ldyBJSmF2YVByb2plY3RbbGlzdC5zaXplKCldOworCWxpc3QudG9BcnJheShhcnJheSk7CisJcmV0dXJuIGFycmF5OworCit9CisvKioKKyAqIFdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAorICogUmV0dXJucyB0aGUgbGlzdCBvZiBqYXZhIHByb2plY3RzIGJlZm9yZSByZXNvdXJjZSBkZWx0YSBwcm9jZXNzaW5nCisgKiBoYXMgc3RhcnRlZC4KKyAqLworcHVibGljIElKYXZhUHJvamVjdFtdIGdldE9sZEphdmFQcm9qZWN0c0xpc3QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSB0aGlzLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwlyZXR1cm4gCisJCW1hbmFnZXIuamF2YVByb2plY3RzQ2FjaGUgPT0gbnVsbCA/IAorCQkJdGhpcy5nZXRKYXZhUHJvamVjdHMoKSA6IAorCQkJbWFuYWdlci5qYXZhUHJvamVjdHNDYWNoZTsgCit9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJcmV0dXJuIFBhdGguUk9PVDsKK30KKy8qCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworfQorLyoqCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBudWxsOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSB3b3JrYmVuY2ggYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorICovCitwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7CisJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKK30KKworLyoqCisgKiBAc2VlIElKYXZhTW9kZWwKKyAqLworcHVibGljIHZvaWQgbW92ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gY29udGFpbmVycywgSUphdmFFbGVtZW50W10gc2libGluZ3MsIFN0cmluZ1tdIHJlbmFtaW5ncywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50c1swXSAhPSBudWxsICYmIGVsZW1lbnRzWzBdLmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQlydW5PcGVyYXRpb24obmV3IE1vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBjb250YWluZXJzLCBmb3JjZSksIGVsZW1lbnRzLCBzaWJsaW5ncywgcmVuYW1pbmdzLCBtb25pdG9yKTsKKwl9IGVsc2UgeworCQlydW5PcGVyYXRpb24obmV3IE1vdmVFbGVtZW50c09wZXJhdGlvbihlbGVtZW50cywgY29udGFpbmVycywgZm9yY2UpLCBlbGVtZW50cywgc2libGluZ3MsIHJlbmFtaW5ncywgbW9uaXRvcik7CisJfQorfQorCisvKioKKyAqIEBzZWUgSUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhJSmF2YUVsZW1lbnRbXSwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgcmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMoSUphdmFFbGVtZW50W10gZWxlbWVudHNTY29wZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoZWxlbWVudHNTY29wZSA9PSBudWxsKXsKKwkJZWxlbWVudHNTY29wZSA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IHRoaXMgfTsKKwl9CisJZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yLmNoZWNrRXh0ZXJuYWxBcmNoaXZlQ2hhbmdlcyhlbGVtZW50c1Njb3BlLCBtb25pdG9yKTsKK30KKworLyoqCisgKiBAc2VlIElKYXZhTW9kZWwKKyAqLworcHVibGljIHZvaWQgcmVuYW1lKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIFN0cmluZ1tdIHJlbmFtaW5ncywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlNdWx0aU9wZXJhdGlvbiBvcDsKKwlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50c1swXSAhPSBudWxsICYmIGVsZW1lbnRzWzBdLmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQlvcCA9IG5ldyBSZW5hbWVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIHJlbmFtaW5ncywgZm9yY2UpOworCX0gZWxzZSB7CisJCW9wID0gbmV3IFJlbmFtZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIHJlbmFtaW5ncywgZm9yY2UpOworCX0KKwkKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworfQorLyoKKyAqIEBzZWUgSmF2YUVsZW1lbnQjcm9vdGVkQXQoSUphdmFQcm9qZWN0KQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJcmV0dXJuIHRoaXM7CisKK30KKy8qKgorICogQ29uZmlndXJlcyBhbmQgcnVucyB0aGUgPGNvZGU+TXVsdGlPcGVyYXRpb248L2NvZGU+LgorICovCitwcm90ZWN0ZWQgdm9pZCBydW5PcGVyYXRpb24oTXVsdGlPcGVyYXRpb24gb3AsIElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncywgU3RyaW5nW10gcmVuYW1pbmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCW9wLnNldFJlbmFtaW5ncyhyZW5hbWluZ3MpOworCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCW9wLnNldEluc2VydEJlZm9yZShlbGVtZW50c1tpXSwgc2libGluZ3NbaV0pOworCQl9CisJfQorCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7Cit9CisvKioKKyAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci5hcHBlbmQoIkphdmEgTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKworLyoqCisgKiBIZWxwZXIgbWV0aG9kIC0gcmV0dXJucyB0aGUgdGFyZ2V0ZWQgaXRlbSAoSVJlc291cmNlIGlmIGludGVybmFsIG9yIGphdmEuaW8uRmlsZSBpZiBleHRlcm5hbCksIAorICogb3IgbnVsbCBpZiB1bmJvdW5kCisgKiBJbnRlcm5hbCBpdGVtcyBtdXN0IGJlIHJlZmVycmVkIHRvIHVzaW5nIGNvbnRhaW5lciByZWxhdGl2ZSBwYXRocy4KKyAqLworcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFyZ2V0KElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBwYXRoLCBib29sZWFuIGNoZWNrUmVzb3VyY2VFeGlzdGVuY2UpIHsKKworCWlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsOworCQorCS8vIGxvb2t1cCAtIGluc2lkZSB0aGUgY29udGFpbmVyCisJSVJlc291cmNlIHJlc291cmNlID0gY29udGFpbmVyLmZpbmRNZW1iZXIocGF0aCk7CisJaWYgKHJlc291cmNlICE9IG51bGwpeworCQlpZiAoIWNoZWNrUmVzb3VyY2VFeGlzdGVuY2UgfHxyZXNvdXJjZS5leGlzdHMoKSkgcmV0dXJuIHJlc291cmNlOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyBsb29rdXAgLSBvdXRzaWRlIHRoZSBjb250YWluZXIKKwlGaWxlIGV4dGVybmFsRmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKKwlpZiAoIWNoZWNrUmVzb3VyY2VFeGlzdGVuY2UpIHsKKwkJcmV0dXJuIGV4dGVybmFsRmlsZTsKKwl9IGVsc2UgaWYgKGV4aXN0aW5nRXh0ZXJuYWxGaWxlcy5jb250YWlucyhleHRlcm5hbEZpbGUpKSB7CisJCXJldHVybiBleHRlcm5hbEZpbGU7CisJfSBlbHNlIHsgCisJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmF2YU1vZGVsLmdldFRhcmdldCguLi4pXSBDaGVja2luZyBleGlzdGVuY2Ugb2YgIiArIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJCWlmIChleHRlcm5hbEZpbGUuZXhpc3RzKCkpIHsKKwkJCS8vIGNhY2hlIGV4dGVybmFsIGZpbGUKKwkJCWV4aXN0aW5nRXh0ZXJuYWxGaWxlcy5hZGQoZXh0ZXJuYWxGaWxlKTsKKwkJCXJldHVybiBleHRlcm5hbEZpbGU7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7CQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbENhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2MzkxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbENhY2hlLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CisKKy8qKgorICogVGhlIGNhY2hlIG9mIGphdmEgZWxlbWVudHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpbmZvLgorICovCitwdWJsaWMgY2xhc3MgSmF2YU1vZGVsQ2FjaGUgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBLR19DQUNIRV9TSVpFID0gNTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRU5BQkxFX0NBQ0hFX1NJWkUgPSAyMDAwOworCQorCS8qKgorCSAqIEFjdGl2ZSBKYXZhIE1vZGVsIEluZm8KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YU1vZGVsSW5mbyBtb2RlbEluZm87CisJCisJLyoqCisJICogQ2FjaGUgb2Ygb3BlbiBwcm9qZWN0cyBhbmQgcGFja2FnZSBmcmFnbWVudCByb290cy4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIHByb2plY3RBbmRSb290Q2FjaGU7CisJCisJLyoqCisJICogQ2FjaGUgb2Ygb3BlbiBwYWNrYWdlIGZyYWdtZW50cworCSAqLworCXByb3RlY3RlZCBNYXAgcGtnQ2FjaGU7CisKKwkvKioKKwkgKiBDYWNoZSBvZiBvcGVuIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNsYXNzIGZpbGVzCisJICovCisJcHJvdGVjdGVkIE92ZXJmbG93aW5nTFJVQ2FjaGUgb3BlbmFibGVDYWNoZTsKKworCS8qKgorCSAqIENhY2hlIG9mIG9wZW4gY2hpbGRyZW4gb2Ygb3BlbmFibGUgSmF2YSBNb2RlbCBKYXZhIGVsZW1lbnRzCisJICovCisJcHJvdGVjdGVkIE1hcCBjaGlsZHJlbkNhY2hlOworCQorcHVibGljIEphdmFNb2RlbENhY2hlKCkgeworCXRoaXMucHJvamVjdEFuZFJvb3RDYWNoZSA9IG5ldyBIYXNoTWFwKDUwKTsKKwl0aGlzLnBrZ0NhY2hlID0gbmV3IEhhc2hNYXAoUEtHX0NBQ0hFX1NJWkUpOworCXRoaXMub3BlbmFibGVDYWNoZSA9IG5ldyBFbGVtZW50Q2FjaGUoT1BFTkFCTEVfQ0FDSEVfU0laRSk7CisJdGhpcy5jaGlsZHJlbkNhY2hlID0gbmV3IEhhc2hNYXAoT1BFTkFCTEVfQ0FDSEVfU0laRSoyMCk7IC8vIGF2ZXJhZ2UgMjAgY2hpbHJlbiBwZXIgb3BlbmFibGUKK30KKworcHVibGljIGRvdWJsZSBvcGVuYWJsZUZpbGxpbmdSYXRpbygpIHsKKwlyZXR1cm4gdGhpcy5vcGVuYWJsZUNhY2hlLmZpbGxpbmdSYXRpbygpOworfQorcHVibGljIGludCBwa2dTaXplKCkgeworCXJldHVybiB0aGlzLnBrZ0NhY2hlLnNpemUoKTsKK30KKwkKKy8qKgorICogIFJldHVybnMgdGhlIGluZm8gZm9yIHRoZSBlbGVtZW50LgorICovCitwdWJsaWMgT2JqZWN0IGdldEluZm8oSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMOgorCQkJcmV0dXJuIHRoaXMubW9kZWxJbmZvOworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKKwkJCXJldHVybiB0aGlzLnByb2plY3RBbmRSb290Q2FjaGUuZ2V0KGVsZW1lbnQpOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJcmV0dXJuIHRoaXMucGtnQ2FjaGUuZ2V0KGVsZW1lbnQpOworCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgorCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFOgorCQkJcmV0dXJuIHRoaXMub3BlbmFibGVDYWNoZS5nZXQoZWxlbWVudCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gdGhpcy5jaGlsZHJlbkNhY2hlLmdldChlbGVtZW50KTsKKwl9Cit9CisKKy8qKgorICogIFJldHVybnMgdGhlIGluZm8gZm9yIHRoaXMgZWxlbWVudCB3aXRob3V0CisgKiAgZGlzdHVyYmluZyB0aGUgY2FjaGUgb3JkZXJpbmcuCisgKi8KK3Byb3RlY3RlZCBPYmplY3QgcGVla0F0SW5mbyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CisJCQlyZXR1cm4gdGhpcy5tb2RlbEluZm87CisJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgorCQkJcmV0dXJuIHRoaXMucHJvamVjdEFuZFJvb3RDYWNoZS5nZXQoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CisJCQlyZXR1cm4gdGhpcy5wa2dDYWNoZS5nZXQoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQlyZXR1cm4gdGhpcy5vcGVuYWJsZUNhY2hlLnBlZWsoZWxlbWVudCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gdGhpcy5jaGlsZHJlbkNhY2hlLmdldChlbGVtZW50KTsKKwl9Cit9CisKKy8qKgorICogUmVtZW1iZXIgdGhlIGluZm8gZm9yIHRoZSBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgdm9pZCBwdXRJbmZvKElKYXZhRWxlbWVudCBlbGVtZW50LCBPYmplY3QgaW5mbykgeworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUw6CisJCQl0aGlzLm1vZGVsSW5mbyA9IChKYXZhTW9kZWxJbmZvKSBpbmZvOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgorCQkJdGhpcy5wcm9qZWN0QW5kUm9vdENhY2hlLnB1dChlbGVtZW50LCBpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJdGhpcy5wa2dDYWNoZS5wdXQoZWxlbWVudCwgaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRToKKwkJCXRoaXMub3BlbmFibGVDYWNoZS5wdXQoZWxlbWVudCwgaW5mbyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRoaXMuY2hpbGRyZW5DYWNoZS5wdXQoZWxlbWVudCwgaW5mbyk7CisJfQorfQorLyoqCisgKiBSZW1vdmVzIHRoZSBpbmZvIG9mIHRoZSBlbGVtZW50IGZyb20gdGhlIGNhY2hlLgorICovCitwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbmZvKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKKwkJCXRoaXMubW9kZWxJbmZvID0gbnVsbDsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKKwkJCXRoaXMucHJvamVjdEFuZFJvb3RDYWNoZS5yZW1vdmUoZWxlbWVudCk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKKwkJCXRoaXMucGtnQ2FjaGUucmVtb3ZlKGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQl0aGlzLm9wZW5hYmxlQ2FjaGUucmVtb3ZlKGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aGlzLmNoaWxkcmVuQ2FjaGUucmVtb3ZlKGVsZW1lbnQpOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBjYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsSW5mby5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIElKYXZhTW9kZWwuIEEgSmF2YSBNb2RlbCBpcyBzcGVjaWZpYyB0byBhCisgKiB3b3Jrc3BhY2UuCisgKgorICogQHNlZSBJSmF2YU1vZGVsCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhTW9kZWxJbmZvIGV4dGVuZHMgT3BlbmFibGVFbGVtZW50SW5mbyB7CisKKworCisvKioKKyAqIENvbnN0cnVjdHMgYSBuZXcgSmF2YSBNb2RlbCBJbmZvIAorICovCitwcm90ZWN0ZWQgSmF2YU1vZGVsSW5mbygpIHsKK30KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjM1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI1NDg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogRGVmaW5lcyBiZWhhdmlvciBjb21tb24gdG8gYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIHsKKwkvKioKKwkgKiBUaGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gb3BlcmF0ZXMgb24sCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KKwkgKiBkb2VzIG5vdCBvcGVyYXRlIG9uIHNwZWNpZmljIGVsZW1lbnRzLgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBmRWxlbWVudHNUb1Byb2Nlc3M7CisJLyoqCisJICogVGhlIHBhcmVudCBlbGVtZW50cyB0aGlzIG9wZXJhdGlvbiBvcGVyYXRlcyB3aXRoCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KKwkgKiBkb2VzIG5vdCBvcGVyYXRlIHdpdGggc3BlY2lmaWMgcGFyZW50IGVsZW1lbnRzLgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBmUGFyZW50RWxlbWVudHM7CisJLyoqCisJICogQW4gZW1wdHkgY29sbGVjdGlvbiBvZiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+cyAtIHRoZSBjb21tb24KKwkgKiBlbXB0eSByZXN1bHQgaWYgbm8gZWxlbWVudHMgYXJlIGNyZWF0ZWQsIG9yIGlmIHRoaXMKKwkgKiBvcGVyYXRpb24gaXMgbm90IGFjdHVhbGx5IGV4ZWN1dGVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUphdmFFbGVtZW50W10gZmdFbXB0eVJlc3VsdD0gbmV3IElKYXZhRWxlbWVudFtdIHt9OworCisJLyoqCisJICogQ29sbGVjdGlvbiBvZiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT5zIGNyZWF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCisJICogVGhpcyBjb2xsZWN0aW9uIHN0YXJ0cyBvdXQgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGJlY29tZXMgYW4KKwkgKiBhcnJheSBvZiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT5zIGlmIHRoZSBvcGVyYXRpb24gY3JlYXRlcyBhbnkKKwkgKiBkZWx0YXMuIFRoaXMgY29sbGVjdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIEphdmEgTW9kZWwgbm90aWZpY2F0aW9uCisJICogbWFuYWdlciBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudERlbHRhW10gZkRlbHRhcz0gbnVsbDsKKwkvKioKKwkgKiBUaGUgZWxlbWVudHMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbiAtIGVtcHR5CisJICogdW50aWwgdGhlIG9wZXJhdGlvbiBhY3R1YWxseSBjcmVhdGVzIGVsZW1lbnRzLgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBmUmVzdWx0RWxlbWVudHM9IGZnRW1wdHlSZXN1bHQ7CisKKwkvKioKKwkgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBwYXNzZWQgaW50byB0aGlzIG9wZXJhdGlvbgorCSAqLworCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZNb25pdG9yPSBudWxsOworCS8qKgorCSAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgbmVzdGVkLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZOZXN0ZWQgPSBmYWxzZTsKKwkvKioKKwkgKiBDb25mbGljdCByZXNvbHV0aW9uIHBvbGljeSAtIGJ5IGRlZmF1bHQgZG8gbm90IGZvcmNlIChmYWlsIG9uIGEgY29uZmxpY3QpLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZGb3JjZT0gZmFsc2U7CisJLyoKKwkgKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gaGFzIG1vZGlmaWVkIHJlc291cmNlcywgYW5kIHRodXMgd2hldGhlciByZXNvdXJjZQorCSAqIGRlbHRhIG5vdGlmY2F0aW9uIHdpbGwgaGFwcGVuLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhc01vZGlmaWVkUmVzb3VyY2UgPSBmYWxzZTsKKy8qKgorICogQSBjb21tb24gY29uc3RydWN0b3IgZm9yIGFsbCBKYXZhIE1vZGVsIG9wZXJhdGlvbnMuCisgKi8KK3Byb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHMpIHsKKwlmRWxlbWVudHNUb1Byb2Nlc3MgPSBlbGVtZW50czsKK30KKy8qKgorICogQ29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorICovCitwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Qcm9jZXNzLCBJSmF2YUVsZW1lbnRbXSBwYXJlbnRFbGVtZW50cykgeworCWZFbGVtZW50c1RvUHJvY2VzcyA9IGVsZW1lbnRzVG9Qcm9jZXNzOworCWZQYXJlbnRFbGVtZW50cz0gcGFyZW50RWxlbWVudHM7Cit9CisvKioKKyAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorICovCitwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Qcm9jZXNzLCBJSmF2YUVsZW1lbnRbXSBwYXJlbnRFbGVtZW50cywgYm9vbGVhbiBmb3JjZSkgeworCWZFbGVtZW50c1RvUHJvY2VzcyA9IGVsZW1lbnRzVG9Qcm9jZXNzOworCWZQYXJlbnRFbGVtZW50cz0gcGFyZW50RWxlbWVudHM7CisJZkZvcmNlPSBmb3JjZTsKK30KKy8qKgorICogQSBjb21tb24gY29uc3RydWN0b3IgZm9yIGFsbCBKYXZhIE1vZGVsIG9wZXJhdGlvbnMuCisgKi8KK3Byb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gZm9yY2UpIHsKKwlmRWxlbWVudHNUb1Byb2Nlc3MgPSBlbGVtZW50czsKKwlmRm9yY2U9IGZvcmNlOworfQorLyoqCisgKiBDb21tb24gY29uc3RydWN0b3IgZm9yIGFsbCBKYXZhIE1vZGVsIG9wZXJhdGlvbnMuCisgKi8KK3Byb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlmRWxlbWVudHNUb1Byb2Nlc3MgPSBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudH07Cit9CisvKioKKyAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorICovCitwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGZvcmNlKSB7CisJZkVsZW1lbnRzVG9Qcm9jZXNzID0gbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnR9OworCWZGb3JjZT0gZm9yY2U7Cit9CisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIGRlbHRhIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGRlbHRhcworICogdGhhdCB0aGlzIG9wZXJhdGlvbiBoYXMgY3JlYXRlZC4gVGhlc2UgZGVsdGFzIGFyZQorICogYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdpdGggdGhlIEphdmEgTW9kZWwgTWFuYWdlcgorICogd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwlpZiAoZkRlbHRhcyA9PSBudWxsKSB7CisJCWZEZWx0YXM9IG5ldyBJSmF2YUVsZW1lbnREZWx0YVtdIHtkZWx0YX07CisJfSBlbHNlIHsKKwkJSUphdmFFbGVtZW50RGVsdGFbXSBjb3B5PSBuZXcgSUphdmFFbGVtZW50RGVsdGFbZkRlbHRhcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShmRGVsdGFzLCAwLCBjb3B5LCAwLCBmRGVsdGFzLmxlbmd0aCk7CisJCWNvcHlbZkRlbHRhcy5sZW5ndGhdPSBkZWx0YTsKKwkJZkRlbHRhcz0gY29weTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorICovCitwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlmTW9uaXRvci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKKwl9Cit9CisvKioKKyAqIENoZWNrcyB3aXRoIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHNlZSB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uCisgKiBzaG91bGQgYmUgY2FuY2VsZWQuIEFuIG9wZXJhdGlvbiBzaG91bGQgcmVndWxhcmx5IGNhbGwgdGhpcyBtZXRob2QKKyAqIGR1cmluZyBpdHMgb3BlcmF0aW9uIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNhbmNlbCBpdC4KKyAqCisgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQKKyAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7CisJaWYgKGlzQ2FuY2VsZWQoKSkgeworCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24uY2FuY2VsbGVkIikpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBDb21tb24gY29kZSB1c2VkIHRvIHZlcmlmeSB0aGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gaXMgcHJvY2Vzc2luZy4KKyAqIEBzZWUgSmF2YU1vZGVsT3BlcmF0aW9uI3ZlcmlmeSgpCisgKi8KK3Byb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIGNvbW1vblZlcmlmeSgpIHsKKwlpZiAoZkVsZW1lbnRzVG9Qcm9jZXNzID09IG51bGwgfHwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyk7CisJfQorCWZvciAoaW50IGkgPSAwOyBpIDwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChmRWxlbWVudHNUb1Byb2Nlc3NbaV0gPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKKwkJfQorCX0KKwlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworfQorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSByZXNvdXJjZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBnZXRTdWJQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzLmxlbmd0aCk7CisJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSByZXNvdXJjZXNbMF0uZ2V0V29ya3NwYWNlKCk7CisJdHJ5IHsKKwkJd29ya3NwYWNlLmNvcHkocmVzb3VyY2VzLCBkZXN0aW5hdGlvblBhdGgsIGZhbHNlLCBzdWJQcm9ncmVzc01vbml0b3IpOworCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCX0KK30KKy8qKgorICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIGZpbGUKKyAqLworcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJQ29udGFpbmVyIGZvbGRlciwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJRmlsZSBmaWxlPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChuYW1lKSk7CisJdHJ5IHsKKwkJZmlsZS5jcmVhdGUoCisJCQljb250ZW50cywgCisJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgZm9sZGVyCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZUZvbGRlcihJQ29udGFpbmVyIHBhcmVudEZvbGRlciwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlGb2xkZXIgZm9sZGVyPSBwYXJlbnRGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKG5hbWUpKTsKKwl0cnkgeworCQkvLyB3ZSBzaG91bGQgdXNlIHRydWUgdG8gY3JlYXRlIHRoZSBmaWxlIGxvY2FsbHkuIE9ubHkgVkNNIHNob3VsZCB1c2UgdHJ1L2ZhbHNlCisJCWZvbGRlci5jcmVhdGUoCisJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAorCQkJdHJ1ZSwgLy8gbG9jYWwKKwkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGFuIGVtcHR5IHBhY2thZ2UgZnJhZ21lbnQKKyAqLworcHJvdGVjdGVkIHZvaWQgZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoCisJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCwKKwlib29sZWFuIGZvcmNlKQorCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJSUNvbnRhaW5lciByZXNvdXJjZSA9IChJQ29udGFpbmVyKSBmcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKKwlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gZnJhZ21lbnQuZ2V0UGFyZW50KCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisKKwl0cnkgeworCQlyZXNvdXJjZS5kZWxldGUoCisJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCXdoaWxlIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCS8vIGRlbGV0aW5nIGEgcGFja2FnZTogZGVsZXRlIHRoZSBwYXJlbnQgaWYgaXQgaXMgZW1wdHkgKGVnLiBkZWxldGluZyB4Lnkgd2hlcmUgZm9sZGVyIHggZG9lc24ndCBoYXZlIHJlc291cmNlcyBidXQgeSkKKwkJCS8vIHdpdGhvdXQgZGVsZXRpbmcgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKKwkJCWlmICghcmVzb3VyY2UuZXF1YWxzKHJvb3RSZXNvdXJjZSkgJiYgcmVzb3VyY2UubWVtYmVycygpLmxlbmd0aCA9PSAwKSB7CisJCQkJcmVzb3VyY2UuZGVsZXRlKAorCQkJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCQkJZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCQkJfQorCQl9CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGEgcmVzb3VyY2UKKyAqLworcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLGludCBmbGFncykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJcmVzb3VyY2UuZGVsZXRlKGZsYWdzLCBnZXRTdWJQcm9ncmVzc01vbml0b3IoMSkpOworCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCX0KK30KKy8qKgorICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRlbGV0ZSByZXNvdXJjZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2VzKElSZXNvdXJjZVtdIHJlc291cmNlcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPT0gMCkgcmV0dXJuOworCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKHJlc291cmNlcy5sZW5ndGgpOworCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gcmVzb3VyY2VzWzBdLmdldFdvcmtzcGFjZSgpOworCXRyeSB7CisJCXdvcmtzcGFjZS5kZWxldGUoCisJCQlyZXNvdXJjZXMsCisJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCXN1YlByb2dyZXNzTW9uaXRvcik7CisJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKKyAqLworcHVibGljIHZvaWQgZG9uZSgpIHsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlmTW9uaXRvci5kb25lKCk7CisJfQorfQorLyoqCisgKiBWZXJpZmllcyB0aGUgb3BlcmF0aW9uIGNhbiBwcm9jZWVkIGFuZCBleGVjdXRlcyB0aGUgb3BlcmF0aW9uLgorICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgPGNvZGU+I3ZlcmlmeTwvY29kZT4gYW5kCisgKiA8Y29kZT5leGVjdXRlT3BlcmF0aW9uPC9jb2RlPiB0byBpbXBsZW1lbnQgdGhlIHNwZWNpZmljIG9wZXJhdGlvbiBiZWhhdmlvci4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBUaGUgb3BlcmF0aW9uIGhhcyBmYWlsZWQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cz0gdmVyaWZ5KCk7CisJaWYgKHN0YXR1cy5pc09LKCkpIHsKKwkJZXhlY3V0ZU9wZXJhdGlvbigpOworCX0gZWxzZSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oc3RhdHVzKTsKKwl9Cit9CisvKioKKyAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBydW4gYW4gb3BlcmF0aW9uIHdpdGhpbiB0aGlzIG9wZXJhdGlvbgorICovCitwdWJsaWMgdm9pZCBleGVjdXRlTmVzdGVkT3BlcmF0aW9uKEphdmFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGludCBzdWJXb3JrQW1vdW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IGdldFN1YlByb2dyZXNzTW9uaXRvcihzdWJXb3JrQW1vdW50KTsKKwkvLyBmaXggZm9yIDFGVzdJS0MsIHBhcnQgKDEpCisJdHJ5IHsKKwkJb3BlcmF0aW9uLnNldE5lc3RlZCh0cnVlKTsKKwkJb3BlcmF0aW9uLnJ1bihzdWJQcm9ncmVzc01vbml0b3IpOworCQlpZiAob3BlcmF0aW9uLmhhc01vZGlmaWVkUmVzb3VyY2UoKSkgeworCQkJdGhpcy5oYXNNb2RpZmllZFJlc291cmNlID0gdHJ1ZTsKKwkJfQorCQkvL2FjY3VtdWxhdGUgdGhlIG5lc3RlZCBvcGVyYXRpb24gZGVsdGFzCisJCWlmIChvcGVyYXRpb24uZkRlbHRhcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbi5mRGVsdGFzLmxlbmd0aDsgaSsrKSB7CisJCQkJYWRkRGVsdGEob3BlcmF0aW9uLmZEZWx0YXNbaV0pOworCQkJfQorCQl9CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQlpZiAoY2UgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pY2U7CisJCX0gZWxzZSB7CisJCQkvLyB0cmFuc2xhdGUgdGhlIGNvcmUgZXhjZXB0aW9uIHRvIGEgamF2YSBtb2RlbCBleGNlcHRpb24KKwkJCWlmIChjZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLk9QRVJBVElPTl9GQUlMRUQpIHsKKwkJCQlUaHJvd2FibGUgZSA9IGNlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOworCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CisJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7CisJCQkJfQorCQkJfQorCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7CisJCX0KKwl9Cit9CisvKioKKyAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gc3BlY2lmaWMgYmVoYXZpb3IuIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluLAorICogb3IgdGhlIGVsZW1lbnQgaXRzZWxmIChpZiBpdCBpcyBhIGNvbXBpbGF0aW9uIHVuaXQpLAorICogb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXRGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKworCXJldHVybiAoKEphdmFFbGVtZW50KWVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byB3aGljaCB0aGlzIG9wZXJhdGlvbiBhcHBsaWVzLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50c1RvUHJvY2VzcygpIHsKKwlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgb3BlcmF0aW9uIGFwcGxpZXMsCisgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXBwbGljYWJsZS4KKyAqLworcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRFbGVtZW50VG9Qcm9jZXNzKCkgeworCWlmIChmRWxlbWVudHNUb1Byb2Nlc3MgPT0gbnVsbCB8fCBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXJldHVybiBmRWxlbWVudHNUb1Byb2Nlc3NbMF07Cit9CisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgTW9kZWwgdGhpcyBvcGVyYXRpb24gaXMgb3BlcmF0aW5nIGluLgorICovCitwdWJsaWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7CisJaWYgKGZFbGVtZW50c1RvUHJvY2VzcyA9PSBudWxsIHx8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gZ2V0UGFyZW50RWxlbWVudCgpLmdldEphdmFNb2RlbCgpOworCX0gZWxzZSB7CisJCXJldHVybiBmRWxlbWVudHNUb1Byb2Nlc3NbMF0uZ2V0SmF2YU1vZGVsKCk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZWxlbWVudCB0byB3aGljaCB0aGlzIG9wZXJhdGlvbiBhcHBsaWVzLAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpIHsKKwlpZiAoZlBhcmVudEVsZW1lbnRzID09IG51bGwgfHwgZlBhcmVudEVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gZlBhcmVudEVsZW1lbnRzWzBdOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZWxlbWVudHMgdG8gd2hpY2ggdGhpcyBvcGVyYXRpb24gYXBwbGllcywKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlLgorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ2V0UGFyZW50RWxlbWVudHMoKSB7CisJcmV0dXJuIGZQYXJlbnRFbGVtZW50czsKK30KKy8qKgorICogUmV0dXJucyB0aGUgZWxlbWVudHMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGdldFJlc3VsdEVsZW1lbnRzKCkgeworCXJldHVybiBmUmVzdWx0RWxlbWVudHM7Cit9CisvKioKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdWJwcm9ncmVzcyBtb25pdG9yIGlmIGFwcHJvcHJpYXRlLgorICovCitwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJQcm9ncmVzc01vbml0b3IoaW50IHdvcmtBbW91bnQpIHsKKwlJUHJvZ3Jlc3NNb25pdG9yIHN1YiA9IG51bGw7CisJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJc3ViID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihmTW9uaXRvciwgd29ya0Ftb3VudCwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKKwl9CisJcmV0dXJuIHN1YjsKK30KKy8qKgorICogUmV0dXJucyB0aGUgPGNvZGU+SVdvcmtzcGFjZTwvY29kZT4gdGhpcyBvcGVyYXRpb24gaXMgd29ya2luZyBpbiwgb3IKKyAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBubyBlbGVtZW50cyB0byBwcm9jZXNzLgorICovCitwcm90ZWN0ZWQgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7CisJaWYgKGZFbGVtZW50c1RvUHJvY2VzcyAhPSBudWxsICYmIGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGggPiAwKSB7CisJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZkVsZW1lbnRzVG9Qcm9jZXNzWzBdLmdldEphdmFQcm9qZWN0KCk7CisJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKKwkJCXJldHVybiBwcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldFdvcmtzcGFjZSgpOworCQl9CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaGFzIHBlcmZvcm1lZCBhbnkgcmVzb3VyY2UgbW9kaWZpY2F0aW9ucy4KKyAqIFJldHVybnMgZmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldC4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzTW9kaWZpZWRSZXNvdXJjZSgpIHsKKwlyZXR1cm4gIXRoaXMuaXNSZWFkT25seSgpICYmIHRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZTsKK30KK3B1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7CisJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJZk1vbml0b3IuaW50ZXJuYWxXb3JrZWQod29yayk7CisJfQorfQorLyoqCisgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKKyAqLworcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlyZXR1cm4gZk1vbml0b3IuaXNDYW5jZWxlZCgpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24gcGVyZm9ybXMgbm8gcmVzb3VyY2UgbW9kaWZpY2F0aW9ucywKKyAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFRyYXZlcnNlcyB0aGUgZGVsdGFzIGZvciBhbiB3b3JraW5nIGNvcGllcyBhbmQgbWFrZXMgdGhlbQorICogY29uc2lzdGVudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgbWFrZVdvcmtpbmdDb3BpZXNDb25zaXN0ZW50KElKYXZhRWxlbWVudERlbHRhW10gZGVsdGFzKSB7CisJZm9yIChpbnQgaT0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgeworCQl3YWxrRGVsdGFNYWtpbmdXb3JraW5nQ29waWVzQ29uc2lzdGVudChkZWx0YXNbaV0pOworCX0KK30KKy8qKgorICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1vdmUgcmVzb3VyY2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1vdmVSZXNvdXJjZXMoSVJlc291cmNlW10gcmVzb3VyY2VzLCBJUGF0aCBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlzdWJQcm9ncmVzc01vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKGZNb25pdG9yLCByZXNvdXJjZXMubGVuZ3RoLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOworCX0KKwlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJlc291cmNlc1swXS5nZXRXb3Jrc3BhY2UoKTsKKwl0cnkgeworCQl3b3Jrc3BhY2UubW92ZShyZXNvdXJjZXMsIGRlc3RpbmF0aW9uUGF0aCwgZmFsc2UsIHN1YlByb2dyZXNzTW9uaXRvcik7CisJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPgorICogb24gdGhlIEphdmEgTW9kZWwuCisgKi8KK3B1YmxpYyBKYXZhRWxlbWVudERlbHRhIG5ld0phdmFFbGVtZW50RGVsdGEoKSB7CisJcmV0dXJuIG5ldyBKYXZhRWxlbWVudERlbHRhKGdldEphdmFNb2RlbCgpKTsKK30KKy8qKgorICogUmVnaXN0ZXJzIGFueSBkZWx0YXMgdGhpcyBvcGVyYXRpb24gY3JlYXRlZCwgd2l0aCB0aGUKKyAqIEphdmEgTW9kZWwgbWFuYWdlci4KKyAqLworcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJEZWx0YXMoKSB7CisJaWYgKGZEZWx0YXMgIT0gbnVsbCAmJiAhZk5lc3RlZCkgeworCQkvLyBob29rIHRvIGVuc3VyZSB3b3JraW5nIGNvcGllcyByZW1haW4gY29uc2lzdGVudAorCQltYWtlV29ya2luZ0NvcGllc0NvbnNpc3RlbnQoZkRlbHRhcyk7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlcj0gKEphdmFNb2RlbE1hbmFnZXIpSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBmRGVsdGFzLmxlbmd0aDsgaSsrKSB7CisJCQltYW5hZ2VyLnJlZ2lzdGVySmF2YU1vZGVsRGVsdGEoZkRlbHRhc1tpXSk7CisJCX0KKwl9Cit9CisvKioKKyAqIE1haW4gZW50cnkgcG9pbnQgZm9yIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4gIEV4ZWN1dGVzIHRoaXMgb3BlcmF0aW9uCisgKiBhbmQgcmVnaXN0ZXJzIGFueSBkZWx0YXMgY3JlYXRlZC4KKyAqCisgKiBAc2VlIElXb3Jrc3BhY2VSdW5uYWJsZQorICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKKyAqLworcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRyeSB7CisJCWZNb25pdG9yID0gbW9uaXRvcjsKKwkJZXhlY3V0ZSgpOworCX0gZmluYWxseSB7CisJCXJlZ2lzdGVyRGVsdGFzKCk7CisJfQorfQorLyoqCisgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKKyAqLworcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiBiKSB7CisJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJZk1vbml0b3Iuc2V0Q2FuY2VsZWQoYik7CisJfQorfQorLyoqCisgKiBTZXRzIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMgbmVzdGVkIG9yIG5vdC4KKyAqIEBzZWUgQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24jY2hlY2tDYW5jZWxlZAorICovCitwcm90ZWN0ZWQgdm9pZCBzZXROZXN0ZWQoYm9vbGVhbiBuZXN0ZWQpIHsKKwlmTmVzdGVkID0gbmVzdGVkOworfQorLyoqCisgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKKyAqLworcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlmTW9uaXRvci5zZXRUYXNrTmFtZShuYW1lKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorICovCitwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7CisJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJZk1vbml0b3Iuc3ViVGFzayhuYW1lKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgYSBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGVyZSBpcyBhbnkga25vd24gcmVhc29uCisgKiB0aGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwuICBPcGVyYXRpb25zIGFyZSB2ZXJpZmllZCBiZWZvcmUgdGhleQorICogYXJlIHJ1bi4KKyAqCisgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgaWYgdGhleSBoYXZlIGFueSBjb25kaXRpb25zIHRvIHZlcmlmeQorICogYmVmb3JlIHRoaXMgb3BlcmF0aW9uIGV4ZWN1dGVzLgorICoKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworICovCitwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJcmV0dXJuIGNvbW1vblZlcmlmeSgpOworfQorLyoqCisgKiBUcmF2ZXJzZXMgdGhlIGRlbHRhIG1ha2luZyBhbnkgd29ya2luZyBjb3BpZXMgY29uc2lzdGVudAorICovCitwcm90ZWN0ZWQgdm9pZCB3YWxrRGVsdGFNYWtpbmdXb3JraW5nQ29waWVzQ29uc2lzdGVudChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCWlmIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0RWxlbWVudCgpOworCQlpZiAodW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJCXRyeSB7CisJCQkJdW5pdC5tYWtlQ29uc2lzdGVudChudWxsKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCXdhbGtEZWx0YU1ha2luZ1dvcmtpbmdDb3BpZXNDb25zaXN0ZW50KGRlbHRhc1tpXSk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorICovCitwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKKwlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQlmTW9uaXRvci53b3JrZWQod29yayk7CisJCWNoZWNrQ2FuY2VsZWQoKTsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxTdGF0dXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZmNiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxTdGF0dXMuamF2YQpAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworCisvKioKKyAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworICovCisKK3B1YmxpYyBjbGFzcyBKYXZhTW9kZWxTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgaW1wbGVtZW50cyBJSmF2YU1vZGVsU3RhdHVzLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLCBJUmVzb3VyY2VTdGF0dXMgeworCisJLyoqCisJICogVGhlIGVsZW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGZhaWx1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gZWxlbWVudHMgYXJlIGludm9sdmVkLgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBmRWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzBdOworCS8qKgorCSAqIFRoZSBwYXRoIHJlbGF0ZWQgdG8gdGhlIGZhaWx1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gcGF0aCBpcyBpbnZvbHZlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgSVBhdGggZlBhdGg7CisJLyoqCisJICogVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcmVsYXRlZCB0byB0aGUgZmFpbHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBubyA8Y29kZT5TdHJpbmc8L2NvZGU+IGlzIGludm9sdmVkLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZlN0cmluZzsKKwkvKioKKwkgKiBFbXB0eSBjaGlsZHJlbgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSVN0YXR1c1tdIGZnRW1wdHlDaGlsZHJlbiA9IG5ldyBJU3RhdHVzW10ge307CisJcHJvdGVjdGVkIElTdGF0dXNbXSBmQ2hpbGRyZW49IGZnRW1wdHlDaGlsZHJlbjsKKworCS8qKgorCSAqIFNpbmdsZXRvbiBPSyBvYmplY3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhTW9kZWxTdGF0dXMgVkVSSUZJRURfT0sgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKE9LKTsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgorCSAqLworCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoKSB7CisJCS8vIG5vIGNvZGUgZm9yIGFuIG11bHRpLXN0YXR1cworCQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAwLCAiSmF2YU1vZGVsU3RhdHVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwl9CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuCisJICovCisJcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgY29kZSkgeworCQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJZkVsZW1lbnRzPSBKYXZhRWxlbWVudEluZm8uZmdFbXB0eUNoaWxkcmVuOworCX0KKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggdGhlIGdpdmVuIGNvcnJlc3BvbmRpbmcKKwkgKiBlbGVtZW50cy4KKwkgKi8KKwlwdWJsaWMgSmF2YU1vZGVsU3RhdHVzKGludCBjb2RlLCBJSmF2YUVsZW1lbnRbXSBlbGVtZW50cykgeworCQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJZkVsZW1lbnRzPSBlbGVtZW50czsKKwkJZlBhdGg9IG51bGw7CisJfQorCS8qKgorCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgorCSAqLworCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIFN0cmluZyBzdHJpbmcpIHsKKwkJc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgY29kZSwgIkphdmFNb2RlbFN0YXR1cyIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCWZFbGVtZW50cz0gSmF2YUVsZW1lbnRJbmZvLmZnRW1wdHlDaGlsZHJlbjsKKwkJZlBhdGg9IG51bGw7CisJCWZTdHJpbmcgPSBzdHJpbmc7CisJfQorCS8qKgorCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgorCSAqLworCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJc3VwZXIoRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgY29kZSwgIkphdmFNb2RlbFN0YXR1cyIsIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKKwkJZkVsZW1lbnRzPSBKYXZhRWxlbWVudEluZm8uZmdFbXB0eUNoaWxkcmVuOworCX0KKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggbm8gY29ycmVzcG9uZGluZyBlbGVtZW50cy4KKwkgKi8KKwlwdWJsaWMgSmF2YU1vZGVsU3RhdHVzKGludCBjb2RlLCBJUGF0aCBwYXRoKSB7CisJCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQlmRWxlbWVudHM9IEphdmFFbGVtZW50SW5mby5mZ0VtcHR5Q2hpbGRyZW47CisJCWZQYXRoPSBwYXRoOworCX0KKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggdGhlIGdpdmVuIGNvcnJlc3BvbmRpbmcKKwkgKiBlbGVtZW50LgorCSAqLworCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCXRoaXMoY29kZSwgbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnR9KTsKKwl9CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIHRoZSBnaXZlbiBjb3JyZXNwb25kaW5nCisJICogZWxlbWVudCBhbmQgc3RyaW5nCisJICovCisJcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgY29kZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzdHJpbmcpIHsKKwkJdGhpcyhjb2RlLCBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudH0pOworCQlmU3RyaW5nPSBzdHJpbmc7CisJfQorCS8qKgorCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgorCSAqLworCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKSB7CisJCXN1cGVyKEVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIENPUkVfRVhDRVBUSU9OLCAiSmF2YU1vZGVsU3RhdHVzIiwgY29yZUV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJZkVsZW1lbnRzPSBKYXZhRWxlbWVudEluZm8uZmdFbXB0eUNoaWxkcmVuOworCX0KKwlwcm90ZWN0ZWQgaW50IGdldEJpdHMoKSB7CisJCWludCBzZXZlcml0eSA9IDEgPDwgKGdldENvZGUoKSAlIDEwMCAvIDMzKTsKKwkJaW50IGNhdGVnb3J5ID0gMSA8PCAoKGdldENvZGUoKSAvIDEwMCkgKyAzKTsKKwkJcmV0dXJuIHNldmVyaXR5IHwgY2F0ZWdvcnk7CisJfQorCS8qKgorCSAqIEBzZWUgSVN0YXR1cworCSAqLworCXB1YmxpYyBJU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7CisJCXJldHVybiBmQ2hpbGRyZW47CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50cygpIHsKKwkJcmV0dXJuIGZFbGVtZW50czsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBjb2RlIG9mIHRoaXMgc3RhdHVzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKwkJaWYgKGdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKKwkJCXN3aXRjaCAoZ2V0Q29kZSgpKSB7CisJCQkJY2FzZSBDT1JFX0VYQ0VQVElPTiA6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jb3JlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIEJVSUxERVJfSU5JVElBTElaQVRJT05fRVJST1I6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoImJ1aWxkLmluaXRpYWxpemF0aW9uRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgQlVJTERFUl9TRVJJQUxJWkFUSU9OX0VSUk9SOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJidWlsZC5zZXJpYWxpemF0aW9uRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgREVWSUNFX1BBVEg6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jYW5ub3RVc2VEZXZpY2VPblBhdGgiLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIERPTV9FWENFUFRJT046CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5KRE9NRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgRUxFTUVOVF9ET0VTX05PVF9FWElTVDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgiZWxlbWVudC5kb2VzTm90RXhpc3QiLGZFbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgRVZBTFVBVElPTl9FUlJPUjoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmV2YWx1YXRpb25FcnJvciIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgSU5ERVhfT1VUX09GX0JPVU5EUzoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmluZGV4T3V0T2ZCb3VuZHMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgSU5WQUxJRF9DT05URU5UUzoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRDb250ZW50cyIpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBJTlZBTElEX0RFU1RJTkFUSU9OOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZERlc3RpbmF0aW9uIiwgZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBJTlZBTElEX0VMRU1FTlRfVFlQRVM6CisJCQkJCVN0cmluZ0J1ZmZlciBidWZmPSBuZXcgU3RyaW5nQnVmZmVyKFV0aWwuYmluZCgib3BlcmF0aW9uLm5vdFN1cHBvcnRlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCQlidWZmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJYnVmZi5hcHBlbmQoZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOworCQkJCQl9CisJCQkJCXJldHVybiBidWZmLnRvU3RyaW5nKCk7CisJCQkJY2FzZSBJTlZBTElEX05BTUU6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkTmFtZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNhc2UgSU5WQUxJRF9QQUNLQUdFOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFBhY2thZ2UiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIElOVkFMSURfUEFUSDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRQYXRoIiwgZ2V0UGF0aCgpID09IG51bGwgPyAibnVsbCIgOiBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWNhc2UgSU5WQUxJRF9QUk9KRUNUOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFByb2plY3QiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIElOVkFMSURfUkVTT1VSQ0U6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUmVzb3VyY2UiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIElOVkFMSURfUkVTT1VSQ0VfVFlQRToKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRSZXNvdXJjZVR5cGUiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIElOVkFMSURfU0lCTElORzoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRTaWJsaW5nIiwgZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBJT19FWENFUFRJT046CisJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5JT0V4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBOQU1FX0NPTExJU0lPTjoKKwkJCQkJaWYgKGZFbGVtZW50cyAhPSBudWxsICYmIGZFbGVtZW50cy5sZW5ndGggPiAwKSB7CisJCQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGZFbGVtZW50c1swXTsKKwkJCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOworCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIG5hbWUuZXF1YWxzKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpKSB7CisJCQkJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNhbm5vdFJlbmFtZURlZmF1bHRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBOT19FTEVNRU5UU19UT19QUk9DRVNTOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZEVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIE5VTExfTkFNRToKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm5lZWROYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIE5VTExfUEFUSDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm5lZWRQYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIE5VTExfU1RSSU5HOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZFN0cmluZyIpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBQQVRIX09VVFNJREVfUFJPSkVDVDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLnBhdGhPdXRzaWRlUHJvamVjdCIsIGdldFN0cmluZygpLCBmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIFJFQURfT05MWToKKwkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBmRWxlbWVudHNbMF07CisJCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOworCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQgJiYgbmFtZS5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSkpIHsKKwkJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5kZWZhdWx0UGFja2FnZVJlYWRPbmx5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlyZXR1cm4gIFV0aWwuYmluZCgic3RhdHVzLnJlYWRPbmx5IiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIFJFTEFUSVZFX1BBVEg6CisJCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkQWJzb2x1dGVQYXRoIiwgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSBUQVJHRVRfRVhDRVBUSU9OOgorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMudGFyZ2V0RXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIFVQREFURV9DT05GTElDVDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLnVwZGF0ZUNvbmZsaWN0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQljYXNlIE5PX0xPQ0FMX0NPTlRFTlRTIDoKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLm5vTG9jYWxDb250ZW50cyIsIGdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcmV0dXJuIGdldFN0cmluZygpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMjZ2V0UGF0aCgpCisJICovCisJcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJCXJldHVybiBmUGF0aDsKKwl9CisJLyoqCisJICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgeworCQlpZiAoZkNoaWxkcmVuID09IGZnRW1wdHlDaGlsZHJlbikgcmV0dXJuIHN1cGVyLmdldFNldmVyaXR5KCk7CisJCWludCBzZXZlcml0eSA9IC0xOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZkNoaWxkcmVuLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlpbnQgY2hpbGRyZW5TZXZlcml0eSA9IGZDaGlsZHJlbltpXS5nZXRTZXZlcml0eSgpOworCQkJaWYgKGNoaWxkcmVuU2V2ZXJpdHkgPiBzZXZlcml0eSkgeworCQkJCXNldmVyaXR5ID0gY2hpbGRyZW5TZXZlcml0eTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2V2ZXJpdHk7CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cyNnZXRTdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworCQlyZXR1cm4gZlN0cmluZzsKKwl9CisJLyoqCisJICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzI2lzRG9lc05vdEV4aXN0KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvZXNOb3RFeGlzdCgpIHsKKwkJcmV0dXJuIGdldENvZGUoKSA9PSBFTEVNRU5UX0RPRVNfTk9UX0VYSVNUOworCX0KKwkvKioKKwkgKiBAc2VlIElTdGF0dXMjaXNNdWx0aVN0YXR1cygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKKwkJcmV0dXJuIGZDaGlsZHJlbiAhPSBmZ0VtcHR5Q2hpbGRyZW47CisJfQorCS8qKgorCSAqIEBzZWUgSVN0YXR1cyNpc09LKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09LKCkgeworCQlyZXR1cm4gZ2V0Q29kZSgpID09IE9LOworCX0KKwkvKioKKwkgKiBAc2VlIElTdGF0dXMjbWF0Y2hlcyhpbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhpbnQgbWFzaykgeworCQlpZiAoISBpc011bHRpU3RhdHVzKCkpIHsKKwkJCXJldHVybiBtYXRjaGVzKHRoaXMsIG1hc2spOworCQl9IGVsc2UgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZDaGlsZHJlbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWlmIChtYXRjaGVzKChKYXZhTW9kZWxTdGF0dXMpIGZDaGlsZHJlbltpXSwgbWFzaykpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCS8qKgorCSAqIEhlbHBlciBmb3IgbWF0Y2hlcyhpbnQpLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoSmF2YU1vZGVsU3RhdHVzIHN0YXR1cywgaW50IG1hc2spIHsKKwkJaW50IHNldmVyaXR5TWFzayA9IG1hc2sgJiAweDc7CisJCWludCBjYXRlZ29yeU1hc2sgPSBtYXNrICYgfjB4NzsKKwkJaW50IGJpdHMgPSBzdGF0dXMuZ2V0Qml0cygpOworCQlyZXR1cm4gKChzZXZlcml0eU1hc2sgPT0gMCkgfHwgKGJpdHMgJiBzZXZlcml0eU1hc2spICE9IDApICYmICgoY2F0ZWdvcnlNYXNrID09IDApIHx8IChiaXRzICYgY2F0ZWdvcnlNYXNrKSAhPSAwKTsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyA8Y29kZT5JSmF2YU1vZGVsU3RhdHVzPC9jb2RlPiB0aGF0IGlzIGEKKwkgKiBhIG11bHRpLXN0YXR1cyBzdGF0dXMuCisJICoKKwkgKiBAc2VlIElTdGF0dXMjaXNNdWx0aVN0YXR1cygpCisJICovCisJcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIG5ld011bHRpU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNbXSBjaGlsZHJlbikgeworCQlKYXZhTW9kZWxTdGF0dXMgam1zID0gbmV3IEphdmFNb2RlbFN0YXR1cygpOworCQlqbXMuZkNoaWxkcmVuID0gY2hpbGRyZW47CisJCXJldHVybiBqbXM7CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBleGNlcHRpb24gZm9yIGRlYnVnZ2luZworCSAqIHB1cnBvc2VzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmICh0aGlzID09IFZFUklGSUVEX09LKXsKKwkJCXJldHVybiAiSmF2YU1vZGVsU3RhdHVzW09LXSI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWZmZXIuYXBwZW5kKCJKYXZhIE1vZGVsIFN0YXR1cyBbIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChnZXRNZXNzYWdlKCkpOworCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MThmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsMjE2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5PYmplY3RWZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZXZhbC5FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKKy8qKgorICogSGFuZGxlIGZvciBhIEphdmEgUHJvamVjdC4KKyAqCisgKiA8cD5BIEphdmEgUHJvamVjdCBpbnRlcm5hbGx5IG1haW50YWlucyBhIGRldnBhdGggdGhhdCBjb3JyZXNwb25kcworICogdG8gdGhlIHByb2plY3QncyBjbGFzc3BhdGguIFRoZSBjbGFzc3BhdGggbWF5IGluY2x1ZGUgc291cmNlIGZvbGRlcnMKKyAqIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdDsgamFycyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LCBvdGhlciBwcm9qZWN0cywKKyAqIGFuZCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW07IGFuZCBiaW5hcnkgZm9sZGVycyAob3V0cHV0IGxvY2F0aW9uKSBvZiBvdGhlcgorICogcHJvamVjdHMuIFRoZSBKYXZhIE1vZGVsIHByZXNlbnRzIHNvdXJjZSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIG91dHB1dAorICogLmNsYXNzIGZpbGVzIGluIG90aGVyIHByb2plY3RzLCBhbmQgdGh1cyB1c2VzIHRoZSBkZXZwYXRoIHJhdGhlciB0aGFuCisgKiB0aGUgY2xhc3NwYXRoICh3aGljaCBpcyByZWFsbHkgYSBjb21waWxhdGlvbiBwYXRoKS4gVGhlIGRldnBhdGggbWltaWNzCisgKiB0aGUgY2xhc3NwYXRoLCBleGNlcHQgaGFzIHNvdXJjZSBmb2xkZXIgZW50cmllcyBpbiBwbGFjZSBvZiBvdXRwdXQKKyAqIGxvY2F0aW9ucyBpbiBleHRlcm5hbCBwcm9qZWN0cy4KKyAqCisgKiA8cD5FYWNoIEphdmFQcm9qZWN0IGhhcyBhIE5hbWVMb29rdXAgZmFjaWxpdHkgdGhhdCBsb2NhdGVzIGVsZW1lbnRzCisgKiBvbiBieSBuYW1lLCBiYXNlZCBvbiB0aGUgZGV2cGF0aC4KKyAqCisgKiBAc2VlIElKYXZhUHJvamVjdAorICovCitwdWJsaWMgY2xhc3MgSmF2YVByb2plY3QKKwlleHRlbmRzIE9wZW5hYmxlCisJaW1wbGVtZW50cyBJSmF2YVByb2plY3QsIElQcm9qZWN0TmF0dXJlIHsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZSBzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0NBU0VfU0VOU0lUSVZFID0gIW5ldyBGaWxlKCJUZW1wIikuZXF1YWxzKG5ldyBGaWxlKCJ0ZW1wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIEFuIGVtcHR5IGFycmF5IG9mIHN0cmluZ3MgaW5kaWNhdGluZyB0aGF0IGEgcHJvamVjdCBkb2Vzbid0IGhhdmUgYW55IHByZXJlcXVlc2l0ZSBwcm9qZWN0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PX1BSRVJFUVVJU0lURVMgPSBuZXcgU3RyaW5nWzBdOworCisJLyoqCisJICogVGhlIHBsYXRmb3JtIHByb2plY3QgdGhpcyA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGlzIGJhc2VkIG9uCisJICovCisJcHJvdGVjdGVkIElQcm9qZWN0IGZQcm9qZWN0OworCisJLyoqCisJICogUmV0dXJucyBhIGNhbm9uaWNhbGl6ZWQgcGF0aCBmcm9tIHRoZSBnaXZlbiBleHRlcm5hbCBwYXRoLgorCSAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHBhdGggY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mIHNlZ21lbnRzCisJICogYW5kIGl0IGNvbnRhaW5zIGEgZGV2aWNlIG9ubHkgaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbmVkIG9uZS4KKwkgKiBAc2VlIGphdmEuaW8uRmlsZSBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBjYW5vbmljYWxpemVkIHBhdGgKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQYXRoIGNhbm9uaWNhbGl6ZWRQYXRoKElQYXRoIGV4dGVybmFsUGF0aCkgeworCQkKKwkJaWYgKGV4dGVybmFsUGF0aCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKy8vCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKSB7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbGl6aW5nICIgKyBleHRlcm5hbFBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKy8vCQl9CisKKwkJaWYgKElTX0NBU0VfU0VOU0lUSVZFKSB7CisvLwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKGZpbGUgc3lzdGVtIGlzIGNhc2Ugc2Vuc2l0aXZlKSIpOyAvLyROT04tTkxTLTEkCisvLwkJCX0KKwkJCXJldHVybiBleHRlcm5hbFBhdGg7CisJCX0KKworCQkvLyBpZiBub3QgZXh0ZXJuYWwgcGF0aCwgcmV0dXJuIG9yaWdpbmFsIHBhdGgKKwkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihleHRlcm5hbFBhdGgpICE9IG51bGwpIHsKKy8vCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgeworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgb3JpZ2luYWwgcGF0aCAobWVtYmVyIG9mIHdvcmtzcGFjZSkiKTsgLy8kTk9OLU5MUy0xJAorLy8JCQl9CisJCQlyZXR1cm4gZXh0ZXJuYWxQYXRoOworCQl9CisKKwkJSVBhdGggY2Fub25pY2FsUGF0aCA9IG51bGw7CisJCXRyeSB7CisJCQljYW5vbmljYWxQYXRoID0KKwkJCQluZXcgUGF0aChuZXcgRmlsZShleHRlcm5hbFBhdGgudG9PU1N0cmluZygpKS5nZXRDYW5vbmljYWxQYXRoKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBkZWZhdWx0IHRvIG9yaWdpbmFsIHBhdGgKKy8vCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgeworLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgb3JpZ2luYWwgcGF0aCAoSU9FeGNlcHRpb24pIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJfQorCQkJcmV0dXJuIGV4dGVybmFsUGF0aDsKKwkJfQorCQkKKwkJSVBhdGggcmVzdWx0OworCQlpbnQgY2Fub25pY2FsTGVuZ3RoID0gY2Fub25pY2FsUGF0aC5zZWdtZW50Q291bnQoKTsKKwkJaWYgKGNhbm9uaWNhbExlbmd0aCA9PSAwKSB7CisJCQkvLyB0aGUgamF2YS5pby5GaWxlIGNhbm9uaWNhbGl6YXRpb24gZmFpbGVkCisvLwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkFWQSBNT0RFTCAtIENhbm9uaWNhbCBwYXRoIGlzIG9yaWdpbmFsIHBhdGggKGNhbm9uaWNhbCBwYXRoIGlzIGVtcHR5KSIpOyAvLyROT04tTkxTLTEkCisvLwkJCX0KKwkJCXJldHVybiBleHRlcm5hbFBhdGg7CisJCX0gZWxzZSBpZiAoZXh0ZXJuYWxQYXRoLmlzQWJzb2x1dGUoKSkgeworCQkJcmVzdWx0ID0gY2Fub25pY2FsUGF0aDsKKwkJfSBlbHNlIHsKKwkJCS8vIGlmIHBhdGggaXMgcmVsYXRpdmUsIHJlbW92ZSB0aGUgZmlyc3Qgc2VnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSBqYXZhLmlvLkZpbGUgY2Fub25pY2FsaXphdGlvbgorCQkJLy8gZS5nLiAnbGliL2NsYXNzZXMuemlwJyB3YXMgY29udmVydGVkIHRvICdkOi9teWZvbGRlci9saWIvY2xhc3Nlcy56aXAnCisJCQlpbnQgZXh0ZXJuYWxMZW5ndGggPSBleHRlcm5hbFBhdGguc2VnbWVudENvdW50KCk7CisJCQlpZiAoY2Fub25pY2FsTGVuZ3RoID49IGV4dGVybmFsTGVuZ3RoKSB7CisJCQkJcmVzdWx0ID0gY2Fub25pY2FsUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNhbm9uaWNhbExlbmd0aCAtIGV4dGVybmFsTGVuZ3RoKTsKKwkJCX0gZWxzZSB7CisvLwkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKSB7CisvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgb3JpZ2luYWwgcGF0aCAoY2Fub25pY2FsIHBhdGggaXMgIiArIGNhbm9uaWNhbFBhdGgudG9TdHJpbmcoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorLy8JCQkJfQorCQkJCXJldHVybiBleHRlcm5hbFBhdGg7CisJCQl9CisJCX0KKwkJCisJCS8vIGtlZXAgZGV2aWNlIG9ubHkgaWYgaXQgd2FzIHNwZWNpZmllZCAodGhpcyBpcyBiZWNhdXNlIEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpIGNvbnZlcnRzICcvbGliL2NsYXNzZWQuemlwJyB0byAnZDovbGliL2NsYXNzZXMvemlwJykKKwkJaWYgKGV4dGVybmFsUGF0aC5nZXREZXZpY2UoKSA9PSBudWxsKSB7CisJCQlyZXN1bHQgPSByZXN1bHQuc2V0RGV2aWNlKG51bGwpOworCQl9IAorLy8JCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgIiArIHJlc3VsdC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorLy8JCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgWE1MIFN0cmluZyBlbmNvZGluZyBvZiB0aGUgY2xhc3MgcGF0aC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEVsZW1lbnQgZ2V0RW50cnlBc1hNTEVsZW1lbnQoCisJCURvY3VtZW50IGRvY3VtZW50LAorCQlJQ2xhc3NwYXRoRW50cnkgZW50cnksCisJCUlQYXRoIHByZWZpeFBhdGgpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNsYXNzcGF0aGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImtpbmQiLCBraW5kVG9TdHJpbmcoZW50cnkuZ2V0RW50cnlLaW5kKCkpKTsJLy8kTk9OLU5MUy0xJAorCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAmJiBlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgeworCQkJLy8gdHJhbnNsYXRlIHRvIHByb2plY3QgcmVsYXRpdmUgZnJvbSBhYnNvbHV0ZSAodW5sZXNzIGEgZGV2aWNlIHBhdGgpCisJCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKKwkJCQlpZiAocHJlZml4UGF0aCAhPSBudWxsICYmIHByZWZpeFBhdGguaXNQcmVmaXhPZihwYXRoKSkgeworCQkJCQlpZiAocGF0aC5zZWdtZW50KDApLmVxdWFscyhwcmVmaXhQYXRoLnNlZ21lbnQoMCkpKSB7CisJCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCQkJCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwYXRoID0gcGF0aC5tYWtlQWJzb2x1dGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbGVtZW50LnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgIT0gbnVsbCkgeworCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInNvdXJjZXBhdGgiLCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpICE9IG51bGwpIHsKKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKAorCQkJCSJyb290cGF0aCIsIC8vJE5PTi1OTFMtMSQKKwkJCQllbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpKTsKKwkJfQorCQlpZiAoZW50cnkuaXNFeHBvcnRlZCgpKSB7CisJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiZXhwb3J0ZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGEgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4gZnJvbSBpdHMgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3JtLgorCSAqLworCXN0YXRpYyBpbnQga2luZEZyb21TdHJpbmcoU3RyaW5nIGtpbmRTdHIpIHsKKworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJwcmoiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDsKKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgidmFyIikpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJjb24iKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJzcmMiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJsaWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWTsKKwkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgib3V0cHV0IikpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvciB0aGUga2luZCBvZiBhIGNsYXNzIHBhdGggZW50cnkuCisJICovCisJc3RhdGljIFN0cmluZyBraW5kVG9TdHJpbmcoaW50IGtpbmQpIHsKKworCQlzd2l0Y2ggKGtpbmQpIHsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKKwkJCQlyZXR1cm4gInNyYyI7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CisJCQkJcmV0dXJuICJzcmMiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CisJCQkJcmV0dXJuICJsaWIiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgorCQkJCXJldHVybiAidmFyIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6CisJCQkJcmV0dXJuICJjb24iOyAvLyROT04tTkxTLTEkCisJCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUIDoKKwkJCQlyZXR1cm4gIm91dHB1dCI7IC8vJE5PTi1OTFMtMSQKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIG5lZWRlZCBmb3IgPGNvZGU+SVByb2plY3QuZ2V0TmF0dXJlKCk8L2NvZGU+IGFuZCA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmUoKTwvY29kZT4uCisJICoKKwkgKiBAc2VlICNzZXRQcm9qZWN0CisJICovCisJcHVibGljIEphdmFQcm9qZWN0KCkgeworCQlzdXBlcihKQVZBX1BST0pFQ1QsIG51bGwsIG51bGwpOworCX0KKworCXB1YmxpYyBKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJSmF2YUVsZW1lbnQgcGFyZW50KSB7CisJCXN1cGVyKEpBVkFfUFJPSkVDVCwgcGFyZW50LCBwcm9qZWN0LmdldE5hbWUoKSk7CisJCWZQcm9qZWN0ID0gcHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgYnVpbGRlciB0byB0aGUgYnVpbGQgc3BlYyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVG9CdWlsZFNwZWMoU3RyaW5nIGJ1aWxkZXJJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJSUNvbW1hbmQgamF2YUNvbW1hbmQgPSBnZXRKYXZhQ29tbWFuZChkZXNjcmlwdGlvbik7CisKKwkJaWYgKGphdmFDb21tYW5kID09IG51bGwpIHsKKworCQkJLy8gQWRkIGEgSmF2YSBjb21tYW5kIHRvIHRoZSBidWlsZCBzcGVjCisJCQlJQ29tbWFuZCBjb21tYW5kID0gZGVzY3JpcHRpb24ubmV3Q29tbWFuZCgpOworCQkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShidWlsZGVySUQpOworCQkJc2V0SmF2YUNvbW1hbmQoZGVzY3JpcHRpb24sIGNvbW1hbmQpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2xvc2luZyhPYmplY3QgaW5mbykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQkvLyBmb3JnZXQgc291cmNlIGF0dGFjaG1lbnQgcmVjb21tZW5kYXRpb25zCisJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChyb290c1tpXSBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpeworCQkJCSgoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdHNbaV0pLnNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShudWxsKTsgCisJCQl9CisJCX0KKwkJc3VwZXIuY2xvc2luZyhpbmZvKTsKKwl9CisJCisJLyoqCisJICogSW50ZXJuYWwgY29tcHV0YXRpb24gb2YgYW4gZXhwYW5kZWQgY2xhc3NwYXRoLiBJdCB3aWxsIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLCBhbmQgcHJvZHVjZSBjb3BpZXMKKwkgKiBvZiBleHBvcnRlZCBjbGFzc3BhdGggZW50cmllcyB0byBhdm9pZCBwb3NzaWJsZSBzaWRlLWVmZmVjdHMgZXZlciBhZnRlci4KKwkgKi8JCQkKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGFuZGVkQ2xhc3NwYXRoKAorCQlKYXZhUHJvamVjdCBpbml0aWFsUHJvamVjdCwgCisJCWJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlLAorCQlib29sZWFuIGdlbmVyYXRlTWFya2VyT25FcnJvciwKKwkJSGFzaFNldCB2aXNpdGVkUHJvamVjdHMsIAorCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRFbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCWlmICh2aXNpdGVkUHJvamVjdHMuY29udGFpbnModGhpcykpeworCQkJcmV0dXJuOyAvLyBicmVhayBjeWNsZXMgaWYgYW55CisJCX0KKwkJdmlzaXRlZFByb2plY3RzLmFkZCh0aGlzKTsKKworCQlpZiAoZ2VuZXJhdGVNYXJrZXJPbkVycm9yICYmICF0aGlzLmVxdWFscyhpbml0aWFsUHJvamVjdCkpeworCQkJZ2VuZXJhdGVNYXJrZXJPbkVycm9yID0gZmFsc2U7CisJCX0KKwkJSUNsYXNzcGF0aEVudHJ5W10gaW1tZWRpYXRlQ2xhc3NwYXRoID0gCisJCQlnZXRSZXNvbHZlZENsYXNzcGF0aChpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUsIGdlbmVyYXRlTWFya2VyT25FcnJvcik7CisJCQkKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IHRoaXMuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1tZWRpYXRlQ2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGltbWVkaWF0ZUNsYXNzcGF0aFtpXTsKKworCQkJYm9vbGVhbiBpc0luaXRpYWxQcm9qZWN0ID0gdGhpcy5lcXVhbHMoaW5pdGlhbFByb2plY3QpOworCQkJaWYgKGlzSW5pdGlhbFByb2plY3QgfHwgZW50cnkuaXNFeHBvcnRlZCgpKXsKKwkJCQkKKwkJCQlhY2N1bXVsYXRlZEVudHJpZXMuYWRkKGVudHJ5KTsKKwkJCQkKKwkJCQkvLyByZWN1cnNlIGluIHByb2plY3QgdG8gZ2V0IGFsbCBpdHMgaW5kaXJlY3QgZXhwb3J0cyAob25seSBjb25zaWRlciBleHBvcnRlZCBlbnRyaWVzIGZyb20gdGhlcmUgb24pCQkJCQorCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgeworCQkJCQlJUHJvamVjdCBwcm9qUnNjID0gKElQcm9qZWN0KSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKKwkJCQkJaWYgKHByb2pSc2MgIT0gbnVsbCAmJiBwcm9qUnNjLmlzT3BlbigpKSB7CQkJCQorCQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHByb2pSc2MpOworCQkJCQkJcHJvamVjdC5jb21wdXRlRXhwYW5kZWRDbGFzc3BhdGgoCisJCQkJCQkJaW5pdGlhbFByb2plY3QsIAorCQkJCQkJCWlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSwgCisJCQkJCQkJZ2VuZXJhdGVNYXJrZXJPbkVycm9yLAorCQkJCQkJCXZpc2l0ZWRQcm9qZWN0cywgCisJCQkJCQkJYWNjdW11bGF0ZWRFbnRyaWVzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0JCQkKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIChsb2NhbC9hbGwpIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb2plY3QncyBjbGFzc3BhdGguCisJICogTm90ZTogdGhpcyBmb2xsb3dzIHByb2plY3QgY2xhc3NwYXRoIHJlZmVyZW5jZXMgdG8gZmluZCByZXF1aXJlZCBwcm9qZWN0IGNvbnRyaWJ1dGlvbnMsCisJICogZWxpbWluYXRpbmcgZHVwbGljYXRlcyBzaWxlbnRseS4KKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBib29sZWFuIHJldHJpZXZlRXhwb3J0ZWRSb290cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJT2JqZWN0VmVjdG9yIGFjY3VtdWxhdGVkUm9vdHMgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGgsIGFjY3VtdWxhdGVkUm9vdHMsIG5ldyBIYXNoU2V0KDUpLCB0cnVlLCB0cnVlLCByZXRyaWV2ZUV4cG9ydGVkUm9vdHMpOworCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RBcnJheSA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFthY2N1bXVsYXRlZFJvb3RzLnNpemUoKV07CisJCWFjY3VtdWxhdGVkUm9vdHMuY29weUludG8ocm9vdEFycmF5KTsKKwkJcmV0dXJuIHJvb3RBcnJheTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5LiBJbiBjYXNlIGl0IHJlZmVycyB0bworCSAqIGEgcHJvamVjdCwgaXQgd2lsbCBmb2xsb3cgaXRzIGNsYXNzcGF0aCBzbyBhcyB0byBmaW5kIGV4cG9ydGVkIHJvb3RzIGFzIHdlbGwuCisJICovCisJcHVibGljIHZvaWQgY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAorCQlJQ2xhc3NwYXRoRW50cnkgZW50cnksCisJCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZFJvb3RzLCAKKwkJSGFzaFNldCByb290SURzLCAKKwkJYm9vbGVhbiBpbnNpZGVPcmlnaW5hbFByb2plY3QsCisJCWJvb2xlYW4gY2hlY2tFeGlzdGVuY3ksCisJCWJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQorCQlTdHJpbmcgcm9vdElEID0gKChDbGFzc3BhdGhFbnRyeSllbnRyeSkucm9vdElEKCk7CisJCWlmIChyb290SURzLmNvbnRhaW5zKHJvb3RJRCkpIHJldHVybjsKKworCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCQorCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpeworCQkJCisJCQkvLyBzb3VyY2UgZm9sZGVyCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKworCQkJCWlmIChwcm9qZWN0UGF0aC5pc1ByZWZpeE9mKGVudHJ5UGF0aCkpeworCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeVBhdGgsIGNoZWNrRXhpc3RlbmN5KTsKKwkJCQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47CisKKwkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSVByb2plY3QpeworCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCisJCQkJCQkJbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QoKElSZXNvdXJjZSl0YXJnZXQsIHRoaXMpKTsKKwkJCQkJCXJvb3RJRHMuYWRkKHJvb3RJRCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCS8vIGludGVybmFsL2V4dGVybmFsIEpBUiBvciBmb2xkZXIKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKKwkJCQorCQkJCWlmICghaW5zaWRlT3JpZ2luYWxQcm9qZWN0ICYmICFlbnRyeS5pc0V4cG9ydGVkKCkpIHJldHVybjsKKworCQkJCVN0cmluZyBleHRlbnNpb24gPSBlbnRyeVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOworCisJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnlQYXRoLCBjaGVja0V4aXN0ZW5jeSk7CisJCQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47CisKKwkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKKwkJCQkJCisJCQkJCS8vIGludGVybmFsIHRhcmdldAorCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7CisJCQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKXsKKwkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CisJCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCisJCQkJCQkJCW5ldyBQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKSk7CisJCQkJCQkJcm9vdElEcy5hZGQocm9vdElEKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLmFkZCgKKwkJCQkJCQkJCW5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcm9vdElEcy5hZGQocm9vdElEKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gZXh0ZXJuYWwgdGFyZ2V0IC0gb25seSBKQVJzIGFsbG93ZWQKKwkJCQkJaWYgKCgoamF2YS5pby5GaWxlKXRhcmdldCkuaXNGaWxlKCkKKwkJCQkJCSYmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCisJCQkJCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvT1NTdHJpbmcoKSwgdGhpcykpOworCQkJCQkJcm9vdElEcy5hZGQocm9vdElEKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJLy8gcmVjdXJzZSBpbnRvIHJlcXVpcmVkIHByb2plY3QKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKKworCQkJCWlmICghcmV0cmlldmVFeHBvcnRlZFJvb3RzKSByZXR1cm47CisJCQkJaWYgKCFpbnNpZGVPcmlnaW5hbFByb2plY3QgJiYgIWVudHJ5LmlzRXhwb3J0ZWQoKSkgcmV0dXJuOworCisJCQkJSmF2YVByb2plY3QgcmVxdWlyZWRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KWdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KGVudHJ5UGF0aC5zZWdtZW50KDApKTsKKwkJCQlJUHJvamVjdCByZXF1aXJlZFByb2plY3RSc2MgPSByZXF1aXJlZFByb2plY3QuZ2V0UHJvamVjdCgpOworCQkJCWlmIChyZXF1aXJlZFByb2plY3RSc2MuZXhpc3RzKCkgJiYgcmVxdWlyZWRQcm9qZWN0UnNjLmlzT3BlbigpKXsgLy8gc3BlY2lhbCBidWlsZGVyIGJpbmFyeSBvdXRwdXQKKwkJCQkJcm9vdElEcy5hZGQocm9vdElEKTsKKwkJCQkJcmVxdWlyZWRQcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKKwkJCQkJCXJlcXVpcmVkUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgCisJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLCAKKwkJCQkJCXJvb3RJRHMsIAorCQkJCQkJZmFsc2UsIAorCQkJCQkJY2hlY2tFeGlzdGVuY3ksIAorCQkJCQkJcmV0cmlldmVFeHBvcnRlZFJvb3RzKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyAobG9jYWwvYWxsKSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0J3MgY2xhc3NwYXRoLgorCSAqIE5vdGU6IHRoaXMgZm9sbG93cyBwcm9qZWN0IGNsYXNzcGF0aCByZWZlcmVuY2VzIHRvIGZpbmQgcmVxdWlyZWQgcHJvamVjdCBjb250cmlidXRpb25zLAorCSAqIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMgc2lsZW50bHkuCisJICovCisJcHVibGljIHZvaWQgY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsCisJCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZFJvb3RzLCAKKwkJSGFzaFNldCByb290SURzLCAKKwkJYm9vbGVhbiBpbnNpZGVPcmlnaW5hbFByb2plY3QsCisJCWJvb2xlYW4gY2hlY2tFeGlzdGVuY3ksCisJCWJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlpZiAoaW5zaWRlT3JpZ2luYWxQcm9qZWN0KXsKKwkJCXJvb3RJRHMuYWRkKHJvb3RJRCgpKTsKKwkJfQkKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQljb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoCisJCQkJY2xhc3NwYXRoW2ldLAorCQkJCWFjY3VtdWxhdGVkUm9vdHMsCisJCQkJcm9vdElEcywKKwkJCQlpbnNpZGVPcmlnaW5hbFByb2plY3QsCisJCQkJY2hlY2tFeGlzdGVuY3ksCisJCQkJcmV0cmlldmVFeHBvcnRlZFJvb3RzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbXB1dGUgdGhlIGZpbGUgbmFtZSB0byB1c2UgZm9yIGEgZ2l2ZW4gc2hhcmVkIHByb3BlcnR5CisJICovCisJcHVibGljIFN0cmluZyBjb21wdXRlU2hhcmVkUHJvcGVydHlGaWxlTmFtZShRdWFsaWZpZWROYW1lIHFOYW1lKSB7CisKKwkJcmV0dXJuICcuJyArIHFOYW1lLmdldExvY2FsTmFtZSgpOworCX0KKwkKKwkvKioKKwkgKiBDb25maWd1cmUgdGhlIHByb2plY3Qgd2l0aCBKYXZhIG5hdHVyZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gcmVnaXN0ZXIgSmF2YSBidWlsZGVyCisJCWFkZFRvQnVpbGRTcGVjKEphdmFDb3JlLkJVSUxERVJfSUQpOworCX0KKworCS8qKgorCSAqIFJlY29yZCBhIG5ldyBtYXJrZXIgZGVub3RpbmcgYSBjbGFzc3BhdGggcHJvYmxlbSAKKwkgKi8KKwl2b2lkIGNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCisJCVN0cmluZyBtZXNzYWdlLAorCQlpbnQgc2V2ZXJpdHksCisJCWJvb2xlYW4gaXNDeWNsZVByb2JsZW0sCQkKKwkJYm9vbGVhbiBpc0NsYXNzcGF0aEZpbGVGb3JtYXRQcm9ibGVtKSB7CisJCXRyeSB7CisJCQlJTWFya2VyIG1hcmtlciA9IGdldFByb2plY3QoKS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIpOworCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCisJCQkJbmV3IFN0cmluZ1tdIHsgCisJCQkJCUlNYXJrZXIuTUVTU0FHRSwgCisJCQkJCUlNYXJrZXIuU0VWRVJJVFksIAorCQkJCQlJTWFya2VyLkxPQ0FUSU9OLCAKKwkJCQkJSUphdmFNb2RlbE1hcmtlci5DWUNMRV9ERVRFQ1RFRCwKKwkJCQkJSUphdmFNb2RlbE1hcmtlci5DTEFTU1BBVEhfRklMRV9GT1JNQVQgfSwKKwkJCQluZXcgT2JqZWN0W10geworCQkJCQltZXNzYWdlLAorCQkJCQluZXcgSW50ZWdlcihzZXZlcml0eSksIAorCQkJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5idWlsZFBhdGgiKSwvLyROT04tTkxTLTEkCisJCQkJCWlzQ3ljbGVQcm9ibGVtID8gInRydWUiIDogImZhbHNlIiwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA/ICJ0cnVlIiA6ICJmYWxzZSJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IGVsZW1lbnQgaW5mbyBmb3IgdGhpcyBlbGVtZW50LgorCSAqLworCXByb3RlY3RlZCBPcGVuYWJsZUVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKCkgeworCisJCXJldHVybiBuZXcgSmF2YVByb2plY3RFbGVtZW50SW5mbygpOworCX0KKworCS8qKgorCS8qKgorCSAqIFJlbW92ZXMgdGhlIEphdmEgbmF0dXJlIGZyb20gdGhlIHByb2plY3QuCisJICovCisJcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gZGVyZWdpc3RlciBKYXZhIGJ1aWxkZXIKKwkJcmVtb3ZlRnJvbUJ1aWxkU3BlYyhKYXZhQ29yZS5CVUlMREVSX0lEKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGVmYXVsdCBjbGFzcyBwYXRoLgorCSAqIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QKKwkgKi8KKwlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gZGVmYXVsdENsYXNzcGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W10geworCQkJIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKX07CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgorCSAqIFRoaXMgaXMgdGhlIHByb2plY3QgYmluIGZvbGRlcgorCSAqLworCXByb3RlY3RlZCBJUGF0aCBkZWZhdWx0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiYmluIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYW5kbGUgcmVwcmVzZW50cyB0aGUgc2FtZSBKYXZhIHByb2plY3QKKwkgKiBhcyB0aGUgZ2l2ZW4gaGFuZGxlLiBUd28gaGFuZGxlcyByZXByZXNlbnQgdGhlIHNhbWUKKwkgKiBwcm9qZWN0IGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHJlcHJlc2VudCBhIHByb2plY3Qgd2l0aCAKKwkgKiB0aGUgc2FtZSB1bmRlcmx5aW5nIHJlc291cmNlIGFuZCBvY2N1cnJlbmNlIGNvdW50cy4KKwkgKgorCSAqIEBzZWUgSmF2YUVsZW1lbnQjZXF1YWxzCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisKKwkJaWYgKHRoaXMgPT0gbykKKwkJCXJldHVybiB0cnVlOworCisJCWlmICghKG8gaW5zdGFuY2VvZiBKYXZhUHJvamVjdCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJSmF2YVByb2plY3Qgb3RoZXIgPSAoSmF2YVByb2plY3QpIG87CisJCXJldHVybiBnZXRQcm9qZWN0KCkuZXF1YWxzKG90aGVyLmdldFByb2plY3QoKSkKKwkJCSYmIGZPY2N1cnJlbmNlQ291bnQgPT0gb3RoZXIuZk9jY3VycmVuY2VDb3VudDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZmluZEVsZW1lbnQoSVBhdGggcGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzQWJzb2x1dGUoKSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbigKKwkJCQluZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBwYXRoKSk7CisJCX0KKwkJdHJ5IHsKKworCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGF0aC50b1N0cmluZygpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpOworCisJCQkJSVBhY2thZ2VGcmFnbWVudFtdIHBrZ0ZyYWdtZW50cyA9CisJCQkJCWdldE5hbWVMb29rdXAoKS5maW5kUGFja2FnZUZyYWdtZW50cyhwYWNrYWdlTmFtZSwgZmFsc2UpOworCQkJCWlmIChwa2dGcmFnbWVudHMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHRyeSB0byByZXR1cm4gb25lIHRoYXQgaXMgYSBjaGlsZCBvZiB0aGlzIHByb2plY3QKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBrZ0ZyYWdtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCisJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZ0ZyYWdtZW50ID0gcGtnRnJhZ21lbnRzW2ldOworCQkJCQkJaWYgKHRoaXMuZXF1YWxzKHBrZ0ZyYWdtZW50LmdldFBhcmVudCgpLmdldFBhcmVudCgpKSkgeworCQkJCQkJCXJldHVybiBwa2dGcmFnbWVudDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBkZWZhdWx0IHRvIHRoZSBmaXJzdCBvbmUKKwkJCQkJcmV0dXJuIHBrZ0ZyYWdtZW50c1swXTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKAorCQkJCWV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhIikgLy8kTk9OLU5MUy0xJAorCQkJCQl8fCBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSkgeyAgLy8kTk9OLU5MUy0xJAorCQkJCUlQYXRoIHBhY2thZ2VQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CisJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZVBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKKwkJCQlTdHJpbmcgdHlwZU5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7CisJCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSBleHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsKKwkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IG51bGw7CisJCQkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgeworCQkJCQlxdWFsaWZpZWROYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyB0eXBlTmFtZTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJCXF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZTsKKwkJCQl9CisJCQkJSVR5cGUgdHlwZSA9CisJCQkJCWdldE5hbWVMb29rdXAoKS5maW5kVHlwZSgKKwkJCQkJCXF1YWxpZmllZE5hbWUsCisJCQkJCQlmYWxzZSwKKwkJCQkJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0eXBlLmdldFBhcmVudCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkKKwkJCQk9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnQgZmluZFBhY2thZ2VGcmFnbWVudChJUGF0aCBwYXRoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gZmluZFBhY2thZ2VGcmFnbWVudDAodGhpcy5jYW5vbmljYWxpemVkUGF0aChwYXRoKSk7CisJfQorCisJLyoqCisJICogbm9uIHBhdGggY2Fub25pY2FsaXppbmcgdmVyc2lvbgorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ21lbnQwKElQYXRoIHBhdGgpIAorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gZ2V0TmFtZUxvb2t1cCgpLmZpbmRQYWNrYWdlRnJhZ21lbnQocGF0aCk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggcGF0aCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIGZpbmRQYWNrYWdlRnJhZ21lbnRSb290MCh0aGlzLmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpKTsKKwl9CisKKwkvKioKKwkgKiBubyBwYXRoIGNhbm9uaWNhbGl6YXRpb24gCisJICovCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChJUGF0aCBwYXRoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGFsbFJvb3RzID0gdGhpcy5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOworCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgicGF0aC5tdXN0QmVBYnNvbHV0ZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWZvciAoaW50IGk9IDA7IGkgPCBhbGxSb290cy5sZW5ndGg7IGkrKykgeworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgY2xhc3NwYXRoUm9vdD0gYWxsUm9vdHNbaV07CisJCQlpZiAoY2xhc3NwYXRoUm9vdC5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKSB7CisJCQkJcmV0dXJuIGNsYXNzcGF0aFJvb3Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0I2ZpbmRUeXBlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlUeXBlIHR5cGUgPSAKKwkJCXRoaXMuZ2V0TmFtZUxvb2t1cCgpLmZpbmRUeXBlKAorCQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSwgCisJCQkJZmFsc2UsCisJCQkJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IE5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQkvLyB0cnkgdG8gZmluZCBlbmNsb3NpbmcgdHlwZQorCQkJaW50IGxhc3REb3QgPSBmdWxseVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCWlmIChsYXN0RG90ID09IC0xKSByZXR1cm4gbnVsbDsKKwkJCXR5cGUgPSB0aGlzLmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkpOworCQkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJCXR5cGUgPSB0eXBlLmdldFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhsYXN0RG90KzEpKTsKKwkJCQlpZiAoIXR5cGUuZXhpc3RzKCkpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0eXBlOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdCNmaW5kVHlwZShTdHJpbmcsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gCisJCQl0aGlzLmdldE5hbWVMb29rdXAoKS5maW5kVHlwZSgKKwkJCQl0eXBlUXVhbGlmaWVkTmFtZSwgCisJCQkJcGFja2FnZU5hbWUsCisJCQkJZmFsc2UsCisJCQkJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IE5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOworCX0JCisJCisJLyoqCisJICogUmVtb3ZlIGFsbCBtYXJrZXJzIGRlbm90aW5nIGNsYXNzcGF0aCBwcm9ibGVtcworCSAqLworCXByb3RlY3RlZCB2b2lkIGZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoYm9vbGVhbiBmbHVzaEN5Y2xlTWFya2VycywgYm9vbGVhbiBmbHVzaENsYXNzcGF0aEZvcm1hdE1hcmtlcnMpIHsKKwkJdHJ5IHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgeworCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9PTkUpOworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtYXJrZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKKwkJCQkJU3RyaW5nIGN5Y2xlQXR0ciA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkNZQ0xFX0RFVEVDVEVEKTsKKwkJCQkJU3RyaW5nIGNsYXNzcGF0aEZpbGVGb3JtYXRBdHRyID0gIChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkNMQVNTUEFUSF9GSUxFX0ZPUk1BVCk7CisJCQkJCWlmICgoZmx1c2hDeWNsZU1hcmtlcnMgPT0gKGN5Y2xlQXR0ciAhPSBudWxsICYmIGN5Y2xlQXR0ci5lcXVhbHMoInRydWUiKSkpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSYmIChmbHVzaENsYXNzcGF0aEZvcm1hdE1hcmtlcnMgPT0gKGNsYXNzcGF0aEZpbGVGb3JtYXRBdHRyICE9IG51bGwgJiYgY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIuZXF1YWxzKCJ0cnVlIikpKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW1hcmtlci5kZWxldGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIE9wZW5hYmxlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVJbmZvcygKKwkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLAorCQlJUHJvZ3Jlc3NNb25pdG9yIHBtLAorCQlNYXAgbmV3RWxlbWVudHMsCisJCUlSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCWJvb2xlYW4gdmFsaWRJbmZvID0gZmFsc2U7CisJCXRyeSB7CisJCQlpZiAoKChJUHJvamVjdCkgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLmlzT3BlbigpKSB7CisJCQkJLy8gcHV0IHRoZSBpbmZvIG5vdywgYmVjYXVzZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGggcmVxdWlyZXMgaXQKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wdXRJbmZvKHRoaXMsIGluZm8pOworCisJCQkJLy8gcmVhZCBjbGFzc3BhdGggcHJvcGVydHkgKGNvbnRhaW5zIGFjdHVhbCBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiBzZXR0aW5ncykKKwkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbnVsbDsKKworCQkJCS8vIHJlYWQgZnJvbSBmaWxlCisJCQkJdHJ5IHsKKwkJCQkJU3RyaW5nIHNoYXJlZENsYXNzcGF0aCA9IGxvYWRDbGFzc3BhdGgoKTsKKwkJCQkJaWYgKHNoYXJlZENsYXNzcGF0aCAhPSBudWxsKSB7CisJCQkJCQljbGFzc3BhdGggPSByZWFkUGF0aHMoc2hhcmVkQ2xhc3NwYXRoKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7CisJCQkJCQkJVXRpbC5sb2coZSwgCisJCQkJCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7CisJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UgJiYgdGhpcy5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpeworCQkJCQkJVXRpbC5sb2coZSwgCisJCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrIi8uY2xhc3NwYXRoLCB3aWxsIHJldmVydCB0byBkZWZhdWx0IGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBleHRyYWN0IG91dCB0aGUgb3V0cHV0IGxvY2F0aW9uCisJCQkJaWYgKGNsYXNzcGF0aCAhPSBudWxsICYmIGNsYXNzcGF0aC5sZW5ndGggPiAwKSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtjbGFzc3BhdGgubGVuZ3RoIC0gMV07CisJCQkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7CisJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvcHkgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7CisJCQkJCQljbGFzc3BhdGggPSBjb3B5OworCQkJCQl9CisJCQkJfQorCQkJCS8vIHJlc3RvcmUgb3V0cHV0IGxvY2F0aW9uCQkJCQorCQkJCWlmIChvdXRwdXRMb2NhdGlvbiA9PSBudWxsKSB7CisJCQkJCW91dHB1dExvY2F0aW9uID0gZGVmYXVsdE91dHB1dExvY2F0aW9uKCk7CisJCQkJfQorCQkJCSgoSmF2YVByb2plY3RFbGVtZW50SW5mbylpbmZvKS5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbik7CisKKwkJCQkvLyByZXN0b3JlIGNsYXNzcGF0aAorCQkJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworCQkJCQljbGFzc3BhdGggPSBkZWZhdWx0Q2xhc3NwYXRoKCk7CisJCQkJfQorCQkJCXNldFJhd0NsYXNzcGF0aDAoY2xhc3NwYXRoKTsKKworCQkJCS8vIG9ubHkgdmFsaWQgaWYgcmVhY2hlcyBoZXJlCQkJCQorCQkJCXZhbGlkSW5mbyA9IHRydWU7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIXZhbGlkSW5mbykKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVJbmZvKHRoaXMpOworCQl9CisJCXJldHVybiB2YWxpZEluZm87CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXJldHVybiBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSksIHRydWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIFhNTCBTdHJpbmcgZW5jb2Rpbmcgb2YgdGhlIGNsYXNzIHBhdGguCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc3BhdGhBc1hNTCgKKwkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLAorCQlJUGF0aCBvdXRwdXRMb2NhdGlvbikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50SW1wbCgpOworCQlFbGVtZW50IGNwRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQlkb2MuYXBwZW5kQ2hpbGQoY3BFbGVtZW50KTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7ICsraSkgeworCQkJRWxlbWVudCBjcGVFbGVtZW50ID0KKwkJCQlnZXRFbnRyeUFzWE1MRWxlbWVudChkb2MsIGNsYXNzcGF0aFtpXSwgZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOworCQkJY3BFbGVtZW50LmFwcGVuZENoaWxkKGNwZUVsZW1lbnQpOworCQl9CisKKwkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKKwkJCW91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKwkJCW91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb24ubWFrZVJlbGF0aXZlKCk7CisJCQlFbGVtZW50IG9FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzcGF0aGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCW9FbGVtZW50LnNldEF0dHJpYnV0ZSgia2luZCIsIGtpbmRUb1N0cmluZyhDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkpOwkvLyROT04tTkxTLTEkCisJCQlvRWxlbWVudC5zZXRBdHRyaWJ1dGUoInBhdGgiLCBvdXRwdXRMb2NhdGlvbi50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQljcEVsZW1lbnQuYXBwZW5kQ2hpbGQob0VsZW1lbnQpOworCQl9CisKKwkJLy8gcHJvZHVjZSBhIFN0cmluZyBvdXRwdXQKKwkJdHJ5IHsKKwkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQlPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOworCQkJZm9ybWF0LnNldEluZGVudGluZyh0cnVlKTsKKwkJCWZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7ICAvLyROT04tTkxTLTEkCisJCQkKKwkJCVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9CisJCQkJU2VyaWFsaXplckZhY3RvcnkuZ2V0U2VyaWFsaXplckZhY3RvcnkoTWV0aG9kLlhNTCkubWFrZVNlcmlhbGl6ZXIoCisJCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocywgIlVURjgiKSwgLy8kTk9OLU5MUy0xJAorCQkJCQlmb3JtYXQpOworCQkJc2VyaWFsaXplci5hc0RPTVNlcmlhbGl6ZXIoKS5zZXJpYWxpemUoZG9jKTsKKwkJCXJldHVybiBzLnRvU3RyaW5nKCJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCByZWZlcnMgdG8gdGhlIGdpdmVuIHBhdGgKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByZWZlcmVuY2UgdG8gdGhlIHBhdGguCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRDbGFzc3BhdGhFbnRyeUZvcihJUGF0aCBwYXRoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGVudHJpZXNbaV0uZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkgeworCQkJCXJldHVybiBlbnRyaWVzW2ldOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgY2xhc3NwYXRoIHNlcnZlciBwcm9wZXJ0eQorCSAqIG9mIHRoaXMgcHJvamVjdAorCSAqLworCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldENsYXNzcGF0aFByb3BlcnR5TmFtZSgpIHsKKwkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKEphdmFDb3JlLlBMVUdJTl9JRCwgImNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgcmV0dXJuaW5nIHRoZSBleHBhbmRlZCBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMsIAorCSAqIHdoZXJlIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYW5kIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgZmluYWwgdGFyZ2V0IGVudHJpZXMuCisJICogQWxsIHByb2plY3QgZXhwb3J0cyBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gcHJvamVjdCBlbnRyaWVzLgorCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkKKwkJCXJldHVybiBnZXRFeHBhbmRlZENsYXNzcGF0aChpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUsIGZhbHNlKTsKKwl9CisJCQorCS8qKgorCSAqIEludGVybmFsIHZhcmlhbnQgd2hpY2ggY2FuIGNyZWF0ZSBtYXJrZXIgb24gcHJvamVjdCBmb3IgaW52YWxpZCBlbnRyaWVzLAorCSAqIGl0IHdpbGwgYWxzbyBwZXJmb3JtIGNsYXNzcGF0aCBleHBhbnNpb24gaW4gcHJlc2VuY2Ugb2YgcHJvamVjdCBwcmVyZXF1aXNpdGVzCisJICogZXhwb3J0aW5nIHRoZWlyIGVudHJpZXMuCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldEV4cGFuZGVkQ2xhc3NwYXRoKAorCQlib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSwKKwkJYm9vbGVhbiBnZW5lcmF0ZU1hcmtlck9uRXJyb3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQorCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRFbnRyaWVzID0gbmV3IE9iamVjdFZlY3RvcigpOwkJCisJCWNvbXB1dGVFeHBhbmRlZENsYXNzcGF0aCh0aGlzLCBpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUsIGdlbmVyYXRlTWFya2VyT25FcnJvciwgbmV3IEhhc2hTZXQoNSksIGFjY3VtdWxhdGVkRW50cmllcyk7CisJCQorCQlJQ2xhc3NwYXRoRW50cnlbXSBleHBhbmRlZFBhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2FjY3VtdWxhdGVkRW50cmllcy5zaXplKCldOworCQlhY2N1bXVsYXRlZEVudHJpZXMuY29weUludG8oZXhwYW5kZWRQYXRoKTsKKworCQlyZXR1cm4gZXhwYW5kZWRQYXRoOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoaXMgaGFuZGxlcworCSAqIGNvbnRyaWJ1dGlvbiB0byBhIG1lbWVudG8uCisJICovCisJcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpIHsKKworCQlyZXR1cm4gSkVNX0pBVkFQUk9KRUNUOworCX0KKworCS8qKgorCSAqIEZpbmQgdGhlIHNwZWNpZmljIEphdmEgY29tbWFuZCBhbW9uZ3N0IHRoZSBidWlsZCBzcGVjIG9mIGEgZ2l2ZW4gZGVzY3JpcHRpb24KKwkgKi8KKwlwcml2YXRlIElDb21tYW5kIGdldEphdmFDb21tYW5kKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKKwkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhKYXZhQ29yZS5CVUlMREVSX0lEKSkgeworCQkJCXJldHVybiBjb21tYW5kc1tpXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3BlY2lmaWMgdHlwZSBvZiBpbmZvIGZvciBhIEphdmEgcHJvamVjdC4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YVByb2plY3RFbGVtZW50SW5mbyBnZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIChKYXZhUHJvamVjdEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIE5hbWVMb29rdXAgZ2V0TmFtZUxvb2t1cCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCUphdmFQcm9qZWN0RWxlbWVudEluZm8gaW5mbyA9IGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKTsKKwkJLy8gbG9jayBvbiB0aGUgcHJvamVjdCBpbmZvIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uCisJCXN5bmNocm9uaXplZChpbmZvKXsKKwkJCU5hbWVMb29rdXAgbmFtZUxvb2t1cDsKKwkJCWlmICgobmFtZUxvb2t1cCA9IGluZm8uZ2V0TmFtZUxvb2t1cCgpKSA9PSBudWxsKXsKKwkJCQlpbmZvLnNldE5hbWVMb29rdXAobmFtZUxvb2t1cCA9IG5ldyBOYW1lTG9va3VwKHRoaXMpKTsKKwkJCX0KKwkJCXJldHVybiBuYW1lTG9va3VwOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXJldHVybiAoKEphdmFQcm9qZWN0RWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXModGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhdGggZ2V0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7CisJCWlmICh0aGlzLmlzT3BlbigpKSB7CisJCQlKYXZhUHJvamVjdEVsZW1lbnRJbmZvIGluZm8gPSBnZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCk7CisJCQlvdXRwdXRMb2NhdGlvbiA9IGluZm8uZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJCWlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG91dHB1dExvY2F0aW9uOworCQkJfQorCQkJcmV0dXJuIGRlZmF1bHRPdXRwdXRMb2NhdGlvbigpOworCQl9CisJCS8vIGlmIG5vdCBhbHJlYWR5IG9wZW5lZCwgdGhlbiByZWFkIGZyb20gZmlsZSAoYXZvaWQgcG9wdWxhdGluZyB0aGUgbW9kZWwgZm9yIENQIHF1ZXN0aW9uKQorCQlpZiAoIXRoaXMuZ2V0UHJvamVjdCgpLmV4aXN0cygpKXsKKwkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwkJfQorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHNoYXJlZENsYXNzcGF0aCA9IGxvYWRDbGFzc3BhdGgoKTsKKwkJCWlmIChzaGFyZWRDbGFzc3BhdGggIT0gbnVsbCkgeworCQkJCWNsYXNzcGF0aCA9IHJlYWRQYXRocyhzaGFyZWRDbGFzc3BhdGgpOworCQkJfQorCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFICYmIHRoaXMuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKXsKKwkJCQlVdGlsLmxvZyhlLCAKKwkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyIvLmNsYXNzcGF0aCwgd2lsbCByZXZlcnQgdG8gZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpeworCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7CisJCQkJVXRpbC5sb2coZSwgCisJCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCisJCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQkvLyBleHRyYWN0IG91dCB0aGUgb3V0cHV0IGxvY2F0aW9uCisJCWlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjbGFzc3BhdGgubGVuZ3RoID4gMCkgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKKwkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7CisJCQkJb3V0cHV0TG9jYXRpb24gPSBlbnRyeS5nZXRQYXRoKCk7CisJCQl9CisJCX0KKwkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKKwkJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKKwkJfQorCQlyZXR1cm4gZGVmYXVsdE91dHB1dExvY2F0aW9uKCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBBIGhhbmRsZSB0byB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBhdGguCisJICogVGhpcyBtZXRob2QgaXMgaGFuZGxlLW9ubHkgYW5kIHRoZSBlbGVtZW50IG1heSBvciBtYXkgbm90IGV4aXN0LiBSZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGdlbmVyYXRlIGEgaGFuZGxlIGZyb20gdGhlIHBhdGggKGZvciBleGFtcGxlLAorCSAqIGFuIGFic29sdXRlIHBhdGggdGhhdCBoYXMgbGVzcyB0aGFuIDIgc2VnbWVudHMuIFRoZSBwYXRoIG1heSBiZSByZWxhdGl2ZSBvcgorCSAqIGFic29sdXRlLgorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KElQYXRoIHBhdGgpIHsKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgcGF0aCwgZmFsc2UpOworCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgeworCQkJCVN0cmluZyBleHQgPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoZXh0ID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcihwYXRoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gcmVzb3VyY2UgamFyCisJCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKS5nZXRGaWxlKHBhdGgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIGRlZmF1bHQgcm9vdAorCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgoSVJlc291cmNlKXRhcmdldCk7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBleHQgPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoKChqYXZhLmlvLkZpbGUpdGFyZ2V0KS5pc0ZpbGUoKQorCQkJCQkmJiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShleHQpICAvLyROT04tTkxTLTEkCisJCQkJCQl8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGV4dCkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gZXh0ZXJuYWwgamFyCisJCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290MChwYXRoLnRvT1NTdHJpbmcoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gdW5rbm93biBwYXRoCisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlKSB7CisKKwkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUKKwkJCSYmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIpIC8vJE5PTi1OTFMtMSQKKwkJCQl8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKSkgeyAvLyROT04tTkxTLTEkIAorCQkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSwgdGhpcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJQYXRoKSB7CisKKwkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKHRoaXMuY2Fub25pY2FsaXplZFBhdGgobmV3IFBhdGgoamFyUGF0aCkpLnRvU3RyaW5nKCkpOworCX0KKwkKKwkvKioKKwkgKiBubyBwYXRoIGNhbm9uaWNhbGl6YXRpb24KKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAoU3RyaW5nIGphclBhdGgpIHsKKworCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoamFyUGF0aCwgdGhpcyk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCU9iamVjdFtdIGNoaWxkcmVuOworCQlpbnQgbGVuZ3RoOworCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzOworCisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQljaGlsZHJlbiA9IGdldENoaWxkcmVuKCksIAorCQkJMCwgCisJCQlyb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhdLCAKKwkJCTAsIAorCQkJbGVuZ3RoKTsKKwkJCQorCQlyZXR1cm4gcm9vdHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBlbnRyeS4KKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKKwkJCisJCXRyeSB7CisKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvcnJlc3BvbmRpbmdFbnRyaWVzID0gdGhpcy5nZXRSZXNvbHZlZENsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W117ZW50cnl9LCB0cnVlLCBmYWxzZSk7CisJCQlyZXR1cm4gY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKGNvcnJlc3BvbmRpbmdFbnRyaWVzLCBmYWxzZSk7CisKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSB7fTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBwcmVmaXhlZCBieSB0aGUgZ2l2ZW4gcGF0aCwgb3IKKwkgKiBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoZXJlIGFyZSBubyBzdWNoIGVsZW1lbnRzIGluIHRoZSBtb2RlbC4KKwkgKi8KKwlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJUGF0aCBwYXRoKQorCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJQXJyYXlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7ICsraSkgeworCQkJaWYgKHBhdGguaXNQcmVmaXhPZihyb290c1tpXS5nZXRQYXRoKCkpKSB7CisJCQkJbWF0Y2hlcy5hZGQocm9vdHNbaV0pOworCQkJfQorCQl9CisJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gY29weSA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFttYXRjaGVzLnNpemUoKV07CisJCW1hdGNoZXMudG9BcnJheShjb3B5KTsKKwkJcmV0dXJuIGNvcHk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFtdIGdldFBhY2thZ2VGcmFnbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudHNJblJvb3RzKHJvb3RzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB0aGUgcGFja2FnZSBmcmFnbWVudHMgZm91bmQgaW4gdGhlIHNwZWNpZmllZAorCSAqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCisJICovCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRbXSBnZXRQYWNrYWdlRnJhZ21lbnRzSW5Sb290cyhJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzKSB7CisKKwkJQXJyYXlMaXN0IGZyYWdzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07CisJCQl0cnkgeworCQkJCUlKYXZhRWxlbWVudFtdIHJvb3RGcmFnbWVudHMgPSByb290LmdldENoaWxkcmVuKCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290RnJhZ21lbnRzLmxlbmd0aDsgaisrKSB7CisJCQkJCWZyYWdzLmFkZChyb290RnJhZ21lbnRzW2pdKTsKKwkJCQl9CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJfQorCQlJUGFja2FnZUZyYWdtZW50W10gZnJhZ21lbnRzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbZnJhZ3Muc2l6ZSgpXTsKKwkJZnJhZ3MudG9BcnJheShmcmFnbWVudHMpOworCQlyZXR1cm4gZnJhZ21lbnRzOworCX0KKwkKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJCXJldHVybiB0aGlzLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCisJCXJldHVybiBmUHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSYXdDbGFzc3BhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOworCQlpZiAodGhpcy5pc09wZW4oKSkgeworCQkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBpbmZvID0gZ2V0SmF2YVByb2plY3RFbGVtZW50SW5mbygpOworCQkJY2xhc3NwYXRoID0gaW5mby5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJCWlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworCQkJCXJldHVybiBjbGFzc3BhdGg7CisJCQl9CisJCQlyZXR1cm4gZGVmYXVsdENsYXNzcGF0aCgpOworCQl9CisJCS8vIGlmIG5vdCBhbHJlYWR5IG9wZW5lZCwgdGhlbiByZWFkIGZyb20gZmlsZSAoYXZvaWQgcG9wdWxhdGluZyB0aGUgbW9kZWwgZm9yIENQIHF1ZXN0aW9uKQorCQlpZiAoIXRoaXMuZ2V0UHJvamVjdCgpLmV4aXN0cygpKXsKKwkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0cnkgeworCQkJU3RyaW5nIHNoYXJlZENsYXNzcGF0aCA9IGxvYWRDbGFzc3BhdGgoKTsKKwkJCWlmIChzaGFyZWRDbGFzc3BhdGggIT0gbnVsbCkgeworCQkJCWNsYXNzcGF0aCA9IHJlYWRQYXRocyhzaGFyZWRDbGFzc3BhdGgpOworCQkJfQorCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFICYmIHRoaXMuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKXsKKwkJCQlVdGlsLmxvZyhlLCAKKwkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyIvLmNsYXNzcGF0aCwgd2lsbCByZXZlcnQgdG8gZGVmYXVsdCBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpeworCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7CisJCQkJVXRpbC5sb2coZSwgCisJCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCisJCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQkvLyBleHRyYWN0IG91dCB0aGUgb3V0cHV0IGxvY2F0aW9uCisJCWlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjbGFzc3BhdGgubGVuZ3RoID4gMCkgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKKwkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoLmxlbmd0aCAtIDFdOworCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7CisJCQkJY2xhc3NwYXRoID0gY29weTsKKwkJCX0KKwkJfQorCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCXJldHVybiBjbGFzc3BhdGg7CisJCX0KKwkJcmV0dXJuIGRlZmF1bHRDbGFzc3BhdGgoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdCNnZXRSZXF1aXJlZFByb2plY3ROYW1lcworCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZFByb2plY3ROYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXJldHVybiB0aGlzLnByb2plY3RQcmVyZXF1aXNpdGVzKGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSZXNvbHZlZENsYXNzcGF0aChib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIAorCQkJdGhpcy5nZXRSZXNvbHZlZENsYXNzcGF0aCgKKwkJCQlpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUsIAorCQkJCWZhbHNlKTsgLy8gZ2VuZXJhdGVNYXJrZXJPbkVycm9yCisJfQorCisJLyoqCisJICogSW50ZXJuYWwgdmFyaWFudCB3aGljaCBjYW4gY3JlYXRlIG1hcmtlciBvbiBwcm9qZWN0IGZvciBpbnZhbGlkIGVudHJpZXMKKwkgKi8KKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoCisJCWJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZEVudHJ5LAorCQlib29sZWFuIGdlbmVyYXRlTWFya2VyT25FcnJvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBwcm9qZWN0SW5mbzsKKwkJaWYgKHRoaXMuaXNPcGVuKCkpeworCQkJcHJvamVjdEluZm8gPSBnZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCk7CisJCX0gZWxzZSB7CisJCQkvLyBhdm9pZCBwb3B1bGF0aW5nIHRoZSBtb2RlbCBmb3Igb25seSByZXRyaWV2aW5nIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggKDEzMzk1KQorCQkJcHJvamVjdEluZm8gPSBudWxsOworCQl9CisJCQorCQkvLyByZXVzZSBjYWNoZSBpZiBub3QgbmVlZGluZyB0byByZWZyZXNoIG1hcmtlcnMgb3IgY2hlY2tpbmcgYm91bmQgdmFyaWFibGVzCisJCWlmIChpZ25vcmVVbnJlc29sdmVkRW50cnkgJiYgIWdlbmVyYXRlTWFya2VyT25FcnJvciAmJiBwcm9qZWN0SW5mbyAhPSBudWxsKXsKKwkJCS8vIHJlc29sdmVkIHBhdGggaXMgY2FjaGVkIG9uIGl0cyBpbmZvCisJCQlJQ2xhc3NwYXRoRW50cnlbXSBpbmZvUGF0aCA9IHByb2plY3RJbmZvLmxhc3RSZXNvbHZlZENsYXNzcGF0aDsKKwkJCWlmIChpbmZvUGF0aCAhPSBudWxsKSByZXR1cm4gaW5mb1BhdGg7CisJCX0KKworCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZFBhdGggPSBnZXRSZXNvbHZlZENsYXNzcGF0aChnZXRSYXdDbGFzc3BhdGgoKSwgaWdub3JlVW5yZXNvbHZlZEVudHJ5LCBnZW5lcmF0ZU1hcmtlck9uRXJyb3IpOworCisJCWlmIChwcm9qZWN0SW5mbyAhPSBudWxsKXsKKwkJCXByb2plY3RJbmZvLmxhc3RSZXNvbHZlZENsYXNzcGF0aCA9IHJlc29sdmVkUGF0aDsKKwkJfQorCQlyZXR1cm4gcmVzb2x2ZWRQYXRoOworCX0KKwkKKwkvKioKKwkgKiBJbnRlcm5hbCB2YXJpYW50IHdoaWNoIGNhbiBwcm9jZXNzIGFueSBhcmJpdHJhcnkgY2xhc3NwYXRoCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKAorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzLAorCQlib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRFbnRyeSwKKwkJYm9vbGVhbiBnZW5lcmF0ZU1hcmtlck9uRXJyb3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IpeworCQkJZmx1c2hDbGFzc3BhdGhQcm9ibGVtTWFya2VycyhmYWxzZSwgZmFsc2UpOworCQl9CisKKwkJaW50IGxlbmd0aCA9IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOworCQlpbnQgaW5kZXggPSAwOworCQlBcnJheUxpc3QgcmVzb2x2ZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCisJCQlJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSBjbGFzc3BhdGhFbnRyaWVzW2ldOworCisJCQkvKiB2YWxpZGF0aW9uIGlmIG5lZWRlZCAqLworCQkJaWYgKGdlbmVyYXRlTWFya2VyT25FcnJvcikgeworCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0KKwkJCQkJSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkodGhpcywgcmF3RW50cnksIGZhbHNlKTsKKwkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCisJCQkJCWNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCisJCQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpLCAKKwkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IsCisJCQkJCQlmYWxzZSwKKwkJCQkJCWZhbHNlKTsKKwkJCX0KKworCQkJc3dpdGNoIChyYXdFbnRyeS5nZXRFbnRyeUtpbmQoKSl7CisJCQkJCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKKwkJCQkKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KHJhd0VudHJ5KTsKKwkJCQkJaWYgKHJlc29sdmVkRW50cnkgPT0gbnVsbCkgeworCQkJCQkJaWYgKCFpZ25vcmVVbnJlc29sdmVkRW50cnkpIHsKKwkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKAorCQkJCQkJCQluZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DUF9WQVJJQUJMRV9QQVRIX1VOQk9VTkQsCisJCQkJCQkJCQlyYXdFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKKwkJCQkJfQorCQkJCQlicmVhazsgCisKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKKwkJCQkKKwkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIocmF3RW50cnkuZ2V0UGF0aCgpLCB0aGlzKTsKKwkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKKwkJCQkJCS8vIHVuYm91bmQgY29udGFpbmVyCisJCQkJCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSkgeworCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oCisJCQkJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQsCisJCQkJCQkJCQlyYXdFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKKwkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXMgPT0gbnVsbCkgYnJlYWs7CisKKwkJCQkJLy8gY29udGFpbmVyIHdhcyBib3VuZAorCQkJCQlmb3IgKGludCBqID0gMCwgY29udGFpbmVyTGVuZ3RoID0gY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGogPCBjb250YWluZXJMZW5ndGg7IGorKyl7CisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyUmF3RW50cnkgPSBjb250YWluZXJFbnRyaWVzW2pdOworCQkJCQkJCisJCQkJCQlpZiAoZ2VuZXJhdGVNYXJrZXJPbkVycm9yKSB7CisJCQkJCQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPQorCQkJCQkJCQlKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGhFbnRyeSh0aGlzLCBjb250YWluZXJSYXdFbnRyeSwgZmFsc2UpOworCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKKwkJCQkJCQkJY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcigKKwkJCQkJCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCksIAorCQkJCQkJCQkJSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKKwkJCQkJCQkJCWZhbHNlLAorCQkJCQkJCQkJZmFsc2UpOworCQkJCQkJfQorCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChjb250YWluZXJSYXdFbnRyeSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJZGVmYXVsdCA6CisKKwkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyYXdFbnRyeSk7CisJCQkJCisJCQl9CQkJCQkKKwkJfQorCisJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkUGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVzb2x2ZWRFbnRyaWVzLnNpemUoKV07CisJCXJlc29sdmVkRW50cmllcy50b0FycmF5KHJlc29sdmVkUGF0aCk7CisKKwkJcmV0dXJuIHJlc29sdmVkUGF0aDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UHJvamVjdCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIElTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IGdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlKYXZhUHJvamVjdEVsZW1lbnRJbmZvIGluZm8gPSBnZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCk7CisJCWlmIChpbmZvLmdldFNlYXJjaGFibGVFbnZpcm9ubWVudCgpID09IG51bGwpIHsKKwkJCWluZm8uc2V0U2VhcmNoYWJsZUVudmlyb25tZW50KG5ldyBTZWFyY2hhYmxlRW52aXJvbm1lbnQodGhpcykpOworCQl9CisJCXJldHVybiBpbmZvLmdldFNlYXJjaGFibGVFbnZpcm9ubWVudCgpOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlIGEgc2hhcmVkIHByb3BlcnR5IG9uIGEgcHJvamVjdC4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkLCBhbnN3ZXJzIG51bGwuCisJICogTm90ZSB0aGF0IGl0IGlzIG9ydGhvZ29uYWwgdG8gSVJlc291cmNlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGNsaWVudCBjb2RlIGhhcyB0byBkZWNpZGUKKwkgKiB3aGljaCBmb3JtIG9mIHN0b3JhZ2UgdG8gdXNlIGFwcHJvcHJpYXRlbHkuIFNoYXJlZCBwcm9wZXJ0aWVzIHByb2R1Y2UgcmVhbCByZXNvdXJjZSBmaWxlcyB3aGljaAorCSAqIGNhbiBiZSBzaGFyZWQgdGhyb3VnaCBhIFZDTSBvbnRvIGEgc2VydmVyLiBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIG5vdCBzaGFyZWFibGUuCisJICoKKwkgKiBAc2VlIEphdmFQcm9qZWN0I3NldFNoYXJlZFByb3BlcnR5KFF1YWxpZmllZE5hbWUsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZFByb3BlcnR5KFF1YWxpZmllZE5hbWUga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKwkJU3RyaW5nIHByb3BlcnR5RmlsZU5hbWUgPSBjb21wdXRlU2hhcmVkUHJvcGVydHlGaWxlTmFtZShrZXkpOworCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlGaWxlTmFtZSk7CisJCWlmIChyc2NGaWxlLmV4aXN0cygpKSB7CisJCQlwcm9wZXJ0eSA9IG5ldyBTdHJpbmcoVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNCeXRlQXJyYXkocnNjRmlsZSkpOworCQl9CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIEphdmFFbGVtZW50CisJICovCisJcHVibGljIFNvdXJjZU1hcHBlciBnZXRTb3VyY2VNYXBwZXIoKSB7CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YUVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXJldHVybiBnZXRQcm9qZWN0KCk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNCdWlsZFN0YXRlKCkgeworCisJCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRMYXN0QnVpbHRTdGF0ZSh0aGlzLmdldFByb2plY3QoKSwgbnVsbCkgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKKwkJCisJCUhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgSGFzaFNldCgpOworCQl1cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhlbnRyaWVzLCBuZXcgQXJyYXlMaXN0KCksIGN5Y2xlUGFydGljaXBhbnRzLCBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOworCQlyZXR1cm4gIWN5Y2xlUGFydGljaXBhbnRzLmlzRW1wdHkoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzQ3ljbGVNYXJrZXIoKXsKKwkKKwkJdHJ5IHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgeworCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9PTkUpOworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtYXJrZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKKwkJCQkJU3RyaW5nIGN5Y2xlQXR0ciA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkNZQ0xFX0RFVEVDVEVEKTsKKwkJCQkJaWYgKGN5Y2xlQXR0ciAhPSBudWxsICYmIGN5Y2xlQXR0ci5lcXVhbHMoInRydWUiKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGZQcm9qZWN0Lmhhc2hDb2RlKCk7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0cnVlIGlmIHRoZSBwcm9qZWN0IHBvdGVudGlhbGx5IGNvbnRhaW5zIGFueSBzb3VyY2UuIEEgcHJvamVjdCB3aGljaCBoYXMgbm8gc291cmNlIGlzIGltbXV0YWJsZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNTb3VyY2UoKSB7CisKKwkJLy8gbG9vayBpZiBhbnkgc291cmNlIGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoCisJCS8vIG5vIG5lZWQgZm9yIHJlc29sdmVkIHBhdGggZ2l2ZW4gc291cmNlIGZvbGRlciBjYW5ub3QgYmUgYWJzdHJhY3RlZAorCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzOworCQl0cnkgeworCQkJZW50cmllcyA9IHRoaXMuZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gdHJ1ZTsgLy8gdW5zdXJlCisJCX0KKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIENvbXBhcmUgY3VycmVudCBjbGFzc3BhdGggd2l0aCBnaXZlbiBvbmUgdG8gc2VlIGlmIGFueSBkaWZmZXJlbnQuCisJICogTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBjbGFzc3BhdGggY29udGFpbnMgaXRzIGJpbmFyeSBvdXRwdXQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDbGFzc3BhdGhFcXVhbHNUbyhJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGgsIElQYXRoIG5ld091dHB1dExvY2F0aW9uLCBJQ2xhc3NwYXRoRW50cnlbXSBvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXQpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCWlmIChvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXQgIT0gbnVsbCAmJiBvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXQubGVuZ3RoID4gMCkgeworCisJCQlpbnQgbGVuZ3RoID0gb3RoZXJDbGFzc3BhdGhXaXRoT3V0cHV0Lmxlbmd0aDsKKwkJCWlmIChsZW5ndGggPT0gbmV3Q2xhc3NwYXRoLmxlbmd0aCArIDEpIHsKKwkJCQkvLyBvdXRwdXQgaXMgYW1vbmdzdCBmaWxlIGVudHJpZXMgKGxhc3Qgb25lKQorCisJCQkJLy8gY29tcGFyZSBjbGFzc3BhdGggZW50cmllcworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CisJCQkJCWlmICghb3RoZXJDbGFzc3BhdGhXaXRoT3V0cHV0W2ldLmVxdWFscyhuZXdDbGFzc3BhdGhbaV0pKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQkvLyBjb21wYXJlIGJpbmFyeSBvdXRwdXRzCisJCQkJaWYgKG90aGVyQ2xhc3NwYXRoV2l0aE91dHB1dFtsZW5ndGggLSAxXS5nZXRDb250ZW50S2luZCgpCisJCQkJCT09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUCisJCQkJCSYmIG90aGVyQ2xhc3NwYXRoV2l0aE91dHB1dFtsZW5ndGggLSAxXS5nZXRQYXRoKCkuZXF1YWxzKG5ld091dHB1dExvY2F0aW9uKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIGJvb2xlYW4gaXNPbkNsYXNzcGF0aChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlQYXRoIHJvb3RQYXRoOworCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKKwkJCXJvb3RQYXRoID0gKChJSmF2YVByb2plY3QpZWxlbWVudCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7CisJCX0gZWxzZSB7CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CisJCQlpZiAocm9vdCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcm9vdFBhdGggPSByb290LmdldFBhdGgoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5maW5kUGFja2FnZUZyYWdtZW50Um9vdDAocm9vdFBhdGgpICE9IG51bGw7CisJfQorCisJLyoqCisJICogbG9hZCB0aGUgY2xhc3NwYXRoIGZyb20gYSBzaGFyZWFibGUgZm9ybWF0IChWQ00td2lzZSkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvYWRDbGFzc3BhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJcmV0dXJuIGdldFNoYXJlZFByb3BlcnR5KGdldENsYXNzcGF0aFByb3BlcnR5TmFtZSgpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QjbmV3RXZhbHVhdGlvbkNvbnRleHQKKwkgKi8KKwlwdWJsaWMgSUV2YWx1YXRpb25Db250ZXh0IG5ld0V2YWx1YXRpb25Db250ZXh0KCkgeworCisJCXJldHVybiBuZXcgRXZhbHVhdGlvbkNvbnRleHRXcmFwcGVyKG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpLCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KAorCQlJUmVnaW9uIHJlZ2lvbiwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlpZiAocmVnaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJoaWVyYXJjaHkubnVsbFJlZ2lvbiIpKTsvLyROT04tTkxTLTEkCisJCX0KKwkJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcCA9CisJCQluZXcgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbihudWxsLCByZWdpb24sIHRoaXMsIHRydWUpOworCQlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCQlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeSgKKwkJSVR5cGUgdHlwZSwKKwkJSVJlZ2lvbiByZWdpb24sCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImhpZXJhcmNoeS5udWxsRm9jdXNUeXBlIikpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAocmVnaW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJoaWVyYXJjaHkubnVsbFJlZ2lvbiIpKTsvLyROT04tTkxTLTEkCisJCX0KKwkJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcCA9CisJCQluZXcgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbih0eXBlLCByZWdpb24sIHRoaXMsIHRydWUpOworCQlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCQlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7CisJfQorCisJLyoqCisJICogT3BlbiBwcm9qZWN0IGlmIHJlc291cmNlIGlzbid0IGNsb3NlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIG9wZW5XaGVuQ2xvc2VkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCWlmICghdGhpcy5mUHJvamVjdC5pc09wZW4oKSkgeworCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQl9IGVsc2UgeworCQkJc3VwZXIub3BlbldoZW5DbG9zZWQocG0pOworCQl9CisJfQorCisJcHVibGljIFN0cmluZ1tdIHByb2plY3RQcmVyZXF1aXNpdGVzKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJCisJCUFycmF5TGlzdCBwcmVyZXF1aXNpdGVzID0gbmV3IEFycmF5TGlzdCgpOworCQkvLyBuZWVkIHJlc29sdXRpb24KKwkJZW50cmllcyA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKGVudHJpZXMsIHRydWUsIGZhbHNlKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CisJCQkJcHJlcmVxdWlzaXRlcy5hZGQoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpOworCQkJfQorCQl9CisJCWludCBzaXplID0gcHJlcmVxdWlzaXRlcy5zaXplKCk7CisJCWlmIChzaXplID09IDApIHsKKwkJCXJldHVybiBOT19QUkVSRVFVSVNJVEVTOworCQl9IGVsc2UgeworCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzaXplXTsKKwkJCXByZXJlcXVpc2l0ZXMudG9BcnJheShyZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT5zIGZyb20gdGhlIGdpdmVuCisJICogY2xhc3NwYXRoIHN0cmluZyBpbiBYTUwgZm9ybWF0LgorCSAqCisJICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSByZWFkIAorCSAqLworCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnlbXSByZWFkUGF0aHMoU3RyaW5nIHhtbENsYXNzcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih4bWxDbGFzc3BhdGgpOworCQlFbGVtZW50IGNwRWxlbWVudDsKKworCQl0cnkgeworCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9CisJCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJY3BFbGVtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJcmVhZGVyLmNsb3NlKCk7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGZpbmFsbHkgeworCQkJcmVhZGVyLmNsb3NlKCk7CisJCX0KKworCQlpZiAoIWNwRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJTm9kZUxpc3QgbGlzdCA9IGNwRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCUFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOworCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKKwkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisJCQkJRWxlbWVudCBjcGVFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7CisKKwkJCQlpZiAoY3BlRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aGVudHJ5IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgY3BlRWxlbWVudEtpbmQgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgia2luZCIpOyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBwYXRoU3RyID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkvLyBlbnN1cmUgcGF0aCBpcyBhYnNvbHV0ZQorCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7CisJCQkJCWludCBraW5kID0ga2luZEZyb21TdHJpbmcoY3BlRWxlbWVudEtpbmQpOworCQkJCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgIXBhdGguaXNBYnNvbHV0ZSgpKSB7CisJCQkJCQlwYXRoID0gcHJvamVjdFBhdGguYXBwZW5kKHBhdGgpOworCQkJCQl9CisJCQkJCS8vIHNvdXJjZSBhdHRhY2htZW50IGluZm8gKG9wdGlvbmFsKQorCQkJCQlTdHJpbmcgc291cmNlQXR0YWNobWVudFBhdGhTdHIgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgic291cmNlcGF0aCIpOwkvLyROT04tTkxTLTEkCisJCQkJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoID0KKwkJCQkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoU3RyLmVxdWFscygiIikgPyBudWxsIDogbmV3IFBhdGgoc291cmNlQXR0YWNobWVudFBhdGhTdHIpOyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGhTdHIgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgicm9vdHBhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPQorCQkJCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoU3RyLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJCT8gbnVsbAorCQkJCQkJCTogbmV3IFBhdGgoc291cmNlQXR0YWNobWVudFJvb3RQYXRoU3RyKTsKKwkJCQkJCisJCQkJCS8vIGV4cG9ydGVkIGZsYWcKKwkJCQkJYm9vbGVhbiBpc0V4cG9ydGVkID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoImV4cG9ydGVkIikuZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCQkJCS8vIHJlY3JlYXRlIHRoZSBDUCBlbnRyeQorCQkJCQlzd2l0Y2ggKGtpbmQpIHsKKwkJCQorCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOworCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJCQorCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgorCQkJCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOworCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCisJCQkJCQkJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJCQkJCQkJc291cmNlQXR0YWNobWVudFBhdGgsCisJCQkJCQkJCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCisJCQkJCQkJCQkJCQkJCQlpc0V4cG9ydGVkKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSByZXR1cm4gbnVsbDsKKwkJCQkJCQkvLyBtdXN0IGJlIGFuIGVudHJ5IGluIHRoaXMgcHJvamVjdCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdAorCQkJCQkJCVN0cmluZyBwcm9qU2VnbWVudCA9IHBhdGguc2VnbWVudCgwKTsKKwkJCQkJCQlpZiAocHJvalNlZ21lbnQgIT0gbnVsbCAmJiBwcm9qU2VnbWVudC5lcXVhbHMoZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJCQkJLy8gdGhpcyBwcm9qZWN0CisJCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoKSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0CisJCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCkpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQorCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKKwkJCQkJCQlwYXRocy5hZGQoSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeSgKKwkJCQkJCQkJCXBhdGgsCisJCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJCQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgCisJCQkJCQkJCQlpc0V4cG9ydGVkKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKKwkJCQkJCQlwYXRocy5hZGQoSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoCisJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJaXNFeHBvcnRlZCkpOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUIDoKKwkJCQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSByZXR1cm4gbnVsbDsKKwkJCQkJCQlwYXRocy5hZGQobmV3IENsYXNzcGF0aEVudHJ5KAorCQkJCQkJCQkJQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQsCisJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksCisJCQkJCQkJCQlwYXRoLAorCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCW51bGwsCisJCQkJCQkJCQlmYWxzZSkpOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwYXRocy5zaXplKCkgPiAwKSB7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBpcHMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3BhdGhzLnNpemUoKV07CisJCQlwYXRocy50b0FycmF5KGlwcyk7CisJCQlyZXR1cm4gaXBzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBidWlsZGVyIGZyb20gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21CdWlsZFNwZWMoU3RyaW5nIGJ1aWxkZXJJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7CisJCQlpZiAoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkgeworCQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoIC0gMV07CisJCQkJU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIGkpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoY29tbWFuZHMsIGkgKyAxLCBuZXdDb21tYW5kcywgaSwgY29tbWFuZHMubGVuZ3RoIC0gaSAtIDEpOworCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7CisJCQkJZ2V0UHJvamVjdCgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBwcm9qZWN0OworCQorCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXJzIGFuIElEIHdoaWNoIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggcHJvamVjdC9lbnRyaWVzIGR1cmluZyBwYWNrYWdlCisJICogZnJhZ21lbnQgcm9vdCBjb21wdXRhdGlvbnMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHJvb3RJRCgpeworCQlyZXR1cm4gIltQUkpdIit0aGlzLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qKgorCSAqIFNhdmVzIHRoZSBjbGFzc3BhdGggaW4gYSBzaGFyZWFibGUgZm9ybWF0IChWQ00td2lzZSkgaWYgbmVjZXNzYXJ5LgorCSAqICAoaS5lLiZuYnNwO3NlbWFudGljYWxseSBkaWZmZXJlbnQpLgorCSAqIFdpbGwgbmV2ZXIgd3JpdGUgYW4gaWRlbnRpY2FsIG9uZS4KKwkgKiAKKwkgKiBAcmV0dXJuIFJldHVybiB3aGV0aGVyIHRoZSAuY2xhc3NwYXRoIGZpbGUgd2FzIG1vZGlmaWVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHNhdmVDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoLCBJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJaWYgKCFnZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHJldHVybiBmYWxzZTsKKworCQlRdWFsaWZpZWROYW1lIGNsYXNzcGF0aFByb3AgPSBnZXRDbGFzc3BhdGhQcm9wZXJ0eU5hbWUoKTsKKworCQl0cnkgeworCQkJLy8gYXR0ZW1wdCB0byBwcm92ZSB0aGUgY2xhc3NwYXRoIGhhcyBub3QgY2hhbmdlCisJCQlTdHJpbmcgZmlsZUNsYXNzcGF0aFN0cmluZyA9IGdldFNoYXJlZFByb3BlcnR5KGNsYXNzcGF0aFByb3ApOworCQkJaWYgKGZpbGVDbGFzc3BhdGhTdHJpbmcgIT0gbnVsbCkgeworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGZpbGVFbnRyaWVzID0gcmVhZFBhdGhzKGZpbGVDbGFzc3BhdGhTdHJpbmcpOworCQkJCWlmIChpc0NsYXNzcGF0aEVxdWFsc1RvKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24sIGZpbGVFbnRyaWVzKSkgeworCQkJCQkvLyBubyBuZWVkIHRvIHNhdmUgaXQsIGl0IGlzIHRoZSBzYW1lCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisKKwkJLy8gYWN0dWFsIGZpbGUgc2F2aW5nCisJCXRyeSB7CisJCQlzZXRTaGFyZWRQcm9wZXJ0eSgKKwkJCQljbGFzc3BhdGhQcm9wLAorCQkJCWdldENsYXNzcGF0aEFzWE1MKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24pKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmEgY29tbWFuZCBpbiB0aGUgYnVpbGQgc3BlYyAocmVwbGFjZSBleGlzdGluZyBvbmUgaWYgcHJlc2VudCwKKwkgKiBhZGQgb25lIGZpcnN0IGlmIG5vbmUpLgorCSAqLworCXByaXZhdGUgdm9pZCBzZXRKYXZhQ29tbWFuZCgKKwkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwKKwkJSUNvbW1hbmQgbmV3Q29tbWFuZCkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlDb21tYW5kW10gb2xkQ29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKKwkJSUNvbW1hbmQgb2xkSmF2YUNvbW1hbmQgPSBnZXRKYXZhQ29tbWFuZChkZXNjcmlwdGlvbik7CisJCUlDb21tYW5kW10gbmV3Q29tbWFuZHM7CisKKwkJaWYgKG9sZEphdmFDb21tYW5kID09IG51bGwpIHsKKwkJCS8vIEFkZCBhIEphdmEgYnVpbGQgc3BlYyBiZWZvcmUgb3RoZXIgYnVpbGRlcnMgKDFGV0pLN0kpCisJCQluZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtvbGRDb21tYW5kcy5sZW5ndGggKyAxXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAxLCBvbGRDb21tYW5kcy5sZW5ndGgpOworCQkJbmV3Q29tbWFuZHNbMF0gPSBuZXdDb21tYW5kOworCQl9IGVsc2UgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG9sZENvbW1hbmRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKG9sZENvbW1hbmRzW2ldID09IG9sZEphdmFDb21tYW5kKSB7CisJCQkJCW9sZENvbW1hbmRzW2ldID0gbmV3Q29tbWFuZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbmV3Q29tbWFuZHMgPSBvbGRDb21tYW5kczsKKwkJfQorCisJCS8vIENvbW1pdCB0aGUgc3BlYyBjaGFuZ2UgaW50byB0aGUgcHJvamVjdAorCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOworCQlnZXRQcm9qZWN0KCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0CisJICovCisJcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oSVBhdGggb3V0cHV0TG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJwYXRoLm51bGxwYXRoIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKG91dHB1dExvY2F0aW9uLmVxdWFscyhnZXRPdXRwdXRMb2NhdGlvbigpKSkgeworCQkJcmV0dXJuOworCQl9CisJCXRoaXMuc2V0UmF3Q2xhc3NwYXRoKFNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZUNsYXNzcGF0aCwgb3V0cHV0TG9jYXRpb24sIG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHVuZGVybHlpbmcga2VybmVsIHByb2plY3Qgb2YgdGhpcyBKYXZhIHByb2plY3QsCisJICogYW5kIGZpbGxzIGluIGl0cyBwYXJlbnQgYW5kIG5hbWUuCisJICogQ2FsbGVkIGJ5IElQcm9qZWN0LmdldE5hdHVyZSgpLgorCSAqCisJICogQHNlZSBJUHJvamVjdE5hdHVyZSNzZXRQcm9qZWN0CisJICovCisJcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7CisKKwkJZlByb2plY3QgPSBwcm9qZWN0OworCQlmUGFyZW50ID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7CisJCWZOYW1lID0gcHJvamVjdC5nZXROYW1lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSYXdDbGFzc3BhdGgoCisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsCisJCUlQYXRoIG91dHB1dExvY2F0aW9uLAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCXNldFJhd0NsYXNzcGF0aCgKKwkJCWVudHJpZXMsIAorCQkJb3V0cHV0TG9jYXRpb24sIAorCQkJbW9uaXRvciwgCisJCQl0cnVlLCAvLyBjYW5DaGFuZ2VSZXNvdXJjZQorCQkJdHJ1ZSwgLy8gZm9yY2VTYXZlCisJCQlnZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgLy8gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlCisJCQl0cnVlLCAvLyBuZWVkQ3ljbGVDaGVjaworCQkJdHJ1ZSk7IC8vIG5lZWRWYWxpZGF0aW9uCisJfQorCisJcHVibGljIHZvaWQgc2V0UmF3Q2xhc3NwYXRoKAorCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzLAorCQlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAorCQlib29sZWFuIGNhbkNoYW5nZVJlc291cmNlLAorCQlib29sZWFuIGZvcmNlU2F2ZSwKKwkJSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRQYXRoLAorCQlib29sZWFuIG5lZWRDeWNsZUNoZWNrLAorCQlib29sZWFuIG5lZWRWYWxpZGF0aW9uKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPQorCQkJKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQl0cnkgeworCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3UGF0aCA9IG5ld0VudHJpZXM7CisJCQlpZiAobmV3UmF3UGF0aCA9PSBudWxsKSB7IC8vYXJlIHdlIGFscmVhZHkgd2l0aCB0aGUgZGVmYXVsdCBjbGFzc3BhdGgKKwkJCQluZXdSYXdQYXRoID0gZGVmYXVsdENsYXNzcGF0aCgpOworCQkJfQorCQkJU2V0Q2xhc3NwYXRoT3BlcmF0aW9uIG9wID0KKwkJCQluZXcgU2V0Q2xhc3NwYXRoT3BlcmF0aW9uKAorCQkJCQl0aGlzLCAKKwkJCQkJb2xkUmVzb2x2ZWRQYXRoLCAKKwkJCQkJbmV3UmF3UGF0aCwgCisJCQkJCW5ld091dHB1dExvY2F0aW9uLAorCQkJCQljYW5DaGFuZ2VSZXNvdXJjZSwgCisJCQkJCWZvcmNlU2F2ZSwKKwkJCQkJbmVlZEN5Y2xlQ2hlY2ssCisJCQkJCW5lZWRWYWxpZGF0aW9uKTsKKwkJCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CisJCQkKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCW1hbmFnZXIuZmx1c2goKTsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJhd0NsYXNzcGF0aCgKKwkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcywKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlzZXRSYXdDbGFzc3BhdGgoCisJCQllbnRyaWVzLCAKKwkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLCAKKwkJCW1vbml0b3IsIAorCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UKKwkJCXRydWUsIC8vIGZvcmNlU2F2ZQorCQkJZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSksIC8vIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZQorCQkJdHJ1ZSwgLy8gbmVlZEN5Y2xlQ2hlY2sKKwkJCXRydWUpOyAvLyBuZWVkVmFsaWRhdGlvbgorCX0KKworCS8qKgorCSAqIE5PVEU6IDxjb2RlPm51bGw8L2NvZGU+IHNwZWNpZmllcyBkZWZhdWx0IGNsYXNzcGF0aCwgYW5kIGFuIGVtcHR5CisJICogYXJyYXkgc3BlY2lmaWVzIGFuIGVtcHR5IGNsYXNzcGF0aC4KKwkgKgorCSAqIEBleGNlcHRpb24gTm90UHJlc2VudEV4Y2VwdGlvbiBpZiB0aGlzIHByb2plY3QgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF3Q2xhc3NwYXRoMChJQ2xhc3NwYXRoRW50cnlbXSByYXdFbnRyaWVzKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQkvLyBpZiBub3Qgb3Blbiwgd2lsbCBjYXVzZSBvcGVuaW5nIHdpdGggZGVmYXVsdCBwYXRoCisJCUphdmFQcm9qZWN0RWxlbWVudEluZm8gaW5mbyA9IGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKTsKKwkKKwkJc3luY2hyb25pemVkIChpbmZvKSB7CisJCQlpZiAocmF3RW50cmllcyA9PSBudWxsKSB7CisJCQkJcmF3RW50cmllcyA9IGRlZmF1bHRDbGFzc3BhdGgoKTsKKwkJCX0KKwkJCS8vIGNsZWFyIGNhY2hlIG9mIHJlc29sdmVkIGNsYXNzcGF0aAorCQkJaW5mby5sYXN0UmVzb2x2ZWRDbGFzc3BhdGggPSBudWxsOworCQkJCisJCQlpbmZvLnNldFJhd0NsYXNzcGF0aChyYXdFbnRyaWVzKTsKKwkJCQkKKwkJCS8vIGNvbXB1dGUgdGhlIG5ldyByb290cworCQkJdXBkYXRlUGFja2FnZUZyYWdtZW50Um9vdHMoKTsJCQkJCisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWNvcmQgYSBzaGFyZWQgcGVyc2lzdGVudCBwcm9wZXJ0eSBvbnRvIGEgcHJvamVjdC4KKwkgKiBOb3RlIHRoYXQgaXQgaXMgb3J0aG9nb25hbCB0byBJUmVzb3VyY2UgcGVyc2lzdGVudCBwcm9wZXJ0aWVzLCBhbmQgY2xpZW50IGNvZGUgaGFzIHRvIGRlY2lkZQorCSAqIHdoaWNoIGZvcm0gb2Ygc3RvcmFnZSB0byB1c2UgYXBwcm9wcmlhdGVseS4gU2hhcmVkIHByb3BlcnRpZXMgcHJvZHVjZSByZWFsIHJlc291cmNlIGZpbGVzIHdoaWNoCisJICogY2FuIGJlIHNoYXJlZCB0aHJvdWdoIGEgVkNNIG9udG8gYSBzZXJ2ZXIuIFBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgbm90IHNoYXJlYWJsZS4KKwkgKiAKKwkgKiBzaGFyZWQgcHJvcGVydGllcyBlbmQgdXAgaW4gcmVzb3VyY2UgZmlsZXMsIGFuZCB0aHVzIGNhbm5vdCBiZSBtb2RpZmllZCBkdXJpbmcKKwkgKiBkZWx0YSBub3RpZmljYXRpb25zIChhIENvcmVFeGNlcHRpb24gd291bGQgdGhlbiBiZSB0aHJvd24pLgorCSAqIAorCSAqIEBzZWUgSmF2YVByb2plY3QjZ2V0U2hhcmVkUHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXkpCisJICovCisJcHVibGljIHZvaWQgc2V0U2hhcmVkUHJvcGVydHkoUXVhbGlmaWVkTmFtZSBrZXksIFN0cmluZyB2YWx1ZSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBjb21wdXRlU2hhcmVkUHJvcGVydHlGaWxlTmFtZShrZXkpOworCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvcGVydHlOYW1lKTsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUuZ2V0Qnl0ZXMoKSk7CisJCS8vIHVwZGF0ZSB0aGUgcmVzb3VyY2UgY29udGVudAorCQlpZiAocnNjRmlsZS5leGlzdHMoKSkgeworCQkJcnNjRmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXJzY0ZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCBJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQl9CisJfQorCisJLyoqCisJICogVXBkYXRlIGN5Y2xlIG1hcmtlcnMgZm9yIGFsbCBqYXZhIHByb2plY3RzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUFsbEN5Y2xlTWFya2VycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbWFuYWdlci5nZXRKYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdHMoKTsKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisKKwkJSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cyA9IG5ldyBIYXNoU2V0KCk7CisJCUFycmF5TGlzdCB2aXNpdGVkID0gbmV3IEFycmF5TGlzdCgpOworCQlpbnQgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpcHJvamVjdHNbaV07CisJCQlpZiAoIWN5Y2xlUGFydGljaXBhbnRzLmNvbnRhaW5zKHByb2plY3QpKXsKKwkJCQl2aXNpdGVkLmNsZWFyKCk7CisJCQkJcHJvamVjdC51cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhudWxsLCB2aXNpdGVkLCBjeWNsZVBhcnRpY2lwYW50cywgd29ya3NwYWNlUm9vdCk7CisJCQl9CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpcHJvamVjdHNbaV07CisJCQkKKwkJCWlmIChjeWNsZVBhcnRpY2lwYW50cy5jb250YWlucyhwcm9qZWN0KSl7CisJCQkJaWYgKCFwcm9qZWN0Lmhhc0N5Y2xlTWFya2VyKCkpeworCQkJCQlwcm9qZWN0LmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCisJCQkJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5jeWNsZSIpLCAvLyROT04tTkxTLTEkCisJCQkJCQlJTWFya2VyLlNFVkVSSVRZX0VSUk9SLAorCQkJCQkJdHJ1ZSwKKwkJCQkJCWZhbHNlKTsgCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcm9qZWN0LmZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnModHJ1ZSwgZmFsc2UpOworCQkJfQkJCQorCQl9CisJfQorCQorCS8qKgorCSAqIElmIGEgY3ljbGUgaXMgZGV0ZWN0ZWQsIHRoZW4gY3ljbGVQYXJ0aWNpcGFudHMgY29udGFpbnMgYWxsIHRoZSBwcm9qZWN0IGludm9sdmVkIGluIHRoaXMgY3ljbGUgKGRpcmVjdGx5KSwKKwkgKiBubyBjeWNsZSBpZiB0aGUgc2V0IGlzIGVtcHR5IChhbmQgc3RhcnRlZCBlbXB0eSkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhJQ2xhc3NwYXRoRW50cnlbXSBwcmVmZXJyZWRDbGFzc3BhdGgsIEFycmF5TGlzdCB2aXNpdGVkLCBIYXNoU2V0IGN5Y2xlUGFydGljaXBhbnRzLCBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290KXsKKworCQlpbnQgaW5kZXggPSB2aXNpdGVkLmluZGV4T2YodGhpcyk7CisJCWlmIChpbmRleCA+PSAwKXsKKwkJCS8vIG9ubHkgY29uc2lkZXIgZGlyZWN0IHBhcnRpY2lwYW50cyBpbnNpZGUgdGhlIGN5Y2xlCisJCQlmb3IgKGludCBpID0gaW5kZXgsIHNpemUgPSB2aXNpdGVkLnNpemUoKTsgaSA8IHNpemU7IGkrKyl7CisJCQkJY3ljbGVQYXJ0aWNpcGFudHMuYWRkKHZpc2l0ZWQuZ2V0KGkpKTsgCisJCQl9CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQl2aXNpdGVkLmFkZCh0aGlzKTsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKKwkJCWlmIChwcmVmZXJyZWRDbGFzc3BhdGggPT0gbnVsbCkgeworCQkJCWNsYXNzcGF0aCA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQljbGFzc3BhdGggPSBwcmVmZXJyZWRDbGFzc3BhdGg7CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJCQorCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpeworCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKKwkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7CisJCQkJCXByb2plY3QudXBkYXRlQ3ljbGVQYXJ0aWNpcGFudHMobnVsbCwgdmlzaXRlZCwgY3ljbGVQYXJ0aWNpcGFudHMsIHdvcmtzcGFjZVJvb3QpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCX0KKwkJdmlzaXRlZC5yZW1vdmUodGhpcyk7CisJfQorCQorCS8qKgorCSAqIFJlc2V0IHRoZSBjb2xsZWN0aW9uIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgKGxvY2FsIG9uZXMpIC0gb25seSBpZiBvcGVuZWQuCisJICogTmVlZCB0byBjaGVjayAqYWxsKiBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGluIG9yZGVyIHRvIHJlc2V0IE5hbWVMb29rdXAKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVQYWNrYWdlRnJhZ21lbnRSb290cygpeworCQkKKwkJCWlmICh0aGlzLmlzT3BlbigpKSB7CisJCQkJdHJ5IHsKKwkJCQkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBpbmZvID0gZ2V0SmF2YVByb2plY3RFbGVtZW50SW5mbygpOworCisJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJCQlOYW1lTG9va3VwIGxvb2t1cCA9IGluZm8uZ2V0TmFtZUxvb2t1cCgpOworCQkJCQlpZiAobG9va3VwICE9IG51bGwpeworCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBvbGRSb290cyA9IGxvb2t1cC5mUGFja2FnZUZyYWdtZW50Um9vdHM7CisJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG5ld1Jvb3RzID0gY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aCwgdHJ1ZSk7CisJCQkJCQljaGVja0lkZW50aWNhbDogeyAvLyBjb21wYXJlIGFsbCBwa2cgZnJhZ21lbnQgcm9vdCBsaXN0cworCQkJCQkJCWlmIChvbGRSb290cy5sZW5ndGggPT0gbmV3Um9vdHMubGVuZ3RoKXsKKwkJCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9sZFJvb3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCQkJCQkJCWlmICghb2xkUm9vdHNbaV0uZXF1YWxzKG5ld1Jvb3RzW2ldKSl7CisJCQkJCQkJCQkJYnJlYWsgY2hlY2tJZGVudGljYWw7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJcmV0dXJuOyAvLyBubyBuZWVkIHRvIHVwZGF0ZQorCQkJCQkJCX0JCisJCQkJCQl9CisJCQkJCQlpbmZvLnNldE5hbWVMb29rdXAobnVsbCk7IC8vIGRpc2NhcmQgbmFtZSBsb29rdXAgKGhvbGQgb250byByb290cykKKwkJCQkJfQkJCQkKKwkJCQkJaW5mby5zZXROb25KYXZhUmVzb3VyY2VzKG51bGwpOworCQkJCQlpbmZvLnNldENoaWxkcmVuKAorCQkJCQkJY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aCwgZmFsc2UpKTsJCQorCisJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCQkJCXRyeSB7CisJCQkJCQljbG9zZSgpOyAvLyBjb3VsZCBub3QgZG8gYmV0dGVyCisJCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4KXsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3RFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3RFbGVtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmU5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdEVsZW1lbnRJbmZvLmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKiAKKyAqIEluZm8gZm9yIElKYXZhUHJvamVjdC4KKyAqIDxwPgorICogTm90ZTogPGNvZGU+Z2V0Q2hpbGRyZW4oKTwvY29kZT4gcmV0dXJucyBhbGwgb2YgdGhlIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290czwvY29kZT4KKyAqIHNwZWNpZmllZCBvbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdC4gIFRoaXMgY2FuIGluY2x1ZGUgcm9vdHMgZXh0ZXJuYWwgdG8gdGhlCisgKiBwcm9qZWN0LiBTZWUgPGNvZGU+SmF2YVByb2plY3QjZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTwvY29kZT4gYW5kIAorICogPGNvZGU+SmF2YVByb2plY3QjZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTwvY29kZT4uICBUbyBnZXQgb25seSB0aGUgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3RzPC9jb2RlPgorICogdGhhdCBhcmUgaW50ZXJuYWwgdG8gdGhlIHByb2plY3QsIHVzZSA8Y29kZT5KYXZhUHJvamVjdCNnZXRDaGlsZHJlbigpPC9jb2RlPi4KKyAqLworCisvKiBwYWNrYWdlICovCitjbGFzcyBKYXZhUHJvamVjdEVsZW1lbnRJbmZvIGV4dGVuZHMgT3BlbmFibGVFbGVtZW50SW5mbyB7CisKKwkvKioKKwkgKiBUaGUgY2xhc3NwYXRoIGZvciB0aGlzIHByb2plY3QKKwkgKi8KKwlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gZkNsYXNzcGF0aDsKKworCS8qKgorCSAqIFRoZSBuYW1lIGxvb2t1cCBmYWNpbGl0eSB0byB1c2Ugd2l0aCB0aGlzIHByb2plY3QuCisJICovCisJcHJvdGVjdGVkIE5hbWVMb29rdXAgZk5hbWVMb29rdXAgPSBudWxsOworCisJLyoqCisJICogVGhlIHNlYXJjaGFibGUgYnVpbGRlciBlbnZpcm9ubWVudCBmYWNpbGl0eSB1c2VkCisJICogd2l0aCB0aGlzIHByb2plY3QgKGRvdWJsZXMgYXMgdGhlIGJ1aWxkZXIgZW52aXJvbm1lbnQpLiAKKwkgKi8KKwlwcm90ZWN0ZWQgU2VhcmNoYWJsZUVudmlyb25tZW50IGZTZWFyY2hhYmxlRW52aXJvbm1lbnQgPSBudWxsOworCisJLyoqCisJICogVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgdGhpcyBwcm9qZWN0LgorCSAqLworCXByb3RlY3RlZCBJUGF0aCBmT3V0cHV0TG9jYXRpb24gPSBudWxsOworCisJLyoqCisJICogQSBhcnJheSB3aXRoIGFsbCB0aGUgbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBieSB0aGlzIFBhY2thZ2VGcmFnbWVudAorCSAqLworCXByaXZhdGUgT2JqZWN0W10gZk5vbkphdmFSZXNvdXJjZXM7CisKKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gbGFzdFJlc29sdmVkQ2xhc3NwYXRoID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKKwkgKi8KKwlwdWJsaWMgSmF2YVByb2plY3RFbGVtZW50SW5mbygpIHsKKwkJZk5vbkphdmFSZXNvdXJjZXMgPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBDb21wdXRlIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgamF2YSBwcm9qZWN0LgorCSAqLworCXByaXZhdGUgT2JqZWN0W10gY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCkgeworCQkKKwkJLy8gZGV0ZXJtaW5lIGlmIHNyYyA9PSBwcm9qZWN0IGFuZC9vciBpZiBiaW4gPT0gcHJvamVjdAorCQlJUGF0aCBwcm9qZWN0UGF0aCA9IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7CisJCWJvb2xlYW4gc3JjSXNQcm9qZWN0ID0gZmFsc2U7CisJCWJvb2xlYW4gYmluSXNQcm9qZWN0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKKwkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CisJCQkJaWYgKHByb2plY3RQYXRoLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7CisJCQkJCXNyY0lzUHJvamVjdCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJpbklzUHJvamVjdCA9IHByb2plY3RQYXRoLmVxdWFscyhwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKworCQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVs1XTsKKwkJaW50IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyID0gMDsKKwkJdHJ5IHsKKwkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSAoKElDb250YWluZXIpIHByb2plY3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLm1lbWJlcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07CisJCQkJc3dpdGNoIChyZXMuZ2V0VHlwZSgpKSB7CisJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBmaWxlIG1pZ2h0IGJlIGEgamFyIG9yIGEgemlwIGluc2lkZSB0aGUgYnVpbGQgcGF0aAorCQkJCQkJSVBhdGggcmVzRnVsbFBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJCWlmIChwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChyZXNGdWxsUGF0aCkgPT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyByZXNOYW1lID0gcmVzLmdldE5hbWUoKTsKKwkJCQkJCQkvLyBpZ25vcmUgLmphdmEgZmlsZSBpZiBzcmMgPT0gcHJvamVjdAorCQkJCQkJCWlmIChzcmNJc1Byb2plY3QgJiYgVXRpbC5pc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShyZXNOYW1lKSkgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJLy8gaWdub3JlIC5jbGFzcyBmaWxlIGlmIGJpbiA9PSBwcm9qZWN0CisJCQkJCQkJaWYgKGJpbklzUHJvamVjdCAmJiBVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKHJlc05hbWUpKSB7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQkvLyBlbHNlIGFkZCBub24gamF2YSByZXNvdXJjZQorCQkJCQkJCWlmIChub25KYXZhUmVzb3VyY2VzLmxlbmd0aCA9PSBub25KYXZhUmVzb3VyY2VzQ291bnRlcikgeworCQkJCQkJCQkvLyByZXNpemUKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCW5vbkphdmFSZXNvdXJjZXMsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyICogMl0pLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCQkJCQl9CisJCQkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IHJlczsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQkJcmVzRnVsbFBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJCWlmICghcmVzRnVsbFBhdGguZXF1YWxzKHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSkKKwkJCQkJCQkmJiBwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChyZXNGdWxsUGF0aCkgPT0gbnVsbAorCQkJCQkJCSYmIHByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudDAocmVzRnVsbFBhdGgpID09IG51bGwpIHsKKwkJCQkJCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggPT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKKwkJCQkJCQkJLy8gcmVzaXplCisJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCShub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CisJCQkJCQkJfQorCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSByZXM7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoICE9IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJbm9uSmF2YVJlc291cmNlcywKKwkJCQkJMCwKKwkJCQkJKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyXSksCisJCQkJCTAsCisJCQkJCW5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlub25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOworCQkJbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgPSAwOworCQl9CisJCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXByb3RlY3RlZCBOYW1lTG9va3VwIGdldE5hbWVMb29rdXAoKSB7CisKKwkJcmV0dXJuIGZOYW1lTG9va3VwOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgorCSAqLworCU9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCkgeworCisJCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBmTm9uSmF2YVJlc291cmNlczsKKwkJaWYgKG5vbkphdmFSZXNvdXJjZXMgPT0gbnVsbCkgeworCQkJbm9uSmF2YVJlc291cmNlcyA9IGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKHByb2plY3QpOworCQkJZk5vbkphdmFSZXNvdXJjZXMgPSBub25KYXZhUmVzb3VyY2VzOworCQl9CisJCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElKYXZhUHJvamVjdAorCSAqLworCXByb3RlY3RlZCBJUGF0aCBnZXRPdXRwdXRMb2NhdGlvbigpIHsKKworCQlyZXR1cm4gZk91dHB1dExvY2F0aW9uOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdAorCSAqLworCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSYXdDbGFzc3BhdGgoKSB7CisKKwkJcmV0dXJuIGZDbGFzc3BhdGg7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSUphdmFQcm9qZWN0IAorCSAqLworCXByb3RlY3RlZCBTZWFyY2hhYmxlRW52aXJvbm1lbnQgZ2V0U2VhcmNoYWJsZUVudmlyb25tZW50KCkgeworCisJCXJldHVybiBmU2VhcmNoYWJsZUVudmlyb25tZW50OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lTG9va3VwKE5hbWVMb29rdXAgbmV3TmFtZUxvb2t1cCkgeworCisJCWZOYW1lTG9va3VwID0gbmV3TmFtZUxvb2t1cDsKKworCQkvLyBSZWluaXRpYWxpemUgdGhlIHNlYXJjaGFibGUgbmFtZSBlbnZpcm9ubWVudCBzaW5jZSBpdCBjYWNoZXMKKwkJLy8gdGhlIG5hbWUgbG9va3VwLgorCQlmU2VhcmNoYWJsZUVudmlyb25tZW50ID0gbnVsbDsKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSBmTm9uSmF2YVJlc291cmNlcyB0byByZXMgdmFsdWUKKwkgKi8KKwlzeW5jaHJvbml6ZWQgdm9pZCBzZXROb25KYXZhUmVzb3VyY2VzKE9iamVjdFtdIHJlc291cmNlcykgeworCisJCWZOb25KYXZhUmVzb3VyY2VzID0gcmVzb3VyY2VzOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbikgeworCisJCWZPdXRwdXRMb2NhdGlvbiA9IG5ld091dHB1dExvY2F0aW9uOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdAorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCkgeworCisJCXRoaXMuZkNsYXNzcGF0aCA9IG5ld0NsYXNzcGF0aDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U2VhcmNoYWJsZUVudmlyb25tZW50KFNlYXJjaGFibGVFbnZpcm9ubWVudCBuZXdTZWFyY2hhYmxlRW52aXJvbm1lbnQpIHsKKworCQlmU2VhcmNoYWJsZUVudmlyb25tZW50ID0gbmV3U2VhcmNoYWJsZUVudmlyb25tZW50OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9MUlVDYWNoZUVudW1lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0xSVUNhY2hlRW51bWVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTBkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9MUlVDYWNoZUVudW1lcmF0b3IuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKglUaGUgPGNvZGU+TFJVQ2FjaGVFbnVtZXJhdG9yPC9jb2RlPiByZXR1cm5zIGl0cyBlbGVtZW50cyBpbiAKKyAqCXRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgPGNvZGU+TFJVQ2FjaGU8L2NvZGU+LCB3aXRoIHRoZQorICoJbW9zdCByZWNlbnQgZWxlbWVudHMgZmlyc3QuCisgKgorICoJT25jZSB0aGUgZW51bWVyYXRvciBpcyBjcmVhdGVkLCBlbGVtZW50cyB3aGljaCBhcmUgbGF0ZXIgYWRkZWQgCisgKgl0byB0aGUgY2FjaGUgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgZW51bWVyYXRvci4gIEhvd2V2ZXIsCisgKgllbGVtZW50cyByZXR1cm5lZCBmcm9tIHRoZSBlbnVtZXJhdG9yIGNvdWxkIGhhdmUgYmVlbiBjbG9zZWQgCisgKglieSB0aGUgY2FjaGUuCisgKi8KK3B1YmxpYyBjbGFzcyBMUlVDYWNoZUVudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisJLyoqCisJICoJQ3VycmVudCBlbGVtZW50OworCSAqLworCXByb3RlY3RlZCBMUlVFbnVtZXJhdG9yRWxlbWVudCBmRWxlbWVudFF1ZXVlOworCisJcHVibGljIHN0YXRpYyBjbGFzcyBMUlVFbnVtZXJhdG9yRWxlbWVudCB7CisJCS8qKgorCQkgKglWYWx1ZSByZXR1cm5lZCBieSA8Y29kZT5uZXh0RWxlbWVudCgpPC9jb2RlPjsKKwkJICovCisJCXB1YmxpYyBPYmplY3QgZlZhbHVlOworCQkKKwkJLyoqCisJCSAqCU5leHQgZWxlbWVudAorCQkgKi8KKwkJcHVibGljIExSVUVudW1lcmF0b3JFbGVtZW50IGZOZXh0OworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIExSVUVudW1lcmF0b3JFbGVtZW50KE9iamVjdCB2YWx1ZSkgeworCQkJZlZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisvKioKKyAqCUNyZWF0ZXMgYSBDYWNoZUVudW1lcmF0b3Igb24gdGhlIGxpc3Qgb2YgPGNvZGU+TFJVRW51bWVyYXRvckVsZW1lbnRzPC9jb2RlPi4KKyAqLworcHVibGljIExSVUNhY2hlRW51bWVyYXRvcihMUlVFbnVtZXJhdG9yRWxlbWVudCBmaXJzdEVsZW1lbnQpIHsKKwlmRWxlbWVudFF1ZXVlID0gZmlyc3RFbGVtZW50OworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgbW9yZSBlbGVtZW50cyBleGlzdC4KKyAqLworcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworCXJldHVybiBmRWxlbWVudFF1ZXVlICE9IG51bGw7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudC4KKyAqLworcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwlPYmplY3QgdGVtcCA9IGZFbGVtZW50UXVldWUuZlZhbHVlOworCWZFbGVtZW50UXVldWUgPSBmRWxlbWVudFF1ZXVlLmZOZXh0OworCXJldHVybiB0ZW1wOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjYwZDQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKKworLyoqCisgKiBAc2VlIElNZW1iZXIKKyAqLworCisvKiBwYWNrYWdlICovIGFic3RyYWN0IGNsYXNzIE1lbWJlciBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJTWVtYmVyIHsKK3Byb3RlY3RlZCBNZW1iZXIoaW50IHR5cGUsIElKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIodHlwZSwgcGFyZW50LCBuYW1lKTsKK30KK3Byb3RlY3RlZCBib29sZWFuIGFyZVNpbWlsYXJNZXRob2RzKAorCVN0cmluZyBuYW1lMSwgU3RyaW5nW10gcGFyYW1zMSwgCisJU3RyaW5nIG5hbWUyLCBTdHJpbmdbXSBwYXJhbXMyLAorCVN0cmluZ1tdIHNpbXBsZU5hbWVzMSkgeworCQkKKwlpZiAobmFtZTEuZXF1YWxzKG5hbWUyKSkgeworCQlpbnQgcGFyYW1zMUxlbmd0aCA9IHBhcmFtczEubGVuZ3RoOworCQlpZiAocGFyYW1zMUxlbmd0aCA9PSBwYXJhbXMyLmxlbmd0aCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMxTGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgc2ltcGxlTmFtZTEgPSAKKwkJCQkJc2ltcGxlTmFtZXMxID09IG51bGwgPyAKKwkJCQkJCVNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbXMxW2ldKSkgOgorCQkJCQkJc2ltcGxlTmFtZXMxW2ldOworCQkJCVN0cmluZyBzaW1wbGVOYW1lMiA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbXMyW2ldKSk7CisJCQkJaWYgKCFzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIENvbnZlcnRzIGEgZmllbGQgY29uc3RhbnQgZnJvbSB0aGUgY29tcGlsZXIncyByZXByZXNlbnRhdGlvbgorICogdG8gdGhlIEphdmEgTW9kZWwgY29uc3RhbnQgcmVwcmVzZW50YXRpb24gKE51bWJlciBvciBTdHJpbmcpLgorICovCitwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjb252ZXJ0Q29uc3RhbnQoQ29uc3RhbnQgY29uc3RhbnQpIHsKKwlpZiAoY29uc3RhbnQgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJaWYgKGNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJc3dpdGNoIChjb25zdGFudC50eXBlSUQoKSkgeworCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKKwkJCXJldHVybiBjb25zdGFudC5ib29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCWNhc2UgVHlwZUlkcy5UX2J5dGUgOgorCQkJcmV0dXJuIG5ldyBCeXRlKGNvbnN0YW50LmJ5dGVWYWx1ZSgpKTsKKwkJY2FzZSBUeXBlSWRzLlRfY2hhciA6CisJCQlyZXR1cm4gbmV3IENoYXJhY3Rlcihjb25zdGFudC5jaGFyVmFsdWUoKSk7CisJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQlyZXR1cm4gbmV3IERvdWJsZShjb25zdGFudC5kb3VibGVWYWx1ZSgpKTsKKwkJY2FzZSBUeXBlSWRzLlRfZmxvYXQgOgorCQkJcmV0dXJuIG5ldyBGbG9hdChjb25zdGFudC5mbG9hdFZhbHVlKCkpOworCQljYXNlIFR5cGVJZHMuVF9pbnQgOgorCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNvbnN0YW50LmludFZhbHVlKCkpOworCQljYXNlIFR5cGVJZHMuVF9sb25nIDoKKwkJCXJldHVybiBuZXcgTG9uZyhjb25zdGFudC5sb25nVmFsdWUoKSk7CisJCWNhc2UgVHlwZUlkcy5UX251bGwgOgorCQkJcmV0dXJuIG51bGw7CisJCWNhc2UgVHlwZUlkcy5UX3Nob3J0IDoKKwkJCXJldHVybiBuZXcgU2hvcnQoY29uc3RhbnQuc2hvcnRWYWx1ZSgpKTsKKwkJY2FzZSBUeXBlSWRzLlRfU3RyaW5nIDoKKwkJCXJldHVybiBjb25zdGFudC5zdHJpbmdWYWx1ZSgpOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNlcXVhbHNET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIGdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG5vZGUuZ2V0TmFtZSgpKTsKK30KKy8qCisgKiBIZWxwZXIgbWV0aG9kIGZvciBTb3VyY2VUeXBlLmZpbmRNZXRob2RzIGFuZCBCaW5hcnlUeXBlLmZpbmRNZXRob2RzCisgKi8KK3Byb3RlY3RlZCBJTWV0aG9kW10gZmluZE1ldGhvZHMoSU1ldGhvZCBtZXRob2QsIElNZXRob2RbXSBtZXRob2RzKSB7CisJU3RyaW5nIGVsZW1lbnROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7CisJU3RyaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworCWludCBwYXJhbUxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOworCVN0cmluZ1tdIHNpbXBsZU5hbWVzID0gbmV3IFN0cmluZ1twYXJhbUxlbmd0aF07CisJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CisJCXNpbXBsZU5hbWVzW2ldID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUoU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlcnNbaV0pKTsKKwl9CisJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJbmV4dDogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSU1ldGhvZCBleGlzdGluZ01ldGhvZCA9IG1ldGhvZHNbaV07CisJCWlmICh0aGlzLmFyZVNpbWlsYXJNZXRob2RzKAorCQkJCWVsZW1lbnROYW1lLAorCQkJCXBhcmFtZXRlcnMsCisJCQkJZXhpc3RpbmdNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSwKKwkJCQlleGlzdGluZ01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLAorCQkJCXNpbXBsZU5hbWVzKSkgeworCQkJbGlzdC5hZGQoZXhpc3RpbmdNZXRob2QpOworCQl9CisJfQorCWludCBzaXplID0gbGlzdC5zaXplKCk7CisJaWYgKHNpemUgPT0gMCkgeworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCQlJTWV0aG9kW10gcmVzdWx0ID0gbmV3IElNZXRob2Rbc2l6ZV07CisJCWxpc3QudG9BcnJheShyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBJQ2xhc3NGaWxlIGdldENsYXNzRmlsZSgpIHsKKwlyZXR1cm4gKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0Q2xhc3NGaWxlKCk7Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgSVR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKKwlKYXZhRWxlbWVudCBwYXJlbnQgPSAoSmF2YUVsZW1lbnQpZ2V0UGFyZW50KCk7CisJaWYgKHBhcmVudC5mTEVUeXBlID09IFRZUEUpIHsKKwkJcmV0dXJuIChJVHlwZSkgcGFyZW50OworCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlNZW1iZXJFbGVtZW50SW5mbyBpbmZvID0gKE1lbWJlckVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCXJldHVybiBpbmZvLmdldE1vZGlmaWVycygpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCXJldHVybiBKYXZhRWxlbWVudC5KRU1fVFlQRTsKK30KKy8qKgorICogQHNlZSBJTWVtYmVyCisgKi8KK3B1YmxpYyBJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJTWVtYmVyRWxlbWVudEluZm8gaW5mbz0gKE1lbWJlckVsZW1lbnRJbmZvKWdldFJhd0luZm8oKTsKKwlyZXR1cm4gbmV3IFNvdXJjZVJhbmdlKGluZm8uZ2V0TmFtZVNvdXJjZVN0YXJ0KCksIGluZm8uZ2V0TmFtZVNvdXJjZUVuZCgpIC0gaW5mby5nZXROYW1lU291cmNlU3RhcnQoKSArIDEpOworfQorLyoqCisgKiBAc2VlIElNZW1iZXIKKyAqLworcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKSB7CisJcmV0dXJuIGZhbHNlOworfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNNYWluTWV0aG9kKElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoIm1haW4iLmVxdWFscyhtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkgJiYgU2lnbmF0dXJlLlNJR19WT0lELmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgeyAvLyROT04tTkxTLTEkCisJCWludCBmbGFncz0gbWV0aG9kLmdldEZsYWdzKCk7CisJCWlmIChGbGFncy5pc1N0YXRpYyhmbGFncykgJiYgRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpKSB7CisJCQlTdHJpbmdbXSBwYXJhbVR5cGVzPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwkJCWlmIChwYXJhbVR5cGVzLmxlbmd0aCA9PSAxKSB7CisJCQkJU3RyaW5nIG5hbWU9ICBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1UeXBlc1swXSk7CisJCQkJcmV0dXJuICJTdHJpbmdbXSIuZXF1YWxzKFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKG5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwlyZXR1cm4gZ2V0Q2xhc3NGaWxlKCkgIT0gbnVsbDsKK30KKy8qKgorICogQ2hhbmdlcyB0aGUgc291cmNlIGluZGV4ZXMgb2YgdGhpcyBlbGVtZW50LiAgVXBkYXRlcyB0aGUgbmFtZSByYW5nZSBhcyB3ZWxsLgorICovCitwdWJsaWMgdm9pZCBvZmZzZXRTb3VyY2VSYW5nZShpbnQgYW1vdW50KSB7CisJc3VwZXIub2Zmc2V0U291cmNlUmFuZ2UoYW1vdW50KTsKKwl0cnkgeworCQlNZW1iZXJFbGVtZW50SW5mbyBpbmZvID0gKE1lbWJlckVsZW1lbnRJbmZvKSBnZXRSYXdJbmZvKCk7CisJCWluZm8uc2V0TmFtZVNvdXJjZVN0YXJ0KGluZm8uZ2V0TmFtZVNvdXJjZVN0YXJ0KCkgKyBhbW91bnQpOworCQlpbmZvLnNldE5hbWVTb3VyY2VFbmQoaW5mby5nZXROYW1lU291cmNlRW5kKCkgKyBhbW91bnQpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KKy8qKgorICovCitwdWJsaWMgU3RyaW5nIHJlYWRhYmxlTmFtZSgpIHsKKworCUlKYXZhRWxlbWVudCBkZWNsYXJpbmdUeXBlID0gZ2V0RGVjbGFyaW5nVHlwZSgpOworCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKKwkJU3RyaW5nIGRlY2xhcmluZ05hbWUgPSAoKEphdmFFbGVtZW50KSBnZXREZWNsYXJpbmdUeXBlKCkpLnJlYWRhYmxlTmFtZSgpOworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihkZWNsYXJpbmdOYW1lKTsKKwkJYnVmZmVyLmFwcGVuZCgnLicpOworCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3VwZXIucmVhZGFibGVOYW1lKCk7CisJfQorfQorLyoqCisgKiBVcGRhdGVzIHRoZSBzb3VyY2UgcG9zaXRpb25zIGZvciB0aGlzIGVsZW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VFbmRPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKKwlzdXBlci50cmlnZ2VyU291cmNlRW5kT2Zmc2V0KGFtb3VudCwgbmFtZVN0YXJ0LCBuYW1lRW5kKTsKKwl1cGRhdGVOYW1lUmFuZ2UobmFtZVN0YXJ0LCBuYW1lRW5kKTsKK30KKy8qKgorICogVXBkYXRlcyB0aGUgc291cmNlIHBvc2l0aW9ucyBmb3IgdGhpcyBlbGVtZW50LgorICovCitwdWJsaWMgdm9pZCB0cmlnZ2VyU291cmNlUmFuZ2VPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKKwlzdXBlci50cmlnZ2VyU291cmNlUmFuZ2VPZmZzZXQoYW1vdW50LCBuYW1lU3RhcnQsIG5hbWVFbmQpOworCXVwZGF0ZU5hbWVSYW5nZShuYW1lU3RhcnQsIG5hbWVFbmQpOworfQorLyoqCisgKiBVcGRhdGVzIHRoZSBuYW1lIHJhbmdlIGZvciB0aGlzIGVsZW1lbnQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVSYW5nZShpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgeworCXRyeSB7CisJCU1lbWJlckVsZW1lbnRJbmZvIGluZm8gPSAoTWVtYmVyRWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKKwkJaW5mby5zZXROYW1lU291cmNlU3RhcnQobmFtZVN0YXJ0KTsKKwkJaW5mby5zZXROYW1lU291cmNlRW5kKG5hbWVFbmQpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01lbWJlckVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJFbGVtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTcyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJFbGVtZW50SW5mby5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCisvKiogCisgKkVsZW1lbnQgaW5mbyBmb3IgSU1lbWJlciBlbGVtZW50cy4gCisgKi8KKy8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgY2xhc3MgTWVtYmVyRWxlbWVudEluZm8gZXh0ZW5kcyBTb3VyY2VSZWZFbGVtZW50SW5mbyB7CisJLyoqCisJICogVGhlIG1vZGlmaWVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZW1iZXIuCisJICoKKwkgKiBAc2VlIElDb25zdGFudHMKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZsYWdzOworCisJLyoqCisJICogVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoaXMgbWVtYmVyJ3MgbmFtZSBpbiB0aGUgaXRzCisJICogb3BlbmFibGUncyBidWZmZXIuCisJICovCisJcHJvdGVjdGVkIGludCBuYW1lU3RhcnQ9IC0xOworCisJLyoqCisJICogVGhlIGxhc3QgcG9zaXRpb24gb2YgdGhpcyBtZW1iZXIncyBuYW1lIGluIHRoZSBpdHMKKwkgKiBvcGVuYWJsZSdzIGJ1ZmZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG5hbWVFbmQ9IC0xOworCisJLyoqCisJICogVGhpcyBtZW1iZXIncyBuYW1lCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSBuYW1lOworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JR2VuZXJpY1R5cGUjZ2V0TW9kaWZpZXJzKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNNZXRob2QjZ2V0TW9kaWZpZXJzKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNGaWVsZCNnZXRNb2RpZmllcnMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gdGhpcy5mbGFnczsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlI2dldE5hbWVTb3VyY2VFbmQoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldE5hbWVTb3VyY2VFbmQoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQjZ2V0TmFtZVNvdXJjZUVuZCgpCisJICovCisJcHVibGljIGludCBnZXROYW1lU291cmNlRW5kKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lRW5kOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGUjZ2V0TmFtZVNvdXJjZVN0YXJ0KCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZU1ldGhvZCNnZXROYW1lU291cmNlU3RhcnQoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQjZ2V0TmFtZVNvdXJjZVN0YXJ0KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE5hbWVTb3VyY2VTdGFydCgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZVN0YXJ0OworCX0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKKwkJdGhpcy5mbGFncyA9IGZsYWdzOworCX0KKwkvKioKKwkgKiBTZXRzIHRoaXMgbWVtYmVyJ3MgbmFtZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoY2hhcltdIG5hbWUpIHsKKwkJdGhpcy5uYW1lPSBuYW1lOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoaXMgbWVtYmVyJ3MgbmFtZSwgcmVsYXRpdmUKKwkgKiB0byBpdHMgb3BlbmFibGUncyBzb3VyY2UgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldE5hbWVTb3VyY2VFbmQoaW50IGVuZCkgeworCQl0aGlzLm5hbWVFbmQ9IGVuZDsKKwl9CisJLyoqCisJICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhpcyBtZW1iZXIncyBuYW1lLCByZWxhdGl2ZQorCSAqIHRvIGl0cyBvcGVuYWJsZSdzIHNvdXJjZSBidWZmZXIuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZVNvdXJjZVN0YXJ0KGludCBzdGFydCkgeworCQl0aGlzLm5hbWVTdGFydD0gc3RhcnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW9kZWxVcGRhdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb2RlbFVwZGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNjOGZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW9kZWxVcGRhdGVyLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSA8Y29kZT5KYXZhTW9kZWxNYW5hZ2VyPC9jb2RlPiB0byB1cGRhdGUgdGhlIEphdmFNb2RlbAorICogYmFzZWQgb24gc29tZSA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT5zLgorICovCitwdWJsaWMgY2xhc3MgTW9kZWxVcGRhdGVyIHsKKworCUhhc2hTZXQgcHJvamVjdHNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0KCk7CisKKwkvKioKKwkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCBoYW5kbGUgdG8gaXRzIHBhcmVudCdzIGNhY2hlIG9mIGNoaWxkcmVuLiAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BhcmVudEluZm8oT3BlbmFibGUgY2hpbGQpIHsKKworCQlPcGVuYWJsZSBwYXJlbnQgPSAoT3BlbmFibGUpIGNoaWxkLmdldFBhcmVudCgpOworCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzT3BlbigpKSB7CisJCQl0cnkgeworCQkJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQkJaW5mby5hZGRDaGlsZChjaGlsZCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIGRvIG5vdGhpbmcgLSB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgb3BlbgorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ2xvc2VzIHRoZSBnaXZlbiBlbGVtZW50LCB3aGljaCByZW1vdmVzIGl0IGZyb20gdGhlIGNhY2hlIG9mIG9wZW4gZWxlbWVudHMuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsb3NlKE9wZW5hYmxlIGVsZW1lbnQpIHsKKworCQl0cnkgeworCQkJZWxlbWVudC5jbG9zZSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJfQorCisJLyoqCisJICogUHJvY2Vzc2luZyBmb3IgYW4gZWxlbWVudCB0aGF0IGhhcyBiZWVuIGFkZGVkOjx1bD4KKwkgKiA8bGk+SWYgdGhlIGVsZW1lbnQgaXMgYSBwcm9qZWN0LCBkbyBub3RoaW5nLCBhbmQgZG8gbm90IHByb2Nlc3MKKwkgKiBjaGlsZHJlbiwgYXMgd2hlbiBhIHByb2plY3QgaXMgY3JlYXRlZCBpdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbnkKKwkgKiBuYXR1cmVzIC0gc3BlY2lmaWNhbGx5IGEgamF2YSBuYXR1cmUuCisJICogPGxpPklmIHRoZSBlbGVtZXQgaXMgbm90IGEgcHJvamVjdCwgcHJvY2VzcyBpdCBhcyBhZGRlZCAoc2VlCisJICogPGNvZGU+YmFzaWNFbGVtZW50QWRkZWQ8L2NvZGU+LgorCSAqIDwvdWw+CisJICovCisJcHJvdGVjdGVkIHZvaWQgZWxlbWVudEFkZGVkKE9wZW5hYmxlIGVsZW1lbnQpIHsKKworCQlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7CisJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7CisJCQkvLyBwcm9qZWN0IGFkZCBpcyBoYW5kbGVkIGJ5IEphdmFQcm9qZWN0LmNvbmZpZ3VyZSgpIGJlY2F1c2UKKwkJCS8vIHdoZW4gYSBwcm9qZWN0IGlzIGNyZWF0ZWQsIGl0IGRvZXMgbm90IHlldCBoYXZlIGEgamF2YSBuYXR1cmUKKwkJCWFkZFRvUGFyZW50SW5mbyhlbGVtZW50KTsKKwkJCXRoaXMucHJvamVjdHNUb1VwZGF0ZS5hZGQoZWxlbWVudCk7CisJCX0gZWxzZSB7CisJCQlhZGRUb1BhcmVudEluZm8oZWxlbWVudCk7CisKKwkJCS8vIEZvcmNlIHRoZSBlbGVtZW50IHRvIGJlIGNsb3NlZCBhcyBpdCBtaWdodCBoYXZlIGJlZW4gb3BlbmVkIAorCQkJLy8gYmVmb3JlIHRoZSByZXNvdXJjZSBtb2RpZmljYXRpb24gY2FtZSBpbiBhbmQgaXQgbWlnaHQgaGF2ZSBhIG5ldyBjaGlsZAorCQkJLy8gRm9yIGV4YW1wbGUsIGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZToKKwkJCS8vIDEuIGNyZWF0ZSBhIHBhY2thZ2UgZnJhZ21lbnQgcCB1c2luZyBhIGphdmEgbW9kZWwgb3BlcmF0aW9uCisJCQkvLyAyLiBvcGVuIHBhY2thZ2UgcAorCQkJLy8gMy4gYWRkIGZpbGUgWC5qYXZhIGluIGZvbGRlciBwCisJCQkvLyBXaGVuIHRoZSByZXNvdXJjZSBkZWx0YSBjb21lcyBpbiwgb25seSB0aGUgYWRkaXRpb24gb2YgcCBpcyBub3RpZmllZCwgCisJCQkvLyBidXQgdGhlIHBhY2thZ2UgcCBpcyBhbHJlYWR5IG9wZW5lZCwgdGh1cyBpdHMgY2hpbGRyZW4gYXJlIG5vdCByZWNvbXB1dGVkCisJCQkvLyBhbmQgaXQgYXBwZWFycyBlbXB0eS4KKwkJCWNsb3NlKGVsZW1lbnQpOworCQl9CisKKwkJc3dpdGNoIChlbGVtZW50VHlwZSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKKwkJCQkvLyB3aGVuIGEgcm9vdCBpcyBhZGRlZCwgYW5kIGlzIG9uIHRoZSBjbGFzc3BhdGgsIHRoZSBwcm9qZWN0IG11c3QgYmUgdXBkYXRlZAorCQkJCXRoaXMucHJvamVjdHNUb1VwZGF0ZS5hZGQoZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJCS8vIGdldCByaWQgb2YgbmFtZWxvb2t1cCBzaW5jZSBpdCBob2xkcyBvbnRvIG9ic29sZXRlIGNhY2hlZCBpbmZvIAorCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQl0cnkgeworCQkJCQlwcm9qZWN0LmdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKS5zZXROYW1lTG9va3VwKG51bGwpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoqCisJICogR2VuZXJpYyBwcm9jZXNzaW5nIGZvciBlbGVtZW50cyB3aXRoIGNoYW5nZWQgY29udGVudHM6PHVsPgorCSAqIDxsaT5UaGUgZWxlbWVudCBpcyBjbG9zZWQgc3VjaCB0aGF0IGFueSBzdWJzZXF1ZW50IGFjY2Vzc2VzIHdpbGwgcmUtb3BlbgorCSAqIHRoZSBlbGVtZW50IHJlZmxlY3RpbmcgaXRzIG5ldyBzdHJ1Y3R1cmUuCisJICogPC91bD4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50Q2hhbmdlZChPcGVuYWJsZSBlbGVtZW50KSB7CisKKwkJY2xvc2UoZWxlbWVudCk7CisJfQorCisJLyoqCisJICogR2VuZXJpYyBwcm9jZXNzaW5nIGZvciBhIHJlbW92ZWQgZWxlbWVudDo8dWw+CisJICogPGxpPkNsb3NlIHRoZSBlbGVtZW50LCByZW1vdmluZyBpdHMgc3RydWN0dXJlIGZyb20gdGhlIGNhY2hlCisJICogPGxpPlJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIGl0cyBwYXJlbnQncyBjYWNoZSBvZiBjaGlsZHJlbgorCSAqIDxsaT5BZGQgYSBSRU1PVkVEIGVudHJ5IGluIHRoZSBkZWx0YQorCSAqIDwvdWw+CisJICovCisJcHJvdGVjdGVkIHZvaWQgZWxlbWVudFJlbW92ZWQoT3BlbmFibGUgZWxlbWVudCkgeworCisJCWlmIChlbGVtZW50LmlzT3BlbigpKSB7CisJCQljbG9zZShlbGVtZW50KTsKKwkJfQorCQlyZW1vdmVGcm9tUGFyZW50SW5mbyhlbGVtZW50KTsKKwkJaW50IGVsZW1lbnRUeXBlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpOworCisJCXN3aXRjaCAoZWxlbWVudFR5cGUpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgorCQkJCWVsZW1lbnQuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLnJlc2V0KCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgorCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZVBlclByb2plY3RJbmZvKAorCQkJCQkoSmF2YVByb2plY3QpIGVsZW1lbnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKKwkJCQl0aGlzLnByb2plY3RzVG9VcGRhdGUuYWRkKGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCQkvLzFHMVRXMlQgLSBnZXQgcmlkIG9mIG5hbWVsb29rdXAgc2luY2UgaXQgaG9sZHMgb250byBvYnNvbGV0ZSBjYWNoZWQgaW5mbyAKKwkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7CisJCQkJdHJ5IHsKKwkJCQkJcHJvamVjdC5nZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCkuc2V0TmFtZUxvb2t1cChudWxsKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgPGNvZGU+SVJlc291cmNlRGVsdGE8L2NvZGU+IHJvb3RlZCBpbiBhIDxjb2RlPldvcmtzcGFjZTwvY29kZT4gaW50bworCSAqIHRoZSBjb3JyZXNwb25kaW5nIHNldCBvZiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4sIHJvb3RlZCBpbiB0aGUKKwkgKiByZWxldmFudCA8Y29kZT5KYXZhTW9kZWw8L2NvZGU+cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisKKwkJaWYgKERlbHRhUHJvY2Vzc29yLlZFUkJPU0UpeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJVUERBVElORyBNb2RlbCB3aXRoIERlbHRhOiBbIitUaHJlYWQuY3VycmVudFRocmVhZCgpKyI6IiArIGRlbHRhICsgIl06Iik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQl9CisKKwkJdHJ5IHsKKwkJCXRoaXMudHJhdmVyc2VEZWx0YShkZWx0YSwgbnVsbCwgbnVsbCk7IC8vIHRyYXZlcnNlIGRlbHRhCisKKwkJCS8vIHVwZGF0ZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHByb2plY3RzIHRoYXQgd2VyZSBhZmZlY3RlZAorCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnByb2plY3RzVG9VcGRhdGUuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJcHJvamVjdC51cGRhdGVQYWNrYWdlRnJhZ21lbnRSb290cygpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJdGhpcy5wcm9qZWN0c1RvVXBkYXRlID0gbmV3IEhhc2hTZXQoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSBpdHMgcGFyZW50cyBjYWNoZSBvZiBjaGlsZHJlbi4gSWYgdGhlCisJICogZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LCBvciB0aGUgcGFyZW50IGlzIG5vdCBjdXJyZW50bHkgb3BlbiwKKwkgKiB0aGlzIGhhcyBubyBlZmZlY3QuIAorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21QYXJlbnRJbmZvKE9wZW5hYmxlIGNoaWxkKSB7CisKKwkJT3BlbmFibGUgcGFyZW50ID0gKE9wZW5hYmxlKSBjaGlsZC5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5pc09wZW4oKSkgeworCQkJdHJ5IHsKKwkJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IHBhcmVudC5nZXRFbGVtZW50SW5mbygpOworCQkJCWluZm8ucmVtb3ZlQ2hpbGQoY2hpbGQpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBkbyBub3RoaW5nIC0gd2UgYWxyZWFkeSBjaGVja2VkIGlmIG9wZW4KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGFuIDxjb2RlPklSZXNvdXJjZURlbHRhPC9jb2RlPiBhbmQgaXRzIGNoaWxkcmVuIGludG8KKwkgKiB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT5zLgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkZWx0YSBjb3JyZXNwb25kcyB0byBhIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCisJICogSWYgaXQgaXMgbm90IGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aCwgaXQgd2lsbCBiZSBhZGRlZCBhcyBhIG5vbi1qYXZhCisJICogcmVzb3VyY2UgYnkgdGhlIHNlbmRlciBvZiB0aGlzIG1ldGhvZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZURlbHRhKAorCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwKKwkJSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKworCQlib29sZWFuIHByb2Nlc3NDaGlsZHJlbiA9IHRydWU7CisKKwkJT3BlbmFibGUgZWxlbWVudCA9IChPcGVuYWJsZSkgZGVsdGEuZ2V0RWxlbWVudCgpOworCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKKwkJCQlwcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6CisJCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRSA6CisJCQkJcHJvY2Vzc0NoaWxkcmVuID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6CisJCQkJZWxlbWVudEFkZGVkKGVsZW1lbnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKKwkJCQllbGVtZW50UmVtb3ZlZChlbGVtZW50KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCA6CisJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSAhPSAwKXsKKwkJCQkJZWxlbWVudENoYW5nZWQoZWxlbWVudCk7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCWlmIChwcm9jZXNzQ2hpbGRyZW4pIHsKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA9IGNoaWxkcmVuW2ldOworCQkJCXRoaXMudHJhdmVyc2VEZWx0YShjaGlsZERlbHRhLCByb290LCBwcm9qZWN0KTsKKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTRjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKKworLyoqCisgKiBUaGlzIG9wZXJhdGlvbiBtb3ZlcyBlbGVtZW50cyBmcm9tIHRoZWlyIGN1cnJlbnQKKyAqIGNvbnRhaW5lciB0byBhIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBjb250YWluZXIsIG9wdGlvbmFsbHkgcmVuYW1pbmcgdGhlCisgKiBlbGVtZW50cy4KKyAqIEEgbW92ZSBvcGVyYXRpb24gaXMgZXF1aXZhbGVudCB0byBhIGNvcHkgb3BlcmF0aW9uLCB3aGVyZQorICogdGhlIHNvdXJjZSBlbGVtZW50cyBhcmUgZGVsZXRlZCBhZnRlciB0aGUgY29weS4KKyAqIDxwPlRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIGZvciByZW9yZ2FuaXppbmcgZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIGNvbnRhaW5lci4KKyAqCisgKiBAc2VlIENvcHlFbGVtZW50c09wZXJhdGlvbgorICovCitwdWJsaWMgY2xhc3MgTW92ZUVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgQ29weUVsZW1lbnRzT3BlcmF0aW9uIHsKKy8qKgorICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCBtb3ZlIHRoZSBnaXZlbiBlbGVtZW50cyB0byB0aGUgZ2l2ZW4gY29udGFpbmVycy4KKyAqLworcHVibGljIE1vdmVFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvTW92ZSwgSUphdmFFbGVtZW50W10gZGVzdENvbnRhaW5lcnMsIGJvb2xlYW4gZm9yY2UpIHsKKwlzdXBlcihlbGVtZW50c1RvTW92ZSwgZGVzdENvbnRhaW5lcnMsIGZvcmNlKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB1c2UgYXMgdGhlIG1haW4gdGFzayBuYW1lCisgKiBmb3IgcHJvZ3Jlc3MgbW9uaXRvcmluZy4KKyAqLworcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7CisJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLm1vdmVFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBAc2VlIENvcHlFbGVtZW50c09wZXJhdGlvbiNpc01vdmUoKQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc01vdmUoKSB7CisJcmV0dXJuIHRydWU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JlMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKKworLyoqCisgKiBUaGlzIG9wZXJhdGlvbiBtb3ZlcyByZXNvdXJjZXMgKHBhY2thZ2UgZnJhZ21lbnRzIGFuZCBjb21waWxhdGlvbiB1bml0cykgZnJvbSB0aGVpciBjdXJyZW50CisgKiBjb250YWluZXIgdG8gYSBzcGVjaWZpZWQgZGVzdGluYXRpb24gY29udGFpbmVyLCBvcHRpb25hbGx5IHJlbmFtaW5nIHRoZQorICogZWxlbWVudHMuCisgKiBBIG1vdmUgcmVzb3VyY2Ugb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYSBjb3B5IHJlc291cmNlIG9wZXJhdGlvbiwgd2hlcmUKKyAqIHRoZSBzb3VyY2UgcmVzb3VyY2VzIGFyZSBkZWxldGVkIGFmdGVyIHRoZSBjb3B5LgorICogPHA+VGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgZm9yIHJlb3JnYW5pemluZyByZXNvdXJjZXMgd2l0aGluIHRoZSBzYW1lIGNvbnRhaW5lci4KKyAqCisgKiBAc2VlIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBNb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbiBleHRlbmRzIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uIHsKKy8qKgorICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCBtb3ZlIHRoZSBnaXZlbiBlbGVtZW50cyB0byB0aGUgZ2l2ZW4gY29udGFpbmVycy4KKyAqLworcHVibGljIE1vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Nb3ZlLCBJSmF2YUVsZW1lbnRbXSBkZXN0Q29udGFpbmVycywgYm9vbGVhbiBmb3JjZSkgeworCXN1cGVyKGVsZW1lbnRzVG9Nb3ZlLCBkZXN0Q29udGFpbmVycywgZm9yY2UpOworfQorLyoqCisgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgeworCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5tb3ZlUmVzb3VyY2VQcm9ncmVzcyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIEBzZWUgQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24jaXNNb3ZlKCkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNNb3ZlKCkgeworCXJldHVybiB0cnVlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTXVsdGlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL011bHRpT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhNjQwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL011bHRpT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBtdWx0aXBsZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+LgorICogSXQgaXMgcmVzcG9uaWJsZSBmb3IgcnVubmluZyBlYWNoIG9wZXJhdGlvbiBpbiB0dXJuLCBjb2xsZWN0aW5nCisgKiB0aGUgZXJyb3JzIGFuZCBtZXJnaW5nIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+cy4KKyAqIDxwPgorICogSWYgc2V2ZXJhbCBlcnJvcnMgb2NjdXJlZCwgdGhleSBhcmUgY29sbGVjdGVkIGluIGEgbXVsdGktc3RhdHVzCisgKiA8Y29kZT5KYXZhTW9kZWxTdGF0dXM8L2NvZGU+LiBPdGhlcndpc2UsIGEgc2ltcGxlIDxjb2RlPkphdmFNb2RlbFN0YXR1czwvY29kZT4KKyAqIGlzIHRocm93bi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpT3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKKwkvKioKKwkgKiBUaGUgbGlzdCBvZiByZW5hbWluZ3Mgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBmUmVuYW1pbmdzTGlzdD0gbnVsbDsKKwkvKioKKwkgKiBUYWJsZSBzcGVjaWZ5aW5nIHRoZSBuZXcgcGFyZW50IGZvciBlbGVtZW50cyBiZWluZyAKKwkgKiBjb3BpZWQvbW92ZWQvcmVuYW1lZC4KKwkgKiBLZXllZCBieSBlbGVtZW50cyBiZWluZyBwcm9jZXNzZWQsIGFuZAorCSAqIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24gcGFyZW50LgorCSAqLworCXByb3RlY3RlZCBNYXAgZlBhcmVudEVsZW1lbnRzOworCS8qKgorCSAqIFRhYmxlIHNwZWNpZnlpbmcgaW5zZXJ0aW9uIHBvc2l0aW9ucyBmb3IgZWxlbWVudHMgYmVpbmcgCisJICogY29waWVkL21vdmVkL3JlbmFtZWQuIEtleWVkIGJ5IGVsZW1lbnRzIGJlaW5nIHByb2Nlc3NlZCwgYW5kCisJICogdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBpbnNlcnRpb24gcG9pbnQuCisJICogQHNlZSBwcm9jZXNzRWxlbWVudHMoSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGZJbnNlcnRCZWZvcmVFbGVtZW50cz0gbmV3IEhhc2hNYXAoMSk7CisJLyoqCisJICogVGhpcyB0YWJsZSBwcmVzZW50cyB0aGUgZGF0YSBpbiA8Y29kZT5mUmVuYW1pbmdMaXN0PC9jb2RlPiBpbiBhIG1vcmUKKwkgKiBjb252ZW5pZW50IHdheS4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGZSZW5hbWluZ3M7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TXVsdGlPcGVyYXRpb248L2NvZGU+LgorICovCitwcm90ZWN0ZWQgTXVsdGlPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIElKYXZhRWxlbWVudFtdIHBhcmVudEVsZW1lbnRzLCBib29sZWFuIGZvcmNlKSB7CisJc3VwZXIoZWxlbWVudHNUb1Byb2Nlc3MsIHBhcmVudEVsZW1lbnRzLCBmb3JjZSk7CisJZlBhcmVudEVsZW1lbnRzID0gbmV3IEhhc2hNYXAoZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKTsKKwlpZiAoZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IHBhcmVudEVsZW1lbnRzLmxlbmd0aCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsgaSsrKSB7CisJCQlmUGFyZW50RWxlbWVudHMucHV0KGVsZW1lbnRzVG9Qcm9jZXNzW2ldLCBwYXJlbnRFbGVtZW50c1tpXSk7CisJCX0KKwl9IGVsc2UgeyAvL3NhbWUgZGVzdGluYXRpb24gZm9yIGFsbCBlbGVtZW50cyB0byBiZSBtb3ZlZC9jb3BpZWQvcmVuYW1lZAorCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsgaSsrKSB7CisJCQlmUGFyZW50RWxlbWVudHMucHV0KGVsZW1lbnRzVG9Qcm9jZXNzW2ldLCBwYXJlbnRFbGVtZW50c1swXSk7CisJCX0KKwl9CisKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NdWx0aU9wZXJhdGlvbjwvY29kZT4gb24gPGNvZGU+ZWxlbWVudHNUb1Byb2Nlc3M8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgTXVsdGlPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIGJvb2xlYW4gZm9yY2UpIHsKKwlzdXBlcihlbGVtZW50c1RvUHJvY2VzcywgZm9yY2UpOworfQorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgPGNvZGU+SmF2YU1vZGVsRXhjZXB0aW9uPC9jb2RlPgorICogZW1iZW5kaW5nIGEgPGNvZGU+SmF2YU1vZGVsU3RhdHVzPC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIHZvaWQgZXJyb3IoaW50IGNvZGUsIElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoY29kZSwgZWxlbWVudCkpOworfQorLyoqCisgKiBFeGVjdXRlcyB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIG9uZSBvciBzZXZlcmFsIGVycm9ycyBvY2N1cmVkIGR1cmluZyB0aGUgb3BlcmF0aW9uLgorICogSWYgbXVsdGlwbGUgZXJyb3JzIG9jY3VyZWQsIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPkphdmFNb2RlbFN0YXR1czwvY29kZT4gaXMgYQorICogbXVsdGktc3RhdHVzLiBPdGhlcndpc2UsIGl0IGlzIGEgc2ltcGxlIG9uZS4KKyAqLworcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRyeSB7CisJCXByb2Nlc3NFbGVtZW50cygpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKKwkJdGhyb3cgam1lOworCX0gZmluYWxseSB7CisJCW1lcmdlRGVsdGFzKCk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgY29waWVkL21vdmVkL3JlbmFtZWQuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0RGVzdGluYXRpb25QYXJlbnQoSUphdmFFbGVtZW50IGNoaWxkKSB7CisJcmV0dXJuIChJSmF2YUVsZW1lbnQpZlBhcmVudEVsZW1lbnRzLmdldChjaGlsZCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIG5hbWUgdG8gYmUgdXNlZCBieSB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNYWluVGFza05hbWUoKTsKKy8qKgorICogUmV0dXJucyB0aGUgbmV3IG5hbWUgZm9yIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICogaWYgdGhlcmUgYXJlIG5vIHJlbmFtaW5ncyBzcGVjaWZpZWQuCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZUZvcihJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCWlmIChmUmVuYW1pbmdzICE9IG51bGwpCisJCXJldHVybiAoU3RyaW5nKSBmUmVuYW1pbmdzLmdldChlbGVtZW50KTsKKwllbHNlCisJCXJldHVybiBudWxsOworfQorLyoqCisgKiBTZXRzIHVwIHRoZSByZW5hbWluZ3MgaGFzaHRhYmxlIC0ga2V5cyBhcmUgdGhlIGVsZW1lbnRzIGFuZAorICogdmFsdWVzIGFyZSB0aGUgbmV3IG5hbWUuCisgKi8KK3ByaXZhdGUgdm9pZCBpbml0aWFsaXplUmVuYW1pbmdzKCkgeworCWlmIChmUmVuYW1pbmdzTGlzdCAhPSBudWxsICYmIGZSZW5hbWluZ3NMaXN0Lmxlbmd0aCA9PSBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKSB7CisJCWZSZW5hbWluZ3MgPSBuZXcgSGFzaE1hcChmUmVuYW1pbmdzTGlzdC5sZW5ndGgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZW5hbWluZ3NMaXN0Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZlJlbmFtaW5nc0xpc3RbaV0gIT0gbnVsbCkgeworCQkJCWZSZW5hbWluZ3MucHV0KGZFbGVtZW50c1RvUHJvY2Vzc1tpXSwgZlJlbmFtaW5nc0xpc3RbaV0pOworCQkJfQorCQl9CisJfQorfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uIHJlcHJlc2VudHMgYSBtb3ZlIG9yIHJlbmFtZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgKiBpZiB0aGlzIG9wZXJhdGlvbiByZXByZXNlbnRzIGEgY29weS48YnI+CisgKiBOb3RlOiBhIHJlbmFtZSBpcyBqdXN0IGEgbW92ZSB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IHdpdGggYSBuYW1lIGNoYW5nZS4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNNb3ZlKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbiByZXByZXNlbnRzIGEgcmVuYW1lLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIGlmIHRoaXMgb3BlcmF0aW9uIHJlcHJlc2VudHMgYSBjb3B5IG9yIG1vdmUuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzUmVuYW1lKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUHJvY2VzcyBhbGwgb2YgdGhlIGNoYW5nZWQgZGVsdGFzIGdlbmVyYXRlZCBieSB0aGVzZSBvcGVyYXRpb25zLgorICovCitwcm90ZWN0ZWQgdm9pZCBtZXJnZURlbHRhcygpIHsKKwlpZiAoZkRlbHRhcyAhPSBudWxsKSB7CisJCUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhID0gbmV3SmF2YUVsZW1lbnREZWx0YSgpOworCQlib29sZWFuIGluc2VydGVkVHJlZSA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZEZWx0YXMubGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gZkRlbHRhc1tpXTsKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7CisJCQkJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEgPSAoSmF2YUVsZW1lbnREZWx0YSkgY2hpbGRyZW5bal07CisJCQkJcm9vdERlbHRhLmluc2VydERlbHRhVHJlZShwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpLCBwcm9qZWN0RGVsdGEpOworCQkJCWluc2VydGVkVHJlZSA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYgKGluc2VydGVkVHJlZSkKKwkJCWZEZWx0YXMgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7cm9vdERlbHRhfTsKKwkJZWxzZQorCQkJZkRlbHRhcyA9IG51bGw7CisJfQorfQorLyoqCisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb2Nlc3MgYSBnaXZlbiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKy8qKgorICogUHJvY2Vzc2VzIGFsbCB0aGUgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPnMgaW4gdHVybiwgY29sbGVjdGluZyBlcnJvcnMKKyAqIGFuZCB1cGRhdGluZyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBvbmUgb3Igc2V2ZXJhbCBvcGVyYXRpb24ocykgd2FzIHVuYWJsZSB0bworICogYmUgY29tcGxldGVkLgorICovCitwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwliZWdpblRhc2soZ2V0TWFpblRhc2tOYW1lKCksIGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpOworCUlKYXZhTW9kZWxTdGF0dXNbXSBlcnJvcnMgPSBuZXcgSUphdmFNb2RlbFN0YXR1c1szXTsKKwlpbnQgZXJyb3JzQ291bnRlciA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpKyspIHsKKwkJdHJ5IHsKKwkJCXZlcmlmeShmRWxlbWVudHNUb1Byb2Nlc3NbaV0pOworCQkJcHJvY2Vzc0VsZW1lbnQoZkVsZW1lbnRzVG9Qcm9jZXNzW2ldKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQkJaWYgKGVycm9yc0NvdW50ZXIgPT0gZXJyb3JzLmxlbmd0aCkgeworCQkJCS8vIHJlc2l6ZQorCQkJCVN5c3RlbS5hcnJheWNvcHkoZXJyb3JzLCAwLCAoZXJyb3JzID0gbmV3IElKYXZhTW9kZWxTdGF0dXNbZXJyb3JzQ291bnRlcioyXSksIDAsIGVycm9yc0NvdW50ZXIpOworCQkJfQorCQkJZXJyb3JzW2Vycm9yc0NvdW50ZXIrK10gPSBqbWUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CisJCX0gZmluYWxseSB7CisJCQl3b3JrZWQoMSk7CisJCX0KKwl9CisJZG9uZSgpOworCWlmIChlcnJvcnNDb3VudGVyID09IDEpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlcnJvcnNbMF0pOworCX0gZWxzZSBpZiAoZXJyb3JzQ291bnRlciA+IDEpIHsKKwkJaWYgKGVycm9yc0NvdW50ZXIgIT0gZXJyb3JzLmxlbmd0aCkgeworCQkJLy8gcmVzaXplCisJCQlTeXN0ZW0uYXJyYXljb3B5KGVycm9ycywgMCwgKGVycm9ycyA9IG5ldyBJSmF2YU1vZGVsU3RhdHVzW2Vycm9yc0NvdW50ZXJdKSwgMCwgZXJyb3JzQ291bnRlcik7CisJCX0KKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihKYXZhTW9kZWxTdGF0dXMubmV3TXVsdGlTdGF0dXMoZXJyb3JzKSk7CisJfQorfQorLyoqCisgKiBTZXRzIHRoZSBpbnNlcnRpb24gcG9zaXRpb24gaW4gdGhlIG5ldyBjb250YWluZXIgZm9yIHRoZSBtb2RpZmllZCBlbGVtZW50LiBUaGUgZWxlbWVudAorICogYmVpbmcgbW9kaWZpZWQgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBuZXcgc2libGluZy4gVGhlIGdpdmVuIHNpYmxpbmcKKyAqIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIHNwZWNpZmllZCBmb3IgdGhlIG1vZGlmaWVkIGVsZW1lbnQuCisgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnQgaXMgdG8gYmUKKyAqIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lci4KKyAqLworcHVibGljIHZvaWQgc2V0SW5zZXJ0QmVmb3JlKElKYXZhRWxlbWVudCBtb2RpZmllZEVsZW1lbnQsIElKYXZhRWxlbWVudCBuZXdTaWJsaW5nKSB7CisJZkluc2VydEJlZm9yZUVsZW1lbnRzLnB1dChtb2RpZmllZEVsZW1lbnQsIG5ld1NpYmxpbmcpOworfQorLyoqCisgKiBTZXRzIHRoZSBuZXcgbmFtZXMgdG8gdXNlIGZvciBlYWNoIGVsZW1lbnQgYmVpbmcgY29waWVkLiBUaGUgcmVuYW1pbmdzCisgKiBjb3JyZXNwb25kIHRvIHRoZSBlbGVtZW50cyBiZWluZyBwcm9jZXNzZWQsIGFuZCB0aGUgbnVtYmVyIG9mCisgKiByZW5hbWluZ3MgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGJlaW5nIHByb2Nlc3NlZC4KKyAqIEEgPGNvZGU+bnVsbDwvY29kZT4gZW50cnkgaW4gdGhlIGxpc3QgaW5kaWNhdGVzIHRoYXQgYW4gZWxlbWVudAorICogaXMgbm90IHRvIGJlIHJlbmFtZWQuCisgKgorICogPHA+Tm90ZSB0aGF0IHNvbWUgcmVuYW1pbmdzIG1heSBub3QgYmUgdXNlZC4gIElmIGJvdGggYSBwYXJlbnQKKyAqIGFuZCBhIGNoaWxkIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgY29weS9tb3ZlLCBvbmx5IHRoZSBwYXJlbnQKKyAqIGlzIGNoYW5nZWQuICBUaGVyZWZvcmUsIGlmIGEgbmV3IG5hbWUgaXMgc3BlY2lmaWVkIGZvciB0aGUgY2hpbGQsCisgKiB0aGUgY2hpbGQncyBuYW1lIHdpbGwgbm90IGJlIGNoYW5nZWQuCisgKi8KK3B1YmxpYyB2b2lkIHNldFJlbmFtaW5ncyhTdHJpbmdbXSByZW5hbWluZ3MpIHsKKwlmUmVuYW1pbmdzTGlzdCA9IHJlbmFtaW5nczsKKwlpbml0aWFsaXplUmVuYW1pbmdzKCk7Cit9CisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGJlZm9yZQorICogPGNvZGU+cHJvY2Vzc0VsZW1lbnQ8L2NvZGU+LiBJdCBzaG91bGQgY2hlY2sgdGhhdCB0aGlzIDxjb2RlPmVsZW1lbnQ8L2NvZGU+CisgKiBjYW4gYmUgcHJvY2Vzc2VkLgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2ZXJpZnkoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBzcGVjaWZpZWQgZm9yIHRoZSA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyB2YWxpZCBmb3IgdGhlIHR5cGVzIG9mIHRoZQorICogPGNvZGU+ZWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RGVzdGluYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGRlc3RpbmF0aW9uID09IG51bGwgfHwgIWRlc3RpbmF0aW9uLmV4aXN0cygpKQorCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGRlc3RpbmF0aW9uKTsKKwkKKwlpbnQgZGVzdFR5cGUgPSBkZXN0aW5hdGlvbi5nZXRFbGVtZW50VHlwZSgpOworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04gOgorCQljYXNlIElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04gOgorCQkJaWYgKGRlc3RUeXBlICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKQorCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6CisJCQlpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgJiYgZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LlRZUEUpCisJCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OLCBlbGVtZW50KTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0QgOgorCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRCA6CisJCWNhc2UgSUphdmFFbGVtZW50LklOSVRJQUxJWkVSIDoKKwkJCWlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuVFlQRSB8fCBkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIEJpbmFyeVR5cGUpCisJCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OLCBlbGVtZW50KTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKKwkJCWlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkKKwkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04sIGVsZW1lbnQpOworCQkJZWxzZSBpZiAoaXNNb3ZlKCkgJiYgKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpCisJCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OworCQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGZyYWdtZW50LmdldFBhcmVudCgpOworCQkJaWYgKHBhcmVudC5pc1JlYWRPbmx5KCkpCisJCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIGVsZW1lbnQpOworCQkJZWxzZSBpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCkKKwkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04sIGVsZW1lbnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOworCX0KK30KKy8qKgorICogVmVyaWZ5IHRoYXQgdGhlIG5ldyBuYW1lIHNwZWNpZmllZCBmb3IgPGNvZGU+ZWxlbWVudDwvY29kZT4gaXMKKyAqIHZhbGlkIGZvciB0aGF0IHR5cGUgb2YgSmF2YSBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW5hbWluZyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lRm9yKGVsZW1lbnQpOworCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7CisKKwlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCWlmIChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpKSB7CisJCQkJLy8gZG9uJ3QgYWxsb3cgcmVuYW1pbmcgb2YgZGVmYXVsdCBwYWNrYWdlIChzZWUgUFIgIzFHNDdHVU0pCisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIGVsZW1lbnQpKTsKKwkJCX0KKwkJCWlzVmFsaWQgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShuZXdOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6CisJCQlpc1ZhbGlkID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZShuZXdOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgOgorCQkJaXNWYWxpZCA9IGZhbHNlOyAvL2Nhbm5vdCByZW5hbWUgaW5pdGlhbGl6ZXJzCisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlpc1ZhbGlkID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihuZXdOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CisJCQlicmVhazsKKwl9CisKKwlpZiAoIWlzVmFsaWQpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9OQU1FLCBlbGVtZW50LCBuZXdOYW1lKSk7CisJfQorfQorLyoqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBwb3NpdGlvbmluZyBzaWJsaW5nIHNwZWNpZmllZCBmb3IgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIGV4aXN0cyBhbmQKKyAqIGl0cyBwYXJlbnQgaXMgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBvZiB0aGlzIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTaWJsaW5nKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnQgZGVzdGluYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudCBpbnNlcnRCZWZvcmVFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgZkluc2VydEJlZm9yZUVsZW1lbnRzLmdldChlbGVtZW50KTsKKwlpZiAoaW5zZXJ0QmVmb3JlRWxlbWVudCAhPSBudWxsKSB7CisJCWlmICghaW5zZXJ0QmVmb3JlRWxlbWVudC5leGlzdHMoKSB8fCAhaW5zZXJ0QmVmb3JlRWxlbWVudC5nZXRQYXJlbnQoKS5lcXVhbHMoZGVzdGluYXRpb24pKSB7CisJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfU0lCTElORywgaW5zZXJ0QmVmb3JlRWxlbWVudCk7CisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiZGZiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YQpAQCAtMCwwICsxLDc2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5QZXJUaHJlYWRPYmplY3Q7CisvKioKKyAqIEEgPGNvZGU+TmFtZUxvb2t1cDwvY29kZT4gcHJvdmlkZXMgbmFtZSByZXNvbHV0aW9uIHdpdGhpbiBhIEphdmEgcHJvamVjdC4KKyAqIFRoZSBuYW1lIGxvb2t1cCBmYWNpbGl0eSB1c2VzIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoIHRvIHByaW9yaXRpemUgdGhlIAorICogb3JkZXIgaW4gd2hpY2ggcGFja2FnZSBmcmFnbWVudHMgYXJlIHNlYXJjaGVkIHdoZW4gcmVzb2x2aW5nIGEgbmFtZS4KKyAqCisgKiA8cD5OYW1lIGxvb2t1cCBvbmx5IHJldHVybnMgYSBoYW5kbGUgd2hlbiB0aGUgbmFtZWQgZWxlbWVudCBhY3R1YWxseQorICogZXhpc3RzIGluIHRoZSBtb2RlbDsgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICoKKyAqIDxwPlRoZXJlIGFyZSB0d28gbG9naWNhbCBzZXRzIG9mIG1ldGhvZHMgd2l0aGluIHRoaXMgaW50ZXJmYWNlLiAgTWV0aG9kcworICogd2hpY2ggc3RhcnQgd2l0aCA8Y29kZT5maW5kKjwvY29kZT4gYXJlIGludGVuZGVkIHRvIGJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHF1aWNrbHkKKyAqIGZpbmRpbmcgYW4gZWxlbWVudCB3aXRoaW4gYW5vdGhlciBlbGVtZW50LCBpLmUuIGZpbmRpbmcgYSBjbGFzcyB3aXRoaW4gYQorICogcGFja2FnZS4gIFRoZSBvdGhlciBzZXQgb2YgbWV0aG9kcyBhbGwgYmVnaW4gd2l0aCA8Y29kZT5zZWVrKjwvY29kZT4uICBUaGVzZSBtZXRob2RzCisgKiBkbyBjb21wcmVoZW5zaXZlIHNlYXJjaGVzIG9mIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHJldHVybmluZyBoaXRzCisgKiBpbiByZWFsIHRpbWUgdGhyb3VnaCBhbiA8Y29kZT5JSmF2YUVsZW1lbnRSZXF1ZXN0b3I8L2NvZGU+LgorICoKKyAqLworcHVibGljIGNsYXNzIE5hbWVMb29rdXAgeworCS8qKgorCSAqIEFjY2VwdCBmbGFnIGZvciBzcGVjaWZ5aW5nIGNsYXNzZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVBUX0NMQVNTRVMgPSAweDAwMDAwMDAyOworCisJLyoqCisJICogQWNjZXB0IGZsYWcgZm9yIHNwZWNpZnlpbmcgaW50ZXJmYWNlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFUFRfSU5URVJGQUNFUyA9IDB4MDAwMDAwMDQ7CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+J3MgYXNzb2NpYXRlZAorCSAqIHdpdGggdGhlIGNsYXNzcGF0aCBvZiB0aGlzIE5hbWVMb29rdXAgZmFjaWxpdHkncworCSAqIHByb2plY3QuCisJICovCisJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290W10gZlBhY2thZ2VGcmFnbWVudFJvb3RzPSBudWxsOworCisJLyoqCisJICogVGFibGUgdGhhdCBtYXBzIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgcGFja2FnZSBmcmFnbWVudHMgZm9yCisJICogYWxsIHBhY2thZ2UgZnJhZ21lbnRzIGluIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGtub3duCisJICogYnkgdGhpcyBuYW1lIGxvb2t1cCBmYWNpbGl0eS4gVG8gYWxsb3cgPiAxIHBhY2thZ2UgZnJhZ21lbnQKKwkgKiB3aXRoIHRoZSBzYW1lIG5hbWUsIHZhbHVlcyBhcmUgYXJyYXlzIG9mIHBhY2thZ2UgZnJhZ21lbnRzCisJICogb3JkZXJlZCBhcyB0aGV5IGFwcGVhciBvbiB0aGUgY2xhc3NwYXRoLgorCSAqLworCXByb3RlY3RlZCBNYXAgZlBhY2thZ2VGcmFnbWVudHM7CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+SVdvcmtzcGFjZTwvY29kZT4gdGhhdCB0aGlzIE5hbWVMb29rdXAKKwkgKiBpcyBjb25maWd1cmUgd2l0aGluLgorCSAqLworCXByb3RlY3RlZCBJV29ya3NwYWNlIHdvcmtzcGFjZTsKKwkKKwkvKioKKwkgKiBBIG1hcCBmcm9tIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlcyB0byB1bml0cyB0byBsb29rIGluc2lkZSAoY29tcGlsYXRpb24KKwkgKiB1bml0cyBvciB3b3JraW5nIGNvcGllcykuCisJICogQWxsb3dzIHdvcmtpbmcgY29waWVzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvbXBpbGF0aW9uIHVuaXRzLgorCSAqIFRoZSBjYWNoZSBpcyBhIDItbGV2ZWwgY2FjaGUsIGZpcnN0IGtleWVkIGJ5IHRocmVhZC4KKwkgKi8KKwlwcm90ZWN0ZWQgUGVyVGhyZWFkT2JqZWN0IHVuaXRzVG9Mb29rSW5zaWRlID0gbmV3IFBlclRocmVhZE9iamVjdCgpOworCisJcHVibGljIE5hbWVMb29rdXAoSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQljb25maWd1cmVGcm9tUHJvamVjdChwcm9qZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWY6PHVsPgorCSAqICA8bGk+dGhlIGdpdmVuIHR5cGUgaXMgYW4gZXhpc3RpbmcgY2xhc3MgYW5kIHRoZSBmbGFnJ3MgPGNvZGU+QUNDRVBUX0NMQVNTRVM8L2NvZGU+CisJICogICAgICBiaXQgaXMgb24KKwkgKiAgPGxpPnRoZSBnaXZlbiB0eXBlIGlzIGFuIGV4aXN0aW5nIGludGVyZmFjZSBhbmQgdGhlIDxjb2RlPkFDQ0VQVF9JTlRFUkZBQ0VTPC9jb2RlPgorCSAqICAgICAgYml0IGlzIG9uCisJICogIDxsaT5uZWl0aGVyIHRoZSA8Y29kZT5BQ0NFUFRfQ0xBU1NFUzwvY29kZT4gb3IgPGNvZGU+QUNDRVBUX0lOVEVSRkFDRVM8L2NvZGU+CisJICogICAgICBiaXQgaXMgb24KKwkgKiAgPC91bD4KKwkgKiBPdGhlcndpc2UsIGZhbHNlIGlzIHJldHVybmVkLiAKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRUeXBlKElUeXBlIHR5cGUsIGludCBhY2NlcHRGbGFncykgeworCQlpZiAoYWNjZXB0RmxhZ3MgPT0gMCkKKwkJCXJldHVybiB0cnVlOyAvLyBubyBmbGFncywgYWx3YXlzIGFjY2VwdGVkCisJCXRyeSB7CisJCQlpZiAodHlwZS5pc0NsYXNzKCkpIHsKKwkJCQlyZXR1cm4gKGFjY2VwdEZsYWdzICYgQUNDRVBUX0NMQVNTRVMpICE9IDA7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAoYWNjZXB0RmxhZ3MgJiBBQ0NFUFRfSU5URVJGQUNFUykgIT0gMDsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQkJcmV0dXJuIGZhbHNlOyAvLyB0aGUgY2xhc3MgaXMgbm90IHByZXNlbnQsIGRvIG5vdCBhY2NlcHQuCisJCX0KKwl9CisKKwkvKioKKwkgKiBDb25maWd1cmVzIHRoaXMgPGNvZGU+TmFtZUxvb2t1cDwvY29kZT4gYmFzZWQgb24gdGhlCisJICogaW5mbyBvZiB0aGUgZ2l2ZW4gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4KKwkgKgorCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGhhcyBubyBjbGFzc3BhdGguCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUZyb21Qcm9qZWN0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJd29ya3NwYWNlPSBwcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldFdvcmtzcGFjZSgpOworCQlmUGFja2FnZUZyYWdtZW50Um9vdHM9ICgoSmF2YVByb2plY3QpIHByb2plY3QpLmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisJCWZQYWNrYWdlRnJhZ21lbnRzPSBuZXcgSGFzaE1hcCgpOworCQlJUGFja2FnZUZyYWdtZW50W10gZnJhZ3MgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudHNJblJvb3RzKGZQYWNrYWdlRnJhZ21lbnRSb290cywgcHJvamVjdCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKykgeworCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudD0gZnJhZ3NbaV07CisJCQlJUGFja2FnZUZyYWdtZW50W10gZW50cnk9IChJUGFja2FnZUZyYWdtZW50W10pIGZQYWNrYWdlRnJhZ21lbnRzLmdldChmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCWlmIChlbnRyeSA9PSBudWxsKSB7CisJCQkJZW50cnk9IG5ldyBJUGFja2FnZUZyYWdtZW50WzFdOworCQkJCWVudHJ5WzBdPSBmcmFnbWVudDsKKwkJCQlmUGFja2FnZUZyYWdtZW50cy5wdXQoZnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgZW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlJUGFja2FnZUZyYWdtZW50W10gY29weT0gbmV3IElQYWNrYWdlRnJhZ21lbnRbZW50cnkubGVuZ3RoICsgMV07CisJCQkJU3lzdGVtLmFycmF5Y29weShlbnRyeSwgMCwgY29weSwgMCwgZW50cnkubGVuZ3RoKTsKKwkJCQljb3B5W2VudHJ5Lmxlbmd0aF09IGZyYWdtZW50OworCQkJCWZQYWNrYWdlRnJhZ21lbnRzLnB1dChmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLCBjb3B5KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEZpbmRzIGV2ZXJ5IHR5cGUgaW4gdGhlIHByb2plY3Qgd2hvc2Ugc2ltcGxlIG5hbWUgbWF0Y2hlcworCSAqIHRoZSBwcmVmaXgsIGluZm9ybWluZyB0aGUgcmVxdWVzdG9yIG9mIGVhY2ggaGl0LiBUaGUgcmVxdWVzdG9yCisJICogaXMgcG9sbGVkIGZvciBjYW5jZWxsYXRpb24gYXQgcmVndWxhciBpbnRlcnZhbHMuCisJICoKKwkgKiA8cD5UaGUgPGNvZGU+cGFydGlhbE1hdGNoPC9jb2RlPiBhcmd1bWVudCBpbmRpY2F0ZXMgcGFydGlhbCBtYXRjaGVzCisJICogc2hvdWxkIGJlIGNvbnNpZGVyZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIGZpbmRBbGxUeXBlcyhTdHJpbmcgcHJlZml4LCBib29sZWFuIHBhcnRpYWxNYXRjaCwgaW50IGFjY2VwdEZsYWdzLCBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisJCWludCBjb3VudD0gZlBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aDsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChyZXF1ZXN0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGZQYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKKwkJCUlKYXZhRWxlbWVudFtdIHBhY2thZ2VzPSBudWxsOworCQkJdHJ5IHsKKwkJCQlwYWNrYWdlcz0gcm9vdC5nZXRDaGlsZHJlbigpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQkJCWNvbnRpbnVlOyAvLyB0aGUgcm9vdCBpcyBub3QgcHJlc2VudCwgY29udGludWU7CisJCQl9CisJCQlpZiAocGFja2FnZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGo9IDAsIHBhY2thZ2VDb3VudD0gcGFja2FnZXMubGVuZ3RoOyBqIDwgcGFja2FnZUNvdW50OyBqKyspIHsKKwkJCQkJaWYgKHJlcXVlc3Rvci5pc0NhbmNlbGVkKCkpCisJCQkJCQlyZXR1cm47CisJCQkJCXNlZWtUeXBlcyhwcmVmaXgsIChJUGFja2FnZUZyYWdtZW50KSBwYWNrYWdlc1tqXSwgcGFydGlhbE1hdGNoLCBhY2NlcHRGbGFncywgcmVxdWVzdG9yKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiB3aGljaCBkZWZpbmVzIHRoZSB0eXBlCisJICogbmFtZWQgPGNvZGU+cXVhbGlmaWVkVHlwZU5hbWU8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIG5vbmUgZXhpc3RzLiBUaGUgZG9tYWluIG9mIHRoZSBzZWFyY2ggaXMgYm91bmRlZCBieSB0aGUgY2xhc3NwYXRoCisJICogb2YgdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gdGhpcyA8Y29kZT5OYW1lTG9va3VwPC9jb2RlPiB3YXMKKwkgKiBvYnRhaW5lZCBmcm9tLgorCSAqIDxwPgorCSAqIFRoZSBuYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkIChlZyAiamF2YS5sYW5nLk9iamVjdCIsICJqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5IikKKwkgKi8KKwlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBmaW5kQ29tcGlsYXRpb25Vbml0KFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSkgeworCQlTdHJpbmcgcGtnTmFtZT0gSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsKKwkJU3RyaW5nIGN1TmFtZT0gcXVhbGlmaWVkVHlwZU5hbWU7CisKKwkJaW50IGluZGV4PSBxdWFsaWZpZWRUeXBlTmFtZS5sYXN0SW5kZXhPZignLicpOworCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCXBrZ05hbWU9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJCQljdU5hbWU9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOworCQl9CisJCWluZGV4PSBjdU5hbWUuaW5kZXhPZignJCcpOworCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCWN1TmFtZT0gY3VOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJCX0KKwkJY3VOYW1lICs9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJSVBhY2thZ2VGcmFnbWVudFtdIGZyYWdzPSAoSVBhY2thZ2VGcmFnbWVudFtdKSBmUGFja2FnZUZyYWdtZW50cy5nZXQocGtnTmFtZSk7CisJCWlmIChmcmFncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgZnJhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlJUGFja2FnZUZyYWdtZW50IGZyYWc9IGZyYWdzW2ldOworCQkJCWlmICghKGZyYWcgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnQpKSB7CisJCQkJCUlDb21waWxhdGlvblVuaXQgY3U9IGZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KGN1TmFtZSk7CisJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmV4aXN0cygpKSB7CisJCQkJCQlyZXR1cm4gY3U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgd2hvc2UgcGF0aCBtYXRjaGVzIHRoZSBnaXZlbgorCSAqIChhYnNvbHV0ZSkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdC4gVGhlIGRvbWFpbiBvZgorCSAqIHRoZSBzZWFyY2ggaXMgYm91bmRlZCBieSB0aGUgY2xhc3NwYXRoIG9mIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+CisJICogdGhpcyA8Y29kZT5OYW1lTG9va3VwPC9jb2RlPiB3YXMgb2J0YWluZWQgZnJvbS4KKwkgKiBUaGUgcGF0aCBjYW4gYmU6CisJICogCS0gaW50ZXJuYWwgdG8gdGhlIHdvcmtiZW5jaDogIi9Qcm9qZWN0L3NyYyIKKwkgKiAgLSBleHRlcm5hbCB0byB0aGUgd29ya2JlbmNoOiAiYzovamRrL2NsYXNzZXMuemlwL2phdmEvbGFuZyIKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50KElQYXRoIHBhdGgpIHsKKwkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoInBhdGgubXVzdEJlQWJzb2x1dGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorLyoKKyAqIHRoaXMgY29kZSBzaG91bGQgcmF0aGVyIHVzZSB0aGUgcGFja2FnZSBmcmFnbWVudCBtYXAgdG8gZmluZCB0aGUgY2FuZGlkYXRlIHBhY2thZ2UsIHRoZW4KKyAqIGNoZWNrIGlmIHRoZSByZXNwZWN0aXZlIGVuY2xvc2luZyByb290IG1hcHMgdG8gdGhlIG9uZSBvbiB0aGlzIGdpdmVuIElQYXRoLgorICovCQkKKwkJSVJlc291cmNlIHBvc3NpYmxlRnJhZ21lbnQgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7CisJCWlmIChwb3NzaWJsZUZyYWdtZW50ID09IG51bGwpIHsKKwkJCS8vZXh0ZXJuYWwgamFyCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZQYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7IGkrKykgeworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBmUGFja2FnZUZyYWdtZW50Um9vdHNbaV07CisJCQkJaWYgKCFyb290LmlzRXh0ZXJuYWwoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJSVBhdGggcm9vdFBhdGggPSByb290LmdldFBhdGgoKTsKKwkJCQlpbnQgbWF0Y2hpbmdDb3VudCA9IHJvb3RQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhwYXRoKTsKKwkJCQlpZiAobWF0Y2hpbmdDb3VudCAhPSAwKSB7CisJCQkJCVN0cmluZyBuYW1lID0gcGF0aC50b09TU3RyaW5nKCk7CisJCQkJCS8vICsgMSBpcyBmb3IgdGhlIEZpbGUuc2VwYXJhdG9yQ2hhcgorCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcocm9vdFBhdGgudG9PU1N0cmluZygpLmxlbmd0aCgpICsgMSwgbmFtZS5sZW5ndGgoKSk7CisJCQkJCW5hbWUgPSBuYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOworCQkJCQlJSmF2YUVsZW1lbnRbXSBsaXN0ID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCWxpc3QgPSByb290LmdldENoaWxkcmVuKCk7CisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCQkJCWNvbnRpbnVlOyAvLyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IGlzIG5vdCBwcmVzZW50OworCQkJCQl9CisJCQkJCWludCBlbGVtZW50Q291bnQgPSBsaXN0Lmxlbmd0aDsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50Q291bnQ7IGorKykgeworCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCkgbGlzdFtqXTsKKwkJCQkJCWlmIChuYW1lTWF0Y2hlcyhuYW1lLCBwYWNrYWdlRnJhZ21lbnQsIGZhbHNlKSkgeworCQkJCQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlJSmF2YUVsZW1lbnQgZnJvbUZhY3RvcnkgPSBKYXZhQ29yZS5jcmVhdGUocG9zc2libGVGcmFnbWVudCk7CisJCQlpZiAoZnJvbUZhY3RvcnkgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKGZyb21GYWN0b3J5IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgeworCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgZnJvbUZhY3Rvcnk7CisJCQl9IGVsc2UKKwkJCQlpZiAoZnJvbUZhY3RvcnkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKKwkJCQkJLy8gZGVmYXVsdCBwYWNrYWdlIGluIGEgZGVmYXVsdCByb290CisJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGZyb21GYWN0b3J5OworCQkJCQl0cnkgeworCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihwYXRoKTsKKwkJCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7CisJCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9CisJCQkJCQkJCXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKKwkJCQkJCQlJUGFja2FnZUZyYWdtZW50W10gcGtncyA9IChJUGFja2FnZUZyYWdtZW50W10pIGZQYWNrYWdlRnJhZ21lbnRzLmdldChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsKKwkJCQkJCQlpZiAocGtncyA9PSBudWxsKSB7CisJCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJCX0KKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBrZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQkJaWYgKHBrZ3NbaV0uZ2V0UGFyZW50KCkuZXF1YWxzKHJvb3QpKSB7CisJCQkJCQkJCQlyZXR1cm4gcGtnc1tpXTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4KKwkgKiAocXVhbGlmaWVkKSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGV4aXN0LgorCSAqCisJICogVGhlIG5hbWUgY2FuIGJlOgorCSAqCS0gZW1wdHk6ICIiCisJICoJLSBxdWFsaWZpZWQ6ICJwYWNrLnBhY2sxLnBhY2syIgorCSAqIEBwYXJhbSBwYXJ0aWFsTWF0Y2ggcGFydGlhbCBuYW1lIG1hdGNoZXMgcXVhbGlmeSB3aGVuIDxjb2RlPnRydWU8L2NvZGU+LAorCSAqCW9ubHkgZXhhY3QgbmFtZSBtYXRjaGVzIHF1YWxpZnkgd2hlbiA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFtdIGZpbmRQYWNrYWdlRnJhZ21lbnRzKFN0cmluZyBuYW1lLCBib29sZWFuIHBhcnRpYWxNYXRjaCkgeworCQlpbnQgY291bnQ9IGZQYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7CisJCWlmIChwYXJ0aWFsTWF0Y2gpIHsKKwkJCW5hbWU9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCWZvciAoaW50IGk9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZlBhY2thZ2VGcmFnbWVudFJvb3RzW2ldOworCQkJCUlKYXZhRWxlbWVudFtdIGxpc3Q9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJbGlzdD0gcm9vdC5nZXRDaGlsZHJlbigpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCQkJY29udGludWU7IC8vIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgbm90IHByZXNlbnQ7CisJCQkJfQorCQkJCWludCBlbGVtZW50Q291bnQ9IGxpc3QubGVuZ3RoOworCQkJCUlQYWNrYWdlRnJhZ21lbnRbXSByZXN1bHQgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFtlbGVtZW50Q291bnRdOworCQkJCWludCByZXN1bHRMZW5ndGggPSAwOyAKKwkJCQlmb3IgKGludCBqPSAwOyBqIDwgZWxlbWVudENvdW50OyBqKyspIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ9IChJUGFja2FnZUZyYWdtZW50KSBsaXN0W2pdOworCQkJCQlpZiAobmFtZU1hdGNoZXMobmFtZSwgcGFja2FnZUZyYWdtZW50LCB0cnVlKSkgeworCQkJCQkJcmVzdWx0W3Jlc3VsdExlbmd0aCsrXSA9IHBhY2thZ2VGcmFnbWVudDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocmVzdWx0TGVuZ3RoID4gMCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgcmVzdWx0ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbcmVzdWx0TGVuZ3RoXSwgMCwgcmVzdWx0TGVuZ3RoKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlJUGFja2FnZUZyYWdtZW50W10gZnJhZ21lbnRzPSAoSVBhY2thZ2VGcmFnbWVudFtdKSBmUGFja2FnZUZyYWdtZW50cy5nZXQobmFtZSk7CisJCQlpZiAoZnJhZ21lbnRzICE9IG51bGwpIHsKKwkJCQlJUGFja2FnZUZyYWdtZW50W10gcmVzdWx0ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbZnJhZ21lbnRzLmxlbmd0aF07CisJCQkJaW50IHJlc3VsdExlbmd0aCA9IDA7IAorCQkJCWZvciAoaW50IGk9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ9IGZyYWdtZW50c1tpXTsKKwkJCQkJcmVzdWx0W3Jlc3VsdExlbmd0aCsrXSA9IHBhY2thZ2VGcmFnbWVudDsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdExlbmd0aCA+IDApIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHJlc3VsdCA9IG5ldyBJUGFja2FnZUZyYWdtZW50W3Jlc3VsdExlbmd0aF0sIDAsIHJlc3VsdExlbmd0aCk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBwYXJ0aWFsTWF0Y2gsIGludCBhY2NlcHRGbGFncykgeworCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgeworCQkJcGFja2FnZU5hbWU9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCX0KKwkJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgZWxlbWVudFJlcXVlc3RvciA9IG5ldyBKYXZhRWxlbWVudFJlcXVlc3RvcigpOworCQlzZWVrUGFja2FnZUZyYWdtZW50cyhwYWNrYWdlTmFtZSwgZmFsc2UsIGVsZW1lbnRSZXF1ZXN0b3IpOworCQlJUGFja2FnZUZyYWdtZW50W10gcGFja2FnZXM9IGVsZW1lbnRSZXF1ZXN0b3IuZ2V0UGFja2FnZUZyYWdtZW50cygpOworCisJCWZvciAoaW50IGk9IDAsIGxlbmd0aD0gcGFja2FnZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlUeXBlIHR5cGU9IGZpbmRUeXBlKHR5cGVOYW1lLCBwYWNrYWdlc1tpXSwgcGFydGlhbE1hdGNoLCBhY2NlcHRGbGFncyk7CisJCQlpZiAodHlwZSAhPSBudWxsKQorCQkJCXJldHVybiB0eXBlOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB0aGUgcGFja2FnZSBmcmFnbWVudHMgZm91bmQgaW4gdGhlIHNwZWNpZmllZAorCSAqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuIE1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgZnJhZ21lbnRzIGhhdmUgdGhlIGdpdmVuCisJICogcHJvamVjdCBhcyBncmVhdCBwYXJlbnQuIFRoaXMgZW5zdXJlcyB0aGUgbmFtZSBsb29rdXAgd2lsbCBub3QgcmVmZXIgdG8gYW5vdGhlcgorCSAqIHByb2plY3QgKHRocm91Z2ggamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMpCisJICovCisJcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50W10gZ2V0UGFja2FnZUZyYWdtZW50c0luUm9vdHMoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cywgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKworCQkvLyBUaGUgZm9sbG93aW5nIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCB0aGUgcm9vdHMgaGF2ZSB0aGUgZ2l2ZW4gcHJvamVjdCBhcyB0aGVpciBwYXJlbnQKKwkJQXJyYXlMaXN0IGZyYWdzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07CisJCQl0cnkgeworCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZHJlbigpOworCisJCQkJLyogMiBqYXIgcGFja2FnZSBmcmFnbWVudCByb290cyBjYW4gYmUgZXF1YWxzIGJ1dCBub3QgYmVsb25naW5nIAorCQkJCSAgIHRvIHRoZSBzYW1lIHByb2plY3QuIEFzIGEgcmVzdWx0LCB0aGV5IHNoYXJlIHRoZSBzYW1lIGVsZW1lbnQgaW5mby4KKwkJCQkgICBTbyB0aGlzIGphciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY291bGQgZ2V0IHRoZSBjaGlsZHJlbiBvZgorCQkJCSAgIGFub3RoZXIgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KKwkJCQkgICBUaGUgZm9sbG93aW5nIGNvZGUgZW5zdXJlcyB0aGF0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIGphciBwYWNrYWdlCisJCQkJICAgZnJhZ21lbnQgcm9vdCBoYXZlIHRoZSBnaXZlbiBwcm9qZWN0IGFzIGEgZ3JlYXQgcGFyZW50LgorCQkJCSAqLworCQkJCWludCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7CisJCQkJaWYgKGxlbmd0aCA9PSAwKSBjb250aW51ZTsKKwkJCQlpZiAoY2hpbGRyZW5bMF0uZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZXF1YWxzKHByb2plY3QpKSB7CisJCQkJCS8vIHRoZSBjaGlsZHJlbiBoYXZlIHRoZSByaWdodCBwYXJlbnQsIHNpbXBseSBhZGQgdGhlbSB0byB0aGUgbGlzdAorCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQlmcmFncy5hZGQoY2hpbGRyZW5bal0pOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gY3JlYXRlIGEgbmV3IGhhbmRsZSB3aXRoIHRoZSByb290IGFzIHRoZSBwYXJlbnQKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJZnJhZ3MuYWRkKHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KGNoaWxkcmVuW2pdLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gZG8gbm90aGluZworCQkJfQorCQl9CisJCUlQYWNrYWdlRnJhZ21lbnRbXSBmcmFnbWVudHMgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFtmcmFncy5zaXplKCldOworCQlmcmFncy50b0FycmF5KGZyYWdtZW50cyk7CisJCXJldHVybiBmcmFnbWVudHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZSB3aG9zZSBuYW1lCisJICogbWF0Y2hlcyB0aGUgZ2l2ZW4gKHVucXVhbGlmaWVkKSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogZXhpc3QuIFNwZWNpZnlpbmcgYSA8Y29kZT5udWxsPC9jb2RlPiBwYWNrYWdlIHdpbGwgcmVzdWx0IGluIG5vIG1hdGNoZXMuCisJICogVGhlIGRvbWFpbiBvZiB0aGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIEphdmEgcHJvamVjdCBmcm9tIHdoaWNoIAorCSAqIHRoaXMgbmFtZSBsb29rdXAgd2FzIG9idGFpbmVkLgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gZmluZAorCSAqIEBwYXJhbSBwa2cgdGhlIHBhY2thZ2UgdG8gc2VhcmNoCisJICogQHBhcmFtIHBhcnRpYWxNYXRjaCBwYXJ0aWFsIG5hbWUgbWF0Y2hlcyBxdWFsaWZ5IHdoZW4gPGNvZGU+dHJ1ZTwvY29kZT4sCisJICoJb25seSBleGFjdCBuYW1lIG1hdGNoZXMgcXVhbGlmeSB3aGVuIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqIEBwYXJhbSBhY2NlcHRGbGFncyBhIGJpdCBtYXNrIGRlc2NyaWJpbmcgaWYgY2xhc3NlcywgaW50ZXJmYWNlcyBvciBib3RoIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKKwkgKiAJYXJlIGRlc2lyZWQgcmVzdWx0cy4gSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgYWxsIHR5cGVzIGFyZSByZXR1cm5lZC4KKwkgKgorCSAqIEBzZWUgI0FDQ0VQVF9DTEFTU0VTCisJICogQHNlZSAjQUNDRVBUX0lOVEVSRkFDRVMKKwkgKi8KKwlwdWJsaWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIG5hbWUsIElQYWNrYWdlRnJhZ21lbnQgcGtnLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgaW50IGFjY2VwdEZsYWdzKSB7CisJCWlmIChwa2cgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gUmV0dXJuIGZpcnN0IGZvdW5kIChpZ25vcmUgZHVwbGljYXRlcykuCisvL3N5bmNocm9uaXplZChKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSl7CQorCQlTaW5nbGVUeXBlUmVxdWVzdG9yIHR5cGVSZXF1ZXN0b3IgPSBuZXcgU2luZ2xlVHlwZVJlcXVlc3RvcigpOworCQlzZWVrVHlwZXMobmFtZSwgcGtnLCBwYXJ0aWFsTWF0Y2gsIGFjY2VwdEZsYWdzLCB0eXBlUmVxdWVzdG9yKTsKKwkJSVR5cGUgdHlwZT0gdHlwZVJlcXVlc3Rvci5nZXRUeXBlKCk7CisJCXJldHVybiB0eXBlOworLy99CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIHF1YWxpZmllZCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIG5vbmUgZXhpc3QuIFRoZSBkb21haW4gb2YKKwkgKiB0aGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIEphdmEgcHJvamVjdCBmcm9tIHdoaWNoIHRoaXMgbmFtZSBsb29rdXAgd2FzIG9idGFpbmVkLgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gZmluZAorCSAqIEBwYXJhbSBwYXJ0aWFsTWF0Y2ggcGFydGlhbCBuYW1lIG1hdGNoZXMgcXVhbGlmeSB3aGVuIDxjb2RlPnRydWU8L2NvZGU+LAorCSAqCW9ubHkgZXhhY3QgbmFtZSBtYXRjaGVzIHF1YWxpZnkgd2hlbiA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKiBAcGFyYW0gYWNjZXB0RmxhZ3MgYSBiaXQgbWFzayBkZXNjcmliaW5nIGlmIGNsYXNzZXMsIGludGVyZmFjZXMgb3IgYm90aCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisJICogCWFyZSBkZXNpcmVkIHJlc3VsdHMuIElmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIGFsbCB0eXBlcyBhcmUgcmV0dXJuZWQuCisJICoKKwkgKiBAc2VlICNBQ0NFUFRfQ0xBU1NFUworCSAqIEBzZWUgI0FDQ0VQVF9JTlRFUkZBQ0VTCisJICovCisJcHVibGljIElUeXBlIGZpbmRUeXBlKFN0cmluZyBuYW1lLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgaW50IGFjY2VwdEZsYWdzKSB7CisJCWludCBpbmRleD0gbmFtZS5sYXN0SW5kZXhPZignLicpOworCQlTdHJpbmcgY2xhc3NOYW1lPSBudWxsLCBwYWNrYWdlTmFtZT0gbnVsbDsKKwkJaWYgKGluZGV4ID09IC0xKSB7CisJCQlwYWNrYWdlTmFtZT0gSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRTsKKwkJCWNsYXNzTmFtZT0gbmFtZTsKKwkJfSBlbHNlIHsKKwkJCXBhY2thZ2VOYW1lPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJCQljbGFzc05hbWU9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisJCX0KKwkJcmV0dXJuIGZpbmRUeXBlKGNsYXNzTmFtZSwgcGFja2FnZU5hbWUsIHBhcnRpYWxNYXRjaCwgYWNjZXB0RmxhZ3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZWxlbWVudCdzIG5hbWUgbWF0Y2hlcyB0aGUKKwkgKiBzcGVjaWZpZWQgPGNvZGU+c2VhcmNoTmFtZTwvY29kZT4sIG90aGVyd2lzZSBmYWxzZS4KKwkgKgorCSAqIDxwPlRoZSA8Y29kZT5wYXJ0aWFsTWF0Y2g8L2NvZGU+IGFyZ3VtZW50IGluZGljYXRlcyBwYXJ0aWFsIG1hdGNoZXMKKwkgKiBzaG91bGQgYmUgY29uc2lkZXJlZC4KKwkgKiBOT1RFOiBpbiBwYXJ0aWFsTWF0Y2ggbW9kZSwgdGhlIGNhc2Ugd2lsbCBiZSBpZ25vcmVkLCBhbmQgdGhlIHNlYXJjaE5hbWUgbXVzdCBhbHJlYWR5IGhhdmUKKwkgKiAgICAgICAgICBiZWVuIGxvd2VyY2FzZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbmFtZU1hdGNoZXMoU3RyaW5nIHNlYXJjaE5hbWUsIElKYXZhRWxlbWVudCBlbGVtZW50LCBib29sZWFuIHBhcnRpYWxNYXRjaCkgeworCQlpZiAocGFydGlhbE1hdGNoKSB7CisJCQkvLyBwYXJ0aWFsIG1hdGNoZXMgYXJlIHVzZWQgaW4gY29tcGxldGlvbiBtb2RlLCB0aHVzIGNhc2UgaW5zZW5zaXRpdmUgbW9kZQorCQkJcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoTmFtZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhzZWFyY2hOYW1lKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE5vdGlmaWVzIHRoZSBnaXZlbiByZXF1ZXN0b3Igb2YgYWxsIHBhY2thZ2UgZnJhZ21lbnRzIHdpdGggdGhlCisJICogZ2l2ZW4gbmFtZS4gQ2hlY2tzIHRoZSByZXF1ZXN0b3IgYXQgcmVndWxhciBpbnRlcnZhbHMgdG8gc2VlIGlmIHRoZQorCSAqIHJlcXVlc3RvciBoYXMgY2FuY2VsZWQuIFRoZSBkb21haW4gb2YKKwkgKiB0aGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KKwkgKiB0aGlzIDxjb2RlPk5hbWVMb29rdXA8L2NvZGU+IHdhcyBvYnRhaW5lZCBmcm9tLgorCSAqCisJICogQHBhcmFtIHBhcnRpYWxNYXRjaCBwYXJ0aWFsIG5hbWUgbWF0Y2hlcyBxdWFsaWZ5IHdoZW4gPGNvZGU+dHJ1ZTwvY29kZT47CisJICoJb25seSBleGFjdCBuYW1lIG1hdGNoZXMgcXVhbGlmeSB3aGVuIDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqLworCXB1YmxpYyB2b2lkIHNlZWtQYWNrYWdlRnJhZ21lbnRzKFN0cmluZyBuYW1lLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgSUphdmFFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlpbnQgY291bnQ9IGZQYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGg7CisJCVN0cmluZyBtYXRjaE5hbWU9IHBhcnRpYWxNYXRjaCA/IG5hbWUudG9Mb3dlckNhc2UoKSA6IG5hbWU7CisJCWZvciAoaW50IGk9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQlyZXR1cm47CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBmUGFja2FnZUZyYWdtZW50Um9vdHNbaV07CisJCQlJSmF2YUVsZW1lbnRbXSBsaXN0PSBudWxsOworCQkJdHJ5IHsKKwkJCQlsaXN0PSByb290LmdldENoaWxkcmVuKCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQkJY29udGludWU7IC8vIHRoaXMgcm9vdCBwYWNrYWdlIGZyYWdtZW50IGlzIG5vdCBwcmVzZW50CisJCQl9CisJCQlpbnQgZWxlbWVudENvdW50PSBsaXN0Lmxlbmd0aDsKKwkJCWZvciAoaW50IGo9IDA7IGogPCBlbGVtZW50Q291bnQ7IGorKykgeworCQkJCWlmIChyZXF1ZXN0b3IuaXNDYW5jZWxlZCgpKQorCQkJCQlyZXR1cm47CisJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ9IChJUGFja2FnZUZyYWdtZW50KSBsaXN0W2pdOworCQkJCWlmIChuYW1lTWF0Y2hlcyhtYXRjaE5hbWUsIHBhY2thZ2VGcmFnbWVudCwgcGFydGlhbE1hdGNoKSkKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdFBhY2thZ2VGcmFnbWVudChwYWNrYWdlRnJhZ21lbnQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogTm90aWZpZXMgdGhlIGdpdmVuIHJlcXVlc3RvciBvZiBhbGwgdHlwZXMgKGNsYXNzZXMgYW5kIGludGVyZmFjZXMpIGluIHRoZQorCSAqIGdpdmVuIHBhY2thZ2UgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gKHVucXVhbGlmaWVkKSBuYW1lLgorCSAqIENoZWNrcyB0aGUgcmVxdWVzdG9yIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIHRvIHNlZSBpZiB0aGUgcmVxdWVzdG9yCisJICogaGFzIGNhbmNlbGVkLiBJZiB0aGUgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgYWxsIHR5cGVzIGluIHRoZQorCSAqIHByb2plY3Qgd2hvc2Ugc2ltcGxlIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSBhcmUgZm91bmQuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZWFyY2gKKwkgKiBAcGFyYW0gcGtnIFRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UgZnJhZ21lbnQKKwkgKiBAcGFyYW0gcGFydGlhbE1hdGNoIHBhcnRpYWwgbmFtZSBtYXRjaGVzIHF1YWxpZnkgd2hlbiA8Y29kZT50cnVlPC9jb2RlPjsKKwkgKglvbmx5IGV4YWN0IG5hbWUgbWF0Y2hlcyBxdWFsaWZ5IHdoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogQHBhcmFtIGFjY2VwdEZsYWdzIGEgYml0IG1hc2sgZGVzY3JpYmluZyBpZiBjbGFzc2VzLCBpbnRlcmZhY2VzIG9yIGJvdGggY2xhc3NlcyBhbmQgaW50ZXJmYWNlcworCSAqIAlhcmUgZGVzaXJlZCByZXN1bHRzLiBJZiBubyBmbGFncyBhcmUgc3BlY2lmaWVkLCBhbGwgdHlwZXMgYXJlIHJldHVybmVkLgorCSAqIEBwYXJhbSByZXF1ZXN0b3IgVGhlIHJlcXVlc3RvciB0aGF0IGNvbGxlY3RzIHRoZSByZXN1bHQKKwkgKgorCSAqIEBzZWUgI0FDQ0VQVF9DTEFTU0VTCisJICogQHNlZSAjQUNDRVBUX0lOVEVSRkFDRVMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWVrVHlwZXMoU3RyaW5nIG5hbWUsIElQYWNrYWdlRnJhZ21lbnQgcGtnLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgaW50IGFjY2VwdEZsYWdzLCBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7CisKKwkJU3RyaW5nIG1hdGNoTmFtZT0gcGFydGlhbE1hdGNoID8gbmFtZS50b0xvd2VyQ2FzZSgpIDogbmFtZTsKKwkJaWYgKG1hdGNoTmFtZS5pbmRleE9mKCcuJykgPj0gMCkgeyAvL2xvb2tzIGZvciBtZW1iZXIgdHlwZSBBLkIKKwkJCW1hdGNoTmFtZT0gbWF0Y2hOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOworCQl9CisJCWlmIChwa2cgPT0gbnVsbCkgeworCQkJZmluZEFsbFR5cGVzKG1hdGNoTmFtZSwgcGFydGlhbE1hdGNoLCBhY2NlcHRGbGFncywgcmVxdWVzdG9yKTsKKwkJCXJldHVybjsKKwkJfQorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBrZy5nZXRQYXJlbnQoKTsKKwkJdHJ5IHsKKwkJCWludCBwYWNrYWdlRmxhdm9yPSByb290LmdldEtpbmQoKTsKKwkJCXN3aXRjaCAocGFja2FnZUZsYXZvcikgeworCQkJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkgOgorCQkJCQlzZWVrVHlwZXNJbkJpbmFyeVBhY2thZ2UobWF0Y2hOYW1lLCBwa2csIHBhcnRpYWxNYXRjaCwgYWNjZXB0RmxhZ3MsIHJlcXVlc3Rvcik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgOgorCQkJCQlzZWVrVHlwZXNJblNvdXJjZVBhY2thZ2UobWF0Y2hOYW1lLCBwa2csIHBhcnRpYWxNYXRjaCwgYWNjZXB0RmxhZ3MsIHJlcXVlc3Rvcik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm47CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0eXBlIHNlYXJjaCBpbiBhIGJpbmFyeSBwYWNrYWdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlZWtUeXBlc0luQmluYXJ5UGFja2FnZShTdHJpbmcgbmFtZSwgSVBhY2thZ2VGcmFnbWVudCBwa2csIGJvb2xlYW4gcGFydGlhbE1hdGNoLCBpbnQgYWNjZXB0RmxhZ3MsIElKYXZhRWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJSUNsYXNzRmlsZVtdIGNsYXNzRmlsZXM9IG51bGw7CisJCXRyeSB7CisJCQljbGFzc0ZpbGVzPSBwa2cuZ2V0Q2xhc3NGaWxlcygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQlyZXR1cm47IC8vIHRoZSBwYWNrYWdlIGlzIG5vdCBwcmVzZW50CisJCX0KKwkJaW50IGxlbmd0aD0gY2xhc3NGaWxlcy5sZW5ndGg7CisKKwkJU3RyaW5nIHVucXVhbGlmaWVkTmFtZT0gbmFtZTsKKwkJaW50IGluZGV4PSBuYW1lLmxhc3RJbmRleE9mKCckJyk7CisJCWlmIChpbmRleCAhPSAtMSkgeworCQkJLy90aGUgdHlwZSBuYW1lIG9mIHRoZSBpbm5lciB0eXBlCisJCQl1bnF1YWxpZmllZE5hbWU9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgoKSk7CisJCQkvLyB1bnF1YWxpZmllZE5hbWUgaXMgZW1wdHkgaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgJyQnIHNpZ24uCisJCQkvLyBTZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY0MgorCQkJaWYgKCh1bnF1YWxpZmllZE5hbWUubGVuZ3RoKCkgPiAwICYmIENoYXJhY3Rlci5pc0RpZ2l0KHVucXVhbGlmaWVkTmFtZS5jaGFyQXQoMCkpKSB8fCB1bnF1YWxpZmllZE5hbWUubGVuZ3RoKCkgPT0gMCl7CisJCQkJdW5xdWFsaWZpZWROYW1lID0gbmFtZTsKKwkJCX0KKwkJfQorCQlTdHJpbmcgbWF0Y2hOYW1lPSBwYXJ0aWFsTWF0Y2ggPyBuYW1lLnRvTG93ZXJDYXNlKCkgOiBuYW1lOworCQlmb3IgKGludCBpPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChyZXF1ZXN0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlPSBjbGFzc0ZpbGVzW2ldOworCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCk7CisJCQlpZiAocGFydGlhbE1hdGNoKSBlbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCk7CisKKwkJCS8qKgorCQkJICogTXVzdCB1c2Ugc3RhcnRXaXRoIGJlY2F1c2UgbWF0Y2hOYW1lIHdpbGwgbmV2ZXIgaGF2ZSB0aGUgCisJCQkgKiBleHRlbnNpb24gIi5jbGFzcyIgYW5kIHRoZSBlbGVtZW50TmFtZSBhbHdheXMgd2lsbC4KKwkJCSAqLworCQkJaWYgKGVsZW1lbnROYW1lLnN0YXJ0c1dpdGgobWF0Y2hOYW1lKSkgeworCQkJCUlUeXBlIHR5cGU9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJdHlwZT0gY2xhc3NGaWxlLmdldFR5cGUoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQkJCWNvbnRpbnVlOyAvLyB0aGUgY2xhc3NGaWxlIGlzIG5vdCBwcmVzZW50CisJCQkJfQorCQkJCWlmICghcGFydGlhbE1hdGNoIHx8ICh0eXBlLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPiAwICYmICFDaGFyYWN0ZXIuaXNEaWdpdCh0eXBlLmdldEVsZW1lbnROYW1lKCkuY2hhckF0KDApKSkpIHsgLy9ub3QgYW4gYW5vbnltb3VzIHR5cGUKKwkJCQkJaWYgKG5hbWVNYXRjaGVzKHVucXVhbGlmaWVkTmFtZSwgdHlwZSwgcGFydGlhbE1hdGNoKSAmJiBhY2NlcHRUeXBlKHR5cGUsIGFjY2VwdEZsYWdzKSkKKwkJCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKHR5cGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFBlcmZvcm1zIHR5cGUgc2VhcmNoIGluIGEgc291cmNlIHBhY2thZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2Vla1R5cGVzSW5Tb3VyY2VQYWNrYWdlKFN0cmluZyBuYW1lLCBJUGFja2FnZUZyYWdtZW50IHBrZywgYm9vbGVhbiBwYXJ0aWFsTWF0Y2gsIGludCBhY2NlcHRGbGFncywgSUphdmFFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlJQ29tcGlsYXRpb25Vbml0W10gY29tcGlsYXRpb25Vbml0cyA9IG51bGw7CisJCXRyeSB7CisJCQljb21waWxhdGlvblVuaXRzID0gcGtnLmdldENvbXBpbGF0aW9uVW5pdHMoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQkJcmV0dXJuOyAvLyB0aGUgcGFja2FnZSBpcyBub3QgcHJlc2VudAorCQl9CisJCWludCBsZW5ndGg9IGNvbXBpbGF0aW9uVW5pdHMubGVuZ3RoOworCQlTdHJpbmcgbWF0Y2hOYW1lID0gbmFtZTsKKwkJaW50IGluZGV4PSBuYW1lLmluZGV4T2YoJyQnKTsKKwkJYm9vbGVhbiBwb3RlbnRpYWxNZW1iZXJUeXBlID0gZmFsc2U7CisJCVN0cmluZyBwb3RlbnRpYWxNYXRjaE5hbWUgPSBudWxsOworCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCS8vdGhlIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSBvZiB0aGUgaW5uZXIgdHlwZQorCQkJcG90ZW50aWFsTWF0Y2hOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJcG90ZW50aWFsTWVtYmVyVHlwZSA9IHRydWU7CisJCX0KKworCQkvKioKKwkJICogSW4gdGhlIGZvbGxvd2luZywgbWF0Y2hOYW1lIHdpbGwgbmV2ZXIgaGF2ZSB0aGUgZXh0ZW5zaW9uICIuamF2YSIgYW5kIAorCQkgKiB0aGUgY29tcGlsYXRpb25Vbml0cyBhbHdheXMgd2lsbC4gU28gYWRkIGl0IGlmIHdlJ3JlIGxvb2tpbmcgZm9yIAorCQkgKiBhbiBleGFjdCBtYXRjaC4KKwkJICovCisJCVN0cmluZyB1bml0TmFtZSA9IHBhcnRpYWxNYXRjaCA/IG1hdGNoTmFtZS50b0xvd2VyQ2FzZSgpIDogbWF0Y2hOYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgcG90ZW50aWFsVW5pdE5hbWUgPSBudWxsOworCQlpZiAocG90ZW50aWFsTWVtYmVyVHlwZSkgeworCQkJcG90ZW50aWFsVW5pdE5hbWUgPSBwYXJ0aWFsTWF0Y2ggPyBwb3RlbnRpYWxNYXRjaE5hbWUudG9Mb3dlckNhc2UoKSA6IHBvdGVudGlhbE1hdGNoTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHJlcXVlc3Rvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ9IGNvbXBpbGF0aW9uVW5pdHNbaV07CisJCQkKKwkJCS8vIHVuaXQgdG8gbG9vayBpbnNpZGUKKwkJCUlDb21waWxhdGlvblVuaXQgdW5pdFRvTG9va0luc2lkZSA9IG51bGw7CisJCQlNYXAgd29ya2luZ0NvcGllcyA9IChNYXApIHRoaXMudW5pdHNUb0xvb2tJbnNpZGUuZ2V0Q3VycmVudCgpOworCQkJaWYgKHdvcmtpbmdDb3BpZXMgIT0gbnVsbCAKKwkJCQkJJiYgKHVuaXRUb0xvb2tJbnNpZGUgPSAoSUNvbXBpbGF0aW9uVW5pdCl3b3JraW5nQ29waWVzLmdldChjb21waWxhdGlvblVuaXQpKSAhPSBudWxsKXsKKwkJCQkJY29tcGlsYXRpb25Vbml0ID0gdW5pdFRvTG9va0luc2lkZTsKKwkJCQl9CisJCQlpZiAoKHVuaXRUb0xvb2tJbnNpZGUgIT0gbnVsbCAmJiAhcG90ZW50aWFsTWVtYmVyVHlwZSkgfHwgbmFtZU1hdGNoZXModW5pdE5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgcGFydGlhbE1hdGNoKSkgeworCQkJCUlUeXBlW10gdHlwZXM9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJdHlwZXM9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCQkJY29udGludWU7IC8vIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBwcmVzZW50CisJCQkJfQorCQkJCWludCB0eXBlTGVuZ3RoPSB0eXBlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaj0gMDsgaiA8IHR5cGVMZW5ndGg7IGorKykgeworCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCXJldHVybjsKKwkJCQkJSVR5cGUgdHlwZT0gdHlwZXNbal07CisJCQkJCWlmIChuYW1lTWF0Y2hlcyhtYXRjaE5hbWUsIHR5cGUsIHBhcnRpYWxNYXRjaCkpIHsKKwkJCQkJCWlmIChhY2NlcHRUeXBlKHR5cGUsIGFjY2VwdEZsYWdzKSkgcmVxdWVzdG9yLmFjY2VwdFR5cGUodHlwZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBvdGVudGlhbE1lbWJlclR5cGUgJiYgbmFtZU1hdGNoZXMocG90ZW50aWFsVW5pdE5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgcGFydGlhbE1hdGNoKSkgeworCQkJCUlUeXBlW10gdHlwZXM9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJdHlwZXM9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCQkJY29udGludWU7IC8vIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBwcmVzZW50CisJCQkJfQorCQkJCWludCB0eXBlTGVuZ3RoPSB0eXBlcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaj0gMDsgaiA8IHR5cGVMZW5ndGg7IGorKykgeworCQkJCQlpZiAocmVxdWVzdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCXJldHVybjsKKwkJCQkJSVR5cGUgdHlwZT0gdHlwZXNbal07IAorCQkJCQlpZiAobmFtZU1hdGNoZXMocG90ZW50aWFsTWF0Y2hOYW1lLCB0eXBlLCBwYXJ0aWFsTWF0Y2gpKSB7CisJCQkJCQlzZWVrUXVhbGlmaWVkTWVtYmVyVHlwZXMobmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCgpKSwgdHlwZSwgcGFydGlhbE1hdGNoLCByZXF1ZXN0b3IsIGFjY2VwdEZsYWdzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQl9CisJfQorLyoqCisgKiBSZW1lbWJlcnMgYSBzZXQgb2YgY29tcGlsYXRpb24gdW5pdHMgdGhhdCB3aWxsIGJlIGxvb2tlZCBpbnNpZGUKKyAqIHdoZW4gbG9va2luZyB1cCBhIHR5cGUuIElmIHRoZXkgYXJlIHdvcmtpbmcgY29waWVzLCB0aGV5IHRha2UKKyAqIHByZWNlZGVuY2Ugb2YgdGhlaXIgY29tcGlsYXRpb24gdW5pdHMuCisgKiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyB0aGF0IG5vIHNwZWNpYWwgY29tcGlsYXRpb24gdW5pdHMgc2hvdWxkIGJlIHVzZWQuCisgKi8KK3B1YmxpYyB2b2lkIHNldFVuaXRzVG9Mb29rSW5zaWRlKElXb3JraW5nQ29weVtdIHVuaXRzVG9Mb29rSW5zaWRlKSB7CisJCisJaWYgKHVuaXRzVG9Mb29rSW5zaWRlID09IG51bGwpIHsKKwkJdGhpcy51bml0c1RvTG9va0luc2lkZS5zZXRDdXJyZW50KG51bGwpOyAKKwl9IGVsc2UgeworCQlIYXNoTWFwIHdvcmtpbmdDb3BpZXMgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLnVuaXRzVG9Mb29rSW5zaWRlLnNldEN1cnJlbnQod29ya2luZ0NvcGllcyk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB1bml0c1RvTG9va0luc2lkZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSVdvcmtpbmdDb3B5IHVuaXRUb0xvb2tJbnNpZGUgPSB1bml0c1RvTG9va0luc2lkZVtpXTsKKwkJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSAoSUNvbXBpbGF0aW9uVW5pdCl1bml0VG9Mb29rSW5zaWRlLmdldE9yaWdpbmFsRWxlbWVudCgpOworCQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKKwkJCQl3b3JraW5nQ29waWVzLnB1dChvcmlnaW5hbCwgdW5pdFRvTG9va0luc2lkZSk7CisJCQl9IGVsc2UgeworCQkJCXdvcmtpbmdDb3BpZXMucHV0KHVuaXRUb0xvb2tJbnNpZGUsIHVuaXRUb0xvb2tJbnNpZGUpOworCQkJfQorCQl9CisJfQorfQorCisJLyoqCisJICogTm90aWZpZXMgdGhlIGdpdmVuIHJlcXVlc3RvciBvZiBhbGwgdHlwZXMgKGNsYXNzZXMgYW5kIGludGVyZmFjZXMpIGluIHRoZQorCSAqIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gKHBvc3NpYmx5IHF1YWxpZmllZCkgbmFtZS4gQ2hlY2tzCisJICogdGhlIHJlcXVlc3RvciBhdCByZWd1bGFyIGludGVydmFscyB0byBzZWUgaWYgdGhlIHJlcXVlc3RvcgorCSAqIGhhcyBjYW5jZWxlZC4KKwkgKgorCSAqIEBwYXJhbSBwYXJ0aWFsTWF0Y2ggcGFydGlhbCBuYW1lIG1hdGNoZXMgcXVhbGlmeSB3aGVuIDxjb2RlPnRydWU8L2NvZGU+LAorCSAqICBvbmx5IGV4YWN0IG5hbWUgbWF0Y2hlcyBxdWFsaWZ5IHdoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2Vla1F1YWxpZmllZE1lbWJlclR5cGVzKFN0cmluZyBxdWFsaWZpZWROYW1lLCBJVHlwZSB0eXBlLCBib29sZWFuIHBhcnRpYWxNYXRjaCwgSUphdmFFbGVtZW50UmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGFjY2VwdEZsYWdzKSB7CisJCWlmICh0eXBlID09IG51bGwpCisJCQlyZXR1cm47CisJCUlUeXBlW10gdHlwZXM9IG51bGw7CisJCXRyeSB7CisJCQl0eXBlcz0gdHlwZS5nZXRUeXBlcygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQlyZXR1cm47IC8vIHRoZSBlbmNsb3NpbmcgdHlwZSBpcyBub3QgcHJlc2VudAorCQl9CisJCVN0cmluZyBtYXRjaE5hbWU9IHF1YWxpZmllZE5hbWU7CisJCWludCBpbmRleD0gcXVhbGlmaWVkTmFtZS5pbmRleE9mKCckJyk7CisJCWJvb2xlYW4gbmVzdGVkPSBmYWxzZTsKKwkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQltYXRjaE5hbWU9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCW5lc3RlZD0gdHJ1ZTsKKwkJfQorCQlpbnQgbGVuZ3RoPSB0eXBlcy5sZW5ndGg7CisJCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHJlcXVlc3Rvci5pc0NhbmNlbGVkKCkpCisJCQkJcmV0dXJuOworCQkJSVR5cGUgbWVtYmVyVHlwZT0gdHlwZXNbaV07CisJCQlpZiAobmFtZU1hdGNoZXMobWF0Y2hOYW1lLCBtZW1iZXJUeXBlLCBwYXJ0aWFsTWF0Y2gpKQorCQkJCWlmIChuZXN0ZWQpIHsKKwkJCQkJc2Vla1F1YWxpZmllZE1lbWJlclR5cGVzKHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSksIG1lbWJlclR5cGUsIHBhcnRpYWxNYXRjaCwgcmVxdWVzdG9yLCBhY2NlcHRGbGFncyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGFjY2VwdFR5cGUobWVtYmVyVHlwZSwgYWNjZXB0RmxhZ3MpKSByZXF1ZXN0b3IuYWNjZXB0TWVtYmVyVHlwZShtZW1iZXJUeXBlKTsKKwkJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Ob25Wb2lkTWV0aG9kUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Ob25Wb2lkTWV0aG9kUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlN2VhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05vblZvaWRNZXRob2RSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoUmVxdWVzdG9yOworCisvKioKKyAqCVRoaXMgY2xhc3MgbW9kaWZpZXMgdGhlIDxjb2RlPlNlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3RvcjwvY29kZT4ncyAKKyAqCWZ1bmN0aW9uYWxpdHkgYnkgb25seSBhY2NlcHRpbmcgbWV0aG9kcyB3aXRoIHJldHVybiB0eXBlcyB0aGF0IGFyZSBub3Qgdm9pZC4KKyAqLworcHVibGljIGNsYXNzIE5vblZvaWRNZXRob2RSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgeworLyoqCisgKiBOb25Wb2lkTWV0aG9kUmVxdWVzdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKiBAcGFyYW0gcmVxdWVzdG9yIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIE5vblZvaWRNZXRob2RSZXF1ZXN0b3IoSVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwlzdXBlcihyZXF1ZXN0b3IpOworfQorcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7CisJdHJ5IHsKKwkJaWYgKCFTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShtZXRob2QuZ2V0U2lnbmF0dXJlKCkpLmVxdWFscygiViIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXN1cGVyLmFjY2VwdE1ldGhvZChtZXRob2QpOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTYzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkJ1ZmZlckNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21wbGV0aW9uUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5Db21wbGV0aW9uRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOworCisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9ucyBvZiBqYXZhIGVsZW1lbnRzIHdoaWNoIGFyZSBJT3BlbmFibGUuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqIEBzZWUgSU9wZW5hYmxlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVuYWJsZSBleHRlbmRzIEphdmFFbGVtZW50IGltcGxlbWVudHMgSU9wZW5hYmxlLCBJQnVmZmVyQ2hhbmdlZExpc3RlbmVyIHsKKworcHJvdGVjdGVkIE9wZW5hYmxlKGludCB0eXBlLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKHR5cGUsIHBhcmVudCwgbmFtZSk7Cit9CisJLyoqCisJICogVGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGhhcyBjaGFuZ2VkLiBSZWdpc3RlcnMKKwkgKiB0aGlzIGVsZW1lbnQgYXMgYmVpbmcgb3V0IG9mIHN5bmNoIHdpdGggaXRzIGJ1ZmZlcidzIGNvbnRlbnRzLgorCSAqIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gY2xvc2VkLCB0aGlzIGVsZW1lbnQgaXMgc2V0IGFzIE5PVCBvdXQgb2YKKwkgKiBzeW5jaCB3aXRoIHRoZSBjb250ZW50cy4KKwkgKgorCSAqIEBzZWUgSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcgorCSAqLworCXB1YmxpYyB2b2lkIGJ1ZmZlckNoYW5nZWQoQnVmZmVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC5nZXRCdWZmZXIoKS5pc0Nsb3NlZCgpKSB7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRFbGVtZW50c091dE9mU3luY2hXaXRoQnVmZmVycygpLnJlbW92ZSh0aGlzKTsKKwkJCWdldEJ1ZmZlck1hbmFnZXIoKS5yZW1vdmVCdWZmZXIoZXZlbnQuZ2V0QnVmZmVyKCkpOworCQl9IGVsc2UgeworCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RWxlbWVudHNPdXRPZlN5bmNoV2l0aEJ1ZmZlcnMoKS5wdXQodGhpcywgdGhpcyk7CisJCX0KKwl9CQorLyoqCisgKiBVcGRhdGVzIHRoZSBpbmZvIG9iamVjdHMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBieQorICogcmVtb3ZpbmcgdGhlIGN1cnJlbnQgaW5mb3MsIGdlbmVyYXRpbmcgbmV3IGluZm9zLCBhbmQgdGhlbiBwbGFjaW5nCisgKiB0aGUgbmV3IGluZm9zIGludG8gdGhlIEphdmEgTW9kZWwgY2FjaGUgdGFibGVzLgorICovCitwcm90ZWN0ZWQgdm9pZCBidWlsZFN0cnVjdHVyZShPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCisJLy8gcmVtb3ZlIGV4aXN0aW5nIChvbGQpIGluZm9zCisJcmVtb3ZlSW5mbygpOworCUhhc2hNYXAgbmV3RWxlbWVudHMgPSBuZXcgSGFzaE1hcCgxMSk7CisJaW5mby5zZXRJc1N0cnVjdHVyZUtub3duKGdlbmVyYXRlSW5mb3MoaW5mbywgbW9uaXRvciwgbmV3RWxlbWVudHMsIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpKSk7CisJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RWxlbWVudHNPdXRPZlN5bmNoV2l0aEJ1ZmZlcnMoKS5yZW1vdmUodGhpcyk7CisJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3RWxlbWVudHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCUlKYXZhRWxlbWVudCBrZXkgPSAoSUphdmFFbGVtZW50KSBpdGVyLm5leHQoKTsKKwkJT2JqZWN0IHZhbHVlID0gbmV3RWxlbWVudHMuZ2V0KGtleSk7CisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnB1dEluZm8oa2V5LCB2YWx1ZSk7CisJfQorCQkKKwkvLyBhZGQgdGhlIGluZm8gZm9yIHRoaXMgYXQgdGhlIGVuZCwgdG8gZW5zdXJlIHRoYXQgYSBnZXRJbmZvIGNhbm5vdCByZXBseSBudWxsIGluIGNhc2UgdGhlIExSVSBjYWNoZSBuZWVkcworCS8vIHRvIGJlIGZsdXNoZWQuIE1pZ2h0IGxlYWQgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLgorCS8vIHNlZSBQUiAxRzJLNVM3OiBJVFBKQ09SRTpBTEwgLSBOUEUgd2hlbiBhY2Nlc3Npbmcgc291cmNlIGZvciBhIGJpbmFyeSB0eXBlCisJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucHV0SW5mbyh0aGlzLCBpbmZvKTsJCit9CisvKioKKyAqIENsb3NlIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgaWYgYW55LgorICovCitwcm90ZWN0ZWQgdm9pZCBjbG9zZUJ1ZmZlcihPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8pIHsKKwlpZiAoIWhhc0J1ZmZlcigpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KKwlJQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisJYnVmZmVyID0gZ2V0QnVmZmVyTWFuYWdlcigpLmdldEJ1ZmZlcih0aGlzKTsKKwlpZiAoYnVmZmVyICE9IG51bGwpIHsKKwkJYnVmZmVyLmNsb3NlKCk7CisJCWJ1ZmZlci5yZW1vdmVCdWZmZXJDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJfQorfQorLyoqCisgKiBUaGlzIGVsZW1lbnQgaXMgYmVpbmcgY2xvc2VkLiAgRG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLgorICovCitwcm90ZWN0ZWQgdm9pZCBjbG9zaW5nKE9iamVjdCBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlPcGVuYWJsZUVsZW1lbnRJbmZvIG9wZW5hYmxlSW5mbyA9IChPcGVuYWJsZUVsZW1lbnRJbmZvKSBpbmZvOworCWNsb3NlQnVmZmVyKG9wZW5hYmxlSW5mbyk7CisJc3VwZXIuY2xvc2luZyhpbmZvKTsKK30KKy8qKgorICogQHNlZSBJQ29kZUFzc2lzdAorICovCitwcm90ZWN0ZWQgdm9pZCBjb2RlQ29tcGxldGUob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IGN1LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcCwgaW50IHBvc2l0aW9uLCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29kZUFzc2lzdC5udWxsUmVxdWVzdG9yIikpOyAvLyROT04tTkxTLTEkCisJfQorCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKCk7CisJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHBvc2l0aW9uIDwgLTEgfHwgcG9zaXRpb24gPiBidWZmZXIuZ2V0TGVuZ3RoKCkpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5ERVhfT1VUX09GX0JPVU5EUykpOworCX0KKwlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSAoU2VhcmNoYWJsZUVudmlyb25tZW50KSAoKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpKS5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJTmFtZUxvb2t1cCBuYW1lTG9va3VwID0gKChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKSkuZ2V0TmFtZUxvb2t1cCgpOworCWVudmlyb25tZW50LnVuaXRUb1NraXAgPSB1bml0VG9Ta2lwOworCisJQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvcixuYW1lTG9va3VwKSwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwllbmdpbmUuY29tcGxldGUoY3UsIHBvc2l0aW9uLCAwKTsKKwllbnZpcm9ubWVudC51bml0VG9Ta2lwID0gbnVsbDsKK30KKy8qKgorICogQHNlZSBJQ29kZUFzc2lzdAorICovCitwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gY29kZVNlbGVjdChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgY3UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNlbGVjdGlvblJlcXVlc3RvciByZXF1ZXN0b3I9IG5ldyBTZWxlY3Rpb25SZXF1ZXN0b3IoKChKYXZhUHJvamVjdClnZXRKYXZhUHJvamVjdCgpKS5nZXROYW1lTG9va3VwKCksIHRoaXMpOworCXRoaXMuY29kZVNlbGVjdChjdSwgb2Zmc2V0LCBsZW5ndGgsIHJlcXVlc3Rvcik7CisJcmV0dXJuIHJlcXVlc3Rvci5nZXRFbGVtZW50cygpOworfQorLyoqCisgKiBAc2VlIElDb2RlQXNzaXN0CisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvZGVTZWxlY3Qob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IGN1LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJU2VsZWN0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXIoKTsKKwlpZiAoYnVmZmVyID09IG51bGwpIHsKKwkJcmV0dXJuOworCX0KKwlpbnQgZW5kPSBidWZmZXIuZ2V0TGVuZ3RoKCk7CisJaWYgKG9mZnNldCA8IDAgfHwgbGVuZ3RoIDwgMCB8fCBvZmZzZXQgKyBsZW5ndGggPiBlbmQgKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOREVYX09VVF9PRl9CT1VORFMpKTsKKwl9CisKKwkvLyBmaXggZm9yIDFGVkdHS0YKKwlJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9ICgoSmF2YVByb2plY3QpZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCQorCS8vIGZpeCBmb3IgMUZWWEdESworCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIEphdmFDb3JlLmdldE9wdGlvbnMoKSk7CisJZW5naW5lLnNlbGVjdChjdSwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGggLSAxKTsKK30KKy8qKgorICogUmV0dXJucyBhIG5ldyBlbGVtZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudC4KKyAqLworcHJvdGVjdGVkIE9wZW5hYmxlRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oKSB7CisJcmV0dXJuIG5ldyBPcGVuYWJsZUVsZW1lbnRJbmZvKCk7Cit9CisKKy8qKgorICogQnVpbGRzIHRoaXMgZWxlbWVudCdzIHN0cnVjdHVyZSBhbmQgcHJvcGVydGllcyBpbiB0aGUgZ2l2ZW4KKyAqIGluZm8gb2JqZWN0LCBiYXNlZCBvbiB0aGlzIGVsZW1lbnQncyBjdXJyZW50IGNvbnRlbnRzIChpLmUuIGJ1ZmZlcgorICogY29udGVudHMgaWYgdGhpcyBlbGVtZW50IGhhcyBhbiBvcGVuIGJ1ZmZlciwgb3IgcmVzb3VyY2UgY29udGVudHMKKyAqIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG9wZW4gYnVmZmVyKS4gQ2hpbGRyZW4KKyAqIGFyZSBwbGFjZWQgaW4gdGhlIGdpdmVuIG5ld0VsZW1lbnRzIHRhYmxlIChub3RlLCB0aGlzIGVsZW1lbnQKKyAqIGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkIGluIHRoZSBuZXdFbGVtZW50cyB0YWJsZSkuIFJldHVybnMgdHJ1ZQorICogaWYgc3VjY2Vzc2Z1bCwgb3IgZmFsc2UgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgZGV0ZXJtaW5pbmcKKyAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBnZW5lcmF0ZUluZm9zKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSwgTWFwIG5ld0VsZW1lbnRzLCBJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworLyoqCisgKiBOb3RlOiBhIGJ1ZmZlciB3aXRoIG5vIHVuc2F2ZWQgY2hhbmdlcyBjYW4gYmUgY2xvc2VkIGJ5IHRoZSBKYXZhIE1vZGVsCisgKiBzaW5jZSBpdCBoYXMgYSBmaW5pdGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dlZCBvcGVuIGF0IG9uZSB0aW1lLiBJZiB0aGlzCisgKiBpcyB0aGUgZmlyc3QgdGltZSBhIHJlcXVlc3QgaXMgYmVpbmcgbWFkZSBmb3IgdGhlIGJ1ZmZlciwgYW4gYXR0ZW1wdCBpcworICogbWFkZSB0byBjcmVhdGUgYW5kIGZpbGwgdGhpcyBlbGVtZW50J3MgYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuCisgKiBjbG9zZWQgc2luY2UgaXQgd2FzIGZpcnN0IG9wZW5lZCwgdGhlIGJ1ZmZlciBpcyByZS1jcmVhdGVkLgorICogCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoaGFzQnVmZmVyKCkpIHsKKwkJLy8gZW5zdXJlIGVsZW1lbnQgaXMgb3BlbgorCQlpZiAoIWlzT3BlbigpKSB7CisJCQlnZXRFbGVtZW50SW5mbygpOworCQl9CisJCUlCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyTWFuYWdlcigpLmdldEJ1ZmZlcih0aGlzKTsKKwkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisJCQkvLyB0cnkgdG8gKHJlKW9wZW4gYSBidWZmZXIKKwkJCWJ1ZmZlciA9IG9wZW5CdWZmZXIobnVsbCk7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisKKy8qKgorICogQW5zd2VycyB0aGUgYnVmZmVyIGZhY3RvcnkgdG8gdXNlIGZvciBjcmVhdGluZyBuZXcgYnVmZmVycworICovCitwdWJsaWMgSUJ1ZmZlckZhY3RvcnkgZ2V0QnVmZmVyRmFjdG9yeSgpeworCXJldHVybiBnZXRCdWZmZXJNYW5hZ2VyKCkuZ2V0RGVmYXVsdEJ1ZmZlckZhY3RvcnkoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBidWZmZXIgbWFuYWdlciBmb3IgdGhpcyBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgQnVmZmVyTWFuYWdlciBnZXRCdWZmZXJNYW5hZ2VyKCkgeworCXJldHVybiBCdWZmZXJNYW5hZ2VyLmdldERlZmF1bHRCdWZmZXJNYW5hZ2VyKCk7Cit9CisvKioKKyAqIFJldHVybiBteSB1bmRlcmx5aW5nIHJlc291cmNlLiBFbGVtZW50cyB0aGF0IG1heSBub3QgaGF2ZSBhCisgKiBjb3JyZXNwb25kaW5nIHJlc291cmNlIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Cit9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZSgpIHsKKwlyZXR1cm4gdGhpczsJCit9CisKKworCisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZlBhcmVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlpZiAocGFyZW50UmVzb3VyY2UgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaW50IHR5cGUgPSBwYXJlbnRSZXNvdXJjZS5nZXRUeXBlKCk7CisJaWYgKHR5cGUgPT0gSVJlc291cmNlLkZPTERFUiB8fCB0eXBlID09IElSZXNvdXJjZS5QUk9KRUNUKSB7CisJCUlDb250YWluZXIgZm9sZGVyID0gKElDb250YWluZXIpIHBhcmVudFJlc291cmNlOworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmb2xkZXIuZmluZE1lbWJlcihmTmFtZSk7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmVzb3VyY2U7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gcGFyZW50UmVzb3VyY2U7CisJfQorfQorCitwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJCisJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCWlmIChyb290ID09IG51bGwgfHwgcm9vdCA9PSB0aGlzIHx8ICFyb290LmlzQXJjaGl2ZSgpKSB7CisJCXJldHVybiBwYXJlbnRFeGlzdHMoKSAmJiByZXNvdXJjZUV4aXN0cygpOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5leGlzdHMoKTsKKwl9Cit9CQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgbWF5IGhhdmUgYW4gYXNzb2NpYXRlZCBzb3VyY2UgYnVmZmVyLAorICogb3RoZXJ3aXNlIGZhbHNlLiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgYXMgcmVxdWlyZWQuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGhhc0J1ZmZlcigpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSVBhcmVudCAKKyAqLworcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwOworfQorLyoqCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgYm9vbGVhbiBoYXNVbnNhdmVkQ2hhbmdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb257CisJCisJaWYgKGlzUmVhZE9ubHkoKSB8fCAhaXNPcGVuKCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlJQnVmZmVyIGJ1ZiA9IHRoaXMuZ2V0QnVmZmVyKCk7CisJaWYgKGJ1ZiAhPSBudWxsICYmIGJ1Zi5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkvLyBmb3IgcGFja2FnZSBmcmFnbWVudHMsIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMsIGFuZCBwcm9qZWN0cyBtdXN0IGNoZWNrIG9wZW4gYnVmZmVycworCS8vIHRvIHNlZSBpZiB0aGV5IGhhdmUgYW4gY2hpbGQgd2l0aCB1bnNhdmVkIGNoYW5nZXMKKwlpZiAoZkxFVHlwZSA9PSBQQUNLQUdFX0ZSQUdNRU5UIHx8CisJCWZMRVR5cGUgPT0gUEFDS0FHRV9GUkFHTUVOVF9ST09UIHx8CisJCWZMRVR5cGUgPT0gSkFWQV9QUk9KRUNUIHx8CisJCWZMRVR5cGUgPT0gSkFWQV9NT0RFTCkgeyAvLyBmaXggZm9yIDFGV05NSEgKKwkJRW51bWVyYXRpb24gb3BlbkJ1ZmZlcnM9IGdldEJ1ZmZlck1hbmFnZXIoKS5nZXRPcGVuQnVmZmVycygpOworCQl3aGlsZSAob3BlbkJ1ZmZlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCUlCdWZmZXIgYnVmZmVyPSAoSUJ1ZmZlcilvcGVuQnVmZmVycy5uZXh0RWxlbWVudCgpOworCQkJaWYgKGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7CisJCQkJSUphdmFFbGVtZW50IG93bmVyPSAoSUphdmFFbGVtZW50KWJ1ZmZlci5nZXRPd25lcigpOworCQkJCWlmIChpc0FuY2VzdG9yT2Yob3duZXIpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSBhcyByZXF1aXJlZC4KKyAqCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisJc3luY2hyb25pemVkKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKXsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZm8odGhpcykgIT0gbnVsbDsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlcHJlc2VudHMgYSBzb3VyY2UgZWxlbWVudC4KKyAqIE9wZW5hYmxlIHNvdXJjZSBlbGVtZW50cyBoYXZlIGFuIGFzc29jaWF0ZWQgYnVmZmVyIGNyZWF0ZWQKKyAqIHdoZW4gdGhleSBhcmUgb3BlbmVkLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZUVsZW1lbnQoKSB7CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgdm9pZCBtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoIWlzQ29uc2lzdGVudCgpKSB7CisJCWJ1aWxkU3RydWN0dXJlKChPcGVuYWJsZUVsZW1lbnRJbmZvKWdldEVsZW1lbnRJbmZvKCksIHBtKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSU9wZW5hYmxlCisgKi8KK3B1YmxpYyB2b2lkIG9wZW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFpc09wZW4oKSkgeworCQl0aGlzLm9wZW5XaGVuQ2xvc2VkKHBtKTsKKwl9Cit9CisKKy8qKgorICogT3BlbnMgYSBidWZmZXIgb24gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWxlbWVudCwgYW5kIHJldHVybnMKKyAqIHRoZSBidWZmZXIsIG9yIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgb3BlbmluZyBmYWlscy4KKyAqIEJ5IGRlZmF1bHQsIGRvIG5vdGhpbmcgLSBzdWJjbGFzc2VzIHRoYXQgaGF2ZSBidWZmZXJzCisgKiBtdXN0IG92ZXJyaWRlIGFzIHJlcXVpcmVkLgorICovCitwcm90ZWN0ZWQgSUJ1ZmZlciBvcGVuQnVmZmVyKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBudWxsOworfQorCisvKioKKyAqIAlPcGVuIHRoZSBwYXJlbnQgZWxlbWVudCBpZiBuZWNlc3NhcnkKKyAqIAorICovCitwcm90ZWN0ZWQgdm9pZCBvcGVuUGFyZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJT3BlbmFibGUgb3BlbmFibGVQYXJlbnQgPSAoT3BlbmFibGUpZ2V0T3BlbmFibGVQYXJlbnQoKTsKKwlpZiAob3BlbmFibGVQYXJlbnQgIT0gbnVsbCkgeworCQlpZiAoIW9wZW5hYmxlUGFyZW50LmlzT3BlbigpKXsKKwkJCW9wZW5hYmxlUGFyZW50Lm9wZW5XaGVuQ2xvc2VkKHBtKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBPcGVuIGFuIDxjb2RlPk9wZW5hYmxlPC9jb2RlPiB0aGF0IGlzIGtub3duIHRvIGJlIGNsb3NlZCAobm8gY2hlY2sgZm9yIDxjb2RlPmlzT3BlbigpPC9jb2RlPikuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG9wZW5XaGVuQ2xvc2VkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRyeSB7CisJCQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiT1BFTklORyBFbGVtZW50ICgiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpKyIpOiAiICsgdGhpcy50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKwkJCisJCS8vIDEpIFBhcmVudCBtdXN0IGJlIG9wZW4gLSBvcGVuIHRoZSBwYXJlbnQgaWYgbmVjZXNzYXJ5CisJCW9wZW5QYXJlbnQocG0pOworCisJCS8vIDIpIGNyZWF0ZSB0aGUgbmV3IGVsZW1lbnQgaW5mbyBhbmQgb3BlbiBhIGJ1ZmZlciBpZiBuZWVkZWQKKwkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvID0gY3JlYXRlRWxlbWVudEluZm8oKTsKKwkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIGlzU291cmNlRWxlbWVudCgpKSB7CisJCQl0aGlzLm9wZW5CdWZmZXIocG0pOworCQl9IAorCisJCS8vIDMpIGJ1aWxkIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG9wZW5hYmxlCisJCWJ1aWxkU3RydWN0dXJlKGluZm8sIHBtKTsKKworCQkvLyA0KSBhbnl0aGluZyBzcGVjaWFsCisJCW9wZW5pbmcoaW5mbyk7CisJCQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IFBhY2thZ2UgY2FjaGUgc2l6ZSA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5wa2dTaXplKCkpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IE9wZW5hYmxlIGNhY2hlIGZpbGxpbmcgcmF0aW8gPSAiICsgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2FjaGUub3BlbmFibGVGaWxsaW5nUmF0aW8oKSArICIlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKworCQkvLyBpZiBhbnkgcHJvYmxlbXMgb2NjdXJpbmcgb3Blbm5pbmcgdGhlIGVsZW1lbnQsIGVuc3VyZSB0aGF0IGl0J3MgaW5mbworCQkvLyBkb2VzIG5vdCByZW1haW4gaW4gdGhlIGNhY2hlCShzb21lIGVsZW1lbnRzLCBwcmUtY2FjaGUgdGhlaXIgaW5mbworCQkvLyBhcyB0aGV5IGFyZSBiZWluZyBvcGVuZWQpLgorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUluZm8odGhpcyk7CisJCXRocm93IGU7CisJfQorfQorCisvKioKKyAqICBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhcmVudCBleGlzdHMgKG51bGwgcGFyZW50IGlzIGFuc3dlcmluZyB0cnVlKQorICogCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHBhcmVudEV4aXN0cygpeworCQorCUlKYXZhRWxlbWVudCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpOworCWlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJcmV0dXJuIHBhcmVudC5leGlzdHMoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb3IgYXNzb2NpYXRlZCBmaWxlIGV4aXN0cworICovCitwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZUV4aXN0cygpIHsKKwkKKwlyZXR1cm4gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCB0aGlzLmdldFBhdGgoKSwgdHJ1ZSkgIT0gbnVsbDsKK30KKworLyoqCisgKiBAc2VlIElPcGVuYWJsZQorICovCitwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgcG0sIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChpc1JlYWRPbmx5KCkgfHwgdGhpcy5nZXRSZXNvdXJjZSgpLmlzUmVhZE9ubHkoKSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIHRoaXMpKTsKKwl9CisJSUJ1ZmZlciBidWYgPSBnZXRCdWZmZXIoKTsKKwlpZiAoYnVmICE9IG51bGwpIHsgLy8gc29tZSBPcGVuYWJsZXMgKGxpa2UgYSBKYXZhUHJvamVjdCkgZG9uJ3QgaGF2ZSBhIGJ1ZmZlcgorCQlidWYuc2F2ZShwbSwgZm9yY2UpOworCQl0aGlzLm1ha2VDb25zaXN0ZW50KHBtKTsgLy8gdXBkYXRlIHRoZSBlbGVtZW50IGluZm8gb2YgdGhpcyBlbGVtZW50CisJfQorfQorCisvKioKKyAqIEZpbmQgZW5jbG9zaW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpZiBhbnkKKyAqLworcHVibGljIFBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKKwlJSmF2YUVsZW1lbnQgY3VycmVudCA9IHRoaXM7CisJZG8geworCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIFBhY2thZ2VGcmFnbWVudFJvb3QpIHJldHVybiAoUGFja2FnZUZyYWdtZW50Um9vdCljdXJyZW50OworCQljdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKwl9IHdoaWxlKGN1cnJlbnQgIT0gbnVsbCk7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSUNvZGVBc3Npc3QKKyAqIEBkZXByZWNhdGVkIC0gdXNlIGNvZGVDb21wbGV0ZShJQ29tcGlsYXRpb25Vbml0LCBJQ29tcGlsYXRpb25Vbml0LCBpbnQsIElDb21wbGV0aW9uUmVxdWVzdG9yKSBpbnN0ZWFkCisgKi8KK3Byb3RlY3RlZCB2b2lkIGNvZGVDb21wbGV0ZShvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgY3UsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCB1bml0VG9Ta2lwLCBpbnQgcG9zaXRpb24sIGZpbmFsIElDb2RlQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJaWYgKHJlcXVlc3RvciA9PSBudWxsKXsKKwkJY29kZUNvbXBsZXRlKGN1LCB1bml0VG9Ta2lwLCBwb3NpdGlvbiwgKElDb21wbGV0aW9uUmVxdWVzdG9yKW51bGwpOworCQlyZXR1cm47CisJfQorCWNvZGVDb21wbGV0ZSgKKwkJY3UsCisJCXVuaXRUb1NraXAsCisJCXBvc2l0aW9uLAorCQluZXcgSUNvbXBsZXRpb25SZXF1ZXN0b3IoKXsKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEFub255bW91c1R5cGUoY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSBzdXBlclR5cGVOYW1lLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgeworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRFcnJvcihJUHJvYmxlbSBlcnJvcikgeworCQkJCWlmICh0cnVlKSByZXR1cm47IC8vIHdhcyBkaXNhYmxlZCBpbiAxLjAKKworCQkJCXRyeSB7CisJCQkJCUlNYXJrZXIgbWFya2VyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5UUkFOU0lFTlRfUFJPQkxFTSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5JRCwgZXJyb3IuZ2V0SUQoKSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBlcnJvci5nZXRTb3VyY2VTdGFydCgpKTsKKwkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlcnJvci5nZXRTb3VyY2VFbmQoKSArIDEpOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGVycm9yLmdldFNvdXJjZUxpbmVOdW1iZXIoKSk7CisJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBlcnJvci5nZXRNZXNzYWdlKCkpOworCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOworCQkJCQlyZXF1ZXN0b3IuYWNjZXB0RXJyb3IobWFya2VyKTsKKwkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CisJCQkJfQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gbmFtZSwgY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIG5hbWUsIHR5cGVQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIGNvbXBsZXRpb25OYW1lLCBtb2RpZmllcnMsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLGNoYXJbXSBpbnRlcmZhY2VOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKHBhY2thZ2VOYW1lLCBpbnRlcmZhY2VOYW1lLCBjb21wbGV0aW9uTmFtZSwgbW9kaWZpZXJzLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0S2V5d29yZChjaGFyW10ga2V5d29yZE5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEtleXdvcmQoa2V5d29yZE5hbWUsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRMYWJlbChjaGFyW10gbGFiZWxOYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCXJlcXVlc3Rvci5hY2NlcHRMYWJlbChsYWJlbE5hbWUsIGNvbXBsZXRpb25TdGFydCwgY29tcGxldGlvbkVuZCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKGNoYXJbXSBuYW1lLGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2QoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsY2hhcltdIHNlbGVjdG9yLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSxjaGFyW10gcmV0dXJuVHlwZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJLy8gc2tpcCBwYXJhbWV0ZXIgbmFtZXMKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcywgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgY29tcGxldGlvbk5hbWUsIG1vZGlmaWVycywgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLGNoYXJbXSBzZWxlY3RvcixjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsY2hhcltdIHJldHVyblR5cGVOYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgbW9kaWZpZXJzLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCS8vIGlnbm9yZQorCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0TW9kaWZpZXIoY2hhcltdIG1vZGlmaWVyTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKKwkJCQlyZXF1ZXN0b3IuYWNjZXB0TW9kaWZpZXIobW9kaWZpZXJOYW1lLCBjb21wbGV0aW9uU3RhcnQsIGNvbXBsZXRpb25FbmQpOworCQkJfQorCQkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBjb21wbGV0aW9uU3RhcnQsaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpeworCQkJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VOYW1lLCBjb21wbGV0aW9uTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLGNoYXJbXSB0eXBlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJcmVxdWVzdG9yLmFjY2VwdFR5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBjb21wbGV0aW9uTmFtZSwgY29tcGxldGlvblN0YXJ0LCBjb21wbGV0aW9uRW5kKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFZhcmlhYmxlTmFtZShjaGFyW10gdHlwZVBhY2thZ2VOYW1lLGNoYXJbXSB0eXBlTmFtZSxjaGFyW10gbmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0pOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGVFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGVFbGVtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjViMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZUVsZW1lbnRJbmZvLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKKy8qKiBFbGVtZW50IGluZm8gZm9yIElPcGVuYWJsZSBlbGVtZW50cy4gKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgT3BlbmFibGVFbGVtZW50SW5mbyBleHRlbmRzIEphdmFFbGVtZW50SW5mbyB7CisJCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUzNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsNDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkxSVUNhY2hlOworCisvKioKKyAqCVRoZSA8Y29kZT5PdmVyZmxvd2luZ0xSVUNhY2hlPC9jb2RlPiBpcyBhbiBMUlVDYWNoZSB3aGljaCBhdHRlbXB0cworICoJdG8gbWFpbnRhaW4gYSBzaXplIGVxdWFsIG9yIGxlc3MgdGhhbiBpdHMgPGNvZGU+ZlNwYWNlTGltaXQ8L2NvZGU+CisgKglieSByZW1vdmluZyB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbGVtZW50cy4KKyAqCisgKgk8cD5UaGUgY2FjaGUgd2lsbCByZW1vdmUgZWxlbWVudHMgd2hpY2ggc3VjY2Vzc2Z1bGx5IGNsb3NlIGFuZCBhbGwKKyAqCWVsZW1lbnRzIHdoaWNoIGFyZSBleHBsaWNpdGx5IHJlbW92ZWQuCisgKgorICoJPHA+SWYgdGhlIGNhY2hlIGNhbm5vdCByZW1vdmUgZW5vdWdoIG9sZCBlbGVtZW50cyB0byBhZGQgbmV3IGVsZW1lbnRzCisgKglpdCB3aWxsIGdyb3cgYmV5b25kIDxjb2RlPmZTcGFjZUxpbWl0PC9jb2RlPi4gTGF0ZXIsIGl0IHdpbGwgYXR0ZW1wdCB0byAKKyAqCXNoaW5rIGJhY2sgdG8gdGhlIG1heGltdW0gc3BhY2UgbGltaXQuCisgKgorICoJVGhlIG1ldGhvZCA8Y29kZT5jbG9zZTwvY29kZT4gc2hvdWxkIGF0dGVtcHQgdG8gY2xvc2UgdGhlIGVsZW1lbnQuICBJZgorICoJdGhlIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNsb3NlZCBpdCB3aWxsIHJldHVybiB0cnVlIGFuZCB0aGUgZWxlbWVudCB3aWxsCisgKgliZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLiAgT3RoZXJ3aXNlIHRoZSBlbGVtZW50IHdpbGwgcmVtYWluIGluIHRoZSBjYWNoZS4KKyAqCisgKgk8cD5UaGUgY2FjaGUgaW1wbGljaXRseSBhdHRlbXB0cyBzaHJpbmtzIG9uIGNhbGxzIHRvIDxjb2RlPnB1dDwvY29kZT5hbmQKKyAqCTxjb2RlPnNldFNwYWNlTGltaXQ8L2NvZGU+LiAgRXhwbGljaXRseSBjYWxsaW5nIHRoZSA8Y29kZT5zaHJpbms8L2NvZGU+IG1ldGhvZAorICoJd2lsbCBhbHNvIGNhdXNlIHRoZSBjYWNoZSB0byBhdHRlbXB0IHRvIHNocmluay4KKyAqCisgKgk8cD5UaGUgY2FjaGUgY2FsY3VsYXRlcyB0aGUgdXNlZCBzcGFjZSBvZiBhbGwgZWxlbWVudHMgd2hpY2ggaW1wbGVtZW50IAorICoJPGNvZGU+SUxSVUNhY2hlYWJsZTwvY29kZT4uICBBbGwgb3RoZXIgZWxlbWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgb2Ygc2l6ZSBvbmUuCisgKgorICoJPHA+VXNlIHRoZSA8Y29kZT4jcGVlayhPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+I2Rpc2FibGVUaW1lc3RhbXBzKCk8L2NvZGU+IG1ldGhvZCB0bworICoJY2lyY3VtdmVudCB0aGUgdGltZXN0YW1wIGZlYXR1cmUgb2YgdGhlIGNhY2hlLiAgVGhpcyBmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKKyAqCW9ubHkgd2hlbiB0aGUgPGNvZGU+I2Nsb3NlKExSVUNhY2hlRW50cnkpPC9jb2RlPiBtZXRob2QgY2F1c2VzIGNoYW5nZXMgdG8gdGhlIGNhY2hlLiAgCisgKglGb3IgZXhhbXBsZSwgaWYgYSBwYXJlbnQgY2xvc2VzIGl0cyBjaGlsZHJlbiB3aGVuIDwvY29kZT4jY2xvc2UoTFJVQ2FjaGVFbnRyeSk8L2NvZGU+IGlzIGNhbGxlZCwgCisgKglpdCBzaG91bGQgYmUgY2FyZWZ1bCBub3QgdG8gY2hhbmdlIHRoZSBMUlUgbGlua2VkIGxpc3QuICBJdCBjYW4gYmUgc3VyZSBpdCBpcyBub3QgY2F1c2luZyAKKyAqCXByb2JsZW1zIGJ5IGNhbGxpbmcgPGNvZGU+I3BlZWsoT2JqZWN0KTwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT4jZ2V0KE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KKyAqCQorICoJQHNlZSBMUlVDYWNoZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3ZlcmZsb3dpbmdMUlVDYWNoZSBleHRlbmRzIExSVUNhY2hlIHsKKwkvKioKKwkgKiBJbmRpY2F0ZXMgaWYgdGhlIGNhY2hlIGhhcyBiZWVuIG92ZXIgZmlsbGVkIGFuZCBieSBob3cgbXVjaC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZPdmVyZmxvdyA9IDA7CisJLyoqCisJICoJSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRpbWVzdGFtcHMgc2hvdWxkIGJlIHVwZGF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmVGltZXN0YW1wc09uID0gdHJ1ZTsKKwkvKioKKwkgKglJbmRpY2F0ZXMgaG93IG11Y2ggc3BhY2Ugc2hvdWxkIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBjYWNoZSBvdmVyZmxvd3MuCisJICoJSW5pdGFsIGxvYWQgZmFjdG9yIG9mIG9uZSB0aGlyZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZG91YmxlIGZMb2FkRmFjdG9yID0gMC4zMzM7CisvKioKKyAqIENyZWF0ZXMgYSBPdmVyZmxvd2luZ0xSVUNhY2hlLiAKKyAqIEBwYXJhbSBzaXplIFNpemUgbGltaXQgb2YgY2FjaGUuCisgKi8KK3B1YmxpYyBPdmVyZmxvd2luZ0xSVUNhY2hlKGludCBzaXplKSB7CisJdGhpcyhzaXplLCAwKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIE92ZXJmbG93aW5nTFJVQ2FjaGUuIAorICogQHBhcmFtIHNpemUgU2l6ZSBsaW1pdCBvZiBjYWNoZS4KKyAqIEBwYXJhbSBvdmVyZmxvdyBTaXplIG9mIHRoZSBvdmVyZmxvdy4KKyAqLworcHVibGljIE92ZXJmbG93aW5nTFJVQ2FjaGUoaW50IHNpemUsIGludCBvdmVyZmxvdykgeworCXN1cGVyKHNpemUpOworCWZPdmVyZmxvdyA9IG92ZXJmbG93OworfQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgY2FjaGUgY29udGFpbmluZyB0aGUgc2FtZSBjb250ZW50cy4KKwkgKgorCSAqIEByZXR1cm4gTmV3IGNvcHkgb2YgdGhpcyBvYmplY3QuCisJICovCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJCisJCU92ZXJmbG93aW5nTFJVQ2FjaGUgbmV3Q2FjaGUgPSAoT3ZlcmZsb3dpbmdMUlVDYWNoZSluZXdJbnN0YW5jZShmU3BhY2VMaW1pdCwgZk92ZXJmbG93KTsKKwkJTFJVQ2FjaGVFbnRyeSBxRW50cnk7CisJCQorCQkvKiBQcmVzZXJ2ZSBvcmRlciBvZiBlbnRyaWVzIGJ5IGNvcHlpbmcgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0ICovCisJCXFFbnRyeSA9IHRoaXMuZkVudHJ5UXVldWVUYWlsOworCQl3aGlsZSAocUVudHJ5ICE9IG51bGwpIHsKKwkJCW5ld0NhY2hlLnByaXZhdGVBZGQgKHFFbnRyeS5fZktleSwgcUVudHJ5Ll9mVmFsdWUsIHFFbnRyeS5fZlNwYWNlKTsKKwkJCXFFbnRyeSA9IHFFbnRyeS5fZlByZXZpb3VzOworCQl9CisJCXJldHVybiBuZXdDYWNoZTsKKwl9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzdWNjZXNzZnVsbHkgY2xvc2VkIGFuZAorICogcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSwgb3RoZXJ3aXNlIGZhbHNlLgorICoKKyAqIDxwPk5PVEU6IHRoaXMgdHJpZ2dlcnMgYW4gZXh0ZXJuYWwgcmVtb3ZlIGZyb20gdGhlIGNhY2hlCisgKiBieSBjbG9zaW5nIHRoZSBvYmVqY3QuCisgKgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjbG9zZShMUlVDYWNoZUVudHJ5IGVudHJ5KTsKKwkvKioKKwkgKglSZXR1cm5zIGFuIGVudW1lcmF0b3Igb2YgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUgd2l0aCB0aGUgbW9zdAorCSAqCXJlY2VudGx5IHVzZWQgZmlyc3QuCisJICovCisJcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgeworCQlpZiAoZkVudHJ5UXVldWUgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgTFJVQ2FjaGVFbnVtZXJhdG9yKG51bGwpOworCQlMUlVDYWNoZUVudW1lcmF0b3IuTFJVRW51bWVyYXRvckVsZW1lbnQgaGVhZCA9IAorCQkJbmV3IExSVUNhY2hlRW51bWVyYXRvci5MUlVFbnVtZXJhdG9yRWxlbWVudChmRW50cnlRdWV1ZS5fZlZhbHVlKTsKKwkJTFJVQ2FjaGVFbnRyeSBjdXJyZW50RW50cnkgPSBmRW50cnlRdWV1ZS5fZk5leHQ7CisJCUxSVUNhY2hlRW51bWVyYXRvci5MUlVFbnVtZXJhdG9yRWxlbWVudCBjdXJyZW50RWxlbWVudCA9IGhlYWQ7CisJCXdoaWxlKGN1cnJlbnRFbnRyeSAhPSBudWxsKSB7CisJCQljdXJyZW50RWxlbWVudC5mTmV4dCA9IG5ldyBMUlVDYWNoZUVudW1lcmF0b3IuTFJVRW51bWVyYXRvckVsZW1lbnQoY3VycmVudEVudHJ5Ll9mVmFsdWUpOworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5mTmV4dDsKKwkJCQorCQkJY3VycmVudEVudHJ5ID0gY3VycmVudEVudHJ5Ll9mTmV4dDsKKwkJfQorCQlyZXR1cm4gbmV3IExSVUNhY2hlRW51bWVyYXRvcihoZWFkKTsKKwl9CisJcHVibGljIGRvdWJsZSBmaWxsaW5nUmF0aW8oKSB7CisJCXJldHVybiAoZkN1cnJlbnRTcGFjZSArIGZPdmVyZmxvdykgKiAxMDAuMCAvIGZTcGFjZUxpbWl0OworCX0KKwkvKioKKwkgKiBGb3IgaW50ZXJuYWwgdGVzdGluZyBvbmx5LgorCSAqIFRoaXMgbWV0aG9kIGV4cG9zZWQgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcyEKKwkgKgorCSAqIEByZXR1cm4gSGFzaHRhYmxlIG9mIGVudHJpZXMKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkhhc2h0YWJsZSBnZXRFbnRyeVRhYmxlKCkgeworCQlyZXR1cm4gZkVudHJ5VGFibGU7CisJfQorLyoqCisgKiBSZXR1cm5zIHRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGNhY2hlLiAgVGhlIGxvYWQgZmFjdG9yIGRldGVybWluZXMgaG93IAorICogbXVjaCBzcGFjZSBpcyByZWNsYWltZWQgd2hlbiB0aGUgY2FjaGUgZXhjZWVkcyBpdHMgc3BhY2UgbGltaXQuCisgKiBAcmV0dXJuIGRvdWJsZQorICovCitwdWJsaWMgZG91YmxlIGdldExvYWRGYWN0b3IoKSB7CisJcmV0dXJuIGZMb2FkRmFjdG9yOworfQorCS8qKgorCSAqCUByZXR1cm4gVGhlIHNwYWNlIGJ5IHdoaWNoIHRoZSBjYWNoZSBoYXMgb3ZlcmZsb3duLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0T3ZlcmZsb3coKSB7CisJCXJldHVybiBmT3ZlcmZsb3c7CisJfQorCS8qKgorCSAqIEVuc3VyZXMgdGhlcmUgaXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZnJlZSBzcGFjZSBpbiB0aGUgcmVjZWl2ZXIsCisJICogYnkgcmVtb3Zpbmcgb2xkIGVudHJpZXMgaWYgbmVjZXNzYXJ5LiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgc3BhY2Ugd2FzCisJICogbWFkZSBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZS4gIE1heSBub3QgYmUgYWJsZSB0byBmcmVlIGVub3VnaCBzcGFjZQorCSAqIHNpbmNlIHNvbWUgZWxlbWVudHMgY2Fubm90IGJlIHJlbW92ZWQgdW50aWwgdGhleSBhcmUgc2F2ZWQuCisJICoKKwkgKiBAcGFyYW0gc3BhY2UgQW1vdW50IG9mIHNwYWNlIHRvIGZyZWUgdXAKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtYWtlU3BhY2UoaW50IHNwYWNlKSB7CisJCisJCWludCBsaW1pdCA9IGZTcGFjZUxpbWl0OworCQlpZiAoZk92ZXJmbG93ID09IDApIHsKKwkJCS8qIGlmIHNwYWNlIGlzIGFscmVhZHkgYXZhaWxhYmxlICovCisJCQlpZiAoZkN1cnJlbnRTcGFjZSArIHNwYWNlIDw9IGxpbWl0KSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkKKwkJLyogRnJlZSB1cCBzcGFjZSBieSByZW1vdmluZyBvbGRlc3QgZW50cmllcyAqLworCQlpbnQgc3BhY2VOZWVkZWQgPSAoaW50KSgoMSAtIGZMb2FkRmFjdG9yKSAqIGZTcGFjZUxpbWl0KTsKKwkJc3BhY2VOZWVkZWQgPSAoc3BhY2VOZWVkZWQgPiBzcGFjZSkgPyBzcGFjZU5lZWRlZCA6IHNwYWNlOworCQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gZkVudHJ5UXVldWVUYWlsOworCQorCQl3aGlsZSAoZkN1cnJlbnRTcGFjZSArIHNwYWNlTmVlZGVkID4gbGltaXQgJiYgZW50cnkgIT0gbnVsbCkgeworCQkJdGhpcy5wcml2YXRlUmVtb3ZlRW50cnkoZW50cnksIGZhbHNlLCBmYWxzZSk7CisJCQllbnRyeSA9IGVudHJ5Ll9mUHJldmlvdXM7CisJCX0KKwkKKwkJLyogY2hlY2sgYWdhaW4sIHNpbmNlIHdlIG1heSBoYXZlIGFxdWlyZWQgZW5vdWdoIHNwYWNlICovCisJCWlmIChmQ3VycmVudFNwYWNlICsgc3BhY2UgPD0gbGltaXQpIHsKKwkJCWZPdmVyZmxvdyA9IDA7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQorCQkvKiB1cGRhdGUgZk92ZXJmbG93ICovCisJCWZPdmVyZmxvdyA9IGZDdXJyZW50U3BhY2UgKyBzcGFjZSAtIGxpbWl0OworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlY2lldmVyLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBMUlVDYWNoZSBuZXdJbnN0YW5jZShpbnQgc2l6ZSwgaW50IG92ZXJmbG93KTsKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSB2YWx1ZSBpbiB0aGUgY2FjaGUgYXQgdGhlIGdpdmVuIGtleS4KKwkgKiBJZiB0aGUgdmFsdWUgaXMgbm90IGluIHRoZSBjYWNoZSwgcmV0dXJucyBudWxsCisJICoKKwkgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSB0aW1lc3RhbXBzLgorCSAqLworCXB1YmxpYyBPYmplY3QgcGVlayhPYmplY3Qga2V5KSB7CisJCQorCQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gKExSVUNhY2hlRW50cnkpIGZFbnRyeVRhYmxlLmdldChrZXkpOworCQlpZiAoZW50cnkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGVudHJ5Ll9mVmFsdWU7CisJfQorLyoqCisgKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5CisgKi8KK3B1YmxpYyB2b2lkIHByaW50U3RhdHMoKSB7CisJaW50IGZvcndhcmRMaXN0TGVuZ3RoID0gMDsKKwlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gZkVudHJ5UXVldWU7CisJd2hpbGUoZW50cnkgIT0gbnVsbCkgeworCQlmb3J3YXJkTGlzdExlbmd0aCsrOworCQllbnRyeSA9IGVudHJ5Ll9mTmV4dDsKKwl9CisJU3lzdGVtLm91dC5wcmludGxuKCJGb3J3YXJkIGxlbmd0aDogIiArIGZvcndhcmRMaXN0TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAorCQorCWludCBiYWNrd2FyZExpc3RMZW5ndGggPSAwOworCWVudHJ5ID0gZkVudHJ5UXVldWVUYWlsOworCXdoaWxlKGVudHJ5ICE9IG51bGwpIHsKKwkJYmFja3dhcmRMaXN0TGVuZ3RoKys7CisJCWVudHJ5ID0gZW50cnkuX2ZQcmV2aW91czsKKwl9CisJU3lzdGVtLm91dC5wcmludGxuKCJCYWNrd2FyZCBsZW5ndGg6ICIgKyBiYWNrd2FyZExpc3RMZW5ndGgpOyAvLyROT04tTkxTLTEkCisKKwlFbnVtZXJhdGlvbiBrZXlzID0gZkVudHJ5VGFibGUua2V5cygpOworCWNsYXNzIFRlbXAgeworCQlwdWJsaWMgQ2xhc3MgZkNsYXNzOworCQlwdWJsaWMgaW50IGZDb3VudDsKKwkJcHVibGljIFRlbXAoQ2xhc3MgYUNsYXNzKSB7CisJCQlmQ2xhc3MgPSBhQ2xhc3M7CisJCQlmQ291bnQgPSAxOworCQl9CisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkNsYXNzOiAiICsgZkNsYXNzICsgIiBoYXMgIiArIGZDb3VudCArICIgZW50cmllcy4iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWphdmEudXRpbC5IYXNoTWFwIGggPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKKwl3aGlsZShrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCWVudHJ5ID0gKExSVUNhY2hlRW50cnkpZkVudHJ5VGFibGUuZ2V0KGtleXMubmV4dEVsZW1lbnQoKSk7CisJCUNsYXNzIGtleSA9IGVudHJ5Ll9mVmFsdWUuZ2V0Q2xhc3MoKTsKKwkJVGVtcCB0ID0gKFRlbXApaC5nZXQoa2V5KTsKKwkJaWYgKHQgPT0gbnVsbCkgeworCQkJaC5wdXQoa2V5LCBuZXcgVGVtcChrZXkpKTsKKwkJfSBlbHNlIHsKKwkJCXQuZkNvdW50Kys7CisJCX0KKwl9CisKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBoLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7CisJCVN5c3RlbS5vdXQucHJpbnRsbihoLmdldChpdGVyLm5leHQoKSkpOworCX0KK30KKwkvKioKKwkgKglSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIHRoZSBlbnRyeSBxdWV1ZS4KKwkgKglDYWxscyA8Y29kZT5wcml2YXRlUmVtb3ZlRW50cnk8L2NvZGU+IHdpdGggdGhlIGV4dGVybmFsIGZ1bmN0aW9uYWxpdHkgZW5hYmxlZC4KKwkgKgorCSAqIEBwYXJhbSBzaHVmZmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBqdXN0IHNodWZmbGluZyB0aGUgcXVldWUgCisJICogKGkuZS4sIHRoZSBlbnRyeSB0YWJsZSBpcyBsZWZ0IGFsb25lKS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlUmVtb3ZlRW50cnkgKExSVUNhY2hlRW50cnkgZW50cnksIGJvb2xlYW4gc2h1ZmZsZSkgeworCQlwcml2YXRlUmVtb3ZlRW50cnkoZW50cnksIHNodWZmbGUsIHRydWUpOworCX0KKy8qKgorICoJUmVtb3ZlcyB0aGUgZW50cnkgZnJvbSB0aGUgZW50cnkgcXVldWUuICBJZiA8aT5leHRlcm5hbDwvaT4gaXMgdHJ1ZSwgdGhlIGVudHJ5IGlzIHJlbW92ZWQKKyAqCXdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgY2FuIGJlIHJlbW92ZWQuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBjbG9zZWQKKyAqCXRoZSBlbGVtZW50IGl0IGlzIHRyeWluZyB0byByZW1vdmUgKG9yIHdpbGwgY2xvc2UgaXQgcHJvbXB0bHkpLgorICoKKyAqCUlmIDxpPmV4dGVybmFsPC9pPiBpcyBmYWxzZSwgYW5kIHRoZSBlbnRyeSBjb3VsZCBub3QgYmUgY2xvc2VkLCBpdCBpcyBub3QgcmVtb3ZlZCBhbmQgdGhlIAorICoJcG9pbnRlcnMgYXJlIG5vdCBjaGFuZ2VkLgorICoKKyAqCUBwYXJhbSBzaHVmZmxlIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBqdXN0IHNodWZmbGluZyB0aGUgcXVldWUgCisgKgkoaS5lLiwgdGhlIGVudHJ5IHRhYmxlIGlzIGxlZnQgYWxvbmUpLgorICovCitwcm90ZWN0ZWQgdm9pZCBwcml2YXRlUmVtb3ZlRW50cnkoTFJVQ2FjaGVFbnRyeSBlbnRyeSwgYm9vbGVhbiBzaHVmZmxlLCBib29sZWFuIGV4dGVybmFsKSB7CisKKwlpZiAoIXNodWZmbGUpIHsKKwkJaWYgKGV4dGVybmFsKSB7CisJCQlmRW50cnlUYWJsZS5yZW1vdmUoZW50cnkuX2ZLZXkpOwkJCQorCQkJZkN1cnJlbnRTcGFjZSAtPSBlbnRyeS5fZlNwYWNlOworCQkJcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKGVudHJ5KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghY2xvc2UoZW50cnkpKSByZXR1cm47CisJCQkvLyBidWZmZXIgY2xvc2Ugd2lsbCByZWN1cnNpdmVseSBjYWxsICNwcml2YXRlUmVtb3ZlRW50cnkgd2l0aCBleHRlcm5hbD09dHJ1ZQorCQkJLy8gdGh1cyBlbnRyeSB3aWxsIGFscmVhZHkgYmUgcmVtb3ZlZCBpZiByZWFjaGluZyB0aGlzIHBvaW50LgorCQkJaWYgKGZFbnRyeVRhYmxlLmdldChlbnRyeS5fZktleSkgPT0gbnVsbCl7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQkvLyBiYXNpYyByZW1vdmFsCisJCQkJZkVudHJ5VGFibGUucmVtb3ZlKGVudHJ5Ll9mS2V5KTsJCQkKKwkJCQlmQ3VycmVudFNwYWNlIC09IGVudHJ5Ll9mU3BhY2U7CisJCQkJcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKGVudHJ5KTsKKwkJCX0KKwkJfQorCX0KKwlMUlVDYWNoZUVudHJ5IHByZXZpb3VzID0gZW50cnkuX2ZQcmV2aW91czsKKwlMUlVDYWNoZUVudHJ5IG5leHQgPSBlbnRyeS5fZk5leHQ7CisJCQorCS8qIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCBlbnRyeSAqLworCWlmIChwcmV2aW91cyA9PSBudWxsKSB7CisJCWZFbnRyeVF1ZXVlID0gbmV4dDsKKwl9IGVsc2UgeworCQlwcmV2aW91cy5fZk5leHQgPSBuZXh0OworCX0KKwkvKiBpZiB0aGlzIHdhcyB0aGUgbGFzdCBlbnRyeSAqLworCWlmIChuZXh0ID09IG51bGwpIHsKKwkJZkVudHJ5UXVldWVUYWlsID0gcHJldmlvdXM7CisJfSBlbHNlIHsKKwkJbmV4dC5fZlByZXZpb3VzID0gcHJldmlvdXM7CisJfQorfQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSBjYWNoZSBhdCB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIHRoZSB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgS2V5IG9mIG9iamVjdCB0byBhZGQuCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIG9iamVjdCB0byBhZGQuCisJICogQHJldHVybiBhZGRlZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJLyogYXR0ZW1wdCB0byByaWQgb3Vyc2VsdmVzIG9mIHRoZSBvdmVyZmxvdywgaWYgdGhlcmUgaXMgYW55ICovCisJCWlmIChmT3ZlcmZsb3cgPiAwKQorCQkJc2hyaW5rKCk7CisJCQkKKwkJLyogQ2hlY2sgd2hldGhlciB0aGVyZSdzIGFuIGVudHJ5IGluIHRoZSBjYWNoZSAqLworCQlpbnQgbmV3U3BhY2UgPSBzcGFjZUZvciAoa2V5LCB2YWx1ZSk7CisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0IChrZXkpOworCQkKKwkJaWYgKGVudHJ5ICE9IG51bGwpIHsKKwkJCQorCQkJLyoqCisJCQkgKiBSZXBsYWNlIHRoZSBlbnRyeSBpbiB0aGUgY2FjaGUgaWYgaXQgd291bGQgbm90IG92ZXJmbG93CisJCQkgKiB0aGUgY2FjaGUuICBPdGhlcndpc2UgZmx1c2ggdGhlIGVudHJ5IGFuZCByZS1hZGQgaXQgc28gYXMgCisJCQkgKiB0byBrZWVwIGNhY2hlIHdpdGhpbiBidWRnZXQKKwkJCSAqLworCQkJaW50IG9sZFNwYWNlID0gZW50cnkuX2ZTcGFjZTsKKwkJCWludCBuZXdUb3RhbCA9IGZDdXJyZW50U3BhY2UgLSBvbGRTcGFjZSArIG5ld1NwYWNlOworCQkJaWYgKG5ld1RvdGFsIDw9IGZTcGFjZUxpbWl0KSB7CisJCQkJdXBkYXRlVGltZXN0YW1wIChlbnRyeSk7CisJCQkJZW50cnkuX2ZWYWx1ZSA9IHZhbHVlOworCQkJCWVudHJ5Ll9mU3BhY2UgPSBuZXdTcGFjZTsKKwkJCQlmQ3VycmVudFNwYWNlID0gbmV3VG90YWw7CisJCQkJZk92ZXJmbG93ID0gMDsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIGZhbHNlLCBmYWxzZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIGF0dGVtcHQgdG8gbWFrZSBuZXcgc3BhY2UKKwkJbWFrZVNwYWNlKG5ld1NwYWNlKTsKKwkJCisJCS8vIGFkZCB3aXRob3V0IHdvcnJpbmcgYWJvdXQgc3BhY2UsIGl0IHdpbGwKKwkJLy8gYmUgaGFuZGxlZCBsYXRlciBpbiBhIG1ha2VTcGFjZSBjYWxsCisJCXByaXZhdGVBZGQgKGtleSwgdmFsdWUsIG5ld1NwYWNlKTsKKwkJCisJCXJldHVybiB2YWx1ZTsKKwl9CisJLyoqCisJICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4ga2V5LgorCSAqIElmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBjYWNoZSwgcmV0dXJucyBudWxsLgorCSAqCisJICogQHBhcmFtIGtleSBLZXkgb2Ygb2JqZWN0IHRvIHJlbW92ZSBmcm9tIGNhY2hlLgorCSAqIEByZXR1cm4gVmFsdWUgcmVtb3ZlZCBmcm9tIGNhY2hlLgorCSAqLworCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKwkJcmV0dXJuIHJlbW92ZUtleShrZXkpOworCX0KKy8qKgorICogU2V0cyB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBjYWNoZS4gIFRoZSBsb2FkIGZhY3RvciBkZXRlcm1pbmVzIGhvdyAKKyAqIG11Y2ggc3BhY2UgaXMgcmVjbGFpbWVkIHdoZW4gdGhlIGNhY2hlIGV4Y2VlZHMgaXRzIHNwYWNlIGxpbWl0LgorICogQHBhcmFtIG5ld0xvYWRGYWN0b3IgZG91YmxlCisgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSBuZXcgbG9hZCBmYWN0b3IgaXMgbm90IGluICgwLjAsIDEuMF0KKyAqLworcHVibGljIHZvaWQgc2V0TG9hZEZhY3Rvcihkb3VibGUgbmV3TG9hZEZhY3RvcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYobmV3TG9hZEZhY3RvciA8PSAxLjAgJiYgbmV3TG9hZEZhY3RvciA+IDAuMCkKKwkJZkxvYWRGYWN0b3IgPSBuZXdMb2FkRmFjdG9yOworCWVsc2UKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImNhY2hlLmludmFsaWRMb2FkRmFjdG9yIikpOyAvLyROT04tTkxTLTEkCit9CisJLyoqCisJICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3BhY2UgdGhhdCB0aGUgY2FjaGUgY2FuIHN0b3JlCisJICoKKwkgKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIHVuaXRzIG9mIGNhY2hlIHNwYWNlCisJICovCisJcHVibGljIHZvaWQgc2V0U3BhY2VMaW1pdChpbnQgbGltaXQpIHsKKwkJaWYgKGxpbWl0IDwgZlNwYWNlTGltaXQpIHsKKwkJCW1ha2VTcGFjZShmU3BhY2VMaW1pdCAtIGxpbWl0KTsKKwkJfQorCQlmU3BhY2VMaW1pdCA9IGxpbWl0OworCX0KKwkvKioKKwkgKiBBdHRlbXB0cyB0byBzaHJpbmsgdGhlIGNhY2hlIGlmIGl0IGhhcyBvdmVyZmxvd24uCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWNoZSBzaHJpbmtzIHRvIGxlc3MgdGhhbiBvciBlcXVhbCB0byA8Y29kZT5mU3BhY2VMaW1pdDwvY29kZT4uCisJICovCisJcHVibGljIGJvb2xlYW4gc2hyaW5rKCkgeworCQlpZiAoZk92ZXJmbG93ID4gMCkKKwkJCXJldHVybiBtYWtlU3BhY2UoMCk7CisJCXJldHVybiB0cnVlOworCX0KKy8qKgorICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LiAgVGhpcyBtZXRob2QKKyAqIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gCisJCSJPdmVyZmxvd2luZ0xSVUNhY2hlICIgKyB0aGlzLmZpbGxpbmdSYXRpbygpICsgIiUgZnVsbFxuIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl0aGlzLnRvU3RyaW5nQ29udGVudHMoKTsKK30KKy8qKgorICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzIAorICoga2VwdCBpbiBjb3JyZWN0IG9yZGVyLiAgVGhlIGVudHJ5IG11c3QgZXhpc3QuCisgKgorICogPHA+VGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRpbWVzdGFtcHMgaGF2ZSBiZWVuIGRpc2FibGVkLgorICovCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaW1lc3RhbXAoTFJVQ2FjaGVFbnRyeSBlbnRyeSkgeworCWlmIChmVGltZXN0YW1wc09uKSB7CisJCWVudHJ5Ll9mVGltZXN0YW1wID0gZlRpbWVzdGFtcENvdW50ZXIrKzsKKwkJaWYgKGZFbnRyeVF1ZXVlICE9IGVudHJ5KSB7CisJCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeShlbnRyeSwgdHJ1ZSk7CisJCQl0aGlzLnByaXZhdGVBZGRFbnRyeShlbnRyeSwgdHJ1ZSk7CisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKKworLyoqCisgKiBAc2VlIElQYWNrYWdlRGVjbGFyYXRpb24KKyAqLworCisvKiBwYWNrYWdlICovIGNsYXNzIFBhY2thZ2VEZWNsYXJhdGlvbiBleHRlbmRzIFNvdXJjZVJlZkVsZW1lbnQgaW1wbGVtZW50cyBJUGFja2FnZURlY2xhcmF0aW9uIHsKK3Byb3RlY3RlZCBQYWNrYWdlRGVjbGFyYXRpb24oSUNvbXBpbGF0aW9uVW5pdCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoUEFDS0FHRV9ERUNMQVJBVElPTiwgcGFyZW50LCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNlcXVhbHNET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuUEFDS0FHRSkgJiYgZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobm9kZS5nZXROYW1lKCkpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCXJldHVybiBKYXZhRWxlbWVudC5KRU1fUEFDS0FHRURFQ0xBUkFUSU9OOworfQorLyoqCisgKiBAcHJpdmF0ZSBEZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwlidWZmZXIuYXBwZW5kKCJwYWNrYWdlICIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwlpZiAoaW5mbyA9PSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjA1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CisKKy8qKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50CisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlRnJhZ21lbnQgZXh0ZW5kcyBPcGVuYWJsZSBpbXBsZW1lbnRzIElQYWNrYWdlRnJhZ21lbnQgeworCS8qKgorCSAqIENvbnN0YW50IGVtcHR5IGxpc3Qgb2YgY2xhc3MgZmlsZXMKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc0ZpbGVbXSBmZ0VtcHR5Q2xhc3NGaWxlTGlzdD0gbmV3IElDbGFzc0ZpbGVbXSB7fTsKKwkvKioKKwkgKiBDb25zdGFudCBlbXB0eSBsaXN0IG9mIGNvbXBpbGF0aW9uIHVuaXRzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBJQ29tcGlsYXRpb25Vbml0W10gZmdFbXB0eUNvbXBpbGF0aW9uVW5pdExpc3Q9IG5ldyBJQ29tcGlsYXRpb25Vbml0W10ge307CisvKioKKyAqIENvbnN0cnVjdHMgYSBoYW5kbGUgZm9yIGEgcGFja2FnZSBmcmFnbWVudAorICoKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudAorICovCitwcm90ZWN0ZWQgUGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZyBuYW1lKSB7CisJc3VwZXIoUEFDS0FHRV9GUkFHTUVOVCwgcm9vdCwgbmFtZSk7Cit9CisvKioKKyAqIENvbXB1dGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudC4KKyAqCisgKiA8cD5QYWNrYWdlIGZyYWdtZW50cyB3aGljaCBhcmUgZm9sZGVycyByZWNvZ25pemUgZmlsZXMgYmFzZWQgb24gdGhlCisgKiB0eXBlIG9mIHRoZSBmcmFnbWVudAorICogPHA+UGFja2FnZSBmcmFnbWVudHMgd2hpY2ggYXJlIGluIGEgamFyIG9ubHkgcmVjb2duaXplIC5jbGFzcyBmaWxlcyAoCisgKiBAc2VlIEphclBhY2thZ2VGcmFnbWVudCkuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGNvbXB1dGVDaGlsZHJlbihPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm8sIElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQXJyYXlMaXN0IHZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwlpbnQga2luZCA9IGdldEtpbmQoKTsKKwlTdHJpbmcgZXh0VHlwZTsKKwlpZiAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgeworCQlleHRUeXBlID0gImphdmEiOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIHsKKwkJZXh0VHlwZSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwl9CisJdHJ5IHsKKwkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUlSZXNvdXJjZSBjaGlsZCA9IG1lbWJlcnNbaV07CisJCQlpZiAoY2hpbGQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gY2hpbGQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKKwkJCQkJaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKGV4dFR5cGUpKSB7CisJCQkJCQlJSmF2YUVsZW1lbnQgY2hpbGRFbGVtZW50OworCQkJCQkJaWYgKGtpbmQgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgJiYgVXRpbC5pc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShjaGlsZC5nZXROYW1lKCkpKSB7CisJCQkJCQkJY2hpbGRFbGVtZW50ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGNoaWxkLmdldE5hbWUoKSk7CisJCQkJCQkJdkNoaWxkcmVuLmFkZChjaGlsZEVsZW1lbnQpOworCQkJCQkJfSBlbHNlIGlmIChVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGNoaWxkLmdldE5hbWUoKSkpIHsKKwkJCQkJCQljaGlsZEVsZW1lbnQgPSBnZXRDbGFzc0ZpbGUoY2hpbGQuZ2V0TmFtZSgpKTsKKwkJCQkJCQl2Q2hpbGRyZW4uYWRkKGNoaWxkRWxlbWVudCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwl9CisJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBuZXcgSUphdmFFbGVtZW50W3ZDaGlsZHJlbi5zaXplKCldOworCXZDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTsKKwlpbmZvLnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGphdmEgcmVzb3VyY2UuCisgKiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAqLworcHVibGljIGJvb2xlYW4gY29udGFpbnNKYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuY29udGFpbnNKYXZhUmVzb3VyY2VzKCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCBjb3B5KElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9OworCUlKYXZhRWxlbWVudFtdIHNpYmxpbmdzPSBudWxsOworCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJc2libGluZ3M9IG5ldyBJSmF2YUVsZW1lbnRbXSB7c2libGluZ307CisJfQorCVN0cmluZ1tdIHJlbmFtaW5ncz0gbnVsbDsKKwlpZiAocmVuYW1lICE9IG51bGwpIHsKKwkJcmVuYW1pbmdzPSBuZXcgU3RyaW5nW10ge3JlbmFtZX07CisJfQorCWdldEphdmFNb2RlbCgpLmNvcHkoZWxlbWVudHMsIGNvbnRhaW5lcnMsIHNpYmxpbmdzLCByZW5hbWluZ3MsIGZvcmNlLCBtb25pdG9yKTsKK30KKy8qKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50CisgKi8KK3B1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUNyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbih0aGlzLCBuYW1lLCBjb250ZW50cywgZm9yY2UpOworCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CisJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdChuYW1lKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudAorICovCitwcm90ZWN0ZWQgT3BlbmFibGVFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbygpIHsKKwlyZXR1cm4gbmV3IFBhY2thZ2VGcmFnbWVudEluZm8oKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlTWFuaXB1bGF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIGRlbGV0ZShib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsKKwlnZXRKYXZhTW9kZWwoKS5kZWxldGUoZWxlbWVudHMsIGZvcmNlLCBtb25pdG9yKTsKK30KKy8qKgorICogQHNlZSBPcGVuYWJsZQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUluZm9zKE9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSwgTWFwIG5ld0VsZW1lbnRzLCBJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkKKwlyZXR1cm4gY29tcHV0ZUNoaWxkcmVuKGluZm8sIHVuZGVybHlpbmdSZXNvdXJjZSk7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudCNnZXRDbGFzc0ZpbGUoU3RyaW5nKQorICovCitwdWJsaWMgSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gbmV3IENsYXNzRmlsZSh0aGlzLCBuYW1lKTsKK30KKy8qKgorICogUmV0dXJucyBhIHRoZSBjb2xsZWN0aW9uIG9mIGNsYXNzIGZpbGVzIGluIHRoaXMgLSBhIGZvbGRlciBwYWNrYWdlIGZyYWdtZW50IHdoaWNoIGhhcyBhIHJvb3QKKyAqIHRoYXQgaGFzIGl0cyBraW5kIHNldCB0byA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5LX1NvdXJjZTwvY29kZT4gZG9lcyBub3QKKyAqIHJlY29nbml6ZSBjbGFzcyBmaWxlcy4KKyAqCisgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnQjZ2V0Q2xhc3NGaWxlcygpCisgKi8KK3B1YmxpYyBJQ2xhc3NGaWxlW10gZ2V0Q2xhc3NGaWxlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChnZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKKwkJcmV0dXJuIGZnRW1wdHlDbGFzc0ZpbGVMaXN0OworCX0KKwkKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKENMQVNTX0ZJTEUpOworCUlDbGFzc0ZpbGVbXSBhcnJheT0gbmV3IElDbGFzc0ZpbGVbbGlzdC5zaXplKCldOworCWxpc3QudG9BcnJheShhcnJheSk7CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnQjZ2V0Q29tcGlsYXRpb25Vbml0KFN0cmluZykKKyAqLworcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQodGhpcywgbmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudCNnZXRDb21waWxhdGlvblVuaXRzKCkKKyAqLworcHVibGljIElDb21waWxhdGlvblVuaXRbXSBnZXRDb21waWxhdGlvblVuaXRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkgeworCQlyZXR1cm4gZmdFbXB0eUNvbXBpbGF0aW9uVW5pdExpc3Q7CisJfQorCQorCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoQ09NUElMQVRJT05fVU5JVCk7CisJSUNvbXBpbGF0aW9uVW5pdFtdIGFycmF5PSBuZXcgSUNvbXBpbGF0aW9uVW5pdFtsaXN0LnNpemUoKV07CisJbGlzdC50b0FycmF5KGFycmF5KTsKKwlyZXR1cm4gYXJyYXk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpCisgKi8KK3Byb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7CisJcmV0dXJuIEphdmFFbGVtZW50LkpFTV9QQUNLQUdFRlJBR01FTlQ7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudCNnZXRLaW5kKCkKKyAqLworcHVibGljIGludCBnZXRLaW5kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZ2V0UGFyZW50KCkpLmdldEtpbmQoKTsKK30KKy8qKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KKyAqLworcHVibGljIE9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAodGhpcy5pc0RlZmF1bHRQYWNrYWdlKCkpIHsKKwkJLy8gV2UgZG9uJ3Qgd2FudCB0byBzaG93IG5vbiBqYXZhIHJlc291cmNlcyBvZiB0aGUgZGVmYXVsdCBwYWNrYWdlIChzZWUgUFIgIzFHNThOQjgpCisJCXJldHVybiBKYXZhRWxlbWVudEluZm8uTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOworCX0gZWxzZSB7CisJCXJldHVybiAoKFBhY2thZ2VGcmFnbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOworCX0KK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0UGF0aCgpCisgKi8KK3B1YmxpYyBJUGF0aCBnZXRQYXRoKCkgeworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CisJCXJldHVybiByb290LmdldFBhdGgoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gcm9vdC5nZXRQYXRoKCkuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSk7CisJfQorfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudCNnZXRSZXNvdXJjZSgpCisgKi8KK3B1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJcmV0dXJuIHJvb3QuZ2V0UmVzb3VyY2UoKTsKKwl9IGVsc2UgeworCQlTdHJpbmcgZWxlbWVudE5hbWUgPSB0aGlzLmdldEVsZW1lbnROYW1lKCk7CisJCWlmIChlbGVtZW50TmFtZS5sZW5ndGgoKSA9PSAwKSB7CisJCQlyZXR1cm4gcm9vdC5nZXRSZXNvdXJjZSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuICgoSUNvbnRhaW5lcilyb290LmdldFJlc291cmNlKCkpLmdldEZvbGRlcihuZXcgUGF0aCh0aGlzLmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpKTsKKwkJfQorCX0KK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQjZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gZlBhcmVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlpZiAocm9vdFJlc291cmNlID09IG51bGwpIHsKKwkJLy9qYXIgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgaGFzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2UKKwkJcmV0dXJuIG51bGw7CisJfQorCS8vIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG1heSBiZSBhIGZvbGRlciBvciBhIHByb2plY3QgKGluIHRoZSBjYXNlIHRoYXQgdGhlIHByb2plY3QgZm9sZGVyCisJLy8gaXMgYXR1YWxseSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290KQorCWlmIChyb290UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgcm9vdFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeworCQlJQ29udGFpbmVyIGZvbGRlciA9IChJQ29udGFpbmVyKSByb290UmVzb3VyY2U7CisJCVN0cmluZ1tdIHNlZ3MgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMoZk5hbWUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyArK2kpIHsKKwkJCUlSZXNvdXJjZSBjaGlsZCA9IGZvbGRlci5maW5kTWVtYmVyKHNlZ3NbaV0pOworCQkJaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQlmb2xkZXIgPSAoSUZvbGRlcikgY2hpbGQ7CisJCX0KKwkJcmV0dXJuIGZvbGRlcjsKKwl9IGVsc2UgeworCQlyZXR1cm4gcm9vdFJlc291cmNlOworCX0KK30KKy8qKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50I2hhc1N1YnBhY2thZ2VzKCkKKyAqLworcHVibGljIGJvb2xlYW4gaGFzU3VicGFja2FnZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnRbXSBwYWNrYWdlcz0gKChJUGFja2FnZUZyYWdtZW50Um9vdClnZXRQYXJlbnQoKSkuZ2V0Q2hpbGRyZW4oKTsKKwlTdHJpbmcgbmFtZSA9IGdldEVsZW1lbnROYW1lKCk7CisJaW50IG5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aCgpOworCVN0cmluZyBwYWNrYWdlTmFtZSA9IGlzRGVmYXVsdFBhY2thZ2UoKSA/IG5hbWUgOiBuYW1lKyIuIjsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGk9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgeworCQlTdHJpbmcgb3RoZXJOYW1lID0gcGFja2FnZXNbaV0uZ2V0RWxlbWVudE5hbWUoKTsKKwkJaWYgKG90aGVyTmFtZS5sZW5ndGgoKSA+IG5hbWVMZW5ndGggJiYgb3RoZXJOYW1lLnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudCNpc0RlZmF1bHRQYWNrYWdlKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UGFja2FnZSgpIHsKKwlyZXR1cm4gdGhpcy5nZXRFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDA7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbiNtb3ZlKElKYXZhRWxlbWVudCwgSUphdmFFbGVtZW50LCBTdHJpbmcsIGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIG1vdmUoSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24ubnVsbENvbnRhaW5lciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzfTsKKwlJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzPSBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn07CisJSUphdmFFbGVtZW50W10gc2libGluZ3M9IG51bGw7CisJaWYgKHNpYmxpbmcgIT0gbnVsbCkgeworCQlzaWJsaW5ncz0gbmV3IElKYXZhRWxlbWVudFtdIHtzaWJsaW5nfTsKKwl9CisJU3RyaW5nW10gcmVuYW1pbmdzPSBudWxsOworCWlmIChyZW5hbWUgIT0gbnVsbCkgeworCQlyZW5hbWluZ3M9IG5ldyBTdHJpbmdbXSB7cmVuYW1lfTsKKwl9CisJZ2V0SmF2YU1vZGVsKCkubW92ZShlbGVtZW50cywgY29udGFpbmVycywgc2libGluZ3MsIHJlbmFtaW5ncywgZm9yY2UsIG1vbml0b3IpOworfQorLyoqCisgKiBSZWNvbXB1dGVzIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQsIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlCisgKiBvZiB0aGUgd29ya2JlbmNoLgorICovCitwdWJsaWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7CisJdHJ5IHsKKwkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvPSAoT3BlbmFibGVFbGVtZW50SW5mbylnZXRFbGVtZW50SW5mbygpOworCQljb21wdXRlQ2hpbGRyZW4oaW5mbywgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCS8vIGRvIG5vdGhpbmcuCisJfQorfQorLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24jcmVuYW1lKFN0cmluZywgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChuYW1lID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJSUphdmFFbGVtZW50W10gZGVzdHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpcy5nZXRQYXJlbnQoKX07CisJU3RyaW5nW10gcmVuYW1pbmdzPSBuZXcgU3RyaW5nW10ge25hbWV9OworCWdldEphdmFNb2RlbCgpLnJlbmFtZShlbGVtZW50cywgZGVzdHMsIHJlbmFtaW5ncywgZm9yY2UsIG1vbml0b3IpOworfQorLyoKKyAqIEBzZWUgSmF2YUVsZW1lbnQjcm9vdGVkQXQoSUphdmFQcm9qZWN0KQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJcmV0dXJuCisJCW5ldyBQYWNrYWdlRnJhZ21lbnQoCisJCQkoSVBhY2thZ2VGcmFnbWVudFJvb3QpKChKYXZhRWxlbWVudClmUGFyZW50KS5yb290ZWRBdChwcm9qZWN0KSwgCisJCQlmTmFtZSk7Cit9CisvKioKKyAqIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0NoaWxkcmVuKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIsIE9iamVjdCBpbmZvKSB7CisJaWYgKHRhYiA9PSAwKSB7CisJCXN1cGVyLnRvU3RyaW5nQ2hpbGRyZW4odGFiLCBidWZmZXIsIGluZm8pOworCX0KK30KKy8qKgorICogRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgeworCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJaWYgKGdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPT0gMCkgeworCQlidWZmZXIuYXBwZW5kKCJbZGVmYXVsdF0iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CisJfQorCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWlmICh0YWIgPiAwKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgKC4uLikiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDBmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKKy8qKgorICogRWxlbWVudCBpbmZvIGZvciBQYWNrYWdlRnJhZ21lbnRzLgorICovCitjbGFzcyBQYWNrYWdlRnJhZ21lbnRJbmZvIGV4dGVuZHMgT3BlbmFibGVFbGVtZW50SW5mbyB7CisKKwkvKioKKwkgKiBBIGFycmF5IHdpdGggYWxsIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGJ5IHRoaXMgUGFja2FnZUZyYWdtZW50CisJICovCisJcHJvdGVjdGVkIE9iamVjdFtdIGZOb25KYXZhUmVzb3VyY2VzOworCisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKKyAqLworcHVibGljIFBhY2thZ2VGcmFnbWVudEluZm8oKSB7CisJZk5vbkphdmFSZXNvdXJjZXMgPSBudWxsOworfQorLyoqCisgKiBDb21wdXRlIHRoZSBub24tamF2YSByZXNvdXJjZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50LgorICoKKyAqIDxwPlBhY2thZ2UgZnJhZ21lbnRzIHdoaWNoIGFyZSBmb2xkZXJzIHJlY29nbml6ZSBmaWxlcyBiYXNlZCBvbiB0aGUKKyAqIHR5cGUgb2YgdGhlIGZyYWdtZW50CisgKiA8cD5QYWNrYWdlIGZyYWdtZW50cyB3aGljaCBhcmUgaW4gYSBqYXIgb25seSByZWNvZ25pemUgLmNsYXNzIGZpbGVzICgKKyAqIEBzZWUgSmFyUGFja2FnZUZyYWdtZW50KS4KKyAqLworcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlTm9uSmF2YVJlc291cmNlcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVs1XTsKKwlpbnQgbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgPSAwOworCXRyeXsKKwkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUlSZXNvdXJjZSBjaGlsZCA9IG1lbWJlcnNbaV07CisJCQlpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJU3RyaW5nIGZpbGVOYW1lID0gY2hpbGQuZ2V0TmFtZSgpOworCQkJCWlmICghVXRpbC5pc1ZhbGlkQ29tcGlsYXRpb25Vbml0TmFtZShmaWxlTmFtZSkgJiYgIVV0aWwuaXNWYWxpZENsYXNzRmlsZU5hbWUoZmlsZU5hbWUpKSB7CisJCQkJCWlmIChub25KYXZhUmVzb3VyY2VzLmxlbmd0aCA9PSBub25KYXZhUmVzb3VyY2VzQ291bnRlcikgeworCQkJCQkJLy8gcmVzaXplCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCW5vbkphdmFSZXNvdXJjZXMsCisJCQkJCQkJMCwKKwkJCQkJCQkobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksCisJCQkJCQkJMCwKKwkJCQkJCQlub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CisJCQkJCX0KKwkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IGNoaWxkOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCQlpZiAoIVV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKGNoaWxkLmdldE5hbWUoKSkpIHsKKwkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQkJCQkvLyByZXNpemUKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyICogMl0pLCAwLCBub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CisJCQkJCX0KKwkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IGNoaWxkOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobm9uSmF2YVJlc291cmNlc0NvdW50ZXIgPT0gMCkgeworCQkJbm9uSmF2YVJlc291cmNlcyA9IE5PX05PTl9KQVZBX1JFU09VUkNFUzsKKwkJfSBlbHNlIHsKKwkJCWlmIChub25KYXZhUmVzb3VyY2VzLmxlbmd0aCAhPSBub25KYXZhUmVzb3VyY2VzQ291bnRlcikgeworCQkJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCX0KKwkJfQkKKwl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQlub25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOworCQlub25KYXZhUmVzb3VyY2VzQ291bnRlciA9IDA7CisJfQorCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworfQorLyoqCisgKi8KK2Jvb2xlYW4gY29udGFpbnNKYXZhUmVzb3VyY2VzKCkgeworCXJldHVybiBmQ2hpbGRyZW4ubGVuZ3RoICE9IDA7Cit9CisvKioKKyAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCisgKi8KK09iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBmTm9uSmF2YVJlc291cmNlczsKKwlpZiAobm9uSmF2YVJlc291cmNlcyA9PSBudWxsKSB7CisJCW5vbkphdmFSZXNvdXJjZXMgPSBjb21wdXRlTm9uSmF2YVJlc291cmNlcyh1bmRlcmx5aW5nUmVzb3VyY2UpOworCQlmTm9uSmF2YVJlc291cmNlcyA9IG5vbkphdmFSZXNvdXJjZXM7CisJfQorCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworfQorLyoqCisgKiBTZXQgdGhlIGZOb25KYXZhUmVzb3VyY2VzIHRvIHJlcyB2YWx1ZQorICovCitzeW5jaHJvbml6ZWQgdm9pZCBzZXROb25KYXZhUmVzb3VyY2VzKE9iamVjdFtdIHJlc291cmNlcykgeworCWZOb25KYXZhUmVzb3VyY2VzID0gcmVzb3VyY2VzOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmYzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTAsMCArMSwzOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIGNsYXNzIFBhY2thZ2VGcmFnbWVudFJvb3QgZXh0ZW5kcyBPcGVuYWJsZSBpbXBsZW1lbnRzIElQYWNrYWdlRnJhZ21lbnRSb290IHsKKworCS8qKgorCSAqIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290LgorCSAqIEBzZWUgSVJlc291cmNlCisJICovCisJcHJvdGVjdGVkIElSZXNvdXJjZSBmUmVzb3VyY2U7CisvKioKKyAqIENvbnN0cnVjdHMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIGphdmEgcGFja2FnZQorICogZGlyZWN0b3J5IGhpZXJhcmNoeS4KKyAqLworcHJvdGVjdGVkIFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlLCBJSmF2YVByb2plY3QgcHJvamVjdCkgeworCXRoaXMocmVzb3VyY2UsIHByb2plY3QsIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwlmUmVzb3VyY2UgPSByZXNvdXJjZTsKK30KKy8qKgorICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgamF2YSBwYWNrYWdlCisgKiBkaXJlY3RvcnkgaGllcmFyY2h5LgorICovCitwcm90ZWN0ZWQgUGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcGF0aCkgeworCXN1cGVyKFBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcHJvamVjdCwgcGF0aCk7CisJZlJlc291cmNlID0gcmVzb3VyY2U7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIHZvaWQgYXR0YWNoU291cmNlKElQYXRoIHppcFBhdGgsIElQYXRoIHJvb3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgdGhpcykpOworfQorLyoqCisgKiBDb21wdXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNoaWxkcmVuIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290LgorICogCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiAgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBkb2VzIG5vdCBleGlzdAorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlQ2hpbGRyZW4oT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0cnkgeworCQkvLyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBtYXkgYmUgYSBmb2xkZXIgb3IgYSBwcm9qZWN0IChpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9qZWN0IGZvbGRlcgorCQkvLyBpcyBhY3R1YWxseSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290KQorCQlpZiAoZlJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSIHx8IGZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKKwkJCUFycmF5TGlzdCB2Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJY29tcHV0ZUZvbGRlckNoaWxkcmVuKChJQ29udGFpbmVyKSBmUmVzb3VyY2UsICIiLCB2Q2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCisJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbdkNoaWxkcmVuLnNpemUoKV07CisJCQl2Q2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7CisJCQlpbmZvLnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCS8vcHJvYmxlbSByZXNvbHZpbmcgY2hpbGRyZW47IHN0cnVjdHVyZSByZW1haW5zIHVua25vd24KKwkJaW5mby5zZXRDaGlsZHJlbihuZXcgSUphdmFFbGVtZW50W117fSk7CisJCXRocm93IGU7CisJfQorCXJldHVybiB0cnVlOworfQorLyoqCisgKiBTdGFydGluZyBhdCB0aGlzIGZvbGRlciwgY3JlYXRlIHBhY2thZ2UgZnJhZ21lbnRzIGFuZCBhZGQgdGhlIGZyYWdtZW50cyB0byB0aGUgY29sbGVjdGlvbgorICogb2YgY2hpbGRyZW4uCisgKiAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uICBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSBmcmFnbWVudCBkb2VzIG5vdCBleGlzdAorICovCitwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRm9sZGVyQ2hpbGRyZW4oSUNvbnRhaW5lciBmb2xkZXIsIFN0cmluZyBwcmVmaXgsIEFycmF5TGlzdCB2Q2hpbGRyZW4pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KHByZWZpeCk7CisJdkNoaWxkcmVuLmFkZChwa2cpOworCXRyeSB7CisJCUlQYXRoIG91dHB1dExvY2F0aW9uUGF0aCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJSVJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5tZW1iZXJzKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKKwkJCVN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLmdldE5hbWUoKTsKKwkJCWlmIChtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgCisJCQkJJiYgVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UobWVtYmVyTmFtZSkpIHsKKwkJCQkJCisJCQkJU3RyaW5nIG5ld1ByZWZpeDsKKwkJCQlpZiAocHJlZml4Lmxlbmd0aCgpID09IDApIHsKKwkJCQkJbmV3UHJlZml4ID0gbWVtYmVyTmFtZTsKKwkJCQl9IGVsc2UgeworCQkJCQluZXdQcmVmaXggPSBwcmVmaXggKyAiLiIgKyBtZW1iZXJOYW1lOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCS8vIGVsaW1pbmF0ZSBiaW5hcnkgb3V0cHV0IG9ubHkgaWYgbmVzdGVkIGluc2lkZSBkaXJlY3Qgc3ViZm9sZGVycworCQkJCWlmICghbWVtYmVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG91dHB1dExvY2F0aW9uUGF0aCkpIHsKKwkJCQkJY29tcHV0ZUZvbGRlckNoaWxkcmVuKChJRm9sZGVyKSBtZW1iZXIsIG5ld1ByZWZpeCwgdkNoaWxkcmVuKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QpOyAvLyBjb3VsZCBiZSB0aHJvd24gYnkgRWxlbWVudFRyZWUgd2hlbiBwYXRoIGlzIG5vdCBmb3VuZAorCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCX0KK30KKy8qKgorICogUmV0dXJucyBhIG5ldyBlbGVtZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudC4KKyAqLworcHJvdGVjdGVkIE9wZW5hYmxlRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oKSB7CisJcmV0dXJuIG5ldyBQYWNrYWdlRnJhZ21lbnRSb290SW5mbygpOworfQorLyoqCisgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CisgKi8KK3B1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2VGcmFnbWVudChTdHJpbmcgbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlDcmVhdGVQYWNrYWdlRnJhZ21lbnRPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uKHRoaXMsIG5hbWUsIGZvcmNlKTsKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQobmFtZSk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHJvb3QncyBraW5kIC0gS19TT1VSQ0Ugb3IgS19CSU5BUlksIGRlZmF1bHRzCisgKiB0byBLX1NPVVJDRSBpZiBpdCBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aC4KKyAqCisgKiBAZXhjZXB0aW9uIE5vdFByZXNlbnRFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgYW5kIHJvb3QgZG8KKyAqIAkJbm90IGV4aXN0LgorICovCitwcm90ZWN0ZWQgaW50IGRldGVybWluZUtpbmQoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gKChKYXZhUHJvamVjdClnZXRKYXZhUHJvamVjdCgpKS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwlmb3IgKGludCBpPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk9IGVudHJpZXNbaV07CisJCWlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHVuZGVybHlpbmdSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSkgeworCQkJcmV0dXJuIGVudHJ5LmdldENvbnRlbnRLaW5kKCk7CisJCX0KKwl9CisJcmV0dXJuIElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFOworfQorLyoqCisgKiBDb21wYXJlcyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHk7CisgKiBmb3IgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT5zLCBlcXVhbGl0eSBpcyBoYXZpbmcgdGhlCisgKiBzYW1lIDxjb2RlPkphdmFNb2RlbDwvY29kZT4sIHNhbWUgcmVzb3VyY2VzLCBhbmQgb2NjdXJyZW5jZSBjb3VudC4KKyAqCisgKi8KK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCWlmICh0aGlzID09IG8pCisJCXJldHVybiB0cnVlOworCWlmICghKG8gaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnRSb290KSkKKwkJcmV0dXJuIGZhbHNlOworCVBhY2thZ2VGcmFnbWVudFJvb3Qgb3RoZXIgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgbzsKKwlyZXR1cm4gZ2V0SmF2YU1vZGVsKCkuZXF1YWxzKG90aGVyLmdldEphdmFNb2RlbCgpKSAmJiAKKwkJCWZSZXNvdXJjZS5lcXVhbHMob3RoZXIuZlJlc291cmNlKSAmJgorCQkJZk9jY3VycmVuY2VDb3VudCA9PSBvdGhlci5mT2NjdXJyZW5jZUNvdW50OworfQorCisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKworCXJldHVybiBzdXBlci5leGlzdHMoKSAKKwkJCQkmJiBpc09uQ2xhc3NwYXRoKCk7Cit9CisJCQorLyoqCisgKiBAc2VlIE9wZW5hYmxlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlSW5mb3MoT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBNYXAgbmV3RWxlbWVudHMsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQorCSgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGluZm8pLnNldFJvb3RLaW5kKGRldGVybWluZUtpbmQodW5kZXJseWluZ1Jlc291cmNlKSk7CisJcmV0dXJuIGNvbXB1dGVDaGlsZHJlbihpbmZvKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpIHsKKwlyZXR1cm4gSmF2YUVsZW1lbnQuSkVNX1BBQ0tBR0VGUkFHTUVOVFJPT1Q7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIGludCBnZXRLaW5kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pZ2V0RWxlbWVudEluZm8oKSkuZ2V0Um9vdEtpbmQoKTsKK30KKy8qKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KKyAqLworcHVibGljIE9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gKChQYWNrYWdlRnJhZ21lbnRSb290SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZ2V0Tm9uSmF2YVJlc291cmNlcyhnZXRKYXZhUHJvamVjdCgpLCBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSkgeworCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50KHRoaXMsIHBhY2thZ2VOYW1lKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGUgZ2l2ZW4gZm9sZGVyCisgKiAod2hpY2ggaXMgYSBkZWNlbmRlbnQgb2YgdGhpcyByb290KS4KKyAqLworcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZShJRm9sZGVyIGZvbGRlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVBhdGggbXlQYXRoPSBnZXRQYXRoKCk7CisJSVBhdGggcGtnUGF0aD0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7CisJaW50IG15U2VnbWVudENvdW50PSBteVBhdGguc2VnbWVudENvdW50KCk7CisJaW50IHBrZ1NlZ21lbnRDb3VudD0gcGtnUGF0aC5zZWdtZW50Q291bnQoKTsKKwlTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7CisJZm9yIChpbnQgaT0gbXlTZWdtZW50Q291bnQ7IGkgPCBwa2dTZWdtZW50Q291bnQ7IGkrKykgeworCQlpZiAoaSA+IG15U2VnbWVudENvdW50KSB7CisJCQluYW1lLmFwcGVuZCgnLicpOworCQl9CisJCW5hbWUuYXBwZW5kKHBrZ1BhdGguc2VnbWVudChpKSk7CisJfQorCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJUGF0aCBnZXRQYXRoKCkgeworCXJldHVybiBmUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKK30KKy8qCisgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290IAorICovCitwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFJhd0NsYXNzcGF0aEVudHJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVBhdGggcGF0aD0gdGhpcy5nZXRQYXRoKCk7CisJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpOworCWZvciAoaW50IGk9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisJCisJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgorCQkJCS8vIGEgcm9vdCdzIHByb2plY3QgYWx3YXlzIHJlZmVycyBkaXJlY3RseSB0byB0aGUgcm9vdAorCQkJCS8vIG5vIG5lZWQgdG8gZm9sbG93IHRoZSBwcm9qZWN0IHJlZmVyZW5jZQorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKKwkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHRoaXMuZ2V0SmF2YVByb2plY3QoKSk7CisJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKXsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKyl7CisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGNvbnRhaW5lckVudHJpZXNbal0pOworCQkJCQkJaWYgKGNvbnRhaW5lckVudHJ5ICE9IG51bGwgJiYgcGF0aC5lcXVhbHMoY29udGFpbmVyRW50cnkuZ2V0UGF0aCgpKSkgeworCQkJCQkJCXJldHVybiBlbnRyeTsgLy8gYW5zd2VyIG9yaWdpbmFsIGVudHJ5CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6CisJCQkJZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKKwkJCQkvLyBkb24ndCBicmVhayBzbyBhcyB0byBydW4gZGVmYXVsdAorCQkJZGVmYXVsdDoKKwkJCQlpZiAoZW50cnkgIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7CisJCQkJCXJldHVybiBlbnRyaWVzW2ldOworCQkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCXJldHVybiBmUmVzb3VyY2U7Cit9CisvKioKKyAqIENhbm5vdCBhdHRhY2ggc291cmNlIHRvIGEgZm9sZGVyLgorICoKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIENhbm5vdCBhdHRhY2ggc291cmNlIHRvIGEgZm9sZGVyLgorICoKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChmUmVzb3VyY2UuZXhpc3RzKCkpIHsKKwkJcmV0dXJuIGZSZXNvdXJjZTsKKwl9IGVsc2UgeworCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJfQorCQorfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gZlJlc291cmNlLmhhc2hDb2RlKCk7Cit9CisvKioKKyAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKKyAqLworcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAorICovCitwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgeworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBvbiB0aGUgY2xhc3NwYXRoIG9mIGl0cyBwcm9qZWN0LgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKCkgeworCisJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCk7CisKKwlpZiAodGhpcy5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJSVBhdGggcGF0aCA9IHRoaXMuZ2V0UGF0aCgpOworCisJdHJ5IHsKKwkJLy8gY2hlY2sgcGFja2FnZSBmcmFnbWVudCByb290IG9uIGNsYXNzcGF0aCBvZiBpdHMgcHJvamVjdAorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwkKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkvLyBjb3VsZCBub3QgcmVhZCBjbGFzc3BhdGgsIHRoZW4gYXNzdW1lIGl0IGlzIG91dHNpZGUKKwl9CisJcmV0dXJuIGZhbHNlOworCit9CisKK3Byb3RlY3RlZCB2b2lkIG9wZW5XaGVuQ2xvc2VkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmICghdGhpcy5yZXNvdXJjZUV4aXN0cygpIHx8ICF0aGlzLmlzT25DbGFzc3BhdGgoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCXN1cGVyLm9wZW5XaGVuQ2xvc2VkKHBtKTsKK30KKworLyoqCisgKiBSZWNvbXB1dGVzIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQsIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlCisgKiBvZiB0aGUgd29ya2JlbmNoLgorICovCitwdWJsaWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKSB7CisJdHJ5IHsKKwkJT3BlbmFibGVFbGVtZW50SW5mbyBpbmZvPSAoT3BlbmFibGVFbGVtZW50SW5mbylnZXRFbGVtZW50SW5mbygpOworCQljb21wdXRlQ2hpbGRyZW4oaW5mbyk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJLy8gZG8gbm90aGluZy4KKwl9Cit9CisvKgorICogQHNlZSBKYXZhRWxlbWVudCNyb290ZWRBdChJSmF2YVByb2plY3QpCisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgcm9vdGVkQXQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwlyZXR1cm4KKwkJbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QoCisJCQlmUmVzb3VyY2UsCisJCQlwcm9qZWN0LCAKKwkJCWZOYW1lKTsKK30KKy8qKgorICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgeworCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJaWYgKGdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPT0gMCkgeworCQlidWZmZXIuYXBwZW5kKCJbcHJvamVjdCByb290XSIpOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwl9CisJaWYgKGluZm8gPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1MTU0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCisvKioKKyAqIFRoZSBlbGVtZW50IGluZm8gZm9yIDxjb2RlPlBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+cy4KKyAqLworY2xhc3MgUGFja2FnZUZyYWdtZW50Um9vdEluZm8gZXh0ZW5kcyBPcGVuYWJsZUVsZW1lbnRJbmZvIHsKKworCS8qKgorCSAqIFRoZSBraW5kIG9mIHRoZSByb290IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluZm8uCisJICogVmFsaWQga2luZHMgYXJlOiA8dWw+CisJICogPGxpPjxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFPC9jb2RlPgorCSAqIDxsaT48Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWTwvY29kZT48L3VsPgorCSAqLworCXByb3RlY3RlZCBpbnQgZlJvb3RLaW5kPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKKworCS8qKgorCSAqIEEgYXJyYXkgd2l0aCBhbGwgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgYnkgdGhpcyBQYWNrYWdlRnJhZ21lbnQKKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0W10gZk5vbkphdmFSZXNvdXJjZXM7CisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIKKyAqLworcHVibGljIFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKCkgeworCWZOb25KYXZhUmVzb3VyY2VzID0gbnVsbDsKK30KKy8qKgorICogU3RhcnRpbmcgYXQgdGhpcyBmb2xkZXIsIGNyZWF0ZSBub24tamF2YSByZXNvdXJjZXMgZm9yIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IAorICogYW5kIGFkZCB0aGVtIHRvIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29sbGVjdGlvbi4KKyAqIAorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IGRvZXMgbm90IGV4aXN0CisgKi8KK3ByaXZhdGUgT2JqZWN0W10gY29tcHV0ZUZvbGRlck5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBmb2xkZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlWzVdOworCWludCBub25KYXZhUmVzb3VyY2VzQ291bnRlciA9IDA7CisJdHJ5IHsKKwkJSVJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5tZW1iZXJzKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKKwkJCWlmIChtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJU3RyaW5nIGZpbGVOYW1lID0gbWVtYmVyLmdldE5hbWUoKTsKKwkJCQlpZiAoIVV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoZmlsZU5hbWUpICYmICFVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGZpbGVOYW1lKSkgeworCQkJCQkvLyBjaGVjayBjYXNlIG9mIGEgLnppcCBvciAuamFyIGZpbGUgb24gY2xhc3NwYXRoCisJCQkJCWlmIChwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChtZW1iZXIuZ2V0RnVsbFBhdGgoKSkgPT0gbnVsbCkgeworCQkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQkJCQkJLy8gcmVzaXplCisJCQkJCQkJU3lzdGVtLmFycmF5Y29weShub25KYXZhUmVzb3VyY2VzLCAwLCAobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCQkJCX0KKwkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSBtZW1iZXI7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgeworCQkJCWlmICghVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UobWVtYmVyLmdldE5hbWUoKSkpIHsKKwkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQkJCQkvLyByZXNpemUKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyICogMl0pLCAwLCBub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CisJCQkJCX0KKwkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IG1lbWJlcjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoICE9IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG5vbkphdmFSZXNvdXJjZXMsIDAsIChub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlcl0pLCAwLCBub25KYXZhUmVzb3VyY2VzQ291bnRlcik7CisJCX0KKwkJcmV0dXJuIG5vbkphdmFSZXNvdXJjZXM7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorfQorLyoqCisgKiBDb21wdXRlIHRoZSBub24tcGFja2FnZSByZXNvdXJjZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisgKiAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uICBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGRvZXMgbm90IGV4aXN0CisgKi8KK3ByaXZhdGUgT2JqZWN0W10gY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMoSUphdmFQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKKwlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOworCXRyeSB7CisJCS8vIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG1heSBiZSBhIGZvbGRlciBvciBhIHByb2plY3QgKGluIHRoZSBjYXNlIHRoYXQgdGhlIHByb2plY3QgZm9sZGVyCisJCS8vIGlzIGFjdHVhbGx5IHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QpCisJCWlmICh1bmRlcmx5aW5nUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgdW5kZXJseWluZ1Jlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeworCQkJbm9uSmF2YVJlc291cmNlcyA9IGNvbXB1dGVGb2xkZXJOb25KYXZhUmVzb3VyY2VzKChKYXZhUHJvamVjdClwcm9qZWN0LCAoSUNvbnRhaW5lcikgdW5kZXJseWluZ1Jlc291cmNlKTsKKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworfQorLyoqCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgorICovCitzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBmTm9uSmF2YVJlc291cmNlczsKKwlpZiAobm9uSmF2YVJlc291cmNlcyA9PSBudWxsKSB7CisJCW5vbkphdmFSZXNvdXJjZXMgPSB0aGlzLmNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKHByb2plY3QsIHVuZGVybHlpbmdSZXNvdXJjZSk7CisJCWZOb25KYXZhUmVzb3VyY2VzID0gbm9uSmF2YVJlc291cmNlczsKKwl9CisJcmV0dXJuIG5vbkphdmFSZXNvdXJjZXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyByb290LgorICovCitwdWJsaWMgaW50IGdldFJvb3RLaW5kKCkgeworCXJldHVybiBmUm9vdEtpbmQ7Cit9CisvKioKKyAqIFNldCB0aGUgZk5vbkphdmFSZXNvdXJjZXMgdG8gcmVzIHZhbHVlCisgKi8KK3N5bmNocm9uaXplZCB2b2lkIHNldE5vbkphdmFSZXNvdXJjZXMoT2JqZWN0W10gcmVzb3VyY2VzKSB7CisJZk5vbkphdmFSZXNvdXJjZXMgPSByZXNvdXJjZXM7Cit9CisvKioKKyAqIFNldHMgdGhlIGtpbmQgb2YgdGhpcyByb290LgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRSb290S2luZChpbnQgbmV3Um9vdEtpbmQpIHsKKwlmUm9vdEtpbmQgPSBuZXdSb290S2luZDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVnaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiZDk5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhcmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUmVnaW9uOworCisKKy8qKgorICogQHNlZSBJUmVnaW9uCisgKi8KKyAKK3B1YmxpYyBjbGFzcyBSZWdpb24gaW1wbGVtZW50cyBJUmVnaW9uIHsKKworCS8qKgorCSAqIEEgY29sbGVjdGlvbiBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnRzCisJICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHJlZ2lvbgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZlJvb3RFbGVtZW50czsKKy8qKgorICogQ3JlYXRlcyBhbiBlbXB0eSByZWdpb24uCisgKgorICogQHNlZSBJUmVnaW9uCisgKi8KK3B1YmxpYyBSZWdpb24oKSB7CisJZlJvb3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Cit9CisvKioKKyAqIEBzZWUgSVJlZ2lvbiNhZGQoSUphdmFFbGVtZW50KQorICovCitwdWJsaWMgdm9pZCBhZGQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlpZiAoIWNvbnRhaW5zKGVsZW1lbnQpKSB7CisJCS8vIm5ldyIgZWxlbWVudCBhZGRlZCB0byByZWdpb24KKwkJcmVtb3ZlQWxsQ2hpbGRyZW4oZWxlbWVudCk7CisJCWZSb290RWxlbWVudHMuYWRkKGVsZW1lbnQpOworCQlmUm9vdEVsZW1lbnRzLnRyaW1Ub1NpemUoKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVJlZ2lvbgorICovCitwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQorCWludCBzaXplID0gZlJvb3RFbGVtZW50cy5zaXplKCk7CisJQXJyYXlMaXN0IHBhcmVudHMgPSBnZXRBbmNlc3RvcnMoZWxlbWVudCk7CisJCisJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJSUphdmFFbGVtZW50IGFUb3AgPSAoSUphdmFFbGVtZW50KSBmUm9vdEVsZW1lbnRzLmdldChpKTsKKwkJaWYgKGFUb3AuZXF1YWxzKGVsZW1lbnQpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlmb3IgKGludCBqID0gMCwgcFNpemUgPSBwYXJlbnRzLnNpemUoKTsgaiA8IHBTaXplOyBqKyspIHsKKwkJCWlmIChhVG9wLmVxdWFscyhwYXJlbnRzLmdldChqKSkpIHsKKwkJCQkvL2FuIGFuY2VzdG9yIGlzIGFscmVhZHkgaW5jbHVkZWQKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgcGFyZW50cyBvZiB0aGlzIGVsZW1lbnQKKyAqIGluIGJvdHRvbS11cCBvcmRlci4KKyAqCisgKi8KK3ByaXZhdGUgQXJyYXlMaXN0IGdldEFuY2VzdG9ycyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCUFycmF5TGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOworCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworCQlwYXJlbnRzLmFkZChwYXJlbnQpOworCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJfQorCXBhcmVudHMudHJpbVRvU2l6ZSgpOworCXJldHVybiBwYXJlbnRzOworfQorLyoqCisgKiBAc2VlIElSZWdpb24KKyAqLworcHVibGljIElKYXZhRWxlbWVudFtdIGdldEVsZW1lbnRzKCkgeworCWludCBzaXplPSBmUm9vdEVsZW1lbnRzLnNpemUoKTsKKwlJSmF2YUVsZW1lbnRbXSByb290cz0gbmV3IElKYXZhRWxlbWVudFtzaXplXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlyb290c1tpXT0gKElKYXZhRWxlbWVudCkgZlJvb3RFbGVtZW50cy5nZXQoaSk7CisJfQorCisJcmV0dXJuIHJvb3RzOworfQorLyoqCisgKiBAc2VlIElSZWdpb24jcmVtb3ZlKElKYXZhRWxlbWVudCkKKyAqLworcHVibGljIGJvb2xlYW4gcmVtb3ZlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisKKwlyZW1vdmVBbGxDaGlsZHJlbihlbGVtZW50KTsKKwlyZXR1cm4gZlJvb3RFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Cit9CisvKioKKyAqIFJlbW92ZXMgYW55IGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudCB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMKKyAqIHJlZ2lvbiBhcyB0aGlzIHBhcmVudCBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUgcmVnaW9uLgorICoKKyAqIDxwPkNoaWxkcmVuIGFyZSBhbGwgY2hpbGRyZW4sIG5vdCBqdXN0IGRpcmVjdCBjaGlsZHJlbi4KKyAqLworcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50KSB7CisJCUFycmF5TGlzdCBuZXdSb290RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwLCBzaXplID0gZlJvb3RFbGVtZW50cy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBjdXJyZW50Um9vdCA9IChJSmF2YUVsZW1lbnQpZlJvb3RFbGVtZW50cy5nZXQoaSk7CisJCQkvL3dhbGsgdGhlIGN1cnJlbnQgcm9vdCBoaWVyYXJjaHkKKwkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBjdXJyZW50Um9vdC5nZXRQYXJlbnQoKTsKKwkJCWJvb2xlYW4gaXNDaGlsZD0gZmFsc2U7CisJCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKKwkJCQlpZiAocGFyZW50LmVxdWFscyhlbGVtZW50KSkgeworCQkJCQlpc0NoaWxkPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQkJfQorCQkJaWYgKCFpc0NoaWxkKSB7CisJCQkJbmV3Um9vdEVsZW1lbnRzLmFkZChjdXJyZW50Um9vdCk7CisJCQl9CisJCX0KKwkJZlJvb3RFbGVtZW50cz0gbmV3Um9vdEVsZW1lbnRzOworCX0KK30KKy8qKgorICogUmV0dXJucyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlZ2lvbi4KKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJSUphdmFFbGVtZW50W10gcm9vdHM9IGdldEVsZW1lbnRzKCk7CisJYnVmZmVyLmFwcGVuZCgnWycpOworCWZvciAoaW50IGk9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgeworCQlidWZmZXIuYXBwZW5kKHJvb3RzW2ldLmdldEVsZW1lbnROYW1lKCkpOworCQlpZiAoaSA8IChyb290cy5sZW5ndGggLSAxKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThjYTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gcmVuYW1lcyBlbGVtZW50cy4KKyAqCisgKiA8cD5Ob3Rlczo8dWw+CisgKiA8bGk+UmVzb3VyY2UgcmVuYW1lIGlzIG5vdCBzdXBwb3J0ZWQgLSB0aGlzIG9wZXJhdGlvbiBvbmx5IHJlbmFtZXMKKyAqCSAgIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBjb21waWxhdGlvbiB1bml0cy4KKyAqIDxsaT5XaGVuIGEgbWFpbiB0eXBlIGlzIHJlbmFtZWQsIGl0cyBjb21waWxhdGlvbiB1bml0IGFuZCBjb25zdHJ1Y3RvcnMgYXJlIHJlbmFtZWQuCisgKiA8bGk+Q29uc3RydWN0b3JzIGNhbm5vdCBiZSByZW5hbWVkLgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIFJlbmFtZUVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgTW92ZUVsZW1lbnRzT3BlcmF0aW9uIHsKKy8qKgorICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCByZW5hbWUgdGhlIHNwZWNpZmllZCBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiBuYW1lcyBpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb25zLgorICovCitwdWJsaWMgUmVuYW1lRWxlbWVudHNPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGRlc3RpbmF0aW9ucywgU3RyaW5nW10gbmV3TmFtZXMsIGJvb2xlYW4gZm9yY2UpIHsKKwkvL2EgcmVuYW1lIGlzIGEgbW92ZSB0byB0aGUgc2FtZSBwYXJlbnQgd2l0aCBhIG5ldyBuYW1lIHNwZWNpZmllZAorCS8vdGhlc2UgZWxlbWVudHMgYXJlIGZyb20gZGlmZmVyZW50IHBhcmVudHMKKwlzdXBlcihlbGVtZW50cywgZGVzdGluYXRpb25zLCBmb3JjZSk7CisJc2V0UmVuYW1pbmdzKG5ld05hbWVzKTsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKKwlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucmVuYW1lRWxlbWVudFByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQHNlZSBDb3B5RWxlbWVudHNPcGVyYXRpb24jaXNSZW5hbWUoKQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbmFtZSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwlpZiAoISBzdGF0dXMuaXNPSygpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChmUmVuYW1pbmdzTGlzdCA9PSBudWxsIHx8IGZSZW5hbWluZ3NMaXN0Lmxlbmd0aCA9PSAwKQorCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5VTExfTkFNRSk7CisJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKK30KKy8qKgorICogQHNlZSBNdWx0aU9wZXJhdGlvbgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKKwkKKwlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQorCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnQpOworCQkKKwlpZiAoZWxlbWVudC5pc1JlYWRPbmx5KCkpCisJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCBlbGVtZW50KTsKKwkJCisJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElTb3VyY2VSZWZlcmVuY2UpKQorCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisJCQorCWlmIChlbGVtZW50VHlwZSA8IElKYXZhRWxlbWVudC5UWVBFIHx8IGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5JTklUSUFMSVpFUikKKwkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOworCQkKKwl2ZXJpZnlSZW5hbWluZyhlbGVtZW50KTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM1MTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gcmVuYW1lcyByZXNvdXJjZXMgKFBhY2thZ2UgZnJhZ21lbnRzIGFuZCBjb21waWxhdGlvbiB1bml0cykuCisgKgorICogPHA+Tm90ZXM6PHVsPgorICogPGxpPldoZW4gYSBjb21waWxhdGlvbiB1bml0IGlzIHJlbmFtZWQsIGl0cyBtYWluIHR5cGUgYW5kIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIAorICogCQltYWluIHR5cGUgYXJlIHJlbmFtZWQuCisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbiBleHRlbmRzIE1vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uIHsKKy8qKgorICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCByZW5hbWUgdGhlIHNwZWNpZmllZCBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiBuYW1lcyBpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb25zLgorICovCitwdWJsaWMgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gZGVzdGluYXRpb25zLCBTdHJpbmdbXSBuZXdOYW1lcywgYm9vbGVhbiBmb3JjZSkgeworCS8vYSByZW5hbWUgaXMgYSBtb3ZlIHRvIHRoZSBzYW1lIHBhcmVudCB3aXRoIGEgbmV3IG5hbWUgc3BlY2lmaWVkCisJLy90aGVzZSBlbGVtZW50cyBhcmUgZnJvbSBkaWZmZXJlbnQgcGFyZW50cworCXN1cGVyKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIGZvcmNlKTsKKwlzZXRSZW5hbWluZ3MobmV3TmFtZXMpOworfQorLyoqCisgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgeworCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5yZW5hbWVSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQHNlZSBDb3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbiNpc1JlbmFtZSgpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzUmVuYW1lKCkgeworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHZlcmlmeShJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJc3VwZXIudmVyaWZ5KGVsZW1lbnQpOworCisJaW50IGVsZW1lbnRUeXBlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpOworCQorCWlmICghKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIHx8IGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSkgeworCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CisJfQorCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQlpZiAoKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKKwkJfQorCX0KKwl2ZXJpZnlSZW5hbWluZyhlbGVtZW50KTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4NzJlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsMzMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSVR5cGVOYW1lUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlYXJjaFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqCVRoaXMgY2xhc3MgcHJvdmlkZXMgYSA8Y29kZT5TZWFyY2hhYmxlQnVpbGRlckVudmlyb25tZW50PC9jb2RlPiBmb3IgY29kZSBhc3Npc3Qgd2hpY2gKKyAqCXVzZXMgdGhlIEphdmEgbW9kZWwgYXMgYSBzZWFyY2ggdG9vbC4gIAorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoYWJsZUVudmlyb25tZW50CisJaW1wbGVtZW50cyBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCwgSUphdmFTZWFyY2hDb25zdGFudHMgeworCXByb3RlY3RlZCBOYW1lTG9va3VwIG5hbWVMb29rdXA7CisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcDsKKworCXByb3RlY3RlZCBJSmF2YVByb2plY3QgcHJvamVjdDsKKwlwcm90ZWN0ZWQgSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBTZWFyY2hhYmxlRW52aXJvbm1lbnQgb24gdGhlIGdpdmVuIHByb2plY3QKKwkgKi8KKwlwdWJsaWMgU2VhcmNoYWJsZUVudmlyb25tZW50KElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5uYW1lTG9va3VwID0gKE5hbWVMb29rdXApICgoSmF2YVByb2plY3QpIHByb2plY3QpLmdldE5hbWVMb29rdXAoKTsKKworCQkvLyBDcmVhdGUgc2VhcmNoIHNjb3BlIHdpdGggdmlzaWJsZSBlbnRyeSBvbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aAorCQl0aGlzLnNlYXJjaFNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZSh0aGlzLnByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZ2l2ZW4gdHlwZSBpbiB0aGUgdGhlIGdpdmVuIHBhY2thZ2UgaWYgaXQgZXhpc3RzLAorCSAqIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKwkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpCisJCQlwYWNrYWdlTmFtZSA9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCUlUeXBlIHR5cGUgPQorCQkJdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKAorCQkJCXR5cGVOYW1lLAorCQkJCXBhY2thZ2VOYW1lLAorCQkJCWZhbHNlLAorCQkJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoCisJCQkJCQkoSUJpbmFyeVR5cGUpICgoQmluYXJ5VHlwZSkgdHlwZSkuZ2V0UmF3SW5mbygpKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0gZWxzZSB7IC8vU291cmNlVHlwZQorCQkJCXRyeSB7CisJCQkJCS8vIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgdHlwZQorCQkJCQlTb3VyY2VUeXBlRWxlbWVudEluZm8gc291cmNlVHlwZSA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pKChTb3VyY2VUeXBlKXR5cGUpLmdldFJhd0luZm8oKTsKKwkJCQkJSVNvdXJjZVR5cGUgdG9wTGV2ZWxUeXBlID0gc291cmNlVHlwZTsKKwkJCQkJd2hpbGUgKHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgeworCQkJCQkJdG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkJCQkJfQorCQkJCQkvLyBmaW5kIGFsbCBzaWJsaW5ncyAob3RoZXIgdHlwZXMgZGVjbGFyZWQgaW4gc2FtZSB1bml0LCBzaW5jZSBtYXkgYmUgdXNlZCBmb3IgbmFtZSByZXNvbHV0aW9uKQorCQkJCQlJVHlwZVtdIHR5cGVzID0gc291cmNlVHlwZS5nZXRIYW5kbGUoKS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlcygpOworCQkJCQlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzID0gbmV3IElTb3VyY2VUeXBlW3R5cGVzLmxlbmd0aF07CisKKwkJCQkJLy8gaW4gdGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uLCBlbnN1cmUgdGhlIHJlcXVlc3RlZCB0eXBlIGlzIHRoZSBmaXJzdCBvbmUKKwkJCQkJc291cmNlVHlwZXNbMF0gPSBzb3VyY2VUeXBlOworCQkJCQlmb3IgKGludCBpID0gMCwgaW5kZXggPSAxOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCUlTb3VyY2VUeXBlIG90aGVyVHlwZSA9CisJCQkJCQkJKElTb3VyY2VUeXBlKSAoKEphdmFFbGVtZW50KSB0eXBlc1tpXSkuZ2V0UmF3SW5mbygpOworCQkJCQkJaWYgKCFvdGhlclR5cGUuZXF1YWxzKHRvcExldmVsVHlwZSkpCisJCQkJCQkJc291cmNlVHlwZXNbaW5kZXgrK10gPSBvdGhlclR5cGU7CisJCQkJCX0KKwkJCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoc291cmNlVHlwZXMpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQjZmluZFBhY2thZ2VzKGNoYXJbXSwgSVNlYXJjaFJlcXVlc3RvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaW5kUGFja2FnZXMoY2hhcltdIHByZWZpeCwgSVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJdGhpcy5uYW1lTG9va3VwLnNlZWtQYWNrYWdlRnJhZ21lbnRzKAorCQkJbmV3IFN0cmluZyhwcmVmaXgpLAorCQkJdHJ1ZSwKKwkJCW5ldyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IocmVxdWVzdG9yKSk7CisJfQorCisJLyoqCisJICogQHNlZSBJTmFtZUVudmlyb25tZW50I2ZpbmRUeXBlKGNoYXJbXVtdKQorCSAqLworCXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmRUeXBlTmFtZSkgeworCQlpZiAoY29tcG91bmRUeXBlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCQlpbnQgbGVuZ3RoID0gY29tcG91bmRUeXBlTmFtZS5sZW5ndGg7CisJCWlmIChsZW5ndGggPD0gMSkgeworCQkJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKKwkJCXJldHVybiBmaW5kKG5ldyBTdHJpbmcoY29tcG91bmRUeXBlTmFtZVswXSksIG51bGwpOworCQl9CisKKwkJaW50IGxlbmd0aE0xID0gbGVuZ3RoIC0gMTsKKwkJY2hhcltdW10gcGFja2FnZU5hbWUgPSBuZXcgY2hhcltsZW5ndGhNMV1bXTsKKwkJU3lzdGVtLmFycmF5Y29weShjb21wb3VuZFR5cGVOYW1lLCAwLCBwYWNrYWdlTmFtZSwgMCwgbGVuZ3RoTTEpOworCisJCXJldHVybiBmaW5kKAorCQkJbmV3IFN0cmluZyhjb21wb3VuZFR5cGVOYW1lW2xlbmd0aE0xXSksCisJCQlDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHBhY2thZ2VOYW1lKSk7CisJfQorCisJLyoqCisJICogQHNlZSBJTmFtZUVudmlyb25tZW50I2ZpbmRUeXBlKGNoYXJbXSwgY2hhcltdW10pCisJICovCisJcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW10gbmFtZSwgY2hhcltdW10gcGFja2FnZU5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIGZpbmQoCisJCQluZXcgU3RyaW5nKG5hbWUpLAorCQkJcGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCA/IG51bGwgOiBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHBhY2thZ2VOYW1lKSk7CisJfQorCisJLyoqCisJICogQHNlZSBJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCNmaW5kVHlwZXMoY2hhcltdLCBJU2VhcmNoUmVxdWVzdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIGZpbmRUeXBlcyhjaGFyW10gcHJlZml4LCBmaW5hbCBJU2VhcmNoUmVxdWVzdG9yIHN0b3JhZ2UpIHsKKworCQkvKgorCQkJaWYgKHRydWUpeworCQkJCWZpbmRUeXBlcyhuZXcgU3RyaW5nKHByZWZpeCksIHN0b3JhZ2UsIE5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJCQlyZXR1cm47CQkKKwkJCX0KKwkJKi8KKwkJdHJ5IHsKKwkJCWZpbmFsIFN0cmluZyBleGNsdWRlUGF0aDsKKwkJCWlmICh0aGlzLnVuaXRUb1NraXAgIT0gbnVsbCkgeworCQkJCWlmICghKHRoaXMudW5pdFRvU2tpcCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkpIHsKKwkJCQkJLy8gcmV2ZXJ0IHRvIG1vZGVsIGludmVzdGlnYXRpb24KKwkJCQkJZmluZFR5cGVzKAorCQkJCQkJbmV3IFN0cmluZyhwcmVmaXgpLAorCQkJCQkJc3RvcmFnZSwKKwkJCQkJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlleGNsdWRlUGF0aCA9CisJCQkJCSgoSUphdmFFbGVtZW50KSB0aGlzLnVuaXRUb1NraXApCisJCQkJCQkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkKKwkJCQkJCS5nZXRGdWxsUGF0aCgpCisJCQkJCQkudG9TdHJpbmcoKTsKKwkJCX0gZWxzZSB7CisJCQkJZXhjbHVkZVBhdGggPSBudWxsOworCQkJfQorCQkJaW50IGxhc3REb3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBwcmVmaXgpOworCQkJY2hhcltdIHF1YWxpZmljYXRpb24sIHNpbXBsZU5hbWU7CisJCQlpZiAobGFzdERvdEluZGV4IDwgMCkgeworCQkJCXF1YWxpZmljYXRpb24gPSBudWxsOworCQkJCXNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHByZWZpeCk7CisJCQl9IGVsc2UgeworCQkJCXF1YWxpZmljYXRpb24gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHByZWZpeCwgMCwgbGFzdERvdEluZGV4KTsKKwkJCQlzaW1wbGVOYW1lID0KKwkJCQkJQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSgKKwkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkocHJlZml4LCBsYXN0RG90SW5kZXggKyAxLCBwcmVmaXgubGVuZ3RoKSk7CisJCQl9CisKKwkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IElQcm9ncmVzc01vbml0b3IoKSB7CisJCQkJYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7CisJCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGRvbmUoKSB7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7CisJCQkJfQorCQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisJCQkJCXJldHVybiBpc0NhbmNlbGVkOworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7CisJCQkJCWlzQ2FuY2VsZWQgPSB2YWx1ZTsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgeworCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKKwkJCQl9CisJCQl9OworCQkJSVR5cGVOYW1lUmVxdWVzdG9yIG5hbWVSZXF1ZXN0b3IgPSBuZXcgSVR5cGVOYW1lUmVxdWVzdG9yKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKAorCQkJCQljaGFyW10gcGFja2FnZU5hbWUsCisJCQkJCWNoYXJbXSBzaW1wbGVUeXBlTmFtZSwKKwkJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAorCQkJCQlTdHJpbmcgcGF0aCkgeworCQkJCQlpZiAoZXhjbHVkZVBhdGggIT0gbnVsbCAmJiBleGNsdWRlUGF0aC5lcXVhbHMocGF0aCkpCisJCQkJCQlyZXR1cm47CisJCQkJCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCAmJiBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoID4gMCkKKwkJCQkJCXJldHVybjsgLy8gYWNjZXB0IG9ubHkgdG9wIGxldmVsIHR5cGVzCisJCQkJCXN0b3JhZ2UuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBJQ29uc3RhbnRzLkFjY1B1YmxpYyk7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZSgKKwkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLAorCQkJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCisJCQkJCWNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywKKwkJCQkJU3RyaW5nIHBhdGgpIHsKKwkJCQkJaWYgKGV4Y2x1ZGVQYXRoICE9IG51bGwgJiYgZXhjbHVkZVBhdGguZXF1YWxzKHBhdGgpKQorCQkJCQkJcmV0dXJuOworCQkJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwgJiYgZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA+IDApCisJCQkJCQlyZXR1cm47IC8vIGFjY2VwdCBvbmx5IHRvcCBsZXZlbCB0eXBlcworCQkJCQlzdG9yYWdlLmFjY2VwdEludGVyZmFjZShwYWNrYWdlTmFtZSwgc2ltcGxlVHlwZU5hbWUsIElDb25zdGFudHMuQWNjUHVibGljKTsKKwkJCQl9CisJCQl9OworCQkJdHJ5IHsKKwkJCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKAorCQkJCQl0aGlzLnByb2plY3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0V29ya3NwYWNlKCksCisJCQkJCXF1YWxpZmljYXRpb24sCisJCQkJCXNpbXBsZU5hbWUsCisJCQkJCVBSRUZJWF9NQVRDSCwKKwkJCQkJQ0FTRV9JTlNFTlNJVElWRSwKKwkJCQkJSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwKKwkJCQkJdGhpcy5zZWFyY2hTY29wZSwKKwkJCQkJbmFtZVJlcXVlc3RvciwKKwkJCQkJQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gsCisJCQkJCXByb2dyZXNzTW9uaXRvcik7CisJCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisJCQkJZmluZFR5cGVzKAorCQkJCQluZXcgU3RyaW5nKHByZWZpeCksCisJCQkJCXN0b3JhZ2UsCisJCQkJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWZpbmRUeXBlcygKKwkJCQluZXcgU3RyaW5nKHByZWZpeCksCisJCQkJc3RvcmFnZSwKKwkJCQlOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTIHwgTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB0eXBlcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiAocXVhbGlmaWVkKSA8Y29kZT5wcmVmaXg8L2NvZGU+LgorCSAqCisJICogSWYgdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gaXMgdW5xdWFsaWZpZWQsIGFsbCB0eXBlcyB3aG9zZSBzaW1wbGUgbmFtZSBtYXRjaGVzCisJICogdGhlIDxjb2RlPnByZWZpeDwvY29kZT4gYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgdm9pZCBmaW5kVHlwZXMoU3RyaW5nIHByZWZpeCwgSVNlYXJjaFJlcXVlc3RvciBzdG9yYWdlLCBpbnQgdHlwZSkgeworCQlTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yID0KKwkJCW5ldyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3Ioc3RvcmFnZSwgdGhpcy51bml0VG9Ta2lwKTsKKwkJaW50IGluZGV4ID0gcHJlZml4Lmxhc3RJbmRleE9mKCcuJyk7CisJCWlmIChpbmRleCA9PSAtMSkgeworCQkJdGhpcy5uYW1lTG9va3VwLnNlZWtUeXBlcyhwcmVmaXgsIG51bGwsIHRydWUsIHR5cGUsIHJlcXVlc3Rvcik7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwcmVmaXguc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCUphdmFFbGVtZW50UmVxdWVzdG9yIGVsZW1lbnRSZXF1ZXN0b3IgPSBuZXcgSmF2YUVsZW1lbnRSZXF1ZXN0b3IoKTsKKwkJCXRoaXMubmFtZUxvb2t1cC5zZWVrUGFja2FnZUZyYWdtZW50cyhwYWNrYWdlTmFtZSwgZmFsc2UsIGVsZW1lbnRSZXF1ZXN0b3IpOworCQkJSVBhY2thZ2VGcmFnbWVudFtdIGZyYWdtZW50cyA9IGVsZW1lbnRSZXF1ZXN0b3IuZ2V0UGFja2FnZUZyYWdtZW50cygpOworCQkJaWYgKGZyYWdtZW50cyAhPSBudWxsKSB7CisJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByZWZpeC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZnJhZ21lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCQlpZiAoZnJhZ21lbnRzW2ldICE9IG51bGwpCisJCQkJCQl0aGlzLm5hbWVMb29rdXAuc2Vla1R5cGVzKGNsYXNzTmFtZSwgZnJhZ21lbnRzW2ldLCB0cnVlLCB0eXBlLCByZXF1ZXN0b3IpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJTmFtZUVudmlyb25tZW50I2lzUGFja2FnZShjaGFyW11bXSwgY2hhcltdKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZShjaGFyW11bXSBwYXJlbnRQYWNrYWdlTmFtZSwgY2hhcltdIHN1YlBhY2thZ2VOYW1lKSB7CisJCWlmIChzdWJQYWNrYWdlTmFtZSA9PSBudWxsIHx8IENoYXJPcGVyYXRpb24uY29udGFpbnMoJy4nLCBzdWJQYWNrYWdlTmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwYXJlbnRQYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhcmVudFBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIGlzVG9wTGV2ZWxQYWNrYWdlKHN1YlBhY2thZ2VOYW1lKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmVudFBhY2thZ2VOYW1lLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKHBhcmVudFBhY2thZ2VOYW1lW2ldID09IG51bGwgfHwgQ2hhck9wZXJhdGlvbi5jb250YWlucygnLicsIHBhcmVudFBhY2thZ2VOYW1lW2ldKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJU3RyaW5nIHBhY2thZ2VOYW1lID0gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFyZW50UGFja2FnZU5hbWUsIHN1YlBhY2thZ2VOYW1lLCAnLicpKTsKKwkJcmV0dXJuIHRoaXMubmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cyhwYWNrYWdlTmFtZSwgZmFsc2UpICE9IG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUb3BMZXZlbFBhY2thZ2UoY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCXJldHVybiBwYWNrYWdlTmFtZSAhPSBudWxsICYmCisJCQkhQ2hhck9wZXJhdGlvbi5jb250YWlucygnLicsIHBhY2thZ2VOYW1lKSAmJgorCQkJdGhpcy5uYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnRzKG5ldyBTdHJpbmcocGFja2FnZU5hbWUpLCBmYWxzZSkgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBmb3IgdGhlIGFycmF5LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdDaGFyKGNoYXJbXSBuYW1lKSB7CisJCXJldHVybiAiWyIgIC8vJE5PTi1OTFMtMSQKKwkJKyBuZXcgU3RyaW5nKG5hbWUpICsgIl0iIDsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGZvciB0aGUgYXJyYXkuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0NoYXJDaGFyKGNoYXJbXVtdIG5hbWVzKSB7CisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCXJlc3VsdC5hcHBlbmQodG9TdHJpbmdDaGFyKG5hbWVzW2ldKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzM2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKKworLyoqCisgKiBJbXBsZW1lbnRzIDxjb2RlPklKYXZhRWxlbWVudFJlcXVlc3RvcjwvY29kZT4sIHdyYXBwZXJpbmcgYW5kIGZvcndhcmRpbmcKKyAqIHJlc3VsdHMgb250byBhIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmFwaS5JU2VhcmNoUmVxdWVzdG9yPC9jb2RlPi4KKyAqLworY2xhc3MgU2VhcmNoYWJsZUVudmlyb25tZW50UmVxdWVzdG9yIGV4dGVuZHMgSmF2YUVsZW1lbnRSZXF1ZXN0b3IgaW1wbGVtZW50cyBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgeworCS8qKgorCSAqIFRoZSA8Y29kZT5JU2VhcmNoUmVxdWVzdG9yPC9jb2RlPiB0aGlzIEphdmFFbGVtZW50UmVxdWVzdG9yIHdyYXBzCisJICogYW5kIGZvcndhcmRzIHJlc3VsdHMgdG8uCisJICovCisJcHJvdGVjdGVkIElTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvcjsKKwkvKioKKwkgKiBUaGUgPGNvZGU+SUNvbXBpbGF0aW9uVU5pdDwvY29kZT4gdGhpcyBKYXZhRWxlbWVudFJlcXVlc3RvciB3aWxsIG5vdAorCSAqIGFjY2VwdCB0eXBlcyB3aXRoaW4uCisJICovCisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZlVuaXRUb1NraXA7CisvKioKKyAqIENvbnN0cnVjdHMgYSBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgdGhhdCB3cmFwcyB0aGUKKyAqIGdpdmVuIFNlYXJjaFJlcXVlc3Rvci4KKyAqLworcHVibGljIFNlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgeworCWZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJZlVuaXRUb1NraXA9IG51bGw7Cit9CisvKioKKyAqIENvbnN0cnVjdHMgYSBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IgdGhhdCB3cmFwcyB0aGUKKyAqIGdpdmVuIFNlYXJjaFJlcXVlc3Rvci4gIFRoZSByZXF1ZXN0b3Igd2lsbCBub3QgYWNjZXB0IHR5cGVzIGluCisgKiB0aGUgPGNvZGU+dW5pdFRvU2tpcDwvY29kZT4uCisgKi8KK3B1YmxpYyBTZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IoSVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElDb21waWxhdGlvblVuaXQgdW5pdFRvU2tpcCkgeworCWZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJZlVuaXRUb1NraXA9IHVuaXRUb1NraXA7Cit9CisvKioKKyAqIERvIG5vdGhpbmcsIGEgU2VhcmNoUmVxdWVzdG9yIGRvZXMgbm90IGFjY2VwdCBpbml0aWFsaXplcnMKKyAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZm9yd2FyZCB0aGlzIHJlc3VsdHMuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0SW5pdGlhbGl6ZXIoSUluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7CisKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7CisJZlJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpOworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKElUeXBlIHR5cGUpIHsKKwl0cnkgeworCQlpZiAoZlVuaXRUb1NraXAgIT0gbnVsbCAmJiBmVW5pdFRvU2tpcC5lcXVhbHModHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSkpeworCQkJcmV0dXJuOworCQl9CisJCWlmICh0eXBlLmlzQ2xhc3MoKSkgeworCQkJZlJlcXVlc3Rvci5hY2NlcHRDbGFzcyh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwgdHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksIHR5cGUuZ2V0RmxhZ3MoKSk7CisJCX0gZWxzZSB7CisJCQlmUmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSwgdHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksIHR5cGUuZ2V0RmxhZ3MoKSk7CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VsZWN0aW9uUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWxlY3Rpb25SZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjYwZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VsZWN0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwzMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlbGVjdGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5TZWxlY3Rpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JU2VsZWN0aW9uUmVxdWVzdG9yPC9jb2RlPiB0byBhc3Npc3Qgd2l0aAorICogY29kZSByZXNvbHZlIGluIGEgY29tcGlsYXRpb24gdW5pdC4gVHJhbnNsYXRlcyBuYW1lcyB0byBlbGVtZW50cy4KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdGlvblJlcXVlc3RvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZXF1ZXN0b3IgeworCS8qKgorCSAqIFRoZSBuYW1lIGxvb2t1cCBmYWNpbGl0eSB1c2VkIHRvIHJlc29sdmUgcGFja2FnZXMKKwkgKi8KKwlwcm90ZWN0ZWQgTmFtZUxvb2t1cCBmTmFtZUxvb2t1cD0gbnVsbDsKKworCS8qKgorCSAqIEZpeCBmb3IgMUZWWEdESworCSAqCisJICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgd2UgYXJlIHJlc29sdmluZyBpbgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZkNvZGVSZXNvbHZlOworCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgcmVzb2x2ZWQgZWxlbWVudHMuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGZFbGVtZW50cz0gZmdFbXB0eUVsZW1lbnRzOworCisJLyoqCisJICogRW1wdHkgY29sbGVjdGlvbiB1c2VkIGZvciBlZmZpY2llbmN5LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUphdmFFbGVtZW50W10gZmdFbXB0eUVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtde307CisvKioKKyAqIENyZWF0ZXMgYSBzZWxlY3Rpb24gcmVxdWVzdG9yIHRoYXQgdXNlcyB0aGF0IGdpdmVuCisgKiBuYW1lIGxvb2t1cCBmYWNpbGl0eSB0byByZXNvbHZlIG5hbWVzLgorICoKKyAqIEZpeCBmb3IgMUZWWEdESworICovCitwdWJsaWMgU2VsZWN0aW9uUmVxdWVzdG9yKE5hbWVMb29rdXAgbmFtZUxvb2t1cCwgSUphdmFFbGVtZW50IGNvZGVSZXNvbHZlKSB7CisJc3VwZXIoKTsKKwlmTmFtZUxvb2t1cCA9IG5hbWVMb29rdXA7CisJZkNvZGVSZXNvbHZlID0gY29kZVJlc29sdmU7Cit9CisvKioKKyAqIFJlc29sdmUgdGhlIGJpbmFyeSBtZXRob2QKKyAqCisgKiBmaXggZm9yIDFGV0ZUNlEKKyAqLworcHJvdGVjdGVkIHZvaWQgYWNjZXB0QmluYXJ5TWV0aG9kKElUeXBlIHR5cGUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKKwlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcz0gbnVsbDsKKwlpZiAocGFyYW1ldGVyVHlwZU5hbWVzICE9IG51bGwpIHsKKwkJcGFyYW1ldGVyVHlwZXM9IG5ldyBTdHJpbmdbcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aF07CisJCWZvciAoaW50IGk9IDAsIG1heCA9IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJU3RyaW5nIHBrZyA9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCQlpZiAocGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldICE9IG51bGwgJiYgcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldLmxlbmd0aCA+IDApIHsKKwkJCQlwa2cgPSBuZXcgU3RyaW5nKHBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSkgKyAiLiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCQorCQkJU3RyaW5nIHR5cGVOYW1lID0gbmV3IFN0cmluZyhwYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOworCQkJaWYgKHR5cGVOYW1lLmluZGV4T2YoJy4nKSA+IDApIAorCQkJCXR5cGVOYW1lID0gdHlwZU5hbWUucmVwbGFjZSgnLicsICckJyk7CisJCQlwYXJhbWV0ZXJUeXBlc1tpXT0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoCisJCQkJcGtnICsgdHlwZU5hbWUsIHRydWUpOworCQl9CisJfQorCUlNZXRob2QgbWV0aG9kPSB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKHNlbGVjdG9yKSwgcGFyYW1ldGVyVHlwZXMpOworCWlmIChtZXRob2QuZXhpc3RzKCkpIHsKKwkJZkVsZW1lbnRzID0gZ3Jvd0FuZEFkZFRvQXJyYXkoZkVsZW1lbnRzLCBtZXRob2QpOworCQlpZihTZWxlY3Rpb25FbmdpbmUuREVCVUcpeworCQkJU3lzdGVtLm91dC5wcmludCgiU0VMRUNUSU9OIC0gYWNjZXB0IG1ldGhvZCgiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludChtZXRob2QudG9TdHJpbmcoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorfQorLyoqCisgKiBSZXNvbHZlIHRoZSBjbGFzcy4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gY2xhc3NOYW1lLCBib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKSB7CisJYWNjZXB0VHlwZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lLCBOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTLCBuZWVkUXVhbGlmaWNhdGlvbik7Cit9CisvKioKKyAqIERvIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEVycm9yKElQcm9ibGVtIGVycm9yKSB7fQorLyoqCisgKiBSZXNvbHZlIHRoZSBmaWVsZC4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gbmFtZSkgeworCUlUeXBlIHR5cGU9IHJlc29sdmVUeXBlKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsCisJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwlpZiAodHlwZSAhPSBudWxsKSB7CisJCUlGaWVsZCBmaWVsZD0gdHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKG5hbWUpKTsKKwkJaWYgKGZpZWxkLmV4aXN0cygpKSB7CisJCQlmRWxlbWVudHM9IGdyb3dBbmRBZGRUb0FycmF5KGZFbGVtZW50cywgZmllbGQpOworCQkJaWYoU2VsZWN0aW9uRW5naW5lLkRFQlVHKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgZmllbGQoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50KGZpZWxkLnRvU3RyaW5nKCkpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIFJlc29sdmUgdGhlIGludGVyZmFjZQorICovCitwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiBuZWVkUXVhbGlmaWNhdGlvbikgeworCWFjY2VwdFR5cGUocGFja2FnZU5hbWUsIGludGVyZmFjZU5hbWUsIE5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMsIG5lZWRRdWFsaWZpY2F0aW9uKTsKK30KKy8qKgorICogUmVzb2x2ZSB0aGUgbWV0aG9kCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCUlUeXBlIHR5cGU9IHJlc29sdmVUeXBlKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsCisJCU5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVMgfCBOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkvLyBmaXggZm9yIDFGV0ZUNlEKKwlpZiAodHlwZSAhPSBudWxsKSB7CisJCWlmICh0eXBlLmlzQmluYXJ5KCkpIHsKKwkJCQorCQkJLy8gbmVlZCB0byBhZGQgYSBwYXJhbWF0ZXIgZm9yIGNvbnN0cnVjdG9yIGluIGJpbmFyeSB0eXBlCisJCQlJVHlwZSBkZWNsYXJpbmdEZWNsYXJpbmdUeXBlID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCQlpZihkZWNsYXJpbmdEZWNsYXJpbmdUeXBlICE9IG51bGwgJiYgaXNDb25zdHJ1Y3RvcikgeworCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyUGFja2FnZU5hbWVzLCAwLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXSwgMSwgbGVuZ3RoKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVOYW1lcywgMCwgcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoKzFdW10sIDEsIGxlbmd0aCk7CisJCQkJCisJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzWzBdID0gZGVjbGFyaW5nRGVjbGFyaW5nVHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQkJcGFyYW1ldGVyVHlwZU5hbWVzWzBdID0gZGVjbGFyaW5nRGVjbGFyaW5nVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQl9CisJCQkKKwkJCWFjY2VwdEJpbmFyeU1ldGhvZCh0eXBlLCBzZWxlY3RvciwgcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBwYXJhbWV0ZXJUeXBlTmFtZXMpOworCQl9IGVsc2UgeworCQkJYWNjZXB0U291cmNlTWV0aG9kKHR5cGUsIHNlbGVjdG9yLCBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCX0KKwl9Cit9CisvKioKKyAqIFJlc29sdmUgdGhlIHBhY2thZ2UKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpIHsKKwlJUGFja2FnZUZyYWdtZW50W10gcGtncyA9IGZOYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnRzKG5ldyBTdHJpbmcocGFja2FnZU5hbWUpLCBmYWxzZSk7CisJaWYgKHBrZ3MgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGtncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJZkVsZW1lbnRzID0gZ3Jvd0FuZEFkZFRvQXJyYXkoZkVsZW1lbnRzLCBwa2dzW2ldKTsKKwkJCWlmKFNlbGVjdGlvbkVuZ2luZS5ERUJVRyl7CisJCQkJU3lzdGVtLm91dC5wcmludCgiU0VMRUNUSU9OIC0gYWNjZXB0IHBhY2thZ2UoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50KHBrZ3NbaV0udG9TdHJpbmcoKSk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KK30KKy8qKgorICogUmVzb2x2ZSB0aGUgc291cmNlIG1ldGhvZAorICoKKyAqIGZpeCBmb3IgMUZXRlQ2UQorICovCitwcm90ZWN0ZWQgdm9pZCBhY2NlcHRTb3VyY2VNZXRob2QoSVR5cGUgdHlwZSwgY2hhcltdIHNlbGVjdG9yLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcykgeworCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhzZWxlY3Rvcik7CisJSU1ldGhvZFtdIG1ldGhvZHMgPSBudWxsOworCUlKYXZhRWxlbWVudFtdIG1hdGNoZXMgPSBuZXcgSUphdmFFbGVtZW50W10ge307CisJdHJ5IHsKKwkJbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChtZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG5hbWUpICYmIG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aCkgeworCQkJCW1hdGNoZXMgPSBncm93QW5kQWRkVG9BcnJheShtYXRjaGVzLCBtZXRob2RzW2ldKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCXJldHVybjsgCisJfQorCisJLy8gaWYgbm8gbWF0Y2hlcywgbm90aGluZyB0byByZXBvcnQKKwlpZiAobWF0Y2hlcy5sZW5ndGggPT0gMCkgeworCQkvLyBubyBtYXRjaCB3YXMgYWN0dWFsbHkgZm91bmQsIGJ1dCBhIG1ldGhvZCB3YXMgb3JpZ2luYWxseSBnaXZlbiAtPiBkZWZhdWx0IGNvbnN0cnVjdG9yCisJCWZFbGVtZW50cyA9IGdyb3dBbmRBZGRUb0FycmF5KGZFbGVtZW50cywgdHlwZSk7CisJCWlmKFNlbGVjdGlvbkVuZ2luZS5ERUJVRyl7CisJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgdHlwZSgiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludCh0eXBlLnRvU3RyaW5nKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm47CisJfQorCisJLy8gaWYgdGhlcmUgaXMgb25seSBvbmUgbWF0Y2gsIHdlJ3ZlIGdvdCBpdAorCWlmIChtYXRjaGVzLmxlbmd0aCA9PSAxKSB7CisJCWZFbGVtZW50cyA9IGdyb3dBbmRBZGRUb0FycmF5KGZFbGVtZW50cywgbWF0Y2hlc1swXSk7CisJCWlmKFNlbGVjdGlvbkVuZ2luZS5ERUJVRyl7CisJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgbWV0aG9kKCIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50KG1hdGNoZXNbMF0udG9TdHJpbmcoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybjsKKwl9CisKKwkvLyBtb3JlIHRoYW4gb25lIG1hdGNoIC0gbXVzdCBtYXRjaCBzaW1wbGUgcGFyYW1ldGVyIHR5cGVzCisJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CisJCUlNZXRob2QgbWV0aG9kPSAoSU1ldGhvZCltYXRjaGVzW2ldOworCQlTdHJpbmdbXSBzaWduYXR1cmVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCWJvb2xlYW4gbWF0Y2g9IHRydWU7CisJCWZvciAoaW50IHAgPSAwOyBwIDwgc2lnbmF0dXJlcy5sZW5ndGg7IHArKykgeworCQkJU3RyaW5nIHNpbXBsZU5hbWU9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKFNpZ25hdHVyZS50b1N0cmluZyhzaWduYXR1cmVzW3BdKSk7CisJCQlpZiAoIXNpbXBsZU5hbWUuZXF1YWxzKG5ldyBTdHJpbmcocGFyYW1ldGVyVHlwZU5hbWVzW3BdKSkpIHsKKwkJCQltYXRjaCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChtYXRjaCkgeworCQkJZkVsZW1lbnRzID0gZ3Jvd0FuZEFkZFRvQXJyYXkoZkVsZW1lbnRzLCBtZXRob2QpOworCQkJaWYoU2VsZWN0aW9uRW5naW5lLkRFQlVHKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgbWV0aG9kKCIpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludChtZXRob2QudG9TdHJpbmcoKSk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKwkKK30KKy8qKgorICogUmVzb2x2ZSB0aGUgdHlwZSwgYWRkaW5nIHRvIHRoZSByZXNvbHZlZCBlbGVtZW50cy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IGFjY2VwdEZsYWdzLCBib29sZWFuIG5lZWRRdWFsaWZpY2F0aW9uKSB7CisJSVR5cGUgdHlwZT0gcmVzb2x2ZVR5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lLCBhY2NlcHRGbGFncyk7CisJaWYgKHR5cGUgIT0gbnVsbCkgeworCQlmRWxlbWVudHM9IGdyb3dBbmRBZGRUb0FycmF5KGZFbGVtZW50cywgdHlwZSk7CisJCWlmKFNlbGVjdGlvbkVuZ2luZS5ERUJVRyl7CisJCQlTeXN0ZW0ub3V0LnByaW50KCJTRUxFQ1RJT04gLSBhY2NlcHQgdHlwZSgiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludCh0eXBlLnRvU3RyaW5nKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0gCisJCit9CisvKioKKyAqIFJldHVybnMgdGhlIHJlc29sdmVkIGVsZW1lbnRzLgorICovCitwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHMoKSB7CisJcmV0dXJuIGZFbGVtZW50czsKK30KKy8qKgorICogQWRkcyB0aGUgbmV3IGVsZW1lbnQgdG8gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBvbGQgYXJyYXkuCisgKiBSZXR1cm5zIHRoZSBuZXcgYXJyYXkuCisgKi8KK3Byb3RlY3RlZCBJSmF2YUVsZW1lbnRbXSBncm93QW5kQWRkVG9BcnJheShJSmF2YUVsZW1lbnRbXSBhcnJheSwgSUphdmFFbGVtZW50IGFkZGl0aW9uKSB7CisJSUphdmFFbGVtZW50W10gb2xkID0gYXJyYXk7CisJYXJyYXkgPSBuZXcgSUphdmFFbGVtZW50W29sZC5sZW5ndGggKyAxXTsKKwlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgYXJyYXksIDAsIG9sZC5sZW5ndGgpOworCWFycmF5W29sZC5sZW5ndGhdID0gYWRkaXRpb247CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBSZXNvbHZlIHRoZSB0eXBlCisgKi8KK3Byb3RlY3RlZCBJVHlwZSByZXNvbHZlVHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgaW50IGFjY2VwdEZsYWdzKSB7CisKKwlJVHlwZSB0eXBlPSBudWxsOworCQorCWlmIChmQ29kZVJlc29sdmUgaW5zdGFuY2VvZiBXb3JraW5nQ29weSkgeworCQlXb3JraW5nQ29weSB3YyA9IChXb3JraW5nQ29weSkgZkNvZGVSZXNvbHZlOworCQl0cnkgeworCQkJaWYoKChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKSAmJiB3Yy5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCkubGVuZ3RoID09IDApIHx8CisJCQkJKCEocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkgJiYgd2MuZ2V0UGFja2FnZURlY2xhcmF0aW9uKG5ldyBTdHJpbmcocGFja2FnZU5hbWUpKS5leGlzdHMoKSkpIHsKKwkJCQkJCisJCQkJY2hhcltdW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZU5hbWUpOworCQkJCWlmKGNvbXBvdW5kTmFtZS5sZW5ndGggPiAwKSB7CisJCQkJCXR5cGUgPSB3Yy5nZXRUeXBlKG5ldyBTdHJpbmcoY29tcG91bmROYW1lWzBdKSk7CisJCQkJCWZvciAoaW50IGkgPSAxLCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCXR5cGUgPSB0eXBlLmdldFR5cGUobmV3IFN0cmluZyhjb21wb3VuZE5hbWVbaV0pKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZih0eXBlICE9IG51bGwgJiYgIXR5cGUuZXhpc3RzKCkpIHsKKwkJCQkJdHlwZSA9IG51bGw7CisJCQkJfQorCQkJfQorCQl9Y2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl0eXBlID0gbnVsbDsKKwkJfQorCX0KKworCWlmKHR5cGUgPT0gbnVsbCkgeworCQlJUGFja2FnZUZyYWdtZW50W10gcGtncyA9IGZOYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnRzKAorCQkJKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoID09IDApID8gSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSA6IG5ldyBTdHJpbmcocGFja2FnZU5hbWUpLCAKKwkJCWZhbHNlKTsKKwkJLy8gaXRlcmF0ZSB0eXBlIGxvb2t1cCBpbiBlYWNoIHBhY2thZ2UgZnJhZ21lbnQKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBrZ3MgPT0gbnVsbCA/IDAgOiBwa2dzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0eXBlPSBmTmFtZUxvb2t1cC5maW5kVHlwZShuZXcgU3RyaW5nKHR5cGVOYW1lKSwgcGtnc1tpXSwgZmFsc2UsIGFjY2VwdEZsYWdzKTsKKwkJCWlmICh0eXBlICE9IG51bGwpIGJyZWFrOwkKKwkJfQorCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlTdHJpbmcgcE5hbWU9IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUU7CisJCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgeworCQkJCXBOYW1lID0gbmV3IFN0cmluZyhwYWNrYWdlTmFtZSk7CisJCQl9CisJCQlpZiAoZkNvZGVSZXNvbHZlICE9IG51bGwgJiYgZkNvZGVSZXNvbHZlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBOYW1lKSkgeworCQkJCS8vIGxvb2sgaW5zaWRlIHRoZSB0eXBlIGluIHdoaWNoIHdlIGFyZSByZXNvbHZpbmcgaW4KKwkJCQlTdHJpbmcgdE5hbWU9IG5ldyBTdHJpbmcodHlwZU5hbWUpOworCQkJCXROYW1lID0gdE5hbWUucmVwbGFjZSgnLicsJyQnKTsKKwkJCQlJVHlwZVtdIGFsbFR5cGVzPSBudWxsOworCQkJCXRyeSB7CisJCQkJCUFycmF5TGlzdCBsaXN0ID0gKChKYXZhRWxlbWVudClmQ29kZVJlc29sdmUpLmdldENoaWxkcmVuT2ZUeXBlKElKYXZhRWxlbWVudC5UWVBFKTsKKwkJCQkJYWxsVHlwZXMgPSBuZXcgSVR5cGVbbGlzdC5zaXplKCldOworCQkJCQlsaXN0LnRvQXJyYXkoYWxsVHlwZXMpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlmb3IgKGludCBpPSAwOyBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKGFsbFR5cGVzW2ldLmdldFR5cGVRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHROYW1lKSkgeworCQkJCQkJcmV0dXJuIGFsbFR5cGVzW2ldOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiB0eXBlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQ1ODlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CisKKy8qKgorICogVGhpcyBvcGVyYXRpb24gc2V0cyBhbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+J3MgY2xhc3NwYXRoLgorICoKKyAqIEBzZWUgSUphdmFQcm9qZWN0CisgKi8KK3B1YmxpYyBjbGFzcyBTZXRDbGFzc3BhdGhPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCisJSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRQYXRoOworCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd1BhdGg7CisJYm9vbGVhbiBjYW5DaGFuZ2VSZXNvdXJjZTsKKwlib29sZWFuIG5lZWRDeWNsZUNoZWNrOworCWJvb2xlYW4gbmVlZFZhbGlkYXRpb247CisJCisJSVBhdGggbmV3T3V0cHV0TG9jYXRpb247CisJcHVibGljIHN0YXRpYyBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBSZXVzZUNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CisJcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBSZXVzZU91dHB1dExvY2F0aW9uID0gbmV3IFBhdGgoIlJldXNlIEV4aXN0aW5nIE91dHB1dCBMb2NhdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHNldHMgdGhlIGNsYXNzcGF0aCBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgU2V0Q2xhc3NwYXRoT3BlcmF0aW9uKAorCQlJSmF2YVByb2plY3QgcHJvamVjdCwKKwkJSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRQYXRoLAorCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdSYXdQYXRoLAorCQlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwKKwkJYm9vbGVhbiBjYW5DaGFuZ2VSZXNvdXJjZSwKKwkJYm9vbGVhbiBmb3JjZVNhdmUsCisJCWJvb2xlYW4gbmVlZEN5Y2xlQ2hlY2ssCisJCWJvb2xlYW4gbmVlZFZhbGlkYXRpb24pIHsKKworCQlzdXBlcihuZXcgSUphdmFFbGVtZW50W10geyBwcm9qZWN0IH0pOworCQl0aGlzLm9sZFJlc29sdmVkUGF0aCA9IG9sZFJlc29sdmVkUGF0aDsKKwkJdGhpcy5uZXdSYXdQYXRoID0gbmV3UmF3UGF0aDsKKwkJdGhpcy5uZXdPdXRwdXRMb2NhdGlvbiA9IG5ld091dHB1dExvY2F0aW9uOworCQl0aGlzLmNhbkNoYW5nZVJlc291cmNlID0gY2FuQ2hhbmdlUmVzb3VyY2U7CisJCXRoaXMubmVlZEN5Y2xlQ2hlY2sgPSBuZWVkQ3ljbGVDaGVjazsKKwkJdGhpcy5uZWVkVmFsaWRhdGlvbiA9IG5lZWRWYWxpZGF0aW9uOworCX0KKworCS8qKgorCSAqIEFkZHMgZGVsdGFzIGZvciB0aGUgZ2l2ZW4gcm9vdHMsIHdpdGggdGhlIHNwZWNpZmllZCBjaGFuZ2UgZmxhZywKKwkgKiBhbmQgY2xvc2VzIHRoZSByb290LiBIZWxwZXIgbWV0aG9kIGZvciAjc2V0Q2xhc3NwYXRoCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2xhc3NwYXRoRGVsdGFzKAorCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzLAorCQlpbnQgZmxhZywKKwkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJCWRlbHRhLmNoYW5nZWQocm9vdCwgZmxhZyk7CisJCQlpZiAoKGZsYWcgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDAgCisJCQkJCXx8IChmbGFnICYgSUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VBVFRBQ0hFRCkgIT0gMAorCQkJCQl8fCAoZmxhZyAmIElKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFREVUQUNIRUQpICE9IDApeworCQkJCXRyeSB7CisJCQkJCXJvb3QuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCQkvLyBmb3JjZSBkZXRhY2ggc291cmNlIG9uIGphciBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIChzb3VyY2Ugd2lsbCBiZSBsYXppbHkgY29tcHV0ZWQgd2hlbiBuZWVkZWQpCisJCQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJCSgoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdCkuc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KG51bGwpOy8vIGxvb3NlIGluZm8gLSB3aWxsIGJlIHJlY29tcHV0ZWQKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QgaWYgdGhlIGdpdmVuIGxpc3QgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbnRyeS4gSWYgdGhlIGxpc3QgZG9lcworCSAqIG5vdCBjb250YWluIHRoZSBlbnRyeSwgLTEgaXMgcmV0dXJuZWQuCisJICogQSBoZWxwZXIgbWV0aG9kIGZvciAjc2V0Q2xhc3NwYXRoCisJICovCisJcHJvdGVjdGVkIGludCBjbGFzc3BhdGhDb250YWlucygKKwkJSUNsYXNzcGF0aEVudHJ5W10gbGlzdCwKKwkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgb3RoZXIgPSBsaXN0W2ldOworCQkJaWYgKG90aGVyLmdldENvbnRlbnRLaW5kKCkgPT0gZW50cnkuZ2V0Q29udGVudEtpbmQoKQorCQkJCSYmIG90aGVyLmdldEVudHJ5S2luZCgpID09IGVudHJ5LmdldEVudHJ5S2luZCgpCisJCQkJJiYgb3RoZXIuaXNFeHBvcnRlZCgpID09IGVudHJ5LmlzRXhwb3J0ZWQoKQorCQkJCSYmIG90aGVyLmdldFBhdGgoKS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpKSkgeworCQkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJLyoqCisJICogUmVjdXJzaXZlbHkgYWRkcyBhbGwgc3ViZm9sZGVycyBvZiA8Y29kZT5mb2xkZXI8L2NvZGU+IHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvbGxlY3RBbGxTdWJmb2xkZXJzKElGb2xkZXIgZm9sZGVyLCBBcnJheUxpc3QgY29sbGVjdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlJUmVzb3VyY2VbXSBtZW1iZXJzPSBmb2xkZXIubWVtYmVycygpOworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlJUmVzb3VyY2Ugcj0gbWVtYmVyc1tpXTsKKwkJCQlpZiAoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgeworCQkJCQljb2xsZWN0aW9uLmFkZChyKTsKKwkJCQkJY29sbGVjdEFsbFN1YmZvbGRlcnMoKElGb2xkZXIpciwgY29sbGVjdGlvbik7CisJCQkJfQorCQkJfQkKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgcGFja2FnZSBmcmFnbWVudHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQvcmVtb3ZlZAorCSAqIGFzIHRoZSByZXN1bHQgb2YgY2hhbmdpbmcgdGhlIG91dHB1dCBsb2NhdGlvbiB0by9mcm9tIHRoZSBnaXZlbgorCSAqIGxvY2F0aW9uLiBUaGUgY29sbGVjdGlvbiBpcyBlbXB0eSBpZiBubyBwYWNrYWdlIGZyYWdtZW50cyBhcmUKKwkgKiBhZmZlY3RlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQXJyYXlMaXN0IGRldGVybWluZUFmZmVjdGVkUGFja2FnZUZyYWdtZW50cyhJUGF0aCBsb2NhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdCBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUphdmFQcm9qZWN0IHByb2plY3QgPWdldFByb2plY3QoKTsKKwkKKwkJLy8gc2VlIGlmIHRoaXMgd2lsbCBjYXVzZSBhbnkgcGFja2FnZSBmcmFnbWVudHMgdG8gYmUgYWZmZWN0ZWQKKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBnZXRXb3Jrc3BhY2UoKTsKKwkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKwkJCXJlc291cmNlID0gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKGxvY2F0aW9uKTsKKwkJfQorCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgeworCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgcmVzb3VyY2U7CisJCQkvLyBvbmx5IGNoYW5nZXMgaWYgaXQgYWN0dWFsbHkgZXhpc3RlZAorCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJCUlQYXRoIHBhdGggPSBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpOworCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgJiYgcGF0aC5pc1ByZWZpeE9mKGxvY2F0aW9uKSAmJiAhcGF0aC5lcXVhbHMobG9jYXRpb24pKSB7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aFtpXSk7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1swXTsKKwkJCQkJLy8gbm93IHRoZSBvdXRwdXQgbG9jYXRpb24gYmVjb21lcyBhIHBhY2thZ2UgZnJhZ21lbnQgLSBhbG9uZyB3aXRoIGFueSBzdWJmb2xkZXJzCisJCQkJCUFycmF5TGlzdCBmb2xkZXJzID0gbmV3IEFycmF5TGlzdCgpOworCQkJCQlmb2xkZXJzLmFkZChmb2xkZXIpOworCQkJCQljb2xsZWN0QWxsU3ViZm9sZGVycyhmb2xkZXIsIGZvbGRlcnMpOworCQkJCQlJdGVyYXRvciBlbGVtZW50cyA9IGZvbGRlcnMuaXRlcmF0b3IoKTsKKwkJCQkJaW50IHNlZ21lbnRzID0gcGF0aC5zZWdtZW50Q291bnQoKTsKKwkJCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgeworCQkJCQkJSUZvbGRlciBmID0gKElGb2xkZXIpIGVsZW1lbnRzLm5leHQoKTsKKwkJCQkJCUlQYXRoIHJlbGF0aXZlUGF0aCA9IGYuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRzKTsKKwkJCQkJCVN0cmluZyBuYW1lID0gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKKwkJCQkJCW5hbWUgPSBuYW1lLnJlcGxhY2UoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwgJy4nKTsKKwkJCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7CisJCQkJCQl9CisJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG5hbWUpOworCQkJCQkJZnJhZ21lbnRzLmFkZChwa2cpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmcmFnbWVudHM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcmUtc3BlY2lmaWVkIHByb2plY3QuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCS8vIHByb2plY3QgcmVmZXJlbmNlIHVwZGF0ZWQgLSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHVuYWJsZSB0byB3cml0ZSAucHJvamVjdCBmaWxlCisJCXVwZGF0ZVByb2plY3RSZWZlcmVuY2VzSWZOZWNlc3NhcnkoKTsKKworCQkvLyBjbGFzc3BhdGggZmlsZSB1cGRhdGVkIC0gbWF5IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gd3JpdGUgLmNsYXNzcGF0aCBmaWxlCisJCXNhdmVDbGFzc3BhdGhJZk5lY2Vzc2FyeSgpOworCQkKKwkJLy8gcGVyZm9ybSBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiB1cGRhdGVzLCBpZiBleGNlcHRpb24gb2NjdXJzIGluIGNsYXNzcGF0aCB1cGRhdGUsCisJCS8vIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGxvY2F0aW9uIGlzIHVwZGF0ZWQgYmVmb3JlIHN1cmZhY2luZyB0aGUgZXhjZXB0aW9uIChpbiBjYXNlIHRoZSBvdXRwdXQKKwkJLy8gbG9jYXRpb24gdXBkYXRlIGFsc28gdGhyb3dzIGFuIGV4Y2VwdGlvbiwgZ2l2ZSBwcmlvcml0eSB0byB0aGUgY2xhc3NwYXRoIHVwZGF0ZSBvbmUpLgorCQlKYXZhTW9kZWxFeGNlcHRpb24gb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOworCisJCXRyeSB7CisJCQlpZiAodGhpcy5uZXdSYXdQYXRoICE9IFJldXNlQ2xhc3NwYXRoKSB1cGRhdGVDbGFzc3BhdGgoKTsKKworCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJCW9yaWdpbmFsRXhjZXB0aW9uID0gZTsKKwkJCXRocm93IGU7CisKKwkJfSBmaW5hbGx5IHsgLy8gaWYgdHJhdmVyc2VkIGJ5IGFuIGV4Y2VwdGlvbiB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgb3V0cHV0IGxvY2F0aW9uIHdoZW4gbmVjZXNzYXJ5CisKKwkJCXRyeSB7CisJCQkJaWYgKHRoaXMubmV3T3V0cHV0TG9jYXRpb24gIT0gUmV1c2VPdXRwdXRMb2NhdGlvbikgdXBkYXRlT3V0cHV0TG9jYXRpb24oKTsKKworCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIHRocm93IG9yaWdpbmFsRXhjZXB0aW9uOyAKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9CisJCWRvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZXMgdGhlIGRlbHRhIG9mIHJlbW92ZWQvYWRkZWQvcmVvcmRlcmVkIHJvb3RzLgorCSAqIFVzZSB0aHJlZSBkZWx0YXMgaW4gY2FzZSB0aGUgc2FtZSByb290IGlzIHJlbW92ZWQvYWRkZWQvcmVvcmRlcmVkIChpLmUuIGNoYW5nZWQgZnJvbQorCSAqIEtfU09VUkNFIHRvIEtfQklOQVJZIG9yIHZpc2EgdmVyc2EpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDbGFzc3BhdGhDaGFuZ2VEZWx0YXMoCisJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZFJlc29sdmVkUGF0aCwKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmVzb2x2ZWRQYXRoLAorCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIsCisJCUphdmFQcm9qZWN0IHByb2plY3QpIHsKKworCQlib29sZWFuIG5lZWRUb1VwZGF0ZURlcGVuZGVudHMgPSBmYWxzZTsKKwkJCisJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShnZXRKYXZhTW9kZWwoKSk7CisJCWJvb2xlYW4gaGFzRGVsdGEgPSBmYWxzZTsKKwkJaW50IG9sZExlbmd0aCA9IG9sZFJlc29sdmVkUGF0aC5sZW5ndGg7CisJCWludCBuZXdMZW5ndGggPSBuZXdSZXNvbHZlZFBhdGgubGVuZ3RoOworCQlib29sZWFuIG9sZFJlc29sdmVkUGF0aExvbmdlc3QgPSBvbGRMZW5ndGggPj0gbmV3TGVuZ3RoOworCQkJCisJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBtYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlc29sdmVkUGF0aC5sZW5ndGg7IGkrKykgeworCQkJCisJCQlpbnQgaW5kZXggPSBjbGFzc3BhdGhDb250YWlucyhuZXdSZXNvbHZlZFBhdGgsIG9sZFJlc29sdmVkUGF0aFtpXSk7CisJCQlpZiAoaW5kZXggPT0gLTEpIHsKKwkJCQkvLyBkbyBub3Qgbm90aWZ5IHJlbW90ZSBwcm9qZWN0IGNoYW5nZXMKKwkJCQlpZiAob2xkUmVzb2x2ZWRQYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCl7CisJCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgPSB0cnVlOworCQkJCQljb250aW51ZTsgCisJCQkJfQorCisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwa2dGcmFnbWVudFJvb3RzID0KKwkJCQkJcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhvbGRSZXNvbHZlZFBhdGhbaV0pOworCQkJCWFkZENsYXNzcGF0aERlbHRhcyhwa2dGcmFnbWVudFJvb3RzLCBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgsIGRlbHRhKTsKKworCQkJCWludCBjaGFuZ2VLaW5kID0gb2xkUmVzb2x2ZWRQYXRoW2ldLmdldEVudHJ5S2luZCgpOworCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgfD0gKGNoYW5nZUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHx8IG9sZFJlc29sdmVkUGF0aFtpXS5pc0V4cG9ydGVkKCk7CisKKwkJCQkvLyBSZW1vdmUgdGhlIC5qYXZhIGZpbGVzIGZyb20gdGhlIGluZGV4LgorCQkJCS8vIE5vdGUgdGhhdCAuY2xhc3MgZmlsZXMgYmVsb25nIHRvIGJpbmFyeSBmb2xkZXJzIHdoaWNoIGNhbiBiZSBzaGFyZWQsIAorCQkJCS8vIHNvIGxlYXZlIHRoZSBpbmRleCBmb3IgLmNsYXNzIGZpbGVzLgorCQkJCWlmIChpbmRleE1hbmFnZXIgIT0gbnVsbCAmJiBjaGFuZ2VLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJCWluZGV4TWFuYWdlci5yZW1vdmVTb3VyY2VGb2xkZXJGcm9tSW5kZXgocHJvamVjdCwgb2xkUmVzb2x2ZWRQYXRoW2ldLmdldFBhdGgoKSk7CisJCQkJfQorCQkJCWhhc0RlbHRhID0gdHJ1ZTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBkbyBub3Qgbm90aWZ5IHJlbW90ZSBwcm9qZWN0IGNoYW5nZXMKKwkJCQlpZiAob2xkUmVzb2x2ZWRQYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCl7CisJCQkJCWNvbnRpbnVlOyAKKwkJCQl9CQkJCQorCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgfD0gKG9sZFJlc29sdmVkUGF0aFtpXS5pc0V4cG9ydGVkKCkgIT0gbmV3UmVzb2x2ZWRQYXRoW2luZGV4XS5pc0V4cG9ydGVkKCkpOworCQkJCWlmIChvbGRSZXNvbHZlZFBhdGhMb25nZXN0ICYmIGluZGV4ICE9IGkpIHsgLy9yZW9yZGVyaW5nIG9mIHRoZSBjbGFzc3BhdGgKKwkJCQkJCWFkZENsYXNzcGF0aERlbHRhcygKKwkJCQkJCQlwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKG9sZFJlc29sdmVkUGF0aFtpXSksCisJCQkJCQkJSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfUkVPUkRFUiwKKwkJCQkJCQlkZWx0YSk7CisJCQkJCQlpbnQgY2hhbmdlS2luZCA9IG9sZFJlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKTsKKwkJCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgfD0gKGNoYW5nZUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpOworCQkKKwkJCQkJCWhhc0RlbHRhID0gdHJ1ZTsKKwkJCQl9CisJCQkJCisJCQkJLy8gY2hlY2sgc291cmNlIGF0dGFjaG1lbnQKKwkJCQlpbnQgc291cmNlQXR0YWNobWVudEZsYWdzID0gCisJCQkJCXRoaXMuZ2V0U291cmNlQXR0YWNobWVudERlbHRhRmxhZygKKwkJCQkJCW9sZFJlc29sdmVkUGF0aFtpXS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLAorCQkJCQkJbmV3UmVzb2x2ZWRQYXRoW2luZGV4XS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKTsKKwkJCQlpbnQgc291cmNlQXR0YWNobWVudFJvb3RGbGFncyA9IAorCQkJCQl0aGlzLmdldFNvdXJjZUF0dGFjaG1lbnREZWx0YUZsYWcoCisJCQkJCQlvbGRSZXNvbHZlZFBhdGhbaV0uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksCisJCQkJCQluZXdSZXNvbHZlZFBhdGhbaW5kZXhdLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKTsKKwkJCQlpbnQgZmxhZ3MgPSBzb3VyY2VBdHRhY2htZW50RmxhZ3MgfCBzb3VyY2VBdHRhY2htZW50Um9vdEZsYWdzOworCQkJCWlmIChmbGFncyAhPSAwKSB7CisJCQkJCWFkZENsYXNzcGF0aERlbHRhcygKKwkJCQkJCXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMob2xkUmVzb2x2ZWRQYXRoW2ldKSwKKwkJCQkJCWZsYWdzLAorCQkJCQkJZGVsdGEpOworCQkJCQloYXNEZWx0YSA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdSZXNvbHZlZFBhdGgubGVuZ3RoOyBpKyspIHsKKworCQkJaW50IGluZGV4ID0gY2xhc3NwYXRoQ29udGFpbnMob2xkUmVzb2x2ZWRQYXRoLCBuZXdSZXNvbHZlZFBhdGhbaV0pOworCQkJaWYgKGluZGV4ID09IC0xKSB7CisJCQkJLy8gZG8gbm90IG5vdGlmeSByZW1vdGUgcHJvamVjdCBjaGFuZ2VzCisJCQkJaWYgKG5ld1Jlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpeworCQkJCQluZWVkVG9VcGRhdGVEZXBlbmRlbnRzID0gdHJ1ZTsKKwkJCQkJY29udGludWU7IAorCQkJCX0KKwkJCQlhZGRDbGFzc3BhdGhEZWx0YXMoCisJCQkJCXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMobmV3UmVzb2x2ZWRQYXRoW2ldKSwKKwkJCQkJSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgsCisJCQkJCWRlbHRhKTsKKwkJCQlpbnQgY2hhbmdlS2luZCA9IG5ld1Jlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKTsKKwkJCQkKKwkJCQkvLyBSZXF1ZXN0IGluZGV4aW5nCisJCQkJaWYgKGluZGV4TWFuYWdlciAhPSBudWxsKSB7CisJCQkJCXN3aXRjaCAoY2hhbmdlS2luZCkgeworCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CisJCQkJCQkJYm9vbGVhbiBwYXRoSGFzQ2hhbmdlZCA9IHRydWU7CisJCQkJCQkJSVBhdGggbmV3UGF0aCA9IG5ld1Jlc29sdmVkUGF0aFtpXS5nZXRQYXRoKCk7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRSZXNvbHZlZFBhdGgubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5IG9sZEVudHJ5ID0gb2xkUmVzb2x2ZWRQYXRoW2pdOworCQkJCQkJCQlpZiAob2xkRW50cnkuZ2V0UGF0aCgpLmVxdWFscyhuZXdQYXRoKSkgeworCQkJCQkJCQkJcGF0aEhhc0NoYW5nZWQgPSBmYWxzZTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmIChwYXRoSGFzQ2hhbmdlZCkgeworCQkJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KG5ld1BhdGgsIHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOgorCQkJCQkJCWluZGV4TWFuYWdlci5pbmRleFNvdXJjZUZvbGRlcihwcm9qZWN0LCBuZXdSZXNvbHZlZFBhdGhbaV0uZ2V0UGF0aCgpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQluZWVkVG9VcGRhdGVEZXBlbmRlbnRzIHw9IChjaGFuZ2VLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB8fCBuZXdSZXNvbHZlZFBhdGhbaV0uaXNFeHBvcnRlZCgpOworCQkJCWhhc0RlbHRhID0gdHJ1ZTsKKworCQkJfSAvLyBjbGFzc3BhdGggcmVvcmRlcmluZyBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCBpbiBwcmV2aW91cyBsb29wCisJCX0KKwkJCisJCWlmIChoYXNEZWx0YSkgeworCQkJdGhpcy5hZGREZWx0YShkZWx0YSk7CisJCX0KKwkJaWYgKG5lZWRUb1VwZGF0ZURlcGVuZGVudHMpeworCQkJdXBkYXRlQWZmZWN0ZWRQcm9qZWN0cyhwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBKYXZhUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gKChKYXZhUHJvamVjdCkgZ2V0RWxlbWVudHNUb1Byb2Nlc3MoKVswXSk7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYXR0YWNobWVudCBmbGFnIGZvciB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgMiBnaXZlIHNvdXJjZSBwYXRocy4KKwkgKiBSZXR1cm5zIGVpdGhlciBGX1NPVVJDRUFUVEFDSEVELCBGX1NPVVJDRURFVEFDSEVELCBGX1NPVVJDRUFUVEFDSEVEIHwgRl9TT1VSQ0VERVRBQ0hFRAorCSAqIG9yIDAgaWYgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZS4KKwkgKi8KKwlwcml2YXRlIGludCBnZXRTb3VyY2VBdHRhY2htZW50RGVsdGFGbGFnKElQYXRoIG9sZFBhdGgsIElQYXRoIG5ld1BhdGgpIHsKKwkJaWYgKG9sZFBhdGggPT0gbnVsbCkgeworCQkJaWYgKG5ld1BhdGggIT0gbnVsbCkgeworCQkJCXJldHVybiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRUFUVEFDSEVEOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChuZXdQYXRoID09IG51bGwpIHsKKwkJCXJldHVybiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEOworCQl9IGVsc2UgaWYgKCFvbGRQYXRoLmVxdWFscyhuZXdQYXRoKSkgeworCQkJcmV0dXJuIElKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQgfCBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uIHBlcmZvcm1zIG5vIHJlc291cmNlIG1vZGlmaWNhdGlvbnMsCisJICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4gU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJCXJldHVybiAhdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzYXZlQ2xhc3NwYXRoSWZOZWNlc3NhcnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCWlmICghdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZSkgcmV0dXJuOworCQkJCQorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhGb3JTYXZlOworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQlpZiAodGhpcy5uZXdSYXdQYXRoID09IFJldXNlQ2xhc3NwYXRoKXsKKwkJCWNsYXNzcGF0aEZvclNhdmUgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQl9IGVsc2UgeworCQkJY2xhc3NwYXRoRm9yU2F2ZSA9IHRoaXMubmV3UmF3UGF0aDsKKwkJfQorCQlJUGF0aCBvdXRwdXRMb2NhdGlvbkZvclNhdmU7CisJCWlmICh0aGlzLm5ld091dHB1dExvY2F0aW9uID09IFJldXNlT3V0cHV0TG9jYXRpb24peworCQkJb3V0cHV0TG9jYXRpb25Gb3JTYXZlID0gcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOworCQl9IGVsc2UgeworCQkJb3V0cHV0TG9jYXRpb25Gb3JTYXZlID0gdGhpcy5uZXdPdXRwdXRMb2NhdGlvbjsKKwkJfQorCQkvLyBpZiByZWFkLW9ubHkgLmNsYXNzcGF0aCwgdGhlbiB0aGUgY2xhc3NwYXRoIHNldHRpbmcgd2lsbCBuZXZlciBiZWVuIHBlcmZvcm1lZCBjb21wbGV0ZWx5CisJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHByb2plY3Quc2F2ZUNsYXNzcGF0aChjbGFzc3BhdGhGb3JTYXZlLCBvdXRwdXRMb2NhdGlvbkZvclNhdmUpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsKKwkJYnVmZmVyLmFwcGVuZCgiU2V0Q2xhc3NwYXRoT3BlcmF0aW9uXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCIgLSBjbGFzc3BhdGggOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodGhpcy5uZXdSYXdQYXRoID09IFJldXNlQ2xhc3NwYXRoKXsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxSZXVzZSBFeGlzdGluZyBDbGFzc3BhdGg+Iik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlci5hcHBlbmQoInsiKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5ld1Jhd1BhdGgubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCUlDbGFzc3BhdGhFbnRyeSBlbGVtZW50ID0gdGhpcy5uZXdSYXdQYXRoW2ldOworCQkJCWJ1ZmZlci5hcHBlbmQoIiAiKS5hcHBlbmQoZWxlbWVudC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoIlxuIC0gb3V0cHV0IGxvY2F0aW9uIDogIik7ICAvLyROT04tTkxTLTEkCisJCWlmICh0aGlzLm5ld091dHB1dExvY2F0aW9uID09IFJldXNlT3V0cHV0TG9jYXRpb24peworCQkJYnVmZmVyLmFwcGVuZCgiPFJldXNlIEV4aXN0aW5nIE91dHB1dCBMb2NhdGlvbj4iKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLm5ld091dHB1dExvY2F0aW9uLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVDbGFzc3BhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKChKYXZhUHJvamVjdCkgZ2V0RWxlbWVudHNUb1Byb2Nlc3MoKVswXSk7CisKKwkJYmVnaW5UYXNrKFV0aWwuYmluZCgiY2xhc3NwYXRoLnNldHRpbmdQcm9ncmVzcyIsIHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSksIDIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gU0lERS1FRkZFQ1Q6IGZyb20gdGhlcmVvbiwgdGhlIGNsYXNzcGF0aCBnb3QgbW9kaWZpZWQKKwkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgwKHRoaXMubmV3UmF3UGF0aCk7CisKKwkJLy8gcmVzb2x2ZSBuZXcgcGF0aCAoYXNraW5nIGZvciBtYXJrZXIgY3JlYXRpb24gaWYgcHJvYmxlbXMpCisJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkUGF0aCA9IAorCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgKKwkJCQl0cnVlLCAvLyBpZ25vcmVVbnJlc29sdmVkRW50cnkKKwkJCQl0aGlzLmNhbkNoYW5nZVJlc291cmNlKTsvLyBhbHNvIHVwZGF0ZSBjcCBtYXJrZXJzCisKKwkJaWYgKHRoaXMub2xkUmVzb2x2ZWRQYXRoICE9IG51bGwpIHsKKwkJCWdlbmVyYXRlQ2xhc3NwYXRoQ2hhbmdlRGVsdGFzKAorCQkJCXRoaXMub2xkUmVzb2x2ZWRQYXRoLAorCQkJCW5ld1Jlc29sdmVkUGF0aCwKKwkJCQlwcm9qZWN0LmdldEphdmFNb2RlbE1hbmFnZXIoKSwKKwkJCQlwcm9qZWN0KTsKKwkJfSBlbHNlIHsKKwkJCXVwZGF0ZUFmZmVjdGVkUHJvamVjdHMocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7CisJCX0KKwkJCisJCWlmICh0aGlzLm5lZWRDeWNsZUNoZWNrKXsKKwkJCXVwZGF0ZUN5Y2xlTWFya2VycyhuZXdSZXNvbHZlZFBhdGgpOworCQl9CisJfQorCisJLyoqCisJICogVXBkYXRlIHByb2plY3RzIHdoaWNoIGFyZSBhZmZlY3RlZCBieSB0aGlzIGNsYXNzcGF0aCBjaGFuZ2U6CisJICogdGhvc2Ugd2hpY2ggcmVmZXJzIHRvIHRoZSBjdXJyZW50IHByb2plY3QgYXMgc291cmNlCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWZmZWN0ZWRQcm9qZWN0cyhJUGF0aCBwcmVyZXF1aXNpdGVQcm9qZWN0UGF0aCkgeworCisJCXRyeSB7CisJCQlJSmF2YU1vZGVsIG1vZGVsID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7CisJCQlJSmF2YVByb2plY3Qgb3JpZ2luYXRpbmdQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBwcm9qZWN0Q291bnQgPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBwcm9qZWN0Q291bnQ7IGkrKykgeworCQkJCXRyeSB7CisJCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIHByb2plY3RzW2ldOworCQkJCQlpZiAocHJvamVjdC5lcXVhbHMob3JpZ2luYXRpbmdQcm9qZWN0KSkgY29udGludWU7IC8vIHNraXAgaXRzZWxmCisJCQkJCQorCQkJCQkvLyBjb25zaWRlciBBTEwgZGVwZW5kZW50cyAoZXZlbiBpbmRpcmVjdCBvbmVzKSwgc2luY2UgdGhleSBtYXkgbmVlZCB0bworCQkJCQkvLyBmbHVzaCB0aGVpciByZXNwZWN0aXZlIG5hbWVsb29rdXAgY2FjaGVzIChhbGwgcGtnIGZyYWdtZW50IHJvb3RzKS4KKworCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOworCQkJCQlmb3IgKGludCBqID0gMCwgZW50cnlDb3VudCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBlbnRyeUNvdW50OyBqKyspIHsKKwkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QKKwkJCQkJCQkmJiBlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHByZXJlcXVpc2l0ZVByb2plY3RQYXRoKSkgeworCQkJCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAorCQkJCQkJCQlwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCAKKwkJCQkJCQkJU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLlJldXNlT3V0cHV0TG9jYXRpb24sIAorCQkJCQkJCQl0aGlzLmZNb25pdG9yLCAKKwkJCQkJCQkJdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZSwgCisJCQkJCQkJCWZhbHNlLCAKKwkJCQkJCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgCisJCQkJCQkJCWZhbHNlLCAvLyBubyBmdXJ0aGVyIGN5Y2xlIGNoZWNrCisJCQkJCQkJCWZhbHNlKTsgLy8gdXBkYXRpbmcgb25seSAtIG5vIHZhbGlkYXRpb24KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl9CisJCQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSBjeWNsZSBtYXJrZXJzCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ3ljbGVNYXJrZXJzKElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkUGF0aCkgeworCQkKKwkJaWYgKCF0aGlzLmNhbkNoYW5nZVJlc291cmNlKSByZXR1cm47CisJCSAKKwkJdHJ5IHsKKwkJCUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCQlpZiAoIXByb2plY3QuaGFzQ2xhc3NwYXRoQ3ljbGUocHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSkKKwkJCQkJJiYgIXByb2plY3QuaGFzQ3ljbGVNYXJrZXIoKSl7CisJCQkJcmV0dXJuOworCQkJfQorCQkKKwkJCUphdmFQcm9qZWN0LnVwZGF0ZUFsbEN5Y2xlTWFya2VycygpOworCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgcHJlLXNwZWNpZmllZCBwcm9qZWN0LgorCSAqCisJICogPHA+VGhpcyBjYW4gY2F1c2UgY2hhbmdlcyBpbiBwYWNrYWdlIGZyYWdtZW50cyAtIGkuZS4gaWYgdGhlCisJICogb2xkIGFuZCBuZXcgb3V0cHV0IGxvY2F0aW9uIGZvbGRlciBjb3VsZCBiZSBjb25zaWRlcmVkIGFzCisJICogYSBwYWNrYWdlIGZyYWdtZW50LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU91dHB1dExvY2F0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQlKYXZhUHJvamVjdCBwcm9qZWN0PSAoKEphdmFQcm9qZWN0KSBnZXRFbGVtZW50c1RvUHJvY2VzcygpWzBdKTsKKworCQliZWdpblRhc2soVXRpbC5iaW5kKCJjbGFzc3BhdGguc2V0dGluZ091dHB1dExvY2F0aW9uUHJvZ3Jlc3MiLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpLCAyKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJSVBhdGggb2xkTG9jYXRpb249IHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkKKwkJLy8gc2VlIGlmIHRoaXMgd2lsbCBjYXVzZSBhbnkgcGFja2FnZSBmcmFnbWVudHMgdG8gYmUgYWRkZWQKKwkJYm9vbGVhbiBkZWx0YVRvRmlyZT0gZmFsc2U7CisJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7CisJCUFycmF5TGlzdCBhZGRlZD0gZGV0ZXJtaW5lQWZmZWN0ZWRQYWNrYWdlRnJhZ21lbnRzKG9sZExvY2F0aW9uKTsKKwkJSXRlcmF0b3IgaXRlciA9IGFkZGVkLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSl7CisJCQlJUGFja2FnZUZyYWdtZW50IGZyYWc9IChJUGFja2FnZUZyYWdtZW50KWl0ZXIubmV4dCgpOworCQkJKChJUGFja2FnZUZyYWdtZW50Um9vdClmcmFnLmdldFBhcmVudCgpKS5jbG9zZSgpOworCQkJZGVsdGEuYWRkZWQoZnJhZyk7CisJCQlkZWx0YVRvRmlyZSA9IHRydWU7CisJCX0KKwkKKwkJLy8gc2VlIGlmIHRoaXMgd2lsbCBjYXVzZSBhbnkgcGFja2FnZSBmcmFnbWVudHMgdG8gYmUgcmVtb3ZlZAorCQlBcnJheUxpc3QgcmVtb3ZlZD0gZGV0ZXJtaW5lQWZmZWN0ZWRQYWNrYWdlRnJhZ21lbnRzKHRoaXMubmV3T3V0cHV0TG9jYXRpb24pOworCQlpdGVyID0gcmVtb3ZlZC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpeworCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnPSAoSVBhY2thZ2VGcmFnbWVudClpdGVyLm5leHQoKTsKKwkJCSgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZnJhZy5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKKwkJCWRlbHRhLnJlbW92ZWQoZnJhZyk7CisJCQlkZWx0YVRvRmlyZSA9IHRydWU7CisJCX0KKwkJCisJCXByb2plY3QuZ2V0SmF2YVByb2plY3RFbGVtZW50SW5mbygpLnNldE91dHB1dExvY2F0aW9uKHRoaXMubmV3T3V0cHV0TG9jYXRpb24pOworCQlpZiAoZGVsdGFUb0ZpcmUpIHsKKwkJCWFkZERlbHRhKGRlbHRhKTsJCisJCX0KKwkJd29ya2VkKDEpOworCX0KKwkKKwkvKioKKwkgKiBVcGRhdGUgcHJvamVjdHMgcmVmZXJlbmNlcyBzbyB0aGF0IHRoZSBidWlsZCBvcmRlciBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGNsYXNzcGF0aAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RSZWZlcmVuY2VzSWZOZWNlc3NhcnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCWlmICghdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZSkgcmV0dXJuOworCQlpZiAodGhpcy5uZXdSYXdQYXRoID09IFJldXNlQ2xhc3NwYXRoIHx8ICF0aGlzLm5lZWRDeWNsZUNoZWNrKSByZXR1cm47CisKKwkJSmF2YVByb2plY3QganByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCVN0cmluZ1tdIG9sZFJlcXVpcmVkID0ganByb2plY3QuZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKTsKKwkJU3RyaW5nW10gbmV3UmVxdWlyZWQgPWpwcm9qZWN0LnByb2plY3RQcmVyZXF1aXNpdGVzKGpwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRoaXMubmV3UmF3UGF0aCwgdHJ1ZSwgZmFsc2UpKTsKKworCQl0cnkgewkJCisJCQlJUHJvamVjdCBwcm9qZWN0ID0ganByb2plY3QuZ2V0UHJvamVjdCgpOworCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCSAKKwkJCUlQcm9qZWN0W10gcHJvamVjdFJlZmVyZW5jZXMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKKwkJCQorCQkJSGFzaFNldCBvbGRSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQocHJvamVjdFJlZmVyZW5jZXMubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspeworCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3RSZWZlcmVuY2VzW2ldLmdldE5hbWUoKTsKKwkJCQlvbGRSZWZlcmVuY2VzLmFkZChwcm9qZWN0TmFtZSk7CisJCQl9CisJCQlIYXNoU2V0IG5ld1JlZmVyZW5jZXMgPSAoSGFzaFNldClvbGRSZWZlcmVuY2VzLmNsb25lKCk7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVxdWlyZWQubGVuZ3RoOyBpKyspeworCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG9sZFJlcXVpcmVkW2ldOworCQkJCW5ld1JlZmVyZW5jZXMucmVtb3ZlKHByb2plY3ROYW1lKTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVxdWlyZWQubGVuZ3RoOyBpKyspeworCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG5ld1JlcXVpcmVkW2ldOworCQkJCW5ld1JlZmVyZW5jZXMuYWRkKHByb2plY3ROYW1lKTsKKwkJCX0KKworCQkJSXRlcmF0b3IgaXRlcjsKKwkJCWludCBuZXdTaXplID0gbmV3UmVmZXJlbmNlcy5zaXplKCk7CisJCQkKKwkJCWNoZWNrSWRlbnRpdHk6IHsKKwkJCQlpZiAob2xkUmVmZXJlbmNlcy5zaXplKCkgPT0gbmV3U2l6ZSl7CisJCQkJCWl0ZXIgPSBuZXdSZWZlcmVuY2VzLml0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSl7CisJCQkJCQlpZiAoIW9sZFJlZmVyZW5jZXMuY29udGFpbnMoaXRlci5uZXh0KCkpKXsKKwkJCQkJCQlicmVhayBjaGVja0lkZW50aXR5OworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlTdHJpbmdbXSByZXF1aXJlZFByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbbmV3U2l6ZV07CisJCQlpbnQgaW5kZXggPSAwOworCQkJaXRlciA9IG5ld1JlZmVyZW5jZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSl7CisJCQkJcmVxdWlyZWRQcm9qZWN0TmFtZXNbaW5kZXgrK10gPSAoU3RyaW5nKWl0ZXIubmV4dCgpOworCQkJfQorCQkJVXRpbC5zb3J0KHJlcXVpcmVkUHJvamVjdE5hbWVzKTsgLy8gZW5zdXJlIHRoYXQgaWYgY2hhbmdlZCwgdGhlIG9yZGVyIGlzIGNvbnNpc3RlbnQKKwkJCQorCQkJSVByb2plY3RbXSByZXF1aXJlZFByb2plY3RBcnJheSA9IG5ldyBJUHJvamVjdFtuZXdTaXplXTsKKwkJCUlXb3Jrc3BhY2VSb290IHdrc1Jvb3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l6ZTsgaSsrKXsKKwkJCQlyZXF1aXJlZFByb2plY3RBcnJheVtpXSA9IHdrc1Jvb3QuZ2V0UHJvamVjdChyZXF1aXJlZFByb2plY3ROYW1lc1tpXSk7CisJCQl9CisKKwkJCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZXF1aXJlZFByb2plY3RBcnJheSk7CisJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCB0aGlzLmZNb25pdG9yKTsKKworCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCisJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gc3VwZXIudmVyaWZ5KCk7CisJCWlmICghc3RhdHVzLmlzT0soKSkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWlmIChuZWVkVmFsaWRhdGlvbikgeworCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisJCQkvLyByZXRyaWV2ZSBjbGFzc3BhdGggCisJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gdGhpcy5uZXdSYXdQYXRoOworCQkJaWYgKGVudHJpZXMgPT0gUmV1c2VDbGFzc3BhdGgpeworCQkJCXRyeSB7CisJCQkJCWVudHJpZXMgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwkJCQorCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOworCQkJCX0KKwkJCX0JCQorCQkJLy8gcmV0cmlldmUgb3V0cHV0IGxvY2F0aW9uCisJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHRoaXMubmV3T3V0cHV0TG9jYXRpb247CisJCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gUmV1c2VPdXRwdXRMb2NhdGlvbil7CisJCQkJdHJ5IHsKKwkJCQkJb3V0cHV0TG9jYXRpb24gPSBwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CisJCQkJfQorCQkJfQorCQkJCQkKKwkJCS8vIHBlcmZvcm0gdmFsaWRhdGlvbgorCQkJcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aCgKKwkJCQlwcm9qZWN0LAorCQkJCWVudHJpZXMsCisJCQkJb3V0cHV0TG9jYXRpb24pOworCQl9CisJCQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwNGJkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NpbmdsZVR5cGVSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworCisvKioKKyAqIFRoZSBTaW5nbGVUeXBlUmVxdWVzdG9yIGlzIGFuIElKYXZhRWxlbWVudFJlcXVlc3RvciB0aGF0IAorICogb25seSBhY2NlcHRzIG9uZSByZXN1bHQgZWxlbWVudCBhbmQgdGhlbiBjYW5jZWxzLgorICovCisvKiBwYWNrYWdlICovIGNsYXNzIFNpbmdsZVR5cGVSZXF1ZXN0b3IgaW1wbGVtZW50cyBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IgeworCS8qKgorCSAqIFRoZSBzaW5nbGUgYWNjZXB0ZWQgZWxlbWVudAorCSAqLworCXByb3RlY3RlZCBJVHlwZSBmRWxlbWVudD0gbnVsbDsKKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGQoSUZpZWxkIGZpZWxkKSB7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEluaXRpYWxpemVyKElJbml0aWFsaXplciBpbml0aWFsaXplcikgeworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRNZW1iZXJUeXBlKElUeXBlIHR5cGUpIHsKKwlmRWxlbWVudD0gdHlwZTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB7Cit9CisvKioKKyAqIEBzZWUgSUphdmFFbGVtZW50UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgeworfQorLyoqCisgKiBAc2VlIElKYXZhRWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKElUeXBlIHR5cGUpIHsKKwlmRWxlbWVudD0gdHlwZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBhY2NlcHRlZCBieSB0aGlzIHJlcXVlc3Rvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAqIGlmIG5vIHR5cGUgaGFzIGJlZW4gYWNjZXB0ZWQuCisgKi8KK3B1YmxpYyBJVHlwZSBnZXRUeXBlKCkgeworCXJldHVybiBmRWxlbWVudDsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnRSZXF1ZXN0b3IKKyAqLworcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKwlyZXR1cm4gZkVsZW1lbnQgIT0gbnVsbDsKK30KKy8qKgorICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoaXMgcmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIHJlc2V0KCkgeworCWZFbGVtZW50PSBudWxsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNjk0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworCisvKioKKyAqIEBzZWUgSUZpZWxkCisgKi8KKworLyogcGFja2FnZSAqLyBjbGFzcyBTb3VyY2VGaWVsZCBleHRlbmRzIE1lbWJlciBpbXBsZW1lbnRzIElGaWVsZCB7CisKKy8qKgorICogQ29uc3RydWN0cyBhIGhhbmRsZSB0byB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgc3BlY2lmaWVkIHR5cGUuIAorICovCitwcm90ZWN0ZWQgU291cmNlRmllbGQoSVR5cGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKEZJRUxELCBwYXJlbnQsIG5hbWUpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2VxdWFsc0RPTU5vZGUKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxzRE9NTm9kZShJRE9NTm9kZSBub2RlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJRE9NTm9kZS5GSUVMRCkgJiYgc3VwZXIuZXF1YWxzRE9NTm9kZShub2RlKTsKK30KKy8qKgorICogQHNlZSBJRmllbGQKKyAqLworcHVibGljIE9iamVjdCBnZXRDb25zdGFudCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZUZpZWxkRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCXJldHVybiBjb252ZXJ0Q29uc3RhbnQoaW5mby5nZXRDb25zdGFudCgpKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIGNoYXIgZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpIHsKKwlyZXR1cm4gSmF2YUVsZW1lbnQuSkVNX0ZJRUxEOworfQorLyoqCisgKiBAc2VlIElGaWVsZAorICovCitwdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTb3VyY2VGaWVsZEVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlRmllbGRFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwlyZXR1cm4gaW5mby5nZXRUeXBlU2lnbmF0dXJlKCk7Cit9CisvKioKKyAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSBpZiAoaW5mbyA9PSBOT19JTkZPKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKHRoaXMuZ2V0VHlwZVNpZ25hdHVyZSgpKSk7CisJCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXRFbGVtZW50TmFtZSgpKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxKYXZhTW9kZWxFeGNlcHRpb24gaW4gdG9TdHJpbmcgb2YgIiArIGdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZEVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZEVsZW1lbnRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwM2RhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkRWxlbWVudEluZm8uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKKworLyoqCisgKiBFbGVtZW50IGluZm8gZm9yIElGaWVsZCBlbGVtZW50cy4KKyAqLworCisvKiBwYWNrYWdlICovIGNsYXNzIFNvdXJjZUZpZWxkRWxlbWVudEluZm8gZXh0ZW5kcyBNZW1iZXJFbGVtZW50SW5mbyBpbXBsZW1lbnRzIElTb3VyY2VGaWVsZCB7CisKKwkvKioKKwkgKiBUaGUgdHlwZSBuYW1lIG9mIHRoaXMgZmllbGQuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSBmVHlwZU5hbWU7CisJCisJLyoqCisJICogVGhlIGZpZWxkJ3MgY29uc3RhbnQgdmFsdWUKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uc3RhbnQgZkNvbnN0YW50OworLyoqCisgKiBDb25zdHJ1Y3RzIGFuIGluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZmllbGQuCisgKi8KK3Byb3RlY3RlZCBTb3VyY2VGaWVsZEVsZW1lbnRJbmZvKCkgeworCWZDb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsJIAorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZCBvcgorICogQ29uc3RhbnQuTm90QUNvbnN0YW50IGlmIHRoZSBmaWVsZCBpcyBub3QgY29uc3RhbnQuCisgKi8KK3B1YmxpYyBDb25zdGFudCBnZXRDb25zdGFudCgpIHsKKwlyZXR1cm4gZkNvbnN0YW50OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGZpZWxkLgorICovCitwdWJsaWMgY2hhcltdIGdldFR5cGVOYW1lKCkgeworCXJldHVybiBmVHlwZU5hbWU7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBmaWVsZC4KKyAqCisgKiBAc2VlIFNpZ25hdHVyZQorICovCitwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB7CisJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKGZUeXBlTmFtZSwgZmFsc2UpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZCBvcgorICogQ29uc3RhbnQuTm90QUNvbnN0YW50IGlmIHRoZSBmaWVsZCBpcyBub3QgY29uc3RhbnQuCisgKi8KK3B1YmxpYyB2b2lkIHNldENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50KSB7CisJZkNvbnN0YW50ID0gY29uc3RhbnQ7IAorfQorLyoqCisgKiBTZXRzIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGZpZWxkLgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlTmFtZShjaGFyW10gdHlwZU5hbWUpIHsKKwlmVHlwZU5hbWU9IHR5cGVOYW1lOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZmNjlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEKQEAgLTAsMCArMSw4OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuU291cmNlRWxlbWVudFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuUmVmZXJlbmNlSW5mb0FkYXB0ZXI7CisKKy8qKgorICogQSBTb3VyY2VNYXBwZXIgbWFwcyBzb3VyY2UgY29kZSBpbiBhIFpJUCBmaWxlIHRvIGJpbmFyeSB0eXBlcyBpbgorICogYSBKQVIuIFRoZSBTb3VyY2VNYXBwZXIgdXNlcyB0aGUgZnV6enkgcGFyc2VyIHRvIGlkZW50aWZ5IHNvdXJjZQorICogZnJhZ21lbnRzIGluIGEgLmphdmEgZmlsZSwgYW5kIGF0dGVtcHRzIHRvIG1hdGNoIHRoZSBzb3VyY2UgY29kZQorICogd2l0aCBjaGlsZHJlbiBpbiBhIGJpbmFyeSB0eXBlLiBBIFNvdXJjZU1hcHBlciBpcyBhc3NvY2lhdGVkCisgKiB3aXRoIGEgSmFyUGFja2FnZUZyYWdtZW50IGJ5IGFuIEF0dGFjaFNvdXJjZU9wZXJhdGlvbi4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudAorICovCitwdWJsaWMgY2xhc3MgU291cmNlTWFwcGVyCisJZXh0ZW5kcyBSZWZlcmVuY2VJbmZvQWRhcHRlcgorCWltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgeworCisJLyoqCisJICogVGhlIGJpbmFyeSB0eXBlIHNvdXJjZSBpcyBiZWluZyBtYXBwZWQgZm9yCisJICovCisJcHJvdGVjdGVkIEJpbmFyeVR5cGUgZlR5cGU7CisKKwkvKioKKwkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHppcCBmaWxlIGNvbnRhaW5pbmcgc291cmNlLgorCSAqLworCXByb3RlY3RlZCBJUGF0aCBmWmlwUGF0aDsKKwkvKioKKwkgKiBTcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2l0aGluCisJICogdGhlIHppcCAoZW1wdHkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJvb3QpLiA8Y29kZT5udWxsPC9jb2RlPiBpcworCSAqIG5vdCBhIHZhbGlkIHJvb3QgcGF0aC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZSb290UGF0aDsKKworCS8qKgorCSAqIFVzZWQgZm9yIGVmZmljaWVuY3kKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGZnRW1wdHlTdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbMF07CisKKwkvKioKKwkgKiBUYWJsZSB0aGF0IG1hcHMgYSBiaW5hcnkgbWV0aG9kIHRvIGl0cyBwYXJhbWV0ZXIgbmFtZXMuCisJICogS2V5cyBhcmUgdGhlIG1ldGhvZCBoYW5kbGVzLCBlbnRyaWVzIGFyZSA8Y29kZT5jaGFyW11bXTwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIEhhc2hNYXAgZlBhcmFtZXRlck5hbWVzOworCQorCS8qKgorCSAqIFRhYmxlIHRoYXQgbWFwcyBhIGJpbmFyeSBlbGVtZW50IHRvIGl0cyA8Y29kZT5Tb3VyY2VSYW5nZTwvY29kZT5zLgorCSAqIEtleXMgYXJlIHRoZSBlbGVtZW50IGhhbmRsZXMsIGVudHJpZXMgYXJlIDxjb2RlPlNvdXJjZVJhbmdlW108L2NvZGU+IHdoaWNoCisJICogaXMgYSB0d28gZWxlbWVudCBhcnJheTsgdGhlIGZpcnN0IGJlaW5nIHNvdXJjZSByYW5nZSwgdGhlIHNlY29uZAorCSAqIGJlaW5nIG5hbWUgcmFuZ2UuCisJICovCisJcHJvdGVjdGVkIEhhc2hNYXAgZlNvdXJjZVJhbmdlczsKKwkKKworCS8qKgorCSAqIFRoZSB1bmtub3duIHNvdXJjZSByYW5nZSB7LTEsIDB9CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTb3VyY2VSYW5nZSBmZ1Vua25vd25SYW5nZSA9IG5ldyBTb3VyY2VSYW5nZSgtMSwgMCk7CisKKwkvKioKKwkgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBzb3VyY2Ugb2YgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGN1cnJlbnQgbWVtYmVyIGVsZW1lbnQsIG9yIC0xIGlmIHdlIGFyZSBvdXRzaWRlIGEgbWVtYmVyLgorCSAqLworCXByb3RlY3RlZCBpbnRbXSBmTWVtYmVyRGVjbGFyYXRpb25TdGFydDsKKwkvKioKKwkgKiBUaGUgPGNvZGU+U291cmNlUmFuZ2U8L2NvZGU+IG9mIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1lbWJlciBlbGVtZW50LgorCSAqLworCXByb3RlY3RlZCBTb3VyY2VSYW5nZVtdIGZNZW1iZXJOYW1lUmFuZ2U7CisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWVtYmVyIGVsZW1lbnQuCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1tdIGZNZW1iZXJOYW1lOworCQorCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgbmFtZXMgZm9yIHRoZSBjdXJyZW50IG1lbWJlciBtZXRob2QgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgY2hhcltdW11bXSBmTWV0aG9kUGFyYW1ldGVyTmFtZXM7CisJCisJLyoqCisJICogVGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIGN1cnJlbnQgbWVtYmVyIG1ldGhvZCBlbGVtZW50LgorCSAqLworCXByb3RlY3RlZCBjaGFyW11bXVtdIGZNZXRob2RQYXJhbWV0ZXJUeXBlczsKKwkKKworCS8qKgorCSAqIFRoZSBlbGVtZW50IHNlYXJjaGVkIGZvcgorCSAqLworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50OworCisJLyoqCisJICogaW1wb3J0cyByZWZlcmVuY2VzCisJICovCisJcHJpdmF0ZSBIYXNoTWFwIGltcG9ydHNUYWJsZTsKKwlwcml2YXRlIEhhc2hNYXAgaW1wb3J0c0NvdW50ZXJUYWJsZTsKKworCS8qKgorCSAqIEVuY2xvc2luZyB0eXBlIGluZm9ybWF0aW9uCisJICovCisJSVR5cGVbXSB0eXBlczsKKwlpbnRbXSB0eXBlRGVjbGFyYXRpb25TdGFydHM7CisJU291cmNlUmFuZ2VbXSB0eXBlTmFtZVJhbmdlczsKKwlpbnQgdHlwZURlcHRoOworCQorCS8qKgorCSAqICBBbm9ueW1vdXMgY291bnRlciBpbiBjYXNlIHdlIHdhbnQgdG8gbWFwIHRoZSBzb3VyY2Ugb2YgYW4gYW5vbnltb3VzIGNsYXNzLgorCSAqLworCWludCBhbm9ueW1vdXNDb3VudGVyOworCWludCBhbm9ueW1vdXNDbGFzc05hbWU7CisJCisJLyoqCisJICogRmlsZSBlbmNvZGluZyB0byBiZSB1c2VkCisJICovCisJU3RyaW5nIGVuY29kaW5nOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSA8Y29kZT5Tb3VyY2VNYXBwZXI8L2NvZGU+IHRoYXQgbG9jYXRlcyBzb3VyY2UgaW4gdGhlIHppcCBmaWxlCisJICogYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBmcmFnbWVudCByb290LgorCSAqLworCXB1YmxpYyBTb3VyY2VNYXBwZXIoSVBhdGggemlwUGF0aCwgU3RyaW5nIHJvb3RQYXRoKSB7CisJCXRoaXMuZlppcFBhdGggPSB6aXBQYXRoOworCQl0aGlzLmZSb290UGF0aCA9IHJvb3RQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKKwkJaWYgKHRoaXMuZlJvb3RQYXRoLmVuZHNXaXRoKCIvIiApKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRoaXMuZlJvb3RQYXRoID0gdGhpcy5mUm9vdFBhdGguc3Vic3RyaW5nKDAsIHRoaXMuZlJvb3RQYXRoLmxhc3RJbmRleE9mKCcvJykpOworCQl9CisJCXRoaXMuZlNvdXJjZVJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7CisJCXRoaXMuZlBhcmFtZXRlck5hbWVzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5pbXBvcnRzVGFibGUgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLmltcG9ydHNDb3VudGVyVGFibGUgPSBuZXcgSGFzaE1hcCgpOworCQkKKwkJSVJlc291cmNlIHppcFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHppcFBhdGgpOworCisJCXRoaXMuZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgZGVjbGFyYXRpb25FbmQsCisJCWNoYXJbXSBuYW1lLAorCQlib29sZWFuIG9uRGVtYW5kKSB7CisJCWNoYXJbXVtdIGltcG9ydHMgPSAoY2hhcltdW10pIHRoaXMuaW1wb3J0c1RhYmxlLmdldChmVHlwZSk7CisJCWludCBpbXBvcnRzQ291bnRlcjsKKwkJaWYgKGltcG9ydHMgPT0gbnVsbCkgeworCQkJaW1wb3J0cyA9IG5ldyBjaGFyWzVdW107CisJCQlpbXBvcnRzQ291bnRlciA9IDA7CisJCX0gZWxzZSB7CisJCQlpbXBvcnRzQ291bnRlciA9ICgoSW50ZWdlcikgdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlLmdldChmVHlwZSkpLmludFZhbHVlKCk7CisJCX0KKwkJaWYgKGltcG9ydHMubGVuZ3RoID09IGltcG9ydHNDb3VudGVyKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCWltcG9ydHMsCisJCQkJMCwKKwkJCQkoaW1wb3J0cyA9IG5ldyBjaGFyW2ltcG9ydHNDb3VudGVyICogMl1bXSksCisJCQkJMCwKKwkJCQlpbXBvcnRzQ291bnRlcik7CisJCX0KKwkJaWYgKG9uRGVtYW5kKSB7CisJCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCAobmFtZSA9IG5ldyBjaGFyW25hbWVMZW5ndGggKyAyXSksIDAsIG5hbWVMZW5ndGgpOworCQkJbmFtZVtuYW1lTGVuZ3RoXSA9ICcuJzsKKwkJCW5hbWVbbmFtZUxlbmd0aCArIDFdID0gJyonOworCQl9CisJCWltcG9ydHNbaW1wb3J0c0NvdW50ZXIrK10gPSBuYW1lOworCQl0aGlzLmltcG9ydHNUYWJsZS5wdXQoZlR5cGUsIGltcG9ydHMpOworCQl0aGlzLmltcG9ydHNDb3VudGVyVGFibGUucHV0KGZUeXBlLCBuZXcgSW50ZWdlcihpbXBvcnRzQ291bnRlcikpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHsKKwkJLy9kbyBub3RoaW5nCisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IGRlY2xhcmF0aW9uRW5kLAorCQljaGFyW10gbmFtZSkgeworCQkvL2RvIG5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgeworCQkvL2RvIG5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQ2xvc2VzIHRoaXMgPGNvZGU+U291cmNlTWFwcGVyPC9jb2RlPidzIHppcCBmaWxlLiBPbmNlIHRoaXMgaXMgZG9uZSwgdGhpcworCSAqIDxjb2RlPlNvdXJjZU1hcHBlcjwvY29kZT4gY2Fubm90IGJlIHVzZWQgYWdhaW4uCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJZlNvdXJjZVJhbmdlcyA9IG51bGw7CisJCWZQYXJhbWV0ZXJOYW1lcyA9IG51bGw7CisJfQorCisJLyoqCisJICogQ29udmVydHMgdGhlc2UgdHlwZSBuYW1lcyB0byB1bnF1YWxpZmllZCBzaWduYXR1cmVzLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudAorCSAqIHdpdGggdGhlIHdheSB0aGUgc291cmNlIHJhbmdlIGlzIHJldHJpZXZlZC4KKwkgKiBAc2VlIFNvdXJjZU1hcHBlciNnZXRVbnF1YWxpZmllZE1ldGhvZEhhbmRsZQorCSAqIEBzZWUgU2lnbmF0dXJlLgorCSAqLworCXByaXZhdGUgU3RyaW5nW10gY29udmVydFR5cGVOYW1lc1RvU2lncyhjaGFyW11bXSB0eXBlTmFtZXMpIHsKKwkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQorCQkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsKKwkJaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOworCQlpZiAobiA9PSAwKQorCQkJcmV0dXJuIGZnRW1wdHlTdHJpbmdBcnJheTsKKwkJU3RyaW5nW10gdHlwZVNpZ3MgPSBuZXcgU3RyaW5nW25dOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworCQkJU3RyaW5nIHR5cGVTaWcgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZXNbaV0sIGZhbHNlKTsKKwkJCWludCBsYXN0SW5kZXggPSB0eXBlU2lnLmxhc3RJbmRleE9mKCcuJyk7CisJCQlpZiAobGFzdEluZGV4ID09IC0xKSB7CisJCQkJdHlwZVNpZ3NbaV0gPSB0eXBlU2lnOworCQkJfSBlbHNlIHsKKwkJCQl0eXBlU2lnc1tpXSA9IFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgKyB0eXBlU2lnLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLCB0eXBlU2lnLmxlbmd0aCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHlwZVNpZ3M7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbnRlckNsYXNzKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kLAorCQljaGFyW10gc3VwZXJjbGFzcywKKwkJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisKKwkJdGhpcy50eXBlRGVwdGgrKzsKKwkJaWYgKHRoaXMudHlwZURlcHRoID09IHRoaXMudHlwZXMubGVuZ3RoKSB7IC8vIG5lZWQgdG8gZ3JvdworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnR5cGVzLAorCQkJCTAsCisJCQkJdGhpcy50eXBlcyA9IG5ldyBJVHlwZVt0aGlzLnR5cGVEZXB0aCAqIDJdLAorCQkJCTAsCisJCQkJdGhpcy50eXBlRGVwdGgpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnR5cGVOYW1lUmFuZ2VzLAorCQkJCTAsCisJCQkJdGhpcy50eXBlTmFtZVJhbmdlcyA9IG5ldyBTb3VyY2VSYW5nZVt0aGlzLnR5cGVEZXB0aCAqIDJdLAorCQkJCTAsCisJCQkJdGhpcy50eXBlRGVwdGgpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0cywKKwkJCQkwLAorCQkJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzID0gbmV3IGludFt0aGlzLnR5cGVEZXB0aCAqIDJdLAorCQkJCTAsCisJCQkJdGhpcy50eXBlRGVwdGgpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmZNZW1iZXJOYW1lLAorCQkJCTAsCisJCQkJdGhpcy5mTWVtYmVyTmFtZSA9IG5ldyBTdHJpbmdbdGhpcy50eXBlRGVwdGggKiAyXSwKKwkJCQkwLAorCQkJCXRoaXMudHlwZURlcHRoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5mTWVtYmVyRGVjbGFyYXRpb25TdGFydCwKKwkJCQkwLAorCQkJCXRoaXMuZk1lbWJlckRlY2xhcmF0aW9uU3RhcnQgPSBuZXcgaW50W3RoaXMudHlwZURlcHRoICogMl0sCisJCQkJMCwKKwkJCQl0aGlzLnR5cGVEZXB0aCk7CQkJCQkJCQorCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmZNZW1iZXJOYW1lUmFuZ2UsCisJCQkJMCwKKwkJCQl0aGlzLmZNZW1iZXJOYW1lUmFuZ2UgPSBuZXcgU291cmNlUmFuZ2VbdGhpcy50eXBlRGVwdGggKiAyXSwKKwkJCQkwLAorCQkJCXRoaXMudHlwZURlcHRoKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5mTWV0aG9kUGFyYW1ldGVyVHlwZXMsCisJCQkJMCwKKwkJCQl0aGlzLmZNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IG5ldyBjaGFyW3RoaXMudHlwZURlcHRoICogMl1bXVtdLAorCQkJCTAsCisJCQkJdGhpcy50eXBlRGVwdGgpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQl0aGlzLmZNZXRob2RQYXJhbWV0ZXJOYW1lcywKKwkJCQkwLAorCQkJCXRoaXMuZk1ldGhvZFBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbdGhpcy50eXBlRGVwdGggKiAyXVtdW10sCisJCQkJMCwKKwkJCQl0aGlzLnR5cGVEZXB0aCk7CQkJCQkKKwkJfQorCQlpZiAobmFtZS5sZW5ndGggPT0gMCkgeworCQkJdGhpcy5hbm9ueW1vdXNDb3VudGVyKys7CisJCQlpZiAodGhpcy5hbm9ueW1vdXNDb3VudGVyID09IHRoaXMuYW5vbnltb3VzQ2xhc3NOYW1lKSB7CisJCQkJdGhpcy50eXBlc1t0eXBlRGVwdGhdID0gdGhpcy5nZXRUeXBlKGZUeXBlLmdldEVsZW1lbnROYW1lKCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnR5cGVzW3R5cGVEZXB0aF0gPSB0aGlzLmdldFR5cGUobmV3IFN0cmluZyhuYW1lKSk7CQkJCQorCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy50eXBlc1t0eXBlRGVwdGhdID0gdGhpcy5nZXRUeXBlKG5ldyBTdHJpbmcobmFtZSkpOworCQl9CisJCXRoaXMudHlwZU5hbWVSYW5nZXNbdHlwZURlcHRoXSA9CisJCQluZXcgU291cmNlUmFuZ2UobmFtZVNvdXJjZVN0YXJ0LCBuYW1lU291cmNlRW5kIC0gbmFtZVNvdXJjZVN0YXJ0ICsgMSk7CisJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzW3R5cGVEZXB0aF0gPSBkZWNsYXJhdGlvblN0YXJ0OworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgZW50ZXJDb21waWxhdGlvblVuaXQoKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gbmFtZSwKKwkJaW50IG5hbWVTb3VyY2VTdGFydCwKKwkJaW50IG5hbWVTb3VyY2VFbmQsCisJCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwkJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKKwkJZW50ZXJNZXRob2QoCisJCQlkZWNsYXJhdGlvblN0YXJ0LAorCQkJbW9kaWZpZXJzLAorCQkJbnVsbCwKKwkJCW5hbWUsCisJCQluYW1lU291cmNlU3RhcnQsCisJCQluYW1lU291cmNlRW5kLAorCQkJcGFyYW1ldGVyVHlwZXMsCisJCQlwYXJhbWV0ZXJOYW1lcywKKwkJCWV4Y2VwdGlvblR5cGVzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyRmllbGQoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gdHlwZSwKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kKSB7CisJCWlmICh0eXBlRGVwdGggPj0gMCkgeworCQkJZk1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdHlwZURlcHRoXSA9IGRlY2xhcmF0aW9uU3RhcnQ7CisJCQlmTWVtYmVyTmFtZVJhbmdlW3R5cGVEZXB0aF0gPQorCQkJCW5ldyBTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsKKwkJCWZNZW1iZXJOYW1lW3R5cGVEZXB0aF0gPSBuZXcgU3RyaW5nKG5hbWUpOworCQl9CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbnRlckluaXRpYWxpemVyKAorCQlpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwKKwkJaW50IG1vZGlmaWVycykgeworCQkvL2RvIG5vdGhpbmcKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGVudGVySW50ZXJmYWNlKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kLAorCQljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsKKwkJZW50ZXJDbGFzcygKKwkJCWRlY2xhcmF0aW9uU3RhcnQsCisJCQltb2RpZmllcnMsCisJCQluYW1lLAorCQkJbmFtZVNvdXJjZVN0YXJ0LAorCQkJbmFtZVNvdXJjZUVuZCwKKwkJCW51bGwsCisJCQlzdXBlcmludGVyZmFjZXMpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgZW50ZXJNZXRob2QoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gcmV0dXJuVHlwZSwKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kLAorCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKSB7CisJCWlmICh0eXBlRGVwdGggPj0gMCkgeworCQkJZk1lbWJlck5hbWVbdHlwZURlcHRoXSA9IG5ldyBTdHJpbmcobmFtZSk7CisJCQlmTWVtYmVyTmFtZVJhbmdlW3R5cGVEZXB0aF0gPQorCQkJCW5ldyBTb3VyY2VSYW5nZShuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsKKwkJCWZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3R5cGVEZXB0aF0gPSBkZWNsYXJhdGlvblN0YXJ0OworCQkJZk1ldGhvZFBhcmFtZXRlclR5cGVzW3R5cGVEZXB0aF0gPSBwYXJhbWV0ZXJUeXBlczsKKwkJCWZNZXRob2RQYXJhbWV0ZXJOYW1lc1t0eXBlRGVwdGhdID0gcGFyYW1ldGVyTmFtZXM7CisJCX0KKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRDbGFzcyhpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7CisJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKKwkJCXNldFNvdXJjZVJhbmdlKAorCQkJCWN1cnJlbnRUeXBlLAorCQkJCW5ldyBTb3VyY2VSYW5nZSgKKwkJCQkJdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHNbdHlwZURlcHRoXSwKKwkJCQkJZGVjbGFyYXRpb25FbmQgLSB0aGlzLnR5cGVEZWNsYXJhdGlvblN0YXJ0c1t0eXBlRGVwdGhdICsgMSksCisJCQkJdGhpcy50eXBlTmFtZVJhbmdlc1t0eXBlRGVwdGhdKTsKKwkJCXRoaXMudHlwZURlcHRoLS07CisJCX0KKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJCS8vZG8gbm90aGluZworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgeworCQlleGl0TWV0aG9kKGRlY2xhcmF0aW9uRW5kKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7CisJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKKwkJCXNldFNvdXJjZVJhbmdlKAorCQkJCWN1cnJlbnRUeXBlLmdldEZpZWxkKGZNZW1iZXJOYW1lW3R5cGVEZXB0aF0pLAorCQkJCW5ldyBTb3VyY2VSYW5nZSgKKwkJCQkJZk1lbWJlckRlY2xhcmF0aW9uU3RhcnRbdHlwZURlcHRoXSwKKwkJCQkJZGVjbGFyYXRpb25FbmQgLSBmTWVtYmVyRGVjbGFyYXRpb25TdGFydFt0eXBlRGVwdGhdICsgMSksCisJCQkJZk1lbWJlck5hbWVSYW5nZVt0eXBlRGVwdGhdKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgZXhpdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvbkVuZCkgeworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCisJICovCisJcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwkJZXhpdENsYXNzKGRlY2xhcmF0aW9uRW5kKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgorCSAqLworCXB1YmxpYyB2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJCWlmICh0eXBlRGVwdGggPj0gMCkgeworCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0aGlzLnR5cGVzW3R5cGVEZXB0aF07CisJCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSA9CisJCQkJbmV3IFNvdXJjZVJhbmdlKAorCQkJCQlmTWVtYmVyRGVjbGFyYXRpb25TdGFydFt0eXBlRGVwdGhdLAorCQkJCQlkZWNsYXJhdGlvbkVuZCAtIGZNZW1iZXJEZWNsYXJhdGlvblN0YXJ0W3R5cGVEZXB0aF0gKyAxKTsKKwkJCUlNZXRob2QgbWV0aG9kID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kKAorCQkJCQlmTWVtYmVyTmFtZVt0eXBlRGVwdGhdLAorCQkJCQljb252ZXJ0VHlwZU5hbWVzVG9TaWdzKGZNZXRob2RQYXJhbWV0ZXJUeXBlc1t0eXBlRGVwdGhdKSk7CisJCQlzZXRTb3VyY2VSYW5nZSgKKwkJCQltZXRob2QsCisJCQkJc291cmNlUmFuZ2UsCisJCQkJZk1lbWJlck5hbWVSYW5nZVt0eXBlRGVwdGhdKTsKKwkJCXNldE1ldGhvZFBhcmFtZXRlck5hbWVzKAorCQkJCW1ldGhvZCwKKwkJCQlmTWV0aG9kUGFyYW1ldGVyTmFtZXNbdHlwZURlcHRoXSk7CisJCX0KKwl9CisJCisJLyoqCisJICogTG9jYXRlcyBhbmQgcmV0dXJucyBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuIChiaW5hcnkpIHR5cGUsIGluIHRoaXMKKwkgKiBTb3VyY2VNYXBwZXIncyBaSVAgZmlsZSwgb3IgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBzb3VyY2UKKwkgKiBjb2RlIGNhbm5vdCBiZSBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgY2hhcltdIGZpbmRTb3VyY2UoSVR5cGUgdHlwZSkgeworCQlpZiAoIXR5cGUuaXNCaW5hcnkoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQmluYXJ5VHlwZSBwYXJlbnQgPSAoQmluYXJ5VHlwZSkgdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCUJpbmFyeVR5cGUgZGVjbFR5cGUgPSAoQmluYXJ5VHlwZSkgdHlwZTsKKwkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisJCQlkZWNsVHlwZSA9IHBhcmVudDsKKwkJCXBhcmVudCA9IChCaW5hcnlUeXBlKSBkZWNsVHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCX0KKwkJSUJpbmFyeVR5cGUgaW5mbyA9IG51bGw7CisJCXRyeSB7CisJCQlpbmZvID0gKElCaW5hcnlUeXBlKSBkZWNsVHlwZS5nZXRSYXdJbmZvKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5maW5kU291cmNlKHR5cGUsIGluZm8pOworCX0KKwkKKwkvKioKKwkgKiBMb2NhdGVzIGFuZCByZXR1cm5zIHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gKGJpbmFyeSkgdHlwZSwgaW4gdGhpcworCSAqIFNvdXJjZU1hcHBlcidzIFpJUCBmaWxlLCBvciByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHNvdXJjZQorCSAqIGNvZGUgY2Fubm90IGJlIGZvdW5kLgorCSAqLworCXB1YmxpYyBjaGFyW10gZmluZFNvdXJjZShJVHlwZSB0eXBlLCBJQmluYXJ5VHlwZSBpbmZvKSB7CisJCWNoYXJbXSBzb3VyY2VGaWxlTmFtZSA9IGluZm8uc291cmNlRmlsZU5hbWUoKTsKKwkJaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsgLy8gbm8gc291cmNlIGZpbGUgYXR0cmlidXRlCisJCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhzb3VyY2VGaWxlTmFtZSk7CisKKwkJSVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKKwkJaWYgKCFwa2dGcmFnLmlzRGVmYXVsdFBhY2thZ2UoKSkgeworCQkJU3RyaW5nIHBrZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsKKwkJCW5hbWUgPSBwa2cgKyAnLycgKyBuYW1lOworCQl9CisJCS8vIHRyeSB0byBnZXQgdGhlIGVudHJ5CisJCVppcEVudHJ5IGVudHJ5ID0gbnVsbDsKKwkJWmlwRmlsZSB6aXAgPSBudWxsOworCQljaGFyW10gc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyBmdWxsTmFtZTsKKwkJCS8vYWRkIHRoZSByb290IHBhdGggaWYgc3BlY2lmaWVkCisJCQlpZiAoIWZSb290UGF0aC5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKSkgeworCQkJCWZ1bGxOYW1lID0gZlJvb3RQYXRoICsgJy8nICsgbmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJZnVsbE5hbWUgPSBuYW1lOworCQkJfQorCQkJemlwID0gZ2V0WmlwKCk7CisJCQllbnRyeSA9IHppcC5nZXRFbnRyeShmdWxsTmFtZSk7CisJCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCS8vIG5vdyByZWFkIHRoZSBzb3VyY2UgY29kZQorCQkJCWJ5dGVbXSBieXRlcyA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJYnl0ZXMgPSBVdGlsLmdldFppcEVudHJ5Qnl0ZUNvbnRlbnQoZW50cnksIHppcCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCQlpZiAoYnl0ZXMgIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJc291cmNlID0gVXRpbC5ieXRlc1RvQ2hhcihieXRlcywgdGhpcy5lbmNvZGluZyk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXNvdXJjZSA9IG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jbG9zZVppcEZpbGUoemlwKTsKKwkJfQorCQlyZXR1cm4gc291cmNlOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBTb3VyY2VSYW5nZSBmb3IgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQsIG9yCisJICogey0xLCAtMX0gaWYgbm8gc291cmNlIHJhbmdlIGlzIGtub3duIGZvciB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRAorCQkJJiYgKChJTWVtYmVyKSBlbGVtZW50KS5pc0JpbmFyeSgpKSB7CisJCQlJSmF2YUVsZW1lbnRbXSBlbCA9IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKChJTWV0aG9kKSBlbGVtZW50LCBmYWxzZSk7CisJCQlpZihlbFsxXSAhPSBudWxsICYmIGZTb3VyY2VSYW5nZXMuZ2V0KGVsWzBdKSA9PSBudWxsKSB7CisJCQkJZWxlbWVudCA9IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKChJTWV0aG9kKSBlbGVtZW50LCB0cnVlKVswXTsKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudCA9IGVsWzBdOworCQkJfQorCQl9CisJCVNvdXJjZVJhbmdlW10gcmFuZ2VzID0gKFNvdXJjZVJhbmdlW10pIGZTb3VyY2VSYW5nZXMuZ2V0KGVsZW1lbnQpOworCQlpZiAocmFuZ2VzID09IG51bGwpIHsKKwkJCXJldHVybiBmZ1Vua25vd25SYW5nZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByYW5nZXNbMV07CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyBwYXJhbWV0ZXJzIG5hbWVzIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLCBvcgorCSAqIG51bGwgaWYgbm8gcGFyYW1ldGVyIG5hbWVzIGFyZSBrbm93biBmb3IgdGhlIG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gZ2V0TWV0aG9kUGFyYW1ldGVyTmFtZXMoSU1ldGhvZCBtZXRob2QpIHsKKwkJaWYgKCgoSU1lbWJlcikgbWV0aG9kKS5pc0JpbmFyeSgpKSB7CisJCQlJSmF2YUVsZW1lbnRbXSBlbCA9IGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKG1ldGhvZCwgZmFsc2UpOworCQkJaWYoZWxbMV0gIT0gbnVsbCAmJiBmUGFyYW1ldGVyTmFtZXMuZ2V0KGVsWzBdKSA9PSBudWxsKSB7CisJCQkJbWV0aG9kID0gKElNZXRob2QpIGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKG1ldGhvZCwgdHJ1ZSlbMF07CisJCQl9IGVsc2UgeworCQkJCW1ldGhvZCA9IChJTWV0aG9kKSBlbFswXTsKKwkJCX0KKwkJfQorCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IChjaGFyW11bXSkgZlBhcmFtZXRlck5hbWVzLmdldChtZXRob2QpOworCQlpZiAocGFyYW1ldGVyTmFtZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcGFyYW1ldGVyTmFtZXM7CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgPGNvZGU+U291cmNlUmFuZ2U8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgb3IKKwkgKiB7LTEsIC0xfSBpZiBubyBzb3VyY2UgcmFuZ2UgaXMga25vd24gZm9yIHRoZSBlbGVtZW50LgorCSAqLworCXB1YmxpYyBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZShJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QKKwkJCSYmICgoSU1lbWJlcikgZWxlbWVudCkuaXNCaW5hcnkoKSkgeworCQkJSUphdmFFbGVtZW50W10gZWwgPSBnZXRVbnF1YWxpZmllZE1ldGhvZEhhbmRsZSgoSU1ldGhvZCkgZWxlbWVudCwgZmFsc2UpOworCQkJaWYoZWxbMV0gIT0gbnVsbCAmJiBmU291cmNlUmFuZ2VzLmdldChlbFswXSkgPT0gbnVsbCkgeworCQkJCWVsZW1lbnQgPSBnZXRVbnF1YWxpZmllZE1ldGhvZEhhbmRsZSgoSU1ldGhvZCkgZWxlbWVudCwgdHJ1ZSlbMF07CisJCQl9IGVsc2UgeworCQkJCWVsZW1lbnQgPSBlbFswXTsKKwkJCX0KKwkJfQorCQlTb3VyY2VSYW5nZVtdIHJhbmdlcyA9IChTb3VyY2VSYW5nZVtdKSBmU291cmNlUmFuZ2VzLmdldChlbGVtZW50KTsKKwkJaWYgKHJhbmdlcyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmdVbmtub3duUmFuZ2U7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmFuZ2VzWzBdOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+dHlwZU5hbWU8L2NvZGU+LiAgUmV0dXJucyBpbm5lciBjbGFzc2VzCisJICogYXMgd2VsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJaWYgKGZUeXBlLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkKKwkJCXJldHVybiBmVHlwZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZUeXBlLmdldFR5cGUodHlwZU5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgaGFuZGxlIHRoYXQgaGFzIHBhcmFtZXRlciB0eXBlcyB0aGF0IGFyZSBub3QKKwkgKiBmdWxseSBxdWFsaWZpZWQgc28gdGhhdCB0aGUgY29ycmVjdCBzb3VyY2UgaXMgZm91bmQuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGdldFVucXVhbGlmaWVkTWV0aG9kSGFuZGxlKElNZXRob2QgbWV0aG9kLCBib29sZWFuIG5vRG9sbGFyKSB7CisJCWJvb2xlYW4gaGFzRG9sbGFyID0gZmFsc2U7CisJCVN0cmluZ1tdIHF1YWxpZmllZFBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCVN0cmluZ1tdIHVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW3F1YWxpZmllZFBhcmFtZXRlclR5cGVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZ0J1ZmZlciB1bnF1YWxpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZFBhcmFtZXRlclR5cGVzW2ldOworCQkJaW50IGNvdW50ID0gMDsKKwkJCXdoaWxlIChxdWFsaWZpZWROYW1lLmNoYXJBdChjb3VudCkgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIHsKKwkJCQl1bnF1YWxpZmllZE5hbWUuYXBwZW5kKFNpZ25hdHVyZS5DX0FSUkFZKTsKKwkJCQkrK2NvdW50OworCQkJfQorCQkJaWYgKHF1YWxpZmllZE5hbWUuY2hhckF0KGNvdW50KSA9PSBTaWduYXR1cmUuQ19SRVNPTFZFRCkgeworCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQoU2lnbmF0dXJlLkNfVU5SRVNPTFZFRCk7CisJCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhjb3VudCsxKSk7CisJCQkJaWYoIW5vRG9sbGFyKSB7CisJCQkJCWlmKCFoYXNEb2xsYXIgJiYgc2ltcGxlTmFtZS5pbmRleE9mKCckJykgIT0gLTEpIHsKKwkJCQkJCWhhc0RvbGxhciA9IHRydWU7CisJCQkJCX0KKwkJCQkJdW5xdWFsaWZpZWROYW1lLmFwcGVuZChzaW1wbGVOYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1bnF1YWxpZmllZE5hbWUuYXBwZW5kKENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQoc2ltcGxlTmFtZS50b0NoYXJBcnJheSgpLCAnJCcpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVucXVhbGlmaWVkTmFtZS5hcHBlbmQocXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoY291bnQsIHF1YWxpZmllZE5hbWUubGVuZ3RoKCkpKTsKKwkJCX0KKwkJCXVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXNbaV0gPSB1bnF1YWxpZmllZE5hbWUudG9TdHJpbmcoKTsKKwkJfQorCQkKKwkJSUphdmFFbGVtZW50W10gcmVzdWx0ID0gbmV3IElKYXZhRWxlbWVudFsyXTsKKwkJcmVzdWx0WzBdID0gKChJVHlwZSkgbWV0aG9kLmdldFBhcmVudCgpKS5nZXRNZXRob2QoCisJCQltZXRob2QuZ2V0RWxlbWVudE5hbWUoKSwKKwkJCXVucXVhbGlmaWVkUGFyYW1ldGVyVHlwZXMpOworCQlpZihoYXNEb2xsYXIpIHsKKwkJCXJlc3VsdFsxXSA9IHJlc3VsdFswXTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSA8Y29kZT5aaXBGaWxlPC9jb2RlPiB0aGF0IHNvdXJjZSBpcyBsb2NhdGVkIGluLgorCSAqLworCXB1YmxpYyBaaXBGaWxlIGdldFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFppcEZpbGUoZlppcFBhdGgpOworCX0KKwkKKwkvKioKKwkgKiBNYXBzIHRoZSBnaXZlbiBzb3VyY2UgY29kZSB0byB0aGUgZ2l2ZW4gYmluYXJ5IHR5cGUgYW5kIGl0cyBjaGlsZHJlbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXBTb3VyY2UoSVR5cGUgdHlwZSwgY2hhcltdIGNvbnRlbnRzKSB7CisJCXRoaXMubWFwU291cmNlKHR5cGUsIGNvbnRlbnRzLCBudWxsKTsKKwl9CisJCisJLyoqCisJICogTWFwcyB0aGUgZ2l2ZW4gc291cmNlIGNvZGUgdG8gdGhlIGdpdmVuIGJpbmFyeSB0eXBlIGFuZCBpdHMgY2hpbGRyZW4uCisJICogSWYgYSBub24tbnVsbCBqYXZhIGVsZW1lbnQgaXMgcGFzc2VkLCBmaW5kcyB0aGUgbmFtZSByYW5nZSBmb3IgdGhlIAorCSAqIGdpdmVuIGphdmEgZWxlbWVudCB3aXRob3V0IHN0b3JpbmcgaXQuCisJICovCisJcHVibGljIElTb3VyY2VSYW5nZSBtYXBTb3VyY2UoCisJCUlUeXBlIHR5cGUsCisJCWNoYXJbXSBjb250ZW50cywKKwkJSUphdmFFbGVtZW50IHNlYXJjaGVkRWxlbWVudCkgeworCQkJCisJCWZUeXBlID0gKEJpbmFyeVR5cGUpIHR5cGU7CisJCQorCQkvLyBjaGVjayB3aGV0aGVyIGl0IGlzIGFscmVhZHkgbWFwcGVkCisJCWlmICh0aGlzLmZTb3VyY2VSYW5nZXMuZ2V0KHR5cGUpICE9IG51bGwpIHJldHVybiAoc2VhcmNoZWRFbGVtZW50ICE9IG51bGwpID8gdGhpcy5nZXROYW1lUmFuZ2Uoc2VhcmNoZWRFbGVtZW50KSA6IG51bGw7CisJCQorCQl0aGlzLmltcG9ydHNUYWJsZS5yZW1vdmUoZlR5cGUpOworCQl0aGlzLmltcG9ydHNDb3VudGVyVGFibGUucmVtb3ZlKGZUeXBlKTsKKwkJdGhpcy5zZWFyY2hlZEVsZW1lbnQgPSBzZWFyY2hlZEVsZW1lbnQ7CisJCXRoaXMudHlwZXMgPSBuZXcgSVR5cGVbMV07CisJCXRoaXMudHlwZURlY2xhcmF0aW9uU3RhcnRzID0gbmV3IGludFsxXTsKKwkJdGhpcy50eXBlTmFtZVJhbmdlcyA9IG5ldyBTb3VyY2VSYW5nZVsxXTsKKwkJdGhpcy50eXBlRGVwdGggPSAtMTsKKwkJdGhpcy5mTWVtYmVyRGVjbGFyYXRpb25TdGFydCA9IG5ldyBpbnRbMV07CisJCXRoaXMuZk1lbWJlck5hbWUgPSBuZXcgU3RyaW5nWzFdOworCQl0aGlzLmZNZW1iZXJOYW1lUmFuZ2UgPSBuZXcgU291cmNlUmFuZ2VbMV07CisJCXRoaXMuZk1ldGhvZFBhcmFtZXRlclR5cGVzID0gbmV3IGNoYXJbMV1bXVtdOworCQl0aGlzLmZNZXRob2RQYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyWzFdW11bXTsKKwkJdGhpcy5hbm9ueW1vdXNDb3VudGVyID0gMDsKKwkJCisJCUhhc2hNYXAgb2xkU291cmNlUmFuZ2VzID0gKEhhc2hNYXApIGZTb3VyY2VSYW5nZXMuY2xvbmUoKTsKKwkJdHJ5IHsKKwkJCUlQcm9ibGVtRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpOworCQkJU291cmNlRWxlbWVudFBhcnNlciBwYXJzZXIgPSBudWxsOworCQkJYm9vbGVhbiBpc0Fub255bW91c0NsYXNzID0gZmFsc2U7CisJCQljaGFyW10gZnVsbE5hbWUgPSBudWxsOworCQkJdGhpcy5hbm9ueW1vdXNDbGFzc05hbWUgPSAwOworCQkJdHJ5IHsKKwkJCQlJQmluYXJ5VHlwZSBiaW5UeXBlID0gKElCaW5hcnlUeXBlKSBmVHlwZS5nZXRSYXdJbmZvKCk7CisJCQkJaXNBbm9ueW1vdXNDbGFzcyA9IGJpblR5cGUuaXNBbm9ueW1vdXMoKTsKKwkJCQlmdWxsTmFtZSA9IGJpblR5cGUuZ2V0TmFtZSgpOworCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQkJaWYgKGlzQW5vbnltb3VzQ2xhc3MpIHsKKwkJCQlTdHJpbmcgZWx0TmFtZSA9IGZUeXBlLmdldEVsZW1lbnROYW1lKCk7CisJCQkJZWx0TmFtZSA9IGVsdE5hbWUuc3Vic3RyaW5nKGVsdE5hbWUubGFzdEluZGV4T2YoJyQnKSArIDEsIGVsdE5hbWUubGVuZ3RoKCkpOworCQkJCXRyeSB7CisJCQkJCXRoaXMuYW5vbnltb3VzQ2xhc3NOYW1lID0gSW50ZWdlci5wYXJzZUludChlbHROYW1lKTsKKwkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQkJYm9vbGVhbiBkb0Z1bGxQYXJzZSA9IGhhc1RvUmV0cmlldmVTb3VyY2VSYW5nZXNGb3JMb2NhbENsYXNzKGZ1bGxOYW1lKTsKKwkJCXBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHRoaXMsIGZhY3RvcnksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSwgZG9GdWxsUGFyc2UpOworCQkJcGFyc2VyLnBhcnNlQ29tcGlsYXRpb25Vbml0KAorCQkJCW5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdChjb250ZW50cywgbnVsbCwgdHlwZS5nZXRFbGVtZW50TmFtZSgpICsgIi5qYXZhIiwgZW5jb2RpbmcpLCAvLyROT04tTkxTLTEkCisJCQkJZG9GdWxsUGFyc2UpOworCQkJaWYgKHNlYXJjaGVkRWxlbWVudCAhPSBudWxsKSB7CisJCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gdGhpcy5nZXROYW1lUmFuZ2Uoc2VhcmNoZWRFbGVtZW50KTsKKwkJCQlyZXR1cm4gcmFuZ2U7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKHNlYXJjaGVkRWxlbWVudCAhPSBudWxsKSB7CisJCQkJZlNvdXJjZVJhbmdlcyA9IG9sZFNvdXJjZVJhbmdlczsKKwkJCX0KKwkJCWZUeXBlID0gbnVsbDsKKwkJCXRoaXMuc2VhcmNoZWRFbGVtZW50ID0gbnVsbDsKKwkJCXRoaXMudHlwZXMgPSBudWxsOworCQkJdGhpcy50eXBlRGVjbGFyYXRpb25TdGFydHMgPSBudWxsOworCQkJdGhpcy50eXBlTmFtZVJhbmdlcyA9IG51bGw7CisJCQl0aGlzLnR5cGVEZXB0aCA9IC0xOworCQl9CisJfQorCQorCS8qKiAKKwkgKiBTZXRzIHRoZSBtYXBwaW5nIGZvciB0aGlzIG1ldGhvZCB0byBpdHMgcGFyYW1ldGVyIG5hbWVzLgorCSAqCisJICogQHNlZSBmUGFyYW1ldGVyTmFtZXMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNZXRob2RQYXJhbWV0ZXJOYW1lcygKKwkJSU1ldGhvZCBtZXRob2QsCisJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzKSB7CisJCWlmIChwYXJhbWV0ZXJOYW1lcyA9PSBudWxsKSB7CisJCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyWzBdW107CisJCX0KKwkJZlBhcmFtZXRlck5hbWVzLnB1dChtZXRob2QsIHBhcmFtZXRlck5hbWVzKTsKKwl9CisJCisJLyoqIAorCSAqIFNldHMgdGhlIG1hcHBpbmcgZm9yIHRoaXMgZWxlbWVudCB0byBpdHMgc291cmNlIHJhbmdlcyBmb3IgaXRzIHNvdXJjZSByYW5nZQorCSAqIGFuZCBuYW1lIHJhbmdlLgorCSAqCisJICogQHNlZSBmU291cmNlUmFuZ2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlUmFuZ2UoCisJCUlKYXZhRWxlbWVudCBlbGVtZW50LAorCQlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZSwKKwkJU291cmNlUmFuZ2UgbmFtZVJhbmdlKSB7CisJCWZTb3VyY2VSYW5nZXMucHV0KGVsZW1lbnQsIG5ldyBTb3VyY2VSYW5nZVtdIHsgc291cmNlUmFuZ2UsIG5hbWVSYW5nZSB9KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBjaGFyW11bXSBhcnJheSBjb250YWluaW5nIHRoZSBpbXBvcnRzIG9mIHRoZSBhdHRhY2hlZCBzb3VyY2UgZm9yIHRoZSBmVHlwZSBiaW5hcnkKKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gZ2V0SW1wb3J0cyhCaW5hcnlUeXBlIHR5cGUpIHsKKwkJY2hhcltdW10gaW1wb3J0cyA9IChjaGFyW11bXSkgdGhpcy5pbXBvcnRzVGFibGUuZ2V0KHR5cGUpOworCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7CisJCQlpbnQgaW1wb3J0c0NvdW50ZXIgPSAoKEludGVnZXIpIHRoaXMuaW1wb3J0c0NvdW50ZXJUYWJsZS5nZXQodHlwZSkpLmludFZhbHVlKCk7CisJCQlpZiAoaW1wb3J0cy5sZW5ndGggIT0gaW1wb3J0c0NvdW50ZXIpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlpbXBvcnRzLAorCQkJCQkwLAorCQkJCQkoaW1wb3J0cyA9IG5ldyBjaGFyW2ltcG9ydHNDb3VudGVyXVtdKSwKKwkJCQkJMCwKKwkJCQkJaW1wb3J0c0NvdW50ZXIpOworCQkJfQorCQkJdGhpcy5pbXBvcnRzVGFibGUucHV0KHR5cGUsIGltcG9ydHMpOworCQl9CisJCXJldHVybiBpbXBvcnRzOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaGFzVG9SZXRyaWV2ZVNvdXJjZVJhbmdlc0ZvckxvY2FsQ2xhc3MoY2hhcltdIGVsdE5hbWUpIHsKKwkJLyoKKwkJICogQSQxJEIkMiA6IHRydWUKKwkJICogQSRCJEIkMiA6IHRydWUKKwkJICogQSRDJEIkRCA6IGZhbHNlCisJCSAqIEEkRiRCJEQkMSRGIDogdHJ1ZQorCQkgKiBBJDEgOiB0cnVlCisJCSAqIEEkQiA6IGZhbHNlCisJCSAqLworCQlpZiAoZWx0TmFtZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWludCBpbmRleCA9IDA7CisJCWludCBkb2xsYXJJbmRleCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignJCcsIGVsdE5hbWUsIGluZGV4KTsKKwkJaWYgKGRvbGxhckluZGV4ICE9IC0xKSB7CisJCQlpbmRleCA9IGRvbGxhckluZGV4ICsgMTsKKwkJCWRvbGxhckluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgZWx0TmFtZSwgaW5kZXgpOworCQkJaWYgKGRvbGxhckluZGV4ID09IC0xKSB7IAorCQkJCWRvbGxhckluZGV4ID0gZWx0TmFtZS5sZW5ndGg7CisJCQl9CisJCQl3aGlsZSAoZG9sbGFySW5kZXggIT0gLTEpIHsKKwkJCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCBkb2xsYXJJbmRleDsgaSsrKSB7CisJCQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoZWx0TmFtZVtpXSkpIHsKKwkJCQkJCWluZGV4ID0gZG9sbGFySW5kZXggKyAxOworCQkJCQkJaSA9IGRvbGxhckluZGV4OworCQkJCQkJaWYgKGluZGV4ID4gZWx0TmFtZS5sZW5ndGgpIHJldHVybiBmYWxzZTsKKwkJCQkJCWRvbGxhckluZGV4ID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCckJywgZWx0TmFtZSwgaW5kZXgpOworCQkJCQkJaWYgKGRvbGxhckluZGV4ID09IC0xKSB7IAorCQkJCQkJCWRvbGxhckluZGV4ID0gZWx0TmFtZS5sZW5ndGg7CisJCQkJCQl9CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDVhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CisKKy8qKgorICogQHNlZSBJTWV0aG9kCisgKi8KKworLyogcGFja2FnZSAqLyBjbGFzcyBTb3VyY2VNZXRob2QgZXh0ZW5kcyBNZW1iZXIgaW1wbGVtZW50cyBJTWV0aG9kIHsKKworCS8qKgorCSAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBzaWduYXR1cmVzIG9mIHRoZSBtZXRob2QgLSBzdG9yZWQgbG9jYWxseQorCSAqIHRvIHBlcmZvcm0gZXF1YWxpdHkgdGVzdC4gPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIG5vCisJICogcGFyYW1ldGVycy4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZlBhcmFtZXRlclR5cGVzOworCisJLyoqCisJICogQW4gZW1wdHkgbGlzdCBvZiBTdHJpbmdzCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0VtcHR5TGlzdD0gbmV3IFN0cmluZ1tdIHt9OworcHJvdGVjdGVkIFNvdXJjZU1ldGhvZChJVHlwZSBwYXJlbnQsIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcykgeworCXN1cGVyKE1FVEhPRCwgcGFyZW50LCBuYW1lKTsKKwlBc3NlcnQuaXNUcnVlKG5hbWUuaW5kZXhPZignLicpID09IC0xKTsKKwlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgeworCQlmUGFyYW1ldGVyVHlwZXM9IGZnRW1wdHlMaXN0OworCX0gZWxzZSB7CisJCWZQYXJhbWV0ZXJUeXBlcz0gcGFyYW1ldGVyVHlwZXM7CisJfQorfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJcmV0dXJuIHN1cGVyLmVxdWFscyhvKSAmJiBVdGlsLmVxdWFsQXJyYXlzT3JOdWxsKGZQYXJhbWV0ZXJUeXBlcywgKChTb3VyY2VNZXRob2QpbykuZlBhcmFtZXRlclR5cGVzKTsKK30KKy8qKgorICogQHNlZSBKYXZhRWxlbWVudCNlcXVhbHNET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJRE9NTm9kZS5NRVRIT0QpIHsKKwkJSURPTU1ldGhvZCBtID0gKElET01NZXRob2Qpbm9kZTsKKwkJaWYgKGlzQ29uc3RydWN0b3IoKSkgeworCQkJcmV0dXJuIAorCQkJCShtLmlzQ29uc3RydWN0b3IoKSB8fCBtLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXRFbGVtZW50TmFtZSgpKSAvKiBjYXNlIG9mIGEgY29uc3RydWN0b3IgdGhhdCBpcyBiZWluZyByZW5hbWVkICovKSAKKwkJCQkJJiYgc2lnbmF0dXJlRXF1YWxzKG0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmVxdWFsc0RPTU5vZGUobm9kZSkgJiYgc2lnbmF0dXJlRXF1YWxzKG0pOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQorLyoqCisgKiBAc2VlIElNZXRob2QKKyAqLworcHVibGljIFN0cmluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU291cmNlTWV0aG9kRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VNZXRob2RFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwljaGFyW11bXSBleHM9IGluZm8uZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCk7CisJcmV0dXJuIENvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5jb252ZXJ0VHlwZU5hbWVzVG9TaWdzKGV4cyk7Cit9CisvKioKKyAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlTWVtZW50bygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKChKYXZhRWxlbWVudCkgZ2V0UGFyZW50KCkpLmdldEhhbmRsZU1lbWVudG8oKSk7CisJYnVmZi5hcHBlbmQoZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpKTsKKwlidWZmLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGZQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQlidWZmLmFwcGVuZChnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkpOworCQlidWZmLmFwcGVuZChmUGFyYW1ldGVyVHlwZXNbaV0pOworCX0KKwlyZXR1cm4gYnVmZi50b1N0cmluZygpOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorICovCitwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkgeworCXJldHVybiBKYXZhRWxlbWVudC5KRU1fTUVUSE9EOworfQorLyoqCisgKiBAc2VlIElNZXRob2QKKyAqLworcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtZXRlcnMoKSB7CisJcmV0dXJuIGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsID8gMCA6IGZQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Cit9CisvKioKKyAqIEBzZWUgSU1ldGhvZAorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCWNoYXJbXVtdIG5hbWVzPSBpbmZvLmdldEFyZ3VtZW50TmFtZXMoKTsKKwlpZiAobmFtZXMgPT0gbnVsbCB8fCBuYW1lcy5sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gZmdFbXB0eUxpc3Q7CisJfQorCVN0cmluZ1tdIHN0cmluZ3M9IG5ldyBTdHJpbmdbbmFtZXMubGVuZ3RoXTsKKwlmb3IgKGludCBpPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJc3RyaW5nc1tpXT0gbmV3IFN0cmluZyhuYW1lc1tpXSk7CisJfQorCXJldHVybiBzdHJpbmdzOworfQorLyoqCisgKiBAc2VlIElNZXRob2QKKyAqLworcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7Cit9CisvKioKKyAqIEBzZWUgSU1ldGhvZAorICovCitwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCXJldHVybiBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShpbmZvLmdldFJldHVyblR5cGVOYW1lKCksIGZhbHNlKTsKK30KKy8qKgorICogQHNlZSBJTWV0aG9kCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU291cmNlTWV0aG9kRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VNZXRob2RFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwlyZXR1cm4gaW5mby5nZXRTaWduYXR1cmUoKTsKK30KKy8qKgorICogQHNlZSBJTWV0aG9kCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTb3VyY2VNZXRob2RFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZU1ldGhvZEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCXJldHVybiBpbmZvLmlzQ29uc3RydWN0b3IoKTsKK30KKy8qKgorICogQHNlZSBJTWV0aG9kI2lzTWFpbk1ldGhvZCgpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzTWFpbk1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiB0aGlzLmlzTWFpbk1ldGhvZCh0aGlzKTsKK30KKworLyoqCisgKiBAc2VlIElNZXRob2QjaXNTaW1pbGFyKElNZXRob2QpCisgKi8KK3B1YmxpYyBib29sZWFuIGlzU2ltaWxhcihJTWV0aG9kIG1ldGhvZCkgeworCXJldHVybiAKKwkJdGhpcy5hcmVTaW1pbGFyTWV0aG9kcygKKwkJCXRoaXMuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5nZXRQYXJhbWV0ZXJUeXBlcygpLAorCQkJbWV0aG9kLmdldEVsZW1lbnROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLAorCQkJbnVsbCk7Cit9CisKKy8qKgorICovCitwdWJsaWMgU3RyaW5nIHJlYWRhYmxlTmFtZSgpIHsKKworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnJlYWRhYmxlTmFtZSgpKTsKKwlidWZmZXIuYXBwZW5kKCcoJyk7CisJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSB0aGlzLmdldFBhcmFtZXRlclR5cGVzKCk7CisJaW50IGxlbmd0aDsKKwlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCAmJiAobGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSA+IDApIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pKTsKKwkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKCcpJyk7CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaWduYXR1cmUgb2YgdGhpcyA8Y29kZT5Tb3VyY2VNZXRob2Q8L2NvZGU+IG1hdGNoZXMgdGhhdCBvZiB0aGUgZ2l2ZW4KKyAqIDxjb2RlPklET01NZXRob2Q8L2NvZGU+LCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LiAKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gc2lnbmF0dXJlRXF1YWxzKElET01NZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTdHJpbmdbXSBvdGhlclR5cGVzPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwlTdHJpbmdbXSB0eXBlcz0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwlib29sZWFuIG9rPSB0cnVlOworCisJLy8gZW5zdXJlIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBtYXRjaAorCWlmIChvdGhlclR5cGVzID09IG51bGwgfHwgb3RoZXJUeXBlcy5sZW5ndGggPT0gMCkgeworCQlvaz0gKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApOworCX0gZWxzZSBpZiAodHlwZXMgIT0gbnVsbCkgeworCQlvaz0gKG90aGVyVHlwZXMubGVuZ3RoID09IHR5cGVzLmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIGVuc3VyZSB0aGUgcGFyYW1ldGVyIHR5cGUgc2lnbmF0dXJlcyBtYXRjaAorCWlmIChvaykgeworCQlpZiAodHlwZXMgIT0gbnVsbCkgeworCQkJaW50IGk7CisJCQlmb3IgKGk9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBvdGhlclR5cGU9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKG90aGVyVHlwZXNbaV0udG9DaGFyQXJyYXkoKSwgZmFsc2UpOworCQkJCWlmICghdHlwZXNbaV0uZXF1YWxzKG90aGVyVHlwZSkpIHsKKwkJCQkJb2s9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gb2s7Cit9CisvKioKKyAqIEBwcml2YXRlIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWlmIChpbmZvID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSBpZiAoaW5mbyA9PSBOT19JTkZPKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7CisJfSBlbHNlIHsKKwkJdHJ5IHsKKwkJCWlmIChGbGFncy5pc1N0YXRpYyh0aGlzLmdldEZsYWdzKCkpKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljICIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoIXRoaXMuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcodGhpcy5nZXRSZXR1cm5UeXBlKCkpKTsKKwkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQlidWZmZXIuYXBwZW5kKCcoJyk7CisJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHRoaXMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKwkJCWludCBsZW5ndGg7CisJCQlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCAmJiAobGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSA+IDApIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVzW2ldKSk7CisJCQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgnKScpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJYnVmZmVyLmFwcGVuZCgiPEphdmFNb2RlbEV4Y2VwdGlvbiBpbiB0b1N0cmluZyBvZiAiICsgZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZEVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RFbGVtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjNmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RFbGVtZW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2Q7CisKKy8qKiAKKyAqIEVsZW1lbnQgaW5mbyBmb3IgSU1ldGhvZCBlbGVtZW50cy4gCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgU291cmNlTWV0aG9kRWxlbWVudEluZm8gZXh0ZW5kcyBNZW1iZXJFbGVtZW50SW5mbyBpbXBsZW1lbnRzIElTb3VyY2VNZXRob2QgeworCisJLyoqCisJICogRm9yIGEgc291cmNlIG1ldGhvZCAoaS5lLiBtZXRob2QgY29udGFpbmVkIGluIGEgY29taWxhdGlvbiB1bml0KQorCSAqIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXRob2QsCisJICogaW4gdGhlIG9yZGVyIHRoZSBwYXJhbWV0ZXJzIGFyZSBkZWxjYXJlZC4gRm9yIGEgYmluYXJ5IG1ldGhvZCAoaS5lLgorCSAqIG1ldGhvZCBkZWNsYXJlZCBpbiBhIGJpbmFyeSB0eXBlKSwgdGhlc2UgbmFtZXMgYXJlIGludmVudGVkIGFzCisJICogImFyZyJpIHdoZXJlIGkgc3RhcnRzIGF0IDEuIFRoaXMgaXMgYW4gZW1wdHkgYXJyYXkgaWYgdGhpcyBtZXRob2QKKwkgKiBoYXMgbm8gcGFyYW1ldGVycy4KKwkgKi8KKwlwcm90ZWN0ZWQgY2hhcltdW10gYXJndW1lbnROYW1lczsKKworCS8qKgorCSAqIENvbGxlY3Rpb24gb2YgdHlwZSBuYW1lcyBmb3IgdGhlIGFyZ3VtZW50cyBpbiB0aGlzCisJICogbWV0aG9kLCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuIFRoaXMgaXMgYW4gZW1wdHkKKwkgKiBhcnJheSBmb3IgYSBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMuIEEgbmFtZSBpcyBhIHNpbXBsZQorCSAqIG5hbWUgb3IgYSBxdWFsaWZpZWQsIGRvdCBzZXBhcmF0ZWQgbmFtZS4KKwkgKiBGb3IgZXhhbXBsZSwgSGFzaHRhYmxlIG9yIGphdmEudXRpbC5IYXNodGFibGUuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzOworCisJLyoqCisJICogUmV0dXJuIHR5cGUgbmFtZSBmb3IgdGhpcyBtZXRob2QuIFRoZSByZXR1cm4gdHlwZSBvZgorCSAqIGNvbnN0cnVjdG9ycyBpcyBlcXVpdmFsZW50IHRvIHZvaWQuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSByZXR1cm5UeXBlOworCisJLyoqCisJICogQSBjb2xsZWN0aW9uIG9mIHR5cGUgbmFtZXMgb2YgdGhlIGV4Y2VwdGlvbnMgdGhpcworCSAqIG1ldGhvZCB0aHJvd3MsIG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgdGhpcyBtZXRob2QKKwkgKiBkb2VzIG5vdCBkZWNsYXJlIHRvIHRocm93IGFueSBleGNlcHRpb25zLiBBIG5hbWUgaXMgYSBzaW1wbGUKKwkgKiBuYW1lIG9yIGEgcXVhbGlmaWVkLCBkb3Qgc2VwYXJhdGVkIG5hbWUuCisJICogRm9yIGV4YW1wbGUsIEhhc2h0YWJsZSBvciBqYXZhLnV0aWwuSGFzaHRhYmxlLgorCSAqLworCXByb3RlY3RlZCBjaGFyW11bXSBleGNlcHRpb25UeXBlczsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZsYWcuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25zdHJ1Y3Rvcj0gZmFsc2U7CitwdWJsaWMgY2hhcltdW10gZ2V0QXJndW1lbnROYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5hcmd1bWVudE5hbWVzOworfQorcHVibGljIGNoYXJbXVtdIGdldEFyZ3VtZW50VHlwZU5hbWVzKCkgeworCXJldHVybiB0aGlzLmFyZ3VtZW50VHlwZU5hbWVzOworfQorcHVibGljIGNoYXJbXVtdIGdldEV4Y2VwdGlvblR5cGVOYW1lcygpIHsKKwlyZXR1cm4gdGhpcy5leGNlcHRpb25UeXBlczsKK30KK3B1YmxpYyBjaGFyW10gZ2V0UmV0dXJuVHlwZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMucmV0dXJuVHlwZTsKK30KK3B1YmxpYyBjaGFyW10gZ2V0U2VsZWN0b3IoKSB7CisJcmV0dXJuIHRoaXMubmFtZTsKK30KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgeworCisJU3RyaW5nW10gcGFyYW1TaWduYXR1cmVzID0gbmV3IFN0cmluZ1t0aGlzLmFyZ3VtZW50VHlwZU5hbWVzLmxlbmd0aF07CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmFyZ3VtZW50VHlwZU5hbWVzLmxlbmd0aDsgKytpKSB7CisJCXBhcmFtU2lnbmF0dXJlc1tpXSA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKHRoaXMuYXJndW1lbnRUeXBlTmFtZXNbaV0sIGZhbHNlKTsKKwl9CisJcmV0dXJuIFNpZ25hdHVyZS5jcmVhdGVNZXRob2RTaWduYXR1cmUocGFyYW1TaWduYXR1cmVzLCBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0aGlzLnJldHVyblR5cGUsIGZhbHNlKSk7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCXJldHVybiB0aGlzLmlzQ29uc3RydWN0b3I7Cit9Citwcm90ZWN0ZWQgdm9pZCBzZXRBcmd1bWVudE5hbWVzKGNoYXJbXVtdIG5hbWVzKSB7CisJdGhpcy5hcmd1bWVudE5hbWVzID0gbmFtZXM7Cit9Citwcm90ZWN0ZWQgdm9pZCBzZXRBcmd1bWVudFR5cGVOYW1lcyhjaGFyW11bXSB0eXBlcykgeworCXRoaXMuYXJndW1lbnRUeXBlTmFtZXMgPSB0eXBlczsKK30KK3Byb3RlY3RlZCB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCXRoaXMuaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3I7Cit9Citwcm90ZWN0ZWQgdm9pZCBzZXRFeGNlcHRpb25UeXBlTmFtZXMoY2hhcltdW10gdHlwZXMpIHsKKwl0aGlzLmV4Y2VwdGlvblR5cGVzID0gdHlwZXM7Cit9Citwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5UeXBlKGNoYXJbXSB0eXBlKSB7CisJdGhpcy5yZXR1cm5UeXBlID0gdHlwZTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWIwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworCisvKioKKyAqIEBzZWUgSVNvdXJjZVJhbmdlCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgU291cmNlUmFuZ2UgaW1wbGVtZW50cyBJU291cmNlUmFuZ2UgeworCitwcm90ZWN0ZWQgaW50IG9mZnNldCwgbGVuZ3RoOworCitwcm90ZWN0ZWQgU291cmNlUmFuZ2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OworCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VSYW5nZQorICovCitwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwlyZXR1cm4gdGhpcy5sZW5ndGg7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVJhbmdlCisgKi8KK3B1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworCXJldHVybiB0aGlzLm9mZnNldDsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCJbb2Zmc2V0PSIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0aGlzLm9mZnNldCk7CisJYnVmZmVyLmFwcGVuZCgiLCBsZW5ndGg9Iik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMubGVuZ3RoKTsKKwlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmMTYyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIEphdmEgZWxlbWVudHMgd2hpY2ggaW1wbGVtZW50IElTb3VyY2VSZWZlcmVuY2UuCisgKi8KKy8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgY2xhc3MgU291cmNlUmVmRWxlbWVudCBleHRlbmRzIEphdmFFbGVtZW50IGltcGxlbWVudHMgSVNvdXJjZVJlZmVyZW5jZSB7Citwcm90ZWN0ZWQgU291cmNlUmVmRWxlbWVudChpbnQgdHlwZSwgSUphdmFFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKwlzdXBlcih0eXBlLCBwYXJlbnQsIG5hbWUpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VNYW5pcHVsYXRpb24KKyAqLworcHVibGljIHZvaWQgY29weShJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoY29udGFpbmVyID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5udWxsQ29udGFpbmVyIikpOyAvLyROT04tTkxTLTEkCisJfQorCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OworCUlKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7Y29udGFpbmVyfTsKKwlJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncz0gbnVsbDsKKwlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCXNpYmxpbmdzPSBuZXcgSUphdmFFbGVtZW50W10ge3NpYmxpbmd9OworCX0KKwlTdHJpbmdbXSByZW5hbWluZ3M9IG51bGw7CisJaWYgKHJlbmFtZSAhPSBudWxsKSB7CisJCXJlbmFtaW5ncz0gbmV3IFN0cmluZ1tdIHtyZW5hbWV9OworCX0KKwlnZXRKYXZhTW9kZWwoKS5jb3B5KGVsZW1lbnRzLCBjb250YWluZXJzLCBzaWJsaW5ncywgcmVuYW1pbmdzLCBmb3JjZSwgbW9uaXRvcik7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCBkZWxldGUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJZ2V0SmF2YU1vZGVsKCkuZGVsZXRlKGVsZW1lbnRzLCBmb3JjZSwgbW9uaXRvcik7Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJcmV0dXJuICgoSmF2YUVsZW1lbnQpZ2V0UGFyZW50KCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOworfQorLyoqCisgKiBFbGVtZW50cyB3aXRoaW4gY29tcGlsYXRpb24gdW5pdHMgYW5kIGNsYXNzIGZpbGVzIGhhdmUgbm8KKyAqIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCisgKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogUmV0dXJuIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBJT3BlbmFibGUgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGlzCisgKiB0eXBlIChnb2luZyB1cCB0aGUgaGllcmFyY2h5IGZyb20gdGhpcyB0eXBlKTsKKyAqLworcHVibGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZVBhcmVudCgpIHsKKwlJSmF2YUVsZW1lbnQgY3VycmVudCA9IGdldFBhcmVudCgpOworCXdoaWxlIChjdXJyZW50ICE9IG51bGwpeworCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIElPcGVuYWJsZSl7CisJCQlyZXR1cm4gKElPcGVuYWJsZSkgY3VycmVudDsKKwkJfQorCQljdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKTsKKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpOworfQorLyoKKyAqIEBzZWUgSUphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKK30KKy8qKgorICogQHNlZSBJU291cmNlUmVmZXJlbmNlCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSU9wZW5hYmxlIG9wZW5hYmxlID0gZ2V0T3BlbmFibGVQYXJlbnQoKTsKKwlJQnVmZmVyIGJ1ZmZlciA9IG9wZW5hYmxlLmdldEJ1ZmZlcigpOworCWlmIChidWZmZXIgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJSVNvdXJjZVJhbmdlIHJhbmdlID0gZ2V0U291cmNlUmFuZ2UoKTsKKwlpbnQgb2Zmc2V0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7CisJaW50IGxlbmd0aCA9IHJhbmdlLmdldExlbmd0aCgpOworCWlmIChvZmZzZXQgPT0gLTEgfHwgbGVuZ3RoID09IDAgKSB7CisJCXJldHVybiBudWxsOworCX0KKwlyZXR1cm4gYnVmZmVyLmdldFRleHQob2Zmc2V0LCBsZW5ndGgpOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VSZWZlcmVuY2UKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlUmVmRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJcmV0dXJuIGluZm8uZ2V0U291cmNlUmFuZ2UoKTsKK30KKy8qKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZU1hbmlwdWxhdGlvbgorICovCitwdWJsaWMgdm9pZCBtb3ZlKElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChjb250YWluZXIgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgib3BlcmF0aW9uLm51bGxDb250YWluZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpc307CisJSUphdmFFbGVtZW50W10gY29udGFpbmVycz0gbmV3IElKYXZhRWxlbWVudFtdIHtjb250YWluZXJ9OworCUlKYXZhRWxlbWVudFtdIHNpYmxpbmdzPSBudWxsOworCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJc2libGluZ3M9IG5ldyBJSmF2YUVsZW1lbnRbXSB7c2libGluZ307CisJfQorCVN0cmluZ1tdIHJlbmFtaW5ncz0gbnVsbDsKKwlpZiAocmVuYW1lICE9IG51bGwpIHsKKwkJcmVuYW1pbmdzPSBuZXcgU3RyaW5nW10ge3JlbmFtZX07CisJfQorCWdldEphdmFNb2RlbCgpLm1vdmUoZWxlbWVudHMsIGNvbnRhaW5lcnMsIHNpYmxpbmdzLCByZW5hbWluZ3MsIGZvcmNlLCBtb25pdG9yKTsKK30KKy8qKgorICogQ2hhbmdlcyB0aGUgc291cmNlIGVuZCBpbmRleCBvZiB0aGlzIGVsZW1lbnQsIGFsbCBjaGlsZHJlbiAoZm9sbG93aW5nCisgKiA8Y29kZT5jaGlsZDwvY29kZT4pLCBhbmQgYWxsIGZvbGxvd2luZyBlbGVtZW50cy4KKyAqLworcHVibGljIHZvaWQgb2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oaW50IGFtb3VudCwgSUphdmFFbGVtZW50IGNoaWxkKSB7CisJdHJ5IHsKKwkJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VSZWZFbGVtZW50SW5mbykgZ2V0UmF3SW5mbygpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSArIGFtb3VudCk7CisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKKwkJYm9vbGVhbiBhZnRlckNoaWxkID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCWlmIChhZnRlckNoaWxkKSB7CisJCQkJKChKYXZhRWxlbWVudCkgYUNoaWxkKS5vZmZzZXRTb3VyY2VSYW5nZShhbW91bnQpOworCQkJfSBlbHNlIHsKKwkJCQlhZnRlckNoaWxkID0gYUNoaWxkLmVxdWFscyhjaGlsZCk7CisJCQl9CisJCX0KKwkJKChKYXZhRWxlbWVudCkgZ2V0UGFyZW50KCkpLm9mZnNldFNvdXJjZUVuZEFuZENoaWxkcmVuKGFtb3VudCwgdGhpcyk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQlyZXR1cm47CisJfQorfQorLyoqCisgKiBDaGFuZ2VzIHRoZSBzb3VyY2UgaW5kZXhlcyBvZiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBjaGlsZHJlbiBlbGVtZW50cy4KKyAqLworcHVibGljIHZvaWQgb2Zmc2V0U291cmNlUmFuZ2UoaW50IGFtb3VudCkgeworCXRyeSB7CisJCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlUmVmRWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKKwkJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpICsgYW1vdW50KTsKKwkJaW5mby5zZXRTb3VyY2VSYW5nZUVuZChpbmZvLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgKyBhbW91bnQpOworCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCSgoSmF2YUVsZW1lbnQpIGFDaGlsZCkub2Zmc2V0U291cmNlUmFuZ2UoYW1vdW50KTsKKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KKy8qKgorICogQHNlZSBJU291cmNlTWFuaXB1bGF0aW9uCisgKi8KK3B1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50Lm51bGxOYW1lIikpOyAvLyROT04tTkxTLTEkCisJfQorCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXN9OworCUlKYXZhRWxlbWVudFtdIGRlc3RzPSBuZXcgSUphdmFFbGVtZW50W10ge3RoaXMuZ2V0UGFyZW50KCl9OworCVN0cmluZ1tdIHJlbmFtaW5ncz0gbmV3IFN0cmluZ1tdIHtuYW1lfTsKKwlnZXRKYXZhTW9kZWwoKS5yZW5hbWUoZWxlbWVudHMsIGRlc3RzLCByZW5hbWluZ3MsIGZvcmNlLCBtb25pdG9yKTsKK30KKy8qCisgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCByb290ZWRBdChJSmF2YVByb2plY3QgcHJvamVjdCkgeworCS8vIG5vdCBuZWVkZWQKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogVXBkYXRlcyB0aGUgZW5kIHNvdXJjZSBpbmRleCBmb3IgdGhpcyBlbGVtZW50LCBhbmQgYWxsIGZvbGxvd2luZyBlbGVtZW50cy4KKyAqLworcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZUVuZE9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgeworCXRyeSB7CisJCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlUmVmRWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKKwkJaW5mby5zZXRTb3VyY2VSYW5nZUVuZChpbmZvLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgKyBhbW91bnQpOworCQkoKEphdmFFbGVtZW50KSBnZXRQYXJlbnQoKSkub2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oYW1vdW50LCB0aGlzKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybjsKKwl9Cit9CisvKioKKyAqIFVwZGF0ZXMgdGhlIHNvdXJjZSBpbmRleGVzIG9mIHRoaXMgZWxlbWVudCBhbmQgYWxsIGZvbGxvd2luZyBlbGVtZW50cy4KKyAqLworcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZVJhbmdlT2Zmc2V0KGludCBhbW91bnQsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kKSB7CisJdHJ5IHsKKwkJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VSZWZFbGVtZW50SW5mbykgZ2V0UmF3SW5mbygpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlU3RhcnQoaW5mby5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkgKyBhbW91bnQpOworCQlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSArIGFtb3VudCk7CisJCSgoSmF2YUVsZW1lbnQpIGdldFBhcmVudCgpKS5vZmZzZXRTb3VyY2VFbmRBbmRDaGlsZHJlbihhbW91bnQsIHRoaXMpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Njg5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOworCisvKiogCisgKiBFbGVtZW50IGluZm8gZm9yIElTb3VyY2VSZWZlcmVuY2UgZWxlbWVudHMuIAorICovCisvKiBwYWNrYWdlICovIGNsYXNzIFNvdXJjZVJlZkVsZW1lbnRJbmZvIGV4dGVuZHMgSmF2YUVsZW1lbnRJbmZvIHsKKwlwcm90ZWN0ZWQgaW50IGZTb3VyY2VSYW5nZVN0YXJ0LCBmU291cmNlUmFuZ2VFbmQ7Citwcm90ZWN0ZWQgU291cmNlUmVmRWxlbWVudEluZm8oKSB7CisJc2V0SXNTdHJ1Y3R1cmVLbm93bih0cnVlKTsKK30KKy8qKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VUeXBlI2dldERlY2xhcmF0aW9uU291cmNlRW5kKCkKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldERlY2xhcmF0aW9uU291cmNlRW5kKCkKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQjZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKQorICovCitwdWJsaWMgaW50IGdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgeworCXJldHVybiBmU291cmNlUmFuZ2VFbmQ7Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZSNnZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kI2dldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKQorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZCNnZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkKKyAqLworcHVibGljIGludCBnZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkgeworCXJldHVybiBmU291cmNlUmFuZ2VTdGFydDsKK30KK3Byb3RlY3RlZCBJU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSB7CisJcmV0dXJuIG5ldyBTb3VyY2VSYW5nZShmU291cmNlUmFuZ2VTdGFydCwgZlNvdXJjZVJhbmdlRW5kIC0gZlNvdXJjZVJhbmdlU3RhcnQgKyAxKTsKK30KK3Byb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlRW5kKGludCBlbmQpIHsKKwlmU291cmNlUmFuZ2VFbmQgPSBlbmQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VSYW5nZVN0YXJ0KGludCBzdGFydCkgeworCWZTb3VyY2VSYW5nZVN0YXJ0ID0gc3RhcnQ7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiZjBlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YQpAQCAtMCwwICsxLDQ1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LkNvbXBsZXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlbGVjdGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5TZWxlY3Rpb25FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqIEhhbmRsZSBmb3IgYSBzb3VyY2UgdHlwZS4gSW5mbyBvYmplY3QgaXMgYSBTb3VyY2VUeXBlRWxlbWVudEluZm8uCisgKgorICogTm90ZTogUGFyZW50IGlzIGVpdGhlciBhbiBJQ2xhc3NGaWxlLCBhbiBJQ29tcGlsYXRpb25Vbml0IG9yIGFuIElUeXBlLgorICoKKyAqIEBzZWUgSVR5cGUKKyAqLworCitwdWJsaWMgY2xhc3MgU291cmNlVHlwZSBleHRlbmRzIE1lbWJlciBpbXBsZW1lbnRzIElUeXBlIHsKKwkvKioKKwkgKiBBbiBlbXB0eSBsaXN0IG9mIFN0cmluZ3MKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZnRW1wdHlMaXN0PSBuZXcgU3RyaW5nW10ge307Citwcm90ZWN0ZWQgU291cmNlVHlwZShJSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKFRZUEUsIHBhcmVudCwgbmFtZSk7CisJQXNzZXJ0LmlzVHJ1ZShuYW1lLmluZGV4T2YoJy4nKSA9PSAtMSk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKGNoYXJbXSBzbmlwcGV0LGludCBpbnNlcnRpb24saW50IHBvc2l0aW9uLGNoYXJbXVtdIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsYm9vbGVhbiBpc1N0YXRpYyxJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29kZUFzc2lzdC5udWxsUmVxdWVzdG9yIikpOyAvLyROT04tTkxTLTEkCisJfQorCQorCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IChTZWFyY2hhYmxlRW52aXJvbm1lbnQpICgoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCkpLmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsKKwlOYW1lTG9va3VwIG5hbWVMb29rdXAgPSAoKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpKS5nZXROYW1lTG9va3VwKCk7CisJQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvcixuYW1lTG9va3VwKSwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwkKKwlTdHJpbmcgc291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0U291cmNlKCk7CisJaWYgKHNvdXJjZSAhPSBudWxsICYmIGluc2VydGlvbiA+IC0xICYmIGluc2VydGlvbiA8IHNvdXJjZS5sZW5ndGgoKSkgeworCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCQorCQljaGFyW10gcHJlZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc291cmNlLnN1YnN0cmluZygwLCBpbnNlcnRpb24pLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW117J3snfSk7CisJCWNoYXJbXSBzdWZmaXggPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuZXcgY2hhcltdeyd9J30sIHNvdXJjZS5zdWJzdHJpbmcoaW5zZXJ0aW9uKS50b0NoYXJBcnJheSgpKTsKKwkJY2hhcltdIGZha2VTb3VyY2UgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXgsIHNuaXBwZXQsIHN1ZmZpeCk7CisJCQorCQlCYXNpY0NvbXBpbGF0aW9uVW5pdCBjdSA9IAorCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAorCQkJCWZha2VTb3VyY2UsIAorCQkJCW51bGwsCisJCQkJZ2V0RWxlbWVudE5hbWUoKSwKKwkJCQllbmNvZGluZyk7IAorCisJCWVuZ2luZS5jb21wbGV0ZShjdSwgcHJlZml4Lmxlbmd0aCArIHBvc2l0aW9uLCBwcmVmaXgubGVuZ3RoKTsKKwl9IGVsc2UgeworCQllbmdpbmUuY29tcGxldGUodGhpcywgc25pcHBldCwgcG9zaXRpb24sIGxvY2FsVmFyaWFibGVUeXBlTmFtZXMsIGxvY2FsVmFyaWFibGVOYW1lcywgbG9jYWxWYXJpYWJsZU1vZGlmaWVycywgaXNTdGF0aWMpOworCX0KK30KKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSUZpZWxkIGNyZWF0ZUZpZWxkKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQ3JlYXRlRmllbGRPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlRmllbGRPcGVyYXRpb24odGhpcywgY29udGVudHMsIGZvcmNlKTsKKwlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCW9wLmNyZWF0ZUJlZm9yZShzaWJsaW5nKTsKKwl9CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gKElGaWVsZCkgb3AuZ2V0UmVzdWx0RWxlbWVudHMoKVswXTsKK30KKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKFN0cmluZyBjb250ZW50cywgSUphdmFFbGVtZW50IHNpYmxpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24odGhpcywgY29udGVudHMpOworCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJb3AuY3JlYXRlQmVmb3JlKHNpYmxpbmcpOworCX0KKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworCXJldHVybiAoSUluaXRpYWxpemVyKSBvcC5nZXRSZXN1bHRFbGVtZW50cygpWzBdOworfQorLyoqCisgKiBAc2VlIElUeXBlCisgKi8KK3B1YmxpYyBJTWV0aG9kIGNyZWF0ZU1ldGhvZChTdHJpbmcgY29udGVudHMsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUNyZWF0ZU1ldGhvZE9wZXJhdGlvbiBvcCA9IG5ldyBDcmVhdGVNZXRob2RPcGVyYXRpb24odGhpcywgY29udGVudHMsIGZvcmNlKTsKKwlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCW9wLmNyZWF0ZUJlZm9yZShzaWJsaW5nKTsKKwl9CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gKElNZXRob2QpIG9wLmdldFJlc3VsdEVsZW1lbnRzKClbMF07Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoU3RyaW5nIGNvbnRlbnRzLCBJSmF2YUVsZW1lbnQgc2libGluZywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlDcmVhdGVUeXBlT3BlcmF0aW9uIG9wID0gbmV3IENyZWF0ZVR5cGVPcGVyYXRpb24odGhpcywgY29udGVudHMsIGZvcmNlKTsKKwlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCW9wLmNyZWF0ZUJlZm9yZShzaWJsaW5nKTsKKwl9CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gKElUeXBlKSBvcC5nZXRSZXN1bHRFbGVtZW50cygpWzBdOworfQorLyoqCisgKiBAc2VlIEphdmFFbGVtZW50I2VxdWFsc0RPTU5vZGUKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxzRE9NTm9kZShJRE9NTm9kZSBub2RlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJRE9NTm9kZS5UWVBFKSAmJiBzdXBlci5lcXVhbHNET01Ob2RlKG5vZGUpOworfQorLyoKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElNZXRob2RbXSBmaW5kTWV0aG9kcyhJTWV0aG9kIG1ldGhvZCkgeworCXRyeSB7CisJCXJldHVybiB0aGlzLmZpbmRNZXRob2RzKG1ldGhvZCwgdGhpcy5nZXRNZXRob2RzKCkpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCS8vIGlmIHR5cGUgZG9lc24ndCBleGlzdCwgbm8gbWF0Y2hpbmcgbWV0aG9kIGNhbiBleGlzdAorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIEBzZWUgSU1lbWJlcgorICovCitwdWJsaWMgSVR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKKwlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisJCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQkJcmV0dXJuIChJVHlwZSkgcGFyZW50OworCQl9IGVsc2UKKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0RmllbGQKKyAqLworcHVibGljIElGaWVsZCBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgU291cmNlRmllbGQodGhpcywgbmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElGaWVsZFtdIGdldEZpZWxkcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUFycmF5TGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW5PZlR5cGUoRklFTEQpOworCUlGaWVsZFtdIGFycmF5PSBuZXcgSUZpZWxkW2xpc3Quc2l6ZSgpXTsKKwlsaXN0LnRvQXJyYXkoYXJyYXkpOworCXJldHVybiBhcnJheTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUKKyAqLworcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7CisJcmV0dXJuIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIgZW5jbG9zaW5nVHlwZVNlcGFyYXRvcikgeworCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7CisJaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgeworCQlyZXR1cm4gZ2V0VHlwZVF1YWxpZmllZE5hbWUoZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7CisJfQorCXJldHVybiBwYWNrYWdlTmFtZSArICcuJyArIGdldFR5cGVRdWFsaWZpZWROYW1lKGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpOworfQorCisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElJbml0aWFsaXplciBnZXRJbml0aWFsaXplcihpbnQgb2NjdXJyZW5jZUNvdW50KSB7CisJcmV0dXJuIG5ldyBJbml0aWFsaXplcih0aGlzLCBvY2N1cnJlbmNlQ291bnQpOworfQorLyoqCisgKiBAc2VlIElUeXBlCisgKi8KK3B1YmxpYyBJSW5pdGlhbGl6ZXJbXSBnZXRJbml0aWFsaXplcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdCA9IGdldENoaWxkcmVuT2ZUeXBlKElOSVRJQUxJWkVSKTsKKwlJSW5pdGlhbGl6ZXJbXSBhcnJheT0gbmV3IElJbml0aWFsaXplcltsaXN0LnNpemUoKV07CisJbGlzdC50b0FycmF5KGFycmF5KTsKKwlyZXR1cm4gYXJyYXk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0TWV0aG9kCisgKi8KK3B1YmxpYyBJTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpIHsKKwlyZXR1cm4gbmV3IFNvdXJjZU1ldGhvZCh0aGlzLCBuYW1lLCBwYXJhbWV0ZXJUeXBlU2lnbmF0dXJlcyk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElNZXRob2RbXSBnZXRNZXRob2RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJQXJyYXlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbk9mVHlwZShNRVRIT0QpOworCUlNZXRob2RbXSBhcnJheT0gbmV3IElNZXRob2RbbGlzdC5zaXplKCldOworCWxpc3QudG9BcnJheShhcnJheSk7CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBAc2VlIElUeXBlCisgKi8KK3B1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKKwlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZlBhcmVudDsKKwl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKKwkJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7CisJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIHBhcmVudDsKKwkJfQorCQllbHNlIHsKKwkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwkJfQorCX0KKwlBc3NlcnQuaXNUcnVlKGZhbHNlKTsgIC8vIHNob3VsZCBub3QgaGFwcGVuCisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwljaGFyW10gc3VwZXJjbGFzc05hbWU9IGluZm8uZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwlpZiAoc3VwZXJjbGFzc05hbWUgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIG5ldyBTdHJpbmcoc3VwZXJjbGFzc05hbWUpOworfQorLyoqCisgKiBAc2VlIElUeXBlCisgKi8KK3B1YmxpYyBTdHJpbmdbXSBnZXRTdXBlckludGVyZmFjZU5hbWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU291cmNlVHlwZUVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOworCWNoYXJbXVtdIG5hbWVzPSBpbmZvLmdldEludGVyZmFjZU5hbWVzKCk7CisJaWYgKG5hbWVzID09IG51bGwpIHsKKwkJcmV0dXJuIGZnRW1wdHlMaXN0OworCX0KKwlTdHJpbmdbXSBzdHJpbmdzPSBuZXcgU3RyaW5nW25hbWVzLmxlbmd0aF07CisJZm9yIChpbnQgaT0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCXN0cmluZ3NbaV09IG5ldyBTdHJpbmcobmFtZXNbaV0pOworCX0KKwlyZXR1cm4gc3RyaW5nczsKK30KKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgbmFtZSkgeworCXJldHVybiBuZXcgU291cmNlVHlwZSh0aGlzLCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBJVHlwZSNnZXRUeXBlUXVhbGlmaWVkTmFtZQorICovCitwdWJsaWMgU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKCkgeworCXJldHVybiB0aGlzLmdldFR5cGVRdWFsaWZpZWROYW1lKCckJyk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjZ2V0VHlwZVF1YWxpZmllZE5hbWUoY2hhcikKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyIGVuY2xvc2luZ1R5cGVTZXBhcmF0b3IpIHsKKwlpZiAoZlBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7CisJCXJldHVybiBmTmFtZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKChJVHlwZSkgZlBhcmVudCkuZ2V0VHlwZVF1YWxpZmllZE5hbWUoZW5jbG9zaW5nVHlwZVNlcGFyYXRvcikgKyBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yICsgZk5hbWU7CisJfQorfQorCisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElUeXBlW10gZ2V0VHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlBcnJheUxpc3QgbGlzdD0gZ2V0Q2hpbGRyZW5PZlR5cGUoVFlQRSk7CisJSVR5cGVbXSBhcnJheT0gbmV3IElUeXBlW2xpc3Quc2l6ZSgpXTsKKwlsaXN0LnRvQXJyYXkoYXJyYXkpOworCXJldHVybiBhcnJheTsKK30KKy8qKgorICogQHNlZSBJUGFyZW50IAorICovCitwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBnZXRDaGlsZHJlbigpLmxlbmd0aCA+IDA7Cit9CisvKioKKyAqIEBzZWUgSVR5cGUjaXNBbm9ueW1vdXMoKQorICovCitwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBmYWxzZTsgLy8gY2Fubm90IGNyZWF0ZSBzb3VyY2UgaGFuZGxlIG9udG8gYW5vbnltb3VzIHR5cGVzCit9CisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiAhaXNJbnRlcmZhY2UoKTsKK30KKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKKwlyZXR1cm4gaW5mby5pc0ludGVyZmFjZSgpOworfQorLyoqCisgKiBAc2VlIElUeXBlI2lzTG9jYWwoKQorICovCitwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIGZhbHNlOyAvLyBjYW5ub3QgY3JlYXRlIHNvdXJjZSBoYW5kbGUgb250byBsb2NhbCB0eXBlcworfQorLyoqCisgKiBAc2VlIElUeXBlI2lzTWVtYmVyKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gZ2V0RGVjbGFyaW5nVHlwZSgpID09IG51bGw7Cit9CisKKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwsIG1vbml0b3IpOworfQorLyoqCisgKiBAc2VlIElUeXBlI25ld1N1cGVydHlwZUhpZXJhcmNoeShJV29ya2luZ0NvcHlbXSwgSVByb2dyZXNzTW9uaXRvcikKKyAqLworcHVibGljIElUeXBlSGllcmFyY2h5IG5ld1N1cGVydHlwZUhpZXJhcmNoeSgKKwlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCUNyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24gb3A9IG5ldyBDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKHRoaXMsIHdvcmtpbmdDb3BpZXMsIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCBmYWxzZSk7CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7Cit9CisKKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiB0aGlzLm5ld1R5cGVIaWVyYXJjaHkoKElXb3JraW5nQ29weVtdKW51bGwsIG1vbml0b3IpOworfQorLyoqCisgKiBAc2VlIElUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVdvcmtpbmdDb3B5W10sIElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyBJVHlwZUhpZXJhcmNoeSBuZXdUeXBlSGllcmFyY2h5KAorCUlXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMsCisJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwlDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uIG9wPSBuZXcgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbih0aGlzLCB3b3JraW5nQ29waWVzLCBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKSwgdHJ1ZSk7CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7Cit9CisKKy8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3VHlwZUhpZXJhcmNoeShJSmF2YVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJoaWVyYXJjaHkubnVsbFByb2plY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24oCisJCXRoaXMsIAorCQludWxsLCAvLyBubyB3b3JraW5nIGNvcGllcworCQlTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cHJvamVjdH0pLCAKKwkJdHJ1ZSk7CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlyZXR1cm4gb3AuZ2V0UmVzdWx0KCk7Cit9CisvKioKKyAqIFNlZSBJU291cmNlVHlwZS5yZXNvbHZlVHlwZSguLi4pCisgKi8KKworIHB1YmxpYyBTdHJpbmdbXVtdIHJlc29sdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVNvdXJjZVR5cGUgaW5mbyA9IChJU291cmNlVHlwZSkgdGhpcy5nZXRFbGVtZW50SW5mbygpOworCUlTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKChKYXZhUHJvamVjdClnZXRKYXZhUHJvamVjdCgpKS5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisKKwljbGFzcyBUeXBlUmVzb2x2ZVJlcXVlc3RvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZXF1ZXN0b3IgeworCQlTdHJpbmdbXVtdIGFuc3dlcnMgPSBudWxsOworCQl2b2lkIGFjY2VwdFR5cGUoU3RyaW5nW10gYW5zd2VyKXsKKwkJCWlmIChhbnN3ZXJzID09IG51bGwpIHsKKwkJCQlhbnN3ZXJzID0gbmV3IFN0cmluZ1tdW117IGFuc3dlciB9OworCQkJfSBlbHNlIHsKKwkJCQkvLyBncm93CisJCQkJaW50IGxlbmd0aCA9IGFuc3dlcnMubGVuZ3RoOworCQkJCVN5c3RlbS5hcnJheWNvcHkoYW5zd2VycywgMCwgYW5zd2VycyA9IG5ldyBTdHJpbmdbbGVuZ3RoKzFdW10sIDAsIGxlbmd0aCk7CisJCQkJYW5zd2Vyc1tsZW5ndGhdID0gYW5zd2VyOworCQkJfQorCQl9CisJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgYm9vbGVhbiBuZWVkUXVhbGlmaWNhdGlvbikgeworCQkJYWNjZXB0VHlwZShuZXcgU3RyaW5nW10gIHsgbmV3IFN0cmluZyhwYWNrYWdlTmFtZSksIG5ldyBTdHJpbmcoY2xhc3NOYW1lKSB9KTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGludGVyZmFjZU5hbWUsIGJvb2xlYW4gbmVlZFF1YWxpZmljYXRpb24pIHsKKwkJCWFjY2VwdFR5cGUobmV3IFN0cmluZ1tdICB7IG5ldyBTdHJpbmcocGFja2FnZU5hbWUpLCBuZXcgU3RyaW5nKGludGVyZmFjZU5hbWUpIH0pOworCQl9CisKKwkJcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpIHt9CisJCXB1YmxpYyB2b2lkIGFjY2VwdEZpZWxkKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIG5hbWUpIHt9CisJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3Rvcikge30KKwkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpe30KKworCX0KKwlUeXBlUmVzb2x2ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgVHlwZVJlc29sdmVSZXF1ZXN0b3IoKTsKKwlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gCisJCW5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwkJCisJZW5naW5lLnNlbGVjdFR5cGUoaW5mbywgdHlwZU5hbWUudG9DaGFyQXJyYXkoKSwgZmFsc2UpOworCXJldHVybiByZXF1ZXN0b3IuYW5zd2VyczsKK30KKy8qKgorICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgeworCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJaWYgKGluZm8gPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgaWYgKGluZm8gPT0gTk9fSU5GTykgeworCQlidWZmZXIuYXBwZW5kKGdldEVsZW1lbnROYW1lKCkpOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlpZiAodGhpcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiaW50ZXJmYWNlICIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoImNsYXNzICIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlidWZmZXIuYXBwZW5kKCI8SmF2YU1vZGVsRXhjZXB0aW9uIGluIHRvU3RyaW5nIG9mICIgKyBnZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZUVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlRWxlbWVudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDYzMDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZUVsZW1lbnRJbmZvLmphdmEKQEAgLTAsMCArMSwyOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CisKKy8qKiAKKyAqIEVsZW1lbnQgaW5mbyBmb3IgYW4gSVR5cGUgZWxlbWVudCB0aGF0IG9yaWdpbmF0ZWQgZnJvbSBzb3VyY2UuIAorICovCitwdWJsaWMgY2xhc3MgU291cmNlVHlwZUVsZW1lbnRJbmZvIGV4dGVuZHMgTWVtYmVyRWxlbWVudEluZm8gaW1wbGVtZW50cyBJU291cmNlVHlwZSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJU291cmNlRmllbGRbXSBOT19GSUVMRFMgPSBuZXcgSVNvdXJjZUZpZWxkWzBdOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVNvdXJjZU1ldGhvZFtdIE5PX01FVEhPRFMgPSBuZXcgSVNvdXJjZU1ldGhvZFswXTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTb3VyY2VUeXBlW10gTk9fVFlQRVMgPSBuZXcgSVNvdXJjZVR5cGVbMF07CisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MgZm9yIHRoaXMgdHlwZS4gVGhpcyBuYW1lCisJICogaXMgZnVsbHkgcXVhbGlmaWVkIGZvciBiaW5hcnkgdHlwZXMgYW5kIGlzIE5PVAorCSAqIGZ1bGx5IHF1YWxpZmllZCBmb3Igc291cmNlIHR5cGVzLgorCSAqLworCXByb3RlY3RlZCBjaGFyW10gZlN1cGVyY2xhc3NOYW1lOworCQorCS8qKgorCSAqIFRoZSBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGlzIHR5cGUgaW1wbGVtZW50cyBvcgorCSAqIGV4dGVuZHMuIFRoZXNlIG5hbWVzIGFyZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGNhc2UKKwkgKiBvZiBhIGJpbmFyeSB0eXBlLCBhbmQgYXJlIE5PVCBmdWxseSBxdWFsaWZpZWQgaW4gdGhlCisJICogY2FzZSBvZiBhIHNvdXJjZSB0eXBlCisJICovCisJcHJvdGVjdGVkIGNoYXJbXVtdIGZTdXBlckludGVyZmFjZU5hbWVzOworCQorCS8qKgorCSAqIFRoZSBlbmNsb3NpbmcgdHlwZSBuYW1lIGZvciB0aGlzIHR5cGUuCisJICoKKwkgKiBAc2VlIGdldEVuY2xvc2luZ1R5cGVOYW1lCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSBmRW5jbG9zaW5nVHlwZU5hbWUgPSBudWxsOworCisJLyoqCisJICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRoaXMgdHlwZSBpcyBkZWNsYXJlZCBpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgY2hhcltdIGZTb3VyY2VGaWxlTmFtZT0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoaXMgdHlwZSBpcyBjb250YWluZWQgaW4uCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSBmUGFja2FnZU5hbWU9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLgorCSAqLworCXByb3RlY3RlZCBjaGFyW10gZlF1YWxpZmllZE5hbWU9IG51bGw7CisKKworCisKKworCisKKwkvKioKKwkgKiBUaGUgaW1wb3J0cyBpbiB0aGlzIHR5cGUncyBjb21waWxhdGlvbiB1bml0CisJICovCisJcHJvdGVjdGVkIGNoYXJbXVtdIGZJbXBvcnRzPSBudWxsOworCisJLyoqCisJICogQmFja3BvaW50ZXIgdG8gbXkgdHlwZSBoYW5kbGUgLSB1c2VmdWwgZm9yIHRyYW5zbGF0aW9uCisJICogZnJvbSBpbmZvIHRvIGhhbmRsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSVR5cGUgZkhhbmRsZT0gbnVsbDsKKwkgCisKKworCisKKworCisKKworLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBpbXBvcnQgdG8gdGhpcyB0eXBlJ3MgY29sbGVjdGlvbiBvZiBpbXBvcnRzCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFkZEltcG9ydChjaGFyW10gaSkgeworCWlmIChmSW1wb3J0cyA9PSBudWxsKSB7CisJCWZJbXBvcnRzID0gbmV3IGNoYXJbXVtdIHtpfTsKKwl9IGVsc2UgeworCQljaGFyW11bXSBjb3B5ID0gbmV3IGNoYXJbZkltcG9ydHMubGVuZ3RoICsgMV1bXTsKKwkJU3lzdGVtLmFycmF5Y29weShmSW1wb3J0cywgMCwgY29weSwgMCwgZkltcG9ydHMubGVuZ3RoKTsKKwkJY29weVtmSW1wb3J0cy5sZW5ndGhdID0gaTsKKwkJZkltcG9ydHMgPSBjb3B5OworCX0KK30KKworCisvKioKKyAqIFJldHVybnMgdGhlIElTb3VyY2VUeXBlIHRoYXQgaXMgdGhlIGVuY2xvc2luZyB0eXBlIGZvciB0aGlzCisgKiB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KKyAqLworcHVibGljIElTb3VyY2VUeXBlIGdldEVuY2xvc2luZ1R5cGUoKSB7CisJSUphdmFFbGVtZW50IHBhcmVudD0gZkhhbmRsZS5nZXRQYXJlbnQoKTsKKwlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAoSVNvdXJjZVR5cGUpKChKYXZhRWxlbWVudClwYXJlbnQpLmdldEVsZW1lbnRJbmZvKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJU291cmNlVHlwZQorICovCitwdWJsaWMgY2hhcltdIGdldEVuY2xvc2luZ1R5cGVOYW1lKCkgeworCXJldHVybiBmRW5jbG9zaW5nVHlwZU5hbWU7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIElTb3VyY2VGaWVsZFtdIGdldEZpZWxkcygpIHsKKwlpbnQgbGVuZ3RoID0gZkNoaWxkcmVuLmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApIHJldHVybiBOT19GSUVMRFM7CisJSVNvdXJjZUZpZWxkW10gZmllbGRzID0gbmV3IElTb3VyY2VGaWVsZFtsZW5ndGhdOworCWludCBmaWVsZEluZGV4ID0gMDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlKYXZhRWxlbWVudCBjaGlsZCA9IGZDaGlsZHJlbltpXTsKKwkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU291cmNlRmllbGQpIHsKKwkJCXRyeSB7CisJCQkJSVNvdXJjZUZpZWxkIGZpZWxkID0gKElTb3VyY2VGaWVsZCkoKFNvdXJjZUZpZWxkKWNoaWxkKS5nZXRFbGVtZW50SW5mbygpOworCQkJCWZpZWxkc1tmaWVsZEluZGV4KytdID0gZmllbGQ7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJfQorCWlmIChmaWVsZEluZGV4ID09IDApIHJldHVybiBOT19GSUVMRFM7CisJU3lzdGVtLmFycmF5Y29weShmaWVsZHMsIDAsIGZpZWxkcyA9IG5ldyBJU291cmNlRmllbGRbZmllbGRJbmRleF0sIDAsIGZpZWxkSW5kZXgpOworCXJldHVybiBmaWVsZHM7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gZlNvdXJjZUZpbGVOYW1lOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBoYW5kbGUgZm9yIHRoaXMgdHlwZSBpbmZvCisgKi8KK3B1YmxpYyBJVHlwZSBnZXRIYW5kbGUoKSB7CisJcmV0dXJuIGZIYW5kbGU7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIGNoYXJbXVtdIGdldEltcG9ydHMoKSB7CisJcmV0dXJuIGZJbXBvcnRzOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VUeXBlCisgKi8KK3B1YmxpYyBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKKwlyZXR1cm4gZlN1cGVySW50ZXJmYWNlTmFtZXM7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIElTb3VyY2VUeXBlW10gZ2V0TWVtYmVyVHlwZXMoKSB7CisJaW50IGxlbmd0aCA9IGZDaGlsZHJlbi5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gTk9fVFlQRVM7CisJSVNvdXJjZVR5cGVbXSBtZW1iZXJUeXBlcyA9IG5ldyBJU291cmNlVHlwZVtsZW5ndGhdOworCWludCB0eXBlSW5kZXggPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUphdmFFbGVtZW50IGNoaWxkID0gZkNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTb3VyY2VUeXBlKSB7CisJCQl0cnkgeworCQkJCUlTb3VyY2VUeXBlIHR5cGUgPSAoSVNvdXJjZVR5cGUpKChTb3VyY2VUeXBlKWNoaWxkKS5nZXRFbGVtZW50SW5mbygpOworCQkJCW1lbWJlclR5cGVzW3R5cGVJbmRleCsrXSA9IHR5cGU7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJfQorCWlmICh0eXBlSW5kZXggPT0gMCkgcmV0dXJuIE5PX1RZUEVTOworCVN5c3RlbS5hcnJheWNvcHkobWVtYmVyVHlwZXMsIDAsIG1lbWJlclR5cGVzID0gbmV3IElTb3VyY2VUeXBlW3R5cGVJbmRleF0sIDAsIHR5cGVJbmRleCk7CisJcmV0dXJuIG1lbWJlclR5cGVzOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VUeXBlCisgKi8KK3B1YmxpYyBJU291cmNlTWV0aG9kW10gZ2V0TWV0aG9kcygpIHsKKwlpbnQgbGVuZ3RoID0gZkNoaWxkcmVuLmxlbmd0aDsKKwlpZiAobGVuZ3RoID09IDApIHJldHVybiBOT19NRVRIT0RTOworCUlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gbmV3IElTb3VyY2VNZXRob2RbbGVuZ3RoXTsKKwlpbnQgbWV0aG9kSW5kZXggPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUphdmFFbGVtZW50IGNoaWxkID0gZkNoaWxkcmVuW2ldOworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTb3VyY2VNZXRob2QpIHsKKwkJCXRyeSB7CisJCQkJSVNvdXJjZU1ldGhvZCBtZXRob2QgPSAoSVNvdXJjZU1ldGhvZCkoKFNvdXJjZU1ldGhvZCljaGlsZCkuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQltZXRob2RzW21ldGhvZEluZGV4KytdID0gbWV0aG9kOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCX0KKwlpZiAobWV0aG9kSW5kZXggPT0gMCkgcmV0dXJuIE5PX01FVEhPRFM7CisJU3lzdGVtLmFycmF5Y29weShtZXRob2RzLCAwLCBtZXRob2RzID0gbmV3IElTb3VyY2VNZXRob2RbbWV0aG9kSW5kZXhdLCAwLCBtZXRob2RJbmRleCk7CisJcmV0dXJuIG1ldGhvZHM7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIGNoYXJbXSBnZXRQYWNrYWdlTmFtZSgpIHsKKwlyZXR1cm4gZlBhY2thZ2VOYW1lOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VUeXBlCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKwlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIGNoYXJbXSBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKKwlyZXR1cm4gZlN1cGVyY2xhc3NOYW1lOworfQorLyoqCisgKiBAc2VlIElTb3VyY2VUeXBlCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSVNvdXJjZVR5cGUKKyAqLworcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBJQ29uc3RhbnRzLkFjY0ludGVyZmFjZSkgPT0gMDsKK30KKy8qKgorICogQHNlZSBJU291cmNlVHlwZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKwlyZXR1cm4gKHRoaXMuZmxhZ3MgJiBJQ29uc3RhbnRzLkFjY0ludGVyZmFjZSkgIT0gMDsKK30KKy8qKgorICogU2V0cyB0aGUgKHVucXVhbGlmaWVkKSBuYW1lIG9mIHRoZSB0eXBlIHRoYXQgZW5jbG9zZXMgdGhpcyB0eXBlLgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRFbmNsb3NpbmdUeXBlTmFtZShjaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUpIHsKKwlmRW5jbG9zaW5nVHlwZU5hbWUgPSBlbmNsb3NpbmdUeXBlTmFtZTsKK30KKy8qKgorICogU2V0cyB0aGUgaGFuZGxlIGZvciB0aGlzIHR5cGUgaW5mbworICovCitwcm90ZWN0ZWQgdm9pZCBzZXRIYW5kbGUoSVR5cGUgaGFuZGxlKSB7CisJZkhhbmRsZT0gaGFuZGxlOworfQorLyoqCisgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoaXMgdHlwZSBpcyBkZWNsYXJlZCBpbi4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZU5hbWUoY2hhcltdIG5hbWUpIHsKKwlmUGFja2FnZU5hbWU9IG5hbWU7Cit9CisvKioKKyAqIFNldHMgdGhpcyB0eXBlJ3MgcXVhbGlmaWVkIG5hbWUuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFF1YWxpZmllZE5hbWUoY2hhcltdIG5hbWUpIHsKKwlmUXVhbGlmaWVkTmFtZT0gbmFtZTsKK30KKy8qKgorICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdGhpcyB0eXBlIGlzIGRlY2xhcmVkIGluLgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VGaWxlTmFtZShjaGFyW10gbmFtZSkgeworCWZTb3VyY2VGaWxlTmFtZT0gbmFtZTsKK30KKy8qKgorICogU2V0cyB0aGUgKHVucXVhbGlmaWVkKSBuYW1lIG9mIHRoaXMgdHlwZSdzIHN1cGVyY2xhc3MKKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJjbGFzc05hbWUoY2hhcltdIHN1cGVyY2xhc3NOYW1lKSB7CisJZlN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWU7Cit9CisvKioKKyAqIFNldHMgdGhlICh1bnF1YWxpZmllZCkgbmFtZXMgb2YgdGhlIGludGVyZmFjZXMgdGhpcyB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcworICovCitwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlckludGVyZmFjZU5hbWVzKGNoYXJbXVtdIHN1cGVySW50ZXJmYWNlTmFtZXMpIHsKKwlmU3VwZXJJbnRlcmZhY2VOYW1lcyA9IHN1cGVySW50ZXJmYWNlTmFtZXM7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiSW5mbyBmb3IgIiArIGZIYW5kbGUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZUNvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBDb252ZXJ0ZXIgZnJvbSBhIHR5cGUgdG8gYW4gQVNUIHR5cGUgZGVjbGFyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyIHsKKwkKKwkvKioKKwkgKiBDb252ZXJ0IGEgdHlwZSBpbnRvIGFuIEFTVCB0eXBlIGRlY2xhcmF0aW9uIGFuZCBwdXQgaXQgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisJICovCisJcHVibGljIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gYnVpbGRUeXBlRGVjbGFyYXRpb24oSVR5cGUgdHlwZSwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0LCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQljaGFyW10gcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKKwkJCisJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCA+IDApIHsgCisJCQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPSBuZXcgSW1wb3J0UmVmZXJlbmNlKENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHBhY2thZ2VOYW1lKSwgbmV3IGxvbmdbXXswfSwgZmFsc2UpOworCQl9CisJCisJCS8qIGNvbnZlcnQgdHlwZSAqLworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gY29udmVydCh0eXBlLCBudWxsLCBudWxsLCBjb21waWxhdGlvblJlc3VsdCk7CisJCQorCQlJVHlwZSBhbHJlYWR5Q29tcHV0ZWRNZW1iZXIgPSB0eXBlOworCQlJVHlwZSBwYXJlbnQgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwkJVHlwZURlY2xhcmF0aW9uIHByZXZpb3VzRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247CisJCXdoaWxlKHBhcmVudCAhPSBudWxsKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjb252ZXJ0KHBhcmVudCwgYWxyZWFkeUNvbXB1dGVkTWVtYmVyLCAoTWVtYmVyVHlwZURlY2xhcmF0aW9uKXByZXZpb3VzRGVjbGFyYXRpb24sIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCQorCQkJYWxyZWFkeUNvbXB1dGVkTWVtYmVyID0gcGFyZW50OworCQkJcHJldmlvdXNEZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOworCQkJcGFyZW50ID0gcGFyZW50LmdldERlY2xhcmluZ1R5cGUoKTsKKwkJfQorCQkKKwkJY29tcGlsYXRpb25Vbml0LnR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvbltde3ByZXZpb3VzRGVjbGFyYXRpb259OworCisJCXJldHVybiB0eXBlRGVjbGFyYXRpb247CisJfQorCQorCXByaXZhdGUgc3RhdGljIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJRmllbGQgZmllbGQsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7CisKKwkJZmllbGREZWNsYXJhdGlvbi5uYW1lID0gZmllbGQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQlmaWVsZERlY2xhcmF0aW9uLnR5cGUgPSBjcmVhdGVUeXBlUmVmZXJlbmNlKFNpZ25hdHVyZS50b1N0cmluZyhmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkpLnRvQ2hhckFycmF5KCksIHR5cGUpOworCQlmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycyA9IGZpZWxkLmdldEZsYWdzKCk7CisKKwkJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CisJfQorCQorCXByaXZhdGUgc3RhdGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gY29udmVydChJTWV0aG9kIG1ldGhvZCwgSVR5cGUgdHlwZSwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb247CisKKwkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJCWRlY2wuaXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsKKwkJCW1ldGhvZERlY2xhcmF0aW9uID0gZGVjbDsKKwkJfSBlbHNlIHsKKwkJCU1ldGhvZERlY2xhcmF0aW9uIGRlY2wgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oY29tcGlsYXRpb25SZXN1bHQpOworCQkJLyogY29udmVydCByZXR1cm4gdHlwZSAqLworCQkJZGVjbC5yZXR1cm5UeXBlID0gY3JlYXRlVHlwZVJlZmVyZW5jZShTaWduYXR1cmUudG9TdHJpbmcobWV0aG9kLmdldFJldHVyblR5cGUoKSkudG9DaGFyQXJyYXkoKSwgdHlwZSk7CisJCQltZXRob2REZWNsYXJhdGlvbiA9IGRlY2w7CisJCX0KKwkJbWV0aG9kRGVjbGFyYXRpb24uc2VsZWN0b3IgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQltZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgPSBtZXRob2QuZ2V0RmxhZ3MoKTsKKworCQkvKiBjb252ZXJ0IGFyZ3VtZW50cyAqLworCQlTdHJpbmdbXSBhcmd1bWVudFR5cGVOYW1lcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworCQlTdHJpbmdbXSBhcmd1bWVudE5hbWVzID0gbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCk7CisJCWludCBhcmd1bWVudENvdW50ID0gYXJndW1lbnRUeXBlTmFtZXMgPT0gbnVsbCA/IDAgOiBhcmd1bWVudFR5cGVOYW1lcy5sZW5ndGg7CisJCW1ldGhvZERlY2xhcmF0aW9uLmFyZ3VtZW50cyA9IG5ldyBBcmd1bWVudFthcmd1bWVudENvdW50XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKyspIHsKKwkJCW1ldGhvZERlY2xhcmF0aW9uLmFyZ3VtZW50c1tpXSA9IG5ldyBBcmd1bWVudCgKKwkJCQlhcmd1bWVudE5hbWVzW2ldLnRvQ2hhckFycmF5KCksCisJCQkJMCwKKwkJCQljcmVhdGVUeXBlUmVmZXJlbmNlKFNpZ25hdHVyZS50b1N0cmluZyhhcmd1bWVudFR5cGVOYW1lc1tpXSkudG9DaGFyQXJyYXkoKSwgdHlwZSksCisJCQkJQ29tcGlsZXJNb2RpZmllcnMuQWNjRGVmYXVsdCk7CisJCQkvLyBkbyBub3QgY2FyZSB3aGV0aGVyIHdhcyBmaW5hbCBvciBub3QKKwkJfQorCisJCS8qIGNvbnZlcnQgdGhyb3duIGV4Y2VwdGlvbnMgKi8KKwkJU3RyaW5nW10gZXhjZXB0aW9uVHlwZU5hbWVzID0gbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7CisJCWludCBleGNlcHRpb25Db3VudCA9IGV4Y2VwdGlvblR5cGVOYW1lcyA9PSBudWxsID8gMCA6IGV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGg7CisJCWlmKGV4Y2VwdGlvbkNvdW50ID4gMCkgeworCQkJbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW2V4Y2VwdGlvbkNvdW50XTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ291bnQ7IGkrKykgeworCQkJCW1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnNbaV0gPQorCQkJCQljcmVhdGVUeXBlUmVmZXJlbmNlKFNpZ25hdHVyZS50b1N0cmluZyhleGNlcHRpb25UeXBlTmFtZXNbaV0pLnRvQ2hhckFycmF5KCksIHR5cGUpOworCQkJfQorCQl9CisJCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGNvbnZlcnQoSVR5cGUgdHlwZSwgSVR5cGUgYWxyZWFkeUNvbXB1dGVkTWVtYmVyLE1lbWJlclR5cGVEZWNsYXJhdGlvbiBhbHJlYWR5Q29tcHV0ZWRNZW1iZXJEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkvKiBjcmVhdGUgdHlwZSBkZWNsYXJhdGlvbiAtIGNhbiBiZSBtZW1iZXIgdHlwZSAqLworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOworCQlpZiAodHlwZS5nZXREZWNsYXJpbmdUeXBlKCkgPT0gbnVsbCkgeworCQkJdHlwZURlY2xhcmF0aW9uID0gbmV3IFR5cGVEZWNsYXJhdGlvbihjb21waWxhdGlvblJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQl0eXBlRGVjbGFyYXRpb24gPSBuZXcgTWVtYmVyVHlwZURlY2xhcmF0aW9uKGNvbXBpbGF0aW9uUmVzdWx0KTsKKwkJfQorCQl0eXBlRGVjbGFyYXRpb24ubmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQl0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzID0gdHlwZS5nZXRGbGFncygpOworCisKKwkJLyogc2V0IHN1cGVyY2xhc3MgYW5kIHN1cGVyaW50ZXJmYWNlcyAqLworCQlpZiAodHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpICE9IG51bGwpIHsKKwkJCXR5cGVEZWNsYXJhdGlvbi5zdXBlcmNsYXNzID0gY3JlYXRlVHlwZVJlZmVyZW5jZSh0eXBlLmdldFN1cGVyY2xhc3NOYW1lKCkudG9DaGFyQXJyYXkoKSwgdHlwZSk7CisJCX0KKwkJU3RyaW5nW10gaW50ZXJmYWNlTmFtZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKKwkJaW50IGludGVyZmFjZUNvdW50ID0gaW50ZXJmYWNlTmFtZXMgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7CisJCXR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXMgPSBuZXcgVHlwZVJlZmVyZW5jZVtpbnRlcmZhY2VDb3VudF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlQ291bnQ7IGkrKykgeworCQkJdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlc1tpXSA9IGNyZWF0ZVR5cGVSZWZlcmVuY2UoaW50ZXJmYWNlTmFtZXNbaV0udG9DaGFyQXJyYXkoKSwgdHlwZSk7CisJCX0KKwkJCisJCS8qIGNvbnZlcnQgbWVtYmVyIHR5cGVzICovCisJCUlUeXBlW10gbWVtYmVyVHlwZXMgPSB0eXBlLmdldFR5cGVzKCk7CisJCWludCBtZW1iZXJUeXBlQ291bnQgPQltZW1iZXJUeXBlcyA9PSBudWxsID8gMCA6IG1lbWJlclR5cGVzLmxlbmd0aDsKKwkJdHlwZURlY2xhcmF0aW9uLm1lbWJlclR5cGVzID0gbmV3IE1lbWJlclR5cGVEZWNsYXJhdGlvblttZW1iZXJUeXBlQ291bnRdOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVDb3VudDsgaSsrKSB7CisJCQlpZihhbHJlYWR5Q29tcHV0ZWRNZW1iZXIgIT0gbnVsbCAmJiBhbHJlYWR5Q29tcHV0ZWRNZW1iZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG1lbWJlclR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgeworCQkJCXR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlc1tpXSA9IGFscmVhZHlDb21wdXRlZE1lbWJlckRlY2xhcmF0aW9uOworCQkJfSBlbHNlIHsKKwkJCQl0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXNbaV0gPQorCQkJCQkoTWVtYmVyVHlwZURlY2xhcmF0aW9uKSBjb252ZXJ0KG1lbWJlclR5cGVzW2ldLCBudWxsLCBudWxsLCBjb21waWxhdGlvblJlc3VsdCk7CisJCQl9CisJCX0KKworCQkvKiBjb252ZXJ0IGZpZWxkcyAqLworCQlJRmllbGRbXSBmaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOworCQlpbnQgZmllbGRDb3VudCA9IGZpZWxkcyA9PSBudWxsID8gMCA6IGZpZWxkcy5sZW5ndGg7CisJCXR5cGVEZWNsYXJhdGlvbi5maWVsZHMgPSBuZXcgRmllbGREZWNsYXJhdGlvbltmaWVsZENvdW50XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZENvdW50OyBpKyspIHsKKwkJCXR5cGVEZWNsYXJhdGlvbi5maWVsZHNbaV0gPSBjb252ZXJ0KGZpZWxkc1tpXSwgdHlwZSk7CisJCX0KKworCQkvKiBjb252ZXJ0IG1ldGhvZHMgLSBuZWVkIHRvIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGlmIG5lY2Vzc2FyeSAqLworCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOworCQlpbnQgbWV0aG9kQ291bnQgPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisKKwkJLyogc291cmNlIHR5cGUgaGFzIGEgY29uc3RydWN0b3IgPyAgICAgICAgICAgKi8KKwkJLyogYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgb25lIGlzIG5lZWRlZC4gKi8KKwkJaW50IG5lZWRlZENvdW50ID0gMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RDb3VudDsgaSsrKSB7CisJCQlpZiAobWV0aG9kc1tpXS5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCQluZWVkZWRDb3VudCA9IDA7CisJCQkJLy8gRG9lcyBub3QgbmVlZCB0aGUgZXh0cmEgY29uc3RydWN0b3Igc2luY2Ugb25lIGNvbnN0cnVjdG9yIGFscmVhZHkgZXhpc3RzLgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXR5cGVEZWNsYXJhdGlvbi5tZXRob2RzID0gbmV3IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bbWV0aG9kQ291bnQgKyBuZWVkZWRDb3VudF07CisJCWlmIChuZWVkZWRDb3VudCAhPSAwKSB7IC8vIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIGluIGZpcnN0IHBvc2l0aW9uCisJCQl0eXBlRGVjbGFyYXRpb24ubWV0aG9kc1swXSA9IHR5cGVEZWNsYXJhdGlvbi5jcmVhdGVzSW50ZXJuYWxDb25zdHJ1Y3RvcihmYWxzZSwgZmFsc2UpOworCQl9CisJCWJvb2xlYW4gaXNJbnRlcmZhY2UgPSB0eXBlLmlzSW50ZXJmYWNlKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ291bnQ7IGkrKykgeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPWNvbnZlcnQobWV0aG9kc1tpXSwgdHlwZSwgY29tcGlsYXRpb25SZXN1bHQpOworCQkJaWYgKGlzSW50ZXJmYWNlIHx8IG1ldGhvZC5pc0Fic3RyYWN0KCkpIHsgLy8gZml4LXVwIGZsYWcgCisJCQkJbWV0aG9kLm1vZGlmaWVycyB8PSBDb21waWxlck1vZGlmaWVycy5BY2NTZW1pY29sb25Cb2R5OworCQkJfQorCQkJdHlwZURlY2xhcmF0aW9uLm1ldGhvZHNbbmVlZGVkQ291bnQgKyBpXSA9IG1ldGhvZDsKKwkJfQorCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoY2hhcltdIHR5cGUsIElUeXBlIGNvbnRleHRUeXBlKSB7CisJCXRyeSB7CisJCQlTdHJpbmdbXVtdIHJlc29sdmVkTmFtZSA9IGNvbnRleHRUeXBlLnJlc29sdmVUeXBlKG5ldyBTdHJpbmcodHlwZSkpOworCQkJY2hhcltdIHN1cGVyQ2xhc3NOYW1lID0gbnVsbDsKKwkJCWlmKHJlc29sdmVkTmFtZSAhPSBudWxsICYmIHJlc29sdmVkTmFtZS5sZW5ndGggPT0gMSkgeworCQkJCXR5cGU9IENoYXJPcGVyYXRpb24uY29uY2F0KHJlc29sdmVkTmFtZVswXVswXS50b0NoYXJBcnJheSgpLCByZXNvbHZlZE5hbWVbMF1bMV0udG9DaGFyQXJyYXkoKSwgJy4nKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQorCQl9CisJCQorCQkvKiBjb3VudCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLworCQlpbnQgbWF4ID0gdHlwZS5sZW5ndGg7CisJCWludCBkaW1TdGFydCA9IG1heDsKKwkJaW50IGRpbSA9IDA7CisJCWludCBpZGVudENvdW50ID0gMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJc3dpdGNoICh0eXBlW2ldKSB7CisJCQkJY2FzZSAnWycgOgorCQkJCQlpZiAoZGltID09IDApCisJCQkJCQlkaW1TdGFydCA9IGk7CisJCQkJCWRpbSsrOworCQkJCQlicmVhazsKKwkJCQljYXNlICcuJyA6CisJCQkJCWlkZW50Q291bnQrKzsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogcmVidWlsZCBpZGVudGlmaWVycyBhbmQgZGltZW5zaW9ucyAqLworCQlpZiAoaWRlbnRDb3VudCA9PSAxKSB7IC8vIHNpbXBsZSB0eXBlIHJlZmVyZW5jZQorCQkJaWYgKGRpbSA9PSAwKSB7CisJCQkJcmV0dXJuIG5ldyBTaW5nbGVUeXBlUmVmZXJlbmNlKHR5cGUsIDApOworCQkJfSBlbHNlIHsKKwkJCQljaGFyW10gaWRlbnRpZmllciA9IG5ldyBjaGFyW2RpbVN0YXJ0XTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGUsIDAsIGlkZW50aWZpZXIsIDAsIGRpbVN0YXJ0KTsKKwkJCQlyZXR1cm4gbmV3IEFycmF5VHlwZVJlZmVyZW5jZShpZGVudGlmaWVyLCBkaW0sIDApOworCQkJfQorCQl9IGVsc2UgeyAvLyBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UKKwkJCWNoYXJbXVtdIGlkZW50aWZpZXJzID0JQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZSwgMCwgZGltU3RhcnQgLSAxKTsKKwkJCWlmIChkaW0gPT0gMCkgeworCQkJCXJldHVybiBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgbmV3IGxvbmdbXXswfSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXJzLCBkaW0sIG5ldyBsb25nW117MH0pOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzBmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlVmVjdG9yLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUeXBlVmVjdG9yIHsKKwlzdGF0aWMgaW50IElOSVRJQUxfU0laRSA9IDEwOworCQorCXB1YmxpYyBpbnQgc2l6ZTsKKwlpbnQgbWF4U2l6ZTsKKwlJVHlwZVtdIGVsZW1lbnRzOworcHVibGljIFR5cGVWZWN0b3IoKSB7CisJbWF4U2l6ZSA9IElOSVRJQUxfU0laRTsKKwlzaXplID0gMDsKKwllbGVtZW50cyA9IG5ldyBJVHlwZVttYXhTaXplXTsKK30KK3B1YmxpYyBUeXBlVmVjdG9yKElUeXBlW10gdHlwZXMpIHsKKwl0aGlzLnNpemUgPSB0eXBlcy5sZW5ndGg7IAorCXRoaXMubWF4U2l6ZSA9IHRoaXMuc2l6ZSArIDE7IC8vIHdoZW4gYW4gZWxlbWVudCBpcyBhZGRlZCwgaXQgYXNzdW1lcyB0aGF0IHRoZSBsZW5ndGggaXMgPiAwCisJZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplXTsKKwlTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCBlbGVtZW50cywgMCwgdGhpcy5zaXplKTsJCit9CitwdWJsaWMgVHlwZVZlY3RvcihJVHlwZSB0eXBlKSB7CisJdGhpcy5tYXhTaXplID0gSU5JVElBTF9TSVpFOworCXRoaXMuc2l6ZSA9IDE7CisJZWxlbWVudHMgPSBuZXcgSVR5cGVbdGhpcy5tYXhTaXplXTsKKwllbGVtZW50c1swXSA9IHR5cGU7Cit9CitwdWJsaWMgdm9pZCBhZGQoSVR5cGUgbmV3RWxlbWVudCkgeworCWlmIChzaXplID09IG1heFNpemUpCS8vIGtub3dzIHRoYXQgc2l6ZSBzdGFydHMgPD0gbWF4U2l6ZQorCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCAoZWxlbWVudHMgPSBuZXcgSVR5cGVbbWF4U2l6ZSAqPSAyXSksIDAsIHNpemUpOworCWVsZW1lbnRzW3NpemUrK10gPSBuZXdFbGVtZW50OworfQorcHVibGljIHZvaWQgYWRkQWxsKElUeXBlW10gbmV3RWxlbWVudHMpIHsKKwlpZiAoc2l6ZSArIG5ld0VsZW1lbnRzLmxlbmd0aCA+PSBtYXhTaXplKSB7CisJCW1heFNpemUgPSBzaXplICsgbmV3RWxlbWVudHMubGVuZ3RoOwkvLyBhc3N1bWUgbm8gbW9yZSBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIChlbGVtZW50cyA9IG5ldyBJVHlwZVttYXhTaXplXSksIDAsIHNpemUpOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KG5ld0VsZW1lbnRzLCAwLCBlbGVtZW50cywgc2l6ZSwgbmV3RWxlbWVudHMubGVuZ3RoKTsKKwlzaXplICs9IG5ld0VsZW1lbnRzLmxlbmd0aDsKK30KK3B1YmxpYyBib29sZWFuIGNvbnRhaW5zKElUeXBlIGVsZW1lbnQpIHsKKwlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KQorCQlpZiAoZWxlbWVudC5lcXVhbHMoZWxlbWVudHNbaV0pKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIFR5cGVWZWN0b3IgY29weSgpIHsKKwlUeXBlVmVjdG9yIGNsb25lID0gbmV3IFR5cGVWZWN0b3IoKTsKKwlpbnQgbGVuZ3RoID0gdGhpcy5lbGVtZW50cy5sZW5ndGg7CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVsZW1lbnRzLCAwLCBjbG9uZS5lbGVtZW50cyA9IG5ldyBJVHlwZVtsZW5ndGhdLCAwLCBsZW5ndGgpOworCWNsb25lLnNpemUgPSB0aGlzLnNpemU7CisJY2xvbmUubWF4U2l6ZSA9IHRoaXMubWF4U2l6ZTsKKwlyZXR1cm4gY2xvbmU7Cit9CitwdWJsaWMgSVR5cGUgZWxlbWVudEF0KGludCBpbmRleCkgeworCXJldHVybiBlbGVtZW50c1tpbmRleF07Cit9CitwdWJsaWMgSVR5cGVbXSBlbGVtZW50cygpIHsKKwlpZiAodGhpcy5zaXplIDwgdGhpcy5tYXhTaXplKSB7CisJCW1heFNpemUgPSBzaXplOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IElUeXBlW21heFNpemVdKSwgMCwgc2l6ZSk7CisJfQorCXJldHVybiB0aGlzLmVsZW1lbnRzOworfQorcHVibGljIElUeXBlIGZpbmQoSVR5cGUgZWxlbWVudCkgeworCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCisJCWlmIChlbGVtZW50ID09IGVsZW1lbnRzW2ldKQorCQkJcmV0dXJuIGVsZW1lbnRzW2ldOworCXJldHVybiBudWxsOworfQorcHVibGljIElUeXBlIHJlbW92ZShJVHlwZSBlbGVtZW50KSB7CisJLy8gYXNzdW1lcyBvbmx5IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBlbGVtZW50IGV4aXN0cworCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCisJCWlmIChlbGVtZW50ID09IGVsZW1lbnRzW2ldKSB7CisJCQkvLyBzaGlmdCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGRvd24gb25lIHNwb3QKKwkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIGkgKyAxLCBlbGVtZW50cywgaSwgLS1zaXplIC0gaSk7CisJCQllbGVtZW50c1tzaXplXSA9IG51bGw7CisJCQlyZXR1cm4gZWxlbWVudDsKKwkJfQorCXJldHVybiBudWxsOworfQorcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgeworCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspCisJCWVsZW1lbnRzW2ldID0gbnVsbDsKKwlzaXplID0gMDsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlsiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChlbGVtZW50c1tpXSk7CisJfQorCWJ1ZmZlci5hcHBlbmQoIlxuXSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDNiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9VdGlsLmphdmEKQEAgLTAsMCArMSwxMTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheUJ1ZmZlcjsKKworLyoqCisgKiBQcm92aWRlcyBjb252ZW5pZW50IHV0aWxpdHkgbWV0aG9kcyB0byBvdGhlciB0eXBlcyBpbiB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsIHsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBET1VCTEVfUVVPVEVTID0gIicnIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIFNJTkdMRV9RVU9URSA9ICInIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UU19ERUxJTUlURVIgPSAiIyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfQVJHVU1FTlQgPSAiICAgIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIGludGVyZmFjZSBDb21wYXJhYmxlIHsKKwkJLyoqCisJCSAqIFJldHVybnMgMCBpZiB0aGlzIGFuZCBjIGFyZSBlcXVhbCwgPjAgaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gYywKKwkJICogb3IgPDAgaWYgdGhpcyBpcyBsZXNzIHRoYW4gYy4KKwkJICovCisJCWludCBjb21wYXJlVG8oQ29tcGFyYWJsZSBjKTsKKwl9CisKKwlwdWJsaWMgaW50ZXJmYWNlIENvbXBhcmVyIHsKKwkJLyoqCisJCSAqIFJldHVybnMgMCBpZiBhIGFuZCBiIGFyZSBlcXVhbCwgPjAgaWYgYSBpcyBncmVhdGVyIHRoYW4gYiwKKwkJICogb3IgPDAgaWYgYSBpcyBsZXNzIHRoYW4gYi4KKwkJICovCisJCWludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYik7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gZmdFbXB0eVN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1swXTsKKworCS8qKgorCSAqIEFyZSB3ZSBydW5uaW5nIEpESyAxLjE/CisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBKREsxXzEgPSBmYWxzZTsKKworCS8qIEJ1bmRsZSBjb250YWluaW5nIG1lc3NhZ2VzICovCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5hbWUgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfY2xhc3MgPSAiLmNsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0NMQVNTID0gIi5DTEFTUyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9qYXZhID0gIi5qYXZhIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0pBVkEgPSAiLkpBVkEiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKworCXN0YXRpYyB7CisJCVN0cmluZyB2ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCUpESzFfMSA9ICgodmVyICE9IG51bGwpICYmIHZlci5zdGFydHNXaXRoKCIxLjEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJcmVsb2NhbGl6ZSgpOworCX0JCisJLyoqCisJICogQ2hlY2tzIHRoZSB0eXBlIHNpZ25hdHVyZSBpbiBTdHJpbmcgc2lnLCAKKwkgKiBzdGFydGluZyBhdCBzdGFydCBhbmQgZW5kaW5nIGJlZm9yZSBlbmQgKGVuZCBpcyBub3QgaW5jbHVkZWQpLgorCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNpZ25hdHVyZSBpZiB2YWxpZCwKKwkgKiBvciAtMSBpZiBub3QgdmFsaWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrVHlwZVNpZ25hdHVyZShTdHJpbmcgc2lnLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gYWxsb3dWb2lkKSB7CisJCWlmIChzdGFydCA+PSBlbmQpIHJldHVybiAtMTsKKwkJaW50IGkgPSBzdGFydDsKKwkJY2hhciBjID0gc2lnLmNoYXJBdChpKyspOworCQlpbnQgbmVzdGluZ0RlcHRoID0gMDsKKwkJd2hpbGUgKGMgPT0gJ1snKSB7CisJCQkrK25lc3RpbmdEZXB0aDsKKwkJCWlmIChpID49IGVuZCkgcmV0dXJuIC0xOworCQkJYyA9IHNpZy5jaGFyQXQoaSsrKTsKKwkJfQorCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ0InOgorCQkJY2FzZSAnQyc6IAorCQkJY2FzZSAnRCc6CisJCQljYXNlICdGJzoKKwkJCWNhc2UgJ0knOgorCQkJY2FzZSAnSic6CisJCQljYXNlICdTJzogCisJCQljYXNlICdaJzoKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1YnOgorCQkJCWlmICghYWxsb3dWb2lkKSByZXR1cm4gLTE7CisJCQkJLy8gYXJyYXkgb2Ygdm9pZCBpcyBub3QgYWxsb3dlZAorCQkJCWlmIChuZXN0aW5nRGVwdGggIT0gMCkgcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJaW50IHNlbWljb2xvbiA9IHNpZy5pbmRleE9mKCc7JywgaSk7CisJCQkJLy8gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYmV0d2VlbiBMIGFuZCA7CisJCQkJaWYgKHNlbWljb2xvbiA8PSBpIHx8IHNlbWljb2xvbiA+PSBlbmQpIHJldHVybiAtMTsKKwkJCQlpID0gc2VtaWNvbG9uICsgMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiBpOworCX0KKy8qKgorICogQ29tYmluZXMgdHdvIGhhc2ggY29kZXMgdG8gbWFrZSBhIG5ldyBvbmUuCisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGNvbWJpbmVIYXNoQ29kZXMoaW50IGhhc2hDb2RlMSwgaW50IGhhc2hDb2RlMikgeworCXJldHVybiBoYXNoQ29kZTEgKiAxNyArIGhhc2hDb2RlMjsKK30KKy8qKgorICogQ29tcGFyZXMgdHdvIGJ5dGUgYXJyYXlzLiAgCisgKiBSZXR1cm5zIDwwIGlmIGEgYnl0ZSBpbiBhIGlzIGxlc3MgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIGIsIG9yIGlmIGEgaXMgc2hvcnRlciwgb3IgaWYgYSBpcyBudWxsLgorICogUmV0dXJucyA+MCBpZiBhIGJ5dGUgaW4gYSBpcyBncmVhdGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiBiLCBvciBpZiBhIGlzIGxvbmdlciwgb3IgaWYgYiBpcyBudWxsLgorICogUmV0dXJucyAwIGlmIHRoZXkgYXJlIGVxdWFsIG9yIGJvdGggbnVsbC4KKyAqLworcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShieXRlW10gYSwgYnl0ZVtdIGIpIHsKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gMDsKKwlpZiAoYSA9PSBudWxsKQorCQlyZXR1cm4gLTE7CisJaWYgKGIgPT0gbnVsbCkKKwkJcmV0dXJuIDE7CisJaW50IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlpbnQgZGlmZiA9IGFbaV0gLSBiW2ldOworCQlpZiAoZGlmZiAhPSAwKQorCQkJcmV0dXJuIGRpZmY7CisJfQorCWlmIChhLmxlbmd0aCA+IGxlbikKKwkJcmV0dXJuIDE7CisJaWYgKGIubGVuZ3RoID4gbGVuKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisvKioKKyAqIENvbXBhcmVzIHR3byBjaGFyIGFycmF5cyBsZXhpY29ncmFwaGljYWxseS4gCisgKiBUaGUgY29tcGFyaXNvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciBpbgorICogdGhlIGNoYXIgYXJyYXlzLiAKKyAqIEByZXR1cm4gIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiBhIGlzIGVxdWFsIHRvCisgKiAgICAgICAgICBiOyBhIHZhbHVlIGxlc3MgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiBhCisgKiAgICAgICAgICBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gYjsgYW5kIGEKKyAqICAgICAgICAgIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiBhIGlzCisgKiAgICAgICAgICBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyIHRoYW4gYi4KKyAqLworcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShjaGFyW10gdjEsIGNoYXJbXSB2MikgeworCWludCBsZW4xID0gdjEubGVuZ3RoOworCWludCBsZW4yID0gdjIubGVuZ3RoOworCWludCBuID0gTWF0aC5taW4obGVuMSwgbGVuMik7CisJaW50IGkgPSAwOworCXdoaWxlIChuLS0gIT0gMCkgeworCQlpZiAodjFbaV0gIT0gdjJbaV0pIHsKKwkJCXJldHVybiB2MVtpXSAtIHYyW2ldOworCQl9CisJCSsraTsKKwl9CisJcmV0dXJuIGxlbjEgLSBsZW4yOworfQorCS8qKgorCSAqIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzIHdpdGggYSBjaGFyIGluIGJldHdlZW4uCisJICogQHNlZSAjY29uY2F0KFN0cmluZywgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIGNoYXIgYywgU3RyaW5nIHMyKSB7CisJCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoczIgPT0gbnVsbCkgczIgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGwxID0gczEubGVuZ3RoKCk7CisJCWludCBsMiA9IHMyLmxlbmd0aCgpOworCQljaGFyW10gYnVmID0gbmV3IGNoYXJbbDEgKyAxICsgbDJdOworCQlzMS5nZXRDaGFycygwLCBsMSwgYnVmLCAwKTsKKwkJYnVmW2wxXSA9IGM7CisJCXMyLmdldENoYXJzKDAsIGwyLCBidWYsIGwxICsgMSk7CisJCXJldHVybiBuZXcgU3RyaW5nKGJ1Zik7CisJfQorCS8qKgorCSAqIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzLgorCSAqIE11Y2ggZmFzdGVyIHRoYW4gdXNpbmcgKywgd2hpY2g6CisJICogCQktIGNyZWF0ZXMgYSBTdHJpbmdCdWZmZXIsCisJICogCQktIHdoaWNoIGlzIHN5bmNocm9uaXplZCwKKwkgKiAJCS0gb2YgZGVmYXVsdCBzaXplLCBzbyB0aGUgcmVzdWx0aW5nIGNoYXIgYXJyYXkgaXMKKwkgKiAgICAgICAgb2Z0ZW4gbGFyZ2VyIHRoYW4gbmVlZGVkLgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhbiBleHRyYSBjaGFyIGFycmF5LCBzaW5jZSB0aGUKKwkgKiBTdHJpbmcgY29uc3RydWN0b3IgY29waWVzIGl0cyBhcmd1bWVudCwgYnV0IHRoZXJlJ3Mgbm8gd2F5IGFyb3VuZCB0aGlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQlpZiAoczEgPT0gbnVsbCkgczEgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHMyID09IG51bGwpIHMyID0gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCWludCBsMSA9IHMxLmxlbmd0aCgpOworCQlpbnQgbDIgPSBzMi5sZW5ndGgoKTsKKwkJY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2wxICsgbDJdOworCQlzMS5nZXRDaGFycygwLCBsMSwgYnVmLCAwKTsKKwkJczIuZ2V0Q2hhcnMoMCwgbDIsIGJ1ZiwgbDEpOworCQlyZXR1cm4gbmV3IFN0cmluZyhidWYpOworCX0KKworCS8qKgorCSAqIENvbmNhdGVuYXRlIHRocmVlIHN0cmluZ3MuCisJICogQHNlZSAjY29uY2F0KFN0cmluZywgU3RyaW5nKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmcgczEsIFN0cmluZyBzMiwgU3RyaW5nIHMzKSB7CisJCWlmIChzMSA9PSBudWxsKSBzMSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoczIgPT0gbnVsbCkgczIgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHMzID09IG51bGwpIHMzID0gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCWludCBsMSA9IHMxLmxlbmd0aCgpOworCQlpbnQgbDIgPSBzMi5sZW5ndGgoKTsKKwkJaW50IGwzID0gczMubGVuZ3RoKCk7CisJCWNoYXJbXSBidWYgPSBuZXcgY2hhcltsMSArIGwyICsgbDNdOworCQlzMS5nZXRDaGFycygwLCBsMSwgYnVmLCAwKTsKKwkJczIuZ2V0Q2hhcnMoMCwgbDIsIGJ1ZiwgbDEpOworCQlzMy5nZXRDaGFycygwLCBsMywgYnVmLCBsMSArIGwyKTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKKwl9CisvKioKKyAqIENvbnZlcnRzIGEgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgSUJpbmFyeVR5cGUgcmVwcmVzZW50YXRpb24gdG8gdGhlIERDIHJlcHJlc2VudGF0aW9uLgorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZShjaGFyW10gc2lnKSB7CisJcmV0dXJuIG5ldyBTdHJpbmcoc2lnKS5yZXBsYWNlKCcvJywgJy4nKTsKK30KKy8qKgorICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCisgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCisgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbC4KKyAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KKyAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAorICogYWxsIGVsZW1lbnRzIGFyZSBlcXVhbC4KKyAqLworcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsQXJyYXlzT3JOdWxsKGludFtdIGEsIGludFtdIGIpIHsKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKKwkJcmV0dXJuIGZhbHNlOworCWludCBsZW4gPSBhLmxlbmd0aDsKKwlpZiAobGVuICE9IGIubGVuZ3RoKQorCQlyZXR1cm4gZmFsc2U7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlpZiAoYVtpXSAhPSBiW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwkvKioKKwkgKiBDb21wYXJlcyB0d28gYXJyYXlzIHVzaW5nIGVxdWFscygpIG9uIHRoZSBlbGVtZW50cy4KKwkgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCisJICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIG51bGwuCisJICogUmV0dXJucyBmYWxzZSBpZiBvbmx5IG9uZSBpcyBudWxsLgorCSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAorCSAqIGFsbCBlbGVtZW50cyBjb21wYXJlIHRydWUgd2l0aCBlcXVhbHMuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsQXJyYXlzT3JOdWxsKE9iamVjdFtdIGEsIE9iamVjdFtdIGIpIHsKKwkJaWYgKGEgPT0gYikJcmV0dXJuIHRydWU7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisKKwkJaW50IGxlbiA9IGEubGVuZ3RoOworCQlpZiAobGVuICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJCWlmIChhW2ldID09IG51bGwpIHsKKwkJCQlpZiAoYltpXSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWlmICghYVtpXS5lcXVhbHMoYltpXSkpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogQ29tcGFyZXMgdHdvIFN0cmluZyBhcnJheXMgdXNpbmcgZXF1YWxzKCkgb24gdGhlIGVsZW1lbnRzLgorCSAqIFRoZSBhcnJheXMgYXJlIGZpcnN0IHNvcnRlZC4KKwkgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCisJICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIG51bGwuCisJICogUmV0dXJucyBmYWxzZSBpZiBvbmx5IG9uZSBpcyBudWxsLgorCSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAorCSAqIGlmZiwgYWZ0ZXIgc29ydGluZyBib3RoIGFycmF5cywgYWxsIGVsZW1lbnRzIGNvbXBhcmUgdHJ1ZSB3aXRoIGVxdWFscy4KKwkgKiBUaGUgb3JpZ2luYWwgYXJyYXlzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxBcnJheXNPck51bGxTb3J0Rmlyc3QoU3RyaW5nW10gYSwgU3RyaW5nW10gYikgeworCQlpZiAoYSA9PSBiKQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJaW50IGxlbiA9IGEubGVuZ3RoOworCQlpZiAobGVuICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisJCWlmIChsZW4gPj0gMikgeyAgLy8gb25seSBuZWVkIHRvIHNvcnQgaWYgbW9yZSB0aGFuIHR3byBpdGVtcworCQkJYSA9IHNvcnRDb3B5KGEpOworCQkJYiA9IHNvcnRDb3B5KGIpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJCWlmICghYVtpXS5lcXVhbHMoYltpXSkpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCisJICogVGhlIGFycmF5cyBhcmUgZmlyc3Qgc29ydGVkLgorCSAqIEVpdGhlciBvciBib3RoIGFycmF5cyBtYXkgYmUgbnVsbC4KKwkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbC4KKwkgKiBSZXR1cm5zIGZhbHNlIGlmIG9ubHkgb25lIGlzIG51bGwuCisJICogSWYgYm90aCBhcmUgYXJyYXlzLCByZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kCisJICogaWZmLCBhZnRlciBzb3J0aW5nIGJvdGggYXJyYXlzLCBhbGwgZWxlbWVudHMgY29tcGFyZSB0cnVlIHdpdGggZXF1YWxzLgorCSAqIFRoZSBvcmlnaW5hbCBhcnJheXMgYXJlIGxlZnQgdW50b3VjaGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbEFycmF5c09yTnVsbFNvcnRGaXJzdChDb21wYXJhYmxlW10gYSwgQ29tcGFyYWJsZVtdIGIpIHsKKwkJaWYgKGEgPT0gYikJcmV0dXJuIHRydWU7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWludCBsZW4gPSBhLmxlbmd0aDsKKwkJaWYgKGxlbiAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworCQlpZiAobGVuID49IDIpIHsgIC8vIG9ubHkgbmVlZCB0byBzb3J0IGlmIG1vcmUgdGhhbiB0d28gaXRlbXMKKwkJCWEgPSBzb3J0Q29weShhKTsKKwkJCWIgPSBzb3J0Q29weShiKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQlpZiAoIWFbaV0uZXF1YWxzKGJbaV0pKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIENvbXBhcmVzIHR3byBvYmplY3RzIHVzaW5nIGVxdWFscygpLgorCSAqIEVpdGhlciBvciBib3RoIGFycmF5IG1heSBiZSBudWxsLgorCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGFyZSBudWxsLgorCSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KKwkgKiBPdGhlcndpc2UsIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB3aXRoIGVxdWFscygpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbE9yTnVsbChPYmplY3QgYSwgT2JqZWN0IGIpIHsKKwkJaWYgKGEgPT0gYikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gYS5lcXVhbHMoYik7CisJfQorCS8qKgorCSAqIEdpdmVuIGEgcXVhbGlmaWVkIG5hbWUsIGV4dHJhY3QgdGhlIGxhc3QgY29tcG9uZW50LgorCSAqIElmIHRoZSBpbnB1dCBpcyBub3QgcXVhbGlmaWVkLCB0aGUgc2FtZSBzdHJpbmcgaXMgYW5zd2VyZWQuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdExhc3ROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisJCWludCBpID0gcXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZignLicpOworCQlpZiAoaSA9PSAtMSkgcmV0dXJuIHF1YWxpZmllZE5hbWU7CisJCXJldHVybiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpKzEpOworCX0KKy8qKgorICogRXh0cmFjdHMgdGhlIHBhcmFtZXRlciB0eXBlcyBmcm9tIGEgbWV0aG9kIHNpZ25hdHVyZS4KKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmdbXSBleHRyYWN0UGFyYW1ldGVyVHlwZXMoY2hhcltdIHNpZykgeworCWludCBjb3VudCA9IGdldFBhcmFtZXRlckNvdW50KHNpZyk7CisJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiByZXN1bHQ7CisJaW50IGkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJygnLCBzaWcpICsgMTsKKwljb3VudCA9IDA7CisJaW50IGxlbiA9IHNpZy5sZW5ndGg7CisJaW50IHN0YXJ0ID0gaTsKKwlmb3IgKDs7KSB7CisJCWlmIChpID09IGxlbikKKwkJCWJyZWFrOworCQljaGFyIGMgPSBzaWdbaV07CisJCWlmIChjID09ICcpJykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnWycpIHsKKwkJCSsraTsKKwkJfSBlbHNlCisJCQlpZiAoYyA9PSAnTCcpIHsKKwkJCQlpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnLCBpICsgMSkgKyAxOworCQkJCUFzc2VydC5pc1RydWUoaSAhPSAwKTsKKwkJCQlyZXN1bHRbY291bnQrK10gPSBjb252ZXJ0VHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZywgc3RhcnQsIGkpKTsKKwkJCQlzdGFydCA9IGk7CisJCQl9IGVsc2UgeworCQkJCSsraTsKKwkJCQlyZXN1bHRbY291bnQrK10gPSBjb252ZXJ0VHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZywgc3RhcnQsIGkpKTsKKwkJCQlzdGFydCA9IGk7CisJCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisJLyoqCisJICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gYSBtZXRob2Qgc2lnbmF0dXJlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RSZXR1cm5UeXBlKFN0cmluZyBzaWcpIHsKKwkJaW50IGkgPSBzaWcubGFzdEluZGV4T2YoJyknKTsKKwkJQXNzZXJ0LmlzVHJ1ZShpICE9IC0xKTsKKwkJcmV0dXJuIHNpZy5zdWJzdHJpbmcoaSsxKTsJCisJfQorLyoqCisgKiBGaW5kcyB0aGUgZmlyc3QgbGluZSBzZXBhcmF0b3IgdXNlZCBieSB0aGUgZ2l2ZW4gdGV4dC4KKyAqCisgKiBAcmV0dXJuIDwvY29kZT4iXG4iPC9jb2RlPiBvciA8L2NvZGU+IlxyIjwvY29kZT4gb3IgIDwvY29kZT4iXHJcbiI8L2NvZGU+LAorICoJCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGZvdW5kCisgKi8KK3ByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kTGluZVNlcGFyYXRvcihjaGFyW10gdGV4dCkgeworCS8vIGZpbmQgdGhlIGZpcnN0IGxpbmUgc2VwYXJhdG9yCisJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOworCWlmIChsZW5ndGggPiAwKSB7CisJCWNoYXIgbmV4dENoYXIgPSB0ZXh0WzBdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQljaGFyIGN1cnJlbnRDaGFyID0gbmV4dENoYXI7CisJCQluZXh0Q2hhciA9IGkgPCBsZW5ndGgtMSA/IHRleHRbaSsxXSA6ICcgJzsKKwkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQljYXNlICdcbic6IHJldHVybiAiXG4iOyAvLyROT04tTkxTLTEkCisJCQkJY2FzZSAnXHInOiByZXR1cm4gbmV4dENoYXIgPT0gJ1xuJyA/ICJcclxuIiA6ICJcciI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQl9CisJfQorCS8vIG5vdCBmb3VuZAorCXJldHVybiBudWxsOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBsaW5lIHNlcGFyYXRvciB1c2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIuCisgKiBVc2VzIHRoZSBnaXZlbiB0ZXh0IGlmIG5vbmUgZm91bmQuCisgKgorICogQHJldHVybiA8L2NvZGU+IlxuIjwvY29kZT4gb3IgPC9jb2RlPiJcciI8L2NvZGU+IG9yICA8L2NvZGU+IlxyXG4iPC9jb2RlPgorICovCitwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGluZVNlcGFyYXRvcihjaGFyW10gdGV4dCwgY2hhcltdIGJ1ZmZlcikgeworCS8vIHNlYXJjaCBpbiB0aGlzIGJ1ZmZlcidzIGNvbnRlbnRzIGZpcnN0CisJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBmaW5kTGluZVNlcGFyYXRvcihidWZmZXIpOworCWlmIChsaW5lU2VwYXJhdG9yID09IG51bGwpIHsKKwkJLy8gc2VhcmNoIGluIHRoZSBnaXZlbiB0ZXh0CisJCWxpbmVTZXBhcmF0b3IgPSBmaW5kTGluZVNlcGFyYXRvcih0ZXh0KTsKKwkJaWYgKGxpbmVTZXBhcmF0b3IgPT0gbnVsbCkgeworCQkJLy8gZGVmYXVsdCB0byBzeXN0ZW0gbGluZSBzZXBhcmF0b3IKKwkJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkxJTkVfU0VQQVJBVE9SOworCQl9CisJfQorCXJldHVybiBsaW5lU2VwYXJhdG9yOworfQorCisKKwkKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyBpbiBhIG1ldGhvZCBzaWduYXR1cmUuCisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlckNvdW50KGNoYXJbXSBzaWcpIHsKKwlpbnQgaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKCcsIHNpZykgKyAxOworCUFzc2VydC5pc1RydWUoaSAhPSAwKTsKKwlpbnQgY291bnQgPSAwOworCWludCBsZW4gPSBzaWcubGVuZ3RoOworCWZvciAoOzspIHsKKwkJaWYgKGkgPT0gbGVuKQorCQkJYnJlYWs7CisJCWNoYXIgYyA9IHNpZ1tpXTsKKwkJaWYgKGMgPT0gJyknKQorCQkJYnJlYWs7CisJCWlmIChjID09ICdbJykgeworCQkJKytpOworCQl9IGVsc2UKKwkJCWlmIChjID09ICdMJykgeworCQkJCSsrY291bnQ7CisJCQkJaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignOycsIHNpZywgaSArIDEpICsgMTsKKwkJCQlBc3NlcnQuaXNUcnVlKGkgIT0gMCk7CisJCQl9IGVsc2UgeworCQkJCSsrY291bnQ7CisJCQkJKytpOworCQkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGdpdmVuIGZpbGUncyBjb250ZW50cyBhcyBhIGJ5dGUgYXJyYXkuCisgKi8KK3B1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShJRmlsZSBmaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJbnB1dFN0cmVhbSBzdHJlYW09IG51bGw7CisJdHJ5IHsKKwkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlsZS5nZXRDb250ZW50cyh0cnVlKSk7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorCXRyeSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAtMSk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwl9IGZpbmFsbHkgeworCQl0cnkgeworCQkJc3RyZWFtLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgZ2l2ZW4gZmlsZSdzIGNvbnRlbnRzIGFzIGEgY2hhcmFjdGVyIGFycmF5LgorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoSUZpbGUgZmlsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSW5wdXRTdHJlYW0gc3RyZWFtPSBudWxsOworCXRyeSB7CisJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpbGUuZ2V0Q29udGVudHModHJ1ZSkpOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCX0KKwl0cnkgeworCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoc3RyZWFtLCAtMSwgZW5jb2RpbmcpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJfSBmaW5hbGx5IHsKKwkJdHJ5IHsKKwkJCXN0cmVhbS5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCX0KKwl9Cit9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIGlzIHZhbGlkLAorCSAqIGZhbHNlIGlmIGl0IGlzIG5vdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE1ldGhvZFNpZ25hdHVyZShTdHJpbmcgc2lnKSB7CisJCWludCBsZW4gPSBzaWcubGVuZ3RoKCk7CisJCWlmIChsZW4gPT0gMCkgcmV0dXJuIGZhbHNlOworCQlpbnQgaSA9IDA7CisJCWNoYXIgYyA9IHNpZy5jaGFyQXQoaSsrKTsKKwkJaWYgKGMgIT0gJygnKSByZXR1cm4gZmFsc2U7CisJCWlmIChpID49IGxlbikgcmV0dXJuIGZhbHNlOworCQl3aGlsZSAoc2lnLmNoYXJBdChpKSAhPSAnKScpIHsKKwkJCS8vIFZvaWQgaXMgbm90IGFsbG93ZWQgYXMgYSBwYXJhbWV0ZXIgdHlwZS4KKwkJCWkgPSBjaGVja1R5cGVTaWduYXR1cmUoc2lnLCBpLCBsZW4sIGZhbHNlKTsKKwkJCWlmIChpID09IC0xKSByZXR1cm4gZmFsc2U7CisJCQlpZiAoaSA+PSBsZW4pIHJldHVybiBmYWxzZTsKKwkJfQorCQkrK2k7CisJCWkgPSBjaGVja1R5cGVTaWduYXR1cmUoc2lnLCBpLCBsZW4sIHRydWUpOworCQlyZXR1cm4gaSA9PSBsZW47CisJfQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUgaXMgdmFsaWQsCisJICogZmFsc2UgaWYgaXQgaXMgbm90LgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVHlwZVNpZ25hdHVyZShTdHJpbmcgc2lnLCBib29sZWFuIGFsbG93Vm9pZCkgeworCQlpbnQgbGVuID0gc2lnLmxlbmd0aCgpOworCQlyZXR1cm4gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZywgMCwgbGVuLCBhbGxvd1ZvaWQpID09IGxlbjsKKwl9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmb2xkZXIgbmFtZSBpcyB2YWxpZCBmb3IgYSBwYWNrYWdlLAorCSAqIGZhbHNlIGlmIGl0IGlzIG5vdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKFN0cmluZyBmb2xkZXJOYW1lKSB7CisJCXJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKGZvbGRlck5hbWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKKwl9CQorCisJLyoKKwkgKiBBZGQgYSBsb2cgZW50cnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlLCBTdHJpbmcgbWVzc2FnZSkgeworCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cygKKwkJCUlTdGF0dXMuRVJST1IsIAorCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgCisJCQlJU3RhdHVzLkVSUk9SLCAKKwkJCW1lc3NhZ2UsIAorCQkJZSk7IAorCQlKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKwl9CQorCQorLyoqCisgKiBOb3JtYWxpemVzIHRoZSBjYXJpYWdlIHJldHVybnMgaW4gdGhlIGdpdmVuIHRleHQuCisgKiBUaGV5IGFyZSBhbGwgY2hhbmdlZCAgdG8gdXNlIHRoZSBnaXZlbiBidWZmZXIncyBsaW5lIHNlcGF0YXRvci4KKyAqLworcHVibGljIHN0YXRpYyBjaGFyW10gbm9ybWFsaXplQ1JzKGNoYXJbXSB0ZXh0LCBjaGFyW10gYnVmZmVyKSB7CisJQ2hhckFycmF5QnVmZmVyIHJlc3VsdCA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKKwlpbnQgbGluZVN0YXJ0ID0gMDsKKwlpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gdGV4dDsKKwlTdHJpbmcgbGluZVNlcGFyYXRvciA9IGdldExpbmVTZXBhcmF0b3IodGV4dCwgYnVmZmVyKTsKKwljaGFyIG5leHRDaGFyID0gdGV4dFswXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNoYXIgY3VycmVudENoYXIgPSBuZXh0Q2hhcjsKKwkJbmV4dENoYXIgPSBpIDwgbGVuZ3RoLTEgPyB0ZXh0W2krMV0gOiAnICc7CisJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCWNhc2UgJ1xuJzoKKwkJCQlpbnQgbGluZUxlbmd0aCA9IGktbGluZVN0YXJ0OworCQkJCWNoYXJbXSBsaW5lID0gbmV3IGNoYXJbbGluZUxlbmd0aF07CisJCQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCBsaW5lU3RhcnQsIGxpbmUsIDAsIGxpbmVMZW5ndGgpOworCQkJCXJlc3VsdC5hcHBlbmQobGluZSk7CisJCQkJcmVzdWx0LmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKwkJCQlsaW5lU3RhcnQgPSBpKzE7CisJCQkJYnJlYWs7CisJCQljYXNlICdccic6CisJCQkJbGluZUxlbmd0aCA9IGktbGluZVN0YXJ0OworCQkJCWlmIChsaW5lTGVuZ3RoID49IDApIHsKKwkJCQkJbGluZSA9IG5ldyBjaGFyW2xpbmVMZW5ndGhdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRleHQsIGxpbmVTdGFydCwgbGluZSwgMCwgbGluZUxlbmd0aCk7CisJCQkJCXJlc3VsdC5hcHBlbmQobGluZSk7CisJCQkJCXJlc3VsdC5hcHBlbmQobGluZVNlcGFyYXRvcik7CisJCQkJCWlmIChuZXh0Q2hhciA9PSAnXG4nKSB7CisJCQkJCQluZXh0Q2hhciA9ICcgJzsKKwkJCQkJCWxpbmVTdGFydCA9IGkrMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHdoZW4gbGluZSBzZXBhcmF0b3IgYXJlIG1peGVkIGluIHRoZSBzYW1lIGZpbGUKKwkJCQkJCS8vIFxyIG1pZ2h0IG5vdCBiZSBmb2xsb3dlZCBieSBhIFxuLiBJZiBub3QsIHdlIHNob3VsZCBpbmNyZW1lbnQKKwkJCQkJCS8vIGxpbmVTdGFydCBieSBvbmUgYW5kIG5vdCBieSB0d28uCisJCQkJCQlsaW5lU3RhcnQgPSBpKzE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyB3aGVuIGxpbmUgc2VwYXJhdG9yIGFyZSBtaXhlZCBpbiB0aGUgc2FtZSBmaWxlCisJCQkJCS8vIHdlIG5lZWQgdG8gcHJldmVudCBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbgorCQkJCQlsaW5lU3RhcnQgPSBpKzE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCWNoYXJbXSBsYXN0TGluZTsKKwlpZiAobGluZVN0YXJ0ID4gMCkgeworCQlpbnQgbGFzdExpbmVMZW5ndGggPSBsZW5ndGgtbGluZVN0YXJ0OworCQlpZiAobGFzdExpbmVMZW5ndGggPiAwKSB7CisJCQlsYXN0TGluZSA9IG5ldyBjaGFyW2xhc3RMaW5lTGVuZ3RoXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGV4dCwgbGluZVN0YXJ0LCBsYXN0TGluZSwgMCwgbGFzdExpbmVMZW5ndGgpOworCQkJcmVzdWx0LmFwcGVuZChsYXN0TGluZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC5nZXRDb250ZW50cygpOworCX0gZWxzZSB7CisJCXJldHVybiB0ZXh0OworCX0KK30KKworLyoqCisgKiBOb3JtYWxpemVzIHRoZSBjYXJpYWdlIHJldHVybnMgaW4gdGhlIGdpdmVuIHRleHQuCisgKiBUaGV5IGFyZSBhbGwgY2hhbmdlZCAgdG8gdXNlIGdpdmVuIGJ1ZmZlcidzIGxpbmUgc2VwYXRhdG9yLgorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVDUnMoU3RyaW5nIHRleHQsIFN0cmluZyBidWZmZXIpIHsKKwlyZXR1cm4gbmV3IFN0cmluZyhub3JtYWxpemVDUnModGV4dC50b0NoYXJBcnJheSgpLCBidWZmZXIudG9DaGFyQXJyYXkoKSkpOworfQorCisJCisKKy8qKgorICogU29ydCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gc29ydCBvcmRlci4KKyAqLworcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCwgaW50W10gc29ydE9yZGVyKSB7CisJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OworCWludCBtaWQgPSBzb3J0T3JkZXJbIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJZG8geworCQl3aGlsZSAoc29ydE9yZGVyW2xlZnRdIDwgbWlkKSB7CisJCQlsZWZ0Kys7CisJCX0KKwkJd2hpbGUgKG1pZCA8IHNvcnRPcmRlcltyaWdodF0pIHsKKwkJCXJpZ2h0LS07CisJCX0KKwkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCU9iamVjdCB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOworCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOworCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7CisJCQlpbnQgdG1wMiA9IHNvcnRPcmRlcltsZWZ0XTsKKwkJCXNvcnRPcmRlcltsZWZ0XSA9IHNvcnRPcmRlcltyaWdodF07CisJCQlzb3J0T3JkZXJbcmlnaHRdID0gdG1wMjsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbF9sZWZ0LCByaWdodCwgc29ydE9yZGVyKTsKKwl9CisJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQsIHNvcnRPcmRlcik7CisJfQorfQorLyoqCisgKiBTb3J0IHRoZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjb21wYXJlci4KKyAqLworcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCwgQ29tcGFyZXIgY29tcGFyZXIpIHsKKwlpbnQgb3JpZ2luYWxfbGVmdCA9IGxlZnQ7CisJaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7CisJT2JqZWN0IG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJZG8geworCQl3aGlsZSAoY29tcGFyZXIuY29tcGFyZShzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLCBtaWQpIDwgMCkgeworCQkJbGVmdCsrOworCQl9CisJCXdoaWxlIChjb21wYXJlci5jb21wYXJlKG1pZCwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0pIDwgMCkgeworCQkJcmlnaHQtLTsKKwkJfQorCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJT2JqZWN0IHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbF9sZWZ0LCByaWdodCwgY29tcGFyZXIpOworCX0KKwlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCwgY29tcGFyZXIpOworCX0KK30KKy8qKgorICogU29ydCB0aGUgc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KKyAqLworcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoU3RyaW5nW10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgeworCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKKwlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwlTdHJpbmcgbWlkID0gc29ydGVkQ29sbGVjdGlvblsgKGxlZnQgKyByaWdodCkgLyAyXTsKKwlkbyB7CisJCXdoaWxlIChzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLmNvbXBhcmVUbyhtaWQpIDwgMCkgeworCQkJbGVmdCsrOworCQl9CisJCXdoaWxlIChtaWQuY29tcGFyZVRvKHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSA8IDApIHsKKwkJCXJpZ2h0LS07CisJCX0KKwkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCVN0cmluZyB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOworCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOworCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7CisJCQlsZWZ0Kys7CisJCQlyaWdodC0tOworCQl9CisJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7CisJaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgeworCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOworCX0KKwlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7CisJfQorfQorLyoqCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aCBpbnRvIGEgcGFja2FnZSBuYW1lLgorICogUmV0dXJucyBudWxsIGlmIHRoZSBwYXRoIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZS4KKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWUoSVBhdGggcGtnUGF0aCkgeworCVN0cmluZ0J1ZmZlciBwa2dOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsKKwlmb3IgKGludCBqID0gMCwgbWF4ID0gcGtnUGF0aC5zZWdtZW50Q291bnQoKTsgaiA8IG1heDsgaisrKSB7CisJCVN0cmluZyBzZWdtZW50ID0gcGtnUGF0aC5zZWdtZW50KGopOworCQlpZiAoIWlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShzZWdtZW50KSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcGtnTmFtZS5hcHBlbmQoc2VnbWVudCk7CisJCWlmIChqIDwgcGtnUGF0aC5zZWdtZW50Q291bnQoKSAtIDEpIHsKKwkJCXBrZ05hbWUuYXBwZW5kKCIuIiApOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJcmV0dXJuIHBrZ05hbWUudG9TdHJpbmcoKTsKK30KKy8qKgorICogU29ydCB0aGUgY29tcGFyYWJsZSBvYmplY3RzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICovCitwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChDb21wYXJhYmxlW10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgeworCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKKwlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwlDb21wYXJhYmxlIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJZG8geworCQl3aGlsZSAoc29ydGVkQ29sbGVjdGlvbltsZWZ0XS5jb21wYXJlVG8obWlkKSA8IDApIHsKKwkJCWxlZnQrKzsKKwkJfQorCQl3aGlsZSAobWlkLmNvbXBhcmVUbyhzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkgPCAwKSB7CisJCQlyaWdodC0tOworCQl9CisJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQlDb21wYXJhYmxlIHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJfQorCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKKwkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwl9Cit9CisvKioKKyAqIFNvcnQgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIuCisgKi8KK3ByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0UmV2ZXJzZShTdHJpbmdbXSBzb3J0ZWRDb2xsZWN0aW9uLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OworCVN0cmluZyBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyAobGVmdCArIHJpZ2h0KSAvIDJdOworCWRvIHsKKwkJd2hpbGUgKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0uY29tcGFyZVRvKG1pZCkgPiAwKSB7CisJCQlsZWZ0Kys7CisJCX0KKwkJd2hpbGUgKG1pZC5jb21wYXJlVG8oc29ydGVkQ29sbGVjdGlvbltyaWdodF0pID4gMCkgeworCQkJcmlnaHQtLTsKKwkJfQorCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJU3RyaW5nIHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCXF1aWNrU29ydFJldmVyc2Uoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOworCX0KKwlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCXF1aWNrU29ydFJldmVyc2Uoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCX0KK30KKy8qKgorICogU29ydHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiBwbGFjZSwgdXNpbmcgdGhlIHNvcnQgb3JkZXIgZ2l2ZW4gZm9yIGVhY2ggaXRlbS4KKyAqLworcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoT2JqZWN0W10gb2JqZWN0cywgaW50W10gc29ydE9yZGVyKSB7CisJaWYgKG9iamVjdHMubGVuZ3RoID4gMSkKKwkJcXVpY2tTb3J0KG9iamVjdHMsIDAsIG9iamVjdHMubGVuZ3RoIC0gMSwgc29ydE9yZGVyKTsKK30KKy8qKgorICogU29ydHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiBwbGFjZS4KKyAqIFRoZSBnaXZlbiBjb21wYXJlciBjb21wYXJlcyBwYWlycyBvZiBpdGVtcy4KKyAqLworcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoT2JqZWN0W10gb2JqZWN0cywgQ29tcGFyZXIgY29tcGFyZXIpIHsKKwlpZiAob2JqZWN0cy5sZW5ndGggPiAxKQorCQlxdWlja1NvcnQob2JqZWN0cywgMCwgb2JqZWN0cy5sZW5ndGggLSAxLCBjb21wYXJlcik7Cit9CisvKioKKyAqIFNvcnRzIGFuIGFycmF5IG9mIHN0cmluZ3MgaW4gcGxhY2UgdXNpbmcgcXVpY2tzb3J0LgorICovCitwdWJsaWMgc3RhdGljIHZvaWQgc29ydChTdHJpbmdbXSBzdHJpbmdzKSB7CisJaWYgKHN0cmluZ3MubGVuZ3RoID4gMSkKKwkJcXVpY2tTb3J0KHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoIC0gMSk7Cit9CisvKioKKyAqIFNvcnRzIGFuIGFycmF5IG9mIENvbXBhcmFibGUgb2JqZWN0cyBpbiBwbGFjZS4KKyAqLworcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoQ29tcGFyYWJsZVtdIG9iamVjdHMpIHsKKwlpZiAob2JqZWN0cy5sZW5ndGggPiAxKQorCQlxdWlja1NvcnQob2JqZWN0cywgMCwgb2JqZWN0cy5sZW5ndGggLSAxKTsKK30KKwkvKioKKwkgKiBTb3J0cyBhbiBhcnJheSBvZiBTdHJpbmdzLCByZXR1cm5pbmcgYSBuZXcgYXJyYXkKKwkgKiB3aXRoIHRoZSBzb3J0ZWQgaXRlbXMuICBUaGUgb3JpZ2luYWwgYXJyYXkgaXMgbGVmdCB1bnRvdWNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3RbXSBzb3J0Q29weShPYmplY3RbXSBvYmplY3RzLCBDb21wYXJlciBjb21wYXJlcikgeworCQlpbnQgbGVuID0gb2JqZWN0cy5sZW5ndGg7CisJCU9iamVjdFtdIGNvcHkgPSBuZXcgT2JqZWN0W2xlbl07CisJCVN5c3RlbS5hcnJheWNvcHkob2JqZWN0cywgMCwgY29weSwgMCwgbGVuKTsKKwkJc29ydChjb3B5LCBjb21wYXJlcik7CisJCXJldHVybiBjb3B5OworCX0KKwkvKioKKwkgKiBTb3J0cyBhbiBhcnJheSBvZiBTdHJpbmdzLCByZXR1cm5pbmcgYSBuZXcgYXJyYXkKKwkgKiB3aXRoIHRoZSBzb3J0ZWQgaXRlbXMuICBUaGUgb3JpZ2luYWwgYXJyYXkgaXMgbGVmdCB1bnRvdWNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzb3J0Q29weShTdHJpbmdbXSBvYmplY3RzKSB7CisJCWludCBsZW4gPSBvYmplY3RzLmxlbmd0aDsKKwkJU3RyaW5nW10gY29weSA9IG5ldyBTdHJpbmdbbGVuXTsKKwkJU3lzdGVtLmFycmF5Y29weShvYmplY3RzLCAwLCBjb3B5LCAwLCBsZW4pOworCQlzb3J0KGNvcHkpOworCQlyZXR1cm4gY29weTsKKwl9CisJLyoqCisJICogU29ydHMgYW4gYXJyYXkgb2YgQ29tcGFyYWJsZSBvYmplY3RzLCByZXR1cm5pbmcgYSBuZXcgYXJyYXkKKwkgKiB3aXRoIHRoZSBzb3J0ZWQgaXRlbXMuICBUaGUgb3JpZ2luYWwgYXJyYXkgaXMgbGVmdCB1bnRvdWNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBDb21wYXJhYmxlW10gc29ydENvcHkoQ29tcGFyYWJsZVtdIG9iamVjdHMpIHsKKwkJaW50IGxlbiA9IG9iamVjdHMubGVuZ3RoOworCQlDb21wYXJhYmxlW10gY29weSA9IG5ldyBDb21wYXJhYmxlW2xlbl07CisJCVN5c3RlbS5hcnJheWNvcHkob2JqZWN0cywgMCwgY29weSwgMCwgbGVuKTsKKwkJc29ydChjb3B5KTsKKwkJcmV0dXJuIGNvcHk7CisJfQorLyoqCisgKiBTb3J0cyBhbiBhcnJheSBvZiBzdHJpbmdzIGluIHBsYWNlIHVzaW5nIHF1aWNrc29ydAorICogaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIuCisgKi8KK3B1YmxpYyBzdGF0aWMgdm9pZCBzb3J0UmV2ZXJzZU9yZGVyKFN0cmluZ1tdIHN0cmluZ3MpIHsKKwlpZiAoc3RyaW5ncy5sZW5ndGggPiAxKQorCQlxdWlja1NvcnRSZXZlcnNlKHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoIC0gMSk7Cit9CisJLyoqCisJICogQ29udmVydHMgYSBTdHJpbmdbXSB0byBjaGFyW11bXS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXJbXVtdIHRvQ2hhckFycmF5cyhTdHJpbmdbXSBhKSB7CisJCWludCBsZW4gPSBhLmxlbmd0aDsKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQlyZXN1bHRbaV0gPSB0b0NoYXJzKGFbaV0pOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqIENvbnZlcnRzIGEgU3RyaW5nIHRvIGNoYXJbXS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJzKFN0cmluZyBzKSB7CisJCWludCBsZW4gPSBzLmxlbmd0aCgpOworCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5dOworCQlzLmdldENoYXJzKDAsIGxlbiwgY2hhcnMsIDApOworCQlyZXR1cm4gY2hhcnM7CisJfQorCS8qKgorCSAqIENvbnZlcnRzIGEgU3RyaW5nIHRvIGNoYXJbXVtdLCB3aGVyZSBzZWdtZW50cyBhcmUgc2VwYXJhdGUgYnkgJy4nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gdG9Db21wb3VuZENoYXJzKFN0cmluZyBzKSB7CisJCWludCBsZW4gPSBzLmxlbmd0aCgpOworCQlpZiAobGVuID09IDApIHsKKwkJCXJldHVybiBuZXcgY2hhclswXVtdOworCQl9CisJCWludCBzZWdDb3VudCA9IDE7CisJCWZvciAoaW50IG9mZiA9IHMuaW5kZXhPZignLicpOyBvZmYgIT0gLTE7IG9mZiA9IHMuaW5kZXhPZignLicsIG9mZiArIDEpKSB7CisJCQkrK3NlZ0NvdW50OworCQl9CisJCWNoYXJbXVtdIHNlZ3MgPSBuZXcgY2hhcltzZWdDb3VudF1bXTsKKwkJaW50IHN0YXJ0ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdDb3VudDsgKytpKSB7CisJCQlpbnQgZG90ID0gcy5pbmRleE9mKCcuJywgc3RhcnQpOworCQkJaW50IGVuZCA9IChkb3QgPT0gLTEgPyBzLmxlbmd0aCgpIDogZG90KTsKKwkJCXNlZ3NbaV0gPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CisJCQlzLmdldENoYXJzKHN0YXJ0LCBlbmQsIHNlZ3NbaV0sIDApOworCQkJc3RhcnQgPSBlbmQgKyAxOworCQl9CisJCXJldHVybiBzZWdzOworCX0KKwkvKioKKwkgKiBDb252ZXJ0cyBhIGNoYXJbXVtdIHRvIFN0cmluZywgd2hlcmUgc2VnbWVudHMgYXJlIHNlcGFyYXRlZCBieSAnLicuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoY2hhcltdW10gYykgeworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjLmxlbmd0aDsgaSA8IG1heDsgKytpKSB7CisJCQlpZiAoaSAhPSAwKSBzYi5hcHBlbmQoJy4nKTsKKwkJCXNiLmFwcGVuZChjW2ldKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogQ29udmVydHMgYSBjaGFyW11bXSBhbmQgYSBjaGFyW10gdG8gU3RyaW5nLCB3aGVyZSBzZWdtZW50cyBhcmUgc2VwYXJhdGVkIGJ5ICcuJy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhjaGFyW11bXSBjLCBjaGFyW10gZCkgeworCQlpZiAoYyA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZyhkKTsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYy5sZW5ndGg7IGkgPCBtYXg7ICsraSkgeworCQkJc2IuYXBwZW5kKGNbaV0pOworCQkJc2IuYXBwZW5kKCcuJyk7CisJCX0KKwkJc2IuYXBwZW5kKGQpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogQ29udmVydHMgYSBjaGFyW10gdG8gU3RyaW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXSBjKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGMpOworCX0KKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBzaWduYXR1cmUgaXMgdmFsaWQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBzaWcpIHsKKwkJQXNzZXJ0LmlzVHJ1ZShpc1ZhbGlkTWV0aG9kU2lnbmF0dXJlKHNpZykpOworCX0KKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIGlzIHZhbGlkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVR5cGVTaWduYXR1cmUoU3RyaW5nIHNpZywgYm9vbGVhbiBhbGxvd1ZvaWQpIHsKKwkJQXNzZXJ0LmlzVHJ1ZShpc1ZhbGlkVHlwZVNpZ25hdHVyZShzaWcsIGFsbG93Vm9pZCkpOworCX0KKworLyoqCisgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIAorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCkgeworCXJldHVybiBiaW5kKGlkLCAoU3RyaW5nW10pbnVsbCk7Cit9CisKKy8qKgorICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKyAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZ1tdIGJpbmRpbmdzKSB7CisJaWYgKGlkID09IG51bGwpCisJCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworCXRyeSB7CisJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsKKwl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkvLyBJZiB3ZSBnb3QgYW4gZXhjZXB0aW9uIGxvb2tpbmcgZm9yIHRoZSBtZXNzYWdlLCBmYWlsIGdyYWNlZnVsbHkgYnkganVzdCByZXR1cm5pbmcKKwkJLy8gdGhlIGlkIHdlIHdlcmUgbG9va2luZyBmb3IuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgc2VtaS1pbmZvcm1hdGl2ZSBzbyBpcyBub3QgdG9vIGJhZC4KKwkJcmV0dXJuICJNaXNzaW5nIG1lc3NhZ2U6ICIgKyBpZCArICIgaW46ICIgKyBidW5kbGVOYW1lOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9CisJLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNZXNzYWdlRm9ybWF0IHdoaWNoIGVsaW1pbmF0ZXMgZG91YmxlIHF1b3RlcyBpbiBvcmlnaW5hbCBtZXNzYWdlCisJY2hhcltdIG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMgPQorCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXNzYWdlLnRvQ2hhckFycmF5KCksIERPVUJMRV9RVU9URVMsIFNJTkdMRV9RVU9URSk7CisJbWVzc2FnZSA9IG5ldyBTdHJpbmcobWVzc2FnZVdpdGhOb0RvdWJsZVF1b3Rlcyk7CisKKwlpZiAoYmluZGluZ3MgPT0gbnVsbCkKKwkJcmV0dXJuIG1lc3NhZ2U7CisKKwlpbnQgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGgoKTsKKwlpbnQgc3RhcnQgPSAtMTsKKwlpbnQgZW5kID0gbGVuZ3RoOworCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKKwl3aGlsZSAodHJ1ZSkgeworCQlpZiAoKGVuZCA9IG1lc3NhZ2UuaW5kZXhPZigneycsIHN0YXJ0KSkgPiAtMSkgeworCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkpOworCQkJaWYgKChzdGFydCA9IG1lc3NhZ2UuaW5kZXhPZignfScsIGVuZCkpID4gLTEpIHsKKwkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQl0cnkgeworCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQobWVzc2FnZS5zdWJzdHJpbmcoZW5kICsgMSwgc3RhcnQpKTsKKwkJCQkJb3V0cHV0LmFwcGVuZChiaW5kaW5nc1tpbmRleF0pOworCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsKKwkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlvdXRwdXQuYXBwZW5kKCJ7bWlzc2luZyAiICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoZW5kLCBsZW5ndGgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBsZW5ndGgpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCisgKi8KK3B1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmcgYmluZGluZykgeworCXJldHVybiBiaW5kKGlkLCBuZXcgU3RyaW5nW10ge2JpbmRpbmd9KTsKK30KKworLyoqCisgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmdzLgorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcxLCBTdHJpbmcgYmluZGluZzIpIHsKKwlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHtiaW5kaW5nMSwgYmluZGluZzJ9KTsKK30KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZW5kLnRvTG93ZXJDYXNlKCkpCisJICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoSWdub3JlQ2FzZShTdHJpbmcgc3RyLCBTdHJpbmcgZW5kKSB7CisJCQorCQlpbnQgc3RyTGVuZ3RoID0gc3RyID09IG51bGwgPyAwIDogc3RyLmxlbmd0aCgpOworCQlpbnQgZW5kTGVuZ3RoID0gZW5kID09IG51bGwgPyAwIDogZW5kLmxlbmd0aCgpOworCQkKKwkJLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBlbmQuCisJCWlmKGVuZExlbmd0aCA+IHN0ckxlbmd0aCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkvLyByZXR1cm4gZmFsc2UgaWYgYW55IGNoYXJhY3RlciBvZiB0aGUgZW5kIGFyZQorCQkvLyBub3QgdGhlIHNhbWUgaW4gbG93ZXIgY2FzZS4KKwkJZm9yKGludCBpID0gMSA7IGkgPD0gZW5kTGVuZ3RoOyBpKyspeworCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGVuZC5jaGFyQXQoZW5kTGVuZ3RoIC0gaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHIuY2hhckF0KHN0ckxlbmd0aCAtIGkpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpCisJICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NGaWxlTmFtZShTdHJpbmcgbmFtZSkgeworCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmxlbmd0aCgpOworCQlpbnQgc3VmZml4TGVuZ3RoID0gU1VGRklYX0NMQVNTLmxlbmd0aDsKKwkJaWYgKG5hbWVMZW5ndGggPCBzdWZmaXhMZW5ndGgpIHJldHVybiBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMCwgb2Zmc2V0ID0gbmFtZUxlbmd0aCAtIHN1ZmZpeExlbmd0aDsgaSA8IHN1ZmZpeExlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBuYW1lLmNoYXJBdChvZmZzZXQgKyBpKTsKKwkJCWlmIChjICE9IFNVRkZJWF9jbGFzc1tpXSAmJiBjICE9IFNVRkZJWF9DTEFTU1tpXSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOwkJCisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4KKwkgKiBBIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZyBydWxlczoKKwkgKiA8dWw+CisJICogPGxpPiBpdCBtdXN0IG5vdCBiZSBudWxsCisJICogPGxpPiBpdCBtdXN0IGluY2x1ZGUgdGhlIDxjb2RlPiIuamF2YSI8L2NvZGU+IHN1ZmZpeAorCSAqIDxsaT4gaXRzIHByZWZpeCBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgY29tcGlsYXRpb24gdW5pdAorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGNvbXBpbGF0aW9uIHVuaXQgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUobmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiAuY2xhc3MgZmlsZSBuYW1lLgorCSAqIEEgLmNsYXNzIGZpbGUgbmFtZSBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZyBydWxlczoKKwkgKiA8dWw+CisJICogPGxpPiBpdCBtdXN0IG5vdCBiZSBudWxsCisJICogPGxpPiBpdCBtdXN0IGluY2x1ZGUgdGhlIDxjb2RlPiIuY2xhc3MiPC9jb2RlPiBzdWZmaXgKKwkgKiA8bGk+IGl0cyBwcmVmaXggbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIC5jbGFzcyBmaWxlCisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgLmNsYXNzIGZpbGUgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENsYXNzRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzRmlsZU5hbWUobmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikKKwkgKiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY3JlYXRpbmcgZXh0cmEgc3RyaW5ncy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNKYXZhRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGgoKTsKKwkJaW50IHN1ZmZpeExlbmd0aCA9IFNVRkZJWF9KQVZBLmxlbmd0aDsKKwkJaWYgKG5hbWVMZW5ndGggPCBzdWZmaXhMZW5ndGgpIHJldHVybiBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMCwgb2Zmc2V0ID0gbmFtZUxlbmd0aCAtIHN1ZmZpeExlbmd0aDsgaSA8IHN1ZmZpeExlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBuYW1lLmNoYXJBdChvZmZzZXQgKyBpKTsKKwkJCWlmIChjICE9IFNVRkZJWF9qYXZhW2ldICYmIGMgIT0gU1VGRklYX0pBVkFbaV0pIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsJCQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBOTFMgY2F0YWxvZyBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2NhbGl6ZSgpIHsKKwkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOworCX0KKwkKKwkvKioKKwkgKiBQdXQgYWxsIHRoZSBhcmd1bWVudHMgaW4gb25lIFN0cmluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9ibGVtQXJndW1lbnRzRm9yTWFya2VyKFN0cmluZ1tdIGFyZ3VtZW50cyl7CisJCVN0cmluZ0J1ZmZlciBhcmdzID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJCQorCQlhcmdzLmFwcGVuZChhcmd1bWVudHMubGVuZ3RoKTsKKwkJYXJncy5hcHBlbmQoJzonKTsKKwkJCisJCQkKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmd1bWVudHMubGVuZ3RoOyBqKyspIHsKKwkJCWlmKGogIT0gMCkKKwkJCQlhcmdzLmFwcGVuZChBUkdVTUVOVFNfREVMSU1JVEVSKTsKKwkJCQorCQkJaWYoYXJndW1lbnRzW2pdLmxlbmd0aCgpID09IDApIHsKKwkJCQlhcmdzLmFwcGVuZChFTVBUWV9BUkdVTUVOVCk7CisJCQl9IGVsc2UgewkJCQorCQkJCWFyZ3MuYXBwZW5kKGFyZ3VtZW50c1tqXSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBhcmdzLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIFNlcGFyYXRlIGFsbCB0aGUgYXJndW1lbnRzIG9mIGEgU3RyaW5nIG1hZGUgYnkgZ2V0UHJvYmxlbUFyZ3VtZW50c0Zvck1hcmtlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvYmxlbUFyZ3VtZW50c0Zyb21NYXJrZXIoU3RyaW5nIGFyZ3VtZW50c1N0cmluZyl7CisJCWludCBpbmRleCA9IGFyZ3VtZW50c1N0cmluZy5pbmRleE9mKCc6Jyk7CisJCWlmKGluZGV4ID09IC0xKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzU3RyaW5nLmxlbmd0aCgpOworCQlpbnQgbnVtYmVyT2ZBcmc7CisJCXRyeXsKKwkJCW51bWJlck9mQXJnID0gSW50ZWdlci5wYXJzZUludChhcmd1bWVudHNTdHJpbmcuc3Vic3RyaW5nKDAgLCBpbmRleCkpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJYXJndW1lbnRzU3RyaW5nID0gYXJndW1lbnRzU3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEsIGxlbmd0aCk7CisJCQorCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQlpbnQgY291bnQgPSAwOworCQkKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXJndW1lbnRzU3RyaW5nLCBBUkdVTUVOVFNfREVMSU1JVEVSKTsKKwkJd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIGFyZ3VtZW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJaWYoYXJndW1lbnQuZXF1YWxzKEVNUFRZX0FSR1VNRU5UKSkKKwkJCQlhcmd1bWVudCA9ICIiOyAgLy8kTk9OLU5MUy0xJAorCQkJYXJnc1tjb3VudCsrXSA9IGFyZ3VtZW50OworCQl9CisJCQorCQlpZihjb3VudCAhPSBudW1iZXJPZkFyZykKKwkJCXJldHVybiBudWxsOworCQkKKwkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBhcmdzID0gbmV3IFN0cmluZ1tjb3VudF0sIDAsIGNvdW50KTsKKwkJcmV0dXJuIGFyZ3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlOWZmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5LmphdmEKQEAgLTAsMCArMSw0ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYSB3b3JraW5nIGNvcHkgY29tcGlsYXRpb24gdW5pdC4gQSB3b3JraW5nCisgKiBjb3B5IG1haW50YWlucyB0aGUgdGltZXN0YW1wIG9mIHRoZSByZXNvdXJjZSBpdCB3YXMgY3JlYXRlZAorICogZnJvbS4KKyAqLworCitwdWJsaWMgY2xhc3MgV29ya2luZ0NvcHkgZXh0ZW5kcyBDb21waWxhdGlvblVuaXQgeworCisJLyoqCisJICogSWYgc2V0LCB0aGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYnVmZmVyLgorCSAqLworCXByb3RlY3RlZCBJQnVmZmVyRmFjdG9yeSBidWZmZXJGYWN0b3J5OworCisJLyoqCisJICogSWYgc2V0LCB0aGlzIGlzIHRoZSBwcm9ibGVtIHJlcXVlc3RvciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbm90aWZ5IHByb2JsZW1zCisJICogZGV0ZWN0ZWQgZHVyaW5nIHJlY29uY2lsaW5nLgorCSAqLworCXByb3RlY3RlZCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yOworCQkKKwkvKioKKwkgKiBBIGNvdW50ZXIgb2YgdGhlIG51bWJlciBvZiB0aW1lIGNsaWVudHMgaGF2ZSBhc2tlZCBmb3IgdGhpcyAKKwkgKiB3b3JraW5nIGNvcHkuIEl0IGlzIHNldCB0byAxLCBpZiB0aGUgd29ya2luZworCSAqIGNvcHkgaXMgbm90IG1hbmFnZWQuIFdoZW4gZGVzdHJveWVkLCB0aGlzIGNvdW50ZXIgaXMKKwkgKiBzZXQgdG8gMC4gT25jZSBkZXN0cm95ZWQsIHRoaXMgd29ya2luZyBjb3B5IGNhbm5vdCBiZSBvcGVuZWQKKwkgKiBhbmQgbm9uLWhhbmRsZSBpbmZvIGNhbiBub3QgYmUgYWNjZXNzZWQuIFRoaXMgaXMKKwkgKiBuZXZlciB0cnVlIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYSB3b3JraW5nCisJICogY29weS4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHVzZUNvdW50ID0gMTsKKwkKKy8qKgorICovCitwcm90ZWN0ZWQgV29ya2luZ0NvcHkoSVBhY2thZ2VGcmFnbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lLCBJQnVmZmVyRmFjdG9yeSBidWZmZXJGYWN0b3J5KSB7CisJdGhpcyhwYXJlbnQsIG5hbWUsIGJ1ZmZlckZhY3RvcnksIG51bGwpOworfQorLyoqCisgKi8KK3Byb3RlY3RlZCBXb3JraW5nQ29weShJUGFja2FnZUZyYWdtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUsIElCdWZmZXJGYWN0b3J5IGJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IpIHsKKwlzdXBlcihwYXJlbnQsIG5hbWUpOworCXRoaXMuYnVmZmVyRmFjdG9yeSA9IAorCQlidWZmZXJGYWN0b3J5ID09IG51bGwgPyAKKwkJCXRoaXMuZ2V0QnVmZmVyTWFuYWdlcigpLmdldERlZmF1bHRCdWZmZXJGYWN0b3J5KCkgOgorCQkJYnVmZmVyRmFjdG9yeTsKKwl0aGlzLnByb2JsZW1SZXF1ZXN0b3IgPSBwcm9ibGVtUmVxdWVzdG9yOworfQorLyoqCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbiBvcD0gbmV3IENvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uKHRoaXMsIGZvcmNlKTsKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworfQorLyoqCisgKiBSZXR1cm5zIGEgbmV3IGVsZW1lbnQgaW5mbyBmb3IgdGhpcyBlbGVtZW50LgorICovCitwcm90ZWN0ZWQgT3BlbmFibGVFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbygpIHsKKwlyZXR1cm4gbmV3IFdvcmtpbmdDb3B5RWxlbWVudEluZm8oKTsKK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqLworcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKwlpZiAoLS10aGlzLnVzZUNvdW50ID4gMCkgeworCQlpZiAoU0hBUkVEX1dDX1ZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVjcmVtZW50aW5nIHVzZSBjb3VudCBvZiBzaGFyZWQgd29ya2luZyBjb3B5ICIgKyB0aGlzLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuOworCX0KKwl0cnkgeworCQljbG9zZSgpOworCQkKKwkJLy8gaWYgb3JpZ2luYWwgZWxlbWVudCBpcyBub3Qgb24gY2xhc3NwYXRoIGZsdXNoIGl0IGZyb20gdGhlIGNhY2hlIAorCQlJSmF2YUVsZW1lbnQgb3JpZ2luYWxFbGVtZW50ID0gdGhpcy5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwkJaWYgKCF0aGlzLmdldFBhcmVudCgpLmV4aXN0cygpKSB7CisJCQkoKENvbXBpbGF0aW9uVW5pdClvcmlnaW5hbEVsZW1lbnQpLmNsb3NlKCk7CisJCX0KKwkJCisJCS8vIHJlbW92ZSB3b3JraW5nIGNvcHkgZnJvbSB0aGUgY2FjaGUKKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQorCQkvLyBJbiBvcmRlciB0byBiZSBzaGFyZWQsIHdvcmtpbmcgY29waWVzIGhhdmUgdG8gZGVub3RlIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgCisJCS8vIEFORCB1c2UgdGhlIHNhbWUgYnVmZmVyIGZhY3RvcnkuCisJCS8vIEFzc3VtaW5nIHRoZXJlIGlzIGEgbGl0dGxlIHNldCBvZiBidWZmZXIgZmFjdG9yaWVzLCB0aGVuIHVzZSBhIDIgbGV2ZWwgTWFwIGNhY2hlLgorCQlNYXAgc2hhcmVkV29ya2luZ0NvcGllcyA9IG1hbmFnZXIuc2hhcmVkV29ya2luZ0NvcGllczsKKwkJCisJCU1hcCBwZXJGYWN0b3J5V29ya2luZ0NvcGllcyA9IChNYXApIHNoYXJlZFdvcmtpbmdDb3BpZXMuZ2V0KHRoaXMuYnVmZmVyRmFjdG9yeSk7CisJCWlmIChwZXJGYWN0b3J5V29ya2luZ0NvcGllcyAhPSBudWxsKXsKKwkJCWlmIChwZXJGYWN0b3J5V29ya2luZ0NvcGllcy5yZW1vdmUob3JpZ2luYWxFbGVtZW50KSAhPSBudWxsKSB7CisJCQkJaWYgKFNIQVJFRF9XQ19WRVJCT1NFKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVzdHJveWluZyBzaGFyZWQgd29ya2luZyBjb3B5ICIgKyB0aGlzLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsvLyROT04tTkxTLTEkCisJCQkJfQorCQorCQkJCS8vIHJlcG9ydCByZW1vdmVkIGphdmEgZGVsdGEKKwkJCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEodGhpcy5nZXRKYXZhTW9kZWwoKSk7CisJCQkJZGVsdGEucmVtb3ZlZCh0aGlzKTsKKwkJCQltYW5hZ2VyLmZpcmUoZGVsdGEsIEphdmFNb2RlbE1hbmFnZXIuREVGQVVMVF9DSEFOR0VfRVZFTlQpOworCQkJfQorCQl9CQkKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkvLyBkbyBub3RoaW5nCisJfQorfQorCitwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJaWYgKHRoaXMudXNlQ291bnQgPT0gMCkgcmV0dXJuIGZhbHNlOyAvLyBubyBsb25nZXIgZXhpc3RzIG9uY2UgZGVzdHJveWVkCisJcmV0dXJuIHN1cGVyLmV4aXN0cygpOworfQorCisKKy8qKgorICogQW5zd2VycyBjdXN0b20gYnVmZmVyIGZhY3RvcnkKKyAqLworcHVibGljIElCdWZmZXJGYWN0b3J5IGdldEJ1ZmZlckZhY3RvcnkoKXsKKworCXJldHVybiB0aGlzLmJ1ZmZlckZhY3Rvcnk7Cit9CisKKy8qKgorICogV29ya2luZyBjb3BpZXMgbXVzdCBiZSBpZGVudGljYWwgdG8gYmUgZXF1YWwuCisgKgorICogQHNlZSBPYmplY3QjZXF1YWxzCisgKi8KK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCXJldHVybiB0aGlzID09IG87IAorfQorCisKKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRPcmlnaW5hbChJSmF2YUVsZW1lbnQgd29ya2luZ0NvcHlFbGVtZW50KSB7CisJLy9ub3QgYSBlbGVtZW50IGNvbnRhaW5lZCBpbiBhIGNvbXBpbGF0aW9uIHVuaXQKKwlpbnQgamF2YUVsZW1lbnRUeXBlID0gd29ya2luZ0NvcHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7CisJaWYgKGphdmFFbGVtZW50VHlwZSA8IENPTVBJTEFUSU9OX1VOSVQgfHwgamF2YUVsZW1lbnRUeXBlID09IENMQVNTX0ZJTEUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmICh3b3JraW5nQ29weUVsZW1lbnQgaW5zdGFuY2VvZiBCaW5hcnlNZW1iZXIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCUlKYXZhRWxlbWVudCBwYXJlbnQgPSB3b3JraW5nQ29weUVsZW1lbnQuZ2V0UGFyZW50KCk7CisJQXJyYXlMaXN0IGhpZXJhcmNoeSA9IG5ldyBBcnJheUxpc3QoNCk7CisJCisJd2hpbGUgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID4gQ09NUElMQVRJT05fVU5JVCkgeworCQloaWVyYXJjaHkuYWRkKHBhcmVudCk7CisJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKwl9CisJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IENPTVBJTEFUSU9OX1VOSVQpIHsKKwkJaGllcmFyY2h5LmFkZCgoKElDb21waWxhdGlvblVuaXQpcGFyZW50KS5nZXRPcmlnaW5hbEVsZW1lbnQoKSk7CisJfQorCQorCUlDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZ2V0T3JpZ2luYWxFbGVtZW50KCk7CisJaWYgKGphdmFFbGVtZW50VHlwZSA9PSBDT01QSUxBVElPTl9VTklUKSB7CisJCXBhcmVudCA9IHdvcmtpbmdDb3B5RWxlbWVudDsKKwl9CisJaWYgKCgoSUNvbXBpbGF0aW9uVW5pdCkgcGFyZW50KS5pc1dvcmtpbmdDb3B5KCkgJiYgISgoSUNvbXBpbGF0aW9uVW5pdCkgcGFyZW50KS5nZXRPcmlnaW5hbEVsZW1lbnQoKS5lcXVhbHMoY3UpKSB7CisJCXJldHVybiBudWxsOworCX0KKwlzd2l0Y2ggKGphdmFFbGVtZW50VHlwZSkgeworCQljYXNlIFBBQ0tBR0VfREVDTEFSQVRJT04gOgorCQkJcmV0dXJuIGN1LmdldFBhY2thZ2VEZWNsYXJhdGlvbih3b3JraW5nQ29weUVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWNhc2UgSU1QT1JUX0NPTlRBSU5FUiA6CisJCQlyZXR1cm4gY3UuZ2V0SW1wb3J0Q29udGFpbmVyKCk7CisJCWNhc2UgSU1QT1JUX0RFQ0xBUkFUSU9OIDoKKwkJCXJldHVybiBjdS5nZXRJbXBvcnQod29ya2luZ0NvcHlFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQljYXNlIFRZUEUgOgorCQkJaWYgKGhpZXJhcmNoeS5zaXplKCkgPT0gMSkgeworCQkJCXJldHVybiBjdS5nZXRUeXBlKHdvcmtpbmdDb3B5RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9pbm5lciB0eXBlCisJCQkJcmV0dXJuIGdldE9yaWdpbmFsVHlwZShoaWVyYXJjaHkpLmdldFR5cGUod29ya2luZ0NvcHlFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQkJfQorCQljYXNlIE1FVEhPRCA6CisJCQlJVHlwZSB0eXBlOworCQkJaWYgKGhpZXJhcmNoeS5zaXplKCkgPT0gMikgeworCQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoSUphdmFFbGVtZW50KSBoaWVyYXJjaHkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpOworCQkJCXR5cGUgPSBjdS5nZXRUeXBlKHR5cGVOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9pbm5lciB0eXBlCisJCQkJdHlwZSA9IGdldE9yaWdpbmFsVHlwZShoaWVyYXJjaHkpOworCQkJfQorCQkJcmV0dXJuIHR5cGUuZ2V0TWV0aG9kKHdvcmtpbmdDb3B5RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCAoKElNZXRob2QpIHdvcmtpbmdDb3B5RWxlbWVudCkuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisJCWNhc2UgRklFTEQgOgorCQkJaWYgKGhpZXJhcmNoeS5zaXplKCkgPT0gMikgeworCQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoSUphdmFFbGVtZW50KSBoaWVyYXJjaHkuZ2V0KDApKS5nZXRFbGVtZW50TmFtZSgpOworCQkJCXR5cGUgPSBjdS5nZXRUeXBlKHR5cGVOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9pbm5lciB0eXBlCisJCQkJdHlwZSA9IGdldE9yaWdpbmFsVHlwZShoaWVyYXJjaHkpOworCQkJfQorCQkJcmV0dXJuIHR5cGUuZ2V0RmllbGQod29ya2luZ0NvcHlFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOworCQljYXNlIElOSVRJQUxJWkVSIDoKKwkJCWlmIChoaWVyYXJjaHkuc2l6ZSgpID09IDIpIHsKKwkJCQlTdHJpbmcgdHlwZU5hbWUgPSAoKElKYXZhRWxlbWVudCkgaGllcmFyY2h5LmdldCgwKSkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCQl0eXBlID0gY3UuZ2V0VHlwZSh0eXBlTmFtZSk7CisJCQl9IGVsc2UgeworCQkJCS8vaW5uZXIgdHlwZQorCQkJCXR5cGUgPSBnZXRPcmlnaW5hbFR5cGUoaGllcmFyY2h5KTsKKwkJCX0KKwkJCXJldHVybiB0eXBlLmdldEluaXRpYWxpemVyKCgoSW5pdGlhbGl6ZXIpIHdvcmtpbmdDb3B5RWxlbWVudCkuZ2V0T2NjdXJyZW5jZUNvdW50KCkpOworCQljYXNlIENPTVBJTEFUSU9OX1VOSVQgOgorCQkJcmV0dXJuIGN1OworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRPcmlnaW5hbEVsZW1lbnQoKSB7CisJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQoKElQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50KCksIGdldEVsZW1lbnROYW1lKCkpOworfQorcHJvdGVjdGVkIElUeXBlIGdldE9yaWdpbmFsVHlwZShBcnJheUxpc3QgaGllcmFyY2h5KSB7CisJaW50IHNpemUgPSBoaWVyYXJjaHkuc2l6ZSgpIC0gMTsKKwlJQ29tcGlsYXRpb25Vbml0IHR5cGVDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBoaWVyYXJjaHkuZ2V0KHNpemUpOworCVN0cmluZyB0eXBlTmFtZSA9ICgoSUphdmFFbGVtZW50KSBoaWVyYXJjaHkuZ2V0KHNpemUgLSAxKSkuZ2V0RWxlbWVudE5hbWUoKTsKKwlJVHlwZSB0eXBlID0gdHlwZUNVLmdldFR5cGUodHlwZU5hbWUpOworCXNpemU9IHNpemUgLSAyOworCXdoaWxlIChzaXplID4gLTEpIHsKKwkJdHlwZU5hbWUgPSAoKElKYXZhRWxlbWVudCkgaGllcmFyY2h5LmdldChzaXplKSkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJdHlwZSA9ICgoSVR5cGUpIHR5cGUpLmdldFR5cGUodHlwZU5hbWUpOworCQlzaXplLS07CisJfQorCXJldHVybiB0eXBlOworfQorCisvKgorICogQW5zd2VyIHJlcXVlc3RvciB0byBub3RpZnkgd2l0aCBwcm9ibGVtcworICovCitwdWJsaWMgSVByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpeworCXJldHVybiB0aGlzLnByb2JsZW1SZXF1ZXN0b3I7Cit9CisvKgorICogQHNlZSBJSmF2YUVsZW1lbnQKKyAqLworcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKworLyoqCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSwgSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIFJldHVybnMgPGNvZGU+bnVsbDxjb2RlPiAtIGEgd29ya2luZyBjb3B5IGRvZXMgbm90IGhhdmUgYW4gdW5kZXJseWluZyByZXNvdXJjZS4KKyAqCisgKiBAc2VlIElKYXZhRWxlbWVudAorICovCitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIEBzZWUgSVdvcmtpbmdDb3B5CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gdGhpczsKK30KKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqLworcHVibGljIGJvb2xlYW4gaXNCYXNlZE9uKElSZXNvdXJjZSByZXNvdXJjZSkgeworCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodGhpcy51c2VDb3VudCA9PSAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdHJ5IHsKKwkJLy8gaWYgcmVzb3VyY2UgZ290IGRlbGV0ZWQsIHRoZW4gI2dldE1vZGlmaWNhdGlvblN0YW1wKCkgd2lsbCBhbnN3ZXIgSVJlc291cmNlLk5VTExfU1RBTVAsIHdoaWNoIGlzIGFsd2F5cyBkaWZmZXJlbnQgZnJvbSB0aGUgY2FjaGVkCisJCS8vIHRpbWVzdGFtcAorCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZlRpbWVzdGFtcCA9PSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorLyoqCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgeworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIElPcGVuYWJsZQorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBhdHRlbXB0aW5nIHRvIG9wZW4gYSByZWFkIG9ubHkgZWxlbWVudCBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4gbmF2aWdhdGlvbgorICogCW9yIGlmIHRoaXMgaXMgYSB3b3JraW5nIGNvcHkgYmVpbmcgb3BlbmVkIGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAqLworcHVibGljIHZvaWQgb3BlbihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAodGhpcy51c2VDb3VudCA9PSAwKSB7IC8vIHdhcyBkZXN0cm95ZWQKKwkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCX0gZWxzZSB7CisJCXN1cGVyLm9wZW4ocG0pOworCX0KK30KKy8qKgorICogQHNlZSBPcGVuYWJsZQorICovCitwcm90ZWN0ZWQgSUJ1ZmZlciBvcGVuQnVmZmVyKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJaWYgKHRoaXMudXNlQ291bnQgPT0gMCkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOyAvLyB3YXMgZGVzdHJveWVkCisJCisJLy8gY3JlYXRlIGJ1ZmZlciAtIHdvcmtpbmcgY29waWVzIG1heSB1c2UgY3VzdG9tIGJ1ZmZlciBmYWN0b3J5CisJSUJ1ZmZlciBidWZmZXIgPSBnZXRCdWZmZXJGYWN0b3J5KCkuY3JlYXRlQnVmZmVyKHRoaXMpOworCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwkvLyBzZXQgdGhlIGJ1ZmZlciBzb3VyY2UgaWYgbmVlZGVkCisJaWYgKGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgPT0gbnVsbCl7CisJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw9IChJQ29tcGlsYXRpb25Vbml0KXRoaXMuZ2V0T3JpZ2luYWxFbGVtZW50KCk7CisJCUlCdWZmZXIgb3JpZ2luYWxCdWZmZXIgPSBvcmlnaW5hbC5nZXRCdWZmZXIoKTsKKwkJaWYgKG9yaWdpbmFsQnVmZmVyICE9IG51bGwpIHsKKwkJCWNoYXJbXSBvcmlnaW5hbENvbnRlbnRzID0gb3JpZ2luYWxCdWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQkJaWYgKG9yaWdpbmFsQ29udGVudHMgIT0gbnVsbCkgeworCQkJCWJ1ZmZlci5zZXRDb250ZW50cygoY2hhcltdKW9yaWdpbmFsQ29udGVudHMuY2xvbmUoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBhZGQgYnVmZmVyIHRvIGJ1ZmZlciBjYWNoZQorCXRoaXMuZ2V0QnVmZmVyTWFuYWdlcigpLmFkZEJ1ZmZlcihidWZmZXIpOworCisJLy8gbGlzdGVuIHRvIGJ1ZmZlciBjaGFuZ2VzCisJYnVmZmVyLmFkZEJ1ZmZlckNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworCXJldHVybiBidWZmZXI7CQorfQorCisvKioKKyAqIEBzZWUgSVdvcmtpbmdDb3B5CisgKi8gCitwdWJsaWMgSU1hcmtlcltdIHJlY29uY2lsZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJlY29uY2lsZShmYWxzZSwgbnVsbCk7CisJcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQHNlZSBJV29ya2luZ0NvcHkKKyAqLyAKK3B1YmxpYyB2b2lkIHJlY29uY2lsZShib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCWlmICh0aGlzLnVzZUNvdW50ID09IDApIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsgLy93YXMgZGVzdHJveWVkCisJCisJaWYgKG1vbml0b3IgIT0gbnVsbCl7CisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVsZW1lbnQucmVjb25jaWxpbmciKSwgMTApOyAvLyROT04tTkxTLTEkCisJfQorCisJYm9vbGVhbiB3YXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KCk7CisJSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIgZGVsdGFCdWlsZGVyID0gbnVsbDsKKworCXRyeSB7CisJCS8vIGNyZWF0ZSB0aGUgZGVsdGEgYnVpbGRlciAodGhpcyByZW1lbWJlcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY3UpCisJCWlmICghd2FzQ29uc2lzdGVudCl7CisJCQlkZWx0YUJ1aWxkZXIgPSBuZXcgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIodGhpcyk7CisJCQkKKwkJCS8vIHVwZGF0ZSB0aGUgZWxlbWVudCBpbmZvcyB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSB3b3JraW5nIGNvcHkKKwkJCXRoaXMubWFrZUNvbnNpc3RlbnQobW9uaXRvcik7CisJCQlkZWx0YUJ1aWxkZXIuYnVpbGREZWx0YXMoKTsKKwkKKwkJfQorCisJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3Iud29ya2VkKDIpOworCQkKKwkJLy8gZm9yY2UgcHJvYmxlbSBkZXRlY3Rpb24/IC0gaWYgc3RydWN0dXJlIHdhcyBjb25zaXN0ZW50CisJCWlmIChmb3JjZVByb2JsZW1EZXRlY3Rpb24gJiYgd2FzQ29uc2lzdGVudCl7CisJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCisJCQlJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yID0gdGhpcy5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7CisJCQlpZiAocHJvYmxlbVJlcXVlc3RvciAhPSBudWxsICYmIHByb2JsZW1SZXF1ZXN0b3IuaXNBY3RpdmUoKSl7CisJCQkJcHJvYmxlbVJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOworCQkJCUNvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIucmVzb2x2ZSh0aGlzLCBwcm9ibGVtUmVxdWVzdG9yLCBtb25pdG9yKTsKKwkJCQlwcm9ibGVtUmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOworCQkJfQorCQl9CisJCQorCQkvLyBmaXJlIHRoZSBkZWx0YXMKKwkJaWYgKGRlbHRhQnVpbGRlciAhPSBudWxsKXsKKwkJCWlmICgoZGVsdGFCdWlsZGVyLmRlbHRhICE9IG51bGwpICYmIChkZWx0YUJ1aWxkZXIuZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApKSB7CisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuCisJCQkJCWZpcmUoZGVsdGFCdWlsZGVyLmRlbHRhLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFKTsKKwkJCX0KKwkJfQorCX0gZmluYWxseSB7CisJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOworCX0KK30KKworLyoqCisgKiBAc2VlIElXb3JraW5nQ29weQorICovCitwdWJsaWMgdm9pZCByZXN0b3JlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlpZiAodGhpcy51c2VDb3VudCA9PSAwKSB0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7IC8vd2FzIGRlc3Ryb3llZAorCisJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKENvbXBpbGF0aW9uVW5pdCkgZ2V0T3JpZ2luYWxFbGVtZW50KCk7CisJSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmdldEJ1ZmZlcigpOworCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuOworCWJ1ZmZlci5zZXRDb250ZW50cyhvcmlnaW5hbC5nZXRDb250ZW50cygpKTsKKwl1cGRhdGVUaW1lU3RhbXAob3JpZ2luYWwpOworCW1ha2VDb25zaXN0ZW50KG51bGwpOworfQorLyoKKyAqIEBzZWUgSmF2YUVsZW1lbnQjcm9vdGVkQXQoSUphdmFQcm9qZWN0KQorICovCitwdWJsaWMgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJcmV0dXJuCisJCW5ldyBXb3JraW5nQ29weSgKKwkJCShJUGFja2FnZUZyYWdtZW50KSgoSmF2YUVsZW1lbnQpZlBhcmVudCkucm9vdGVkQXQocHJvamVjdCksIAorCQkJZk5hbWUsCisJCQl0aGlzLmJ1ZmZlckZhY3RvcnkpOworCit9CisvKioKKyAqIEBzZWUgSU9wZW5hYmxlCisgKi8KK3B1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBwbSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKGlzUmVhZE9ubHkoKSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFksIHRoaXMpKTsKKwl9CisJSUJ1ZmZlciBidWYgPSBnZXRCdWZmZXIoKTsKKwlpZiAoYnVmICE9IG51bGwpIHsgLy8gc29tZSBPcGVuYWJsZXMgKGxpa2UgYSBKYXZhUHJvamVjdCkgZG9uJ3QgaGF2ZSBhIGJ1ZmZlcgorCQlidWYuc2F2ZShwbSwgZm9yY2UpOworCQl0aGlzLnJlY29uY2lsZSgpOyAgIC8vIG5vdCBzaW1wbHkgbWFrZUNvbnNpc3RlbnQsIGFsc28gY29tcHV0ZXMgZmluZS1ncmFpbiBkZWx0YXMKKwkJCQkJCQkvLyBpbiBjYXNlIHRoZSB3b3JraW5nIGNvcHkgaXMgYmVpbmcgcmVjb25jaWxlZCBhbHJlYWR5IChpZiBub3QgaXQgd291bGQgbWlzcworCQkJCQkJCS8vIG9uZSBpdGVyYXRpb24gb2YgZGVsdGFzKS4KKwl9Cit9CisKKy8qKgorICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3Byb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgeworCWJ1ZmZlci5hcHBlbmQodGhpcy50YWJTdHJpbmcodGFiKSk7CisJYnVmZmVyLmFwcGVuZCgiW1dvcmtpbmcgY29weV0gIik7IC8vJE5PTi1OTFMtMSQKKwlzdXBlci50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBpbmZvKTsKK30KK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZVRpbWVTdGFtcChDb21waWxhdGlvblVuaXQgb3JpZ2luYWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWxvbmcgdGltZVN0YW1wID0KKwkJKChJRmlsZSkgb3JpZ2luYWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CisJaWYgKHRpbWVTdGFtcCA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKAorCQkJbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUkVTT1VSQ0UpKTsKKwl9CisJKChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZlRpbWVzdGFtcCA9IHRpbWVTdGFtcDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5RWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5RWxlbWVudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTIyYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHlFbGVtZW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CisKK3B1YmxpYyBjbGFzcyBXb3JraW5nQ29weUVsZW1lbnRJbmZvIGV4dGVuZHMgQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8geworCUlQcm9ibGVtW10gcHJvYmxlbXM7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0Fib3J0SW5jcmVtZW50YWxCdWlsZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFhYmExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBpbmNyZW1lbnRhbCBidWlsZGVyIGNhbm5vdCBmaW5kIGEgLmNsYXNzIGZpbGUuCisgKiBJdHMgcG9zc2libGUgdGhlIHR5cGUgY2FuIG5vIGxvbmdlciBiZSBmb3VuZCBiZWNhdXNlIGl0IHdhcyByZW5hbWVkIGluc2lkZSBpdHMgZXhpc3RpbmcKKyAqIHNvdXJjZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgQWJvcnRJbmNyZW1lbnRhbEJ1aWxkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKK3Byb3RlY3RlZCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWU7CisKK3B1YmxpYyBBYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24oU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7CisJdGhpcy5xdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJzdHJhY3RJbWFnZUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJzdHJhY3RJbWFnZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmRmMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYnN0cmFjdEltYWdlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGltYWdlIGJ1aWxkZXJzLgorICogUHJvdmlkZXMgdGhlIGJ1aWxkaW5nIGFuZCBjb21waWxhdGlvbiBtZWNoYW5pc20KKyAqIGluIGNvbW1vbiB3aXRoIHRoZSBiYXRjaCBhbmQgaW5jcmVtZW50YWwgYnVpbGRlcnMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEltYWdlQnVpbGRlciBpbXBsZW1lbnRzIElDb21waWxlclJlcXVlc3RvciB7CisKK3Byb3RlY3RlZCBKYXZhQnVpbGRlciBqYXZhQnVpbGRlcjsKK3Byb3RlY3RlZCBTdGF0ZSBuZXdTdGF0ZTsKKworLy8gbG9jYWwgY29waWVzCitwcm90ZWN0ZWQgSUNvbnRhaW5lciBvdXRwdXRGb2xkZXI7Citwcm90ZWN0ZWQgSUNvbnRhaW5lcltdIHNvdXJjZUZvbGRlcnM7Citwcm90ZWN0ZWQgQnVpbGROb3RpZmllciBub3RpZmllcjsKKworcHJvdGVjdGVkIGJvb2xlYW4gaGFzU2VwYXJhdGVPdXRwdXRGb2xkZXI7Citwcm90ZWN0ZWQgTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudDsKK3Byb3RlY3RlZCBDb21waWxlciBjb21waWxlcjsKK3Byb3RlY3RlZCBXb3JrUXVldWUgd29ya1F1ZXVlOworcHJvdGVjdGVkIEFycmF5TGlzdCBwcm9ibGVtVHlwZUxvY2F0aW9uczsKK3Byb3RlY3RlZCBib29sZWFuIGNvbXBpbGVkQWxsQXRPbmNlOworCitwcml2YXRlIGJvb2xlYW4gaW5Db21waWxlcjsKKworcHVibGljIHN0YXRpYyBpbnQgTUFYX0FUX09OQ0UgPSAxMDAwOworCitwcm90ZWN0ZWQgQWJzdHJhY3RJbWFnZUJ1aWxkZXIoSmF2YUJ1aWxkZXIgamF2YUJ1aWxkZXIpIHsKKwl0aGlzLmphdmFCdWlsZGVyID0gamF2YUJ1aWxkZXI7CisJdGhpcy5uZXdTdGF0ZSA9IG5ldyBTdGF0ZShqYXZhQnVpbGRlcik7CisKKwkvLyBsb2NhbCBjb3BpZXMKKwl0aGlzLm91dHB1dEZvbGRlciA9IGphdmFCdWlsZGVyLm91dHB1dEZvbGRlcjsKKwl0aGlzLnNvdXJjZUZvbGRlcnMgPSBqYXZhQnVpbGRlci5zb3VyY2VGb2xkZXJzOworCXRoaXMubm90aWZpZXIgPSBqYXZhQnVpbGRlci5ub3RpZmllcjsKKworCS8vIG9ubHkgcGVyZm9ybSByZXNvdXJjZSBjb3B5aW5nIGlmIHRoZSBvdXRwdXQgbG9jYXRpb24gZG9lcyBub3QgbWF0Y2ggYSBzb3VyY2UgZm9sZGVyCisJLy8gY29ycmVzcG9uZHMgdG86IHByb2plY3QgPT0gc3JjID09IGJpbiwgb3Igc2V2ZXJhbCBzb3VyY2UgZm9sZGVycyBhcmUgY29udHJpYnV0aW5nIHJlc291cmNlcywKKwkvLyBidXQgb25lIGlzIHRoZSBvdXRwdXQgbG9jYXRpb24gdG9vIChhbmQgd291bGQgZ2V0IHBvcHVsYXRlZCB3aXRoIG90aGVyIHNvdXJjZSBmb2xkZXIgcmVzb3VyY2VzKS4KKwlJUGF0aCBvdXRwdXRQYXRoID0gb3V0cHV0Rm9sZGVyLmdldEZ1bGxQYXRoKCk7CisJaW50IGluZGV4ID0gc291cmNlRm9sZGVycy5sZW5ndGg7CisJaWYgKGluZGV4ID09IDApIHsKKwkJLy8gaGFuZGxlIGNhc2Ugb2YgdGhlIGxhc3Qgc291cmNlIGZvbGRlciBpcyByZW1vdmVkLi4uIHNvIG5vIHNvdXJjZSBmb2xkZXJzIGV4aXN0IGJ1dCB0aGUgb3V0cHV0IGZvbGRlciBtdXN0IHN0aWxsIGJlIHNjcnViYmVkCisJCXRoaXMuaGFzU2VwYXJhdGVPdXRwdXRGb2xkZXIgPSAhb3V0cHV0UGF0aC5lcXVhbHMoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QuZ2V0RnVsbFBhdGgoKSk7CisJfSBlbHNlIHsKKwkJdGhpcy5oYXNTZXBhcmF0ZU91dHB1dEZvbGRlciA9IHRydWU7CisJCXdoaWxlICh0aGlzLmhhc1NlcGFyYXRlT3V0cHV0Rm9sZGVyICYmIC0taW5kZXggPj0gMCkKKwkJCXRoaXMuaGFzU2VwYXJhdGVPdXRwdXRGb2xkZXIgPSAhb3V0cHV0UGF0aC5lcXVhbHMoc291cmNlRm9sZGVyc1tpbmRleF0uZ2V0RnVsbFBhdGgoKSk7CisJfQorCisJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuZXcgTmFtZUVudmlyb25tZW50KGphdmFCdWlsZGVyLmNsYXNzcGF0aCk7CisJdGhpcy5jb21waWxlciA9IG5ld0NvbXBpbGVyKCk7CisJdGhpcy53b3JrUXVldWUgPSBuZXcgV29ya1F1ZXVlKCk7CisJdGhpcy5wcm9ibGVtVHlwZUxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoMyk7Cit9CisKK3B1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCByZXN1bHQpIHsKKwkvLyBJbiBCYXRjaCBtb2RlLCB3ZSB3cml0ZSBvdXQgdGhlIGNsYXNzIGZpbGVzLCBob2xkIG9udG8gdGhlIGRlcGVuZGVuY3kgaW5mbworCS8vICYgYWRkaXRpb25hbCB0eXBlcyBhbmQgcmVwb3J0IHByb2JsZW1zLgorCisJLy8gSW4gSW5jcmVtZW50YWwgbW9kZSwgd2hlbiB3cml0aW5nIG91dCBhIGNsYXNzIGZpbGUgd2UgbmVlZCB0byBjb21wYXJlIGl0CisJLy8gYWdhaW5zdCB0aGUgcHJldmlvdXMgZmlsZSwgcmVtZW1iZXJpbmcgaWYgc3RydWN0dXJhbCBjaGFuZ2VzIG9jY3VyZWQuCisJLy8gQmVmb3JlIHJlcG9ydGluZyB0aGUgbmV3IHByb2JsZW1zLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBjb3VudCAmCisJLy8gcmVtb3ZlIHRoZSBvbGQgcHJvYmxlbXMuIFBsdXMgZGVsZXRlIGFkZGl0aW9uYWwgY2xhc3MgZmlsZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCisKKwkvLyBvbmx5IG5lZWQgdG8gZmluZCByZXNvdXJjZSBmb3IgdGhlIHNvdXJjZUxvY2F0aW9uIHdoZW4gcHJvYmxlbXMgbmVlZCB0byBiZSByZXBvcnRlZCBhZ2FpbnN0IGl0CisJU3RyaW5nIHNvdXJjZUxvY2F0aW9uID0gbmV3IFN0cmluZyhyZXN1bHQuZ2V0RmlsZU5hbWUoKSk7IC8vIHRoZSBmdWxsIGZpbGVzeXN0ZW0gcGF0aCAiZDoveHl6L2VjbGlwc2Uvc3JjMS9UZXN0L3AxL3AyL0EuamF2YSIKKwlpZiAoIXdvcmtRdWV1ZS5pc0NvbXBpbGVkKHNvdXJjZUxvY2F0aW9uKSkgeworCQl0cnkgeworCQkJd29ya1F1ZXVlLmZpbmlzaGVkKHNvdXJjZUxvY2F0aW9uKTsKKwkJCXVwZGF0ZVByb2JsZW1zRm9yKHNvdXJjZUxvY2F0aW9uLCByZXN1bHQpOyAvLyByZWNvcmQgY29tcGlsYXRpb24gcHJvYmxlbXMgYmVmb3JlIHBvdGVudGlhbGx5IGFkZGluZyBkdXBsaWNhdGUgZXJyb3JzCisKKwkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcmVzdWx0LmdldENvbXBpbGF0aW9uVW5pdCgpOworCQkJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IHJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7CisJCQlpbnQgbGVuZ3RoID0gY2xhc3NGaWxlcy5sZW5ndGg7CisJCQlBcnJheUxpc3QgZHVwbGljYXRlVHlwZU5hbWVzID0gbnVsbDsKKwkJCUFycmF5TGlzdCBkZWZpbmVkVHlwZU5hbWVzID0gbmV3IEFycmF5TGlzdChsZW5ndGgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBjbGFzc0ZpbGVzW2ldOworCQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IGNsYXNzRmlsZS5nZXRDb21wb3VuZE5hbWUoKTsKKwkJCQljaGFyW10gdHlwZU5hbWUgPSBjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aCAtIDFdOworCQkJCWJvb2xlYW4gaXNOZXN0ZWRUeXBlID0gQ2hhck9wZXJhdGlvbi5jb250YWlucygnJCcsIHR5cGVOYW1lKTsKKworCQkJCS8vIExvb2sgZm9yIGEgcG9zc2libGUgY29sbGlzaW9uLCBpZiBvbmUgZXhpc3RzLCByZXBvcnQgYW4gZXJyb3IgYnV0IGRvIG5vdCB3cml0ZSB0aGUgY2xhc3MgZmlsZQorCQkJCWlmIChpc05lc3RlZFR5cGUpIHsKKwkJCQkJU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lID0gbmV3IFN0cmluZyhjbGFzc0ZpbGUub3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCkuZmlsZU5hbWUoKSk7CisJCQkJCWlmIChuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0aW9uKHF1YWxpZmllZFR5cGVOYW1lLCBzb3VyY2VMb2NhdGlvbikpCisJCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUgPSBuZXcgU3RyaW5nKGNsYXNzRmlsZS5maWxlTmFtZSgpKTsgLy8gdGhlIHF1YWxpZmllZCB0eXBlIG5hbWUgInAxL3AyL0EiCisJCQkJCWlmIChuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0aW9uKHF1YWxpZmllZFR5cGVOYW1lLCBzb3VyY2VMb2NhdGlvbikpIHsKKwkJCQkJCWlmIChkdXBsaWNhdGVUeXBlTmFtZXMgPT0gbnVsbCkKKwkJCQkJCQlkdXBsaWNhdGVUeXBlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCQlkdXBsaWNhdGVUeXBlTmFtZXMuYWRkKGNvbXBvdW5kTmFtZSk7CisJCQkJCQljcmVhdGVFcnJvckZvcihyZXNvdXJjZUZvckxvY2F0aW9uKHNvdXJjZUxvY2F0aW9uKSwgVXRpbC5iaW5kKCJidWlsZC5kdXBsaWNhdGVDbGFzc0ZpbGUiLCBuZXcgU3RyaW5nKHR5cGVOYW1lKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQluZXdTdGF0ZS5yZWNvcmRMb2NhdGlvbkZvclR5cGUocXVhbGlmaWVkVHlwZU5hbWUsIHNvdXJjZUxvY2F0aW9uKTsKKwkJCQl9CisJCQkJZGVmaW5lZFR5cGVOYW1lcy5hZGQod3JpdGVDbGFzc0ZpbGUoY2xhc3NGaWxlLCAhaXNOZXN0ZWRUeXBlKSk7CisJCQl9CisKKwkJCWZpbmlzaGVkV2l0aChzb3VyY2VMb2NhdGlvbiwgcmVzdWx0LCBjb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCksIGRlZmluZWRUeXBlTmFtZXMsIGR1cGxpY2F0ZVR5cGVOYW1lcyk7CisJCQlub3RpZmllci5jb21waWxlZChjb21waWxhdGlvblVuaXQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWwubG9nKGUsICJKYXZhQnVpbGRlciBoYW5kbGluZyBDb3JlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNyZWF0ZUVycm9yRm9yKHJlc291cmNlRm9yTG9jYXRpb24oc291cmNlTG9jYXRpb24pLCBVdGlsLmJpbmQoImJ1aWxkLmluY29uc2lzdGVudENsYXNzRmlsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgeworCXRoaXMubmFtZUVudmlyb25tZW50LmNsZWFudXAoKTsKKworCXRoaXMuamF2YUJ1aWxkZXIgPSBudWxsOworCXRoaXMub3V0cHV0Rm9sZGVyID0gbnVsbDsKKwl0aGlzLnNvdXJjZUZvbGRlcnMgPSBudWxsOworCXRoaXMubm90aWZpZXIgPSBudWxsOworCXRoaXMuY29tcGlsZXIgPSBudWxsOworCXRoaXMubmFtZUVudmlyb25tZW50ID0gbnVsbDsKKwl0aGlzLndvcmtRdWV1ZSA9IG51bGw7CisJdGhpcy5wcm9ibGVtVHlwZUxvY2F0aW9ucyA9IG51bGw7Cit9CisKKy8qIENvbXBpbGUgdGhlIGdpdmVuIGVsZW1lbnRzLCBhZGRpbmcgbW9yZSBlbGVtZW50cyB0byB0aGUgd29yayBxdWV1ZSAKKyogaWYgdGhleSBhcmUgYWZmZWN0ZWQgYnkgdGhlIGNoYW5nZXMuCisqLworcHJvdGVjdGVkIHZvaWQgY29tcGlsZShTdHJpbmdbXSBmaWxlbmFtZXMsIFN0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXMpIHsKKwlpbnQgdG9EbyA9IGZpbGVuYW1lcy5sZW5ndGg7CisJaWYgKHRoaXMuY29tcGlsZWRBbGxBdE9uY2UgPSB0b0RvIDw9IE1BWF9BVF9PTkNFKSB7CisJCS8vIGRvIHRoZW0gYWxsIG5vdworCQlTb3VyY2VGaWxlW10gdG9Db21waWxlID0gbmV3IFNvdXJjZUZpbGVbdG9Eb107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9EbzsgaSsrKSB7CisJCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlbmFtZXNbaV07CisJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm91dCB0byBjb21waWxlICIgKyBmaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXRvQ29tcGlsZVtpXSA9IG5ldyBTb3VyY2VGaWxlKGZpbGVuYW1lLCBpbml0aWFsVHlwZU5hbWVzW2ldKTsKKwkJfQorCQljb21waWxlKHRvQ29tcGlsZSwgaW5pdGlhbFR5cGVOYW1lcywgbnVsbCk7CisJfSBlbHNlIHsKKwkJaW50IGkgPSAwOworCQlib29sZWFuIGNvbXBpbGluZ0ZpcnN0R3JvdXAgPSB0cnVlOworCQl3aGlsZSAoaSA8IHRvRG8pIHsKKwkJCWludCBkb05vdyA9IHRvRG8gPCBNQVhfQVRfT05DRSA/IHRvRG8gOiBNQVhfQVRfT05DRTsKKwkJCWludCBpbmRleCA9IDA7CisJCQlTb3VyY2VGaWxlW10gdG9Db21waWxlID0gbmV3IFNvdXJjZUZpbGVbZG9Ob3ddOworCQkJU3RyaW5nW10gaW5pdGlhbE5hbWVzSW5Mb29wID0gbmV3IFN0cmluZ1tkb05vd107CisJCQl3aGlsZSAoaSA8IHRvRG8gJiYgaW5kZXggPCBkb05vdykgeworCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVuYW1lc1tpXTsKKwkJCQkvLyBBbHRob3VnaCBpdCBuZWVkZWQgY29tcGlsaW5nIHdoZW4gdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCwgaXQgbWF5IGhhdmUKKwkJCQkvLyBhbHJlYWR5IGJlZW4gY29tcGlsZWQgd2hlbiBpdCB3YXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIHVuaXQuCisJCQkJaWYgKGNvbXBpbGluZ0ZpcnN0R3JvdXAgfHwgd29ya1F1ZXVlLmlzV2FpdGluZyhmaWxlbmFtZSkpIHsKKwkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm91dCB0byBjb21waWxlICIgKyBmaWxlbmFtZSk7Ly8kTk9OLU5MUy0xJAorCQkJCQlTdHJpbmcgaW5pdGlhbFR5cGVOYW1lID0gaW5pdGlhbFR5cGVOYW1lc1tpXTsKKwkJCQkJaW5pdGlhbE5hbWVzSW5Mb29wW2luZGV4XSA9IGluaXRpYWxUeXBlTmFtZTsKKwkJCQkJdG9Db21waWxlW2luZGV4KytdID0gbmV3IFNvdXJjZUZpbGUoZmlsZW5hbWUsIGluaXRpYWxUeXBlTmFtZSk7CisJCQkJfQorCQkJCWkrKzsKKwkJCX0KKwkJCWlmIChpbmRleCA8IGRvTm93KSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0b0NvbXBpbGUsIDAsIHRvQ29tcGlsZSA9IG5ldyBTb3VyY2VGaWxlW2luZGV4XSwgMCwgaW5kZXgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoaW5pdGlhbE5hbWVzSW5Mb29wLCAwLCBpbml0aWFsTmFtZXNJbkxvb3AgPSBuZXcgU3RyaW5nW2luZGV4XSwgMCwgaW5kZXgpOworCQkJfQorCQkJU3RyaW5nW10gYWRkaXRpb25hbEZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbdG9EbyAtIGldOworCQkJU3lzdGVtLmFycmF5Y29weShmaWxlbmFtZXMsIGksIGFkZGl0aW9uYWxGaWxlbmFtZXMsIDAsIGFkZGl0aW9uYWxGaWxlbmFtZXMubGVuZ3RoKTsKKwkJCWNvbXBpbGluZ0ZpcnN0R3JvdXAgPSBmYWxzZTsKKwkJCWNvbXBpbGUodG9Db21waWxlLCBpbml0aWFsTmFtZXNJbkxvb3AsIGFkZGl0aW9uYWxGaWxlbmFtZXMpOworCQl9CisJfQorfQorCit2b2lkIGNvbXBpbGUoU291cmNlRmlsZVtdIHVuaXRzLCBTdHJpbmdbXSBpbml0aWFsVHlwZU5hbWVzLCBTdHJpbmdbXSBhZGRpdGlvbmFsRmlsZW5hbWVzKSB7CisJaWYgKHVuaXRzLmxlbmd0aCA9PSAwKSByZXR1cm47CisJbm90aWZpZXIuYWJvdXRUb0NvbXBpbGUodW5pdHNbMF0pOyAvLyBqdXN0IHRvIGNoYW5nZSB0aGUgbWVzc2FnZQorCisJLy8gZXh0ZW5kIGFkZGl0aW9uYWxGaWxlbmFtZXMgd2l0aCBhbGwgaGllcmFyY2hpY2FsIHByb2JsZW0gdHlwZXMgZm91bmQgZHVyaW5nIHRoaXMgZW50aXJlIGJ1aWxkCisJaWYgKCFwcm9ibGVtVHlwZUxvY2F0aW9ucy5pc0VtcHR5KCkpIHsKKwkJaW50IHRvQWRkID0gcHJvYmxlbVR5cGVMb2NhdGlvbnMuc2l6ZSgpOworCQlpbnQgbGVuZ3RoID0gYWRkaXRpb25hbEZpbGVuYW1lcyA9PSBudWxsID8gMCA6IGFkZGl0aW9uYWxGaWxlbmFtZXMubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDApCisJCQlhZGRpdGlvbmFsRmlsZW5hbWVzID0gbmV3IFN0cmluZ1t0b0FkZF07CisJCWVsc2UKKwkJCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25hbEZpbGVuYW1lcywgMCwgYWRkaXRpb25hbEZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbbGVuZ3RoICsgdG9BZGRdLCAwLCBsZW5ndGgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQWRkOyBpKyspCisJCQlhZGRpdGlvbmFsRmlsZW5hbWVzW2xlbmd0aCArIGldID0gKFN0cmluZykgcHJvYmxlbVR5cGVMb2NhdGlvbnMuZ2V0KGkpOworCX0KKwluYW1lRW52aXJvbm1lbnQuc2V0TmFtZXMoaW5pdGlhbFR5cGVOYW1lcywgYWRkaXRpb25hbEZpbGVuYW1lcyk7CisJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwl0cnkgeworCQlpbkNvbXBpbGVyID0gdHJ1ZTsKKwkJY29tcGlsZXIuY29tcGlsZSh1bml0cyk7CisJfSBmaW5hbGx5IHsKKwkJaW5Db21waWxlciA9IGZhbHNlOworCX0KKwkvLyBDaGVjayBmb3IgY2FuY2VsIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29tcGlsZSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5CisJLy8gaGF2ZSBiZWVuIGNhbmNlbGxlZCBidXQgd2l0aG91dCBwcm9wYWdhdGluZyB0aGUgY29ycmVjdCBleGNlcHRpb24KKwlub3RpZmllci5jaGVja0NhbmNlbCgpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFcnJvckZvcihJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlKSB7CisJdHJ5IHsKKwkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSmF2YUJ1aWxkZXIuUHJvYmxlbU1hcmtlclRhZyk7CisJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAorCQkJbmV3IFN0cmluZ1tdIHtJTWFya2VyLk1FU1NBR0UsIElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuQ0hBUl9TVEFSVCwgSU1hcmtlci5DSEFSX0VORH0sCisJCQluZXcgT2JqZWN0W10ge21lc3NhZ2UsIG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpLCBuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSl9KTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgaW50ZXJuYWxFeGNlcHRpb24oZSk7CisJfQorfQorCitwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RUeXBlTmFtZUZyb20oU3RyaW5nIHNvdXJjZUxvY2F0aW9uKSB7CisJZm9yIChpbnQgaiA9IDAsIGsgPSBzb3VyY2VGb2xkZXJzLmxlbmd0aDsgaiA8IGs7IGorKykgeworCQlTdHJpbmcgZm9sZGVyTG9jYXRpb24gPSBzb3VyY2VGb2xkZXJzW2pdLmdldExvY2F0aW9uKCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpOworCQlpZiAoc291cmNlTG9jYXRpb24uc3RhcnRzV2l0aChmb2xkZXJMb2NhdGlvbikpCisJCQlyZXR1cm4gc291cmNlTG9jYXRpb24uc3Vic3RyaW5nKGZvbGRlckxvY2F0aW9uLmxlbmd0aCgpLCBzb3VyY2VMb2NhdGlvbi5sZW5ndGgoKSAtIDUpOyAvLyBsZW5ndGggb2YgIi5qYXZhIgorCX0KKwlyZXR1cm4gc291cmNlTG9jYXRpb247IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorfQorCitwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFdpdGgoU3RyaW5nIHNvdXJjZUxvY2F0aW9uLCBDb21waWxhdGlvblJlc3VsdCByZXN1bHQsIGNoYXJbXSBtYWluVHlwZU5hbWUsIEFycmF5TGlzdCBkZWZpbmVkVHlwZU5hbWVzLCBBcnJheUxpc3QgZHVwbGljYXRlVHlwZU5hbWVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKGR1cGxpY2F0ZVR5cGVOYW1lcyA9PSBudWxsKSB7CisJCW5ld1N0YXRlLnJlY29yZChzb3VyY2VMb2NhdGlvbiwgcmVzdWx0LnF1YWxpZmllZFJlZmVyZW5jZXMsIHJlc3VsdC5zaW1wbGVOYW1lUmVmZXJlbmNlcywgbWFpblR5cGVOYW1lLCBkZWZpbmVkVHlwZU5hbWVzKTsKKwkJcmV0dXJuOworCX0KKworCWNoYXJbXVtdW10gcXVhbGlmaWVkUmVmcyA9IHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzOworCWNoYXJbXVtdIHNpbXBsZVJlZnMgPSByZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXM7CisJLy8gZm9yIGVhY2ggZHVwbGljYXRlIHR5cGUgcDEucDIuQSwgYWRkIHRoZSB0eXBlIG5hbWUgQSAocGFja2FnZSB3YXMgYWxyZWFkeSBhZGRlZCkKKwluZXh0IDogZm9yIChpbnQgaSA9IDAsIGRMZW5ndGggPSBkdXBsaWNhdGVUeXBlTmFtZXMuc2l6ZSgpOyBpIDwgZExlbmd0aDsgaSsrKSB7CisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IChjaGFyW11bXSkgZHVwbGljYXRlVHlwZU5hbWVzLmdldChpKTsKKwkJY2hhcltdIHR5cGVOYW1lID0gY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXTsKKwkJaW50IHNMZW5ndGggPSBzaW1wbGVSZWZzLmxlbmd0aDsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBzTGVuZ3RoOyBqKyspCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2ltcGxlUmVmc1tqXSwgdHlwZU5hbWUpKQorCQkJCWNvbnRpbnVlIG5leHQ7CisJCVN5c3RlbS5hcnJheWNvcHkoc2ltcGxlUmVmcywgMCwgc2ltcGxlUmVmcyA9IG5ldyBjaGFyW3NMZW5ndGggKyAxXVtdLCAwLCBzTGVuZ3RoKTsKKwkJc2ltcGxlUmVmc1tzTGVuZ3RoXSA9IHR5cGVOYW1lOworCX0KKwluZXdTdGF0ZS5yZWNvcmQoc291cmNlTG9jYXRpb24sIHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7Cit9CisKK3Byb3RlY3RlZCBJQ29udGFpbmVyIGdldE91dHB1dEZvbGRlcihJUGF0aCBwYWNrYWdlUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlGb2xkZXIgZm9sZGVyID0gb3V0cHV0Rm9sZGVyLmdldEZvbGRlcihwYWNrYWdlUGF0aCk7CisJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJZ2V0T3V0cHV0Rm9sZGVyKHBhY2thZ2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7CisJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7CisJCWZvbGRlci5zZXREZXJpdmVkKHRydWUpOworCX0KKwlyZXR1cm4gZm9sZGVyOworfQorCitwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiBpbnRlcm5hbEV4Y2VwdGlvbihDb3JlRXhjZXB0aW9uIHQpIHsKKwlJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiBpbWFnZUJ1aWxkZXJFeGNlcHRpb24gPSBuZXcgSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24odCk7CisJaWYgKGluQ29tcGlsZXIpCisJCXJldHVybiBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBpbWFnZUJ1aWxkZXJFeGNlcHRpb24pOworCXJldHVybiBpbWFnZUJ1aWxkZXJFeGNlcHRpb247Cit9CisKK3Byb3RlY3RlZCBDb21waWxlciBuZXdDb21waWxlcigpIHsKKwkvLyBjYWxsZWQgb25jZSB3aGVuIHRoZSBidWlsZGVyIGlzIGluaXRpYWxpemVkLi4uIGNhbiBvdmVycmlkZSBpZiBuZWVkZWQKKwlyZXR1cm4gbmV3IENvbXBpbGVyKAorCQluYW1lRW52aXJvbm1lbnQsCisJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCisJCXRoaXMsCisJCVByb2JsZW1GYWN0b3J5LmdldFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKTsKK30KKworcHJvdGVjdGVkIElSZXNvdXJjZSByZXNvdXJjZUZvckxvY2F0aW9uKFN0cmluZyBzb3VyY2VMb2NhdGlvbikgeworCXJldHVybiBqYXZhQnVpbGRlci53b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChzb3VyY2VMb2NhdGlvbikpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBtYXJrZXIgZnJvbSBlYWNoIHByb2JsZW0gYW5kIGFkZHMgaXQgdG8gdGhlIHJlc291cmNlLgorICogVGhlIG1hcmtlciBpcyBhcyBmb2xsb3dzOgorICogICAtIGl0cyB0eXBlIGlzIFRfUFJPQkxFTQorICogICAtIGl0cyBwbHVnaW4gSUQgaXMgdGhlIEphdmFCdWlsZGVyJ3MgcGx1Z2luIElECisgKgkgLSBpdHMgbWVzc2FnZSBpcyB0aGUgcHJvYmxlbSdzIG1lc3NhZ2UKKyAqCSAtIGl0cyBwcmlvcml0eSByZWZsZWN0cyB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0KKyAqCSAtIGl0cyByYW5nZSBpcyB0aGUgcHJvYmxlbSdzIHJhbmdlCisgKgkgLSBpdCBoYXMgYW4gZXh0cmEgYXR0cmlidXRlICJJRCIgd2hpY2ggaG9sZHMgdGhlIHByb2JsZW0ncyBpZAorICovCitwcm90ZWN0ZWQgdm9pZCBzdG9yZVByb2JsZW1zRm9yKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2JsZW1bXSBwcm9ibGVtcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHByb2JsZW1zID09IG51bGwgfHwgcHJvYmxlbXMubGVuZ3RoID09IDApIHJldHVybjsKKworCVN0cmluZyBtaXNzaW5nQ2xhc3NGaWxlID0gbnVsbDsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOworCQlpbnQgaWQgPSBwcm9ibGVtLmdldElEKCk7CisJCXN3aXRjaCAoaWQpIHsKKwkJCWNhc2UgSVByb2JsZW0uSXNDbGFzc1BhdGhDb3JyZWN0IDoKKwkJCQlKYXZhQnVpbGRlci5yZW1vdmVQcm9ibGVtc0ZvcihqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKKwkJCQlTdHJpbmdbXSBhcmdzID0gcHJvYmxlbS5nZXRBcmd1bWVudHMoKTsKKwkJCQltaXNzaW5nQ2xhc3NGaWxlID0gYXJnc1swXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVByb2JsZW0uU3VwZXJjbGFzc011c3RCZUFDbGFzcyA6CisJCQljYXNlIElQcm9ibGVtLlN1cGVySW50ZXJmYWNlTXVzdEJlQW5JbnRlcmZhY2UgOgorCQkJY2FzZSBJUHJvYmxlbS5IaWVyYXJjaHlDaXJjdWxhcml0eVNlbGZSZWZlcmVuY2UgOgorCQkJY2FzZSBJUHJvYmxlbS5IaWVyYXJjaHlDaXJjdWxhcml0eSA6CisJCQljYXNlIElQcm9ibGVtLkhpZXJhcmNoeUhhc1Byb2JsZW1zIDoKKwkJCWNhc2UgSVByb2JsZW0uU3VwZXJjbGFzc05vdEZvdW5kIDoKKwkJCWNhc2UgSVByb2JsZW0uU3VwZXJjbGFzc05vdFZpc2libGUgOgorCQkJY2FzZSBJUHJvYmxlbS5TdXBlcmNsYXNzQW1iaWd1b3VzIDoKKwkJCWNhc2UgSVByb2JsZW0uU3VwZXJjbGFzc0ludGVybmFsTmFtZVByb3ZpZGVkIDoKKwkJCWNhc2UgSVByb2JsZW0uU3VwZXJjbGFzc0luaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJY2FzZSBJUHJvYmxlbS5JbnRlcmZhY2VOb3RGb3VuZCA6CisJCQljYXNlIElQcm9ibGVtLkludGVyZmFjZU5vdFZpc2libGUgOgorCQkJY2FzZSBJUHJvYmxlbS5JbnRlcmZhY2VBbWJpZ3VvdXMgOgorCQkJY2FzZSBJUHJvYmxlbS5JbnRlcmZhY2VJbnRlcm5hbE5hbWVQcm92aWRlZCA6CisJCQljYXNlIElQcm9ibGVtLkludGVyZmFjZUluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgorCQkJCS8vIGVuc3VyZSB0aGF0IHRoaXMgZmlsZSBpcyBhbHdheXMgcmV0cmlldmVkIGZyb20gc291cmNlIGZvciB0aGUgcmVzdCBvZiB0aGUgYnVpbGQKKwkJCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOworCQkJCWlmICghcHJvYmxlbVR5cGVMb2NhdGlvbnMuY29udGFpbnMoZmlsZUxvY2F0aW9uKSkKKwkJCQkJcHJvYmxlbVR5cGVMb2NhdGlvbnMuYWRkKGZpbGVMb2NhdGlvbik7CisJCX0KKworCQlJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihKYXZhQnVpbGRlci5Qcm9ibGVtTWFya2VyVGFnKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCisJCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSUphdmFNb2RlbE1hcmtlci5JRCwgSU1hcmtlci5DSEFSX1NUQVJULCBJTWFya2VyLkNIQVJfRU5ELCBJTWFya2VyLkxJTkVfTlVNQkVSLCBJSmF2YU1vZGVsTWFya2VyLkFSR1VNRU5UU30sCisJCQluZXcgT2JqZWN0W10geyAKKwkJCQlwcm9ibGVtLmdldE1lc3NhZ2UoKSwKKwkJCQluZXcgSW50ZWdlcihwcm9ibGVtLmlzRXJyb3IoKSA/IElNYXJrZXIuU0VWRVJJVFlfRVJST1IgOiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpLCAKKwkJCQluZXcgSW50ZWdlcihpZCksCisJCQkJbmV3IEludGVnZXIocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKSwKKwkJCQluZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZUVuZCgpICsgMSksCisJCQkJbmV3IEludGVnZXIocHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpLAorCQkJCVV0aWwuZ2V0UHJvYmxlbUFyZ3VtZW50c0Zvck1hcmtlcihwcm9ibGVtLmdldEFyZ3VtZW50cygpKQorCQkJfSk7CisKKwkJLy8gY29tcHV0ZSBhIHVzZXItZnJpZW5kbHkgbG9jYXRpb24KKwkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpOworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQpIHsgLy8gdHJ5IHRvIGZpbmQgYSBmaW5lciBncmFpbiBlbGVtZW50CisJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKKwkJCUlKYXZhRWxlbWVudCBmcmFnbWVudCA9IHVuaXQuZ2V0RWxlbWVudEF0KHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSk7CisJCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgZWxlbWVudCA9IGZyYWdtZW50OworCQl9CisJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSmF2YUVsZW1lbnQpCisJCQlsb2NhdGlvbiA9ICgoSmF2YUVsZW1lbnQpIGVsZW1lbnQpLnJlYWRhYmxlTmFtZSgpOworCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKKwkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgbG9jYXRpb24pOworCQlpZiAobWlzc2luZ0NsYXNzRmlsZSAhPSBudWxsKQorCQkJdGhyb3cgbmV3IE1pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24obWlzc2luZ0NsYXNzRmlsZSk7CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtc0ZvcihTdHJpbmcgc291cmNlTG9jYXRpb24sIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwlpZiAocHJvYmxlbXMgPT0gbnVsbCB8fCBwcm9ibGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOworCisJbm90aWZpZXIudXBkYXRlUHJvYmxlbUNvdW50cyhwcm9ibGVtcyk7CisJc3RvcmVQcm9ibGVtc0ZvcihyZXNvdXJjZUZvckxvY2F0aW9uKHNvdXJjZUxvY2F0aW9uKSwgcHJvYmxlbXMpOworfQorCitwcm90ZWN0ZWQgY2hhcltdIHdyaXRlQ2xhc3NGaWxlKENsYXNzRmlsZSBjbGFzc0ZpbGUsIGJvb2xlYW4gaXNTZWNvbmRhcnlUeXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJLy8gQmVmb3JlIHdyaXRpbmcgb3V0IHRoZSBjbGFzcyBmaWxlLCBjb21wYXJlIGl0IHRvIHRoZSBwcmV2aW91cyBmaWxlCisJLy8gSWYgc3RydWN0dXJhbCBjaGFuZ2VzIG9jY3VyZWQgdGhlbiBhZGQgZGVwZW5kZW50IHNvdXJjZSBmaWxlcworCVN0cmluZyBmaWxlTmFtZSA9IG5ldyBTdHJpbmcoY2xhc3NGaWxlLmZpbGVOYW1lKCkpOyAvLyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSAicDEvcDIvQSIKKwlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVOYW1lKTsJCQkKKwlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG91dHB1dEZvbGRlcjsKKwlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7CisJCWNvbnRhaW5lciA9IGdldE91dHB1dEZvbGRlcihmaWxlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOworCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVQYXRoLmxhc3RTZWdtZW50KCkpOworCX0KKworCUlGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKEphdmFCdWlsZGVyLkNMQVNTX0VYVEVOU0lPTikpOworCWJ5dGVbXSBieXRlcyA9IGNsYXNzRmlsZS5nZXRCeXRlcygpOworCWlmICh3cml0ZUNsYXNzRmlsZUNoZWNrKGZpbGUsIGZpbGVOYW1lLCBieXRlcywgaXNTZWNvbmRhcnlUeXBlKSkgeworCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKKwkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJZmlsZS5zZXREZXJpdmVkKHRydWUpOworCX0gZWxzZSBpZiAoSmF2YUJ1aWxkZXIuREVCVUcpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGVkIG92ZXIgdW5jaGFuZ2VkIGNsYXNzIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpKTsvLyROT04tTkxTLTEkCisJfQorCS8vIGFuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZmlsZSBhcyBpbiBZIG9yIFkkTQorCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpLnRvQ2hhckFycmF5KCk7Cit9CisKK3Byb3RlY3RlZCBib29sZWFuIHdyaXRlQ2xhc3NGaWxlQ2hlY2soSUZpbGUgZmlsZSwgU3RyaW5nIGZpbGVOYW1lLCBieXRlW10gYnl0ZXMsIGJvb2xlYW4gaXNTZWNvbmRhcnlUeXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJLy8gSW4gSW5jcmVtZW50YWwgbW9kZSwgY29tcGFyZSB0aGUgYnl0ZXMgYWdhaW5zdCB0aGUgcHJldmlvdXMgZmlsZSBmb3Igc3RydWN0dXJhbCBjaGFuZ2VzCisJcmV0dXJuIHRydWU7Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkYTJkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbiBleHRlbmRzIFJlZmVyZW5jZUNvbGxlY3Rpb24geworCitjaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzOworCitwcm90ZWN0ZWQgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKGNoYXJbXVtdIGRlZmluZWRUeXBlTmFtZXMsIGNoYXJbXVtdW10gcXVhbGlmaWVkUmVmZXJlbmNlcywgY2hhcltdW10gc2ltcGxlTmFtZVJlZmVyZW5jZXMpIHsKKwlzdXBlcihxdWFsaWZpZWRSZWZlcmVuY2VzLCBzaW1wbGVOYW1lUmVmZXJlbmNlcyk7CisJdGhpcy5kZWZpbmVkVHlwZU5hbWVzID0gZGVmaW5lZFR5cGVOYW1lczsgLy8gZG8gbm90IGJvdGhlciBpbnRlcm5pbmcgbWVtYmVyIHR5cGUgbmFtZXMgKGllLiAnQSRNJykKK30KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CYXRjaEltYWdlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CYXRjaEltYWdlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTNlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0JhdGNoSW1hZ2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgQmF0Y2hJbWFnZUJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdEltYWdlQnVpbGRlciB7CisKK3Byb3RlY3RlZCBCYXRjaEltYWdlQnVpbGRlcihKYXZhQnVpbGRlciBqYXZhQnVpbGRlcikgeworCXN1cGVyKGphdmFCdWlsZGVyKTsKK30KKworcHVibGljIHZvaWQgYnVpbGQoKSB7CisJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZVTEwgYnVpbGQiKTsgLy8kTk9OLU5MUy0xJAorCisJdHJ5IHsKKwkJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnNjcnViYmluZ091dHB1dCIpKTsgLy8kTk9OLU5MUy0xJAorCQlKYXZhQnVpbGRlci5yZW1vdmVQcm9ibGVtc0ZvcihqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CisJCXNjcnViT3V0cHV0Rm9sZGVyKCk7CisJCW5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4xZik7CisKKwkJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLmFuYWx5emluZ1NvdXJjZXMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJQXJyYXlMaXN0IGxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoMzMpOworCQlBcnJheUxpc3QgdHlwZU5hbWVzID0gbmV3IEFycmF5TGlzdCgzMyk7CisJCWFkZEFsbFNvdXJjZUZpbGVzKGxvY2F0aW9ucywgdHlwZU5hbWVzKTsKKwkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjE1Zik7CisKKwkJaWYgKGxvY2F0aW9ucy5zaXplKCkgPiAwKSB7CisJCQlTdHJpbmdbXSBhbGxTb3VyY2VGaWxlcyA9IG5ldyBTdHJpbmdbbG9jYXRpb25zLnNpemUoKV07CisJCQlsb2NhdGlvbnMudG9BcnJheShhbGxTb3VyY2VGaWxlcyk7CisJCQlTdHJpbmdbXSBpbml0aWFsVHlwZU5hbWVzID0gbmV3IFN0cmluZ1t0eXBlTmFtZXMuc2l6ZSgpXTsKKwkJCXR5cGVOYW1lcy50b0FycmF5KGluaXRpYWxUeXBlTmFtZXMpOworCisJCQlub3RpZmllci5zZXRQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdCgwLjc1ZiAvIGFsbFNvdXJjZUZpbGVzLmxlbmd0aCk7CisJCQl3b3JrUXVldWUuYWRkQWxsKGFsbFNvdXJjZUZpbGVzKTsKKwkJCWNvbXBpbGUoYWxsU291cmNlRmlsZXMsIGluaXRpYWxUeXBlTmFtZXMpOworCQl9CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IGludGVybmFsRXhjZXB0aW9uKGUpOworCX0gZmluYWxseSB7CisJCWNsZWFuVXAoKTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGFkZEFsbFNvdXJjZUZpbGVzKGZpbmFsIEFycmF5TGlzdCBsb2NhdGlvbnMsIGZpbmFsIEFycmF5TGlzdCB0eXBlTmFtZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc291cmNlRm9sZGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlmaW5hbCBpbnQgc3JjRm9sZGVyTGVuZ3RoID0gc291cmNlRm9sZGVyc1tpXS5nZXRMb2NhdGlvbigpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKS5sZW5ndGgoKTsKKwkJc291cmNlRm9sZGVyc1tpXS5hY2NlcHQoCisJCQluZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJaWYgKEphdmFCdWlsZGVyLkpBVkFfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeworCQkJCQkJCVN0cmluZyBzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKKwkJCQkJCQlsb2NhdGlvbnMuYWRkKHNvdXJjZUxvY2F0aW9uKTsKKwkJCQkJCQl0eXBlTmFtZXMuYWRkKHNvdXJjZUxvY2F0aW9uLnN1YnN0cmluZyhzcmNGb2xkZXJMZW5ndGgsIHNvdXJjZUxvY2F0aW9uLmxlbmd0aCgpIC0gNSkpOyAvLyBsZW5ndGggb2YgLmphdmEKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCSk7CisJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBzY3J1Yk91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAoaGFzU2VwYXJhdGVPdXRwdXRGb2xkZXIpIHsKKwkJLy8gb3V0cHV0UGF0aCBpcyBub3Qgb24gdGhlIGNsYXNzIHBhdGggc28gd2lwZSBpdCBjbGVhbiB0aGVuIGNvcHkgZXh0cmEgcmVzb3VyY2VzIGJhY2sKKwkJSVJlc291cmNlW10gbWVtYmVycyA9IG91dHB1dEZvbGRlci5tZW1iZXJzKCk7IAorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWVtYmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCW1lbWJlcnNbaV0uZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CisJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCWNvcHlFeHRyYVJlc291cmNlc0JhY2soKTsKKwl9IGVsc2UgeworCQkvLyBvdXRwdXRQYXRoID09IGEgc291cmNlIGZvbGRlciBzbyBqdXN0IHJlbW92ZSBjbGFzcyBmaWxlcworCQlvdXRwdXRGb2xkZXIuYWNjZXB0KAorCQkJbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCWlmIChKYXZhQnVpbGRlci5DTEFTU19FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQorCQkJCQkJCXJlc291cmNlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJKTsKKwl9CisJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY29weUV4dHJhUmVzb3VyY2VzQmFjaygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBXaGVuLCBpZiBldmVyLCBkb2VzIGEgYnVpbGRlciBuZWVkIHRvIGNvcHkgcmVzb3VyY2VzIGZpbGVzIChub3QgLmphdmEgb3IgLmNsYXNzKSBpbnRvIHRoZSBvdXRwdXQgZm9sZGVyPworCS8vIElmIHdlIHdpcGUgdGhlIG91dHB1dCBmb2xkZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVpbGQgdGhlbiBhbGwgJ2V4dHJhJyByZXNvdXJjZXMgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuCisKKwlmaW5hbCBJUGF0aCBvdXRwdXRQYXRoID0gb3V0cHV0Rm9sZGVyLmdldEZ1bGxQYXRoKCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIgPSBzb3VyY2VGb2xkZXJzW2ldOworCQlmaW5hbCBJUGF0aCBzb3VyY2VQYXRoID0gc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCk7CisJCWZpbmFsIGludCBzZWdtZW50Q291bnQgPSBzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpOworCQlzb3VyY2VGb2xkZXIuYWNjZXB0KAorCQkJbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCXN3aXRjaChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKKwkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkpBVkFfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgcmV0dXJuIGZhbHNlOworCQkJCQkJCWlmIChKYXZhQnVpbGRlci5DTEFTU19FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSByZXR1cm4gZmFsc2U7CisJCQkJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlclJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuIGZhbHNlOworCisJCQkJCQkJSVBhdGggcGFydGlhbFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KTsKKwkJCQkJCQlJUmVzb3VyY2UgY29waWVkUmVzb3VyY2UgPSBvdXRwdXRGb2xkZXIuZ2V0RmlsZShwYXJ0aWFsUGF0aCk7CisJCQkJCQkJaWYgKGNvcGllZFJlc291cmNlLmV4aXN0cygpKSB7CisJCQkJCQkJCWNyZWF0ZUVycm9yRm9yKHJlc291cmNlLCBVdGlsLmJpbmQoImJ1aWxkLmR1cGxpY2F0ZVJlc291cmNlIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcmVzb3VyY2UuY29weShjb3BpZWRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJCQljb3BpZWRSZXNvdXJjZS5zZXREZXJpdmVkKHRydWUpOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhvdXRwdXRQYXRoKSkgcmV0dXJuIGZhbHNlOworCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhzb3VyY2VQYXRoKSkgcmV0dXJuIHRydWU7CisJCQkJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlclJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuIGZhbHNlOworCisJCQkJCQkJZ2V0T3V0cHV0Rm9sZGVyKHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCSk7CisJfQorfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiYmF0Y2ggaW1hZ2UgYnVpbGRlciBmb3I6XG5cdG5ldyBzdGF0ZTogIiArIG5ld1N0YXRlOyAvLyROT04tTkxTLTEkCit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CdWlsZE5vdGlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0J1aWxkTm90aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQwZDdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CdWlsZE5vdGlmaWVyLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworcHVibGljIGNsYXNzIEJ1aWxkTm90aWZpZXIgeworCitwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOworcHJvdGVjdGVkIGludCByb290UGF0aExlbmd0aDsKK3Byb3RlY3RlZCBib29sZWFuIGNhbmNlbGxpbmc7Citwcm90ZWN0ZWQgZmxvYXQgcGVyY2VudENvbXBsZXRlOworcHJvdGVjdGVkIGZsb2F0IHByb2dyZXNzUGVyQ29tcGlsYXRpb25Vbml0OworcHJvdGVjdGVkIGludCBuZXdFcnJvckNvdW50OworcHJvdGVjdGVkIGludCBmaXhlZEVycm9yQ291bnQ7Citwcm90ZWN0ZWQgaW50IG5ld1dhcm5pbmdDb3VudDsKK3Byb3RlY3RlZCBpbnQgZml4ZWRXYXJuaW5nQ291bnQ7Citwcm90ZWN0ZWQgaW50IHdvcmtEb25lOworcHJvdGVjdGVkIGludCB0b3RhbFdvcms7Citwcm90ZWN0ZWQgU3RyaW5nIHByZXZpb3VzU3VidGFzazsKKworcHVibGljIEJ1aWxkTm90aWZpZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKKwl0cnkgeworCQlJUGF0aCBsb2NhdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRMb2NhdGlvbigpOworCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKKwkJCWxvY2F0aW9uID0gcHJvamVjdC5nZXRQYXJlbnQoKS5nZXRMb2NhdGlvbigpOyAvLyBkZWZhdWx0IHdvcmtzcGFjZSBsb2NhdGlvbgorCQllbHNlIGlmIChwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGxvY2F0aW9uLmxhc3RTZWdtZW50KCkpKQorCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZW1vdmVMYXN0U2VnbWVudHMoMSk7IC8vIHdhbnQgdG8gc2hvdyBwcm9qZWN0IG5hbWUgaWYgcG9zc2libGUKKwkJdGhpcy5yb290UGF0aExlbmd0aCA9IGxvY2F0aW9uLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKS5sZW5ndGgoKTsKKwl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQl0aGlzLnJvb3RQYXRoTGVuZ3RoID0gMDsKKwl9CisJdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7CisJdGhpcy5uZXdFcnJvckNvdW50ID0gMDsKKwl0aGlzLmZpeGVkRXJyb3JDb3VudCA9IDA7CisJdGhpcy5uZXdXYXJuaW5nQ291bnQgPSAwOworCXRoaXMuZml4ZWRXYXJuaW5nQ291bnQgPSAwOworCXRoaXMud29ya0RvbmUgPSAwOworCXRoaXMudG90YWxXb3JrID0gMTAwMDAwMDsKK30KKworLyoqCisgKiBOb3RpZmljYXRpb24gYmVmb3JlIGEgY29tcGlsZSB0aGF0IGEgdW5pdCBpcyBhYm91dCB0byBiZSBjb21waWxlZC4KKyAqLworcHVibGljIHZvaWQgYWJvdXRUb0NvbXBpbGUoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB7CisJU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKHVuaXQuZ2V0RmlsZU5hbWUoKSk7CisJbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXFwnLCAnLycpOworCWludCBlbmQgPSBtZXNzYWdlLmxhc3RJbmRleE9mKCcvJyk7CisJbWVzc2FnZSA9IFV0aWwuYmluZCgiYnVpbGQuY29tcGlsaW5nIiwgLy8kTk9OLU5MUy0xJAorCQltZXNzYWdlLnN1YnN0cmluZyhyb290UGF0aExlbmd0aCwgZW5kIDw9IHJvb3RQYXRoTGVuZ3RoID8gbWVzc2FnZS5sZW5ndGgoKSA6IGVuZCkpOworCXN1YlRhc2sobWVzc2FnZSk7Cit9CisKK3B1YmxpYyB2b2lkIGJlZ2luKCkgeworCWlmIChtb25pdG9yICE9IG51bGwpCisJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB0b3RhbFdvcmspOyAvLyROT04tTkxTLTEkCisJdGhpcy5wcmV2aW91c1N1YnRhc2sgPSBudWxsOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGJ1aWxkIGhhcyBiZWVuIGNhbmNlbGVkLgorICovCitwdWJsaWMgdm9pZCBjaGVja0NhbmNlbCgpIHsKKwlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBidWlsZCBoYXMgYmVlbiBjYW5jZWxlZC4KKyAqIE11c3QgdXNlIHRoaXMgY2FsbCBpbnN0ZWFkIG9mIGNoZWNrQ2FuY2VsKCkgd2hlbiB3aXRoaW4gdGhlIGNvbXBpbGVyLgorICovCitwdWJsaWMgdm9pZCBjaGVja0NhbmNlbFdpdGhpbkNvbXBpbGVyKCkgeworCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgIWNhbmNlbGxpbmcpIHsKKwkJLy8gT25jZSB0aGUgY29tcGlsZXIgaGFzIGJlZW4gY2FuY2VsZWQsIGRvbid0IGNoZWNrIGFnYWluLgorCQlzZXRDYW5jZWxsaW5nKHRydWUpOworCQkvLyBPbmx5IEFib3J0Q29tcGlsYXRpb24gY2FuIHN0b3AgdGhlIGNvbXBpbGVyIGNsZWFubHkuCisJCS8vIFdlIGNoZWNrIGNhbmNlbGF0aW9uIGFnYWluIGZvbGxvd2luZyB0aGUgY2FsbCB0byBjb21waWxlLgorCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBudWxsKTsgCisJfQorfQorCisvKioKKyAqIE5vdGlmaWNhdGlvbiB3aGlsZSB3aXRoaW4gYSBjb21waWxlIHRoYXQgYSB1bml0IGhhcyBmaW5pc2hlZCBiZWluZyBjb21waWxlZC4KKyAqLworcHVibGljIHZvaWQgY29tcGlsZWQoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB7CisJU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKHVuaXQuZ2V0RmlsZU5hbWUoKSk7CisJbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXFwnLCAnLycpOworCWludCBlbmQgPSBtZXNzYWdlLmxhc3RJbmRleE9mKCcvJyk7CisJbWVzc2FnZSA9IFV0aWwuYmluZCgiYnVpbGQuY29tcGlsaW5nIiwgLy8kTk9OLU5MUy0xJAorCQltZXNzYWdlLnN1YnN0cmluZyhyb290UGF0aExlbmd0aCwgZW5kIDw9IHJvb3RQYXRoTGVuZ3RoID8gbWVzc2FnZS5sZW5ndGgoKSA6IGVuZCkpOworCXN1YlRhc2sobWVzc2FnZSk7CisJdXBkYXRlUHJvZ3Jlc3NEZWx0YShwcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdCk7CisJY2hlY2tDYW5jZWxXaXRoaW5Db21waWxlcigpOworfQorCitwdWJsaWMgdm9pZCBkb25lKCkgeworCXVwZGF0ZVByb2dyZXNzKDEuMGYpOworCXN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5kb25lIikpOyAvLyROT04tTkxTLTEkCisJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJbW9uaXRvci5kb25lKCk7CisJdGhpcy5wcmV2aW91c1N1YnRhc2sgPSBudWxsOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbXMuCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgcHJvYmxlbXNNZXNzYWdlKCkgeworCWludCBudW1OZXcgPSBuZXdFcnJvckNvdW50ICsgbmV3V2FybmluZ0NvdW50OworCWludCBudW1GaXhlZCA9IGZpeGVkRXJyb3JDb3VudCArIGZpeGVkV2FybmluZ0NvdW50OworCWlmIChudW1OZXcgPT0gMCAmJiBudW1GaXhlZCA9PSAwKSByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwlpZiAobnVtRml4ZWQgPT0gMCkKKwkJcmV0dXJuICcoJyArIChudW1OZXcgPT0gMQorCQkJPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1Gb3VuZCIsIFN0cmluZy52YWx1ZU9mKG51bU5ldykpIC8vJE5PTi1OTFMtMSQKKwkJCTogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZvdW5kIiwgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkpICsgJyknOyAvLyROT04tTkxTLTEkCisJaWYgKG51bU5ldyA9PSAwKQorCQlyZXR1cm4gJygnICsgKG51bUZpeGVkID09IDEKKwkJCT8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRml4ZWQiLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpIC8vJE5PTi1OTFMtMSQKKwkJCTogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZpeGVkIiwgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4KKwkJJygnICsgKG51bUZpeGVkID09IDEKKwkJCT8gVXRpbC5iaW5kKCJidWlsZC5vbmVQcm9ibGVtRml4ZWQiLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpIC8vJE5PTi1OTFMtMSQKKwkJCTogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZpeGVkIiwgU3RyaW5nLnZhbHVlT2YobnVtRml4ZWQpKSkgLy8kTk9OLU5MUy0xJAorCQkrICIsICIgLy8kTk9OLU5MUy0xJAorCQkrIChudW1OZXcgPT0gMQorCQkJPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1Gb3VuZCIsIFN0cmluZy52YWx1ZU9mKG51bU5ldykpIC8vJE5PTi1OTFMtMSQKKwkJCTogVXRpbC5iaW5kKCJidWlsZC5wcm9ibGVtc0ZvdW5kIiwgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkpICsgJyknOyAvLyROT04tTkxTLTEkCit9CisKKy8qKgorICogU2V0cyB0aGUgY2FuY2VsbGluZyBmbGFnLCB3aGljaCBpbmRpY2F0ZXMgd2UgYXJlIGluIHRoZSBtaWRkbGUKKyAqIG9mIGJlaW5nIGNhbmNlbGxlZC4gIENlcnRhaW4gcGxhY2VzICh0aG9zZSBjYWxsYWJsZSBpbmRpcmVjdGx5IGZyb20gdGhlIGNvbXBpbGVyKQorICogc2hvdWxkIG5vdCBjaGVjayBjYW5jZWwgYWdhaW4gd2hpbGUgdGhpcyBpcyB0cnVlLCB0byBhdm9pZCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgorICogYmVpbmcgdGhyb3duIGF0IGFuIGlub3Bwb3J0dW5lIHRpbWUuCisgKi8KK3B1YmxpYyB2b2lkIHNldENhbmNlbGxpbmcoYm9vbGVhbiBjYW5jZWxsaW5nKSB7CisJdGhpcy5jYW5jZWxsaW5nID0gY2FuY2VsbGluZzsKK30KKworLyoqCisgKiBTZXRzIHRoZSBhbW91bnQgb2YgcHJvZ3Jlc3MgdG8gcmVwb3J0IGZvciBjb21waWxpbmcgZWFjaCBjb21waWxhdGlvbiB1bml0LgorICovCitwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc1BlckNvbXBpbGF0aW9uVW5pdChmbG9hdCBwcm9ncmVzcykgeworCXRoaXMucHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQgPSBwcm9ncmVzczsKK30KKworcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbWVzc2FnZSkgeworCVN0cmluZyBwbSA9IHByb2JsZW1zTWVzc2FnZSgpOworCVN0cmluZyBtc2cgPSBwbS5sZW5ndGgoKSA9PSAwID8gbWVzc2FnZSA6IHBtICsgIiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAorCisJaWYgKG1zZy5lcXVhbHModGhpcy5wcmV2aW91c1N1YnRhc2spKSByZXR1cm47IC8vIGF2b2lkIHJlZnJlc2hpbmcgd2l0aCBzYW1lIG9uZQorCS8vaWYgKEphdmFCdWlsZGVyLkRFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwlpZiAobW9uaXRvciAhPSBudWxsKQorCQltb25pdG9yLnN1YlRhc2sobXNnKTsKKworCXRoaXMucHJldmlvdXNTdWJ0YXNrID0gbXNnOworfQorCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtQ291bnRzKElQcm9ibGVtW10gbmV3UHJvYmxlbXMpIHsKKwlmb3IgKGludCBpID0gMCwgbmV3U2l6ZSA9IG5ld1Byb2JsZW1zLmxlbmd0aDsgaSA8IG5ld1NpemU7ICsraSkKKwkJaWYgKG5ld1Byb2JsZW1zW2ldLmlzRXJyb3IoKSkgbmV3RXJyb3JDb3VudCsrOyBlbHNlIG5ld1dhcm5pbmdDb3VudCsrOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgcHJvYmxlbSBjb3VudHMgZnJvbSBvbmUgY29tcGlsYXRpb24gcmVzdWx0IGdpdmVuIHRoZSBvbGQgYW5kIG5ldyBwcm9ibGVtcywKKyAqIGVpdGhlciBvZiB3aGljaCBtYXkgYmUgbnVsbC4KKyAqLworcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvYmxlbUNvdW50cyhJTWFya2VyW10gb2xkUHJvYmxlbXMsIElQcm9ibGVtW10gbmV3UHJvYmxlbXMpIHsKKwlpZiAobmV3UHJvYmxlbXMgIT0gbnVsbCkgeworCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIG5ld1NpemUgPSBuZXdQcm9ibGVtcy5sZW5ndGg7IGkgPCBuZXdTaXplOyArK2kpIHsKKwkJCUlQcm9ibGVtIG5ld1Byb2JsZW0gPSBuZXdQcm9ibGVtc1tpXTsKKwkJCWJvb2xlYW4gaXNFcnJvciA9IG5ld1Byb2JsZW0uaXNFcnJvcigpOworCQkJU3RyaW5nIG1lc3NhZ2UgPSBuZXdQcm9ibGVtLmdldE1lc3NhZ2UoKTsKKworCQkJaWYgKG9sZFByb2JsZW1zICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBqID0gMCwgb2xkU2l6ZSA9IG9sZFByb2JsZW1zLmxlbmd0aDsgaiA8IG9sZFNpemU7ICsraikgeworCQkJCQlJTWFya2VyIHBiID0gb2xkUHJvYmxlbXNbal07CisJCQkJCWlmIChwYiA9PSBudWxsKSBjb250aW51ZTsgLy8gYWxyZWFkeSBtYXRjaGVkIHVwIHdpdGggYSBuZXcgcHJvYmxlbQorCQkJCQlib29sZWFuIHdhc0Vycm9yID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUgorCQkJCQkJPT0gcGIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOworCQkJCQlpZiAoaXNFcnJvciA9PSB3YXNFcnJvciAmJiBtZXNzYWdlLmVxdWFscyhwYi5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW9sZFByb2JsZW1zW2pdID0gbnVsbDsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoaXNFcnJvcikgbmV3RXJyb3JDb3VudCsrOyBlbHNlIG5ld1dhcm5pbmdDb3VudCsrOworCQl9CisJfQorCWlmIChvbGRQcm9ibGVtcyAhPSBudWxsKSB7CisJCW5leHQgOiBmb3IgKGludCBpID0gMCwgb2xkU2l6ZSA9IG9sZFByb2JsZW1zLmxlbmd0aDsgaSA8IG9sZFNpemU7ICsraSkgeworCQkJSU1hcmtlciBvbGRQcm9ibGVtID0gb2xkUHJvYmxlbXNbaV07CisJCQlpZiAob2xkUHJvYmxlbSA9PSBudWxsKSBjb250aW51ZSBuZXh0OyAvLyBhbHJlYWR5IG1hdGNoZWQgdXAgd2l0aCBhIG5ldyBwcm9ibGVtCisJCQlib29sZWFuIHdhc0Vycm9yID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUgorCQkJCT09IG9sZFByb2JsZW0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOworCQkJU3RyaW5nIG1lc3NhZ2UgPSBvbGRQcm9ibGVtLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKTsgLy8kTk9OLU5MUy0xJAorCisJCQlpZiAobmV3UHJvYmxlbXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGogPSAwLCBuZXdTaXplID0gbmV3UHJvYmxlbXMubGVuZ3RoOyBqIDwgbmV3U2l6ZTsgKytqKSB7CisJCQkJCUlQcm9ibGVtIHBiID0gbmV3UHJvYmxlbXNbal07CisJCQkJCWlmICh3YXNFcnJvciA9PSBwYi5pc0Vycm9yKCkgJiYgbWVzc2FnZS5lcXVhbHMocGIuZ2V0TWVzc2FnZSgpKSkKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJfQorCQkJaWYgKHdhc0Vycm9yKSBmaXhlZEVycm9yQ291bnQrKzsgZWxzZSBmaXhlZFdhcm5pbmdDb3VudCsrOworCQl9CisJfQorfQorCitwdWJsaWMgdm9pZCB1cGRhdGVQcm9ncmVzcyhmbG9hdCBwZXJjZW50Q29tcGxldGUpIHsKKwlpZiAocGVyY2VudENvbXBsZXRlID4gdGhpcy5wZXJjZW50Q29tcGxldGUpIHsKKwkJdGhpcy5wZXJjZW50Q29tcGxldGUgPSBNYXRoLm1pbihwZXJjZW50Q29tcGxldGUsIDEuMGYpOworCQlpbnQgd29yayA9IE1hdGgucm91bmQodGhpcy5wZXJjZW50Q29tcGxldGUgKiB0aGlzLnRvdGFsV29yayk7CisJCWlmICh3b3JrID4gdGhpcy53b3JrRG9uZSkgeworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCQltb25pdG9yLndvcmtlZCh3b3JrIC0gdGhpcy53b3JrRG9uZSk7CisJCQkvL2lmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihqYXZhLnRleHQuTnVtYmVyRm9ybWF0LmdldFBlcmNlbnRJbnN0YW5jZSgpLmZvcm1hdCh0aGlzLnBlcmNlbnRDb21wbGV0ZSkpOworCQkJdGhpcy53b3JrRG9uZSA9IHdvcms7CisJCX0KKwl9Cit9CisKK3B1YmxpYyB2b2lkIHVwZGF0ZVByb2dyZXNzRGVsdGEoZmxvYXQgcGVyY2VudFdvcmtlZCkgeworCXVwZGF0ZVByb2dyZXNzKHBlcmNlbnRDb21wbGV0ZSArIHBlcmNlbnRXb3JrZWQpOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGZjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKKworY2xhc3MgQ2xhc3NwYXRoRGlyZWN0b3J5IGV4dGVuZHMgQ2xhc3NwYXRoTG9jYXRpb24geworCitTdHJpbmcgYmluYXJ5UGF0aDsgLy8gaW5jbHVkZXMgLmNsYXNzIGZpbGVzIGZvciBhIHNpbmdsZSBkaXJlY3RvcnkKK1NpbXBsZUxvb2t1cFRhYmxlIGRpcmVjdG9yeUNhY2hlOworU3RyaW5nW10gbWlzc2luZ1BhY2thZ2VIb2xkZXIgPSBuZXcgU3RyaW5nWzFdOworCitDbGFzc3BhdGhEaXJlY3RvcnkoU3RyaW5nIGJpbmFyeVBhdGgpIHsKKwl0aGlzLmJpbmFyeVBhdGggPSBiaW5hcnlQYXRoOworCWlmICghYmluYXJ5UGF0aC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCisJCXRoaXMuYmluYXJ5UGF0aCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKKworCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7Cit9CisKK3ZvaWQgY2xlYW51cCgpIHsKKwl0aGlzLmRpcmVjdG9yeUNhY2hlID0gbnVsbDsKK30KKworU3RyaW5nW10gZGlyZWN0b3J5TGlzdChTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlTdHJpbmdbXSBkaXJMaXN0ID0gKFN0cmluZ1tdKSBkaXJlY3RvcnlDYWNoZS5nZXQocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCWlmIChkaXJMaXN0ID09IG1pc3NpbmdQYWNrYWdlSG9sZGVyKSByZXR1cm4gbnVsbDsgLy8gcGFja2FnZSBleGlzdHMgaW4gYW5vdGhlciBjbGFzc3BhdGggZGlyZWN0b3J5IG9yIGphcgorCWlmIChkaXJMaXN0ICE9IG51bGwpIHJldHVybiBkaXJMaXN0OworCisJRmlsZSBkaXIgPSBuZXcgRmlsZShiaW5hcnlQYXRoICsgcXVhbGlmaWVkUGFja2FnZU5hbWUpOworCW5vdEZvdW5kIDogaWYgKGRpciAhPSBudWxsICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisJCS8vIG11c3QgcHJvdGVjdCBhZ2FpbnN0IGEgY2FzZSBpbnNlbnNpdGl2ZSBGaWxlIGNhbGwKKwkJLy8gd2FsayB0aGUgcXVhbGlmaWVkUGFja2FnZU5hbWUgYmFja3dhcmRzIGxvb2tpbmcgZm9yIGFuIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnLycKKwkJaW50IGluZGV4ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGVuZ3RoKCk7CisJCWludCBsYXN0ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGFzdEluZGV4T2YoJy8nKTsKKwkJd2hpbGUgKC0taW5kZXggPiBsYXN0ICYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UocXVhbGlmaWVkUGFja2FnZU5hbWUuY2hhckF0KGluZGV4KSkpIHt9CisJCWlmIChpbmRleCA+IGxhc3QpIHsKKwkJCWlmIChsYXN0ID09IC0xKSB7CisJCQkJaWYgKCFkb2VzRmlsZUV4aXN0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCAiIikpIC8vJE5PTi1OTFMtMSQgCisJCQkJCWJyZWFrIG5vdEZvdW5kOworCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRQYWNrYWdlTmFtZS5zdWJzdHJpbmcobGFzdCArIDEpOworCQkJCVN0cmluZyBwYXJlbnRQYWNrYWdlID0gcXVhbGlmaWVkUGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJCWlmICghZG9lc0ZpbGVFeGlzdChwYWNrYWdlTmFtZSwgcGFyZW50UGFja2FnZSkpCisJCQkJCWJyZWFrIG5vdEZvdW5kOworCQkJfQorCQl9CisJCWlmICgoZGlyTGlzdCA9IGRpci5saXN0KCkpID09IG51bGwpCisJCQlkaXJMaXN0ID0gbmV3IFN0cmluZ1swXTsKKwkJZGlyZWN0b3J5Q2FjaGUucHV0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCBkaXJMaXN0KTsKKwkJcmV0dXJuIGRpckxpc3Q7CisJfQorCWRpcmVjdG9yeUNhY2hlLnB1dChxdWFsaWZpZWRQYWNrYWdlTmFtZSwgbWlzc2luZ1BhY2thZ2VIb2xkZXIpOworCXJldHVybiBudWxsOworfQorCitib29sZWFuIGRvZXNGaWxlRXhpc3QoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlTdHJpbmdbXSBkaXJMaXN0ID0gZGlyZWN0b3J5TGlzdChxdWFsaWZpZWRQYWNrYWdlTmFtZSk7CisJaWYgKGRpckxpc3QgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBtb3N0IGNvbW1vbiBjYXNlCisKKwlmb3IgKGludCBpID0gZGlyTGlzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKGZpbGVOYW1lLmVxdWFscyhkaXJMaXN0W2ldKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisJaWYgKCEobyBpbnN0YW5jZW9mIENsYXNzcGF0aERpcmVjdG9yeSkpIHJldHVybiBmYWxzZTsKKworCXJldHVybiBiaW5hcnlQYXRoLmVxdWFscygoKENsYXNzcGF0aERpcmVjdG9yeSkgbykuYmluYXJ5UGF0aCk7Cit9IAorCitOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKKwlpZiAoIWRvZXNGaWxlRXhpc3QoYmluYXJ5RmlsZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lKSkgcmV0dXJuIG51bGw7IC8vIG1vc3QgY29tbW9uIGNhc2UKKworCXRyeSB7CisJCUNsYXNzRmlsZVJlYWRlciByZWFkZXIgPSBDbGFzc0ZpbGVSZWFkZXIucmVhZChiaW5hcnlQYXRoICsgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpOworCQlpZiAocmVhZGVyICE9IG51bGwpIHJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHJlYWRlcik7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IC8vIHRyZWF0IGFzIGlmIGNsYXNzIGZpbGUgaXMgbWlzc2luZworCXJldHVybiBudWxsOworfQorCitib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlyZXR1cm4gZGlyZWN0b3J5TGlzdChxdWFsaWZpZWRQYWNrYWdlTmFtZSkgIT0gbnVsbDsKK30KKwordm9pZCByZXNldCgpIHsKKwl0aGlzLmRpcmVjdG9yeUNhY2hlID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDUpOworfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiQmluYXJ5IGNsYXNzcGF0aCBkaXJlY3RvcnkgIiArIGJpbmFyeVBhdGg7IC8vJE5PTi1OTFMtMSQKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aEphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhKYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA0ZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhKYXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLio7CisKK2NsYXNzIENsYXNzcGF0aEphciBleHRlbmRzIENsYXNzcGF0aExvY2F0aW9uIHsKKworU3RyaW5nIHppcEZpbGVuYW1lOyAvLyBrZWVwIGZvciBlcXVhbHMKK1ppcEZpbGUgemlwRmlsZTsKK1NpbXBsZUxvb2t1cFRhYmxlIHBhY2thZ2VDYWNoZTsJCisKK0NsYXNzcGF0aEphcihTdHJpbmcgemlwRmlsZW5hbWUpIHsKKwl0aGlzLnppcEZpbGVuYW1lID0gemlwRmlsZW5hbWU7CisJdGhpcy56aXBGaWxlID0gbnVsbDsKKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG51bGw7Cit9CisKK3ZvaWQgY2xlYW51cCgpIHsKKwlpZiAoemlwRmlsZSAhPSBudWxsKSB7CisJCXRyeSB7IHppcEZpbGUuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQorCQl0aGlzLnppcEZpbGUgPSBudWxsOworCX0KKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG51bGw7Cit9CisKK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworCWlmICghKG8gaW5zdGFuY2VvZiBDbGFzc3BhdGhKYXIpKSByZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gemlwRmlsZW5hbWUuZXF1YWxzKCgoQ2xhc3NwYXRoSmFyKSBvKS56aXBGaWxlbmFtZSk7Cit9IAorCitOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKKwlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpIHJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCisKKwl0cnkgeworCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoemlwRmlsZSwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpOworCQlpZiAocmVhZGVyICE9IG51bGwpIHJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHJlYWRlcik7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IC8vIHRyZWF0IGFzIGlmIGNsYXNzIGZpbGUgaXMgbWlzc2luZworCXJldHVybiBudWxsOworfQorCitib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlpZiAocGFja2FnZUNhY2hlICE9IG51bGwpCisJCXJldHVybiBwYWNrYWdlQ2FjaGUuY29udGFpbnNLZXkocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCisJdGhpcy5wYWNrYWdlQ2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNDEpOworCXBhY2thZ2VDYWNoZS5wdXQoIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJdHJ5IHsKKwkJdGhpcy56aXBGaWxlID0gbmV3IFppcEZpbGUoemlwRmlsZW5hbWUpOworCisJCW5leHRFbnRyeSA6IGZvciAoRW51bWVyYXRpb24gZSA9IHppcEZpbGUuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKKwkJCVN0cmluZyBmaWxlTmFtZSA9ICgoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpOworCQorCQkJLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgJiBhbGwgb2YgaXRzIHBhcmVudCBwYWNrYWdlcworCQkJaW50IGxhc3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLycpOworCQkJd2hpbGUgKGxhc3QgPiAwKSB7CisJCQkJLy8gZXh0cmFjdCB0aGUgcGFja2FnZSBuYW1lCisJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJCWlmIChwYWNrYWdlQ2FjaGUuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKQorCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQkJcGFja2FnZUNhY2hlLnB1dChwYWNrYWdlTmFtZSwgcGFja2FnZU5hbWUpOworCQkJCWxhc3QgPSBwYWNrYWdlTmFtZS5sYXN0SW5kZXhPZignLycpOworCQkJfQorCQl9CisJCXJldHVybiBwYWNrYWdlQ2FjaGUuY29udGFpbnNLZXkocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9CisJcmV0dXJuIGZhbHNlOworfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiQ2xhc3NwYXRoIGphciBmaWxlICIgKyB6aXBGaWxlbmFtZTsgLy8kTk9OLU5MUy0xJAorfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTG9jYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWIxMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhMb2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKKworYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoTG9jYXRpb24geworCitzdGF0aWMgQ2xhc3NwYXRoTG9jYXRpb24gZm9yU291cmNlRm9sZGVyKFN0cmluZyBzb3VyY2VGb2xkZXJQYXRobmFtZSwgU3RyaW5nIG91dHB1dEZvbGRlclBhdGhuYW1lKSB7CisJcmV0dXJuIG5ldyBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeShzb3VyY2VGb2xkZXJQYXRobmFtZSwgb3V0cHV0Rm9sZGVyUGF0aG5hbWUpOworfQorCitzdGF0aWMgQ2xhc3NwYXRoTG9jYXRpb24gZm9yQmluYXJ5Rm9sZGVyKFN0cmluZyBiaW5hcnlGb2xkZXJQYXRobmFtZSkgeworCXJldHVybiBuZXcgQ2xhc3NwYXRoRGlyZWN0b3J5KGJpbmFyeUZvbGRlclBhdGhuYW1lKTsKK30KKworc3RhdGljIENsYXNzcGF0aExvY2F0aW9uIGZvckxpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRobmFtZSkgeworCXJldHVybiBuZXcgQ2xhc3NwYXRoSmFyKGxpYnJhcnlQYXRobmFtZSk7Cit9CisKK2Fic3RyYWN0IE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIGJpbmFyeUZpbGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7CithYnN0cmFjdCBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpOworCisvLyBmcmVlIGFueXRoaW5nIHdoaWNoIGlzIG5vdCByZXF1aXJlZCB3aGVuIHRoZSBzdGF0ZSBpcyBzYXZlZAordm9pZCBjbGVhbnVwKCkgeworfQorLy8gcmVzZXQgYW55IGludGVybmFsIGNhY2hlcyBiZWZvcmUgYW5vdGhlciBjb21waWxlIGxvb3Agc3RhcnRzCit2b2lkIHJlc2V0KCkgeworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQyOWEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhNdWx0aURpcmVjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitjbGFzcyBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBleHRlbmRzIENsYXNzcGF0aERpcmVjdG9yeSB7CisKK1N0cmluZyBzb3VyY2VQYXRoOworCitDbGFzc3BhdGhNdWx0aURpcmVjdG9yeShTdHJpbmcgc291cmNlUGF0aCwgU3RyaW5nIGJpbmFyeVBhdGgpIHsKKwlzdXBlcihiaW5hcnlQYXRoKTsKKworCXRoaXMuc291cmNlUGF0aCA9IHNvdXJjZVBhdGg7CisJaWYgKCFzb3VyY2VQYXRoLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5zb3VyY2VQYXRoICs9ICIvIjsgLy8kTk9OLU5MUy0xJAorfQorCitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKwlpZiAoIShvIGluc3RhbmNlb2YgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpKSByZXR1cm4gZmFsc2U7CisKKwlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9IChDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgbzsKKwlyZXR1cm4gYmluYXJ5UGF0aC5lcXVhbHMobWQuYmluYXJ5UGF0aCkgJiYgc291cmNlUGF0aC5lcXVhbHMobWQuc291cmNlUGF0aCk7Cit9IAorCitOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFNvdXJjZUZpbGUoCisJU3RyaW5nIHF1YWxpZmllZFNvdXJjZUZpbGVOYW1lLAorCVN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSwKKwljaGFyW10gdHlwZU5hbWUsCisJU3RyaW5nW10gYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lcykgeworCisJLy8gaWYgYW4gYWRkaXRpb25hbCBzb3VyY2UgZmlsZSBpcyB3YWl0aW5nIHRvIGJlIGNvbXBpbGVkLCBhbnN3ZXIgaXQKKwkvLyBCVVQgbm90IGlmIHRoaXMgaXMgYSBzZWNvbmRhcnkgdHlwZSBzZWFyY2gsCisJLy8gaWYgd2UgYW5zd2VyIHRoZSBzb3VyY2UgZmlsZSBYLmphdmEgd2hpY2ggbWF5IG5vIGxvbmdlciBkZWZpbmUgWQorCS8vIHRoZW4gdGhlIGJpbmFyeSB0eXBlIGxvb2tpbmcgZm9yIFkgd2lsbCBmYWlsICYgdGhpbmsgdGhlIGNsYXNzIHBhdGggaXMgd3JvbmcKKwkvLyBsZXQgdGhlIHJlY29tcGlsZSBsb29wIGZpeCB1cCBkZXBlbmRlbnRzIHdoZW4gWSBoYXMgYmVlbiBkZWxldGVkIGZyb20gWC5qYXZhCisJU3RyaW5nIGZ1bGxTb3VyY2VOYW1lID0gc291cmNlUGF0aCArIHF1YWxpZmllZFNvdXJjZUZpbGVOYW1lOworCWZvciAoaW50IGkgPSAwLCBsID0gYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWlmIChmdWxsU291cmNlTmFtZS5lcXVhbHMoYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lc1tpXSkpCisJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcigKKwkJCQluZXcgU291cmNlRmlsZShmdWxsU291cmNlTmFtZSwgdHlwZU5hbWUsIENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIHF1YWxpZmllZFBhY2thZ2VOYW1lLnRvQ2hhckFycmF5KCkpKSk7CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJTb3VyY2UgY2xhc3NwYXRoIGRpcmVjdG9yeSAiICsgc291cmNlUGF0aCArIC8vJE5PTi1OTFMtMSQKKwkJIiB3aXRoIGJpbmFyeSBkaXJlY3RvcnkgIiArIGJpbmFyeVBhdGg7IC8vJE5PTi1OTFMtMSQKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyODg1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biB3aGVuIHRoZXJlIGlzIGFuIGludGVybmFsIGVycm9yIGluIHRoZSBpbWFnZSBidWlsZGVyLgorICogTWF5IHdyYXBwZXIgYW5vdGhlciBleGNlcHRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCitwcm90ZWN0ZWQgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uOworCitwdWJsaWMgSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBlKSB7CisJdGhpcy5jb3JlRXhjZXB0aW9uID0gZTsKK30KKworcHVibGljIENvcmVFeGNlcHRpb24gZ2V0VGhyb3dhYmxlKCkgeworCXJldHVybiBjb3JlRXhjZXB0aW9uOworfQorCitwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CisJaWYgKGNvcmVFeGNlcHRpb24gIT0gbnVsbCkgeworCQlTeXN0ZW0uZXJyLnByaW50bG4odGhpcyk7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgZW1iZWRkZWQgY29yZSBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKKwkJY29yZUV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwl9IGVsc2UgeworCQlzdXBlci5wcmludFN0YWNrVHJhY2UoKTsKKwl9Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbmNyZW1lbnRhbEltYWdlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbmNyZW1lbnRhbEltYWdlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzUyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0luY3JlbWVudGFsSW1hZ2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogVGhlIGluY3JlbWVudGFsIGltYWdlIGJ1aWxkZXIKKyAqLworcHVibGljIGNsYXNzIEluY3JlbWVudGFsSW1hZ2VCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RJbWFnZUJ1aWxkZXIgeworCitwcm90ZWN0ZWQgQXJyYXlMaXN0IGxvY2F0aW9uczsKK3Byb3RlY3RlZCBBcnJheUxpc3QgcHJldmlvdXNMb2NhdGlvbnM7Citwcm90ZWN0ZWQgQXJyYXlMaXN0IHR5cGVOYW1lczsKK3Byb3RlY3RlZCBBcnJheUxpc3QgcXVhbGlmaWVkU3RyaW5nczsKK3Byb3RlY3RlZCBBcnJheUxpc3Qgc2ltcGxlU3RyaW5nczsKK3Byb3RlY3RlZCBBcnJheUxpc3Qgc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZTsKKworcHVibGljIHN0YXRpYyBpbnQgTWF4Q29tcGlsZUxvb3AgPSA1OyAvLyBwZXJmb3JtIGEgZnVsbCBidWlsZCBpZiBpdCB0YWtlcyBtb3JlIHRoYW4gPyBpbmNyZW1lbnRhbCBjb21waWxlIGxvb3BzCisKK3Byb3RlY3RlZCBJbmNyZW1lbnRhbEltYWdlQnVpbGRlcihKYXZhQnVpbGRlciBqYXZhQnVpbGRlcikgeworCXN1cGVyKGphdmFCdWlsZGVyKTsKKwl0aGlzLm5hbWVFbnZpcm9ubWVudC50YWdBc0luY3JlbWVudGFsQnVpbGQoKTsKKwl0aGlzLm5ld1N0YXRlLmNvcHlGcm9tKGphdmFCdWlsZGVyLmxhc3RTdGF0ZSk7CisKKwl0aGlzLmxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoMzMpOworCXRoaXMucHJldmlvdXNMb2NhdGlvbnMgPSBudWxsOworCXRoaXMudHlwZU5hbWVzID0gbmV3IEFycmF5TGlzdCgzMyk7CisJdGhpcy5xdWFsaWZpZWRTdHJpbmdzID0gbmV3IEFycmF5TGlzdCgzMyk7CisJdGhpcy5zaW1wbGVTdHJpbmdzID0gbmV3IEFycmF5TGlzdCgzMyk7Cit9CisKK3B1YmxpYyBib29sZWFuIGJ1aWxkKFNpbXBsZUxvb2t1cFRhYmxlIGRlbHRhcykgeworCS8vIGluaXRpYWxpemUgYnVpbGRlcgorCS8vIHdhbGsgdGhpcyBwcm9qZWN0J3MgZGVsdGFzLCBmaW5kIGNoYW5nZWQgc291cmNlIGZpbGVzCisJLy8gd2FsayBwcmVyZXEgcHJvamVjdHMnIGRlbHRhcywgZmluZCBjaGFuZ2VkIGNsYXNzIGZpbGVzICYgYWRkIGFmZmVjdGVkIHNvdXJjZSBmaWxlcworCS8vICAgdXNlIHRoZSBidWlsZCBzdGF0ZSAjIHRvIHNraXAgdGhlIGRlbHRhcyBmb3IgY2VydGFpbiBwcmVyZXEgcHJvamVjdHMKKwkvLyAgIGlnbm9yZSBjaGFuZ2VkIHppcC9qYXIgZmlsZXMgc2luY2UgdGhleSBjYXVzZWQgYSBmdWxsIGJ1aWxkCisJLy8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzICYgYWNjZXB0UmVzdWx0KCkKKwkvLyBjb21wYXJlIHRoZSBwcm9kdWNlZCBjbGFzcyBmaWxlcyBhZ2FpbnN0IHRoZSBleGlzdGluZyBvbmVzIG9uIGRpc2sKKwkvLyByZWNvbXBpbGUgYWxsIGRlcGVuZGVudCBzb3VyY2UgZmlsZXMgb2YgYW55IHR5cGUgd2l0aCBzdHJ1Y3R1cmFsIGNoYW5nZXMgb3IgbmV3L3JlbW92ZWQgc2Vjb25kYXJ5IHR5cGUKKwkvLyBrZWVwIGEgbG9vcCBjb3VudGVyIHRvIGFib3J0ICYgcGVyZm9ybSBhIGZ1bGwgYnVpbGQKKworCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJU3lzdGVtLm91dC5wcmludGxuKCJJTkNSRU1FTlRBTCBidWlsZCIpOyAvLyROT04tTkxTLTEkCisKKwl0cnkgeworCQlyZXNldENvbGxlY3Rpb25zKCk7CisKKwkJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLmFuYWx5emluZ0RlbHRhcyIpKTsgLy8kTk9OLU5MUy0xJAorCQlJUmVzb3VyY2VEZWx0YSBzb3VyY2VEZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgZGVsdGFzLmdldChqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CisJCWlmIChzb3VyY2VEZWx0YSAhPSBudWxsKQorCQkJaWYgKCFmaW5kU291cmNlRmlsZXMoc291cmNlRGVsdGEpKSByZXR1cm4gZmFsc2U7CisJCW5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4xMGYpOworCisJCU9iamVjdFtdIGtleVRhYmxlID0gZGVsdGFzLmtleVRhYmxlOworCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gZGVsdGFzLnZhbHVlVGFibGU7CisJCWZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgdmFsdWVUYWJsZVtpXTsKKwkJCWlmIChkZWx0YSAhPSBudWxsKSB7CisJCQkJSVJlc291cmNlW10gYmluYXJ5UmVzb3VyY2VzID0gKElSZXNvdXJjZVtdKSBqYXZhQnVpbGRlci5iaW5hcnlSZXNvdXJjZXMuZ2V0KGtleVRhYmxlW2ldKTsKKwkJCQlpZiAoYmluYXJ5UmVzb3VyY2VzICE9IG51bGwpCisJCQkJCWlmICghZmluZEFmZmVjdGVkU291cmNlRmlsZXMoZGVsdGEsIGJpbmFyeVJlc291cmNlcykpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMTBmKTsKKworCQlub3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nU291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJAorCQlhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKCk7CisJCW5vdGlmaWVyLnVwZGF0ZVByb2dyZXNzRGVsdGEoMC4wNWYpOworCisJCWludCBjb21waWxlTG9vcCA9IDA7CisJCWZsb2F0IGluY3JlbWVudCA9IDAuNDBmOworCQl3aGlsZSAobG9jYXRpb25zLnNpemUoKSA+IDApIHsgLy8gYWRkZWQgdG8gaW4gYWNjZXB0UmVzdWx0CisJCQlpZiAoKytjb21waWxlTG9vcCA+IE1heENvbXBpbGVMb29wKSB7CisJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGV4Y2VlZGVkIGxvb3AgY291bnQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisKKwkJCVN0cmluZ1tdIGFsbFNvdXJjZUZpbGVzID0gbmV3IFN0cmluZ1tsb2NhdGlvbnMuc2l6ZSgpXTsKKwkJCWxvY2F0aW9ucy50b0FycmF5KGFsbFNvdXJjZUZpbGVzKTsKKwkJCVN0cmluZ1tdIGluaXRpYWxUeXBlU3RyaW5ncyA9IG5ldyBTdHJpbmdbdHlwZU5hbWVzLnNpemUoKV07CisJCQl0eXBlTmFtZXMudG9BcnJheShpbml0aWFsVHlwZVN0cmluZ3MpOworCQkJcmVzZXRDb2xsZWN0aW9ucygpOworCisJCQl3b3JrUXVldWUuYWRkQWxsKGFsbFNvdXJjZUZpbGVzKTsKKwkJCW5vdGlmaWVyLnNldFByb2dyZXNzUGVyQ29tcGlsYXRpb25Vbml0KGluY3JlbWVudCAvIGFsbFNvdXJjZUZpbGVzLmxlbmd0aCk7CisJCQlpbmNyZW1lbnQgPSBpbmNyZW1lbnQgLyAyOworCQkJY29tcGlsZShhbGxTb3VyY2VGaWxlcywgaW5pdGlhbFR5cGVTdHJpbmdzKTsKKwkJCXJlbW92ZVNlY29uZGFyeVR5cGVzKCk7CisJCQlhZGRBZmZlY3RlZFNvdXJjZUZpbGVzKCk7CisJCX0KKwl9IGNhdGNoIChBYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24gZSkgeworCQkvLyBhYm9ydCB0aGUgaW5jcmVtZW50YWwgYnVpbGQgYW5kIGxldCB0aGUgYmF0Y2ggYnVpbGRlciBoYW5kbGUgdGhlIHByb2JsZW0KKwkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJBQk9SVElORyBpbmNyZW1lbnRhbCBidWlsZC4uLiBjYW5ub3QgZmluZCAiICsgZS5xdWFsaWZpZWRUeXBlTmFtZSArIC8vJE5PTi1OTFMtMSQKKwkJCQkiLiBDb3VsZCBoYXZlIGJlZW4gcmVuYW1lZCBpbnNpZGUgaXRzIGV4aXN0aW5nIHNvdXJjZSBmaWxlLiIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBmYWxzZTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgaW50ZXJuYWxFeGNlcHRpb24oZSk7CisJfSBmaW5hbGx5IHsKKwkJY2xlYW5VcCgpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworcHJvdGVjdGVkIHZvaWQgYWRkQWZmZWN0ZWRTb3VyY2VGaWxlcygpIHsKKwlpZiAocXVhbGlmaWVkU3RyaW5ncy5pc0VtcHR5KCkgJiYgc2ltcGxlU3RyaW5ncy5pc0VtcHR5KCkpIHJldHVybjsKKworCS8vIHRoZSBxdWFsaWZpZWRTdHJpbmdzIGFyZSBvZiB0aGUgZm9ybSAncDEvcDInICYgdGhlIHNpbXBsZVN0cmluZ3MgYXJlIGp1c3QgJ1gnCisJY2hhcltdW11bXSBxdWFsaWZpZWROYW1lcyA9IFJlZmVyZW5jZUNvbGxlY3Rpb24uaW50ZXJuUXVhbGlmaWVkTmFtZXMocXVhbGlmaWVkU3RyaW5ncyk7CisJLy8gaWYgYSB3ZWxsIGtub3duIHF1YWxpZmllZCBuYW1lIHdhcyBmb3VuZCB0aGVuIHdlIGNhbiBza2lwIG92ZXIgdGhlc2UKKwlpZiAocXVhbGlmaWVkTmFtZXMubGVuZ3RoIDwgcXVhbGlmaWVkU3RyaW5ncy5zaXplKCkpCisJCXF1YWxpZmllZE5hbWVzID0gbnVsbDsKKwljaGFyW11bXSBzaW1wbGVOYW1lcyA9IFJlZmVyZW5jZUNvbGxlY3Rpb24uaW50ZXJuU2ltcGxlTmFtZXMoc2ltcGxlU3RyaW5ncyk7CisJLy8gaWYgYSB3ZWxsIGtub3duIG5hbWUgd2FzIGZvdW5kIHRoZW4gd2UgY2FuIHNraXAgb3ZlciB0aGVzZQorCWlmIChzaW1wbGVOYW1lcy5sZW5ndGggPCBzaW1wbGVTdHJpbmdzLnNpemUoKSkKKwkJc2ltcGxlTmFtZXMgPSBudWxsOworCisJT2JqZWN0W10ga2V5VGFibGUgPSBuZXdTdGF0ZS5yZWZlcmVuY2VzLmtleVRhYmxlOworCU9iamVjdFtdIHZhbHVlVGFibGUgPSBuZXdTdGF0ZS5yZWZlcmVuY2VzLnZhbHVlVGFibGU7CisJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCVN0cmluZyBzb3VyY2VMb2NhdGlvbiA9IChTdHJpbmcpIGtleVRhYmxlW2ldOworCQlpZiAoc291cmNlTG9jYXRpb24gIT0gbnVsbCAmJiAhbG9jYXRpb25zLmNvbnRhaW5zKHNvdXJjZUxvY2F0aW9uKSkgeworCQkJaWYgKGNvbXBpbGVkQWxsQXRPbmNlICYmIHByZXZpb3VzTG9jYXRpb25zICE9IG51bGwgJiYgcHJldmlvdXNMb2NhdGlvbnMuY29udGFpbnMoc291cmNlTG9jYXRpb24pKQorCQkJCWNvbnRpbnVlIG5leHQ7IC8vIGNhbiBza2lwIHByZXZpb3VzbHkgY29tcGlsZWQgbG9jYXRpb25zIHNpbmNlIGFscmVhZHkgc2F3IGhpZXJhcmNoeSByZWxhdGVkIHByb2JsZW1zCisKKwkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gcmVmcyA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOworCQkJaWYgKHJlZnMuaW5jbHVkZXMocXVhbGlmaWVkTmFtZXMsIHNpbXBsZU5hbWVzKSkgeworCQkJCS8vIGNoZWNrIHRoYXQgdGhlIGZpbGUgc3RpbGwgZXhpc3RzLi4uIHRoZSBmaWxlIG9yIGl0cyBwYWNrYWdlIG1heSBoYXZlIGJlZW4gZGVsZXRlZAorCQkJCUlSZXNvdXJjZSBhZmZlY3RlZEZpbGUgPSByZXNvdXJjZUZvckxvY2F0aW9uKHNvdXJjZUxvY2F0aW9uKTsKKwkJCQlpZiAoYWZmZWN0ZWRGaWxlICE9IG51bGwgJiYgYWZmZWN0ZWRGaWxlLmV4aXN0cygpKSB7CisJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBhZGRpbmcgYWZmZWN0ZWQgc291cmNlIGZpbGUgIiArIHNvdXJjZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlsb2NhdGlvbnMuYWRkKHNvdXJjZUxvY2F0aW9uKTsKKwkJCQkJdHlwZU5hbWVzLmFkZChleHRyYWN0VHlwZU5hbWVGcm9tKHNvdXJjZUxvY2F0aW9uKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbnRzT2YoSVBhdGggcGF0aCwgYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsQ2hhbmdlcykgeworCWlmIChoYXNTdHJ1Y3R1cmFsQ2hhbmdlcykKKwkJbmV3U3RhdGUudGFnQXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKCk7CisJLy8gdGhlIHF1YWxpZmllZFN0cmluZ3MgYXJlIG9mIHRoZSBmb3JtICdwMS9wMScgJiB0aGUgc2ltcGxlU3RyaW5ncyBhcmUganVzdCAnWCcKKwlwYXRoID0gcGF0aC5zZXREZXZpY2UobnVsbCk7CisJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGF0aC51cHRvU2VnbWVudChwYXRoLnNlZ21lbnRDb3VudCgpIC0gMSkudG9TdHJpbmcoKTsKKwlpZiAoIXF1YWxpZmllZFN0cmluZ3MuY29udGFpbnMocGFja2FnZU5hbWUpKQorCQlxdWFsaWZpZWRTdHJpbmdzLmFkZChwYWNrYWdlTmFtZSk7CisJU3RyaW5nIHR5cGVOYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOworCWludCBtZW1iZXJJbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJyQnKTsKKwlpZiAobWVtYmVySW5kZXggPiAwKQorCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBtZW1iZXJJbmRleCk7CisJaWYgKCFzaW1wbGVTdHJpbmdzLmNvbnRhaW5zKHR5cGVOYW1lKSkgeworCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgYWRkaW5nIGRlcGVuZGVudHMgb2YgIiAvLyROT04tTkxTLTEkCisJCQkJKyB0eXBlTmFtZSArICIgaW4gIiArIHBhY2thZ2VOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQlzaW1wbGVTdHJpbmdzLmFkZCh0eXBlTmFtZSk7CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgeworCXN1cGVyLmNsZWFuVXAoKTsKKworCXRoaXMubG9jYXRpb25zID0gbnVsbDsKKwl0aGlzLnByZXZpb3VzTG9jYXRpb25zID0gbnVsbDsKKwl0aGlzLnR5cGVOYW1lcyA9IG51bGw7CisJdGhpcy5xdWFsaWZpZWRTdHJpbmdzID0gbnVsbDsKKwl0aGlzLnNpbXBsZVN0cmluZ3MgPSBudWxsOworfQorCitwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kQWZmZWN0ZWRTb3VyY2VGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVJlc291cmNlW10gYmluYXJ5UmVzb3VyY2VzKSB7CisJZm9yIChpbnQgaiA9IDAsIGsgPSBiaW5hcnlSZXNvdXJjZXMubGVuZ3RoOyBqIDwgazsgaisrKSB7CisJCUlSZXNvdXJjZSBiaW5hcnlSZXNvdXJjZSA9IGJpbmFyeVJlc291cmNlc1tqXTsKKwkJLy8gZWl0aGVyIGEgLmNsYXNzIGZpbGUgZm9sZGVyIG9yIGEgemlwL2phciBmaWxlCisJCWlmIChiaW5hcnlSZXNvdXJjZSAhPSBudWxsKSB7IC8vIHNraXAgdW5jaGFuZ2VkIG91dHB1dCBmb2xkZXIKKwkJCUlSZXNvdXJjZURlbHRhIGJpbmFyeURlbHRhID0gZGVsdGEuZmluZE1lbWJlcihiaW5hcnlSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworCQkJaWYgKGJpbmFyeURlbHRhICE9IG51bGwpIHsKKwkJCQlpZiAoYmluYXJ5UmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIGRlbHRhIHRvIGphci96aXAgZmlsZSIpOyAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBmYWxzZTsgLy8gZG8gZnVsbCBidWlsZCBzaW5jZSBqYXIgZmlsZSB3YXMgYWRkZWQvcmVtb3ZlZC9jaGFuZ2VkCisJCQkJfQorCQkJCWlmIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgYmluYXJ5RGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBQk9SVElORyBpbmNyZW1lbnRhbCBidWlsZC4uLiBmb3VuZCBhZGRlZC9yZW1vdmVkIGJpbmFyeSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGFkZGVkL3JlbW92ZWQgYmluYXJ5IGZvbGRlciBzaG91bGQgbm90IG1ha2UgaXQgaGVyZSwgYnV0IGhhbmRsZSBhbnl3YXlzCisJCQkJfQorCQkJCWludCBzZWdtZW50Q291bnQgPSBiaW5hcnlSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpOworCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBiaW5hcnlEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7IC8vIC5jbGFzcyBmaWxlcyBmcm9tIGNsYXNzIGZvbGRlcgorCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkKKwkJCQkJZmluZEFmZmVjdGVkU291cmNlRmlsZXMoY2hpbGRyZW5baV0sIHNlZ21lbnRDb3VudCk7CisJCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworcHJvdGVjdGVkIHZvaWQgZmluZEFmZmVjdGVkU291cmNlRmlsZXMoSVJlc291cmNlRGVsdGEgYmluYXJ5RGVsdGEsIGludCBzZWdtZW50Q291bnQpIHsKKwkvLyBXaGVuIGEgcGFja2FnZSBiZWNvbWVzIGEgdHlwZSBvciB2aWNlIHZlcnNhLCBleHBlY3QgMiBkZWx0YXMsCisJLy8gb25lIG9uIHRoZSBmb2xkZXIgJiBvbmUgb24gdGhlIGNsYXNzIGZpbGUKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSBiaW5hcnlEZWx0YS5nZXRSZXNvdXJjZSgpOworCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKKwlzd2l0Y2gocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CisJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgorCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJc3dpdGNoIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCQlJUGF0aCBwYWNrYWdlUGF0aCA9IGxvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5tYWtlUmVsYXRpdmUoKS5zZXREZXZpY2UobnVsbCk7CisJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VQYXRoLnRvU3RyaW5nKCk7CisJCQkJCWlmIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKKwkJCQkJCS8vIHNlZSBpZiBhbnkga25vd24gc291cmNlIGZpbGUgaXMgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLi4uIGNsYXNzcGF0aCBhbHJlYWR5IGluY2x1ZGVzIG5ldyBwYWNrYWdlCisJCQkJCQlpZiAoIW5ld1N0YXRlLmlzS25vd25QYWNrYWdlKHBhY2thZ2VOYW1lKSkgeworCQkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiBhZGRlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlhZGREZXBlbmRlbnRzT2YocGFja2FnZVBhdGgsIGZhbHNlKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGVkIGRlcGVuZGVudHMgb2YgYWRkZWQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBzZWUgaWYgdGhlIHBhY2thZ2Ugc3RpbGwgZXhpc3RzIG9uIHRoZSBjbGFzc3BhdGgKKwkJCQkJCWlmICghbmFtZUVudmlyb25tZW50LmlzUGFja2FnZShwYWNrYWdlTmFtZSkpIHsKKwkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgcmVtb3ZlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlhZGREZXBlbmRlbnRzT2YocGFja2FnZVBhdGgsIGZhbHNlKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGVkIGRlcGVuZGVudHMgb2YgcmVtb3ZlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQkvLyBmYWxsIHRocnUgJiB0cmF2ZXJzZSB0aGUgc3ViLXBhY2thZ2VzIGFuZCAuY2xhc3MgZmlsZXMKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gYmluYXJ5RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJCQlmaW5kQWZmZWN0ZWRTb3VyY2VGaWxlcyhjaGlsZHJlbltpXSwgc2VnbWVudENvdW50KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CisJCQlpZiAoSmF2YUJ1aWxkZXIuQ0xBU1NfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb24uZ2V0RmlsZUV4dGVuc2lvbigpKSkgeworCQkJCUlQYXRoIHR5cGVQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5tYWtlUmVsYXRpdmUoKS5zZXREZXZpY2UobnVsbCk7CisJCQkJc3dpdGNoIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiBhZGRlZC9yZW1vdmVkIGNsYXNzIGZpbGUgIiArIHR5cGVQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCBmYWxzZSk7CisJCQkJCQlyZXR1cm47CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CisJCQkJCQlpZiAoKGJpbmFyeURlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwKQorCQkJCQkJCXJldHVybjsgLy8gc2tpcCBpdCBzaW5jZSBpdCByZWFsbHkgaXNuJ3QgY2hhbmdlZAorCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgY2hhbmdlZCBjbGFzcyBmaWxlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWFkZERlcGVuZGVudHNPZih0eXBlUGF0aCwgZmFsc2UpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJfQorfQorCitwcm90ZWN0ZWQgYm9vbGVhbiBmaW5kU291cmNlRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc291cmNlRm9sZGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJUmVzb3VyY2VEZWx0YSBzb3VyY2VEZWx0YSA9IGRlbHRhLmZpbmRNZW1iZXIoc291cmNlRm9sZGVyc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworCQlpZiAoc291cmNlRGVsdGEgIT0gbnVsbCkgeworCQkJaWYgKHNvdXJjZURlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIHJlbW92ZWQgc291cmNlIGZvbGRlciIpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGZhbHNlOyAvLyByZW1vdmVkIHNvdXJjZSBmb2xkZXIgc2hvdWxkIG5vdCBtYWtlIGl0IGhlcmUsIGJ1dCBoYW5kbGUgYW55d2F5cyAoQURERUQgaXMgc3VwcG9ydGVkKQorCQkJfQorCQkJaW50IHNlZ21lbnRDb3VudCA9IHNvdXJjZUZvbGRlcnNbaV0uZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKTsKKwkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBzb3VyY2VEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBjID0gMCwgY2xlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgYyA8IGNsZW5ndGg7IGMrKykKKwkJCQlmaW5kU291cmNlRmlsZXMoY2hpbGRyZW5bY10sIHNlZ21lbnRDb3VudCk7CisJCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCitwcm90ZWN0ZWQgdm9pZCBmaW5kU291cmNlRmlsZXMoSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEsIGludCBzZWdtZW50Q291bnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBXaGVuIGEgcGFja2FnZSBiZWNvbWVzIGEgdHlwZSBvciB2aWNlIHZlcnNhLCBleHBlY3QgMiBkZWx0YXMsCisJLy8gb25lIG9uIHRoZSBmb2xkZXIgJiBvbmUgb24gdGhlIHNvdXJjZSBmaWxlCisJSVJlc291cmNlIHJlc291cmNlID0gc291cmNlRGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7CisJc3dpdGNoKHJlc291cmNlLmdldFR5cGUoKSkgeworCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKKwkJCXN3aXRjaCAoc291cmNlRGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCUlQYXRoIGFkZGVkUGFja2FnZVBhdGggPSBsb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCkubWFrZVJlbGF0aXZlKCkuc2V0RGV2aWNlKG51bGwpOworCQkJCQlnZXRPdXRwdXRGb2xkZXIoYWRkZWRQYWNrYWdlUGF0aCk7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgorCQkJCQkvLyBhZGQgZGVwZW5kZW50cyBldmVuIHdoZW4gdGhlIHBhY2thZ2UgdGhpbmtzIGl0IGV4aXN0cyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCisJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgYWRkZWQgcGFja2FnZSAiICsgYWRkZWRQYWNrYWdlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYWRkRGVwZW5kZW50c09mKGFkZGVkUGFja2FnZVBhdGgsIHRydWUpOworCQkJCQkvLyBmYWxsIHRocnUgJiBjb2xsZWN0IGFsbCB0aGUgc291cmNlIGZpbGVzCisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKKwkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IHNvdXJjZURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCQkJZmluZFNvdXJjZUZpbGVzKGNoaWxkcmVuW2ldLCBzZWdtZW50Q291bnQpOworCQkJCQlyZXR1cm47CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKKwkJCQkJSVBhdGggcmVtb3ZlZFBhY2thZ2VQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLm1ha2VSZWxhdGl2ZSgpLnNldERldmljZShudWxsKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCWlmIChzb3VyY2VGb2xkZXJzW2ldLmZpbmRNZW1iZXIocmVtb3ZlZFBhY2thZ2VQYXRoKSAhPSBudWxsKSB7CisJCQkJCQkJLy8gb25seSBhIHBhY2thZ2UgZnJhZ21lbnQgd2FzIHJlbW92ZWQsIHNhbWUgYXMgcmVtb3ZpbmcgbXVsdGlwbGUgc291cmNlIGZpbGVzCisJCQkJCQkJZ2V0T3V0cHV0Rm9sZGVyKHJlbW92ZWRQYWNrYWdlUGF0aCk7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgorCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gcmVtb3ZlZENoaWxkcmVuID0gc291cmNlRGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJCQkJCWZvciAoaW50IGogPSAwLCBybGVuZ3RoID0gcmVtb3ZlZENoaWxkcmVuLmxlbmd0aDsgaiA8IHJsZW5ndGg7IGorKykKKwkJCQkJCQkJZmluZFNvdXJjZUZpbGVzKHJlbW92ZWRDaGlsZHJlbltqXSwgc2VnbWVudENvdW50KTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJSUZvbGRlciByZW1vdmVkUGFja2FnZUZvbGRlciA9IG91dHB1dEZvbGRlci5nZXRGb2xkZXIocmVtb3ZlZFBhY2thZ2VQYXRoKTsKKwkJCQkJaWYgKHJlbW92ZWRQYWNrYWdlRm9sZGVyLmV4aXN0cygpKQorCQkJCQkJcmVtb3ZlZFBhY2thZ2VGb2xkZXIuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CisJCQkJCS8vIGFkZCBkZXBlbmRlbnRzIGV2ZW4gd2hlbiB0aGUgcGFja2FnZSB0aGlua3MgaXQgZG9lcyBub3QgZXhpc3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQorCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBkZXBlbmRlbnRzIG9mIHJlbW92ZWQgcGFja2FnZSAiICsgcmVtb3ZlZFBhY2thZ2VQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlhZGREZXBlbmRlbnRzT2YocmVtb3ZlZFBhY2thZ2VQYXRoLCB0cnVlKTsKKwkJCQkJbmV3U3RhdGUucmVtb3ZlUGFja2FnZShzb3VyY2VEZWx0YSk7CisJCQl9CisJCQlyZXR1cm47CisJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGxvY2F0aW9uLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCWlmIChKYXZhQnVpbGRlci5KQVZBX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsKKwkJCQlJUGF0aCB0eXBlUGF0aCA9IGxvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubWFrZVJlbGF0aXZlKCkuc2V0RGV2aWNlKG51bGwpOworCQkJCVN0cmluZyBzb3VyY2VMb2NhdGlvbiA9IGxvY2F0aW9uLnRvU3RyaW5nKCk7CisJCQkJc3dpdGNoIChzb3VyY2VEZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgYWRkZWQgc291cmNlIGZpbGUgIiArIHNvdXJjZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJbG9jYXRpb25zLmFkZChzb3VyY2VMb2NhdGlvbik7CisJCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlUGF0aC50b1N0cmluZygpOworCQkJCQkJdHlwZU5hbWVzLmFkZCh0eXBlTmFtZSk7CisJCQkJCQlpZiAoIW5ld1N0YXRlLmlzRHVwbGljYXRlTG9jYXRpb24odHlwZU5hbWUsIHNvdXJjZUxvY2F0aW9uKSkgeyAvLyBhZGRpbmcgZGVwZW5kZW50cyByZXN1bHRzIGluIDIgZHVwbGljYXRlIGVycm9ycworCQkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiBhZGRlZCBzb3VyY2UgZmlsZSAiICsgdHlwZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybjsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKKwkJCQkJCWNoYXJbXVtdIGRlZmluZWRUeXBlTmFtZXMgPSBuZXdTdGF0ZS5nZXREZWZpbmVkVHlwZU5hbWVzRm9yKHNvdXJjZUxvY2F0aW9uKTsKKwkJCQkJCWlmIChkZWZpbmVkVHlwZU5hbWVzID09IG51bGwpIHsgLy8gZGVmaW5lZCBhIHNpbmdsZSB0eXBlIG1hdGNoaW5nIHR5cGVQYXRoCisJCQkJCQkJcmVtb3ZlQ2xhc3NGaWxlKHR5cGVQYXRoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBkZXBlbmRlbnRzIG9mIHJlbW92ZWQgc291cmNlIGZpbGUgIiArIHR5cGVQYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCB0cnVlKTsgLy8gYWRkIGRlcGVuZGVudHMgb2YgdGhlIHNvdXJjZSBmaWxlIHNpbmNlIGl0IG1heSBiZSBpbnZvbHZlZCBpbiBhIG5hbWUgY29sbGlzaW9uCisJCQkJCQkJaWYgKGRlZmluZWRUeXBlTmFtZXMubGVuZ3RoID4gMCkgeyAvLyBza2lwIGl0IGlmIGl0IGZhaWxlZCB0byBzdWNjZXNzZnVsbHkgZGVmaW5lIGEgdHlwZQorCQkJCQkJCQlJUGF0aCBwYWNrYWdlUGF0aCA9IHR5cGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGRlZmluZWRUeXBlTmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJCQkJCQlyZW1vdmVDbGFzc0ZpbGUocGFja2FnZVBhdGguYXBwZW5kKG5ldyBTdHJpbmcoZGVmaW5lZFR5cGVOYW1lc1tpXSkpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQluZXdTdGF0ZS5yZW1vdmUoc291cmNlTG9jYXRpb24pOworCQkJCQkJcmV0dXJuOworCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCQkJaWYgKChzb3VyY2VEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCkKKwkJCQkJCQlyZXR1cm47IC8vIHNraXAgaXQgc2luY2UgaXQgcmVhbGx5IGlzbid0IGNoYW5nZWQKKwkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGUgdGhpcyBjaGFuZ2VkIHNvdXJjZSBmaWxlICIgKyBzb3VyY2VMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWxvY2F0aW9ucy5hZGQoc291cmNlTG9jYXRpb24pOworCQkJCQkJdHlwZU5hbWVzLmFkZCh0eXBlUGF0aC50b1N0cmluZygpKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmIChKYXZhQnVpbGRlci5DTEFTU19FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSB7CisJCQkJcmV0dXJuOyAvLyBza2lwIGNsYXNzIGZpbGVzCisJCQl9IGVsc2UgaWYgKGhhc1NlcGFyYXRlT3V0cHV0Rm9sZGVyKSB7CisJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlclJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuOworCisJCQkJLy8gY29weSBhbGwgb3RoZXIgcmVzb3VyY2UgZGVsdGFzIHRvIHRoZSBvdXRwdXQgZm9sZGVyCisJCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLm1ha2VSZWxhdGl2ZSgpOworCQkJCUlSZXNvdXJjZSBvdXRwdXRGaWxlID0gb3V0cHV0Rm9sZGVyLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKKwkJCQlzd2l0Y2ggKHNvdXJjZURlbHRhLmdldEtpbmQoKSkgeworCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKSB7CisJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlbGV0aW5nIGV4aXN0aW5nIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlvdXRwdXRGaWxlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJfQorCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29weWluZyBhZGRlZCBmaWxlICIgKyByZXNvdXJjZVBhdGgpOyAvLyROT04tTkxTLTEkCisJCQkJCQlnZXRPdXRwdXRGb2xkZXIocmVzb3VyY2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgorCQkJCQkJcmVzb3VyY2UuY29weShvdXRwdXRGaWxlLmdldEZ1bGxQYXRoKCksIElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CisJCQkJCQlvdXRwdXRGaWxlLnNldERlcml2ZWQodHJ1ZSk7CisJCQkJCQlyZXR1cm47CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgeworCQkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWxldGluZyByZW1vdmVkIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlvdXRwdXRGaWxlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuOworCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCQkJaWYgKChzb3VyY2VEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCkKKwkJCQkJCQlyZXR1cm47IC8vIHNraXAgaXQgc2luY2UgaXQgcmVhbGx5IGlzbid0IGNoYW5nZWQKKwkJCQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKSB7CisJCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlbGV0aW5nIGV4aXN0aW5nIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlvdXRwdXRGaWxlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJfQorCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29weWluZyBjaGFuZ2VkIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWdldE91dHB1dEZvbGRlcihyZXNvdXJjZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsgLy8gZW5zdXJlIHBhY2thZ2UgZXhpc3RzIGluIHRoZSBvdXRwdXQgZm9sZGVyCisJCQkJCQlyZXNvdXJjZS5jb3B5KG91dHB1dEZpbGUuZ2V0RnVsbFBhdGgoKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJCQkJCW91dHB1dEZpbGUuc2V0RGVyaXZlZCh0cnVlKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCX0KK30KKworcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRXaXRoKFN0cmluZyBzb3VyY2VMb2NhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0LCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgZGVmaW5lZFR5cGVOYW1lcywgQXJyYXlMaXN0IGR1cGxpY2F0ZVR5cGVOYW1lcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWNoYXJbXVtdIHByZXZpb3VzVHlwZU5hbWVzID0gbmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcihzb3VyY2VMb2NhdGlvbik7CisJaWYgKHByZXZpb3VzVHlwZU5hbWVzID09IG51bGwpCisJCXByZXZpb3VzVHlwZU5hbWVzID0gbmV3IGNoYXJbXVtdIHttYWluVHlwZU5hbWV9OworCUlQYXRoIHBhY2thZ2VQYXRoID0gbnVsbDsKKwluZXh0IDogZm9yIChpbnQgaSA9IDAsIHggPSBwcmV2aW91c1R5cGVOYW1lcy5sZW5ndGg7IGkgPCB4OyBpKyspIHsKKwkJY2hhcltdIHByZXZpb3VzID0gcHJldmlvdXNUeXBlTmFtZXNbaV07CisJCWZvciAoaW50IGogPSAwLCB5ID0gZGVmaW5lZFR5cGVOYW1lcy5zaXplKCk7IGogPCB5OyBqKyspCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocHJldmlvdXMsIChjaGFyW10pIGRlZmluZWRUeXBlTmFtZXMuZ2V0KGopKSkKKwkJCQljb250aW51ZSBuZXh0OworCisJCWlmIChwYWNrYWdlUGF0aCA9PSBudWxsKQorCQkJcGFja2FnZVBhdGggPSBuZXcgUGF0aChleHRyYWN0VHlwZU5hbWVGcm9tKHNvdXJjZUxvY2F0aW9uKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQlpZiAoc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9PSBudWxsKQorCQkJdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOworCQlzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmFkZChwYWNrYWdlUGF0aC5hcHBlbmQobmV3IFN0cmluZyhwcmV2aW91cykpKTsKKwl9CisJc3VwZXIuZmluaXNoZWRXaXRoKHNvdXJjZUxvY2F0aW9uLCByZXN1bHQsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcywgZHVwbGljYXRlVHlwZU5hbWVzKTsKK30KKworcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2xhc3NGaWxlKElQYXRoIHR5cGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHR5cGVQYXRoLmxhc3RTZWdtZW50KCkuaW5kZXhPZignJCcpID09IC0xKSB7IC8vIGlzIG5vdCBhIG5lc3RlZCB0eXBlCisJCW5ld1N0YXRlLnJlbW92ZVR5cGVMb2NhdGlvbih0eXBlUGF0aC50b1N0cmluZygpKTsKKwkJLy8gYWRkIGRlcGVuZGVudHMgZXZlbiB3aGVuIHRoZSB0eXBlIHRoaW5rcyBpdCBkb2VzIG5vdCBleGlzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCisJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgcmVtb3ZlZCB0eXBlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCB0cnVlKTsgLy8gd2hlbiBtZW1iZXIgdHlwZXMgYXJlIHJlbW92ZWQsIHRoZWlyIGVuY2xvc2luZyB0eXBlIGlzIHN0cnVjdHVyYWxseSBjaGFuZ2VkCisJfQorCUlGaWxlIGNsYXNzRmlsZSA9IG91dHB1dEZvbGRlci5nZXRGaWxlKHR5cGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oSmF2YUJ1aWxkZXIuQ0xBU1NfRVhURU5TSU9OKSk7CisJaWYgKGNsYXNzRmlsZS5leGlzdHMoKSkgeworCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlbGV0aW5nIGNsYXNzIGZpbGUgb2YgcmVtb3ZlZCB0eXBlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJY2xhc3NGaWxlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCX0KK30KKworcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vjb25kYXJ5VHlwZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHNlY29uZGFyeVR5cGVzVG9SZW1vdmUgIT0gbnVsbCkgeyAvLyBkZWxheWVkIGRlbGV0aW5nIHNlY29uZGFyeSB0eXBlcyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjb21waWxlIGxvb3AKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNlY29uZGFyeVR5cGVzVG9SZW1vdmUuc2l6ZSgpOyBpIDwgbGVuZ3RoOyBpKyspCisJCQlyZW1vdmVDbGFzc0ZpbGUoKElQYXRoKSBzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmdldChpKSk7CisJCXRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9IG51bGw7CisJCWlmIChwcmV2aW91c0xvY2F0aW9ucyAhPSBudWxsICYmIHByZXZpb3VzTG9jYXRpb25zLnNpemUoKSA+IDEpCisJCQl0aGlzLnByZXZpb3VzTG9jYXRpb25zID0gbnVsbDsgLy8gY2Fubm90IG9wdGltaXplIHJlY29tcGlsZSBjYXNlIHdoZW4gYSBzZWNvbmRhcnkgdHlwZSBpcyBkZWxldGVkCisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldENvbGxlY3Rpb25zKCkgeworCXByZXZpb3VzTG9jYXRpb25zID0gbG9jYXRpb25zLmlzRW1wdHkoKSA/IG51bGwgOiAoQXJyYXlMaXN0KSBsb2NhdGlvbnMuY2xvbmUoKTsKKworCWxvY2F0aW9ucy5jbGVhcigpOworCXR5cGVOYW1lcy5jbGVhcigpOworCXF1YWxpZmllZFN0cmluZ3MuY2xlYXIoKTsKKwlzaW1wbGVTdHJpbmdzLmNsZWFyKCk7CisJd29ya1F1ZXVlLmNsZWFyKCk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1zRm9yKFN0cmluZyBzb3VyY2VMb2NhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGb3JMb2NhdGlvbihzb3VyY2VMb2NhdGlvbik7CisJSU1hcmtlcltdIG1hcmtlcnMgPSBKYXZhQnVpbGRlci5nZXRQcm9ibGVtc0ZvcihyZXNvdXJjZSk7CisJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOworCWlmIChwcm9ibGVtcyA9PSBudWxsIHx8IHByb2JsZW1zLmxlbmd0aCA9PSAwKQorCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMCkgcmV0dXJuOworCisJbm90aWZpZXIudXBkYXRlUHJvYmxlbUNvdW50cyhtYXJrZXJzLCBwcm9ibGVtcyk7CisJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNGb3IocmVzb3VyY2UpOworCXN0b3JlUHJvYmxlbXNGb3IocmVzb3VyY2UsIHByb2JsZW1zKTsKK30KKworcHJvdGVjdGVkIGJvb2xlYW4gd3JpdGVDbGFzc0ZpbGVDaGVjayhJRmlsZSBmaWxlLCBTdHJpbmcgZmlsZU5hbWUsIGJ5dGVbXSBuZXdCeXRlcywgYm9vbGVhbiBpc1NlY29uZGFyeVR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBCZWZvcmUgd3JpdGluZyBvdXQgdGhlIGNsYXNzIGZpbGUsIGNvbXBhcmUgaXQgdG8gdGhlIHByZXZpb3VzIGZpbGUKKwkvLyBJZiBzdHJ1Y3R1cmFsIGNoYW5nZXMgb2NjdXJlZCB0aGVuIGFkZCBkZXBlbmRlbnQgc291cmNlIGZpbGVzCisJaWYgKGZpbGUuZXhpc3RzKCkpIHsKKwkJdHJ5IHsKKwkJCWJ5dGVbXSBvbGRCeXRlcyA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KGZpbGUpOworCQkJbm90RXF1YWwgOiBpZiAobmV3Qnl0ZXMubGVuZ3RoID09IG9sZEJ5dGVzLmxlbmd0aCkgeworCQkJCWZvciAoaW50IGkgPSBuZXdCeXRlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCQkJaWYgKG5ld0J5dGVzW2ldICE9IG9sZEJ5dGVzW2ldKSBicmVhayBub3RFcXVhbDsKKwkJCQlyZXR1cm4gZmFsc2U7IC8vIGJ5dGVzIGFyZSBpZGVudGljYWwgc28gc2tpcCB0aGVtCisJCQl9CisJCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IENsYXNzRmlsZVJlYWRlcihvbGRCeXRlcywgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSk7CisJCQkvLyBpZ25vcmUgbG9jYWwgdHlwZXMgc2luY2UgdGhleSdyZSBvbmx5IHZpc2libGUgaW5zaWRlIGEgc2luZ2xlIG1ldGhvZAorCQkJaWYgKCEocmVhZGVyLmlzTG9jYWwoKSB8fCByZWFkZXIuaXNBbm9ueW1vdXMoKSkgJiYgcmVhZGVyLmhhc1N0cnVjdHVyYWxDaGFuZ2VzKG5ld0J5dGVzKSkgeworCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIGhhcyBzdHJ1Y3R1cmFsIGNoYW5nZXMgIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCWFkZERlcGVuZGVudHNPZihuZXcgUGF0aChmaWxlTmFtZSksIHRydWUpOworCQkJfQorCQl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQlhZGREZXBlbmRlbnRzT2YobmV3IFBhdGgoZmlsZU5hbWUpLCB0cnVlKTsKKwkJfQorCisJCWZpbGUuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CisJfSBlbHNlIGlmIChpc1NlY29uZGFyeVR5cGUpIHsKKwkJYWRkRGVwZW5kZW50c09mKG5ldyBQYXRoKGZpbGVOYW1lKSwgdHJ1ZSk7IC8vIG5ldyBzZWNvbmRhcnkgdHlwZQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gImluY3JlbWVudGFsIGltYWdlIGJ1aWxkZXIgZm9yOlxuXHRuZXcgc3RhdGU6ICIgKyBuZXdTdGF0ZTsgLy8kTk9OLU5MUy0xJAorfQorCisKKy8qIERlYnVnIGhlbHBlcgorCitzdGF0aWMgdm9pZCBkdW1wKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlJUGF0aCBwYXRoID0gZGVsdGEuZ2V0RnVsbFBhdGgoKTsKKwlmb3IgKGludCBpID0gcGF0aC5zZWdtZW50Q291bnQoKTsgLS1pID4gMDspCisJCWJ1ZmZlci5hcHBlbmQoIiAgIik7CisJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKKwkJCWJ1ZmZlci5hcHBlbmQoJysnKTsKKwkJCWJyZWFrOworCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6CisJCQlidWZmZXIuYXBwZW5kKCctJyk7CisJCQlicmVhazsKKwkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgorCQkJYnVmZmVyLmFwcGVuZCgnKicpOworCQkJYnJlYWs7CisJCWNhc2UgSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFOgorCQkJYnVmZmVyLmFwcGVuZCgnPScpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlidWZmZXIuYXBwZW5kKCc/Jyk7CisJCQlicmVhazsKKwl9CisJYnVmZmVyLmFwcGVuZChwYXRoKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOworCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKQorCQlkdW1wKGNoaWxkcmVuW2ldKTsKK30KKyovCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9KYXZhQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9KYXZhQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzlmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0phdmFCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1MTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBKYXZhQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgeworCitJUHJvamVjdCBjdXJyZW50UHJvamVjdDsKK0lKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKK0lXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3Q7CitDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzcGF0aDsKK0lDb250YWluZXIgb3V0cHV0Rm9sZGVyOworSUNvbnRhaW5lcltdIHNvdXJjZUZvbGRlcnM7CitTaW1wbGVMb29rdXBUYWJsZSBiaW5hcnlSZXNvdXJjZXM7IC8vIG1hcHMgYSBwcm9qZWN0IHRvIGl0cyBiaW5hcnkgcmVzb3VyY2VzIChvdXRwdXQgZm9sZGVyLCBjbGFzcyBmb2xkZXJzLCB6aXAvamFyIGZpbGVzKQorU3RhdGUgbGFzdFN0YXRlOworQnVpbGROb3RpZmllciBub3RpZmllcjsKK2NoYXJbXVtdIGZpbGVGaWx0ZXJzOworU3RyaW5nW10gZm9sZGVyRmlsdGVyczsKKworcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiamFyIjsgLy8kTk9OLU5MUy0xJAorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWklQX0VYVEVOU0lPTiA9ICJ6aXAiOyAvLyROT04tTkxTLTEkCisKK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCitzdGF0aWMgZmluYWwgU3RyaW5nIFByb2JsZW1NYXJrZXJUYWcgPSBJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVI7CisvKioKKyAqIEEgbGlzdCBvZiBwcm9qZWN0IG5hbWVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LgorICogVGhpcyBsaXN0IGlzIHVzZWQgdG8gcmVzZXQgdGhlIEphdmFNb2RlbC5leGlzdGluZ0V4dGVybmFsRmlsZXMgY2FjaGUgd2hlbiBhIGJ1aWxkIGN5Y2xlIGJlZ2lucworICogc28gdGhhdCBkZWxldGVkIGV4dGVybmFsIGphcnMgYXJlIGRpc2NvdmVyZWQuCisgKi8KK3N0YXRpYyBBcnJheUxpc3QgYnVpbHRQcm9qZWN0cyA9IG51bGw7CisKK3B1YmxpYyBzdGF0aWMgSU1hcmtlcltdIGdldFByb2JsZW1zRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRyeSB7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQorCQkJcmV0dXJuIHJlc291cmNlLmZpbmRNYXJrZXJzKFByb2JsZW1NYXJrZXJUYWcsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30gLy8gYXNzdW1lIHRoZXJlIGFyZSBubyBwcm9ibGVtcworCXJldHVybiBuZXcgSU1hcmtlclswXTsKK30KKworcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb2JsZW1zRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRyeSB7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQorCQkJcmVzb3VyY2UuZGVsZXRlTWFya2VycyhQcm9ibGVtTWFya2VyVGFnLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9IC8vIGFzc3VtZSB0aGVyZSB3ZXJlIG5vIHByb2JsZW1zCit9CisKK3B1YmxpYyBzdGF0aWMgU3RhdGUgcmVhZFN0YXRlKERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlyZXR1cm4gU3RhdGUucmVhZChpbik7Cit9CisKK3B1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVN0YXRlKE9iamVjdCBzdGF0ZSwgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJKChTdGF0ZSkgc3RhdGUpLndyaXRlKG91dCk7Cit9CisKK3B1YmxpYyBKYXZhQnVpbGRlcigpIHsKK30KKworcHJvdGVjdGVkIElQcm9qZWN0W10gYnVpbGQoaW50IGtpbmQsIE1hcCBpZ25vcmVkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl0aGlzLmN1cnJlbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsIHx8ICFjdXJyZW50UHJvamVjdC5pc0FjY2Vzc2libGUoKSkgcmV0dXJuIG5ldyBJUHJvamVjdFswXTsKKworCWlmIChERUJVRykKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIGJ1aWxkIG9mICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAorCQkJKyAiIEAgIiArIG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLm5vdGlmaWVyID0gbmV3IEJ1aWxkTm90aWZpZXIobW9uaXRvciwgY3VycmVudFByb2plY3QpOworCW5vdGlmaWVyLmJlZ2luKCk7CisJYm9vbGVhbiBvayA9IGZhbHNlOworCXRyeSB7CisJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCWluaXRpYWxpemVCdWlsZGVyKCk7CisKKwkJaWYgKGlzV29ydGhCdWlsZGluZygpKSB7CisJCQlpZiAoa2luZCA9PSBGVUxMX0JVSUxEKSB7CisJCQkJYnVpbGRBbGwoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh0aGlzLmxhc3RTdGF0ZSA9IGdldExhc3RTdGF0ZShjdXJyZW50UHJvamVjdCkpID09IG51bGwpIHsKKwkJCQkJaWYgKERFQlVHKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQZXJmb3JtaW5nIGZ1bGwgYnVpbGQgc2luY2UgbGFzdCBzYXZlZCBzdGF0ZSB3YXMgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnVpbGRBbGwoKTsKKwkJCQl9IGVsc2UgaWYgKGhhc0NsYXNzcGF0aENoYW5nZWQoKSB8fCBoYXNPdXRwdXRMb2NhdGlvbkNoYW5nZWQoKSkgeworCQkJCQkvLyBpZiB0aGUgb3V0cHV0IGxvY2F0aW9uIGNoYW5nZXMsIGRvIG5vdCBkZWxldGUgdGhlIGJpbmFyeSBmaWxlcyBmcm9tIG9sZCBsb2NhdGlvbgorCQkJCQkvLyB0aGUgdXNlciBtYXkgYmUgdHJ5aW5nIHNvbWV0aGluZworCQkJCQlidWlsZEFsbCgpOworCQkJCX0gZWxzZSBpZiAoc291cmNlRm9sZGVycy5sZW5ndGggPiAwKSB7IC8vIGlmIHRoZXJlIGlzIG5vIHNvdXJjZSB0byBjb21waWxlICYgbm8gY2xhc3NwYXRoIGNoYW5nZXMgdGhlbiB3ZSBhcmUgZG9uZQorCQkJCQlTaW1wbGVMb29rdXBUYWJsZSBkZWx0YXMgPSBmaW5kRGVsdGFzKCk7CisJCQkJCWlmIChkZWx0YXMgPT0gbnVsbCkKKwkJCQkJCWJ1aWxkQWxsKCk7CisJCQkJCWVsc2UgaWYgKGRlbHRhcy5lbGVtZW50U2l6ZSA+IDApCisJCQkJCQlidWlsZERlbHRhcyhkZWx0YXMpOworCQkJCQllbHNlIGlmIChERUJVRykKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aGluZyB0byBidWlsZCBzaW5jZSBkZWx0YXMgd2VyZSBlbXB0eSIpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGhhc0JpbmFyeURlbHRhKCkpIHsgLy8gZG91YmxlIGNoZWNrIHRoYXQgYSBqYXIgZmlsZSBkaWRuJ3QgZ2V0IHJlcGxhY2VkCisJCQkJCQlidWlsZEFsbCgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKERFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aGluZyB0byBidWlsZCBzaW5jZSB0aGVyZSBhcmUgbm8gc291cmNlIGZvbGRlcnMgYW5kIG5vIGRlbHRhcyIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl0aGlzLmxhc3RTdGF0ZS50YWdBc05vb3BCdWlsZCgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJb2sgPSB0cnVlOworCQl9CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCVV0aWwubG9nKGUsICJKYXZhQnVpbGRlciBoYW5kbGluZyBDb3JlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoUHJvYmxlbU1hcmtlclRhZyk7CisJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBVdGlsLmJpbmQoImJ1aWxkLmluY29uc2lzdGVudFByb2plY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKwl9IGNhdGNoIChJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiBlKSB7CisJCVV0aWwubG9nKGUuZ2V0VGhyb3dhYmxlKCksICJKYXZhQnVpbGRlciBoYW5kbGluZyBJbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKFByb2JsZW1NYXJrZXJUYWcpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgVXRpbC5iaW5kKCJidWlsZC5pbmNvbnNpc3RlbnRQcm9qZWN0IikpOyAvLyROT04tTkxTLTEkCisJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CisJfSBjYXRjaCAoTWlzc2luZ0NsYXNzRmlsZUV4Y2VwdGlvbiBlKSB7CisJCS8vIGRvIG5vdCBsb2cgdGhpcyBleGNlcHRpb24gc2luY2UgaXRzIHRocm93biB0byBoYW5kbGUgYWJvcnRlZCBjb21waWxlcyBiZWNhdXNlIG9mIG1pc3NpbmcgY2xhc3MgZmlsZXMKKwkJaWYgKERFQlVHKQorCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiYnVpbGQuaW5jb21wbGV0ZUNsYXNzUGF0aCIsIGUubWlzc2luZ0NsYXNzRmlsZSkpOyAvLyROT04tTkxTLTEkCisJCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKFByb2JsZW1NYXJrZXJUYWcpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgVXRpbC5iaW5kKCJidWlsZC5pbmNvbXBsZXRlQ2xhc3NQYXRoIiwgZS5taXNzaW5nQ2xhc3NGaWxlKSk7IC8vJE5PTi1OTFMtMSQKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKwl9IGNhdGNoIChNaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbiBlKSB7CisJCS8vIGRvIG5vdCBsb2cgdGhpcyBleGNlcHRpb24gc2luY2UgaXRzIHRocm93biB0byBoYW5kbGUgYWJvcnRlZCBjb21waWxlcyBiZWNhdXNlIG9mIG1pc3Npbmcgc291cmNlIGZpbGVzCisJCWlmIChERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImJ1aWxkLm1pc3NpbmdTb3VyY2VGaWxlIiwgZS5taXNzaW5nU291cmNlRmlsZSkpOyAvLyROT04tTkxTLTEkCisJCXJlbW92ZVByb2JsZW1zRm9yKGN1cnJlbnRQcm9qZWN0KTsgLy8gbWFrZSB0aGlzIHRoZSBvbmx5IHByb2JsZW0gZm9yIHRoaXMgcHJvamVjdAorCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQubWlzc2luZ1NvdXJjZUZpbGUiLCBlLm1pc3NpbmdTb3VyY2VGaWxlKSk7IC8vJE5PTi1OTFMtMSQKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKwl9IGZpbmFsbHkgeworCQlpZiAoIW9rKQorCQkJLy8gSWYgdGhlIGJ1aWxkIGZhaWxlZCwgY2xlYXIgdGhlIHByZXZpb3VzbHkgYnVpbHQgc3RhdGUsIGZvcmNpbmcgYSBmdWxsIGJ1aWxkIG5leHQgdGltZS4KKwkJCWNsZWFyTGFzdFN0YXRlKCk7CisJCW5vdGlmaWVyLmRvbmUoKTsKKwkJY2xlYW51cCgpOworCX0KKwlJUHJvamVjdFtdIHJlcXVpcmVkUHJvamVjdHMgPSBnZXRSZXF1aXJlZFByb2plY3RzKHRydWUpOworCWlmIChERUJVRykKKwkJU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBidWlsZCBvZiAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKKwkJCSsgIiBAICIgKyBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHJlcXVpcmVkUHJvamVjdHM7Cit9CisKK3ByaXZhdGUgdm9pZCBidWlsZEFsbCgpIHsKKwlub3RpZmllci5jaGVja0NhbmNlbCgpOworCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5wcmVwYXJpbmdCdWlsZCIpKTsgLy8kTk9OLU5MUy0xJAorCWlmIChERUJVRyAmJiB0aGlzLmxhc3RTdGF0ZSAhPSBudWxsKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsZWFyaW5nIGxhc3Qgc3RhdGUgOiAiICsgdGhpcy5sYXN0U3RhdGUpOyAvLyROT04tTkxTLTEkCisJY2xlYXJMYXN0U3RhdGUoKTsKKwlCYXRjaEltYWdlQnVpbGRlciBpbWFnZUJ1aWxkZXIgPSBuZXcgQmF0Y2hJbWFnZUJ1aWxkZXIodGhpcyk7CisJaW1hZ2VCdWlsZGVyLmJ1aWxkKCk7CisJcmVjb3JkTmV3U3RhdGUoaW1hZ2VCdWlsZGVyLm5ld1N0YXRlKTsKK30KKworcHJpdmF0ZSB2b2lkIGJ1aWxkRGVsdGFzKFNpbXBsZUxvb2t1cFRhYmxlIGRlbHRhcykgeworCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnByZXBhcmluZ0J1aWxkIikpOyAvLyROT04tTkxTLTEkCisJaWYgKERFQlVHICYmIHRoaXMubGFzdFN0YXRlICE9IG51bGwpCisJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSA6ICIgKyB0aGlzLmxhc3RTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKKwljbGVhckxhc3RTdGF0ZSgpOyAvLyBjbGVhciB0aGUgcHJldmlvdXNseSBidWlsdCBzdGF0ZSBzbyBpZiB0aGUgYnVpbGQgZmFpbHMsIGEgZnVsbCBidWlsZCB3aWxsIG9jY3VyIG5leHQgdGltZQorCUluY3JlbWVudGFsSW1hZ2VCdWlsZGVyIGltYWdlQnVpbGRlciA9IG5ldyBJbmNyZW1lbnRhbEltYWdlQnVpbGRlcih0aGlzKTsKKwlpZiAoaW1hZ2VCdWlsZGVyLmJ1aWxkKGRlbHRhcykpCisJCXJlY29yZE5ld1N0YXRlKGltYWdlQnVpbGRlci5uZXdTdGF0ZSk7CisJZWxzZQorCQlidWlsZEFsbCgpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKKwl0aGlzLmNsYXNzcGF0aCA9IG51bGw7CisJdGhpcy5vdXRwdXRGb2xkZXIgPSBudWxsOworCXRoaXMuc291cmNlRm9sZGVycyA9IG51bGw7CisJdGhpcy5sYXN0U3RhdGUgPSBudWxsOworCXRoaXMubm90aWZpZXIgPSBudWxsOworfQorCitwcml2YXRlIHZvaWQgY2xlYXJMYXN0U3RhdGUoKSB7CisJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuc2V0TGFzdEJ1aWx0U3RhdGUoY3VycmVudFByb2plY3QsIG51bGwpOworfQorCitwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVyKElDb250YWluZXIgZm9sZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7CisJCWlmIChjdXJyZW50UHJvamVjdC5nZXRGdWxsUGF0aCgpICE9IHBhcmVudC5nZXRGdWxsUGF0aCgpKQorCQkJY3JlYXRlRm9sZGVyKHBhcmVudCk7CisJCSgoSUZvbGRlcikgZm9sZGVyKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7CisJfQorfQorCitib29sZWFuIGZpbHRlclJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgeworCWlmIChmaWxlRmlsdGVycyAhPSBudWxsKSB7CisJCWNoYXJbXSBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWxlRmlsdGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKGZpbGVGaWx0ZXJzW2ldLCBuYW1lLCB0cnVlKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGZvbGRlckZpbHRlcnMgIT0gbnVsbCkgeworCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQlTdHJpbmcgcGF0aE5hbWUgPSBwYXRoLnRvU3RyaW5nKCk7CisJCWludCBjb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7CisJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIGNvdW50LS07CisJCWZvciAoaW50IGkgPSAwLCBsID0gZm9sZGVyRmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQlpZiAocGF0aE5hbWUuaW5kZXhPZihmb2xkZXJGaWx0ZXJzW2ldKSAhPSAtMSkKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspCisJCQkJCWlmIChmb2xkZXJGaWx0ZXJzW2ldLmVxdWFscyhwYXRoLnNlZ21lbnQoaikpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworcHJpdmF0ZSBTaW1wbGVMb29rdXBUYWJsZSBmaW5kRGVsdGFzKCkgeworCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5yZWFkaW5nRGVsdGEiLCBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZ2V0RGVsdGEoY3VycmVudFByb2plY3QpOworCVNpbXBsZUxvb2t1cFRhYmxlIGRlbHRhcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKKwlpZiAoZGVsdGEgIT0gbnVsbCkgeworCQlpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSkgeworCQkJaWYgKERFQlVHKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgc291cmNlIGRlbHRhIGZvcjogIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWRlbHRhcy5wdXQoY3VycmVudFByb2plY3QsIGRlbHRhKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyBkZWx0YSBmb3I6ICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCW5vdGlmaWVyLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBudWxsOworCX0KKworCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5UmVzb3VyY2VzLmtleVRhYmxlOworCU9iamVjdFtdIHZhbHVlVGFibGUgPSBiaW5hcnlSZXNvdXJjZXMudmFsdWVUYWJsZTsKKwluZXh0UHJvamVjdCA6IGZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGtleVRhYmxlW2ldOworCQlpZiAocCAhPSBudWxsICYmIHAgIT0gY3VycmVudFByb2plY3QpIHsKKwkJCVN0YXRlIHMgPSBnZXRMYXN0U3RhdGUocCk7CisJCQlpZiAoIWxhc3RTdGF0ZS53YXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKHAsIHMpKSB7IC8vIHNlZSBpZiB3ZSBjYW4gc2tpcCBpdHMgZGVsdGEKKwkJCQlpZiAocy53YXNOb29wQnVpbGQoKSkKKwkJCQkJY29udGludWUgbmV4dFByb2plY3Q7IC8vIHByb2plY3QgaGFzIG5vIHNvdXJjZSBmb2xkZXJzIGFuZCBjYW4gYmUgc2tpcHBlZAorCQkJCUlSZXNvdXJjZVtdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoSVJlc291cmNlW10pIHZhbHVlVGFibGVbaV07CisJCQkJaWYgKGNsYXNzRm9sZGVyc0FuZEphcnMubGVuZ3RoIDw9IDEpCisJCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0OyAvLyBwcm9qZWN0IGhhcyBubyBzdHJ1Y3R1cmFsIGNoYW5nZXMgaW4gaXRzIG91dHB1dCBmb2xkZXIKKwkJCQljbGFzc0ZvbGRlcnNBbmRKYXJzWzBdID0gbnVsbDsgLy8gc2tpcCB0aGUgb3V0cHV0IGZvbGRlcgorCQkJfQorCisJCQlub3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQucmVhZGluZ0RlbHRhIiwgcC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVsdGEgPSBnZXREZWx0YShwKTsKKwkJCWlmIChkZWx0YSAhPSBudWxsKSB7CisJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpIHsKKwkJCQkJaWYgKERFQlVHKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBiaW5hcnkgZGVsdGEgZm9yOiAiICsgcC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWRlbHRhcy5wdXQocCwgZGVsdGEpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pc3NpbmcgZGVsdGEgZm9yOiAiICsgcC5nZXROYW1lKCkpOwkgLy8kTk9OLU5MUy0xJAorCQkJCW5vdGlmaWVyLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisJbm90aWZpZXIuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gZGVsdGFzOworfQorCitwcml2YXRlIFN0YXRlIGdldExhc3RTdGF0ZShJUHJvamVjdCBwcm9qZWN0KSB7CisJcmV0dXJuIChTdGF0ZSkgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0TGFzdEJ1aWx0U3RhdGUocHJvamVjdCwgbm90aWZpZXIubW9uaXRvcik7Cit9CisKKy8qIFJldHVybiB0aGUgbGlzdCBvZiBwcm9qZWN0cyBmb3Igd2hpY2ggaXQgcmVxdWlyZXMgYSByZXNvdXJjZSBkZWx0YS4gVGhpcyBidWlsZGVyJ3MgcHJvamVjdAorKiBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGFuZCBuZWVkIG5vdCBiZSBzcGVjaWZpZWQuIEJ1aWxkZXJzIG11c3QgcmUtc3BlY2lmeSB0aGUgbGlzdCAKKyogb2YgaW50ZXJlc3RpbmcgcHJvamVjdHMgZXZlcnkgdGltZSB0aGV5IGFyZSBydW4gYXMgdGhpcyBpcyBub3QgY2FycmllZCBmb3J3YXJkCisqIGJleW9uZCB0aGUgbmV4dCBidWlsZC4gTWlzc2luZyBwcm9qZWN0cyBzaG91bGQgYmUgc3BlY2lmaWVkIGJ1dCB3aWxsIGJlIGlnbm9yZWQgdW50aWwKKyogdGhleSBhcmUgYWRkZWQgdG8gdGhlIHdvcmtzcGFjZS4KKyovCitwcml2YXRlIElQcm9qZWN0W10gZ2V0UmVxdWlyZWRQcm9qZWN0cyhib29sZWFuIGluY2x1ZGVCaW5hcnlQcmVyZXF1aXNpdGVzKSB7CisJaWYgKGphdmFQcm9qZWN0ID09IG51bGwgfHwgd29ya3NwYWNlUm9vdCA9PSBudWxsKSByZXR1cm4gbmV3IElQcm9qZWN0WzBdOworCisJQXJyYXlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOworCXRyeSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAoKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJpZXNbaV0pOworCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKKwkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCUlQcm9qZWN0IHAgPSBudWxsOworCQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCQkJcCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwYXRoLmxhc3RTZWdtZW50KCkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKKwkJCQkJCWlmIChpbmNsdWRlQmluYXJ5UHJlcmVxdWlzaXRlcyAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgeworCQkJCQkJCS8vIHNvbWUgYmluYXJ5IHJlc291cmNlcyBvbiB0aGUgY2xhc3MgcGF0aCBjYW4gY29tZSBmcm9tIHByb2plY3RzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHJvamVjdCByZWZlcmVuY2VzCisJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGguc2VnbWVudCgwKSk7CisJCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpCisJCQkJCQkJCXAgPSAoSVByb2plY3QpIHJlc291cmNlOworCQkJCQkJfQorCQkJCX0KKwkJCQlpZiAocCAhPSBudWxsICYmICFwcm9qZWN0cy5jb250YWlucyhwKSkKKwkJCQkJcHJvamVjdHMuYWRkKHApOworCQkJfQorCQl9CisJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOworCX0KKwlJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldOworCXByb2plY3RzLnRvQXJyYXkocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NwYXRoQ2hhbmdlZCgpIHsKKwlDbGFzc3BhdGhMb2NhdGlvbltdIG9sZENsYXNzcGF0aExvY2F0aW9ucyA9IGxhc3RTdGF0ZS5jbGFzc3BhdGhMb2NhdGlvbnM7CisJaW50IG5ld0xlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7CisJaW50IG9sZExlbmd0aCA9IG9sZENsYXNzcGF0aExvY2F0aW9ucy5sZW5ndGg7CisJaW50IGRpZmYgPSBuZXdMZW5ndGggLSBvbGRMZW5ndGg7CisJaWYgKGRpZmYgPT0gMCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7CisJCQlpZiAoY2xhc3NwYXRoW2ldLmVxdWFscyhvbGRDbGFzc3BhdGhMb2NhdGlvbnNbaV0pKSBjb250aW51ZTsKKwkJCWlmIChERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NwYXRoW2ldICsgIiAhPSAiICsgb2xkQ2xhc3NwYXRoTG9jYXRpb25zW2ldKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAoZGlmZiA9PSAxKSB7CisJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG5ld1NvdXJjZURpcmVjdG9yeSA9IG51bGw7CisJCWludCBuID0gMCwgbyA9IDA7CisJCWZvciAoOyBuIDwgbmV3TGVuZ3RoICYmIG8gPCBvbGRMZW5ndGg7IG4rKywgbysrKSB7CisJCQlpZiAoY2xhc3NwYXRoW25dLmVxdWFscyhvbGRDbGFzc3BhdGhMb2NhdGlvbnNbb10pKSBjb250aW51ZTsKKwkJCWlmIChkaWZmID09IDEgJiYgY2xhc3NwYXRoW25dIGluc3RhbmNlb2YgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIHsgLy8gYWRkZWQgYSBuZXcgc291cmNlIGZvbGRlcgorCQkJCW5ld1NvdXJjZURpcmVjdG9yeSA9IChDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgY2xhc3NwYXRoW25dOworCQkJCW8tLTsKKwkJCQlkaWZmID0gMDsgLy8gZm91bmQgbmV3IGVsZW1lbnQKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NwYXRoW25dICsgIiAhPSAiICsgb2xkQ2xhc3NwYXRoTG9jYXRpb25zW29dKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoZGlmZiA9PSAxICYmIGNsYXNzcGF0aFtuXSBpbnN0YW5jZW9mIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSAvLyBhZGRlZCBhIG5ldyBzb3VyY2UgZm9sZGVyIGF0IHRoZSBlbmQKKwkJCW5ld1NvdXJjZURpcmVjdG9yeSA9IChDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgY2xhc3NwYXRoW25dOworCQlpZiAobmV3U291cmNlRGlyZWN0b3J5ICE9IG51bGwpIHsKKwkJCUlDb250YWluZXIgc291cmNlRm9sZGVyID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihuZXcgUGF0aChuZXdTb3VyY2VEaXJlY3Rvcnkuc291cmNlUGF0aCkpOworCQkJaWYgKHNvdXJjZUZvbGRlciAhPSBudWxsICYmIHNvdXJjZUZvbGRlci5leGlzdHMoKSkgeworCQkJCXRyeSB7CisJCQkJCWlmIChzb3VyY2VGb2xkZXIubWVtYmVycygpLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7IC8vIGFkZGVkIGEgbmV3IGVtcHR5IHNvdXJjZSBmb2xkZXIKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJCX0KKwkJfQorCX0KKworCWlmIChERUJVRykKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDbGFzcyBwYXRoIHNpemUgY2hhbmdlZCIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHRydWU7Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBoYXNPdXRwdXRMb2NhdGlvbkNoYW5nZWQoKSB7CisJaWYgKG91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuZXF1YWxzKGxhc3RTdGF0ZS5vdXRwdXRMb2NhdGlvblN0cmluZykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChERUJVRykKKwkJU3lzdGVtLm91dC5wcmludGxuKG91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICE9ICIgKyBsYXN0U3RhdGUub3V0cHV0TG9jYXRpb25TdHJpbmcpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIHRydWU7Cit9IAorCitwcml2YXRlIGJvb2xlYW4gaGFzQmluYXJ5RGVsdGEoKSB7CisJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBnZXREZWx0YShjdXJyZW50UHJvamVjdCk7CisJaWYgKGRlbHRhICE9IG51bGwgJiYgZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSkgeworCQlJUmVzb3VyY2VbXSBjbGFzc0ZvbGRlcnNBbmRKYXJzID0gKElSZXNvdXJjZVtdKSBiaW5hcnlSZXNvdXJjZXMuZ2V0KGN1cnJlbnRQcm9qZWN0KTsKKwkJaWYgKGNsYXNzRm9sZGVyc0FuZEphcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBjbGFzc0ZvbGRlcnNBbmRKYXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCUlSZXNvdXJjZSBiaW5hcnlSZXNvdXJjZSA9IGNsYXNzRm9sZGVyc0FuZEphcnNbaV07IC8vIGVpdGhlciBhIC5jbGFzcyBmaWxlIGZvbGRlciBvciBhIHppcC9qYXIgZmlsZQorCQkJCWlmIChiaW5hcnlSZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCUlSZXNvdXJjZURlbHRhIGJpbmFyeURlbHRhID0gZGVsdGEuZmluZE1lbWJlcihiaW5hcnlSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworCQkJCQlpZiAoYmluYXJ5RGVsdGEgIT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVCdWlsZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRoaXMuamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY3VycmVudFByb2plY3QpOworCXRoaXMud29ya3NwYWNlUm9vdCA9IGN1cnJlbnRQcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwl0aGlzLm91dHB1dEZvbGRlciA9IChJQ29udGFpbmVyKSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisJaWYgKHRoaXMub3V0cHV0Rm9sZGVyID09IG51bGwpIHsKKwkJdGhpcy5vdXRwdXRGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJY3JlYXRlRm9sZGVyKHRoaXMub3V0cHV0Rm9sZGVyKTsKKwl9CisKKwkvLyBGbHVzaCB0aGUgZXhpc3RpbmcgZXh0ZXJuYWwgZmlsZXMgY2FjaGUgaWYgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgYnVpbGQgY3ljbGUKKwlTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKTsKKwlpZiAoYnVpbHRQcm9qZWN0cyA9PSBudWxsIHx8IGJ1aWx0UHJvamVjdHMuY29udGFpbnMocHJvamVjdE5hbWUpKSB7CisJCUphdmFNb2RlbC5mbHVzaEV4dGVybmFsRmlsZUNhY2hlKCk7CisJCWJ1aWx0UHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCWJ1aWx0UHJvamVjdHMuYWRkKHByb2plY3ROYW1lKTsKKworCUFycmF5TGlzdCBzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCXRoaXMuYmluYXJ5UmVzb3VyY2VzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOworCXRoaXMuY2xhc3NwYXRoID0gTmFtZUVudmlyb25tZW50LmNvbXB1dGVMb2NhdGlvbnMoCisJCXdvcmtzcGFjZVJvb3QsCisJCWphdmFQcm9qZWN0LAorCQlvdXRwdXRGb2xkZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLAorCQlzb3VyY2VMaXN0LAorCQliaW5hcnlSZXNvdXJjZXMpOworCXRoaXMuc291cmNlRm9sZGVycyA9IG5ldyBJQ29udGFpbmVyW3NvdXJjZUxpc3Quc2l6ZSgpXTsKKwlzb3VyY2VMaXN0LnRvQXJyYXkodGhpcy5zb3VyY2VGb2xkZXJzKTsKKworCVN0cmluZyBmaWx0ZXJTZXF1ZW5jZSA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfUkVTT1VSQ0VfQ09QWV9GSUxURVIpOworCWNoYXJbXVtdIGZpbHRlcnMgPSBmaWx0ZXJTZXF1ZW5jZSAhPSBudWxsICYmIGZpbHRlclNlcXVlbmNlLmxlbmd0aCgpID4gMAorCQk/IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCBmaWx0ZXJTZXF1ZW5jZS50b0NoYXJBcnJheSgpKQorCQk6IG51bGw7CisJaWYgKGZpbHRlcnMgPT0gbnVsbCkgeworCQl0aGlzLmZpbGVGaWx0ZXJzID0gbnVsbDsKKwkJdGhpcy5mb2xkZXJGaWx0ZXJzID0gbnVsbDsKKwl9IGVsc2UgeworCQlpbnQgZmlsZUNvdW50ID0gMCwgZm9sZGVyQ291bnQgPSAwOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJY2hhcltdIGYgPSBmaWx0ZXJzW2ldOworCQkJaWYgKGYubGVuZ3RoID09IDApIGNvbnRpbnVlOworCQkJaWYgKGZbZi5sZW5ndGggLSAxXSA9PSAnLycpIGZvbGRlckNvdW50Kys7IGVsc2UgZmlsZUNvdW50Kys7CisJCX0KKwkJdGhpcy5maWxlRmlsdGVycyA9IG5ldyBjaGFyW2ZpbGVDb3VudF1bXTsKKwkJdGhpcy5mb2xkZXJGaWx0ZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJDb3VudF07CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQljaGFyW10gZiA9IGZpbHRlcnNbaV07CisJCQlpZiAoZi5sZW5ndGggPT0gMCkgY29udGludWU7CisJCQlpZiAoZltmLmxlbmd0aCAtIDFdID09ICcvJykKKwkJCQlmb2xkZXJGaWx0ZXJzWy0tZm9sZGVyQ291bnRdID0gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGYsIDAsIGYubGVuZ3RoIC0gMSkpOworCQkJZWxzZQorCQkJCWZpbGVGaWx0ZXJzWy0tZmlsZUNvdW50XSA9IGY7CisJCX0KKwl9Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBpc1dvcnRoQnVpbGRpbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJYm9vbGVhbiBhYm9ydEJ1aWxkcyA9IEphdmFDb3JlLkFCT1JULmVxdWFscyhKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRIKSk7CisJaWYgKCFhYm9ydEJ1aWxkcykgcmV0dXJuIHRydWU7CisKKwlJTWFya2VyW10gbWFya2VycyA9CisJCWN1cnJlbnRQcm9qZWN0LmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX09ORSk7CisJaWYgKG1hcmtlcnMubGVuZ3RoID4gMCkgeworCQlpZiAoREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3J0ZWQgYnVpbGQgYmVjYXVzZSBwcm9qZWN0IGlzIGludm9sdmVkIGluIGEgY3ljbGUgb3IgaGFzIGNsYXNzcGF0aCBwcm9ibGVtcyIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gcmVtb3ZlIGFsbCBleGlzdGluZyBjbGFzcyBmaWxlcy4uLiBjYXVzZXMgYWxsIGRlcGVuZGVudCBwcm9qZWN0cyB0byBkbyB0aGUgc2FtZQorCQluZXcgQmF0Y2hJbWFnZUJ1aWxkZXIodGhpcykuc2NydWJPdXRwdXRGb2xkZXIoKTsKKworCQlyZW1vdmVQcm9ibGVtc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIHJlbW92ZSBhbGwgY29tcGlsYXRpb24gcHJvYmxlbXMKKworCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQuYWJvcnREdWVUb0NsYXNzcGF0aFByb2JsZW1zIikpOyAvLyROT04tTkxTLTEkCisJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyBtYWtlIHN1cmUgYWxsIHByZXJlcSBwcm9qZWN0cyBoYXZlIHZhbGlkIGJ1aWxkIHN0YXRlcy4uLiBvbmx5IHdoZW4gYWJvcnRpbmcgYnVpbGRzIHNpbmNlIHByb2plY3RzIGluIGN5Y2xlcyBkbyBub3QgaGF2ZSBidWlsZCBzdGF0ZXMKKwlJUHJvamVjdFtdIHJlcXVpcmVkUHJvamVjdHMgPSBnZXRSZXF1aXJlZFByb2plY3RzKGZhbHNlKTsKKwluZXh0IDogZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlcXVpcmVkUHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSVByb2plY3QgcCA9IHJlcXVpcmVkUHJvamVjdHNbaV07CisJCWlmIChnZXRMYXN0U3RhdGUocCkgPT0gbnVsbCkgIHsKKwkJCWlmIChERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3J0ZWQgYnVpbGQgYmVjYXVzZSBwcmVyZXEgcHJvamVjdCAiICsgcC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkrICIgd2FzIG5vdCBidWlsdCIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vIHJlbW92ZSBhbGwgZXhpc3RpbmcgY2xhc3MgZmlsZXMuLi4gY2F1c2VzIGFsbCBkZXBlbmRlbnQgcHJvamVjdHMgdG8gZG8gdGhlIHNhbWUKKwkJCW5ldyBCYXRjaEltYWdlQnVpbGRlcih0aGlzKS5zY3J1Yk91dHB1dEZvbGRlcigpOworCisJCQlyZW1vdmVQcm9ibGVtc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKKwkJCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKFByb2JsZW1NYXJrZXJUYWcpOworCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQucHJlcmVxUHJvamVjdFdhc05vdEJ1aWx0IiwgcC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworcHJpdmF0ZSB2b2lkIHJlY29yZE5ld1N0YXRlKFN0YXRlIHN0YXRlKSB7CisJT2JqZWN0W10ga2V5VGFibGUgPSBiaW5hcnlSZXNvdXJjZXMua2V5VGFibGU7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJSVByb2plY3QgcHJlcmVxUHJvamVjdCA9IChJUHJvamVjdCkga2V5VGFibGVbaV07CisJCWlmIChwcmVyZXFQcm9qZWN0ICE9IG51bGwgJiYgcHJlcmVxUHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKKwkJCXN0YXRlLnJlY29yZFN0cnVjdHVyYWxEZXBlbmRlbmN5KHByZXJlcVByb2plY3QsIGdldExhc3RTdGF0ZShwcmVyZXFQcm9qZWN0KSk7CisJfQorCisJaWYgKERFQlVHKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZGluZyBuZXcgc3RhdGUgOiAiICsgc3RhdGUpOyAvLyROT04tTkxTLTEkCisJLy8gc3RhdGUuZHVtcCgpOworCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnNldExhc3RCdWlsdFN0YXRlKGN1cnJlbnRQcm9qZWN0LCBzdGF0ZSk7Cit9CisKKy8qKgorICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIkphdmFCdWlsZGVyIGZvciAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nQ2xhc3NGaWxlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTVmMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nQ2xhc3NGaWxlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIGJ1aWxkIHNob3VsZCBiZSBhYm9ydGVkIGJlY2F1c2UgYSByZWZlcmVuY2VkCisgKiBjbGFzcyBmaWxlIGNhbm5vdCBiZSBmb3VuZC4KKyAqLworcHVibGljIGNsYXNzIE1pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworcHJvdGVjdGVkIFN0cmluZyBtaXNzaW5nQ2xhc3NGaWxlOworCitwdWJsaWMgTWlzc2luZ0NsYXNzRmlsZUV4Y2VwdGlvbihTdHJpbmcgbWlzc2luZ0NsYXNzRmlsZSkgeworCXRoaXMubWlzc2luZ0NsYXNzRmlsZSA9IG1pc3NpbmdDbGFzc0ZpbGU7Cit9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmM2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIGJ1aWxkIHNob3VsZCBiZSBhYm9ydGVkIGJlY2F1c2UgYSBzb3VyY2UgZmlsZSBpcyBtaXNzaW5nL2VtcHR5LgorICovCitwdWJsaWMgY2xhc3MgTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworcHJvdGVjdGVkIFN0cmluZyBtaXNzaW5nU291cmNlRmlsZTsKKworcHVibGljIE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKFN0cmluZyBtaXNzaW5nU291cmNlRmlsZSkgeworCXRoaXMubWlzc2luZ1NvdXJjZUZpbGUgPSBtaXNzaW5nU291cmNlRmlsZTsKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL05hbWVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9OYW1lRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZiYjJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9OYW1lRW52aXJvbm1lbnQuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIE5hbWVFbnZpcm9ubWVudCBpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnQgeworCitDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzcGF0aExvY2F0aW9uczsKK1N0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXM7IC8vIGFzc3VtZWQgdGhhdCBlYWNoIG5hbWUgaXMgb2YgdGhlIGZvcm0gImEvYi9DbGFzc05hbWUiCitTdHJpbmdbXSBhZGRpdGlvbmFsU291cmNlRmlsZW5hbWVzOyAvLyBhc3N1bWVkIHRoYXQgZWFjaCBuYW1lIGlzIG9mIHRoZSBmb3JtICJkOi9lY2xpcHNlL1Rlc3QvYS9iL0NsYXNzTmFtZS5qYXZhIgorCitib29sZWFuIGlzSW5jcmVtZW50YWxCdWlsZDsKKworQ2xhc3NwYXRoTG9jYXRpb25bXSBiaW5hcnlMb2NhdGlvbnM7CitDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVtdIHNvdXJjZUxvY2F0aW9uczsKKworcHVibGljIE5hbWVFbnZpcm9ubWVudChDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzcGF0aExvY2F0aW9ucykgeworCXRoaXMuY2xhc3NwYXRoTG9jYXRpb25zID0gY2xhc3NwYXRoTG9jYXRpb25zOworCXRoaXMuaXNJbmNyZW1lbnRhbEJ1aWxkID0gZmFsc2U7CisJc3BsaXRMb2NhdGlvbnMoKTsKKwlzZXROYW1lcyhuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdKTsKK30KKworcHVibGljIE5hbWVFbnZpcm9ubWVudChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKwl0cnkgeworCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwkJSVJlc291cmNlIG91dHB1dEZvbGRlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJU3RyaW5nIG91dHB1dEZvbGRlckxvY2F0aW9uID0gbnVsbDsKKwkJaWYgKG91dHB1dEZvbGRlciAhPSBudWxsICYmIG91dHB1dEZvbGRlci5leGlzdHMoKSkKKwkJCW91dHB1dEZvbGRlckxvY2F0aW9uID0gb3V0cHV0Rm9sZGVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKKwkJdGhpcy5jbGFzc3BhdGhMb2NhdGlvbnMgPSBjb21wdXRlTG9jYXRpb25zKHdvcmtzcGFjZVJvb3QsIGphdmFQcm9qZWN0LCBvdXRwdXRGb2xkZXJMb2NhdGlvbiwgbnVsbCwgbnVsbCk7CisJCXRoaXMuaXNJbmNyZW1lbnRhbEJ1aWxkID0gZmFsc2U7CisJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl0aGlzLmNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvblswXTsKKwl9CisJc3BsaXRMb2NhdGlvbnMoKTsKKwlzZXROYW1lcyhuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdKTsKK30KKworLyogU29tZSBleGFtcGxlcyBvZiByZXNvbHZlZCBjbGFzcyBwYXRoIGVudHJpZXMuCisqIFJlbWVtYmVyIHRvIHNlYXJjaCBjbGFzcyBwYXRoIGluIHRoZSBvcmRlciB0aGF0IGl0IHdhcyBkZWZpbmVkLgorKgorKiAxYS4gdHlwaWNhbCBwcm9qZWN0IHdpdGggbm8gc291cmNlIGZvbGRlcnM6CisqICAgL1Rlc3RbQ1BFX1NPVVJDRV1bS19TT1VSQ0VdIC0+IEQ6L2VjbGlwc2UudGVzdC9UZXN0CisqIDFiLiBwcm9qZWN0IHdpdGggc291cmNlIGZvbGRlcnM6CisqICAgL1Rlc3Qvc3JjMVtDUEVfU09VUkNFXVtLX1NPVVJDRV0gLT4gRDovZWNsaXBzZS50ZXN0L1Rlc3Qvc3JjMQorKiAgIC9UZXN0L3NyYzJbQ1BFX1NPVVJDRV1bS19TT1VSQ0VdIC0+IEQ6L2VjbGlwc2UudGVzdC9UZXN0L3NyYzIKKyogIE5PVEU6IFRoZXNlIGNhbiBiZSBpbiBhbnkgb3JkZXIgJiBzZXBhcmF0ZWQgYnkgcHJlcmVxIHByb2plY3RzIG9yIGxpYnJhcmllcworKiAxYy4gcHJvamVjdCBleHRlcm5hbCB0byB3b3Jrc3BhY2UgKG9ubHkgZGV0ZWN0YWJsZSB1c2luZyBnZXRMb2NhdGlvbigpKToKKyogICAvVGVzdC9zcmNbQ1BFX1NPVVJDRV1bS19TT1VSQ0VdIC0+IGQ6L2VjbGlwc2Uuenp6L3NyYworKiAgTmVlZCB0byBzZWFyY2ggc291cmNlIGZvbGRlciAmIG91dHB1dCBmb2xkZXIKKyoKKyogMi4gemlwIGZpbGVzOgorKiAgIEQ6L2o5L2xpYi9qY2xNYXgvY2xhc3Nlcy56aXBbQ1BFX0xJQlJBUlldW0tfQklOQVJZXVtzb3VyY2VQYXRoOmQ6L2o5L2xpYi9qY2xNYXgvc291cmNlL3NvdXJjZS56aXBdCisqICAgICAgLT4gRDovajkvbGliL2pjbE1heC9jbGFzc2VzLnppcAorKiAgQUxXQVlTIHdhbnQgdG8gdGFrZSB0aGUgbGlicmFyeSBwYXRoIGFzIGlzCisqCisqIDNhLiBwcmVyZXEgcHJvamVjdCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGhhcyBhIHNvdXJjZSBvciBvdXRwdXQgZm9sZGVyKToKKyogICAvVGVzdFtDUEVfUFJPSkVDVF1bS19TT1VSQ0VdIC0+IEQ6L2VjbGlwc2UudGVzdC9UZXN0CisqICBBTFdBWVMgd2FudCB0byBhcHBlbmQgdGhlIG91dHB1dCBmb2xkZXIgJiBPTkxZIHNlYXJjaCBmb3IgLmNsYXNzIGZpbGVzCisqLworcHVibGljIHN0YXRpYyBDbGFzc3BhdGhMb2NhdGlvbltdIGNvbXB1dGVMb2NhdGlvbnMoCisJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCwKKwlJSmF2YVByb2plY3QgamF2YVByb2plY3QsCisJU3RyaW5nIG91dHB1dEZvbGRlckxvY2F0aW9uLAorCUFycmF5TGlzdCBzb3VyY2VGb2xkZXJzLAorCVNpbXBsZUxvb2t1cFRhYmxlIGJpbmFyeVJlc291cmNlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gKChKYXZhUHJvamVjdCkgamF2YVByb2plY3QpLmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUsIHRydWUpOworCWludCBjcENvdW50ID0gMDsKKwlpbnQgbWF4ID0gY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7CisJQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc3BhdGhMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bbWF4XTsKKworCWJvb2xlYW4gZmlyc3RTb3VyY2VGb2xkZXIgPSB0cnVlOworCW5leHRFbnRyeSA6IGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoRW50cmllc1tpXTsKKwkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgcGF0aCwgdHJ1ZSk7CisJCWlmICh0YXJnZXQgPT0gbnVsbCkgY29udGludWUgbmV4dEVudHJ5OworCisJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKKwkJCXN3aXRjaChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgeworCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgorCQkJCQlpZiAob3V0cHV0Rm9sZGVyTG9jYXRpb24gPT0gbnVsbCB8fCAhKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikpIGNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCQkJaWYgKHNvdXJjZUZvbGRlcnMgIT0gbnVsbCkgeyAvLyBub3JtYWwgYnVpbGRlciBtb2RlCisJCQkJCQlzb3VyY2VGb2xkZXJzLmFkZChyZXNvdXJjZSk7CisJCQkJCQljbGFzc3BhdGhMb2NhdGlvbnNbY3BDb3VudCsrXSA9CisJCQkJCQkJQ2xhc3NwYXRoTG9jYXRpb24uZm9yU291cmNlRm9sZGVyKHJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgb3V0cHV0Rm9sZGVyTG9jYXRpb24pOworCQkJCQl9IGVsc2UgaWYgKGZpcnN0U291cmNlRm9sZGVyKSB7IC8vIGFkZCB0aGUgb3V0cHV0IGZvbGRlciBvbmx5IG9uY2UKKwkJCQkJCWZpcnN0U291cmNlRm9sZGVyID0gZmFsc2U7CisJCQkJCQljbGFzc3BhdGhMb2NhdGlvbnNbY3BDb3VudCsrXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvckJpbmFyeUZvbGRlcihvdXRwdXRGb2xkZXJMb2NhdGlvbik7CisJCQkJCX0KKwkJCQkJY29udGludWUgbmV4dEVudHJ5OworCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSkgY29udGludWUgbmV4dEVudHJ5OworCQkJCQlJUHJvamVjdCBwcmVyZXFQcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKKwkJCQkJaWYgKCFwcmVyZXFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSBjb250aW51ZSBuZXh0RW50cnk7CisJCQkJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gSmF2YUNvcmUuY3JlYXRlKHByZXJlcVByb2plY3QpLmdldE91dHB1dExvY2F0aW9uKCk7CisJCQkJCUlSZXNvdXJjZSBwcmVyZXFPdXRwdXRGb2xkZXI7CisJCQkJCWlmIChwcmVyZXFQcm9qZWN0LmdldEZ1bGxQYXRoKCkuZXF1YWxzKG91dHB1dExvY2F0aW9uKSkgeworCQkJCQkJcHJlcmVxT3V0cHV0Rm9sZGVyID0gcHJlcmVxUHJvamVjdDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByZXJlcU91dHB1dEZvbGRlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihvdXRwdXRMb2NhdGlvbik7CisJCQkJCQlpZiAocHJlcmVxT3V0cHV0Rm9sZGVyID09IG51bGwgfHwgIXByZXJlcU91dHB1dEZvbGRlci5leGlzdHMoKSB8fCAhKHByZXJlcU91dHB1dEZvbGRlciBpbnN0YW5jZW9mIElGb2xkZXIpKQorCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCQkJfQorCQkJCQlpZiAocHJlcmVxT3V0cHV0Rm9sZGVyLmdldExvY2F0aW9uKCkgPT0gbnVsbCkgLy8gc2FuaXR5IGNoZWNrCisJCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQkJCWlmIChiaW5hcnlSZXNvdXJjZXMgIT0gbnVsbCkgeyAvLyBub3JtYWwgYnVpbGRlciBtb2RlCisJCQkJCQlJUmVzb3VyY2VbXSBleGlzdGluZ1Jlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgYmluYXJ5UmVzb3VyY2VzLmdldChwcmVyZXFQcm9qZWN0KTsKKwkJCQkJCWlmIChleGlzdGluZ1Jlc291cmNlcyA9PSBudWxsKQorCQkJCQkJCWJpbmFyeVJlc291cmNlcy5wdXQocHJlcmVxUHJvamVjdCwgbmV3IElSZXNvdXJjZVtdIHtwcmVyZXFPdXRwdXRGb2xkZXJ9KTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlleGlzdGluZ1Jlc291cmNlc1swXSA9IHByZXJlcU91dHB1dEZvbGRlcjsgLy8gcHJvamVjdCdzIG91dHB1dCBmb2xkZXIgaXMgYWx3YXlzIGZpcnN0CisJCQkJCX0KKwkJCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIocHJlcmVxT3V0cHV0Rm9sZGVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7CisJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKKworCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKKwkJCQkJaWYgKHJlc291cmNlLmdldExvY2F0aW9uKCkgPT0gbnVsbCkgLy8gc2FuaXR5IGNoZWNrCisJCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJCQlpZiAoIShKYXZhQnVpbGRlci5KQVJfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSB8fCBKYXZhQnVpbGRlci5aSVBfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkpCisJCQkJCQkJY29udGludWUgbmV4dEVudHJ5OworCQkJCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JMaWJyYXJ5KHJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7CisJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJCQljbGFzc3BhdGhMb2NhdGlvbnNbY3BDb3VudCsrXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvckJpbmFyeUZvbGRlcihyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOworCQkJCQl9CisJCQkJCWlmIChiaW5hcnlSZXNvdXJjZXMgIT0gbnVsbCkgeyAvLyBub3JtYWwgYnVpbGRlciBtb2RlCisJCQkJCQlJUHJvamVjdCBwID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOyAvLyBjYW4gYmUgdGhlIHByb2plY3QgYmVpbmcgYnVpbHQKKwkJCQkJCUlSZXNvdXJjZVtdIGV4aXN0aW5nUmVzb3VyY2VzID0gKElSZXNvdXJjZVtdKSBiaW5hcnlSZXNvdXJjZXMuZ2V0KHApOworCQkJCQkJaWYgKGV4aXN0aW5nUmVzb3VyY2VzID09IG51bGwpIHsKKwkJCQkJCQlleGlzdGluZ1Jlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbXSB7bnVsbCwgcmVzb3VyY2V9OyAvLyBwcm9qZWN0J3Mgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgZmlyc3QsIG51bGwgaWYgbm90IGluY2x1ZGVkCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWludCBzaXplID0gZXhpc3RpbmdSZXNvdXJjZXMubGVuZ3RoOworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdSZXNvdXJjZXMsIDAsIGV4aXN0aW5nUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtzaXplICsgMV0sIDAsIHNpemUpOworCQkJCQkJCWV4aXN0aW5nUmVzb3VyY2VzW3NpemVdID0gcmVzb3VyY2U7CisJCQkJCQl9CisJCQkJCQliaW5hcnlSZXNvdXJjZXMucHV0KHAsIGV4aXN0aW5nUmVzb3VyY2VzKTsKKwkJCQkJfQorCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQl9CisJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmlsZSkgeworCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJaWYgKCEoSmF2YUJ1aWxkZXIuSkFSX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgfHwgSmF2YUJ1aWxkZXIuWklQX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpKQorCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCWNsYXNzcGF0aExvY2F0aW9uc1tjcENvdW50KytdID0gQ2xhc3NwYXRoTG9jYXRpb24uZm9yTGlicmFyeShwYXRoLnRvU3RyaW5nKCkpOworCQl9CisJfQorCWlmIChjcENvdW50IDwgbWF4KQorCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aExvY2F0aW9ucywgMCwgKGNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltjcENvdW50XSksIDAsIGNwQ291bnQpOworCXJldHVybiBjbGFzc3BhdGhMb2NhdGlvbnM7Cit9CisKK3B1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aExvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJY2xhc3NwYXRoTG9jYXRpb25zW2ldLmNsZWFudXAoKTsKK30KKworcHJpdmF0ZSBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgY2hhcltdIHR5cGVOYW1lKSB7CisJaWYgKGluaXRpYWxUeXBlTmFtZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW5pdGlhbFR5cGVOYW1lcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyhpbml0aWFsVHlwZU5hbWVzW2ldKSkgeworCQkJCWlmIChpc0luY3JlbWVudGFsQnVpbGQpCisJCQkJCS8vIGNhdGNoIHRoZSBjYXNlIHRoYXQgYSB0eXBlIGluc2lkZSBhIHNvdXJjZSBmaWxlIGhhcyBiZWVuIHJlbmFtZWQgYnV0IG90aGVyIGNsYXNzIGZpbGVzIGFyZSBsb29raW5nIGZvciBpdAorCQkJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBuZXcgQWJvcnRJbmNyZW1lbnRhbEJ1aWxkRXhjZXB0aW9uKHF1YWxpZmllZFR5cGVOYW1lKSk7CisJCQkJcmV0dXJuIG51bGw7IC8vIGxvb2tpbmcgZm9yIGEgZmlsZSB3aGljaCB3ZSBrbm93IHdhcyBwcm92aWRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21waWxhdGlvbgorCQkJfQorCQl9CisJfQorCisJU3RyaW5nIHFCaW5hcnlGaWxlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgYmluYXJ5RmlsZU5hbWUgPSBxQmluYXJ5RmlsZU5hbWU7CisJU3RyaW5nIHFQYWNrYWdlTmFtZSA9ICAiIjsgLy8kTk9OLU5MUy0xJAorCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKSA+IHR5cGVOYW1lLmxlbmd0aCkgeworCQlpbnQgdHlwZU5hbWVTdGFydCA9IHFCaW5hcnlGaWxlTmFtZS5sZW5ndGgoKSAtIHR5cGVOYW1lLmxlbmd0aCAtIDY7IC8vIHNpemUgb2YgIi5jbGFzcyIKKwkJcVBhY2thZ2VOYW1lID0gIHFCaW5hcnlGaWxlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWVTdGFydCAtIDEpOworCQliaW5hcnlGaWxlTmFtZSA9IHFCaW5hcnlGaWxlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWVTdGFydCk7CisJfQorCisJaWYgKHNvdXJjZUxvY2F0aW9ucyAhPSBudWxsICYmIHNvdXJjZUxvY2F0aW9uc1swXS5pc1BhY2thZ2UocVBhY2thZ2VOYW1lKSkgeyAvLyBsb29rcyBpbiBjb21tb24gb3V0cHV0IGZvbGRlcgorCQlpZiAoYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lcyAhPSBudWxsKSB7CisJCQlTdHJpbmcgcVNvdXJjZUZpbGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUgKyAiLmphdmEiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9CisJCQkJCXNvdXJjZUxvY2F0aW9uc1tpXS5maW5kU291cmNlRmlsZShxU291cmNlRmlsZU5hbWUsIHFQYWNrYWdlTmFtZSwgdHlwZU5hbWUsIGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXMpOworCQkJCWlmIChhbnN3ZXIgIT0gbnVsbCkgcmV0dXJuIGFuc3dlcjsKKwkJCX0KKwkJfQorCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gc291cmNlTG9jYXRpb25zWzBdLmZpbmRDbGFzcyhiaW5hcnlGaWxlTmFtZSwgcVBhY2thZ2VOYW1lLCBxQmluYXJ5RmlsZU5hbWUpOworCQlpZiAoYW5zd2VyICE9IG51bGwpIHJldHVybiBhbnN3ZXI7CisJfQorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJTmFtZUVudmlyb25tZW50QW5zd2VyIGFuc3dlciA9IGJpbmFyeUxvY2F0aW9uc1tpXS5maW5kQ2xhc3MoYmluYXJ5RmlsZU5hbWUsIHFQYWNrYWdlTmFtZSwgcUJpbmFyeUZpbGVOYW1lKTsKKwkJaWYgKGFuc3dlciAhPSBudWxsKSByZXR1cm4gYW5zd2VyOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsKKwlpZiAoY29tcG91bmROYW1lICE9IG51bGwpCisJCXJldHVybiBmaW5kQ2xhc3MoCisJCQluZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsICcvJykpLAorCQkJY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdIHR5cGVOYW1lLCBjaGFyW11bXSBwYWNrYWdlTmFtZSkgeworCWlmICh0eXBlTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gZmluZENsYXNzKAorCQkJbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLycpKSwKKwkJCXR5cGVOYW1lKTsKKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSwgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJcmV0dXJuIGlzUGFja2FnZShuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChjb21wb3VuZE5hbWUsIHBhY2thZ2VOYW1lLCAnLycpKSk7Cit9CisKK3B1YmxpYyBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKKwlpZiAoc291cmNlTG9jYXRpb25zICE9IG51bGwgJiYgc291cmNlTG9jYXRpb25zWzBdLmlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpIC8vIGxvb2tzIGluIGNvbW1vbiBvdXRwdXQgZm9sZGVyCisJCXJldHVybiB0cnVlOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmIChiaW5hcnlMb2NhdGlvbnNbaV0uaXNQYWNrYWdlKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworcHVibGljIHZvaWQgc2V0TmFtZXMoU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lcywgU3RyaW5nW10gYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lcykgeworCXRoaXMuaW5pdGlhbFR5cGVOYW1lcyA9IGluaXRpYWxUeXBlTmFtZXM7CisJdGhpcy5hZGRpdGlvbmFsU291cmNlRmlsZW5hbWVzID0gYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lczsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQljbGFzc3BhdGhMb2NhdGlvbnNbaV0ucmVzZXQoKTsKK30KKworcHJpdmF0ZSB2b2lkIHNwbGl0TG9jYXRpb25zKCkgeworCWludCBsZW5ndGggPSBjbGFzc3BhdGhMb2NhdGlvbnMubGVuZ3RoOworCUFycmF5TGlzdCBzTG9jYXRpb25zID0gbmV3IEFycmF5TGlzdChsZW5ndGgpOworCUFycmF5TGlzdCBiTG9jYXRpb25zID0gbmV3IEFycmF5TGlzdChsZW5ndGgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJQ2xhc3NwYXRoTG9jYXRpb24gY2xhc3NwYXRoID0gY2xhc3NwYXRoTG9jYXRpb25zW2ldOworCQlpZiAoY2xhc3NwYXRoIGluc3RhbmNlb2YgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpCisJCQlzTG9jYXRpb25zLmFkZChjbGFzc3BhdGgpOworCQllbHNlCisJCQliTG9jYXRpb25zLmFkZChjbGFzc3BhdGgpOworCX0KKworCWlmIChzTG9jYXRpb25zLmlzRW1wdHkoKSkgeworCQl0aGlzLnNvdXJjZUxvY2F0aW9ucyA9IG51bGw7CisJfSBlbHNlIHsKKwkJdGhpcy5zb3VyY2VMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnlbc0xvY2F0aW9ucy5zaXplKCldOworCQlzTG9jYXRpb25zLnRvQXJyYXkodGhpcy5zb3VyY2VMb2NhdGlvbnMpOworCX0KKwl0aGlzLmJpbmFyeUxvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltiTG9jYXRpb25zLnNpemUoKV07CisJYkxvY2F0aW9ucy50b0FycmF5KHRoaXMuYmluYXJ5TG9jYXRpb25zKTsKK30KKwordm9pZCB0YWdBc0luY3JlbWVudGFsQnVpbGQoKSB7CisJdGhpcy5pc0luY3JlbWVudGFsQnVpbGQgPSB0cnVlOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUHJvYmxlbUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUHJvYmxlbUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjUxYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Qcm9ibGVtRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIFByb2JsZW1GYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFByb2JsZW1GYWN0b3J5IHsKKworc3RhdGljIFNpbXBsZUxvb2t1cFRhYmxlIGZhY3RvcmllcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSg1KTsKKworcHJpdmF0ZSBQcm9ibGVtRmFjdG9yeShMb2NhbGUgbG9jYWxlKSB7CisJc3VwZXIobG9jYWxlKTsKK30KKworcHVibGljIHN0YXRpYyBQcm9ibGVtRmFjdG9yeSBnZXRQcm9ibGVtRmFjdG9yeShMb2NhbGUgbG9jYWxlKSB7CisJUHJvYmxlbUZhY3RvcnkgZmFjdG9yeSA9IChQcm9ibGVtRmFjdG9yeSkgZmFjdG9yaWVzLmdldChsb2NhbGUpOworCWlmIChmYWN0b3J5ID09IG51bGwpCisJCWZhY3Rvcmllcy5wdXQobG9jYWxlLCBmYWN0b3J5ID0gbmV3IFByb2JsZW1GYWN0b3J5KGxvY2FsZSkpOworCXJldHVybiBmYWN0b3J5OworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9SZWZlcmVuY2VDb2xsZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1JlZmVyZW5jZUNvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FiMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9SZWZlcmVuY2VDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlQ29sbGVjdGlvbiB7CisKK2NoYXJbXVtdW10gcXVhbGlmaWVkTmFtZVJlZmVyZW5jZXM7IC8vIGNvbnRhaW5zIG5vIHNpbXBsZSBuYW1lcyBhcyBpbiBqdXN0ICdhJyB3aGljaCBpcyBrZXB0IGluIHNpbXBsZU5hbWVSZWZlcmVuY2VzIGluc3RlYWQKK2NoYXJbXVtdIHNpbXBsZU5hbWVSZWZlcmVuY2VzOworCitwcm90ZWN0ZWQgUmVmZXJlbmNlQ29sbGVjdGlvbihjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVSZWZlcmVuY2VzLCBjaGFyW11bXSBzaW1wbGVOYW1lUmVmZXJlbmNlcykgeworCXRoaXMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXMgPSBpbnRlcm5RdWFsaWZpZWROYW1lcyhxdWFsaWZpZWROYW1lUmVmZXJlbmNlcyk7CisJdGhpcy5zaW1wbGVOYW1lUmVmZXJlbmNlcyA9IGludGVyblNpbXBsZU5hbWVzKHNpbXBsZU5hbWVSZWZlcmVuY2VzLCB0cnVlKTsKK30KKworYm9vbGVhbiBpbmNsdWRlcyhjaGFyW10gc2ltcGxlTmFtZSkgeworCWZvciAoaW50IGkgPSAwLCBsID0gc2ltcGxlTmFtZVJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlpZiAoc2ltcGxlTmFtZSA9PSBzaW1wbGVOYW1lUmVmZXJlbmNlc1tpXSkgcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitib29sZWFuIGluY2x1ZGVzKGNoYXJbXVtdIHF1YWxpZmllZE5hbWUpIHsKKwlmb3IgKGludCBpID0gMCwgbCA9IHF1YWxpZmllZE5hbWVSZWZlcmVuY2VzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJaWYgKHF1YWxpZmllZE5hbWUgPT0gcXVhbGlmaWVkTmFtZVJlZmVyZW5jZXNbaV0pIHJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworYm9vbGVhbiBpbmNsdWRlcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzLCBjaGFyW11bXSBzaW1wbGVOYW1lcykgeworCS8vIGlmIGVpdGhlciBjb2xsZWN0aW9uIG9mIG5hbWVzIGlzIG51bGwsIGl0IG1lYW5zIGl0IGNvbnRhaW5lZCBhIHdlbGwga25vd24gbmFtZSBzbyB3ZSBrbm93IGl0IGFscmVhZHkgaGFzIGEgbWF0Y2gKKwlpZiAoc2ltcGxlTmFtZXMgPT0gbnVsbCB8fCBxdWFsaWZpZWROYW1lcyA9PSBudWxsKSB7CisJCWlmIChzaW1wbGVOYW1lcyA9PSBudWxsICYmIHF1YWxpZmllZE5hbWVzID09IG51bGwpIHsKKwkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgd2VsbCBrbm93biBtYXRjaCIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIGlmIChxdWFsaWZpZWROYW1lcyA9PSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbCA9IHNpbXBsZU5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCWlmIChpbmNsdWRlcyhzaW1wbGVOYW1lc1tpXSkpIHsKKwkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIG1hdGNoIGluIHdlbGwga25vd24gcGFja2FnZSB0byAiICsgbmV3IFN0cmluZyhzaW1wbGVOYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsID0gcXVhbGlmaWVkTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQkJY2hhcltdW10gcXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWVzW2ldOworCQkJCWlmIChxdWFsaWZpZWROYW1lLmxlbmd0aCA9PSAxID8gaW5jbHVkZXMocXVhbGlmaWVkTmFtZVswXSkgOiBpbmNsdWRlcyhxdWFsaWZpZWROYW1lKSkgeworCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgd2VsbCBrbm93biBtYXRjaCBpbiAiICsgQ2hhck9wZXJhdGlvbi50b1N0cmluZyhxdWFsaWZpZWROYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBzaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCWlmIChpbmNsdWRlcyhzaW1wbGVOYW1lc1tpXSkpIHsKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsgaiA8IG07IGorKykgeworCQkJCQljaGFyW11bXSBxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZXNbal07CisJCQkJCWlmIChxdWFsaWZpZWROYW1lLmxlbmd0aCA9PSAxID8gaW5jbHVkZXMocXVhbGlmaWVkTmFtZVswXSkgOiBpbmNsdWRlcyhxdWFsaWZpZWROYW1lKSkgeworCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBmb3VuZCBtYXRjaCBpbiAiICsgQ2hhck9wZXJhdGlvbi50b1N0cmluZyhxdWFsaWZpZWROYW1lKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgIiB0byAiICsgbmV3IFN0cmluZyhzaW1wbGVOYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisKKy8vIFdoZW4gYW55IHR5cGUgaXMgY29tcGlsZWQsIGl0cyBtZXRob2RzIGFyZSB2ZXJpZmllZCBmb3IgY2VydGFpbiBwcm9ibGVtcworLy8gdGhlIE1ldGhvZFZlcmlmaWVyIHJlcXVlc3RzIDMgd2VsbCBrbm93biB0eXBlcyB3aGljaCBlbmQgdXAgaW4gdGhlIHJlZmVyZW5jZSBjb2xsZWN0aW9uCisvLyBoYXZpbmcgV2VsbEtub3duUXVhbGlmaWVkTmFtZXMgJiBXZWxsS25vd25TaW1wbGVOYW1lcywgc2F2ZXMgZXZlcnkgdHlwZSA0MCBieXRlcworLy8gTk9URTogVGhlc2UgY29sbGVjdGlvbnMgYXJlIHNvcnRlZCBieSBsZW5ndGgKK3N0YXRpYyBmaW5hbCBjaGFyW11bXVtdIFdlbGxLbm93blF1YWxpZmllZE5hbWVzID0gbmV3IGNoYXJbXVtdW10geworCVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04sCisJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfVEhST1dBQkxFLAorCVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCwKKwlUeXBlQ29uc3RhbnRzLkpBVkFfTEFORywKKwluZXcgY2hhcltdW10ge1R5cGVDb25zdGFudHMuSkFWQX0sCisJbmV3IGNoYXJbXVtdIHtuZXcgY2hhcltdIHsnbycsICdyJywgJ2cnfX0sCisJbmV3IGNoYXJbXVtdIHtuZXcgY2hhcltdIHsnYycsICdvJywgJ20nfX0sCisJVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyfTsgLy8gZGVmYXVsdCBwYWNrYWdlCitzdGF0aWMgZmluYWwgY2hhcltdW10gV2VsbEtub3duU2ltcGxlTmFtZXMgPSBuZXcgY2hhcltdW10geworCVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT05bMl0sCisJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfVEhST1dBQkxFWzJdLAorCVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVFsyXSwKKwlUeXBlQ29uc3RhbnRzLkpBVkEsCisJVHlwZUNvbnN0YW50cy5MQU5HLAorCW5ldyBjaGFyW10geydvJywgJ3InLCAnZyd9LAorCW5ldyBjaGFyW10geydjJywgJ28nLCAnbSd9fTsKKworc3RhdGljIGZpbmFsIGNoYXJbXVtdW10gRW1wdHlRdWFsaWZpZWROYW1lcyA9IG5ldyBjaGFyWzBdW11bXTsKK3N0YXRpYyBmaW5hbCBjaGFyW11bXSBFbXB0eVNpbXBsZU5hbWVzID0gbmV3IGNoYXJbMF1bXTsKKworLy8gZWFjaCBhcnJheSBjb250YWlucyBxdWFsaWZpZWQgY2hhcltdW10sIG9uZSBmb3Igc2l6ZSAyLCAzLCA0LCA1LCA2LCA3ICYgdGhlIHJlc3QKK3N0YXRpYyBmaW5hbCBpbnQgTWF4UXVhbGlmaWVkTmFtZXMgPSA3Oworc3RhdGljIEFycmF5TGlzdFtdIEludGVybmVkUXVhbGlmaWVkTmFtZXMgPSBuZXcgQXJyYXlMaXN0W01heFF1YWxpZmllZE5hbWVzXTsKKy8vIGVhY2ggYXJyYXkgY29udGFpbnMgc2ltcGxlIGNoYXJbXSwgb25lIGZvciBzaXplIDEgdG8gMjkgJiB0aGUgcmVzdAorc3RhdGljIGZpbmFsIGludCBNYXhTaW1wbGVOYW1lcyA9IDMwOworc3RhdGljIEFycmF5TGlzdFtdIEludGVybmVkU2ltcGxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0W01heFNpbXBsZU5hbWVzXTsKK3N0YXRpYyB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBNYXhRdWFsaWZpZWROYW1lczsgaSsrKQorCQlJbnRlcm5lZFF1YWxpZmllZE5hbWVzW2ldID0gbmV3IEFycmF5TGlzdCgzNyk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBNYXhTaW1wbGVOYW1lczsgaSsrKQorCQlJbnRlcm5lZFNpbXBsZU5hbWVzW2ldID0gbmV3IEFycmF5TGlzdCgxMSk7Cit9OworCitzdGF0aWMgY2hhcltdW11bXSBpbnRlcm5RdWFsaWZpZWROYW1lcyhBcnJheUxpc3QgcXVhbGlmaWVkU3RyaW5ncykgeworCWlmIChxdWFsaWZpZWRTdHJpbmdzID09IG51bGwpIHJldHVybiBFbXB0eVF1YWxpZmllZE5hbWVzOworCWludCBsZW5ndGggPSBxdWFsaWZpZWRTdHJpbmdzLnNpemUoKTsKKwlpZiAobGVuZ3RoID09IDApIHJldHVybiBFbXB0eVF1YWxpZmllZE5hbWVzOworCisJY2hhcltdW11bXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdW11bXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlyZXN1bHRbaV0gPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCAoKFN0cmluZykgcXVhbGlmaWVkU3RyaW5ncy5nZXQoaSkpLnRvQ2hhckFycmF5KCkpOworCXJldHVybiBpbnRlcm5RdWFsaWZpZWROYW1lcyhyZXN1bHQpOworfQorCitzdGF0aWMgY2hhcltdW11bXSBpbnRlcm5RdWFsaWZpZWROYW1lcyhjaGFyW11bXVtdIHF1YWxpZmllZE5hbWVzKSB7CisJaWYgKHF1YWxpZmllZE5hbWVzID09IG51bGwpIHJldHVybiBFbXB0eVF1YWxpZmllZE5hbWVzOworCWludCBsZW5ndGggPSBxdWFsaWZpZWROYW1lcy5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gRW1wdHlRdWFsaWZpZWROYW1lczsKKworCWNoYXJbXVtdW10ga2VlcGVycyA9IG5ldyBjaGFyW2xlbmd0aF1bXVtdOworCWludCBpbmRleCA9IDA7CisJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY2hhcltdW10gcXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWVzW2ldOworCQlpbnQgcUxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOworCQlmb3IgKGludCBqID0gMCwgayA9IFdlbGxLbm93blF1YWxpZmllZE5hbWVzLmxlbmd0aDsgaiA8IGs7IGorKykgeworCQkJY2hhcltdW10gd2VsbEtub3duTmFtZSA9IFdlbGxLbm93blF1YWxpZmllZE5hbWVzW2pdOworCQkJaWYgKHFMZW5ndGggPiB3ZWxsS25vd25OYW1lLmxlbmd0aCkKKwkJCQlicmVhazsgLy8gYWxsIHJlbWFpbmluZyB3ZWxsIGtub3duIG5hbWVzIGFyZSBzaG9ydGVyCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocXVhbGlmaWVkTmFtZSwgd2VsbEtub3duTmFtZSkpCisJCQkJY29udGludWUgbmV4dDsKKwkJfQorCisJCS8vIEludGVybmVkUXVhbGlmaWVkTmFtZXNbMF0gaXMgZm9yIHRoZSByZXN0ICg+IDcgJiAxKQorCQkvLyBJbnRlcm5lZFF1YWxpZmllZE5hbWVzWzFdIGlzIGZvciBzaXplIDIuLi4KKwkJLy8gSW50ZXJuZWRRdWFsaWZpZWROYW1lc1s2XSBpcyBmb3Igc2l6ZSA3CisJCUFycmF5TGlzdCBpbnRlcm5lZE5hbWVzID0gSW50ZXJuZWRRdWFsaWZpZWROYW1lc1txTGVuZ3RoIDw9IE1heFF1YWxpZmllZE5hbWVzID8gcUxlbmd0aCAtIDEgOiAwXTsKKwkJZm9yIChpbnQgaiA9IDAsIGsgPSBpbnRlcm5lZE5hbWVzLnNpemUoKTsgaiA8IGs7IGorKykgeworCQkJY2hhcltdW10gaW50ZXJuZWROYW1lID0gKGNoYXJbXVtdKSBpbnRlcm5lZE5hbWVzLmdldChqKTsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhxdWFsaWZpZWROYW1lLCBpbnRlcm5lZE5hbWUpKSB7CisJCQkJa2VlcGVyc1tpbmRleCsrXSA9IGludGVybmVkTmFtZTsKKwkJCQljb250aW51ZSBuZXh0OworCQkJfQorCQl9CisJCXF1YWxpZmllZE5hbWUgPSBpbnRlcm5TaW1wbGVOYW1lcyhxdWFsaWZpZWROYW1lLCBmYWxzZSk7CisJCWludGVybmVkTmFtZXMuYWRkKHF1YWxpZmllZE5hbWUpOworCQlrZWVwZXJzW2luZGV4KytdID0gcXVhbGlmaWVkTmFtZTsKKwl9CisJaWYgKGxlbmd0aCA+IGluZGV4KSB7CisJCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVtcHR5UXVhbGlmaWVkTmFtZXM7CisJCVN5c3RlbS5hcnJheWNvcHkoa2VlcGVycywgMCwga2VlcGVycyA9IG5ldyBjaGFyW2luZGV4XVtdW10sIDAsIGluZGV4KTsKKwl9CisJcmV0dXJuIGtlZXBlcnM7Cit9CisKK3N0YXRpYyBjaGFyW11bXSBpbnRlcm5TaW1wbGVOYW1lcyhBcnJheUxpc3Qgc2ltcGxlU3RyaW5ncykgeworCWlmIChzaW1wbGVTdHJpbmdzID09IG51bGwpIHJldHVybiBFbXB0eVNpbXBsZU5hbWVzOworCWludCBsZW5ndGggPSBzaW1wbGVTdHJpbmdzLnNpemUoKTsKKwlpZiAobGVuZ3RoID09IDApIHJldHVybiBFbXB0eVNpbXBsZU5hbWVzOworCisJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXJlc3VsdFtpXSA9ICgoU3RyaW5nKSBzaW1wbGVTdHJpbmdzLmdldChpKSkudG9DaGFyQXJyYXkoKTsKKwlyZXR1cm4gaW50ZXJuU2ltcGxlTmFtZXMocmVzdWx0LCB0cnVlKTsKK30KKworc3RhdGljIGNoYXJbXVtdIGludGVyblNpbXBsZU5hbWVzKGNoYXJbXVtdIHNpbXBsZU5hbWVzLCBib29sZWFuIHJlbW92ZVdlbGxLbm93bikgeworCWlmIChzaW1wbGVOYW1lcyA9PSBudWxsKSByZXR1cm4gRW1wdHlTaW1wbGVOYW1lczsKKwlpbnQgbGVuZ3RoID0gc2ltcGxlTmFtZXMubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVtcHR5U2ltcGxlTmFtZXM7CisKKwljaGFyW11bXSBrZWVwZXJzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCWludCBpbmRleCA9IDA7CisJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY2hhcltdIG5hbWUgPSBzaW1wbGVOYW1lc1tpXTsKKwkJaW50IHNMZW5ndGggPSBuYW1lLmxlbmd0aDsKKwkJZm9yIChpbnQgaiA9IDAsIGsgPSBXZWxsS25vd25TaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBrOyBqKyspIHsKKwkJCWNoYXJbXSB3ZWxsS25vd25OYW1lID0gV2VsbEtub3duU2ltcGxlTmFtZXNbal07CisJCQlpZiAoc0xlbmd0aCA+IHdlbGxLbm93bk5hbWUubGVuZ3RoKQorCQkJCWJyZWFrOyAvLyBhbGwgcmVtYWluaW5nIHdlbGwga25vd24gbmFtZXMgYXJlIHNob3J0ZXIKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhuYW1lLCB3ZWxsS25vd25OYW1lKSkgeworCQkJCWlmICghcmVtb3ZlV2VsbEtub3duKQorCQkJCQlrZWVwZXJzW2luZGV4KytdID0gV2VsbEtub3duU2ltcGxlTmFtZXNbal07CisJCQkJY29udGludWUgbmV4dDsKKwkJCX0KKwkJfQorCisJCS8vIEludGVybmVkU2ltcGxlTmFtZXNbMF0gaXMgZm9yIHRoZSByZXN0ICg+IDI5KQorCQkvLyBJbnRlcm5lZFNpbXBsZU5hbWVzWzFdIGlzIGZvciBzaXplIDEuLi4KKwkJLy8gSW50ZXJuZWRTaW1wbGVOYW1lc1syOV0gaXMgZm9yIHNpemUgMjkKKwkJQXJyYXlMaXN0IGludGVybmVkTmFtZXMgPSBJbnRlcm5lZFNpbXBsZU5hbWVzW3NMZW5ndGggPCBNYXhTaW1wbGVOYW1lcyA/IHNMZW5ndGggOiAwXTsKKwkJZm9yIChpbnQgaiA9IDAsIGsgPSBpbnRlcm5lZE5hbWVzLnNpemUoKTsgaiA8IGs7IGorKykgeworCQkJY2hhcltdIGludGVybmVkTmFtZSA9IChjaGFyW10pIGludGVybmVkTmFtZXMuZ2V0KGopOworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG5hbWUsIGludGVybmVkTmFtZSkpIHsKKwkJCQlrZWVwZXJzW2luZGV4KytdID0gaW50ZXJuZWROYW1lOworCQkJCWNvbnRpbnVlIG5leHQ7CisJCQl9CisJCX0KKwkJaW50ZXJuZWROYW1lcy5hZGQobmFtZSk7CisJCWtlZXBlcnNbaW5kZXgrK10gPSBuYW1lOworCX0KKwlpZiAobGVuZ3RoID4gaW5kZXgpIHsKKwkJaWYgKGluZGV4ID09IDApIHJldHVybiBFbXB0eVNpbXBsZU5hbWVzOworCQlTeXN0ZW0uYXJyYXljb3B5KGtlZXBlcnMsIDAsIGtlZXBlcnMgPSBuZXcgY2hhcltpbmRleF1bXSwgMCwgaW5kZXgpOworCX0KKwlyZXR1cm4ga2VlcGVyczsKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NpbXBsZUxvb2t1cFRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NpbXBsZUxvb2t1cFRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllNmMyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU2ltcGxlTG9va3VwVGFibGUuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworLyoqCisgKiBBIHNpbXBsZSBsb29rdXAgdGFibGUgaXMgYSBub24tc3luY2hyb25pemVkIEhhc2h0YWJsZSwgd2hvc2Uga2V5cworICogYW5kIHZhbHVlcyBhcmUgT2JqZWN0cy4gSXQgYWxzbyB1c2VzIGxpbmVhciBwcm9iaW5nIHRvIHJlc29sdmUgY29sbGlzaW9ucworICogcmF0aGVyIHRoYW4gYSBsaW5rZWQgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVMb29rdXBUYWJsZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKy8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKK3B1YmxpYyBPYmplY3Qga2V5VGFibGVbXTsKK3B1YmxpYyBPYmplY3QgdmFsdWVUYWJsZVtdOworcHVibGljIGludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorcHVibGljIGludCB0aHJlc2hvbGQ7CisKK3B1YmxpYyBTaW1wbGVMb29rdXBUYWJsZSgpIHsKKwl0aGlzKDEzKTsKK30KKworcHVibGljIFNpbXBsZUxvb2t1cFRhYmxlKGludCBzaXplKSB7CisJaWYgKHNpemUgPCAzKSBzaXplID0gMzsKKwl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwl0aGlzLnRocmVzaG9sZCA9IHNpemUgKyAxOyAvLyBzaXplIGlzIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMKKwlpbnQgdGFibGVMZW5ndGggPSAyICogc2l6ZSArIDE7CisJdGhpcy5rZXlUYWJsZSA9IG5ldyBPYmplY3RbdGFibGVMZW5ndGhdOworCXRoaXMudmFsdWVUYWJsZSA9IG5ldyBPYmplY3RbdGFibGVMZW5ndGhdOworfQorCitwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwlTaW1wbGVMb29rdXBUYWJsZSByZXN1bHQgPSAoU2ltcGxlTG9va3VwVGFibGUpIHN1cGVyLmNsb25lKCk7CisJcmVzdWx0LmVsZW1lbnRTaXplID0gdGhpcy5lbGVtZW50U2l6ZTsKKwlyZXN1bHQudGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGQ7CisKKwlpbnQgbGVuZ3RoID0gdGhpcy5rZXlUYWJsZS5sZW5ndGg7CisJcmVzdWx0LmtleVRhYmxlID0gbmV3IE9iamVjdFtsZW5ndGhdOworCVN5c3RlbS5hcnJheWNvcHkodGhpcy5rZXlUYWJsZSwgMCwgcmVzdWx0LmtleVRhYmxlLCAwLCBsZW5ndGgpOworCisJbGVuZ3RoID0gdGhpcy52YWx1ZVRhYmxlLmxlbmd0aDsKKwlyZXN1bHQudmFsdWVUYWJsZSA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KHRoaXMudmFsdWVUYWJsZSwgMCwgcmVzdWx0LnZhbHVlVGFibGUsIDAsIGxlbmd0aCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGg7CisJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CisJT2JqZWN0IGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGg7CisJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CisJT2JqZWN0IGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKSByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOworCX0KKwlyZXR1cm4gbnVsbDsKK30KKworcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisJaW50IGxlbmd0aCA9IGtleVRhYmxlLmxlbmd0aDsKKwlpbnQgaW5kZXggPSAoa2V5Lmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKKwlPYmplY3QgY3VycmVudEtleTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJaWYgKGN1cnJlbnRLZXkuZXF1YWxzKGtleSkpIHJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIGluZGV4ID0gMDsKKwl9CisJa2V5VGFibGVbaW5kZXhdID0ga2V5OworCXZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisKKwkvLyBhc3N1bWVzIHRoZSB0aHJlc2hvbGQgaXMgbmV2ZXIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHRhYmxlCisJaWYgKCsrZWxlbWVudFNpemUgPiB0aHJlc2hvbGQpIHJlaGFzaCgpOworCXJldHVybiB2YWx1ZTsKK30KKworcHVibGljIHZvaWQgcmVtb3ZlS2V5KE9iamVjdCBrZXkpIHsKKwlpbnQgbGVuZ3RoID0ga2V5VGFibGUubGVuZ3RoOworCWludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgbGVuZ3RoOworCU9iamVjdCBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoY3VycmVudEtleS5lcXVhbHMoa2V5KSkgeworCQkJZWxlbWVudFNpemUtLTsKKwkJCWtleVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQl2YWx1ZVRhYmxlW2luZGV4XSA9IG51bGw7CisJCQlpZiAoa2V5VGFibGVbaW5kZXggKyAxID09IGxlbmd0aCA/IDAgOiBpbmRleCArIDFdICE9IG51bGwpCisJCQkJcmVoYXNoKCk7IC8vIG9ubHkgbmVlZGVkIGlmIGEgcG9zc2libGUgY29sbGlzaW9uIGV4aXN0ZWQKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIGluZGV4ID0gMDsKKwl9Cit9CisKK3B1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKE9iamVjdCB2YWx1ZVRvUmVtb3ZlKSB7CisJYm9vbGVhbiByZWhhc2ggPSBmYWxzZTsKKwlmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCU9iamVjdCB2YWx1ZSA9IHZhbHVlVGFibGVbaV07CisJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyh2YWx1ZVRvUmVtb3ZlKSkgeworCQkJZWxlbWVudFNpemUtLTsKKwkJCWtleVRhYmxlW2ldID0gbnVsbDsKKwkJCXZhbHVlVGFibGVbaV0gPSBudWxsOworCQkJaWYgKCFyZWhhc2ggJiYga2V5VGFibGVbaSArIDEgPT0gbCA/IDAgOiBpICsgMV0gIT0gbnVsbCkKKwkJCQlyZWhhc2ggPSB0cnVlOyAvLyBvbmx5IG5lZWRlZCBpZiBhIHBvc3NpYmxlIGNvbGxpc2lvbiBleGlzdGVkCisJCX0KKwl9CisJaWYgKHJlaGFzaCkgcmVoYXNoKCk7Cit9CisKK3ByaXZhdGUgdm9pZCByZWhhc2goKSB7CisJU2ltcGxlTG9va3VwVGFibGUgbmV3TG9va3VwVGFibGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlPYmplY3QgY3VycmVudEtleTsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICgoY3VycmVudEtleSA9IGtleVRhYmxlW2ldKSAhPSBudWxsKQorCQkJbmV3TG9va3VwVGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCisJdGhpcy5rZXlUYWJsZSA9IG5ld0xvb2t1cFRhYmxlLmtleVRhYmxlOworCXRoaXMudmFsdWVUYWJsZSA9IG5ld0xvb2t1cFRhYmxlLnZhbHVlVGFibGU7CisJdGhpcy5lbGVtZW50U2l6ZSA9IG5ld0xvb2t1cFRhYmxlLmVsZW1lbnRTaXplOworCXRoaXMudGhyZXNob2xkID0gbmV3TG9va3VwVGFibGUudGhyZXNob2xkOworfQorCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlPYmplY3Qgb2JqZWN0OworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoKG9iamVjdCA9IHZhbHVlVGFibGVbaV0pICE9IG51bGwpCisJCQlzICs9IGtleVRhYmxlW2ldLnRvU3RyaW5nKCkgKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IAkvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gczsKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU291cmNlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTNiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLio7CisKK3B1YmxpYyBjbGFzcyBTb3VyY2VGaWxlIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdCB7CisKK3B1YmxpYyBjaGFyW10gZmlsZU5hbWU7CitwdWJsaWMgY2hhcltdIG1haW5UeXBlTmFtZTsKK3B1YmxpYyBjaGFyW11bXSBwYWNrYWdlTmFtZTsKK1N0cmluZyBlbmNvZGluZzsKKworcHVibGljIFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgaW5pdGlhbFR5cGVOYW1lKSB7CisJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lLnRvQ2hhckFycmF5KCk7CisJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMuZmlsZU5hbWUsICdcXCcsICcvJyk7CisKKwljaGFyW10gdHlwZU5hbWUgPSBpbml0aWFsVHlwZU5hbWUudG9DaGFyQXJyYXkoKTsKKwlpbnQgbGFzdEluZGV4ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHR5cGVOYW1lKTsKKwl0aGlzLm1haW5UeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZU5hbWUsIGxhc3RJbmRleCArIDEsIC0xKTsKKwl0aGlzLnBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgdHlwZU5hbWUsIDAsIGxhc3RJbmRleCAtIDEpOworCisJdGhpcy5lbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKK30KKworcHVibGljIFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBjaGFyW10gbWFpblR5cGVOYW1lLCBjaGFyW11bXSBwYWNrYWdlTmFtZSkgeworCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZS50b0NoYXJBcnJheSgpOworCUNoYXJPcGVyYXRpb24ucmVwbGFjZSh0aGlzLmZpbGVOYW1lLCAnXFwnLCAnLycpOworCisJdGhpcy5tYWluVHlwZU5hbWUgPSBtYWluVHlwZU5hbWU7CisJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworCisJdGhpcy5lbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKK30KKworcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkvLyBvdGhlcndpc2UgcmV0cmlldmUgaXQKKwlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworCXRyeSB7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBTdHJpbmcoZmlsZU5hbWUpKTsKKwkJSW5wdXRTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0KKwkJCXRoaXMuZW5jb2RpbmcgPT0gbnVsbAorCQkJCT8gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpCisJCQkJOiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgdGhpcy5lbmNvZGluZyk7CisJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihzdHJlYW1SZWFkZXIpOworCQlpbnQgbGVuZ3RoID0gKGludCkgZmlsZS5sZW5ndGgoKTsKKwkJY2hhcltdIGNvbnRlbnRzID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwkJaW50IGxlbiA9IDA7CisJCWludCByZWFkU2l6ZSA9IDA7CisJCXdoaWxlICgocmVhZFNpemUgIT0gLTEpICYmIChsZW4gIT0gbGVuZ3RoKSkgeworCQkJLy8gU2VlIFBSIDFGTVM4OVUKKwkJCS8vIFdlIHJlY29yZCBmaXJzdCB0aGUgcmVhZCBzaXplLiBJbiB0aGlzIGNhc2UgbGVuIGlzIHRoZSBhY3R1YWwgcmVhZCBzaXplLgorCQkJbGVuICs9IHJlYWRTaXplOworCQkJcmVhZFNpemUgPSByZWFkZXIucmVhZChjb250ZW50cywgbGVuLCBsZW5ndGggLSBsZW4pOworCQl9CisJCXJlYWRlci5jbG9zZSgpOworCQkvLyBTZWUgUFIgMUZNUzg5VQorCQkvLyBOb3cgd2UgbmVlZCB0byByZXNpemUgaW4gY2FzZSB0aGUgZGVmYXVsdCBlbmNvZGluZyB1c2VkIG1vcmUgdGhhbiBvbmUgYnl0ZSBmb3IgZWFjaAorCQkvLyBjaGFyYWN0ZXIKKwkJaWYgKGxlbiAhPSBsZW5ndGgpCisJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRzLCAwLCAoY29udGVudHMgPSBuZXcgY2hhcltsZW5dKSwgMCwgbGVuKTsJCQorCQlyZXR1cm4gY29udGVudHM7CisJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbmV3IE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKG5ldyBTdHJpbmcoZmlsZU5hbWUpKSk7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQlpZiAocmVhZGVyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmVhZGVyLmNsb3NlKCk7CisJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworCQkJfQorCQl9CisJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHRydWUsIG5ldyBNaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbihuZXcgU3RyaW5nKGZpbGVOYW1lKSkpOworCX0KK30KKworcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gZmlsZU5hbWU7Cit9CisKK3B1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgeworCXJldHVybiBtYWluVHlwZU5hbWU7Cit9CisKK3B1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKKwlyZXR1cm4gcGFja2FnZU5hbWU7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJTb3VyY2VGaWxlWyIgLy8kTk9OLU5MUy0xJAorCQkrIG5ldyBTdHJpbmcoZmlsZU5hbWUpICsgIl0iOyAgLy8kTk9OLU5MUy0xJAorfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdjMTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBTdGF0ZSB7CisKK1N0cmluZyBqYXZhUHJvamVjdE5hbWU7CitDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzcGF0aExvY2F0aW9uczsKK1N0cmluZyBvdXRwdXRMb2NhdGlvblN0cmluZzsKKy8vIGtleWVkIGJ5IGxvY2F0aW9uICh0aGUgZnVsbCBmaWxlc3lzdGVtIHBhdGggImQ6L3h5ei9lY2xpcHNlL1Rlc3QvcDEvcDIvQS5qYXZhIiksIHZhbHVlIGlzIGEgUmVmZXJlbmNlQ29sbGVjdGlvbiBvciBhbiBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24KK1NpbXBsZUxvb2t1cFRhYmxlIHJlZmVyZW5jZXM7CisvLyBrZXllZCBieSBxdWFsaWZpZWQgdHlwZSBuYW1lICJwMS9wMi9BIiwgdmFsdWUgaXMgdGhlIGZ1bGwgZmlsZXN5c3RlbSBwYXRoIHdoaWNoIGRlZmluZXMgdGhpcyB0eXBlICJkOi94eXovZWNsaXBzZS9UZXN0L3AxL3AyL0EuamF2YSIKK1NpbXBsZUxvb2t1cFRhYmxlIHR5cGVMb2NhdGlvbnM7CisKK2ludCBidWlsZE51bWJlcjsKK2xvbmcgbGFzdFN0cnVjdHVyYWxCdWlsZFRpbWU7CitTaW1wbGVMb29rdXBUYWJsZSBzdHJ1Y3R1cmFsQnVpbGRUaW1lczsKKworcHJpdmF0ZSBTdHJpbmdbXSBrbm93blBhY2thZ2VOYW1lczsgLy8gb2YgdGhlIGZvcm0gInAxL3AyIgorCitzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OID0gMHgwMDA0OworCitTdGF0ZSgpIHsKK30KKworcHJvdGVjdGVkIFN0YXRlKEphdmFCdWlsZGVyIGphdmFCdWlsZGVyKSB7CisJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IG51bGw7CisJdGhpcy5qYXZhUHJvamVjdE5hbWUgPSBqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXROYW1lKCk7CisJdGhpcy5jbGFzc3BhdGhMb2NhdGlvbnMgPSBqYXZhQnVpbGRlci5jbGFzc3BhdGg7CisJdGhpcy5vdXRwdXRMb2NhdGlvblN0cmluZyA9IGphdmFCdWlsZGVyLm91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CisJdGhpcy5yZWZlcmVuY2VzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDcpOworCXRoaXMudHlwZUxvY2F0aW9ucyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSg3KTsKKworCXRoaXMuYnVpbGROdW1iZXIgPSAwOyAvLyBpbmRpY2F0ZXMgYSBmdWxsIGJ1aWxkCisJdGhpcy5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCXRoaXMuc3RydWN0dXJhbEJ1aWxkVGltZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoMyk7Cit9CisKK3ZvaWQgY29weUZyb20oU3RhdGUgbGFzdFN0YXRlKSB7CisJdHJ5IHsKKwkJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IG51bGw7CisJCXRoaXMuYnVpbGROdW1iZXIgPSBsYXN0U3RhdGUuYnVpbGROdW1iZXIgKyAxOworCQl0aGlzLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lID0gbGFzdFN0YXRlLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lOworCQl0aGlzLnJlZmVyZW5jZXMgPSAoU2ltcGxlTG9va3VwVGFibGUpIGxhc3RTdGF0ZS5yZWZlcmVuY2VzLmNsb25lKCk7CisJCXRoaXMudHlwZUxvY2F0aW9ucyA9IChTaW1wbGVMb29rdXBUYWJsZSkgbGFzdFN0YXRlLnR5cGVMb2NhdGlvbnMuY2xvbmUoKTsKKwl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisJCXRoaXMucmVmZXJlbmNlcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsYXN0U3RhdGUucmVmZXJlbmNlcy5lbGVtZW50U2l6ZSk7CisJCU9iamVjdFtdIGtleVRhYmxlID0gbGFzdFN0YXRlLnJlZmVyZW5jZXMua2V5VGFibGU7CisJCU9iamVjdFtdIHZhbHVlVGFibGUgPSBsYXN0U3RhdGUucmVmZXJlbmNlcy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJCXRoaXMucmVmZXJlbmNlcy5wdXQoa2V5VGFibGVbaV0sIHZhbHVlVGFibGVbaV0pOworCisJCXRoaXMudHlwZUxvY2F0aW9ucyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsYXN0U3RhdGUudHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSk7CisJCWtleVRhYmxlID0gbGFzdFN0YXRlLnR5cGVMb2NhdGlvbnMua2V5VGFibGU7CisJCXZhbHVlVGFibGUgPSBsYXN0U3RhdGUudHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJCXRoaXMudHlwZUxvY2F0aW9ucy5wdXQoa2V5VGFibGVbaV0sIHZhbHVlVGFibGVbaV0pOworCX0KK30KKworY2hhcltdW10gZ2V0RGVmaW5lZFR5cGVOYW1lc0ZvcihTdHJpbmcgbG9jYXRpb24pIHsKKwlPYmplY3QgYyA9IHJlZmVyZW5jZXMuZ2V0KGxvY2F0aW9uKTsKKwlpZiAoYyBpbnN0YW5jZW9mIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbikKKwkJcmV0dXJuICgoQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSBjKS5kZWZpbmVkVHlwZU5hbWVzOworCXJldHVybiBudWxsOyAvLyBtZWFucyBvbmx5IG9uZSB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmaWxlLi4uIHNhdmVzIHNwYWNlCit9CisKK2Jvb2xlYW4gaXNEdXBsaWNhdGVMb2NhdGlvbihTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7CisJU3RyaW5nIGV4aXN0aW5nTG9jYXRpb24gPSAoU3RyaW5nKSB0eXBlTG9jYXRpb25zLmdldChxdWFsaWZpZWROYW1lKTsKKwlyZXR1cm4gZXhpc3RpbmdMb2NhdGlvbiAhPSBudWxsICYmICFleGlzdGluZ0xvY2F0aW9uLmVxdWFscyhsb2NhdGlvbik7Cit9CisKK2Jvb2xlYW4gaXNLbm93blBhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJaWYgKGtub3duUGFja2FnZU5hbWVzID09IG51bGwpIHsKKwkJQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCh0eXBlTG9jYXRpb25zLmVsZW1lbnRTaXplKTsKKwkJT2JqZWN0W10ga2V5VGFibGUgPSB0eXBlTG9jYXRpb25zLmtleVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKSBrZXlUYWJsZVtpXTsgLy8gaXMgYSB0eXBlIG5hbWUgb2YgdGhlIGZvcm0gcDEvcDIvQQorCQkJCWludCBsYXN0ID0gcGFja2FnZU5hbWUubGFzdEluZGV4T2YoJy8nKTsKKwkJCQlwYWNrYWdlTmFtZSA9IGxhc3QgPT0gLTEgPyBudWxsIDogcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOworCQkJCXdoaWxlIChwYWNrYWdlTmFtZSAhPSBudWxsICYmICFuYW1lcy5jb250YWlucyhwYWNrYWdlTmFtZSkpIHsKKwkJCQkJbmFtZXMuYWRkKHBhY2thZ2VOYW1lKTsKKwkJCQkJbGFzdCA9IHBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCcvJyk7CisJCQkJCXBhY2thZ2VOYW1lID0gbGFzdCA9PSAtMSA/IG51bGwgOiBwYWNrYWdlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdCk7CisJCQkJfQorCQkJfQorCQl9CisJCWtub3duUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tuYW1lcy5zaXplKCldOworCQluYW1lcy50b0FycmF5KGtub3duUGFja2FnZU5hbWVzKTsKKwl9CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duUGFja2FnZU5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlpZiAoa25vd25QYWNrYWdlTmFtZXNbaV0uZXF1YWxzKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCByZWNvcmQoU3RyaW5nIGxvY2F0aW9uLCBjaGFyW11bXVtdIHF1YWxpZmllZFJlZnMsIGNoYXJbXVtdIHNpbXBsZVJlZnMsIGNoYXJbXSBtYWluVHlwZU5hbWUsIEFycmF5TGlzdCB0eXBlTmFtZXMpIHsKKwlpZiAodHlwZU5hbWVzLnNpemUoKSA9PSAxICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1haW5UeXBlTmFtZSwgKGNoYXJbXSkgdHlwZU5hbWVzLmdldCgwKSkpIHsKKwkJCXJlZmVyZW5jZXMucHV0KGxvY2F0aW9uLCBuZXcgUmVmZXJlbmNlQ29sbGVjdGlvbihxdWFsaWZpZWRSZWZzLCBzaW1wbGVSZWZzKSk7CisJfSBlbHNlIHsKKwkJY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcyA9IG5ldyBjaGFyW3R5cGVOYW1lcy5zaXplKCldW107IC8vIGNhbiBiZSBlbXB0eSB3aGVuIG5vIHR5cGVzIGFyZSBkZWZpbmVkCisJCXR5cGVOYW1lcy50b0FycmF5KGRlZmluZWRUeXBlTmFtZXMpOworCQlyZWZlcmVuY2VzLnB1dChsb2NhdGlvbiwgbmV3IEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbihkZWZpbmVkVHlwZU5hbWVzLCBxdWFsaWZpZWRSZWZzLCBzaW1wbGVSZWZzKSk7CisJfQorfQorCit2b2lkIHJlY29yZExvY2F0aW9uRm9yVHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7CisJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IG51bGw7CisJdHlwZUxvY2F0aW9ucy5wdXQocXVhbGlmaWVkTmFtZSwgbG9jYXRpb24pOworfQorCit2b2lkIHJlY29yZFN0cnVjdHVyYWxEZXBlbmRlbmN5KElQcm9qZWN0IHByZXJlcVByb2plY3QsIFN0YXRlIHByZXJlcVN0YXRlKSB7CisJaWYgKHByZXJlcVN0YXRlICE9IG51bGwpCisJCXN0cnVjdHVyYWxCdWlsZFRpbWVzLnB1dChwcmVyZXFQcm9qZWN0LmdldE5hbWUoKSwgbmV3IExvbmcocHJlcmVxU3RhdGUubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpKTsKK30KKwordm9pZCByZW1vdmUoU3RyaW5nIGxvY2F0aW9uVG9SZW1vdmUpIHsKKwl0aGlzLmtub3duUGFja2FnZU5hbWVzID0gbnVsbDsKKwlyZWZlcmVuY2VzLnJlbW92ZUtleShsb2NhdGlvblRvUmVtb3ZlKTsKKwl0eXBlTG9jYXRpb25zLnJlbW92ZVZhbHVlKGxvY2F0aW9uVG9SZW1vdmUpOworfQorCit2b2lkIHJlbW92ZVBhY2thZ2UoSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEpIHsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSBzb3VyY2VEZWx0YS5nZXRSZXNvdXJjZSgpOworCXN3aXRjaChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKKwkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKKwkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBzb3VyY2VEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyArK2kpCisJCQkJcmVtb3ZlUGFja2FnZShjaGlsZHJlbltpXSk7CisJCQlyZXR1cm47CisJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJaWYgKEphdmFCdWlsZGVyLkpBVkFfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb24uZ2V0RmlsZUV4dGVuc2lvbigpKSkKKwkJCQlyZW1vdmUobG9jYXRpb24udG9TdHJpbmcoKSk7CisJfQorfQorCit2b2lkIHJlbW92ZVR5cGVMb2NhdGlvbihTdHJpbmcgbG9jYXRpb25Ub1JlbW92ZSkgeworCXRoaXMua25vd25QYWNrYWdlTmFtZXMgPSBudWxsOworCXR5cGVMb2NhdGlvbnMucmVtb3ZlS2V5KGxvY2F0aW9uVG9SZW1vdmUpOworfQorCitzdGF0aWMgU3RhdGUgcmVhZChEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3V0IHRvIHJlYWQgc3RhdGUuLi4iKTsgLy8kTk9OLU5MUy0xJAorCWlmIChWRVJTSU9OICE9IGluLnJlYWRCeXRlKCkpIHsKKwkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBub24tY29tcGF0aWJsZSBzdGF0ZSB2ZXJzaW9uLi4uIGFuc3dlcmVkIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlTdGF0ZSBuZXdTdGF0ZSA9IG5ldyBTdGF0ZSgpOworCW5ld1N0YXRlLmphdmFQcm9qZWN0TmFtZSA9IGluLnJlYWRVVEYoKTsKKwluZXdTdGF0ZS5idWlsZE51bWJlciA9IGluLnJlYWRJbnQoKTsKKwluZXdTdGF0ZS5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSA9IGluLnJlYWRMb25nKCk7CisJbmV3U3RhdGUub3V0cHV0TG9jYXRpb25TdHJpbmcgPSBpbi5yZWFkVVRGKCk7CisKKwlpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOworCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltsZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKwkJc3dpdGNoIChpbi5yZWFkQnl0ZSgpKSB7CisJCQljYXNlIDEgOgorCQkJCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9uc1tpXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvclNvdXJjZUZvbGRlcihpbi5yZWFkVVRGKCksIGluLnJlYWRVVEYoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9uc1tpXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvckJpbmFyeUZvbGRlcihpbi5yZWFkVVRGKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAzIDoKKwkJCQluZXdTdGF0ZS5jbGFzc3BhdGhMb2NhdGlvbnNbaV0gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JMaWJyYXJ5KGluLnJlYWRVVEYoKSk7CisJCX0KKwl9CisKKwluZXdTdGF0ZS5zdHJ1Y3R1cmFsQnVpbGRUaW1lcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsZW5ndGggPSBpbi5yZWFkSW50KCkpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCW5ld1N0YXRlLnN0cnVjdHVyYWxCdWlsZFRpbWVzLnB1dChpbi5yZWFkVVRGKCksIG5ldyBMb25nKGluLnJlYWRMb25nKCkpKTsKKworCVN0cmluZ1tdIGludGVybmVkTG9jYXRpb25zID0gbmV3IFN0cmluZ1tsZW5ndGggPSBpbi5yZWFkSW50KCldOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCWludGVybmVkTG9jYXRpb25zW2ldID0gaW4ucmVhZFVURigpOworCisJbmV3U3RhdGUudHlwZUxvY2F0aW9ucyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsZW5ndGggPSBpbi5yZWFkSW50KCkpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCW5ld1N0YXRlLnR5cGVMb2NhdGlvbnMucHV0KGluLnJlYWRVVEYoKSwgaW50ZXJuZWRMb2NhdGlvbnNbaW4ucmVhZEludCgpXSk7CisKKwljaGFyW11bXSBpbnRlcm5lZFNpbXBsZU5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5TaW1wbGVOYW1lcyhyZWFkTmFtZXMoaW4pLCBmYWxzZSk7CisJY2hhcltdW11bXSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoID0gaW4ucmVhZEludCgpXVtdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgcUxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKwkJY2hhcltdW10gcU5hbWUgPSBuZXcgY2hhcltxTGVuZ3RoXVtdOworCQlmb3IgKGludCBqID0gMDsgaiA8IHFMZW5ndGg7IGorKykKKwkJCXFOYW1lW2pdID0gaW50ZXJuZWRTaW1wbGVOYW1lc1tpbi5yZWFkSW50KCldOworCQlpbnRlcm5lZFF1YWxpZmllZE5hbWVzW2ldID0gcU5hbWU7CisJfQorCWludGVybmVkUXVhbGlmaWVkTmFtZXMgPSBSZWZlcmVuY2VDb2xsZWN0aW9uLmludGVyblF1YWxpZmllZE5hbWVzKGludGVybmVkUXVhbGlmaWVkTmFtZXMpOworCisJbmV3U3RhdGUucmVmZXJlbmNlcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsZW5ndGggPSBpbi5yZWFkSW50KCkpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJU3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuZWRMb2NhdGlvbnNbaW4ucmVhZEludCgpXTsKKwkJUmVmZXJlbmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbnVsbDsKKwkJc3dpdGNoIChpbi5yZWFkQnl0ZSgpKSB7CisJCQljYXNlIDEgOgorCQkJCWNoYXJbXVtdIGFkZGl0aW9uYWxUeXBlTmFtZXMgPSByZWFkTmFtZXMoaW4pOworCQkJCWNoYXJbXVtdW10gcXVhbGlmaWVkTmFtZXMgPSBuZXcgY2hhcltpbi5yZWFkSW50KCldW11bXTsKKwkJCQlmb3IgKGludCBqID0gMCwgcUxlbmd0aCA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsgaiA8IHFMZW5ndGg7IGorKykKKwkJCQkJcXVhbGlmaWVkTmFtZXNbal0gPSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzW2luLnJlYWRJbnQoKV07CisJCQkJY2hhcltdW10gc2ltcGxlTmFtZXMgPSBuZXcgY2hhcltpbi5yZWFkSW50KCldW107CisJCQkJZm9yIChpbnQgaiA9IDAsIHNMZW5ndGggPSBzaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBzTGVuZ3RoOyBqKyspCisJCQkJCXNpbXBsZU5hbWVzW2pdID0gaW50ZXJuZWRTaW1wbGVOYW1lc1tpbi5yZWFkSW50KCldOworCQkJCWNvbGxlY3Rpb24gPSBuZXcgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKGFkZGl0aW9uYWxUeXBlTmFtZXMsIHF1YWxpZmllZE5hbWVzLCBzaW1wbGVOYW1lcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIDIgOgorCQkJCWNoYXJbXVtdW10gcU5hbWVzID0gbmV3IGNoYXJbaW4ucmVhZEludCgpXVtdW107CisJCQkJZm9yIChpbnQgaiA9IDAsIHFMZW5ndGggPSBxTmFtZXMubGVuZ3RoOyBqIDwgcUxlbmd0aDsgaisrKQorCQkJCQlxTmFtZXNbal0gPSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzW2luLnJlYWRJbnQoKV07CisJCQkJY2hhcltdW10gc05hbWVzID0gbmV3IGNoYXJbaW4ucmVhZEludCgpXVtdOworCQkJCWZvciAoaW50IGogPSAwLCBzTGVuZ3RoID0gc05hbWVzLmxlbmd0aDsgaiA8IHNMZW5ndGg7IGorKykKKwkJCQkJc05hbWVzW2pdID0gaW50ZXJuZWRTaW1wbGVOYW1lc1tpbi5yZWFkSW50KCldOworCQkJCWNvbGxlY3Rpb24gPSBuZXcgUmVmZXJlbmNlQ29sbGVjdGlvbihxTmFtZXMsIHNOYW1lcyk7CisJCX0KKwkJbmV3U3RhdGUucmVmZXJlbmNlcy5wdXQobG9jYXRpb24sIGNvbGxlY3Rpb24pOworCX0KKwlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCVN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2Vzc2Z1bGx5IHJlYWQgc3RhdGUgZm9yICIgKyBuZXdTdGF0ZS5qYXZhUHJvamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIG5ld1N0YXRlOworfQorCitwcml2YXRlIHN0YXRpYyBjaGFyW11bXSByZWFkTmFtZXMoRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWludCBsZW5ndGggPSBpbi5yZWFkSW50KCk7CisJY2hhcltdW10gbmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpbnQgbkxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKwkJY2hhcltdIG5hbWUgPSBuZXcgY2hhcltuTGVuZ3RoXTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBuTGVuZ3RoOyBqKyspCisJCQluYW1lW2pdID0gaW4ucmVhZENoYXIoKTsKKwkJbmFtZXNbaV0gPSBuYW1lOworCX0KKwlyZXR1cm4gbmFtZXM7Cit9CisKK3ZvaWQgdGFnQXNOb29wQnVpbGQoKSB7CisJdGhpcy5idWlsZE51bWJlciA9IC0xOyAvLyB0YWcgdGhlIHByb2plY3Qgc2luY2UgaXQgaGFzIG5vIHNvdXJjZSBmb2xkZXJzIGFuZCBjYW4gYmUgc2tpcHBlZAorfQorCitib29sZWFuIHdhc05vb3BCdWlsZCgpIHsKKwlyZXR1cm4gYnVpbGROdW1iZXIgPT0gLTE7Cit9CisKK3ZvaWQgdGFnQXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKCkgeworCXRoaXMubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKK30KKworYm9vbGVhbiB3YXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKElQcm9qZWN0IHByZXJlcVByb2plY3QsIFN0YXRlIHByZXJlcVN0YXRlKSB7CisJaWYgKHByZXJlcVN0YXRlICE9IG51bGwpIHsKKwkJT2JqZWN0IG8gPSBzdHJ1Y3R1cmFsQnVpbGRUaW1lcy5nZXQocHJlcmVxUHJvamVjdC5nZXROYW1lKCkpOworCQlsb25nIHByZXZpb3VzID0gbyA9PSBudWxsID8gMCA6ICgoTG9uZykgbykubG9uZ1ZhbHVlKCk7CisJCWlmIChwcmV2aW91cyA9PSBwcmVyZXFTdGF0ZS5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSkgcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCB3cml0ZShEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgbGVuZ3RoOworCU9iamVjdFtdIGtleVRhYmxlOworCU9iamVjdFtdIHZhbHVlVGFibGU7CisKKy8qCisgKiBieXRlCQkJVkVSU0lPTgorICogU3RyaW5nCQlwcm9qZWN0IG5hbWUKKyAqIGludAkJCQlidWlsZCBudW1iZXIKKyAqIGludAkJCQlsYXN0IHN0cnVjdHVyYWwgYnVpbGQgbnVtYmVyCisgKiBTdHJpbmcJCW91dHB1dCBsb2NhdGlvbgorKi8KKwlvdXQud3JpdGVCeXRlKFZFUlNJT04pOworCW91dC53cml0ZVVURihqYXZhUHJvamVjdE5hbWUpOworCW91dC53cml0ZUludChidWlsZE51bWJlcik7CisJb3V0LndyaXRlTG9uZyhsYXN0U3RydWN0dXJhbEJ1aWxkVGltZSk7CisJb3V0LndyaXRlVVRGKG91dHB1dExvY2F0aW9uU3RyaW5nKTsKKworLyoKKyAqIENsYXNzIHBhdGggbG9jYXRpb25zW10KKyAqIGludAkJCQlpZAorICogU3RyaW5nCQlwYXRoKHMpCisgKiAKKyAqIE5PVEU6IENhbm5vdCBoYXZlIHBvcnRhYmxlIGJ1aWxkIHN0YXRlcyB3aGlsZSBjbGFzc3BhdGggZGlyZWN0b3JpZXMgYXJlIGZ1bGwgZmlsZXN5c3RlbSBwYXRocworKi8KKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworCQlDbGFzc3BhdGhMb2NhdGlvbiBjID0gY2xhc3NwYXRoTG9jYXRpb25zW2ldOworCQlpZiAoYyBpbnN0YW5jZW9mIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSB7CisJCQlvdXQud3JpdGVCeXRlKDEpOworCQkJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSAoQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIGM7CisJCQlvdXQud3JpdGVVVEYobWQuc291cmNlUGF0aCk7CisJCQlvdXQud3JpdGVVVEYobWQuYmluYXJ5UGF0aCk7CisJCX0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIENsYXNzcGF0aERpcmVjdG9yeSkgeworCQkJb3V0LndyaXRlQnl0ZSgyKTsKKwkJCW91dC53cml0ZVVURigoKENsYXNzcGF0aERpcmVjdG9yeSkgYykuYmluYXJ5UGF0aCk7CisJCX0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIENsYXNzcGF0aEphcikgeworCQkJb3V0LndyaXRlQnl0ZSgzKTsKKwkJCW91dC53cml0ZVVURigoKENsYXNzcGF0aEphcikgYykuemlwRmlsZW5hbWUpOworCQl9CisJfQorCisvKgorICogU3RydWN0dXJhbCBidWlsZCBudW1iZXJzIHRhYmxlCisgKiBTdHJpbmcJCXByZXJlcSBwcm9qZWN0IG5hbWUKKyAqIGludAkJCQlsYXN0IHN0cnVjdHVyYWwgYnVpbGQgbnVtYmVyCisqLworCW91dC53cml0ZUludChsZW5ndGggPSBzdHJ1Y3R1cmFsQnVpbGRUaW1lcy5lbGVtZW50U2l6ZSk7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJa2V5VGFibGUgPSBzdHJ1Y3R1cmFsQnVpbGRUaW1lcy5rZXlUYWJsZTsKKwkJdmFsdWVUYWJsZSA9IHN0cnVjdHVyYWxCdWlsZFRpbWVzLnZhbHVlVGFibGU7CisJCWZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkgeworCQkJCWxlbmd0aC0tOworCQkJCW91dC53cml0ZVVURigoU3RyaW5nKSBrZXlUYWJsZVtpXSk7CisJCQkJb3V0LndyaXRlTG9uZygoKExvbmcpIHZhbHVlVGFibGVbaV0pLmxvbmdWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcgJiYgbGVuZ3RoICE9IDApCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInN0cnVjdHVyYWxCdWlsZE51bWJlcnMgdGFibGUgaXMgaW5jb25zaXN0ZW50Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKy8qCisgKiBTdHJpbmdbXQkJSW50ZXJuZWQgbG9jYXRpb25zCisgKi8KKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gcmVmZXJlbmNlcy5lbGVtZW50U2l6ZSk7CisJQXJyYXlMaXN0IGludGVybmVkTG9jYXRpb25zID0gbmV3IEFycmF5TGlzdChsZW5ndGgpOworCWlmIChsZW5ndGggPiAwKSB7CisJCWtleVRhYmxlID0gcmVmZXJlbmNlcy5rZXlUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CisJCQkJbGVuZ3RoLS07CisJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleVRhYmxlW2ldOworCQkJCW91dC53cml0ZVVURihrZXkpOworCQkJCWludGVybmVkTG9jYXRpb25zLmFkZChrZXkpOworCQkJfQorCQl9CisJCWlmIChKYXZhQnVpbGRlci5ERUJVRyAmJiBsZW5ndGggIT0gMCkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmZXJlbmNlcyB0YWJsZSBpcyBpbmNvbnNpc3RlbnQiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworLyoKKyAqIFR5cGUgbG9jYXRpb25zIHRhYmxlCisgKiBTdHJpbmcJCXR5cGUgbmFtZQorICogaW50CQkJCWludGVybmVkIGxvY2F0aW9uIGlkCisgKi8KKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gdHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSk7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJa2V5VGFibGUgPSB0eXBlTG9jYXRpb25zLmtleVRhYmxlOworCQl2YWx1ZVRhYmxlID0gdHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKKwkJCQlsZW5ndGgtLTsKKwkJCQlvdXQud3JpdGVVVEYoKFN0cmluZykga2V5VGFibGVbaV0pOworCQkJCW91dC53cml0ZUludChpbnRlcm5lZExvY2F0aW9ucy5pbmRleE9mKChTdHJpbmcpIHZhbHVlVGFibGVbaV0pKTsKKwkJCX0KKwkJfQorCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcgJiYgbGVuZ3RoICE9IDApCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInR5cGVMb2NhdGlvbnMgdGFibGUgaXMgaW5jb25zaXN0ZW50Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKy8qCisgKiBjaGFyW11bXVtdCUludGVybmVkIHF1YWxpZmllZCBuYW1lcworICogY2hhcltdW10JCUludGVybmVkIHNpbXBsZSBuYW1lcworICovCisJQXJyYXlMaXN0IGludGVybmVkUXVhbGlmaWVkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KDMxKTsKKwlBcnJheUxpc3QgaW50ZXJuZWRTaW1wbGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoMzEpOworCXZhbHVlVGFibGUgPSByZWZlcmVuY2VzLnZhbHVlVGFibGU7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQlpZiAodmFsdWVUYWJsZVtpXSAhPSBudWxsKSB7CisJCQlSZWZlcmVuY2VDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoUmVmZXJlbmNlQ29sbGVjdGlvbikgdmFsdWVUYWJsZVtpXTsKKwkJCWNoYXJbXVtdW10gcU5hbWVzID0gY29sbGVjdGlvbi5xdWFsaWZpZWROYW1lUmVmZXJlbmNlczsKKwkJCWZvciAoaW50IGogPSAwLCBxTGVuZ3RoID0gcU5hbWVzLmxlbmd0aDsgaiA8IHFMZW5ndGg7IGorKykgeworCQkJCWNoYXJbXVtdIHFOYW1lID0gcU5hbWVzW2pdOworCQkJCWlmICghaW50ZXJuZWRRdWFsaWZpZWROYW1lcy5jb250YWlucyhxTmFtZSkpIHsgLy8gcmVtZW1iZXIgdGhlIG5hbWVzIGhhdmUgYmVlbiBpbnRlcm5lZAorCQkJCQlpbnRlcm5lZFF1YWxpZmllZE5hbWVzLmFkZChxTmFtZSk7CisJCQkJCWZvciAoaW50IGsgPSAwLCBzTGVuZ3RoID0gcU5hbWUubGVuZ3RoOyBrIDwgc0xlbmd0aDsgaysrKSB7CisJCQkJCQljaGFyW10gc05hbWUgPSBxTmFtZVtrXTsKKwkJCQkJCWlmICghaW50ZXJuZWRTaW1wbGVOYW1lcy5jb250YWlucyhzTmFtZSkpIC8vIHJlbWVtYmVyIHRoZSBuYW1lcyBoYXZlIGJlZW4gaW50ZXJuZWQKKwkJCQkJCQlpbnRlcm5lZFNpbXBsZU5hbWVzLmFkZChzTmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljaGFyW11bXSBzTmFtZXMgPSBjb2xsZWN0aW9uLnNpbXBsZU5hbWVSZWZlcmVuY2VzOworCQkJZm9yIChpbnQgaiA9IDAsIHNMZW5ndGggPSBzTmFtZXMubGVuZ3RoOyBqIDwgc0xlbmd0aDsgaisrKSB7CisJCQkJY2hhcltdIHNOYW1lID0gc05hbWVzW2pdOworCQkJCWlmICghaW50ZXJuZWRTaW1wbGVOYW1lcy5jb250YWlucyhzTmFtZSkpIC8vIHJlbWVtYmVyIHRoZSBuYW1lcyBoYXZlIGJlZW4gaW50ZXJuZWQKKwkJCQkJaW50ZXJuZWRTaW1wbGVOYW1lcy5hZGQoc05hbWUpOworCQkJfQorCQl9CisJfQorCWNoYXJbXVtdIGludGVybmVkQXJyYXkgPSBuZXcgY2hhcltpbnRlcm5lZFNpbXBsZU5hbWVzLnNpemUoKV1bXTsKKwlpbnRlcm5lZFNpbXBsZU5hbWVzLnRvQXJyYXkoaW50ZXJuZWRBcnJheSk7CisJd3JpdGVOYW1lcyhpbnRlcm5lZEFycmF5LCBvdXQpOworCS8vIG5vdyB3cml0ZSB0aGUgaW50ZXJuZWQgcXVhbGlmaWVkIG5hbWVzIGFzIGFycmF5cyBvZiBpbnRlcm5lZCBzaW1wbGUgbmFtZXMKKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gaW50ZXJuZWRRdWFsaWZpZWROYW1lcy5zaXplKCkpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY2hhcltdW10gcU5hbWUgPSAoY2hhcltdW10pIGludGVybmVkUXVhbGlmaWVkTmFtZXMuZ2V0KGkpOworCQlpbnQgcUxlbmd0aCA9IHFOYW1lLmxlbmd0aDsKKwkJb3V0LndyaXRlSW50KHFMZW5ndGgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IHFMZW5ndGg7IGorKykKKwkJCW91dC53cml0ZUludChpbnRlcm5lZFNpbXBsZU5hbWVzLmluZGV4T2YocU5hbWVbal0pKTsKKwl9CisKKy8qCisgKiBSZWZlcmVuY2VzIHRhYmxlCisgKiBpbnQJCQlpbnRlcm5lZCBsb2NhdGlvbiBpZAorICogUmVmZXJlbmNlQ29sbGVjdGlvbgorKi8KKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gcmVmZXJlbmNlcy5lbGVtZW50U2l6ZSk7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJa2V5VGFibGUgPSByZWZlcmVuY2VzLmtleVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKKwkJCQlsZW5ndGgtLTsKKwkJCQlvdXQud3JpdGVJbnQoaW50ZXJuZWRMb2NhdGlvbnMuaW5kZXhPZigoU3RyaW5nKSBrZXlUYWJsZVtpXSkpOworCQkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOworCQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSB7CisJCQkJCW91dC53cml0ZUJ5dGUoMSk7CisJCQkJCUFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbiBhdGMgPSAoQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSBjb2xsZWN0aW9uOworCQkJCQl3cml0ZU5hbWVzKGF0Yy5kZWZpbmVkVHlwZU5hbWVzLCBvdXQpOworCQkJCX0gZWxzZSB7CisJCQkJCW91dC53cml0ZUJ5dGUoMik7CisJCQkJfQorCQkJCWNoYXJbXVtdW10gcU5hbWVzID0gY29sbGVjdGlvbi5xdWFsaWZpZWROYW1lUmVmZXJlbmNlczsKKwkJCQlpbnQgcUxlbmd0aCA9IHFOYW1lcy5sZW5ndGg7CisJCQkJb3V0LndyaXRlSW50KHFMZW5ndGgpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcUxlbmd0aDsgaisrKQorCQkJCQlvdXQud3JpdGVJbnQoaW50ZXJuZWRRdWFsaWZpZWROYW1lcy5pbmRleE9mKHFOYW1lc1tqXSkpOworCQkJCWNoYXJbXVtdIHNOYW1lcyA9IGNvbGxlY3Rpb24uc2ltcGxlTmFtZVJlZmVyZW5jZXM7CisJCQkJaW50IHNMZW5ndGggPSBzTmFtZXMubGVuZ3RoOworCQkJCW91dC53cml0ZUludChzTGVuZ3RoKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNMZW5ndGg7IGorKykKKwkJCQkJb3V0LndyaXRlSW50KGludGVybmVkU2ltcGxlTmFtZXMuaW5kZXhPZihzTmFtZXNbal0pKTsKKwkJCX0KKwkJfQorCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcgJiYgbGVuZ3RoICE9IDApCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZmVyZW5jZXMgdGFibGUgaXMgaW5jb25zaXN0ZW50Iik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisKK3ByaXZhdGUgdm9pZCB3cml0ZU5hbWVzKGNoYXJbXVtdIG5hbWVzLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOworCW91dC53cml0ZUludChsZW5ndGgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY2hhcltdIG5hbWUgPSBuYW1lc1tpXTsKKwkJaW50IG5MZW5ndGggPSBuYW1lLmxlbmd0aDsKKwkJb3V0LndyaXRlSW50KG5MZW5ndGgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IG5MZW5ndGg7IGorKykKKwkJCW91dC53cml0ZUNoYXIobmFtZVtqXSk7CisJfQorfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyLgorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiU3RhdGUgZm9yICIgKyBqYXZhUHJvamVjdE5hbWUgLy8kTk9OLU5MUy0xJAorCQkrICIgKCMiICsgYnVpbGROdW1iZXIgLy8kTk9OLU5MUy0xJAorCQkJKyAiIEAgIiArIG5ldyBEYXRlKGxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lKSAvLyROT04tTkxTLTEkCisJCQkJKyAiKSI7IC8vJE5PTi1OTFMtMSQKK30KKworLyogRGVidWcgaGVscGVyCit2b2lkIGR1bXAoKSB7CisJU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZSBmb3IgIiArIGphdmFQcm9qZWN0TmFtZSArICIgKCIgKyBidWlsZE51bWJlciArICIgQCAiICsgbmV3IERhdGUobGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpICsgIikiKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIlx0Q2xhc3MgcGF0aCBsb2NhdGlvbnM6Iik7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aExvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkKKwkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIGNsYXNzcGF0aExvY2F0aW9uc1tpXSk7CisJU3lzdGVtLm91dC5wcmludGxuKCJcdE91dHB1dCBsb2NhdGlvbjoiKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgb3V0cHV0TG9jYXRpb25TdHJpbmcpOworCisJU3lzdGVtLm91dC5wcmludCgiXHRTdHJ1Y3R1cmFsIGJ1aWxkIG51bWJlcnMgdGFibGU6Iik7CisJaWYgKHN0cnVjdHVyYWxCdWlsZFRpbWVzLmVsZW1lbnRTaXplID09IDApIHsKKwkJU3lzdGVtLm91dC5wcmludCgiIDxlbXB0eT4iKTsKKwl9IGVsc2UgeworCQlPYmplY3RbXSBrZXlUYWJsZSA9IHN0cnVjdHVyYWxCdWlsZFRpbWVzLmtleVRhYmxlOworCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gc3RydWN0dXJhbEJ1aWxkVGltZXMudmFsdWVUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQlpZiAoa2V5VGFibGVbaV0gIT0gbnVsbCkKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJcblx0XHQiICsga2V5VGFibGVbaV0udG9TdHJpbmcoKSArICIgLT4gIiArIHZhbHVlVGFibGVbaV0udG9TdHJpbmcoKSk7CisJfQorCisJU3lzdGVtLm91dC5wcmludCgiXHRUeXBlIGxvY2F0aW9ucyB0YWJsZToiKTsKKwlpZiAodHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSA9PSAwKSB7CisJCVN5c3RlbS5vdXQucHJpbnQoIiA8ZW1wdHk+Iik7CisJfSBlbHNlIHsKKwkJT2JqZWN0W10ga2V5VGFibGUgPSB0eXBlTG9jYXRpb25zLmtleVRhYmxlOworCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gdHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQorCQkJCVN5c3RlbS5vdXQucHJpbnQoIlxuXHRcdCIgKyBrZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgdmFsdWVUYWJsZVtpXS50b1N0cmluZygpKTsKKwl9CisKKwlTeXN0ZW0ub3V0LnByaW50KCJcblx0UmVmZXJlbmNlcyB0YWJsZToiKTsKKwlpZiAocmVmZXJlbmNlcy5lbGVtZW50U2l6ZSA9PSAwKSB7CisJCVN5c3RlbS5vdXQucHJpbnQoIiA8ZW1wdHk+Iik7CisJfSBlbHNlIHsKKwkJT2JqZWN0W10ga2V5VGFibGUgPSByZWZlcmVuY2VzLmtleVRhYmxlOworCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gcmVmZXJlbmNlcy52YWx1ZVRhYmxlOworCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJcblx0XHQiICsga2V5VGFibGVbaV0udG9TdHJpbmcoKSk7CisJCQkJUmVmZXJlbmNlQ29sbGVjdGlvbiBjID0gKFJlZmVyZW5jZUNvbGxlY3Rpb24pIHZhbHVlVGFibGVbaV07CisJCQkJY2hhcltdW11bXSBxUmVmcyA9IGMucXVhbGlmaWVkTmFtZVJlZmVyZW5jZXM7CisJCQkJU3lzdGVtLm91dC5wcmludCgiXG5cdFx0XHRxdWFsaWZpZWQ6Iik7CisJCQkJaWYgKHFSZWZzLmxlbmd0aCA9PSAwKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgPGVtcHR5PiIpOworCQkJCWVsc2UgZm9yIChpbnQgaiA9IDAsIGsgPSBxUmVmcy5sZW5ndGg7IGogPCBrOyBqKyspCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICciICsgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbi50b1N0cmluZyhxUmVmc1tqXSkgKyAiJyIpOworCQkJCWNoYXJbXVtdIHNSZWZzID0gYy5zaW1wbGVOYW1lUmVmZXJlbmNlczsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJcblx0XHRcdHNpbXBsZToiKTsKKwkJCQlpZiAoc1JlZnMubGVuZ3RoID09IDApCisJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiA8ZW1wdHk+Iik7CisJCQkJZWxzZSBmb3IgKGludCBqID0gMCwgayA9IHNSZWZzLmxlbmd0aDsgaiA8IGs7IGorKykKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIiArIG5ldyBTdHJpbmcoc1JlZnNbal0pKTsKKwkJCQlpZiAoYyBpbnN0YW5jZW9mIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbikgeworCQkJCQljaGFyW11bXSBuYW1lcyA9ICgoQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSBjKS5kZWZpbmVkVHlwZU5hbWVzOworCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJcblx0XHRcdGFkZGl0aW9uYWwgdHlwZSBuYW1lczoiKTsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIGsgPSBuYW1lcy5sZW5ndGg7IGogPCBrOyBqKyspCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIgKyBuZXcgU3RyaW5nKG5hbWVzW2pdKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCVN5c3RlbS5vdXQucHJpbnQoIlxuXG4iKTsKK30KKyovCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Xb3JrUXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvV29ya1F1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NTBjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvV29ya1F1ZXVlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgV29ya1F1ZXVlIHsKKworQXJyYXlMaXN0IG5lZWRzQ29tcGlsZUxpc3Q7CitBcnJheUxpc3QgY29tcGlsZWRMaXN0OworCitwdWJsaWMgV29ya1F1ZXVlKCkgeworCXRoaXMubmVlZHNDb21waWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoMTEpOworCXRoaXMuY29tcGlsZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgxMSk7Cit9CisKK3B1YmxpYyB2b2lkIGFkZChTdHJpbmcgZWxlbWVudCkgeworCW5lZWRzQ29tcGlsZUxpc3QuYWRkKGVsZW1lbnQpOworfQorCitwdWJsaWMgdm9pZCBhZGRBbGwoU3RyaW5nW10gZWxlbWVudHMpIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWFkZChlbGVtZW50c1tpXSk7Cit9CisKK3B1YmxpYyB2b2lkIGNsZWFyKCkgeworCXRoaXMubmVlZHNDb21waWxlTGlzdC5jbGVhcigpOworCXRoaXMuY29tcGlsZWRMaXN0LmNsZWFyKCk7Cit9CQorCitwdWJsaWMgdm9pZCBmaW5pc2hlZChTdHJpbmcgZWxlbWVudCkgeworCW5lZWRzQ29tcGlsZUxpc3QucmVtb3ZlKGVsZW1lbnQpOworCWNvbXBpbGVkTGlzdC5hZGQoZWxlbWVudCk7Cit9CisKK3B1YmxpYyBib29sZWFuIGlzQ29tcGlsZWQoU3RyaW5nIGVsZW1lbnQpIHsKKwlyZXR1cm4gY29tcGlsZWRMaXN0LmNvbnRhaW5zKGVsZW1lbnQpOworfQorCitwdWJsaWMgYm9vbGVhbiBpc1dhaXRpbmcoU3RyaW5nIGVsZW1lbnQpIHsKKwlyZXR1cm4gbmVlZHNDb21waWxlTGlzdC5jb250YWlucyhlbGVtZW50KTsKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIldvcmtRdWV1ZTogIiArIG5lZWRzQ29tcGlsZUxpc3Q7IC8vJE5PTi1OTFMtMSQKK30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0V2YWx1YXRpb25Db250ZXh0V3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhlY2EzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0dsb2JhbFZhcmlhYmxlV3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9HbG9iYWxWYXJpYWJsZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBmMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9HbG9iYWxWYXJpYWJsZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5ldmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JR2xvYmFsVmFyaWFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuR2xvYmFsVmFyaWFibGU7CisKKy8qKgorICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgaW5mcmFzdHJ1Y3R1cmUgZ2xvYmFsIHZhcmlhYmxlLiAgCisgKi8KK2NsYXNzIEdsb2JhbFZhcmlhYmxlV3JhcHBlciBpbXBsZW1lbnRzIElHbG9iYWxWYXJpYWJsZSB7CisJR2xvYmFsVmFyaWFibGUgdmFyaWFibGU7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgd3JhcHBlciBhcm91bmQgdGhlIGdpdmVuIGluZnJhc3RydWN0dXJlIGdsb2JhbCB2YXJpYWJsZS4KKyAqLworR2xvYmFsVmFyaWFibGVXcmFwcGVyKEdsb2JhbFZhcmlhYmxlIHZhcmlhYmxlKSB7CisJdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlOworfQorLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUdsb2JhbFZhcmlhYmxlI2dldEluaXRpYWxpemVyCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbGl6ZXIoKSB7CisJY2hhcltdIGluaXRpYWxpemVyID0gdGhpcy52YXJpYWJsZS5nZXRJbml0aWFsaXplcigpOworCWlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGluaXRpYWxpemVyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbC5JR2xvYmFsVmFyaWFibGUjZ2V0TmFtZQorICovCitwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy52YXJpYWJsZS5nZXROYW1lKCkpOworfQorLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUdsb2JhbFZhcmlhYmxlI2dldFR5cGVOYW1lCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJcmV0dXJuIG5ldyBTdHJpbmcodGhpcy52YXJpYWJsZS5nZXRUeXBlTmFtZSgpKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9SZXF1ZXN0b3JXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyOGExNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmV2YWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUNvZGVTbmlwcGV0UmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSVJlcXVlc3RvcjsKKyAKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0b3JXcmFwcGVyIGltcGxlbWVudHMgSVJlcXVlc3RvciB7CisJSUNvZGVTbmlwcGV0UmVxdWVzdG9yIHJlcXVlc3RvcjsKK3B1YmxpYyBSZXF1ZXN0b3JXcmFwcGVyKElDb2RlU25pcHBldFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKK30KKy8qKgorICogQHNlZSBJQ29kZVNuaXBwZXRSZXF1ZXN0b3IKKyAqLworcHVibGljIGJvb2xlYW4gYWNjZXB0Q2xhc3NGaWxlcyhDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzLCBjaGFyW10gY29kZVNuaXBwZXRDbGFzc05hbWUpIHsKKwlpbnQgbGVuZ3RoID0gY2xhc3NGaWxlcy5sZW5ndGg7CisJYnl0ZVtdW10gY2xhc3NGaWxlQnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdW107CisJU3RyaW5nW11bXSBjb21wb3VuZE5hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGhdW107CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gY2xhc3NGaWxlc1tpXTsKKwkJY2xhc3NGaWxlQnl0ZXNbaV0gPSBjbGFzc0ZpbGUuZ2V0Qnl0ZXMoKTsKKwkJY2hhcltdW10gY2xhc3NGaWxlQ29tcHVuZE5hbWUgPSBjbGFzc0ZpbGUuZ2V0Q29tcG91bmROYW1lKCk7CisJCWludCBsZW5ndGgyID0gY2xhc3NGaWxlQ29tcHVuZE5hbWUubGVuZ3RoOworCQlTdHJpbmdbXSBjb21wb3VuZE5hbWUgPSBuZXcgU3RyaW5nW2xlbmd0aDJdOworCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDI7IGorKyl7CisJCQljb21wb3VuZE5hbWVbal0gPSBuZXcgU3RyaW5nKGNsYXNzRmlsZUNvbXB1bmROYW1lW2pdKTsKKwkJfQorCQljb21wb3VuZE5hbWVzW2ldID0gY29tcG91bmROYW1lOworCX0KKwlyZXR1cm4gdGhpcy5yZXF1ZXN0b3IuYWNjZXB0Q2xhc3NGaWxlcyhjbGFzc0ZpbGVCeXRlcywgY29tcG91bmROYW1lcywgY29kZVNuaXBwZXRDbGFzc05hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGNvZGVTbmlwcGV0Q2xhc3NOYW1lKSk7Cit9CisvKioKKyAqIEBzZWUgSUNvZGVTbmlwcGV0UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgY2hhcltdIGZyYWdtZW50U291cmNlLCBpbnQgZnJhZ21lbnRLaW5kKSB7CisJdHJ5IHsKKwkJSU1hcmtlciBtYXJrZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLlRSQU5TSUVOVF9QUk9CTEVNKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCBwcm9ibGVtLmdldElEKCkpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBwcm9ibGVtLmdldFNvdXJjZUVuZCgpICsgMSk7CisJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpOworCQkvL21hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgIiMiICsgcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgcHJvYmxlbS5nZXRNZXNzYWdlKCkpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIChwcm9ibGVtLmlzV2FybmluZygpID8gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HIDogSU1hcmtlci5TRVZFUklUWV9FUlJPUikpOworCQl0aGlzLnJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKG1hcmtlciwgbmV3IFN0cmluZyhmcmFnbWVudFNvdXJjZSksIGZyYWdtZW50S2luZCk7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJpbmFyeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNWI5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlOZXN0ZWRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLklJbmRleENvbnN0YW50czsKKworcHVibGljIGNsYXNzIEhpZXJhcmNoeUJpbmFyeVR5cGUgaW1wbGVtZW50cyBJQmluYXJ5VHlwZSB7CisJcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOworCXByaXZhdGUgYm9vbGVhbiBpc0NsYXNzOworCXByaXZhdGUgY2hhcltdIG5hbWU7CisJcHJpdmF0ZSBjaGFyW10gZW5jbG9zaW5nVHlwZU5hbWU7CisJcHJpdmF0ZSBjaGFyW10gc3VwZXJjbGFzczsKKwlwcml2YXRlIGNoYXJbXVtdIHN1cGVySW50ZXJmYWNlcyA9IE5vSW50ZXJmYWNlOworCQorcHVibGljIEhpZXJhcmNoeUJpbmFyeVR5cGUoaW50IG1vZGlmaWVycywgY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lLCBjaGFyIGNsYXNzT3JJbnRlcmZhY2UpeworCisJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJdGhpcy5pc0NsYXNzID0gY2xhc3NPckludGVyZmFjZSA9PSBJSW5kZXhDb25zdGFudHMuQ0xBU1NfU1VGRklYOworCWlmIChlbmNsb3NpbmdUeXBlTmFtZSA9PSBudWxsKXsKKwkJdGhpcy5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWNhdGlvbiwgdHlwZU5hbWUsICcvJyk7CisJfSBlbHNlIHsKKwkJdGhpcy5uYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWNhdGlvbiwgJy8nLCBlbmNsb3NpbmdUeXBlTmFtZSwgJyQnLCB0eXBlTmFtZSk7IC8vcmVidWlsZCBBJEIgbmFtZQorCQl0aGlzLmVuY2xvc2luZ1R5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWNhdGlvbiwgZW5jbG9zaW5nVHlwZU5hbWUsJy8nKTsKKwkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMuZW5jbG9zaW5nVHlwZU5hbWUsICcuJywgJy8nKTsKKwl9CisJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMubmFtZSwgJy4nLCAnLycpOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlc29sdmVkIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB0eXBlIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYworICogb3IgbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgamF2YS5sYW5nLlN0cmluZyBpcyBqYXZhL2xhbmcvU3RyaW5nLgorICovCitwdWJsaWMgY2hhcltdIGdldEVuY2xvc2luZ1R5cGVOYW1lKCkgeworCXJldHVybiB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZmllbGRzIG9yIG51bGwgaWYgdGhlIGFycmF5IGlzIGVtcHR5LgorICovCitwdWJsaWMgSUJpbmFyeUZpZWxkW10gZ2V0RmllbGRzKCkgeworCXJldHVybiBudWxsOworfQorLyoqCisgKiBBbnN3ZXIgdGhlIGZpbGUgbmFtZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlLgorICoKKyAqIFRoZSBwYXRoIHBhcnQgKG9wdGlvbmFsKSBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBhY3R1YWwKKyAqIGZpbGUgcHJvcGVyIG5hbWUgYnkgYSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yLgorICoKKyAqIFRoZSBwcm9wZXIgZmlsZSBuYW1lIGluY2x1ZGVzIHRoZSBzdWZmaXggZXh0ZW5zaW9uIChlLmcuICIuamF2YSIpCisgKgorICogZS5nLiAiYzovY29tL2libS9jb21waWxlci9qYXZhL2FwaS9Db21waWxlci5qYXZhIiAKKyAqLworcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZXNvbHZlZCBuYW1lcyBvZiB0aGUgcmVjZWl2ZXIncyBpbnRlcmZhY2VzIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYworICogb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqLworcHVibGljIGNoYXJbXVtdIGdldEludGVyZmFjZU5hbWVzKCkgeworCXJldHVybiB0aGlzLnN1cGVySW50ZXJmYWNlczsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG5lc3RlZCB0eXBlcyBvciBudWxsIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAqCisgKiBUaGlzIG5lc3RlZCB0eXBlIGluZm8gaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlubmVyIGNsYXNzIGF0dHJpYnV0ZXMuCisgKiBBc2sgdGhlIG5hbWUgZW52aXJvbm1lbnQgdG8gZmluZCBhIG1lbWJlciB0eXBlIHVzaW5nIGl0cyBjb21wb3VuZCBuYW1lLgorICovCitwdWJsaWMgSUJpbmFyeU5lc3RlZFR5cGVbXSBnZXRNZW1iZXJUeXBlcygpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG1ldGhvZHMgb3IgbnVsbCBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuCisgKi8KK3B1YmxpYyBJQmluYXJ5TWV0aG9kW10gZ2V0TWV0aG9kcygpIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQW5zd2VyIGFuIGludCB3aG9zZSBiaXRzIGFyZSBzZXQgYWNjb3JkaW5nIHRoZSBhY2Nlc3MgY29uc3RhbnRzCisgKiBkZWZpbmVkIGJ5IHRoZSBWTSBzcGVjLgorICovCitwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwlyZXR1cm4gdGhpcy5tb2RpZmllcnM7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgbmFtZSBvZiB0aGUgdHlwZSBpbiB0aGUKKyAqIGNsYXNzIGZpbGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDQuMiBvZiB0aGUgSmF2YSAyIFZNIHNwZWMuCisgKgorICogRm9yIGV4YW1wbGUsIGphdmEubGFuZy5TdHJpbmcgaXMgamF2YS9sYW5nL1N0cmluZy4KKyAqLworcHVibGljIGNoYXJbXSBnZXROYW1lKCkgeworCXJldHVybiB0aGlzLm5hbWU7Cit9CisvKioKKyAqIEFuc3dlciB0aGUgcmVzb2x2ZWQgbmFtZSBvZiB0aGUgcmVjZWl2ZXIncyBzdXBlcmNsYXNzIGluIHRoZQorICogY2xhc3MgZmlsZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNC4yIG9mIHRoZSBKYXZhIDIgVk0gc3BlYworICogb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgamF2YS5sYW5nLlN0cmluZyBpcyBqYXZhL2xhbmcvU3RyaW5nLgorICovCitwdWJsaWMgY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCkgeworCXJldHVybiB0aGlzLnN1cGVyY2xhc3M7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKKwlyZXR1cm4gZmFsc2U7IC8vIGluZGV4IGRpZCBub3QgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gKHNpbmNlIHVudXNlZCBmb3IgaGllcmFyY2hpZXMpCit9CisKKy8qKgorICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybQorICogb3IgdGhlIHVucmVzb2x2ZWQgc291cmNlIGZvcm0gb2YgdGhlIHR5cGUuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogaXNDbGFzcyBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKwlyZXR1cm4gdGhpcy5pc0NsYXNzOworfQorLyoqCisgKiBpc0ludGVyZmFjZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJcmV0dXJuICF0aGlzLmlzQ2xhc3M7Cit9CitwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgeworCXJldHVybiBmYWxzZTsgIC8vIGluZGV4IGRpZCBub3QgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gKHNpbmNlIHVudXNlZCBmb3IgaGllcmFyY2hpZXMpCit9CitwdWJsaWMgYm9vbGVhbiBpc01lbWJlcigpIHsKKwlyZXR1cm4gZmFsc2U7ICAvLyBpbmRleCBkaWQgbm90IHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIChzaW5jZSB1bnVzZWQgZm9yIGhpZXJhcmNoaWVzKQorfQorCitwdWJsaWMgdm9pZCByZWNvcmRTdXBlclR5cGUoY2hhcltdIHN1cGVyVHlwZU5hbWUsIGNoYXJbXSBzdXBlclF1YWxpZmljYXRpb24sIGNoYXIgc3VwZXJDbGFzc09ySW50ZXJmYWNlKXsKKworCS8vIGluZGV4IGVuY29kaW5nIG9mIHAuQSRCIHdhcyBCL3AuQSQsIHJlYnVpbGQgdGhlIHByb3BlciBuYW1lCisJaWYgKHN1cGVyUXVhbGlmaWNhdGlvbiAhPSBudWxsKXsKKwkJaW50IGxlbmd0aCA9IHN1cGVyUXVhbGlmaWNhdGlvbi5sZW5ndGg7CisJCWlmIChzdXBlclF1YWxpZmljYXRpb25bbGVuZ3RoLTFdID09ICckJyl7CisJCQljaGFyW10gZW5jbG9zaW5nU3VwZXJOYW1lID0gQ2hhck9wZXJhdGlvbi5sYXN0U2VnbWVudChzdXBlclF1YWxpZmljYXRpb24sICcuJyk7CisJCQlzdXBlclR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoZW5jbG9zaW5nU3VwZXJOYW1lLCBzdXBlclR5cGVOYW1lKTsKKwkJCXN1cGVyUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc3VwZXJRdWFsaWZpY2F0aW9uLCAwLCBsZW5ndGggLSBlbmNsb3NpbmdTdXBlck5hbWUubGVuZ3RoIC0gMSk7CisJCX0KKwl9CisJCisJaWYgKHN1cGVyQ2xhc3NPckludGVyZmFjZSA9PSBJSW5kZXhDb25zdGFudHMuQ0xBU1NfU1VGRklYKXsKKwkJLy8gaW50ZXJmYWNlcyBhcmUgaW5kZXhlZCBhcyBoYXZpbmcgc3VwZXJjbGFzcyByZWZlcmVuY2VzIHRvIE9iamVjdCBieSBkZWZhdWx0LAorCQkvLyB0aGlzIGlzIGFuIGFydGlmYWN0IHVzZWQgZm9yIGJlaW5nIGFibGUgdG8gcXVlcnkgdGhlbSBvbmx5LgorCQlpZiAoIXRoaXMuaXNDbGFzcykgcmV0dXJuOyAKKwkJY2hhcltdIGVuY29kZWROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoc3VwZXJRdWFsaWZpY2F0aW9uLCBzdXBlclR5cGVOYW1lLCAnLycpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZW5jb2RlZE5hbWUsICcuJywgJy8nKTsgCisJCXRoaXMuc3VwZXJjbGFzcyA9IGVuY29kZWROYW1lOworCX0gZWxzZSB7CisJCWNoYXJbXSBlbmNvZGVkTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJUeXBlTmFtZSwgJy8nKTsKKwkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKGVuY29kZWROYW1lLCAnLicsICcvJyk7IAorCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgPT0gTm9JbnRlcmZhY2UpeworCQkJdGhpcy5zdXBlckludGVyZmFjZXMgPSBuZXcgY2hhcltdW10geyBlbmNvZGVkTmFtZSB9OworCQl9IGVsc2UgeworCQkJaW50IGxlbmd0aCA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5zdXBlckludGVyZmFjZXMsIDAsIHRoaXMuc3VwZXJJbnRlcmZhY2VzID0gbmV3IGNoYXJbbGVuZ3RoKzFdW10sIDAsIGxlbmd0aCk7CisJCQl0aGlzLnN1cGVySW50ZXJmYWNlc1tsZW5ndGhdID0gZW5jb2RlZE5hbWU7CisJCX0KKwl9Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJaWYgKHRoaXMubW9kaWZpZXJzID09IElDb25zdGFudHMuQWNjUHVibGljKSB7CisJCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAodGhpcy5pc0NsYXNzKCkpIHsKKwkJYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKCJpbnRlcmZhY2UgIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKHRoaXMubmFtZSAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisJaWYgKHRoaXMuc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoIlxuICBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQodGhpcy5zdXBlcmNsYXNzKTsKKwl9CisJaW50IGxlbmd0aDsKKwlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgIT0gbnVsbCAmJiAobGVuZ3RoID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoKSAhPSAwKSB7CisJCWJ1ZmZlci5hcHBlbmQoIlxuIGltcGxlbWVudHMgIik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnN1cGVySW50ZXJmYWNlc1tpXSk7CisJCQlpZiAoaSAhPSBsZW5ndGggLSAxKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGUKKyAqLworcHVibGljIGNoYXJbXSBzb3VyY2VGaWxlTmFtZSgpIHsKKwlyZXR1cm4gbnVsbDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzIwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CYXNpY0NvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTmFtZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNlYXJjaGFibGVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGVFbGVtZW50SW5mbzsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEhpZXJhcmNoeUJ1aWxkZXIgaW1wbGVtZW50cyBJSGllcmFyY2h5UmVxdWVzdG9yIHsKKwkvKioKKwkgKiBUaGUgaGllcmFyY2h5IGJlaW5nIGJ1aWx0LgorCSAqLworCXByb3RlY3RlZCBUeXBlSGllcmFyY2h5IGhpZXJhcmNoeTsKKwkvKioKKwkgKiBUaGUgbmFtZSBlbnZpcm9ubWVudCB1c2VkIGJ5IHRoZSBIaWVyYXJjaHlSZXNvbHZlcgorCSAqLworCXByb3RlY3RlZCBTZWFyY2hhYmxlRW52aXJvbm1lbnQgc2VhcmNoYWJsZUVudmlyb25tZW50OworCS8qKgorCSAqIEBzZWUgTmFtZUxvb2t1cAorCSAqLworCXByb3RlY3RlZCBOYW1lTG9va3VwIG5hbWVMb29rdXA7CisJLyoqCisJICogVGhlIHJlc29sdmVyIHVzZWQgdG8gcmVzb2x2ZSB0eXBlIGhpZXJhcmNoaWVzCisJICogQHNlZSBIaWVyYXJjaHlSZXNvbHZlcgorCSAqLworCXByb3RlY3RlZCBIaWVyYXJjaHlSZXNvbHZlciBoaWVyYXJjaHlSZXNvbHZlcjsKKwkvKioKKwkgKiBBIHRlbXBvcmFyeSBjYWNoZSBvZiBpbmZvcyB0byBoYW5kbGVzIHRvIHNwZWVkIGluZm8KKwkgKiB0byBoYW5kbGUgdHJhbnNsYXRpb24gLSBpdCBvbmx5IGNvbnRhaW5zIHRoZSBlbnRyaWVzCisJICogZm9yIHRoZSB0eXBlcyBpbiB0aGUgcmVnaW9uIChpLmUuIG5vIHN1cGVydHlwZXMgb3V0c2lkZQorCSAqIHRoZSByZWdpb24pLgorCSAqLworCXByb3RlY3RlZCBNYXAgaW5mb1RvSGFuZGxlOworCXB1YmxpYyBIaWVyYXJjaHlCdWlsZGVyKFR5cGVIaWVyYXJjaHkgaGllcmFyY2h5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCXRoaXMuaGllcmFyY2h5ID0gaGllcmFyY2h5OworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBoaWVyYXJjaHkuamF2YVByb2plY3QoKTsKKwkJdGhpcy5zZWFyY2hhYmxlRW52aXJvbm1lbnQgPQorCQkJKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgcHJvamVjdC5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJCXRoaXMubmFtZUxvb2t1cCA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpOworCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyID0KKwkJCW5ldyBIaWVyYXJjaHlSZXNvbHZlcigKKwkJCQl0aGlzLnNlYXJjaGFibGVFbnZpcm9ubWVudCwKKwkJCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCisJCQkJdGhpcywKKwkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCkpOworCQl0aGlzLmluZm9Ub0hhbmRsZSA9IG5ldyBIYXNoTWFwKDUpOworCX0KKwkKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBidWlsZChib29sZWFuIGNvbXB1dGVTdWJ0eXBlcykKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKKwkvKioKKwkgKiBDb25maWd1cmUgdGhpcyB0eXBlIGhpZXJhcmNoeSBieSBjb21wdXRpbmcgdGhlIHN1cGVydHlwZXMgb25seS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBidWlsZFN1cGVydHlwZXMoKSB7CisJCUlUeXBlIGZvY3VzVHlwZSA9IHRoaXMuZ2V0VHlwZSgpOworCQlpZiAoZm9jdXNUeXBlID09IG51bGwpCisJCQlyZXR1cm47CisJCS8vIGdldCBnZW5lcmljIHR5cGUgZnJvbSBmb2N1cyB0eXBlCisJCUlHZW5lcmljVHlwZSB0eXBlOworCQl0cnkgeworCQkJdHlwZSA9IChJR2VuZXJpY1R5cGUpICgoSmF2YUVsZW1lbnQpIGZvY3VzVHlwZSkuZ2V0UmF3SW5mbygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gaWYgdGhlIGZvY3VzIHR5cGUgaXMgbm90IHByZXNlbnQsIG9yIGlmIGNhbm5vdCBnZXQgd29ya2JlbmNoIHBhdGgKKwkJCS8vIHdlIGNhbm5vdCBjcmVhdGUgdGhlIGhpZXJhcmNoeQorCQkJcmV0dXJuOworCQl9CisJCS8vTkI6IG5vIG5lZWQgdG8gc2V0IGZvY3VzIHR5cGUgb24gaGllcmFyY2h5IHJlc29sdmVyIHNpbmNlIG5vIG90aGVyIHR5cGUgaXMgaW5qZWN0ZWQKKwkJLy8gICAgaW4gdGhlIGhpZXJhcmNoeSByZXNvbHZlciwgdGh1cyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoYXQgYSB0eXBlIGlzIAorCQkvLyAgICBhIHN1YiBvciBzdXBlciB0eXBlIG9mIHRoZSBmb2N1cyB0eXBlLgorCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IHVuaXRUb0xvb2tJbnNpZGUgPSBmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCWlmIChuYW1lTG9va3VwICE9IG51bGwpIHsKKwkJCXN5bmNocm9uaXplZChuYW1lTG9va3VwKSB7IC8vIHByZXZlbnQgMiBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIG5hbWUgbG9va3VwIHdoaWxlIHRoZSB3b3JraW5nIGNvcGllcyBhcmUgc2V0CisJCQkJSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcyA9IHRoaXMuZ2V0V29raW5nQ29waWVzKCk7CisJCQkJSVdvcmtpbmdDb3B5W10gdW5pdHNUb0xvb2tJbnNpZGU7CisJCQkJaWYgKHVuaXRUb0xvb2tJbnNpZGUgIT0gbnVsbCkgeworCQkJCQlpbnQgd2NMZW5ndGggPSB3b3JraW5nQ29waWVzID09IG51bGwgPyAwIDogd29ya2luZ0NvcGllcy5sZW5ndGg7CisJCQkJCWlmICh3Y0xlbmd0aCA9PSAwKSB7CisJCQkJCQl1bml0c1RvTG9va0luc2lkZSA9IG5ldyBJV29ya2luZ0NvcHlbXSB7dW5pdFRvTG9va0luc2lkZX07CisJCQkJCX0gZWxzZSB7CisJCQkJCQl1bml0c1RvTG9va0luc2lkZSA9IG5ldyBJV29ya2luZ0NvcHlbd2NMZW5ndGgrMV07CisJCQkJCQl1bml0c1RvTG9va0luc2lkZVswXSA9IHVuaXRUb0xvb2tJbnNpZGU7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHdvcmtpbmdDb3BpZXMsIDAsIHVuaXRzVG9Mb29rSW5zaWRlLCAxLCB3Y0xlbmd0aCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl1bml0c1RvTG9va0luc2lkZSA9IHdvcmtpbmdDb3BpZXM7CisJCQkJfQorCQkJCXRyeSB7CisJCQkJCW5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUodW5pdHNUb0xvb2tJbnNpZGUpOworCQkJCQkvLyByZXNvbHZlCisJCQkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZSh0eXBlKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQluYW1lTG9va3VwLnNldFVuaXRzVG9Mb29rSW5zaWRlKG51bGwpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHJlc29sdmUKKwkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZSh0eXBlKTsKKwkJfQorCQkvLyBBZGQgZm9jdXMgaWYgbm90IGFscmVhZHkgaW4gKGNhc2Ugb2YgYSB0eXBlIHdpdGggbm8gZXhwbGljaXQgc3VwZXIgdHlwZSkKKwkJaWYgKCF0aGlzLmhpZXJhcmNoeS5jb250YWlucyhmb2N1c1R5cGUpKSB7CisJCQl0aGlzLmhpZXJhcmNoeS5hZGRSb290Q2xhc3MoZm9jdXNUeXBlKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElIaWVyYXJjaHlSZXF1ZXN0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25uZWN0KAorCQlJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLAorCQlJR2VuZXJpY1R5cGUgc3VwZXJjbGFzcywKKwkJSUdlbmVyaWNUeXBlW10gc3VwZXJpbnRlcmZhY2VzKSB7CisJCXRoaXMud29ya2VkKDEpOworCQkvLyBjb252ZXJ0IGFsbCBpbmZvcyB0byBoYW5kbGVzCisJCUlUeXBlIHR5cGVIYW5kbGUgPSBnZXRIYW5kbGUoc3VwcGxpZWRUeXBlKTsKKwkJLyoKKwkJICogVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIDFHMk81V0s6IElUUEpDT1JFOldJTk5UIC0gTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBzZWxlY3RpbmcgIlNob3cgaW4gVHlwZSBIaWVyYXJjaHkiIGZvciBhIGlubmVyIGNsYXNzCisJCSAqLworCQlpZiAodHlwZUhhbmRsZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlJVHlwZSBzdXBlckhhbmRsZSA9IG51bGw7CisJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCWlmIChzdXBlcmNsYXNzIGluc3RhbmNlb2YgSGllcmFyY2h5UmVzb2x2ZXIuTWlzc2luZ1R5cGUpIHsKKwkJCQl0aGlzLmhpZXJhcmNoeS5taXNzaW5nVHlwZXMuYWRkKCgoSGllcmFyY2h5UmVzb2x2ZXIuTWlzc2luZ1R5cGUpc3VwZXJjbGFzcykuc2ltcGxlTmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXN1cGVySGFuZGxlID0gZ2V0SGFuZGxlKHN1cGVyY2xhc3MpOworCQkJfQorCQl9CisJCUlUeXBlW10gaW50ZXJmYWNlSGFuZGxlcyA9IG51bGw7CisJCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCAmJiBzdXBlcmludGVyZmFjZXMubGVuZ3RoID4gMCkgeworCQkJaW50IGxlbmd0aCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7CisJCQlJVHlwZVtdIHJlc29sdmVkSW50ZXJmYWNlSGFuZGxlcyA9IG5ldyBJVHlwZVtsZW5ndGhdOworCQkJaW50IGluZGV4ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJR2VuZXJpY1R5cGUgc3VwZXJJbnRlcmZhY2UgPSBzdXBlcmludGVyZmFjZXNbaV07CisJCQkJaWYgKHN1cGVySW50ZXJmYWNlICE9IG51bGwpIHsKKwkJCQkJaWYgKHN1cGVySW50ZXJmYWNlIGluc3RhbmNlb2YgSGllcmFyY2h5UmVzb2x2ZXIuTWlzc2luZ1R5cGUpIHsKKwkJCQkJCXRoaXMuaGllcmFyY2h5Lm1pc3NpbmdUeXBlcy5hZGQoKChIaWVyYXJjaHlSZXNvbHZlci5NaXNzaW5nVHlwZSlzdXBlckludGVyZmFjZSkuc2ltcGxlTmFtZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXNvbHZlZEludGVyZmFjZUhhbmRsZXNbaW5kZXhdID0gZ2V0SGFuZGxlKHN1cGVySW50ZXJmYWNlKTsKKwkJCQkJCWlmIChyZXNvbHZlZEludGVyZmFjZUhhbmRsZXNbaW5kZXhdICE9IG51bGwpIHsKKwkJCQkJCQlpbmRleCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gcmVzaXplCisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXJlc29sdmVkSW50ZXJmYWNlSGFuZGxlcywKKwkJCQkwLAorCQkJCWludGVyZmFjZUhhbmRsZXMgPSBuZXcgSVR5cGVbaW5kZXhdLAorCQkJCTAsCisJCQkJaW5kZXgpOworCQl9CisJCWlmIChUeXBlSGllcmFyY2h5LkRFQlVHKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJIkNvbm5lY3Rpbmc6ICIgKyAoKEphdmFFbGVtZW50KSB0eXBlSGFuZGxlKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkiICB0byBzdXBlcmNsYXNzOiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAoc3VwZXJIYW5kbGUgPT0gbnVsbAorCQkJCQkJPyAiPE5vbmU+IiAvLyROT04tTkxTLTEkCisJCQkJCQk6ICgoSmF2YUVsZW1lbnQpIHN1cGVySGFuZGxlKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSkpOworCQkJU3lzdGVtLm91dC5wcmludCgiICBhbmQgc3VwZXJpbnRlcmZhY2VzOiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoaW50ZXJmYWNlSGFuZGxlcyA9PSBudWxsIHx8IGludGVyZmFjZUhhbmRsZXMubGVuZ3RoID09IDApIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiA8Tm9uZT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlSGFuZGxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJCQkiICAgICIgKyAoKEphdmFFbGVtZW50KSBpbnRlcmZhY2VIYW5kbGVzW2ldKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gbm93IGRvIHRoZSBjYWNoaW5nCisJCWlmIChzdXBwbGllZFR5cGUuaXNDbGFzcygpKSB7CisJCQlpZiAoc3VwZXJIYW5kbGUgPT0gbnVsbCkgeworCQkJCXRoaXMuaGllcmFyY2h5LmFkZFJvb3RDbGFzcyh0eXBlSGFuZGxlKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5oaWVyYXJjaHkuY2FjaGVTdXBlcmNsYXNzKHR5cGVIYW5kbGUsIHN1cGVySGFuZGxlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuaGllcmFyY2h5LmFkZEludGVyZmFjZSh0eXBlSGFuZGxlKTsKKwkJfQorCQlpZiAoaW50ZXJmYWNlSGFuZGxlcyA9PSBudWxsKSB7CisJCQlpbnRlcmZhY2VIYW5kbGVzID0gdGhpcy5oaWVyYXJjaHkuTk9fVFlQRTsKKwkJfQorCQl0aGlzLmhpZXJhcmNoeS5jYWNoZVN1cGVySW50ZXJmYWNlcyh0eXBlSGFuZGxlLCBpbnRlcmZhY2VIYW5kbGVzKTsKKwkJIAorCQkvLyByZWNvcmQgZmxhZ3MKKwkJdGhpcy5oaWVyYXJjaHkuY2FjaGVGbGFncyh0eXBlSGFuZGxlLCBzdXBwbGllZFR5cGUuZ2V0TW9kaWZpZXJzKCkpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZ2VuZXJpYyB0eXBlIG9yIG51bGwgaWYgbm90IGZvdW5kLgorCSAqLworCXByb3RlY3RlZCBJVHlwZSBnZXRIYW5kbGUoSUdlbmVyaWNUeXBlIGdlbmVyaWNUeXBlKSB7CisJCWlmIChnZW5lcmljVHlwZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChnZW5lcmljVHlwZS5pc0JpbmFyeVR5cGUoKSkgeworCQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoSUNsYXNzRmlsZSkgdGhpcy5pbmZvVG9IYW5kbGUuZ2V0KGdlbmVyaWNUeXBlKTsKKwkJCS8vIGlmIGl0J3MgbnVsbCwgaXQncyBmcm9tIG91dHNpZGUgdGhlIHJlZ2lvbiwgc28gZG8gbG9va3VwCisJCQlpZiAoY2xhc3NGaWxlID09IG51bGwpIHsKKwkJCQlJVHlwZSBoYW5kbGUgPSBsb29rdXBCaW5hcnlIYW5kbGUoKElCaW5hcnlUeXBlKSBnZW5lcmljVHlwZSk7CisJCQkJaWYgKGhhbmRsZSA9PSBudWxsKQorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkvLyBjYXNlIG9mIGFuIGFub255bW91cyB0eXBlIChzZWUgMUcyTzVXSzogSVRQSkNPUkU6V0lOTlQgLSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHNlbGVjdGluZyAiU2hvdyBpbiBUeXBlIEhpZXJhcmNoeSIgZm9yIGEgaW5uZXIgY2xhc3MpCisJCQkJLy8gb3B0aW1pemF0aW9uOiByZW1lbWJlciB0aGUgaGFuZGxlIGZvciBuZXh0IGNhbGwgKGNhc2Ugb2YgamF2YS5pby5TZXJpYWxpemFibGUgdGhhdCBhIGxvdCBvZiBjbGFzc2VzIGltcGxlbWVudCkKKwkJCQl0aGlzLmluZm9Ub0hhbmRsZS5wdXQoZ2VuZXJpY1R5cGUsIGhhbmRsZS5nZXRQYXJlbnQoKSk7CisJCQkJcmV0dXJuIGhhbmRsZTsKKwkJCX0gZWxzZSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgU291cmNlVHlwZUVsZW1lbnRJbmZvKSB7CisJCQlyZXR1cm4gKChTb3VyY2VUeXBlRWxlbWVudEluZm8pIGdlbmVyaWNUeXBlKS5nZXRIYW5kbGUoKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gbnVsbDsKKwl9CisJcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7CisJCXJldHVybiB0aGlzLmhpZXJhcmNoeS5nZXRUeXBlKCk7CisJfQorcHJvdGVjdGVkIElXb3JraW5nQ29weVtdIGdldFdva2luZ0NvcGllcygpIHsKKwlpZiAodGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yIGluc3RhbmNlb2YgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbikgeworCQlyZXR1cm4gKChDcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uKXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvcikud29ya2luZ0NvcGllczsKKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisJLyoqCisJICogTG9va3MgdXAgYW5kIHJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBiaW5hcnkgaW5mby4KKwkgKi8KKwlwcm90ZWN0ZWQgSVR5cGUgbG9va3VwQmluYXJ5SGFuZGxlKElCaW5hcnlUeXBlIHR5cGVJbmZvKSB7CisJCWludCBmbGFnOworCQlTdHJpbmcgcXVhbGlmaWVkTmFtZTsKKwkJaWYgKHR5cGVJbmZvLmlzQ2xhc3MoKSkgeworCQkJZmxhZyA9IHRoaXMubmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUzsKKwkJfSBlbHNlIHsKKwkJCWZsYWcgPSB0aGlzLm5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVM7CisJCX0KKwkJY2hhcltdIGJOYW1lID0gdHlwZUluZm8uZ2V0TmFtZSgpOworCQlxdWFsaWZpZWROYW1lID0gbmV3IFN0cmluZyhDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWUoYk5hbWUpKTsKKwkJcmV0dXJuIHRoaXMubmFtZUxvb2t1cC5maW5kVHlwZShxdWFsaWZpZWROYW1lLCBmYWxzZSwgZmxhZyk7CisJfQorCXByb3RlY3RlZCB2b2lkIHdvcmtlZChpbnQgd29yaykgeworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IHRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvcjsKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQlpZiAocHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJfSBlbHNlIHsKKwkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKHdvcmspOworCQkJfQorCQl9CisJfQorLyoqCisgKiBDcmVhdGUgYW4gSUNvbXBpbGF0aW9uVW5pdCBpbmZvIGZyb20gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgb24gZGlzay4KKyAqLworcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbVBhdGgoT3BlbmFibGUgaGFuZGxlLCBTdHJpbmcgb3NQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJcmV0dXJuIAorCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQludWxsLAorCQkJbnVsbCwKKwkJCW9zUGF0aCwKKwkJCWVuY29kaW5nKTsKK30KKwkvKioKKyAqIENyZWF0ZXMgdGhlIHR5cGUgaW5mbyBmcm9tIHRoZSBnaXZlbiBjbGFzcyBmaWxlIG9uIGRpc2sgYW5kCisgKiBhZGRzIGl0IHRvIHRoZSBnaXZlbiBsaXN0IG9mIGluZm9zLgorICovCitwcm90ZWN0ZWQgSUdlbmVyaWNUeXBlIGNyZWF0ZUluZm9Gcm9tQ2xhc3NGaWxlKE9wZW5hYmxlIGhhbmRsZSwgU3RyaW5nIG9zUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUdlbmVyaWNUeXBlIGluZm8gPSBudWxsOworCXRyeSB7CisJCWluZm8gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyLnJlYWQob3NQYXRoKTsKKwl9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCQlyZXR1cm4gbnVsbDsKKwl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJcmV0dXJuIG51bGw7CisJfQkJCQkJCQorCXRoaXMuaW5mb1RvSGFuZGxlLnB1dChpbmZvLCBoYW5kbGUpOworCXJldHVybiBpbmZvOworfQorCS8qKgorICogQ3JlYXRlIGEgdHlwZSBpbmZvIGZyb20gdGhlIGdpdmVuIGNsYXNzIGZpbGUgaW4gYSBqYXIgYW5kIGFkZHMgaXQgdG8gdGhlIGdpdmVuIGxpc3Qgb2YgaW5mb3MuCisgKi8KK3Byb3RlY3RlZCBJR2VuZXJpY1R5cGUgY3JlYXRlSW5mb0Zyb21DbGFzc0ZpbGVJbkphcihPcGVuYWJsZSBjbGFzc0ZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlKYXZhRWxlbWVudCBwa2cgPSBjbGFzc0ZpbGUuZ2V0UGFyZW50KCk7CisJU3RyaW5nIGNsYXNzRmlsZVBhdGggPSBwa2cuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIvIiArIGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOyAvLyROT04tTkxTLTEkCisJSUdlbmVyaWNUeXBlIGluZm8gPSBudWxsOworCWphdmEudXRpbC56aXAuWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKKwl0cnkgeworCQl6aXBGaWxlID0gKChKYXJQYWNrYWdlRnJhZ21lbnRSb290KXBrZy5nZXRQYXJlbnQoKSkuZ2V0SmFyKCk7CisJCWluZm8gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyLnJlYWQoCisJCQl6aXBGaWxlLAorCQkJY2xhc3NGaWxlUGF0aCk7CisJfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJcmV0dXJuIG51bGw7CisJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCXJldHVybiBudWxsOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCQlyZXR1cm4gbnVsbDsKKwl9IGZpbmFsbHkgeworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jbG9zZVppcEZpbGUoemlwRmlsZSk7CisJfQorCXRoaXMuaW5mb1RvSGFuZGxlLnB1dChpbmZvLCBjbGFzc0ZpbGUpOworCXJldHVybiBpbmZvOworfQorCitwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvRnJvbUNsb3NlZEVsZW1lbnQoT3BlbmFibGUgaGFuZGxlLCBBcnJheUxpc3QgaW5mb3MsIEFycmF5TGlzdCB1bml0cywgU3RyaW5nIHJlc291cmNlUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCisJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IGluZm8KKwlJSmF2YUVsZW1lbnQgcGtnID0gaGFuZGxlLmdldFBhcmVudCgpOworCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KXBrZy5nZXRQYXJlbnQoKTsKKwlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkvLyBjbGFzcyBmaWxlIGluIGEgamFyCisJCUlHZW5lcmljVHlwZSBpbmZvID0gdGhpcy5jcmVhdGVJbmZvRnJvbUNsYXNzRmlsZUluSmFyKGhhbmRsZSk7CisJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCWluZm9zLmFkZChpbmZvKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIGZpbGUgaW4gYSBkaXJlY3RvcnkKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc291cmNlUGF0aCk7CisJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7CisJCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOworCQlpZiAobG9jYXRpb24gIT0gbnVsbCl7CisJCQlTdHJpbmcgb3NQYXRoID0gbG9jYXRpb24udG9PU1N0cmluZygpOworCQkJaWYgKGhhbmRsZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgeworCQkJCS8vIGNvbXBpbGF0aW9uIHVuaXQgaW4gYSBkaXJlY3RvcnkKKwkJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSB0aGlzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb21QYXRoKGhhbmRsZSwgb3NQYXRoKTsKKwkJCQlpZiAodW5pdCAhPSBudWxsKSB7CisJCQkJCXVuaXRzLmFkZCh1bml0KTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGhhbmRsZSBpbnN0YW5jZW9mIENsYXNzRmlsZSkgeworCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBkaXJlY3RvcnkKKwkJCQlJR2VuZXJpY1R5cGUgaW5mbyA9IHRoaXMuY3JlYXRlSW5mb0Zyb21DbGFzc0ZpbGUoaGFuZGxlLCBvc1BhdGgpOworCQkJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCQkJaW5mb3MuYWRkKGluZm8pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKK30KKworLyoqCisgKiBBZGQgdGhlIHR5cGUgaW5mbyBmcm9tIHRoZSBnaXZlbiBDVSB0byB0aGUgZ2l2ZW4gbGlzdCBvZiBpbmZvcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkSW5mb0Zyb21PcGVuQ1UoQ29tcGlsYXRpb25Vbml0IGN1LCBBcnJheUxpc3QgaW5mb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlUeXBlW10gdHlwZXMgPSBjdS5nZXRUeXBlcygpOworCWZvciAoaW50IGogPSAwOyBqIDwgdHlwZXMubGVuZ3RoOyBqKyspIHsKKwkJU291cmNlVHlwZSB0eXBlID0gKFNvdXJjZVR5cGUpdHlwZXNbal07CisJCXRoaXMuYWRkSW5mb0Zyb21PcGVuU291cmNlVHlwZSh0eXBlLCBpbmZvcyk7CisJfQorfQorCisKKy8qKgorICogQWRkIHRoZSB0eXBlIGluZm8gZnJvbSB0aGUgZ2l2ZW4gQ1UgdG8gdGhlIGdpdmVuIGxpc3Qgb2YgaW5mb3MuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFkZEluZm9Gcm9tT3BlblNvdXJjZVR5cGUoU291cmNlVHlwZSB0eXBlLCBBcnJheUxpc3QgaW5mb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlHZW5lcmljVHlwZSBpbmZvID0gKElHZW5lcmljVHlwZSl0eXBlLmdldFJhd0luZm8oKTsKKwlpbmZvcy5hZGQoaW5mbyk7CisJdGhpcy5pbmZvVG9IYW5kbGUucHV0KGluZm8sIHR5cGUpOworCUlUeXBlW10gbWVtYmVycyA9IHR5cGUuZ2V0VHlwZXMoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKwkJdGhpcy5hZGRJbmZvRnJvbU9wZW5Tb3VyY2VUeXBlKChTb3VyY2VUeXBlKW1lbWJlcnNbaV0sIGluZm9zKTsKKwl9Cit9CisKKy8qKgorICogQWRkIHRoZSB0eXBlIGluZm8gZnJvbSB0aGUgZ2l2ZW4gY2xhc3MgZmlsZSB0byB0aGUgZ2l2ZW4gbGlzdCBvZiBpbmZvcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkSW5mb0Zyb21PcGVuQ2xhc3NGaWxlKENsYXNzRmlsZSBjbGFzc0ZpbGUsIEFycmF5TGlzdCBpbmZvcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVR5cGUgdHlwZSA9IGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJSUdlbmVyaWNUeXBlIGluZm8gPSAoSUdlbmVyaWNUeXBlKSAoKEJpbmFyeVR5cGUpIHR5cGUpLmdldFJhd0luZm8oKTsKKwlpbmZvcy5hZGQoaW5mbyk7CisJdGhpcy5pbmZvVG9IYW5kbGUucHV0KGluZm8sIGNsYXNzRmlsZSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGFkZEluZm9Gcm9tRWxlbWVudChPcGVuYWJsZSBoYW5kbGUsIEFycmF5TGlzdCBpbmZvcywgQXJyYXlMaXN0IHVuaXRzLCBTdHJpbmcgcmVzb3VyY2VQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlpZiAoaGFuZGxlLmlzT3BlbigpKSB7CisJCS8vIHJldXNlIHRoZSBpbmZvIGZyb20gdGhlIGphdmEgbW9kZWwgY2FjaGUKKwkJaWYgKGhhbmRsZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgeworCQkJdGhpcy5hZGRJbmZvRnJvbU9wZW5DVSgoQ29tcGlsYXRpb25Vbml0KWhhbmRsZSwgaW5mb3MpOworCQl9IGVsc2UgaWYgKGhhbmRsZSBpbnN0YW5jZW9mIENsYXNzRmlsZSkgeworCQkJdGhpcy5hZGRJbmZvRnJvbU9wZW5DbGFzc0ZpbGUoKENsYXNzRmlsZSloYW5kbGUsIGluZm9zKTsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuYWRkSW5mb0Zyb21DbG9zZWRFbGVtZW50KGhhbmRsZSwgaW5mb3MsIHVuaXRzLCByZXNvdXJjZVBhdGgpOworCX0KK30KKworCisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHk7CisKKy8qKgorICogVGhpcyBpcyB0aGUgcHVibGljIGVudHJ5IHBvaW50IHRvIHJlc29sdmUgdHlwZSBoaWVyYXJjaGllcy4KKyAqCisgKiBXaGVuIHJlcXVlc3RpbmcgYWRkaXRpb25hbCB0eXBlcyBmcm9tIHRoZSBuYW1lIGVudmlyb25tZW50LCB0aGUgcmVzb2x2ZXIKKyAqIGFjY2VwdHMgYWxsIGZvcm1zIChiaW5hcnksIHNvdXJjZSAmIGNvbXBpbGF0aW9uIHVuaXQpIGZvciBhZGRpdGlvbmFsIHR5cGVzLgorICoKKyAqIFNpZGUgbm90ZXM6IEJpbmFyeSB0eXBlcyBhbHJlYWR5IGtub3cgdGhlaXIgcmVzb2x2ZWQgc3VwZXJ0eXBlcyBzbyB0aGlzCisgKiBvbmx5IG1ha2VzIHNlbnNlIGZvciBzb3VyY2UgdHlwZXMuIEV2ZW4gdGhvdWdoIHRoZSBjb21waWxlciBmaW5kcyBhbGwgYmluYXJ5CisgKiB0eXBlcyB0byBjb21wbGV0ZSB0aGUgaGllcmFyY2h5IG9mIGEgZ2l2ZW4gc291cmNlIHR5cGUsIGlzIHRoZXJlIGFueSByZWFzb24KKyAqIHdoeSB0aGUgcmVxdWVzdG9yIHNob3VsZCBiZSBpbmZvcm1lZCB0aGF0IGJpbmFyeSB0eXBlIFggc3ViY2xhc3NlcyBZICYKKyAqIGltcGxlbWVudHMgSSAmIEo/CisgKi8KKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklFcnJvckhhbmRsaW5nUG9saWN5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLklUeXBlUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluYXJ5VHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb29rdXBFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKKworcHVibGljIGNsYXNzIEhpZXJhcmNoeVJlc29sdmVyIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3IgeworCUlIaWVyYXJjaHlSZXF1ZXN0b3IgcmVxdWVzdG9yOworCUxvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50OworCisJcHJpdmF0ZSBpbnQgdHlwZUluZGV4OworCXByaXZhdGUgSUdlbmVyaWNUeXBlW10gdHlwZU1vZGVsczsKKwlwcml2YXRlIFJlZmVyZW5jZUJpbmRpbmdbXSB0eXBlQmluZGluZ3M7CisJcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nIGZvY3VzVHlwZTsKKwlwcml2YXRlIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOworCQorLyoqCisgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBzaW1wbGUgbmFtZSBvZiBhIHR5cGUgdGhhdCBpcyBtaXNzaW5nLgorICovCitwdWJsaWMgY2xhc3MgTWlzc2luZ1R5cGUgaW1wbGVtZW50cyBJR2VuZXJpY1R5cGUgeworCXB1YmxpYyBTdHJpbmcgc2ltcGxlTmFtZTsKKwkKKwlwdWJsaWMgTWlzc2luZ1R5cGUoU3RyaW5nIHNpbXBsZU5hbWUpIHsKKwkJdGhpcy5zaW1wbGVOYW1lID0gc2ltcGxlTmFtZTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElHZW5lcmljVHlwZSNnZXRNb2RpZmllcnMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUdlbmVyaWNUeXBlI2lzQmluYXJ5VHlwZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCaW5hcnlUeXBlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElHZW5lcmljVHlwZSNpc0NsYXNzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElHZW5lcmljVHlwZSNpc0ludGVyZmFjZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSURlcGVuZGVudCNnZXRGaWxlTmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiTWlzc2luZyB0eXBlOiAiICsgdGhpcy5zaW1wbGVOYW1lOyAvLyROT04tTkxTLTEkCisJfQorCit9CisJCitwdWJsaWMgSGllcmFyY2h5UmVzb2x2ZXIoCisJSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQsCisJSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAorCU1hcCBzZXR0aW5ncywKKwlJSGllcmFyY2h5UmVxdWVzdG9yIHJlcXVlc3RvciwKKwlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKKworCS8vIGNyZWF0ZSBhIHByb2JsZW0gaGFuZGxlciBnaXZlbiBhIGhhbmRsaW5nIHBvbGljeQorCW9wdGlvbnMgPSBzZXR0aW5ncyA9PSBudWxsID8gbmV3IENvbXBpbGVyT3B0aW9ucygpIDogbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7CisJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IG5ldyBQcm9ibGVtUmVwb3J0ZXIocG9saWN5LCBvcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7CisJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9IG5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCBvcHRpb25zLCBwcm9ibGVtUmVwb3J0ZXIsIG5hbWVFbnZpcm9ubWVudCk7CisJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisKKwl0aGlzLnR5cGVJbmRleCA9IC0xOworCXRoaXMudHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbNV07CisJdGhpcy50eXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XTsKK30KK3B1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcihJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudCwgTWFwIHNldHRpbmdzLCBJSGllcmFyY2h5UmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7CisJdGhpcygKKwkJbmFtZUVudmlyb25tZW50LAorCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksCisJCXNldHRpbmdzLAorCQlyZXF1ZXN0b3IsCisJCXByb2JsZW1GYWN0b3J5KTsKK30KKy8qKgorICogQWRkIGFuIGFkZGl0aW9uYWwgYmluYXJ5IHR5cGUKKyAqLworCitwdWJsaWMgdm9pZCBhY2NlcHQoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwlCaW5hcnlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKKwl0cnkgeworCQl0aGlzLnJlbWVtYmVyKGJpbmFyeVR5cGUsIHR5cGVCaW5kaW5nKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwl9Cit9CisvKioKKyAqIEFkZCBhbiBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uIHVuaXQuCisgKi8KKworcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgeworCS8vU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgYWNjZXB0IGNvbXBpbGF0aW9uIHVuaXRzIGluc2lkZSB0aGUgSGllcmFyY2h5UmVzb2x2ZXIuIik7CisJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAorCQluZXcgU3RyaW5nQnVmZmVyKFV0aWwuYmluZCgiYWNjZXB0LmNhbm5vdCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHNvdXJjZVVuaXQuZ2V0RmlsZU5hbWUoKSkKKwkJCS50b1N0cmluZygpKTsKK30KKy8qKgorICogQWRkIGFkZGl0aW9uYWwgc291cmNlIHR5cGVzCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgeworCS8vIGZpbmQgbW9zdCBlbmNsb3NpbmcgdHlwZSBmaXJzdCAobmVlZGVkIHdoZW4gZXhwbGljaXQgYXNrRm9yVHlwZSguLi4pIGlzIGRvbmUgCisJLy8gd2l0aCBhIG1lbWJlciB0eXBlIChlLmcuIHAuQSRCKSkKKwlJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gc291cmNlVHlwZXNbMF07CisJd2hpbGUgKHNvdXJjZVR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpCisJCXNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkKKwkvLyBidWlsZCBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQKKwlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0KKwkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdChuZXcgSVNvdXJjZVR5cGVbXSB7c291cmNlVHlwZX0sIGZhbHNlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7CisJCQorCS8vIGJ1aWxkIGJpbmRpbmdzCisJaWYgKHVuaXQgIT0gbnVsbCkgeworCQl0cnkgeworCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CisJCQlyZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhzb3VyY2VUeXBlLCB1bml0LnR5cGVzWzBdLmJpbmRpbmcpOworCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgZmFsc2UpOworCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCS8vIG1pc3NpbmcgJ2phdmEubGFuZycgcGFja2FnZTogaWdub3JlCisJCX0KKwl9Cit9CisvKgorICogRmluZCB0aGUgc3VwZXIgY2xhc3Mgb2YgdGhlIGdpdmVuIHR5cGUgaW4gdGhlIGNhY2hlLgorICogUmV0dXJucyBhIE1pc3NpbmdUeXBlIGlmIHRoZSBjbGFzcyBpcyBub3QgZm91bmQsCisgKiBvciBudWxsIGlmIHR5cGUgaGFzIG5vIHN1cGVyIGNsYXNzLgorICovCitwcml2YXRlIElHZW5lcmljVHlwZSBmaW5kU3VwZXJDbGFzcyhJR2VuZXJpY1R5cGUgdHlwZSwgUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZykgeworCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJCaW5kaW5nID0gdHlwZUJpbmRpbmcuc3VwZXJjbGFzcygpOworCWlmIChzdXBlckJpbmRpbmcgIT0gbnVsbCkgeworCQlpZiAoc3VwZXJCaW5kaW5nLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCAmJiB0eXBlQmluZGluZy5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKSB7CisJCQljaGFyW10gc3VwZXJjbGFzc05hbWU7CisJCQljaGFyIHNlcGFyYXRvcjsKKwkJCWlmICh0eXBlIGluc3RhbmNlb2YgSUJpbmFyeVR5cGUpIHsKKwkJCQlzdXBlcmNsYXNzTmFtZSA9ICgoSUJpbmFyeVR5cGUpdHlwZSkuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwkJCQlzZXBhcmF0b3IgPSAnLyc7CisJCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJU291cmNlVHlwZSkgeworCQkJCXN1cGVyY2xhc3NOYW1lID0gKChJU291cmNlVHlwZSl0eXBlKS5nZXRTdXBlcmNsYXNzTmFtZSgpOworCQkJCXNlcGFyYXRvciA9ICcuJzsKKwkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEhpZXJhcmNoeVR5cGUpIHsKKwkJCQlzdXBlcmNsYXNzTmFtZSA9ICgoSGllcmFyY2h5VHlwZSl0eXBlKS5zdXBlcmNsYXNzTmFtZTsKKwkJCQlzZXBhcmF0b3IgPSAnLic7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHJldHVybiBudWxsOworCQkJaW50IGxhc3RTZXBhcmF0b3IgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKHNlcGFyYXRvciwgc3VwZXJjbGFzc05hbWUpOworCQkJY2hhcltdIHNpbXBsZU5hbWUgPSBsYXN0U2VwYXJhdG9yID09IC0xID8gc3VwZXJjbGFzc05hbWUgOiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHN1cGVyY2xhc3NOYW1lLCBsYXN0U2VwYXJhdG9yKzEsIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCk7CisJCQlyZXR1cm4gbmV3IE1pc3NpbmdUeXBlKG5ldyBTdHJpbmcoc2ltcGxlTmFtZSkpOworCQl9IGVsc2UgeworCQkJZm9yIChpbnQgdCA9IHR5cGVJbmRleDsgdCA+PSAwOyB0LS0pIHsKKwkJCQlpZiAodHlwZUJpbmRpbmdzW3RdID09IHN1cGVyQmluZGluZykgeworCQkJCQlyZXR1cm4gdHlwZU1vZGVsc1t0XTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IAorCXJldHVybiBudWxsOworfQorLyoKKyAqIEZpbmQgdGhlIHN1cGVyIGludGVyZmFjZXMgb2YgdGhlIGdpdmVuIHR5cGUgaW4gdGhlIGNhY2hlLgorICogUmV0dXJucyBhIE1pc3NpbmdUeXBlIGlmIHRoZSBpbnRlcmZhY2UgaXMgbm90IGZvdW5kLgorICovCitwcml2YXRlIElHZW5lcmljVHlwZVtdIGZpbmRTdXBlckludGVyZmFjZXMoSUdlbmVyaWNUeXBlIHR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwljaGFyW11bXSBzdXBlckludGVyZmFjZU5hbWVzOworCWNoYXIgc2VwYXJhdG9yOworCWlmICh0eXBlIGluc3RhbmNlb2YgSUJpbmFyeVR5cGUpIHsKKwkJc3VwZXJJbnRlcmZhY2VOYW1lcyA9ICgoSUJpbmFyeVR5cGUpdHlwZSkuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwkJc2VwYXJhdG9yID0gJy8nOworCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIElTb3VyY2VUeXBlKSB7CisJCXN1cGVySW50ZXJmYWNlTmFtZXMgPSAoKElTb3VyY2VUeXBlKXR5cGUpLmdldEludGVyZmFjZU5hbWVzKCk7CisJCXNlcGFyYXRvciA9ICcuJzsKKwl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBIaWVyYXJjaHlUeXBlKSB7CisJCXN1cGVySW50ZXJmYWNlTmFtZXMgPSAoKEhpZXJhcmNoeVR5cGUpdHlwZSkuc3VwZXJJbnRlcmZhY2VOYW1lczsKKwkJc2VwYXJhdG9yID0gJy4nOworCX0gZWxzZXsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VCaW5kaW5ncyA9IHR5cGVCaW5kaW5nLnN1cGVySW50ZXJmYWNlcygpOworCWludCBiaW5kaW5nSW5kZXggPSAwOworCWludCBiaW5kaW5nTGVuZ3RoID0gaW50ZXJmYWNlQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2VCaW5kaW5ncy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IHN1cGVySW50ZXJmYWNlTmFtZXMgPT0gbnVsbCA/IDAgOiBzdXBlckludGVyZmFjZU5hbWVzLmxlbmd0aDsKKwlJR2VuZXJpY1R5cGVbXSBzdXBlcmludGVyZmFjZXMgPSBuZXcgSUdlbmVyaWNUeXBlW2xlbmd0aF07CisJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY2hhcltdIHN1cGVySW50ZXJmYWNlTmFtZSA9IHN1cGVySW50ZXJmYWNlTmFtZXNbaV07CisJCWludCBsYXN0U2VwYXJhdG9yID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IsIHN1cGVySW50ZXJmYWNlTmFtZSk7CisJCWNoYXJbXSBzaW1wbGVOYW1lID0gbGFzdFNlcGFyYXRvciA9PSAtMSA/IHN1cGVySW50ZXJmYWNlTmFtZSA6IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc3VwZXJJbnRlcmZhY2VOYW1lLCBsYXN0U2VwYXJhdG9yKzEsIHN1cGVySW50ZXJmYWNlTmFtZS5sZW5ndGgpOworCQlpZiAoYmluZGluZ0luZGV4IDwgYmluZGluZ0xlbmd0aCkgeworCQkJUmVmZXJlbmNlQmluZGluZyBpbnRlcmZhY2VCaW5kaW5nID0gaW50ZXJmYWNlQmluZGluZ3NbYmluZGluZ0luZGV4XTsKKworCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGJpbmRpbmcgY29ycmVzcG9uZHMgdG8gdGhlIGludGVyZmFjZSBkZWZpbmVkIGJ5IHRoZSB1c2VyCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2ltcGxlTmFtZSwgaW50ZXJmYWNlQmluZGluZy5zb3VyY2VOYW1lKSkgeworCQkJCWJpbmRpbmdJbmRleCsrOworCQkJCWZvciAoaW50IHQgPSB0eXBlSW5kZXg7IHQgPj0gMDsgdC0tKSB7CisJCQkJCWlmICh0eXBlQmluZGluZ3NbdF0gPT0gaW50ZXJmYWNlQmluZGluZykgeworCQkJCQkJc3VwZXJpbnRlcmZhY2VzW2ldID0gdHlwZU1vZGVsc1t0XTsKKwkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJc3VwZXJpbnRlcmZhY2VzW2ldID0gbmV3IE1pc3NpbmdUeXBlKG5ldyBTdHJpbmcoc2ltcGxlTmFtZSkpOworCX0KKwlyZXR1cm4gc3VwZXJpbnRlcmZhY2VzOworfQorcHJpdmF0ZSB2b2lkIHJlbWVtYmVyKElHZW5lcmljVHlwZSBzdXBwbGllZFR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuOworCQorCWlmIChzdXBwbGllZFR5cGUuaXNCaW5hcnlUeXBlKCkpIHsKKwkJLy8gZmF1bHQgaW4gaXRzIGhpZXJhcmNoeS4uLgorCQkvLyBOQjogQWJvcnRDb21waWxhdGlvbiBpcyBoYW5kbGVkIGJ5IGNhbGxlcgorCQl0eXBlQmluZGluZy5zdXBlcmNsYXNzKCk7CisJCXR5cGVCaW5kaW5nLnN1cGVySW50ZXJmYWNlcygpOworCX0KKwkKKwlpZiAoKyt0eXBlSW5kZXggPT0gdHlwZU1vZGVscy5sZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0eXBlTW9kZWxzLCAwLCB0eXBlTW9kZWxzID0gbmV3IElHZW5lcmljVHlwZVt0eXBlSW5kZXggKiAyXSwgMCwgdHlwZUluZGV4KTsKKwkJU3lzdGVtLmFycmF5Y29weSh0eXBlQmluZGluZ3MsIDAsIHR5cGVCaW5kaW5ncyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW3R5cGVJbmRleCAqIDJdLCAwLCB0eXBlSW5kZXgpOworCX0KKwl0eXBlTW9kZWxzW3R5cGVJbmRleF0gPSBzdXBwbGllZFR5cGU7CisJdHlwZUJpbmRpbmdzW3R5cGVJbmRleF0gPSB0eXBlQmluZGluZzsKK30KK3ByaXZhdGUgdm9pZCByZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBIaWVyYXJjaHlUeXBlIGVuY2xvc2luZ1R5cGUsIElDb21waWxhdGlvblVuaXQgdW5pdCkgeworCisJaWYgKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nID09IG51bGwpIHJldHVybjsKKworCS8vIHNpbXBsZSBzdXBlciBjbGFzcyBuYW1lCisJY2hhcltdIHN1cGVyY2xhc3NOYW1lID0gbnVsbDsKKwlUeXBlUmVmZXJlbmNlIHN1cGVyY2xhc3MgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJjbGFzczsKKwlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCWNoYXJbXVtdIHR5cGVOYW1lID0gc3VwZXJjbGFzcy5nZXRUeXBlTmFtZSgpOworCQlzdXBlcmNsYXNzTmFtZSA9IHR5cGVOYW1lID09IG51bGwgPyBudWxsIDogdHlwZU5hbWVbdHlwZU5hbWUubGVuZ3RoLTFdOworCX0KKwkKKwkvLyBzaW1wbGUgc3VwZXIgaW50ZXJmYWNlIG5hbWVzCisJY2hhcltdW10gc3VwZXJJbnRlcmZhY2VOYW1lcyA9IG51bGw7CisJVHlwZVJlZmVyZW5jZVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXM7CisJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCWludCBsZW5ndGggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOworCQlzdXBlckludGVyZmFjZU5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlUeXBlUmVmZXJlbmNlIHN1cGVySW50ZXJmYWNlID0gc3VwZXJJbnRlcmZhY2VzW2ldOworCQkJY2hhcltdW10gdHlwZU5hbWUgPSBzdXBlckludGVyZmFjZS5nZXRUeXBlTmFtZSgpOworCQkJc3VwZXJJbnRlcmZhY2VOYW1lc1tpXSA9IHR5cGVOYW1lW3R5cGVOYW1lLmxlbmd0aC0xXTsKKwkJfQorCX0KKworCUhpZXJhcmNoeVR5cGUgaGllcmFyY2h5VHlwZSA9IG5ldyBIaWVyYXJjaHlUeXBlKAorCQllbmNsb3NpbmdUeXBlLCAKKwkJIXR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpLAorCQl0eXBlRGVjbGFyYXRpb24ubmFtZSwKKwkJdHlwZURlY2xhcmF0aW9uLmJpbmRpbmcubW9kaWZpZXJzLAorCQlzdXBlcmNsYXNzTmFtZSwKKwkJc3VwZXJJbnRlcmZhY2VOYW1lcywKKwkJdW5pdCk7CisJcmVtZW1iZXIoaGllcmFyY2h5VHlwZSwgdHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOworCisJLy8gcHJvcGFnYXRlIGludG8gbWVtYmVyIHR5cGVzCisJaWYgKHR5cGVEZWNsYXJhdGlvbi5tZW1iZXJUeXBlcyA9PSBudWxsKSByZXR1cm47CisJTWVtYmVyVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZXMgPSB0eXBlRGVjbGFyYXRpb24ubWVtYmVyVHlwZXM7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKwkJcmVtZW1iZXJXaXRoTWVtYmVyVHlwZXMobWVtYmVyVHlwZXNbaV0sIGhpZXJhcmNoeVR5cGUsIHVuaXQpOworCX0KK30KK3ByaXZhdGUgdm9pZCByZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhJU291cmNlVHlwZSBzdXBwbGllZFR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuOworCisJcmVtZW1iZXIoc3VwcGxpZWRUeXBlLCB0eXBlQmluZGluZyk7CisKKwlJU291cmNlVHlwZVtdIG1lbWJlclR5cGVzID0gc3VwcGxpZWRUeXBlLmdldE1lbWJlclR5cGVzKCk7CisJaWYgKG1lbWJlclR5cGVzID09IG51bGwpIHJldHVybjsKKwlmb3IgKGludCBtID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJSVNvdXJjZVR5cGUgbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW21dOworCQlyZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhtZW1iZXJUeXBlLCB0eXBlQmluZGluZy5nZXRNZW1iZXJUeXBlKG1lbWJlclR5cGUuZ2V0TmFtZSgpKSk7CisJfQorfQorcHJpdmF0ZSB2b2lkIHJlcG9ydEhpZXJhcmNoeSgpIHsKKwlmb3IgKGludCBjdXJyZW50ID0gdHlwZUluZGV4OyBjdXJyZW50ID49IDA7IGN1cnJlbnQtLSkgeworCQlJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlID0gdHlwZU1vZGVsc1tjdXJyZW50XTsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nc1tjdXJyZW50XTsKKworCQlpZiAoIXN1Yk9yU3VwZXJPZkZvY3VzKHR5cGVCaW5kaW5nKSkgeworCQkJY29udGludWU7IC8vIGlnbm9yZSB0eXBlcyBvdXRzaWRlIG9mIGhpZXJhcmNoeQorCQl9CisKKwkJSUdlbmVyaWNUeXBlIHN1cGVyY2xhc3M7CisJCWlmICh0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKXsgLy8gZG8gbm90IGNvbm5lY3QgaW50ZXJmYWNlcyB0byBPYmplY3QKKwkJCXN1cGVyY2xhc3MgPSBudWxsOworCQl9IGVsc2UgeworCQkJc3VwZXJjbGFzcyA9IHRoaXMuZmluZFN1cGVyQ2xhc3Moc3VwcGxpZWRUeXBlLCB0eXBlQmluZGluZyk7CisJCX0KKwkJSUdlbmVyaWNUeXBlW10gc3VwZXJpbnRlcmZhY2VzID0gdGhpcy5maW5kU3VwZXJJbnRlcmZhY2VzKHN1cHBsaWVkVHlwZSwgdHlwZUJpbmRpbmcpOworCQkKKwkJcmVxdWVzdG9yLmNvbm5lY3Qoc3VwcGxpZWRUeXBlLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMpOworCX0KK30KK3ByaXZhdGUgdm9pZCByZXNldCgpeworCWxvb2t1cEVudmlyb25tZW50LnJlc2V0KCk7CisKKwl0aGlzLnR5cGVJbmRleCA9IC0xOworCXRoaXMudHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbNV07CisJdGhpcy50eXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XTsKK30KKy8qKgorICogUmVzb2x2ZSB0aGUgc3VwZXJ0eXBlcyBmb3IgdGhlIHN1cHBsaWVkIHNvdXJjZSB0eXBlcy4KKyAqIEluZm9ybSB0aGUgcmVxdWVzdG9yIG9mIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIGZvciBlYWNoCisgKiBzdXBwbGllZCBzb3VyY2UgdHlwZSB1c2luZzoKKyAqICAgIGNvbm5lY3QoSVNvdXJjZVR5cGUgc3VwcGxpZWRUeXBlLCBJR2VuZXJpY1R5cGUgc3VwZXJjbGFzcywgSUdlbmVyaWNUeXBlW10gc3VwZXJpbnRlcmZhY2VzKQorICoKKyAqIEFsc28gaW5mb3JtIHRoZSByZXF1ZXN0b3Igb2YgdGhlIHN1cGVydHlwZXMgb2YgZWFjaAorICogYWRkaXRpb25hbCByZXF1ZXN0ZWQgc3VwZXIgdHlwZSB3aGljaCBpcyBhbHNvIGEgc291cmNlIHR5cGUKKyAqIGluc3RlYWQgb2YgYSBiaW5hcnkgdHlwZS4KKyAqLworCitwdWJsaWMgdm9pZCByZXNvbHZlKElHZW5lcmljVHlwZVtdIHN1cHBsaWVkVHlwZXMpIHsKKwlyZXNvbHZlKHN1cHBsaWVkVHlwZXMsIG51bGwpOworfQorLyoqCisgKiBSZXNvbHZlIHRoZSBzdXBlcnR5cGVzIGZvciB0aGUgc3VwcGxpZWQgc291cmNlIHR5cGVzLgorICogSW5mb3JtIHRoZSByZXF1ZXN0b3Igb2YgdGhlIHJlc29sdmVkIHN1cGVydHlwZXMgZm9yIGVhY2gKKyAqIHN1cHBsaWVkIHNvdXJjZSB0eXBlIHVzaW5nOgorICogICAgY29ubmVjdChJU291cmNlVHlwZSBzdXBwbGllZFR5cGUsIElHZW5lcmljVHlwZSBzdXBlcmNsYXNzLCBJR2VuZXJpY1R5cGVbXSBzdXBlcmludGVyZmFjZXMpCisgKgorICogQWxzbyBpbmZvcm0gdGhlIHJlcXVlc3RvciBvZiB0aGUgc3VwZXJ0eXBlcyBvZiBlYWNoCisgKiBhZGRpdGlvbmFsIHJlcXVlc3RlZCBzdXBlciB0eXBlIHdoaWNoIGlzIGFsc28gYSBzb3VyY2UgdHlwZQorICogaW5zdGVhZCBvZiBhIGJpbmFyeSB0eXBlLgorICovCisKK3B1YmxpYyB2b2lkIHJlc29sdmUoSUdlbmVyaWNUeXBlW10gc3VwcGxpZWRUeXBlcywgSUNvbXBpbGF0aW9uVW5pdFtdIHNvdXJjZVVuaXRzKSB7CisJdHJ5IHsKKwkJaW50IHN1cHBsaWVkTGVuZ3RoID0gc3VwcGxpZWRUeXBlcyA9PSBudWxsID8gMCA6IHN1cHBsaWVkVHlwZXMubGVuZ3RoOworCQlpbnQgc291cmNlTGVuZ3RoID0gc291cmNlVW5pdHMgPT0gbnVsbCA/IDAgOiBzb3VyY2VVbml0cy5sZW5ndGg7CisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW10gdW5pdHMgPSBuZXcgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bc3VwcGxpZWRMZW5ndGggKyBzb3VyY2VMZW5ndGhdOworCQkKKwkJLy8gY2FjaGUgYmluYXJ5IHR5cGUgYmlkaW5ncworCQlCaW5hcnlUeXBlQmluZGluZ1tdIGJpbmFyeUJpbmRpbmdzID0gbmV3IEJpbmFyeVR5cGVCaW5kaW5nW3N1cHBsaWVkTGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBwbGllZExlbmd0aDsgaSsrKSB7CisJCQlpZiAoc3VwcGxpZWRUeXBlc1tpXS5pc0JpbmFyeVR5cGUoKSkgeworCQkJCUlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSAoSUJpbmFyeVR5cGUpIHN1cHBsaWVkVHlwZXNbaV07CisJCQkJdHJ5IHsKKwkJCQkJYmluYXJ5QmluZGluZ3NbaV0gPSBsb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSwgZmFsc2UpOworCQkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCQkvLyBjbGFzc3BhdGggcHJvYmxlbSBmb3IgdGhpcyB0eXBlOiBpZ25vcmUKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIGJ1aWxkIHR5cGUgYmluZGluZ3MKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBwbGllZExlbmd0aDsgaSsrKSB7CisJCQlpZiAoc3VwcGxpZWRUeXBlc1tpXS5pc0JpbmFyeVR5cGUoKSkgeworCQkJCWlmIChiaW5hcnlCaW5kaW5nc1tpXSAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlyZW1lbWJlcigoSUJpbmFyeVR5cGUpIHN1cHBsaWVkVHlwZXNbaV0sIGJpbmFyeUJpbmRpbmdzW2ldKTsKKwkJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCQkvLyBjbGFzc3BhdGggcHJvYmxlbSBmb3IgdGhpcyB0eXBlOiBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gbXVzdCBzdGFydCB3aXRoIHRoZSB0b3AgbGV2ZWwgdHlwZQorCQkJCUlTb3VyY2VUeXBlIHRvcExldmVsVHlwZSA9IChJU291cmNlVHlwZSkgc3VwcGxpZWRUeXBlc1tpXTsKKwkJCQl3aGlsZSAodG9wTGV2ZWxUeXBlLmdldEVuY2xvc2luZ1R5cGUoKSAhPSBudWxsKQorCQkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOworCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh0b3BMZXZlbFR5cGUuZ2V0RmlsZU5hbWUoKSwgaSwgc3VwcGxpZWRMZW5ndGgsIHRoaXMub3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOworCQkJCXVuaXRzW2ldID0gU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdChuZXcgSVNvdXJjZVR5cGVbXXt0b3BMZXZlbFR5cGV9LCBmYWxzZSwgdHJ1ZSwgbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCByZXN1bHQpOworCQkJCWlmICh1bml0c1tpXSAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlsb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0c1tpXSk7CisJCQkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCQkJLy8gY2xhc3NwYXRoIHByb2JsZW0gZm9yIHRoaXMgdHlwZTogaWdub3JlCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKyl7CisJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBzb3VyY2VVbml0c1tpXTsKKwkJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgc3VwcGxpZWRMZW5ndGgraSwgc3VwcGxpZWRMZW5ndGgrc291cmNlTGVuZ3RoLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsgCisJCQlQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHRydWUsIG9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKKwkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwpIHsKKwkJCQl1bml0c1tzdXBwbGllZExlbmd0aCtpXSA9IHBhcnNlZFVuaXQ7CisJCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCQl9CisJCX0KKwkJCisJCS8vIGNvbXBsZXRlIHR5cGUgYmluZGluZ3MgKGllLiBjb25uZWN0IHN1cGVyIHR5cGVzKSBhbmQgcmVtZW1iZXIgdGhlbQorCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cHBsaWVkTGVuZ3RoOyBpKyspIHsKKwkJCWlmICghc3VwcGxpZWRUeXBlc1tpXS5pc0JpbmFyeVR5cGUoKSkgeyAvLyBub3RlIHRoYXQgYmluYXJ5IHR5cGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbWVtYmVyZWQgYWJvdmUKKwkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdW5pdHNbaV07CisJCQkJaWYgKHBhcnNlZFVuaXQgIT0gbnVsbCkgeworCQkJCQkvLyBtdXN0IHN0YXJ0IHdpdGggdGhlIHRvcCBsZXZlbCB0eXBlCisJCQkJCUlTb3VyY2VUeXBlIHRvcExldmVsVHlwZSA9IChJU291cmNlVHlwZSkgc3VwcGxpZWRUeXBlc1tpXTsKKwkJCQkJc3VwcGxpZWRUeXBlc1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBuZWVkZWQgcGFzcyB0aGlzIHBvaW50CQkJCQorCQkJCQl3aGlsZSAodG9wTGV2ZWxUeXBlLmdldEVuY2xvc2luZ1R5cGUoKSAhPSBudWxsKQorCQkJCQkJdG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQsIGZhbHNlKTsKKwkJCQkJCXJlbWVtYmVyV2l0aE1lbWJlclR5cGVzKHRvcExldmVsVHlwZSwgcGFyc2VkVW5pdC50eXBlc1swXS5iaW5kaW5nKTsKKwkJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCQkvLyBjbGFzc3BhdGggcHJvYmxlbSBmb3IgdGhpcyB0eXBlOiBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKSB7CisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdW5pdHNbc3VwcGxpZWRMZW5ndGgraV07CisJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CisJCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCwgZmFsc2UpOworCQkJCWludCB0eXBlQ291bnQgPSBwYXJzZWRVbml0LnR5cGVzID09IG51bGwgPyAwIDogcGFyc2VkVW5pdC50eXBlcy5sZW5ndGg7CisJCQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gc291cmNlVW5pdHNbaV07CisJCQkJc291cmNlVW5pdHNbaV0gPSBudWxsOyAvLyBubyBsb25nZXIgbmVlZGVkIHBhc3MgdGhpcyBwb2ludAorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdHlwZUNvdW50OyBqKyspeworCQkJCQlyZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhwYXJzZWRVbml0LnR5cGVzW2pdLCBudWxsLCBzb3VyY2VVbml0KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXBvcnRIaWVyYXJjaHkoKTsKKwkJCisJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpeyAvLyB3b3JrLWFyb3VuZCBmb3IgMUdGNVcxUyAtIGNhbiBoYXBwZW4gaW4gY2FzZSBkdXBsaWNhdGVzIGFyZSBmZWQgdG8gdGhlIGhpZXJhcmNoeSB3aXRoIGJpbmFyaWVzIGhpZGluZyBzb3VyY2VzCisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7IC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBmb3Igbm93IHNpbmNlIGl0IHR5cGljYWxseSBtZWFucyB3ZSBjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0CisJfSBmaW5hbGx5IHsKKwkJcmVzZXQoKTsKKwl9Cit9CisvKioKKyAqIFJlc29sdmUgdGhlIHN1cGVydHlwZXMgZm9yIHRoZSBzdXBwbGllZCBzb3VyY2UgdHlwZS4KKyAqIEluZm9ybSB0aGUgcmVxdWVzdG9yIG9mIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIHVzaW5nOgorICogICAgY29ubmVjdChJU291cmNlVHlwZSBzdXBwbGllZFR5cGUsIElHZW5lcmljVHlwZSBzdXBlcmNsYXNzLCBJR2VuZXJpY1R5cGVbXSBzdXBlcmludGVyZmFjZXMpCisgKi8KKworcHVibGljIHZvaWQgcmVzb2x2ZShJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlKSB7CisJdHJ5IHsKKwkJaWYgKHN1cHBsaWVkVHlwZS5pc0JpbmFyeVR5cGUoKSkgeworCQkJcmVtZW1iZXIoc3VwcGxpZWRUeXBlLCBsb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoKElCaW5hcnlUeXBlKSBzdXBwbGllZFR5cGUpKTsKKwkJfSBlbHNlIHsKKwkJCS8vIG11c3Qgc3RhcnQgd2l0aCB0aGUgdG9wIGxldmVsIHR5cGUKKwkJCUlTb3VyY2VUeXBlIHRvcExldmVsVHlwZSA9IChJU291cmNlVHlwZSkgc3VwcGxpZWRUeXBlOworCQkJd2hpbGUgKHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkKKwkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOworCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHRvcExldmVsVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQorCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQobmV3IElTb3VyY2VUeXBlW117dG9wTGV2ZWxUeXBlfSwgZmFsc2UsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsKKworCQkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOworCQkJCXJlbWVtYmVyV2l0aE1lbWJlclR5cGVzKHRvcExldmVsVHlwZSwgdW5pdC50eXBlc1swXS5iaW5kaW5nKTsKKworCQkJCWxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIGZhbHNlKTsKKwkJCX0KKwkJfQorCQlyZXBvcnRIaWVyYXJjaHkoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIGZvciBub3cgc2luY2UgaXQgdHlwaWNhbGx5IG1lYW5zIHdlIGNhbm5vdCBmaW5kIGphdmEubGFuZy5PYmplY3QKKwl9IGZpbmFsbHkgeworCQlyZXNldCgpOworCX0KK30KKy8qKgorICogU2V0IHRoZSBmb2N1cyB0eXBlIChpZS4gdGhlIHR5cGUgdGhhdCB0aGlzIHJlc29sdmVyIGlzIGNvbXB1dGluZyB0aGUgaGllcmFyY2ggZm9yLgorICogUmV0dXJucyB0aGUgYmluZGluZyBvZiB0aGlzIGZvY3VzIHR5cGUgb3IgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCisgKi8KK3B1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHNldEZvY3VzVHlwZShjaGFyW11bXSBjb21wb3VuZE5hbWUpIHsKKwlpZiAoY29tcG91bmROYW1lID09IG51bGwgfHwgdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwl0aGlzLmZvY3VzVHlwZSA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuYXNrRm9yVHlwZShjb21wb3VuZE5hbWUpOworCXJldHVybiB0aGlzLmZvY3VzVHlwZTsKK30KK3ByaXZhdGUgYm9vbGVhbiBzdWJPclN1cGVyT2ZGb2N1cyhSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBhY2NlcHQgYWxsIHR5cGVzIChjYXNlIG9mIGhpZXJhcmNoeSBpbiBhIHJlZ2lvbikKKwlpZiAodGhpcy5zdWJUeXBlT2ZUeXBlKHRoaXMuZm9jdXNUeXBlLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOworCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUodHlwZUJpbmRpbmcsIHRoaXMuZm9jdXNUeXBlKSkgcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorcHJpdmF0ZSBib29sZWFuIHN1YlR5cGVPZlR5cGUoUmVmZXJlbmNlQmluZGluZyBzdWJUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgc3ViVHlwZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJaWYgKHN1YlR5cGUgPT0gdHlwZUJpbmRpbmcpIHJldHVybiB0cnVlOworCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHN1YlR5cGUuc3VwZXJjbGFzcygpOworCWlmIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QgJiYgc3ViVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKSByZXR1cm4gZmFsc2U7CisJaWYgKHRoaXMuc3ViVHlwZU9mVHlwZShzdXBlcmNsYXNzLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOworCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSBzdWJUeXBlLnN1cGVySW50ZXJmYWNlcygpOworCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGhpcy5zdWJUeXBlT2ZUeXBlKHN1cGVySW50ZXJmYWNlc1tpXSwgdHlwZUJpbmRpbmcpKSByZXR1cm4gdHJ1ZTsKKwkJfSAKKwl9CisJcmV0dXJuIGZhbHNlOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlYjBkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlUeXBlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNUeXBlOworCisvKioKKyAqIAorICogUGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBhbiBJR2VuZXJpY1R5cGUgdXNlZCB0bworICogYW5zd2VyIGhpZXJhcmNoaWVzLgorICovCitwdWJsaWMgY2xhc3MgSGllcmFyY2h5VHlwZSBpbXBsZW1lbnRzIElHZW5lcmljVHlwZSB7CisKKwlwdWJsaWMgSGllcmFyY2h5VHlwZSBlbmNsb3NpbmdUeXBlOworCXB1YmxpYyBib29sZWFuIGlzQ2xhc3M7CisJcHVibGljIGNoYXJbXSBuYW1lOworCXB1YmxpYyBpbnQgbW9kaWZpZXJzOworCXB1YmxpYyBjaGFyW10gc3VwZXJjbGFzc05hbWU7CisJcHVibGljIGNoYXJbXVtdIHN1cGVySW50ZXJmYWNlTmFtZXM7CisJcHVibGljIElDb21waWxhdGlvblVuaXQgb3JpZ2luYXRpbmdVbml0OworCQorcHVibGljIEhpZXJhcmNoeVR5cGUoCisJSGllcmFyY2h5VHlwZSBlbmNsb3NpbmdUeXBlLCAKKwlib29sZWFuIGlzQ2xhc3MsIAorCWNoYXJbXSBuYW1lLCAKKwlpbnQgbW9kaWZpZXJzLCAKKwljaGFyW10gc3VwZXJjbGFzc05hbWUsCisJY2hhcltdW10gc3VwZXJJbnRlcmZhY2VOYW1lcywKKwlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmF0aW5nVW5pdCkgeworCQkKKwl0aGlzLmVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlOworCXRoaXMuaXNDbGFzcyA9IGlzQ2xhc3M7CisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwl0aGlzLnN1cGVyY2xhc3NOYW1lID0gc3VwZXJjbGFzc05hbWU7CisJdGhpcy5zdXBlckludGVyZmFjZU5hbWVzID0gc3VwZXJJbnRlcmZhY2VOYW1lczsKKwl0aGlzLm9yaWdpbmF0aW5nVW5pdCA9IG9yaWdpbmF0aW5nVW5pdDsKK30KKy8qKgorICogQW5zd2VyIHRoZSBmaWxlIG5hbWUgd2hpY2ggZGVmaW5lcyB0aGUgdHlwZS4KKyAqCisgKiBUaGUgcGF0aCBwYXJ0IChvcHRpb25hbCkgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgYWN0dWFsCisgKiBmaWxlIHByb3BlciBuYW1lIGJ5IGEgamF2YS5pby5GaWxlLnNlcGFyYXRvci4KKyAqCisgKiBUaGUgcHJvcGVyIGZpbGUgbmFtZSBpbmNsdWRlcyB0aGUgc3VmZml4IGV4dGVuc2lvbiAoZS5nLiAiLmphdmEiKQorICoKKyAqIGUuZy4gImM6L2NvbS9pYm0vY29tcGlsZXIvamF2YS9hcGkvQ29tcGlsZXIuamF2YSIgCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJcmV0dXJuIG9yaWdpbmF0aW5nVW5pdC5nZXRGaWxlTmFtZSgpOworfQorLyoqCisgKiBBbnN3ZXIgYW4gaW50IHdob3NlIGJpdHMgYXJlIHNldCBhY2NvcmRpbmcgdGhlIGFjY2VzcyBjb25zdGFudHMKKyAqIGRlZmluZWQgYnkgdGhlIFZNIHNwZWMuCisgKi8KK3B1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCXJldHVybiB0aGlzLm1vZGlmaWVyczsKK30KKy8qKgorICogQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGNvbnRhaW5zIHRoZSByZXNvbHZlZCBiaW5hcnkgZm9ybQorICogb3IgdGhlIHVucmVzb2x2ZWQgc291cmNlIGZvcm0gb2YgdGhlIHR5cGUuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQmluYXJ5VHlwZSgpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIGlzQ2xhc3MgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7CisJcmV0dXJuIHRoaXMuaXNDbGFzczsKK30KKy8qKgorICogaXNJbnRlcmZhY2UgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworCXJldHVybiAhaXNDbGFzczsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JSGllcmFyY2h5UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSUhpZXJhcmNoeVJlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGMzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSUhpZXJhcmNoeVJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUdlbmVyaWNUeXBlOworCitwdWJsaWMgaW50ZXJmYWNlIElIaWVyYXJjaHlSZXF1ZXN0b3IgeworLyoqCisgKiBDb25uZWN0IHRoZSBzdXBwbGllZCB0eXBlIHRvIGl0cyBzdXBlcmNsYXNzICYgc3VwZXJpbnRlcmZhY2VzLgorICogVGhlIHN1cGVyY2xhc3MgJiBzdXBlcmludGVyZmFjZXMgYXJlIHRoZSBpZGVudGljYWwgYmluYXJ5IG9yIHNvdXJjZSB0eXBlcyBhcworICogc3VwcGxpZWQgYnkgdGhlIG5hbWUgZW52aXJvbm1lbnQuCisgKi8KKworcHVibGljIHZvaWQgY29ubmVjdChJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLCBJR2VuZXJpY1R5cGUgc3VwZXJjbGFzcywgSUdlbmVyaWNUeXBlW10gc3VwZXJpbnRlcmZhY2VzKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0luZGV4QmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmYTkwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklHZW5lcmljVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSGFuZGxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JUGF0aFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNlYXJjaGFibGVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmZvQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JbmRleFNlYXJjaEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLlN1YlR5cGVTZWFyY2hKb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkFic3RyYWN0SW5kZXhlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLlN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBJbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlciBleHRlbmRzIEhpZXJhcmNoeUJ1aWxkZXIgeworCS8qKgorCSAqIEEgdGVtcG9yYXJ5IGNhY2hlIG9mIGNvbXBpbGF0aW9uIHVuaXRzIHRvIGhhbmRsZXMgdG8gc3BlZWQgaW5mbworCSAqIHRvIGhhbmRsZSB0cmFuc2xhdGlvbiAtIGl0IG9ubHkgY29udGFpbnMgdGhlIGVudHJpZXMKKwkgKiBmb3IgdGhlIHR5cGVzIGluIHRoZSByZWdpb24gKGkuZS4gbm8gc3VwZXJ0eXBlcyBvdXRzaWRlCisJICogdGhlIHJlZ2lvbikuCisJICovCisJcHJvdGVjdGVkIE1hcCBjdVRvSGFuZGxlOworCS8qKgorCSAqIEEgbWFwIGZyb20gY29tcGlsYXRpb24gdW5pdCBoYW5kbGVzIHRvIHdvcmtpbmcgY29waWVzLgorCSAqLworCXByb3RlY3RlZCBNYXAgaGFuZGxlVG9Xb3JraW5nQ29weTsKKworCS8qKgorCSAqIFRoZSBzY29wZSB0aGlzIGhpZXJhcmNoeSBidWlsZGVyIHNob3VsZCByZXN0cmFpbiByZXN1bHRzIHRvLgorCSAqLworCXByb3RlY3RlZCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOworCisJLyoqCisJICogQ2FjaGUgdXNlZCB0byByZWNvcmQgYmluYXJpZXMgcmVjcmVhdGVkIGZyb20gaW5kZXggbWF0Y2hlcworCSAqLworCXByb3RlY3RlZCBNYXAgYmluYXJpZXNGcm9tSW5kZXhNYXRjaGVzOworCQorCS8qKgorCSAqIENvbGxlY3Rpb24gdXNlZCB0byBxdWV1ZSBzdWJ0eXBlIGluZGV4IHF1ZXJpZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWV1ZSB7CisJCXB1YmxpYyBjaGFyW11bXSBuYW1lcyA9IG5ldyBjaGFyWzEwXVtdOworCQlwdWJsaWMgaW50IHN0YXJ0ID0gMDsKKwkJcHVibGljIGludCBlbmQgPSAtMTsKKwkJcHVibGljIHZvaWQgYWRkKGNoYXJbXSBuYW1lKXsKKwkJCWlmICgrK3RoaXMuZW5kID09IHRoaXMubmFtZXMubGVuZ3RoKXsKKwkJCQl0aGlzLmVuZCAtPSB0aGlzLnN0YXJ0OworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5uYW1lcywgdGhpcy5zdGFydCwgdGhpcy5uYW1lcyA9IG5ldyBjaGFyW3RoaXMuZW5kKjJdW10sIDAsIHRoaXMuZW5kKTsKKwkJCQl0aGlzLnN0YXJ0ID0gMDsKKwkJCX0KKwkJCXRoaXMubmFtZXNbdGhpcy5lbmRdID0gbmFtZTsKKwkJfQorCQlwdWJsaWMgY2hhcltdIHJldHJpZXZlKCl7CisJCQlpZiAodGhpcy5zdGFydCA+IHRoaXMuZW5kKSByZXR1cm4gbnVsbDsgLy8gbm9uZQorCQkJCisJCQljaGFyW10gbmFtZSA9IHRoaXMubmFtZXNbdGhpcy5zdGFydCsrXTsKKwkJCWlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpeworCQkJCXRoaXMuc3RhcnQgPSAwOworCQkJCXRoaXMuZW5kID0gLTE7CisJCQl9CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiUXVldWU6XG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IHRoaXMuc3RhcnQ7IGkgPD0gdGhpcy5lbmQ7IGkrKyl7CisJCQkJYnVmZmVyLmFwcGVuZChuYW1lc1tpXSkuYXBwZW5kKCdcbicpOwkJCisJCQl9CisJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKwl9CitwdWJsaWMgSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIoVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXN1cGVyKGhpZXJhcmNoeSk7CisJdGhpcy5jdVRvSGFuZGxlID0gbmV3IEhhc2hNYXAoNSk7CisJdGhpcy5iaW5hcmllc0Zyb21JbmRleE1hdGNoZXMgPSBuZXcgSGFzaE1hcCgxMCk7CisJdGhpcy5zY29wZSA9IHNjb3BlOworfQorLyoqCisgKiBBZGQgdGhlIHR5cGUgaW5mbyBmcm9tIHRoZSBnaXZlbiBoaWVyYXJjaHkgYmluYXJ5IHR5cGUgdG8gdGhlIGdpdmVuIGxpc3Qgb2YgaW5mb3MuCisgKi8KK3ByaXZhdGUgdm9pZCBhZGRJbmZvRnJvbUJpbmFyeUluZGV4TWF0Y2goT3BlbmFibGUgaGFuZGxlLCBIaWVyYXJjaHlCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIEFycmF5TGlzdCBpbmZvcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaW5mb3MuYWRkKGJpbmFyeVR5cGUpOworCXRoaXMuaW5mb1RvSGFuZGxlLnB1dChiaW5hcnlUeXBlLCBoYW5kbGUpOworfQorcHJvdGVjdGVkIHZvaWQgYWRkSW5mb0Zyb21DbG9zZWRFbGVtZW50KE9wZW5hYmxlIGhhbmRsZSxBcnJheUxpc3QgaW5mb3MsQXJyYXlMaXN0IHVuaXRzLFN0cmluZyByZXNvdXJjZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUhpZXJhcmNoeUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChIaWVyYXJjaHlCaW5hcnlUeXBlKSBiaW5hcmllc0Zyb21JbmRleE1hdGNoZXMuZ2V0KHJlc291cmNlUGF0aCk7CisJaWYgKGJpbmFyeVR5cGUgIT0gbnVsbCkgeworCQl0aGlzLmFkZEluZm9Gcm9tQmluYXJ5SW5kZXhNYXRjaChoYW5kbGUsIGJpbmFyeVR5cGUsIGluZm9zKTsKKwl9IGVsc2UgeworCQlzdXBlci5hZGRJbmZvRnJvbUNsb3NlZEVsZW1lbnQoaGFuZGxlLCBpbmZvcywgdW5pdHMsIHJlc291cmNlUGF0aCk7CisJfQorfQorLyoqCisgKiBBZGQgdGhlIHR5cGUgaW5mbyAoYW5kIGl0cyBzaWJibGluZ3MgdHlwZSBpbmZvcykgdG8gdGhlIGdpdmVuIGxpc3Qgb2YgaW5mb3MuCisgKi8KK3ByaXZhdGUgdm9pZCBhZGRJbmZvc0Zyb21UeXBlKElUeXBlIHR5cGUsIEFycmF5TGlzdCBpbmZvcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKHR5cGUuaXNCaW5hcnkoKSkgeworCQkvLyBhZGQgY2xhc3MgZmlsZQorCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSl0eXBlLmdldENsYXNzRmlsZSgpOworCQlpZiAoY2xhc3NGaWxlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkSW5mb0Zyb21PcGVuQ2xhc3NGaWxlKGNsYXNzRmlsZSwgaW5mb3MpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gYWRkIHdob2xlIGN1IChpZiBpdCBpcyBhIHdvcmtpbmcgY29weSwgaXQncyB0eXBlcyBjYW4gYmUgcG90ZW50aWFsIHN1YnR5cGVzKQorCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJaWYgKHVuaXQgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRJbmZvRnJvbU9wZW5DVSh1bml0LCBpbmZvcyk7CisJCX0KKwl9Cit9CitwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNvbXB1dGVTdWJ0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJdHJ5IHsKKwkJLy8gb3B0aW1pemUgYWNjZXNzIHRvIHppcCBmaWxlcyB3aGlsZSBidWlsZGluZyBoaWVyYXJjaHkKKwkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7CisJCQkJCisJCWlmIChjb21wdXRlU3VidHlwZXMpIHsKKwkJCVN0cmluZ1tdIGFsbFBvc3NpYmxlU3VidHlwZXMgPSB0aGlzLmRldGVybWluZVBvc3NpYmxlU3ViVHlwZXMoKTsKKwkJCWlmIChhbGxQb3NzaWJsZVN1YnR5cGVzICE9IG51bGwpIHsKKwkJCQl0aGlzLmhpZXJhcmNoeS5pbml0aWFsaXplKGFsbFBvc3NpYmxlU3VidHlwZXMubGVuZ3RoKTsKKwkJCQlidWlsZEZyb21Qb3RlbnRpYWxTdWJ0eXBlcyhhbGxQb3NzaWJsZVN1YnR5cGVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoMSk7CisJCQl0aGlzLmJ1aWxkU3VwZXJ0eXBlcygpOworCQl9CisJfSBmaW5hbGx5IHsKKwkJbWFuYWdlci5mbHVzaFppcEZpbGVzKCk7CisJfQorfQorcHJpdmF0ZSB2b2lkIGJ1aWxkRm9yUHJvamVjdChKYXZhUHJvamVjdCBwcm9qZWN0LCBBcnJheUxpc3QgaW5mb3MsIEFycmF5TGlzdCB1bml0cywgSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJLy8gY29weSB2ZWN0b3JzIGludG8gYXJyYXlzCisJSUdlbmVyaWNUeXBlW10gZ2VuZXJpY1R5cGVzOworCWludCBpbmZvc1NpemUgPSBpbmZvcy5zaXplKCk7CisJaWYgKGluZm9zU2l6ZSA+IDApIHsKKwkJZ2VuZXJpY1R5cGVzID0gbmV3IElHZW5lcmljVHlwZVtpbmZvc1NpemVdOworCQlpbmZvcy50b0FycmF5KGdlbmVyaWNUeXBlcyk7CisJfSBlbHNlIHsKKwkJZ2VuZXJpY1R5cGVzID0gbmV3IElHZW5lcmljVHlwZVswXTsKKwl9CisJSUNvbXBpbGF0aW9uVW5pdFtdIGNvbXBpbGF0aW9uVW5pdHM7CisJaW50IHVuaXRzU2l6ZSA9IHVuaXRzLnNpemUoKTsKKwlpZiAodW5pdHNTaXplID4gMCkgeworCQljb21waWxhdGlvblVuaXRzID0gbmV3IElDb21waWxhdGlvblVuaXRbdW5pdHNTaXplXTsKKwkJdW5pdHMudG9BcnJheShjb21waWxhdGlvblVuaXRzKTsKKwl9IGVsc2UgeworCQljb21waWxhdGlvblVuaXRzID0gbmV3IElDb21waWxhdGlvblVuaXRbMF07CisJfQorCisJLy8gcmVzb2x2ZQorCWlmIChpbmZvc1NpemUgPiAwIHx8IHVuaXRzU2l6ZSA+IDApIHsKKwkJdGhpcy5zZWFyY2hhYmxlRW52aXJvbm1lbnQgPSAoU2VhcmNoYWJsZUVudmlyb25tZW50KXByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCQlJVHlwZSBmb2N1c1R5cGUgPSB0aGlzLmdldFR5cGUoKTsKKwkJdGhpcy5uYW1lTG9va3VwID0gcHJvamVjdC5nZXROYW1lTG9va3VwKCk7CisJCWJvb2xlYW4gaW5Qcm9qZWN0T2ZGb2N1c1R5cGUgPSBmb2N1c1R5cGUgIT0gbnVsbCAmJiBmb2N1c1R5cGUuZ2V0SmF2YVByb2plY3QoKS5lcXVhbHMocHJvamVjdCk7CisJCXN5bmNocm9uaXplZCh0aGlzLm5hbWVMb29rdXApIHsgLy8gcHJldmVudCAyIGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gbmFtZSBsb29rdXAgd2hpbGUgdGhlIHVuaXRzIHRvIGxvb2sgaW5zaWRlIGFyZSBzZXQKKwkJCWlmIChpblByb2plY3RPZkZvY3VzVHlwZSkgeworCQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgdW5pdFRvTG9va0luc2lkZSA9IGZvY3VzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKKwkJCQlJV29ya2luZ0NvcHlbXSB1bml0c1RvTG9va0luc2lkZTsKKwkJCQlpZiAodW5pdFRvTG9va0luc2lkZSAhPSBudWxsKSB7CisJCQkJCWludCB3Y0xlbmd0aCA9IHdvcmtpbmdDb3BpZXMgPT0gbnVsbCA/IDAgOiB3b3JraW5nQ29waWVzLmxlbmd0aDsKKwkJCQkJaWYgKHdjTGVuZ3RoID09IDApIHsKKwkJCQkJCXVuaXRzVG9Mb29rSW5zaWRlID0gbmV3IElXb3JraW5nQ29weVtdIHt1bml0VG9Mb29rSW5zaWRlfTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXVuaXRzVG9Mb29rSW5zaWRlID0gbmV3IElXb3JraW5nQ29weVt3Y0xlbmd0aCsxXTsKKwkJCQkJCXVuaXRzVG9Mb29rSW5zaWRlWzBdID0gdW5pdFRvTG9va0luc2lkZTsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkod29ya2luZ0NvcGllcywgMCwgdW5pdHNUb0xvb2tJbnNpZGUsIDEsIHdjTGVuZ3RoKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXVuaXRzVG9Mb29rSW5zaWRlID0gd29ya2luZ0NvcGllczsKKwkJCQl9CisJCQkJdGhpcy5uYW1lTG9va3VwLnNldFVuaXRzVG9Mb29rSW5zaWRlKHVuaXRzVG9Mb29rSW5zaWRlKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IAorCQkJCQluZXcgSGllcmFyY2h5UmVzb2x2ZXIodGhpcy5zZWFyY2hhYmxlRW52aXJvbm1lbnQsIEphdmFDb3JlLmdldE9wdGlvbnMoKSwgdGhpcywgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsKKwkJCQlpZiAoZm9jdXNUeXBlICE9IG51bGwpIHsKKwkJCQkJY2hhcltdIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZvY3VzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGZvY3VzVHlwZUJpbmRpbmcgPSB0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnNldEZvY3VzVHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZE5hbWUpKTsKKwkJCQkJaWYgKGZvY3VzVHlwZUJpbmRpbmcgPT0gbnVsbCAKKwkJCQkJCXx8ICghaW5Qcm9qZWN0T2ZGb2N1c1R5cGUgJiYgKGZvY3VzVHlwZUJpbmRpbmcudGFnQml0cyAmIFRhZ0JpdHMuSGllcmFyY2h5SGFzUHJvYmxlbXMpID4gMCkpIHsKKwkJCQkJCS8vIGZvY3VzIHR5cGUgaXMgbm90IHZpc2libGUgaW4gdGhpcyBwcm9qZWN0OiBubyBuZWVkIHRvIGdvIGZ1cnRoZXIKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnJlc29sdmUoZ2VuZXJpY1R5cGVzLCBjb21waWxhdGlvblVuaXRzKTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYgKGluUHJvamVjdE9mRm9jdXNUeXBlKSB7CisJCQkJCXRoaXMubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZShudWxsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIENvbmZpZ3VyZSB0aGlzIHR5cGUgaGllcmFyY2h5IGJhc2VkIG9uIHRoZSBnaXZlbiBwb3RlbnRpYWwgc3VidHlwZXMuCisgKi8KK3ByaXZhdGUgdm9pZCBidWlsZEZyb21Qb3RlbnRpYWxTdWJ0eXBlcyhTdHJpbmdbXSBhbGxQb3RlbnRpYWxTdWJUeXBlcykgeworCUlUeXBlIGZvY3VzVHlwZSA9IHRoaXMuZ2V0VHlwZSgpOworCQkKKwkvLyBzdWJzdGl0dXRlIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggd29ya2luZyBjb3BpZXMKKwlIYXNoTWFwIHdjUGF0aHMgPSBuZXcgSGFzaE1hcCgpOyAvLyBhIG1hcCBmcm9tIHBhdGggdG8gd29ya2luZyBjb3BpZXMKKwlpbnQgd2NMZW5ndGg7CisJSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcyA9IHRoaXMuZ2V0V29raW5nQ29waWVzKCk7CisJaWYgKHdvcmtpbmdDb3BpZXMgIT0gbnVsbCAmJiAod2NMZW5ndGggPSB3b3JraW5nQ29waWVzLmxlbmd0aCkgPiAwKSB7CisJCVN0cmluZ1tdIG5ld1BhdGhzID0gbmV3IFN0cmluZ1t3Y0xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgd2NMZW5ndGg7IGkrKykgeworCQkJSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gd29ya2luZ0NvcGllc1tpXTsKKwkJCVN0cmluZyBwYXRoID0gd29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQl3Y1BhdGhzLnB1dChwYXRoLCB3b3JraW5nQ29weSk7CisJCQluZXdQYXRoc1tpXSA9IHBhdGg7CisJCX0KKwkJaW50IHBvdGVudGlhbFN1YnR5cGVzTGVuZ3RoID0gYWxsUG90ZW50aWFsU3ViVHlwZXMubGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KGFsbFBvdGVudGlhbFN1YlR5cGVzLCAwLCBhbGxQb3RlbnRpYWxTdWJUeXBlcyA9IG5ldyBTdHJpbmdbcG90ZW50aWFsU3VidHlwZXNMZW5ndGgrd2NMZW5ndGhdLCAwLCBwb3RlbnRpYWxTdWJ0eXBlc0xlbmd0aCk7CisJCVN5c3RlbS5hcnJheWNvcHkobmV3UGF0aHMsIDAsIGFsbFBvdGVudGlhbFN1YlR5cGVzLCBwb3RlbnRpYWxTdWJ0eXBlc0xlbmd0aCwgd2NMZW5ndGgpOworCX0KKwkJCQorCWludCBsZW5ndGggPSBhbGxQb3RlbnRpYWxTdWJUeXBlcy5sZW5ndGg7CisKKwkvLyBpbmplY3QgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb2YgdGhlIGZvY3VzIHR5cGUgKHNvIHRoYXQgdHlwZXMgaW4KKwkvLyB0aGlzIGN1IGhhdmUgc3BlY2lhbCB2aXNpYmlsaXR5IHBlcm1pc3Npb24gKHRoaXMgaXMgYWxzbyB1c2VmdWxsCisJLy8gd2hlbiB0aGUgY3UgaXMgYSB3b3JraW5nIGNvcHkpCisJT3BlbmFibGUgZm9jdXNDVSA9IChPcGVuYWJsZSlmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJU3RyaW5nIGZvY3VzUGF0aCA9IG51bGw7CisJaWYgKGZvY3VzQ1UgIT0gbnVsbCkgeworCQl0cnkgeworCQkJSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZTsKKwkJCWlmIChmb2N1c0NVIGluc3RhbmNlb2YgV29ya2luZ0NvcHkpIHsKKwkJCQl1bmRlcmx5aW5nUmVzb3VyY2UgPSAoKFdvcmtpbmdDb3B5KWZvY3VzQ1UpLmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJfSBlbHNlIHsKKwkJCQl1bmRlcmx5aW5nUmVzb3VyY2UgPSBmb2N1c0NVLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJfQorCQkJZm9jdXNQYXRoID0gdW5kZXJseWluZ1Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHR5cGUgZG9lcyBub3QgZXhpc3QKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobGVuZ3RoID4gMCkgeworCQkJU3lzdGVtLmFycmF5Y29weShhbGxQb3RlbnRpYWxTdWJUeXBlcywgMCwgYWxsUG90ZW50aWFsU3ViVHlwZXMgPSBuZXcgU3RyaW5nW2xlbmd0aCsxXSwgMCwgbGVuZ3RoKTsKKwkJCWFsbFBvdGVudGlhbFN1YlR5cGVzW2xlbmd0aF0gPSBmb2N1c1BhdGg7CQorCQl9IGVsc2UgeworCQkJYWxsUG90ZW50aWFsU3ViVHlwZXMgPSBuZXcgU3RyaW5nW10ge2ZvY3VzUGF0aH07CisJCX0KKwkJbGVuZ3RoKys7CisJfQorCQorCS8vIHNvcnQgYnkgcHJvamVjdHMKKwkvKgorCSAqIE5PVEU6IFRvIHdvcmthcm91bmQgcGIgd2l0aCBoaWVyYXJjaHkgcmVzb2x2ZXIgdGhhdCByZXF1ZXN0cyB0b3AgIAorCSAqIGxldmVsIHR5cGVzIGluIHRoZSBwcm9jZXNzIG9mIGNhY2hpbmcgYW4gZW5jbG9zaW5nIHR5cGUsIHRoaXMgbmVlZHMgdG8KKwkgKiBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhhdCB0b3AgbGV2ZWwgdHlwZXMgYXJlIGNhY2hlZAorCSAqIGJlZm9yZSB0aGVpciBpbm5lciB0eXBlcy4KKwkgKi8KKwlVdGlsLnNvcnRSZXZlcnNlT3JkZXIoYWxsUG90ZW50aWFsU3ViVHlwZXMpOworCQorCUFycmF5TGlzdCBpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlBcnJheUxpc3QgdW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkvLyBjcmVhdGUgZWxlbWVudCBpbmZvcyBmb3Igc3VidHlwZXMKKwlIYW5kbGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSGFuZGxlRmFjdG9yeShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOworCUlKYXZhUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IG51bGw7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQl0cnkgeworCQkJU3RyaW5nIHJlc291cmNlUGF0aCA9IGFsbFBvdGVudGlhbFN1YlR5cGVzW2ldOworCQkJCisJCQkvLyBza2lwIGR1cGxpY2F0ZSBwYXRocyAoZS5nLiBpZiBmb2N1cyBwYXRoIHdhcyBpbmplY3RlZCB3aGVuIGl0IHdhcyBhbHJlYWR5IGEgcG90ZW50aWFsIHN1YnR5cGUpCisJCQlpZiAoaSA+IDAgJiYgcmVzb3VyY2VQYXRoLmVxdWFscyhhbGxQb3RlbnRpYWxTdWJUeXBlc1tpLTFdKSkgY29udGludWU7CisJCQkKKwkJCU9wZW5hYmxlIGhhbmRsZTsKKwkJCUlXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJV29ya2luZ0NvcHkpd2NQYXRocy5nZXQocmVzb3VyY2VQYXRoKTsKKwkJCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7CisJCQkJaGFuZGxlID0gKE9wZW5hYmxlKXdvcmtpbmdDb3B5OworCQkJfSBlbHNlIHsKKwkJCQloYW5kbGUgPSAKKwkJCQkJcmVzb3VyY2VQYXRoLmVxdWFscyhmb2N1c1BhdGgpID8gCisJCQkJCQlmb2N1c0NVIDoKKwkJCQkJCWZhY3RvcnkuY3JlYXRlT3BlbmFibGUocmVzb3VyY2VQYXRoKTsKKwkJCQlpZiAoaGFuZGxlID09IG51bGwpIGNvbnRpbnVlOyAvLyBtYXRjaCBpcyBvdXRzaWRlIGNsYXNzcGF0aAorCQkJfQorCQkJCisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGhhbmRsZS5nZXRKYXZhUHJvamVjdCgpOworCQkJaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwpIHsKKwkJCQljdXJyZW50UHJvamVjdCA9IHByb2plY3Q7CisJCQkJaW5mb3MgPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJCXVuaXRzID0gbmV3IEFycmF5TGlzdCg1KTsKKwkJCX0gZWxzZSBpZiAoIWN1cnJlbnRQcm9qZWN0LmVxdWFscyhwcm9qZWN0KSkgeworCQkJCS8vIGJ1aWxkIGN1cnJlbnQgcHJvamVjdAorCQkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgaW5mb3MsIHVuaXRzLCB3b3JraW5nQ29waWVzKTsKKwkJCQljdXJyZW50UHJvamVjdCA9IHByb2plY3Q7CisJCQkJaW5mb3MgPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJCXVuaXRzID0gbmV3IEFycmF5TGlzdCg1KTsKKwkJCX0KKwkJCQorCQkJdGhpcy5hZGRJbmZvRnJvbUVsZW1lbnQoaGFuZGxlLCBpbmZvcywgdW5pdHMsIHJlc291cmNlUGF0aCk7CisJCQkKKwkJCXdvcmtlZCgxKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCQorCS8vIGJ1aWxkIGxhc3QgcHJvamVjdAorCXRyeSB7CisJCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsKSB7CisJCQkvLyBjYXNlIG9mIG5vIHBvdGVudGlhbCBzdWJ0eXBlcworCQkJY3VycmVudFByb2plY3QgPSBmb2N1c1R5cGUuZ2V0SmF2YVByb2plY3QoKTsKKwkJCXRoaXMuYWRkSW5mb3NGcm9tVHlwZShmb2N1c1R5cGUsIGluZm9zKTsKKwkJfQorCQl0aGlzLmJ1aWxkRm9yUHJvamVjdCgoSmF2YVByb2plY3QpY3VycmVudFByb2plY3QsIGluZm9zLCB1bml0cywgd29ya2luZ0NvcGllcyk7CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwl9CisJCisJLy8gQ29tcHV0ZSBoaWVyYXJjaHkgb2YgZm9jdXMgdHlwZSBpZiBub3QgYWxyZWFkeSBkb25lIChjYXNlIG9mIGEgdHlwZSB3aXRoIHBvdGVudGlhbCBzdWJ0eXBlcyB0aGF0IGFyZSBub3QgcmVhbCBzdWJ0eXBlcykKKwlpZiAoIXRoaXMuaGllcmFyY2h5LmNvbnRhaW5zKGZvY3VzVHlwZSkpIHsKKwkJdHJ5IHsKKwkJCWN1cnJlbnRQcm9qZWN0ID0gZm9jdXNUeXBlLmdldEphdmFQcm9qZWN0KCk7CisJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCXVuaXRzID0gbmV3IEFycmF5TGlzdCgpOworCQkJdGhpcy5hZGRJbmZvc0Zyb21UeXBlKGZvY3VzVHlwZSwgaW5mb3MpOworCQkJdGhpcy5idWlsZEZvclByb2plY3QoKEphdmFQcm9qZWN0KWN1cnJlbnRQcm9qZWN0LCBpbmZvcywgdW5pdHMsIHdvcmtpbmdDb3BpZXMpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl9CisJfQorCQorCS8vIEFkZCBmb2N1cyBpZiBub3QgYWxyZWFkeSBpbiAoY2FzZSBvZiBhIHR5cGUgd2l0aCBubyBleHBsaWNpdCBzdXBlciB0eXBlKQorCWlmICghdGhpcy5oaWVyYXJjaHkuY29udGFpbnMoZm9jdXNUeXBlKSkgeworCQl0aGlzLmhpZXJhcmNoeS5hZGRSb290Q2xhc3MoZm9jdXNUeXBlKTsKKwl9Cit9Citwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tUGF0aChPcGVuYWJsZSBoYW5kbGUsU3RyaW5nIG9zUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gc3VwZXIuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbVBhdGgoaGFuZGxlLCBvc1BhdGgpOworCXRoaXMuY3VUb0hhbmRsZS5wdXQodW5pdCwgaGFuZGxlKTsKKwlyZXR1cm4gdW5pdDsKK30KKy8qKgorICogUmV0dXJucyBhbGwgb2YgdGhlIHBvc3NpYmxlIHN1YnR5cGVzIG9mIHRoaXMgdHlwZSBoaWVyYXJjaHkuCisgKiBSZXR1cm5zIG51bGwgaWYgdGhleSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lLgorICovCitwcml2YXRlIFN0cmluZ1tdIGRldGVybWluZVBvc3NpYmxlU3ViVHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKworCWNsYXNzIFBhdGhDb2xsZWN0b3IgaW1wbGVtZW50cyBJUGF0aFJlcXVlc3RvciB7CisJCUhhc2hTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCgxMCk7CisJCXB1YmxpYyB2b2lkIGFjY2VwdFBhdGgoU3RyaW5nIHBhdGgpIHsKKwkJCXBhdGhzLmFkZChwYXRoKTsKKwkJfQorCX0KKwlQYXRoQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBQYXRoQ29sbGVjdG9yKCk7CisJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuaGllcmFyY2h5LmphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOworCQorCXNlYXJjaEFsbFBvc3NpYmxlU3ViVHlwZXMoCisJCXByb2plY3QuZ2V0V29ya3NwYWNlKCksCisJCXRoaXMuZ2V0VHlwZSgpLAorCQl0aGlzLnNjb3BlLAorCQl0aGlzLmJpbmFyaWVzRnJvbUluZGV4TWF0Y2hlcywKKwkJY29sbGVjdG9yLAorCQlJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwKKwkJdGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yKTsKKworCUhhc2hTZXQgcGF0aHMgPSBjb2xsZWN0b3IucGF0aHM7CisJaW50IGxlbmd0aCA9IHBhdGhzLnNpemUoKTsKKwlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXRocy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJcmVzdWx0W2NvdW50KytdID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJfSAKKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBSZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZ2VuZXJpYyB0eXBlIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICovCitwcm90ZWN0ZWQgSVR5cGUgZ2V0SGFuZGxlKElHZW5lcmljVHlwZSBnZW5lcmljVHlwZSkgeworCWlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIEhpZXJhcmNoeVR5cGUpIHsKKwkJSVR5cGUgdHlwZSA9IChJVHlwZSl0aGlzLmluZm9Ub0hhbmRsZS5nZXQoZ2VuZXJpY1R5cGUpOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlIaWVyYXJjaHlUeXBlIGhpZXJhcmNoeVR5cGUgPSAoSGllcmFyY2h5VHlwZSlnZW5lcmljVHlwZTsKKwkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCl0aGlzLmN1VG9IYW5kbGUuZ2V0KGhpZXJhcmNoeVR5cGUub3JpZ2luYXRpbmdVbml0KTsKKworCQkJLy8gY29sbGVjdCBlbmNsb3NpbmcgdHlwZSBuYW1lcworCQkJQXJyYXlMaXN0IGVuY2xvc2luZ1R5cGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCUhpZXJhcmNoeVR5cGUgZW5jbG9zaW5nVHlwZSA9IGhpZXJhcmNoeVR5cGU7CisJCQlkbyB7CisJCQkJZW5jbG9zaW5nVHlwZU5hbWVzLmFkZChlbmNsb3NpbmdUeXBlLm5hbWUpOworCQkJCWVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLmVuY2xvc2luZ1R5cGU7CisJCQl9IHdoaWxlIChlbmNsb3NpbmdUeXBlICE9IG51bGwpOworCQkJaW50IGxlbmd0aCA9IGVuY2xvc2luZ1R5cGVOYW1lcy5zaXplKCk7CisJCQljaGFyW11bXSBzaW1wbGVUeXBlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQllbmNsb3NpbmdUeXBlTmFtZXMudG9BcnJheShzaW1wbGVUeXBlTmFtZXMpOworCisJCQkvLyBidWlsZCBoYW5kbGUKKwkJCXR5cGUgPSB1bml0LmdldFR5cGUobmV3IFN0cmluZyhzaW1wbGVUeXBlTmFtZXNbbGVuZ3RoLTFdKSk7CisJCQlmb3IgKGludCBpID0gbGVuZ3RoLTI7IGkgPj0gMDsgaS0tKSB7CisJCQkJdHlwZSA9IHR5cGUuZ2V0VHlwZShuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lc1tpXSkpOworCQkJfQorCQkJdGhpcy5pbmZvVG9IYW5kbGUucHV0KGdlbmVyaWNUeXBlLCB0eXBlKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9IGVsc2UKKwkJcmV0dXJuIHN1cGVyLmdldEhhbmRsZShnZW5lcmljVHlwZSk7Cit9CisKKy8qKgorICogRmluZCB0aGUgc2V0IG9mIGNhbmRpZGF0ZSBzdWJ0eXBlcyBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhlIHJlcXVlc3RvciBpcyBub3RpZmllZCBvZiBzdXBlciB0eXBlIHJlZmVyZW5jZXMgKHdpdGggYWN0dWFsIHBhdGggb2YKKyAqIGl0cyBvY2N1cnJlbmNlKSBmb3IgYWxsIHR5cGVzIHdoaWNoIGFyZSBwb3RlbnRpYWxseSBpbnZvbHZlZCBpbnNpZGUgYSBwYXJ0aWN1bGFyCisgKiBoaWVyYXJjaHkuCisgKiBUaGUgbWF0Y2ggbG9jYXRvciBpcyBub3QgdXNlZCBoZXJlIHRvIG5hcnJvdyBkb3duIHRoZSByZXN1bHRzLCB0aGUgdHlwZSBoaWVyYXJjaHkKKyAqIHJlc29sdmVyIGlzIHJhdGhlciB1c2VkIHRvIGNvbXB1dGUgdGhlIHdob2xlIGhpZXJhcmNoeSBhdCBvbmNlLgorICovCisKK3B1YmxpYyBzdGF0aWMgdm9pZCBzZWFyY2hBbGxQb3NzaWJsZVN1YlR5cGVzKAorCUlXb3Jrc3BhY2Ugd29ya2JlbmNoLAorCUlUeXBlIHR5cGUsCisJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKKwlmaW5hbCBNYXAgYmluYXJpZXNGcm9tSW5kZXhNYXRjaGVzLAorCWZpbmFsIElQYXRoUmVxdWVzdG9yIHBhdGhSZXF1ZXN0b3IsCisJaW50IHdhaXRpbmdQb2xpY3ksCS8vIFdhaXRVbnRpbFJlYWR5VG9TZWFyY2ggfCBGb3JjZUltbWVkaWF0ZVNlYXJjaCB8IENhbmNlbElmTm90UmVhZHlUb1NlYXJjaAorCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkvKiBlbWJlZCBjb25zdHJ1Y3RzIGluc2lkZSBhcnJheXMgc28gYXMgdG8gcGFzcyB0aGVtIHRvIChpbm5lcikgY29sbGVjdG9yICovCisJZmluYWwgUXVldWUgYXdhaXRpbmdzID0gbmV3IFF1ZXVlKCk7CisJZmluYWwgSGFzaHRhYmxlT2ZPYmplY3QgZm91bmRTdXBlck5hbWVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDUpOworCisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9ICgoSmF2YU1vZGVsTWFuYWdlcilKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisKKwkvKiB1c2UgYSBzcGVjaWFsIGNvbGxlY3RvciB0byBjb2xsZWN0IHBhdGhzIGFuZCBxdWV1ZSBuZXcgc3VidHlwZSBuYW1lcyAqLworCUlJbmRleFNlYXJjaFJlcXVlc3RvciBzZWFyY2hSZXF1ZXN0b3IgPSBuZXcgSW5kZXhTZWFyY2hBZGFwdGVyKCl7CisJCXB1YmxpYyB2b2lkIGFjY2VwdFN1cGVyVHlwZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcXVhbGlmaWNhdGlvbiwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUsIGNoYXIgY2xhc3NPckludGVyZmFjZSwgY2hhcltdIHN1cGVyUXVhbGlmaWNhdGlvbiwgY2hhcltdIHN1cGVyVHlwZU5hbWUsIGNoYXIgc3VwZXJDbGFzc09ySW50ZXJmYWNlLCBpbnQgbW9kaWZpZXJzKSB7CisJCQlwYXRoUmVxdWVzdG9yLmFjY2VwdFBhdGgocmVzb3VyY2VQYXRoKTsKKwkJCWludCBzdWZmaXggPSByZXNvdXJjZVBhdGgudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHN1ZmZpeCAhPSAtMSl7IAorCQkJCUhpZXJhcmNoeUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChIaWVyYXJjaHlCaW5hcnlUeXBlKWJpbmFyaWVzRnJvbUluZGV4TWF0Y2hlcy5nZXQocmVzb3VyY2VQYXRoKTsKKwkJCQlpZiAoYmluYXJ5VHlwZSA9PSBudWxsKXsKKwkJCQkJaWYgKGVuY2xvc2luZ1R5cGVOYW1lID09IElJbmRleENvbnN0YW50cy5PTkVfWkVSTykgeyAvLyBsb2NhbCBvciBhbm9ueW1vdXMgdHlwZQorCQkJCQkJaW50IGxhc3RTbGFzaCA9IHJlc291cmNlUGF0aC5sYXN0SW5kZXhPZignLycpOworCQkJCQkJaWYgKGxhc3RTbGFzaCA9PSAtMSkgcmV0dXJuOworCQkJCQkJaW50IGxhc3REb2xsYXIgPSByZXNvdXJjZVBhdGgubGFzdEluZGV4T2YoJyQnKTsKKwkJCQkJCWlmIChsYXN0RG9sbGFyID09IC0xKSByZXR1cm47CisJCQkJCQllbmNsb3NpbmdUeXBlTmFtZSA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoKzEsIGxhc3REb2xsYXIpLnRvQ2hhckFycmF5KCk7CisJCQkJCQl0eXBlTmFtZSA9IHJlc291cmNlUGF0aC5zdWJzdHJpbmcobGFzdERvbGxhcisxLCBzdWZmaXgpLnRvQ2hhckFycmF5KCk7CisJCQkJCX0KKwkJCQkJYmluYXJ5VHlwZSA9IG5ldyBIaWVyYXJjaHlCaW5hcnlUeXBlKG1vZGlmaWVycywgcXVhbGlmaWNhdGlvbiwgdHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lLCBjbGFzc09ySW50ZXJmYWNlKTsKKwkJCQkJYmluYXJpZXNGcm9tSW5kZXhNYXRjaGVzLnB1dChyZXNvdXJjZVBhdGgsIGJpbmFyeVR5cGUpOworCQkJCX0KKwkJCQliaW5hcnlUeXBlLnJlY29yZFN1cGVyVHlwZShzdXBlclR5cGVOYW1lLCBzdXBlclF1YWxpZmljYXRpb24sIHN1cGVyQ2xhc3NPckludGVyZmFjZSk7CisJCQl9CisJCQlpZiAoIWZvdW5kU3VwZXJOYW1lcy5jb250YWluc0tleSh0eXBlTmFtZSkpeworCQkJCWZvdW5kU3VwZXJOYW1lcy5wdXQodHlwZU5hbWUsIHR5cGVOYW1lKTsKKwkJCQlhd2FpdGluZ3MuYWRkKHR5cGVOYW1lKTsKKwkJCX0KKwkJfQkJCisJfTsKKwkKKwlTdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybihudWxsLCBudWxsLCBJSmF2YVNlYXJjaENvbnN0YW50cy5FWEFDVF9NQVRDSCwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0FTRV9TRU5TSVRJVkUpOworCVN1YlR5cGVTZWFyY2hKb2Igam9iID0gbmV3IFN1YlR5cGVTZWFyY2hKb2IoCisJCQkJcGF0dGVybiwgCisJCQkJc2NvcGUsCisJCQkJdHlwZSwgCisJCQkJSUluZm9Db25zdGFudHMuUGF0aEluZm8sIAorCQkJCXNlYXJjaFJlcXVlc3RvciwgCisJCQkJaW5kZXhNYW5hZ2VyKTsKKwkKKwkvKiBpbml0aWFsaXplIGVudHJ5IHJlc3VsdCBjYWNoZSAqLworCXBhdHRlcm4uZW50cnlSZXN1bHRzID0gbmV3IEhhc2hNYXAoKTsKKwkvKiBpdGVyYXRlIGFsbCBxdWV1ZWQgbmFtZXMgKi8KKwlpbnQgdGlja3MgPSA1MDsKKwlhd2FpdGluZ3MuYWRkKHR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwl3aGlsZSAoYXdhaXRpbmdzLnN0YXJ0IDw9IGF3YWl0aW5ncy5lbmQpeworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCisJCWNoYXJbXSBjdXJyZW50VHlwZU5hbWUgPSBhd2FpdGluZ3MucmV0cmlldmUoKTsKKworCQkvKiBhbGwgc3ViY2xhc3NlcyBvZiBPQkpFQ1QgYXJlIGFjdHVhbGx5IGFsbCB0eXBlcyAqLworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudFR5cGVOYW1lLCBBYnN0cmFjdEluZGV4ZXIuT0JKRUNUKSl7CisJCQljdXJyZW50VHlwZU5hbWUgPSBudWxsOworCQl9CQkJCisJCS8qIHNlYXJjaCBhbGwgaW5kZXggcmVmZXJlbmNlcyB0byBhIGdpdmVuIHN1cGVydHlwZSAqLworCQlwYXR0ZXJuLnN1cGVyU2ltcGxlTmFtZSA9IGN1cnJlbnRUeXBlTmFtZTsKKwkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKAorCQkJam9iLCAKKwkJCXdhaXRpbmdQb2xpY3ksIAorCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIHRpY2tzKSk7CisJCS8qIGluIGNhc2UsIHdlIHNlYXJjaCBhbGwgc3VidHlwZXMsIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KKwkJaWYgKGN1cnJlbnRUeXBlTmFtZSA9PSBudWxsKSBicmVhazsKKwkJdGlja3MgPSB0aWNrcyAvIDI7CisJfQorCS8qIGNsb3NlIGFsbCBjYWNoZWQgaW5kZXggaW5wdXRzICovCisJam9iLmNsb3NlQWxsKCk7CisJLyogZmx1c2ggZW50cnkgcmVzdWx0IGNhY2hlICovCisJcGF0dGVybi5lbnRyeVJlc3VsdHMgPSBudWxsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Yjk5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuT3BlbmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworcHVibGljIGNsYXNzIFJlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlciBleHRlbmRzIEhpZXJhcmNoeUJ1aWxkZXIgeworCQorCXB1YmxpYyBSZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIoVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJCisJCXN1cGVyKGhpZXJhcmNoeSk7CisJfQorCQorcHVibGljIHZvaWQgYnVpbGQoYm9vbGVhbiBjb21wdXRlU3VidHlwZXMpIHsKKwkJCisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJdHJ5IHsKKwkJLy8gb3B0aW1pemUgYWNjZXNzIHRvIHppcCBmaWxlcyB3aGlsZSBidWlsZGluZyBoaWVyYXJjaHkKKwkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7CisJCQkJCisJCWlmICh0aGlzLmhpZXJhcmNoeS50eXBlID09IG51bGwgfHwgY29tcHV0ZVN1YnR5cGVzKSB7CisJCQlBcnJheUxpc3QgYWxsVHlwZXNJblJlZ2lvbiA9IGRldGVybWluZVR5cGVzSW5SZWdpb24oKTsKKwkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoYWxsVHlwZXNJblJlZ2lvbi5zaXplKCkpOworCQkJY3JlYXRlVHlwZUhpZXJhcmNoeUJhc2VkT25SZWdpb24oYWxsVHlwZXNJblJlZ2lvbik7CisJCQkoKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSl0aGlzLmhpZXJhcmNoeSkucHJ1bmVEZWFkQnJhbmNoZXMoKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoMSk7CisJCQl0aGlzLmJ1aWxkU3VwZXJ0eXBlcygpOworCQl9CisJfSBmaW5hbGx5IHsKKwkJbWFuYWdlci5mbHVzaFppcEZpbGVzKCk7CisJfQorfQorLyoqCisgKiBDb25maWd1cmUgdGhpcyB0eXBlIGhpZXJhcmNoeSB0aGF0IGlzIGJhc2VkIG9uIGEgcmVnaW9uLgorICovCitwcml2YXRlIHZvaWQgY3JlYXRlVHlwZUhpZXJhcmNoeUJhc2VkT25SZWdpb24oQXJyYXlMaXN0IGFsbFR5cGVzSW5SZWdpb24pIHsKKwkKKwlpbnQgc2l6ZSA9IGFsbFR5cGVzSW5SZWdpb24uc2l6ZSgpOworCWlmIChzaXplICE9IDApIHsKKwkJdGhpcy5pbmZvVG9IYW5kbGUgPSBuZXcgSGFzaE1hcChzaXplKTsKKwl9CisJSVR5cGVbXSB0eXBlcyA9IG5ldyBJVHlwZVtzaXplXTsKKwlhbGxUeXBlc0luUmVnaW9uLnRvQXJyYXkodHlwZXMpOworCisJLyoKKwkgKiBOT1RFOiBUbyB3b3JrYXJvdW5kIHBiIHdpdGggaGllcmFyY2h5IHJlc29sdmVyIHRoYXQgcmVxdWVzdHMgdG9wICAKKwkgKiBsZXZlbCB0eXBlcyBpbiB0aGUgcHJvY2VzcyBvZiBjYWNoaW5nIGFuIGVuY2xvc2luZyB0eXBlLCB0aGlzIG5lZWRzIHRvCisJICogYmUgc29ydGVkIGluIHJldmVyc2UgYWxwaGFiZXRpY2FsIG9yZGVyIHNvIHRoYXQgdG9wIGxldmVsIHR5cGVzIGFyZSBjYWNoZWQKKwkgKiBiZWZvcmUgdGhlaXIgaW5uZXIgdHlwZXMuCisJICovCisJVXRpbC5zb3J0KAorCQl0eXBlcywKKwkJbmV3IFV0aWwuQ29tcGFyZXIoKSB7CisJCQkvKioKKwkJCSAqIEBzZWUgQ29tcGFyZXIjY29tcGFyZShPYmplY3QsIE9iamVjdCkKKwkJCSAqLworCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgeworCQkJCXJldHVybiAtICgoSUphdmFFbGVtZW50KWEpLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkuY29tcGFyZVRvKCgoSUphdmFFbGVtZW50KWIpLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOworCQkJfQorCQl9CisJKTsKKworCS8vIGNvbGxlY3QgaW5mb3MgYW5kIGNvbXBpbGF0aW9uIHVuaXRzCisJQXJyYXlMaXN0IGluZm9zID0gbmV3IEFycmF5TGlzdCgpOworCUFycmF5TGlzdCB1bml0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwl0eXBlcyA6IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXRyeSB7CisJCQlJVHlwZSB0eXBlID0gdHlwZXNbaV07CisJCQl0aGlzLmFkZEluZm9Gcm9tRWxlbWVudCgoT3BlbmFibGUpdHlwZS5nZXRPcGVuYWJsZSgpLCBpbmZvcywgdW5pdHMsIHR5cGUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOworCQkJd29ya2VkKDEpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQljb250aW51ZSB0eXBlczsKKwkJfQorCX0KKworCS8vIGNvcHkgdmVjdG9ycyBpbnRvIGFycmF5cworCUlHZW5lcmljVHlwZVtdIGdlbmVyaWNUeXBlczsKKwlpbnQgaW5mb3NTaXplID0gaW5mb3Muc2l6ZSgpOworCWlmIChpbmZvc1NpemUgPiAwKSB7CisJCWdlbmVyaWNUeXBlcyA9IG5ldyBJR2VuZXJpY1R5cGVbaW5mb3NTaXplXTsKKwkJaW5mb3MudG9BcnJheShnZW5lcmljVHlwZXMpOworCX0gZWxzZSB7CisJCWdlbmVyaWNUeXBlcyA9IG5ldyBJR2VuZXJpY1R5cGVbMF07CisJfQorCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdFtdIGNvbXBpbGF0aW9uVW5pdHM7CisJaW50IHVuaXRzU2l6ZSA9IHVuaXRzLnNpemUoKTsKKwlpZiAodW5pdHNTaXplID4gMCkgeworCQljb21waWxhdGlvblVuaXRzID0gbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdFt1bml0c1NpemVdOworCQl1bml0cy50b0FycmF5KGNvbXBpbGF0aW9uVW5pdHMpOworCX0gZWxzZSB7CisJCWNvbXBpbGF0aW9uVW5pdHMgPSBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0WzBdOworCX0KKworCS8vIHJlc29sdmUKKwlpZiAoaW5mb3NTaXplID4gMCB8fCB1bml0c1NpemUgPiAwKSB7CisJCUlUeXBlIGZvY3VzVHlwZSA9IHRoaXMuZ2V0VHlwZSgpOworCQlDb21waWxhdGlvblVuaXQgdW5pdFRvTG9va0luc2lkZSA9IG51bGw7CisJCWlmIChmb2N1c1R5cGUgIT0gbnVsbCkgeworCQkJdW5pdFRvTG9va0luc2lkZSA9IChDb21waWxhdGlvblVuaXQpZm9jdXNUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQl9CisJCWlmICh0aGlzLm5hbWVMb29rdXAgIT0gbnVsbCAmJiB1bml0VG9Mb29rSW5zaWRlICE9IG51bGwpIHsKKwkJCXN5bmNocm9uaXplZCh0aGlzLm5hbWVMb29rdXApIHsgLy8gcHJldmVudCAyIGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gbmFtZSBsb29rdXAgd2hpbGUgdGhlIHdvcmtpbmcgY29waWVzIGFyZSBzZXQKKwkJCQl0cnkgeworCQkJCQluYW1lTG9va3VwLnNldFVuaXRzVG9Mb29rSW5zaWRlKG5ldyBJV29ya2luZ0NvcHlbXSB7dW5pdFRvTG9va0luc2lkZX0pOworCQkJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnJlc29sdmUoZ2VuZXJpY1R5cGVzLCBjb21waWxhdGlvblVuaXRzKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQluYW1lTG9va3VwLnNldFVuaXRzVG9Mb29rSW5zaWRlKG51bGwpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZShnZW5lcmljVHlwZXMsIGNvbXBpbGF0aW9uVW5pdHMpOworCQl9CisJfQorfQorCQorCS8qKgorCSAqIFJldHVybnMgYWxsIG9mIHRoZSB0eXBlcyBkZWZpbmVkIGluIHRoZSByZWdpb24gb2YgdGhpcyB0eXBlIGhpZXJhcmNoeS4KKwkgKi8KKwlwcml2YXRlIEFycmF5TGlzdCBkZXRlcm1pbmVUeXBlc0luUmVnaW9uKCkgeworCisJCUFycmF5TGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJSUphdmFFbGVtZW50W10gcm9vdHMgPQorCQkJKChSZWdpb25CYXNlZFR5cGVIaWVyYXJjaHkpIHRoaXMuaGllcmFyY2h5KS5mUmVnaW9uLmdldEVsZW1lbnRzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUphdmFFbGVtZW50IHJvb3QgPSByb290c1tpXTsKKwkJCQlzd2l0Y2ggKHJvb3QuZ2V0RWxlbWVudFR5cGUoKSkgeworCQkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgorCQkJCQkJaW5qZWN0QWxsVHlwZXNGb3JKYXZhUHJvamVjdCgoSUphdmFQcm9qZWN0KSByb290LCB0eXBlcyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKKwkJCQkJCWluamVjdEFsbFR5cGVzRm9yUGFja2FnZUZyYWdtZW50Um9vdCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHJvb3QsIHR5cGVzKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCQkJCWluamVjdEFsbFR5cGVzRm9yUGFja2FnZUZyYWdtZW50KChJUGFja2FnZUZyYWdtZW50KSByb290LCB0eXBlcyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRSA6CisJCQkJCQl0eXBlcy5hZGQoKChJQ2xhc3NGaWxlKSByb290KS5nZXRUeXBlKCkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJCQkJSVR5cGVbXSBjdVR5cGVzID0gKChJQ29tcGlsYXRpb25Vbml0KSByb290KS5nZXRBbGxUeXBlcygpOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdVR5cGVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJdHlwZXMuYWRkKGN1VHlwZXNbal0pOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEUgOgorCQkJCQkJdHlwZXMuYWRkKHJvb3QpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQgOgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBqdXN0IGNvbnRpbnVlCisJCQl9CisJCX0KKwkJcmV0dXJuIHR5cGVzOworCX0KKwkKKwkvKioKKwkgKiBBZGRzIGFsbCBvZiB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBqYXZhIHByb2plY3QgdG8gdGhlCisJICogbGlzdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5qZWN0QWxsVHlwZXNGb3JKYXZhUHJvamVjdCgKKwkJSUphdmFQcm9qZWN0IHByb2plY3QsCisJCUFycmF5TGlzdCB0eXBlcykgeworCQl0cnkgeworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBkZXZQYXRoUm9vdHMgPQorCQkJCSgoSmF2YVByb2plY3QpIHByb2plY3QpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisJCQlpZiAoZGV2UGF0aFJvb3RzID09IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGRldlBhdGhSb290cy5sZW5ndGg7IGorKykgeworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBkZXZQYXRoUm9vdHNbal07CisJCQkJaW5qZWN0QWxsVHlwZXNGb3JQYWNrYWdlRnJhZ21lbnRSb290KHJvb3QsIHR5cGVzKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBZGRzIGFsbCBvZiB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHRvIHRoZQorCSAqIGxpc3QuCisJICovCisJcHJpdmF0ZSB2b2lkIGluamVjdEFsbFR5cGVzRm9yUGFja2FnZUZyYWdtZW50KAorCQlJUGFja2FnZUZyYWdtZW50IHBhY2tGcmFnLAorCQlBcnJheUxpc3QgdHlwZXMpIHsKKwkJCQorCQl0cnkgeworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja0ZyYWcuZ2V0UGFyZW50KCk7CisJCQlpbnQga2luZCA9IHJvb3QuZ2V0S2luZCgpOworCQkJaWYgKGtpbmQgIT0gMCkgeworCQkJCWJvb2xlYW4gaXNTb3VyY2VQYWNrYWdlRnJhZ21lbnQgPSAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSk7CisJCQkJaWYgKGlzU291cmNlUGFja2FnZUZyYWdtZW50KSB7CisJCQkJCUlDb21waWxhdGlvblVuaXRbXSB0eXBlQ29udGFpbmVycyA9IHBhY2tGcmFnLmdldENvbXBpbGF0aW9uVW5pdHMoKTsKKwkJCQkJaW5qZWN0QWxsVHlwZXNGb3JUeXBlQ29udGFpbmVycyh0eXBlQ29udGFpbmVycywgdHlwZXMpOworCQkJCX0gZWxzZSB7CisJCQkJCUlDbGFzc0ZpbGVbXSB0eXBlQ29udGFpbmVycyA9IHBhY2tGcmFnLmdldENsYXNzRmlsZXMoKTsKKwkJCQkJaW5qZWN0QWxsVHlwZXNGb3JUeXBlQ29udGFpbmVycyh0eXBlQ29udGFpbmVycywgdHlwZXMpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBZGRzIGFsbCBvZiB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdG8gdGhlCisJICogbGlzdC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5qZWN0QWxsVHlwZXNGb3JQYWNrYWdlRnJhZ21lbnRSb290KAorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290LAorCQlBcnJheUxpc3QgdHlwZXMpIHsKKwkJdHJ5IHsKKwkJCUlKYXZhRWxlbWVudFtdIHBhY2tGcmFncyA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKKwkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFja0ZyYWdzLmxlbmd0aDsgaysrKSB7CisJCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrRnJhZyA9IChJUGFja2FnZUZyYWdtZW50KSBwYWNrRnJhZ3Nba107CisJCQkJaW5qZWN0QWxsVHlwZXNGb3JQYWNrYWdlRnJhZ21lbnQocGFja0ZyYWcsIHR5cGVzKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBBZGRzIGFsbCBvZiB0aGUgdHlwZXMgZGVmaW5lZCB3aXRoaW4gdGhlIHR5cGUgY29udGFpbmVycyAoSUNsYXNzRmlsZSkuCisJICovCisJcHJpdmF0ZSB2b2lkIGluamVjdEFsbFR5cGVzRm9yVHlwZUNvbnRhaW5lcnMoCisJCUlDbGFzc0ZpbGVbXSBjb250YWluZXJzLAorCQlBcnJheUxpc3QgdHlwZXMpIHsKKwkJCQorCQl0cnkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUNsYXNzRmlsZSBjZiA9IGNvbnRhaW5lcnNbaV07CisJCQkJdHlwZXMuYWRkKGNmLmdldFR5cGUoKSk7CisJCQkJdGhpcy53b3JrZWQoMSk7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisJCisJLyoqCisJICogQWRkcyBhbGwgb2YgdGhlIHR5cGVzIGRlZmluZWQgd2l0aGluIHRoZSB0eXBlIGNvbnRhaW5lcnMgKElDb21waWxhdGlvblVuaXQpLgorCSAqLworCXByaXZhdGUgdm9pZCBpbmplY3RBbGxUeXBlc0ZvclR5cGVDb250YWluZXJzKAorCQlJQ29tcGlsYXRpb25Vbml0W10gY29udGFpbmVycywKKwkJQXJyYXlMaXN0IHR5cGVzKSB7CisJCQkKKwkJdHJ5IHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7IGkrKykgeworCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjb250YWluZXJzW2ldOworCQkJCUlUeXBlW10gY3VUeXBlcyA9IGN1LmdldEFsbFR5cGVzKCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdVR5cGVzLmxlbmd0aDsgaisrKSB7CisJCQkJCXR5cGVzLmFkZChjdVR5cGVzW2pdKTsKKwkJCQl9CisJCQkJdGhpcy53b3JrZWQoMSk7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDZkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVHlwZVZlY3RvcjsKKworcHVibGljIGNsYXNzIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSBleHRlbmRzIFR5cGVIaWVyYXJjaHkgeworCS8qKgorCSAqIFRoZSByZWdpb24gb2YgdHlwZXMgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBoaWVyYXJjaHkKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlZ2lvbiBmUmVnaW9uOworCisJLyoqCisJICogVGhlIEphdmEgUHJvamVjdCBpbiB3aGljaCB0aGUgaGllcmFyY2h5IGlzIGJlaW5nIGJ1aWx0IC0gdGhpcworCSAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IChpLmUuIGNsYXNzcGF0aCBhbmQgbmFtZWxvb2t1cCBydWxlcykKKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZQcm9qZWN0OworLyoqCisgKiBDcmVhdGVzIGEgVHlwZUhpZXJhcmNoeSBvbiB0aGUgdHlwZXMgaW4gdGhlIHNwZWNpZmllZCByZWdpb24sCisgKiB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdCBmb3IgYSBuYW1lIGxvb2t1cCBjb250ZW54dC4gSWYgYSBzcGVjaWZpYworICogdHlwZSBpcyBhbHNvIHNwZWNpZmllZCwgdGhlIHR5cGUgaGllcmFyY2h5IGlzIHBydW5lZCB0byBvbmx5CisgKiBjb250YWluIHRoZSBicmFuY2ggaW5jbHVkaW5nIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAqLworcHVibGljIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeShJUmVnaW9uIHJlZ2lvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElUeXBlIHR5cGUsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlzdXBlcih0eXBlLCBudWxsLCBjb21wdXRlU3VidHlwZXMpOworCWZSZWdpb24gPSByZWdpb247CisJZlByb2plY3QgPSBwcm9qZWN0OworfQorLyoqCisgKiBBY3RpdmF0ZXMgdGhpcyBoaWVyYXJjaHkgZm9yIGNoYW5nZSBsaXN0ZW5lcnMKKyAqLworcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoKSB7CisJc3VwZXIuYWN0aXZhdGUoKTsKKwlJSmF2YUVsZW1lbnRbXSByb290cyA9IGZSZWdpb24uZ2V0RWxlbWVudHMoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisJCUlKYXZhRWxlbWVudCByb290ID0gcm9vdHNbaV07CisJCWlmIChyb290IGluc3RhbmNlb2YgSU9wZW5hYmxlKSB7CisJCQl0aGlzLmZpbGVzLnB1dChyb290LCByb290KTsKKwkJfSBlbHNlIHsKKwkJCU9wZW5hYmxlIG8gPSAoT3BlbmFibGUpICgoSmF2YUVsZW1lbnQpIHJvb3QpLmdldE9wZW5hYmxlUGFyZW50KCk7CisJCQlpZiAobyAhPSBudWxsKSB7CisJCQkJdGhpcy5maWxlcy5wdXQobywgbyk7CisJCQl9CisJCX0KKwkJY2hlY2tDYW5jZWxlZCgpOworCX0KK30KKy8qKgorICogQ29tcHV0ZSB0aGlzIHR5cGUgaGllcmFyY2h5LgorICovCitwcm90ZWN0ZWQgdm9pZCBjb21wdXRlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJSGllcmFyY2h5QnVpbGRlciBidWlsZGVyID0gbmV3IFJlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlcih0aGlzKTsKKwlidWlsZGVyLmJ1aWxkKHRoaXMuY29tcHV0ZVN1YnR5cGVzKTsKK30KK3Byb3RlY3RlZCB2b2lkIGRlc3Ryb3koKSB7CisJZlJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKwlzdXBlci5kZXN0cm95KCk7CQorfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RlZEJ5T3BlbmFibGUoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJLy8gaWdub3JlIGNoYW5nZXMgdG8gd29ya2luZyBjb3BpZXMKKwlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCAmJiAoKENvbXBpbGF0aW9uVW5pdCllbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIGlmIG5vIGZvY3VzLCBoaWVyYXJjaHkgaXMgYWZmZWN0ZWQgaWYgdGhlIGVsZW1lbnQgaXMgcGFydCBvZiB0aGUgcmVnaW9uCisJaWYgKHRoaXMudHlwZSA9PSBudWxsKSB7CisJCXJldHVybiBmUmVnaW9uLmNvbnRhaW5zKGVsZW1lbnQpOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5pc0FmZmVjdGVkQnlPcGVuYWJsZShkZWx0YSwgZWxlbWVudCk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRoZSBqYXZhIHByb2plY3QgdGhpcyBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgaW4uCisgKi8KK3B1YmxpYyBJSmF2YVByb2plY3QgamF2YVByb2plY3QoKSB7CisJcmV0dXJuIGZQcm9qZWN0OworfQorcHVibGljIHZvaWQgcHJ1bmVEZWFkQnJhbmNoZXMoKSB7CisJdGhpcy5wcnVuZURlYWRCcmFuY2hlcyh0aGlzLmdldFJvb3RDbGFzc2VzKCksIGZhbHNlKTsKK30KK3ByaXZhdGUgdm9pZCBwcnVuZURlYWRCcmFuY2hlcyhJVHlwZVtdIHR5cGVzLCBib29sZWFuIHN1cGVySW5SZWdpb24pIHsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSVR5cGUgdHlwZSA9IHR5cGVzW2ldOworCQlpZiAoZlJlZ2lvbi5jb250YWlucyh0eXBlKSkgeworCQkJVHlwZVZlY3RvciBzdWJ0eXBlcyA9IChUeXBlVmVjdG9yKXRoaXMudHlwZVRvU3VidHlwZXMuZ2V0KHR5cGUpOworCQkJaWYgKHN1YnR5cGVzICE9IG51bGwpIHsKKwkJCQl0aGlzLnBydW5lRGVhZEJyYW5jaGVzKHN1YnR5cGVzLmNvcHkoKS5lbGVtZW50cygpLCB0cnVlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdXBlckluUmVnaW9uKSB7CisJCQkJdGhpcy5yZW1vdmVUeXBlKHR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQlUeXBlVmVjdG9yIHN1YnR5cGVzID0gKFR5cGVWZWN0b3IpdGhpcy50eXBlVG9TdWJ0eXBlcy5nZXQodHlwZSk7CisJCQkJaWYgKHN1YnR5cGVzICE9IG51bGwpIHsKKwkJCQkJdGhpcy5wcnVuZURlYWRCcmFuY2hlcyhzdWJ0eXBlcy5jb3B5KCkuZWxlbWVudHMoKSwgZmFsc2UpOworCQkJCX0KKwkJCQlzdWJ0eXBlcyA9IChUeXBlVmVjdG9yKXRoaXMudHlwZVRvU3VidHlwZXMuZ2V0KHR5cGUpOworCQkJCWlmIChzdWJ0eXBlcyA9PSBudWxsIHx8IHN1YnR5cGVzLnNpemUgPT0gMCkgeworCQkJCQl0aGlzLnJlbW92ZVR5cGUodHlwZSk7CisJCQkJfSAKKwkJCX0KKwkJfQorCX0KK30KKy8qKgorICogUmVtb3ZlcyBhbGwgdGhlIHN1YnR5cGVzIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIHR5cGUgaGllcmFyY2h5LAorICogcmVtb3ZlcyBpdHMgc3VwZXJjbGFzcyBlbnRyeSBhbmQgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlcyBmcm9tIGl0cyBzdXBlciB0eXBlcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVHlwZShJVHlwZSB0eXBlKSB7CisJSVR5cGVbXSBzdWJ0eXBlcyA9IHRoaXMuZ2V0U3VidHlwZXModHlwZSk7CisJdGhpcy50eXBlVG9TdWJ0eXBlcy5yZW1vdmUodHlwZSk7CisJaWYgKHN1YnR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHN1YnR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLnJlbW92ZVR5cGUoc3VidHlwZXNbaV0pOworCQl9CisJfQorCUlUeXBlIHN1cGVyY2xhc3MgPSAoSVR5cGUpdGhpcy5jbGFzc1RvU3VwZXJjbGFzcy5yZW1vdmUodHlwZSk7CisJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQlUeXBlVmVjdG9yIHR5cGVzID0gKFR5cGVWZWN0b3IpdGhpcy50eXBlVG9TdWJ0eXBlcy5nZXQoc3VwZXJjbGFzcyk7CisJCWlmICh0eXBlcyAhPSBudWxsKSB0eXBlcy5yZW1vdmUodHlwZSk7CisJfQorCUlUeXBlW10gc3VwZXJpbnRlcmZhY2VzID0gKElUeXBlW10pdGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMucmVtb3ZlKHR5cGUpOworCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3VwZXJpbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJVHlwZSBzdXBlcmludGVyZmFjZSA9IHN1cGVyaW50ZXJmYWNlc1tpXTsKKwkJCVR5cGVWZWN0b3IgdHlwZXMgPSAoVHlwZVZlY3Rvcil0aGlzLnR5cGVUb1N1YnR5cGVzLmdldChzdXBlcmludGVyZmFjZSk7CisJCQlpZiAodHlwZXMgIT0gbnVsbCkgdHlwZXMucmVtb3ZlKHR5cGUpOworCQl9CisJfQorfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvVHlwZUhpZXJhcmNoeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDMyZWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YQpAQCAtMCwwICsxLDEzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JbXBvcnRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5SZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVHlwZVZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworCisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIGNsYXNzIFR5cGVIaWVyYXJjaHkgaW1wbGVtZW50cyBJVHlwZUhpZXJhcmNoeSwgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCS8qKgorCSAqIFRoZSB0eXBlIHRoZSBoaWVyYXJjaHkgd2FzIHNwZWNpZmljYWxseSBjb21wdXRlZCBmb3IsCisJICogcG9zc2libHkgbnVsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgSVR5cGUgdHlwZTsKKworCXByb3RlY3RlZCBNYXAgY2xhc3NUb1N1cGVyY2xhc3M7CisJcHJvdGVjdGVkIE1hcCB0eXBlVG9TdXBlckludGVyZmFjZXM7CisJcHJvdGVjdGVkIE1hcCB0eXBlVG9TdWJ0eXBlczsKKwlwcm90ZWN0ZWQgTWFwIHR5cGVGbGFnczsKKwlwcm90ZWN0ZWQgVHlwZVZlY3RvciByb290Q2xhc3NlcyA9IG5ldyBUeXBlVmVjdG9yKCk7CisJcHJvdGVjdGVkIEFycmF5TGlzdCBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgxMCk7CisJcHVibGljIEFycmF5TGlzdCBtaXNzaW5nVHlwZXMgPSBuZXcgQXJyYXlMaXN0KDQpOworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVR5cGVbXSBOT19UWVBFID0gbmV3IElUeXBlWzBdOworCQorCS8qKgorCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZCB0b28uCisJICovCisJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKKworCS8qKgorCSAqIENoYW5nZSBsaXN0ZW5lcnMgLSBudWxsIGlmIG5vIG9uZSBpcyBsaXN0ZW5pbmcuCisJICovCisJcHJvdGVjdGVkIEFycmF5TGlzdCBjaGFuZ2VMaXN0ZW5lcnMgPSBudWxsOworCisJLyoqCisJICogQSBzZXQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCBjbGFzcworCSAqIGZpbGVzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaW4gdGhpcyBoaWVyYXJjaHkuIE51bGwgaWYKKwkgKiBub3QgYWN0aXZhdGVkLgorCSAqLworCXByb3RlY3RlZCBNYXAgZmlsZXMgPSBudWxsOworCisJLyoqCisJICogQSByZWdpb24gZGVzY3JpYmluZyB0aGUgcGFja2FnZXMgY29uc2lkZXJlZCBieSB0aGlzCisJICogaGllcmFyY2h5LiBOdWxsIGlmIG5vdCBhY3RpdmF0ZWQuCisJICovCisJcHJvdGVjdGVkIFJlZ2lvbiBwYWNrYWdlUmVnaW9uID0gbnVsbDsKKworCS8qKgorCSAqIEEgcmVnaW9uIGRlc2NyaWJpbmcgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgY29uc2lkZXJlZCBieSB0aGlzCisJICogaGllcmFyY2h5LiBOdWxsIGlmIG5vdCBhY3RpdmF0ZWQuCisJICovCisJcHJvdGVjdGVkIFJlZ2lvbiByb290UmVnaW9uID0gbnVsbDsKKwkKKwkvKioKKwkgKiBBIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBwcm9qZWN0cyBjb25zaWRlcmVkIGJ5IHRoaXMKKwkgKiBoaWVyYXJjaHkuIE51bGwgaWYgbm90IGFjdGl2YXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgUmVnaW9uIHByb2plY3RSZWdpb24gPSBudWxsOworCisJLyoqCisJICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBoaWVyYXJjaHkgaXMgYWN0aXZlbHkgdHJhY2tpbmcgY2hhbmdlcworCSAqIGluIHRoZSBKYXZhIE1vZGVsLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzQWN0aXZhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaGllcmFyY2h5IGV4aXN0cworCSAqCisJICogZml4IGZvciAxRlc2N1BBCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKwkKKwkvKioKKwkgKiBXaGV0aGVyIHRoaXMgaGllcmFyY2h5IHNob3VsZCBjb250YWlucyBzdWJ0eXBlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlU3VidHlwZXM7CisKKwkvKioKKwkgKiBUaGUgc2NvcGUgdGhpcyBoaWVyYXJjaHkgc2hvdWxkIHJlc3RyYWluIGl0c2VmIGluLgorCSAqLworCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU7CisKKy8qKgorICogQ3JlYXRlcyBhIFR5cGVIaWVyYXJjaHkgb24gdGhlIGdpdmVuIHR5cGUuCisgKi8KK3B1YmxpYyBUeXBlSGllcmFyY2h5KElUeXBlIHR5cGUsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMuY29tcHV0ZVN1YnR5cGVzID0gY29tcHV0ZVN1YnR5cGVzOworCXRoaXMuc2NvcGUgPSBzY29wZTsKK30KKy8qKgorICogQWN0aXZhdGVzIHRoaXMgaGllcmFyY2h5IGZvciBjaGFuZ2UgbGlzdGVuZXJzCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFjdGl2YXRlKCkgeworCisJLy8gZGV0ZXJtaW5lIG15IGZpbGUsIHBhY2thZ2UsIHJvb3QsICYgcHJvamVjdCByZWdpb25zLgorCXRoaXMuZmlsZXMgPSBuZXcgSGFzaE1hcCg1KTsKKwl0aGlzLnByb2plY3RSZWdpb24gPSBuZXcgUmVnaW9uKCk7CisJdGhpcy5wYWNrYWdlUmVnaW9uID0gbmV3IFJlZ2lvbigpOworCXRoaXMucm9vdFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKwlJVHlwZVtdIHR5cGVzID0gZ2V0QWxsVHlwZXMoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCUlUeXBlIHR5cGUgPSB0eXBlc1tpXTsKKwkJT3BlbmFibGUgbyA9IChPcGVuYWJsZSkgKChKYXZhRWxlbWVudCkgdHlwZSkuZ2V0T3BlbmFibGVQYXJlbnQoKTsKKwkJaWYgKG8gIT0gbnVsbCkgeworCQkJdGhpcy5maWxlcy5wdXQobywgbyk7CisJCX0KKwkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpOworCQl0aGlzLnBhY2thZ2VSZWdpb24uYWRkKHBrZyk7CisJCXRoaXMucm9vdFJlZ2lvbi5hZGQocGtnLmdldFBhcmVudCgpKTsKKwkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0eXBlLmdldEphdmFQcm9qZWN0KCk7CisJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRoaXMucHJvamVjdFJlZ2lvbi5hZGQocHJvamVjdCk7CisJCX0KKwkJY2hlY2tDYW5jZWxlZCgpOworCX0KKwlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOworCXRoaXMuaXNBY3RpdmF0ZWQgPSB0cnVlOworfQorLyoqCisgKiBBZGRzIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gdG8gdGhlIGxpc3QgaWYgdGhlCisgKiBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgorICovCitwcml2YXRlIHZvaWQgYWRkQWxsQ2hlY2tpbmdEdXBsaWNhdGVzKEFycmF5TGlzdCBsaXN0LCBJVHlwZVtdIGNvbGxlY3Rpb24pIHsKKwlmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKKwkJSVR5cGUgZWxlbWVudCA9IGNvbGxlY3Rpb25baV07CisJCWlmICghbGlzdC5jb250YWlucyhlbGVtZW50KSkgeworCQkJbGlzdC5hZGQoZWxlbWVudCk7CisJCX0KKwl9Cit9CisvKioKKyAqIEFkZHMgdGhlIHR5cGUgdG8gdGhlIGNvbGxlY3Rpb24gb2YgaW50ZXJmYWNlcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJmYWNlKElUeXBlIHR5cGUpIHsKKwl0aGlzLmludGVyZmFjZXMuYWRkKHR5cGUpOworfQorLyoqCisgKiBBZGRzIHRoZSB0eXBlIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJvb3QgY2xhc3NlcworICogaWYgdGhlIGNsYXNzZXMgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgY29sbGVjdGlvbi4KKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkUm9vdENsYXNzKElUeXBlIHR5cGUpIHsKKwlpZiAodGhpcy5yb290Q2xhc3Nlcy5jb250YWlucyh0eXBlKSkgcmV0dXJuOworCXRoaXMucm9vdENsYXNzZXMuYWRkKHR5cGUpOworfQorLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBzdWJ0eXBlIHRvIHRoZSB0eXBlLgorICovCitwcm90ZWN0ZWQgdm9pZCBhZGRTdWJ0eXBlKElUeXBlIHR5cGUsIElUeXBlIHN1YnR5cGUpIHsKKwlUeXBlVmVjdG9yIHN1YnR5cGVzID0gKFR5cGVWZWN0b3IpdGhpcy50eXBlVG9TdWJ0eXBlcy5nZXQodHlwZSk7CisJaWYgKHN1YnR5cGVzID09IG51bGwpIHsKKwkJc3VidHlwZXMgPSBuZXcgVHlwZVZlY3RvcigpOworCQl0aGlzLnR5cGVUb1N1YnR5cGVzLnB1dCh0eXBlLCBzdWJ0eXBlcyk7CisJfQorCWlmICghc3VidHlwZXMuY29udGFpbnMoc3VidHlwZSkpIHsKKwkJc3VidHlwZXMuYWRkKHN1YnR5cGUpOworCX0KK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgdm9pZCBhZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisJaWYgKHRoaXMuY2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKwkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCS8vIGZpeCBmb3IgMUZXNjdQQQorCQlpZiAodGhpcy5leGlzdHMpIHsKKwkJCWFjdGl2YXRlKCk7CisJCX0KKwl9CisJLy8gYWRkIGxpc3RlbmVyIG9ubHkgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudAorCWlmICh0aGlzLmNoYW5nZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSA9PSAtMSkgeworCQl0aGlzLmNoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KK30KKy8qKgorICogY2FjaGVGbGFncy4KKyAqLworcHVibGljIHZvaWQgY2FjaGVGbGFncyhJVHlwZSB0eXBlLCBpbnQgZmxhZ3MpIHsKKwl0aGlzLnR5cGVGbGFncy5wdXQodHlwZSwgbmV3IEludGVnZXIoZmxhZ3MpKTsKK30KKy8qKgorICogQ2FjaGVzIHRoZSBoYW5kbGUgb2YgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAqIEFzIGEgc2lkZSBlZmZlY3QgY2FjaGUgdGhpcyB0eXBlIGFzIGEgc3VidHlwZSBvZiB0aGUgc3VwZXJjbGFzcy4KKyAqLworcHJvdGVjdGVkIHZvaWQgY2FjaGVTdXBlcmNsYXNzKElUeXBlIHR5cGUsIElUeXBlIHN1cGVyY2xhc3MpIHsKKwlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCXRoaXMuY2xhc3NUb1N1cGVyY2xhc3MucHV0KHR5cGUsIHN1cGVyY2xhc3MpOworCQlhZGRTdWJ0eXBlKHN1cGVyY2xhc3MsIHR5cGUpOworCX0gCit9CisvKioKKyAqIENhY2hlcyBhbGwgb2YgdGhlIHN1cGVyaW50ZXJmYWNlcyB0aGF0IGFyZSBzcGVjaWZpZWQgZm9yIHRoZQorICogdHlwZS4KKyAqLworcHJvdGVjdGVkIHZvaWQgY2FjaGVTdXBlckludGVyZmFjZXMoSVR5cGUgdHlwZSwgSVR5cGVbXSBzdXBlcmludGVyZmFjZXMpIHsKKwl0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcy5wdXQodHlwZSwgc3VwZXJpbnRlcmZhY2VzKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQlJVHlwZSBzdXBlcmludGVyZmFjZSA9IHN1cGVyaW50ZXJmYWNlc1tpXTsKKwkJaWYgKHN1cGVyaW50ZXJmYWNlICE9IG51bGwpIHsKKwkJCWFkZFN1YnR5cGUoc3VwZXJpbnRlcmZhY2UsIHR5cGUpOworCQl9CisJfQorfQorLyoqCisgKiBDaGVja3Mgd2l0aCB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBzZWUgd2hldGhlciB0aGUgY3JlYXRpb24gb2YgdGhlIHR5cGUgaGllcmFyY2h5CisgKiBzaG91bGQgYmUgY2FuY2VsZWQuIFNob3VsZCBiZSByZWd1bGFybHkgY2FsbGVkCisgKiBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjYW5jZWwuCisgKgorICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiBjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkCisgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZAorICovCitwcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgeworCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHRoaXMucHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwl9Cit9CisvKioKKyAqIENvbXB1dGUgdGhpcyB0eXBlIGhpZXJhcmNoeS4KKyAqLworcHJvdGVjdGVkIHZvaWQgY29tcHV0ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeworCQlIaWVyYXJjaHlCdWlsZGVyIGJ1aWxkZXIgPSAKKwkJCW5ldyBJbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlcigKKwkJCQl0aGlzLCAKKwkJCQl0aGlzLnNjb3BlKTsKKwkJYnVpbGRlci5idWlsZCh0aGlzLmNvbXB1dGVTdWJ0eXBlcyk7CisJfSAvLyBlbHNlIGEgUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5IHNob3VsZCBiZSB1c2VkCit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVR5cGUgdHlwZSkgeworCS8vIGNsYXNzZXMKKwlpZiAodGhpcy5jbGFzc1RvU3VwZXJjbGFzcy5nZXQodHlwZSkgIT0gbnVsbCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvLyByb290IGNsYXNzZXMKKwlpZiAodGhpcy5yb290Q2xhc3Nlcy5jb250YWlucyh0eXBlKSkgcmV0dXJuIHRydWU7CisKKwkvLyBpbnRlcmZhY2VzCisJaWYgKHRoaXMuaW50ZXJmYWNlcy5jb250YWlucyh0eXBlKSkgcmV0dXJuIHRydWU7CisJCisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBEZWFjdGl2YXRlcyB0aGlzIGhpZXJhcmNoeSBmb3IgY2hhbmdlIGxpc3RlbmVycworICovCitwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKCkgeworCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJdGhpcy5maWxlcz0gbnVsbDsKKwl0aGlzLnBhY2thZ2VSZWdpb249IG51bGw7CisJdGhpcy5yb290UmVnaW9uPSBudWxsOworCXRoaXMucHJvamVjdFJlZ2lvbj0gbnVsbDsKKwl0aGlzLmNoYW5nZUxpc3RlbmVycz0gbnVsbDsKKwl0aGlzLmlzQWN0aXZhdGVkPSBmYWxzZTsKK30KKy8qKgorICogRW1wdGllcyB0aGlzIGhpZXJhcmNoeS4KKyAqCisgKiBmaXggZm9yIDFGVzY3UEEKKyAqLworcHJvdGVjdGVkIHZvaWQgZGVzdHJveSgpIHsKKwl0aGlzLmV4aXN0cyA9IGZhbHNlOworCXRoaXMuY2xhc3NUb1N1cGVyY2xhc3MgPSBuZXcgSGFzaE1hcCgxKTsKKwl0aGlzLmZpbGVzID0gbmV3IEhhc2hNYXAoNSk7CisJdGhpcy5pbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgwKTsKKwl0aGlzLnBhY2thZ2VSZWdpb24gPSBuZXcgUmVnaW9uKCk7CisJdGhpcy5wcm9qZWN0UmVnaW9uID0gbmV3IFJlZ2lvbigpOworCXRoaXMucm9vdENsYXNzZXMgPSBuZXcgVHlwZVZlY3RvcigpOworCXRoaXMucm9vdFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKwl0aGlzLnR5cGVUb1N1YnR5cGVzID0gbmV3IEhhc2hNYXAoMSk7CisJdGhpcy50eXBlRmxhZ3MgPSBuZXcgSGFzaE1hcCgxKTsKKwl0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwKDEpOworCXRoaXMubWlzc2luZ1R5cGVzID0gbmV3IEFycmF5TGlzdCg0KTsKKwlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOworfQorLyoqCisgKiBEZXRlcm1pbmVzIGlmIHRoZSBjaGFuZ2UgZWZmZWN0cyB0aGlzIGhpZXJhcmNoeSwgYW5kIGZpcmVzCisgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHJlcXVpcmVkLgorICovCitwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJLy8gZml4IGZvciAxRlc2N1BBCisJaWYgKHRoaXMuZXhpc3RzICYmIHRoaXMuaXNBY3RpdmF0ZWQoKSkgeworCQlpZiAoZXhpc3RzKCkpIHsKKwkJCWlmIChpc0FmZmVjdGVkKGV2ZW50LmdldERlbHRhKCkpKSB7CisJCQkJZmlyZUNoYW5nZSgpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVzdHJveSgpOworCQkJZmlyZUNoYW5nZSgpOworCQl9CisJfQorCit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqCisgKiBmaXggZm9yIDFGVzY3UEEKKyAqLworcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgeworCWlmICh0aGlzLmV4aXN0cykgeworCQl0aGlzLmV4aXN0cyA9ICh0aGlzLnR5cGUgPT0gbnVsbCB8fCAodGhpcy50eXBlICE9IG51bGwgJiYgdGhpcy50eXBlLmV4aXN0cygpKSkgJiYgdGhpcy5qYXZhUHJvamVjdCgpLmV4aXN0cygpOworCQlpZiAoIXRoaXMuZXhpc3RzKSB7CisJCQlkZXN0cm95KCk7CisJCX0KKwl9CisJcmV0dXJuIHRoaXMuZXhpc3RzOworfQorLyoqCisgKiBOb3RpZmllcyBsaXN0ZW5lcnMgdGhhdCB0aGlzIGhpZXJhcmNoeSBoYXMgY2hhbmdlZCBhbmQgbmVlZHMKKyAqIHJlZnJlc2hpbmcuIE5vdGUgdGhhdCBsaXN0ZW5lcnMgY2FuIGJlIHJlbW92ZWQgYXMgd2UgaXRlcmF0ZQorICogdGhyb3VnaCB0aGUgbGlzdC4KKyAqLworcHJvdGVjdGVkIHZvaWQgZmlyZUNoYW5nZSgpIHsKKwlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPT0gbnVsbCkgeworCQlyZXR1cm47CisJfQorCWlmIChERUJVRykgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZJUklORyBoaWVyYXJjaHkgY2hhbmdlIFsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkrIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgZm9yIGhpZXJhcmNoeSBmb2N1c2VkIG9uICIgKyAoKEphdmFFbGVtZW50KXRoaXMudHlwZSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJQXJyYXlMaXN0IGxpc3RlbmVycz0gKEFycmF5TGlzdCl0aGlzLmNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOworCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKKwkJZmluYWwgSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXI9IChJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcilsaXN0ZW5lcnMuZ2V0KGkpOworCQkvLyBlbnN1cmUgdGhlIGxpc3RlbmVyIGlzIHN0aWxsIGEgbGlzdGVuZXIKKwkJaWYgKHRoaXMuY2hhbmdlTGlzdGVuZXJzICE9IG51bGwgICYmIHRoaXMuY2hhbmdlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpID49IDApIHsKKwkJCVBsYXRmb3JtLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQlVdGlsLmxvZyhleGNlcHRpb24sICJFeGNlcHRpb24gb2NjdXJyZWQgaW4gbGlzdGVuZXIgb2YgVHlwZSBoaWVyYXJjaHkgY2hhbmdlIG5vdGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworCQkJCQlsaXN0ZW5lci50eXBlSGllcmFyY2h5Q2hhbmdlZChUeXBlSGllcmFyY2h5LnRoaXMpOworCQkJCX0KKwkJCX0pOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldEFsbENsYXNzZXMoKSB7CisKKwlUeXBlVmVjdG9yIGNsYXNzZXMgPSB0aGlzLnJvb3RDbGFzc2VzLmNvcHkoKTsKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7CisJCWNsYXNzZXMuYWRkKChJVHlwZSlpdGVyLm5leHQoKSk7CisJfQorCXJldHVybiBjbGFzc2VzLmVsZW1lbnRzKCk7Cit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIElUeXBlW10gZ2V0QWxsSW50ZXJmYWNlcygpIHsKKwlJVHlwZVtdIGNvbGxlY3Rpb249IG5ldyBJVHlwZVt0aGlzLmludGVyZmFjZXMuc2l6ZSgpXTsKKwl0aGlzLmludGVyZmFjZXMudG9BcnJheShjb2xsZWN0aW9uKTsKKwlyZXR1cm4gY29sbGVjdGlvbjsKK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSAgZ2V0QWxsU3VidHlwZXMoSVR5cGUgdHlwZSkgeworCXJldHVybiBnZXRBbGxTdWJ0eXBlc0ZvclR5cGUodHlwZSk7Cit9CisvKioKKyAqIEBzZWUgZ2V0QWxsU3VidHlwZXMoSVR5cGUpCisgKi8KK3ByaXZhdGUgSVR5cGVbXSBnZXRBbGxTdWJ0eXBlc0ZvclR5cGUoSVR5cGUgdHlwZSkgeworCUFycmF5TGlzdCBzdWJUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlnZXRBbGxTdWJ0eXBlc0ZvclR5cGUwKHR5cGUsIHN1YlR5cGVzKTsKKwlJVHlwZVtdIHN1YkNsYXNzZXMgPSBuZXcgSVR5cGVbc3ViVHlwZXMuc2l6ZSgpXTsKKwlzdWJUeXBlcy50b0FycmF5KHN1YkNsYXNzZXMpOworCXJldHVybiBzdWJDbGFzc2VzOworfQorLyoqCisgKi8KK3ByaXZhdGUgdm9pZCBnZXRBbGxTdWJ0eXBlc0ZvclR5cGUwKElUeXBlIHR5cGUsIEFycmF5TGlzdCBzdWJzKSB7CisJSVR5cGVbXSBzdWJUeXBlcyA9IGdldFN1YnR5cGVzRm9yVHlwZSh0eXBlKTsKKwlpZiAoc3ViVHlwZXMubGVuZ3RoICE9IDApIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJSVR5cGUgc3ViVHlwZSA9IHN1YlR5cGVzW2ldOworCQkJc3Vicy5hZGQoc3ViVHlwZSk7CisJCQlnZXRBbGxTdWJ0eXBlc0ZvclR5cGUwKHN1YlR5cGUsIHN1YnMpOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldEFsbFN1cGVyY2xhc3NlcyhJVHlwZSB0eXBlKSB7CisJSVR5cGUgc3VwZXJjbGFzcyA9IGdldFN1cGVyY2xhc3ModHlwZSk7CisJVHlwZVZlY3RvciBzdXBlcnMgPSBuZXcgVHlwZVZlY3RvcigpOworCXdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJc3VwZXJzLmFkZChzdXBlcmNsYXNzKTsKKwkJc3VwZXJjbGFzcyA9IGdldFN1cGVyY2xhc3Moc3VwZXJjbGFzcyk7CisJfQorCXJldHVybiBzdXBlcnMuZWxlbWVudHMoKTsKK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRBbGxTdXBlckludGVyZmFjZXMoSVR5cGUgdHlwZSkgeworCUFycmF5TGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJaWYgKHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmdldCh0eXBlKSA9PSBudWxsKSB7CisJCXJldHVybiBOT19UWVBFOworCX0KKwlnZXRBbGxTdXBlckludGVyZmFjZXMwKHR5cGUsIHN1cGVycyk7CisJSVR5cGVbXSBzdXBlcmludGVyZmFjZXMgPSBuZXcgSVR5cGVbc3VwZXJzLnNpemUoKV07CisJc3VwZXJzLnRvQXJyYXkoc3VwZXJpbnRlcmZhY2VzKTsKKwlyZXR1cm4gc3VwZXJpbnRlcmZhY2VzOworfQorcHJpdmF0ZSB2b2lkIGdldEFsbFN1cGVySW50ZXJmYWNlczAoSVR5cGUgdHlwZSwgQXJyYXlMaXN0IHN1cGVycykgeworCUlUeXBlW10gc3VwZXJpbnRlcmZhY2VzID0gKElUeXBlW10pIHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmdldCh0eXBlKTsKKwlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwgJiYgc3VwZXJpbnRlcmZhY2VzLmxlbmd0aCAhPSAwKSB7CisJCWFkZEFsbENoZWNraW5nRHVwbGljYXRlcyhzdXBlcnMsIHN1cGVyaW50ZXJmYWNlcyk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisJCQlnZXRBbGxTdXBlckludGVyZmFjZXMwKHN1cGVyaW50ZXJmYWNlc1tpXSwgc3VwZXJzKTsKKwkJfQorCX0KKwlJVHlwZSBzdXBlcmNsYXNzID0gKElUeXBlKSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmdldCh0eXBlKTsKKwlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCWdldEFsbFN1cGVySW50ZXJmYWNlczAoc3VwZXJjbGFzcywgc3VwZXJzKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIElUeXBlW10gZ2V0QWxsU3VwZXJ0eXBlcyhJVHlwZSB0eXBlKSB7CisJQXJyYXlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwlpZiAodGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMuZ2V0KHR5cGUpID09IG51bGwpIHsKKwkJcmV0dXJuIE5PX1RZUEU7CisJfQorCWdldEFsbFN1cGVydHlwZXMwKHR5cGUsIHN1cGVycyk7CisJSVR5cGVbXSBzdXBlcnR5cGVzID0gbmV3IElUeXBlW3N1cGVycy5zaXplKCldOworCXN1cGVycy50b0FycmF5KHN1cGVydHlwZXMpOworCXJldHVybiBzdXBlcnR5cGVzOworfQorcHJpdmF0ZSB2b2lkIGdldEFsbFN1cGVydHlwZXMwKElUeXBlIHR5cGUsIEFycmF5TGlzdCBzdXBlcnMpIHsKKwlJVHlwZVtdIHN1cGVyaW50ZXJmYWNlcyA9IChJVHlwZVtdKSB0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcy5nZXQodHlwZSk7CisJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsICYmIHN1cGVyaW50ZXJmYWNlcy5sZW5ndGggIT0gMCkgeworCQlhZGRBbGxDaGVja2luZ0R1cGxpY2F0ZXMoc3VwZXJzLCBzdXBlcmludGVyZmFjZXMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJZ2V0QWxsU3VwZXJJbnRlcmZhY2VzMChzdXBlcmludGVyZmFjZXNbaV0sIHN1cGVycyk7CisJCX0KKwl9CisJSVR5cGUgc3VwZXJjbGFzcyA9IChJVHlwZSkgdGhpcy5jbGFzc1RvU3VwZXJjbGFzcy5nZXQodHlwZSk7CisJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQlzdXBlcnMuYWRkKHN1cGVyY2xhc3MpOworCQlnZXRBbGxTdXBlcnR5cGVzMChzdXBlcmNsYXNzLCBzdXBlcnMpOworCX0KK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRBbGxUeXBlcygpIHsKKwlJVHlwZVtdIGNsYXNzZXMgPSBnZXRBbGxDbGFzc2VzKCk7CisJaW50IGNsYXNzZXNMZW5ndGggPSBjbGFzc2VzLmxlbmd0aDsKKwlJVHlwZVtdIGludGVyZmFjZXMgPSBnZXRBbGxJbnRlcmZhY2VzKCk7CisJaW50IGludGVyZmFjZXNMZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsKKwlJVHlwZVtdIGFsbCA9IG5ldyBJVHlwZVtjbGFzc2VzTGVuZ3RoICsgaW50ZXJmYWNlc0xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weShjbGFzc2VzLCAwLCBhbGwsIDAsIGNsYXNzZXNMZW5ndGgpOworCVN5c3RlbS5hcnJheWNvcHkoaW50ZXJmYWNlcywgMCwgYWxsLCBjbGFzc2VzTGVuZ3RoLCBpbnRlcmZhY2VzTGVuZ3RoKTsKKwlyZXR1cm4gYWxsOworfQorCisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkjZ2V0Q2FjaGVkRmxhZ3MoSVR5cGUpCisgKi8KK3B1YmxpYyBpbnQgZ2V0Q2FjaGVkRmxhZ3MoSVR5cGUgdHlwZSkgeworCUludGVnZXIgZmxhZ09iamVjdCA9IChJbnRlZ2VyKSB0aGlzLnR5cGVGbGFncy5nZXQodHlwZSk7CisJaWYgKGZsYWdPYmplY3QgIT0gbnVsbCl7CisJCXJldHVybiBmbGFnT2JqZWN0LmludFZhbHVlKCk7CisJfQorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldEV4dGVuZGluZ0ludGVyZmFjZXMoSVR5cGUgdHlwZSkgeworCXRyeSB7CisJCWlmICh0eXBlLmlzQ2xhc3MoKSkgeworCQkJcmV0dXJuIG5ldyBJVHlwZVtdIHt9OworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgeworCQlyZXR1cm4gbmV3IElUeXBlW10ge307CisJfQorCXJldHVybiBnZXRFeHRlbmRpbmdJbnRlcmZhY2VzMCh0eXBlKTsKK30KKy8qKgorICogQXNzdW1lcyB0aGF0IHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZQorICogQHNlZSBnZXRFeHRlbmRpbmdJbnRlcmZhY2VzCisgKi8KK3ByaXZhdGUgSVR5cGVbXSBnZXRFeHRlbmRpbmdJbnRlcmZhY2VzMChJVHlwZSBpbnRlcmZjZSkgeworCUl0ZXJhdG9yIGl0ZXIgPSB0aGlzLnR5cGVUb1N1cGVySW50ZXJmYWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworCUFycmF5TGlzdCB4ZXJzID0gbmV3IEFycmF5TGlzdCgpOworCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQlJVHlwZSB0eXBlID0gKElUeXBlKSBpdGVyLm5leHQoKTsKKwkJdHJ5IHsKKwkJCWlmICh0eXBlLmlzQ2xhc3MoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlJVHlwZVtdIGludGVyZmFjZXMgPSAoSVR5cGVbXSkgdGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMuZ2V0KHR5cGUpOworCQlpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlJVHlwZSBpRmFjZSA9IGludGVyZmFjZXNbaV07CisJCQkJaWYgKGlGYWNlLmVxdWFscyhpbnRlcmZjZSkpIHsKKwkJCQkJeGVycy5hZGQodHlwZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCUlUeXBlW10gZXh0ZW5kZXJzID0gbmV3IElUeXBlW3hlcnMuc2l6ZSgpXTsKKwl4ZXJzLnRvQXJyYXkoZXh0ZW5kZXJzKTsKKwlyZXR1cm4gZXh0ZW5kZXJzOworfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldEltcGxlbWVudGluZ0NsYXNzZXMoSVR5cGUgdHlwZSkgeworCXRyeSB7CisJCWlmICh0eXBlLmlzQ2xhc3MoKSkgeworCQkJcmV0dXJuIE5PX1RZUEU7CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybiBOT19UWVBFOworCX0KKwlyZXR1cm4gZ2V0SW1wbGVtZW50aW5nQ2xhc3NlczAodHlwZSk7Cit9CisvKioKKyAqIEFzc3VtZXMgdGhhdCB0aGUgdHlwZSBpcyBhbiBpbnRlcmZhY2UKKyAqIEBzZWUgZ2V0SW1wbGVtZW50aW5nQ2xhc3NlcworICovCitwcml2YXRlIElUeXBlW10gZ2V0SW1wbGVtZW50aW5nQ2xhc3NlczAoSVR5cGUgaW50ZXJmY2UpIHsKKwkKKwlJdGVyYXRvciBpdGVyID0gdGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwlBcnJheUxpc3QgaU1lbnRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGl0ZXIubmV4dCgpOworCQl0cnkgeworCQkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlJVHlwZVtdIGludGVyZmFjZXMgPSAoSVR5cGVbXSkgdGhpcy50eXBlVG9TdXBlckludGVyZmFjZXMuZ2V0KHR5cGUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlUeXBlIGlGYWNlID0gaW50ZXJmYWNlc1tpXTsKKwkJCWlmIChpRmFjZS5lcXVhbHMoaW50ZXJmY2UpKSB7CisJCQkJaU1lbnRlcnMuYWRkKHR5cGUpOworCQkJfQorCQl9CisJfQorCUlUeXBlW10gaW1wbGVtZW50ZXJzID0gbmV3IElUeXBlW2lNZW50ZXJzLnNpemUoKV07CisJaU1lbnRlcnMudG9BcnJheShpbXBsZW1lbnRlcnMpOworCXJldHVybiBpbXBsZW1lbnRlcnM7Cit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIElUeXBlW10gZ2V0Um9vdENsYXNzZXMoKSB7CisJcmV0dXJuIHRoaXMucm9vdENsYXNzZXMuZWxlbWVudHMoKTsKK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRSb290SW50ZXJmYWNlcygpIHsKKwlJVHlwZVtdIGFsbEludGVyZmFjZXMgPSBnZXRBbGxJbnRlcmZhY2VzKCk7CisJSVR5cGVbXSByb290cyA9IG5ldyBJVHlwZVthbGxJbnRlcmZhY2VzLmxlbmd0aF07CisJaW50IHJvb3ROdW1iZXIgPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQlJVHlwZVtdIHN1cGVySW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcyhhbGxJbnRlcmZhY2VzW2ldKTsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyA9PSBudWxsIHx8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGggPT0gMCkgeworCQkJcm9vdHNbcm9vdE51bWJlcisrXSA9IGFsbEludGVyZmFjZXNbaV07CisJCX0KKwl9CisJSVR5cGVbXSByZXN1bHQgPSBuZXcgSVR5cGVbcm9vdE51bWJlcl07CisJaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7CisJCVN5c3RlbS5hcnJheWNvcHkocm9vdHMsIDAsIHJlc3VsdCwgMCwgcm9vdE51bWJlcik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIElUeXBlW10gZ2V0U3ViY2xhc3NlcyhJVHlwZSB0eXBlKSB7CisJdHJ5IHsKKwkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJcmV0dXJuIE5PX1RZUEU7CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CisJCXJldHVybiBuZXcgSVR5cGVbXSB7fTsKKwl9CisJVHlwZVZlY3RvciB2ZWN0b3IgPSAoVHlwZVZlY3Rvcil0aGlzLnR5cGVUb1N1YnR5cGVzLmdldCh0eXBlKTsKKwlpZiAodmVjdG9yID09IG51bGwpCisJCXJldHVybiBOT19UWVBFOworCWVsc2UgCisJCXJldHVybiB2ZWN0b3IuZWxlbWVudHMoKTsKK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRTdWJ0eXBlcyhJVHlwZSB0eXBlKSB7CisJcmV0dXJuIGdldFN1YnR5cGVzRm9yVHlwZSh0eXBlKTsKK30KKy8qKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBzdWJ0eXBlcyBmb3IgdGhlIGdpdmVuIHR5cGUgLSB3aWxsIG5ldmVyIHJldHVybiBudWxsLgorICovCitwcml2YXRlIElUeXBlW10gZ2V0U3VidHlwZXNGb3JUeXBlKElUeXBlIHR5cGUpIHsKKwlUeXBlVmVjdG9yIHZlY3RvciA9IChUeXBlVmVjdG9yKXRoaXMudHlwZVRvU3VidHlwZXMuZ2V0KHR5cGUpOworCWlmICh2ZWN0b3IgPT0gbnVsbCkKKwkJcmV0dXJuIE5PX1RZUEU7CisJZWxzZSAKKwkJcmV0dXJuIHZlY3Rvci5lbGVtZW50cygpOworfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZSBnZXRTdXBlcmNsYXNzKElUeXBlIHR5cGUpIHsKKwl0cnkgeworCQlpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gKElUeXBlKSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmdldCh0eXBlKTsKKworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZVtdIGdldFN1cGVySW50ZXJmYWNlcyhJVHlwZSB0eXBlKSB7CisJSVR5cGVbXSBpbnRlcmZhY2VzID0gKElUeXBlW10pIHRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzLmdldCh0eXBlKTsKKwlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7CisJCXJldHVybiBOT19UWVBFOworCX0KKwlyZXR1cm4gaW50ZXJmYWNlczsKK30KKy8qKgorICogQHNlZSBJVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgSVR5cGVbXSBnZXRTdXBlcnR5cGVzKElUeXBlIHR5cGUpIHsKKwlJVHlwZSBzdXBlcmNsYXNzID0gZ2V0U3VwZXJjbGFzcyh0eXBlKTsKKwlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7CisJCXJldHVybiBnZXRTdXBlckludGVyZmFjZXModHlwZSk7CisJfSBlbHNlIHsKKwkJVHlwZVZlY3RvciBzdXBlclR5cGVzID0gbmV3IFR5cGVWZWN0b3IoZ2V0U3VwZXJJbnRlcmZhY2VzKHR5cGUpKTsKKwkJc3VwZXJUeXBlcy5hZGQoc3VwZXJjbGFzcyk7CisJCXJldHVybiBzdXBlclR5cGVzLmVsZW1lbnRzKCk7CisJfQorfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBJVHlwZSBnZXRUeXBlKCkgeworCXJldHVybiB0aGlzLnR5cGU7Cit9CisvKioKKyAqIEFkZHMgdGhlIG5ldyBlbGVtZW50cyB0byBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBhcnJheS4KKyAqIFJldHVybnMgdGhlIG5ldyBhcnJheS4KKyAqLworcHJvdGVjdGVkIElUeXBlW10gZ3Jvd0FuZEFkZFRvQXJyYXkoSVR5cGVbXSBhcnJheSwgSVR5cGVbXSBhZGRpdGlvbnMpIHsKKwlpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gYWRkaXRpb25zOworCX0KKwlJVHlwZVtdIG9sZCA9IGFycmF5OworCWFycmF5ID0gbmV3IElUeXBlW29sZC5sZW5ndGggKyBhZGRpdGlvbnMubGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgYXJyYXksIDAsIG9sZC5sZW5ndGgpOworCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25zLCAwLCBhcnJheSwgb2xkLmxlbmd0aCwgYWRkaXRpb25zLmxlbmd0aCk7CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBBZGRzIHRoZSBuZXcgZWxlbWVudCB0byBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBhcnJheS4KKyAqIFJldHVybnMgdGhlIG5ldyBhcnJheS4KKyAqLworcHJvdGVjdGVkIElUeXBlW10gZ3Jvd0FuZEFkZFRvQXJyYXkoSVR5cGVbXSBhcnJheSwgSVR5cGUgYWRkaXRpb24pIHsKKwlpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMCkgeworCQlyZXR1cm4gbmV3IElUeXBlW10ge2FkZGl0aW9ufTsKKwl9CisJSVR5cGVbXSBvbGQgPSBhcnJheTsKKwlhcnJheSA9IG5ldyBJVHlwZVtvbGQubGVuZ3RoICsgMV07CisJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGFycmF5LCAwLCBvbGQubGVuZ3RoKTsKKwlhcnJheVtvbGQubGVuZ3RoXSA9IGFkZGl0aW9uOworCXJldHVybiBhcnJheTsKK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9uZSBvZiB0aGUgc3VidHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkgaGFzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZQorICogb3IgdGhpcyB0eXBlIGhhcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBoYXNTdWJ0eXBlTmFtZWQoU3RyaW5nIHNpbXBsZU5hbWUpIHsKKwlpZiAodGhpcy50eXBlLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHNpbXBsZU5hbWUpKSB7CisJCXJldHVybiB0cnVlOworCX0KKwlJVHlwZVtdIHR5cGVzID0gdGhpcy5nZXRBbGxTdWJ0eXBlcyh0aGlzLnR5cGUpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAodHlwZXNbaV0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoc2ltcGxlTmFtZSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgb25lIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeSBoYXMgdGhlIGdpdmVuIHNpbXBsZSBuYW1lLgorICovCitwcml2YXRlIGJvb2xlYW4gaGFzVHlwZU5hbWVkKFN0cmluZyBzaW1wbGVOYW1lKSB7CisJSVR5cGVbXSB0eXBlcyA9IHRoaXMuZ2V0QWxsVHlwZXMoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKHR5cGVzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHNpbXBsZU5hbWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZ2l2ZW4gdHlwZSBvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMgaXMgCisgKiB0aGUgc2ltcGxlIG5hbWUgb2Ygb25lIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeS4KKyAqLworcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVzVHlwZU9yU3VwZXJ0eXBlKElUeXBlIHR5cGUpIHsKKwl0cnkgeworCQkvLyBjaGVjayB0eXBlCisJCWlmIChoYXNUeXBlTmFtZWQodHlwZS5nZXRFbGVtZW50TmFtZSgpKSkgcmV0dXJuIHRydWU7CisJCQorCQkvLyBjaGVjayBzdXBlcmNsYXNzCisJCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IHR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpIHsKKwkJCWludCBsYXN0U2VwYXJhdG9yID0gc3VwZXJjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCVN0cmluZyBzaW1wbGVOYW1lID0gKGxhc3RTZXBhcmF0b3IgPiAtMSkgPyBzdXBlcmNsYXNzTmFtZS5zdWJzdHJpbmcobGFzdFNlcGFyYXRvcikgOiBzdXBlcmNsYXNzTmFtZTsKKwkJCWlmIChoYXNUeXBlTmFtZWQoc2ltcGxlTmFtZSkpIHJldHVybiB0cnVlOworCQl9CisJCisJCS8vIGNoZWNrIHN1cGVyaW50ZXJmYWNlcworCQlTdHJpbmdbXSBzdXBlcmludGVyZmFjZU5hbWVzID0gdHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCk7CisJCWlmIChzdXBlcmludGVyZmFjZU5hbWVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlcmludGVyZmFjZU5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIHN1cGVyaW50ZXJmYWNlTmFtZSA9IHN1cGVyaW50ZXJmYWNlTmFtZXNbaV07CisJCQkJaW50IGxhc3RTZXBhcmF0b3IgPSBzdXBlcmludGVyZmFjZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCQlTdHJpbmcgc2ltcGxlTmFtZSA9IChsYXN0U2VwYXJhdG9yID4gLTEpID8gc3VwZXJpbnRlcmZhY2VOYW1lLnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yKSA6IHN1cGVyaW50ZXJmYWNlTmFtZTsKKwkJCQlpZiAoaGFzVHlwZU5hbWVkKHNpbXBsZU5hbWUpKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogSW5pdGlhbGl6ZXMgdGhpcyBoaWVyYXJjaHkncyBpbnRlcm5hbCB0YWJsZXMgd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4KKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShpbnQgc2l6ZSkgeworCWlmIChzaXplIDwgMTApIHsKKwkJc2l6ZSA9IDEwOworCX0KKwlpbnQgc21hbGxTaXplID0gKHNpemUgLyAyKTsKKwl0aGlzLmNsYXNzVG9TdXBlcmNsYXNzID0gbmV3IEhhc2hNYXAoc2l6ZSk7CisJdGhpcy5pbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdChzbWFsbFNpemUpOworCXRoaXMubWlzc2luZ1R5cGVzID0gbmV3IEFycmF5TGlzdChzbWFsbFNpemUpOworCXRoaXMucm9vdENsYXNzZXMgPSBuZXcgVHlwZVZlY3RvcigpOworCXRoaXMudHlwZVRvU3VidHlwZXMgPSBuZXcgSGFzaE1hcChzbWFsbFNpemUpOworCXRoaXMudHlwZVRvU3VwZXJJbnRlcmZhY2VzID0gbmV3IEhhc2hNYXAoc21hbGxTaXplKTsKKwl0aGlzLnR5cGVGbGFncyA9IG5ldyBIYXNoTWFwKHNtYWxsU2l6ZSk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhpZXJhcmNoeSBpcyBhY3RpdmVseSB0cmFja2luZyBjaGFuZ2VzCisgKiBpbiB0aGUgSmF2YSBNb2RlbC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7CisJcmV0dXJuIHRoaXMuaXNBY3RpdmF0ZWQ7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVsdGEgY291bGQgY2hhbmdlIHRoaXMgdHlwZSBoaWVyYXJjaHkKKyAqLworcHVibGljIGJvb2xlYW4gaXNBZmZlY3RlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCUlKYXZhRWxlbWVudCBlbGVtZW50PSBkZWx0YS5nZXRFbGVtZW50KCk7CisJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlKYXZhTW9kZWwoZGVsdGEsIGVsZW1lbnQpOworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5SmF2YVByb2plY3QoZGVsdGEsIGVsZW1lbnQpOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50Um9vdChkZWx0YSwgZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50KGRlbHRhLCBlbGVtZW50KTsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRToKKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKKwkJCXJldHVybiBpc0FmZmVjdGVkQnlPcGVuYWJsZShkZWx0YSwgZWxlbWVudCk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgYSBwcm9qZWN0LCBwYWNrYWdlCisgKiBmcmFnbWVudCByb290LCBvciBwYWNrYWdlIGZyYWdtZW50IGhhdmUgY2hhbmdlZCBpbiBhIHdheSB0aGF0CisgKiBlZmZlY3RzIHRoaXMgdHlwZSBoaWVyYXJjaHkuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBpc0FmZmVjdGVkQnlDaGlsZHJlbihJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pID4gMCkgeworCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJaWYgKGlzQWZmZWN0ZWQoY2hpbGRyZW5baV0pKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGphdmEgbW9kZWwgZGVsdGEgY291bGQgYWZmZWN0IHRoaXMgdHlwZSBoaWVyYXJjaHkKKyAqLworcHJpdmF0ZSBib29sZWFuIGlzQWZmZWN0ZWRCeUphdmFNb2RlbChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEIDoKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKKwkJCXJldHVybiBlbGVtZW50LmVxdWFscyh0aGlzLmphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQgOgorCQkJcmV0dXJuIGlzQWZmZWN0ZWRCeUNoaWxkcmVuKGRlbHRhKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBkZWx0YSBjb3VsZCBhZmZlY3QgdGhpcyB0eXBlIGhpZXJhcmNoeQorICovCitwcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5SmF2YVByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6CisJCQl0cnkgeworCQkJCS8vIGlmIHRoZSBhZGRlZCBwcm9qZWN0IGlzIG9uIHRoZSBjbGFzc3BhdGgsIHRoZW4gdGhlIGhpZXJhcmNoeSBoYXMgY2hhbmdlZAorCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9ICgoSmF2YVByb2plY3QpdGhpcy5qYXZhUHJvamVjdCgpKS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoY2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCAKKwkJCQkJCQkmJiBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhlbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIDoKKwkJCS8vIHJlbW92ZWQgcHJvamVjdCAtIGlmIGl0IGNvbnRhaW5zIHBhY2thZ2VzIHdlIGFyZSBpbnRlcmVzdGVkIGluCisJCQkvLyB0aGVuIHRoZSB0eXBlIGhpZXJhcmNoeSBoYXMgY2hhbmdlZAorCQkJSUphdmFFbGVtZW50W10gcGtncyA9IHRoaXMucGFja2FnZVJlZ2lvbi5nZXRFbGVtZW50cygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwa2dzW2ldLmdldEphdmFQcm9qZWN0KCk7CisJCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmVxdWFscyhlbGVtZW50KSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCA6CisJCQlyZXR1cm4gaXNBZmZlY3RlZEJ5Q2hpbGRyZW4oZGVsdGEpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCBkZWx0YSBjb3VsZCBhZmZlY3QgdGhpcyB0eXBlIGhpZXJhcmNoeQorICovCitwcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50KElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOgorCQkJLy8gaWYgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaXMgaW4gdGhlIHByb2plY3RzIGJlaW5nIGNvbnNpZGVyZWQsIHRoaXMgY291bGQKKwkJCS8vIGludHJvZHVjZSBuZXcgdHlwZXMsIGNoYW5naW5nIHRoZSBoaWVyYXJjaHkKKwkJCXJldHVybiB0aGlzLnByb2plY3RSZWdpb24uY29udGFpbnMoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCA6CisJCQkvLyBpcyBhIGNoYW5nZSBpZiB0aGUgcGFja2FnZSBmcmFnbWVudCBjb250YWlucyB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeQorCQkJcmV0dXJuIHBhY2thZ2VSZWdpb25Db250YWluc1NhbWVQYWNrYWdlRnJhZ21lbnQoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCA6CisJCQkvLyBsb29rIGF0IHRoZSBmaWxlcyBpbiB0aGUgcGFja2FnZSBmcmFnbWVudAorCQkJcmV0dXJuIGlzQWZmZWN0ZWRCeUNoaWxkcmVuKGRlbHRhKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBkZWx0YSBjb3VsZCBhZmZlY3QgdGhpcyB0eXBlIGhpZXJhcmNoeQorICovCitwcml2YXRlIGJvb2xlYW4gaXNBZmZlY3RlZEJ5UGFja2FnZUZyYWdtZW50Um9vdChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkFEREVEIDoKKwkJCXJldHVybiB0aGlzLnByb2plY3RSZWdpb24uY29udGFpbnMoZWxlbWVudCk7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCA6CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCA6CisJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOworCQkJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDApIHsKKwkJCQkvLyBjaGVjayBpZiB0aGUgcm9vdCBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIG9uZSBvZiB0aGUgcHJvamVjdHMgb2YgdGhpcyBoaWVyYXJjaHkKKwkJCQlpZiAodGhpcy5wcm9qZWN0UmVnaW9uICE9IG51bGwpIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50OworCQkJCQlJUGF0aCByb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQkJCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IHRoaXMucHJvamVjdFJlZ2lvbi5nZXRFbGVtZW50cygpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IChJSmF2YVByb2plY3QpZWxlbWVudHNbaV07CisJCQkJCQl0cnkgeworCQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc3BhdGgubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOworCQkJCQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhyb290UGF0aCkpIHsKKwkJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkvLyBpZ21vcmUgdGhpcyBwcm9qZWN0CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDAgfHwgKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSA+IDApIHsKKwkJCQkvLyAxLiByZW1vdmVkIGZyb20gY2xhc3NwYXRoIC0gaWYgaXQgY29udGFpbnMgcGFja2FnZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4KKwkJCQkvLyB0aGUgdGhlIHR5cGUgaGllcmFyY2h5IGhhcyBjaGFuZ2VkCisJCQkJLy8gMi4gY29udGVudCBvZiBhIGphciBjaGFuZ2VkIC0gaWYgaXQgY29udGFpbnMgcGFja2FnZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4KKwkJCQkvLyB0aGUgdGhlIHR5cGUgaGllcmFyY2h5IGhhcyBjaGFuZ2VkCisJCQkJSUphdmFFbGVtZW50W10gcGtncyA9IHRoaXMucGFja2FnZVJlZ2lvbi5nZXRFbGVtZW50cygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGtncy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAocGtnc1tpXS5nZXRQYXJlbnQoKS5lcXVhbHMoZWxlbWVudCkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwl9CisJcmV0dXJuIGlzQWZmZWN0ZWRCeUNoaWxkcmVuKGRlbHRhKTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIGRlbHRhIChhIGNvbXBpbGF0aW9uIHVuaXQgZGVsdGEgb3IgYSBjbGFzcyBmaWxlIGRlbHRhKQorICogY291bGQgYWZmZWN0IHRoaXMgdHlwZSBoaWVyYXJjaHkuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0ZWRCeU9wZW5hYmxlKElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCS8vIGlnbm9yZSBjaGFuZ2VzIHRvIHdvcmtpbmcgY29waWVzCisJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQgJiYgKChDb21waWxhdGlvblVuaXQpZWxlbWVudCkuaXNXb3JraW5nQ29weSgpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCQorCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOworCXN3aXRjaCAoa2luZCkgeworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ6CisJCQlyZXR1cm4gdGhpcy5maWxlcy5nZXQoZWxlbWVudCkgIT0gbnVsbDsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKKwkJCUlUeXBlW10gdHlwZXMgPSBudWxsOworCQkJdHJ5IHsKKwkJCQl0eXBlcyA9IChlbGVtZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSA/CisJCQkJCSgoQ29tcGlsYXRpb25Vbml0KWVsZW1lbnQpLmdldEFsbFR5cGVzKCkgOgorCQkJCQluZXcgSVR5cGVbXSB7KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpZWxlbWVudCkuZ2V0VHlwZSgpfTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJVHlwZSB0eXBlID0gdHlwZXNbaV07CisJCQkJaWYgKHR5cGVIYXNTdXBlcnR5cGUodHlwZSkgCisJCQkJCXx8IHN1YnR5cGVzSW5jbHVkZVN1cGVydHlwZU9mKHR5cGUpCisJCQkJCXx8IHRoaXMubWlzc2luZ1R5cGVzLmNvbnRhaW5zKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJCQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgorCQkJYm9vbGVhbiBoYXNJbXBvcnRDaGFuZ2UgPSBmYWxzZTsKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCUlKYXZhRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZC5nZXRFbGVtZW50KCk7CisJCQkJaWYgKGNoaWxkRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7CisJCQkJCS8vIE5COiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgaW1wb3J0IHN0YXRlbWVudHMgYXJlIGJlZm9yZSB0eXBlIGRlY2xhcmF0aW9ucworCQkJCQlpZiAodGhpcy5pc0FmZmVjdGVkQnlUeXBlKGNoaWxkLCAoSVR5cGUpY2hpbGRFbGVtZW50LCBoYXNJbXBvcnRDaGFuZ2UpKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgSW1wb3J0Q29udGFpbmVyKSB7CisJCQkJCWlmICghaGFzSW1wb3J0Q2hhbmdlKSB7CisJCQkJCQloYXNJbXBvcnRDaGFuZ2UgPSB0cnVlOworCQkJCQkJdHlwZXMgPSBudWxsOworCQkJCQkJdHJ5IHsKKwkJCQkJCQl0eXBlcyA9IChlbGVtZW50IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSA/CisJCQkJCQkJCSgoQ29tcGlsYXRpb25Vbml0KWVsZW1lbnQpLmdldEFsbFR5cGVzKCkgOgorCQkJCQkJCQluZXcgSVR5cGVbXSB7KChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpZWxlbWVudCkuZ2V0VHlwZSgpfTsKKwkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlmb3IgKGludCBqID0gMCwgdHlwZXNMZW5ndGggPSB0eXBlcy5sZW5ndGg7IGogPCB0eXBlc0xlbmd0aDsgaisrKSB7CisJCQkJCQkJaWYgKGluY2x1ZGVzVHlwZU9yU3VwZXJ0eXBlKHR5cGVzW2pdKSkgeworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJCisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qCisgKiBUaGUgcnVsZXMgYXJlOgorICogLSBpZiB0aGUgZGVsdGEgaXMgYW4gYWRkZWQgdHlwZSBYLCB0aGVuIHRoZSBoaWVyYXJjaHkgaXMgY2hhbmdlZCAKKyAqICAgLiBpZiBvbmUgb2YgdGhlIHR5cGVzIGluIHRoaXMgaGllcmFyY2h5IGhhcyBhIHN1cGVydHlwZSB3aG9zZSBzaW1wbGUgbmFtZSBpcyB0aGUKKyAqICAgICBzaW1wbGUgbmFtZSBvZiBYCisgKiAgIC4gaWYgdGhlIHNpbXBsZSBuYW1lIG9mIGEgc3VwZXJ0eXBlIG9mIFggaXMgdGhlIHNpbXBsZSBuYW1lIG9mIG9uZSBvZgorICogICAgIHRoZSBzdWJ0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeSAoWCB3aWxsIGJlIGFkZGVkIGFzIG9uZSBvZiB0aGUgc3VidHlwZXMpCisgKiAtIGlmIHRoZSBkZWx0YSBpcyBhIGNoYW5nZWQgdHlwZSBYLCB0aGVuIHRoZSBoaWVyYXJjaHkgaXMgY2hhbmdlZAorICogICAuIGlmIHRoZSB2aXNpYmlsaXR5IG9mIFggaGFzIGNoYW5nZWQgYW5kIGlmIG9uZSBvZiB0aGUgdHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkgaGFzIGEgCisgKgkgICBzdXBlcnR5cGUgd2hvc2Ugc2ltcGxlIG5hbWUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIFgKKyAqICAgLiBpZiBvbmUgb2YgdGhlIHN1cGVydHlwZXMgb2YgWCBoYXMgY2hhbmdlZCBvciBvbmUgb2YgdGhlIGltcG9ydHMgaGFzIGNoYW5nZWQsCisgKiAgICAgYW5kIGlmIHRoZSBzaW1wbGUgbmFtZSBvZiBhIHN1cGVydHlwZSBvZiBYIGlzIHRoZSBzaW1wbGUgbmFtZSBvZiBvbmUgb2YgCisgKiAgICAgdGhlIHR5cGVzIGluIHRoaXMgaGllcmFyY2h5CisgKiAtIGlmIHRoZSBkZWx0YSBpcyBhIHJlbW92ZWQgdHlwZSBYLCB0aGVuIHRoZSBoaWVyYXJjaHkgaXMgY2hhbmdlZAorICogICAuIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIHBhcnQgb2YgdGhpcyBoaWVyYXJjaHkgKG5vdGUgd2UgY2Fubm90IGFjY2VzIHRoZSB0eXBlcyAKKyAqICAgICBiZWNhdXNlIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0ZWRCeVR5cGUoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIElUeXBlIHR5cGUsIGJvb2xlYW4gaGFzSW1wb3J0Q2hhbmdlKSB7CisJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKKwkJCWlmICh0eXBlSGFzU3VwZXJ0eXBlKHR5cGUpIAorCQkJCXx8IHN1YnR5cGVzSW5jbHVkZVN1cGVydHlwZU9mKHR5cGUpIAorCQkJCXx8IHRoaXMubWlzc2luZ1R5cGVzLmNvbnRhaW5zKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ6CisJCQlib29sZWFuIGhhc1Zpc2liaWxpdHlDaGFuZ2UgPSAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9ESUZJRVJTKSA+IDA7CisJCQlib29sZWFuIGhhc1N1cGVydHlwZUNoYW5nZSA9IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9TVVBFUl9UWVBFUykgPiAwOworCQkJaWYgKChoYXNWaXNpYmlsaXR5Q2hhbmdlICYmIHR5cGVIYXNTdXBlcnR5cGUodHlwZSkpCisJCQkJCXx8ICgoaGFzSW1wb3J0Q2hhbmdlIHx8IGhhc1N1cGVydHlwZUNoYW5nZSkgCisJCQkJCQkmJiBpbmNsdWRlc1R5cGVPclN1cGVydHlwZSh0eXBlKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ6CisJCQlpZiAodGhpcy5jb250YWlucyh0eXBlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJYnJlYWs7CisJfQorCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlKYXZhRWxlbWVudERlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07CisJCUlKYXZhRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZC5nZXRFbGVtZW50KCk7CisJCWlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJaWYgKHRoaXMuaXNBZmZlY3RlZEJ5VHlwZShjaGlsZCwgKElUeXBlKWNoaWxkRWxlbWVudCwgaGFzSW1wb3J0Q2hhbmdlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30gCisvKioKKyAqIFJldHVybnMgdGhlIGphdmEgcHJvamVjdCB0aGlzIGhpZXJhcmNoeSB3YXMgY3JlYXRlZCBpbi4KKyAqLworcHVibGljIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCgpIHsKKwlyZXR1cm4gdGhpcy50eXBlLmdldEphdmFQcm9qZWN0KCk7Cit9CisvKioKKyAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gZXF1aXZhbGVudCBwYWNrYWdlIGZyYWdtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlCisgKiByZWdpb24uIFBhY2thZ2UgZnJhZ21lbnRzIGFyZSBlcXVpdmFsZW50IGlmIHRoZXkgYm90aCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIHBhY2thZ2VSZWdpb25Db250YWluc1NhbWVQYWNrYWdlRnJhZ21lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlJSmF2YUVsZW1lbnRbXSBwa2dzID0gdGhpcy5wYWNrYWdlUmVnaW9uLmdldEVsZW1lbnRzKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChwa2dzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyB2b2lkIHJlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0cnkgeworCQlib29sZWFuIHJlYWN0aXZhdGUgPSBpc0FjdGl2YXRlZCgpOworCQlBcnJheUxpc3QgbGlzdGVuZXJzID0gdGhpcy5jaGFuZ2VMaXN0ZW5lcnM7CisJCWlmIChyZWFjdGl2YXRlKSB7CisJCQlkZWFjdGl2YXRlKCk7CisJCX0KKwkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImhpZXJhcmNoeS5jcmVhdGluZyIpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCisJCX0KKwkJbG9uZyBzdGFydCA9IC0xOworCQlpZiAoREVCVUcpIHsKKwkJCXN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlpZiAodGhpcy5jb21wdXRlU3VidHlwZXMpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNSRUFUSU5HIFRZUEUgSElFUkFSQ0hZIFsiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNSRUFUSU5HIFNVUEVSIFRZUEUgSElFUkFSQ0hZIFsiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIG9uIHR5cGUgIiArICgoSmF2YUVsZW1lbnQpdGhpcy50eXBlKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQljb21wdXRlKCk7CisJCWlmIChyZWFjdGl2YXRlKSB7CisJCQlhY3RpdmF0ZSgpOworCQkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CisJCX0KKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBudWxsOworCQlpZiAoREVCVUcpIHsKKwkJCWlmICh0aGlzLmNvbXB1dGVTdWJ0eXBlcykgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1JFQVRFRCBUWVBFIEhJRVJBUkNIWSBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNSRUFURUQgU1VQRVIgVFlQRSBISUVSQVJDSFkgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRvU3RyaW5nKCkpOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBudWxsOworCQl0aHJvdyBlOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG51bGw7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7CisJCXJlZnJlc2hDYW5jZWxsZWQob2NlKTsKKwl9Cit9CisvKioKKyAqIFRoZSByZWZyZXNoIG9mIHRoaXMgdHlwZSBoaWVyYXJjaHkgaGFzIGJlZW4gY2FuY2VsbGVkLgorICogQ2xlYW51cCB0aGUgc3RhdGUgb2YgdGhpcyBub3cgaW52YWxpZCB0eXBlIGhpZXJhcmNoeS4KKyAqLworcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENhbmNlbGxlZChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWRlc3Ryb3koKTsKKwl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG51bGw7CisJdGhyb3cgb2NlOworfQorCisvKioKKyAqIEBzZWUgSVR5cGVIaWVyYXJjaHkKKyAqLworcHVibGljIHZvaWQgcmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcihJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCWlmICh0aGlzLmNoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKwlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7CisJCWRlYWN0aXZhdGUoKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgc2ltcGxlIG5hbWUgb2YgYSBzdXBlcnR5cGUgb2YgdGhlIGdpdmVuIHR5cGUgaXMgCisgKiB0aGUgc2ltcGxlIG5hbWUgb2Ygb25lIG9mIHRoZSBzdWJ0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeSBvciB0aGUKKyAqIHNpbXBsZSBuYW1lIG9mIHRoaXMgdHlwZS4KKyAqLworcHJpdmF0ZSBib29sZWFuIHN1YnR5cGVzSW5jbHVkZVN1cGVydHlwZU9mKElUeXBlIHR5cGUpIHsKKwkvLyBsb29rIGZvciBzdXBlcmNsYXNzCisJU3RyaW5nIHN1cGVyY2xhc3NOYW1lID0gbnVsbDsKKwl0cnkgeworCQlzdXBlcmNsYXNzTmFtZSA9IHR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChzdXBlcmNsYXNzTmFtZSA9PSBudWxsKSB7CisJCXN1cGVyY2xhc3NOYW1lID0gIk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKKwl9CisJaW50IGRvdCA9IC0xOworCVN0cmluZyBzaW1wbGVTdXBlciA9IChkb3QgPSBzdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpKSA+IC0xID8KKwkJc3VwZXJjbGFzc05hbWUuc3Vic3RyaW5nKGRvdCArIDEpIDoKKwkJc3VwZXJjbGFzc05hbWU7CisJaWYgKGhhc1N1YnR5cGVOYW1lZChzaW1wbGVTdXBlcikpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gbG9vayBmb3Igc3VwZXIgaW50ZXJmYWNlcworCVN0cmluZ1tdIGludGVyZmFjZU5hbWVzID0gbnVsbDsKKwl0cnkgeworCQlpbnRlcmZhY2VOYW1lcyA9IHR5cGUuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpOworCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGludGVyZmFjZU5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWRvdCA9IC0xOworCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZU5hbWVzW2ldOworCQlTdHJpbmcgc2ltcGxlSW50ZXJmYWNlID0gKGRvdCA9IGludGVyZmFjZU5hbWUubGFzdEluZGV4T2YoJy4nKSkgPiAtMSA/CisJCQlpbnRlcmZhY2VOYW1lLnN1YnN0cmluZyhkb3QpIDoKKwkJCWludGVyZmFjZU5hbWU7CisJCWlmIChoYXNTdWJ0eXBlTmFtZWQoc2ltcGxlSW50ZXJmYWNlKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJCisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWZmZXIuYXBwZW5kKCJGb2N1czogIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKHRoaXMudHlwZSA9PSBudWxsID8gIjxOT05FPiIgOiB0aGlzLnR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCWlmIChleGlzdHMoKSkgeworCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIlN1cGVyIHR5cGVzOlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRvU3RyaW5nKGJ1ZmZlciwgdGhpcy50eXBlLCAxLCB0cnVlKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIlN1YiB0eXBlczpcbiIpOyAvLyROT04tTkxTLTEkCisJCQl0b1N0cmluZyhidWZmZXIsIHRoaXMudHlwZSwgMSwgZmFsc2UpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZCgiU3ViIHR5cGVzIG9mIHJvb3QgY2xhc3NlczpcbiIpOyAvLyROT04tTkxTLTEkCisJCQlJVHlwZVtdIHJvb3RzPSBnZXRSb290Q2xhc3NlcygpOworCQkJZm9yIChpbnQgaT0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJdG9TdHJpbmcoYnVmZmVyLCByb290c1tpXSwgMSwgZmFsc2UpOworCQkJfQorCQl9CisJCWlmICh0aGlzLnJvb3RDbGFzc2VzLnNpemUgPiAxKSB7CisJCQlidWZmZXIuYXBwZW5kKCJSb290IGNsYXNzZXM6XG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJSVR5cGVbXSByb290cyA9IHRoaXMuZ2V0Um9vdENsYXNzZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByb290cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlUeXBlIHR5cGUgPSByb290c1tpXTsKKwkJCQl0b1N0cmluZyhidWZmZXIsIHR5cGUsIDEsIGZhbHNlKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoIihIaWVyYXJjaHkgYmVjYW1lIHN0YWxlKSIpOyAvLyROT04tTkxTLTEkCisJfQorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKy8qKgorICogQXBwZW5kIGEgU3RyaW5nIHRvIHRoZSBnaXZlbiBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBoaWVyYXJjaHkgZm9yIHRoZSB0eXBlLAorICogYmVnaW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAqIElmIGFzY2VuZGFudCwgc2hvd3MgdGhlIHN1cGVyIHR5cGVzLCBvdGhlcndpc2Ugc2hvdyB0aGUgc3ViIHR5cGVzLgorICovCitwcml2YXRlIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgSVR5cGUgdHlwZSwgaW50IGluZGVudCwgYm9vbGVhbiBhc2NlbmRhbnQpIHsKKwlmb3IgKGludCBpPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKwkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlKYXZhRWxlbWVudCBlbGVtZW50ID0gKEphdmFFbGVtZW50KXR5cGU7CisJYnVmZmVyLmFwcGVuZChlbGVtZW50LnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsKKwlidWZmZXIuYXBwZW5kKCdcbicpOworCisJSVR5cGVbXSB0eXBlcz0gYXNjZW5kYW50ID8gZ2V0U3VwZXJ0eXBlcyh0eXBlKSA6IGdldFN1YnR5cGVzKHR5cGUpOworCWZvciAoaW50IGk9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQl0b1N0cmluZyhidWZmZXIsIHR5cGVzW2ldLCBpbmRlbnQgKyAxLCBhc2NlbmRhbnQpOworCX0KKworfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgb25lIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeSBoYXMgYSBzdXBlcnR5cGUgd2hvc2Ugc2ltcGxlIAorICogbmFtZSBpcyB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiB0eXBlSGFzU3VwZXJ0eXBlKElUeXBlIHR5cGUpIHsKKwlTdHJpbmcgc2ltcGxlTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKKwlmb3IoSXRlcmF0b3IgaXRlciA9IHRoaXMuY2xhc3NUb1N1cGVyY2xhc3MudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKKwkJSVR5cGUgc3VwZXJUeXBlID0gKElUeXBlKWl0ZXIubmV4dCgpOworCQlpZiAoc3VwZXJUeXBlLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHNpbXBsZU5hbWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorICovCitwcm90ZWN0ZWQgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKKwlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQod29yayk7CisJCWNoZWNrQ2FuY2VsZWQoKTsKKwl9Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQWJzdHJhY3RET01CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0Fic3RyYWN0RE9NQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTZiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0Fic3RyYWN0RE9NQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuUmVmZXJlbmNlSW5mb0FkYXB0ZXI7CisKKy8qKgorICogQW4gYWJzdHJhY3QgRE9NIGJ1aWxkZXIgdGhhdCBjb250YWlucyBzaGFyZWQgZnVuY3Rpb25hbGl0eSBvZiBET01CdWlsZGVyIGFuZCBTaW1wbGVET01CdWlsZGVyLgorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RET01CdWlsZGVyIGV4dGVuZHMgUmVmZXJlbmNlSW5mb0FkYXB0ZXIgaW1wbGVtZW50cyBJTGluZVN0YXJ0RmluZGVyIHsKKwkvKioKKwkgKiBTZXQgdG8gdHJ1ZSB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmQgd2hpbGUKKwkgKiBmdXp6eSBwYXJzaW5nCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZkFib3J0OworCQorCS8qKgorCSAqIFRydWUgd2hlbiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgYmVpbmcgY29uc3RydWN0ZWQuCisJICogRmFsc2Ugd2hlbiBhbnkgb3RoZXIgdHlwZSBvZiBkb2N1bWVudCBmcmFnbWVudCBpcworCSAqIGJlaW5nIGNvbnN0cnVjdGVkLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZCdWlsZGluZ0NVID0gZmFsc2U7CisKKwkvKioKKwkgKiBUcnVlIHdoZW4gYSBjb21waWxhdGlvbiB1bml0IG9yIHR5cGUgaXMgYmVpbmcKKwkgKiBjb25zdHJ1Y3RlZC4gRmFsc2Ugd2hlbiBhbnkgb3RoZXIgdHlwZSBvZiBkb2N1bWVudAorCSAqIGZyYWdtZW50IGlzIGJlaW5nIGNvbnN0cnVjdGVkLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZCdWlsZGluZ1R5cGU9IGZhbHNlOworCisJLyoqCisJICogVGhlIFN0cmluZyBvbiB3aGljaCB0aGUgSkRPTSBpcyBiZWluZyBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBjaGFyW10gZkRvY3VtZW50PSBudWxsOworCQkKKwkvKioKKwkgKiBUaGUgc291cmNlIHBvc2l0aW9ucyBvZiBhbGwgb2YgdGhlIGxpbmUgc2VwYXJhdG9ycyBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdIGZMaW5lU3RhcnRQb3NpdGlvbnMgPSBuZXcgaW50W10geyAwIH07CisKKwkvKioKKwkgKiBBIHN0YWNrIG9mIGVuY2xvc2luZyBzY29wZXMgdXNlZCB3aGVuIGNvbnN0cnVjdGluZworCSAqIGEgY29tcGlsYXRpb24gdW5pdCBvciB0eXBlLiBUaGUgdG9wIG9mIHRoZSBzdGFjaworCSAqIGlzIHRoZSBkb2N1bWVudCBmcmFnbWVudCB0aGF0IGNoaWxkcmVuIGFyZSBhZGRlZCB0by4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RhY2sgZlN0YWNrID0gbnVsbDsJCisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGZpZWxkcyBjb25zdHJ1Y3RlZCBpbiB0aGUgY3VycmVudAorCSAqIGRvY3VtZW50LiBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyBhIHNpbmdsZQorCSAqIGZpZWxkIGRvY3VtZW50IGZyYWdtZW50LCBzaW5jZSB0aGUgRE9NQnVpbGRlciBvbmx5CisJICogYWNjZXB0cyBkb2N1bWVudHMgd2l0aCBvbmUgZmllbGQgZGVjbGFyYXRpb24uCisJICovCisJcHJvdGVjdGVkIGludCBmRmllbGRDb3VudDsKKworCS8qKgorCSAqIFRoZSBjdXJyZW50IG5vZGUgYmVpbmcgY29uc3RydWN0ZWQuCisJICovCisJcHJvdGVjdGVkIERPTU5vZGUgZk5vZGU7CisvKioKKyAqIEFic3RyYWN0RE9NQnVpbGRlciBjb25zdHJ1Y3Rvci4KKyAqLworcHVibGljIEFic3RyYWN0RE9NQnVpbGRlcigpIHsKKwlzdXBlcigpOworfQorLyoqCisgKiBBY2NlcHRzIHRoZSBsaW5lIHNlcGFyYXRvciB0YWJsZSBhbmQgY29udmVydHMgaXQgaW50byBhIGxpbmUgc3RhcnQgdGFibGUuCisgKgorICogPHA+QSBsaW5lIHNlcGFyYXRvciBtaWdodCBjb3JyZXNwb25kcyB0byBzZXZlcmFsIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZS4KKyAqCisgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSkKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHsKKwlpZiAocG9zaXRpb25zICE9IG51bGwpIHsKKwkJaW50IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGg7CisJCWlmIChsZW5ndGggPiAwKSB7CisJCQlmTGluZVN0YXJ0UG9zaXRpb25zID0gbmV3IGludFtsZW5ndGggKyAxXTsKKwkJCWZMaW5lU3RhcnRQb3NpdGlvbnNbMF0gPSAwOworCQkJaW50IGRvY3VtZW50TGVuZ3RoID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpbnQgaVBsdXNPbmUgPSBpICsgMTsKKwkJCQlpbnQgcG9zaXRpb25QbHVzT25lID0gcG9zaXRpb25zW2ldICsgMTsJCisJCQkJaWYgKHBvc2l0aW9uUGx1c09uZSA8IGRvY3VtZW50TGVuZ3RoKSB7CisJCQkJCWlmIChpUGx1c09uZSA8IGxlbmd0aCkgeworCQkJCQkJLy8gbW9yZSBzZXBhcmF0b3JzCisJCQkJCQlmTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIG5vIG1vcmUgc2VwYXJhdG9ycworCQkJCQkJaWYgKGZEb2N1bWVudFtwb3NpdGlvblBsdXNPbmVdID09ICdcbicpIHsKKwkJCQkJCQlmTGluZVN0YXJ0UG9zaXRpb25zW2lQbHVzT25lXSA9IHBvc2l0aW9uUGx1c09uZSArIDE7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZMaW5lU3RhcnRQb3NpdGlvbnNbaVBsdXNPbmVdID0gcG9zaXRpb25QbHVzT25lOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZkxpbmVTdGFydFBvc2l0aW9uc1tpUGx1c09uZV0gPSBwb3NpdGlvblBsdXNPbmU7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkge30KKy8qKgorICogQWRkcyB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgY3VycmVudCBlbmNsb3Npbmcgc2NvcGUsIGJ1aWxkaW5nIHRoZSBKRE9NCisgKiB0cmVlLiBOb2RlcyBhcmUgb25seSBhZGRlZCB0byBhbiBlbmNsb3Npbmcgc2NvcGUgd2hlbiBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgdHlwZQorICogaXMgYmVpbmcgYnVpbHQgKHNpbmNlIHRob3NlIGFyZSB0aGUgb25seSBub2RlcyB0aGF0IGhhdmUgY2hpbGRyZW4pLgorICoKKyAqIDxwPk5PVEU6IG5vZGVzIGFyZSBhZGRlZCB0byB0aGUgSkRPTSB2aWEgdGhlIG1ldGhvZCAjYmFzaWNBZGRDaGlsZCBzdWNoIHRoYXQKKyAqIHRoZSBub2RlcyBpbiB0aGUgbmV3bHkgY3JlYXRlZCBKRE9NIGFyZSBub3QgZnJhZ21lbnRlZC4gCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFkZENoaWxkKElET01Ob2RlIGNoaWxkKSB7CisJaWYgKGZTdGFjay5zaXplKCkgPiAwKSB7CisJCURPTU5vZGUgcGFyZW50ID0gKERPTU5vZGUpIGZTdGFjay5wZWVrKCk7CisJCWlmIChmQnVpbGRpbmdDVSB8fCBmQnVpbGRpbmdUeXBlKSB7CisJCQlwYXJlbnQuYmFzaWNBZGRDaGlsZChjaGlsZCk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQorICovCitwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoY2hhcltdIGNvbnRlbnRzLCBjaGFyW10gbmFtZSkgeworCXJldHVybiBjcmVhdGVDb21waWxhdGlvblVuaXQobmV3IENvbXBpbGF0aW9uVW5pdChjb250ZW50cywgbmFtZSkpOworfQorLyoqCisgKiBAc2VlIElET01GYWN0b3J5I2NyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcsIFN0cmluZykKKyAqLworcHVibGljIElET01Db21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisJaWYgKGZBYm9ydCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJZk5vZGUubm9ybWFsaXplKHRoaXMpOworCXJldHVybiAoSURPTUNvbXBpbGF0aW9uVW5pdClmTm9kZTsKK30KKy8qKgorICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2VudGVyQ2xhc3MoaW50LCBpbnRbXSwgaW50LCBpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgY2hhcltdLCBpbnQsIGludCwgY2hhcltdW10sIGludFtdLCBpbnRbXSwgaW50KQorICovCitwdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHsKKyAJaWYgKGZCdWlsZGluZ0NVKSB7CisJIAlJRE9NQ29tcGlsYXRpb25Vbml0IGN1PSBuZXcgRE9NQ29tcGlsYXRpb25Vbml0KGZEb2N1bWVudCwgbmV3IGludFtdIHswLCBmRG9jdW1lbnQubGVuZ3RoIC0gMX0pOworIAkJZlN0YWNrLnB1c2goY3UpOworIAl9Cit9CisvKioKKyAqIEZpbmlzaGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IERPTSBvYmplY3Qgd2hpY2gKKyAqIHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgZW50ZXJDb21waWxhdGlvblVuaXQgY2FsbC4KKyAqCisgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbXBpbGF0aW9uVW5pdChpbnQpCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRDb21waWxhdGlvblVuaXQoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJRE9NQ29tcGlsYXRpb25Vbml0IGN1ID0gKERPTUNvbXBpbGF0aW9uVW5pdCkgZlN0YWNrLnBvcCgpOworCWN1LnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwlmTm9kZSA9IGN1OworfQorLyoqCisgKiBGaW5pc2hlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2xhc3MgYW5kIGludGVyZmFjZSBET00gb2JqZWN0cy4KKyAqCisgKiBAcGFyYW0gYm9keUVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsb3NpbmcgYnJhY2tldCBvZiB0aGUgY2xhc3MKKyAqIEBwYXJhbSBkZWNsYXJhdGlvbkVuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3MKKyAqCQlkZWNsYXJhdGlvbi4gIFRoaXMgY2FuIGluY2x1ZGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgZm9sbG93aW5nIHRoZSBjbG9zaW5nIGJyYWNrZXQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4aXRUeXBlKGludCBib2R5RW5kLCBpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlET01UeXBlIHR5cGUgPSAoRE9NVHlwZSlmU3RhY2sucG9wKCk7CisJdHlwZS5zZXRTb3VyY2VSYW5nZUVuZChkZWNsYXJhdGlvbkVuZCk7CisJdHlwZS5zZXRDbG9zZUJvZHlSYW5nZVN0YXJ0KGJvZHlFbmQpOworCXR5cGUuc2V0Q2xvc2VCb2R5UmFuZ2VFbmQoYm9keUVuZCk7CisJZk5vZGUgPSB0eXBlOworfQorLyoqCisgKiBAc2VlIElMaW5lU3RhcnRGaW5kZXIjZ2V0TGluZVN0YXJ0KGludCkKKyAqLworcHVibGljIGludCBnZXRMaW5lU3RhcnQoaW50IHBvc2l0aW9uKSB7CisJaW50IGxpbmVTZXBhcmF0b3JDb3VudCA9IGZMaW5lU3RhcnRQb3NpdGlvbnMubGVuZ3RoOworCS8vIHJldmVyc2UgdHJhdmVyc2FsIGludGVudGlvbmFsLgorCWZvcihpbnQgaSA9IGxpbmVTZXBhcmF0b3JDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChmTGluZVN0YXJ0UG9zaXRpb25zW2ldIDw9IHBvc2l0aW9uKQorCQkJcmV0dXJuIGZMaW5lU3RhcnRQb3NpdGlvbnNbaV07CisJfQorCXJldHVybiAwOworfQorLyoqCisgKiBJbml0aWFsaXplcyB0aGUgYnVpbGRlciB0byBjcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudC4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSB0byBiZSBhbmFseXplZAorICogQHBhcmFtIGJ1aWxkaW5nQ29tcGlsYXRpb25Vbml0IC0gdHJ1ZSBpZiBhIHRoZSBkb2N1bWVudCBpcyBiZWluZyBhbmFseXplZCB0bworICoJCWNyZWF0ZSBhIGNvbXBpbGF0aW9uIHVuaXQsIG90aGVyd2lzZSBmYWxzZQorICogQHBhcmFtIGJ1aWxkaW5nVHlwZSAtIHRydWUgaWYgdGhlIGRvY3VtZW50IGlzIGJlaW5nIGFuYWx5emVkIHRvIGNyZWF0ZSBhCisgKgkJdHlwZSBvciBjb21waWxhdGlvbiB1bml0CisgKi8KK3Byb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdWlsZChjaGFyW10gc291cmNlQ29kZSwgYm9vbGVhbiBidWlsZGluZ0NvbXBpbGF0aW9uVW5pdCwgYm9vbGVhbiBidWlsZGluZ1R5cGUpIHsKKwlmQnVpbGRpbmdDVSA9IGJ1aWxkaW5nQ29tcGlsYXRpb25Vbml0OworCWZCdWlsZGluZ1R5cGUgPSBidWlsZGluZ1R5cGU7CisJZlN0YWNrID0gbmV3IFN0YWNrKCk7CisJZkRvY3VtZW50ID0gc291cmNlQ29kZTsKKwlmRmllbGRDb3VudCA9IDA7CisJZkFib3J0ID0gZmFsc2U7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDU4NzVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworCisvKioKKyAqIEltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIG9mIHRoZSBJQ29tcGlsYXRpb25Vbml0LgorICoKKyAqIDxwPlBsZWFzZSBkbyBub3QgdXNlIG91dHNpZGUgb2YgamRvbS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXQgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0IHsKKwlwcm90ZWN0ZWQgY2hhcltdIGZDb250ZW50czsKKwlwcm90ZWN0ZWQgY2hhcltdIGZGaWxlTmFtZTsKKwlwcm90ZWN0ZWQgY2hhcltdIGZNYWluVHlwZU5hbWU7CitwdWJsaWMgQ29tcGlsYXRpb25Vbml0KGNoYXJbXSBjb250ZW50cywgY2hhcltdIGZpbGVuYW1lKSB7CisJZkNvbnRlbnRzID0gY29udGVudHM7CisJZkZpbGVOYW1lID0gZmlsZW5hbWU7CisKKwlTdHJpbmcgZmlsZSA9IG5ldyBTdHJpbmcoZmlsZW5hbWUpOworCWludCBzdGFydCA9IGZpbGUubGFzdEluZGV4T2YoIi8iKSArIDE7IC8vJE5PTi1OTFMtMSQKKwlpZiAoc3RhcnQgPT0gMCB8fCBzdGFydCA8IGZpbGUubGFzdEluZGV4T2YoIlxcIikpIC8vJE5PTi1OTFMtMSQKKwkJc3RhcnQgPSBmaWxlLmxhc3RJbmRleE9mKCJcXCIpICsgMTsgLy8kTk9OLU5MUy0xJAorCisJaW50IGVuZCA9IGZpbGUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAorCWlmIChlbmQgPT0gLTEpCisJCWVuZCA9IGZpbGUubGVuZ3RoKCk7CisKKwlmTWFpblR5cGVOYW1lID0gZmlsZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudG9DaGFyQXJyYXkoKTsKK30KK3B1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJcmV0dXJuIGZDb250ZW50czsKK30KK3B1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJcmV0dXJuIGZGaWxlTmFtZTsKK30KK3B1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgeworCXJldHVybiBmTWFpblR5cGVOYW1lOworfQorcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCXJldHVybiBudWxsOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIkNvbXBpbGF0aW9uVW5pdFsiICsgbmV3IFN0cmluZyhmRmlsZU5hbWUpICsgIl0iOyAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWNkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDcxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NSW1wb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRG9jdW1lbnRFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5T3BzOworCisvKioKKyAqIFRoZSBET01CdWlsZGVyIGNvbnN0cnVjdHMgZWFjaCB0eXBlIG9mIEpET00gZG9jdW1lbnQgZnJhZ21lbnQsCisgKiBmb3IgdGhlIERPTUZhY3RvcnkuIFRoZSBET01CdWlsZGVyIGhhcyBiZWVuIHNlcGFyYXRlZCBmcm9tIHRoZQorICogRE9NRmFjdG9yeSB0byBoaWRlIHRoZSBpbXBsbWVudGF0aW9uIG9mIG5vZGUgY3JlYXRpb24gYW5kIHRoZQorICogcHVibGljIFJlcXVlc3RvciBBUEkgbWV0aG9kcy4KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBET01CdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RET01CdWlsZGVyIGltcGxlbWVudHMgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciB7CisJCisJLyoqCisJICogVHJ1ZSB3aGVuIHBhcnNpbmcgYSBzaW5nbGUgbWVtYmVyIC0gaWdub3JlIGFueSBwcm9ibGVtcworCSAqIGVuY291bnRlcmVkIGFmdGVyIHRoZSBtZW1iZXIuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZkJ1aWxkaW5nU2luZ2xlTWVtYmVyPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBUcnVlIHdoZW4gdGhlIHNpbmdsZSBtZW1iZXIgYmVpbmcgYnVpbHQgaGFzIGJlZW4KKwkgKiBleGl0ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZkZpbmlzaGVkU2luZ2xlTWVtYmVyID0gZmFsc2U7CQkKKworCS8qKgorCSAqIENvbGxlY3Rpb24gb2YgbXVsdGlwbGUgZmllbGRzIGluIG9uZSBkZWNsYXJhdGlvbgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZkZpZWxkczsKKworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgRE9NQnVpbGRlcgorICovCitwdWJsaWMgRE9NQnVpbGRlcigpIHt9CisvKioKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnRQb3NpdGlvbiwgYm9vbGVhbiBvbkRlbWFuZCkKKyAqLworcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGNoYXJbXSBuYW1lLCAKKwlpbnQgbmFtZVN0YXJ0LCBib29sZWFuIG9uRGVtYW5kKSB7CisJaW50W10gc291cmNlUmFuZ2UgPSB7ZGVjbGFyYXRpb25TdGFydCwgZGVjbGFyYXRpb25FbmR9OworCWludFtdIG5hbWVSYW5nZSA9IHtuYW1lU3RhcnQsIGRlY2xhcmF0aW9uRW5kIC0gMX07CisJCisJLyogU2VlIDFGVklJMVAgKi8KKwlTdHJpbmcgaW1wb3J0TmFtZSA9IENoYXJBcnJheU9wcy5zdWJzdHJpbmcoZkRvY3VtZW50LCBuYW1lUmFuZ2VbMF0sIG5hbWVSYW5nZVsxXSArIDEgLSBuYW1lUmFuZ2VbMF0pOworCisJZk5vZGU9IG5ldyBET01JbXBvcnQoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgaW1wb3J0TmFtZSwgbmFtZVJhbmdlLCBvbkRlbWFuZCk7CisJYWRkQ2hpbGQoZk5vZGUpOworCWlmIChmQnVpbGRpbmdTaW5nbGVNZW1iZXIpIHsKKwkJZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSB0cnVlOworCX0KK30KKy8qKgorICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2FjY2VwdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwgaW50IGJvZHlTdGFydCwgaW50IGJvZHlFbmQpCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIAorCWludCBtb2RpZmllcnNTdGFydCwgaW50IGJvZHlTdGFydCwgaW50IGJvZHlFbmQpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZH07CisJaW50W10gY29tbWVudFJhbmdlID0gey0xLCAtMX07CisJaWYgKGphdmFEb2NQb3NpdGlvbnMgIT0gbnVsbCkgeworCQlpbnQgbGVuZ3RoID0gamF2YURvY1Bvc2l0aW9ucy5sZW5ndGg7CisJCWNvbW1lbnRSYW5nZVswXSA9IGphdmFEb2NQb3NpdGlvbnNbbGVuZ3RoIC0gMl07CisJCWNvbW1lbnRSYW5nZVsxXSA9IGphdmFEb2NQb3NpdGlvbnNbbGVuZ3RoIC0gMV07CisJfQorCisJaW50W10gbW9kaWZpZXJzUmFuZ2UgPSB7LTEsIC0xfTsKKwlpZiAobW9kaWZpZXJzU3RhcnQgPiBkZWNsYXJhdGlvblN0YXJ0KSB7CisJCW1vZGlmaWVyc1JhbmdlWzBdID0gbW9kaWZpZXJzU3RhcnQ7CisJCW1vZGlmaWVyc1JhbmdlWzFdID0gYm9keVN0YXJ0IC0gMTsKKwl9CisJZk5vZGUgPSBuZXcgRE9NSW5pdGlhbGl6ZXIoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgY29tbWVudFJhbmdlLCBtb2RpZmllcnMsIAorCQltb2RpZmllcnNSYW5nZSwgYm9keVN0YXJ0KTsKKwlhZGRDaGlsZChmTm9kZSk7CisJaWYgKGZCdWlsZGluZ1NpbmdsZU1lbWJlcikgeworCQlmRmluaXNoZWRTaW5nbGVNZW1iZXI9IHRydWU7CisJfQorfQorLyoqCisgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjYWNjZXB0UGFja2FnZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydFBvc2l0aW9uKQorICovCitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGNoYXJbXSBuYW1lLCAKKwlpbnQgbmFtZVN0YXJ0UG9zaXRpb24pIHsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZH07CisJaW50W10gbmFtZVJhbmdlID0ge25hbWVTdGFydFBvc2l0aW9uLCBkZWNsYXJhdGlvbkVuZCAtIDF9OworCWZOb2RlPSBuZXcgRE9NUGFja2FnZShmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBDaGFyQXJyYXlPcHMuY2hhclRvU3RyaW5nKG5hbWUpLCBuYW1lUmFuZ2UpOworCWFkZENoaWxkKGZOb2RlKTsKKwlpZiAoZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7CisJCWZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKKwl9Cit9CisvKioKKyAqIFNldHMgdGhlIGFib3J0IGZsYWcgdG8gdHJ1ZS4gVGhlIHBhcnNlciBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IKKyAqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBJZiB3ZSBhcmUgb25seSBidWlsZGluZyBhIHNpbmdsZSBtZW1iZXIsIGFuZAorICogd2UgYXJlIGRvbmUgd2l0aCB0aGUgbWVtYmVyIC0gZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIGVycm9yLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0peworCWlmIChmQnVpbGRpbmdTaW5nbGVNZW1iZXIgJiYgZkZpbmlzaGVkU2luZ2xlTWVtYmVyKSB7CisJCXJldHVybjsKKwl9CisJZkFib3J0PSB0cnVlOworfQorLyoqCisgKiBBZGRzIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBjdXJyZW50IGVuY2xvc2luZyBzY29wZSwgYnVpbGRpbmcgdGhlIEpET00KKyAqIHRyZWUuIE5vZGVzIGFyZSBvbmx5IGFkZGVkIHRvIGFuIGVuY2xvc2luZyBzY29wZSB3aGVuIGEgY29tcGlsYXRpb24gdW5pdCBvciB0eXBlCisgKiBpcyBiZWluZyBidWlsdCAoc2luY2UgdGhvc2UgYXJlIHRoZSBvbmx5IG5vZGVzIHRoYXQgaGF2ZSBjaGlsZHJlbikuCisgKgorICogPHA+Tk9URTogbm9kZXMgYXJlIGFkZGVkIHRvIHRoZSBKRE9NIHZpYSB0aGUgbWV0aG9kICNiYXNpY0FkZENoaWxkIHN1Y2ggdGhhdAorICogdGhlIG5vZGVzIGluIHRoZSBuZXdseSBjcmVhdGVkIEpET00gYXJlIG5vdCBmcmFnbWVudGVkLiAKKyAqLworcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoSURPTU5vZGUgY2hpbGQpIHsKKwlzdXBlci5hZGRDaGlsZChjaGlsZCk7CisJaWYgKGZTdGFjay5pc0VtcHR5KCkgJiYgZkZpZWxkcyAhPSBudWxsKSB7CisJCWZGaWVsZHMuYWRkKGNoaWxkKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkKKyAqLworcHVibGljIElET01Db21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkgeworCXJldHVybiBuZXcgRE9NQ29tcGlsYXRpb25Vbml0KCk7Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQorICovCitwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKwlpbml0aWFsaXplQnVpbGQoY29tcGlsYXRpb25Vbml0LmdldENvbnRlbnRzKCksIHRydWUsIHRydWUsIGZhbHNlKTsKKwlnZXRQYXJzZXIoKS5wYXJzZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXQpOworCXJldHVybiBzdXBlci5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0KTsKK30KKy8qKgorICogQHNlZSBJRE9NRmFjdG9yeSNjcmVhdGVGaWVsZChTdHJpbmcpCisgKi8KK3B1YmxpYyBJRE9NRmllbGQgY3JlYXRlRmllbGQoY2hhcltdIHNvdXJjZUNvZGUpIHsKKwlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwlnZXRQYXJzZXIoKS5wYXJzZUZpZWxkKHNvdXJjZUNvZGUpOworCWlmIChmQWJvcnQgfHwgZk5vZGUgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyB3ZSBvbmx5IGFjY2VwdCBmaWVsZCBkZWNsYXJhdGlvbnMgd2l0aCBvbmUgZmllbGQKKwlpZiAoZkZpZWxkQ291bnQgPiAxKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlmTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NRmllbGQpZk5vZGU7Cit9CisvKioKKyAqIAorICovCitwdWJsaWMgSURPTUZpZWxkW10gY3JlYXRlRmllbGRzKGNoYXJbXSBzb3VyY2VDb2RlKSB7CisJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCWZGaWVsZHM9IG5ldyBBcnJheUxpc3QoKTsKKwlnZXRQYXJzZXIoKS5wYXJzZUZpZWxkKHNvdXJjZUNvZGUpOworCWlmIChmQWJvcnQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCUlET01GaWVsZFtdIGZpZWxkcz0gbmV3IElET01GaWVsZFtmRmllbGRzLnNpemUoKV07CisJZkZpZWxkcy50b0FycmF5KGZpZWxkcyk7CisJZm9yIChpbnQgaT0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworCQlET01Ob2RlIG5vZGU9IChET01Ob2RlKWZpZWxkc1tpXTsKKwkJaWYgKGkgPCAoZmllbGRzLmxlbmd0aCAtIDEpKSB7CisJCQlET01Ob2RlIG5leHQ9IChET01Ob2RlKWZpZWxkc1tpICsgMV07CisJCQlub2RlLmZOZXh0Tm9kZT0gbmV4dDsKKwkJCW5leHQuZlByZXZpb3VzTm9kZT0gbm9kZTsKKwkJfQorCQkoKERPTU5vZGUpZmllbGRzW2ldKS5ub3JtYWxpemUodGhpcyk7CisJfQorCXJldHVybiBmaWVsZHM7Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlSW1wb3J0KCkKKyAqLworcHVibGljIElET01JbXBvcnQgY3JlYXRlSW1wb3J0KCkgeworCXJldHVybiBuZXcgRE9NSW1wb3J0KCk7Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlSW1wb3J0KFN0cmluZykKKyAqLworcHVibGljIElET01JbXBvcnQgY3JlYXRlSW1wb3J0KGNoYXJbXSBzb3VyY2VDb2RlKSB7CisJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJZ2V0UGFyc2VyKCkucGFyc2VJbXBvcnQoc291cmNlQ29kZSk7CisJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlmTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NSW1wb3J0KWZOb2RlOworfQorLyoqCisgKiBDcmVhdGVzIGFuIElOSVRJQUxJWkVSIGRvY3VtZW50IGZyYWdtZW50IGZyb20gdGhlIGdpdmVuIHNvdXJjZS4KKyAqCisgKiBAc2VlIElET01GYWN0b3J5I2NyZWF0ZUluaXRpYWxpemVyKFN0cmluZykKKyAqLworcHVibGljIElET01Jbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcihjaGFyW10gc291cmNlQ29kZSkgeworCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCWdldFBhcnNlcigpLnBhcnNlSW5pdGlhbGl6ZXIoc291cmNlQ29kZSk7CisJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsIHx8ICEoZk5vZGUgaW5zdGFuY2VvZiBJRE9NSW5pdGlhbGl6ZXIpKSB7CisJCXJldHVybiBudWxsOworCX0KKwlmTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NSW5pdGlhbGl6ZXIpZk5vZGU7Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlTWV0aG9kKFN0cmluZykKKyAqLworcHVibGljIElET01NZXRob2QgY3JlYXRlTWV0aG9kKGNoYXJbXSBzb3VyY2VDb2RlKSB7CisJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJZ2V0UGFyc2VyKCkucGFyc2VNZXRob2Qoc291cmNlQ29kZSk7CisJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlmTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NTWV0aG9kKWZOb2RlOworfQorLyoqCisgKiBAc2VlIElET01GYWN0b3J5I2NyZWF0ZVBhY2thZ2UoKQorICovCitwdWJsaWMgSURPTVBhY2thZ2UgY3JlYXRlUGFja2FnZSgpIHsKKwlyZXR1cm4gbmV3IERPTVBhY2thZ2UoKTsKK30KKy8qKgorICogQHNlZSBJRE9NRmFjdG9yeSNjcmVhdGVQYWNrYWdlKFN0cmluZykKKyAqLworcHVibGljIElET01QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoY2hhcltdIHNvdXJjZUNvZGUpIHsKKwlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwlnZXRQYXJzZXIoKS5wYXJzZVBhY2thZ2Uoc291cmNlQ29kZSk7CisJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlmTm9kZS5ub3JtYWxpemUodGhpcyk7CisJcmV0dXJuIChJRE9NUGFja2FnZSlmTm9kZTsKK30KKy8qKgorICogQHNlZSBJRE9NRmFjdG9yeSNjcmVhdGVUeXBlKFN0cmluZykKKyAqLworcHVibGljIElET01UeXBlIGNyZWF0ZVR5cGUoY2hhcltdIHNvdXJjZUNvZGUpIHsKKwlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKwlnZXRQYXJzZXIoKS5wYXJzZVR5cGUoc291cmNlQ29kZSk7CisJaWYgKGZBYm9ydCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJaWYgKGZOb2RlICE9IG51bGwpIGZOb2RlLm5vcm1hbGl6ZSh0aGlzKTsKKwlyZXR1cm4gKElET01UeXBlKWZOb2RlOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IERPTU1ldGhvZCBhbmQgaW5pemlhbGl6ZXMuCisgKgorICogQHBhcmFtIGRlY2xhcmF0aW9uU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgCisgKgkJb2YgdGhpcyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgorICogQHBhcmFtIG1vZGlmaWVycyAtIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgY29uc3RydWN0b3IgY29udmVydGVkIHRvIGEgZmxhZworICogQHBhcmFtIG1vZGlmaWVyc1N0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQorICoJCXRleHR1YWwgbW9kaWZpZXJzCisgKiBAcGFyYW0gcmV0dXJuVHlwZSAtIHRoZSBuYW1lIG9mIHRoZSByZXR1cm4gdHlwZQorICogQHBhcmFtIHJldHVyblR5cGVTdGFydCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgorICoJCW9mIHRoZSByZXR1cm4gdHlwZQorICogQHBhcmFtIHJldHVyblR5cGVFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlcgorICoJCW9mIHRoZSByZXR1cm4gdHlwZQorICogQHBhcmFtIHJldHVyblR5cGVEaW1lbnNpb25Db3VudCAtIHRoZSBhcnJheSBkaW1lbnNpb24gY291bnQgYXMgc3VwcGxpZWQgb24gdGhlCisgKgkJcmV0dXJuIHR5cGUsIGkuZS4gcHVibGljIGludFtdIGZvbygpIHt9CisgKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoaXMgY29uc3RydWN0b3IKKyAqIEBwYXJhbSBuYW1lU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUKKyAqIEBwYXJhbSBuYW1lRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyAtIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdHlwZSBuYW1lcworICogQHBhcmFtIHBhcmFtZXRlclR5cGVTdGFydHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICoJCWZpcnN0IGNoYXJhY3RlciBvZiBlYWNoIHBhcmFtZXRlciB0eXBlIG5hbWUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlRW5kcyAtIGEgbGlzdCBvZiBzb3VyY2UgcG9zaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKgkJbGFzdCBjaGFyYWN0ZXIgb2YgZWFjaCBwYXJhbWV0ZXIgdHlwZSBuYW1lCisgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZXMgLSBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gcGFyYW1ldGVyc0VuZCAtIGEgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZQorICoJCXBhcmFtZXRlciBsaXN0CisgKiBAZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQgLSB0aGUgYXJyYXkgZGltZW5zaW9uIGNvdW50IGFzIHN1cHBsaWVkIG9uIHRoZQorICoJCWVuZCBvZiB0aGUgcGFyYW1ldGVyIGxpc3QsIGkuZS4gcHVibGljIGludCBmb28oKVtdIHt9CisgKiBAZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAqCQlvZiB0aGUgZXh0ZW5kZWQgcmV0dXJuIHR5cGUgZGltZW5zaW9uCisgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZXMgLSBhIGxpc3Qgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlcworICogQHBhcmFtIGV4Y2VwdGlvblR5cGVTdGFydHMgLSBhIGxpc3Qgb2Ygc291cmNlIHBvc2l0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdAorICoJCWNoYXJhY3RlciBvZiB0aGUgcmVzcGVjdGl2ZSBleGNlcHRpb24gdHlwZXMKKyAqIEBwYXJhbSBleGNlcHRpb25UeXBlRW5kcyAtIGEgbGlzdCBvZiBzb3VyY2UgcG9zaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QKKyAqCQljaGFyYWN0ZXIgb2YgdGhlIHJlc3BlY3RpdmUgZXhjZXB0aW9uIHR5cGVzCisgKiBAcGFyYW0gYm9keVN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgb2YgdGhpcyAKKyAqCQljb25zdHJ1Y3RvcidzIGJvZHkKKyAqLworcHJvdGVjdGVkIHZvaWQgZW50ZXJBYnN0cmFjdE1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCAKKwljaGFyW10gcmV0dXJuVHlwZSwgaW50IHJldHVyblR5cGVTdGFydCwgaW50IHJldHVyblR5cGVFbmQsIGludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAorCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGludFtdIHBhcmFtZXRlclR5cGVTdGFydHMsIAorCWludFtdIHBhcmFtZXRlclR5cGVFbmRzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgaW50W10gcGFyYW1ldGVyTmFtZVN0YXJ0cywgCisJaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCBpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLCBpbnRbXSBleGNlcHRpb25UeXBlU3RhcnRzLCAKKwlpbnRbXSBleGNlcHRpb25UeXBlRW5kcywgaW50IGJvZHlTdGFydCwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7CisJaW50W10gc291cmNlUmFuZ2UgPSB7ZGVjbGFyYXRpb25TdGFydCwgLTF9OyAvLyB3aWxsIGJlIGZpeGVkIHVwIG9uIGV4aXQKKwlpbnRbXSBuYW1lUmFuZ2UgPSB7bmFtZVN0YXJ0LCBuYW1lRW5kfTsKKwlpbnRbXSBjb21tZW50UmFuZ2UgPSB7LTEsIC0xfTsKKwlpZiAoamF2YURvY1Bvc2l0aW9ucyAhPSBudWxsKSB7CisJCWludCBsZW5ndGggPSBqYXZhRG9jUG9zaXRpb25zLmxlbmd0aDsKKwkJY29tbWVudFJhbmdlWzBdID0gamF2YURvY1Bvc2l0aW9uc1swXTsKKwkJY29tbWVudFJhbmdlWzFdID0gamF2YURvY1Bvc2l0aW9uc1tsZW5ndGggLSAxXTsKKwl9CisJaW50W10gbW9kaWZpZXJzUmFuZ2UgPSB7LTEsIC0xfTsKKwlpZiAobW9kaWZpZXJzU3RhcnQgPiAtMSkgeworCQltb2RpZmllcnNSYW5nZVswXSA9IG1vZGlmaWVyc1N0YXJ0OworCQlpZiAoaXNDb25zdHJ1Y3RvcikgeworCQkJbW9kaWZpZXJzUmFuZ2VbMV0gPSBuYW1lU3RhcnQgLSAxOworCQl9IGVsc2UgeworCQkJbW9kaWZpZXJzUmFuZ2VbMV0gPSByZXR1cm5UeXBlU3RhcnQgLSAxOworCQl9CisJfQorCWludFtdIHJldHVyblR5cGVSYW5nZSA9IG51bGw7CisJCisJaWYgKGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50ID4gMCkKKwkJcmV0dXJuVHlwZVJhbmdlID0gbmV3IGludFtdIHtyZXR1cm5UeXBlU3RhcnQsIHJldHVyblR5cGVFbmQsIAorCQkJcGFyYW1ldGVyc0VuZCArIDEsIGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZH07CisJZWxzZQorCQlyZXR1cm5UeXBlUmFuZ2UgPSBuZXcgaW50W10ge3JldHVyblR5cGVTdGFydCwgcmV0dXJuVHlwZUVuZH07CisJaW50W10gcGFyYW1ldGVyUmFuZ2UgPSB7bmFtZUVuZCArIDEsIHBhcmFtZXRlcnNFbmR9OworCWludFtdIGV4Y2VwdGlvblJhbmdlID0gey0xLCAtMX07CisJaWYgKGV4Y2VwdGlvblR5cGVzICE9IG51bGwgJiYgZXhjZXB0aW9uVHlwZXMubGVuZ3RoID4gMCkgeworCQlpbnQgZXhjZXB0aW9uQ291bnQgPSBleGNlcHRpb25UeXBlcy5sZW5ndGg7CisJCWV4Y2VwdGlvblJhbmdlWzBdID0gZXhjZXB0aW9uVHlwZVN0YXJ0c1swXTsKKwkJZXhjZXB0aW9uUmFuZ2VbMV0gPSBleGNlcHRpb25UeXBlRW5kc1tleGNlcHRpb25Db3VudCAtIDFdOworCX0KKwlpbnRbXSBib2R5UmFuZ2UgPSBudWxsOworCWlmIChleGNlcHRpb25SYW5nZVsxXSA+IC0xKSB7CisJCWJvZHlSYW5nZSA9IG5ldyBpbnRbXSB7ZXhjZXB0aW9uUmFuZ2VbMV0gKyAxLCAtMX07IC8vIHdpbGwgYmUgZml4ZWQgdXAgb24gZXhpdAorCX0gZWxzZSB7CisJCWJvZHlSYW5nZSA9IG5ldyBpbnRbXSB7cGFyYW1ldGVyc0VuZCArIDEsIC0xfTsKKwl9CisJZk5vZGUgPSBuZXcgRE9NTWV0aG9kKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJBcnJheU9wcy5jaGFyVG9TdHJpbmcobmFtZSksIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCBtb2RpZmllcnMsIAorCQltb2RpZmllcnNSYW5nZSwgaXNDb25zdHJ1Y3RvciwgQ2hhckFycmF5T3BzLmNoYXJUb1N0cmluZyhyZXR1cm5UeXBlKSwgcmV0dXJuVHlwZVJhbmdlLAorCQlDaGFyQXJyYXlPcHMuY2hhcmNoYXJUb1N0cmluZyhwYXJhbWV0ZXJUeXBlcyksCisJCUNoYXJBcnJheU9wcy5jaGFyY2hhclRvU3RyaW5nKHBhcmFtZXRlck5hbWVzKSwgCisJCXBhcmFtZXRlclJhbmdlLCBDaGFyQXJyYXlPcHMuY2hhcmNoYXJUb1N0cmluZyhleGNlcHRpb25UeXBlcyksIGV4Y2VwdGlvblJhbmdlLCBib2R5UmFuZ2UpOworCWFkZENoaWxkKGZOb2RlKTsKKwlmU3RhY2sucHVzaChmTm9kZSk7Cit9CisvKioKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNlbnRlckNsYXNzKAorCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCWludFtdIGphdmFEb2NQb3NpdGlvbnMsCisJaW50IG1vZGlmaWVycywKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCisJaW50IGNsYXNzU3RhcnQsIAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU3RhcnQsCisJaW50IG5hbWVFbmQsCisJY2hhcltdIHN1cGVyY2xhc3MsCisJaW50IHN1cGVyY2xhc3NTdGFydCwKKwlpbnQgc3VwZXJjbGFzc0VuZCwKKwljaGFyW11bXSBzdXBlcmludGVyZmFjZXMsCisJaW50W10gc3VwZXJpbnRlcmZhY2VTdGFydHMsCisJaW50W10gc3VwZXJpbnRlcmZhY2VFbmRzLAorCWludCBib2R5U3RhcnQpCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ2xhc3MoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludFtdIGphdmFEb2NQb3NpdGlvbnMsIGludCBtb2RpZmllcnMsIGludCBtb2RpZmllcnNTdGFydCwgaW50IGtleXdvcmRTdGFydCwgCisJY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW10gc3VwZXJjbGFzcywgaW50IHN1cGVyY2xhc3NTdGFydCwgCisJaW50IHN1cGVyY2xhc3NFbmQsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcywgaW50W10gc3VwZXJpbnRlcmZhY2VTdGFydHMsIAorCWludFtdIHN1cGVyaW50ZXJmYWNlRW5kcywgaW50IGJvZHlTdGFydCkgeworCisJZW50ZXJUeXBlKGRlY2xhcmF0aW9uU3RhcnQsIGphdmFEb2NQb3NpdGlvbnMsIG1vZGlmaWVycywgbW9kaWZpZXJzU3RhcnQsIGtleXdvcmRTdGFydCwKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBzdXBlcmNsYXNzLCBzdXBlcmNsYXNzU3RhcnQsIAorCQlzdXBlcmNsYXNzRW5kLCBzdXBlcmludGVyZmFjZXMsIHN1cGVyaW50ZXJmYWNlU3RhcnRzLCAKKwkJc3VwZXJpbnRlcmZhY2VFbmRzLCBib2R5U3RhcnQsIHRydWUpOworfQorLyoqCisgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJDb25zdHJ1Y3RvcigKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnQgbW9kaWZpZXJzLAorCWludCBtb2RpZmllcnNTdGFydCwgCisJY2hhcltdIG5hbWUsCisJaW50IG5hbWVTdGFydCwKKwlpbnQgbmFtZUVuZCwKKwljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZVN0YXJ0cywKKwlpbnQgW10gcGFyYW1ldGVyVHlwZUVuZHMsCQkJCisJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVTdGFydHMsCisJaW50IFtdIHBhcmFtZXRlck5hbWVFbmRzLAorCWludCBwYXJhbWV0ZXJzRW5kLAkKKwljaGFyW11bXSBleGNlcHRpb25UeXBlcywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZVN0YXJ0cywKKwlpbnQgW10gZXhjZXB0aW9uVHlwZUVuZHMsCisJaW50IGJvZHlTdGFydCkKKyAqLworcHVibGljIHZvaWQgZW50ZXJDb25zdHJ1Y3RvcihpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCAKKwljaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCAKKwlpbnRbXSBwYXJhbWV0ZXJUeXBlU3RhcnRzLCBpbnRbXSBwYXJhbWV0ZXJUeXBlRW5kcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIAorCWludFtdIHBhcmFtZXRlck5hbWVTdGFydHMsIGludFtdIHBhcmFtZXRlck5hbWVFbmRzLCBpbnQgcGFyYW1ldGVyc0VuZCwgCisJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsIGludFtdIGV4Y2VwdGlvblR5cGVTdGFydHMsIGludFtdIGV4Y2VwdGlvblR5cGVFbmRzLCAKKwlpbnQgYm9keVN0YXJ0KSB7CisJCQorCS8qIHNlZSAxRlZJSVFaICovCisJU3RyaW5nIG5hbWVTdHJpbmcgPSBuZXcgU3RyaW5nKGZEb2N1bWVudCwgbmFtZVN0YXJ0LCBuYW1lRW5kIC0gbmFtZVN0YXJ0KTsKKwlpbnQgb3BlblBhcmVuUG9zaXRpb24gPSBuYW1lU3RyaW5nLmluZGV4T2YoJygnKTsKKwlpZiAob3BlblBhcmVuUG9zaXRpb24gPiAtMSkKKwkJbmFtZUVuZCA9IG5hbWVTdGFydCArIG9wZW5QYXJlblBvc2l0aW9uIC0gMTsKKwkJCisJZW50ZXJBYnN0cmFjdE1ldGhvZChkZWNsYXJhdGlvblN0YXJ0LCBqYXZhRG9jUG9zaXRpb25zLCBtb2RpZmllcnMsIG1vZGlmaWVyc1N0YXJ0LCAKKwkJbnVsbCwgLTEsIC0xLCAwLCAKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZVN0YXJ0cywgCisJCXBhcmFtZXRlclR5cGVFbmRzLCBwYXJhbWV0ZXJOYW1lcywgcGFyYW1ldGVyTmFtZVN0YXJ0cywgCisJCXBhcmFtZXRlck5hbWVFbmRzLCBwYXJhbWV0ZXJzRW5kLCAwLCAKKwkJLTEsIGV4Y2VwdGlvblR5cGVzLCBleGNlcHRpb25UeXBlU3RhcnRzLCAKKwkJZXhjZXB0aW9uVHlwZUVuZHMsIGJvZHlTdGFydCx0cnVlKTsKK30KKy8qKgorICogQHNlZSBJRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yI2VudGVyRmllbGQoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50IG1vZGlmaWVycywKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCisJY2hhcltdIHR5cGUsCisJaW50IHR5cGVTdGFydCwKKwlpbnQgdHlwZUVuZCwKKyAJaW50IHR5cGVEaW1lbnNpb25Db3VudCwKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LAorCWludCBuYW1lRW5kLAorCWludCBleHRlbmRlZFR5cGVEaW1lbnNpb25Db3VudCwKKwlpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uRW5kKQorICovCitwdWJsaWMgdm9pZCBlbnRlckZpZWxkKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCBpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXJzU3RhcnQsIAorCWNoYXJbXSB0eXBlLCBpbnQgdHlwZVN0YXJ0LCBpbnQgdHlwZUVuZCwgaW50IHR5cGVEaW1lbnNpb25Db3VudCwgY2hhcltdIG5hbWUsIAorCWludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBpbnQgZXh0ZW5kZWRUeXBlRGltZW5zaW9uQ291bnQsIAorCWludCBleHRlbmRlZFR5cGVEaW1lbnNpb25FbmQpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCAKKwkJKGV4dGVuZGVkVHlwZURpbWVuc2lvbkVuZCA+IG5hbWVFbmQpID8gZXh0ZW5kZWRUeXBlRGltZW5zaW9uRW5kIDogbmFtZUVuZH07CisJaW50W10gbmFtZVJhbmdlID0ge25hbWVTdGFydCwgbmFtZUVuZH07CisJaW50W10gY29tbWVudFJhbmdlID0gey0xLCAtMX07CisJCWlmIChqYXZhRG9jUG9zaXRpb25zICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGggPSBqYXZhRG9jUG9zaXRpb25zLmxlbmd0aDsKKwkJCWNvbW1lbnRSYW5nZVswXSA9IGphdmFEb2NQb3NpdGlvbnNbMF07CisJCQljb21tZW50UmFuZ2VbMV0gPSBqYXZhRG9jUG9zaXRpb25zW2xlbmd0aCAtIDFdOworCQl9CisJaW50W10gbW9kaWZpZXJzUmFuZ2UgPSB7LTEsIC0xfTsKKwlpZiAobW9kaWZpZXJzU3RhcnQgPiAtMSkgeworCQltb2RpZmllcnNSYW5nZVswXSA9IG1vZGlmaWVyc1N0YXJ0OworCQltb2RpZmllcnNSYW5nZVsxXSA9IHR5cGVTdGFydCAtIDE7CisJfQorCWludFtdIHR5cGVSYW5nZSA9IHt0eXBlU3RhcnQsIHR5cGVFbmR9OworCWJvb2xlYW4gaGFzSW5pdGlhbGl6ZXIgPSBmYWxzZTsgLy8gZml4ZWQgb24gZXhpdEZpZWxkCisJaW50W10gaW5pdGlhbGl6ZXJSYW5nZSA9IHstMSwgLTF9OyAvLyBmaXhlZCBvbiBleGl0RmllbGQKKwlib29sZWFuIGlzVmFyaWFibGVEZWNsYXJhdG9yID0gZmFsc2U7CisJaWYgKGZOb2RlIGluc3RhbmNlb2YgRE9NRmllbGQpIHsKKwkJRE9NRmllbGQgZmllbGQgPSAoRE9NRmllbGQpZk5vZGU7CisJCWlmIChmaWVsZC5mVHlwZVJhbmdlWzBdID09IHR5cGVTdGFydCkKKwkJCWlzVmFyaWFibGVEZWNsYXJhdG9yID0gdHJ1ZTsKKwl9CQorCWZOb2RlID0gbmV3IERPTUZpZWxkKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJBcnJheU9wcy5jaGFyVG9TdHJpbmcobmFtZSksIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCAKKwkJbW9kaWZpZXJzLCBtb2RpZmllcnNSYW5nZSwgdHlwZVJhbmdlLCBDaGFyQXJyYXlPcHMuY2hhclRvU3RyaW5nKHR5cGUpLCBoYXNJbml0aWFsaXplciwgCisJCWluaXRpYWxpemVyUmFuZ2UsIGlzVmFyaWFibGVEZWNsYXJhdG9yKTsKKwlhZGRDaGlsZChmTm9kZSk7CisJZlN0YWNrLnB1c2goZk5vZGUpOworfQorLyoqCisgKiBAc2VlIElEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJJbnRlcmZhY2UoCisJaW50IGRlY2xhcmF0aW9uU3RhcnQsCisJaW50W10gamF2YURvY1Bvc2l0aW9ucywJCisJaW50IG1vZGlmaWVycywKKwlpbnQgbW9kaWZpZXJzU3RhcnQsCisJaW50IGludGVyZmFjZVN0YXJ0LAorCWNoYXJbXSBuYW1lLAorCWludCBuYW1lU3RhcnQsCisJaW50IG5hbWVFbmQsCisJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzLAorCWludFtdIHN1cGVyaW50ZXJmYWNlU3RhcnRzLAorCWludFtdIHN1cGVyaW50ZXJmYWNlRW5kcywKKwlpbnQgYm9keVN0YXJ0KQorICovCitwdWJsaWMgdm9pZCBlbnRlckludGVyZmFjZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCBpbnQga2V5d29yZFN0YXJ0LAorCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzLCAKKwlpbnRbXSBzdXBlcmludGVyZmFjZVN0YXJ0cywgaW50W10gc3VwZXJpbnRlcmZhY2VFbmRzLCBpbnQgYm9keVN0YXJ0KSB7CisKKwllbnRlclR5cGUoZGVjbGFyYXRpb25TdGFydCwgamF2YURvY1Bvc2l0aW9ucywgbW9kaWZpZXJzLCBtb2RpZmllcnNTdGFydCwga2V5d29yZFN0YXJ0LAorCQluYW1lLCBuYW1lU3RhcnQsIG5hbWVFbmQsIG51bGwsIC0xLCAtMSwgc3VwZXJpbnRlcmZhY2VzLCAKKwkJc3VwZXJpbnRlcmZhY2VTdGFydHMsIHN1cGVyaW50ZXJmYWNlRW5kcywgYm9keVN0YXJ0LCBmYWxzZSk7Cit9CisvKioKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNlbnRlck1ldGhvZCgKKwlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwlpbnRbXSBqYXZhRG9jUG9zaXRpb25zLAkKKwlpbnQgbW9kaWZpZXJzLAorCWludCBtb2RpZmllcnNTdGFydCwgCisJY2hhcltdIHJldHVyblR5cGUsCisJaW50IHJldHVyblR5cGVTdGFydCwKKwlpbnQgcmV0dXJuVHlwZUVuZCwKKyAJaW50IHJldHVyblR5cGVEaW1lbnNpb25Db3VudCwKKwljaGFyW10gbmFtZSwKKwlpbnQgbmFtZVN0YXJ0LAorCWludCBuYW1lRW5kLAorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLAorCWludCBbXSBwYXJhbWV0ZXJUeXBlU3RhcnRzLAorCWludCBbXSBwYXJhbWV0ZXJUeXBlRW5kcywJCQkKKwljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKwlpbnQgW10gcGFyYW1ldGVyTmFtZVN0YXJ0cywKKwlpbnQgW10gcGFyYW1ldGVyTmFtZUVuZHMsCisJaW50IHBhcmFtZXRlcnNFbmQsCisJaW50IGV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkNvdW50LAorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsCQorCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLAorCWludCBbXSBleGNlcHRpb25UeXBlU3RhcnRzLAorCWludCBbXSBleGNlcHRpb25UeXBlRW5kcywKKwlpbnQgYm9keVN0YXJ0KQorICovCitwdWJsaWMgdm9pZCBlbnRlck1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50W10gamF2YURvY1Bvc2l0aW9ucywgaW50IG1vZGlmaWVycywgaW50IG1vZGlmaWVyc1N0YXJ0LCAKKwljaGFyW10gcmV0dXJuVHlwZSwgaW50IHJldHVyblR5cGVTdGFydCwgaW50IHJldHVyblR5cGVFbmQsIGludCByZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAorCWNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGludFtdIHBhcmFtZXRlclR5cGVTdGFydHMsIAorCWludFtdIHBhcmFtZXRlclR5cGVFbmRzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgaW50W10gcGFyYW1ldGVyTmFtZVN0YXJ0cywgCisJaW50W10gcGFyYW1ldGVyTmFtZUVuZHMsIGludCBwYXJhbWV0ZXJzRW5kLCBpbnQgZXh0ZW5kZWRSZXR1cm5UeXBlRGltZW5zaW9uQ291bnQsIAorCWludCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25FbmQsIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzLCBpbnRbXSBleGNlcHRpb25UeXBlU3RhcnRzLCAKKwlpbnRbXSBleGNlcHRpb25UeXBlRW5kcywgaW50IGJvZHlTdGFydCkgeworCWVudGVyQWJzdHJhY3RNZXRob2QoZGVjbGFyYXRpb25TdGFydCwgamF2YURvY1Bvc2l0aW9ucywgbW9kaWZpZXJzLCBtb2RpZmllcnNTdGFydCwgCisJCXJldHVyblR5cGUsIHJldHVyblR5cGVTdGFydCwgcmV0dXJuVHlwZUVuZCwgcmV0dXJuVHlwZURpbWVuc2lvbkNvdW50LCAKKwkJbmFtZSwgbmFtZVN0YXJ0LCBuYW1lRW5kLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZVN0YXJ0cywgCisJCXBhcmFtZXRlclR5cGVFbmRzLCBwYXJhbWV0ZXJOYW1lcywgcGFyYW1ldGVyTmFtZVN0YXJ0cywgCisJCXBhcmFtZXRlck5hbWVFbmRzLCBwYXJhbWV0ZXJzRW5kLCBleHRlbmRlZFJldHVyblR5cGVEaW1lbnNpb25Db3VudCwgCisJCWV4dGVuZGVkUmV0dXJuVHlwZURpbWVuc2lvbkVuZCwgZXhjZXB0aW9uVHlwZXMsIGV4Y2VwdGlvblR5cGVTdGFydHMsIAorCQlleGNlcHRpb25UeXBlRW5kcywgYm9keVN0YXJ0LGZhbHNlKTsKK30KKworcHJvdGVjdGVkIHZvaWQgZW50ZXJUeXBlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnRbXSBqYXZhRG9jUG9zaXRpb25zLCAKKwlpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXJzU3RhcnQsIGludCBrZXl3b3JkU3RhcnQsIGNoYXJbXSBuYW1lLCAKKwlpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdIHN1cGVyY2xhc3MsIGludCBzdXBlcmNsYXNzU3RhcnQsIAorCWludCBzdXBlcmNsYXNzRW5kLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMsIGludFtdIHN1cGVyaW50ZXJmYWNlU3RhcnRzLCAKKwlpbnRbXSBzdXBlcmludGVyZmFjZUVuZHMsIGludCBib2R5U3RhcnQsIGJvb2xlYW4gaXNDbGFzcykgeworCWlmIChmQnVpbGRpbmdUeXBlKSB7CisJCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIC0xfTsgLy8gd2lsbCBiZSBmaXhlZCBpbiB0aGUgZXhpdAorCQlpbnRbXSBjb21tZW50UmFuZ2UgPSB7LTEsIC0xfTsKKwkJaWYgKGphdmFEb2NQb3NpdGlvbnMgIT0gbnVsbCkgeworCQkJaW50IGxlbmd0aCA9IGphdmFEb2NQb3NpdGlvbnMubGVuZ3RoOworCQkJY29tbWVudFJhbmdlWzBdID0gamF2YURvY1Bvc2l0aW9uc1swXTsKKwkJCWNvbW1lbnRSYW5nZVsxXSA9IGphdmFEb2NQb3NpdGlvbnNbbGVuZ3RoIC0gMV07CisJCX0KKwkJaW50W10gbW9kaWZpZXJzUmFuZ2UgPSB7LTEsIC0xfTsKKwkJaWYgKG1vZGlmaWVyc1N0YXJ0ID4gLTEpIHsKKwkJCW1vZGlmaWVyc1JhbmdlWzBdID0gbW9kaWZpZXJzU3RhcnQ7CisJCQltb2RpZmllcnNSYW5nZVsxXSA9IChtb2RpZmllcnNTdGFydCA+IC0xKSA/IGtleXdvcmRTdGFydCAtIDEgOiAtMTsKKwkJfQorCQlpbnRbXSB0eXBlS2V5d29yZFJhbmdlID0ge2tleXdvcmRTdGFydCwgbmFtZVN0YXJ0IC0gMX07CisJCWludFtdIG5hbWVSYW5nZSA9IG5ldyBpbnRbXSB7bmFtZVN0YXJ0LCBuYW1lRW5kfTsKKwkJaW50W10gZXh0ZW5kc0tleXdvcmRSYW5nZSA9IHstMSwgLTF9OworCQlpbnRbXSBzdXBlcmNsYXNzUmFuZ2UgPSB7LTEsIC0xfTsKKwkJaW50W10gaW1wbGVtZW50c0tleXdvcmRSYW5nZSA9IHstMSwgLTF9OworCQlpbnRbXSBpbnRlcmZhY2VzUmFuZ2UgPSB7LTEsIC0xfTsKKwkJaWYgKGlzQ2xhc3MpIHsKKwkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCQlleHRlbmRzS2V5d29yZFJhbmdlWzBdID0gbmFtZUVuZCArIDE7CisJCQkJZXh0ZW5kc0tleXdvcmRSYW5nZVsxXSA9IHN1cGVyY2xhc3NTdGFydCAtIDE7CisJCQkJc3VwZXJjbGFzc1JhbmdlWzBdID0gc3VwZXJjbGFzc1N0YXJ0OworCQkJCXN1cGVyY2xhc3NSYW5nZVsxXSA9IGJvZHlTdGFydCAtIDE7CisJCQl9CisJCQlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwgJiYgc3VwZXJpbnRlcmZhY2VzLmxlbmd0aCA+IDApIHsKKwkJCQlzdXBlcmNsYXNzUmFuZ2VbMV0gPSBzdXBlcmNsYXNzRW5kOworCQkJCWlmIChzdXBlcmNsYXNzRW5kID4gLTEpIHsKKwkJCQkJaW1wbGVtZW50c0tleXdvcmRSYW5nZVswXSA9IHN1cGVyY2xhc3NFbmQgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCWltcGxlbWVudHNLZXl3b3JkUmFuZ2VbMF0gPSBuYW1lRW5kICsgMTsKKwkJCQl9CisJCQkJaW1wbGVtZW50c0tleXdvcmRSYW5nZVsxXSA9IHN1cGVyaW50ZXJmYWNlU3RhcnRzWzBdIC0gMTsKKwkJCQlpbnRlcmZhY2VzUmFuZ2VbMF0gPSBzdXBlcmludGVyZmFjZVN0YXJ0c1swXTsKKwkJCQlpbnRlcmZhY2VzUmFuZ2VbMV0gPSBzdXBlcmludGVyZmFjZUVuZHNbc3VwZXJpbnRlcmZhY2VzLmxlbmd0aCAtIDFdOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsICYmIHN1cGVyaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisJCQkJZXh0ZW5kc0tleXdvcmRSYW5nZVswXSA9IG5hbWVFbmQgKyAxOworCQkJCWV4dGVuZHNLZXl3b3JkUmFuZ2VbMV0gPSBzdXBlcmludGVyZmFjZVN0YXJ0c1swXSAtIDE7CisJCQkJaW50ZXJmYWNlc1JhbmdlWzBdID0gc3VwZXJpbnRlcmZhY2VTdGFydHNbMF07CisJCQkJaW50ZXJmYWNlc1JhbmdlWzFdID0gc3VwZXJpbnRlcmZhY2VFbmRzW3N1cGVyaW50ZXJmYWNlcy5sZW5ndGggLSAxXTsKKwkJCX0KKwkJfQorCQlpbnRbXSBvcGVuQm9keVJhbmdlID0ge2JvZHlTdGFydCwgLTF9OyAvLyBmaXhlZCBieSBzZXRUeXBlUmFuZ2VzKERPTU5vZGUpCisJCWludFtdIGNsb3NlQm9keVJhbmdlID0gey0xLCAtMX07IC8vIHdpbGwgYmUgZml4ZWQgaW4gZXhpdAkJCisJCWZOb2RlID0gbmV3IERPTVR5cGUoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmV3IFN0cmluZyhuYW1lKSwgbmFtZVJhbmdlLCBjb21tZW50UmFuZ2UsIAorCQkJbW9kaWZpZXJzLCBtb2RpZmllcnNSYW5nZSwgdHlwZUtleXdvcmRSYW5nZSwgc3VwZXJjbGFzc1JhbmdlLCBleHRlbmRzS2V5d29yZFJhbmdlLCAKKwkJCUNoYXJBcnJheU9wcy5jaGFyY2hhclRvU3RyaW5nKHN1cGVyaW50ZXJmYWNlcyksIGludGVyZmFjZXNSYW5nZSwKKwkJCWltcGxlbWVudHNLZXl3b3JkUmFuZ2UsIG9wZW5Cb2R5UmFuZ2UsIAorCQkJY2xvc2VCb2R5UmFuZ2UsIGlzQ2xhc3MpOworCQlhZGRDaGlsZChmTm9kZSk7CisJCWZTdGFjay5wdXNoKGZOb2RlKTsKKwl9Cit9CisvKioKKyAqIEZpbmlzaGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgKgorICogQHBhcmFtIGJvZHlFbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9zaW5nIGJyYWNrZXQgb2YgdGhlIG1ldGhvZAorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QKKyAqCQlkZWNsYXJhdGlvbi4gIFRoaXMgY2FuIGluY2x1ZGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgZm9sbG93aW5nIHRoZSBjbG9zaW5nIGJyYWNrZXQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4aXRBYnN0cmFjdE1ldGhvZChpbnQgYm9keUVuZCwgaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJRE9NTWV0aG9kIG1ldGhvZCA9IChET01NZXRob2QpIGZTdGFjay5wb3AoKTsKKwltZXRob2Quc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25FbmQpOworCW1ldGhvZC5zZXRCb2R5UmFuZ2VFbmQoYm9keUVuZCArIDEpOworCWZOb2RlID0gbWV0aG9kOworCWlmIChmQnVpbGRpbmdTaW5nbGVNZW1iZXIpIHsKKwkJZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSB0cnVlOworCX0KK30KKy8qKgorICogRmluaXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNsYXNzIERPTSBvYmplY3Qgd2hpY2gKKyAqIHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgZW50ZXJDbGFzcyBjYWxsLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0Q2xhc3MoaW50LCBpbnQpCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRDbGFzcyhpbnQgYm9keUVuZCwgaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdFR5cGUoYm9keUVuZCwgZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKiBGaW5pc2hlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbWV0aG9kIERPTSBvYmplY3Qgd2hpY2gKKyAqIHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgZW50ZXJDb25zdHJ1Y3RvciBjYWxsLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0Q29uc3RydWN0b3IoaW50LCBpbnQpCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRDb25zdHJ1Y3RvcihpbnQgYm9keUVuZCwgaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdEFic3RyYWN0TWV0aG9kKGJvZHlFbmQsIGRlY2xhcmF0aW9uRW5kKTsKK30KKy8qKgorICogRmluaXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpZWxkIERPTSBvYmplY3Qgd2hpY2gKKyAqIHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgZW50ZXJGaWVsZCBjYWxsLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0RmllbGQoaW50LCBpbnQpCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgYm9keUVuZCwgaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJRE9NRmllbGQgZmllbGQgPSAoRE9NRmllbGQpZlN0YWNrLnBvcCgpOworCWlmIChmaWVsZC5nZXRFbmRQb3NpdGlvbigpIDwgZGVjbGFyYXRpb25FbmQpIHsKKwkJZmllbGQuc2V0U291cmNlUmFuZ2VFbmQoZGVjbGFyYXRpb25FbmQpOworCQlpbnQgbmFtZUVuZCA9IGZpZWxkLmZOYW1lUmFuZ2VbMV07CisJCWlmIChuYW1lRW5kIDwgYm9keUVuZCkgeworCQkJLyogc2VlIDFGVklJVjggLSBvYnRhaW4gaW5pdGlhbGl6ZXIgcmFuZ2UgKi8KKwkJCVN0cmluZyBpbml0aWFsaXplciA9IG5ldyBTdHJpbmcoZkRvY3VtZW50LCBuYW1lRW5kICsgMSwgYm9keUVuZCAtIG5hbWVFbmQpOworCQkJaW50IGluZGV4ID0gaW5pdGlhbGl6ZXIuaW5kZXhPZignPScpOworCQkJaWYgKGluZGV4ID4gLTEpIHsKKwkJCQlmaWVsZC5zZXRIYXNJbml0aWFsaXplcih0cnVlKTsKKwkJCQlmaWVsZC5zZXRJbml0aWFsaXplclJhbmdlKG5hbWVFbmQgKyBpbmRleCArIDIsIGJvZHlFbmQpOworCQkJfQorCQl9CisJfQorCWZGaWVsZENvdW50Kys7CisJZk5vZGUgPSBmaWVsZDsKKwlpZiAoZkJ1aWxkaW5nU2luZ2xlTWVtYmVyKSB7CisJCWZGaW5pc2hlZFNpbmdsZU1lbWJlcj0gdHJ1ZTsKKwl9Cit9CisvKioKKyAqIEZpbmlzaGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgRE9NIG9iamVjdCB3aGljaAorICogd2FzIGNyZWF0ZWQgYnkgYSBwcmV2aW91cyBlbnRlckludGVyZmFjZSBjYWxsLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0SW50ZXJmYWNlKGludCwgaW50KQorICovCitwdWJsaWMgdm9pZCBleGl0SW50ZXJmYWNlKGludCBib2R5RW5kLCBpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0VHlwZShib2R5RW5kLCBkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqIEZpbmlzaGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBtZXRob2QgRE9NIG9iamVjdCB3aGljaAorICogd2FzIGNyZWF0ZWQgYnkgYSBwcmV2aW91cyBlbnRlck1ldGhvZCBjYWxsLgorICoKKyAqIEBzZWUgSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciNleGl0TWV0aG9kKGludCwgaW50KQorICovCitwdWJsaWMgdm9pZCBleGl0TWV0aG9kKGludCBib2R5RW5kLCBpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0QWJzdHJhY3RNZXRob2QoYm9keUVuZCwgZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHBhcnNlci4KKyAqLworcHJvdGVjdGVkIERvY3VtZW50RWxlbWVudFBhcnNlciBnZXRQYXJzZXIoKSB7CisJcmV0dXJuIG5ldyBEb2N1bWVudEVsZW1lbnRQYXJzZXIodGhpcywgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpLCBuZXcgQ29tcGlsZXJPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSkpOworfQorLyoqCisgKiBJbml0aWFsaXplcyB0aGUgYnVpbGRlciB0byBjcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudC4KKyAqCisgKiBAcGFyYW0gc291cmNlQ29kZSAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSB0byBiZSBhbmFseXplZAorICogQHBhcmFtIGJ1aWxkaW5nQ29tcGlsYXRpb25Vbml0IC0gdHJ1ZSBpZiBhIHRoZSBkb2N1bWVudCBpcyBiZWluZyBhbmFseXplZCB0bworICoJCWNyZWF0ZSBhIGNvbXBpbGF0aW9uIHVuaXQsIG90aGVyd2lzZSBmYWxzZQorICogQHBhcmFtIGJ1aWxkaW5nVHlwZSAtIHRydWUgaWYgdGhlIGRvY3VtZW50IGlzIGJlaW5nIGFuYWx5emVkIHRvIGNyZWF0ZSBhCisgKgkJdHlwZSBvciBjb21waWxhdGlvbiB1bml0CisgKiBAcGFyYW0gc2luZ2xlTWVtYmVyIC0gdHJ1ZSBpZiBidWlsZGluZyBhIHNpbmdsZSBtZW1iZXIKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1aWxkKGNoYXJbXSBzb3VyY2VDb2RlLCBib29sZWFuIGJ1aWxkaW5nQ29tcGlsYXRpb25Vbml0LCBib29sZWFuIGJ1aWxkaW5nVHlwZSwgYm9vbGVhbiBzaW5nbGVNZW1iZXIpIHsKKwlzdXBlci5pbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgYnVpbGRpbmdDb21waWxhdGlvblVuaXQsIGJ1aWxkaW5nVHlwZSk7CisJZkJ1aWxkaW5nU2luZ2xlTWVtYmVyPSBzaW5nbGVNZW1iZXI7CisJZkZpbmlzaGVkU2luZ2xlTWVtYmVyPSBmYWxzZTsKKworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MjJhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DaGFyQXJyYXlCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DaGFyQXJyYXlPcHM7CisKKy8qKgorICogRE9NQ29tcGlsYXRpb24gdW5pdCBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJRE9NQ29tcGlsYXRpb25Vbml0LgorICoKKyAqIEBzZWUgSURPTUNvbXBpbGF0aW9uVW5pdAorICogQHNlZSBET01Ob2RlCisgKi8KK2NsYXNzIERPTUNvbXBpbGF0aW9uVW5pdCBleHRlbmRzIERPTU5vZGUgaW1wbGVtZW50cyBJRE9NQ29tcGlsYXRpb25Vbml0IHsKKworCS8qKgorCSAqIFRoZSBjb21tZW50IGFuZC9vciB3aGl0ZXNwYWNlIHByZWNlZGluZyB0aGUKKwkgKiBmaXJzdCBkb2N1bWVudCBmcmFnbWVudCBpbiB0aGlzIGNvbXBpbGF0aW9uCisJICogdW5pdC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZIZWFkZXI7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgQ09NUElMQVRJT05fVU5JVCBkb2N1bWVudCBmcmFnbWVudC4KKyAqLworRE9NQ29tcGlsYXRpb25Vbml0KCkgeworCWZIZWFkZXI9IiI7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBDT01QSUxBVElPTl9VTklUIG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQSBjb21waWxhdGlvbiB1bml0J3Mgc291cmNlIHJhbmdlIGlzIHRoZSBlbnRpcmUgZG9jdW1lbnQgLSBpLmUuCisgKgkJdGhlIGZpcnN0IGludGVnZXIgaXMgemVybywgYW5kIHRoZSBzZWNvbmQgaW50ZWdlciBpcyB0aGUgcG9zaXRpb24KKyAqCQlvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGRvY3VtZW50LgorICovCitET01Db21waWxhdGlvblVuaXQoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSkgeworCXN1cGVyKGRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbnVsbCwgbmV3IGludFtdey0xLCAtMX0pOworCWZIZWFkZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBAc2VlIERPTU5vZGUjYXBwZW5kQ29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWJ1ZmZlci5hcHBlbmQoZ2V0SGVhZGVyKCkpOworCWFwcGVuZENvbnRlbnRzT2ZDaGlsZHJlbihidWZmZXIpOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2NhbkhhdmVDaGlsZHJlbigpCisgKi8KK3B1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogQHNlZSBJRE9NQ29tcGlsYXRpb25Vbml0I2dldEhlYWRlcigpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKCkgeworCXJldHVybiBmSGVhZGVyOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldEphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7CisJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpcGFyZW50KS5nZXRDb21waWxhdGlvblVuaXQoZ2V0TmFtZSgpKTsKKwl9IGVsc2UgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50IikpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBAc2VlIElET01Db21waWxhdGlvblVuaXQjZ2V0TmFtZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgCisJSURPTVR5cGUgdG9wTGV2ZWxUeXBlPSBudWxsOworCUlET01UeXBlIGZpcnN0VHlwZT0gbnVsbDsKKwlJRE9NTm9kZSBjaGlsZD0gZkZpcnN0Q2hpbGQ7CisJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKKwkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuVFlQRSkgeworCQkJSURPTVR5cGUgdHlwZT0gKElET01UeXBlKWNoaWxkOworCQkJaWYgKGZpcnN0VHlwZSA9PSBudWxsKSB7CisJCQkJZmlyc3RUeXBlPSB0eXBlOworCQkJfQorCQkJaWYgKEZsYWdzLmlzUHVibGljKHR5cGUuZ2V0RmxhZ3MoKSkpIHsKKwkJCQl0b3BMZXZlbFR5cGU9IHR5cGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2hpbGQ9IGNoaWxkLmdldE5leHROb2RlKCk7CisJfQorCWlmICh0b3BMZXZlbFR5cGUgPT0gbnVsbCkgeworCQl0b3BMZXZlbFR5cGU9IGZpcnN0VHlwZTsKKwl9CisJaWYgKHRvcExldmVsVHlwZSAhPSBudWxsKSB7CisJCXJldHVybiB0b3BMZXZlbFR5cGUuZ2V0TmFtZSgpICsgIi5qYXZhIjsgIC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Tm9kZVR5cGUoKQorICovCitwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCXJldHVybiBJRE9NTm9kZS5DT01QSUxBVElPTl9VTklUOworfQorLyoqCisgKiBTZXRzIHRoZSBoZWFkZXIKKyAqLworcHJvdGVjdGVkIHZvaWQgaW5pdGFsaXplSGVhZGVyKCkgeworCURPTU5vZGUgY2hpbGQgPSAoRE9NTm9kZSlnZXRGaXJzdENoaWxkKCk7CisJaWYgKGNoaWxkICE9IG51bGwpIHsKKwkJaW50IGNoaWxkU3RhcnQgPSBjaGlsZC5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWlmIChjaGlsZFN0YXJ0ID4gMSkgeworCQkJc2V0SGVhZGVyKENoYXJBcnJheU9wcy5zdWJzdHJpbmcoZkRvY3VtZW50LCAwLCBjaGlsZFN0YXJ0KSk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjaXNBbGxvd2FibGVDaGlsZChJRE9NTm9kZSkKKyAqLworcHVibGljIGJvb2xlYW4gaXNBbGxvd2FibGVDaGlsZChJRE9NTm9kZSBub2RlKSB7CisJaWYgKG5vZGUgIT0gbnVsbCkgeworCQlpbnQgdHlwZT0gbm9kZS5nZXROb2RlVHlwZSgpOworCQlyZXR1cm4gdHlwZSA9PSBJRE9NTm9kZS5QQUNLQUdFIHx8IHR5cGUgPT0gSURPTU5vZGUuSU1QT1JUIHx8IHR5cGUgPT0gSURPTU5vZGUuVFlQRTsgCisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKK30KKy8qKgorICogQHNlZSBET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIG5ld0RPTU5vZGUoKSB7CisJcmV0dXJuIG5ldyBET01Db21waWxhdGlvblVuaXQoKTsKK30KKy8qKgorICogTm9ybWFsaXplcyB0aGlzIDxjb2RlPkRPTU5vZGU8L2NvZGU+J3Mgc291cmNlIHBvc2l0aW9ucyB0byBpbmNsdWRlIHdoaXRlc3BhY2UgcHJlY2VlZGluZworICogdGhlIG5vZGUgb24gdGhlIGxpbmUgb24gd2hpY2ggdGhlIG5vZGUgc3RhcnRzLCBhbmQgYWxsIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIG5vZGUgdXAgdG8KKyAqIHRoZSBuZXh0IG5vZGUncyBzdGFydAorICovCit2b2lkIG5vcm1hbGl6ZShJTGluZVN0YXJ0RmluZGVyIGZpbmRlcikgeworCXN1cGVyLm5vcm1hbGl6ZShmaW5kZXIpOworCWluaXRhbGl6ZUhlYWRlcigpOworfQorLyoqCisgKiBAc2VlIElET01Db21waWxhdGlvblVuaXRAc2V0SGVhZGVyKFN0cmluZykKKyAqLworcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBjb21tZW50KSB7CisJZkhlYWRlcj0gY29tbWVudDsKKwlmcmFnbWVudCgpOworfQorLyoqCisgKiBAc2VlIElET01Db21waWxhdGlvblVuaXQjc2V0TmFtZShTdHJpbmcpCisgKi8KK3B1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHt9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNzaGFyZUNvbnRlbnRzKERPTU5vZGUpCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNoYXJlQ29udGVudHMoRE9NTm9kZSBub2RlKSB7CisJc3VwZXIuc2hhcmVDb250ZW50cyhub2RlKTsKKwlmSGVhZGVyPSAoKERPTUNvbXBpbGF0aW9uVW5pdClub2RlKS5mSGVhZGVyOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIkNPTVBJTEFUSU9OX1VOSVQ6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk4NTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01GaWVsZC5qYXZhCkBAIC0wLDAgKzEsNjE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uRE9NRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheU9wczsKKworLyoqCisgKiBET01GaWVsZCBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJRE9NRmllbGQuCisgKgorICogQHNlZSBJRE9NRmllbGQKKyAqIEBzZWUgRE9NTm9kZQorICovCitjbGFzcyBET01GaWVsZCBleHRlbmRzIERPTU1lbWJlciBpbXBsZW1lbnRzIElET01GaWVsZCB7CisJCisJLyoqCisJICogQ29udGFpbnMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIHdoZW4gdGhlIHR5cGUKKwkgKiBoYXMgYmVlbiBhbHRlcmVkIGZyb20gdGhlIGNvbnRlbnRzIGluIHRoZQorCSAqIGRvY3VtZW50LCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKKworCS8qKgorCSAqIFRoZSBvcmlnaW5hbCBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoZQorCSAqIGZpZWxkJ3MgdHlwZSBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdIGZUeXBlUmFuZ2U7CisJCQorCS8qKgorCSAqIFRoZSBjb250ZW50cyBvZiB0aGUgaW5pdGlhbGl6ZXIgd2hlbiB0aGUKKwkgKiBpbml0aWFsaXplciBoYXMgYmVlbiBhbHRlcmVkIGZyb20gdGhlCisJICogb3JpZ2luYWwgc3RhdGUgaW4gdGhlIGRvY3VtZW50LCBvdGhlcndpc2UKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZJbml0aWFsaXplcjsKKworCS8qKgorCSAqIFRoZSBvcmlnaW5hbCBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoZQorCSAqIGluaXRpYWxpemVyIGluIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10gZkluaXRpYWxpemVyUmFuZ2U7CisKKy8qKgorICogQ29uc3RydWN0cyBhbiBlbXB0eSBmaWVsZCBub2RlLgorICovCitET01GaWVsZCgpIHsKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBkZXRhaWxlZCBGSUVMRCBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkLAorICogCQljb3JyZXNwb25kaW5nIHRvIFZhcmlhYmxlRGVjbGFyYXRvcklkIChKTFMgOC4zKS4KKyAqIEBwYXJhbSBuYW1lUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlJ3MgbmFtZSB3aXRoaW4gaXRzIGRvY3VtZW50LAorICoJCWluY2x1ZGluZyBhbnkgYXJyYXkgcXVhbGlmaWVycyB0aGF0IG1pZ2h0IGZvbGxvdyB0aGUgbmFtZS4KKyAqIEBwYXJhbSBjb21tZW50UmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGNvbW1lbnRzIHRoYXQgcHJlY2VkZQorICoJCXRoZSBtZW1iZXIgZGVjbGFyYXRpb24uIFRoZSBmaXJzdCBtYXRjaGVzIHRoZSBzdGFydCBvZiB0aGlzIG5vZGUncworICoJCXNvdXJjZVJhbmdlLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgbmV3LWxpbmUgb3IgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKKyAqCQljaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBsYXN0IGNvbW1lbnQuIElmIG5vIGNvbW1lbnRzIGFyZSBwcmVzZW50LAorICoJCXRoaXMgYXJyYXkgY29udGFpbnMgdHdvIC0xJ3MuCisgKiBAcGFyYW0gZmxhZ3MgLSBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlci4gVGhlCisgKgkJaW50ZWdlciBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFncworICogQHBhcmFtIG1vZGlmaWVyUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIG9mCisgKgkJbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlciB3aXRoaW4gaXRzIHNvdXJjZSByYW5nZS4gVGhlIGZpcnN0IGludGVnZXIKKyAqCQlpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCBtb2RpZmllciBmb3IgdGhpcyBtZW1iZXIsIGFuZAorICoJCXRoZSBzZWNvbmQgaW50ZWdlciBpcyB0aGUgbGFzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBwcmVjZWVkaW5nIHRoZQorICoJCW5leHQgcGFydCBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4gSWYgdGhlcmUgYXJlIG5vIG1vZGlmaWVycyBwcmVzZW50CisgKgkJaW4gdGhpcyBub2RlJ3Mgc291cmNlIGNvZGUgKGkuZS4gZGVmYXVsdCBwcm90ZWN0aW9uKSwgdGhpcyBhcnJheQorICoJCWNvbnRhaW5zIHR3byAtMSdzLgorICogQHBhcmFtIHR5cGVSYW5nZS0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqCQl0eXBlTmFtZSBpbiB0aGUgZG9jdW1lbnQgLSB0aGUgcG9zaXRpb25zIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBjaGFyYWN0ZXJzCisgKgkJb2YgdGhlIHR5cGVOYW1lLgorICogQHBhcmFtIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgZmllbGQsIGluIG5vcm1hbGl6ZWQgZm9ybSwgYXMgZGVmaW5lZCBpbgorICogICAgICBUeXBlIGluIEZpZWxkIERlY2xhcmF0aW9uIChKTFMgOC4zKQorICogQHBhcmFtIGhhc0luaXRpYWxpemVyIC0gdHJ1ZSBpZiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uIGluY2x1ZGVzIGFuIGluaXRpYWxpemVyLAorICoJCW90aGVyd2lzZSBmYWxzZQorICogQHBhcmFtIGluaXRSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGluaXRpYWxpemVyCisgKgkJaW4gdGhlIGRlY2xhcmF0aW9uLiBUaGUgZmlyc3QgaW50ZWdlciBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlcgorICoJCWZvbGxvd2luZyB0aGUgZXF1YWxzIHNpZ24sIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIHRoZSBsYXN0CisgKgkJaW4gdGhlIGluaXRpYWxpemVyLiBJZiB0aGlzIGZpZWxkIGhhcyBubyBpbml0aWFsaXplciwgdGhpcyBhcnJheSBjb250YWlucworICoJCXR3byAtMSdzLgorICogQHBhcmFtIGlzVmFyaWFibGVEZWNsYXJhdG9yIC0gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgYSBzZWNvbmRheSB2YXJpYWJsZSBkZWNsYXJhdG9yCisgKiAJCWZvciBhIHByZXZpb3VzIGZpZWxkIGRlY2xhcmF0aW9uLgorICovCitET01GaWVsZChjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlLCBpbnRbXSBjb21tZW50UmFuZ2UsIGludCBmbGFncywgaW50W10gbW9kaWZpZXJSYW5nZSwgaW50W10gdHlwZVJhbmdlLCBTdHJpbmcgdHlwZSwgYm9vbGVhbiBoYXNJbml0aWFsaXplciwgaW50W10gaW5pdFJhbmdlLCBib29sZWFuIGlzVmFyaWFibGVEZWNsYXJhdG9yKSB7CisJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UsIGNvbW1lbnRSYW5nZSwgZmxhZ3MsIG1vZGlmaWVyUmFuZ2UpOworCisJZlR5cGU9IHR5cGU7CisJZlR5cGVSYW5nZT0gdHlwZVJhbmdlOworCXNldEhhc0luaXRpYWxpemVyKGhhc0luaXRpYWxpemVyKTsKKwlmSW5pdGlhbGl6ZXJSYW5nZT0gaW5pdFJhbmdlOworCXNldElzVmFyaWFibGVEZWNsYXJhdG9yKGlzVmFyaWFibGVEZWNsYXJhdG9yKTsKKwlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIHRydWUpOworCit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2ltcGxlIEZJRUxEIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQ29udGVudHMgc3RhcnQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgZmlyc3QgcG9zaXRpb24uCisgKgkJQ29udGVudHMgZW5kIG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24uCisgKgkJQW4gYXJyYXkgb2YgLTEncyBpbmRpY2F0ZXMgdGhpcyBub2RlJ3MgY29udGVudHMgZG8gbm90IGV4aXN0CisgKgkJaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIG5hbWUgLSB0aGUgaWRlbnRpZmllciBwb3J0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQsCisgKiAJCWNvcnJlc3BvbmRpbmcgdG8gVmFyaWFibGVEZWNsYXJhdG9ySWQgKEpMUyA4LjMpLgorICogQHBhcmFtIG5hbWVSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUncyBuYW1lIHdpdGhpbiBpdHMgZG9jdW1lbnQsCisgKgkJaW5jbHVkaW5nIGFueSBhcnJheSBxdWFsaWZpZXJzIHRoYXQgbWlnaHQgZm9sbG93IHRoZSBuYW1lLgorICogQHBhcmFtIGZsYWdzIC0gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIuIFRoZQorICoJCWludGVnZXIgY2FuIGJlIGFuYWx5emVkIHdpdGggb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKyAqIEBwYXJhbSB0eXBlIC0gdGhlIHR5cGUgb2YgdGhlIGZpZWxkLCBpbiBub3JtYWxpemVkIGZvcm0sIGFzIGRlZmluZWQgaW4KKyAqICAgICAgVHlwZSBpbiBGaWVsZCBEZWNsYXJhdGlvbiAoSkxTIDguMykKKyAqIEBwYXJhbSBpc1ZhcmlhYmxlRGVjbGFyYXRvciAtIHRydWUgaWYgdGhlIGZpZWxkIGlzIGEgc2Vjb25kYXkgdmFyaWFibGUgZGVjbGFyYXRvcgorICogCQlmb3IgYSBwcmV2aW91cyBmaWVsZCBkZWNsYXJhdGlvbi4KKyAqLworRE9NRmllbGQoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgaW50IGZsYWdzLCBTdHJpbmcgdHlwZSwgYm9vbGVhbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcikgeworCXRoaXMoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZmxhZ3MsIG5ldyBpbnRbXSB7LTEsIC0xfSwgbmV3IGludFtdIHstMSwgLTF9LCB0eXBlLCBmYWxzZSwgbmV3IGludFtdIHstMSwgLTF9LCBpc1ZhcmlhYmxlRGVjbGFyYXRvcik7CisJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCBmYWxzZSk7Cit9CisvKioKKyAqIEFwcGVuZHMgdGhpcyBtZW1iZXIncyBib2R5IGNvbnRlbnRzIHRvIHRoZSBnaXZlbiBDaGFyQXJyYXlCdWZmZXIuCisgKiBCb2R5IGNvbnRlbnRzIGluY2x1ZGUgdGhlIG1lbWJlciBib2R5IGFuZCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAqCisgKiA8cD5BIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBib2R5LgorICoKKyAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZE1lbWJlckJvZHlDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZE1lbWJlckJvZHlDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7fQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJEZWNsYXJhdGlvbkNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKKyAqLworcHJvdGVjdGVkIHZvaWQgYXBwZW5kTWVtYmVyRGVjbGFyYXRpb25Db250ZW50cyhDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CisKKwlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgeworCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwl9IGVsc2UgeworCQlidWZmZXIKKwkJCS5hcHBlbmQoZ2V0VHlwZUNvbnRlbnRzKCkpCisJCQkuYXBwZW5kKGZEb2N1bWVudCwgZlR5cGVSYW5nZVsxXSArIDEsIGZOYW1lUmFuZ2VbMF0gLSBmVHlwZVJhbmdlWzFdIC0gMSk7CisJfQorCQorCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZUNvbnRlbnRzKCkpOworCWlmIChoYXNJbml0aWFsaXplcigpKSB7CisJCWlmIChmSW5pdGlhbGl6ZXJSYW5nZVswXSA8IDApIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoJz0nKQorCQkJCS5hcHBlbmQoZkluaXRpYWxpemVyKQorCQkJCS5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJCX0gZWxzZSB7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZJbml0aWFsaXplclJhbmdlWzBdIC0gZk5hbWVSYW5nZVsxXSAtIDEpCisJCQkJLmFwcGVuZChnZXRJbml0aWFsaXplcigpKQorCQkJCS5hcHBlbmQoZkRvY3VtZW50LCBmSW5pdGlhbGl6ZXJSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZJbml0aWFsaXplclJhbmdlWzFdKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmSW5pdGlhbGl6ZXJSYW5nZVswXSA8IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVsxXSk7CisJCX0gZWxzZSB7CisJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkluaXRpYWxpemVyUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmSW5pdGlhbGl6ZXJSYW5nZVsxXSk7CisJCX0KKwl9CisKK30KKy8qKgorICogQXBwZW5kcyB0aGlzIG1lbWJlcidzIGhlYWRlciBjb250ZW50cyB0byB0aGUgZ2l2ZW4gQ2hhckFycmF5QnVmZmVyLgorICogSGVhZGVyIGNvbnRlbnRzIGluY2x1ZGUgYW55IHByZWNlZGluZyBjb21tZW50cyBhbmQgbW9kaWZpZXJzLgorICoKKyAqIDxwPklmIHRoaXMgZmllbGQgaXMgYSBzZWNvbmRhcnkgdmFyaWFibGUgZGVjbGFyYXRvciwgdGhlcmUgaXMgbm8gaGVhZGVyLgorICoKKyAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZE1lbWJlckhlYWRlckZyYWdtZW50KENoYXJBcnJheUJ1ZmZlcikKKyAqLworcHJvdGVjdGVkIHZvaWQgYXBwZW5kTWVtYmVySGVhZGVyRnJhZ21lbnQoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCisJaWYgKGlzVmFyaWFibGVEZWNsYXJhdG9yKCkpIHsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXN1cGVyLmFwcGVuZE1lbWJlckhlYWRlckZyYWdtZW50KGJ1ZmZlcik7CisJfQorCit9CisvKioKKyAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKKyAqLworcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2ltcGxlQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCS8vIGFwcGVuZCBldmV5dGhpbmcgYmVmb3JlIG15IG5hbWUKKwlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwkvLyBhcHBlbmQgbXkgbmFtZQorCWJ1ZmZlci5hcHBlbmQoZk5hbWUpOworCS8vIGFwcGVuZCBldmVyeXRoaW5nIGFmdGVyIG15IG5hbWUKKwlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZTb3VyY2VSYW5nZVsxXSAtIGZOYW1lUmFuZ2VbMV0pOworfQorLyoqCisgKiBHZW5lcmF0ZXMgZGV0YWlsZWQgc291cmNlIGluZGV4ZXMgZm9yIHRoaXMgbm9kZSBpZiBwb3NzaWJsZS4KKyAqCisgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gZ2VuZXJhdGUgZGV0YWlsZWQgc291cmNlIGluZGV4ZXMKKyAqIAlmb3IgdGhpcyBub2RlCisgKi8KK3Byb3RlY3RlZCB2b2lkIGJlY29tZURldGFpbGVkKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisJaWYgKCFpc0RldGFpbGVkKCkpIHsKKwkJaWYgKGlzVmFyaWFibGVEZWNsYXJhdG9yKCkgfHwgaGFzTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0b3JzKCkpIHsKKwkJCURPTU5vZGUgZmlyc3QgPSBnZXRGaXJzdEZpZWxkRGVjbGFyYXRpb24oKTsKKwkJCURPTU5vZGUgbGFzdCA9IGdldExhc3RGaWVsZERlY2xhcmF0aW9uKCk7CisJCQlET01Ob2RlIG5vZGU9IGZpcnN0OworCQkJU3RyaW5nIHNvdXJjZT0gZmlyc3QuZ2V0Q29udGVudHMoKTsKKwkJCXdoaWxlIChub2RlICE9IGxhc3QpIHsKKwkJCQlub2RlPSBub2RlLmZOZXh0Tm9kZTsKKwkJCQlzb3VyY2UrPW5vZGUuZ2V0Q29udGVudHMoKTsKKwkJCX0KKwkJCURPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBET01CdWlsZGVyKCk7CisJCQlJRE9NRmllbGRbXSBkZXRhaWxzPSBidWlsZGVyLmNyZWF0ZUZpZWxkcyhzb3VyY2UudG9DaGFyQXJyYXkoKSk7CisJCQlpZiAoZGV0YWlscy5sZW5ndGggPT0gMCkgeworCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uY2Fubm90RGV0YWlsIikpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCW5vZGU9IHRoaXM7CisJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRldGFpbHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJbm9kZS5zaGFyZUNvbnRlbnRzKChET01Ob2RlKWRldGFpbHNbaV0pOworCQkJCQlub2RlPSBub2RlLmZOZXh0Tm9kZTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdXBlci5iZWNvbWVEZXRhaWxlZCgpOworCQl9CisKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjY2xvbmUoKQorICovCitwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworCWlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcigpIHx8IGhhc011bHRpcGxlVmFyaWFibGVEZWNsYXJhdG9ycygpKSB7CisJCXJldHVybiBnZXRGYWN0b3J5KCkuY3JlYXRlRmllbGQobmV3IFN0cmluZyhnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0b3JDb250ZW50cygpKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHN1cGVyLmNsb25lKCk7CisJfQorfQorLyoqCisgKiBFeHBhbmRzIGFsbCB2YXJpYWJsZSBkZWNsYXJhdG9ycyBpbiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uIGludG8KKyAqIHN0YW5kLWFsb25lIGZpZWxkIGRlY2xhcmF0aW9ucy4gCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4cGFuZCgpIHsKKwlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSB8fCBoYXNNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRvcnMoKSkgeworCQlFbnVtZXJhdGlvbiBzaWJsaW5ncz0gbmV3IFNpYmxpbmdFbnVtZXJhdGlvbihnZXRGaXJzdEZpZWxkRGVjbGFyYXRpb24oKSk7CisJCURPTUZpZWxkIGZpZWxkPSAoRE9NRmllbGQpc2libGluZ3MubmV4dEVsZW1lbnQoKTsKKwkJRE9NTm9kZSBuZXh0PSBmaWVsZC5mTmV4dE5vZGU7CisJCXdoaWxlIChzaWJsaW5ncy5oYXNNb3JlRWxlbWVudHMoKSAmJiAobmV4dCBpbnN0YW5jZW9mIERPTUZpZWxkKSAmJiAoKChET01GaWVsZCluZXh0KS5pc1ZhcmlhYmxlRGVjbGFyYXRvcigpKSkgeworCQkJZmllbGQubG9jYWxpemVDb250ZW50cygpOworCQkJaWYgKGZpZWxkLmZQYXJlbnQgIT0gbnVsbCkgeworCQkJCWZpZWxkLmZQYXJlbnQuZnJhZ21lbnQoKTsKKwkJCX0KKwkJCWZpZWxkPSAoRE9NRmllbGQpc2libGluZ3MubmV4dEVsZW1lbnQoKTsKKwkJCW5leHQ9IGZpZWxkLmZOZXh0Tm9kZTsKKwkJfQorCQlmaWVsZC5sb2NhbGl6ZUNvbnRlbnRzKCk7CisJfQorfQorLyoqCisgKiBAc2VlIERPTU5vZGUjZ2V0RGV0YWlsZWROb2RlKCkKKyAqLworcHJvdGVjdGVkIERPTU5vZGUgZ2V0RGV0YWlsZWROb2RlKCkgeworCWlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcigpIHx8IGhhc011bHRpcGxlVmFyaWFibGVEZWNsYXJhdG9ycygpKSB7CisJCXJldHVybiAoRE9NTm9kZSlnZXRGYWN0b3J5KCkuY3JlYXRlRmllbGQobmV3IFN0cmluZyhnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0b3JDb250ZW50cygpKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChET01Ob2RlKWdldEZhY3RvcnkoKS5jcmVhdGVGaWVsZChnZXRDb250ZW50cygpKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0IGZpZWxkIGRvY3VtZW50IGZyYWdtZW50IHRoYXQgZGVmaW5lcworICogdGhlIHR5cGUgZm9yIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRvci4KKyAqLworcHJvdGVjdGVkIERPTUZpZWxkIGdldEZpcnN0RmllbGREZWNsYXJhdGlvbigpIHsKKwlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgeworCQlyZXR1cm4gKChET01GaWVsZClmUHJldmlvdXNOb2RlKS5nZXRGaXJzdEZpZWxkRGVjbGFyYXRpb24oKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGhpczsKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTUZpZWxkI2dldEluaXRpYWxpemVyKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXplcigpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmIChoYXNJbml0aWFsaXplcigpKSB7CisJCWlmIChmSW5pdGlhbGl6ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZJbml0aWFsaXplcjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyQXJyYXlPcHMuc3Vic3RyaW5nKGZEb2N1bWVudCwgZkluaXRpYWxpemVyUmFuZ2VbMF0sIGZJbml0aWFsaXplclJhbmdlWzFdICsgMSAtIGZJbml0aWFsaXplclJhbmdlWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNnZXRKYXZhRWxlbWVudAorICovCitwdWJsaWMgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KElKYXZhRWxlbWVudCBwYXJlbnQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWlmIChwYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQlyZXR1cm4gKChJVHlwZSlwYXJlbnQpLmdldEZpZWxkKGdldE5hbWUoKSk7CisJfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgbGFzdCBmaWVsZCBkb2N1bWVudCBmcmFnbWVudCBpbiB0aGlzIG11bGktZGVjbGFyYXRvciBzdGF0ZW1lbnQuCisgKi8KK3Byb3RlY3RlZCBET01GaWVsZCBnZXRMYXN0RmllbGREZWNsYXJhdGlvbigpIHsKKwlET01GaWVsZCBmaWVsZCA9IHRoaXM7CisJd2hpbGUgKGZpZWxkLmlzVmFyaWFibGVEZWNsYXJhdG9yKCkgfHwgZmllbGQuaGFzTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0b3JzKCkpIHsKKwkJaWYgKGZpZWxkLmZOZXh0Tm9kZSBpbnN0YW5jZW9mIERPTUZpZWxkICYmICgoRE9NRmllbGQpZmllbGQuZk5leHROb2RlKS5pc1ZhcmlhYmxlRGVjbGFyYXRvcigpKSB7CisJCQlmaWVsZD0gKERPTUZpZWxkKWZpZWxkLmZOZXh0Tm9kZTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmaWVsZDsKK30KKy8qKgorICogQHNlZSBET01NZW1iZXIjZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkKKyAqLworcHJvdGVjdGVkIGludCBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSB7CisJcmV0dXJuIGZUeXBlUmFuZ2VbMF07Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Tm9kZVR5cGUoKQorICovCitwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCXJldHVybiBJRE9NTm9kZS5GSUVMRDsKK30KKy8qKgorICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiBhcyBhIGZpZWxkCisgKiBkZWNsYXJhdGlvbiB3aXRoIG9uZSB2YXJpYWJsZSBkZWNsYXJhdG9yLgorICovCitwcm90ZWN0ZWQgY2hhcltdIGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRvckNvbnRlbnRzKCkgeworCisKKwlDaGFyQXJyYXlCdWZmZXIgYnVmZmVyPSBuZXcgQ2hhckFycmF5QnVmZmVyKCk7CisJRE9NRmllbGQgZmlyc3Q9IGdldEZpcnN0RmllbGREZWNsYXJhdGlvbigpOworCWlmIChmaXJzdC5pc0RldGFpbGVkKCkpIHsKKwkJZmlyc3QuYXBwZW5kTWVtYmVySGVhZGVyRnJhZ21lbnQoYnVmZmVyKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRUeXBlKCkpOworCQlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgeworCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZUeXBlUmFuZ2VbMV0gKyAxLCBmTmFtZVJhbmdlWzBdIC0gZlR5cGVSYW5nZVsxXSAtIDEpOworCQl9CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZChmaXJzdC5mRG9jdW1lbnQsIGZpcnN0LmZTb3VyY2VSYW5nZVswXSwgZmlyc3QuZk5hbWVSYW5nZVswXSAtIGZpcnN0LmZTb3VyY2VSYW5nZVswXSk7CisJfQorCQorCWJ1ZmZlci5hcHBlbmQoZ2V0TmFtZSgpKTsKKwlpZiAoaGFzSW5pdGlhbGl6ZXIoKSkgeworCQlpZiAoZkluaXRpYWxpemVyUmFuZ2VbMF0gPCAwKSB7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKCc9JykKKwkJCQkuYXBwZW5kKGZJbml0aWFsaXplcikKKwkJCQkuYXBwZW5kKCc7JykKKwkJCQkuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCQl9IGVsc2UgeworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmSW5pdGlhbGl6ZXJSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKQorCQkJCS5hcHBlbmQoZ2V0SW5pdGlhbGl6ZXIoKSkKKwkJCQkuYXBwZW5kKCc7JykKKwkJCQkuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCQl9CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZCgnOycpLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKKwl9CisJcmV0dXJuIGJ1ZmZlci5nZXRDb250ZW50cygpOworfQorLyoqCisgKiBAc2VlIElET01GaWVsZCNnZXRUeXBlKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCXJldHVybiBmVHlwZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgc291Y2UgY29kZSB0byBiZSB1c2VkIGZvciB0aGlzCisgKiBmaWVsZCdzIHR5cGUuCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2V0VHlwZUNvbnRlbnRzKCkgeworCWlmIChpc1R5cGVBbHRlcmVkKCkpIHsKKwkJcmV0dXJuIGZUeXBlLnRvQ2hhckFycmF5KCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIENoYXJBcnJheU9wcy5zdWJhcnJheShmRG9jdW1lbnQsIGZUeXBlUmFuZ2VbMF0sIGZUeXBlUmFuZ2VbMV0gKyAxIC0gZlR5cGVSYW5nZVswXSk7IAorCX0KK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaGFzIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24sCisgKiBvdGhlcndpc2UgZmFsc2UuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGhhc0luaXRpYWxpemVyKCkgeworCXJldHVybiBnZXRNYXNrKE1BU0tfRklFTERfSEFTX0lOSVRJQUxJWkVSKTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlzIHRoaXMgZmllbGQgZGVjbGFyYXRpb25zIGhhcyBtb3JlIHRoYW4gb25lCisgKiB2YXJpYWJsZSBkZWNsYXJhdG9yLCBvdGhlcndpc2UgZmFsc2U7CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlVmFyaWFibGVEZWNsYXJhdG9ycygpIHsKKwlyZXR1cm4gZk5leHROb2RlICE9IG51bGwgJiYgKGZOZXh0Tm9kZSBpbnN0YW5jZW9mIERPTUZpZWxkKSAmJgorCQkoKERPTUZpZWxkKWZOZXh0Tm9kZSkuaXNWYXJpYWJsZURlY2xhcmF0b3IoKTsKK30KKy8qKgorICogSW5zZXJ0cyB0aGUgZ2l2ZW4gdW4tcGFyZW50ZWQgbm9kZSBhcyBhIHNpYmxpbmcgb2YgdGhpcyBub2RlLCBpbW1lZGlhdGVseSBiZWZvcmUKKyAqIHRoaXMgbm9kZS4gT25jZSBpbnNlcnRlZCwgdGhlIHNpYmxpbmcgaXMgb25seSBkZXBlbmRlbnQgb24gdGhpcyBkb2N1bWVudCBmcmFnbWVudC4KKyAqCisgKiA8cD5XaGVuIGEgc2libGluZyBpcyBpbnNlcnRlZCBiZWZvcmUgYSB2YXJpYWJsZSBkZWNsYXJhdG9yLCBpdCBtdXN0IGZpcnN0CisgKiBiZSBleHBhbmRlZC4KKyAqCisgKiBAc2VlIElET01Ob2RlI2luc2VydFNpYmxpbmcoSURPTU5vZGUpCisgKi8KK3B1YmxpYyB2b2lkIGluc2VydFNpYmxpbmcoSURPTU5vZGUgc2libGluZykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKKwlpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoKSkgeworCQlleHBhbmQoKTsKKwl9IAorCXN1cGVyLmluc2VydFNpYmxpbmcoc2libGluZyk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkJ3MgdHlwZSBoYXMgYmVlbiBhbHRlcmVkCisgKiBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBjb250ZW50cy4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNUeXBlQWx0ZXJlZCgpIHsKKwlyZXR1cm4gZ2V0TWFzayhNQVNLX0ZJRUxEX1RZUEVfQUxURVJFRCk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkIGFzIGEgc2Vjb25kYXJ5IHZhcmlhYmxlCisgKiBkZWNsYXJhdG9yIGZvciBhIHByZXZpb3VzIGZpZWxkIGRlY2xhcmF0aW9uLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcigpIHsKKwlyZXR1cm4gZ2V0TWFzayhNQVNLX0ZJRUxEX0lTX1ZBUklBQkxFX0RFQ0xBUkFUT1IpOworfQorLyoqCisgKiBAc2VlIERPTU5vZGUKKyAqLworcHJvdGVjdGVkIERPTU5vZGUgbmV3RE9NTm9kZSgpIHsKKwlyZXR1cm4gbmV3IERPTUZpZWxkKCk7Cit9CisvKioKKyAqIE5vcm1hbGl6ZXMgdGhpcyA8Y29kZT5ET01Ob2RlPC9jb2RlPidzIGVuZCBwb3NpdGlvbi4KKyAqLwordm9pZCBub3JtYWxpemVFbmRQb3NpdGlvbihJTGluZVN0YXJ0RmluZGVyIGZpbmRlciwgRE9NTm9kZSBuZXh0KSB7CisJaWYgKG5leHQgPT0gbnVsbCkgeworCQkvLyB0aGlzIG5vZGUncyBlbmQgcG9zaXRpb24gaW5jbHVkZXMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIHVwCisJCS8vIHRvIHRoZSBlbmQgb2YgdGhlIGVuY2xvc2luZyBub2RlCisJCURPTU5vZGUgcGFyZW50ID0gKERPTU5vZGUpIGdldFBhcmVudCgpOworCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50IGluc3RhbmNlb2YgRE9NQ29tcGlsYXRpb25Vbml0KSB7CisJCQlzZXRTb3VyY2VSYW5nZUVuZChmRG9jdW1lbnQubGVuZ3RoIC0gMSk7CisJCX0gZWxzZSB7CisJCQkvLyBwYXJlbnQgaXMgYSB0eXBlCisJCQlpbnQgdGVtcCA9ICgoRE9NVHlwZSlwYXJlbnQpLmdldENsb3NlQm9keVBvc2l0aW9uKCkgLSAxOworCQkJc2V0U291cmNlUmFuZ2VFbmQodGVtcCk7CisJCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBNYXRoLm1heChmaW5kZXIuZ2V0TGluZVN0YXJ0KHRlbXAgKyAxKSwgZ2V0RW5kUG9zaXRpb24oKSk7CisJCX0KKwl9IGVsc2UgeworCQkvLyB0aGlzIG5vZGUncyBlbmQgcG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKKwkJLy8gdW5sZXNzIHRoZSBuZXh0IG5vZGUgaXMgYSBmaWVsZCB0aGF0IGlzIGRlY2xhcmVkIGFsb25nIHdpdGggdGhpcyBvbmUKKwkJaW50IHRlbXAgPSBuZXh0LmdldFN0YXJ0UG9zaXRpb24oKSAtIDE7CisJCWZJbnNlcnRpb25Qb3NpdGlvbiA9IE1hdGgubWF4KGZpbmRlci5nZXRMaW5lU3RhcnQodGVtcCArIDEpLCBnZXRFbmRQb3NpdGlvbigpKTsKKwkJCisJCW5leHQubm9ybWFsaXplU3RhcnRQb3NpdGlvbihnZXRFbmRQb3NpdGlvbigpLCBmaW5kZXIpOworCQlpZiAobmV4dCBpbnN0YW5jZW9mIERPTUZpZWxkKSB7CisJCQlET01GaWVsZCBmaWVsZCA9IChET01GaWVsZCkgbmV4dDsKKwkJCWlmIChmaWVsZC5pc1ZhcmlhYmxlRGVjbGFyYXRvcigpICYmIGZUeXBlUmFuZ2VbMF0gPT0gZmllbGQuZlR5cGVSYW5nZVswXSkKKwkJCQlyZXR1cm47CisJCX0KKwkJc2V0U291cmNlUmFuZ2VFbmQobmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxKTsKKwl9Cit9CisvKioKKyAqIE5vcm1hbGl6ZXMgdGhpcyA8Y29kZT5ET01Ob2RlPC9jb2RlPidzIHN0YXJ0IHBvc2l0aW9uLgorICovCit2b2lkIG5vcm1hbGl6ZVN0YXJ0UG9zaXRpb24oaW50IGVuZFBvc2l0aW9uLCBJTGluZVN0YXJ0RmluZGVyIGZpbmRlcikgeworCWlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcigpKSB7CisJCS8vIHN0YXJ0IHBvc2l0aW9uIGlzIGVuZCBvZiBsYXN0IGVsZW1lbnQKKwkJc2V0U3RhcnRQb3NpdGlvbihmUHJldmlvdXNOb2RlLmdldEVuZFBvc2l0aW9uKCkgKyAxKTsKKwl9IGVsc2UgeworCQlzdXBlci5ub3JtYWxpemVTdGFydFBvc2l0aW9uKGVuZFBvc2l0aW9uLCBmaW5kZXIpOworCX0KK30KKy8qKgorICogT2Zmc2V0cyBhbGwgdGhlIHNvdXJjZSBpbmRleGVzIGluIHRoaXMgbm9kZSBieSB0aGUgZ2l2ZW4gYW1vdW50LgorICovCitwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgeworCXN1cGVyLm9mZnNldChvZmZzZXQpOworCW9mZnNldFJhbmdlKGZJbml0aWFsaXplclJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKGZUeXBlUmFuZ2UsIG9mZnNldCk7Cit9CisvKioKKyAqIFNlcGFyYXRlcyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50IGFuZCBzaWJsaW5ncywgbWFpbnRhaW5pbmcgYW55IHRpZXMgdGhhdAorICogdGhpcyBub2RlIGhhcyB0byB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBmcmFnbWVudC4KKyAqCisgKiA8cD5XaGVuIGEgZmllbGQgd2l0aCBtdWx0aXBsZSBkZWNsYXJhdG9ycyBpcyByZW1vdmVkLCBpdHMgZGVjbGFyYXRpb24KKyAqIG11c3QgZmlyc3QgYmUgZXhwYW5kZWQuCisgKgorICogQHNlZSBJRE9NTm9kZSNyZW1vdmUoKQorICovCitwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJZXhwYW5kKCk7CisJc3VwZXIucmVtb3ZlKCk7Cit9CisvKioKKyAqIEBzZWUgSURPTU1lbWJlciNzZXRDb21tZW50KFN0cmluZykKKyAqLworcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworCWV4cGFuZCgpOworCXN1cGVyLnNldENvbW1lbnQoY29tbWVudCk7Cit9CisvKioKKyAqIEBzZWUgSURPTU1lbWJlciNzZXRGbGFncyhpbnQpCisgKi8KK3B1YmxpYyB2b2lkIHNldEZsYWdzKGludCBmbGFncykgeworCWV4cGFuZCgpOworCXN1cGVyLnNldEZsYWdzKGZsYWdzKTsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiBhcyBoYXZpbmcKKyAqIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldEhhc0luaXRpYWxpemVyKGJvb2xlYW4gaGFzSW5pdGlhbGl6ZXIpIHsKKwlzZXRNYXNrKE1BU0tfRklFTERfSEFTX0lOSVRJQUxJWkVSLCBoYXNJbml0aWFsaXplcik7Cit9CisvKioKKyAqIEBzZWUgSURPTUZpZWxkI3NldEluaXRpYWxpemVyKGNoYXJbXSkKKyAqLworcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoU3RyaW5nIGluaXRpYWxpemVyKSB7CisJYmVjb21lRGV0YWlsZWQoKTsKKwlmcmFnbWVudCgpOworCXNldEhhc0luaXRpYWxpemVyKGluaXRpYWxpemVyICE9IG51bGwpOworCWZJbml0aWFsaXplcj0gaW5pdGlhbGl6ZXI7Cit9CisvKioKKyAqIFNldHMgdGhlIGluaXRpYWxpemVyIHJhbmdlLgorICovCit2b2lkIHNldEluaXRpYWxpemVyUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJZkluaXRpYWxpemVyUmFuZ2VbMF0gPSBzdGFydDsKKwlmSW5pdGlhbGl6ZXJSYW5nZVsxXSA9IGVuZDsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbiBhcyBiZWluZyBhCisgKiBzZWNvbmRhcnkgdmFyaWFibGUgZGVjbGFyYXRvciBmb3IgYSBwcmV2aW91cyBmaWVsZAorICogZGVjbGFyYXRpb24uCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldElzVmFyaWFibGVEZWNsYXJhdG9yKGJvb2xlYW4gaXNWYXJpYWJsZURlY2xhcmF0b3IpIHsKKwlzZXRNYXNrKE1BU0tfRklFTERfSVNfVkFSSUFCTEVfREVDTEFSQVRPUiwgaXNWYXJpYWJsZURlY2xhcmF0b3IpOworfQorLyoqCisgKiBAc2VlIElET01GaWVsZCNzZXROYW1lKGNoYXJbXSkKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXN1cGVyLnNldE5hbWUobmFtZSk7CisJCXNldFR5cGVBbHRlcmVkKHRydWUpOworCX0KK30KKy8qKgorICogQHNlZSBJRE9NRmllbGQjc2V0VHlwZShjaGFyW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsVHlwZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwliZWNvbWVEZXRhaWxlZCgpOworCWV4cGFuZCgpOworCWZyYWdtZW50KCk7CisJc2V0VHlwZUFsdGVyZWQodHJ1ZSk7CisJc2V0TmFtZUFsdGVyZWQodHJ1ZSk7CisJZlR5cGU9IHR5cGVOYW1lOworfQorLyoqCisgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uIGFzIGhhdmluZworICogdGhlIGZpZWxkIHR5cGUgYWx0ZXJlZCBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0VHlwZUFsdGVyZWQoYm9vbGVhbiB0eXBlQWx0ZXJlZCkgeworCXNldE1hc2soTUFTS19GSUVMRF9UWVBFX0FMVEVSRUQsIHR5cGVBbHRlcmVkKTsKK30KKy8qKgorICogQHNlZSBET01Ob2RlI3NoYXJlQ29udGVudHMoRE9NTm9kZSkKKyAqLworcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKKwlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOworCURPTUZpZWxkIGZpZWxkPSAoRE9NRmllbGQpbm9kZTsKKwlmSW5pdGlhbGl6ZXI9IGZpZWxkLmZJbml0aWFsaXplcjsKKwlmSW5pdGlhbGl6ZXJSYW5nZT0gcmFuZ2VDb3B5KGZpZWxkLmZJbml0aWFsaXplclJhbmdlKTsKKwlmVHlwZT0gZmllbGQuZlR5cGU7CisJZlR5cGVSYW5nZT0gcmFuZ2VDb3B5KGZpZWxkLmZUeXBlUmFuZ2UpOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIkZJRUxEOiAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc5ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUltcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DaGFyQXJyYXlCdWZmZXI7CisKKy8qKgorICogRE9NSW1wb3J0IHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIElET01JbXBvcnQuCisgKgorICogQHNlZSBJRE9NSW1wb3J0CisgKiBAc2VlIERPTU5vZGUKKyAqLworY2xhc3MgRE9NSW1wb3J0IGV4dGVuZHMgRE9NTm9kZSBpbXBsZW1lbnRzIElET01JbXBvcnQgeworCS8qKgorCSAqIEluZGljYXRlcyBpZiB0aGlzIGltcG9ydCBpcyBhbiBvbiBkZW1hbmQgdHlwZSBpbXBvcnQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmT25EZW1hbmQ7CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgSU1QT1JUIG5vZGUuCisgKi8KK0RPTUltcG9ydCgpIHsKKwlmTmFtZSA9ICJqYXZhLmxhbmcuKiI7IC8vJE5PTi1OTFMtMSQKKwlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIHRydWUpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IGRldGFpbGVkIElNUE9SVCBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiBAcGFyYW0gbmFtZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSdzIG5hbWUgd2l0aGluIGl0cyBkb2N1bWVudCwKKyAqCQlpbmNsdWRpbmcgYW55IGFycmF5IHF1YWxpZmllcnMgdGhhdCBtaWdodCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG5hbWUKKyAqCQlvciAtMSdzIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KKyAqIEBwYXJhbSBvbkRlbWFuZCAtIGluZGljYXRlcyBpZiB0aGlzIGltcG9ydCBpcyBhbiBvbiBkZW1hbmQgc3R5bGUgaW1wb3J0CisgKi8KK0RPTUltcG9ydChjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlLCBib29sZWFuIG9uRGVtYW5kKSB7CisJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UpOworCWZPbkRlbWFuZCA9IG9uRGVtYW5kOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2ltcGxlIElNUE9SVCBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiBAcGFyYW0gb25EZW1hbmQgLSBpbmRpY2F0ZXMgaWYgdGhpcyBpbXBvcnQgaXMgYW4gb24gZGVtYW5kIHN0eWxlIGltcG9ydAorICovCitET01JbXBvcnQoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gb25EZW1hbmQpIHsKKwl0aGlzKGRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmFtZSwgbmV3IGludFtdIHstMSwgLTF9LCBvbkRlbWFuZCk7CisJZk9uRGVtYW5kID0gb25EZW1hbmQ7CisJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCBmYWxzZSk7Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWlmIChmTmFtZVJhbmdlWzBdIDwgMCkgeworCQlidWZmZXIKKwkJCS5hcHBlbmQoImltcG9ydCAiKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGZOYW1lKQorCQkJLmFwcGVuZCgnOycpCisJCQkuYXBwZW5kKFV0aWwuTElORV9TRVBBUkFUT1IpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmU291cmNlUmFuZ2VbMF0sIGZOYW1lUmFuZ2VbMF0gLSBmU291cmNlUmFuZ2VbMF0pOworCQkvL2J1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzFdIC0gZk5hbWVSYW5nZVswXSArIDEpOworCQlidWZmZXIuYXBwZW5kKGZOYW1lKTsKKwkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKKwl9Cit9CisvKiogCisgKiBAc2VlIElET01Ob2RlI2dldENvbnRlbnRzKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpIHsKKwlpZiAoZk5hbWUgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNnZXREZXRhaWxlZE5vZGUoKQorICovCitwcm90ZWN0ZWQgRE9NTm9kZSBnZXREZXRhaWxlZE5vZGUoKSB7CisJcmV0dXJuIChET01Ob2RlKWdldEZhY3RvcnkoKS5jcmVhdGVJbXBvcnQoZ2V0Q29udGVudHMoKSk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0SmF2YUVsZW1lbnQKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgcGFyZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldEltcG9ydChnZXROYW1lKCkpOworCX0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Tm9kZVR5cGUoKQorICovCitwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCXJldHVybiBJRE9NTm9kZS5JTVBPUlQ7Cit9CisvKioKKyAqIEBzZWUgSURPTUltcG9ydCNpc09uRGVtYW5kKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNPbkRlbWFuZCgpIHsKKwlyZXR1cm4gZk9uRGVtYW5kOwkKK30KKy8qKgorICogQHNlZSBET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIG5ld0RPTU5vZGUoKSB7CisJcmV0dXJuIG5ldyBET01JbXBvcnQoKTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNzZXROYW1lKGNoYXJbXSkKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCWlmIChuYW1lID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQubnVsbE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJYmVjb21lRGV0YWlsZWQoKTsKKwlzdXBlci5zZXROYW1lKG5hbWUpOworCWZPbkRlbWFuZCA9IG5hbWUuZW5kc1dpdGgoIi4qIik7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSN0b1N0cmluZygpCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJJTVBPUlQ6ICIgKyBnZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBkNDNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheU9wczsKKworLyoqCisgKiBET01Jbml0aWFsaXplciBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJRE9NSW5pdGlhbGl6ZXIuCisgKgorICogQHNlZSBJRE9NSW5pdGlhbGl6ZXIKKyAqIEBzZWUgRE9NTm9kZQorICovCitjbGFzcyBET01Jbml0aWFsaXplciBleHRlbmRzIERPTU1lbWJlciBpbXBsZW1lbnRzIElET01Jbml0aWFsaXplciB7CisKKwkvKioKKwkgKiBUaGUgY29udGVudHMgb2YgdGhlIGluaXRpYWxpemVyJ3MgYm9keSB3aGVuIHRoZQorCSAqIGJvZHkgaGFzIGJlZW4gYWx0ZXJlZCBmcm9tIHRoZSBjb250ZW50cyBpbiB0aGUKKwkgKiBkb2N1bWVudCwgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZkJvZHk7CisKKwkvKioKKwkgKiBUaGUgb3JpZ2luYWwgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGUKKwkgKiBib2R5IGluIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10gIGZCb2R5UmFuZ2U7CisKKy8qKgorICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbml0aWFsaXplciBub2RlLgorICovCitET01Jbml0aWFsaXplcigpIHsKKworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IGRldGFpbGVkIElOSVRJQUxJWkVSIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQ29udGVudHMgc3RhcnQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgZmlyc3QgcG9zaXRpb24uCisgKgkJQ29udGVudHMgZW5kIG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24uCisgKgkJQW4gYXJyYXkgb2YgLTEncyBpbmRpY2F0ZXMgdGhpcyBub2RlJ3MgY29udGVudHMgZG8gbm90IGV4aXN0CisgKgkJaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIGNvbW1lbnRSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgY29tbWVudHMgdGhhdCBwcmVjZWRlCisgKgkJdGhlIG1lbWJlciBkZWNsYXJhdGlvbi4gVGhlIGZpcnN0IG1hdGNoZXMgdGhlIHN0YXJ0IG9mIHRoaXMgbm9kZSdzCisgKgkJc291cmNlUmFuZ2UsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBuZXctbGluZSBvciBmaXJzdCBub24td2hpdGVzcGFjZQorICoJCWNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgY29tbWVudC4gSWYgbm8gY29tbWVudHMgYXJlIHByZXNlbnQsCisgKgkJdGhpcyBhcnJheSBjb250YWlucyB0d28gLTEncy4KKyAqIEBwYXJhbSBmbGFncyAtIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyLiBUaGUKKyAqCQlpbnRlZ2VyIGNhbiBiZSBhbmFseXplZCB3aXRoIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzCisgKiBAcGFyYW0gbW9kaWZpZXJSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YKKyAqCQltb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyIHdpdGhpbiBpdHMgc291cmNlIHJhbmdlLiBUaGUgZmlyc3QgaW50ZWdlcgorICoJCWlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IG1vZGlmaWVyIGZvciB0aGlzIG1lbWJlciwgYW5kCisgKgkJdGhlIHNlY29uZCBpbnRlZ2VyIGlzIHRoZSBsYXN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHByZWNlZWRpbmcgdGhlCisgKgkJbmV4dCBwYXJ0IG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLiBJZiB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzIHByZXNlbnQKKyAqCQlpbiB0aGlzIG5vZGUncyBzb3VyY2UgY29kZSAoaS5lLiBkZWZhdWx0IHByb3RlY3Rpb24pLCB0aGlzIGFycmF5CisgKgkJY29udGFpbnMgdHdvIC0xJ3MuCisgKiBAcGFyYW0gYm9keVN0YXJ0UG9zaXRpb24gLSB0aGUgcG9zaXRpb24gb2YgdGhlIG9wZW4gYnJhY2Ugb2YgdGhlIGJvZHkKKyAqIAkJb2YgdGhpcyBpbml0aWFsemVyLgorICovCitET01Jbml0aWFsaXplcihjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBpbnRbXSBjb21tZW50UmFuZ2UsIGludCBmbGFncywgaW50W10gbW9kaWZpZXJSYW5nZSwgaW50IGJvZHlTdGFydFBvc2l0aW9uKSB7CisJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBudWxsLCBuZXcgaW50W117LTEsIC0xfSwgY29tbWVudFJhbmdlLCBmbGFncywgbW9kaWZpZXJSYW5nZSk7CisJZkJvZHlSYW5nZT0gbmV3IGludFsyXTsKKwlmQm9keVJhbmdlWzBdPSBib2R5U3RhcnRQb3NpdGlvbjsKKwlmQm9keVJhbmdlWzFdPSBzb3VyY2VSYW5nZVsxXTsKKwlzZXRIYXNCb2R5KHRydWUpOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2ltcGxlIElOSVRJQUxJWkVSIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQ29udGVudHMgc3RhcnQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgZmlyc3QgcG9zaXRpb24uCisgKgkJQ29udGVudHMgZW5kIG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24uCisgKgkJQW4gYXJyYXkgb2YgLTEncyBpbmRpY2F0ZXMgdGhpcyBub2RlJ3MgY29udGVudHMgZG8gbm90IGV4aXN0CisgKgkJaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIGZsYWdzIC0gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIuIFRoZQorICoJCWludGVnZXIgY2FuIGJlIGFuYWx5emVkIHdpdGggb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKyAqLworRE9NSW5pdGlhbGl6ZXIoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgaW50IGZsYWdzKSB7CisJdGhpcyhkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZmxhZ3MsIG5ldyBpbnRbXSB7LTEsIC0xfSwgLTEpOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgZmFsc2UpOworCQorfQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWlmIChoYXNCb2R5KCkpIHsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKGdldEJvZHkoKSkKKwkJCS5hcHBlbmQoZkRvY3VtZW50LCBmQm9keVJhbmdlWzFdICsgMSwgZlNvdXJjZVJhbmdlWzFdIC0gZkJvZHlSYW5nZVsxXSk7CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZCgie30iKS5hcHBlbmQoVXRpbC5MSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisvKioKKyAqIEBzZWUgRE9NTWVtYmVyI2FwcGVuZE1lbWJlckRlY2xhcmF0aW9uQ29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJEZWNsYXJhdGlvbkNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHt9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNhcHBlbmRTaW1wbGVDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKKwkvLyBhcHBlbmQgZXZleXRoaW5nIGJlZm9yZSBteSBuYW1lCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSk7CisJLy8gYXBwZW5kIG15IG5hbWUKKwlidWZmZXIuYXBwZW5kKGZOYW1lKTsKKwkvLyBhcHBlbmQgZXZlcnl0aGluZyBhZnRlciBteSBuYW1lCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKK30KKy8qKgorICogQHNlZSBJRE9NSW5pdGlhbGl6ZXIjZ2V0Qm9keSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmIChoYXNCb2R5KCkpIHsKKwkJaWYgKGZCb2R5ICE9IG51bGwpIHsKKwkJCXJldHVybiBmQm9keTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyQXJyYXlPcHMuc3Vic3RyaW5nKGZEb2N1bWVudCwgZkJvZHlSYW5nZVswXSwgZkJvZHlSYW5nZVsxXSArIDEgLSBmQm9keVJhbmdlWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBET01Ob2RlI2dldERldGFpbGVkTm9kZSgpCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIGdldERldGFpbGVkTm9kZSgpIHsKKwlyZXR1cm4gKERPTU5vZGUpZ2V0RmFjdG9yeSgpLmNyZWF0ZUluaXRpYWxpemVyKGdldENvbnRlbnRzKCkpOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldEphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCWludCBjb3VudCA9IDE7CisJCUlET01Ob2RlIHByZXZpb3VzTm9kZSA9IGdldFByZXZpb3VzTm9kZSgpOworCQl3aGlsZSAocHJldmlvdXNOb2RlICE9IG51bGwpIHsKKwkJCWlmIChwcmV2aW91c05vZGUgaW5zdGFuY2VvZiBET01Jbml0aWFsaXplcikgeworCQkJCWNvdW50Kys7CisJCQl9CisJCQlwcmV2aW91c05vZGUgPSBwcmV2aW91c05vZGUuZ2V0UHJldmlvdXNOb2RlKCk7CisJCX0KKwkJcmV0dXJuICgoSVR5cGUpIHBhcmVudCkuZ2V0SW5pdGlhbGl6ZXIoY291bnQpOworCX0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisvKioKKyAqIEBzZWUgRE9NTWVtYmVyI2dldE1lbWJlckRlY2xhcmF0aW9uU3RhcnRQb3NpdGlvbigpCisgKi8KK3Byb3RlY3RlZCBpbnQgZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkgeworCXJldHVybiBmQm9keVJhbmdlWzBdOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldE5vZGVUeXBlKCkKKyAqLworcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwlyZXR1cm4gSURPTU5vZGUuSU5JVElBTElaRVI7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjaXNTaWdhbnR1cmVFcXVhbChJRE9NTm9kZSkuCisgKgorICogPHA+VGhpcyBtZXRob2QgYWx3YXlzIGFuc3dlcnMgZmFsc2Ugc2luY2UgYW4gaW5pdGlhbGl6ZXIKKyAqIGRvZXMgbm90IGhhdmUgYSBzaWduYXR1cmUuCisgKi8KK3B1YmxpYyBib29sZWFuIGlzU2lnbmF0dXJlRXF1YWwoSURPTU5vZGUgbm9kZSkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBET01Ob2RlCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIG5ld0RPTU5vZGUoKSB7CisJcmV0dXJuIG5ldyBET01Jbml0aWFsaXplcigpOworfQorLyoqCisgKiBPZmZzZXRzIGFsbCB0aGUgc291cmNlIGluZGV4ZXMgaW4gdGhpcyBub2RlIGJ5IHRoZSBnaXZlbiBhbW91bnQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG9mZnNldChpbnQgb2Zmc2V0KSB7CisJc3VwZXIub2Zmc2V0KG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UoZkJvZHlSYW5nZSwgb2Zmc2V0KTsKK30KKy8qKgorICogQHNlZSBJRE9NSW5pdGlhbGl6ZXIjc2V0Qm9keShjaGFyW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWZCb2R5PSBib2R5OworCXNldEhhc0JvZHkoYm9keSAhPSBudWxsKTsKKwlmcmFnbWVudCgpOworfQorLyoqCisgKiBAc2VlIElET01Jbml0aWFsaXplciNzZXROYW1lKFN0cmluZykKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkge30KKy8qKgorICogQHNlZSBET01Ob2RlI3NoYXJlQ29udGVudHMoRE9NTm9kZSkKKyAqLworcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKKwlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOworCURPTUluaXRpYWxpemVyIGluaXQ9IChET01Jbml0aWFsaXplcilub2RlOworCWZCb2R5PSBpbml0LmZCb2R5OworCWZCb2R5UmFuZ2U9IHJhbmdlQ29weShpbml0LmZCb2R5UmFuZ2UpOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI3RvU3RyaW5nKCkKKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIklOSVRJQUxJWkVSIjsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZW1iZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2NDVlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5T3BzOworCisvKioKKyAqIERPTU1lbWJlciBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJRE9NTWVtYmVyLgorICoKKyAqIEBzZWUgSURPTU1lbWJlcgorICogQHNlZSBET01Ob2RlCisgKi8KKworYWJzdHJhY3QgY2xhc3MgRE9NTWVtYmVyIGV4dGVuZHMgRE9NTm9kZSBpbXBsZW1lbnRzIElET01NZW1iZXIgeworCisJLyoqCisJICogVGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIG1lbWJlciB0aGF0IGNhbiBiZQorCSAqIGFuYWx5emVkIHdpdGggb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKwkgKi8KKwlwcm90ZWN0ZWQgaW50ICAgIGZGbGFncz0gMDsKKworCS8qKgorCSAqIFRoZSBtZW1iZXIncyBjb21tZW50cyB3aGVuIGl0IGhhcyBiZWVuIGFsdGVyZWQgZnJvbQorCSAqIHRoZSBjb250ZW50cyBpbiB0aGUgZG9jdW1lbnQsIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZDb21tZW50PSBudWxsOworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlCisJICogbWVtYmVyJ3MgcHJlY2VkaW5nIGNvbW1lbnRzIGluIHRoZSBkb2N1bWVudCwKKwkgKiBvciAtMSdzIGlmIHRoZSBtZW1iZXIgZGlkIG5vdCBvcmlnaW5hbGx5IGhhdmUgYQorCSAqIGNvbW1lbnQuCisJICovCisJIHByb3RlY3RlZCBpbnRbXSBmQ29tbWVudFJhbmdlOworCisKKwkvKioKKwkgKiBUaGUgbWVtYmVyJ3MgbW9kaWZpZXJzIHRleHR1YWwgcmVwcmVzZW50YXRpb24gd2hlbiAKKwkgKiB0aGUgbW9kaWZpZXJzIChmbGFncykgaGF2ZSBiZWVuIGFsdGVyZWQgZnJvbQorCSAqIHRoZWlyIG9yaWdpbmFsIGNvbnRlbnRzLCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJIHByb3RlY3RlZCBjaGFyW10gZk1vZGlmaWVycz0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBvcmlnaW5hbCBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoZQorCSAqIG1lbWJlcidzIG1vZGlmaWVycyBpbiB0aGUgZG9jdW1lbnQsIG9yIC0xJ3MgaWYKKwkgKiB0aGUgbWVtYmVyIGRpZCBub3Qgb3JpZ2luYWxseSBoYXZlIG1vZGlmaWVycyBpbgorCSAqIHRoZSBzb3VyY2UgY29kZSAoaS5lLiBkZWZhdWx0IHByb3RlY3Rpb24pLgorCSAqLworCSBwcm90ZWN0ZWQgaW50W10gZk1vZGlmaWVyUmFuZ2U7CisKKy8qKgorICogQ29uc3RydWN0cyBhbiBlbXB0eSBtZW1iZXIgbm9kZS4KKyAqLworRE9NTWVtYmVyKCkgeworCit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVtYmVyIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQ29udGVudHMgc3RhcnQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgZmlyc3QgcG9zaXRpb24uCisgKgkJQ29udGVudHMgZW5kIG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24uCisgKgkJQW4gYXJyYXkgb2YgLTEncyBpbmRpY2F0ZXMgdGhpcyBub2RlJ3MgY29udGVudHMgZG8gbm90IGV4aXN0CisgKgkJaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIG5hbWUgLSB0aGUgaWRlbnRpZmllciBwb3J0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbm9kZSwgb3IKKyAqCQk8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG5hbWUKKyAqIEBwYXJhbSBuYW1lUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlJ3MgbmFtZSB3aXRoaW4gaXRzIGRvY3VtZW50LAorICoJCWluY2x1ZGluZyBhbnkgYXJyYXkgcXVhbGlmaWVycyB0aGF0IG1pZ2h0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgbmFtZS4KKyAqIEBwYXJhbSBjb21tZW50UmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGNvbW1lbnRzIHRoYXQgcHJlY2VkZQorICoJCXRoZSBtZW1iZXIgZGVjbGFyYXRpb24uIFRoZSBmaXJzdCBtYXRjaGVzIHRoZSBzdGFydCBvZiB0aGlzIG5vZGUncworICoJCXNvdXJjZVJhbmdlLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgbmV3LWxpbmUgb3IgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKKyAqCQljaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBsYXN0IGNvbW1lbnQuIElmIG5vIGNvbW1lbnRzIGFyZSBwcmVzZW50LAorICoJCXRoaXMgYXJyYXkgY29udGFpbnMgdHdvIC0xJ3MuCisgKiBAcGFyYW0gZmxhZ3MgLSBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlci4gVGhlCisgKgkJaW50ZWdlciBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFncworICogQHBhcmFtIG1vZGlmaWVyUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIG9mCisgKgkJbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlciB3aXRoaW4gaXRzIHNvdXJjZSByYW5nZS4gVGhlIGZpcnN0IGludGVnZXIKKyAqCQlpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCBtb2RpZmllciBmb3IgdGhpcyBtZW1iZXIsIGFuZAorICoJCXRoZSBzZWNvbmQgaW50ZWdlciBpcyB0aGUgbGFzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBwcmVjZWVkaW5nIHRoZQorICoJCW5leHQgcGFydCBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4gSWYgdGhlcmUgYXJlIG5vIG1vZGlmaWVycyBwcmVzZW50CisgKgkJaW4gdGhpcyBub2RlJ3Mgc291cmNlIGNvZGUgKGkuZS4gZGVmYXVsdCBwcm90ZWN0aW9uKSwgdGhpcyBhcnJheQorICoJCWNvbnRhaW5zIHR3byAtMSdzLgorICovCitET01NZW1iZXIoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgaW50W10gY29tbWVudFJhbmdlLCBpbnQgZmxhZ3MsIGludFtdIG1vZGlmaWVyUmFuZ2UpIHsKKwlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5hbWVSYW5nZSk7CisJZkZsYWdzPSBmbGFnczsKKwlmQ29tbWVudD0gbnVsbDsKKwlmQ29tbWVudFJhbmdlPSBjb21tZW50UmFuZ2U7CisJZk1vZGlmaWVyUmFuZ2U9IG1vZGlmaWVyUmFuZ2U7CisJc2V0SGFzQ29tbWVudChjb21tZW50UmFuZ2VbMF0gPj0gMCk7Cit9CisvKioKKyAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSB0byB0aGUgZ2l2ZW4gQ2hhckFycmF5QnVmZmVyLCB1c2luZworICogdGhlIG9yaWdpbmFsIGRvY3VtZW50IGFuZCBpbmRpY2llcyBhcyBhIGZvcm0gZm9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZXMKKyAqIG9mIHRoaXMgbm9kZS4KKyAqCisgKiA8cD5UbyBmYWNpbGl0YXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmF0aW5nIGNvbnRlbnRzIGZvciBtZW1iZXJzLAorICogdGhlIGNvbnRlbnQgb2YgbWVtYmVycyBpcyBzcGxpdCBpbnRvIHRocmVlIHNlY3Rpb25zIC0gdGhlIGhlYWRlciwKKyAqIGRlY2xhcmF0aW9uLCBhbmQgYm9keSBzZWN0aW9ucy4gVGhlIGhlYWRlciBzZWN0aW9uIGluY2x1ZGVzIGFueSBwcmVjZWRpbmcKKyAqIGNvbW1lbnRzIGFuZCBtb2RpZmllcnMuIFRoZSBkZWNsYXJhdGlvbiBzZWN0aW9uIGluY2x1ZGVzIHRoZSBwb3J0aW9uIG9mCisgKiB0aGUgbWVtYmVyIGRlY2xhcmF0aW9uIHRoYXQgZm9sbG93cyBhbnkgbW9kaWZpZXJzIGFuZCBwcmVjZWRlcyB0aGUKKyAqIG1lbWJlciBib2R5LiBUaGUgYm9keSBzZWN0aW9uIGluY2x1ZGVzIHRoZSBtZW1iZXIgYm9keSBhbmQgYW55IHRyYWlsaW5nCisgKiB3aGl0ZXNwYWNlLgorICoKKyAqIEBzZWUgRE9NTm9kZSNhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWlmIChpc0RldGFpbGVkKCkpIHsKKwkJYXBwZW5kTWVtYmVySGVhZGVyRnJhZ21lbnQoYnVmZmVyKTsKKwkJYXBwZW5kTWVtYmVyRGVjbGFyYXRpb25Db250ZW50cyhidWZmZXIpOworCQlhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoYnVmZmVyKTsKKwl9IGVsc2UgeworCQlhcHBlbmRTaW1wbGVDb250ZW50cyhidWZmZXIpOworCX0KK30KKy8qKgorICogQXBwZW5kcyB0aGlzIG1lbWJlcidzIGJvZHkgY29udGVudHMgdG8gdGhlIGdpdmVuIENoYXJBcnJheUJ1ZmZlci4KKyAqIEJvZHkgY29udGVudHMgaW5jbHVkZSB0aGUgbWVtYmVyIGJvZHkgYW5kIGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICovCitwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcik7CisvKioKKyAqIEFwcGVuZHMgdGhpcyBtZW1iZXIncyBkZWNsYXJhdGlvbiBjb250ZW50cyB0byB0aGUgZ2l2ZW4gQ2hhckFycmF5QnVmZmVyLgorICogVGhlIGRlY2xhcmF0aW9uIGNvbnRlbnRzIGluY2x1ZGVzIHRoZSBwb3J0aW9uIG9mIHRoaXMgbWVtYmVyIHRoYXQKKyAqIGFwcGVhcnMgYWZ0ZXIgYW55IG1vZGlmaWVycyBhbmQgcHJlY2VkZXMgdGhlIGJvZHkuCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGVuZE1lbWJlckRlY2xhcmF0aW9uQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcik7CisvKioKKyAqIEFwcGVuZHMgdGhpcyBtZW1iZXIncyBoZWFkZXIgY29udGVudHMgdG8gdGhlIGdpdmVuIENoYXJBcnJheUJ1ZmZlci4KKyAqIEhlYWRlciBjb250ZW50cyBpbmNsdWRlIGFueSBwcmVjZWRpbmcgY29tbWVudHMgYW5kIG1vZGlmaWVycy4KKyAqLworcHJvdGVjdGVkIHZvaWQgYXBwZW5kTWVtYmVySGVhZGVyRnJhZ21lbnQoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCisJaW50IHNwYWNlU3RhcnQsIHNwYWNlRW5kOworCisJLy8gc3BhY2UgYmVmb3JlIGNvbW1lbnQKKwlpZiAoaGFzQ29tbWVudCgpKSB7CisJCXNwYWNlU3RhcnQ9IGZTb3VyY2VSYW5nZVswXTsKKwkJc3BhY2VFbmQ9IGZDb21tZW50UmFuZ2VbMF07CisJCWlmIChzcGFjZUVuZCA+IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBzcGFjZVN0YXJ0LCBzcGFjZUVuZCAtIHNwYWNlU3RhcnQpOworCQl9CisJfQorCQorCVN0cmluZyBmcmFnbWVudD0gZ2V0Q29tbWVudCgpOworCWlmIChmcmFnbWVudCAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoZnJhZ21lbnQpOworCX0KKworCWlmIChmQ29tbWVudFJhbmdlWzFdID49IDApIHsKKwkJc3BhY2VTdGFydD0gZkNvbW1lbnRSYW5nZVsxXSArIDE7CisJfSBlbHNlIHsKKwkJc3BhY2VTdGFydD0gZlNvdXJjZVJhbmdlWzBdOworCX0KKwlpZiAoZk1vZGlmaWVyUmFuZ2VbMF0gPj0gMCkgeworCQlzcGFjZUVuZD0gZk1vZGlmaWVyUmFuZ2VbMF0gLSAxOworCX0gZWxzZSB7CisJCXNwYWNlRW5kPSBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSAtIDE7CisJfQorCisJaWYgKHNwYWNlRW5kID49IHNwYWNlU3RhcnQpIHsKKwkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIHNwYWNlU3RhcnQsIHNwYWNlRW5kICsgMSAtIHNwYWNlU3RhcnQpOworCX0KKwlidWZmZXIuYXBwZW5kKGdldE1vZGlmaWVyc1RleHQoKSk7CisKK30KKy8qKgorICogQXBwZW5kcyB0aGUgY29udGVudHMgb2YgdGhpcyBub2RlIHRvIHRoZSBnaXZlbiBDaGFyQXJyYXlCdWZmZXIsIHVzaW5nCisgKiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgYW5kIGluZGljaWVzIGFzIGEgZm9ybSBmb3IgdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlcworICogb2YgdGhpcyBub2RlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGlzIG5vZGUgaXMga25vdyBub3QgdG8gaGF2ZQorICogZGV0YWlsZWQgc291cmNlIGluZGV4ZXMuCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpOworLyoqCisgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgd2l0aCB0aGUgbmV3IGVsZW1lbnQgYXBwZW5kZWQKKyAqIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICovCitwcm90ZWN0ZWQgU3RyaW5nW10gYXBwZW5kU3RyaW5nKFN0cmluZ1tdIGxpc3QsIFN0cmluZyBlbGVtZW50KSB7CisJU3RyaW5nW10gY29weT0gbmV3IFN0cmluZ1tsaXN0Lmxlbmd0aCArIDFdOworCVN5c3RlbS5hcnJheWNvcHkobGlzdCwgMCwgY29weSwgMCwgbGlzdC5sZW5ndGgpOworCWNvcHlbbGlzdC5sZW5ndGhdPSBlbGVtZW50OworCXJldHVybiBjb3B5OworfQorLyoqCisgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBkZXNjcmliaW5nIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyLAorICogZW5kaW5nIHdpdGggd2hpdGVzcGFjZSAoaWYgbm90IGVtcHR5KS4gVGhpcyB2YWx1ZSBzZXJ2ZXMgYXMgYSByZXBsYWNlbWVudAorICogdmFsdWUgZm9yIHRoZSBtZW1iZXIncyBtb2RpZmllciByYW5nZSB3aGVuIHRoZSBtb2RpZmllcnMgaGF2ZSBiZWVuIGFsdGVyZWQKKyAqIGZyb20gdGhlaXIgb3JpZ2luYWwgY29udGVudHMuCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gZ2VuZXJhdGVGbGFncygpIHsKKwljaGFyW10gZmxhZ3M9IEZsYWdzLnRvU3RyaW5nKGdldEZsYWdzKCkpLnRvQ2hhckFycmF5KCk7CisJaWYgKGZsYWdzLmxlbmd0aCA9PSAwKSB7CisJCXJldHVybiBmbGFnczsKKwl9IGVsc2UgeworCQlyZXR1cm4gQ2hhckFycmF5T3BzLmNvbmNhdChmbGFncywgbmV3IGNoYXJbXSB7JyAnfSk7CisJfQorfQorLyoqCisgKiBAc2VlIElET01NZW1iZXIjZ2V0Q29tbWVudCgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmIChoYXNDb21tZW50KCkpIHsKKwkJaWYgKGZDb21tZW50ICE9IG51bGwpIHsKKwkJCXJldHVybiBmQ29tbWVudDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyQXJyYXlPcHMuc3Vic3RyaW5nKGZEb2N1bWVudCwgZkNvbW1lbnRSYW5nZVswXSwgZkNvbW1lbnRSYW5nZVsxXSArIDEgLSBmQ29tbWVudFJhbmdlWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJRE9NTWVtYmVyI2dldEZsYWdzKCkKKyAqLworcHVibGljIGludCBnZXRGbGFncygpIHsKKwlyZXR1cm4gZkZsYWdzOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBtZW1iZXIncyBkZWNsYXJhdGlvbgorICogc2VjdGlvbi4KKyAqCisgKiBAc2VlIERPTU1lbWJlciNnZXRNZW1iZXJEZWNsYXJhdGlvbkNvbnRlbnRzKCkKKyAqIEBzZWUgRE9NTWVtYmVyI2dldEZyYWdtZW50ZWRDb250ZW50cygpCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCk7CisvKioKKyAqIFJldHVybnMgdGhlIFN0cmluZyB0byBiZSB1c2VkIGZvciB0aGlzIG1lbWJlcidzIGZsYWdzIHdoZW4KKyAqIGdlbmVyYXRpbmcgY29udGVudHMgLSBlaXRoZXIgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIGluIHRoZSBkb2N1bWVudAorICogb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICovCitwcm90ZWN0ZWQgY2hhcltdIGdldE1vZGlmaWVyc1RleHQoKSB7CisJaWYgKGZNb2RpZmllcnMgPT0gbnVsbCkgeworCQlpZiAoZk1vZGlmaWVyUmFuZ2VbMF0gPCAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyQXJyYXlPcHMuc3ViYXJyYXkoZkRvY3VtZW50LCBmTW9kaWZpZXJSYW5nZVswXSwgZk1vZGlmaWVyUmFuZ2VbMV0gKyAxIC0gZk1vZGlmaWVyUmFuZ2VbMF0pOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZNb2RpZmllcnM7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1iZXIgY3VycmVudGx5IGhhcyBhIGJvZHkuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGhhc0JvZHkoKSB7CisJcmV0dXJuIGdldE1hc2soTUFTS19IQVNfQk9EWSk7Cit9CisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1lbWJlciBjdXJyZW50bHkgaGFzIGEgY29tbWVudC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ29tbWVudCgpIHsKKwlyZXR1cm4gZ2V0TWFzayhNQVNLX0hBU19DT01NRU5UKTsKK30KKy8qKgorICogT2Zmc2V0cyBhbGwgdGhlIHNvdXJjZSBpbmRleGVzIGluIHRoaXMgbm9kZSBieSB0aGUgZ2l2ZW4gYW1vdW50LgorICovCitwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgeworCXN1cGVyLm9mZnNldChvZmZzZXQpOworCW9mZnNldFJhbmdlKGZDb21tZW50UmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UoZk1vZGlmaWVyUmFuZ2UsIG9mZnNldCk7Cit9CisvKioKKyAqIEBzZWUgSURPTU1lbWJlciNzZXRDb21tZW50KFN0cmluZykKKyAqLworcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworCWJlY29tZURldGFpbGVkKCk7CisJZkNvbW1lbnQ9IGNvbW1lbnQ7CisJZnJhZ21lbnQoKTsKKwlzZXRIYXNDb21tZW50KGNvbW1lbnQgIT0gbnVsbCk7CisJLyogc2VlIDFGVklKQUggKi8KKwlpZiAoY29tbWVudCAhPSBudWxsKSB7CisJCVN0cmluZyBjb21tZW50U3RyaW5nID0gbmV3IFN0cmluZyhjb21tZW50KTsKKwkJaWYgKGNvbW1lbnRTdHJpbmcuaW5kZXhPZigiQGRlcHJlY2F0ZWQiKSA+PSAwKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZGbGFncz0gZkZsYWdzIHwgSUNvbnN0YW50cy5BY2NEZXByZWNhdGVkOworCQkJcmV0dXJuOworCQl9CisKKwl9CisJZkZsYWdzPSBmRmxhZ3MgJiAofklDb25zdGFudHMuQWNjRGVwcmVjYXRlZCk7CisKK30KKy8qKgorICogQHNlZSBJRE9NTWVtYmVyI3NldEZsYWdzKGludCkKKyAqLworcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7CisJYmVjb21lRGV0YWlsZWQoKTsKKwlpZiAoRmxhZ3MuaXNEZXByZWNhdGVkKGZGbGFncykpIHsKKwkJZkZsYWdzPSBmbGFncyB8IElDb25zdGFudHMuQWNjRGVwcmVjYXRlZDsKKwl9IGVsc2UgeworCQlmRmxhZ3M9IGZsYWdzICYgKH5JQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQpOworCX0KKwlmcmFnbWVudCgpOworCWZNb2RpZmllcnM9IGdlbmVyYXRlRmxhZ3MoKTsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24gYXMgaGF2aW5nCisgKiBhIGJvZHkuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldEhhc0JvZHkoYm9vbGVhbiBoYXNCb2R5KSB7CisJc2V0TWFzayhNQVNLX0hBU19CT0RZLCBoYXNCb2R5KTsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24gYXMgaGF2aW5nCisgKiBhIHByZWNlZGluZyBjb21tZW50LgorICovCitwcm90ZWN0ZWQgdm9pZCBzZXRIYXNDb21tZW50KGJvb2xlYW4gaGFzQ29tbWVudCkgeworCXNldE1hc2soTUFTS19IQVNfQ09NTUVOVCwgaGFzQ29tbWVudCk7Cit9CisvKioKKyAqIFNldHMgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyBub2RlJ3MgY29udGVudHMKKyAqIGluIGl0cyBkb2N1bWVudC4gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGR1cmluZyBET00gY3JlYXRpb24gd2hpbGUKKyAqIG5vcm1hbGl6aW5nIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgZWFjaCBub2RlLgorICoKKyAqIFN5bmNocm9uaXplIHRoZSBzdGFydCBvZiB0aGUgY29tbWVudCBwb3NpdGlvbiB3aXRoIHRoZSBzdGFydCBvZiB0aGUKKyAqIG5vZGUuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFN0YXJ0UG9zaXRpb24oaW50IHN0YXJ0KSB7CisJaWYgKGZDb21tZW50UmFuZ2VbMF0gPj0gMCkgeworCQlmQ29tbWVudFJhbmdlWzBdPSBzdGFydDsKKwl9CisJc3VwZXIuc2V0U3RhcnRQb3NpdGlvbihzdGFydCk7Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNzaGFyZUNvbnRlbnRzKERPTU5vZGUpCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNoYXJlQ29udGVudHMoRE9NTm9kZSBub2RlKSB7CisJc3VwZXIuc2hhcmVDb250ZW50cyhub2RlKTsKKwlET01NZW1iZXIgbWVtYmVyPSAoRE9NTWVtYmVyKW5vZGU7CisJZkNvbW1lbnQ9IG1lbWJlci5mQ29tbWVudDsKKwlmQ29tbWVudFJhbmdlPSByYW5nZUNvcHkobWVtYmVyLmZDb21tZW50UmFuZ2UpOworCWZGbGFncz0gbWVtYmVyLmZGbGFnczsKKwlmTW9kaWZpZXJzPSBtZW1iZXIuZk1vZGlmaWVyczsKKwlmTW9kaWZpZXJSYW5nZT0gcmFuZ2VDb3B5KG1lbWJlci5mTW9kaWZpZXJSYW5nZSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ0NDA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZXRob2QuamF2YQpAQCAtMCwwICsxLDcxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheU9wczsKKworLyoqCisgKiBET01NZXRob2QgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSURPTU1ldGhvZC4KKyAqCisgKiBAc2VlIElET01NZXRob2QKKyAqIEBzZWUgRE9NTm9kZQorICovCisgCitjbGFzcyBET01NZXRob2QgZXh0ZW5kcyBET01NZW1iZXIgaW1wbGVtZW50cyBJRE9NTWV0aG9kIHsKKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIHdoZW4gdGhlCisJICogcmV0dXJuIHR5cGUgaGFzIGJlZW4gYWx0ZXJlZCBmcm9tIHRoZSBjb250ZW50cworCSAqIGluIHRoZSBkb2N1bWVudCwgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZlJldHVyblR5cGU7CisKKwkvKioKKwkgKiBUaGUgb3JpZ2luYWwgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGUKKwkgKiBtZXRob2QncyByZXR1cm4gdHlwZSBpbiB0aGUgZG9jdW1lbnQsIG9yIC0xJ3MKKwkgKiBpZiBubyByZXR1cm4gdHlwZSBpcyBwcmVzZW50IGluIHRoZSBkb2N1bWVudC4KKwkgKiBJZiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBtZXRob2QgaXMgcXVhbGlmaWVkIHdpdGgKKwkgKiAnW10nIGZvbGxvd2luZyB0aGUgcGFyYW1ldGVyIGxpc3QsIHRoaXMgYXJyYXkgaGFzCisJICogZm91ciBlbnRyaWVzLiBJbiB0aGlzIGNhc2UsIHRoZSBsYXN0IHR3byBlbnRyaWVzCisJICogb2YgdGhlIGFycmF5IGFyZSB0aGUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZgorCSAqIHRoZSBhcnJheSBxdWFsaWZpZXJzLgorCSAqLworCXByb3RlY3RlZCBpbnRbXSAgZlJldHVyblR5cGVSYW5nZTsKKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncworCSAqIHBhcmFtZXRlciBsaXN0LCBpbmNsdWRpbmcgb3BlbiBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcworCSAqIHdoZW4gdGhlIHBhcmFtZXRlcnMgaGFkIGJlZW4gYWx0ZXJlZCBmcm9tIHRoZSBjb250ZW50cworCSAqIGluIHRoZSBkb2N1bWVudCwgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBjaGFyW10gZlBhcmFtZXRlckxpc3Q7CisKKwkvKioKKwkgKiBUaGUgb3JpZ2luYWwgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGUKKwkgKiBtZXRob2QncyBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdICBmUGFyYW1ldGVyUmFuZ2U7CisKKwkvKioKKwkgKiBDb250YWlucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3MKKwkgKiBleGNlcHRpb24gbGlzdCB3aGVuIHRoZSBleGNlcHRpb25zIGhhZCBiZWVuIGFsdGVyZWQKKwkgKiBmcm9tIHRoZSBjb250ZW50cyBpbiB0aGUgZG9jdW1lbnQsIG90aGVyd2lzZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgZXhjZXB0aW9uIGxpc3QgaXMgYSBjb21tZW50CisJICogZGVsaW1pdGVkIGxpc3Qgb2YgZXhjZXB0aW9ucywgbm90IGluY2x1ZGluZyB0aGUgInRocm93cyIKKwkgKiBrZXl3b3JkLgorCSAqLworCXByb3RlY3RlZCBjaGFyW10gZkV4Y2VwdGlvbkxpc3Q7CisKKwkvKioKKwkgKiBUaGUgb3JpZ2luYWwgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGUKKwkgKiBtZXRob2QncyBleGNlcHRpb24gbGlzdCBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdICBmRXhjZXB0aW9uUmFuZ2U7CisJCisJLyoqCisJICogQ29udGFpbnMgdGhlIG1ldGhvZCdzIGJvZHkgd2hlbiB0aGUgYm9keSBoYXMKKwkgKiBiZWVuIGFsdGVyZWQgZnJvbSB0aGUgY29udGVudHMgaW4gdGhlIGRvY3VtZW50LAorCSAqIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGJvZHkgaW5jbHVkZXMgZXZlcnl0aGluZworCSAqIGJldHdlZW4gYW5kIGluY2x1ZGluZyB0aGUgZW5jbG9zaW5nIGJyYWNlcywgYW5kIHRyYWlsaW5nCisJICogd2hpdGVzcGFjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZCb2R5OworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlCisJICogbWV0aG9kJ3MgYm9keS4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10gIGZCb2R5UmFuZ2U7CisKKworCS8qKgorCSAqIE5hbWVzIG9mIHBhcmFtZXRlcnMgaW4gdGhlIG1ldGhvZCBwYXJhbWV0ZXIgbGlzdCwKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBmUGFyYW1ldGVyTmFtZXM7CisKKwkvKioKKwkgKiBUeXBlcyBvZiBwYXJhbWV0ZXJzIGluIHRoZSBtZXRob2QgcGFyYW1ldGVyIGxpc3QsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycy4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZlBhcmFtZXRlclR5cGVzOworCisJLyoqCisJICogVGhlIGV4Y2VwdGlvbnMgdGhlIG1ldGhvZCB0aHJvd3MsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgdGhlIG1ldGhvZCB0aHJvd3Mgbm8gZXhjZXB0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZkV4Y2VwdGlvbnM7CisKKwkKKy8qKgorICogQ29uc3RydWN0cyBhbiBlbXB0eSBtZXRob2Qgbm9kZS4KKyAqLworRE9NTWV0aG9kKCkgeworCit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZGV0YWlsZWQgTUVUSE9EIGRvY3VtZW50IGZyYWdtZW50IG9uIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQuCisgKgorICogQHBhcmFtIGRvY3VtZW50IC0gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMKKyAqIEBwYXJhbSBzb3VyY2VSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUgd2l0aGluIGl0cyBkb2N1bWVudC4KKyAqIAkJQ29udGVudHMgc3RhcnQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgZmlyc3QgcG9zaXRpb24uCisgKgkJQ29udGVudHMgZW5kIG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxhc3QgcG9zaXRpb24uCisgKgkJQW4gYXJyYXkgb2YgLTEncyBpbmRpY2F0ZXMgdGhpcyBub2RlJ3MgY29udGVudHMgZG8gbm90IGV4aXN0CisgKgkJaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIG5hbWUgLSB0aGUgaWRlbnRpZmllciBwb3J0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbm9kZSwgb3IKKyAqCQk8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG5hbWUKKyAqIEBwYXJhbSBuYW1lUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlJ3MgbmFtZSB3aXRoaW4gaXRzIGRvY3VtZW50LAorICoJCWluY2x1ZGluZyBhbnkgYXJyYXkgcXVhbGlmaWVycyB0aGF0IG1pZ2h0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgbmFtZQorICoJCW9yIC0xJ3MgaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lLgorICogQHBhcmFtIGNvbW1lbnRSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgY29tbWVudHMgdGhhdCBwcmVjZWRlCisgKgkJdGhlIG1lbWJlciBkZWNsYXJhdGlvbi4gVGhlIGZpcnN0IG1hdGNoZXMgdGhlIHN0YXJ0IG9mIHRoaXMgbm9kZSdzCisgKgkJc291cmNlUmFuZ2UsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBuZXctbGluZSBvciBmaXJzdCBub24td2hpdGVzcGFjZQorICoJCWNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgY29tbWVudC4gSWYgbm8gY29tbWVudHMgYXJlIHByZXNlbnQsCisgKgkJdGhpcyBhcnJheSBjb250YWlucyB0d28gLTEncy4KKyAqIEBwYXJhbSBmbGFncyAtIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyLiBUaGUKKyAqCQlpbnRlZ2VyIGNhbiBiZSBhbmFseXplZCB3aXRoIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzCisgKiBAcGFyYW0gbW9kaWZpZXJSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YKKyAqCQltb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyIHdpdGhpbiBpdHMgc291cmNlIHJhbmdlLiBUaGUgZmlyc3QgaW50ZWdlcgorICoJCWlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IG1vZGlmaWVyIGZvciB0aGlzIG1lbWJlciwgYW5kCisgKgkJdGhlIHNlY29uZCBpbnRlZ2VyIGlzIHRoZSBsYXN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHByZWNlZWRpbmcgdGhlCisgKgkJbmV4dCBwYXJ0IG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLiBJZiB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzIHByZXNlbnQKKyAqCQlpbiB0aGlzIG5vZGUncyBzb3VyY2UgY29kZSAoaS5lLiBkZWZhdWx0IHByb3RlY3Rpb24pLCB0aGlzIGFycmF5CisgKgkJY29udGFpbnMgdHdvIC0xJ3MuCisgKiBAcGFyYW0gaXNDb25zdHJ1Y3RvciAtIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBhIGNvbnRydWN0b3IsIG90aGVyd2lzZSBmYWxzZQorICogQHBhcmFtIHJldHVyblR5cGUgLSB0aGUgbm9ybWFsaXplZCByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZAorICogQHBhcmFtIHJldHVyblR5cGVSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlCisgKgkJcmV0dXJuIHR5cGUgd2l0aGluIHRoZSBtZXRob2QncyBzb3VyY2UgcmFuZ2UuIFRoZSBmaXJzdCBpbnRlZ2VyIGlzIGlzCisgKgkJdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJldHVybiB0eXBlLCBhbmQgdGhlIHNlY29uZAorICoJCWludGVnZXIgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgcmV0dXJuIHR5cGUuCisgKgkJRm9yIGNvbnN0cnVjdG9ycywgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIC0xJ3MuCisgKiAJCUlmIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZCBpcyBxdWFsaWZpZWQgd2l0aCAnW10nIGZvbGxvd2luZyB0aGUKKyAqCQlwYXJhbWV0ZXIgbGlzdCwgdGhpcyBhcnJheSBoYXMgZm91ciBlbnRyaWVzLiBJbiB0aGlzIGNhc2UsIHRoZSBsYXN0CisgKgkJdHdvIGVudHJpZXMgb2YgdGhlIGFycmF5IGFyZSB0aGUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGUgYXJyYXkKKyAqCQlxdWFsaWZpZXJzLgorICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIC0gYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHR5cGVzIGluIHRoZSBtZXRob2QgZGVjbGFyYXRpb24KKyAqIAkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIC0gYW4gYXJyYXkgb2YgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBtZXRob2QgZGVjbGFyYXRpb24KKyAqIAkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICogQHBhcmFtIHBhcmFtZXRlclJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqIAkJcGFyYW1ldGVyIGxpc3QgaW4gdGhlIG1ldGhvZC4gVGhlIGZpcnN0IGludGVnZXIgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQorICoJCW9wZW4gcGFyZW50aGVzaXMgYW5kIHRoZSBzZWNvbmQgaW50ZWdlciBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcKKyAqCQlwYXJlbnRoZXNpcy4KKyAqIEBwYXJhbSBleGNlcHRpb25zIC0gYW4gYXJyYXkgb2YgdGhlIG5hbWVzIG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoaXMgbWV0aG9kCisgKgkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCB0aHJvd3Mgbm8gZXhjZXB0aW9ucworICogQHBhcmFtIGV4Y2VwdGlvblJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqIAkJZXhjZXB0aW9uIGxpc3QgaW4gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4gVGhlIGZpcnN0IGludGVnZXIgaXMgdGhlIHBvc2l0aW9uCisgKiAJCW9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGZpcnN0IGV4Y2VwdGlvbiB0aGUgbWV0aG9kIHRocm93cywgYW5kIHRoZQorICoJCXNlY29uZCBpbnRlZ2VyIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGxhc3QgZXhjZXB0aW9uCisgKgkJdGhpcyBtZXRob2QgdGhyb3dzLgorICogQHBhcmFtIGJvZHlSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGhvZCdzIGJvZHkuCisgKgkJVGhlIGZpcnN0IGludGVnZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIG1ldGhvZCdzCisgKgkJcGFyYW1ldGVyIGxpc3QsIG9yIGV4Y2VwdGlvbiBsaXN0IChpZiBwcmVzZW50KS4gVGhlIHNlY29uZCBpbnRlZ2VyIGlzIHRoZSBsb2NhdGlvbgorICogCQlvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIG1ldGhvZCdzIHNvdXJjZSByYW5nZS4KKyAqLworRE9NTWV0aG9kKGNoYXJbXSBkb2N1bWVudCwgaW50W10gc291cmNlUmFuZ2UsIFN0cmluZyBuYW1lLCBpbnRbXSBuYW1lUmFuZ2UsIGludFtdIGNvbW1lbnRSYW5nZSwgaW50IGZsYWdzLCBpbnRbXSBtb2RpZmllclJhbmdlLCBib29sZWFuIGlzQ29uc3RydWN0b3IsIFN0cmluZyByZXR1cm5UeXBlLCBpbnRbXSByZXR1cm5UeXBlUmFuZ2UsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzLCBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcywgaW50W10gcGFyYW1ldGVyUmFuZ2UsIFN0cmluZ1tdIGV4Y2VwdGlvbnMsIGludFtdIGV4Y2VwdGlvblJhbmdlLCBpbnRbXSBib2R5UmFuZ2UpIHsKKwlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCBmbGFncywgbW9kaWZpZXJSYW5nZSk7CisKKwlzZXRNYXNrKE1BU0tfSVNfQ09OU1RSVUNUT1IsIGlzQ29uc3RydWN0b3IpOworCWZSZXR1cm5UeXBlPSByZXR1cm5UeXBlOworCWZSZXR1cm5UeXBlUmFuZ2U9IHJldHVyblR5cGVSYW5nZTsKKwlmUGFyYW1ldGVyVHlwZXM9IHBhcmFtZXRlclR5cGVzOworCWZQYXJhbWV0ZXJOYW1lcz0gcGFyYW1ldGVyTmFtZXM7CisJZlBhcmFtZXRlclJhbmdlPSBwYXJhbWV0ZXJSYW5nZTsKKwlmRXhjZXB0aW9uUmFuZ2U9IGV4Y2VwdGlvblJhbmdlOworCWZFeGNlcHRpb25zPSBleGNlcHRpb25zOworCXNldEhhc0JvZHkodHJ1ZSk7CisJZkJvZHlSYW5nZT0gYm9keVJhbmdlOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7CisJCit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2ltcGxlIE1FVEhPRCBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiBAcGFyYW0gbmFtZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSdzIG5hbWUgd2l0aGluIGl0cyBkb2N1bWVudCwKKyAqCQlpbmNsdWRpbmcgYW55IGFycmF5IHF1YWxpZmllcnMgdGhhdCBtaWdodCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG5hbWUKKyAqCQlvciAtMSdzIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KKyAqIEBwYXJhbSBmbGFncyAtIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBtb2RpZmllcnMgZm9yIHRoaXMgbWVtYmVyLiBUaGUKKyAqCQlpbnRlZ2VyIGNhbiBiZSBhbmFseXplZCB3aXRoIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzCisgKiBAcGFyYW0gaXNDb25zdHJ1Y3RvciAtIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBhIGNvbnRydWN0b3IsIG90aGVyd2lzZSBmYWxzZQorICogQHBhcmFtIHJldHVyblR5cGUgLSB0aGUgbm9ybWFsaXplZCByZXR1cm4gdHlwZSBvZiB0aGlzIG1ldGhvZAorICogQHBhcmFtIHBhcmFtZXRlclR5cGVzIC0gYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHR5cGVzIGluIHRoZSBtZXRob2QgZGVjbGFyYXRpb24KKyAqIAkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIC0gYW4gYXJyYXkgb2YgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBtZXRob2QgZGVjbGFyYXRpb24KKyAqIAkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1ldGhvZCBoYXMgbm8gcGFyYW1ldGVycworICogQHBhcmFtIGV4Y2VwdGlvbnMgLSBhbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhpcyBtZXRob2QKKyAqCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kIHRocm93cyBubyBleGNlcHRpb25zCisgKi8KK0RPTU1ldGhvZChjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlLCBpbnQgZmxhZ3MsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvciwgU3RyaW5nIHJldHVyblR5cGUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzLCBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcywgU3RyaW5nW10gZXhjZXB0aW9ucykgeworCXRoaXMoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZmxhZ3MsIG5ldyBpbnRbXSB7LTEsIC0xfSwgaXNDb25zdHJ1Y3RvciwgcmV0dXJuVHlwZSwgbmV3IGludFtdIHstMSwgLTF9LCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyTmFtZXMsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZXhjZXB0aW9ucywgbmV3IGludFtdIHstMSwgLTF9LCBuZXcgaW50W10gey0xLCAtMX0pOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgZmFsc2UpOworfQorLyoqCisgKiBAc2VlIElET01NZXRob2QjYWRkRXhjZXB0aW9uKFN0cmluZykKKyAqLworcHVibGljIHZvaWQgYWRkRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubnVsbEV4Y2VwdGlvblR5cGUiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKGZFeGNlcHRpb25zID09IG51bGwpIHsKKwkJZkV4Y2VwdGlvbnM9IG5ldyBTdHJpbmdbMV07CisJCWZFeGNlcHRpb25zWzBdPSBuYW1lOworCX0gZWxzZSB7CisJCWZFeGNlcHRpb25zPSBhcHBlbmRTdHJpbmcoZkV4Y2VwdGlvbnMsIG5hbWUpOworCX0KKwlzZXRFeGNlcHRpb25zKGZFeGNlcHRpb25zKTsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI2FkZFBhcmFtZXRlcihTdHJpbmcsIFN0cmluZykKKyAqLworcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHR5cGUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm51bGxUeXBlUGFyYW1ldGVyIikpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChuYW1lID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5udWxsTmFtZVBhcmFtZXRlciIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAoZlBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKKwkJZlBhcmFtZXRlck5hbWVzPSBuZXcgU3RyaW5nWzFdOworCQlmUGFyYW1ldGVyTmFtZXNbMF09IG5hbWU7CisJfSBlbHNlIHsKKwkJZlBhcmFtZXRlck5hbWVzPSBhcHBlbmRTdHJpbmcoZlBhcmFtZXRlck5hbWVzLCBuYW1lKTsKKwl9CisJaWYgKGZQYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7CisJCWZQYXJhbWV0ZXJUeXBlcz0gbmV3IFN0cmluZ1sxXTsKKwkJZlBhcmFtZXRlclR5cGVzWzBdPSB0eXBlOworCX0gZWxzZSB7CisJCWZQYXJhbWV0ZXJUeXBlcz0gYXBwZW5kU3RyaW5nKGZQYXJhbWV0ZXJUeXBlcywgdHlwZSk7CisJfQorCXNldFBhcmFtZXRlcnMoZlBhcmFtZXRlclR5cGVzLCBmUGFyYW1ldGVyTmFtZXMpOworfQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWlmIChmQm9keSAhPSBudWxsKSB7CisJCWJ1ZmZlci5hcHBlbmQoZkJvZHkpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQm9keVJhbmdlWzBdLCBmQm9keVJhbmdlWzFdICsgMSAtIGZCb2R5UmFuZ2VbMF0pOworCX0KK30KKy8qKgorICogQHNlZSBET01NZW1iZXIjYXBwZW5kTWVtYmVyRGVjbGFyYXRpb25Db250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZE1lbWJlckRlY2xhcmF0aW9uQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCisJaWYgKGlzQ29uc3RydWN0b3IoKSkgeworCQlidWZmZXIKKwkJCS5hcHBlbmQoZ2V0Q29uc3RydWN0b3JOYW1lKCkpCisJCQkuYXBwZW5kKGZEb2N1bWVudCwgZk5hbWVSYW5nZVsxXSArIDEsIGZQYXJhbWV0ZXJSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKTsKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKGdldFJldHVyblR5cGVDb250ZW50cygpKTsKKwkJaWYgKGZSZXR1cm5UeXBlUmFuZ2VbMF0gPj0gMCkgeworCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZSZXR1cm5UeXBlUmFuZ2VbMV0gKyAxLCBmTmFtZVJhbmdlWzBdIC0gZlJldHVyblR5cGVSYW5nZVsxXSAtIDEpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQl9CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChnZXROYW1lQ29udGVudHMoKSkKKwkJCS5hcHBlbmQoZkRvY3VtZW50LCBmTmFtZVJhbmdlWzFdICsgMSwgZlBhcmFtZXRlclJhbmdlWzBdIC0gZk5hbWVSYW5nZVsxXSAtIDEpOworCX0KKwlpZiAoZlBhcmFtZXRlckxpc3QgIT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKGZQYXJhbWV0ZXJMaXN0KTsKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlBhcmFtZXRlclJhbmdlWzBdLCBmUGFyYW1ldGVyUmFuZ2VbMV0gKyAxIC0gZlBhcmFtZXRlclJhbmdlWzBdKTsKKwl9CisJaW50IHN0YXJ0OworCWlmIChoYXNUcmFpbGluZ0FycmF5UXVhbGlmaWVyKCkgJiYgaXNSZXR1cm5UeXBlQWx0ZXJlZCgpKSB7CisJCXN0YXJ0PSBmUmV0dXJuVHlwZVJhbmdlWzNdICsgMTsKKwl9IGVsc2UgeworCQlzdGFydD0gZlBhcmFtZXRlclJhbmdlWzFdICsgMTsKKwl9CisJaWYgKGZFeGNlcHRpb25zICE9IG51bGwpIHsKKwkJLy8gYWRkICd0aHJvd3MnIGtleXdvcmQKKwkJaWYgKGZFeGNlcHRpb25SYW5nZVswXSA+PSAwKSB7CisJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgc3RhcnQsIGZFeGNlcHRpb25SYW5nZVswXSAtIHN0YXJ0KTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIiB0aHJvd3MgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkvLyBhZGQgZXhjZXB0aW9uIGxpc3QKKwkJaWYgKGZFeGNlcHRpb25MaXN0ICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoZkV4Y2VwdGlvbkxpc3QpOworCQkJLy8gYWRkIHNwYWNlIGJlZm9yZSBib2R5CisJCQlpZiAoZkV4Y2VwdGlvblJhbmdlWzBdID49IDApIHsKKwkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkV4Y2VwdGlvblJhbmdlWzFdICsgMSwgZkJvZHlSYW5nZVswXSAtIGZFeGNlcHRpb25SYW5nZVsxXSAtIDEpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlBhcmFtZXRlclJhbmdlWzFdICsgMSwgZkJvZHlSYW5nZVswXSAtIGZQYXJhbWV0ZXJSYW5nZVsxXSAtIDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gYWRkIGxpc3QgYW5kIHNwYWNlIGJlZm9yZSBib2R5CisJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZkV4Y2VwdGlvblJhbmdlWzBdLCBmQm9keVJhbmdlWzBdIC0gZkV4Y2VwdGlvblJhbmdlWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIGFkZCBzcGFjZSBiZWZvcmUgYm9keQorCQlpZiAoZkV4Y2VwdGlvblJhbmdlWzBdID49IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXhjZXB0aW9uUmFuZ2VbMV0gKyAxLCBmQm9keVJhbmdlWzBdIC0gZkV4Y2VwdGlvblJhbmdlWzFdIC0gMSk7CisJCX0gZWxzZSB7CisJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgc3RhcnQsIGZCb2R5UmFuZ2VbMF0gLSBzdGFydCk7CisJCX0KKwl9CisJCit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNhcHBlbmRTaW1wbGVDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIpCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKKwkvLyBhcHBlbmQgZXZleXRoaW5nIGJlZm9yZSBteSBuYW1lCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZk5hbWVSYW5nZVswXSAtIGZTb3VyY2VSYW5nZVswXSk7CisJLy8gYXBwZW5kIG15IG5hbWUKKwlpZiAoaXNDb25zdHJ1Y3RvcigpKSB7CisJCWJ1ZmZlci5hcHBlbmQoZ2V0Q29uc3RydWN0b3JOYW1lKCkpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoZk5hbWUpOworCX0KKwkvLyBhcHBlbmQgZXZlcnl0aGluZyBhZnRlciBteSBuYW1lCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI2dldEJvZHkoKQorICovCitwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7CisJYmVjb21lRGV0YWlsZWQoKTsKKwlpZiAoaGFzQm9keSgpKSB7CisJCWlmIChmQm9keSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZkJvZHk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gQ2hhckFycmF5T3BzLnN1YnN0cmluZyhmRG9jdW1lbnQsIGZCb2R5UmFuZ2VbMF0sIGZCb2R5UmFuZ2VbMV0gKyAxIC0gZkJvZHlSYW5nZVswXSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBlbmNsc29pbmcgdHlwZSBmb3IgdGhpcyBjb25zdHJ1Y3Rvci4KKyAqIElmIHRoZSBjb25zdHVjdG9yIGlzIG5vdCBjdXJyZW50bHkgZW5jbG9zZWQgaW4gYSB0eXBlLCB0aGUgb3JpZ2luYWwKKyAqIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIGFzIGZvdW5kIGluIHRoZSBkb2N1bW5lbnQgaXMgcmV0dXJuZWQuCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgZ2V0Q29uc3RydWN0b3JOYW1lKCkgeworCisJaWYgKGlzQ29uc3RydWN0b3IoKSkgeworCQlpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFBhcmVudCgpLmdldE5hbWUoKTsKKwkJfSBlbHNlIHsKKwkJCS8vIElmIHRoZXJlIGlzIG5vIHBhcmVudCB1c2UgdGhlIG9yaWdpbmFsIG5hbWUKKwkJCXJldHVybiBuZXcgU3RyaW5nKGdldE5hbWVDb250ZW50cygpKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KKwkKK30KKy8qKgorICogQHNlZSBET01Ob2RlI2dldERldGFpbGVkTm9kZSgpCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIGdldERldGFpbGVkTm9kZSgpIHsKKwlyZXR1cm4gKERPTU5vZGUpZ2V0RmFjdG9yeSgpLmNyZWF0ZU1ldGhvZChnZXRDb250ZW50cygpKTsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI2dldEV4Y2VwdGlvbnMoKQorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0RXhjZXB0aW9ucygpIHsKKwlyZXR1cm4gZkV4Y2VwdGlvbnM7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0SmF2YUVsZW1lbnQKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgcGFyZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKKwkJLy8gdHJhbnNsYXRlIHBhcmFtZXRlciB0eXBlcyB0byBzaWduYXR1cmVzCisJCVN0cmluZ1tdIHNpZ3M9IG51bGw7CisJCWlmIChmUGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgeworCQkJc2lncz0gbmV3IFN0cmluZ1tmUGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKKwkJCWludCBpOworCQkJZm9yIChpPSAwOyBpIDwgZlBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJc2lnc1tpXT0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZlBhcmFtZXRlclR5cGVzW2ldLnRvQ2hhckFycmF5KCksIGZhbHNlKTsKKwkJCX0KKwkJfQorCQlTdHJpbmcgbmFtZT0gbnVsbDsKKwkJaWYgKGlzQ29uc3RydWN0b3IoKSkgeworCQkJbmFtZT0gZ2V0Q29uc3RydWN0b3JOYW1lKCk7CisJCX0gZWxzZSB7CisJCQluYW1lPSBnZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuICgoSVR5cGUpcGFyZW50KS5nZXRNZXRob2QobmFtZSwgc2lncyk7CisJfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaWxsZWdhbFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KKy8qKgorICogQHNlZSBET01NZW1iZXIjZ2V0TWVtYmVyRGVjbGFyYXRpb25TdGFydFBvc2l0aW9uKCkKKyAqLworcHJvdGVjdGVkIGludCBnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKSB7CisJaWYgKGZSZXR1cm5UeXBlUmFuZ2VbMF0gPj0gMCkgeworCQlyZXR1cm4gZlJldHVyblR5cGVSYW5nZVswXTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZk5hbWVSYW5nZVswXTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0TmFtZSgpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwlpZiAoaXNDb25zdHJ1Y3RvcigpKSB7CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5nZXROYW1lKCk7CisJfQorfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldE5vZGVUeXBlKCkKKyAqLworcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKKwlyZXR1cm4gSURPTU5vZGUuTUVUSE9EOworfQorLyoqCisgKiBAc2VlIElET01NZXRob2QjZ2V0UGFyYW1ldGVyTmFtZXMoKQorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisJcmV0dXJuIGZQYXJhbWV0ZXJOYW1lczsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI2dldFBhcmFtZXRlclR5cGVzKCkKKyAqLworcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworCXJldHVybiBmUGFyYW1ldGVyVHlwZXM7Cit9CisvKioKKyAqIEBzZWUgSURPTU1ldGhvZCNnZXRSZXR1cm5UeXBlKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCkgeworCWlmIChpc0NvbnN0cnVjdG9yKCkpIHsKKwkJcmV0dXJuIG51bGw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZSZXR1cm5UeXBlOworCX0KK30KKy8qKgorICogUmV0dXJucyB0aGUgc291cmNlIGNvZGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBtZXRob2QncyByZXR1cm4gdHlwZQorICovCitwcm90ZWN0ZWQgY2hhcltdIGdldFJldHVyblR5cGVDb250ZW50cygpIHsKKwlpZiAoaXNDb25zdHJ1Y3RvcigpKSB7CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCWlmIChpc1JldHVyblR5cGVBbHRlcmVkKCkpIHsKKwkJCXJldHVybiBmUmV0dXJuVHlwZS50b0NoYXJBcnJheSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIENoYXJBcnJheU9wcy5zdWJhcnJheShmRG9jdW1lbnQsIGZSZXR1cm5UeXBlUmFuZ2VbMF0sIGZSZXR1cm5UeXBlUmFuZ2VbMV0gKyAxIC0gZlJldHVyblR5cGVSYW5nZVswXSk7CisJCX0KKworCX0KK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgaGFzCisgKiBhcnJheSBxdWFsaWZpZXJzICgnW10nKSBmb2xsb3dpbmcgdGhlIHBhcmFtZXRlciBsaXN0LgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUcmFpbGluZ0FycmF5UXVhbGlmaWVyKCkgeworCXJldHVybiBmUmV0dXJuVHlwZVJhbmdlLmxlbmd0aCA+IDI7Cit9CisvKioKKyAqIEBzZWUgSURPTU1ldGhvZCNpc0NvbnN0cnVjdG9yKCkKKyAqLworcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKKwlyZXR1cm4gZ2V0TWFzayhNQVNLX0lTX0NPTlNUUlVDVE9SKTsKK30KKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgaGFzIGJlZW4gYWx0ZXJlZAorICogZnJvbSB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgY29udGVudHMuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzUmV0dXJuVHlwZUFsdGVyZWQoKSB7CisJcmV0dXJuIGdldE1hc2soTUFTS19SRVRVUk5fVFlQRV9BTFRFUkVEKTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNpc1NpZ2FudHVyZUVxdWFsKElET01Ob2RlKS4KKyAqCisgKiA8cD5Ud28gbWV0aG9kcyBoYXZlIGVxdWFsIHNpZ25hdHVyZXMgaWYgdGhlcmUgbmFtZXMgYXJlIHRoZSBzYW1lCisgKiBhbmQgdGhlaXIgcGFyYW1ldGVyIHR5cGVzIGFyZSB0aGUgc2FtZS4KKyAqLworcHVibGljIGJvb2xlYW4gaXNTaWduYXR1cmVFcXVhbChJRE9NTm9kZSBub2RlKSB7CisJYm9vbGVhbiBvaz0gbm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlKCk7CisJaWYgKG9rKSB7CisJCUlET01NZXRob2QgbWV0aG9kPSAoSURPTU1ldGhvZClub2RlOworCQlvayA9IChpc0NvbnN0cnVjdG9yKCkgJiYgbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgfHwgIAorCQkJKCFpc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpOworCQlpZiAob2sgJiYgIWlzQ29uc3RydWN0b3IoKSkgeworCQkJb2s9IGdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSk7CisJCX0KKwkJaWYgKCFvaykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlTdHJpbmdbXSB0eXBlcz0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCWlmIChmUGFyYW1ldGVyVHlwZXMgPT0gbnVsbCB8fCBmUGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApIHsKKwkJCS8vIHRoaXMgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzCisJCQlpZiAodHlwZXMgPT0gbnVsbCB8fCB0eXBlcy5sZW5ndGggPT0gMCkgeworCQkJCS8vIHRoZSBvdGhlciBtZXRob2QgaGFzIG5vIHBhcmFtZXRlcnMgZWl0aGVyCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB0aGlzIG1ldGhvZCBoYXMgcGFyYW1ldGVycworCQkJaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApIHsKKwkJCQkvLyB0aGUgb3RoZXIgbWV0aG9kIGhhcyBubyBwYXJhbWV0ZXJzCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKGZQYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gdHlwZXMubGVuZ3RoKSB7CisJCQkJLy8gdGhlIG1ldGhvZHMgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgcGFyYW1ldGVycworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWludCBpOworCQkJZm9yIChpPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoIWZQYXJhbWV0ZXJUeXBlc1tpXS5lcXVhbHModHlwZXNbaV0pKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7CisJCit9CisvKioKKyAqIEBzZWUgRE9NTm9kZQorICovCitwcm90ZWN0ZWQgRE9NTm9kZSBuZXdET01Ob2RlKCkgeworCXJldHVybiBuZXcgRE9NTWV0aG9kKCk7Cit9CisvKioKKyAqIE9mZnNldHMgYWxsIHRoZSBzb3VyY2UgaW5kZXhlcyBpbiB0aGlzIG5vZGUgYnkgdGhlIGdpdmVuIGFtb3VudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgb2Zmc2V0KGludCBvZmZzZXQpIHsKKwlzdXBlci5vZmZzZXQob2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmQm9keVJhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKGZFeGNlcHRpb25SYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmUGFyYW1ldGVyUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UoZlJldHVyblR5cGVSYW5nZSwgb2Zmc2V0KTsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI3NldEJvZHkKKyAqLworcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgYm9keSkgeworCWJlY29tZURldGFpbGVkKCk7CisJZnJhZ21lbnQoKTsKKwlmQm9keT0gYm9keTsKKwlzZXRIYXNCb2R5KGJvZHkgIT0gbnVsbCk7CisJaWYgKCFoYXNCb2R5KCkpIHsKKwkJZkJvZHk9ICI7IitVdGlsLkxJTkVfU0VQQVJBVE9SOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBTZXRzIHRoZSBlbmQgb2YgdGhlIGJvZHkgcmFuZ2UKKyAqLwordm9pZCBzZXRCb2R5UmFuZ2VFbmQoaW50IGVuZCkgeworCWZCb2R5UmFuZ2VbMV0gPSBlbmQ7Cit9CisvKioKKyAqIEBzZWUgSURPTU1ldGhvZCNzZXRDb25zdHJ1Y3Rvcihib29sZWFuKQorICovCitwdWJsaWMgdm9pZCBzZXRDb25zdHJ1Y3Rvcihib29sZWFuIGIpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCXNldE1hc2soTUFTS19JU19DT05TVFJVQ1RPUiwgYik7CisJZnJhZ21lbnQoKTsKK30KKy8qKgorICogQHNlZSBJRE9NTWV0aG9kI3NldEV4Y2VwdGlvbnMoY2hhcltdW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnMoU3RyaW5nW10gbmFtZXMpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmIChuYW1lcyA9PSBudWxsIHx8IG5hbWVzLmxlbmd0aCA9PSAwKSB7CisJCWZFeGNlcHRpb25zPSBudWxsOworCX0gZWxzZSB7CisJCWZFeGNlcHRpb25zPSBuYW1lczsKKwkJQ2hhckFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKKwkJY2hhcltdIGNvbW1hID0gbmV3IGNoYXJbXSB7JywnLCAnICd9OworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpID4gMCkKKwkJCQlidWZmZXIuYXBwZW5kKGNvbW1hKTsKKwkJCWJ1ZmZlci5hcHBlbmQobmFtZXNbaV0pOworCQl9CisJCWZFeGNlcHRpb25MaXN0PSBidWZmZXIuZ2V0Q29udGVudHMoKTsJCQorCX0KKwlmcmFnbWVudCgpOworfQorLyoqCisgKiBAc2VlIElET01NZXRob2Qjc2V0TmFtZQorICovCitwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCXN1cGVyLnNldE5hbWUobmFtZSk7CisJfQorfQorLyoqCisgKiBAc2VlIElET01NZXRob2Qjc2V0UGFyYW1ldGVycyhjaGFyW11bXSwgY2hhcltdW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gdHlwZXMsIFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmICh0eXBlcz09IG51bGwgfHwgbmFtZXMgPT0gbnVsbCkgeworCQlpZiAodHlwZXMgPT0gbnVsbCAmJiBuYW1lcyA9PSBudWxsKSB7CisJCQlmUGFyYW1ldGVyVHlwZXM9IG51bGw7CisJCQlmUGFyYW1ldGVyTmFtZXM9IG51bGw7CisJCQlmUGFyYW1ldGVyTGlzdD0gbmV3IGNoYXJbXSB7JygnLCcpJ307CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLm1pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSBlbHNlIGlmIChuYW1lcy5sZW5ndGggIT0gdHlwZXMubGVuZ3RoKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20ubWlzbWF0Y2hBcmdOYW1lc0FuZFR5cGVzIikpOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIGlmIChuYW1lcy5sZW5ndGggPT0gMCkgeworCQlzZXRQYXJhbWV0ZXJzKG51bGwsIG51bGwpOworCX0gZWxzZSB7CisJCWZQYXJhbWV0ZXJOYW1lcz0gbmFtZXM7CisJCWZQYXJhbWV0ZXJUeXBlcz0gdHlwZXM7CisJCUNoYXJBcnJheUJ1ZmZlciBwYXJhbWV0ZXJzQnVmZmVyID0gbmV3IENoYXJBcnJheUJ1ZmZlcigpOworCQlwYXJhbWV0ZXJzQnVmZmVyLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCisJCWNoYXJbXSBjb21tYSA9IG5ldyBjaGFyW10geycsJywgJyAnfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJcGFyYW1ldGVyc0J1ZmZlci5hcHBlbmQoY29tbWEpOworCQkJfQorCQkJcGFyYW1ldGVyc0J1ZmZlcgorCQkJCS5hcHBlbmQodHlwZXNbaV0pCisJCQkJLmFwcGVuZCgnICcpCisJCQkJLmFwcGVuZChuYW1lc1tpXSk7CisJCX0KKwkJcGFyYW1ldGVyc0J1ZmZlci5hcHBlbmQoJyknKTsKKwkJZlBhcmFtZXRlckxpc3Q9IHBhcmFtZXRlcnNCdWZmZXIuZ2V0Q29udGVudHMoKTsJCQorCX0KKwlmcmFnbWVudCgpOworfQorLyoqCisgKiBAc2VlIElET01NZXRob2Qjc2V0UmV0dXJuVHlwZShjaGFyW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCWlmIChuYW1lID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5udWxsUmV0dXJuVHlwZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwliZWNvbWVEZXRhaWxlZCgpOworCWZyYWdtZW50KCk7CisJc2V0UmV0dXJuVHlwZUFsdGVyZWQodHJ1ZSk7CisJZlJldHVyblR5cGU9IG5hbWU7Cit9CisvKioKKyAqIFNldHMgdGhlIHN0YXRlIG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uIGFzIGhhdmluZworICogdGhlIHJldHVybiB0eXBlIGFsdGVyZWQgZnJvbSB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGVBbHRlcmVkKGJvb2xlYW4gdHlwZUFsdGVyZWQpIHsKKwlzZXRNYXNrKE1BU0tfUkVUVVJOX1RZUEVfQUxURVJFRCwgdHlwZUFsdGVyZWQpOworfQorLyoqCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlRW5kKGludCBlbmQpIHsKKwlzdXBlci5zZXRTb3VyY2VSYW5nZUVuZChlbmQpOworCWZCb2R5UmFuZ2VbMV09IGVuZDsKK30KKy8qKgorICogQHNlZSBET01Ob2RlI3NoYXJlQ29udGVudHMoRE9NTm9kZSkKKyAqLworcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKKwlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOworCURPTU1ldGhvZCBtZXRob2Q9IChET01NZXRob2Qpbm9kZTsKKwlmQm9keT0gbWV0aG9kLmZCb2R5OworCWZCb2R5UmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZkJvZHlSYW5nZSk7CisJZkV4Y2VwdGlvbkxpc3Q9IG1ldGhvZC5mRXhjZXB0aW9uTGlzdDsKKwlmRXhjZXB0aW9uUmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZkV4Y2VwdGlvblJhbmdlKTsKKwlmRXhjZXB0aW9ucz0gbWV0aG9kLmZFeGNlcHRpb25zOworCWZQYXJhbWV0ZXJMaXN0PSBtZXRob2QuZlBhcmFtZXRlckxpc3Q7CisJZlBhcmFtZXRlck5hbWVzPSBtZXRob2QuZlBhcmFtZXRlck5hbWVzOworCWZQYXJhbWV0ZXJSYW5nZT0gcmFuZ2VDb3B5KG1ldGhvZC5mUGFyYW1ldGVyUmFuZ2UpOworCWZQYXJhbWV0ZXJUeXBlcz0gbWV0aG9kLmZQYXJhbWV0ZXJUeXBlczsKKwlmUmV0dXJuVHlwZT0gbWV0aG9kLmZSZXR1cm5UeXBlOworCWZSZXR1cm5UeXBlUmFuZ2U9IHJhbmdlQ29weShtZXRob2QuZlJldHVyblR5cGVSYW5nZSk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjdG9TdHJpbmcoKQorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWlmIChpc0NvbnN0cnVjdG9yKCkpIHsKKwkJcmV0dXJuICJDT05TVFJVQ1RPUiI7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlyZXR1cm4gIk1FVEhPRDogIiArIGdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2OTU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTm9kZS5qYXZhCkBAIC0wLDAgKzEsOTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DaGFyQXJyYXlCdWZmZXI7CisKKy8qKgorICogRE9NTm9kZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgPGNvZGU+SURPTU5vZGU8L2NvZGU+LgorICoKKyAqIDxwPkEgbm9kZSByZXByZXNlbnRzIGEgZG9jdW1lbnQgZnJhZ21lbnQuIFdoZW4gYSBub2RlIGlzIGNyZWF0ZWQsIGl0cworICogY29udGVudHMgYXJlIGxvY2F0ZWQgaW4gYSBjb250aWd1b3VzIHJhbmdlIG9mIGEgc2hhcmVkIGRvY3VtZW50LiBBIHNoYXJlZAorICogZG9jdW1lbnQgaXMgYSBjaGFyIGFycmF5LCBhbmQgaXMgc2hhcmVkIGluIHRoZSBzZW5zZSB0aGF0IHRoZSBjb250ZW50cyBvZiBvdGhlcgorICogZG9jdW1lbnQgZnJhZ21lbnRzIG1heSBhbHNvIGJlIGNvbnRhaW5lZCBpbiB0aGUgYXJyYXkuCisgKiAKKyAqIDxwPkEgbm9kZSBtYWludGFpbnMgaW5kaWNpZXMgb2YgcmVsZXZhbnQgcG9ydGlvbnMgb2YgaXRzIGNvbnRlbnRzCisgKiBpbiB0aGUgc2hhcmVkIGRvY3VtZW50LiBUaHVzIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBhbmQgaW5kaWNpZXMgY3JlYXRlIGEKKyAqIGZvcm0gZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGZyYWdtZW50LiBBcyBhdHRyaWJ1dGVzCisgKiBvZiBhIG5vZGUgYXJlIGNoYW5nZWQsIHRoZSBub2RlIGF0dGVtcHRzIHRvIG1haW50YWluIHRoZSBvcmlnaW5hbCBmb3JtYXR0aW5nCisgKiBieSBvbmx5IHJlcGxhY2luZyByZWxldmFudCBwb3J0aW9ucyBvZiB0aGUgc2hhcmVkIGRvY3VtZW50IHdpdGggdGhlIHZhbHVlCisgKiBvZiBuZXcgYXR0cmlidXRlcyAoaS5lLiBmaWxsaW5nIGluIHRoZSBmb3JtIHdpdGggcmVwbGFjZW1lbnQgdmFsdWVzKS4KKyAqCisgKiA8cD5XaGVuIGEgbm9kZSBpcyBmaXJzdCBjcmVhdGVkLCBpdCBpcyBjb25zaWRlcmVkIHVuZnJhZ21lbnRlZC4gV2hlbiBhbnkKKyAqIGF0dHJpYnV0ZSBvZiB0aGUgbm9kZSBpcyBhbHRlcmVkLCB0aGUgbm9kZSBpcyB0aGVuIGNvbnNpZGVyZWQgZnJhZ21lbnRlZAorICogZnJvbSB0aGF0IHBvaW50IG9uLiBBIG5vZGUgaXMgYWxzbyBjb25zaWRlcmVkIGZyYWdtZW50ZWQgaWYgYW55IG9mIGl0cworICogZGVzY2VuZGFudHMgYXJlIGZyYWdtZW50ZWQuIFdoZW4gYSBub2RlIGlzIHVuZnJhZ21lbnRlZCwgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogbm9kZSBjYW4gYmUgZWZmaWNpZW50bHkgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIHNoYXJlZCBkb2N1bWVudC4gV2hlbgorICogYSBub2RlIGlzIGZyYWdtZW50ZWQsIHRoZSBjb250ZW50cyBvZiB0aGUgbm9kZSBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcgdGhlCisgKiBvcmlnaW5hbCBkb2N1bWVudCBhbmQgaW5kaWNpZXMgYXMgYSBmb3JtLCBmaWxsaW5nIGluIHJlcGxhY2VtZW50IHZhbHVlcworICogYXMgcmVxdWlyZWQuCisgKgorICogPHA+R2VuZXJhbGx5LCBhIG5vZGUncyBjb250ZW50cyBjb25zaXN0cyBvZiBjb21wbGV0ZSBsaW5lcyBpbiBhIHNoYXJlZCBkb2N1bWVudC4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgbm9kZSBhcmUgbm9ybWFsaXplZCBvbiBjcmVhdGlvbiB0byBpbmNsdWRlIGFueSB3aGl0ZXNwYWNlCisgKiBwcmVjZWRpbmcgdGhlIG5vZGUgb24gdGhlIGxpbmUgd2hlcmUgdGhlIG5vZGUgYmVnaW5zLCBhbmQgdG8gaW5jbHVkZSBhbmQgdHJhaWxpbmcKKyAqIHdoaXRlc3BhY2UgdXAgdG8gdGhlIGxpbmUgd2hlcmUgdGhlIG5leHQgbm9kZSBiZWdpbnMuIEFueSB0cmFpbGluZyAvLyBjb21tZW50cworICogdGhhdCBiZWdpbiBvbiB0aGUgbGluZSB3aGVyZSB0aGUgY3VycmVudCBub2RlIGVuZHMsIGFyZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhhdAorICogbm9kZS4gCisgKgorICogQHNlZSBJRE9NTm9kZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE9NTm9kZSBpbXBsZW1lbnRzIElET01Ob2RlIHsKKworCS8qKgorCSAqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIG5vZGUgLSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIHdoZW4gdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbi4gKENoaWxkcmVuIG9mIGEgbm9kZQorCSAqIGFyZSBpbXBsZW1lbnRlZCBhcyBhIGRvdWJseSBsaW5rZWQgbGlzdCkuCisJICovCisJcHJvdGVjdGVkIERPTU5vZGUgZkZpcnN0Q2hpbGQ9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgbGFzdCBjaGlsZCBvZiB0aGlzIG5vZGUgLSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIHdoZW4gdGhpcyBub2RlIGhhcyBubyBjaGlsZHJlbi4gVXNlZCBmb3IgZWZmaWNpZW50CisJICogYWNjZXNzIHRvIHRoZSBsYXN0IGNoaWxkIHdoZW4gYWRkaW5nIG5ldyBjaGlsZHJlbgorCSAqIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIGNoaWxkcmVuLgorCSAqLworCXByb3RlY3RlZCBET01Ob2RlIGZMYXN0Q2hpbGQ9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgc2libGluZyBub2RlIGZvbGxvd2luZyB0aGlzIG5vZGUgLSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGZvciB0aGUgbGFzdCBub2RlIGluIHRoZSBzaWJsaW5nIGxpc3QuCisJICovCisJcHJvdGVjdGVkIERPTU5vZGUgZk5leHROb2RlPSBudWxsOworCisJLyoqCisJICogVGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuIEEgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBwYXJlbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBub2RlIGlzIGEgcm9vdAorCSAqIG5vZGUgb2YgYSBkb2N1bWVudCBmcmFnbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgRE9NTm9kZSBmUGFyZW50PSBudWxsOworCisJLyoqCisJICogVGhlIHNpYmxpbmcgbm9kZSBwcmVjZWRpbmcgdGhpcyBub2RlIC0gPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBmb3IgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNpYmxpbmcgbGlzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgRE9NTm9kZSBmUHJldmlvdXNOb2RlPSBudWxsOworCisJLyoqCisJICogVHJ1ZSB3aGVuIHRoaXMgbm9kZSBoYXMgYXR0cmlidXRlcyB0aGF0IGhhdmUKKwkgKiBiZWVuIGFsdGVyZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBzdGF0ZSBpbiB0aGUKKwkgKiBzaGFyZWQgZG9jdW1lbnQsIG9yIHdoZW4gdGhlIGF0dHJpYnV0ZXMgb2YgYQorCSAqIGRlc2NlbmRhbnQgaGF2ZSBiZWVuIGFsdGVyZWQuIEZhbHNlIHdoZW4gdGhlCisJICogY29udGVudHMgb2YgdGhpcyBub2RlIGFuZCBhbGwgZGVzY2VuZGFudHMgYXJlCisJICogY29uc2lzdGVudCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBzaGFyZWQgCisJICogZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZklzRnJhZ21lbnRlZD0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGlzIG5vZGUuIEZvciBlZmZpY2llbmN5LCB0aGUKKwkgKiBuYW1lIG9mIGEgbm9kZSBpcyBkdXBsaWNhdGVkIGluIHRoaXMgdmFyaWFibGUKKwkgKiBvbiBjcmVhdGlvbiwgcmF0aGVyIHRoYW4gYWx3YXlzIGhhdmluZyB0byBmZXRjaAorCSAqIHRoZSBuYW1lIGZyb20gdGhlIHNoYXJlZCBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nICBmTmFtZT0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBvcmlnaW5hbCBpbmNsdXNpdmUgaW5kaWNpZXMgb2YgdGhpcyBub2RlJ3MgbmFtZSBpbgorCSAqIHRoZSBzaGFyZWQgZG9jdW1lbnQuIFZhbHVlcyBvZiAtMSBpbmRpY2lhdGUgdGhlIG5hbWUKKwkgKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdCSAgZk5hbWVSYW5nZTsKKworCS8qKgorCSAqIFRoZSBzaGFyZWQgZG9jdW1lbnQgdGhhdCB0aGUgY29udGVudHMgZm9yIHRoaXMgbm9kZQorCSAqIGFyZSBjb250YWluZWQgaW4uIEF0dHJpYnV0ZSBpbmRpY2llcyBhcmUgcG9zaXRpb25zCisJICogaW4gdGhpcyBjaGFyYWN0ZXIgYXJyYXkuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXSAgZkRvY3VtZW50PSBudWxsOworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGVudGlyZSBpbmNsdXNpdmUgcmFuZ2Ugb2YgdGhpcyBub2RlJ3MgY29udGVudHMKKwkgKiB3aXRoaW4gaXRzIGRvY3VtZW50LiBWYWx1ZXMgb2YgLTEgaW5kaWNhdGUgdGhlIGNvbnRlbnRzCisJICogb2YgdGhpcyBub2RlIGRvIG5vdCBleGlzdCBpbiB0aGUgZG9jdW1lbnQuCisJICovCisJcHJvdGVjdGVkIGludFtdIGZTb3VyY2VSYW5nZTsKKworCS8qKgorCSAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIGJpdCBtYXNrcyBkZWZpbmVkIGJ5IHRoaXMgbm9kZS4KKwkgKiBJbml0aWFsbHkgYWxsIGJpdCBmbGFncyBhcmUgdHVybmVkIG9mZi4gQWxsIGJpdCBtYXNrcworCSAqIGFyZSBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MgdG8gYXZvaWQgb3ZlcmxhcCwgYWx0aG91Z2gKKwkgKiBiaXQgbWFza3MgYXJlIG5vZGUgdHlwZSBzcGVjaWZpYy4KKwkgKgorCSAqIEBzZWUgI3NldE1hc2sKKwkgKiBAc2VlICNnZXRNYXNrCisJICovCisJcHJvdGVjdGVkIGludCBmU3RhdGVNYXNrPSAwOworCisJLyoqCisJICogVGhpcyBwb3NpdGlvbiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lIHNlcGFyYXRvciBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2Ugc3RhcnRpbmcKKwkgKiBwb3NpdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCisJICovCisJcHJvdGVjdGVkIGludCBmSW5zZXJ0aW9uUG9zaXRpb247CisKKwkvKioKKwkgKiBBIGJpdCBtYXNrIGluZGljYXRpbmcgdGhpcyBmaWVsZCBoYXMgYW4gaW5pdGlhbGl6ZXIKKwkgKiBleHByZXNzaW9uCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19GSUVMRF9IQVNfSU5JVElBTElaRVI9IDB4MDAwMDAwMDE7CisJCisJLyoqCisJICogQSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoaXMgZmllbGQgaXMgYSBzZWNvbmRhcnkgdmFyaWFibGUKKwkgKiBkZWNsYXJhdG9yIGZvciBhIHByZXZpb3VzIGZpZWxkIGRlY2xhcmF0aW9uLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfRklFTERfSVNfVkFSSUFCTEVfREVDTEFSQVRPUj0gMHgwMDAwMDAwMjsKKworCS8qKgorCSAqIEEgYml0IG1hc2sgaW5kaWNhdGluZyB0aGlzIGZpZWxkJ3MgdHlwZSBoYXMgYmVlbgorCSAqIGFsdGVyZWQgZnJvbSBpdHMgb3JpZ2luYWwgY29udGVudHMgaW4gdGhlIGRvY3VtZW50LgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfRklFTERfVFlQRV9BTFRFUkVEPSAweDAwMDAwMDA0OworCisJLyoqCisJICogQSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoaXMgbm9kZSdzIG5hbWUgaGFzIGJlZW4KKwkgKiBhbHRlcmVkIGZyb20gaXRzIG9yaWdpbmFsIGNvbnRlbnRzIGluIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUVfQUxURVJFRD0gMHgwMDAwMDAwODsKKworCS8qKgorCSAqIEEgYml0IG1hc2sgaW5kaWNhdGluZyB0aGlzIG5vZGUgY3VycmVudGx5IGhhcyBhCisJICogYm9keS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVNLX0hBU19CT0RZPSAweDAwMDAwMDEwOworCQorCS8qKgorCSAqIEEgYml0IG1hc2sgaW5kaWNhdGluZyB0aGlzIG5vZGUgY3VycmVudGx5IGhhcyBhCisJICogcHJlY2VkaW5nIGNvbW1lbnQuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19IQVNfQ09NTUVOVD0gMHgwMDAwMDAyMDsKKworCS8qKgorCSAqIEEgYml0IG1hc2sgaW5kaWNhdGluZyB0aGlzIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfSVNfQ09OU1RSVUNUT1I9IDB4MDAwMDAwNDA7CisKKwkvKioKKwkgKiBBIGJpdCBtYXNrIGluZGljYXRpbmcgdGhpcyB0eXBlIGlzIGEgY2xhc3MuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19UWVBFX0lTX0NMQVNTPSAweDAwMDAwMDgwOworCisJLyoqCisJICogQSBiaXQgbWFzayBpbmRpY2F0aW5nIHRoaXMgdHlwZSBoYXMgYSBzdXBlcmNsYXNzCisJICogKHJlcXVpcmVzIG9yIGhhcyBhbiAnZXh0ZW5kcycgY2xhdXNlKS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVNLX1RZUEVfSEFTX1NVUEVSQ0xBU1M9IDB4MDAwMDAxMDA7CisKKwkvKioKKwkgKiBBIGJpdCBtYXNrIGluZGljYXRpbmcgdGhpcyB0eXBlIGltcGxlbWVudHMKKwkgKiBvciBleHRlbmRzIHNvbWUgaW50ZXJmYWNlcworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUz0gMHgwMDAwMDIwMDsKKworCS8qKgorCSAqIEEgYml0IG1hc2sgaW5kaWNhdGluZyB0aGlzIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kIGhhcworCSAqIGJlZW4gYWx0ZXJlZCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZW50cy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVNLX1JFVFVSTl9UWVBFX0FMVEVSRUQ9IDB4MDAwMDA0MDA7CisKKwkvKioKKwkgKiBBIGJpdCBtYXNrIGluZGljYXRpbmcgdGhpcyBub2RlIGhhcyBkZXRhaWxlZCBzb3VyY2UgaW5kZXhlcworCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMgPSAweDAwMDAwODAwOworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgZG9jdW1lbnQgZnJhZ21lbnQuCisgKi8KK0RPTU5vZGUoKSB7CisJZk5hbWU9IG51bGw7CisJZkRvY3VtZW50PSBudWxsOworCWZTb3VyY2VSYW5nZT0gbmV3IGludFtdey0xLCAtMX07CisJZk5hbWVSYW5nZT0gbmV3IGludFtdey0xLCAtMX07CisJZnJhZ21lbnQoKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiBAcGFyYW0gbmFtZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSdzIG5hbWUgd2l0aGluIGl0cyBkb2N1bWVudCwKKyAqCQlpbmNsdWRpbmcgYW55IGFycmF5IHF1YWxpZmllcnMgdGhhdCBtaWdodCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG5hbWUKKyAqCQlvciAtMSdzIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KKyAqLworRE9NTm9kZShjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlKSB7CisJc3VwZXIoKTsKKwlmRG9jdW1lbnQ9IGRvY3VtZW50OworCWZTb3VyY2VSYW5nZT0gc291cmNlUmFuZ2U7CisJZk5hbWU9IG5hbWU7CisJZk5hbWVSYW5nZT0gbmFtZVJhbmdlOworCit9CisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIHVuLXBhcmVudGVkIG5vZGUgKGRvY3VtZW50IGZyYWdtZW50KSBhcyB0aGUgbGFzdCBjaGlsZCBvZgorICogdGhpcyBub2RlLgorICoKKyAqIDxwPldoZW4gYSBjaGlsZCBpcyBhZGRlZCwgdGhpcyBub2RlIG11c3QgYmUgY29uc2lkZXJlZCBmcmFnbWVudGVkIHN1Y2ggdGhhdAorICogdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSBhcmUgcHJvcGVybHkgZ2VuZXJhdGVkLgorICogCisgKiBAc2VlIElET01Ob2RlI2FkZENoaWxkKElET01Ob2RlKQorICovCitwdWJsaWMgdm9pZCBhZGRDaGlsZChJRE9NTm9kZSBjaGlsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKKwliYXNpY0FkZENoaWxkKGNoaWxkKTsKKwkKKwkvLyBpZiB0aGUgbm9kZSBpcyBhIGNvbnN0cnVjdG9yLCBpdCBtdXN0IGFsc28gYmUgZnJhZ21lbnRlZCB0byB1cGRhdGUgdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZQorCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLk1FVEhPRCAmJiAoKElET01NZXRob2QpY2hpbGQpLmlzQ29uc3RydWN0b3IoKSkgeworCQkoKERPTU5vZGUpY2hpbGQpLmZyYWdtZW50KCk7CisJfSBlbHNlIHsKKwkJZnJhZ21lbnQoKTsKKwl9Cit9CisvKioKKyAqIEFwcGVuZHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhpcyBkb2N1bWVudCBmcmFnbWVudAorICogdG8gdGhlIGdpdmVuIDxjb2RlPkNoYXJBcnJheUJ1ZmZlcjwvY29kZT4uCisgKgorICogPHA+SWYgdGhpcyBub2RlIGlzIGZyYWdtZW50ZWQsIGNvbnRlbnRzIG11c3QgYmUgZ2VuZXJhdGVkIGJ5CisgKiB1c2luZyB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgYW5kIGluZGljaWVzIGFzIGEgZm9ybSBmb3IgdGhlIGN1cnJlbnQKKyAqIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhpcyBub2RlLiBJZiB0aGlzIG5vZGUgbm90IGZyYWdtZW50ZWQsIHRoZQorICogY29udGVudHMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGRvY3VtZW50LgorICogCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZENvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciBidWZmZXIpIHsKKwlpZiAoaXNGcmFnbWVudGVkKCkpIHsKKwkJYXBwZW5kRnJhZ21lbnRlZENvbnRlbnRzKGJ1ZmZlcik7CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZTb3VyY2VSYW5nZVswXSwgZlNvdXJjZVJhbmdlWzFdICsgMSAtIGZTb3VyY2VSYW5nZVswXSk7CisJfQorfQorLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBub2RlIHRvIHRoZQorICogZ2l2ZW4gPGNvZGU+Q2hhckFycmF5QnVmZmVyPC9jb2RlPi4KKyAqCisgKiA8cD5UaGlzIGFsZ29yaXRobSB1c2VkIG1pbmltaXplcyBTdHJpbmcgZ2VuZXJhdGlvbiBieSBtZXJnaW5nCisgKiBhZGphY2VudCB1bmZyYWdtZW50ZWQgY2hpbGRyZW4gaW50byBvbmUgc3Vic3RyaW5nIG9wZXJhdGlvbi4KKyAqCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZENvbnRlbnRzT2ZDaGlsZHJlbihDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CisJRE9NTm9kZSBjaGlsZD0gZkZpcnN0Q2hpbGQ7CisJRE9NTm9kZSBzaWJsaW5nOworCQorCWludCBzdGFydD0gMCwgZW5kPSAwOworCWlmIChjaGlsZCAhPSBudWxsKSB7CisJCXN0YXJ0PSBjaGlsZC5nZXRTdGFydFBvc2l0aW9uKCk7CisJCWVuZD0gY2hpbGQuZ2V0RW5kUG9zaXRpb24oKTsKKwl9CisJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKKwkJc2libGluZz0gY2hpbGQuZk5leHROb2RlOworCQlpZiAoc2libGluZyAhPSBudWxsKSB7CisJCQlpZiAoc2libGluZy5pc0NvbnRlbnRNZXJnYWJsZVdpdGgoY2hpbGQpKSB7CisJCQkJZW5kPSBzaWJsaW5nLmdldEVuZFBvc2l0aW9uKCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjaGlsZC5pc0ZyYWdtZW50ZWQoKSkgeworCQkJCQljaGlsZC5hcHBlbmRDb250ZW50cyhidWZmZXIpOworCQkJCX0gZWxzZSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGQuZ2V0RG9jdW1lbnQoKSwgc3RhcnQsIGVuZCArIDEgLSBzdGFydCk7CisJCQkJfQorCQkJCXN0YXJ0PSBzaWJsaW5nLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQllbmQ9IHNpYmxpbmcuZ2V0RW5kUG9zaXRpb24oKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjaGlsZC5pc0ZyYWdtZW50ZWQoKSkgeworCQkJCWNoaWxkLmFwcGVuZENvbnRlbnRzKGJ1ZmZlcik7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGQuZ2V0RG9jdW1lbnQoKSwgc3RhcnQsIGVuZCArIDEgLSBzdGFydCk7CisJCQl9CisJCX0KKwkJY2hpbGQ9IHNpYmxpbmc7CisJfQorfQorLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUgdG8gdGhlIGdpdmVuIDxjb2RlPkNoYXJBcnJheUJ1ZmVyPC9jb2RlPiwgdXNpbmcKKyAqIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBhbmQgaW5kaWNpZXMgYXMgYSBmb3JtIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUKKyAqIHZhbHVlcyBvZiB0aGlzIG5vZGUuCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGVuZEZyYWdtZW50ZWRDb250ZW50cyhDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKTsKKy8qKgorICogQWRkcyB0aGUgZ2l2ZW4gdW4tcGFyZW50ZWQgbm9kZSAoZG9jdW1lbnQgZnJhZ21lbnQpIGFzIHRoZSBsYXN0IGNoaWxkIG9mCisgKiB0aGlzIG5vZGUgd2l0aG91dCBzZXR0aW5nIHRoaXMgbm9kZSdzICdmcmFnbWVudGVkJyBmbGFnLiBUaGlzCisgKiBtZXRob2QgaXMgb25seSB1c2VkIGJ5IHRoZSA8Y29kZT5ET01CdWlsZGVyPC9jb2RlPiB3aGVuIGNyZWF0aW5nIGEgbmV3IERPTSBzdWNoCisgKiB0aGF0IGEgbmV3IERPTSBpcyB1bmZyYWdtZW50ZWQuCisgKi8KK3ZvaWQgYmFzaWNBZGRDaGlsZChJRE9NTm9kZSBjaGlsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKKwkvLyB2ZXJpZnkgY2hpbGQgbWF5IGJlIGFkZGVkCisJaWYgKCFjYW5IYXZlQ2hpbGRyZW4oKSkgeworCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLnVuYWJsZUFkZENoaWxkIikpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChjaGlsZCA9PSBudWxsKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkTnVsbENoaWxkIikpOyAvLyROT04tTkxTLTEkCisJfQorCWlmICghaXNBbGxvd2FibGVDaGlsZChjaGlsZCkpIHsKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRJbmNvbXBhdGlibGVDaGlsZCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAoY2hpbGQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZENoaWxkV2l0aFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkvKiBOT1RFOiBUbyB0ZXN0IGlmIHRoZSBjaGlsZCBpcyBhbiBhbmNlc3RvciBvZiB0aGlzIG5vZGUsIHdlCisJICogbmVlZCBvbmx5IHRlc3QgaWYgdGhlIHJvb3Qgb2YgdGhpcyBub2RlIGlzIHRoZSBjaGlsZCAodGhlIGNoaWxkCisJICogaXMgYWxyZWFkeSBhIHJvb3Qgc2luY2Ugd2UgaGF2ZSBqdXN0IGd1YXJlbnRlZWQgaXQgaGFzIG5vIHBhcmVudCkuCisJICovCisJaWYgKGNoaWxkID09IGdldFJvb3QoKSkgeworCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZEFuY2VzdG9yQXNDaGlsZCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCURPTU5vZGUgbm9kZT0gKERPTU5vZGUpY2hpbGQ7CisJCisJLy8gaWYgdGhlIGNoaWxkIGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhpcyBkb2N1bWVudCwgbG9jYWxpemUgaXRzIGNvbnRlbnRzCisJLy8gYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgdHJlZQorCWlmIChub2RlLmdldERvY3VtZW50KCkgIT0gZ2V0RG9jdW1lbnQoKSkgeworCQlub2RlLmxvY2FsaXplQ29udGVudHMoKTsKKwl9CisJCisJLy8gYWRkIHRoZSBjaGlsZCBsYXN0CisJaWYgKGZGaXJzdENoaWxkID09IG51bGwpIHsKKwkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2hpbGQKKwkJZkZpcnN0Q2hpbGQ9IG5vZGU7CisJfSBlbHNlIHsKKwkJZkxhc3RDaGlsZC5mTmV4dE5vZGU9IG5vZGU7CisJCW5vZGUuZlByZXZpb3VzTm9kZT0gZkxhc3RDaGlsZDsKKwl9CisJZkxhc3RDaGlsZD0gbm9kZTsKKwlub2RlLmZQYXJlbnQ9IHRoaXM7Cit9CisvKioKKyAqIEdlbmVyYXRlcyBkZXRhaWxlZCBzb3VyY2UgaW5kZXhlcyBmb3IgdGhpcyBub2RlIGlmIHBvc3NpYmxlLgorICoKKyAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBnZW5lcmF0ZSBkZXRhaWxlZCBzb3VyY2UgaW5kZXhlcworICogCWZvciB0aGlzIG5vZGUKKyAqLworcHJvdGVjdGVkIHZvaWQgYmVjb21lRGV0YWlsZWQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKwlpZiAoIWlzRGV0YWlsZWQoKSkgeworCQlET01Ob2RlIGRldGFpbGVkPSBnZXREZXRhaWxlZE5vZGUoKTsKKwkJaWYgKGRldGFpbGVkID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uY2Fubm90RGV0YWlsIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGRldGFpbGVkICE9IHRoaXMpIHsKKwkJCXNoYXJlQ29udGVudHMoZGV0YWlsZWQpOworCQl9CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBub2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbiwgb3RoZXJ3aXNlIGZhbHNlLgorICoKKyAqIDxwPkRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SURPTU5vZGU8L2NvZGU+IGludGVyZmFjZSBtZXRob2QgcmV0dXJucyBmYWxzZTsgdGhpcworICogbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgaW1wbGVtZW50IG5vZGVzIHRoYXQgYWxsb3cKKyAqIGNoaWxkcmVuLgorICoKKyAqIEBzZWUgSURPTU5vZGUjY2FuSGF2ZUNoaWxkcmVuKCkKKyAqLworcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgeworCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNjbG9uZSgpCisgKi8KK3B1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisKKwkvLyBjcmVhdGUgYSBuZXcgYnVmZmVyIHdpdGggYWxsIG15IGNvbnRlbnRzIGFuZCBjaGlsZHJlbiBjb250ZW50cworCWludCBsZW5ndGg9IDA7CisJY2hhcltdIGJ1ZmZlcj0gbnVsbDsKKwlpbnQgb2Zmc2V0PSBmU291cmNlUmFuZ2VbMF07CisJCisJaWYgKG9mZnNldCA+PSAwKSB7CisJCWxlbmd0aD0gZlNvdXJjZVJhbmdlWzFdIC0gb2Zmc2V0ICsgMTsKKwkJYnVmZmVyPSBuZXcgY2hhcltsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudCwgb2Zmc2V0LCBidWZmZXIsIDAsIGxlbmd0aCk7CisJfQkKKwlET01Ob2RlIGNsb25lPSBuZXdET01Ob2RlKCk7CisJY2xvbmUuc2hhcmVDb250ZW50cyh0aGlzKTsKKwljbG9uZS5mRG9jdW1lbnQgPSBidWZmZXI7CisKKwlpZiAob2Zmc2V0ID4gMCkgeworCQljbG9uZS5vZmZzZXQoMCAtIG9mZnNldCk7CisJfQorCisJLy8gY2xvbmUgbXkgY2hpbGRyZW4KKwlpZiAoY2FuSGF2ZUNoaWxkcmVuKCkpIHsKKwkJRW51bWVyYXRpb24gY2hpbGRyZW49IGdldENoaWxkcmVuKCk7CisJCXdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJRE9NTm9kZSBjaGlsZD0gKERPTU5vZGUpY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKKwkJCWlmIChjaGlsZC5mRG9jdW1lbnQgPT0gZkRvY3VtZW50KSB7CisJCQkJRE9NTm9kZSBjaGlsZENsb25lPSBjaGlsZC5jbG9uZVNoYXJpbmdEb2N1bWVudChidWZmZXIsIG9mZnNldCk7CisJCQkJY2xvbmUuYmFzaWNBZGRDaGlsZChjaGlsZENsb25lKTsKKwkJCX0gZWxzZSB7CisJCQkJRE9NTm9kZSBjaGlsZENsb25lPSAoRE9NTm9kZSljaGlsZC5jbG9uZSgpOworCQkJCWNsb25lLmFkZENoaWxkKGNoaWxkQ2xvbmUpOworCQkJfQorCQkJCisJCX0KKwl9CisJCisJcmV0dXJuIGNsb25lOworfQorcHJpdmF0ZSBET01Ob2RlIGNsb25lU2hhcmluZ0RvY3VtZW50KGNoYXJbXSBkb2N1bWVudCwgaW50IHJvb3RPZmZzZXQpIHsKKworCURPTU5vZGUgY2xvbmUgPSBuZXdET01Ob2RlKCk7CisJY2xvbmUuc2hhcmVDb250ZW50cyh0aGlzKTsKKwljbG9uZS5mRG9jdW1lbnQgPSBkb2N1bWVudDsKKwlpZiAocm9vdE9mZnNldCA+IDApIHsKKwkJY2xvbmUub2Zmc2V0KDAgLSByb290T2Zmc2V0KTsKKwl9CisJCisJaWYgKGNhbkhhdmVDaGlsZHJlbigpKSB7CisJCUVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKKwkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlET01Ob2RlIGNoaWxkID0gKERPTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7CisJCQlpZiAoY2hpbGQuZkRvY3VtZW50ID09IGZEb2N1bWVudCkgeworCQkJCURPTU5vZGUgY2hpbGRDbG9uZT0gY2hpbGQuY2xvbmVTaGFyaW5nRG9jdW1lbnQoZG9jdW1lbnQsIHJvb3RPZmZzZXQpOworCQkJCWNsb25lLmJhc2ljQWRkQ2hpbGQoY2hpbGRDbG9uZSk7CisJCQl9IGVsc2UgeworCQkJCURPTU5vZGUgY2hpbGRDbG9uZT0gKERPTU5vZGUpY2hpbGQuY2xvbmUoKTsKKwkJCQljbG9uZS5hZGRDaGlsZChjaGlsZENsb25lKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gY2xvbmU7Cit9CisvKioKKyAqIFNldHMgdGhpcyBub2RlJ3MgZnJhZ21lbnRlZCBmbGFnIGFuZCBhbGwgYW5jZXN0b3IgZnJhZ21lbnRlZCBmbGFncworICogdG8gPGNvZGU+dHJ1ZTxjb2RlPi4gVGhpcyBoYXBwZW5zIHdoZW4gYW4gYXR0cmlidXRlIG9mIHRoaXMgbm9kZSBvciBhIGRlc2NlbmRhbnQKKyAqIG5vZGUgaGFzIGJlZW4gYWx0ZXJlZC4gV2hlbiBhIG5vZGUgaXMgZnJhZ21lbnRlZCwgaXRzIGNvbnRlbnRzIG11c3QKKyAqIGJlIGdlbmVyYXRlZCBmcm9tIGl0cyBhdHRyaWJ1dGVzIGFuZCBvcmlnaW5hbCAiZm9ybSIgcmF0aGVyIHRoYW4KKyAqIGZyb20gdGhlIG9yaWdpbmFsIGNvbnRlbnRzIGluIHRoZSBkb2N1bWVudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgZnJhZ21lbnQoKSB7CisJaWYgKCFpc0ZyYWdtZW50ZWQoKSkgeworCQlmSXNGcmFnbWVudGVkPSB0cnVlOworCQlpZiAoZlBhcmVudCAhPSBudWxsKSB7CisJCQlmUGFyZW50LmZyYWdtZW50KCk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Q2hhcmFjdGVycygpCisgKi8KK3B1YmxpYyBjaGFyW10gZ2V0Q2hhcmFjdGVycygpIHsKKwlDaGFyQXJyYXlCdWZmZXIgYnVmZmVyPSBuZXcgQ2hhckFycmF5QnVmZmVyKCk7CisJYXBwZW5kQ29udGVudHMoYnVmZmVyKTsKKwlyZXR1cm4gYnVmZmVyLmdldENvbnRlbnRzKCk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Q2hpbGQoU3RyaW5nKQorICovCitwdWJsaWMgSURPTU5vZGUgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKKwlET01Ob2RlIGNoaWxkID0gZkZpcnN0Q2hpbGQ7CisJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKKwkJU3RyaW5nIG4gPSBjaGlsZC5nZXROYW1lKCk7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCWlmIChuID09IG51bGwpIHsKKwkJCQlyZXR1cm4gY2hpbGQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobmFtZS5lcXVhbHMobikpIHsKKwkJCQlyZXR1cm4gY2hpbGQ7CisJCQl9CisJCX0KKwkJY2hpbGQgPSBjaGlsZC5mTmV4dE5vZGU7CisJfQorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldENoaWxkcmVuKCkKKyAqLworcHVibGljIEVudW1lcmF0aW9uIGdldENoaWxkcmVuKCkgeworCXJldHVybiBuZXcgU2libGluZ0VudW1lcmF0aW9uKGZGaXJzdENoaWxkKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50IGZyYWdtZW50LAorICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGhhcyBubyBjb250ZW50cy4KKyAqCisgKiA8cD5JZiB0aGlzIG5vZGUgaXMgZnJhZ21lbnRlZCwgY29udGVudHMgbXVzdCBiZSBnZW5lcmF0ZWQgYnkKKyAqIHVzaW5nIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBhbmQgaW5kaWNpZXMgYXMgYSBmb3JtIGZvciB0aGUgY3VycmVudAorICogYXR0cmlidXRlIHZhbHVlcyBvZiB0aGlzIG5vZGUuIElmIHRoaXMgbm9kZSBub3QgZnJhZ21lbnRlZCwgdGhlCisgKiBjb250ZW50cyBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgZG9jdW1lbnQuCisgKiAKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Q29udGVudHMoKQorICovCitwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgeworCUNoYXJBcnJheUJ1ZmZlciBidWZmZXI9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKKwlhcHBlbmRDb250ZW50cyhidWZmZXIpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKy8qKgorICogUmV0dXJucyBhIG5ldyBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhpcyBub2RlIHdpdGgKKyAqIGRldGFpbGVkIHNvdXJjZSBpbmRleGVzLiBTdWJjbGFzc2VzIHRoYXQgcHJvdmlkZSBhIGRldGFpbGVkCisgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICovCitwcm90ZWN0ZWQgRE9NTm9kZSBnZXREZXRhaWxlZE5vZGUoKSB7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhpcyBub2RlJ3Mgb3JpZ2luYWwgY29udGVudHMuCisgKiBUaGUgZG9jdW1lbnQgbWF5IGJlIHNoYXJlZCBieSBvdGhlciBub2Rlcy4KKyAqLworcHJvdGVjdGVkIGNoYXJbXSBnZXREb2N1bWVudCgpIHsKKwlyZXR1cm4gZkRvY3VtZW50OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcworICogbm9kZSdzIGNvbnRlbnRzIGluIGl0cyBkb2N1bWVudC4KKyAqLworcHVibGljIGludCBnZXRFbmRQb3NpdGlvbigpIHsKKwlyZXR1cm4gZlNvdXJjZVJhbmdlWzFdOworfQorLyoqCisgKiBSZXR1cm5zIGEgZmFjdG9yeSB3aXRoIHdoaWNoIHRvIGNyZWF0ZSBuZXcgZG9jdW1lbnQgZnJhZ21lbnRzLgorICovCitwcm90ZWN0ZWQgSURPTUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKKwlyZXR1cm4gbmV3IERPTUZhY3RvcnkoKTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNnZXRGaXJzdENoaWxkKCkKKyAqLworcHVibGljIElET01Ob2RlIGdldEZpcnN0Q2hpbGQoKSB7CisJcmV0dXJuIGZGaXJzdENoaWxkOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAqLworcHVibGljIGludCBnZXRJbnNlcnRpb25Qb3NpdGlvbigpIHsKKwlyZXR1cm4gZkluc2VydGlvblBvc2l0aW9uOworfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtYXNrIG9mIHRoaXMgbm9kZSdzIHN0YXRlIGZsYWcKKyAqIGlzIHR1cm5lZCBvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TWFzayhpbnQgbWFzaykgeworCXJldHVybiAoZlN0YXRlTWFzayAmIG1hc2spID4gMDsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNnZXROYW1lKCkKKyAqLworcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCXJldHVybiBmTmFtZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgc291cmNlIGNvZGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBub2RlJ3MgbmFtZS4KKyAqLworcHJvdGVjdGVkIGNoYXJbXSBnZXROYW1lQ29udGVudHMoKSB7CisJaWYgKGlzTmFtZUFsdGVyZWQoKSkgeworCQlyZXR1cm4gZk5hbWUudG9DaGFyQXJyYXkoKTsKKwl9IGVsc2UgeworCQlpZiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZVJhbmdlWzBdIDwgMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gZk5hbWVSYW5nZVsxXSArIDEgLSBmTmFtZVJhbmdlWzBdOworCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudCwgZk5hbWVSYW5nZVswXSwgcmVzdWx0LCAwLCBsZW5ndGgpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNnZXROZXh0Tm9kZSgpCisgKi8KK3B1YmxpYyBJRE9NTm9kZSBnZXROZXh0Tm9kZSgpIHsKKwlyZXR1cm4gZk5leHROb2RlOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldFBhcmVudCgpCisgKi8KK3B1YmxpYyBJRE9NTm9kZSBnZXRQYXJlbnQoKSB7CisJcmV0dXJuIGZQYXJlbnQ7Cit9CisvKioKKyAqIEFuc3dlcnMgYSBzb3VyY2UgcG9zaXRpb24gd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGVuZCBvZiB0aGUgcGFyZW50CisgKiBlbGVtZW50J3MgZGVjbGFyYXRpb24uCisgKi8KK3Byb3RlY3RlZCBpbnQgZ2V0UGFyZW50RW5kRGVjbGFyYXRpb24oKSB7CisJSURPTU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRE9NQ29tcGlsYXRpb25Vbml0KSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAoKERPTVR5cGUpcGFyZW50KS5nZXRPcGVuQm9keUVuZCgpOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldFByZXZpb3VzTm9kZSgpCisgKi8KK3B1YmxpYyBJRE9NTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7CisJcmV0dXJuIGZQcmV2aW91c05vZGU7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGRvY3VtZW50IGZyYWdtZW50LgorICovCitwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0Um9vdCgpIHsKKwlpZiAoZlBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiB0aGlzOworCX0gZWxzZSB7CisJCXJldHVybiBmUGFyZW50LmdldFJvb3QoKTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcworICogbm9kZSdzIGNvbnRlbnRzIGluIGl0cyBkb2N1bWVudC4KKyAqLworcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkgeworCXJldHVybiBmU291cmNlUmFuZ2VbMF07Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjaW5zZXJ0U2libGluZyhJRE9NTm9kZSkKKyAqLworcHVibGljIHZvaWQgaW5zZXJ0U2libGluZyhJRE9NTm9kZSBzaWJsaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBET01FeGNlcHRpb24geworCS8vIHZlcmlmeSBzaWJsaW5nIG1heSBiZSBhZGRlZAorCWlmIChzaWJsaW5nID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGROdWxsU2libGluZyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAoZlBhcmVudCA9PSBudWxsKSB7CisJCXRocm93IG5ldyBET01FeGNlcHRpb24oVXRpbC5iaW5kKCJkb20uYWRkU2libGluZ0JlZm9yZVJvb3QiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKCFmUGFyZW50LmlzQWxsb3dhYmxlQ2hpbGQoc2libGluZykpIHsKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRJbmNvbXBhdGlibGVTaWJsaW5nIikpOyAvLyROT04tTkxTLTEkCisJfQorCWlmIChzaWJsaW5nLmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5hZGRTaWJsaW5nV2l0aFBhcmVudCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkvKiBOT1RFOiBUbyB0ZXN0IGlmIHRoZSBzaWJsaW5nIGlzIGFuIGFuY2VzdG9yIG9mIHRoaXMgbm9kZSwgd2UKKwkgKiBuZWVkIG9ubHkgdGVzdCBpZiB0aGUgcm9vdCBvZiB0aGlzIG5vZGUgaXMgdGhlIGNoaWxkICh0aGUgc2libGluZworCSAqIGlzIGFscmVhZHkgYSByb290IHNpbmNlIHdlIGhhdmUganVzdCBndWFyYW50ZWVkIGl0IGhhcyBubyBwYXJlbnQpLgorCSAqLworCWlmIChzaWJsaW5nID09IGdldFJvb3QoKSkgeworCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZEFuY2VzdG9yQXNTaWJsaW5nIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJRE9NTm9kZSBub2RlPSAoRE9NTm9kZSlzaWJsaW5nOworCQorCS8vIGlmIHRoZSBzaWJsaW5nIGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhpcyBkb2N1bWVudCwgbG9jYWxpemUgaXRzIGNvbnRlbnRzCisJLy8gYmVmb3JlIGluc2VydGluZyBpdCBpbnRvIHRoZSB0cmVlCisJaWYgKG5vZGUuZ2V0RG9jdW1lbnQoKSAhPSBnZXREb2N1bWVudCgpKSB7CisJCW5vZGUubG9jYWxpemVDb250ZW50cygpOworCX0KKworCS8vIGluc2VydCB0aGUgbm9kZQorCWlmIChmUHJldmlvdXNOb2RlID09IG51bGwpIHsKKwkJZlBhcmVudC5mRmlyc3RDaGlsZD0gbm9kZTsKKwl9IGVsc2UgeworCQlmUHJldmlvdXNOb2RlLmZOZXh0Tm9kZT0gbm9kZTsJCisJfQorCW5vZGUuZlBhcmVudD0gZlBhcmVudDsKKwlub2RlLmZQcmV2aW91c05vZGU9IGZQcmV2aW91c05vZGU7CisJbm9kZS5mTmV4dE5vZGU9IHRoaXM7CisJZlByZXZpb3VzTm9kZT0gbm9kZTsKKworCS8vIGlmIHRoZSBub2RlIGlzIGEgY29uc3RydWN0b3IsIGl0IG11c3QgYWxzbyBiZSBmcmFnbWVudGVkIHRvIHVwZGF0ZSB0aGUgY29uc3RydWN0b3IncyBuYW1lCisJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJRE9NTm9kZS5NRVRIT0QgJiYgKChJRE9NTWV0aG9kKW5vZGUpLmlzQ29uc3RydWN0b3IoKSkgeworCQlub2RlLmZyYWdtZW50KCk7CisJfSBlbHNlIHsKKwkJZlBhcmVudC5mcmFnbWVudCgpOworCX0KK30KKy8qKgorICogQHNlZSBJRE9NTm9kZQorICovCitwdWJsaWMgYm9vbGVhbiBpc0FsbG93YWJsZUNoaWxkKElET01Ob2RlIG5vZGUpIHsKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSBhcmUgZnJvbSB0aGUgc2FtZSBkb2N1bWVudCBhcworICogdGhlIGdpdmVuIG5vZGUsIHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBjb250ZW50cworICogb2YgdGhlIGdpdmVuIG5vZGUsIGFuZCBuZWl0aGVyIHRoaXMgbm9kZSBvciB0aGUgZ2l2ZW4gbm9kZSBhcmUgZnJhZ21lbnRlZCAtCisgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRlbnRNZXJnYWJsZVdpdGgoRE9NTm9kZSBub2RlKSB7CisJcmV0dXJuICFub2RlLmlzRnJhZ21lbnRlZCgpICYmICFpc0ZyYWdtZW50ZWQoKSAmJiBub2RlLmdldERvY3VtZW50KCkgPT0gZ2V0RG9jdW1lbnQoKSAmJgorCQlub2RlLmdldEVuZFBvc2l0aW9uKCkgKyAxID09IGdldFN0YXJ0UG9zaXRpb24oKTsKK30KKy8qKgorICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaGFzIGRldGFpbGVkIHNvdXJjZSBpbmRleCBpbmZvcm1hdGlvbiwKKyAqIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaGFzIGxpbWl0ZWQgc291cmNlIGluZGV4IGluZm9ybWF0aW9uLiBUbworICogcGVyZm9ybSBzb21lIG1hbmlwdWxhdGlvbnMsIGRldGFpbGVkIGluZGV4ZXMgYXJlIHJlcXVpcmVkLgorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBpc0RldGFpbGVkKCkgeworCXJldHVybiBnZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMpOworfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9kZSdzIG9yIGEgZGVzY2VuZGFudCBub2RlJ3MgY29udGVudHMgCisgKiBoYXZlIGJlZW4gYWx0ZXJlZCBzaW5jZSB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQuIFRoaXMgaW5kaWNhdGVzCisgKiB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUgYXJlIG5vIGxvbmdlciBjb25zaXN0ZW50IHdpdGgKKyAqIHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUncyBkb2N1bWVudC4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaXNGcmFnbWVudGVkKCkgeworCXJldHVybiBmSXNGcmFnbWVudGVkOworfQorLyoqCisgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9lZCdzIG5hbWUgaGFzIGJlZW4gYWx0ZXJlZAorICogZnJvbSB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgY29udGVudHMuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIGlzTmFtZUFsdGVyZWQoKSB7CisJcmV0dXJuIGdldE1hc2soTUFTS19OQU1FX0FMVEVSRUQpOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2lzU2lnbmF0dXJlRXF1YWwoSURPTU5vZGUpLgorICoKKyAqIDxwPkJ5IGRlZmF1bHQsIHRoZSBzaWduYXR1cmVzIG9mIHR3byBub2RlcyBhcmUgZXF1YWwgaWYgdGhlaXIKKyAqIHR5cGUgYW5kIG5hbWVzIGFyZSBlcXVhbC4gTm9kZSB0eXBlcyB0aGF0IGhhdmUgb3RoZXIgcmVxdWlyZW1lbnRzCisgKiBmb3IgZXF1YWxpdHkgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAqLworcHVibGljIGJvb2xlYW4gaXNTaWduYXR1cmVFcXVhbChJRE9NTm9kZSBub2RlKSB7CisJcmV0dXJuIGdldE5vZGVUeXBlKCkgPT0gbm9kZS5nZXROb2RlVHlwZSgpICYmIGdldE5hbWUoKS5lcXVhbHMobm9kZS5nZXROYW1lKCkpOworfQorLyoqCisgKiBMb2NhbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZSBhbmQgYWxsIGRlc2NlbmRhbnQgbm9kZXMsCisgKiBzdWNoIHRoYXQgdGhpcyBub2RlIGlzIG5vIGxvbmdlciBkZXBlbmRlbnQgb24gaXRzIG9yaWdpbmFsCisgKiBkb2N1bWVudCBpbiBvcmRlciB0byBnZW5lcmF0ZSBpdHMgY29udGVudHMuIFRoaXMgbm9kZSBhbmQgYWxsCisgKiBkZXNjZW5kYW50IG5vZGVzIGJlY29tZSB1bmZyYWdtZW50ZWQgYW5kIHNoYXJlIGEgbmV3CisgKiBkb2N1bWVudC4KKyAqLworcHJvdGVjdGVkIHZvaWQgbG9jYWxpemVDb250ZW50cygpIHsKKworCURPTU5vZGUgY2xvbmU9IChET01Ob2RlKWNsb25lKCk7CisJc2hhcmVDb250ZW50cyhjbG9uZSk7CisKK30KKy8qKgorICogUmV0dXJucyBhIG5ldyBlbXB0eSA8Y29kZT5ET01Ob2RlPC9jb2RlPiBmb3IgdGhpcyBpbnN0YW5jZS4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IERPTU5vZGUgbmV3RE9NTm9kZSgpOworLyoqCisgKiBOb3JtYWxpemVzIHRoaXMgPGNvZGU+RE9NTm9kZTwvY29kZT4ncyBzb3VyY2UgcG9zaXRpb25zIHRvIGluY2x1ZGUgd2hpdGVzcGFjZSBwcmVjZWVkaW5nCisgKiB0aGUgbm9kZSBvbiB0aGUgbGluZSBvbiB3aGljaCB0aGUgbm9kZSBzdGFydHMsIGFuZCBhbGwgd2hpdGVzcGFjZSBhZnRlciB0aGUgbm9kZSB1cCB0bworICogdGhlIG5leHQgbm9kZSdzIHN0YXJ0CisgKi8KK3ZvaWQgbm9ybWFsaXplKElMaW5lU3RhcnRGaW5kZXIgZmluZGVyKSB7CisJaWYgKGdldFByZXZpb3VzTm9kZSgpID09IG51bGwpCisJCW5vcm1hbGl6ZVN0YXJ0UG9zaXRpb24oZ2V0UGFyZW50RW5kRGVjbGFyYXRpb24oKSwgZmluZGVyKTsKKworCS8vIFNldCB0aGUgY2hpbGRyZW4ncyBwb3NpdGlvbgorCWlmIChjYW5IYXZlQ2hpbGRyZW4oKSkgeworCQlFbnVtZXJhdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCXdoaWxlKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKQorCQkJKChET01Ob2RlKWNoaWxkcmVuLm5leHRFbGVtZW50KCkpLm5vcm1hbGl6ZShmaW5kZXIpOworCX0KKworCW5vcm1hbGl6ZUVuZFBvc2l0aW9uKGZpbmRlciwgKERPTU5vZGUpZ2V0TmV4dE5vZGUoKSk7Cit9CisvKioKKyAqIE5vcm1hbGl6ZXMgdGhpcyA8Y29kZT5ET01Ob2RlPC9jb2RlPidzIGVuZCBwb3NpdGlvbi4KKyAqLwordm9pZCBub3JtYWxpemVFbmRQb3NpdGlvbihJTGluZVN0YXJ0RmluZGVyIGZpbmRlciwgRE9NTm9kZSBuZXh0KSB7CisJaWYgKG5leHQgPT0gbnVsbCkgeworCQkvLyB0aGlzIG5vZGUncyBlbmQgcG9zaXRpb24gaW5jbHVkZXMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIHVwCisJCS8vIHRvIHRoZSBlbmQgb2YgdGhlIGVuY2xvc2luZyBub2RlCisJCURPTU5vZGUgcGFyZW50ID0gKERPTU5vZGUpIGdldFBhcmVudCgpOworCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50IGluc3RhbmNlb2YgRE9NQ29tcGlsYXRpb25Vbml0KSB7CisJCQlzZXRTb3VyY2VSYW5nZUVuZChmRG9jdW1lbnQubGVuZ3RoIC0gMSk7CisJCX0gZWxzZSB7CisJCQkvLyBwYXJlbnQgaXMgYSB0eXBlCisJCQlpbnQgdGVtcCA9ICgoRE9NVHlwZSlwYXJlbnQpLmdldENsb3NlQm9keVBvc2l0aW9uKCkgLSAxOworCQkJc2V0U291cmNlUmFuZ2VFbmQodGVtcCk7CisJCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBNYXRoLm1heChmaW5kZXIuZ2V0TGluZVN0YXJ0KHRlbXAgKyAxKSwgZ2V0RW5kUG9zaXRpb24oKSk7CisJCX0KKwl9IGVsc2UgeworCQkvLyB0aGlzIG5vZGUncyBlbmQgcG9zaXRpb24gaXMganVzdCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKKwkJaW50IHRlbXAgPSBuZXh0LmdldFN0YXJ0UG9zaXRpb24oKSAtIDE7CisJCWZJbnNlcnRpb25Qb3NpdGlvbiA9IE1hdGgubWF4KGZpbmRlci5nZXRMaW5lU3RhcnQodGVtcCArIDEpLCBnZXRFbmRQb3NpdGlvbigpKTsKKwkJbmV4dC5ub3JtYWxpemVTdGFydFBvc2l0aW9uKGdldEVuZFBvc2l0aW9uKCksIGZpbmRlcik7CisJCXNldFNvdXJjZVJhbmdlRW5kKG5leHQuZ2V0U3RhcnRQb3NpdGlvbigpIC0gMSk7CisJfQorfQorLyoqCisgKiBOb3JtYWxpemVzIHRoaXMgPGNvZGU+RE9NTm9kZTwvY29kZT4ncyBzdGFydCBwb3NpdGlvbi4KKyAqLwordm9pZCBub3JtYWxpemVTdGFydFBvc2l0aW9uKGludCBwcmV2aW91c0VuZCwgSUxpbmVTdGFydEZpbmRlciBmaW5kZXIpIHsKKwlpbnQgbm9kZVN0YXJ0ID0gZ2V0U3RhcnRQb3NpdGlvbigpOworCWludCBsaW5lU3RhcnQgPSBmaW5kZXIuZ2V0TGluZVN0YXJ0KG5vZGVTdGFydCk7CisJaWYgKG5vZGVTdGFydCA+IGxpbmVTdGFydCAmJiAobGluZVN0YXJ0ID4gcHJldmlvdXNFbmQgfHwgKHByZXZpb3VzRW5kID09IDAgJiYgbGluZVN0YXJ0ID09IDApKSkKKwkJc2V0U3RhcnRQb3NpdGlvbihsaW5lU3RhcnQpOwkJCQorfQorLyoqCisgKiBPZmZzZXRzIGFsbCB0aGUgc291cmNlIGluZGV4ZXMgaW4gdGhpcyBub2RlIGJ5IHRoZSBnaXZlbiBhbW91bnQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG9mZnNldChpbnQgb2Zmc2V0KSB7CisJb2Zmc2V0UmFuZ2UoZk5hbWVSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmU291cmNlUmFuZ2UsIG9mZnNldCk7Cit9CisvKioKKyAqIE9mZnNldHMgdGhlIHNvdXJjZSByYW5nZSBieSB0aGUgZ2l2ZW4gYW1vdW50CisgKi8KK3Byb3RlY3RlZCB2b2lkIG9mZnNldFJhbmdlKGludFtdIHJhbmdlLCBpbnQgb2Zmc2V0KSB7CisJZm9yIChpbnQgaT0gMDsgaSA8IHJhbmdlLmxlbmd0aDsgaSsrKSB7CisJCXJhbmdlW2ldKz1vZmZzZXQ7CisJCWlmIChyYW5nZVtpXSA8IDApIHsKKwkJCXJhbmdlW2ldPSAtMTsKKwkJfQorCX0KK30KKy8qKgorICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHJhbmdlLgorICovCitwcm90ZWN0ZWQgaW50W10gcmFuZ2VDb3B5KGludFtdIHJhbmdlKSB7CisJaW50W10gY29weT0gbmV3IGludFtyYW5nZS5sZW5ndGhdOworCWZvciAoaW50IGk9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykgeworCQljb3B5W2ldPSByYW5nZVtpXTsKKwl9CisJcmV0dXJuIGNvcHk7Cit9CisvKioKKyAqIFNlcGFyYXRlcyB0aGlzIG5vZGUgZnJvbSBpdHMgcGFyZW50IGFuZCBzaWJsaW5ncywgbWFpbnRhaW5pbmcgYW55IHRpZXMgdGhhdAorICogdGhpcyBub2RlIGhhcyB0byB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBmcmFnbWVudC4KKyAqCisgKiA8cD5XaGVuIGEgY2hpbGQgaXMgcmVtb3ZlZCwgaXRzIHBhcmVudCBpcyBmcmFnbWVudGVkIHN1Y2ggdGhhdCBpdCBwcm9wZXJseQorICogZ2VuZXJhdGVzIGl0cyBjb250ZW50cy4KKyAqCisgKiBAc2VlIElET01Ob2RlI3JlbW92ZSgpCisgKi8KK3B1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKworCWlmIChmUGFyZW50ICE9IG51bGwpIHsKKwkJZlBhcmVudC5mcmFnbWVudCgpOworCX0KKwkKKwkvLyBsaW5rIHNpYmxpbmdzCisJaWYgKGZOZXh0Tm9kZSAhPSBudWxsKSB7CisJCWZOZXh0Tm9kZS5mUHJldmlvdXNOb2RlPSBmUHJldmlvdXNOb2RlOworCX0KKwlpZiAoZlByZXZpb3VzTm9kZSAhPSBudWxsKSB7CisJCWZQcmV2aW91c05vZGUuZk5leHROb2RlPSBmTmV4dE5vZGU7CisJfQorCS8vIGZpeCBwYXJlbnQncyBwb2ludGVycworCWlmIChmUGFyZW50ICE9IG51bGwpIHsKKwkJaWYgKGZQYXJlbnQuZkZpcnN0Q2hpbGQgPT0gdGhpcykgeworCQkJZlBhcmVudC5mRmlyc3RDaGlsZD0gZk5leHROb2RlOworCQl9CisJCWlmIChmUGFyZW50LmZMYXN0Q2hpbGQgPT0gdGhpcykgeworCQkJZlBhcmVudC5mTGFzdENoaWxkPSBmUHJldmlvdXNOb2RlOworCQl9CisJfQorCS8vIHJlbW92ZSBteXNlbGYKKwlmUGFyZW50PSBudWxsOworCWZOZXh0Tm9kZT0gbnVsbDsKKwlmUHJldmlvdXNOb2RlPSBudWxsOworfQorLyoqCisgKiBTZXRzIHRoZSBzcGVjaWZpZWQgbWFzayBvZiB0aGlzIG5vZGUncyBzdGF0ZSBtYXNrIG9uIG9yIG9mZgorICogYmFzZWQgb24gdGhlIGJvb2xlYW4gdmFsdWUgLSB0cnVlIC0+IG9uLCBmYWxzZSAtPiBvZmYuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldE1hc2soaW50IG1hc2ssIGJvb2xlYW4gb24pIHsKKwlpZiAob24pIHsKKwkJZlN0YXRlTWFzayB8PSBtYXNrOworCX0gZWxzZSB7CisJCWZTdGF0ZU1hc2sgJj0gfm1hc2s7CisJfQorfQorLyoqCisgKiBAc2VlIElET01Ob2RlI3NldE5hbWUKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCWZOYW1lPSBuYW1lOworCXNldE5hbWVBbHRlcmVkKHRydWUpOworCWZyYWdtZW50KCk7Cit9CisvKioKKyAqIFNldHMgdGhlIHN0YXRlIG9mIHRoaXMgbm9kZSBhcyBoYXZpbmcKKyAqIGl0cyBuYW1lIGF0dHJpYnV0ZSBhbHRlcmVkIGZyb20gdGhlIG9yaWdpbmFsCisgKiBkb2N1bWVudCBjb250ZW50cy4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0TmFtZUFsdGVyZWQoYm9vbGVhbiBhbHRlcmVkKSB7CisJc2V0TWFzayhNQVNLX05BTUVfQUxURVJFRCwgYWx0ZXJlZCk7Cit9CisvKioKKyAqIFNldHMgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIG5vZGUncyBjb250ZW50cworICogaW4gaXRzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZHVyaW5nIERPTSBjcmVhdGlvbiB3aGlsZQorICogbm9ybWFsaXppbmcgdGhlIHNvdXJjZSByYW5nZSBvZiBlYWNoIG5vZGUuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFNvdXJjZVJhbmdlRW5kKGludCBlbmQpIHsKKwlmU291cmNlUmFuZ2VbMV09IGVuZDsKK30KKy8qKgorICogU2V0cyB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIG5vZGUncyBjb250ZW50cworICogaW4gaXRzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZHVyaW5nIERPTSBjcmVhdGlvbiB3aGlsZQorICogbm9ybWFsaXppbmcgdGhlIHNvdXJjZSByYW5nZSBvZiBlYWNoIG5vZGUuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHNldFN0YXJ0UG9zaXRpb24oaW50IHN0YXJ0KSB7CisJZlNvdXJjZVJhbmdlWzBdPSBzdGFydDsKK30KKy8qKgorICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhpcyBub2RlIGFuZCBkZXNjZW5kYW50IG5vZGVzIHRvIGJlIHRoZQorICogKGlkZW50aWNhbCkgY29udGVudHMgb2YgdGhlIGdpdmVuIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4gVGhpcworICogZG9lcyBub3QgZWZmZWN0IHRoaXMgbm9kZSdzIHBhcmVudCBhbmQgc2libGluZyBjb25maWd1cmF0aW9uLAorICogb25seSB0aGUgY29udGVudHMgb2YgdGhpcyBub2RlLiBUaGlzIGlzIHVzZWQgb25seSB0byBsb2NhbGl6ZQorICogdGhlIGNvbnRlbnRzIG9mIHRoaXMgbm9kZS4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKKwlmRG9jdW1lbnQ9IG5vZGUuZkRvY3VtZW50OworCWZJc0ZyYWdtZW50ZWQ9IG5vZGUuZklzRnJhZ21lbnRlZDsKKwlmTmFtZT0gbm9kZS5mTmFtZTsKKwlmTmFtZVJhbmdlPSByYW5nZUNvcHkobm9kZS5mTmFtZVJhbmdlKTsKKwlmU291cmNlUmFuZ2U9IHJhbmdlQ29weShub2RlLmZTb3VyY2VSYW5nZSk7CisJZlN0YXRlTWFzaz0gbm9kZS5mU3RhdGVNYXNrOworCisJCisJaWYgKGNhbkhhdmVDaGlsZHJlbigpKSB7CisJCUVudW1lcmF0aW9uIG15Q2hpbGRyZW49IGdldENoaWxkcmVuKCk7CisJCUVudW1lcmF0aW9uIG90aGVyQ2hpbGRyZW49IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKKwkJRE9NTm9kZSBteUNoaWxkLCBvdGhlckNoaWxkOworCQl3aGlsZSAobXlDaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJbXlDaGlsZD0gKERPTU5vZGUpbXlDaGlsZHJlbi5uZXh0RWxlbWVudCgpOworCQkJb3RoZXJDaGlsZD0gKERPTU5vZGUpb3RoZXJDaGlsZHJlbi5uZXh0RWxlbWVudCgpOworCQkJbXlDaGlsZC5zaGFyZUNvbnRlbnRzKG90aGVyQ2hpbGQpOworCQl9CisJfQorfQorLyoqCisgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhpcyBub2RlIC0gZm9yIERlYnVnIHB1cnBvc2VzIG9ubHkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01QYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExNjMzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5DaGFyQXJyYXlCdWZmZXI7CisKKy8qKgorICogRE9NUGFja2FnZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJRE9NUGFja2FnZS4KKyAqCisgKiBAc2VlIElET01QYWNrYWdlCisgKiBAc2VlIERPTU5vZGUKKyAqLworY2xhc3MgRE9NUGFja2FnZSBleHRlbmRzIERPTU5vZGUgaW1wbGVtZW50cyBJRE9NUGFja2FnZSB7CisKKy8qKgorICogQ3JlYXRlcyBhbiBlbXB0eSBQQUNLQUdFIG5vZGUuCisgKi8KK0RPTVBhY2thZ2UoKSB7CisJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCB0cnVlKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBzaW1wbGUgUEFDS0FHRSBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKi8KK0RPTVBhY2thZ2UoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5ldyBpbnRbXSB7LTEsIC0xfSk7CisJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCBmYWxzZSk7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZGV0YWlsZWQgUEFDS0FHRSBkb2N1bWVudCBmcmFnbWVudCBvbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBkb2N1bWVudCAtIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoaXMgbm9kZSdzIG9yaWdpbmFsIGNvbnRlbnRzCisgKiBAcGFyYW0gc291cmNlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IG9mIGludGVnZXJzIGRlc2NyaWJpbmcgdGhlCisgKgkJZW50aXJlIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhpcyBub2RlIHdpdGhpbiBpdHMgZG9jdW1lbnQuCisgKiAJCUNvbnRlbnRzIHN0YXJ0IG9uIGFuZCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGZpcnN0IHBvc2l0aW9uLgorICoJCUNvbnRlbnRzIGVuZCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsYXN0IHBvc2l0aW9uLgorICoJCUFuIGFycmF5IG9mIC0xJ3MgaW5kaWNhdGVzIHRoaXMgbm9kZSdzIGNvbnRlbnRzIGRvIG5vdCBleGlzdAorICoJCWluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBuYW1lIC0gdGhlIGlkZW50aWZpZXIgcG9ydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIG9yCisgKgkJPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhdmUgYSBuYW1lCisgKiBAcGFyYW0gbmFtZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSdzIG5hbWUgd2l0aGluIGl0cyBkb2N1bWVudCwKKyAqCQlpbmNsdWRpbmcgYW55IGFycmF5IHF1YWxpZmllcnMgdGhhdCBtaWdodCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG5hbWUKKyAqCQlvciAtMSdzIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZS4KKyAqLworRE9NUGFja2FnZShjaGFyW10gZG9jdW1lbnQsIGludFtdIHNvdXJjZVJhbmdlLCBTdHJpbmcgbmFtZSwgaW50W10gbmFtZVJhbmdlKSB7CisJc3VwZXIoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UpOworCXNldE1hc2soTUFTS19ERVRBSUxFRF9TT1VSQ0VfSU5ERVhFUywgdHJ1ZSk7Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGcmFnbWVudGVkQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWlmIChmTmFtZVJhbmdlWzBdIDwgMCkgeworCQlidWZmZXIKKwkJCS5hcHBlbmQoInBhY2thZ2UgIikgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChmTmFtZSkKKwkJCS5hcHBlbmQoJzsnKQorCQkJLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKQorCQkJLmFwcGVuZChVdGlsLkxJTkVfU0VQQVJBVE9SKTsKKwl9IGVsc2UgeworCQlidWZmZXIKKwkJCS5hcHBlbmQoZkRvY3VtZW50LCBmU291cmNlUmFuZ2VbMF0sIGZOYW1lUmFuZ2VbMF0gLSBmU291cmNlUmFuZ2VbMF0pCisJCQkuYXBwZW5kKGZOYW1lKQorCQkJLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmTmFtZVJhbmdlWzFdKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Q29udGVudHMoKQorICovCitwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkgeworCWlmIChmTmFtZSA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCXJldHVybiBzdXBlci5nZXRDb250ZW50cygpOworCX0KK30KKy8qKgorICogQHNlZSBET01Ob2RlI2dldERldGFpbGVkTm9kZSgpCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIGdldERldGFpbGVkTm9kZSgpIHsKKwlyZXR1cm4gKERPTU5vZGUpZ2V0RmFjdG9yeSgpLmNyZWF0ZVBhY2thZ2UoZ2V0Q29udGVudHMoKSk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0SmF2YUVsZW1lbnQKKyAqLworcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgcGFyZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKwlpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldFBhY2thZ2VEZWNsYXJhdGlvbihnZXROYW1lKCkpOworCX0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmlsbGVnYWxQYXJlbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjZ2V0Tm9kZVR5cGUoKQorICovCitwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgeworCXJldHVybiBJRE9NTm9kZS5QQUNLQUdFOworfQorLyoqCisgKiBAc2VlIERPTU5vZGUKKyAqLworcHJvdGVjdGVkIERPTU5vZGUgbmV3RE9NTm9kZSgpIHsKKwlyZXR1cm4gbmV3IERPTVBhY2thZ2UoKTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNzZXROYW1lCisgKi8KK3B1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCXN1cGVyLnNldE5hbWUobmFtZSk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjdG9TdHJpbmcoKQorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiUEFDS0FHRTogIiArIGdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFlNGNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01UeXBlLmphdmEKQEAgLTAsMCArMSw3MjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01NZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5T3BzOworCisvKioKKyAqIERPTVR5cGUgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSURPTVR5cGUuCisgKgorICogQHNlZSBJRE9NVHlwZQorICogQHNlZSBET01Ob2RlCisgKi8KKyAKKy8qIHBhY2thZ2UgKi8gY2xhc3MgRE9NVHlwZSBleHRlbmRzIERPTU1lbWJlciBpbXBsZW1lbnRzIElET01UeXBlIHsKKworCS8qKgorCSAqIFRoZSAnY2xhc3MnIG9yICdpbnRlcmZhY2UnIGtleXdvcmQgaWYgYWx0ZXJlZAorCSAqIGZyb20gdGhlIGRvY3VtZW50cyBjb250ZW50cywgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZlR5cGVLZXl3b3JkOworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlICdjbGFzcycKKwkgKiBvciAnaW50ZXJmYWNlJyBrZXl3b3JkIGluIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10JIGZUeXBlUmFuZ2U7CisKKwkvKioKKwkgKiBUaGUgc3VwZXJjbGFzcyBuYW1lIGZvciB0aGUgY2xhc3MgZGVjbGFyYXRpb24KKwkgKiBpZiBhbHRlcmVkIGZyb20gdGhlIGRvY3VtZW50J3MgY29udGVudHMsIG90aGVyd2lzZQorCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBBbHNvIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhpcworCSAqIHR5cGUgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBmU3VwZXJjbGFzczsKKworCS8qKgorCSAqIFRoZSBvcmlnaW5hbCBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoZSBzdXBlcmNsYXNzCisJICogbmFtZSBpbiB0aGUgZG9jdW1lbnQsIG9yIC0xJ3Mgb2Ygbm8gc3VwZXJjbGFzcyB3YXMKKwkgKiBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50LgorCSAqLworCXByb3RlY3RlZCBpbnRbXSAgZlN1cGVyY2xhc3NSYW5nZTsKKworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VjZSByYW5nZSBvZiB0aGUgJ2V4dGVuZHMnIGtleXdvcmQKKwkgKiBpbiB0aGUgZG9jdW1lbnQsIGluY2x1ZGluZyBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLCBvciAtMSdzIGlmCisJICogdGhlIGtleXdvcmQgd2FzIG5vdCBwcmVzZW50IGluIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10JIGZFeHRlbmRzUmFuZ2U7CisKKwkvKioKKwkgKiBUaGUgb3JpZ2luYWwgaW5jbHVzaXZlIHNvdWNlIHJhbmdlIG9mIHRoZSAnaW1wbGVtZW50cycga2V5d29yZAorCSAqIGluIHRoZSBkb2N1bWVudCwgaW5jbHVkaW5nIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UsIG9yIC0xJ3MgaWYKKwkgKiB0aGUga2V5d29yZCB3YXMgbm90IHByZXNlbnQgaW4gdGhlIGRvY3VtZW50LgorCSAqLwkKKwlwcm90ZWN0ZWQgaW50W10JIGZJbXBsZW1lbnRzUmFuZ2U7CisKKwkvKioKKwkgKiBUaGUgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaW50ZXJmYWNlcyB0aGlzIHR5cGUgaW1wbGVtZW50cworCSAqIG9yIGV4dGVuZHMsIGlmIGFsdGVyZWQgZnJvbSB0aGUgZG9jdW1lbnQncyBjb250ZW50cywgb3RoZXJ3aXNlCisJICogPGNvZGU+bnVsbDwvY29kZT4uIEFsc28gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0eXBlIGRvZXMKKwkgKiBub3QgaW1wbGVtZW50IG9yIGV4dGVuZCBhbnkgaW50ZXJmYWNlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgY2hhcltdIGZJbnRlcmZhY2VzOworCisJLyoqCisJICogVGhlIG9yaWdpbmFsIGluY2x1c2l2ZSBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyB0aGlzCisJICogdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMsIG5vdCBpbmNsdWRpbmcgYW55IHN1cnJvdWRpbmcgd2hpdGVzcGFjZS4KKwkgKiBJZiB0aGUgZG9jdW1lbnQgZGlkIG5vdCBzcGVjaWZ5IGludGVyZmFjZXMsIHRoaXMgYXJyYXkgY29udGFpbnMgLTEncy4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50W10gIGZJbnRlcmZhY2VzUmFuZ2U7CisKKwkKKworCS8qKiAKKwkgKiBUaGUgb3JpZ2luYWwgc291cmNlIHJhbmdlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZQorCSAqIHR5cGUgbmFtZSBzdXBlcmNsYXNzIG5hbWUsIG9yIGludGVyZmFjZSBsaXN0LCB1cCB0byBhbmQgaW5jbHVkaW5nCisJICogdGhlIGZpcnN0IGNoYXJhY3RlciBiZWZvcmUgdGhlIGZpcnN0IHR5cGUgbWVtYmVyLgorCSAqLwkKKwlwcm90ZWN0ZWQgaW50W10gIGZPcGVuQm9keVJhbmdlOworCisJLyoqIAorCSAqIFRoZSBvcmlnaW5hbCBzb3VyY2UgcmFuZ2Ugb2YgdGhlIGZpcnN0IG5ldyBsaW5lIG9yIG5vbiB3aGl0ZXNwYWNlCisJICogY2hhcmFjdGVyIHByZWNlZGluZyB0aGUgY2xvc2UgYnJhY2Ugb2YgdGhlIHR5cGUncyBib2R5LCB1cCB0byB0aGUKKwkgKiBhbmQgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBuZXh0IG5vZGUgKGlmIHRoZXJlIGFyZQorCSAqIG5vIGZvbGxvd2luZyBub2RlcywgdGhlIHJhbmdlIGVuZHMgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0CisJICogY2hhcmFjdGVyIGluIHRoZSBkb2N1bWVudCkuCisJICovCQorCXByb3RlY3RlZCBpbnRbXSAgZkNsb3NlQm9keVJhbmdlOworCisJLyoqCisJICogQSBsaXN0IG9mIGludGVyZmFjZXMgdGhpcyB0eXBlIGV4dGVuZHMgb3IgaW1wbGVtZW50cy4KKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoaXMgdHlwZSBkb2VzIG5vdCBleHRlbmQKKwkgKiBvciBpbXBsZW1lbnQgYW55IGludGVyZmFjZXMuCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1tdIGZTdXBlckludGVyZmFjZXM9IG5ldyBTdHJpbmdbMF07CisJCisJLyoqCisJICogVGhpcyBwb3NpdGlvbiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lIHNlcGFyYXRvciBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2Ugc3RhcnRpbmcKKwkgKiBwb3NpdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCisJICovCisvLwlwcm90ZWN0ZWQgaW50IGZJbnNlcnRpb25Qb3NpdGlvbjsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHR5cGUgbm9kZS4KKyAqLworRE9NVHlwZSgpIHsKKworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IGRldGFpbGVkIFRZUEUgZG9jdW1lbnQgZnJhZ21lbnQgb24gdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0gZG9jdW1lbnQgLSB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGlzIG5vZGUncyBvcmlnaW5hbCBjb250ZW50cworICogQHBhcmFtIHNvdXJjZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSB3aXRoaW4gaXRzIGRvY3VtZW50LgorICogCQlDb250ZW50cyBzdGFydCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAqCQlDb250ZW50cyBlbmQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgbGFzdCBwb3NpdGlvbi4KKyAqCQlBbiBhcnJheSBvZiAtMSdzIGluZGljYXRlcyB0aGlzIG5vZGUncyBjb250ZW50cyBkbyBub3QgZXhpc3QKKyAqCQlpbiB0aGUgZG9jdW1lbnQuCisgKiBAcGFyYW0gbmFtZSAtIHRoZSBpZGVudGlmaWVyIHBvcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBub2RlLCBvcgorICoJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZQorICogQHBhcmFtIG5hbWVSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUncyBuYW1lIHdpdGhpbiBpdHMgZG9jdW1lbnQsCisgKgkJaW5jbHVkaW5nIGFueSBhcnJheSBxdWFsaWZpZXJzIHRoYXQgbWlnaHQgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBuYW1lCisgKgkJb3IgLTEncyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG5hbWUuCisgKiBAcGFyYW0gY29tbWVudFJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBjb21tZW50cyB0aGF0IHByZWNlZGUKKyAqCQl0aGUgbWVtYmVyIGRlY2xhcmF0aW9uLiBUaGUgZmlyc3QgbWF0Y2hlcyB0aGUgc3RhcnQgb2YgdGhpcyBub2RlJ3MKKyAqCQlzb3VyY2VSYW5nZSwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIG5ldy1saW5lIG9yIGZpcnN0IG5vbi13aGl0ZXNwYWNlCisgKgkJY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBjb21tZW50LiBJZiBubyBjb21tZW50cyBhcmUgcHJlc2VudCwKKyAqCQl0aGlzIGFycmF5IGNvbnRhaW5zIHR3byAtMSdzLgorICogQHBhcmFtIGZsYWdzIC0gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIuIFRoZQorICoJCWludGVnZXIgY2FuIGJlIGFuYWx5emVkIHdpdGggb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3MKKyAqIEBwYXJhbSBtb2RpZmllclJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZgorICoJCW1vZGlmaWVycyBmb3IgdGhpcyBtZW1iZXIgd2l0aGluIGl0cyBzb3VyY2UgcmFuZ2UuIFRoZSBmaXJzdCBpbnRlZ2VyCisgKgkJaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgbW9kaWZpZXIgZm9yIHRoaXMgbWVtYmVyLCBhbmQKKyAqCQl0aGUgc2Vjb25kIGludGVnZXIgaXMgdGhlIGxhc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgcHJlY2VlZGluZyB0aGUKKyAqCQluZXh0IHBhcnQgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24uIElmIHRoZXJlIGFyZSBubyBtb2RpZmllcnMgcHJlc2VudAorICoJCWluIHRoaXMgbm9kZSdzIHNvdXJjZSBjb2RlIChpLmUuIGRlZmF1bHQgcHJvdGVjdGlvbiksIHRoaXMgYXJyYXkKKyAqCQljb250YWlucyB0d28gLTEncy4KKyAqIEBwYXJhbSB0eXBlUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSAnY2xhc3MnCisgKgkJb3IgJ2ludGVyZmFjZScga2V5d29yZCBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbiAtIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlcgorICoJCXBvc2l0aW9ucy4KKyAqIEBwYXJhbSBzdXBlcmNsYXNzUmFuZ2UgLSBhIHR3byBlbGVtZW50IGFycmF5IGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQorICoJCXN1cGVyY2xhc3MgbmFtZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbiAtIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlcgorICoJCXBvc2l0aW9ucyBvciB0d28gLTEncyBpZiBhIHN1cGVyY2xhc3MgaXMgbm90IHByZXNlbnQgaW4gdGhlIGRvY3VtZW50LgorICogQHBhcmFtIGV4dGVuZHNSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlCisgKgkJJ2V4dGVuZHMnIGtleXdvcmQgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24sIGluY2x1ZGluZyBhbnkgc3Vycm91bmRpbmcKKyAqCQl3aGl0ZXNwYWNlLCBvciAtMSdzIGlmIHRoZSAnZXh0ZW5kcycga2V5d29yZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgZG9jdW1lbnQuCisgKiBAcGFyYW0gaW1wbGVtZW50c0xpc3QgLSBhbiBhcnJheSBvZiBuYW1lcyBvZiB0aGUgaW50ZXJmYWNlcyB0aGlzIHR5cGUgaW1wbGVtZW50cworICoJCW9yIGV4dGVuZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdHlwZSBkb2VzIG5vdCBpbXBsZW1lbnQgb3IgZXh0ZW5kCisgKgkJYW55IGludGVyZmFjZXMuCisgKiBAcGFyYW0gaW1wbGVtZW50c1JhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqCQljb21tZW50IGRlbGltaXRlZCBsaXN0IG9mIGludGVyZmFjZXMgdGhpcyB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcywKKyAqCQlub3QgaW5jbHVkaW5nIGFueSBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLCBvciAtMSdzIGlmIG5vIGludGVyZmFjZSBsaXN0CisgKgkJaXMgcHJlc2VudCBpbiB0aGUgZG9jdW1lbnQuCisgKiBAcGFyYW0gaW1wbGVtZW50c0tleXdvcmRSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgdGhlCisgKgkJJ2ltcGxlbWVudHMnIGtleXdvcmQsIGluY2x1ZGluZyBhbnkgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgb3IgLTEncyBpZiBubworICogCQknaW1wbGVtZW50cycga2V5d29yZCBpcyBwcmVzZW50IGluIHRoZSBkb2N1bWVudC4KKyAqIEBwYXJhbSBvcGVuQm9keVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqICAgICAgb3BlbiBicmFjZSBvZiB0aGUgdHlwZSdzIGJvZHkgYW5kIHdoaXRlc3BhY2UgZm9sbG93aW5nIHRoZSB0eXBlIGRlY2xhcmF0aW9uCisgKgkJYW5kIHByZWNlZWRpbmcgdGhlIGZpcnN0IG1lbWJlciBpbiB0aGUgdHlwZS4KKyAqIEBwYXJhbSBjbG9zZUJvZHlSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgZGVzY3JpYmluZyB0aGUgc291cmNlIHJhbmdlIG9mIHRoZQorICoJCWZpcnN0IG5ldyBsaW5lIG9yIG5vbiB3aGl0ZXNwYWNlIGNoYXJhY3RlciBwcmVjZWVkaW5nIHRoZSBjbG9zZSBicmFjZSBvZiB0aGUKKyAqCQl0eXBlJ3MgYm9keSwgdXAgdG8gdGhlIGNsb3NlIGJyYWNlCisgKiBAcGFyYW0gaXNDbGFzcyAtIHRydWUgaXMgdGhlIHR5cGUgaXMgYSBjbGFzcywgZmFsc2UgaWYgaXQgaXMgYW4gaW50ZXJmYWNlCisgKi8KK0RPTVR5cGUoY2hhcltdIGRvY3VtZW50LCBpbnRbXSBzb3VyY2VSYW5nZSwgU3RyaW5nIG5hbWUsIGludFtdIG5hbWVSYW5nZSwgaW50W10gY29tbWVudFJhbmdlLCBpbnQgZmxhZ3MsIGludFtdIG1vZGlmaWVyUmFuZ2UsIGludFtdIHR5cGVSYW5nZSwgaW50W10gc3VwZXJjbGFzc1JhbmdlLCBpbnRbXSBleHRlbmRzUmFuZ2UsIFN0cmluZ1tdIGltcGxlbWVudHNMaXN0LCBpbnRbXSBpbXBsZW1lbnRzUmFuZ2UsIGludFtdIGltcGxlbWVudHNLZXl3b3JkUmFuZ2UsIGludFtdIG9wZW5Cb2R5UmFuZ2UsIGludFtdIGNsb3NlQm9keVJhbmdlLCBib29sZWFuIGlzQ2xhc3MpIHsKKwlzdXBlcihkb2N1bWVudCwgc291cmNlUmFuZ2UsIG5hbWUsIG5hbWVSYW5nZSwgY29tbWVudFJhbmdlLCBmbGFncywgbW9kaWZpZXJSYW5nZSk7CisKKwlmVHlwZVJhbmdlPSB0eXBlUmFuZ2U7CisJc2V0TWFzayhNQVNLX1RZUEVfSVNfQ0xBU1MsIGlzQ2xhc3MpOworCisJZkV4dGVuZHNSYW5nZT0gZXh0ZW5kc1JhbmdlOworCWZJbXBsZW1lbnRzUmFuZ2U9IGltcGxlbWVudHNLZXl3b3JkUmFuZ2U7CisJZlN1cGVyY2xhc3NSYW5nZT0gc3VwZXJjbGFzc1JhbmdlOworCWZJbnRlcmZhY2VzUmFuZ2U9IGltcGxlbWVudHNSYW5nZTsKKwlmQ2xvc2VCb2R5UmFuZ2U9IGNsb3NlQm9keVJhbmdlOworCXNldE1hc2soTUFTS19UWVBFX0hBU19TVVBFUkNMQVNTLCBzdXBlcmNsYXNzUmFuZ2VbMF0gPiAwKTsKKwlzZXRNYXNrKE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUywgaW1wbGVtZW50c0xpc3QgIT0gbnVsbCk7CisJZlN1cGVySW50ZXJmYWNlcz0gaW1wbGVtZW50c0xpc3Q7CisJZk9wZW5Cb2R5UmFuZ2U9IG9wZW5Cb2R5UmFuZ2U7CisJZkNsb3NlQm9keVJhbmdlPSBjbG9zZUJvZHlSYW5nZTsKKwlzZXRNYXNrKE1BU0tfREVUQUlMRURfU09VUkNFX0lOREVYRVMsIHRydWUpOworCit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2ltcGxlIFRZUEUgZG9jdW1lbnQgZnJhZ21lbnQgb24gdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0gZG9jdW1lbnQgLSB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGlzIG5vZGUncyBvcmlnaW5hbCBjb250ZW50cworICogQHBhcmFtIHNvdXJjZVJhbmdlIC0gYSB0d28gZWxlbWVudCBhcnJheSBvZiBpbnRlZ2VycyBkZXNjcmliaW5nIHRoZQorICoJCWVudGlyZSBpbmNsdXNpdmUgc291cmNlIHJhbmdlIG9mIHRoaXMgbm9kZSB3aXRoaW4gaXRzIGRvY3VtZW50LgorICogCQlDb250ZW50cyBzdGFydCBvbiBhbmQgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAqCQlDb250ZW50cyBlbmQgb24gYW5kIGluY2x1ZGUgdGhlIGNoYXJhY3RlciBhdCB0aGUgbGFzdCBwb3NpdGlvbi4KKyAqCQlBbiBhcnJheSBvZiAtMSdzIGluZGljYXRlcyB0aGlzIG5vZGUncyBjb250ZW50cyBkbyBub3QgZXhpc3QKKyAqCQlpbiB0aGUgZG9jdW1lbnQuCisgKiBAcGFyYW0gbmFtZSAtIHRoZSBpZGVudGlmaWVyIHBvcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBub2RlLCBvcgorICoJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbmFtZQorICogQHBhcmFtIG5hbWVSYW5nZSAtIGEgdHdvIGVsZW1lbnQgYXJyYXkgb2YgaW50ZWdlcnMgZGVzY3JpYmluZyB0aGUKKyAqCQllbnRpcmUgaW5jbHVzaXZlIHNvdXJjZSByYW5nZSBvZiB0aGlzIG5vZGUncyBuYW1lIHdpdGhpbiBpdHMgZG9jdW1lbnQsCisgKgkJaW5jbHVkaW5nIGFueSBhcnJheSBxdWFsaWZpZXJzIHRoYXQgbWlnaHQgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBuYW1lCisgKgkJb3IgLTEncyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG5hbWUuCisgKiBAcGFyYW0gZmxhZ3MgLSBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIG1lbWJlci4gVGhlCisgKgkJaW50ZWdlciBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFncworICogQHBhcmFtIGltcGxlbWVudHNMaXN0IC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgdGhlIGludGVyZmFjZXMgdGhpcyB0eXBlIGltcGxlbWVudHMKKyAqCQlvciBleHRlbmRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHR5cGUgZG9lcyBub3QgaW1wbGVtZW50IG9yIGV4dGVuZAorICoJCWFueSBpbnRlcmZhY2VzLgorICogQHBhcmFtIGlzQ2xhc3MgLSB0cnVlIGlzIHRoZSB0eXBlIGlzIGEgY2xhc3MsIGZhbHNlIGlmIGl0IGlzIGFuIGludGVyZmFjZQorICovCitET01UeXBlKGNoYXJbXSBkb2N1bWVudCwgaW50W10gc291cmNlUmFuZ2UsIFN0cmluZyBuYW1lLCBpbnRbXSBuYW1lUmFuZ2UsIGludCBmbGFncywgU3RyaW5nW10gaW1wbGVtZW50c0xpc3QsIGJvb2xlYW4gaXNDbGFzcykgeworCXRoaXMoZG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBuYW1lLCBuYW1lUmFuZ2UsIG5ldyBpbnRbXSB7LTEsIC0xfSwgZmxhZ3MsCisJCW5ldyBpbnRbXSB7LTEsIC0xfSwgbmV3IGludFtdIHstMSwgLTF9LCBuZXcgaW50W10gey0xLCAtMX0sIG5ldyBpbnRbXSB7LTEsIC0xfSwKKwkJaW1wbGVtZW50c0xpc3QsIG5ldyBpbnRbXSB7LTEsIC0xfSwgbmV3IGludFtdIHstMSwgLTF9LCBuZXcgaW50W10gey0xLCAtMX0sIG5ldyBpbnRbXSB7c291cmNlUmFuZ2VbMV0sIHNvdXJjZVJhbmdlWzFdfSwgaXNDbGFzcyk7CisJc2V0TWFzayhNQVNLX0RFVEFJTEVEX1NPVVJDRV9JTkRFWEVTLCBmYWxzZSk7Cit9CisvKioKKyAqIEBzZWUgSURPTVR5cGUjYWRkU3VwZXJJbnRlcmZhY2UoU3RyaW5nKQorICovCitwdWJsaWMgdm9pZCBhZGRTdXBlckludGVyZmFjZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZG9tLmFkZE51bGxJbnRlcmZhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJaWYgKGZTdXBlckludGVyZmFjZXMgPT0gbnVsbCkgeworCQlmU3VwZXJJbnRlcmZhY2VzPSBuZXcgU3RyaW5nWzFdOworCQlmU3VwZXJJbnRlcmZhY2VzWzBdPSBuYW1lOworCX0gZWxzZSB7CisJCWZTdXBlckludGVyZmFjZXM9IGFwcGVuZFN0cmluZyhmU3VwZXJJbnRlcmZhY2VzLCBuYW1lKTsKKwl9CisJc2V0U3VwZXJJbnRlcmZhY2VzKGZTdXBlckludGVyZmFjZXMpOworfQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyKQorICovCitwcm90ZWN0ZWQgdm9pZCBhcHBlbmRNZW1iZXJCb2R5Q29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmT3BlbkJvZHlSYW5nZVswXSwgZk9wZW5Cb2R5UmFuZ2VbMV0gKyAxIC0gZk9wZW5Cb2R5UmFuZ2VbMF0pOworCWFwcGVuZENvbnRlbnRzT2ZDaGlsZHJlbihidWZmZXIpOworCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQ2xvc2VCb2R5UmFuZ2VbMF0sIGZDbG9zZUJvZHlSYW5nZVsxXSArIDEgLSBmQ2xvc2VCb2R5UmFuZ2VbMF0pOworCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmQ2xvc2VCb2R5UmFuZ2VbMV0gKyAxLCBmU291cmNlUmFuZ2VbMV0gLSBmQ2xvc2VCb2R5UmFuZ2VbMV0pOworfQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNhcHBlbmRNZW1iZXJEZWNsYXJhdGlvbkNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlciApCisgKi8KK3Byb3RlY3RlZCB2b2lkIGFwcGVuZE1lbWJlckRlY2xhcmF0aW9uQ29udGVudHMoQ2hhckFycmF5QnVmZmVyICBidWZmZXIpIHsKKwkKKwlpZiAoZlR5cGVLZXl3b3JkICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZChmVHlwZUtleXdvcmQpOworCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlR5cGVSYW5nZVsxXSwgZk5hbWVSYW5nZVswXSAtIGZUeXBlUmFuZ2VbMV0gKTsKKwl9IGVsc2UgeworCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlR5cGVSYW5nZVswXSwgZlR5cGVSYW5nZVsxXSArIDEgLSBmVHlwZVJhbmdlWzBdKTsKKwl9CisKKwlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7CisKKwlpZiAoaXNDbGFzcygpKSB7CisJCWJvb2xlYW4gaGFzU3VwZXJjbGFzcyA9IGZhbHNlLCBoYXNJbnRlcmZhY2VzID0gZmFsc2U7CisJCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfU1VQRVJDTEFTUykpIHsKKwkJCWhhc1N1cGVyY2xhc3MgPSB0cnVlOworCQkJaWYgKGZFeHRlbmRzUmFuZ2VbMF0gPCAwKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZFeHRlbmRzUmFuZ2VbMF0sIGZFeHRlbmRzUmFuZ2VbMV0gKyAxIC0gZkV4dGVuZHNSYW5nZVswXSk7CisJCQl9CisJCQlpZiAoZlN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoZlN1cGVyY2xhc3MpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVswXSwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSBmU3VwZXJjbGFzc1JhbmdlWzBdKTsKKwkJCX0KKwkJfQorCQlpZiAoZ2V0TWFzayhNQVNLX1RZUEVfSEFTX0lOVEVSRkFDRVMpKSB7CisJCQloYXNJbnRlcmZhY2VzID0gdHJ1ZTsKKwkJCWlmIChmSW1wbGVtZW50c1JhbmdlWzBdIDwgMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiBpbXBsZW1lbnRzICIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW1wbGVtZW50c1JhbmdlWzBdLCBmSW1wbGVtZW50c1JhbmdlWzFdICsgMSAtIGZJbXBsZW1lbnRzUmFuZ2VbMF0pOworCQkJfQorCQkJaWYgKGZJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlidWZmZXIuYXBwZW5kKGZJbnRlcmZhY2VzKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZJbnRlcmZhY2VzUmFuZ2VbMF0sIGZJbnRlcmZhY2VzUmFuZ2VbMV0gKyAxIC0gZkludGVyZmFjZXNSYW5nZVswXSk7CisJCQl9CisJCX0KKwkJaWYgKGhhc0ludGVyZmFjZXMpIHsKKwkJCWlmIChmSW1wbGVtZW50c1JhbmdlWzBdIDwgMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZJbnRlcmZhY2VzUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVswXSAtIGZJbnRlcmZhY2VzUmFuZ2VbMV0gLSAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChoYXNTdXBlcmNsYXNzKSB7CisJCQkJaWYgKGZTdXBlcmNsYXNzUmFuZ2VbMF0gPCAwKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKKwkJCQl9IGVsc2UgeworCQkJCQlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEsIGZPcGVuQm9keVJhbmdlWzBdIC0gZlN1cGVyY2xhc3NSYW5nZVsxXSAtIDEpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUykpIHsKKwkJCWlmIChmRXh0ZW5kc1JhbmdlWzBdIDwgMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmRXh0ZW5kc1JhbmdlWzBdLCBmRXh0ZW5kc1JhbmdlWzFdICsgMSAtIGZFeHRlbmRzUmFuZ2VbMF0pOworCQkJfQorCQkJaWYgKGZJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlidWZmZXIuYXBwZW5kKGZJbnRlcmZhY2VzKTsKKwkJCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoZkRvY3VtZW50LCBmSW50ZXJmYWNlc1JhbmdlWzBdLCBmSW50ZXJmYWNlc1JhbmdlWzFdICsgMSAtIGZJbnRlcmZhY2VzUmFuZ2VbMF0pOworCQkJfQorCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVswXSAtIGZOYW1lUmFuZ2VbMV0gLSAxKTsKKwkJfQorCX0KKwkKK30KKy8qKgorICogQHNlZSBET01Ob2RlI2FwcGVuZFNpbXBsZUNvbnRlbnRzKENoYXJBcnJheUJ1ZmZlcikKKyAqLworcHJvdGVjdGVkIHZvaWQgYXBwZW5kU2ltcGxlQ29udGVudHMoQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgeworCS8vIGFwcGVuZCBldmV5dGhpbmcgYmVmb3JlIG15IG5hbWUKKwlidWZmZXIuYXBwZW5kKGZEb2N1bWVudCwgZlNvdXJjZVJhbmdlWzBdLCBmTmFtZVJhbmdlWzBdIC0gZlNvdXJjZVJhbmdlWzBdKTsKKwkvLyBhcHBlbmQgbXkgbmFtZQorCWJ1ZmZlci5hcHBlbmQoZk5hbWUpOworCisJCisJLy8gYXBwZW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgbXkgbmFtZSBhbmQgYmVmb3JlIG15IGZpcnN0IGNoaWxkCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZOYW1lUmFuZ2VbMV0gKyAxLCBmT3BlbkJvZHlSYW5nZVsxXSAtIGZOYW1lUmFuZ2VbMV0pOworCS8vIGFwcGVuZCBteSBjaGlsZHJlbgorCWFwcGVuZENvbnRlbnRzT2ZDaGlsZHJlbihidWZmZXIpOworCS8vIGFwcGVuZCBmcm9tIG15IGxhc3QgY2hpbGQgdG8gbXkgZW5kCisJYnVmZmVyLmFwcGVuZChmRG9jdW1lbnQsIGZDbG9zZUJvZHlSYW5nZVswXSwgZlNvdXJjZVJhbmdlWzFdIC0gZkNsb3NlQm9keVJhbmdlWzBdICsgMSk7CisKKworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2NhbkhhdmVDaGlsZHJlbigpCisgKi8KK3B1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGNsb3NpbmcgYnJhY2UgZm9yIHRoZSBib2R5IG9mIHRoaXMgdHlwZS4KKyAqIFRoaXMgdmFsdWUgdGhpcyBtZXRob2QgcmV0dXJucyBpcyBvbmx5IHZhbGlkIGJlZm9yZSB0aGUgdHlwZSBoYXMKKyAqIGJlZW4gbm9ybWFsaXplZCBhbmQgaXMgcHJlc2VudCBvbmx5IGZvciBub3JtYWxpemF0aW9uLgorICovCitpbnQgZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKSB7CisJcmV0dXJuIGZDbG9zZUJvZHlSYW5nZVswXTsKK30KKy8qKgorICogQHNlZSBET01Ob2RlI2dldERldGFpbGVkTm9kZSgpCisgKi8KK3Byb3RlY3RlZCBET01Ob2RlIGdldERldGFpbGVkTm9kZSgpIHsKKwlyZXR1cm4gKERPTU5vZGUpZ2V0RmFjdG9yeSgpLmNyZWF0ZVR5cGUoZ2V0Q29udGVudHMoKSk7Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZSNnZXRJbnNlcnRpb25Qb3NpdGlvbigpCisgKi8KK3B1YmxpYyBpbnQgZ2V0SW5zZXJ0aW9uUG9zaXRpb24oKSB7CisJLy8gdGhpcyBzaG91bGQgcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGxpbmUgc2VwYXJhdG9yIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBvZiB0aGUgdHlwZQorCS8vIFNlZSBQUiAxR0VMU0RROiBJVFBKVUk6V0lOTlQgLSBKRE9NOiBJVHlwZS5jcmVhdGVNZXRob2QgZG9lcyBub3QgaW5zZXJ0IG5pY2VseSBmb3IgaW5uZXIgdHlwZXMKKwlyZXR1cm4gZkluc2VydGlvblBvc2l0aW9uOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlI2dldEphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7CisJCXJldHVybiAoKElUeXBlKXBhcmVudCkuZ2V0VHlwZShnZXROYW1lKCkpOworCX0gZWxzZSBpZiAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKKwkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdClwYXJlbnQpLmdldFR5cGUoZ2V0TmFtZSgpKTsKKwl9IGVsc2UgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbGxlZ2FsUGFyZW50IikpOyAvLyROT04tTkxTLTEkCisJfQorfQorLyoqCisgKiBAc2VlIERPTU1lbWJlciNnZXRNZW1iZXJEZWNsYXJhdGlvblN0YXJ0UG9zaXRpb24oKQorICovCitwcm90ZWN0ZWQgaW50IGdldE1lbWJlckRlY2xhcmF0aW9uU3RhcnRQb3NpdGlvbigpIHsKKwlyZXR1cm4gZlR5cGVSYW5nZVswXTsKK30KKy8qKgorICogQHNlZSBJRE9NTm9kZSNnZXROb2RlVHlwZSgpCisgKi8KK3B1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7CisJcmV0dXJuIElET01Ob2RlLlRZUEU7Cit9CisvKioKKyAqIEFuc3dlcnMgdGhlIG9wZW4gYm9keSByYW5nZSBlbmQgcG9zaXRpb24uCisgKi8KK2ludCBnZXRPcGVuQm9keUVuZCgpIHsKKwlyZXR1cm4gZk9wZW5Cb2R5UmFuZ2VbMV07Cit9CisvKioKKyAqIEBzZWUgSURPTVR5cGUjZ2V0U3VwZXJjbGFzcygpCisgKi8KK3B1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzcygpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWlmIChnZXRNYXNrKE1BU0tfVFlQRV9IQVNfU1VQRVJDTEFTUykpIHsKKwkJaWYgKGZTdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCXJldHVybiBmU3VwZXJjbGFzczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyQXJyYXlPcHMuc3Vic3RyaW5nKGZEb2N1bWVudCwgZlN1cGVyY2xhc3NSYW5nZVswXSwgZlN1cGVyY2xhc3NSYW5nZVsxXSArIDEgLSBmU3VwZXJjbGFzc1JhbmdlWzBdKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KKy8qKgorICogQHNlZSBJRE9NVHlwZSNnZXRTdXBlckludGVyZmFjZXMoKQorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VzKCkgeworCXJldHVybiBmU3VwZXJJbnRlcmZhY2VzOworfQorLyoqCisgKiBAc2VlIElET01Ob2RlCisgKi8KK3B1YmxpYyBib29sZWFuIGlzQWxsb3dhYmxlQ2hpbGQoSURPTU5vZGUgbm9kZSkgeworCWlmIChub2RlICE9IG51bGwpIHsKKwkJaW50IHR5cGU9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKKwkJcmV0dXJuIHR5cGUgPT0gSURPTU5vZGUuVFlQRSB8fCB0eXBlID09IElET01Ob2RlLkZJRUxEfHwgdHlwZSA9PSBJRE9NTm9kZS5NRVRIT0QgfHwgCisJCQl0eXBlID09IElET01Ob2RlLklOSVRJQUxJWkVSOyAKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorfQorLyoqCisgKiBAc2VlIElET01UeXBlI2lzQ2xhc3MoKQorICovCitwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgeworCXJldHVybiBnZXRNYXNrKE1BU0tfVFlQRV9JU19DTEFTUyk7Cit9CisvKioKKyAqIEBzZWUgRE9NTm9kZQorICovCitwcm90ZWN0ZWQgRE9NTm9kZSBuZXdET01Ob2RlKCkgeworCXJldHVybiBuZXcgRE9NVHlwZSgpOworfQorLyoqCisgKiBOb3JtYWxpemVzIHRoaXMgPGNvZGU+RE9NTm9kZTwvY29kZT4ncyBzb3VyY2UgcG9zaXRpb25zIHRvIGluY2x1ZGUgd2hpdGVzcGFjZSBwcmVjZWVkaW5nCisgKiB0aGUgbm9kZSBvbiB0aGUgbGluZSBvbiB3aGljaCB0aGUgbm9kZSBzdGFydHMsIGFuZCBhbGwgd2hpdGVzcGFjZSBhZnRlciB0aGUgbm9kZSB1cCB0bworICogdGhlIG5leHQgbm9kZSdzIHN0YXJ0CisgKi8KK3ZvaWQgbm9ybWFsaXplKElMaW5lU3RhcnRGaW5kZXIgZmluZGVyKSB7CisJLy8gcGVyZm9ybSBmaW5hbCBjaGFuZ2VzIHRvIHRoZSBvcGVuIGFuZCBjbG9zZSBib2R5IHJhbmdlcworCWludCBvcGVuQm9keUVuZCwgb3BlbkJvZHlTdGFydCwgY2xvc2VCb2R5U3RhcnQsIGNsb3NlQm9keUVuZDsKKwlET01Ob2RlIGZpcnN0ID0gKERPTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsKKwlET01Ob2RlIGxhc3ROb2RlID0gbnVsbDsKKwkvLyBsb29rIGZvciB0aGUgb3BlbiBib2R5CisJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTsKKwlzY2FubmVyLnNldFNvdXJjZShmRG9jdW1lbnQpOworCXNjYW5uZXIucmVzZXRUbyhmTmFtZVJhbmdlWzFdICsgMSwgZkRvY3VtZW50Lmxlbmd0aCk7CisJCisJdHJ5IHsKKwkJaW50IGN1cnJlbnRUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCXdoaWxlKGN1cnJlbnRUb2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRSAmJgorCQkJCWN1cnJlbnRUb2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJfQorCQlpZihjdXJyZW50VG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0UpIHsJCQorCQkJb3BlbkJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJCQlvcGVuQm9keVN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQl9IGVsc2UgeworCQkJb3BlbkJvZHlFbmQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJb3BlbkJvZHlTdGFydCA9IGZEb2N1bWVudC5sZW5ndGg7CisJCX0KKwl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCW9wZW5Cb2R5RW5kID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJb3BlbkJvZHlTdGFydCA9IGZEb2N1bWVudC5sZW5ndGg7CisJfQorCWlmIChmaXJzdCAhPSBudWxsKSB7CisJCWludCBsaW5lU3RhcnQgPSBmaW5kZXIuZ2V0TGluZVN0YXJ0KGZpcnN0LmdldFN0YXJ0UG9zaXRpb24oKSk7CisJCWlmIChsaW5lU3RhcnQgPiBvcGVuQm9keUVuZCkgeworCQkJb3BlbkJvZHlFbmQgPSBsaW5lU3RhcnQgLSAxOworCQl9IGVsc2UgeworCQkJb3BlbkJvZHlFbmQgPSBmaXJzdC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxOworCQl9CQkKKwkJbGFzdE5vZGUgPSAoRE9NTm9kZSkgZmlyc3QuZ2V0TmV4dE5vZGUoKTsKKwkJaWYgKGxhc3ROb2RlID09IG51bGwpIHsKKwkJCWxhc3ROb2RlID0gZmlyc3Q7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAobGFzdE5vZGUuZ2V0TmV4dE5vZGUoKSAhPSBudWxsKSB7CisJCQkJbGFzdE5vZGUgPSAoRE9NTm9kZSkgbGFzdE5vZGUuZ2V0TmV4dE5vZGUoKTsKKwkJCX0KKwkJfQorCQlzY2FubmVyLnNldFNvdXJjZShmRG9jdW1lbnQpOworCQlzY2FubmVyLnJlc2V0VG8obGFzdE5vZGUuZ2V0RW5kUG9zaXRpb24oKSArIDEsIGZEb2N1bWVudC5sZW5ndGgpOworCQl0cnkgeworCQkJaW50IGN1cnJlbnRUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQl3aGlsZShjdXJyZW50VG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0UgJiYKKwkJCQkJY3VycmVudFRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSB7CisJCQkJY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCX0KKwkJCWlmKGN1cnJlbnRUb2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDRSkgewkJCisJCQkJY2xvc2VCb2R5U3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CisJCQkJY2xvc2VCb2R5RW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJfSBlbHNlIHsKKwkJCQljbG9zZUJvZHlTdGFydCA9IGZEb2N1bWVudC5sZW5ndGg7CisJCQkJY2xvc2VCb2R5RW5kID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJY2xvc2VCb2R5U3RhcnQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJY2xvc2VCb2R5RW5kID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJfQorCX0gZWxzZSB7CisJCXNjYW5uZXIucmVzZXRUbyhvcGVuQm9keUVuZCwgZkRvY3VtZW50Lmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCXdoaWxlKGN1cnJlbnRUb2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDRSAmJgorCQkJCQljdXJyZW50VG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpIHsKKwkJCQljdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJfQorCQkJaWYoY3VycmVudFRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNFKSB7CQkKKwkJCQljbG9zZUJvZHlTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKKwkJCQljbG9zZUJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJCQl9IGVsc2UgeworCQkJCWNsb3NlQm9keVN0YXJ0ID0gZkRvY3VtZW50Lmxlbmd0aDsKKwkJCQljbG9zZUJvZHlFbmQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQljbG9zZUJvZHlTdGFydCA9IGZEb2N1bWVudC5sZW5ndGg7CisJCQljbG9zZUJvZHlFbmQgPSBmRG9jdW1lbnQubGVuZ3RoOworCQl9CisJCW9wZW5Cb2R5RW5kID0gY2xvc2VCb2R5RW5kIC0gMTsKKwl9CisJc2V0T3BlbkJvZHlSYW5nZUVuZChvcGVuQm9keUVuZCk7CisJc2V0T3BlbkJvZHlSYW5nZVN0YXJ0KG9wZW5Cb2R5U3RhcnQpOworCXNldENsb3NlQm9keVJhbmdlU3RhcnQoY2xvc2VCb2R5U3RhcnQpOworCXNldENsb3NlQm9keVJhbmdlRW5kKGNsb3NlQm9keUVuZCk7CisJZkluc2VydGlvblBvc2l0aW9uID0gZmluZGVyLmdldExpbmVTdGFydChjbG9zZUJvZHlTdGFydCk7CisJaWYgKGxhc3ROb2RlICE9IG51bGwgJiYgZkluc2VydGlvblBvc2l0aW9uIDwgbGFzdE5vZGUuZ2V0RW5kUG9zaXRpb24oKSkgeworCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBnZXRDbG9zZUJvZHlQb3NpdGlvbigpOworCX0KKwlpZiAoZkluc2VydGlvblBvc2l0aW9uIDwgb3BlbkJvZHlFbmQpIHsKKwkJZkluc2VydGlvblBvc2l0aW9uID0gZ2V0Q2xvc2VCb2R5UG9zaXRpb24oKTsKKwl9CisJc3VwZXIubm9ybWFsaXplKGZpbmRlcik7Cit9CisKKy8qKgorICogTm9ybWFsaXplcyB0aGlzIDxjb2RlPkRPTU5vZGU8L2NvZGU+J3MgZW5kIHBvc2l0aW9uLgorICovCit2b2lkIG5vcm1hbGl6ZUVuZFBvc2l0aW9uKElMaW5lU3RhcnRGaW5kZXIgZmluZGVyLCBET01Ob2RlIG5leHQpIHsKKwlpZiAobmV4dCA9PSBudWxsKSB7CisJCS8vIHRoaXMgbm9kZSdzIGVuZCBwb3NpdGlvbiBpbmNsdWRlcyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgdXAKKwkJLy8gdG8gdGhlIGVuZCBvZiB0aGUgZW5jbG9zaW5nIG5vZGUKKwkJRE9NTm9kZSBwYXJlbnQgPSAoRE9NTm9kZSkgZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQgaW5zdGFuY2VvZiBET01Db21waWxhdGlvblVuaXQpIHsKKwkJCXNldFNvdXJjZVJhbmdlRW5kKGZEb2N1bWVudC5sZW5ndGggLSAxKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHBhcmVudCBpcyBhIHR5cGUKKwkJCXNldFNvdXJjZVJhbmdlRW5kKCgoRE9NVHlwZSlwYXJlbnQpLmdldENsb3NlQm9keVBvc2l0aW9uKCkgLSAxKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIHRoaXMgbm9kZSdzIGVuZCBwb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbm9kZQorCQluZXh0Lm5vcm1hbGl6ZVN0YXJ0UG9zaXRpb24oZ2V0RW5kUG9zaXRpb24oKSwgZmluZGVyKTsKKwkJc2V0U291cmNlUmFuZ2VFbmQobmV4dC5nZXRTdGFydFBvc2l0aW9uKCkgLSAxKTsKKwl9Cit9CisKKy8qKgorICogT2Zmc2V0cyBhbGwgdGhlIHNvdXJjZSBpbmRleGVzIGluIHRoaXMgbm9kZSBieSB0aGUgZ2l2ZW4gYW1vdW50LgorICovCitwcm90ZWN0ZWQgdm9pZCBvZmZzZXQoaW50IG9mZnNldCkgeworCXN1cGVyLm9mZnNldChvZmZzZXQpOworCW9mZnNldFJhbmdlKGZDbG9zZUJvZHlSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmRXh0ZW5kc1JhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKGZJbXBsZW1lbnRzUmFuZ2UsIG9mZnNldCk7CisJb2Zmc2V0UmFuZ2UoZkludGVyZmFjZXNSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmT3BlbkJvZHlSYW5nZSwgb2Zmc2V0KTsKKwlvZmZzZXRSYW5nZShmU3VwZXJjbGFzc1JhbmdlLCBvZmZzZXQpOworCW9mZnNldFJhbmdlKGZUeXBlUmFuZ2UsIG9mZnNldCk7Cit9CisvKioKKyAqIEBzZWUgSURPTVR5cGUjc2V0Q2xhc3MoYm9vbGVhbikKKyAqLworcHVibGljIHZvaWQgc2V0Q2xhc3MoYm9vbGVhbiBiKSB7CisJYmVjb21lRGV0YWlsZWQoKTsKKwlmcmFnbWVudCgpOworCXNldE1hc2soTUFTS19UWVBFX0lTX0NMQVNTLCBiKTsKKwlpZiAoYikgeworCQlmVHlwZUtleXdvcmQ9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlmVHlwZUtleXdvcmQ9ICJpbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCisJCXNldFN1cGVyY2xhc3MobnVsbCk7CisJfQorfQorLyoqCisgKiBTZXRzIHRoZSBlbmQgb2YgdGhlIGNsb3NlIGJvZHkgcmFuZ2UgCisgKi8KK3ZvaWQgc2V0Q2xvc2VCb2R5UmFuZ2VFbmQoaW50IGVuZCkgeworCWZDbG9zZUJvZHlSYW5nZVsxXSA9IGVuZDsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhcnQgb2YgdGhlIGNsb3NlIGJvZHkgcmFuZ2UgCisgKi8KK3ZvaWQgc2V0Q2xvc2VCb2R5UmFuZ2VTdGFydChpbnQgc3RhcnQpIHsKKwlmQ2xvc2VCb2R5UmFuZ2VbMF0gPSBzdGFydDsKK30KKy8qKgorICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUuCisgKgorICogPHA+V2hlbiB0aGUgbmFtZSBvZiBhIHR5cGUgaXMgc2V0LCBhbGwgb2YgaXRzIGNvbnN0cnVjdG9ycyBtdXN0IGJlIG1hcmtlZAorICogYXMgZnJhZ21lbnRlZCwgc2luY2UgdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3RvcnMgbXVzdCByZWZsZWN0IHRoZSBuYW1lCisgKiBvZiB0aGlzIHR5cGUuCisgKgorICogQHNlZSBJRE9NTm9kZSNzZXROYW1lKGNoYXJbXSkKKyAqLworcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5udWxsTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlzdXBlci5zZXROYW1lKG5hbWUpOworCUVudW1lcmF0aW9uIGNoaWxkcmVuPSBnZXRDaGlsZHJlbigpOworCXdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCQlJRE9NTm9kZSBjaGlsZD0gKElET01Ob2RlKWNoaWxkcmVuLm5leHRFbGVtZW50KCk7CisJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLk1FVEhPRCAmJiAoKElET01NZXRob2QpY2hpbGQpLmlzQ29uc3RydWN0b3IoKSkgeworCQkJKChET01Ob2RlKWNoaWxkKS5mcmFnbWVudCgpOworCQl9CisJfQorfQorLyoqCisgKiBTZXRzIHRoZSBlbmQgb2YgdGhlIG9wZW4gYm9keSByYW5nZSAKKyAqLwordm9pZCBzZXRPcGVuQm9keVJhbmdlRW5kKGludCBlbmQpIHsKKwlmT3BlbkJvZHlSYW5nZVsxXSA9IGVuZDsKK30KKy8qKgorICogU2V0cyB0aGUgc3RhcnQgb2YgdGhlIG9wZW4gYm9keSByYW5nZSAKKyAqLwordm9pZCBzZXRPcGVuQm9keVJhbmdlU3RhcnQoaW50IHN0YXJ0KSB7CisJZk9wZW5Cb2R5UmFuZ2VbMF0gPSBzdGFydDsKK30KKy8qKgorICogQHNlZSBJRE9NVHlwZSNzZXRTdXBlcmNsYXNzKGNoYXJbXSkKKyAqLworcHVibGljIHZvaWQgc2V0U3VwZXJjbGFzcyhTdHJpbmcgc3VwZXJjbGFzc05hbWUpIHsKKwliZWNvbWVEZXRhaWxlZCgpOworCWZyYWdtZW50KCk7CisJZlN1cGVyY2xhc3M9IHN1cGVyY2xhc3NOYW1lOworCXNldE1hc2soTUFTS19UWVBFX0hBU19TVVBFUkNMQVNTLCBzdXBlcmNsYXNzTmFtZSAhPSBudWxsKTsKK30KKy8qKgorICogQHNlZSBJRE9NVHlwZSNzZXRTdXBlckludGVyZmFjZXMoU3RyaW5nW10pCisgKi8KK3B1YmxpYyB2b2lkIHNldFN1cGVySW50ZXJmYWNlcyhTdHJpbmdbXSBuYW1lcykgeworCWJlY29tZURldGFpbGVkKCk7CisJaWYgKG5hbWVzID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImRvbS5udWxsSW50ZXJmYWNlcyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlmcmFnbWVudCgpOworCWZTdXBlckludGVyZmFjZXM9IG5hbWVzOworCWlmIChuYW1lcyA9PSBudWxsIHx8IG5hbWVzLmxlbmd0aCA9PSAwKSB7CisJCWZJbnRlcmZhY2VzPSBudWxsOworCQlmU3VwZXJJbnRlcmZhY2VzPSBudWxsOworCQlzZXRNYXNrKE1BU0tfVFlQRV9IQVNfSU5URVJGQUNFUywgZmFsc2UpOworCX0gZWxzZSB7CisJCXNldE1hc2soTUFTS19UWVBFX0hBU19JTlRFUkZBQ0VTLCB0cnVlKTsKKwkJQ2hhckFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJYnVmZmVyLmFwcGVuZChuYW1lc1tpXSk7CisJCX0KKwkJZkludGVyZmFjZXMgPSBidWZmZXIuZ2V0Q29udGVudHMoKTsKKwl9Cit9CisvKioKKyAqIFNldHMgdGhlIHR5cGUga2V5d29yZAorICovCit2b2lkIHNldFR5cGVLZXl3b3JkKFN0cmluZyBrZXl3b3JkKSB7CisJZlR5cGVLZXl3b3JkID0ga2V5d29yZDsKK30KKy8qKgorICogQHNlZSBET01Ob2RlI3NoYXJlQ29udGVudHMoRE9NTm9kZSkKKyAqLworcHJvdGVjdGVkIHZvaWQgc2hhcmVDb250ZW50cyhET01Ob2RlIG5vZGUpIHsKKwlzdXBlci5zaGFyZUNvbnRlbnRzKG5vZGUpOworCURPTVR5cGUgdHlwZT0gKERPTVR5cGUpbm9kZTsKKwlmQ2xvc2VCb2R5UmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZDbG9zZUJvZHlSYW5nZSk7CisJZkV4dGVuZHNSYW5nZT0gdHlwZS5mRXh0ZW5kc1JhbmdlOworCWZJbXBsZW1lbnRzUmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZJbXBsZW1lbnRzUmFuZ2UpOworCWZJbnRlcmZhY2VzPSB0eXBlLmZJbnRlcmZhY2VzOworCWZJbnRlcmZhY2VzUmFuZ2U9IHJhbmdlQ29weSh0eXBlLmZJbnRlcmZhY2VzUmFuZ2UpOworCWZPcGVuQm9keVJhbmdlPSByYW5nZUNvcHkodHlwZS5mT3BlbkJvZHlSYW5nZSk7CisJZlN1cGVyY2xhc3M9IHR5cGUuZlN1cGVyY2xhc3M7CisJZlN1cGVyY2xhc3NSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZlN1cGVyY2xhc3NSYW5nZSk7CisJZlN1cGVySW50ZXJmYWNlcz0gdHlwZS5mU3VwZXJJbnRlcmZhY2VzOworCWZUeXBlS2V5d29yZD0gdHlwZS5mVHlwZUtleXdvcmQ7CisJZlR5cGVSYW5nZT0gcmFuZ2VDb3B5KHR5cGUuZlR5cGVSYW5nZSk7Cit9CisvKioKKyAqIEBzZWUgSURPTU5vZGUjdG9TdHJpbmcoKQorICovCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiVFlQRTogIiArIGdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9JTGluZVN0YXJ0RmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0lMaW5lU3RhcnRGaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2IxZmFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9JTGluZVN0YXJ0RmluZGVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKKworLyoqCisgKiBUaGUgPGNvZT5JTGluZVNlcGFyYXRvckZpbmRlcjwvY29kZT4gZmluZHMgcHJldmlvdXMgYW5kIG5leHQgbGluZSBzZXBhcmF0b3JzCisgKiBpbiBzb3VyY2UuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUxpbmVTdGFydEZpbmRlciB7CisvKioKKyAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZSBhdCBvciBiZWZvcmUgdGhlIGdpdmVuIHNvdXJjZSBwb3NpdGlvbi4KKyAqCisgKiA8cD5UaGlzIGRlZmF1bHRzIHRvIHplcm8gaWYgdGhlIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIGEgcG9zaXRpb24gb24gdGhlIGZpcnN0IGxpbmUKKyAqIG9mIHRoZSBzb3VyY2UuCisgKi8KK3B1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBwb3NpdGlvbik7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL1NpYmxpbmdFbnVtZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThmOWVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKKworLyoqCisgKiBTaWJsaW5nRW51bWVyYXRpb24gcHJvdmlkZXMgYW4gZW51bWVyYXRpb24gb24gYSBsaW5rZWQgbGlzdAorICogb2Ygc2libGluZyBET00gbm9kZXMuCisgKgorICogQHNlZSBqYXZhLnV0aWwuRW51bWVyYXRpb24KKyAqLworCisvKiBwYWNrYWdlICovIGNsYXNzIFNpYmxpbmdFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworCS8qKgorCSAqIFRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBsaW5rZWQgbGlzdAorCSAqIG9mIERPTSBub2Rlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgSURPTU5vZGUgZkN1cnJlbnRFbGVtZW50OworLyoqCisgKiBDcmVhdGVzIGFuIGVudW1lcmF0aW9uIG9mIHNpbGJpbmdzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBub2RlLgorICogSWYgdGhlIGdpdmVuIG5vZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIGVudW1lcmF0aW9uIGlzIGVtcHR5LgorICovCitTaWJsaW5nRW51bWVyYXRpb24oSURPTU5vZGUgY2hpbGQpIHsKKwlmQ3VycmVudEVsZW1lbnQ9IGNoaWxkOworfQorLyoqCisgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbiNoYXNNb3JlRWxlbWVudHMoKQorICovCitwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisJcmV0dXJuIGZDdXJyZW50RWxlbWVudCAhPSBudWxsOworfQorLyoqCisgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbiNuZXh0RWxlbWVudCgpCisgKi8KK3B1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisJSURPTU5vZGUgY3Vycj0gIGZDdXJyZW50RWxlbWVudDsKKwlpZiAoY3VyciAhPSBudWxsKSB7CisJCWZDdXJyZW50RWxlbWVudD0gZkN1cnJlbnRFbGVtZW50LmdldE5leHROb2RlKCk7CisJfQorCXJldHVybiBjdXJyOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL1NpbXBsZURPTUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU4MDIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5T3BzOworCisvKioKKyAqIEEgRE9NIGJ1aWxkZXIgdGhhdCB1c2VzIHRoZSBTb3VyY2VFbGVtZW50UGFyc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVET01CdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RET01CdWlsZGVyIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgeworCitwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdIG5hbWUsIGJvb2xlYW4gb25EZW1hbmQpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZH07CisJU3RyaW5nIGltcG9ydE5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOworCS8qKiBuYW1lIGlzIHNldCB0byBjb250YWluIHRoZSAnKicgKi8KKwlpZiAob25EZW1hbmQpIHsKKwkJaW1wb3J0TmFtZSs9Ii4qIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlmTm9kZT0gbmV3IERPTUltcG9ydChmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBpbXBvcnROYW1lLCBvbkRlbWFuZCk7CisJYWRkQ2hpbGQoZk5vZGUpOwkKK30KK3B1YmxpYyB2b2lkIGFjY2VwdFBhY2thZ2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdIG5hbWUpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZT0gbmV3IGludFtdIHtkZWNsYXJhdGlvblN0YXJ0LCBkZWNsYXJhdGlvbkVuZH07CisJZk5vZGU9IG5ldyBET01QYWNrYWdlKGZEb2N1bWVudCwgc291cmNlUmFuZ2UsIENoYXJBcnJheU9wcy5jaGFyVG9TdHJpbmcobmFtZSkpOworCWFkZENoaWxkKGZOb2RlKTsJCit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQorICovCitwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZUNvZGUsIFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VDb2RlLnRvQ2hhckFycmF5KCksIG5hbWUudG9DaGFyQXJyYXkoKSk7Cit9CisvKioKKyAqIEBzZWUgSURPTUZhY3RvcnkjY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZywgU3RyaW5nKQorICovCitwdWJsaWMgSURPTUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKwlpbml0aWFsaXplQnVpbGQoY29tcGlsYXRpb25Vbml0LmdldENvbnRlbnRzKCksIHRydWUsIHRydWUpOworCWdldFBhcnNlcigpLnBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCwgZmFsc2UpOworCXJldHVybiBzdXBlci5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0KTsKK30KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBET01NZXRob2QgYW5kIGluaXppYWxpemVzLgorICoKKyAqIEBwYXJhbSBkZWNsYXJhdGlvblN0YXJ0IC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAorICoJCW9mIHRoaXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb24KKyAqIEBwYXJhbSBtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXJzIGZvciB0aGlzIGNvbnN0cnVjdG9yIGNvbnZlcnRlZCB0byBhIGZsYWcKKyAqIEBwYXJhbSByZXR1cm5UeXBlIC0gdGhlIG5hbWUgb2YgdGhlIHJldHVybiB0eXBlCisgKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoaXMgY29uc3RydWN0b3IKKyAqIEBwYXJhbSBuYW1lU3RhcnQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUKKyAqIEBwYXJhbSBuYW1lRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlcyAtIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdHlwZSBuYW1lcworICogQHBhcmFtIHBhcmFtZXRlck5hbWVzIC0gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycworICogQHBhcmFtIGV4Y2VwdGlvblR5cGVzIC0gYSBsaXN0IG9mIHRoZSBleGNlcHRpb24gdHlwZXMKKyAqLworcHJvdGVjdGVkIHZvaWQgZW50ZXJBYnN0cmFjdE1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywKKwljaGFyW10gcmV0dXJuVHlwZSwgY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMsIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgeworCQkKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCAtMX07IC8vIHdpbGwgYmUgZml4ZWQgdXAgb24gZXhpdAorCWludFtdIG5hbWVSYW5nZSA9IHtuYW1lU3RhcnQsIG5hbWVFbmR9OworCWZOb2RlID0gbmV3IERPTU1ldGhvZChmRG9jdW1lbnQsIHNvdXJjZVJhbmdlLCBDaGFyQXJyYXlPcHMuY2hhclRvU3RyaW5nKG5hbWUpLCBuYW1lUmFuZ2UsIG1vZGlmaWVycywgCisJCWlzQ29uc3RydWN0b3IsIENoYXJBcnJheU9wcy5jaGFyVG9TdHJpbmcocmV0dXJuVHlwZSksCisJCUNoYXJBcnJheU9wcy5jaGFyY2hhclRvU3RyaW5nKHBhcmFtZXRlclR5cGVzKSwKKwkJQ2hhckFycmF5T3BzLmNoYXJjaGFyVG9TdHJpbmcocGFyYW1ldGVyTmFtZXMpLCAKKwkJQ2hhckFycmF5T3BzLmNoYXJjaGFyVG9TdHJpbmcoZXhjZXB0aW9uVHlwZXMpKTsKKwlhZGRDaGlsZChmTm9kZSk7CisJZlN0YWNrLnB1c2goZk5vZGUpOworfQorLyoqCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ2xhc3MoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCwgY2hhcltdIHN1cGVyY2xhc3MsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCWVudGVyVHlwZShkZWNsYXJhdGlvblN0YXJ0LCBtb2RpZmllcnMsIG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgc3VwZXJjbGFzcywKKwkJc3VwZXJpbnRlcmZhY2VzLCB0cnVlKTsKK30KKy8qKgorICovCitwdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKKwkvKiBzZWUgMUZWSUlRWiAqLworCVN0cmluZyBuYW1lU3RyaW5nID0gbmV3IFN0cmluZyhmRG9jdW1lbnQsIG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCk7CisJaW50IG9wZW5QYXJlblBvc2l0aW9uID0gbmFtZVN0cmluZy5pbmRleE9mKCcoJyk7CisJaWYgKG9wZW5QYXJlblBvc2l0aW9uID4gLTEpCisJCW5hbWVFbmQgPSBuYW1lU3RhcnQgKyBvcGVuUGFyZW5Qb3NpdGlvbiAtIDE7CisKKwllbnRlckFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgCisJCW51bGwsIG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgcGFyYW1ldGVyVHlwZXMsCisJCXBhcmFtZXRlck5hbWVzLCBleGNlcHRpb25UeXBlcyx0cnVlKTsKK30KKy8qKgorICovCitwdWJsaWMgdm9pZCBlbnRlckZpZWxkKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gdHlwZSwgY2hhcltdIG5hbWUsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kKSB7CisKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblN0YXJ0LCAtMX07CisJaW50W10gbmFtZVJhbmdlID0ge25hbWVTdGFydCwgbmFtZUVuZH07CisJYm9vbGVhbiBpc1NlY29uZGFyeT0gZmFsc2U7CisJaWYgKGZOb2RlIGluc3RhbmNlb2YgRE9NRmllbGQpIHsKKwkJaXNTZWNvbmRhcnkgPSBkZWNsYXJhdGlvblN0YXJ0ID09IGZOb2RlLmZTb3VyY2VSYW5nZVswXTsKKwl9CisJZk5vZGUgPSBuZXcgRE9NRmllbGQoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgQ2hhckFycmF5T3BzLmNoYXJUb1N0cmluZyhuYW1lKSwgbmFtZVJhbmdlLCAKKwkJbW9kaWZpZXJzLCBDaGFyQXJyYXlPcHMuY2hhclRvU3RyaW5nKHR5cGUpLCBpc1NlY29uZGFyeSk7CisJYWRkQ2hpbGQoZk5vZGUpOworCWZTdGFjay5wdXNoKGZOb2RlKTsKK30KKy8qKgorCisgKi8KK3B1YmxpYyB2b2lkIGVudGVySW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIGludCBtb2RpZmllcnMpIHsKKwlpbnRbXSBzb3VyY2VSYW5nZSA9IHtkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAtMX07CisJZk5vZGUgPSBuZXcgRE9NSW5pdGlhbGl6ZXIoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbW9kaWZpZXJzKTsKKwlhZGRDaGlsZChmTm9kZSk7CisJZlN0YWNrLnB1c2goZk5vZGUpOworfQorLyoqCisgKi8KK3B1YmxpYyB2b2lkIGVudGVySW50ZXJmYWNlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCWVudGVyVHlwZShkZWNsYXJhdGlvblN0YXJ0LCBtb2RpZmllcnMsIG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgbnVsbCwKKwkJc3VwZXJpbnRlcmZhY2VzLCBmYWxzZSk7Cit9CisvKioKKyAqLworcHVibGljIHZvaWQgZW50ZXJNZXRob2QoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSByZXR1cm5UeXBlLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKKwllbnRlckFic3RyYWN0TWV0aG9kKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgCisJCXJldHVyblR5cGUsIG5hbWUsIG5hbWVTdGFydCwgbmFtZUVuZCwgcGFyYW1ldGVyVHlwZXMsCisJCXBhcmFtZXRlck5hbWVzLCBleGNlcHRpb25UeXBlcyxmYWxzZSk7Cit9CisvKioKKyAqLworcHJvdGVjdGVkIHZvaWQgZW50ZXJUeXBlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgCisJaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQsIGNoYXJbXSBzdXBlcmNsYXNzLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMsIGJvb2xlYW4gaXNDbGFzcykgeworCWlmIChmQnVpbGRpbmdUeXBlKSB7CisJCWludFtdIHNvdXJjZVJhbmdlID0ge2RlY2xhcmF0aW9uU3RhcnQsIC0xfTsgLy8gd2lsbCBiZSBmaXhlZCBpbiB0aGUgZXhpdAorCQlpbnRbXSBuYW1lUmFuZ2UgPSBuZXcgaW50W10ge25hbWVTdGFydCwgbmFtZUVuZH07CisJCWZOb2RlID0gbmV3IERPTVR5cGUoZkRvY3VtZW50LCBzb3VyY2VSYW5nZSwgbmV3IFN0cmluZyhuYW1lKSwgbmFtZVJhbmdlLAorCQkJbW9kaWZpZXJzLCBDaGFyQXJyYXlPcHMuY2hhcmNoYXJUb1N0cmluZyhzdXBlcmludGVyZmFjZXMpLCBpc0NsYXNzKTsKKwkJYWRkQ2hpbGQoZk5vZGUpOworCQlmU3RhY2sucHVzaChmTm9kZSk7CisJfQorfQorLyoqCisgKiBGaW5pc2hlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2xhc3MgRE9NIG9iamVjdCB3aGljaAorICogd2FzIGNyZWF0ZWQgYnkgYSBwcmV2aW91cyBlbnRlckNsYXNzIGNhbGwuCisgKgorICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0Q2xhc3MoaW50KQorICovCitwdWJsaWMgdm9pZCBleGl0Q2xhc3MoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdFR5cGUoZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKiBGaW5pc2hlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbWV0aG9kIERPTSBvYmplY3Qgd2hpY2gKKyAqIHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgZW50ZXJDb25zdHJ1Y3RvciBjYWxsLgorICoKKyAqIEBzZWUgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbnN0cnVjdG9yKGludCkKKyAqLworcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgeworCWV4aXRNZW1iZXIoZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKK30KKy8qKgorICovCitwdWJsaWMgdm9pZCBleGl0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqLworcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0VHlwZShkZWNsYXJhdGlvbkVuZCk7Cit9CisvKioKKyAqIEZpbmlzaGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBtZW1iZXIuCisgKgorICogQHBhcmFtIGRlY2xhcmF0aW9uRW5kIC0gYSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtZXRob2QKKyAqCQlkZWNsYXJhdGlvbi4gIFRoaXMgY2FuIGluY2x1ZGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgZm9sbG93aW5nIHRoZSBjbG9zaW5nIGJyYWNrZXQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGV4aXRNZW1iZXIoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJRE9NTWVtYmVyIG09IChET01NZW1iZXIpIGZTdGFjay5wb3AoKTsKKwltLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwlmTm9kZSA9IG07Cit9CisvKioKKyAqLworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKK30KKy8qKgorICogQHNlZSBBYnN0cmFjdERPTUJ1aWxkZXIjZXhpdFR5cGUKKyAqCisgKiBAcGFyYW0gZGVjbGFyYXRpb25FbmQgLSBhIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGNsYXNzCisgKgkJZGVjbGFyYXRpb24uICBUaGlzIGNhbiBpbmNsdWRlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGZvbGxvd2luZyB0aGUgY2xvc2luZyBicmFja2V0LgorICovCitwcm90ZWN0ZWQgdm9pZCBleGl0VHlwZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlleGl0VHlwZShkZWNsYXJhdGlvbkVuZCwgZGVjbGFyYXRpb25FbmQpOworfQorLyoqCisgKiBDcmVhdGVzIGEgbmV3IHBhcnNlci4KKyAqLworcHJvdGVjdGVkIFNvdXJjZUVsZW1lbnRQYXJzZXIgZ2V0UGFyc2VyKCkgeworCXJldHVybiBuZXcgU291cmNlRWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI1NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIyOSBAQAorIyMjIEphdmFNb2RlbCBtZXNzYWdlcy4KKworIyMjIGFzc2VydGlvbgorYXNzZXJ0Lm51bGxBcmd1bWVudCA9IG51bGwgYXJndW1lbnQ7IHswfQorYXNzZXJ0LmZhaWxlZCA9IEFzc2VydGlvbiBmYWlsZWQ7IHswfS4KK2Fzc2VydC5zaG91bGROb3RJbXBsZW1lbnQgPSBTaG91bGQgbm90IGJlIGNhbGxlZAorCisjIyMgaGllcmFyY2h5CitoaWVyYXJjaHkubnVsbFByb2plY3QgPSBQcm9qZWN0IGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsLgoraGllcmFyY2h5Lm51bGxSZWdpb24gPSBSZWdpb24gY2Fubm90IGJlIG51bGwuCitoaWVyYXJjaHkubnVsbEZvY3VzVHlwZSA9IFR5cGUgZm9jdXMgY2Fubm90IGJlIG51bGwuCitoaWVyYXJjaHkuY3JlYXRpbmcgPSBDcmVhdGluZyB0eXBlIGhpZXJhcmNoeS4uLgorCisjIyMgamF2YSBlbGVtZW50CitlbGVtZW50LmRvZXNOb3RFeGlzdCA9IHswfSBkb2VzIG5vdCBleGlzdC4KK2VsZW1lbnQuaW52YWxpZENsYXNzRmlsZU5hbWUgPSBDbGFzcyBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCAuY2xhc3MuCitlbGVtZW50LmNhbm5vdFJlY29uY2lsZSA9IE11c3QgY3JlYXRlIHJlY29uY2lsZXIgb24gYSB3b3JraW5nIGNvcHkuCitlbGVtZW50LnJlY29uY2lsaW5nID0gUmVjb25jaWxpbmcuLi4KK2VsZW1lbnQuYXR0YWNoaW5nU291cmNlID0gQXR0YWNoaW5nIHNvdXJjZS4uLgorZWxlbWVudC5pbnZhbGlkVHlwZSA9IFR5cGUgaXMgbm90IG9uZSBvZiB0aGUgZGVmaW5lZCBjb25zdGFudHMuCitlbGVtZW50LmNsYXNzcGF0aEN5Y2xlID0gQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2plY3QnJ3MgY2xhc3NwYXRoLgorZWxlbWVudC5vbmx5T25lSmF2YU1vZGVsID0gQ2Fubm90IGluc3RhbnRpYXRlIG1vcmUgdGhhbiBvbmUgSmF2YSBNb2RlbC4KK2VsZW1lbnQucHJvamVjdERvZXNOb3RFeGlzdCA9IFByb2plY3QgezB9IG5vdCBwcmVzZW50CitlbGVtZW50LmNhbm5vdExvY2F0ZSA9IEZhaWxlZCB0byBsb2NhdGUgezB9IGluIHsxfQorZWxlbWVudC5pbnZhbGlkUmVzb3VyY2VGb3JQcm9qZWN0ID0gSWxsZWdhbCBhcmd1bWVudCAtIG11c3QgYmUgb25lIG9mIElQcm9qZWN0LCBJRm9sZGVyLCBvciBJRmlsZQorZWxlbWVudC5udWxsTmFtZSA9IE5hbWUgY2Fubm90IGJlIG51bGwuCitlbGVtZW50Lm51bGxUeXBlID0gVHlwZSBjYW5ub3QgYmUgbnVsbC4KK2VsZW1lbnQuaWxsZWdhbFBhcmVudCA9IElsbGVnYWwgcGFyZW50IGFyZ3VtZW50LgorZWxlbWVudC5ub3RQcmVzZW50ID0gTm90IHByZXNlbnQKKworIyMjIGphdmEgbW9kZWwgb3BlcmF0aW9ucworb3BlcmF0aW9uLm5lZWRFbGVtZW50cyA9IE9wZXJhdGlvbiByZXF1aXJlcyBvbmUgb3IgbW9yZSBlbGVtZW50cy4KK29wZXJhdGlvbi5uZWVkTmFtZSA9IE9wZXJhdGlvbiByZXF1aXJlcyBhIG5hbWUuCitvcGVyYXRpb24ubmVlZFBhdGggPSBPcGVyYXRpb24gcmVxdWlyZXMgYSBwYXRoLgorb3BlcmF0aW9uLm5lZWRBYnNvbHV0ZVBhdGggPSBPcGVyYXRpb24gcmVxdWlyZXMgYW4gYWJzb2x1dGUgcGF0aC4gUmVsYXRpdmUgcGF0aCBzcGVjaWZpZWQgd2FzOiB7MH0KK29wZXJhdGlvbi5uZWVkU3RyaW5nID0gT3BlcmF0aW9uIHJlcXVpcmVzIGEgU3RyaW5nLgorb3BlcmF0aW9uLm5vdFN1cHBvcnRlZCA9IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciBzcGVjaWZpZWQgZWxlbWVudCB0eXBlKHMpOgorb3BlcmF0aW9uLmNhbmNlbGxlZCA9IE9wZXJhdGlvbiBjYW5jZWxsZWQuCitvcGVyYXRpb24ubnVsbENvbnRhaW5lciA9IENvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4KK29wZXJhdGlvbi5udWxsTmFtZSA9IE5hbWUgY2Fubm90IGJlIG51bGwuCitvcGVyYXRpb24uY29weUVsZW1lbnRQcm9ncmVzcyA9IENvcHlpbmcgZWxlbWVudHMuLi4KK29wZXJhdGlvbi5tb3ZlRWxlbWVudFByb2dyZXNzID0gTW92aW5nIGVsZW1lbnRzLi4uCitvcGVyYXRpb24ucmVuYW1lRWxlbWVudFByb2dyZXNzID0gUmVuYW1pbmcgZWxlbWVudHMuLi4KK29wZXJhdGlvbi5jb3B5UmVzb3VyY2VQcm9ncmVzcyA9IENvcHlpbmcgcmVzb3VyY2VzLi4uCitvcGVyYXRpb24ubW92ZVJlc291cmNlUHJvZ3Jlc3MgPSBNb3ZpbmcgcmVzb3VyY2VzLi4uCitvcGVyYXRpb24ucmVuYW1lUmVzb3VyY2VQcm9ncmVzcyA9IFJlbmFtaW5nIHJlc291cmNlcy4uLgorb3BlcmF0aW9uLmNyZWF0ZVVuaXRQcm9ncmVzcyA9IENyZWF0aW5nIGEgY29tcGlsYXRpb24gdW5pdC4uLgorb3BlcmF0aW9uLmNyZWF0ZUZpZWxkUHJvZ3Jlc3MgPSBDcmVhdGluZyBhIGZpZWxkLi4uCitvcGVyYXRpb24uY3JlYXRlSW1wb3J0c1Byb2dyZXNzID0gQ3JlYXRpbmcgaW1wb3J0cy4uLgorb3BlcmF0aW9uLmNyZWF0ZUluaXRpYWxpemVyUHJvZ3Jlc3MgPSBDcmVhdGluZyBhbiBpbml0aWFsaXplci4uLgorb3BlcmF0aW9uLmNyZWF0ZU1ldGhvZFByb2dyZXNzID0gQ3JlYXRpbmcgYSBtZXRob2QuLi4KK29wZXJhdGlvbi5jcmVhdGVQYWNrYWdlUHJvZ3Jlc3MgPSBDcmVhdGluZyBhIHBhY2thZ2UgZGVjbGFyYXRpb24uLi4KK29wZXJhdGlvbi5jcmVhdGVQYWNrYWdlRnJhZ21lbnRQcm9ncmVzcyA9IENyZWF0aW5nIHBhY2thZ2UgZnJhZ21lbnQocykuLi4KK29wZXJhdGlvbi5jcmVhdGVUeXBlUHJvZ3Jlc3MgPSBDcmVhdGluZyBhIHR5cGUuLi4KK29wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MgPSBEZWxldGluZyBlbGVtZW50cy4uLgorb3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlUHJvZ3Jlc3MgPSBEZWxldGluZyByZXNvdXJjZXMuLi4KK29wZXJhdGlvbi5jYW5ub3RSZW5hbWVEZWZhdWx0UGFja2FnZSA9IERlZmF1bHQgcGFja2FnZSBjYW5ub3QgYmUgcmVuYW1lZC4KK29wZXJhdGlvbi5wYXRoT3V0c2lkZVByb2plY3QgPSBQYXRoIHswfSBtdXN0IGRlbm90ZSBsb2NhdGlvbiBpbnNpZGUgcHJvamVjdCB7MX0KKworIyMjIHdvcmtpbmcgY29weQord29ya2luZ0NvcHkuY29tbWl0ID0gQ29tbWl0dGluZyB3b3JraW5nIGNvcHkuLi4KKworIyMjIGJ1aWxkCitidWlsZC5yZWFkU3RhdGVQcm9ncmVzcyA9IFJlYWRpbmcgc2F2ZWQgYnVpbHQgc3RhdGUgZm9yIHByb2plY3QgezB9LgorYnVpbGQuc2F2ZVN0YXRlUHJvZ3Jlc3MgPSBTYXZpbmcgYnVpbHQgc3RhdGUgZm9yIHByb2plY3QgezB9LgorYnVpbGQuc2F2ZVN0YXRlQ29tcGxldGUgPSBTYXZlZCBpbiB7MH0gbXMKK2J1aWxkLndyb25nRmlsZUZvcm1hdCA9IFdyb25nIGZpbGUgZm9ybWF0LgorYnVpbGQudW5oYW5kbGVkVmVyc2lvbkZvcm1hdCA9IFVuaGFuZGxlZCB2ZXJzaW9uIG9mIGZpbGUgZm9ybWF0LgorYnVpbGQuY2Fubm90UmVzdG9yZVN0YXRlID0gRmFpbGVkIHRvIHJlc3RvcmUgc3RhdGUKK2J1aWxkLmNhbm5vdFNhdmVTdGF0ZSA9IEVycm9yIHNhdmluZyBsYXN0IGJ1aWxkIHN0YXRlIGZvciBwcm9qZWN0IHswfS4KK2J1aWxkLmNhbm5vdFNhdmVTdGF0ZXMgPSBFcnJvciBzYXZpbmcgYnVpbGRlciBzdGF0ZXMKK2J1aWxkLmluaXRpYWxpemF0aW9uRXJyb3IgPSBCdWlsZGVyIGluaXRpYWxpemF0aW9uIGVycm9yLgorYnVpbGQuc2VyaWFsaXphdGlvbkVycm9yID0gQnVpbGRlciBzZXJpYWxpemF0aW9uIGVycm9yLgorYnVpbGQuYW5hbHl6aW5nUGFja2FnZXMgPSBBbmFseXppbmcgcGFja2FnZXMKK2J1aWxkLmFuYWx5emluZ1NvdXJjZXMgPSBBbmFseXppbmcgc291cmNlcworYnVpbGQuYW5hbHl6aW5nRGVsdGFzID0gQW5hbHl6aW5nIGRlbHRhcworYnVpbGQuYW5hbHl6aW5nID0gQW5hbHl6aW5nIHswfQorYnVpbGQucHJlcGFyaW5nQnVpbGQgPSBQcmVwYXJpbmcgZm9yIGJ1aWxkCitidWlsZC5jb21waWxpbmcgPSBDb21waWxpbmcgezB9CitidWlsZC5yZWFkaW5nRGVsdGEgPSBSZWFkaW5nIHJlc291cmNlIGNoYW5nZSBpbmZvcm1hdGlvbiBmb3IgezB9CitidWlsZC5jb21wbGV0ZWQgPSBKYXZhIGJ1aWxkIGNvbXBsZXRlZAorYnVpbGQuYnVpbGRlck5hbWUgPSBKYXZhIEJ1aWxkZXIKK2J1aWxkLmNvbXBpbGluZ0NvbnRlbnQgPSBDb21waWxpbmcgY29udGVudCBvZiB7MH0KK2J1aWxkLnNjcnViYmluZ091dHB1dCA9IFNjcnViYmluZyBvdXRwdXQgZm9sZGVyCitidWlsZC5kdXBsaWNhdGVUeXBlID0gVHlwZSB7MH0gYWxyZWFkeSBwcm92aWRlZCBieSB7MX0KK2J1aWxkLmVycm9yUGFyc2luZ0JpbmFyeSA9IEVycm9yIHBhcnNpbmcgY2xhc3MgZmlsZSBmb3IgezB9CitidWlsZC5wYWNrYWdlTWlzbWF0Y2ggPSBQYWNrYWdlIGRlY2xhcmF0aW9uIGRvZXMgbm90IG1hdGNoIGZvbGRlci4gRXhwZWN0ZWQgZm9sZGVyIGlzIHswfS4KK2J1aWxkLmVycm9yQnVpbGRpbmdUeXBlID0gVW5hYmxlIHRvIGJ1aWxkIHR5cGUgezB9LgorYnVpbGQubWlzc2luZ0ZpbGUgPSBNaXNzaW5nIGZpbGUgZm9yIHswfQorYnVpbGQuYmVnaW5CYXRjaCA9IEJlZ2luIGJhdGNoIGJ1aWxkCitidWlsZC5iZWdpbkluY3JlbWVudGFsID0gQmVnaW4gaW5jcmVtZW50YWwgYnVpbGQKK2J1aWxkLmRvbmUgPSBCdWlsZCBkb25lLgorYnVpbGQuZW5kQmF0Y2ggPSBFbmQgYmF0Y2ggYnVpbGQKK2J1aWxkLmVuZEluY3JlbWVudGFsID0gRW5kIGluY3JlbWVudGFsIGJ1aWxkCitidWlsZC5vbmVQcm9ibGVtRm91bmQgPSB7MH0gcHJvYmxlbSBmb3VuZAorYnVpbGQucHJvYmxlbXNGb3VuZCA9IHswfSBwcm9ibGVtcyBmb3VuZAorYnVpbGQub25lUHJvYmxlbUZpeGVkID0gezB9IHByb2JsZW0gZml4ZWQKK2J1aWxkLnByb2JsZW1zRml4ZWQgPSB7MH0gcHJvYmxlbXMgZml4ZWQKK2J1aWxkLnBhY2thZ2VOYW1lID0gcGFja2FnZSB7MH0KK2J1aWxkLmRlZmF1bHRQYWNrYWdlTmFtZSA9IGRlZmF1bHQgcGFja2FnZSBmb3IgezB9CitidWlsZC5ub1BhY2thZ2VQYXRoID0gQXR0ZW1wdCB0byBhY2Nlc3MgcGFja2FnZXMgZm9yIG5vbi1leGlzdGVudCBwYXRoOiB7MH0KK2J1aWxkLmFtYmlndW91c1BhY2thZ2UgPSBEaWRuJyd0IGdldCBleGFjdGx5IG9uZSBwYWNrYWdlIGZvciAgezB9CitidWlsZC5jb3B5aW5nUmVzb3VyY2VzID0gQ29weWluZyBhbGwgcmVzb3VyY2VzIG9uIHRoZSBjbGFzc3BhdGgKK2J1aWxkLnVwZGF0aW5nUmVzb3VyY2VzID0gVXBkYXRpbmcgcmVzb3VyY2VzIG9uIHRoZSBjbGFzc3BhdGgKKworIyMjIGJ1aWxkIGluY29uc2lzdGVuY2llcworYnVpbGQuZHVwbGljYXRlQ2xhc3NGaWxlID0gVGhlIHR5cGUgezB9IGlzIGFscmVhZHkgZGVmaW5lZAorYnVpbGQuZHVwbGljYXRlUmVzb3VyY2UgPSBUaGlzIHJlc291cmNlIGlzIGEgZHVwbGljYXRlIGFuZCB3YXMgbm90IGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlcgorYnVpbGQuaW5jb25zaXN0ZW50Q2xhc3NGaWxlID0gQSBjbGFzcyBmaWxlIHdhcyBub3Qgd3JpdHRlbi4gVGhlIHByb2plY3QgbWF5IGJlIGluY29uc2lzdGVudCwgaWYgc28gdHJ5IHJlZnJlc2hpbmcgdGhpcyBwcm9qZWN0IGFuZCByZWJ1aWxkaW5nIGl0CitidWlsZC5pbmNvbnNpc3RlbnRQcm9qZWN0ID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdC4gSXQgbWF5IGJlIGluY29uc2lzdGVudCwgaWYgc28gZW5zdXJlIG5vIG90aGVyIHRvb2wgaXMgYnJvd3NpbmcgdGhlIG91dHB1dCBkaXJlY3RvcnksIHRoZW4gdHJ5IHJlZnJlc2hpbmcgdGhpcyBwcm9qZWN0IGFuZCByZWJ1aWxkaW5nIGl0CitidWlsZC5pbmNvbXBsZXRlQ2xhc3NQYXRoID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBzaW5jZSBpdHMgY2xhc3NwYXRoIGlzIGluY29tcGxldGUuIENhbiBub3QgZmluZCB0aGUgY2xhc3MgZmlsZSBmb3IgezB9LiBGaXggdGhlIGNsYXNzcGF0aCB0aGVuIHRyeSByZWJ1aWxkaW5nIHRoaXMgcHJvamVjdAorYnVpbGQubWlzc2luZ1NvdXJjZUZpbGUgPSBUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IHNpbmNlIHRoZSBzb3VyY2UgZmlsZSB7MH0gY291bGQgbm90IGJlIHJlYWQuCitidWlsZC5wcmVyZXFQcm9qZWN0V2FzTm90QnVpbHQgPSBUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IHNpbmNlIGl0IGRlcGVuZHMgb24gezB9LCB3aGljaCBmYWlsZWQgdG8gYnVpbGQuCitidWlsZC5hYm9ydER1ZVRvQ2xhc3NwYXRoUHJvYmxlbXMgPSBUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IHNpbmNlIGl0IGlzIGludm9sdmVkIGluIGEgY3ljbGUgb3IgaGFzIGNsYXNzcGF0aCBwcm9ibGVtcy4KKworIyMjIHN0YXR1cworc3RhdHVzLmNvcmVFeGNlcHRpb24gPSBDb3JlIGV4Y2VwdGlvbi4KK3N0YXR1cy5JT0V4Y2VwdGlvbiA9IEkvTyBleGNlcHRpb24uCitzdGF0dXMudGFyZ2V0RXhjZXB0aW9uID0gVGFyZ2V0IGV4Y2VwdGlvbi4KK3N0YXR1cy5jYW5ub3RVc2VEZXZpY2VPblBhdGggPSBPcGVyYXRpb24gcmVxdWlyZXMgYSBwYXRoIHdpdGggbm8gZGV2aWNlLiBQYXRoIHNwZWNpZmllZCB3YXM6IHswfQorc3RhdHVzLkpET01FcnJvciA9IEpET00gZXJyb3IuCitzdGF0dXMuaW5kZXhPdXRPZkJvdW5kcyA9IEluZGV4IG91dCBvZiBib3VuZHMuCitzdGF0dXMuZXZhbHVhdGlvbkVycm9yID0gRXZhbHVhdGlvbiBlcnJvcjogezB9Lgorc3RhdHVzLmludmFsaWRDb250ZW50cyA9IEludmFsaWQgY29udGVudHMgc3BlY2lmaWVkLgorc3RhdHVzLmludmFsaWREZXN0aW5hdGlvbiA9IEludmFsaWQgZGVzdGluYXRpb246IHswfS4KK3N0YXR1cy5pbnZhbGlkTmFtZSA9IEludmFsaWQgbmFtZSBzcGVjaWZpZWQ6IHswfS4KK3N0YXR1cy5pbnZhbGlkUGFja2FnZSA9IEludmFsaWQgcGFja2FnZTogezB9Lgorc3RhdHVzLmludmFsaWRQYXRoID0gSW52YWxpZCBwYXRoOiB7MH0uCitzdGF0dXMuaW52YWxpZFByb2plY3QgPSBJbnZhbGlkIHByb2plY3Q6IHswfS4KK3N0YXR1cy5pbnZhbGlkUmVzb3VyY2UgPSBJbnZhbGlkIHJlc291cmNlOiB7MH0uCitzdGF0dXMuaW52YWxpZFJlc291cmNlVHlwZSA9IEludmFsaWQgcmVzb3VyY2UgdHlwZSBmb3IgezB9Lgorc3RhdHVzLmludmFsaWRTaWJsaW5nID0gSW52YWxpZCBzaWJsaW5nOiB7MH0uCitzdGF0dXMubmFtZUNvbGxpc2lvbiA9IE5hbWUgY29sbGlzaW9uLgorc3RhdHVzLmRlZmF1bHRQYWNrZVJlYWRPbmx5ID0gRGVmYXVsdCBwYWNrYWdlIGlzIHJlYWQtb25seS4KK3N0YXR1cy5yZWFkT25seSA9IHswfSBpcyByZWFkLW9ubHkuCitzdGF0dXMudXBkYXRlQ29uZmxpY3QgPSBVcGRhdGUgY29uZmxpY3QuCitzdGF0dXMubm9Mb2NhbENvbnRlbnRzID0gQ2Fubm90IGZpbmQgbG9jYWwgY29udGVudHMgZm9yIHJlc291cmNlOiB7MH0KKworIyMjIGNsYXNzcGF0aAorY2xhc3NwYXRoLmN5Y2xlID0gQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2plY3QnJ3MgY2xhc3NwYXRoLgorY2xhc3NwYXRoLmJ1aWxkUGF0aCA9IEJ1aWxkIHBhdGgKK2NsYXNzcGF0aC5jYW5ub3ROZXN0RW50cnlJbkVudHJ5ID0gQ2Fubm90IG5lc3QgZW50cnkgezB9IGluc2lkZSBlbnRyeSB7MX0uCitjbGFzc3BhdGguY2Fubm90TmVzdEVudHJ5SW5PdXRwdXQgPSBDYW5ub3QgbmVzdCBlbnRyeSB7MH0gaW5zaWRlIG91dHB1dCBsb2NhdGlvbiB7MX0uCitjbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluRW50cnkgPSBDYW5ub3QgbmVzdCBvdXRwdXQgbG9jYXRpb24gezB9IGluc2lkZSBlbnRyeSB7MX0uCitjbGFzc3BhdGguZHVwbGljYXRlRW50cnlQYXRoID0gQ2xhc3NwYXRoIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyeTogezB9CitjbGFzc3BhdGguY2Fubm90UmVmZXJUb0l0c2VsZiA9IFByb2plY3QgY2Fubm90IHJlZmVyZW5jZSBpdHNlbGY6IHswfQorY2xhc3NwYXRoLnVuYm91bmRDb250YWluZXJQYXRoID0gVW5ib3VuZCBjbGFzc3BhdGggY29udGFpbmVyIHBhdGg6IHswfS4KK2NsYXNzcGF0aC5pbGxlZ2FsQ29udGFpbmVyUGF0aCA9IElsbGVnYWwgY2xhc3NwYXRoIGNvbnRhaW5lciBwYXRoOiB7MH0sIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc2VnbWVudCAoY29udGFpbmVySUQraGludHMpLgorY2xhc3NwYXRoLnVuYm91bmRWYXJpYWJsZVBhdGggPSBVbmJvdW5kIGNsYXNzcGF0aCB2YXJpYWJsZSBwYXRoOiB7MH0uCitjbGFzc3BhdGguaWxsZWdhbFZhcmlhYmxlUGF0aCA9IElsbGVnYWwgY2xhc3NwYXRoIHZhcmlhYmxlIHBhdGg6IHswfSwgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50LgorY2xhc3NwYXRoLm51bGxWYXJpYWJsZVBhdGggPSBWYXJpYWJsZSBwYXRoIGNhbm5vdCBiZSBudWxsLgorY2xhc3NwYXRoLm1pc21hdGNoTmFtZVBhdGggPSBWYXJpYWJsZSBuYW1lcyBhbmQgcGF0aHMgY29sbGVjdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2l6ZS4KK2NsYXNzcGF0aC5taXNtYXRjaFByb2plY3RzQ29udGFpbmVycyA9IFByb2plY3RzIGFuZCBjb250YWluZXJzIGNvbGxlY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpemUuCitjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQgPSBJbnZhbGlkIHNvdXJjZSBhdHRhY2htZW50OiB7MH0gZm9yIHJlcXVpcmVkIGxpYnJhcnkgezF9LgorY2xhc3NwYXRoLnVuYm91bmRMaWJyYXJ5ID0gTWlzc2luZyByZXF1aXJlZCBsaWJyYXJ5OiB7MH0uCitjbGFzc3BhdGguaWxsZWdhbExpYnJhcnlQYXRoID0gSWxsZWdhbCBwYXRoIGZvciByZXF1aXJlZCBsaWJyYXJ5OiB7MH0uCitjbGFzc3BhdGgudW5ib3VuZFByb2plY3QgPSBNaXNzaW5nIHJlcXVpcmVkIEphdmEgcHJvamVjdDogezB9LgorY2xhc3NwYXRoLmNsb3NlZFByb2plY3QgPSBSZXF1aXJlZCBwcm9qZWN0OiB7MH0gbmVlZHMgdG8gYmUgb3Blbi4KK2NsYXNzcGF0aC5pbGxlZ2FsUHJvamVjdFBhdGggPSBJbGxlZ2FsIHBhdGggZm9yIHJlcXVpcmVkIHByb2plY3Q6IHswfS4KK2NsYXNzcGF0aC51bmJvdW5kU291cmNlRm9sZGVyID0gTWlzc2luZyByZXF1aXJlZCBzb3VyY2UgZm9sZGVyOiB7MH0uCitjbGFzc3BhdGguaWxsZWdhbFNvdXJjZUZvbGRlclBhdGggPSBJbGxlZ2FsIHBhdGggZm9yIHJlcXVpcmVkIHNvdXJjZSBmb2xkZXI6IHswfS4KK2NsYXNzcGF0aC5zZXR0aW5nUHJvZ3Jlc3MgPSBTZXR0aW5nIGNsYXNzcGF0aCBmb3I6IHswfQorY2xhc3NwYXRoLnNldHRpbmdPdXRwdXRMb2NhdGlvblByb2dyZXNzID0gU2V0dGluZyBvdXRwdXQgbG9jYXRpb24gZm9yOiB7MH0KK2NsYXNzcGF0aC5uZWVkQWJzb2x1dGVQYXRoID0gUGF0aCBmb3IgSUNsYXNzcGF0aEVudHJ5IG11c3QgYmUgYWJzb2x1dGUuCitjbGFzc3BhdGguY2Fubm90UmVhZENsYXNzcGF0aEZpbGUgPSBVbmFibGUgdG8gcmVhZCB7MH0vLmNsYXNzcGF0aCBmaWxlLgorCisjIyMgbWlzY2VsbGFuZW91cworZmlsZS5ub3RGb3VuZCA9IEZpbGUgbm90IGZvdW5kLgorZmlsZS5iYWRGb3JtYXQgPSBCYWQgZm9ybWF0LgordmFyaWFibGUuYmFkRm9ybWF0ID0gQmFkIGZvcm1hdCBmb3IgdmFyaWFibGVzLgorb3B0aW9uLmJhZEZvcm1hdCA9IEJhZCBmb3JtYXQgZm9yIG9wdGlvbnMuCitwYXRoLm51bGxQYXRoID0gUGF0aCBjYW5ub3QgYmUgbnVsbC4KK3BhdGgubXVzdEJlQWJzb2x1dGUgPSBQYXRoIG11c3QgYmUgYWJzb2x1dGUuCitjYWNoZS5pbnZhbGlkTG9hZEZhY3RvciA9IEluY29ycmVjdCBsb2FkIGZhY3RvcgorCisjIyMgY29kZSBhc3Npc3QKK2NvZGVBc3Npc3QubnVsbFJlcXVlc3RvciA9IFJlcXVlc3RvciBjYW5ub3QgYmUgbnVsbC4KKworIyMjIGphdmEgY29udmVudGlvbnMKK2NvbnZlbnRpb24udW5pdC5udWxsTmFtZSA9IENvbXBpbGF0aW9uIHVuaXQgbmFtZSBtdXN0IG5vdCBiZSBudWxsLgorY29udmVudGlvbi51bml0Lm5vdEphdmFOYW1lID0gQ29tcGlsYXRpb24gdW5pdCBuYW1lIG11c3QgZW5kIHdpdGggLmphdmEuCitjb252ZW50aW9uLmNsYXNzRmlsZS5udWxsTmFtZSA9IC5jbGFzcyBmaWxlIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4KK2NvbnZlbnRpb24uY2xhc3NGaWxlLm5vdEphdmFOYW1lID0gLmNsYXNzIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC5jbGFzcy4KK2NvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIgPSB7MH0gaXMgbm90IGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgorY29udmVudGlvbi5pbXBvcnQubnVsbEltcG9ydCA9IEFuIGltcG9ydCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBiZSBudWxsLgorY29udmVudGlvbi5pbXBvcnQudW5xdWFsaWZpZWRJbXBvcnQgPSBBbiBpbXBvcnQgZGVjbGFyYXRpb24gbXVzdCBub3QgZW5kIHdpdGggYW4gdW5xdWFsaWZpZWQgKi4KK2NvbnZlbnRpb24udHlwZS5udWxsTmFtZSA9IEEgSmF2YSB0eXBlIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4KK2NvbnZlbnRpb24udHlwZS5uYW1lV2l0aEJsYW5rcyA9IEEgSmF2YSB0eXBlIG5hbWUgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBibGFuay4KK2NvbnZlbnRpb24udHlwZS5kb2xsYXJOYW1lID0gQnkgY29udmVudGlvbiwgSmF2YSB0eXBlIG5hbWVzIHVzdWFsbHkgZG9uJyd0IGNvbnRhaW4gdGhlICQgY2hhcmFjdGVyLgorY29udmVudGlvbi50eXBlLmxvd2VyY2FzZU5hbWUgPSBCeSBjb252ZW50aW9uLCBKYXZhIHR5cGUgbmFtZXMgdXN1YWxseSBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuCitjb252ZW50aW9uLnR5cGUuaW52YWxpZE5hbWUgPSBUaGUgdHlwZSBuYW1lIHswfSBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLgorY29udmVudGlvbi5wYWNrYWdlLm51bGxOYW1lID0gQSBwYWNrYWdlIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4KK2NvbnZlbnRpb24ucGFja2FnZS5lbXB0eU5hbWUgPSBBIHBhY2thZ2UgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eS4KK2NvbnZlbnRpb24ucGFja2FnZS5kb3ROYW1lID0gQSBwYWNrYWdlIG5hbWUgY2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgZG90LgorY29udmVudGlvbi5wYWNrYWdlLm5hbWVXaXRoQmxhbmtzID0gQSBwYWNrYWdlIG5hbWUgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBibGFuay4KK2NvbnZlbnRpb24ucGFja2FnZS5jb25zZWN1dGl2ZURvdHNOYW1lID0gQSBwYWNrYWdlIG5hbWUgbXVzdCBub3QgY29udGFpbiB0d28gY29uc2VjdXRpdmUgZG90cy4KK2NvbnZlbnRpb24ucGFja2FnZS51cHBlcmNhc2VOYW1lID0gQnkgY29udmVudGlvbiwgcGFja2FnZSBuYW1lcyB1c3VhbGx5IHN0YXJ0IHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLgorCisjIyMgRE9NCitkb20uY2Fubm90RGV0YWlsID0gVW5hYmxlIHRvIGdlbmVyYXRlIGRldGFpbGVkIHNvdXJjZSBpbmRleGVzLgorZG9tLm51bGxUeXBlUGFyYW1ldGVyID0gQ2Fubm90IGFkZCBwYXJhbWV0ZXIgd2l0aCBudWxsIHR5cGUKK2RvbS5udWxsTmFtZVBhcmFtZXRlciA9IENhbm5vdCBhZGQgcGFyYW1ldGVyIHdpdGggbnVsbCBuYW1lCitkb20ubnVsbFJldHVyblR5cGUgPSBSZXR1cm4gdHlwZSBjYW5ub3QgYmUgbnVsbAorZG9tLm51bGxFeGNlcHRpb25UeXBlID0gQ2Fubm90IGFkZCBudWxsIGV4Y2VwdGlvbgorZG9tLm1pc21hdGNoQXJnTmFtZXNBbmRUeXBlcyA9IFR5cGVzIGFuZCBuYW1lcyBtdXN0IGhhdmUgaWRlbnRpY2FsIGxlbmd0aAorZG9tLmFkZE51bGxDaGlsZCA9IEF0dGVtcHQgdG8gYWRkIG51bGwgY2hpbGQKK2RvbS5hZGRJbmNvbXBhdGlibGVDaGlsZCA9IEF0dGVtcHQgdG8gYWRkIGNoaWxkIG9mIGluY29tcGF0aWJsZSB0eXBlCitkb20uYWRkQ2hpbGRXaXRoUGFyZW50ID0gQXR0ZW1wdCB0byBhZGQgY2hpbGQgdGhhdCBpcyBhbHJlYWR5IHBhcmVudGVkCitkb20udW5hYmxlQWRkQ2hpbGQgPSBBdHRlbXB0IHRvIGFkZCBjaGlsZCB0byBub2RlIHRoYXQgY2Fubm90IGhhdmUgY2hpbGRyZW4KK2RvbS5hZGRBbmNlc3RvckFzQ2hpbGQgPSBBdHRlbXB0IHRvIGFkZCBhbmNlc3RvciBhcyBjaGlsZAorZG9tLmFkZE51bGxTaWJsaW5nID0gQXR0ZW1wdCB0byBpbnNlcnQgbnVsbCBzaWJsaW5nCitkb20uYWRkU2libGluZ0JlZm9yZVJvb3QgPSBBdHRlbXB0IHRvIGluc2VydCBzaWJsaW5nIGJlZm9yZSByb290IG5vZGUKK2RvbS5hZGRJbmNvbXBhdGlibGVTaWJsaW5nID0gQXR0ZW1wdCB0byBpbnNlcnQgc2libGluZyBvZiBpbmNvbXBhdGlibGUgdHlwZQorZG9tLmFkZFNpYmxpbmdXaXRoUGFyZW50ID0gQXR0ZW1wdCB0byBpbnNlcnQgc2libGluZyB0aGF0IGlzIGFscmVhZHkgcGFyZW50ZWQKK2RvbS5hZGRBbmNlc3RvckFzU2libGluZyA9IEF0dGVtcHQgdG8gaW5zZXJ0IGFuY2VzdG9yIGFzIHNpYmxpbmcKK2RvbS5hZGROdWxsSW50ZXJmYWNlID0gQ2Fubm90IGFkZCBudWxsIGludGVyZmFjZQorZG9tLm51bGxJbnRlcmZhY2VzID0gSWxsZWdhbCB0byBzZXQgc3VwZXIgaW50ZXJmYWNlcyB0byBudWxsCisKKyMjIyBldmFsCitldmFsLm5lZWRCdWlsdFN0YXRlID0gQ2Fubm90IGV2YWx1YXRlIGlmIHRoZSBwcm9qZWN0IGhhcyBub3QgYmVlbiBidWlsdCBvbmNlCisKKyMjIyBjb3JyZWN0aW9uCitjb3JyZWN0aW9uLm51bGxSZXF1ZXN0b3IgPSBSZXF1ZXN0b3IgY2Fubm90IGJlIG51bGwuCitjb3JyZWN0aW9uLm51bGxVbml0ID0gQ29tcGlsYXRpb24gdW5pdCBjYW5ub3QgYmUgbnVsbC4KKworIyMjIEpEVCBBZGFwdGVyCithbnQuamR0YWRhcHRlci5pbmZvLnVzaW5nSmR0Q29tcGlsZXIgPSBVc2luZyBKRFQgY29tcGlsZXIKK2FudC5qZHRhZGFwdGVyLmVycm9yLm1pc3NpbmdKRFRDb21waWxlciA9IENhbm5vdCBmaW5kIHRoZSBKRFQgY29tcGlsZXIKK2FudC5qZHRhZGFwdGVyLmVycm9yLm1pc3NpbmdKUkVMSUIgPSBDYW5ub3QgYmluZCB0aGUgSlJFX0xJQiB2YXJpYWJsZS4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB5b3UgY2FuIGVpdGhlciBzZXQgdGhlIEpSRV9MSUIgdmFyaWFibGUgb3IgdXNlIHRoZSBib290Y2xhc3NwYXRoIHBhcmFtZXRlciBpbiB5b3VyIGFudCBqYXZhYyB0YXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm9ueW1vdXNGaWxlU291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fub255bW91c0ZpbGVTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFiYTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm9ueW1vdXNGaWxlU291cmNlLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEFuIGFub255bW91cyBmaWxlIHNvdXJjZSBjcmVhdGVzIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisgKi8KK3B1YmxpYyBjbGFzcyBBbm9ueW1vdXNGaWxlU291cmNlIHsKKwlGaWxlIGZEaXJlY3Rvcnk7CisvKioKKyAqIENyZWF0ZXMgYW4gYW5vbnltb3VzIGZpbGUgc291cmNlIHdoaWNoIGNyZWF0ZXMgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAqLworcHVibGljIEFub255bW91c0ZpbGVTb3VyY2UoRmlsZSBkaXJlY3RvcnkpIHsKKwlpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgeworCQlkaXJlY3RvcnkubWtkaXJzKCk7CisJfSBlbHNlIGlmICghZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGlyZWN0b3J5IGFyZ3VtZW50cyBzaG91bGQgYmUgYSBkaXJlY3RvcnkuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJZkRpcmVjdG9yeSA9IGRpcmVjdG9yeTsJCit9CisvKioKKyAqIEFsbG9jYXRlcyBhbmQgcmV0dXJucyBhIFJhbmRvbUFjY2Vzc0ZpbGUgaW4gUi9XIG1vZGUgb24gYSBuZXcgYW5vbnltb3VzIGZpbGUuCisgKiBHdWFyYW50ZWVkIHRvIGJlIHVuYWxsb2NhdGVkLgorICovCitzeW5jaHJvbml6ZWQgcHVibGljIFJhbmRvbUFjY2Vzc0ZpbGUgYWxsb2NhdGVBbm9ueW1vdXNGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkKKwlGaWxlIGZpbGUgPSBnZXRBbm9ueW1vdXNGaWxlKCk7CisJcmV0dXJuIG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJydyIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFJldHVybnMgYSBVUkwgb24gYSBuZXdseSBhbGxvY2F0ZWQgZmlsZSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNvbnRlbnQuCisgKiBHdWFyYW50ZWVkIHRvIGJlIHVuYWxsb2NhdGVkLgorICovCitzeW5jaHJvbml6ZWQgcHVibGljIFVSTCBhbGxvY2F0ZUFub255bW91c1VSTChieXRlW10gYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJYnl0ZSBoYXNoYXJyYXlbXSA9IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIikuZGlnZXN0KGJ5dGVzKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaGFzaGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLmZvckRpZ2l0KChpbnQpKChoYXNoYXJyYXlbaV0gPj4gNCkgJiAweDBGKSwgMTYpKTsKKwkJCXNiLmFwcGVuZChDaGFyYWN0ZXIuZm9yRGlnaXQoKGludCkoaGFzaGFycmF5W2ldICYgMHgwRiksIDE2KSk7CisJCX0KKwkJc2IuYXBwZW5kKCIuam5rIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGZpbGVOYW1lID0gc2IudG9TdHJpbmcoKTsKKwkJRmlsZSBmaWxlID0gZmlsZUZvck5hbWUoZmlsZU5hbWUpOworCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKwkJCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXJhZi53cml0ZShieXRlcyk7CisJCQlyYWYuY2xvc2UoKTsKKwkJfQorCQlyZXR1cm4gY29udmVydEZpbGVUb1VSTChmaWxlKTsKKwl9IAorCWNhdGNoIChqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIGEgVVJMIHVzaW5nIHRoZSAiZmlsZSIgcHJvdG9jb2wgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gRmlsZS4KKyAqLworc3RhdGljIHB1YmxpYyBVUkwgY29udmVydEZpbGVUb1VSTChGaWxlIGZpbGUpIHsKKwl0cnkgeworCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpLnJlcGxhY2UoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCXJldHVybiBuZXcgVVJMKCJmaWxlIiwgIiIsICIvIiArIHBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCX0KKwljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCXRocm93IG5ldyBFcnJvcigpOworCX0KK30KKy8qKgorICogQW5zd2VyIGEgRmlsZSB0byB1c2UgZm9yIHRoZSBnaXZlbiBzaW1wbGUgZmlsZSBuYW1lLgorICovCitGaWxlIGZpbGVGb3JOYW1lKFN0cmluZyBmaWxlTmFtZSkgeworCUZpbGUgZGlyOworCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA+PSAxKSB7CisJCVN0cmluZyBkaXJOYW1lID0gSW50ZWdlci50b0hleFN0cmluZygoZmlsZU5hbWUuaGFzaENvZGUoKSAlIDI1NSkgJiAyNTUpOworCQlkaXIgPSBuZXcgRmlsZShmRGlyZWN0b3J5LCBkaXJOYW1lKTsKKwkJZGlyLm1rZGlycygpOworCX0gZWxzZSB7CisJCWRpciA9IGZEaXJlY3Rvcnk7CisJfQorCXJldHVybiBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsJCit9CisvKioKKyAqIFJldHVybnMgYSBuZXcgYW5vbnltb3VzIGZpbGUsIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSBpdC4gIAorICogTm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZSB3aGVuIHVzZWQgc2luY2UgaXQgaXMgdW5hbGxvY2F0ZWQuCisgKi8KK3N5bmNocm9uaXplZCBwdWJsaWMgRmlsZSBnZXRBbm9ueW1vdXNGaWxlKCkgeworCUZpbGUgZmlsZTsKKwlmaWxlID0gZmlsZUZvck5hbWUoZ2V0QW5vbnltb3VzRmlsZU5hbWUoKSk7CisJd2hpbGUgKGZpbGUuZXhpc3RzKCkpIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgxKTsKKwkJfSAKKwkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlmaWxlID0gZmlsZUZvck5hbWUoZ2V0QW5vbnltb3VzRmlsZU5hbWUoKSk7CisJfQorCXJldHVybiBmaWxlOworfQorLyoqCisgKiBSZXR1cm5zIGEgbmV3IGFub255bW91cyBmaWxlIG5hbWUuICAKKyAqIE5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWUgc2luY2UgaXRzIGRpcmVjdG9yeSBpcyB1bmtub3duLgorICovCitzeW5jaHJvbml6ZWQgcHVibGljIFN0cmluZyBnZXRBbm9ueW1vdXNGaWxlTmFtZSgpIHsKKwlyZXR1cm4gZ2V0QW5vbnltb3VzRmlsZU5hbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworfQorLyoqCisgKiBSZXR1cm5zIGEgbmV3IGFub255bW91cyBmaWxlIG5hbWUgYmFzZWQgb24gdGhlIGdpdmVuIGxvbmcuICAKKyAqIE5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWUgc2luY2UgaXRzIGRpcmVjdG9yeSBpcyB1bmtub3duLgorICovCitzeW5jaHJvbml6ZWQgcHVibGljIFN0cmluZyBnZXRBbm9ueW1vdXNGaWxlTmFtZShsb25nIGwpIHsKKwlpZiAobCA8IDApIGwgPSAtbDsKKwlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJc2IuYXBwZW5kKENoYXJhY3Rlci5mb3JEaWdpdCgoaW50KShsICUgMjYgKyAxMCksIDM2KSk7CisJbCAvPSAyNjsKKwl3aGlsZSAobCAhPSAwKSB7CisJCXNiLmFwcGVuZChDaGFyYWN0ZXIuZm9yRGlnaXQoKGludCkobCAlIDM2KSwgMzYpKTsKKwkJbCAvPSAzNjsKKwl9CisJc2IuYXBwZW5kKCIuam5rIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gc2IudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5QnVmZmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDNiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5DaGFyQXJyYXlCdWZmZXI8L2NvZGU+IGlzIGludGVuZGVkIGFzIGEgbGlnaHR3ZWlnaHQgcGFydGlhbCBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhlIFN0cmluZ0J1ZmZlciBjbGFzcywgYnV0IHVzaW5nIDxjb2RlPmNoYXJbXSdzPC9jb2RlPiBpbnN0ZWFkIG9mIFN0cmluZ3MuCisgKgorICogPHA+VGhlIDxjb2RlPkNoYXJBcnJheUJ1ZmZlcjwvY29kZT4gbWFpbnRhaW5zIGEgbGlzdCBvZiA8Y29kZT5jaGFyW10nczwvY29kZT4KKyAqIHdoaWNoIGRvbid0IGdldCBhcHBlbmRlZCB1bnRpbCB0aGUgdXNlciBhc2tzIGZvciB0aGVtLiAgVGhlIGZvbGxvd2luZworICogY29kZSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZSBjbGFzcy4KKyAqCisgKiA8Y29kZT4KKyAqIENoYXJBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQ2hhckFycmF5QnVmZmVyKG15Q2hhckFycmF5KTsKKyAqIGJ1ZmZlci5hcHBlbmQobW9yZUJ5dGVzLCAwLCBzb21lTGVuZ3RoKTsKKyAqIG15Q2hhckFycmF5ID0gYnVmZmVyLmdldENvbnRlbnRzKCk7CisgKiA8L2NvZGU+CisgKgorICogPHA+Tk9URTogVGhpcyBjbGFzcyBpcyBub3QgVGhyZWFkIHNhZmUhCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlCdWZmZXIgeworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGJ1ZmZlciBvZiBjaGFyIGFycmF5cyB3aGljaCBtdXN0IGJlIGFwcGVuZGVkIHRvZ2V0aGVyCisJICogZHVyaW5nIHRoZSBnZXRDb250ZW50cyBtZXRob2QuCisJICovCisJcHJvdGVjdGVkIGNoYXJbXVtdIGZCdWZmZXI7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZW5kIG9mIHRoZSBidWZmZXIKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZFbmQ7CisKKwkvKioKKwkgKiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIuCisJICovCisJcHJvdGVjdGVkIGludCBmU2l6ZTsKKworCS8qKgorCSAqIEEgYnVmZmVyIG9mIHJhbmdlcyB3aGljaCBpcyBtYWludGFpbmVkIGFsb25nIHdpdGgKKwkgKiB0aGUgYnVmZmVyLiAgUmFuZ2VzIGFyZSBvZiB0aGUgZm9ybSB7c3RhcnQsIGxlbmd0aH0uCisJICogRW5hYmxlcyBhcHBlbmQoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpLgorCSAqLworCXByb3RlY3RlZCBpbnRbXVtdIGZSYW5nZXM7CisvKioKKyAqIENyZWF0ZXMgYSA8Y29kZT5DaGFyQXJyYXlCdWZmZXI8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgKDEwKS4KKyAqLworcHVibGljIENoYXJBcnJheUJ1ZmZlcigpIHsKKwl0aGlzKG51bGwsIERFRkFVTFRfQlVGRkVSX1NJWkUpOworfQorLyoqCisgKiBDcmVhdGVzIGEgPGNvZGU+Q2hhckFycmF5QnVmZmVyPC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplLAorICogYW5kIHNldHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJ1ZmZlciB0byBiZSB0aGUgZ2l2ZW4gY2hhcltdLgorICoKKyAqIEBwYXJhbSBmaXJzdCAtIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIHBsYWNlZCBpbiB0aGUgYnVmZmVyLCBpZ25vcmVkIGlmIG51bGwKKyAqLworcHVibGljIENoYXJBcnJheUJ1ZmZlcihjaGFyW10gZmlyc3QpIHsKKwl0aGlzKGZpcnN0LCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIDxjb2RlPkNoYXJBcnJheUJ1ZmZlcjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUsCisgKiBhbmQgc2V0cyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYnVmZmVyIHRvIGJlIHRoZSBnaXZlbiBjaGFyIGFycmF5LgorICoKKyAqIEBwYXJhbSBmaXJzdCAtIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBidWZmZXIsIGlnbm9yZWQgaWYgbnVsbC4KKyAqIEBwYXJhbSBzaXplIC0gdGhlIGJ1ZmZlciBzaXplLCBpZiBsZXNzIHRoYW4gMSwgc2V0IHRvIHRoZSBERUZBVUxUX0JVRkZFUl9TSVpFLgorICovCitwdWJsaWMgQ2hhckFycmF5QnVmZmVyKGNoYXJbXSBmaXJzdCwgaW50IHNpemUpIHsKKwlmU2l6ZSA9IChzaXplID4gMCkgPyBzaXplIDogREVGQVVMVF9CVUZGRVJfU0laRTsKKwlmQnVmZmVyID0gbmV3IGNoYXJbZlNpemVdW107CisJZlJhbmdlcyA9IG5ldyBpbnRbZlNpemVdW107CisJZkVuZCA9IDA7CisJaWYgKGZpcnN0ICE9IG51bGwpCisJCWFwcGVuZChmaXJzdCwgMCwgZmlyc3QubGVuZ3RoKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIDxjb2RlPkNoYXJBcnJheUJ1ZmZlcjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gYnVmZmVyIHNpemUuCisgKgorICogQHBhcmFtIHNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICovCitwdWJsaWMgQ2hhckFycmF5QnVmZmVyKGludCBzaXplKSB7CisJdGhpcyhudWxsLCBzaXplKTsKK30KKy8qKgorICogQXBwZW5kcyB0aGUgZW50aXJlIGdpdmVuIGNoYXIgYXJyYXkuICBHaXZlbiBmb3IgY29udmVuaWVuY2UuCisgKgorICogQHBhcmFtIHNyYyAtIGEgY2hhciBhcnJheSB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgKi8KK3B1YmxpYyBDaGFyQXJyYXlCdWZmZXIgYXBwZW5kKGNoYXJbXSBzcmMpIHsKKwlpZiAoc3JjICE9IG51bGwpCisJCWFwcGVuZChzcmMsIDAsIHNyYy5sZW5ndGgpOworCXJldHVybiB0aGlzOworfQorLyoqCisgKiBBcHBlbmRzIGEgc3ViIGFycmF5IG9mIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBzcmMgLSB0aGUgbmV4dCBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIsIGlnbm9yZWQgaWYgbnVsbAorICogQHBhcmFtIHN0YXJ0IC0gdGhlIHN0YXJ0IGluZGV4IGluIHRoZSBzcmMgYXJyYXkuCisgKiBAcGFyYW0gbGVuZ3RoIC0gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gc3RhcnQgdG8gYmUgYXBwZW5kZWQKKyAqCisgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIGlmIGFyZ3VtZW50cyBzcGVjaWZ5IGFuIGFycmF5IGluZGV4IG91dCBvZiBib3VuZHMuCisgKi8KK3B1YmxpYyBDaGFyQXJyYXlCdWZmZXIgYXBwZW5kKGNoYXJbXSBzcmMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworCWlmIChzdGFydCA8IDApCisJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwlpZiAobGVuZ3RoIDwgMCkKKwkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCWlmIChzcmMgIT0gbnVsbCkgeworCQlpbnQgc3JjTGVuZ3RoID0gc3JjLmxlbmd0aDsKKwkJaWYgKHN0YXJ0ID4gc3JjTGVuZ3RoKQorCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCQlpZiAobGVuZ3RoICsgc3RhcnQgPiBzcmNMZW5ndGgpCisJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJCS8qKiBkbyBsZW5ndGggY2hlY2sgaGVyZSB0byBhbGxvdyBleGNlcHRpb25zIHRvIGJlIHRocm93biAqLworCQlpZiAobGVuZ3RoID4gMCkgeworCQkJaWYgKGZFbmQgPT0gZlNpemUpIHsKKwkJCQlpbnQgc2l6ZTIgPSBmU2l6ZSAqIDI7CisJCQkJU3lzdGVtLmFycmF5Y29weShmQnVmZmVyLCAwLCAoZkJ1ZmZlciA9IG5ldyBjaGFyW3NpemUyXVtdKSwgMCwgZlNpemUpOworCQkJCVN5c3RlbS5hcnJheWNvcHkoZlJhbmdlcywgMCwgKGZSYW5nZXMgPSBuZXcgaW50W3NpemUyXVtdKSwgMCwgZlNpemUpOworCQkJCWZTaXplICo9IDI7CisJCQl9CisJCQlmQnVmZmVyW2ZFbmRdID0gc3JjOworCQkJZlJhbmdlc1tmRW5kXSA9IG5ldyBpbnRbXSB7c3RhcnQsIGxlbmd0aH07CisJCQlmRW5kKys7CisJCX0KKwl9CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIGNoYXIuICBHaXZlbiBmb3IgY29udmVuaWVuY2UuCisgKgorICogQHBhcmFtIHNyYyAtIGEgY2hhciB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgKi8KK3B1YmxpYyBDaGFyQXJyYXlCdWZmZXIgYXBwZW5kKGNoYXIgYykgeworCWFwcGVuZChuZXcgY2hhcltdIHtjfSwgMCwgMSk7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIEFwcGVuZHMgdGhlIGdpdmVuIFN0cmluZyB0byB0aGUgYnVmZmVyLiAgR2l2ZW4gZm9yIGNvbnZlbmllbmNlLCB1c2UKKyAqICNhcHBlbmQoY2hhcltdKSBpZiBwb3NzaWJsZQorICoKKyAqIEBwYXJhbSBzcmMgLSBhIGNoYXIgYXJyYXkgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICovCitwdWJsaWMgQ2hhckFycmF5QnVmZmVyIGFwcGVuZChTdHJpbmcgc3JjKSB7CisJaWYgKHNyYyAhPSBudWxsKQorCQlhcHBlbmQoc3JjLnRvQ2hhckFycmF5KCksIDAsIHNyYy5sZW5ndGgoKSk7CisJcmV0dXJuIHRoaXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFzIG9uZQorICogY2hhcltdIG9yIG51bGwgaWYgbm90aGluZyBoYXMgYmVlbiBwdXQgaW4gdGhlIGJ1ZmZlci4KKyAqLworcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwlpZiAoZkVuZCA9PSAwKQorCQlyZXR1cm4gbnVsbDsKKworCS8vIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKKwlpbnQgc2l6ZSA9IDA7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBmRW5kOyBpKyspCisJCXNpemUgKz0gZlJhbmdlc1tpXVsxXTsKKworCWlmIChzaXplID4gMCkgeworCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07CisJCWludCBjdXJyZW50ID0gMDsKKwkJLy8gY29weSB0aGUgcmVzdWx0cworCQlmb3IoaW50IGkgPSAwOyBpIDwgZkVuZDsgaSsrKSB7CisJCQlpbnRbXSByYW5nZSA9IGZSYW5nZXNbaV07CisJCQlpbnQgbGVuZ3RoID0gcmFuZ2VbMV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGZCdWZmZXJbaV0sIHJhbmdlWzBdLCByZXN1bHQsIGN1cnJlbnQsIGxlbmd0aCk7CisJCQljdXJyZW50ICs9IGxlbmd0aDsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcyBhIFN0cmluZywgb3IKKyAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBidWZmZXIgaXMgZW1wdHkuCisgKi8KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJY2hhcltdIGNvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKKwlyZXR1cm4gKGNvbnRlbnRzICE9IG51bGwpID8gbmV3IFN0cmluZyhjb250ZW50cykgOiBudWxsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlPcHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5T3BzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjYmU5ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5T3BzLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKKy8qKgorICogQSBjbGFzcyB0byBkbyBjaGFyYWN0ZXJzIG9wZXJhdGlvbnMgc28gdGhhdCB3ZSBjYW4gdXNlCisgKiBjaGFyIGFycmF5cyBtb3JlIGVmZmVjdGl2ZWx5LgorICovCitwdWJsaWMgY2xhc3MgQ2hhckFycmF5T3BzIHsKKy8qKgorICogUmV0dXJucyB0aGUgY2hhciBhcnJheXMgYXMgYW4gYXJyYXkgb2YgU3RyaW5ncworICovCitwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNoYXJjaGFyVG9TdHJpbmcoY2hhcltdW10gY2hhcmNoYXIpIHsKKwlpZiAoY2hhcmNoYXIgPT0gbnVsbCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJU3RyaW5nW10gc3RyaW5ncz0gbmV3IFN0cmluZ1tjaGFyY2hhci5sZW5ndGhdOworCWZvciAoaW50IGk9IDA7IGkgPCBjaGFyY2hhci5sZW5ndGg7IGkrKykgeworCQlzdHJpbmdzW2ldPSBuZXcgU3RyaW5nKGNoYXJjaGFyW2ldKTsKKwl9CisJcmV0dXJuIHN0cmluZ3M7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGNoYXIgYXJyYXkgYXMgYSBTdHJpbmcKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhclRvU3RyaW5nKGNoYXJbXSBjaGFycykgeworCWlmIChjaGFycyA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0gZWxzZSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKKwl9Cit9CisvKioKKyAqIENvbmNhdGluYXRlcyB0aGUgdHdvIGFycmF5cyBpbnRvIG9uZSBiaWcgYXJyYXkuCisgKiBJZiB0aGUgZmlyc3QgYXJyYXkgaXMgbnVsbCwgcmV0dXJucyB0aGUgc2Vjb25kIGFycmF5LgorICogSWYgdGhlIHNlY29uZCBhcnJheSBpcyBudWxsLCByZXR1cm5zIHRoZSBmaXJzdCBhcnJheS4KKyAqCisgKiBAcGFyYW0gZmlyc3QgLSB0aGUgYXJyYXkgd2hpY2ggdGhlIG90aGVyIGFycmF5IGlzIGNvbmNhdGluYXRlZCBvbnRvCisgKiBAcGFyYW0gc2Vjb25kIC0gdGhlIGFycmF5IHdoaWNoIGlzIHRvIGJlIGNvbmNhdGluYXRlZCBvbnRvIHRoZSBmaXJzdCBhcnJheQorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBjb25jYXQoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kKSB7CisJaWYgKGZpcnN0ID09IG51bGwpCisJCXJldHVybiBzZWNvbmQ7CisJaWYgKHNlY29uZCA9PSBudWxsKQorCQlyZXR1cm4gZmlyc3Q7CisKKwlpbnQgbGVuZ3RoMSA9IGZpcnN0Lmxlbmd0aDsKKwlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aDEgKyBsZW5ndGgyXTsKKwlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0LCAwLCByZXN1bHQsIDAsIGxlbmd0aDEpOworCVN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLCAwLCByZXN1bHQsIGxlbmd0aDEsIGxlbmd0aDIpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENoZWNrcyB0aGUgdHdvIGNoYXJhY3RlciBhcnJheXMgZm9yIGVxdWFsaXR5LgorICoKKyAqIEBwYXJhbSBmaXJzdCAtIG9uZSBvZiB0aGUgYXJyYXlzIHRvIGJlIGNvbXBhcmVkCisgKiBAcGFyYW0gc2Vjb25kIC0gdGhlIG90aGVyIGFycmF5IHdoaWNoIGlzIHRvIGJlIGNvbXBhcmVkCisgKi8KK3B1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kKSB7CisJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaXJzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkKKwkJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyIGluIGJ1ZmZlciwKKyAqIHN0YXJ0aW5nIGZyb20gb2Zmc2V0LCBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KK3B1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoY2hhciBjaGFyYWN0ZXIsIGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQpIHsKKwlmb3IgKGludCBpPSBvZmZzZXQ7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGJ1ZmZlcltpXSA9PSBjaGFyYWN0ZXIpIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKy8qKgorICogRXh0cmFjdHMgYSBzdWItYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gYXJyYXksIHN0YXJ0aW5nCisgKiBhdCB0aGUgZ2l2ZW4gc3RhcnRJbmRleCBhbmQgcHJvY2VlZGluZyBmb3IgbGVuZ3RoIGNoYXJhY3RlcnMuCisgKiBSZXR1cm5zIG51bGwgaWY6CisgKiAgMS4gdGhlIHNyYyBhcnJheSBpcyBudWxsCisgKiAgMi4gdGhlIHN0YXJ0IGluZGV4IGlzIG91dCBvZiBib3VuZHMKKyAqICAzLiB0aGUgbGVuZ3RoIHBhcmFtZXRlciBzcGVjaWZpZXMgYSBlbmQgcG9pbnQgd2hpY2ggaXMgb3V0IG9mIGJvdW5kcworICogRG9lcyBub3QgcmV0dXJuIGEgY29weSBvZiB0aGUgYXJyYXkgaWYgcG9zc2libGUsIGkuZS4gaWYgc3RhcnQgaXMgemVybworICogYW5kIGxlbmd0aCBlcXVhbHMgdGhlIGxlbmd0aCBvZiB0aGUgc3JjIGFycmF5LgorICoKKyAqIEBwYXJhbSBzcmMgLSB0aGUgYXJyYXkgZnJvbSB3aGljaCBlbGVtZW50cyBuZWVkIHRvIGJlIGNvcGllZAorICogQHBhcmFtIHN0YXJ0IC0gdGhlIHN0YXJ0IGluZGV4IGluIHRoZSBzcmMgYXJyYXkKKyAqIEBwYXJhbSBsZW5ndGggLSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weQorICovCitwdWJsaWMgc3RhdGljIGNoYXJbXSBzdWJhcnJheShjaGFyW10gc3JjLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKwlpZiAoc3JjID09IG51bGwpCisJCXJldHVybiBudWxsOworCWludCBzcmNMZW5ndGggPSBzcmMubGVuZ3RoOworCWlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gc3JjTGVuZ3RoKQorCQlyZXR1cm4gbnVsbDsKKwlpZiAobGVuZ3RoIDwgMCB8fCBzdGFydCArIGxlbmd0aCA+IHNyY0xlbmd0aCkKKwkJcmV0dXJuIG51bGw7CisJaWYgKHNyY0xlbmd0aCA9PSBsZW5ndGggJiYgc3RhcnQgPT0gMCkKKwkJcmV0dXJuIHNyYzsKKwkJCisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07CisJaWYgKGxlbmd0aCA+IDApCisJCVN5c3RlbS5hcnJheWNvcHkoc3JjLCBzdGFydCwgcmVzdWx0LCAwLCBsZW5ndGgpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIEV4dHJhY3RzIGEgc3Vic3RyaW5nIGZyb20gdGhlIGdpdmVuIGFycmF5LCBzdGFydGluZworICogYXQgdGhlIGdpdmVuIHN0YXJ0SW5kZXggYW5kIHByb2NlZWRpbmcgZm9yIGxlbmd0aCBjaGFyYWN0ZXJzLgorICogUmV0dXJucyBudWxsIGlmOgorICogIDEuIHRoZSBzcmMgYXJyYXkgaXMgbnVsbAorICogIDIuIHRoZSBzdGFydCBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisgKiAgMy4gdGhlIGxlbmd0aCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgZW5kIHBvaW50IHdoaWNoIGlzIG91dCBvZiBib3VuZHMKKyAqIERvZXMgbm90IHJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGlmIHBvc3NpYmxlLCBpLmUuIGlmIHN0YXJ0IGlzIHplcm8KKyAqIGFuZCBsZW5ndGggZXF1YWxzIHRoZSBsZW5ndGggb2YgdGhlIHNyYyBhcnJheS4KKyAqCisgKiBAcGFyYW0gc3JjIC0gdGhlIGFycmF5IGZyb20gd2hpY2ggZWxlbWVudHMgbmVlZCB0byBiZSBjb3BpZWQKKyAqIEBwYXJhbSBzdGFydCAtIHRoZSBzdGFydCBpbmRleCBpbiB0aGUgc3JjIGFycmF5CisgKiBAcGFyYW0gbGVuZ3RoIC0gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic3RyaW5nKGNoYXJbXSBzcmMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworCWNoYXJbXSBjaGFycz0gc3ViYXJyYXkoc3JjLCBzdGFydCwgbGVuZ3RoKTsKKwlpZiAoY2hhcnMgIT0gbnVsbCkgeworCQlyZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1NTg0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElDbGFzc0ZpbGVBdHRyaWJ1dGUKKyAqLworcHVibGljIGNsYXNzIENsYXNzRmlsZUF0dHJpYnV0ZSBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElDbGFzc0ZpbGVBdHRyaWJ1dGUgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIE5PX0FUVFJJQlVURVMgPSBuZXcgSUNsYXNzRmlsZUF0dHJpYnV0ZVswXTsKKwlwcml2YXRlIGxvbmcgYXR0cmlidXRlTGVuZ3RoOworCXByaXZhdGUgaW50IGF0dHJpYnV0ZU5hbWVJbmRleDsKKwlwcml2YXRlIGNoYXJbXSBhdHRyaWJ1dGVOYW1lOworCQorCXB1YmxpYyBDbGFzc0ZpbGVBdHRyaWJ1dGUoYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzLCBJQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCwgaW50IG9mZnNldCkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKwkJdGhpcy5hdHRyaWJ1dGVOYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOworCQl0aGlzLmF0dHJpYnV0ZUxlbmd0aCA9IHU0QXQoY2xhc3NGaWxlQnl0ZXMsIDIsIG9mZnNldCk7CisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLmF0dHJpYnV0ZU5hbWVJbmRleCk7CisJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjgpIHsKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQl9CisJCXRoaXMuYXR0cmlidXRlTmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlTmFtZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRBdHRyaWJ1dGVMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZUxlbmd0aDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUNsYXNzRmlsZVJlYWRlci4KKyAqLworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRmllbGRJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNZXRob2RJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1vZGlmaWVyQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSVNvdXJjZUF0dHJpYnV0ZTsKKworcHVibGljIGNsYXNzIENsYXNzRmlsZVJlYWRlciBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElDbGFzc0ZpbGVSZWFkZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWVsZEluZm9bXSBOT19GSUVMRF9JTkZPUyA9IG5ldyBJRmllbGRJbmZvWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElNZXRob2RJbmZvW10gTk9fTUVUSE9EX0lORk9TID0gbmV3IElNZXRob2RJbmZvWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE5PX0lOVEVSRkFDRV9JTkRFWEVTID0gbmV3IGludFswXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBOT19JTlRFUkZBQ0VTX05BTUVTID0gbmV3IGNoYXJbMF1bMF07CisKKwlwcml2YXRlIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOworCXByaXZhdGUgaW50IG1hZ2ljTnVtYmVyOworCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOworCXByaXZhdGUgY2hhcltdIGNsYXNzTmFtZTsKKwlwcml2YXRlIGNoYXJbXSBzdXBlcmNsYXNzTmFtZTsKKwlwcml2YXRlIGludCBpbnRlcmZhY2VzQ291bnQ7CisJcHJpdmF0ZSBjaGFyW11bXSBpbnRlcmZhY2VOYW1lczsKKwlwcml2YXRlIGludFtdIGludGVyZmFjZUluZGV4ZXM7CisJcHJpdmF0ZSBpbnQgZmllbGRzQ291bnQ7CisJcHJpdmF0ZSBJRmllbGRJbmZvW10gZmllbGRzOworCXByaXZhdGUgaW50IG1ldGhvZHNDb3VudDsKKwlwcml2YXRlIElNZXRob2RJbmZvW10gbWV0aG9kczsKKwlwcml2YXRlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGUgaW5uZXJDbGFzc2VzQXR0cmlidXRlOworCXByaXZhdGUgSVNvdXJjZUF0dHJpYnV0ZSBzb3VyY2VGaWxlQXR0cmlidXRlOworCXByaXZhdGUgaW50IGNsYXNzTmFtZUluZGV4OworCXByaXZhdGUgYm9vbGVhbiBpc0RlcHJlY2F0ZWQ7CisJcHJpdmF0ZSBib29sZWFuIGlzU3ludGhldGljOworCXByaXZhdGUgaW50IG1ham9yVmVyc2lvbjsKKwlwcml2YXRlIGludCBtaW5vclZlcnNpb247CisJcHJpdmF0ZSBpbnQgc3VwZXJjbGFzc05hbWVJbmRleDsKKwlwcml2YXRlIGludCBjbGFzc0luZGV4OworCXByaXZhdGUgaW50IGF0dHJpYnV0ZXNDb3VudDsKKwlwcml2YXRlIElDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBDbGFzc0ZpbGVSZWFkZXIuCisJICogCisJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIHRoZSByYXcgYnl0ZXMgb2YgdGhlIC5jbGFzcyBmaWxlCisJICogQHBhcmFtIGRlY29kaW5nRmxhZ3MgdGhlIGRlY29kaW5nIGZsYWdzCisJICogCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI0FMTAorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNDTEFTU0ZJTEVfQVRUUklCVVRFUworCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNDT05TVEFOVF9QT09MCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI0ZJRUxEX0lORk9TCisJICovCisJcHVibGljIENsYXNzRmlsZVJlYWRlcihieXRlW10gY2xhc3NGaWxlQnl0ZXMsIGludCBkZWNvZGluZ0ZsYWdzKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQorCQkvLyBUaGlzIG1ldGhvZCBsb29rcyB1Z2x5IGJ1dCBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUsIHRoZSBjb25zdGFudFBvb2wgaXMgY29uc3RydWN0ZWQKKwkJLy8gaW4gMyBwYXNzZXMuICBBbGwgbm9uLXByaW1pdGl2ZSBjb25zdGFudCBwb29sIG1lbWJlcnMgdGhhdCB1c3VhbGx5IHJlZmVyIHRvIG90aGVyIG1lbWJlcnMKKwkJLy8gYnkgaW5kZXggYXJlIHR3ZWFrZWQgdG8gaGF2ZSB0aGVpciB2YWx1ZSBpbiBpbnN0IHZhcnMsIHRoaXMgbWlub3IgY29zdCBhdCByZWFkLXRpbWUgbWFrZXMKKwkJLy8gYWxsIHN1YnNlcXVlbnQgdXNlcyBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbGVtZW50IGZhc3Rlci4KKwkJaW50IGNvbnN0YW50UG9vbENvdW50OworCQlpbnRbXSBjb25zdGFudFBvb2xPZmZzZXRzOworCQl0cnkgeworCQkJdGhpcy5tYWdpY051bWJlciA9IChpbnQpIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIDAsIDApOworCQkJaW50IHJlYWRPZmZzZXQgPSAxMDsKKwkJCXRoaXMubWlub3JWZXJzaW9uID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCA0LCAwKTsKKwkJCXRoaXMubWFqb3JWZXJzaW9uID0gdGhpcy51MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCAwKTsKKwkJCQorCQkJaWYgKChkZWNvZGluZ0ZsYWdzICYgSUNsYXNzRmlsZVJlYWRlci5DT05TVEFOVF9QT09MKSA9PSAwKSB7CisJCQkJLy8gbm8gbmVlZCB0byBnbyBmdXJ0aGVyCisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQljb25zdGFudFBvb2xDb3VudCA9IHRoaXMudTJBdChjbGFzc0ZpbGVCeXRlcywgOCwgMCk7CisJCQkvLyBQYXNzICMxIC0gRmlsbCBpbiBhbGwgcHJpbWl0aXZlIGNvbnN0YW50cworCQkJY29uc3RhbnRQb29sT2Zmc2V0cyA9IG5ldyBpbnRbY29uc3RhbnRQb29sQ291bnRdOworCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb25zdGFudFBvb2xDb3VudDsgaSsrKSB7CisJCQkJaW50IHRhZyA9IHRoaXMudTFBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CisJCQkJc3dpdGNoICh0YWcpIHsKKwkJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCA6CisJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCArIDEsIDApOworCQkJCQkJcmVhZE9mZnNldCArPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOF9TSVpFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXIgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlZ2VyX1NJWkU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRmxvYXQgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9GbG9hdF9TSVpFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0xvbmcgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nX1NJWkU7CisJCQkJCQlpKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRG91YmxlIDoKKwkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQkJcmVhZE9mZnNldCArPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRG91YmxlX1NJWkU7CisJCQkJCQlpKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfQ2xhc3MgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzc19TSVpFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1N0cmluZyA6CisJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1N0cmluZ19TSVpFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmIDoKKwkJCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OworCQkJCQkJcmVhZE9mZnNldCArPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRmllbGRyZWZfU0laRTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9NZXRob2RyZWYgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9NZXRob2RyZWZfU0laRTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgOgorCQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWZfU0laRTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9OYW1lQW5kVHlwZSA6CisJCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX05hbWVBbmRUeXBlX1NJWkU7CisJCQkJfQorCQkJfQorCQkJCisJCQl0aGlzLmNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2woY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbE9mZnNldHMpOworCQkJLy8gUmVhZCBhbmQgdmFsaWRhdGUgYWNjZXNzIGZsYWdzCisJCQl0aGlzLmFjY2Vzc0ZsYWdzID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CisJCQlyZWFkT2Zmc2V0ICs9IDI7CisJCisJCQkvLyBSZWFkIHRoZSBjbGFzc25hbWUsIHVzZSBleGNlcHRpb24gaGFuZGxlcnMgdG8gY2F0Y2ggYmFkIGZvcm1hdAorCQkJdGhpcy5jbGFzc05hbWVJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQsIDApOworCQkJdGhpcy5jbGFzc05hbWUgPSBnZXRDb25zdGFudENsYXNzTmFtZUF0KGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2xPZmZzZXRzLCB0aGlzLmNsYXNzTmFtZUluZGV4KTsKKwkJCXJlYWRPZmZzZXQgKz0gMjsKKwkKKwkJCS8vIFJlYWQgdGhlIHN1cGVyY2xhc3MgbmFtZSwgY2FuIGJlIHplcm8gZm9yIGphdmEubGFuZy5PYmplY3QKKwkJCXRoaXMuc3VwZXJjbGFzc05hbWVJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQsIDApOworCQkJcmVhZE9mZnNldCArPSAyOworCQkJLy8gaWYgc3VwZXJjbGFzc05hbWVJbmRleCBpcyBlcXVhbHMgdG8gMCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIHZhbHVlIGZvciB0aGUgCisJCQkvLyBmaWVsZCB0aGlzLnN1cGVyY2xhc3NOYW1lLiBudWxsIGlzIGZpbmUuCisJCQlpZiAoc3VwZXJjbGFzc05hbWVJbmRleCAhPSAwKSB7CisJCQkJdGhpcy5zdXBlcmNsYXNzTmFtZSA9IGdldENvbnN0YW50Q2xhc3NOYW1lQXQoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbE9mZnNldHMsIHRoaXMuc3VwZXJjbGFzc05hbWVJbmRleCk7CisJCQl9CisKKwkJCS8vIFJlYWQgdGhlIGludGVyZmFjZXMsIHVzZSBleGNlcHRpb24gaGFuZGxlcnMgdG8gY2F0Y2ggYmFkIGZvcm1hdAorCQkJdGhpcy5pbnRlcmZhY2VzQ291bnQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKTsKKwkJCXJlYWRPZmZzZXQgKz0gMjsKKwkJCXRoaXMuaW50ZXJmYWNlTmFtZXMgPSBOT19JTlRFUkZBQ0VTX05BTUVTOworCQkJdGhpcy5pbnRlcmZhY2VJbmRleGVzID0gTk9fSU5URVJGQUNFX0lOREVYRVM7CisJCQlpZiAodGhpcy5pbnRlcmZhY2VzQ291bnQgIT0gMCkgeworCQkJCWlmICgoZGVjb2RpbmdGbGFncyAmIElDbGFzc0ZpbGVSZWFkZXIuU1VQRVJfSU5URVJGQUNFUykgIT0gSUNsYXNzRmlsZVJlYWRlci5DT05TVEFOVF9QT09MKSB7CisJCQkJCXRoaXMuaW50ZXJmYWNlTmFtZXMgPSBuZXcgY2hhclt0aGlzLmludGVyZmFjZXNDb3VudF1bXTsKKwkJCQkJdGhpcy5pbnRlcmZhY2VJbmRleGVzID0gbmV3IGludFt0aGlzLmludGVyZmFjZXNDb3VudF07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbnRlcmZhY2VzQ291bnQ7IGkrKykgeworCQkJCQkJdGhpcy5pbnRlcmZhY2VJbmRleGVzW2ldID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CisJCQkJCQl0aGlzLmludGVyZmFjZU5hbWVzW2ldID0gZ2V0Q29uc3RhbnRDbGFzc05hbWVBdChjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sT2Zmc2V0cywgdGhpcy5pbnRlcmZhY2VJbmRleGVzW2ldKTsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gMjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJlYWRPZmZzZXQgKz0gKDIgKiB0aGlzLmludGVyZmFjZXNDb3VudCk7CisJCQkJfQorCQkJfQorCQkJLy8gUmVhZCB0aGUgdGhpcy5maWVsZHMsIHVzZSBleGNlcHRpb24gaGFuZGxlcnMgdG8gY2F0Y2ggYmFkIGZvcm1hdAorCQkJdGhpcy5maWVsZHNDb3VudCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQsIDApOworCQkJcmVhZE9mZnNldCArPSAyOworCQkJdGhpcy5maWVsZHMgPSBOT19GSUVMRF9JTkZPUzsKKwkJCWlmICh0aGlzLmZpZWxkc0NvdW50ICE9IDApIHsKKwkJCQlpZiAoKGRlY29kaW5nRmxhZ3MgJiBJQ2xhc3NGaWxlUmVhZGVyLkZJRUxEX0lORk9TKSAhPSBJQ2xhc3NGaWxlUmVhZGVyLkNPTlNUQU5UX1BPT0wpIHsKKwkJCQkJRmllbGRJbmZvIGZpZWxkOworCQkJCQl0aGlzLmZpZWxkcyA9IG5ldyBGaWVsZEluZm9bdGhpcy5maWVsZHNDb3VudF07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5maWVsZHNDb3VudDsgaSsrKSB7CisJCQkJCQlmaWVsZCA9IG5ldyBGaWVsZEluZm8oY2xhc3NGaWxlQnl0ZXMsIHRoaXMuY29uc3RhbnRQb29sLCByZWFkT2Zmc2V0KTsKKwkJCQkJCXRoaXMuZmllbGRzW2ldID0gZmllbGQ7CisJCQkJCQlyZWFkT2Zmc2V0ICs9IGZpZWxkLnNpemVJbkJ5dGVzKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZmllbGRzQ291bnQ7IGkrKykgeworCQkJCQkJaW50IGF0dHJpYnV0ZUNvdW50Rm9yRmllbGQgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCByZWFkT2Zmc2V0KTsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gODsKKwkJCQkJCWlmIChhdHRyaWJ1dGVDb3VudEZvckZpZWxkICE9IDApIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUNvdW50Rm9yRmllbGQ7IGorKykgeworCQkJCQkJCQlpbnQgYXR0cmlidXRlTGVuZ3RoID0gKGludCkgdTRBdChjbGFzc0ZpbGVCeXRlcywgMiwgcmVhZE9mZnNldCk7CisJCQkJCQkJCXJlYWRPZmZzZXQgKz0gKDYgKyBhdHRyaWJ1dGVMZW5ndGgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQkJCQkJCisJCQkJfQorCQkJfQorCQkJLy8gUmVhZCB0aGUgdGhpcy5tZXRob2RzCisJCQl0aGlzLm1ldGhvZHNDb3VudCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQsIDApOworCQkJcmVhZE9mZnNldCArPSAyOworCQkJdGhpcy5tZXRob2RzID0gTk9fTUVUSE9EX0lORk9TOworCQkJaWYgKHRoaXMubWV0aG9kc0NvdW50ICE9IDApIHsKKwkJCQlpZiAoKGRlY29kaW5nRmxhZ3MgJiBJQ2xhc3NGaWxlUmVhZGVyLk1FVEhPRF9JTkZPUykgIT0gSUNsYXNzRmlsZVJlYWRlci5DT05TVEFOVF9QT09MKSB7CisJCQkJCXRoaXMubWV0aG9kcyA9IG5ldyBNZXRob2RJbmZvW3RoaXMubWV0aG9kc0NvdW50XTsKKwkJCQkJTWV0aG9kSW5mbyBtZXRob2Q7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZXRob2RzQ291bnQ7IGkrKykgeworCQkJCQkJbWV0aG9kID0gbmV3IE1ldGhvZEluZm8oY2xhc3NGaWxlQnl0ZXMsIHRoaXMuY29uc3RhbnRQb29sLCByZWFkT2Zmc2V0LCBkZWNvZGluZ0ZsYWdzKTsKKwkJCQkJCXRoaXMubWV0aG9kc1tpXSA9IG1ldGhvZDsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gbWV0aG9kLnNpemVJbkJ5dGVzKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWV0aG9kc0NvdW50OyBpKyspIHsKKwkJCQkJCWludCBhdHRyaWJ1dGVDb3VudEZvck1ldGhvZCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIHJlYWRPZmZzZXQpOworCQkJCQkJcmVhZE9mZnNldCArPSA4OworCQkJCQkJaWYgKGF0dHJpYnV0ZUNvdW50Rm9yTWV0aG9kICE9IDApIHsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZUNvdW50Rm9yTWV0aG9kOyBqKyspIHsKKwkJCQkJCQkJaW50IGF0dHJpYnV0ZUxlbmd0aCA9IChpbnQpIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIDIsIHJlYWRPZmZzZXQpOworCQkJCQkJCQlyZWFkT2Zmc2V0ICs9ICg2ICsgYXR0cmlidXRlTGVuZ3RoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0JCQkJCQorCQkJCX0KKwkJCX0KKwkKKwkJCS8vIFJlYWQgdGhlIGF0dHJpYnV0ZXMKKwkJCXRoaXMuYXR0cmlidXRlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgMCk7CisJCQlyZWFkT2Zmc2V0ICs9IDI7CisKKwkJCWludCBhdHRyaWJ1dGVzSW5kZXggPSAwOworCQkJdGhpcy5hdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQXR0cmlidXRlLk5PX0FUVFJJQlVURVM7CisJCQlpZiAodGhpcy5hdHRyaWJ1dGVzQ291bnQgIT0gMCkgeworCQkJCWlmICgoZGVjb2RpbmdGbGFncyAmIElDbGFzc0ZpbGVSZWFkZXIuQ0xBU1NGSUxFX0FUVFJJQlVURVMpICE9IElDbGFzc0ZpbGVSZWFkZXIuQ09OU1RBTlRfUE9PTCkgeworCQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzRmlsZUF0dHJpYnV0ZVt0aGlzLmF0dHJpYnV0ZXNDb3VudF07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJCQkJCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1t1MkF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0LCAwKV07CisJCQkJCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IHV0ZjhBdChjbGFzc0ZpbGVCeXRlcywgdXRmOE9mZnNldCArIDMsIDAsIHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHV0ZjhPZmZzZXQgKyAxLCAwKSk7CisJCQkJCQlpZiAoZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5ERVBSRUNBVEVEKSkgeworCQkJCQkJCXRoaXMuaXNEZXByZWNhdGVkID0gdHJ1ZTsKKwkJCQkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgdGhpcy5jb25zdGFudFBvb2wsIHJlYWRPZmZzZXQpOworCQkJCQkJfSBlbHNlIGlmIChlcXVhbHMoYXR0cmlidXRlTmFtZSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLklOTkVSX0NMQVNTRVMpKSB7CisJCQkJCQkJdGhpcy5pbm5lckNsYXNzZXNBdHRyaWJ1dGUgPSBuZXcgSW5uZXJDbGFzc2VzQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCB0aGlzLmNvbnN0YW50UG9vbCwgcmVhZE9mZnNldCk7CisJCQkJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMuaW5uZXJDbGFzc2VzQXR0cmlidXRlOworCQkJCQkJfSBlbHNlIGlmIChlcXVhbHMoYXR0cmlidXRlTmFtZSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLlNPVVJDRSkpIHsKKwkJCQkJCQkJdGhpcy5zb3VyY2VGaWxlQXR0cmlidXRlID0gbmV3IFNvdXJjZUZpbGVBdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIHRoaXMuY29uc3RhbnRQb29sLCByZWFkT2Zmc2V0KTsKKwkJCQkJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMuc291cmNlRmlsZUF0dHJpYnV0ZTsKKwkJCQkJCX0gZWxzZSBpZiAoZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5TWU5USEVUSUMpKSB7CisJCQkJCQkJCXRoaXMuaXNTeW50aGV0aWMgPSB0cnVlOworCQkJCQkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgdGhpcy5jb25zdGFudFBvb2wsIHJlYWRPZmZzZXQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgdGhpcy5jb25zdGFudFBvb2wsIHJlYWRPZmZzZXQpOworCQkJCQkJfQorCQkJCQkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQgKyAyLCAwKSk7CisJCQkJCX0JCQkJCQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0NvdW50OyBpKyspIHsKKwkJCQkJCXJlYWRPZmZzZXQgKz0gKDYgKyB1NEF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0ICsgMiwgMCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHJlYWRPZmZzZXQgIT0gY2xhc3NGaWxlQnl0ZXMubGVuZ3RoKSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLlRPT19NQU5ZX0JZVEVTKTsgCisJCQl9CisJCX0gY2F0Y2goQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FUlJPUl9UUlVOQ0FURURfSU5QVVQpOyAKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRBY2Nlc3NGbGFncygpCisJICovCisJcHVibGljIGludCBnZXRBY2Nlc3NGbGFncygpIHsKKwkJcmV0dXJuIHRoaXMuYWNjZXNzRmxhZ3M7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldFNvdXJjZUZpbGVBdHRyaWJ1dGUoKQorCSAqLworCXB1YmxpYyBJU291cmNlQXR0cmlidXRlIGdldFNvdXJjZUZpbGVBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLnNvdXJjZUZpbGVBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldENvbnN0YW50UG9vbCgpCisJICovCisJcHVibGljIElDb25zdGFudFBvb2wgZ2V0Q29uc3RhbnRQb29sKCkgeworCQlyZXR1cm4gdGhpcy5jb25zdGFudFBvb2w7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldEZpZWxkSW5mb3MoKQorCSAqLworCXB1YmxpYyBJRmllbGRJbmZvW10gZ2V0RmllbGRJbmZvcygpIHsKKwkJcmV0dXJuIHRoaXMuZmllbGRzOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRJbm5lckNsYXNzZXNBdHRyaWJ1dGUoKQorCSAqLworCXB1YmxpYyBJSW5uZXJDbGFzc2VzQXR0cmlidXRlIGdldElubmVyQ2xhc3Nlc0F0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaW5uZXJDbGFzc2VzQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRJbnRlcmZhY2VOYW1lcygpCisJICovCisJcHVibGljIGNoYXJbXVtdIGdldEludGVyZmFjZU5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5pbnRlcmZhY2VOYW1lczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0TWV0aG9kSW5mb3MoKQorCSAqLworCXB1YmxpYyBJTWV0aG9kSW5mb1tdIGdldE1ldGhvZEluZm9zKCkgeworCQlyZXR1cm4gdGhpcy5tZXRob2RzOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRDbGFzc05hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldFN1cGVyY2xhc3NOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldFN1cGVyY2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzTmFtZTsKKwl9CisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2lzQ2xhc3MoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7CisJCXJldHVybiAhaXNJbnRlcmZhY2UoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjaXNJbnRlcmZhY2UoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworCQlyZXR1cm4gKGdldEFjY2Vzc0ZsYWdzKCkgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0lOVEVSRkFDRSkgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0TWFqb3JWZXJzaW9uKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1ham9yVmVyc2lvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFqb3JWZXJzaW9uOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRNaW5vclZlcnNpb24oKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5taW5vclZlcnNpb247CisJfQorCisJcHJpdmF0ZSBjaGFyW10gZ2V0Q29uc3RhbnRDbGFzc05hbWVBdChieXRlW10gY2xhc3NGaWxlQnl0ZXMsIGludFtdIGNvbnN0YW50UG9vbE9mZnNldHMsIGludCBjb25zdGFudFBvb2xJbmRleCkgeworCQlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sT2Zmc2V0c1tjb25zdGFudFBvb2xJbmRleF0gKyAxLCAwKV07CisJCXJldHVybiB1dGY4QXQoY2xhc3NGaWxlQnl0ZXMsIHV0ZjhPZmZzZXQgKyAzLCAwLCB1MkF0KGNsYXNzRmlsZUJ5dGVzLCB1dGY4T2Zmc2V0ICsgMSwgMCkpOworCX0KKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0QXR0cmlidXRlQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNDb3VudDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0Q2xhc3NJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRDbGFzc0luZGV4KCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0SW50ZXJmYWNlSW5kZXhlcygpCisJICovCisJcHVibGljIGludFtdIGdldEludGVyZmFjZUluZGV4ZXMoKSB7CisJCXJldHVybiB0aGlzLmludGVyZmFjZUluZGV4ZXM7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldFN1cGVyY2xhc3NJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRTdXBlcmNsYXNzSW5kZXgoKSB7CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3NOYW1lSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldE1hZ2ljKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1hZ2ljKCkgeworCQlyZXR1cm4gdGhpcy5tYWdpY051bWJlcjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVSZWFkZXIjZ2V0RmllbGRzQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RmllbGRzQ291bnQoKSB7CisJCXJldHVybiB0aGlzLmZpZWxkc0NvdW50OworCX0KKworCS8qKgorCSAqIEBzZWUgSUNsYXNzRmlsZVJlYWRlciNnZXRNZXRob2RzQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWV0aG9kc0NvdW50KCkgeworCQlyZXR1cm4gdGhpcy5tZXRob2RzQ291bnQ7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NGaWxlUmVhZGVyI2dldEF0dHJpYnV0ZXMoKQorCSAqLworCXB1YmxpYyBJQ2xhc3NGaWxlQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlU3RydWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDVhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIHRoYXQgZGVmaW5lcyBoZWxwZXJzIG1ldGhvZHMgZm9yIGRlY29kaW5nIC5jbGFzcyBmaWxlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NGaWxlU3RydWN0IHsKKworCXByb3RlY3RlZCBkb3VibGUgZG91YmxlQXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7CisJCXJldHVybiAoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5pOEF0KHJlZmVyZW5jZSwgcmVsYXRpdmVPZmZzZXQsIHN0cnVjdE9mZnNldCkpKTsKKwl9CisKKwlwcm90ZWN0ZWQgZmxvYXQgZmxvYXRBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsIGludCBzdHJ1Y3RPZmZzZXQpIHsKKwkJcmV0dXJuIChGbG9hdC5pbnRCaXRzVG9GbG9hdCh0aGlzLmk0QXQocmVmZXJlbmNlLCByZWxhdGl2ZU9mZnNldCwgc3RydWN0T2Zmc2V0KSkpOworCX0KKwlwcm90ZWN0ZWQgaW50IGkxQXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7CisJCXJldHVybiByZWZlcmVuY2VbcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXRdOworCX0KKwlwcm90ZWN0ZWQgaW50IGkyQXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7CisJCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCQlyZXR1cm4gKHJlZmVyZW5jZVtwb3NpdGlvbisrXSA8PCA4KSArIChyZWZlcmVuY2VbcG9zaXRpb25dICYgMHhGRik7CisJfQorCXByb3RlY3RlZCBpbnQgaTRBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsIGludCBzdHJ1Y3RPZmZzZXQpIHsKKwkJaW50IHBvc2l0aW9uID0gcmVsYXRpdmVPZmZzZXQgKyBzdHJ1Y3RPZmZzZXQ7CisJCXJldHVybiAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDI0KQorCQkJKyAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDE2KQorCQkJKyAoKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpIDw8IDgpCisJCQkrIChyZWZlcmVuY2VbcG9zaXRpb25dICYgMHhGRik7CisJfQorCXByb3RlY3RlZCBsb25nIGk4QXQoYnl0ZVtdIHJlZmVyZW5jZSwgaW50IHJlbGF0aXZlT2Zmc2V0LCBpbnQgc3RydWN0T2Zmc2V0KSB7CisJCWludCBwb3NpdGlvbiA9IHJlbGF0aXZlT2Zmc2V0ICsgc3RydWN0T2Zmc2V0OworCQlyZXR1cm4gKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA1NikKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA0OCkKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA0MCkKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCAzMikKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCAyNCkKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCAxNikKKwkJCSsgKCgobG9uZykgKHJlZmVyZW5jZVtwb3NpdGlvbisrXSAmIDB4RkYpKSA8PCA4KQorCQkJKyAoKGxvbmcpIChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSk7CisJfQorCisJcHJvdGVjdGVkIGludCB1MUF0KGJ5dGVbXSByZWZlcmVuY2UsIGludCByZWxhdGl2ZU9mZnNldCwgaW50IHN0cnVjdE9mZnNldCkgeworCQlyZXR1cm4gKHJlZmVyZW5jZVtyZWxhdGl2ZU9mZnNldCArIHN0cnVjdE9mZnNldF0gJiAweEZGKTsKKwl9CisJcHJvdGVjdGVkIGludCB1MkF0KGJ5dGVbXSByZWZlcmVuY2UsIGludCByZWxhdGl2ZU9mZnNldCwgaW50IHN0cnVjdE9mZnNldCkgeworCQlpbnQgcG9zaXRpb24gPSByZWxhdGl2ZU9mZnNldCArIHN0cnVjdE9mZnNldDsKKwkJcmV0dXJuICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkgKyAocmVmZXJlbmNlW3Bvc2l0aW9uXSAmIDB4RkYpOworCX0KKwlwcm90ZWN0ZWQgbG9uZyB1NEF0KGJ5dGVbXSByZWZlcmVuY2UsIGludCByZWxhdGl2ZU9mZnNldCwgaW50IHN0cnVjdE9mZnNldCkgeworCQlpbnQgcG9zaXRpb24gPSByZWxhdGl2ZU9mZnNldCArIHN0cnVjdE9mZnNldDsKKwkJcmV0dXJuICgKKwkJCSgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRkwpIDw8IDI0KQorCQkJCSsgKChyZWZlcmVuY2VbcG9zaXRpb24rK10gJiAweEZGKSA8PCAxNikKKwkJCQkrICgocmVmZXJlbmNlW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkKKwkJCQkrIChyZWZlcmVuY2VbcG9zaXRpb25dICYgMHhGRikpOworCX0KKwlwcm90ZWN0ZWQgY2hhcltdIHV0ZjhBdChieXRlW10gcmVmZXJlbmNlLCBpbnQgcmVsYXRpdmVPZmZzZXQsIGludCBzdHJ1Y3RPZmZzZXQsIGludCBieXRlc0F2YWlsYWJsZSkgeworCQlpbnQgeCwgeSwgejsKKwkJaW50IGxlbmd0aCA9IGJ5dGVzQXZhaWxhYmxlOworCQljaGFyIG91dHB1dEJ1ZltdID0gbmV3IGNoYXJbYnl0ZXNBdmFpbGFibGVdOworCQlpbnQgb3V0cHV0UG9zID0gMDsKKwkJaW50IHJlYWRPZmZzZXQgPSBzdHJ1Y3RPZmZzZXQgKyByZWxhdGl2ZU9mZnNldDsKKworCQl3aGlsZSAobGVuZ3RoICE9IDApIHsKKwkJCXggPSByZWZlcmVuY2VbcmVhZE9mZnNldCsrXSAmIDB4RkY7CisJCQlsZW5ndGgtLTsKKwkJCWlmICgoMHg4MCAmIHgpICE9IDApIHsKKwkJCQl5ID0gcmVmZXJlbmNlW3JlYWRPZmZzZXQrK10gJiAweEZGOworCQkJCWxlbmd0aC0tOworCQkJCWlmICgoeCAmIDB4MjApICE9IDApIHsKKwkJCQkJeiA9IHJlZmVyZW5jZVtyZWFkT2Zmc2V0KytdICYgMHhGRjsKKwkJCQkJbGVuZ3RoLS07CisJCQkJCXggPSAoKHggJiAweDFGKSA8PCAxMikgKyAoKHkgJiAweDNGKSA8PCA2KSArICh6ICYgMHgzRik7CisJCQkJfSBlbHNlIHsKKwkJCQkJeCA9ICgoeCAmIDB4MUYpIDw8IDYpICsgKHkgJiAweDNGKTsKKwkJCQl9CisJCQl9CisJCQlvdXRwdXRCdWZbb3V0cHV0UG9zKytdID0gKGNoYXIpIHg7CisJCX0KKworCQlpZiAob3V0cHV0UG9zICE9IGJ5dGVzQXZhaWxhYmxlKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG91dHB1dEJ1ZiwgMCwgKG91dHB1dEJ1ZiA9IG5ldyBjaGFyW291dHB1dFBvc10pLCAwLCBvdXRwdXRQb3MpOworCQl9CisJCXJldHVybiBvdXRwdXRCdWY7CisJfQorCisJZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kKSB7CisJCWlmIChmaXJzdCA9PSBzZWNvbmQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChmaXJzdC5sZW5ndGggIT0gc2Vjb25kLmxlbmd0aCkKKwkJCXJldHVybiBmYWxzZTsKKwkKKwkJZm9yIChpbnQgaSA9IGZpcnN0Lmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29kZUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvZGVBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDExNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUJ5dGVjb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29kZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRXhjZXB0aW9uVGFibGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklMaW5lTnVtYmVyQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JT3Bjb2RlTW5lbW9uaWNzOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSUNvZGVBdHRyaWJ1dGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2RlQXR0cmlidXRlIGV4dGVuZHMgQ2xhc3NGaWxlQXR0cmlidXRlIGltcGxlbWVudHMgSUNvZGVBdHRyaWJ1dGUgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIElFeGNlcHRpb25UYWJsZUVudHJ5W10gTk9fRVhDRVBUSU9OX1RBQkxFID0gbmV3IElFeGNlcHRpb25UYWJsZUVudHJ5WzBdOworCXByaXZhdGUgaW50IG1heExvY2FsczsKKwlwcml2YXRlIGludCBtYXhTdGFjazsKKwlwcml2YXRlIElMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGU7CisJcHJpdmF0ZSBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSBsb2NhbFZhcmlhYmxlQXR0cmlidXRlOworCXByaXZhdGUgSUV4Y2VwdGlvblRhYmxlRW50cnlbXSBleGNlcHRpb25UYWJsZUVudHJpZXM7CisJcHJpdmF0ZSBsb25nIGNvZGVMZW5ndGg7CisJcHJpdmF0ZSBpbnQgYXR0cmlidXRlc0NvdW50OworCXByaXZhdGUgaW50IGV4Y2VwdGlvblRhYmxlTGVuZ3RoOworCXByaXZhdGUgYnl0ZVtdIGJ5dGVjb2RlczsKKwlwcml2YXRlIElDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOworCXByaXZhdGUgaW50IGNvZGVPZmZzZXQ7CisJcHJpdmF0ZSBieXRlW10gY2xhc3NGaWxlQnl0ZXM7CisJcHJpdmF0ZSBJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlczsKKwkKKwlDb2RlQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CisJCXRoaXMuY2xhc3NGaWxlQnl0ZXMgPSBjbGFzc0ZpbGVCeXRlczsKKwkJdGhpcy5jb25zdGFudFBvb2wgPSBjb25zdGFudFBvb2w7CisJCXRoaXMubWF4U3RhY2sgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOworCQl0aGlzLm1heExvY2FscyA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDgsIG9mZnNldCk7CisJCXRoaXMuY29kZUxlbmd0aCA9IHU0QXQoY2xhc3NGaWxlQnl0ZXMsIDEwLCBvZmZzZXQpOworCQl0aGlzLmNvZGVPZmZzZXQgPSBvZmZzZXQgKyAxNDsKKwkJaW50IHJlYWRPZmZzZXQgPSAoaW50KSAoMTQgKyB0aGlzLmNvZGVMZW5ndGgpOworCQl0aGlzLmV4Y2VwdGlvblRhYmxlTGVuZ3RoID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KTsKKwkJcmVhZE9mZnNldCArPSAyOworCQl0aGlzLmV4Y2VwdGlvblRhYmxlRW50cmllcyA9IE5PX0VYQ0VQVElPTl9UQUJMRTsKKwkJaWYgKHRoaXMuZXhjZXB0aW9uVGFibGVMZW5ndGggIT0gMCkgeworCQkJdGhpcy5leGNlcHRpb25UYWJsZUVudHJpZXMgPSBuZXcgRXhjZXB0aW9uVGFibGVFbnRyeVt0aGlzLmV4Y2VwdGlvblRhYmxlTGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5leGNlcHRpb25UYWJsZUxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5leGNlcHRpb25UYWJsZUVudHJpZXMgW2ldID0gbmV3IEV4Y2VwdGlvblRhYmxlRW50cnkoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJcmVhZE9mZnNldCArPSA4OworCQkJfQorCQl9CisJCXRoaXMuYXR0cmlidXRlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KTsKKwkJdGhpcy5hdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQXR0cmlidXRlLk5PX0FUVFJJQlVURVM7CisJCWlmICh0aGlzLmF0dHJpYnV0ZXNDb3VudCAhPSAwKSB7CisJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzRmlsZUF0dHJpYnV0ZVt0aGlzLmF0dHJpYnV0ZXNDb3VudF07CisJCX0KKwkJaW50IGF0dHJpYnV0ZXNJbmRleCA9IDA7CisJCXJlYWRPZmZzZXQgKz0gMjsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXNDb3VudDsgaSsrKSB7CisJCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KSk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQl9CisJCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOworCQkJaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTElORV9OVU1CRVIpKSB7CisJCQkJdGhpcy5saW5lTnVtYmVyQXR0cmlidXRlID0gbmV3IExpbmVOdW1iZXJBdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMubGluZU51bWJlckF0dHJpYnV0ZTsKKwkJCX0gZWxzZSBpZiAoZXF1YWxzKGF0dHJpYnV0ZU5hbWUsIElBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5MT0NBTF9WQVJJQUJMRSkpIHsKKwkJCQl0aGlzLmxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPSBuZXcgTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gdGhpcy5sb2NhbFZhcmlhYmxlQXR0cmlidXRlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCX0KKwkJCXJlYWRPZmZzZXQgKz0gKDYgKyB1NEF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0ICsgMiwgb2Zmc2V0KSk7CisJCX0KKwkJCisJfQorCQorCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0TWF4TG9jYWxzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heExvY2FscygpIHsKKwkJcmV0dXJuIHRoaXMubWF4TG9jYWxzOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0TWF4U3RhY2soKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWF4U3RhY2soKSB7CisJCXJldHVybiB0aGlzLm1heFN0YWNrOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpCisJICovCisJcHVibGljIElMaW5lTnVtYmVyQXR0cmlidXRlIGdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmxpbmVOdW1iZXJBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29kZUF0dHJpYnV0ZSNnZXRMb2NhbFZhcmlhYmxlQXR0cmlidXRlKCkKKwkgKi8KKwlwdWJsaWMgSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgZ2V0TG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMubG9jYWxWYXJpYWJsZUF0dHJpYnV0ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb2RlQXR0cmlidXRlI2dldEJ5dGVjb2RlcygpCisJICovCisJcHVibGljIGJ5dGVbXSBnZXRCeXRlY29kZXMoKSB7CisJCWlmICh0aGlzLmJ5dGVjb2RlcyA9PSBudWxsKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIHRoaXMuY29kZU9mZnNldCwgKHRoaXMuYnl0ZWNvZGVzID0gbmV3IGJ5dGVbKGludCkgdGhpcy5jb2RlTGVuZ3RoXSksIDAsIChpbnQpIHRoaXMuY29kZUxlbmd0aCk7IAorCQl9CisJCXJldHVybiB0aGlzLmJ5dGVjb2RlczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb2RlQXR0cmlidXRlI3RyYXZlcnNlKElCeXRlY29kZVZpc2l0b3IgdmlzaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQnl0ZWNvZGVWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCWludCBwYyA9IHRoaXMuY29kZU9mZnNldDsKKwkJaW50IG9wY29kZSwgaW5kZXgsIF9jb25zdCwgYnJhbmNoT2Zmc2V0OworCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnk7CisJCXdoaWxlICh0cnVlKSB7CisJCQlvcGNvZGUgPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDAsIHBjKTsKKwkJCXN3aXRjaChvcGNvZGUpIHsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTk9QIDoKKwkJCQkJdmlzaXRvci5fbm9wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFDT05TVF9OVUxMIDoKKwkJCQkJdmlzaXRvci5fYWNvbnN0X251bGwocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUNPTlNUX00xIDoKKwkJCQkJdmlzaXRvci5faWNvbnN0X20xKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8wIDoKKwkJCQkJdmlzaXRvci5faWNvbnN0XzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzEgOgorCQkJCQl2aXNpdG9yLl9pY29uc3RfMShwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JQ09OU1RfMiA6CisJCQkJCXZpc2l0b3IuX2ljb25zdF8yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8zIDoKKwkJCQkJdmlzaXRvci5faWNvbnN0XzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzQgOgorCQkJCQl2aXNpdG9yLl9pY29uc3RfNChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JQ09OU1RfNSA6CisJCQkJCXZpc2l0b3IuX2ljb25zdF81KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxDT05TVF8wIDoKKwkJCQkJdmlzaXRvci5fbGNvbnN0XzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTENPTlNUXzEgOgorCQkJCQl2aXNpdG9yLl9sY29uc3RfMShwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GQ09OU1RfMCA6CisJCQkJCXZpc2l0b3IuX2Zjb25zdF8wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZDT05TVF8xIDoKKwkJCQkJdmlzaXRvci5fZmNvbnN0XzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkNPTlNUXzIgOgorCQkJCQl2aXNpdG9yLl9mY29uc3RfMihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EQ09OU1RfMCA6CisJCQkJCXZpc2l0b3IuX2Rjb25zdF8wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRDT05TVF8xIDoKKwkJCQkJdmlzaXRvci5fZGNvbnN0XzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQklQVVNIIDoKKwkJCQkJdmlzaXRvci5fYmlwdXNoKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCAoYnl0ZSkgaTFBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYykpOworCQkJCQlwYys9MjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlNJUFVTSCA6CisJCQkJCXZpc2l0b3IuX3NpcHVzaChwYyAtIHRoaXMuY29kZU9mZnNldCwgKHNob3J0KSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTERDIDoKKwkJCQkJaW5kZXggPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0CisJCQkJCQkmJiBjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXIKKwkJCQkJCSYmIGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfU3RyaW5nKSB7CisJCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJdmlzaXRvci5fbGRjKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCwgY29uc3RhbnRQb29sRW50cnkpOworCQkJCQlwYys9MjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxEQ19XIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0CisJCQkJCQkmJiBjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXIKKwkJCQkJCSYmIGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfU3RyaW5nKSB7CisJCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJdmlzaXRvci5fbGRjX3cocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTERDMl9XIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0RvdWJsZQorCQkJCQkJJiYgY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nKSB7CisJCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJdmlzaXRvci5fbGRjMl93KHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCwgY29uc3RhbnRQb29sRW50cnkpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklMT0FEIDoKKwkJCQkJaW5kZXggPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWxvYWQocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MTE9BRCA6CisJCQkJCWluZGV4ID0gdTFBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2xsb2FkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCk7CisJCQkJCXBjKz0yOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQUQgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9mbG9hZChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgpOworCQkJCQlwYys9MjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEIDoKKwkJCQkJaW5kZXggPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5fZGxvYWQocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BTE9BRCA6CisJCQkJCWluZGV4ID0gdTFBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2Fsb2FkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCk7CisJCQkJCXBjKz0yOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUxPQURfMCA6CisJCQkJCXZpc2l0b3IuX2lsb2FkXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUxPQURfMSA6CisJCQkJCXZpc2l0b3IuX2lsb2FkXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUxPQURfMiA6CisJCQkJCXZpc2l0b3IuX2lsb2FkXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUxPQURfMyA6CisJCQkJCXZpc2l0b3IuX2lsb2FkXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTExPQURfMCA6CisJCQkJCXZpc2l0b3IuX2xsb2FkXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTExPQURfMSA6CisJCQkJCXZpc2l0b3IuX2xsb2FkXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTExPQURfMiA6CisJCQkJCXZpc2l0b3IuX2xsb2FkXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTExPQURfMyA6CisJCQkJCXZpc2l0b3IuX2xsb2FkXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQURfMCA6CisJCQkJCXZpc2l0b3IuX2Zsb2FkXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQURfMSA6CisJCQkJCXZpc2l0b3IuX2Zsb2FkXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQURfMiA6CisJCQkJCXZpc2l0b3IuX2Zsb2FkXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQURfMyA6CisJCQkJCXZpc2l0b3IuX2Zsb2FkXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRExPQURfMCA6CisJCQkJCXZpc2l0b3IuX2Rsb2FkXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRExPQURfMSA6CisJCQkJCXZpc2l0b3IuX2Rsb2FkXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRExPQURfMiA6CisJCQkJCXZpc2l0b3IuX2Rsb2FkXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRExPQURfMyA6CisJCQkJCXZpc2l0b3IuX2Rsb2FkXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQUxPQURfMCA6CisJCQkJCXZpc2l0b3IuX2Fsb2FkXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQUxPQURfMSA6CisJCQkJCXZpc2l0b3IuX2Fsb2FkXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQUxPQURfMiA6CisJCQkJCXZpc2l0b3IuX2Fsb2FkXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQUxPQURfMyA6CisJCQkJCXZpc2l0b3IuX2Fsb2FkXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUFMT0FEIDoKKwkJCQkJdmlzaXRvci5faWFsb2FkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxBTE9BRCA6CisJCQkJCXZpc2l0b3IuX2xhbG9hZChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GQUxPQUQgOgorCQkJCQl2aXNpdG9yLl9mYWxvYWQocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuREFMT0FEIDoKKwkJCQkJdmlzaXRvci5fZGFsb2FkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFBTE9BRCA6CisJCQkJCXZpc2l0b3IuX2FhbG9hZChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5CQUxPQUQgOgorCQkJCQl2aXNpdG9yLl9iYWxvYWQocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQ0FMT0FEIDoKKwkJCQkJdmlzaXRvci5fY2Fsb2FkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlNBTE9BRCA6CisJCQkJCXZpc2l0b3IuX3NhbG9hZChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JU1RPUkUgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9pc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MU1RPUkUgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9sc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GU1RPUkUgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9mc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EU1RPUkUgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9kc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BU1RPUkUgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9hc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4KTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JU1RPUkVfMCA6CisJCQkJCXZpc2l0b3IuX2lzdG9yZV8wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8xIDoKKwkJCQkJdmlzaXRvci5faXN0b3JlXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSVNUT1JFXzIgOgorCQkJCQl2aXNpdG9yLl9pc3RvcmVfMihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JU1RPUkVfMyA6CisJCQkJCXZpc2l0b3IuX2lzdG9yZV8zKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxTVE9SRV8wIDoKKwkJCQkJdmlzaXRvci5fbHN0b3JlXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzEgOgorCQkJCQl2aXNpdG9yLl9sc3RvcmVfMShwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MU1RPUkVfMiA6CisJCQkJCXZpc2l0b3IuX2xzdG9yZV8yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxTVE9SRV8zIDoKKwkJCQkJdmlzaXRvci5fbHN0b3JlXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRlNUT1JFXzAgOgorCQkJCQl2aXNpdG9yLl9mc3RvcmVfMChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GU1RPUkVfMSA6CisJCQkJCXZpc2l0b3IuX2ZzdG9yZV8xKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZTVE9SRV8yIDoKKwkJCQkJdmlzaXRvci5fZnN0b3JlXzIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRlNUT1JFXzMgOgorCQkJCQl2aXNpdG9yLl9mc3RvcmVfMyhwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EU1RPUkVfMCA6CisJCQkJCXZpc2l0b3IuX2RzdG9yZV8wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRTVE9SRV8xIDoKKwkJCQkJdmlzaXRvci5fZHN0b3JlXzEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRFNUT1JFXzIgOgorCQkJCQl2aXNpdG9yLl9kc3RvcmVfMihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EU1RPUkVfMyA6CisJCQkJCXZpc2l0b3IuX2RzdG9yZV8zKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV8wIDoKKwkJCQkJdmlzaXRvci5fYXN0b3JlXzAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQVNUT1JFXzEgOgorCQkJCQl2aXNpdG9yLl9hc3RvcmVfMShwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BU1RPUkVfMiA6CisJCQkJCXZpc2l0b3IuX2FzdG9yZV8yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV8zIDoKKwkJCQkJdmlzaXRvci5fYXN0b3JlXzMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2lhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTEFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2xhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2Zhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuREFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2Rhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQUFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2Fhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQkFTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2Jhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuQ0FTVE9SRSA6CisJCQkJCXZpc2l0b3IuX2Nhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuU0FTVE9SRSA6CisJCQkJCXZpc2l0b3IuX3Nhc3RvcmUocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuUE9QIDoKKwkJCQkJdmlzaXRvci5fcG9wKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlBPUDIgOgorCQkJCQl2aXNpdG9yLl9wb3AyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRVUCA6CisJCQkJCXZpc2l0b3IuX2R1cChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EVVBfWDEgOgorCQkJCQl2aXNpdG9yLl9kdXBfeDEocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRFVQX1gyIDoKKwkJCQkJdmlzaXRvci5fZHVwX3gyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRVUDIgOgorCQkJCQl2aXNpdG9yLl9kdXAyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRVUDJfWDEgOgorCQkJCQl2aXNpdG9yLl9kdXAyX3gxKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRVUDJfWDIgOgorCQkJCQl2aXNpdG9yLl9kdXAyX3gyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlNXQVAgOgorCQkJCQl2aXNpdG9yLl9zd2FwKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklBREQgOgorCQkJCQl2aXNpdG9yLl9pYWRkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxBREQgOgorCQkJCQl2aXNpdG9yLl9sYWRkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZBREQgOgorCQkJCQl2aXNpdG9yLl9mYWRkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRBREQgOgorCQkJCQl2aXNpdG9yLl9kYWRkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklTVUIgOgorCQkJCQl2aXNpdG9yLl9pc3ViKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxTVUIgOgorCQkJCQl2aXNpdG9yLl9sc3ViKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZTVUIgOgorCQkJCQl2aXNpdG9yLl9mc3ViKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRTVUIgOgorCQkJCQl2aXNpdG9yLl9kc3ViKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklNVUwgOgorCQkJCQl2aXNpdG9yLl9pbXVsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxNVUwgOgorCQkJCQl2aXNpdG9yLl9sbXVsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZNVUwgOgorCQkJCQl2aXNpdG9yLl9mbXVsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRNVUwgOgorCQkJCQl2aXNpdG9yLl9kbXVsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklESVYgOgorCQkJCQl2aXNpdG9yLl9pZGl2KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxESVYgOgorCQkJCQl2aXNpdG9yLl9sZGl2KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZESVYgOgorCQkJCQl2aXNpdG9yLl9mZGl2KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRESVYgOgorCQkJCQl2aXNpdG9yLl9kZGl2KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklSRU0gOgorCQkJCQl2aXNpdG9yLl9pcmVtKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxSRU0gOgorCQkJCQl2aXNpdG9yLl9scmVtKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZSRU0gOgorCQkJCQl2aXNpdG9yLl9mcmVtKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRSRU0gOgorCQkJCQl2aXNpdG9yLl9kcmVtKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklORUcgOgorCQkJCQl2aXNpdG9yLl9pbmVnKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxORUcgOgorCQkJCQl2aXNpdG9yLl9sbmVnKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkZORUcgOgorCQkJCQl2aXNpdG9yLl9mbmVnKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRORUcgOgorCQkJCQl2aXNpdG9yLl9kbmVnKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklTSEwgOgorCQkJCQl2aXNpdG9yLl9pc2hsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxTSEwgOgorCQkJCQl2aXNpdG9yLl9sc2hsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklTSFIgOgorCQkJCQl2aXNpdG9yLl9pc2hyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxTSFIgOgorCQkJCQl2aXNpdG9yLl9sc2hyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklVU0hSIDoKKwkJCQkJdmlzaXRvci5faXVzaHIocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTFVTSFIgOgorCQkJCQl2aXNpdG9yLl9sdXNocihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JQU5EIDoKKwkJCQkJdmlzaXRvci5faWFuZChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MQU5EIDoKKwkJCQkJdmlzaXRvci5fbGFuZChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JT1IgOgorCQkJCQl2aXNpdG9yLl9pb3IocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTE9SIDoKKwkJCQkJdmlzaXRvci5fbG9yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklYT1IgOgorCQkJCQl2aXNpdG9yLl9peG9yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxYT1IgOgorCQkJCQl2aXNpdG9yLl9seG9yKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklJTkMgOgorCQkJCQlpbmRleCA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQlfY29uc3QgPSBpMUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDIsIHBjKTsKKwkJCQkJdmlzaXRvci5faWluYyhwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIF9jb25zdCk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSTJMIDoKKwkJCQkJdmlzaXRvci5faTJsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkkyRiA6CisJCQkJCXZpc2l0b3IuX2kyZihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JMkQgOgorCQkJCQl2aXNpdG9yLl9pMmQocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTDJJIDoKKwkJCQkJdmlzaXRvci5fbDJpKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkwyRiA6CisJCQkJCXZpc2l0b3IuX2wyZihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MMkQgOgorCQkJCQl2aXNpdG9yLl9sMmQocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRjJJIDoKKwkJCQkJdmlzaXRvci5fZjJpKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkYyTCA6CisJCQkJCXZpc2l0b3IuX2YybChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GMkQgOgorCQkJCQl2aXNpdG9yLl9mMmQocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRDJJIDoKKwkJCQkJdmlzaXRvci5fZDJpKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkQyTCA6CisJCQkJCXZpc2l0b3IuX2QybChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EMkYgOgorCQkJCQl2aXNpdG9yLl9kMmYocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSTJCIDoKKwkJCQkJdmlzaXRvci5faTJiKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkkyQyA6CisJCQkJCXZpc2l0b3IuX2kyYyhwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JMlMgOgorCQkJCQl2aXNpdG9yLl9pMnMocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTENNUCA6CisJCQkJCXZpc2l0b3IuX2xjbXAocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkNNUEwgOgorCQkJCQl2aXNpdG9yLl9mY21wbChwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GQ01QRyA6CisJCQkJCXZpc2l0b3IuX2ZjbXBnKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkRDTVBMIDoKKwkJCQkJdmlzaXRvci5fZGNtcGwocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRENNUEcgOgorCQkJCQl2aXNpdG9yLl9kY21wZyhwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRkVRIDoKKwkJCQkJYnJhbmNoT2Zmc2V0ID0gaTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2lmZXEocGMgLSB0aGlzLmNvZGVPZmZzZXQgLCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklGTkUgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZuZShwYyAtIHRoaXMuY29kZU9mZnNldCAsIGJyYW5jaE9mZnNldCk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUZMVCA6CisJCQkJCWJyYW5jaE9mZnNldCA9IGkyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9pZmx0KHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRkdFIDoKKwkJCQkJYnJhbmNoT2Zmc2V0ID0gaTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2lmZ2UocGMgLSB0aGlzLmNvZGVPZmZzZXQgLCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklGR1QgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZndChwYyAtIHRoaXMuY29kZU9mZnNldCAsIGJyYW5jaE9mZnNldCk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSUZMRSA6CisJCQkJCWJyYW5jaE9mZnNldCA9IGkyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9pZmxlKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QRVEgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcGVxKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTkUgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcG5lKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTFQgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcGx0KHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QR0UgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcGdlKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QR1QgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcGd0KHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTEUgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfaWNtcGxlKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9BQ01QRVEgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfYWNtcGVxKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRl9BQ01QTkUgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZfYWNtcG5lKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5HT1RPIDoKKwkJCQkJYnJhbmNoT2Zmc2V0ID0gaTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2dvdG8ocGMgLSB0aGlzLmNvZGVPZmZzZXQgLCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkpTUiA6CisJCQkJCWJyYW5jaE9mZnNldCA9IGkyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQl2aXNpdG9yLl9qc3IocGMgLSB0aGlzLmNvZGVPZmZzZXQgLCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlJFVCA6CisJCQkJCWluZGV4ID0gdTFBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX3JldChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgpOworCQkJCQlwYys9MjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlRBQkxFU1dJVENIIDoKKwkJCQkJaW50IHN0YXJ0cGMgPSBwYzsKKwkJCQkJcGMrKzsKKwkJCQkJd2hpbGUgKCgocGMgLSB0aGlzLmNvZGVPZmZzZXQpICUgNCkgIT0gMCkgeworCQkJCQkJcGMrKzsKKwkJCQkJfQorCQkJCQlpbnQgZGVmYXVsdE9mZnNldCA9IGk0QXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgcGMpOworCQkJCQlwYyArPSA0OworCQkJCQlpbnQgbG93ID0gaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAwLCBwYyk7CisJCQkJCXBjICs9IDQ7CisJCQkJCWludCBoaWdoID0gaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAwLCBwYyk7CisJCQkJCXBjICs9IDQ7CisJCQkJCWludCBsZW5ndGggPSBoaWdoIC0gbG93ICsgMTsKKwkJCQkJaW50W10ganVtcE9mZnNldHMgPSBuZXcgaW50W2xlbmd0aF07CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCWp1bXBPZmZzZXRzW2ldID0gaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAwLCBwYyk7CisJCQkJCQlwYyArPSA0OworCQkJCQl9CisJCQkJCXZpc2l0b3IuX3RhYmxlc3dpdGNoKHN0YXJ0cGMgLSB0aGlzLmNvZGVPZmZzZXQsIGRlZmF1bHRPZmZzZXQsIGxvdywgaGlnaCwganVtcE9mZnNldHMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTE9PS1VQU1dJVENIIDoKKwkJCQkJc3RhcnRwYyA9IHBjOworCQkJCQlwYysrOworCQkJCQl3aGlsZSAoKChwYyAtIHRoaXMuY29kZU9mZnNldCkgJSA0KSAhPSAwKSB7CisJCQkJCQlwYysrOworCQkJCQl9CisJCQkJCWRlZmF1bHRPZmZzZXQgPSBpNEF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDAsIHBjKTsKKwkJCQkJcGMgKz0gNDsKKwkJCQkJaW50IG5wYWlycyA9IChpbnQpIHU0QXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgcGMpOworCQkJCQlpbnRbXVtdIG9mZnNldF9wYWlycyA9IG5ldyBpbnRbbnBhaXJzXVsyXTsKKwkJCQkJcGMgKz0gNDsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBucGFpcnM7IGkrKykgeworCQkJCQkJb2Zmc2V0X3BhaXJzW2ldWzBdID0gaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAwLCBwYyk7CisJCQkJCQlwYyArPSA0OworCQkJCQkJb2Zmc2V0X3BhaXJzW2ldWzFdID0gaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAwLCBwYyk7CisJCQkJCQlwYyArPSA0OworCQkJCQl9CisJCQkJCXZpc2l0b3IuX2xvb2t1cHN3aXRjaChzdGFydHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBkZWZhdWx0T2Zmc2V0LCBucGFpcnMsIG9mZnNldF9wYWlycyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JUkVUVVJOIDoKKwkJCQkJdmlzaXRvci5faXJldHVybihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MUkVUVVJOIDoKKwkJCQkJdmlzaXRvci5fbHJldHVybihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5GUkVUVVJOIDoKKwkJCQkJdmlzaXRvci5fZnJldHVybihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5EUkVUVVJOIDoKKwkJCQkJdmlzaXRvci5fZHJldHVybihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BUkVUVVJOIDoKKwkJCQkJdmlzaXRvci5fYXJldHVybihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5SRVRVUk4gOgorCQkJCQl2aXNpdG9yLl9yZXR1cm4ocGMgLSB0aGlzLmNvZGVPZmZzZXQpOworCQkJCQlwYysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuR0VUU1RBVElDIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9nZXRzdGF0aWMocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuUFVUU1RBVElDIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9wdXRzdGF0aWMocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuR0VURklFTEQgOgorCQkJCQlpbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQljb25zdGFudFBvb2xFbnRyeSA9IHRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGluZGV4KTsKKwkJCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRmllbGRyZWYpIHsKKwkJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJCQl9CisJCQkJCXZpc2l0b3IuX2dldGZpZWxkKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCwgY29uc3RhbnRQb29sRW50cnkpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlBVVEZJRUxEIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9wdXRmaWVsZChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTlZPS0VWSVJUVUFMIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX01ldGhvZHJlZikgeworCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJdmlzaXRvci5faW52b2tldmlydHVhbChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTlZPS0VTUEVDSUFMIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX01ldGhvZHJlZikgeworCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJdmlzaXRvci5faW52b2tlc3BlY2lhbChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTlZPS0VTVEFUSUMgOgorCQkJCQlpbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQljb25zdGFudFBvb2xFbnRyeSA9IHRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGluZGV4KTsKKwkJCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfTWV0aG9kcmVmKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9pbnZva2VzdGF0aWMocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuSU5WT0tFSU5URVJGQUNFIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVyZmFjZU1ldGhvZHJlZikgeworCQkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQkJCX0KKwkJCQkJYnl0ZSBjb3VudCA9IChieXRlKSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDMsIHBjKTsKKwkJCQkJaW50IGV4dHJhQXJncyA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgNCwgcGMpOworCQkJCQlpZiAoZXh0cmFBcmdzICE9IDApIHsKKwkJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0FSR1VNRU5UU19GT1JfSU5WT0tFSU5URVJGQUNFKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9pbnZva2VpbnRlcmZhY2UocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb3VudCwgY29uc3RhbnRQb29sRW50cnkpOworCQkJCQlwYyArPSA1OworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTkVXIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9uZXcocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGluZGV4LCBjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJCXBjKz0zOworCQkJCQlicmVhazsKKwkJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuTkVXQVJSQVkgOgorCQkJCQlpbnQgYXR5cGUgPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5fbmV3YXJyYXkocGMgLSB0aGlzLmNvZGVPZmZzZXQsIGF0eXBlKTsKKwkJCQkJcGMrPTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BTkVXQVJSQVkgOgorCQkJCQlpbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQljb25zdGFudFBvb2xFbnRyeSA9IHRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGluZGV4KTsKKwkJCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfQ2xhc3MpIHsKKwkJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJCQl9CisJCQkJCXZpc2l0b3IuX2FuZXdhcnJheShwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BUlJBWUxFTkdUSCA6CisJCQkJCXZpc2l0b3IuX2FycmF5bGVuZ3RoKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFUSFJPVyA6CisJCQkJCXZpc2l0b3IuX2F0aHJvdyhwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5DSEVDS0NBU1QgOgorCQkJCQlpbmRleCA9IHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMSwgcGMpOworCQkJCQljb25zdGFudFBvb2xFbnRyeSA9IHRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KGluZGV4KTsKKwkJCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfQ2xhc3MpIHsKKwkJCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJCQl9CisJCQkJCXZpc2l0b3IuX2NoZWNrY2FzdChwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JTlNUQU5DRU9GIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQl2aXNpdG9yLl9pbnN0YW5jZW9mKHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBpbmRleCwgY29uc3RhbnRQb29sRW50cnkpOworCQkJCQlwYys9MzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLk1PTklUT1JFTlRFUiA6CisJCQkJCXZpc2l0b3IuX21vbml0b3JlbnRlcihwYyAtIHRoaXMuY29kZU9mZnNldCk7CisJCQkJCXBjKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5NT05JVE9SRVhJVCA6CisJCQkJCXZpc2l0b3IuX21vbml0b3JleGl0KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLldJREUgOgorCQkJCQlvcGNvZGUgPSB1MUF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJaWYgKG9wY29kZSA9PSBJT3Bjb2RlTW5lbW9uaWNzLklJTkMpIHsKKwkJCQkJCWluZGV4ID0gdTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAyLCBwYyk7CisJCQkJCQlfY29uc3QgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDQsIHBjKTsKKwkJCQkJCXZpc2l0b3IuX3dpZGUocGMgLSB0aGlzLmNvZGVPZmZzZXQsIG9wY29kZSwgaW5kZXgsIF9jb25zdCk7CisJCQkJCQlwYyArPSA2OworCQkJCQl9IGVsc2UgeworCQkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDIsIHBjKTsKKwkJCQkJCXZpc2l0b3IuX3dpZGUocGMgLSB0aGlzLmNvZGVPZmZzZXQgLCBvcGNvZGUsIGluZGV4KTsKKwkJCQkJCXBjICs9IDQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLk1VTFRJQU5FV0FSUkFZIDoKKwkJCQkJaW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJY29uc3RhbnRQb29sRW50cnkgPSB0aGlzLmNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShpbmRleCk7CisJCQkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzKSB7CisJCQkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCQkJfQorCQkJCQlpbnQgZGltZW5zaW9ucyA9IHUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMywgcGMpOworCQkJCQl2aXNpdG9yLl9tdWx0aWFuZXdhcnJheShwYyAtIHRoaXMuY29kZU9mZnNldCwgaW5kZXgsIGRpbWVuc2lvbnMsIGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQkJcGMrPTQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRk5VTEwgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZudWxsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JRk5PTk5VTEwgOgorCQkJCQlicmFuY2hPZmZzZXQgPSBpMkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5faWZub25udWxsKHBjIC0gdGhpcy5jb2RlT2Zmc2V0ICwgYnJhbmNoT2Zmc2V0KTsKKwkJCQkJcGMrPTM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5HT1RPX1cgOgorCQkJCQlicmFuY2hPZmZzZXQgPSAoaW50KSBpNEF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsIDEsIHBjKTsKKwkJCQkJdmlzaXRvci5fZ290b193KHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9NTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkpTUl9XIDoKKwkJCQkJYnJhbmNoT2Zmc2V0ID0gKGludCkgaTRBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAxLCBwYyk7CisJCQkJCXZpc2l0b3IuX2pzcl93KHBjIC0gdGhpcy5jb2RlT2Zmc2V0LCBicmFuY2hPZmZzZXQpOworCQkJCQlwYys9NTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkJSRUFLUE9JTlQgOgorCQkJCQl2aXNpdG9yLl9icmVha3BvaW50KHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDEgOgorCQkJCQl2aXNpdG9yLl9pbXBkZXAxKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklNUERFUDIgOgorCQkJCQl2aXNpdG9yLl9pbXBkZXAyKHBjIC0gdGhpcy5jb2RlT2Zmc2V0KTsKKwkJCQkJcGMrKzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQllURUNPREUpOwkJCQorCQkJfQorCQkJaWYgKHBjID49ICh0aGlzLmNvZGVMZW5ndGggKyB0aGlzLmNvZGVPZmZzZXQpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb2RlQXR0cmlidXRlI2dldEV4Y2VwdGlvblRhYmxlKCkKKwkgKi8KKwlwdWJsaWMgSUV4Y2VwdGlvblRhYmxlRW50cnlbXSBnZXRFeGNlcHRpb25UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uVGFibGVFbnRyaWVzOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlc0NvdW50KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZXNDb3VudCgpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0NvdW50OworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0Q29kZUxlbmd0aCgpCisJICovCisJcHVibGljIGxvbmcgZ2V0Q29kZUxlbmd0aCgpIHsKKwkJcmV0dXJuIHRoaXMuY29kZUxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb2RlQXR0cmlidXRlI2dldEV4Y2VwdGlvblRhYmxlTGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEV4Y2VwdGlvblRhYmxlTGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5leGNlcHRpb25UYWJsZUxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDbGFzc0ZpbGVBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQlyZXR1cm4gSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNPREU7CisJfQorCS8qKgorCSAqIEBzZWUgSUNvZGVBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlcygpCisJICovCisJcHVibGljIElDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMGY0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJQ29uc3RhbnRQb29sLgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRQb29sIGV4dGVuZHMgQ2xhc3NGaWxlU3RydWN0IGltcGxlbWVudHMgSUNvbnN0YW50UG9vbCB7CisJCisJcHJpdmF0ZSBpbnQgY29uc3RhbnRQb29sQ291bnQ7CisJcHJpdmF0ZSBpbnRbXSBjb25zdGFudFBvb2xPZmZzZXQ7CisJcHJpdmF0ZSBieXRlW10gY2xhc3NGaWxlQnl0ZXM7CisJcHJpdmF0ZSBDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeTsKKwkKKwlDb25zdGFudFBvb2woYnl0ZVtdIHJlZmVyZW5jZSwgaW50W10gY29uc3RhbnRQb29sT2Zmc2V0KSB7CisJCXRoaXMuY29uc3RhbnRQb29sQ291bnQgPSBjb25zdGFudFBvb2xPZmZzZXQubGVuZ3RoOworCQl0aGlzLmNvbnN0YW50UG9vbE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldDsKKwkJdGhpcy5jbGFzc0ZpbGVCeXRlcyA9IHJlZmVyZW5jZTsKKwkJdGhpcy5jb25zdGFudFBvb2xFbnRyeSA9IG5ldyBDb25zdGFudFBvb2xFbnRyeSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbCNkZWNvZGVFbnRyeShpbnQpCisJICovCisJcHVibGljIElDb25zdGFudFBvb2xFbnRyeSBkZWNvZGVFbnRyeShpbnQgaW5kZXgpIHsKKwkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5yZXNldCgpOworCQlpbnQga2luZCA9IGdldEVudHJ5S2luZChpbmRleCk7CisJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0S2luZChraW5kKTsKKwkJc3dpdGNoKGtpbmQpIHsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzIDoKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldENsYXNzSW5mb05hbWVJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldENsYXNzSW5mb05hbWUoZ2V0VXRmOFZhbHVlQXQodGhpcy5jb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZm9OYW1lSW5kZXgoKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRG91YmxlIDoKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldERvdWJsZVZhbHVlKGRvdWJsZUF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ZpZWxkcmVmIDoKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldENsYXNzSW5kZXgodTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CisJCQkJaW50IGRlY2xhcmluZ0NsYXNzSW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5kZXgoKV0pOworCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NOYW1lKGdldFV0ZjhWYWx1ZUF0KGRlY2xhcmluZ0NsYXNzSW5kZXgpKTsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldE5hbWVBbmRUeXBlSW5kZXgodTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMywgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CisJCQkJaW50IGZpZWxkTmFtZUluZGV4ID0gdTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdGhpcy5jb25zdGFudFBvb2xFbnRyeS5nZXROYW1lQW5kVHlwZUluZGV4KCldKTsKKwkJCQlpbnQgZmllbGREZXNjcmlwdG9ySW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAzLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldE5hbWVBbmRUeXBlSW5kZXgoKV0pOworCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0RmllbGROYW1lKGdldFV0ZjhWYWx1ZUF0KGZpZWxkTmFtZUluZGV4KSk7CisJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRGaWVsZERlc2NyaXB0b3IoZ2V0VXRmOFZhbHVlQXQoZmllbGREZXNjcmlwdG9ySW5kZXgpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX01ldGhvZHJlZiA6CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgOgorCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0Q2xhc3NJbmRleCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQlkZWNsYXJpbmdDbGFzc0luZGV4ID0gdTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdGhpcy5jb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZGV4KCldKTsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldENsYXNzTmFtZShnZXRVdGY4VmFsdWVBdChkZWNsYXJpbmdDbGFzc0luZGV4KSk7CisJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXROYW1lQW5kVHlwZUluZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDMsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOworCQkJCWludCBtZXRob2ROYW1lSW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldE5hbWVBbmRUeXBlSW5kZXgoKV0pOworCQkJCWludCBtZXRob2REZXNjcmlwdG9ySW5kZXggPSB1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAzLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFt0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldE5hbWVBbmRUeXBlSW5kZXgoKV0pOworCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TWV0aG9kTmFtZShnZXRVdGY4VmFsdWVBdChtZXRob2ROYW1lSW5kZXgpKTsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldE1ldGhvZERlc2NyaXB0b3IoZ2V0VXRmOFZhbHVlQXQobWV0aG9kRGVzY3JpcHRvckluZGV4KSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9GbG9hdCA6CisJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRGbG9hdFZhbHVlKGZsb2F0QXQoY2xhc3NGaWxlQnl0ZXMsIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfSW50ZWdlciA6CisJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRJbnRlZ2VyVmFsdWUoaTRBdChjbGFzc0ZpbGVCeXRlcywgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nIDoKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldExvbmdWYWx1ZShpOEF0KGNsYXNzRmlsZUJ5dGVzLCAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX05hbWVBbmRUeXBlIDoKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldE5hbWVBbmRUeXBlTmFtZUluZGV4KHUyQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgIDEsIHRoaXMuY29uc3RhbnRQb29sT2Zmc2V0W2luZGV4XSkpOworCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0TmFtZUFuZFR5cGVEZXNjcmlwdG9ySW5kZXgodTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMywgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9TdHJpbmcgOgorCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0U3RyaW5nSW5kZXgodTJBdCh0aGlzLmNsYXNzRmlsZUJ5dGVzLCAgMSwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKSk7CisJCQkJdGhpcy5jb25zdGFudFBvb2xFbnRyeS5zZXRTdHJpbmdWYWx1ZShnZXRVdGY4VmFsdWVBdCh0aGlzLmNvbnN0YW50UG9vbEVudHJ5LmdldFN0cmluZ0luZGV4KCkpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjggOgorCQkJCXRoaXMuY29uc3RhbnRQb29sRW50cnkuc2V0VXRmOExlbmd0aCh1MkF0KHRoaXMuY2xhc3NGaWxlQnl0ZXMsICAxLCB0aGlzLmNvbnN0YW50UG9vbE9mZnNldFtpbmRleF0pKTsKKwkJCQl0aGlzLmNvbnN0YW50UG9vbEVudHJ5LnNldFV0ZjhWYWx1ZShnZXRVdGY4VmFsdWVBdChpbmRleCkpOworCQl9CisJCXJldHVybiB0aGlzLmNvbnN0YW50UG9vbEVudHJ5OworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbCNnZXRDb25zdGFudFBvb2xDb3VudCgpCisJICovCisJcHVibGljIGludCBnZXRDb25zdGFudFBvb2xDb3VudCgpIHsKKwkJcmV0dXJuIHRoaXMuY29uc3RhbnRQb29sQ291bnQ7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sI2dldEVudHJ5S2luZChpbnQpCisJICovCisJcHVibGljIGludCBnZXRFbnRyeUtpbmQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnUxQXQodGhpcy5jbGFzc0ZpbGVCeXRlcywgMCwgdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbaW5kZXhdKTsKKwl9CisKKwlwcml2YXRlIGNoYXJbXSBnZXRVdGY4VmFsdWVBdChpbnQgdXRmOEluZGV4KSB7CisJCWludCB1dGY4T2Zmc2V0ID0gdGhpcy5jb25zdGFudFBvb2xPZmZzZXRbdXRmOEluZGV4XTsKKwkJcmV0dXJuIHV0ZjhBdChjbGFzc0ZpbGVCeXRlcywgMCwgdXRmOE9mZnNldCArIDMsIHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDAsIHV0ZjhPZmZzZXQgKyAxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Y2Y3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKQEAgLTAsMCArMSwzODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElDb25zdGFudFBvb2xFbnRyeQorICogCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudFBvb2xFbnRyeSBpbXBsZW1lbnRzIElDb25zdGFudFBvb2xFbnRyeSB7CisKKwlwcml2YXRlIGludCBraW5kOworCXByaXZhdGUgaW50IGNsYXNzSW5mb05hbWVJbmRleDsKKwlwcml2YXRlIGludCBjbGFzc0luZGV4OworCXByaXZhdGUgaW50IG5hbWVBbmRUeXBlSW5kZXg7CisJcHJpdmF0ZSBpbnQgc3RyaW5nSW5kZXg7CisJcHJpdmF0ZSBjaGFyW10gc3RyaW5nVmFsdWU7CisJcHJpdmF0ZSBpbnQgaW50ZWdlclZhbHVlOworCXByaXZhdGUgZmxvYXQgZmxvYXRWYWx1ZTsKKwlwcml2YXRlIGRvdWJsZSBkb3VibGVWYWx1ZTsKKwlwcml2YXRlIGxvbmcgbG9uZ1ZhbHVlOworCXByaXZhdGUgaW50IG5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4OworCXByaXZhdGUgaW50IG5hbWVBbmRUeXBlTmFtZUluZGV4OworCXByaXZhdGUgY2hhcltdIGNsYXNzTmFtZTsKKwlwcml2YXRlIGNoYXJbXSBmaWVsZE5hbWU7CisJcHJpdmF0ZSBjaGFyW10gbWV0aG9kTmFtZTsKKwlwcml2YXRlIGNoYXJbXSBmaWVsZERlc2NyaXB0b3I7CisJcHJpdmF0ZSBjaGFyW10gbWV0aG9kRGVzY3JpcHRvcjsKKwlwcml2YXRlIGNoYXJbXSB1dGY4VmFsdWU7CisJcHJpdmF0ZSBpbnQgdXRmOExlbmd0aDsKKwlwcml2YXRlIGNoYXJbXSBjbGFzc0luZm9OYW1lOworCQorCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldEtpbmQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKwkJcmV0dXJuIHRoaXMua2luZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBraW5kLgorCSAqIEBwYXJhbSBraW5kIFRoZSBraW5kIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEtpbmQoaW50IGtpbmQpIHsKKwkJdGhpcy5raW5kID0ga2luZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRDbGFzc0luZm9OYW1lSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2xhc3NJbmZvTmFtZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc0luZm9OYW1lSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0Q2xhc3NJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRDbGFzc0luZGV4KCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc0luZGV4OworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldE5hbWVBbmRUeXBlSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmFtZUFuZFR5cGVJbmRleCgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZUFuZFR5cGVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRTdHJpbmdJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRTdHJpbmdJbmRleCgpIHsKKwkJcmV0dXJuIHRoaXMuc3RyaW5nSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0U3RyaW5nVmFsdWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKHRoaXMuc3RyaW5nVmFsdWUpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldEludGVnZXJWYWx1ZSgpCisJICovCisJcHVibGljIGludCBnZXRJbnRlZ2VyVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmludGVnZXJWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRGbG9hdFZhbHVlKCkKKwkgKi8KKwlwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZmxvYXRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXREb3VibGVWYWx1ZSgpCisJICovCisJcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZG91YmxlVmFsdWU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0TG9uZ1ZhbHVlKCkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmxvbmdWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXROYW1lQW5kVHlwZUluZm9EZXNjcmlwdG9ySW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmFtZUFuZFR5cGVJbmZvRGVzY3JpcHRvckluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5uYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXROYW1lQW5kVHlwZUluZm9OYW1lSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmFtZUFuZFR5cGVJbmZvTmFtZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5uYW1lQW5kVHlwZU5hbWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRDbGFzc05hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0RmllbGROYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEZpZWxkTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZmllbGROYW1lOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldE1ldGhvZE5hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0TWV0aG9kTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubWV0aG9kTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRGaWVsZERlc2NyaXB0b3IoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0RmllbGREZXNjcmlwdG9yKCkgeworCQlyZXR1cm4gdGhpcy5maWVsZERlc2NyaXB0b3I7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0TWV0aG9kRGVzY3JpcHRvcigpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRNZXRob2REZXNjcmlwdG9yKCkgeworCQlyZXR1cm4gdGhpcy5tZXRob2REZXNjcmlwdG9yOworCX0KKworCS8qKgorCSAqIEBzZWUgSUNvbnN0YW50UG9vbEVudHJ5I2dldFV0ZjhWYWx1ZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRVdGY4VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnV0ZjhWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFBvb2xFbnRyeSNnZXRDbGFzc0luZm9OYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldENsYXNzSW5mb05hbWUoKSB7CisJCXJldHVybiB0aGlzLmNsYXNzSW5mb05hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY2xhc3NJbmZvTmFtZUluZGV4LgorCSAqIEBwYXJhbSBjbGFzc0luZm9OYW1lSW5kZXggVGhlIGNsYXNzSW5mb05hbWVJbmRleCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDbGFzc0luZm9OYW1lSW5kZXgoaW50IGNsYXNzSW5mb05hbWVJbmRleCkgeworCQl0aGlzLmNsYXNzSW5mb05hbWVJbmRleCA9IGNsYXNzSW5mb05hbWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjbGFzc0luZGV4LgorCSAqIEBwYXJhbSBjbGFzc0luZGV4IFRoZSBjbGFzc0luZGV4IHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsYXNzSW5kZXgoaW50IGNsYXNzSW5kZXgpIHsKKwkJdGhpcy5jbGFzc0luZGV4ID0gY2xhc3NJbmRleDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lQW5kVHlwZUluZGV4LgorCSAqIEBwYXJhbSBuYW1lQW5kVHlwZUluZGV4IFRoZSBuYW1lQW5kVHlwZUluZGV4IHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWVBbmRUeXBlSW5kZXgoaW50IG5hbWVBbmRUeXBlSW5kZXgpIHsKKwkJdGhpcy5uYW1lQW5kVHlwZUluZGV4ID0gbmFtZUFuZFR5cGVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzdHJpbmdJbmRleC4KKwkgKiBAcGFyYW0gc3RyaW5nSW5kZXggVGhlIHN0cmluZ0luZGV4IHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0cmluZ0luZGV4KGludCBzdHJpbmdJbmRleCkgeworCQl0aGlzLnN0cmluZ0luZGV4ID0gc3RyaW5nSW5kZXg7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgc3RyaW5nVmFsdWUuCisJICogQHBhcmFtIHN0cmluZ1ZhbHVlIFRoZSBzdHJpbmdWYWx1ZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShjaGFyW10gc3RyaW5nVmFsdWUpIHsKKwkJdGhpcy5zdHJpbmdWYWx1ZSA9IHN0cmluZ1ZhbHVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGludGVnZXJWYWx1ZS4KKwkgKiBAcGFyYW0gaW50ZWdlclZhbHVlIFRoZSBpbnRlZ2VyVmFsdWUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0SW50ZWdlclZhbHVlKGludCBpbnRlZ2VyVmFsdWUpIHsKKwkJdGhpcy5pbnRlZ2VyVmFsdWUgPSBpbnRlZ2VyVmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZmxvYXRWYWx1ZS4KKwkgKiBAcGFyYW0gZmxvYXRWYWx1ZSBUaGUgZmxvYXRWYWx1ZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHsKKwkJdGhpcy5mbG9hdFZhbHVlID0gZmxvYXRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBkb3VibGVWYWx1ZS4KKwkgKiBAcGFyYW0gZG91YmxlVmFsdWUgVGhlIGRvdWJsZVZhbHVlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlKGRvdWJsZSBkb3VibGVWYWx1ZSkgeworCQl0aGlzLmRvdWJsZVZhbHVlID0gZG91YmxlVmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbG9uZ1ZhbHVlLgorCSAqIEBwYXJhbSBsb25nVmFsdWUgVGhlIGxvbmdWYWx1ZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyBsb25nVmFsdWUpIHsKKwkJdGhpcy5sb25nVmFsdWUgPSBsb25nVmFsdWU7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgbmFtZUFuZFR5cGVEZXNjcmlwdG9ySW5kZXguCisJICogQHJldHVybiBSZXR1cm5zIGEgaW50CisJICovCisJcHVibGljIGludCBnZXROYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleCgpIHsKKwkJcmV0dXJuIG5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4LgorCSAqIEBwYXJhbSBuYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleCBUaGUgbmFtZUFuZFR5cGVEZXNjcmlwdG9ySW5kZXggdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZUFuZFR5cGVEZXNjcmlwdG9ySW5kZXgoaW50IG5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4KSB7CisJCXRoaXMubmFtZUFuZFR5cGVEZXNjcmlwdG9ySW5kZXggPSBuYW1lQW5kVHlwZURlc2NyaXB0b3JJbmRleDsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBuYW1lQW5kVHlwZU5hbWVJbmRleC4KKwkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldE5hbWVBbmRUeXBlTmFtZUluZGV4KCkgeworCQlyZXR1cm4gbmFtZUFuZFR5cGVOYW1lSW5kZXg7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbmFtZUFuZFR5cGVOYW1lSW5kZXguCisJICogQHBhcmFtIG5hbWVBbmRUeXBlTmFtZUluZGV4IFRoZSBuYW1lQW5kVHlwZU5hbWVJbmRleCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lQW5kVHlwZU5hbWVJbmRleChpbnQgbmFtZUFuZFR5cGVOYW1lSW5kZXgpIHsKKwkJdGhpcy5uYW1lQW5kVHlwZU5hbWVJbmRleCA9IG5hbWVBbmRUeXBlTmFtZUluZGV4OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNsYXNzTmFtZS4KKwkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzc05hbWUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKGNoYXJbXSBjbGFzc05hbWUpIHsKKwkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZmllbGROYW1lLgorCSAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIGZpZWxkTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWVsZE5hbWUoY2hhcltdIGZpZWxkTmFtZSkgeworCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBtZXRob2ROYW1lLgorCSAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2ROYW1lIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoY2hhcltdIG1ldGhvZE5hbWUpIHsKKwkJdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBmaWVsZERlc2NyaXB0b3IuCisJICogQHBhcmFtIGZpZWxkRGVzY3JpcHRvciBUaGUgZmllbGREZXNjcmlwdG9yIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpZWxkRGVzY3JpcHRvcihjaGFyW10gZmllbGREZXNjcmlwdG9yKSB7CisJCXRoaXMuZmllbGREZXNjcmlwdG9yID0gZmllbGREZXNjcmlwdG9yOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1ldGhvZERlc2NyaXB0b3IuCisJICogQHBhcmFtIG1ldGhvZERlc2NyaXB0b3IgVGhlIG1ldGhvZERlc2NyaXB0b3IgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TWV0aG9kRGVzY3JpcHRvcihjaGFyW10gbWV0aG9kRGVzY3JpcHRvcikgeworCQl0aGlzLm1ldGhvZERlc2NyaXB0b3IgPSBtZXRob2REZXNjcmlwdG9yOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHV0ZjhWYWx1ZS4KKwkgKiBAcGFyYW0gdXRmOFZhbHVlIFRoZSB1dGY4VmFsdWUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VXRmOFZhbHVlKGNoYXJbXSB1dGY4VmFsdWUpIHsKKwkJdGhpcy51dGY4VmFsdWUgPSB1dGY4VmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY2xhc3NJbmZvTmFtZS4KKwkgKiBAcGFyYW0gY2xhc3NJbmZvTmFtZSBUaGUgY2xhc3NJbmZvTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDbGFzc0luZm9OYW1lKGNoYXJbXSBjbGFzc0luZm9OYW1lKSB7CisJCXRoaXMuY2xhc3NJbmZvTmFtZSA9IGNsYXNzSW5mb05hbWU7CisJfQorCisJLyoqCisJICogQHNlZSBJQ29uc3RhbnRQb29sRW50cnkjZ2V0VXRmOExlbmd0aCgpCisJICovCisJcHVibGljIGludCBnZXRVdGY4TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy51dGY4TGVuZ3RoOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHV0ZjhMZW5ndGguCisJICogQHBhcmFtIHV0ZjhMZW5ndGggVGhlIHV0ZjhMZW5ndGggdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VXRmOExlbmd0aChpbnQgdXRmOExlbmd0aCkgeworCQl0aGlzLnV0ZjhMZW5ndGggPSB1dGY4TGVuZ3RoOworCX0KKworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQl0aGlzLmtpbmQgPSAwOworCQl0aGlzLmNsYXNzSW5mb05hbWVJbmRleCA9IDA7CisJCXRoaXMuY2xhc3NJbmRleCA9IDA7CisJCXRoaXMubmFtZUFuZFR5cGVJbmRleCA9IDA7CisJCXRoaXMuc3RyaW5nSW5kZXggPSAwOworCQl0aGlzLnN0cmluZ1ZhbHVlID0gbnVsbDsKKwkJdGhpcy5pbnRlZ2VyVmFsdWUgPSAwOworCQl0aGlzLmZsb2F0VmFsdWUgPSAwLjBmOworCQl0aGlzLmRvdWJsZVZhbHVlID0gMC4wOworCQl0aGlzLmxvbmdWYWx1ZSA9IDBMOworCQl0aGlzLm5hbWVBbmRUeXBlRGVzY3JpcHRvckluZGV4ID0gMDsKKwkJdGhpcy5uYW1lQW5kVHlwZU5hbWVJbmRleCA9IDA7CisJCXRoaXMuY2xhc3NOYW1lID0gbnVsbDsKKwkJdGhpcy5maWVsZE5hbWUgPSBudWxsOworCQl0aGlzLm1ldGhvZE5hbWUgPSBudWxsOworCQl0aGlzLmZpZWxkRGVzY3JpcHRvciA9IG51bGw7CisJCXRoaXMubWV0aG9kRGVzY3JpcHRvciA9IG51bGw7CisJCXRoaXMudXRmOFZhbHVlID0gbnVsbDsKKwkJdGhpcy51dGY4TGVuZ3RoID0gMDsKKwkJdGhpcy5jbGFzc0luZm9OYW1lID0gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYmI3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklBdHRyaWJ1dGVOYW1lc0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElDb25zdGFudFZhbHVlQXR0cmlidXRlLgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZQorCWV4dGVuZHMgQ2xhc3NGaWxlQXR0cmlidXRlCisJaW1wbGVtZW50cyBJQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSB7CisJCisJcHJpdmF0ZSBpbnQgY29uc3RhbnRWYWx1ZUluZGV4OworCXByaXZhdGUgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7CisKKwkKKwlDb25zdGFudFZhbHVlQXR0cmlidXRlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CisJCXRoaXMuY29uc3RhbnRWYWx1ZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJdGhpcy5jb25zdGFudFBvb2wgPSBjb25zdGFudFBvb2w7CQorCX0KKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFZhbHVlQXR0cmlidXRlI2dldENvbnN0YW50VmFsdWUoKQorCSAqLworCXB1YmxpYyBJQ29uc3RhbnRQb29sRW50cnkgZ2V0Q29uc3RhbnRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KHRoaXMuY29uc3RhbnRWYWx1ZUluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25zdGFudFZhbHVlQXR0cmlidXRlI2dldENvbnN0YW50VmFsdWVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRDb25zdGFudFZhbHVlSW5kZXgoKSB7CisJCXJldHVybiB0aGlzLmNvbnN0YW50VmFsdWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZUF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCXJldHVybiBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuQ09OU1RBTlRfVkFMVUU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0RlZmF1bHRCeXRlY29kZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmE2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyOTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUJ5dGVjb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklPcGNvZGVNbmVtb25pY3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5PcGNvZGVTdHJpbmdWYWx1ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEJ5dGVDb2RlVmlzaXRvcgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEJ5dGVjb2RlVmlzaXRvciBpbXBsZW1lbnRzIElCeXRlY29kZVZpc2l0b3IgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBJTklUCT0gIjxpbml0PiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFTVBUWV9OQU1FID0gbmV3IGNoYXJbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfQk9PTEVBTiA9IDQ7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfQ0hBUiA9IDU7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfRkxPQVQgPSA2OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX0RPVUJMRSA9IDc7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfQllURSA9IDg7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfU0hPUlQgPSA5OworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX0lOVCA9IDEwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX0xPTkcgPSAxMTsKKworCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKwlwcml2YXRlIFN0cmluZyBsaW5lU2VwYXJhdG9yOworCXByaXZhdGUgaW50IHRhYk51bWJlcjsKKwkKKwlwdWJsaWMgRGVmYXVsdEJ5dGVjb2RlVmlzaXRvcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlcikgeworCQl0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJdGhpcy5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcjsKKwkJdGhpcy50YWJOdW1iZXIgPSB0YWJOdW1iZXIgKyAxOworCX0KKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FhbG9hZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FhbG9hZChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUFMT0FEXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWFzdG9yZShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fhc3RvcmUoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFBU1RPUkVdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hY29uc3RfbnVsbChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fjb25zdF9udWxsKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BQ09OU1RfTlVMTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Fsb2FkXzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hbG9hZF8wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BTE9BRF8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWxvYWRfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fsb2FkXzEoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFMT0FEXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hbG9hZF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYWxvYWRfMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Fsb2FkXzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hbG9hZF8zKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BTE9BRF8zXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYWxvYWQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Fsb2FkKGludCBwYywgaW50IGluZGV4KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFMT0FEXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYW5ld2FycmF5KGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2FuZXdhcnJheShpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50Q2xhc3MpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQU5FV0FSUkFZXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChyZXR1cm5Db25zdGFudENsYXNzTmFtZShjb25zdGFudENsYXNzKSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXJldHVybihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FyZXR1cm4oaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFSRVRVUk5dKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hcnJheWxlbmd0aChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FycmF5bGVuZ3RoKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BUlJBWUxFTkdUSF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FzdG9yZV8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXN0b3JlXzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hc3RvcmVfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVNUT1JFXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19hc3RvcmVfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2FzdG9yZV8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BU1RPUkVfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2FzdG9yZV8zKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXN0b3JlXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRV8zXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXN0b3JlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9hc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQVNUT1JFXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYXRocm93KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfYXRocm93KGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BVEhST1ddKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19iYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9iYWxvYWQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJBTE9BRF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Jhc3RvcmUoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9iYXN0b3JlKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5CQVNUT1JFXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2JpcHVzaChpbnQsIGJ5dGUpCisJICovCisJcHVibGljIHZvaWQgX2JpcHVzaChpbnQgcGMsIGJ5dGUgX2J5dGUpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQklQVVNIXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChfYnl0ZSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfY2Fsb2FkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfY2Fsb2FkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5DQUxPQURdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19jYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfY2FzdG9yZShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQ0FTVE9SRV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2NoZWNrY2FzdChpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9jaGVja2Nhc3QoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkNIRUNLQ0FTVF0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQocmV0dXJuQ29uc3RhbnRDbGFzc05hbWUoY29uc3RhbnRDbGFzcykpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2QyZihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2QyZihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRDJGXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZDJpKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZDJpKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EMkldKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kMmwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kMmwoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkQyTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RhZGQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kYWRkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQUREXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGFsb2FkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGFsb2FkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQUxPQURdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGFzdG9yZShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuREFTVE9SRV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RjbXBnKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGNtcGcoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRDTVBHXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGNtcGwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kY21wbChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRENNUExdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kY29uc3RfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Rjb25zdF8wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EQ09OU1RfMF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rjb25zdF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGNvbnN0XzEoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRDT05TVF8xXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGRpdihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RkaXYoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRESVZdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kbG9hZF8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGxvYWRfMChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRExPQURfMF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Rsb2FkXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kbG9hZF8xKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5ETE9BRF8xXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGxvYWRfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Rsb2FkXzIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXzJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZGxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Rsb2FkXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRMT0FEXzNdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZGxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRExPQURdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kbXVsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZG11bChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRE1VTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RuZWcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kbmVnKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5ETkVHXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RyZW0oaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRSRU1dKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHJldHVybihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFJFVFVSTl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RzdG9yZV8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHN0b3JlXzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRTVE9SRV8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kc3RvcmVfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFNUT1JFXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kc3RvcmVfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RzdG9yZV8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1RPUkVfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2RzdG9yZV8zKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHN0b3JlXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRTVE9SRV8zXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHN0b3JlKGludCxpbnQpCisJICovCisJcHVibGljIHZvaWQgX2RzdG9yZShpbnQgcGMsIGludCBpbmRleCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EU1RPUkVdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kc3ViKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHN1YihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFNVQl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2R1cF94MShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2R1cF94MShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQX1gxXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHVwX3gyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHVwX3gyKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVBfWDJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2R1cDJfeDEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9kdXAyX3gxKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5EVVAyX1gxXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZHVwMl94MihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2R1cDJfeDIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkRVUDJfWDJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19kdXAyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZHVwMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRFVQMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2YyZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2YyZChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRjJEXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZjJpKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZjJpKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GMkldKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZjJsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZjJsKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GMkxdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mYWRkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmFkZChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkFERF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mYWxvYWQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZBTE9BRF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zhc3RvcmUoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mYXN0b3JlKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQVNUT1JFXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmNtcGcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mY21wZyhpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkNNUEddKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mY21wbChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZjbXBsKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQ01QTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zjb25zdF8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmNvbnN0XzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZDT05TVF8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmNvbnN0XzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mY29uc3RfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkNPTlNUXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mY29uc3RfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zjb25zdF8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GQ09OU1RfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZkaXYoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mZGl2KGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GRElWXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmxvYWRfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zsb2FkXzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZMT0FEXzBdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mbG9hZF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmxvYWRfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkxPQURfMV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2Zsb2FkXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mbG9hZF8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTE9BRF8yXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZmxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2Zsb2FkXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZMT0FEXzNdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZmxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRkxPQURdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mbXVsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZm11bChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRk1VTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZuZWcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mbmVnKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GTkVHXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZyZW0oaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mcmVtKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GUkVNXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZnJldHVybihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZyZXR1cm4oaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZSRVRVUk5dKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mc3RvcmVfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZzdG9yZV8wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GU1RPUkVfMF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZzdG9yZV8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZnN0b3JlXzEoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZTVE9SRV8xXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZnN0b3JlXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mc3RvcmVfMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuRlNUT1JFXzJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19mc3RvcmVfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ZzdG9yZV8zKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GU1RPUkVfM10pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZzdG9yZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZnN0b3JlKGludCBwYywgaW50IGluZGV4KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkZTVE9SRV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ZzdWIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9mc3ViKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5GU1VCXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZ2V0ZmllbGQoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfZ2V0ZmllbGQoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkdFVEZJRUxEXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5nZXRmaWVsZCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkRlY2xhcmluZ0NsYXNzTmFtZShjb25zdGFudEZpZWxkcmVmKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY2xhc3NtZW1iZXJzZXBhcmF0b3IiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChjb25zdGFudEZpZWxkcmVmLmdldEZpZWxkTmFtZSgpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkZpZWxkcmVmRGVzY3JpcHRvcihjb25zdGFudEZpZWxkcmVmKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5nZXRmaWVsZGNsb3NlIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZ2V0c3RhdGljKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2dldHN0YXRpYyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50RmllbGRyZWYpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuR0VUU1RBVElDXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5nZXRzdGF0aWMiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRGaWVsZHJlZikpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY29uc3RhbnRGaWVsZHJlZi5nZXRGaWVsZE5hbWUoKSkKKwkJCS5hcHBlbmQocmV0dXJuRmllbGRyZWZEZXNjcmlwdG9yKGNvbnN0YW50RmllbGRyZWYpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0LmdldHN0YXRpY2Nsb3NlIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfZ290b193KGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9nb3RvX3coaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkdPVE9fV10pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoYnJhbmNoT2Zmc2V0ICsgcGMpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2dvdG8oaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2dvdG8oaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkdPVE9dKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pMmIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pMmIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyQl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2kyYyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2kyYyhpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJDXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JMkRdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pMmYoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pMmYoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkkyRl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2kybChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2kybChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSTJMXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaTJzKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaTJzKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JMlNdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pYWRkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWFkZChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUFERF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lhbG9hZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lhbG9hZChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUFMT0FEXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWFuZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lhbmQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklBTkRdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWFzdG9yZShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUFTVE9SRV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2FjbXBlcShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfYWNtcGVxKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9BQ01QRVFdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9hY21wbmUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2FjbXBuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZfQUNNUE5FXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZfaWNtcGVxKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZl9pY21wZXEoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBFUV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoYnJhbmNoT2Zmc2V0ICsgcGMpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2ljbXBnZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfaWNtcGdlKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QR0VdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9pY21wZ3QoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2ljbXBndChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZfSUNNUEdUXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZfaWNtcGxlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZl9pY21wbGUoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGX0lDTVBMRV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoYnJhbmNoT2Zmc2V0ICsgcGMpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmX2ljbXBsdChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZfaWNtcGx0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRl9JQ01QTFRdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZl9pY21wbmUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmX2ljbXBuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZfSUNNUE5FXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0XzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pY29uc3RfMChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzBdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pY29uc3RfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ljb25zdF8xKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQ09OU1RfMV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ljb25zdF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0XzIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF8yXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0XzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pY29uc3RfMyhpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUNPTlNUXzNdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pY29uc3RfNChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2ljb25zdF80KGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQ09OU1RfNF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ljb25zdF81KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0XzUoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklDT05TVF81XSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWNvbnN0X20xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWNvbnN0X20xKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JQ09OU1RfTTFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZGl2KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWRpdihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSURJVl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmZXEoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmZXEoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGRVFdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZmdlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZmdlKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkdFXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZndChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZndChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZHVF0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoYnJhbmNoT2Zmc2V0ICsgcGMpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmbGUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmbGUoaW50IHBjLCBpbnQgYnJhbmNoT2Zmc2V0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklGTEVdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZmx0KGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pZmx0KGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRkxUXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWZuZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZuZShpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZORV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoYnJhbmNoT2Zmc2V0ICsgcGMpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lmbm9ubnVsbChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWZub25udWxsKGludCBwYywgaW50IGJyYW5jaE9mZnNldCkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JRk5PTk5VTExdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pZm51bGwoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lmbnVsbChpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUZOVUxMXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWluYyhpbnQsIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9paW5jKGludCBwYywgaW50IGluZGV4LCBpbnQgX2NvbnN0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklJTkNdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKF9jb25zdCk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWxvYWRfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lsb2FkXzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklMT0FEXzBdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbG9hZF8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWxvYWRfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUxPQURfMV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lsb2FkXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbG9hZF8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTE9BRF8yXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaWxvYWRfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lsb2FkXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklMT0FEXzNdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbG9hZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaWxvYWQoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSUxPQURdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbXVsKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW11bChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU1VTF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2luZWcoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbmVnKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTkVHXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW5zdGFuY2VvZihpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbnN0YW5jZW9mKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTlNUQU5DRU9GXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChyZXR1cm5Db25zdGFudENsYXNzTmFtZShjb25zdGFudENsYXNzKSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW52b2tlaW50ZXJmYWNlKGludCwgaW50LCBieXRlLCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2ludm9rZWludGVyZmFjZSgKKwkJaW50IHBjLAorCQlpbnQgaW5kZXgsCisJCWJ5dGUgbmFyZ3MsCisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEludGVyZmFjZU1ldGhvZHJlZikgeworCisJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOworCisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklOVk9LRUlOVEVSRkFDRV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQubmFyZ3MiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChuYXJncykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnRlcmZhY2VtZXRob2RyZWZpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZWludGVyZmFjZW1ldGhvZCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkRlY2xhcmluZ0NsYXNzTmFtZShjb25zdGFudEludGVyZmFjZU1ldGhvZHJlZikpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoCisJCQkJU2lnbmF0dXJlLnRvQ2hhckFycmF5KAorCQkJCQltZXRob2REZXNjcmlwdG9yLAorCQkJCQljb25zdGFudEludGVyZmFjZU1ldGhvZHJlZi5nZXRNZXRob2ROYW1lKCksCisJCQkJCWdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IpLAorCQkJCQl0cnVlLAorCQkJCQl0cnVlKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2VpbnRlcmZhY2VtZXRob2RjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZXNwZWNpYWwoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW52b2tlc3BlY2lhbChpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKSB7CisJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOworCQljaGFyW10gbWV0aG9kTmFtZSA9IGNvbnN0YW50TWV0aG9kcmVmLmdldE1ldGhvZE5hbWUoKTsKKworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSU5JVCwgbWV0aG9kTmFtZSkpIHsKKwkJCW1ldGhvZE5hbWUgPSBFTVBUWV9OQU1FOworCQkJd3JpdGVUYWJzKCk7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKHBjKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklOVk9LRVNQRUNJQUxdKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoaW5kZXgpCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZXNwZWNpYWxjb25zdHJ1Y3RvciIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRNZXRob2RyZWYpKQorCQkJCS5hcHBlbmQoCisJCQkJCVNpZ25hdHVyZS50b0NoYXJBcnJheSgKKwkJCQkJCW1ldGhvZERlc2NyaXB0b3IsCisJCQkJCQltZXRob2ROYW1lLAorCQkJCQkJZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciksCisJCQkJCQl0cnVlLAorCQkJCQkJZmFsc2UpKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsY29uc3RydWN0b3JjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKCk7CisJCX0gZWxzZSB7CisJCQltZXRob2ROYW1lID0gRU1QVFlfTkFNRTsKKwkJCXdyaXRlVGFicygpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChwYykKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5BTE9BRF8wXSkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGluZGV4KQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsbWV0aG9kIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKHJldHVybkRlY2xhcmluZ0NsYXNzTmFtZShjb25zdGFudE1ldGhvZHJlZikpCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbGFzc21lbWJlcnNlcGFyYXRvciIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZCgKKwkJCQkJU2lnbmF0dXJlLnRvQ2hhckFycmF5KAorCQkJCQkJbWV0aG9kRGVzY3JpcHRvciwKKwkJCQkJCW1ldGhvZE5hbWUsCisJCQkJCQlnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yKSwKKwkJCQkJCXRydWUsCisJCQkJCQl0cnVlKSkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQuaW52b2tlc3BlY2lhbG1ldGhvZGNsb3NlIikpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZU5ld0xpbmUoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW52b2tlc3RhdGljKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2ludm9rZXN0YXRpYyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKSB7CisJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTlZPS0VTVEFUSUNdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZXN0YXRpY21ldGhvZCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkRlY2xhcmluZ0NsYXNzTmFtZShjb25zdGFudE1ldGhvZHJlZikpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoCisJCQkJU2lnbmF0dXJlLnRvQ2hhckFycmF5KAorCQkJCQltZXRob2REZXNjcmlwdG9yLAorCQkJCQljb25zdGFudE1ldGhvZHJlZi5nZXRNZXRob2ROYW1lKCksCisJCQkJCWdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IpLAorCQkJCQl0cnVlLAorCQkJCQl0cnVlKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2VzdGF0aWNtZXRob2RjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ludm9rZXZpcnR1YWwoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW52b2tldmlydHVhbChpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKSB7CisJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTlZPS0VWSVJUVUFMXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2V2aXJ0dWFsbWV0aG9kIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQocmV0dXJuRGVjbGFyaW5nQ2xhc3NOYW1lKGNvbnN0YW50TWV0aG9kcmVmKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY2xhc3NtZW1iZXJzZXBhcmF0b3IiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCgKKwkJCQlTaWduYXR1cmUudG9DaGFyQXJyYXkoCisJCQkJCW1ldGhvZERlc2NyaXB0b3IsCisJCQkJCWNvbnN0YW50TWV0aG9kcmVmLmdldE1ldGhvZE5hbWUoKSwKKwkJCQkJZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciksCisJCQkJCXRydWUsCisJCQkJCXRydWUpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZXZpcnR1YWxtZXRob2RjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lvcihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lvcihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU9SXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXJlbShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lyZW0oaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklSRU1dKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pcmV0dXJuKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXJldHVybihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVJFVFVSTl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzaGwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc2hsKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JU0hMXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXNocihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzaHIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTSFJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pc3RvcmVfMChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzdG9yZV8wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JU1RPUkVfMF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzdG9yZV8xKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXN0b3JlXzEoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV8xXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXN0b3JlXzIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc3RvcmVfMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVNUT1JFXzJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pc3RvcmVfMyhpbnQpCisJICovCisJcHVibGljIHZvaWQgX2lzdG9yZV8zKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JU1RPUkVfM10pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzdG9yZShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXN0b3JlKGludCBwYywgaW50IGluZGV4KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLklTVE9SRV0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2lzdWIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pc3ViKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JU1VCXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaXVzaHIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pdXNocihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVVTSFJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19peG9yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaXhvcihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSVhPUl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2pzcl93KGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9qc3JfdyhpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSlNSX1ddKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGJyYW5jaE9mZnNldCArIHBjKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19qc3IoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2pzcihpbnQgcGMsIGludCBicmFuY2hPZmZzZXQpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSlNSXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChicmFuY2hPZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbDJkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbDJkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MMkRdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sMmYoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sMmYoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkwyRl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2wyaShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2wyaShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTDJJXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGFkZChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xhZGQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxBRERdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sYWxvYWQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sYWxvYWQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxBTE9BRF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xhbmQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sYW5kKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MQU5EXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGFzdG9yZShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xhc3RvcmUoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxBU1RPUkVdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sY21wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGNtcChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTENNUF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xjb25zdF8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGNvbnN0XzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxDT05TVF8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGNvbnN0XzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sY29uc3RfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTENPTlNUXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sZGNfdyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9sZGNfdyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQ19XXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3dpdGNoIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkpIHsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0Zsb2F0IDoKKwkJCQlhcHBlbmRPdXRwdXRmb3JDb25zdGFudEZsb2F0KGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0ludGVnZXIgOgorCQkJCWFwcGVuZE91dHB1dGZvckNvbnN0YW50SW50ZWdlcihjb25zdGFudFBvb2xFbnRyeSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9TdHJpbmcgOgorCQkJCWFwcGVuZE91dHB1dEZvckNvbnN0YW50U3RyaW5nKGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJfQorCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xkYyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9sZGMoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MRENdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlzd2l0Y2ggKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSkgeworCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRmxvYXQgOgorCQkJCWFwcGVuZE91dHB1dGZvckNvbnN0YW50RmxvYXQoY29uc3RhbnRQb29sRW50cnkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfSW50ZWdlciA6CisJCQkJYXBwZW5kT3V0cHV0Zm9yQ29uc3RhbnRJbnRlZ2VyKGNvbnN0YW50UG9vbEVudHJ5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1N0cmluZyA6CisJCQkJYXBwZW5kT3V0cHV0Rm9yQ29uc3RhbnRTdHJpbmcoY29uc3RhbnRQb29sRW50cnkpOworCQl9CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGRjMl93KGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX2xkYzJfdyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxEQzJfV10pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCXN3aXRjaCAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpKSB7CisJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Mb25nIDoKKwkJCQlhcHBlbmRPdXRwdXRGb3JDb25zdGFudExvbmcoY29uc3RhbnRQb29sRW50cnkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfRG91YmxlIDoKKwkJCQlhcHBlbmRPdXRwdXRGb3JDb25zdGFudERvdWJsZShjb25zdGFudFBvb2xFbnRyeSk7CisJCX0KKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sZGl2KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGRpdihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTERJVl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xsb2FkXzAoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sbG9hZF8wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTE9BRF8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGxvYWRfMShpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xsb2FkXzEoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxMT0FEXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sbG9hZF8yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbGxvYWRfMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTExPQURfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xsb2FkXzMoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sbG9hZF8zKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MTE9BRF8zXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbGxvYWQoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xsb2FkKGludCBwYywgaW50IGluZGV4KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxMT0FEXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbG11bChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xtdWwoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxNVUxdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sbmVnKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbG5lZyhpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTE5FR10pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xvb2t1cHN3aXRjaChpbnQsIGludCwgaW50LCBpbnRbXVtdKQorCSAqLworCXB1YmxpYyB2b2lkIF9sb29rdXBzd2l0Y2goaW50IHBjLCBpbnQgZGVmYXVsdG9mZnNldCwgaW50IG5wYWlycywgaW50W11bXSBvZmZzZXRfcGFpcnMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTE9PS1VQU1dJVENIXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuZGVmYXVsdCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGRlZmF1bHRvZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5wYWlyczsgaSsrKSB7CisJCQl3cml0ZUV4dHJhVGFicygxKTsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuY2FzZSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChvZmZzZXRfcGFpcnNbaV1bMF0pCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb2xvbiIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChvZmZzZXRfcGFpcnNbaV1bMV0gKyBwYyk7CisJCQl3cml0ZU5ld0xpbmUoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbG9yKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbG9yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MT1JdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19scmVtKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHJlbShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFJFTV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xyZXR1cm4oaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9scmV0dXJuKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MUkVUVVJOXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHNobChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzaGwoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxTSExdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sc2hyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHNocihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNIUl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xzdG9yZV8wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHN0b3JlXzAoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxTVE9SRV8wXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHN0b3JlXzEoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc3RvcmVfMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXzFdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sc3RvcmVfMihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzdG9yZV8yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MU1RPUkVfMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2xzdG9yZV8zKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbHN0b3JlXzMoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxTVE9SRV8zXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHN0b3JlKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9sc3RvcmUoaW50IHBjLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTFNUT1JFXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbmRleCk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbHN1YihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2xzdWIoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkxTVUJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19sdXNocihpbnQpCisJICovCisJcHVibGljIHZvaWQgX2x1c2hyKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MVVNIUl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2x4b3IoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9seG9yKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MWE9SXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfbW9uaXRvcmVudGVyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbW9uaXRvcmVudGVyKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5NT05JVE9SRU5URVJdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19tb25pdG9yZXhpdChpbnQpCisJICovCisJcHVibGljIHZvaWQgX21vbml0b3JleGl0KGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5NT05JVE9SRVhJVF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX211bHRpYW5ld2FycmF5KGludCwgaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbXVsdGlhbmV3YXJyYXkoCisJCWludCBwYywKKwkJaW50IGluZGV4LAorCQlpbnQgZGltZW5zaW9ucywKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50Q2xhc3MpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTVVMVElBTkVXQVJSQVldKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkNvbnN0YW50Q2xhc3NOYW1lKGNvbnN0YW50Q2xhc3MpKTsKKwkJYXBwZW5kRGltZW5zaW9ucyhkaW1lbnNpb25zKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19uZXcoaW50LCBpbnQsIElDb25zdGFudFBvb2xFbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbmV3KGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRDbGFzcykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5ORVddKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGluZGV4KQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHJldHVybkNvbnN0YW50Q2xhc3NOYW1lKGNvbnN0YW50Q2xhc3MpKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19uZXdhcnJheShpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfbmV3YXJyYXkoaW50IHBjLCBpbnQgYXR5cGUpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTkVXQVJSQVldKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGF0eXBlKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQlhcHBlbmRHZXRBcnJheVR5cGUoYXR5cGUpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX25vcChpbnQpCisJICovCisJcHVibGljIHZvaWQgX25vcChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuTk9QXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfcG9wKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcG9wKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5QT1BdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19wb3AyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcG9wMihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuUE9QMl0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3B1dGZpZWxkKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCisJICovCisJcHVibGljIHZvaWQgX3B1dGZpZWxkKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRGaWVsZHJlZikgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5QVVRGSUVMRF0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQucHV0ZmllbGQiKSkJCQkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRGaWVsZHJlZikpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY29uc3RhbnRGaWVsZHJlZi5nZXRGaWVsZE5hbWUoKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChyZXR1cm5GaWVsZHJlZkRlc2NyaXB0b3IoY29uc3RhbnRGaWVsZHJlZikpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQucHV0ZmllbGRjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3B1dHN0YXRpYyhpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIF9wdXRzdGF0aWMoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudEZpZWxkcmVmKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlBVVFNUQVRJQ10pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQucHV0c3RhdGljIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQocmV0dXJuRGVjbGFyaW5nQ2xhc3NOYW1lKGNvbnN0YW50RmllbGRyZWYpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbGFzc21lbWJlcnNlcGFyYXRvciIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGNvbnN0YW50RmllbGRyZWYuZ2V0RmllbGROYW1lKCkpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQocmV0dXJuRmllbGRyZWZEZXNjcmlwdG9yKGNvbnN0YW50RmllbGRyZWYpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0LnB1dHN0YXRpY2Nsb3NlIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCXByaXZhdGUgY2hhcltdIHJldHVybkZpZWxkcmVmRGVzY3JpcHRvcihJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRGaWVsZHJlZikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJCWNoYXJbXSBmaWVsZERlc2NyaXB0b3IgPSBjb25zdGFudEZpZWxkcmVmLmdldEZpZWxkRGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZmllbGREZXNjcmlwdG9yLCAnLycsICcuJyk7CisJCXJldHVybiBTaWduYXR1cmUudG9DaGFyQXJyYXkoZmllbGREZXNjcmlwdG9yKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3JldChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfcmV0KGludCBwYywgaW50IGluZGV4KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlJFVF0pCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5kZXgpOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3JldHVybihpbnQpCisJICovCisJcHVibGljIHZvaWQgX3JldHVybihpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuUkVUVVJOXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfc2Fsb2FkKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc2Fsb2FkKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5TQUxPQURdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19zYXN0b3JlKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc2FzdG9yZShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuU0FTVE9SRV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3NpcHVzaChpbnQsIHNob3J0KQorCSAqLworCXB1YmxpYyB2b2lkIF9zaXB1c2goaW50IHBjLCBzaG9ydCB2YWx1ZSkgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5TSVBVU0hdKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHZhbHVlKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19zd2FwKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfc3dhcChpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuU1dBUF0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX3RhYmxlc3dpdGNoKGludCwgaW50LCBpbnQsIGludCwgaW50W10pCisJICovCisJcHVibGljIHZvaWQgX3RhYmxlc3dpdGNoKAorCQlpbnQgcGMsIAorCQlpbnQgZGVmYXVsdG9mZnNldCwKKwkJaW50IGxvdywKKwkJaW50IGhpZ2gsCisJCWludFtdIGp1bXBfb2Zmc2V0cykgeworCisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLlRBQkxFU1dJVENIXSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuZGVmYXVsdCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGRlZmF1bHRvZmZzZXQgKyBwYyk7CisJCXdyaXRlTmV3TGluZSgpOworCQlmb3IgKGludCBpID0gbG93OyBpIDwgaGlnaCArIDE7IGkrKykgeworCQkJd3JpdGVFeHRyYVRhYnMoMSk7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmNhc2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoaSkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbG9uIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGp1bXBfb2Zmc2V0c1tpIC0gbG93XSArIHBjKTsKKwkJCXdyaXRlTmV3TGluZSgpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI193aWRlKGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX3dpZGUoaW50IHBjLCBpbnQgaWluY29wY29kZSwgaW50IGluZGV4LCBpbnQgX2NvbnN0KSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLldJREVdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJCV9paW5jKHBjICsgMSwgaW5kZXgsIF9jb25zdCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI193aWRlKGludCwgaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgX3dpZGUoaW50IHBjLCBpbnQgb3Bjb2RlLCBpbnQgaW5kZXgpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuV0lERV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwkJc3dpdGNoKG9wY29kZSkgeworCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLklMT0FEIDoKKwkJCQlfaWxvYWQocGMgKyAxLCBpbmRleCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRkxPQUQgOgorCQkJCV9mbG9hZChwYyArIDEsIGluZGV4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5BTE9BRCA6CisJCQkJX2Fsb2FkKHBjICsgMSwgaW5kZXgpOworCQkJCWJyZWFrOworCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkxMT0FEIDoKKwkJCQlfbGxvYWQocGMgKyAxLCBpbmRleCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRExPQUQgOgorCQkJCV9kbG9hZChwYyArIDEsIGluZGV4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5JU1RPUkUgOgorCQkJCV9pc3RvcmUocGMgKyAxLCBpbmRleCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRlNUT1JFIDoKKwkJCQlfZnN0b3JlKHBjICsgMSwgaW5kZXgpOworCQkJCWJyZWFrOworCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLkFTVE9SRSA6CisJCQkJX2FzdG9yZShwYyArIDEsIGluZGV4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU9wY29kZU1uZW1vbmljcy5MU1RPUkUgOgorCQkJCV9sc3RvcmUocGMgKyAxLCBpbmRleCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElPcGNvZGVNbmVtb25pY3MuRFNUT1JFIDoKKwkJCQlfZHN0b3JlKHBjICsgMSwgaW5kZXgpOworCQkJCWJyZWFrOworCQkJY2FzZSBJT3Bjb2RlTW5lbW9uaWNzLlJFVCA6CisJCQkJX3JldChwYyArIDEsIGluZGV4KTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfYnJlYWtwb2ludChpbnQpCisJICovCisJcHVibGljIHZvaWQgX2JyZWFrcG9pbnQoaW50IHBjKSB7CisJCXdyaXRlVGFicygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQocGMpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKE9wY29kZVN0cmluZ1ZhbHVlcy5CWVRFQ09ERV9OQU1FU1tJT3Bjb2RlTW5lbW9uaWNzLkJSRUFLUE9JTlRdKTsKKwkJd3JpdGVOZXdMaW5lKCk7CisJfQorCisJLyoqCisJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbXBkZXAxKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBfaW1wZGVwMShpbnQgcGMpIHsKKwkJd3JpdGVUYWJzKCk7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChwYykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuSU1QREVQMV0pOworCQl3cml0ZU5ld0xpbmUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElCeXRlY29kZVZpc2l0b3IjX2ltcGRlcDIoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIF9pbXBkZXAyKGludCBwYykgeworCQl3cml0ZVRhYnMoKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKHBjKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTVBERVAyXSk7CisJCXdyaXRlTmV3TGluZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmREaW1lbnNpb25zKGludCBkaW1lbnNpb25zKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7CisJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuYXJyYXlkaW1lbnNpb25zIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFwcGVuZEdldEFycmF5VHlwZShpbnQgYXR5cGUpIHsKKwkJc3dpdGNoKGF0eXBlKSB7CisJCQljYXNlIFRfQk9PTEVBTiA6CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5Ym9vbGVhbiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBUX0NIQVIgOgorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWNoYXIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9GTE9BVCA6CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZmxvYXQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9ET1VCTEUgOgorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWRvdWJsZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBUX0JZVEUgOgorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWJ5dGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9TSE9SVCA6CisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5c2hvcnQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJCWNhc2UgVF9JTlQgOgorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWludCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBUX0xPTkcgOgorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWxvbmciKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIHJldHVybkNvbnN0YW50Q2xhc3NOYW1lKElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudENsYXNzKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGNvbnN0YW50Q2xhc3MuZ2V0Q2xhc3NJbmZvTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyByZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UmVmKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGNvbnN0YW50UmVmLmdldENsYXNzTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKTsKKwl9CisKKwlwcml2YXRlIGNoYXJbXVtdIGdldFBhcmFtZXRlck5hbWVzKGNoYXJbXSBtZXRob2REZXNjcmlwdG9yKSB7CisJCWludCBwYXJhbUNvdW50ID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlckNvdW50KG1ldGhvZERlc2NyaXB0b3IpOworCQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyA9IG5ldyBjaGFyW3BhcmFtQ291bnRdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7CisJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnBhcmFtZXRlcm5hbWUiKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHBhcmFtZXRlck5hbWVzOworCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmRPdXRwdXRGb3JDb25zdGFudERvdWJsZShJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpIHsKKwkJdGhpcy5idWZmZXIKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRkb3VibGUiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXREb3VibGVWYWx1ZSgpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGVuZE91dHB1dEZvckNvbnN0YW50TG9uZyhJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpIHsKKwkJdGhpcy5idWZmZXIKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRsb25nIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0TG9uZ1ZhbHVlKCkpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsb3NlY29uc3RhbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHZvaWQgYXBwZW5kT3V0cHV0Rm9yQ29uc3RhbnRTdHJpbmcoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJCXRoaXMuYnVmZmVyCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50c3RyaW5nIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0U3RyaW5nVmFsdWUoKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY2xvc2Vjb25zdGFudCIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmRPdXRwdXRmb3JDb25zdGFudEludGVnZXIoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJCXRoaXMuYnVmZmVyCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50aW50ZWdlciIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50IikpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGFwcGVuZE91dHB1dGZvckNvbnN0YW50RmxvYXQoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CisJCXRoaXMuYnVmZmVyCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50ZmxvYXQiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXRGbG9hdFZhbHVlKCkpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsb3NlY29uc3RhbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVOZXdMaW5lKCkgeworCQl0aGlzLmJ1ZmZlci5hcHBlbmQobGluZVNlcGFyYXRvcik7CisJfQkKKworCXByaXZhdGUgdm9pZCB3cml0ZVRhYnMoKSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLnRhYk51bWJlcjsgaSA8IG1heDsgaSsrKSB7CisJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIudGFiIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlRXh0cmFUYWJzKGludCBleHRyYVRhYnMpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMudGFiTnVtYmVyICsgZXh0cmFUYWJzOyBpIDwgbWF4OyBpKyspIHsKKwkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0JCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGlzYXNzZW1ibGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2Fzc2VtYmxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTRiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2Fzc2VtYmxlci5qYXZhCkBAIC0wLDAgKzEsODkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29kZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFZhbHVlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUV4Y2VwdGlvbkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklFeGNlcHRpb25UYWJsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUZpZWxkSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklJbm5lckNsYXNzZXNBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTGluZU51bWJlckF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklMb2NhbFZhcmlhYmxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1ldGhvZEluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTW9kaWZpZXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JU291cmNlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogRGlzYXNzZW1ibGVyIG9mIC5jbGFzcyBmaWxlcy4gSXQgZ2VuZXJhdGVzIGFuIG91dHB1dCBpbiB0aGUgV3JpdGVyIHRoYXQgbG9va3MgY2xvc2UgdG8KKyAqIHRoZSBqYXZhcCBvdXRwdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNhc3NlbWJsZXIgaW1wbGVtZW50cyBJQ2xhc3NGaWxlRGlzYXNzZW1ibGVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBBTllfRVhDRVBUSU9OID0gVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYW55ZXhjZXB0aW9uaGFuZGxlciIpLnRvQ2hhckFycmF5KCk7CSAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX09VVFBVVCA9ICIiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQW5zd2VycyBiYWNrIHRoZSBkaXNhc3NlbWJsZWQgc3RyaW5nIG9mIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZQorCSAqIG1vZGUuCisJICogVGhpcyBpcyBhbiBvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgamF2YXAgdG9vbC4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgVGhlIGJ5dGVzIG9mIHRoZSBjbGFzc2ZpbGUgdG8gZGlzYXNzZW1ibGUKKwkgKiBAcGFyYW0gbGluZVNlcGFyYXRvciB0aGUgbGluZSBzZXBhcmF0b3IgdG8gdXNlLgorCSAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHVzZWQgdG8gZGlzYXNzZW1ibGUgdGhlIGNsYXNzZmlsZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIGNsYXNzZmlsZSBhY2NvcmRpbmcgdG8gdGhlIG1vZGUKKwkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgYXJlIGlsbC1mb3JtZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGRpc2Fzc2VtYmxlKGJ5dGVbXSBjbGFzc2ZpbGVCeXRlcywgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCBtb2RlKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQlyZXR1cm4gZGlzYXNzZW1ibGUobmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc2ZpbGVCeXRlcywgSUNsYXNzRmlsZVJlYWRlci5BTEwpLCBsaW5lU2VwYXJhdG9yLCBtb2RlKTsKKwl9CisKKwkvKioKKwkgKiBEaXNhc3NlbWJsZSB0aGUgY2xhc3MgZmlsZSByZWFkZXIuCisJICovCisJcHVibGljIFN0cmluZyBkaXNhc3NlbWJsZShJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IpIHsKKwkJcmV0dXJuIGRpc2Fzc2VtYmxlKGNsYXNzRmlsZVJlYWRlciwgbGluZVNlcGFyYXRvciwgSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERUZBVUxUKTsKKwl9CisKKwkvKioKKwkgKiBEaXNhc3NlbWJsZSB0aGUgY2xhc3MgZmlsZSByZWFkZXIuCisJICovCisJcHVibGljIFN0cmluZyBkaXNhc3NlbWJsZShJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCBtb2RlKSB7CisJCWlmIChjbGFzc0ZpbGVSZWFkZXIgPT0gbnVsbCkgcmV0dXJuIEVNUFRZX09VVFBVVDsKKwkJCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkJaWYgKG1vZGUgPT0gSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERVRBSUxFRCkgeworCQkJaW50IG1pbm9yVmVyc2lvbiA9IGNsYXNzRmlsZVJlYWRlci5nZXRNaW5vclZlcnNpb24oKTsKKwkJCWludCBtYWpvclZlcnNpb24gPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWFqb3JWZXJzaW9uKCk7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmJlZ2luY29tbWVudGxpbmUiKSk7CQkJIC8vJE5PTi1OTFMtMSQKKwkJCWlmIChtaW5vclZlcnNpb24gPT0gMyAmJiBtYWpvclZlcnNpb24gPT0gNDUpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LnRhcmdldG9wdGlvbiIsICIgMS4xIikpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl9IGVsc2UgaWYgKG1pbm9yVmVyc2lvbiA9PSAwICYmIG1ham9yVmVyc2lvbiA9PSA0NikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQudGFyZ2V0b3B0aW9uIiwgIjEuMiIpKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJfSBlbHNlIGlmIChtaW5vclZlcnNpb24gPT0gMCAmJiBtYWpvclZlcnNpb24gPT0gNDcpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LnRhcmdldG9wdGlvbiIsICIxLjMiKSk7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCX0gZWxzZSBpZiAobWlub3JWZXJzaW9uID09IDAgJiYgbWFqb3JWZXJzaW9uID09IDQ4KSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC50YXJnZXRvcHRpb24iLCAiMS40IikpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl9CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuYmVnaW5jb21tZW50bGluZSIpKTsJCQkgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5tYWdpY251bWJlciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGNsYXNzRmlsZVJlYWRlci5nZXRNYWdpYygpKS50b1VwcGVyQ2FzZSgpKTsKKwkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIDApOworCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5iZWdpbmNvbW1lbnRsaW5lIikpOwkJCSAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm1pbm9ydmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChtaW5vclZlcnNpb24pOworCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmJlZ2luY29tbWVudGxpbmUiKSk7CQkJIC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubWFqb3J2ZXJzaW9uIikpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKG1ham9yVmVyc2lvbik7CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCX0KKwkJSVNvdXJjZUF0dHJpYnV0ZSBzb3VyY2VBdHRyaWJ1dGUgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0U291cmNlRmlsZUF0dHJpYnV0ZSgpOworCQlpZiAoc291cmNlQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuc291cmNlbmFtZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChzb3VyY2VBdHRyaWJ1dGUuZ2V0U291cmNlRmlsZU5hbWUoKSk7CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAwKTsKKwkJfQorCQljaGFyW10gY2xhc3NOYW1lID0gY2xhc3NGaWxlUmVhZGVyLmdldENsYXNzTmFtZSgpOworCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKwkJCS8vIGluY29tcGxldGUgaW5pdGlhbGl6YXRpb24uIFdlIGNhbm5vdCBnbyBmdXJ0aGVyLgorCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9CisJCWRlY29kZU1vZGlmaWVyc0ZvclR5cGUoYnVmZmVyLCBjbGFzc0ZpbGVSZWFkZXIuZ2V0QWNjZXNzRmxhZ3MoKSk7CisJCWlmIChjbGFzc0ZpbGVSZWFkZXIuaXNDbGFzcygpKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmNsYXNzIikpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmludGVyZmFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShjbGFzc05hbWUsICcvJywgJy4nKTsKKwkJYnVmZmVyLmFwcGVuZChjbGFzc05hbWUpOworCQkKKwkJY2hhcltdIHN1cGVyY2xhc3NOYW1lID0gY2xhc3NGaWxlUmVhZGVyLmdldFN1cGVyY2xhc3NOYW1lKCk7CisJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmV4dGVuZHMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShzdXBlcmNsYXNzTmFtZSwgJy8nLCAnLicpOworCQkJYnVmZmVyLmFwcGVuZChzdXBlcmNsYXNzTmFtZSk7CisJCX0KKwkJY2hhcltdW10gc3VwZXJjbGFzc0ludGVyZmFjZXMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwkJaW50IGxlbmd0aCA9IHN1cGVyY2xhc3NJbnRlcmZhY2VzLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmltcGxlbWVudHMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CisJCQkJY2hhcltdIHN1cGVyaW50ZXJmYWNlID0gc3VwZXJjbGFzc0ludGVyZmFjZXNbaV07CisJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHN1cGVyaW50ZXJmYWNlLCAnLycsICcuJyk7CisJCQkJYnVmZmVyCisJCQkJCS5hcHBlbmQoc3VwZXJpbnRlcmZhY2UpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWNoYXJbXSBzdXBlcmludGVyZmFjZSA9IHN1cGVyY2xhc3NJbnRlcmZhY2VzW2xlbmd0aCAtIDFdOworCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHN1cGVyaW50ZXJmYWNlLCAnLycsICcuJyk7CisJCQlidWZmZXIuYXBwZW5kKHN1cGVyaW50ZXJmYWNlKTsKKwkJfQorCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLm9wZW50eXBlZGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJY2hlY2tTdXBlckZsYWdzKGJ1ZmZlciwgY2xhc3NGaWxlUmVhZGVyLmdldEFjY2Vzc0ZsYWdzKCksIGxpbmVTZXBhcmF0b3IsIDEpOworCQlkaXNhc3NlbWJsZVR5cGVNZW1iZXJzKGNsYXNzRmlsZVJlYWRlciwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAxLCBtb2RlKTsKKwkJaWYgKG1vZGUgPT0gSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERVRBSUxFRCkgeworCQkJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBpbm5lckNsYXNzZXNBdHRyaWJ1dGUgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0SW5uZXJDbGFzc2VzQXR0cmlidXRlKCk7CisJCQlpZiAoaW5uZXJDbGFzc2VzQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQlkaXNhc3NlbWJsZShpbm5lckNsYXNzZXNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMSk7CisJCQl9CisJCQlJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRBdHRyaWJ1dGVzKCk7CisJCQlsZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUNsYXNzRmlsZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworCQkJCQlpZiAoYXR0cmlidXRlICE9IGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZQorCQkJCQkJJiYgYXR0cmlidXRlICE9IHNvdXJjZUF0dHJpYnV0ZSkgeworCQkJCQkJZGlzYXNzZW1ibGUoYXR0cmlidXRlLCBidWZmZXIsIGxpbmVTZXBhcmF0b3IsIDApOworCQkJCQl9CisJCQkJfQorCQkJfQkJCisJCX0KKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMCk7CisJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY2xvc2V0eXBlZGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBpbm5lckNsYXNzZXNBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJhdHRyaWJ1dGVzaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQlJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnlbXSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyaWVzID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlLmdldElubmVyQ2xhc3NBdHRyaWJ1dGVzRW50cmllcygpOworCQlpbnQgbGVuZ3RoID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cmllcy5sZW5ndGg7CisJCWludCBpbm5lckNsYXNzTmFtZUluZGV4LCBvdXRlckNsYXNzTmFtZUluZGV4LCBpbm5lck5hbWVJbmRleCwgYWNjZXNzRmxhZ3M7CisJCUlJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKKwkJCWlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cmllc1tpXTsKKwkJCWlubmVyQ2xhc3NOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lckNsYXNzTmFtZUluZGV4KCk7CisJCQlvdXRlckNsYXNzTmFtZUluZGV4ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0T3V0ZXJDbGFzc05hbWVJbmRleCgpOworCQkJaW5uZXJOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lck5hbWVJbmRleCgpOworCQkJYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRBY2Nlc3NGbGFncygpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5vcGVuaW5uZXJjbGFzc2VudHJ5IikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmlubmVyX2NsYXNzX2luZm9fbmFtZSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChpbm5lckNsYXNzTmFtZUluZGV4KTsKKwkJCWlmIChpbm5lckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCQlidWZmZXIKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkJCS5hcHBlbmQoaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJDbGFzc05hbWUoKSk7CisJCQl9CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIub3V0ZXJfY2xhc3NfaW5mb19uYW1lIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKG91dGVyQ2xhc3NOYW1lSW5kZXgpOworCQkJaWYgKG91dGVyQ2xhc3NOYW1lSW5kZXggIT0gMCkgeworCQkJCWJ1ZmZlcgkKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkJCS5hcHBlbmQoaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0T3V0ZXJDbGFzc05hbWUoKSk7CisJCQl9CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfbmFtZSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChpbm5lck5hbWVJbmRleCk7CisJCQlpZiAoaW5uZXJOYW1lSW5kZXggIT0gMCkgeworCQkJCWJ1ZmZlcgorCQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lck5hbWUoKSk7CisJCQl9CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfYWNjZXNzZmxhZ3MiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoYWNjZXNzRmxhZ3MpCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKGJ1ZmZlciwgYWNjZXNzRmxhZ3MpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWlubmVyY2xhc3NlbnRyeSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb21tYSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCX0KKwkJLy8gbGFzdCBlbnRyeQorCQlpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSA9IGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJpZXNbbGVuZ3RoIC0gMV07CisJCWlubmVyQ2xhc3NOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lckNsYXNzTmFtZUluZGV4KCk7CisJCW91dGVyQ2xhc3NOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRPdXRlckNsYXNzTmFtZUluZGV4KCk7CisJCWlubmVyTmFtZUluZGV4ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJOYW1lSW5kZXgoKTsKKwkJYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRBY2Nlc3NGbGFncygpOworCQlidWZmZXIKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIub3BlbmlubmVyY2xhc3NlbnRyeSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmlubmVyX2NsYXNzX2luZm9fbmFtZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoaW5uZXJDbGFzc05hbWVJbmRleCk7CisJCWlmIChpbm5lckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJDbGFzc05hbWUoKSk7CisJCX0KKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLm91dGVyX2NsYXNzX2luZm9fbmFtZSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQob3V0ZXJDbGFzc05hbWVJbmRleCk7CisJCWlmIChvdXRlckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWJ1ZmZlcgkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmdldE91dGVyQ2xhc3NOYW1lKCkpOworCQl9CisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQlkdW1wVGFiKHRhYk51bWJlciArIDEsIGJ1ZmZlcik7CisJCWJ1ZmZlcgorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5pbm5lcl9uYW1lIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChpbm5lck5hbWVJbmRleCk7CisJCWlmIChpbm5lck5hbWVJbmRleCAhPSAwKSB7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmdldElubmVyTmFtZSgpKTsKKwkJfQorCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOworCQlidWZmZXIKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfYWNjZXNzZmxhZ3MiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChhY2Nlc3NGbGFncykKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKGJ1ZmZlciwgYWNjZXNzRmxhZ3MpOworCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsb3NlaW5uZXJjbGFzc2VudHJ5IikpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByaXZhdGUgdm9pZCBjaGVja1N1cGVyRmxhZ3MoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciApIHsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1VQRVIpID09IDApIHsKKwkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5zdXBlcmZsYWdub3RzZXQiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJCisJcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXBUYWIoaW50IHRhYk51bWJlciwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYk51bWJlcjsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfSAKKwkKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGVUeXBlTWVtYmVycyhJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCUlGaWVsZEluZm9bXSBmaWVsZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0RmllbGRJbmZvcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlkaXNhc3NlbWJsZShmaWVsZHNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKKwkJfQorCQlJTWV0aG9kSW5mb1tdIG1ldGhvZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWRpc2Fzc2VtYmxlKGNsYXNzRmlsZVJlYWRlciwgbWV0aG9kc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlTmV3TGluZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlcikgeworCQlidWZmZXIuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOworCQlkdW1wVGFiKHRhYk51bWJlciwgYnVmZmVyKTsKKwl9CisgCisJLyoqCisJICogRGlzYXNzZW1ibGUgYSBmaWVsZCBpbmZvCisJICovCisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElGaWVsZEluZm8gZmllbGRJbmZvLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciwgaW50IG1vZGUpIHsKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJZGVjb2RlTW9kaWZpZXJzRm9yRmllbGQoYnVmZmVyLCBmaWVsZEluZm8uZ2V0QWNjZXNzRmxhZ3MoKSk7CisJCWNoYXJbXSBmaWVsZERlc2NyaXB0b3IgPSBmaWVsZEluZm8uZ2V0RGVzY3JpcHRvcigpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZmllbGREZXNjcmlwdG9yLCAnLycsICcuJyk7CisJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KGZpZWxkRGVzY3JpcHRvcikpOworCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhmaWVsZEluZm8uZ2V0TmFtZSgpKSk7CisJCUlDb25zdGFudFZhbHVlQXR0cmlidXRlIGNvbnN0YW50VmFsdWVBdHRyaWJ1dGUgPSBmaWVsZEluZm8uZ2V0Q29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSgpOworCQlpZiAoY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmZpZWxkaGFzY29uc3RhbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50VmFsdWVBdHRyaWJ1dGUuZ2V0Q29uc3RhbnRWYWx1ZSgpOworCQkJc3dpdGNoKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSkgeworCQkJCWNhc2UgSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0xvbmcgOgorCQkJCQlidWZmZXIuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldExvbmdWYWx1ZSgpICsgIkwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9GbG9hdCA6CisJCQkJCWJ1ZmZlci5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0RmxvYXRWYWx1ZSgpICsgImYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9Eb3VibGUgOgorCQkJCQlidWZmZXIuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldERvdWJsZVZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9JbnRlZ2VyOgorCQkJCQlzd2l0Y2goZmllbGREZXNjcmlwdG9yWzBdKSB7CisJCQkJCQljYXNlICdDJyA6CisJCQkJCQkJYnVmZmVyLmFwcGVuZCgiJyIgKyAoY2hhcikgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnWicgOgorCQkJCQkJCWJ1ZmZlci5hcHBlbmQoY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkgPT0gMSA/ICJ0cnVlIiA6ICJmYWxzZSIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdCJyA6CisJCQkJCQkJYnVmZmVyLmFwcGVuZCgoYnl0ZSkgY29uc3RhbnRQb29sRW50cnkuZ2V0SW50ZWdlclZhbHVlKCkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnUycgOgorCQkJCQkJCWJ1ZmZlci5hcHBlbmQoKHNob3J0KSBjb25zdGFudFBvb2xFbnRyeS5nZXRJbnRlZ2VyVmFsdWUoKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdJJyA6CisJCQkJCQkJYnVmZmVyLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXRJbnRlZ2VyVmFsdWUoKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfU3RyaW5nOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcIiIgKyBkZWNvZGVTdHJpbmdWYWx1ZShjb25zdGFudFBvb2xFbnRyeS5nZXRTdHJpbmdWYWx1ZSgpKSArICJcIiIgKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJfQorCQl9CisJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuZW5kb2ZmaWVsZGhlYWRlciIpKTsgLy8kTk9OLU5MUy0xJAorCQlJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IGZpZWxkSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisJCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSUNsYXNzRmlsZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworCQkJCWlmIChhdHRyaWJ1dGUgIT0gY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSkgeworCQkJCQlkaXNhc3NlbWJsZShhdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1vZGUgPT0gSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERVRBSUxFRCkgeworCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShmaWVsZERlc2NyaXB0b3IsICcuJywgJy8nKTsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudHN0YXJ0IikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmZpZWxkZGRlc2NyaXB0b3IiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuZmllbGRkZXNjcmlwdG9yaW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoZmllbGRJbmZvLmdldERlc2NyaXB0b3JJbmRleCgpKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoZmllbGREZXNjcmlwdG9yKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJfQorCisJLyoqCisJICogRGlzYXNzZW1ibGUgYSBtZXRob2QgaW5mbyBoZWFkZXIKKwkgKi8KKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIsIElNZXRob2RJbmZvIG1ldGhvZEluZm8sIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgeworCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQlpbnQgYWNjZXNzRmxhZ3MgPSBtZXRob2RJbmZvLmdldEFjY2Vzc0ZsYWdzKCk7CisJCWRlY29kZU1vZGlmaWVyc0Zvck1ldGhvZChidWZmZXIsIGFjY2Vzc0ZsYWdzKTsKKwkJY2hhcltdIG1ldGhvZERlc2NyaXB0b3IgPSBtZXRob2RJbmZvLmdldERlc2NyaXB0b3IoKTsKKwkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1ldGhvZERlc2NyaXB0b3IsICcvJywgJy4nKTsKKwkJY2hhcltdIG1ldGhvZE5hbWUgPSBudWxsOworCQlpZiAobWV0aG9kSW5mby5pc0NvbnN0cnVjdG9yKCkpIHsKKwkJCW1ldGhvZE5hbWUgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0Q2xhc3NOYW1lKCk7CisJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b0NoYXJBcnJheShtZXRob2REZXNjcmlwdG9yLCBtZXRob2ROYW1lLCBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yKSAsIHRydWUsIGZhbHNlKSk7CisJCX0gZWxzZSBpZiAobWV0aG9kSW5mby5pc0NsaW5pdCgpKSB7CisJCQltZXRob2ROYW1lID0gVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuY2xpbml0bmFtZSIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kTmFtZSk7CisJCX0gZWxzZSB7CisJCQltZXRob2ROYW1lID0gbWV0aG9kSW5mby5nZXROYW1lKCk7CisJCQlidWZmZXIuYXBwZW5kKFNpZ25hdHVyZS50b0NoYXJBcnJheShtZXRob2REZXNjcmlwdG9yLCBtZXRob2ROYW1lLCBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yKSAsIGZhbHNlLCB0cnVlKSk7CisJCX0KKwkJSUV4Y2VwdGlvbkF0dHJpYnV0ZSBleGNlcHRpb25BdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldEV4Y2VwdGlvbkF0dHJpYnV0ZSgpOworCQlpZiAoZXhjZXB0aW9uQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQudGhyb3dzIikpOyAvLyROT04tTkxTLTEkCisJCQljaGFyW11bXSBleGNlcHRpb25OYW1lcyA9IGV4Y2VwdGlvbkF0dHJpYnV0ZS5nZXRFeGNlcHRpb25OYW1lcygpOworCQkJaW50IGxlbmd0aCA9IGV4Y2VwdGlvbk5hbWVzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CisJCQkJY2hhcltdIGV4Y2VwdGlvbk5hbWUgPSBleGNlcHRpb25OYW1lc1tpXTsKKwkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZXhjZXB0aW9uTmFtZSwgJy8nLCAnLicpOworCQkJCWJ1ZmZlcgorCQkJCQkuYXBwZW5kKGV4Y2VwdGlvbk5hbWUpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWNoYXJbXSBleGNlcHRpb25OYW1lID0gZXhjZXB0aW9uTmFtZXNbbGVuZ3RoIC0gMV07CisJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZXhjZXB0aW9uTmFtZSwgJy8nLCAnLicpOworCQkJYnVmZmVyLmFwcGVuZChleGNlcHRpb25OYW1lKTsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmVuZG9mbWV0aG9kaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCWlmIChtb2RlID09IElDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuREVUQUlMRUQpIHsKKwkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXRob2REZXNjcmlwdG9yLCAnLicsICcvJyk7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5tZXRob2RkZXNjcmlwdG9yIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKG1ldGhvZEluZm8uZ2V0RGVzY3JpcHRvckluZGV4KCkpCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChtZXRob2REZXNjcmlwdG9yKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJfQorCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7CisJCUlDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzID0gbWV0aG9kSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisJCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSUNsYXNzRmlsZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworCQkJCWlmICgoYXR0cmlidXRlICE9IGNvZGVBdHRyaWJ1dGUpICYmIChhdHRyaWJ1dGUgIT0gZXhjZXB0aW9uQXR0cmlidXRlKSkgeworCQkJCQlkaXNhc3NlbWJsZShhdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGNvZGVBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJZGlzYXNzZW1ibGUoY29kZUF0dHJpYnV0ZSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkaXNhc3NlbWJsZShJQ2xhc3NGaWxlQXR0cmlidXRlIGNsYXNzRmlsZUF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5nZW5lcmljYXR0cmlidXRlaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQlidWZmZXIKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuZ2VuZXJpY2F0dHJpYnV0ZW5hbWUiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChjbGFzc0ZpbGVBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5nZW5lcmljYXR0cmlidXRlbGVuZ3RoIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY2xhc3NGaWxlQXR0cmlidXRlLmdldEF0dHJpYnV0ZUxlbmd0aCgpKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29kZWF0dHJpYnV0ZWhlYWRlciIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJYnVmZmVyCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm1heFN0YWNrIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoY29kZUF0dHJpYnV0ZS5nZXRNYXhTdGFjaygpKQorCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb21tYSIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm1heExvY2FscyIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKGNvZGVBdHRyaWJ1dGUuZ2V0TWF4TG9jYWxzKCkpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRlbmQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyIC0gMSk7CisJCURlZmF1bHRCeXRlY29kZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJdHJ5IHsKKwkJCWNvZGVBdHRyaWJ1dGUudHJhdmVyc2UodmlzaXRvcik7CisJCX0gY2F0Y2goQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgeworCQl9CisJCWludCBleGNlcHRpb25UYWJsZUxlbmd0aCA9IGNvZGVBdHRyaWJ1dGUuZ2V0RXhjZXB0aW9uVGFibGVMZW5ndGgoKTsKKwkJaWYgKGV4Y2VwdGlvblRhYmxlTGVuZ3RoICE9IDApIHsKKwkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJSUV4Y2VwdGlvblRhYmxlRW50cnlbXSBleGNlcHRpb25UYWJsZUVudHJpZXMgPSBjb2RlQXR0cmlidXRlLmdldEV4Y2VwdGlvblRhYmxlKCk7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmV4Y2VwdGlvbnRhYmxlaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAyKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uVGFibGVMZW5ndGg7IGkrKykgeworCQkJCUlFeGNlcHRpb25UYWJsZUVudHJ5IGV4Y2VwdGlvblRhYmxlRW50cnkgPSBleGNlcHRpb25UYWJsZUVudHJpZXNbaV07CisJCQkJYnVmZmVyCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuZXhjZXB0aW9udGFibGVmcm9tIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChleGNlcHRpb25UYWJsZUVudHJ5LmdldFN0YXJ0UEMoKSkKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5leGNlcHRpb250YWJsZXRvIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChleGNlcHRpb25UYWJsZUVudHJ5LmdldEVuZFBDKCkpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuZXhjZXB0aW9udGFibGVnb3RvIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChleGNlcHRpb25UYWJsZUVudHJ5LmdldEhhbmRsZXJQQygpKQorCQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmV4Y2VwdGlvbnRhYmxld2hlbiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChleGNlcHRpb25UYWJsZUVudHJ5LmdldENhdGNoVHlwZUluZGV4KCkgPT0gMCkgeworCQkJCQlidWZmZXIuYXBwZW5kKEFOWV9FWENFUFRJT04pOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXJbXSBjYXRjaFR5cGUgPSBleGNlcHRpb25UYWJsZUVudHJ5LmdldENhdGNoVHlwZSgpOworCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoY2F0Y2hUeXBlLCAnLycsICcuJyk7CisJCQkJCWJ1ZmZlci5hcHBlbmQoY2F0Y2hUeXBlKTsKKwkJCQl9CisJCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMik7CisJCQl9CisJCX0KKwkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOworCQlpbnQgbGluZUF0dHJpYnV0ZUxlbmd0aCA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUgPT0gbnVsbCA/IDAgOiBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZUxlbmd0aCgpOworCQlpZiAobGluZUF0dHJpYnV0ZUxlbmd0aCAhPSAwKSB7CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIubGluZW51bWJlcmF0dHJpYnV0ZWhlYWRlciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMik7CisJCQlpbnRbXVtdIGxpbmVhdHRyaWJ1dGVzRW50cmllcyA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVBdHRyaWJ1dGVMZW5ndGggLSAxOyBpKyspIHsKKwkJCQlidWZmZXIKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5saW5lbnVtYmVydGFibGVmcm9tIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChsaW5lYXR0cmlidXRlc0VudHJpZXNbaV1bMF0pCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubGluZW51bWJlcnRhYmxldG8iKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkuYXBwZW5kKGxpbmVhdHRyaWJ1dGVzRW50cmllc1tpXVsxXSkKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5saW5lbnVtYmVydGFibGVjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDIpOworCQkJfQorCQkJYnVmZmVyCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5saW5lbnVtYmVydGFibGVmcm9tIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGxpbmVhdHRyaWJ1dGVzRW50cmllc1tsaW5lQXR0cmlidXRlTGVuZ3RoIC0gMV1bMF0pCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5saW5lbnVtYmVydGFibGV0byIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChsaW5lYXR0cmlidXRlc0VudHJpZXNbbGluZUF0dHJpYnV0ZUxlbmd0aCAtIDFdWzFdKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubGluZW51bWJlcnRhYmxlY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfSAKKwkJSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSgpOworCQlpbnQgbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZUxlbmd0aCA9IGxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPT0gbnVsbCA/IDAgOiBsb2NhbFZhcmlhYmxlQXR0cmlidXRlLmdldExvY2FsVmFyaWFibGVUYWJsZUxlbmd0aCgpOworCQlpZiAobG9jYWxWYXJpYWJsZUF0dHJpYnV0ZUxlbmd0aCAhPSAwKSB7CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIubG9jYWx2YXJpYWJsZXRhYmxlYXR0cmlidXRlaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAyKTsKKwkJCUlMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXMgPSBsb2NhbFZhcmlhYmxlQXR0cmlidXRlLmdldExvY2FsVmFyaWFibGVUYWJsZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFZhcmlhYmxlQXR0cmlidXRlTGVuZ3RoIC0gMTsgaSsrKSB7CisJCQkJSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5ID0gbG9jYWxWYXJpYWJsZVRhYmxlRW50cmllc1tpXTsKKwkJCQlpbnQgc3RhcnRQQyA9IGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmdldFN0YXJ0UEMoKTsKKwkJCQlpbnQgbGVuZ3RoICA9IGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmdldExlbmd0aCgpOworCQkJCWJ1ZmZlcgorCQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmxvY2FsdmFyaWFibGV0YWJsZWZyb20iKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkuYXBwZW5kKHN0YXJ0UEMpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubG9jYWx2YXJpYWJsZXRhYmxldG8iKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkuYXBwZW5kKHN0YXJ0UEMgKyBsZW5ndGgpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubG9jYWx2YXJpYWJsZXRhYmxlbG9jYWxuYW1lIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJLmFwcGVuZChsb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5nZXROYW1lKCkpCisJCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubG9jYWx2YXJpYWJsZXRhYmxlbG9jYWxpbmRleCIpKSAvLyROT04tTkxTLTEkCisJCQkJCS5hcHBlbmQobG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuZ2V0SW5kZXgoKSkKKwkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGVsb2NhbHR5cGUiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkuYXBwZW5kKFNpZ25hdHVyZS50b0NoYXJBcnJheShsb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5nZXREZXNjcmlwdG9yKCkpKTsKKwkJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAyKTsKKwkJCX0KKwkJCUlMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSBsb2NhbFZhcmlhYmxlVGFibGVFbnRyeSA9IGxvY2FsVmFyaWFibGVUYWJsZUVudHJpZXNbbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZUxlbmd0aCAtIDFdOworCQkJaW50IHN0YXJ0UEMgPSBsb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5nZXRTdGFydFBDKCk7CisJCQlpbnQgbGVuZ3RoICA9IGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmdldExlbmd0aCgpOworCQkJYnVmZmVyCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGVmcm9tIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKHN0YXJ0UEMpCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGV0byIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChzdGFydFBDICsgbGVuZ3RoKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubG9jYWx2YXJpYWJsZXRhYmxlbG9jYWxuYW1lIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmdldE5hbWUoKSkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmxvY2FsdmFyaWFibGV0YWJsZWxvY2FsaW5kZXgiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQobG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuZ2V0SW5kZXgoKSkKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmxvY2FsdmFyaWFibGV0YWJsZWxvY2FsdHlwZSIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkobG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuZ2V0RGVzY3JpcHRvcigpKSk7CisJCX0gCisJfQorCisJcHJpdmF0ZSBjaGFyW11bXSBnZXRQYXJhbWV0ZXJOYW1lcyhjaGFyW10gbWV0aG9kRGVzY3JpcHRvcikgeworCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChtZXRob2REZXNjcmlwdG9yKTsKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltwYXJhbUNvdW50XVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgeworCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5wYXJhbWV0ZXJuYW1lIikudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBwYXJhbWV0ZXJOYW1lczsKKwl9CisJCisJcHJpdmF0ZSBmaW5hbCB2b2lkIGRlY29kZU1vZGlmaWVyc0ZvclR5cGUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzKSB7CisJCWJvb2xlYW4gZmlyc3RNb2RpZmllciA9IHRydWU7CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2Fic3RyYWN0IikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfRklOQUwpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfZmluYWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHVibGljIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBhY2Nlc3NGbGFncykgeworCQlib29sZWFuIGZpcnN0TW9kaWZpZXIgPSB0cnVlOworCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHVibGljIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJJVkFURSkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wcml2YXRlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJPVEVDVEVEKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3Byb3RlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NUQVRJQykgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19zdGF0aWMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19GSU5BTCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19maW5hbCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2Fic3RyYWN0IikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9yTWV0aG9kKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBhY2Nlc3NGbGFncykgeworCQlib29sZWFuIGZpcnN0TW9kaWZpZXIgPSB0cnVlOworCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19BQlNUUkFDVCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19hYnN0cmFjdCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2ZpbmFsIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfTkFUSVZFKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX25hdGl2ZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BSSVZBVEUpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHJpdmF0ZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BST1RFQ1RFRCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wcm90ZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHVibGljIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1RBVElDKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3N0YXRpYyIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NUUklDVCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19zdHJpY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TWU5DSFJPTklaRUQpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2Nfc3luY2hyb25pemVkIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9yRmllbGQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzKSB7CisJCWJvb2xlYW4gZmlyc3RNb2RpZmllciA9IHRydWU7CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2ZpbmFsIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJJVkFURSkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wcml2YXRlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJPVEVDVEVEKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3Byb3RlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BVQkxJQykgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wdWJsaWMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TVEFUSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2Nfc3RhdGljIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfVFJBTlNJRU5UKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3RyYW5zaWVudCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1ZPTEFUSUxFKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3ZvbGF0aWxlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CQorCisJcHJpdmF0ZSBTdHJpbmcgZGVjb2RlU3RyaW5nVmFsdWUoU3RyaW5nIHMpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJY2hhcltdIGNoYXJzID0gcy50b0NoYXJBcnJheSgpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gY2hhcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWNoYXIgYyA9IGNoYXJzW2ldOworCQkJc3dpdGNoKGMpIHsKKwkJCQljYXNlICdcYicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcdCcgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcbicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcZicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdccicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcIic6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcJyc6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXCciKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcXCc6CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMCcgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMScgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcMycgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcNCcgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcNScgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcNicgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcNycgOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXDciKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlidWZmZXIuYXBwZW5kKGMpOworCQkJfQorCQl9CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0R1bXBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIwNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YQpAQCAtMCwwICsxLDMwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEuaW8uKjsKKworLyoqCisgKiBBIGR1bXBlciBrbm93cyBob3cgdG8gZHVtcCBvYmplY3RzIGluIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gdG8gYSBQcmludFdyaXRlci4KKyAqIE9iamVjdHMgd2hpY2ggaW1wbGVtZW50IElEdW1wYWJsZSBrbm93IGhvdyB0byBkdW1wIHRoZW1zZWx2ZXMgdG8gYSBEdW1wZXIsIG90aGVyd2lzZQorICogdGhlIGR1bXBlciBqdXN0IHVzZXMgdG9TdHJpbmcoKSBvbiB0aGUgb2JqZWN0LgorICogRXhhbXBsZToKKyAqIDxwcmU+CisgKiAgIER1bXBlciBkdW1wZXIgPSBuZXcgRHVtcGVyKFN5c3RlbS5vdXQpOworICogICBkdW1wZXIuZHVtcChteU9iamVjdCk7CisgKiAgIGR1bXBlci5mbHVzaCgpOworICogPC9wcmU+CisgKgorICogQHNlZSBJRHVtcGFibGUKKyAqIEBzZWUgUHJpbnRXcml0ZXIKKyAqLworcHVibGljIGNsYXNzIER1bXBlciB7CisJaW50IGZUYWJMZXZlbCA9IDA7CisJUHJpbnRXcml0ZXIgZldyaXRlcjsKKy8qKgorICogQ3JlYXRlcyBhIGR1bXBlciB3aGljaCBzZW5kcyBvdXRwdXQgdG8gU3lzdGVtLm91dC4KKyAqLworcHVibGljIER1bXBlcigpIHsKKwl0aGlzKFN5c3RlbS5vdXQpOworfQorLyoqCisgKiBDcmVhdGVzIGEgZHVtcGVyIHdoaWNoIHNlbmRzIG91dHB1dCB0byB0aGUgZ2l2ZW4gT3V0cHV0U3RyZWFtLgorICovCitwdWJsaWMgRHVtcGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKKwl0aGlzKG5ldyBQcmludFdyaXRlcihvdXQpKTsKK30KKy8qKgorICogQ3JlYXRlcyBhIGR1bXBlciB3aGljaCBzZW5kcyBvdXRwdXQgdG8gdGhlIGdpdmVuIFByaW50V3JpdGVyLgorICovCitwdWJsaWMgRHVtcGVyKFByaW50V3JpdGVyIHdyaXRlcikgeworCWZXcml0ZXIgPSB3cml0ZXI7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LgorICovCitTdHJpbmcgY2xhc3NOYW1lRm9yKE9iamVjdCB2YWwpIHsKKwlTdHJpbmcgbmFtZSA9IHZhbC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKwlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwlpZiAoaSAhPSAtMSkgeworCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoaSsxKTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiBhcnJheS4KKyAqIFByaW50cyBhIG1heGltdW0gb2YgbWF4UGVyTGluZSBpdGVtcyBwZXIgbGluZS4KKyAqLworcHVibGljIHZvaWQgZHVtcChpbnRbXSB2YWwsIGludCBtYXhQZXJMaW5lKSB7CisJaW50IGxlbiA9IHZhbC5sZW5ndGg7CisJYm9vbGVhbiBvbmVMaW5lID0gKGxlbiA8PSBtYXhQZXJMaW5lKTsKKwlpZiAoIW9uZUxpbmUpIHsKKwkJKytmVGFiTGV2ZWw7CisJfQorCWZXcml0ZXIucHJpbnQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKCFvbmVMaW5lKSB7CisJCQlpZiAoKGkgJSBtYXhQZXJMaW5lKSA9PSAwKSB7CisJCQkJZldyaXRlci5wcmludGxuKCk7CisJCQkJdGFiSWZOZWVkZWQoKTsKKwkJCQlmV3JpdGVyLnByaW50KGkpOworCQkJCWZXcml0ZXIucHJpbnQoIjogIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlmV3JpdGVyLnByaW50KHZhbFtpXSk7CisJCWlmIChpICsgMSA8IGxlbikgeworCQkJZldyaXRlci5wcmludCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCWlmIChvbmVMaW5lKSB7CisJCWZXcml0ZXIucHJpbnQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCQlmV3JpdGVyLnByaW50bG4oKTsKKwl9CisJZWxzZSB7CisJCWZXcml0ZXIucHJpbnRsbigpOworCQktLWZUYWJMZXZlbDsKKwkJdGFiSWZOZWVkZWQoKTsKKwkJZldyaXRlci5wcmludCgiXSIpOyAvLyROT04tTkxTLTEkCisJCWZXcml0ZXIucHJpbnRsbigpOworCX0KK30KKy8qKgorICogRHVtcHMgdGhlIGdpdmVuIGFycmF5LgorICovCitwdWJsaWMgdm9pZCBkdW1wKE9iamVjdFtdIHZhbCkgeworCWludCBsZW4gPSB2YWwubGVuZ3RoOworCWZXcml0ZXIucHJpbnQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChsZW4gPiAwKSB7CisJCWZXcml0ZXIucHJpbnRsbigpOworCQkrK2ZUYWJMZXZlbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJZHVtcCh2YWxbaV0pOworCQl9CisJCS0tZlRhYkxldmVsOworCQl0YWJJZk5lZWRlZCgpOworCX0KKwlmV3JpdGVyLnByaW50bG4oIl0iKTsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBEdW1wcyB0aGUgZ2l2ZW4gYXJyYXkuCisgKiBQcmludHMgYSBtYXhpbXVtIG9mIG1heFBlckxpbmUgaXRlbXMgcGVyIGxpbmUuCisgKi8KK3B1YmxpYyB2b2lkIGR1bXAoU3RyaW5nW10gdmFsLCBpbnQgbWF4UGVyTGluZSkgeworCWludCBsZW4gPSB2YWwubGVuZ3RoOworCWJvb2xlYW4gb25lTGluZSA9IChsZW4gPD0gbWF4UGVyTGluZSk7CisJaWYgKCFvbmVMaW5lKSB7CisJCSsrZlRhYkxldmVsOworCX0KKwlmV3JpdGVyLnByaW50KCJbIik7IC8vJE5PTi1OTFMtMSQKKwlib29sZWFuIG5ld0xpbmUgPSAhb25lTGluZTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWlmIChuZXdMaW5lKSB7CisJCQlmV3JpdGVyLnByaW50bG4oKTsKKwkJCXRhYklmTmVlZGVkKCk7CisJCX0KKwkJZldyaXRlci5wcmludCgiXCIiICsgdmFsW2ldICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAoaSArIDEgPCBsZW4pIHsKKwkJCWZXcml0ZXIucHJpbnQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQluZXdMaW5lID0gKGkgIT0gMCAmJiAoaSAlIG1heFBlckxpbmUpID09IDApOworCX0KKwlmV3JpdGVyLnByaW50KCJdIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAob25lTGluZSB8fCBuZXdMaW5lKSB7CisJCWZXcml0ZXIucHJpbnRsbigpOworCX0KKwlpZiAoIW9uZUxpbmUpIHsKKwkJLS1mVGFiTGV2ZWw7CisJfQorfQorLyoqCisgKiBEdW1wcyB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KK3B1YmxpYyB2b2lkIGR1bXAoT2JqZWN0IHZhbCkgeworCXRhYklmTmVlZGVkKCk7CisJaWYgKHZhbCBpbnN0YW5jZW9mIElEdW1wYWJsZSkgeworCQlJRHVtcGFibGUgZHVtcGFibGUgPSAoSUR1bXBhYmxlKSB2YWw7CisJCWZXcml0ZXIucHJpbnRsbihjbGFzc05hbWVGb3IodmFsKSArICIgeyIpOyAvLyROT04tTkxTLTEkCisJCWludCBvcmlnaW5hbExldmVsID0gZlRhYkxldmVsOworCQkrK2ZUYWJMZXZlbDsKKwkJdHJ5IHsKKwkJCWR1bXBhYmxlLmR1bXAodGhpcyk7CisJCX0KKwkJY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQlmV3JpdGVyLnByaW50bG4oIipFUlIqIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlmVGFiTGV2ZWwgPSBvcmlnaW5hbExldmVsOworCQl0YWJJZk5lZWRlZCgpOworCQlmV3JpdGVyLnByaW50bG4oIn0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwllbHNlIHsKKwkJZldyaXRlci5wcmludGxuKHZhbCk7CisJfQorfQorLyoqCisgKiBEdW1wcyB0aGUgZ2l2ZW4gdmFsdWUsIHdpdGggdGhlIGdpdmVuIG5hbWUgYXMgYSBwcmVmaXguCisgKi8KK3B1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIG5hbWUsIGludFtdIHZhbCkgeworCWR1bXAobmFtZSwgdmFsLCAxMCk7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiBhcnJheSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhcyBhIHByZWZpeC4KKyAqIFByaW50cyBhIG1heGltdW0gb2YgbWF4UGVyTGluZSBpdGVtcyBwZXIgbGluZS4KKyAqLworcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgaW50W10gdmFsLCBpbnQgbWF4UGVyTGluZSkgeworCXByZWZpeChuYW1lKTsKKwlkdW1wKHZhbCwgbWF4UGVyTGluZSk7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiB2YWx1ZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhcyBhIHByZWZpeC4KKyAqLworcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgT2JqZWN0W10gdmFsKSB7CisJcHJlZml4KG5hbWUpOworCWR1bXAodmFsKTsKK30KKy8qKgorICogRHVtcHMgdGhlIGdpdmVuIHZhbHVlLCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFzIGEgcHJlZml4LgorICovCitwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBuYW1lLCBTdHJpbmdbXSB2YWwpIHsKKwlwcmVmaXgobmFtZSk7CisJZHVtcCh2YWwsIDUpOworfQorLyoqCisgKiBEdW1wcyB0aGUgZ2l2ZW4gdmFsdWUsIHdpdGggdGhlIGdpdmVuIG5hbWUgYXMgYSBwcmVmaXguCisgKi8KK3B1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIG5hbWUsIGludCB2YWwpIHsKKwlwcmVmaXgobmFtZSk7CisJZldyaXRlci5wcmludGxuKHZhbCk7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiB2YWx1ZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhcyBhIHByZWZpeC4KKyAqLworcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbCkgeworCXByZWZpeChuYW1lKTsKKwlmV3JpdGVyLnByaW50bG4oKTsKKwkrK2ZUYWJMZXZlbDsKKwlkdW1wKHZhbCk7CisJLS1mVGFiTGV2ZWw7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiB2YWx1ZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhcyBhIHByZWZpeC4KKyAqLworcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbCkgeworCXByZWZpeChuYW1lKTsKKwlmV3JpdGVyLnByaW50bG4odmFsID09IG51bGwgPyAibnVsbCIgOiAiXCIiICsgdmFsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkCit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiB2YWx1ZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhcyBhIHByZWZpeC4KKyAqLworcHVibGljIHZvaWQgZHVtcChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWwpIHsKKwlwcmVmaXgobmFtZSk7CisJZldyaXRlci5wcmludGxuKHZhbCk7Cit9CisvKioKKyAqIER1bXBzIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFzIGEgcHJlZml4LgorICovCitwdWJsaWMgdm9pZCBkdW1wTWVzc2FnZShTdHJpbmcgbmFtZSwgU3RyaW5nIG1zZykgeworCXByZWZpeChuYW1lKTsKKwlmV3JpdGVyLnByaW50bG4obXNnKTsKK30KKy8qKgorICogRmx1c2hlcyB0aGUgb3V0cHV0IHdyaXRlci4KKyAqLworcHVibGljIHZvaWQgZmx1c2goKSB7CisJZldyaXRlci5mbHVzaCgpOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYiBsZXZlbC4KKyAqLworcHVibGljIGludCBnZXRUYWJMZXZlbCgpIHsKKwlyZXR1cm4gZlRhYkxldmVsOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFByaW50V3JpdGVyLgorICovCitwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgeworCXJldHVybiBmV3JpdGVyOworfQorLyoqCisgKiBJbmNyZWFzZSB0aGUgY3VycmVudCB0YWIgbGV2ZWwuCisgKi8KK3B1YmxpYyB2b2lkIGluZGVudCgpIHsKKwkrK2ZUYWJMZXZlbDsKK30KKy8qKgorICogRGVjcmVhc2UgdGhlIGN1cnJlbnQgdGFiIGxldmVsLgorICovCitwdWJsaWMgdm9pZCBvdXRkZW50KCkgeworCWlmICgtLWZUYWJMZXZlbCA8IDApIAorCQlmVGFiTGV2ZWwgPSAwOworfQorLyoqCisgKiBPdXRwdXRzIHRoZSBnaXZlbiBwcmVmaXgsIHRhYmJpbmcgZmlyc3QgaWYgbmVlZGVkLgorICovCit2b2lkIHByZWZpeChTdHJpbmcgbmFtZSkgeworCXRhYklmTmVlZGVkKCk7CisJZldyaXRlci5wcmludChuYW1lKTsKKwlmV3JpdGVyLnByaW50KCI6ICIpOyAvLyROT04tTkxTLTEkCit9CisvKioKKyAqIFByaW50IGFuIG9iamVjdCBkaXJlY3RseSwgd2l0aG91dCBhIG5ld2xpbmUuCisgKi8KK3B1YmxpYyB2b2lkIHByaW50KE9iamVjdCBvYmopIHsKKwlmV3JpdGVyLnByaW50KG9iaik7Cit9CisvKioKKyAqIFByaW50IGEgbmV3bGluZSBkaXJlY3RseS4KKyAqLworcHVibGljIHZvaWQgcHJpbnRsbigpIHsKKwlmV3JpdGVyLnByaW50bG4oKTsKK30KKy8qKgorICogUHJpbnQgYW4gb2JqZWN0IGRpcmVjdGx5LCB3aXRoIGEgbmV3bGluZS4KKyAqLworcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3Qgb2JqKSB7CisJZldyaXRlci5wcmludGxuKG9iaik7Cit9CisvKioKKyAqIE91dHB1dHMgdGFicyBpZiBuZWVkZWQuCisgKi8KK3ZvaWQgdGFiSWZOZWVkZWQoKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFiTGV2ZWw7ICsraSkgeworCQlmV3JpdGVyLnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkCisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25BdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExNTIxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbENvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUV4Y2VwdGlvbkF0dHJpYnV0ZTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElFeGNlcHRpb25BdHRyaWJ1dGUuCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25BdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUgaW1wbGVtZW50cyBJRXhjZXB0aW9uQXR0cmlidXRlIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOT19FWENFUFRJT05fSU5ERVhFUyA9IG5ldyBpbnRbMF07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gTk9fRVhDRVBUSU9OX05BTUVTID0gbmV3IGNoYXJbMF1bMF07CisJCisJcHJpdmF0ZSBpbnQgZXhjZXB0aW9uc051bWJlcjsKKwlwcml2YXRlIGNoYXJbXVtdIGV4Y2VwdGlvbk5hbWVzOworCXByaXZhdGUgaW50W10gZXhjZXB0aW9uSW5kZXhlczsKKwkKKwlFeGNlcHRpb25BdHRyaWJ1dGUoYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzLCBJQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCwgaW50IG9mZnNldCkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKwkJc3VwZXIoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0KTsKKwkJdGhpcy5leGNlcHRpb25zTnVtYmVyID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJaW50IGV4Y2VwdGlvbkxlbmd0aCA9IHRoaXMuZXhjZXB0aW9uc051bWJlcjsKKwkJdGhpcy5leGNlcHRpb25OYW1lcyA9IE5PX0VYQ0VQVElPTl9OQU1FUzsKKwkJdGhpcy5leGNlcHRpb25JbmRleGVzID0gTk9fRVhDRVBUSU9OX0lOREVYRVM7CisJCWlmIChleGNlcHRpb25MZW5ndGggIT0gMCkgeworCQkJdGhpcy5leGNlcHRpb25OYW1lcyA9IG5ldyBjaGFyW2V4Y2VwdGlvbkxlbmd0aF1bXTsKKwkJCXRoaXMuZXhjZXB0aW9uSW5kZXhlcyA9IG5ldyBpbnRbZXhjZXB0aW9uTGVuZ3RoXTsKKwkJfQorCQlpbnQgcmVhZE9mZnNldCA9IDg7CisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25MZW5ndGg7IGkrKykgeworCQkJZXhjZXB0aW9uSW5kZXhlc1tpXSA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQsIG9mZnNldCk7CisJCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeShleGNlcHRpb25JbmRleGVzW2ldKTsKKwkJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX0NsYXNzKSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQl9CisJCQlleGNlcHRpb25OYW1lc1tpXSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5mb05hbWUoKTsKKwkJCXJlYWRPZmZzZXQgKz0gMjsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAc2VlIElFeGNlcHRpb25BdHRyaWJ1dGUjZ2V0RXhjZXB0aW9uSW5kZXhlcygpCisJICovCisJcHVibGljIGludFtdIGdldEV4Y2VwdGlvbkluZGV4ZXMoKSB7CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvbkluZGV4ZXM7CisJfQorCisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uQXR0cmlidXRlI2dldEV4Y2VwdGlvbk5hbWVzKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdW10gZ2V0RXhjZXB0aW9uTmFtZXMoKSB7CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvbk5hbWVzOworCX0KKworCS8qKgorCSAqIEBzZWUgSUV4Y2VwdGlvbkF0dHJpYnV0ZSNnZXRFeGNlcHRpb25zTnVtYmVyKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEV4Y2VwdGlvbnNOdW1iZXIoKSB7CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvbnNOdW1iZXI7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQlyZXR1cm4gSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkVYQ0VQVElPTlM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvblRhYmxlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTNmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvblRhYmxlRW50cnkuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRXhjZXB0aW9uVGFibGVFbnRyeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlc2NyaWJlcyBhbiBlbnRyeSBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlIGF0dHJpYnV0ZSBhY2NvcmRpbmcKKyAqIHRvIHRoZSBKVk0gc3BlY2lmaWNhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25UYWJsZUVudHJ5CisJZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QKKwlpbXBsZW1lbnRzIElFeGNlcHRpb25UYWJsZUVudHJ5IHsKKworCXByaXZhdGUgaW50IHN0YXJ0UEM7CisJcHJpdmF0ZSBpbnQgZW5kUEM7CisJcHJpdmF0ZSBpbnQgaGFuZGxlclBDOworCXByaXZhdGUgaW50IGNhdGNoVHlwZUluZGV4OworCXByaXZhdGUgY2hhcltdIGNhdGNoVHlwZTsKKwkKKwlFeGNlcHRpb25UYWJsZUVudHJ5KGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXRoaXMuc3RhcnRQQyA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDAsIG9mZnNldCk7CisJCXRoaXMuZW5kUEMgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAyLCBvZmZzZXQpOworCQl0aGlzLmhhbmRsZXJQQyA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDQsIG9mZnNldCk7CisJCXRoaXMuY2F0Y2hUeXBlSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOworCQlpZiAodGhpcy5jYXRjaFR5cGVJbmRleCAhPSAwKSB7CisJCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5jYXRjaFR5cGVJbmRleCk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzcykgeworCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJfQorCQkJdGhpcy5jYXRjaFR5cGUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZm9OYW1lKCk7CisJCX0KKwl9CisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uVGFibGVFbnRyeSNnZXRTdGFydFBDKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0UEMoKSB7CisJCXJldHVybiB0aGlzLnN0YXJ0UEM7CisJfQorCisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uVGFibGVFbnRyeSNnZXRFbmRQQygpCisJICovCisJcHVibGljIGludCBnZXRFbmRQQygpIHsKKwkJcmV0dXJuIHRoaXMuZW5kUEM7CisJfQorCisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uVGFibGVFbnRyeSNnZXRIYW5kbGVyUEMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SGFuZGxlclBDKCkgeworCQlyZXR1cm4gdGhpcy5oYW5kbGVyUEM7CisJfQorCisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uVGFibGVFbnRyeSNnZXRDYXRjaFR5cGVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRDYXRjaFR5cGVJbmRleCgpIHsKKwkJcmV0dXJuIHRoaXMuY2F0Y2hUeXBlSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJRXhjZXB0aW9uVGFibGVFbnRyeSNnZXRDYXRjaFR5cGUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0Q2F0Y2hUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5jYXRjaFR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0ZpZWxkSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9GaWVsZEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2RmY2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9GaWVsZEluZm8uamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFZhbHVlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUZpZWxkSW5mbzsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElGaWVsZEluZm8uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZEluZm8gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBJRmllbGRJbmZvIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkOworCXByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYzsKKwlwcml2YXRlIGludCBhY2Nlc3NGbGFnczsKKwlwcml2YXRlIGNoYXJbXSBuYW1lOworCXByaXZhdGUgY2hhcltdIGRlc2NyaXB0b3I7CisJcHJpdmF0ZSBpbnQgbmFtZUluZGV4OworCXByaXZhdGUgaW50IGRlc2NyaXB0b3JJbmRleDsKKwlwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7CisJcHJpdmF0ZSBpbnQgYXR0cmlidXRlQnl0ZXM7CisJcHJpdmF0ZSBJQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSBjb25zdGFudFZhbHVlQXR0cmlidXRlOworCXByaXZhdGUgSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7CisJCisJLyoqCisJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIGJ5dGVbXQorCSAqIEBwYXJhbSBvZmZzZXRzIGludFtdCisJICogQHBhcmFtIG9mZnNldCBpbnQKKwkgKi8KKwlwdWJsaWMgRmllbGRJbmZvKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpCisJCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXRoaXMuYWNjZXNzRmxhZ3MgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOworCisJCXRoaXMubmFtZUluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgMiwgb2Zmc2V0KTsKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KHRoaXMubmFtZUluZGV4KTsKKwkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgeworCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCX0KKwkJdGhpcy5uYW1lID0gY29uc3RhbnRQb29sRW50cnkuZ2V0VXRmOFZhbHVlKCk7CisKKwkJdGhpcy5kZXNjcmlwdG9ySW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA0LCBvZmZzZXQpOworCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLmRlc2NyaXB0b3JJbmRleCk7CisJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjgpIHsKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQl9CisJCXRoaXMuZGVzY3JpcHRvciA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOworCisJCXRoaXMuYXR0cmlidXRlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJdGhpcy5hdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQXR0cmlidXRlLk5PX0FUVFJJQlVURVM7CisJCWludCByZWFkT2Zmc2V0ID0gODsKKwkJaWYgKHRoaXMuYXR0cmlidXRlc0NvdW50ICE9IDApIHsKKwkJCXRoaXMuYXR0cmlidXRlcyA9IG5ldyBJQ2xhc3NGaWxlQXR0cmlidXRlW3RoaXMuYXR0cmlidXRlc0NvdW50XTsKKwkJfQorCQlpbnQgYXR0cmlidXRlc0luZGV4ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KSk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQl9CisJCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOworCQkJaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuREVQUkVDQVRFRCkpIHsKKwkJCQl0aGlzLmlzRGVwcmVjYXRlZCA9IHRydWU7CisJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IG5ldyBDbGFzc0ZpbGVBdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQl9IGVsc2UgaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU1lOVEhFVElDKSkgeworCQkJCXRoaXMuaXNTeW50aGV0aWMgPSB0cnVlOworCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSBuZXcgQ2xhc3NGaWxlQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOworCQkJfSBlbHNlIGlmIChlcXVhbHMoYXR0cmlidXRlTmFtZSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNPTlNUQU5UX1ZBTFVFKSkgeworCQkJCXRoaXMuY29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSA9IG5ldyBDb25zdGFudFZhbHVlQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOworCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSB0aGlzLmNvbnN0YW50VmFsdWVBdHRyaWJ1dGU7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSBuZXcgQ2xhc3NGaWxlQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOworCQkJfQorCQkJcmVhZE9mZnNldCArPSAoNiArIHU0QXQoY2xhc3NGaWxlQnl0ZXMsIHJlYWRPZmZzZXQgKyAyLCBvZmZzZXQpKTsKKwkJfQorCisJCWF0dHJpYnV0ZUJ5dGVzID0gcmVhZE9mZnNldDsKKwl9CisJLyoqCisJICogQHNlZSBJRmllbGRJbmZvI2dldEFjY2Vzc0ZsYWdzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEFjY2Vzc0ZsYWdzKCkgeworCQlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElGaWVsZEluZm8jZ2V0Q29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSgpCisJICovCisJcHVibGljIElDb25zdGFudFZhbHVlQXR0cmlidXRlIGdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmNvbnN0YW50VmFsdWVBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQHNlZSBJRmllbGRJbmZvI2dldERlc2NyaXB0b3IoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0RGVzY3JpcHRvcigpIHsKKwkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvcjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElGaWVsZEluZm8jZ2V0TmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCS8qKgorCSAqIEBzZWUgSUZpZWxkSW5mbyNoYXNDb25zdGFudFZhbHVlQXR0cmlidXRlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDb25zdGFudFZhbHVlQXR0cmlidXRlKCkgeworCQlyZXR1cm4gdGhpcy5jb25zdGFudFZhbHVlQXR0cmlidXRlICE9IG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBJRmllbGRJbmZvI2lzRGVwcmVjYXRlZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgeworCQlyZXR1cm4gdGhpcy5pc0RlcHJlY2F0ZWQ7CisJfQorCisJLyoqCisJICogQHNlZSBJRmllbGRJbmZvI2lzU3ludGhldGljKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsKKwkJcmV0dXJuIHRoaXMuaXNTeW50aGV0aWM7CisJfQorCisJaW50IHNpemVJbkJ5dGVzKCkgeworCQlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7CisJfQorCS8qKgorCSAqIEBzZWUgSUZpZWxkSW5mbyNnZXRBdHRyaWJ1dGVDb3VudCgpCisJICovCisJcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0NvdW50OworCX0KKworCS8qKgorCSAqIEBzZWUgSUZpZWxkSW5mbyNnZXREZXNjcmlwdG9ySW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9ySW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJRmllbGRJbmZvI2dldE5hbWVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXROYW1lSW5kZXgoKSB7CisJCXJldHVybiB0aGlzLm5hbWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElGaWVsZEluZm8jZ2V0QXR0cmlidXRlcygpCisJICovCisJcHVibGljIElDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUNhY2hlRW51bWVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUNhY2hlRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI2MDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogVGhlIDxjb2RlPklDYWNoZUVudW1lcmF0aW9uPC9jb2RlPiBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBib3RoIHRoZSBrZXlzIAorICogYW5kIHZhbHVlcyBpbiBhbiBMUlVDYWNoZS4gIFRoZSA8Y29kZT5nZXRWYWx1ZSgpPC9jb2RlPiBtZXRob2QgcmV0dXJucyB0aGUgCisgKiB2YWx1ZSBvZiB0aGUgbGFzdCBrZXkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPm5leHRFbGVtZW50KCk8L2NvZGU+LiAgCisgKiBUaGUgPGNvZGU+bmV4dEVsZW1lbnQoKTwvY29kZT4gbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgCisgKiA8Y29kZT5nZXRWYWx1ZSgpPC9jb2RlPiBtZXRob2QuCisgKgorICogPHA+VGhlIGl0ZXJhdGlvbiBjYW4gYmUgbWFkZSBlZmZpY2llbnQgYnkgbWFraW5nIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHZhbHVlcyBpbiAKKyAqIHRoZSBjYWNoZSAoaW5zdGFuY2VzIG9mIDxjb2RlPkxSVUNhY2hlRW50cnk8L2NvZGU+KSwga25vdyB0aGVpciBrZXkuICBGb3IgdGhpcyByZWFzb24sCisgKiBIYXNodGFibGUgbG9va3VwcyBkb24ndCBoYXZlIHRvIGJlIG1hZGUgYXQgZWFjaCBzdGVwIG9mIHRoZSBpdGVyYXRpb24uCisgKgorICogPHA+TW9kaWZpY2F0aW9ucyB0byB0aGUgY2FjaGUgbXVzdCBub3QgYmUgcGVyZm9ybWVkIHdoaWxlIHVzaW5nIHRoZQorICogZW51bWVyYXRpb24uICBEb2luZyBzbyB3aWxsIGxlYWQgdG8gYW4gaWxsZWdhbCBzdGF0ZS4KKyAqCisgKiBAc2VlIExSVUNhY2hlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNhY2hlRW51bWVyYXRpb24gZXh0ZW5kcyBFbnVtZXJhdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzbHkgYWNjZXNzZWQga2V5IGluIHRoZSBlbnVtZXJhdGlvbi4KKwkgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhIGNhbGwgdG8gbmV4dEVsZW1lbnQoKS4KKwkgKgorCSAqIEByZXR1cm4gVmFsdWUgb2YgY3VycmVudCBjYWNoZSBlbnRyeQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUR1bXBhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lEdW1wYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDhjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lEdW1wYWJsZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgCisgKiBJbXBsZW1lbnRvcnMga25vdyBob3cgdG8gZHVtcCB0aGVpciBpbnRlcm5hbCBzdGF0ZSBpbiBhIGh1bWFuLXJlYWRhYmxlIHdheQorICogdG8gYSBEdW1wZXIuCisgKgorICogQHNlZSBEdW1wZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJRHVtcGFibGUgeworCS8qKgorCSAqIER1bXBzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGlzIG9iamVjdCBpbiBhIGh1bWFuLXJlYWRhYmxlIHdheS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkdW1wKER1bXBlciBkdW1wZXIpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JTFJVQ2FjaGVhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lMUlVDYWNoZWFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg4OGJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JTFJVQ2FjaGVhYmxlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworLyoqCisgKiBUeXBlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIG9jY3VweSBhIHZhcmlhYmxlIGFtb3VudCBvZiBzcGFjZQorICogaW4gYW4gTFJVQ2FjaGUuICBDYWNoZWQgaXRlbXMgdGhhdCBkbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFyZQorICogY29uc2lkZXJlZCB0byBvY2N1cHkgb25lIHVuaXQgb2Ygc3BhY2UuCisgKgorICogQHNlZSBMUlVDYWNoZQorICovCitwdWJsaWMgaW50ZXJmYWNlIElMUlVDYWNoZWFibGUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHNwYWNlIHRoZSByZWNlaXZlciBjb25zdW1lcyBpbiBhbiBMUlUgQ2FjaGUuICBUaGUgZGVmYXVsdCBzcGFjZQorCSAqIHZhbHVlIGlzIDEuCisJICoKKwkgKiBAcmV0dXJuIGludCBBbW91bnQgb2YgY2FjaGUgc3BhY2UgdGFrZW4gYnkgdGhlIHJlY2VpdmVyCisJICovCisJcHVibGljIGludCBnZXRDYWNoZUZvb3RwcmludCgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlNjk2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElJbm5lckNsYXNzZXNBdHRyaWJ1dGUuCisgKi8KK3B1YmxpYyBjbGFzcyBJbm5lckNsYXNzZXNBdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUgaW1wbGVtZW50cyBJSW5uZXJDbGFzc2VzQXR0cmlidXRlIHsJCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeVtdIE5PX0VOVFJJRVMgPSBuZXcgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5WzBdOworCisJcHJpdmF0ZSBpbnQgbnVtYmVyT2ZDbGFzc2VzOworCXByaXZhdGUgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5W10gZW50cmllczsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgSW5uZXJDbGFzc2VzQXR0cmlidXRlLgorCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcworCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKKwkgKiBAcGFyYW0gb2Zmc2V0CisJICogQHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBJbm5lckNsYXNzZXNBdHRyaWJ1dGUoCisJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywKKwkJSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsCisJCWludCBvZmZzZXQpCisJCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXN1cGVyKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCk7CisJCXRoaXMubnVtYmVyT2ZDbGFzc2VzID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJaW50IHJlYWRPZmZzZXQgPSA4OworCQlpbnQgbGVuZ3RoID0gdGhpcy5udW1iZXJPZkNsYXNzZXM7CisJCXRoaXMuZW50cmllcyA9IE5PX0VOVFJJRVM7CisJCWlmIChsZW5ndGggIT0gMCkgeworCQkJdGhpcy5lbnRyaWVzID0gbmV3IElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeVtsZW5ndGhdOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMuZW50cmllc1tpXSA9IG5ldyBJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCXJlYWRPZmZzZXQgKz0gODsKKwkJfQkJCisJfQorCisJLyoqCisJICogQHNlZSBJSW5uZXJDbGFzc2VzQXR0cmlidXRlI2dldElubmVyQ2xhc3NBdHRyaWJ1dGVzRW50cmllcygpCisJICovCisJcHVibGljIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeVtdIGdldElubmVyQ2xhc3NBdHRyaWJ1dGVzRW50cmllcygpIHsKKwkJcmV0dXJuIHRoaXMuZW50cmllczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGUjZ2V0TnVtYmVyT2ZDbGFzc2VzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bWJlck9mQ2xhc3NlcygpIHsKKwkJcmV0dXJuIHRoaXMubnVtYmVyT2ZDbGFzc2VzOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFjNjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnk7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkKKyAqLworcHVibGljIGNsYXNzIElubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5CisJZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QKKwlpbXBsZW1lbnRzIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSB7CisKKwlwcml2YXRlIGludCBpbm5lckNsYXNzTmFtZUluZGV4OworCXByaXZhdGUgaW50IG91dGVyQ2xhc3NOYW1lSW5kZXg7CisJcHJpdmF0ZSBpbnQgaW5uZXJOYW1lSW5kZXg7CisJcHJpdmF0ZSBjaGFyW10gaW5uZXJDbGFzc05hbWU7CisJcHJpdmF0ZSBjaGFyW10gb3V0ZXJDbGFzc05hbWU7CisJcHJpdmF0ZSBjaGFyW10gaW5uZXJOYW1lOworCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOworCisJcHVibGljIElubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5KGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQpCisJCXRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCXRoaXMuaW5uZXJDbGFzc05hbWVJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDAsIG9mZnNldCk7CisJCXRoaXMub3V0ZXJDbGFzc05hbWVJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDIsIG9mZnNldCk7CisJCXRoaXMuaW5uZXJOYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA0LCBvZmZzZXQpOworCQl0aGlzLmFjY2Vzc0ZsYWdzID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5OworCQlpZiAodGhpcy5pbm5lckNsYXNzTmFtZUluZGV4ICE9IDApIHsKKwkJCWNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KHRoaXMuaW5uZXJDbGFzc05hbWVJbmRleCk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9DbGFzcykgeworCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJfQorCQkJdGhpcy5pbm5lckNsYXNzTmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldENsYXNzSW5mb05hbWUoKTsKKwkJfQorCQlpZiAob3V0ZXJDbGFzc05hbWVJbmRleCAhPSAwKSB7CisJCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLm91dGVyQ2xhc3NOYW1lSW5kZXgpOworCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfQ2xhc3MpIHsKKwkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJCX0KKwkJCXRoaXMub3V0ZXJDbGFzc05hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRDbGFzc0luZm9OYW1lKCk7CisJCX0KKwkJaWYgKGlubmVyTmFtZUluZGV4ICE9IDApIHsKKwkJCWNvbnN0YW50UG9vbEVudHJ5ID0gY29uc3RhbnRQb29sLmRlY29kZUVudHJ5KHRoaXMuaW5uZXJOYW1lSW5kZXgpOworCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgeworCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJfQorCQkJdGhpcy5pbm5lck5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5I2dldEFjY2Vzc0ZsYWdzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEFjY2Vzc0ZsYWdzKCkgeworCQlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSNnZXRJbm5lckNsYXNzTmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRJbm5lckNsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuaW5uZXJDbGFzc05hbWU7CisJfQorCisJLyoqCisJICogQHNlZSBJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkjZ2V0SW5uZXJDbGFzc05hbWVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRJbm5lckNsYXNzTmFtZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5pbm5lckNsYXNzTmFtZUluZGV4OworCX0KKworCS8qKgorCSAqIEBzZWUgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5I2dldElubmVyTmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRJbm5lck5hbWUoKSB7CisJCXJldHVybiB0aGlzLmlubmVyTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeSNnZXRJbm5lck5hbWVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXRJbm5lck5hbWVJbmRleCgpIHsKKwkJcmV0dXJuIHRoaXMuaW5uZXJOYW1lSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkjZ2V0T3V0ZXJDbGFzc05hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0T3V0ZXJDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLm91dGVyQ2xhc3NOYW1lOworCX0KKworCS8qKgorCSAqIEBzZWUgSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5I2dldE91dGVyQ2xhc3NOYW1lSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0T3V0ZXJDbGFzc05hbWVJbmRleCgpIHsKKwkJcmV0dXJuIHRoaXMub3V0ZXJDbGFzc05hbWVJbmRleDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0NGM4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YQpAQCAtMCwwICsxLDQ5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIFRoZSA8Y29kZT5MUlVDYWNoZTwvY29kZT4gaXMgYSBoYXNodGFibGUgdGhhdCBzdG9yZXMgYSBmaW5pdGUgbnVtYmVyIG9mIGVsZW1lbnRzLiAgCisgKiBXaGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgdmFsdWVzIHRvIGEgZnVsbCBjYWNoZSwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgdmFsdWVzCisgKiBpbiB0aGUgY2FjaGUgYXJlIGRpc2NhcmRlZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgdmFsdWVzIGFzIG5lY2Vzc2FyeS4KKyAqIAorICogPHA+VGhlIGRhdGEgc3RydWN0dXJlIGlzIGJhc2VkIG9uIHRoZSBMUlUgdmlydHVhbCBtZW1vcnkgcGFnaW5nIHNjaGVtZS4KKyAqIAorICogPHA+T2JqZWN0cyBjYW4gdGFrZSB1cCBhIHZhcmlhYmxlIGFtb3VudCBvZiBjYWNoZSBzcGFjZSBieSBpbXBsZW1lbnRpbmcKKyAqIHRoZSA8Y29kZT5JTFJVQ2FjaGVhYmxlPC9jb2RlPiBpbnRlcmZhY2UuCisgKgorICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBOT1QgdGhyZWFkLXNhZmUuICBTeW5jaHJvbml6YXRpb24gd3JhcHBlcnMgd291bGQKKyAqIGhhdmUgdG8gYmUgYWRkZWQgdG8gZW5zdXJlIGF0b21pYyBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgZnJvbSB0aGUgY2FjaGUuCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLklMUlVDYWNoZWFibGUKKyAqLworcHVibGljIGNsYXNzIExSVUNhY2hlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworCS8qKgorCSAqIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIExSVUNhY2hlIHRvIHJlcHJlc2VudCBlbnRyaWVzIAorCSAqIHN0b3JlZCBpbiB0aGUgY2FjaGUuCisJICogSXQgaXMgc3RhdGljIGJlY2F1c2UgaXQgZG9lcyBub3QgcmVxdWlyZSBhIHBvaW50ZXIgdG8gdGhlIGNhY2hlCisJICogd2hpY2ggY29udGFpbnMgaXQuCisJICoKKwkgKiBAc2VlIExSVUNhY2hlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMUlVDYWNoZUVudHJ5IHsKKwkJCisJCS8qKgorCQkgKiBIYXNoIHRhYmxlIGtleQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBfZktleTsKKwkJIAorCQkvKioKKwkJICogSGFzaCB0YWJsZSB2YWx1ZSAoYW4gTFJVQ2FjaGVFbnRyeSBvYmplY3QpCisJCSAqLworCQlwdWJsaWMgT2JqZWN0IF9mVmFsdWU7CQkgCisKKwkJLyoqCisJCSAqIFRpbWUgdmFsdWUgZm9yIHF1ZXVlIHNvcnRpbmcKKwkJICovCisJCXB1YmxpYyBpbnQgX2ZUaW1lc3RhbXA7CisJCQorCQkvKioKKwkJICogQ2FjaGUgZm9vdHByaW50IG9mIHRoaXMgZW50cnkKKwkJICovCisJCXB1YmxpYyBpbnQgX2ZTcGFjZTsKKwkJCisJCS8qKgorCQkgKiBQcmV2aW91cyBlbnRyeSBpbiBxdWV1ZQorCQkgKi8KKwkJcHVibGljIExSVUNhY2hlRW50cnkgX2ZQcmV2aW91czsKKwkJCQorCQkvKioKKwkJICogTmV4dCBlbnRyeSBpbiBxdWV1ZQorCQkgKi8KKwkJcHVibGljIExSVUNhY2hlRW50cnkgX2ZOZXh0OworCQkJCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlciB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZXMKKwkJICogZm9yIGtleSwgdmFsdWUsIGFuZCBzcGFjZS4KKwkJICovCisJCXB1YmxpYyBMUlVDYWNoZUVudHJ5IChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGludCBzcGFjZSkgeworCQkJX2ZLZXkgPSBrZXk7CisJCQlfZlZhbHVlID0gdmFsdWU7CisJCQlfZlNwYWNlID0gc3BhY2U7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCQkJcmV0dXJuICJMUlVDYWNoZUVudHJ5IFsiICsgX2ZLZXkgKyAiLS0+IiArIF9mVmFsdWUgKyAiXSI7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CQorCisJLyoqCisJICogQW1vdW50IG9mIGNhY2hlIHNwYWNlIHVzZWQgc28gZmFyCisJICovCisJcHJvdGVjdGVkIGludCBmQ3VycmVudFNwYWNlOworCQorCS8qKgorCSAqIE1heGltdW0gc3BhY2UgYWxsb3dlZCBpbiBjYWNoZQorCSAqLworCXByb3RlY3RlZCBpbnQgZlNwYWNlTGltaXQ7CisJCisJLyoqCisJICogQ291bnRlciBmb3IgaGFuZGluZyBvdXQgc2VxdWVudGlhbCB0aW1lc3RhbXBzCisJICovCisJcHJvdGVjdGVkIGludAlmVGltZXN0YW1wQ291bnRlcjsKKwkKKwkvKioKKwkgKiBIYXNoIHRhYmxlIGZvciBmYXN0IHJhbmRvbSBhY2Nlc3MgdG8gY2FjaGUgZW50cmllcworCSAqLworCXByb3RlY3RlZCBIYXNodGFibGUgZkVudHJ5VGFibGU7CisKKwkvKioKKwkgKiBTdGFydCBvZiBxdWV1ZSAobW9zdCByZWNlbnRseSB1c2VkIGVudHJ5KSAKKwkgKi8JCisJcHJvdGVjdGVkIExSVUNhY2hlRW50cnkgZkVudHJ5UXVldWU7CisKKwkvKioKKwkgKiBFbmQgb2YgcXVldWUgKGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkpCisJICovCQorCXByb3RlY3RlZCBMUlVDYWNoZUVudHJ5IGZFbnRyeVF1ZXVlVGFpbDsKKwkJCisJLyoqCisJICogRGVmYXVsdCBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIGNhY2hlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TUEFDRUxJTUlUID0gMTAwOworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2FjaGUuICBTaXplIG9mIGNhY2hlIGlzIGRlZmluZWQgYnkgCisJICogPGNvZGU+REVGQVVMVF9TUEFDRUxJTUlUPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgTFJVQ2FjaGUoKSB7CisJCQorCQl0aGlzKERFRkFVTFRfU1BBQ0VMSU1JVCk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2FjaGUuCisJICogQHBhcmFtIHNpemUgU2l6ZSBvZiBDYWNoZQorCSAqLworCXB1YmxpYyBMUlVDYWNoZShpbnQgc2l6ZSkgeworCQkKKwkJZlRpbWVzdGFtcENvdW50ZXIgPSBmQ3VycmVudFNwYWNlID0gMDsKKwkJZkVudHJ5UXVldWUgPSBmRW50cnlRdWV1ZVRhaWwgPSBudWxsOworCQlmRW50cnlUYWJsZSA9IG5ldyBIYXNodGFibGUoc2l6ZSk7CisJCWZTcGFjZUxpbWl0ID0gc2l6ZTsKKwl9CisJLyoqCisJICogUmV0dXJucyBhIG5ldyBjYWNoZSBjb250YWluaW5nIHRoZSBzYW1lIGNvbnRlbnRzLgorCSAqCisJICogQHJldHVybiBOZXcgY29weSBvZiBvYmplY3QuCisJICovCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJCisJCUxSVUNhY2hlIG5ld0NhY2hlID0gbmV3SW5zdGFuY2UoZlNwYWNlTGltaXQpOworCQlMUlVDYWNoZUVudHJ5IHFFbnRyeTsKKwkJCisJCS8qIFByZXNlcnZlIG9yZGVyIG9mIGVudHJpZXMgYnkgY29weWluZyBmcm9tIG9sZGVzdCB0byBuZXdlc3QgKi8KKwkJcUVudHJ5ID0gdGhpcy5mRW50cnlRdWV1ZVRhaWw7CisJCXdoaWxlIChxRW50cnkgIT0gbnVsbCkgeworCQkJbmV3Q2FjaGUucHJpdmF0ZUFkZCAocUVudHJ5Ll9mS2V5LCBxRW50cnkuX2ZWYWx1ZSwgcUVudHJ5Ll9mU3BhY2UpOworCQkJcUVudHJ5ID0gcUVudHJ5Ll9mUHJldmlvdXM7CisJCX0KKwkJcmV0dXJuIG5ld0NhY2hlOworCX0KKwkvKioKKwkgKiBGbHVzaGVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCisJCWZDdXJyZW50U3BhY2UgPSAwOworCQlMUlVDYWNoZUVudHJ5IGVudHJ5ID0gZkVudHJ5UXVldWVUYWlsOyAvLyBSZW1lbWJlciBsYXN0IGVudHJ5CisJCWZFbnRyeVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgLy8gQ2xlYXIgaXQgb3V0CisJCWZFbnRyeVF1ZXVlID0gZkVudHJ5UXVldWVUYWlsID0gbnVsbDsgIAorCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgeyAgLy8gc2VuZCBkZWxldGlvbiBub3RpZmljYXRpb25zIGluIExSVSBvcmRlcgorCQkJcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKGVudHJ5KTsKKwkJCWVudHJ5ID0gZW50cnkuX2ZQcmV2aW91czsKKwkJfQorCX0KKwkvKioKKwkgKiBGbHVzaGVzIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBjYWNoZS4gIERvZXMgbm90aGluZyBpZiBlbnRyeSBkb2VzIG5vdAorCSAqIGV4aXN0IGluIGNhY2hlLgorCSAqCisJICogQHBhcmFtIGtleSBLZXkgb2Ygb2JqZWN0IHRvIGZsdXNoCisJICovCisJcHVibGljIHZvaWQgZmx1c2ggKE9iamVjdCBrZXkpIHsKKwkJCisJCUxSVUNhY2hlRW50cnkgZW50cnk7CisJCQorCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQoa2V5KTsKKworCQkvKiBJZiBlbnRyeSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuICovCisJCWlmIChlbnRyeSA9PSBudWxsKSByZXR1cm47CisKKwkJdGhpcy5wcml2YXRlUmVtb3ZlRW50cnkgKGVudHJ5LCBmYWxzZSk7CisJfQorCS8qKgorCSAqIEFuc3dlcnMgdGhlIHZhbHVlIGluIHRoZSBjYWNoZSBhdCB0aGUgZ2l2ZW4ga2V5LgorCSAqIElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdGhlIGNhY2hlLCByZXR1cm5zIG51bGwKKwkgKgorCSAqIEBwYXJhbSBrZXkgSGFzaCB0YWJsZSBrZXkgb2Ygb2JqZWN0IHRvIHJldHJpZXZlCisJICogQHJldHVybiBSZXRyZWl2ZWQgb2JqZWN0LCBvciBudWxsIGlmIG9iamVjdCBkb2VzIG5vdCBleGlzdAorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKKwkJCisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0KGtleSk7CisJCWlmIChlbnRyeSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJdGhpcy51cGRhdGVUaW1lc3RhbXAgKGVudHJ5KTsKKwkJcmV0dXJuIGVudHJ5Ll9mVmFsdWU7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IGlzIGN1cnJlbnQgdXNlZCBpbiB0aGUgY2FjaGUuCisJICovCisJcHVibGljIGludCBnZXRDdXJyZW50U3BhY2UoKSB7CisJCXJldHVybiBmQ3VycmVudFNwYWNlOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSBhdmFpbGFibGUgaW4gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0U3BhY2VMaW1pdCgpIHsKKwkJcmV0dXJuIGZTcGFjZUxpbWl0OworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGFuIEVudW1lcmF0aW9uIG9mIHRoZSBrZXlzIGN1cnJlbnRseSBpbiB0aGUgY2FjaGUuCisJICovCisJcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7CisJCQorCQlyZXR1cm4gZkVudHJ5VGFibGUua2V5cygpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIGtleXMgYW5kIHZhbHVlcyAKKwkgKiBjdXJyZW50bHkgaW4gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyBJQ2FjaGVFbnVtZXJhdGlvbiBrZXlzQW5kVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IElDYWNoZUVudW1lcmF0aW9uKCkgeworCQkKKwkJCUVudW1lcmF0aW9uIGZWYWx1ZXMgPSBmRW50cnlUYWJsZS5lbGVtZW50cygpOworCQkJTFJVQ2FjaGVFbnRyeSBmRW50cnk7CisJCQkKKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlyZXR1cm4gZlZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlmRW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZlZhbHVlcy5uZXh0RWxlbWVudCgpOworCQkJCXJldHVybiBmRW50cnkuX2ZLZXk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJCQkJaWYgKGZFbnRyeSA9PSBudWxsKSB7CisJCQkJCXRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCQlyZXR1cm4gZkVudHJ5Ll9mVmFsdWU7CisJCQl9CisJCX07CisJfQorCS8qKgorCSAqIEVuc3VyZXMgdGhlcmUgaXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZnJlZSBzcGFjZSBpbiB0aGUgcmVjZWl2ZXIsCisJICogYnkgcmVtb3Zpbmcgb2xkIGVudHJpZXMgaWYgbmVjZXNzYXJ5LiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgc3BhY2Ugd2FzCisJICogbWFkZSBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZS4KKwkgKgorCSAqIEBwYXJhbSBzcGFjZSBBbW91bnQgb2Ygc3BhY2UgdG8gZnJlZSB1cAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIG1ha2VTcGFjZSAoaW50IHNwYWNlKSB7CisJCQorCQlpbnQgbGltaXQ7CisJCQorCQlsaW1pdCA9IHRoaXMuZ2V0U3BhY2VMaW1pdCgpOworCQkKKwkJLyogaWYgc3BhY2UgaXMgYWxyZWFkeSBhdmFpbGFibGUgKi8KKwkJaWYgKGZDdXJyZW50U3BhY2UgKyBzcGFjZSA8PSBsaW1pdCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCS8qIGlmIGVudHJ5IGlzIHRvbyBiaWcgZm9yIGNhY2hlICovCisJCWlmIChzcGFjZSA+IGxpbWl0KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCS8qIEZyZWUgdXAgc3BhY2UgYnkgcmVtb3Zpbmcgb2xkZXN0IGVudHJpZXMgKi8KKwkJd2hpbGUgKGZDdXJyZW50U3BhY2UgKyBzcGFjZSA+IGxpbWl0ICYmIGZFbnRyeVF1ZXVlVGFpbCAhPSBudWxsKSB7CisJCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeSAoZkVudHJ5UXVldWVUYWlsLCBmYWxzZSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgTFJVQ2FjaGUgaW5zdGFuY2UKKwkgKi8KKwlwcm90ZWN0ZWQgTFJVQ2FjaGUgbmV3SW5zdGFuY2UoaW50IHNpemUpIHsKKwkJcmV0dXJuIG5ldyBMUlVDYWNoZShzaXplKTsKKwl9CisJLyoqCisJICogQWRkcyBhbiBlbnRyeSBmb3IgdGhlIGdpdmVuIGtleS92YWx1ZS9zcGFjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlQWRkIChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGludCBzcGFjZSkgeworCQkKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeTsKKwkJCisJCWVudHJ5ID0gbmV3IExSVUNhY2hlRW50cnkoa2V5LCB2YWx1ZSwgc3BhY2UpOworCQl0aGlzLnByaXZhdGVBZGRFbnRyeSAoZW50cnksIGZhbHNlKTsKKwl9CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcmVjZWl2ZXIuCisJICogQHBhcmFtIHNodWZmbGUgSW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZSAKKwkgKiAoaS5lLiwgdGhlIGVudHJ5IHRhYmxlIGlzIGxlZnQgYWxvbmUpLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaXZhdGVBZGRFbnRyeSAoTFJVQ2FjaGVFbnRyeSBlbnRyeSwgYm9vbGVhbiBzaHVmZmxlKSB7CisJCQorCQlpZiAoIXNodWZmbGUpIHsKKwkJCWZFbnRyeVRhYmxlLnB1dCAoZW50cnkuX2ZLZXksIGVudHJ5KTsKKwkJCWZDdXJyZW50U3BhY2UgKz0gZW50cnkuX2ZTcGFjZTsKKwkJfQorCQkKKwkJZW50cnkuX2ZUaW1lc3RhbXAgPSBmVGltZXN0YW1wQ291bnRlcisrOworCQllbnRyeS5fZk5leHQgPSB0aGlzLmZFbnRyeVF1ZXVlOworCQllbnRyeS5fZlByZXZpb3VzID0gbnVsbDsKKwkJCisJCWlmIChmRW50cnlRdWV1ZSA9PSBudWxsKSB7CisJCQkvKiB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBlbnRyeSAqLworCQkJZkVudHJ5UXVldWVUYWlsID0gZW50cnk7CisJCX0gZWxzZSB7CisJCQlmRW50cnlRdWV1ZS5fZlByZXZpb3VzID0gZW50cnk7CisJCX0KKwkJCisJCWZFbnRyeVF1ZXVlID0gZW50cnk7CisJfQorCS8qKgorCSAqIEFuIGVudHJ5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaGFzIAorCSAqIGZhbGxlbiBvZmYgdGhlIGJvdHRvbSBvZiB0aGUgTFJVIHF1ZXVlLiAgCisJICogU3ViY2xhc3NlcyBjb3VsZCBvdmVyLXJpZGUgdGhpcyB0byBpbXBsZW1lbnQgYSBwZXJzaXN0ZW50IGNhY2hlIGJlbG93IHRoZSBMUlUgY2FjaGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKExSVUNhY2hlRW50cnkgZW50cnkpIHsKKwkJLy8gRGVmYXVsdCBpcyBOT1AuCisJfQorCS8qKgorCSAqIFJlbW92ZXMgdGhlIGVudHJ5IGZyb20gdGhlIGVudHJ5IHF1ZXVlLiAgCisJICogQHBhcmFtIHNodWZmbGUgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZSAKKwkgKiAoaS5lLiwgdGhlIGVudHJ5IHRhYmxlIGlzIGxlZnQgYWxvbmUpLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaXZhdGVSZW1vdmVFbnRyeSAoTFJVQ2FjaGVFbnRyeSBlbnRyeSwgYm9vbGVhbiBzaHVmZmxlKSB7CisJCQorCQlMUlVDYWNoZUVudHJ5IHByZXZpb3VzLCBuZXh0OworCQkKKwkJcHJldmlvdXMgPSBlbnRyeS5fZlByZXZpb3VzOworCQluZXh0ID0gZW50cnkuX2ZOZXh0OworCQkKKwkJaWYgKCFzaHVmZmxlKSB7CisJCQlmRW50cnlUYWJsZS5yZW1vdmUoZW50cnkuX2ZLZXkpOworCQkJZkN1cnJlbnRTcGFjZSAtPSBlbnRyeS5fZlNwYWNlOworCQkJcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKGVudHJ5KTsKKwkJfQorCisJCS8qIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCBlbnRyeSAqLworCQlpZiAocHJldmlvdXMgPT0gbnVsbCkgeworCQkJZkVudHJ5UXVldWUgPSBuZXh0OworCQl9IGVsc2UgeworCQkJcHJldmlvdXMuX2ZOZXh0ID0gbmV4dDsKKwkJfQorCisJCS8qIGlmIHRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5ICovCisJCWlmIChuZXh0ID09IG51bGwpIHsKKwkJCWZFbnRyeVF1ZXVlVGFpbCA9IHByZXZpb3VzOworCQl9IGVsc2UgeworCQkJbmV4dC5fZlByZXZpb3VzID0gcHJldmlvdXM7CisJCX0KKwl9CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgaW4gdGhlIGNhY2hlIGF0IHRoZSBnaXZlbiBrZXkuIFJldHVybnMgdGhlIHZhbHVlLgorCSAqCisJICogQHBhcmFtIGtleSBLZXkgb2Ygb2JqZWN0IHRvIGFkZC4KKwkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2Ygb2JqZWN0IHRvIGFkZC4KKwkgKiBAcmV0dXJuIGFkZGVkIHZhbHVlLgorCSAqLworCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworCQkKKwkJaW50IG5ld1NwYWNlLCBvbGRTcGFjZSwgbmV3VG90YWw7CisJCUxSVUNhY2hlRW50cnkgZW50cnk7CisJCQorCQkvKiBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW4gZW50cnkgaW4gdGhlIGNhY2hlICovCisJCW5ld1NwYWNlID0gc3BhY2VGb3IgKGtleSwgdmFsdWUpOworCQllbnRyeSA9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQgKGtleSk7CisJCQorCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCisJCQkvKioKKwkJCSAqIFJlcGxhY2UgdGhlIGVudHJ5IGluIHRoZSBjYWNoZSBpZiBpdCB3b3VsZCBub3Qgb3ZlcmZsb3cKKwkJCSAqIHRoZSBjYWNoZS4gIE90aGVyd2lzZSBmbHVzaCB0aGUgZW50cnkgYW5kIHJlLWFkZCBpdCBzbyBhcyAKKwkJCSAqIHRvIGtlZXAgY2FjaGUgd2l0aGluIGJ1ZGdldAorCQkJICovCisJCQlvbGRTcGFjZSA9IGVudHJ5Ll9mU3BhY2U7CisJCQluZXdUb3RhbCA9IGdldEN1cnJlbnRTcGFjZSgpIC0gb2xkU3BhY2UgKyBuZXdTcGFjZTsKKwkJCWlmIChuZXdUb3RhbCA8PSBnZXRTcGFjZUxpbWl0KCkpIHsKKwkJCQl1cGRhdGVUaW1lc3RhbXAgKGVudHJ5KTsKKwkJCQllbnRyeS5fZlZhbHVlID0gdmFsdWU7CisJCQkJZW50cnkuX2ZTcGFjZSA9IG5ld1NwYWNlOworCQkJCXRoaXMuZkN1cnJlbnRTcGFjZSA9IG5ld1RvdGFsOworCQkJCXJldHVybiB2YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdmF0ZVJlbW92ZUVudHJ5IChlbnRyeSwgZmFsc2UpOworCQkJfQorCQl9CisJCWlmIChtYWtlU3BhY2UobmV3U3BhY2UpKSB7CisJCQlwcml2YXRlQWRkIChrZXksIHZhbHVlLCBuZXdTcGFjZSk7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvKioKKwkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgY2FjaGUgZm9yIHRoZSBnaXZlbiBrZXkuCisJICogSWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGNhY2hlLCByZXR1cm5zIG51bGwuCisJICoKKwkgKiBAcGFyYW0ga2V5IEtleSBvZiBvYmplY3QgdG8gcmVtb3ZlIGZyb20gY2FjaGUuCisJICogQHJldHVybiBWYWx1ZSByZW1vdmVkIGZyb20gY2FjaGUuCisJICovCisJcHVibGljIE9iamVjdCByZW1vdmVLZXkgKE9iamVjdCBrZXkpIHsKKwkJCisJCUxSVUNhY2hlRW50cnkgZW50cnkgPSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0KGtleSk7CisJCWlmIChlbnRyeSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5fZlZhbHVlOworCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeSAoZW50cnksIGZhbHNlKTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSB0aGF0IHRoZSBjYWNoZSBjYW4gc3RvcmUKKwkgKgorCSAqIEBwYXJhbSBsaW1pdCBOdW1iZXIgb2YgdW5pdHMgb2YgY2FjaGUgc3BhY2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTcGFjZUxpbWl0KGludCBsaW1pdCkgeworCQlpZiAobGltaXQgPCBmU3BhY2VMaW1pdCkgeworCQkJbWFrZVNwYWNlKGZTcGFjZUxpbWl0IC0gbGltaXQpOworCQl9CisJCWZTcGFjZUxpbWl0ID0gbGltaXQ7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBpbnQgc3BhY2VGb3IgKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworCQkKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUxSVUNhY2hlYWJsZSkgeworCQkJcmV0dXJuICgoSUxSVUNhY2hlYWJsZSkgdmFsdWUpLmdldENhY2hlRm9vdHByaW50KCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKy8qKgorICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LiAgVGhpcyBtZXRob2QKKyAqIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAqLworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gCisJCSJMUlVDYWNoZSAiICsgKGZDdXJyZW50U3BhY2UgKiAxMDAuMCAvIGZTcGFjZUxpbWl0KSArICIlIGZ1bGxcbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJdGhpcy50b1N0cmluZ0NvbnRlbnRzKCk7Cit9CisvKioKKyAqIFJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4gIFRoaXMgbWV0aG9kCisgKiBpcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgKi8KK3Byb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdDb250ZW50cygpIHsKKwlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWludCBsZW5ndGggPSBmRW50cnlUYWJsZS5zaXplKCk7CisJT2JqZWN0W10gdW5zb3J0ZWRLZXlzID0gbmV3IE9iamVjdFtsZW5ndGhdOworCVN0cmluZ1tdIHVuc29ydGVkVG9TdHJpbmdzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCUVudW1lcmF0aW9uIGUgPSB0aGlzLmtleXMoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCU9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7CisJCXVuc29ydGVkS2V5c1tpXSA9IGtleTsKKwkJdW5zb3J0ZWRUb1N0cmluZ3NbaV0gPSAKKwkJCShrZXkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudCkgPworCQkJCSgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQpa2V5KS5nZXRFbGVtZW50TmFtZSgpIDoKKwkJCQlrZXkudG9TdHJpbmcoKTsKKwl9CisJVG9TdHJpbmdTb3J0ZXIgc29ydGVyID0gbmV3IFRvU3RyaW5nU29ydGVyKCk7CisJc29ydGVyLnNvcnQodW5zb3J0ZWRLZXlzLCB1bnNvcnRlZFRvU3RyaW5ncyk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlTdHJpbmcgdG9TdHJpbmcgPSBzb3J0ZXIuc29ydGVkU3RyaW5nc1tpXTsKKwkJT2JqZWN0IHZhbHVlID0gdGhpcy5nZXQoc29ydGVyLnNvcnRlZE9iamVjdHNbaV0pOworCQlyZXN1bHQuYXBwZW5kKHRvU3RyaW5nKTsJCQorCQlyZXN1bHQuYXBwZW5kKCIgLT4gIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworfQorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGdpdmVuIGVudHJ5LCBlbnN1cmluZyB0aGF0IHRoZSBxdWV1ZSBpcyAKKwkgKiBrZXB0IGluIGNvcnJlY3Qgb3JkZXIuICBUaGUgZW50cnkgbXVzdCBleGlzdAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRpbWVzdGFtcCAoTFJVQ2FjaGVFbnRyeSBlbnRyeSkgeworCQkKKwkJZW50cnkuX2ZUaW1lc3RhbXAgPSBmVGltZXN0YW1wQ291bnRlcisrOworCQlpZiAoZkVudHJ5UXVldWUgIT0gZW50cnkpIHsKKwkJCXRoaXMucHJpdmF0ZVJlbW92ZUVudHJ5IChlbnRyeSwgdHJ1ZSk7CisJCQl0aGlzLnByaXZhdGVBZGRFbnRyeSAoZW50cnksIHRydWUpOworCQl9CisJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xpbmVOdW1iZXJBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWVlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xpbmVOdW1iZXJBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklBdHRyaWJ1dGVOYW1lc0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTGluZU51bWJlckF0dHJpYnV0ZTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElMaW5lTnVtYmVyQXR0cmlidXRlLgorICovCitwdWJsaWMgY2xhc3MgTGluZU51bWJlckF0dHJpYnV0ZQorCWV4dGVuZHMgQ2xhc3NGaWxlQXR0cmlidXRlCisJaW1wbGVtZW50cyBJTGluZU51bWJlckF0dHJpYnV0ZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIE5PX0VOVFJJRVMgPSBuZXcgaW50WzBdWzBdOworCXByaXZhdGUgaW50IGxpbmVOdW1iZXJUYWJsZUxlbmd0aDsKKwlwcml2YXRlIGludFtdW10gbGluZU51bWJlclRhYmxlOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMaW5lTnVtYmVyQXR0cmlidXRlLgorCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcworCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKKwkgKiBAcGFyYW0gb2Zmc2V0CisJICogQHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBMaW5lTnVtYmVyQXR0cmlidXRlKAorCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMsCisJCUlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLAorCQlpbnQgb2Zmc2V0KQorCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOworCQkKKwkJdGhpcy5saW5lTnVtYmVyVGFibGVMZW5ndGggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOworCQl0aGlzLmxpbmVOdW1iZXJUYWJsZSA9IE5PX0VOVFJJRVM7CisJCWlmICh0aGlzLmxpbmVOdW1iZXJUYWJsZUxlbmd0aCAhPSAwKSB7CisJCQl0aGlzLmxpbmVOdW1iZXJUYWJsZSA9IG5ldyBpbnRbdGhpcy5saW5lTnVtYmVyVGFibGVMZW5ndGhdWzJdOworCQl9CisJCWludCByZWFkT2Zmc2V0ID0gODsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMubGluZU51bWJlclRhYmxlTGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCXRoaXMubGluZU51bWJlclRhYmxlW2ldWzBdID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KTsKKwkJCXRoaXMubGluZU51bWJlclRhYmxlW2ldWzFdID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCArIDIsIG9mZnNldCk7CisJCQlyZWFkT2Zmc2V0ICs9IDQ7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZUF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCXJldHVybiBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTElORV9OVU1CRVI7CisJfQorCisJLyoqCisJICogQHNlZSBJTGluZU51bWJlckF0dHJpYnV0ZSNnZXRMaW5lTnVtYmVyVGFibGUoKQorCSAqLworCXB1YmxpYyBpbnRbXVtdIGdldExpbmVOdW1iZXJUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubGluZU51bWJlclRhYmxlOworCX0KKworCS8qKgorCSAqIEBzZWUgSUxpbmVOdW1iZXJBdHRyaWJ1dGUjZ2V0TGluZU51bWJlclRhYmxlTGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldExpbmVOdW1iZXJUYWJsZUxlbmd0aCgpIHsKKwkJcmV0dXJuIHRoaXMubGluZU51bWJlclRhYmxlTGVuZ3RoOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgxOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnk7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS4KKyAqLworcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVBdHRyaWJ1dGUKKwlleHRlbmRzIENsYXNzRmlsZUF0dHJpYnV0ZQorCWltcGxlbWVudHMgSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5W10gTk9fRU5UUklFUyA9IG5ldyBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnlbMF07CisJcHJpdmF0ZSBpbnQgbG9jYWxWYXJpYWJsZVRhYmxlTGVuZ3RoOworCXByaXZhdGUgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5W10gbG9jYWxWYXJpYWJsZVRhYmxlOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbFZhcmlhYmxlQXR0cmlidXRlLgorCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcworCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKKwkgKiBAcGFyYW0gb2Zmc2V0CisJICogQHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBMb2NhbFZhcmlhYmxlQXR0cmlidXRlKAorCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMsCisJCUlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLAorCQlpbnQgb2Zmc2V0KQorCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOworCQl0aGlzLmxvY2FsVmFyaWFibGVUYWJsZUxlbmd0aCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CisJCWludCByZWFkT2Zmc2V0ID0gODsKKwkJaW50IGxlbmd0aCA9IHRoaXMubG9jYWxWYXJpYWJsZVRhYmxlTGVuZ3RoOworCQl0aGlzLmxvY2FsVmFyaWFibGVUYWJsZSA9IE5PX0VOVFJJRVM7CisJCWlmIChsZW5ndGggIT0gMCkgeworCQkJdGhpcy5sb2NhbFZhcmlhYmxlVGFibGUgPSBuZXcgTG9jYWxWYXJpYWJsZVRhYmxlRW50cnlbbGVuZ3RoXTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQl0aGlzLmxvY2FsVmFyaWFibGVUYWJsZVtpXSA9IG5ldyBMb2NhbFZhcmlhYmxlVGFibGVFbnRyeShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCXJlYWRPZmZzZXQgKz0gMTA7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZUF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCXJldHVybiBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuTE9DQUxfVkFSSUFCTEU7CisJfQorCisJLyoqCisJICogQHNlZSBJTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSNnZXRMb2NhbFZhcmlhYmxlVGFibGUoKQorCSAqLworCXB1YmxpYyBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnlbXSBnZXRMb2NhbFZhcmlhYmxlVGFibGUoKSB7CisJCXJldHVybiB0aGlzLmxvY2FsVmFyaWFibGVUYWJsZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElMb2NhbFZhcmlhYmxlQXR0cmlidXRlI2dldExvY2FsVmFyaWFibGVUYWJsZUxlbmd0aCgpCisJICovCisJcHVibGljIGludCBnZXRMb2NhbFZhcmlhYmxlVGFibGVMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLmxvY2FsVmFyaWFibGVUYWJsZUxlbmd0aDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRiZTdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnk7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkKKyAqLworcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVUYWJsZUVudHJ5IGV4dGVuZHMgQ2xhc3NGaWxlU3RydWN0IGltcGxlbWVudHMgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IHsKKworCXByaXZhdGUgaW50IHN0YXJ0UEM7CisJcHJpdmF0ZSBpbnQgbGVuZ3RoOworCXByaXZhdGUgaW50IG5hbWVJbmRleDsKKwlwcml2YXRlIGludCBkZXNjcmlwdG9ySW5kZXg7CisJcHJpdmF0ZSBjaGFyW10gbmFtZTsKKwlwcml2YXRlIGNoYXJbXSBkZXNjcmlwdG9yOworCXByaXZhdGUgaW50IGluZGV4OworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMKKwkgKiBAcGFyYW0gY29uc3RhbnRQb29sCisJICogQHBhcmFtIG9mZnNldAorCSAqIEB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkoCisJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywKKwkJSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsCisJCWludCBvZmZzZXQpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJCQl0aGlzLnN0YXJ0UEMgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOworCQkJdGhpcy5sZW5ndGggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAyLCBvZmZzZXQpOworCQkJdGhpcy5uYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA0LCBvZmZzZXQpOworCQkJdGhpcy5kZXNjcmlwdG9ySW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCA2LCBvZmZzZXQpOworCQkJdGhpcy5pbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDgsIG9mZnNldCk7CisJCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5uYW1lSW5kZXgpOworCQkJaWYgKGNvbnN0YW50UG9vbEVudHJ5LmdldEtpbmQoKSAhPSBJQ29uc3RhbnRQb29sQ29uc3RhbnQuQ09OU1RBTlRfVXRmOCkgeworCQkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQkJfQorCQkJdGhpcy5uYW1lID0gY29uc3RhbnRQb29sRW50cnkuZ2V0VXRmOFZhbHVlKCk7CisJCQljb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLmRlc2NyaXB0b3JJbmRleCk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQl9CisJCQl0aGlzLmRlc2NyaXB0b3IgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKKwkJfQorCQkKKwkvKioKKwkgKiBAc2VlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSNnZXRTdGFydFBDKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0UEMoKSB7CisJCXJldHVybiB0aGlzLnN0YXJ0UEM7CisJfQorCisJLyoqCisJICogQHNlZSBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkjZ2V0TGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwkJcmV0dXJuIHRoaXMubGVuZ3RoOworCX0KKworCS8qKgorCSAqIEBzZWUgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5I2dldE5hbWVJbmRleCgpCisJICovCisJcHVibGljIGludCBnZXROYW1lSW5kZXgoKSB7CisJCXJldHVybiB0aGlzLm5hbWVJbmRleDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSNnZXREZXNjcmlwdG9ySW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9ySW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkjZ2V0SW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisJCXJldHVybiB0aGlzLmluZGV4OworCX0KKworCS8qKgorCSAqIEBzZWUgSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5I2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSNnZXREZXNjcmlwdG9yKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldERlc2NyaXB0b3IoKSB7CisJCXJldHVybiB0aGlzLmRlc2NyaXB0b3I7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01ldGhvZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWV0aG9kSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODY4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01ldGhvZEluZm8uamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb2RlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklFeGNlcHRpb25BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JTWV0aG9kSW5mbzsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIElNZXRob2RJbmZvLgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElNZXRob2RJbmZvIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkOworCXByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYzsKKwlwcml2YXRlIGludCBhY2Nlc3NGbGFnczsKKwlwcml2YXRlIGNoYXJbXSBuYW1lOworCXByaXZhdGUgY2hhcltdIGRlc2NyaXB0b3I7CisJcHJpdmF0ZSBpbnQgbmFtZUluZGV4OworCXByaXZhdGUgaW50IGRlc2NyaXB0b3JJbmRleDsKKwlwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7CisJcHJpdmF0ZSBpbnQgYXR0cmlidXRlQnl0ZXM7CisJcHJpdmF0ZSBJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlOworCXByaXZhdGUgSUV4Y2VwdGlvbkF0dHJpYnV0ZSBleGNlcHRpb25BdHRyaWJ1dGU7CisJcHJpdmF0ZSBJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlczsKKwkKKwkvKioKKwkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgYnl0ZVtdCisJICogQHBhcmFtIG9mZnNldHMgaW50W10KKwkgKiBAcGFyYW0gb2Zmc2V0IGludAorCSAqIEBwYXJhbSBkZWNvZGluZ0ZsYWdzIGludAorCSAqLworCXB1YmxpYyBNZXRob2RJbmZvKGJ5dGUgY2xhc3NGaWxlQnl0ZXNbXSwgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2wsIGludCBvZmZzZXQsIGludCBkZWNvZGluZ0ZsYWdzKQorCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQkJCisJCWJvb2xlYW4gbm9fY29kZV9hdHRyaWJ1dGUgPSAoZGVjb2RpbmdGbGFncyAmIElDbGFzc0ZpbGVSZWFkZXIuTUVUSE9EX0JPRElFUykgPT0gMDsKKwkJYWNjZXNzRmxhZ3MgPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAwLCBvZmZzZXQpOworCQkKKwkJdGhpcy5uYW1lSW5kZXggPSB1MkF0KGNsYXNzRmlsZUJ5dGVzLCAyLCBvZmZzZXQpOworCQlJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5uYW1lSW5kZXgpOworCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJfQorCQl0aGlzLm5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKKwkJCisJCXRoaXMuZGVzY3JpcHRvckluZGV4ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNCwgb2Zmc2V0KTsKKwkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodGhpcy5kZXNjcmlwdG9ySW5kZXgpOworCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uSU5WQUxJRF9DT05TVEFOVF9QT09MX0VOVFJZKTsKKwkJfQorCQl0aGlzLmRlc2NyaXB0b3IgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKKwkJCisJCXRoaXMuYXR0cmlidXRlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKKwkJdGhpcy5hdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQXR0cmlidXRlLk5PX0FUVFJJQlVURVM7CisJCWlmICh0aGlzLmF0dHJpYnV0ZXNDb3VudCAhPSAwKSB7CisJCQlpZiAobm9fY29kZV9hdHRyaWJ1dGUpIHsKKwkJCQlpZiAodGhpcy5hdHRyaWJ1dGVzQ291bnQgIT0gMSkgeworCQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzRmlsZUF0dHJpYnV0ZVt0aGlzLmF0dHJpYnV0ZXNDb3VudCAtIDFdOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5hdHRyaWJ1dGVzID0gbmV3IElDbGFzc0ZpbGVBdHRyaWJ1dGVbdGhpcy5hdHRyaWJ1dGVzQ291bnRdOworCQkJfQorCQl9CisJCWludCBhdHRyaWJ1dGVzSW5kZXggPSAwOworCQlpbnQgcmVhZE9mZnNldCA9IDg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworCQkJY29uc3RhbnRQb29sRW50cnkgPSBjb25zdGFudFBvb2wuZGVjb2RlRW50cnkodTJBdChjbGFzc0ZpbGVCeXRlcywgcmVhZE9mZnNldCwgb2Zmc2V0KSk7CisJCQlpZiAoY29uc3RhbnRQb29sRW50cnkuZ2V0S2luZCgpICE9IElDb25zdGFudFBvb2xDb25zdGFudC5DT05TVEFOVF9VdGY4KSB7CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLklOVkFMSURfQ09OU1RBTlRfUE9PTF9FTlRSWSk7CisJCQl9CisJCQljaGFyW10gYXR0cmlidXRlTmFtZSA9IGNvbnN0YW50UG9vbEVudHJ5LmdldFV0ZjhWYWx1ZSgpOworCQkJaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuREVQUkVDQVRFRCkpIHsKKwkJCQl0aGlzLmlzRGVwcmVjYXRlZCA9IHRydWU7CisJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IG5ldyBDbGFzc0ZpbGVBdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQl9IGVsc2UgaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU1lOVEhFVElDKSkgeworCQkJCXRoaXMuaXNTeW50aGV0aWMgPSB0cnVlOworCQkJCXRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVzSW5kZXgrK10gPSBuZXcgQ2xhc3NGaWxlQXR0cmlidXRlKGNsYXNzRmlsZUJ5dGVzLCBjb25zdGFudFBvb2wsIG9mZnNldCArIHJlYWRPZmZzZXQpOworCQkJfSBlbHNlIGlmIChlcXVhbHMoYXR0cmlidXRlTmFtZSwgSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNPREUpKSB7CisJCQkJaWYgKCFub19jb2RlX2F0dHJpYnV0ZSkgeworCQkJCQl0aGlzLmNvZGVBdHRyaWJ1dGUgPSBuZXcgQ29kZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMuY29kZUF0dHJpYnV0ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGVxdWFscyhhdHRyaWJ1dGVOYW1lLCBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuRVhDRVBUSU9OUykpIHsKKwkJCQl0aGlzLmV4Y2VwdGlvbkF0dHJpYnV0ZSA9IG5ldyBFeGNlcHRpb25BdHRyaWJ1dGUoY2xhc3NGaWxlQnl0ZXMsIGNvbnN0YW50UG9vbCwgb2Zmc2V0ICsgcmVhZE9mZnNldCk7CisJCQkJdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZXNJbmRleCsrXSA9IHRoaXMuZXhjZXB0aW9uQXR0cmlidXRlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlc0luZGV4KytdID0gbmV3IENsYXNzRmlsZUF0dHJpYnV0ZShjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQgKyByZWFkT2Zmc2V0KTsKKwkJCX0KKwkJCXJlYWRPZmZzZXQgKz0gKDYgKyB1NEF0KGNsYXNzRmlsZUJ5dGVzLCByZWFkT2Zmc2V0ICsgMiwgb2Zmc2V0KSk7CisJCX0KKwkJYXR0cmlidXRlQnl0ZXMgPSByZWFkT2Zmc2V0OworCX0KKwkvKioKKwkgKiBAc2VlIElNZXRob2RJbmZvI2dldEFjY2Vzc0ZsYWdzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEFjY2Vzc0ZsYWdzKCkgeworCQlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZXRob2RJbmZvI2dldENvZGVBdHRyaWJ1dGUoKQorCSAqLworCXB1YmxpYyBJQ29kZUF0dHJpYnV0ZSBnZXRDb2RlQXR0cmlidXRlKCkgeworCQlyZXR1cm4gdGhpcy5jb2RlQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0RGVzY3JpcHRvcigpCisJICovCisJcHVibGljIGNoYXJbXSBnZXREZXNjcmlwdG9yKCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0TmFtZSgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1ldGhvZEluZm8jaXNDbGluaXQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2xpbml0KCkgeworCQlyZXR1cm4gbmFtZVswXSA9PSAnPCcgJiYgbmFtZS5sZW5ndGggPT0gODsgLy8gQ2FuIG9ubHkgbWF0Y2ggPGNsaW5pdD4KKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZXRob2RJbmZvI2lzQ29uc3RydWN0b3IoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CisJCXJldHVybiBuYW1lWzBdID09ICc8JyAmJiBuYW1lLmxlbmd0aCA9PSA2OyAvLyBDYW4gb25seSBtYXRjaCA8aW5pdD4KKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZXRob2RJbmZvI2lzRGVwcmVjYXRlZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgeworCQlyZXR1cm4gdGhpcy5pc0RlcHJlY2F0ZWQ7CisJfQorCisJLyoqCisJICogQHNlZSBJTWV0aG9kSW5mbyNpc1N5bnRoZXRpYygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CisJCXJldHVybiB0aGlzLmlzU3ludGhldGljOworCX0KKworCS8qKgorCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0RXhjZXB0aW9uQXR0cmlidXRlKCkKKwkgKi8KKwlwdWJsaWMgSUV4Y2VwdGlvbkF0dHJpYnV0ZSBnZXRFeGNlcHRpb25BdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvbkF0dHJpYnV0ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElNZXRob2RJbmZvI2dldEF0dHJpYnV0ZUNvdW50KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzQ291bnQ7CisJfQorCisJLyoqCisJICogQHNlZSBJTWV0aG9kSW5mbyNnZXREZXNjcmlwdG9ySW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVzY3JpcHRvckluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9ySW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJTWV0aG9kSW5mbyNnZXROYW1lSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TmFtZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5uYW1lSW5kZXg7CisJfQorCisJaW50IHNpemVJbkJ5dGVzKCkgeworCQlyZXR1cm4gYXR0cmlidXRlQnl0ZXM7CisJfQorCS8qKgorCSAqIEBzZWUgSU1ldGhvZEluZm8jZ2V0QXR0cmlidXRlcygpCisJICovCisJcHVibGljIElDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGVyVGhyZWFkT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1BlclRocmVhZE9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjUwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1BlclRocmVhZE9iamVjdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGRhdGEgc3RydWN0dXJlIHJlbWVtYmVyaW5nIGFuIE9iamVjdCB2YWx1ZSBieSB0aHJlYWQuIEl0cyBwdXJwb3NlIGlzIHRvIGVhc2UKKyAqIHdyaXRpbmcgbXVsdGktdGhyZWFkZWQgYWxnb3JpdGhtcyBieSBwcm92aWRpbmcgYSBwZXIgdGhyZWFkIGRhdGEgc3RydWN0dXJlLgorICovCitwdWJsaWMgY2xhc3MgUGVyVGhyZWFkT2JqZWN0IHsKKworCXByaXZhdGUgSGFzaHRhYmxlIGludGVybmFsTWFwID0gbmV3IEhhc2h0YWJsZSgzKTsgLy8gc3luY2hyb25pemVkIG1hcAorCQorCS8qKgorCSAqIEFuc3dlciB0aGUgY3VycmVudCBtYXAgZm9yIHRoaXMgdGhyZWFkCisJICovCisJcHVibGljIE9iamVjdCBnZXRDdXJyZW50KCl7CisJCXJldHVybiB0aGlzLmludGVybmFsTWFwLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSBtYXAgZm9yIHRoaXMgY3VycmVudCB0aHJlYWQgLSBzZXR0aW5nIHRvIG51bGwgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyBpdAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoT2JqZWN0IGN1cnJlbnQpeworCQlpZiAoY3VycmVudCA9PSBudWxsKXsKKwkJCXRoaXMuaW50ZXJuYWxNYXAucmVtb3ZlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwkJCQorCQl9IGVsc2UgeworCQkJdGhpcy5pbnRlcm5hbE1hcC5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgY3VycmVudCk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVmZXJlbmNlSW5mb0FkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVmZXJlbmNlSW5mb0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM4MDc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZWZlcmVuY2VJbmZvQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKKy8qKgorICogQW4gYWRhcHRlciB3aGljaCBpbXBsZW1lbnRzIHRoZSBtZXRob2RzIGZvciBoYW5kbGluZworICogcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBhcnNlci4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZUluZm9BZGFwdGVyIHsKKy8qKgorICogRG9lcyBub3RoaW5nLgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKSB7fQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdEZpZWxkUmVmZXJlbmNlKGNoYXJbXSBmaWVsZE5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KKy8qKgorICogRG9lcyBub3RoaW5nLgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2RSZWZlcmVuY2UoY2hhcltdIG1ldGhvZE5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKSB7fQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFR5cGVSZWZlcmVuY2UoY2hhcltdW10gdHlwZU5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkge30KKy8qKgorICogRG9lcyBub3RoaW5nLgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7fQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdW10gbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7fQorLyoqCisgKiBEb2VzIG5vdGhpbmcuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdIG5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU291cmNlRmlsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Tb3VyY2VGaWxlQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZWZjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU291cmNlRmlsZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklTb3VyY2VBdHRyaWJ1dGU7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJU291cmNlQXR0cmlidXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VGaWxlQXR0cmlidXRlCisJZXh0ZW5kcyBDbGFzc0ZpbGVBdHRyaWJ1dGUKKwlpbXBsZW1lbnRzIElTb3VyY2VBdHRyaWJ1dGUgeworCisJcHJpdmF0ZSBpbnQgc291cmNlRmlsZUluZGV4OworCXByaXZhdGUgY2hhcltdIHNvdXJjZUZpbGVOYW1lOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBTb3VyY2VGaWxlQXR0cmlidXRlLgorCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcworCSAqIEBwYXJhbSBjb25zdGFudFBvb2wKKwkgKiBAcGFyYW0gb2Zmc2V0CisJICogQHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBTb3VyY2VGaWxlQXR0cmlidXRlKAorCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMsCisJCUlDb25zdGFudFBvb2wgY29uc3RhbnRQb29sLAorCQlpbnQgb2Zmc2V0KQorCQl0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQlzdXBlcihjbGFzc0ZpbGVCeXRlcywgY29uc3RhbnRQb29sLCBvZmZzZXQpOworCQl0aGlzLnNvdXJjZUZpbGVJbmRleCA9IHUyQXQoY2xhc3NGaWxlQnl0ZXMsIDYsIG9mZnNldCk7CisJCUlDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSA9IGNvbnN0YW50UG9vbC5kZWNvZGVFbnRyeSh0aGlzLnNvdXJjZUZpbGVJbmRleCk7CisJCWlmIChjb25zdGFudFBvb2xFbnRyeS5nZXRLaW5kKCkgIT0gSUNvbnN0YW50UG9vbENvbnN0YW50LkNPTlNUQU5UX1V0ZjgpIHsKKwkJCXRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5JTlZBTElEX0NPTlNUQU5UX1BPT0xfRU5UUlkpOworCQl9CisJCXRoaXMuc291cmNlRmlsZU5hbWUgPSBjb25zdGFudFBvb2xFbnRyeS5nZXRVdGY4VmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZUF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCXJldHVybiBJQXR0cmlidXRlTmFtZXNDb25zdGFudHMuU09VUkNFOworCX0KKworCS8qKgorCSAqIEBzZWUgSVNvdXJjZUF0dHJpYnV0ZSNnZXRTb3VyY2VGaWxlSW5kZXgoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0U291cmNlRmlsZUluZGV4KCkgeworCQlyZXR1cm4gdGhpcy5zb3VyY2VGaWxlSW5kZXg7CisJfQorCisJLyoqCisJICogQHNlZSBJU291cmNlQXR0cmlidXRlI2dldFNvdXJjZUZpbGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldFNvdXJjZUZpbGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zb3VyY2VGaWxlTmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nSGFzaHRhYmxlT2ZJbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nSGFzaHRhYmxlT2ZJbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUzNGEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdIYXNodGFibGVPZkludC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOworCisvKioKKyAqIEEgaGFzaCB0YWJsZSBrZXllZCBieSBzdHJpbmdzIGFuZCB3aXRoIGludCB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdIYXNodGFibGVPZkludCB7CisJLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscworCXB1YmxpYyBTdHJpbmdbXSBrZXlUYWJsZTsKKwlwdWJsaWMgaW50W10gdmFsdWVUYWJsZTsKKworCWludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorCWludCB0aHJlc2hvbGQ7CitwdWJsaWMgU3RyaW5nSGFzaHRhYmxlT2ZJbnQoKSB7CisJdGhpcygxMyk7Cit9CitwdWJsaWMgU3RyaW5nSGFzaHRhYmxlT2ZJbnQoaW50IHNpemUpIHsKKwl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwl0aGlzLnRocmVzaG9sZCA9IHNpemU7IC8vIHNpemUgcmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCisJaW50IGV4dHJhUm9vbSA9IChpbnQpIChzaXplICogMS43NWYpOworCWlmICh0aGlzLnRocmVzaG9sZCA9PSBleHRyYVJvb20pCisJCWV4dHJhUm9vbSsrOworCXRoaXMua2V5VGFibGUgPSBuZXcgU3RyaW5nW2V4dHJhUm9vbV07CisJdGhpcy52YWx1ZVRhYmxlID0gbmV3IGludFtleHRyYVJvb21dOworfQorcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoU3RyaW5nIGtleSkgeworCWludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJU3RyaW5nIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKQorCQkJcmV0dXJuIHRydWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGtleS4KKyAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLgorICovCitwdWJsaWMgaW50IGdldChTdHJpbmcga2V5KSB7CisJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwlTdHJpbmcgY3VycmVudEtleTsKKwl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKKwkJaWYgKGN1cnJlbnRLZXkuZXF1YWxzKGtleSkpCisJCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiAtMTsKK30KK3B1YmxpYyBpbnQgcHV0KFN0cmluZyBrZXksIGludCB2YWx1ZSkgeworCWludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJU3RyaW5nIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKQorCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCWtleVRhYmxlW2luZGV4XSA9IGtleTsKKwl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCisJLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQorCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQorCQlyZWhhc2goKTsKKwlyZXR1cm4gdmFsdWU7Cit9Citwcml2YXRlIHZvaWQgcmVoYXNoKCkgeworCVN0cmluZ0hhc2h0YWJsZU9mSW50IG5ld0hhc2h0YWJsZSA9IG5ldyBTdHJpbmdIYXNodGFibGVPZkludChlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCVN0cmluZyBjdXJyZW50S2V5OworCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKKwkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCisJCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOworCisJdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKKwl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKKwl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7Cit9CitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplOworfQorLyoqCisgKiBSZXR1cm4gdGhlIGtleXMgc29ydGVkIGJ5IHRoZWlyIHZhbHVlcy4KKyAqLworcHVibGljIFN0cmluZ1tdIHNvcnRlZEtleXMoaW50IG1heFZhbHVlKSB7CisJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0aGlzLmVsZW1lbnRTaXplXTsKKwkKKwkvLyBjb21wdXRlIGEgbGlzdCBvZiB0aGUgZW5kIHBvc2l0aW9ucyBvZiBlYWNoIGxheWVyIGluIHJlc3VsdAorCWludFtdIGVuZFBvcyA9IG5ldyBpbnRbbWF4VmFsdWUrMV07CisJaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJU3RyaW5nIGtleSA9IHRoaXMua2V5VGFibGVbaV07CisJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaiA9IHRoaXMudmFsdWVUYWJsZVtpXTsgaiA8PSBtYXhWYWx1ZTsgaisrKSB7CisJCQkJZW5kUG9zW2pdKys7CisJCQl9CisJCX0KKwl9CisKKwkvLyBzdG9yZSB0aGUga2V5cyBpbiBvcmRlciBvZiB0aGVpciB2YWx1ZXMKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCVN0cmluZyBrZXkgPSB0aGlzLmtleVRhYmxlW2ldOworCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCWludCB2YWx1ZSA9IHRoaXMudmFsdWVUYWJsZVtpXTsKKwkJCWludCBpbmRleCA9IC0tZW5kUG9zW3ZhbHVlXTsKKwkJCXJlc3VsdFtpbmRleF0gPSBrZXk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJU3RyaW5nIGtleSA9IHRoaXMua2V5VGFibGVbaV07CisJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZChrZXkpOworCQkJYnVmZmVyLmFwcGVuZCgiIC0+ICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHRoaXMudmFsdWVUYWJsZVtpXSk7CisJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Ub1N0cmluZ1NvcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Ub1N0cmluZ1NvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWU5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1RvU3RyaW5nU29ydGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKKworLyoqCisgKiBUaGUgU29ydE9wZXJhdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBhbmQgcmV0dXJucworICogYSBzb3J0ZWQgY29sbGVjdGlvbiBvZiB0aGVzZSBvYmplY3RzLiBUaGUgc29ydGluZyBvZiB0aGVzZQorICogb2JqZWN0cyBpcyBiYXNlZCBvbiB0aGVpciB0b1N0cmluZygpLiBUaGV5IGFyZSBzb3J0ZWQgaW4KKyAqIGFscGhhYmV0aWNhbCBvcmRlci4KKyAqLworcHVibGljIGNsYXNzIFRvU3RyaW5nU29ydGVyIHsKKwlPYmplY3RbXSBzb3J0ZWRPYmplY3RzOworCVN0cmluZ1tdIHNvcnRlZFN0cmluZ3M7CisvKioKKyAqICBSZXR1cm5zIHRydWUgaWYgc3RyaW5nVHdvIGlzICdncmVhdGVyIHRoYW4nIHN0cmluZ09uZQorICogIFRoaXMgaXMgdGhlICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4KKyAqLworcHVibGljIGJvb2xlYW4gY29tcGFyZShTdHJpbmcgc3RyaW5nT25lLCBTdHJpbmcgc3RyaW5nVHdvKSB7CisJcmV0dXJuIHN0cmluZ09uZS5jb21wYXJlVG8oc3RyaW5nVHdvKSA8IDA7Cit9CisvKioKKyAqICBTb3J0IHRoZSBvYmplY3RzIGluIHNvcnRlZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhhdCBjb2xsZWN0aW9uLgorICovCitwcml2YXRlIHZvaWQgcXVpY2tTb3J0KGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKKwlpbnQgb3JpZ2luYWxSaWdodCA9IHJpZ2h0OworCWludCBtaWRJbmRleCA9ICAobGVmdCArIHJpZ2h0KSAvIDI7CisJU3RyaW5nIG1pZFRvU3RyaW5nID0gdGhpcy5zb3J0ZWRTdHJpbmdzW21pZEluZGV4XTsKKwkKKwlkbyB7CisJCXdoaWxlIChjb21wYXJlKHRoaXMuc29ydGVkU3RyaW5nc1tsZWZ0XSwgbWlkVG9TdHJpbmcpKQorCQkJbGVmdCsrOworCQl3aGlsZSAoY29tcGFyZShtaWRUb1N0cmluZywgdGhpcy5zb3J0ZWRTdHJpbmdzW3JpZ2h0XSkpCisJCQlyaWdodC0tOworCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJT2JqZWN0IHRtcCA9IHRoaXMuc29ydGVkT2JqZWN0c1tsZWZ0XTsKKwkJCXRoaXMuc29ydGVkT2JqZWN0c1tsZWZ0XSA9IHRoaXMuc29ydGVkT2JqZWN0c1tyaWdodF07CisJCQl0aGlzLnNvcnRlZE9iamVjdHNbcmlnaHRdID0gdG1wOworCQkJU3RyaW5nIHRtcFRvU3RyaW5nID0gdGhpcy5zb3J0ZWRTdHJpbmdzW2xlZnRdOworCQkJdGhpcy5zb3J0ZWRTdHJpbmdzW2xlZnRdID0gdGhpcy5zb3J0ZWRTdHJpbmdzW3JpZ2h0XTsKKwkJCXRoaXMuc29ydGVkU3RyaW5nc1tyaWdodF0gPSB0bXBUb1N0cmluZzsKKwkJCWxlZnQrKzsKKwkJCXJpZ2h0LS07CisJCX0KKwl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwkKKwlpZiAob3JpZ2luYWxMZWZ0IDwgcmlnaHQpCisJCXF1aWNrU29ydChvcmlnaW5hbExlZnQsIHJpZ2h0KTsKKwlpZiAobGVmdCA8IG9yaWdpbmFsUmlnaHQpCisJCXF1aWNrU29ydChsZWZ0LCBvcmlnaW5hbFJpZ2h0KTsKK30KKy8qKgorICogIFJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbiBmcm9tIHRoaXMgdW5zb3J0ZWQgY29sbGVjdGlvbi4KKyAqICBTb3J0IHVzaW5nIHF1aWNrIHNvcnQuCisgKi8KK3B1YmxpYyB2b2lkIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRPYmplY3RzLCBTdHJpbmdbXSB1bnNvcnRlZFN0cmluZ3MpIHsKKwlpbnQgc2l6ZSA9IHVuU29ydGVkT2JqZWN0cy5sZW5ndGg7CisJdGhpcy5zb3J0ZWRPYmplY3RzID0gbmV3IE9iamVjdFtzaXplXTsKKwl0aGlzLnNvcnRlZFN0cmluZ3MgPSBuZXcgU3RyaW5nW3NpemVdOworCQorCS8vY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbiAgCisJU3lzdGVtLmFycmF5Y29weSh1blNvcnRlZE9iamVjdHMsIDAsIHRoaXMuc29ydGVkT2JqZWN0cywgMCwgc2l6ZSk7CisJU3lzdGVtLmFycmF5Y29weSh1bnNvcnRlZFN0cmluZ3MsIDAsIHRoaXMuc29ydGVkU3RyaW5ncywgMCwgc2l6ZSk7CisJaWYgKHNpemUgPiAxKQorCQlxdWlja1NvcnQoMCwgc2l6ZSAtIDEpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBjNzNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBjb252ZW5pZW50IHV0aWxpdHkgbWV0aG9kcyB0byBvdGhlciB0eXBlcyBpbiB0aGlzIHBhY2thZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRE9VQkxFX1FVT1RFUyA9ICInJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBTSU5HTEVfUVVPVEUgPSAiJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9CisJCSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLm1lc3NhZ2VzIjsJLy8kTk9OLU5MUy0xJAorCisJc3RhdGljIHsKKwkJCS8qKgorCQkJICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgorCQkJICovCisJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJfQorCisJLyoqCisJICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKwkgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gIk5vIG1lc3NhZ2UgYXZhaWxhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJCXRyeSB7CisJCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhpZCk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZiB3ZSBnb3QgYW4gZXhjZXB0aW9uIGxvb2tpbmcgZm9yIHRoZSBtZXNzYWdlLCBmYWlsIGdyYWNlZnVsbHkgYnkganVzdCByZXR1cm5pbmcKKwkJCS8vIHRoZSBpZCB3ZSB3ZXJlIGxvb2tpbmcgZm9yLiAgSW4gbW9zdCBjYXNlcyB0aGlzIGlzIHNlbWktaW5mb3JtYXRpdmUgc28gaXMgbm90IHRvbyBiYWQuCisJCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIiArIGlkICsgIiBpbjogIiArIGJ1bmRsZU5hbWU7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQl9CisJCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWVzc2FnZUZvcm1hdCB3aGljaCBlbGltaW5hdGVzIGRvdWJsZSBxdW90ZXMgaW4gb3JpZ2luYWwgbWVzc2FnZQorCQljaGFyW10gbWVzc2FnZVdpdGhOb0RvdWJsZVF1b3RlcyA9CisJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWVzc2FnZS50b0NoYXJBcnJheSgpLCBET1VCTEVfUVVPVEVTLCBTSU5HTEVfUVVPVEUpOworCQlyZXR1cm4gbmV3IFN0cmluZyhtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzKTsKKwl9CisJLyoqCisJICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKwkgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcpIHsKKwkJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7YmluZGluZ30pOworCX0KKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nW10gYmluZGluZ3MpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gIk5vIG1lc3NhZ2UgYXZhaWxhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJCXRyeSB7CisJCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhpZCk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZiB3ZSBnb3QgYW4gZXhjZXB0aW9uIGxvb2tpbmcgZm9yIHRoZSBtZXNzYWdlLCBmYWlsIGdyYWNlZnVsbHkgYnkganVzdCByZXR1cm5pbmcKKwkJCS8vIHRoZSBpZCB3ZSB3ZXJlIGxvb2tpbmcgZm9yLiAgSW4gbW9zdCBjYXNlcyB0aGlzIGlzIHNlbWktaW5mb3JtYXRpdmUgc28gaXMgbm90IHRvbyBiYWQuCisJCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIiArIGlkICsgIiBpbjogIiArIGJ1bmRsZU5hbWU7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCQl9CisJCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWVzc2FnZUZvcm1hdCB3aGljaCBlbGltaW5hdGVzIGRvdWJsZSBxdW90ZXMgaW4gb3JpZ2luYWwgbWVzc2FnZQorCQljaGFyW10gbWVzc2FnZVdpdGhOb0RvdWJsZVF1b3RlcyA9CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXNzYWdlLnRvQ2hhckFycmF5KCksIERPVUJMRV9RVU9URVMsIFNJTkdMRV9RVU9URSk7CisJCW1lc3NhZ2UgPSBuZXcgU3RyaW5nKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMpOworCQorCQlpZiAoYmluZGluZ3MgPT0gbnVsbCkKKwkJCXJldHVybiBtZXNzYWdlOworCQorCQlpbnQgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGgoKTsKKwkJaW50IHN0YXJ0ID0gLTE7CisJCWludCBlbmQgPSBsZW5ndGg7CisJCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWlmICgoZW5kID0gbWVzc2FnZS5pbmRleE9mKCd7Jywgc3RhcnQpKSA+IC0xKSB7CisJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkpOworCQkJCWlmICgoc3RhcnQgPSBtZXNzYWdlLmluZGV4T2YoJ30nLCBlbmQpKSA+IC0xKSB7CisJCQkJCWludCBpbmRleCA9IC0xOworCQkJCQl0cnkgeworCQkJCQkJaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0KSk7CisJCQkJCQlvdXRwdXQuYXBwZW5kKGJpbmRpbmdzW2luZGV4XSk7CisJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoZW5kICsgMSwgc3RhcnQgKyAxKSk7CisJCQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQlvdXRwdXQuYXBwZW5kKCJ7bWlzc2luZyAiICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoZW5kLCBsZW5ndGgpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0ICsgMSwgbGVuZ3RoKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIG91dHB1dC50b1N0cmluZygpOworCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkYWU2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDExNiBAQAorIyMjIERpc2Fzc2VtYmxlciBtZXNzYWdlcworCisjIyMgZGlzYXNzZW1ibGVyCitjbGFzc2ZpbGVmb3JtYXQudGFyZ2V0b3B0aW9uID0gVmVyc2lvbiAodGFyZ2V0IHswfSkgCitkaXNhc3NlbWJsZXIub3BlbnR5cGVkZWNsYXJhdGlvbiA9XCB7CitkaXNhc3NlbWJsZXIuY2xvc2V0eXBlZGVjbGFyYXRpb24gPSB9CitkaXNhc3NlbWJsZXIucGFyYW1ldGVybmFtZSA9IGFyZworZGlzYXNzZW1ibGVyLmVuZG9mbWV0aG9kaGVhZGVyID0gOworZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCA9IC8qIAorZGlzYXNzZW1ibGVyLmNvbW1lbnRlbmQgPSBcICovCitkaXNhc3NlbWJsZXIuYmVnaW5jb21tZW50bGluZSA9IFwgKlwgCitkaXNhc3NlbWJsZXIuZmllbGRoYXNjb25zdGFudCA9XCA9XCAKK2Rpc2Fzc2VtYmxlci5lbmRvZmZpZWxkaGVhZGVyID0gOworZGlzYXNzZW1ibGVyLm1ldGhvZHRpdGxlID0gTWV0aG9kIAorZGlzYXNzZW1ibGVyLmV4Y2VwdGlvbnRhYmxlaGVhZGVyID0gRXhjZXB0aW9uIFRhYmxlOgorZGlzYXNzZW1ibGVyLmxpbmVudW1iZXJhdHRyaWJ1dGVoZWFkZXIgPSBMaW5lIG51bWJlciBhdHRyaWJ1dGU6CitkaXNhc3NlbWJsZXIubG9jYWx2YXJpYWJsZXRhYmxlYXR0cmlidXRlaGVhZGVyID0gTG9jYWwgdmFyaWFibGUgdGFibGUgYXR0cmlidXRlOgorZGlzYXNzZW1ibGVyLmFycmF5ZGltZW5zaW9ucyA9IFtdCitkaXNhc3NlbWJsZXIuY29uc3RydWN0b3JfbWV0aG9kX25hbWUgPQorZGlzYXNzZW1ibGVyLnBhcmFtZXRlcm5hbWVpbm1ldGhvZGludm9jYXRpb24gPQorZGlzYXNzZW1ibGVyLmNvbnN0YW50c3RyaW5nID0gPFN0cmluZyAKK2Rpc2Fzc2VtYmxlci5jb25zdGFudGludGVnZXIgPSA8SW50ZWdlciAKK2Rpc2Fzc2VtYmxlci5jb25zdGFudGZsb2F0ID0gPEZsb2F0IAorZGlzYXNzZW1ibGVyLmNvbnN0YW50ZG91YmxlID0gPERvdWJsZSAKK2Rpc2Fzc2VtYmxlci5jb25zdGFudGxvbmcgPSA8TG9uZyAKK2Rpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50ID0gPgorZGlzYXNzZW1ibGVyLmlubmVyYXR0cmlidXRlc2hlYWRlciA9IElubmVyIGNsYXNzZXMgYXR0cmlidXRlczoKK2Rpc2Fzc2VtYmxlci5pbm5lcl9jbGFzc19pbmZvX25hbWUgPSBpbm5lciBjbGFzcyBpbmZvIG5hbWU6CitkaXNhc3NlbWJsZXIub3V0ZXJfY2xhc3NfaW5mb19uYW1lID0gb3V0ZXIgY2xhc3MgaW5mbyBuYW1lOgorZGlzYXNzZW1ibGVyLmlubmVyX25hbWUgPSBpbm5lciBuYW1lOgorZGlzYXNzZW1ibGVyLmlubmVyX2FjY2Vzc2ZsYWdzID0gYWNjZXNzZmxhZ3M6IAorZGlzYXNzZW1ibGVyLmdlbmVyaWNhdHRyaWJ1dGVoZWFkZXIgPSBBdHRyaWJ1dGU6CitkaXNhc3NlbWJsZXIuZ2VuZXJpY2F0dHJpYnV0ZW5hbWUgPSBOYW1lOiAKK2Rpc2Fzc2VtYmxlci5nZW5lcmljYXR0cmlidXRlbGVuZ3RoID1cIExlbmd0aDogCitkaXNhc3NlbWJsZXIuY29kZWF0dHJpYnV0ZWhlYWRlciA9IENvZGUgYXR0cmlidXRlOgorZGlzYXNzZW1ibGVyLnRhYiA9IFx0CitkaXNhc3NlbWJsZXIuY29uc3RhbnRwb29saW5kZXggPVwgIworZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yID0gPgorZGlzYXNzZW1ibGVyLnNwYWNlID0gXCAKK2Rpc2Fzc2VtYmxlci5jb21tYSA9ICwgCitkaXNhc3NlbWJsZXIub3BlbmlubmVyY2xhc3NlbnRyeSA9IFsKK2Rpc2Fzc2VtYmxlci5jbG9zZWlubmVyY2xhc3NlbnRyeSA9IF0KKworIyMjIGNsYXNzZmlsZWZvcm1hdCBkZWNvZGluZworY2xhc3NmaWxlZm9ybWF0LnNvdXJjZW5hbWUgPSAvLyBDb21waWxlZCBmcm9tIAorY2xhc3NmaWxlZm9ybWF0Lm1hZ2ljbnVtYmVyID0gLSBtYWdpYzpcIAorY2xhc3NmaWxlZm9ybWF0Lm1pbm9ydmVyc2lvbiA9IC0gbWlub3I6XCAKK2NsYXNzZmlsZWZvcm1hdC5tYWpvcnZlcnNpb24gPSAgLSBtYWpvcjpcIAorY2xhc3NmaWxlZm9ybWF0LmFjY19hYnN0cmFjdCA9IGFic3RyYWN0CitjbGFzc2ZpbGVmb3JtYXQuYWNjX2ZpbmFsID0gZmluYWwKK2NsYXNzZmlsZWZvcm1hdC5hY2NfbmF0aXZlID0gbmF0aXZlCitjbGFzc2ZpbGVmb3JtYXQuYWNjX3ByaXZhdGUgPSBwcml2YXRlCitjbGFzc2ZpbGVmb3JtYXQuYWNjX3Byb3RlY3RlZCA9IHByb3RlY3RlZAorY2xhc3NmaWxlZm9ybWF0LmFjY19wdWJsaWMgPSBwdWJsaWMKK2NsYXNzZmlsZWZvcm1hdC5hY2Nfc3RhdGljID0gc3RhdGljCitjbGFzc2ZpbGVmb3JtYXQuYWNjX3N0cmljdCA9IHN0cmljdAorY2xhc3NmaWxlZm9ybWF0LmFjY19zeW5jaHJvbml6ZWQgPSBzeW5jaHJvbml6ZWQKK2NsYXNzZmlsZWZvcm1hdC5hY2NfdHJhbnNpZW50ID0gdHJhbnNpZW50CitjbGFzc2ZpbGVmb3JtYXQuYWNjX3ZvbGF0aWxlID0gdm9sYXRpbGUKK2NsYXNzZmlsZWZvcm1hdC5jbGFzcyA9IGNsYXNzIAorY2xhc3NmaWxlZm9ybWF0LmludGVyZmFjZSA9IGludGVyZmFjZSAKK2NsYXNzZmlsZWZvcm1hdC5leHRlbmRzID1cIGV4dGVuZHMgCitjbGFzc2ZpbGVmb3JtYXQuaW1wbGVtZW50cyA9XCBpbXBsZW1lbnRzIAorY2xhc3NmaWxlZm9ybWF0LnRocm93cyA9XCB0aHJvd3MgCitjbGFzc2ZpbGVmb3JtYXQubWV0aG9kZGVzY3JpcHRvciA9XCBNZXRob2QgZGVzY3JpcHRvciAKK2NsYXNzZmlsZWZvcm1hdC5maWVsZGRkZXNjcmlwdG9yID1cIEZpZWxkIGRlc2NyaXB0b3IgCitjbGFzc2ZpbGVmb3JtYXQubWF4U3RhY2sgPSBTdGFjazogCitjbGFzc2ZpbGVmb3JtYXQubWF4TG9jYWxzID0gTG9jYWxzOiAKK2NsYXNzZmlsZWZvcm1hdC5zdXBlcmZsYWdub3RzZXQgPSBUaGUgQUNDX1NVUEVSIGJpdCBpcyBub3Qgc2V0CitjbGFzc2ZpbGVmb3JtYXQuY2xpbml0bmFtZSA9IHt9CisjIyMgc3RyaW5nIGRpc3BsYXllZCBmb3IgZWFjaCBvcGNvZGUKK2NsYXNzZmlsZWZvcm1hdC5jYXNlID0gY2FzZSAKK2Rpc2Fzc2VtYmxlci5jb2xvbiA9IDogCitjbGFzc2ZpbGVmb3JtYXQuZGVmYXVsdCA9XCBkZWZhdWx0OiAKK2NsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWJvb2xlYW4gPSBib29sZWFuCitjbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXljaGFyID0gY2hhcgorY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZmxvYXQgPSBmbG9hdAorY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZG91YmxlID0gZG91YmxlCitjbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlieXRlID0gYnl0ZQorY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5c2hvcnQgPSBzaG9ydAorY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5aW50ID0gaW50CitjbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlsb25nID0gbG9uZworY2xhc3Nmb3JtYXQuaW52b2tlaW50ZXJmYWNlbWV0aG9kID1cIDxJbnRlcmZhY2UgbWV0aG9kIAorY2xhc3Nmb3JtYXQuaW52b2tlaW50ZXJmYWNlbWV0aG9kY2xvc2UgPSA+CitjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsY29uc3RydWN0b3IgPVwgPENvbnN0cnVjdG9yIAorY2xhc3Nmb3JtYXQuaW52b2tlc3BlY2lhbGNvbnN0cnVjdG9yY2xvc2UgPSA+CitjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsbWV0aG9kID1cIDxNZXRob2QgCitjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsbWV0aG9kY2xvc2UgPSA+CitjbGFzc2Zvcm1hdC5pbnZva2VzdGF0aWNtZXRob2QgPVwgPE1ldGhvZCAKK2NsYXNzZm9ybWF0Lmludm9rZXN0YXRpY21ldGhvZGNsb3NlID0gPgorY2xhc3Nmb3JtYXQuaW52b2tldmlydHVhbG1ldGhvZCA9XCA8TWV0aG9kIAorY2xhc3Nmb3JtYXQuaW52b2tldmlydHVhbG1ldGhvZGNsb3NlID0gPgorY2xhc3Nmb3JtYXQuZ2V0ZmllbGQgPSBcIDxGaWVsZCAKK2NsYXNzZm9ybWF0LmdldGZpZWxkY2xvc2UgPSA+CitjbGFzc2Zvcm1hdC5nZXRzdGF0aWMgPSBcIDxGaWVsZCAKK2NsYXNzZm9ybWF0LmdldHN0YXRpY2Nsb3NlID0gPgorY2xhc3Nmb3JtYXQucHV0c3RhdGljID1cIDxGaWVsZCAKK2NsYXNzZm9ybWF0LnB1dHN0YXRpY2Nsb3NlID0gPgorY2xhc3Nmb3JtYXQucHV0ZmllbGQgPVwgPEZpZWxkIAorY2xhc3Nmb3JtYXQucHV0ZmllbGRjbG9zZSA9ID4KK2NsYXNzZm9ybWF0Lm5hcmdzID1cIFtuYXJncyA6IAorY2xhc3Nmb3JtYXQuaW50ZXJmYWNlbWV0aG9kcmVmaW5kZXggPSBdICMKK2NsYXNzZmlsZWZvcm1hdC5hbnlleGNlcHRpb25oYW5kbGVyPWFueQorY2xhc3NmaWxlZm9ybWF0LmZpZWxkZGVzY3JpcHRvcmluZGV4PSMKK2NsYXNzZmlsZWZvcm1hdC5leGNlcHRpb250YWJsZWZyb209W3BjOiAKK2NsYXNzZmlsZWZvcm1hdC5leGNlcHRpb250YWJsZXRvPSwgcGM6IAorY2xhc3NmaWxlZm9ybWF0LmV4Y2VwdGlvbnRhYmxlZ290bz1dIC0+IAorY2xhc3NmaWxlZm9ybWF0LmV4Y2VwdGlvbnRhYmxld2hlbiA9XCB3aGVuIDogCitjbGFzc2ZpbGVmb3JtYXQubGluZW51bWJlcnRhYmxlZnJvbT1bcGM6IAorY2xhc3NmaWxlZm9ybWF0LmxpbmVudW1iZXJ0YWJsZXRvPSwgbGluZTogCitjbGFzc2ZpbGVmb3JtYXQubGluZW51bWJlcnRhYmxlY2xvc2U9XQorY2xhc3NmaWxlZm9ybWF0LmxvY2FsdmFyaWFibGV0YWJsZWZyb209W3BjOiAKK2NsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGV0bz0sIHBjOiAKK2NsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGVsb2NhbG5hbWU9XSBsb2NhbDogCitjbGFzc2ZpbGVmb3JtYXQubG9jYWx2YXJpYWJsZXRhYmxlbG9jYWxpbmRleD1cIGluZGV4OiAKK2NsYXNzZmlsZWZvcm1hdC5sb2NhbHZhcmlhYmxldGFibGVsb2NhbHR5cGU9XCB0eXBlOiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9iYXRjaCBjb21waWxlL2JhdGNoQ29tcGlsZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vYmF0Y2ggY29tcGlsZS9iYXRjaENvbXBpbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRkNGIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vYmF0Y2ggY29tcGlsZS9iYXRjaENvbXBpbGUuaHRtbApAQCAtMCwwICsxLDI3MCBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc5IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5Ib3cgdG86IFJ1biBiYXRjaCBjb21waWxlcjwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzwvaGVhZD4KKzxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiPgorJm5ic3A7Cis8dGFibGUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9NSBDRUxMUEFERElORz0yIFdJRFRIPSIxMDAlIiA+Cis8dHI+Cis8dGQgQUxJR049TEVGVCBWQUxJR049VE9QIENPTFNQQU49IjIiIEJHQ09MT1I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj5KRFQKK0NvcmUgLyBIb3dUbzogUnVuIHRoZSBCYXRjaCBDb21waWxlciZuYnNwOzwvZm9udD48L2I+PC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+CisKKzx0ZCBXSURUSD0iOTglIj48Yj5GaW5kaW5nIHRoZSBiYXRjaCBjb21waWxlcjwvYj4KKzxicj5UaGUgYmF0Y2ggY29tcGlsZXIgY2xhc3MgaXMgbG9jYXRlZCBpbiB0aGUgaW50ZXJuYWwgY2xhc3NlcyBvZiB0aGUKK0pEVC9Db3JlIHBsdWdpbi4gU28gaXQgaXMgaW4gdGhlIDxpPmpkdGNvcmUuamFyPC9pPiBmaWxlIGluIHRoZSBkaXJlY3RvcnkKKzxpPnBsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmNvcmU8L2k+LgorVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIDxpPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluPC9pPi4mbmJzcDs8L3RkPgorPC90cj4KKworPHRyPgorPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KKworPHRkIFdJRFRIPSI5OCUiPjxiPlJ1bm5pbmcgdGhlIGJhdGNoIGNvbXBpbGVyPC9iPgorPHVsPgorPGxpPgorVXNpbmcgdGhlIG1haW4gbWV0aG9kLjwvbGk+CisKKzxibG9ja3F1b3RlPlVzaW5nIHRoZSBtYWluIG1ldGhvZC4gVGhlIE1haW4gY2xhc3MgaGFzIGEgbWFpbiBtZXRob2QuIFRoaXMKK2lzIHRoZSBjbGFzc2ljYWwgd2F5IHRvIGludm9rZSB0aGUgYmF0Y2ggY29tcGlsZXIgb24gYSBjb21tYW5kLWxpbmUuCis8dWw+Cis8bGk+CitGb3IgZXhhbXBsZSBvbiBhIGNvbW1hbmQtbGluZTo8L2xpPgorCis8YnI+PGZvbnQgY29sb3I9IiMzMzY2RkYiPmphdmEgLWNsYXNzcGF0aCBqZHRjb3JlLmphciBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guTWFpbgorLWNsYXNzcGF0aCBydC5qYXIgQS5qYXZhPC9mb250PgorPGxpPgorRm9yIGV4YW1wbGUgaW4gYSBqYXZhIHNvdXJjZTo8L2xpPgorCis8YnI+PGZvbnQgY29sb3I9IiMzMzY2RkYiPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluLm1haW4obmV3CitTdHJpbmdbXSB7Ii1jbGFzc3BhdGgiLCAicnQuamFyIiwgIkEuamF2YSJ9KTs8L2ZvbnQ+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGxpPgorVXNpbmcgdGhlIHN0YXRpYyBjb21waWxlKFN0cmluZykgbWV0aG9kLjwvbGk+CisKKzxibG9ja3F1b3RlPlRoZSBjb21waWxlKFN0cmluZykgbWV0aG9kIGlzIGEgY29udmVuaWVudCBtZXRob2QgdG8gaW52b2tlCit0aGUgYmF0Y2ggY29tcGlsZXIgaW4gYSBqYXZhIGFwcGxpY2F0aW9uLgorPGJyPkluc3RlYWQgb2Y6Cis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4ubWFpbihuZXcKK1N0cmluZ1tdIHsiLWNsYXNzcGF0aCIsICJydC5qYXIiLCAiQS5qYXZhIn0pOzwvZm9udD48L2xpPgorCis8bGk+Cit5b3UgY2FuIHNpbXBseSB3cml0ZTogPGZvbnQgY29sb3I9IiMzMzY2RkYiPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluLmNvbXBpbGUoIi1jbGFzc3BhdGgKK3J0LmphciBBLmphdmEiKTs8L2ZvbnQ+PC9saT4KKzwvdWw+Cis8L2Jsb2NrcXVvdGU+Cis8L3VsPgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+CisKKzx0ZCBXSURUSD0iOTglIj48Yj5XaGljaCBvcHRpb25zIGFyZSBhdmFpbGFibGU/PC9iPgorPHA+CitXaXRoIHRoZSB5ZWxsb3cgYmFja2dyb3VuZCwgdGhlc2UgYXJlIHJlcXVpcmVkIG9wdGlvbnMuPGJyPgorV2l0aCB0aGUgb3JhbmdlIGJhY2tncm91bmQsIHRoZXNlIGFyZSBzdWdnZXN0ZWQgb3B0aW9ucy4KKzwvcD4KKzxibG9ja3F1b3RlPiZuYnNwOworPHRhYmxlIEJPUkRFUiBDRUxMU1BBQ0lORz0yIENFTExQQURESU5HPTIgQ09MUz0yIFdJRFRIPSIxMDAlIiA+Cis8dHI+Cis8dGg+TmFtZTwvdGg+Cis8dGg+VXNhZ2U8L3RoPgorPC90cj4KKzx0cj4KKzx0ZD4taGVscDwvdGQ+Cis8dGQgdmFsaWduPXRvcD5EaXNwbGF5IHRoZSBoZWxwIG1lc3NhZ2U8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi12ZXJzaW9uPC90ZD4KKzx0ZD5EaXNwbGF5IHRoZSBidWlsZCBudW1iZXIgb2YgdGhlIGNvbXBpbGVyLiBUaGlzIGlzIHZlcnkgdXNlZnVsIHRvIHJlcG9ydCBhIGJ1Zy48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wIGJnY29sb3I9IiNGRkZGQ0MiPi1jbGFzc3BhdGggJmx0O2RpciAxJmd0OzsmbHQ7ZGlyIDImZ3Q7Oy4uLjsmbHQ7ZGlyIFAmZ3Q7PC90ZD4KKzx0ZCB2YWxpZ249dG9wIGJnY29sb3I9IiNGRkZGQ0MiPlRoaXMgaXMgYSBsaXN0IG9mIGRpcmVjdG9yeSBvciBqYXIgZmlsZXMgdXNlZCB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuIFRoZXJlIGlzIG5vIGRlZmF1bHQgY2xhc3NwYXRoLiBTbyB0aGlzIG9wdGlvbgoraXMgYWx3YXlzIHJlcXVpcmVkIHRvIGNvbXBpbGUgc291cmNlIGZpbGVzLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0iI0ZGQ0NBQSI+LWQgJmx0O2RpciAxJmd0O3xub25lPC90ZD4KKzx0ZCBiZ2NvbG9yPSIjRkZDQ0FBIj5UaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBpbiB3aGljaCBkaXJlY3RvcnkgdGhlIGdlbmVyYXRlZCAuY2xhc3MgZmlsZXMgc2hvdWxkIGJlIGR1bXBlZC4gSWYgaXQgaXMgb21pdHRlZCwgbm8gcGFja2FnZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIGNyZWF0ZWQuPGJyPgorSWYgeW91IGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzLCB1c2UgPGZvbnQgY29sb3I9IiMzMzY2RkYiPi1kIG5vbmU8L2ZvbnQ+LjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LXRhcmdldCAxLjF8MS4yPC90ZD4KKzx0ZD5UaGlzIHNwZWNpZmllcyB0aGUgY2xhc3NmaWxlIHRhcmdldCBzZXR0aW5nLiBUaGUgcG9zc2libGUgdmFsdWUgYXJlIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjE8L2ZvbnQ+IG9yIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjI8L2ZvbnQ+LCBkZWZhdWx0IGlzIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjE8L2ZvbnQ+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD4tMS4zPC90ZD4KKzx0ZD5TZXQgY29tcGxpYW5jZSBsZXZlbCB0byA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+MS4zPC9mb250PiAoZGVmYXVsdCk8L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi0xLjQ8L3RkPgorPHRkPlNldCBjb21wbGlhbmNlIGxldmVsIHRvIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjQ8L2ZvbnQ+LjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LXNvdXJjZSAxLjN8MS40PC90ZD4KKzx0ZD5UaGlzIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBhc3NlcnRpb24gc3VwcG9ydCBvZiB0aGUgY29tcGlsZXIuIFRoZSBwb3NzaWJsZSB2YWx1ZSBhcmU6IDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjM8L2ZvbnQ+IG9yIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjQ8L2ZvbnQ+LCBkZWZhdWx0IGlzIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjM8L2ZvbnQ+IGluIDxmb250IGNvbG9yPSIjMzM2NkZGIj4tMS4zPC9mb250PiBtb2RlIGFuZCA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+MS40PC9mb250PiBpbiA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+LTEuNDwvZm9udD4gbW9kZS4KK0luIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjQ8L2ZvbnQ+LCA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+PEk+YXNzZXJ0PC9JPjwvZm9udD4gaXMgdHJlYXRlZCBhcyBhIGtleXdvcmQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD4td2FybjogPGJsb2NrcXVvdGU+Y29uc3RydWN0b3JOYW1lPGJyPnxwYWNrYWdlRGVmYXVsdE1ldGhvZDxicj58ZGVwcmVjYXRpb248YnI+fG1hc2tlZENhdGNoQmxvY2tzPGJyPnx1bnVzZWRMb2NhbHM8YnI+fHVudXNlZEFyZ3VtZW50czxicj58dW51c2VkSW1wb3J0czxicj58c3ludGhldGljQWNjZXNzPGJyPnxhc3NlcnRJZGVudGlmaWVyPC9ibG9ja3F1b3RlPgorPC90ZD4KKzx0ZD5TZXQgd2FybmluZyBsZXZlbC48YnI+ZS5nLiA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+LXdhcm46dW51c2VkTG9jYWxzLGRlcHJlY2F0aW9uPC9mb250Pjxicj4KKzx0YWJsZT4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0PmNvbnN0cnVjdG9yTmFtZTwvdGg+Cis8dGQ+d2FybiBtZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggYWxpZ249bGVmdD5wYWNrYWdlRGVmYXVsdE1ldGhvZDwvdGg+Cis8dGQ+d2FybiBhdHRlbXB0IHRvIG92ZXJyaWRlIHBhY2thZ2UtZGVmYXVsdCBtZXRob2Q8L3RkPgorPC90cj4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0PmRlcHJlY2F0aW9uPC90aD4KKzx0ZD53YXJuIHVzYWdlIG9mIGRlcHJlY2F0ZWQgdHlwZSBvciBtZW1iZXI8L3RkPgorPC90cj4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0Pm1hc2tlZENhdGNoQmxvY2tzPC90aD4KKzx0ZD53YXJuIGhpZGRlbiBjYXRjaCBibG9jazwvdGQ+Cis8L3RyPgorPHRyPgorPHRoIGFsaWduPWxlZnQ+dW51c2VkTG9jYWxzPC90aD4KKzx0ZD53YXJuIHVudXNlZCBsb2NhbCB2YXJpYWJsZTwvdGQ+Cis8L3RyPgorPHRyPgorPHRoIGFsaWduPWxlZnQ+dW51c2VkQXJndW1lbnRzPC90aD4KKzx0ZD53YXJuIHVudXNlZCBtZXRob2QgYXJndW1lbnQ8L3RkPgorPC90cj4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0PnVudXNlZEltcG9ydHM8L3RoPgorPHRkPldoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgaW1wb3J0IHJlZmVyZW5jZQorPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggYWxpZ249bGVmdD5zeW50aGV0aWNBY2Nlc3M8L3RoPgorPHRkPndhcm4gd2hlbiBwZXJmb3JtaW5nIHN5bnRoZXRpYyBhY2Nlc3MgZm9yIGlubmVyY2xhc3M8L3RkPgorPC90cj4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0PmFzc2VydElkZW50aWZpZXI8L3RoPgorPHRkPndhcm4gb2NjdXJyZW5jZSBvZiA8aT5hc3NlcnQ8L2k+IHVzZWQgYXMgaWRlbnRpZmllcjwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LW5vd2FybjwvdGQ+Cis8dGQ+Tm8gd2FybmluZyAoZXF1aXZhbGVudCB0byA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+LXdhcm46bm9uZTwvZm9udD4pPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD4tZGVwcmVjYXRpb248L3RkPgorPHRkPkVxdWl2YWxlbnQgdG8gPGZvbnQgY29sb3I9IiMzMzY2RkYiPi13YXJuOmRlcHJlY2F0aW9uPC9mb250Pi48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi1nWzpub25lfDpsaW5lcyx2YXJzLHNvdXJjZV0KKzwvdGQ+Cis8dGQ+U2V0IHRoZSBkZWJ1ZyBhdHRyaWJ1dGVzIGxldmVsPGJyPgorPHRhYmxlPgorPHRyPgorPHRoIGFsaWduPWxlZnQ+LWc8L3RoPgorPHRkPkFsbCBkZWJ1ZyBpbmZvIChlcXVpdmFsZW50IHRvIDxmb250IGNvbG9yPSIjMzM2NkZGIj4tZzpsaW5lcyx2YXJzLHNvdXJjZTwvZm9udD4pCis8L3RkPgorPC90cj4KKzx0aCBhbGlnbj1sZWZ0Pi1nOm5vbmU8L3RoPgorPHRkPk5vIGRlYnVnIGluZm88L3RkPgorPC90cj4KKzx0cj4KKzx0aCBhbGlnbj1sZWZ0Pi1nOltsaW5lcyx2YXJzLHNvdXJjZV08L3RoPgorPHRkPlNlbGVjdGl2ZSBkZWJ1ZyBpbmZvPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi1wcmVzZXJ2ZUFsbExvY2FsczwvdGQ+Cis8dGQ+RXhwbGljaXRseSByZXF1ZXN0IHRoZSBjb21waWxlciB0byBwcmVzZXJ2ZSBhbGwgbG9jYWwgdmFyaWFibGVzIChmb3IgZGVidWcgcHVycG9zZSkuIElmIG9taXR0ZWQsIHRoZSBjb21waWxlciB3aWxsIHJlbW92ZWQgdW51c2VkIGxvY2Fscy48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi1ub0ltcG9ydEVycm9yPC90ZD4KKzx0ZD5UaGUgY29tcGlsZXIgd29uJ3QgcmVwb3J0IGFuIGVycm9yIGZvciB1bnJlc29sdmVkIGltcG9ydHMuIEEgd2FybmluZyBpcyBpc3N1ZWQgaW5zdGVhZC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi1lbmNvZGluZyAmbHQ7ZW5jb2RpbmcgbmFtZSZndDs8L3RkPgorPHRkPlNwZWNpZnkgZGVmYXVsdCBzb3VyY2UgZW5jb2RpbmcgZm9ybWF0IChjdXN0b20gZW5jb2RpbmcgY2FuIGFsc28gYmUgc3BlY2lmZWQgb24gYSBwZXIgZmlsZSBiYXNpcyBieSBzdWZmaXhpbmcgZWFjaCBpbnB1dCBzb3VyY2UgZmlsZS9mb2xkZXIgbmFtZSB3aXRoIDxmb250IGNvbG9yPSIjMzM2NkZGIj5bZW5jb2RpbmcgJmx0O2VuY29kaW5nIG5hbWUmZ3Q7XTwvZm9udD4pLjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LWxvZyAmbHQ7ZmlsZW5hbWUmZ3Q7PC90ZD4KKzx0ZD5TcGVjaWZ5IGEgbG9nIGZpbGUgaW4gd2hpY2ggYWxsIG91dHB1dCBmcm9tIHRoZSBjb21waWxlciB3aWxsIGJlIGR1bXBlZC4gVGhpcyBpcyByZWFsbHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRlYnVnIHRoZSBiYXRjaAorY29tcGlsZXIgb3IgZ2V0IGEgZmlsZSB3aGljaCBjb250YWlucyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBmcm9tIGEgYmF0Y2ggYnVpbGQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD4tcHJvY2VlZE9uRXJyb3I8L3RkPgorPHRkPktlZXAgY29tcGlsaW5nIHdoZW4gZXJyb3IsIGR1bXBpbmcgY2xhc3MgZmlsZXMgd2l0aCBwcm9ibGVtIG1ldGhvZHMgb3IgcHJvYmxlbSB0eXBlcy4gVGhpcyBpcyByZWNvbW1hbmRlZCBvbmx5IGlmIHlvdSB3YW50Cit0byBiZSBhYmxlIHRvIHJ1biB5b3VyIGFwcGxpY2F0aW9uIGV2ZW4gaWYgeW91IGhhdmUgcmVtYWluaW5nIGVycm9ycy48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi12ZXJib3NlPC90ZD4KKzx0ZD5QcmludCBhY2Nlc3NlZC9wcm9jZXNzZWQgY29tcGlsYXRpb24gdW5pdHMgaW4gdGhlIGNvbnNvbGUgb3IgdGhlIGxvZyBmaWxlIGlmIHNwZWNpZmllZC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZCB2YWxpZ249dG9wPi1yZWZlcmVuY2VJbmZvPC90ZD4KKzx0ZD5Db21wdXRlIHJlZmVyZW5jZSBpbmZvLiBUaGlzIGlzIHVzZWZ1bCBvbmx5IGlmIGNvbm5lY3RlZCB0byB0aGUgYnVpbGRlci4gVGhlIHJlZmVyZW5jZSBpbmZvcyBhcmUgdXNlbGVzcyBvdGhlcndpc2UuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD4tcHJvZ3Jlc3M8L3RkPgorPHRkPlNob3cgcHJvZ3Jlc3MgKG9ubHkgaW4gLWxvZyBtb2RlKTwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LXRpbWUKKzwvdGQ+Cis8dGQ+RGlzcGxheSBzcGVlZCBpbmZvcm1hdGlvbjwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LW5vRXhpdDwvdGQ+Cis8dGQ+RG8gbm90IGNhbGwgPGZvbnQgY29sb3I9IiMzMzY2RkYiPlN5c3RlbS5leGl0KG4pPC9mb250PiBhdCBlbmQgb2YgY29tcGlsYXRpb24gKDxmb250IGNvbG9yPSIjMzM2NkZGIj5uPTA8L2ZvbnQ+IGlmIG5vIGVycm9yKTwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIHZhbGlnbj10b3A+LXJlcGVhdCAmbHQ7biZndDsKKzwvdGQ+Cis8dGQ+UmVwZWF0IGNvbXBpbGF0aW9uIHByb2Nlc3MgPGZvbnQgY29sb3I9IiMzMzY2RkYiPiZsdDtuJmd0OzwvZm9udD4gdGltZXMgKHBlcmYgYW5hbHlzaXMpLjwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKzwvYmxvY2txdW90ZT4KKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KKworPHRkIFdJRFRIPSI5OCUiPjxiPkV4YW1wbGVzPC9iPgorPGJsb2NrcXVvdGU+Cis8dGFibGU+Cis8dGQgdmFsaWduPXRvcD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+ZDpcdGVtcCAtY2xhc3NwYXRoIHJ0LmphciAtdGltZSAtZyAtZCBkOi90bXA8L2ZvbnQ+Cis8L3RkPgorPHRkIHZhbGlnbj10b3A+SXQgY29tcGlsZXMgYWxsIHNvdXJjZSBmaWxlcyBpbiBkOlx0ZW1wIGFuZCBpdHMgc3ViZm9sZGVycy4gVGhlIGNsYXNzcGF0aCBpcyBzaW1wbHkgcnQuamFyLiBJdCBnZW5lcmF0ZXMgYWxsIGRlYnVnCithdHRyaWJ1dGVzIGFuZCBhbGwgZ2VuZXJhdGVkIC5jbGFzcyBmaWxlcyBhcmUgZHVtcGVkIGluIGQ6XHRtcC4gVGhlIHNwZWVkIG9mIHRoZSBjb21waWxlciB3aWxsIGJlIGRpc3BsYXllZCBvbmNlIHRoZSBiYXRjaCBwcm9jZXNzCitpcyBjb21wbGV0ZWQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQgdmFsaWduPXRvcD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+ZDpcdGVtcFxUZXN0LmphdmEgLWNsYXNzcGF0aCBkOlx0ZW1wO3J0LmphciAtZzpub25lPC9mb250PgorPC90ZD4KKzx0ZCB2YWxpZ249dG9wPkl0IGNvbXBpbGVzIG9ubHkgVGVzdC5qYXZhIGFuZCBpdCB3aWxsIHJldHJpZXZlIGFueSBkZXBlbmRhbnQgZmlsZXMgZnJvbSBkOlx0ZW1wLiBUaGUgY2xhc3NwYXRoIGlzIHJ0LmphciBhbmQgZDpcdGVtcCwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgbmVjZXNzYXJ5IGNsYXNzZXMKK2FyZSBzZWFyY2hlZCBmaXJzdCBpbiBkOlx0ZW1wIGFuZCB0aGVuIGluIHJ0Lmphci4gSXQgZ2VuZXJhdGVzIG5vIGRlYnVnIGF0dHJpYnV0ZXMgYW5kIGFsbCBnZW5lcmF0ZWQgLmNsYXNzIGZpbGVzIGFyZSBkdW1wZWQgaW4gZDpcdG1wLjwvdGQ+Cis8L3RhYmxlPgorPC9ibG9ja3F1b3RlPgorPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9mbHVzaCBtZXRhZGF0YS9mbHVzaE1ldGFkYXRhLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9mbHVzaCBtZXRhZGF0YS9mbHVzaE1ldGFkYXRhLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyMDhmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2ZsdXNoIG1ldGFkYXRhL2ZsdXNoTWV0YWRhdGEuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+CisJPGhlYWQ+CisJCTx0aXRsZT5Ib3cgdG86IEZsdXNoIHRoZSBNZXRhZGF0YTwvdGl0bGU+CisJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCQk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKwk8L2hlYWQ+CisJPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+CisJPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgorCis8dHI+IAorICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj4gCisgICBKRFQgQ29yZSAvIEhvd1RvOiBGbHVzaCB0aGUgTWV0YWRhdGEgPC9mb250PjwvYj48L3RkPgorPC90cj4KKyAgCis8dHI+CisJPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KKwk8dGQgV0lEVEg9Ijk4JSI+PGI+VG9waWMxPC9iPjxicj4KKwlUaGlzIGlzIHRoZSBmaXJzdCB0b3BpYworCTx1bD4KKwkJQmxhYmxhMQorCTwvdWw+CisJPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9nZW5lcmF0ZSBwYXJzZXIvVXBkYXRlUGFyc2VyRmlsZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2dlbmVyYXRlIHBhcnNlci9VcGRhdGVQYXJzZXJGaWxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjExZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9nZW5lcmF0ZSBwYXJzZXIvVXBkYXRlUGFyc2VyRmlsZXMuamF2YQpAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKKworcHVibGljIGNsYXNzIFVwZGF0ZVBhcnNlckZpbGVzIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChhcmdzLmxlbmd0aCAhPSAxKSB7CisJCQlwcmludFVzYWdlKCk7CisJCQlyZXR1cm47CisJCX0KKwkJUGFyc2VyLmJ1aWxkRmlsZXNGcm9tTFBHKGFyZ3NbMF0pOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogVXBkYXRlUGFyc2VyRmlsZXMgPHBhdGggdG8gamF2YWRjbC5qYXZhPiIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImUuZy4gVXBkYXRlUGFyc2VyRmlsZXMgYzovamF2YWRjbC5qYXZhIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vZ2VuZXJhdGUgcGFyc2VyL2dlbmVyYXRlUGFyc2VyLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9nZW5lcmF0ZSBwYXJzZXIvZ2VuZXJhdGVQYXJzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQzNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vZ2VuZXJhdGUgcGFyc2VyL2dlbmVyYXRlUGFyc2VyLmh0bWwKQEAgLTAsMCArMSwyMTQgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKwk8aGVhZD4KKwkJPHRpdGxlPkhvdyB0bzogR2VuZXJhdGUgdGhlIFBhcnNlcjwvdGl0bGU+CisJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCQk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKwk8L2hlYWQ+CisJPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+CisJPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgorCis8dHI+IAorICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj4gCisgICBKRFQgQ29yZSAvIEhvd1RvOiBHZW5lcmF0ZSB0aGUgUGFyc2VyIDwvZm9udD48L2I+PC90ZD4KKzwvdHI+CisgIAorPHRyPgorCTx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+CisJPHRkIFdJRFRIPSI5OCUiPjxiPldoZXJlIHRvIGdldCB0aGUgcGFyc2VyIGdlbmVyYXRvcjwvYj48YnI+CisJPGJsb2NrcXVvdGU+VGhlIHBhcnNlciBmaWxlcyBhbmQgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB1c2luZyB0aGUgTFBHIHBhcnNlciBnZW5lcmF0b3IuIFRoaXMgdG9vbHMgaGFzCisJYmVlbiByZW5hbWVkIEppa2VzIFBhcnNlciBnZW5lcmF0b3IuIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFuZCBsYXRlc3QgcmVsZWFzZXMgYXQgdGhpcyA8QSBIUkVGPSJodHRwOi8vd3d3LTEyNC5pYm0uY29tL2RldmVsb3BlcndvcmtzL3Byb2plY3RzL2ppa2VzLyI+bGluazwvQT4uCisJVGhlIGxhdGVzdCB0b29sIGlzIHByb3ZpZGVkIGluIHNvdXJjZSBmb3JtYXQuIFdlIGRvbid0IHByb3ZpZGUgYW55IGhlbHAgZm9yIGNvbXBpbGluZyB0aGVzZQorCXNvdXJjZSBmaWxlcy4gUmVmZXIgdG8gdGhlIGxpbmsgYWJvdmUgaWYgeW91IGhhdmUgdHJvdWJsZSB0byBnZXQgYmluYXJpZXMuCisJPGJyPk91ciBncmFtbWFyIGlzIGdlbmVyYXRlZCB1c2luZyB0aGUgdmVyc2lvbiAyLjMwIG9mIExQRy4gSWYgbmV3ZXIgdmVyc2lvbnMgZmFpbCB0byBnZW5lcmF0ZSByZXNvdXJjZXMgZnJvbSBvdXIKKwlncmFtbWFyLCBwbGVhc2Ugc2VuZCByZXF1ZXN0IHRvIHRoZSBKaWtlcyBQYXJzZXIgR2VuZXJhdG9yIHRlYW0uCisJPC9ibG9ja3F1b3RlPgorCTwvcD4KKwk8L3RkPgorPC90cj4KKzx0cj4KKwk8dGQgQUxJR049UklHSFQgVkFMSUdOPVRPUCBXSURUSD0iMiUiPjxpbWcgU1JDPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2ltYWdlcy9BZGFycm93LmdpZiIgTk9TQVZFIEJPUkRFUj0wIGhlaWdodD0xNiB3aWR0aD0xNj48L3RkPgorCTx0ZCBXSURUSD0iOTglIj48Yj5XaGVyZSB0byBnZXQgdGhlIGdyYW1tYXI8L2I+PGJyPgorCTxibG9ja3F1b3RlPlRoZSBsYXRlc3QgZ3JhbW1hciBpcyBhbHdheXMgbG9jYXRlZCBpbiB0aGUgPGNvZGU+Z3JhbW1hcigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIDxjb2RlPlBhcnNlcjwvY29kZT4gY2xhc3MuIEdvIHRvIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZSBwbHVnaW5zCisJZGlyZWN0b3J5ICg8Zm9udCBjb2xvcj0iIzMzNjZGRiI+ZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpkdC5jb3JlPC9mb250PiB3aGVyZSBlY2xpcHNlIGlzIHRoZSByb290IG9mIHlvdXIgZWNsaXBzZSBpbnN0YWxsYXRpb24pIGFuZCBvcGVuIHRoZSAKKwk8Zm9udCBjb2xvcj0iIzMzNjZGRiI+amR0Y29yZXNyYy56aXA8L2ZvbnQ+IGZpbGUuIFRoZW4gc2VhcmNoIGZvciB0aGUgPGZvbnQgY29sb3I9IiMzMzY2RkYiPlBhcnNlci5qYXZhPC9mb250PiBpbnNpZGUgdGhlCisJZm9sZGVyIDxmb250IGNvbG9yPSIjMzM2NkZGIj5vcmdcZWNsaXBzZVxqZHRcaW50ZXJuYWxcY29tcGlsZXJccGFyc2VyXDwvZm9udD4uIFlvdSBuZWVkIHRvIGxvb2sgZm9yIHRoZSBtZXRob2QgbmFtZWQKKwk8Y29kZT5ncmFtbWFyKCk8L2NvZGU+LiBUaGVuIGNvcHkgaXRzIGNvbnRlbnRzIGZyb206IAorPFBSRT4tLW1haW4gb3B0aW9ucworJW9wdGlvbnMgQUNUSU9OLCBBTj1KYXZhQWN0aW9uLmphdmEsIEdQPWphdmEsIAorLi4uLgorJGVuZAorLS0gbmVlZCBhIGNhcnJpYWdlIHJldHVybiBhZnRlciB0aGUgJGVuZAorPC9QUkU+CisJaW50byBhIGZpbGUgY2FsbGVkIDxmb250IGNvbG9yPSIjMzM2NkZGIj5qYXZhLmc8L2ZvbnQ+LiBJdCBpcyBpbXBvcnRhbnQgdG8gYWRkIGEgY2FycmlhZ2UgcmV0dXJuIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZS4KKwlZb3UgY2FuIHNhdmUgdGhpcyBmaWxlIHdoZXJlIHlvdSB3YW50LCB3ZSB3aWxsIGFzc3VtZSBmcm9tIHRoZXJlb24geW91IHNhdmVkIGl0IGluIDxjb2RlPmQ6XHRlbXBcPC9jb2RlPi4KKwk8L2Jsb2NrcXVvdGU+CisJPC9wPgorCTwvdGQ+Cis8L3RyPgorPHRyPgorCTx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+CisJPHRkIFdJRFRIPSI5OCUiPjxiPldoYXQgdG8gZG8gd2l0aCB0aGVzZSBmaWxlcyBhbmQgdXBkYXRlIHRoZSBwYXJzZXIgY2xhc3MuLi48L2I+PGJyPgorCTxibG9ja3F1b3RlPgorQXNzdW1pbmcsIHRoZSBMUEcgZXhlY3V0YWJsZSAoPGNvZGU+bHBnLmV4ZTwvY29kZT4gb3IgPGNvZGU+amlrZXNwZy5leGU8L2NvZGU+KSBpcyBsb2NhdGVkIGluc2lkZSA8Y29kZT5kOlxscGc8L2NvZGU+LgorIDxvbD4KKyA8bGk+Rmlyc3QgaW4gYSBjb25zb2xlLCBydW46CisgPFBSRT4KKyAJZDoKKyAJY2QgXHRlbXAKKyAJZDpcbHBnXGxwZy5leGUgamF2YS5nCisgPC9QUkU+CisgPC9saT4KKyA8bGk+WW91IHdpbGwgZ2V0IGFuIG91dHB1dCB0aGF0IGxvb2tzIGxpa2UgdGhpczoKKyA8UFJFPgorIExQRyBQYXJzZXIgR2VuZXJhdG9yIChWMi4zMCkgICAgICAgICAgICBUdWUgQXByIDAyIDEyOjQ5OjEzIDIwMDIKKyVPUFRJT05TIEFDVElPTiwgQU49SmF2YUFjdGlvbi5qYXZhLCBHUD1qYXZhLAorJU9QVElPTlMgRklMRS1QUkVGSVg9amF2YSwgRVNDQVBFPSQsIFBSRUZJWD1Ub2tlbk5hbWUsIE9VVFBVVC1TSVpFPTEyNSAsCislT1BUSU9OUyBOT0dPVE8tREVGQVVMVCwgU0lOR0xFLVBST0RVQ1RJT05TLCBMQUxSPTEgLCBUQUJMRT1USU1FICwKKyVPUFRJT05TIEVSUk9SX01BUFMKKyVPUFRJT05TIGZpcnN0IGZvbGxvdworJU9QVElPTlMgVFJBQ0U9RlVMTCAsCislT1BUSU9OUyBWRVJCT1NFCitPcHRpb25zIGluIGVmZmVjdDoKKyAgICBBQ1RJT04gIEFDVEZJTEUtTkFNRT1KYXZhQWN0aW9uLmphdmEgIEJMT0NLQj0vLiAgQkxPQ0tFPS4vICBCWVRFICBDT05GTElDCisgICAgREVGQVVMVD01ICBOT0RFQlVHICBERUZFUlJFRCAgTk9FRElUICBFUlJPUi1NQVBTICBFU0NBUEU9JAorICAgIEZJTEUtUFJFRklYPWphdmEgIEZJUlNUICBGT0xMT1cgIEdFTkVSQVRFLVBBUlNFUj1KQVZBICBOT0dPVE8tREVGQVVMVAorICAgIEhBQ1RGSUxFLU5BTUU9amF2YWhkci5qYXZhICBIQkxPQ0tCPS86ICBIQkxPQ0tFPTovICBMQUxSPTEgIExJU1QKKyAgICBNQVgtRElTVEFOQ0U9MzAgIE1JTi1ESVNUQU5DRT0zICBOQU1FUz1PUFRJTUlaRUQgIE5PTlQtQ0hFQ0sgIE9STUFSSz18CisgICAgT1VUUFVULVNJWkU9MTI1ICBQUkVGSVg9VG9rZW5OYW1lICBSRUFELVJFRFVDRSAgTk9TQ09QRVMgIE5PU0hJRlQtREVGQVVMVAorICAgIFNJTkdMRS1QUk9EVUNUSU9OUyAgU1RBQ0stU0laRT0xMjggIFNUQVRFUyAgU1VGRklYPSAgVEFCTEU9VElNRSAgVFJBQ0U9RlUKKyAgICBWRVJCT1NFICBXQVJOSU5HUyAgWFJFRgorCisKK1RoaXMgZ3JhbW1hciBpcyBMQUxSKDEpLgorCitOdW1iZXIgb2YgVGVybWluYWxzOiAxMDUKK051bWJlciBvZiBOb250ZXJtaW5hbHM6IDIwMgorTnVtYmVyIG9mIFByb2R1Y3Rpb25zOiA0MzcKK051bWJlciBvZiBTaW5nbGUgUHJvZHVjdGlvbnM6IDE2MgorTnVtYmVyIG9mIEl0ZW1zOiAxMjY1CitOdW1iZXIgb2YgU3RhdGVzOiA1OTEKK051bWJlciBvZiBTaGlmdCBhY3Rpb25zOiAzNDgyCitOdW1iZXIgb2YgR290byBhY3Rpb25zOiA0MDYxCitOdW1iZXIgb2YgU2hpZnQvUmVkdWNlIGFjdGlvbnM6IDM2OQorTnVtYmVyIG9mIEdvdG8vUmVkdWNlIGFjdGlvbnM6IDY4NworTnVtYmVyIG9mIFJlZHVjZSBhY3Rpb25zOiA3NzM2CitOdW1iZXIgb2YgU2hpZnQtUmVkdWNlIGNvbmZsaWN0czogMAorTnVtYmVyIG9mIFJlZHVjZS1SZWR1Y2UgY29uZmxpY3RzOiAwCitOdW1iZXIgb2YgUmVkdWN0aW9ucyBzYXZlZCBieSBkZWZhdWx0OiA0OTEzCitSZWFsbG9jYXRpbmcgc3RvcmFnZSBmb3IgVElNRSB0YWJsZSwgYWRkaW5nIDM2MDMgZW50cmllcworCitMZW5ndGggb2YgQ2hlY2sgdGFibGU6IDE2ODM2CitMZW5ndGggb2YgQWN0aW9uIHRhYmxlOiAxNjYwOAorTnVtYmVyIG9mIGVudHJpZXMgaW4gQWN0aW9uIFRhYmxlOiAxMjAxMworUGVyY2VudGFnZSBvZiBpbmNyZWFzZTogMzguMiUKK0hpZ2hlc3Qgc3ltYm9sIGluIENoZWNrIFRhYmxlOiAzMDcKK1N0b3JhZ2UgUmVxdWlyZWQgZm9yIFRhYmxlczogNjY4ODggQnl0ZXMsIDY2SworU3RvcmFnZSBSZXF1aXJlZCBmb3IgUnVsZXM6IDEzMDggQnl0ZXMKKworCitBY3Rpb25zIGluIENvbXByZXNzZWQgVGFibGVzOgorICAgICBOdW1iZXIgb2YgU2hpZnRzOiAzNDgyCisgICAgIE51bWJlciBvZiBTaGlmdC9SZWR1Y2VzOiAzNjkKKyAgICAgTnVtYmVyIG9mIEdvdG9zOiA0MDYxCisgICAgIE51bWJlciBvZiBHb3RvL1JlZHVjZXM6IDY4NworICAgICBOdW1iZXIgb2YgUmVkdWNlczogMjgyMworICAgICBOdW1iZXIgb2YgRGVmYXVsdHM6IDM5MAorCitFcnJvciBtYXBzIHN0b3JhZ2U6CisgICAgU3RvcmFnZSByZXF1aXJlZCBmb3IgQUNUSU9OX1NZTUJPTFNfQkFTRSBtYXA6IDExODIgQnl0ZXMKKyAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBBQ1RJT05fU1lNQk9MU19SQU5HRSBtYXA6IDEwMDcgQnl0ZXMKKyAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBOQUNUSU9OX1NZTUJPTFNfQkFTRSBtYXA6IDExODIgQnl0ZXMKKyAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBOQUNUSU9OX1NZTUJPTFNfUkFOR0UgbWFwOiA2MzAgQnl0ZXMKKyAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBTWU1CT0xfSU5ERVggbWFwOiA2MTYgQnl0ZXMKKyAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBTVFJJTkdfQlVGRkVSIG1hcDogNDY1MiBCeXRlcworCisqKipXYXJuaW5nOiBCYXNlIENoZWNrIHZlY3RvciBjb250YWlucyB2YWx1ZSA+IDEyNy4gMTYtYml0IHdvcmRzIHVzZWQuCisqKipXYXJuaW5nOiBUZXJtaW5hbCBzeW1ib2wgPiAxMjcuIDE2LWJpdCB3b3JkcyB1c2VkLgorRXNjYXBlZCBzeW1ib2wgJGVvZiBpcyBhbiBpbnZhbGlkIEMgdmFyaWFibGUuCisKK0VzY2FwZWQgc3ltYm9sICRlcnJvciBpcyBhbiBpbnZhbGlkIEMgdmFyaWFibGUuCisgPC9QUkU+CisgSXQgY2FuIGJlIHF1aXRlIGRpZmZlcmVudCBpZiB0aGUgb3V0cHV0IGNoYW5nZWQgc2luY2UgdGhlIHZlcnNpb24gMi4zMCBvZiBscGcuIFRoZSBpbXBvcnRhbnQgcGFydCBpczo8YnI+CisgPGJsb2NrcXVvdGU+PGI+VGhpcyBncmFtbWFyIGlzIExBTFIoMSkuPC9iPjwvYmxvY2txdW90ZT4KKyBUaGlzIGNyZWF0ZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNvbWUgamF2YSBzb3VyY2UgZmlsZXMgYW5kIGluZm9ybWF0aW9uIGZpbGVzLgorIDxibG9ja3F1b3RlPjx0YWJsZSBCT1JERVI9MSBDRUxMU1BBQ0lORz0yIENFTExQQURESU5HPTEwPgorIDx0cj4KKyA8dGggVkFMSUdOPXRvcCBhbGlnbj1sZWZ0PmphdmEubDwvdGg+CisgPHRkIFZBTElHTj10b3A+SW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGxwZy9qaWtlc3BnLiBFbnVtYXJhdGUgYWxsIHRoZSBzdGF0ZXMgY3JlYXRlZCBmb3IgdGhlIGF1dG9tYXRvbiwgZXRjLjwvdGQ+CisgPC90cj4KKyA8dHI+CisgPHRoIFZBTElHTj10b3AgYWxpZ249bGVmdD5KYXZhQWN0aW9uLmphdmE8L3RoPgorIDx0ZD5JdCBjb250YWlucyB0aGUgbWV0aG9kIGNvbnN1bWVSdWxlKGludCkgb2YgdGhlIGNsYXNzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyIHRoYXQgaGFuZGxlcyBhbGwgc2VtYW50aWMgYWN0aW9ucyBkaXNwYXRjaGVzLjwvdGQ+CisgPC90cj4KKyA8dHI+Cis8dGggVkFMSUdOPXRvcCBhbGlnbj1sZWZ0PmphdmFoZHIuamF2YTwvdGg+CisgPHRkPllvdSBkb24ndCBuZWVkIHRoaXMgZmlsZS4gSXQgaXMgYWN0dWFsbHkgZW1wdHkuPC90ZD4KKyA8L3RyPgorIDx0cj4KKzx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YWRjbC5qYXZhPC90aD4KKyA8dGQ+VGhpcyBmaWxlcyBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXNvdXJjZXMgZmlsZXMuPC90ZD4KKyA8L3RyPgorIDx0cj4KKzx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YXN5bS5qYXZhPC90aD4KKyA8dGQ+VGhpcyBpcyB0aGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHMuIFlvdSBuZWVkIHRvIHJlcGxhY2U6PGJyPgorIDx1bD4KKyA8bGk+VG9rZW5OYW1lJGVvZiB3aXRoIFRva2VuTmFtZUVPRjwvbGk+CisgPGxpPlRva2VuTmFtZSRlcnJvciB3aXRoIFRva2VuTmFtZUVSUk9SPC9saT4KKyA8L3VsPjwvdGQ+CisgPC90cj4KKyA8dHI+Cis8dGggVkFMSUdOPXRvcCBhbGlnbj1sZWZ0PmphdmFkZWYuamF2YTwvdGg+CisgPHRkPlRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlckJhc2ljSW5mb3JtYXRpb24uPC90ZD4KKyA8L3RyPgorIDx0cj4KKzx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YXBycy5qYXZhPC90aD4KKyA8dGQ+WW91IGRvbid0IG5lZWQgdGhpcyBmaWxlLiBJdHMgY29udGVudHMgaXMgYWxyZWFkeSBpbmxpbmVkIGluIHRoZSBQYXJzZXIgY2xhc3MuPC90ZD4KKyA8L3RyPgorIDwvdGFibGU+PC9ibG9ja3F1b3RlPgorIDwvbGk+CisgPGxpPjxibG9ja3F1b3RlPk5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGlmZmVyZW50IGNsYXNzZXMgYW5kIHJlc291cmNlIGZpbGVzLgorIDwvYmxvY2txdW90ZT4KKyA8b2w+CisgPGxpPkNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+SmF2YUFjdGlvbi5qYXZhPC9mb250PiBmaWxlIGludG8gdGhlIDxmb250IGNvbG9yPSIjMzM2NkZGIj5jb25zdW1lUnVsZShpbnQpPC9mb250PiBtZXRob2Qgb2YgdGhlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyIGNsYXNzLgorIDwvbGk+CisgPGxpPlRoZSBkZWZpbml0aW9uIG9mIHRoZSBQYXJzZXIgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHR3byB0YWJsZXMgZnJvbSA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+amF2YWRjbC5qYXZhPC9mb250Pi4gVGhvc2UgYXJlIDxmb250IGNvbG9yPSIjMzM2NkZGIj5yaHNbXTwvZm9udD4gYW5kIDxmb250IGNvbG9yPSIjMzM2NkZGIj5uYW1lW108L2ZvbnQ+LgorIFRoZSBmb2xsb3dpbmcgZW50cmllcyBpbiBuYW1lW10gbmVlZCB0byBiZSByZXBsYWNlZDoKKyA8dWw+CisgPGxpPjxmb250IGNvbG9yPSIjMzM2NkZGIj4kZW9mPC9mb250PiB3aXRoIDxmb250IGNvbG9yPSIjMzM2NkZGIj5VTkVYUEVDVEVEX0VPRjwvZm9udD48L2xpPgorIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZGRiI+JGVycm9yPC9mb250PiB3aXRoIDxmb250IGNvbG9yPSIjMzM2NkZGIj4iSW52YWxpZCBDaGFyYWN0ZXIiPC9mb250PjwvbGk+CisgPC91bD4KK1RoZSBwcmV2aW91cyBkZWZpbml0aW9uIG9mIG5hbWVbXSB3aWxsIGd1aWRlIHlvdS4KKyA8L2xpPgorIDxsaT5UaGUgY2xhc3MgPGZvbnQgY29sb3I9IiMzMzY2RkYiPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyQmFzaWNJbmZvcm1hdGlvbjwvZm9udD4gbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIDxmb250IGNvbG9yPSIjMzM2NkZGIj5qYXZhZGVmLmphdmE8L2ZvbnQ+LiBEb24ndCBjb3B5IHRoZSAKKyBpbnRlcmZhY2UgbmFtZS4gU2ltcGx5IGNvcHkgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucy4gVGhlIGFjdHVhbCBzb3VyY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGd1aWRlIHlvdS48L2xpPgorIDxsaT5UaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3Mgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFN5bWJvbHMuIFlvdSBuZWVkIHRvIHJlcGxhY2U6PGJyPgorIDx1bD4KKyA8bGk+PGZvbnQgY29sb3I9IiMzMzY2RkYiPlRva2VuTmFtZSRlb2Y8L2ZvbnQ+IHdpdGggPGZvbnQgY29sb3I9IiMzMzY2RkYiPlRva2VuTmFtZUVPRjwvZm9udD48L2xpPgorIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZGRiI+VG9rZW5OYW1lJGVycm9yPC9mb250PiB3aXRoIDxmb250IGNvbG9yPSIjMzM2NkZGIj5Ub2tlbk5hbWVFUlJPUjwvZm9udD48L2xpPgorIDwvdWw+CisgPC9saT4KKyA8bGk+VGhlIGxhc3Qgc3RlcCBpcyB0byB1cGRhdGUgdGhlIHJlc291cmNlIGZpbGVzOjxicj4KKyBDb3B5IHRoZSBqZHRjb3JlLmphciBmaWxlIGluIGQ6XHRlbXAuIENvbXBpbGUgdGhpcyA8QSBIUkVGPSJVcGRhdGVQYXJzZXJGaWxlcy5qYXZhIj5zb3VyY2U8L0E+IGluc2lkZSBkOlx0ZW1wLiBZb3Ugd2lsbCBoYXZlIGEgZmlsZSBVcGRhdGVQYXJzZXJGaWxlcy5jbGFzcy4KKyBUaGVuIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQtbGluZToKKyAgPFBSRT4KKyBEOlx0ZW1wPmphdmEgLWNsYXNzcGF0aCBqZHRjb3JlLmphcjsuIFVwZGF0ZVBhcnNlckZpbGVzIGphdmFkY2wuamF2YQorIDwvUFJFPgorT25jZSB0aGlzIGRvbmUsIHlvdSB3aWxsIGVuZCB1cCB3aXRoIDUgbmV3IGZpbGVzIGluc2lkZSBkOlx0ZW1wLiBUaGV5IGFyZSBjYWxsZWQgcGFyc2VyJmx0O24mZ3Q7LnJzYywgd2l0aCBuIGVxdWFscyB0byAxLi41LgorQWxsIHRoZXNlIGZpbGVzIG5lZWQgdG8gYmUgbW92ZWQgdG8gdGhlIG9yZ1xlY2xpcHNlXGpkdFxpbnRlcm5hbFxjb21waWxlclxwYXJzZXIgZm9sZGVyLiBOb3cgeW91IGFyZSByZWFkeSB0byBleGVjdXRlIGFuZCB0ZXN0Cit0aGUgbmV3IHBhcnNlci4KKyA8L2xpPgorIDwvb2w+CisgPC9saT4KKyA8L29sPgorIDxQPgorIDxiPk5PVEU6PC9iPiAgPGJsb2NrcXVvdGU+Q2hhbmdpbmcgdGhlIHBhcnNlciBpcyBhIHJpc2t5IG9wZXJhdGlvbiBpZiB5b3UgbWlzcyBvbmUgb2YgdGhlIHN0ZXBzIGFib3ZlLiBUaGUgcmVzdWx0aW5nIHBhcnNlciBjYW4gYmUgY29tcGxldGVseQorIHVucHJlZGljdGFibGUuIEl0IGNhbiBnbyBmcm9tIGNyYXNoaW5nIHRvIHJlcG9ydGluZyBpbnZhbGlkIGVycm9ycy4gQmUgc3VyZSB0aGF0IHlvdSBmb2xsb3dlZCBhbGwgdGhlIHN0ZXBzIGFuZCB0aGF0IGFsbCB0aGUKKyBmaWxlcyBhcmUgdXBkYXRlZCBhbmQgcmVjb21waWxlZCBiZWZvcmUgeW91IHJ1biBpdC4gPC9ibG9ja3F1b3RlPgorIDwvUD4KKyA8L2Jsb2NrcXVvdGU+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9wYXRjaCBqZHRjb3JlL3BhdGNoSmR0Y29yZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vcGF0Y2ggamR0Y29yZS9wYXRjaEpkdGNvcmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQyOTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vcGF0Y2ggamR0Y29yZS9wYXRjaEpkdGNvcmUuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+CisJPGhlYWQ+CisJCTx0aXRsZT5Ib3cgdG86IFBhdGNoIEpkdC9Db3JlPC90aXRsZT4KKwkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorCTwvaGVhZD4KKwk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KKwk8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CisKKzx0cj4gCisgIDx0ZCBhbGlnbj1MRUZUIHZhbGlnbj1UT1AgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiAKKyAgIEpEVCBDb3JlIC8gSG93VG86IFBhdGNoIEpkdC9Db3JlPC9mb250PjwvYj48L3RkPgorPC90cj4KKyAgCis8dHI+CisJPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KKwk8dGQgV0lEVEg9Ijk4JSI+PGI+VG9waWMxPC9iPjxicj4KKwlUaGlzIGlzIHRoZSBmaXJzdCB0b3BpYworCTx1bD4KKwkJQmxhYmxhMQorCTwvdWw+CisJPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9zZXQgY2xhc3NwYXRoL3NldENsYXNzcGF0aC5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vc2V0IGNsYXNzcGF0aC9zZXRDbGFzc3BhdGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBlYzdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vc2V0IGNsYXNzcGF0aC9zZXRDbGFzc3BhdGguaHRtbApAQCAtMCwwICsxLDI4IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+CisJPGhlYWQ+CisJCTx0aXRsZT5Ib3cgdG86IFNldCB0aGUgQ2xhc3NwYXRoPC90aXRsZT4KKwkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorCTwvaGVhZD4KKwk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KKwk8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+CisKKzx0cj4gCisgIDx0ZCBhbGlnbj1MRUZUIHZhbGlnbj1UT1AgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiAKKyAgIEpEVCBDb3JlIC8gSG93VG86IFNldCB0aGUgQ2xhc3NwYXRoIDwvZm9udD48L2I+PC90ZD4KKzwvdHI+CisgIAorPHRyPgorCTx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+CisJPHRkIFdJRFRIPSI5OCUiPjxiPlRvcGljMTwvYj48YnI+CisJVGhpcyBpcyB0aGUgZmlyc3QgdG9waWMKKwk8dWw+CisJCUJsYWJsYTEKKwk8L3VsPgorCTwvdGQ+Cis8L3RyPgorCis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9jbGFzc3BhdGggY29udGFpbmVyL2NsYXNzcGF0aENvbnRhaW5lci5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9jbGFzc3BhdGggY29udGFpbmVyL2NsYXNzcGF0aENvbnRhaW5lci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjAzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2NsYXNzcGF0aCBjb250YWluZXIvY2xhc3NwYXRoQ29udGFpbmVyLmh0bWwKQEAgLTAsMCArMSwzMDggQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIj4KKyAgIDxtZXRhIG5hbWU9IlByb2dJZCIgY29udGVudD0iRnJvbnRQYWdlLkVkaXRvci5Eb2N1bWVudCI+CisgICA8dGl0bGU+Q2xhc3MgUGF0aCBDb250YWluZXIgRW5oYW5jZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMT5DbGFzcyBQYXRoIENvbnRhaW5lciBFbmhhbmNlbWVudDwvaDE+Cis8c3BhbiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij5MYXN0IE1vZGlmaWVkIEFwcmlsIDIzLCAyMDAyPC9zcGFuPgorCisKKzxoMj4KK0JhY2tncm91bmQ8L2gyPgorSkRUIHN1cHBvcnRzIHRvIHN3aXRjaCB0aGUgSkRLIHRoYXQgaXMgdXNlZCBmb3IgYnVpbGRpbmcuIEl0IGlzIGN1cnJlbnRseQoraW1wbGVtZW50ZWQgYXMgZm9sbG93czoKKzx1bD4KKzxsaT4KK29yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgSkRLL1ZNIGluZm9ybWF0aW9uIGluCitpdHMgcGx1Z2luIG1ldGFkYXRhOjwvbGk+CisKKzx1bD4KKzxsaT4KK2Egc2V0IG9mIDxpPlZNIGluc3RhbGwgdHlwZXM8L2k+OiBhIGRlc2NyaXB0aW9uIG9mIGEgVk0gaW5zdGFsbC4gSXQga25vd3MKK2hvdyB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmluYXJ5IEpBUiBhbmQgdGhlIHNvdXJjZSBKQVJzLjwvbGk+CisKKzxsaT4KKzxpPlZNIGluc3RhbGxzOiA8L2k+dGhlIGxvY2F0aW9uL2hvbWUgb2YgYSBWTSBpbnN0YWxsIG9uIHRoZSBmaWxlIHN5c3RlbS4KK0EgVk0gaW5zdGFsbCBoYXMgYW4gaW50ZXJuYWwgSUQgdGhhdCBpcyBub3QgdmlzaWJsZSB0byB0aGUgdXNlci48L2xpPgorCis8bGk+CitvbmUgb2YgdGhlIFZNIGluc3RhbGxzIGlzIG1hcmtlZCBhcyB0aGUgPGk+ZGVmYXVsdCBWTSBpbnN0YWxsPC9pPi48L2xpPgorPC91bD4KKworPGxpPgorb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyBkZWZpbmVzIGEgSlJFX0xJQiwgSlJFX1NSQywgSlJFX1NSQ1JPT1QgdmFyaWFibGVzCit0aGF0IGJpbmRzIHRvIHRoZSBkZWZhdWx0IFZNIGluc3RhbGw6PC9saT4KKworPHVsPgorPGxpPgorSlJFX0xJQjogdGhlIGJpbmFyeSBKQVIgKGUuZy4gcnQuamFyKTwvbGk+CisKKzxsaT4KK0pSRV9TUkM6IHRoZSBzb3VyY2UgSkFSL3ppcCAoZS5nLiBzcmMuamFyKTwvbGk+CisKKzxsaT4KK0pSRV9TUkNST09UOiB0aGUgcHJlZml4IGluIHRoZSBzb3VyY2UgSkFSIChlLmcuICJzcmMiKTwvbGk+Cis8L3VsPgorCis8bGk+CitUaGUgSmF2YSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZCBhZGRzIGEgSlJFX0xJQiBjbGFzc3BhdGggdmFyaWFibGUgb24gYQorcHJvamVjdCdzIGJ1aWxkIGNsYXNzIHBhdGguPC9saT4KKworPGxpPgorb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpIGNvbnRyaWJ1dGVzIGEgcHJlZmVyZW5jZSBwYWdlIHRvIGRlZmluZSBuZXcgVk0KK2luc3RhbGxzIGFuZCB0byBzZXQgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbC4gV2hlbiB0aGUgZGVmYXVsdCBWTSBpbnN0YWxsCitjaGFuZ2VzLCB0aGVuIHRoZSBiaW5kaW5ncyBvZiB0aGUgSlJFXyogdmFyaWFibGVzIGFyZSBjaGFuZ2VkIGFjY29yZGluZ2x5LjwvbGk+CisKKzxsaT4KK29yZy5lY2xpcHNlLmpkdC51aSBjb250cmlidXRlcyBhIGNsYXNzIHBhdGggdmFyaWFibGUgcHJlZmVyZW5jZSBwYWdlLiBJdAorImtub3dzIiB0aGF0IHRoZSBKUkVfKiB2YXJpYWJsZXMgYXJlIHJlc2VydmVkIGFuZCBkb2Vzbid0IGFsbG93IHRoZSB1c2VyCit0byBlZGl0IHRoZW0uPC9saT4KKworPGxpPgorVGhlIHBhY2thZ2VzIHZpZXcgc2hvd3MgdGhlIHJlc29sdmVkIEpSRV9MSUIgY29udGVudHMgYXMgYSByZWZlcmVuY2VkIGxpYnJhcnkuPC9saT4KKzwvdWw+CitDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246Cis8dWw+Cis8bGk+CitDbGFzcyBwYXRoIHN0YWJpbGl0eTogY2hhbmdpbmcgdGhlIGRlZmF1bHQgSlJFL1ZNIGluc3RhbGwgZG9lc24ndCBhZmZlY3QKK3RoZSBidWlsZCBjbGFzcyBwYXRoIHNpbmNlIHRoZSBKUkVfTElCIHZhcmlhYmxlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzCitjaGFuZ2UuIEluIG90aGVyIHdvcmRzLCB3aGVuIGEgdXNlciBjaGFuZ2VzIHRoZSBKUkUgZm9yIGJ1aWxkaW5nIHRoZW4gdGhlCisuY2xhc3NwYXRoIGZpbGUgaXMgbm90IGFmZmVjdGVkLjwvbGk+CisKKzxsaT4KK0pESyBzd2l0Y2hpbmcgYXQgdGhlIHdvcmtzcGFjZSBsZXZlbCBmb3IgYWxsIHByb2plY3RzIGlzIHN0cmFpZ2h0Zm9yd2FyZAorYnkgdGhlIHVzZXIsIG9ubHkgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbCBuZWVkcyB0byBiZSBjaGFuZ2VkIGFuZCBhbGwgcHJvamVjdHMKK2luIHRoZSB3b3Jrc3BhY2Ugc3dpdGNoIHRvIHVzZSB0aGlzIFZNIGluc3RhbGwuPC9saT4KKworPGxpPgorU2luY2UgY2xhc3MgcGF0aCB2YXJpYWJsZXMgY2FuIG9ubHkgYmluZCB0byBhIHNpbmdsZSBKQVIsIHRoZSBKUkVfTElCIHZhcmlhYmxlCitjYW4gb25seSBiaW5kIHRvIGEgc2luZ2xlIEpBUiAoZm9yIHRoZSBzdGFuZGFyZCBTVU4gSlJFIHRoaXMgaXMgcnQuamFyKS48L2xpPgorCis8bGk+CitUaGVyZSBpcyBzb21lIG1hZ2ljIGludm9sdmVkIHdpdGggcmVnYXJkIHRvIHRoZSBoYW5kbGluZyBvZiBKUkVfKiB2YXJpYWJsZXMKK3RoYXQgaXMgbm90IG9idmlvdXMgdG8gdGhlIHVzZXI6PC9saT4KKworPHVsPgorPGxpPgorb24gdGhlIGJ1aWxkIGNsYXNzIHBhdGggdGhlIHVzZXIgc2VlcyBKUkVfTElCIGJ1dCB3aGVuIGRlZmluaW5nIGEgbGF1bmNoCitjb25maWd1cmF0aW9uIHRoZW4gdGhlIHVzZXIgc2VlcyBWTSBJbnN0YWxscy4gVGhlIHVzZXIgaGFzIHRvIGtub3cgdGhhdAorSlJFX0xJQiBpcyBpbmRpcmVjdGx5IGJvdW5kIHRvIHRoZSBWTSBpbnN0YWxsIHZpYSB0aGUgSlJFIGluc3RhbGxlZCBwcmVmZXJlbmNlCitzZXR0aW5ncy48L2xpPgorCis8bGk+CitUaGUgdXNlciBhbHNvIGhhcyB0byB1bmRlcnN0YW5kIHRoYXQgdGhlIHJlc2VydmVkIHZhcmlhYmxlcyBjYW5ub3QgYmUgZWRpdGVkCitsaWtlIHRoZSBvdGhlciBjbGFzcyBwYXRoIHZhcmlhYmxlcywgZXRjLjwvbGk+Cis8L3VsPgorCis8bGk+CitCdWlsZCBjbGFzcyBwYXRoIG9yZGVyaW5nIC0gdXNlcnMgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIG9mIHRoZSBidWlsZCBjbGFzcworcGF0aCBpbiBhIHNpbXBsZSB3YXkuIEZvciBleGFtcGxlLCB0byBkbyBKQ0wgZGV2ZWxvcG1lbnQsIHRvIGRvIHNvIHVzZXJzCitjYW4gcHV0IHRoZWlyIHNvdXJjZSBmb2xkZXJzIGluIGZyb250IG9mIHRoZSBKUkVfTElCIGNsYXNzIHBhdGggZW50cnkuPC9saT4KKworPGxpPgorSmF2YSBDb3JlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgSkRLIHN3aXRjaGluZyBzdXBwb3J0IGFuZCBpcyBpbmRlcGVuZGVudAorb2YgbGF1bmNoaW5nIGNvbmNlcm5zLjwvbGk+Cis8L3VsPgorCis8aDI+CitNb3RpdmF0aW9uIGZvciBlbmhhbmNpbmcgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb248L2gyPgorCis8aDM+CitOZXcgUmVxdWlyZW1lbnRzPC9oMz4KK1RoZXJlIGFyZSBuZXcgcmVxdWlyZW1lbnRzIHdpdGggcmVnYXJkIHRvIHRoZSBoYW5kbGluZyBvZiB0aGUgSlJFL0pESyBvbgordGhlIGJ1aWxkIGNsYXNzIHBhdGggdGhhdCBuZWVkIHRvIGJlIGFkZHJlc3NlZCBieSAyLjA6Cis8dWw+Cis8bGk+CitNdWx0aXBsZSBKQVJzIHBlciBKREs8L2xpPgorCis8YnI+VGhlIEpSRV9MSUIgY2xhc3MgcGF0aCB2YXJpYWJsZSBjYW4gb25seSBiaW5kIHRvIGEgc2luZ2xlIEpBUiBmaWxlCit0eXBpY2FsbHkgdGhlIHJ0Lmphci4gSG93ZXZlciwgdGhlcmUgYXJlIEpESyBpbnN0YWxscyB0aGF0IGhhdmUgc3BsaXQgdGhlCitydC5qYXIgaW50byBtdWx0aXBsZSBKQVJzLiBGb3IgZXhhbXBsZSwgdGhlIEpESyBvbiB0aGUgTWFjT1MgWCBoYXMgc3BsaXQKK3RoZSBydC5qYXIgaW50bzogY2xhc3Nlcy5qYXIgYW5kIHVpLmphciAoY29udGFpbnMgQVdUIGFuZCBTd2luZykuCis8YnI+Jm5ic3A7Cis8bGk+CitXb3Jrc3BhY2VzIHdpdGggYSBkaWZmZXJlbnQgSkRLIHBlciBwcm9qZWN0PC9saT4KKworPGJyPldTREQgbmVlZHMgc3VwcG9ydCBmb3IgaGF2aW5nIGEgd29ya3NwYWNlIHdoZXJlIGRpZmZlcmVudCBwcm9qZWN0cworYnVpbGQgYWdhaW5zdCBkaWZmZXJlbnQgSkRLcy4gVGhlIEpSRV9MSUIgdmFyaWFibGUgaXMgZ2xvYmFsIGFuZCB0aGVyZQoraXMgbm8gaW5mcmFzdHJ1Y3R1cmUgYW5kIFVJIHN1cHBvcnQgdG8gaGF2ZSBkaWZmZXJlbnQgSkRLcyBmb3IgZGlmZmVyZW50Citwcm9qZWN0cy4gV1NERCBkZWZpbmVkIHRoZWlyIG93biBidWlsZCBkZXNjcmlwdGlvbiBtZWNoYW5pc20gdGhhdCBieXBhc3NlcwordGhlIEpSRV9MSUIgc3VwcG9ydC4gVGhpcyByZXN1bHRzIGluIGEgcHJvYmxlbWF0aWMgdXNlciBleHBlcmllbmNlIHdoZW4mbmJzcDsKK3N3aXRjaGluZyBmcm9tIFdTQUQgb3IgdmFuaWxsYSBFY2xpcHNlIEphdmEgZGV2ZWxvcG1lbnQgdG8gV1NERC48L3VsPgorCis8aDM+CitFeGlzdGluZyBjaGFyYWN0ZXJpc3RpY3MgdG8gYmUgcHJlc2VydmVkIGluIHRoZSBuZXcgaW1wbGVtZW50YXRpb248L2gzPgorCis8dWw+Cis8bGk+CitDbGFzcyBwYXRoIHN0YWJpbGl0eSwgaXQgaGFzIHRvIGJlIHBvc3NpYmxlIHRvIHN3aXRjaCBhIEpESyBsb2NhbGx5IGluCithIHdvcmtzcGFjZSB3aXRob3V0IGFmZmVjdGluZyB0aGUgLmNsYXNzcGF0aCBmaWxlLjwvbGk+CisKKzxsaT4KK0Vhc3kgSkRLIHN3aXRjaGluZyBhdCB0aGUgd29ya3NwYWNlIGxldmVsLCBpLmUuLCBhIHNpbmdsZSBzZXR0aW5nIGNhbiBiZQorY2hhbmdlZCB0byBjaGFuZ2UgdGhlIGJ1aWxkIGNsYXNzIHBhdGggb2YgYWxsIHByb2plY3RzLjwvbGk+CisKKzxsaT4KK0phdmEgQ29yZSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgVk0gaW5zdGFsbCBpbmZyYXN0cnVjdHVyZTwvbGk+Cis8L3VsPgorCis8aDI+CitQcm9wb3NhbDwvaDI+CitUaGUgcHJvcG9zYWwgYWZmZWN0cyBjb3JlLCBsYXVuY2hpbmcsIGphdmEgZGVidWcgVUksIGFuZCB0aGUgSmF2YSBVSSBjb21wb25lbnRzLgorPGgzPgorSmF2YUNvcmU8L2gzPgorSmF2YUNvcmUgcHJvdmlkZXMgYSBuZXcgdHlwZSBvZiBjbGFzc3BhdGggZW50cnkgIkNQRV9DT05UQUlORVIiLAord2hpY2ggaXMganVzdCBhIG5hbWVkIHJlZmVyZW5jZSB0byBhIHNldCBvZiBvdGhlciBjbGFzc3BhdGggZW50cmllcy4gCitBIGNvbnRhaW5lciBlbnRyeSByZWZlcnMgdG8gYSBjb250YWluZXIgcGF0aCwgd2hpY2ggY2FuIGJlIHJlc29sdmVkIGJ5CithIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPiB0aHJvdWdoIGFuIGV4dGVuc2lvbiBwb2ludCwKK29yIGV4cGxpY2l0bHkgYXNzaWduZWQgdXNpbmcgYSBzZXR0ZXIgbWV0aG9kLiAKKworVGhlIGFjdHVhbCBiaW5kaW5nIGZyb20gdGhlIENQRV9Db250YWluZXIgZW50cnkgdG8KK3RoZSB0YXJnZXQgY2xhc3NwYXRoIGVudHJpZXMgaXMgaW1wbGVtZW50ZWQgaW4gdGVybSBvZiBhbiBleHRlbnNpb24gcG9pbnQKK3RvIGtlZXAgSmF2YSBDb3JlIGluZGVwZW5kZW50IG9mIFZNIGluc3RhbGwgY29uY2VybnM6Cis8cD48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgorRU1QVFk+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQ0RBVEEgI1JFUVVJUkVEPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzJm5ic3A7Jm5ic3A7CitDREFUQSAjUkVRVUlSRUQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsgPjwvdHQ+Cis8dWw+Cis8bGk+PGI+aWQ8L2I+IC0gdGhlIGNvbnRhaW5lciB1bmlxdWUgbmFtZSBmb3Igd2hpY2ggdGhpcyByZXNvbHZlciB3aWxsIGJlIGFjdGl2YXRlZC48L2xpPgorPGxpPjxiPmNsYXNzPC9iPiAtIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBjb250YWluZXIgaW5pdGlhbGl6ZXIuCitUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+Cit3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuPC9saT4KKzwvdWw+Cis8dHQ+Jm5ic3A7Jm5ic3A7IGFic3RyYWN0IGNsYXNzIENsYXNzcGF0aENvbnRhaW5lclJlc29sdmVyCit7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOzwvdHQ+Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KKzxwPlRoZSBpbml0aWFsaXplIGNhbGwgcGFzc2VzIGluIGEgcHJvamVjdCwgdGhpcyBlbmFibGVzCit0byByZXNvbHZlIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgcHJvamVjdC4KK1RoZSBpbml0aWFsaXplIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSB0byByZXNvbHZlIHRoZSBjbGFzcyBwYXRoCitlbnRyeSAoaW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgY29udGFpbmVyIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYXMgaGF2aW5nIGJlZW4KK3Jlc29sdmVkKS4KKworPHA+SXQgaXMgcG9zc2libGUgdG8gcmVnaXN0ZXIgYW4gaW5pdGlhbGl6ZXIgcGVyIGNvbnRhaW5lciBJRC4gVGhlIGZ1bGwgY29udGFpbmVyIHBhdGggCitiZWluZyBwYXNzZWQgYWxvbmcgdG8gdGhlIGluaXRpYWxpemVyLiBJdHMgZmlyc3Qgc2VnbWVudCBpcwordGhlIGNvbnRhaW5lciBJRCBmb3Igd2hpY2ggYW4gaW5pdGlhbGl6ZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuIFRoZSByZW1haW5pbmcgc2VnbWVudHMKK2NhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBoaW50cyBmb3IgdGhlIGNvbnRhaW5lciBleHBhbnNpb24uCitJbiBjYXNlIG11bHRpcGxlIHJlc29sdmVycyBhcmUgcmVnaXN0ZXJlZCBvbiB0aGUgc2FtZSBjb250YWluZXIgSUQsIHRoZSBmaXJzdAorcmVnaXN0ZXJlZCBvbmUgd2lsbCBiZSB1c2VkKS4KKworPHA+SmF2YUNvcmUgcHJvdmlkZXMgYSBtZXRob2QgdG8gcGVyZm9ybSBleHBsaWNpdCBtb2RpZmljYXRpb25zIG9mIGEgY29udGFpbmVyOgorPHByZT4KK0phdmFDb3JlI3NldENsYXNzcGF0aENvbnRhaW5lcigKKwlJUGF0aCBjb250YWluZXJQYXRoLCAKKwlJSmF2YVByb2plY3RbXSBhZmZlY3RlZFByb2plY3RzLCAKKwlJQ2xhc3NwYXRoQ29udGFpbmVyW10gcmVzcGVjdGl2ZUNvbnRhaW5lcnMsIAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKzwvcHJlPgorSW4gcGFydGljdWxhciwgdGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBpbiAgdGhlIGNvbnRleHQgb2YgYSBjbGFzc3BhdGggaW5pdGlhbGl6ZXIgc28gYXMgdG8gcGVyZm9ybQordGhlIGFjdHVhbCBpbml0aWFsaXphdGlvbi4gTm90ZSB0aGF0IGl0IGFsbG93cyB0byBtb2RpZnkgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyIGZvciBhIHNldCBvZiBwcm9qZWN0cworYXQgb25jZS4gSW4gcmVhY3Rpb24gdG8gaW52b2tpbmcgdGhpcyBtZXRob2QsIHRoZSBKYXZhTW9kZWwgd2lsbCBiZSByZWZyZXNoZWQgYW5kIGNvcnJlc3BvbmRpbmcgSmF2YSBlbGVtZW50CitjaGFuZ2VzIHdpbGwgYmUgbm90aWZpZWQuCisKKzxwPiBBIGNsYXNzcGF0aCBjb250YWluZXIgaW1wbGVtZW50cyA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiBhbmQgY2FuIGJlIHF1ZXJpZWQKK3Rocm91Z2ggYSBKYXZhQ29yZSBBUEk6IDxjb2RlPkphdmFDb3JlI2dldENsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgPC9jb2RlPi4KKworVGhlcmUgaXMgbm8gYXNzdW1wdGlvbiB0aGF0IHRoZSByZXR1cm5lZCBjb250YWluZXIgbXVzdCBhbnN3ZXIgdGhlIGV4YWN0IHNhbWUgY29udGFpbmVyUGF0aAord2hlbiByZXF1ZXN0ZWQgPGNvZGU+SUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoPC9jb2RlPi4gCitJbmRlZWQsIHRoZSBjb250YWluZXJQYXRoIGlzIGp1c3QgYW4gaW5kaWNhdGlvbiBmb3IgcmVzb2x2aW5nIGl0IHRvIGFuIGFjdHVhbCBjb250YWluZXIgb2JqZWN0LgorPHA+CitDbGFzc3BhdGggY29udGFpbmVyIHZhbHVlcyBhcmUgcGVyc2lzdGVkIGxvY2FsbHkgdG8gdGhlIHdvcmtzcGFjZSwgYnV0IAorYXJlIG5vdCBwcmVzZXJ2ZWQgZnJvbSBhIHNlc3Npb24gdG8gYW5vdGhlci4gSXQgaXMgdGh1cyBoaWdobHkgcmVjb21tZW5kZWQgdG8gcmVnaXN0ZXIgYSAKKzxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPiBmb3IgZWFjaCByZWZlcmVuY2VkIGNvbnRhaW5lciAKKyh0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIikuCisJIAorPHByZT4KK3B1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aENvbnRhaW5lciB7CisJCisJLyoqCisJICogS2luZCBmb3IgYSBjb250YWluZXIgbWFwcGluZyB0byBhbiBhcHBsaWNhdGlvbiBsaWJyYXJ5CisJICovCisJaW50IEtfQVBQTElDQVRJT04gPSAxOworCisJLyoqCisJICogS2luZCBmb3IgYSBjb250YWluZXIgbWFwcGluZyB0byBhIHN5c3RlbSBsaWJyYXJ5CisJICovCisJaW50IEtfU1lTVEVNID0gMjsKKworCS8qKgorCSAqIEtpbmQgZm9yIGEgY29udGFpbmVyIG1hcHBpbmcgdG8gYSBkZWZhdWx0IHN5c3RlbSBsaWJyYXJ5LCBpbXBsaWNpdGx5IGNvbnRyaWJ1dGVkIGJ5IHRoZSBydW50aW1lCisJICovCisJaW50IEtfREVGQVVMVF9TWVNURU0gPSAzOworCQorCS8qKgorCSAqIEFuc3dlcnMgdGhlIHNldCBvZiBjbGFzc3BhdGggZW50cmllcyB0aGlzIGNvbnRhaW5lciBpcyBtYXBwaW5nIHRvLgorCSAqIFRoZSBzZXQgb2YgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYSBjbGFzc3BhdGggY29udGFpbmVyIG1heSBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCSAqIC0gbGlicmFyeSBlbnRyaWVzICg8Y29kZT5DUEVfTElCUkFSWTwvY29kZT4pIAorCSAqIC0gcHJvamVjdCBlbnRyaWVzICg8Y29kZT5DUEVfUFJPSkVDVDwvY29kZT4pIAorCSAqIEEgY2xhc3NwYXRoIGNvbnRhaW5lciBjYW4gbmVpdGhlciByZWZlcmVuY2UgZnVydGhlciBjbGFzc3BhdGggY29udGFpbmVycyBvciBjbGFzc3BhdGggdmFyaWFibGVzLgorCSAqLwkKKyAgICBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisKKwkvKioKKwkgKiBBbnN3ZXJzIGEgcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBjb250YWluZXIKKwkgKi8JCisgICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBraW5kIG9mIHRoaXMgY29udGFpbmVyLiBDYW4gYmUgZWl0aGVyOgorCSAqIC0gS19BUFBMSUNBVElPTiAgaWYgdGhpcyBjb250YWluZXIgbWFwcyB0byBhbiBhcHBsaWNhdGlvbiBsaWJyYXJ5CisJICogLSBLX1NZU1RFTSAgaWYgdGhpcyBjb250YWluZXIgbWFwcyB0byBhIHN5c3RlbSBsaWJyYXJ5CisJICogVHlwaWNhbGx5LCBzeXN0ZW0gY29udGFpbmVycyBzaG91bGQgYmUgcGxhY2VkIGZpcnN0IG9uIGEgYnVpbGQgcGF0aC4KKwkgKi8JCisgICAgaW50IGdldEtpbmQoKTsKKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGNvbnRhaW5lciBwYXRoIGlkZW50aWZ5aW5nIHRoaXMgY29udGFpbmVyLgorCSAqIEEgY29udGFpbmVyIHBhdGggaXMgZm9ybWVkIGJ5IGEgZmlyc3QgSUQgc2VnbWVudCBmb2xsb3dlZCB3aXRoIGV4dHJhIHNlZ21lbnRzLgorCSAqIHdoaWNoIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgaGludCBmb3IgcmVzb2x2aW5nLgorCSAqIFRoaXMgY29udGFpbmVyIElEIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgaGludHMgZm9yIHJlc29sdmluZyB0byB0aGlzIGNvbnRhaW5lci4KKwkgKiBUaGUgY29udGFpbmVyIElEIGlzIGFsc28gdXNlZCB0byBpZGVudGlmeSBhIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIAorCSAqIHJlZ2lzdGVyZWQgb24gdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLCB3aGljaCBjYW4KKwkgKiBiZSBpbnZva2VkIGlmIG5lZWRpbmcgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGJlZm9yZSBpdCBpcyBleHBsaWNpdGVseSBzZXQuCisJICovCQorICAgIElQYXRoIGdldFBhdGgoKTsKK30KKzwvcHJlPgorCis8cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+SXNzdWU8L2I+OiBUaGUgTWFjIE9TIFggSkRLIGluc3RhbGwgaXMKK2FuIGludGVyZXN0aW5nIGNhc2UuIFRoZXJlIHRoZSBydC5qYXIgaXMgc3BsaXQgaW50byB0d28gYmluYXJ5IEpBUnMgKGNsYXNzZXMuamFyLAordWkuamFyKSwgYnV0IHRoZXJlIGlzIHN0aWxsIGEgc2luZ2xlIHNyYy5qYXIuIFRoaXMgY2FzZXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPnRoZQorc291cmNlIGxvb2t1cC4gRm9yIGV4YW1wbGUsIHdoZW4gc3JjLmphciBpcyBhdHRhY2hlZCB0byBjbGFzc2VzLmphciB0aGVuIHdoZW4KK2xvb2tpbmcgdXAgamF2YS5hd3QuRnJhbWUgb3V0IG9mIHVpLmphciwgdGhlIHNvdXJjZSBhdHRhY2htZW50IG9mIGNsYXNzZXMuamFyCituZWVkcyB0byBzZWFyY2hlZCBhcyB3ZWxsLjwvZm9udD4KKworPGgyPgorRXhhbXBsZTwvaDI+CitUaGUgY2xhc3MgcGF0aCBvZiBhIHByb2plY3Qgd2lsbCBsb29rIGFzIGZvbGxvd3M6Cis8cD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtjbGFzc3BhdGgmZ3Q7Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0mcXVvdDtzcmMmcXVvdDsgcGF0aD0mcXVvdDsvc3JjJnF1b3Q7LyZndDsKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJjb250YWluZXIiIHBhdGg9IkpESy8xLjMiLz4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworJmx0Oy9jbGFzc3BhdGgmZ3Q7Cis8cD5JbiB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBkaWRuJ3Qgb3ZlcnJpZGUgdGhlCitWTSBpbnN0YWxsIGF0IHRoZSBwcm9qZWN0IGxldmVsLiBUaGVuIHRoZSBKYXZhIGxhdW5jaGluZyBjb250cmlidXRlZCBjb250YWluZXIKK3Jlc29sdmVyIChyZWdpc3RlcmVkIGZvciBjb250YWluZXIgcHJlZml4ZXM6ICJKREsiKSB3b3VsZCByZXNvbHZlICJKREsvMS4zIiB1c2luZyB0aGUgZGVmYXVsdAorVk0gaW5zdGFsbCwgdXNpbmcgIjEuMyIgYXMgYW4gaGludCwgYW5kIG1heSBleHBhbmQgaXQgaW50byB0aGUgZm9sbG93aW5nOgorPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSZxdW90O2Q6L2pkay8xLjMuMS9qcmUvbGliL3J0LmphciZxdW90Oworcm9vdHBhdGg9JnF1b3Q7ZDovamRrMS4zLjEvbGliL3NyYy5qYXImcXVvdDsgc291cmNlcGF0aD0mcXVvdDsvc3JjJnF1b3Q7LyZndDsKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L0FTVFBvc2l0aW9ucy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L0FTVFBvc2l0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDQxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvQVNUUG9zaXRpb25zLmh0bWwKQEAgLTAsMCArMSwxNDggQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Cis8L2hlYWQ+Cis8Ym9keT4KK0hpLAorPHA+SGVyZSBhcmUgbXkgdGhvdWdodHMgcmVnYXJkaW5nIHBvc2l0aW9ucyBhbmQgQVNULiBUaGUgbWFqb3IgZ29hbCB3YXMKK3RvIGNvbWUgdXAgd2l0aCBhIGNvbnNpc3RlbnQgdmlldywgZXZlbiB0aG91Z2ggdGhpcyBjYXVzZXMgc29tZSBtb3JlIHdvcmsKK2ZvciByZWZhY3RvcmluZyBhbmQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IEFTVC4gQnV0IEkgdGhpbmsKK2l0IG1pZ2h0IGJlIHdvcnRoIGlmIHdlIGNhbiBjb21lIHVwIHdpdGggYSBjb25zaXN0ZW50IHN0b3J5IGZvciBwb3NpdGlvbnMuCis8aDM+CitTb21lIGdlbmVyYWwgc3RhdGVtZW50czwvaDM+CisKKzxvbD4KKzxsaT4KK3NvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQgc2hvdWxkIGFsd2F5cyBjb3ZlciB0aGUgd2hvbGUgbm9kZS4gVGhpcyBpcyBkaWZmZXJlbnQKK3RvIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdoZXJlIGZvciBzb21lIG5vZGVzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQKK2FuZCBkZWNsYXJhcmlvblNvdXJjRW5kIGNvdmVycyB0aGUgd2hvbGUgbm9kZSBhbmQgc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZAorb25seSBjb3ZlcnMgdGhlIG5hbWUgKGV4YW1wbGVzIGFyZTogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXJpb24sCisuLi4pPC9saT4KKworPGxpPgorc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBzaG91bGQgYWxzbyBjb3ZlciBhbGwgc3Vibm9kZXM8L2xpPgorCis8bGk+Cit3aGVuZXZlciBwb3NzaWJsZSB3ZSBzaG91bGQgZm9sbG93IHRoZSBncmFtbWFyIGFzIGRlZmluZWQgaW4gVGhlIEphdmEgTGFuZ3VhZ2UKK1NwZWNpZmljYXRpb24gYm9vay4gU28gaWYgdGhlIGdyYW1tYXIgc2F5cyB0aGF0IGEgcHJvZHVjdGlvbiBpbmNsdWRlcyB0aGUKK3NlbWljb2xvbiB0aGVuIHRoZSBBU1Qgbm9kZSBzaG91bGQgaW5jbHVkZSBpdCB0b28uIEZvciBleGFtcGxlIHRoZSBncmFtbWFyCitkZWZpbmVzIGEgcmV0dXJuIHN0YXRlbWVudCBsaWtlPC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gKGV4cHJlc3Npb24pIDsKKzxicj5TbyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBzaG91bGQgaW5jbHVkZSB0aGUgOzwvb2w+CisKKzxoMz4KK1NvbWUgc3RhdGVtZW50cyBmcm9tIGVhcmxpZXIgZGlzY3Vzc2lvbnMgKG1haW5seSBiZXR3ZWVuIEppbSwgUGhpbGlwcGUsCithbmQgbWUpPC9oMz4KKworPHVsPgorPGxpPgorVGhlcmUgd2lsbCBiZSBhbiBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUgZm9yIGV4cHJlc3Npb25zIHVzZWQgYXMgc3RhdGVtZW50cy4KK0ZvciBleGFtcGxlICJpZiAoaXNDaGVja2VkKCkpIHt9IiB2ZXJzdXMgImlzQ2hlY2soKTsiLiBXZSBhZ3JlZWQgdGhhdCB0aGUKK2V4cHJlc3Npb24gd2lsbCBub3QgaW5jbHVkZSB0aGUgc2VtaWNvbG9uIGFuZCB0aGUgRXhwcmVzc2lvblN0YXRlbWVudCB3aWxsLgorRm9yIHRoZSBpc0NoZWNrKCkgZXhhbXBsZSB0aGlzIHdpbGwgbG9vayBsaWtlIFtbaXNDaGVja2VkKCldO10uIFRoaXMgaXMKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZ3JhbW1lciBkZWZpbmVkIGluICgzKS4gVGhpcyB0b2dldGhlciB3aXRoIHRoZSBnZW5lcmFsCitzdGF0ZW1lbnQgKDIpIGxlYWRzIHRvIHRoZSBjb25jbHVzaW9uIHRoYXQgc3RhdGVtZW50cyB0aGF0IGhhdmUgY2hpbGQgc3RhdGVtZW50cword2lsbCBpbmNsdWRlIHRoZSBzZW1pY29sb24gaWYgdGhlIGNoaWxkIHN0YXRlbWVudCBoYXMgb25lLiBGb3IgdGhlIGV4YW1wbGU8L2xpPgorCis8cD48YnI+Zm9yIChpbnQgaT0gMDsgaSAmbHQ7IDEwOyBpKyspCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvbygpOworPHA+c291cmNlRW5kIG9mIHRoZSBmb3Igc3RhdGVtZW50IHdpbGwgaW5jbHVkZSB0aGUgc2VtaWNvbG9uIG9mIHRoZSBleHByZXNzaW9uCitzdGF0ZW1lbnQuPC91bD4KKworPGgzPgorT3BlbiBpc3N1ZXM8L2gzPgorCis8aDQ+CitNdWx0aXBsZSBsb2NhbCBkZWNsYXJhdGlvbnM8L2g0PgorQ3VycmVudGx5IG11bHRpcGxlIGxvY2FsIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIEFTVCBhcyBuIHNlcGFyYXRlIGxvY2FsCitkZWNsYXJhdGlvbnMgd2l0aG91dCBhbnkgcmVsYXRpb25zaGlwIHRvIGVhY2ggb3RoZXJzLiBUaGlzIHJhaXNlcyB2YXJpb3VzCitxdWVzdGlvbnM6Cis8dWw+Cis8bGk+Cit3aGF0IGFyZSB0aGUgcG9zaXRpb25zIG9mIHRob3NlIGxvY2FsIGRlY2xhcmF0aW9uczwvbGk+CisKKzxsaT4KK2hvdyBpcyBhIHZpc2l0b3Igb2YgdGhhdCBBU1QgYWJsZSB0byBmaWd1cmUgb3V0IHRoYXQgaGUgZGVhbHMgd2l0aCBtdWx0aXBsZQorbG9jYWwgZGVjbGFyYXRpb24uPC9saT4KKzwvdWw+CitTaW5jZSB0aGUgbmV3IEFTVCBpc24ndCBhIDE6MSBtYXBwaW5nIG9mIHRoZSBjb21waWxlcidzIEFTVCBhbnl3YXkgKHdlCitoYXZlIHRoZSBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIEkgb3B0IHRvIGludHJvZHVjZSBuZXcgbm9kZXMgYXMgZGVmaW5lZAoraW4gdGhlIGdyYW1tYXIuIFNpbmNlIHRoZSBzZW1pY29sb24gZG9lc24ndCBiZWxvbmcgdG8gdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLAoraXQgc2hvdWxkIGJlIG1hbmFnZWQgYnkgdGhlIHBhcmVudCBub2RlIHRoYXQgdGllcyB0b2dldGhlciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuCitIZXJlIGlzIGFuIGV4YW1wbGU6Cis8cD5pbnQgeD0gMTAsIHhbXT0gbnVsbCwgaTsKKzxwPkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlIG1hbmFnZXM6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSB0eXBlIChlLmcuIGludCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY29tbWFzIChpZiBuZWVkZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSBhY3R1YWwgdmFyaWFibGUgZGVjbGFyYXRvcnMKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlU3RhcnQ9IHN0YXJ0IG9mIHRoZSB0eXBlCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZUVuZD0gOworPHA+VmFyaWFibGVEZWNsYXJhdG9yIG5vZGUgbWFuYWdlczoKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIHZhcmlhYmxlIG5hbWUgYW5kIGl0cyBwb3NpdGlvbnMKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIGluaXRpYWxpemF0aW9uCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZVN0YXJ0PSBzdGFydCBvZiB2YXJpYWJsZSBuYW1lCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZUVuZD0gZW5kIG9mIGluaXRpYWxpemF0aW9uLiBEb2Vzbid0IGluY2x1ZGUKK3RoZSBjb21tYS4KKzxwPklmIHdlIHdhbnQgdG8gZG8gc29tZSBvcHRpbWl6YXRpb24gd2UgY291bGQgYWxzbyBoYXZlIGEgbm9kZSBTaW5nbGVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24KK2ZvciBkZWNsYXJhdGlvbiBsaWtlIGludCB4OyBvciBpbnQgeT0gMTA7IFRoZSBub2RlIHdvdWxkIGhhdmUgdGhlIGZvbGxvd2luZworZmllbGRzOgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgdHlwZQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgdmFyaWFibGUgbmFtZSBhbmQgaXRzIHBvc2l0aW9ucworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgaW5pdGlhbGl6YXRpb24KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlU3RhcnQ9IHN0YXJ0IG9mIHR5cGUKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlRW5kPSA7Cis8aDQ+CitVcGRhdGVzIGluIGZvciBzdGF0ZW1lbnRzPC9oND4KK0FuYWxvZ291cyB0byB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24sIHRoZSBjb21tYSB0byBzZXBhcmF0ZSB0aGUKK3VwZGF0ZSBleHByZXNzaW9ucyBjYW4gbm90IGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gKGV4cHJlc3Npb25zIGRvbid0Citjb250YWluIGEgc2VtaWNvbG9uIHNvIHRoZXkgY2FuJ3QgY29udGFpbiBhIGNvbW1hIGVpdGhlcikuIFRvIGtub3cgdGhlCitwb3NpdGlvbnMgb2YgdGhlIGNvbW1hcyB0aGUgZm9yIHN0YXRlbWVudCBzaG91bGQgbWFuYWdlIHRoZW0gaW4gYSBzZXBhcmF0ZQorYXJyYXkuCis8cD48aT5UaGUgZ2VuZXJhbCBydWxlIGlzLCB0aGF0IHdoZW5ldmVyIGxhbmd1YWdlIGVsZW1lbnRzIGFyZSBzZXBhcmF0ZQordXNpbmcgYSBjb21tYSAoZm9yIGV4YW1wbGUgYW4gaW50ZXJmYWNlIGxpc3QgaW4gdGhlIGltcGxlbWVudHMgc3RhdGVtZW50LAorYXJndW1lbnRzIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uLCAuLi4pIHRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIHNlcGFyYXRlZAorbm9kZXMgc2hvdWxkIG1hbmFnZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBjb21tYSwgaWYgdGhleSBhcmUgb2YgYW55IGludGVyZXN0LgorSW4gYSBmaXJzdCBpbXBsZW1lbnRhdGlvbiB3ZSBjb3VsZCBsZWF2ZSB0aGVzZSBwb3NpdGlvbnMgb3V0IGFuZCB1c2UgdGhlCitzY2FubmVyIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZSBvZiBpbnRlcmVzdC48L2k+Cis8aDQ+CitUcmVhdG1lbnQgb2Ygc2VtaWNvbG9uPC9oND4KK0Zyb20gb3VyIGV4cGVyaWVuY2VzIHdpdGggcmVmYWN0b3JpbmcgaXQgaXMgaGVscGZ1bCBpbiBzb21lIGNhc2VzIHRvIGtub3cKK3doZXJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VtaWNvbG9uIGlzLiBGb3IgZXhhbXBsZSBpZiB0aGUgdXNlciBleHRyYWN0CithIGZvciBzdGF0ZW1lbnQgYW5kIGhlIGRvZXNuJ3Qgc2VsZWN0IHRoZSBhY3Rpb24ncyBzZW1pY29sb24gd2UgYWxsb3cgdGhlCitleHRyYWN0aW9uLiBTbyB3aGF0IGNhbiB3ZSBkbyBpbiB0aGVzZSBjYXNlczoKKzx1bD4KKzxsaT4KK3NpbXBsZSBkb24ndCBhbGxvdyB0aGUgY2FzZS4gVG8gc3VwcG9ydCBiZXR0ZXIgc2VsZWN0aW9uIHdlIGNhbiBvZmZlciBzb21lCithY3Rpb25zIHRvIGV4dGVuZCB0aGUgdGV4dCBzZWxlY3Rpb24gdG8gc3Bhd24gdmFsaWQgQVNUIG5vZGVzLiBXZSBoYXZlCithIHJ1bm5pbmcgcHJvdG90eXBlIGZvciB0aGlzLjwvbGk+CisKKzxsaT4KK2RvIHNvbWUgcGFyc2luZyBvZiB0aGUgc291cmNlIGNvZGUgdG8gZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlbWljb2xvbi4KK1dlIGNvdWxkIHVzZSB0aGUgc2Nhbm5lciBmb3IgdGhpcy48L2xpPgorPC91bD4KKworPGg0PgorQW5zd2VycyB0byBleHBsaWNpdCBxdWVzdGlvbnMgZnJvbSBPbGl2aWVyPC9oND4KKworPHVsPgorPGxpPgorZm9yICg7Oyk7IDogaW4gdGhpcyBjYXNlIHRoZSBmb3Igc3RhdGVtZW50IHNob3VsZCBjb3ZlciB0aGUgc2VtaWNvbG9uLgorVGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBoYXZlIGFuIGVtcHR5IHN0YXRlbWVudCBhcyBkZWZpbmVkIGluCit0aGUgZ3JhbW1hci48L2xpPgorCis8bGk+CitkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgb2YgYW4gYXJndW1lbnQ6IHllcywgQWRhbSB1c2VzIGFyZ3VtZW50LnR5cGUuc291cmNlU3RhcnQKK2FzIHRoZSBzdGFydCBub3QgZGVjbGFyYXRpb25Tb3VyY2VTdGFydC48L2xpPgorCis8bGk+Cit0ZXN0OiB0aGUgdGVzdCB3ZSBoYXZlIGFyZSB0aGUgcmVmYWN0b3JpbmcgdGVzdC4gV2UgZG9uJ3QgaGF2ZSBzcGVjaWFsCit0ZXN0IHRvIGNoZWNrIGlmIHRoZSBBU1QgcG9zaXRpb25zIGFyZSBjb3JyZWN0LjwvbGk+Cis8L3VsPgorCis8YnI+Jm5ic3A7Cis8YnI+Jm5ic3A7Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvTm9kZVR5cGVOYW1lcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9Ob2RlVHlwZU5hbWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWQ5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvTm9kZVR5cGVOYW1lcwpAQCAtMCwwICsxLDYyIEBACismc3RhcnQ7QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiZlbmQ7DQorJnN0YXJ0O0FycmF5QWNjZXNzJmVuZDsNCismc3RhcnQ7QXJyYXlDcmVhdGlvbiZlbmQ7DQorJnN0YXJ0O0FycmF5SW5pdGlhbGl6ZXImZW5kOw0KKyZzdGFydDtBcnJheVR5cGUmZW5kOw0KKyZzdGFydDtBc3NlcnRTdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtBc3NpZ25tZW50JmVuZDsNCismc3RhcnQ7QmxvY2smZW5kOw0KKyZzdGFydDtCb29sZWFuTGl0ZXJhbCZlbmQ7DQorJnN0YXJ0O0JyZWFrU3RhdGVtZW50JmVuZDsNCismc3RhcnQ7Q2FzdEV4cHJlc3Npb24mZW5kOw0KKyZzdGFydDtDYXRjaENsYXVzZSZlbmQ7DQorJnN0YXJ0O0NoYXJhY3RlckxpdGVyYWwmZW5kOw0KKyZzdGFydDtDbGFzc0luc3RhbmNlQ3JlYXRpb24mZW5kOw0KKyZzdGFydDtDb21waWxhdGlvblVuaXQmZW5kOw0KKyZzdGFydDtDb25kaXRpb25hbEV4cHJlc3Npb24mZW5kOw0KKyZzdGFydDtDb25zdHJ1Y3Rvckludm9jYXRpb24mZW5kOw0KKyZzdGFydDtDb250aW51ZVN0YXRlbWVudCZlbmQ7DQorJnN0YXJ0O0RvU3RhdGVtZW50JmVuZDsNCismc3RhcnQ7RW1wdHlTdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtFeHByZXNzaW9uU3RhdGVtZW50JmVuZDsNCismc3RhcnQ7RmllbGRBY2Nlc3MmZW5kOw0KKyZzdGFydDtGaWVsZERlY2xhcmF0aW9uJmVuZDsNCismc3RhcnQ7Rm9yU3RhdGVtZW50JmVuZDsNCismc3RhcnQ7SWZTdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtJbXBvcnREZWNsYXJhdGlvbiZlbmQ7DQorJnN0YXJ0O0luZml4RXhwcmVzc2lvbiZlbmQ7DQorJnN0YXJ0O0luc3RhbmNlb2ZFeHByZXNzaW9uJmVuZDsNCismc3RhcnQ7SW5pdGlhbGl6ZXImZW5kOw0KKyZzdGFydDtKYXZhZG9jJmVuZDsNCismc3RhcnQ7TGFiZWxlZFN0YXRlbWVudCZlbmQ7DQorJnN0YXJ0O01ldGhvZERlY2xhcmF0aW9uJmVuZDsNCismc3RhcnQ7TWV0aG9kSW52b2NhdGlvbiZlbmQ7DQorJnN0YXJ0O051bGxMaXRlcmFsJmVuZDsNCismc3RhcnQ7TnVtYmVyTGl0ZXJhbCZlbmQ7DQorJnN0YXJ0O1BhY2thZ2VEZWNsYXJhdGlvbiZlbmQ7DQorJnN0YXJ0O1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJmVuZDsNCismc3RhcnQ7UG9zdGZpeEV4cHJlc3Npb24mZW5kOw0KKyZzdGFydDtQcmVmaXhFeHByZXNzaW9uJmVuZDsNCismc3RhcnQ7UHJpbWl0aXZlVHlwZSZlbmQ7DQorJnN0YXJ0O1F1YWxpZmllZE5hbWUmZW5kOw0KKyZzdGFydDtSZXR1cm5TdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtTaW1wbGVOYW1lJmVuZDsNCismc3RhcnQ7U2ltcGxlVHlwZSZlbmQ7DQorJnN0YXJ0O1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24mZW5kOw0KKyZzdGFydDtTdHJpbmdMaXRlcmFsJmVuZDsNCismc3RhcnQ7U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24mZW5kOw0KKyZzdGFydDtTdXBlckZpZWxkQWNjZXNzJmVuZDsNCismc3RhcnQ7U3VwZXJNZXRob2RJbnZvY2F0aW9uJmVuZDsNCismc3RhcnQ7U3dpdGNoQ2FzZSZlbmQ7DQorJnN0YXJ0O1N3aXRjaFN0YXRlbWVudCZlbmQ7DQorJnN0YXJ0O1N5bmNocm9uaXplZFN0YXRlbWVudCZlbmQ7DQorJnN0YXJ0O1RoaXNFeHByZXNzaW9uJmVuZDsNCismc3RhcnQ7VGhyb3dTdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtUcnlTdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtUeXBlRGVjbGFyYXRpb24mZW5kOw0KKyZzdGFydDtUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQmZW5kOw0KKyZzdGFydDtUeXBlTGl0ZXJhbCZlbmQ7DQorJnN0YXJ0O1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uJmVuZDsNCismc3RhcnQ7VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50JmVuZDsNCismc3RhcnQ7VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCZlbmQ7DQorJnN0YXJ0O1doaWxlU3RhdGVtZW50JmVuZDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvYXN0Lmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvYXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYjlhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9hc3QuaHRtbApAQCAtMCwwICsxLDIwOTEgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5KRFQgLSBBYnN0cmFjdCBTeW50YXggVHJlZXM8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMj4KK0Fic3RyYWN0IFN5bnRheCBUcmVlczwvaDI+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+TGFzdCByZXZpc2VkIDE0OjAwIEZyaWRheSBPY3RvYmVyIDI2LCAyMDAxIChtb3N0CityZWNlbnQgY2hhbmdlIGluIGJsdWUpPC9mb250PgorPHA+T3JpZ2luYWwgd29yayBpdGVtOiAiRXhwb3NpbmcgdGhlIEFTVCBBUEkuIgorPHA+UmVsYXRlZCB3b3JrIGl0ZW06ICJJbXByb3ZlZCBKYXZhIGNvZGUgbWFuaXB1bGF0aW9uIHN1cHBvcnQsIGFkZHJlc3MKK0pET00gbGltaXRhdGlvbnM7IEpET00gZG9lc24ndCBwcmVzZXJ2ZSBtYXJrZXJzIGFuZCBpc24ndCBkb2N1bWVudCBhd2FyZTsKK0pET00gZmluZXIgZ3JhaW5lZCB1cGRhdGUgc3VwcG9ydCAoZS5nLiBjaGFuZ2UgbWV0aG9kIG5hbWUsIHR5cGUgbmFtZSk7CitidWZmZXIgY29udGVudHMgaXMgZHVwbGljYXRlZCBpbiBKYXZhIFVJIGRvY3VtZW50IGFuZCBuZWVkcyB0byBiZSBtYW51YWxseQorc3luY2hyb25pemVkLiIKKzxoMz4KK0JhY2tncm91bmQ8L2gzPgorCis8dWw+Cis8bGk+cmVmYWN0b3JpbmcgaXMgYSBrZXkgY3VzdG9tZXIgKERpcmsgQi4pPC9saT4KKzxsaT5mb3IgMi4wOiBoYXZlIGdvb2Qgc3VwcG9ydCBpbiBwbGFjZSBzbyB0aGF0IHJlZmFjdG9yaW5nIGNhbiBiZSBtYWRlIGFuCitvcGVuIEFQSTsgd291bGQgbmVlZCBjb3JyZXNwb25kaW5nIGNvcmUgQVBJcyBmb3IgYWJzdHJhY3Qgc3ludGF4IHRyZWVzPC9saT4KKzxsaT5jdXJyZW50IHJlZmFjdG9yaW5nIGFwcG9hY2ggdXNlcyBBU1QgdmlzaXRvciB3aGljaCBydW5zIHBvc3QtcmVzb2x2ZSBvbgorZGVzaWduYXRlZCBjb21waWxhdGlvbiB1bml0PC9saT4KKzxsaT52aXNpdG9yIGNvbGxlY3RzIGluZm8gKHBhcmVudCBzdGFjaykgaW5jbHVkaW5nIHNvdXJjZSBwb3NpdGlvbnM8L2xpPgorPGxpPnVzZXMgbmFtZSBlbnZpcm9ubWVudCAoYmluZGluZ3MsIHNjb3BlcykgdG8gdmFsaWRhdGUvbG9jYXRlPC9saT4KKzxsaT5hbGwgY2hhbmdlcyBhcmUgZm9ybXVsYXRlZCBhcyByZWlmaWVkIHVuZG9hYmxlIGVkaXRzIGluIGEgc291cmNlIGJ1ZmZlcjwvbGk+Cis8bGk+YSBiYXRjaCBvZiBjaGFuZ2VzIGFyZSBtYWRlIGF0IGEgdGltZTwvbGk+Cis8bGk+cmVmYWN0b3JpbmcgZG9lcyBub3QgcmVhc29uIGh5cG90aGV0aWNhbGx5IChjaGFuZ2VzIGFyZSB1bmRvYWJsZSk8L2xpPgorPGxpPkpET00gaXMgbm90IHVzZWQgYnkgcmVmYWN0b3JpbmcsIGJ1dCBwb3RlbnRpYWxseSBjb3VsZCBiZSAoSkRPTSBpcyB1c2VkCitpbnNpZGUgSmF2YSBNb2RlbCk8L2xpPgorPC91bD4KK0RpcmsncyB3aXNoIGxpc3Qgd2l0aCByZWdhcmQgdG8gdGhlIEFTVCBzdXBwb3J0OgorPHVsPgorPGxpPgorY29uc2lzdGVudCBwb3NpdGlvbnMgaW4gQVNUIChlLmcuIHNvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQgc2hvdWxkIGFsd2F5cworY292ZXIgdGhlIHdob2xlIG5vZGUpLjwvbGk+CisKKzxsaT4KK2NvbW1lbnQgaGFuZGxpbmcgaW4gQVNULiBTb21lIG5vZGUgY29udGFpbiBwcmVjZWRpbmcgY29tbWVudHMgb3RoZXIgZG9uJ3Q8L2xpPgorCis8bGk+CitQYXJlbnQgcG9pbnRlciBpbiBBU1Qgbm9kZS48L2xpPgorCis8bGk+CitEYXRhIHBvaW50ZXIgaW4gQVNUIG5vZGUuPC9saT4KKworPGxpPgorRXhwcmVzc2lvbiBzaG91bGQgcHJvdmlkZSBnZXRUeXBlIG1ldGhvZCAoY2FjaGVkIHZhbHVlIG9mIHJlc29sdmVUeXBlKFNjb3BlKSkuPC9saT4KKzwvdWw+CisKKzxoMz4KK1N1bW1hcnkgZnJvbSBTZXB0LiAxMC0xMSBtZWV0aW5nczwvaDM+CitEaXJrIHRyYXZlbGxlZCB0byBTTlogdG8gZGlzY3VzcyByZWZhY3RvcmluZyByZXF1aXJlbWVudHMgYW5kIHBvc3NpYmxlCitzb2x1dGlvbnMgd2l0aCBQaGlsaXBwZSBNLiBhbmQgSmVlbS4KKzxwPlNvbWUgb2YgdGhlIGZvcm1zIG9mIHNvbHV0aW9ucyBkaXNjdXNzZWQsIGJ1dCB1bHRpbWF0ZWx5IGFiYW5kb25lZDoKKzx1bD4KKzxsaT4KK0EgdmFuaWxsYSBET00uPC9saT4KKworPHVsPgorPGxpPgordG9vIGxpbWl0aW5nOiBkaWZmaWN1bHQgdG8gcHJvdmlkZSBmb3IgcHJlLWNvbXB1dGluZyBiaW5kaW5ncy48L2xpPgorCis8bGk+CitjbHVtc3kgZm9yIGNsaWVudHMgdG8gdXNlIHdpdGhvdXQgQVNUIG5vZGUgdHlwZXMgcmVwcmVzZW50ZWQgYnkgZGlmZmVyZW50CitKYXZhIHR5cGVzPC9saT4KKzwvdWw+CisKKzxsaT4KK0FTVCBwbHVzIHJlc29sdmVzIGluZm8gaW4gZm9ybSBvZiBKYXZhIG1vZGVsIGVsZW1lbnRzLjwvbGk+CisKKzx1bD4KKzxsaT4KK0phdmEgbW9kZWwgbWV0aG9kcyBhcmUgdW5zdWl0YWJsZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIHJlc29sdmVkCittZXRob2RzIGJlY2F1c2UgcGFyYW1ldGVyIHR5cGVzIGFyZSBhcyBwZXIgc291cmNlLjwvbGk+CisKKzxsaT4KK0l0IGlzIGhhcmQgdG8gbWFwIGEgdHlwZSBiYWNrIHRvIGEgSmF2YSBlbGVtZW50IChuZWVkIHRvIHJlbWVtYmVyIHBhY2thZ2UKK2ZyYWdtZW50KS48L2xpPgorCis8bGk+CitXb3VsZCBuZWVkIGFkZGl0aW9uYWwgSmF2YSBtb2RlbCBlbGVtZW50cyB0byByZXByZXNlbnQgdmFyaWFibGUgZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK1dvdWxkIG5lZWQgc3BlY2lhbCBKYXZhIGVsZW1lbnQgaW1wbGVtZW50YXRpb25zIGZvciBsb2NhbCB0eXBlcywgbWV0aG9kcywKK2FuZCBmaWVsZHMuPC9saT4KKzwvdWw+Cis8L3VsPgorSW4gdGhlIGVuZCwgd2UgYWdyZWVkIG9uIEFTVCBwbHVzIGJpbmRpbmdzOgorPHVsPgorPGxpPgorQVNUIGlzIHNpbXBsZSB0cmVlIG9mIHR5cGVkIG5vZGVzIGFzIGRldGVybWluZWQgYnkgcGFyc2VyLjwvbGk+CisKKzxsaT4KK0EgZGlmZmVyZW50IEphdmEgdHlwZSBmb3IgZWFjaCBBU1Qgbm9kZSB0eXBlLjwvbGk+CisKKzxsaT4KK1RCRDogYXJlIG5vZGUgdHlwZXMgQVBJIGNsYXNzZXMsIEFQSSBpbnRlcmZhY2VzLCBvciBib3RoPzwvbGk+CisKKzxsaT4KK1NpbXBsZSBjYXNlOiBubyBiaW5kaW5ncy48L2xpPgorCis8bGk+CitCYXNpYyBBU1QgTGlmZWN5Y2xlOiBjbGllbnQgcmVxdWVzdHMgQVNUOyBjb21waWxhdGlvbiB1bml0IGlzIHBhcnNlZCBhbmQKK25vZGVzIGFyZSBjcmVhdGVkOyByb290IGlzIGhhbmRlZCBiYWNrIHRvIGNsaWVudDsgQVNUIGlzIGdhcmJhZ2UgY29sbGVjdGVkCithZnRlciBjbGllbnQgbGV0cyBnbyBvZiBhbGwgQVNUIG5vZGVzLiBBU1QgaXMgbm90IGFmZmVjdGVkIGlmIHVuZGVybHlpbmcKK2NvbXBpbGF0aW9uIHVuaXQgaXMgY2hhbmdlZCAoaS5lLiwgZWFnZXIgcGFyc2UsIHdpdGggbm8gcmVzaWR1YWwgZGVwZW5kZW5jZQorb24gc3RhdGUgb2YgZmlsZSBpbiB3b3Jrc3BhY2UpLjwvbGk+CisKKzxsaT4KK0FueSBzeW50YXggZXJyb3JzIGRldGVjdGVkIG5lZWQgdG8gYmUgcmVwb3J0ZWQgdG8gY2xpZW50LiBQcm9ibGVtcyBhcmUKK29wYXF1ZTogc291cmNlIGNoYXJhY3RlciBwb3NpdGlvbiBwbHVzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuIENsaWVudHMKK25lZWRzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIEFTVCBpcyBvbmx5IHBhcnRpYWwgKGUuZy4sIGJ1c3RlZCBmbGFncykuPC9saT4KKworPGxpPgorUHJlZGljYXRhYmxlIHRyZWVzIHdpdGggc2ltcGxlIGNvcnJlc3BvbmRlbmNlIHRvIHNvdXJjZSBjb2RlIChwYXJzZXIgc2hvdWxkCitub3Qgb3B0aW1pemUgQVNUcykuPC9saT4KKworPGxpPgorUmVsaWFibGUgc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgbm9kZXMuPC9saT4KKworPGxpPgorU2NyYXRjaCAiZGF0YSIgZmllbGQgb24gZWFjaCBBU1Qgbm9kZSBmb3IgY2xpZW50IHRvIHJlY29yZCBhbiBPYmplY3QuPC9saT4KKworPGxpPgorTmF2aWdhdGUgQVNUIHVwd2FyZHMgYXMgd2VsbCBhcyBkb3dud2FyZHMuIFBhcmVudCBsaW5rLjwvbGk+CisKKzxsaT4KK0FTVCB3YWxrZXIgZm9yIGNvbnZlbmllbnQgdHJhdmVyc2FsLjwvbGk+CisKKzxsaT4KK0FTVHMgY2FuIGJlIHJlYWQtb25seSBvciByZWFkLXdyaXRlLjwvbGk+CisKKzxsaT4KK1JlYWQtd3JpdGUgQVNUcyBjYW4gYmUgbW9kaWZpZWQgaW4gdGVybXMgb2YgQVNUcy4gQVNUIG5vZGUgZmFjdG9yaWVzIChubworSmF2YSBwYXJzZXIgcmVxdWlyZWQpLiBDdXQvY29weS9wYXN0ZS48L2xpPgorCis8bGk+CitDdXQvY29weS9wYXN0ZSBiZXR3ZWVuIHNlcGFyYXRlIEFTVHMgcmVxdWlyZXMgZnJhZ21lbnQgY2xvbmluZyB0byBwcmVzZXJ2ZQoraW5kZXBlbmRlbmNlIG9mIHN0b3JhZ2UuPC9saT4KKworPGxpPgorQ2xpZW50IG1heSBiZSBpbnRlcmVzdGVkIGluIGN1dC9jb3B5L3Bhc3RpbmcgY29tbWVudHMgdG9vLjwvbGk+CisKKzxsaT4KK05ldyBub2RlcyB3b3VsZCBub3QgY2Fycnkgc291cmNlIHBvc2l0aW9ucy48L2xpPgorCis8bGk+CitSZWFkLXdyaXRlIEFTVCBjYW4gYmUgc2VyaWFsaXplZCBiYWNrIHRvIGNvbXBpbGF0aW9uIHVuaXQgY2hhcltdLjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByZXNlcnZlIGV4aXN0aW5nIGNvbW1lbnRzLCB3aGl0ZXNwYWNlLCBhbmQgdXNlIG9mIFx1LjwvbGk+CisKKzxsaT4KK0NvbnRyb2wgd2hpdGVzcGFjZSBhbmQgdXNlIG9mIFx1IGZvciBpbnNlcnRpb25zLjwvbGk+CisKKzxsaT4KK1Byb3ZpZGUgZWRpdCBtYXAgZm9yIHVwZGF0aW5nIG1hcmtlcnMuPC9saT4KKzwvdWw+CisKKzxsaT4KK1Jlc29sdmVkIEFTVHM6IGJhc2ljIEFTVCBhbm5vdGF0ZWQgd2l0aCBiaW5kaW5ncyAobm9uLXN5bnRhY3RpYyBpbmZvcm1hdGlvbikuPC9saT4KKworPGxpPgorQmluZGluZyBpbmZvcm1hdGlvbiBpcyBkZXJpdmVkIGZyb20gQVNUIHBsdXMgdGhlIEphdmEgbW9kZWwgKHJlbGF0aXZlIHRvCitzb21lIHByb2plY3QpLjwvbGk+CisKKzxsaT4KK0F2YWlsYWJpbGl0eS92YWxpZGl0eSBvZiBiaW5kaW5ncyBjZWFzZXMgd2hlbiBKYXZhIG1vZGVsIGNoYW5nZXMuPC9saT4KKworPGxpPgorQ2xpZW50IG11c3QgcmVxdWVzdCB1cCBmcm9udCB0aGF0IGJpbmRpbmdzIGJlIGNyZWF0ZWQuPC9saT4KKworPGxpPgorQ2VydGFpbiBBU1Qgbm9kZXMgZ2V0IGRlY29yYXRlZCB3aXRoIGJpbmRpbmdzLjwvbGk+CisKKzxsaT4KK0NsaWVudCBzaG91bGQgaGF2ZSB3YXlzIHRvIGNvbW11bmljYXRlIHVwIGZyb250IHdoYXQga2luZCBvZiBiaW5kaW5ncyBhcmUKK3JlcXVpcmVkIGFuZCB3aGVyZS48L2xpPgorCis8bGk+CitBdmFpbGFiaWxpdHkvdmFsaWRpdHkgb2YgYmluZGluZ3MgZm9yIGEgcmVhZC13cml0ZSBBU1QgY2Vhc2VzIHdoZW4gaXQgaXMKK2ZpcnN0IG1vZGlmaWVkLjwvbGk+CisKKzxsaT4KK0JpbmRpbmdzIChub24tc3ludGFjdGljIGluZm9ybWF0aW9uKSBpbmNsdWRlcyB0aGluZ3Mgc3VjaCBhcyB0aGUgZm9sbG93aW5nOjwvbGk+CisKKzx1bD4KKzxsaT4KK1Jlc29sdmVkIG5hbWVzIC0gd2hpY2ggdHlwZSwgZmllbGQsIG1ldGhvZCwgb3IgbG9jYWwgdmFyaWFibGUgZG9lcyBhIEFTVAorbmFtZSByZWZlcm5jZSByZXNvbHZlIHRvLjwvbGk+CisKKzxsaT4KK1Jlc29sdmVkIHR5cGVzIC0gd2hhdCBpcyB0aGUgcmVzb2x2ZWQgdHlwZSBvZiBhbiBBU1QgZXhwcmVzc2lvbiBvciB0eXBlCityZWZlcmVuY2UuPC9saT4KKworPGxpPgorUmVzb2x2ZWQgc3VwZXJ0eXBlcyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIG9mIGEgcmVzb2x2ZWQgdHlwZS48L2xpPgorCis8bGk+CitSZXNvbHZlZCBkZWNsYXJhdGlvbnMgLSB3aGF0IHJlc29sdmVkIHR5cGUsIGZpZWxkLCBtZXRob2QsIG9yIGxvY2FsIHZhcmlhYmxlCitkb2VzIGFuIEFTVCBkZWNsYXJhdGlvbiBtYXAgdG8uPC9saT4KKworPGxpPgorVGhyb3duIGV4Y2VwdGlvbnMgLSB3aGF0IGFyZSB0aGUgcmVzb2x2ZWQgdHlwZXMgb2YgdGhlIGV4Y2VwdGlvbnMgdGhyb3duCitieSBhIGdpdmVuIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LjwvbGk+CisKKzxsaT4KK1Jlc29sdmVkIG1lbWJlcnMgLSB3aGF0IGFyZSB0aGUgcmVzb2x2ZWQgbWVtYmVycyBvZiBhIHJlc29sdmVkIHR5cGUuPC9saT4KKzwvdWw+CisKKzxsaT4KK1Byb2JsZW1zIGFsc28gc2hvdWxkIGJlIHJlcG9ydGVkIHdpdGggcmVzb2x2aW5nLiBQcm9ibGVtcyBhcmUgb3BhcXVlOiBzb3VyY2UKK2NoYXJhY3RlciBwb3NpdGlvbiBwbHVzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuPC9saT4KKworPGxpPgorU3BhY2UgZm9yIGJpbmRpbmdzIHN0b3JhZ2UgaXMgc2lnbmlmaWNhbnQ7IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5IGFzIG1vcmUKK2JpbmRpbmdzIGFyZSBhY2Nlc3NlZC48L2xpPgorCis8bGk+CitTcGFjZSBmb3IgYmluZGluZ3MgaXMgZm9yIGxpZmV0aW1lIG9mIHRoZSBBU1QuPC9saT4KKworPGxpPgorQWR2YW5jZWQgQVNUIExpZmVjeWNsZTogY2xpZW50IHJlcXVlc3RzIEFTVCB3aXRoIGJpbmRpbmdzOyBjb21waWxhdGlvbgordW5pdCBpcyBwYXJzZWQsIG5vZGVzIGNyZWF0ZWQsIGFuZCBwZXJoYXBzIHNvbWUgYmluZGluZ3MgY3JlYXRlZCBhbmQgYW5ub3RhdGVkCitvbiBub2Rlczsgcm9vdCBpcyBoYW5kZWQgYmFjayB0byBjbGllbnQ7IEFTVCBpcyBnYXJiYWdlIGNvbGxlY3RlZCBhZnRlcgorY2xpZW50IGxldHMgZ28gb2YgYWxsIEFTVCBub2RlcyBhbmQgYmluZGluZ3MuIEFTVCBpdHNlbGYgaXMgbm90IGFmZmVjdGVkCitpZiB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXMgY2hhbmdlZCAoaS5lLiwgZWFnZXIgcGFyc2UsIHdpdGggbm8gcmVzaWR1YWwKK2RlcGVuZGVuY2Ugb24gc3RhdGUgb2YgZmlsZSBpbiB3b3Jrc3BhY2UpLiBCaW5kaW5ncyBtYXkgYmVjb21lIHN0YWxlIG9yCitpbnZhbGlkIGlmIHdvcmtzcGFjZSBjaGFuZ2VzIChpLmUuLCBwb3NzaWJseSBsYXp5IGFuZCBpbmNyZW1lbnRhbCBjb25zdHJ1Y3Rpb24KK29mIGJpbmRpbmdzIHVzaW5nIEphdmEgbW9kZWwpLjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5CaW5kaW5ncyBmcm9tIHR3byBBU1RzIGFyZSBub3QgZ2VuZXJhbGx5IGNvbXBhcmFibGUuPC9mb250PjwvbGk+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5Gb3IgYmluZGluZ3Mgd2l0aCBzdGFibGUgZ2xvYmFsIG5hbWVzLCBBUEkgcHJvdmlkZXMKK3N0cmluZ3MgdGhhdCBjYW4gYmUgY29tcGFyZWQgYmV0d2VlbiBBU1RzLjwvZm9udD48L2xpPgorPC91bD4KKzwvdWw+CitBU1Qgd2lsbCBlaXRoZXIgZXh0ZW5kIG9yIHJlcGxhY2UgSkRPTS4gSW4gdGhlIGxhdHRlciBjYXNlLCBKRE9NIHdvdWxkCitiZSBkZXByZWNhdGVkLgorPHA+QVNUIHdpbGwgZXhpc3QgYWxvbmcgc2lkZSBKYXZhIG1vZGVsLgorPGgzPgorQVBJIERlc2lnbiBJc3N1ZTogQVNUIE5vZGUgVHlwZXMgLSBDbGFzc2VzLCBpbnRlcmZhY2UsIG9yIGJvdGg8L2gzPgorVGhlcmUgYXJlIG9uIHRoZSBvcmRlciBvZiA4NyBub2RlIHR5cGVzIGZvciBKYXZhIEFTVHMuIEJpbmRpbmdzIHdpbGwgYWRkCitzb21lIG1vcmUuIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXkgdGhpcyBjYW4gYmUgbWFwcGVkIHRvIEphdmEgdHlwZXMuCis8cD4oMSkgVXNlIG9yZy53M2MuRE9NIGludGVyZmFjZXMgYXMgQVBJLiBQcm92aWRlIGEgcHJpdmF0ZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorb2YgdGhlIERPTS4KKzxwPlBybzogVmVyeSBzbWFsbCwgYW5kIHN0YW5kYXJkIEFQSSBmb3IgcmVhZC13cml0ZSBkb2N1bWVudHMuCis8YnI+Q29uOiBBUEkgaXMgbm90IGNvbnZlbmllbnQgZm9yIGNsaWVudHMuCis8YnI+Q29uOiBBUEkgaXMgbm90IGFtZW5hYmxlIHRvIGV4cG9zaW5nIGJpbmRpbmdzIGFuZCBvdGhlciBub24tc3RydWN0dXJhbAoraW5mb3JtYXRpb24uCis8cD4oMikgQ29uY3JldGUgQVBJIGNsYXNzIHBlciBBU1Qgbm9kZSB0eXBlLgorPHA+UHJvOiBBUEkgYXMgc21hbGwgYXMgcG9zc2libGUuCis8YnI+UHJvOiBDbGllbnQgY2FuIGNyZWF0ZSBub2RlcyBkaXJlY3RseS4KKzxwPkNvbjogQ2Fubm90IGVhc2lseSBoaWRlIGltcGxlbWVudGF0aW9uIGRldGFpbHM7IGUuZy4gcmVwcmVzZW50YXRpb24KK2FuZCBtZWNoYW5pc20gZm9yIHJlYXNzZW1ibGluZyBjb21waWxhdGlvbiB1bml0IHRleHQgYWZ0ZXIgZWRpdGluZzsgbGF6eQorYmluZGluZyBjcmVhdGlvbi4KKzxwPkNsaWVudHMgd2hvIGNyZWF0ZSBub2RlIGZyb20gc2NyYXRjaCBvbmx5IGV2ZXIgbmVlZCBiYXNpYyBjb25zdHJ1Y3RvcnMKKyh0aGUgbm9kZXMgdGhleSBjcmVhdGUgZG8gbm90IGhhdmUgc291cmNlIHBvc2l0aW9ucywgYmluZGluZ3MsIG9yIG90aGVyCitkZWNvcmF0aW9ucykuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgcGFyc2VyIG5lZWRzIHRvIHJlbWVtYmVyIG1vcmUgaW5mbworaW5jbHVkaW5nIGZpbmUtZ3JhaW5lZCBzb3VyY2UgcG9zaXRpb25zLgorPHA+KDMpIEFQSSBpbnRlcmZhY2UgcGVyIEFTVCBub2RlIHR5cGUsIGFsb25nIHdpdGggbm9kZSBmYWN0b3J5IG1ldGhvZHMuCitQcm92aWRlIGEgcHJpdmF0ZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbi4gQWxsb3cgY2xpZW50cyB0byByZWltcGxlbWVudAorbm9kZSB0eXBlcyAoZnJvbSBzY3JhdGNoKSBhbmQgc3VwcGx5IGEgZmFjdG9yeS4KKzxwPkxpa2UgSkRPTSAoZXhjZXB0IEpET00gZG9lcyBub3QgcGVybWl0IGNsaWVudCB0byByZWltcGxlbWVudCkgYW5kIG9yZy53M2MuZG9tLgorPHA+UHJvOiBBUEkgYXMgc21hbGwgYXMgcG9zc2libGUuCis8YnI+UHJvOiBFYXN5IHRvIHRhaWxvciBkaWZmZXJlbnQga2luZHMgb2YgcmVwcmVzZW50YXRpb246IHJlYWQtd3JpdGUgdnMuCityZWFkLW9ubHkgQVNUczsgcmF3IEFTVHMgdnMuIEFTVCtiaW5kaW5ncy4KKzxwPkNvbjombmJzcDsgSGlkZGVuIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdGFrZXMgbW9yZSBzcGFjZS4KKzxicj5Db246IFVzaW5nIGZhY3RvcnkgbWV0aG9kcyBpcyBhIGJpdCBsZXNzIGRpcmVjdCB0aGFuIHVzaW5nIGNvbnN0cnVjdG9ycy4KKzxwPldlIHdpbGwgdXNlIEFQSSBpbnRlcmZhY2VzIGZvciBiaW5kaW5ncywgYW5kIGV4cG9zZWQgQVBJIGNsYXNzZXMgZm9yCitBU1Qgbm9kZXMuCis8aDM+CitBUEkgRGVzaWduIElzc3VlOiBTdGF0ZW1lbnQgdnMuIFN0YXRlbWVudCBMaXN0czwvaDM+CitGb3Igc3RydWN0dXJlZCBzdGF0ZW1lbnRzLCBsaWtlIHdoaWxlLCB0aGUgY2hpbGQgc3RhdGVtZW50IGlzIGdyYW1tYXRpY2FsbHkKK2Egc2luZ2xlIHN0YXRlbWVudC4gSG93ZXZlciwgc2luY2UgYSBibG9jayBpcyBvbmUgdHlwZSBvZiBzdGF0ZW1lbnQsIGl0CitpcyBwb3NzaWJsZSB0byBoYXZlIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIHVuZGVybmVhdGguIFRoZXJlIGFyZSBvcHRpb25zCitmb3IgcmVuZGVyaW5nIHRoaXM6Cis8cD4oMSkgQ2hpbGQgaXMgYSBzaW5nbGUgc3RhdGVtZW50LgorPHA+KExpa2UgY3VycmVudCBjb21waWxlcidzIGludGVybmFsIEFTVHMuKQorPHA+UHJvOiBBcyBwZXIgdGhlIEphdmEgZ3JhbW1hci4KKzxicj5Db246IEEgY2xpZW50IHdhbnRpbmcgdG8gaW5zZXJ0IGFuIGFkZGl0aW9uYWwgc3RhdGVtZW50IGludG8gdGhlIGNoaWxkCittdXN0IGJlIHByZXBhcmVkIHRvIHJlcGxhY2UgYnkgYSBibG9jayBpZiB0aGVyZSBpc24ndCBvbmUuCis8cD4oMikgQ2hpbGQgaXMgYSBsaXN0IG9mIHN0YXRlbWVudHMuCis8cD4oTGlrZSB0aGUgLm5ldCBjb2RlRE9NLikKKzxwPlBybzogTW9yZSBjb252ZW5pZW50IGZvciBjbGllbnRzIHRoYXQgZWRpdCBBU1RzLiBVbmlmb3JtIG1lY2hhbmlzbSBmb3IKK2luc2VydGluZyBhbmQgcmVtb3Zpbmcgc3RhdGVtZW50cyBmcm9tIGNoaWxkLgorPGJyPkNvbjogTXVkZGllcyBzY29wZXMgKGVuY2xvc2luZyBicmFjZXMgYXJvdW5kIHN0YXRlbWVudHMgaW50cm9kdWNlIGEKK3Njb3BlIGFuZCBtYWtlIGRlY2xhcmF0aW9ucyBzeW50YWN0aWNhbGx5IGxlZ2FsKS4KKzxwPldlIHdpbGwgZ28gd2l0aCAoMSkgYW5kIHN0aWNrIGNsb3NlbHkgdG8gdGhlIGdyYW1tYXIuCis8aDM+CitVc2FnZTwvaDM+CitUaGVyZSBhcmUgYSBjb3VwbGUgZGlmZmVyZW50IHVzYWdlIHNjZW5hcmlvcyBmb3IgQVNUczoKKzx1bD4KKzxsaT4KK0FuYWx5emUgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCB0byBkaXNjb3ZlciBzeW50YWN0aWMgc3RydWN0dXJlLjwvbGk+CisKKzxsaT4KK0Rpc2NvdmVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN5bnRhY3RpYyBzdHJ1Y3R1cmUgYW5kIG9yaWdpbmFsIHRleHQuPC9saT4KKworPGxpPgorRGlzY292ZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gc3ludGFjdGljIHN0cnVjdHVyZSBhbmQgcmVzb2x2ZWQgd29ybGQuPC9saT4KKworPGxpPgorQ3JlYXRlIGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQgZnJvbSBzY3JhdGNoLjwvbGk+CisKKzxsaT4KK0VkaXQgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdC48L2xpPgorPC91bD4KKworPGgzPgorU291cmNlIENvbnN0cnVjdCBOb3JtYWxpemF0aW9uPC9oMz4KKworPHVsPgorPGxpPgorTW9zdCBzeW50YWN0aWMgY29uc3RydWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gb25lIGFuZCBvbmx5IG9uZSB3YXkuPC9saT4KKworPGxpPgorV2hlbiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIEFTVCBjb25zdHJ1Y3Rpb24gaXMgImxvc3N5Ii48L2xpPgorCis8bGk+CitTb21lIGZvcm1zIGNhbm5vdCBiZSBkaXN0aW5ndWlzZWQgaW4gaW5wdXQgKGlmIG9uZSBjYXJlcykuPC9saT4KKworPGxpPgorU29tZSBmb3JtcyBjYW5ub3QgYmUgcHJvZHVjZWQgaW4gb3V0cHV0LjwvbGk+CisKKzxsaT4KK0NvcHlpbmcgdGhlIGNvbnN0cnVjdCBub3JtYWxpemVzIGl0LjwvbGk+CisKKzxsaT4KK0V4YW1wbGU6IE1vZGlmaWVyIG9yZGVyPC9saT4KKworPHVsPgorPGxpPgorZmluYWwgc3RhdGljIHB1YmxpYyBpbnQgWCA9IDE7PC9saT4KKworPGxpPgorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWCA9IDE7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KKzwvdWw+CisKKzxsaT4KK0V4YW1wbGU6IENvbXBvdW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9uczwvbGk+CisKKzx1bD4KKzxsaT4KK2ludCBpID0gMSwgaiA9IDI7PC9saT4KKworPGxpPgoraW50IGkgPSAxOyBpbnQgaiA9IDI7Jm5ic3A7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KKzwvdWw+CisKKzxsaT4KK0V4YW1wbGU6IEFycmF5IHR5cGUgZGVjbGFyYXRvcnM8L2xpPgorCis8dWw+Cis8bGk+CitpbnRbXSB4W107PC9saT4KKworPGxpPgoraW50W11bXSB4OyAvLyBwcmVmZXJyZWQgZm9ybTwvbGk+Cis8L3VsPgorCis8bGk+CitFeGFtcGxlOiBTaG9ydCBpZnM8L2xpPgorCis8dWw+Cis8bGk+CitpZiAoYSkgZigpOyBlbHNlIDs8L2xpPgorCis8bGk+CitpZiAoYSkgZigpOyAvLyBwcmVmZXJyZWQgZm9ybTwvbGk+Cis8L3VsPgorCis8bGk+CitDYW4gb25seSBiZSBkb25lIGZvciBzeW50YWN0aWMgbnVhbmNlcyB0aGF0IGFyZSBoYXZlIG5vIHNlbWFudGljIGltcG9ydC48L2xpPgorCis8bGk+CitOb3JtYWxpemF0aW9uIGlzIGdlbmVyYWxseSBhY2NlcHRhYmxlIHdoZXJlIHVuaW1wb3J0YW50IHN5bnRhY3RpYyBudWFuY2VzCithcmUgaW52b2x2ZWQuPC9saT4KKworPGxpPgorTm9ybWFsIGZvcm0gc2hvdWxkIGZvbGxvdyBKTFMgcmVjb21tZW5kYXRpb25zIGFuZCBKYXZhIGNvZGluZyBzdGFuZGFyZHMuPC9saT4KKworPGxpPgorTm90ZSB0aGF0IHBhcmVudGhlc2VzIGFuZCBibG9ja3MgYXJlIGltcG9ydGFudCB0byB1c2VyIGFuZCBzaG91bGQgbm90IGJlCitub3JtYWxpemVkLjwvbGk+Cis8L3VsPgorCis8aDM+CitTb3VyY2UgUG9zaXRpb25zPC9oMz4KKworPHVsPgorPGxpPgorV2hlbiBBU1QgaXMgb2J0YWluZWQgYnkgcGFyc2luZyBhIHRleHQgc3RyaW5nLCBleHBvc2luZyBzb3VyY2UgcmFuZ2VzIGZvcgorbm9kZXMgYWxsb3dzIGNsaWVudHMgdG8gbmF2aWdhdGUgYmFjayBpbnRvIG9yaWdpbmFsIHN0cmluZzsgZS5nLiwgZm9yIG1ha2luZwordGV4dCBlZGl0b3Igc2VsZWN0aW9ucy48L2xpPgorCis8bGk+CitBU1Qgc3VwcG9ydHMgb25seSBjaGFyYWN0ZXItb3JpZW50ZWQgcG9zaXRpb24gaW5mb3JtYXRpb247IG1hcHBpbmcgY2hhcmFjdGVyCitwb3NpdGlvbnMgdG8gbGluZXMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlIChlLmcuLCB0ZXh0IGVkaXRvcikuPC9saT4KKworPGxpPgorU291cmNlIHJhbmdlcyBhcmUgaXJyZWxldmFudCBmb3Igbm9kZXMgY3JlYXRlZCBieSBvdGhlciBtZWFucy48L2xpPgorCis8bGk+CitTb3VyY2UgcmFuZ2VzIGdpdmUgb3JpZ2luYWwgcG9zaXRpb24gaW4gb3JpZ2luYWwgc3RyaW5nLjwvbGk+CisKKzx1bD4KKzxsaT4KK0VkaXRpbmcgdGhlIEFTVCBkb2VzIG5vdCBhbHRlciBwb3NpdGlvbnMgb3IgYW55dGhpbmcgY2xldmVyLjwvbGk+Cis8L3VsPgorCis8bGk+CitNb3N0IGNvbnN0cnVjdHMgb2NjdXB5IGNvbnRpZ3VvdXMgY2hhcmFjdGVyIHBvc2l0aW9ucywgb3IgcmFuZ2VzLjwvbGk+CisKKzxsaT4KK1JhbmdlcyBhcmUgcmVwcmVzZW50ZWQgYnkgMC1iYXNlZCBzdGFydCBwb3NpdGlvbiBhbmQgbGVuZ3RoLjwvbGk+CisKKzxsaT4KK1N0YXJ0IHBvc2l0aW9uIGJlZ2lucyBhdCBmaXJzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIgb2YgY29uc3RydWN0IGNvcnJlc3BvbmRpbmcKK3RvIEFTVCBub2RlLjwvbGk+CisKKzx1bD4KKzxsaT4KK0ZpcnN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIGxlYWRpbmcgd2hpdGVzcGFjZS48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIHByZWNlZGluZyBjb21tZW50IChleGNlcHQgdGhlIGphdmFkb2MgY29tbWVudCBwcmVjZWRpbmcKK2EgZGVjbGFyYXRpb24sIG9yIHRoZSBjb21tZW50IHByZWNlZGluZyBhIHN0YXRlbWVudCAtIHNlZSBiZWxvdykuPC9saT4KKzwvdWw+CisKKzxsaT4KK0VuZCBwb3NpdGlvbiBpbmNsdWRlcyBsYXN0IHNpZ25pZmljYW50IGNoYXJhY3RlciBvZiBjb25zdHJ1Y3QgY29ycmVzcG9uZGluZwordG8gQVNUIG5vZGUuPC9saT4KKworPHVsPgorPGxpPgorTGFzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIuPC9saT4KKworPGxpPgorSW5jbHVkZXMgdHJhaWxpbmcgdGVybWluYXRvcnMgdGhhdCBhcmUgcGFydCBvZiBjb25zdHJ1Y3Q7IGUuZy4sIGluY2x1ZGUKK3RyYWlsaW5nIHNlbWljb2xvbiBhdCBlbmQgb2YgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uPC9saT4KKworPGxpPgorRG9lcyBub3QgaW5jbHVkZSBzZXBhcmF0b3JzOyBlLmcuLCBleGNsdWRlIHRyYWlsaW5nIGNvbW1hIGluIHBhcmFtZXRlcgorbGlzdC48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UuPC9saT4KKworPGxpPgorRG9lcyBub3QgaW5jbHVkZSB0cmFpbGluZyBjb21tZW50LjwvbGk+CisKKzxsaT4KK1N0YXRlbWVudCBlbmQtb2YtbGluZSBjb21tZW50cyBhcmUgbm90IGVuY29tcGFzc2VkIGJ5IHN0YXRlbWVudC48L2xpPgorCis8dWw+Cis8bGk+Cis8dHQ+U3lzdGVtLm91dC5wcmludGxuKCJoZWxsbyIpOyAvLyAkbm9uLW5scyQ8L3R0PjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+RW1iZWRkZWQgY29tbWVudHMgYXJlIGVuY29tcGFzc2VkIGlmIHRoZXkgb2NjdXIgYmVmb3JlCitlbmQgcG9zaXRpb24uPC9mb250PjwvbGk+CisKKzx1bD4KKzxsaT4KKzx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U3lzdGVtLm91dC5wcmludGxuKCJoZWxsbyIpIC8qIGNvbW1lbnQgKi87PC9mb250PjwvdHQ+PC9saT4KKzwvdWw+Cis8L3VsPgorCis8bGk+CitTb21lIG5vZGUgdHlwZXMgd291bGQgaGF2ZSBzb3VyY2UgcmFuZ2VzIGZvciBzaWduaWZpY2FudCBjb250aWd1b3VzIHN1YmNvbnN0cnVjdHMKK25vdCByZWFkaWx5IGdsZWFuYWJsZSBmcm9tIHNvdXJjZSByYW5nZXMgb2YgdGhlIHN1Ym5vZGVzLjwvbGk+CisKKzx1bD4KKzxsaT4KK0FkZGl0aW9uYWwgc291cmNlIHJhbmdlcyB3b3VsZCBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggbm9kZSB0eXBlLjwvbGk+CisKKzxsaT4KK0UuZy4sIG1ldGhvZCBkZWNsYXJhdGlvbiBoYXMgYWRkaXRpb25hbCBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBtZXRob2QgbmFtZQorYW5kIGZvciB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIGV4Y2x1ZGluZyBpdHMgamF2YWRvYyBjb21tZW50LjwvbGk+CisKKzxsaT4KK1VzZSBzdGFydCBhbmQgbGVuZ3RoIGFycmF5cyByYXRoZXIgdGhhbiBwcm9saWZlcmF0ZSBBUEkgbWV0aG9kcyBmb3IgYWRkaXRpb25hbAorc291cmNlIHJhbmdlcy48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1VuaWNvZGUgRXNjYXBlczwvaDM+CisKKzx1bD4KKzxsaT4KK09yaWdpbmFsIHNvdXJjZSB0ZXh0IG1pZ2h0IGNvbnRhaW4gVW5pY29kZSBlc2NhcGVzIChKTFMgMy4yLCAzLjMpLjwvbGk+CisKKzxsaT4KK0UuZy4sIHZvaWRcdTAwNDBcdTAwNWEoKTsgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgWi48L2xpPgorCis8bGk+CitTY2FubmVyIHJlbW92ZXMgYWxsIFVuaWNvZGUgZXNjYXBlcyBhbmQgcmV0dXJucyBhIFVuaWNvZGUgdG9rZW4gc3RyZWFtLjwvbGk+CisKKzxsaT4KK05ld2x5IGNyZWF0ZWQgQVNUIG5vZGVzIGFyZSAicG9zdCIgVW5pY29kZSBlc2NhcGluZy48L2xpPgorCis8bGk+CitPdXRwdXQgb3B0aW9uczo8L2xpPgorCis8dWw+Cis8bGk+CitQcmVzZXJ2ZSBleGlzdGluZyBVbmljb2RlIGVzY2FwZXMgKGRlZmF1bHQpOyByZW1vdmUgYWxsIGV4aXN0aW5nIFVuaWNvZGUKK2VzY2FwZXMuPC9saT4KKworPGxpPgorRG8gbm90IGludHJvZHVjZSBVbmljb2RlIGVzY2FwZXMgKGRlZmF1bHQpOyBpbnRyb2R1Y2UgVW5pY29kZSBlc2NhcGVzIGZvcgorY2hhcmFjdGVycyBpbiBhIHNwZWNpZmllZCBzZXQgKGUuZy4sIGFsbCBub24tQVNDSUkpLjwvbGk+Cis8L3VsPgorCis8bGk+CitJbml0aWFsIGltcGxlbWVudGF0aW9uOiBzdXBwb3J0IGRlZmF1bHQgYmVoYXZpb3Igb25seS48L2xpPgorPC91bD4KKworPGgzPgorQ29tbWVudHM8L2gzPgorCis8dWw+Cis8bGk+CitDb21tZW50cyBhcmUgcHJvYmxlbWF0aWMgZm9yIEFTVHM7IHRoZXNlIGxleGljYWwgaXRlbXMgYXJlIG5vcm1hbGx5IGZpbHRlcmVkCitvdXQgb2YgdG9rZW4gc3RyZWFtLjwvbGk+CisKKzxsaT4KK0NvbW1lbnRzIGFyZSBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+CisKKzxsaT4KK0VkaXRpbmcgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlIGV4aXN0aW5nCitjb21tZW50cy48L2xpPgorCis8bGk+CitTaG91bGQgYmUgYWJsZSB0byBpbmNsdWRlIGNvbW1lbnRzIGZvciBuZXdseSBjcmVhdGVkIHN1YnRyZWVzLjwvbGk+CisKKzxsaT4KK0NvcHlpbmcgYSBzdWJ0cmVlIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIgc2hvdWxkIGluY2x1ZGUgcmVsZXZhbnQgY29tbWVudHMuPC9saT4KKworPGxpPgorTW9zdCBjb21tb24gZm9ybXMgb2YgY29tbWVudHM6PC9saT4KKworPHVsPgorPGxpPgorSmF2YWRvYyBjb21tZW50cyAtIG9uIG9uZSBvciBtb3JlIGxpbmVzIHByZWNlZGluZyBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZQorZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK0JvaWxlcnBsYWNlIGNvbW1lbnRzIChjb3B5cmlnaHQgbm90aWNlcykgLSBvbmUgb3IgbW9yZSBsaW5lcyBwcmVjZWRpbmcKK3RoZSBwYWNrYWdlIGRlY2xhcmF0aW9uLCBvciBiZXR3ZWVuIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGFuZCBmaXJzdCBpbXBvcnQKK29yIHR5cGUgZGVjbGFyYXRpb24uPC9saT4KKworPGxpPgorU3RhdGVtZW50IGNvbW1lbnRzIC0gb25lIG9yIG1vcmUgbGluZXMgYmV0d2VlbiBzdGF0ZW1lbnRzIGluIGEgYmxvY2suPC9saT4KKworPGxpPgorU3RhdGVtZW50IGVuZC1vZi1saW5lIGNvbW1lbnRzLjwvbGk+Cis8L3VsPgorCis8bGk+CitWQS9TVCBleHBlcmllbmNlOiBub3Qgd29ydGggYmVuZGluZyBvdmVyIGJhY2t3YXJkcyB0byBhY2NvbW9kYXRlIGFsbCBjb21tZW50cy48L2xpPgorCis8bGk+CitEZXRlcm1pbmVkIGNsaWVudHMgY2FuIHJlc2NhbiBvcmlnaW5hbCBzdHJpbmcgdG8gZ2V0IGF0IGFsbCBjb21tZW50cy48L2xpPgorCis8bGk+CitFeHBvc2UgaGlnaCB2YWx1ZSBjb21tZW50czo8L2xpPgorCis8bGk+CitKYXZhZG9jIGNvbW1lbnRzIC0gdHJlYXQgYXMgYXR0cmlidXRlIG9mIHRoZSBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZSBkZWNsYXJhdGlvbnMuPC9saT4KKworPHVsPgorPGxpPgorQ2xpZW50cyBjYW4gZXh0cmFjdCBKYXZhZG9jIGF0dHJpYnV0ZXMgKGluY2x1ZGluZyBAZGVwcmVjYXRlZCkuPC9saT4KKworPGxpPgorQ2xpZW50cyBjYW4gY3JlYXRlIGRlY2xhcmF0aW9ucyB3aXRoIEphdmFkb2MuPC9saT4KKzwvdWw+CisKKzxsaT4KK1N0YXRlbWVudCBjb21tZW50cyB3aXRoaW4gYmxvY2tzPC9saT4KKworPHVsPgorPGxpPgorQXBwcm9hY2ggMTogVHJlYXQgYXMgcHNldWRvLXN0YXRlbWVudHMgd2l0aCBhIHNwZWNpYWwgQVNUIG5vZGUgdHlwZS48L2xpPgorCis8dWw+Cis8bGk+CitQcm86IENsaWVudHMgY2FuIGluY2x1ZGUgY29tbWVudHMgd2l0aCBibG9ja3MuPC9saT4KKworPGxpPgorQ29uOiBPbmx5IHdvcmtzIGZvciBjb21tZW50cyB3aXRoaW4gZ2VudWluZSBibG9ja3MuIEUuZy4sIGNhbid0IGhhbmRsZTwvbGk+CisKKzxsaT4KKzx0dD5pZiAodGVzdCk8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLy8gc2hvdWxkIG5vdCBoYXBwZW48L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTs8L3R0PjwvbGk+CisKKzxsaT4KK1dvdWxkIHdvcmsgYmV0dGVyIGlmIHdlIHdlcmUgdXNpbmcgc3RhdGVtZW50IGxpc3RzIGluIG1vcmUgcGxhY2VzLjwvbGk+Cis8L3VsPgorCis8bGk+CitBcHByb2FjaCAyOiBUcmVhdCBhcyBhIHByb3BlcnR5IG9mIGZvbGxvd2luZyBzdGF0bWVudCBub2RlLjwvbGk+CisKKzx1bD4KKzxsaT4KK1BybzogQ2xpZW50cyBjYW4gaW5jbHVkZSBjb21tZW50cyBiZWZvcmUgYW55IHN0YXRlbWVudC48L2xpPgorCis8bGk+CitDb246IERvZXMgbm90IGhhbmRsZSB0cmFpbGluZyBjb21tZW50cyBpbiBibG9ja3MuIEUuZy4sPC9saT4KKworPGxpPgorPHR0Pns8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTs8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLy8gY2FuJ3QgcmVhY2ggaGVyZTwvdHQ+PC9saT4KKworPGxpPgorPHR0Pn08L3R0PjwvbGk+Cis8L3VsPgorCis8bGk+CitSZWNvbW1lbmQgYXBwcm9hY2ggMiBzaW5jZSBpdCBjb3ZlcnMgbW9zdCBjYXNlcy48L2xpPgorPC91bD4KKworPGxpPgorQm9pbGVycGxhdGUgY29tbWVudHMgd291bGQgbm90IGJlIGV4cG9zZWQsIGJ1dCB3b3VsZCBiZSBwcmVzZXJ2ZWQgdGhyb3VnaAorZWRpdCBhbmQgb3V0cHV0LjwvbGk+Cis8L3VsPgorCis8aDM+CitXaGl0ZXNwYWNlPC9oMz4KKworPHVsPgorPGxpPgorV2hpdGVzcGFjZSAoSkxTIDMuNikgaW5jbHVkZXMgQVNDSUkgU1AsIEhULCBhbmQgRkYgY2hhcmFjdGVycywgYW5kIGxpbmUKK3Rlcm1pbmF0b3JzLjwvbGk+CisKKzxsaT4KK0xpa2UgY29tbWVudHMsIHdoaXRlc3BhY2UgaXMgc2lnbmlmaWNhbnQgdG8gdXNlci48L2xpPgorCis8bGk+CitFZGl0aW5nIGFuIGV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQgc2hvdWxkIGdlbmVyYWxseSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLjwvbGk+CisKKzxsaT4KK1doaXRlc3BhY2UgZm9yIG5ld2x5IGNyZWF0ZWQgc3VidHJlZXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgdG8gcHJvZHVjZQorb3V0cHV0IHRoYXQgZm9sbG93cyBjb21tb24gY29udmVudGlvbnMgYW5kIGJsZW5kcyBpbiB3aXRoIHN1cnJvdW5kaW5nIHRleHQKKyh1c2UgdGhlIHNhbWUgbGVhZGluZyB3aGl0ZXNwYWNlKS48L2xpPgorCis8bGk+CitDb3B5aW5nIGEgc3VidHJlZSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyIHNob3VsZCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlCit3aGl0ZXNwYWNlLjwvbGk+Cis8L3VsPgorCis8aDM+CitBU1QgUGFyZW50IEJhY2twb2ludGVyPC9oMz4KKworPHVsPgorPGxpPgorRWFjaCBBU1Qgbm9kZSB3aWxsIGNhcnJ5IGEgYmFja3BvaW50ZXIgdG8gaXRzIHBhcmVudCBub2RlLjwvbGk+CisKKzxsaT4KK0FTVE5vZGUuZ2V0UGFyZW50KCkgcmV0dXJucyBBU1ROb2RlPC9saT4KKworPGxpPgorVGhpcyBwZXJtaXRzIGNsaWVudHMgdG8gdHJhdmVyc2UgQVNUcyBpbiB1cHdhcmQgYXMgd2VsbCBhcyBkb3dud2FyZCBkaXJlY3Rpb24uPC9saT4KKworPGxpPgorQmlkaXJlY3Rpb25hbCBsaW5rcyBtdXN0IGJlIG1haW50YWluZWQgZHVyaW5nIGVkaXRpbmcuPC9saT4KKworPGxpPgorRGVsZXRpb24gQVBJIG11c3QgdW5saW5rIGNoaWxkIGZyb20gcGFyZW50LjwvbGk+CisKKzxsaT4KK0luc2VydGlvbiBBUEkgbXVzdCBsaW5rIGNoaWxkIHRvIHBhcmVudC48L2xpPgorCis8dWw+Cis8bGk+CitUbyBwcmVzZXJ2ZSB0cmVlbmVzcywgYXV0b21hdGljYWxseSBjbG9uZSBjaGlsZCBzdWJ0cmVlIGlmIGNoaWxkIGFscmVhZHkKK2hhcyBwYXJlbnQuPC9saT4KKzwvdWw+CisKKzxsaT4KK1JlcGxhY2UgQVBJIG11c3QgdW5saW5rIG9sZCBjaGlsZCBiZWZvcmUgaW5zZXJ0aW5nIG5ldyBjaGlsZC48L2xpPgorCis8bGk+CitQYXJlbnQgYmFja2xpbmtzIG1lYW5zIHRoYXQgaGFuZ2luZyBvbiB0byA8aT5hbnk8L2k+IG5vZGUgaW4gYW4gQVNUIGluc3RhbmNlCit3aWxsIHByZXZlbnQgYW55IHBhcnQgb2YgdGhlIEFTVCBpbnN0YW5jZSBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLjwvbGk+Cis8L3VsPgorCis8aDM+CitNdWx0aXBsZSBBU1RzPC9oMz4KKworPHVsPgorPGxpPgorTXVsaXBsZSBBU1RzIGNhbiBleGlzdCBzaWRlIGJ5IHNpZGUgKGFuZCBBU1RzIGFyZSBwb3RlbnRpYWxseSBmb3Igc2FtZQorY29tcGlsYXRpb24gdW5pdCkuPC9saT4KKworPGxpPgorQWxsb3cgaW5zZXJ0aW9uIG9mIG5vZGVzIGZyb20gb25lIEFTVCBpbnRvIGFub3RoZXIgQVNULjwvbGk+CisKKzx1bD4KKzxsaT4KK0F1dG9tYXRpY2FsbHkgY2xvbmVzIGNoaWxkIHN1YnRyZWUgKGZvcmdldHRpbmcgc291cmNlIHBvc2l0aW9ucyBhbmQgYmluZGluZworZGVjb3JhdGlvbnMpLjwvbGk+CisKKzxsaT4KK0Vuc3VyZSBtZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgQVNUcyByZW1haW4gY29tcGxldGVseSBpbmRlcGVuZGVudC48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5TdHJ1Y3R1cmFsIEVxdWFsaXR5PC9mb250PjwvaDM+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5TdHJ1Y3R1cmFsIGVxdWFsaXR5IHByZWRpY2F0ZSBvbiBBU1Qgbm9kZXMuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Jc29tb3JwaGljIHN1YnRyZWVzLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+QmVsb25naW5nIHRvIHNhbWUgb3IgZGlmZmVyZW50IEFTVC48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPkNvbnNpZGVycyBzdHJ1Y3R1cmFsIGluZm8gb25seTsgaWdub3JlcyBzb3VyY2UgcG9zaXRpb25zLAorYmluZGluZ3MsIGV0Yy48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPk5hbWVkIHNvbWV0aGluZyBvdGhlciB0aGFuICJlcXVhbHMiIHRvIGF2b2lkIGhhdmluZwordG8gcmVpbXBsZW1lbnQgaGFzaENvZGUgdG9vLjwvZm9udD48L2xpPgorPC91bD4KKworPGgzPgorU3ludGFjdGljIENvcnJlY3RuZXNzIG9mIFBhcnNlci1idWlsdCBBU1RzPC9oMz4KKworPHVsPgorPGxpPgorRm9yIEFTVHMgYnVpbHQgYnkgYSBKYXZhIHBhcnNlciwgdGhlcmUgYXJlIGlzc3VlcyBvZiBzeW50YWN0aWMgY29ycmVjdG5lc3MuPC9saT4KKworPGxpPgorU3ludGFjdGljIGNvcnJlY3RuZXNzIGlzIGp1ZGdlZCBieSB0aGUgU3ludGFjdGljIEdyYW1tYXIgKGFzIGRlZmluZWQgaW4KK0pMUzIgc2VjdGlvbiAyLjMpLjwvbGk+CisKKzxsaT4KK0phdmEgcGFyc2VyIDxiPm11c3Q8L2I+IGd1YXJhbnRlZSB0byBwcm9kdWNlIGEgZmFpdGhmdWwgQVNUIGZvciBhbnkgc3ludGFjdGljYWxseQorY29ycmVjdCBjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzxsaT4KK0phdmEgcGFyc2VyIDxiPm1heTwvYj4gYWxzbyBidWlsZCBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbgordW5pdHMuPC9saT4KKworPGxpPgorQ29tcGxpY2FudCBKYXZhIGNvbXBpbGVycyBtdXN0IHJlamVjdCBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbgordW5pdHMuPC9saT4KKworPGxpPgorV2hhdCBwcmluY2lwbGUgZG8gd2UgYXBwbHkgdG8gSmF2YSBwYXJzZXJzIGFuZCB0aGUgQVNUcyB0aGV5IHJldHVybj88L2xpPgorCis8bGk+CitSZWFsIEphdmEgcGFyc2VycyBhcmUgaW52YXJpYWJseSBtb3JlIGxpYmVyYWwgdGhhbiB0aGUgU3ludGFjdGljIEdyYW1tYXIsCithbmQgcmVseSBvbiBwb3N0LXBhcnNlIGNoZWNrcyB0byByZXBvcnQgZXJyb3JzIGZvciBhbnkgc3ludGFjdGljYWxseSBpbmNvcnJlY3QKK2NvbnN0cnVjdHMgdGhhdCBtYWtlcyBpdCBwYXN0IHRoZSBwYXJzZXIuPC9saT4KKworPHVsPgorPGxpPgorRS5nLiwgY29uZmxpY3RpbmcgbW9kaWZpZXJzOiBwdWJsaWMgcHJpdmF0ZTwvbGk+CisKKzxsaT4KK0UuZy4sIGZpZWxkIGRlY2xhcmVkIHdpdGggbm8gaW5pdGlhbGl6ZXIgb2NjdXJzIGluIGFuIGludGVyZmFjZTwvbGk+CisKKzxsaT4KK0UuZy4sIHZvaWQgZm9vKCkgW107PC9saT4KKzwvdWw+CisKKzxsaT4KK0luIHRoZSBjdXJyZW50IEVjbGlwc2UgY29tcGlsZXIsIG1hbnkgb2YgdGhlc2UgY2hlY2tzIGFyZSBkb25lIGluIHRoZSBjb3Vyc2UKK29mIHR5cGUgYW5kIG5hbWUgcmVzb2x1dGlvbi4gSWYgY2xpZW50IG9ubHkgd2FudHMgQVNULCB3ZSB3YW50IHRvIGF2b2lkCitkb2luZyBleHBlbnNpdmUgbmFtZSBhbmQgdHlwZSBhbmFseXNpcy48L2xpPgorCis8bGk+CitBcHByb2FjaCAxOiBHdWFyYW50ZWUgdGhhdCBubyBBU1RzIGFyZSBidWlsdCBmb3Igc3ludGFjdGljYWxseSBpbmNvcnJlY3QKK2NvbXBpbGF0aW9uIHVuaXRzLjwvbGk+CisKKzx1bD4KKzxsaT4KK1lvdSBkbyBub3QgZ2V0IGFuIEFTVCBhdCBhbGwgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggc3ludGF4IGVycm9ycy48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gdHJ1c3QgcGFyc2VyIHRvIGRpc3Rpbmd1aXNoIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBmcm9tCitpbmNvcnJlY3QuPC9saT4KKworPGxpPgorQ29uOiBDbGllbnQgY2Fubm90IG1hbmlwdWxhdGUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgY29tcGlsYXRpb24gdW5pdHMKK2F0IGFsbC48L2xpPgorCis8bGk+CitDb246IFJlcXVpcmVzIHBvc3QtcGFyc2UgY2hlY2sgdG8gZGV0ZWN0IHJlc2lkdWFsIHN5bnRheCBlcnJvcnMuPC9saT4KKzwvdWw+CisKKzxsaT4KK0FwcHJvYWNoIDI6IFByb3ZpZGUgbm8gZ3VhcmFudGVlIGFib3V0IHRoZSBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdAorY29tcGlsYXRpb24gdW5pdHMuPC9saT4KKworPHVsPgorPGxpPgorWW91IG1pZ2h0IG5vdCBnZXQgYSB1c2VmdWwgQVNUIGF0IGFsbC48L2xpPgorCis8bGk+CitZb3UgbWlnaHQgZ2V0IGFuIEFTVCB0aGF0IGhhZCBwaWVjZXMgbWlzc2luZzsgZS5nLiwgYSBtYWxmb3JtZWQgbWV0aG9kCit3YXMgZXhjaXNlZDwvbGk+CisKKzxsaT4KK1lvdSBtaWdodCBnZXQgYW4gQVNUIHRoYXQgaXMgaW5jb2hlcmVudCBvciBzZWxmLWNvbnRyYWRpY3Rvcnk7IGUuZy4sIGEKK3RyYW5zaWVudCBjbGFzcyE/PC9saT4KKworPGxpPgorUHJvOiBNYXhpbXVtIGZsZXhpYmlsaXR5IGZvciBpbXBsZW1lbnRhdGlvbi48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gZ2V0IHVzZWZ1bCBBU1RzIGZvciBzb21lIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IHByb2dyYW1zLjwvbGk+CisKKzxsaT4KK0NvbjogQ2xpZW50IGNhbm5vdCB0cnVzdCBwYXJzZXIgdG8gZGlzdGluZ3Vpc2ggc3ludGFjdGljYWxseSBjb3JyZWN0IGZyb20KK2luY29ycmVjdC48L2xpPgorPC91bD4KKworPGxpPgorQXBwcm9hY2ggMzogR3VhcmFudGVlIHRoYXQgdGhlIGNsaWVudCBleGFtaW5pbmcgdGhlIHJlc3VsdGluZyBBU1QgaGFzIHNvbWUKK3dheSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdHMgaXMgaW5jb3JyZWN0LjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByaW5pY2lwbGU6IFN5bnRhY3RpYyBlcnJvcnMgbXVzdCBub3QgYmUgc3VwcHJlc3NlZC48L2xpPgorCis8bGk+CitBU1Qgbm9kZXMgY291bGQgY2FycnkgZmxhZ3MgaW5kaWNhdGluZyBjZXJ0YWluIHN5bnRheCBwcm9ibGVtOyBlLmcuLCBkdXBsaWNhdGUKK21vZGlmaWVycyBwdWJsaWMgcHVibGljPC9saT4KKworPGxpPgorQSBiaXQgb24gcm9vdCBub2RlIGNvdWxkIHNheSAidW5zcGVjaWZpZWQgc3ludGF4IGVycm9ycyIuPC9saT4KKworPGxpPgorQ291bGQgYmUgc3BlY2lhbCBBU1Qgbm9kZXMgdHlwZXMgaW5kaWNhdGluZyBtYWpvciBwcm9ibGVtczsgZS5nLiwgYm9ndXMKK21ldGhvZCBib2R5PC9saT4KKworPGxpPgorQ291bGQgYmUgcmVwcmVzZW50YWJsZSBjb25maWd1cmF0aW9ucyBvZiBBU1Qgbm9kZSB0eXBlcyB0aGF0IGFyZSByZWNvZ25pemFibGUKK2FzIHN5bnRhY3RpYWxseSBpbmNvcnJlY3Q7IGUuZy4sIGNvbmZsaWN0aW5nIG1vZGlmaWVycyBwdWJsaWMgcHJpdmF0ZTsKK21pc3NpbmcgZmllbGQgaW5pdGlhbGl6ZXIgaW4gaW50ZXJmYWNlPC9saT4KKworPGxpPgorUHJvOiBDbGllbnQgY2FuIHRydXN0IHBhcnNlciB0byBub3QgaGlkZSBhbnkgc3ludGF4IGVycm9ycyB0aGF0IGFyZSBpbgordGhlIHNvdXJjZS48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gZ2V0IHVzZWZ1bCBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBwcm9ncmFtcy48L2xpPgorCis8bGk+CitDb246IENsaWVudCBtdXN0IGRvIGV4dHJhIHdvcmsgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlIHN5bnRheCBlcnJvcnMuPC9saT4KKworPGxpPgorQ29uOiBFeHRyYSB3b3JrIHRvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpZiBubyBjbGllbnQgcmVhbGx5IGNhcmVzIGFib3V0Cit0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBhbmQgaW5jb3JyZWN0LjwvbGk+Cis8L3VsPgorCis8bGk+CitUaGUgZmlyc3QgYXBwcm9hY2ggaXMgdG9vIGhhcnNoLiBJdCBpcyBtdWNoIG1vcmUgcmVhc29uYWJsZSwgYW5kIGludGVyZXN0aW5nLAordG8gYmUgYWJsZSB0byB3b3JrIHdpdGggc29tZSBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbiB1bml0cy48L2xpPgorCis8bGk+CitUaGUgc2Vjb25kIGFwcHJvYWNoIGZlZWxzIHJlYXNvbmFibGUgaWYgY2xpZW50cyBuZXZlciBjYXJlIHdoZXRoZXIgdGhlCitzb3VyY2UgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0IG9yIG5vdC48L2xpPgorCis8bGk+CitUaGUgdGhpcmQgYXBwcm9hY2ggZmVlbHMgcmVhc29uYWJsZSBpZiBzb21lIGNsaWVudHMgd291bGQgY2FyZSB3aGV0aGVyCit0aGUgc291cmNlIGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBvciBub3QuPC9saT4KKworPGxpPgorVGhlIHByaW5jaXBsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlY29uZCBhbmQgdGhpcmQgYXBwb2FjaGVzIGlzIHRoYXQKK3RoZSBmb3JtZXIgc2FuY3Rpb25zIHF1aWV0bHkgc3VwcHJlc3Npbmcgc3ludGF4IGVycm9ycyB3aGVyZWFzIHRoZSBsYXR0ZXIKK3ByZWNsdWRlcyBpdC48L2xpPgorCis8bGk+CitUaGUgbmF0dXJlIG9mIHRoZSBBU1Qgbm9kZXMgaW5oZXJlbnRseSBtYWtlcyByb29tIHRvIGV4cHJlc3MgYSB3aWRlIHJhbmdlCitvZiBzeW50YWN0aWNhbGx5IG1hbGZvcm1lZCBwcm9ncmFtcy48L2xpPgorCis8bGk+CitBbiBleHRyYSBmbGFnIHBlciBub2RlIGZvciAidW5zcGVjaWZpZWQgc3ludGF4IGVycm9ycyIgc2hvdWxkIGNvdmVyIHRoZQorYmFzZXMuPC9saT4KKworPGxpPgorVGhlIGV4aXN0aW5nIGNvbXBpbGVyJ3MgQVNUcyBhbHJlYWR5IGNhcnJ5IGVub3VnaCBpbmZvcm1hdGlvbiB0byBlbmFibGUKK3RoZSBjb21waWxlciB0byBkbyB0aG9yb3VnaCBwb3N0LXBhcnNlIGRldGVjdGluZyBvZiByZXNpZHVhbCBzeW50YXggZXJyb3JzLjwvbGk+CisKKzxsaT4KK1RoZXJlZm9yZSB0aGUgdGhpcmQgYXBwcm9hY2ggaXMgd2l0aGluIGVhc3kgcmVhY2guPC9saT4KKworPGxpPgorVGhlIHRoaXJkIGFwcHJvYWNoIGdpdmVzIGNsaWVudHMgbW9yZSB0aGFuIHRoZSBzZWNvbmQgYXBwcm9hY2guPC9saT4KKworPGxpPgorUmVjb21tZW5kYXRpb246IHdlIGFkb3B0IHRoZSB0aGlyZCBhcHByb2FjaC48L2xpPgorPC91bD4KKworPGgzPgorU3ludGFjdGljIENvcnJlY3RuZXNzIG9mIE5vbi1wYXJzZXItYnVpbHQgQVNUczwvaDM+CisKKzx1bD4KKzxsaT4KK0FTVHMgZG8gbm90IGp1c3QgY29tZSBmcm9tIGEgcGFyc2VyLjwvbGk+CisKKzx1bD4KKzxsaT4KK1RoZXkgY2FuIGJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLjwvbGk+CisKKzxsaT4KK0EgcGFyc2VyLWJ1aWxkIEFTVCBjYW4gYmUgZWRpdGVkLjwvbGk+Cis8L3VsPgorCis8bGk+CitUaGVzZSBBU1RzIHdpbGwgbmVlZCB0byBiZSBzZXJpYWxpemVkIHRvIGEgc291cmNlIGNvbXBpbGF0aW9uIHVuaXQgKHdoeQorZWxzZSB3b3VsZCB0aGV5IGV4aXN0PykuPC9saT4KKworPGxpPgorV2hhdCBraW5kcyBvZiBzdXBwb3J0IGFuZCBndWFyYW50ZWVzIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgdGhhdCBzdWNoIGEKK3N1aXRhYmxlIHNvdXJjZSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBnZW5lcmF0ZWQ/PC9saT4KKworPGxpPgorQmFzaWMgZ3VhcmFudGVlOiBhbnkgQVNUIHRoYXQgY291bGQgaGF2ZSBjb21lIGZyb20gcGFyc2luZyBhIHN5bnRhY3RpY2FsbHkKK2NvcnJlY3QgY29tcGlsYXRpb24gdW5pdCB3aWxsIHNlcmlhbGl6ZSB0byBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpczwvbGk+CisKKzx1bD4KKzxsaT4KKyhhKSBzeW50YWN0aWNhbGx5IGNvcnJlY3Q8L2xpPgorCis8bGk+CisoYikgc3Ryb25nbHkgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KKworPGxpPgorYW5kIHBvc3NpYmx5IChjKSBub3JtYWxpemVkOyB0aGF0IGlzLCBwYXJzZShzZXJpYWxpemUoeCkpIGlzIGlzb21vcnBoaWMKK3RvIHg8L2xpPgorPC91bD4KKworPGxpPgorVGhlcmUgYXJlIGxpa2VseSBtYW55IHdheXMgdG8gZ2V0IEFTVHMgdGhhdCBkbyBub3QgY29ycmVzcG9uZCB0byBhbnkgc3ludGFjdGljYWxseQorY29ycmVjdCBjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIHVzZSBpbGxlZ2FsIGlkZW50aWZpZXJzICgiMWFiYyIgb3IgInRyeSIgb3IgIi8vIikuPC9saT4KKworPGxpPgorRS5nLiwgdXNlIGlsbGVnYWwgbW9kaWZpZXIgY29tYmluYXRpb25zIHdpdGggbW9kaWZpZXIgYml0IG1hc2tzLjwvbGk+Cis8L3VsPgorCis8bGk+CitQb3N0LXNjcmVlbmluZyB0aGUgQVNUIGZvciBzeW50YWN0aWMgY29ycmVjdG5lc3Mgd291bGQgYmUgbWlzZ3VpZGVkLjwvbGk+CisKKzxsaT4KK1Nob3VsZCBqdXN0IGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSB0aGUgb2J2aW91cywgc3ludGFjdGljYWxseSBpbmNvcnJlY3QsCitjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzxsaT4KK01vcmUgaW1wb3J0YW50bHk6IGVuc3VyZSBzZW1hbnRpYyBlcXVpdmFsZW5jZS48L2xpPgorCis8bGk+CitPcGVyYXRvciBwcmVjZWRlbmNlIGNyZWF0ZXMgaXNzdWVzOjwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIGdpdmVuIEFTVCBmb3IgZXhwcmVzc2lvbiA8dHQ+djEqdjI8L3R0PiwgcmVwbGFjZSA8dHQ+djE8L3R0PiBub2RlCitieSBleHByZXNzaW9uIDx0dD52MSt2MzwvdHQ+LjwvbGk+CisKKzxsaT4KK05haXZlIHNlcmlhbGl6YXRpb24geWllbGRzIDx0dD52MSt2Myp2MjwvdHQ+IHdoaWNoIGlzIG5vdCBzZW1hbnRpY2FsbHkKK2VxdWl2YWxlbnQgdG8gdGhlIEFTVC48L2xpPgorCis8bGk+CitSZXN1bHQgc2hvdWxkIGJlICg8dHQ+djErdjMpKnYyPC90dD4uPC9saT4KKworPGxpPgorUGFyZW50aGVzZXMgbWF5IG5lZWQgdG8gYmUgaW50cm9kdWNlZCBkdXJpbmcgc2VyaWFsaXphdGlvbi48L2xpPgorPC91bD4KKworPGxpPgorTmVzdGVkIGlmIHN0YXRlbWVudCBjcmVhdGVzIGlzc3Vlczo8L2xpPgorCis8dWw+Cis8bGk+CitFLmcuLCBnaXZlbiBBU1QgZm9yIHN0YXRlbWVudCA8dHQ+aWYgKGEpIGYoKTsgZWxzZSBnKCk7PC90dD4sIHJlcGxhY2UgPHR0PmYoKTs8L3R0PgorYnkgPHR0PmlmIChiKSBoKCk7PC90dD48L2xpPgorCis8bGk+CitOYWl2ZSBzZXJpYWxpemF0aW9uIHlpZWxkcyA8dHQ+aWYgKGEpIGlmIChiKSBoKCk7IGVsc2UgZygpOzwvdHQ+PC9saT4KKworPGxpPgorUmVzdWx0IHNob3VsZCBiZSA8dHQ+aWYgKGEpIGlmIChiKSBoKCk7IDxiPmVsc2UgPC9iPjsgZWxzZSBnKCk7PC90dD48L2xpPgorCis8bGk+CitFeHRyYSB2ZXJiaWFnZSBtYXkgbmVlZCB0byBiZSBpbnRyb2R1Y2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorRGVlcCBDb25zdHJ1Y3RzPC9oMz4KKworPHVsPgorPGxpPgorU29tZSBwcm9ncmFtcyBpbnZvbHZlIGltcG9zc2libHkgZGVlcCBjb25zdHJ1Y3RzLjwvbGk+CisKKzxsaT4KK011bHRpLWxpbmUgc3RyaW5nIGNvbmNhdGVuYXRpb24gZXhwcmVzc2lvbnMgYXJlIHRoZSBtYWluIG9mZmVuZGVyLjwvbGk+CisKKzx1bD4KKzxsaT4KK0ZvciBleGFtcGxlLCA8dHQ+IkxpbmUgMVxcbiIrIkxpbmUgMlxcbiIrLi4uKyJMaW5lIDUwMDAiPC90dD48L2xpPgorPC91bD4KKworPGxpPgorUnVudGltZSBzdGFja3MgYmxvdyB3aGVuIHJlY3Vyc2luZyBvdmVyIGRlZXAgQVNUcy48L2xpPgorCis8bGk+CitBU1Qgbm9kZSB0eXBlcyBzaG91bGQgYmUgZGVzaWduZWQgdG8ga2VlcCB0cmVlcyByZWFzb25hYmx5IHNoYWxsb3cgZm9yCityZWFzb25hYmx5IHR5cGljYWwgcHJvZ3JhbXMuPC9saT4KKworPGxpPgorSW50cm9kdWNlIE4tYXJ5IG9wZXJhdG9yIGV4cHJlc3Npb24gbm9kZSB0eXBlIHRvIGRlYWwgd2l0aCBtdWx0aS1saW5lIHN0cmluZworY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucy48L2xpPgorCis8bGk+CitOLkIuIEN1cnJlbnQgY29tcGlsZXIgcGVyZm9ybXMgY29tcGlsZS10aW1lIGNvbmNhdGVuYXRpb25zIGR1cmluZyBwYXJzZQorcGhhc2UgdG8gZGVhbCB3aXRoIHRoaXMgcHJvYmxlbS48L2xpPgorPC91bD4KKworPGgzPgorRWRpdGluZyBQcm90b2NvbDwvaDM+CisKKzx1bD4KKzxsaT4KK1doYXQgZ2VuZXJhbCBmb3JtIHNob3VsZCB0aGUgZWRpdGluZyBBUEkgdGFrZT88L2xpPgorCis8bGk+CitTZXR0ZXJzIG9uIHJlY2VpdmVyIHRvIG1hbmlwdWxhdGUgaXRzIGNoaWxkcmVuIChwYXJlbnQgbmV2ZXIgYWZmZWN0ZWQpPC9saT4KKworPHVsPgorPGxpPgorRS5nLiwgd2hpbGVTdGF0ZW1lbnQuc2V0Q29uZGl0aW9uKG5ld0V4cHJlc3Npb24pPC9saT4KKworPGxpPgorVXNlIG51bGwgZm9yIG9wdGlvbmFsIGNoaWxkcmVuPC9saT4KKzwvdWw+CisKKzxsaT4KK1RyZWF0IGxpc3RzIGFzIGFuIGFycmF5LXZhbHVlZCBwcm9wZXJ0eS48L2xpPgorCis8dWw+Cis8bGk+CitFLmcuLCBibG9jay5nZXRTdGF0ZW1lbnRzKCkgcmV0dXJucyBTdGF0ZW1lbnRbXTwvbGk+CisKKzxsaT4KK0UuZy4sIGJsb2NrLnNldFN0YXRlbWVudHMoU3RhdGVtZW50W10gc3RhdGVtZW50cyk8L2xpPgorCis8bGk+CitVc2UgZW1wdHkgbGlzdCBmb3Igbm8gY2hpbGRyZW4gKHJhdGhlciB0aGFuIG51bGwpPC9saT4KKzwvdWw+CisKKzxsaT4KK0FsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBsaXN0czogdXNlIENvbGxlY3Rpb24tbGlrZSBwcm90b2NvbDwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIGJsb2NrLmFkZFN0YXRlbWVudChwb3MsIG5ld0NoaWxkU3RhdGVtZW50KTwvbGk+CisKKzxsaT4KK0UuZy4sIGJsb2NrLnJlbW92ZVN0YXRlbWVudChvbGRDaGlsZFN0YXRlbWVudCk8L2xpPgorCis8bGk+CitDb246IEluY3JlYXNlZCBudW1iZXIgb2YgbWV0aG9kcyBvbiBBUEk7IGJhZCB3aGVuIGEgbm9kZSB0eXBlIGhhcyBzZXZlcmFsCitsaXN0IHByb3BlcnRpZXMuPC9saT4KKzwvdWw+CisKKzxsaT4KK0FsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBkZWxldGUvcmVwbGFjZTogdXNlIHBhcmVudCBiYWNrcG9pbnRlcnMgdG8gaW1wbGVtZW50CitnZW5lcmljIGRlbGV0ZSBhbmQgcmVwbGFjZSBvcGVyYXRpb24gd2hpY2ggYWZmZWN0IHRoZSByZWNlaXZlcidzIHJlbGF0aW9uc2hpcAordG8gaXRzIHBhcmVudDwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIG9sZENoaWxkU3RhdGVtZW50LmRlbGV0ZSgpPC9saT4KKworPGxpPgorQ29uOiBzZW1hbnRpY3Mgb2YgZGVsZXRpb24gdWdseSB3aGVuIG5vZGUgb2NjdXJzIG91dHNpZGUgb2YgYW55IGxpc3Q8L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1VzZXIgRGF0YSBGaWVsZDwvaDM+CisKKzx1bD4KKzxsaT4KK0VhY2ggQVNUIG5vZGUgaGFzIGEgdXNlciBkYXRhIHNsb3QgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2UuPC9saT4KKworPGxpPgorQVNUTm9kZS5nZXRDbGllbnREYXRhKCkgcmV0dXJucyBPYmplY3Q8L2xpPgorCis8bGk+CitBU1ROb2RlLnNldENsaWVudERhdGEoT2JqZWN0IGRhdGEpPC9saT4KKworPGxpPgorVGhlIGluaXRpYWwgdmFsdWUgaXMgbnVsbC48L2xpPgorCis8bGk+CitDbGllbnQgbWF5IHVzZSBmb3IgZGVjb3JhdGlvbnMsIG9yIHdoYXRldmVyLjwvbGk+CisKKzxsaT4KK0FTVCBub2RlcyBjcmVhdGVkIGJ5IHBhcnNlciBjYXJyeSBubyBkYXRhIGluaXRpYWxseS48L2xpPgorCis8bGk+CitBU1Qgbm9kZXMgY3JlYXRlZCBleHBsaWNpdGx5IGNhcnJ5IG5vIGRhdGEgaW5pdGlhbGx5LjwvbGk+CisKKzxsaT4KK0V2ZW4gcmVhZC1vbmx5IEFTVHMgaGF2ZSByZWFkLXdyaXRlIGRhdGEgc2xvdHMuPC9saT4KKworPGxpPgorQ2xvbmluZyBhbiBBU1Qgbm9kZSBjcmVhdGVzIGEgbmV3IG5vZGUgKGRvZXMgPGI+bm90PC9iPiBjb3B5IG9yIGNsb25lIGRhdGEpLjwvbGk+Cis8L3VsPgorCis8aDM+CitMaXN0cyBvZiBNZW1iZXJzPC9oMz4KKworPHVsPgorPGxpPgorTGlzdCBvZiBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZSBtZW1iZXJzIG9mIGEgdHlwZSBkZWNsYXJhdGlvbi48L2xpPgorCis8bGk+CitUaGlzIGxpc3QgaXMgc3ludGFjdGljYWxseSBhbmQgc2VtYW50aWNhbGx5IGhldGVyb2dlbm91cy48L2xpPgorCis8bGk+CitObyBzeW50YWN0aWMgY29uc3RyYWludHMgb24gbnVtYmVyIGFuZCBvcmRlci48L2xpPgorCis8bGk+CitPcmRlciBpcyBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+CisKKzxsaT4KK1dpdGhpbiBmaWVsZCBkZWNsYXJhdGlvbnMsIHJlbGF0aXZlIG9yZGVyIGlzIHNlbWFudGljYWxseSBzaWduaWZpY2FudC48L2xpPgorCis8bGk+CitTdGFuZGFyZCBwcmFjdGljZXM6PC9saT4KKworPHVsPgorPGxpPgorUGxhY2UgZmllbGQgZGVjbGFyYXRpb25zIGJlZm9yZSBtZW1iZXIgbWV0aG9kcyBhbmQgdHlwZXMuPC9saT4KKworPGxpPgorUGxhY2UgdHlwZXMgYmVmb3JlIG1ldGhvZHMuPC9saT4KKzwvdWw+CisKKzxsaT4KK09wdGlvbiAoMSk6IGV4cG9zZSBzZXBhcmF0ZSBsaXN0cyBmb3IgZmllbGQsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitQcm86IFRoaXMgaXMgd2F5IGludGVybmFsIEFTVCB3b3Jrcy48L2xpPgorCis8bGk+CitQcm86IENvbnZlbmllbnQgZm9yIGNsaWVudHMgdG8gbG9jYXRlIG1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitDb246IE5vdCBmbGV4aWJsZSBmb3IgZWRpdGluZzsgZWRpdGluZyB3aWxsIG1hbmdsZSBtZW1iZXIgb3JkZXIuPC9saT4KKworPGxpPgorT3B0aW9uICgyKTogZXhwb3NlIGEgc2luZ2xlIGxpc3Qgb2YgbWVtYmVyczwvbGk+CisKKzxsaT4KK1BybzogcGFyc2VyIGRvZXMgbm90IG5vcm1hbGl6ZTsgY2xpZW50IGNvbnRyb2xzIG9yZGVyIG9mIG1lbWJlcnMuPC9saT4KKworPGxpPgorQ29uOiBNb3JlIHdvcmsgZm9yIGNsaWVudHMgdG8gbG9jYXRlIG1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitPcHRpb24gKDMpOiBleHBvc2UgYSBzaW5nbGUgbGlzdCBvZiBtZW1iZXJzLCB3aXRoIGV4dHJhIGdldHRlcnMgZm9yIGxvY2F0aW5nCittZW1iZXIgZmllbGRzLCBtZXRob2RzLCBhbmQgdHlwZXMuPC9saT4KKworPGxpPgorUHJvOiBDb21iaW5lcyBhZHZhbnRhZ2Ugb2YgKDIpIHdpdGggY29udmVuaWVuY2Ugb2YgKDEpLjwvbGk+CisKKzxsaT4KK1JlY29tbWVuZGVkIGFwcHJvYWNoOiAoMykuPC9saT4KKworPGxpPgorRm9yIGNsYXNzIGRlY2xhcmF0aW9ucywgdHJlYXQgaW5pdGlhbGl6ZXJzIGFuZCBjb25zdHJ1Y3RvcnMgYXMgbWVtYmVycy48L2xpPgorCis8dWw+Cis8bGk+CitMdW1wIGluc3RhbmNlIGFuZCBzdGF0aWMgaW5pdGlhbGl6ZXJzIGluIHdpdGggZmllbGQgZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK0x1bXAgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zIGluIHdpdGggbWV0aG9kIGRlY2xhcmF0aW9ucy48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1NlcmlhbGl6YXRpb248L2gzPgorCis8dWw+Cis8bGk+CitDbGllbnRzIG9mIHJlYWQtd3JpdGUgQVNUcyB3aWxsIGdlbmVyYWxseSB3YW50IHRvIHNlcmlhbGl6ZSB0byBhIEphdmEgY29tcGlsYXRpb24KK3VuaXQuPC9saT4KKworPGxpPgorU2VyaWFsaXphdGlvbiB2aWEgc2ltcGxlIEFTVCB0cmVlIHdhbGsuPC9saT4KKworPHVsPgorPGxpPgorU3RyYWlnaHRmb3J3YXJkLjwvbGk+CisKKzxsaT4KK0ludHJvZHVjZSBsaW5lIGJyZWFrcyBhbmQgd2hpdGVzcGFjZSB0byBtYWtlIGl0IGxvb2sgcHJldHR5LjwvbGk+CisKKzxsaT4KK09yIHBvc3QtcHJvY2VzcyBpdCB3aXRoIHRoZSBKYXZhIGZvcm1hdHRlci48L2xpPgorCis8bGk+CitJZiBBU1Qgb3JpZ2luYXRlZCBieSBwYXJzaW5nLCB0aGUgcmVzdWx0IGlzIGxpa2VseSB1bmFjY2VwdGFibGUgdG8gdXNlcjo8L2xpPgorCis8dWw+Cis8bGk+CitDb21wbGV0ZWx5IHJlZm9ybWF0dGVkLjwvbGk+CisKKzxsaT4KK0NvbnN0cnVjdHMgYXJlIG5vcm1hbGl6ZWQuPC9saT4KKworPGxpPgorU29tZSBjb21tZW50cyBtYXkgaGF2ZSBiZSBsb3N0LjwvbGk+Cis8L3VsPgorCis8bGk+CitDb3VsZCBiZSBwcm92aWRlZCBieSBBUEkgdGhhdCBtYWtlcyB1c2Ugb2YgcmVndWxhciBBU1QgQVBJIG9ubHkuPC9saT4KKworPGxpPgorQ291bGQgYmUgd3JpdHRlbiBieSBjbGllbnRzLjwvbGk+Cis8L3VsPgorCis8bGk+CitTZXJpYWxpemF0aW9uIHZpYSBzb3VyY2UgcmVjb25zdHJ1Y3Rpb24uPC9saT4KKworPHVsPgorPGxpPgorT25seSBhcHBsaWNhYmxlIHRvIEFTVHMgaW5pdGlhbGx5IGNvbnN0cnVjdGVkIGJ5IHBhcnNlci48L2xpPgorCis8bGk+CitVc2Ugc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGluIG1vZGlmaWVkIEFTVCB0byByZWNvbnN0cnVjdCBjb21waWxhdGlvbgordW5pdC48L2xpPgorCis8bGk+CitSZXRhaW4gcGFzc2FnZXMgb2Ygb3JpZ2luYWwgdGV4dCBjb3JyZXNwb25kaW5nIHRvIHVuY2hhbmdlZCBBU1QgdHJlZXMuPC9saT4KKworPGxpPgorR2VuZXJhdGVzIG5ldyB0ZXh0IG9ubHkgd2hlcmUgcmVxdWlyZWQuPC9saT4KKworPGxpPgorUHJvZHVjZSBhIHJlc3VsdCB0aGF0IGEgdXNlciB3aWxsIHJlY29nbml6ZSBhbmQgYWNjZXB0LjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByZXNlcnZlIGZvcm1hdHRpbmcgd2hlcmV2ZXIgcG9zc2libGUuPC9saT4KKworPGxpPgorUHJlc2VydmUmbmJzcDsgc291cmNlIGNvbnN0cnVjdCBub3JtYWxpemF0aW9uIHdoZXJldmVyIHBvc3NpYmxlLjwvbGk+CisKKzxsaT4KK1ByZXNlcnZlIGFyYml0cmFyaWx5LXBsYWNlZCBjb21tZW50cyB3aGVyZXZlciBwb3NzaWJsZS48L2xpPgorPC91bD4KKworPGxpPgorUmVxdWlyZXMgcmV0YWluaW5nIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0LCBhbmQgbGlrZWx5IHJlY29yZGluZworYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiBub2RlcyB0byBhbGxvdyByZWNvbnN0cnVjdGlvbi48L2xpPgorCis8bGk+CitUaGlzIGlzIHRoZSB3YXkgdGhlIGN1cnJlbnQgSkRPTSBpbXBsZW1lbnRhdGlvbiB3b3Jrcy48L2xpPgorCis8bGk+CitDb3VsZCBiZSBwcm92aWRlZCBieSBBUEkgdGhhdCBoYXMgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gQVNUIG5vZGVzIGFuZCBwYXJzZXItcmVjb3JkZWQKK2luZm9ybWF0aW9uLjwvbGk+CisKKzxsaT4KK1Nob3VsZCBhbHNvIHJldHVybiBhIGxpc3Qgb2YgZWRpdCBpbnN0cnVjdGlvbnMgc28gdGhhdCBtYXJrZXJzIGNhbiBiZSBhZGp1c3RlZCwKK2V0Yy48L2xpPgorCis8bGk+CitDbGllbnRzIHdvdWxkIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+UmVjb21tZW5kIGRlZmVycmluZyBpbXBsZW1lbnRhdGlvbiBvZiBzZXJpYWxpemVyCit0aGF0IGRvZXMgc291cmNlIHJlY29uc3RydWN0aW9uLjwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW4gaW50ZXJpbSwgcmVmYWN0b3JpbmcgY2FuIGFwcGx5IGVkaXRzIHRvIG9yaWdpbmFsCitjb21waWxhdGlvbiB1bml0IHRleHQgZGlyZWN0bHkuPC9mb250PjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorTm9kZSB0eXBlczwvaDM+CitUaGUgQVNUIG5vZGUgdHlwZXMgYXJlIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBncmFtbWFyIGZvciB0aGUgSmF2YSBsYW5ndWFnZQorZ2l2ZW4gaW4gdGhlIEpMUzIuCis8cD5FdmVyeSBBU1Qgbm9kZSBiZWxvbmdzIHRvIGEgc2luZ2xlIEFTVCBpbnN0YW5jZS4gKEluIERPTSB0ZXJtaW5vbG9neSwKK3RoZSBBU1QgaXMgdGhlIGRvY3VtZW50IGFuZCB0aGUgQVNUIG5vZGVzIGFyZSB0aGUgZWxlbWVudHMpLiBUaGUgQVNUIGluc3RhbmNlCitjYW4gc2VydmUgYXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgbm9kZXMuIE5vZGVzIHBvaW50IHRvIHRoZWlyIG93bmluZworQVNUIChmaXhlZCBmb3IgdGhlIG5vZGUncyBsaWZldGltZSkuIFRoZSBBU1QgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSByb290Citub2RlIChhIGNvbXBpbGF0aW9uIHVuaXQpLgorPHA+VGhlIEFTVCBub2RlIHR5cGVzIGRvIG5vdCBkZWZpbmUgdGhlaXIgb3duIG5vdGlvbiBvZiBlcXVhbGl0eTsgdGhleQoranVzdCBpbmhlcml0IHRoZSBvYmplY3QgaWRlbnRpdHkgYmFzZWQgaW1wbGVtZW50YXRpb24gZnJvbSBPYmplY3QuCis8cD5Ob3RlOiBHcmFtbWFyIHJ1bGVzIChpbiBjb21tZW50cykgYXJlIGV4cHJlc3NlZCBpbiB0aGUgUGFzY2FsLXN0eWxlCitleHRlbmRlZCBCTkYgdXNlZCBpbiA8dHQ+c2VjdGlvbiAxODwvdHQ+IG9mIEpMUzIuIFdlIHVzZSBDIyBzdHlsZSBwcm9wZXJ0eQorZGVjbGFyYXRpb25zIGFzIGEgY29udmVuaWVudCBhYmJyZXZpYXRpb24gZm9yIGEgc3RhbmRhcmQgbWF0Y2hlZCBwYWlyIG9mCitnZXQgYW5kIHNldCBtZXRob2RzLgorPHA+PHR0PnB1YmxpYyBjbGFzcyBBU1Q8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFTVCgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQ29tcGlsYXRpb25Vbml0IHJvb3Q7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyB2b2lkIGxvYWRGcm9tU291cmNlKGNoYXJbXSBzb3VyY2UpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKC4uLik7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjaGFyW10gc2VyaWFsaXplKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNUTm9kZTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcm90ZWN0ZWQgQVNUTm9kZShBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFTVCBnZXRPd25lcigpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50W10gc3RhcnRQb3NpdGlvbnM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnRbXSBsZW5ndGhzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgYm9vbGVhbiBpc1dob2xlTGluZTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE9iamVjdCBjbGllbnREYXRhOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUTm9kZSBnZXRQYXJlbnQoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uIG90aGVyIHByb3RvY29sIGNvbW1vbiB0byBhbGwgQVNUIG5vZGUgdHlwZXM8L3R0PgorPGg0PgorTmFtZXM8L2g0PgorQXMgZXhwbGFpbmVkIGluIEpMUzIgc2VjdGlvbiA2LjUsIHRoZSBncmFtbWFyIGRvZXMgbm90IGFsbG93IG5hbWVzIHRvIGJlCityZXNvbHZlZCBtb3JlIGZpbmVseSB0aGFuIHRoZSBmb2xsb3dpbmcgNiBjYXRlZ29yaWVzIGJ5IHN5bnRhY3RpYyBtZWFucworYWxvbmU6Cis8cD48dHQ+UGFja2FnZU5hbWU6PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitQYWNrYWdlTmFtZSAuIElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD5UeXBlTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1BhY2thZ2VPclR5cGVOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+RXhwcmVzc2lvbk5hbWU6PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitBbWJpZ3VvdXNOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+TWV0aG9kTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0FtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KKzxwPjx0dD5QYWNrYWdlT3JUeXBlTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1BhY2thZ2VPclR5cGVOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+QW1iaWd1b3VzTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0FtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KKzxwPkdpdmVuIHRoYXQgbmFtZXMgY2Fubm90IGJlIHJlc29sdmVkIGRlZmluaXRpdmVseSB0byBhIHBhY2thZ2UsIHR5cGUsCitmaWVsZCwgb3IgdmFyaWFibGUgYXQgQVNUIG5vZGUgY29uc3RydWN0aW9uIHRpbWUsIGFuIG9wZW4gcXVlc3Rpb24gaXMgaG93CittdWNoIG9mIHRoZSBjYXRlZ29yaXphdGlvbiB0aGF0IGNvdWxkIGJlIGRvbmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUKK0FTVC4gTW9yZSBjYXRlZ29yaWVzIG1lYW5zIG1vcmUgaW5mb3JtYXRpb24gZmxvdyBmcm9tIHRoZSBwYXJzZXIgdG8gdGhlCitBU1QgY2xpZW50OyBvbiB0aGUgb3RoZXIgaGFuZCwgYSB2YXJpZXR5IG9mIGNhdGVnb3JpZXMgaXMgbm90IG5lY2Vzc2FyaWx5Citjb252ZW5pZW50IGZvciBjbGllbnRzLiBGb3IgZXhhbXBsZSwgaW4gPHR0PmltcG9ydCBhLmIuYzwvdHQ+IHRoZSBuYW1lCitpcyBhIDx0dD5UeXBlTmFtZTwvdHQ+IHdoZXJlYXMgaW4gPHR0PmltcG9ydCBhLmIuYy4qPC90dD4gdGhlIG5hbWUgPHR0PmEuYi5jPC90dD4KK2lzIGEgPHR0PlBhY2thZ2VPclR5cGVOYW1lPC90dD4uIElmIHRoZSBuYW1lIGNhdGVnb3J5IHdhcyB0byBiZSByZWZsZWN0ZWQKK2luIHRoZSB0eXBlIG9mIHRoZSBBU1Qgbm9kZXMsIHRoZSBjbGllbnQgd291bGQgbmVlZCB0byBrbm93IHRvIGNyZWF0ZSB0aGUKK2FwcHJvcHJpYXRlIHR5cGUgb2YgbmFtZSBub2RlcyB3aGVuIGVkaXRpbmcgdGhlIEFTVC4KKzxwPlByb3Bvc2FsOiBVc2UgdHdvIEFTVCBub2RlIHR5cGVzIGZvciBuYW1lczogc2ltcGxlIG5hbWVzLCBhbmQgcXVhbGlmaWVkCituYW1lcy4gUXVhbGlmaWVkIG5hbWVzIGFyZSBleHByZXNzZWQgcmVjdXJzaXZlbHksIHRvIGZhY2lsaXRhdGUgY2xpZW50cworZGlzY292ZXJpbmcgaG93IHRoZSBxdWFsaWZpZXIgcGFydCBvZiBhIG5hbWUgcmVzb2x2ZXMuIFVzZSB0aGVzZSBmb3IgZXZlcnl0aGluZworYnV0IDx0dD5NZXRob2ROYW1lPC90dD47IGZvciA8dHQ+TWV0aG9kTmFtZTwvdHQ+LCB3aGljaCBjYW4gYXBwZWFyIG9ubHkKK2luIGEgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiwgc2VwYXJhdGUgdGhlIHNlbGVjdG9yIGlkZW50aWZpZXIgZnJvbQorYW55IHByZWNlZGluZyBxdWFsaWZpZXIuCis8cD4oTm90ZTogVGhlIGN1cnJlbnQgaW50ZXJuYWwgQVNUIG5vZGVzIGdvIGJleW9uZCBtYWtpbmcgdGhlIHNpbXBsZS9xdWFsaWZpZWQKK2Rpc3RpbmN0aW9uOiB0aGV5IGFsc28gaGF2ZSBzaW1wbGUgJmFtcDsgcXVhbGlmaWVkIHR5cGUgbmFtZXMgKGNsYXNzZXMKKzx0dD5TaW1wbGVUeXBlUmVmZXJlbmNlPC90dD4KK2FuZCA8dHQ+UXVhbGlmaWVkVHlwZVJlZmVyZW5jZTwvdHQ+KSBpbiBhZGRpdGlvbmFsIHRvIHNpbXBsZSAmYW1wOyBxdWFsaWZpZWQKK25hbWVkIChjbGFzc2VzIDx0dD5TaW1wbGVOYW1lUmVmZXJlbmNlPC90dD4gYW5kCis8dHQ+UXVhbGlmaWVkTmFtZVJlZmVyZW5jZTwvdHQ+KS4pCis8cD48dHQ+Ly8gTmFtZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworU2ltcGxlTmFtZTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitRdWFsaWZpZWROYW1lPC90dD4KKzxicj48dHQ+Ly8gU2ltcGxlTmFtZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vIFF1YWxpZmllZE5hbWU6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK05hbWUgPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElOYW1lIC8vICJtYXJrZXIiIGludGVyZmFjZTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZWRCaW5kaW5nKCk7Jm5ic3A7IC8vCitvcHRpb25hbDwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIFNpbXBsZU5hbWUgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSU5hbWUsIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBTaW1wbGVOYW1lKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIGlkZW50aWZpZXI7PC90dD4KKzxwPjx0dD5wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTmFtZSwgSUV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFF1YWxpZmllZE5hbWUoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJTmFtZSBxdWFsaWZpZXI7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gaWRlbnRpZmllcjs8L3R0PgorPGgzPgorQ29tcGlsYXRpb24gVW5pdHMgYW5kIE1ham9yIERlY2xhcmF0aW9uczwvaDM+Cis8dHQ+Ly8gQ29tcGlsYXRpb25Vbml0OjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+cGFja2FnZTwvdT48L2I+IElkZW50aWZpZXIgeyA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciB9IDxiPjx1Pjs8L3U+PC9iPiZuYnNwOworXTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7SW1wb3J0RGVjbGFyYXRpb259PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tUeXBlRGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj59PC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEFTVE5vZGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIENvbXBpbGF0aW9uVW5pdChBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE5hbWUgcGFja2FnZU5hbWU7IC8vIG9wdGlvbmFsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlRGVjbGFyYXRpb25bXSB0eXBlczs8L3R0PgorPHA+PHR0Pi8vIEltcG9ydERlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmltcG9ydDwvdT48L2I+CitJZGVudGlmaWVyIHsgPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXIgfSBbIDxiPjx1Pi48L3U+PC9iPiZuYnNwOyA8Yj48dT4qPC91PjwvYj4mbmJzcDsmbmJzcDsKK10KKzxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBJbXBvcnREZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEltcG9ydERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBpbXBvcnROYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgYm9vbGVhbiBvbkRlbWFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KKzxwPjx0dD4vLyBUeXBlRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gPGI+PHU+Y2xhc3M8L3U+PC9iPiBJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5leHRlbmRzPC91PjwvYj4gVHlwZV08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PmltcGxlbWVudHM8L3U+PC9iPiBUeXBlIHsgPGI+PHU+LDwvdT48L2I+IFR5cGV9XTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8Yj48dT57PC91PjwvYj4ge0NsYXNzQm9keURlY2xhcmF0aW9uIHwgPGI+PHU+OzwvdT48L2I+IH0gPGI+PHU+fTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gPGI+PHU+aW50ZXJmYWNlPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+ZXh0ZW5kczwvdT48L2I+IFR5cGUgeyA8Yj48dT4sPC91PjwvYj4gVHlwZX1dPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzxiPjx1Pns8L3U+PC9iPiB7SW50ZXJmYWNlQm9keURlY2xhcmF0aW9uIHwgPGI+PHU+OzwvdT48L2I+IH0gPGI+PHU+fTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8gTW9kaWZpZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cHVibGljPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5wcm90ZWN0ZWQ8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnByaXZhdGU8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN0YXRpYzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+YWJzdHJhY3Q8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZpbmFsPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uYXRpdmU8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN5bmNocm9uaXplZDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dHJhbnNpZW50PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT52b2xhdGlsZTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3RyaWN0ZnA8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vIENsYXNzQm9keURlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitNZXRob2REZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0ZpZWxkRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQ2xhc3NEZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitUeXBlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSW5pdGlhbGl6ZXI8L3R0PgorPGJyPjx0dD4vLyBJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK01ldGhvZERlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0ZpZWxkRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworVHlwZURlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50LAorSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgVHlwZURlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IG1vZGlmaWVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBuYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBzdXBlcmNsYXNzOyAvLyBvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZVtdIHN1cGVySW50ZXJmYWNlczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElNZW1iZXJbXSBtZW1iZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBjb252ZW5pZW5jZSBtZXRob2RzPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzOyAvLyBpbmNsdWRlcworY29uc3RhbnRzOyBleGNsdWRlcyBpbml0aWFsaXplcnM8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBnZXRNZXRob2RzOworLy8gaW5jbHVkZXMgY29uc3RydWN0b3JzPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElUeXBlQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Cis8cD48dHQ+Ly8gTWV0aG9kRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gKFR5cGUgfCA8Yj48dT52b2lkPC91PjwvYj4pIElkZW50aWZpZXIgPGI+PHU+KDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1tGb3JtYWxQYXJhbWV0ZXIgeyA8Yj48dT4sPC91PjwvYj4gRm9ybWFsUGFyYW1ldGVyfV0gPGI+PHU+KTwvdT48L2I+Jm5ic3A7Cit7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PnRocm93czwvdT48L2I+IFF1YWxpZmllZElkZW50aWZpZXJMaXN0XSAoIE1ldGhvZEJvZHkgfCA8Yj48dT47PC91PjwvYj4KKyk8L3R0PgorPGJyPjx0dD4vLyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7TW9kaWZpZXJ9IElkZW50aWZpZXIgPGI+PHU+KDwvdT48L2I+IFtGb3JtYWxQYXJhbWV0ZXIgeyA8Yj48dT4sPC91PjwvYj4KK0Zvcm1hbFBhcmFtZXRlcn1dIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+dGhyb3dzPC91PjwvYj4gUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdIE1ldGhvZEJvZHk8L3R0PgorPGJyPjx0dD4vLyBGb3JtYWxQYXJhbWV0ZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5maW5hbDwvdT48L2I+XSBUeXBlIElkZW50aWZpZXIgezxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj59PC90dD4KKzxicj48dHQ+cHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlCitpbXBsZW1lbnRzIElNZW1iZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHJvdGVjdGVkIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIHNlbGVjdG9yOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRm9ybWFsUGFyYW1ldGVyW10gcGFyYW1ldGVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE5hbWVbXSB0aHJvd25FeGNlcHRpb25zOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQmxvY2sgYm9keTsgLy8gb3B0aW9uYWw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgcmV0dXJuVHlwZTsgLy8gaW5jbHVkZXMKK3ZvaWQ8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgorPHA+PHR0Pi8vIEZpZWxkRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gVHlwZSBJZGVudGlmaWVyIHs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgorRXhwcmVzc2lvbl08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworeyA8Yj48dT4sPC91PjwvYj4gSWRlbnRpZmllciB7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn0gWyA8Yj48dT49PC91PjwvYj4KK0V4cHJlc3Npb25dIH08L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IG1vZGlmaWVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBuYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gaW5pdGlhbGl6ZXI7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUZpZWxkQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Cis8cD48dHQ+Ly8gSW5pdGlhbGl6ZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5zdGF0aWM8L3U+PC9iPl0gQmxvY2s8L3R0PgorPGJyPjx0dD5wdWJsaWMgZmluYWwgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW5pdGlhbGl6ZXIoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQmxvY2sgYm9keTs8L3R0PgorPHA+PHR0Pi8vIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PmZpbmFsPC91PjwvYj5dIFR5cGUgSWRlbnRpZmllciB7PGI+PHU+W108L3U+PC9iPn0gWyA8Yj48dT49PC91PjwvYj4KK0V4cHJlc3Npb24gXTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7IDxiPjx1Piw8L3U+PC9iPiBJZGVudGlmaWVyIHs8Yj48dT5bXTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPiBFeHByZXNzaW9uXQorfSA8Yj48dT47PC91PjwvYj48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzCitJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8KK29wdGlvbmFsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJTG9jYWxWYXJpYWJsZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgorPGJyPiZuYnNwOworPGg0PgorVHlwZXM8L2g0PgorVGhlIFR5cGUgbm9kZSAoPSBUeXBlUmVmZXJlbmNlKSByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGEgYmFzZSB0eXBlLAorYSBuYW1lZCB0eXBlLCBvciBhbiBhcnJheSB0aGVyZW9mLgorPHA+PHR0Pi8vIFR5cGU6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyhCYXNpY1R5cGUgfCBUeXBlTmFtZSApIHs8Yj48dT5bXTwvdT48L2I+fTwvdHQ+Cis8YnI+PHR0Pi8vIEJhc2ljVHlwZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5ieXRlPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zaG9ydDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+Y2hhcjwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aW50PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5sb25nPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5mbG9hdDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZG91YmxlPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5ib29sZWFuPC91PjwvYj48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgVHlwZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgVHlwZSAoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgYmFzZVR5cGU7IC8vIGVpdGhlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSB0eXBlTmFtZTsgLy8gb3I8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBkaW1lbnNpb25zOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZWRUeXBlKCk7PC90dD4KKzxoND4KK1N0YXRlbWVudHM8L2g0PgorVGhlcmUgaXMgYSBkaWZmZXJlbnQgQVNUIG5vZGUgdHlwZSBmb3IgZWFjaCBkaWZmZXJlbnQga2luZCBvZiBzdGF0ZW1lbnQuCitVc2UgYSAibWFya2VyIiBpbnRlcmZhY2UgKDx0dD5JU3RhdGVtZW50PC90dD4pIHRvIGJyaW5nIGFsbCBjb25zdHJ1Y3RzCit0aGF0IGNhbiBhcHBlYXIgd2l0aGluIGEgYmxvY2sgKG5vbnRlcm1pbmFsIDx0dD5CbG9ja1N0YXRlbWVudDwvdHQ+LCB3aGljaAoraW5jbHVkZXMgbG9jYWwgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zKS4KKzxwPjx0dD4vLyBCbG9jazo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT57PC91PjwvYj4KK0Jsb2NrU3RhdGVtZW50IDxiPjx1Pn08L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vIEJsb2NrU3RhdGVtZW50IDo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUeXBlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBbSWRlbnRpZmllcgorPGI+PHU+OjwvdT48L2I+CitdIFN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0Pi8vU3RhdGVtZW50OjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJsb2NrPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aWYKKyg8L3U+PC9iPkV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudCBbPGI+PHU+ZWxzZTwvdT48L2I+IFN0YXRlbWVudF08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5mb3IKKyg8L3U+PC9iPiBGb3JJbml0T3B0Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPiZuYnNwOyZuYnNwOyBbRXhwcmVzc2lvbl0KKzxiPjx1Pjs8L3U+PC9iPiZuYnNwOyZuYnNwOworRm9yVXBkYXRlT3B0IDxiPjx1Pik8L3U+PC9iPiBTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT53aGlsZQorKDwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmRvPC91PjwvYj4KK1N0YXRlbWVudCA8Yj48dT53aGlsZTwvdT48L2I+IDxiPjx1Pig8L3U+PC9iPiBFeHByZXNzaW9uCis8Yj48dT4pOzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dHJ5PC91PjwvYj4KK0Jsb2NrIFtDYXRjaGVzXSBbIDxiPjx1PmZpbmFsbHk8L3U+PC9iPiBCbG9jayBdPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3dpdGNoCisoPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gPGI+PHU+ezwvdT48L2I+IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzCis8Yj48dT59PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zeW5jaHJvbml6ZWQKKyg8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pik8L3U+PC9iPiBCbG9jazwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnJldHVybjwvdT48L2I+CitbRXhwcmVzc2lvbl0gPGI+PHU+OzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dGhyb3c8L3U+PC9iPgorRXhwcmVzc2lvbiZuYnNwOyZuYnNwOyA8Yj48dT47PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5icmVhazwvdT48L2I+CitbSWRlbnRpZmllcl0mbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+Y29udGludWU8L3U+PC9iPgorW0lkZW50aWZpZXJdJm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEV4cHJlc3Npb25TdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJZGVudGlmaWVyCis8Yj48dT46PC91PjwvYj4KK1N0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlbWVudCZuYnNwOyAvLyAibWFya2VyIiBpbnRlcmZhY2U8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBCbG9jayBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBCbG9jayhBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzOzwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJZlN0YXRlbWVudChBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHRlc3Q7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJU3RhdGVtZW50IHRoZW5QYXJ0OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSVN0YXRlbWVudCBlbHNlUGFydDsmbmJzcDsgLy8KK29wdGlvbmFsPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIEZvclN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBEb1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBUcnlTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBSZXR1cm5TdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgVGhyb3dTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgQnJlYWtTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgQ29udGludWVTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgTnVsbFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIEFzc2VydFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+RXhwcmVzc2lvbiBTdGF0ZW1lbnRzPC9mb250PjwvaDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q2VydGFpbiB0eXBlcyBvZiBleHByZXNzaW9ucyBjYW4gYWxzbyBhcHBlYXIgYXMgc3RhdGVtZW50cy4KK1RoZSBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUgd3JhcHMgYW4gZXhwcmVzc2lvbiB1cCBhcyBhIHN0YXRlbWVudC4gVGhlCitzb3VyY2UgcmFuZ2UgZm9yIHRoZSBFeHByZXNzaW9uU3RhdGVtZW50IGluY2x1ZGVzIHRoZSB0cmFpbGluZyBzZW1pY29sb24uPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDAwIj48L2ZvbnQ+Cis8cD48dHQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPnB1YmxpYyBjbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZQoraW1wbGVtZW50cyBJU3RhdGVtZW50PC9mb250PjwvdHQ+Cis8YnI+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEV4cHJlc3Npb25TdGF0ZW1lbnQoQVNUCithc3QpOzwvZm9udD48L3R0PgorPGJyPjx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbgorZXhwcmVzc2lvbjs8L2ZvbnQ+PC90dD4KKzxoND4KK0V4cHJlc3Npb25zPC9oND4KK1RoZXJlIGlzIGEgZGlmZmVyZW50IEFTVCBub2RlIHR5cGUgZm9yIGVhY2ggZGlmZmVyZW50IGtpbmQgb2YgZXhwcmVzc2lvbi4KK1VzZSBhICJtYXJrZXIiIGludGVyZmFjZSAoPHR0PklFeHByZXNzaW9uPC90dD4pIHRvIGJyaW5nIGFsbCBjb25zdHJ1Y3RzCit0aGF0IGNhbiBhcHBlYXIgYXMgZXhwcmVzc2lvbnMuCis8cD4oTWFueSBkZXRhaWxzIFRCRCkuCis8cD48dHQ+Ly8gRXhwcmVzc2lvbjo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1N0cmluZ0xpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworRmxvYXRpbmdQb2ludExpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQm9vbGVhbkxpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQ2hhcmFjdGVyTGl0ZXJhbDwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitTdHJpbmdMaXRlcmFsPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK051bGxMaXRlcmFsPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyggVHlwZSB8IDxiPjx1PnZvaWQ8L3U+PC9iPiApIDxiPjx1Pi48L3U+PC9iPiBjbGFzczwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT50aGlzPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT4oPC91PjwvYj4KK0V4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1sgRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5uZXc8L3U+PC9iPiBUeXBlIDxiPjx1Pig8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+IFsgQ2xhc3NCb2R5CitdPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBDbGFzc05hbWUgPGI+PHU+LjwvdT48L2I+IF0gPGI+PHU+c3VwZXIgLjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworTWV0aG9kTmFtZSA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXIgPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+PHU+LDwvdT48L2I+CitFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBDbGFzc05hbWUgPGI+PHU+LjwvdT48L2I+IF0gPGI+PHU+c3VwZXIgLjwvdT48L2I+IElkZW50aWZpZXIgPGI+KDwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBFeHByZXNzaW9uIHsgPGI+PHU+LDwvdT48L2I+IEV4cHJlc3Npb24gfSBdIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIDxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIDxiPjx1Pmluc3RhbmNlb2Y8L3U+PC9iPiBUeXBlPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gUG9zdGZpeE9wZXJhdG9yPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1ByZWZpeE9wZXJhdG9yIEV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT4oPC91PjwvYj4KK1R5cGUgPGI+PHU+KTwvdT48L2I+IEV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworRXhwcmVzc2lvbiA8Yj48dT4/PC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT46PC91PjwvYj4gRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIEFzc2lnbm1lbnRPcGVyYXRvciBFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQXJyYXlJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb24mbmJzcDsgLy8gIm1hcmtlciIgaW50ZXJmYWNlPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZFR5cGUoKTsmbmJzcDsgLy8gb3B0aW9uYWw8L3R0PgorPHA+PHR0Pi8vIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1ByaW1pdGl2ZVR5cGUgPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IHsgPGI+PHU+WzwvdT48L2I+CitFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPiB9IHsgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB9PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1R5cGVOYW1lIDxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPiB7Cis8Yj48dT5bPC91PjwvYj4gRXhwcmVzc2lvbgorPGI+PHU+XTwvdT48L2I+Cit9IHsgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB9PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1ByaW1pdGl2ZVR5cGUgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB7IDxiPjx1PltdPC91PjwvYj4gfSBBcnJheUluaXRpYWxpemVyPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1R5cGVOYW1lIDxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj4geyA8Yj48dT5bXTwvdT48L2I+IH0gQXJyYXlJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRXhwcmVzc2lvbltdIGRpbWVuc2lvbnM7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRXhwcmVzc2lvbiBhcnJheUluaXRpYWxpemVyOworLy8gb3B0aW9uYWw8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBTdHJpbmdMaXRlcmFsKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgU3RyaW5nIHZhbHVlOzwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBDYXN0RXhwcmVzc2lvbihBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgdHlwZTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHZhbHVlOzwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIEluZml4RXhwcmVzc2lvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW5maXhFeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IGluZml4T3BlcmF0b3I7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uW10gZXh0ZW5kZWRPcGVyYW5kczsmbmJzcDsKKy8vIEwgb3AgUiBvcCBSMiBvcCBSMy4uLjwvdHQ+Cis8aDM+CitCaW5kaW5nczwvaDM+CitUaGUgIndvcmxkIG9mIGJpbmRpbmdzIiBpcyBhbiBpbnRlZ3JhdGVkIHBpY3R1cmUgb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUKK3Byb2dyYW0gYXMgc2VlbiBmcm9tIHRoZSBjb21waWxlcidzIHBvaW50IG9mIHZpZXcuIFRoZSBiaW5kaW5ncyBjb3JyZXNwb25kCit0byBuYW1lZCBlbnRpdGllcyAocGFja2FnZXMsIHR5cGVzLCBmaWVsZHMsIG1ldGhvZHMsIGxvY2FsIHZhcmlhYmxlcykuCis8cD5DbGllbnRzIG5hdmlnYXRlIGZyb20gQVNUIG5vZGVzIGludG8gdGhlIHdvcmxkIG9mIGJpbmRpbmdzIHRvIGRpc2NvdmVyCit0aGluZ3MgbGlrZToKKzx1bD4KKzxsaT4KK3RoZSBlbnRpdHkgYW4gaWRlbnRpZmllciByZXNvbHZlcyB0bzwvbGk+CisKKzxsaT4KK3RoZSByZXNvbHZlZCB0eXBlIG9mIGFuIGV4cHJlc3Npb24gbm9kZTwvbGk+CisKKzxsaT4KK3RoZSByZXNvbHZlZCBiaW5kaW5nIG9mIGEgZGVjbGFyYXRpb24gbm9kZTwvbGk+CisKKzxsaT4KK290aGVycz88L2xpPgorPC91bD4KK09uY2UgaW4gdGhlIHdvcmxkIG9mIGJpbmRpbmdzLCB0aGUgY2xpZW50IGNhbiBuYXZpZ2F0ZSB0aGUgd2ViIG9mIGJpbmRpbmdzOgorPHVsPgorPGxpPgorZnJvbSBhcnJheSB0eXBlIHRvIGl0cyBjb21wb25lbnQgdHlwZSwgYW5kIHZpY2UgdmVyc2E8L2xpPgorCis8bGk+Citmcm9tIGZpZWxkIG9yIHZhcmlhYmxlIHRvIGl0cyBkZWNsYXJlZCB0eXBlPC9saT4KKworPGxpPgorZnJvbSBtZXRob2QgdG8gaXRzIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzPC9saT4KKworPGxpPgorZnJvbSB0eXBlIHRvIGl0cyBjb25zdHJ1Y3RvcnMgYW5kIGl0cyBkZWNsYXJlZCBtZXRob2QsIGZpZWxkLCBhbmQgdHlwZQorbWVtYmVyczwvbGk+CisKKzxsaT4KK2Zyb20gY29uc3RydWN0b3IsIG1ldGhvZCwgb3IgZmllbGQgdG8gaXRzIGRlY2xhcmluZyB0eXBlPC9saT4KKworPGxpPgorZnJvbSBuZXN0ZWQgdHlwZSB0byBpdHMgZW5jbG9zaW5nIHR5cGU8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gZGVjbGFyaW5nIHBhY2thZ2U8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gaXRzIHN1cGVydHlwZXMgKGJ1dCwgc2lnbmlmaWNhbnRseSwgPGk+bm90PC9pPiB0byBpdHMgc3VidHlwZXMpPC9saT4KKworPGxpPgorZGlyZWN0bHkgdG8gdGhlIGJpbmRpbmcgZm9yIGFueSBiYXNlIHR5cGUgKGludCwgZmxvYXQsIGNoYXIsIGV0Yy4pPC9saT4KKworPGxpPgorZGlyZWN0bHkgdG8gdGhlIGJpbmRpbmcgZm9yIGEgaGFuZGZ1bCBvZiB3ZWxsLWtub3duIHR5cGVzIChqYXZhLmxhbmcuT2JqZWN0LAorZXRjLik8L2xpPgorPC91bD4KK1NvbWUgb2YgdGhlIG5hdmlnYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKHF1aXRlIGludGVudGlvbmFsbHkpOgorPHVsPgorPGxpPgorZnJvbSBwYWNrYWdlIHRvIGl0cyAoa25vd24pIHR5cGVzIC0gdmVyeSBleHBlbnNpdmU8L2xpPgorCis8bGk+Citmcm9tIHBhY2thZ2UgdG8gb25lIG9mIGl0cyB0eXBlcyBieSBuYW1lIC0gdmVyeSBleHBlbnNpdmU8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gaXRzIChrbm93bikgc3VidHlwZXMgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+CisKKzxsaT4KK2Zyb20gdHlwZSBvciBtZXRob2QgdG8gdGhlIGxvY2FsIHR5cGVzIGl0IGVuY2xvc2VzIC0gYmluZGluZyBmb3IgbG9jYWwKK3R5cGVzIGFyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRob3NlIHdpdGggdGhlIGVuY2xvc2luZyB0eXBlJ3MgQVNUIGluIHRoZWlyCitoYW5kPC9saT4KKworPGxpPgorZnJvbSBtZXRob2QgdG8gdGhlIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoaW4gaXQgLSBiaW5kaW5nIGZvciB2YXJpYWJsZXMKK2FyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRob3NlIHdpdGggdGhlIG1ldGhvZCdzIEFTVCBpbiB0aGVpciBoYW5kPC9saT4KKzwvdWw+CitUaGVyZSBhcmUgbm8gbGlua3MgZnJvbSB0aGUgd29ybGQgb2YgYmluZGluZ3MgYmFjayB0byB0aGUgd29ybGQgb2YgQVNUcy4KKzxwPk90aGVyIHRoaW5ncyBkZWFsdCB3aXRoIGluIHRoZSB3b3JsZCBvZiBiaW5kaW5nczoKKzx1bD4KKzxsaT4KK3N5bnRoZXRpYyBlbnRpdGllcyBzdGVtbWluZyBmcm9tIGRlZmF1bHQgY29uc3RydWN0b3JzLCBhYnN0cmFjdCBtZXRob2QKK2NvcHktZG93biBmcm9tIGludGVyZmFjZXMsIGFuZCBpbm5lciBjbGFzcyBlbXVsYXRpb248L2xpPgorCis8bGk+CittaXNzaW5nIGJpbmRpbmdzIGZvciBlbnRpdGllcyB0aGF0IGFyZSByZXF1aXJlZCAobWVudGlvbmVkIGJ5IG5hbWUpIGJ1dAord2VyZSBub3QgZm91bmQ8L2xpPgorCis8bGk+Cit0eXBlIGhpZXJhY2h5IGNpcmN1bGFyaXRpZXM8L2xpPgorCis8bGk+CitpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXM8L2xpPgorPC91bD4KK090aGVyIGlzc3VlczoKKzx1bD4KKzxsaT4KK0NvbXBpbGUtdGltZS1jb21wdXRlZCB2YWx1ZXMgZm9yIGNvbnN0YW50cyAocHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMKK3dpdGggY29tcGlsZS10aW1lIGNvbXB1dGFibGUgdmFsdWVzKTwvbGk+Cis8L3VsPgorCis8aDQ+CitFeGlzdGluZyBCaW5kaW5nIGNsYXNzZXM8L2g0PgorVG8gZ2l2ZSBhbiBpZGVhIG9mIHRoZSBzY29wZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZyBpbmZyYXN0cnVjdHVyZSwgYmVsb3cKK2lzIGEgZHVtcCBvZiB0aGUgdHlwZSBoaWVyYXJjaHkgb2YgdGhlIGNvbXBpbGVyJ3MgYmluZGluZyBjbGFzc2VzIGZyb20KK3BhY2thZ2UgPHR0PnJnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDwvdHQ+LgorPHA+PHR0PnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBmaW5hbCBjbGFzcyBCYXNlVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzCitSZWZlcmVuY2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitwdWJsaWMgY2xhc3MgU291cmNlVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBjbGFzcyBOZXN0ZWRUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGZpbmFsIGNsYXNzIExvY2FsVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZW1iZXJUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitwdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFBhY2thZ2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBQcm9ibGVtUGFja2FnZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBjbGFzcyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIEZpZWxkQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFN5bnRoZXRpY0ZpZWxkQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFByb2JsZW1GaWVsZEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIE1ldGhvZEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1NZXRob2RCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBJbXBvcnRCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBQcm9ibGVtQmluZGluZzwvdHQ+Cis8aDQ+CitCaW5kaW5nIEFQSTwvaDQ+CitUaGUgZXhpc3RpbmcgYmluZGluZyBjbGFzc2VzIGFyZSBub3QgaW1tZWRpYXRlbHkgc3VpdGFibGUgZm9yIGV4cG9zaW5nCithcyBhIGJpbmRpbmcgQVBJLgorPHA+SG93ZXZlciwgdGhlIEphdmEgYnVpbGRlciBkb2VzIGhhdmUgYW4gQVBJIGZvciB0aGUgYnVpbHQgImltYWdlIiwgaW4KK3BhY2thZ2UgPHR0Pm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI8L3R0Pi4gKFRoaXMgQVBJIGlzIGEKK2hvbGQtb3ZlciBmcm9tIExlYXBmcm9nIGVyYSwgYW5kIGlzIG5vdCBleHBvc2VkIGluIHRoZSBFY2xpcHNlIGNvZGUgYmFzZSkuCitUaGlzIEFQSSB3YXMgZGVzaWduZWQgdG8gZXhwb3NlIHRoZSBzYW1lIGtpbmQgb2YgaW50ZWdyYXRlZCBwaWN0dXJlIG9mCit0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9ncmFtIGFzIHNlZW4gZnJvbSB0aGUgY29tcGlsZXIncyBwb2ludCBvZiB2aWV3LgorVGhpcyBBUEkgaGFzIGEgZGV0YWlsZWQgc3BlY2lmaWNhdGlvbiB0aGF0IGRvZXMgbm90IGV4cG9zZSBpbXBsZW1lbnRhdGlvbgorZGV0YWlscywgc28gdGhlIHByb3Bvc2FsIGlzIHRvIHVzZSBpdCBhcyB0aGUgYmFzaXMgZm9yIHRoZSBuZXcgYmluZGluZworQVBJLgorPHA+UmUtcHVycG9zaW5nIHRoaXMgQVBJIHdvdWxkIGVudGFpbDoKKzx1bD4KKzxsaT4KK2ludHJvZHVjaW5nIGVudGl0aWVzIGZvciBsb2NhbCB2YXJpYWJsZXM8L2xpPgorCis8bGk+CityZW1vdmluZyBwcm90b2NvbCBmb3IgbmF2aWdhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAoZS5nLiwgZnJvbSBwYWNrYWdlCit0byBpdHMga25vd24gdHlwZXMpPC9saT4KKworPGxpPgorcmVtb3ZpbmcgdW5uZWVkZWQgcHJvdG9jb2w7IGluY2x1ZGluZyBzdGF0ZXMsIG5vbi1zdGF0ZS1zcGVjaWZpYyBoYW5kbGVzLAorZGVsdGFzLCByZXBvcnQgY2FyZHMsIGRlcGVuZGVuY3kgZ3JhcGgsIHBhY2thZ2UgcmVmZXJlbmNlczwvbGk+Cis8L3VsPgorQmVsb3cgaXMgYSBkdW1wIG9mIHRoZSByZWxldmFudCBpbnRlcmZhY2VzIGZyb20gcGFja2FnZSA8dHQ+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjwvdHQ+LgorVW5uZWNlc3NhcnkgcHJvdG9jb2wgaGFzIGJlZW4gb21pdHRlZC4gKE5vdGUgdGhhdCBOb3RQcmVzZW50RXhjZXB0aW9uIGlzCithbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCBhbmQgd291bGQgbm90IGJlIHJlcXVpcmVkLikKKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9JTUFHRSA9IDE7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfUEFDS0FHRSA9IDI7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfVFlQRSA9IDM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfRklFTEQgPSA0OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgS19KQVZBX01FVEhPRCA9IDU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfQ09OU1RSVUNUT1IgPSA2OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGhhc2hDb2RlKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNGaWN0aW9uYWwoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGtpbmQoKTs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU1lbWJlciBleHRlbmRzIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0TmFtZSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQmluYXJ5KCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNTeW50aGV0aWMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2UgZXh0ZW5kcyBJSGFuZGxlPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRDbGFzc0hhbmRsZShTdHJpbmcgbmFtZSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNVbm5hbWVkKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElUeXBlIGV4dGVuZHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0QXJyYXlIYW5kbGUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJQ29uc3RydWN0b3IgZ2V0Q29uc3RydWN0b3JIYW5kbGUoSVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RGVjbGFyZWRDbGFzc2VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElDb25zdHJ1Y3RvcltdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgdGhyb3dzCitOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJTWV0aG9kW10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXREZWNsYXJlZE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0RGVjbGFyZWROYW1lKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldERlY2xhcmluZ0NsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElGaWVsZCBnZXRGaWVsZEhhbmRsZShTdHJpbmcgbmFtZSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0SW50ZXJmYWNlcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJTWV0aG9kIGdldE1ldGhvZEhhbmRsZShTdHJpbmcgbmFtZSwgSVR5cGVbXQorcGFyYW1ldGVyVHlwZXMpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgZ2V0TW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElQYWNrYWdlIGdldFBhY2thZ2UoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldFNpbXBsZU5hbWUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0U3VwZXJjbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQW5vbnltb3VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNBcnJheSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQmluYXJ5KCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNDbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzSW5uZXJDbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzSW50ZXJmYWNlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNMb2NhbCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUGFja2FnZU1lbWJlcigpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJpbWl0aXZlKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNTeW50aGV0aWMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1RvcExldmVsKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElNZXRob2QgZXh0ZW5kcyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZVtdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8cD48dHQ+cHVibGljIGludGVyZmFjZSBJQ29uc3RydWN0b3IgZXh0ZW5kcyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZVtdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkIGV4dGVuZHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0VHlwZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8cD5JbiB0aGlzIHZlaW4sIHRoZSBpbnRlcmZhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcyB3b3VsZCBsb29rIHNvbWV0aGluZworbGlrZToKKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElWYXJpYWJsZSBleHRlbmRzIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldERlY2xhcmluZ0NsYXNzKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXRNb2RpZmllcnMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KKzxwPkFsc28gd2lsbCBuZWVkIHRvIGFkZDoKKzx1bD4KKzxsaT4KK1BzZXVkby1iaW5kaW5ncyBmb3IgYmFzZSB0eXBlczogYm9vbGVhbiwgaW50LCBmbG9hdCwgZXRjLjwvbGk+CisKKzxsaT4KK0FjY2VzcyB0byB3ZWxsLWtub3duIGphdmEubGFuZyBiaW5kaW5nczogT2JqZWN0LCBTdHJpbmcsIFRocm93YWJsZSwgRXhjZXB0aW9uLAorUnVudGltZUV4Y2VwdGlvbiwgRXJyb3IsIENsYXNzLjwvbGk+Cis8L3VsPgorCis8aDM+CitEb2N1bWVudCBIaXN0b3J5PC9oMz4KKzE4OjMwIFRodXJzZGF5IFNlcHRlbWJlciAyNywgMjAwMSAtIGluY29ycG9yYXRlZCBmaXJzdCByb3VuZCBjb21tZW50cyBmcm9tCitQTSBhbmQgREIuCis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjEwOjQ1IE1vbmRheSBPY3RvYmVyIDEsIDIwMDEgLSBpbmNvcnBvcmF0ZWQgY29tbWVudHMKK2Zyb20gREIuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4xMDo0NSBUdWVzZGF5IE9jdG9iZXIgMiwgMjAwMSAtIGNsYXJpZnkgaGFuZGluZworb2YgRXhwcmVzc2lvblN0YXRlbWVudC48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjE0OjAwIEZyaWRheSBPY3RvYmVyIDI2LCAyMDAxIC0gYWRkIHN1YnRyZWUgc3RydWN0dXJhbAorZXF1YWxpdHkuPC9mb250PgorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2V4YW1wbGUtYXN0LnR4dCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9leGFtcGxlLWFzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3MTRmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9leGFtcGxlLWFzdC50eHQKQEAgLTAsMCArMSwxMTAgQEAKK0V4YW1wbGUgQVNUCis9PT09PT09PT09PQorCitUaGUgSmF2YSBwcm9ncmFtIHNob3duIGluIHNvdXJjZSBmb3JtIGZpcnN0IGlzIGZvbGxvd2VkIGJ5IGEgcmVwcmVzZW50YXRpb24KK29mIG9mIGl0cyBBU1QuCisKKz09PT09PT09PT09PT09PT0KK3BhY2thZ2UgY29tLmV4YW1wbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGQgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIgKyAiIHdvcmxkIik7CisJfQorfQorPT09PT09PT09PT09PT09PQorPENvbXBpbGF0aW9uVW5pdAorCXBhY2thZ2U6CisJPFBhY2thZ2VEZWNsYXJhdGlvbgorCQluYW1lOgorCQk8UXVhbGlmaWVkTmFtZQorCQkJcXVhbGlmaWVyOiA8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiY29tIj4KKwkJCW5hbWU6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJleGFtcGxlIj4KKwkJPgorCT4KKwlpbXBvcnRzOgorCQlbCisJCTxJbXBvcnREZWNsYXJhdGlvbgorCQkJbmFtZToKKwkJCQk8UXVhbGlmaWVkTmFtZQorCQkJCQlxdWFsaWZpZXI6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJqYXZhIj4KKwkJCQkJbmFtZTogPFNpbXBsZU5hbWUgaWRlbnRpZmllcjogInV0aWwiPgorCQkJCT4KKwkJCWlzT25EZW1hbmQ6IHRydWUKKwkJPgorCQldCisJdHlwZXM6CisJCVsKKwkJPFR5cGVEZWNsYXJhdGlvbgorCQkJaXNJbnRlcmZhY2U6IGZhbHNlCisJCQltb2RpZmllcnM6IElNb2RpZmllci5QVUJMSUMKKwkJCW5hbWU6CisJCQkJPFNpbXBsZU5hbWUgaWRlbnRpZmllcjogIkhlbGxvV29ybGQiPgorCQkJc3VwZXJjbGFzczogbnVsbAorCQkJc3VwZXJJbnRlcmZhY2VzOiBbXQorCQkJYm9keURlY2xhcmF0aW9uczoKKwkJCQlbCisJCQkJPE1ldGhvZERlY2xhcmF0aW9uCisJCQkJCWlzQ29uc3RydWN0b3I6IGZhbHNlCisJCQkJCW1vZGlmaWVyczogSU1vZGlmaWVyLlBVQkxJQyB8IElNb2RpZmllci5TVEFUSUMKKwkJCQkJc2VsZWN0b3I6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJtYWluIj4KKwkJCQkJcmV0dXJuVHlwZToKKwkJCQkJCTxQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGVDb2RlOiBQcmltaXRpdmVUeXBlLlZPSUQ+CisJCQkJCXBhcmFtZXRlcnM6CisJCQkJCQlbCisJCQkJCQk8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgorCQkJCQkJCW1vZGlmaWVyczogSU1vZGlmaWVyLk5PTkUKKwkJCQkJCQl0eXBlOgorCQkJCQkJCQk8QXJyYXlUeXBlCisJCQkJCQkJCQljb21wb25lbnRUeXBlOgorCQkJCQkJCQkJCTxTaW1wbGVUeXBlCisJCQkJCQkJCQkJCW5hbWU6CisJCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiU3RyaW5nIj4KKwkJCQkJCQkJCQk+CisJCQkJCQkJCQk+CisJCQkJCQkJCT4KKwkJCQkJCQluYW1lOgorCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiYXJncyI+CisJCQkJCQkJaW5pdGlhbGl6ZXI6IG51bGwKKwkJCQkJCT4KKwkJCQkJCV0KKwkJCQkJdGhyb3duRXhjZXB0aW9uczogW10KKwkJCQkJYm9keToKKwkJCQkJCTxCbG9jaworCQkJCQkJCXN0YXRlbWVudHM6CisJCQkJCQkJCVsKKwkJCQkJCQkJPEV4cHJlc3Npb25TdGF0ZW1lbnQKKwkJCQkJCQkJCWV4cHJlc3Npb246CisJCQkJCQkJCQkJPE1ldGhvZEludm9jYXRpb24KKwkJCQkJCQkJCQkJZXhwcmVzc2lvbjoKKwkJCQkJCQkJCQkJCTxRdWFsaWZpZWROYW1lCisJCQkJCQkJCQkJCQkJcXVhbGlmaWVyOgorCQkJCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiU3lzdGVtIj4KKwkJCQkJCQkJCQkJCQluYW1lOgorCQkJCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAib3V0Ij4KKwkJCQkJCQkJCQkJCT4KKwkJCQkJCQkJCQkJbmFtZToKKwkJCQkJCQkJCQkJCTxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJwcmludGxuIj4KKwkJCQkJCQkJCQkJYXJndW1lbnRzOgorCQkJCQkJCQkJCQkJWworCQkJCQkJCQkJCQkJPEluZml4RXhwcmVzc2lvbgorCQkJCQkJCQkJCQkJCW9wZXJhdG9yOiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUworCQkJCQkJCQkJCQkJCWxlZnRPcGVyYW5kOgorCQkJCQkJCQkJCQkJCQk8U3RyaW5nTGl0ZXJhbCBlc2NhcGVkVmFsdWU6ICJcIkhlbGxvXCIiPgorCQkJCQkJCQkJCQkJCXJpZ2h0T3BlcmFuZDoKKwkJCQkJCQkJCQkJCQkJPFN0cmluZ0xpdGVyYWwgZXNjYXBlZFZhbHVlOiAiXCIgd29ybGRcIiI+CisJCQkJCQkJCQkJCQkJZXh0ZW5kZWRPcGVyYW5kczogW10KKwkJCQkJCQkJCQkJCT4KKwkJCQkJCQkJCQkJCV0KKwkJCQkJCQkJCQk+CisJCQkJCQkJCQkJXQorCQkJCQkJCQk+CisJCQkJCQkJCV0KKwkJCQkJCT4KKwkJCQk+CisJCQkJXQorCQldCisJCisJCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9rbm93UHJvYmxlbXMudHh0IGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2tub3dQcm9ibGVtcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmYTY2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9rbm93UHJvYmxlbXMudHh0CkBAIC0wLDAgKzEsOSBAQAorLSBzZXRMZWFkaW5nQ29tbWVudCBpcyBhIHByb2JsZW0uIFRoZSBwYXJzZXIgZG9lc24ndCBzdG9yZSB0aGUgY29tbWVudAorCitUT0RPOgorCQorZ2V0RGVjbGFyZWRNb2RpZmllcnMoKQorCitjaGVjayB0aGF0IHdlIGZpbHRlciBvdXQgc3ludGhldGljIG1ldGhvZHMsIGZpZWxkcyBhbmQgcGFyYW1ldGVycy4KKworU2ltcGxlVHlwZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9lbGVtZW50IGRlbHRhcy9qYXZhLWVsZW1lbnQtZGVsdGFzLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2VsZW1lbnQgZGVsdGFzL2phdmEtZWxlbWVudC1kZWx0YXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I2MGQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9lbGVtZW50IGRlbHRhcy9qYXZhLWVsZW1lbnQtZGVsdGFzLmh0bWwKQEAgLTAsMCArMSwyMDcgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+SkRUIC0gSmF2YSBFbGVtZW50IERlbHRhczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPgorSmF2YSBFbGVtZW50IERlbHRhczwvaDI+CitMYXN0IHJldmlzZWQgMTI6MDAgVGh1cnNkYXkgU2VwdGVtYmVyIDYsIDIwMDEKKzxwPk9yaWdpbmFsIHdvcmsgaXRlbTogIklKYXZhRWxlbWVudERlbHRhIHNob3VsZCBjYXJyeSBpbmZvcm1hdGlvbiBhYm91dAorbWFya2VyIGNoYW5nZXMgKFByb2JsZW1NYXJrZXJzKS4iCis8aDM+CitNYXJrZXJzIGFuZCBKYXZhIEVsZW1lbnRzPC9oMz4KK1RoZSB3b3Jrc3BhY2UgYWxsb3dzIG1hcmtlcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlcy4gVGhlIEphdmEKK2NvbXBpbGVyIGFzc29jaWF0ZXMgSmF2YSBwcm9ibGVtIG1hcmtlcnMgd2l0aCBKYXZhIHNvdXJjZSBmaWxlczsgdGhlc2UKK21hcmtlcnMgbG9jYXRlIHRoZSBlcnJvciB3aXRoaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgYnkgc291cmNlIGNoYXJhY3RlcgorcG9zaXRpb24uCis8cD5UaGUgSmF2YSBtb2RlbCBkb2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0IG1hcmtlcnMgb24gSmF2YSBlbGVtZW50cy4gSXQKK2RvZXMgcHJvdmlkZSBhIG1lYW5zICg8dHQ+SUNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQ8L3R0PikgZm9yIG1hcHBpbmcKK2Zyb20gYSBzb3VyY2UgY2hhcmFjdGVyIHBvc2l0aW9uIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQgcmVzb3VyY2UgdG8KK3RoZSBuZWFyZXN0IGVuY2xvc2luZyBKYXZhIGVsZW1lbnQuIFNpbmNlIGFsbCBKYXZhIHByb2JsZW0gbWFya2VycyBjYXJyeQorYSBzb3VyY2UgY2hhcmFjdGVyIHBvc2l0aW9uLCBhbnkgSmF2YSBwcm9ibGVtIG1hcmtlciBjYW4gYmUgbWFwcGVkIHRvIHRoZQorbmVhcmVzdCBlbmNsb3NpbmcgSmF2YSBlbGVtZW50LiBJbiBtb3N0IGNhc2VzLCB0aGlzIGVsZW1lbnQgd2lsbCBiZSBhIGZpbmUtZ3JhaW5lZAorSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBkZWNsYXJhdGlvbiBvZiBhIEphdmEgbWV0aG9kLCBmaWVsZCwgdHlwZSwKK29yIGltcG9ydC4gSW4gdGhlIHdvcnN0IGNhc2UsIGl0IG1hcHMgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQgZWxlbWVudCBpdHNlbGYuCitUaHVzIGl0IGlzIGFsd2F5cyBwb3NzaWJsZSBpbiBwcmluY2lwbGUgdG8gYXNzb2NpYXRlIG1hcmtlcnMgd2l0aCBKYXZhCitlbGVtZW50cy4KKzxwPlRoZSBKYXZhIFVJIHZpc3VhbGx5IGFubm90YXRlcyBKYXZhIGVsZW1lbnRzIHRoYXQgaGF2ZSBwcm9ibGVtcyAod2l0aAorYSByZWQgWCkuCis8cD5UaGUgY29zdCBvZiBtYXBwaW5nIGZyb20gYSBtYXJrZXIgcG9zaXRpb24gdG8gYSBmaW5lLWdyYWluZWQgSmF2YSBlbGVtZW50CityZXF1aXJlcyBvcGVuaW5nIChhbmQgcGFyc2luZykgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIE9uY2Ugb3BlbmVkLCBhZGRpdGlvbmFsCittYXJrZXJzIHdpdGhpbiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBtYXBwZWQgd2l0aCBuZWdsaWdpYmxlCithZGRpdGlvbmFsIGNvc3QuCis8aDM+CitKYXZhIEVsZW1lbnQgRGVsdGFzPC9oMz4KK1VubGlrZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGFzLCBKYXZhIGVsZW1lbnQgZGVsdGFzIGRvIG5vdCBjdXJyZW50bHkKK2luY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgbWFya2VyIGNoYW5nZXMuCis8cD5UaGUgSmF2YSBVSSBuZWVkcyB0byBtYWludGFpbiB0aGUgdmlzdWFsIGFubm90YXRpb25zIG9uIEphdmEgZWxlbWVudHMKK3RoYXQgaGF2ZSBwcm9ibGVtcy4KKzxwPlRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBKYXZhIGVsZW1lbnQgZGVsdGFzIGlzc3VlZDoKKzxvbD4KKzxsaT4KK0J5IHRoZSBKYXZhIG1vZGVsIHdoZW4gPHR0PklXb3JraW5nQ29weS5jb21taXQ8L3R0PiBpcyBjYWxsZWQgdG8gc2F2ZSBhCitjb21waWxhdGlvbiB1bml0IHdvcmtpbmcgY29weS48L2xpPgorCis8bGk+CitCeSB0aGUgSmF2YSBtb2RlbCB3aGVuIDx0dD5JV29ya2luZ0NvcHkucmVjb25jaWxlPC90dD4gaXMgY2FsbGVkIGR1cmluZworZWRpdGluZy48L2xpPgorCis8bGk+CitCeSB0aGUgSmF2YSBtb2RlbCBpbiByZXNwb25zZSB0byBub3RpZmljYXRpb24gb2YgYSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEKK2FmZmVjdGluZyBhIGNvbXBpbGF0aW9uIHVuaXQgcmVzb3VyY2UuPC9saT4KKzwvb2w+CitUaGUgZmlyc3QgdHdvIGtpbmRzIG9mIEphdmEgZWxlbWVudCBkZWx0YSBhcmUgYWx3YXlzIGlzc3VlZCBhZ2FpbnN0IGZpbmUtZ3JhaW5lZAorSmF2YSBlbGVtZW50cy4gVGhlIHByZXZpb3VzIGZpbmUtZ3JhaW5lZCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKK2lzIGNvbXBhcmVkIHRvIHRoZSBjdXJyZW50IGZpbmUtZ3JhaW5lZCBzdHJ1Y3R1cmUuIFRoZXNlIGRlbHRhcyBhcmUgcmVjb2duaXphYmxlCithcyBraW5kIDx0dD5DSEFOR0VEPC90dD4gYXQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgbGV2ZWwgd2l0aCA8dHQ+Rl9DSElMRFJFTjwvdHQ+CitmbGFnIHNldCBhbmQgPHR0PkZfQ09OVEVOVDwvdHQ+IGZsYWcgPGk+bm90PC9pPiBzZXQuCis8cD5UaGUgbGFzdCBraW5kIG9mIEphdmEgZWxlbWVudCBkZWx0YSBpcyBuZXZlciBmaW5lLWdyYWluZWQ7IGl0IGdvZXMgbm8KK2ZpbmVyIHRoYW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZmluZS1ncmFpbmVkCitzdHJ1Y3R1cmUgb2YgdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBhdmFpbGFibGUKKyh0aGUgSmF2YSBtb2RlbCBkb2VzIG5vdCBuZWNlc3NhcmlseSBoYXZlIGEgcmVjb3JkIG9mIHRoZSBwcmV2aW91cyBzdHJ1Y3R1cmUKKyhhbHRob3VnaCBpdCA8aT5taWdodCA8L2k+YmUgaW4gYW4gaW50ZXJuYWwgY2FjaGUpLCBhbmQgY2Fubm90IGNvbXB1dGUKK2l0IHNpbmNlIGl0IGRvZXMgbm90IGEgY29weSBvZiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQpLgorVGhlc2UgZGVsdGFzIGFyZSByZWNvZ25pemFibGUgYXMga2luZCA8dHQ+Q0hBTkdFRDwvdHQ+IGF0IHRoZSBjb21waWxhdGlvbgordW5pdCBsZXZlbCB3aXRoIDx0dD5GX0NISUxEUkVOPC90dD4gZmxhZyA8aT5ub3QgPC9pPnNldCBhbmQgd2l0aCA8dHQ+Rl9DT05URU5UPC90dD4KK2ZsYWcgc2V0LgorPGgzPgorTWFya2VycyBhbmQgSmF2YSBFbGVtZW50IERlbHRhczwvaDM+CitKYXZhIHByb2JsZW1zIG1hcmtlcnMgb24gSmF2YSBjb21waWxhdGlvbiB1bml0cyBvcmlnaW5hdGUgd2hlbiB0aGUgSmF2YQorYnVpbGRlciBpcyBjYWxsZWQuIFRoZXNlIG1hcmtlcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKK2ZpbGVzLCBhbmQgY29tZSB0byB0aGUgYXR0ZW50aW9uIG9mIHRoZSBKYXZhIG1vZGVsIHZpYSBhIHByb2JsZW0gZGVsdGEKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UgZGVsdGEgdGhhdCBmb2xsb3dzIHRoZSBidWlsZC4gVGhlIEphdmEgYnVpbGRlcgorb25seSBkZWxldGVzIG9yIGFkZHMgSmF2YSBwcm9ibGVtIG1hcmtlcnM7IGl0IG5ldmVyIGNoYW5nZXMgZXhpc3Rpbmcgb25lcy4KK1RoZSBKYXZhIGJ1aWxkZXIgZG9lcyBub3QgZGVjb3JhdGUgSmF2YSBwcm9ibGVtIG1hcmtlcnMgd2l0aCBpbmZvcm1hdGlvbgorb3RoZXIgdGhhbiB0aGUgc291cmNlIGNoYXJhY3RlciBwb3NpdGlvbi4KKzxwPjx0dD4oSVdvcmtpbmdDb3B5LnJlY29uY2lsZTwvdHQ+IGFsc28gcmV0dXJucyBhIHNldCBvZiB0cmFuaXNlbnQgbWFya2Vycy4pCis8cD5XaGVuIHRoZSB1c2VyIG9wZW5zIGEgY29tcGlsYXRpb24gdW5pdCwgdGhlIEphdmEgZWRpdG9yIGNyZWF0ZXMgYW5kCitsb2NhdGVzIHZpc3VhbCBtYXJrZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEphdmEgcHJvYmxlbSBtYXJrZXJzLiBUaGVzZQordmlzdWFsIG1hcmtlcnMgYXJlIHN0aWNreSwgYW5kIG1vdmUgYXJvdW5kIGFzIHRoZSB0ZXh0IGlzIGVkaXRlZC4KKzxwPldoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGludG8gYW4gYWxyZWFkeSBvcGVuIGNvbXBpbGF0YXRpb24gdW5pdCBmcm9tCithIHByb2JsZW0gbWFya2VyIGluIHRoZSBUYXNrcyB2aWV3LCB0aGUgSmF2YSBlZGl0b3IgYXV0b21hdGljYWxseSBhZGp1c3RzCit0aGUgcG9zaXRpb25zIHRvIGFjY291bnQgZm9yIHJlY2VudCBlZGl0cy4KKzxwPldoZW4gdGhlIEphdmEgZWRpdG9yIHNhdmVzIGEgY29tcGlsYXRpb24gdW5pdCwgaXQgcGVybWFuZW50bHkgYWRqdXN0cwordGhlIHNvdXJjZSBwb3NpdGlvbnMgb2YgSmF2YSBwcm9ibGVtIG1hcmtlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCitjb21waWxhdGlvbiB1bml0LiBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aGUgbmV4dCBidWlsZCBtYXkgYmUgYSB3YXlzIG9mZgorYW5kIHRoZXNlIG1hcmtlcnMgc2hvdyB1cCBpbiB0aGUgVGFza3MgdmlldyAodGhlIEphdmEgZWRpdG9yIG1pZ2h0IGJlIGNsb3NlZCkuCis8cD5KYXZhIGVsZW1lbnQgZGVsdGFzIGFsc28gY2FycnkgaW5mb3JtYXRpb24gYWJvdXQgbm9uLUphdmEgcmVzb3VyY2VzOwordGhpcyBpcyBzdXJmYWNlZCBieSA8dHQ+SUphdmFFbGVtZW50RGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXM8L3R0Pi4gVGhpcword29ya3MgYXMgZm9sbG93czogd2hlbiBhIG5vbi1KYXZhIHJlc291cmNlIGlzIGFmZmVjdGVkLCB0aGUgY29ycmVzcG9uZGluZworcmVzb3VyY2UgZGVsdGEgaXMgZXhwb3NlZCBvbiB0aGUgbmVhcmVzdCBwYXJlbnQgSmF2YSBlbGVtZW50LiBGb3IgZmlsZXMKK2RpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0LCB0aGUgcmVzb3VyY2UgZGVsdGEgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGgKK0phdmEgZWxlbWVudCBkZWx0YSBmb3IgdGhlIDx0dD5JSmF2YVByb2plY3Q8L3R0PjsgZm9yIGZpbGVzIHNpdHRpbmcgaW4KK3RoZSBzYW1lIGZvbGRlciBhcyBhIEphdmEgc291cmNlIGZpbGUsIHRoZSByZXNvdXJjZSBkZWx0YSB3aWxsIGJlIGFzc29jaWF0ZWQKK3dpdGggSmF2YSBlbGVtZW50IGRlbHRhIGZvciB0aGUgPHR0PklQYWNrYWdlRnJhZ21lbnQ8L3R0PjsgZm9yIGZpbGVzIHNpdHRpbmcKK2luc2lkZSBhIHNvdXJjZSBmb2xkZXIgYnV0IG5vdCBpbiBhbnkgcGFja2FnZSBmcmFnbWVudCwgdGhlIHJlc291cmNlIGRlbHRhCit3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSA8dHQ+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L3R0PgorKHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHByb2plY3QgaXRzZWxmIGlzIGEgcGFja2FnZSBmcmFnbWVudAorcm9vdC4gVGh1cyB0aGUgPHR0PklKYXZhRWxlbWVudERlbHRhLmdldFJlc291cmNlRGVsdGFzPC90dD4gbWVjaGFuaXNtIGlzCitvbmx5IG9mIHVzZSBmb3IgZGlzY292ZXJpbmcgbm9uLXJlc291cmNlIGRlbHRhczsgaXQgaXMgbm90IHVzZWZ1bCBmb3IgZGlzY292ZXJpbmcKK21hcmtlciBjaGFuZ2VzIHRvIHJlc291cmNlcyBjb3JyZXNwb25kaW5nIHRvIEphdmEgZWxlbWVudHMuCis8cD5UaHVzIHRoZSBvbmx5IHdheSBhIGNsaWVudCBjYW4gZmluZCBvdXQgYWJvdXQgbW9zdCBtYXJrZXIgZGVsdGFzIGlzCit0byByZWdpc3RlciBpdHMgb3duIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciB3aXRoIHRoZSB3b3Jrc3BhY2UuIFNpbmNlCit0aGUgY2xpZW50IHdvdWxkIHN0aWxsIG5lZWQgdG8gcmVnaXN0ZXIgYSBKYXZhIG1vZGVsIGNoYW5nZSBsaXN0ZW5lciwgaGF2aW5nCit0byBkbyByYWlzZXMgdGhlIHF1ZXN0aW9uIG9mIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHRoZXNlIHR3byBub3RpZmljYXRpb25zCisodGhlcmUgaXMgbm8gZ3VhcmFudGVlIHdoaWNoIHdpbGwgY29tZXMgZmlyc3QpLgorPGgzPgorUHJvcG9zYWw6IEV4cG9zZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIGRlbHRhcyBvbiBKYXZhIGVsZW1lbnQgZGVsdGE8L2gzPgorVGhlIHByb3Bvc2VkIGNoYW5nZSBpcyB0byBpbXByb3ZlIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGEgdG8gZXhwb3NlIHRoZQorY29ycmVzcG9uZGluZyByZXNvdXJjZSBkZWx0YXMgd2hlbmV2ZXIgdGhleSBhcmUgYXZhaWxhYmxlLiBUaGlzIHdvdWxkIGJlCitkb25lIHZpYSB0aGUgZm9sbG93aW5nIG5ldyBtZXRob2Qgb24gPHR0PklKYXZhRWxlbWVudERlbHRhPC90dD46Cis8cD48dHQ+LyoqPC90dD4KKzxicj48dHQ+Jm5ic3A7KiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEgZm9yIHRoZSByZXNvdXJjZSB0aGF0Citjb3JyZXNwb25kcyBkaXJlY3RseSB0byB0aGU8L3R0PgorPGJyPjx0dD4mbmJzcDsqIEphdmEgZWxlbWVudCwgb3IgJmx0O2NvZGU+bnVsbCZsdDsvY29kZT4gaWYgZWl0aGVyIHRoZXJlCitpcyBubyByZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzPC90dD4KKzxicj48dHQ+Jm5ic3A7KiB0byB0aGUgSmF2YSBlbGVtZW50LCBvciB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKK2J1dCB0aGVyZSBpcyBubyByZXNvdXJjZSBkZWx0YTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogZm9yIGl0LjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogJmx0O3A+PC90dD4KKzxicj48dHQ+Jm5ic3A7KiBOb3RlIHRoYXQgYSBKYXZhIGVsZW1lbnQgZGVsdGEgdGhhdCBkb2VzIG5vdCBhcmlzZSBmcm9tCithIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YSB3aWxsIGFsd2F5czwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogcmV0dXJuICZsdDtjb2RlPm51bGwmbHQ7L2NvZGU+LjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogJmx0Oy9wPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogJmx0O3A+PC90dD4KKzxicj48dHQ+Jm5ic3A7KiBJZiB0aGUgcmVzdWx0IGlzIG5vbi0mbHQ7Y29kZT5udWxsJmx0Oy9jb2RlPiwgdGhlbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogJmx0O2NvZGU+Z2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlRGVsdGEoKS5nZXRSZXNvdXJjZSgpJmx0Oy9jb2RlPgoraXMgdGhlIHNhbWUgcmVzb3VyY2UgYXM8L3R0PgorPGJyPjx0dD4mbmJzcDsqICZsdDtjb2RlPmdldEVsZW1lbnQoKS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSZsdDsvY29kZT4uPC90dD4KKzxicj48dHQ+Jm5ic3A7KiAmbHQ7L3A+PC90dD4KKzxicj48dHQ+Jm5ic3A7KjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEsIG9yCismbHQ7Y29kZT5udWxsJmx0Oy9jb2RlPiBpZiBub3QgYXBwbGljYWJsZSBvciBub25lPC90dD4KKzxicj48dHQ+Jm5ic3A7Ki88L3R0PgorPGJyPjx0dD5wdWJsaWMgSVJlc291cmNlRGVsdGEgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlRGVsdGEoKTs8L3R0PgorPHA+UmVzb3VyY2UgZGVsdGFzIHdpbGwgYmUgYXZhaWxhYmxlIHdoZW4gdGhlIEphdmEgZWxlbWVudCBkZWx0YSByZXN1bHRzCitmcm9tIHRoZSBKYXZhIG1vZGVsIHJlY2VpdmluZyBhIHJlc291cmNlIGNoYW5nZSBub3RpZmljYXRpb24uIFdoZW4gdGhpcworaGFwcGVucywgdGhlIHJlc291cmNlIGRlbHRhIGZvciB0aGUgY29ycmVzcG9uZGluZyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCitmcm9tIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSBKYXZhIGVsZW1lbnQ6Cis8dWw+Cis8bGk+CitKYXZhIHByb2plY3Q6IGV4cG9zZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCByZXNvdXJjZS48L2xpPgorCis8bGk+CitKYXZhIGNvbXBpbGF0aW9uIHVuaXQ6IGV4cG9zZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YQorc291cmNlIGZpbGUuPC9saT4KKworPGxpPgorSmF2YSBjbGFzcyBmaWxlOiBleHBvc2UgcmVzb3VyY2UgZGVsdGEgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgY2xhc3MKK2ZpbGUuPC9saT4KKworPGxpPgorSmF2YSBwYWNrYWdlIGZyYWdtZW50IHJvb3Q6IGV4cG9zZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKK3NvdXJjZSBmb2xkZXIsIGphciBvciB6aXAgZmlsZS48L2xpPgorCis8bGk+CitKYXZhIHBhY2thZ2UgZnJhZ21lbnQ6IGV4cG9zZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZQorZm9sZGVyIHVuZGVyIGEgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC48L2xpPgorPC91bD4KK05vdGUgdGhhdCB0aGUgcHJvcG9zZWQgQVBJIGNoYW5nZSB3b3VsZCBub3QgYnJlYWsgY29tcGF0aWJpbGl0eSB3aXRoIEVjbGlwc2UKKzEuMC4gSXQgYWRkcyBhIG5ldyBtZXRob2QgdG8gYW4gaW50ZXJmYWNlIHRoYXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkCitieSBjbGllbnRzLgorPHA+V2l0aCB0aGUgcHJvcG9zZWQgY2hhbmdlLCBhIGNsaWVudCBvZiB0aGUgSmF2YSBtb2RlbCB3b3VsZCBiZSBhYmxlIHRvCitkaXNjb3ZlciBtYXJrZXIgY2hhbmdlcyB0byBib3RoIEphdmEgYW5kIG5vbi1KYXZhIHJlc291cmNlIGJ5IHJlZ2lzdGVyaW5nCitmb3IgSmF2YSBtb2RlbCBjaGFuZ2VzIGFuZCBjb21wb3NpbmcgPHR0PklKYXZhRWxlbWVudERlbHRhLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZURlbHRhPC90dD4KK2FuZCA8dHQ+SVJlc291cmNlRGVsdGEuZ2V0TWFya2VyRGVsdGFzPC90dD4uIFRoZXNlIG1hcmtlciBjaGFuZ2VzIHdpbGwKK29ubHkgYmUgcHJlc2VudCBvbiBKYXZhIGVsZW1lbnQgZGVsdGFzIHN0ZW1taW5nIGZyb20gd29ya3NwYWNlIHJlc291cmNlCitkZWx0YXMuIFRoZXkgYXJlIG5vIG1hcmtlciBkZWx0YXMgYXNzb2NpYXRlZCB3aXRoIGZpbmUtZ3JhaW5lZCBKYXZhIGVsZW1lbnQKK2RlbHRhcyBhcmlzaW5nIGZyb20gd29ya2luZyBjb3B5IHJlY29uY2lsaWF0aW9uIG9yIHNhdmluZyAobm8gbWFya2VycyBoYXZlCitjaGFuZ2VzKS4KKzxwPk90aGVyIHRoaW5ncyB3ZSBjb25zaWRlcmVkOgorPHVsPgorPGxpPgorRm9yIHRoZSBjYXNlIHdoZXJlIGEgY29hcnNlLWdyYWluZWQgSmF2YSBlbGVtZW50IGRlbHRhcyBpcyBpc3N1ZWQsIGFkZAorbWFya2VyIGRlbHRhIGluZm9ybWF0aW9uIHRvIEphdmEgZWxlbWVudHMgZmluZXIgdGhhbiB0aGUgY29tcGlsYXRpb24gdW5pdC4KK1RoaXMgaXMgbm90IGZlYXNpYmxlIGJlY2F1c2UgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGNvbXB1dGUgZmluZS1ncmFpbmVkCitKYXZhIGVsZW1lbnQgb3IgbWFya2VyIGRlbHRhcyBzaW5jZSB0aGUgSmF2YSBtb2RlbCBoYXMgbm8gImJlZm9yZSIgc3RhdGUKK3RvIGNvbXBhcmUgYWdhaW5zdC48L2xpPgorCis8bGk+CitGb3IgdGhlIGNhc2VzIHdoZXJlIGEgZmluZS1ncmFpbmVkIEphdmEgZWxlbWVudCBkZWx0YXMgaXMgaXNzdWVkLCBhZGQgbWFya2VyCitkZWx0YSBpbmZvcm1hdGlvbiB0byBKYXZhIGVsZW1lbnRzIGZpbmVyIHRoYW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMKK2lzIG5vdCBmZWFzaWJsZSBiZWNhdXNlIHRoZSBtYXJrZXJzIGFyZW4ndCBjaGFuZ2luZyBpbiB0aGlzIGNhc2UsIGFuZCB0aGUKK0phdmEgbW9kZWwgaXRzZWxmIGlzIG5vdCBpbiB0aGUgYnVzaW5lc3Mgb2YgYWRqdXN0aW5nIG1hcmtlcnMuPC9saT4KKzwvdWw+CisKKzxoMz4KK0RvY3VtZW50IEhpc3Rvcnk8L2gzPgorCis8dWw+Cis8bGk+CisxMzo0NSBUaHVyc2RheSBBdWd1c3QgMzEsIDIwMDEgLSBGaXJzdCBwcm9wb3NhbCBzZW5kIHRvIEVyaWNoIGFuZCBQaGlsaXBwZTwvbGk+CisKKzxsaT4KKzE2OjMwIFdlZG5lc2RheSBTZXBlbWJlciA1LCAyMDAxIC0gTW9kaWZpZWQgYWZ0ZXIgZGlzY3Vzc2lvbiB3aXRoIEVyaWNoCithbmQgTWFydGluLjwvbGk+CisKKzxsaT4KKzEyOjAwIFRodXJzZGF5IFNlcHRlbWJlciA2LCAyMDAxIC0gTW9kaWZpZWQgYWZ0ZXIgZGlzY3Vzc2lvbiB3aXRoIEplcm9tZQord2hvIGNsYXJpZmllZCBob3cgPHR0PklKYXZhRWxlbWVudERlbHRhLmdldFJlc291cmNlRGVsdGFzPC90dD4gd29ya3MuPC9saT4KKzwvdWw+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZXh0ZW5zaW9uIGRpci9leHQtZGlycy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dC1kaXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhOWY0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZXh0ZW5zaW9uIGRpci9leHQtZGlycy5odG1sCkBAIC0wLDAgKzEsMjMzIEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJCdWlsZCI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5KRFQgLSBFeHRlbnNpb24gRGlyZWN0b3JpZXM8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMj4KK0V4dGVuc2lvbiBEaXJlY3RvcmllczwvaDI+CitMYXN0IHJldmlzZWQgMTc6MTAgVGh1cnNkYXkgT2N0b2JlciAyNSwgMjAwMQorPHA+V29yayBpdGVtOiBBZGQgc3VwcG9ydCB0byBKYXZhIG1vZGVsIGZvciBKREsgMS4yLXN0eWxlIGV4dGVuc2lvbiBkaXJlY3RvcmllcworKGFrYSBvcHRpb25hbCBwYWNrYWdlcykKKzxwPkFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgaXMgYSBmb2xkZXIgY29udGFpbmluZyBhbnkgbnVtYmVyIG9mIEpBUiBmaWxlcworKGluY2x1ZGluZyAwKS4gRXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHdlcmUgb3JpZ2luYWxseSBhZGRlZCBpbiBKREsgMS4yLAorYW5kIGFyZSBkZXNjcmliZWQgaW4gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvaW5kZXguaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvaW5kZXguaHRtbDwvYT4uCis8cD5UaGUgcHJvcG9zYWwgaXMgdG8gYWxsb3cgYSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeSB0byByZWZlciB0byBhbiBleHRlbnNpb24KK2RpcmVjdG9yeS4gQSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeSAoPHR0PkNQRV9MSUJSQVJZPC90dD4pIHdpdGggYSBwYXRoCit3aG9zZSBsYXN0IHNlZ21lbnQgaXMgIioiIGluZGljYXRlcyBhbiBleHRlbnNpb24gZGlyZWN0b3J5OyBmb3IgZXhhbXBsZSwKK2EgbGlicmFyeSBlbnRyeSB3aXRoIHRoZSBwYXRoICJEOi9qZGsxLjQvanJlL2xpYi9leHQvKiIgbWVhbnMgdGhlIGV4dGVuc2lvbgorZGlyZWN0b3J5ICJEOi9qZGsxLjQvanJlL2xpYi9leHQiLiBMaWtlIGFsbCBsaWJyYXJ5IGVudHJpZXMsIGV4dGVuc2lvbgorZGlyZWN0b3JpZXMgY2FuIGJlIGluIGZvbGRlcnMgaW5zaWRlIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gZGlyZWN0b3JpZXMgaW4KK3RoZSBsb2NhbCBmaWxlIHN5c3RlbSBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuIEEgdmFyaWFibGUgY2xhc3NwYXRoIGVudHJ5CittYXkgYWxzbyByZXNvbHZlIHRvIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGUgYWJvdXQKK2VuZGluZyBpbiAiKiIuIFRodXMgYSB2YXJpYWJsZSBjbGFzc3BhdGggZW50cnkgbGlrZSAiSlJFX0xJQi9leHQvKiIgd291bGQKK3Jlc29sdmUgdG8gYW4gZXh0ZW5zaW9uIGRpcmVjdG9yeTsgYW5kIGEgc2ltcGxlIG9uZSBsaWtlICJGT08iIGNvdWxkIHJlc29sdmUKK3RvIGVpdGhlciBhIEpBUiBsaWJyYXJ5LCBhIGxpYnJhcnkgZm9sZGVyLCBhbiBleHRlbnNpb24gZGlyZWN0b3J5LCBvciBhCitwcm9qZWN0LgorPHA+RWFjaCBvZiB0aGUgSkFScyBpbiBhbiBleHRlbnNpb24gZGlyZWN0b3J5IG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGgKK3dvdWxkIGdpdmUgcmlzZSB0byBhIHNlcGFyYXRlIDx0dD5JUGFja2FnZUZyYWdtZW50Um9vdDwvdHQ+IChraW5kIDx0dD5LX0JJTkFSWTwvdHQ+KTsKK3RoZXNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYXJlIGFsbCBjaGlsZCBlbGVtZW50cyBvZiB0aGUgPHR0PklKYXZhUHJvamVjdDwvdHQ+LgorVGhlIEphdmEgbW9kZWwgd291bGQgbm90IGhhdmUgYSBKYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZXh0ZW5zaW9uCitkaXJlY3RvcnkgaXRzZWxmLiBBIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGlkZW50aWZpZXMgYSBleHRlbnNpb24gZm9sZGVyCitpbnRlcm5hbCB0byB0aGUgd29ya3NwYWNlIGdpdmVzIHJpc2UgdG8gMCwgMSwgb3IgbW9yZSBiaW5hcnkgcGFja2FnZSBmcmFnbWVudAorcm9vdHMgZm9yIEpBUiBmaWxlIHJlc291cmNlcyBpbnRlcm5hbCB0byB0aGUgd29ya3NwYWNlOyBzaW1pbGFybHksIGEgY2xhc3NwYXRoCitlbnRyeSB0aGF0IGlkZW50aWZpZXMgYSBleHRlbnNpb24gZm9sZGVyIGV4dGVybmFsIHRvIHRoZSB3b3Jrc3BhY2UgZ2l2ZXMKK3Jpc2UgdG8gYmluYXJ5IHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgZm9yIEpBUiBmaWxlcyBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuCis8cD5FdmVyeSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhhdCBpcyBhIGNoaWxkIG9mIGEgcHJvamVjdCBlbGVtZW50IHN0ZW1zCitmcm9tIHNvbWUgZW50cnkgb24gdGhhdCBwcm9qZWN0J3Mgb3JpZ2luYWwgY2xhc3NwYXRoLiBHaXZlbiBhIHBhY2thZ2UgZnJhZ21lbnQKK3Jvb3QsIGhvdyBkb2VzIG9uZSB0cmFjZSBpdCBiYWNrIHRvIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBnYXZlIHJpc2UKK3RvIGl0PyBJbiB0aGUgcHJlc2VuY2Ugb2YgdmFyaWFibGUgY2xhc3NwYXRoIGVudHJpZXMgYW5kIGV4dGVuc2lvbiBkaXJlY3RvcmllcywKK3RoZSBhbnN3ZXIgaXMgbm90IG9idmlvdXMuIEhhdmluZyBhIHNpbXBsZSBhbnN3ZXIgaXMgaW1wb3J0YW50IHRvIHNvbWUKK2NsaWVudHMuIEZvciBpbnN0YW5jZSwgdGhlIEphdmEgVUkgaW5jbHVkZXMgdGhlIG5hbWVzIG9mIGNsYXNzcGF0aCB2YXJpYWJsZXMKK2luIGl0ZW1zIGluIGl0cyBQYWNrYWdlcyB2aWV3LgorPHA+PHR0PklQYWNrYWdlRnJhZ21lbnRSb290PC90dD4KKzxicj48dHQ+LyoqPC90dD4KKzxicj48dHQ+Jm5ic3A7KiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBnaXZlcyByaXNlIHRvIHRoaXMgcGFja2FnZQorZnJhZ21lbnQgcm9vdC48L3R0PgorPGJyPjx0dD4mbmJzcDsqIFRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IG11c3QgZXhpc3QuIFRoZSByZXR1cm5lZCBjbGFzc3BhdGgKK2VudHJ5IGlzPC90dD4KKzxicj48dHQ+Jm5ic3A7KiBlcXVpdmFsZW50IHRvIG9uZSBvZiB0aGUgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhpcyBwYWNrYWdlCitmcmFnbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogcm9vdCdzIHByb2plY3QuPC90dD4KKzxicj48dHQ+Jm5ic3A7KjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyogQHJldHVybiB0aGUgb3JpZ2luYXRpbmcgY2xhc3NwYXRoIGVudHJ5PC90dD4KKzxicj48dHQ+Jm5ic3A7KiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QKK2V4aXN0PC90dD4KKzxicj48dHQ+Jm5ic3A7Ki88L3R0PgorPGJyPjx0dD5JQ2xhc3NwYXRoRW50cnkgZ2V0T3JpZ2luYXRpbmdDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247PC90dD4KKzxwPlRoaXMgbWV0aG9kIHdvdWxkIHJlcGxhY2UgPHR0PklKYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkKK2VudHJ5KTwvdHQ+LCB3aGljaCBoYXMgcHJvYmxlbXMgYW5kIHdvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgQVBJICh2aWEKK2RlcHJlY2F0aW9uKS4KKzxoMz4KK1BhY2thZ2VzIFZpZXcgQ2x1dHRlcjwvaDM+CitUaGUgcGFja2FnZXMgdmlldyB3b3VsZCBzaG93IGFsbCB0aGUgSkFScyBmcm9tIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgYXMKK2NoaWxkcmVuIG9mIGEgcHJvamVjdC4gUGFja2FnZXMgdmlldyBjbHV0dGVyIGV4aXN0cyBmb3IgYW55b25lIHdpdGggYSBsYXJnZQorbnVtYmVyIG9mIEpBUiBsaWJyYXJpZXMgb24gdGhlaXIgYnVpbGQgY2xhc3NwYXRoLiBFeHRlbnNpb24gZGlyZWN0b3JpZXMKK2V4YWNlcmJhdGUgdGhlIHByb2JsZW0gYnkgbWFraW5nIGl0IGVhc3kgdG8gaW5jbHVkZSBhIHdob2xlIHNldCBvZiBKQVIKK2xpYnJhcmllcyB3aXRoIGEgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSAoV1NBRCByZXB1dGVkbHkgaGFzIDcwKyBKQVJzIGluCitpdHMgZXh0ZW5zaW9uIGRpcmVjdG9yeSkuCis8cD5UaGUgcGFja2FnZXMgdmlldyBzdXBwb3J0cyBmaWx0ZXJpbmcgb3V0IEpBUiBsaWJyYXJpZXMsIG1lYW5pbmcgdGhleQorY291bGQgYmUgaGlkZGVuLiBIb3dldmVyLCB0aGUgZmlsdGVyIGlzIG9mZiBieSBkZWZhdWx0IGFuZCBub3QgYWxsIHVzZXJzCithcmUgYXdhcmUgdGhhdCB0aGUgZmlsdGVyIGV2ZW4gZXhpc3RzLgorPHA+Tm90ZSB0aGF0IGV4dGVuc2lvbiBmb2xkZXJzIHR5cGljYWxseSBjb250YWluIGEgYnVuY2ggb2YgdW5yZWxhdGVkIEpBUnMsCittYWtpbmcgaXQgbGlrZWx5IHRoYXQgYSB1c2VyIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiBhIHBhcnRpY3VsYXIgc3Vic2V0CithbmQgdW5pbnRlcmVzdGVkIGluIHRoZSByZXN0LiBUaGUgSUJNIDEuMy4wIEpSRSBqcmVcbGliXGV4dCBjb250YWlucyBpbmRpY2ltLmphcgorYW5kIEphd0JyaWRnZS5qYXIuIFRoZSBTdW4gSkRLIDEuNC4wLWJldGEganJlXGxpYlxleHQgY29udGFpbnMgZG5zbnMuamFyLAorbGRhcHNlYy5qYXIsIGFuZCBzdW5qcmVfcHJvdmlkZXIuamFyLiBBbGwgdGhlc2UgSkFScyBhcmUgbGlrZWx5IHB1cmUgbm9pc2UKK2FuZCBkbyBub3QgY29udGFpbiBBUEkgdGhhdCBhIGNsaWVudCB3b3VsZCB3cml0ZSB0by4mbmJzcDsgSW4gYSBKMkVFIEpSRSwKK3RoZXJlIHdvdWxkIGJlIGEgZGl2ZXJzZSBjb2xsZWN0aW9uIG9mIEpBUnMgaW4gdGhlIGpyZVxsaWJcZXh0IGV4dGVuc2lvbgorZGlyZWN0b3J5IChlLmcuLCBKYXZhIFRlbGVwaG9ueSwgSmF2YU1haWwsIEphdmEgMkQsIEphdmEgM0QsIEphdmEgTWVkaWEKK0ZyYW1ld29ya3MpLCBvbmx5IGEgaGFuZGZ1bCBvZiB3aGljaCB3b3VsZCBiZSB1c2VkIHdpdGhpbiBhbnkgZ2l2ZW4gcHJvamVjdC4KKzxwPk9uZSBpZGVhIGlzIHRvIGFsbG93IGEgbmV3IEphdmFFbGVtZW50ICJFeHRlbnNpb25Gb2xkZXIiLiBUaGlzIHdvdWxkCithbGxvdyB0byBncm91cCB0aGUgZXh0ZW5zaW9uIEpBUnMgYW5kIHdvdWxkIGF2b2lkIHNvbWUgY2x1dHRlci4gQWx0aG91Z2gKK2FuIGV4dGVuc2lvbiBmb2xkZXIgZWxlbWVudCBjb3VsZCBhdm9pZCBjbHV0dGVyLCBpdCBtYXkgbm90IHByb3ZpZGUgZW5vdWdoCitvZiBhbiBpbXByb3ZlbWVudCBvdmVyIHRoZSBleGlzdGluZyBmaWx0ZXJpbmcgbWVjaGFuaXNtIHRvIHdhcnJhbnQgY29tcGxpY2F0aW5nCit0aGUgSmF2YSBtb2RlbCBBUEkuCis8cD5bVGhpcyBwcm9ibGVtIGlzIHN0aWxsIG9wZW4uIEkgcmVjb21tZW5kIGxpdmluZyB3aXRoIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkCitmaWx0ZXJpbmcgZm9yIG5vdy4gV2UgY291bGQgY29tZSBiYWNrIGxhdGVyIGFuZCBsb29rIGF0IHdheXMgdG8gcmVkdWNlCitjbHV0dGVyIGFzIGEgc2VwYXJhdGUgd29yayBpdGVtLl0KKzxoMz4KK0RlZmF1bHQgQnVpbGQgQ2xhc3NwYXRoPC9oMz4KK1RoZSBzdGFuZGFyZCBKUkUgaW1wbGljaXRseSBoYXMgdGhlIGpyZS9saWIvZXh0IGV4dGVuc2lvbiBkaXJlY3Rvcnkgb24KK2l0cyBydW50aW1lIGNsYXNzcGF0aC4gQnkgZGVmYXVsdCwgdGhlIGJ1aWxkIGNsYXNzcGF0aCBmb3IgYSB0eXBpY2FsIHByb2plY3QKK3Nob3VsZCBpbmNsdWRlIGVudHJpZXMgZm9yIGJvdGggdGhlIHN0YW5kYXJkIGNsYXNzIGxpYnJhcnkgKGpyZS9saWIvcnQuamFyKQorYW5kIHRoZSBzdGFuZGFyZCBleHRlbnNpb24gZGlyZWN0b3J5IChqcmUvbGliL2V4dC8qKS4KKzxwPlRoZXNlIGRlZmF1bHRzIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBWTSBsYXVuY2hlciBmb3IgdGhlIHByb2plY3QuCitJdCBzaG91bGQgYWx3YXlzIGJlIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgYW5kCitzZXQgdXAgdGhlaXIgYnVpbGQgY2xhc3NwYXRoIGFzIHRoZXkgc2VlIGZpdC4KKzxoMz4KK0J1aWxkIENsYXNzcGF0aCBPcmRlcmluZzwvaDM+CitUaGUgVUkgY3VycmVudGx5IGFsbG93cyB1c2VycyB0byBmcmVlbHkgcmVvcmRlciBwYWNrYWdlIGZyYWdtZW50IHJvb3RzCitmb3IgdGhlIHByb2plY3QuIFRoaXMgZG9lcyBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgZm9yIHBhY2thZ2UgZnJhZ21lbnRzCityb290cyB0aGF0IGFyaXNlIGZyb20gZXh0ZW5zaW9uIGRpcmVjdG9yaWVzLgorPHA+SW5kZWVkLCB0aGUgYWRkaXRpb24gb2YgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8KK2xvbmdlciBhIDEtMSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYW5kIGNsYXNzcGF0aAorZW50cmllcy4gVGhlIFVJIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGNsYXNzcGF0aAorZW50cmllcy4gSGVyZSBhcmUgdGhlIGd1aWRlbGluZXMgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoCitmb3IgYSBwcm9qZWN0IChOLkIuLCB0aGVzZSBhcHBseSB0byB0aGUgcmF3IGNsYXNzcGF0aCwgbm90IG5lY2Vzc2FyaWx5Cit0byBhIHBhcnRpYWxseSBvciBmdWxseSAicmVzb2x2ZWQiIGNsYXNzcGF0aCk6Cis8dWw+Cis8bGk+CitUaGVyZSBtYXkgYmUgMCwgMSwgb3IgbW9yZSBzb3VyY2UgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoLiBUaGUgcmVsYXRpdmUKK29yZGVyaW5nIG9mIG11bHRpcGxlIHNvdXJjZSBmb2xkZXJzIGlzIHNpZ25pZmljYW50IHRvIHRoZSB1c2VyLiBTb3VyY2UKK2NvZGUgaW4gYW4gZWFybGllciBzb3VyY2UgZm9sZGVyIGhpZGVzIGEgc291cmNlIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBpbgorYSBsYXRlciBmb2xkZXIuIFRoaXMgZmxleGliaWxpdHkgaXMgcmFyZWx5IHVzZWQ6IG11bHRpcGxlIHNvdXJjZSBmb2xkZXJzCitpcyByYXJlIGVub3VnaCwgYW5kIGR1cGxpY2F0ZWQgc291cmNlIGZpbGVzLCBldmVuIHJhcmVyLjwvbGk+CisKKzxsaT4KK1NvdXJjZSBmb2xkZXJzIG11c3QgcHJlY2VkZSBhbGwgb3RoZXIgdHlwZXMgb2YgY2xhc3NwYXRoIGVudHJpZXMuIE5vdGhpbmcKK3Nob3VsZCBoaWRlIHNvdXJjZSAoZXhjZXB0IGFub3RoZXIgc291cmNlKS4gVGhpcyBwcm9wZXJ0eSBpcyBpbXBsaWNpdGx5CityZWxpZWQgb24gd2hlbmV2ZXIgYSBzb3VyY2UgY29kZSBwYXRjaCBpcyBiZWluZyBhcHBsaWVkIHRvIGEgYmluYXJ5IGxpYnJhcnkuPC9saT4KKworPGxpPgorVGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIG5vbi1zb3VyY2UgY2xhc3NwYXRoIGVudHJpZXMgKGxpYnJhcnkgZm9sZGVycywKK2xpYnJhcnkgSkFScywgZXh0ZW5zaW9uIGZvbGRlcnMsIHJlcXVpcmVkIHByb2plY3RzLCBhbmQgb25lcyBpbnZvbHZpbmcKK3ZhcmlhYmxlcykgaXMgc2lnbmlmaWNhbnQgdG8gdGhlIHVzZXIuIFRoZSBtYWluIHJlYXNvbiBpdCBpcyBzaWduaWZpY2FudAoraXMgdG8gZGVhbCB3aXRoIGNvbmZsaWN0aW5nIGxpYnJhcnkgdmVyc2lvbnMsIHdoZXJlIHRoZSB1c2VyIG5lZWRzIHRvIGNvbnRyb2wKK3doaWNoIHZlcnNpb24gd2lucy4gVGhlIG9uZXMgZWFybGllciBpbiB0aGUgbGlzdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlCitvdmVyIG9uZXMgbGF0ZXIgaW4gdGhlIGxpc3QuPC9saT4KKworPGxpPgorRm9yIGEgc3RhbmRhcmQgSmF2YSBydW50aW1lLCBhbGwgbGlicmFyaWVzIG9uIHRoZSBib290IGNsYXNzcGF0aCAodXN1YWxseQoranVzdCB0aGUgc3RhbmRhcmQgSlJFIGNsYXNzIGxpYnJhcnkpIGFyZSBjb25zdWx0ZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQsCithbmQgYmVmb3JlIG90aGVyIGxpYnJhcmllcykuIFBsYWNpbmcgdGhlIHN0YW5kYXJkIEpSRSBjbGFzcyBsaWJyYXJ5IGFzCit0aGUgZmlyc3Qgbm9uLXNvdXJjZSBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG1pcnJvcnMgdGhlIG1vc3QgY29tbW9uCitjb25maWd1cmF0aW9uLjwvbGk+CisKKzxsaT4KK0ZvciBhIHN0YW5kYXJkIEphdmEgcnVudGltZSwgYWxsIGV4dGVuc2lvbiBkaXJlY3RvcmllcyAodXN1YWxseSBqdXN0IHRoZQorc3RhbmRhcmQgSlJFIGV4dGVuc2lvbiBkaXJlY3RvcnkpIGFyZSBjb25zdWx0ZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQsCithZnRlciBsaWJyYXJpZXMgb24gdGhlIGJvb3QgY2xhc3NwYXRoIGJ1dCBiZWZvcmUgb3RoZXIgbGlicmFyaWVzLiBXaXRoaW4KK2FuIGV4dGVuc2lvbiBkaXJlY3RvcnksIHRoZSB2YXJpb3VzIGxpYnJhcnkgSkFScyBhcmUgY29uc3VsdGVkIGluIHVuc3BlY2lmaWVkCitvcmRlci4gUGxhY2luZyB0aGUgc3RhbmRhcmQgSlJFIGV4dGVuc2lvbiBkaXJlY3RvcnkgYXMgdGhlIHNlY29uZCBub24tc291cmNlCitlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG1pcnJvcnMgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24uPC9saT4KKzwvdWw+CisKKzxoMz4KK0J1aWxkIENsYXNzcGF0aCBEdXBsaWNhdGVzPC9oMz4KK0hvdyBhcmUgZHVwbGljYXRlcyBsaWJyYXJpZXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBoYW5kbGVkPyBGb3IgaW5zdGFuY2UsCitpZiB0aGVyZSBhcmUgdHdvIGNsYXNzcGF0aCBlbnRyaWVzIG9uIGEgcHJvamVjdCdzIGJ1aWxkIGNsYXNzcGF0aCBmb3IgZXhhY3RseQordGhlIHNhbWUgSkFSLCBzaG91bGQgdGhlcmUgYmUgb25lIG9yIHR3byBwYWNrYWdlIGZyYWdtZW50IHJvb3RzPyBXaGF0IGlmCithIEpBUiBjbGFzc3BhdGggZW50cnkgZXhwbGljaXRseSBtZW50aW9ucyBhIEpBUiB0aGF0IGlzIGluY2x1ZGVkIGluIGFuCitleHRlbnNpb24gZm9sZGVyIGFsc28gb24gdGhlIGJ1aWxkIGNsYXNzcGF0aD8KKzxwPkF0IHRoZSBKYXZhIG1vZGVsIEFQSSwgcGFja2FnZSBmcmFnbWVudCByb290cyBhcmUgaGFuZGxlIG9iamVjdHMgd2l0aAord2VsbC1rbm93biBpZGVudGl0eSBjcml0ZXJpYS4gSXQgdHVybnMgb3V0IHRoYXQgdGhpcyBkaWN0YXRlcyB0aGUgYW5zd2VyCit0byBob3cgZHVwaWNhdGVzIGFyZSBoYW5kbGVkLgorPHA+Rm9yIGxpYnJhcnkgcGFja2FnZSBmcmFnbWVudCByb290cyBiYXNlZCBvbiBhIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UsCit0aGUgaWRlbnRpdHkgY3JpdGVyaWEgaW5jbHVkZXMgdGhlIHJlc291cmNlIGhhbmRsZSAoaGFuZGxlIGNvbnN0cnVjdG9yCitpc0phdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlKSkgRm9yIGxpYnJhcnkgcGFja2FnZSBmcmFnbWVudAorcm9vdHMgYmFzZWQgb24gZmlsZXMgb3V0c2lkZSB0aGUgd29ya3NwYWNlLCB0aGUgaWRlbnRpdHkgY3JpdGVyaWEgaW5jbHVkZXMKK3RoZSBwYXRoIChoYW5kbGUgY29uc3RydWN0b3IgaXNKYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZykpLgorPHA+VGhpcyBtZWFucyB0aGUgYW5zd2VyIGlzIGZvcmNlZDogYW55IGR1cGxpY2F0aW9uIGluIHRoZSBidWlsZCBjbGFzc3BhdGgKK25lY2Vzc2FyaWx5IHdhc2hlcyBvdXQgaW4gdGhlIG1hcHBpbmcgdG8gcGFja2FnZSBmcmFnbWVudCByb290cy4gVHdvIGNsYXNzcGF0aAorZW50cmllcyBmb3IgZXhhY3RseSB0aGUgc2FtZSBKQVIgbXVzdCBtYXAgdG8gYSBzaW5nbGUgcGFja2FnZSBmcmFnbWVudAorcm9vdC4gSkFScyBmcm9tIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgZ2l2ZXMgcmlzZSB0byB0aGUgc2FtZSBwYWNrYWdlIGZyYWdtZW50Cityb290cyBvbmUgd291bGQgZ2V0IGlmIGVhY2ggSkFSIHdhcyBtZW50aW9uZWQgZXhwbGljaXRseS4KKzxwPkluIHRoZSBjYXNlIG9mIGR1cGxpY2F0ZXMsIHdlIGRvIGhhdmUgYSBjaG9pY2UgZm9yIHdoaWNoIGNsYXNzcGF0aCBlbnRyeQoraXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcgb25lLiA8dHQ+SVBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0T3JpZ2luYXRpbmdDbGFzc3BhdGhFbnRyeSgpPC90dD4sCitkZXNjcmliZWQgYWJvdmUsIHdpbGwgYmUgdXNlZCB0byBsb2NhdGUgYW4gZW50cnkgaW4gdGhlIGJ1aWxkIGNsYXNzcGF0aAorY2FycmluZyBpbXBvcnRhbnQgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24uIEEgc3BlY2lmaWMgY2xhc3NwYXRoIGVudHJ5CitzaG91bGQgYWx3YXlzIGJlIHByZWZlcnJlZCB0byBhIGdlbmVyaWMgY2xhc3NwYXRoIGVudHJ5IChleHRlbnNpb24gZm9sZGVycworZW50cmllcyBjYXJyeSBubyBzb3VyY2UgYXR0YWhtZW50IGluZm8pLCBhbmQgYW4gZWFybGllciBlbnRyeSBzaG91bGQgYmUKK3ByZWZlcnJlZCBvdmVyIGEgbGF0ZXIgb25lLgorPHA+Rm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgKHVudXN1YWwpIGJ1aWxkIGNsYXNzcGF0aDoKKzxicj4mbHQ7Y2xhc3NwYXRoPgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvanJlL2xpYi9leHQvKiI+Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBhdGg9Ii9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlcGF0aD0iL3NyYy9zZXJ2bGV0c3JjLnppcCI+Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBhdGg9Ii9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlcGF0aD0iL2JhY2t1cC9zZXJ2bGV0c3JjLnppcCI+Cis8YnI+Jmx0Oy9jbGFzc3BhdGg+Cis8YnI+dGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgIi9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIgaXMgY29uc2lkZXJlZAordG8gb3JpZ2luYXRlIGZyb20gdGhlIHNlY29uZCBjbGFzc3BhdGggZW50cnk6IHRoZSBzZWNvbmQgaXMgbW9yZSBzcGVjaWZpYwordGhhdCB0aGUgZmlyc3QsIGFuZCBpcyBlcXVhbGx5IHNwZWNpZmljIHRvLCBidXQgb3JkZXJlZCBlYXJsaWVyIHRoYW4sIHRoZQordGhpcmQuCis8aDM+CitFeHRlbnNpb24gRGlyZWN0b3JpZXMgYW5kIHRoZSBSdW50aW1lIENsYXNzcGF0aDwvaDM+CitCeSBkZWZhdWx0LCBqcmUvbGliL2V4dCBpcyB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yeSBhdCBydW50aW1lLiBPdmVycmlkaW5nCit0aGlzIGRlZmF1bHQgZW50YWlscyBzcGVjaWZ5aW5nIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHNldCB0aGUgdmFsdWUKK29mIHRoZSA8dHQ+amF2YS5leHQuZGlyczwvdHQ+IHN5c3RlbSBwcm9wZXJ0eS4gVGhpcyBzeXN0ZW0gcHJvcGVydHkgc3BlY2lmaWVzCitvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGluc3RhbGxlZCBleHRlbnNpb25zLCBlYWNoIHNlcGFyYXRlZAorYnkgPHR0PkZpbGUucGF0aFNlcGFyYXRvckNoYXI8L3R0Pi4KKzxwPldlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEpBUiBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgcnVudGltZQorY2xhc3MgcGF0aCBvciBub3QuIFNpbmNlIHRoZSBsYXVuY2hlciBpcyBKVk0taW5zdGFsbC10eXBlLXNwZWNpZmljLCBpdAorZmVlbHMgbGlrZSB0aGUgcmlnaHQgcGxhY2UgdG8gaGFyZGNvZGUgdGhlIGtub3dsZWRnZSBvZiBob3cgdG8gbWFwIGEgYnVpbGQKK2NsYXNzcGF0aCB0byBhIHJ1bnRpbWUgY2xhc3NwYXRoLiBUaGUgSkFSIGZvciB0aGUgc3RhbmRhcmQgY2xhc3MgbGlicmFyeQorZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcnVudGltZSBjbGFzc3BhdGggYmVjYXVzZSBpdCBpcyBpbXBsaWNpdGx5CitvbiB0aGUgYm9vdCBjbGFzc3BhdGguIFNpbWlsYXJseSwgYW55IEpBUiB0aGF0IGlzIGluY2x1ZGVkIGluIGFuIGV4dGVuc2lvbgorZGlyZWN0b3J5IGRvZXMgbm90IG5lZWQgdG8gYmUgbWVudGlvbmVkIGV4cGxpY2l0bHkuCis8aDM+CitBdHRhY2hpbmcgU291cmNlIHRvIExpYnJhcnkgSkFScyBpbiBhbiBFeHRlbnNpb24gRm9sZGVyPC9oMz4KK0pBUnMgZnJvbSBleHRlbnNpb24gZGlyZWN0b3JpZXMgYXJlIG5vdCByZWFsbHkgYW55IGRpZmZlcmVudCBmcm9tIG90aGVyCitjbGFzcyBsaWJyYXJpZXMuIEl0IHdvdWxkIG1ha2UgZGVidWdnaW5nIGRpZmZpY3VsdCBpZiB0aGVyZSB3ZXJlIG5vIHdheQordG8gYXR0YWNoZWQgc291cmNlIGNvZGUgdG8gYSBKQVIgaW4gYSBleHRlbnNpb24gZGlyZWN0b3J5LgorPHA+SG93IGRvZXMgb25lIGF0dGFjaCBzb3VyY2UgdG8gSkFScyBpbiBhbiBleHRlbnNpb24gZGlyZWN0b3J5PyBBcyB5b3UKK3JlY2FsbCBmcm9tIFIwLjksIHdlIGNvbnNjaW91c2x5IG9wdGVkIHRvIHB1dCB0aGUgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24KK2luIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgc2hhcmFibGUsIHJhdGhlciB0aGFuIGxlYXZlIHRoaXMgaW5mb3JtYXRpb24KK2xvY2FsIHRvIHRoZSB3b3Jrc3BhY2UuIFRoZSBBUEkgZm9yIGF0dGFjaGluZyBzb3VyY2UgaXMgb24gdGhlIGNsYXNzcGF0aAorZW50cnk7IHRoaXMgYWxsb3dzIHRoaXMgaW5mb3JtYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gZGV2ZWxvcGVycy4gQ2xlYXJseSwKK3RoaXMgd291bGQgbm90IHdvcmsgZm9yIGV4dGVuc2lvbiBkaXJlY3Rvcmllcywgd2hlcmUgdGhlIG5hbWVzIG9mIHRoZSBKQVJzCitpbiB0aGUgZGlyZWN0b3J5IG1pZ2h0IG5vdCBldmVuIGJlIGtub3duIGluIGFkdmFuY2UuIFRoZXJlIGlzIG5vIGdlbmVyYWwKK25hbWluZyBzY2hlbWUgZm9yIGxvY2F0aW5nIHRoZSBzb3VyY2UgY29kZSBmb3IgYSBnaXZlbiBKQVIgKHdlIGRvIG5vdCBwcm9wb3NpbmcKK3RvIGludmVudCBvbmUpLgorPHA+QXMgZGlzY3Vzc2VkIGluIHRoZSBzZWN0aW9uIG9uIHBhY2thZ2UgdmlldyBjbHV0dGVyLCBpdCB3aWxsIGJlIGNvbW1vbgorZm9yIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgdG8gY29udGFpbiBhIGRpdmVyc2Ugc2V0IG9mIEpBUnMsIG9ubHkgYSBoYW5kZnVsCitvZiB3aGljaCB3b3VsZCBiZSB1c2VkIHdpdGhpbiBhbnkgZ2l2ZW4gcHJvamVjdC4gVGhlIHByb3Bvc2FsIGlzIHRvIHByb3ZpZGUKK25vIGRpcmVjdCBzdXBwb3J0IGZvciBhdHRhY2hpbmcgc291cmNlIHZpYSBhbiBleHRlbnNpb24gZm9sZGVyIGNsYXNzcGF0aAorZW50cnkuIElmIHRoZSB1c2VyIG5lZWRzIHRvIHNlZSBzb3VyY2UgY29kZSBmb3IgYSBKQVIgaW4gYW4gZXh0ZW5zaW9uIGZvbGRlciwKK3RoZXkgd291bGQgbmVlZCB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBleHBsaWNpdCBjbGFzc3BhdGggZW50cnkgZm9yIHRoYXQKK0pBUi4gQXMgZGlzY3Vzc2VkIGFib3ZlLCB0aGlzIHdvdWxkIG5vdCByZXN1bHQgaW4gYSBuZXcgcGFja2FnZSBmcmFnbWVudAorcm9vdDsgaG93ZXZlciwgaXQgd291bGQgZWZmZWN0aXZlbHkgY2hhbmdlIHRoZSBvcmlnaW5hdGluZyBjbGFzc3BhdGggZW50cnkKK3RvIHRoZSBleHBsaWNpdCBvbmUgd2hlcmUgdGhlIHNvdXJjZSBhdHRhY2htZW50IGluZm9ybWF0aW9uIHdvdWxkIGJlIGZvdW5kLgorVGhpcyB3b3VsZCBhbGxvdyB0aGUgdXNlciB0byBhdHRhY2ggc291cmNlIGNvZGUgdG8gSkFScyBvbiBhbiBhcy1uZWVkZWQKK2Jhc2lzLiBUaGUgYmV0IGlzIHRoYXQgdGhpcyB3aWxsIHN1ZmZpY2UgKGFuZCBmaW5lc3NlcyB0aGUgaXNzdWUgb2Ygd2hlcmUKK29uZSBtaWdodCBmaW5kIHRoZSBzb3VyY2UgZm9yIGEgSkFSIGluIGFuIGV4dGVuc2lvbiBmb2xkZXIpLgorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dGVuc2lvbkRpci5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dGVuc2lvbkRpci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmM0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2V4dGVuc2lvbiBkaXIvZXh0ZW5zaW9uRGlyLmh0bWwKQEAgLTAsMCArMSw0NCBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbjk4OyBVKSBbTmV0c2NhcGVdIj4KKzwvaGVhZD4KKzxib2R5PgorCis8aDE+CitFeHRlbnNpb24gRGlyZWN0b3J5IFN1cHBvcnQ8L2gxPgorVGhlIFdTQUQgZWZmb3J0IGhhcyBleHBvc2VkIHRoZSBuZWVkIGZvciBleHRlbnNpb24gZGlyZWN0b3JpZXMgc28gYXMgdG8KK3NpbXBsaWZ5IHRoZWlyIGNsYXNzcGF0aCBzZXR1cC4gSW50ZXJlc3RpbmdseSBlbm91Z2gsIHRoZSBjbGFzc3BhdGggcmV3b3JrCisobWFrZSBjbGFzc3BhdGggbGVzcyBzZW5zaXRpdmUgdG8gcHJvamVjdCBjaGFuZ2UgZnJvbSBzb3VyY2UgdG8gYmluYXJ5Citmb3JtKSBoYXMgc29tZSBuaWNlIGNvbm5lY3Rpb25zIHdpdGggdGhpcyBwcm9qZWN0LgorPHA+VGhlIGRpcmVjdGlvbiBmb2xsb3dlZCB3b3VsZCBhbGxvdyB0byBjb250cmlidXRlIGFsbCBKQVJzIGNvbnRhaW5lZAoraW5zaWRlIGEgZ2l2ZW4gcHJvamVjdCB0byBkZXBlbmRlbnQgcHJvamVjdHMuIFRodXMgc3VjaCBhIHByb2plY3QgY291bGQKK2FjdCBhcyBhbiBleHRlbnNpb24gZGlyZWN0b3J5IHJlbGF0aXZlbHkgdG8gaXRzIGRlcGVuZGVudCBwcm9qZWN0cy4gVGhpcword291bGQgaG93ZXZlciByZXF1aXJlIHRvIG1hdGVyaWFsaXplIHN1Y2ggZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHdpdGggdHJ1ZQorcHJvamVjdHMsIGFuZCBjb3VsZCBiZSBjb25zaWRlcmVkIGFzIG9uZSB3YXkgdG8gYWNoaWV2ZSB0aGlzLCBidXQgYSB0cnVlCitleHRlbnNpb24gZGlyZWN0b3J5IHN1cHBvcnQgc2hvdWxkIGFsc28gZXhpc3QsIGluIGEgc2ltaWxhciB3YXkgYXMgd2UgYWxsb3cKK3VzZXJzIHRvIGRpcmVjdGx5IHJlZmVyIHRvIGV4dGVybmFsIEpBUnMgaWYgdGhleSB3YW50LgorPHA+V2UgY291bGQgYWRkIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBraW5kIGZvciB0aGVzZS4gTm93IHRoZSBuZXh0IGlzc3VlCitpczogZG8gd2UgYWxsb3cgY2xhc3NwYXRoIHZhcmlhYmxlcyB0byBkZW5vdGUgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzID8gUHJlc3VtYWJseSwKK3RoaXMgd291bGQgYmUgZXhwZWN0ZWQuCis8cD5BIGNsYXNzcGF0aCB2YXJpYWJsZSBpcyBub3QgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIGNsYXNzcGF0aCBlbnRyeSwgYnV0CityYXRoZXIgdG8gYW4gSVBhdGggd2hpY2ggaXMgdGhlbiByZXNvbHZlZCB3aGVuIHRoZSB2YXJpYWJsZSBpcyBzdWJzdGl0dXRlZAord2l0aCBhIHJlc29sdmVkIGNsYXNzcGF0aCBlbnRyeS4gVGhlIHJlc29sdXRpb24gcHJvY2VzcyBjYW4gZWl0aGVyIGJpbmQKK2EgdmFyaWFibGUgdG8gYSBwcm9qZWN0IG9yIGEgbGlicmFyeSwgZGVwZW5kaW5nIHRvIHdoYXQgdGhlIElQYXRoIG1hcHMKK3RvLgorPHA+SW4gdGhlIGxpYnJhcnkgY2FzZSwgaXQgY2FuIGVpdGhlciBiZSBhbiBhcmNoaXZlIGZpbGUgKCouamFyLCAqLnppcCkKK29yIGEgYmluYXJ5IGZvbGRlciAoKi5jbGFzcyBmaWxlcykuIFRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGFnYWluIGRlcGVuZGluZworb24gdGhlIG5hdHVyZSBvZiB3aGF0IHRoZSBJUGF0aCBtYXBzIHRvLCBpcyBpdCBhIEpBUi9aSVAgZmlsZSBvciBhIGZvbGRlci4KK05vdywgaWYgd2Ugd2FudCB0byBmaXQgdGhlIGV4dGVuc2lvbiBkaXJlY3Rvcnkgc3VwcG9ydCBpbiB0aGlzLCBpdCB3aWxsCitiZSBoYXJkIHRvIGRpc3Rpbmd1aXNoIGluIGJldHdlZW4gYSBmb2xkZXIgY29udGFpbmluZyBKQVJzIG9yIC5jbGFzcyBmaWxlcy4uLgorPHA+V2UgY291bGQgaG93ZXZlciBpbWFnaW5lIHRoYXQgdGhlIHN5bnRheCBvZiB0aGUgSVBhdGggd291bGQgdGVsbCB3aGljaAorb25lIGlzIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkLiBGb3IgZXhhbXBsZSwgYSBwYXRoIG9mIHRoZSBmb3JtICIvU29tZURpcmVjdG9yeSIKK3dvdWxkIGNvbnRpbnVlIHRvIGluZGljYXRlIGEgYmluYXJ5IGZvbGRlciwgd2hlcmVhcyAiL1NvbWVEaXJlY3RvcnkvKiIKK3dvdWxkIG1lYW4gYW4gZXh0ZW5zaW9uIGRpcmVjdG9yeS4gVGhlIGJlbmVmaXQgZm9yIHRoaXMgaXMgdGhhdCB3ZSBhY3R1YWxseQorZG8gbm90IG5lZWQgdG8gYWRkIGEgbmV3IHR5cGUgb2YgZW50cnkuIFdlIGp1c3QgYWRkIGEgdGhpcmQgZmxhdm9yIG9mIGEKK2xpYnJhcnkgZW50cnksIHRoZSBvbmUgbWFwcGluZyB0byBhbiBleHRlbnNpb24gZGlyZWN0b3J5LgorPHA+VGh1cywgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHdvdWxkIGp1c3QgYmUgcGFydGljdWxhciBjYXNlcyBvZiBsaWJyYXJ5CitvbmVzLCBhbmQgYmUgZWxpZ2libGUgaW4gY2xhc3NwYXRoIHZhcmlhYmxlcy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvamRvbSBhc3QvYXN0Lmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2pkb20gYXN0L2FzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTZlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2pkb20gYXN0L2FzdC5odG1sCkBAIC0wLDAgKzEsMjEwOCBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPkpEVCAtIEFic3RyYWN0IFN5bnRheCBUcmVlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPgorQWJzdHJhY3QgU3ludGF4IFRyZWVzPC9oMj4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5MYXN0IHJldmlzZWQgMTQ6MDAgRnJpZGF5IE9jdG9iZXIgMjYsIDIwMDEgKG1vc3QKK3JlY2VudCBjaGFuZ2UgaW4gYmx1ZSk8L2ZvbnQ+Cis8cD5PcmlnaW5hbCB3b3JrIGl0ZW06ICJFeHBvc2luZyB0aGUgQVNUIEFQSS4iCis8cD5SZWxhdGVkIHdvcmsgaXRlbTogIkltcHJvdmVkIEphdmEgY29kZSBtYW5pcHVsYXRpb24gc3VwcG9ydCwgYWRkcmVzcworSkRPTSBsaW1pdGF0aW9uczsgSkRPTSBkb2Vzbid0IHByZXNlcnZlIG1hcmtlcnMgYW5kIGlzbid0IGRvY3VtZW50IGF3YXJlOworSkRPTSBmaW5lciBncmFpbmVkIHVwZGF0ZSBzdXBwb3J0IChlLmcuIGNoYW5nZSBtZXRob2QgbmFtZSwgdHlwZSBuYW1lKTsKK2J1ZmZlciBjb250ZW50cyBpcyBkdXBsaWNhdGVkIGluIEphdmEgVUkgZG9jdW1lbnQgYW5kIG5lZWRzIHRvIGJlIG1hbnVhbGx5CitzeW5jaHJvbml6ZWQuIgorPGgzPgorQmFja2dyb3VuZDwvaDM+CisKKzx1bD4KKzxsaT4KK3JlZmFjdG9yaW5nIGlzIGEga2V5IGN1c3RvbWVyIChEaXJrIEIuKTwvbGk+CisKKzxsaT4KK2ZvciAyLjA6IGhhdmUgZ29vZCBzdXBwb3J0IGluIHBsYWNlIHNvIHRoYXQgcmVmYWN0b3JpbmcgY2FuIGJlIG1hZGUgYW4KK29wZW4gQVBJOyB3b3VsZCBuZWVkIGNvcnJlc3BvbmRpbmcgY29yZSBBUElzIGZvciBhYnN0cmFjdCBzeW50YXggdHJlZXM8L2xpPgorCis8bGk+CitjdXJyZW50IHJlZmFjdG9yaW5nIGFwcG9hY2ggdXNlcyBBU1QgdmlzaXRvciB3aGljaCBydW5zIHBvc3QtcmVzb2x2ZSBvbgorZGVzaWduYXRlZCBjb21waWxhdGlvbiB1bml0PC9saT4KKworPGxpPgordmlzaXRvciBjb2xsZWN0cyBpbmZvIChwYXJlbnQgc3RhY2spIGluY2x1ZGluZyBzb3VyY2UgcG9zaXRpb25zPC9saT4KKworPGxpPgordXNlcyBuYW1lIGVudmlyb25tZW50IChiaW5kaW5ncywgc2NvcGVzKSB0byB2YWxpZGF0ZS9sb2NhdGU8L2xpPgorCis8bGk+CithbGwgY2hhbmdlcyBhcmUgZm9ybXVsYXRlZCBhcyByZWlmaWVkIHVuZG9hYmxlIGVkaXRzIGluIGEgc291cmNlIGJ1ZmZlcjwvbGk+CisKKzxsaT4KK2EgYmF0Y2ggb2YgY2hhbmdlcyBhcmUgbWFkZSBhdCBhIHRpbWU8L2xpPgorCis8bGk+CityZWZhY3RvcmluZyBkb2VzIG5vdCByZWFzb24gaHlwb3RoZXRpY2FsbHkgKGNoYW5nZXMgYXJlIHVuZG9hYmxlKTwvbGk+CisKKzxsaT4KK0pET00gaXMgbm90IHVzZWQgYnkgcmVmYWN0b3JpbmcsIGJ1dCBwb3RlbnRpYWxseSBjb3VsZCBiZSAoSkRPTSBpcyB1c2VkCitpbnNpZGUgSmF2YSBNb2RlbCk8L2xpPgorPC91bD4KK0RpcmsncyB3aXNoIGxpc3Qgd2l0aCByZWdhcmQgdG8gdGhlIEFTVCBzdXBwb3J0OgorPHVsPgorPGxpPgorY29uc2lzdGVudCBwb3NpdGlvbnMgaW4gQVNUIChlLmcuIHNvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQgc2hvdWxkIGFsd2F5cworY292ZXIgdGhlIHdob2xlIG5vZGUpLjwvbGk+CisKKzxsaT4KK2NvbW1lbnQgaGFuZGxpbmcgaW4gQVNULiBTb21lIG5vZGUgY29udGFpbiBwcmVjZWRpbmcgY29tbWVudHMgb3RoZXIgZG9uJ3Q8L2xpPgorCis8bGk+CitQYXJlbnQgcG9pbnRlciBpbiBBU1Qgbm9kZS48L2xpPgorCis8bGk+CitEYXRhIHBvaW50ZXIgaW4gQVNUIG5vZGUuPC9saT4KKworPGxpPgorRXhwcmVzc2lvbiBzaG91bGQgcHJvdmlkZSBnZXRUeXBlIG1ldGhvZCAoY2FjaGVkIHZhbHVlIG9mIHJlc29sdmVUeXBlKFNjb3BlKSkuPC9saT4KKzwvdWw+CisKKzxoMz4KK1N1bW1hcnkgZnJvbSBTZXB0LiAxMC0xMSBtZWV0aW5nczwvaDM+CitEaXJrIHRyYXZlbGxlZCB0byBTTlogdG8gZGlzY3VzcyByZWZhY3RvcmluZyByZXF1aXJlbWVudHMgYW5kIHBvc3NpYmxlCitzb2x1dGlvbnMgd2l0aCBQaGlsaXBwZSBNLiBhbmQgSmVlbS4KKzxwPlNvbWUgb2YgdGhlIGZvcm1zIG9mIHNvbHV0aW9ucyBkaXNjdXNzZWQsIGJ1dCB1bHRpbWF0ZWx5IGFiYW5kb25lZDoKKzx1bD4KKzxsaT4KK0EgdmFuaWxsYSBET00uPC9saT4KKworPHVsPgorPGxpPgordG9vIGxpbWl0aW5nOiBkaWZmaWN1bHQgdG8gcHJvdmlkZSBmb3IgcHJlLWNvbXB1dGluZyBiaW5kaW5ncy48L2xpPgorCis8bGk+CitjbHVtc3kgZm9yIGNsaWVudHMgdG8gdXNlIHdpdGhvdXQgQVNUIG5vZGUgdHlwZXMgcmVwcmVzZW50ZWQgYnkgZGlmZmVyZW50CitKYXZhIHR5cGVzPC9saT4KKzwvdWw+CisKKzxsaT4KK0FTVCBwbHVzIHJlc29sdmVzIGluZm8gaW4gZm9ybSBvZiBKYXZhIG1vZGVsIGVsZW1lbnRzLjwvbGk+CisKKzx1bD4KKzxsaT4KK0phdmEgbW9kZWwgbWV0aG9kcyBhcmUgdW5zdWl0YWJsZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIHJlc29sdmVkCittZXRob2RzIGJlY2F1c2UgcGFyYW1ldGVyIHR5cGVzIGFyZSBhcyBwZXIgc291cmNlLjwvbGk+CisKKzxsaT4KK0l0IGlzIGhhcmQgdG8gbWFwIGEgdHlwZSBiYWNrIHRvIGEgSmF2YSBlbGVtZW50IChuZWVkIHRvIHJlbWVtYmVyIHBhY2thZ2UKK2ZyYWdtZW50KS48L2xpPgorCis8bGk+CitXb3VsZCBuZWVkIGFkZGl0aW9uYWwgSmF2YSBtb2RlbCBlbGVtZW50cyB0byByZXByZXNlbnQgdmFyaWFibGUgZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK1dvdWxkIG5lZWQgc3BlY2lhbCBKYXZhIGVsZW1lbnQgaW1wbGVtZW50YXRpb25zIGZvciBsb2NhbCB0eXBlcywgbWV0aG9kcywKK2FuZCBmaWVsZHMuPC9saT4KKzwvdWw+Cis8L3VsPgorSW4gdGhlIGVuZCwgd2UgYWdyZWVkIG9uIEFTVCBwbHVzIGJpbmRpbmdzOgorPHVsPgorPGxpPgorQVNUIGlzIHNpbXBsZSB0cmVlIG9mIHR5cGVkIG5vZGVzIGFzIGRldGVybWluZWQgYnkgcGFyc2VyLjwvbGk+CisKKzxsaT4KK0EgZGlmZmVyZW50IEphdmEgdHlwZSBmb3IgZWFjaCBBU1Qgbm9kZSB0eXBlLjwvbGk+CisKKzxsaT4KK1RCRDogYXJlIG5vZGUgdHlwZXMgQVBJIGNsYXNzZXMsIEFQSSBpbnRlcmZhY2VzLCBvciBib3RoPzwvbGk+CisKKzxsaT4KK1NpbXBsZSBjYXNlOiBubyBiaW5kaW5ncy48L2xpPgorCis8bGk+CitCYXNpYyBBU1QgTGlmZWN5Y2xlOiBjbGllbnQgcmVxdWVzdHMgQVNUOyBjb21waWxhdGlvbiB1bml0IGlzIHBhcnNlZCBhbmQKK25vZGVzIGFyZSBjcmVhdGVkOyByb290IGlzIGhhbmRlZCBiYWNrIHRvIGNsaWVudDsgQVNUIGlzIGdhcmJhZ2UgY29sbGVjdGVkCithZnRlciBjbGllbnQgbGV0cyBnbyBvZiBhbGwgQVNUIG5vZGVzLiBBU1QgaXMgbm90IGFmZmVjdGVkIGlmIHVuZGVybHlpbmcKK2NvbXBpbGF0aW9uIHVuaXQgaXMgY2hhbmdlZCAoaS5lLiwgZWFnZXIgcGFyc2UsIHdpdGggbm8gcmVzaWR1YWwgZGVwZW5kZW5jZQorb24gc3RhdGUgb2YgZmlsZSBpbiB3b3Jrc3BhY2UpLjwvbGk+CisKKzxsaT4KK0FueSBzeW50YXggZXJyb3JzIGRldGVjdGVkIG5lZWQgdG8gYmUgcmVwb3J0ZWQgdG8gY2xpZW50LiBQcm9ibGVtcyBhcmUKK29wYXF1ZTogc291cmNlIGNoYXJhY3RlciBwb3NpdGlvbiBwbHVzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuIENsaWVudHMKK25lZWRzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIEFTVCBpcyBvbmx5IHBhcnRpYWwgKGUuZy4sIGJ1c3RlZCBmbGFncykuPC9saT4KKworPGxpPgorUHJlZGljYXRhYmxlIHRyZWVzIHdpdGggc2ltcGxlIGNvcnJlc3BvbmRlbmNlIHRvIHNvdXJjZSBjb2RlIChwYXJzZXIgc2hvdWxkCitub3Qgb3B0aW1pemUgQVNUcykuPC9saT4KKworPGxpPgorUmVsaWFibGUgc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgbm9kZXMuPC9saT4KKworPGxpPgorU2NyYXRjaCAiZGF0YSIgZmllbGQgb24gZWFjaCBBU1Qgbm9kZSBmb3IgY2xpZW50IHRvIHJlY29yZCBhbiBPYmplY3QuPC9saT4KKworPGxpPgorTmF2aWdhdGUgQVNUIHVwd2FyZHMgYXMgd2VsbCBhcyBkb3dud2FyZHMuIFBhcmVudCBsaW5rLjwvbGk+CisKKzxsaT4KK0FTVCB3YWxrZXIgZm9yIGNvbnZlbmllbnQgdHJhdmVyc2FsLjwvbGk+CisKKzxsaT4KK0FTVHMgY2FuIGJlIHJlYWQtb25seSBvciByZWFkLXdyaXRlLjwvbGk+CisKKzxsaT4KK1JlYWQtd3JpdGUgQVNUcyBjYW4gYmUgbW9kaWZpZWQgaW4gdGVybXMgb2YgQVNUcy4gQVNUIG5vZGUgZmFjdG9yaWVzIChubworSmF2YSBwYXJzZXIgcmVxdWlyZWQpLiBDdXQvY29weS9wYXN0ZS48L2xpPgorCis8bGk+CitDdXQvY29weS9wYXN0ZSBiZXR3ZWVuIHNlcGFyYXRlIEFTVHMgcmVxdWlyZXMgZnJhZ21lbnQgY2xvbmluZyB0byBwcmVzZXJ2ZQoraW5kZXBlbmRlbmNlIG9mIHN0b3JhZ2UuPC9saT4KKworPGxpPgorQ2xpZW50IG1heSBiZSBpbnRlcmVzdGVkIGluIGN1dC9jb3B5L3Bhc3RpbmcgY29tbWVudHMgdG9vLjwvbGk+CisKKzxsaT4KK05ldyBub2RlcyB3b3VsZCBub3QgY2Fycnkgc291cmNlIHBvc2l0aW9ucy48L2xpPgorCis8bGk+CitSZWFkLXdyaXRlIEFTVCBjYW4gYmUgc2VyaWFsaXplZCBiYWNrIHRvIGNvbXBpbGF0aW9uIHVuaXQgY2hhcltdLjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByZXNlcnZlIGV4aXN0aW5nIGNvbW1lbnRzLCB3aGl0ZXNwYWNlLCBhbmQgdXNlIG9mIFx1LjwvbGk+CisKKzxsaT4KK0NvbnRyb2wgd2hpdGVzcGFjZSBhbmQgdXNlIG9mIFx1IGZvciBpbnNlcnRpb25zLjwvbGk+CisKKzxsaT4KK1Byb3ZpZGUgZWRpdCBtYXAgZm9yIHVwZGF0aW5nIG1hcmtlcnMuPC9saT4KKzwvdWw+CisKKzxsaT4KK1Jlc29sdmVkIEFTVHM6IGJhc2ljIEFTVCBhbm5vdGF0ZWQgd2l0aCBiaW5kaW5ncyAobm9uLXN5bnRhY3RpYyBpbmZvcm1hdGlvbikuPC9saT4KKworPGxpPgorQmluZGluZyBpbmZvcm1hdGlvbiBpcyBkZXJpdmVkIGZyb20gQVNUIHBsdXMgdGhlIEphdmEgbW9kZWwgKHJlbGF0aXZlIHRvCitzb21lIHByb2plY3QpLjwvbGk+CisKKzxsaT4KK0F2YWlsYWJpbGl0eS92YWxpZGl0eSBvZiBiaW5kaW5ncyBjZWFzZXMgd2hlbiBKYXZhIG1vZGVsIGNoYW5nZXMuPC9saT4KKworPGxpPgorQ2xpZW50IG11c3QgcmVxdWVzdCB1cCBmcm9udCB0aGF0IGJpbmRpbmdzIGJlIGNyZWF0ZWQuPC9saT4KKworPGxpPgorQ2VydGFpbiBBU1Qgbm9kZXMgZ2V0IGRlY29yYXRlZCB3aXRoIGJpbmRpbmdzLjwvbGk+CisKKzxsaT4KK0NsaWVudCBzaG91bGQgaGF2ZSB3YXlzIHRvIGNvbW11bmljYXRlIHVwIGZyb250IHdoYXQga2luZCBvZiBiaW5kaW5ncyBhcmUKK3JlcXVpcmVkIGFuZCB3aGVyZS48L2xpPgorCis8bGk+CitBdmFpbGFiaWxpdHkvdmFsaWRpdHkgb2YgYmluZGluZ3MgZm9yIGEgcmVhZC13cml0ZSBBU1QgY2Vhc2VzIHdoZW4gaXQgaXMKK2ZpcnN0IG1vZGlmaWVkLjwvbGk+CisKKzxsaT4KK0JpbmRpbmdzIChub24tc3ludGFjdGljIGluZm9ybWF0aW9uKSBpbmNsdWRlcyB0aGluZ3Mgc3VjaCBhcyB0aGUgZm9sbG93aW5nOjwvbGk+CisKKzx1bD4KKzxsaT4KK1Jlc29sdmVkIG5hbWVzIC0gd2hpY2ggdHlwZSwgZmllbGQsIG1ldGhvZCwgb3IgbG9jYWwgdmFyaWFibGUgZG9lcyBhIEFTVAorbmFtZSByZWZlcm5jZSByZXNvbHZlIHRvLjwvbGk+CisKKzxsaT4KK1Jlc29sdmVkIHR5cGVzIC0gd2hhdCBpcyB0aGUgcmVzb2x2ZWQgdHlwZSBvZiBhbiBBU1QgZXhwcmVzc2lvbiBvciB0eXBlCityZWZlcmVuY2UuPC9saT4KKworPGxpPgorUmVzb2x2ZWQgc3VwZXJ0eXBlcyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCBzdXBlcnR5cGVzIG9mIGEgcmVzb2x2ZWQgdHlwZS48L2xpPgorCis8bGk+CitSZXNvbHZlZCBkZWNsYXJhdGlvbnMgLSB3aGF0IHJlc29sdmVkIHR5cGUsIGZpZWxkLCBtZXRob2QsIG9yIGxvY2FsIHZhcmlhYmxlCitkb2VzIGFuIEFTVCBkZWNsYXJhdGlvbiBtYXAgdG8uPC9saT4KKworPGxpPgorVGhyb3duIGV4Y2VwdGlvbnMgLSB3aGF0IGFyZSB0aGUgcmVzb2x2ZWQgdHlwZXMgb2YgdGhlIGV4Y2VwdGlvbnMgdGhyb3duCitieSBhIGdpdmVuIGV4cHJlc3Npb24gb3Igc3RhdGVtZW50LjwvbGk+CisKKzxsaT4KK1Jlc29sdmVkIG1lbWJlcnMgLSB3aGF0IGFyZSB0aGUgcmVzb2x2ZWQgbWVtYmVycyBvZiBhIHJlc29sdmVkIHR5cGUuPC9saT4KKzwvdWw+CisKKzxsaT4KK1Byb2JsZW1zIGFsc28gc2hvdWxkIGJlIHJlcG9ydGVkIHdpdGggcmVzb2x2aW5nLiBQcm9ibGVtcyBhcmUgb3BhcXVlOiBzb3VyY2UKK2NoYXJhY3RlciBwb3NpdGlvbiBwbHVzIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuPC9saT4KKworPGxpPgorU3BhY2UgZm9yIGJpbmRpbmdzIHN0b3JhZ2UgaXMgc2lnbmlmaWNhbnQ7IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5IGFzIG1vcmUKK2JpbmRpbmdzIGFyZSBhY2Nlc3NlZC48L2xpPgorCis8bGk+CitTcGFjZSBmb3IgYmluZGluZ3MgaXMgZm9yIGxpZmV0aW1lIG9mIHRoZSBBU1QuPC9saT4KKworPGxpPgorQWR2YW5jZWQgQVNUIExpZmVjeWNsZTogY2xpZW50IHJlcXVlc3RzIEFTVCB3aXRoIGJpbmRpbmdzOyBjb21waWxhdGlvbgordW5pdCBpcyBwYXJzZWQsIG5vZGVzIGNyZWF0ZWQsIGFuZCBwZXJoYXBzIHNvbWUgYmluZGluZ3MgY3JlYXRlZCBhbmQgYW5ub3RhdGVkCitvbiBub2Rlczsgcm9vdCBpcyBoYW5kZWQgYmFjayB0byBjbGllbnQ7IEFTVCBpcyBnYXJiYWdlIGNvbGxlY3RlZCBhZnRlcgorY2xpZW50IGxldHMgZ28gb2YgYWxsIEFTVCBub2RlcyBhbmQgYmluZGluZ3MuIEFTVCBpdHNlbGYgaXMgbm90IGFmZmVjdGVkCitpZiB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXMgY2hhbmdlZCAoaS5lLiwgZWFnZXIgcGFyc2UsIHdpdGggbm8gcmVzaWR1YWwKK2RlcGVuZGVuY2Ugb24gc3RhdGUgb2YgZmlsZSBpbiB3b3Jrc3BhY2UpLiBCaW5kaW5ncyBtYXkgYmVjb21lIHN0YWxlIG9yCitpbnZhbGlkIGlmIHdvcmtzcGFjZSBjaGFuZ2VzIChpLmUuLCBwb3NzaWJseSBsYXp5IGFuZCBpbmNyZW1lbnRhbCBjb25zdHJ1Y3Rpb24KK29mIGJpbmRpbmdzIHVzaW5nIEphdmEgbW9kZWwpLjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5CaW5kaW5ncyBmcm9tIHR3byBBU1RzIGFyZSBub3QgZ2VuZXJhbGx5IGNvbXBhcmFibGUuPC9mb250PjwvbGk+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5Gb3IgYmluZGluZ3Mgd2l0aCBzdGFibGUgZ2xvYmFsIG5hbWVzLCBBUEkgcHJvdmlkZXMKK3N0cmluZ3MgdGhhdCBjYW4gYmUgY29tcGFyZWQgYmV0d2VlbiBBU1RzLjwvZm9udD48L2xpPgorPC91bD4KKzwvdWw+CitBU1Qgd2lsbCBlaXRoZXIgZXh0ZW5kIG9yIHJlcGxhY2UgSkRPTS4gSW4gdGhlIGxhdHRlciBjYXNlLCBKRE9NIHdvdWxkCitiZSBkZXByZWNhdGVkLgorPHA+QVNUIHdpbGwgZXhpc3QgYWxvbmcgc2lkZSBKYXZhIG1vZGVsLgorPGgzPgorQVBJIERlc2lnbiBJc3N1ZTogQVNUIE5vZGUgVHlwZXMgLSBDbGFzc2VzLCBpbnRlcmZhY2UsIG9yIGJvdGg8L2gzPgorVGhlcmUgYXJlIG9uIHRoZSBvcmRlciBvZiA4NyBub2RlIHR5cGVzIGZvciBKYXZhIEFTVHMuIEJpbmRpbmdzIHdpbGwgYWRkCitzb21lIG1vcmUuIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiB3YXkgdGhpcyBjYW4gYmUgbWFwcGVkIHRvIEphdmEgdHlwZXMuCis8cD4oMSkgVXNlIG9yZy53M2MuRE9NIGludGVyZmFjZXMgYXMgQVBJLiBQcm92aWRlIGEgcHJpdmF0ZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgorb2YgdGhlIERPTS4KKzxwPlBybzogVmVyeSBzbWFsbCwgYW5kIHN0YW5kYXJkIEFQSSBmb3IgcmVhZC13cml0ZSBkb2N1bWVudHMuCis8YnI+Q29uOiBBUEkgaXMgbm90IGNvbnZlbmllbnQgZm9yIGNsaWVudHMuCis8YnI+Q29uOiBBUEkgaXMgbm90IGFtZW5hYmxlIHRvIGV4cG9zaW5nIGJpbmRpbmdzIGFuZCBvdGhlciBub24tc3RydWN0dXJhbAoraW5mb3JtYXRpb24uCis8cD4oMikgQ29uY3JldGUgQVBJIGNsYXNzIHBlciBBU1Qgbm9kZSB0eXBlLgorPHA+UHJvOiBBUEkgYXMgc21hbGwgYXMgcG9zc2libGUuCis8YnI+UHJvOiBDbGllbnQgY2FuIGNyZWF0ZSBub2RlcyBkaXJlY3RseS4KKzxwPkNvbjogQ2Fubm90IGVhc2lseSBoaWRlIGltcGxlbWVudGF0aW9uIGRldGFpbHM7IGUuZy4gcmVwcmVzZW50YXRpb24KK2FuZCBtZWNoYW5pc20gZm9yIHJlYXNzZW1ibGluZyBjb21waWxhdGlvbiB1bml0IHRleHQgYWZ0ZXIgZWRpdGluZzsgbGF6eQorYmluZGluZyBjcmVhdGlvbi4KKzxwPkNsaWVudHMgd2hvIGNyZWF0ZSBub2RlIGZyb20gc2NyYXRjaCBvbmx5IGV2ZXIgbmVlZCBiYXNpYyBjb25zdHJ1Y3RvcnMKKyh0aGUgbm9kZXMgdGhleSBjcmVhdGUgZG8gbm90IGhhdmUgc291cmNlIHBvc2l0aW9ucywgYmluZGluZ3MsIG9yIG90aGVyCitkZWNvcmF0aW9ucykuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgcGFyc2VyIG5lZWRzIHRvIHJlbWVtYmVyIG1vcmUgaW5mbworaW5jbHVkaW5nIGZpbmUtZ3JhaW5lZCBzb3VyY2UgcG9zaXRpb25zLgorPHA+KDMpIEFQSSBpbnRlcmZhY2UgcGVyIEFTVCBub2RlIHR5cGUsIGFsb25nIHdpdGggbm9kZSBmYWN0b3J5IG1ldGhvZHMuCitQcm92aWRlIGEgcHJpdmF0ZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbi4gQWxsb3cgY2xpZW50cyB0byByZWltcGxlbWVudAorbm9kZSB0eXBlcyAoZnJvbSBzY3JhdGNoKSBhbmQgc3VwcGx5IGEgZmFjdG9yeS4KKzxwPkxpa2UgSkRPTSAoZXhjZXB0IEpET00gZG9lcyBub3QgcGVybWl0IGNsaWVudCB0byByZWltcGxlbWVudCkgYW5kIG9yZy53M2MuZG9tLgorPHA+UHJvOiBBUEkgYXMgc21hbGwgYXMgcG9zc2libGUuCis8YnI+UHJvOiBFYXN5IHRvIHRhaWxvciBkaWZmZXJlbnQga2luZHMgb2YgcmVwcmVzZW50YXRpb246IHJlYWQtd3JpdGUgdnMuCityZWFkLW9ubHkgQVNUczsgcmF3IEFTVHMgdnMuIEFTVCtiaW5kaW5ncy4KKzxwPkNvbjombmJzcDsgSGlkZGVuIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdGFrZXMgbW9yZSBzcGFjZS4KKzxicj5Db246IFVzaW5nIGZhY3RvcnkgbWV0aG9kcyBpcyBhIGJpdCBsZXNzIGRpcmVjdCB0aGFuIHVzaW5nIGNvbnN0cnVjdG9ycy4KKzxwPldlIHdpbGwgdXNlIEFQSSBpbnRlcmZhY2VzIGZvciBiaW5kaW5ncywgYW5kIGV4cG9zZWQgQVBJIGNsYXNzZXMgZm9yCitBU1Qgbm9kZXMuCis8aDM+CitBUEkgRGVzaWduIElzc3VlOiBTdGF0ZW1lbnQgdnMuIFN0YXRlbWVudCBMaXN0czwvaDM+CitGb3Igc3RydWN0dXJlZCBzdGF0ZW1lbnRzLCBsaWtlIHdoaWxlLCB0aGUgY2hpbGQgc3RhdGVtZW50IGlzIGdyYW1tYXRpY2FsbHkKK2Egc2luZ2xlIHN0YXRlbWVudC4gSG93ZXZlciwgc2luY2UgYSBibG9jayBpcyBvbmUgdHlwZSBvZiBzdGF0ZW1lbnQsIGl0CitpcyBwb3NzaWJsZSB0byBoYXZlIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIHVuZGVybmVhdGguIFRoZXJlIGFyZSBvcHRpb25zCitmb3IgcmVuZGVyaW5nIHRoaXM6Cis8cD4oMSkgQ2hpbGQgaXMgYSBzaW5nbGUgc3RhdGVtZW50LgorPHA+KExpa2UgY3VycmVudCBjb21waWxlcidzIGludGVybmFsIEFTVHMuKQorPHA+UHJvOiBBcyBwZXIgdGhlIEphdmEgZ3JhbW1hci4KKzxicj5Db246IEEgY2xpZW50IHdhbnRpbmcgdG8gaW5zZXJ0IGFuIGFkZGl0aW9uYWwgc3RhdGVtZW50IGludG8gdGhlIGNoaWxkCittdXN0IGJlIHByZXBhcmVkIHRvIHJlcGxhY2UgYnkgYSBibG9jayBpZiB0aGVyZSBpc24ndCBvbmUuCis8cD4oMikgQ2hpbGQgaXMgYSBsaXN0IG9mIHN0YXRlbWVudHMuCis8cD4oTGlrZSB0aGUgLm5ldCBjb2RlRE9NLikKKzxwPlBybzogTW9yZSBjb252ZW5pZW50IGZvciBjbGllbnRzIHRoYXQgZWRpdCBBU1RzLiBVbmlmb3JtIG1lY2hhbmlzbSBmb3IKK2luc2VydGluZyBhbmQgcmVtb3Zpbmcgc3RhdGVtZW50cyBmcm9tIGNoaWxkLgorPGJyPkNvbjogTXVkZGllcyBzY29wZXMgKGVuY2xvc2luZyBicmFjZXMgYXJvdW5kIHN0YXRlbWVudHMgaW50cm9kdWNlIGEKK3Njb3BlIGFuZCBtYWtlIGRlY2xhcmF0aW9ucyBzeW50YWN0aWNhbGx5IGxlZ2FsKS4KKzxwPldlIHdpbGwgZ28gd2l0aCAoMSkgYW5kIHN0aWNrIGNsb3NlbHkgdG8gdGhlIGdyYW1tYXIuCis8aDM+CitVc2FnZTwvaDM+CitUaGVyZSBhcmUgYSBjb3VwbGUgZGlmZmVyZW50IHVzYWdlIHNjZW5hcmlvcyBmb3IgQVNUczoKKzx1bD4KKzxsaT4KK0FuYWx5emUgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCB0byBkaXNjb3ZlciBzeW50YWN0aWMgc3RydWN0dXJlLjwvbGk+CisKKzxsaT4KK0Rpc2NvdmVyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN5bnRhY3RpYyBzdHJ1Y3R1cmUgYW5kIG9yaWdpbmFsIHRleHQuPC9saT4KKworPGxpPgorRGlzY292ZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gc3ludGFjdGljIHN0cnVjdHVyZSBhbmQgcmVzb2x2ZWQgd29ybGQuPC9saT4KKworPGxpPgorQ3JlYXRlIGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQgZnJvbSBzY3JhdGNoLjwvbGk+CisKKzxsaT4KK0VkaXQgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdC48L2xpPgorPC91bD4KKworPGgzPgorU291cmNlIENvbnN0cnVjdCBOb3JtYWxpemF0aW9uPC9oMz4KKworPHVsPgorPGxpPgorTW9zdCBzeW50YWN0aWMgY29uc3RydWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gb25lIGFuZCBvbmx5IG9uZSB3YXkuPC9saT4KKworPGxpPgorV2hlbiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIEFTVCBjb25zdHJ1Y3Rpb24gaXMgImxvc3N5Ii48L2xpPgorCis8bGk+CitTb21lIGZvcm1zIGNhbm5vdCBiZSBkaXN0aW5ndWlzZWQgaW4gaW5wdXQgKGlmIG9uZSBjYXJlcykuPC9saT4KKworPGxpPgorU29tZSBmb3JtcyBjYW5ub3QgYmUgcHJvZHVjZWQgaW4gb3V0cHV0LjwvbGk+CisKKzxsaT4KK0NvcHlpbmcgdGhlIGNvbnN0cnVjdCBub3JtYWxpemVzIGl0LjwvbGk+CisKKzxsaT4KK0V4YW1wbGU6IE1vZGlmaWVyIG9yZGVyPC9saT4KKworPHVsPgorPGxpPgorZmluYWwgc3RhdGljIHB1YmxpYyBpbnQgWCA9IDE7PC9saT4KKworPGxpPgorcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWCA9IDE7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KKzwvdWw+CisKKzxsaT4KK0V4YW1wbGU6IENvbXBvdW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9uczwvbGk+CisKKzx1bD4KKzxsaT4KK2ludCBpID0gMSwgaiA9IDI7PC9saT4KKworPGxpPgoraW50IGkgPSAxOyBpbnQgaiA9IDI7Jm5ic3A7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KKzwvdWw+CisKKzxsaT4KK0V4YW1wbGU6IEFycmF5IHR5cGUgZGVjbGFyYXRvcnM8L2xpPgorCis8dWw+Cis8bGk+CitpbnRbXSB4W107PC9saT4KKworPGxpPgoraW50W11bXSB4OyAvLyBwcmVmZXJyZWQgZm9ybTwvbGk+Cis8L3VsPgorCis8bGk+CitFeGFtcGxlOiBTaG9ydCBpZnM8L2xpPgorCis8dWw+Cis8bGk+CitpZiAoYSkgZigpOyBlbHNlIDs8L2xpPgorCis8bGk+CitpZiAoYSkgZigpOyAvLyBwcmVmZXJyZWQgZm9ybTwvbGk+Cis8L3VsPgorCis8bGk+CitDYW4gb25seSBiZSBkb25lIGZvciBzeW50YWN0aWMgbnVhbmNlcyB0aGF0IGFyZSBoYXZlIG5vIHNlbWFudGljIGltcG9ydC48L2xpPgorCis8bGk+CitOb3JtYWxpemF0aW9uIGlzIGdlbmVyYWxseSBhY2NlcHRhYmxlIHdoZXJlIHVuaW1wb3J0YW50IHN5bnRhY3RpYyBudWFuY2VzCithcmUgaW52b2x2ZWQuPC9saT4KKworPGxpPgorTm9ybWFsIGZvcm0gc2hvdWxkIGZvbGxvdyBKTFMgcmVjb21tZW5kYXRpb25zIGFuZCBKYXZhIGNvZGluZyBzdGFuZGFyZHMuPC9saT4KKworPGxpPgorTm90ZSB0aGF0IHBhcmVudGhlc2VzIGFuZCBibG9ja3MgYXJlIGltcG9ydGFudCB0byB1c2VyIGFuZCBzaG91bGQgbm90IGJlCitub3JtYWxpemVkLjwvbGk+Cis8L3VsPgorCis8aDM+CitTb3VyY2UgUG9zaXRpb25zPC9oMz4KKworPHVsPgorPGxpPgorV2hlbiBBU1QgaXMgb2J0YWluZWQgYnkgcGFyc2luZyBhIHRleHQgc3RyaW5nLCBleHBvc2luZyBzb3VyY2UgcmFuZ2VzIGZvcgorbm9kZXMgYWxsb3dzIGNsaWVudHMgdG8gbmF2aWdhdGUgYmFjayBpbnRvIG9yaWdpbmFsIHN0cmluZzsgZS5nLiwgZm9yIG1ha2luZwordGV4dCBlZGl0b3Igc2VsZWN0aW9ucy48L2xpPgorCis8bGk+CitBU1Qgc3VwcG9ydHMgb25seSBjaGFyYWN0ZXItb3JpZW50ZWQgcG9zaXRpb24gaW5mb3JtYXRpb247IG1hcHBpbmcgY2hhcmFjdGVyCitwb3NpdGlvbnMgdG8gbGluZXMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlIChlLmcuLCB0ZXh0IGVkaXRvcikuPC9saT4KKworPGxpPgorU291cmNlIHJhbmdlcyBhcmUgaXJyZWxldmFudCBmb3Igbm9kZXMgY3JlYXRlZCBieSBvdGhlciBtZWFucy48L2xpPgorCis8bGk+CitTb3VyY2UgcmFuZ2VzIGdpdmUgb3JpZ2luYWwgcG9zaXRpb24gaW4gb3JpZ2luYWwgc3RyaW5nLjwvbGk+CisKKzx1bD4KKzxsaT4KK0VkaXRpbmcgdGhlIEFTVCBkb2VzIG5vdCBhbHRlciBwb3NpdGlvbnMgb3IgYW55dGhpbmcgY2xldmVyLjwvbGk+Cis8L3VsPgorCis8bGk+CitNb3N0IGNvbnN0cnVjdHMgb2NjdXB5IGNvbnRpZ3VvdXMgY2hhcmFjdGVyIHBvc2l0aW9ucywgb3IgcmFuZ2VzLjwvbGk+CisKKzxsaT4KK1JhbmdlcyBhcmUgcmVwcmVzZW50ZWQgYnkgMC1iYXNlZCBzdGFydCBwb3NpdGlvbiBhbmQgbGVuZ3RoLjwvbGk+CisKKzxsaT4KK1N0YXJ0IHBvc2l0aW9uIGJlZ2lucyBhdCBmaXJzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIgb2YgY29uc3RydWN0IGNvcnJlc3BvbmRpbmcKK3RvIEFTVCBub2RlLjwvbGk+CisKKzx1bD4KKzxsaT4KK0ZpcnN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIGxlYWRpbmcgd2hpdGVzcGFjZS48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIHByZWNlZGluZyBjb21tZW50IChleGNlcHQgdGhlIGphdmFkb2MgY29tbWVudCBwcmVjZWRpbmcKK2EgZGVjbGFyYXRpb24sIG9yIHRoZSBjb21tZW50IHByZWNlZGluZyBhIHN0YXRlbWVudCAtIHNlZSBiZWxvdykuPC9saT4KKzwvdWw+CisKKzxsaT4KK0VuZCBwb3NpdGlvbiBpbmNsdWRlcyBsYXN0IHNpZ25pZmljYW50IGNoYXJhY3RlciBvZiBjb25zdHJ1Y3QgY29ycmVzcG9uZGluZwordG8gQVNUIG5vZGUuPC9saT4KKworPHVsPgorPGxpPgorTGFzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIuPC9saT4KKworPGxpPgorSW5jbHVkZXMgdHJhaWxpbmcgdGVybWluYXRvcnMgdGhhdCBhcmUgcGFydCBvZiBjb25zdHJ1Y3Q7IGUuZy4sIGluY2x1ZGUKK3RyYWlsaW5nIHNlbWljb2xvbiBhdCBlbmQgb2YgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uPC9saT4KKworPGxpPgorRG9lcyBub3QgaW5jbHVkZSBzZXBhcmF0b3JzOyBlLmcuLCBleGNsdWRlIHRyYWlsaW5nIGNvbW1hIGluIHBhcmFtZXRlcgorbGlzdC48L2xpPgorCis8bGk+CitEb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UuPC9saT4KKworPGxpPgorRG9lcyBub3QgaW5jbHVkZSB0cmFpbGluZyBjb21tZW50LjwvbGk+CisKKzxsaT4KK1N0YXRlbWVudCBlbmQtb2YtbGluZSBjb21tZW50cyBhcmUgbm90IGVuY29tcGFzc2VkIGJ5IHN0YXRlbWVudC48L2xpPgorCis8dWw+Cis8bGk+Cis8dHQ+U3lzdGVtLm91dC5wcmludGxuKCJoZWxsbyIpOyAvLyAkbm9uLW5scyQ8L3R0PjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+RW1iZWRkZWQgY29tbWVudHMgYXJlIGVuY29tcGFzc2VkIGlmIHRoZXkgb2NjdXIgYmVmb3JlCitlbmQgcG9zaXRpb24uPC9mb250PjwvbGk+CisKKzx1bD4KKzxsaT4KKzx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U3lzdGVtLm91dC5wcmludGxuKCJoZWxsbyIpIC8qIGNvbW1lbnQgKi87PC9mb250PjwvdHQ+PC9saT4KKzwvdWw+Cis8L3VsPgorCis8bGk+CitTb21lIG5vZGUgdHlwZXMgd291bGQgaGF2ZSBzb3VyY2UgcmFuZ2VzIGZvciBzaWduaWZpY2FudCBjb250aWd1b3VzIHN1YmNvbnN0cnVjdHMKK25vdCByZWFkaWx5IGdsZWFuYWJsZSBmcm9tIHNvdXJjZSByYW5nZXMgb2YgdGhlIHN1Ym5vZGVzLjwvbGk+CisKKzx1bD4KKzxsaT4KK0FkZGl0aW9uYWwgc291cmNlIHJhbmdlcyB3b3VsZCBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggbm9kZSB0eXBlLjwvbGk+CisKKzxsaT4KK0UuZy4sIG1ldGhvZCBkZWNsYXJhdGlvbiBoYXMgYWRkaXRpb25hbCBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBtZXRob2QgbmFtZQorYW5kIGZvciB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIGV4Y2x1ZGluZyBpdHMgamF2YWRvYyBjb21tZW50LjwvbGk+CisKKzxsaT4KK1VzZSBzdGFydCBhbmQgbGVuZ3RoIGFycmF5cyByYXRoZXIgdGhhbiBwcm9saWZlcmF0ZSBBUEkgbWV0aG9kcyBmb3IgYWRkaXRpb25hbAorc291cmNlIHJhbmdlcy48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1VuaWNvZGUgRXNjYXBlczwvaDM+CisKKzx1bD4KKzxsaT4KK09yaWdpbmFsIHNvdXJjZSB0ZXh0IG1pZ2h0IGNvbnRhaW4gVW5pY29kZSBlc2NhcGVzIChKTFMgMy4yLCAzLjMpLjwvbGk+CisKKzxsaT4KK0UuZy4sIHZvaWRcdTAwNDBcdTAwNWEoKTsgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgWi48L2xpPgorCis8bGk+CitTY2FubmVyIHJlbW92ZXMgYWxsIFVuaWNvZGUgZXNjYXBlcyBhbmQgcmV0dXJucyBhIFVuaWNvZGUgdG9rZW4gc3RyZWFtLjwvbGk+CisKKzxsaT4KK05ld2x5IGNyZWF0ZWQgQVNUIG5vZGVzIGFyZSAicG9zdCIgVW5pY29kZSBlc2NhcGluZy48L2xpPgorCis8bGk+CitPdXRwdXQgb3B0aW9uczo8L2xpPgorCis8dWw+Cis8bGk+CitQcmVzZXJ2ZSBleGlzdGluZyBVbmljb2RlIGVzY2FwZXMgKGRlZmF1bHQpOyByZW1vdmUgYWxsIGV4aXN0aW5nIFVuaWNvZGUKK2VzY2FwZXMuPC9saT4KKworPGxpPgorRG8gbm90IGludHJvZHVjZSBVbmljb2RlIGVzY2FwZXMgKGRlZmF1bHQpOyBpbnRyb2R1Y2UgVW5pY29kZSBlc2NhcGVzIGZvcgorY2hhcmFjdGVycyBpbiBhIHNwZWNpZmllZCBzZXQgKGUuZy4sIGFsbCBub24tQVNDSUkpLjwvbGk+Cis8L3VsPgorCis8bGk+CitJbml0aWFsIGltcGxlbWVudGF0aW9uOiBzdXBwb3J0IGRlZmF1bHQgYmVoYXZpb3Igb25seS48L2xpPgorPC91bD4KKworPGgzPgorQ29tbWVudHM8L2gzPgorCis8dWw+Cis8bGk+CitDb21tZW50cyBhcmUgcHJvYmxlbWF0aWMgZm9yIEFTVHM7IHRoZXNlIGxleGljYWwgaXRlbXMgYXJlIG5vcm1hbGx5IGZpbHRlcmVkCitvdXQgb2YgdG9rZW4gc3RyZWFtLjwvbGk+CisKKzxsaT4KK0NvbW1lbnRzIGFyZSBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+CisKKzxsaT4KK0VkaXRpbmcgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlIGV4aXN0aW5nCitjb21tZW50cy48L2xpPgorCis8bGk+CitTaG91bGQgYmUgYWJsZSB0byBpbmNsdWRlIGNvbW1lbnRzIGZvciBuZXdseSBjcmVhdGVkIHN1YnRyZWVzLjwvbGk+CisKKzxsaT4KK0NvcHlpbmcgYSBzdWJ0cmVlIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIgc2hvdWxkIGluY2x1ZGUgcmVsZXZhbnQgY29tbWVudHMuPC9saT4KKworPGxpPgorTW9zdCBjb21tb24gZm9ybXMgb2YgY29tbWVudHM6PC9saT4KKworPHVsPgorPGxpPgorSmF2YWRvYyBjb21tZW50cyAtIG9uIG9uZSBvciBtb3JlIGxpbmVzIHByZWNlZGluZyBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZQorZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK0JvaWxlcnBsYWNlIGNvbW1lbnRzIChjb3B5cmlnaHQgbm90aWNlcykgLSBvbmUgb3IgbW9yZSBsaW5lcyBwcmVjZWRpbmcKK3RoZSBwYWNrYWdlIGRlY2xhcmF0aW9uLCBvciBiZXR3ZWVuIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGFuZCBmaXJzdCBpbXBvcnQKK29yIHR5cGUgZGVjbGFyYXRpb24uPC9saT4KKworPGxpPgorU3RhdGVtZW50IGNvbW1lbnRzIC0gb25lIG9yIG1vcmUgbGluZXMgYmV0d2VlbiBzdGF0ZW1lbnRzIGluIGEgYmxvY2suPC9saT4KKworPGxpPgorU3RhdGVtZW50IGVuZC1vZi1saW5lIGNvbW1lbnRzLjwvbGk+Cis8L3VsPgorCis8bGk+CitWQS9TVCBleHBlcmllbmNlOiBub3Qgd29ydGggYmVuZGluZyBvdmVyIGJhY2t3YXJkcyB0byBhY2NvbW9kYXRlIGFsbCBjb21tZW50cy48L2xpPgorCis8bGk+CitEZXRlcm1pbmVkIGNsaWVudHMgY2FuIHJlc2NhbiBvcmlnaW5hbCBzdHJpbmcgdG8gZ2V0IGF0IGFsbCBjb21tZW50cy48L2xpPgorCis8bGk+CitFeHBvc2UgaGlnaCB2YWx1ZSBjb21tZW50czo8L2xpPgorCis8bGk+CitKYXZhZG9jIGNvbW1lbnRzIC0gdHJlYXQgYXMgYXR0cmlidXRlIG9mIHRoZSBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZSBkZWNsYXJhdGlvbnMuPC9saT4KKworPHVsPgorPGxpPgorQ2xpZW50cyBjYW4gZXh0cmFjdCBKYXZhZG9jIGF0dHJpYnV0ZXMgKGluY2x1ZGluZyBAZGVwcmVjYXRlZCkuPC9saT4KKworPGxpPgorQ2xpZW50cyBjYW4gY3JlYXRlIGRlY2xhcmF0aW9ucyB3aXRoIEphdmFkb2MuPC9saT4KKzwvdWw+CisKKzxsaT4KK1N0YXRlbWVudCBjb21tZW50cyB3aXRoaW4gYmxvY2tzPC9saT4KKworPHVsPgorPGxpPgorQXBwcm9hY2ggMTogVHJlYXQgYXMgcHNldWRvLXN0YXRlbWVudHMgd2l0aCBhIHNwZWNpYWwgQVNUIG5vZGUgdHlwZS48L2xpPgorCis8dWw+Cis8bGk+CitQcm86IENsaWVudHMgY2FuIGluY2x1ZGUgY29tbWVudHMgd2l0aCBibG9ja3MuPC9saT4KKworPGxpPgorQ29uOiBPbmx5IHdvcmtzIGZvciBjb21tZW50cyB3aXRoaW4gZ2VudWluZSBibG9ja3MuIEUuZy4sIGNhbid0IGhhbmRsZTwvbGk+CisKKzxsaT4KKzx0dD5pZiAodGVzdCk8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLy8gc2hvdWxkIG5vdCBoYXBwZW48L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTs8L3R0PjwvbGk+CisKKzxsaT4KK1dvdWxkIHdvcmsgYmV0dGVyIGlmIHdlIHdlcmUgdXNpbmcgc3RhdGVtZW50IGxpc3RzIGluIG1vcmUgcGxhY2VzLjwvbGk+Cis8L3VsPgorCis8bGk+CitBcHByb2FjaCAyOiBUcmVhdCBhcyBhIHByb3BlcnR5IG9mIGZvbGxvd2luZyBzdGF0bWVudCBub2RlLjwvbGk+CisKKzx1bD4KKzxsaT4KK1BybzogQ2xpZW50cyBjYW4gaW5jbHVkZSBjb21tZW50cyBiZWZvcmUgYW55IHN0YXRlbWVudC48L2xpPgorCis8bGk+CitDb246IERvZXMgbm90IGhhbmRsZSB0cmFpbGluZyBjb21tZW50cyBpbiBibG9ja3MuIEUuZy4sPC9saT4KKworPGxpPgorPHR0Pns8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTs8L3R0PjwvbGk+CisKKzxsaT4KKzx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLy8gY2FuJ3QgcmVhY2ggaGVyZTwvdHQ+PC9saT4KKworPGxpPgorPHR0Pn08L3R0PjwvbGk+Cis8L3VsPgorCis8bGk+CitSZWNvbW1lbmQgYXBwcm9hY2ggMiBzaW5jZSBpdCBjb3ZlcnMgbW9zdCBjYXNlcy48L2xpPgorPC91bD4KKworPGxpPgorQm9pbGVycGxhdGUgY29tbWVudHMgd291bGQgbm90IGJlIGV4cG9zZWQsIGJ1dCB3b3VsZCBiZSBwcmVzZXJ2ZWQgdGhyb3VnaAorZWRpdCBhbmQgb3V0cHV0LjwvbGk+Cis8L3VsPgorCis8aDM+CitXaGl0ZXNwYWNlPC9oMz4KKworPHVsPgorPGxpPgorV2hpdGVzcGFjZSAoSkxTIDMuNikgaW5jbHVkZXMgQVNDSUkgU1AsIEhULCBhbmQgRkYgY2hhcmFjdGVycywgYW5kIGxpbmUKK3Rlcm1pbmF0b3JzLjwvbGk+CisKKzxsaT4KK0xpa2UgY29tbWVudHMsIHdoaXRlc3BhY2UgaXMgc2lnbmlmaWNhbnQgdG8gdXNlci48L2xpPgorCis8bGk+CitFZGl0aW5nIGFuIGV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQgc2hvdWxkIGdlbmVyYWxseSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLjwvbGk+CisKKzxsaT4KK1doaXRlc3BhY2UgZm9yIG5ld2x5IGNyZWF0ZWQgc3VidHJlZXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgdG8gcHJvZHVjZQorb3V0cHV0IHRoYXQgZm9sbG93cyBjb21tb24gY29udmVudGlvbnMgYW5kIGJsZW5kcyBpbiB3aXRoIHN1cnJvdW5kaW5nIHRleHQKKyh1c2UgdGhlIHNhbWUgbGVhZGluZyB3aGl0ZXNwYWNlKS48L2xpPgorCis8bGk+CitDb3B5aW5nIGEgc3VidHJlZSBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyIHNob3VsZCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlCit3aGl0ZXNwYWNlLjwvbGk+Cis8L3VsPgorCis8aDM+CitBU1QgUGFyZW50IEJhY2twb2ludGVyPC9oMz4KKworPHVsPgorPGxpPgorRWFjaCBBU1Qgbm9kZSB3aWxsIGNhcnJ5IGEgYmFja3BvaW50ZXIgdG8gaXRzIHBhcmVudCBub2RlLjwvbGk+CisKKzxsaT4KK0FTVE5vZGUuZ2V0UGFyZW50KCkgcmV0dXJucyBBU1ROb2RlPC9saT4KKworPGxpPgorVGhpcyBwZXJtaXRzIGNsaWVudHMgdG8gdHJhdmVyc2UgQVNUcyBpbiB1cHdhcmQgYXMgd2VsbCBhcyBkb3dud2FyZCBkaXJlY3Rpb24uPC9saT4KKworPGxpPgorQmlkaXJlY3Rpb25hbCBsaW5rcyBtdXN0IGJlIG1haW50YWluZWQgZHVyaW5nIGVkaXRpbmcuPC9saT4KKworPGxpPgorRGVsZXRpb24gQVBJIG11c3QgdW5saW5rIGNoaWxkIGZyb20gcGFyZW50LjwvbGk+CisKKzxsaT4KK0luc2VydGlvbiBBUEkgbXVzdCBsaW5rIGNoaWxkIHRvIHBhcmVudC48L2xpPgorCis8dWw+Cis8bGk+CitUbyBwcmVzZXJ2ZSB0cmVlbmVzcywgYXV0b21hdGljYWxseSBjbG9uZSBjaGlsZCBzdWJ0cmVlIGlmIGNoaWxkIGFscmVhZHkKK2hhcyBwYXJlbnQuPC9saT4KKzwvdWw+CisKKzxsaT4KK1JlcGxhY2UgQVBJIG11c3QgdW5saW5rIG9sZCBjaGlsZCBiZWZvcmUgaW5zZXJ0aW5nIG5ldyBjaGlsZC48L2xpPgorCis8bGk+CitQYXJlbnQgYmFja2xpbmtzIG1lYW5zIHRoYXQgaGFuZ2luZyBvbiB0byA8aT5hbnk8L2k+IG5vZGUgaW4gYW4gQVNUIGluc3RhbmNlCit3aWxsIHByZXZlbnQgYW55IHBhcnQgb2YgdGhlIEFTVCBpbnN0YW5jZSBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLjwvbGk+Cis8L3VsPgorCis8aDM+CitNdWx0aXBsZSBBU1RzPC9oMz4KKworPHVsPgorPGxpPgorTXVsaXBsZSBBU1RzIGNhbiBleGlzdCBzaWRlIGJ5IHNpZGUgKGFuZCBBU1RzIGFyZSBwb3RlbnRpYWxseSBmb3Igc2FtZQorY29tcGlsYXRpb24gdW5pdCkuPC9saT4KKworPGxpPgorQWxsb3cgaW5zZXJ0aW9uIG9mIG5vZGVzIGZyb20gb25lIEFTVCBpbnRvIGFub3RoZXIgQVNULjwvbGk+CisKKzx1bD4KKzxsaT4KK0F1dG9tYXRpY2FsbHkgY2xvbmVzIGNoaWxkIHN1YnRyZWUgKGZvcmdldHRpbmcgc291cmNlIHBvc2l0aW9ucyBhbmQgYmluZGluZworZGVjb3JhdGlvbnMpLjwvbGk+CisKKzxsaT4KK0Vuc3VyZSBtZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgQVNUcyByZW1haW4gY29tcGxldGVseSBpbmRlcGVuZGVudC48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5TdHJ1Y3R1cmFsIEVxdWFsaXR5PC9mb250PjwvaDM+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5TdHJ1Y3R1cmFsIGVxdWFsaXR5IHByZWRpY2F0ZSBvbiBBU1Qgbm9kZXMuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Jc29tb3JwaGljIHN1YnRyZWVzLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+QmVsb25naW5nIHRvIHNhbWUgb3IgZGlmZmVyZW50IEFTVC48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPkNvbnNpZGVycyBzdHJ1Y3R1cmFsIGluZm8gb25seTsgaWdub3JlcyBzb3VyY2UgcG9zaXRpb25zLAorYmluZGluZ3MsIGV0Yy48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPk5hbWVkIHNvbWV0aGluZyBvdGhlciB0aGFuICJlcXVhbHMiIHRvIGF2b2lkIGhhdmluZwordG8gcmVpbXBsZW1lbnQgaGFzaENvZGUgdG9vLjwvZm9udD48L2xpPgorPC91bD4KKworPGgzPgorU3ludGFjdGljIENvcnJlY3RuZXNzIG9mIFBhcnNlci1idWlsdCBBU1RzPC9oMz4KKworPHVsPgorPGxpPgorRm9yIEFTVHMgYnVpbHQgYnkgYSBKYXZhIHBhcnNlciwgdGhlcmUgYXJlIGlzc3VlcyBvZiBzeW50YWN0aWMgY29ycmVjdG5lc3MuPC9saT4KKworPGxpPgorU3ludGFjdGljIGNvcnJlY3RuZXNzIGlzIGp1ZGdlZCBieSB0aGUgU3ludGFjdGljIEdyYW1tYXIgKGFzIGRlZmluZWQgaW4KK0pMUzIgc2VjdGlvbiAyLjMpLjwvbGk+CisKKzxsaT4KK0phdmEgcGFyc2VyIDxiPm11c3Q8L2I+IGd1YXJhbnRlZSB0byBwcm9kdWNlIGEgZmFpdGhmdWwgQVNUIGZvciBhbnkgc3ludGFjdGljYWxseQorY29ycmVjdCBjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzxsaT4KK0phdmEgcGFyc2VyIDxiPm1heTwvYj4gYWxzbyBidWlsZCBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbgordW5pdHMuPC9saT4KKworPGxpPgorQ29tcGxpY2FudCBKYXZhIGNvbXBpbGVycyBtdXN0IHJlamVjdCBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbgordW5pdHMuPC9saT4KKworPGxpPgorV2hhdCBwcmluY2lwbGUgZG8gd2UgYXBwbHkgdG8gSmF2YSBwYXJzZXJzIGFuZCB0aGUgQVNUcyB0aGV5IHJldHVybj88L2xpPgorCis8bGk+CitSZWFsIEphdmEgcGFyc2VycyBhcmUgaW52YXJpYWJseSBtb3JlIGxpYmVyYWwgdGhhbiB0aGUgU3ludGFjdGljIEdyYW1tYXIsCithbmQgcmVseSBvbiBwb3N0LXBhcnNlIGNoZWNrcyB0byByZXBvcnQgZXJyb3JzIGZvciBhbnkgc3ludGFjdGljYWxseSBpbmNvcnJlY3QKK2NvbnN0cnVjdHMgdGhhdCBtYWtlcyBpdCBwYXN0IHRoZSBwYXJzZXIuPC9saT4KKworPHVsPgorPGxpPgorRS5nLiwgY29uZmxpY3RpbmcgbW9kaWZpZXJzOiBwdWJsaWMgcHJpdmF0ZTwvbGk+CisKKzxsaT4KK0UuZy4sIGZpZWxkIGRlY2xhcmVkIHdpdGggbm8gaW5pdGlhbGl6ZXIgb2NjdXJzIGluIGFuIGludGVyZmFjZTwvbGk+CisKKzxsaT4KK0UuZy4sIHZvaWQgZm9vKCkgW107PC9saT4KKzwvdWw+CisKKzxsaT4KK0luIHRoZSBjdXJyZW50IEVjbGlwc2UgY29tcGlsZXIsIG1hbnkgb2YgdGhlc2UgY2hlY2tzIGFyZSBkb25lIGluIHRoZSBjb3Vyc2UKK29mIHR5cGUgYW5kIG5hbWUgcmVzb2x1dGlvbi4gSWYgY2xpZW50IG9ubHkgd2FudHMgQVNULCB3ZSB3YW50IHRvIGF2b2lkCitkb2luZyBleHBlbnNpdmUgbmFtZSBhbmQgdHlwZSBhbmFseXNpcy48L2xpPgorCis8bGk+CitBcHByb2FjaCAxOiBHdWFyYW50ZWUgdGhhdCBubyBBU1RzIGFyZSBidWlsdCBmb3Igc3ludGFjdGljYWxseSBpbmNvcnJlY3QKK2NvbXBpbGF0aW9uIHVuaXRzLjwvbGk+CisKKzx1bD4KKzxsaT4KK1lvdSBkbyBub3QgZ2V0IGFuIEFTVCBhdCBhbGwgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggc3ludGF4IGVycm9ycy48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gdHJ1c3QgcGFyc2VyIHRvIGRpc3Rpbmd1aXNoIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBmcm9tCitpbmNvcnJlY3QuPC9saT4KKworPGxpPgorQ29uOiBDbGllbnQgY2Fubm90IG1hbmlwdWxhdGUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgY29tcGlsYXRpb24gdW5pdHMKK2F0IGFsbC48L2xpPgorCis8bGk+CitDb246IFJlcXVpcmVzIHBvc3QtcGFyc2UgY2hlY2sgdG8gZGV0ZWN0IHJlc2lkdWFsIHN5bnRheCBlcnJvcnMuPC9saT4KKzwvdWw+CisKKzxsaT4KK0FwcHJvYWNoIDI6IFByb3ZpZGUgbm8gZ3VhcmFudGVlIGFib3V0IHRoZSBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdAorY29tcGlsYXRpb24gdW5pdHMuPC9saT4KKworPHVsPgorPGxpPgorWW91IG1pZ2h0IG5vdCBnZXQgYSB1c2VmdWwgQVNUIGF0IGFsbC48L2xpPgorCis8bGk+CitZb3UgbWlnaHQgZ2V0IGFuIEFTVCB0aGF0IGhhZCBwaWVjZXMgbWlzc2luZzsgZS5nLiwgYSBtYWxmb3JtZWQgbWV0aG9kCit3YXMgZXhjaXNlZDwvbGk+CisKKzxsaT4KK1lvdSBtaWdodCBnZXQgYW4gQVNUIHRoYXQgaXMgaW5jb2hlcmVudCBvciBzZWxmLWNvbnRyYWRpY3Rvcnk7IGUuZy4sIGEKK3RyYW5zaWVudCBjbGFzcyE/PC9saT4KKworPGxpPgorUHJvOiBNYXhpbXVtIGZsZXhpYmlsaXR5IGZvciBpbXBsZW1lbnRhdGlvbi48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gZ2V0IHVzZWZ1bCBBU1RzIGZvciBzb21lIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IHByb2dyYW1zLjwvbGk+CisKKzxsaT4KK0NvbjogQ2xpZW50IGNhbm5vdCB0cnVzdCBwYXJzZXIgdG8gZGlzdGluZ3Vpc2ggc3ludGFjdGljYWxseSBjb3JyZWN0IGZyb20KK2luY29ycmVjdC48L2xpPgorPC91bD4KKworPGxpPgorQXBwcm9hY2ggMzogR3VhcmFudGVlIHRoYXQgdGhlIGNsaWVudCBleGFtaW5pbmcgdGhlIHJlc3VsdGluZyBBU1QgaGFzIHNvbWUKK3dheSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdHMgaXMgaW5jb3JyZWN0LjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByaW5pY2lwbGU6IFN5bnRhY3RpYyBlcnJvcnMgbXVzdCBub3QgYmUgc3VwcHJlc3NlZC48L2xpPgorCis8bGk+CitBU1Qgbm9kZXMgY291bGQgY2FycnkgZmxhZ3MgaW5kaWNhdGluZyBjZXJ0YWluIHN5bnRheCBwcm9ibGVtOyBlLmcuLCBkdXBsaWNhdGUKK21vZGlmaWVycyBwdWJsaWMgcHVibGljPC9saT4KKworPGxpPgorQSBiaXQgb24gcm9vdCBub2RlIGNvdWxkIHNheSAidW5zcGVjaWZpZWQgc3ludGF4IGVycm9ycyIuPC9saT4KKworPGxpPgorQ291bGQgYmUgc3BlY2lhbCBBU1Qgbm9kZXMgdHlwZXMgaW5kaWNhdGluZyBtYWpvciBwcm9ibGVtczsgZS5nLiwgYm9ndXMKK21ldGhvZCBib2R5PC9saT4KKworPGxpPgorQ291bGQgYmUgcmVwcmVzZW50YWJsZSBjb25maWd1cmF0aW9ucyBvZiBBU1Qgbm9kZSB0eXBlcyB0aGF0IGFyZSByZWNvZ25pemFibGUKK2FzIHN5bnRhY3RpYWxseSBpbmNvcnJlY3Q7IGUuZy4sIGNvbmZsaWN0aW5nIG1vZGlmaWVycyBwdWJsaWMgcHJpdmF0ZTsKK21pc3NpbmcgZmllbGQgaW5pdGlhbGl6ZXIgaW4gaW50ZXJmYWNlPC9saT4KKworPGxpPgorUHJvOiBDbGllbnQgY2FuIHRydXN0IHBhcnNlciB0byBub3QgaGlkZSBhbnkgc3ludGF4IGVycm9ycyB0aGF0IGFyZSBpbgordGhlIHNvdXJjZS48L2xpPgorCis8bGk+CitQcm86IENsaWVudCBjYW4gZ2V0IHVzZWZ1bCBBU1RzIGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBwcm9ncmFtcy48L2xpPgorCis8bGk+CitDb246IENsaWVudCBtdXN0IGRvIGV4dHJhIHdvcmsgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlIHN5bnRheCBlcnJvcnMuPC9saT4KKworPGxpPgorQ29uOiBFeHRyYSB3b3JrIHRvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpZiBubyBjbGllbnQgcmVhbGx5IGNhcmVzIGFib3V0Cit0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBhbmQgaW5jb3JyZWN0LjwvbGk+Cis8L3VsPgorCis8bGk+CitUaGUgZmlyc3QgYXBwcm9hY2ggaXMgdG9vIGhhcnNoLiBJdCBpcyBtdWNoIG1vcmUgcmVhc29uYWJsZSwgYW5kIGludGVyZXN0aW5nLAordG8gYmUgYWJsZSB0byB3b3JrIHdpdGggc29tZSBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbiB1bml0cy48L2xpPgorCis8bGk+CitUaGUgc2Vjb25kIGFwcHJvYWNoIGZlZWxzIHJlYXNvbmFibGUgaWYgY2xpZW50cyBuZXZlciBjYXJlIHdoZXRoZXIgdGhlCitzb3VyY2UgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0IG9yIG5vdC48L2xpPgorCis8bGk+CitUaGUgdGhpcmQgYXBwcm9hY2ggZmVlbHMgcmVhc29uYWJsZSBpZiBzb21lIGNsaWVudHMgd291bGQgY2FyZSB3aGV0aGVyCit0aGUgc291cmNlIGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBvciBub3QuPC9saT4KKworPGxpPgorVGhlIHByaW5jaXBsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlY29uZCBhbmQgdGhpcmQgYXBwb2FjaGVzIGlzIHRoYXQKK3RoZSBmb3JtZXIgc2FuY3Rpb25zIHF1aWV0bHkgc3VwcHJlc3Npbmcgc3ludGF4IGVycm9ycyB3aGVyZWFzIHRoZSBsYXR0ZXIKK3ByZWNsdWRlcyBpdC48L2xpPgorCis8bGk+CitUaGUgbmF0dXJlIG9mIHRoZSBBU1Qgbm9kZXMgaW5oZXJlbnRseSBtYWtlcyByb29tIHRvIGV4cHJlc3MgYSB3aWRlIHJhbmdlCitvZiBzeW50YWN0aWNhbGx5IG1hbGZvcm1lZCBwcm9ncmFtcy48L2xpPgorCis8bGk+CitBbiBleHRyYSBmbGFnIHBlciBub2RlIGZvciAidW5zcGVjaWZpZWQgc3ludGF4IGVycm9ycyIgc2hvdWxkIGNvdmVyIHRoZQorYmFzZXMuPC9saT4KKworPGxpPgorVGhlIGV4aXN0aW5nIGNvbXBpbGVyJ3MgQVNUcyBhbHJlYWR5IGNhcnJ5IGVub3VnaCBpbmZvcm1hdGlvbiB0byBlbmFibGUKK3RoZSBjb21waWxlciB0byBkbyB0aG9yb3VnaCBwb3N0LXBhcnNlIGRldGVjdGluZyBvZiByZXNpZHVhbCBzeW50YXggZXJyb3JzLjwvbGk+CisKKzxsaT4KK1RoZXJlZm9yZSB0aGUgdGhpcmQgYXBwcm9hY2ggaXMgd2l0aGluIGVhc3kgcmVhY2guPC9saT4KKworPGxpPgorVGhlIHRoaXJkIGFwcHJvYWNoIGdpdmVzIGNsaWVudHMgbW9yZSB0aGFuIHRoZSBzZWNvbmQgYXBwcm9hY2guPC9saT4KKworPGxpPgorUmVjb21tZW5kYXRpb246IHdlIGFkb3B0IHRoZSB0aGlyZCBhcHByb2FjaC48L2xpPgorPC91bD4KKworPGgzPgorU3ludGFjdGljIENvcnJlY3RuZXNzIG9mIE5vbi1wYXJzZXItYnVpbHQgQVNUczwvaDM+CisKKzx1bD4KKzxsaT4KK0FTVHMgZG8gbm90IGp1c3QgY29tZSBmcm9tIGEgcGFyc2VyLjwvbGk+CisKKzx1bD4KKzxsaT4KK1RoZXkgY2FuIGJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLjwvbGk+CisKKzxsaT4KK0EgcGFyc2VyLWJ1aWxkIEFTVCBjYW4gYmUgZWRpdGVkLjwvbGk+Cis8L3VsPgorCis8bGk+CitUaGVzZSBBU1RzIHdpbGwgbmVlZCB0byBiZSBzZXJpYWxpemVkIHRvIGEgc291cmNlIGNvbXBpbGF0aW9uIHVuaXQgKHdoeQorZWxzZSB3b3VsZCB0aGV5IGV4aXN0PykuPC9saT4KKworPGxpPgorV2hhdCBraW5kcyBvZiBzdXBwb3J0IGFuZCBndWFyYW50ZWVzIGFyZSBpbiBwbGFjZSB0byBlbnN1cmUgdGhhdCBzdWNoIGEKK3N1aXRhYmxlIHNvdXJjZSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBnZW5lcmF0ZWQ/PC9saT4KKworPGxpPgorQmFzaWMgZ3VhcmFudGVlOiBhbnkgQVNUIHRoYXQgY291bGQgaGF2ZSBjb21lIGZyb20gcGFyc2luZyBhIHN5bnRhY3RpY2FsbHkKK2NvcnJlY3QgY29tcGlsYXRpb24gdW5pdCB3aWxsIHNlcmlhbGl6ZSB0byBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpczwvbGk+CisKKzx1bD4KKzxsaT4KKyhhKSBzeW50YWN0aWNhbGx5IGNvcnJlY3Q8L2xpPgorCis8bGk+CisoYikgc3Ryb25nbHkgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KKworPGxpPgorYW5kIHBvc3NpYmx5IChjKSBub3JtYWxpemVkOyB0aGF0IGlzLCBwYXJzZShzZXJpYWxpemUoeCkpIGlzIGlzb21vcnBoaWMKK3RvIHg8L2xpPgorPC91bD4KKworPGxpPgorVGhlcmUgYXJlIGxpa2VseSBtYW55IHdheXMgdG8gZ2V0IEFTVHMgdGhhdCBkbyBub3QgY29ycmVzcG9uZCB0byBhbnkgc3ludGFjdGljYWxseQorY29ycmVjdCBjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIHVzZSBpbGxlZ2FsIGlkZW50aWZpZXJzICgiMWFiYyIgb3IgInRyeSIgb3IgIi8vIikuPC9saT4KKworPGxpPgorRS5nLiwgdXNlIGlsbGVnYWwgbW9kaWZpZXIgY29tYmluYXRpb25zIHdpdGggbW9kaWZpZXIgYml0IG1hc2tzLjwvbGk+Cis8L3VsPgorCis8bGk+CitQb3N0LXNjcmVlbmluZyB0aGUgQVNUIGZvciBzeW50YWN0aWMgY29ycmVjdG5lc3Mgd291bGQgYmUgbWlzZ3VpZGVkLjwvbGk+CisKKzxsaT4KK1Nob3VsZCBqdXN0IGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSB0aGUgb2J2aW91cywgc3ludGFjdGljYWxseSBpbmNvcnJlY3QsCitjb21waWxhdGlvbiB1bml0LjwvbGk+CisKKzxsaT4KK01vcmUgaW1wb3J0YW50bHk6IGVuc3VyZSBzZW1hbnRpYyBlcXVpdmFsZW5jZS48L2xpPgorCis8bGk+CitPcGVyYXRvciBwcmVjZWRlbmNlIGNyZWF0ZXMgaXNzdWVzOjwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIGdpdmVuIEFTVCBmb3IgZXhwcmVzc2lvbiA8dHQ+djEqdjI8L3R0PiwgcmVwbGFjZSA8dHQ+djE8L3R0PiBub2RlCitieSBleHByZXNzaW9uIDx0dD52MSt2MzwvdHQ+LjwvbGk+CisKKzxsaT4KK05haXZlIHNlcmlhbGl6YXRpb24geWllbGRzIDx0dD52MSt2Myp2MjwvdHQ+IHdoaWNoIGlzIG5vdCBzZW1hbnRpY2FsbHkKK2VxdWl2YWxlbnQgdG8gdGhlIEFTVC48L2xpPgorCis8bGk+CitSZXN1bHQgc2hvdWxkIGJlICg8dHQ+djErdjMpKnYyPC90dD4uPC9saT4KKworPGxpPgorUGFyZW50aGVzZXMgbWF5IG5lZWQgdG8gYmUgaW50cm9kdWNlZCBkdXJpbmcgc2VyaWFsaXphdGlvbi48L2xpPgorPC91bD4KKworPGxpPgorTmVzdGVkIGlmIHN0YXRlbWVudCBjcmVhdGVzIGlzc3Vlczo8L2xpPgorCis8dWw+Cis8bGk+CitFLmcuLCBnaXZlbiBBU1QgZm9yIHN0YXRlbWVudCA8dHQ+aWYgKGEpIGYoKTsgZWxzZSBnKCk7PC90dD4sIHJlcGxhY2UgPHR0PmYoKTs8L3R0PgorYnkgPHR0PmlmIChiKSBoKCk7PC90dD48L2xpPgorCis8bGk+CitOYWl2ZSBzZXJpYWxpemF0aW9uIHlpZWxkcyA8dHQ+aWYgKGEpIGlmIChiKSBoKCk7IGVsc2UgZygpOzwvdHQ+PC9saT4KKworPGxpPgorUmVzdWx0IHNob3VsZCBiZSA8dHQ+aWYgKGEpIGlmIChiKSBoKCk7IDxiPmVsc2UgPC9iPjsgZWxzZSBnKCk7PC90dD48L2xpPgorCis8bGk+CitFeHRyYSB2ZXJiaWFnZSBtYXkgbmVlZCB0byBiZSBpbnRyb2R1Y2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorRGVlcCBDb25zdHJ1Y3RzPC9oMz4KKworPHVsPgorPGxpPgorU29tZSBwcm9ncmFtcyBpbnZvbHZlIGltcG9zc2libHkgZGVlcCBjb25zdHJ1Y3RzLjwvbGk+CisKKzxsaT4KK011bHRpLWxpbmUgc3RyaW5nIGNvbmNhdGVuYXRpb24gZXhwcmVzc2lvbnMgYXJlIHRoZSBtYWluIG9mZmVuZGVyLjwvbGk+CisKKzx1bD4KKzxsaT4KK0ZvciBleGFtcGxlLCA8dHQ+IkxpbmUgMVxcbiIrIkxpbmUgMlxcbiIrLi4uKyJMaW5lIDUwMDAiPC90dD48L2xpPgorPC91bD4KKworPGxpPgorUnVudGltZSBzdGFja3MgYmxvdyB3aGVuIHJlY3Vyc2luZyBvdmVyIGRlZXAgQVNUcy48L2xpPgorCis8bGk+CitBU1Qgbm9kZSB0eXBlcyBzaG91bGQgYmUgZGVzaWduZWQgdG8ga2VlcCB0cmVlcyByZWFzb25hYmx5IHNoYWxsb3cgZm9yCityZWFzb25hYmx5IHR5cGljYWwgcHJvZ3JhbXMuPC9saT4KKworPGxpPgorSW50cm9kdWNlIE4tYXJ5IG9wZXJhdG9yIGV4cHJlc3Npb24gbm9kZSB0eXBlIHRvIGRlYWwgd2l0aCBtdWx0aS1saW5lIHN0cmluZworY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucy48L2xpPgorCis8bGk+CitOLkIuIEN1cnJlbnQgY29tcGlsZXIgcGVyZm9ybXMgY29tcGlsZS10aW1lIGNvbmNhdGVuYXRpb25zIGR1cmluZyBwYXJzZQorcGhhc2UgdG8gZGVhbCB3aXRoIHRoaXMgcHJvYmxlbS48L2xpPgorPC91bD4KKworPGgzPgorRWRpdGluZyBQcm90b2NvbDwvaDM+CisKKzx1bD4KKzxsaT4KK1doYXQgZ2VuZXJhbCBmb3JtIHNob3VsZCB0aGUgZWRpdGluZyBBUEkgdGFrZT88L2xpPgorCis8bGk+CitTZXR0ZXJzIG9uIHJlY2VpdmVyIHRvIG1hbmlwdWxhdGUgaXRzIGNoaWxkcmVuIChwYXJlbnQgbmV2ZXIgYWZmZWN0ZWQpPC9saT4KKworPHVsPgorPGxpPgorRS5nLiwgd2hpbGVTdGF0ZW1lbnQuc2V0Q29uZGl0aW9uKG5ld0V4cHJlc3Npb24pPC9saT4KKworPGxpPgorVXNlIG51bGwgZm9yIG9wdGlvbmFsIGNoaWxkcmVuPC9saT4KKzwvdWw+CisKKzxsaT4KK1RyZWF0IGxpc3RzIGFzIGFuIGFycmF5LXZhbHVlZCBwcm9wZXJ0eS48L2xpPgorCis8dWw+Cis8bGk+CitFLmcuLCBibG9jay5nZXRTdGF0ZW1lbnRzKCkgcmV0dXJucyBTdGF0ZW1lbnRbXTwvbGk+CisKKzxsaT4KK0UuZy4sIGJsb2NrLnNldFN0YXRlbWVudHMoU3RhdGVtZW50W10gc3RhdGVtZW50cyk8L2xpPgorCis8bGk+CitVc2UgZW1wdHkgbGlzdCBmb3Igbm8gY2hpbGRyZW4gKHJhdGhlciB0aGFuIG51bGwpPC9saT4KKzwvdWw+CisKKzxsaT4KK0FsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBsaXN0czogdXNlIENvbGxlY3Rpb24tbGlrZSBwcm90b2NvbDwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIGJsb2NrLmFkZFN0YXRlbWVudChwb3MsIG5ld0NoaWxkU3RhdGVtZW50KTwvbGk+CisKKzxsaT4KK0UuZy4sIGJsb2NrLnJlbW92ZVN0YXRlbWVudChvbGRDaGlsZFN0YXRlbWVudCk8L2xpPgorCis8bGk+CitDb246IEluY3JlYXNlZCBudW1iZXIgb2YgbWV0aG9kcyBvbiBBUEk7IGJhZCB3aGVuIGEgbm9kZSB0eXBlIGhhcyBzZXZlcmFsCitsaXN0IHByb3BlcnRpZXMuPC9saT4KKzwvdWw+CisKKzxsaT4KK0FsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBkZWxldGUvcmVwbGFjZTogdXNlIHBhcmVudCBiYWNrcG9pbnRlcnMgdG8gaW1wbGVtZW50CitnZW5lcmljIGRlbGV0ZSBhbmQgcmVwbGFjZSBvcGVyYXRpb24gd2hpY2ggYWZmZWN0IHRoZSByZWNlaXZlcidzIHJlbGF0aW9uc2hpcAordG8gaXRzIHBhcmVudDwvbGk+CisKKzx1bD4KKzxsaT4KK0UuZy4sIG9sZENoaWxkU3RhdGVtZW50LmRlbGV0ZSgpPC9saT4KKworPGxpPgorQ29uOiBzZW1hbnRpY3Mgb2YgZGVsZXRpb24gdWdseSB3aGVuIG5vZGUgb2NjdXJzIG91dHNpZGUgb2YgYW55IGxpc3Q8L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1VzZXIgRGF0YSBGaWVsZDwvaDM+CisKKzx1bD4KKzxsaT4KK0VhY2ggQVNUIG5vZGUgaGFzIGEgdXNlciBkYXRhIHNsb3QgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2UuPC9saT4KKworPGxpPgorQVNUTm9kZS5nZXRDbGllbnREYXRhKCkgcmV0dXJucyBPYmplY3Q8L2xpPgorCis8bGk+CitBU1ROb2RlLnNldENsaWVudERhdGEoT2JqZWN0IGRhdGEpPC9saT4KKworPGxpPgorVGhlIGluaXRpYWwgdmFsdWUgaXMgbnVsbC48L2xpPgorCis8bGk+CitDbGllbnQgbWF5IHVzZSBmb3IgZGVjb3JhdGlvbnMsIG9yIHdoYXRldmVyLjwvbGk+CisKKzxsaT4KK0FTVCBub2RlcyBjcmVhdGVkIGJ5IHBhcnNlciBjYXJyeSBubyBkYXRhIGluaXRpYWxseS48L2xpPgorCis8bGk+CitBU1Qgbm9kZXMgY3JlYXRlZCBleHBsaWNpdGx5IGNhcnJ5IG5vIGRhdGEgaW5pdGlhbGx5LjwvbGk+CisKKzxsaT4KK0V2ZW4gcmVhZC1vbmx5IEFTVHMgaGF2ZSByZWFkLXdyaXRlIGRhdGEgc2xvdHMuPC9saT4KKworPGxpPgorQ2xvbmluZyBhbiBBU1Qgbm9kZSBjcmVhdGVzIGEgbmV3IG5vZGUgKGRvZXMgPGI+bm90PC9iPiBjb3B5IG9yIGNsb25lIGRhdGEpLjwvbGk+Cis8L3VsPgorCis8aDM+CitMaXN0cyBvZiBNZW1iZXJzPC9oMz4KKworPHVsPgorPGxpPgorTGlzdCBvZiBmaWVsZCwgbWV0aG9kLCBhbmQgdHlwZSBtZW1iZXJzIG9mIGEgdHlwZSBkZWNsYXJhdGlvbi48L2xpPgorCis8bGk+CitUaGlzIGxpc3QgaXMgc3ludGFjdGljYWxseSBhbmQgc2VtYW50aWNhbGx5IGhldGVyb2dlbm91cy48L2xpPgorCis8bGk+CitObyBzeW50YWN0aWMgY29uc3RyYWludHMgb24gbnVtYmVyIGFuZCBvcmRlci48L2xpPgorCis8bGk+CitPcmRlciBpcyBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+CisKKzxsaT4KK1dpdGhpbiBmaWVsZCBkZWNsYXJhdGlvbnMsIHJlbGF0aXZlIG9yZGVyIGlzIHNlbWFudGljYWxseSBzaWduaWZpY2FudC48L2xpPgorCis8bGk+CitTdGFuZGFyZCBwcmFjdGljZXM6PC9saT4KKworPHVsPgorPGxpPgorUGxhY2UgZmllbGQgZGVjbGFyYXRpb25zIGJlZm9yZSBtZW1iZXIgbWV0aG9kcyBhbmQgdHlwZXMuPC9saT4KKworPGxpPgorUGxhY2UgdHlwZXMgYmVmb3JlIG1ldGhvZHMuPC9saT4KKzwvdWw+CisKKzxsaT4KK09wdGlvbiAoMSk6IGV4cG9zZSBzZXBhcmF0ZSBsaXN0cyBmb3IgZmllbGQsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitQcm86IFRoaXMgaXMgd2F5IGludGVybmFsIEFTVCB3b3Jrcy48L2xpPgorCis8bGk+CitQcm86IENvbnZlbmllbnQgZm9yIGNsaWVudHMgdG8gbG9jYXRlIG1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitDb246IE5vdCBmbGV4aWJsZSBmb3IgZWRpdGluZzsgZWRpdGluZyB3aWxsIG1hbmdsZSBtZW1iZXIgb3JkZXIuPC9saT4KKworPGxpPgorT3B0aW9uICgyKTogZXhwb3NlIGEgc2luZ2xlIGxpc3Qgb2YgbWVtYmVyczwvbGk+CisKKzxsaT4KK1BybzogcGFyc2VyIGRvZXMgbm90IG5vcm1hbGl6ZTsgY2xpZW50IGNvbnRyb2xzIG9yZGVyIG9mIG1lbWJlcnMuPC9saT4KKworPGxpPgorQ29uOiBNb3JlIHdvcmsgZm9yIGNsaWVudHMgdG8gbG9jYXRlIG1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgorCis8bGk+CitPcHRpb24gKDMpOiBleHBvc2UgYSBzaW5nbGUgbGlzdCBvZiBtZW1iZXJzLCB3aXRoIGV4dHJhIGdldHRlcnMgZm9yIGxvY2F0aW5nCittZW1iZXIgZmllbGRzLCBtZXRob2RzLCBhbmQgdHlwZXMuPC9saT4KKworPGxpPgorUHJvOiBDb21iaW5lcyBhZHZhbnRhZ2Ugb2YgKDIpIHdpdGggY29udmVuaWVuY2Ugb2YgKDEpLjwvbGk+CisKKzxsaT4KK1JlY29tbWVuZGVkIGFwcHJvYWNoOiAoMykuPC9saT4KKworPGxpPgorRm9yIGNsYXNzIGRlY2xhcmF0aW9ucywgdHJlYXQgaW5pdGlhbGl6ZXJzIGFuZCBjb25zdHJ1Y3RvcnMgYXMgbWVtYmVycy48L2xpPgorCis8dWw+Cis8bGk+CitMdW1wIGluc3RhbmNlIGFuZCBzdGF0aWMgaW5pdGlhbGl6ZXJzIGluIHdpdGggZmllbGQgZGVjbGFyYXRpb25zLjwvbGk+CisKKzxsaT4KK0x1bXAgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zIGluIHdpdGggbWV0aG9kIGRlY2xhcmF0aW9ucy48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KK1NlcmlhbGl6YXRpb248L2gzPgorCis8dWw+Cis8bGk+CitDbGllbnRzIG9mIHJlYWQtd3JpdGUgQVNUcyB3aWxsIGdlbmVyYWxseSB3YW50IHRvIHNlcmlhbGl6ZSB0byBhIEphdmEgY29tcGlsYXRpb24KK3VuaXQuPC9saT4KKworPGxpPgorU2VyaWFsaXphdGlvbiB2aWEgc2ltcGxlIEFTVCB0cmVlIHdhbGsuPC9saT4KKworPHVsPgorPGxpPgorU3RyYWlnaHRmb3J3YXJkLjwvbGk+CisKKzxsaT4KK0ludHJvZHVjZSBsaW5lIGJyZWFrcyBhbmQgd2hpdGVzcGFjZSB0byBtYWtlIGl0IGxvb2sgcHJldHR5LjwvbGk+CisKKzxsaT4KK09yIHBvc3QtcHJvY2VzcyBpdCB3aXRoIHRoZSBKYXZhIGZvcm1hdHRlci48L2xpPgorCis8bGk+CitJZiBBU1Qgb3JpZ2luYXRlZCBieSBwYXJzaW5nLCB0aGUgcmVzdWx0IGlzIGxpa2VseSB1bmFjY2VwdGFibGUgdG8gdXNlcjo8L2xpPgorCis8dWw+Cis8bGk+CitDb21wbGV0ZWx5IHJlZm9ybWF0dGVkLjwvbGk+CisKKzxsaT4KK0NvbnN0cnVjdHMgYXJlIG5vcm1hbGl6ZWQuPC9saT4KKworPGxpPgorU29tZSBjb21tZW50cyBtYXkgaGF2ZSBiZSBsb3N0LjwvbGk+Cis8L3VsPgorCis8bGk+CitDb3VsZCBiZSBwcm92aWRlZCBieSBBUEkgdGhhdCBtYWtlcyB1c2Ugb2YgcmVndWxhciBBU1QgQVBJIG9ubHkuPC9saT4KKworPGxpPgorQ291bGQgYmUgd3JpdHRlbiBieSBjbGllbnRzLjwvbGk+Cis8L3VsPgorCis8bGk+CitTZXJpYWxpemF0aW9uIHZpYSBzb3VyY2UgcmVjb25zdHJ1Y3Rpb24uPC9saT4KKworPHVsPgorPGxpPgorT25seSBhcHBsaWNhYmxlIHRvIEFTVHMgaW5pdGlhbGx5IGNvbnN0cnVjdGVkIGJ5IHBhcnNlci48L2xpPgorCis8bGk+CitVc2Ugc291cmNlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGluIG1vZGlmaWVkIEFTVCB0byByZWNvbnN0cnVjdCBjb21waWxhdGlvbgordW5pdC48L2xpPgorCis8bGk+CitSZXRhaW4gcGFzc2FnZXMgb2Ygb3JpZ2luYWwgdGV4dCBjb3JyZXNwb25kaW5nIHRvIHVuY2hhbmdlZCBBU1QgdHJlZXMuPC9saT4KKworPGxpPgorR2VuZXJhdGVzIG5ldyB0ZXh0IG9ubHkgd2hlcmUgcmVxdWlyZWQuPC9saT4KKworPGxpPgorUHJvZHVjZSBhIHJlc3VsdCB0aGF0IGEgdXNlciB3aWxsIHJlY29nbml6ZSBhbmQgYWNjZXB0LjwvbGk+CisKKzx1bD4KKzxsaT4KK1ByZXNlcnZlIGZvcm1hdHRpbmcgd2hlcmV2ZXIgcG9zc2libGUuPC9saT4KKworPGxpPgorUHJlc2VydmUmbmJzcDsgc291cmNlIGNvbnN0cnVjdCBub3JtYWxpemF0aW9uIHdoZXJldmVyIHBvc3NpYmxlLjwvbGk+CisKKzxsaT4KK1ByZXNlcnZlIGFyYml0cmFyaWx5LXBsYWNlZCBjb21tZW50cyB3aGVyZXZlciBwb3NzaWJsZS48L2xpPgorPC91bD4KKworPGxpPgorUmVxdWlyZXMgcmV0YWluaW5nIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0LCBhbmQgbGlrZWx5IHJlY29yZGluZworYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiBub2RlcyB0byBhbGxvdyByZWNvbnN0cnVjdGlvbi48L2xpPgorCis8bGk+CitUaGlzIGlzIHRoZSB3YXkgdGhlIGN1cnJlbnQgSkRPTSBpbXBsZW1lbnRhdGlvbiB3b3Jrcy48L2xpPgorCis8bGk+CitDb3VsZCBiZSBwcm92aWRlZCBieSBBUEkgdGhhdCBoYXMgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gQVNUIG5vZGVzIGFuZCBwYXJzZXItcmVjb3JkZWQKK2luZm9ybWF0aW9uLjwvbGk+CisKKzxsaT4KK1Nob3VsZCBhbHNvIHJldHVybiBhIGxpc3Qgb2YgZWRpdCBpbnN0cnVjdGlvbnMgc28gdGhhdCBtYXJrZXJzIGNhbiBiZSBhZGp1c3RlZCwKK2V0Yy48L2xpPgorCis8bGk+CitDbGllbnRzIHdvdWxkIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+UmVjb21tZW5kIGRlZmVycmluZyBpbXBsZW1lbnRhdGlvbiBvZiBzZXJpYWxpemVyCit0aGF0IGRvZXMgc291cmNlIHJlY29uc3RydWN0aW9uLjwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW4gaW50ZXJpbSwgcmVmYWN0b3JpbmcgY2FuIGFwcGx5IGVkaXRzIHRvIG9yaWdpbmFsCitjb21waWxhdGlvbiB1bml0IHRleHQgZGlyZWN0bHkuPC9mb250PjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorTm9kZSB0eXBlczwvaDM+CitUaGUgQVNUIG5vZGUgdHlwZXMgYXJlIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBncmFtbWFyIGZvciB0aGUgSmF2YSBsYW5ndWFnZQorZ2l2ZW4gaW4gdGhlIEpMUzIuCis8cD5FdmVyeSBBU1Qgbm9kZSBiZWxvbmdzIHRvIGEgc2luZ2xlIEFTVCBpbnN0YW5jZS4gKEluIERPTSB0ZXJtaW5vbG9neSwKK3RoZSBBU1QgaXMgdGhlIGRvY3VtZW50IGFuZCB0aGUgQVNUIG5vZGVzIGFyZSB0aGUgZWxlbWVudHMpLiBUaGUgQVNUIGluc3RhbmNlCitjYW4gc2VydmUgYXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgbm9kZXMuIE5vZGVzIHBvaW50IHRvIHRoZWlyIG93bmluZworQVNUIChmaXhlZCBmb3IgdGhlIG5vZGUncyBsaWZldGltZSkuIFRoZSBBU1QgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSByb290Citub2RlIChhIGNvbXBpbGF0aW9uIHVuaXQpLgorPHA+VGhlIEFTVCBub2RlIHR5cGVzIGRvIG5vdCBkZWZpbmUgdGhlaXIgb3duIG5vdGlvbiBvZiBlcXVhbGl0eTsgdGhleQoranVzdCBpbmhlcml0IHRoZSBvYmplY3QgaWRlbnRpdHkgYmFzZWQgaW1wbGVtZW50YXRpb24gZnJvbSBPYmplY3QuCis8cD5Ob3RlOiBHcmFtbWFyIHJ1bGVzIChpbiBjb21tZW50cykgYXJlIGV4cHJlc3NlZCBpbiB0aGUgUGFzY2FsLXN0eWxlCitleHRlbmRlZCBCTkYgdXNlZCBpbiA8dHQ+c2VjdGlvbiAxODwvdHQ+IG9mIEpMUzIuIFdlIHVzZSBDIyBzdHlsZSBwcm9wZXJ0eQorZGVjbGFyYXRpb25zIGFzIGEgY29udmVuaWVudCBhYmJyZXZpYXRpb24gZm9yIGEgc3RhbmRhcmQgbWF0Y2hlZCBwYWlyIG9mCitnZXQgYW5kIHNldCBtZXRob2RzLgorPHA+PHR0PnB1YmxpYyBjbGFzcyBBU1Q8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFTVCgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQ29tcGlsYXRpb25Vbml0IHJvb3Q7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyB2b2lkIGxvYWRGcm9tU291cmNlKGNoYXJbXSBzb3VyY2UpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKC4uLik7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjaGFyW10gc2VyaWFsaXplKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVNUTm9kZTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcm90ZWN0ZWQgQVNUTm9kZShBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFTVCBnZXRPd25lcigpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50W10gc3RhcnRQb3NpdGlvbnM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnRbXSBsZW5ndGhzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgYm9vbGVhbiBpc1dob2xlTGluZTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE9iamVjdCBjbGllbnREYXRhOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUTm9kZSBnZXRQYXJlbnQoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uIG90aGVyIHByb3RvY29sIGNvbW1vbiB0byBhbGwgQVNUIG5vZGUgdHlwZXM8L3R0PgorPGg0PgorTmFtZXM8L2g0PgorQXMgZXhwbGFpbmVkIGluIEpMUzIgc2VjdGlvbiA2LjUsIHRoZSBncmFtbWFyIGRvZXMgbm90IGFsbG93IG5hbWVzIHRvIGJlCityZXNvbHZlZCBtb3JlIGZpbmVseSB0aGFuIHRoZSBmb2xsb3dpbmcgNiBjYXRlZ29yaWVzIGJ5IHN5bnRhY3RpYyBtZWFucworYWxvbmU6Cis8cD48dHQ+UGFja2FnZU5hbWU6PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitQYWNrYWdlTmFtZSAuIElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD5UeXBlTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1BhY2thZ2VPclR5cGVOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+RXhwcmVzc2lvbk5hbWU6PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitBbWJpZ3VvdXNOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+TWV0aG9kTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0FtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KKzxwPjx0dD5QYWNrYWdlT3JUeXBlTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1BhY2thZ2VPclR5cGVOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Cis8cD48dHQ+QW1iaWd1b3VzTmFtZTo8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0lkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0FtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KKzxwPkdpdmVuIHRoYXQgbmFtZXMgY2Fubm90IGJlIHJlc29sdmVkIGRlZmluaXRpdmVseSB0byBhIHBhY2thZ2UsIHR5cGUsCitmaWVsZCwgb3IgdmFyaWFibGUgYXQgQVNUIG5vZGUgY29uc3RydWN0aW9uIHRpbWUsIGFuIG9wZW4gcXVlc3Rpb24gaXMgaG93CittdWNoIG9mIHRoZSBjYXRlZ29yaXphdGlvbiB0aGF0IGNvdWxkIGJlIGRvbmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUKK0FTVC4gTW9yZSBjYXRlZ29yaWVzIG1lYW5zIG1vcmUgaW5mb3JtYXRpb24gZmxvdyBmcm9tIHRoZSBwYXJzZXIgdG8gdGhlCitBU1QgY2xpZW50OyBvbiB0aGUgb3RoZXIgaGFuZCwgYSB2YXJpZXR5IG9mIGNhdGVnb3JpZXMgaXMgbm90IG5lY2Vzc2FyaWx5Citjb252ZW5pZW50IGZvciBjbGllbnRzLiBGb3IgZXhhbXBsZSwgaW4gPHR0PmltcG9ydCBhLmIuYzwvdHQ+IHRoZSBuYW1lCitpcyBhIDx0dD5UeXBlTmFtZTwvdHQ+IHdoZXJlYXMgaW4gPHR0PmltcG9ydCBhLmIuYy4qPC90dD4gdGhlIG5hbWUgPHR0PmEuYi5jPC90dD4KK2lzIGEgPHR0PlBhY2thZ2VPclR5cGVOYW1lPC90dD4uIElmIHRoZSBuYW1lIGNhdGVnb3J5IHdhcyB0byBiZSByZWZsZWN0ZWQKK2luIHRoZSB0eXBlIG9mIHRoZSBBU1Qgbm9kZXMsIHRoZSBjbGllbnQgd291bGQgbmVlZCB0byBrbm93IHRvIGNyZWF0ZSB0aGUKK2FwcHJvcHJpYXRlIHR5cGUgb2YgbmFtZSBub2RlcyB3aGVuIGVkaXRpbmcgdGhlIEFTVC4KKzxwPlByb3Bvc2FsOiBVc2UgdHdvIEFTVCBub2RlIHR5cGVzIGZvciBuYW1lczogc2ltcGxlIG5hbWVzLCBhbmQgcXVhbGlmaWVkCituYW1lcy4gUXVhbGlmaWVkIG5hbWVzIGFyZSBleHByZXNzZWQgcmVjdXJzaXZlbHksIHRvIGZhY2lsaXRhdGUgY2xpZW50cworZGlzY292ZXJpbmcgaG93IHRoZSBxdWFsaWZpZXIgcGFydCBvZiBhIG5hbWUgcmVzb2x2ZXMuIFVzZSB0aGVzZSBmb3IgZXZlcnl0aGluZworYnV0IDx0dD5NZXRob2ROYW1lPC90dD47IGZvciA8dHQ+TWV0aG9kTmFtZTwvdHQ+LCB3aGljaCBjYW4gYXBwZWFyIG9ubHkKK2luIGEgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiwgc2VwYXJhdGUgdGhlIHNlbGVjdG9yIGlkZW50aWZpZXIgZnJvbQorYW55IHByZWNlZGluZyBxdWFsaWZpZXIuCis8cD4oTm90ZTogVGhlIGN1cnJlbnQgaW50ZXJuYWwgQVNUIG5vZGVzIGdvIGJleW9uZCBtYWtpbmcgdGhlIHNpbXBsZS9xdWFsaWZpZWQKK2Rpc3RpbmN0aW9uOiB0aGV5IGFsc28gaGF2ZSBzaW1wbGUgJmFtcDsgcXVhbGlmaWVkIHR5cGUgbmFtZXMgKGNsYXNzZXMKKzx0dD5TaW1wbGVUeXBlUmVmZXJlbmNlPC90dD4KK2FuZCA8dHQ+UXVhbGlmaWVkVHlwZVJlZmVyZW5jZTwvdHQ+KSBpbiBhZGRpdGlvbmFsIHRvIHNpbXBsZSAmYW1wOyBxdWFsaWZpZWQKK25hbWVkIChjbGFzc2VzIDx0dD5TaW1wbGVOYW1lUmVmZXJlbmNlPC90dD4gYW5kCis8dHQ+UXVhbGlmaWVkTmFtZVJlZmVyZW5jZTwvdHQ+KS4pCis8cD48dHQ+Ly8gTmFtZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworU2ltcGxlTmFtZTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitRdWFsaWZpZWROYW1lPC90dD4KKzxicj48dHQ+Ly8gU2ltcGxlTmFtZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vIFF1YWxpZmllZE5hbWU6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK05hbWUgPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElOYW1lIC8vICJtYXJrZXIiIGludGVyZmFjZTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZWRCaW5kaW5nKCk7Jm5ic3A7IC8vCitvcHRpb25hbDwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIFNpbXBsZU5hbWUgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSU5hbWUsIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBTaW1wbGVOYW1lKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIGlkZW50aWZpZXI7PC90dD4KKzxwPjx0dD5wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTmFtZSwgSUV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFF1YWxpZmllZE5hbWUoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJTmFtZSBxdWFsaWZpZXI7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gaWRlbnRpZmllcjs8L3R0PgorPGgzPgorQ29tcGlsYXRpb24gVW5pdHMgYW5kIE1ham9yIERlY2xhcmF0aW9uczwvaDM+Cis8dHQ+Ly8gQ29tcGlsYXRpb25Vbml0OjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+cGFja2FnZTwvdT48L2I+IElkZW50aWZpZXIgeyA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciB9IDxiPjx1Pjs8L3U+PC9iPiZuYnNwOworXTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7SW1wb3J0RGVjbGFyYXRpb259PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tUeXBlRGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj59PC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEFTVE5vZGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIENvbXBpbGF0aW9uVW5pdChBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE5hbWUgcGFja2FnZU5hbWU7IC8vIG9wdGlvbmFsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlRGVjbGFyYXRpb25bXSB0eXBlczs8L3R0PgorPHA+PHR0Pi8vIEltcG9ydERlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmltcG9ydDwvdT48L2I+CitJZGVudGlmaWVyIHsgPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXIgfSBbIDxiPjx1Pi48L3U+PC9iPiZuYnNwOyA8Yj48dT4qPC91PjwvYj4mbmJzcDsmbmJzcDsKK10KKzxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBJbXBvcnREZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEltcG9ydERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBpbXBvcnROYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgYm9vbGVhbiBvbkRlbWFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KKzxwPjx0dD4vLyBUeXBlRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gPGI+PHU+Y2xhc3M8L3U+PC9iPiBJZGVudGlmaWVyPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5leHRlbmRzPC91PjwvYj4gVHlwZV08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PmltcGxlbWVudHM8L3U+PC9iPiBUeXBlIHsgPGI+PHU+LDwvdT48L2I+IFR5cGV9XTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8Yj48dT57PC91PjwvYj4ge0NsYXNzQm9keURlY2xhcmF0aW9uIHwgPGI+PHU+OzwvdT48L2I+IH0gPGI+PHU+fTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gPGI+PHU+aW50ZXJmYWNlPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+ZXh0ZW5kczwvdT48L2I+IFR5cGUgeyA8Yj48dT4sPC91PjwvYj4gVHlwZX1dPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzxiPjx1Pns8L3U+PC9iPiB7SW50ZXJmYWNlQm9keURlY2xhcmF0aW9uIHwgPGI+PHU+OzwvdT48L2I+IH0gPGI+PHU+fTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8gTW9kaWZpZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cHVibGljPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5wcm90ZWN0ZWQ8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnByaXZhdGU8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN0YXRpYzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+YWJzdHJhY3Q8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZpbmFsPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uYXRpdmU8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN5bmNocm9uaXplZDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dHJhbnNpZW50PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT52b2xhdGlsZTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3RyaWN0ZnA8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vIENsYXNzQm9keURlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitNZXRob2REZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0ZpZWxkRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQ2xhc3NEZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitUeXBlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSW5pdGlhbGl6ZXI8L3R0PgorPGJyPjx0dD4vLyBJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK01ldGhvZERlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0ZpZWxkRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworVHlwZURlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50LAorSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgVHlwZURlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IG1vZGlmaWVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBuYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBzdXBlcmNsYXNzOyAvLyBvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZVtdIHN1cGVySW50ZXJmYWNlczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElNZW1iZXJbXSBtZW1iZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBjb252ZW5pZW5jZSBtZXRob2RzPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzOyAvLyBpbmNsdWRlcworY29uc3RhbnRzOyBleGNsdWRlcyBpbml0aWFsaXplcnM8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBnZXRNZXRob2RzOworLy8gaW5jbHVkZXMgY29uc3RydWN0b3JzPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElUeXBlQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Cis8cD48dHQ+Ly8gTWV0aG9kRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gKFR5cGUgfCA8Yj48dT52b2lkPC91PjwvYj4pIElkZW50aWZpZXIgPGI+PHU+KDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1tGb3JtYWxQYXJhbWV0ZXIgeyA8Yj48dT4sPC91PjwvYj4gRm9ybWFsUGFyYW1ldGVyfV0gPGI+PHU+KTwvdT48L2I+Jm5ic3A7Cit7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PnRocm93czwvdT48L2I+IFF1YWxpZmllZElkZW50aWZpZXJMaXN0XSAoIE1ldGhvZEJvZHkgfCA8Yj48dT47PC91PjwvYj4KKyk8L3R0PgorPGJyPjx0dD4vLyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7TW9kaWZpZXJ9IElkZW50aWZpZXIgPGI+PHU+KDwvdT48L2I+IFtGb3JtYWxQYXJhbWV0ZXIgeyA8Yj48dT4sPC91PjwvYj4KK0Zvcm1hbFBhcmFtZXRlcn1dIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbPGI+PHU+dGhyb3dzPC91PjwvYj4gUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdIE1ldGhvZEJvZHk8L3R0PgorPGJyPjx0dD4vLyBGb3JtYWxQYXJhbWV0ZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5maW5hbDwvdT48L2I+XSBUeXBlIElkZW50aWZpZXIgezxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj59PC90dD4KKzxicj48dHQ+cHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlCitpbXBsZW1lbnRzIElNZW1iZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHJvdGVjdGVkIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIHNlbGVjdG9yOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRm9ybWFsUGFyYW1ldGVyW10gcGFyYW1ldGVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IE5hbWVbXSB0aHJvd25FeGNlcHRpb25zOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQmxvY2sgYm9keTsgLy8gb3B0aW9uYWw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgcmV0dXJuVHlwZTsgLy8gaW5jbHVkZXMKK3ZvaWQ8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgorPHA+PHR0Pi8vIEZpZWxkRGVjbGFyYXRpb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3tNb2RpZmllcn0gVHlwZSBJZGVudGlmaWVyIHs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgorRXhwcmVzc2lvbl08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworeyA8Yj48dT4sPC91PjwvYj4gSWRlbnRpZmllciB7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn0gWyA8Yj48dT49PC91PjwvYj4KK0V4cHJlc3Npb25dIH08L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IG1vZGlmaWVyczs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBuYW1lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdW10gamF2YWRvY0NvbW1lbnQ7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gaW5pdGlhbGl6ZXI7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUZpZWxkQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Cis8cD48dHQ+Ly8gSW5pdGlhbGl6ZXI6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1s8Yj48dT5zdGF0aWM8L3U+PC9iPl0gQmxvY2s8L3R0PgorPGJyPjx0dD5wdWJsaWMgZmluYWwgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW5pdGlhbGl6ZXIoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgQmxvY2sgYm9keTs8L3R0PgorPHA+PHR0Pi8vIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWzxiPjx1PmZpbmFsPC91PjwvYj5dIFR5cGUgSWRlbnRpZmllciB7PGI+PHU+W108L3U+PC9iPn0gWyA8Yj48dT49PC91PjwvYj4KK0V4cHJlc3Npb24gXTwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cit7IDxiPjx1Piw8L3U+PC9iPiBJZGVudGlmaWVyIHs8Yj48dT5bXTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPiBFeHByZXNzaW9uXQorfSA8Yj48dT47PC91PjwvYj48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzCitJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8KK29wdGlvbmFsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJTG9jYWxWYXJpYWJsZUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgorPGJyPiZuYnNwOworPGg0PgorVHlwZXM8L2g0PgorVGhlIFR5cGUgbm9kZSAoPSBUeXBlUmVmZXJlbmNlKSByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGEgYmFzZSB0eXBlLAorYSBuYW1lZCB0eXBlLCBvciBhbiBhcnJheSB0aGVyZW9mLgorPHA+PHR0Pi8vIFR5cGU6PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyhCYXNpY1R5cGUgfCBUeXBlTmFtZSApIHs8Yj48dT5bXTwvdT48L2I+fTwvdHQ+Cis8YnI+PHR0Pi8vIEJhc2ljVHlwZTo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5ieXRlPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zaG9ydDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+Y2hhcjwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aW50PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5sb25nPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5mbG9hdDwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZG91YmxlPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5ib29sZWFuPC91PjwvYj48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgVHlwZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgVHlwZSAoQVNUIGFzdCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgYmFzZVR5cGU7IC8vIGVpdGhlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSB0eXBlTmFtZTsgLy8gb3I8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBkaW1lbnNpb25zOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZWRUeXBlKCk7PC90dD4KKzxoND4KK1N0YXRlbWVudHM8L2g0PgorVGhlcmUgaXMgYSBkaWZmZXJlbnQgQVNUIG5vZGUgdHlwZSBmb3IgZWFjaCBkaWZmZXJlbnQga2luZCBvZiBzdGF0ZW1lbnQuCitVc2UgYSAibWFya2VyIiBpbnRlcmZhY2UgKDx0dD5JU3RhdGVtZW50PC90dD4pIHRvIGJyaW5nIGFsbCBjb25zdHJ1Y3RzCit0aGF0IGNhbiBhcHBlYXIgd2l0aGluIGEgYmxvY2sgKG5vbnRlcm1pbmFsIDx0dD5CbG9ja1N0YXRlbWVudDwvdHQ+LCB3aGljaAoraW5jbHVkZXMgbG9jYWwgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zKS4KKzxwPjx0dD4vLyBCbG9jazo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT57PC91PjwvYj4KK0Jsb2NrU3RhdGVtZW50IDxiPjx1Pn08L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vIEJsb2NrU3RhdGVtZW50IDo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUeXBlRGVjbGFyYXRpb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBbSWRlbnRpZmllcgorPGI+PHU+OjwvdT48L2I+CitdIFN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0Pi8vU3RhdGVtZW50OjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJsb2NrPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aWYKKyg8L3U+PC9iPkV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudCBbPGI+PHU+ZWxzZTwvdT48L2I+IFN0YXRlbWVudF08L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5mb3IKKyg8L3U+PC9iPiBGb3JJbml0T3B0Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPiZuYnNwOyZuYnNwOyBbRXhwcmVzc2lvbl0KKzxiPjx1Pjs8L3U+PC9iPiZuYnNwOyZuYnNwOworRm9yVXBkYXRlT3B0IDxiPjx1Pik8L3U+PC9iPiBTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT53aGlsZQorKDwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmRvPC91PjwvYj4KK1N0YXRlbWVudCA8Yj48dT53aGlsZTwvdT48L2I+IDxiPjx1Pig8L3U+PC9iPiBFeHByZXNzaW9uCis8Yj48dT4pOzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dHJ5PC91PjwvYj4KK0Jsb2NrIFtDYXRjaGVzXSBbIDxiPjx1PmZpbmFsbHk8L3U+PC9iPiBCbG9jayBdPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3dpdGNoCisoPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gPGI+PHU+ezwvdT48L2I+IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzCis8Yj48dT59PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zeW5jaHJvbml6ZWQKKyg8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pik8L3U+PC9iPiBCbG9jazwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnJldHVybjwvdT48L2I+CitbRXhwcmVzc2lvbl0gPGI+PHU+OzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+dGhyb3c8L3U+PC9iPgorRXhwcmVzc2lvbiZuYnNwOyZuYnNwOyA8Yj48dT47PC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5icmVhazwvdT48L2I+CitbSWRlbnRpZmllcl0mbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+Y29udGludWU8L3U+PC9iPgorW0lkZW50aWZpZXJdJm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEV4cHJlc3Npb25TdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJZGVudGlmaWVyCis8Yj48dT46PC91PjwvYj4KK1N0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlbWVudCZuYnNwOyAvLyAibWFya2VyIiBpbnRlcmZhY2U8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBCbG9jayBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBCbG9jayhBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzOzwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJZlN0YXRlbWVudChBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHRlc3Q7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJU3RhdGVtZW50IHRoZW5QYXJ0OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSVN0YXRlbWVudCBlbHNlUGFydDsmbmJzcDsgLy8KK29wdGlvbmFsPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIEZvclN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBEb1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBUcnlTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgU3dpdGNoU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBSZXR1cm5TdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgVGhyb3dTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgQnJlYWtTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgQ29udGludWVTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgorPGJyPjx0dD5wdWJsaWMgY2xhc3MgTnVsbFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KKzxicj48dHQ+cHVibGljIGNsYXNzIEFzc2VydFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+RXhwcmVzc2lvbiBTdGF0ZW1lbnRzPC9mb250PjwvaDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q2VydGFpbiB0eXBlcyBvZiBleHByZXNzaW9ucyBjYW4gYWxzbyBhcHBlYXIgYXMgc3RhdGVtZW50cy4KK1RoZSBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUgd3JhcHMgYW4gZXhwcmVzc2lvbiB1cCBhcyBhIHN0YXRlbWVudC4gVGhlCitzb3VyY2UgcmFuZ2UgZm9yIHRoZSBFeHByZXNzaW9uU3RhdGVtZW50IGluY2x1ZGVzIHRoZSB0cmFpbGluZyBzZW1pY29sb24uPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDAwIj48L2ZvbnQ+Cis8cD48dHQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPnB1YmxpYyBjbGFzcyBFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZQoraW1wbGVtZW50cyBJU3RhdGVtZW50PC9mb250PjwvdHQ+Cis8YnI+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEV4cHJlc3Npb25TdGF0ZW1lbnQoQVNUCithc3QpOzwvZm9udD48L3R0PgorPGJyPjx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbgorZXhwcmVzc2lvbjs8L2ZvbnQ+PC90dD4KKzxoND4KK0V4cHJlc3Npb25zPC9oND4KK1RoZXJlIGlzIGEgZGlmZmVyZW50IEFTVCBub2RlIHR5cGUgZm9yIGVhY2ggZGlmZmVyZW50IGtpbmQgb2YgZXhwcmVzc2lvbi4KK1VzZSBhICJtYXJrZXIiIGludGVyZmFjZSAoPHR0PklFeHByZXNzaW9uPC90dD4pIHRvIGJyaW5nIGFsbCBjb25zdHJ1Y3RzCit0aGF0IGNhbiBhcHBlYXIgYXMgZXhwcmVzc2lvbnMuCis8cD4oTWFueSBkZXRhaWxzIFRCRCkuCis8cD48dHQ+Ly8gRXhwcmVzc2lvbjo8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworSWRlbnRpZmllcjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1N0cmluZ0xpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworRmxvYXRpbmdQb2ludExpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQm9vbGVhbkxpdGVyYWw8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworQ2hhcmFjdGVyTGl0ZXJhbDwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitTdHJpbmdMaXRlcmFsPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK051bGxMaXRlcmFsPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyggVHlwZSB8IDxiPjx1PnZvaWQ8L3U+PC9iPiApIDxiPjx1Pi48L3U+PC9iPiBjbGFzczwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT50aGlzPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT4oPC91PjwvYj4KK0V4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1sgRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5uZXc8L3U+PC9iPiBUeXBlIDxiPjx1Pig8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+IFsgQ2xhc3NCb2R5CitdPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBDbGFzc05hbWUgPGI+PHU+LjwvdT48L2I+IF0gPGI+PHU+c3VwZXIgLjwvdT48L2I+IElkZW50aWZpZXI8L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworTWV0aG9kTmFtZSA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gPGI+PHU+LjwvdT48L2I+IElkZW50aWZpZXIgPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+PHU+LDwvdT48L2I+CitFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBDbGFzc05hbWUgPGI+PHU+LjwvdT48L2I+IF0gPGI+PHU+c3VwZXIgLjwvdT48L2I+IElkZW50aWZpZXIgPGI+KDwvYj48L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworWyBFeHByZXNzaW9uIHsgPGI+PHU+LDwvdT48L2I+IEV4cHJlc3Npb24gfSBdIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIDxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIDxiPjx1Pmluc3RhbmNlb2Y8L3U+PC9iPiBUeXBlPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK0V4cHJlc3Npb24gUG9zdGZpeE9wZXJhdG9yPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK1ByZWZpeE9wZXJhdG9yIEV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT4oPC91PjwvYj4KK1R5cGUgPGI+PHU+KTwvdT48L2I+IEV4cHJlc3Npb248L3R0PgorPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworRXhwcmVzc2lvbiA8Yj48dT4/PC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT46PC91PjwvYj4gRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitFeHByZXNzaW9uIEFzc2lnbm1lbnRPcGVyYXRvciBFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQXJyYXlJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb24mbmJzcDsgLy8gIm1hcmtlciIgaW50ZXJmYWNlPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZFR5cGUoKTsmbmJzcDsgLy8gb3B0aW9uYWw8L3R0PgorPHA+PHR0Pi8vIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb246PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1ByaW1pdGl2ZVR5cGUgPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IHsgPGI+PHU+WzwvdT48L2I+CitFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPiB9IHsgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB9PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1R5cGVOYW1lIDxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pl08L3U+PC9iPiB7Cis8Yj48dT5bPC91PjwvYj4gRXhwcmVzc2lvbgorPGI+PHU+XTwvdT48L2I+Cit9IHsgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB9PC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1ByaW1pdGl2ZVR5cGUgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB7IDxiPjx1PltdPC91PjwvYj4gfSBBcnJheUluaXRpYWxpemVyPC90dD4KKzxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+bmV3PC91PjwvYj4KK1R5cGVOYW1lIDxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj4geyA8Yj48dT5bXTwvdT48L2I+IH0gQXJyYXlJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PnB1YmxpYyBjbGFzcyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRXhwcmVzc2lvbltdIGRpbWVuc2lvbnM7IC8vCitvcHRpb25hbDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgRXhwcmVzc2lvbiBhcnJheUluaXRpYWxpemVyOworLy8gb3B0aW9uYWw8L3R0PgorPHA+PHR0PnB1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBTdHJpbmdMaXRlcmFsKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgU3RyaW5nIHZhbHVlOzwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIENhc3RFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBDYXN0RXhwcmVzc2lvbihBU1QgYXN0KTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgdHlwZTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHZhbHVlOzwvdHQ+Cis8cD48dHQ+cHVibGljIGNsYXNzIEluZml4RXhwcmVzc2lvbiBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJRXhwcmVzc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW5maXhFeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IGluZml4T3BlcmF0b3I7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZDs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uW10gZXh0ZW5kZWRPcGVyYW5kczsmbmJzcDsKKy8vIEwgb3AgUiBvcCBSMiBvcCBSMy4uLjwvdHQ+Cis8aDM+CitCaW5kaW5nczwvaDM+CitUaGUgIndvcmxkIG9mIGJpbmRpbmdzIiBpcyBhbiBpbnRlZ3JhdGVkIHBpY3R1cmUgb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUKK3Byb2dyYW0gYXMgc2VlbiBmcm9tIHRoZSBjb21waWxlcidzIHBvaW50IG9mIHZpZXcuIFRoZSBiaW5kaW5ncyBjb3JyZXNwb25kCit0byBuYW1lZCBlbnRpdGllcyAocGFja2FnZXMsIHR5cGVzLCBmaWVsZHMsIG1ldGhvZHMsIGxvY2FsIHZhcmlhYmxlcykuCis8cD5DbGllbnRzIG5hdmlnYXRlIGZyb20gQVNUIG5vZGVzIGludG8gdGhlIHdvcmxkIG9mIGJpbmRpbmdzIHRvIGRpc2NvdmVyCit0aGluZ3MgbGlrZToKKzx1bD4KKzxsaT4KK3RoZSBlbnRpdHkgYW4gaWRlbnRpZmllciByZXNvbHZlcyB0bzwvbGk+CisKKzxsaT4KK3RoZSByZXNvbHZlZCB0eXBlIG9mIGFuIGV4cHJlc3Npb24gbm9kZTwvbGk+CisKKzxsaT4KK3RoZSByZXNvbHZlZCBiaW5kaW5nIG9mIGEgZGVjbGFyYXRpb24gbm9kZTwvbGk+CisKKzxsaT4KK290aGVycz88L2xpPgorPC91bD4KK09uY2UgaW4gdGhlIHdvcmxkIG9mIGJpbmRpbmdzLCB0aGUgY2xpZW50IGNhbiBuYXZpZ2F0ZSB0aGUgd2ViIG9mIGJpbmRpbmdzOgorPHVsPgorPGxpPgorZnJvbSBhcnJheSB0eXBlIHRvIGl0cyBjb21wb25lbnQgdHlwZSwgYW5kIHZpY2UgdmVyc2E8L2xpPgorCis8bGk+Citmcm9tIGZpZWxkIG9yIHZhcmlhYmxlIHRvIGl0cyBkZWNsYXJlZCB0eXBlPC9saT4KKworPGxpPgorZnJvbSBtZXRob2QgdG8gaXRzIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzPC9saT4KKworPGxpPgorZnJvbSB0eXBlIHRvIGl0cyBjb25zdHJ1Y3RvcnMgYW5kIGl0cyBkZWNsYXJlZCBtZXRob2QsIGZpZWxkLCBhbmQgdHlwZQorbWVtYmVyczwvbGk+CisKKzxsaT4KK2Zyb20gY29uc3RydWN0b3IsIG1ldGhvZCwgb3IgZmllbGQgdG8gaXRzIGRlY2xhcmluZyB0eXBlPC9saT4KKworPGxpPgorZnJvbSBuZXN0ZWQgdHlwZSB0byBpdHMgZW5jbG9zaW5nIHR5cGU8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gZGVjbGFyaW5nIHBhY2thZ2U8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gaXRzIHN1cGVydHlwZXMgKGJ1dCwgc2lnbmlmaWNhbnRseSwgPGk+bm90PC9pPiB0byBpdHMgc3VidHlwZXMpPC9saT4KKworPGxpPgorZGlyZWN0bHkgdG8gdGhlIGJpbmRpbmcgZm9yIGFueSBiYXNlIHR5cGUgKGludCwgZmxvYXQsIGNoYXIsIGV0Yy4pPC9saT4KKworPGxpPgorZGlyZWN0bHkgdG8gdGhlIGJpbmRpbmcgZm9yIGEgaGFuZGZ1bCBvZiB3ZWxsLWtub3duIHR5cGVzIChqYXZhLmxhbmcuT2JqZWN0LAorZXRjLik8L2xpPgorPC91bD4KK1NvbWUgb2YgdGhlIG5hdmlnYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKHF1aXRlIGludGVudGlvbmFsbHkpOgorPHVsPgorPGxpPgorZnJvbSBwYWNrYWdlIHRvIGl0cyAoa25vd24pIHR5cGVzIC0gdmVyeSBleHBlbnNpdmU8L2xpPgorCis8bGk+Citmcm9tIHBhY2thZ2UgdG8gb25lIG9mIGl0cyB0eXBlcyBieSBuYW1lIC0gdmVyeSBleHBlbnNpdmU8L2xpPgorCis8bGk+Citmcm9tIHR5cGUgdG8gaXRzIChrbm93bikgc3VidHlwZXMgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+CisKKzxsaT4KK2Zyb20gdHlwZSBvciBtZXRob2QgdG8gdGhlIGxvY2FsIHR5cGVzIGl0IGVuY2xvc2VzIC0gYmluZGluZyBmb3IgbG9jYWwKK3R5cGVzIGFyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRob3NlIHdpdGggdGhlIGVuY2xvc2luZyB0eXBlJ3MgQVNUIGluIHRoZWlyCitoYW5kPC9saT4KKworPGxpPgorZnJvbSBtZXRob2QgdG8gdGhlIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoaW4gaXQgLSBiaW5kaW5nIGZvciB2YXJpYWJsZXMKK2FyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRob3NlIHdpdGggdGhlIG1ldGhvZCdzIEFTVCBpbiB0aGVpciBoYW5kPC9saT4KKzwvdWw+CitUaGVyZSBhcmUgbm8gbGlua3MgZnJvbSB0aGUgd29ybGQgb2YgYmluZGluZ3MgYmFjayB0byB0aGUgd29ybGQgb2YgQVNUcy4KKzxwPk90aGVyIHRoaW5ncyBkZWFsdCB3aXRoIGluIHRoZSB3b3JsZCBvZiBiaW5kaW5nczoKKzx1bD4KKzxsaT4KK3N5bnRoZXRpYyBlbnRpdGllcyBzdGVtbWluZyBmcm9tIGRlZmF1bHQgY29uc3RydWN0b3JzLCBhYnN0cmFjdCBtZXRob2QKK2NvcHktZG93biBmcm9tIGludGVyZmFjZXMsIGFuZCBpbm5lciBjbGFzcyBlbXVsYXRpb248L2xpPgorCis8bGk+CittaXNzaW5nIGJpbmRpbmdzIGZvciBlbnRpdGllcyB0aGF0IGFyZSByZXF1aXJlZCAobWVudGlvbmVkIGJ5IG5hbWUpIGJ1dAord2VyZSBub3QgZm91bmQ8L2xpPgorCis8bGk+Cit0eXBlIGhpZXJhY2h5IGNpcmN1bGFyaXRpZXM8L2xpPgorCis8bGk+CitpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXM8L2xpPgorPC91bD4KK090aGVyIGlzc3VlczoKKzx1bD4KKzxsaT4KK0NvbXBpbGUtdGltZS1jb21wdXRlZCB2YWx1ZXMgZm9yIGNvbnN0YW50cyAocHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMKK3dpdGggY29tcGlsZS10aW1lIGNvbXB1dGFibGUgdmFsdWVzKTwvbGk+Cis8L3VsPgorCis8aDQ+CitFeGlzdGluZyBCaW5kaW5nIGNsYXNzZXM8L2g0PgorVG8gZ2l2ZSBhbiBpZGVhIG9mIHRoZSBzY29wZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZyBpbmZyYXN0cnVjdHVyZSwgYmVsb3cKK2lzIGEgZHVtcCBvZiB0aGUgdHlwZSBoaWVyYXJjaHkgb2YgdGhlIGNvbXBpbGVyJ3MgYmluZGluZyBjbGFzc2VzIGZyb20KK3BhY2thZ2UgPHR0PnJnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDwvdHQ+LgorPHA+PHR0PnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBmaW5hbCBjbGFzcyBCYXNlVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzCitSZWZlcmVuY2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitwdWJsaWMgY2xhc3MgU291cmNlVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBjbGFzcyBOZXN0ZWRUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGZpbmFsIGNsYXNzIExvY2FsVHlwZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZW1iZXJUeXBlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitwdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFBhY2thZ2VCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBQcm9ibGVtUGFja2FnZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZUJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3B1YmxpYyBjbGFzcyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIEZpZWxkQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFN5bnRoZXRpY0ZpZWxkQmluZGluZzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcHVibGljIGNsYXNzIFByb2JsZW1GaWVsZEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIE1ldGhvZEJpbmRpbmc8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1NZXRob2RCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBJbXBvcnRCaW5kaW5nPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBQcm9ibGVtQmluZGluZzwvdHQ+Cis8aDQ+CitCaW5kaW5nIEFQSTwvaDQ+CitUaGUgZXhpc3RpbmcgYmluZGluZyBjbGFzc2VzIGFyZSBub3QgaW1tZWRpYXRlbHkgc3VpdGFibGUgZm9yIGV4cG9zaW5nCithcyBhIGJpbmRpbmcgQVBJLgorPHA+SG93ZXZlciwgdGhlIEphdmEgYnVpbGRlciBkb2VzIGhhdmUgYW4gQVBJIGZvciB0aGUgYnVpbHQgImltYWdlIiwgaW4KK3BhY2thZ2UgPHR0Pm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI8L3R0Pi4gKFRoaXMgQVBJIGlzIGEKK2hvbGQtb3ZlciBmcm9tIExlYXBmcm9nIGVyYSwgYW5kIGlzIG5vdCBleHBvc2VkIGluIHRoZSBFY2xpcHNlIGNvZGUgYmFzZSkuCitUaGlzIEFQSSB3YXMgZGVzaWduZWQgdG8gZXhwb3NlIHRoZSBzYW1lIGtpbmQgb2YgaW50ZWdyYXRlZCBwaWN0dXJlIG9mCit0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9ncmFtIGFzIHNlZW4gZnJvbSB0aGUgY29tcGlsZXIncyBwb2ludCBvZiB2aWV3LgorVGhpcyBBUEkgaGFzIGEgZGV0YWlsZWQgc3BlY2lmaWNhdGlvbiB0aGF0IGRvZXMgbm90IGV4cG9zZSBpbXBsZW1lbnRhdGlvbgorZGV0YWlscywgc28gdGhlIHByb3Bvc2FsIGlzIHRvIHVzZSBpdCBhcyB0aGUgYmFzaXMgZm9yIHRoZSBuZXcgYmluZGluZworQVBJLgorPHA+UmUtcHVycG9zaW5nIHRoaXMgQVBJIHdvdWxkIGVudGFpbDoKKzx1bD4KKzxsaT4KK2ludHJvZHVjaW5nIGVudGl0aWVzIGZvciBsb2NhbCB2YXJpYWJsZXM8L2xpPgorCis8bGk+CityZW1vdmluZyBwcm90b2NvbCBmb3IgbmF2aWdhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAoZS5nLiwgZnJvbSBwYWNrYWdlCit0byBpdHMga25vd24gdHlwZXMpPC9saT4KKworPGxpPgorcmVtb3ZpbmcgdW5uZWVkZWQgcHJvdG9jb2w7IGluY2x1ZGluZyBzdGF0ZXMsIG5vbi1zdGF0ZS1zcGVjaWZpYyBoYW5kbGVzLAorZGVsdGFzLCByZXBvcnQgY2FyZHMsIGRlcGVuZGVuY3kgZ3JhcGgsIHBhY2thZ2UgcmVmZXJlbmNlczwvbGk+Cis8L3VsPgorQmVsb3cgaXMgYSBkdW1wIG9mIHRoZSByZWxldmFudCBpbnRlcmZhY2VzIGZyb20gcGFja2FnZSA8dHQ+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjwvdHQ+LgorVW5uZWNlc3NhcnkgcHJvdG9jb2wgaGFzIGJlZW4gb21pdHRlZC4gKE5vdGUgdGhhdCBOb3RQcmVzZW50RXhjZXB0aW9uIGlzCithbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCBhbmQgd291bGQgbm90IGJlIHJlcXVpcmVkLikKKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9JTUFHRSA9IDE7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfUEFDS0FHRSA9IDI7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfVFlQRSA9IDM7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfRklFTEQgPSA0OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgS19KQVZBX01FVEhPRCA9IDU7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfQ09OU1RSVUNUT1IgPSA2OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGhhc2hDb2RlKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNGaWN0aW9uYWwoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGtpbmQoKTs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU1lbWJlciBleHRlbmRzIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0TmFtZSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQmluYXJ5KCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNTeW50aGV0aWMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2UgZXh0ZW5kcyBJSGFuZGxlPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRDbGFzc0hhbmRsZShTdHJpbmcgbmFtZSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNVbm5hbWVkKCk7PC90dD4KKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElUeXBlIGV4dGVuZHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0QXJyYXlIYW5kbGUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJQ29uc3RydWN0b3IgZ2V0Q29uc3RydWN0b3JIYW5kbGUoSVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RGVjbGFyZWRDbGFzc2VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElDb25zdHJ1Y3RvcltdIGdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkgdGhyb3dzCitOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJRmllbGRbXSBnZXREZWNsYXJlZEZpZWxkcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJTWV0aG9kW10gZ2V0RGVjbGFyZWRNZXRob2RzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXREZWNsYXJlZE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0RGVjbGFyZWROYW1lKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldERlY2xhcmluZ0NsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElGaWVsZCBnZXRGaWVsZEhhbmRsZShTdHJpbmcgbmFtZSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0SW50ZXJmYWNlcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJTWV0aG9kIGdldE1ldGhvZEhhbmRsZShTdHJpbmcgbmFtZSwgSVR5cGVbXQorcGFyYW1ldGVyVHlwZXMpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgZ2V0TW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElQYWNrYWdlIGdldFBhY2thZ2UoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldFNpbXBsZU5hbWUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0U3VwZXJjbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQW5vbnltb3VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNBcnJheSgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzQmluYXJ5KCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNDbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzRGVwcmVjYXRlZCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzSW5uZXJDbGFzcygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzSW50ZXJmYWNlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNMb2NhbCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUGFja2FnZU1lbWJlcigpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJpbWl0aXZlKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNTeW50aGV0aWMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1RvcExldmVsKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElNZXRob2QgZXh0ZW5kcyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZVtdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8cD48dHQ+cHVibGljIGludGVyZmFjZSBJQ29uc3RydWN0b3IgZXh0ZW5kcyBJTWVtYmVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZVtdIGdldEV4Y2VwdGlvblR5cGVzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgorPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkIGV4dGVuZHMgSU1lbWJlcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0VHlwZSgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Cis8cD5JbiB0aGlzIHZlaW4sIHRoZSBpbnRlcmZhY2UgZm9yIGxvY2FsIHZhcmlhYmxlcyB3b3VsZCBsb29rIHNvbWV0aGluZworbGlrZToKKzxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElWYXJpYWJsZSBleHRlbmRzIElIYW5kbGU8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldERlY2xhcmluZ0NsYXNzKCk7PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXRNb2RpZmllcnMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KKzxwPkFsc28gd2lsbCBuZWVkIHRvIGFkZDoKKzx1bD4KKzxsaT4KK1BzZXVkby1iaW5kaW5ncyBmb3IgYmFzZSB0eXBlczogYm9vbGVhbiwgaW50LCBmbG9hdCwgZXRjLjwvbGk+CisKKzxsaT4KK0FjY2VzcyB0byB3ZWxsLWtub3duIGphdmEubGFuZyBiaW5kaW5nczogT2JqZWN0LCBTdHJpbmcsIFRocm93YWJsZSwgRXhjZXB0aW9uLAorUnVudGltZUV4Y2VwdGlvbiwgRXJyb3IsIENsYXNzLjwvbGk+Cis8L3VsPgorCis8aDM+CitEb2N1bWVudCBIaXN0b3J5PC9oMz4KKzE4OjMwIFRodXJzZGF5IFNlcHRlbWJlciAyNywgMjAwMSAtIGluY29ycG9yYXRlZCBmaXJzdCByb3VuZCBjb21tZW50cyBmcm9tCitQTSBhbmQgREIuCis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjEwOjQ1IE1vbmRheSBPY3RvYmVyIDEsIDIwMDEgLSBpbmNvcnBvcmF0ZWQgY29tbWVudHMKK2Zyb20gREIuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4xMDo0NSBUdWVzZGF5IE9jdG9iZXIgMiwgMjAwMSAtIGNsYXJpZnkgaGFuZGluZworb2YgRXhwcmVzc2lvblN0YXRlbWVudC48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjE0OjAwIEZyaWRheSBPY3RvYmVyIDI2LCAyMDAxIC0gYWRkIHN1YnRyZWUgc3RydWN0dXJhbAorZXF1YWxpdHkuPC9mb250PgorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9vdXRwdXQgZm9sZGVyL291dHB1dC1mb2xkZXIuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvb3V0cHV0IGZvbGRlci9vdXRwdXQtZm9sZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMjlkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvb3V0cHV0IGZvbGRlci9vdXRwdXQtZm9sZGVyLmh0bWwKQEAgLTAsMCArMSwxMjI4IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkJ1aWxkIj4KKyAgIDx0aXRsZT5KRFQgLSBKYXZhIE91dHB1dCBGb2xkZXI8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMj4KK0phdmEgT3V0cHV0IEZvbGRlcjwvaDI+CitMYXN0IHJldmlzZWQgMTc6MzAgVHVlc2RheSBPY3RvYmVyIDMwLCAyMDAxIDxmb250IGNvbG9yPSIjMzMzM0ZGIj4ocmVjZW50CitjaGFuZ2VzIGluIGJsdWU7PC9mb250Pjxmb250IGNvbG9yPSIjQ0MwMDAwIj4gbGF0ZXN0IGluIHJlZDwvZm9udD48Zm9udCBjb2xvcj0iIzMzMzNGRiI+KTwvZm9udD4KKzxwPldvcmsgaXRlbTogIlN1cHBvcnQgZm9yIGRlYWxpbmcgd2l0aCBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQgYnkgZXh0ZXJuYWwKK0phdmEgY29tcGlsZXJzIGxpa2UgamF2YWMgYW5kIGppa2VzIGZyb20gYW4gQW50IHNjcmlwdC4iCis8cD5IZXJlJ3MgdGhlIGNydXggb2Ygb25lIHByb2JsZW0gKGZyb20gV1NBRCwgdmlhIEpvaG4gVy4pOgorPHA+SW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIGNsaWVudCBoYXMgbGltaXRlZCBmbGV4aWJpbGl0eSBpbiBob3cgdGhleQorc3RydWN0dXJlIHRoZWlyIEphdmEgcHJvamVjdHMuIFNvdXJjZXMgbXVzdCBnbyBoZXJlOyByZXNvdXJjZSBmaWxlcyBoZXJlOworbWl4ZWQgcmVzb3VyY2UgYW5kIGNsYXNzIGZpbGVzIGhlcmU7IGV0Yy4KKzx1bD4KKzxsaT4KK1RoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZSBjbGllbnQgbmVlZHMgdG8gcGxhY2UgYWRkaXRpb25hbCBjbGFzcyBmaWxlcworYW5kIHJlc291cmNlIGZpbGVzIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LjwvbGk+CisKKzxsaT4KK1RoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZSBjbGllbnQgbmVlZHMgdG8gZ2VuZXJhdGUgY2xhc3MgZmlsZXMgaW50bworYW4gZXhpc3RpbmcgZm9sZGVyIGZpbGxlZCB3aXRoIHRoZWlyIGNsYXNzIGZpbGVzIGFuZCByZXNvdXJjZSBmaWxlcyAoZS5nLiwKK2FuIGV4cGxvZGVkIFdBUiBmaWxlKS48L2xpPgorPC91bD4KK1doZW4gY2xpZW50cyBhdHRlbXB0cyBlaXRoZXIsIHRoZXkgZGlzY292ZXIgdGhhdCAoYSkgdGhlIEphdmEgbW9kZWwgYW5kCitidWlsZGVyIGlnbm9yZSBhbnkgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIGFuZCAoYikgZnJvbSB0aW1lCit0byB0aW1lIHRoZXNlIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGdldCBkZWxldGVkIHdpdGhvdXQgd2FybmluZy4KKzxwPlRoZSBKYXZhIGJ1aWxkZXIgd2FzIGRlc2lnbmVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgIm93bnMiIHRoZQorb3V0cHV0IGZvbGRlci4gVGhlIHdvcmsgaXRlbSwgdGhlcmVmb3JlLCBpcyB0byBjaGFuZ2UgdGhlIEphdmEgYnVpbGRlcgordG8gZ2l2ZSBjbGllbnRzIGFuZCB1c2VycyBtb3JlIGZsZXhpYmxpbGl0eSBhcyB0byB3aGVyZSB0aGV5IHBsYWNlIHRoZWlyCitzb3VyY2UsIHJlc291cmNlLCBsaWJyYXJ5IGNsYXNzLCBhbmQgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzLgorPGgzPgorQ3VycmVudCBGdW5jdGlvbmFsaXR5PC9oMz4KK0VjbGlwc2UgMS4wIEphdmEgYnVpbGRlciBoYXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3MgKGFuZCBpbmNvbnNpc3RlbmNpZXMpOgorPHVsPgorPGxpPgorVGhlIGNsYXNzIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgSmF2YSBidWlsZGVyIGdvIGluIGEgc2luZ2xlIG91dHB1dCBmb2xkZXIuCitKYXZhIHNvdXJjZSBmaWxlcyBnbyBpbiBvbmUgb3IgbW9yZSBzb3VyY2UgZm9sZGVycy4gQW55IG90aGVyIGtpbmQgb2YgZmlsZXMKK2NhbiBiZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZvbGRlciB0b287IHRoaXMgaW5jbHVkZXMgcHJlLWNvbXBpbGVkIGNsYXNzCitmaWxlcy4gQWxsIHRoZXNlIG90aGVyIGZpbGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBtaXJyb3JlZCB0byB0aGUgYmluYXJ5CitvdXRwdXQgZGlyZWN0b3J5IHdoZW4gYSBidWlsZCBpcyBkb25lLiBUaGUgbWlycm9yIGlzIG1haW50YWluZWQgYXMgdGhlCitzb3VyY2UgZm9sZGVyIGNoYW5nZXM7IGRhbWFnZSBtYWRlIGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQgZm9sZGVyIGdldHMgcmVwYWlyZWQKK25vIGxhdGVyIHRoYW4gdGhlIG5leHQgZnVsbCBidWlsZC48L2xpPgorCis8bGk+CitUaGUgb3V0cHV0IGZvbGRlciBiZWxvbmdzIHRvIHRoZSBKYXZhIGJ1aWxkZXIuIEl0IHN1bW1hcmlseSBkZWxldGVzIGZpbGVzCitmcm9tIHRoZSBvdXRwdXQgZm9sZGVyIHRoYXQgaXQgZG9lcyBub3QgdGhpbmsgYmVsb25nIHRoZXJlLiBJdCBpcyBub3QgcG9zc2libGUKK3RvIGdldCBhd2F5IHdpdGggYWRkaW5nIGZpbGVzIGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQgZm9sZGVyLiBTbyB5b3UgY2Fubm90CitldmVuIG1hdGUgdGhlIGV4dHJhIHJlc291cmNlIGZpbGVzIHdpdGggdGhlIGNsYXNzIGZpbGVzIG1hbnVhbGx5LjwvbGk+CisKKzxsaT4KK1doZW4gdGhlIHByb2plY3Qgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVyIGNvaW5jaWRlIChwZXJoYXBzIGF0IHRoZSBwcm9qZWN0CitpdHNlbGYpLCB0aGUgYnVpbGRlciBiZWhhdmVzIGRpZmZlcmVudGx5LiBJdCBncmFudHMgdGhhdCBzb3VyY2UgZmlsZXMgYmVsb25nCit0aGVyZSwgc28gaXQgbmV2ZXIgZGVsZXRlcyB0aGVtLiBJdCBhbHNvIGdyYW50cyB0aGF0IG5vbi1jbGFzcyBmaWxlcyBiZWxvbmcKK3RoZXJlLCBzbyBpdCBuZXZlciBkZWxldGVzIHRoZW0gZWl0aGVyLiBCdXQgaXQgYXNzdW1lcyB0aGF0IGFsbCBjbGFzcyBmaWxlcworYXJlIGdlbmVyYXRlZCwgYW5kIHNvIGl0IHN1bW1hcmlseSBkZWxldGVzIHRoZW0gb24gZXZlcnkgZnVsbCBidWlsZCwgaW5jbHVkaW5nCitjbGFzcyBmaWxlcyB0aGF0IHdlcmUgZXhwbGljaXRseSBwdXQgdGhlcmUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCit3YXkgdGhpbmdzIHdvcmsgb3V0IHdoZW4gdGhlIG91dHB1dCBmb2xkZXIgYW5kIHRoZSBzb3VyY2UgZm9sZGVyIGRvIG5vdAorY29pbmNpZGUuIEFuZCBpdCBpcyBub3Qgd2hhdCB5b3Ugd2FudCBpZiB5b3UgbmVlZCB0byBtYXRlIG90aGVyIGNsYXNzIGZpbGVzCit3aXRoIHRoZSBnZW5lcmF0ZWQgb25lcy48L2xpPgorPC91bD4KKworPGgzPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPldTQUQgdXNlY2FzZSAtIGZvciB0aGUgcmVjb3JkPC9mb250PjwvaDM+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIDwvZm9udD48Zm9udCBjb2xvcj0iI0NDMDAwMCI+KHByb3Bvc2VkKTwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+CitXU0FEIHNjZW5hcmlvIGlzIHRoYXQgdGhleSBoYXZlIGEgc3JjLyBmb2xkZXIgZm9yIHNvdXJjZSBjb2RlLCBhIGNsYXNzZXMvCitmb2xkZXIgZm9yIHByZS1leGlzdGluZyBjbGFzcyBmaWxlcyAoZXh0cmFjdGVkIGZyb20gYSBXQVIgZmlsZSksIGFuZCBhCitiaW4vIGZvbGRlciBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMuPC9mb250PgorPHVsPgorPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPlRoZSB0eXBpY2FsIGNhc2UgaXMgd2hlcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMKK2FyZSBkaXN0aW5jdC4gSW4gdGhpcyBjYXNlLCB0aGUgY2xhc3Nlcy8gZm9sZGVyIG1heSBvciBtYXkgY29udGFpbiBjbGFzcworZmlsZXMuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgc291cmNlIGNvZGUgbXVzdCBiZSBjb21waWxlZCBhZ2FpbnN0IHRoZSBjbGFzc2VzCitpbiBjbGFzc2VzLyBmb2xkZXIuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyBtYXkgY29pbmNpZGUuIFRoZSBjbGFzc2VzLworZm9sZGVyIGlzIGFsd2F5cyBzZXBhcmF0ZSBmcm9tIGVpdGhlci48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPkluIG9yZGVyIHRvIGJlIGV4ZWN1dGFibGUsIGFsbCBjbGFzcyBmaWxlcyBtdXN0IGVuZAordXAgaW4gdGhlIG91dHB1dCBmb2xkZXIuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgY2xpZW50IHdvdWxkIGxpa2UgYSB3YXkgdG8gZGVsZXRlIGNsYXNzIGZpbGVzCitmcm9tIHRoZSBjbGFzc2VzLyBmb2xkZXIgZm9yIHdoaWNoIHRoZXJlIGlzIGNvcnJlc3BvbmRpbmcgc291cmNlLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGtlZXAgcmVzb3VyY2UgZmlsZXMgaW4gdGhlCitvdXRwdXQgZm9sZGVyIG9uIGFuIG9uZ29pbmcgYmFzaXMuPC9mb250PjwvbGk+Cis8L3VsPgorCis8aDM+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJvcG9zYWw8L2ZvbnQ+PC9oMz4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgSmF2YSBidWlsZGVyIGNvbXBpbGVzIHNvdXJjZSBmaWxlcyBmb3VuZCBpbiB0aGUKK3NvdXJjZSBmb2xkZXJzIHNwZWNpZmllZCBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIGFuZCBnZW5lcmF0ZXMgY2xhc3MgZmlsZXMKK2ludG8gdGhlIG91dHB1dCBmb2xkZXIuIFRoZSBKYXZhIGJ1aWxkZXIgYWxzbyBjb3BpZXMgInJlc291cmNlIiBmaWxlcyBmcm9tCitzb3VyY2UgZm9sZGVycyB0byB0aGUgb3V0cHV0IGZvbGRlciAocHJvdmlkZWQgdGhhdCBzb3VyY2UgYW5kIG91dHB1dCBkbworbm90IGNvaW5jaWRlKS4gT25jZSBpbiB0aGUgb3V0cHV0IGZvbGRlciwgdGhlIHJlc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUKK2F0IHJ1bnRpbWUgYmVjYXVzZSB0aGUgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgcnVudGltZSBjbGFzcworcGF0aC4gVGhlIHByb3Bvc2FsIGlzIHRvIGV4dGVuZCB0aGlzIG1lY2hhbmlzbS48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgZm9sbG93aW5nIHByb3Bvc2FsIGludm9sdmVzOjwvZm9udD4KKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5DbGFyaWZ5aW5nIG93bmVyc2hpcCBvZiBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiNGRjAwMDAiPkNsYXJpZnlpbmcgc2VtYW50aWNzIG9mIHJlc291cmNlIGZpbGUgY29weWluZyBmcm9tCitzb3VyY2UgZm9sZGVycyB0byBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+TWFraW5nIHJlc291cmNlIGZpbGUgY29weWluZyBmcm9tIHNvdXJjZSBmb2xkZXJzCit0byBvdXRwdXQgZm9sZGVyIG9wdGlvbmFsLCByYXRoZXIgdGhhbiBtYW5kYXRvcnkuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5Qcm92aWRpbmcgY2xhc3MgZmlsZSBjb3B5aW5nIGZyb20gbGlicmFyeSBmb2xkZXJzCit0byBvdXRwdXQgZm9sZGVyLCBhbHNvIG9uIGFuIG9wdGlvbmFsIGJhc2lzLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UHJvdmlkaW5nIGFuZCBwcm9tb3RpbmcgdXNlZnVsIGFsdGVybmF0aXZlcyB0byBmaWxlCitjb3B5aW5nLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UHJvaGliaXRpbmcgY2FzZXMgd2hlcmUgZXhwZW5kYWJsZSBjb3BpZXMgd291bGQgZW5kCit1cCBtaXhlZCB3aXRoIGltcG9ydGFudCB1c2VyIGRhdGEuPC9mb250PjwvbGk+Cis8L3VsPgorCis8aDQ+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+T3V0cHV0IGZvbGRlciBvd25lcnNoaXA8L2ZvbnQ+PC9oND4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5XaGVuIHRoZSBvdXRwdXQgZm9sZGVyIGRvZXMgbm90IGNvaW5jaWRlIHdpdGggYSBzb3VyY2UKK2ZvbGRlciwgdGhlIEphdmEgYnVpbGRlciBvd25zIHRoZSBvdXRwdXQgZm9sZGVyIGFuZCBldmVyeXRoaW5nIGluIGl0LiBUaGUKK291dHB1dCBmb2xkZXIgaXMgdGFrZW4gdG8gY29udGFpbiBvbmx5IGZpbGVzIHRoYXQgYXJlICJleHBlbmRhYmxlIiAtIGVpdGhlcgorZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIG9yIGNvcGllcyBvZiBmaWxlcyB0aGF0IGxpdmUgaW4gYSBzb3VyY2Ugb3IgbGlicmFyeQorZm9sZGVyLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPlVzZXJzIG9yIGNsaWVudHMgdGhhdCBhZGQsIHJlbW92ZSwgb3IgcmVwbGFjZQorZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgY2FuIGV4cGVjdCB1bnByZWRpY2F0YWJsZSByZXN1bHRzLiBJZiB0aGUgdXNlcgorb3IgY2xpZW50IGRvZXMgdGFtcGVyIHdpdGggZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIKK2RvZXMgbm90IGF0dGVtcHQgdG8gcmVwYWlyIHRoZSBkYW1hZ2UuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKK3VzZXIgb3IgY2xpZW50IHRvIGNsZWFuIHVwIHRoZWlyIG1lc3MgKGJ5IG1hbnVhbGx5IHJlcXVlc3RpbmcgYSBmdWxsIGJ1aWxkKS48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5XaGVuIHRoZSBvdXRwdXQgZm9sZGVyIGNvaW5jaWRlcyB3aXRoIGEgc291cmNlCitmb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIgb25seSBvd25zIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci4KK09ubHkgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGV4cGVuZGFibGUuIFVzZXJzCitvciBjbGllbnRzIHRoYXQgYWRkLCByZW1vdmUsIG9yIHJlcGxhY2UgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIKK2NhbiBleHBlY3QgdW5wcmVkaWN0YWJsZSByZXN1bHRzLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPihOLkIuIFRoaXMgaXMgYSByZXN0YXRlbWVudCBvZiB0aGUgY3VycmVudCBiZWhhdmlvci4KK1tWZXJpZnkgdGhhdCBkYW1hZ2UgdG8gb3V0cHV0IGZvbGRlciBpcyBub3QgdHJpZ2dlcmluZyBidWlsZHMuXSk8L2ZvbnQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+T3V0cHV0IGZvbGRlciByZXNvdXJjZSBmaWxlIGNvbnNvbGlkYXRpb248L2ZvbnQ+PC9oND4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGUgSmF2YSBidWlsZGVyIHByb3ZpZGVzIHJlc291cmNlIGZpbGUgY29uc29saWRhdGlvbiwKK2ZvciByZXNvdXJjZSBmaWxlcyBzdG9yZWQgaW4gc291cmNlIGZvbGRlcnMuPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+V2hlbiB0aGUgb3V0cHV0IGZvbGRlciBkb2VzIG5vdCBjb2luY2lkZSB3aXRoCithIHNvdXJjZSBmb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIgY2FuIGFsc28gYmUgdXNlZCB0byBjb25zb2xpZGF0ZSByZXNvdXJjZXMKK2ZpbGVzIG5lZWRlZCBhdCBydW50aW1lIGluIHRoZSBvdXRwdXQgZm9sZGVyLiBJbiBzb21lIGNhc2VzLCB0aGlzIGNvbnNvbGlkYXRpb24KK21heSBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgYWx0ZXJuYXRpdmUgb2YgaW5jbHVkaW5nIGFkZGl0aW9uYWwgcnVudGltZSBjbGFzc3BhdGgKK2VudHJpZXMgZm9yIHNvdXJjZSBmb2xkZXJzIGNvbnRhaW5pbmcgcmVzb3VyY2VzIGZpbGVzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IGZsYWdnaW5nIGEgc291cmNlIGZvbGRlciBhcyBjb3BpZWQsIGFsbCBub24tc291cmNlLAorbm9uLWNsYXNzIGZpbGVzIGJlY29tZSBlbGlnaWJsZSB0byBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuIFdoZW4KK3RoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggc3BlY2lmeWluZyBjb3B5aW5nLCBlbGlnaWJsZQorZmlsZXMgZm9yIGVhcmxpZXIgY2xhc3NwYXRoIGVudHJpZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgb25lcyBmb3IgbGF0ZXIKK2VudHJpZXMuPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+V2hlbiB0aGUgb3V0cHV0IGZvbGRlciBjb2luY2lkZXMgd2l0aCBhIHNvdXJjZQorZm9sZGVyLCB0aGUgSmF2YSBidWlsZGVyIGNhbm5vdCBwZXJmb3JtIGFueSByZXNvdXJjZSBmaWxlIGNvbnNvbGlkYXRpb24KKyhyZXNvdXJjZSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBiZWxvbmcgdG8gdGhlIHVzZXIsIG5vdCB0byB0aGUgSmF2YQorYnVpbGRlcikuIEl0IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgdG8gc3BlY2lmeSBjb3B5aW5nIGZyb20gb3RoZXIgc291cmNlCitmb2xkZXJzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPihOLkIuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gY3VycmVudCBiZWhhdmlvcgoraW4gYSBjb3VwbGUgb2YgcmVnYXJkczo8L2ZvbnQ+Cis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UmVzb3VyY2UgZmlsZSBjb3B5aW5nIGZvciBzb3VyY2UgZm9sZGVycyBpcyBjdXJyZW50bHkKK21hbmRhdG9yeS4gSXQgd291bGQgYmVjb21lIG9wdGlvbmFsLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q2xhc3MgZmlsZXMgYXJlIGN1cnJlbnRseSBjb3BpZWQgZnJvbSBzb3VyY2UgZm9sZGVycy4KK1RoaXMgd291bGQgc3RvcC48L2ZvbnQ+PC9saT4KKzwvdWw+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+KTwvZm9udD4KKzxoND4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5PdXRwdXQgZm9sZGVyIGNsYXNzIGZpbGUgY29uc29saWRhdGlvbjwvZm9udD48L2g0PgorPGZvbnQgY29sb3I9IiNGRjAwMDAiPlRoZSBKYXZhIGJ1aWxkZXIgYWxzbyBwcm92aWRlcyBjbGFzcyBmaWxlIGNvbnNvbGlkYXRpb24sCitmb3IgY2xhc3MgZmlsZXMgc3RvcmVkIGluIGxpYnJhcnkgZm9sZGVycy48L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGUgSmF2YSBidWlsZGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29uc29saWRhdGUKK2NsYXNzIGluIHRoZSBvdXRwdXQgZm9sZGVyLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG91dHB1dCBmb2xkZXIgY29pbmNpZGVzCit3aXRoIGEgc291cmNlIGZvbGRlci4gSW4gc29tZSBjYXNlcywgdGhpcyBjb25zb2xpZGF0aW9uIG1heSBiZSBwcmVmZXJyZWQKK292ZXIgdGhlIGFsdGVybmF0aXZlIG9mIGluY2x1ZGluZyBhZGRpdGlvbmFsIHJ1bnRpbWUgY2xhc3NwYXRoIGVudHJpZXMKK2ZvciBsaWJyYXJ5IGZvbGRlcnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyB3b3JrcyBvbmx5IHdoZW4gdGhlIGxpYnJhcnkKK2ZvbGRlciBjb250YWlucyBubyBpbXBvcnRhbnQgcmVzb3VyY2UgZmlsZXMgbmVlZGVkIGF0IHJ1bnRpbWUgKHJlc291cmNlCitmaWxlcyBhcmUgbm90IGNvcGllZCBmcm9tIGxpYnJhcnkgZm9sZGVycywgYmVjYXVzZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUKK291dHB1dCBmb2xkZXIgYmVsb25nIHRvIHRoZSB1c2VyIHJhdGhlciB0aGFuIHRvIHRoZSBKYXZhIGJ1aWxkZXIpLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IGZsYWdnaW5nIGEgbGlicmFyeSBmb2xkZXIgYXMgY29waWVkLCBhbGwgY2xhc3MKK2ZpbGVzIGJlY29tZSBlbGlnaWJsZSB0byBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuCitDbGFzcyBmaWxlcyBnZW5lcmF0ZWQKK2luIHRoZSBvdXRwdXQgZm9sZGVyIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjbGFzcyBmaWxlcyBjb3BpZWQgZnJvbQorbGlicmFyeSBmb2xkZXJzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPihOLkIuIFRoaXMgbmV3IGJlaGF2aW9yLiBGaWxlcyBhcmUgbm90IGNvcGllZAorZnJvbSBsaWJyYXJ5IGZvbGRlcnMgYnkgdGhlIGN1cnJlbnQgSmF2YSBidWlsZGVyLik8L2ZvbnQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+U2VtYW50aWNzPC9mb250PjwvaDQ+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5BZGQgYSAiY29weSIgZmxhZyB0byBzb3VyY2UgYW5kIGxpYnJhcnkgKGFuZCB2YXJpYWJsZSkKK2NsYXNzcGF0aCBlbnRyaWVzLjwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+Rm9yIGEgc291cmNlIGZvbGRlciwgY29weSBmbGFnIG1lYW5zIHRoYXQgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5yZXNvdXJjZQorKGkuZSwgbm9uLXNvdXJjZSwgbm9uLWNsYXNzKSBmaWxlcyA8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPmluIHRoZQorc291cmNlIGZvbGRlciBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJpbWFyeSB1c2UgaXMgdG8gY29uc29saWRhdGUgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5yZXNvdXJjZQorZmlsZXM8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPiBpbiBvdXRwdXQgZm9sZGVyIHNvIHRoYXQgc291cmNlIGZvbGRlcgorZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBvbiBydW50aW1lIGNsYXNzcGF0aC48L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSBsaWJyYXJ5IGZvbGRlciAoYnV0IG5vdCBhIGxpYnJhcnkgSkFSKSwgY29weQorZmxhZyBtZWFucyB0aGF0IDwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+YWxsIGNsYXNzIGZpbGVzPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj4KK2luIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJpbWFyeSB1c2UgaXMgdG8gY29uc29saWRhdGUgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5jbGFzcworZmlsZXM8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPiBpbiBvdXRwdXQgZm9sZGVyIHNvIHRoYXQgbGlicmFyeSBmb2xkZXIKK2RvZXMgbm90IG5lZWQgdG8gYmUgaW5jbHVkZWQgb24gcnVudGltZSBjbGFzc3BhdGguPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5OLkIuIFJlc291cmNlIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgbm90Citjb3BpZWQuPC9mb250PjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGNvcHkgZmxhZyBzaG91bGQgYmUgb2ZmIGJ5IGRlZmF1bHQgZm9yIGJvdGggdHlwZXMKK29mIGZvbGRlcjsgaS5lLiwgbm8gZmlsZSBjb3B5aW5nLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+U291cmNlIGZvbGRlciBjb3B5IGZsYWcgb24gZGVzY3JpYmVzIGN1cnJlbnQgYmVoYXZpb3IuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgZXhpc3RpbmcgcHJvamVjdHMgc2hvdWxkCitoYXZlIGNvcHlpbmcgb24gZm9yIHNvdXJjZSBmb2xkZXJzIHRoYXQgbWlnaHQgY29udGFpbiByZXNvdXJjZSBmaWxlcy48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiNGRjAwMDAiPkxpYnJhcnkgZm9sZGVyIGNvcHkgZmxhZyBvZmYgZGVzY3JpYmVzIGN1cnJlbnQgYmVoYXZpb3IuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5FcnJvciBpZiBhbnkgc291cmNlIGZvbGRlciBjb3B5aW5nIHNwZWNpZmllZCB3aGVuCithIHNvdXJjZSBmb2xkZXIgYW5kIG91dHB1dCBmb2xkZXIgY29pbmNpZGUuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5BUEkgb24gSmF2YUNvcmUgZm9yIGNyZWF0aW5nIGNsYXNzcGF0aCBlbnRyaWVzIHdpdGgKK2NvcHkgYml0IHNldC48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPkFQSSBvbiBJQ2xhc3NwYXRoRW50cnkgZm9yIHJlYWRpbmcgY29weSBiaXQuPC9mb250PjwvbGk+Cis8L3VsPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+R2VuZXJhdGVkIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIHRha2UgcHJlY2VkZW5jZQorb3ZlciBjbGFzcyBmaWxlcyBjb3BpZWQgZnJvbSBsaWJyYXJ5IGZvbGRlcnMuPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5GaWxlcyBjb3BpZWQgZnJvbSBlYXJsaWVyIGNsYXNzcGF0aCBlbnRyaWVzIHRha2UKK3ByZWNlZGVuY2Ugb3ZlciBvbmVzIGZvciBsYXRlciBlbnRyaWVzLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+VUkgcHJvdmlkZXMgdGhlIHVzZXIgd2l0aCBjb250cm9sIG92ZXIgcmVzb3VyY2UgZmlsZQorY29uc29saWRhdGlvbi48L2ZvbnQ+PC9saT4KKworPHVsPgorPGxpPgorPGZvbnQgY29sb3I9IiNGRjAwMDAiPkZvciBzb3VyY2UgZm9sZGVyOiAiQ29weSByZXNvdXJjZSAobm9uLXNvdXJjZSwgbm9uLWNsYXNzKQorZmlsZXMgdG8gb3V0cHV0IGZvbGRlciI8L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5VSSBkb2VzIG5vdCBwcm92aWRlIHRoZSB1c2VyIHdpdGggY29udHJvbCBvdmVyIGNsYXNzCitmaWxlIGNvbnNvbGlkYXRpb24uPC9mb250PjwvbGk+CisKKzx1bD4KKzxsaT4KKzxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGlzIGZlYXR1cmUgd291bGQgYmUgZW5hYmxlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5CitjbGllbnRzIHRoYXQgbmVlZCBpdC48L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Db25zb2xpZGF0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgYnVpbHQgaW4gdG8gSmF2YSBidWlsZGVyLjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJvOiBQdXRzIHVzIGluIGEgcG9zaXRpb24gd2hlcmUgcmVzb3VyY2UgY29weWluZworaXMgbm8gbG9uZ2VyIG1hbmRhdG9yeS48L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPlBybzogR2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW1wcm92ZSByZXNvdXJjZQorY29weWluZyBpbXBsZW1lbnRhdGlvbi48L2ZvbnQ+PC9saT4KKzwvdWw+Cis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+U3VtbWFyeTogUmVzb3VyY2UgZmlsZXMgKG5vbi1zb3VyY2UsIG5vbi1jbGFzcykgbWF5CitiZSBjb3BpZWQgZnJvbSBlaXRoZXIgc291cmNlIGZvbGRlcnMuIENsYXNzIGZpbGVzIG1heSBiZSBjb3BpZWQgZnJvbSBsaWJyYXJ5Citmb2xkZXJzLCBidXQgbmV2ZXIgb3ZlcnJpZGUgZ2VuZXJhdGVkIGZpbGVzLiBTb3VyY2UgZmlsZXMgbmV2ZXIgZ2V0IGNvcGllZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5PdXRwdXQgZm9sZGVyIGludmFyaWFudDo8L2ZvbnQ+Cis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+Rm9yIGEgY2xhc3MgZmlsZSBYLmNsYXNzIGluIHRoZSBvdXRwdXQgZm9sZGVyIE88L2ZvbnQ+PC9saT4KKworPHVsPgorPGxpPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPmlmIGV4aXN0cyBhIFkuamF2YSBpbiBhIHNvdXJjZSBmb2xkZXIgdGhhdCBjb21waWxlcwordG8gWC5jbGFzcyB0aGVuIHRoZSBYLmNsYXNzIGluIE8gaXMgdGhlIG9uZSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcKK1kuamF2YTwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgZXhpc3RzIGFuIFguY2xhc3MgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5pbgorc29tZSBsaWJyYXJ5IGZvbGRlciB3aXRoIGNvcHlpbmcgb24gPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj50aGVuIGEKK2NvcHkgb2YgdGhlIFguY2xhc3MgZnJvbSB0aGUgZWFybGllc3Qgc3VjaCA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmxpYnJhcnkKK2ZvbGRlcjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3RoZXJ3aXNlIG5vIFguY2xhc3Mgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPnJlc291cmNlIChpLmUuLAorbm9uLXNvdXJjZSwgbm9uLWNsYXNzKSA8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPmZpbGUgWC5vdGhlciBpbiB0aGUKK291dHB1dCBmb2xkZXIgTzwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgTyBpcyBhbHNvIGEgc291cmNlIGZvbGRlciB0aGVuIGFueSBYLm90aGVyIHRoYXQKK2xpdmVzIHRoZXJlPC9mb250PjwvbGk+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5pZiBleGlzdHMgYW4gWC5vdGhlciA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmluCitzb21lIHNvdXJjZSBmb2xkZXIgd2l0aCBjb3B5aW5nIG9uPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj4gdGhlbiBhCitjb3B5IG9mIHRoZSBYLm90aGVyIGZyb20gdGhlIGVhcmxpZXN0IHN1Y2ggPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5zb3VyY2UKK2ZvbGRlcjwvZm9udD48L2xpPgorCis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3RoZXJ3aXNlIG5vIFgub3RoZXIgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KKzwvdWw+CisKKzxsaT4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSBzb3VyY2UgZmlsZSBYLmphdmEgaW4gdGhlIG91dHB1dCBmb2xkZXIgTzwvZm9udD48L2xpPgorCis8dWw+Cis8bGk+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgTyBpcyBhbHNvIGEgc291cmNlIGZvbGRlciB0aGVuIGFueSBYLmphdmEgdGhhdAorbGl2ZXMgdGhlcmU8L2ZvbnQ+PC9saT4KKworPGxpPgorPGZvbnQgY29sb3I9IiNGRjAwMDAiPm90aGVyd2lzZSBubyBYLmphdmEgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KKzwvdWw+Cis8L3VsPgorPGZvbnQgY29sb3I9IiMzMzY2RkYiPkEgZnVsbCBidWlsZHMgbXVzdCBhY2hpZXZlIHRoZSBvdXRwdXQgZm9sZGVyIGludmFyaWFudAorZnJvbSA8aT5hcmJpdHJhcnk8L2k+IGluaXRpYWwgY29uZGl0aW9ucy4gV2hlbiBvdXRwdXQgYW5kIHNvdXJjZSBmb2xkZXJzCitkbyBub3QgY29pbmNpZGUsIGEgZnVsbCBidWlsZCBzaG91bGQgc2NydWIgYWxsIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlCitvdXRwdXQgZm9sZGVyLCByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGdvdCB0aGVyZS4gV2hlbiBvdXRwdXQgYW5kIHNvdXJjZQorZm9sZGVycyBkbyBjb2luY2lkZSwgYSBmdWxsIGJ1aWxkIHNob3VsZCBzY3J1YiBhbGwgZXhpc3RpbmcgY2xhc3MgZmlsZXMKK2Zyb20gdGhlIG91dHB1dCBmb2xkZXIsIGJ1dCBsZWF2ZSBhbGwgb3RoZXIgZmlsZXMgYWxvbmUuPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+QXNzdW1pbmcgdGhhdCBhIHVzZXIgb3IgY2xpZW50IGlzIG9ubHkgYWRkaW5nLAorcmVtb3ZpbmcsIG9yIGNoYW5naW5nIGZpbGVzIGluIHNvdXJjZSBvciBsaWJyYXJ5IGZvbGRlcnMsIGJ1dCBub3QgdGFtcGVyaW5nCit3aXRoIGFueSBvZiB0aGUgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgdGhhdCB0aGUgSmF2YSBidWlsZGVyIG93bnMsCit0aGVuIGFuIGluY3JlbWVudGFsIGJ1aWxkIHNob3VsZCByZS1hY2hpZXZlIHRoZSBvdXRwdXQgZm9sZGVyIGludmFyaWFudC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5BbGdvcml0aG06PC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+RnVsbCBidWlsZDo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBTY3J1YiBhbGwgY2xhc3MgZmlsZXMgZnJvbQordGhlIG91dHB1dCBmb2xkZXIuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgaWYgcGVyZm9ybWluZyByZXNvdXJjZSBjb25zb2xpZGF0aW9uCisocmVxdWlyZXMgb3V0cHV0IGZvbGRlciAhPSBzb3VyY2UgZm9sZGVyKTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNjcnViCithbGwgcmVzb3VyY2UgZmlsZXMgZnJvbSB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBDb21waWxlIGFsbCBzb3VyY2UgZmlsZXMgaW50bworY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkgZWxpZ2libGUgY2xhc3MKK2ZpbGVzIGZyb20gbGlicmFyeSBmb2xkZXJzIGludG8gdGhlIG91dHB1dCBmb2xkZXIgKG5vIG92ZXJ3cml0aW5nKS48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBpZiBwZXJmb3JtaW5nIHJlc291cmNlIGNvbnNvbGlkYXRpb24KKyhyZXF1aXJlcyBvdXRwdXQgZm9sZGVyICE9IHNvdXJjZSBmb2xkZXIpPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkKK2VsaWdpYmxlIHJlc291cmNlIGZpbGVzIGZyb20gc291cmNlIGZvbGRlcnMgaW50byB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5JbmNyZW1lbnRhbCBidWlsZDo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgMSkgcHJvY2VzcyBjaGFuZ2VzCit0byBsaWJyYXJ5IGZvbGRlcnM6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZm9yCithZGQgb3IgcmVtb3ZlIG9yIGNoYW5nZSBmaWxlIHAveC5jbGFzcyBpbiBvbmUgb2YgdGhlIGxpYnJhcnkgZm9sZGVyczwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitpZiBwL3guY2xhc3MgaW4gdGhlIG91dHB1dCBmb2xkZXIgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgY29tcGlsZXIgdGhlbjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitzY3J1YiBwL3guY2xhc3MgZnJvbSB0aGUgb3V0cHV0IGZvbGRlcjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CityZW1lbWJlciB0byBjb21waWxlIHNvdXJjZSBmaWxlcyB0aGF0IGRlcGVuZCBvbiBwL3g8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcmVtZW1iZXIgdG8gaW5maWxsIHAveC5jbGFzczwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChwaGFzZSAyKSBwcm9jZXNzIGNoYW5nZXMKK3RvIHNvdXJjZSBmb2xkZXJzOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgorYWRkIHAveS5qYXZhIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworcmVtZW1iZXIgdG8gY29tcGlsZSBzb3VyY2UgZmlsZSBhdCBwYXRoIHAveS5qYXZhPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZm9yCityZW1vdmUgb3IgY2hhbmdlIHAveS5qYXZhIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworc2NydWIgYW55IGNsYXNzIGZpbGUgcC94LmNsYXNzIGZyb20gdGhlIG91dHB1dCBmb2xkZXIgdGhhdCBzb21lIHAveS5qYXZhCitjb21waWxlZCBpbnRvIGxhc3QgdGltZTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CityZW1lbWJlciB0byBpbmZpbGwgcC94LmNsYXNzPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3JlbWVtYmVyIHRvIGNvbXBpbGUgc291cmNlIGZpbGUgYXQgcGF0aCBwL3kuamF2YTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgorYWRkIG9yIHJlbW92ZSBvciBjaGFuZ2UgcmVzb3VyY2UgcC94Lm90aGVyIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworaWYgcGVyZm9ybWluZyByZXNvdXJjZSBjb25zb2xpZGF0aW9uIChyZXF1aXJlcyBvdXRwdXQgZm9sZGVyICE9IHNvdXJjZQorZm9sZGVyKTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitzY3J1YiBwL3gub3RoZXIgZnJvbSB0aGUgb3V0cHV0IGZvbGRlcjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CityZW1lbWJlciB0byBpbmZpbGwgcC94Lm90aGVyPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDMpIHJlY29tcGlsZTo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb21waWxlCithbGwgcmVtZW1iZXJlZCBzb3VyY2UgZmlsZXMgaW50byB0aGUgb3V0cHV0IGZvbGRlciAoYW5kIGFueSBkZXBlbmRlbnQgc291cmNlCitmaWxlcyk8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgNCkgaW5maWxsOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgorZWFjaCBob2xlIHAveC5jbGFzcyB0byBpbmZpbGw8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworY29weSBmaXJzdC1mb3VuZCBmaWxlIHAveC5jbGFzcyBpbiBhIGxpYnJhcnkgZm9sZGVyIHRvIHAveC5jbGFzcyBpbiB0aGUKK291dHB1dCBmb2xkZXIgKG5vIG92ZXJ3cml0aW5nKTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmCitwZXJmb3JtaW5nIHJlc291cmNlIGNvbnNvbGlkYXRpb24gKHJlcXVpcmVzIG91dHB1dCBmb2xkZXIgIT0gc291cmNlIGZvbGRlcik8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworZm9yIGVhY2ggaG9sZSBwL3gub3RoZXIgdG8gaW5maWxsPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK2NvcHkgZmlyc3QtZm91bmQgZmlsZSBwL3gub3RoZXIgaW4gYSBzb3VyY2UgZm9sZGVyIHRvIHAveC5vdGhlciBpbiB0aGUKK291dHB1dCBmb2xkZXI8L2ZvbnQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+SG93IFRoZXNlIENoYW5nZXMgU29sdmUgV1NBRCdzIFByb2JsZW08L2ZvbnQ+PC9oND4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5XU0FEIHdvdWxkIGluY2x1ZGUgdGhlaXIgY2xhc3Nlcy8gZm9sZGVyIG9uIHRoZSBidWlsZAorY2xhc3NwYXRoIGFzIGEgbGlicmFyeSBmb2xkZXIgd2l0aCBjbGFzcyBmaWxlIGNvcHlpbmcgdHVybmVkIG9uLiBEb2luZworc28gbWVhbnMgdGhhdCB0aGUgcHJlLWNvbXBpbGVkIGNsYXNzIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGFyZSBhdmFpbGFibGUKK3RvIGJ1aWxkIGFnYWluc3QsIGFuZCB3aWxsIGJlIHVzZWQgd2hlbmV2ZXIgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBzb3VyY2UKK2NvZGUgaW4gYSBzb3VyY2UgZm9sZGVyLiA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IHR1cm5pbmcgY2xhc3MKK2ZpbGUgY29weWluZyBvbiBmb3IgdGhhdCBsaWJyYXJ5IGZvbGRlciAocHJvZ3JhbWF0aWNhbGx5IC0gdGhlcmUgaXMgbm8KK1VJKSwgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgYXV0b21hdGljYWxseSBjb25zb2xpZGF0ZWQKK3dpdGggdGhlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcy48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5SZXNvdXJjZSBmaWxlcyBjYW4gYWx3YXlzIGJlIGtlcHQgaW4gdGhlIHNhbWUKK2ZvbGRlciBhcyB0aGUgc291cmNlIGZpbGVzLiBXaGVuIHRoZSBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzIGRvIG5vdCBjb2luY2lkZSwKK3RoZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBjbGFzc3BhdGggY291bGQgaGF2ZSBjb3B5aW5nIHR1cm5lZCBvbiB0byBlbnN1cmUKK3RoYXQgcmVzb3VyY2UgZmlsZXMgd2VyZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuIFdoZW4gdGhlIHNvdXJjZSBhbmQKK291dHB1dCBmb2xkZXJzIGRvIGNvaW5jaWRlLCBmdXJ0aGVyIHJlc291cmNlIGZpbGUgY29uc29saWRhdGlvbiBpcyBub3QKK3JlcXVpcmVkIChvciBwb3NzaWJsZSkgYW5kIHRoZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBjbGFzc3BhdGggd291bGQgaGF2ZQorY29weWluZyB0dXJuZWQgb2ZmLiBUaGUgcmVzb3VyY2UgZmlsZXMgdGhhdCBub3JtYWxseSBsaXZlIGluIHRoZSBzb3VyY2UKK2ZvbGRlciB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZm9sZGVyICh3aXRob3V0IGNvcHlpbmcpLjwvZm9udD4KKzxoMz4KKzxmb250IGNvbG9yPSIjMzM2NkZGIj5NaW5pbWl6aW5nIENsYXNzIEZpbGVzPC9mb250PjwvaDM+Cis8Zm9udCBjb2xvcj0iIzMzNjZGRiI+KFRoaXMgcHJvYmxlbSBpcyBub3QgcmVhbGx5IGFuIG91dHB1dCBmb2xkZXIgaXNzdWUuKTwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPldTQUQgaGFzIGEgc3BlY2lhbCBwcm9ibGVtLiBUaGV5IGhhdmUgY2xhc3MgZmlsZXMKK2luIGEgY2xhc3Nlcy8gZm9sZGVyIHdoaWNoIHRoZXkgb2J0YWluIGZyb20gdW56aXBwaW5nIGEgV0FSIGZpbGUuIFRoZXkKK2hhdmUgYSBmb2xkZXIgb2Ygc291cmNlIGNvZGU7IHNvbWUgb2YgdGhlIHNvdXJjZSBjb2RlIG1heSBiZSBicmFuZCBuZXc7Citzb21lIG9mIHRoZSBzb3VyY2UgY29kZSBtYXkgY29ycmVzcG9uZCB0byBjbGFzcyBmaWxlcyBpbiB0aGUgY2xhc3Nlcy8gZm9sZGVyLgorVGhleSBuZWVkIHRvIHBydW5lIGZyb20gdGhlIGNsYXNzZXMvIGRpcmVjdG9yeSB0aG9zZSBjbGFzcyBmaWxlcyBmb3Igd2hpY2gKK2NvcnJlc3BvbmRpbmcgc291cmNlIGlzIGF2YWlsYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBzYXZlIG9ubHkgdGhvc2UKK2NsYXNzIGZpbGVzIHdoaWNoIHRoZXkgYWN0dWFsbHkgbmVlZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgaGVhcnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgaWRlbnRpZnlpbmcgdGhlCitjbGFzcyBmaWxlcyB3aGljaCBjb3VsZCBoYXZlIGNvbWUgZnJvbSBhIGdpdmVuIHNvdXJjZSBmaWxlLiBBIHNvdXJjZSBmaWxlCitjYW4gYmUgbGlnaHRseSBwYXJzZWQgdG8gb2J0YWluIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIHRvcC1sZXZlbAordHlwZXMgZGVjbGFyZWQgd2l0aGluOyBlLmcuLCBhIHNvdXJjZSBmaWxlIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvby5qYXZhCittaWdodCBjb250YWluIHR5cGVzIG5hbWVkIGNvbS5leGFtcGxlLmFjbWUuYXBwLkZvbyBhbmQgY29tLmV4YW1wbGUuYWNtZS5hcHAuRm9vSGVscGVyLgorU3VjaCB0eXBlIG5hbWVzIG1hcCBkaXJlY3RseSB0byBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGUgbmFtZSBwYXR0ZXJuczsKK2UuZy4sIGNvbS5leGFtcGxlLmFjbWUuYXBwLkZvb0hlbHBlciB3b3VsZCBjb21waWxlIHRvIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvb0hlbHBlci5jbGFzcworYW5kIHBvc3NpYmx5IG90aGVyIGNsYXNzIGZpbGVzIG1hdGNoaW5nIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvb0hlbHBlciQqLmNsYXNzLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPlRoaXMgYmFzaWMgb3BlcmF0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZQorZXhpc3RpbmcgSkRPTSBBUEkgKG9yIHRoZSBwcm9wb3NlZCBBU1QgQVBJKTogc2ltcGx5IG9wZW4gdGhlIGNvbXBpbGF0aW9uCit1bml0IGFuZCByZWFkIG9mZiB0aGUgbmFtZXMgZnJvbSB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBhbmQgYW5kIHRvcC1sZXZlbAordHlwZSBkZWNsYXJhdGlvbnMuPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+R2l2ZW4gdGhpcyBiYXNpYyBvcGVyYXRpb24sIGl0IGlzIHN0cmFpZ2h0Zm9yd2FyZAordG8gd2FsayBhbnkgc2V0IG9mIHNvdXJjZSBmaWxlcyBhbmQgdXNlIGl0IHRvIHBydW5lIGEgZ2l2ZW4gc2V0IG9mIGNsYXNzCitmaWxlcy4gU291cmNlIGZpbGVzIGluIHNvbWUgZm9sZGVyIGluIHRoZSB3b3Jrc3BhY2UgY2FuIGJlIG1vbml0b3JlZCB3aXRoCithIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lci4gSXQgaXMgdHJpdmlhbCB0byBkZWxldGUgY29ycmVzcG9uZGluZyBjbGFzcworZmlsZXMgaW5jcmVtZW50YWxseSBhcyBuZXcgc291cmNlIGZpbGVzIGFyZSBhZGRlZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5Db25jbHVzaW9uOiBOZXcgQVBJIGlzIG5vdCByZXF1aXJlZC48L2ZvbnQ+Cis8aDI+CitOb3RlcyBMZWZ0b3ZlciBmcm9tIEVhcmxpZXIgUHJvcG9zYWxzPC9oMj4KK1RoZSBmb2xsb3dpbmcgbm90ZXMgYXJlIHJldGFpbmVkIGFzIGJhY2tncm91bmQgbWF0ZXJpYWwuIFRoZXkgaW5jbHVkZSBzb21lCitvZiB0aGUgb3RoZXIgYXBwcm9hY2hlcyB3ZSB0cmllZCwgYW5kIHByb2JsZW1zIHdlIHJhbiBpbnRvLgorPHA+VGhlIEphdmEgbW9kZWwgaGFzIDIgcHJpbWl0aXZlIGtpbmRzIG9mIGlucHV0czogSmF2YSBzb3VyY2UgZmlsZXMsIGFuZAorSmF2YSBsaWJyYXJ5IGNsYXNzIGZpbGVzLiBUaGUgSmF2YSBidWlsZGVyIHByb2R1Y2VzIG9uZSBwcmltYXJ5IG91dHB1dDoKK2dlbmVyYXRlZCBKYXZhIGNsYXNzIGZpbGVzLiBFYWNoIEphdmEgcHJvamVjdCBoYXMgYSBidWlsZCBjbGFzc3BhdGggbGlzdGluZword2hhdCBraW5kcyBvZiBpbnB1dHMgaXQgaGFzIGFuZCB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZCwgYW5kIGEgZGVzaWduYXRlZAorb3V0cHV0IGZvbGRlciB3aGVyZSBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgYXJlIHRvIGJlIHBsYWNlZC4gVGhlIHJ1bnRpbWUKK2NsYXNzcGF0aCBpcyBjb21wdXRlZCBmcm9tIHRoZSBidWlsZCBjbGFzc3BhdGggYnkgc3Vic3RpdHV0aW5nIHRoZSBvdXRwdXQKK2ZvbGRlciBpbiBwbGFjZSBvZiB0aGUgc291cmNlIGZvbGRlcnMuCis8cD5KYXZhICJyZXNvdXJjZSIgZmlsZXMsIGRlZmluZWQgdG8gYmUgZmlsZXMgb3RoZXIgdGhhbiBKYXZhIHNvdXJjZXMgYW5kCitjbGFzcyBmaWxlcywgYXJlIG9mIG5vIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8gdGhlIEphdmEgbW9kZWwgZm9yIGNvbXBpbGluZworcHVycG9zZXMuIEhvd2V2ZXIsIHRoZXNlIHJlc291cmNlIGZpbGVzIGFyZSB2ZXJ5IGltcG9ydGFudCB0byB0aGUgdXNlciwKK2FuZCB0byB0aGUgcHJvZ3JhbSB3aGVuIGl0IHJ1bnMuIFJlc291cmNlIGZpbGVzIGFyZSByb3V0aW5lbHkgY28tbG9jYXRlZAord2l0aCBsaWJyYXJ5IGNsYXNzIGZpbGVzLiBCdXQgaXQgaXMgYWxzbyBjb252ZW5pZW50IGZvciB0aGUgdXNlciBpZiByZXNvdXJjZQorZmlsZXMgY2FuIGJlIGVpdGhlciBjby1sb2NhdGVkIHdpdGggc291cmNlIGNvZGUsIG9yIHNlZ3JlZ2F0ZWQgaW4gYSBzZXBhcmF0ZQorZm9sZGVyLgorPHA+SWRlYWxseSwgdGhlIEphdmEgbW9kZWwgc2hvdWxkIG5vdCBpbnRyb2R1Y2UgY29uc3RyYWludHMgb24gd2hlcmUgaW5wdXRzCithbmQgb3V0cHV0cyBhcmUgbG9jYXRlZC4gVGhpcyB3b3VsZCBnaXZlIGNsaWVudHMgYW5kIHVzZXJzIG1heGltdW0gZmxleGliaWxpdHkKK3dpdGggd2hlcmUgdGhleSBsb2NhdGUgdGhlaXIgZmlsZXMuCis8cD5UaGUgcHJvcG9zYWwgaGVyZSBoYXMgNCBzZXBhcmF0ZSBwYXJ0cy4gVGFrZW4gaW4gY29uanVuY3Rpb24gdGhleSByZW1vdmUKK3RoZSBjdXJyZW50IGNvbnN0cmFpbnRzIHRoYXQgbWFrZSBpdCBkaWZmaWN1bHQgZm9yIHNvbWUgY2xpZW50cyB0byBwbGFjZQordGhlaXIgZmlsZXMgd2hlcmUgdGhleSBuZWVkIHRvIGJlLgorPHVsPgorPGxpPgorPGEgaHJlZj0iI0phdmEgQnVpbGRlciBBdHRpdHVkZSBBZGp1c3RtZW50Ij5DaGFuZ2UgdGhlIEphdmEgYnVpbGRlcidzIGF0dGl0dWRlCit0b3dhcmRzIHRoZSBvdXRwdXQgZm9sZGVyLjwvYT48L2xpPgorCis8bGk+Cis8YSBocmVmPSIjQWxsb3dpbmcgRm9sZGVycyB0byBQbGF5IE11bHRpcGxlIFJvbGVzIj5BbGxvdyBmb2xkZXJzIHRvIHBsYXkKK211bHRpcGxlIHJvbGVzIG9uIHRoZSBzYW1lIGJ1aWxkIGNsYXNzcGF0aC48L2E+PC9saT4KKworPGxpPgorPGEgaHJlZj0iI0NvbXBsZXRlbHkgZWxpbWluYXRlIHJlc291cmNlIGZpbGUgY29weWluZyBiZWhhdmlvciI+Q29tcGxldGVseQorZWxpbWluYXRlIHRoZSByZXNvdXJjZSBjb3B5aW5nIGJlaGF2aW9yIG9mIGN1cnJlbnQgSmF2YSBidWlsZGVyLjwvYT48L2xpPgorCis8bGk+Cis8YSBocmVmPSIjTWluaW1pemUgdGhlIG9wcG9ydHVuaXR5IGZvciBvYnNvbGV0ZSBjbGFzcyBmaWxlcyB0byBoYXZlIGJhZCBlZmZlY3RzIj5NaW5pbWl6ZQordGhlIG9wcG9ydHVuaXR5IGZvciBvYnNvbGV0ZSBjbGFzcyBmaWxlcyB0byBoYXZlIGJhZCBlZmZlY3RzLjwvYT48L2xpPgorPC91bD4KK1tSZXZpc2VkIHByb3Bvc2FsOiBSYXRoZXIgdGhhbiB3cml0ZSBhIGNvbXBsZXRlbHkgbmV3IHByb3Bvc2FsLCBJJ3ZlIGFkZGVkCithIG5vdGUgbGlrZSB0byB0aGUgZW5kIG9mIGVhY2ggc3Vic2VxdWVudCBzZWN0aW9uIGRlc2NyaWJpbmcgYSByZXZpc2VkCitwcm9wb3NhbC5dCis8aDM+Cis8YSBOQU1FPSJKYXZhIEJ1aWxkZXIgQXR0aXR1ZGUgQWRqdXN0bWVudCI+PC9hPkphdmEgQnVpbGRlciBBdHRpdHVkZSBBZGp1c3RtZW50PC9oMz4KK1RvIGFwcHJlY2lhdGUgdGhlIGRpZmZpY3VsdGllcyBpbmhlcmVudCB3aXRoIHRoZSBKYXZhIGJ1aWxkZXIgc2hhcmluZyBpdHMKK291dHB1dCBmb2xkZXIgd2l0aCBvdGhlciBmb2xrLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHdvcmtzcGFjZSBjb250YWluaW5nCithIEphdmEgcHJvamVjdC4gQXNzdW1lIHRoYXQgdGhpcyBwcm9qZWN0IGhhcyBub3QgYmVlbiBidWlsdCBpbiBxdWl0ZSBhCit3aGlsZSwgYW5kIHRoZSB1c2VyIGhhcyBiZWVuIG1hbnVhbGx5IGluc2VydGluZyBhbmQgZGVsZXRpbmcgY2xhc3MgZmlsZXMKK2luIHRoZSBwcm9qZWN0J3Mgb3V0cHV0IGZvbGRlci4KKzxwPkphdmEgcHJvamVjdCBwMS8KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhci5qYXZhCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvby5qYXZhCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguamF2YQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBiaW4vY29tL2V4YW1wbGUvIChvdXRwdXQgZm9sZGVyKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYXIuY2xhc3Mge1NvdXJjZUZpbGU9IkJhci5qYXZhIn0KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRm9vLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvbyQxLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludGVybmFsLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IE1haW4uY2xhc3Mge1NvdXJjZUZpbGU9Ik1haW4uamF2YSJ9Cis8cD5Gcm9tIHRoaXMgYXJyYW5nZW1lbnQgb2YgZmlsZXMgKGFuZCBsb29raW5nIGF0IHRoZSBTb3VyY2VGaWxlIGF0dHJpYnV0ZWQKK2VtYmVkZGVkIGluIGNsYXNzIGZpbGVzKSwgd2UgY2FuIGluZmVyIHRoYXQ6Cis8dWw+Cis8bGk+CitCYXIuY2xhc3MgY2FtZSBmcm9tIGNvbXBpbGluZyBhIHNvdXJjZSBmaWxlIG5hbWVkICJCYXIuamF2YSIuPC9saT4KKworPGxpPgorRm9vLmNsYXNzLCBGb28kMS5jbGFzcywgYW5kIEludGVybmFsLmNsYXNzIGFsbCBjYW1lIGZyb20gY29tcGlsaW5nIGEgIkZvby5qYXZhIi4KKyhBIHNpbmdsZSBzb3VyY2UgZmlsZSB3aWxsIGNvbXBpbGUgdG8gbXVsdGlwbGUgc2VwYXJhdGUgY2xhc3MgZmlsZXMgaWYKK2l0IGhhcyBuZXN0ZWQgY2xhc3NlcyBvciBzZWNvbmRhcnkgbm9uLXB1YmxpYyBjbGFzc2VzLik8L2xpPgorCis8bGk+CitUaGVyZSBhcmUgbm8gZXhpc3RpbmcgY2xhc3MgZmlsZXMgY29ycmVzcG9uZGluZyB0byAiUXV1eC5qYXZhIi48L2xpPgorCis8bGk+CitNYWluLmNsYXNzIGNhbWUgZnJvbSBjb21waWxpbmcgYSBzb3VyY2UgZmlsZSBuYW1lZCAiTWFpbi5qYXZhIiwgd2hpY2ggdGhlCit3b3Jrc3BhY2UgZG9lcyd0IGhhdmUuPC9saT4KKzwvdWw+CisKKzxoND4KK0phdmEgQnVpbGRlciAtIE9ic29sZXRlIENsYXNzIEZpbGUgRGVsZXRpb248L2g0PgorSWYgdGhlIHVzZXIgd2FzIHRvIHJlcXVlc3QgYSBmdWxsIGJ1aWxkIG9mIHRoaXMgcHJvamVjdCwgaG93IHdvdWxkIHRoZQorSmF2YSBidWlsZGVyIHByb2NlZWQ/IEJlZm9yZSBpdCBjb21waWxlIGFueSBzb3VyY2UgZmlsZXMsIGl0IGJlZ2lucyBieQorZGVsZXRpbmcgZXhpc3RpbmcgY2xhc3MgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIHNvdXJjZSBmaWxlcyBpdCBpcyBhYm91dAordG8gcmVjb21waWxlLiBXaHk/IEJlY2F1c2Ugb2Jzb2xldGUgY2xhc3MgZmlsZXMgbGVmdCBhcm91bmQgKGEpIHdhc3RlIHN0b3JhZ2UKK2FuZCAoYikgd291bGQgYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUgd2hlcmUgdGhleSBjb3VsZCBjYXVzZSB0aGUgcHJvZ3JhbQordG8gcnVuIGluY29ycmVjdGx5LgorPHA+SW4gdGhpcyBzaXR1YXRpb24sIHRoZSBKYXZhIGJ1aWxkZXIgZGVsZXRlcyB0aGUgY2xhc3MgZmlsZXMgY29ycmVzcG9uZGluZwordG8gQmFyLmphdmEgKGkuZS4sIEJhci5jbGFzcyksIHRvIEZvby5qYXZhIChpLmUuLCBGb28uY2xhc3MsIEZvbyQxLmNsYXNzLAorYW5kIEludGVybmFsLmNsYXNzKSwgYW5kIHRvIFF1dXguamF2YSAobm9uZSwgaW4gdGhpcyBjYXNlKS4gVGhlIHJlbWFpbmluZworY2xhc3MgZmlsZXMgKE1haW4uY2xhc3MpIG11c3QgYmUgcmV0YWluZWQgYmVjYXVzZSBpdCBpcyBpcnJlcGxhY2VhYmxlLgorPHA+VGhlIEphdmEgYnVpbGRlciB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgZGVsZXRpbmcgb2Jzb2xldGUgY2xhc3MgZmlsZXMKK2luIG9yZGVyIHRvIHN1cHBvcnQgYXV0b21hdGVkIGluY3JlbWVudGFsIHJlY29tcGlsYXRpb24gb2YgZW50aXJlIGZvbGRlcnMKK29mIHNvdXJjZSBmaWxlcy4gTm90ZSB0aGF0IHN0YW5kYXJkIEphdmEgY29tcGlsZXJzIGxpa2UgamF2YWMgbmV2ZXIgZXZlcgorZGVsZXRlIGNsYXNzIGZpbGVzOyB0aGV5IHNpbXBseSB3cml0ZSAob3Igb3ZlcndyaXRlKSBjbGFzcyBmaWxlcyB0byB0aGUKK291dHB1dCBmb2xkZXIgZm9yIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCB0aGV5IGFyZSBnaXZlbiB0byBjb21waWxlLiBTdGFuZGFyZAorSmF2YSBjb21waWxlcnMgZG8gbm90IHN1cHBvcnQgaW5jcmVtZW50YWwgcmVjb21waWxhdGlvbjogdGhlIHVzZXIgaXMgcmVzcG9uc2libGUKK2ZvciBkZWxldGluZyBhbnkgb2Jzb2xldGUgY2xhc3MgZmlsZXMgdGhhdCB0aGV5IGJyaW5nIGFib3V0LgorPHA+SWYgdGhlIEphdmEgYnVpbGRlciBpcyBmcmVlIHRvIGFzc3VtZSB0aGF0IGFsbCBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0Citmb2xkZXIgYXJlIG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIHNvdXJjZSBmaWxlcywgdGhlbiBpdCBjYW4gc2ltcGx5IGRlbGV0ZQorYWxsIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGF0IHRoZSBzdGFydCBvZiBhIGZ1bGwgYnVpbGQuIElmIGl0CitjYW5ub3QgYXNzdW1lIHRoaXMsIHRoZSBidWlsZGVyIGlzIGZvcmNlZCB0byBsb29rIGF0IGNsYXNzIGZpbGVzIGluIHRoZQorb3V0cHV0IGZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBoYXMgc291cmNlIGNvZGUgZm9yIHRoZW0uIFRoaXMgaXMKK2NsZWFybHkgbW9yZSBleHBlbnNpdmUgdGhhdCBub3QgaGF2aW5nIHRvIGRvIHNvLiBCeSBkZWNsYXJpbmcgdGhhdCBpdCAib3ducyIKK3RoZSBvdXRwdXQgZm9sZGVyLCB0aGUgY3VycmVudCBidWlsZGVyIGlzIGFibGUgdG8gbWFrZXMgdGhpcyBzaW1wbGlmeWluZworYXNzdW1wdGlvbi4gQWxsb3dpbmcgdXNlcnMgYW5kIGNsaWVudHMgdG8gcGxhY2UgYWRkaXRpb25hbCBjbGFzcyBmaWxlcworaW4gdGhlIG91dHB1dCBmb2xkZXIgcmVxdWlyZXMgdGhyb3dpbmcgb3V0IHRoaXMgYXNzdW1wdGlvbi4KKzxwPklmIHRoZSB1c2VyIG9yIGNsaWVudCBpcyBmcmVlIHRvIG1hbmlwdWxhdGUgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dAorZm9sZGVyIHdpdGhvdXQgdGhlIEphdmEgYnVpbGRlcidzIGludm9sdmVtZW50LCB0aGVuIHRoZSBidWlsZGVyIGNhbm5vdAorcGVyZm9ybSBmdWxsIG9yIGluY3JlbWVudGFsIGJ1aWxkcyB3aXRob3V0IGxvb2tpbmcgYXQgYW5kIGRlbGV0aW5nIHRoZQorb2Jzb2xldGUgY2xhc3MgZmlsZXMgZnJvbSB0aGUgb3V0cHV0IGZvbGRlciBjb3JyZXNwb25kaW5nIHRvIHNvdXJjZSBmaWxlcworYmVpbmcgY29tcGlsaW5nLgorPHA+VW5kZXIgdGhlIHByb3Bvc2VkIGNoYW5nZSwgdGhlIEphdmEgYnVpbGRlciB3b3VsZCBuZWVkIHRvIGxvb2sgYXQgdGhlCitjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGQgZGVsZXRlCit0aGVtLiA8aT5UaGUgb25seSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0aGF0IHRoZSBKYXZhIGJ1aWxkZXIgd291bGQKK2JlIGVudGl0bGVkIHRvIG92ZXJ3cml0ZSBvciBkZWxldGUgYXJlIGNsYXNzIGZpbGVzIHdoaWNoIHRoZSBKYXZhIGJ1aWxkZXIKK3dvdWxkIHJlYXNvbmFibHkgZ2VuZXJhdGUsIG9yIGRpZCBnZW5lcmF0ZSwgd2hpbGUgY29tcGlsaW5nIHRoYXQgcHJvamVjdC48L2k+Cis8dWw+Cis8bGk+CitUaGUgSmF2YSBidWlsZGVyIGlzIGVudGl0bGVkIHRvIG92ZXJ3cml0ZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlcgordGhhdCBjb3JyZXNwb25kIHRvIGN1cnJlbnQgc291cmNlIGZpbGVzLiBBbnkgY2xhc3MgZmlsZSBhdCBzdWNoIGEgcGF0aAoraXMgdGhlIEphdmEgYnVpbGRlcidzLiBFdmVuIHdoZW4gdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgY2xhc3MgZmlsZQorY2FtZSBmcm9tIGVsc2V3aGVyZSwgdGhlIGJ1aWxkZXIgaXMgYWx3YXlzIGVudGl0bGVkIHRvIGRlbGV0ZSB0aGVtIG9yIG92ZXJ3cml0ZQordGhlbSB3aXRoIGl0cyBjb250ZW50cy48L2xpPgorCis8bGk+CitUaGUgb25seSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0aGF0IHRoZSBKYXZhIG1vZGVsL2J1aWxkZXIgd291bGQgYmUKK2VudGl0bGVkIHRvIGRlbGV0ZSBvdXRyaWdodCBhcmUgb25lcyB0aGF0IGhhZCBiZWVuIGdlbmVyYXRlZCBieSB0aGUgSmF2YQorYnVpbGRlciB3aGVuIGNvbXBpbGluZyB0aGlzIHByb2plY3QgYnV0IHdoaWNoIG5vIGxvbmdlciBjb3JyZXNwb25kIHRvIGEKK2N1cnJlbnQgc291cmNlIGZpbGUuIFRoaXMgcGVybWl0cyB0aGUgSmF2YSBidWlsZGVyIHRvIGNsZWFuIHVwIG9ic29sZXRlCitjbGFzcyBmaWxlcyB0aGF0IGl0IGtub3dzIGl0IGdlbmVyYXRlZCwgb3Igd291bGQgaGF2ZSBnZW5lcmF0ZWQsIG9uIGFuCitlYXJsaWVyIGJ1aWxkLiBJdCBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0byBkZWxldGUgb3RoZXIgY2xhc3MgZmlsZXMsCitldmVuIG9uZXMgd2hpY2ggZG8gbm90IGNvcnJlc3BvbmQgdG8gYSBjdXJyZW50IHNvdXJjZSBmaWxlLiAoT3RoZXJ3aXNlCit0aGUgSmF2YSBidWlsZGVyIGNvdWxkIGp1c3RpZnkgZGVsZXRpbmcgYW55IGNsYXNzIGZpbGUgdGhhdCBpdCBkb2VzIG5vdAoraGF2ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmb3IuKSBFdmVuIGZvciBhIGZ1bGwgYnVpbGQsIHRoZSBKYXZhIGJ1aWxkZXIKK2lzIG5vdCBhbGxvd2VkIHRvIHNjcnViIGFsbCBjbGFzcyBmaWxlcyBmcm9tIHRoZSBvdXRwdXQgZm9sZGVyICh1bmxlc3MKK2l0IGhhcHBlbnMgdG8ga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIG9ubHkgY2xhc3MgZmlsZXMgaW4gdGhlcmUgb25lcyBpdAorZ2VuZXJhdGVkKS48L2xpPgorCis8bGk+CitUaGUgc291cmNlIGZpbGUgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlIG9mIGNsYXNzIGZpbGVzIHRoYXQgaXMgbm90IGdlbmVyYXRlZAord2hlbiBkZWJ1ZyBpbmZvIGlzIHN1cHByZXNzZWQgKGphdmFjIC1nOm5vbmUpLiBDbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0Citmb2xkZXIgd2l0aG91dCB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgdGhlcmUgd2FzCitubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlLiBUaGlzIG1lYW5zIHRoZXkgbmV2ZXIgZ2V0IGRlbGV0ZWQgb3V0cmlnaHQsCithbHRob3VnaCB0aGV5IG1heSBzdGlsbCBiZSBvdmVyd3JpdHRlbiBhcyByZXF1aXJlZC48L2xpPgorCis8bGk+CitOb3RlOiBjaGFuZ2luZyBhIHByb2plY3QgdG8gZ2l2ZSBpdCBhIGRpZmZlcmVudCBvdXRwdXQgZm9sZGVyIHNob3VsZCBhYnNvbHZlCit0aGUgSmF2YSBidWlsZGVyIG9mIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIGluIHRoZQorZm9ybWVyIG91dHB1dCBmb2xkZXIuIFRoaXMgbWVhbnMgdGhlIEphdmEgYnVpbGRlciBkb2VzIG5vdCBuZWVkIHRvIHBlcmZvcm0KK2NsZWFudXAgb3IgdHJhY2sgYW55dGhpbmcgb3V0c2lkZSB0aGUgY3VycmVudCBvdXRwdXQgZm9sZGVyLjwvbGk+CisKKzxsaT4KK05vdGU6IGFkZGluZyBhIHNvdXJjZSBlbnRyeSB0byB0aGUgYnVpbGQgY2xhc3NwYXRoIGNhdXNlcyBhIGJ1bmNoIG9mIG5ldworc291cmNlIGZpbGVzIHRvIGVudGVyIHRoZSBmcmFtZS4gU29tZSBvZiB0aGUgZXhpc3RpbmcgY2xhc3MgZmlsZXMgaW4gdGhlCitvdXRwdXQgZm9sZGVyIG1pZ2h0IG5vdyBtYXAgdG8gdGhlc2Ugc291cmNlIGZpbGVzLCBwb3NzaWJseSBpbiBwcmVmZXJlbmNlCit0byB3aGVyZSB0aGV5IG1hcHBlZCBiZWZvcmUuIFJlbW92aW5nIGEgc291cmNlIGVudHJ5IGZyb20gdGhlIGJ1aWxkIGNsYXNzcGF0aAorY2F1c2VzIGEgYnVuY2ggb2Ygc291cmNlIGZpbGVzIHRvIGxlYXZlIHRoZSBwaWN0dXJlLiBTb21lIG9mIHRoZSBleGlzdGluZworY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgbWlnaHQgbm93IG1hcCB0byBvdGhlciBzb3VyY2UgZmlsZXMsIG9yCitub3QgbWFwIHRvIGFueSBzb3VyZSBmaWxlIGF0IGFsbC4gW1dlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgb2Jzb2xldGUgY2xhc3MKK2ZpbGVzIG5lZWQgdG8gYmUgdHJhY2tlZCBhY3Jvc3MgdGhlIGFkZGl0aW9uYWwgYW5kL29yIHJlbW92YWwgb2Ygc291cmNlCitlbnRyaWVzIGZyb20gdGhlIGJ1aWxkIGNsYXNzcGF0aC5dPC9saT4KKzwvdWw+CitUaGlzIGNoYW5nZSBpcyBub3QgYSBicmVha2luZyBBUEkgY2hhbmdlLiBUaGUgb2xkIHNwZWMgc2FpZCB0aGF0IHRoZSBKYXZhCittb2RlbC9idWlsZGVyIG93bmVkIHRoZSBvdXRwdXQgZm9sZGVyLCBidXQgZGlkbid0IGZ1cnRoZXIgc3BlY2lmeSB3aGF0CithbGwgdGhhdCBlbnRhaWxlZC4gVGhlIG5ldyBzcGVjIHdpbGwgbW9kaWZ5IHRoaXMgcG9zaXRpb24gdG8gYWxsb3cgY2xpZW50cwordG8gc3RvcmUgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXI7IGl0IHdpbGwgcHJvbWlzZSB0aGF0IHRoZXNlIGZpbGVzIGFyZQorcGVyZmVjdGx5IHNhZmUgdW5sZXNzIHRoZXkgYXJlIGluIHRoZSBKYXZhIGJ1aWxkZXIncyBkaXJlY3QgbGluZSBvZiBmaXJlLgorPGg0PgorSmF2YSBNb2RlbCAtIE9ic29sZXRlIENsYXNzIEZpbGUgRGVsZXRpb248L2g0PgorVGhlcmUgaXMgYW5vdGhlciBmYWNldCBvZiB0aGUgb2Jzb2xldGUgY2xhc3MgZmlsZSBwcm9ibGVtIHRoYXQgdGhlIEphdmEKK2J1aWxkZXIgaXMgbm90IGluIGEgcG9zaXRpb24gdG8gaGVscCB3aXRoLgorPHA+SWYgdGhlIHNvdXJjZSBmaWxlIEZvby5qYXZhIHdlcmUgdG8gYmUgZGVsZXRlZCwgaXRzIHRocmVlIGNsYXNzIGZpbGVzCitiZWNvbWUgb2Jzb2xldGUgYW5kIG5lZWQgdG8gYmUgZGVsZXRlZCA8aT5pbW1lZGlhdGVseTwvaT4uIFdoeSBpbW1lZGlhdGVseT8KK0NvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiB0aGUgY2xhc3MgZmlsZXMgYXJlIG5vdCBkZWxldGVkIGltbWVkaWF0ZWx5LiBJZgordGhlIHVzZXIgcmVxdWVzdHMgYSBmdWxsIGJ1aWxkLCB0aGUgSmF2YSBidWlsZGVyIGlzIHByZXNlbnRlZCB3aXRoIHRoZQorZm9sbG93aW5nIHdvcmtzcGFjZToKKzxwPkphdmEgcHJvamVjdCBwMS8KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhci5qYXZhCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguamF2YQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBiaW4vY29tL2V4YW1wbGUvIChvdXRwdXQgZm9sZGVyKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYXIuY2xhc3Mge1NvdXJjZUZpbGU9IkJhci5qYXZhIn0KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRm9vLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvbyQxLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludGVybmFsLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IE1haW4uY2xhc3Mge1NvdXJjZUZpbGU9Ik1haW4uamF2YSJ9Cis8cD5TaW5jZSBhIGZ1bGwgYnVpbGQgaXMgcmVxdWVzdGVkLCB0aGUgSmF2YSBidWlsZGVyIGlzIG5vdCBwYXNzZWQgYSByZXNvdXJjZQorZGVsdGEgdHJlZSBmb3IgdGhlIHByb2plY3QuIFRoaXMgbWVhbnMgdGhhdCB0aGUgSmF2YSBidWlsZGVyIGhhcyBubyB3YXkKK29mIGtub3dpbmcgdGhhdCBGb28uamF2YSB3YXMganVzdCBkZWxldGVkLiBUaGUgSmF2YSBidWlsZGVyIGhhcyBubyBjaG9pY2UKK2J1dCB0byByZXRhaW4gdGhlIHRocmVlIGNsYXNzIGZpbGVzIEZvby5jbGFzcywgRm9vJDEuY2xhc3MsIGFuZCBJbnRlcm5hbC5jbGFzcywKK2p1c3QgYXMgaXQgcmV0YWlucyBNYWluLmNsYXNzLiBUaGlzIHRvbyBpcyBhIGNvbnNlcXVlbmNlIG9mIGFsbG93aW5nIHRoZQorSmF2YSBidWlsZGVyIHRvIHNoYXJlIHRoZSBvdXRwdXQgZm9sZGVyIHdpdGggdGhlIHVzZXIncyBjbGFzcyBmaWxlcy4KKzxwPklmIHRoZSBvYnNvbGV0ZSBjbGFzcyBmaWxlcyBhcmUgbm90IGRlbGV0ZWQgaW4gcmVzcG9uc2UgdG8gdGhlIGRlbGV0aW9uCitvZiBhIHNvdXJjZSBmaWxlLCB0aGVzZSBjbGFzcyBmaWxlcyB3aWxsIGxpbmdlciBhcm91bmQuIFRoZSBKYXZhIGJ1aWxkZXIKK3dpbGwgYmUgdW5hYmxlIHRvIGdldCByaWQgb2YgdGhlbS4KKzxwPlRoZSBwcm9wb3NhbCBpcyB0byBoYXZlIHRoZSBKYXZhIG1vZGVsIG1vbml0b3Igc291cmNlIGZpbGUgZGVsZXRpb25zCitvbiBhbiBvbmdvaW5nIGJhc2lzIGFuZCBpZGVudGlmeSBhbmQgZGVsZXRlIGFueSBjb3JyZXNwb25kaW5nIG9ic29sZXRlCitjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci4gVGhpcyBjbGVhbiB1cCBhY3Rpdml0eSBtdXN0IGhhbmRsZSB0aGUKK2Nhc2Ugb2Ygc291cmNlIGZpbGVzIHRoYXQgZGlzYXBwZWFyIHdoaWxlIHRoZSBKYXZhIENvcmUgcGx1Zy1pbiBpcyBub3QKK2FjdGl2YXRlZCAodGhpcyBlbnRhaWxzIHJlZ2lzdGVyaW5nIGEgQ29yZSBzYXZlIHBhcnRpY2lwYW50KS4KKzxwPlNpbmNlIGRlbGV0aW5nIChpbmNsdWRpbmcgcmVuYW1pbmcgYW5kIG1vdmluZykgYSBzb3VyY2UgZmlsZSBpcyBhIHJlbGF0aXZlbHkKK3VuY29tbW9uIHRoaW5nIGZvciBhIGRldmVsb3BlciB0byBkbywgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZXQgaXQKK2RvZXMgbm90IGhhdmUgdG8gZG8gdGhpcyB2ZXJ5IG9mdGVuLiBXaGVuIGEgc291cmNlIGZpbGUgaW4gZGVsZXRlZCwgaXRzCitwYWNrYWdlIG5hbWUgZ2l2ZXMgdXMgZXhhY3RseSB3aGljaCBzdWJmb2xkZXIgb2YgdGhlIG91dHB1dCBmb2xkZXIgbWlnaHQKK2NvbnRhaW4gY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyB0aGF0IG1pZ2h0IG5vdyBiZSBvYnNvbGV0ZS4gSW4gdGhlIHdvcnN0CitjYXNlLCB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBhY2Nlc3MgYWxsIGNsYXNzIGZpbGVzIGluIHRoYXQgc3ViZm9sZGVyCit0byBkZXRlcm1pbmUgd2hldGhlciBhbnkgb2YgdGhlbSBoYXZlIGJlY29tZSBvYnNvbGV0ZS4gSW4gY2FzZXMgd2hlcmUgdGhlcmUKK2lzIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlciBvbiB0aGUgYnVpbGRlciBjbGFzc3BhdGgsIGFuZCB0aGVyZSBpcyB0aGVyZWZvcmUKK3RoZSBwb3NzaWJpbGl0eSBvZiBvbmUgc291cmNlIGZpbGUgaGlkaW5nIGFub3RoZXIgYnkgdGhlIHNhbWUgbmFtZSwgaXQKK2lzIG5lY2Vzc2FyeSB0byBjb25zdWx0IHRoZSBidWlsZCBjbGFzc3BhdGggdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGV0ZWQKK3NvdXJjZSBmaWxlIHdhcyBleHBvc2VkIG9yIGJ1cmllZC4KKzxoND4KK0ltcGxlbWVudGF0aW9uIFRyaWNrczwvaDQ+CitTb21lIG9ic2VydmF0aW9ucyBhbmQgaW1wbGVtZW50YXRpb24gdHJpY2tzIHRoYXQgc2hvdWxkIGhlbHAgcmVkdWNlIHRoZQorc3BhY2UgYW5kIHRpbWUgaW1wYWN0IG9mIGRvaW5nIHRoaXMuCis8dWw+Cis8bGk+CitXaGVuIG9uZSBvciBtb3JlIHNvdXJjZSBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmb2xkZXIsCit0aGVpciBwb3NpdGlvbiB1bmRlciB0aGUgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBnaXZlcyB1cyB0aGUgcGFja2FnZQorbmFtZS4gVGhpcyBwYWNrYWdlIG5hbWUgdGVsbHMgdXMgZXhhY3RseSB3aGljaCBzdWJmb2xkZXIgb2YgdGhlIG91dHB1dAorZm9sZGVyIG1pZ2h0IGNvbnRhaW4gY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyB0aGF0IG1pZ2h0IG5vdyBiZSBvYnNvbGV0ZS4KK0luIHRoZSB3b3JzdCBjYXNlLCB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBhY2Nlc3MgYWxsIGNsYXNzIGZpbGVzCitpbiB0aGF0IHN1YmZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhbnkgb2YgdGhlbSBoYXZlIGJlY29tZSBvYnNvbGV0ZS4KK1RoaXMgc2hvd3MgdGhhdCB5b3Ugb25seSBuZWVkIGluZm9ybWF0aW9uIGFib3V0IGEgc21hbGwgcG9ydGlvbiBvZiB0aGUKK291dHB1dCBmb2xkZXIgaW4gb3JkZXIgdG8gcHJvY2VzcyBvbmUgb3IgbW9yZSBkZWxldGlvbnMgd2l0aGluIGEgc2luZ2xlCitzb3VyY2UgZm9sZGVyLjwvbGk+CisKKzxsaT4KK0Egc291cmNlIGZpbGUgbmFtZWQgRm9vLmphdmEgdHlwaWNhbGx5IGNvbXBpbGVzIHRvIGEgc2luZ2xlIGNsYXNzIGZpbGUKK25hbWVkIEZvby5jbGFzcy4gVGhlcmUgbWlnaHQgYmUgbW9yZSBjbGFzcyBmaWxlcyAoZm9yIG5lc3RlZCBjbGFzc2VzIGFuZC9vcgorc2Vjb25kYXJ5IG5vbi1wdWJsaWMgdHlwZXMpOyBhbmQgdGhlcmUgbWlnaHQgYmUgbGVzcyAod2hlbiB0aGUgc291cmNlIGZpbGUKK2NvbnRhaW5zIG9ubHkgbm9uLXB1YmxpYyB0eXBlcyB3aXRoIG5hbWVzIG90aGVyIHRoYW4gIkZvbyIpLiBXaGVuIHJlY29yZGluZwordGhlIGV4dHJhY3RlZCBzb3VyY2UgZmlsZSBuYW1lIGluZm9ybWF0aW9uLCBvbmx5IHRoZSBleGNlcHRpb25hbCBjYXNlcworbmVlZCB0byBiZSByZXByZXNlbnRlZCBleHBsaWNpdGx5LiBGb3IgZXhhbXBsZSwgb25seSBGb28kMS5jbGFzcyAoZGVyaXZlZAorZnJvbSBGb28uamF2YSkgYW5kIEludGVybmFsLmNsYXNzIChkZXJpdmVkIGZyb20gRm9vLmphdmEpIGFyZSB1bnVzdWFsOworQmFyLmNsYXNzLCBGb28uY2xhc3MsIGFuZCBNYWluLmNsYXNzIGFyZSBhbGwgZGVyaXZlZCBmcm9tIHNvdXJjZSBmaWxlcword2l0aCB0aGUgZXhwZWN0ZWQgbmFtZS4gVGhpcyBtZWFucyB5b3UgY2FuIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBleHRyYWN0ZWQKK2Zyb20gY2xhc3MgZmlsZXMgbXVjaCBtb3JlIGNvbXBhY3RseSB0aGF0IGEgc2ltcGxlIGNsYXNzIGZpbGUgbmFtZSB0byBTb3VyY2VGaWxlCitzdHJpbmcgbWFwcGluZy48L2xpPgorCis8bGk+CitUaGVyZSBpcyBvZnRlbiBvbmx5IG9uZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBidWlsZGVyIGNsYXNzcGF0aC4gSW4gdGhpcworY2FzZSwgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgc291cmNlIGZvbGRlciBnZXQgY29tcGlsZWQ7IHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5CitvZiBvbmUgc291cmNlIGZpbGUgImhpZGluZyIgYW5vdGhlciBieSB0aGUgc2FtZSBuYW1lLiBUaGlzIG9ic2VydmF0aW9uCitjYW4gYmUgdXNlZCB0byBhdm9pZCBjaGVja2luZyBmb3Igc291cmNlIGZpbGUgaGlkaW5nLjwvbGk+Cis8L3VsPgorCis8aDM+CitXaGVuIGFsbCBlbHNlIGZhaWxzPC9oMz4KK0Egc3BlY2lhbCBjb25jZXJuIGlzIHRoYXQgdGhlIHVzZXIgbXVzdCBiZSBhYmxlIHRvIHJlY292ZXIgZnJvbSBjcmFzaGVzCitvciBvdGhlciBwcm9ibGVtcyB0aGF0IHJlc3VsdCBpbiBvYnNvbGV0ZSBjbGFzcyBmaWxlcyBiZWluZyBsZWZ0IGJlaGluZAoraW4gdGhlIG91dHB1dCBmb2xkZXIuIEl0IGNhbiBiZSB2ZXJ5IGJhZCB3aGVuIHRoaXMga2luZCBvZiB0aGluZyBoYXBwZW5zCisoYW5kIGl0IGRvZXMgaGFwcGVuLCBkZXNwaXRlIG91ciBiZXN0IGVmZm9ydHMpLCBhbmQgY2FuIHVuZGVyY3V0IHRoZSB1c2VyJ3MKK2NvbmZpZGVuY2UgaW4gdGhlIEphdmEgY29tcGlsZXIgYW5kIElERS4gSW4gYSBsYXJnZSBvdXRwdXQgZm9sZGVyIHRoYXQKK2NvbnRhaW5zIGltcG9ydGFudCB1c2VyIGZpbGVzLCB0aGUgdXNlciBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUgb3V0cHV0IGZvbGRlcgorYW5kIGRvIGEgZnVsbCBidWlsZC4gVGhlIHVzZXIgaGFzIG5vIGVhc3kgd2F5IHRvIGRpc3Rpbmd1aXNoIGNsYXNzIGZpbGVzCit3aXRoIGNvcnJlc3BvbmRpbmcgc291cmNlIGZyb20gb25lcyB3aXRob3V0LiBBIHNpbXBsZSB3YXkgdG8gYWRkcmVzcyB0aGlzCituZWVkIHdvdWxkIGJlIHRvIGhhdmUgYSBjb21tYW5kIChzb21ld2hlcmUgaW4gdGhlIFVJKSB0aGF0IHdvdWxkIGRlbGV0ZQorYWxsIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGZvciB3aGljaCBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUKKygiRGVsZXRlIEdlbmVyYXRlZCBDbGFzcyBGaWxlcyIpLiBUaGlzIHdvdWxkIGF0IGxlYXN0IGdpdmUgdGhlIHVzZXIgc29tZQoraGVscCBpbiByZWNvdmVyaW5nIGZyb20gdGhlc2UgbWlub3IgZGlzYXN0ZXJzLgorPHA+W1JldmlzZWQgcHJvcG9zYWw6IFRoZSBKYXZhIGJ1aWxkZXIgcmVtZW1iZXJzIHRoZSBuYW1lcyBvZiB0aGUgY2xhc3MKK2ZpbGVzIGl0IGhhcyBnZW5lcmF0ZWQuIE9uIGZ1bGwgYnVpbGRzLCBpdCBjbGVhbnMgb3V0IGFsbCBjbGFzcyBmaWxlcyB0aGF0CitpdCBoYXMgb24gcmVjb3JkIGFzIGhhdmluZyBnZW5lcmF0ZWQ7IGFsbCBvdGhlciBjbGFzcyBmaWxlcyBhcmUgbGVmdCBpbgorcGxhY2UuIE9uIGluY3JlbWVudGFsIGJ1aWxkcywgaXQgc2VsZWN0aXZlbHkgY2xlYW5zIG91dCB0aGUgY2xhc3MgZmlsZXMKK3RoYXQgaXQgaGFzIG9uIHJlY29yZCBhcyBoYXZpbmcgZ2VuZXJhdGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvdXJjZSBmaWxlcwordGhhdCBpdCBpcyBnb2luZyB0byByZWNvbXBpbGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbW9uaXRvciBzb3VyY2UgZmlsZQorZGVsZXRpb25zOiBjb3JyZXNwb25kaW5nIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyB3aWxsIGJlIGRlbGV0ZWQgb24gdGhlIG5leHQKK2Z1bGwgYnVpbGQgKGJlY2F1c2UgaXQgbnVrZXMgdGhlbSBhbGwpIG9yIG5leHQgaW5jcmVtZW50YWwgYnVpbGQgKGJlY2F1c2UKK2l0IHNlZXMgdGhlIHNvdXJjZSBmaWxlIGRlbGV0aW9uIGluIHRoZSBkZWx0YSkuIFRoZSBKYXZhIGJ1aWxkZXIgbmV2ZXIKK2xvb2tzIGF0IGNsYXNzIGZpbGVzIGZvciB0aGVpciBTb3VyY2VGaWxlIGF0dHJpYnV0ZXMuIEEgZnVsbCBidWlsZCBhbHdheXMKK2RlbGV0ZXMgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gYSBzcGVjaWFsIFVJIGFjdGlvbi5dCis8aDM+Cis8YSBOQU1FPSJBbGxvd2luZyBGb2xkZXJzIHRvIFBsYXkgTXVsdGlwbGUgUm9sZXMiPjwvYT5BbGxvd2luZyBGb2xkZXJzCit0byBQbGF5IE11bHRpcGxlIFJvbGVzPC9oMz4KK1RoZSBwcm9wb3NlZCBjaGFuZ2UgaXMgdG8gY29uc2lzdGVudGx5IGFsbG93IHRoZSBzYW1lIGZvbGRlciB0byBiZSB1c2VkCitpbiBtdWx0aXBsZSB3YXlzIG9uIHRoZSBzYW1lIGJ1aWxkIGNsYXNzcGF0aC4KKzx1bD4KKzxsaT4KK0FzIHNvdXJjZSBmb2xkZXIgYW5kIGFzIG91dHB1dCBmb2xkZXIuPC9saT4KKworPHVsPgorPGxpPgorTi5CLiBUaGlzIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgKGUuZy4sIHdoZW4gZm9sZGVyIGlzIHRoZSBwcm9qZWN0IHJvb3QpLjwvbGk+CisKKzxsaT4KK0FsbG93cyBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgdG8gYmUgY28tbG9jYXRlZCB3aXRoIEphdmEgc291cmNlIGZpbGVzLjwvbGk+CisKKzxsaT4KK1NpbmNlIG91dHB1dCBmb2xkZXIgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBvbiBydW50aW1lIGNsYXNzcGF0aCwgdGhpcworYXJyYW5nZW1lbnQgd291bGQgYXV0b21hdGljYWxseSBtYWtlIGFueSBjbGFzcyBmaWxlcyBvciByZXNvdXJjZSBmaWxlcworYXZhaWxhYmxlIGF0IHJ1bnRpbWUuPC9saT4KKworPHVsPgorPGxpPgorSG93ZXZlciwgdGhlc2UgY2xhc3MgZmlsZXMgd291bGQgbm90IGJlIHNlZW4gYXQgY29tcGlsZSB0aW1lIGxpYnJhcnkgZm9sZGVyLjwvbGk+CisKKzxsaT4KK1JlY29tbWVuZGF0aW9uOiB3aGVuIGNsYXNzIGZpbGVzIG9yIHJlc291cmNlcyBhcmUgcHJlc2VudCBpbiBhIGZvbGRlciwKK3RoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBsaWJyYXJ5IGZvbGRlciBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIGZvcgoraXQuPC9saT4KKzwvdWw+Cis8L3VsPgorCis8bGk+CitBcyBzb3VyY2UgZm9sZGVyIGFuZCBhcyBsaWJyYXJ5IGZvbGRlci48L2xpPgorCis8dWw+Cis8bGk+CitOLkIuIFRoaXMgaXMgY3VycmVudGx5IGRpc2FsbG93ZWQuPC9saT4KKworPGxpPgorQWxsb3dzIGxpYnJhcnkgY2xhc3MgZmlsZXMgdG8gYmUgY28tbG9jYXRlZCB3aXRoIEphdmEgc291cmNlIGZpbGVzLjwvbGk+CisKKzxsaT4KK0FsbG93cyByZXNvdXJjZSBmaWxlcyB0byBiZSBjby1sb2NhdGVkIHdpdGggSmF2YSBzb3VyY2UgZmlsZXMuPC9saT4KKworPGxpPgorSW4gdmlydHVlIG9mIGJlaW5nIGEgbGlicmFyeSBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB0aGUgZm9sZGVyIGlzCit1c2VkIGF0IGNvbXBpbGUgdGltZSBmb3IgbGlicmFyeSBjbGFzcyBmaWxlcyBhbmQgaXMgaW5jbHVkZWQgb24gdGhlIHJ1bnRpbWUKK2NsYXNzcGF0aC48L2xpPgorPC91bD4KKworPGxpPgorQXMgbGlicmFyeSBmb2xkZXIgYW5kIGFzIG91dHB1dCBmb2xkZXIuPC9saT4KKworPHVsPgorPGxpPgorTi5CLiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhbGxvd2VkLjwvbGk+CisKKzxsaT4KK0FsbG93cyBsaWJyYXJ5IGNsYXNzIGZpbGVzIHRvIGJlIGNvLWxvY2F0ZWQgd2l0aCBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMuPC9saT4KKworPGxpPgorQWxsb3dzIHJlc291cmNlIGZpbGVzIHRvIGJlIGNvLWxvY2F0ZWQgd2l0aCBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMuPC9saT4KKworPGxpPgorUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSB3aGVuIGZvcm1pbmcgdGhlIHJ1bnRpbWUgY2xhc3MgcGF0aC48L2xpPgorCis8bGk+CitOb3RlIHRoYXQgdGhlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyBpbiB0aGlzIGxpYnJhcnkgZm9sZGVyIGFyZSBpZ25vcmVkCitieSB0aGUgYnVpbGRlciBiZWNhdXNlIGl0IGhhcyBzb3VyY2UgZm9yIGFsbCB0aGVzZSBieSBkZWZpbml0aW9uLjwvbGk+Cis8L3VsPgorCis8bGk+CitBcyBzb3VyY2UgZm9sZGVyIGFuZCBhcyBvdXRwdXQgZm9sZGVyIGFuZCBhcyBsaWJyYXJ5IGZvbGRlci48L2xpPgorCis8dWw+Cis8bGk+CitUaGlzIGlzIGp1c3QgYSBjb21iaW5hdGlvbiBvZiBhbGwgb2YgYWJvdmUuPC9saT4KKworPGxpPgorQWxsb3dzIGxpYnJhcnkgY2xhc3MgZmlsZXMsIGdlbmVyYXRlZCBjbGFzcyBmaWxlcywgYW5kIHJlc291cmNlIGZpbGVzIHRvCitiZSBjby1sb2NhdGVkIHdpdGggSmF2YSBzb3VyY2UgZmlsZXMuPC9saT4KKworPGxpPgorU2ltcGxlICJvbmUgZm9sZGVyIEphdmEgZGV2ZWxvcG1lbnQiIHNldHVwIGZvciBzb21lb25lIHdpdGggbGlicmFyeSBjbGFzcworZmlsZXMgYW5kIHBvc3NpYmx5IHJlc291cmNlcy48L2xpPgorPC91bD4KKzwvdWw+CitUaGlzIGNoYW5nZSBpcyBub3QgYSBicmVha2luZyBjaGFuZ2U7IGl0IHdvdWxkIHNpbXBseSBhbGxvdyBzb21lIGNsYXNzcGF0aAorY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc2FsbG93ZWQgdG8gYmUgY29uc2lkZXJlZCBsZWdpdGltYXRlLgorVGhlIEFQSSB3b3VsZCBub3QgbmVlZCB0byBjaGFuZ2UuCis8cD5bUmV2aXNlZCBwcm9wb3NhbDogTWFueSBwYXJ0cyBvZiB0aGUgSmF2YSBtb2RlbCBhc3N1bWUgdGhhdCBsaWJyYXJ5Citmb2xkZXJzIGFyZSByZWxhdGl2ZWx5IHF1aWV0LiBBbGxvdyBhIGxpYnJhcnkgZm9sZGVyIHRvIGNvaW5jaWRlIHdpdGggdGhlCitvdXRwdXQgZm9sZGVyIHdvdWxkIGludmFsaWRhdGUgdGhpcyBhc3N1bXB0aW9uLCB3aGljaCB3b3VsZCB0ZW5kIHRvIGRlZ3JhZGUKK3BlcmZvcm1hbmNlLiBGb3IgaW5zdGFuY2UsIHRoZSBpbmRleGVyIGluZGV4ZXMgbGlicmFyaWVzIGFuZCBzb3VyY2UgZm9sZGVycywKK2J1dCBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlIG91dHB1dCBmb2xkZXIuIElmIHRoZSBvdXRwdXQgZm9sZGVyIHdhcyBhbHNvCithIGxpYnJhcnksIGl0IHdvdWxkIHJlcGVhdGVkbHkgZXh0cmFjdCBpbmRleGVzIGZvciBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQKK2J5IHRoZSBidWlsZGVyLgorPHA+PGk+Ti5CLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9yaWdpbmFsIHNjZW5hcmlvIG9mIGxpYnJhcnkgY2xhc3MgZmlsZXMKK2luIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGNhbm5vdCBiZSBkb25lIHRoaXMgd2F5LiBJdCB3aWxsIG5lZWQgdG8gYmUgYWRkcmVzc2VkCitpbiBzb21lIG90aGVyIHdheSAoZGlzY3Vzc2VkIGxhdGVyIG9uKS48L2k+Cis8cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGlkZW50aXR5IGNyaXRlcmlhIGZvciBwYWNrYWdlIGZyYWdtZW50IHJvb3QKK2hhbmRsZXMgYXJlIGJhc2VkIG9uIHJlc291cmNlcy9wYXRocyBhbmQgZG8gbm90IHRha2Uga2luZCAoc291cmNlIHZzLiBiaW5hcnkpCitpbnRvIGFjY291bnQuIFRoaXMgbWVhbnMgdGhhdCBhIHNvdXJjZSBmb2xkZXIgYW5kIGEgbGlicmFyeSBmb2xkZXIgYXQgdGhlCitzYW1lIHBhdGggbWFwIHRvIHRoZSBzYW1lIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBoYW5kbGUhIFRodXMgYWxsb3dpbmcgYQorc291cmNlIGZvbGRlciB0byBjb2luY2lkZSB3aXRoIGEgbGlicmFyeSBmb2xkZXIgY2Fubm90IGJlIHN1cHBvcnRlZCB3aXRob3V0CityZXZpc2luZyBKYXZhIGVsZW1lbnQgaWRlbnRpdHkgY3JpdGVyaWEgKHdoaWNoIGlzIGR1ZSBmb3IgYW4gb3ZlcmhhdWwsCitidXQgdGhhdCdzIGEgZGlmZmVyZW50LCBhbmQgYmlnZ2VyLCB3b3JrIGl0ZW0pLjwvZm9udD4KKzxicj5dCis8aDM+Cis8YSBOQU1FPSJDb21wbGV0ZWx5IGVsaW1pbmF0ZSByZXNvdXJjZSBmaWxlIGNvcHlpbmcgYmVoYXZpb3IiPjwvYT5Db21wbGV0ZWx5CitlbGltaW5hdGUgcmVzb3VyY2UgZmlsZSBjb3B5aW5nIGJlaGF2aW9yPC9oMz4KK1RoZSBjdXJyZW50IEphdmEgYnVpbGRlciBjb3BpZXMgInJlc291cmNlIiBmaWxlcyBmcm9tIHNvdXJjZSBmb2xkZXJzIHRvCit0aGUgb3V0cHV0IGZvbGRlciAocHJvdmlkZWQgdGhhdCBzb3VyY2UgYW5kIG91dHB1dCBkbyBub3QgY29pbmNpZGUpLiBPbmNlCitpbiB0aGUgb3V0cHV0IGZvbGRlciwgdGhlIHJlc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXQgcnVudGltZSBiZWNhdXNlCit0aGUgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgcnVudGltZSBjbGFzcyBwYXRoLgorPHA+VGhpcyBjb3B5aW5nIGlzIHByb2JsZW1hdGljOgorPHVsPgorPGxpPgorQ29weWluZyBjcmVhdGVzIGR1cGxpY2F0ZXMgb2YgcmVzb3VyY2UgZmlsZXMuPC9saT4KKworPHVsPgorPGxpPgorVGFrZXMgdXAgZXh0cmEgZGlzayBzcGFjZS48L2xpPgorCis8bGk+CitDb3B5aW5nIHJlc291cmNlcyB0YWtlcyBleHRyYSB0aW1lLjwvbGk+CisKKzxsaT4KK0luY3JlYXNlcyByaXNrIG9mIHVzZXIgY29uZnVzaW9uIChtb2RpZnkgdGhlIGNvcHkpLjwvbGk+Cis8L3VsPgorCis8bGk+CitDb3B5aW5nIGlzIG91dCBvZiBjaGFyYWN0ZXIgZm9yIEphdmEgYnVpbGRlci48L2xpPgorCis8dWw+Cis8bGk+CitKYXZhIGJ1aWxkZXIgc2hvdWxkIGNvbXBpbGUgSmF2YSBzb3VyY2UgZmlsZXMgdG8gYmluYXJ5IGNsYXNzIGZpbGVzLjwvbGk+Cis8L3VsPgorCis8bGk+CitDb3B5aW5nIGJlaGF2aW9yIGlzIHF1aXJreS48L2xpPgorCis8dWw+Cis8bGk+CitSZXNvdXJjZXMgYXJlIG5ldmVyIGNvcGllZCBmcm9tIGEgc291cmNlIGZvbGRlciB0aGF0IGNvaW5jaWRlcyB3aXRoIHRoZQorb3V0cHV0IGZvbGRlci48L2xpPgorCis8bGk+CitSZXNvdXJjZXMgYXJlIGNvcGllZCBmcm9tIGEgc291cmNlIGZvbGRlciB0aGF0IGRvZXMgbm90IGNvaW5jaWRlIHdpdGggdGhlCitvdXRwdXQgZm9sZGVyLCBldmVuIGlmIHRoZSBvdXRwdXQgZm9sZGVyIGhhcHBlbnMgdG8gYmUgYW5vdGhlciBzb3VyY2UgZm9sZGVyLjwvbGk+CisKKzxsaT4KK01vZGlmeWluZyB0aGUgY29weSBhbmQgYnVpbGRpbmcgY2F1c2VzIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQgKCEpOyBpdCBpcworcmVwbGFjZWQgYnkgYSBmcmVzaCBjb3B5IG9uIHRoZSBuZXh0IGZ1bGwgYnVpbGQuPC9saT4KKworPGxpPgorV2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCByZXNvdXJjZSBmaWxlcyB3aXRoIHNhbWUgbmFtZSwgaXQgaXMgaW1wb3NzaWJsZQordG8gcmVsaWFibHkgY29udHJvbCB3aGljaCBvbmUgZW5kcyB1cCBpbiB0aGUgb3V0cHV0IGZvbGRlci48L2xpPgorCis8bGk+CitXaGVuIHRoZSBwcm9qZWN0IHNvdXJjZSBpcyB0aGUgcHJvamVjdCBpdHNlbGYsIGFuZCB0aGUgb3V0cHV0IGlzIGluIGEgZm9sZGVyCit1bmRlciB0aGUgcHJvamVjdCwgdGhlIGJ1aWxkZXIgY29waWVzIHRoZSAuY2xhc3NwYXRoIGZpbGUgaW50byB0aGUgb3V0cHV0Citmb2xkZXIgdG9vLjwvbGk+Cis8L3VsPgorPC91bD4KK1RoZSBwcm9wb3NhbCBpcyB0byBlbGltaW5hdGUgdGhpcyBjb3B5aW5nIGJlaGF2aW9yLiBUaGUgcHJvcGVyIHdheSB0byBoYW5kbGUKK3RoaXMgaXMgdG8gaW5jbHVkZSBhbiBhZGRpdGlvbmFsIGxpYnJhcnkgZW50cnkgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBmb3IKK2FueSBzb3VyY2UgZm9sZGVycyB0aGF0IGNvbnRhaW4gcmVzb3VyY2VzLiBTaW5jZSBsaWJyYXJ5IGVudHJpZXMgYXJlIGFsc28KK2luY2x1ZGVkIG9uIHRoZSBydW50aW1lIGNsYXNzcGF0aCwgdGhlIHJlc291cmNlIGZpbGVzIGNvbnRhaW5lZCB0aGVyZWluCit3aWxsIGJlIGF2YWlsYWJsZSBhdCBydW50aW1lLgorPHA+V2Ugd291bGQgYmVlZiB1cCB0aGUgQVBJIHNwZWNpZmljYXRpb24gdG8gZXhwbGFpbiBob3cgdGhlIGJ1aWxkIGNsYXNzcGF0aAorYW5kIHRoZSBydW50aW1lIGNsYXNzcGF0aCBhcmUgcmVsYXRlZCwgYW5kIHN1Z2dlc3RzIHRoYXQgb25lIGRlYWxzIHdpdGgKK3Jlc291cmNlIGZpbGVzIGluIHNvdXJjZSBmb2xkZXJzIHVzaW5nIGxpYnJhcnkgZW50cmllcy4gVGhpcyB3b3VsZCBiZSBhCiticmVha2luZyBjaGFuZ2UgZm9yIGNsaWVudHMgb3IgdXNlcnMgdGhhdCByZWx5IG9uIHRoZSBjdXJyZW50IHJlc291cmNlCitmaWxlIGNvcHlpbmcgYmVoYXZpb3IuCis8cD5UaGUgY2xpZW50cyB0aGF0IHdvdWxkIGJlIG1vc3QgYWZmZWN0ZWQgYXJlIG9uZXMgdGhhdCBjby1sb2NhdGUgdGhlaXIKK3Jlc291cmNlIGZpbGVzIHdpdGggdGhlaXIgc291cmNlIGZpbGVzIGluIGEgZm9sZGVyIHNlcGFyYXRlIGZyb20gdGhlaXIKK291dHB1dCBmb2xkZXIuIFRoaXMgaXMgYSBmYWlybHkgbGFyZ2UgYmFzZSBvZiBjdXN0b21lcnMgdGhhdCB3b3VsZCBuZWVkCit0byBhZGQgYW4gYWRkaXRpb25hbCBsaWJyYXJ5IGVudHJ5IGZvciB0aGVpciBzb3VyY2UgZm9sZGVyLgorPHA+SXQgd291bGQgYmUgc2ltcGxlIHRvIHdyaXRlIGEgcGx1Zy1pbiB0aGF0IGRldGVjdGVkIGFuZCBmaXhlZCB1cCB0aGUKK0phdmEgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBhcyByZXF1aXJlZC4gQnkgdGhlIHNhbWUgdG9rZW4sIHRoZSBzYW1lCittZWNoYW5pc20gY291bGQgYmUgYnVpbHQgaW4gdG8gdGhlIEphdmEgVUkuIElmIHRoZSB1c2VyIGludHJvZHVjZXMgYSByZXNvdXJjZQorZmlsZXMgaW50byBhIHNvdXJjZSBmb2xkZXIgdGhhdCBoYWQgbm9uZSBhbmQgdGhlcmUgaXMgbm8gbGlicmFyeSBlbnRyeQorZm9yIHRoYXQgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGgsIGFzayB0aGUgdXNlciB3aGV0aGVyIHRoZXkgaW50ZW5kCit0aGlzIHJlc291cmNlIGZpbGUgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCis8cD4oSlcgYmVsaWV2ZXMgdGhhdCBXU0FEIHdpbGwgYmUgYWJsZSB0byByb2xsIHdpdGggdGhpcyBwdW5jaC4pCis8cD5bUmV2aXNlZCBwcm9wb3NhbDogUmV0YWluIGNvcHlpbmcgZnJvbSBzb3VyY2UgdG8gb3V0cHV0IGZvbGRlciB3aGVyZQorbmVjZXNzYXJ5LgorPHVsPgorPGxpPgorU291cmNlIGZvbGRlciBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgZm9sZGVyLCBubyBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOgorY29weSByZXNvdXJjZXMgZnJvbSBzb3VyY2UgZm9sZGVyIHRvIG91dHB1dCBmb2xkZXIgKGN1cnJlbnQgYmVoYXZpb3IpLjwvbGk+CisKKzxsaT4KK1NvdXJjZSBmb2xkZXIgZGlmZmVyZW50IGZyb20gb3V0cHV0IGZvbGRlciwgYWRkaXRpb25hbCBzb3VyY2UgZm9sZGVyczoKK2NvcHkgcmVzb3VyY2VzIGZyb20gYWxsIHNvdXJjZSBmb2xkZXJzIHRvIG91dHB1dCBmb2xkZXIgaG9ub3JpbmcgYnVpbGQKK2NsYXNzcGF0aCBvcmRlcmluZyAoY3VycmVudCBiZWhhdmlvcikuPC9saT4KKworPGxpPgorU291cmNlIGZvbGRlciBzYW1lIGFzIG91dHB1dCBmb2xkZXIsIGFuZCBubyBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOgorbm8gY29weWluZyAoY3VycmVudCBiZWhhdmlvcikuPC9saT4KKworPGxpPgorU291cmNlIGZvbGRlciBzYW1lIGFzIG91dHB1dCBmb2xkZXIsIGFuZCBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOiBlcnJvcgorKG5ldyBiZWhhdmlvcikuPC9saT4KKzwvdWw+CitUaGlzIGVsaW1pbmF0ZXMgdGhlIHNjcmV3IGNhc2Ugd2hlcmUgcmVzb3VyY2VzIGdldCBjb3BpZWQgZnJvbSBvbmUgc291cmNlCitmb2xkZXIgaW50byBhbm90aGVyIHNvdXJjZSBmb2xkZXIsIHBvc3NpYmx5IG92ZXJ3cml0aW5nIGNsaWVudCBkYXRhLl0KKzxoMz4KKzxhIE5BTUU9Ik1pbmltaXplIHRoZSBvcHBvcnR1bml0eSBmb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMgdG8gaGF2ZSBiYWQgZWZmZWN0cyI+PC9hPk1pbmltaXplCit0aGUgb3Bwb3J0dW5pdHkgZm9yIG9ic29sZXRlIGNsYXNzIGZpbGVzIHRvIGhhdmUgYmFkIGVmZmVjdHM8L2gzPgorVGhlIEphdmEgY29tcGlsZXIgc2hvdWxkIG1pbmltaXplIHRoZSBvcHBvcnR1bml0eSBmb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMKK3RvIGhhdmUgYmFkIGVmZmVjdHMuCis8cD5Db25zaWRlciB0aGUgZm9sbG93aW5nIHdvcmtzcGFjZToKKzxwPkphdmEgcHJvamVjdCBwMS8KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMxLmphdmEge3BhY2thZ2UgY29tLmV4YW1wbGU7CitwdWJsaWMgY2xhc3MgQzEge319Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMyLmphdmEge3BhY2thZ2UgY29tLmV4YW1wbGU7CitwdWJsaWMgY2xhc3MgQzIgZXh0ZW5kcyBTZWNvbmRhcnkge30pCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYi9jb20vZXhhbXBsZS8gKGxpYnJhcnkgZm9sZGVyIG9uIGJ1aWxkIGNsYXNzcGF0aCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQzEuY2xhc3Mge2Zyb20gY29tcGlsaW5nCithbiBvbGQgdmVyc2lvbiBvZiBDMS5qYXZhCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoYXQgcmVhZAorcGFja2FnZSBjb20uZXhhbXBsZTsgcHVibGljIGNsYXNzIEMxIHt9OyBjbGFzcyBTZWNvbmRhcnkge319Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMyLmNsYXNzIHtmcm9tIGNvbXBpbGluZworYW4gb2xkIGJ1dCB1bmNoYW5nZWQgdmVyc2lvbiBvZiBDMi5qYXZhfQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBTZWNvbmRhcnkuY2xhc3Mge2Zyb20gY29tcGlsaW5nCithbiBvbGQgYnV0IHVuY2hhbmdlZCB2ZXJzaW9uIG9mIEMyLmphdmF9Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguY2xhc3Mge2Zyb20gY29tcGlsaW5nCitRdXV4LmphdmF9Cis8cD5Bc3N1bWUgdGhlIHNvdXJjZSBmb2xkZXIgcHJlY2VkZXMgdGhlIGxpYnJhcnkgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGgKKyhzb3VyY2VzIHNob3VsZCBhbHdheXMgcHJlY2VkZSBsaWJyYXJpZXMpLgorPHA+V2hlbiB0aGUgY29tcGlsZXIgaXMgY29tcGlsaW5nIGJvdGggQzEuamF2YSBhbmQgQzIuamF2YSwgaXQgc2hvdWxkIG5vdAorc2F0aXNmeSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBjb20uZXhhbXBsZS5TZWNvbmRhcnkgdXNpbmcgdGhlIGV4aXN0aW5nCitTZWNvbmRhcnkuY2xhc3MgYmVjYXVzZSB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGVzIHNob3dzIHRoYXQgU2Vjb25kYXJ5LmNsYXNzCitpcyBjbGVhcmx5IGFuIG91dHB1dCBmcm9tIGNvbXBpbGluZyBDMS5qYXZhLCBub3QgYW4gaW5wdXQuIEluIGdlbmVyYWwsCit0aGUgY29tcGlsZXIgc2hvdWxkIGlnbm9yZSBsaWJyYXJ5IGNsYXNzIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byBzb3VyY2UKK2ZpbGVzIHdoaWNoIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZWNvbXBpbGVkLiAoSW4gdGhpcyBjYXNlLCBvbmx5CitRdXV4LmNsYXNzIGlzIGF2YWlsYWJsZSB0byBzYXRpc2Z5IHJlZmVyZW5jZXMuKSBUaGUgSmF2YSBidWlsZGVyIGRvZXMgbm90CitkbyB0aGlzLgorPHA+QXJndWFibHksIHRoZSBjdXJyZW50IGJlaGF2aW9yIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgYnVnLiAoamF2YWMgMS40CisoYmV0YSkgaGFzIHRoaXMgYnVnIHRvby4pIEZpeGluZyB0aGlzIGJ1ZyBzaG91bGQgbm90IGJlIGEgYnJlYWtpbmcgY2hhbmdlLgorPHA+V2hlbiB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQgaW4gYSBjbGFzcyBmaWxlLCB0aGVyZQoraXMgbm8gY2hvaWNlIGJ1dCB0byB1c2UgaXQuCis8cD5bUmV2aXNlZCBwcm9wb3NhbDogTWFpbnRhaW4gY3VycmVudCBiZWhhdmlvci5dCis8aDM+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+TGlicmFyeSBDb3B5aW5nIFByb3Bvc2FsPC9mb250PjwvaDM+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+VGhlIHByb3Bvc2FsIGlzIHRvIGFycmFuZ2UgdG8gY29weSBjbGFzcyBmaWxlcyBmcm9tCithIGNlcnRhaW4gbGlicmFyeSBmb2xkZXIgaW50byB0aGUgb3V0cHV0IGZvbGRlci4gVGhlIGxpYnJhcnkgZm9sZGVyIHdvdWxkCitoYXZlIHRvIGJlIHJlcHJlc2VudGVkIGJ5IGEgbGlicmFyeSBjbGFzc3BhdGggZW50cnkgc28gdGhhdCB0aGUgY29tcGlsZXIKK2NhbiBmaW5kIGFueSBjbGFzcyBmaWxlcyBpdCBuZWVkcyB0byBjb21waWxlIHNvdXJjZSBmaWxlcy4gQ29weWluZyB0aGUKK2NsYXNzIGZpbGVzIHRvIHRoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIHVuaXRlIHRoZW0gd2l0aCB0aGUgY2xhc3MgZmlsZXMKK2dlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuIFNpbmNlIHRoZXJlIG1heSBiZSBzb3VyY2UgY29kZSBpbiB0aGUgc291cmNlCitmb2xkZXIgY29ycmVzcG9uZGluZyB0byBzb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciwgdGhlCitidWlsZGVyIHNob3VsZCBvbmx5IHVzZSBhIGNsYXNzIGZpbGUgd2hlbiBzb3VyY2UgaXMgYXZhaWxhYmxlLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5EZXNpcmVkIHNlbWFudGljczo8L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+UyAoc291cmNlIGZvbGRlcik8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkwgKGxpYnJhcnkgZm9sZGVyKTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+TyAob3V0cHV0IGZvbGRlcik8L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW52YXJpYW50OjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj54LmNsYXNzIGluIE8gPTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIHNvbWUgeS5qYXZhIGluIFMgZ2VuZXJhdGVzCit4LmNsYXNzIHRoZW48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB4LmNsYXNzCitmcm9tIGNvbXBpbGluZyB4LmphdmEgaW4gUzwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGVsc2U8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZgoreC5jbGFzcyBpbiBMIHRoZW48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworeC5jbGFzcyBpbiBMPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZWxzZTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Citub25lPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZW5kaWY8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBlbmRpZjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5GdWxsIGJ1aWxkcyBhY2hpZXZlIGludmFyaWFudC48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkluY3JlbWVudGFsIGJ1aWxkcyBtYWludGFpbiBpbnZhcmlhbnQuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkZ1bGwgYnVpbGQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgU2NydWIgYWxsIGNsYXNzIGZpbGVzIGZyb20KK08uPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZSBhbGwgc291cmNlIGZpbGVzIGluCitTIGludG8gY2xhc3MgZmlsZXMgaW4gTy48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBJbmZpbGwvY29weSBhbGwgY2xhc3MgZmlsZXMKK2Zyb20gTCB0byBPIChubyBvdmVyd3JpdGluZykuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkluY3JlbWVudGFsIGJ1aWxkOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChwaGFzZSAxKSBwcm9jZXNzIGFsbCBjaGFuZ2VzCit0byBMOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgorZGVsZXRlIG9yIGNoYW5nZSB4LmNsYXNzIGluIEw8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZgoreC5jbGFzcyBpbiBPIHdhcyBub3QgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVyIHRoZW4gc2NydWIgeC5jbGFzcyBmcm9tIE88L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKK2FkZCBvciBjaGFuZ2UgeC5jbGFzcyB0byBMPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3JlbWVtYmVyIHRvIGluZmlsbCB4LmNsYXNzPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDIpIHByb2Nlc3MgbmVnYXRpdmUKK2NoYW5nZXMgdG8gUzo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKK2RlbGV0ZSBvciBjaGFuZ2UgeS5qYXZhIGZyb20gUzwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitzY3J1YiBhbnkgY2xhc3MgZmlsZSB4LmNsYXNzIGZyb20gTyB0aGF0IHkuamF2YSBjb21waWxlZCBpbnRvPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3JlbWVtYmVyIHRvIGluZmlsbCB4LmNsYXNzPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDMpIHByb2Nlc3MgcG9zaXRpdmUKK2NoYW5nZXMgdG8gUzo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKK2FkZCBvciBjaGFuZ2UgeS5qYXZhIGZyb20gUzwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Citjb21waWxlIHkuamF2YSBpbnRvIE88L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgNCkgSW5maWxsL2NvcHkgaW5kaWNhdGVkCitjbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5XZSB3aWxsIGxvb2sgYXQgd2F5cyB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGJlaGF2aW9yCit0aGF0IGRvIG5vdCBpbnZvbHZlIGNoYW5naW5nIHRoZSBKYXZhIGJ1aWxkZXIuIFRoaXMgd291bGQgbWVhbiB0aGF0IGEgY3VzdG9tZXIKKyhzdWNoIGFzIFdTQUQpIHRoYXQgcmVxdWlyZXMgbGlicmFyeSBjb3B5aW5nIHdvdWxkIGJlIGFibGUgdG8gYWRkIGl0IHRoZW1zZWx2ZXM7CitvdGhlcndpc2UsIHdlIHdpbGwgbmVlZCB0byBjb21wbGljYXRlIHRoZSBKYXZhIGJ1aWxkZXIgKHdoaWNoIGlzIGNvbXBsZXgKK2Vub3VnaCBhcyBpdCBpcykgYW5kIGludGVncmF0ZSB0aGUgbWVjaGFuaXNtIGludG8gSkRUIENvcmUuPC9mb250PgorPGg0PgorPGZvbnQgY29sb3I9IiMwMDAwMDAiPkNvcHlpbmcgcHJlLWJ1aWxkZXI8L2ZvbnQ+PC9oND4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5Db3VsZCB0aGUgY29weWluZyBvZiBjbGFzcyBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5Citmb2xkZXIgTCB0byB0aGUgb3V0cHV0IGZvbGRlciBPIGJlIGFjY29tcGxpc2hlZCBpbiBhIHNlcGFyYXRlIGluY3JlbWVudGFsCitwcm9qZWN0IGJ1aWxkZXIgdGhhdCB3b3VsZCBydW4gPGk+YmVmb3JlPC9pPiB0aGUgSmF2YSBidWlsZGVyPzwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Bc3N1bWUgdGhlIEphdmEgYnVpbGRlciBtYW5hZ2VzIGl0cyBvd24gY2xhc3MKK2ZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFuZCBrbm93cyBub3RoaW5nIG9mIHRoZSBwcmUtYnVpbGRlci4gQ29udmVyc2VseSwKK2Fzc3VtZSB0aGF0IHRoZSBwcmUtYnVpbGRlciBoYXMgbm8gYWNjZXNzIHRvIHRoZSBpbnNpZGVzIG9mIHRoZSBKYXZhIGJ1aWxkZXIuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlByZS1jb3B5aW5nIG9mIGNsYXNzIGZpbGVzIHRvIHRoZSBvdXRwdXQgZm9sZGVyCitjYW5ub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc291cmNlIGZpbGUgZ2V0cyBkZWxldGVkIGFuZCBhIHByZS1leGlzdGluZworY2xhc3MgZmlsZSBpbiB0aGUgbGlicmFyeSBmb2xkZXIgc2hvdWxkIG5vdyB0YWtlIGl0cyBwbGFjZS4gVGhlIEphdmEgYnVpbGRlciwKK3doaWNoIHJ1bnMgbGFzdCwgZGVsZXRlcyB0aGUgY2xhc3MgZmlsZTsgdGhlIHByZS1idWlsZGVyIGhhcyBtaXNzZWQgaXRzCitjaGFuY2UgYW5kIGRvZXMgbm90IGdldCBhbiBvcHBvcnR1bml0eSB0byBmaWxsIHRoYXQgaG9sZS4gV2hlbiB0aGlzIGhhcHBlbnMKK29uIGEgZnVsbCBidWlsZCwgdGhlIGZ1bGwgYnVpbGQgZG9lcyBub3QgYWNoaWV2ZSB0aGUgaW52YXJpYW50LiBUaGlzIGlzCit1bmFjY2VwdGFibGUuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkhlcmUncyB0aGUgbmFzdHkgY2FzZTo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBTIChzb3VyY2UgZm9sZGVyKTogQmFyLmphdmEKKyhidXQgcmVjZW50bHkgaGFzIEZvby5qYXZhIGFzIHdlbGwpPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgTCAobGlicmFyeSBmb2xkZXIpOiBGb28uY2xhc3M8L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+T24gYSBmdWxsIGJ1aWxkPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgUHJlLWJ1aWxkZXIgcnVucyBmaXJzdDo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBTY3J1YnMKK0Zvby5jbGFzcyBhbmQgQmFyLmNsYXNzIGZyb20gTy48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBDb3BpZXMKK2luIEZvby5jbGFzcyBmcm9tIEwgdG8gTy48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgU2NydWJzCitGb28uY2xhc3MgZnJvbSBPIChnZW5lcmF0ZWQgYnkgSmF2YSBidWlsZGVyIGZyb20gRm9vLmphdmEgb24gbGFzdCBidWlsZCkuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZQorQmFyLmphdmEgaW50byBCYXIuY2xhc3MgTyAoRm9vLmphdmEgaXMgbm8gbG9uZ2VyIGFyb3VuZCkuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRoZSBvdXRwdXQgZm9sZGVyIHNob3VsZCBjb250YWluIGEgY29weSBvZiBGb28uY2xhc3MKK2Zyb20gTCBzaW5jZSB0aGVyZSBpcyBubyBlcXVpdmFsZW50IHNvdXJjZSBmaWxlIHRoYXQgY29tcGlsZXMgdG8gRm9vLmNsYXNzLgorSXQgZG9lc24ndC48L2ZvbnQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29weWluZyBwb3N0LWJ1aWxkZXI8L2ZvbnQ+PC9oND4KKzxmb250IGNvbG9yPSIjMDAwMDAwIj5Db3VsZCB0aGUgY29weWluZyBvZiBjbGFzcyBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5Citmb2xkZXIgdG8gdGhlIG91dHB1dCBmb2xkZXIgYmUgYWNjb21wbGlzaGVkIGluIGEgc2VwYXJhdGUgaW5jcmVtZW50YWwgcHJvamVjdAorYnVpbGRlciB0aGF0IHdvdWxkIHJ1biA8aT5hZnRlcjwvaT4gdGhlIEphdmEgYnVpbGRlcj88L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+QWdhaW4sIGFzc3VtZSB0aGUgSmF2YSBidWlsZGVyIG1hbmFnZXMgaXRzIG93bgorY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgYW5kIGtub3dzIG5vdGhpbmcgb2YgdGhlIHBvc3QtYnVpbGRlciwKK2FuZCBjb252ZXJzZWx5LjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Qb3N0LWNvcHlpbmcgb2YgY2xhc3MgZmlsZXMgdG8gdGhlIG91dHB1dCBmb2xkZXIKKyhubyBvdmVyd3JpdGluZykgY2Fubm90IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBsaWJyYXJ5IGNsYXNzIGZpbGVzIGFyZSBjaGFuZ2VkCitvciBkZWxldGVkIHNpbmNlIHRoZSBsYXN0IGJ1aWxkLCBiZWNhdXNlIHRoZSBwb3N0LWJ1aWxkZXIgaXMgbmV2ZXIgaW4gYQorcG9zaXRpb24gdG8gZGVsZXRlIG9yIG92ZXJ3cml0ZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciAodGhleQorbWlnaHQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgSmF2YSBidWlsZGVyKS4gT25jZSBsb3N0LCB0aGUgaW52YXJpYW50CitjYW5ub3QgYmUgcmVhY2hpZXZlZCBubyBtYXR0ZXIgaG93IG1hbnkgZnVsbCBidWlsZHMgeW91IGRvICh5b3UncmUgc3R1Y2sKK3dpdGggc3RhbGUgb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMpLiBUaGlzIGlzIHVuYWNjZXB0YWJsZS48L2ZvbnQ+Cis8aDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29tYmluYXRpb24gb2YgcHJlLSBhbmQgcG9zdC1idWlsZGVyPC9mb250PjwvaDQ+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q291bGQgdGhlIGNvcHlpbmcgb2YgY2xhc3MgZmlsZXMgZnJvbSB0aGUgbGlicmFyeQorZm9sZGVyIHRvIHRoZSBvdXRwdXQgZm9sZGVyIGJlIGFjY29tcGxpc2hlZCBieSBhIHBhaXIgb2Ygc2VwYXJhdGUgaW5jcmVtZW50YWwKK3Byb2plY3QgYnVpbGRlcnMgdGhhdCBydW4gb24gZWl0aGVyIHNpZGUgb2YgdGhlIEphdmEgYnVpbGRlcj88L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+QXNzdW1lIHRoZSBKYXZhIGJ1aWxkZXIgbWFuYWdlcyBpdHMgb3duIGNsYXNzCitmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBhbmQga25vd3Mgbm90aGluZyBvZiB0aGUgcHJlLWJ1aWxkZXIgYW5kIHBvc3QtYnVpbGRlciwKK2FuZCB0aGUgcHJlLSBhbmQgcG9zdC1idWlsZGVycyBoYXZlIG5vIGFjY2VzcyB0byB0aGUgaW5zaWRlcyBvZiB0aGUgSmF2YQorYnVpbGRlci48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+RnVsbCBidWlsZDo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNjcnVicworYWxsIGNsYXNzIGZpbGVzIGZyb20gTy48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgU2NydWJzCithbGwgY2xhc3MgZmlsZXMgZnJvbSBPIGdlbmVyYXRlZCBieSBKYXZhIGJ1aWxkZXIuPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZXMKK2FsbCBzb3VyY2UgZmlsZXMgaW50byBPLjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBvc3QtYnVpbGRlciBydW5zIHRoaXJkOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEluZmlsbC9jb3B5CitjbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmNyZW1lbnRhbCBidWlsZCB3aGVuIEwgY2hhbmdlczo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvcgorZGVsZXRlIG9yIGNoYW5nZSB4LmNsYXNzIGluIEw8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworRG9lcyBub3RoaW5nIChGQUlMcyBpZiBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlKTwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvcgorYWRkIHguY2xhc3MgdG8gTDwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitJbmZpbGwvY29weSBGb28uY2xhc3MgZnJvbSBMIHRvIE8gKG5vIG92ZXJ3cml0aW5nKS48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgUmVjb21waWxlcworY2xhc3NlcyB0aGF0IGRlcGVuZCBvbiBhZmZlY3RlZCBjbGFzcyBmaWxlcyBpbiBMLjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBvc3QtYnVpbGRlciBydW5zIHRoaXJkOjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEluZmlsbC9jb3B5CitjbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmNyZW1lbnRhbCBidWlsZCAtIGNoYW5nZXMgdG8gc291cmNlIGZvbGRlcjo8L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IERvZXMKK25vdGhpbmcgc2luY2UgbGlicmFyeSBkaWQgbm90IGNoYW5nZS48L2ZvbnQ+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZXMKK3NvdXJjZSBmaWxlcyBpbnRvIE8uPC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgUG9zdC1idWlsZGVyIHJ1bnMgdGhpcmQ6PC9mb250PgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkKK2NsYXNzIGZpbGVzIGZyb20gTCB0byBPIChubyBvdmVyd3JpdGluZykuPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkFuIGluY3JlbWVudGFsIGJ1aWxkIG1heSBmYWlsIGluIHRoZSBjYXNlIG9mIGEKK2xpYnJhcnkgY2xhc3MgZmlsZSBiZWluZyBjaGFuZ2VkIG9yIGRlbGV0ZWQsIGxlYWRpbmcgdG8gc3RhbGUgb3Igb2Jzb2xldGUKK2NsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyLiBGb3J0dW5hdGVseSwgYSBmdWxsIGJ1aWxkIGFsd2F5cyBhY2hpZXZlcwordGhlIGludmFyaWFudCwgYW5kIGNhbiBiZSB1c2VkIHRvIHJlcGFpciB0aGUgZGFtYWdlIGR1ZSB0byBjaGFuZ2VzIHRvIHRoZQorbGlicmFyeS48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U28gd2hpbGUgdGhlIGNvbWJpbmF0aW9uIG9mIHByZS0gYW5kIHBvc3QtYnVpbGRlcnMKK2lzIG5vdCBwZXJmZWN0LCBpdCBkb2VzIHdvcmsgaW4gbWFueSBjYXNlcy4gSWYgdGhlIHVzZXIgY291bGQgZG8gYSBmdWxsCitidWlsZCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBmb2xkZXIsIHRoZXkgd291bGQgYXZvaWQgYWxsCit0aGUgcHJvYmxlbXMuIFRoZSBzb2x1dGlvbiBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFueXRoaW5nCitzcGVjaWFsIGZyb20gdGhlIEphdmEgQ29yZSAoaS5lLiwgV1NBRCBzaG91bGQgYmUgYWJsZSB0byBpbXBsZW1lbnQgaXQgdGhlbXNlbHZlcykuPC9mb250PgorPGgzPgorPGZvbnQgY29sb3I9IiMwMDAwMDAiPlJlc291cmNlcyBpbiBPdXRwdXQgRm9sZGVyPC9mb250PjwvaDM+Cis8Zm9udCBjb2xvcj0iIzAwMDAwMCI+V2hlbiB0aGUgc291cmNlIGZvbGRlciBhbmQgb3V0cHV0IGZvbGRlciBjb2luY2lkZSwKK3RoZXJlIGlzIG5vIHByb2JsZW0ga2VlcGluZyByZXNvdXJjZSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBzaW5jZSB0aGV5CithcmUgbm90IGF0IHJpc2sgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gKG5vIHdpdGggdGhlIHByb3Bvc2VkIGNoYW5nZSB0byBkaXNhYmxlCityZXNvdXJjZSBjb3B5aW5nIHdoZW4gdGhlIHNvdXJjZSBmb2xkZXIgYW5kIG91dHB1dCBmb2xkZXIgY29pbmNpZGUpLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5XaGVuIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBvdXRwdXQgZm9sZGVyIGRvIG5vdAorY29pbmNpZGUsIGtlZXBpbmcgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgb24gYSBwZXJtYW5lbnQgYmFzaXMKK2VuY291bnRlcnMgdHdvIGlzc3Vlczo8L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+KDEpIFRoZSBmaXJzdCBpc3N1ZSBpcyB0aGF0IG91dHB1dCBmb2xkZXIgaGFzCitubyBwcmVzZW5jZSBpbiB0aGUgcGFja2FnZXMgdmlldy4gQW55IHJlc291cmNlcyB0aGF0IHBlcm1hbmVudGx5IHJlc2lkZWQKK2luIHRoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIHRoZXJlZm9yZSBiZSBpbnZpc2libGUgZHVyaW5nIHJlZ3VsYXIgSmF2YSBkZXZlbG9wbWVudC4KK09uZSB3b3VsZCBoYXZlIHRvIHN3aXRjaCB0byB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yIHZpZXcgdG8gYWNjZXNzIHRoZW0uPC9mb250PgorPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRoZSBwYWNrYWdlcyB2aWV3IG9ubHkgc2hvd3MgcmVzb3VyY2UgZmlsZXMgaW4KK3NvdXJjZSBhbmQgbGlicmFyeSBmb2xkZXJzLiBDaGFuZ2luZyB0aGUgcGFja2FnZXMgdmlldyB0byBzaG93IHJlc291cmNlcworaW4gdGhlIG91dHB1dCBmb2xkZXIgaXMgaW5mZWFzaWJsZS4gSW5jbHVkaW5nIHRoZSBvdXRwdXQgZm9sZGVyIG9uIHRoZQorY2xhc3NwYXRoIGFzIGEgbGlicmFyeSBmb2xkZXIgd2FzIGRpc2N1c3NlZCBhdCBsZW5ndGggYWJvdmUgYW5kIGlzIG91dAorb2YgdGhlIHF1ZXN0aW9uLiBJbmNsdWRpbmcgdGhlIG91dHB1dCBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aCBhcyBhIHNvdXJjZQorZm9sZGVyIGlzIGFuIG9wdGlvbiAoaW4gZmFjdCwgaXQncyBleGFjdGx5IHdoYXQgeW91IGdldCB3aGVuIHlvdXIgc291cmNlCithbmQgb3V0cHV0IGZvbGRlcnMgY29pbmNpZGUpLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj4oMikgVGhlIHNlY29uZCBpc3N1ZSBpcyB0aGF0IHJlc291cmNlIGZpbGVzIGluCit0aGUgb3V0cHV0IGZvbGRlciBhcmUgaW4gaGFybSdzIHdheSBvZiByZXNvdXJjZXMgb2YgdGhlIHNhbWUgbmFtZSBiZWluZworY29waWVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JZiByZXNvdXJjZXMgZXhpc3RpbmcgaW4gdGhlIG91dHB1dCBmb2xkZXIgYXJlCitnaXZlbiBwcmVjZWRlbmNlIG92ZXIgdGhlIG9uZXMgaW4gc291cmNlIGZvbGRlcnMsIHRoZW4gdGhlIG9uZXMgZnJvbSBzb3VyY2UKK2ZvbGRlcnMgd291bGQgb25seSBiZSBjb3BpZWQgb25jZSBhbmQgbmV2ZXJtb3JlIG92ZXJ3cml0dGVuLiBDb3BpZXMgaW4KK3RoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIGdldCBzdGFsZSBvciBvYnNvbGV0ZTsgYXV0b21hdGljIGNsZWFudXAgd291bGQKK25vdCBiZSBwb3NzaWJsZS48L2ZvbnQ+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+T24gdGhlIG90aGVyIGhhbmQsIGlmIHJlc291cmNlcyBleGlzdGluZyBpbiBzb3VyY2UKK2ZvbGRlcnMgYXJlIGdpdmVuIHByZWNlZGVuY2Ugb3ZlciB0aGUgb25lcyBpbiB0aGUgb3V0cHV0IGZvbGRlcnMsIHRoZW4KK29uZSB0aGF0IGV4aXN0cyBvbmx5IGluIHRoZSBvdXRwdXQgZm9sZGVycyB3b3VsZCBiZSBwZXJtYW5lbnRseSBsb3N0IGlmCithIHJlc291cmNlIGJ5IHRoZSBzYW1lIG5hbWUgd2FzIGV2ZXIgdG8gYmUgY3JlYXRlZCBpbiBhIHNvdXJjZSBmb2xkZXIuCitJdCBpcyBhIGRhbmdlcm91cyBwcmFjdGljZSB0byBhbGxvdyB0aGUgdXNlciB0byBzdG9yZSBpbXBvcnRhbnQgZGF0YSBpbgorYSBwbGFjZSB0aGF0IGNvdWxkIGJlIGNsb2JiZXJlZCBieSBhbiBhdXRvbWF0aWMgbWVjaGFuaXNtIHRoYXQgdXN1YWxseQorb3BlcmF0ZXMgdW5zZWVuIHRvIHRoZSB1c2VyLjwvZm9udD4KKzxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Db25jbHVzaW9uOiBLZWVwaW5nIHJlc291cmNlIGZpbGVzIGluIHRoZSBvdXRwdXQKK2ZvbGRlciBvbiBhIHBlcm1hbmVudCBiYXNpcyBpcyBub3Qgd2VsbCBzdXBwb3J0ZWQgYXQgdGhlIFVJLCBhbmQgc2hvdWxkCitvbmx5IGJlIGRvbmUgaWYgdGhlIHJlc291cmNlIGZpbGVzIGNhbiBiZSBjb25zaWRlcmVkIGV4cGVuZGFibGUuPC9mb250PgorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9wbHVnZ2FibGUgamRrcy9wbHVnZ2FibGUtamRrcy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9wbHVnZ2FibGUgamRrcy9wbHVnZ2FibGUtamRrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTYzODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3BsdWdnYWJsZSBqZGtzL3BsdWdnYWJsZS1qZGtzLmh0bWwKQEAgLTAsMCArMSwyMjUgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iQnVpbGQiPgorICAgPHRpdGxlPkpEVCAtIFBsdWdnYWJsZSBKREtzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDI+CitQbHVnZ2FibGUgSkRLczwvaDI+CitMYXN0IHJldmlzZWQgMTE6NDUgRnJpZGF5IE9jdG9iZXIgMTksIDIwMDEKKzxwPldvcmsgaXRlbTogcGx1Z2dhYmxlIEpES3MKKzxwPlJlbGF0ZWQgd29yayBpdGVtOiAiU3VwcG9ydCBmb3IgZGVhbGluZyB3aXRoIGNsYXNzIGZpbGVzIGdlbmVyYXRlZCBieQorZXh0ZXJuYWwgSmF2YSBjb21waWxlcnMgbGlrZSBqYXZhYyBhbmQgamlrZXMgZnJvbSBhbiBBbnQgc2NyaXB0LiIKKzxwPlJlbGF0ZWQgaXNzdWU6IHJlbW90ZSBidWlsZHMKKzxwPk90aGVyIElERXMgY2FuIGNsYWltIHRoYXQgd2hlbiBTdW4gb3IgSUJNIHJlbGVhc2VzIGEgbmV3IEpESywgYSBkZXZlbG9wZXIKK2NhbiBqdXN0ICJwbHVnIGl0IGluIiB0byB0aGVpciBJREUuIFdlIHdvdWxkIGxpa2UgRWNsaXBzZSB0byBiZSBzaW1pbGFybHkKK2ZsZXhpYmxlLCBhbmQgYmUgYWJsZSB0byBtYWtlIGEgc2ltaWxhciBjbGFpbS4KKzxwPkluIHByYWN0aWNlLCB3aGF0IGRvZXMgdGhpcyBtZWFuPyBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgYXNwZWN0cy4KKzxvbD4KKzxsaT4KK1RoZSBhYmxpbGl0eSB0byBydW4gSmF2YSBwcm9ncmFtcyB3aXRoIHRoZSBKREsncyBKUkUuPC9saT4KKworPGxpPgorVGhlIGFibGlsaXR5IHRvIGNvbXBpbGUgSmF2YSBzb3VyY2UgY29kZSBhZ2FpbnN0IHRoZSBKREsncyBjbGFzcyBsaWJyYXJpZXMuPC9saT4KKworPGxpPgorVGhlIGFibGlsaXR5IHRvIGNvbXBpbGUgSmF2YSBzb3VyY2UgY29kZSB3aXRoIHRoZSBKREsncyBqYXZhYyBjb21waWxlci48L2xpPgorCis8bGk+CitUaGUgYWJsaWxpdHkgdG8gZGVidWcgSmF2YSBwcm9ncmFtcyB3aXRoIHRoZSBKREsncyBKRFBBIGFuZCBKVk0uPC9saT4KKworPGxpPgorVGhlIGFibGlsaXR5IHRvIGJyb3dzZSB0aGUgSkRLJ3MgY2xhc3MgbGlicmFyeSBBUEkgamF2YWRvYyAob3IgcGVyaGFwcworb3RoZXIgcmVsZWFzZSBkb2MpLjwvbGk+CisKKzxsaT4KK1RoZSBhYmxpbGl0eSB0byBydW4gdGhlIEpESydzIHV0aWxpdHkgcHJvZ3JhbXMgbGlrZSBqYXZhcCwgamF2YWRvYywgamF2YWguPC9saT4KKzwvb2w+CitXZSB3aWxsIHRha2UgdGhlIGZpcnN0IGZvdXIgYXMgdGhlIG1vc3QgaW1wb3J0YW50IG9uZXMgZm9yIEVjbGlwc2UgdG8gYWRkcmVzcywKK2FuZCBsb29rIGF0IGVhY2ggaW4gdHVybi4KKzxoMz4KK1BsdWdnYWJsZSBKUkVzPC9oMz4KK1RoaXMgaXMgc3VwcG9ydGVkIGluIEVjbGlwc2UgMS4wLgorPHA+VGhlIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcgcGx1Zy1pbiBwcm92aWRlcyBwbHVnZ2FibGUgc3VwcG9ydCAoInZtSW5zdGFsbFR5cGVzIgorZXh0ZW5zaW9uIHBvaW50KSBmb3IgZGVzY3JpYmluZyBpbnN0YWxsZWQgSmF2YTItc3R5bGUgSmF2YSBydW50aW1lIGVudmlyb25tZW50cworYW5kIGxhdW5jaGluZyBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb25zIG9mIGEgSmF2YSB2aXJ0dWFsIG1hY2hpbmUuCis8cD5KRFQgZGVmaW5lcyBhIHdvcmtiZW5jaCBwcmVmZXJlbmNlICgiSW5zdGFsbGVkIEphdmEgUnVudGltZSBFbnZpcm9ubWVudHMiKQorc28gdGhhdCB0aGUgdXNlciBjYW4gY3JlYXRlLCByZW1vdmUsIGFuZCBlZGl0IEpSRSBkZWZpbml0aW9ucyAoaS5lLiwgaW5zdGFuY2VzCitvZiB0aGUga25vd24gVk0gaW5zdGFsbGVkIHR5cGVzKS4gVGhlIHVzZXIgY2hvb3NlcyB3aGljaCBvbmUgb2YgdGhlIEpSRQorZGVmaW5pdGlvbnMgaXMgdGhlIGRlZmF1bHQuCis8cD5KRFQgYWxzbyBkZWZpbmVzIGEgSlJFIHByb3BlcnR5IGZvciBlYWNoIEphdmEgcHJvamVjdCB0byBjb250cm9sIHdoaWNoCitKUkUgaXMgdXNlZCB0byBydW4gcHJvZ3JhbXMgaW4gdGhhdCBwcm9qZWN0LiBCeSBkZWZhdWx0LCBlYWNoIHByb2plY3Qgc2hhcmVzCit0aGUgd29ya3NwYWNlLXdpZGUgZGVmYXVsdC4gVGhlIHVzZXIgY2FuIGVsZWN0IHRvIHNwZWNpZnkgYSBKUkUgZm9yIHRoYXQKK3Byb2plY3QsIHdoaWNoIG92ZXJyaWRlcyB0aGUgd29ya3NwYWNlLXdpZGUgZGVmYXVsdC4KKzxoMz4KK1BsdWdnYWJsZSBKREsgY2xhc3MgbGlicmFyaWVzPC9oMz4KK1RoaXMgaXMgc3VwcG9ydGVkIGluIEVjbGlwc2UgMS4wLgorPHA+SkRUIENvcmUgcHJvdmlkZXMgYSByZXNlcnZlZCBidWlsZCBjbGFzc3BhdGggdmFyaWFibGUsIG5hbWVkICJKUkVfTElCIiwKK3doaWNoIGdldHMgYm91bmQgdG8gdGhlIEpBUiBsaWJyYXJ5IChhbmQgYXNzb2NpYXRlZCBzb3VyY2UgY29kZSBaSVApIG9mCit0aGUgY3VycmVudCB3b3Jrc3BhY2Utd2lkZSBkZWZhdWx0IEpSRSAoZS5nLiwgIkQ6XGpkazEuNFxqcmVcbGliXHJ0LmphciIKK3dpdGggc291cmNlIGluICJEOlxqZGsxLjRcc3JjLnppcCIpLiBCeSBkZWZhdWx0LCBhIGNsYXNzcGF0aCBlbnRyeSBpcyBpbmNsdWRlZAorb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBvZiBhIG5ld2x5IGNyZWF0ZWQgcHJvamVjdC4gVGhpcyBsaWJyYXJ5IHdvdWxkIG9yZGluYXJpbHkKK3N1cHBseSB0aGUgY29tcGlsZS10aW1lIGRlZmluaXRpb25zIG9mIHRoZSBzdGFuZGFyZCBjbGFzcyBsaWJyYXJpZXMgdXNlZAord2hlbiBicm93c2luZyBhbmQgYnVpbGRpbmcgYSBKYXZhIHByb2plY3QuCis8cD5UaGUgY2xpZW50IHRoYXQgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoaXMgdmFyaWFibGUgaXMgZnJlZSB0byByZW1vdmUKK3RoZSBjbGFzc3BhdGggZW50cnkgZnJvbSB0aGUgYnVpbGQgY2xhc3NwYXRoIGFuZCByZXBsYWNlIGl0IHdpdGggc29tZXRoaW5nCitlbHNlLiBUaGUgY2xpZW50IGNvdWxkIGRlY2xhcmUgdGhlaXIgb3duIGJ1aWxkIGNsYXNzcGF0aCB2YXJpYWJsZSwgYmluZAoraXQgdG8gYSBzdWl0YWJsZSB2YWx1ZSwgYW5kIGluY2x1ZGUgdGhhdCBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIGluc3RlYWQKKyhGb3IgaW5zdGFuY2UsIFZBTUUvV1NERCBkZWNsYXJlcyBhIGNsYXNzcGF0aCB2YXJpYWJsZSBuYW1lZCAiSVZKX0hPTUUiCithbmQgcmVmZXJlbmNlcyZuYnNwOyB2YXJpb3VzIGNsYXNzIGxpYnJhcmllcyByZWxhdGl2ZSB0byBpdDsgZS5nLiwgIklWSl9IT01FL2xpYi9qY2xtYXguamFyIi4pCitPciB0aGV5IGNvdWxkIGp1c3QgaGFyZC13aXJlIGEgbGlicmFyeSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIEpSRSBsaWJyYXJ5LgorPHA+V2hpbGUgdGhlIGJhc2ljIG1lY2hhbmlzbSBpcyByZWFzb25hYmxlLCBpdCBpcyB1bmZvcnR1bmF0ZSB0aGF0IGl0IGlzCit0aWVkIHNvIHRpZ2h0bHkgdG8gdGhlIGRlZmF1bHQgSlJFLiBJdCBtaWdodCBiZSBtb3JlIGNvbnZlbmllbnQgaWYgc2VsZWN0aW5nCithIGRpZmZlcmVudCB3b3Jrc3BhY2Utd2lkZSBkZWZhdWx0IEpSRSBkZWZpbml0aW9uIHdvdWxkIHByb21wdCB0aGUgdXNlcgordG8gY2hhbmdlIHRoZSBKUkVfTElCIGNsYXNzcGF0aCB2YXJpYWJsZSBhcyB3ZWxsLgorPHA+UGFyYWxsZWxpbmcgdGhlIHdvcmtiZW5jaCBKUkUgbWVjaGFuaXNtLCB3ZSBjb3VsZCBjb25zaWRlciBhbGxvd2luZwordGhlIHVzZXIgdG8gc3BlY2lmeSBjbGFzc3BhdGggdmFyaWFibGUgYmluZGluZ3MgYXQgdGhlIHByb2plY3QgbGV2ZWwgdGhhdAorb3ZlcnJpZGUgdGhlIHdvcmtzcGFjZS13aWRlIGRlZmF1bHQuIFRoaXMgd291bGQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlCit0aGUgYmluZGluZyB0byBhZmZlY3QganVzdCB0aGF0IHByb2plY3QuIFNvbWV0aGluZyBzaW1pbGFyIGNhbiBhbHJlYWR5CitiZSBhY2hpZXZlZCBieSB1c2luZyBkaXN0aW5jdGx5LW5hbWVkIGNsYXNzcGF0aCB2YXJpYWJsZXMgZm9yIGVhY2ggcHJvamVjdAorKGUuZy4sICJQMV9KUkVfTElCIiBmb3IgcHJvamVjdCBQMSdzICJKUkVfTElCIikuIFNvIGl0J3MgdW5jbGVhciB3aGV0aGVyCithbnkgaW50ZXJlc3RpbmcgbmV3IHVzZWNhc2VzIHdvdWxkIGJlIHN1cHBvcnRlZCBieSB0aGlzLgorPGgzPgorUGx1Z2dhYmxlIEphdmEgY29tcGlsZXJzPC9oMz4KK0phdmEgY29tcGlsZXJzIGNhbiBkaWZmZXIgYWxvbmcgbWFueSBheGVzOgorPHVsPgorPGxpPgorc3VwcG9ydGVkIEphdmEgbGFuZ3VhZ2UgbGV2ZWw8L2xpPgorCis8bGk+CitKYXZhIGJ5dGVjb2RlIHZlcnNpb248L2xpPgorCis8bGk+CitxdWFsaXR5IG9mIGdlbmVyYXRlZCBjb2RlPC9saT4KKworPGxpPgoraGVscGZ1bG5lc3Mgb2YgZXJyb3IgbWVzc2FnZXM8L2xpPgorCis8bGk+CitwZXJmb3JtYW5jZTwvbGk+CisKKzxsaT4KK3JvYnVzdG5lc3M8L2xpPgorCis8bGk+Citwcm9kdWN0IHN1cHBvcnQgZm9yIGNvbXBpbGVyPC9saT4KKzwvdWw+CitJbiB0aGUgc2ltcGxlIHdvcmxkIG9mIHRoZSBjb21tYW5kIGxpbmUgY29tcGlsZXIsIGl0J3MgZWFzeSB0byB1c2Ugd2hhdGV2ZXIKK0phdmEgY29tcGlsZXIgeW91IGNob29zZSB0byB1c2UuIFRoZSBjb21tYW5kIGxpbmVzIGFyZSBzdWJzdGFudGlhbGx5IHRoZQorc2FtZSwgYW5kIHRoZSBvdmVydCBjb21waWxlciBiZWhhdmlvciBvZiB0cmFuc2xhdGluZyAuamF2YSBzb3VyY2UgZmlsZXMKK3RvIC5jbGFzcyBmaWxlcyBpcyB1dHRlcmx5IHN0YW5kYXJkLgorPHA+SW4gYWRkaXRpb25hbCB0byB0aGUgYmFzaWMgY29tcGlsZXIgZnVuY3Rpb25hbGl0eSwgdGhlcmUgYXJlIHVzdWFsbHkKK2EgbnVtYmVyIG9mIElERSBmZWF0dXJlcyB0aGF0IGFsc28gbmVlZCB0byBiZSAibGFuZ3VhZ2UgYXdhcmUiICh0byBzb21lCitleHRlbnQpLCBpbmNsdWRpbmc6Cis8dWw+Cis8bGk+Citzb3VyY2UgY29kZSBlZGl0aW5nIChzeW50YXggaGlnaGxpZ2h0aW5nKTwvbGk+CisKKzxsaT4KK2NvZGUgYXNzaXN0IChjb21wbGV0aW9uLCBzZWxlY3Rpb24pPC9saT4KKworPGxpPgorY29kZSByZWZvcm1hdHRlcjwvbGk+CisKKzxsaT4KK3NlYXJjaDwvbGk+Cis8L3VsPgorVGhlIGxhbmd1YWdlIGF3YXJlIGZlYXR1cmVzIHJlcXVpcmUgY29tcGlsZXIgaW5mcmFzdHJ1Y3R1cmUgKGUuZy4sIGEgc2Nhbm5lcikuCis8cD5UaGUgc3RhbmRhcmQgU3VuIEphdmEgY29tcGlsZXIgaGFzIG5vIG9mZmljaWFsIEFQSXM7IHRoZSBjb21waWxlciBpbmZyYXN0cnVjdHVyZQoraXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHRoZSBjb21waWxlci4gVGhpcyBtZWFucyB0aGF0IEphdmEgSURFcyBoYXZlIG5vCitjaG9pY2UgYnV0IHRvIHJlaW1wbGVtZW50IHdoYXRldmVyIGNvbXBpbGVyIGluZnJhc3RydWN0dXJlIHRoZXkgbWlnaHQgbmVlZC4KK1dpdGhvdXQgc3RhbmRhcmQgSmF2YSBjb21waWxlciBBUElzLCBubyBKYXZhIElERSBjYW4gYmUgdHJ1ZWx5IHBsdWdnYWJsZQoraW4gdGhlc2UgcmVnYXJkcy4gVGhlIGJlc3QgdGhhdCBhIEphdmEgSURFIGNhbiBkbyBpbiB0aGUgY2lyY3Vtc3RhbmNlcworaXMgdG8gdXNlIGEgcGx1Z2dhYmxlIEphdmEgY29tcGlsZXIgZm9yIGl0cyBiYXNpYyBjb21waWxlciBmdW5jdGlvbmFsaXR5LgorPHA+SW4gRWNsaXBzZSAxLjAsIHRoZSBJREUncyBiYXNpYyBKYXZhIGNvbXBpbGVyIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQKK2J5IHRoZSBidWlsdC1pbiBFY2xpcHNlIGNvbXBpbGVyLiBXaGF0IHdvdWxkIGl0IHRha2UgdG8gbWFrZSB0aGlzIHBhcnQKK3BsdWdnYWJsZT8KKzxwPkluIEVjbGlwc2UsIHRoZSBiYXNpYyBKYXZhIGNvbXBpbGVyIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgdGhyb3VnaAordGhlIEphdmEgYnVpbGRlci4gVGhlIEphdmEgYnVpbGRlciBpcyBhY3RpdmF0ZWQgd2hlbiBpdHMgYnVpbGQgbWV0aG9kIGlzCitjYWxsZWQuIFRoaXMgaGFwcGVucyB3aGVuIChhKSBhbiBleHBsaWNpdCBCdWlsZCBjb21tYW5kcyByZXF1ZXN0ZWQgYnkgdGhlCit1c2VyLCAoYikgdGhlIHdvcmtzcGFjZSBwZXJmb3JtcyBhbiBhdXRvIGJ1aWxkLCBvciAoYykgc29tZSBwbHVnLWluIGluc3RpZ2F0ZWQKK2EgYnVpbGQgcHJvZ3JhbW1hdGljYWxseS4KKzxwPlNvIHRoZSBmaXJzdCBpZGVhIGlzIHRoYXQgdGhlIEphdmEgYnVpbGRlcidzIGJ1aWxkIG1ldGhvZCBzaG91bGQgaW52b2tlCithIHBsdWdnYWJsZSBKYXZhIGNvbXBpbGVyIHRvIGRvIGEgYnVpbGQuCis8aDQ+CitDYWxsaW5nIGEgcGx1Z2dhYmxlIGphdmFjIGZyb20gd2l0aGluIHRoZSBKYXZhIGJ1aWxkZXI8L2g0PgorRm9yIGEgZnVsbCBidWlsZCwgdGhpcyBpcyBjbGVhcmx5IGRvYWJsZS4gVGhlIHNvdXJjZSBmb2xkZXJzIG1lbnRpb25lZAorb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBjYW4gYmUgd2Fsa2VkIHRvIGlkZW50aWZ5IGFsbCBKYXZhIHNvdXJjZSBmaWxlcy4KK1RoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFyZSBkZWxldGVkLCBhbmQgSmF2YQorcHJvYmxlbSBtYXJrZXJzIGFyZSByZW1vdmVkLiBUaGUgbmFtZXMgb2YgdGhlc2Ugc291cmNlIGZpbGVzIGFyZSB0aGVuIHBhc3NlZAordG8gamF2YWMgYXMgdGhlIG9uZXMgdG8gY29tcGlsZSAobGFyZ2UgZmlsZSBzZXRzIHBlcmhhcHMgYnJva2VuIHVwIGludG8KK3JlYXNvbmFibGUgc2l6ZWQgYmF0Y2hlcyk7IHRoZSBjbGFzc3BhdGggcGFzc2VkIGlzIGNvbXB1dGVkIGZyb20gdGhlIHByb2plY3QncworYnVpbGQgY2xhc3NwYXRoOyB0aGUgb3V0cHV0IGZvbGRlciBpcyBwYXNzZWQgYXMgdGhlIHRhcmdldCBmb3IgdGhlIGdlbmVyYXRlZAorY2xhc3MgZmlsZXMuIFRoZSBjb21waWxlciB3aWxsIGdlbmVyYXRlIGNsYXNzIGZpbGVzIGludG8gdGhlIHRhcmdldCBmb2xkZXIKK2FuZCBwcmludCB0ZXh0IGVycm9yIG1lc3NhZ2VzIHRvIGl0cyBvdXRwdXQgc3RyZWFtLiBEZXBlbmRpbmcgb24gaG93ICJzdGFuZGFyZCIKK3RoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBzdHJlYW0gd2FzLCB0aGUgSmF2YSBidWlsZGVyIG1pZ2h0IGJlIGFibGUgdG8KK2FuYWx5emUgdGhlIHN0cmVhbSBvZiB0ZXh0IGVycm9yIG1lc3NhZ2VzIGFuZCBjb252ZXJ0IHRoZXNlIGludG8gSmF2YSBwcm9ibGVtCittYXJrZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2ZmZW5kaW5nIHNvdXJjZSBmaWxlcyAodGhlIGNvbXBsZXRlIHN0cmVhbQorY291bGQgYWxzbyBiZSBzYXZlZCBhbmQgbWFkZSBhdmFpbGFibGUgdG8gdXNlciB0aHJvdWdoIHNvbWUgb3RoZXIgbWVjaGFuaXNtKS4KK090aGVyd2lzZSB0aGUgbmV0IHJlc3VsdCBpcyBjbG9zZSB0byB0aGF0IG9mIHJ1bm5pbmcgdGhlIEVjbGlwc2UgY29tcGlsZXIuCitPbmUgb3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBKYXZhIGJ1aWxkZXIgd291bGQgbm90IGJlIGFibGUgdG8gcHJvZHVjZQorYW55dGhpbmcgcmVzZW1ibGluZyBpdHMgY3VycmVudCBpbnRlcm5hbCBidWlsdCBzdGF0ZSAoaS5lLiwgbm8gZGVwZW5kZW5jeQorZ3JhcGgpLgorPHA+Rm9yIGFuIGluY3JlbWVudGFsIGJ1aWxkLCBpdCBpcyBpbXBvc3NpYmxlIHRvIGRvIGFueXRoaW5nIG1vcmUgdGhhbgorYSBjdXJzb3J5IGpvYiB3aXRob3V0IHByb3BlciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBUaGUgSmF2YSBidWlsZGVyIGlzCitwYXNzZWQgYSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIHByb2plY3Qgc2hvd2luZyB3aGljaCBzb3VyY2UgZmlsZXMgaGF2ZQorY2hhbmdlZC4gVGhlIGRlbHRhIHdvdWxkIGFsc28gc2hvdyB0aGF0IHRoZSBidWlsZCBjbGFzc3BhdGggaGFkIGNoYW5nZWQKKyh0aGUgSmF2YSBidWlsZGVyIGNvdWxkIGVhc2lseSByZW1lbWJlciBzb21lIGNsYXNzcGF0aHMgYmV0d2VlbiBidWlsZHMpLgorPHA+SG93IHRvIGRvIGFuIGluY3JlbWVudGFsIGJ1aWxkOgorPHVsPgorPGxpPgorZGVsZXRlIGEgc291cmNlIGZpbGUgPT4gaWRlbnRpZnkgYW5kIGRlbGV0ZSB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlczwvbGk+CisKKzxsaT4KK2FkZCBhIHNvdXJjZSBmaWxlID0+IGlkZW50aWZ5IGFuZCBkZWxldGUgY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyAoanVzdAoraW4gY2FzZSk7IGluY2x1ZGUgc291cmNlIGZpbGUgaW4gbGlzdCB0byBiZSByZWNvbXBpbGVkPC9saT4KKworPGxpPgorY2hhbmdlIGEgc291cmNlIGZpbGUgPT4gaWRlbnRpZnkgYW5kIGRlbGV0ZSBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGVzOworaW5jbHVkZSBzb3VyY2UgZmlsZSBpbiBsaXN0IHRvIGJlIHJlY29tcGlsZWQ8L2xpPgorPC91bD4KK1RoZSBjb21waWxlciBpcyBjYWxsZWQgdG8gcmVjb21waWxlIHRoZSBpZGVudGlmaWVkIGxpc3Qgb2Ygc291cmNlIGZpbGVzLgorVGhlIEphdmEgYnVpbGRlciBtaWdodCBiZSBhYmxlIHRvIGFuYWx5emUgdGhlIC12ZXJib3NlIG91dHB1dCBzdHJlYW0gdG8KK2Rpc2NvdmVyIHdoaWNoIHNvdXJjZSBmaWxlcyB3ZXJlIGFjdHVhbGx5IGNvbXBpbGVkIGFuZCB1cGRhdGUgdGhlaXIgSmF2YQorcHJvYmxlbSBtYXJrZXJzLgorPHA+VGhpcyBraW5kIG9mIHNpbXBsZS1taW5kZWQgaW5jcmVtZW50YWwgYnVpbGQgaGFuZGxlcyBtYW55IHNpbXBsZSBjYXNlcworKGUuZy4sIGNoYW5naW5nIHRoZSBib2R5IG9mIGEgbWV0aG9kLCBmaXhpbmcgamF2YWRvYyBjb21tZW50cywgcmVmb3JtYXR0aW5nKS4KK1RoZSByZXN1bHRzIHdvdWxkIHVzdWFsbHkgYmUgbGVzcyBzYXRpc2ZhY3Rvcnkgd2hlbiB0aGUgcHJpbmNpcGFsIHN0cnVjdHVyZQorb2YgY2xhc3MgaXMgY2hhbmdlZCBiZWNhdXNlIGFueSBkZXBlbmRlbnQgc291cmNlIGZpbGVzIGRvIG5vdCBnZXQgcmVjb21waWxlZCwKK3doaWNoIG1heSBsZWFkIHRvIGluY29tcGF0aWJsZSBzZXRzIG9mIGJpbmFyaWVzIGNsYXNzIGZpbGVzLiBUaGUgZGV2ZWxvcGVyCit3b3VsZCBuZWVkIHRvIGJlIGVkdWNhdGVkIGFib3V0IHdoZW4gdG8gYmUgYXNraW5nIGZvciBhIGZ1bGwgYnVpbGQuIE1hbnkKK3dpbGwgYWxyZWFkeSBiZSBmYW1pbGlhciB3aXRoIHRoZXNlIHJ1bGVzIGZyb20gdXNpbmcgb3RoZXIgSmF2YSBJREVzLiBXaXRoCithIEphdmEgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBwcm9kdWNlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24sIGl0IGlzIGhhcmQKK2ZvciBhbiBJREUgd2l0aCBwbHVnZ2FibGUgSmF2YSBjb21waWxlcnMgdG8gZG8gYW55IGJldHRlci4KKzxwPkF1dG9idWlsZCBpcyBqdXN0IGFuIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgaXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkuCitOb3RlIHRoYXQgdGhlIHVzZXIgbWF5IGZpbmQgaXQgaW50b2xlcmFibGUgdG8gcnVuIHdpdGggYXV0b2J1aWxkIGVuYWJsZWQKK2lmIHRoZSBvdmVyaGVhZCBmb3IgaW52b2tpbmcgdGhlIHBsdWdnYWJsZSBjb21waWxlciBpcyBoaWdoICh3aGljaCBpdCBpcworbGlrZWx5IHRvIGJlIGlmIGEgc2VwYXJhdGUgSlZNIHdvdWxkIG5lZWQgdG8gYmUgbGF1bmNoZWQpLgorPHA+VGhlIGNvbmNsdXNpb24gaXMgdGhhdCB0aGlzIGlzIGZlYXNpYmxlLCBhbHRob3VnaCBhdXRvYnVpbGRpbmcgbWF5IGJlCitpbnRvbGVyYWJsZS4gQXMgbG9uZyBhcyB0aGUgcGx1Z2dhYmxlIEphdmEgY29tcGlsZXIgd2FzIHZlcnkgamF2YWMtbGlrZQoraW4gdGVybXMgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGZvcm1hdCBvZiBnZW5lcmF0ZWQgZXJyb3IgbWVzc2FnZXMsCitpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIGl0IHRvIGJ1aWxkIGEgSmF2YSBwcm9qZWN0LgorPGg0PgorQ2FsbGluZyBhbiBBbnQgc2NyaXB0IGluc3RlYWQgb2YgdGhlIEphdmEgYnVpbGRlcjwvaDQ+CitBbiBldmVuIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggd291bGQgYmUgdG8gYWxsb3cgYSBKYXZhIHByb2plY3QgdG8gYmUgY29uZmlndXJlZAord2l0aCBhIGdlbmVyaWMgQW50LWJhc2VkIGluY3JlbWVudGFsIHByb2plY3QgYnVpbGRlciBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZAorSmF2YSBidWlsZGVyLiBUaGUgQW50LWJhc2VkIGJ1aWxkZXIgaXMgZGVzY3JpYmVkIGluIGEgc2VwYXJhdGUgMi4wIFBsYXRmb3JtCitDb3JlIGZlYXR1cmUgcHJvcG9zYWwuCis8cD5BbGwgb2YgdGhlIGFib3ZlIGNvbnNpZGVyYXRpb25zIHdvdWxkIHN0aWxsIGFwcGx5OyB0aGUgb25seSByZWFsIGRpZmZlcmVuY2UKK2lzIHRoYXQgZXZlcnl0aGluZyBpcyBpbXBsZW1lbnRlZCBpbiBBbnQgdGVybXMuCis8aDM+CitQbHVnZ2FibGUgSkRQQSBEZWJ1Z2dlcnM8L2gzPgorRWNsaXBzZSByZWltcGxlbWVudHMgdGhlIEpQREEgZGVidWdnZXIgZnJvbnQgZW5kOyBpdCBkb2VzIG5vdCB1c2UgdGhlIEpESQoraW1wbGVtZW50YXRpb24gc3VwcGxpZWQgYnkgU3VuLiBFdmVuIGlmIGl0IGRpZCB1c2UgU3VuIEpESSwgaXQgc3RpbGwgd291bGQKK2JlIHdvcmsgZm9yIHRoZSBFY2xpcHNlIGRlYnVnZ2VyIHRvIGNhcGl0YWxpemUgb24gYW55IG5ldyBkZWJ1Z2dlciBmdW5jdGlvbmFsaXR5Cit0aGVyZWJ5IGludHJvZHVjZWQuIFNvIHRoZSBkZWJ1Z2dlciBmcm9udCBlbmQgaXMgdXBncmFkZWFibGUsIGJ1dCBub3QgcGx1Z2dhYmxlLgorPHA+VGhlIEpEUEEgZGVidWdnZXIgYmFjayBlbmQgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIEphdmEgcnVudGltZSBlbnZpcm9ubWVudCwKK2FuZCBzaGlwcyB3aXRoIHRoZSBJQk0gYW5kIFN1biBKMlNFIEpES3Mgc2luY2UgMS4zLiBTbyB0aGlzIHBhcnQgaXMgYWxyZWFkeQorcGx1Z2dhYmxlLgorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9yZWxlYXNlIG5vdGVzL2NoYW5nZV9zdW1tYXJ5LnR4dCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvcmVsZWFzZSBub3Rlcy9jaGFuZ2Vfc3VtbWFyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkYzFiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvcmVsZWFzZSBub3Rlcy9jaGFuZ2Vfc3VtbWFyeS50eHQKQEAgLTAsMCArMSwxMjggQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQlJFQUtJTkcgQVBJIENIQU5HRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTm9uZQorICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTk9OLUJSRUFLSU5HIEFQSSBDSEFOR0VTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAqIEFkZGVkIEFQSSB0byBzZXQgYm90aCB0aGUgY2xhc3NwYXRoIGFuZCB0aGUgb3V0cHV0IGxvY2F0aW9uIGF0IG9uY2UuCisgIAlJSmF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAorICAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgCisgIAkJSVBhdGggbmV3T3V0cHV0TG9jYXRpb24sIAorICAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKyAgCQorICAqIElDb2RlQ29tcGxldGlvblJlcXVlc3RvciBnb3QgZGVwcmVjYXRlZCwgc2hvdWxkIHVzZSBJQ29tcGxldGlvblJlcXVlc3RvcgorICAgIGluc3RlYWQgdG8gb2J0YWluOgorICAgICAoMSkgLSBsb2NhbCB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb25zCisgICAgICgyKSAtIHBhcmFtZXRlciBuYW1lIGhpbnRzCisgICAgICgzKSAtIG1ldGhvZCBkZWNsYXJhdGlvbiBzdWdnZXN0aW9ucy4KKyAgICAKKyAgIElDb21wbGV0aW9uUmVxdWVzdG9yIGlzIGVxdWl2YWxlbnQgdG8gSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIGV4Y2VwdCBmb3IKKyAgIHRoZSBmb2xsb3dpbmcgQVBJIGNoYW5nZXM6CisgICAKKyAgICgxKSArIEFkZGVkIEFQSSBmb3Igc3VnZ2VzdCB2YXJpYWJsZSBuYW1lOgorICAgICAgdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoCisgICAgICAgICAgY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwKKyAgICAgICAgICBjaGFyW10gdHlwZU5hbWUsCisgICAgICAgICAgY2hhcltdIG5hbWUsCisgICAgICAgICAgY2hhcltdIGNvbXBsZXRpb25OYW1lLAorICAgICAgICAgIGludCBjb21wbGV0aW9uU3RhcnQsCisgICAgICAgICAgaW50IGNvbXBsZXRpb25FbmQpOworCisgICAgKDIpICsgQWRkZWQgcGFyYW1ldGVyTmFtZXMgdG8gbm9ybWFsIG1ldGhvZCByZXN1bHRzIEFQSToKKyAgICAgIHZvaWQgYWNjZXB0TWV0aG9kKAorICAgICAgICAgIGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCisgICAgICAgICAgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAorICAgICAgICAgIGNoYXJbXSBzZWxlY3RvciwKKyAgICAgICAgICBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCisgICAgICAgICAgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAorICAgICAgICAgIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLDw8PDw8PDw8PDw8PDw8PDwgQURERUQKKyAgICAgICAgICBjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLAorICAgICAgICAgIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKyAgICAgICAgICBjaGFyW10gY29tcGxldGlvbk5hbWUsCisgICAgICAgICAgaW50IG1vZGlmaWVycywKKyAgICAgICAgICBpbnQgY29tcGxldGlvblN0YXJ0LAorICAgICAgICAgIGludCBjb21wbGV0aW9uRW5kKTsKKworICAgKDMpICsgQWRkZWQgQVBJIGZvciBhbnN3ZXJpbmcgbWV0aG9kIGRlY2xhcmF0aW9uIGNvbXBsZXRpb25zOgorICAgICAgdm9pZCBhY2NlcHRNZXRob2REZWNsYXJhdGlvbigKKyAgICAgICAgICBjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAorICAgICAgICAgIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKyAgICAgICAgICBjaGFyW10gc2VsZWN0b3IsCisgICAgICAgICAgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorICAgICAgICAgIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKyAgICAgICAgICBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKKyAgICAgICAgICBjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLAorICAgICAgICAgIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKyAgICAgICAgICBjaGFyW10gY29tcGxldGlvbk5hbWUsCisgICAgICAgICAgaW50IG1vZGlmaWVycywKKyAgICAgICAgICBpbnQgY29tcGxldGlvblN0YXJ0LAorICAgICAgICAgIGludCBjb21wbGV0aW9uRW5kKTsKKworICAqIFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoSVJlc291cmNlW10pIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCisgIAlVc2UgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSkgaW5zdGVhZC4KKyAgCVRoZSByYXRpb25hbCBpcyB0aGF0IGNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSkgd2FzIG5vdCB3ZWxsCisgIAlkZWZpbmVkIGZvciBwcm9qZWN0cywgYW5kIGl0IGNvdWxkIG5vdCBkZWZpbmUgYSBzZWFyY2ggc2NvcGUgZm9yIGphdmEKKyAgCWVsZW1lbnRzIHRoYXQgZGlkbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlc291cmNlIChlLmcuIGV4dGVybmFsIGphcnMpLgorICAJCisgIAlUaGUgc3BlY2lmaWNhdGlvbiBvZiBjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pIGlzIGFzIGZvbGxvd3M6CisJLSBJZiBhbiBlbGVtZW50IGlzIGFuIElKYXZhUHJvamVjdCwgdGhlbiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXJzLCAKKyAgICAgIGl0cyBqYXJzIChleHRlcm5hbCBhbmQgaW50ZXJuYWwpIGFuZCBpdHMgcmVmZXJlbmNlcyBwcm9qZWN0cyAod2l0aCB0aGVpciAKKyAgICAgIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC4KKyAgICAtIElmIGFuIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VGcmFnbWVudFJvb3QsIHRoZW4gb25seSB0aGUgcGFja2FnZSBmcmFnbWVudHMgb2YgCisgICAgICB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aWxsIGJlIGluY2x1ZGVkLgorICAgIC0gSWYgYW4gZWxlbWVudCBpcyBhbiBJUGFja2FnZUZyYWdtZW50LCB0aGVuIG9ubHkgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNsYXNzIAorICAgICAgZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzIHdpbGwgTk9UIGJlIAorICAgICAgaW5jbHVkZWQuCisgICAgICAKKyAgKiBDbGFzc3BhdGggZW50cmllcyAoZXhjZXB0IGZvciBzb3VyY2UgZm9sZGVycykgY2FuIGJlIHRhZ2dlZCBhcyBleHBvcnRlZCB1cG9uCisgICAgY3JlYXRpb24uIFdoZW4gZXhwb3J0ZWQsIGFuIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cyBhbG9uZyAKKyAgICB3aXRoIGl0cyBvdXRwdXQgbG9jYXRpb24uCisgICAgQWRkZWQgQVBJczoKKyAgICAKKyAgICBUZXN0aW5nIHN0YXR1cyBvZiBhIGdpdmVuIGVudHJ5CisgICAgICsgSUNsYXNzcGF0aEVudHJ5LmlzRXhwb3J0ZWQoKQorCisgICAgQ3JlYXRpbmcgZW50cmllcyB3aXRoIGV4cG9ydCBmbGFnCisgICAgICsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KElQYXRoLCBib29sZWFuKQorICAgICArIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQorICAgICArIEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkoSVBhdGgsIGJvb2xlYW4pCisgICAgICAgICAgIAorICAqIFNlYXJjaCBmb3IgZmllbGQgcmVhZCBhbmQgZmllbGQgd3JpdGUgYWNjZXNzZXMuIFR3byBuZXcgY29uc3RhbnRzIGhhdmUgYmVlbiBhZGRlZAorICAgIG9uIElKYXZhU2VhcmNoQ29uc3RhbnRzIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGZpZWxkIHJlZmVyZW5jZSBzZWFyY2ggcGF0dGVybjoKKyAgICAtIFJFQURfQUNDRVNTRVM6IHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluICpvbmx5KiByZWFkIGFjY2VzcyB0byBhIGZpZWxkLgorICAgIC0gV1JJVEVfQUNDRVNTRVM6IHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluICpvbmx5KiB3cml0ZSBhY2Nlc3MgdG8gYSBmaWVsZC4KKyAgICBOb3RlIHRoYXQgaWYgUkVGRVJFTkNFUyBpcyB1c2VkLCB0aGVuIHNlYXJjaCByZXN1bHRzIGNvbnRhaW4gYm90aCByZWFkIGFuZCB3cml0ZQorICAgIGFjY2Vzc3MgdG8gYSBmaWVsZC4KKworICAqIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciBub3cgY2xlYXJseSBzdGF0ZXMgdGhhdAorICAgIHRoZSBvcmRlciBvZiB0aGUgc2VhcmNoIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKworICAqIEFkZGVkIDIgbmV3IEFQSXMgb24gSmF2YUNvbnZlbnRpb25zIGZvciBjbGFzc3BhdGggdmFsaWRhdGlvbi4KKyAgICAgICAgIC0gSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aChJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgCisgICAgICAgICAtIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIGNoZWNrU291cmNlQXR0YWNobWVudCkgCisgCisgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTkFMSVRZIENIQU5HRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIAorICAqIENvZGVBc3Npc3QgcHJvdmlkZXMgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucy4KKyAgKiBDb2RlQXNzaXN0IHByb3ZpZGVzIGFyZ3VtZW50IG5hbWVzIGluIG1ldGhvZCBjb21wbGV0aW9ucy4KKyAgKiBDb2RlQXNzaXN0IGNvbXBsZXRlcyBvbiBtZXRob2QgZGVjbGFyYXRpb25zIChqdXN0IGVudGVyIHNlbGVjdG9yIHByZWZpeCkgIAorICAqIFByb2plY3QgY2FuIGNvbnRyaWJ1dGUgbW9yZSB0aGFuIHRoZWlyIG91dHB1dCBmb2xkZXIsIHVzaW5nIGV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyaWVzLgorICAqIENvZGVBc3Npc3QgaW5zZXJ0cyBxdWFsaWZpY2F0aW9uIG9uIGZpZWxkL21ldGhvZC90eXBlIHJlZmVyZW5jZXMgaW4gY2FzZSBvZiBhbWJpZ3VpdGllcyAob3B0aW9uYWxseSB0aGVzZQorICAgIHF1YWxpZmljYXRpb24gY2FuIGJlIGZvcmNlZCB0byBvY2N1cikuCisgICogQ29kZUFzc2lzdCBvcHRpb25hbGx5IHBlcmZvcm1zIHZpc2liaWxpdHkgY2hlY2tzIChzZWUgSmF2YUNvcmUgb3B0aW9uOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayIpLgorICAqIE9wZW5PblNlbGVjdGlvbiBjYW4gbm93IGxvY2F0ZSBzZWxlY3RlZCBkZWNsYXJhdGlvbnMuCisgICogU2VhcmNoIGNhbiBuYXJyb3cgZmllbGQgcmVhZC93cml0ZSBhY2Nlc3MuCisgICogQXNzZXJ0aW9ucyBzdXBwb3J0IGVuYWJsZWQ6IGJ5IGRlZmF1bHQgdGhlIGNvbXBpbGVyIGlzIDEuMyBjb21wbGlhbnQsIGJ1dCBpdCBjYW4gCisgICAgb3B0aW9uYWxseSBiZSB0dXJuZWQgaW50byBzb3VyY2UgMS40IG1vZGUgY2YuIEphdmFDb3JlIG9wdGlvbnMuCisgICogRXZhbHVhdGlvbiBpbiBiaW5hcmllcyBpcyBmdW5jdGlvbmFsCisgICogU2VhcmNoIGZvciByZWZlcmVuY2VzIG5vdyBmaW5kcyByZXN1bHRzIGluIGJpbmFyaWVzLiBJbmRleGVzIGluIG9sZCB3b3Jrc3BhY2VzIGFyZSByZWNvbXB1dGVkIHdoZW4gcmVzdGFydGVkIAorICAgICB3aGljaCBtYXkgcmVzdWx0IGluIGxvbmdlciBzdGFydHVwIHRpbWVzLgorICAqIFNlYXJjaCBpbiBpbm5lci1jbGFzc2VzIG5vdyB3b3Jrcy4gSW5kZXhlcyBhcmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IG9uIHN0YXJ0LXVwLgorIAorICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC9DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYjZlOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC9DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXJzLgorICogQ2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIGV4dGVuc2lvbiBwb2ludC4KKyAqIDxwPgorICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyB0byBpbXBsZW1lbnQgYSBzcGVjaWZpYyBjbGFzc3BhdGgKKyAqIHZhcmlhYmxlIGluaXRpYWxpemVyLiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQKKyAqIGNvbnN0cnVjdG9yIGFuZCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmluaXRpYWxpemU8L2NvZGU+LgorICogPC9wPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIHZhbHVlIHRvIHRoZSB3b3Jrc3BhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsCisgICAgICogb3IgZmFpbHMgc2lsZW50bHkgaWYgdGhpcyBjYW5ub3QgYmUgZG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlIGNsYXNzcGF0aCB2YXJpYWJsZQorICAgICAqICAgIHRoYXQgcmVxdWlyZXMgYSBiaW5kaW5nCisgICAgICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZSAgICAgCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgdmFyaWFibGUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1ZjZjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmh0bWwKQEAgLTAsMCArMSw0NyBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPldvcmtiZW5jaCBFeHRlbnNpb24gUG9pbnQgLSBDbGFzc3BhdGggVmFyaWFibGUgSW5pdGlhbGl6ZXI8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4MDAwODAiPgorCis8Y2VudGVyPgorPGgxPgorQ2xhc3NwYXRoIFZhcmlhYmxlIEluaXRpYWxpemVyPC9oMT48L2NlbnRlcj4KKzxiPjxpPklkZW50aWZpZXI6IDwvaT48L2I+b3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcgorPHA+PGI+PGk+RGVzY3JpcHRpb246IDwvaT48L2I+VGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgcGx1Zy1pbiB0bworcmVnaXN0ZXIgY29kZSBmb3IgcHJvZ3JhbW1hdGljYWxseSBpbml0aWFsaXppbmcgYSBwYXJ0aWN1bGFyIG5hbWVkIGNsYXNzcGF0aAordmFyaWFibGUuCis8cD48Yj48aT5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2k+PC9iPgorPHA+PHR0PiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcj48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyaWFibGUmbmJzcDsmbmJzcDsgQ0RBVEEgI1JFUVVJUkVEPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CitDREFUQSAjUkVRVUlSRUQ8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsgPjwvdHQ+Cis8dWw+Cis8bGk+Cis8Yj52YXJpYWJsZTwvYj4gLSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlPC9saT4KKworPGxpPgorPGI+Y2xhc3M8L2I+IC0gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplci4KK1RoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBhIHB1YmxpYyBzdWJjbGFzcyBvZiA8dHQ+b3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvdHQ+Cit3aXRoIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IgYW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8dHQ+aW5pdGlhbGl6ZShTdHJpbmcpPC90dD4KK21ldGhvZC48L2xpPgorPC91bD4KKzxiPjxpPkV4YW1wbGVzOjwvaT48L2I+Cis8YnI+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIElDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIGZvcgorYSBjbGFzc3BhdGggdmFyaWFibGUgbmFtZWQgIkZPTyI6Cis8cD48dHQ+Jmx0O2V4dGVuc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciI+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhcmlhYmxlPSJGT08iPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzPSJjb20uZXhhbXBsZS5DUFZJbml0aWFsaXplciIvPjwvdHQ+Cis8YnI+PHR0PiZsdDsvZXh0ZW5zaW9uPjwvdHQ+Cis8cD48Yj48aT5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjo8L2k+PC9iPgorPGJyPk5vbmUuCis8YnI+Jm5ic3A7Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlIGluaXQvdW5pbml0LWNsYXNzcGF0aC12YXJzLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlIGluaXQvdW5pbml0LWNsYXNzcGF0aC12YXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4NGZiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC91bmluaXQtY2xhc3NwYXRoLXZhcnMuaHRtbApAQCAtMCwwICsxLDgwIEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+SkRUIC0gVW5pbml0aWFsaXplZCBDbGFzc3BhdGggVmFyaWFibGVzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDI+CitVbmluaXRpYWxpemVkIENsYXNzcGF0aCBWYXJpYWJsZXM8L2gyPgorTGFzdCByZXZpc2VkIDExOjMwIE1vbmRheSBOb3ZlbWJlciAxOSwgMjAwMQorPHA+T3JpZ2luYWwgd29yayBpdGVtOiAiQnVpbGRpbmcgd2l0aCB1bmluaXRpYWxpemVkIGNsYXNzIHBhdGggdmFyaWFibGVzLgorWW91IGNhbiBhZGQgYSBwcm9qZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkgdGhhdCBnZXRzIGJ1aWx0IHdpdGhvdXQgaGF2aW5nCit0aGUgSmF2YVVJIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIEpSRV8gdmFyaWFibGVzIGlzIGFjdGl2YXRlZC4iCis8cD5UaGUgZ2VuZXJhbCBwcm9ibGVtIGlzIHRoYXQgYSBjbGFzc3BhdGggdmFyaWFibGUgY2FuIHNob3cgdXAgaW4gYSBwcm9qZWN0J3MKK2NsYXNzcGF0aCBxdWl0ZSBlYXJseSAoZm9yIGV4YW1wbGUsIHdoZW4gYSBwcm9qZWN0IGlzIGxvYWRlZCBmcm9tIGEgcmVwb3NpdG9yeSksCithbmQgd2VsbCBiZWZvcmUgdGhlIGFjdGl2YXRpb24gb2YgYSBwbHVnLWluIHRoYXQgbWlnaHQgd2lsbGluZ2x5IGluaXRpYWxpemUKK3RoZSB3b3Jrc3BhY2UncyBiaW5kaW5nIGZvciB0aGF0IHZhcmlhYmxlLiBXaXRob3V0IGEgYmluZGluZyBmb3IgYWxsIHRoZQordmFyaWFibGVzIG1lbnRpb25lZCBvbiBpdHMgYnVpbGQgY2xhc3NwYXRoLCB0aGUgcHJvamVjdCBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5CitidWlsdC4gSG93ZXZlciwgdGhlcmUgaXMgY3VycmVudGx5IG5vIG1lY2hhbmlzbSBieSB3aGljaCB0aGVzZSB2YXJpYWJsZXMKK2NhbiBnZXQgaW5pdGlhbGl6ZWQuCis8cD5Gb3IgdmFyaWFibGVzIHRoYXQgdGhlIGRldmVsb3BlciAob3IgaGlzIHRlYW0gbWF0ZXMpIGludHJvZHVjZXMgZXhwbGljaXRseSwKK3RoaXMgaXMgbm90IGEgcGFydGljdWxhciBwcm9ibGVtLiBUaGUgZGV2ZWxvcGVyJ3MgY29ycmVjdGl2ZSBhY3Rpb24gaXMKK3RvIGV4cGxpY2l0bHkgZXN0YWJsaXNoIGEgYmluZGluZyBmb3IgdGhlIHZhcmlhYmxlLCBhbmQgdGhlbiByZWJ1aWxkLgorPHA+SG93ZXZlciwgdGhlcmUgaXMgYSBwcm9ibGVtIGZvciB2YXJpYWJsZXMgdGhhdCBhcmUgaW50cm9kdWNlZCBhbmQgb3JkaW5hbHJpbHkKK2luaXRpYWxpemVkIGJ5IHNvbWUgdG9vbC4gRm9yIHRoZXNlLCB0aGUgZGV2ZWxvcGVyIG1heSBub3QgYmUgaW4gYSBwb3NpdGlvbgordG8gZXhwbGljaXRseSBlc3RhYmxpc2ggYSBiaW5kaW5nIGZvciB0aGUgdmFyaWFibGUsIGFuZCBtaWdodCBub3QgZXZlbgora25vdyB3aGljaCBwbHVnLWluIG5lZWRzIHRvIGJlIGFjdGl2YXRlZC4KKzxwPlRoaXMgcHJvYmxlbSBpcyBhIHN5bXB0b20gb2YgYSBtb3JlIHdpZGVzcHJlYWQgcHJvYmxlbS4gRm9yIGV4YW1wbGUsCitQREUgc3VmZmVycyB0aGlzIHByb2JsZW0gd2l0aCB0aGUgIkVDTElQU0VfSE9NRSIgdmFyaWFibGUuCis8aDM+CitQcm9wb3NhbDwvaDM+CitXZSBpbnRyb2R1Y2UgYSBKRFQgQ29yZSBleHRlbnNpb24gcG9pbnQgPHR0PjxhIGhyZWY9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuaHRtbCI+b3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvYT48L3R0PgordGhyb3VnaCB3aGljaCBwbHVnLWlucyBjYW4gc3VwcGx5IGluaXRpYWxpemVyIGNvZGUgZm9yIG5hbWVkIGNsYXNzcGF0aAordmFyaWFibGVzLgorPHA+RXhhbXBsZXMgb2YgaG93IHRoaXMgd291bGQgYmUgdXNlZDoKKzxwPjx0dD4mbHQ7ZXh0ZW5zaW9uPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBvaW50ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2YXJpYWJsZT0iRUNMSVBTRV9IT01FIjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjbGFzcz0ib3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUuRWNsaXBzZUhvbWVJbml0aWFsaXplciIvPjwvdHQ+Cis8YnI+PHR0PiZsdDsvZXh0ZW5zaW9uPjwvdHQ+Cis8cD48dHQ+Jmx0O2V4dGVuc2lvbjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwb2ludCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIj48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyaWFibGU9IkpSRV9MSUIiPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuQ1BWSW5pdGlhbGl6ZXIiLz48L3R0PgorPGJyPjx0dD4mbHQ7L2V4dGVuc2lvbj48L3R0PgorPHA+VGhlIG1lY2hhbmlzbSB3b3VsZCB3b3JrIGFzIGZvbGxvd3M6Cis8dWw+Cis8bGk+CitJdCBhcHBsaWVzIGF1dG9tYXRpY2FsbHkgZWFjaCB0aW1lIGEgY2xhc3NwYXRoIGNvbnRhaW5pbmcgYW4gdW5ib3VuZCBjbGFzc3BhdGgKK3ZhcmlhYmxlIGlzIGJlaW5nIHJlc29sdmVkIChlLmcuLCBieSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5CitvciBJSmF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgpLjwvbGk+CisKKzxsaT4KK0lmIGNsYXNzcGF0aCB2YXJpYWJsZSBpcyB1bmJvdW5kIGluIHRoZSB3b3Jrc3BhY2UsIGl0IGFzayBpZiB0aGVyZSBpcyBhCityZWdpc3RlcmVkIGluaXRpYWxpemVyIGZvciB0aGF0IHZhcmlhYmxlLjwvbGk+CisKKzxsaT4KK0lmIHRoZXJlIGlzIGFuIGluaXRpYWxpemVyLCBpdCBpcyBpbnZva2VkIChpdCBpcyBwYXNzZWQgdGhlIG5hbWUgb2YgdGhlCitjbGFzc3BhdGggdmFyaWFibGUgdGhhdCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCkuPC9saT4KKworPGxpPgorVGhlIGluaXRpYWxpemVyIHJldHVybnMgbm8gcmVzdWx0OyBpdCBzaW1wbHkgaGFzIHRoZSBzaWRlIGVmZmVjdCBpbml0aWFsaXppbmcKK3RoZSB2YXJpYWJsZSBpZiBpdCBjYW4uPC9saT4KKworPGxpPgorQWZ0ZXIgdGhlIGluaXRpYWxpemVyIGlzIGludm9rZWQsIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgcHJvY2VlZHMgd2hldGhlcgorb3Igbm90IHRoZSB2YXJpYWJsZSBpcyBib3VuZCBvciB1bmJvdW5kLjwvbGk+CisKKzxsaT4KK0lmIHRoZXJlIGFyZSBtdWx0aXBsZSBpbml0aWFsaXplcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgdmFyaWFibGUsIG9ubHkKK3RoZSBmaXJzdCBvbmUgaXMgdXNlZCAodGhpcyBtZWNoYW5pbXMgZG9lcyBub3Qgc3VwcG9ydCBhbHRlcm5hdGUgb3IgaGllcmFyY2hpY2FsCitjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXJzKS48L2xpPgorPC91bD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC93b3Jrc3BhY2Ugc3RydWN0dXJlL3dzLXN0cnVjdHVyZS1ub3Rlcy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC93b3Jrc3BhY2Ugc3RydWN0dXJlL3dzLXN0cnVjdHVyZS1ub3Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjE0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLW5vdGVzLmh0bWwKQEAgLTAsMCArMSw4NzQgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5KRFQgLSBOb3RlcyBvbiBXb3Jrc3BhY2Ugc3RydWN0dXJlPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDI+CitOb3RlcyBvbiBXb3Jrc3BhY2UgU3RydWN0dXJlPC9oMj4KK0xhc3QgcmV2aXNlZCZuYnNwOyAxNzowMCBXZWRuZXNkYXkgU2VwdGVtYmVyIDI2LCAyMDAxCis8cD5JbiBsYXJnZSBKYXZhIGRldmVsb3BtZW50IGVmZm9ydHMsIGl0IGlzIG5vdCB1bmNvbW1vbiBmb3Igc2V2ZXJhbCBpbnRlci1yZWxhdGVkCitwcm9qZWN0cyB0byBiZSB1bmRlciBkZXZlbG9wbWVudCBhdCB0aGUgc2FtZSB0aW1lLiBGb3IgdGhlIHB1cnBvc2VzIG9mCit0aGlzIGRpc2N1c3Npb24sIGFzc3VtZSB0ZWFtcywgcHJvamVjdHMsIGFuZCBjb21wb25lbnRzIGFsaWduLiBBbGwgdGVhbXMKK2FyZSB3b3JraW5nIGluIHRoZSBzYW1lIHJlcG9zaXRvcnksIHNoYXJpbmcgYSBzZXQgb2YgcHJvamVjdHMgdmlhIGEgc2luZ2xlCitzdHJlYW07IGVhY2ggcHJvamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIGEgc2luZ2xlIGNvbXBvbmVudC4KKzxwPk91ciBleGFtcGxlIHNjZW5hcmlvIGhhcyA0IHByb2plY3RzOiBQMSwgUDIsIFAzLCBhbmQgUDQsIHdpdGggY29tcG9uZW50cworQzEgdGhyb3VnaCBDNCwgcmVzcGVjdGl2ZWx5LiBDMSBpcyB0aGUgb25seSBjb21wb25lbnQgdGhhdCBkb2VzIG5vdCBkZXBlbmQKK29uIGFueSBvdGhlcnM7IEMyIGRlcGVuZHMgb24gQzE7IEMzIGRlcGVuZHMgb24gQzEgYW5kIEMyOyBDNCBkZXBlbmRzIG9uCitDMiAoTi5CLiwgYnV0IG5vdCBvbiBDMSBvciBDMykuCis8cD5XZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSBDVlMgcmVwb3NpdG9yeSB0aGF0IGNvbnRhaW5zIGFsbCA0Citwcm9qZWN0cyBpbiBzb3VyY2UgY29kZSBmb3JtLiBJbiBhZGRpdGlvbiwgd2UgYXNzdW1lIHRoYXQgY2VudHJhbGl6ZWQgYnVpbGRzCithcmUgZG9uZSBwZXJpb2RpY2FsbHkgYW5kIHBvc3RlZCB0byBhIHdlYiBzZXJ2ZXIgd2hlcmUgdGhleSBjYW4gYmUgZG93bmxvYWRlZAorYXMgYSB1bml0LiBUaGVzZSBkb3dubG9hZHMgdGFrZSB0aGUgZm9ybSBvZiBhIHppcHBlZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMKK2EgYmluYXJ5IGphciBmb3IgZWFjaCBjb21wb25lbnQsIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzb3VyY2UgamFycyB0bworYWlkIGRlYnVnZ2luZy4KKzxwPldlIGFzc3VtZSB0aGF0IGVhY2ggZGV2ZWxvcGVyIGNhbiBkb3dubG9hZCBidWlsZHMgZnJvbSB0aGUgd2ViIHNlcnZlcgorYW5kIGluc3RhbGwgdGhlbSBvbiB0aGVpciBsb2NhbCBtYWNoaW5lLiBUbyBkbyB0aGVpciB3b3JrLCB0aGV5IHNldCB1cAorRWNsaXBzZSB3b3Jrc3BhY2VzIG9uIHRoZWlyIGxvY2FsIG1hY2hpbmUgYW5kIGxvYWQgb25lIG9yIG1vcmUgcHJvamVjdHMKK2Zyb20gdGhlIENWUyByZXBvc2l0b3J5LiBUaGV5IGFsc28gdXBncmFkZSB0aGVpciB3b3Jrc3BhY2UgZnJvbSB0aW1lIHRvCit0aW1lIGFzIG5ldyBidWlsZHMgYmVjb21lIGF2YWlsYWJsZS4KKzxwPlRoZXNlIGFzc3VtcHRpb25zIGFyZSBhIHBsYXVzaWJsZSBhYnN0cmFjdGlvbiBvZiB3aGF0IGdvZXMgb24gaW4gb3Blbgorc291cmNlIHByb2plY3RzLiAoSXQgaXMgYW4gb3BlbiBxdWVzdGlvbiBhcyB0byBob3cgY2xvc2VseSB0aGUgRWNsaXBzZQorcHJvamVjdCB3aXRoIGZvbGxvdyB0aGlzIHdvcmsgbW9kZWwuKQorPGgzPgorRGV2ZWxvcGluZywgVXNpbmcsIGFuZCBQYXRjaGluZyBDb21wb25lbnRzPC9oMz4KK1RoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgbm9ybSBmb3Igc29tZW9uZSBhY3RpdmVseSA8Yj5kZXZlbG9waW5nPC9iPgorYSBjb21wb25lbnQ6Cis8dWw+Cis8bGk+Citzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZm9yIGVudGlyZSBjb21wb25lbnQ8L2xpPgorCis8bGk+Citzb3VyY2UgY29kZSBpcyBiZWluZyBicm93c2VkIGFuZCBjaGFuZ2VkPC9saT4KKworPGxpPgorc291cmNlIGNvZGUgaXMgYmVpbmcgY29tcGlsZWQgcmVndWxhcmx5PC9saT4KKworPGxpPgorc291cmNlIGNvZGUgY2hhbmdlcyBhcmUgc2hhcmVkIG9jY2FzaW9uYWxseSB3aXRoIG90aGVyIHRlYW0gbWVtYmVyczwvbGk+Cis8L3VsPgorQXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgc3BlY3RydW0gYXJlIGNvbXBvbmVudHMgdGhhdCBhcmUgcGFzc2l2ZWx5IDxiPnVzZWQ8L2I+OgorPHVsPgorPGxpPgorY29tcG9uZW50IGlzIGF2YWlsYWJsZSBhcyBwcmUtY29tcGlsZWQgYmluYXJ5IGxpYnJhcnk8L2xpPgorCis8bGk+Citzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZm9yIGJyb3dzaW5nIGJ1dCBub3QgZm9yIGVkaXRpbmc8L2xpPgorCis8bGk+CitzaW5jZSB1c2VkIGNvbXBvbmVudCBpcyBzdGF0aWMsIG5vIGNoYW5nZXMgdG8gc2hhcmUgd2l0aCBvdGhlciB0ZWFtIG1lbWJlcnM8L2xpPgorPC91bD4KK0NvbXBvbmVudHMgdGhhdCBhcmUgYmVpbmcgPGI+cGF0Y2hlZDwvYj4gYXJlIG9uZSBzdGVwIGZyb20gYmVpbmcgYSB1c2VkCitjb21wb25lbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiBiZWluZyBhIGNvbXBvbmVudCBiZWluZyBkZXZlbG9wZWQ6Cis8dWw+Cis8bGk+Citjb21wb25lbnQgaXMgYXZhaWxhYmxlIGFzIHByZS1jb21waWxlZCBiaW5hcnkgbGlicmFyeTwvbGk+CisKKzxsaT4KK3NvdXJjZSBjb2RlIGlzIHNlbGVjdGl2ZWx5IGF2YWlsYWJsZSBmb3IgZWRpdGluZyAocGF0Y2hpbmcpPC9saT4KKworPGxpPgorcGF0Y2hlZCBzb3VyY2UgY29kZSBpcyBjb21waWxlZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIHByZS1jb21waWxlZCBiaW5hcnk8L2xpPgorCis8bGk+CitwYXRjaGVkIHNvdXJjZSBjb2RlIGlzIGZvciBsb2NhbCBjb25zdW1wdGlvbiAobm90IHNoYXJlZCB3aXRoIG90aGVyIHRlYW0KK21lbWJlcnMpPC9saT4KKzwvdWw+CitUaGUgZ2VuZXJhbCBwcm9ibGVtIGNhbiBiZSBzdGF0ZWQgYXMgZm9sbG93czogZWFjaCBkZXZlbG9wZXIgbmVlZHMgdGhlaXIKK293biB3b3Jrc3BhY2Ugc28gdGhhdCB0aGV5IGNhbiA8aT5kZXZlbG9wPC9pPiB0aGVpciBhc3NpZ25lZCBjb21wb25lbnQuCitUbyB0byBkbywgdGhleSB3aWxsIG5lZWQgdG8gPGk+dXNlPC9pPiB0aGUgY29tcG9uZW50cyB0aGF0IHRoZWlyIGNvbXBvbmVudAorZGVwZW5kcyBvbiwgYW5kIHBlcmhhcHMgdXNlIHNvbWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudHMgdGhhdCBkZXBlbmQgb24KK3RoZWlycy4gSW4gb3JkZXIgdG8gZG8gdGhlaXIgd29yaywgYSBkZXZlbG9wZXIgbWF5IG5lZWQgdG8gPGk+cGF0Y2g8L2k+CithIGNvbXBvbmVudCB0aGF0IHRoZXkgd291bGQgb3JkaW5hcmlseSBqdXN0IDxpPnVzZTwvaT47IGluIHNvbWUgY2FzZXMsCit0aGV5IG1pZ2h0IGV2ZW4gbmVlZCB0byBhY3RpdmVseSBkZXZlbG9wIGEgY29tcG9uZW50IHRoYXQgdGhleSB3b3VsZCBvcmRpbmFyaWx5CitqdXN0IDxpPnVzZTwvaT4uIEhvdyBjYW4gdGhlIGRldmVsb3BlcnMgc3RydWN0dXJlIHRoZWlyIHdvcmtzcGFjZXMgc28gdGhhdAordGhleSByZXRhaW4gc3VmZmljaWVudCBmbGV4aWJseSB0byBzd2l0Y2ggYmV0d2VlbiB1c2luZyBhbmQgcGF0Y2hpbmcgKG9yCitkZXZlbG9waW5nKSB0aGVzZSBvdGhlciBjb21wb25lbnRzPworPHA+VGhlIHZhcmlvdXMgc2NlbmFyaW9zIHByZXNlbnRlZCBiZWxvdyBhcmUgYWxsIHBsYXVzaWJsZSB3b3Jrc3BhY2Ugc2V0dXBzLAorZWFjaCB3aXRoIGNlcnRhaW4gYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlczoKKzx1bD4KKzxsaT4KKzxhIGhyZWY9IiNDb21wb25lbnQgcGx1cyBsaWJyYXJpZXMiPkNvbXBvbmVudCBwbHVzIGxpYnJhcmllczwvYT48L2xpPgorCis8bGk+Cis8YSBocmVmPSIjU291cmNlIGZvciBldmVyeXRoaW5nIj5Tb3VyY2UgZm9yIGV2ZXJ5dGhpbmc8L2E+PC9saT4KKworPGxpPgorPGEgaHJlZj0iI0NsYXNzcGF0aCB2YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzIj5DbGFzc3BhdGgKK3ZhcmlhYmxlcyB0byBzd2l0Y2ggYmV0d2VlbiBsaWJyYXJpZXMgYW5kIHNvdXJjZXM8L2E+PC9saT4KKworPGxpPgorPGEgaHJlZj0iI1Vuc2hhcmVkIFByb3h5IGxpYnJhcnkgcHJvamVjdHMiPlVuc2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHM8L2E+PC9saT4KKworPGxpPgorPGEgaHJlZj0iI1NoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIj5TaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0czwvYT48L2xpPgorCis8bGk+Cis8YSBocmVmPSIjU3R1YiBwcm9qZWN0cyI+U3R1YiBwcm9qZWN0czwvYT48L2xpPgorCis8bGk+Cis8YSBocmVmPSIjT3RoZXIgU2NlbmFyaW9zIj5Bc3NvcnRlZCBPdGhlciBTY2VuYXJpb3M8L2E+PC9saT4KKzwvdWw+CisKKzxoMz4KKzxhIE5BTUU9IkNvbXBvbmVudCBwbHVzIGxpYnJhcmllcyI+PC9hPkNvbXBvbmVudCBwbHVzIGxpYnJhcmllczwvaDM+CisKKzx1bD4KKzxsaT4KK1RlYW0gbWVtYmVyJ3Mgd29ya3NwYWNlIGNvbnRhaW5zIGp1c3QgdGhlIHByb2plY3QgZm9yIHRoZWlyIGNvbXBvbmVudC48L2xpPgorCis8bGk+CitFYWNoIHRlYW0gbWVtYmVycyBkb3dubG9hZHMgbGF0ZXN0IGJpbmFyeSBidWlsZCB0byBjOlx0ZW1wXGJ1aWxkXCBvciBzb21lCitzdWNoIGFuZCBzZXRzIGNsYXNzcGF0aCB2YXJpYWJsZSBCVUlMRCA9IGM6XHRlbXBcYnVpbGRcPC9saT4KKworPGxpPgorQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBsaWJyYXJpZXMgcmVsYXRpdmUgdG8gQlVJTEQgY2xhc3NwYXRoCit2YXJpYWJsZS48L2xpPgorCis8bGk+CitVc2Ugb2YgY2xhc3NwYXRoIHZhcmlhYmxlIGFsbG93cyBlYWNoIGRldmVsb3BlciB0byBjaG9vc2Ugd2hlcmUgdG8gaW5zdGFsbAordGhlIGJ1aWxkLjwvbGk+CisKKzxsaT4KK0NsYXNzcGF0aCBpbmNsdWRlcyBsaWJyYXJpZXMgZm9yIGFsbCBwcmVyZXF1aXNpdGUgY29tcG9uZW50cy48L2xpPgorCis8bGk+CitQcm86IHNpbXBsZSB3b3Jrc3BhY2Ugc2V0dXAgKGxvYWQgYSBzaW5nbGUgc2hhcmVkIHByb2plY3QgZnJvbSByZXBvc2l0b3J5CithbmQgc2V0IHNpbmdsZSBjbGFzc3BhdGggdmFyaWFibGUpLjwvbGk+CisKKzxsaT4KK1Bybzogbm8gcmVzdGljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgorCis8bGk+CitQcm86IGVhc3kgdG8gdXBncmFkZSB0byBhbm90aGVyIGJpbmFyeSBidWlsZCAodW56aXAgYnVpbGQgaW4gcGxhY2UsIGFuZAorY2xvc2UgYW5kIHJlb3BlbiBwcm9qZWN0IGluIHdvcmtzcGFjZSB0byBmb3JjZSBhIHJlZnJlc2gpLjwvbGk+CisKKzxsaT4KK0NvbjogdW5hYmxlIHRvIHZpZXcgY29kZSBmb3IgYSBjb21wb25lbnQgdGhhdCBpcyBub3QgYSBwcmVyZXF1aXNpdGUgKHJlcXVpcmVzCitsb2FkaW5nIGFuIGFkZGl0aW9uYWwgcHJvamVjdCkuPC9saT4KKworPGxpPgorQ29uOiB1bmFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIHByZXJlcXVpc3RlIGNvbXBvbmVudHMgaW4gcHJvcGVyIGNvbnRlbnQKKyhjb2RlIGNvbXBsZXRpb24pLjwvbGk+CisKKzxsaT4KK0Nvbjogc3dpdGNoaW5nIHRvIGRldmVsb3BpbmcgYW5vdGhlciBjb21wb25lbnQgaW52b2x2ZXMgbG9hZGluZyBhbm90aGVyCitwcm9qZWN0IGFuZCBjaGFuZ2luZyBjbGFzc3BhdGhzIG9uIGRlcGVuZGVudCBjb21wb25lbnRzIChiYWQsIGJlY2F1c2UgdGhlc2UKK2FyZSBzaGFyZWQpLjwvbGk+CisKKzxsaT4KK0NvbjogcGF0Y2hpbmcgb25seSB2aWEgc3dpdGNoaW5nIHRvIGFjdGl2ZSBkZXZlbG9wbWVudC48L2xpPgorCis8bGk+CitOb3RlOiB1c2VzIGNsYXNzcGF0aCB2YXJpYWJsZXMgd2hvc2UgdmFsdWUgaXMgYSBsaWJyYXJ5IGphciAod29ya3MgaW4gUjEuMCkuPC9saT4KKworPGxpPgorTm90ZTogdGhpcyBpcyByb3VnaGx5IHRoZSB3YXkgUERFIDEuMCB3b3Jrcy48L2xpPgorPC91bD4KK3Byb2plY3QgUDEgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQMiAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBCVUlMRC9jMS5qYXIrQlVJTEQvYzFzcmMuemlwCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AyL2JpbgorPGJyPnwKKzxicj5wcm9qZWN0IFAzIChzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDMvQzM7IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXA7CitCVUlMRC9jMi5qYXIrQlVJTEQvYzJzcmMuemlwCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AzL2JpbgorPGJyPnwKKzxicj5wcm9qZWN0IFA0IChzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDQvQzQ7IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDQvYmluCis8aDM+Cis8YSBOQU1FPSJTb3VyY2UgZm9yIGV2ZXJ5dGhpbmciPjwvYT5Tb3VyY2UgZm9yIGV2ZXJ5dGhpbmc8L2gzPgorCis8dWw+Cis8bGk+CitUZWFtIG1lbWJlcidzIHdvcmtzcGFjZSBjb250YWlucyBhbGwgZm91ciBwcm9qZWN0cyBhbmQgd29ya3MgZW50aXJlbHkgZnJvbQorc291cmNlIGNvZGUuPC9saT4KKworPGxpPgorQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBkZXBlbmRlbnQgcHJvamVjdHMgYnkgbmFtZS48L2xpPgorCis8bGk+CitDbGFzc3BhdGggaW5jbHVkZXMgcHJvamVjdHMgZm9yIGFsbCBwcmVyZXF1aXNpdGUgY29tcG9uZW50cy48L2xpPgorCis8bGk+CitQcm86IGFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzLjwvbGk+CisKKzxsaT4KK1BybzogYWJsZSB0byBkZXZlbG9wIGFueSBjb21wb25lbnQuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIG5vdGljZSBkb3duc3RyZWFtIGltcGFjdCBvZiBhbnkgY2hhbmdlcyBtYWRlIHNpbmNlIGFsbCBjb21wb25lbnRzCithcmUgcHJlc2VudC48L2xpPgorCis8bGk+CitQcm86IGVhc3kgdG8ga2VlcCBjdXJyZW50IChieSBjYXRjaGluZyB1cCB3aXRoIHN0cmVhbSBpbiByZXBvc2l0b3J5KS48L2xpPgorCis8bGk+CitDb246IFZlcnkgc2xvdyB3b3Jrc3BhY2Ugc3RhcnR1cCBhbmQgbGFyZ2UgZm9vdHByaW50IGJlY2F1c2UgZW50YWlscyByZWNvbXBpbGluZworc291cmNlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzLjwvbGk+CisKKzxsaT4KK0NvbjogSW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyAoYXV0b21hdGlvbgorcG9zc2libGUpLjwvbGk+CisKKzxsaT4KK0NvbjogZGlmZmljdWx0eSBoYW5kbGluZyBwcm9qZWN0cyB3aXRoIHByZWNvbXBpbGVkIGxpYnJhcnkgamFycyB0aGF0IG11c3QKK2JlIGV4cG9ydGVkIGJ1dCBkbyBub3QgZXhpc3QgaW4gc291cmNlIChlLmcuLCB0aGUgRWNsaXBzZSBkZWJ1Z2dlcidzIEpESQoramFyKTwvbGk+CisKKzxsaT4KK05vdGU6IHVzZXMgcmVxdWlyZWQgcHJvamVjdHMgKHdvcmtzIGluIFIxLjApLjwvbGk+Cis8L3VsPgorcHJvamVjdCBQMSAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxL0MxCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AxL2JpbgorPGJyPiZhbXA7Cis8YnI+cHJvamVjdCBQMiAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBwcm9qZWN0IFAxCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AyL2JpbgorPGJyPiZhbXA7Cis8YnI+cHJvamVjdCBQMyAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0CitQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KKzxicj4mYW1wOworPGJyPnByb2plY3QgUDQgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QNC9DNDsgcHJvamVjdCBQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QNC9iaW4KKzxoMz4KKzxhIE5BTUU9IkNsYXNzcGF0aCB2YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzIj48L2E+Q2xhc3NwYXRoCit2YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzPC9oMz4KKworPHVsPgorPGxpPgorVGVhbSBtZW1iZXIncyB3b3Jrc3BhY2UgY29udGFpbnMganVzdCB0aGUgcHJvamVjdCBmb3IgdGhlaXIgY29tcG9uZW50LjwvbGk+CisKKzxsaT4KK0VhY2ggdGVhbSBtZW1iZXJzIGRvd25sb2FkcyBsYXRlc3QgYmluYXJ5IGJ1aWxkIHRvIGM6XHRlbXBcYnVpbGRcIG9yIHNvbWUKK3N1Y2ggYW5kIHNldHMgZmFtaWx5IG9mIGNsYXNzcGF0aCB2YXJpYWJsZXMsIG9uZSBwZXIgY29tcG9uZW50OjwvbGk+CisKKzx1bD4KKzxsaT4KK1AxX0xJQiA9IGM6XHRlbXBcYnVpbGRcYzEuamFyPC9saT4KKworPGxpPgorUDJfTElCID0gYzpcdGVtcFxidWlsZFxjMi5qYXI8L2xpPgorCis8bGk+CitQM19MSUIgPSBjOlx0ZW1wXGJ1aWxkXGMzLmphcjwvbGk+CisKKzxsaT4KK1A0X0xJQiA9IGM6XHRlbXBcYnVpbGRcYzQuamFyPC9saT4KKzwvdWw+CisKKzxsaT4KK0J1aWxkIGNsYXNzcGF0aCByZWZlcmVuY2VzIGFuIGluZGl2aWR1YWwgY29tcG9uZW50IHZpYSBhIGNsYXNzcGF0aCB2YXJpYWJsZS48L2xpPgorCis8bGk+CitVc2Ugb2YgY2xhc3NwYXRoIHZhcmlhYmxlIGFsbG93cyBlYWNoIGRldmVsb3BlciB0byBjaG9vc2Ugd2hlcmUgdG8gaW5zdGFsbAordGhlIGJ1aWxkLjwvbGk+CisKKzxsaT4KK0NsYXNzcGF0aCBpbmNsdWRlcyBlbnRyaWVzIGZvciBhbGwgcHJlcmVxdWlzaXRlIGNvbXBvbmVudHMuPC9saT4KKworPGxpPgorUHJvOiBzd2l0Y2ggdG8gZGV2ZWxvcG1lbnQgaW52b2x2ZXMgbG9hZGluZyBhbiBhZGRpdGlvbmFsIHByb2plY3QgaW50bword29ya3NwYWNlIGFuZCByZWJpbmRpbmcgYSBzaW5nbGUgY2xhc3NwYXRoIHZhcmlhYmxlIHRvIHJlZmVyIHRvIHRoYXQgcHJvamVjdC4KK0ZvciBleGFtcGxlLCBsb2FkIHByb2plY3QgUDIgYW5kIHJlYmluZCBQMl9MSUIgPSAvUDIuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKHVuemlwIGJ1aWxkIGluIHBsYWNlLCBhbmQKK2Nsb3NlIGFuZCByZW9wZW4gcHJvamVjdCBpbiB3b3Jrc3BhY2UgdG8gZm9yY2UgYSByZWZyZXNoKS48L2xpPgorCis8bGk+CitDb246IGRpZmZpY3VseSBhdHRhY2hpbmcgZGVidWcgc291cmNlIHRvIGxpYnJhcnkgamFyPC9saT4KKworPGxpPgorQ29uOiBvbmx5IHdvcmtzIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIGxpYnJhcnkgamFyIHBlciBwcm9qZWN0LjwvbGk+CisKKzxsaT4KK0NvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIGEgc2luZ2xlIHNoYXJlZCBwcm9qZWN0IGFuZCBtdWx0aXBsZQordmFyaWFibGUgYmluZGluZ3MgKGF1dG9tYXRpb24gcmVxdWlyZWQpLjwvbGk+CisKKzxsaT4KK0NvbjogY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVzIG11c3QgYmUgYWdyZWVkIG9uIGFjcm9zcyBjb21wb25lbnRzLjwvbGk+CisKKzxsaT4KK0NvbjogdW5hYmxlIHRvIHZpZXcgY29kZSBmb3IgYSBjb21wb25lbnQgdGhhdCBpcyBub3QgYSBwcmVyZXF1aXNpdGUgKHJlcXVpcmVzCitsb2FkaW5nIGFuIGFkZGl0aW9uYWwgcHJvamVjdCkuPC9saT4KKworPGxpPgorQ29uOiB1bmFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIHByZXJlcXVpc3RlIGNvbXBvbmVudHMgaW4gcHJvcGVyIGNvbnRlbnQKKyhjb2RlIGNvbXBsZXRpb24pLjwvbGk+CisKKzxsaT4KK05vdGU6IHVzZXMgY2xhc3NwYXRoIHZhcmlhYmxlcyB3aG9zZSB2YWx1ZSBpcyBlaXRoZXIgYSBwcm9qZWN0IG9yIGEgbGlicmFyeQorKGluIFIxLjAsIEpEVCBjb3JlIHN1cHBvcnRzIHRoZXNlIGJ1dCBKRFQgVUkgZG9lcyBub3QgZXhwb3NlKS48L2xpPgorPC91bD4KK3Byb2plY3QgUDEgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQMiAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBQMV9MSUIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDIvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDMgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgUDFfTElCOyBQMl9MSUIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDQgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QNC9DNDsgUDJfTElCCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgorPGgzPgorPGEgTkFNRT0iVW5zaGFyZWQgUHJveHkgbGlicmFyeSBwcm9qZWN0cyI+PC9hPlVuc2hhcmVkIFByb3h5IGxpYnJhcnkgcHJvamVjdHM8L2gzPgorCis8dWw+Cis8bGk+CitUZWFtIG1lbWJlcidzIHdvcmtzcGFjZSBjb250YWlucyBhIHByb2plY3QgZm9yIGVhY2ggY29tcG9uZW50LjwvbGk+CisKKzxsaT4KK01haW4gcHJvamVjdCBpcyBpbiBzb3VyY2UgYW5kIGlzIHNoYXJlZCB2aWEgdGhlIHJlcG9zaXRvcnkuPC9saT4KKworPGxpPgorQWxsIG90aGVyIHByb2plY3RzIGluIHdvcmtzcGFjZSBhcmUgcHJveHkgbGlicmFyeSBwcm9qZWN0cyAoc2FtZSBuYW1lIGFzCitzb3VyY2UgcHJvamVjdDsgY29udGFpbnMgbm8gc291cmNlIGNvZGU7IG5vdCBzaGFyZWQgdmlhIHJlcG9zaXRvcnkpLjwvbGk+CisKKzxsaT4KK0VhY2ggdGVhbSBtZW1iZXJzIGRvd25sb2FkcyBsYXRlc3QgYmluYXJ5IGJ1aWxkIHRvIGM6XHRlbXBcYnVpbGRcIG9yIHNvbWUKK3N1Y2ggYW5kIHNldHMgY2xhc3NwYXRoIHZhcmlhYmxlIEJVSUxEID0gYzpcdGVtcFxidWlsZFw8L2xpPgorCis8bGk+CitCdWlsZCBjbGFzc3BhdGggZXhwb3J0cyBsaWJyYXJpZXMgcmVsYXRpdmUgdG8gQlVJTEQgY2xhc3NwYXRoIHZhcmlhYmxlLjwvbGk+CisKKzxsaT4KK1VzZSBvZiBjbGFzc3BhdGggdmFyaWFibGUgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvIGNob29zZSB3aGVyZSB0byBpbnN0YWxsCit0aGUgYnVpbGQuPC9saT4KKworPGxpPgorQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBkZXBlbmRlbnQgcHJvamVjdHMgYnkgbmFtZS48L2xpPgorCis8bGk+CitQcm86IGFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzIGluIGNvbnRleHQuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIHN3aXRjaCB0byBhbm90aGVyIGJpbmFyeSBidWlsZC48L2xpPgorCis8bGk+CitQcm86IHN3aXRjaCB0byBwYXRjaGluZyBpbnZvbHZlcyBhZGRpbmcgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyB0byBub24tc2hhcmVkCitwcm9qZWN0LCBwb3B1bGF0aW5nIHdpdGggc2VsZWN0ZWQgc291cmNlIGZpbGVzLCBhbmQgYnVpbGRpbmc7IG5vIG90aGVyCitjbGFzc3BhdGhzIG5lZWQgdG8gYmUgY2hhbmdlZC48L2xpPgorCis8bGk+CitQcm86IHN3aXRjaCB0byBkZXZlbG9wbWVudCBpbnZvbHZlcyBsb2FkaW5nIGFuIGFkZGl0aW9uYWwgc2hhcmVkIHByb2plY3QKK2ludG8gd29ya3NwYWNlIG92ZXIgdG9wIG9mIG5vbi1zaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0OyBubyBjbGFzc3BhdGhzCituZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKHVuemlwIGJ1aWxkIGluIHBsYWNlLCBhbmQKK2Nsb3NlIGFuZCByZW9wZW4gcHJvamVjdCBpbiB3b3Jrc3BhY2UgdG8gZm9yY2UgYSByZWZyZXNoKS48L2xpPgorCis8bGk+CitDb246IGluaXRpYWwgd29ya3NwYWNlIHNldHVwIGludm9sdmluZyBtdWx0aXBsZSBub24tc2hhcmVkIGFuZCBzaGFyZWQgcHJvamVjdHMKKyhhdXRvbWF0aW9uIHJlcXVpcmVkOyBlLmcuLCBwcmVjb25zdHJ1Y3RlZCBiYXNlIHdvcmtzcGFjZSkuPC9saT4KKworPGxpPgorQ29uOiBwcm9qZWN0IGhvbGRpbmcgY29tcG9uZW50IHVuZGVyIGRldmVsb3BtZW50IGlzIGxvc3QgaW4gc2VhIG9mIHByb3h5CitsaWJyYXJ5IHByb2plY3RzLjwvbGk+CisKKzxsaT4KK1Bybzogbm8gcmVzdHJpY3Rpb24gb24gbnVtYmVyIG9mIGphcnMgcGVyIHByb2plY3QuPC9saT4KKworPGxpPgorTm90ZTogdGhlIGV4cG9ydGVkIGxpYnJhcmllcyBhcmUgZXh0ZXJuYWwgdG8gdGhlIHByb2plY3QuPC9saT4KKworPGxpPgorTm90ZTogdXNlcyBsaWJyYXJ5IHByb2plY3RzIChwcm9wb3NlZCBmb3IgUjIuMCkuPC9saT4KKzwvdWw+CitUaGUgYmFzZSB3b3Jrc3BhY2UgZm9yIGRldmVsb3BlcnMgb24gYWxsIHRlYW1zIGxvb2tzIGxpa2U6Cis8cD5wcm9qZWN0IFAxIChub3Qgc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXAKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDIgKG5vdCBzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzIuamFyK0JVSUxEL2Myc3JjLnppcDsKK3Byb2plY3QgUDEKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDMgKG5vdCBzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzMuamFyK0JVSUxEL2Mzc3JjLnppcDsKK3Byb2plY3QgUDE7IHByb2plY3QgUDIKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDQgKG5vdCBzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzQuamFyK0JVSUxEL2Mzc3JjLnppcDsKK3Byb2plY3QgUDIKKzxwPk5vbmUgb2YgdGhlc2UgcHJvamVjdHMgYXJlIHNoYXJlZDsgaG93ZXZlciwgdGhleSBoYXZlIHRoZSBzYW1lIG5hbWVzCithcyB0aGUgc291cmNlIHByb2plY3RzIGluIHJlcG9zaXRvcnkuIFRoaXMgbWVhbnMgdGhhdCBhbnkgb2YgdGhlIGxpYnJhcnkKK3Byb2plY3RzIGNhbiBiZSByZXBsYWNlZCBieSBsb2FkaW5nIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBwcm9qZWN0IGZyb20KK3RoZSByZXBvc2l0b3J5LiAoTm9uZSBvZiB0aGUgb3RoZXIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBuZWVkIHRvIGNoYW5nZS4pCis8cD5wcm9qZWN0IFAxIChzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDIgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9DMjsgcHJvamVjdCBQMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMi9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQMyAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0CitQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQNCAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgorPHA+UmVnYXJkaW5nIGF1dG9tYXRpb24sIHRoZSBjZW50cmFsaXplZCBidWlsZCBjb3VsZCBjcmVhdGUgYSBzaW1wbGUgWE1MCitkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgZm9yIHRoZSB3b3Jrc3BhY2UuCitHaXZlbiB0aGlzIGRvY3VtZW50LCBhIHNwZWNpYWwgcHVycG9zZSBwbHVnLWluIGNvdWxkIGJlIHdyaXR0ZW4gdGhhdCB3b3VsZAorY3JlYXRlIChvciBtb2RpZnkgZXhpc3RpbmcpIHVuc2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KKzxwPjx0dD4mbHQ7cHJvamVjdHM+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwcm9qZWN0IG5hbWU9IlAxIj48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O25hdHVyZXM8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtuYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9uYXR1cmVzPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bGlicmFyaWVzPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQlVJTEQvYzEuamFyIiBzb3VyY2VwYXRoPSJCVUlMRC9jMXNyYy56aXAiCitleHBvcnQ9InRydWUiLz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9saWJyYXJpZXM+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvcHJvamVjdD48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3Byb2plY3QgbmFtZT0iUDIiPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bmF0dXJlczwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworJmx0O25hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L25hdHVyZXM+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtsaWJyYXJpZXM+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJCVUlMRC9jMi5qYXIiIHNvdXJjZXBhdGg9IkJVSUxEL2Myc3JjLnppcCIKK2V4cG9ydD0idHJ1ZSIvPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InByb2plY3QiIHBhdGg9Ii9QMSIvPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2xpYnJhcmllcz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9wcm9qZWN0PjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7cHJvamVjdCBuYW1lPSJQMyI+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtuYXR1cmVzPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7bmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvbmF0dXJlcz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2xpYnJhcmllcz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkJVSUxEL2MzLmphciIgc291cmNlcGF0aD0iQlVJTEQvYzNzcmMuemlwIgorZXhwb3J0PSJ0cnVlIi8+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0icHJvamVjdCIgcGF0aD0iL1AxIi8+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CismbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0icHJvamVjdCIgcGF0aD0iL1AyIi8+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvbGlicmFyaWVzPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L3Byb2plY3Q+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwcm9qZWN0IG5hbWU9IlA0Ij48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O25hdHVyZXM8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtuYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9uYXR1cmVzPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bGlicmFyaWVzPjwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQlVJTEQvYzQuamFyIiBzb3VyY2VwYXRoPSJCVUlMRC9jNHNyYy56aXAiCitleHBvcnQ9InRydWUiLz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJwcm9qZWN0IiBwYXRoPSIvUDIiLz48L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9saWJyYXJpZXM+PC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvcHJvamVjdD48L3R0PgorPGJyPjx0dD4mbHQ7L3Byb2plY3RzPjwvdHQ+Cis8aDM+Cis8YSBOQU1FPSJTaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cyI+PC9hPlNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzPC9oMz4KK0luIHRoZSBwcmV2aW91cyBhcHByb2FjaCB0byB1c2luZyBwcm94eSBsaWJyYXJ5IHByb2plY3RzLCB0aGVzZSBwcm9qZWN0cword2VyZSBub3QgdW5kZXIgVkNNLiBJbiB0aGlzIHZhcmlhbnQgb2YgaXQsIHRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzIGFyZQorb2J0YWluZWQgZnJvbSBhIHJlcG9zaXRvcnkgYXMgd2VsbC4gV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgcHJveHkgbGlicmFyeQorcHJvamVjdHMgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCByZXBvc2l0b3J5IGZyb20gdGhlIHNvdXJjZSBwcm9qZWN0cy4KK0J5IGFzc3VtaW5nIHRoZXkncmUgaW4gYSBzZXBhcmF0ZSBiaW5hcnkgcmVwb3NpdG9yeSwgaXQgaXMgZWFzeSB0byB1c2UKK3RoZSBzYW1lIHByb2plY3QgbmFtZXMgZm9yIGJvdGggc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgKGRvaW5nIHNvIGluIHRoZQorc2FtZSByZXBvc2l0b3J5IHdvdWxkIHJlcXVpcmVkIGludHJvZHVjaW5nIG5vbi1zdGFuZGFyZCBiaW5hcnktb25seSBhbmQKK3NvdXJjZS1vbmx5IGJyYW5jaGVzIGluIHRoZSBwcm9qZWN0IHZlcnNpb24gaGlzdG9yaWVzKS4KKzx1bD4KKzxsaT4KK1RlYW0gbWVtYmVyJ3Mgd29ya3NwYWNlIGNvbnRhaW5zIGEgcHJvamVjdCBmb3IgZWFjaCBjb21wb25lbnQuPC9saT4KKworPGxpPgorTWFpbiBwcm9qZWN0IGlzIGluIHNvdXJjZSBhbmQgaXMgc2hhcmVkIHZpYSB0aGUgcmVwb3NpdG9yeS48L2xpPgorCis8bGk+CitBbGwgb3RoZXIgcHJvamVjdHMgaW4gd29ya3NwYWNlIGFyZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzOyBzYW1lIG5hbWUgYXMKK3NvdXJjZSBwcm9qZWN0LCBidXQgaW4gYSBkaWZmZXJlbnQgcmVwb3NpdG9yeS48L2xpPgorCis8bGk+CitFYWNoIHByb3h5IGxpYnJhcnkgcHJvamVjdCBjb250YWlucyBhbmQgZXhwb3J0cyBvbmUgb3IgbW9yZSBiaW5hcnkgamFyCitsaWJyYXJpZXMgKHBsdXMgYXR0YWNoZWQgc291cmNlIHppcHMpIGVxdWl2YWxlbnQgdG8gdGhlIHNvdXJjZS48L2xpPgorCis8bGk+CitCdWlsZCBjbGFzc3BhdGggcmVmZXJlbmNlcyBpbmRpdmlkdWFsIGRlcGVuZGVudCBwcm9qZWN0cyBieSBuYW1lLjwvbGk+CisKKzxsaT4KK1BybzogYWJsZSB0byBicm93c2UgY29kZSBmb3IgYWxsIGNvbXBvbmVudHMuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIHN3aXRjaCB0byBhbm90aGVyIGJpbmFyeSBidWlsZC48L2xpPgorCis8bGk+CitQcm86IHN3aXRjaCB0byBwYXRjaGluZyBpbnZvbHZlcyBhZGRpbmcgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyB0byBzaGFyZWQKK3Byb3h5IGxpYnJhcnkgcHJvamVjdCwgcG9wdWxhdGluZyB3aXRoIHNlbGVjdGVkIHNvdXJjZSBmaWxlcywgYW5kIGJ1aWxkaW5nOworbm8gb3RoZXIgY2xhc3NwYXRocyBuZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KKworPGxpPgorUHJvOiBzd2l0Y2ggdG8gZGV2ZWxvcG1lbnQgaW52b2x2ZXMgbG9hZGluZyBzaGFyZWQgc291cmNlIHByb2plY3QgaW50bword29ya3NwYWNlIG92ZXIgdG9wIG9mIHNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lOworbm8gY2xhc3NwYXRocyBuZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KKworPGxpPgorUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKGJ5IGNhdGNoaW5nIHVwIHdpdGggYmluYXJ5CitzdHJlYW0gaW4gcmVwb3NpdG9yeSkuPC9saT4KKworPGxpPgorUHJvOiBubyByZXN0cmljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgorCis8bGk+CitQcm86IFByb3h5IGxpYnJhcnkgcHJvamVjdHMgYXJlIGFsc28gdW5kZXIgVkNNLjwvbGk+CisKKzxsaT4KK0NvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyAoYXV0b21hdGlvbgorcG9zc2libGUpLjwvbGk+CisKKzxsaT4KK0NvbjogQWRkaXRpb25hbCBlZmZvcnQgb2YgYnVpbGRpbmcgYW5kIG1haW50YWluZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cworaW4gYSBzZXBhcmF0ZSByZXBvc2l0b3J5IChhdXRvbWF0aW9uIHBvc3NpYmxlLCBwZXJoYXBzIGFzIHBhcnQgb2YgY2VudHJhbGl6ZWQKK2J1aWxkIHByb2Nlc3MpLjwvbGk+CisKKzxsaT4KK0NvbjogcHJvamVjdCBob2xkaW5nIGNvbXBvbmVudCB1bmRlciBkZXZlbG9wbWVudCBpcyBsb3N0IGluIHNlYSBvZiBwcm94eQorbGlicmFyeSBwcm9qZWN0cy48L2xpPgorCis8bGk+CitOb3RlOiB0aGUgZXhwb3J0ZWQgbGlicmFyaWVzIGFyZSBpbnRlcm5hbCB0byB0aGUgcHJvamVjdC48L2xpPgorCis8bGk+CitOb3RlOiB1c2VzIGxpYnJhcnkgcHJvamVjdHMgKHByb3Bvc2VkIGZvciBSMi4wKS48L2xpPgorPC91bD4KK1RoZSBiYXNlIHdvcmtzcGFjZSBmb3IgZGV2ZWxvcGVycyBvbiBhbGwgdGVhbXMgbG9va3MgbGlrZToKKzxwPnByb2plY3QgUDEgKHNoYXJlZCB2aWEgYmluYXJ5IHJlcG9zaXRvcnkpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgL1AxL2MxLmphcitCVUlMRC9jMXNyYy56aXAKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDIgKHNoYXJlZCB2aWEgYmluYXJ5IHJlcG9zaXRvcnkpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgL1AyL2MyLmphcitCVUlMRC9jMnNyYy56aXA7Citwcm9qZWN0IFAxCis8YnI+JmFtcDsKKzxicj5wcm9qZWN0IFAzIChzaGFyZWQgdmlhIGJpbmFyeSByZXBvc2l0b3J5KQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IC9QMy9jMy5qYXIrQlVJTEQvYzNzcmMuemlwOworcHJvamVjdCBQMTsgcHJvamVjdCBQMgorPGJyPiZhbXA7Cis8YnI+cHJvamVjdCBQNCAoc2hhcmVkIHZpYSBiaW5hcnkgcmVwb3NpdG9yeSkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCAvUDQvYzQuamFyK0JVSUxEL2M0c3JjLnppcDsKK3Byb2plY3QgUDIKKzxwPlRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIHNvdXJjZSBwcm9qZWN0cywKK2J1dCBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgcmVwb3NpdG9yeS4KKzxwPnByb2plY3QgUDEgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDIgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDIvQzI7IHByb2plY3QgUDEKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDIvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDMgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDMvQzM7IHByb2plY3QgUDE7IHByb2plY3QKK1AyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AzL2JpbgorPGJyPnwKKzxicj5wcm9qZWN0IFA0IChzaGFyZWQgdmlhIHNvdXJjZSByZXBvc2l0b3J5KQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgorPGgzPgorPGEgTkFNRT0iU3R1YiBwcm9qZWN0cyI+PC9hPlN0dWIgcHJvamVjdHM8L2gzPgorVGhpcyBpcyBhIHZhcmlhdGlvbiBvbiB1bnNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIHRoYXQgbWFrZXMgZGlmZmVyZW50Cit0cmFkZW9mZnMuIFdlIGNhbGwgdGhlc2UgPGk+c3R1YiBwcm9qZWN0czwvaT4uIEluIHBhcnRpY3VsYXIsIHRoZSBhYmlsaXR5Cit0byBicm93c2UgYSBwcmVyZXFpc2l0ZSBjb21wb25lbnQgaXMgdHJhZGVkIGZvciB0aGUgYWJpbGl0eSB0byBoYXZlIG9ubHkKK2EgbWluaW1hbCBzZXQgb2YgZXh0cmEgbGlicmFyeSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLiBUaGUgb25seSBkaWZmZXJlbmNlCitpcyB0aGF0IHN0dWIgcHJvamVjdHMgZG8gbm90IHJlcXVpcmUgb3RoZXIgcHJvamVjdHMgKHdoZXJlYXMgcHJveHkgbGlicmFyeQorcHJvamVjdHMgZGlkIHJlcXVpcmUgb3RoZXIgcHJvamVjdHMpLiBUaGlzIGFsbG93IGEgd29ya3NwYWNlIHRvIGdldCBieQord2l0aCBhIGxlc3MgdGhhbiBjb21wbGV0ZSBzZXQgb2Ygc3R1YiBwcm9qZWN0cy4gQ3JlYXRpbmcgYSBzdHViIHByb2plY3QKK25ldmVyIGZvcmNlcyB5b3UgdG8gY3JlYXRlIG90aGVyIHN0dWIgcHJvamVjdHMuCis8dWw+Cis8bGk+CitNYWluIHByb2plY3QgaXMgaW4gc291cmNlIGFuZCBpcyBzaGFyZWQgdmlhIHRoZSByZXBvc2l0b3J5LjwvbGk+CisKKzxsaT4KK1RoYXQgcHJvamVjdCdzIHJlcXVpcmVkIHByb2plY3RzIGFyZSByZXByZXNlbnRlZCBpbiB3b3Jrc3BhY2UgYnkgc3R1YiBwcm9qZWN0cworKHNhbWUgbmFtZSBhcyBzb3VyY2UgcHJvamVjdDsgbm90IHNoYXJlZCB2aWEgcmVwb3NpdG9yeSkuPC9saT4KKworPGxpPgorU3R1YiBwcm9qZWN0cyBhcmUgbGlicmFyeSBwcm9qZWN0cyAobm8gc291cmNlIGNvZGUpLjwvbGk+CisKKzxsaT4KK0Egc3R1YiBwcm9qZWN0IG9ubHkgcmVwcmVzZW50cyBhIHByb2plY3QncyBvdXR3YXJkIGFwcGVhcmFuY2UgdG8gb3RoZXIKK3Byb2plY3RzLjwvbGk+CisKKzxsaT4KK1N0dWIgcHJvamVjdHMgbmV2ZXIgcmVxdWlyZSBhbnkgb3RoZXIgcHJvamVjdHMuPC9saT4KKworPGxpPgorRWFjaCB0ZWFtIG1lbWJlcnMgZG93bmxvYWRzIGxhdGVzdCBiaW5hcnkgYnVpbGQgdG8gYzpcdGVtcFxidWlsZFwgb3Igc29tZQorc3VjaCBhbmQgc2V0cyBjbGFzc3BhdGggdmFyaWFibGUgQlVJTEQgPSBjOlx0ZW1wXGJ1aWxkXDwvbGk+CisKKzxsaT4KK0J1aWxkIGNsYXNzcGF0aCBleHBvcnRzIGxpYnJhcmllcyByZWxhdGl2ZSB0byBCVUlMRCBjbGFzc3BhdGggdmFyaWFibGUuPC9saT4KKworPGxpPgorVXNlIG9mIGNsYXNzcGF0aCB2YXJpYWJsZSBhbGxvd3MgZWFjaCBkZXZlbG9wZXIgdG8gY2hvb3NlIHdoZXJlIHRvIGluc3RhbGwKK3RoZSBidWlsZC48L2xpPgorCis8bGk+CitCdWlsZCBjbGFzc3BhdGggcmVmZXJlbmNlcyBpbmRpdmlkdWFsIGRlcGVuZGVudCBwcm9qZWN0cyBieSBuYW1lLjwvbGk+CisKKzxsaT4KK1Bybzogc3R1YiBwcm9qZWN0cyBhcmUgbmVlZGVkIG9ubHkgZm9yIGltbWVkaWF0ZSBwcmVyZXF1aXNpdGVzIG9mIG1haW4KK3Byb2plY3QuPC9saT4KKworPGxpPgorQ29uOiB1bmFibGUgdG8gdmlldyBjb2RlIGZvciBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHByZXJlcXVpc2l0ZSAocmVxdWlyZXMKK2xvYWRpbmcgYW4gYWRkaXRpb25hbCBwcm9qZWN0KS48L2xpPgorCis8bGk+CitDb246IHVuYWJsZSB0byBicm93c2UgY29kZSBmb3IgcHJlcmVxdWlzdGUgY29tcG9uZW50cyBpbiBwcm9wZXIgY29udGVudAorKGNvZGUgY29tcGxldGlvbikgYmVjYXVzZSBzdHViIGRvZXMgbm90IHByb3ZpZGUgc3VmZmljaWVudCBjb250ZXh0LjwvbGk+CisKKzxsaT4KK0NvbjogcGF0Y2hpbmcgb25seSB2aWEgc3dpdGNoaW5nIHRvIGFjdGl2ZSBkZXZlbG9wbWVudC48L2xpPgorCis8bGk+CitQcm86IHN3aXRjaCB0byBkZXZlbG9wbWVudCBpbnZvbHZlcyBsb2FkaW5nIGFuIGFkZGl0aW9uYWwgc2hhcmVkIHByb2plY3QKK2ludG8gd29ya3NwYWNlLCBwb3NzaWJseSBvdmVyIHRvcCBvZiBzdHViIHByb2plY3Q7IG5vIGNsYXNzcGF0aHMgbmVlZCB0bworYmUgY2hhbmdlZC48L2xpPgorCis8bGk+CitQcm86IGVhc3kgdG8gdXBncmFkZSB0byBhbm90aGVyIGJpbmFyeSBidWlsZCAodW56aXAgYnVpbGQgaW4gcGxhY2UsIGFuZAorY2xvc2UgYW5kIHJlb3BlbiBwcm9qZWN0IGluIHdvcmtzcGFjZSB0byBmb3JjZSBhIHJlZnJlc2gpLjwvbGk+CisKKzxsaT4KK0NvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyBhbmQgc3R1YgorcHJvamVjdHM7IG9uZ29pbmcgbmVlZCBmb3IgYWRkaXRpb25hbCBzdHViIHByb2plY3RzIHdoZW4gbmV3IHNvdXJjZSBwcm9qZWN0cworYXJlIGxvYWRlZCAoYXV0b21hdGlvbiByZXF1aXJlZCkuPC9saT4KKworPGxpPgorUHJvOiBubyByZXN0cmljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgorCis8bGk+CitGYXRhbCBmbGF3ICghKTogbGltaXRlZCBhYmxlIHRvIGNvbXBpbGUgYWdhaW5zdCBhIHN0dWIgcHJvamVjdCBkdWUgdG8gbGFjaworb2Ygc3VmZmljaWVudCBjb250ZXh0IE5vdGU6IHRoZSBleHBvcnRlZCBsaWJyYXJpZXMgYXJlIGV4dGVybmFsIHRvIHRoZQorcHJvamVjdC48L2xpPgorCis8bGk+CitOb3RlOiB1c2VzIGxpYnJhcnkgcHJvamVjdHMgKHByb3Bvc2VkIGZvciBSMi4wKS48L2xpPgorPC91bD4KK1RoZSBzb3VyY2UgcHJvamVjdHM6Cis8cD5wcm9qZWN0IFAxIChzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCis8YnI+fAorPGJyPnByb2plY3QgUDIgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9DMjsgcHJvamVjdCBQMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMi9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQMyAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0CitQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KKzxicj58Cis8YnI+cHJvamVjdCBQNCAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgorPHA+VGhlIGNvcnJlc3BvbmRpbmcgc3R1YiBwcm9qZWN0cyAobm90ZSB0aGUgYWJzZW5jZSBvZiByZXF1aXJlZCBwcm9qZWN0cyk6Cis8cD5wcm9qZWN0IFAxIChub3Qgc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXAKKzxwPnByb2plY3QgUDIgKG5vdCBzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzIuamFyK0JVSUxEL2Myc3JjLnppcAorPHA+cHJvamVjdCBQMyAobm90IHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCBCVUlMRC9jMy5qYXIrQlVJTEQvYzNzcmMuemlwCis8cD5wcm9qZWN0IFA0IChub3Qgc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2M0LmphcitCVUlMRC9jM3NyYy56aXAKKzxwPkZvciBleGFtcGxlLCBhIGRldmVsb3BlciB3b3JraW5nIG9uIFAzIHdvdWxkIG5lZWQgc3R1YiBwcm9qZWN0cyBmb3IKK1AxIGFuZCBQMi4KKzxwPnByb2plY3QgUDMgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgcHJvamVjdCBQMTsgcHJvamVjdAorUDIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCis8YnI+JmFtcDsKKzxicj5wcm9qZWN0IFAyIChub3Qgc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDEgKG5vdCBzaGFyZWQpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzEuamFyK0JVSUxEL2Mxc3JjLnppcAorPHA+SWYgdGhleSB0aGVuIGRlY2lkZWQgdG8gZGV2ZWxvcCBQMSBhcyB3ZWxsLCB0aGV5IHdvdWxkIHJlcGxhY2UgUDEgYnkKK3RoZSBzb3VjZSBwcm9qZWN0LiBUaGVpciB3b3Jrc3BhY2Ugd291bGQgbm93IGxvb2sgbGlrZToKKzxwPnByb2plY3QgUDMgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgcHJvamVjdCBQMTsgcHJvamVjdAorUDIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCis8YnI+JmFtcDsKKzxicj5wcm9qZWN0IFAyIChub3Qgc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKKzxicj4mYW1wOworPGJyPnByb2plY3QgUDEgKHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KKzxwPlRoZSBmYXRhbCBmbGF3IGlzIGNsZWFyIGluIHRoZSBjYXNlIG9mIGEgd29ya3NwYWNlIGNvbnRhaW5pbmcgUDQgYW5kCithIHN0dWIgZm9yIFAyLgorPHA+cHJvamVjdCBQNCAoc2hhcmVkKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgorPGJyPiZhbXA7Cis8YnI+cHJvamVjdCBQMiAobm90IHNoYXJlZCkKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCBCVUlMRC9jMi5qYXIrQlVJTEQvYzJzcmMuemlwCis8cD5JZiwgZm9yIGV4YW1wbGUsIGEgY2xhc3MgaW4gQzQgc3ViY2xhc3NlcyBhIGNsYXNzIGluIEMyIHdoaWNoIHN1YmNsYXNzZXMKK2EgY2xhc3MgaW4gQzEsIHRoZW4gdGhlIGNvbXBpbGVyIHdpbGwgbmVlZCB0byBnZXQgaXRzIGhhbmRzIG9uIHRoZSBjbGFzcworaW4gQzEuIFVuZm9ydHVuYXRlbHksIG5laXRoZXIgdGhlIHNvdXJjZSBjb2RlIG5vciBiaW5hcnkgZm9yIEMxIGlzIGFueXdoZXJlCit0byBiZSBmb3VuZC4KKzxoMz4KKzxhIE5BTUU9Ik90aGVyIFNjZW5hcmlvcyI+PC9hPkFzc29ydGVkIE90aGVyIFNjZW5hcmlvczwvaDM+CitBIGNvdXBsZSBvZiBvdGhlciBzY2VuYXJpb3MgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlCit0ZWNobmlxdWVzIGVtcGxveWVkIGFib3ZlOgorPHVsPgorPGxpPgorVW5zaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cyB3aXRoIGRpZmZlcmVudCBwcm9qZWN0IG5hbWVzLjwvbGk+CisKKzxicj5Vc2UgYSBjbGFzc3BhdGggdmFyaWFibGUgcGVyIGNvbXBvbmVudDsgYmluZCBpdCBpbml0aWFsbHkgdG8gdGhlIG5hbWUKK29mIHRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3Q7IHJlYmluZCB0byBuYW1lIG9mIHRoZSBzb3VyY2UgcHJvamVjdC4KKzx1bD4KKzxsaT4KK1BybzogQWxsb3dzIHNpZGUtYnktc2lkZSBwcm94eSBsaWJyYXJ5IHByb2plY3QgYW5kIHNvdXJjZSBwcm9qZWN0LjwvbGk+CisKKzxsaT4KK0NvbjogVXNlcyBib3RoIGNsYXNzcGF0aCB2YXJpYWJsZXMgYW5kIHByb3h5IGxpYnJhcnkgcHJvamVjdHMuPC9saT4KKzwvdWw+CisKKzxsaT4KK1NoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIHdpdGggZGlmZmVyZW50IHByb2plY3QgbmFtZXMuPC9saT4KKworPGJyPlNhbWUgYXMgcHJlY2VkaW5nIGV4Y2VwdCB0aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0cyBjYW4gYmUgc2hhcmVkLgorVXNlIGEgY2xhc3NwYXRoIHZhcmlhYmxlIHBlciBjb21wb25lbnQ7IGJpbmQgaXQgaW5pdGlhbGx5IHRvIHRoZSBuYW1lIG9mCit0aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0OyByZWJpbmQgdG8gbmFtZSBvZiB0aGUgc291cmNlIHByb2plY3QuIFNpbmNlCit0aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0IGFuZCBzb3VyY2UgcHJvamVjdHMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMsIHRoZXJlCithcmUgbm8gVkNNIGFub21hbGllcy4KKzx1bD4KKzxsaT4KK1BybzogQWxsb3dzIHNpZGUtYnktc2lkZSBwcm94eSBsaWJyYXJ5IHByb2plY3QgYW5kIHNvdXJjZSBwcm9qZWN0LjwvbGk+CisKKzxsaT4KK1BybzogUHJveHkgbGlicmFyeSBwcm9qZWN0cyBhcmUgYWxzbyB1bmRlciBWQ00uPC9saT4KKworPGxpPgorQ29uOiBVc2VzIGJvdGggY2xhc3NwYXRoIHZhcmlhYmxlcyBhbmQgcHJveHkgbGlicmFyeSBwcm9qZWN0cy48L2xpPgorPC91bD4KKworPGxpPgorU2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgd2l0aCBzYW1lIHByb2plY3QgbmFtZXMgYW5kIHNhbWUgcmVwb3NpdG9yeS48L2xpPgorCis8YnI+VGhlIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzb3VyY2UgcHJvamVjdAorYW5kIGJlIG1haW50YWluZWQgdW5kZXIgVkNNIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkgYXMgdGhlIHNvdXJjZSBwcm9qZWN0cy4KK05vdGUgdGhhdCB0aGlzIGlzIGEgbm9uLXN0YW5kYXJkIGFycmFuZ2VtZW50IGZvciBhIFZDTSBwcm9qZWN0LiBUaGUgc291cmNlCithbmQgYmluYXJ5IHZlcnNpb25zIG9mIGEgcHJvamVjdCBuZWVkIHRvIGJlIHRob3VnaHQgb2YgYXMgdHdvIHBlcm1hbmVudGx5CitzZXBhcmF0ZSBicmFuY2hlcyBpbiB0aGUgdmVyc2lvbiBoaXN0b3J5OiB0aGUgc291cmNlIHZlcnNpb25zIGNvbnRhaW5zCitzb3VyY2UgY29kZSBidXQgbm8gYmluYXJpZXMsIHdoZXJlYXMgdGhlIGJpbmFyeSB2ZXJzaW9ucyBjb250YWlucyBiaW5hcmllcworYnV0IG5vIHNvdXJjZSBjb2RlLiBUaGUgZGlmZmVyZW5jZXMgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZSBwcm9qZWN0J3MKKy5jbGFzc3BhdGggZmlsZS4gSW4gRWNsaXBzZSwgdGhpcyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgdXNlIG9mIGEKK2JpbmFyaWVzLW9ubHkgc3RyZWFtIHNlcGFyYXRlIGZyb20gdGhlIHVzdWFsIHN0cmVhbSBpbiB3aGljaCB0aGUgc291cmNlCitpcyBtYWludGFpbmVkLiBJbiBvcmRlciB0byBhdm9pZCBnZW5lcmF0aW5nIHVud2FudGVkIG91dGdvaW5nIG9yIGluY29taW5nCitjaGFuZ2VzIHdoZW4gc3dpdGNoaW5nIGZyb20gYmluYXJ5IHRvIHNvdXJjZSwgcHJvY2VlZCBhcyBmb2xsb3dzOiB1bnNoYXJlCitmcm9tIGJpbmFyeSBzdHJlYW07IGRlbGV0ZSBmcm9tIHdvcmtzcGFjZTsgbG9hZCBhbmQgc2hhcmUgZnJvbSBzb3VyY2Ugc3RyZWFtLgorPHVsPgorPGxpPgorUHJvOiBQcm94eSBsaWJyYXJ5IHByb2plY3RzIGFyZSBhbHNvIHVuZGVyIFZDTS48L2xpPgorCis8bGk+CitQcm86IE9uZSByZXBvc2l0b3J5IGhvbGRzIGV2ZXJ5dGhpbmcuPC9saT4KKworPGxpPgorQ29uOiBQcm9qZWN0IGhhcyBub24tc3RhbmRhcmQgZHVhbCB2ZXJzaW9uIGhpc3RvcnkuPC9saT4KKworPGxpPgorQ29uOiBTZXBhcmF0ZSBiaW5hcmllcy1vbmx5IHN0cmVhbSBtZWFucyBzZXBhcmF0ZSBicmFuY2ggaW4gdmVyc2lvbiBoaXN0b3J5LjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorRGlzY3Vzc2lvbjwvaDM+CitPZiB0aGUgdmFyaW91cyB3b3Jrc3BhY2Ugc2V0dXBzIGRpc2N1c3NlZCwgdGhlICJDb21wb25lbnQgcGx1cyBsaWJyYXJpZXMiCithcHByb2FjaCBpcyB0aGUgbW9zdCBzdHJhaWdodGZvcndhcmQsIGJ1dCBhbHNvIHRoZSB3ZWFrZXN0LiBJdCBzaG91bGQgd29yaword2VsbCBpbiBjYXNlcyB3aGVyZSBkZXZlbG9wZXJzIHdvcmsgb24gZXhhY3RseSB0aGUgY29tcG9uZW50IHRoZXkgYXJlIGFzc2lnbmVkLgorQnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCBpbiBjYXNlcyB3aGVyZSBkZXZlbG9wZXJzIGFzc2lnbmVkIHRvIG9uZSBjb21wb25lbnQKK3dvdWxkIG5lZWQgdG8gcGF0Y2ggb3IgZGV2ZWxvcCBhbm90aGVyIGNvbXBvbmVudCBpbiB0aGUgc2FtZSB3b3Jrc3BhY2UuCis8cD5UaGUgIlNvdXJjZSBmb3IgZXZlcnl0aGluZyIgYXBwcm9hY2ggaXMgYmVzdCBmb3IgZGV2ZWxvcGVycyB3aG8gYXJlCithbGwgaW52b2x2ZWQgaW4gdGhlIGpvaW50IGFjdGl2ZSBkZXZlbG9wbWVudCBvZiBhbGwgb2YgdGhlIGNvbXBvbmVudHMuCitUaGVyZSBpcyBhIGxpbWl0IHRvIGhvdyBsYXJnZSBpdCB3aWxsIHNjYWxlLCBzaW5jZSB0aGUgY29zdCBvZiByZWNvbXBpbGluZworZXZlcnl0aGluZyBmcm9tIHNvdXJjZSBpbmNyZWFzZXMgbWV0aG9kIHRoZSBudW1iZXIgYW5kIHNpemUgb2YgY29tcG9uZW50cy4KK0l0IGlzIG5vdCByZWNvbW1lbmRlZCBpbiBzaXR1YXRpb25zIHdoZXJlIG1hbnkgb2YgdGhlIGNvbXBvbmVudHMgYXJlIG5vdAordW5kZXIgYWN0aXZlIGRldmVsb3BtZW50OyBpdCB3aWxsIGJlIG1vcmUgZWZmaWNpZW50IHRvIHVzZSBwcmUtY29tcGlsZWQKK2JpbmFyeSBsaWJyYXJpZXMgZm9yIHRoZSBzdGF0aWMgY29tcG9uZW50cy4KKzxwPkFwcHJvYWNoZXMgaW52b2x2aW5nIGNsYXNzcGF0aCB2YXJpYWJsZXMgZG8gbm90IGhhdmUgbXVjaCB0byByZWNvbW1lbmQKK3RoZW0uIFRoZXkgc2hhcmUgbW9zdCBvZiB0aGUgZGlzYWR2YW50YWdlcyAoYW5kIG5vbmUgb2YgdGhlIGFkdmFudGFnZXMpCitvZiB1c2luZyBwcm94eSBsaWJyYXJ5IHByb2plY3RzLgorPHA+VGhlICJQcm94eSBMaWJyYXJ5IFByb2plY3RzIiB3b3Jrc3BhY2Ugc2V0dXAgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvCit3b3JrIG9uIHRoZWlyIGFzc2lnbmVkIGNvbXBvbmVudCB3aGlsZSBwcm92aWRpbmcgcmVhZHkgYWNjZXNzIHRvIGFsbCBvdGhlcgorY29tcG9uZW50cy4gVGhlIGFycmFuZ2VtZW50IGlzIGZsZXhpYmxlIGluIGFsbG93aW5nIGVhc3kgc3dpdGNoaW5nIGZyb20KK3VzaW5nIGEgY29tcG9uZW50IHRvIHBhdGNoaW5nIGl0IChvciB0byBhY3RpdmVseSBkZXZlbG9waW5nIGl0KS4gVGhlIHR3bworc2V0dXBzIG91dGxpbmVkIGluIGRldGFpbCBzaG93IGhvdyB0aGUgcHJveHkgYmluYXJ5IHByb2plY3RzIGNhbiBiZSBjb25zdHJ1Y3RlZAorZnJvbSBhIGRvd25sb2FkYWJsZSBiaW5hcnkgYnVpbGQgb3Igb2J0YWluZWQgZnJvbSBhIHZlcnNpb24tbWFuYWdlZCByZXBvc2l0b3J5LgorRWFjaCBoYXMgdGhlcmUgcGx1c2VzIGFuZCBtaW51c2VzLiBUaGUgbWFpbiBkcmF3YmFjayBvZiB1c2luZyB1bnNoYXJlZAorcHJveHkgbGlicmFyeSBwcm9qZWN0cyBpcyB0aGUgc2lnbmlmaWNhbnQgdGFzayBvZiBzZXR0aW5nIHVwIGEgd29ya3NwYWNlCitpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgdGFzayB3b3VsZCBoYXZlIHRvIGJlIGF1dG9tYXRlZCBieSBzb21lIG1lYW5zOworaXQgd291bGQgdG9vIHRlZGlvdXMgYW5kIGVycm9yIHByb25lIHRvIGhhdmUgZWFjaCBkZXZlbG9wZXIgY3JlYXRlIGEgd29ya3NwYWNlCitmcm9tIHNjcmF0Y2guIEZvciBzaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cywgdGhlIHRlZGl1bSBpcyBpbiBjcmVhdGluZworbmV3IHZlcnNpb25zIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGVpciByZXBvc2l0b3J5LiBUaGlzIHRhc2sgY291bGQgYmUgYXV0b21hdGVkCithcyBwYXJ0IG9mIHRoZSBjZW50cmFsaXplZCBidWlsZCBwcm9jZXNzLgorPHA+VGhlICJTdHViIFByb2plY3RzIiB3b3Jrc3BhY2Ugc2V0dXAgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvIHdvcmsgb24KK3RoZWlyIGFzc2lnbmVkIGNvbXBvbmVudCB3aGlsZSBwcm92aWRpbmcgcGxhY2Vob2xkZXJzIGZvciBvdGhlciBjb21wb25lbnRzCit0aGF0IGl0IGRlcGVuZHMgb24uIFRoZSBhcnJhbmdlbWVudCBpcyBmbGV4aWJsZSBpbiBhbGxvd2luZyBlYXN5IHN3aXRjaGluZworZnJvbSB1c2luZyBhIGNvbXBvbmVudCB0byBhY3RpdmVseSBkZXZlbG9waW5nIGl0IGJ5IHJlcGxhY2luZyB0aGUgcGxhY2Vob2xkZXIuCitVbmZvcnR1bmF0ZWx5LCB0aGlzIGFwcHJvYWNoIGlzIGZhdGFsbHkgZmxhd2VkIGJlY2F1c2UgYSBjb21waWxlciBtaWdodAorbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNvbXBpbGUuIFRoZSBvdGhlciBkcmF3YmFja3MgYXJlIHRoZWlyIGxpbWl0ZWQKK3VzZWZ1bCBvZiB0aGUgc3R1YiBwcm9qZWN0cyAoY2FuJ3QgYnJvd3NlIHRoZSBjb21wb25lbnQ7IGNhbid0IHBhdGNoIHRoZQorY29tcG9uZW50KSwgYW5kIHRoZSBvbmdvaW5nIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgcHJveHkgcHJvamVjdHMgdG8KK2ZpbGwgaW4gZm9yIHRoZSBtaXNzaW5nIHByZXJlcXVpc2l0ZXMgYXMgcmVhbCBzb3VyY2UgcHJvamVjdHMgZ2V0IGFkZGVkCit0byB0aGUgd29ya3NwYWNlLgorPGgzPgorRG9jdW1lbnQgSGlzdG9yeTwvaDM+CisxNTo0NSBXZWRuZXNkYXkgU2VwdGVtYmVyIDUsIDIwMDEgLSBmaXJzdCB2ZXJzaW9uIHNlbnQgZm9yIGNvbW1lbnRzCis8YnI+MTM6MzAgVGh1cnNkYXkgU2VwdGVtYmVyIDYsIDIwMDEgLSByZXZpc2VkIGZvciBmaXJzdCByb3VuZCBvZiBjb21tZW50cworPGJyPjE5OjQwIFdlZG5lc2RheSBTZXB0ZW1iZXIgMTIsIDIwMDEgLSBhdXRvbWF0aW9uIGZvciB1bnNoYXJlZCBwcm94eQorbGlicmFyeSBwcm9qZWN0cworPGJyPjEwOjE1IFdlZG5lc2RheSBTZXB0ZW1iZXIgMjYsIDIwMDEgLSBhZGRlZCBzdHViIHByb2plY3RzCis8YnI+MTc6MDAgV2VkbmVzZGF5IFNlcHRlbWJlciAyNiwgMjAwMSAtIGRvY3VtZW50ZWQgZmF0YWwgZmxhdyB3aXRoIHN0dWIKK3Byb2plY3RzCis8YnI+Jm5ic3A7Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzgwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvd29ya3NwYWNlIHN0cnVjdHVyZS93cy1zdHJ1Y3R1cmUuaHRtbApAQCAtMCwwICsxLDQ0OCBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5KRFQgLSBXb3Jrc3BhY2Ugc3RydWN0dXJlPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDI+CitXb3Jrc3BhY2UgU3RydWN0dXJlPC9oMj4KK0xhc3QgcmV2aXNlZCAxMToxNSBTYXR1cmRheSBTZXB0ZW1iZXIgOCwgMjAwMQorPHA+T3JpZ2luYWwgd29yayBpdGVtOiAiTWFrZSB0aGUgYnVpbGQgcGF0aCBsZXNzIHNlbnNpdGl2ZSB3aXRoIHJlZ2FyZAordG8gd2hldGhlciBhIHByb2plY3QgaXMgYSBzb3VyY2Ugb3IgYSBiaW5hcnkgcHJvamVjdC4gVGhpcyBpcyBhbHNvIHJlbGF0ZWQKK3RvIHBhdGNoaW5nIChpLmUuLCBhZGRpbmcgYSBzb3VyY2UgZm9sZGVyIHRvIGEgYmluYXJ5IHByb2plY3QpLiIKKzxwPlJlbGF0ZWQgaXNzdWU6IHN1cHBvcnQgZm9yIGV4dGVuc2lvbiBkaXJlY3RvcmllcyBjb250YWluaW5nIG1hbnkgamFycy4KKzxwPlRoZXJlIHdhcyBtdWNoIGRpc2N1c3Npb24uIFRoZSB1bmRlcmx5aW5nIGlzc3VlIGlzIGhvdyB0byBzdHJ1Y3R1cmUKK3dvcmtzcGFjZXMgZm9yIHNpZ25pZmljYW50IEphdmEgZGV2ZWxvcG1lbnQgZWZmb3J0cy4gVGhlIEVjbGlwc2UgUHJvamVjdAoraXMgYW4gZXhhbXBsZSBvZiBzdWNoIGFuIGVmZm9ydCwgc28gdGhlIHF1ZXN0aW9uIGlzIG5vdCBtZXJlbHkgb2YgcGFzc2luZworaW50ZXJlc3QuIFNpbmNlIG11Y2ggb2Ygd2hhdCBpcyBiZWluZyBkZXZlbG9wZWQgaW4gdGhlIEVjbGlwc2UgUHJvamVjdAorYXJlIHBsdWctaW5zLCB0aGUgcXVlc3Rpb24gYWxzbyB0b3VjaGVzIG9uIFBERSdzIGRvbWFpbi4gSG93ZXZlciwgc29tZQorYXNwZWN0cyBvZiB0aGUgcHJvYmxlbSBhZmZlY3QgYWxsIHNpZ25pZmljYW50IEphdmEgZGV2ZWxvcG1lbnQgZWZmb3J0cworYW5kIG5vdCBqdXN0IG9uZXMgZm9yIGRldmVsb3BpbmcgcGx1Zy1pbnMuIFNvIHdlIGJlZ2luIHRvIGludmVzdGlnYXRpbmcKK3Rob3NlLgorPGgzPgorUHJvYmxlbTogQ2xvc2UgQ29sbGFib3JhdGlvbiBiZXR3ZWVuIEFkamFjZW50IFRlYW1zPC9oMz4KK1RoZSBmb2xsb3dpbmcgaXMgYW4gYXR0ZW1wdCB0byBjYXB0dXJlIGEgZmFtaWxpYXIgcHJvYmxlbSBpbiBhIGdlbmVyYWwKK3dheSB0aGF0IGRvZXMgbm90IHByZXN1bWUgZXhhY3RseSBob3cgZGV2ZWxvcGVycycgd29ya3NwYWNlcyBhcmUgdG8gYmUKK3N0cnVjdHVyZWQuIENvbnNpZGVyIHRoZSBjYXNlIG9mIHR3byBjb21wb25lbnRzLCB3aXRoIFBVSSBkZXBlbmRlbnQgb24KK0NvcmUgKGltYWdpbmUgdGhhdCBDb3JlIGlzIHRoZSBjb3JlIGNvbXBvbmVudCwgYW5kIFVJIGlzIHRoZSBjb3JyZXNwb25kaW5nCitVSSBjb21wb25lbnQgYnVpbHQgYXRvcCBpdCkuIE5vdyBpbWFnaW5lIHRoYXQgQ29yZSBhbmQgVUkgYXJlIHVuZGVyIGFjdGl2ZQorZGV2ZWxvcG1lbnQgYnkgdHdvIHRlYW1zLCB3aXRoIG93bmVyc2hpcCBzcGxpdCBhbG9uZyBjb21wb25lbnQgbGluZXMuIEZvcgorbWF4aW11bSBjb252ZW5pZW5jZSB0byBib3RoIHRlYW1zLCB0aGUgdGVhbXMgd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIGRvCit0aGUgZm9sbG93aW5nOgorPHVsPgorPGxpPgorRWFjaCB0ZWFtIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byB3b3JrIGluIGEgd29ya3NwYWNlIHRoYXQgY29udGFpbnMgdGhlCitzb3VyY2UgY29kZSBmb3IgdGhlaXIgY29tcG9uZW50IGFuZCB0aGUgYmluYXJ5IGVxdWl2YWxlbnQgKHdpdGggYXR0YWNoZWQKK3NvdXJjZSkgZm9yIGFsbCBvdGhlciBjb21wb25lbnRzLjwvbGk+CisKKzxsaT4KK09jY2FzaW9uYWxseSAoZS5nLiwgZHVyaW5nIGRlYnVnZ2luZykgZWFjaCB0ZWFtIHdvdWxkIGxpa2UgYW4gZWFzeSB3YXkKK3RvIHdvcmthcm91bmQgKG9yIHBlcmhhcHMgaW5kdWNlKSBwcm9ibGVtcyBpbiBhbm90aGVyIGNvbXBvbmVudC48L2xpPgorCis8bGk+CitPY2Nhc2lvbmFsbHkgZWFjaCB0ZWFtIHdvdWxkIGxpa2UgYW4gZWFzeSB3YXkgZm9yIG1lbWJlcnMgdG8gImpvaW4gdGhlCitvdGhlciB0ZWFtIiBhbmQgbW9yZSBhY3RpdmVseSB3b3JrIG9uIGFub3RoZXIgY29tcG9uZW50LjwvbGk+Cis8L3VsPgorR2VuZXJhbGl6ZSBmcm9tIDIgdG8gTiB0aGUgbnVtYmVyIG9mIHRlYW1zIGFuZCBjb21wb25lbnRzIHRvIGdldCB0aGUgZnVsbAorZXh0ZW50IG9mIHRoZSBwcm9ibGVtLgorPGgzPgorUHJvYmxlbTogTGFyZ2UgTnVtYmVycyBvZiBMaWJyYXJpZXM8L2gzPgorVGhlIGZvbGxvd2luZyBFY2xpcHNlIENvcm5lciBwb3N0aW5nIChKb24gU2tlZXQgJmx0O3NrZWV0QHBvYm94LmNvbT4gb24KKzIwLjguMjAwMSkgZGVzY3JpYmVzIG9uZSBjb25jZXJuIHdlbGw6Cis8YmxvY2txdW90ZT48aT5SZWZlcmVuY2luZyBhIHByb2plY3QncyBsaWJyYXJpZXMgaW4gYW5vdGhlciBwcm9qZWN0OiBUaGUKK3Byb2plY3QgSSdtIHdvcmtpbmcgb24gdXNlcyBhIGZhaXJseSBsYXJnZSBudW1iZXIgb2YgbGlicmFyaWVzIChhYm91dCAyMAoramFyIGZpbGVzLCBJSVJDKS4gSSBoYWQgaG9wZWQgSSdkIGJlIGFibGUgdG8gY3JlYXRlIG9uZSBwcm9qZWN0IHdoaWNoIHVzZWQKK3RoZXNlIGxpYnJhcmllcywgYW5kIG1ha2UgYWxsIG90aGVyIHByb2plY3RzIGhhdmUgdGhhdCBwcm9qZWN0IG9uIHRoZWlyCitidWlsZC1wYXRocyB0byBicmluZyBpbiB0aGUgbGlicmFyaWVzIC0gdGhhdCB3YXkgSSB3b3VsZG4ndCBuZWVkIHRvIGNoYW5nZQorKmV2ZXJ5KiBwcm9qZWN0IGV2ZXJ5IHRpbWUgSSBhZGRlZCBvciByZW1vdmVkIGEgbGlicmFyeS4gKEl0J3Mgbm90IGEgY29tbW9uCitvcGVyYXRpb24sIGJ1dCBldmVuIHNvLi4uKSBVbmZvcnR1bmF0ZWx5LCBJIGNhbid0IGdldCB0aGlzIHRvIHdvcmsgLSBwdXR0aW5nCitwcm9qZWN0IEEgb24gdGhlIGNsYXNzcGF0aCBvZiBwcm9qZWN0IEIgb25seSBzZWVtcyB0byBwdXQgcHJvamVjdCBBJ3MgaW5kaXZpZHVhbAorc291cmNlL2NsYXNzIGZpbGVzIG9uIHRoZSBjbGFzc3BhdGggZm9yIHByb2plY3QgQi4gSSd2ZSB0cmllZCBhZGRpbmcgYXMKK2FuIGV4dGVybmFsIGphciBhbmQgaW1wb3J0aW5nIHRoZSBqYXIgZmlsZSBpbnRvIHRoZSBwcm9qZWN0LCBhbmQgaGFkIG5vCitqb3kgd2l0aCBlaXRoZXIgOig8L2k+PC9ibG9ja3F1b3RlPgorSGVyZSBpcyB0aGUgYXJyYW5nZW1lbnQ6Cis8YmxvY2txdW90ZT5wcm9qZWN0IFAxCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvc3JjOyBsaWJyYXJ5IGxpYjEuamFyOworbGlicmFyeSBsaWIyLmphcjsgLi4uOyBsaWJyYXJ5IGxpYjIwLmphcgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AxL2JpbgorPGJyPnByb2plY3QgUDIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9zcmM7IGxpYnJhcnkgbGliMS5qYXI7CitsaWJyYXJ5IGxpYjIuamFyOyAuLi47IGxpYnJhcnkgbGliMjAuamFyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDIvYmluPC9ibG9ja3F1b3RlPgorSXQgaXMgY2xlYXIgdGhhdCB0aGUgY3VzdG9tZXIgaXMgbG9va2luZyBmb3IgYSB3YXkgdG8gZGVhbCB3aXRoIGEgc2V0IG9mCitsaWJyYXJpZXMgdGhhdCB3b3VsZCBiZSByZXF1aXJlZCBieSBzZXZlcmFsIHByb2plY3RzLCBhbmQgd2FzIGhvcGluZyB0aGF0CityZXF1aXJlZCBwcm9qZWN0cyB3b3VsZCBnaXZlIGhpbSB0aGF0LgorPGgzPgorUmV2aWV3OiBSZXF1aXJlZCBQcm9qZWN0czwvaDM+CitJbiBFY2xpcHNlIDEuMCwgdGhlIGJ1aWxkIGNsYXNzcGF0aCBmb3IgYSBwcm9qZWN0IFAgY2FuIGNvbnRhaW4gYW4gZW50cnkKK2ZvciBhbm90aGVyIHByb2plY3QgUiwgY2FsbGVkIGEgPGI+cmVxdWlyZWQgcHJvamVjdDwvYj4uIFJlcXVpcmVkIHByb2plY3RzCit3b3JrIGFzIGZvbGxvd3M6Cis8dWw+Cis8bGk+CitUaGUgY2xhc3MgZmlsZXMgaW4gdGhlIGJpbmFyeSBvdXRwdXQgZGlyZWN0b3J5IG9mIFIgYXJlIGluY2x1ZGVkLCBsaWtlCithIGxpYnJhcnksIG9uIHRoZSBlZmZlY3RpdmUgYnVpbGQgY2xhc3NwYXRoIG9mIFAuIFAncyBidWlsZCBjbGFzc3BhdGggaW5kaWNhdGVzCit0aGUgb3JkZXIgb2YgdGhpcyBsaWJyYXJ5IHJlbGF0aXZlIHRvIG90aGVycy4gT3RoZXIgbGlicmFyeSAoYW5kIHByb2plY3QpCitlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb2YgUiBoYXZlIG5vIGJlYXJpbmcgb24gUDsgdGhleSBhcmUgb25seQorY29uc3VsdGVkIHRvIGJyb3dzZSBvciBidWlsZCBSLjwvbGk+CisKKzxsaT4KK1RoZSBuYW1lcyBvZiByZXF1aXJlZCBwcm9qZWN0cyBhcmUgcmVjb3JkZWQgaW4gdGhlIC5jbGFzc3BhdGggZmlsZSwgd2hpY2gKK2lzIHVuZGVyIFZDTS4gVGhleSBhcmUgdGhlcmVmb3JlIHNoYXJlYWJsZSB3aXRoIG90aGVyIGRldmVsb3BlcnMuPC9saT4KKworPGxpPgorUHJvamVjdHMgYXJlIHByZXNlbnRlZCBhcyB0b3AgbGV2ZWwgZWxlbWVudHMgaW4gdGhlIHN0YW5kYXJkIHBhY2thZ2VzIHZpZXcuCitBIHJlcXVpcmVkIHByb2plY3QgaXMgbm90IHByZXNlbnRlZCBpbiB0aGUgcGFja2FnZXMgdmlldyBhcyBhIGNoaWxkIG9mCit0aGUgcHJvamVjdChzKSB0aGF0IHJlcXVpcmVzIGl0LjwvbGk+CisKKzxsaT4KK0EgcHJvamVjdCdzIGxpc3Qgb2YgcmVxdWlyZWQgcHJvamVjdHMgKGEgSkRUIGNvcmUgbm90aW9uKSBpcyB1c2VkIHRvIGNvbXB1dGVkCit0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb2plY3QncyBsaXN0IG9mIHByb2plY3QgcmVmZXJlbmNlcyAoYSB3b3Jrc3BhY2UKK25vdGlvbikuPC9saT4KKworPGxpPgorTWlzc2luZyByZXF1aXJlZCBwcm9qZWN0cyBhbmQgbGlicmFyaWVzLCBhbmQgdW5ib3VuZCBjbGFzc3BhdGggdmFyaWFibGVzLAorZ2VuZXJhdGUgcHJvYmxlbXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgcHJvamVjdCByZXNvdXJjZSBpdHNlbGYuIFRoZXNlIGtpbmQKK29mIHByb2JsZW1zIGFyZSBkZXRlY3RlZCBieSB0aGUgSmF2YSBtb2RlbCAocmF0aGVyIHRoYW4gdGhlIEphdmEgYnVpbGRlcikuPC9saT4KKzwvdWw+CisKKzxoMz4KK1JldmlldzogQ2xhc3NwYXRoIEVudHJpZXM8L2gzPgorSW4gRWNsaXBzZSAxLjAsIGEgY2xhc3NwYXRoIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcworKDx0dD5JQ2xhc3NwYXRoRW50cnk8L3R0PikuIFRoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIGNsYXNzcGF0aCBlbnRyaWVzOgorPHVsPgorPGxpPgorU291cmNlIGZvbGRlciBlbnRyeTogZGVub3RlcyBhIHByb2plY3QgZm9sZGVyIGNvbnRhaW5pbmcgLmphdmEgZmlsZXMuIFRoZQorc291cmNlIGZvbGRlciBtdXN0IGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIHByb2plY3Qgd2hlcmUgdGhpcyBjbGFzc3BhdGgKK2VudHJ5IGlzIHVzZWQuIFNvdXJjZSBmb2xkZXIgZW50cmllcyBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gY29tcG9uZW50aXplCit0aGUgY29udGVudCBvZiBhIGdpdmVuIHByb2plY3QgKGUuZy4gb3JnLmVjbGlwc2UuamR0LmNvcmUvRWNsaXBzZSBKYXZhCitDb21waWxlci8pLiBUaGUgYWN0aW9uIG9mIGJ1aWxkaW5nIGEgSmF2YSBwcm9qZWN0IHdpbGwgbGVhZCB0byBwb3B1bGF0aW5nCit0aGUgcHJvamVjdCBvdXRwdXQgZm9sZGVyIHdpdGggLmNsYXNzIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIC5qYXZhCitmaWxlcyB3aGljaCBhcmUgY29udGFpbmVkIGluIGFsbCB0aGUgc291cmNlIGZvbGRlcnMgcHJlc2VudCBvbiB0aGlzIHByb2plY3QKK2NsYXNzcGF0aC4gTm90ZSB0aGF0IHRoZSBwcm9qZWN0IHJvb3QgY2FuIGl0c2VsZiBiZSB1c2VkIGFzIGEgc291cmNlIGZvbGRlcgorKGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dCBmb2xkZXIgaXMgYWxzbyB0aGUgcHJvamVjdCBpdHNlbGYpLjwvbGk+CisKKzxsaT4KK0xpYnJhcnkgZW50cnk6IGRlbm90ZXMgYSBiaW5hcnkgSkFSIGFyY2hpdmUgb3IgYmluYXJ5IGZvbGRlci4gSW4gY2FzZSBvZgorcG9pbnRpbmcgYXQgYSBKQVIsIHRoZSBlbnRyeSBjYW4gYWxzbyBkZWZpbmUgYSBzb3VyY2UgYXR0YWNobWVudCByZWNvbW1lbmRhdGlvbgorKHBhdGggdG8gc291cmNlIGFyY2hpdmUsIGFuZCBwYXRoIG9mIHNvdXJjZSByb290IGluc2lkZSB0aGlzIGFyY2hpdmUsIGUuZy4KKyJjOi9qcmUvc3JjLmphciIgKyAiL3NyYyIpLjwvbGk+CisKKzxsaT4KK1Byb2plY3QgZW50cnk6IGRlbm90ZXMgYSByZXF1aXJlZCBwcm9qZWN0LiBXaGVuIGJ1aWxkaW5nLCB0aGUgcmVxdWlyZWQKK3Byb2plY3QgaXMgYnVpbHQgYmVmb3JlIHRoZSBkZXBlbmRlbnQgcHJvamVjdCwgYW5kIGNvbnRyaWJ1dGVzIGl0cyBlbnRpcmUKK291dHB1dCBmb2xkZXIgKGkuZS4gYWxsIGl0cyBwcm9kdWNlZCAuY2xhc3MgZmlsZXMpLiBUaHVzIGEgcHJvamVjdCBuZXZlcgorZGlyZWN0bHkgY29udHJpYnV0ZXMgaXRzIHNvdXJjZSBmaWxlcyB3aGVuIGJ1aWxkaW5nLiBIb3dldmVyLCBmb3IgYWxsIHNvdXJjZS1iYXNlZAorZnVuY3Rpb25hbGl0aWVzIChjb2RlIGFzc2lzdCwgc2VhcmNoLCAuLi4pLCBhIHJlcXVpcmVkIHByb2plY3QgZGlyZWN0bHkKK2NvbnRyaWJ1dGVzIGl0cyBzb3VyY2VzIChpLmUuIGFsbCBvZiBpdHMgc291cmNlIGZvbGRlcnMgYXJlIGV4cG9zZWQpIHNvCit0aGF0IGEgYnVpbGQgYWN0aW9uIGlzIG5vdCBtYW5kYXRvcnkgdG8gb2J0YWluIGFjY3VyYXRlIGluZm9ybWF0aW9uOyBpbgorcGFydGljdWxhciwgd2hlbiBkb2luZyBpbnRlbnNpdmUgY29kZSByZW9yZ2FuaXphdGlvbiwgY29kZSBhc3Npc3QgYW5kIHNlYXJjaAord2lsbCBzdGlsbCBwZXJmb3JtIGFjY3VyYXRlbHkgZXZlbiBpZiBhdXRvLWJ1aWxkIGlzIHR1cm5lZCBvZmYuPC9saT4KKworPGxpPgorVmFyaWFibGUgZW50cnk6IGluZGlyZWN0IHJlZmVyZW5jZSB0byBlaXRoZXIgYSBsaWJyYXJ5IG9yIGEgcmVxdWlyZWQgcHJvamVjdC4KK0EgdmFyaWFibGUgZW50cnkgdXNlcyBhIHZhcmlhYmxlIHBhdGggb2YgdGhlIGZvcm0gJXZhcmlhYmxlTmFtZSVbJXBhdGhTdWZmaXglXS4KK1RoZSB2YXJpYWJsZSBuYW1lIHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCBpdHMgYWN0dWFsIHZhbHVlLCB3aGljaCBpcyBhCit3b3Jrc3BhY2UgZGVmaW5lZCBjb25zdGFudC4gVGhlIHBhdGggc3VmZml4IGlzIGFuIG9wdGlvbmFsIHN1ZmZpeCB3aGljaAorY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSB2YXJpYWJsZSB2YWx1ZS4gUERFIHVzZXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gcmVwcmVzZW50Cit0aGUgRWNsaXBzZSBob21lIGRpcmVjdG9yeSwgYW5kIHBhdGggc3VmZml4ZXMgdG8gcmVhY2ggdGhlIHdlbGwta25vd24gbGlicmFyaWVzCisoZS5nLiZuYnNwOyZuYnNwOyZuYnNwOyAiRUNMSVBTRV9IT01FL29yZy5lY2xpcHNlLmpkdC5jb3JlL2pkdGNvcmUuamFyIikuCitOb3RlIHRoYXQgaW4gYSBjb25zaXN0ZW50IG1hbm5lciB3aXRoIGxpYnJhcnkgZW50cmllcywgdmFyaWFibGUgZW50cmllcworY2FuIGJlIHByb3ZpZGVkIHdpdGggYSB2YXJpYWJsZSBzb3VyY2UgYXR0YWNobWVudCByZWNvbW1lbmRhdGlvbi48L2xpPgorPC91bD4KKworPGgzPgorSW52ZXN0aWdhdGlvbjogTWFrZSBDbGFzc3BhdGggVmFyaWFibGVzIE1vcmUgUG93ZXJmdWw8L2gzPgorV291bGQgbWFraW5nIGNsYXNzcGF0aCB2YXJpYWJsZXMgbW9yZSBwb3dlcmZ1bCBhZGRyZXNzIHNvbWUgdGhlIHByb2JsZW1zCitmYWNpbmcgbGFyZ2Ugc2NhbGUgSmF2YSBkZXZlbG9wbWVudCBlZmZvcnRzPworPHA+T25lIGlkZWEgd291bGQgYmUgdG8gYWxsb3cgdmFyaWFibGVzIHRvIGJlIGJvdW5kIHRvIGEgbGlzdCBvZiBwYXRocworaW5zdGVhZCBvZiBhIHNpbmdsZSBwYXRoLiBUaGlzIHdvdWxkIGFsbG93LCBmb3IgZXhhbXBsZSwgYSBzaW5nbGUgY2xhc3NwYXRoCit2YXJpYWJsZSAiQkFTRV9MSUJTIiB0byBiZSBib3VuZCB0byB0aGUgbGlzdCBvZiB0aGUgcGF0aHMgb2YgdGhlIGxpYnJhcnkKK2phcnMgbGliMS5qYXI7IGxpYjIuamFyOyAuLi47IGxpYjIwLmphci4gRWFjaCBwcm9qZWN0IHJlZmVyZW5jaW5nIHRoaXMKK2NsYXNzcGF0aCB2YXJpYWJsZSB3b3VsZCB0aGVyZWJ5IGdhaW4gYWNjZXNzIHRvIGFsbCB0aGUgbGlicmFyaWVzOgorPGJsb2NrcXVvdGU+cHJvamVjdCBQMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxL3NyYzsgQkFTRV9MSUJTCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDEvYmluCis8YnI+cHJvamVjdCBQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL3NyYzsgQkFTRV9MSUJTCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDIvYmluPC9ibG9ja3F1b3RlPgorQ2hhbmdpbmcgdGhlIHdvcmtzcGFjZSBiaW5kaW5nIG9mIHRoZSBjbGFzc3BhdGggdmFyaWFibGUgYWZmZWN0cyBhbGwgcHJvamVjdHMKK3RoYXQgcmVmZXJlbmNlIHRoZSB2YXJpYWJsZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNoYW5nZSB0aGUgc2V0IG9mIGxpYnJhcmllcword2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIHRoZSBwcm9qZWN0cyBpbmRpdmlkdWFsbHkuCis8cD5TaW5jZSBjbGFzc3BhdGggdmFyaWFibGUgYmluZGluZ3MgYXJlIGxvY2FsIHRvIHRoZSB3b3Jrc3BhY2UsIHRoZXJlCitpcyBubyBvYnZpb3VzIGF1dG9tYXRpYyB3YXkgYnkgd2hpY2ggdGhlc2UgY2xhc3NwYXRoIHZhcmlhYmxlcyB3b3VsZCBnZXQKK3RoZWlyIGJpbmRpbmdzLiBUaGUgYmluZGluZ3Mgd291bGQgaGF2ZSB0byBiZSBjb25maWd1cmVkIGZvciBlYWNoIHdvcmtzcGFjZTsKK2xvYWRpbmcgYmluZGluZ3MgZnJvbSBhIGZpbGUsIG9yIGluaXRpYWxpemluZyB0aGVtIHZpYSBhIHNjcmlwdCwgYXJlIGZlYXNpYmxlCitvcHRpb25zLi4KKzxwPlRoZSBjbGFzc3BhdGggdmFyaWFibGVzIGN1cnJlbnRseSBiaW5kIHRvIHBhdGhzLCBhbmQgY2xhc3NwYXRoIGVudHJpZXMKK2NhbiBjb250YWlucyBwYXRocyB0aGF0IGJlZ2luIGluIGEgdmFyaWFibGUuIENoYW5naW5nIHZhcmlhYmxlcyB0byBiaW5kCit0byBhIGxpc3Qgb2YgcGF0aHMgd291bGQgYmUgYSBtYWpvciBjaGFuZ2UsIGFuZCB3b3VsZCBsaWtlbHkgcmVxdWlyZSByZXdvcmtpbmcKK211Y2ggb2YgZXhpc3RpbmcgQVBJLiBXZSBnZW5lcmFsbHkgYWdyZWVkIHRoYXQgd2Ugd291bGQgbm90IHB1cnN1ZSB0aGlzCithcHByb2FjaCBzaW5jZSBpdCBzZWVtcyBzb21ld2hhdCB1bmxpa2VseSB0byBzb2x2ZSBtdWNoIG9mIHRoZSBwcm9ibGVtLgorPGgzPgorUHJvcG9zYWw6IEV4cGxpY2l0bHkgRXhwb3J0IExpYnJhcmllcyBmcm9tIFJlcXVpcmVkIFByb2plY3RzPC9oMz4KK1RoZSBwcm9wb3NhbCBpcyB0byBleHRlbmQgdGhlIHJlcXVpcmVkIHByb2plY3RzIG1lY2hhbmlzbSB0byBhbGxvdyBhIHJlcXVpcmVkCitwcm9qZWN0IHRvIGNvbnRyaWJ1dGUgbW9yZSB0aGFuIGp1c3QgaXRzIGJpbmFyeSBvdXRwdXQgZm9sZGVyLiBSYXRoZXIsCithIHByb2plY3Qgd291bGQgYmUgYWJsZSB0byBpbmRpY2F0ZSB0aGF0IGFueSBvZiBpdHMgbGlicmFyaWVzIGFyZSB0byBiZQorPGI+ZXhwb3J0ZWQ8L2I+LgorRXhwb3J0ZWQgbGlicmFyaWVzIGFsc28gYmVjb21lIGF2YWlsYWJsZSB0byBvdGhlciBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCit0aGF0IGxpc3QgdGhpcyBwcm9qZWN0IGFzIGEgcmVxdWlyZWQgcHJvamVjdC4KKzxwPkluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgY3VzdG9tZXIgY291bGQgaW5zdGVhZCBoYXZlIGFuIGFycmFuZ2VtZW50CitsaWtlOgorPGJsb2NrcXVvdGU+cHJvamVjdCBQMQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxL3NvdXJjZTsgcHJvamVjdCBQTGliCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDEvYmluCis8YnI+cHJvamVjdCBQMgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL3NvdXJjZTsgcHJvamVjdCBQTGliCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDIvYmluCis8YnI+cHJvamVjdCBQTGliCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUExpYi9zb3VyY2U7IDxiPmV4cG9ydDwvYj4KK2xpYnJhcnkgbGliMS5qYXI7IC4uLjsgPGI+ZXhwb3J0PC9iPiBsaWJyYXJ5IGxpYjIwLmphcgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1BMaWIvYmluPC9ibG9ja3F1b3RlPgorV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgd2hlbiBQMSAoc2ltaWxhcmx5LCBQMikgaXMgYnVpbHQsIHRoZSBsaWJyYXJpZXMKK29uIGl0cyBidWlsZCBjbGFzc3BhdGggY29uc2lzdHMgb2YgL1BMaWIvYmluLCBsaWIxLmphciwgLi4uLCBsaWIyMC5qYXIuCis8cD5UaGUgbW9kaWZpZWQgc2VtYW50aWNzIG9mIGEgcHJvamVjdCBQIHdpdGggYSByZXF1aXJlZCBwcm9qZWN0IFIgYXJlCithcyBmb2xsb3dzOgorPHVsPgorPGxpPgorVGhlcmUgaXMgYW4gZXhwb3J0IGZsYWcgYXNzb2NpYXRlZCB3aXRoIGVhY2ggbGlicmFyeSBleHBsaWNpdGx5IGluY2x1ZGVkCitvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG9mIGEgcHJvamVjdC4gVGhpcyBmbGFnIGlzIG1lYW5pbmdmdWwgZm9yIGJvdGggbGlicmFyeQorY2xhc3NwYXRoIGVudHJpZXMgKGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsKSwgYW5kIHJlcXVpcmVkIHByb2plY3RzIChpdAoraXMgbm90IGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgYW5kIG91dHB1dCBlbnRyaWVzLikgVGhlIGV4cG9ydCBmbGFncyBhcmUKK3JlY29yZGVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUsIHdoaWNoIGlzIHVuZGVyIFZDTS4gVGhlc2UgZmxhZ3MgYXJlIHRoZXJlZm9yZQorc2hhcmVhYmxlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gKFRoZXNlIGZsYWdzIGNhbiBiZSBhZGRlZCBpbiBhIHdheSB0aGF0Citkb2VzIG5vdCBpbnZhbGlkYXRlIGV4aXN0aW5nIFIxLjAgLmNsYXNzcGF0aCBmaWxlcy4pPC9saT4KKworPGxpPgorVGhlIGNsYXNzIGZpbGVzIGluIHRoZSBiaW5hcnkgb3V0cHV0IGRpcmVjdG9yeSBvZiBSLCBhbG9uZyB3aXRoIGFueSBsaWJyYXJpZXMKK2V4cGxpY2l0bHkgZXhwb3J0ZWQgb24gUidzIGJ1aWxkIGNsYXNzcGF0aCwgYXJlIGluY2x1ZGVkIGFzIGxpYnJhcmllcyBvbgordGhlIGJ1aWxkIGNsYXNzcGF0aCBvZiBQLiBQJ3MgYnVpbGQgY2xhc3NwYXRoIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mCit0aGlzIGxpYnJhcnkgcmVsYXRpdmUgdG8gb3RoZXJzOyB0aGUgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgZmlyc3QsIHdpdGgKK3RoZSBleHBvcnRlZCBsaWJyYXJpZXMgYW5kIHByb2plY3RzIGluY2x1ZGVkIGluIHRoZSB1c2VyLXNwZWNpZmllZCBvcmRlci4KK0V4cG9ydGVkIHJlcXVpcmVkIHByb2plY3RzIGFyZSBleHBhbmRlZCBpbmxpbmUuIFRoaXMgb3JkZXJpbmcgc3VwcG9ydHMKK3NjZW5hcmlvcyB3aGVyZSB0aGUgb3V0cHV0IGZvbGRlciBjb250YWlucyBwYXRjaGVzIHRvIHRoZSBsaWJyYXJpZXMuIE5vbi1leHBvcnRlZAorbGlicmFyeSBlbnRyaWVzIGFuZCBwcm9qZWN0IGVudHJpZXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBvZiBSIGhhdmUgbm8KK2JlYXJpbmcgb24gUC48L2xpPgorCis8bGk+CitUaGUgbmFtZXMgb2YgcmVxdWlyZWQgcHJvamVjdHMgYXJlIHJlY29yZGVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUsIHdoaWNoCitpcyB1bmRlciBWQ00uIFRoZXkgYXJlIHRoZXJlZm9yZSBzaGFyZWFibGUgd2l0aCBvdGhlciBkZXZlbG9wZXJzLiAoVW5jaGFuZ2VkLik8L2xpPgorCis8bGk+CitQcm9qZWN0cyBhcmUgcHJlc2VudGVkIGFzIHRvcCBsZXZlbCBlbGVtZW50cyBpbiB0aGUgc3RhbmRhcmQgcGFja2FnZXMgdmlldy4KK0EgcmVxdWlyZWQgcHJvamVjdCBpcyBub3QgcHJlc2VudGVkIGluIHRoZSBwYWNrYWdlcyB2aWV3IGFzIGEgY2hpbGQgb2YKK3RoZSBwcm9qZWN0KHMpIHRoYXQgcmVxdWlyZXMgaXQ7IG5vciBhcmUgdGhlIHJlcXVpcmVkIHByb2plY3QncyBleHBvcnRlZAorbGlicmFyaWVzLjwvbGk+CisKKzxsaT4KK0EgcHJvamVjdCdzIGxpc3Qgb2YgcmVxdWlyZWQgcHJvamVjdHMgKGEgSkRUIGNvcmUgbm90aW9uKSBpcyB1c2VkIHRvIGNvbXB1dGUKK3RoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJvamVjdCdzIGxpc3Qgb2YgcHJvamVjdCByZWZlcmVuY2VzIChhIHdvcmtzcGFjZQorbm90aW9uKS4gKFVuY2hhbmdlZC4pPC9saT4KKworPGxpPgorTWlzc2luZyByZXF1aXJlZCBwcm9qZWN0cyBhbmQgbGlicmFyaWVzLCBhbmQgdW5ib3VuZCBjbGFzc3BhdGggdmFyaWFibGVzLAorZ2VuZXJhdGUgcHJvYmxlbXMgcmVwb3J0ZWQgYWdhaW5zdCB0aGUgcHJvamVjdCByZXNvdXJjZSBpdHNlbGYuIFRoZXNlIGtpbmQKK29mIHByb2JsZW1zIGFyZSBkZXRlY3RlZCBieSB0aGUgSmF2YSBtb2RlbCAocmF0aGVyIHRoYW4gdGhlIEphdmEgYnVpbGRlcikuCisoVW5jaGFuZ2VkLik8L2xpPgorCis8bGk+CitDbGFzc3BhdGggcHJvYmxlbXMgcGVydGFpbmluZyB0byBsaWJyYXJpZXMgZXhwb3J0ZWQgZnJvbSBhIHJlcXVpcmVkIHByb2plY3QKK2FyZSByZXBvcnRlZCBvbmx5IG9uY2UsIGFnYWluc3QgdGhlIHByb2plY3QgY2xvc2VzdCB0byB0aGUgcHJvYmxlbS4gVGhlCitwcm9ibGVtYXRpYyBlbnRyaWVzIGFyZSBlbGlkZWQgZnJvbSB0aGUgZWZmZWN0aXZlIGNsYXNzcGF0aCBvZiBkZXBlbmRlbnQKK3Byb2plY3RzLjwvbGk+Cis8L3VsPgorRXhhbXBsZToKKzxibG9ja3F1b3RlPnByb2plY3QgUAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1Avc291cmNlOyBwcm9qZWN0IFI7IGxpYnJhcnkKK3BsaWIuamFyCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUC9iaW4KKzxicj5wcm9qZWN0IFIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9SL3NvdXJjZTsgPGI+ZXhwb3J0PC9iPgorbGlicmFyeSBybGliMS5qYXI7IGxpYnJhcnkgcmxpYjIuamFyOyA8Yj5leHBvcnQ8L2I+IHByb2plY3QgUTsgPGI+ZXhwb3J0PC9iPgorbGlicmFyeSBybGliMy5qYXIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IC9SL2JpbgorPGJyPnByb2plY3QgUQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1Evc291cmNlCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUS9iaW48L2Jsb2NrcXVvdGU+CitFZmZlY3RpdmUgYnVpbGQgY2xhc3NwYXRoIG9mIFA6Cis8YmxvY2txdW90ZT4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QL3NvdXJjZTsgbGlicmFyeQorL1IvYmluOyBsaWJyYXJ5IHJsaWIxLmphcjsgbGlicmFyeSAvUS9iaW47IGxpYnJhcnkgcmxpYjMuamFyOyBsaWJyYXJ5IHBsaWIuamFyPC9ibG9ja3F1b3RlPgorCis8aDQ+CitFeHBvcnRpbmcgRXh0ZXJuYWwgTGlicmFyaWVzPC9oND4KK1JlbGF0aXZlIHRvIGEgZ2l2ZW4gcHJvamVjdCwgYSBsaWJyYXJ5IGlzIGludGVybmFsIGlmZiB0aGUgcGF0aCB0byB0aGUKK2phciBvciBmb2xkZXIgbGllcyBpbnNpZGUgdGhlIHByb2plY3QncyByZXNvdXJjZSB0cmVlLiBPdGhlciBsaWJyYXJpZXMKK2FyZSBjb25zaWRlcmVkIGV4dGVybmFsIHRvIHRoZSBwcm9qZWN0LgorPHA+U2hvdWxkIHByb2plY3RzIGJlIGFsbG93ZWQgdG8gZXhwb3J0IGFyYml0cmFyeSBsaWJyYXJpZXMsIG9yIHNob3VsZAorZXhwb3J0ZWQgbGlicmFyaWVzIGFsd2F5cyBiZSBpbnRlcm5hbCB0byB0aGUgcHJvamVjdD8KKzxwPlJlc3RyaWN0aW5nIGV4cG9ydHMgdG8gaW50ZXJuYWwgbGlicmFyaWVzIGVuc3VyZXMgdGhhdCBhIHByb2plY3QgdGhhdAoraXMgdG8gYmUgdXNlZCBieSBvdGhlciBwcm9qZWN0cyBpcyBzb21ld2hhdCBzZWxmIGNvbnRhaW5lZC4gSWYgeW91IGxvYWQKK3N1Y2ggYSBwcm9qZWN0IGZyb20gYSByZXBvc2l0b3J5LCB5b3UgYXJlIGd1YXJhbnRlZWQgYWxsIHRoZSBsaWJyYXJpZXMKK2l0IGV4cG9ydHMgd2lsbCBiZSBjb250YWluZWQgdGhlcmVpbi4KKzxwPk9uIHRoZSBvdGhlciBoYW5kLCB1bnJlc3RyaWN0ZWQgZXhwb3J0cyBhcmUgbW9yZSBmbGV4aWJsZSwgYW5kIGFsbG93CithIHByb2plY3QgdG8gZXhwb3J0IGEgY29sbGVjdGlvbiBvZiBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IG5lY2Vzc2FyaWx5Citjb250YWluZWQgd2l0aGluIHRoZSBwcm9qZWN0J3MgcmVzb3VyY2UgdHJlZS4gKEhvd2V2ZXIsIGl0IGlzIHVuY2xlYXIgd2hldGhlcgordGhpcyBhZGRpdGlvbmFsIGZsZXhpYmlsaXR5IHdvdWxkIGJlIHVzZWZ1bC4pCis8cD5XZSBvcHRlZCB0byBhbGxvdyB1bnJlc3RyaWN0ZWQgaW1wb3J0cywgYnV0IGRlY2lkZWQgdG8gc2ltcGxpZnkgdGhlCitlcnJvciBwcm9jZXNzaW5nIGJ5IG9ubHkgcmVwb3J0aW5nIHByb2JsZW1zIGFnYWluc3QgdGhlIHByb2plY3Qgd2l0aCB0aGUKK21pc3NpbmcgbGlicmFyeSAob3IgcmVxdWlyZWQgcHJvamVjdCkgZXhwbGljaXRseSBvbiBpdHMgY2xhc3NwYXRoLiBBbnkKK21pc3NpbmcgZW50cmllcyB3b3VsZCBzaW1wbHkgYmUgb21pdHRlZCBmcm9tIHRoZSBlZmZlY3RpdmUgY2xhc3NwYXRoIGNhbGN1bGF0aW9uLmZvcgorZGVwZW5kZW50IHByb2plY3RzLgorPGg0PgorQ2xhc3NwYXRoIFZhcmlhYmxlczwvaDQ+CitBIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggbWF5IGluY2x1ZGUgcmVmZXJlbmNlcyB0byBjbGFzc3BhdGggdmFyaWFibGVzCit0aGF0IGdldCBib3VuZCB0byBsaWJyYXJpZXMgKG9yIG90aGVyIHByb2plY3RzKS4gSG93IGRvIGV4cG9ydHMgYW5kIHZhcmlhYmxlcworaW50ZXJhY3Q/Cis8cD5UaGUgZXhwb3J0IGZsYWcgY291bGQgYmUgYXNzb2NpYXRlZCBlaXRoZXIgd2l0aCB0aGUgdmFyaWFibGUgcmVmZXJlbmNlCitvciB3aXRoIHRoZSB2YXJpYWJsZSBiaW5kaW5nLiBJZiB0aGUgZXhwb3J0IGZsYWcgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQordmFyaWFibGUgcmVmZXJlbmNlLCBpdCB3b3VsZCBpbmRpY2F0ZSBleHBvcnRpbmcgd2hhdGV2ZXIgbGlicmFyeSB0aGUgY2xhc3NwYXRoCit2YXJpYWJsZSBoYXBwZW5lZCB0byBiZSBib3VuZCB0byBvbiBhIGdpdmVuIG9jY2FzaW9uLiBJZiB0aGUgZXhwb3J0IGZsYWcKK2lzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFyaWFibGUgYmluZGluZyBpdHNlbGYsIHRoZSBsaWJyYXJ5IHRoZSBjbGFzc3BhdGgKK3ZhcmlhYmxlIGhhcHBlbmVkIHRvIGJlIGJvdW5kIHRvIG9uIGEgZ2l2ZW4gb2NjYXNpb24gd291bGQgYmUgZXhwb3J0ZWQKK2NvbmRpdGlvbmFsbHkgb24gdGhlIGZsYWcgaW4gdGhlIGJpbmRpbmcuIFRoZSBwcm9wb3NhbCBpcyB0byBnbyB3aXRoIHRoZQorZm9ybWVyIChleHBvcnQgZmxhZyB3aXRoIHZhcmlhYmxlIHJlZmVyZW5jZSkgc2luY2UgaXRzIHNlbWFudGljcyBhcmUgc29tZXdoYXQKK3NpbXBsZXIgYW5kIGFsbG93IHRoZSBleHBvcnQgZmxhZyB0byBiZSBzaGFyZWQgd2l0aCBvdGhlciB0ZWFtIG1lbWJlcnMKKyh0aGUgYmluZGluZ3Mgb2YgY2xhc3NwYXRoIHZhcmlhYmxlcyBhcmUgbm90IHNoYXJlYWJsZSkuCis8aDQ+CitFeHBvcnRpbmcgQXV4aWxsYXJ5IExpYnJhcmllczwvaDQ+CitOb3RlIHRoYXQgZXhwbGljaXQgZXhwb3J0cyBhbHNvIGFkZHJlc3MgYW5vdGhlciBwcm9ibGVtIHRoYXQgYXJpc2VzIHdoZW4KK2EgcHJvamVjdCBuZWVkcyB0byBleHBvcnQgYSBwcmUtYnVpbHQgbGlicmFyeSBpbiBhZGRpdGlvbiB0byB0aGUgcmVzdWx0cworb2YgY29tcGlsaW5nIGl0cyBzb3VyY2UgZmlsZXMgKHRoZSBFY2xpcHNlIGRlYnVnZ2VyJ3MgamRpLmphciBpcyBhIGZpbmUKK2luc3RhbmNlIG9mIHRoaXMpLiBJbiBFY2xpcHNlIDEuMCwgb25seSB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlIHByb2plY3QncworYmluYXJ5IG91dHB1dCBmb2xkZXIgYXJlIGV4cG9ydGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cy4gVGhpcyBwcm9wb3NhbAorYWxsb3dzIGEgcHJvamVjdCB0byBleHBvcnQgYW55IG51bWJlciBvZiBhZGRpdGlvbmFsIGxpYnJhcmllcyBhcyByZXF1aXJlZC4KKzxoND4KK0V4cG9ydGluZyBQcm9qZWN0czwvaDQ+CitCeSBleHBvcnRpbmcgb3RoZXIgcHJvamVjdHMsIGEgcHJvamVjdCBjYW4gY29uc29saWRhdGUgYW5kIGNvbmNlbnRyYXRlCit0aGUgb3V0cHV0cyBmcm9tIHNldmVyYWwgb3RoZXIgcHJvamVjdHM6Li4KKzxibG9ja3F1b3RlPnByb2plY3QgUDEKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QL3NvdXJjZTsgZXhwb3J0IGxpYnJhcnkKKy9QMS9saWIxLmphcgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AxL2JpbgorPGJyPnByb2plY3QgUDIKKzxicj4mbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9zb3VyY2U7IGV4cG9ydCBsaWJyYXJ5IC9QMi9saWIyLmphcgorPGJyPiZuYnNwOyZuYnNwOyBvdXRwdXQgL1AyL2JpbgorPGJyPnByb2plY3QgUDFhbmRQMgorPGJyPiZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxYW5kUDIvc291cmNlOyBleHBvcnQgcHJvamVjdAorUDE7IGV4cG9ydCBwcm9qZWN0IFAyCis8YnI+Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUDFhbmRQMi9iaW48L2Jsb2NrcXVvdGU+CitFZmZlY3RpdmUgYnVpbGQgY2xhc3NwYXRoIG9mIFAxYW5kUDIgaW5jbHVkZXMgZXZlcnl0aGluZyBleHBvcnRlZCBmcm9tCitib3RoIFAxIGFuZCBQMjoKKzxibG9ja3F1b3RlPmJ1aWxkIGNsYXNzcGF0aCA9IGxpYnJhcnkgL1AxYW5kUDIvc291cmNlOyBsaWJyYXJ5IC9QMS9iaW47CitsaWJyYXJ5IC9QMS9saWIxLmphcjsgbGlicmFyeSAvUDIvYmluOyBsaWJyYXJ5IC9QMi9saWIyLmphcgorPGJyPm91dHB1dCAvUDFhbmRQMi9iaW48L2Jsb2NrcXVvdGU+CisKKzxoMz4KK1Byb3Bvc2FsOiBBZG1pdCBMaWJyYXJ5IFByb2plY3RzIHdoaWNoIENvbnRhaW4gTm8gU291cmNlIENvZGU8L2gzPgorT25lIG9iamVjdGlvbiB0byB0aGlzIHdob2xlIGFwcHJvYWNoIGlzIHRoYXQgdGhlIEphdmEgcHJvamVjdCBpcyBiZWluZworaGlqYWNrZWQuIEluIHRoZSBvcmlnaW5hbCBkZXNpZ24sIGEgSmF2YSBwcm9qZWN0IGlzIGEgYnVpbGRhYmxlIGNvbnRhaW5lcgorb2YgSmF2YSBzb3VyY2UgY29kZS4gVGhlIGFkZGl0aW9uIG9mIGV4cG9ydGVkIGxpYnJhcmllcyBzdGFydHMgdG8gdHVybgordGhlIHByb2plY3QgaW50byBzb21ldGhpbmcgbW9yZSBnZW5lcmFsLiBJZiB3ZSBhcmUgY29tZm9ydGFibGUgd2l0aCB0aGlzCitnZW5lcmFsIHRyZW5kLCB0aGVyZSBhcmUgd2F5cyB0aGF0IHRoZSBkZXNpZ24gY2FuIGVtYnJhY2UgaXQgbW9yZSB3aG9sZS1oZWFydGVkbHkuCis8cD5UaGUgYWJvdmUgcHJvcG9zYWwgdG8gZXhwYW5kIHRoZSBzZW1hbnRpY3Mgb2YgcmVxdWlyZWQgcHJvamVjdCBjcmVhdGVzCithIG5ldyByb2xlIGZvciBhIEphdmEgcHJvamVjdCBhcyBhIGNvbnRhaW5lciBvZiBsaWJyYXJpZXMuIFRoaXMgbm90aW9uCitvZiA8Yj5saWJyYXJ5IHByb2plY3Q8L2I+IGlzIHJvdW5kZWQgb3V0IGJ5IGFsbG93aW5nIEphdmEgcHJvamVjdHMgd2l0aG91dAorc291cmNlIG9yIG91dHB1dCBmb2xkZXJzLiBUaGUgYnVpbGQgY2xhc3NwYXRoIG9mIGEgbGlicmFyeSBwcm9qZWN0IG9yZGVycwordGhlIGxpc3Qgb2YgZXhwb3J0ZWQgbGlicmFyaWVzIGFuZCBwcm9qZWN0cyAoYW5kIHByb3ZpZGVzIHRoZSBhZGRpdGlvbmFsCitjb250ZXh0IHJlcXVpcmVkIGZvciBicm93c2luZyB0aGUgcHJvamVjdCBpdHNlbGYpLgorPHA+SW4gb3VyIGV4YW1wbGUsIHRoZSBsaWJyYXJ5IHByb2plY3QgY291bGQgYmUgZXhwcmVzc2VkIG1vcmUgZGlyZWN0bHkKK3dpdGhvdXQgaGF2aW5nIHRvIHBvc3R1bGF0ZSBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzIHdoaWNoIGFyZSBjb21wbGV0ZWx5Cit1bm1vdGl2YXRlZCBpbiB0aGlzIGNhc2U6Cis8cD5wcm9qZWN0IFBMaWIKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gPGI+ZXhwb3J0PC9iPiBsaWJyYXJ5IGxpYjEuamFyOworLi4uOyA8Yj5leHBvcnQ8L2I+IGxpYnJhcnkgbGliMjAuamFyCis8cD5BIGxpYnJhcnkgcHJvamVjdCBpcyByZWNvZ25pemFibGUgc2ltcGx5IGJ5IHRoZSBhYnNlbmNlIG9mIHNvdXJjZSBmb2xkZXJzCitvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLiAoV2UgY29uc2lkZXJlZCBhZGRpbmcgYSBuZXcgZmxhZyB0byB0aGUgcHJvamVjdAordG8gZXhwbGljaXRseSBtYXJrIGxpYnJhcnkgcHJvamVjdHMsIGJ1dCBkZWNpZGVkIHRoaXMgd2FzIG5vdCBuZWNlc3NhcnkKK2FuZCB3b3VsZCBiZSBjb25mdXNpbmcuKQorPHA+Tm90ZSB0aGF0IGxpYnJhcnkgcHJvamVjdHMgYXJlIG5vdCAiYnVpbGRhYmxlIiBpbiBhbnkgbWVhbmluZ2Z1bCBzZW5zZQorc2luY2UgdGhleSBsYWNrIHNvdXJjZSBjb2RlIHRvIGNvbXBpbGUgKGFuZCB3aXRob3V0IHNvdXJjZSBjb2RlIHRoZXJlIGlzCitubyBwcmVzc2luZyBuZWVkIGZvciBhIGJpbmFyeSBvdXRwdXQgZm9sZGVyKS4gSG93ZXZlciwgdGhlcmUgc3RpbGwgbmVlZHMKK3RvIGJlIGEgbWVjaGFuaXNtIGZvciBkZXRlY3RpbmcgYW5kIHJlcG9ydGluZyBlcnJvcnMgaW4gdGhlIGJ1aWxkIGNsYXNzcGF0aAorZm9yIGxpYnJhcnkgcHJvamVjdHMuIEV4Y2VwdCBmb3Igc3VjaCBjaGVja3MsIHRoZSBKYXZhIGluY3JlbWVudGFsIHByb2plY3QKK2J1aWxkZXIgc2hvdWxkIGlnbm9yZSBsaWJyYXJ5IHByb2plY3RzLgorPHA+VGhlIGZvbGxvd2luZyBraW5kcyBvZiBlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb2YgYSBsaWJyYXJ5IHByb2plY3QKK3dvdWxkIHNlcnZlIHRoZXNlIHB1cnBvc2VzOgorPHVsPgorPGxpPgorU291cmNlIGZvbGRlcnMgLSBhIGxpYnJhcnkgcHJvamVjdCBoYXMgbm8gc291cmNlIGZvbGRlcnMsIGJ5IGRlZmluaXRpb24uPC9saT4KKworPGxpPgorT3V0cHV0IGZvbGRlcnMgLSBub3QgbmVlZGVkIGZvciBhIGxpYnJhcnkgcHJvamVjdC48L2xpPgorCis8bGk+CitVbmV4cG9ydGVkIGxpYnJhcmllcyAtIHByb3ZpZGVzIGNvbnRleHQgd2hlbiBicm93c2luZyB0aGlzIHByb2plY3QuPC9saT4KKworPGxpPgorVW5leHBvcnRlZCByZXF1aXJlZCBwcm9qZWN0cyAtIHByb3ZpZGVzIGNvbnRleHQgd2hlbiBicm93c2luZyB0aGlzIHByb2plY3QuPC9saT4KKzwvdWw+CitIb3dldmVyLCB0aGUgQVBJIChhbmQgVUk/KSBzaG91bGQgYWxsb3cgdGhlIGluZm9ybWF0aW9uIGluIGFsbCBmaWVsZHMgdG8KK2JlIG1haW50YWluZWQgZXZlbiBmb3IgbGlicmFyeSBwcm9qZWN0cywgcG9zc2libHkgdG8gZmFjaWxpdGF0ZSBzd2l0Y2hpbmcKK2EgcHJvamVjdCBiZXR3ZWVuIGEgcmVndWxhciBhbmQgYSBsaWJyYXJ5IHByb2plY3QuCis8cD5UaGUgd29ya3NwYWNlIG11c3QgY29tcHV0ZSBhbiBpbnB1dCBkZWx0YSBldmVuIGZvciBpbmNyZW1lbnRhbCBwcm9qZWN0CitidWlsZGVycyB0aGF0IGlnbm9yZSB0aGUgZGVsdGEgdGhleSBhcmUgaGFuZGVkLiBXZSBjb25zaWRlcmVkIHdoZXRoZXIgd2UKK3Nob3VsZCBnbyBvbmUgc3RlcCBmdXJ0aGVyIGFuZCByZW1vdmUgdGhlIEphdmEgYnVpbGRlciBmcm9tIGEgbGlicmFyeSBwcm9qZWN0J3MKK2xpc3Qgb2YgaW5jcmVtZW50YWwgcHJvamVjdCBidWlsZGVycy4gVGhpcyB3b3VsZCBtYWtlIGl0IGNyeXN0YWwgY2xlYXIKK3RoYXQgdGhlcmUgaXMgbm8gSmF2YSBidWlsZGluZyBnb2luZyBvbiwgYW5kIGl0IHdvdWxkIHJlZHVjZSB3b3Jrc3BhY2UKK21lbW9yeSBmb290cHJpbnQgYmVjYXVzZSB0aGUgd29ya3NwYWNlIHdvdWxkIG5vdCBuZWVkIHRvIHJlbWVtYmVyIHRoZSBzaGFwZQorb2YgdGhlIHJlc291cmNlIHRyZWUgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3QgYnVpbGQuIEhvd2V2ZXIsIGlmIHRoZSBidWlsZGVyCit3YXMgcmVtb3ZlZCBmb3IgbGlicmFyeSBwcm9qZWN0cywgdGhlcmUgd291bGQgbmVlZCB0byBiZSBtZWNoYW5pc20gdG8gYWRkCitpdCBpZiB0aGUgY2xhc3NwYXRoIHdhcyBjaGFuZ2VkIHRvIGluY2x1ZGUgYSBzb3VyY2UgcHJvamVjdC4gV2UgZGVjaWRlZAordGhhdCB3ZSBzaG91bGQgc2ltcGx5IGF2b2lkIHRoZSBhZGRpdGlvbmFsIGhhc3NsZXMgYW5kIGxlYXZlIHRoZSBKYXZhIGJ1aWxkZXIKK2luc3RhbGxlZCBmb3IgYWxsIEphdmEgcHJvamVjdHMuCis8aDM+CitCYWNrZ3JvdW5kPC9oMz4KK0Zyb20gUGhpbGlwcGUgTXVsZXQgMDgvMzEvMjAwMSAxMjoxMyBQTQorPHA+SSBhbHNvIHRoaW5rIHRoaXMgaGFzIHRvIGJlIGEgYmFzaWMgbWVjaGFuaXNtIGF0IHRoZSBKYXZhQ29yZSBsZXZlbCwKK3doaWNoIHRoZSBQREUgY2FuIHRoZW4gc3VyZmFjZSB0byBwbHVnaW4gd3JpdGVycy4KKzxicj5JIHdvdWxkIGxpa2UgdG8gc2VlIHRoaXMgb25lIGFkZHJlc3NlZCBhc2FwLCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlCit0byBzaGFyZSBwcm9qZWN0cyB0cmFuc3BhcmVudGx5IGF0IGxlYXN0IGFtb25nc3QgdXMuCis8cD49PT09PT09Cis8cD5Gcm9tIEVyaWNoIEdhbW1hIG9uIDA4LzMxLzIwMDEgMTI6NDMgUE0KKzxwPkhlcmUgaXMgc29tZSBtb3JlIGlucHV0IG9uIG91ciBmYXZvcml0ZSB0b3BpYyAibWFrZSB0aGUgYnVpbGQgY2xhc3MKK3BhdGggbGVzcyBzZW5zaXRpdmUKKzxicj53aXRoIHJlZ2FyZCB0byB3aGV0aGVyIGEgcHJvamVjdCBpcyBhIHNvdXJjZSBvciBiaW5hcnkgcHJvamVjdCIuCis8cD5PdXIgY29uY2x1c2lvbiBpbiBTTlogd2FzIHRoYXQgdGhpcyBib2lscyBkb3duIHRvIGEgUERFIHByb2plY3QgbGF5b3V0Citpc3N1ZSAoYmluYXJ5Cis8YnI+cHJvamVjdHMgZXRjKS4gSG93ZXZlciwgdGhlIEVDIGRpc2N1c3Npb24gZnJvbSBiZWxvdyBpbGx1c3RyYXRlcyBhCit1c2UgY2FzZSBmb3IgYWxsb3dpbmcgdG8gZXhwb3J0Cis8YnI+SkFScyBpbiBhZGRpdGlvbiB0byB0aGUgb3V0cHV0IGZvbGRlciBmcm9tIGEgcHJvamVjdCwgdGhhdCBpcyBpbmRlcGVuZGVudAorb2YgUERFLgorPGJyPlRoZSBzY2VuYXJpbyBpcyBzaW1pbGFyIHRvIHRoZSBXU0FEIHNjZW5hcmlvIHdpdGggZXh0ZW5zaW9uIGRpcnMuIElmCit3ZSBzdXBwb3J0IHRvCis8YnI+Y29udHJpYnV0ZSBjb250YWluZWQgSkFScyBmcm9tIGEgcHJvamVjdCB0aGVuIHRoaXMgcHJvYmxlbSB3b3VsZCBiZQorYWRkcmVzc2VkLgorPHA+V2Ugc2hvdWxkIHRoZXJlZm9yZSByZWNvbnNpZGVyIHRoZSBzb2x1dGlvbiBpbmRlcGVuZGVudCBvZiB0aGUgUERFIGlzc3VlLgorPGJyPklmIEkgZG8gdGhhdCB0aGVuIEkgY29tZSB0byB0aGUgY29uY2x1c2lvbiB0aGF0IHRoZSBwcm9wb3NlZCBtZWNoYW5pc20KK2lzIHZhbHVhYmxlCis8YnI+YW5kIEkgc3VnZ2VzdCB0byBnbyBhaGVhZCB3aXRoIHNwZWNpZnlpbmcgaXQgaW4gZGV0YWlsLgorPHA+VGhvdWdodHM/Cis8cD49PT09PT09Cis8YnI+RnJvbSBKb24gU2tlZXQgJmx0O3NrZWV0QHBvYm94LmNvbT4gb24gRWNsaXBzZSBDb3JuZXIgMjAuOC4yMDAxCis8cD5SZWZlcmVuY2luZyBhIHByb2plY3QncyBsaWJyYXJpZXMgaW4gYW5vdGhlciBwcm9qZWN0OgorPGJyPlRoZSBwcm9qZWN0IEknbSB3b3JraW5nIG9uIHVzZXMgYSBmYWlybHkgbGFyZ2UgbnVtYmVyIG9mIGxpYnJhcmllcworPGJyPihhYm91dCAyMCBqYXIgZmlsZXMsIElJUkMpLiBJIGhhZCBob3BlZCBJJ2QgYmUgYWJsZSB0byBjcmVhdGUgb25lCis8YnI+cHJvamVjdCB3aGljaCB1c2VkIHRoZXNlIGxpYnJhcmllcywgYW5kIG1ha2UgYWxsIG90aGVyIHByb2plY3RzIGhhdmUKKzxicj50aGF0IHByb2plY3Qgb24gdGhlaXIgYnVpbGQtcGF0aHMgdG8gYnJpbmcgaW4gdGhlIGxpYnJhcmllcyAtIHRoYXQKK3dheSBJCis8YnI+d291bGRuJ3QgbmVlZCB0byBjaGFuZ2UgKmV2ZXJ5KiBwcm9qZWN0IGV2ZXJ5IHRpbWUgSSBhZGRlZCBvciByZW1vdmVkCithCis8YnI+bGlicmFyeS4gKEl0J3Mgbm90IGEgY29tbW9uIG9wZXJhdGlvbiwgYnV0IGV2ZW4gc28uLi4pIFVuZm9ydHVuYXRlbHksCitJCis8YnI+Y2FuJ3QgZ2V0IHRoaXMgdG8gd29yayAtIHB1dHRpbmcgcHJvamVjdCBBIG9uIHRoZSBjbGFzc3BhdGggb2YgcHJvamVjdAorQgorPGJyPm9ubHkgc2VlbXMgdG8gcHV0IHByb2plY3QgQSdzIGluZGl2aWR1YWwgc291cmNlL2NsYXNzIGZpbGVzIG9uIHRoZQorPGJyPmNsYXNzcGF0aCBmb3IgcHJvamVjdCBCLiBJJ3ZlIHRyaWVkIGFkZGluZyBhcyBhbiBleHRlcm5hbCBqYXIgYW5kCis8YnI+aW1wb3J0aW5nIHRoZSBqYXIgZmlsZSBpbnRvIHRoZSBwcm9qZWN0LCBhbmQgaGFkIG5vIGpveSB3aXRoIGVpdGhlcgorOigKKzxoMz4KK0RvY3VtZW50IEhpc3Rvcnk8L2gzPgorWy4uLl0KKzxicj5SZXZpc2VkIDEwOjQwIFdlZG5lc2RheSBTZXB0ZW1iZXIgNSwgMjAwMSAtIExpYnJhcnkgcHJvamVjdHMgbm90IGV4cGxpY2l0bHkKK21hcmtlZC4KKzxicj5SZXZpc2VkIDExOjE1IFNhdHVyZGF5IFNlcHRlbWJlciA4LCAyMDAxIC0gQWxsb3cgZXhwb3J0aW5nIGV4dGVybmFsCitsaWJyYXJpZXMgYW5kIHByb2plY3RzLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLmphcnMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4uamFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWNkODk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLmphcnMKQEAgLTAsMCArMSw5IEBACitqZHRjb3JlLmphcj1cDQorCWJhdGNoLFwNCisJY29kZWFzc2lzdCxcDQorCWNvbXBpbGVyLFwNCisJZXZhbCxcDQorCWZvcm1hdHRlcixcDQorCWRvbSxcDQorCW1vZGVsLCBcDQorCXNlYXJjaA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmZjZkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTAgQEAKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworcGx1Z2luTmFtZT1KYXZhIERldmVsb3BtZW50IFRvb2xzIENvcmUKK2phdmFOYXR1cmVOYW1lPUphdmEKK2phdmFCdWlsZGVyTmFtZT1KYXZhIEJ1aWxkZXIKK2phdmFQcm9ibGVtTmFtZT1KYXZhIFByb2JsZW0KK2J1aWxkUGF0aFByb2JsZW1OYW1lPUJ1aWxkIHBhdGggUHJvYmxlbQordHJhbnNpZW50SmF2YVByb2JsZW1OYW1lPVRyYW5zaWVudCBKYXZhIFByb2JsZW0KK2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXJzTmFtZT1DbGFzc3BhdGggVmFyaWFibGUgSW5pdGlhbGl6ZXJzCitjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcnNOYW1lPUNsYXNzcGF0aCBDb250YWluZXIgSW5pdGlhbGl6ZXJzCitjb2RlRm9ybWF0dGVyTmFtZT1Db2RlIEZvcm1hdHRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzA2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSBKRFQvQ09SRSBQbHVnLWluIE1hbmlmZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwbHVnaW4KKyAgICBuYW1lID0gIiVwbHVnaW5OYW1lIgorICAgIGlkID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlIgorICAgIHZlcnNpb24gPSAiMi4wLjAiCisgICAgcHJvdmlkZXItbmFtZSA9ICIlcHJvdmlkZXJOYW1lIgorICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSI+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIFByZXJlcXVpc2l0ZSBQbHVnLWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHJlcXVpcmVzPgorICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgorICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLnhlcmNlcyIvPgorICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgb3B0aW9uYWw9InRydWUiLz4KKzwvcmVxdWlyZXM+CisJCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSBSdW50aW1lIExpYnJhcmllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxydW50aW1lPgorICA8bGlicmFyeSBuYW1lPSJqZHRjb3JlLmphciI+ICAKKyAgICAgPGV4cG9ydCBuYW1lID0gIioiLz4KKyAgPC9saWJyYXJ5PiAKKzwvcnVudGltZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uIFBvaW50OiBJbml0aWFsaXplcnMgb2YgQ2xhc3NwYXRoIFZhcmlhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8IUVMRU1FTlQgY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICA8IUFUVExJU1QgY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIHZhcmlhYmxlICAgQ0RBVEEgI1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICBjbGFzcyAgICAgIENEQVRBICNSRVFVSVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIHdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAtIHZhcmlhYmxlIC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPCEtLSAgICAtIGNsYXNzIC0gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplci4gICAgICAgICAtLT4gCis8IS0tICAgICAgICAgICAgICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciB3aXRoIGEgcHVibGljICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgIDAtYXJndW1lbnQgY29uc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSBFeGFtcGxlIG9mIGFuIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgZm9yIGEgY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVkICJGT08iOiAgICAtLT4KKzwhLS0gPGV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPiAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICA8Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICB2YXJpYWJsZT0iRk9PIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgY2xhc3M9ImNvbS5leGFtcGxlLkNQVkluaXRpYWxpemVyIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8L2V4dGVuc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyc05hbWUiIGlkPSJjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIi8+CisgIAorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uIFBvaW50OiBJbml0aWFsaXplcnMgb2YgQ2xhc3NwYXRoIENvbnRhaW5lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8IUVMRU1FTlQgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICA8IUFUVExJU1QgY29udGFpbmVyUmVzb2x2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIGlkICAgICBDREFUQSAjUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICBjbGFzcyAgQ0RBVEEgI1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIHdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAtIGlkIC0gYW4gdW5pcXVlIG5hbWUgaWRlbnRpZnlpbmcgYWxsIGNvbnRhaW5lcnMgZm9yIHdoaWNoIHRoaXMgcmVzb2x2ZXIgd2lsbCAgICAtLT4KKzwhLS0gICAgICAgICAgICAgIGJlIGFjdGl2YXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIC0gY2xhc3MgLSB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgY29udGFpbmVyIHJlc29sdmVyLiAgICAgICAgICAgICAgICAgICAgIC0tPiAKKzwhLS0gICAgICAgICAgICAgIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBhIHB1YmxpYyBzdWJjbGFzcyBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJSZXNvbHZlciB3aXRoIGEgcHVibGljICAgICAgICAgIC0tPgorPCEtLSAgICAgICAgICAgICAgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIEV4YW1wbGUgb2YgYW4gQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZm9yIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBuYW1lZCAgICAgICAgIC0tPgorPCEtLSAiSkRLLzEuMiI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPGV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbnRhaW5lclJlc29sdmVyIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICA8Y2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICBpZD0iSkRLIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgY2xhc3M9ImNvbS5leGFtcGxlLk15SW5pdGlhbGl6ZXIiLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8L2V4dGVuc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcnNOYW1lIiBpZD0iY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uIFBvaW50OiBGb3JtYXR0ZXIgb2YgU291cmNlIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8IUVMRU1FTlQgY29kZUZvcm1hdHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICA8IUFUVExJU1QgY29kZUZvcm1hdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIGNsYXNzICAgICAgQ0RBVEEgI1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIC0gY2xhc3MgLSB0aGUgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbi4gICAgICAgICAgICAgIC0tPiAKKzwhLS0gICAgICAgICAgICAgIFRoZSBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9tIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUZvcm1hdHRlciB3aXRoIGEgcHVibGljICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAgICAgICAgICAgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIEV4YW1wbGUgb2YgYW4gSUNvZGVGb3JtYXR0ZXIgZXh0ZW5zaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA8ZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgIDxjb2RlRm9ybWF0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAgICAgIGNsYXNzPSJjb20uZXhhbXBsZS5NeUNvZGVGb3JtYXR0ZXIiLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPC9leHRlbnNpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY29kZUZvcm1hdHRlck5hbWUiIGlkPSJjb2RlRm9ybWF0dGVyIi8+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uOiBKYXZhIE5hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8ZXh0ZW5zaW9uIAorCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIiAKKwlpZD0iamF2YW5hdHVyZSIKKwluYW1lPSIlamF2YU5hdHVyZU5hbWUiPgorCTxydW50aW1lPgorCQk8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdCI+CisJCTwvcnVuPgorCTwvcnVudGltZT4KKzwvZXh0ZW5zaW9uPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEV4dGVuc2lvbjogSmF2YSBCdWlsZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGV4dGVuc2lvbiAKKwlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiIAorCWlkPSJqYXZhYnVpbGRlciIKKwluYW1lPSIlamF2YUJ1aWxkZXJOYW1lIj4KKwk8YnVpbGRlcj4KKwkJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5KYXZhQnVpbGRlciI+CisJCTwvcnVuPgorCTwvYnVpbGRlcj4KKzwvZXh0ZW5zaW9uPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEV4dGVuc2lvbjogSmF2YSBNYXJrZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLSBKYXZhIHByb2JsZW1zIC0tPgorCis8ZXh0ZW5zaW9uIGlkPSJwcm9ibGVtIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJWphdmFQcm9ibGVtTmFtZSI+CisJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4KKwk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgorCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPGF0dHJpYnV0ZSBuYW1lPSJpZCIvPgorCTxhdHRyaWJ1dGUgbmFtZT0iZmxhZ3MiLz4KKwk8YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50cyIvPgorPC9leHRlbnNpb24+ICAgCisKKzwhLS0gSmF2YSBidWlsZHBhdGggcHJvYmxlbXMgLS0+CisKKzxleHRlbnNpb24gaWQ9ImJ1aWxkcGF0aF9wcm9ibGVtIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJWJ1aWxkUGF0aFByb2JsZW1OYW1lIj4KKwk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPgorCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+CisJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8YXR0cmlidXRlIG5hbWUgPSJjeWNsZURldGVjdGVkIi8+Cis8L2V4dGVuc2lvbj4gICAKKworPCEtLSBKYXZhIHRyYW5zaWVudCBwcm9ibGVtcyAtLT4KKworPGV4dGVuc2lvbiBpZD0idHJhbnNpZW50X3Byb2JsZW0iIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIiBuYW1lPSIldHJhbnNpZW50SmF2YVByb2JsZW1OYW1lIj4KKwk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgorCTxwZXJzaXN0ZW50IHZhbHVlPSJmYWxzZSIvPgorCTxhdHRyaWJ1dGUgbmFtZT0iaWQiLz4KKwk8YXR0cmlidXRlIG5hbWU9ImZsYWdzIi8+CisJPGF0dHJpYnV0ZSBuYW1lPSJhcmd1bWVudHMiLz4KKzwvZXh0ZW5zaW9uPgorICAgIAorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uOiBKYXZhYyBBbnQgQWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPGV4dGVuc2lvbiAKKwlwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzIj4KKwk8ZXh0cmFDbGFzc3BhdGhFbnRyeQorCQlsaWJyYXJ5PSJqZHRDb21waWxlckFkYXB0ZXIuamFyIj4KKwk8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Cis8L2V4dGVuc2lvbj4gCisgICAKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEV4dGVuc2lvbjogSmF2YSBmaWxlIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KKyAgPGZpbGVUeXBlcyBleHRlbnNpb249ImphdmEiIHR5cGU9InRleHQiLz4KKyAgPGZpbGVUeXBlcyBleHRlbnNpb249ImNsYXNzcGF0aCIgdHlwZT0idGV4dCIvPgorICA8ZmlsZVR5cGVzIGV4dGVuc2lvbj0icHJvcGVydGllcyIgdHlwZT0idGV4dCIvPgorICA8ZmlsZVR5cGVzIGV4dGVuc2lvbj0iY2xhc3MiIHR5cGU9ImJpbmFyeSIvPgorICA8ZmlsZVR5cGVzIGV4dGVuc2lvbj0iamFyIiB0eXBlPSJiaW5hcnkiLz4KKyAgPGZpbGVUeXBlcyBleHRlbnNpb249InppcCIgdHlwZT0iYmluYXJ5Ii8+Cis8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydC1iYXRjaC1qZHRjb20ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnQtYmF0Y2gtamR0Y29tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODc2OGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnQtYmF0Y2gtamR0Y29tLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tIGJ1aWxkIHNjcmlwdCB0byBjcmVhdGUgYSBiYXRjaCBjb21waWxlciBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlIC0tPgorPHByb2plY3QgbmFtZT0iRWNsaXBzZSBCYXRjaCBDb21waWxlciIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHRzdGFtcC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vYmF0Y2hjb21waWxlci1leHBvcnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiAgdmFsdWU9IiR7ZGVzdGRpcn0iIC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iaW5pdCI+CisKKwkJPGVjaG8gbWVzc2FnZT0iVEFSR0VUOiAke2Rlc3RkaXJ9IiAvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KKworCQk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Y29tLmphciIgLz4KKwkJPGphciAKKwkJCWphcmZpbGU9IiR7ZGVzdH0vamR0Y29tLmphciIKKwkJCWJhc2VkaXI9ImJpbiIKKwkJCWluY2x1ZGVzPSJvcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvKiosb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvKiIgLz4KKwkJCisJCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBqZHRjb21zcmMuemlwIiAvPgorCQk8emlwIHppcGZpbGU9IiR7ZGVzdH0vamR0Y29tc3JjLnppcCI+CisJCSAgICA8emlwZmlsZXNldCBkaXI9ImJhdGNoIiAvPgorCQkgICAgPHppcGZpbGVzZXQgZGlyPSJjb21waWxlciIgLz4KKyAgCQk8L3ppcD4JCQorCQorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmJiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLSBidWlsZCBzY3JpcHQgdG8gY3JlYXRlIGEgcGx1Z2luIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUgLS0+Cis8cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgZGVmYXVsdD0iZXhwb3J0IHBsdWctaW4gW18yLjAuMF0iIGJhc2VkaXI9Ii4uIj4KKworPHRhcmdldCBuYW1lPSJ6el9pbml0Ij4KKwk8dHN0YW1wLz4KKwk8cHJvcGVydHkgbmFtZT0iZXhwb3J0LWRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+Cis8L3RhcmdldD4KKworPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzIuMC4wXSIgZGVwZW5kcz0ienpfaW5pdCI+CisJPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgorCTxwYXJhbSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9vcmcuZWNsaXBzZS5qZHQuY29yZV8yLjAuMCIvPgorCTwvYW50Y2FsbD4KKzwvdGFyZ2V0PgorCis8dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMS45LjBdIiBkZXBlbmRzPSJ6el9pbml0Ij4KKwk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+CisJPHBhcmFtIG5hbWU9ImRlc3QiIHZhbHVlPSIke2V4cG9ydC1kaXJ9L29yZy5lY2xpcHNlLmpkdC5jb3JlXzEuOS4wIi8+CisJPC9hbnRjYWxsPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iZXhwb3J0IHBsdWctaW4gW25vIHZlcnNpb25dIiBkZXBlbmRzPSJ6el9pbml0Ij4KKwk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+CisJPHBhcmFtIG5hbWU9ImRlc3QiIHZhbHVlPSIke2V4cG9ydC1kaXJ9L29yZy5lY2xpcHNlLmpkdC5jb3JlIi8+CisJPC9hbnRjYWxsPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KKworCTx0c3RhbXAvPgorCisJPGVjaG8gbWVzc2FnZT0iVEFSR0VUOiAke2V4cG9ydC1kaXJ9IiAvPgorCTxta2RpciBkaXI9IiR7ZXhwb3J0LWRpcn0iIC8+CisJPGRlbGV0ZSBkaXI9IiR7ZGVzdH0iIC8+CisJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KKworCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBqZHRjb3JlLmphciIgLz4KKwk8amFyIAorCQlqYXJmaWxlPSIke2Rlc3R9L2pkdGNvcmUuamFyIgorCQliYXNlZGlyPSJiaW4iIAorCQlleGNsdWRlcz0iKiovSkRUQ29tcGlsZXJBZGFwdGVyLmNsYXNzIi8+CisJCQorCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBqZHRDb21waWxlckFkYXB0ZXIuamFyIiAvPgorCTxqYXIgCisJCWphcmZpbGU9IiR7ZGVzdH0vamR0Q29tcGlsZXJBZGFwdGVyLmphciIKKwkJYmFzZWRpcj0iYmluIiAKKwkJaW5jbHVkZXM9IioqL0pEVENvbXBpbGVyQWRhcHRlci5jbGFzcyIvPgorCisJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIHBsdWdpbi54bWwiIC8+CisJPGNvcHkgZmlsZT0icGx1Z2luLnhtbCIgdG9kaXI9IiR7ZGVzdH0iIC8+CisJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIHBsdWdpbi5wcm9wZXJ0aWVzIiAvPgorCTxjb3B5IGZpbGU9InBsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXN0fSIgLz4KKworCTxlY2hvIG1lc3NhZ2U9IlVQREFURSAub3B0aW9ucyIgLz4KKwk8Y29weSBmaWxlPSIub3B0aW9ucyIgdG9kaXI9IiR7ZGVzdH0iIC8+CisKKwk8ZWNobyBtZXNzYWdlPSJVUERBVEUgYWJvdXQuaHRtbCIgLz4KKwk8Y29weSBmaWxlPSJhYm91dC5odG1sIiB0b2Rpcj0iJHtkZXN0fSIgLz4KKworCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBqZHRjb3Jlc3JjLnppcCIgLz4KKwk8emlwIHppcGZpbGU9IiR7ZGVzdH0vamR0Y29yZXNyYy56aXAiPgorCSAgICA8emlwZmlsZXNldCBkaXI9ImFudGFkYXB0ZXIiIC8+CisJICAgIDx6aXBmaWxlc2V0IGRpcj0iYmF0Y2giIC8+CisJICAgIDx6aXBmaWxlc2V0IGRpcj0iY29kZWFzc2lzdCIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJjb21waWxlciIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJkb20iIC8+CisJICAgIDx6aXBmaWxlc2V0IGRpcj0iZXZhbCIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJmb3JtYXR0ZXIiIC8+CisJICAgIDx6aXBmaWxlc2V0IGRpcj0ibW9kZWwiIC8+CisJICAgIDx6aXBmaWxlc2V0IGRpcj0ic2VhcmNoIiAvPgorCTwvemlwPgkJCis8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDRkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLio7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBjb25zdGFudHMgdXNlZCBieSB0aGUgc2VhcmNoIGVuZ2luZS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgZGVjbGFyZXMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KKyAqIDwvcD4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZQorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKKworCS8qKgorCSAqIFRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudCBvciB0aGUgbmF0dXJlCisJICogb2YgbWF0Y2ggaW4gdW5rbm93bi4KKwkgKi8KKwlpbnQgVU5LTk9XTiA9IC0xOworCQorCS8qIE5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50ICovCisJCisJLyoqCisJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSB0eXBlLgorCSAqLworCWludCBUWVBFPSAwOworCisJLyoqCisJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSBtZXRob2QuCisJICovCisJaW50IE1FVEhPRD0gMTsKKworCS8qKgorCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGEgcGFja2FnZS4KKwkgKi8KKwlpbnQgUEFDS0FHRT0gMjsKKworCS8qKgorCSAqIFRoZSBzZWFyY2hlZCBlbGVtZW50IGlzIGEgY29uc3RydWN0b3IuCisJICovCisJaW50IENPTlNUUlVDVE9SPSAzOworCisJLyoqCisJICogVGhlIHNlYXJjaGVkIGVsZW1lbnQgaXMgYSBmaWVsZC4KKwkgKi8KKwlpbnQgRklFTEQ9IDQ7CisKKwkvKioKKwkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhIGNsYXNzLiAKKwkgKiBNb3JlIHNlbGVjdGl2ZSB0aGFuIHVzaW5nIFRZUEUKKwkgKi8KKwlpbnQgQ0xBU1M9IDU7CisKKwkvKioKKwkgKiBUaGUgc2VhcmNoZWQgZWxlbWVudCBpcyBhbiBpbnRlcmZhY2UuCisJICogTW9yZSBzZWxlY3RpdmUgdGhhbiB1c2luZyBUWVBFCisJICovCisJaW50IElOVEVSRkFDRT0gNjsKKworCS8qIE5hdHVyZSBvZiBtYXRjaCAqLworCQorCS8qKgorCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24uCisJICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cworCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgorCSAqLworCWludCBERUNMQVJBVElPTlM9IDA7CisKKwkvKioKKwkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZS4gCisJICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGVpdGhlciBUWVBFIG9yIENMQVNTIG9yIElOVEVSRkFDRSwgaXQgd2lsbAorCSAqIHJlc3BlY3RpdmVseSBzZWFyY2ggZm9yIGFueSB0eXBlIGltcGxlbWVudGluZy9leHRlbmRpbmcgYW4gaW50ZXJmYWNlLCBvcgorCSAqIHJhdGhlciBleGNsdXNpdmVseSBzZWFyY2ggZm9yIGNsYXNzZXMgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSwgb3IgaW50ZXJmYWNlcyAKKwkgKiBleHRlbmRpbmcgYW4gaW50ZXJmYWNlLgorCSAqLworCWludCBJTVBMRU1FTlRPUlM9IDE7CisKKwkvKioKKwkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIHJlZmVyZW5jZS4KKwkgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBvZiB0aGUgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzCisJICogc28gYXMgdG8gYmV0dGVyIG5hcnJvdyBkb3duIHRoZSBzZWFyY2guCisJICogUmVmZXJlbmNlcyBjYW4gY29udGFpbiBpbXBsZW1lbnRlcnMgc2luY2UgdGhleSBhcmUgbW9yZSBnZW5lcmljIGtpbmQKKwkgKiBvZiBtYXRjaGVzLgorCSAqLworCWludCBSRUZFUkVOQ0VTPSAyOworCisJLyoqCisJICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSBkZWNsYXJhdGlvbiwgYSByZWZlcmVuY2UsIG9yIGFuIGltcGxlbWVudGVyIAorCSAqIG9mIGFuIGludGVyZmFjZS4KKwkgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBvZiB0aGUgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzCisJICogc28gYXMgdG8gYmV0dGVyIG5hcnJvdyBkb3duIHRoZSBzZWFyY2guCisJICovCisJaW50IEFMTF9PQ0NVUlJFTkNFUz0gMzsKKworCS8qKgorCSAqIFdoZW4gc2VhcmNoaW5nIGZvciBmaWVsZCBtYXRjaGVzLCBpdCB3aWxsIGV4Y2x1c2l2ZWx5IGZpbmQgcmVhZCBhY2Nlc3NlcywgYXMKKwkgKiBvcHBvc2VkIHRvIHdyaXRlIGFjY2Vzc2VzLiBOb3RlIHRoYXQgc29tZSBleHByZXNzaW9ucyBhcmUgY29uc2lkZXJlZCBib3RoCisJICogYXMgZmllbGQgcmVhZC93cml0ZSBhY2Nlc3NlczogZS5nLiB4Kys7IHgrPSAxOworCSAqIAorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlpbnQgUkVBRF9BQ0NFU1NFUyA9IDQ7CisJCisJLyoqCisJICogV2hlbiBzZWFyY2hpbmcgZm9yIGZpZWxkIG1hdGNoZXMsIGl0IHdpbGwgZXhjbHVzaXZlbHkgZmluZCB3cml0ZSBhY2Nlc3NlcywgYXMKKwkgKiBvcHBvc2VkIHRvIHJlYWQgYWNjZXNzZXMuIE5vdGUgdGhhdCBzb21lIGV4cHJlc3Npb25zIGFyZSBjb25zaWRlcmVkIGJvdGgKKwkgKiBhcyBmaWVsZCByZWFkL3dyaXRlIGFjY2Vzc2VzOiBlLmcuIHgrKzsgeCs9IDE7CisJICogCisJICogQHNpbmNlIDIuMAorCSAqLworCWludCBXUklURV9BQ0NFU1NFUyA9IDU7CisJCisJLyogU3ludGFjdGljIG1hdGNoIG1vZGVzICovCisJCisJLyoqCisJICogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgc2VhcmNoIHJlc3VsdCwKKwkgKiBpLmUuIHRoZSBzb3VyY2Ugb2YgdGhlIHNlYXJjaCByZXN1bHQgZXF1YWxzIHRoZSBzZWFyY2ggcGF0dGVybi4KKwkgKi8KKwlpbnQgRVhBQ1RfTUFUQ0ggPSAwOworCS8qKgorCSAqIFRoZSBzZWFyY2ggcGF0dGVybiBpcyBhIHByZWZpeCBvZiB0aGUgc2VhcmNoIHJlc3VsdC4KKwkgKi8KKwlpbnQgUFJFRklYX01BVENIID0gMTsKKwkvKioKKwkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonKSB3aGVyZSBhIAorCSAqIHdpbGQtY2FyZCBjYW4gcmVwbGFjZSAwIG9yIG1vcmUgY2hhcmFjdGVycyBpbiB0aGUgc2VhcmNoIHJlc3VsdC4KKwkgKi8KKwlpbnQgUEFUVEVSTl9NQVRDSCA9IDI7CisKKworCS8qIENhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkKKwkvKioKKwkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5CisJICogaWYgY2FzZXMgYXJlIHRoZSBzYW1lLgorCSAqLworCWJvb2xlYW4gQ0FTRV9TRU5TSVRJVkUgPSB0cnVlOworCS8qKgorCSAqIFRoZSBzZWFyY2ggcGF0dGVybiBpZ25vcmVzIGNhc2VzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgorCSAqLworCWJvb2xlYW4gQ0FTRV9JTlNFTlNJVElWRSA9IGZhbHNlOworCQorCisJLyogV2FpdGluZyBwb2xpY2llcyAqLworCQorCS8qKgorCSAqIFRoZSBzZWFyY2ggb3BlcmF0aW9uIHN0YXJ0cyBpbW1lZGlhdGVseSwgZXZlbiBpZiB0aGUgdW5kZXJseWluZyBpbmRleGVyCisJICogaGFzIG5vdCBmaW5pc2hlZCBpbmRleGluZyB0aGUgd29ya3NwYWNlLiBSZXN1bHRzIHdpbGwgbW9yZSBsaWtlbHkKKwkgKiBub3QgY29udGFpbiBhbGwgdGhlIG1hdGNoZXMuCisJICovCisJaW50IEZPUkNFX0lNTUVESUFURV9TRUFSQ0ggPSBJSm9iLkZvcmNlSW1tZWRpYXRlOworCS8qKgorCSAqIFRoZSBzZWFyY2ggb3BlcmF0aW9uIHRocm93cyBhbiA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb248L2NvZGU+CisJICogaWYgdGhlIHVuZGVybHlpbmcgaW5kZXhlciBoYXMgbm90IGZpbmlzaGVkIGluZGV4aW5nIHRoZSB3b3Jrc3BhY2UuCisJICovCisJaW50IENBTkNFTF9JRl9OT1RfUkVBRFlfVE9fU0VBUkNIID0gSUpvYi5DYW5jZWxJZk5vdFJlYWR5OworCS8qKgorCSAqIFRoZSBzZWFyY2ggb3BlcmF0aW9uIHdhaXRzIGZvciB0aGUgdW5kZXJseWluZyBpbmRleGVyIHRvIGZpbmlzaCBpbmRleGluZyAKKwkgKiB0aGUgd29ya3NwYWNlIGJlZm9yZSBzdGFydGluZyB0aGUgc2VhcmNoLgorCSAqLworCWludCBXQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCA9IElKb2IuV2FpdFVudGlsUmVhZHk7CisJCisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjMjQxNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CisKKy8qKgorICogQSA8Y29kZT5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjwvY29kZT4gY29sbGVjdHMgc2VhcmNoIHJlc3VsdHMgZnJvbSBhIDxjb2RlPnNlYXJjaDwvY29kZT4KKyAqIHF1ZXJ5IHRvIGEgPGNvZGU+U2VhcmNoRW5naW5lPC9jb2RlPi4gQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgcGFzcworICogYW4gaW5zdGFuY2UgdG8gdGhlIDxjb2RlPnNlYXJjaCguLi4pPC9jb2RlPiBtZXRob2RzLiBXaGVuIGEgc2VhcmNoIHN0YXJ0cywgdGhlIDxjb2RlPmFib3V0VG9TdGFydCgpPC9jb2RlPgorICogbWV0aG9kIGlzIGNhbGxlZCwgdGhlbiAwIG9yIG1vcmUgY2FsbCB0byA8Y29kZT5hY2NlcHQoLi4uKTwvY29kZT4gYXJlIGRvbmUsIGZpbmFsbHkgdGhlCisgKiA8Y29kZT5kb25lKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCisgKiA8cD4KKyAqIFJlc3VsdHMgcHJvdmlkZWQgdG8gdGhpcyBjb2xsZWN0b3IgbWF5IGJlIGFjY3VyYXRlIC0gaW4gdGhpcyBjYXNlIHRoZXkgaGF2ZSBhbiA8Y29kZT5FWEFDVF9NQVRDSDwvY29kZT4gYWNjdXJhY3kgLQorICogb3IgdGhleSBtaWdodCBiZSBwb3RlbnRpYWwgbWF0Y2hlcyBvbmx5IC0gdGhleSBoYXZlIGEgPGNvZGU+UE9URU5USUFMX01BVENIPC9jb2RlPiBhY2N1cmFjeS4gVGhpcyBsYXN0CisgKiBjYXNlIGNhbiBvY2N1ciB3aGVuIGEgcHJvYmxlbSBwcmV2ZW50ZWQgdGhlIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4gZnJvbSByZXNvbHZpbmcgdGhlIG1hdGNoLgorICogPC9wPgorICogPHA+CisgKiBUaGUgb3JkZXIgb2YgdGhlIHJlc3VsdHMgaXMgdW5zcGVjaWZpZWQuIENsaWVudHMgbXVzdCBub3QgcmVseSBvbiB0aGlzIG9yZGVyIHRvIGRpc3BsYXkgcmVzdWx0cywgCisgKiBidXQgdGhleSBzaG91bGQgc29ydCB0aGVzZSByZXN1bHRzIChlLmcuIGluIGEgc3ludGFjdGljYWwgb3JkZXIpLgorICogPHA+CisgKiBUaGUgPGNvZGU+SUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I8L2NvZGU+IGlzIGFsc28gdXNlZCB0byBwcm92aWRlIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0aGUgCisgKiA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+LgorICogPC9wPgorICogPHA+CisgKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKiA8L3A+CisgKgorICogQHNlZSBTZWFyY2hFbmdpbmUjc2VhcmNoCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgeworCS8qKgorCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHNlYXJjaCBwYXR0ZXJuLgorCSAqLworCWludCBFWEFDVF9NQVRDSCA9IDA7CisKKwkvKioKKwkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBwb3RlbnRpYWxseSBhIG1hdGNoIGZvciB0aGUgc2VhcmNoIHBhdHRlcm4sCisJICogYnV0IGEgcHJvYmxlbSBwcmV2ZW50ZWQgdGhlIHNlYXJjaCBlbmdpbmUgZnJvbSBiZWluZyBtb3JlIGFjY3VyYXRlCisJICogKHR5cGljYWxseSBiZWNhdXNlIG9mIHRoZSBjbGFzc3BhdGggd2FzIG5vdCBjb3JyZWN0bHkgc2V0KS4KKwkgKi8KKwkgaW50IFBPVEVOVElBTF9NQVRDSCA9IDE7CisKKy8qKgorICogQ2FsbGVkIGJlZm9yZSB0aGUgYWN0dWFsIHNlYXJjaCBzdGFydHMuCisgKi8KK3B1YmxpYyB2b2lkIGFib3V0VG9TdGFydCgpOworLyoqCisgKiBBY2NlcHRzIHRoZSBnaXZlbiBzZWFyY2ggcmVzdWx0LgorICoKKyAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgaW4gd2hpY2ggdGhlIG1hdGNoIGhhcyBiZWVuIGZvdW5kCisgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtYXRjaCwgLTEgaWYgaXQgaXMgdW5rbm93bgorICogQHBhcmFtIGVuZCB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBtYXRjaCwgLTEgaWYgaXQgaXMgdW5rbm93bjsKKyAqICB0aGUgZW5kaW5nIG9mZnNldCBpcyBleGNsdXNpdmUsIG1lYW5pbmcgdGhhdCB0aGUgYWN0dWFsIHJhbmdlIG9mIGNoYXJhY3RlcnMgCisgKiAgY292ZXJlZCBpcyA8Y29kZT5bc3RhcnQsIGVuZF08L2NvZGU+CisgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgSmF2YSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGNoYXJhY3RlciByYW5nZQorICoJPGNvZGU+W3N0YXJ0LCBlbmRdPC9jb2RlPjsgdGhlIHZhbHVlIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQKKyAqCW5vIGVuY2xvc2luZyBKYXZhIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQKKyAqIEBwYXJhbSBhY2N1cmFjeSB0aGUgbGV2ZWwgb2YgYWNjdXJhY3kgdGhlIHNlYXJjaCByZXN1bHQgaGFzOyBlaXRoZXIKKyAqICA8Y29kZT5FWEFDVF9NQVRDSDwvY29kZT4gb3IgPGNvZGU+UE9URU5USUFMX01BVENIPC9jb2RlPgorICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgY29sbGVjdG9yIGhhZCBhIHByb2JsZW0gYWNjZXB0aW5nIHRoZSBzZWFyY2ggcmVzdWx0CisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdCgKKwlJUmVzb3VyY2UgcmVzb3VyY2UsCisJaW50IHN0YXJ0LAorCWludCBlbmQsCisJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsCisJaW50IGFjY3VyYWN5KQorCXRocm93cyBDb3JlRXhjZXB0aW9uOworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgc2VhcmNoIGhhcyBlbmRlZC4KKyAqLworcHVibGljIHZvaWQgZG9uZSgpOworLyoqCisgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzLgorICoKKyAqIEByZXR1cm4gYSBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvciBpcyBwcm92aWRlZAorICovCitwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhMDZkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5KYXJGaWxlRW50cnlEb2N1bWVudDsKKworLyoqCisgKiBBbiA8Y29kZT5JSmF2YVNlYXJjaFNjb3BlPC9jb2RlPiBkZWZpbmVzIHdoZXJlIHNlYXJjaCByZXN1bHQgc2hvdWxkIGJlIGZvdW5kIGJ5IGEKKyAqIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4uIENsaWVudHMgbXVzdCBwYXNzIGFuIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlCisgKiB0byB0aGUgPGNvZGU+c2VhcmNoKC4uLik8L2NvZGU+IG1ldGhvZHMuIFN1Y2ggYW4gaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlCisgKiBmb2xsb3dpbmcgZmFjdG9yeSBtZXRob2RzIG9uIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT46IDxjb2RlPmNyZWF0ZUhpZXJhcmNoeVNjb3BlKElUeXBlKTwvY29kZT4sCisgKiA8Y29kZT5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoSVJlc291cmNlW10pPC9jb2RlPiwgPGNvZGU+Y3JlYXRlV29ya3NwYWNlU2NvcGUoKTwvY29kZT4sIG9yCisgKiBjbGllbnRzIG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhU2VhcmNoU2NvcGUgeworCS8qKgorCSAqIFRoaXMgY29uc3RhbnQgZGVmaW5lcyB0aGUgc2VwYXJhdG9yIG9mIHRoZSByZXNvdXJjZVBhdGggc3RyaW5nIG9mIHRoZSA8Y29kZT5lbmNsb3NlcyhTdHJpbmcpPC9jb2RlPgorCSAqIG1ldGhvZC4gSWYgcHJlc2VudCBpbiB0aGUgc3RyaW5nLCBpdCBzZXBhcmF0ZXMgdGhlIHBhdGggdG8gdGhlIGphciBmaWxlIGZyb20gdGhlIHBhdGgKKwkgKiB0byB0aGUgLmNsYXNzIGZpbGUgaW4gdGhlIGphci4KKwkgKi8KKwlTdHJpbmcgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SID0gSmFyRmlsZUVudHJ5RG9jdW1lbnQuSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SOworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaXMgZW5jbG9zZWQgYnkgdGhpcyBzY29wZS4KKyAqCisgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIGlmIHRoZSByZXNvdXJjZSBpcyBjb250YWluZWQgaW4KKyAqIGEgSkFSIGZpbGUsIHRoZSBwYXRoIGlzIGNvbXBvc2VkIG9mIDIgcGF0aHMgc2VwYXJhdGVkCisgKiBieSA8Y29kZT5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1I8L2NvZGU+OiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIAorICogdG8gdGhlIEpBUiAoaWYgaXQgaXMgYW4gZXh0ZXJuYWwgSkFSKSwgb3IgdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSA8Y29kZT5JUGF0aDwvY29kZT4KKyAqIHRvIHRoZSBKQVIgKGlmIGl0IGlzIGFuIGludGVybmFsIEpBUiksIAorICogdGhlIHNlY29uZCBwYXRoIGlzIHRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbnNpZGUgdGhlIEpBUi4KKyAqIEByZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZW5jbG9zZWQgYnkgdGhpcyBzY29wZQorICovCitwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKTsKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBzY29wZSBlbmNsb3NlcyB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqCisgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAorICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGlzIHNjb3BlCisgKi8KK3B1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KTsKKy8qKgorICogUmV0dXJucyB0aGUgcGF0aHMgdG8gdGhlIGVuY2xvc2luZyBwcm9qZWN0cyBhbmQgSkFScyBmb3IgdGhpcyBzZWFyY2ggc2NvcGUuCisgKiAKKyAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcGF0aHMgdG8gdGhlIGVuY2xvc2luZyBwcm9qZWN0cyBhbmQgSkFSUy4gQSBwcm9qZWN0IHBhdGggaXMKKyAqCQkJdGhlIGZ1bGwgcGF0aCB0byB0aGUgcHJvamVjdC4gQSBKQVIgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIHRvIHRoZSBKQVIgZmlsZS4JCQkKKyAqLworSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgY29udGFpbnMgYW55IDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgKGVpdGhlcgorICogaW4gZm9sZGVycyBvciB3aXRoaW4gSkFScykuCisgKiAKKyAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNjb3BlIGNvbnRhaW5zIGFueSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzCisgKiBAZGVwcmVjYXRlZAorICovCitib29sZWFuIGluY2x1ZGVzQmluYXJpZXMoKTsKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocyBkZWZpbmVkIGJ5IAorICogdGhlIHByb2plY3RzIG9mIHRoZSByZXNvdXJjZXMgb2YgdGhpcyBzZWFyY2ggc2NvcGUuCisgKiAKKyAqIEByZXR1cm4gd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIGNsYXNzcGF0aHMKKyAqIEBkZXByZWNhdGVkIAorICovCitib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpOworLyoqCisgKiBTZXRzIHdoZXRoZXIgdGhpcyBzY29wZSBjb250YWlucyBhbnkgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyAoZWl0aGVyCisgKiBpbiBmb2xkZXJzIG9yIHdpdGhpbiBKQVJzKS4KKyAqIAorICogQHBhcmFtIGluY2x1ZGVzQmluYXJpZXMgd2hldGhlciB0aGlzIHNjb3BlIGNvbnRhaW5zIGFueSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzCisgKiBAZGVwcmVjYXRlZCBVc2UgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSkgd2l0aCB0aGUgcGFja2FnZSBmcmFnbWVudAorICogCQkJCXJvb3RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYmluYXJpZXMgaW5zdGVhZAorICovCitwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0JpbmFyaWVzKGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcyk7CisvKioKKyAqIFNldHMgd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIHRoZSBjbGFzc3BhdGhzIGRlZmluZWQgYnkgCisgKiB0aGUgcHJvamVjdHMgb2YgdGhlIHJlc291cmNlcyBvZiB0aGlzIHNlYXJjaCBzY29wZS4KKyAqIAorICogQHJldHVybiBpbmNsdWRlc0NsYXNzcGF0aHMgd2hldGhlciB0aGlzIHNjb3BlIGluY2x1ZGVzIGNsYXNzcGF0aHMKKyAqIEBkZXByZWNhdGVkIFVzZSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSAKKyAqIAkJCQl3aXRoIGEgamF2YSBwcm9qZWN0IGluc3RlYWQKKyAqLworcHVibGljIHZvaWQgc2V0SW5jbHVkZXNDbGFzc3BhdGhzKGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVNlYXJjaFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVNlYXJjaFBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzgzOWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JU2VhcmNoUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKKworLyoqCisgKiBBIHNlYXJjaCBwYXR0ZXJuIGRlZmluZXMgaG93IHNlYXJjaCByZXN1bHRzIGFyZSBmb3VuZC4gVXNlIDxjb2RlPlNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuPC9jb2RlPgorICogdG8gY3JlYXRlIGEgc2VhcmNoIHBhdHRlcm4uCisgKgorICogQHNlZSBTZWFyY2hFbmdpbmUjY3JlYXRlU2VhcmNoUGF0dGVybihJSmF2YUVsZW1lbnQsIGludCkKKyAqIEBzZWUgU2VhcmNoRW5naW5lI2NyZWF0ZVNlYXJjaFBhdHRlcm4oU3RyaW5nLCBpbnQsIGludCwgYm9vbGVhbikKKyAqLworcHVibGljIGludGVyZmFjZSBJU2VhcmNoUGF0dGVybiB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lUeXBlTmFtZVJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgwOWUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CisKKy8qKgorICogQSA8Y29kZT5JVHlwZU5hbWVSZXF1ZXN0b3I8L2NvZGU+IGNvbGxlY3RzIHNlYXJjaCByZXN1bHRzIGZyb20gYSA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXM8L2NvZGU+CisgKiBxdWVyeSB0byBhIDxjb2RlPlNlYXJjaEVuZ2luZTwvY29kZT4uIENsaWVudHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYW5kIHBhc3MKKyAqIGFuIGluc3RhbmNlIHRvIHRoZSA8Y29kZT5zZWFyY2hBbGxUeXBlTmFtZXMoLi4uKTwvY29kZT4gbWV0aG9kLiBPbmx5IHRvcC1sZXZlbCBhbmQKKyAqIG1lbWJlciB0eXBlcyBhcmUgcmVwb3J0ZWQuIExvY2FsIHR5cGVzIGFyZSBub3QgcmVwb3J0ZWQuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogPC9wPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUeXBlTmFtZVJlcXVlc3RvciB7CisvKioKKyAqIEFjY2VwdHMgYSB0b3AtbGV2ZWwgb3IgYSBtZW1iZXIgY2xhc3MuCisgKgorICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzCisgKiBAcGFyYW0gc2ltcGxlVHlwZU5hbWUgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBjbGFzcworICogQHBhcmFtIGVuY2xvc2luZ1R5cGVOYW1lcyBpZiB0aGUgY2xhc3MgaXMgYSBtZW1iZXIgdHlwZSwgCisgKiAgICAgICAgICB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBlbmNsb3NpbmcgdHlwZXMgZnJvbSB0aGUgb3V0ZXItbW9zdCB0byB0aGUKKyAqICAgICAgICAgIGRpcmVjdCBwYXJlbnQgb2YgdGhlIGNsYXNzIChlLmcuIGlmIHRoZSBjbGFzcyBpcyB4LnkuQSRCJEMgdGhlbgorICogICAgICAgICAgdGhlIGVuY2xvc2luZyB0eXBlcyBhcmUgW0EsIEJdLiBUaGlzIGlzIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBjbGFzcworICogICAgICAgICAgaXMgYSB0b3AtbGV2ZWwgdHlwZS4KKyAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGNsYXNzLiBJZiB0aGUgcmVzb3VyY2UgaXMgYSAuY2xhc3MgZmlsZQorICogICAgICAgICAgb3IgYSAuamF2YSBmaWxlLCB0aGlzIGlzIHRoZSBmdWxsIHBhdGggaW4gdGhlIHdvcmtzcGFjZSB0byB0aGlzIHJlc291cmNlLiBJZiB0aGUKKyAqICAgICAgICAgIHJlc291cmNlIGlzIGEgLnppcCBvciAuamFyIGZpbGUsIHRoaXMgaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGlzIGZpbGUuCisgKi8KK3ZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpOworLyoqCisgKiBBY2NlcHRzIGEgdG9wLWxldmVsIG9yIGEgbWVtYmVyIGludGVyZmFjZS4KKyAqCisgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIGRvdC1zZXBhcmF0ZWQgbmFtZSBvZiB0aGUgcGFja2FnZSBvZiB0aGUgaW50ZXJmYWNlCisgKiBAcGFyYW0gc2ltcGxlVHlwZU5hbWUgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UKKyAqIEBwYXJhbSBlbmNsb3NpbmdUeXBlTmFtZXMgaWYgdGhlIGludGVyZmFjZSBpcyBhIG1lbWJlciB0eXBlLCAKKyAqICAgICAgICAgIHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIGVuY2xvc2luZyB0eXBlcyBmcm9tIHRoZSBvdXRlci1tb3N0IHRvIHRoZQorICogICAgICAgICAgZGlyZWN0IHBhcmVudCBvZiB0aGUgaW50ZXJmYWNlIChlLmcuIGlmIHRoZSBpbnRlcmZhY2UgaXMgeC55LkEkQiRJIHRoZW4KKyAqICAgICAgICAgIHRoZSBlbmNsb3NpbmcgdHlwZXMgYXJlIFtBLCBCXS4gVGhpcyBpcyBhbiBlbXB0eSBhcnJheSBpZiB0aGUgaW50ZXJmYWNlCisgKiAgICAgICAgICBpcyBhIHRvcC1sZXZlbCB0eXBlLgorICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlLiBJZiB0aGUgcmVzb3VyY2UgaXMgYSAuY2xhc3MgZmlsZQorICogICAgICAgICAgb3IgYSAuamF2YSBmaWxlLCB0aGlzIGlzIHRoZSBmdWxsIHBhdGggaW4gdGhlIHdvcmtzcGFjZSB0byB0aGlzIHJlc291cmNlLiBJZiB0aGUKKyAqICAgICAgICAgIHJlc291cmNlIGlzIGEgLnppcCBvciAuamFyIGZpbGUsIHRoaXMgaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGlzIGZpbGUuCisgKi8KK3ZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGVlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCkBAIC0wLDAgKzEsNzE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5IaWVyYXJjaHlTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSW5kZXhTZWFyY2hBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmZvQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5KYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkphdmFXb3Jrc3BhY2VTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guUGF0dGVyblNlYXJjaEpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guUGF0aENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuKjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEEgPGNvZGU+U2VhcmNoRW5naW5lPC9jb2RlPiBzZWFyY2hlcyBmb3IgamF2YSBlbGVtZW50cyBmb2xsb3dpbmcgYSBzZWFyY2ggcGF0dGVybi4KKyAqIFRoZSBzZWFyY2ggY2FuIGJlIGxpbWl0ZWQgdG8gYSBzZWFyY2ggc2NvcGUuCisgKiA8cD4KKyAqIFZhcmlvdXMgc2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBmYWN0b3J5IG1ldGhvZHMgCisgKiA8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKFN0cmluZywgaW50LCBpbnQsIGJvb2xlYW4pPC9jb2RlPiwgPGNvZGU+Y3JlYXRlU2VhcmNoUGF0dGVybihJSmF2YUVsZW1lbnQsIGludCk8L2NvZGU+LAorICogPGNvZGU+Y3JlYXRlT3JTZWFyY2hQYXR0ZXJuKElTZWFyY2hQYXR0ZXJuLCBJU2VhcmNoUGF0dGVybik8L2NvZGU+LgorICogPC9wPgorICogPHA+Rm9yIGV4YW1wbGUsIG9uZSBjYW4gc2VhcmNoIGZvciByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGluIHRoZSBoaWVyYXJjaHkgb2YgYSB0eXBlLCAKKyAqIG9yIG9uZSBjYW4gc2VhcmNoIGZvciB0aGUgZGVjbGFyYXRpb25zIG9mIHR5cGVzIHN0YXJ0aW5nIHdpdGggIkFic3RyYWN0IiBpbiBhIHByb2plY3QuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hFbmdpbmUgeworCisJLyoqCisJICogQSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgCisJICogY29tcGlsYXRpb24gdW5pdHMuCisJICovCisJcHJpdmF0ZSBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzID0gbnVsbDsKKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwkKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBlbmdpbmUuCisgKi8KK3B1YmxpYyBTZWFyY2hFbmdpbmUoKSB7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGVuZ2luZSB3aXRoIGEgbGlzdCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgCisgKiB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgc3Vic2VxdWVudCBzZWFyY2ggb3BlcmF0aW9ucy4KKyAqIDxwPgorICogTm90ZSB0aGF0IHBhc3NpbmcgYW4gZW1wdHkgd29ya2luZyBjb3B5IHdpbGwgYmUgYXMgaWYgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCisgKiB1bml0IGhhZCBiZWVuIGRlbGV0ZWQuPC9wPgorICogCisgKiBAcGFyYW0gd29ya2luZ0NvcGllcyB0aGUgd29ya2luZyBjb3BpZXMgdGhhdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cworICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgU2VhcmNoRW5naW5lKElXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMpIHsKKwl0aGlzLndvcmtpbmdDb3BpZXMgPSB3b3JraW5nQ29waWVzOworfQorLyoqCisgKiBSZXR1cm5zIGEgamF2YSBzZWFyY2ggc2NvcGUgbGltaXRlZCB0byB0aGUgaGllcmFyY2h5IG9mIHRoZSBnaXZlbiB0eXBlLgorICogVGhlIGphdmEgZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gYSBzZWFyY2ggd2l0aCB0aGlzIHNjb3BlIHdpbGwKKyAqIGJlIHR5cGVzIGluIHRoaXMgaGllcmFyY2h5LCBvciBtZW1iZXJzIG9mIHRoZSB0eXBlcyBpbiB0aGlzIGhpZXJhcmNoeS4KKyAqCisgKiBAcGFyYW0gdHlwZSB0aGUgZm9jdXMgb2YgdGhlIGhpZXJhcmNoeSBzY29wZQorICogQHJldHVybiBhIG5ldyBoaWVyYXJjaHkgc2NvcGUKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBoaWVyYXJjaHkgY291bGQgbm90IGJlIGNvbXB1dGVkIG9uIHRoZSBnaXZlbiB0eXBlCisgKi8KK3B1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVIaWVyYXJjaHlTY29wZShJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gbmV3IEhpZXJhcmNoeVNjb3BlKHR5cGUpOworfQorLyoqCisgKiBSZXR1cm5zIGEgamF2YSBzZWFyY2ggc2NvcGUgbGltaXRlZCB0byB0aGUgZ2l2ZW4gcmVzb3VyY2VzLgorICogVGhlIGphdmEgZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gYSBzZWFyY2ggd2l0aCB0aGlzIHNjb3BlIHdpbGwKKyAqIGhhdmUgdGhlaXIgdW5kZXJseWluZyByZXNvdXJjZSBpbmNsdWRlZCBpbiBvciBlcXVhbHMgdG8gb25lIG9mIHRoZSBnaXZlbgorICogcmVzb3VyY2VzLgorICogPHA+CisgKiBSZXNvdXJjZXMgbXVzdCBub3Qgb3ZlcmxhcCwgZS5nLiBvbmUgY2Fubm90IGluY2x1ZGUgYSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbi4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSByZXNvdXJjZXMgdGhlIHNjb3BlIGlzIGxpbWl0ZWQgdG8KKyAqIEByZXR1cm4gYSBuZXcgamF2YSBzZWFyY2ggc2NvcGUKKyAqIEBkZXByZWNhdGVkIFVzZSBjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pIGluc3RlYWQKKyAqLworcHVibGljIHN0YXRpYyBJSmF2YVNlYXJjaFNjb3BlIGNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKKwlKYXZhQ29yZSBqYXZhQ29yZSA9IEphdmFDb3JlLmdldEphdmFDb3JlKCk7CisJaW50IGxlbmd0aCA9IHJlc291cmNlcy5sZW5ndGg7CisJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W2xlbmd0aF07CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQllbGVtZW50c1tpXSA9IGphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZXNbaV0pOworCX0KKwlyZXR1cm4gY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKK30KKy8qKgorICogUmV0dXJucyBhIGphdmEgc2VhcmNoIHNjb3BlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIGphdmEgZWxlbWVudHMuCisgKiBUaGUgamF2YSBlbGVtZW50cyByZXN1bHRpbmcgZnJvbSBhIHNlYXJjaCB3aXRoIHRoaXMgc2NvcGUgd2lsbAorICogYmUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGVsZW1lbnRzLgorICogPHA+CisgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElKYXZhUHJvamVjdCwgdGhlbiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXJzLCAKKyAqIGl0cyBqYXJzIChleHRlcm5hbCBhbmQgaW50ZXJuYWwpIGFuZCBpdHMgcmVmZXJlbmNlZCBwcm9qZWN0cyAod2l0aCB0aGVpciBzb3VyY2UgCisgKiBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC4KKyAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VGcmFnbWVudFJvb3QsIHRoZW4gb25seSB0aGUgcGFja2FnZSBmcmFnbWVudHMgb2YgCisgKiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aWxsIGJlIGluY2x1ZGVkLgorICogSWYgYW4gZWxlbWVudCBpcyBhbiBJUGFja2FnZUZyYWdtZW50LCB0aGVuIG9ubHkgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNsYXNzIAorICogZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzIHdpbGwgTk9UIGJlIAorICogaW5jbHVkZWQuPC9wPgorICogPHA+CisgKiBJbiBvdGhlciB3b3JkcywgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMsIHRydWUpLjwvcD4KKyAqCisgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGphdmEgZWxlbWVudHMgdGhlIHNjb3BlIGlzIGxpbWl0ZWQgdG8KKyAqIEByZXR1cm4gYSBuZXcgamF2YSBzZWFyY2ggc2NvcGUKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIHN0YXRpYyBJSmF2YVNlYXJjaFNjb3BlIGNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cykgeworCXJldHVybiBjcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMsIHRydWUpOworfQorLyoqCisgKiBSZXR1cm5zIGEgamF2YSBzZWFyY2ggc2NvcGUgbGltaXRlZCB0byB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50cy4KKyAqIFRoZSBqYXZhIGVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIGEgc2VhcmNoIHdpdGggdGhpcyBzY29wZSB3aWxsCisgKiBiZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudHMuCisgKiA8cD4KKyAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSUphdmFQcm9qZWN0LCB0aGVuIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlcnMsIAorICogaXRzIGphcnMgKGV4dGVybmFsIGFuZCBpbnRlcm5hbCkgYW5kIC0gaWYgc3BlY2lmaWVkIC0gaXRzIHJlZmVyZW5jZWQgcHJvamVjdHMgCisgKiAod2l0aCB0aGVpciBzb3VyY2UgZm9sZGVycyBhbmQgamFycywgcmVjdXJzaXZlbHkpIHdpbGwgYmUgaW5jbHVkZWQuCisgKiBJZiBhbiBlbGVtZW50IGlzIGFuIElQYWNrYWdlRnJhZ21lbnRSb290LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UgZnJhZ21lbnRzIG9mIAorICogdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2lsbCBiZSBpbmNsdWRlZC4KKyAqIElmIGFuIGVsZW1lbnQgaXMgYW4gSVBhY2thZ2VGcmFnbWVudCwgdGhlbiBvbmx5IHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCBjbGFzcyAKKyAqIGZpbGVzIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCB3aWxsIGJlIGluY2x1ZGVkLiBTdWJwYWNrYWdlcyB3aWxsIE5PVCBiZSAKKyAqIGluY2x1ZGVkLgorICoKKyAqIEBwYXJhbSBlbGVtZW50cyB0aGUgamF2YSBlbGVtZW50cyB0aGUgc2NvcGUgaXMgbGltaXRlZCB0bworICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMgYSBmbGFnIGluZGljYXRpbmcgaWYgcmVmZXJlbmNlZCBwcm9qZWN0cyBtdXN0IGJlIAorICogCQkJCQkJCQkJIHJlY3Vyc2l2ZWx5IGluY2x1ZGVkCisgKiBAcmV0dXJuIGEgbmV3IGphdmEgc2VhcmNoIHNjb3BlCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBzdGF0aWMgSUphdmFTZWFyY2hTY29wZSBjcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZWRQcm9qZWN0cykgeworCUphdmFTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBKYXZhU2VhcmNoU2NvcGUoKTsKKwlIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KDIpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOworCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisJCQkJCXNjb3BlLmFkZCgoSUphdmFQcm9qZWN0KWVsZW1lbnQsIGluY2x1ZGVSZWZlcmVuY2VkUHJvamVjdHMsIHZpc2l0ZWRQcm9qZWN0cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2NvcGUuYWRkKGVsZW1lbnQpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHNjb3BlOworfQorLyoqCisgKiBSZXR1cm5zIGEgc2VhcmNoIHBhdHRlcm4gdGhhdCBjb21iaW5lcyB0aGUgZ2l2ZW4gdHdvIHBhdHRlcm5zIGludG8gYSAib3IiIHBhdHRlcm4uCisgKiBUaGUgc2VhcmNoIHJlc3VsdCB3aWxsIG1hdGNoIGVpdGhlciB0aGUgbGVmdCBwYXR0ZXJuIG9yIHRoZSByaWdodCBwYXR0ZXJuLgorICoKKyAqIEBwYXJhbSBsZWZ0UGF0dGVybiB0aGUgbGVmdCBwYXR0ZXJuCisgKiBAcGFyYW0gcmlnaHRQYXR0ZXJuIHRoZSByaWdodCBwYXR0ZXJuCisgKiBAcmV0dXJuIGEgIm9yIiBwYXR0ZXJuCisgKi8KK3B1YmxpYyBzdGF0aWMgSVNlYXJjaFBhdHRlcm4gY3JlYXRlT3JTZWFyY2hQYXR0ZXJuKElTZWFyY2hQYXR0ZXJuIGxlZnRQYXR0ZXJuLCBJU2VhcmNoUGF0dGVybiByaWdodFBhdHRlcm4pIHsKKwlyZXR1cm4gbmV3IE9yUGF0dGVybigoU2VhcmNoUGF0dGVybilsZWZ0UGF0dGVybiwgKFNlYXJjaFBhdHRlcm4pcmlnaHRQYXR0ZXJuKTsKK30KKy8qKgorICogUmV0dXJucyBhIHNlYXJjaCBwYXR0ZXJuIGJhc2VkIG9uIGEgZ2l2ZW4gc3RyaW5nIHBhdHRlcm4uIFRoZSBzdHJpbmcgcGF0dGVybnMgc3VwcG9ydCAnKicgd2lsZC1jYXJkcy4KKyAqIFRoZSByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBuYXJyb3cgZG93biB0aGUgdHlwZSBvZiBleHBlY3RlZCByZXN1bHRzLgorICoKKyAqIDxwPgorICoJRXhhbXBsZXM6CisgKgk8dWw+CisgKiAJCTxsaT5zZWFyY2ggZm9yIGNhc2UgaW5zZW5zaXRpdmUgcmVmZXJlbmNlcyB0byA8Y29kZT5PYmplY3Q8L2NvZGU+OgorICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJPYmplY3QiLCBUWVBFLCBSRUZFUkVOQ0VTLCBmYWxzZSk7PC9jb2RlPjwvbGk+CisgKiAgCTxsaT5zZWFyY2ggZm9yIGNhc2Ugc2Vuc2l0aXZlIHJlZmVyZW5jZXMgdG8gZXhhY3QgPGNvZGU+T2JqZWN0KCk8L2NvZGU+IGNvbnN0cnVjdG9yOgorICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuT2JqZWN0KCkiLCBDT05TVFJVQ1RPUiwgUkVGRVJFTkNFUywgdHJ1ZSk7PC9jb2RlPjwvbGk+CisgKiAgCTxsaT5zZWFyY2ggZm9yIGltcGxlbWVudGVycyBvZiA8Y29kZT5qYXZhLmxhbmcuUnVubmFibGU8L2NvZGU+OgorICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuUnVubmFibGUiLCBUWVBFLCBJTVBMRU1FTlRPUlMsIHRydWUpOzwvY29kZT48L2xpPgorICogIDwvdWw+CisgKiBAcGFyYW0gc2VhcmNoRm9yIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgc2VhcmNoZWQgZWxlbWVudHMKKyAqCTx1bD4KKyAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTPC9jb2RlPjogb25seSBsb29rIGZvciBjbGFzc2VzPC9saT4KKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFPC9jb2RlPjogb25seSBsb29rIGZvciBpbnRlcmZhY2VzPC9saT4KKyAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEU8L2NvZGU+OiBsb29rIGZvciBib3RoIGNsYXNzZXMgYW5kIGludGVyZmFjZXM8L2xpPgorICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5GSUVMRDwvY29kZT46IGxvb2sgZm9yIGZpZWxkczwvbGk+CisgKgkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLk1FVEhPRDwvY29kZT46IGxvb2sgZm9yIG1ldGhvZHM8L2xpPgorICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DT05TVFJVQ1RPUjwvY29kZT46IGxvb2sgZm9yIGNvbnN0cnVjdG9yczwvbGk+CisgKgkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLlBBQ0tBR0U8L2NvZGU+OiBsb29rIGZvciBwYWNrYWdlczwvbGk+CisgKgk8L3VsPgorICogQHBhcmFtIGxpbWl0VG8gZGV0ZXJtaW5lcyB0aGUgbmF0dXJlIG9mIHRoZSBleHBlY3RlZCBtYXRjaGVzCisgKgk8dWw+CisgKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlM8L2NvZGU+OiB3aWxsIHNlYXJjaCBkZWNsYXJhdGlvbnMgbWF0Y2hpbmcgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICogCQkJZWxlbWVudC4gSW4gY2FzZSB0aGUgZWxlbWVudCBpcyBhIG1ldGhvZCwgZGVjbGFyYXRpb25zIG9mIG1hdGNoaW5nIG1ldGhvZHMgaW4gc3VidHlwZXMgd2lsbCBhbHNvCisgKiAgCQliZSBmb3VuZCwgYWxsb3dpbmcgdG8gZmluZCBkZWNsYXJhdGlvbnMgb2YgYWJzdHJhY3QgbWV0aG9kcywgZXRjLjwvbGk+CisgKgorICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUzwvY29kZT46IHdpbGwgc2VhcmNoIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQuPC9saT4KKyAqCisgKgkJIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVM8L2NvZGU+OiB3aWxsIHNlYXJjaCBmb3IgZWl0aGVyIGRlY2xhcmF0aW9ucyBvciByZWZlcmVuY2VzIGFzIHNwZWNpZmllZAorICogIAkJYWJvdmUuPC9saT4KKyAqCisgKgkJIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlM8L2NvZGU+OiBmb3IgaW50ZXJmYWNlLCB3aWxsIGZpbmQgYWxsIHR5cGVzIHdoaWNoIGltcGxlbWVudHMgYSBnaXZlbiBpbnRlcmZhY2UuPC9saT4KKyAqCTwvdWw+CisgKgorICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VhcmNoIGlzIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4KKyAqIEByZXR1cm4gYSBzZWFyY2ggcGF0dGVybiBvbiB0aGUgZ2l2ZW4gc3RyaW5nIHBhdHRlcm4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHJpbmcgcGF0dGVybiBpcyBpbGwtZm9ybWVkLgorICovCitwdWJsaWMgc3RhdGljIElTZWFyY2hQYXR0ZXJuIGNyZWF0ZVNlYXJjaFBhdHRlcm4oU3RyaW5nIHN0cmluZ1BhdHRlcm4sIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJcmV0dXJuIFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihzdHJpbmdQYXR0ZXJuLCBzZWFyY2hGb3IsIGxpbWl0VG8sIElKYXZhU2VhcmNoQ29uc3RhbnRzLlBBVFRFUk5fTUFUQ0gsIGlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiBiYXNlZCBvbiBhIGdpdmVuIEphdmEgZWxlbWVudC4gCisgKiBUaGUgcGF0dGVybiBpcyB1c2VkIHRvIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIHNlYXJjaCwgYW5kIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGFzIGZvbGxvd3M6CisgKgorICogQHBhcmFtIGVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB0aGUgc2VhcmNoIHBhdHRlcm4gaXMgYmFzZWQgb24KKyAqIEBwYXJhbSBsaW1pdFRvIGRldGVybWluZXMgdGhlIG5hdHVyZSBvZiB0aGUgZXhwZWN0ZWQgbWF0Y2hlcworICogCTx1bD4KKyAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUzwvY29kZT46IHdpbGwgc2VhcmNoIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgKiAJCQllbGVtZW50LiBJbiBjYXNlIHRoZSBlbGVtZW50IGlzIGEgbWV0aG9kLCBkZWNsYXJhdGlvbnMgb2YgbWF0Y2hpbmcgbWV0aG9kcyBpbiBzdWJ0eXBlcyB3aWxsIGFsc28KKyAqICAJCWJlIGZvdW5kLCBhbGxvd2luZyB0byBmaW5kIGRlY2xhcmF0aW9ucyBvZiBhYnN0cmFjdCBtZXRob2RzLCBldGMuCisgKgorICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUzwvY29kZT46IHdpbGwgc2VhcmNoIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCisgKgorICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTPC9jb2RlPjogd2lsbCBzZWFyY2ggZm9yIGVpdGhlciBkZWNsYXJhdGlvbnMgb3IgcmVmZXJlbmNlcyBhcyBzcGVjaWZpZWQKKyAqICAJCWFib3ZlLgorICoKKyAqCQkgPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUzwvY29kZT46IGZvciBpbnRlcmZhY2UsIHdpbGwgZmluZCBhbGwgdHlwZXMgd2hpY2ggaW1wbGVtZW50cyBhIGdpdmVuIGludGVyZmFjZS4KKyAqCTwvdWw+CisgKiBAcmV0dXJuIGEgc2VhcmNoIHBhdHRlcm4gZm9yIGEgamF2YSBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGlsbC1mb3JtZWQKKyAqLworcHVibGljIHN0YXRpYyBJU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgbGltaXRUbykgeworCisJcmV0dXJuIFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihlbGVtZW50LCBsaW1pdFRvKTsKK30KKy8qKgorICogUmV0dXJucyBhIGphdmEgc2VhcmNoIHNjb3BlIHdpdGggdGhlIHdvcmtzcGFjZSBhcyB0aGUgb25seSBsaW1pdC4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IHdvcmtzcGFjZSBzY29wZQorICovCitwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlV29ya3NwYWNlU2NvcGUoKSB7CisJcmV0dXJuIG5ldyBKYXZhV29ya3NwYWNlU2NvcGUoKTsKK30KKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqLworcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgeworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKChJTWVtYmVyKWVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQlpZiAoY3UgIT0gbnVsbCkgeworCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgeworCQkJCXJldHVybiBjdS5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGN1LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJfQorCQl9IAorCX0gCisJcmV0dXJuIGVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdXNlZCB0byBkbyB0aGUgc2VhcmNoIG9uIHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQuCisgKi8KK3ByaXZhdGUgSVdvcmtpbmdDb3B5W10gZ2V0V29ya2luZ0NvcGllcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgeworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKChJTWVtYmVyKWVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLndvcmtpbmdDb3BpZXMgPT0gbnVsbCA/IDAgOiB0aGlzLndvcmtpbmdDb3BpZXMubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQlJV29ya2luZ0NvcHlbXSBuZXdXb3JraW5nQ29waWVzID0gbmV3IElXb3JraW5nQ29weVtsZW5ndGgrMV07CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLndvcmtpbmdDb3BpZXMsIDAsIG5ld1dvcmtpbmdDb3BpZXMsIDAsIGxlbmd0aCk7CisJCQkJbmV3V29ya2luZ0NvcGllc1tsZW5ndGhdID0gY3U7CisJCQkJcmV0dXJuIG5ld1dvcmtpbmdDb3BpZXM7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBuZXcgSVdvcmtpbmdDb3B5W10ge2N1fTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdGhpcy53b3JraW5nQ29waWVzOworfQorLyoqCisgKiBTZWFyY2hlcyBmb3IgdGhlIEphdmEgZWxlbWVudCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUKKyAqIGNhbiBiZSBpbmNvbXBsZXRlLiBGb3IgZXhhbXBsZSwgYSBjYWxsIGxpa2UgCisgKiA8Y29kZT5zZWFyY2god3MsICJydW4oKSIsIE1FVEhPRCxSRUZFUkVOQ0VTLCBjb2wpPC9jb2RlPgorICogc2VhcmNoZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBtZXRob2QgPGNvZGU+cnVuPC9jb2RlPi4KKyAqCisgKiBOb3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgcGF0dGVybiB3aWxsIGJlIGNhc2UgaW5zZW5zaXRpdmUuIEZvciBzcGVjaWZ5aW5nIGNhc2UgcworICogc2Vuc2l0aXZlIHNlYXJjaCwgdXNlIDxjb2RlPnNlYXJjaCh3b3Jrc3BhY2UsIGNyZWF0ZVNlYXJjaFBhdHRlcm4ocGF0dGVyblN0cmluZywgc2VhcmNoRm9yLCBsaW1pdFRvLCB0cnVlKSwgc2NvcGUsIHJlc3VsdENvbGxlY3Rvcik7PC9jb2RlPgorICogCisgKiBAcGFyYW0gd29ya3NwYWNlIHRoZSB3b3Jrc3BhY2UKKyAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIGJlIHNlYXJjaGVkIGZvcgorICogQHBhcmFtIHNlYXJjaEZvciBhIGhpbnQgd2hhdCBraW5kIG9mIEphdmEgZWxlbWVudCB0aGUgc3RyaW5nIHBhdHRlcm4gcmVwcmVzZW50cy4KKyAqICBMb29rIGludG8gPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHM8L2NvZGU+IGZvciB2YWxpZCB2YWx1ZXMKKyAqIEBwYXJhbSBsaW1pdFRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqCTx1bD4KKyAqCSAgPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUzwvY29kZT46IHNlYXJjaCAKKyAqCQkgIGZvciBkZWNsYXJhdGlvbnMgb25seSA8L2xpPgorICoJICA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUzwvY29kZT46IHNlYXJjaCAKKyAqCQkgIGZvciBhbGwgcmVmZXJlbmNlcyA8L2xpPgorICoJICA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSRU5DRVM8L2NvZGU+OiBzZWFyY2ggCisgKgkJICBmb3IgYm90aCBkZWNsYXJhdGlvbnMgYW5kIGFsbCByZWZlcmVuY2VzIDwvbGk+CisgKgkgIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlM8L2NvZGU+OiBzZWFyY2ggZm9yCisgKgkJICBhbGwgaW1wbGVtZW50b3JzIG9mIGFuIGludGVyZmFjZTsgdGhlIHZhbHVlIGlzIG9ubHkgdmFsaWQgaWYKKyAqCQkgIHRoZSBKYXZhIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UKKyAqIAk8L3VsPgorICogQHBhcmFtIHNjb3BlIHRoZSBzZWFyY2ggcmVzdWx0IGhhcyB0byBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzY29wZQorICogQHBhcmFtIHJlc3VsdENvbGxlY3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCSAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CisgKgk8dWw+CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgk8L3VsPgorICovCitwdWJsaWMgdm9pZCBzZWFyY2goSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCXNlYXJjaCh3b3Jrc3BhY2UsIGNyZWF0ZVNlYXJjaFBhdHRlcm4ocGF0dGVyblN0cmluZywgc2VhcmNoRm9yLCBsaW1pdFRvLCB0cnVlKSwgc2NvcGUsIHJlc3VsdENvbGxlY3Rvcik7Cit9CisvKioKKyAqIFNlYXJjaGVzIGZvciB0aGUgZ2l2ZW4gSmF2YSBlbGVtZW50LgorICoKKyAqIEBwYXJhbSB3b3Jrc3BhY2UgdGhlIHdvcmtzcGFjZQorICogQHBhcmFtIGVsZW1lbnQgdGhlIEphdmEgZWxlbWVudCB0byBiZSBzZWFyY2hlZCBmb3IKKyAqIEBwYXJhbSBsaW1pdFRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqCTx1bD4KKyAqCSAgPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUzwvY29kZT46IHNlYXJjaCAKKyAqCQkgIGZvciBkZWNsYXJhdGlvbnMgb25seSA8L2xpPgorICoJICA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUzwvY29kZT46IHNlYXJjaCAKKyAqCQkgIGZvciBhbGwgcmVmZXJlbmNlcyA8L2xpPgorICoJICA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSRU5DRVM8L2NvZGU+OiBzZWFyY2ggCisgKgkJICBmb3IgYm90aCBkZWNsYXJhdGlvbnMgYW5kIGFsbCByZWZlcmVuY2VzIDwvbGk+CisgKgkgIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlM8L2NvZGU+OiBzZWFyY2ggZm9yCisgKgkJICBhbGwgaW1wbGVtZW50b3JzIG9mIGFuIGludGVyZmFjZTsgdGhlIHZhbHVlIGlzIG9ubHkgdmFsaWQgaWYKKyAqCQkgIHRoZSBKYXZhIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UKKyAqIAk8L3VsPgorICogQHBhcmFtIHNjb3BlIHRoZSBzZWFyY2ggcmVzdWx0IGhhcyB0byBiZSBsaW1pdGVkIHRvIHRoZSBnaXZlbiBzY29wZQorICogQHBhcmFtIHJlc3VsdENvbGxlY3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgorICoJPHVsPgorICoJCTxsaT50aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgk8L3VsPgorICovCitwdWJsaWMgdm9pZCBzZWFyY2goSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgbGltaXRUbywgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCXNlYXJjaCh3b3Jrc3BhY2UsIGNyZWF0ZVNlYXJjaFBhdHRlcm4oZWxlbWVudCwgbGltaXRUbyksIHNjb3BlLCByZXN1bHRDb2xsZWN0b3IpOworfQorLyoqCisgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBwYXR0ZXJuLiBTZWFyY2ggcGF0dGVybnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgaGVscGVyCisgKiBtZXRob2RzIChmcm9tIGEgU3RyaW5nIHBhdHRlcm4gb3IgYSBKYXZhIGVsZW1lbnQpIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcworICogYmVpbmcgc2VhcmNoZWQgKGUuZy4gc2VhcmNoIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkpLgorICoKKyAqIEBwYXJhbSB3b3Jrc3BhY2UgdGhlIHdvcmtzcGFjZQorICogQHBhcmFtIHNlYXJjaFBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gYmUgc2VhcmNoZWQgZm9yCisgKiBAcGFyYW0gc2NvcGUgdGhlIHNlYXJjaCByZXN1bHQgaGFzIHRvIGJlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHNjb3BlCisgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CisgKgk8dWw+CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgk8L3VsPgorICovCitwdWJsaWMgdm9pZCBzZWFyY2goSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCisJaWYgKFZFUkJPU0UpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2hpbmcgZm9yICIgKyBzZWFyY2hQYXR0ZXJuICsgIiBpbiAiICsgc2NvcGUpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCX0KKworCS8qIHNlYXJjaCBpcyBzdGFydGluZyAqLworCXJlc3VsdENvbGxlY3Rvci5hYm91dFRvU3RhcnQoKTsKKworCXRyeSB7CQorCQlpZiAoc2VhcmNoUGF0dGVybiA9PSBudWxsKSByZXR1cm47CisKKwkJLyogaW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yICovCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpOworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJlbmdpbmUuc2VhcmNoaW5nIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8qIGluZGV4IHNlYXJjaCAqLworCQlQYXRoQ29sbGVjdG9yIHBhdGhDb2xsZWN0b3IgPSBuZXcgUGF0aENvbGxlY3RvcigpOworCisJCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSAoKEphdmFNb2RlbE1hbmFnZXIpSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkpCisJCQkJCQkJCQkJLmdldEluZGV4TWFuYWdlcigpOworCQlpbnQgZGV0YWlsTGV2ZWwgPSBJSW5mb0NvbnN0YW50cy5QYXRoSW5mbyB8IElJbmZvQ29uc3RhbnRzLlBvc2l0aW9uSW5mbzsKKwkJTWF0Y2hMb2NhdG9yIG1hdGNoTG9jYXRvciA9IG5ldyBNYXRjaExvY2F0b3IoKFNlYXJjaFBhdHRlcm4pc2VhcmNoUGF0dGVybiwgZGV0YWlsTGV2ZWwsIHJlc3VsdENvbGxlY3Rvciwgc2NvcGUpOworCisJCWluZGV4TWFuYWdlci5wZXJmb3JtQ29uY3VycmVudEpvYigKKwkJCW5ldyBQYXR0ZXJuU2VhcmNoSm9iKAorCQkJCShTZWFyY2hQYXR0ZXJuKXNlYXJjaFBhdHRlcm4sIAorCQkJCXNjb3BlLCAKKwkJCQlkZXRhaWxMZXZlbCwgCisJCQkJcGF0aENvbGxlY3RvciwgCisJCQkJaW5kZXhNYW5hZ2VyKSwKKwkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILAorCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDUpKTsKKwkJCQorCQkvKiBlbGltaW5hdGluZyBmYWxzZSBtYXRjaGVzIGFuZCBsb2NhdGluZyB0aGVtICovCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJbWF0Y2hMb2NhdG9yLmxvY2F0ZU1hdGNoZXMoCisJCQlwYXRoQ29sbGVjdG9yLmdldFBhdGhzKCksIAorCQkJd29ya3NwYWNlLAorCQkJdGhpcy53b3JraW5nQ29waWVzLAorCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDk1KQorCQkpOworCQkKKworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQorCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CisJCX0KKworCQltYXRjaExvY2F0b3IubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyh3b3Jrc3BhY2UpOworCX0gZmluYWxseSB7CisJCS8qIHNlYXJjaCBoYXMgZW5kZWQgKi8KKwkJcmVzdWx0Q29sbGVjdG9yLmRvbmUoKTsKKwl9Cit9CisvKioKKyAqIFNlYXJjaGVzIGZvciBhbGwgdG9wLWxldmVsIHR5cGVzIGFuZCBtZW1iZXIgdHlwZXMgaW4gdGhlIGdpdmVuIHNjb3BlLgorICogVGhlIHNlYXJjaCBjYW4gYmUgc2VsZWN0aW5nIHNwZWNpZmljIHR5cGVzIChnaXZlbiBhIHBhY2thZ2Ugb3IgYSB0eXBlIG5hbWUKKyAqIHByZWZpeCBhbmQgbWF0Y2ggbW9kZXMpLiAKKyAqIAorICogQHBhcmFtIHdvcmtzcGFjZSB0aGUgd29ya3NwYWNlIHRvIHNlYXJjaCBpbgorICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHBhY2thZ2Ugb2YgdGhlIHNlYXJjaGVkIHR5cGVzLCBvciBhIHByZWZpeCBmb3IgdGhpcworICoJCQkJCQlwYWNrYWdlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyBwYWNrYWdlLgorICogQHBhcmFtIHR5cGVOYW1lIHRoZSBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWFyY2hlZCB0eXBlICh0aGUgcXVhbGlmaWNhdGlvbiBpbmNsdWRlCisgKgkJCQkJdGhlIGVuY2xvc2luZyB0eXBlcyBpZiB0aGUgc2VhcmNoZWQgdHlwZSBpcyBhIG1lbWJlciB0eXBlKSwgb3IgYSBwcmVmaXgKKyAqCQkJCQlmb3IgdGhpcyB0eXBlLCBvciBhIHdpbGQtY2FyZGVkIHN0cmluZyBmb3IgdGhpcyB0eXBlLgorICogQHBhcmFtIG1hdGNoTW9kZSBvbmUgb2YKKyAqIDx1bD4KKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuRVhBQ1RfTUFUQ0g8L2NvZGU+IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBhcmUgdGhlIGZ1bGwgbmFtZXMKKyAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLgorICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5QUkVGSVhfTUFUQ0g8L2NvZGU+IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzCisgKgkJCW9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUEFUVEVSTl9NQVRDSDwvY29kZT4gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy4KKyAqIDwvdWw+CisgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHdoZXRoZXIgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKKyAqIEBwYXJhbSBzZWFyY2hGb3Igb25lIG9mCisgKiA8dWw+CisgKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT4gaWYgc2VhcmNoaW5nIGZvciBjbGFzc2VzIG9ubHkKKyAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4gaWYgc2VhcmNoaW5nIGZvciBpbnRlcmZhY2VzIG9ubHkKKyAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEU8L2NvZGU+IGlmIHNlYXJjaGluZyBmb3IgYm90aCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgKiA8L3VsPgorICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSB0byBzZWFyY2ggaW4KKyAqIEBwYXJhbSBuYW1lUmVxdWVzdG9yIHRoZSByZXF1ZXN0b3IgdGhhdCBjb2xsZWN0cyB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoCisgKiBAcGFyYW0gd2FpdGluZ1BvbGljeSBvbmUgb2YKKyAqIDx1bD4KKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuRk9SQ0VfSU1NRURJQVRFX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkKKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0g8L2NvZGU+IGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhbmNlbGxlZCBpZiB0aGUKKyAqCQkJdW5kZXJseWluZyBpbmRleGVyIGhhcyBub3QgZmluaXNoZWQgaW5kZXhpbmcgdGhlIHdvcmtzcGFjZQorICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgd2FpdCBmb3IgdGhlCisgKgkJCXVuZGVybHlpbmcgaW5kZXhlciB0byBmaW5pc2ggaW5kZXhpbmcgdGhlIHdvcmtzcGFjZQorICogPC91bD4KKyAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcworICoJCQkJCQkJbW9uaXRvciBpcyBwcm92aWRlZAorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmYWlsZWQuIFJlYXNvbnMgaW5jbHVkZToKKyAqCTx1bD4KKyAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqCTwvdWw+CisgKi8KK3B1YmxpYyB2b2lkIHNlYXJjaEFsbFR5cGVOYW1lcygKKwlJV29ya3NwYWNlIHdvcmtzcGFjZSwKKwljaGFyW10gcGFja2FnZU5hbWUsIAorCWNoYXJbXSB0eXBlTmFtZSwKKwlpbnQgbWF0Y2hNb2RlLCAKKwlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwKKwlpbnQgc2VhcmNoRm9yLCAKKwlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCAKKwlmaW5hbCBJVHlwZU5hbWVSZXF1ZXN0b3IgbmFtZVJlcXVlc3RvciwKKwlpbnQgd2FpdGluZ1BvbGljeSwKKwlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9ICgoSmF2YU1vZGVsTWFuYWdlcilKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCQorCWNoYXIgY2xhc3NPckludGVyZmFjZTsKKwlzd2l0Y2goc2VhcmNoRm9yKXsKKwkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyA6CisJCQljbGFzc09ySW50ZXJmYWNlID0gSUluZGV4Q29uc3RhbnRzLkNMQVNTX1NVRkZJWDsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRSA6CisJCQljbGFzc09ySW50ZXJmYWNlID0gSUluZGV4Q29uc3RhbnRzLklOVEVSRkFDRV9TVUZGSVg7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6IAorCQkJY2xhc3NPckludGVyZmFjZSA9IElJbmRleENvbnN0YW50cy5UWVBFX1NVRkZJWDsKKwkJCWJyZWFrOworCX0KKwlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKKwkJcGFja2FnZU5hbWUsCisJCW51bGwsIC8vIGRvIGZpbmQgbWVtYmVyIHR5cGVzCisJCXR5cGVOYW1lLAorCQljbGFzc09ySW50ZXJmYWNlLAorCQltYXRjaE1vZGUsIAorCQlpc0Nhc2VTZW5zaXRpdmUpOworCQorCUlJbmRleFNlYXJjaFJlcXVlc3RvciBzZWFyY2hSZXF1ZXN0b3IgPSBuZXcgSW5kZXhTZWFyY2hBZGFwdGVyKCl7CisJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXSBwYWNrYWdlTmFtZSkgeworCQkJaWYgKGVuY2xvc2luZ1R5cGVOYW1lcyAhPSBJSW5kZXhDb25zdGFudHMuT05FX1pFUk9fQ0hBUikgeyAvLyBmaWx0ZXIgb3V0IGxvY2FsIGFuZCBhbm9ueW1vdXMgY2xhc3NlcworCQkJCW5hbWVSZXF1ZXN0b3IuYWNjZXB0Q2xhc3MocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHJlc291cmNlUGF0aCk7CisJCQl9CisJCX0JCQorCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IElJbmRleENvbnN0YW50cy5PTkVfWkVST19DSEFSKSB7IC8vIGZpbHRlciBvdXQgbG9jYWwgYW5kIGFub255bW91cyBjbGFzc2VzCisJCQkJbmFtZVJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHJlc291cmNlUGF0aCk7CisJCQl9CisJCX0JCQorCX07CisKKwl0cnkgeworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJlbmdpbmUuc2VhcmNoaW5nIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpbmRleE1hbmFnZXIucGVyZm9ybUNvbmN1cnJlbnRKb2IoCisJCQluZXcgUGF0dGVyblNlYXJjaEpvYihwYXR0ZXJuLCBzY29wZSwgSUluZm9Db25zdGFudHMuTmFtZUluZm8gfCBJSW5mb0NvbnN0YW50cy5QYXRoSW5mbywgc2VhcmNoUmVxdWVzdG9yLCBpbmRleE1hbmFnZXIpLAorCQkJd2FpdGluZ1BvbGljeSwKKwkJCXByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxMDApKTsJCisJfSBmaW5hbGx5IHsKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOworCQl9CisJfQorfQorLyoqCisgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZmllbGRzIGFjY2Vzc2VkIGluIHRoZSBnaXZlbiBlbGVtZW50LgorICogVGhlIGVsZW1lbnQgY2FuIGJlIGEgY29tcGlsYXRpb24gdW5pdCwgYSB0eXBlLCBvciBhIG1ldGhvZC4KKyAqIFJlcG9ydHMgdGhlIGZpZWxkIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gY29sbGVjdG9yLgorICogPHA+CisgKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGNvZGU6CisgKiA8Y29kZT4KKyAqIDxwcmU+CisgKgkJY2xhc3MgQSB7CisgKgkJCWludCBmaWVsZDE7CisgKgkJfQorICoJCWNsYXNzIEIgZXh0ZW5kcyBBIHsKKyAqCQkJU3RyaW5nIHZhbHVlOworICoJCX0KKyAqCQljbGFzcyBYIHsKKyAqCQkJdm9pZCB0ZXN0KCkgeworICoJCQkJQiBiID0gbmV3IEIoKTsKKyAqCQkJCVN5c3RlbS5vdXQucHJpbnRsbihiLnZhbHVlICsgYi5maWVsZDEpOworICoJCQl9OworICoJCX0KKyAqIDwvcHJlPgorICogPC9jb2RlPgorICogdGhlbiBzZWFyY2hpbmcgZm9yIGRlY2xhcmF0aW9ucyBvZiBhY2Nlc3NlZCBmaWVsZHMgaW4gbWV0aG9kIAorICogPGNvZGU+WC50ZXN0KCk8L2NvZGU+IHdvdWxkIGNvbGxlY3QgdGhlIGZpZWxkcworICogPGNvZGU+Qi52YWx1ZTwvY29kZT4gYW5kIDxjb2RlPkEuZmllbGQxPC9jb2RlPi4KKyAqIDwvcD4KKyAqCisgKiBAcGFyYW0gd29ya3NwYWNlIHRoZSB3b3Jrc3BhY2UKKyAqIEBwYXJhbSBlbmNsb3NpbmdFbGVtZW50IHRoZSBtZXRob2QsIHR5cGUsIG9yIGNvbXBpbGF0aW9uIHVuaXQgdG8gYmUgc2VhcmNoZWQgaW4KKyAqIEBwYXJhbSByZXN1bHRDb2xsZWN0b3IgYSBjYWxsYmFjayBvYmplY3QgdG8gd2hpY2ggZWFjaCBtYXRjaCBpcyByZXBvcnRlZAorICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmYWlsZWQuIFJlYXNvbnMgaW5jbHVkZToKKyAqCTx1bD4KKyAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdAorICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldAorICoJPC91bD4KKyAqLwkKK3B1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mQWNjZXNzZWRGaWVsZHMoSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBEZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHNQYXR0ZXJuKGVuY2xvc2luZ0VsZW1lbnQpOworCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBjcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtlbmNsb3NpbmdFbGVtZW50fSk7CisJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZShlbmNsb3NpbmdFbGVtZW50KTsKKwlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQlpZiAoVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWFyY2hpbmcgZm9yICIgKyBwYXR0ZXJuICsgIiBpbiAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKwkJTWF0Y2hMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTWF0Y2hMb2NhdG9yKAorCQkJcGF0dGVybiwKKwkJCUlJbmZvQ29uc3RhbnRzLkRlY2xhcmF0aW9uSW5mbywKKwkJCXJlc3VsdENvbGxlY3RvciwKKwkJCXNjb3BlKTsKKwkJbG9jYXRvci5sb2NhdGVNYXRjaGVzKAorCQkJbmV3IFN0cmluZ1tdIHtyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9LCAKKwkJCXdvcmtzcGFjZSwKKwkJCXRoaXMuZ2V0V29ya2luZ0NvcGllcyhlbmNsb3NpbmdFbGVtZW50KSwKKwkJCXJlc3VsdENvbGxlY3Rvci5nZXRQcm9ncmVzc01vbml0b3IoKSk7CisJfSBlbHNlIHsKKwkJc2VhcmNoKHdvcmtzcGFjZSwgcGF0dGVybiwgc2NvcGUsIHJlc3VsdENvbGxlY3Rvcik7CisJfQorfQorLyoqCisgKiBTZWFyY2hlcyBmb3IgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgdHlwZXMgcmVmZXJlbmNlZCBpbiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQsIGEgdHlwZSwgb3IgYSBtZXRob2QuCisgKiBSZXBvcnRzIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyB1c2luZyB0aGUgZ2l2ZW4gY29sbGVjdG9yLgorICogPHA+CisgKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGNvZGU6CisgKiA8Y29kZT4KKyAqIDxwcmU+CisgKgkJY2xhc3MgQSB7CisgKgkJfQorICoJCWNsYXNzIEIgZXh0ZW5kcyBBIHsKKyAqCQl9CisgKgkJaW50ZXJmYWNlIEkgeworICoJCSAgaW50IFZBTFVFID0gMDsKKyAqCQl9CisgKgkJY2xhc3MgWCB7CisgKgkJCXZvaWQgdGVzdCgpIHsKKyAqCQkJCUIgYiA9IG5ldyBCKCk7CisgKgkJCQl0aGlzLmZvbyhiLCBJLlZBTFVFKTsKKyAqCQkJfTsKKyAqCQl9CisgKiA8L3ByZT4KKyAqIDxjb2RlPgorICogdGhlbiBzZWFyY2hpbmcgZm9yIGRlY2xhcmF0aW9ucyBvZiByZWZlcmVuY2VkIHR5cGVzIGluIG1ldGhvZCA8Y29kZT5YLnRlc3QoKTwvY29kZT4KKyAqIHdvdWxkIGNvbGxlY3QgdGhlIGNsYXNzIDxjb2RlPkI8L2NvZGU+IGFuZCB0aGUgaW50ZXJmYWNlIDxjb2RlPkk8L2NvZGU+LgorICogPC9wPgorICoKKyAqIEBwYXJhbSB3b3Jrc3BhY2UgdGhlIHdvcmtzcGFjZQorICogQHBhcmFtIGVuY2xvc2luZ0VsZW1lbnQgdGhlIG1ldGhvZCwgdHlwZSwgb3IgY29tcGlsYXRpb24gdW5pdCB0byBiZSBzZWFyY2hlZCBpbgorICogQHBhcmFtIHJlc3VsdENvbGxlY3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgorICoJPHVsPgorICoJCTxsaT50aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgk8L3VsPgorICovCQorcHVibGljIHZvaWQgc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybihlbmNsb3NpbmdFbGVtZW50KTsKKwlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7ZW5jbG9zaW5nRWxlbWVudH0pOworCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoZW5jbG9zaW5nRWxlbWVudCk7CisJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJaWYgKFZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvciAiICsgcGF0dGVybiArICIgaW4gIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQl9CisJCU1hdGNoTG9jYXRvciBsb2NhdG9yID0gbmV3IE1hdGNoTG9jYXRvcigKKwkJCXBhdHRlcm4sCisJCQlJSW5mb0NvbnN0YW50cy5EZWNsYXJhdGlvbkluZm8sCisJCQlyZXN1bHRDb2xsZWN0b3IsCisJCQlzY29wZSk7CisJCWxvY2F0b3IubG9jYXRlTWF0Y2hlcygKKwkJCW5ldyBTdHJpbmdbXSB7cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSwgCisJCQl3b3Jrc3BhY2UsCisJCQl0aGlzLmdldFdvcmtpbmdDb3BpZXMoZW5jbG9zaW5nRWxlbWVudCksCisJCQlyZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOworCX0gZWxzZSB7CisJCXNlYXJjaCh3b3Jrc3BhY2UsIHBhdHRlcm4sIHNjb3BlLCByZXN1bHRDb2xsZWN0b3IpOworCX0KK30KKy8qKgorICogU2VhcmNoZXMgZm9yIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIG1ldGhvZHMgaW52b2tlZCBpbiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqIFRoZSBlbGVtZW50IGNhbiBiZSBhIGNvbXBpbGF0aW9uIHVuaXQsIGEgdHlwZSwgb3IgYSBtZXRob2QuCisgKiBSZXBvcnRzIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zIHVzaW5nIHRoZSBnaXZlbiBjb2xsZWN0b3IuCisgKiA8cD4KKyAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIDxjb2RlPgorICogPHByZT4KKyAqCQljbGFzcyBBIHsKKyAqCQkJdm9pZCBmb28oKSB7fTsKKyAqCQkJdm9pZCBiYXIoKSB7fTsKKyAqCQl9CisgKgkJY2xhc3MgQiBleHRlbmRzIEEgeworICoJCQl2b2lkIGZvbygpIHt9OworICoJCX0KKyAqCQljbGFzcyBYIHsKKyAqCQkJdm9pZCB0ZXN0KCkgeworICoJCQkJQSBhID0gbmV3IEIoKTsKKyAqCQkJCWEuZm9vKCk7CisgKgkJCQlCIGIgPSAoQilhOworICoJCQkJYi5iYXIoKTsKKyAqCQkJfTsKKyAqCQl9CisgKiA8L3ByZT4KKyAqIDwvY29kZT4KKyAqIHRoZW4gc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbnMgb2Ygc2VudCBtZXNzYWdlcyBpbiBtZXRob2QgCisgKiA8Y29kZT5YLnRlc3QoKTwvY29kZT4gd291bGQgY29sbGVjdCB0aGUgbWV0aG9kcworICogPGNvZGU+QS5mb28oKTwvY29kZT4sIDxjb2RlPkIuZm9vKCk8L2NvZGU+LCBhbmQgPGNvZGU+QS5iYXIoKTwvY29kZT4uCisgKiA8L3A+CisgKgorICogQHBhcmFtIHdvcmtzcGFjZSB0aGUgd29ya3NwYWNlCisgKiBAcGFyYW0gZW5jbG9zaW5nRWxlbWVudCB0aGUgbWV0aG9kLCB0eXBlLCBvciBjb21waWxhdGlvbiB1bml0IHRvIGJlIHNlYXJjaGVkIGluCisgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CisgKgk8dWw+CisgKgkJPGxpPnRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKKyAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqCTwvdWw+CisgKi8JCitwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcyhJV29ya3NwYWNlIHdvcmtzcGFjZSwgSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4oZW5jbG9zaW5nRWxlbWVudCk7CisJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IGNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge2VuY2xvc2luZ0VsZW1lbnR9KTsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldFJlc291cmNlKGVuY2xvc2luZ0VsZW1lbnQpOworCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCWlmIChWRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaGluZyBmb3IgIiArIHBhdHRlcm4gKyAiIGluICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJfQorCQlNYXRjaExvY2F0b3IgbG9jYXRvciA9IG5ldyBNYXRjaExvY2F0b3IoCisJCQlwYXR0ZXJuLAorCQkJSUluZm9Db25zdGFudHMuRGVjbGFyYXRpb25JbmZvLAorCQkJcmVzdWx0Q29sbGVjdG9yLAorCQkJc2NvcGUpOworCQlsb2NhdG9yLmxvY2F0ZU1hdGNoZXMoCisJCQluZXcgU3RyaW5nW10ge3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0sIAorCQkJd29ya3NwYWNlLAorCQkJdGhpcy5nZXRXb3JraW5nQ29waWVzKGVuY2xvc2luZ0VsZW1lbnQpLAorCQkJcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpKTsKKwl9IGVsc2UgeworCQlzZWFyY2god29ya3NwYWNlLCBwYXR0ZXJuLCBzY29wZSwgcmVzdWx0Q29sbGVjdG9yKTsKKwl9Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvcGFja2FnZS5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3YmViMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MyBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorUHJvdmlkZXMgc3VwcG9ydCBmb3Igc2VhcmNoaW5nIHRoZSB3b3Jrc3BhY2UgSmF2YQorZWxlbWVudHMgdGhhdCBtYXRjaCBhIHBhcnRpY3VsYXIgZGVzY3JpcHRpb24uCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHNlYXJjaGluZyB0aGUgd29ya3NwYWNlIEphdmEgZWxlbWVudHMKK3RoYXQgbWF0Y2ggYSBwYXJ0aWN1bGFyIGRlc2NyaXB0aW9uLiBJbiBwYXJ0aWN1bGFyLCBpdCBwcm92aWRlcyBhIHNlYXJjaAorZW5naW5lIHdpdGggYSBzZXQgb2Ygc2VhcmNoIHBhdHRlcm5zIGFuZCBzZWFyY2ggcmVzdWx0IHJlcXVlc3RvcnMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRG9jdW1lbnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwYTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9Eb2N1bWVudEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuRmlsZURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSUZpbGVEb2N1bWVudDsKKworcHVibGljIGNsYXNzIERvY3VtZW50RmFjdG9yeSB7CisKKwlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBuZXdEb2N1bWVudChGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIG5ldyBGaWxlRG9jdW1lbnQoZmlsZSk7CisJfQorCXB1YmxpYyBzdGF0aWMgSURvY3VtZW50IG5ld0RvY3VtZW50KElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIG5ldyBJRmlsZURvY3VtZW50KGZpbGUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg2NDYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lEb2N1bWVudC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBbiA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+IHJlcHJlc2VudCBhIGRhdGEgc291cmNlLCBlLmcuJm5ic3A7YSA8Y29kZT5GaWxlPC9jb2RlPiAoPGNvZGU+RmlsZURvY3VtZW50PC9jb2RlPiksIAorICogYW4gPGNvZGU+SUZpbGU8L2NvZGU+ICg8Y29kZT5JRmlsZURvY3VtZW50PC9jb2RlPiksIAorICogb3Igb3RoZXIga2luZHMgb2YgZGF0YSBzb3VyY2VzIChVUkwsIC4uLikuIEFuIDxjb2RlPklJbmRleGVyPC9jb2RlPiBpbmRleGVzIGFuPGNvZGU+SURvY3VtZW50PC9jb2RlPi4KKyAqIDxicj4KKyAqIEEgZG9jdW1lbnQgaGFzIGEgc2V0IG9mIHByb3BlcnRpZXMsIHNhdmVkIGluIHRoZSBpbmRleCBmaWxlIChzbyBvbmUgZG9lcyBub3QgbmVlZCB0byBvcGVuIHRoZSBkb2N1bWVudAorICogdG8gb2J0YWluIGJhc2ljIGluZm9ybWF0aW9uIGFzOiBkYXRlIG9mIGNyZWF0aW9uIG9mIHRoZSBkb2N1bWVudCwgc3VtIHVwLCAuLi4pLiBBIHByb3BlcnR5IGlzIGEgU3RyaW5nCisgKiAoY2FsbGVkIHByb3BlcnR5KSBhc3NvY2lhdGVkIHRvIGEgdmFsdWUgKFN0cmluZykuIEV4YW1wbGU6ICJkYXRlX2NyZWF0aW9uIi0+IjAyLzA4LzIwMDAiLgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudCwgaW4gYSBieXRlIGFycmF5LgorCSAqLworCWJ5dGVbXSBnZXRCeXRlQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudCwgaW4gYSBjaGFyIGFycmF5LgorCSAqLworCWNoYXJbXSBnZXRDaGFyQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudCAoZS5nLiBpdHMgcGF0aCBmb3IgYSA8Y29kZT5GaWxlPC9jb2RlPiwgb3IgaXRzIHJlbGF0aXZlIHBhdGgKKwkgKiBpbiB0aGUgd29ya2JlbmNoIGZvciBhbiA8Y29kZT5JRmlsZTwvY29kZT4pLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisJLyoqCisJICogcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LCBvciBudWxsIGlmIHRoaXMgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZQorCSAqIHN1Y2ggYSBwcm9wZXJ0eS4KKwkgKi8KKwlTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KTsKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyB0aGUgZG9jdW1lbnQgaGFzLgorCSAqLworCWphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eU5hbWVzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQsIGFzIGEgU3RyaW5nLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZSgpOworCS8qKgorCSAqIFNldHMgdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisJICovCisJdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lFbnRyeVJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lFbnRyeVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODIzODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUVudHJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUVudHJ5UmVzdWx0IHsKKwlwdWJsaWMgaW50W10gZ2V0RmlsZVJlZmVyZW5jZXMoKTsKKwlwdWJsaWMgY2hhcltdIGdldFdvcmQoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzY2FmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JSW5kZXguamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEFuIElJbmRleCBpcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gZ2VuZXJhdGUgYW4gaW5kZXggZmlsZSwgYW5kIHRvIG1ha2UgcXVlcmllcyBvbgorICogdGhpcyBpbmRleC4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElJbmRleCB7CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgdG8gdGhlIGluZGV4LgorCSAqLworCXZvaWQgYWRkKElEb2N1bWVudCBkb2N1bWVudCwgSUluZGV4ZXIgaW5kZXhlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIEVtcHRpZXMgdGhlIGluZGV4LgorCSAqLworCXZvaWQgZW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgaW5kZXggZmlsZSBvbiB0aGUgZGlzay4KKwkgKi8KKwlGaWxlIGdldEluZGV4RmlsZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2N1bWVudHMgaW5kZXhlZC4KKwkgKi8KKwlpbnQgZ2V0TnVtRG9jdW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1bmlxdWUgd29yZHMgaW5kZXhlZC4KKwkgKi8KKwlpbnQgZ2V0TnVtV29yZHMoKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgcGF0aCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZG9jdW1lbnQgbnVtYmVyCisJICovCisJU3RyaW5nIGdldFBhdGgoaW50IGRvY3VtZW50TnVtYmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogQW5zZXJzIHRydWUgaWYgaGFzIHNvbWUgY2hhbmdlcyB0byBzYXZlLgorCSAqLworCWJvb2xlYW4gaGFzQ2hhbmdlZCgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGhzIG9mIHRoZSBkb2N1bWVudHMgY29udGFpbmluZyB0aGUgZ2l2ZW4gd29yZC4KKwkgKi8KKwlJUXVlcnlSZXN1bHRbXSBxdWVyeShTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgYWxsIGVudHJpZXMgZm9yIGEgZ2l2ZW4gd29yZC4KKwkgKi8KKwlJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXMoY2hhcltdIHBhdHRlcm4pIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRocyBvZiB0aGUgZG9jdW1lbnRzIHdob3NlIG5hbWVzIGNvbnRhaW4gdGhlIGdpdmVuIHdvcmQuCisJICovCisJSVF1ZXJ5UmVzdWx0W10gcXVlcnlJbkRvY3VtZW50TmFtZXMoU3RyaW5nIHdvcmQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRocyBvZiB0aGUgZG9jdW1lbnRzIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHdvcmQgcHJlZml4LgorCSAqLworCUlRdWVyeVJlc3VsdFtdIHF1ZXJ5UHJlZml4KGNoYXJbXSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIGRvY3VtZW50IGZyb20gdGhlIGluZGV4LgorCSAqLworCXZvaWQgcmVtb3ZlKFN0cmluZyBkb2N1bWVudE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBTYXZlcyB0aGUgaW5kZXggb24gdGhlIGRpc2suCisJICovCisJdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY5OTVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CisKKy8qKgorICogQW4gPGNvZGU+SUluZGV4ZXI8L2NvZGU+IGluZGV4ZXMgT05FIGRvY3VtZW50IGF0IGVhY2ggdGltZS4gSXQgYWRkcyB0aGUgZG9jdW1lbnQgbmFtZXMgYW5kCisgKiB0aGUgd29yZHMgcmVmZXJlbmNlcyB0byBhbiBJSW5kZXguIEVhY2ggSUluZGV4ZXIgY2FuIGluZGV4IGNlcnRhaW4gdHlwZXMgb2YgZG9jdW1lbnQsIGFuZCBzaG91bGQKKyAqIG5vdCBpbmRleCB0aGUgb3RoZXIgZmlsZXMuIAorICovCitwdWJsaWMgaW50ZXJmYWNlIElJbmRleGVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaWxlIHR5cGVzIHRoZSA8Y29kZT5JSW5kZXhlcjwvY29kZT4gaGFuZGxlcy4KKwkgKi8KKworCVN0cmluZ1tdIGdldEZpbGVUeXBlcygpOworCS8qKgorCSAqIEluZGV4ZXMgdGhlIGdpdmVuIGRvY3VtZW50LCBhZGRpbmcgdGhlIGRvY3VtZW50IG5hbWUgYW5kIHRoZSB3b3JkIHJlZmVyZW5jZXMgCisJICogdG8gdGhpcyBkb2N1bWVudCB0byB0aGUgZ2l2ZW4gPGNvZGU+SUluZGV4PC9jb2RlPi5UaGUgY2FsbGVyIHNob3VsZCB1c2UgCisJICogPGNvZGU+c2hvdWxkSW5kZXgoKTwvY29kZT4gZmlyc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpbmRleGVyIGhhbmRsZXMgCisJICogdGhlIGdpdmVuIHR5cGUgb2YgZmlsZSwgYW5kIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBpZiBzby4gCisJICovCisKKwl2b2lkIGluZGV4KElEb2N1bWVudCBkb2N1bWVudCwgSUluZGV4ZXJPdXRwdXQgb3V0cHV0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBTZXRzIHRoZSBkb2N1bWVudCB0eXBlcyB0aGUgPGNvZGU+SUluZGV4ZXI8L2NvZGU+IGhhbmRsZXMuCisJICovCisKKwlwdWJsaWMgdm9pZCBzZXRGaWxlVHlwZXMoU3RyaW5nW10gZmlsZVR5cGVzKTsKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPklJbmRleGVyPC9jb2RlPiBjYW4gaW5kZXggdGhlIGdpdmVuIGRvY3VtZW50IG9yIG5vdC4KKwkgKi8KKworCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGV4KElEb2N1bWVudCBkb2N1bWVudCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXJPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JSW5kZXhlck91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDEzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXJPdXRwdXQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvdXRwdXQgZnJvbSBhbiBpbmRleGVyIHRvIGFuIGluZGV4IAorICogZm9yIGEgc2luZ2xlIGRvY3VtZW50LgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSUluZGV4ZXJPdXRwdXQgeworCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCk7CisJcHVibGljIHZvaWQgYWRkUmVmKGNoYXJbXSB3b3JkKTsKKwlwdWJsaWMgdm9pZCBhZGRSZWYoU3RyaW5nIHdvcmQpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lRdWVyeVJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lRdWVyeVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjE2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSVF1ZXJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVF1ZXJ5UmVzdWx0IHsKKwlTdHJpbmcgZ2V0UGF0aCgpOworCVN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKKwlqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0UHJvcGVydHlOYW1lcygpOworCVN0cmluZyBwcm9wZXJ0aWVzVG9TdHJpbmcoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZmI0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9jay5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKKworLyoqCisgKiBBIGJsb2NrIGlzIGEgY29udGFpbmVyIHRoYXQgY2FuIGhvbGQgaW5mb3JtYXRpb24gKGEgbGlzdCBvZiBmaWxlIG5hbWVzLCBhIGxpc3Qgb2YKKyAqIHdvcmRzLCAuLi4pLCBiZSBzYXZlZCBvbiB0aGUgZGlzayBhbmQgbG9hZGVkIGluIG1lbW9yeS4KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmxvY2sgeworCS8qKgorCSAqIFNpemUgb2YgdGhlIGJsb2NrCisJICovCisJcHJvdGVjdGVkIGludCBibG9ja1NpemU7CisKKwkvKioKKwkgKiBGaWVsZCBpbiB3aGljaCB0aGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkCisJICovCisJcHJvdGVjdGVkIEZpZWxkIGZpZWxkOworCisJcHVibGljIEJsb2NrKGludCBibG9ja1NpemUpIHsKKwkJdGhpcy5ibG9ja1NpemU9IGJsb2NrU2l6ZTsKKwkJZmllbGQ9IG5ldyBGaWVsZChibG9ja1NpemUpOworCX0KKwkvKioKKwkgKiBFbXB0aWVzIHRoZSBibG9jay4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwkJZmllbGQuY2xlYXIoKTsKKwl9CisJLyoqCisJICogRmx1c2hlcyB0aGUgYmxvY2sKKwkgKi8KKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKwl9CisJLyoqCisJICogTG9hZHMgdGhlIGJsb2NrIHdpdGggdGhlIGdpdmVuIG51bWJlciBpbiBtZW1vcnksIHJlYWRpbmcgaXQgZnJvbSBhIFJhbmRvbUFjY2Vzc0ZpbGUuCisJICovCisJcHVibGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IGJsb2NrTnVtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyYWYuc2VlayhibG9ja051bSAqIChsb25nKSBibG9ja1NpemUpOworCQlyYWYucmVhZEZ1bGx5KGZpZWxkLmJ1ZmZlcigpKTsKKwl9CisJLyoqCisJICogV3JpdGVzIHRoZSBibG9jayBpbiBhIFJhbmRvbUFjY2Vzc0ZpbGUsIGdpdmluZyBpdCBhIGJsb2NrIG51bWJlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IGJsb2NrTnVtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyYWYuc2VlayhibG9ja051bSAqIChsb25nKSBibG9ja1NpemUpOworCQlyYWYud3JpdGUoZmllbGQuYnVmZmVyKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4SW5wdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4SW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY3ZmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5VdGlsOworCisvKioKKyAqIFRoaXMgaW5wdXQgaXMgdXNlZCBmb3IgcmVhZGluZyBpbmRleGVzIHNhdmVkIHVzaW5nIGEgQmxvY2tzSW5kZXhPdXRwdXQuCisgKi8KK3B1YmxpYyBjbGFzcyBCbG9ja3NJbmRleElucHV0IGV4dGVuZHMgSW5kZXhJbnB1dCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfU0laRT0gMTY7IC8vIENhY2hlIDE2IGJsb2NrcyBvZiA4SyBlYWNoLCBmb3IgYSBjYWNoZSBzaXplIG9mIDEyOEsKKwlwcm90ZWN0ZWQgRmlsZUxpc3RCbG9jayBjdXJyZW50RmlsZUxpc3RCbG9jazsKKwlwcm90ZWN0ZWQgaW50IGN1cnJlbnRGaWxlTGlzdEJsb2NrTnVtOworCXByb3RlY3RlZCBpbnQgY3VycmVudEluZGV4QmxvY2tOdW07CisJcHJvdGVjdGVkIEluZGV4QmxvY2sgY3VycmVudEluZGV4QmxvY2s7CisJcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIHJhZjsKKwlwcm90ZWN0ZWQgRmlsZSBpbmRleEZpbGU7CisJcHJvdGVjdGVkIExSVUNhY2hlIGJsb2NrQ2FjaGU7CisJcHJvdGVjdGVkIGJvb2xlYW4gb3BlbmVkPSBmYWxzZTsKKwlwcm90ZWN0ZWQgSW5kZXhTdW1tYXJ5IHN1bW1hcnk7CisKKwlwdWJsaWMgQmxvY2tzSW5kZXhJbnB1dChGaWxlIGlucHV0RmlsZSkgeworCQl0aGlzLmluZGV4RmlsZT0gaW5wdXRGaWxlOworCQlibG9ja0NhY2hlPSBuZXcgTFJVQ2FjaGUoQ0FDSEVfU0laRSk7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNjbGVhckNhY2hlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgeworCQlibG9ja0NhY2hlPSBuZXcgTFJVQ2FjaGUoQ0FDSEVfU0laRSk7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNjbG9zZSgpCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob3BlbmVkKSB7CisJCQlyYWYuY2xvc2UoKTsKKwkJCXN1bW1hcnk9IG51bGw7CisJCQlvcGVuZWQ9IGZhbHNlOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNnZXRDdXJyZW50RmlsZSgpCisJICovCisJcHVibGljIEluZGV4ZWRGaWxlIGdldEN1cnJlbnRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFoYXNNb3JlRmlsZXMoKSkKKwkJCXJldHVybiBudWxsOworCQlJbmRleGVkRmlsZSBmaWxlPSBudWxsOworCQlpZiAoKGZpbGU9IGN1cnJlbnRGaWxlTGlzdEJsb2NrLmdldEZpbGUoZmlsZVBvc2l0aW9uKSkgPT0gbnVsbCkgeworCQkJY3VycmVudEZpbGVMaXN0QmxvY2tOdW09IHN1bW1hcnkuZ2V0QmxvY2tOdW1Gb3JGaWxlTnVtKGZpbGVQb3NpdGlvbik7CisJCQljdXJyZW50RmlsZUxpc3RCbG9jaz0gZ2V0RmlsZUxpc3RCbG9jayhjdXJyZW50RmlsZUxpc3RCbG9ja051bSk7CisJCQlmaWxlPSBjdXJyZW50RmlsZUxpc3RCbG9jay5nZXRGaWxlKGZpbGVQb3NpdGlvbik7CisJCX0KKwkJcmV0dXJuIGZpbGU7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHdvcmQuCisJICovCisJcHJvdGVjdGVkIFdvcmRFbnRyeSBnZXRFbnRyeShjaGFyW10gd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGJsb2NrTnVtPSBzdW1tYXJ5LmdldEJsb2NrTnVtRm9yV29yZCh3b3JkKTsKKwkJaWYgKGJsb2NrTnVtID09IC0xKSByZXR1cm4gbnVsbDsKKwkJSW5kZXhCbG9jayBibG9jaz0gZ2V0SW5kZXhCbG9jayhibG9ja051bSk7CisJCXJldHVybiBibG9jay5maW5kRXhhY3RFbnRyeSh3b3JkKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgRmlsZUxpc3RCbG9jayB3aXRoIHRoZSBnaXZlbiBudW1iZXIuCisJICovCisJcHJvdGVjdGVkIEZpbGVMaXN0QmxvY2sgZ2V0RmlsZUxpc3RCbG9jayhpbnQgYmxvY2tOdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUludGVnZXIga2V5PSBuZXcgSW50ZWdlcihibG9ja051bSk7CisJCUJsb2NrIGJsb2NrPSAoQmxvY2spIGJsb2NrQ2FjaGUuZ2V0KGtleSk7CisJCWlmIChibG9jayAhPSBudWxsICYmIGJsb2NrIGluc3RhbmNlb2YgRmlsZUxpc3RCbG9jaykKKwkJCXJldHVybiAoRmlsZUxpc3RCbG9jaykgYmxvY2s7CisJCUZpbGVMaXN0QmxvY2sgZmlsZUxpc3RCbG9jaz0gbmV3IEZpbGVMaXN0QmxvY2soSUluZGV4Q29uc3RhbnRzLkJMT0NLX1NJWkUpOworCQlmaWxlTGlzdEJsb2NrLnJlYWQocmFmLCBibG9ja051bSk7CisJCWJsb2NrQ2FjaGUucHV0KGtleSwgZmlsZUxpc3RCbG9jayk7CisJCXJldHVybiBmaWxlTGlzdEJsb2NrOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBJbmRleEJsb2NrIChjb250YWluaW5nIHdvcmRzKSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuCisJICovCisJcHJvdGVjdGVkIEluZGV4QmxvY2sgZ2V0SW5kZXhCbG9jayhpbnQgYmxvY2tOdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUludGVnZXIga2V5PSBuZXcgSW50ZWdlcihibG9ja051bSk7CisJCUJsb2NrIGJsb2NrPSAoQmxvY2spIGJsb2NrQ2FjaGUuZ2V0KGtleSk7CisJCWlmIChibG9jayAhPSBudWxsICYmIGJsb2NrIGluc3RhbmNlb2YgSW5kZXhCbG9jaykKKwkJCXJldHVybiAoSW5kZXhCbG9jaykgYmxvY2s7CisJCUluZGV4QmxvY2sgaW5kZXhCbG9jaz0gbmV3IEdhbW1hQ29tcHJlc3NlZEluZGV4QmxvY2soSUluZGV4Q29uc3RhbnRzLkJMT0NLX1NJWkUpOworCQlpbmRleEJsb2NrLnJlYWQocmFmLCBibG9ja051bSk7CisJCWJsb2NrQ2FjaGUucHV0KGtleSwgaW5kZXhCbG9jayk7CisJCXJldHVybiBpbmRleEJsb2NrOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjZ2V0SW5kZXhlZEZpbGUoaW50KQorCSAqLworCXB1YmxpYyBJbmRleGVkRmlsZSBnZXRJbmRleGVkRmlsZShpbnQgZmlsZU51bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGJsb2NrTnVtPSBzdW1tYXJ5LmdldEJsb2NrTnVtRm9yRmlsZU51bShmaWxlTnVtKTsKKwkJaWYgKGJsb2NrTnVtID09IC0xKQorCQkJcmV0dXJuIG51bGw7CisJCUZpbGVMaXN0QmxvY2sgYmxvY2s9IGdldEZpbGVMaXN0QmxvY2soYmxvY2tOdW0pOworCQlyZXR1cm4gYmxvY2suZ2V0RmlsZShmaWxlTnVtKTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I2dldEluZGV4ZWRGaWxlKElEb2N1bWVudCkKKwkgKi8KKwlwdWJsaWMgSW5kZXhlZEZpbGUgZ2V0SW5kZXhlZEZpbGUoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCXNldEZpcnN0RmlsZSgpOworCQlTdHJpbmcgbmFtZT0gZG9jdW1lbnQuZ2V0TmFtZSgpOworCQl3aGlsZSAoaGFzTW9yZUZpbGVzKCkpIHsKKwkJCUluZGV4ZWRGaWxlIGZpbGU9IGdldEN1cnJlbnRGaWxlKCk7CisJCQlTdHJpbmcgcGF0aD0gZmlsZS5nZXRQYXRoKCk7CisJCQlpZiAocGF0aC5lcXVhbHMobmFtZSkpCisJCQkJcmV0dXJuIGZpbGU7CisJCQltb3ZlVG9OZXh0RmlsZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG51bWJlcnMgb2YgZmlsZXMgY29udGFpbmluZyB0aGUgZ2l2ZW4gd29yZC4KKwkgKi8KKworCXByb3RlY3RlZCBpbnRbXSBnZXRNYXRjaGluZ0ZpbGVOdW1iZXJzKGNoYXJbXSB3b3JkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgYmxvY2tOdW09IHN1bW1hcnkuZ2V0QmxvY2tOdW1Gb3JXb3JkKHdvcmQpOworCQlpZiAoYmxvY2tOdW0gPT0gLTEpCisJCQlyZXR1cm4gbmV3IGludFswXTsKKwkJSW5kZXhCbG9jayBibG9jaz0gZ2V0SW5kZXhCbG9jayhibG9ja051bSk7CisJCVdvcmRFbnRyeSBlbnRyeT0gYmxvY2suZmluZEV4YWN0RW50cnkod29yZCk7CisJCXJldHVybiBlbnRyeSA9PSBudWxsID8gbmV3IGludFswXSA6IGVudHJ5LmdldFJlZnMoKTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I2dldE51bUZpbGVzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bUZpbGVzKCkgeworCQlyZXR1cm4gc3VtbWFyeS5nZXROdW1GaWxlcygpOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjZ2V0TnVtV29yZHMoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7CisJCXJldHVybiBzdW1tYXJ5LmdldE51bVdvcmRzKCk7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNnZXRTb3VyY2UoKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0U291cmNlKCkgeworCQlyZXR1cm4gaW5kZXhGaWxlOworCX0KKwkvKioKKwkgKiBJbml0aWFsaXNlcyB0aGUgYmxvY2tzSW5kZXhJbnB1dAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljbGVhckNhY2hlKCk7CisJCXNldEZpcnN0RmlsZSgpOworCQlzZXRGaXJzdFdvcmQoKTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I21vdmVUb05leHRGaWxlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBtb3ZlVG9OZXh0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbGVQb3NpdGlvbisrOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjbW92ZVRvTmV4dFdvcmRFbnRyeSgpCisJICovCisJcHVibGljIHZvaWQgbW92ZVRvTmV4dFdvcmRFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdvcmRQb3NpdGlvbisrOworCQlpZiAoIWhhc01vcmVXb3JkcygpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy9pZiBlbmQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIHdlIGxvYWQgdGhlIG5leHQgb25lLgorCQlib29sZWFuIGVuZE9mQmxvY2s9ICFjdXJyZW50SW5kZXhCbG9jay5uZXh0RW50cnkoY3VycmVudFdvcmRFbnRyeSk7CisJCWlmIChlbmRPZkJsb2NrKSB7CisJCQljdXJyZW50SW5kZXhCbG9jaz0gZ2V0SW5kZXhCbG9jaygrK2N1cnJlbnRJbmRleEJsb2NrTnVtKTsKKwkJCWN1cnJlbnRJbmRleEJsb2NrLm5leHRFbnRyeShjdXJyZW50V29yZEVudHJ5KTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjb3BlbigpCisJICovCisKKwlwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFvcGVuZWQpIHsKKwkJCXJhZj0gbmV3IFNhZmVSYW5kb21BY2Nlc3NGaWxlKGluZGV4RmlsZSwgInIiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHNpZz0gcmFmLnJlYWRVVEYoKTsKKwkJCWlmICghc2lnLmVxdWFscyhJSW5kZXhDb25zdGFudHMuU0lHTkFUVVJFKSkKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJleGNlcHRpb24ud3JvbmdGb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWludCBzdW1tYXJ5QmxvY2tOdW09IHJhZi5yZWFkSW50KCk7CisJCQlyYWYuc2VlayhzdW1tYXJ5QmxvY2tOdW0gKiAobG9uZykgSUluZGV4Q29uc3RhbnRzLkJMT0NLX1NJWkUpOworCQkJc3VtbWFyeT0gbmV3IEluZGV4U3VtbWFyeSgpOworCQkJc3VtbWFyeS5yZWFkKHJhZik7CisJCQlpbml0KCk7CisJCQlvcGVuZWQ9IHRydWU7CisJCX0KKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I3F1ZXJ5KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVF1ZXJ5UmVzdWx0W10gcXVlcnkoU3RyaW5nIHdvcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW9wZW4oKTsKKwkJaW50W10gZmlsZU51bXM9IGdldE1hdGNoaW5nRmlsZU51bWJlcnMod29yZC50b0NoYXJBcnJheSgpKTsKKwkJaW50IHNpemU9IGZpbGVOdW1zLmxlbmd0aDsKKwkJSVF1ZXJ5UmVzdWx0W10gZmlsZXM9IG5ldyBJUXVlcnlSZXN1bHRbc2l6ZV07CisJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKKwkJCWZpbGVzW2ldPSBnZXRJbmRleGVkRmlsZShmaWxlTnVtc1tpXSk7CisJCX0KKwkJcmV0dXJuIGZpbGVzOworCX0KKwkvKioKKwkgKiBJZiBubyBwcmVmaXggaXMgcHJvdmlkZWQgaW4gdGhlIHBhdHRlcm4sIHRoZW4gdGhpcyBvcGVyYXRpb24gd2lsbCBoYXZlIHRvIHdhbGsKKwkgKiBhbGwgdGhlIGVudHJpZXMgb2YgdGhlIHdob2xlIGluZGV4LgorCSAqLworCXB1YmxpYyBJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXNNYXRjaGluZyhjaGFyW10gcGF0dGVybi8qLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSovKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvcGVuKCk7CisJCisJCWlmIChwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisJCWludFtdIGJsb2NrTnVtcyA9IG51bGw7CisJCWludCBmaXJzdFN0YXIgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyonLCBwYXR0ZXJuKTsKKwkJc3dpdGNoIChmaXJzdFN0YXIpeworCQkJY2FzZSAtMSA6CisJCQkJV29yZEVudHJ5IGVudHJ5ID0gZ2V0RW50cnkocGF0dGVybik7CisJCQkJaWYgKGVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOworCQkJCXJldHVybiBuZXcgSUVudHJ5UmVzdWx0W117IG5ldyBFbnRyeVJlc3VsdChlbnRyeS5nZXRXb3JkKCksIGVudHJ5LmdldFJlZnMoKSkgfTsKKwkJCWNhc2UgMCA6CisJCQkJYmxvY2tOdW1zID0gc3VtbWFyeS5nZXRBbGxCbG9ja051bXMoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWNoYXJbXSBwcmVmaXggPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhdHRlcm4sIDAsIGZpcnN0U3Rhcik7CisJCQkJYmxvY2tOdW1zID0gc3VtbWFyeS5nZXRCbG9ja051bXNGb3JQcmVmaXgocHJlZml4KTsKKwkJfQorCQlpZiAoYmxvY2tOdW1zID09IG51bGwgfHwgYmxvY2tOdW1zLmxlbmd0aCA9PSAwKQlyZXR1cm4gbnVsbDsKKwkJCQkKKwkJSUVudHJ5UmVzdWx0W10gZW50cmllcyA9IG5ldyBJRW50cnlSZXN1bHRbNV07CisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBibG9ja051bXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCUluZGV4QmxvY2sgYmxvY2sgPSBnZXRJbmRleEJsb2NrKGJsb2NrTnVtc1tpXSk7CisJCQlibG9jay5yZXNldCgpOworCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJV29yZEVudHJ5IGVudHJ5ID0gbmV3IFdvcmRFbnRyeSgpOworCQkJd2hpbGUgKGJsb2NrLm5leHRFbnRyeShlbnRyeSkpIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5tYXRjaChlbnRyeS5nZXRXb3JkKCksIHBhdHRlcm4sIHRydWUpKSB7CisJCQkJCWlmIChjb3VudCA9PSBlbnRyaWVzLmxlbmd0aCl7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMgPSBuZXcgSUVudHJ5UmVzdWx0W2NvdW50KjJdLCAwLCBjb3VudCk7CisJCQkJCX0KKwkJCQkJZW50cmllc1tjb3VudCsrXSA9IG5ldyBFbnRyeVJlc3VsdChlbnRyeS5nZXRXb3JkKCksIGVudHJ5LmdldFJlZnMoKSk7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZm91bmQpIGJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY291bnQgIT0gZW50cmllcy5sZW5ndGgpeworCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBlbnRyaWVzID0gbmV3IElFbnRyeVJlc3VsdFtjb3VudF0sIDAsIGNvdW50KTsKKwkJfQorCQlyZXR1cm4gZW50cmllczsKKwl9CisJcHVibGljIElFbnRyeVJlc3VsdFtdIHF1ZXJ5RW50cmllc1ByZWZpeGVkQnkoY2hhcltdIHByZWZpeC8qLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSovKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvcGVuKCk7CisJCQorCQlpbnQgYmxvY2tMb2MgPSBzdW1tYXJ5LmdldEZpcnN0QmxvY2tMb2NhdGlvbkZvclByZWZpeChwcmVmaXgpOworCQlpZiAoYmxvY2tMb2MgPCAwKSByZXR1cm4gbnVsbDsKKwkJCQorCQlJRW50cnlSZXN1bHRbXSBlbnRyaWVzID0gbmV3IElFbnRyeVJlc3VsdFs1XTsKKwkJaW50IGNvdW50ID0gMDsKKwkJd2hpbGUoYmxvY2tMb2MgPj0gMCl7CisJCQlJbmRleEJsb2NrIGJsb2NrID0gZ2V0SW5kZXhCbG9jayhzdW1tYXJ5LmdldEJsb2NrTnVtKGJsb2NrTG9jKSk7CisJCQlibG9jay5yZXNldCgpOworCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJV29yZEVudHJ5IGVudHJ5ID0gbmV3IFdvcmRFbnRyeSgpOworCQkJd2hpbGUgKGJsb2NrLm5leHRFbnRyeShlbnRyeSkpIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBlbnRyeS5nZXRXb3JkKCkvKiwgaXNDYXNlU2Vuc2l0aXZlKi8pKSB7CisJCQkJCWlmIChjb3VudCA9PSBlbnRyaWVzLmxlbmd0aCl7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMgPSBuZXcgSUVudHJ5UmVzdWx0W2NvdW50KjJdLCAwLCBjb3VudCk7CisJCQkJCX0KKwkJCQkJZW50cmllc1tjb3VudCsrXSA9IG5ldyBFbnRyeVJlc3VsdChlbnRyeS5nZXRXb3JkKCksIGVudHJ5LmdldFJlZnMoKSk7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZm91bmQpIGJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIGNvbnNpZGVyIG5leHQgYmxvY2sgPyAqLworCQkJYmxvY2tMb2MgPSBzdW1tYXJ5LmdldE5leHRCbG9ja0xvY2F0aW9uRm9yUHJlZml4KHByZWZpeCwgYmxvY2tMb2MpOwkJCQkKKwkJfQorCQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7CisJCWlmIChjb3VudCAhPSBlbnRyaWVzLmxlbmd0aCl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMgPSBuZXcgSUVudHJ5UmVzdWx0W2NvdW50XSwgMCwgY291bnQpOworCQl9CisJCXJldHVybiBlbnRyaWVzOworCX0KKwlwdWJsaWMgSVF1ZXJ5UmVzdWx0W10gcXVlcnlGaWxlc1JlZmVycmluZ1RvUHJlZml4KGNoYXJbXSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW9wZW4oKTsKKwkJCisJCWludCBibG9ja0xvYyA9IHN1bW1hcnkuZ2V0Rmlyc3RCbG9ja0xvY2F0aW9uRm9yUHJlZml4KHByZWZpeCk7CisJCWlmIChibG9ja0xvYyA8IDApIHJldHVybiBudWxsOworCQkJCisJCS8vIGVhY2ggZmlsZW5hbWUgbXVzdCBiZSByZXR1cm5lZCBhbHJlYWR5IG9uY2UKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZJbnQgZmlsZU1hdGNoZXMgPSBuZXcgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZJbnQoMjApOworCQlpbnQgY291bnQgPSAwOyAKKwkJd2hpbGUoYmxvY2tMb2MgPj0gMCl7CisJCQlJbmRleEJsb2NrIGJsb2NrID0gZ2V0SW5kZXhCbG9jayhzdW1tYXJ5LmdldEJsb2NrTnVtKGJsb2NrTG9jKSk7CisJCQlibG9jay5yZXNldCgpOworCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJV29yZEVudHJ5IGVudHJ5ID0gbmV3IFdvcmRFbnRyeSgpOworCQkJd2hpbGUgKGJsb2NrLm5leHRFbnRyeShlbnRyeSkpIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBlbnRyeS5nZXRXb3JkKCkvKiwgaXNDYXNlU2Vuc2l0aXZlKi8pKSB7CisJCQkJCWludCBbXSByZWZzID0gZW50cnkuZ2V0UmVmcygpOworCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVmcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQkJCQlpbnQgcmVmID0gcmVmc1tpXTsKKwkJCQkJCWlmICghZmlsZU1hdGNoZXMuY29udGFpbnNLZXkocmVmKSl7CisJCQkJCQkJY291bnQrKzsKKwkJCQkJCQlmaWxlTWF0Y2hlcy5wdXQocmVmLCBnZXRJbmRleGVkRmlsZShyZWYpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGZvdW5kKSBicmVhazsKKwkJCQl9CisJCQl9CisJCQkvKiBjb25zaWRlciBuZXh0IGJsb2NrID8gKi8KKwkJCWJsb2NrTG9jID0gc3VtbWFyeS5nZXROZXh0QmxvY2tMb2NhdGlvbkZvclByZWZpeChwcmVmaXgsIGJsb2NrTG9jKTsJCQkJCisJCX0KKwkJLyogZXh0cmFjdCBpbmRleGVkIGZpbGVzICovCisJCUlRdWVyeVJlc3VsdFtdIGZpbGVzID0gbmV3IElRdWVyeVJlc3VsdFtjb3VudF07CisJCU9iamVjdFtdIGluZGV4ZWRGaWxlcyA9IGZpbGVNYXRjaGVzLnZhbHVlVGFibGU7CisJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDAsIG1heCA9IGluZGV4ZWRGaWxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlJbmRleGVkRmlsZSBpbmRleGVkRmlsZSA9IChJbmRleGVkRmlsZSkgaW5kZXhlZEZpbGVzW2ldOworCQkJaWYgKGluZGV4ZWRGaWxlICE9IG51bGwpeworCQkJCWZpbGVzW2luZGV4KytdID0gaW5kZXhlZEZpbGU7CisJCQl9CisJCX0JCisJCXJldHVybiBmaWxlczsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I3F1ZXJ5SW5Eb2N1bWVudE5hbWVzKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVF1ZXJ5UmVzdWx0W10gcXVlcnlJbkRvY3VtZW50TmFtZXMoU3RyaW5nIHdvcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW9wZW4oKTsKKwkJQXJyYXlMaXN0IG1hdGNoZXM9IG5ldyBBcnJheUxpc3QoKTsKKwkJc2V0Rmlyc3RGaWxlKCk7CisJCXdoaWxlIChoYXNNb3JlRmlsZXMoKSkgeworCQkJSW5kZXhlZEZpbGUgZmlsZT0gZ2V0Q3VycmVudEZpbGUoKTsKKwkJCWlmIChmaWxlLmdldFBhdGgoKS5pbmRleE9mKHdvcmQpICE9IC0xKQorCQkJCW1hdGNoZXMuYWRkKGZpbGUpOworCQkJbW92ZVRvTmV4dEZpbGUoKTsKKwkJfQorCQlJUXVlcnlSZXN1bHRbXSBtYXRjaD0gbmV3IElRdWVyeVJlc3VsdFttYXRjaGVzLnNpemUoKV07CisJCW1hdGNoZXMudG9BcnJheShtYXRjaCk7CisJCXJldHVybiBtYXRjaDsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I3NldEZpcnN0RmlsZSgpCisJICovCisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXJzdEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmaWxlUG9zaXRpb249IDE7CisJCWlmIChnZXROdW1GaWxlcygpID4gMCkgeworCQkJY3VycmVudEZpbGVMaXN0QmxvY2tOdW09IHN1bW1hcnkuZ2V0QmxvY2tOdW1Gb3JGaWxlTnVtKDEpOworCQkJY3VycmVudEZpbGVMaXN0QmxvY2s9IGdldEZpbGVMaXN0QmxvY2soY3VycmVudEZpbGVMaXN0QmxvY2tOdW0pOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNzZXRGaXJzdFdvcmQoKQorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgc2V0Rmlyc3RXb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd29yZFBvc2l0aW9uPSAxOworCQlpZiAoZ2V0TnVtV29yZHMoKSA+IDApIHsKKwkJCWN1cnJlbnRJbmRleEJsb2NrTnVtPSBzdW1tYXJ5LmdldEZpcnN0V29yZEJsb2NrTnVtKCk7CisJCQljdXJyZW50SW5kZXhCbG9jaz0gZ2V0SW5kZXhCbG9jayhjdXJyZW50SW5kZXhCbG9ja051bSk7CisJCQljdXJyZW50V29yZEVudHJ5PSBuZXcgV29yZEVudHJ5KCk7CisJCQljdXJyZW50SW5kZXhCbG9jay5yZXNldCgpOworCQkJY3VycmVudEluZGV4QmxvY2submV4dEVudHJ5KGN1cnJlbnRXb3JkRW50cnkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0OWM4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CisKKy8qKgorICogQSBibG9ja3NJbmRleE91dHB1dCBpcyB1c2VkIHRvIHNhdmUgYW4gaW5kZXggaW4gYSBmaWxlIHdpdGggdGhlIGdpdmVuIHN0cnVjdHVyZTo8YnI+CisgKiAgLSBTaWduYXR1cmUgb2YgdGhlIGZpbGU7PGJyPgorICogIC0gRmlsZUxpc3RCbG9ja3M7PGJyPgorICogIC0gSW5kZXhCbG9ja3M7PGJyPgorICogIC0gU3VtbWFyeSBvZiB0aGUgaW5kZXguCisgKi8KKworcHVibGljIGNsYXNzIEJsb2Nrc0luZGV4T3V0cHV0IGV4dGVuZHMgSW5kZXhPdXRwdXQgeworCXByb3RlY3RlZCBSYW5kb21BY2Nlc3NGaWxlIGluZGV4T3V0OworCXByb3RlY3RlZCBpbnQgYmxvY2tOdW07CisJcHJvdGVjdGVkIGJvb2xlYW4gb3BlbmVkPSBmYWxzZTsKKwlwcm90ZWN0ZWQgRmlsZSBpbmRleEZpbGU7CisJcHJvdGVjdGVkIEZpbGVMaXN0QmxvY2sgZmlsZUxpc3RCbG9jazsKKwlwcm90ZWN0ZWQgSW5kZXhCbG9jayBpbmRleEJsb2NrOworCXByb3RlY3RlZCBpbnQgbnVtV29yZHM9IDA7CisJcHJvdGVjdGVkIEluZGV4U3VtbWFyeSBzdW1tYXJ5OworCXByb3RlY3RlZCBpbnQgbnVtRmlsZXM9IDA7CisJcHJvdGVjdGVkIGJvb2xlYW4gZmlyc3RJbkJsb2NrOworCXByb3RlY3RlZCBib29sZWFuIGZpcnN0SW5kZXhCbG9jazsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmaXJzdEZpbGVMaXN0QmxvY2s7CisKKwlwdWJsaWMgQmxvY2tzSW5kZXhPdXRwdXQoRmlsZSBpbmRleEZpbGUpIHsKKwkJdGhpcy5pbmRleEZpbGU9IGluZGV4RmlsZTsKKwkJc3VtbWFyeT0gbmV3IEluZGV4U3VtbWFyeSgpOworCQlibG9ja051bT0gMTsKKwkJZmlyc3RJbkJsb2NrPSB0cnVlOworCQlmaXJzdEluZGV4QmxvY2s9IHRydWU7CisJCWZpcnN0RmlsZUxpc3RCbG9jaz0gdHJ1ZTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleE91dHB1dCNhZGRGaWxlCisJICovCisJcHVibGljIHZvaWQgYWRkRmlsZShJbmRleGVkRmlsZSBpbmRleGVkRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGZpcnN0RmlsZUxpc3RCbG9jaykgeworCQkJZmlyc3RJbkJsb2NrPSB0cnVlOworCQkJZmlsZUxpc3RCbG9jaz0gbmV3IEZpbGVMaXN0QmxvY2soSUluZGV4Q29uc3RhbnRzLkJMT0NLX1NJWkUpOworCQkJZmlyc3RGaWxlTGlzdEJsb2NrPSBmYWxzZTsKKwkJfQorCQlpZiAoZmlsZUxpc3RCbG9jay5hZGRGaWxlKGluZGV4ZWRGaWxlKSkgeworCQkJaWYgKGZpcnN0SW5CbG9jaykgeworCQkJCXN1bW1hcnkuYWRkRmlyc3RGaWxlSW5CbG9jayhpbmRleGVkRmlsZSwgYmxvY2tOdW0pOworCQkJCWZpcnN0SW5CbG9jaz0gZmFsc2U7CisJCQl9CisJCQludW1GaWxlcysrOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGVMaXN0QmxvY2suaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZmx1c2hGaWxlcygpOworCQkJYWRkRmlsZShpbmRleGVkRmlsZSk7CisJCX0KKwl9CisJLyoqCisJICogQHNlZSBJbmRleE91dHB1dCNhZGRXb3JkCisJICovCisJcHVibGljIHZvaWQgYWRkV29yZChXb3JkRW50cnkgZW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChmaXJzdEluZGV4QmxvY2spIHsKKwkJCWluZGV4QmxvY2s9IG5ldyBHYW1tYUNvbXByZXNzZWRJbmRleEJsb2NrKElJbmRleENvbnN0YW50cy5CTE9DS19TSVpFKTsKKwkJCWZpcnN0SW5CbG9jaz0gdHJ1ZTsKKwkJCWZpcnN0SW5kZXhCbG9jaz0gZmFsc2U7CisJCX0KKwkJaWYgKGVudHJ5LmdldE51bVJlZnMoKSA9PSAwKQorCQkJcmV0dXJuOworCQlpZiAoaW5kZXhCbG9jay5hZGRFbnRyeShlbnRyeSkpIHsKKwkJCWlmIChmaXJzdEluQmxvY2spIHsKKwkJCQlzdW1tYXJ5LmFkZEZpcnN0V29yZEluQmxvY2soZW50cnkuZ2V0V29yZCgpLCBibG9ja051bSk7CisJCQkJZmlyc3RJbkJsb2NrPSBmYWxzZTsKKwkJCX0KKwkJCW51bVdvcmRzKys7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5kZXhCbG9jay5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmbHVzaFdvcmRzKCk7CisJCQlhZGRXb3JkKGVudHJ5KTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4T3V0cHV0I2Nsb3NlCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob3BlbmVkKSB7CisJCQlpbmRleE91dC5jbG9zZSgpOworCQkJc3VtbWFyeT0gbnVsbDsKKwkJCW51bUZpbGVzPSAwOworCQkJb3BlbmVkPSBmYWxzZTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4T3V0cHV0I2ZsdXNoCisJICovCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkKKwkJc3VtbWFyeS5zZXROdW1GaWxlcyhudW1GaWxlcyk7CisJCXN1bW1hcnkuc2V0TnVtV29yZHMobnVtV29yZHMpOworCQlpbmRleE91dC5zZWVrKGJsb2NrTnVtICogKGxvbmcpIElJbmRleENvbnN0YW50cy5CTE9DS19TSVpFKTsKKwkJc3VtbWFyeS53cml0ZShpbmRleE91dCk7CisJCWluZGV4T3V0LnNlZWsoMCk7CisJCWluZGV4T3V0LndyaXRlVVRGKElJbmRleENvbnN0YW50cy5TSUdOQVRVUkUpOworCQlpbmRleE91dC53cml0ZUludChibG9ja051bSk7CisJfQorCS8qKgorCSAqIFdyaXRlcyB0aGUgY3VycmVudCBmaWxlTGlzdEJsb2NrIG9uIHRoZSBkaXNrIGFuZCBpbml0aWFsaXNlcyBpdAorCSAqICh3aGVuIGl0J3MgZnVsbCBvciBpdCdzIHRoZSBlbmQgb2YgdGhlIGluZGV4KS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBmbHVzaEZpbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFmaXJzdEZpbGVMaXN0QmxvY2sKKwkJCQkmJiBmaWxlTGlzdEJsb2NrICE9IG51bGwpIHsKKwkJCWZpbGVMaXN0QmxvY2suZmx1c2goKTsKKwkJCWZpbGVMaXN0QmxvY2sud3JpdGUoaW5kZXhPdXQsIGJsb2NrTnVtKyspOworCQkJZmlsZUxpc3RCbG9jay5jbGVhcigpOworCQkJZmlyc3RJbkJsb2NrPSB0cnVlOworCQl9CisJfQorCS8qKgorCSAqIFdyaXRlcyB0aGUgY3VycmVudCBpbmRleEJsb2NrIG9uIHRoZSBkaXNrIGFuZCBpbml0aWFsaXNlcyBpdAorCSAqICh3aGVuIGl0J3MgZnVsbCBvciBpdCdzIHRoZSBlbmQgb2YgdGhlIGluZGV4KS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBmbHVzaFdvcmRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFmaXJzdEluQmxvY2sgCisJCQkJJiYgaW5kZXhCbG9jayAhPSBudWxsKSB7IC8vIGNvdWxkIGhhdmUgYWRkZWQgYSBkb2N1bWVudCB3aXRob3V0IGFueSBpbmRleGVkIHdvcmQsIG5vIGJsb2NrIGNyZWF0ZWQgeWV0CisJCQlpbmRleEJsb2NrLmZsdXNoKCk7CisJCQlpbmRleEJsb2NrLndyaXRlKGluZGV4T3V0LCBibG9ja051bSsrKTsKKwkJCWluZGV4QmxvY2suY2xlYXIoKTsKKwkJCWZpcnN0SW5CbG9jaz0gdHJ1ZTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4T3V0cHV0I2dldERlc3RpbmF0aW9uCisJICovCisJcHVibGljIE9iamVjdCBnZXREZXN0aW5hdGlvbigpIHsKKwkJcmV0dXJuIGluZGV4RmlsZTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleE91dHB1dCNvcGVuCisJICovCisJcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICghb3BlbmVkKSB7CisJCQlzdW1tYXJ5PSBuZXcgSW5kZXhTdW1tYXJ5KCk7CisJCQludW1GaWxlcz0gMDsKKwkJCW51bVdvcmRzPSAwOworCQkJYmxvY2tOdW09IDE7CisJCQlmaXJzdEluQmxvY2s9IHRydWU7CisJCQlmaXJzdEluZGV4QmxvY2s9IHRydWU7CisJCQlmaXJzdEZpbGVMaXN0QmxvY2s9IHRydWU7CisJCQlpbmRleE91dD0gbmV3IFNhZmVSYW5kb21BY2Nlc3NGaWxlKHRoaXMuaW5kZXhGaWxlLCAicnciKTsgLy8kTk9OLU5MUy0xJAorCQkJb3BlbmVkPSB0cnVlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQ29kZUJ5dGVTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0NvZGVCeXRlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczYjk3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0NvZGVCeXRlU3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBDb2RlQnl0ZVN0cmVhbSB7CisJcHJvdGVjdGVkIGJ5dGVbXSBieXRlczsKKwlwcm90ZWN0ZWQgaW50IGJ5dGVPZmZzZXQ9IDA7CisJcHJvdGVjdGVkIGludCBiaXRPZmZzZXQ9IDA7CisJcHJvdGVjdGVkIGludCBtYXJrQnl0ZU9mZnNldD0gLTE7CisJcHJvdGVjdGVkIGludCBtYXJrQml0T2Zmc2V0PSAtMTsKKworCXB1YmxpYyBDb2RlQnl0ZVN0cmVhbSgpIHsKKwkJdGhpcygxNik7CisJfQorCXB1YmxpYyBDb2RlQnl0ZVN0cmVhbShieXRlW10gYnl0ZXMpIHsKKwkJdGhpcy5ieXRlcz0gYnl0ZXM7CisJfQorCXB1YmxpYyBDb2RlQnl0ZVN0cmVhbShpbnQgaW5pdGlhbEJ5dGVMZW5ndGgpIHsKKwkJYnl0ZXM9IG5ldyBieXRlW2luaXRpYWxCeXRlTGVuZ3RoXTsKKwl9CisJcHVibGljIGludCBieXRlTGVuZ3RoKCkgeworCQlyZXR1cm4gKGJpdE9mZnNldCArIDcpIC8gOCArIGJ5dGVPZmZzZXQ7CisJfQorCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7CisJCWludCBieXRlTGVuZ3RoPSBieXRlTGVuZ3RoKCk7CisJCWlmIChzdGFydE9mZnNldCA+IGJ5dGVMZW5ndGggfHwgZW5kT2Zmc2V0ID4gYnl0ZUxlbmd0aCB8fCBzdGFydE9mZnNldCA+IGVuZE9mZnNldCkKKwkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJCWludCBsZW5ndGg9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OworCQlieXRlW10gcmVzdWx0PSBuZXcgYnl0ZVtsZW5ndGhdOworCQlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBzdGFydE9mZnNldCwgcmVzdWx0LCAwLCBsZW5ndGgpOworCQlpZiAoZW5kT2Zmc2V0ID09IGJ5dGVMZW5ndGggJiYgYml0T2Zmc2V0ICE9IDApIHsKKwkJCWludCBtYXNrPSAoMSA8PCBiaXRPZmZzZXQpIC0gMTsKKwkJCXJlc3VsdFtsZW5ndGggLSAxXSAmPSAobWFzayA8PCA4IC0gYml0T2Zmc2V0KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwlwcm90ZWN0ZWQgdm9pZCBncm93KCkgeworCQlieXRlW10gbmV3Qnl0ZXM9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCAqIDIgKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgbmV3Qnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisJCWJ5dGVzPSBuZXdCeXRlczsKKwl9CisJcHVibGljIHZvaWQgbWFyaygpIHsKKwkJbWFya0J5dGVPZmZzZXQ9IGJ5dGVPZmZzZXQ7CisJCW1hcmtCaXRPZmZzZXQ9IGJpdE9mZnNldDsKKwl9CisJLyoqCisJICogUmVhZHMgYSBzaW5nbGUgYml0ICh2YWx1ZSA9PSAwIG9yID09IDEpLgorCSAqLworCXB1YmxpYyBpbnQgcmVhZEJpdCgpIHsKKwkJaW50IHZhbHVlPSAoYnl0ZXNbYnl0ZU9mZnNldF0gPj4gKDcgLSBiaXRPZmZzZXQpKSAmIDE7CisJCWlmICgrK2JpdE9mZnNldCA+PSA4KSB7CisJCQliaXRPZmZzZXQ9IDA7CisJCQkrK2J5dGVPZmZzZXQ7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvKioKKwkgKiBSZWFkIHVwIHRvIDMyIGJpdHMgZnJvbSB0aGUgc3RyZWFtLgorCSAqLworCXB1YmxpYyBpbnQgcmVhZEJpdHMoaW50IG51bUJpdHMpIHsKKwkJaW50IHZhbHVlPSAwOworCQl3aGlsZSAobnVtQml0cyA+IDApIHsKKwkJCWludCBiaXRzVG9SZWFkPSA4IC0gYml0T2Zmc2V0OworCQkJaWYgKGJpdHNUb1JlYWQgPiBudW1CaXRzKQorCQkJCWJpdHNUb1JlYWQ9IG51bUJpdHM7CisJCQlpbnQgbWFzaz0gKDEgPDwgYml0c1RvUmVhZCkgLSAxOworCQkJdmFsdWUgfD0gKChieXRlc1tieXRlT2Zmc2V0XSA+PiAoOCAtIGJpdE9mZnNldCAtIGJpdHNUb1JlYWQpKSAmIG1hc2spIDw8IChudW1CaXRzIC0gYml0c1RvUmVhZCk7CisJCQludW1CaXRzIC09IGJpdHNUb1JlYWQ7CisJCQliaXRPZmZzZXQgKz0gYml0c1RvUmVhZDsKKwkJCWlmIChiaXRPZmZzZXQgPj0gOCkgeworCQkJCWJpdE9mZnNldCAtPSA4OworCQkJCWJ5dGVPZmZzZXQgKz0gMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCXB1YmxpYyBmaW5hbCBpbnQgcmVhZEJ5dGUoKSB7CisKKwkJLy8gbm8gbmVlZCB0byByZWJ1aWxkIGJ5dGUgdmFsdWUgZnJvbSBiaXQgc2VxdWVuY2VzCisJCWlmIChiaXRPZmZzZXQgPT0gMCkgcmV0dXJuIGJ5dGVzW2J5dGVPZmZzZXQrK10gJiAyNTU7CisJCisJCWludCB2YWx1ZT0gMDsKKwkJaW50IG51bUJpdHMgPSA4OworCQl3aGlsZSAobnVtQml0cyA+IDApIHsKKwkJCWludCBiaXRzVG9SZWFkPSA4IC0gYml0T2Zmc2V0OworCQkJaWYgKGJpdHNUb1JlYWQgPiBudW1CaXRzKQorCQkJCWJpdHNUb1JlYWQ9IG51bUJpdHM7CisJCQlpbnQgbWFzaz0gKDEgPDwgYml0c1RvUmVhZCkgLSAxOworCQkJdmFsdWUgfD0gKChieXRlc1tieXRlT2Zmc2V0XSA+PiAoOCAtIGJpdE9mZnNldCAtIGJpdHNUb1JlYWQpKSAmIG1hc2spIDw8IChudW1CaXRzIC0gYml0c1RvUmVhZCk7CisJCQludW1CaXRzIC09IGJpdHNUb1JlYWQ7CisJCQliaXRPZmZzZXQgKz0gYml0c1RvUmVhZDsKKwkJCWlmIChiaXRPZmZzZXQgPj0gOCkgeworCQkJCWJpdE9mZnNldCAtPSA4OworCQkJCWJ5dGVPZmZzZXQgKz0gMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCS8qKgorCSAqIFJlYWRzIGEgdmFsdWUgdXNpbmcgR2FtbWEgY29kaW5nLgorCSAqLworCXB1YmxpYyBpbnQgcmVhZEdhbW1hKCkgeworCQlpbnQgbnVtQml0cz0gcmVhZFVuYXJ5KCk7CisJCXJldHVybiByZWFkQml0cyhudW1CaXRzIC0gMSkgfCAoMSA8PCAobnVtQml0cyAtIDEpKTsKKwl9CisJcHVibGljIGNoYXJbXSByZWFkU21hbGxVVEYoKSB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisJCWludCB1dGZsZW49IHJlYWRCeXRlKCk7CisJCWNoYXIgc3RyW109IG5ldyBjaGFyW3V0Zmxlbl07CisJCWludCBjb3VudD0gMDsKKwkJaW50IHN0cmxlbj0gMDsKKwkJd2hpbGUgKGNvdW50IDwgdXRmbGVuKSB7CisJCQlpbnQgYz0gcmVhZEJ5dGUoKTsKKwkJCWludCBjaGFyMiwgY2hhcjM7CisJCQlzd2l0Y2ggKGMgPj4gNCkgeworCQkJCWNhc2UgMCA6CisJCQkJY2FzZSAxIDoKKwkJCQljYXNlIDIgOgorCQkJCWNhc2UgMyA6CisJCQkJY2FzZSA0IDoKKwkJCQljYXNlIDUgOgorCQkJCWNhc2UgNiA6CisJCQkJY2FzZSA3IDoKKwkJCQkJLy8gMHh4eHh4eHgKKwkJCQkJY291bnQrKzsKKwkJCQkJc3RyW3N0cmxlbisrXT0gKGNoYXIpIGM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTIgOgorCQkJCWNhc2UgMTMgOgorCQkJCQkvLyAxMTB4IHh4eHggICAxMHh4IHh4eHgKKwkJCQkJY291bnQgKz0gMjsKKwkJCQkJaWYgKGNvdW50ID4gdXRmbGVuKQorCQkJCQkJdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKTsKKwkJCQkJY2hhcjI9IHJlYWRCeXRlKCk7CisJCQkJCWlmICgoY2hhcjIgJiAweEMwKSAhPSAweDgwKQorCQkJCQkJdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKTsKKwkJCQkJc3RyW3N0cmxlbisrXT0gKGNoYXIpICgoKGMgJiAweDFGKSA8PCA2KSB8IChjaGFyMiAmIDB4M0YpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxNCA6CisJCQkJCS8vIDExMTAgeHh4eCAgMTB4eCB4eHh4ICAxMHh4IHh4eHgKKwkJCQkJY291bnQgKz0gMzsKKwkJCQkJaWYgKGNvdW50ID4gdXRmbGVuKQorCQkJCQkJdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKTsKKwkJCQkJY2hhcjI9IHJlYWRCeXRlKCk7CisJCQkJCWNoYXIzPSByZWFkQnl0ZSgpOworCQkJCQlpZiAoKChjaGFyMiAmIDB4QzApICE9IDB4ODApIHx8ICgoY2hhcjMgJiAweEMwKSAhPSAweDgwKSkKKwkJCQkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCQkJCXN0cltzdHJsZW4rK109IChjaGFyKSAoKChjICYgMHgwRikgPDwgMTIpIHwgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHwgKChjaGFyMyAmIDB4M0YpIDw8IDApKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCS8vIDEweHggeHh4eCwgIDExMTEgeHh4eAorCQkJCQl0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigpOworCQkJfQorCQl9CisJCWlmIChzdHJsZW4gPCB1dGZsZW4pCisJCQlTeXN0ZW0uYXJyYXljb3B5KHN0ciwgMCwgc3RyPSBuZXcgY2hhcltzdHJsZW5dLCAwLCBzdHJsZW4pOworCQlyZXR1cm4gc3RyOworCX0KKwkvKioKKwkgKiAgUmVhZHMgYSB2YWx1ZSBpbiB1bmFyeS4KKwkgKi8KKwlwdWJsaWMgaW50IHJlYWRVbmFyeSgpIHsKKwkJaW50IHZhbHVlPSAxOworCQlpbnQgbWFzaz0gMSA8PCAoNyAtIGJpdE9mZnNldCk7CisJCXdoaWxlICgoYnl0ZXNbYnl0ZU9mZnNldF0gJiBtYXNrKSAhPSAwKSB7CisJCQkrK3ZhbHVlOworCQkJaWYgKCsrYml0T2Zmc2V0ID49IDgpIHsKKwkJCQliaXRPZmZzZXQ9IDA7CisJCQkJKytieXRlT2Zmc2V0OworCQkJCW1hc2s9IDB4ODA7CisJCQl9IGVsc2UgeworCQkJCW1hc2sgPj4+PSAxOworCQkJfQorCQl9CisJCS8vIHNraXAgdGhlIDAgYml0CisJCWlmICgrK2JpdE9mZnNldCA+PSA4KSB7CisJCQliaXRPZmZzZXQ9IDA7CisJCQkrK2J5dGVPZmZzZXQ7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJYnl0ZU9mZnNldD0gYml0T2Zmc2V0PSAwOworCQltYXJrQnl0ZU9mZnNldD0gbWFya0JpdE9mZnNldD0gLTE7CisJfQorCXB1YmxpYyB2b2lkIHJlc2V0KGJ5dGVbXSBieXRlcykgeworCQl0aGlzLmJ5dGVzPSBieXRlczsKKwkJcmVzZXQoKTsKKwl9CisJcHVibGljIHZvaWQgcmVzZXQoYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZU9mZnNldCkgeworCQlyZXNldChieXRlcyk7CisJCXRoaXMuYnl0ZU9mZnNldD0gYnl0ZU9mZnNldDsKKwl9CisJcHVibGljIGJvb2xlYW4gcmVzZXRUb01hcmsoKSB7CisJCWlmIChtYXJrQnl0ZU9mZnNldCA9PSAtMSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYnl0ZU9mZnNldD0gbWFya0J5dGVPZmZzZXQ7CisJCWJpdE9mZnNldD0gbWFya0JpdE9mZnNldDsKKwkJbWFya0J5dGVPZmZzZXQ9IG1hcmtCaXRPZmZzZXQ9IC0xOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIHZvaWQgc2tpcEJpdHMoaW50IG51bUJpdHMpIHsKKwkJaW50IG5ld09mZnNldD0gYnl0ZU9mZnNldCAqIDggKyBiaXRPZmZzZXQgKyBudW1CaXRzOworCQlpZiAobmV3T2Zmc2V0IDwgMCB8fCAobmV3T2Zmc2V0ICsgNykgLyA4ID49IGJ5dGVzLmxlbmd0aCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJYnl0ZU9mZnNldD0gbmV3T2Zmc2V0IC8gODsKKwkJYml0T2Zmc2V0PSBuZXdPZmZzZXQgJSA4OworCX0KKwlwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworCQlyZXR1cm4gZ2V0Qnl0ZXMoMCwgYnl0ZUxlbmd0aCgpKTsKKwl9CisJLyoqCisJICogV3JpdGVzIGEgc2luZ2xlIGJpdCAodmFsdWUgPT0gMCBvciA9PSAxKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZUJpdChpbnQgdmFsdWUpIHsKKwkJYnl0ZXNbYnl0ZU9mZnNldF0gfD0gKHZhbHVlICYgMSkgPDwgKDcgLSBiaXRPZmZzZXQpOworCQlpZiAoKytiaXRPZmZzZXQgPj0gOCkgeworCQkJYml0T2Zmc2V0PSAwOworCQkJaWYgKCsrYnl0ZU9mZnNldCA+PSBieXRlcy5sZW5ndGgpCisJCQkJZ3JvdygpOworCQl9CisJfQorCS8qKgorCSAqIFdyaXRlIHVwIHRvIDMyIGJpdHMgdG8gdGhlIHN0cmVhbS4KKwkgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgbnVtQml0cyBiaXRzIG9mIHZhbHVlIGFyZSB3cml0dGVuLgorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlQml0cyhpbnQgdmFsdWUsIGludCBudW1CaXRzKSB7CisJCXdoaWxlIChudW1CaXRzID4gMCkgeworCQkJaW50IGJpdHNUb1dyaXRlPSA4IC0gYml0T2Zmc2V0OworCQkJaWYgKGJpdHNUb1dyaXRlID4gbnVtQml0cykKKwkJCQliaXRzVG9Xcml0ZT0gbnVtQml0czsKKwkJCWludCBzaGlmdD0gOCAtIGJpdE9mZnNldCAtIGJpdHNUb1dyaXRlOworCQkJaW50IG1hc2s9ICgoMSA8PCBiaXRzVG9Xcml0ZSkgLSAxKSA8PCBzaGlmdDsKKwkJCWJ5dGVzW2J5dGVPZmZzZXRdPSAoYnl0ZSkgKChieXRlc1tieXRlT2Zmc2V0XSAmIH5tYXNrKSB8ICgoKHZhbHVlID4+PiAobnVtQml0cyAtIGJpdHNUb1dyaXRlKSkgPDwgc2hpZnQpICYgbWFzaykpOworCQkJbnVtQml0cyAtPSBiaXRzVG9Xcml0ZTsKKwkJCWJpdE9mZnNldCArPSBiaXRzVG9Xcml0ZTsKKwkJCWlmIChiaXRPZmZzZXQgPj0gOCkgeworCQkJCWJpdE9mZnNldCAtPSA4OworCQkJCWlmICgrK2J5dGVPZmZzZXQgPj0gYnl0ZXMubGVuZ3RoKQorCQkJCQlncm93KCk7CisJCQl9CisJCX0KKwl9CisJcHVibGljIHZvaWQgd3JpdGVCeXRlKGludCB2YWx1ZSkgeworCQl3cml0ZUJpdHModmFsdWUsIDgpOworCX0KKwkvKioKKwkgKiBXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIEdhbW1hIGNvZGluZywgaW4gd2hpY2ggcG9zaXRpdmUgaW50ZWdlciB4CisJICogaXMgcmVwcmVzZW50ZWQgYnkgY29kaW5nIGZsb29yKGxvZzIoeCkgaW4gdW5hcnkgZm9sbG93ZWQgYnkgdGhlIHZhbHVlIAorCSAqIG9mIHggLSAyKipmbG9vcihsb2cyKHgpKSBpbiBiaW5hcnkuCisJICogVGhlIHZhbHVlIG11c3QgYmUgPj0gMS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZUdhbW1hKGludCB2YWx1ZSkgeworCQlpZiAodmFsdWUgPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlpbnQgdGVtcD0gdmFsdWU7CisJCWludCBudW1CaXRzPSAwOworCQl3aGlsZSAodGVtcCAhPSAwKSB7CisJCQl0ZW1wID4+Pj0gMTsKKwkJCSsrbnVtQml0czsKKwkJfQorCQl3cml0ZVVuYXJ5KG51bUJpdHMpOworCQl3cml0ZUJpdHModmFsdWUsIG51bUJpdHMgLSAxKTsKKwl9CisJcHVibGljIHZvaWQgd3JpdGVTbWFsbFVURihjaGFyW10gc3RyKSB7CisJCXdyaXRlU21hbGxVVEYoc3RyLCAwLCBzdHIubGVuZ3RoKTsKKwl9CisJcHVibGljIHZvaWQgd3JpdGVTbWFsbFVURihjaGFyW10gc3RyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaW50IHV0Zmxlbj0gMDsKKwkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQkJaW50IGM9IHN0cltpXTsKKwkJCWlmICgoYyA+PSAweDAwMDEpICYmIChjIDw9IDB4MDA3RikpIHsKKwkJCQl1dGZsZW4rKzsKKwkJCX0gZWxzZSBpZiAoYyA+IDB4MDdGRikgeworCQkJCXV0ZmxlbiArPSAzOworCQkJfSBlbHNlIHsKKwkJCQl1dGZsZW4gKz0gMjsKKwkJCX0KKwkJfQorCQlpZiAodXRmbGVuID4gMjU1KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl3cml0ZUJ5dGUodXRmbGVuICYgMHhGRik7CisJCWZvciAoaW50IGk9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKwkJCWludCBjPSBzdHJbaV07CisJCQlpZiAoKGMgPj0gMHgwMDAxKSAmJiAoYyA8PSAweDAwN0YpKSB7CisJCQkJd3JpdGVCeXRlKGMpOworCQkJfSBlbHNlIGlmIChjID4gMHgwN0ZGKSB7CisJCQkJd3JpdGVCeXRlKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworCQkJCXdyaXRlQnl0ZSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworCQkJCXdyaXRlQnl0ZSgweDgwIHwgKChjID4+IDApICYgMHgzRikpOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZUJ5dGUoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKwkJCQl3cml0ZUJ5dGUoMHg4MCB8ICgoYyA+PiAwKSAmIDB4M0YpKTsKKwkJCX0KKwkJfQorCX0KKwkvKioKKwkgKiBXcml0ZSB0aGUgZ2l2ZW4gdmFsdWUgaW4gdW5hcnkuICBUaGUgdmFsdWUgbXVzdCBiZSA+PSAxLgorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlVW5hcnkoaW50IHZhbHVlKSB7CisJCWlmICh2YWx1ZSA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWludCBtYXNrPSAxIDw8ICg3IC0gYml0T2Zmc2V0KTsKKwkJLy8gd3JpdGUgTi0xIDEtYml0cworCQl3aGlsZSAoLS12YWx1ZSA+IDApIHsKKwkJCWJ5dGVzW2J5dGVPZmZzZXRdIHw9IG1hc2s7CisJCQlpZiAoKytiaXRPZmZzZXQgPj0gOCkgeworCQkJCWJpdE9mZnNldD0gMDsKKwkJCQlpZiAoKytieXRlT2Zmc2V0ID49IGJ5dGVzLmxlbmd0aCkKKwkJCQkJZ3JvdygpOworCQkJCW1hc2s9IDB4ODA7CisJCQl9IGVsc2UgeworCQkJCW1hc2sgPj4+PSAxOworCQkJfQorCQl9CisJCS8vIHdyaXRlIGEgMC1iaXQKKwkJYnl0ZXNbYnl0ZU9mZnNldF0gJj0gfm1hc2s7CisJCWlmICgrK2JpdE9mZnNldCA+PSA4KSB7CisJCQliaXRPZmZzZXQ9IDA7CisJCQlpZiAoKytieXRlT2Zmc2V0ID49IGJ5dGVzLmxlbmd0aCkKKwkJCQlncm93KCk7CisJCX0KKwl9CisJcHVibGljIHZvaWQgd3JpdGVVVEYoY2hhcltdIHN0cikgeworCQlpbnQgc3RybGVuPSBzdHIubGVuZ3RoOworCQlpbnQgdXRmbGVuPSAwOworCQlmb3IgKGludCBpPSAwOyBpIDwgc3RybGVuOyBpKyspIHsKKwkJCWludCBjPSBzdHJbaV07CisJCQlpZiAoKGMgPj0gMHgwMDAxKSAmJiAoYyA8PSAweDAwN0YpKSB7CisJCQkJdXRmbGVuKys7CisJCQl9IGVsc2UgaWYgKGMgPiAweDA3RkYpIHsKKwkJCQl1dGZsZW4gKz0gMzsKKwkJCX0gZWxzZSB7CisJCQkJdXRmbGVuICs9IDI7CisJCQl9CisJCX0KKwkJaWYgKHV0ZmxlbiA+IDY1NTM1KQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl3cml0ZUJ5dGUoKHV0ZmxlbiA+Pj4gOCkgJiAweEZGKTsKKwkJd3JpdGVCeXRlKCh1dGZsZW4gPj4+IDApICYgMHhGRik7CisJCWZvciAoaW50IGk9IDA7IGkgPCBzdHJsZW47IGkrKykgeworCQkJaW50IGM9IHN0cltpXTsKKwkJCWlmICgoYyA+PSAweDAwMDEpICYmIChjIDw9IDB4MDA3RikpIHsKKwkJCQl3cml0ZUJ5dGUoYyk7CisJCQl9IGVsc2UgaWYgKGMgPiAweDA3RkYpIHsKKwkJCQl3cml0ZUJ5dGUoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisJCQkJd3JpdGVCeXRlKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisJCQkJd3JpdGVCeXRlKDB4ODAgfCAoKGMgPj4gMCkgJiAweDNGKSk7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlQnl0ZSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworCQkJCXdyaXRlQnl0ZSgweDgwIHwgKChjID4+IDApICYgMHgzRikpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRW50cnlSZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0VudHJ5UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5Yzg5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0VudHJ5UmVzdWx0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworCitwdWJsaWMgY2xhc3MgRW50cnlSZXN1bHQgaW1wbGVtZW50cyBJRW50cnlSZXN1bHQgeworCXByaXZhdGUgY2hhcltdIHdvcmQ7CisJcHJpdmF0ZSBpbnRbXSAgZmlsZVJlZnM7CisJCitwdWJsaWMgRW50cnlSZXN1bHQoY2hhcltdIHdvcmQsIGludFtdIHJlZnMpIHsKKwl0aGlzLndvcmQgPSB3b3JkOworCXRoaXMuZmlsZVJlZnMgPSByZWZzOworfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCl7CisJCisJaWYgKHRoaXMgPT0gYW5PYmplY3QpIHsKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCWlmICgoYW5PYmplY3QgIT0gbnVsbCkgJiYgKGFuT2JqZWN0IGluc3RhbmNlb2YgRW50cnlSZXN1bHQpKSB7CisJCUVudHJ5UmVzdWx0IGFuRW50cnlSZXN1bHQgPSAoRW50cnlSZXN1bHQpIGFuT2JqZWN0OworCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMud29yZCwgYW5FbnRyeVJlc3VsdC53b3JkKSkgcmV0dXJuIGZhbHNlOworCisJCWludCBsZW5ndGg7CisJCWludFtdIHJlZnMsIG90aGVyUmVmczsKKwkJaWYgKChsZW5ndGggPSAocmVmcyA9IHRoaXMuZmlsZVJlZnMpLmxlbmd0aCkgIT0gKG90aGVyUmVmcyA9IGFuRW50cnlSZXN1bHQuZmlsZVJlZnMpLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gIDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQlpZiAocmVmc1tpXSAhPSBvdGhlclJlZnNbaV0pIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworCQorfQorcHVibGljIGludFtdIGdldEZpbGVSZWZlcmVuY2VzKCkgeworCXJldHVybiBmaWxlUmVmczsKK30KK3B1YmxpYyBjaGFyW10gZ2V0V29yZCgpIHsKKwlyZXR1cm4gd29yZDsKK30KK3B1YmxpYyBpbnQgaGFzaENvZGUoKXsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5oYXNoQ29kZSh3b3JkKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih3b3JkLmxlbmd0aCAqIDIpOworCWJ1ZmZlci5hcHBlbmQoIkVudHJ5UmVzdWx0OiB3b3JkPSIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh3b3JkKTsKKwlidWZmZXIuYXBwZW5kKCIsIHJlZnM9eyIpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlUmVmcy5sZW5ndGg7IGkrKyl7CisJCWlmIChpID4gMCkgYnVmZmVyLmFwcGVuZCgnLCcpOworCQlidWZmZXIuYXBwZW5kKCcgJyk7CisJCWJ1ZmZlci5hcHBlbmQoZmlsZVJlZnNbaV0pOworCX0KKwlidWZmZXIuYXBwZW5kKCIgfSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MWRlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpZWxkLmphdmEKQEAgLTAsMCArMSwzODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBGaWVsZCB7CisJcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXI7IC8vIGNvbnRlbnRzCisJcHJvdGVjdGVkIGludCBvZmZzZXQ7IC8vIG9mZnNldCBvZiB0aGUgZmllbGQgd2l0aGluIHRoZSBieXRlIGFycmF5CisJcHJvdGVjdGVkIGludCBsZW5ndGg7IC8vIGxlbmd0aCBvZiB0aGUgZmllbGQKKworCS8qKgorCSAqIEJ5dGVTZWdtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIEZpZWxkKGJ5dGVbXSBieXRlcykgeworCQl0aGlzLmJ1ZmZlcj0gYnl0ZXM7CisJCXRoaXMub2Zmc2V0PSAwOworCQl0aGlzLmxlbmd0aD0gYnl0ZXMubGVuZ3RoOworCX0KKwkvKioKKwkgKiBCeXRlU2VnbWVudCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBGaWVsZChieXRlW10gYnl0ZXMsIGludCBsZW5ndGgpIHsKKwkJdGhpcy5idWZmZXI9IGJ5dGVzOworCQl0aGlzLm9mZnNldD0gMDsKKwkJdGhpcy5sZW5ndGg9IGxlbmd0aDsKKwl9CisJLyoqCisJICogQnl0ZVNlZ21lbnQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRmllbGQoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJCXRoaXMuYnVmZmVyPSBieXRlczsKKwkJdGhpcy5vZmZzZXQ9IG9mZnNldDsKKwkJdGhpcy5sZW5ndGg9IGxlbmd0aDsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBmaWVsZCBjb250YWluaW5nIGFuIGVtcHR5IGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLgorCSAqLworCXB1YmxpYyBGaWVsZChpbnQgbGVuZ3RoKSB7CisJCXRoaXMuYnVmZmVyPSBuZXcgYnl0ZVtsZW5ndGhdOworCQl0aGlzLm9mZnNldD0gMDsKKwkJdGhpcy5sZW5ndGg9IGxlbmd0aDsKKwl9CisJcHVibGljIGJ5dGVbXSBidWZmZXIoKSB7CisJCXJldHVybiBidWZmZXI7CisJfQorCXB1YmxpYyBGaWVsZCBidWZmZXIoYnl0ZVtdIGJ1ZmZlcikgeworCQl0aGlzLmJ1ZmZlcj0gYnVmZmVyOworCQlyZXR1cm4gdGhpczsKKwl9CisJcHVibGljIEZpZWxkIGNsZWFyKCkgeworCQljbGVhcihidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjbGVhcihieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJCWludCBuPSBvZmZzZXQ7CisJCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJYnVmZmVyW25dPSAwOworCQkJbisrOworCQl9CisJfQorCXB1YmxpYyBGaWVsZCBjbGVhcihpbnQgbGVuZ3RoKSB7CisJCWNsZWFyKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCQlyZXR1cm4gdGhpczsKKwl9CisJcHVibGljIEZpZWxkIGNsZWFyKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJY2xlYXIoYnVmZmVyLCB0aGlzLm9mZnNldCArIG9mZnNldCwgbGVuZ3RoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXByb3RlY3RlZCBzdGF0aWMgaW50IGNvbXBhcmUoYnl0ZVtdIGJ1ZmZlcjEsIGludCBvZmZzZXQxLCBpbnQgbGVuZ3RoMSwgYnl0ZVtdIGJ1ZmZlcjIsIGludCBvZmZzZXQyLCBpbnQgbGVuZ3RoMikgeworCQlpbnQgbj0gTWF0aC5taW4obGVuZ3RoMSwgbGVuZ3RoMik7CisJCWZvciAoaW50IGk9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWludCBqMT0gYnVmZmVyMVtvZmZzZXQxICsgaV0gJiAyNTU7CisJCQlpbnQgajI9IGJ1ZmZlcjJbb2Zmc2V0MiArIGldICYgMjU1OworCQkJaWYgKGoxID4gajIpCisJCQkJcmV0dXJuIDE7CisJCQlpZiAoajEgPCBqMikKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGxlbmd0aDEgPiBuKSB7CisJCQlmb3IgKGludCBpPSBuOyBpIDwgbGVuZ3RoMTsgaSsrKQorCQkJCWlmIChidWZmZXIxW29mZnNldDEgKyBpXSAhPSAwKQorCQkJCQlyZXR1cm4gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWZvciAoaW50IGk9IG47IGkgPCBsZW5ndGgyOyBpKyspCisJCQlpZiAoYnVmZmVyMltvZmZzZXQyICsgaV0gIT0gMCkKKwkJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKEZpZWxkIGYxLCBGaWVsZCBmMikgeworCQlyZXR1cm4gY29tcGFyZShmMS5idWZmZXIsIGYxLm9mZnNldCwgZjEubGVuZ3RoLCBmMi5idWZmZXIsIGYyLm9mZnNldCwgZjIubGVuZ3RoKTsKKwl9CisJLy8gY29weSBieXRlcyBmcm9tIG9uZSBvZmZzZXQgdG8gYW5vdGhlciB3aXRoaW4gdGhlIGZpZWxkCisJcHVibGljIEZpZWxkIGNvcHkoaW50IGZyb21PZmZzZXQsIGludCB0b09mZnNldCwgaW50IGxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb2Zmc2V0ICsgZnJvbU9mZnNldCwgYnVmZmVyLCBvZmZzZXQgKyB0b09mZnNldCwgbGVuZ3RoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBGaWVsZCBkZWMoaW50IG4pIHsKKwkJb2Zmc2V0IC09IG47CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgYnl0ZVtdIGdldCgpIHsKKwkJYnl0ZVtdIHJlc3VsdD0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG9mZnNldCwgcmVzdWx0LCAwLCBsZW5ndGgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlwdWJsaWMgYnl0ZVtdIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisJCWJ5dGVbXSByZXN1bHQ9IG5ldyBieXRlW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0aGlzLm9mZnNldCArIG9mZnNldCwgcmVzdWx0LCAwLCBsZW5ndGgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlwdWJsaWMgRmllbGQgZ2V0RmllbGQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCQlyZXR1cm4gbmV3IEZpZWxkKGJ1ZmZlciwgdGhpcy5vZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCk7CisJfQorCXB1YmxpYyBpbnQgZ2V0SW50MSgpIHsKKwkJcmV0dXJuIGJ1ZmZlclt0aGlzLm9mZnNldF07CisJfQorCXB1YmxpYyBpbnQgZ2V0SW50MShpbnQgb2Zmc2V0KSB7CisJCXJldHVybiBidWZmZXJbdGhpcy5vZmZzZXQgKyBvZmZzZXRdOworCX0KKwlwdWJsaWMgaW50IGdldEludDIoKSB7CisJCWludCBpPSB0aGlzLm9mZnNldDsKKwkJaW50IHY9IGJ1ZmZlcltpKytdOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldEludDIoaW50IG9mZnNldCkgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQgKyBvZmZzZXQ7CisJCWludCB2PSBidWZmZXJbaSsrXTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQlyZXR1cm4gdjsKKwl9CisJcHVibGljIGludCBnZXRJbnQzKCkgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQ7CisJCWludCB2PSBidWZmZXJbaSsrXTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldEludDMoaW50IG9mZnNldCkgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQgKyBvZmZzZXQ7CisJCWludCB2PSBidWZmZXJbaSsrXTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldEludDQoKSB7CisJCWludCBpPSB0aGlzLm9mZnNldDsKKwkJaW50IHY9IGJ1ZmZlcltpKytdOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXY9ICh2IDw8IDgpIHwgKGJ1ZmZlcltpKytdICYgMjU1KTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQlyZXR1cm4gdjsKKwl9CisJcHVibGljIGludCBnZXRJbnQ0KGludCBvZmZzZXQpIHsKKwkJaW50IGk9IHRoaXMub2Zmc2V0ICsgb2Zmc2V0OworCQlpbnQgdj0gYnVmZmVyW2krK107CisJCXY9ICh2IDw8IDgpIHwgKGJ1ZmZlcltpKytdICYgMjU1KTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldFVJbnQxKCkgeworCQlyZXR1cm4gYnVmZmVyW3RoaXMub2Zmc2V0XSAmIDI1NTsKKwl9CisJcHVibGljIGludCBnZXRVSW50MShpbnQgb2Zmc2V0KSB7CisJCXJldHVybiBidWZmZXJbdGhpcy5vZmZzZXQgKyBvZmZzZXRdICYgMjU1OworCX0KKwlwdWJsaWMgaW50IGdldFVJbnQyKCkgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQ7CisJCWludCB2PSAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldFVJbnQyKGludCBvZmZzZXQpIHsKKwkJaW50IGk9IHRoaXMub2Zmc2V0ICsgb2Zmc2V0OworCQlpbnQgdj0gKGJ1ZmZlcltpKytdICYgMjU1KTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQlyZXR1cm4gdjsKKwl9CisJcHVibGljIGludCBnZXRVSW50MygpIHsKKwkJaW50IGk9IHRoaXMub2Zmc2V0OworCQlpbnQgdj0gKGJ1ZmZlcltpKytdICYgMjU1KTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgaW50IGdldFVJbnQzKGludCBvZmZzZXQpIHsKKwkJaW50IGk9IHRoaXMub2Zmc2V0ICsgb2Zmc2V0OworCQlpbnQgdj0gKGJ1ZmZlcltpKytdICYgMjU1KTsKKwkJdj0gKHYgPDwgOCkgfCAoYnVmZmVyW2krK10gJiAyNTUpOworCQl2PSAodiA8PCA4KSB8IChidWZmZXJbaSsrXSAmIDI1NSk7CisJCXJldHVybiB2OworCX0KKwlwdWJsaWMgY2hhcltdIGdldFVURihpbnQgb2Zmc2V0KSB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisJCWludCBwb3M9IHRoaXMub2Zmc2V0ICsgb2Zmc2V0OworCQlpbnQgdXRmbGVuPSBnZXRVSW50Mihwb3MpOworCQlwb3MgKz0gMjsKKwkJY2hhciBzdHJbXT0gbmV3IGNoYXJbdXRmbGVuXTsKKwkJaW50IGNvdW50PSAwOworCQlpbnQgc3RybGVuPSAwOworCQl3aGlsZSAoY291bnQgPCB1dGZsZW4pIHsKKwkJCWludCBjPSBidWZmZXJbcG9zKytdICYgMHhGRjsKKwkJCWludCBjaGFyMiwgY2hhcjM7CisJCQlzd2l0Y2ggKGMgPj4gNCkgeworCQkJCWNhc2UgMCA6CisJCQkJY2FzZSAxIDoKKwkJCQljYXNlIDIgOgorCQkJCWNhc2UgMyA6CisJCQkJY2FzZSA0IDoKKwkJCQljYXNlIDUgOgorCQkJCWNhc2UgNiA6CisJCQkJY2FzZSA3IDoKKwkJCQkJLy8gMHh4eHh4eHgKKwkJCQkJY291bnQrKzsKKwkJCQkJc3RyW3N0cmxlbisrXT0gKGNoYXIpIGM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTIgOgorCQkJCWNhc2UgMTMgOgorCQkJCQkvLyAxMTB4IHh4eHggICAxMHh4IHh4eHgKKwkJCQkJY291bnQgKz0gMjsKKwkJCQkJaWYgKGNvdW50ID4gdXRmbGVuKQorCQkJCQkJdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKTsKKwkJCQkJY2hhcjI9IGJ1ZmZlcltwb3MrK10gJiAweEZGOworCQkJCQlpZiAoKGNoYXIyICYgMHhDMCkgIT0gMHg4MCkKKwkJCQkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCQkJCXN0cltzdHJsZW4rK109IChjaGFyKSAoKChjICYgMHgxRikgPDwgNikgfCAoY2hhcjIgJiAweDNGKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTQgOgorCQkJCQkvLyAxMTEwIHh4eHggIDEweHggeHh4eCAgMTB4eCB4eHh4CisJCQkJCWNvdW50ICs9IDM7CisJCQkJCWlmIChjb3VudCA+IHV0ZmxlbikKKwkJCQkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCQkJCWNoYXIyPSBidWZmZXJbcG9zKytdICYgMHhGRjsKKwkJCQkJY2hhcjM9IGJ1ZmZlcltwb3MrK10gJiAweEZGOworCQkJCQlpZiAoKChjaGFyMiAmIDB4QzApICE9IDB4ODApIHx8ICgoY2hhcjMgJiAweEMwKSAhPSAweDgwKSkKKwkJCQkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCQkJCXN0cltzdHJsZW4rK109IChjaGFyKSAoKChjICYgMHgwRikgPDwgMTIpIHwgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHwgKChjaGFyMyAmIDB4M0YpIDw8IDApKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCS8vIDEweHggeHh4eCwgIDExMTEgeHh4eAorCQkJCQl0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigpOworCQkJfQorCQl9CisJCWlmIChzdHJsZW4gPCB1dGZsZW4pCisJCQlTeXN0ZW0uYXJyYXljb3B5KHN0ciwgMCwgc3RyPSBuZXcgY2hhcltzdHJsZW5dLCAwLCBzdHJsZW4pOworCQlyZXR1cm4gc3RyOworCX0KKwlwdWJsaWMgRmllbGQgaW5jKGludCBuKSB7CisJCW9mZnNldCArPSBuOworCQlyZXR1cm4gdGhpczsKKwl9CisJcHVibGljIGludCBsZW5ndGgoKSB7CisJCXJldHVybiBsZW5ndGg7CisJfQorCXB1YmxpYyBGaWVsZCBsZW5ndGgoaW50IGxlbmd0aCkgeworCQl0aGlzLmxlbmd0aD0gbGVuZ3RoOworCQlyZXR1cm4gdGhpczsKKwl9CisJLyoqCisJUmV0dXJucyB0aGUgb2Zmc2V0IGludG8gdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSB0aGF0IHRoaXMgZmllbGQgaXMgZGVmaW5lZCBvdmVyLgorCSovCisJcHVibGljIGludCBvZmZzZXQoKSB7CisJCXJldHVybiBvZmZzZXQ7CisJfQorCXB1YmxpYyBGaWVsZCBvZmZzZXQoaW50IG9mZnNldCkgeworCQl0aGlzLm9mZnNldD0gb2Zmc2V0OworCQlyZXR1cm4gdGhpczsKKwl9CisJcHVibGljIEZpZWxkIHBvaW50VG8oaW50IG9mZnNldCkgeworCQlyZXR1cm4gbmV3IEZpZWxkKGJ1ZmZlciwgdGhpcy5vZmZzZXQgKyBvZmZzZXQsIDApOworCX0KKwlwdWJsaWMgRmllbGQgcHV0KGJ5dGVbXSBiKSB7CisJCXJldHVybiBwdXQoMCwgYik7CisJfQorCXB1YmxpYyBGaWVsZCBwdXQoaW50IG9mZnNldCwgYnl0ZVtdIGIpIHsKKwkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBidWZmZXIsIHRoaXMub2Zmc2V0ICsgb2Zmc2V0LCBiLmxlbmd0aCk7CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgRmllbGQgcHV0KGludCBvZmZzZXQsIEZpZWxkIGYpIHsKKwkJU3lzdGVtLmFycmF5Y29weShmLmJ1ZmZlciwgZi5vZmZzZXQsIGJ1ZmZlciwgdGhpcy5vZmZzZXQgKyBvZmZzZXQsIGYubGVuZ3RoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBGaWVsZCBwdXQoRmllbGQgZikgeworCQlTeXN0ZW0uYXJyYXljb3B5KGYuYnVmZmVyLCBmLm9mZnNldCwgYnVmZmVyLCBvZmZzZXQsIGYubGVuZ3RoKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBGaWVsZCBwdXRJbnQxKGludCBuKSB7CisJCWJ1ZmZlcltvZmZzZXRdPSAoYnl0ZSkgKG4pOworCQlyZXR1cm4gdGhpczsKKwl9CisJcHVibGljIEZpZWxkIHB1dEludDEoaW50IG9mZnNldCwgaW50IG4pIHsKKwkJYnVmZmVyW3RoaXMub2Zmc2V0ICsgb2Zmc2V0XT0gKGJ5dGUpIChuKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBGaWVsZCBwdXRJbnQyKGludCBuKSB7CisJCWludCBpPSBvZmZzZXQ7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gOCk7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gMCk7CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgRmllbGQgcHV0SW50MihpbnQgb2Zmc2V0LCBpbnQgbikgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gOCk7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gMCk7CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgRmllbGQgcHV0SW50MyhpbnQgbikgeworCQlpbnQgaT0gb2Zmc2V0OworCQlidWZmZXJbaSsrXT0gKGJ5dGUpIChuID4+IDE2KTsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiA4KTsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiAwKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBGaWVsZCBwdXRJbnQzKGludCBvZmZzZXQsIGludCBuKSB7CisJCWludCBpPSB0aGlzLm9mZnNldCArIG9mZnNldDsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiAxNik7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gOCk7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gMCk7CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgRmllbGQgcHV0SW50NChpbnQgbikgeworCQlpbnQgaT0gb2Zmc2V0OworCQlidWZmZXJbaSsrXT0gKGJ5dGUpIChuID4+IDI0KTsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiAxNik7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gOCk7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gMCk7CisJCXJldHVybiB0aGlzOworCX0KKwlwdWJsaWMgRmllbGQgcHV0SW50NChpbnQgb2Zmc2V0LCBpbnQgbikgeworCQlpbnQgaT0gdGhpcy5vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1ZmZlcltpKytdPSAoYnl0ZSkgKG4gPj4gMjQpOworCQlidWZmZXJbaSsrXT0gKGJ5dGUpIChuID4+IDE2KTsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiA4KTsKKwkJYnVmZmVyW2krK109IChieXRlKSAobiA+PiAwKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCXB1YmxpYyBpbnQgcHV0VVRGKGludCBvZmZzZXQsIGNoYXJbXSBzdHIpIHsKKwkJaW50IHN0cmxlbj0gc3RyLmxlbmd0aDsKKwkJaW50IHV0Zmxlbj0gMDsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHN0cmxlbjsgaSsrKSB7CisJCQlpbnQgYz0gc3RyW2ldOworCQkJaWYgKChjID49IDB4MDAwMSkgJiYgKGMgPD0gMHgwMDdGKSkgeworCQkJCXV0ZmxlbisrOworCQkJfSBlbHNlIGlmIChjID4gMHgwN0ZGKSB7CisJCQkJdXRmbGVuICs9IDM7CisJCQl9IGVsc2UgeworCQkJCXV0ZmxlbiArPSAyOworCQkJfQorCQl9CisJCWlmICh1dGZsZW4gPiA2NTUzNSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJaW50IHBvcz0gdGhpcy5vZmZzZXQgKyBvZmZzZXQ7CisJCWJ1ZmZlcltwb3MrK109IChieXRlKSAoKHV0ZmxlbiA+Pj4gOCkgJiAweEZGKTsKKwkJYnVmZmVyW3BvcysrXT0gKGJ5dGUpICgodXRmbGVuID4+PiAwKSAmIDB4RkYpOworCQlmb3IgKGludCBpPSAwOyBpIDwgc3RybGVuOyBpKyspIHsKKwkJCWludCBjPSBzdHJbaV07CisJCQlpZiAoKGMgPj0gMHgwMDAxKSAmJiAoYyA8PSAweDAwN0YpKSB7CisJCQkJYnVmZmVyW3BvcysrXT0gKChieXRlKSBjKTsKKwkJCX0gZWxzZSBpZiAoYyA+IDB4MDdGRikgeworCQkJCWJ1ZmZlcltwb3MrK109ICgoYnl0ZSkgKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpKTsKKwkJCQlidWZmZXJbcG9zKytdPSAoKGJ5dGUpICgweDgwIHwgKChjID4+IDYpICYgMHgzRikpKTsKKwkJCQlidWZmZXJbcG9zKytdPSAoKGJ5dGUpICgweDgwIHwgKChjID4+IDApICYgMHgzRikpKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyW3BvcysrXT0gKChieXRlKSAoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKSk7CisJCQkJYnVmZmVyW3BvcysrXT0gKChieXRlKSAoMHg4MCB8ICgoYyA+PiAwKSAmIDB4M0YpKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDIgKyB1dGZsZW47CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZURvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlRG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EyNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZURvY3VtZW50LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgPGNvZGU+RmlsZURvY3VtZW50PC9jb2RlPiByZXByZXNlbnRzIGEgamF2YS5pby5GaWxlLgorICovCisKK3B1YmxpYyBjbGFzcyBGaWxlRG9jdW1lbnQgZXh0ZW5kcyBQcm9wZXJ0eURvY3VtZW50IHsKKwlGaWxlIGZpbGU7CisKKwlwdWJsaWMgRmlsZURvY3VtZW50KEZpbGUgZmlsZSkgeworCQlzdXBlcigpOworCQl0aGlzLmZpbGU9IGZpbGU7CisJfQorCS8qKgorCSAqIEBzZWUgSURvY3VtZW50I2dldEJ5dGVDb250ZW50CisJICovCisJcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChmaWxlKTsKKwl9CisJLyoqCisJICogQHNlZSBJRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnQKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KGZpbGUsIG51bGwpOworCX0KKwkvKioKKwkgKiBAc2VlIElEb2N1bWVudCNnZXROYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgSUluZGV4Q29uc3RhbnRzLkZJTEVfU0VQQVJBVE9SKTsKKwl9CisJLyoqCisJICogQHNlZSBJRG9jdW1lbnQjZ2V0U3RyaW5nQ29udGVudAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50KCkpOworCX0KKwkvKioKKwkgKiBAc2VlIElEb2N1bWVudCNnZXRUeXBlCisJICovCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlpbnQgbGFzdERvdD0gZmlsZS5nZXRQYXRoKCkubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGxhc3REb3QgPT0gLTEpCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZUxpc3RCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZUxpc3RCbG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlTGlzdEJsb2NrLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBGaWxlTGlzdEJsb2NrIGV4dGVuZHMgQmxvY2sgeworCisJcHJvdGVjdGVkIGludCBvZmZzZXQ9IDA7CisJcHJvdGVjdGVkIFN0cmluZyBwcmV2UGF0aD0gbnVsbDsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcGF0aHM9IG51bGw7CisKKwlwdWJsaWMgRmlsZUxpc3RCbG9jayhpbnQgYmxvY2tTaXplKSB7CisJCXN1cGVyKGJsb2NrU2l6ZSk7CisJfQorCS8qKgorCSAqIGFkZCB0aGUgbmFtZSBvZiB0aGUgaW5kZXhlZGZpbGUgdG8gdGhlIGJ1ZmZyIG9mIHRoZSBmaWVsZC4gCisJICogVGhlIG5hbWUgaXMgbm90IHRoZSBlbnRpcmUgbmFtZSBvZiB0aGUgaW5kZXhlZGZpbGUsIGJ1dCB0aGUgCisJICogZGlmZmVyZW5jZSBiZXR3ZWVuIGl0cyBuYW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgcHJldmlvdXMgaW5kZXhlZGZpbGUgLi4uCQorCSAqLworCXB1YmxpYyBib29sZWFuIGFkZEZpbGUoSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGUpIHsKKwkJaW50IG9mZnNldD0gdGhpcy5vZmZzZXQ7CisJCWlmIChpc0VtcHR5KCkpIHsKKwkJCWZpZWxkLnB1dEludDQob2Zmc2V0LCBpbmRleGVkRmlsZS5nZXRGaWxlTnVtYmVyKCkpOworCQkJb2Zmc2V0ICs9IDQ7CisJCX0KKwkJU3RyaW5nIHBhdGg9IGluZGV4ZWRGaWxlLmdldFBhdGgoKSArIGluZGV4ZWRGaWxlLnByb3BlcnRpZXNUb1N0cmluZygpOworCQlpbnQgcHJlZml4TGVuPSBwcmV2UGF0aCA9PSBudWxsID8gMCA6IFV0aWwucHJlZml4TGVuZ3RoKHByZXZQYXRoLCBwYXRoKTsKKwkJaW50IHNpemVFc3RpbWF0ZT0gMiArIDIgKyAocGF0aC5sZW5ndGgoKSAtIHByZWZpeExlbikgKiAzOworCQlpZiAob2Zmc2V0ICsgc2l6ZUVzdGltYXRlID4gYmxvY2tTaXplIC0gMikKKwkJCXJldHVybiBmYWxzZTsKKwkJZmllbGQucHV0SW50MihvZmZzZXQsIHByZWZpeExlbik7CisJCW9mZnNldCArPSAyOworCQljaGFyW10gY2hhcnM9IG5ldyBjaGFyW3BhdGgubGVuZ3RoKCkgLSBwcmVmaXhMZW5dOworCQlwYXRoLmdldENoYXJzKHByZWZpeExlbiwgcGF0aC5sZW5ndGgoKSwgY2hhcnMsIDApOworCQlvZmZzZXQgKz0gZmllbGQucHV0VVRGKG9mZnNldCwgY2hhcnMpOworCQl0aGlzLm9mZnNldD0gb2Zmc2V0OworCQlwcmV2UGF0aD0gcGF0aDsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQlyZXNldCgpOworCQlzdXBlci5jbGVhcigpOworCX0KKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKwkJaWYgKG9mZnNldCA+IDApIHsKKwkJCWZpZWxkLnB1dEludDIob2Zmc2V0LCAwKTsKKwkJCWZpZWxkLnB1dEludDIob2Zmc2V0ICsgMiwgMCk7CisJCQlvZmZzZXQ9IDA7CisJCX0KKwl9CisJcHVibGljIEluZGV4ZWRGaWxlIGdldEZpbGUoaW50IGZpbGVOdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUluZGV4ZWRGaWxlIHJlc3A9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmdbXSBwYXRocz0gZ2V0UGF0aHMoKTsKKwkJCWludCBpPSBmaWxlTnVtIC0gZmllbGQuZ2V0SW50NCgwKTsKKwkJCXJlc3A9IG5ldyBJbmRleGVkRmlsZShwYXRoc1tpXSwgZmlsZU51bSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvL2ZpbGVOdW0gdG9vIGJpZworCQl9CisJCXJldHVybiByZXNwOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGEgdmVjdG9yIG9mIHBhdGhzIHJlYWRpbmcgdGhlIGJ1ZmZlciBvZiB0aGUgZmllbGQuCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhdGhzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHBhdGhzID09IG51bGwpIHsKKwkJCUFycmF5TGlzdCB2PSBuZXcgQXJyYXlMaXN0KCk7CisJCQlpbnQgb2Zmc2V0PSA0OworCQkJY2hhcltdIHByZXZQYXRoPSBudWxsOworCQkJZm9yICg7OykgeworCQkJCWludCBwcmVmaXhMZW49IGZpZWxkLmdldFVJbnQyKG9mZnNldCk7CisJCQkJb2Zmc2V0ICs9IDI7CisJCQkJaW50IHV0Zkxlbj0gZmllbGQuZ2V0VUludDIob2Zmc2V0KTsKKwkJCQljaGFyW10gcGF0aD0gZmllbGQuZ2V0VVRGKG9mZnNldCk7CisJCQkJb2Zmc2V0ICs9IDIgKyB1dGZMZW47CisJCQkJaWYgKHByZWZpeExlbiAhPSAwKSB7CisJCQkJCWNoYXJbXSB0ZW1wPSBuZXcgY2hhcltwcmVmaXhMZW4gKyBwYXRoLmxlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJldlBhdGgsIDAsIHRlbXAsIDAsIHByZWZpeExlbik7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgdGVtcCwgcHJlZml4TGVuLCBwYXRoLmxlbmd0aCk7CisJCQkJCXBhdGg9IHRlbXA7CisJCQkJfQorCQkJCWlmIChwYXRoLmxlbmd0aCA9PSAwKQorCQkJCQlicmVhazsKKwkJCQl2LmFkZChuZXcgU3RyaW5nKHBhdGgpKTsKKwkJCQlwcmV2UGF0aD0gcGF0aDsKKwkJCX0KKwkJCXBhdGhzPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKwkJCXYudG9BcnJheShwYXRocyk7CisJCX0KKwkJcmV0dXJuIHBhdGhzOworCX0KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQlyZXR1cm4gb2Zmc2V0ID09IDA7CisJfQorCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlvZmZzZXQ9IDA7CisJCXByZXZQYXRoPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0dhbW1hQ29tcHJlc3NlZEluZGV4QmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0dhbW1hQ29tcHJlc3NlZEluZGV4QmxvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQzYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvR2FtbWFDb21wcmVzc2VkSW5kZXhCbG9jay5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOworCisvKioKKyAqIFVzZXMgcHJlZml4IGNvZGluZyBvbiB3b3JkcywgYW5kIGdhbW1hIGNvZGluZyBvZiBkb2N1bWVudCBudW1iZXJzIGRpZmZlcmVuY2VzLgorICovCitwdWJsaWMgY2xhc3MgR2FtbWFDb21wcmVzc2VkSW5kZXhCbG9jayBleHRlbmRzIEluZGV4QmxvY2sgeworCUNvZGVCeXRlU3RyZWFtIHdyaXRlQ29kZVN0cmVhbT0gbmV3IENvZGVCeXRlU3RyZWFtKCk7CisJQ29kZUJ5dGVTdHJlYW0gcmVhZENvZGVTdHJlYW07CisJY2hhcltdIHByZXZXb3JkPSBudWxsOworCWludCBvZmZzZXQ9IDA7CisKKwlwdWJsaWMgR2FtbWFDb21wcmVzc2VkSW5kZXhCbG9jayhpbnQgYmxvY2tTaXplKSB7CisJCXN1cGVyKGJsb2NrU2l6ZSk7CisJCXJlYWRDb2RlU3RyZWFtPSBuZXcgQ29kZUJ5dGVTdHJlYW0oZmllbGQuYnVmZmVyKCkpOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4QmxvY2sjYWRkRW50cnkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhZGRFbnRyeShXb3JkRW50cnkgZW50cnkpIHsKKwkJd3JpdGVDb2RlU3RyZWFtLnJlc2V0KCk7CisJCWVuY29kZUVudHJ5KGVudHJ5LCBwcmV2V29yZCwgd3JpdGVDb2RlU3RyZWFtKTsKKwkJaWYgKG9mZnNldCArIHdyaXRlQ29kZVN0cmVhbS5ieXRlTGVuZ3RoKCkgPiB0aGlzLmJsb2NrU2l6ZSAtIDIpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlieXRlW10gYnl0ZXM9IHdyaXRlQ29kZVN0cmVhbS50b0J5dGVBcnJheSgpOworCQlmaWVsZC5wdXQob2Zmc2V0LCBieXRlcyk7CisJCW9mZnNldCArPSBieXRlcy5sZW5ndGg7CisJCXByZXZXb3JkPSBlbnRyeS5nZXRXb3JkKCk7CisJCXJldHVybiB0cnVlOworCX0KKwlwcm90ZWN0ZWQgdm9pZCBlbmNvZGVFbnRyeShXb3JkRW50cnkgZW50cnksIGNoYXJbXSBwcmV2V29yZCwgQ29kZUJ5dGVTdHJlYW0gY29kZVN0cmVhbSkgeworCQljaGFyW10gd29yZD0gZW50cnkuZ2V0V29yZCgpOworCQlpbnQgcHJlZml4TGVuPSBwcmV2V29yZCA9PSBudWxsID8gMCA6IFV0aWwucHJlZml4TGVuZ3RoKHByZXZXb3JkLCB3b3JkKTsKKwkJY29kZVN0cmVhbS53cml0ZUJ5dGUocHJlZml4TGVuKTsKKwkJY29kZVN0cmVhbS53cml0ZVNtYWxsVVRGKHdvcmQsIHByZWZpeExlbiwgd29yZC5sZW5ndGgpOworCQlpbnQgbj0gZW50cnkuZ2V0TnVtUmVmcygpOworCQljb2RlU3RyZWFtLndyaXRlR2FtbWEobik7CisJCWludCBwcmV2UmVmPSAwOworCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgKytpKSB7CisJCQlpbnQgcmVmPSBlbnRyeS5nZXRSZWYoaSk7CisJCQlpZiAocmVmIDw9IHByZXZSZWYpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJY29kZVN0cmVhbS53cml0ZUdhbW1hKHJlZiAtIHByZXZSZWYpOworCQkJcHJldlJlZj0gcmVmOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhCbG9jayNmbHVzaAorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCQlpZiAob2Zmc2V0ID4gMCkgeworCQkJZmllbGQucHV0SW50MihvZmZzZXQsIDApOworCQkJb2Zmc2V0PSAwOworCQkJcHJldldvcmQ9IG51bGw7CisJCX0KKwl9CisJLyoqCisJICogQHNlZSBJbmRleEJsb2NrI2lzRW1wdHkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQlyZXR1cm4gb2Zmc2V0ID09IDA7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhCbG9jayNuZXh0RW50cnkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBuZXh0RW50cnkoV29yZEVudHJ5IGVudHJ5KSB7CisJCXRyeSB7CisJCQlyZWFkQ29kZVN0cmVhbS5yZXNldChmaWVsZC5idWZmZXIoKSwgb2Zmc2V0KTsKKwkJCWludCBwcmVmaXhMZW5ndGg9IHJlYWRDb2RlU3RyZWFtLnJlYWRCeXRlKCk7CisJCQljaGFyW10gd29yZD0gcmVhZENvZGVTdHJlYW0ucmVhZFNtYWxsVVRGKCk7CisJCQlpZiAocHJldldvcmQgIT0gbnVsbCAmJiBwcmVmaXhMZW5ndGggPiAwKSB7CisJCQkJY2hhcltdIHRlbXA9IG5ldyBjaGFyW3ByZWZpeExlbmd0aCArIHdvcmQubGVuZ3RoXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZXb3JkLCAwLCB0ZW1wLCAwLCBwcmVmaXhMZW5ndGgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkod29yZCwgMCwgdGVtcCwgcHJlZml4TGVuZ3RoLCB3b3JkLmxlbmd0aCk7CisJCQkJd29yZD0gdGVtcDsKKwkJCX0KKwkJCWlmICh3b3JkLmxlbmd0aCA9PSAwKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZW50cnkucmVzZXQod29yZCk7CisJCQlpbnQgbj0gcmVhZENvZGVTdHJlYW0ucmVhZEdhbW1hKCk7CisJCQlpbnQgcHJldlJlZj0gMDsKKwkJCWZvciAoaW50IGk9IDA7IGkgPCBuOyArK2kpIHsKKwkJCQlpbnQgcmVmPSBwcmV2UmVmICsgcmVhZENvZGVTdHJlYW0ucmVhZEdhbW1hKCk7CisJCQkJaWYgKHJlZiA8IHByZXZSZWYpCisJCQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7CisJCQkJZW50cnkuYWRkUmVmKHJlZik7CisJCQkJcHJldlJlZj0gcmVmOworCQkJfQorCQkJb2Zmc2V0PSByZWFkQ29kZVN0cmVhbS5ieXRlTGVuZ3RoKCk7CisJCQlwcmV2V29yZD0gd29yZDsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4QmxvY2sjcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJb2Zmc2V0PSAwOworCQlwcmV2V29yZD0gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUNhY2hlRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg2YTkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUNhY2hlRW51bWVyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIFRoZSA8Y29kZT5JQ2FjaGVFbnVtZXJhdGlvbjwvY29kZT4gaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgYm90aCB0aGUga2V5cyAKKyAqIGFuZCB2YWx1ZXMgaW4gYW4gTFJVQ2FjaGUuICBUaGUgPGNvZGU+Z2V0VmFsdWUoKTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIAorICogdmFsdWUgb2YgdGhlIGxhc3Qga2V5IHRvIGJlIHJldHJpZXZlZCB1c2luZyA8Y29kZT5uZXh0RWxlbWVudCgpPC9jb2RlPi4gIAorICogVGhlIDxjb2RlPm5leHRFbGVtZW50KCk8L2NvZGU+IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIAorICogPGNvZGU+Z2V0VmFsdWUoKTwvY29kZT4gbWV0aG9kLgorICoKKyAqIDxwPlRoZSBpdGVyYXRpb24gY2FuIGJlIG1hZGUgZWZmaWNpZW50IGJ5IG1ha2luZyB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB2YWx1ZXMgaW4gCisgKiB0aGUgY2FjaGUgKGluc3RhbmNlcyBvZiA8Y29kZT5MUlVDYWNoZUVudHJ5PC9jb2RlPiksIGtub3cgdGhlaXIga2V5LiAgRm9yIHRoaXMgcmVhc29uLAorICogSGFzaHRhYmxlIGxvb2t1cHMgZG9uJ3QgaGF2ZSB0byBiZSBtYWRlIGF0IGVhY2ggc3RlcCBvZiB0aGUgaXRlcmF0aW9uLgorICoKKyAqIDxwPk1vZGlmaWNhdGlvbnMgdG8gdGhlIGNhY2hlIG11c3Qgbm90IGJlIHBlcmZvcm1lZCB3aGlsZSB1c2luZyB0aGUKKyAqIGVudW1lcmF0aW9uLiAgRG9pbmcgc28gd2lsbCBsZWFkIHRvIGFuIGlsbGVnYWwgc3RhdGUuCisgKgorICogQHNlZSBMUlVDYWNoZQorICovCitwdWJsaWMgaW50ZXJmYWNlIElDYWNoZUVudW1lcmF0aW9uIGV4dGVuZHMgRW51bWVyYXRpb24geworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91c2x5IGFjY2Vzc2VkIGtleSBpbiB0aGUgZW51bWVyYXRpb24uCisJICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIG5leHRFbGVtZW50KCkuCisJICoKKwkgKiBAcmV0dXJuIFZhbHVlIG9mIGN1cnJlbnQgY2FjaGUgZW50cnkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JRmlsZURvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JRmlsZURvY3VtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhZDg4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lGaWxlRG9jdW1lbnQuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKKworLyoqCisgKiBBbiA8Y29kZT5JRmlsZURvY3VtZW50PC9jb2RlPiByZXByZXNlbnRzIGFuIElGaWxlLgorICovCisKK3B1YmxpYyBjbGFzcyBJRmlsZURvY3VtZW50IGV4dGVuZHMgUHJvcGVydHlEb2N1bWVudCB7CisJcHJvdGVjdGVkIElGaWxlIGZpbGU7CisKKwkvLyBjYWNoZWQgY29udGVudHMgaWYgbmVlZGVkIC0gb25seSBvbmUgb2YgdGhlbSBpcyB1c2VkIGF0IGEgdGltZQorCXByb3RlY3RlZCBjaGFyW10gY2hhckNvbnRlbnRzOworCXByb3RlY3RlZCBieXRlW10gYnl0ZUNvbnRlbnRzOworCS8qKgorCSAqIElGaWxlRG9jdW1lbnQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgSUZpbGVEb2N1bWVudChJRmlsZSBmaWxlKSB7CisJCXRoaXMoZmlsZSwgKGNoYXJbXSludWxsKTsKKwl9CisJLyoqCisJICogSUZpbGVEb2N1bWVudCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBJRmlsZURvY3VtZW50KElGaWxlIGZpbGUsIGJ5dGVbXSBieXRlQ29udGVudHMpIHsKKwkJdGhpcy5maWxlPSBmaWxlOworCQl0aGlzLmJ5dGVDb250ZW50cz0gYnl0ZUNvbnRlbnRzOworCX0KKwkvKioKKwkgKiBJRmlsZURvY3VtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIElGaWxlRG9jdW1lbnQoSUZpbGUgZmlsZSwgY2hhcltdIGNoYXJDb250ZW50cykgeworCQl0aGlzLmZpbGU9IGZpbGU7CisJCXRoaXMuY2hhckNvbnRlbnRzPSBjaGFyQ29udGVudHM7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEJ5dGVDb250ZW50KCkKKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJ5dGVDb250ZW50cyAhPSBudWxsKSByZXR1cm4gYnl0ZUNvbnRlbnRzOworCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKKwkJaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBuZXcgYnl0ZVswXTsKKwkJcmV0dXJuIGJ5dGVDb250ZW50cyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KGxvY2F0aW9uLnRvRmlsZSgpKTsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnQoKQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoY2hhckNvbnRlbnRzICE9IG51bGwpIHJldHVybiBjaGFyQ29udGVudHM7CisJCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOworCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIG5ldyBjaGFyWzBdOworCQlyZXR1cm4gY2hhckNvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobG9jYXRpb24udG9GaWxlKCksIG51bGwpOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQjZ2V0U3RyaW5nQ29udGVudCgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmdDb250ZW50KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFN0cmluZyhnZXRDaGFyQ29udGVudCgpKTsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQjZ2V0VHlwZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlTdHJpbmcgZXh0ZW5zaW9uPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBleHRlbnNpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JSW5kZXhDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU2YThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBjb25zdGFudHMgdXNlZCBieSB0aGUgc2VhcmNoIGVuZ2luZS4KKyAqLworcHVibGljIGludGVyZmFjZSBJSW5kZXhDb25zdGFudHMgeworCS8qKgorCSAqIFRoZSBzaWduYXR1cmUgb2YgdGhlIGluZGV4IGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFPSAiSU5ERVggRklMRSAwLjAwNyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBpbmRleCBmaWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGSUxFX1NFUEFSQVRPUj0gJy8nOworCS8qKgorCSAqIFRoZSBzaXplIG9mIGEgYmxvY2sgZm9yIGEgPGNvZGU+QmxvY2s8L2NvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1NJWkU9IDgxOTI7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JTFJVQ2FjaGVhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JTFJVQ2FjaGVhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNGJiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lMUlVDYWNoZWFibGUuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCisvKioKKyAqIFR5cGVzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBjYW4gb2NjdXB5IGEgdmFyaWFibGUgYW1vdW50IG9mIHNwYWNlCisgKiBpbiBhbiBMUlVDYWNoZS4gIENhY2hlZCBpdGVtcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYXJlCisgKiBjb25zaWRlcmVkIHRvIG9jY3VweSBvbmUgdW5pdCBvZiBzcGFjZS4KKyAqCisgKiBAc2VlIExSVUNhY2hlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUxSVUNhY2hlYWJsZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgc3BhY2UgdGhlIHJlY2VpdmVyIGNvbnN1bWVzIGluIGFuIExSVSBDYWNoZS4gIFRoZSBkZWZhdWx0IHNwYWNlCisJICogdmFsdWUgaXMgMS4KKwkgKgorCSAqIEByZXR1cm4gaW50IEFtb3VudCBvZiBjYWNoZSBzcGFjZSB0YWtlbiBieSB0aGUgcmVjZWl2ZXIKKwkgKi8KKwlwdWJsaWMgaW50IGdldENhY2hlRm9vdHByaW50KCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Jbk1lbW9yeUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Jbk1lbW9yeUluZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMTI5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luTWVtb3J5SW5kZXguamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OworCisvKioKKyAqIFRoaXMgaW5kZXggc3RvcmVzIHRoZSBkb2N1bWVudCBuYW1lcyBpbiBhbiA8Y29kZT5PYmplY3RWZWN0b3I8L2NvZGU+LCBhbmQgdGhlIHdvcmRzIGluCisgKiBhbiA8Y29kZT5IYXNodGFibGVPZk9iamVjdHM8L2NvZGU+LgorICovCisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeUluZGV4IHsKKworCS8qKgorCSAqIGhhc2h0YWJsZSBvZiBXb3JkRW50cnlzID0gd29yZHMrbnVtYmVycyBvZiB0aGUgZmlsZXMgdGhleSBhcHBlYXIgaW4uCisJICovCisJcHJvdGVjdGVkIFdvcmRFbnRyeUhhc2hlZEFycmF5IHdvcmRzOworCisJLyoqCisJICogTGlzdCBvZiBJbmRleGVkRmlsZXMgPSBmaWxlIG5hbWUgKyBhIHVuaXF1ZSBudW1iZXIuCisJICovCisJcHJvdGVjdGVkIEluZGV4ZWRGaWxlSGFzaGVkQXJyYXkgZmlsZXM7CisKKwkvKioKKwkgKiBTaXplIG9mIHRoZSBpbmRleC4KKwkgKi8KKwlwcm90ZWN0ZWQgbG9uZyBmb290cHJpbnQ7CisKKwlwcml2YXRlIFdvcmRFbnRyeVtdIHNvcnRlZFdvcmRFbnRyaWVzOworCXByaXZhdGUgSW5kZXhlZEZpbGVbXSBzb3J0ZWRGaWxlczsKKwlwdWJsaWMgSW5NZW1vcnlJbmRleCgpIHsKKwkJaW5pdCgpOworCX0KKworCXB1YmxpYyBJbmRleGVkRmlsZSBhZGREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGU9IHRoaXMuZmlsZXMuYWRkKGRvY3VtZW50KTsKKwkJdGhpcy5mb290cHJpbnQgKz0gaW5kZXhlZEZpbGUuZm9vdHByaW50KCkgKyA0OworCQl0aGlzLnNvcnRlZEZpbGVzID0gbnVsbDsKKwkJcmV0dXJuIGluZGV4ZWRGaWxlOworCX0KKwkvKioKKwkgKiBBZGRzIHRoZSByZWZlcmVuY2VzIG9mIHRoZSB3b3JkIHRvIHRoZSBpbmRleCAocmVmZXJlbmNlID0gbnVtYmVyIG9mIHRoZSBmaWxlIHRoZSB3b3JkIGJlbG9uZ3MgdG8pLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlZihjaGFyW10gd29yZCwgaW50W10gcmVmZXJlbmNlcykgeworCQlpbnQgc2l6ZT0gcmVmZXJlbmNlcy5sZW5ndGg7CisJCWludCBpPSAwOworCQl3aGlsZSAoaSA8IHNpemUpIHsKKwkJCWlmIChyZWZlcmVuY2VzW2ldICE9IDApCisJCQkJYWRkUmVmKHdvcmQsIHJlZmVyZW5jZXNbaV0pOworCQkJaSsrOworCQl9CisJfQorCS8qKgorCSAqIExvb2tzIGlmIHRoZSB3b3JkIGFscmVhZHkgZXhpc3RzIGluIHRoZSBpbmRleCBhbmQgYWRkIHRoZSBmaWxlTnVtIHRvIHRoaXMgd29yZC4KKwkgKiBJZiB0aGUgd29yZCBkb2VzIG5vdCBleGlzdCwgaXQgYWRkcyBpdCBpbiB0aGUgaW5kZXguCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVmKGNoYXJbXSB3b3JkLCBpbnQgZmlsZU51bSkgeworCQl3b3JkPSBwcmVwcm9jZXNzV29yZCh3b3JkKTsKKwkJV29yZEVudHJ5IGVudHJ5PSAoV29yZEVudHJ5KSB0aGlzLndvcmRzLmdldCh3b3JkKTsKKwkJaWYgKGVudHJ5ID09IG51bGwpIHsKKwkJCWVudHJ5PSBuZXcgV29yZEVudHJ5KHdvcmQpOworCQkJZW50cnkuYWRkUmVmKGZpbGVOdW0pOworCQkJdGhpcy53b3Jkcy5hZGQoZW50cnkpOworCQkJdGhpcy5zb3J0ZWRXb3JkRW50cmllcz0gbnVsbDsKKwkJCXRoaXMuZm9vdHByaW50ICs9IGVudHJ5LmZvb3RwcmludCgpOworCQl9IGVsc2UgeworCQkJdGhpcy5mb290cHJpbnQgKz0gZW50cnkuYWRkUmVmKGZpbGVOdW0pOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkUmVmKEluZGV4ZWRGaWxlIGluZGV4ZWRGaWxlLCBjaGFyW10gd29yZCkgeworCQlhZGRSZWYod29yZCwgaW5kZXhlZEZpbGUuZ2V0RmlsZU51bWJlcigpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSZWYoSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGUsIFN0cmluZyB3b3JkKSB7CisJCWFkZFJlZih3b3JkLnRvQ2hhckFycmF5KCksIGluZGV4ZWRGaWxlLmdldEZpbGVOdW1iZXIoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZm9vdHByaW50IG9mIHRoZSBpbmRleC4KKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRGb290cHJpbnQoKSB7CisJCXJldHVybiB0aGlzLmZvb3RwcmludDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmRleGVkIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCwgb3IgbnVsbCBpZiBzdWNoIGZpbGUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIEluZGV4ZWRGaWxlIGdldEluZGV4ZWRGaWxlKFN0cmluZyBwYXRoKSB7CisJCXJldHVybiBmaWxlcy5nZXQocGF0aCk7CisJfQorCisJLyoqCisJICogQHNlZSBJSW5kZXgjZ2V0TnVtRG9jdW1lbnRzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bUZpbGVzKCkgeworCQlyZXR1cm4gZmlsZXMuc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgSUluZGV4I2dldE51bVdvcmRzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgeworCQlyZXR1cm4gd29yZHMuZWxlbWVudFNpemU7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHdvcmRzIGNvbnRhaW5lZCBpbiB0aGUgaGFzaHRhYmxlIG9mIHdvcmRzLCBzb3J0ZWQgYnkgYWxwaGFiZXRpY2FsIG9yZGVyLgorCSAqLworCXByb3RlY3RlZCBJbmRleGVkRmlsZVtdIGdldFNvcnRlZEZpbGVzKCkgeworCQlpZiAodGhpcy5zb3J0ZWRGaWxlcyA9PSBudWxsKSB7CisJCQlJbmRleGVkRmlsZVtdIGluZGV4ZWRGaWxlcz0gZmlsZXMuYXNBcnJheSgpOworCQkJVXRpbC5zb3J0KGluZGV4ZWRGaWxlcyk7CisJCQl0aGlzLnNvcnRlZEZpbGVzPSBpbmRleGVkRmlsZXM7CisJCX0KKwkJcmV0dXJuIHRoaXMuc29ydGVkRmlsZXM7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHdvcmQgZW50cmllcyBjb250YWluZWQgaW4gdGhlIGhhc2h0YWJsZSBvZiB3b3Jkcywgc29ydGVkIGJ5IGFscGhhYmV0aWNhbCBvcmRlci4KKwkgKi8KKwlwcm90ZWN0ZWQgV29yZEVudHJ5W10gZ2V0U29ydGVkV29yZEVudHJpZXMoKSB7CisJCWlmICh0aGlzLnNvcnRlZFdvcmRFbnRyaWVzID09IG51bGwpIHsKKwkJCVdvcmRFbnRyeVtdIHdvcmRzPSB0aGlzLndvcmRzLmFzQXJyYXkoKTsKKwkJCVV0aWwuc29ydCh3b3Jkcyk7CisJCQl0aGlzLnNvcnRlZFdvcmRFbnRyaWVzPSB3b3JkczsKKwkJfQorCQlyZXR1cm4gdGhpcy5zb3J0ZWRXb3JkRW50cmllczsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgd29yZCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB3b3JkLgorCSAqLworCXByb3RlY3RlZCBXb3JkRW50cnkgZ2V0V29yZEVudHJ5KGNoYXJbXSB3b3JkKSB7CisJCXJldHVybiAoV29yZEVudHJ5KSB3b3Jkcy5nZXQod29yZCk7CisJfQorCS8qKgorCSAqIEluaXRpYWxpc2VzIHRoZSBmaWVsZHMgb2YgdGhlIGluZGV4CisJICovCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJd29yZHM9IG5ldyBXb3JkRW50cnlIYXNoZWRBcnJheSg1MDEpOworCQlmaWxlcz0gbmV3IEluZGV4ZWRGaWxlSGFzaGVkQXJyYXkoMTAxKTsKKwkJZm9vdHByaW50PSAwOworCQlzb3J0ZWRXb3JkRW50cmllcz0gbnVsbDsKKwkJc29ydGVkRmlsZXM9IG51bGw7CisJfQorCXByb3RlY3RlZCBjaGFyW10gcHJlcHJvY2Vzc1dvcmQoY2hhcltdIHdvcmQpIHsKKwkJaWYgKHdvcmQubGVuZ3RoID4gMjU1KSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHdvcmQsIDAsIHdvcmQ9IG5ldyBjaGFyWzI1NV0sIDAsIDI1NSk7CisJCX0KKwkJcmV0dXJuIHdvcmQ7CisJfQorCS8qKgorCSAqIFNhdmVzIHRoZSBpbmRleCBpbiB0aGUgZ2l2ZW4gZmlsZS4KKwkgKiBTdHJ1Y3R1cmUgb2YgdGhlIHNhdmVkIEluZGV4IDoKKwkgKiAgIC0gSW5kZXhlZEZpbGVzIGluIHNvcnRlZCBvcmRlci4KKwkgKgkJKyBleGFtcGxlOiAKKwkgKgkJCSJjOi9jb20vVGVzdC5qYXZhIDEiCisJICoJCQkiYzovY29tL1VJLmphdmEgMiIKKwkgKiAgIC0gUmVmZXJlbmNlcyB3aXRoIHRoZSB3b3JkcyBpbiBzb3J0ZWQgb3JkZXIKKwkgKgkJKyBleGFtcGxlOiAKKwkgKgkJCSJjbGFzc0RlY2wvVGVzdCAxIgorCSAqCQkJImNsYXNzRGVjbC9VSSAyIgorCSAqCQkJInJlZi9TdHJpbmcgMSAyIgorCSAqLworCisJcHVibGljIHZvaWQgc2F2ZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUJsb2Nrc0luZGV4T3V0cHV0IG91dHB1dD0gbmV3IEJsb2Nrc0luZGV4T3V0cHV0KGZpbGUpOworCQlzYXZlKG91dHB1dCk7CisJfQorCS8qKgorCSAqIFNhdmVzIHRoZSBpbmRleCBpbiB0aGUgZ2l2ZW4gSW5kZXhPdXRwdXQuCisJICogU3RydWN0dXJlIG9mIHRoZSBzYXZlZCBJbmRleCA6CisJICogICAtIEluZGV4ZWRGaWxlcyBpbiBzb3J0ZWQgb3JkZXIuCisJICoJCSsgZXhhbXBsZTogCisJICoJCQkiYzovY29tL1Rlc3QuamF2YSAxIgorCSAqCQkJImM6L2NvbS9VSS5qYXZhIDIiCisJICogICAtIFJlZmVyZW5jZXMgd2l0aCB0aGUgd29yZHMgaW4gc29ydGVkIG9yZGVyCisJICoJCSsgZXhhbXBsZTogCisJICoJCQkiY2xhc3NEZWNsL1Rlc3QgMSIKKwkgKgkJCSJjbGFzc0RlY2wvVUkgMiIKKwkgKgkJCSJyZWYvU3RyaW5nIDEgMiIKKwkgKi8KKworCXByb3RlY3RlZCB2b2lkIHNhdmUoSW5kZXhPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlib29sZWFuIG9rPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCW91dHB1dC5vcGVuKCk7CisJCQlJbmRleGVkRmlsZVtdIGluZGV4ZWRGaWxlcz0gZmlsZXMuYXNBcnJheSgpOworCQkJZm9yIChpbnQgaT0gMCwgbGVuZ3RoID0gaW5kZXhlZEZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKQorCQkJCW91dHB1dC5hZGRGaWxlKGluZGV4ZWRGaWxlc1tpXSk7IC8vIHdyaXR0ZW4gb3V0IGluIG9yZGVyIEJVVCBub3QgYWxwaGFiZXRpY2FsCisJCQlnZXRTb3J0ZWRXb3JkRW50cmllcygpOyAvLyBpbml0IHRoZSBzbG90CisJCQlmb3IgKGludCBpPSAwLCBudW1Xb3Jkcz0gc29ydGVkV29yZEVudHJpZXMubGVuZ3RoOyBpIDwgbnVtV29yZHM7ICsraSkKKwkJCQlvdXRwdXQuYWRkV29yZChzb3J0ZWRXb3JkRW50cmllc1tpXSk7CisJCQlvdXRwdXQuZmx1c2goKTsKKwkJCW91dHB1dC5jbG9zZSgpOworCQkJb2s9IHRydWU7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIW9rICYmIG91dHB1dCAhPSBudWxsKQorCQkJCW91dHB1dC5jbG9zZSgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYmU2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4LmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OworCisvKioKKyAqIEFuIEluZGV4IGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluZGV4IG9uIHRoZSBkaXNrLCBhbmQgdG8gbWFrZSBxdWVyaWVzLiBJdCB1c2VzIGEgc2V0IG9mIAorICogaW5kZXhlcnMgYW5kIGEgbWVyZ2VGYWN0b3J5LiBUaGUgaW5kZXggZmlsbHMgYW4gaW5NZW1vcnlJbmRleCB1cCAKKyAqIHRvIGl0IHJlYWNoZXMgYSBjZXJ0YWluIHNpemUsIGFuZCB0aGVuIG1lcmdlcyBpdCB3aXRoIGEgbWFpbiBpbmRleCBvbiB0aGUgZGlzay4KKyAqIDxicj4gPGJyPgorICogVGhlIGNoYW5nZXMgYXJlIG9ubHkgdGFrZW4gaW50byBhY2NvdW50IGJ5IHRoZSBxdWVyaWVzIGFmdGVyIGEgbWVyZ2UuCisgKi8KKworcHVibGljIGNsYXNzIEluZGV4IGltcGxlbWVudHMgSUluZGV4IHsKKwkvKioKKwkgKiBNYXhpbXVtIHNpemUgb2YgdGhlIGluZGV4IGluIG1lbW9yeS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfRk9PVFBSSU5UPSAxMDAwMDAwMDsKKworCS8qKgorCSAqIEluZGV4IGluIG1lbW9yeSwgd2hvIGlzIG1lcmdlZCB3aXRoIG1haW5JbmRleCBlYWNoIHRpbWVzIGl0IAorCSAqIHJlYWNoZXMgYSBjZXJ0YWluIHNpemUuCisJICovCisJcHJvdGVjdGVkIEluTWVtb3J5SW5kZXggYWRkc0luZGV4OworCXByb3RlY3RlZCBJbmRleElucHV0IGFkZHNJbmRleElucHV0OworCisJLyoqCisJICogU3RhdGUgb2YgdGhlIGluZGV4R2VuZXJhdG9yOiBhZGRzSW5kZXggZW1wdHkgPD0+IE1FUkdFRCwgb3IKKwkgKiBhZGRzSW5kZXggbm90IGVtcHR5IDw9PiBDQU5fTUVSR0UKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHN0YXRlOworCisJLyoqCisJICogRmlsZXMgcmVtb3ZlZCBmb3JtIHRoZSBhZGRzSW5kZXguCisJICovCisJcHJvdGVjdGVkIE1hcCByZW1vdmVkSW5BZGRzOworCisJLyoqCisJICogRmlsZXMgcmVtb3ZlZCBmb3JtIHRoZSBvbGRJbmRleC4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIHJlbW92ZWRJbk9sZDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDQU5fTUVSR0U9IDA7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VEPSAxOworCXByaXZhdGUgRmlsZSBpbmRleEZpbGU7CisKKwkvKioKKwkgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbmRleC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyB0b1N0cmluZzsKKwlwdWJsaWMgSW5kZXgoRmlsZSBpbmRleERpcmVjdG9yeSwgYm9vbGVhbiByZXVzZUV4aXN0aW5nRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhpbmRleERpcmVjdG9yeSwiLmluZGV4IiwgcmV1c2VFeGlzdGluZ0ZpbGUpOyAvLyROT04tTkxTLTEkCisJfQorCXB1YmxpYyBJbmRleChGaWxlIGluZGV4RGlyZWN0b3J5LCBTdHJpbmcgaW5kZXhOYW1lLCBib29sZWFuIHJldXNlRXhpc3RpbmdGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlzdXBlcigpOworCQlzdGF0ZT0gTUVSR0VEOworCQlpbmRleEZpbGU9IG5ldyBGaWxlKGluZGV4RGlyZWN0b3J5LCBpbmRleE5hbWUpOworCQlpbml0aWFsaXplKHJldXNlRXhpc3RpbmdGaWxlKTsKKwl9CisJcHVibGljIEluZGV4KFN0cmluZyBpbmRleE5hbWUsIGJvb2xlYW4gcmV1c2VFeGlzdGluZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoaW5kZXhOYW1lLCBudWxsLCByZXVzZUV4aXN0aW5nRmlsZSk7CisJfQorCXB1YmxpYyBJbmRleChTdHJpbmcgaW5kZXhOYW1lLCBTdHJpbmcgdG9TdHJpbmcsIGJvb2xlYW4gcmV1c2VFeGlzdGluZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXN1cGVyKCk7CisJCXN0YXRlPSBNRVJHRUQ7CisJCWluZGV4RmlsZT0gbmV3IEZpbGUoaW5kZXhOYW1lKTsKKwkJdGhpcy50b1N0cmluZyA9IHRvU3RyaW5nOworCQlpbml0aWFsaXplKHJldXNlRXhpc3RpbmdGaWxlKTsKKwl9CisJLyoqCisJICogSW5kZXhlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBpbmRleGVyIHJlZ2lzdGVyZWQgaW4gdGhlIGluZGV4ZXJSZWdpc3RyeS4KKwkgKiBJZiB0aGUgZG9jdW1lbnQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGluZGV4LCBpdCBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZS4gVGhlIGNoYW5nZXMgd2lsbCBiZSAKKwkgKiB0YWtlbiBpbnRvIGFjY291bnQgYWZ0ZXIgYSBtZXJnZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoSURvY3VtZW50IGRvY3VtZW50LCBJSW5kZXhlciBpbmRleGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAodGltZVRvTWVyZ2UoKSkgeworCQkJbWVyZ2UoKTsKKwkJfQorCQlJbmRleGVkRmlsZSBpbmRleGVkRmlsZT0gYWRkc0luZGV4LmdldEluZGV4ZWRGaWxlKGRvY3VtZW50LmdldE5hbWUoKSk7CisJCWlmIChpbmRleGVkRmlsZSAhPSBudWxsIC8qJiYgcmVtb3ZlZEluQWRkcy5nZXQoZG9jdW1lbnQuZ2V0TmFtZSgpKSA9PSBudWxsKi8KKwkJCSkKKwkJCXJlbW92ZShpbmRleGVkRmlsZSwgTWVyZ2VGYWN0b3J5LkFERFNfSU5ERVgpOworCQlJbmRleGVyT3V0cHV0IG91dHB1dD0gbmV3IEluZGV4ZXJPdXRwdXQoYWRkc0luZGV4KTsKKwkJaW5kZXhlci5pbmRleChkb2N1bWVudCwgb3V0cHV0KTsKKwkJc3RhdGU9IENBTl9NRVJHRTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbmRleCBpbiBtZW1vcnkgaXMgbm90IGVtcHR5LCBzbyAKKwkgKiBtZXJnZSgpIGNhbiBiZSBjYWxsZWQgdG8gZmlsbCB0aGUgbWFpbkluZGV4IHdpdGggdGhlIGZpbGVzIGFuZCB3b3JkcworCSAqIGNvbnRhaW5lZCBpbiB0aGUgYWRkc0luZGV4LiAKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5NZXJnZSgpIHsKKwkJcmV0dXJuIHN0YXRlID09IENBTl9NRVJHRTsKKwl9CisJLyoqCisJICogSW5pdGlhbGlzZXMgdGhlIGluZGV4R2VuZXJhdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIGVtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKXsKKwkJCWluZGV4RmlsZS5kZWxldGUoKTsKKwkJCS8vaW5pdGlhbGlzYXRpb24gb2YgbWFpbkluZGV4CisJCQlJbk1lbW9yeUluZGV4IG1haW5JbmRleD0gbmV3IEluTWVtb3J5SW5kZXgoKTsKKwkJCUluZGV4T3V0cHV0IG1haW5JbmRleE91dHB1dD0gbmV3IEJsb2Nrc0luZGV4T3V0cHV0KGluZGV4RmlsZSk7CisJCQlpZiAoIWluZGV4RmlsZS5leGlzdHMoKSkKKwkJCQltYWluSW5kZXguc2F2ZShtYWluSW5kZXhPdXRwdXQpOworCQl9CisKKwkJLy9pbml0aWFsaXNhdGlvbiBvZiBhZGRzSW5kZXgKKwkJYWRkc0luZGV4PSBuZXcgSW5NZW1vcnlJbmRleCgpOworCQlhZGRzSW5kZXhJbnB1dD0gbmV3IFNpbXBsZUluZGV4SW5wdXQoYWRkc0luZGV4KTsKKworCQkvL3ZlY3RvcnMgd2hvIGtlZXAgdHJhY2sgb2YgdGhlIHJlbW92ZWQgRmlsZXMKKwkJcmVtb3ZlZEluQWRkcz0gbmV3IEhhc2hNYXAoMTEpOworCQlyZW1vdmVkSW5PbGQ9IG5ldyBIYXNoTWFwKDExKTsKKwl9CisJLyoqCisJICogQHNlZSBJSW5kZXgjZ2V0SW5kZXhGaWxlCisJICovCisJcHVibGljIEZpbGUgZ2V0SW5kZXhGaWxlKCkgeworCQlyZXR1cm4gaW5kZXhGaWxlOworCX0KKwkvKioKKwkgKiBAc2VlIElJbmRleCNnZXROdW1Eb2N1bWVudHMKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bURvY3VtZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vc2F2ZSgpOworCQlJbmRleElucHV0IGlucHV0PSBuZXcgQmxvY2tzSW5kZXhJbnB1dChpbmRleEZpbGUpOworCQl0cnkgeworCQkJaW5wdXQub3BlbigpOworCQkJcmV0dXJuIGlucHV0LmdldE51bUZpbGVzKCk7CisJCX0gZmluYWxseSB7CisJCQlpbnB1dC5jbG9zZSgpOworCQl9CQkKKwl9CisJLyoqCisJICogQHNlZSBJSW5kZXgjZ2V0TnVtV29yZHMKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9zYXZlKCk7CisJCUluZGV4SW5wdXQgaW5wdXQ9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4RmlsZSk7CisJCXRyeSB7CisJCQlpbnB1dC5vcGVuKCk7CisJCQlyZXR1cm4gaW5wdXQuZ2V0TnVtV29yZHMoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlucHV0LmNsb3NlKCk7CisJCX0JCQorCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBkb2N1bWVudCBudW1iZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoaW50IGRvY3VtZW50TnVtYmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvL3NhdmUoKTsKKwkJSW5kZXhJbnB1dCBpbnB1dD0gbmV3IEJsb2Nrc0luZGV4SW5wdXQoaW5kZXhGaWxlKTsKKwkJdHJ5IHsKKwkJCWlucHV0Lm9wZW4oKTsKKwkJCUluZGV4ZWRGaWxlIGZpbGUgPSBpbnB1dC5nZXRJbmRleGVkRmlsZShkb2N1bWVudE51bWJlcik7CisJCQlpZiAoZmlsZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCXJldHVybiBmaWxlLmdldFBhdGgoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlucHV0LmNsb3NlKCk7CisJCX0JCQorCX0KKwkvKioKKwkgKiBzZWUgSUluZGV4Lmhhc0NoYW5nZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKCkgeworCQlyZXR1cm4gY2FuTWVyZ2UoKTsKKwl9CisJLyoqCisJICogSW5pdGlhbGlzZXMgdGhlIGluZGV4R2VuZXJhdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoYm9vbGVhbiByZXVzZUV4aXN0aW5nRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCisJCS8vaW5pdGlhbGlzYXRpb24gb2YgYWRkc0luZGV4CisJCWFkZHNJbmRleD0gbmV3IEluTWVtb3J5SW5kZXgoKTsKKwkJYWRkc0luZGV4SW5wdXQ9IG5ldyBTaW1wbGVJbmRleElucHV0KGFkZHNJbmRleCk7CisKKwkJLy92ZWN0b3JzIHdobyBrZWVwIHRyYWNrIG9mIHRoZSByZW1vdmVkIEZpbGVzCisJCXJlbW92ZWRJbkFkZHM9IG5ldyBIYXNoTWFwKDExKTsKKwkJcmVtb3ZlZEluT2xkPSBuZXcgSGFzaE1hcCgxMSk7CisKKwkJLy8gY2hlY2sgd2hldGhlciBleGlzdGluZyBpbmRleCBmaWxlIGNhbiBiZSByZWFkCisJCWlmIChyZXVzZUV4aXN0aW5nRmlsZSAmJiBpbmRleEZpbGUuZXhpc3RzKCkpIHsKKwkJCUluZGV4SW5wdXQgbWFpbkluZGV4SW5wdXQ9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4RmlsZSk7CisJCQl0cnkgeworCQkJCW1haW5JbmRleElucHV0Lm9wZW4oKTsKKwkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCQkJCUJsb2Nrc0luZGV4SW5wdXQgaW5wdXQgPSAoQmxvY2tzSW5kZXhJbnB1dCltYWluSW5kZXhJbnB1dDsKKwkJCQl0cnkgeworCQkJCQlpbnB1dC5vcGVuZWQgPSB0cnVlOworCQkJCQlpbnB1dC5jbG9zZSgpOworCQkJCX0gZmluYWxseSB7CisJCQkJCWlucHV0Lm9wZW5lZCA9IGZhbHNlOworCQkJCX0KKwkJCQlpbmRleEZpbGUuZGVsZXRlKCk7CisJCQkJaWYgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5VdGlsLmJpbmQoImV4Y2VwdGlvbi53cm9uZ0Zvcm1hdCIpLmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlJbk1lbW9yeUluZGV4IG1haW5JbmRleD0gbmV3IEluTWVtb3J5SW5kZXgoKTsJCQkKKwkJCQkJSW5kZXhPdXRwdXQgbWFpbkluZGV4T3V0cHV0PSBuZXcgQmxvY2tzSW5kZXhPdXRwdXQoaW5kZXhGaWxlKTsKKwkJCQkJbWFpbkluZGV4LnNhdmUobWFpbkluZGV4T3V0cHV0KTsKKwkJCQl9IGVsc2UgeworCQkJCQltYWluSW5kZXhJbnB1dCA9IG51bGw7CisJCQkJCXRocm93IGU7CisJCQkJfQorCQkJfQorCQkJbWFpbkluZGV4SW5wdXQuY2xvc2UoKTsKKwkJfSBlbHNlIHsKKwkJCUluTWVtb3J5SW5kZXggbWFpbkluZGV4PSBuZXcgSW5NZW1vcnlJbmRleCgpOwkJCQorCQkJSW5kZXhPdXRwdXQgbWFpbkluZGV4T3V0cHV0PSBuZXcgQmxvY2tzSW5kZXhPdXRwdXQoaW5kZXhGaWxlKTsKKwkJCW1haW5JbmRleC5zYXZlKG1haW5JbmRleE91dHB1dCk7CisJCX0KKwl9CisJLyoqCisJICogTWVyZ2VzIHRoZSBpbiBtZW1vcnkgaW5kZXggYW5kIHRoZSBpbmRleCBvbiB0aGUgZGlzaywgYW5kIHNhdmVzIHRoZSByZXN1bHRzIG9uIHRoZSBkaXNrLgorCSAqLworCXByb3RlY3RlZCB2b2lkIG1lcmdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm1lcmdlIik7CisKKwkJLy9pbml0aWFsaXNhdGlvbiBvZiB0ZW1wSW5kZXgKKwkJRmlsZSB0ZW1wRmlsZT0gbmV3IEZpbGUoaW5kZXhGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlRlbXBWQSIpOyAvLyROT04tTkxTLTEkCisKKwkJSW5kZXhJbnB1dCBtYWluSW5kZXhJbnB1dD0gbmV3IEJsb2Nrc0luZGV4SW5wdXQoaW5kZXhGaWxlKTsKKwkJQmxvY2tzSW5kZXhPdXRwdXQgdGVtcEluZGV4T3V0cHV0PSBuZXcgQmxvY2tzSW5kZXhPdXRwdXQodGVtcEZpbGUpOworCisJCXRyeSB7CisJCQkvL2ludm9rZSBhIG1lcmdlRmFjdG9yeQorCQkJbmV3IE1lcmdlRmFjdG9yeSgKKwkJCQltYWluSW5kZXhJbnB1dCwgCisJCQkJYWRkc0luZGV4SW5wdXQsIAorCQkJCXRlbXBJbmRleE91dHB1dCwgCisJCQkJcmVtb3ZlZEluT2xkLCAKKwkJCQlyZW1vdmVkSW5BZGRzKS5tZXJnZSgpOworCQkJCisJCQkvL3JlbmFtZSB0aGUgZmlsZSBjcmVhdGVkIHRvIGJlY29tZSB0aGUgbWFpbiBpbmRleAorCQkJRmlsZSBtYWluSW5kZXhGaWxlPSAoRmlsZSkgbWFpbkluZGV4SW5wdXQuZ2V0U291cmNlKCk7CisJCQlGaWxlIHRlbXBJbmRleEZpbGU9IChGaWxlKSB0ZW1wSW5kZXhPdXRwdXQuZ2V0RGVzdGluYXRpb24oKTsKKwkJCW1haW5JbmRleEZpbGUuZGVsZXRlKCk7CisJCQl0ZW1wSW5kZXhGaWxlLnJlbmFtZVRvKG1haW5JbmRleEZpbGUpOworCQl9IGZpbmFsbHkgewkJCisJCQkvL2luaXRpYWxpc2UgcmVtb3ZlIHZlY3RvcnMgYW5kIGFkZHNpbmRleCwgYW5kIGNoYW5nZSB0aGUgc3RhdGUKKwkJCXJlbW92ZWRJbkFkZHMuY2xlYXIoKTsKKwkJCXJlbW92ZWRJbk9sZC5jbGVhcigpOworCQkJYWRkc0luZGV4LmluaXQoKTsKKwkJCWFkZHNJbmRleElucHV0PSBuZXcgU2ltcGxlSW5kZXhJbnB1dChhZGRzSW5kZXgpOworCQkJc3RhdGU9IE1FUkdFRDsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElJbmRleCNxdWVyeQorCSAqLworCXB1YmxpYyBJUXVlcnlSZXN1bHRbXSBxdWVyeShTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9zYXZlKCk7CisJCUluZGV4SW5wdXQgaW5wdXQ9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4RmlsZSk7CisJCXRyeSB7CisJCQlyZXR1cm4gaW5wdXQucXVlcnkod29yZCk7CisJCX0gZmluYWxseSB7CisJCQlpbnB1dC5jbG9zZSgpOworCQl9CisJfQorCXB1YmxpYyBJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXMoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9zYXZlKCk7CisJCUluZGV4SW5wdXQgaW5wdXQ9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4RmlsZSk7CisJCXRyeSB7CisJCQlyZXR1cm4gaW5wdXQucXVlcnlFbnRyaWVzUHJlZml4ZWRCeShwcmVmaXgpOworCQl9IGZpbmFsbHkgeworCQkJaW5wdXQuY2xvc2UoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElJbmRleCNxdWVyeUluRG9jdW1lbnROYW1lcworCSAqLworCXB1YmxpYyBJUXVlcnlSZXN1bHRbXSBxdWVyeUluRG9jdW1lbnROYW1lcyhTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9zYXZlKCk7CisJCUluZGV4SW5wdXQgaW5wdXQ9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4RmlsZSk7CisJCXRyeSB7CisJCQlyZXR1cm4gaW5wdXQucXVlcnlJbkRvY3VtZW50TmFtZXMod29yZCk7CisJCX0gZmluYWxseSB7CisJCQlpbnB1dC5jbG9zZSgpOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSUluZGV4I3F1ZXJ5UHJlZml4CisJICovCisJcHVibGljIElRdWVyeVJlc3VsdFtdIHF1ZXJ5UHJlZml4KGNoYXJbXSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vc2F2ZSgpOworCQlJbmRleElucHV0IGlucHV0PSBuZXcgQmxvY2tzSW5kZXhJbnB1dChpbmRleEZpbGUpOworCQl0cnkgeworCQkJcmV0dXJuIGlucHV0LnF1ZXJ5RmlsZXNSZWZlcnJpbmdUb1ByZWZpeChwcmVmaXgpOworCQl9IGZpbmFsbHkgeworCQkJaW5wdXQuY2xvc2UoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElJbmRleCNyZW1vdmUKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGRvY3VtZW50TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5kZXhlZEZpbGUgZmlsZT0gYWRkc0luZGV4LmdldEluZGV4ZWRGaWxlKGRvY3VtZW50TmFtZSk7CisJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCS8vdGhlIGZpbGUgaXMgaW4gdGhlIGFkZHMgSW5kZXgsIHdlIHJlbW92ZSBpdCBmcm9tIHRoaXMgb25lCisJCQlJbnQgbGFzdFJlbW92ZWQ9IChJbnQpIHJlbW92ZWRJbkFkZHMuZ2V0KGRvY3VtZW50TmFtZSk7CisJCQlpZiAobGFzdFJlbW92ZWQgIT0gbnVsbCkgeworCQkJCWludCBmaWxlTnVtPSBmaWxlLmdldEZpbGVOdW1iZXIoKTsKKwkJCQlpZiAobGFzdFJlbW92ZWQudmFsdWUgPCBmaWxlTnVtKQorCQkJCQlsYXN0UmVtb3ZlZC52YWx1ZT0gZmlsZU51bTsKKwkJCX0gZWxzZQorCQkJCXJlbW92ZWRJbkFkZHMucHV0KGRvY3VtZW50TmFtZSwgbmV3IEludChmaWxlLmdldEZpbGVOdW1iZXIoKSkpOworCQl9IGVsc2UgeworCQkJLy93ZSByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgb2xkIGluZGV4CisJCQlyZW1vdmVkSW5PbGQucHV0KGRvY3VtZW50TmFtZSwgbmV3IEludCgxKSk7CisJCX0KKwkJc3RhdGU9IENBTl9NRVJHRTsKKwl9CisJLyoqCisJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgZnJvbSB0aGUgZ2l2ZW4gaW5kZXggKE1lcmdlRmFjdG9yeS5BRERTX0lOREVYIGZvciB0aGUKKwkgKiBpbiBtZW1vcnkgaW5kZXgsIE1lcmdlRmFjdG9yeS5PTERfSU5ERVggZm9yIHRoZSBpbmRleCBvbiB0aGUgZGlzaykuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEluZGV4ZWRGaWxlIGZpbGUsIGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWU9IGZpbGUuZ2V0UGF0aCgpOworCQlpZiAoaW5kZXggPT0gTWVyZ2VGYWN0b3J5LkFERFNfSU5ERVgpIHsKKwkJCUludCBsYXN0UmVtb3ZlZD0gKEludCkgcmVtb3ZlZEluQWRkcy5nZXQobmFtZSk7CisJCQlpZiAobGFzdFJlbW92ZWQgIT0gbnVsbCkgeworCQkJCWlmIChsYXN0UmVtb3ZlZC52YWx1ZSA8IGZpbGUuZ2V0RmlsZU51bWJlcigpKQorCQkJCQlsYXN0UmVtb3ZlZC52YWx1ZT0gZmlsZS5nZXRGaWxlTnVtYmVyKCk7CisJCQl9IGVsc2UKKwkJCQlyZW1vdmVkSW5BZGRzLnB1dChuYW1lLCBuZXcgSW50KGZpbGUuZ2V0RmlsZU51bWJlcigpKSk7CisJCX0gZWxzZSBpZiAoaW5kZXggPT0gTWVyZ2VGYWN0b3J5Lk9MRF9JTkRFWCkKKwkJCXJlbW92ZWRJbk9sZC5wdXQobmFtZSwgbmV3IEludCgxKSk7CisJCWVsc2UKKwkJCXRocm93IG5ldyBFcnJvcigpOworCQlzdGF0ZT0gQ0FOX01FUkdFOworCX0KKwkvKioKKwkgKiBAc2VlIElJbmRleCNzYXZlCisJICovCisJcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChjYW5NZXJnZSgpKQorCQkJbWVyZ2UoKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbiBtZW1vcnkgaW5kZXggcmVhY2hlcyBhIGNyaXRpY2FsIHNpemUsIAorCSAqIHRvIG1lcmdlIGl0IHdpdGggdGhlIGluZGV4IG9uIHRoZSBkaXNrLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHRpbWVUb01lcmdlKCkgeworCQlyZXR1cm4gKGFkZHNJbmRleC5nZXRGb290cHJpbnQoKSA+PSBNQVhfRk9PVFBSSU5UKTsKKwl9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWlmICh0aGlzLnRvU3RyaW5nID09IG51bGwpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCXJldHVybiB0aGlzLnRvU3RyaW5nOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhCbG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjlkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleEJsb2NrLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKKy8qKgorICogQW4gaW5kZXhCbG9jayBzdG9yZXMgd29yZEVudHJpZXMuCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEluZGV4QmxvY2sgZXh0ZW5kcyBCbG9jayB7CisKKwlwdWJsaWMgSW5kZXhCbG9jayhpbnQgYmxvY2tTaXplKSB7CisJCXN1cGVyKGJsb2NrU2l6ZSk7CisJfQorCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIHdvcmRFbnRyeSB0byB0aGUgaW5kZXhCbG9jay4KKwkgKi8KKworCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZEVudHJ5KFdvcmRFbnRyeSBlbnRyeSk7CisJLyoqCisJICogQHNlZSBCbG9jayNjbGVhcigpCisJICovCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCXJlc2V0KCk7CisJCXN1cGVyLmNsZWFyKCk7CisJfQorCXB1YmxpYyBXb3JkRW50cnkgZmluZEVudHJ5TWF0Y2hpbmcoY2hhcltdIHBhdHRlcm4sIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJCXJlc2V0KCk7CisJCVdvcmRFbnRyeSBlbnRyeT0gbmV3IFdvcmRFbnRyeSgpOworCQl3aGlsZSAobmV4dEVudHJ5KGVudHJ5KSkgeworCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybiwgZW50cnkuZ2V0V29yZCgpLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQkJcmV0dXJuIGVudHJ5OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwlwdWJsaWMgV29yZEVudHJ5IGZpbmRFbnRyeVByZWZpeGVkQnkoY2hhcltdIHdvcmQsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJCXJlc2V0KCk7CisJCVdvcmRFbnRyeSBlbnRyeT0gbmV3IFdvcmRFbnRyeSgpOworCQl3aGlsZSAobmV4dEVudHJ5KGVudHJ5KSkgeworCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGVudHJ5LmdldFdvcmQoKSwgd29yZCwgaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCXJldHVybiBlbnRyeTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIFdvcmRFbnRyeSBmaW5kRXhhY3RFbnRyeShjaGFyW10gd29yZCkgeworCQlyZXNldCgpOworCQlXb3JkRW50cnkgZW50cnk9IG5ldyBXb3JkRW50cnkoKTsKKwkJd2hpbGUgKG5leHRFbnRyeShlbnRyeSkpIHsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhlbnRyeS5nZXRXb3JkKCksIHdvcmQpKSB7CisJCQkJcmV0dXJuIGVudHJ5OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJsb2NrIGlzIGVtcHR5IG9yIG5vdCAoaWYgaXQgZG9lc24ndCBjb250YWluIGFueSB3b3JkRW50cnkpLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKTsKKworCS8qKgorCSAqIEZpbmRzIHRoZSBuZXh0IHdvcmRFbnRyeSBhbmQgc3RvcmVzIGl0IGluIHRoZSBnaXZlbiBlbnRyeS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBuZXh0RW50cnkoV29yZEVudHJ5IGVudHJ5KTsKKworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4SW5wdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4SW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMyMzRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OworCisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbnB1dCBvbiBhbiBpbmRleCwgYWZ0ZXIgaXQgaGFzIGJlZW4gZ2VuZXJhdGVkLgorICogWW91IGNhbiBhY2Nlc3MgYWxsIHRoZSBmaWxlcyBvZiBhbiBpbmRleCB2aWEgZ2V0TmV4dEZpbGUoKSwgZ2V0Q3VycmVudEZpbGUoKSAKKyAqIGFuZCBtb3ZlVG9OZXh0RmlsZSgpIChpZGVtIGZvciB0aGUgd29yZCBlbnRyaWVzKS4gCisgKiBUaGUgdXNhZ2UgaXMgdGhlIHNhbWUgZm9yIGV2ZXJ5IHN1YmNsYXNzOiBjcmVhdGlvbiAoY29uc3RydWN0b3IpLCBvcGVuaW5nCisgKiAodGhlIG9wZW4oKSBtZXRob2QpLCB1c2FnZSwgYW5kIGNsb3NpbmcgKHRoZSBjbG9zZSgpIG1ldGhvZCksIHRvIHJlbGVhc2UgdGhlCisgKiBkYXRhIHNvdXJjZSB1c2VkIGJ5IHRoaXMgaW5wdXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmRleElucHV0IHsKKwlwcm90ZWN0ZWQgaW50IGZpbGVQb3NpdGlvbjsKKwlwcm90ZWN0ZWQgV29yZEVudHJ5IGN1cnJlbnRXb3JkRW50cnk7CisJcHJvdGVjdGVkIGludCB3b3JkUG9zaXRpb247CisKKworCXB1YmxpYyBJbmRleElucHV0KCkgeworCQlzdXBlcigpOworCQl3b3JkUG9zaXRpb249IDE7CisJCWZpbGVQb3NpdGlvbj0gMTsKKwl9CisJLyoqCisJICogY2xlYXJzIHRoZSBjYWNoZSBvZiB0aGlzIGluZGV4SW5wdXQsIGlmIGl0IGtlZXBzIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiBhbHJlYWR5IHJlYWQuCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXJDYWNoZSgpOworCS8qKgorCSAqIENsb3NlcyB0aGUgSW5kZXhJbnB1dC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyBvbiBhIFJhbmRvbUFjY2Vzc0ZpbGUsCisJICogaXQgY2FsbHMgdGhlIGNsb3NlKCkgbWV0aG9kIG9mIFJhbmRvbUFjY2Vzc0ZpbGUuIAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsZSB0aGUgaW5kZXhJbnB1dCBpcyBwb2ludGluZyB0byBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIGFic3RyYWN0IEluZGV4ZWRGaWxlIGdldEN1cnJlbnRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsZSB0aGUgaW5kZXhJbnB1dCBpcyBwb2ludGluZyB0byBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIFdvcmRFbnRyeSBnZXRDdXJyZW50V29yZEVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFoYXNNb3JlV29yZHMoKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gY3VycmVudFdvcmRFbnRyeTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZmlsZSB0aGUgaW5wdXQgaXMgcG9pbnRpbmcgdG8gaW4gdGhlIGluZGV4LgorCSAqLworCXB1YmxpYyBpbnQgZ2V0RmlsZVBvc2l0aW9uKCkgeworCQlyZXR1cm4gZmlsZVBvc2l0aW9uOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmRleGVkRmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBudW1iZXIgaW4gdGhlIGluZGV4IHRoZSBpbnB1dAorCSAqIHJlYWRzIGluLCBvciBudWxsIGlmIHN1Y2ggaW5kZXhlZEZpbGUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIGFic3RyYWN0IEluZGV4ZWRGaWxlIGdldEluZGV4ZWRGaWxlKGludCBmaWxlTnVtKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgaW5kZXhlZEZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQgaW4gdGhlIGluZGV4IHRoZSBpbnB1dAorCSAqIHJlYWRzIGluIChlLmcuIHRoZSBpbmRleGVkRmlsZSB3aXRoIHRoZSBzYW1lIHBhdGggaW4gdGhpcyBpbmRleCksIG9yIG51bGwgaWYgc3VjaCAKKwkgKiBpbmRleGVkRmlsZSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgSW5kZXhlZEZpbGUgZ2V0SW5kZXhlZEZpbGUoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGVzIGluIHRoZSBpbmRleC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bUZpbGVzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSB3b3JkcyBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIGFic3RyYWN0IGludCBnZXROdW1Xb3JkcygpOworCS8qKgorCSAqIFJldHVybnMgdGhlIE9iamVjdCB0aGUgaW5wdXQgaXMgcmVhZGluZyBmcm9tLiBJdCBjYW4gYmUgYW4gSUluZGV4LAorCSAqIGEgRmlsZSwgLi4uCisJICovCisJcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRTb3VyY2UoKTsKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGhhcyBub3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbmRleCBmb3IgdGhlIGZpbGVzLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc01vcmVGaWxlcygpIHsKKwkJcmV0dXJuIGdldEZpbGVQb3NpdGlvbigpIDw9IGdldE51bUZpbGVzKCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgaGFzIG5vdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGluZGV4IGZvciB0aGUgZmlsZXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzTW9yZVdvcmRzKCkgeworCQlyZXR1cm4gd29yZFBvc2l0aW9uIDw9IGdldE51bVdvcmRzKCk7CisJfQorCS8qKgorCSAqIE1vdmVzIHRoZSBwb2ludGVyIG9uIHRoZSBjdXJyZW50IGZpbGUgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgbW92ZVRvTmV4dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogTW92ZXMgdGhlIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgd29yZCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBpbmRleC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlVG9OZXh0V29yZEVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIE9wZW4gdGhlIFNvdXJjZSB3aGVyZSB0aGUgaW5wdXQgZ2V0cyB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHdvcmQgaW4gdGhlIGluZGV4LgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJUXVlcnlSZXN1bHRbXSBxdWVyeShTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uOworCXB1YmxpYyBhYnN0cmFjdCBJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXNQcmVmaXhlZEJ5KGNoYXJbXSBwcmVmaXggLyosIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKi8pIHRocm93cyBJT0V4Y2VwdGlvbjsKK3B1YmxpYyBhYnN0cmFjdCBJUXVlcnlSZXN1bHRbXSBxdWVyeUZpbGVzUmVmZXJyaW5nVG9QcmVmaXgoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIHdob3NlIG5hbWUgY29udGFpbiB0aGUgZ2l2ZW4gd29yZCBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIGFic3RyYWN0IElRdWVyeVJlc3VsdFtdIHF1ZXJ5SW5Eb2N1bWVudE5hbWVzKFN0cmluZyB3b3JkKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogU2V0IHRoZSBwb2ludGVyIG9uIHRoZSBjdXJyZW50IGZpbGUgdG8gdGhlIGZpcnN0IGZpbGUgb2YgdGhlIGluZGV4LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldEZpcnN0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBTZXQgdGhlIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgd29yZCB0byB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgaW5kZXguCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Rmlyc3RXb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMWY0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4T3V0cHV0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQW4gaW5kZXhPdXRwdXQgaXMgdXNlZCB0byB3cml0ZSBhbiBpbmRleCBpbnRvIGEgZGlmZmVyZW50IG9iamVjdCAoYSBGaWxlLCAuLi4pLiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEluZGV4T3V0cHV0IHsKKwkvKioKKwkgKiBBZGRzIGEgRmlsZSB0byB0aGUgZGVzdGluYXRpb24uCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRmlsZShJbmRleGVkRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb247CisJLyoqCisJICogQWRkcyBhIHdvcmQgdG8gdGhlIGRlc3RpbmF0aW9uLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFdvcmQoV29yZEVudHJ5IHdvcmQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBDbG9zZXMgdGhlIG91dHB1dCwgcmVsZWFzaW5nIHRoZSByZXNvdXJjZXMgaXQgd2FzIHVzaW5nLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCS8qKgorCSAqIEZsdXNoZXMgdGhlIG91dHB1dC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBPYmplY3QgdGhlIG91dHB1dCBpcyB3cml0aW5nIHRvLiBJdCBjYW4gYmUgYSBmaWxlLCBhbm90aGVyIHR5cGUgb2YgaW5kZXgsIC4uLiAKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldERlc3RpbmF0aW9uKCk7CisJLyoqCisJICogT3BlbnMgdGhlIG91dHB1dCwgYmVmb3JlIHdyaXRpbmcgYW55IGluZm9ybWF0aW9uLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleFN1bW1hcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDM2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleFN1bW1hcnkuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCisvKioKKyAqIEFuIGluZGV4U3VtbWFyeSBpcyB1c2VkIHdoZW4gc2F2aW5nIGFuIGluZGV4IGludG8gYSBCbG9ja3NJbmRleE91cHV0IG9yIAorICogcmVhZGluZyBpdCBmcm9tIGEgQmxvY2tzSW5kZXhJbnB1dC4gSXQgY29udGFpbnMgYmFzaWMgaW5mb3JtYXRpb25zIGFib3V0IAorICogYW4gaW5kZXg6IGZpcnN0IGZpbGVzL3dvcmRzIGluIGVhY2ggYmxvY2ssIG51bWJlciBvZiBmaWxlcy93b3Jkcy4KKyAqLworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5IHsKKwkvKioKKwkgKiBGaXJzdCBmaWxlIGZvciBlYWNoIGJsb2NrLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZmlyc3RGaWxlc0luQmxvY2tzPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkvKioKKwkgKiBGaXJzdCB3b3JkIGZvciBlYWNoIGJsb2NrLgorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZmlyc3RXb3Jkc0luQmxvY2tzPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkvKioKKwkgKiBOdW1iZXIgb2YgZmlsZXMgaW4gdGhlIGluZGV4LgorCSAqLworCXByb3RlY3RlZCBpbnQgbnVtRmlsZXM7CisKKwkvKioKKwkgKiBOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIGluZGV4LgorCSAqLworCXByb3RlY3RlZCBpbnQgbnVtV29yZHM7CisKKwlzdGF0aWMgY2xhc3MgRmlyc3RGaWxlSW5CbG9jayB7CisJCUluZGV4ZWRGaWxlIGluZGV4ZWRGaWxlOworCQlpbnQgYmxvY2tOdW07CisJfQorCisJc3RhdGljIGNsYXNzIEZpcnN0V29yZEluQmxvY2sgeworCQljaGFyW10gd29yZDsKKwkJaW50IGJsb2NrTnVtOworCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJCQlyZXR1cm4gIkZpcnN0V29yZEluQmxvY2s6ICIgKyBuZXcgU3RyaW5nKHdvcmQpICsgIiwgYmxvY2tOdW06ICIgKyBibG9ja051bTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgaW50IGZpcnN0V29yZEJsb2NrTnVtOworCXByb3RlY3RlZCBib29sZWFuIGZpcnN0V29yZEFkZGVkPSB0cnVlOworCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIGZpbGUgYXMgdGhlIGZpcnN0IGZpbGUgZm9yIHRoZSBnaXZlbiBCbG9jayBudW1iZXIuIAorCSAqLworCXB1YmxpYyB2b2lkIGFkZEZpcnN0RmlsZUluQmxvY2soSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGUsIGludCBibG9ja051bSkgeworCQlGaXJzdEZpbGVJbkJsb2NrIGVudHJ5PSBuZXcgRmlyc3RGaWxlSW5CbG9jaygpOworCQllbnRyeS5pbmRleGVkRmlsZT0gaW5kZXhlZEZpbGU7CisJCWVudHJ5LmJsb2NrTnVtPSBibG9ja051bTsKKwkJZmlyc3RGaWxlc0luQmxvY2tzLmFkZChlbnRyeSk7CisJfQorCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIHdvcmQgYXMgdGhlIGZpcnN0IHdvcmQgZm9yIHRoZSBnaXZlbiBCbG9jayBudW1iZXIuIAorCSAqLworCXB1YmxpYyB2b2lkIGFkZEZpcnN0V29yZEluQmxvY2soY2hhcltdIHdvcmQsIGludCBibG9ja051bSkgeworCQlpZiAoZmlyc3RXb3JkQWRkZWQpIHsKKwkJCWZpcnN0V29yZEJsb2NrTnVtPSBibG9ja051bTsKKwkJCWZpcnN0V29yZEFkZGVkPSBmYWxzZTsKKwkJfQorCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSBuZXcgRmlyc3RXb3JkSW5CbG9jaygpOworCQllbnRyeS53b3JkPSB3b3JkOworCQllbnRyeS5ibG9ja051bT0gYmxvY2tOdW07CisJCWZpcnN0V29yZHNJbkJsb2Nrcy5hZGQoZW50cnkpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXJzIG9mIGFsbCB0aGUgYmxvY2tzCisJICovCisJcHVibGljIGludFtdIGdldEFsbEJsb2NrTnVtcygpIHsKKworCQlpbnQgbWF4ID0gZmlyc3RXb3Jkc0luQmxvY2tzLnNpemUoKTsKKwkJaW50W10gYmxvY2tOdW1zID0gbmV3IGludFttYXhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKXsKKwkJCWJsb2NrTnVtc1tpXSA9ICgoRmlyc3RXb3JkSW5CbG9jaylmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KGkpKS5ibG9ja051bTsKKwkJfQorCQlyZXR1cm4gYmxvY2tOdW1zOworCX0KK3B1YmxpYyBpbnQgZ2V0QmxvY2tOdW0oaW50IGJsb2NrTG9jYXRpb24pIHsKKwlyZXR1cm4gKChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KGJsb2NrTG9jYXRpb24pKS5ibG9ja051bTsKK30KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIEJsb2NrIGNvbnRhaW5pbmcgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLiAKKwkgKi8KKwlwdWJsaWMgaW50IGdldEJsb2NrTnVtRm9yRmlsZU51bShpbnQgZmlsZU51bSkgeworCQlpbnQgbWluPSAwOworCQlpbnQgbWF4PSBmaXJzdEZpbGVzSW5CbG9ja3Muc2l6ZSgpIC0gMTsKKwkJd2hpbGUgKG1pbiA8PSBtYXgpIHsKKwkJCWludCBtaWQ9IChtaW4gKyBtYXgpIC8gMjsKKwkJCUZpcnN0RmlsZUluQmxvY2sgZW50cnk9IChGaXJzdEZpbGVJbkJsb2NrKSBmaXJzdEZpbGVzSW5CbG9ja3MuZ2V0KG1pZCk7CisJCQlpbnQgY29tcGFyZT0gZmlsZU51bSAtIGVudHJ5LmluZGV4ZWRGaWxlLmdldEZpbGVOdW1iZXIoKTsKKwkJCWlmIChjb21wYXJlID09IDApCisJCQkJcmV0dXJuIGVudHJ5LmJsb2NrTnVtOworCQkJaWYgKGNvbXBhcmUgPCAwKQorCQkJCW1heD0gbWlkIC0gMTsKKwkJCWVsc2UKKwkJCQltaW49IG1pZCArIDE7CisJCX0KKwkJaWYgKG1heCA8IDApCisJCQlyZXR1cm4gLTE7CisJCUZpcnN0RmlsZUluQmxvY2sgZW50cnk9IChGaXJzdEZpbGVJbkJsb2NrKSBmaXJzdEZpbGVzSW5CbG9ja3MuZ2V0KG1heCk7CisJCXJldHVybiBlbnRyeS5ibG9ja051bTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBCbG9jayBjb250YWluaW5nIHRoZSBnaXZlbiB3b3JkLiAKKwkgKi8KKwlwdWJsaWMgaW50IGdldEJsb2NrTnVtRm9yV29yZChjaGFyW10gd29yZCkgeworCQlpbnQgbWluPSAwOworCQlpbnQgbWF4PSBmaXJzdFdvcmRzSW5CbG9ja3Muc2l6ZSgpIC0gMTsKKwkJd2hpbGUgKG1pbiA8PSBtYXgpIHsKKwkJCWludCBtaWQ9IChtaW4gKyBtYXgpIC8gMjsKKwkJCUZpcnN0V29yZEluQmxvY2sgZW50cnk9IChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KG1pZCk7CisJCQlpbnQgY29tcGFyZT0gVXRpbC5jb21wYXJlKHdvcmQsIGVudHJ5LndvcmQpOworCQkJaWYgKGNvbXBhcmUgPT0gMCkKKwkJCQlyZXR1cm4gZW50cnkuYmxvY2tOdW07CisJCQlpZiAoY29tcGFyZSA8IDApCisJCQkJbWF4PSBtaWQgLSAxOworCQkJZWxzZQorCQkJCW1pbj0gbWlkICsgMTsKKwkJfQorCQlpZiAobWF4IDwgMCkKKwkJCXJldHVybiAtMTsKKwkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeT0gKEZpcnN0V29yZEluQmxvY2spIGZpcnN0V29yZHNJbkJsb2Nrcy5nZXQobWF4KTsKKwkJcmV0dXJuIGVudHJ5LmJsb2NrTnVtOworCX0KKwlwdWJsaWMgaW50W10gZ2V0QmxvY2tOdW1zRm9yUHJlZml4KGNoYXJbXSBwcmVmaXgpIHsKKwkJaW50IG1pbj0gMDsKKwkJaW50IHNpemU9IGZpcnN0V29yZHNJbkJsb2Nrcy5zaXplKCk7CisJCWludCBtYXg9ICBzaXplIC0gMTsKKwkJaW50IG1hdGNoPSAtMTsKKwkJd2hpbGUgKG1pbiA8PSBtYXggJiYgbWF0Y2ggPCAwKSB7CisJCQlpbnQgbWlkPSAobWluICsgbWF4KSAvIDI7CisJCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChtaWQpOworCQkJaW50IGNvbXBhcmU9IFV0aWwuc3RhcnRzV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpOworCQkJaWYgKGNvbXBhcmUgPT0gMCkgeworCQkJCW1hdGNoPSBtaWQ7CisJCQkJYnJlYWs7CisJCQl9CQorCQkJaWYgKGNvbXBhcmUgPj0gMCkKKwkJCQltYXg9IG1pZCAtIDE7CisJCQllbHNlCisJCQkJbWluPSBtaWQgKyAxOworCQl9CisJCWlmIChtYXggPCAwKQorCQkJcmV0dXJuIG5ldyBpbnRbMF07CisJCQkKKwkJaWYgKG1hdGNoIDwgMCkKKwkJCW1hdGNoPSBtYXg7CisJCQorCQlpbnQgZmlyc3RCbG9jaz0gbWF0Y2ggLSAxOworCQkvLyBMb29rIGlmIHByZXZpb3VzIGJsb2NrcyBhcmUgYWZmZWN0ZWQKKwkJZm9yICg7IGZpcnN0QmxvY2sgPj0gMDsgZmlyc3RCbG9jay0tKSB7CisJCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChmaXJzdEJsb2NrKTsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZpcnN0QmxvY2sgPCAwKQorCQkJZmlyc3RCbG9jaz0gMDsJCisJCQorCQkvLyBMb29rIGlmIG5leHQgYmxvY2tzIGFyZSBhZmZlY3RlZAorCQlpbnQgZmlyc3ROb3RJbmNsdWRlZEJsb2NrPSBtYXRjaCArIDE7CisJCWZvciAoOyBmaXJzdE5vdEluY2x1ZGVkQmxvY2sgPCBzaXplOyBmaXJzdE5vdEluY2x1ZGVkQmxvY2srKykgeworCQkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeT0gKEZpcnN0V29yZEluQmxvY2spIGZpcnN0V29yZHNJbkJsb2Nrcy5nZXQoZmlyc3ROb3RJbmNsdWRlZEJsb2NrKTsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCkpCisJCQkJYnJlYWs7CisJCX0KKwkJCisJCWludCBudW1iZXJPZkJsb2Nrcz0gZmlyc3ROb3RJbmNsdWRlZEJsb2NrIC0gZmlyc3RCbG9jazsKKwkJaW50W10gcmVzdWx0PSBuZXcgaW50W251bWJlck9mQmxvY2tzXTsKKwkJaW50IHBvcz0gZmlyc3RCbG9jazsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IG51bWJlck9mQmxvY2tzOyBpKyssIHBvcysrKSB7CisJCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChwb3MpOworCQkJcmVzdWx0W2ldPSBlbnRyeS5ibG9ja051bTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KK3B1YmxpYyBpbnQgZ2V0Rmlyc3RCbG9ja0xvY2F0aW9uRm9yUHJlZml4KGNoYXJbXSBwcmVmaXgpIHsKKwlpbnQgbWluID0gMDsKKwlpbnQgc2l6ZSA9IGZpcnN0V29yZHNJbkJsb2Nrcy5zaXplKCk7CisJaW50IG1heCA9IHNpemUgLSAxOworCWludCBtYXRjaCA9IC0xOworCXdoaWxlIChtaW4gPD0gbWF4KSB7CisJCWludCBtaWQgPSAobWluICsgbWF4KSAvIDI7CisJCUZpcnN0V29yZEluQmxvY2sgZW50cnkgPSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChtaWQpOworCQlpbnQgY29tcGFyZSA9IFV0aWwuc3RhcnRzV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpOworCQlpZiAoY29tcGFyZSA9PSAwKSB7CisJCQltYXRjaCA9IG1pZDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb21wYXJlID49IDApIHsKKwkJCW1heCA9IG1pZCAtIDE7CisJCX0gZWxzZSB7CisJCQltYXRjaCA9IG1pZDsgLy8gbm90IHBlcmZlY3QgbWF0Y2gsIGJ1dCBjb3VsZCBiZSBpbnNpZGUKKwkJCW1pbiA9IG1pZCArIDE7CisJCX0KKwl9CisJaWYgKG1heCA8IDApIHJldHVybiAtMTsKKworCS8vIG5vIG1hdGNoIGF0IGFsbCwgbWlnaHQgYmUgc29tZSBtYXRjaGluZyBlbnRyaWVzIGluc2lkZSBtYXggYmxvY2sKKwlpZiAobWF0Y2ggPCAwKXsKKwkJbWF0Y2ggPSBtYXg7CisJfSBlbHNlIHsKKwkJLy8gbG9vayBmb3IgcG9zc2libGUgbWF0Y2hlcyBpbnNpZGUgcHJldmlvdXMgYmxvY2tzCisJCXdoaWxlIChtYXRjaCA+IDApeworCQkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeSA9IChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KG1hdGNoKTsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCkpeworCQkJCWJyZWFrOworCQkJfQorCQkJbWF0Y2gtLTsKKwkJfQorCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBJbmRleEJsb2NrIChjb250YWluaW5nIHdvcmRzKS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldEZpcnN0V29yZEJsb2NrTnVtKCkgeworCQlyZXR1cm4gZmlyc3RXb3JkQmxvY2tOdW07CisJfQorLyoqIAorICogQmxvY2tzIGFyZSBjb250aWd1b3VzLCBzbyB0aGUgbmV4dCBvbmUgaXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGlmIGl0cyBmaXJzdCB3b3JkIHN0YXJ0cyB3aXRoCisgKiB0aGUgZ2l2ZW4gcHJlZml4CisgKi8KK3B1YmxpYyBpbnQgZ2V0TmV4dEJsb2NrTG9jYXRpb25Gb3JQcmVmaXgoY2hhcltdIHByZWZpeCwgaW50IGJsb2NrTG9jKSB7CisJaWYgKCsrYmxvY2tMb2MgPCBmaXJzdFdvcmRzSW5CbG9ja3Muc2l6ZSgpKXsKKwkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeT0gKEZpcnN0V29yZEluQmxvY2spIGZpcnN0V29yZHNJbkJsb2Nrcy5nZXQoYmxvY2tMb2MpOworCQlpZiAoQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCkpIHJldHVybiBibG9ja0xvYzsKKwl9CisJcmV0dXJuIC0xOworfQorCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyBjb250YWluZWQgaW4gdGhlIGluZGV4LgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtRmlsZXMoKSB7CisJCXJldHVybiBudW1GaWxlczsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdvcmRzIGNvbnRhaW5lZCBpbiB0aGUgaW5kZXguCisJICovCisJcHVibGljIGludCBnZXROdW1Xb3JkcygpIHsKKwkJcmV0dXJuIG51bVdvcmRzOworCX0KKwkvKioKKwkgKiBMb2FkcyB0aGUgc3VtbWFyeSBpbiBtZW1vcnkuCisJICovCisJcHVibGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJbnVtRmlsZXM9IHJhZi5yZWFkSW50KCk7CisJCW51bVdvcmRzPSByYWYucmVhZEludCgpOworCQlmaXJzdFdvcmRCbG9ja051bT0gcmFmLnJlYWRJbnQoKTsKKwkJaW50IG51bUZpcnN0RmlsZXM9IHJhZi5yZWFkSW50KCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBudW1GaXJzdEZpbGVzOyArK2kpIHsKKwkJCUZpcnN0RmlsZUluQmxvY2sgZW50cnk9IG5ldyBGaXJzdEZpbGVJbkJsb2NrKCk7CisJCQlTdHJpbmcgcGF0aD0gcmFmLnJlYWRVVEYoKTsKKwkJCWludCBmaWxlTnVtPSByYWYucmVhZEludCgpOworCQkJZW50cnkuaW5kZXhlZEZpbGU9IG5ldyBJbmRleGVkRmlsZShwYXRoLCBmaWxlTnVtKTsKKwkJCWVudHJ5LmJsb2NrTnVtPSByYWYucmVhZEludCgpOworCQkJZmlyc3RGaWxlc0luQmxvY2tzLmFkZChlbnRyeSk7CisJCX0KKwkJaW50IG51bUZpcnN0V29yZHM9IHJhZi5yZWFkSW50KCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBudW1GaXJzdFdvcmRzOyArK2kpIHsKKwkJCUZpcnN0V29yZEluQmxvY2sgZW50cnk9IG5ldyBGaXJzdFdvcmRJbkJsb2NrKCk7CisJCQllbnRyeS53b3JkPSByYWYucmVhZFVURigpLnRvQ2hhckFycmF5KCk7CisJCQllbnRyeS5ibG9ja051bT0gcmFmLnJlYWRJbnQoKTsKKwkJCWZpcnN0V29yZHNJbkJsb2Nrcy5hZGQoZW50cnkpOworCQl9CisJfQorCS8qKgorCSAqIFNldHMgdGhlIG51bWJlciBvZiBmaWxlcyBvZiB0aGUgaW5kZXguCisJICovCisKKwlwdWJsaWMgdm9pZCBzZXROdW1GaWxlcyhpbnQgbnVtRmlsZXMpIHsKKwkJdGhpcy5udW1GaWxlcz0gbnVtRmlsZXM7CisJfQorCS8qKgorCSAqIFNldHMgdGhlIG51bWJlciBvZiB3b3JkcyBvZiB0aGUgaW5kZXguCisJICovCisKKwlwdWJsaWMgdm9pZCBzZXROdW1Xb3JkcyhpbnQgbnVtV29yZHMpIHsKKwkJdGhpcy5udW1Xb3Jkcz0gbnVtV29yZHM7CisJfQorCS8qKgorCSAqIFNhdmVzIHRoZSBzdW1tYXJ5IG9uIHRoZSBkaXNrLgorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyYWYud3JpdGVJbnQobnVtRmlsZXMpOworCQlyYWYud3JpdGVJbnQobnVtV29yZHMpOworCQlyYWYud3JpdGVJbnQoZmlyc3RXb3JkQmxvY2tOdW0pOworCQlyYWYud3JpdGVJbnQoZmlyc3RGaWxlc0luQmxvY2tzLnNpemUoKSk7CisJCWZvciAoaW50IGk9IDAsIHNpemU9IGZpcnN0RmlsZXNJbkJsb2Nrcy5zaXplKCk7IGkgPCBzaXplOyArK2kpIHsKKwkJCUZpcnN0RmlsZUluQmxvY2sgZW50cnk9IChGaXJzdEZpbGVJbkJsb2NrKSBmaXJzdEZpbGVzSW5CbG9ja3MuZ2V0KGkpOworCQkJcmFmLndyaXRlVVRGKGVudHJ5LmluZGV4ZWRGaWxlLmdldFBhdGgoKSk7CisJCQlyYWYud3JpdGVJbnQoZW50cnkuaW5kZXhlZEZpbGUuZ2V0RmlsZU51bWJlcigpKTsKKwkJCXJhZi53cml0ZUludChlbnRyeS5ibG9ja051bSk7CisJCX0KKwkJcmFmLndyaXRlSW50KGZpcnN0V29yZHNJbkJsb2Nrcy5zaXplKCkpOworCQlmb3IgKGludCBpPSAwLCBzaXplPSBmaXJzdFdvcmRzSW5CbG9ja3Muc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7CisJCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChpKTsKKwkJCXJhZi53cml0ZVVURihuZXcgU3RyaW5nKGVudHJ5LndvcmQpKTsKKwkJCXJhZi53cml0ZUludChlbnRyeS5ibG9ja051bSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0MWRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OworCisvKioKKyAqIEFuIGluZGV4ZWRGaWxlIGFzc29jaWF0ZXMgYSBudW1iZXIgdG8gYSBkb2N1bWVudCBwYXRoLCBhbmQgZG9jdW1lbnQgcHJvcGVydGllcy4gCisgKiBJdCBpcyB3aGF0IHdlIGFkZCBpbnRvIGFuIGluZGV4LCBhbmQgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5LgorICovCisKK3B1YmxpYyBjbGFzcyBJbmRleGVkRmlsZSBpbXBsZW1lbnRzIElRdWVyeVJlc3VsdCB7CisJcHJvdGVjdGVkIFN0cmluZyBwYXRoOworCXByb3RlY3RlZCBpbnQgZmlsZU51bWJlcjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0JFR0lOPSAiKCI7IC8vJE5PTi1OTFMtMSQKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0VORD0gIikiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19TRVBBUkFUT1I9ICIsIjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fVkFMVUVfU0VQQVJBVE9SPSAiOiI7IC8vJE5PTi1OTFMtMSQKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhfUFJPUEVSVElFU19TSVpFPSAyICogMTAyNDsKKwlwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnRpZXM7CisJcHJvdGVjdGVkIGludCBwcm9wZXJ0aWVzU2l6ZT0gMiAqIChJTkZPX0JFR0lOLmxlbmd0aCgpICsgSU5GT19FTkQubGVuZ3RoKCkpOworCisJcHVibGljIEluZGV4ZWRGaWxlKFN0cmluZyBwYXRoT3JJbmZvLCBpbnQgZmlsZU51bSkgeworCQlpZiAoZmlsZU51bSA8IDEpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCXRoaXMuZmlsZU51bWJlcj0gZmlsZU51bTsKKwkJdGhpcy5wcm9wZXJ0aWVzPSBudWxsOyAvLyBpbml0aWFsaXplZCB3aGVuIG5lZWRlZAorCQlpbnQgZHA9IHBhdGhPckluZm8uaW5kZXhPZihJTkZPX0JFR0lOKTsKKwkJaWYgKGRwID09IC0xKQorCQkJcGF0aD0gcGF0aE9ySW5mbzsKKwkJZWxzZSB7CisJCQlTdHJpbmcgZmlsZUluZm89IHBhdGhPckluZm87CisJCQlwYXRoPSBmaWxlSW5mby5zdWJzdHJpbmcoMCwgZHApOworCQkJU3RyaW5nIHByb3BzPSBmaWxlSW5mby5zdWJzdHJpbmcoZHAsIGZpbGVJbmZvLmxlbmd0aCgpKTsKKwkJCVN0cmluZ1Rva2VuaXplciB0PSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BzLnN1YnN0cmluZygxLCBwcm9wcy5sZW5ndGgoKSAtIDEpLCBJTkZPX1NFUEFSQVRPUik7CisJCQl3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgZz0gdC5uZXh0VG9rZW4oKTsKKwkJCQl0cnkgeworCQkJCQlpbnQgZHB0PSBnLmluZGV4T2YoSU5GT19WQUxVRV9TRVBBUkFUT1IpOworCQkJCQlzZXRQcm9wZXJ0eShnLnN1YnN0cmluZygwLCBkcHQpLCBnLnN1YnN0cmluZyhkcHQgKyAxLCBnLmxlbmd0aCgpKSk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcHVibGljIEluZGV4ZWRGaWxlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGZpbGVOdW0pIHsKKwkJaWYgKGZpbGVOdW0gPCAxKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl0aGlzLnBhdGg9IGRvY3VtZW50LmdldE5hbWUoKTsKKwkJdGhpcy5maWxlTnVtYmVyPSBmaWxlTnVtOworCQl0aGlzLnByb3BlcnRpZXM9IG51bGw7IC8vIGluaXRpYWxpemVkIHdoZW4gbmVlZGVkCisJCWNvbXB1dGVQcm9wZXJ0aWVzKGRvY3VtZW50KTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVByb3BlcnRpZXMoSURvY3VtZW50IGRvY3VtZW50KSB7CisJCWZvciAoRW51bWVyYXRpb24gZT0gZG9jdW1lbnQuZ2V0UHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworCQkJU3RyaW5nIHByb3BlcnR5PSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eSwgZG9jdW1lbnQuZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIHJlcHJlc2VudGVkIGJ5IHBhdGhTdHJpbmcgY29udmVydGVkIGJhY2sgdG8gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KKwkgKgorCSAqIEBwYXJhbSBwYXRoU3RyaW5nIHRoZSBwYXRoIHRvIGNvbnZlcnQ6CisJICogPHVsPgorCSAqCQk8bGk+YW4gYWJzb2x1dGUgSVBhdGggKHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCkgaWYgdGhlIHBhdGggcmVwcmVzZW50cyBhIHJlc291cmNlIGluIHRoZSAKKwkgKgkJCXdvcmtzcGFjZQorCSAqCQk8bGk+YSByZWxhdGl2ZSBJUGF0aCAocmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSByb290KSBmb2xsb3dlZCBieSBKQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IKKwkgKgkJCWZvbGxvd2VkIGJ5IGFuIGFic29sdXRlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBqYXIpIGlmIHRoZSBwYXRoIHJlcHJlc2VudHMgYSAuY2xhc3MgZmlsZSBpbgorCSAqCQkJYW4gaW50ZXJuYWwgamFyCisJICoJCTxsaT5hbiBhYnNvbHV0ZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgZmlsZSBzeXN0ZW0pIGZvbGxvd2VkIGJ5IEpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUgorCSAqCQkJZm9sbG93ZWQgYnkgYW4gYWJzb2x1dGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIGphcikgaWYgdGhlIHBhdGggcmVwcmVzZW50cyBhIC5jbGFzcyBmaWxlIGluCisJICoJCQlhbiBleHRlcm5hbCBqYXIKKwkgKiA8L3VsPgorCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBwYXRoOgorCSAqIDx1bD4KKwkgKgkJPGxpPnRoZSBvcmlnaW5hbCBwYXRoU3RyaW5nIGlmIHRoZSBwYXRoIHJlcHJlc2VudHMgYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCisJICoJCTxsaT5hbiBhYnNvbHV0ZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgZmlsZSBzeXN0ZW0pIGZvbGxvd2VkIGJ5IEpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUgorCSAqCQkJZm9sbG93ZWQgYnkgYW4gYWJzb2x1dGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIGphcikgaWYgdGhlIHBhdGggcmVwcmVzZW50cyBhIC5jbGFzcyBmaWxlIGluCisJICoJCQlhbiBleHRlcm5hbCBvciBpbnRlcm5hbCBqYXIKKwkgKiA8L3VsPgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRQYXRoKFN0cmluZyBwYXRoU3RyaW5nKSB7CisJCWludCBpbmRleCA9IHBhdGhTdHJpbmcuaW5kZXhPZihKYXJGaWxlRW50cnlEb2N1bWVudC5KQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IpOworCQlpZiAoaW5kZXggPT0gLTEpCisJCQlyZXR1cm4gcGF0aFN0cmluZzsKKwkJCQorCQlQYXRoIGphclBhdGggPSBuZXcgUGF0aChwYXRoU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkpOworCQlpZiAoIWphclBhdGguaXNBYnNvbHV0ZSgpKSB7CisJCQlyZXR1cm4gamFyUGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpICsgcGF0aFN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIHBhdGhTdHJpbmcubGVuZ3RoKCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGphclBhdGgudG9PU1N0cmluZygpICsgcGF0aFN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIHBhdGhTdHJpbmcubGVuZ3RoKCkpOworCQl9CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGluZGV4ZWRGaWxlLgorCSAqLworCXB1YmxpYyBpbnQgZm9vdHByaW50KCkgeworCQkvL29iamVjdCsgMiBzbG90cyArIHNpemUgb2YgdGhlIHN0cmluZyAoaGVhZGVyICsgNCBzbG90cyArIGNoYXJbXSkKKwkJcmV0dXJuIDggKyAoMiAqIDQpICsgKDggKyAoNCAqIDQpICsgOCArIHBhdGgubGVuZ3RoKCkgKiAyKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgZmlsZSBudW1iZXIuCisJICovCisJcHVibGljIGludCBnZXRGaWxlTnVtYmVyKCkgeworCQlyZXR1cm4gZmlsZU51bWJlcjsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgcGF0aC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisJCXJldHVybiBwYXRoOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOworCX0KKwkvKioKKwkgKiBnZXRQcm9wZXJ0eU5hbWVzIG1ldGhvZCBjb21tZW50LgorCSAqLworCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSByZXR1cm4gbmV3IEhhc2h0YWJsZSgpLmtleXMoKTsKKwkJcmV0dXJuIHByb3BlcnRpZXMua2V5cygpOworCX0KKwlwdWJsaWMgU3RyaW5nIHByb3BlcnRpZXNUb1N0cmluZygpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmdCdWZmZXIgcHJvcD0gbmV3IFN0cmluZ0J1ZmZlcihJTkZPX0JFR0lOKTsKKwkJZm9yIChFbnVtZXJhdGlvbiBlPSBnZXRQcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisJCQlTdHJpbmcgcHJvcGVydHk9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKwkJCVN0cmluZyB2YWx1ZT0gZ2V0UHJvcGVydHkocHJvcGVydHkpOworCQkJcHJvcC5hcHBlbmQocHJvcGVydHkpOworCQkJcHJvcC5hcHBlbmQoSU5GT19WQUxVRV9TRVBBUkFUT1IpOworCQkJcHJvcC5hcHBlbmQodmFsdWUpOworCQkJaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCisJCQkJcHJvcC5hcHBlbmQoSU5GT19TRVBBUkFUT1IpOworCQl9CisJCXByb3AuYXBwZW5kKElORk9fRU5EKTsKKwkJcmV0dXJuIHByb3AudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogU2V0cyB0aGUgZmlsZSBudW1iZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsZU51bWJlcihpbnQgZmlsZU51bWJlcikgeworCQl0aGlzLmZpbGVOdW1iZXI9IGZpbGVOdW1iZXI7CisJfQorCS8qKgorCSAqIGdldFByb3BlcnR5TmFtZXMgbWV0aG9kIGNvbW1lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgzKTsKKwkJcHJvcGVydGllc1NpemUgKz0gKElORk9fU0VQQVJBVE9SLmxlbmd0aCgpICsgcHJvcGVydHlOYW1lLmxlbmd0aCgpICsgSU5GT19WQUxVRV9TRVBBUkFUT1IubGVuZ3RoKCkgKyB2YWx1ZS5sZW5ndGgoKSkgKiAyOworCQlpZiAocHJvcGVydGllc1NpemUgPCBNQVhfUFJPUEVSVElFU19TSVpFKQorCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiSW5kZXhlZEZpbGUoIiArIGZpbGVOdW1iZXIgKyAiOiAiICsgcGF0aCArICIpIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZUhhc2hlZEFycmF5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZUhhc2hlZEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5OTgyYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZWRGaWxlSGFzaGVkQXJyYXkuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbmRleGVkRmlsZUhhc2hlZEFycmF5IHsKKworcHJpdmF0ZSBJbmRleGVkRmlsZSBlbGVtZW50c1tdOworcHJpdmF0ZSBpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKK3ByaXZhdGUgaW50IHRocmVzaG9sZDsKK3ByaXZhdGUgaW50IGxhc3RJZDsKK3ByaXZhdGUgQXJyYXlMaXN0IHJlcGxhY2VkRWxlbWVudHM7CisKK3B1YmxpYyBJbmRleGVkRmlsZUhhc2hlZEFycmF5KGludCBzaXplKSB7CisJaWYgKHNpemUgPCA3KSBzaXplID0gNzsKKwl0aGlzLmVsZW1lbnRzID0gbmV3IEluZGV4ZWRGaWxlWzIgKiBzaXplICsgMV07CisJdGhpcy5lbGVtZW50U2l6ZSA9IDA7CisJdGhpcy50aHJlc2hvbGQgPSBzaXplICsgMTsgLy8gc2l6ZSBpcyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCisJdGhpcy5sYXN0SWQgPSAwOworCXRoaXMucmVwbGFjZWRFbGVtZW50cyA9IG51bGw7Cit9CisKK3B1YmxpYyBJbmRleGVkRmlsZSBhZGQoSURvY3VtZW50IGRvY3VtZW50KSB7CisJcmV0dXJuIGFkZChuZXcgSW5kZXhlZEZpbGUoZG9jdW1lbnQsICsrbGFzdElkKSk7Cit9CisKK3ByaXZhdGUgSW5kZXhlZEZpbGUgYWRkKEluZGV4ZWRGaWxlIGZpbGUpIHsKKwlpbnQgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7CisJaW50IGluZGV4ID0gKHBhdGguaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgbGVuZ3RoOworCUluZGV4ZWRGaWxlIGN1cnJlbnQ7CisJd2hpbGUgKChjdXJyZW50ID0gZWxlbWVudHNbaW5kZXhdKSAhPSBudWxsKSB7CisJCWlmIChjdXJyZW50LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKKwkJCWlmIChyZXBsYWNlZEVsZW1lbnRzID09IG51bGwpIHJlcGxhY2VkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDUpOworCQkJcmVwbGFjZWRFbGVtZW50cy5hZGQoY3VycmVudCk7CisJCQlyZXR1cm4gZWxlbWVudHNbaW5kZXhdID0gZmlsZTsKKwkJfQorCQlpZiAoKytpbmRleCA9PSBsZW5ndGgpIGluZGV4ID0gMDsKKwl9CisJZWxlbWVudHNbaW5kZXhdID0gZmlsZTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgZ3JvdygpOworCXJldHVybiBmaWxlOworfQorCitwdWJsaWMgSW5kZXhlZEZpbGVbXSBhc0FycmF5KCkgeworCUluZGV4ZWRGaWxlW10gYXJyYXkgPSBuZXcgSW5kZXhlZEZpbGVbbGFzdElkXTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSW5kZXhlZEZpbGUgY3VycmVudCA9IGVsZW1lbnRzW2ldOworCQlpZiAoY3VycmVudCAhPSBudWxsKQorCQkJYXJyYXlbY3VycmVudC5maWxlTnVtYmVyIC0gMV0gPSBjdXJyZW50OworCX0KKwlpZiAocmVwbGFjZWRFbGVtZW50cyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXBsYWNlZEVsZW1lbnRzLnNpemUoKTsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJbmRleGVkRmlsZSBjdXJyZW50ID0gKEluZGV4ZWRGaWxlKSByZXBsYWNlZEVsZW1lbnRzLmdldChpKTsKKwkJCWFycmF5W2N1cnJlbnQuZmlsZU51bWJlciAtIDFdID0gY3VycmVudDsKKwkJfQorCX0KKwlyZXR1cm4gYXJyYXk7Cit9CisKK3B1YmxpYyBJbmRleGVkRmlsZSBnZXQoU3RyaW5nIHBhdGgpIHsKKwlpbnQgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOworCWludCBpbmRleCA9IChwYXRoLmhhc2hDb2RlKCkgJiAweDdGRkZGRkZGKSAlIGxlbmd0aDsKKwlJbmRleGVkRmlsZSBjdXJyZW50OworCXdoaWxlICgoY3VycmVudCA9IGVsZW1lbnRzW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoY3VycmVudC5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKSByZXR1cm4gY3VycmVudDsKKwkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CisJfQorCXJldHVybiBudWxsOworfQorCitwcml2YXRlIHZvaWQgZ3JvdygpIHsKKwlJbmRleGVkRmlsZUhhc2hlZEFycmF5IG5ld0FycmF5ID0gbmV3IEluZGV4ZWRGaWxlSGFzaGVkQXJyYXkoZWxlbWVudFNpemUgKiAyKTsgLy8gZG91YmxlIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmIChlbGVtZW50c1tpXSAhPSBudWxsKQorCQkJbmV3QXJyYXkuYWRkKGVsZW1lbnRzW2ldKTsKKworCS8vIGxlYXZlIHJlcGxhY2VkRWxlbWVudHMgYXMgaXMKKwl0aGlzLmVsZW1lbnRzID0gbmV3QXJyYXkuZWxlbWVudHM7CisJdGhpcy5lbGVtZW50U2l6ZSA9IG5ld0FycmF5LmVsZW1lbnRTaXplOworCXRoaXMudGhyZXNob2xkID0gbmV3QXJyYXkudGhyZXNob2xkOworfQorCitwdWJsaWMgaW50IHNpemUoKSB7CisJcmV0dXJuIGVsZW1lbnRTaXplICsgKHJlcGxhY2VkRWxlbWVudHMgPT0gbnVsbCA/IDAgOiByZXBsYWNlZEVsZW1lbnRzLnNpemUoKSk7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCUluZGV4ZWRGaWxlW10gZmlsZXMgPSBhc0FycmF5KCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQlzICs9IGZpbGVzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0xJAorCXJldHVybiBzOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZXJPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZXJPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTcwMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlck91dHB1dC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXJPdXRwdXQ7CisKKy8qKgorICogQW4gaW5kZXhlck91dHB1dCBpcyB1c2VkIGJ5IGFuIGluZGV4ZXIgdG8gYWRkIGRvY3VtZW50cyBhbmQgd29yZCByZWZlcmVuY2VzIHRvCisgKiBhbiBpbk1lbW9yeUluZGV4LiBJdCBrZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgaW5kZXhlZCBhbmQgYWRkIHRoZQorICogd29yZCByZWZlcmVuY2VzIHRvIHRoaXMgZG9jdW1lbnQgKHNvIHlvdSBkbyBub3QgbmVlZCB0byBwcmVjaXNlIHRoZSBkb2N1bWVudAorICogZWFjaCB0aW1lIHlvdSBhZGQgYSB3b3JkKS4KKyAqLworCitwdWJsaWMgY2xhc3MgSW5kZXhlck91dHB1dCBpbXBsZW1lbnRzIElJbmRleGVyT3V0cHV0IHsKKwlwcm90ZWN0ZWQgSW5NZW1vcnlJbmRleCBpbmRleDsKKwlwcm90ZWN0ZWQgSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGU7CisJcHJvdGVjdGVkIElEb2N1bWVudCBkb2N1bWVudDsKKwkvKioKKwkgKiBJbmRleGVyT3V0cHV0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIEluZGV4ZXJPdXRwdXQoSW5NZW1vcnlJbmRleCBpbmRleCkgeworCQl0aGlzLmluZGV4PSBpbmRleDsKKwl9CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgdG8gdGhlIGluTWVtb3J5SW5kZXguCisJICovCisKKwlwdWJsaWMgdm9pZCBhZGREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJaWYgKGluZGV4ZWRGaWxlID09IG51bGwpIHsKKwkJCWluZGV4ZWRGaWxlPSBpbmRleC5hZGREb2N1bWVudChkb2N1bWVudCk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisJCX0KKwl9CisJLyoqCisJICogQWRkcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gd29yZCB0byB0aGUgaW5NZW1vcnlJbmRleC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZWYoY2hhcltdIHdvcmQpIHsKKwkJaWYgKGluZGV4ZWRGaWxlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJfQorCQlpbmRleC5hZGRSZWYoaW5kZXhlZEZpbGUsIHdvcmQpOworCX0KKwkvKioKKwkgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiB3b3JkIHRvIHRoZSBpbk1lbW9yeUluZGV4LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFJlZihTdHJpbmcgd29yZCkgeworCQlhZGRSZWYod29yZC50b0NoYXJBcnJheSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbnQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitwdWJsaWMgY2xhc3MgSW50IHsKKwlwdWJsaWMgaW50IHZhbHVlOworCS8qKgorCSAqIEludCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBJbnQoaW50IGkpIHsKKwkJdmFsdWU9IGk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9KYXJGaWxlRG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTcwYzZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CisKKy8qKgorICogQW4gPGNvZGU+SmFyRmlsZURvY3VtZW50PC9jb2RlPiByZXByZXNlbnRzIGFuIGphciBmaWxlLgorICovCisKK3B1YmxpYyBjbGFzcyBKYXJGaWxlRG9jdW1lbnQgZXh0ZW5kcyBQcm9wZXJ0eURvY3VtZW50IHsKKwlwcm90ZWN0ZWQgSUZpbGUgZmlsZTsKKwkvKioKKwkgKiBKYXJGaWxlRG9jdW1lbnQgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgSmFyRmlsZURvY3VtZW50KElGaWxlIGZpbGUpIHsKKwkJdGhpcy5maWxlID0gZmlsZTsKKwl9CisJLyoqCisJICogVGhpcyBBUEkgYWx3YXlzIHJldHVybiBudWxsIGZvciBhIEphckZpbGVEb2N1bWVudAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEJ5dGVDb250ZW50KCkKKwkgKi8KKwlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCSAqIFRoaXMgQVBJIGFsd2F5cyByZXR1cm4gbnVsbCBmb3IgYSBKYXJGaWxlRG9jdW1lbnQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXRDaGFyQ29udGVudCgpCisJICovCisJcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKwlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogVGhpcyBBUEkgYWx3YXlzIHJldHVybiBudWxsIGZvciBhIEphckZpbGVEb2N1bWVudAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEJ5dGVDb250ZW50KCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0NvbnRlbnQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXRUeXBlKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCVN0cmluZyBleHRlbnNpb249IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOworCQlpZiAoZXh0ZW5zaW9uID09IG51bGwpCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGV4dGVuc2lvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9KYXJGaWxlRW50cnlEb2N1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZUVudHJ5RG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk5MjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZUVudHJ5RG9jdW1lbnQuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CisKKworLyoqCisgKiBBbiA8Y29kZT5KYXJGaWxlRW50cnlEb2N1bWVudDwvY29kZT4gcmVwcmVzZW50cyBhbiBqYXIgZmlsZS4KKyAqLworCitwdWJsaWMgY2xhc3MgSmFyRmlsZUVudHJ5RG9jdW1lbnQgZXh0ZW5kcyBQcm9wZXJ0eURvY3VtZW50IHsKKwlwcm90ZWN0ZWQgWmlwRW50cnkgemlwRW50cnk7CisJcHJvdGVjdGVkIGJ5dGVbXSBieXRlQ29udGVudHM7CisJcHJvdGVjdGVkIFBhdGggemlwRmlsZVBhdGg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkCisvKioKKyAqIEphckZpbGVFbnRyeURvY3VtZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBKYXJGaWxlRW50cnlEb2N1bWVudChaaXBFbnRyeSBlbnRyeSwgYnl0ZVtdIGNvbnRlbnRzLCBQYXRoIHppcEZpbGVQYXRoKSB7CisJdGhpcy56aXBFbnRyeSA9IGVudHJ5OworCXRoaXMuYnl0ZUNvbnRlbnRzID0gY29udGVudHM7CisJdGhpcy56aXBGaWxlUGF0aCA9IHppcEZpbGVQYXRoOworfQorLyoqCisgKiBUaGlzIEFQSSBhbHdheXMgcmV0dXJuIG51bGwgZm9yIGEgSmFyRmlsZURvY3VtZW50CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXRCeXRlQ29udGVudCgpCisgKi8KK3B1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiB0aGlzLmJ5dGVDb250ZW50czsKK30KKy8qKgorICogVGhpcyBBUEkgYWx3YXlzIHJldHVybiBudWxsIGZvciBhIEphckZpbGVEb2N1bWVudAorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnQoKQorICovCitwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlyZXR1cm4gbnVsbDsKK30KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB6aXBGaWxlUGF0aCArIEpBUl9GSUxFX0VOVFJZX1NFUEFSQVRPUiArIHppcEVudHJ5LmdldE5hbWUoKTsKKwl9CisvKioKKyAqIFRoaXMgQVBJIGFsd2F5cyByZXR1cm4gbnVsbCBmb3IgYSBKYXJGaWxlRG9jdW1lbnQKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEJ5dGVDb250ZW50KCkKKyAqLworcHVibGljIFN0cmluZyBnZXRTdHJpbmdDb250ZW50KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCXJldHVybiBudWxsOworfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldFR5cGUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwl9CitwdWJsaWMgdm9pZCBzZXRCeXRlcyhieXRlW10gYnl0ZUNvbnRlbnRzKSB7CisJdGhpcy5ieXRlQ29udGVudHMgPSBieXRlQ29udGVudHM7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9MUlVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JkNWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YQpAQCAtMCwwICsxLDQ3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIFRoZSA8Y29kZT5MUlVDYWNoZTwvY29kZT4gaXMgYSBoYXNodGFibGUgdGhhdCBzdG9yZXMgYSBmaW5pdGUgbnVtYmVyIG9mIGVsZW1lbnRzLiAgCisgKiBXaGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgdmFsdWVzIHRvIGEgZnVsbCBjYWNoZSwgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgdmFsdWVzCisgKiBpbiB0aGUgY2FjaGUgYXJlIGRpc2NhcmRlZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgdmFsdWVzIGFzIG5lY2Vzc2FyeS4KKyAqIAorICogPHA+VGhlIGRhdGEgc3RydWN0dXJlIGlzIGJhc2VkIG9uIHRoZSBMUlUgdmlydHVhbCBtZW1vcnkgcGFnaW5nIHNjaGVtZS4KKyAqIAorICogPHA+T2JqZWN0cyBjYW4gdGFrZSB1cCBhIHZhcmlhYmxlIGFtb3VudCBvZiBjYWNoZSBzcGFjZSBieSBpbXBsZW1lbnRpbmcKKyAqIHRoZSA8Y29kZT5JTFJVQ2FjaGVhYmxlPC9jb2RlPiBpbnRlcmZhY2UuCisgKgorICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBOT1QgdGhyZWFkLXNhZmUuICBTeW5jaHJvbml6YXRpb24gd3JhcHBlcnMgd291bGQKKyAqIGhhdmUgdG8gYmUgYWRkZWQgdG8gZW5zdXJlIGF0b21pYyBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgZnJvbSB0aGUgY2FjaGUuCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLklMUlVDYWNoZWFibGUKKyAqLworcHVibGljIGNsYXNzIExSVUNhY2hlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworCS8qKgorCSAqIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIExSVUNhY2hlIHRvIHJlcHJlc2VudCBlbnRyaWVzIAorCSAqIHN0b3JlZCBpbiB0aGUgY2FjaGUuCisJICogSXQgaXMgc3RhdGljIGJlY2F1c2UgaXQgZG9lcyBub3QgcmVxdWlyZSBhIHBvaW50ZXIgdG8gdGhlIGNhY2hlCisJICogd2hpY2ggY29udGFpbnMgaXQuCisJICoKKwkgKiBAc2VlIExSVUNhY2hlCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMUlVDYWNoZUVudHJ5IHsKKworCQkvKioKKwkJICogSGFzaCB0YWJsZSBrZXkKKwkJICovCisJCS8qIHBhY2thZ2UgKi8KKwkJT2JqZWN0IF9mS2V5OworCisJCS8qKgorCQkgKiBIYXNoIHRhYmxlIHZhbHVlIChhbiBMUlVDYWNoZUVudHJ5IG9iamVjdCkKKwkJICovCisJCS8qIHBhY2thZ2UgKi8KKwkJT2JqZWN0IF9mVmFsdWU7CisKKwkJLyoqCisJCSAqIFRpbWUgdmFsdWUgZm9yIHF1ZXVlIHNvcnRpbmcKKwkJICovCisJCS8qIHBhY2thZ2UgKi8KKwkJaW50IF9mVGltZXN0YW1wOworCisJCS8qKgorCQkgKiBDYWNoZSBmb290cHJpbnQgb2YgdGhpcyBlbnRyeQorCQkgKi8KKwkJaW50IF9mU3BhY2U7CisKKwkJLyoqCisJCSAqIFByZXZpb3VzIGVudHJ5IGluIHF1ZXVlCisJCSAqLworCQkvKiBwYWNrYWdlICovCisJCUxSVUNhY2hlRW50cnkgX2ZQcmV2aW91czsKKworCQkvKioKKwkJICogTmV4dCBlbnRyeSBpbiBxdWV1ZQorCQkgKi8KKwkJLyogcGFja2FnZSAqLworCQlMUlVDYWNoZUVudHJ5IF9mTmV4dDsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2ZXIgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzCisJCSAqIGZvciBrZXksIHZhbHVlLCBhbmQgc3BhY2UuCisJCSAqLworCQlwdWJsaWMgTFJVQ2FjaGVFbnRyeShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGludCBzcGFjZSkgeworCQkJX2ZLZXk9IGtleTsKKwkJCV9mVmFsdWU9IHZhbHVlOworCQkJX2ZTcGFjZT0gc3BhY2U7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoaXMgb2JqZWN0LgorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCQkJcmV0dXJuICJMUlVDYWNoZUVudHJ5IFsiICsgX2ZLZXkgKyAiLS0+IiArIF9mVmFsdWUgKyAiXSI7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiBBbW91bnQgb2YgY2FjaGUgc3BhY2UgdXNlZCBzbyBmYXIKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZDdXJyZW50U3BhY2U7CisKKwkvKioKKwkgKiBNYXhpbXVtIHNwYWNlIGFsbG93ZWQgaW4gY2FjaGUKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGZTcGFjZUxpbWl0OworCisJLyoqCisJICogQ291bnRlciBmb3IgaGFuZGluZyBvdXQgc2VxdWVudGlhbCB0aW1lc3RhbXBzCisJICovCisJcHJvdGVjdGVkIGludCBmVGltZXN0YW1wQ291bnRlcjsKKworCS8qKgorCSAqIEhhc2ggdGFibGUgZm9yIGZhc3QgcmFuZG9tIGFjY2VzcyB0byBjYWNoZSBlbnRyaWVzCisJICovCisJcHJvdGVjdGVkIEhhc2h0YWJsZSBmRW50cnlUYWJsZTsKKworCS8qKgorCSAqIFN0YXJ0IG9mIHF1ZXVlIChtb3N0IHJlY2VudGx5IHVzZWQgZW50cnkpIAorCSAqLworCXByb3RlY3RlZCBMUlVDYWNoZUVudHJ5IGZFbnRyeVF1ZXVlOworCisJLyoqCisJICogRW5kIG9mIHF1ZXVlIChsZWFzdCByZWNlbnRseSB1c2VkIGVudHJ5KQorCSAqLworCXByb3RlY3RlZCBMUlVDYWNoZUVudHJ5IGZFbnRyeVF1ZXVlVGFpbDsKKworCS8qKgorCSAqIERlZmF1bHQgYW1vdW50IG9mIHNwYWNlIGluIHRoZSBjYWNoZQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1BBQ0VMSU1JVD0gMTAwOworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2FjaGUuICBTaXplIG9mIGNhY2hlIGlzIGRlZmluZWQgYnkgCisJICogPGNvZGU+REVGQVVMVF9TUEFDRUxJTUlUPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgTFJVQ2FjaGUoKSB7CisKKwkJdGhpcyhERUZBVUxUX1NQQUNFTElNSVQpOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNhY2hlLgorCSAqIEBwYXJhbSBzaXplIFNpemUgb2YgQ2FjaGUKKwkgKi8KKwlwdWJsaWMgTFJVQ2FjaGUoaW50IHNpemUpIHsKKworCQlmVGltZXN0YW1wQ291bnRlcj0gZkN1cnJlbnRTcGFjZT0gMDsKKwkJZkVudHJ5UXVldWU9IGZFbnRyeVF1ZXVlVGFpbD0gbnVsbDsKKwkJZkVudHJ5VGFibGU9IG5ldyBIYXNodGFibGUoc2l6ZSk7CisJCWZTcGFjZUxpbWl0PSBzaXplOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IGNhY2hlIGNvbnRhaW5pbmcgdGhlIHNhbWUgY29udGVudHMuCisJICoKKwkgKiBAcmV0dXJuIE5ldyBjb3B5IG9mIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworCisJCUxSVUNhY2hlIG5ld0NhY2hlPSBuZXdJbnN0YW5jZShmU3BhY2VMaW1pdCk7CisJCUxSVUNhY2hlRW50cnkgcUVudHJ5OworCisJCS8qIFByZXNlcnZlIG9yZGVyIG9mIGVudHJpZXMgYnkgY29weWluZyBmcm9tIG9sZGVzdCB0byBuZXdlc3QgKi8KKwkJcUVudHJ5PSB0aGlzLmZFbnRyeVF1ZXVlVGFpbDsKKwkJd2hpbGUgKHFFbnRyeSAhPSBudWxsKSB7CisJCQluZXdDYWNoZS5wcml2YXRlQWRkKHFFbnRyeS5fZktleSwgcUVudHJ5Ll9mVmFsdWUsIHFFbnRyeS5fZlNwYWNlKTsKKwkJCXFFbnRyeT0gcUVudHJ5Ll9mUHJldmlvdXM7CisJCX0KKwkJcmV0dXJuIG5ld0NhY2hlOworCX0KKwkvKioKKwkgKiBGbHVzaGVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCisJCWZDdXJyZW50U3BhY2U9IDA7CisJCUxSVUNhY2hlRW50cnkgZW50cnk9IGZFbnRyeVF1ZXVlVGFpbDsgLy8gUmVtZW1iZXIgbGFzdCBlbnRyeQorCQlmRW50cnlUYWJsZT0gbmV3IEhhc2h0YWJsZSgpOyAvLyBDbGVhciBpdCBvdXQKKwkJZkVudHJ5UXVldWU9IGZFbnRyeVF1ZXVlVGFpbD0gbnVsbDsKKwkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsgLy8gc2VuZCBkZWxldGlvbiBub3RpZmljYXRpb25zIGluIExSVSBvcmRlcgorCQkJcHJpdmF0ZU5vdGlmeURlbGV0aW9uRnJvbUNhY2hlKGVudHJ5KTsKKwkJCWVudHJ5PSBlbnRyeS5fZlByZXZpb3VzOworCQl9CisJfQorCS8qKgorCSAqIEZsdXNoZXMgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIGNhY2hlLiAgRG9lcyBub3RoaW5nIGlmIGVudHJ5IGRvZXMgbm90CisJICogZXhpc3QgaW4gY2FjaGUuCisJICoKKwkgKiBAcGFyYW0ga2V5IEtleSBvZiBvYmplY3QgdG8gZmx1c2gKKwkgKi8KKwlwdWJsaWMgdm9pZCBmbHVzaChPYmplY3Qga2V5KSB7CisKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeTsKKworCQllbnRyeT0gKExSVUNhY2hlRW50cnkpIGZFbnRyeVRhYmxlLmdldChrZXkpOworCisJCS8qIElmIGVudHJ5IGRvZXMgbm90IGV4aXN0LCByZXR1cm4gKi8KKwkJaWYgKGVudHJ5ID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJdGhpcy5wcml2YXRlUmVtb3ZlRW50cnkoZW50cnksIGZhbHNlKTsKKwl9CisJLyoqCisJICogQW5zd2VycyB0aGUgdmFsdWUgaW4gdGhlIGNhY2hlIGF0IHRoZSBnaXZlbiBrZXkuCisJICogSWYgdGhlIHZhbHVlIGlzIG5vdCBpbiB0aGUgY2FjaGUsIHJldHVybnMgbnVsbAorCSAqCisJICogQHBhcmFtIGtleSBIYXNoIHRhYmxlIGtleSBvZiBvYmplY3QgdG8gcmV0cmlldmUKKwkgKiBAcmV0dXJuIFJldHJlaXZlZCBvYmplY3QsIG9yIG51bGwgaWYgb2JqZWN0IGRvZXMgbm90IGV4aXN0CisJICovCisJcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworCisJCUxSVUNhY2hlRW50cnkgZW50cnk9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQoa2V5KTsKKwkJaWYgKGVudHJ5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJdGhpcy51cGRhdGVUaW1lc3RhbXAoZW50cnkpOworCQlyZXR1cm4gZW50cnkuX2ZWYWx1ZTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHNwYWNlIHRoYXQgaXMgY3VycmVudCB1c2VkIGluIHRoZSBjYWNoZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldEN1cnJlbnRTcGFjZSgpIHsKKwkJcmV0dXJuIGZDdXJyZW50U3BhY2U7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1heGltdW0gYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGUuCisJICovCisJcHVibGljIGludCBnZXRTcGFjZUxpbWl0KCkgeworCQlyZXR1cm4gZlNwYWNlTGltaXQ7CisJfQorCS8qKgorCSAqIFJldHVybnMgYW4gRW51bWVyYXRpb24gb2YgdGhlIGtleXMgY3VycmVudGx5IGluIHRoZSBjYWNoZS4KKwkgKi8KKwlwdWJsaWMgRW51bWVyYXRpb24ga2V5cygpIHsKKworCQlyZXR1cm4gZkVudHJ5VGFibGUua2V5cygpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIGtleXMgYW5kIHZhbHVlcyAKKwkgKiBjdXJyZW50bHkgaW4gdGhlIGNhY2hlLgorCSAqLworCXB1YmxpYyBJQ2FjaGVFbnVtZXJhdGlvbiBrZXlzQW5kVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IElDYWNoZUVudW1lcmF0aW9uKCkgeworCisJCQlFbnVtZXJhdGlvbiBmVmFsdWVzPSBmRW50cnlUYWJsZS5lbGVtZW50cygpOworCQkJTFJVQ2FjaGVFbnRyeSBmRW50cnk7CisKKwkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKwkJCQlyZXR1cm4gZlZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKTsKKwkJCX0KKworCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKwkJCQlmRW50cnk9IChMUlVDYWNoZUVudHJ5KSBmVmFsdWVzLm5leHRFbGVtZW50KCk7CisJCQkJcmV0dXJuIGZFbnRyeS5fZktleTsKKwkJCX0KKworCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKwkJCQlpZiAoZkVudHJ5ID09IG51bGwpIHsKKwkJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCXJldHVybiBmRW50cnkuX2ZWYWx1ZTsKKwkJCX0KKwkJfTsKKwl9CisJLyoqCisJICogRW5zdXJlcyB0aGVyZSBpcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBmcmVlIHNwYWNlIGluIHRoZSByZWNlaXZlciwKKwkgKiBieSByZW1vdmluZyBvbGQgZW50cmllcyBpZiBuZWNlc3NhcnkuICBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3RlZCBzcGFjZSB3YXMKKwkgKiBtYWRlIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqCisJICogQHBhcmFtIHNwYWNlIEFtb3VudCBvZiBzcGFjZSB0byBmcmVlIHVwCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbWFrZVNwYWNlKGludCBzcGFjZSkgeworCisJCWludCBsaW1pdDsKKworCQlsaW1pdD0gdGhpcy5nZXRTcGFjZUxpbWl0KCk7CisKKwkJLyogaWYgc3BhY2UgaXMgYWxyZWFkeSBhdmFpbGFibGUgKi8KKwkJaWYgKGZDdXJyZW50U3BhY2UgKyBzcGFjZSA8PSBsaW1pdCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvKiBpZiBlbnRyeSBpcyB0b28gYmlnIGZvciBjYWNoZSAqLworCQlpZiAoc3BhY2UgPiBsaW1pdCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyogRnJlZSB1cCBzcGFjZSBieSByZW1vdmluZyBvbGRlc3QgZW50cmllcyAqLworCQl3aGlsZSAoZkN1cnJlbnRTcGFjZSArIHNwYWNlID4gbGltaXQgJiYgZkVudHJ5UXVldWVUYWlsICE9IG51bGwpIHsKKwkJCXRoaXMucHJpdmF0ZVJlbW92ZUVudHJ5KGZFbnRyeVF1ZXVlVGFpbCwgZmFsc2UpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IExSVUNhY2hlIGluc3RhbmNlCisJICovCisJcHJvdGVjdGVkIExSVUNhY2hlIG5ld0luc3RhbmNlKGludCBzaXplKSB7CisJCXJldHVybiBuZXcgTFJVQ2FjaGUoc2l6ZSk7CisJfQorCS8qKgorCSAqIEFkZHMgYW4gZW50cnkgZm9yIHRoZSBnaXZlbiBrZXkvdmFsdWUvc3BhY2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZUFkZChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIGludCBzcGFjZSkgeworCisJCUxSVUNhY2hlRW50cnkgZW50cnk7CisKKwkJZW50cnk9IG5ldyBMUlVDYWNoZUVudHJ5KGtleSwgdmFsdWUsIHNwYWNlKTsKKwkJdGhpcy5wcml2YXRlQWRkRW50cnkoZW50cnksIGZhbHNlKTsKKwl9CisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcmVjZWl2ZXIuCisJICogQHBhcmFtIHNodWZmbGUgSW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGp1c3Qgc2h1ZmZsaW5nIHRoZSBxdWV1ZSAKKwkgKiAoaS5lLiwgdGhlIGVudHJ5IHRhYmxlIGlzIGxlZnQgYWxvbmUpLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaXZhdGVBZGRFbnRyeShMUlVDYWNoZUVudHJ5IGVudHJ5LCBib29sZWFuIHNodWZmbGUpIHsKKworCQlpZiAoIXNodWZmbGUpIHsKKwkJCWZFbnRyeVRhYmxlLnB1dChlbnRyeS5fZktleSwgZW50cnkpOworCQkJZkN1cnJlbnRTcGFjZSArPSBlbnRyeS5fZlNwYWNlOworCQl9CisKKwkJZW50cnkuX2ZUaW1lc3RhbXA9IGZUaW1lc3RhbXBDb3VudGVyKys7CisJCWVudHJ5Ll9mTmV4dD0gdGhpcy5mRW50cnlRdWV1ZTsKKwkJZW50cnkuX2ZQcmV2aW91cz0gbnVsbDsKKworCQlpZiAoZkVudHJ5UXVldWUgPT0gbnVsbCkgeworCQkJLyogdGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgZW50cnkgKi8KKwkJCWZFbnRyeVF1ZXVlVGFpbD0gZW50cnk7CisJCX0gZWxzZSB7CisJCQlmRW50cnlRdWV1ZS5fZlByZXZpb3VzPSBlbnRyeTsKKwkJfQorCisJCWZFbnRyeVF1ZXVlPSBlbnRyeTsKKwl9CisJLyoqCisJICogQW4gZW50cnkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSwgZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBoYXMgCisJICogZmFsbGVuIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBMUlUgcXVldWUuICAKKwkgKiBTdWJjbGFzc2VzIGNvdWxkIG92ZXItcmlkZSB0aGlzIHRvIGltcGxlbWVudCBhIHBlcnNpc3RlbnQgY2FjaGUgYmVsb3cgdGhlIExSVSBjYWNoZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlTm90aWZ5RGVsZXRpb25Gcm9tQ2FjaGUoTFJVQ2FjaGVFbnRyeSBlbnRyeSkgeworCQkvLyBEZWZhdWx0IGlzIE5PUC4KKwl9CisJLyoqCisJICogUmVtb3ZlcyB0aGUgZW50cnkgZnJvbSB0aGUgZW50cnkgcXVldWUuICAKKwkgKiBAcGFyYW0gc2h1ZmZsZSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUganVzdCBzaHVmZmxpbmcgdGhlIHF1ZXVlIAorCSAqIChpLmUuLCB0aGUgZW50cnkgdGFibGUgaXMgbGVmdCBhbG9uZSkuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZVJlbW92ZUVudHJ5KExSVUNhY2hlRW50cnkgZW50cnksIGJvb2xlYW4gc2h1ZmZsZSkgeworCisJCUxSVUNhY2hlRW50cnkgcHJldmlvdXMsIG5leHQ7CisKKwkJcHJldmlvdXM9IGVudHJ5Ll9mUHJldmlvdXM7CisJCW5leHQ9IGVudHJ5Ll9mTmV4dDsKKworCQlpZiAoIXNodWZmbGUpIHsKKwkJCWZFbnRyeVRhYmxlLnJlbW92ZShlbnRyeS5fZktleSk7CisJCQlmQ3VycmVudFNwYWNlIC09IGVudHJ5Ll9mU3BhY2U7CisJCQlwcml2YXRlTm90aWZ5RGVsZXRpb25Gcm9tQ2FjaGUoZW50cnkpOworCQl9CisKKwkJLyogaWYgdGhpcyB3YXMgdGhlIGZpcnN0IGVudHJ5ICovCisJCWlmIChwcmV2aW91cyA9PSBudWxsKSB7CisJCQlmRW50cnlRdWV1ZT0gbmV4dDsKKwkJfSBlbHNlIHsKKwkJCXByZXZpb3VzLl9mTmV4dD0gbmV4dDsKKwkJfQorCisJCS8qIGlmIHRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5ICovCisJCWlmIChuZXh0ID09IG51bGwpIHsKKwkJCWZFbnRyeVF1ZXVlVGFpbD0gcHJldmlvdXM7CisJCX0gZWxzZSB7CisJCQluZXh0Ll9mUHJldmlvdXM9IHByZXZpb3VzOworCQl9CisJfQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSBjYWNoZSBhdCB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIHRoZSB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBrZXkgS2V5IG9mIG9iamVjdCB0byBhZGQuCisJICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIG9iamVjdCB0byBhZGQuCisJICogQHJldHVybiBhZGRlZCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKworCQlpbnQgbmV3U3BhY2UsIG9sZFNwYWNlLCBuZXdUb3RhbDsKKwkJTFJVQ2FjaGVFbnRyeSBlbnRyeTsKKworCQkvKiBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW4gZW50cnkgaW4gdGhlIGNhY2hlICovCisJCW5ld1NwYWNlPSBzcGFjZUZvcihrZXksIHZhbHVlKTsKKwkJZW50cnk9IChMUlVDYWNoZUVudHJ5KSBmRW50cnlUYWJsZS5nZXQoa2V5KTsKKworCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCisJCQkvKioKKwkJCSAqIFJlcGxhY2UgdGhlIGVudHJ5IGluIHRoZSBjYWNoZSBpZiBpdCB3b3VsZCBub3Qgb3ZlcmZsb3cKKwkJCSAqIHRoZSBjYWNoZS4gIE90aGVyd2lzZSBmbHVzaCB0aGUgZW50cnkgYW5kIHJlLWFkZCBpdCBzbyBhcyAKKwkJCSAqIHRvIGtlZXAgY2FjaGUgd2l0aGluIGJ1ZGdldAorCQkJICovCisJCQlvbGRTcGFjZT0gZW50cnkuX2ZTcGFjZTsKKwkJCW5ld1RvdGFsPSBnZXRDdXJyZW50U3BhY2UoKSAtIG9sZFNwYWNlICsgbmV3U3BhY2U7CisJCQlpZiAobmV3VG90YWwgPD0gZ2V0U3BhY2VMaW1pdCgpKSB7CisJCQkJdXBkYXRlVGltZXN0YW1wKGVudHJ5KTsKKwkJCQllbnRyeS5fZlZhbHVlPSB2YWx1ZTsKKwkJCQllbnRyeS5fZlNwYWNlPSBuZXdTcGFjZTsKKwkJCQl0aGlzLmZDdXJyZW50U3BhY2U9IG5ld1RvdGFsOworCQkJCXJldHVybiB2YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdmF0ZVJlbW92ZUVudHJ5KGVudHJ5LCBmYWxzZSk7CisJCQl9CisJCX0KKwkJaWYgKG1ha2VTcGFjZShuZXdTcGFjZSkpIHsKKwkJCXByaXZhdGVBZGQoa2V5LCB2YWx1ZSwgbmV3U3BhY2UpOworCQl9CisJCXJldHVybiB2YWx1ZTsKKwl9CisJLyoqCisJICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4ga2V5LgorCSAqIElmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBjYWNoZSwgcmV0dXJucyBudWxsLgorCSAqCisJICogQHBhcmFtIGtleSBLZXkgb2Ygb2JqZWN0IHRvIHJlbW92ZSBmcm9tIGNhY2hlLgorCSAqIEByZXR1cm4gVmFsdWUgcmVtb3ZlZCBmcm9tIGNhY2hlLgorCSAqLworCXB1YmxpYyBPYmplY3QgcmVtb3ZlS2V5KE9iamVjdCBrZXkpIHsKKworCQlMUlVDYWNoZUVudHJ5IGVudHJ5PSAoTFJVQ2FjaGVFbnRyeSkgZkVudHJ5VGFibGUuZ2V0KGtleSk7CisJCWlmIChlbnRyeSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlPYmplY3QgdmFsdWU9IGVudHJ5Ll9mVmFsdWU7CisJCXRoaXMucHJpdmF0ZVJlbW92ZUVudHJ5KGVudHJ5LCBmYWxzZSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJLyoqCisJICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3BhY2UgdGhhdCB0aGUgY2FjaGUgY2FuIHN0b3JlCisJICoKKwkgKiBAcGFyYW0gbGltaXQgTnVtYmVyIG9mIHVuaXRzIG9mIGNhY2hlIHNwYWNlCisJICovCisJcHVibGljIHZvaWQgc2V0U3BhY2VMaW1pdChpbnQgbGltaXQpIHsKKwkJaWYgKGxpbWl0IDwgZlNwYWNlTGltaXQpIHsKKwkJCW1ha2VTcGFjZShmU3BhY2VMaW1pdCAtIGxpbWl0KTsKKwkJfQorCQlmU3BhY2VMaW1pdD0gbGltaXQ7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBpbnQgc3BhY2VGb3IoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUxSVUNhY2hlYWJsZSkgeworCQkJcmV0dXJuICgoSUxSVUNhY2hlYWJsZSkgdmFsdWUpLmdldENhY2hlRm9vdHByaW50KCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhpcyBvYmplY3QuICBUaGlzIG1ldGhvZAorCSAqIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisJCXJldHVybiAiTFJVQ2FjaGUgIiArIChnZXRDdXJyZW50U3BhY2UoKSAqIDEwMC4wIC8gZ2V0U3BhY2VMaW1pdCgpKSArICIlIGZ1bGwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJLyoqCisJICogVXBkYXRlcyB0aGUgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gZW50cnksIGVuc3VyaW5nIHRoYXQgdGhlIHF1ZXVlIGlzIAorCSAqIGtlcHQgaW4gY29ycmVjdCBvcmRlci4gIFRoZSBlbnRyeSBtdXN0IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGltZXN0YW1wKExSVUNhY2hlRW50cnkgZW50cnkpIHsKKworCQllbnRyeS5fZlRpbWVzdGFtcD0gZlRpbWVzdGFtcENvdW50ZXIrKzsKKwkJaWYgKGZFbnRyeVF1ZXVlICE9IGVudHJ5KSB7CisJCQl0aGlzLnByaXZhdGVSZW1vdmVFbnRyeShlbnRyeSwgdHJ1ZSk7CisJCQl0aGlzLnByaXZhdGVBZGRFbnRyeShlbnRyeSwgdHJ1ZSk7CisJCX0KKwkJcmV0dXJuOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL01lcmdlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTWVyZ2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ZjhlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL01lcmdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgbWVyZ2VGYWN0b3J5IGlzIHVzZWQgdG8gbWVyZ2UgMiBpbmRleGVzIGludG8gb25lLiBPbmUgb2YgdGhlIGluZGV4ZXMgCisgKiAob2xkSW5kZXgpIGlzIG9uIHRoZSBkaXNrIGFuZCB0aGUgb3RoZXIoYWRkc0luZGV4KSBpcyBpbiBtZW1vcnkuCisgKiBUaGUgbWVyZ2UgcmVzcGVjdHMgdGhlIGZvbGxvd2luZyBydWxlczogPGJyPgorICogICAtIFRoZSBmaWxlcyBhcmUgc29ydGVkIGluIGFscGhhYmV0aWNhbCBvcmRlcjs8YnI+CisgKiAgIC0gaWYgYSBmaWxlIGlzIGluIG9sZEluZGV4IGFuZCBhZGRzSW5kZXgsIHRoZSBvbmUgd2hpY2ggaXMgYWRkZWQgCisgKiBpcyB0aGUgb25lIGluIHRoZSBhZGRzSW5kZXguPGJyPgorICovCitwdWJsaWMgY2xhc3MgTWVyZ2VGYWN0b3J5IHsKKwkvKioKKwkgKiBJbnB1dCBvbiB0aGUgYWRkc0luZGV4LgorCSAqLworCXByb3RlY3RlZCBJbmRleElucHV0IGFkZHNJbnB1dDsKKworCS8qKgorCSAqIElucHV0IG9uIHRoZSBvbGRJbmRleC4gCisJICovCisJcHJvdGVjdGVkIEluZGV4SW5wdXQgb2xkSW5wdXQ7CisKKwkvKioKKwkgKiBPdXRwdXQgdG8gd3JpdGUgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UgaW4uCisJICovCisJcHJvdGVjdGVkIEJsb2Nrc0luZGV4T3V0cHV0IG1lcmdlT3V0cHV0OworCisJLyoqCisJICogRmlsZXMgcmVtb3ZlZCBmcm9tIG9sZEluZGV4LiAKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIHJlbW92ZWRJbk9sZDsKKworCS8qKgorCSAqIEZpbGVzIHJlbW92ZWQgZnJvbSBhZGRzSW5kZXguIAorCSAqLworCXByb3RlY3RlZCBNYXAgcmVtb3ZlZEluQWRkczsKKwlwcm90ZWN0ZWQgaW50W10gbWFwcGluZ09sZDsKKwlwcm90ZWN0ZWQgaW50W10gbWFwcGluZ0FkZHM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREU19JTkRFWD0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTERfSU5ERVg9IDE7CisJLyoqCisJICogTWVyZ2VGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogQHBhcmFtIGRpcmVjdG9yeSBqYXZhLmlvLkZpbGUKKwkgKi8KKwlwdWJsaWMgTWVyZ2VGYWN0b3J5KEluZGV4SW5wdXQgb2xkSW5kZXhJbnB1dCwgSW5kZXhJbnB1dCBhZGRzSW5kZXhJbnB1dCwgQmxvY2tzSW5kZXhPdXRwdXQgbWVyZ2VJbmRleE91dHB1dCwgTWFwIHJlbW92ZWRJbk9sZCwgTWFwIHJlbW92ZWRJbkFkZHMpIHsKKwkJb2xkSW5wdXQ9IG9sZEluZGV4SW5wdXQ7CisJCWFkZHNJbnB1dD0gYWRkc0luZGV4SW5wdXQ7CisJCW1lcmdlT3V0cHV0PSBtZXJnZUluZGV4T3V0cHV0OworCQl0aGlzLnJlbW92ZWRJbk9sZD0gcmVtb3ZlZEluT2xkOworCQl0aGlzLnJlbW92ZWRJbkFkZHM9IHJlbW92ZWRJbkFkZHM7CisJfQorCS8qKgorCSAqIEluaXRpYWxpc2UgdGhlIG1lcmdlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7CisJCW1hcHBpbmdPbGQ9IG5ldyBpbnRbb2xkSW5wdXQuZ2V0TnVtRmlsZXMoKSArIDFdOworCQltYXBwaW5nQWRkcz0gbmV3IGludFthZGRzSW5wdXQuZ2V0TnVtRmlsZXMoKSArIDFdOworCisJfQorCS8qKgorCSAqIE1lcmdlcyB0aGUgMiBpbmRleGVzIGludG8gYSBuZXcgb25lIG9uIHRoZSBkaXNrLgorCSAqLworCXB1YmxpYyB2b2lkIG1lcmdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCS8vaW5pdAorCQkJYWRkc0lucHV0Lm9wZW4oKTsKKwkJCW9sZElucHV0Lm9wZW4oKTsKKwkJCW1lcmdlT3V0cHV0Lm9wZW4oKTsKKwkJCWluaXQoKTsKKwkJCS8vbWVyZ2UKKwkJCS8vZmluZENoYW5nZXMoKTsKKwkJCW1lcmdlRmlsZXMoKTsKKwkJCW1lcmdlUmVmZXJlbmNlcygpOworCQkJbWVyZ2VPdXRwdXQuZmx1c2goKTsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vY2xvc2VzIGV2ZXJ5dGhpbmcKKwkJCW9sZElucHV0LmNsb3NlKCk7CisJCQlhZGRzSW5wdXQuY2xvc2UoKTsKKwkJCW1lcmdlT3V0cHV0LmNsb3NlKCk7CisJCX0KKwl9CisJLyoqCisJICogTWVyZ2VzIHRoZSBmaWxlcyBvZiB0aGUgMiBpbmRleGVzIGluIHRoZSBuZXcgaW5kZXgsIHJlbW92ZXMgdGhlIGZpbGVzCisJICogdG8gYmUgcmVtb3ZlZCwgYW5kIHJlY29yZHMgdGhlIGNoYW5nZXMgbWFkZSB0byBwcm9wYWdhdGUgdGhlbSB0byB0aGUgCisJICogd29yZCByZWZlcmVuY2VzLgorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgbWVyZ2VGaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCBwb3NpdGlvbkluTWVyZ2U9IDE7CisJCWludCBjb21wYXJlOworCQl3aGlsZSAob2xkSW5wdXQuaGFzTW9yZUZpbGVzKCkgfHwgYWRkc0lucHV0Lmhhc01vcmVGaWxlcygpKSB7CisJCQlJbmRleGVkRmlsZSBmaWxlMT0gb2xkSW5wdXQuZ2V0Q3VycmVudEZpbGUoKTsKKwkJCUluZGV4ZWRGaWxlIGZpbGUyPSBhZGRzSW5wdXQuZ2V0Q3VycmVudEZpbGUoKTsKKworCQkJLy9pZiB0aGUgZmlsZSBoYXMgYmVlbiByZW1vdmVkIHdlIGRvbid0IHRha2UgaXQgaW50byBhY2NvdW50CisJCQl3aGlsZSAoZmlsZTEgIT0gbnVsbCAmJiB3YXNSZW1vdmVkKGZpbGUxLCBPTERfSU5ERVgpKSB7CisJCQkJb2xkSW5wdXQubW92ZVRvTmV4dEZpbGUoKTsKKwkJCQlmaWxlMT0gb2xkSW5wdXQuZ2V0Q3VycmVudEZpbGUoKTsKKwkJCX0KKwkJCXdoaWxlIChmaWxlMiAhPSBudWxsICYmIHdhc1JlbW92ZWQoZmlsZTIsIEFERFNfSU5ERVgpKSB7CisJCQkJYWRkc0lucHV0Lm1vdmVUb05leHRGaWxlKCk7CisJCQkJZmlsZTI9IGFkZHNJbnB1dC5nZXRDdXJyZW50RmlsZSgpOworCQkJfQorCisJCQkvL3RoZSBhZGRzSW5kZXggd2FzIGVtcHR5LCB3ZSBqdXN0IHJlbW92ZWQgZmlsZXMgZnJvbSB0aGUgb2xkSW5kZXgKKwkJCWlmIChmaWxlMSA9PSBudWxsICYmIGZpbGUyID09IG51bGwpCisJCQkJYnJlYWs7CisKKwkJCS8vdGVzdCBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygb25lIHRoZSAyIGluZGV4CisJCQlpZiAoZmlsZTEgPT0gbnVsbCkKKwkJCQljb21wYXJlPSAxOworCQkJZWxzZSBpZiAoZmlsZTIgPT0gbnVsbCkKKwkJCQljb21wYXJlPSAtMTsKKwkJCWVsc2UKKwkJCQljb21wYXJlPSBmaWxlMS5nZXRQYXRoKCkuY29tcGFyZVRvKGZpbGUyLmdldFBhdGgoKSk7CisKKwkJCS8vcmVjb3JkcyB0aGUgY2hhbmdlcyB0byBNYWtlCisJCQlpZiAoY29tcGFyZSA9PSAwKSB7CisJCQkJLy90aGUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZDogCisJCQkJLy93ZSByZW1vdmUgaXQgZnJvbSB0aGUgb2xkSW5kZXggYW5kIGFkZCBpdCB0byB0aGUgYWRkc0luZGV4CisJCQkJcmVtb3ZlRmlsZShmaWxlMSwgT0xEX0lOREVYKTsKKwkJCQltYXBwaW5nQWRkc1tmaWxlMi5nZXRGaWxlTnVtYmVyKCldPSBwb3NpdGlvbkluTWVyZ2U7CisJCQkJZmlsZTEuc2V0RmlsZU51bWJlcihwb3NpdGlvbkluTWVyZ2UpOworCQkJCW1lcmdlT3V0cHV0LmFkZEZpbGUoZmlsZTEpOworCQkJCW9sZElucHV0Lm1vdmVUb05leHRGaWxlKCk7CisJCQkJYWRkc0lucHV0Lm1vdmVUb05leHRGaWxlKCk7CisJCQl9IGVsc2UgaWYgKGNvbXBhcmUgPCAwKSB7CisJCQkJbWFwcGluZ09sZFtmaWxlMS5nZXRGaWxlTnVtYmVyKCldPSBwb3NpdGlvbkluTWVyZ2U7CisJCQkJZmlsZTEuc2V0RmlsZU51bWJlcihwb3NpdGlvbkluTWVyZ2UpOworCQkJCW1lcmdlT3V0cHV0LmFkZEZpbGUoZmlsZTEpOworCQkJCW9sZElucHV0Lm1vdmVUb05leHRGaWxlKCk7CisJCQl9IGVsc2UgeworCQkJCW1hcHBpbmdBZGRzW2ZpbGUyLmdldEZpbGVOdW1iZXIoKV09IHBvc2l0aW9uSW5NZXJnZTsKKwkJCQlmaWxlMi5zZXRGaWxlTnVtYmVyKHBvc2l0aW9uSW5NZXJnZSk7CisJCQkJbWVyZ2VPdXRwdXQuYWRkRmlsZShmaWxlMik7CisJCQkJYWRkc0lucHV0Lm1vdmVUb05leHRGaWxlKCk7CisJCQl9CisJCQlwb3NpdGlvbkluTWVyZ2UrKzsKKwkJfQorCQltZXJnZU91dHB1dC5mbHVzaEZpbGVzKCk7CQkKKwl9CisJLyoqCisJICogTWVyZ2VzIHRoZSBmaWxlcyBvZiB0aGUgMiBpbmRleGVzIGluIHRoZSBuZXcgaW5kZXgsIGFjY29yZGluZyB0byB0aGUgY2hhbmdlcworCSAqIHJlY29yZGVkIGR1cmluZyBtZXJnZUZpbGVzKCkuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbWVyZ2VSZWZlcmVuY2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGNvbXBhcmU7CisJCXdoaWxlIChvbGRJbnB1dC5oYXNNb3JlV29yZHMoKSB8fCBhZGRzSW5wdXQuaGFzTW9yZVdvcmRzKCkpIHsKKwkJCVdvcmRFbnRyeSB3b3JkMT0gb2xkSW5wdXQuZ2V0Q3VycmVudFdvcmRFbnRyeSgpOworCQkJV29yZEVudHJ5IHdvcmQyPSBhZGRzSW5wdXQuZ2V0Q3VycmVudFdvcmRFbnRyeSgpOworCisJCQlpZiAod29yZDEgPT0gbnVsbCAmJiB3b3JkMiA9PSBudWxsKQorCQkJCWJyZWFrOworCQkJCisJCQlpZiAod29yZDEgPT0gbnVsbCkKKwkJCQljb21wYXJlPSAxOworCQkJZWxzZSBpZiAod29yZDIgPT0gbnVsbCkKKwkJCQljb21wYXJlPSAtMTsKKwkJCWVsc2UKKwkJCQljb21wYXJlPSBVdGlsLmNvbXBhcmUod29yZDEuZ2V0V29yZCgpLCB3b3JkMi5nZXRXb3JkKCkpOworCQkJaWYgKGNvbXBhcmUgPCAwKSB7CisJCQkJd29yZDEubWFwUmVmcyhtYXBwaW5nT2xkKTsKKwkJCQltZXJnZU91dHB1dC5hZGRXb3JkKHdvcmQxKTsKKwkJCQlvbGRJbnB1dC5tb3ZlVG9OZXh0V29yZEVudHJ5KCk7CisJCQl9IGVsc2UgaWYgKGNvbXBhcmUgPiAwKSB7CisJCQkJd29yZDIubWFwUmVmcyhtYXBwaW5nQWRkcyk7CisJCQkJbWVyZ2VPdXRwdXQuYWRkV29yZCh3b3JkMik7CisJCQkJYWRkc0lucHV0Lm1vdmVUb05leHRXb3JkRW50cnkoKTsKKwkJCX0gZWxzZSB7CisJCQkJd29yZDEubWFwUmVmcyhtYXBwaW5nT2xkKTsKKwkJCQl3b3JkMi5tYXBSZWZzKG1hcHBpbmdBZGRzKTsKKwkJCQl3b3JkMS5hZGRSZWZzKHdvcmQyLmdldFJlZnMoKSk7CisJCQkJbWVyZ2VPdXRwdXQuYWRkV29yZCh3b3JkMSk7CisJCQkJYWRkc0lucHV0Lm1vdmVUb05leHRXb3JkRW50cnkoKTsKKwkJCQlvbGRJbnB1dC5tb3ZlVG9OZXh0V29yZEVudHJ5KCk7CisJCQl9CisJCX0KKwkJbWVyZ2VPdXRwdXQuZmx1c2hXb3JkcygpOworCX0KKwkvKioKKwkgKiBSZWNvcmRzIHRoZSBkZWxldGlvbiBvZiBvbmUgZmlsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGaWxlKEluZGV4ZWRGaWxlIGZpbGUsIGludCBpbmRleCkgeworCQlpZiAoaW5kZXggPT0gT0xEX0lOREVYKQorCQkJbWFwcGluZ09sZFtmaWxlLmdldEZpbGVOdW1iZXIoKV09IC0xOworCQllbHNlCisJCQltYXBwaW5nQWRkc1tmaWxlLmdldEZpbGVOdW1iZXIoKV09IC0xOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaGFzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiAoQUREU19JTkRFWCBvciBPTERfSU5ERVgpLiBJZiBpdCBoYXMgdG8gYmUgcmVtb3ZlZCwgdGhlIG1lcmdlRmFjdG9yeSAKKwkgKiBkZWxldGVzIGl0IGFuZCByZWNvcmRzIHRoZSBjaGFuZ2VzLiAKKwkgKi8KKworCXByb3RlY3RlZCBib29sZWFuIHdhc1JlbW92ZWQoSW5kZXhlZEZpbGUgaW5kZXhlZEZpbGUsIGludCBpbmRleCkgeworCQlTdHJpbmcgcGF0aD0gaW5kZXhlZEZpbGUuZ2V0UGF0aCgpOworCQlpZiAoaW5kZXggPT0gT0xEX0lOREVYKSB7CisJCQlpZiAocmVtb3ZlZEluT2xkLnJlbW92ZShwYXRoKSAhPSBudWxsKSB7CisJCQkJbWFwcGluZ09sZFtpbmRleGVkRmlsZS5nZXRGaWxlTnVtYmVyKCldPSAtMTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpbmRleCA9PSBBRERTX0lOREVYKSB7CisJCQlJbnQgbGFzdFJlbW92ZWQ9IChJbnQpIHJlbW92ZWRJbkFkZHMuZ2V0KHBhdGgpOworCQkJaWYgKGxhc3RSZW1vdmVkICE9IG51bGwpIHsKKwkJCQlpbnQgZmlsZU51bT0gaW5kZXhlZEZpbGUuZ2V0RmlsZU51bWJlcigpOworCQkJCWlmIChsYXN0UmVtb3ZlZC52YWx1ZSA+PSBmaWxlTnVtKSB7CisJCQkJCW1hcHBpbmdBZGRzW2ZpbGVOdW1dPSAtMTsKKwkJCQkJLy9pZiAobGFzdFJlbW92ZWQudmFsdWUgPT0gZmlsZU51bSkgLy8gT05MWSBpZiBmaWxlcyBpbiBzb3J0ZWQgb3JkZXIgZm9yIG5hbWVzIEFORCBmaWxlTnVtcworCQkJCQkvL3JlbW92ZWRJbkFkZHMucmVtb3ZlKHBhdGgpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1Byb3BlcnR5RG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1Byb3BlcnR5RG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmEyOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvUHJvcGVydHlEb2N1bWVudC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudDsKKworLyoqCisgKiBUaGUgcHJvcGVydGllcyBvZiBhIGRvY3VtZW50IGFyZSBzdG9yZWQgaW50byBhIGhhc2h0YWJsZS4KKyAqIEBzZWUgSURvY3VtZW50CisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5RG9jdW1lbnQgaW1wbGVtZW50cyBJRG9jdW1lbnQgeworCXByb3RlY3RlZCBIYXNodGFibGUgcHJvcGVydGllczsKKwlwdWJsaWMgUHJvcGVydHlEb2N1bWVudCgpIHsKKwkJcHJvcGVydGllcz0gbmV3IEhhc2h0YWJsZSg1KTsKKwl9CisJLyoqCisJICogQHNlZSBJRG9jdW1lbnQjZ2V0UHJvcGVydHkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHkpOworCX0KKwkvKioKKwkgKiBAc2VlIElEb2N1bWVudCNnZXRQcm9wZXJ0eU5hbWVzCisJICovCisKKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlOYW1lcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXMua2V5cygpOworCX0KKwkvKioKKwkgKiBAc2VlIElEb2N1bWVudCNzZXRQcm9wZXJ0eQorCSAqLworCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKKwkJcHJvcGVydGllcy5wdXQocHJvcGVydHksIHZhbHVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TYWZlUmFuZG9tQWNjZXNzRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2FmZVJhbmRvbUFjY2Vzc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTI0M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2FmZVJhbmRvbUFjY2Vzc0ZpbGUuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CisKKy8qKgorICogQSBzYWZlIHN1YmNsYXNzIG9mIFJhbmRvbUFjY2Vzc0ZpbGUsIHdoaWNoIGVuc3VyZSB0aGF0IGl0J3MgY2xvc2VkCisgKiBvbiBmaW5hbGl6ZS4KKyAqLworcHVibGljIGNsYXNzIFNhZmVSYW5kb21BY2Nlc3NGaWxlIGV4dGVuZHMgUmFuZG9tQWNjZXNzRmlsZSB7CisJcHVibGljIFNhZmVSYW5kb21BY2Nlc3NGaWxlKGphdmEuaW8uRmlsZSBmaWxlLCBTdHJpbmcgbW9kZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCQlzdXBlcihmaWxlLCBtb2RlKTsKKwl9CisJcHVibGljIFNhZmVSYW5kb21BY2Nlc3NGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworCQlzdXBlcihuYW1lLCBtb2RlKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljbG9zZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NpbXBsZUluZGV4QmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NpbXBsZUluZGV4QmxvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc4ZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2ltcGxlSW5kZXhCbG9jay5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOworCitpbXBvcnQgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworLyoqCisgKiBEb2VzIG5vIGNvbXByZXNzaW9uIG9mIHdvcmRzLCBhbmQgdXNlcyA0LWJ5dGUgaW50cyBmb3IgZmlsZSBudW1iZXJzIGFuZCBudW1iZXIgb2YgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVJbmRleEJsb2NrIGV4dGVuZHMgSW5kZXhCbG9jayB7CisJcHJvdGVjdGVkIGludCBvZmZzZXQ9IDA7CisKKwlwdWJsaWMgU2ltcGxlSW5kZXhCbG9jayhpbnQgYmxvY2tTaXplKSB7CisJCXN1cGVyKGJsb2NrU2l6ZSk7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhCbG9jayNhZGRFbnRyeQorCSAqLworCXB1YmxpYyBib29sZWFuIGFkZEVudHJ5KFdvcmRFbnRyeSBlbnRyeSkgeworCQljaGFyW10gd29yZD0gZW50cnkuZ2V0V29yZCgpOworCQlpbnQgbj0gZW50cnkuZ2V0TnVtUmVmcygpOworCQlpbnQgc2l6ZUVzdGltYXRlPSAyICsgd29yZC5sZW5ndGggKiAzICsgNCArIG4gKiA0OworCQlpbnQgb2Zmc2V0PSB0aGlzLm9mZnNldDsKKwkJaWYgKG9mZnNldCArIHNpemVFc3RpbWF0ZSA+IHRoaXMuYmxvY2tTaXplIC0gMikKKwkJCXJldHVybiBmYWxzZTsKKwkJb2Zmc2V0ICs9IGZpZWxkLnB1dFVURihvZmZzZXQsIHdvcmQpOworCQlmaWVsZC5wdXRJbnQ0KG9mZnNldCwgbik7CisJCW9mZnNldCArPSA0OworCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgKytpKSB7CisJCQlmaWVsZC5wdXRJbnQ0KG9mZnNldCwgZW50cnkuZ2V0UmVmKGkpKTsKKwkJCW9mZnNldCArPSA0OworCQl9CisJCXRoaXMub2Zmc2V0PSBvZmZzZXQ7CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgV29yZEVudHJ5IGZpbmRFbnRyeShjaGFyW10gd29yZCkgeworCQl0cnkgeworCQkJaW50IG9mZnNldD0gMDsKKwkJCWludCBieXRlTGVuOworCQkJd2hpbGUgKChieXRlTGVuPSBmaWVsZC5nZXRVSW50MihvZmZzZXQpKSAhPSAwKSB7CisJCQkJY2hhcltdIHRlbXBXb3JkPSBmaWVsZC5nZXRVVEYob2Zmc2V0KTsKKwkJCQlvZmZzZXQgKz0gYnl0ZUxlbiArIDI7CisJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHRlbXBXb3JkLCB3b3JkKSkgeworCQkJCQlXb3JkRW50cnkgZW50cnk9IG5ldyBXb3JkRW50cnkod29yZCk7CisJCQkJCWludCBuPSBmaWVsZC5nZXRJbnQ0KG9mZnNldCk7CisJCQkJCW9mZnNldCArPSA0OworCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgKytpKSB7CisJCQkJCQlpbnQgcmVmPSBmaWVsZC5nZXRJbnQ0KG9mZnNldCk7CisJCQkJCQlvZmZzZXQgKz0gNDsKKwkJCQkJCWVudHJ5LmFkZFJlZihyZWYpOworCQkJCQl9CisJCQkJCXJldHVybiBlbnRyeTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgbj0gZmllbGQuZ2V0SW50NChvZmZzZXQpOworCQkJCQlvZmZzZXQgKz0gNCArIDQgKiBuOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9IGNhdGNoIChVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhCbG9jayNmbHVzaAorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCQlpZiAob2Zmc2V0ID4gMCkgeworCQkJZmllbGQucHV0SW50MihvZmZzZXQsIDApOworCQkJb2Zmc2V0PSAwOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhCbG9jayNpc0VtcHR5CisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIG9mZnNldCA9PSAwOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4QmxvY2sjbmV4dEVudHJ5CisJICovCisJcHVibGljIGJvb2xlYW4gbmV4dEVudHJ5KFdvcmRFbnRyeSBlbnRyeSkgeworCQl0cnkgeworCQkJaW50IG9mZnNldD0gdGhpcy5vZmZzZXQ7CisJCQlpbnQgYnl0ZUxlbj0gZmllbGQuZ2V0VUludDIob2Zmc2V0KTsKKwkJCWlmIChieXRlTGVuID09IDApCisJCQkJcmV0dXJuIGZhbHNlOworCQkJY2hhcltdIHdvcmQ9IGZpZWxkLmdldFVURihvZmZzZXQpOworCQkJb2Zmc2V0ICs9IGJ5dGVMZW4gKyAyOworCQkJZW50cnkucmVzZXQod29yZCk7CisJCQlpbnQgbj0gZmllbGQuZ2V0SW50NChvZmZzZXQpOworCQkJb2Zmc2V0ICs9IDQ7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgbjsgKytpKSB7CisJCQkJaW50IHJlZj0gZmllbGQuZ2V0SW50NChvZmZzZXQpOworCQkJCW9mZnNldCArPSA0OworCQkJCWVudHJ5LmFkZFJlZihyZWYpOworCQkJfQorCQkJdGhpcy5vZmZzZXQ9IG9mZnNldDsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4QmxvY2sjcmVzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJdGhpcy5vZmZzZXQ9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2ltcGxlSW5kZXhJbnB1dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2ltcGxlSW5kZXhJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWYwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TaW1wbGVJbmRleElucHV0LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklRdWVyeVJlc3VsdDsKKworLyoqCisgKiBBIHNpbXBsZUluZGV4SW5wdXQgaXMgYW4gaW5wdXQgb24gYW4gaW4gbWVtb3J5IEluZGV4LiAKKyAqLworCitwdWJsaWMgY2xhc3MgU2ltcGxlSW5kZXhJbnB1dCBleHRlbmRzIEluZGV4SW5wdXQgeworCXByb3RlY3RlZCBXb3JkRW50cnlbXSBzb3J0ZWRXb3JkRW50cmllczsKKwlwcm90ZWN0ZWQgSW5kZXhlZEZpbGUgY3VycmVudEZpbGU7CisJcHJvdGVjdGVkIEluZGV4ZWRGaWxlW10gc29ydGVkRmlsZXM7CisJcHJvdGVjdGVkIEluTWVtb3J5SW5kZXggaW5kZXg7CisKKwlwdWJsaWMgU2ltcGxlSW5kZXhJbnB1dChJbk1lbW9yeUluZGV4IGluZGV4KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuaW5kZXg9IGluZGV4OworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjY2xlYXJDYWNoZSgpCisJICovCisJcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I2Nsb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXNvcnRlZEZpbGVzPSBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjZ2V0Q3VycmVudEZpbGUoKQorCSAqLworCXB1YmxpYyBJbmRleGVkRmlsZSBnZXRDdXJyZW50RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICghaGFzTW9yZUZpbGVzKCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGN1cnJlbnRGaWxlOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjZ2V0SW5kZXhlZEZpbGUoaW50KQorCSAqLworCXB1YmxpYyBJbmRleGVkRmlsZSBnZXRJbmRleGVkRmlsZShpbnQgZmlsZU51bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHNvcnRlZEZpbGVzLmxlbmd0aDsgaSsrKQorCQkJaWYgKHNvcnRlZEZpbGVzW2ldLmdldEZpbGVOdW1iZXIoKSA9PSBmaWxlTnVtKQorCQkJCXJldHVybiBzb3J0ZWRGaWxlc1tpXTsKKwkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNnZXRJbmRleGVkRmlsZShJRG9jdW1lbnQpCisJICovCisJcHVibGljIEluZGV4ZWRGaWxlIGdldEluZGV4ZWRGaWxlKElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWU9IGRvY3VtZW50LmdldE5hbWUoKTsKKwkJZm9yIChpbnQgaT0gaW5kZXguZ2V0TnVtRmlsZXMoKTsgaSA+PSAxOyBpLS0pIHsKKwkJCUluZGV4ZWRGaWxlIGZpbGU9IGdldEluZGV4ZWRGaWxlKGkpOworCQkJaWYgKG5hbWUuZXF1YWxzKGZpbGUuZ2V0UGF0aCgpKSkKKwkJCQlyZXR1cm4gZmlsZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I2dldE51bUZpbGVzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bUZpbGVzKCkgeworCQlyZXR1cm4gaW5kZXguZ2V0TnVtRmlsZXMoKTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I2dldE51bVdvcmRzKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgeworCQlyZXR1cm4gc29ydGVkV29yZEVudHJpZXMubGVuZ3RoOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjZ2V0U291cmNlKCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKKwkJcmV0dXJuIGluZGV4OworCX0KKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlpbmRleC5pbml0KCk7CisKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I21vdmVUb05leHRGaWxlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBtb3ZlVG9OZXh0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbGVQb3NpdGlvbisrOworCQlpZiAoIWhhc01vcmVGaWxlcygpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJY3VycmVudEZpbGU9IHNvcnRlZEZpbGVzW2ZpbGVQb3NpdGlvbiAtIDFdOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjbW92ZVRvTmV4dFdvcmRFbnRyeSgpCisJICovCisJcHVibGljIHZvaWQgbW92ZVRvTmV4dFdvcmRFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdvcmRQb3NpdGlvbisrOworCQlpZiAoaGFzTW9yZVdvcmRzKCkpCisJCQljdXJyZW50V29yZEVudHJ5PSBzb3J0ZWRXb3JkRW50cmllc1t3b3JkUG9zaXRpb24gLSAxXTsKKwl9CisJLyoqCisJICogQHNlZSBJbmRleElucHV0I29wZW4oKQorCSAqLworCXB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlzb3J0ZWRXb3JkRW50cmllcz0gaW5kZXguZ2V0U29ydGVkV29yZEVudHJpZXMoKTsKKwkJc29ydGVkRmlsZXM9IGluZGV4LmdldFNvcnRlZEZpbGVzKCk7CisJCWZpbGVQb3NpdGlvbj0gMTsKKwkJd29yZFBvc2l0aW9uPSAxOworCQlzZXRGaXJzdEZpbGUoKTsKKwkJc2V0Rmlyc3RXb3JkKCk7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNxdWVyeShTdHJpbmcpCisJICovCisJcHVibGljIElRdWVyeVJlc3VsdFtdIHF1ZXJ5KFN0cmluZyB3b3JkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljaGFyW10gd29yZENoYXI9IHdvcmQudG9DaGFyQXJyYXkoKTsKKwkJV29yZEVudHJ5IHdvcmRFbnRyeT0gaW5kZXguZ2V0V29yZEVudHJ5KHdvcmRDaGFyKTsKKwkJaW50W10gZmlsZU51bXM9IHdvcmRFbnRyeS5nZXRSZWZzKCk7CisJCUlRdWVyeVJlc3VsdFtdIGZpbGVzPSBuZXcgSVF1ZXJ5UmVzdWx0W2ZpbGVOdW1zLmxlbmd0aF07CisJCWZvciAoaW50IGk9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKKwkJCWZpbGVzW2ldPSBnZXRJbmRleGVkRmlsZShmaWxlTnVtc1tpXSk7CisJCXJldHVybiBmaWxlczsKKwl9CisJcHVibGljIElFbnRyeVJlc3VsdFtdIHF1ZXJ5RW50cmllc1ByZWZpeGVkQnkoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXB1YmxpYyBJUXVlcnlSZXN1bHRbXSBxdWVyeUZpbGVzUmVmZXJyaW5nVG9QcmVmaXgoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjcXVlcnlJbkRvY3VtZW50TmFtZXMoU3RyaW5nKQorCSAqLworCXB1YmxpYyBJUXVlcnlSZXN1bHRbXSBxdWVyeUluRG9jdW1lbnROYW1lcyhTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJc2V0Rmlyc3RGaWxlKCk7CisJCUFycmF5TGlzdCBtYXRjaGVzPSBuZXcgQXJyYXlMaXN0KCk7CisJCXdoaWxlIChoYXNNb3JlRmlsZXMoKSkgeworCQkJSW5kZXhlZEZpbGUgZmlsZT0gZ2V0Q3VycmVudEZpbGUoKTsKKwkJCWlmIChmaWxlLmdldFBhdGgoKS5pbmRleE9mKHdvcmQpICE9IC0xKQorCQkJCW1hdGNoZXMuYWRkKGZpbGUuZ2V0UGF0aCgpKTsKKwkJCW1vdmVUb05leHRGaWxlKCk7CisJCX0KKwkJSVF1ZXJ5UmVzdWx0W10gbWF0Y2g9IG5ldyBJUXVlcnlSZXN1bHRbbWF0Y2hlcy5zaXplKCldOworCQltYXRjaGVzLnRvQXJyYXkobWF0Y2gpOworCQlyZXR1cm4gbWF0Y2g7CisJfQorCS8qKgorCSAqIEBzZWUgSW5kZXhJbnB1dCNzZXRGaXJzdEZpbGUoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldEZpcnN0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbGVQb3NpdGlvbj0gMTsKKwkJaWYgKHNvcnRlZEZpbGVzLmxlbmd0aCA+IDApIHsKKwkJCWN1cnJlbnRGaWxlPSBzb3J0ZWRGaWxlc1swXTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIEluZGV4SW5wdXQjc2V0Rmlyc3RXb3JkKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaXJzdFdvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3b3JkUG9zaXRpb249IDE7CisJCWlmIChzb3J0ZWRXb3JkRW50cmllcy5sZW5ndGggPiAwKQorCQkJY3VycmVudFdvcmRFbnRyeT0gc29ydGVkV29yZEVudHJpZXNbMF07CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTk3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9VdGlsLmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFV0aWwgeworCisJcHJpdmF0ZSBVdGlsKCkgeworCX0KKwkvKioKKwkgKiBDb21wYXJlcyB0d28gc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4gCisJICogVGhlIGNvbXBhcmlzb24gaXMgYmFzZWQgb24gdGhlIFVuaWNvZGUgdmFsdWUgb2YgZWFjaCBjaGFyYWN0ZXIgaW4KKwkgKiB0aGUgc3RyaW5ncy4gCisJICoKKwkgKiBAcmV0dXJuICB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIHN0cjEgaXMgZXF1YWwgdG8gc3RyMjsKKwkgKiAgICAgICAgICBhIHZhbHVlIGxlc3MgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiBzdHIxCisJICogICAgICAgICAgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIHN0cjI7IAorCSAqICAgICAgICAgIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiBzdHIxIGlzCisJICogICAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIHN0cjIuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShjaGFyW10gc3RyMSwgY2hhcltdIHN0cjIpIHsKKwkJaW50IGxlbjE9IHN0cjEubGVuZ3RoOworCQlpbnQgbGVuMj0gc3RyMi5sZW5ndGg7CisJCWludCBuPSBNYXRoLm1pbihsZW4xLCBsZW4yKTsKKwkJaW50IGk9IDA7CisJCXdoaWxlIChuLS0gIT0gMCkgeworCQkJY2hhciBjMT0gc3RyMVtpXTsKKwkJCWNoYXIgYzI9IHN0cjJbaSsrXTsKKwkJCWlmIChjMSAhPSBjMikgeworCQkJCXJldHVybiBjMSAtIGMyOworCQkJfQorCQl9CisJCXJldHVybiBsZW4xIC0gbGVuMjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggYmV0d2VlbiBzMSBhbmQgczIuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgcHJlZml4TGVuZ3RoKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7CisJCWludCBsZW49IDA7CisJCWludCBtYXg9IE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKTsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IG1heCAmJiBzMVtpXSA9PSBzMltpXTsgKytpKQorCQkJKytsZW47CisJCXJldHVybiBsZW47CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBiZXR3ZWVuIHMxIGFuZCBzMi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBwcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKKwkJaW50IGxlbj0gMDsKKwkJaW50IG1heD0gTWF0aC5taW4oczEubGVuZ3RoKCksIHMyLmxlbmd0aCgpKTsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IG1heCAmJiBzMS5jaGFyQXQoaSkgPT0gczIuY2hhckF0KGkpOyArK2kpCisJCQkrK2xlbjsKKwkJcmV0dXJuIGxlbjsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoY2hhcltdW10gbGlzdCwgaW50IGxlZnQsIGludCByaWdodCkgeworCQlpbnQgb3JpZ2luYWxfbGVmdD0gbGVmdDsKKwkJaW50IG9yaWdpbmFsX3JpZ2h0PSByaWdodDsKKwkJY2hhcltdIG1pZD0gbGlzdFsobGVmdCArIHJpZ2h0KSAvIDJdOworCQlkbyB7CisJCQl3aGlsZSAoY29tcGFyZShsaXN0W2xlZnRdLCBtaWQpIDwgMCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChjb21wYXJlKG1pZCwgbGlzdFtyaWdodF0pIDwgMCkgeworCQkJCXJpZ2h0LS07CisJCQl9CisJCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJCWNoYXJbXSB0bXA9IGxpc3RbbGVmdF07CisJCQkJbGlzdFtsZWZ0XT0gbGlzdFtyaWdodF07CisJCQkJbGlzdFtyaWdodF09IHRtcDsKKwkJCQlsZWZ0Kys7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7CisJCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKKwkJCXF1aWNrU29ydChsaXN0LCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJCX0KKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQkJcXVpY2tTb3J0KGxpc3QsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChpbnRbXSBsaXN0LCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisJCWludCBvcmlnaW5hbF9sZWZ0PSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQ9IHJpZ2h0OworCQlpbnQgbWlkPSBsaXN0WyhsZWZ0ICsgcmlnaHQpIC8gMl07CisJCWRvIHsKKwkJCXdoaWxlIChsaXN0W2xlZnRdIDwgbWlkKSB7CisJCQkJbGVmdCsrOworCQkJfQorCQkJd2hpbGUgKG1pZCA8IGxpc3RbcmlnaHRdKSB7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJaW50IHRtcD0gbGlzdFtsZWZ0XTsKKwkJCQlsaXN0W2xlZnRdPSBsaXN0W3JpZ2h0XTsKKwkJCQlsaXN0W3JpZ2h0XT0gdG1wOworCQkJCWxlZnQrKzsKKwkJCQlyaWdodC0tOworCQkJfQorCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwkJaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgeworCQkJcXVpY2tTb3J0KGxpc3QsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwkJfQorCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCQlxdWlja1NvcnQobGlzdCwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCQl9CisJfQorCXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KFN0cmluZ1tdIGxpc3QsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQ9IGxlZnQ7CisJCWludCBvcmlnaW5hbF9yaWdodD0gcmlnaHQ7CisJCVN0cmluZyBtaWQ9IGxpc3RbKGxlZnQgKyByaWdodCkgLyAyXTsKKwkJZG8geworCQkJd2hpbGUgKGxpc3RbbGVmdF0uY29tcGFyZVRvKG1pZCkgPCAwKSB7CisJCQkJbGVmdCsrOworCQkJfQorCQkJd2hpbGUgKG1pZC5jb21wYXJlVG8obGlzdFtyaWdodF0pIDwgMCkgeworCQkJCXJpZ2h0LS07CisJCQl9CisJCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJCVN0cmluZyB0bXA9IGxpc3RbbGVmdF07CisJCQkJbGlzdFtsZWZ0XT0gbGlzdFtyaWdodF07CisJCQkJbGlzdFtyaWdodF09IHRtcDsKKwkJCQlsZWZ0Kys7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7CisJCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKKwkJCXF1aWNrU29ydChsaXN0LCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJCX0KKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQkJcXVpY2tTb3J0KGxpc3QsIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChJbmRleGVkRmlsZVtdIGxpc3QsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQ9IGxlZnQ7CisJCWludCBvcmlnaW5hbF9yaWdodD0gcmlnaHQ7CisJCVN0cmluZyBtaWQ9IGxpc3RbKGxlZnQgKyByaWdodCkgLyAyXS5wYXRoOworCQlkbyB7CisJCQl3aGlsZSAobGlzdFtsZWZ0XS5wYXRoLmNvbXBhcmVUbyhtaWQpIDwgMCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChtaWQuY29tcGFyZVRvKGxpc3RbcmlnaHRdLnBhdGgpIDwgMCkgeworCQkJCXJpZ2h0LS07CisJCQl9CisJCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJCUluZGV4ZWRGaWxlIHRtcD0gbGlzdFtsZWZ0XTsKKwkJCQlsaXN0W2xlZnRdPSBsaXN0W3JpZ2h0XTsKKwkJCQlsaXN0W3JpZ2h0XT0gdG1wOworCQkJCWxlZnQrKzsKKwkJCQlyaWdodC0tOworCQkJfQorCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwkJaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgeworCQkJcXVpY2tTb3J0KGxpc3QsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwkJfQorCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCQlxdWlja1NvcnQobGlzdCwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCQl9CisJfQorCXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KFdvcmRFbnRyeVtdIGxpc3QsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQ9IGxlZnQ7CisJCWludCBvcmlnaW5hbF9yaWdodD0gcmlnaHQ7CisJCWNoYXJbXSBtaWQ9IGxpc3RbKGxlZnQgKyByaWdodCkgLyAyXS5mV29yZDsKKwkJZG8geworCQkJd2hpbGUgKGNvbXBhcmUobGlzdFtsZWZ0XS5mV29yZCwgbWlkKSA8IDApIHsKKwkJCQlsZWZ0Kys7CisJCQl9CisJCQl3aGlsZSAoY29tcGFyZShtaWQsIGxpc3RbcmlnaHRdLmZXb3JkKSA8IDApIHsKKwkJCQlyaWdodC0tOworCQkJfQorCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCQlXb3JkRW50cnkgdG1wPSBsaXN0W2xlZnRdOworCQkJCWxpc3RbbGVmdF09IGxpc3RbcmlnaHRdOworCQkJCWxpc3RbcmlnaHRdPSB0bXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlxdWlja1NvcnQobGlzdCwgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOworCQl9CisJCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKKwkJCXF1aWNrU29ydChsaXN0LCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7CisJCX0KKwl9CisJLyoqCisJICogUmVhZHMgaW4gYSBzdHJpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGRhdGEgaW5wdXQgc3RyZWFtLiBUaGUgCisJICogc3RyaW5nIGhhcyBiZWVuIGVuY29kZWQgdXNpbmcgYSBtb2RpZmllZCBVVEYtOCBmb3JtYXQuIAorCSAqIDxwPgorCSAqIFRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIHJlYWQgYXMgaWYgYnkgCisJICogPGNvZGU+cmVhZFVuc2lnbmVkU2hvcnQ8L2NvZGU+LiBUaGlzIHZhbHVlIGdpdmVzIHRoZSBudW1iZXIgb2YgCisJICogZm9sbG93aW5nIGJ5dGVzIHRoYXQgYXJlIGluIHRoZSBlbmNvZGVkIHN0cmluZywgbm90CisJICogdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4gVGhlIGZvbGxvd2luZyBieXRlcyBhcmUgdGhlbiAKKwkgKiBpbnRlcnByZXRlZCBhcyBieXRlcyBlbmNvZGluZyBjaGFyYWN0ZXJzIGluIHRoZSBVVEYtOCBmb3JtYXQgCisJICogYW5kIGFyZSBjb252ZXJ0ZWQgaW50byBjaGFyYWN0ZXJzLiAKKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgYWxsIHRoZSBieXRlcyBhcmUgcmVhZCwgdGhlIGVuZCBvZiB0aGUgCisJICogc3RyZWFtIGlzIGRldGVjdGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAKKwkgKgorCSAqIEBwYXJhbSAgICAgIGluICAgYSBkYXRhIGlucHV0IHN0cmVhbS4KKwkgKiBAcmV0dXJuICAgICBhIFVuaWNvZGUgc3RyaW5nLgorCSAqIEBleGNlcHRpb24gIEVPRkV4Y2VwdGlvbiAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBzdHJlYW0gcmVhY2hlcyB0aGUgZW5kCisJICogICAgICAgICAgICAgICBiZWZvcmUgYWxsIHRoZSBieXRlcy4KKwkgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorCSAqIEBleGNlcHRpb24gIFVURkRhdGFGb3JtYXRFeGNlcHRpb24gIGlmIHRoZSBieXRlcyBkbyBub3QgcmVwcmVzZW50IGEKKwkgKiAgICAgICAgICAgICAgIHZhbGlkIFVURi04IGVuY29kaW5nIG9mIGEgVW5pY29kZSBzdHJpbmcuCisJICogQHNlZSAgICAgICAgamF2YS5pby5EYXRhSW5wdXRTdHJlYW0jcmVhZFVuc2lnbmVkU2hvcnQoKQorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIHJlYWRVVEYoRGF0YUlucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbnQgdXRmbGVuPSBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOworCQljaGFyIHN0cltdPSBuZXcgY2hhclt1dGZsZW5dOworCQlpbnQgY291bnQ9IDA7CisJCWludCBzdHJsZW49IDA7CisJCXdoaWxlIChjb3VudCA8IHV0ZmxlbikgeworCQkJaW50IGM9IGluLnJlYWRVbnNpZ25lZEJ5dGUoKTsKKwkJCWludCBjaGFyMiwgY2hhcjM7CisJCQlzd2l0Y2ggKGMgPj4gNCkgeworCQkJCWNhc2UgMCA6CisJCQkJY2FzZSAxIDoKKwkJCQljYXNlIDIgOgorCQkJCWNhc2UgMyA6CisJCQkJY2FzZSA0IDoKKwkJCQljYXNlIDUgOgorCQkJCWNhc2UgNiA6CisJCQkJY2FzZSA3IDoKKwkJCQkJLy8gMHh4eHh4eHgKKwkJCQkJY291bnQrKzsKKwkJCQkJc3RyW3N0cmxlbisrXT0gKGNoYXIpIGM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTIgOgorCQkJCWNhc2UgMTMgOgorCQkJCQkvLyAxMTB4IHh4eHggICAxMHh4IHh4eHgKKwkJCQkJY291bnQgKz0gMjsKKwkJCQkJaWYgKGNvdW50ID4gdXRmbGVuKQorCQkJCQkJdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oKTsKKwkJCQkJY2hhcjI9IGluLnJlYWRVbnNpZ25lZEJ5dGUoKTsKKwkJCQkJaWYgKChjaGFyMiAmIDB4QzApICE9IDB4ODApCisJCQkJCQl0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigpOworCQkJCQlzdHJbc3RybGVuKytdPSAoY2hhcikgKCgoYyAmIDB4MUYpIDw8IDYpIHwgKGNoYXIyICYgMHgzRikpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE0IDoKKwkJCQkJLy8gMTExMCB4eHh4ICAxMHh4IHh4eHggIDEweHggeHh4eAorCQkJCQljb3VudCArPSAzOworCQkJCQlpZiAoY291bnQgPiB1dGZsZW4pCisJCQkJCQl0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigpOworCQkJCQljaGFyMj0gaW4ucmVhZFVuc2lnbmVkQnl0ZSgpOworCQkJCQljaGFyMz0gaW4ucmVhZFVuc2lnbmVkQnl0ZSgpOworCQkJCQlpZiAoKChjaGFyMiAmIDB4QzApICE9IDB4ODApIHx8ICgoY2hhcjMgJiAweEMwKSAhPSAweDgwKSkKKwkJCQkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCQkJCXN0cltzdHJsZW4rK109IChjaGFyKSAoKChjICYgMHgwRikgPDwgMTIpIHwgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHwgKChjaGFyMyAmIDB4M0YpIDw8IDApKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCS8vIDEweHggeHh4eCwgIDExMTEgeHh4eAorCQkJCQl0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigpOworCQkJfQorCQl9CisJCWlmIChzdHJsZW4gPCB1dGZsZW4pIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoc3RyLCAwLCBzdHI9IG5ldyBjaGFyW3N0cmxlbl0sIDAsIHN0cmxlbik7CisJCX0KKwkJcmV0dXJuIHN0cjsKKwl9CisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoY2hhcltdW10gbGlzdCkgeworCQlpZiAobGlzdC5sZW5ndGggPiAxKQorCQkJcXVpY2tTb3J0KGxpc3QsIDAsIGxpc3QubGVuZ3RoIC0gMSk7CisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KGludFtdIGxpc3QpIHsKKwkJaWYgKGxpc3QubGVuZ3RoID4gMSkKKwkJCXF1aWNrU29ydChsaXN0LCAwLCBsaXN0Lmxlbmd0aCAtIDEpOworCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc29ydChTdHJpbmdbXSBsaXN0KSB7CisJCWlmIChsaXN0Lmxlbmd0aCA+IDEpCisJCQlxdWlja1NvcnQobGlzdCwgMCwgbGlzdC5sZW5ndGggLSAxKTsKKwl9CisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoSW5kZXhlZEZpbGVbXSBsaXN0KSB7CisJCWlmIChsaXN0Lmxlbmd0aCA+IDEpCisJCQlxdWlja1NvcnQobGlzdCwgMCwgbGlzdC5sZW5ndGggLSAxKTsKKwl9CisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoV29yZEVudHJ5W10gbGlzdCkgeworCQlpZiAobGlzdC5sZW5ndGggPiAxKQorCQkJcXVpY2tTb3J0KGxpc3QsIDAsIGxpc3QubGVuZ3RoIC0gMSk7CisJfQorCXB1YmxpYyBzdGF0aWMgaW50IHN0YXJ0c1dpdGgoY2hhcltdIHN0ciwgY2hhcltdIHByZWZpeCkgeworCQlpbnQgbGVuMT0gc3RyLmxlbmd0aDsKKwkJaW50IGxlbjI9IHByZWZpeC5sZW5ndGg7CisJCWludCBuPSBNYXRoLm1pbihsZW4xLCBsZW4yKTsKKwkJaW50IGk9IDA7CisJCXdoaWxlIChuLS0gIT0gMCkgeworCQkJY2hhciBjMT0gc3RyW2ldOworCQkJY2hhciBjMj0gcHJlZml4W2krK107CisJCQlpZiAoYzEgIT0gYzIpIHsKKwkJCQlyZXR1cm4gYzEgLSBjMjsKKwkJCX0KKwkJfQorCQlpZiAobGVuMiA9PSBpKQorCQkJcmV0dXJuIDA7CisJCQkKKwkJcmV0dXJuIDE7CQorCX0KKwkvKioKKwkgKiBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0gdXNpbmcgVVRGLTggCisJICogZW5jb2RpbmcgaW4gYSBtYWNoaW5lLWluZGVwZW5kZW50IG1hbm5lci4gCisJICogPHA+CisJICogRmlyc3QsIHR3byBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBhcyBpZiBieSB0aGUgCisJICogPGNvZGU+d3JpdGVTaG9ydDwvY29kZT4gbWV0aG9kIGdpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIAorCSAqIGZvbGxvdy4gVGhpcyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gb3V0LCAKKwkgKiBub3QgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiBGb2xsb3dpbmcgdGhlIGxlbmd0aCwgZWFjaCBjaGFyYWN0ZXIgCisJICogb2YgdGhlIHN0cmluZyBpcyBvdXRwdXQsIGluIHNlcXVlbmNlLCB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcgCisJICogZm9yIHRoZSBjaGFyYWN0ZXIuIAorCSAqCisJICogQHBhcmFtICAgICAgc3RyICAgYSBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KKwkgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKwkgKiBAc2luY2UgICAgICBKREsxLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVVVEYoT3V0cHV0U3RyZWFtIG91dCwgY2hhcltdIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IHN0cmxlbj0gc3RyLmxlbmd0aDsKKwkJaW50IHV0Zmxlbj0gMDsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHN0cmxlbjsgaSsrKSB7CisJCQlpbnQgYz0gc3RyW2ldOworCQkJaWYgKChjID49IDB4MDAwMSkgJiYgKGMgPD0gMHgwMDdGKSkgeworCQkJCXV0ZmxlbisrOworCQkJfSBlbHNlIGlmIChjID4gMHgwN0ZGKSB7CisJCQkJdXRmbGVuICs9IDM7CisJCQl9IGVsc2UgeworCQkJCXV0ZmxlbiArPSAyOworCQkJfQorCQl9CisJCWlmICh1dGZsZW4gPiA2NTUzNSkKKwkJCXRocm93IG5ldyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uKCk7CisJCW91dC53cml0ZSgodXRmbGVuID4+PiA4KSAmIDB4RkYpOworCQlvdXQud3JpdGUoKHV0ZmxlbiA+Pj4gMCkgJiAweEZGKTsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHN0cmxlbjsgaSsrKSB7CisJCQlpbnQgYz0gc3RyW2ldOworCQkJaWYgKChjID49IDB4MDAwMSkgJiYgKGMgPD0gMHgwMDdGKSkgeworCQkJCW91dC53cml0ZShjKTsKKwkJCX0gZWxzZSBpZiAoYyA+IDB4MDdGRikgeworCQkJCW91dC53cml0ZSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKwkJCQlvdXQud3JpdGUoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKwkJCQlvdXQud3JpdGUoMHg4MCB8ICgoYyA+PiAwKSAmIDB4M0YpKTsKKwkJCX0gZWxzZSB7CisJCQkJb3V0LndyaXRlKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisJCQkJb3V0LndyaXRlKDB4ODAgfCAoKGMgPj4gMCkgJiAweDNGKSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Xb3JkRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1dvcmRFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Xb3JkRW50cnkuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworcHVibGljIGNsYXNzIFdvcmRFbnRyeSB7CisJcHJvdGVjdGVkIGNoYXJbXSBmV29yZDsKKwlwcm90ZWN0ZWQgaW50IGZOdW1SZWZzOworCXByb3RlY3RlZCBpbnRbXSBmUmVmczsKKwlwdWJsaWMgV29yZEVudHJ5KCkgeworCQl0aGlzKG5ldyBjaGFyWzBdKTsKKwl9CisJcHVibGljIFdvcmRFbnRyeShjaGFyW10gd29yZCkgeworCQlmV29yZD0gd29yZDsKKwkJZk51bVJlZnM9IDA7CisJCWZSZWZzPSBuZXcgaW50WzFdOworCX0KKwkvKioKKwkgKiBBZGRzIGEgcmVmZXJlbmNlIGFuZCByZWNvcmRzIHRoZSBjaGFuZ2UgaW4gZm9vdHByaW50LgorCSAqLworCXB1YmxpYyBpbnQgYWRkUmVmKGludCBmaWxlTnVtKSB7CisJCWlmIChmTnVtUmVmcyA+IDAgJiYgZlJlZnNbZk51bVJlZnMgLSAxXSA9PSBmaWxlTnVtKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoZk51bVJlZnMgPCBmUmVmcy5sZW5ndGgpIHsKKwkJCWZSZWZzW2ZOdW1SZWZzKytdPSBmaWxlTnVtOworCQkJcmV0dXJuIDA7CisJCX0gCisKKwkJLy8gRm9yIHJ0LmphciwgNzMyNjUgd29yZCBlbnRyaWVzIGFyZSBjcmVhdGVkLiA1MTk5NyBoYXZlIDEgcmVmLCB0aGVuIDk0MzgsIDM3MzgsIDE5ODAsIDEyMTQsIDc3OSwgNTQ3LCA0MjksIDM3MSBldGMuCisJCWludCBuZXdTaXplPSBmTnVtUmVmcyA8IDQgPyA0IDogZk51bVJlZnMgKiAyOyAvLyBzbyB3aWxsIHN0YXJ0IEAgMSwgZ3JvdyB0byA0LCA4LCAxNiwgMzIsIDY0IGV0Yy4KKwkJU3lzdGVtLmFycmF5Y29weShmUmVmcywgMCwgZlJlZnM9IG5ldyBpbnRbbmV3U2l6ZV0sIDAsIGZOdW1SZWZzKTsKKwkJZlJlZnNbZk51bVJlZnMrK109IGZpbGVOdW07CisJCXJldHVybiAobmV3U2l6ZSAtIGZOdW1SZWZzICsgMSkgKiA0OworCX0KKwkvKioKKwkgKiBBZGRzIGEgc2V0IG9mIHJlZmVyZW5jZXMgYW5kIHJlY29yZHMgdGhlIGNoYW5nZSBpbiBmb290cHJpbnQuCisJICovCisJcHVibGljIHZvaWQgYWRkUmVmcyhpbnRbXSByZWZzKSB7CisJCWludFtdIG5ld1JlZnM9IG5ldyBpbnRbZk51bVJlZnMgKyByZWZzLmxlbmd0aF07CisJCWludCBwb3MxPSAwOworCQlpbnQgcG9zMj0gMDsKKwkJaW50IHBvc05ldz0gMDsKKwkJaW50IGNvbXBhcmU7CisJCWludCByMT0gMDsKKwkJaW50IHIyPSAwOworCQl3aGlsZSAocG9zMSA8IGZOdW1SZWZzIHx8IHBvczIgPCByZWZzLmxlbmd0aCkgeworCQkJaWYgKHBvczEgPj0gZk51bVJlZnMpIHsKKwkJCQlyMj0gcmVmc1twb3MyXTsKKwkJCQljb21wYXJlPSAtMTsKKwkJCX0gZWxzZSBpZiAocG9zMiA+PSByZWZzLmxlbmd0aCkgeworCQkJCWNvbXBhcmU9IDE7CisJCQkJcjE9IGZSZWZzW3BvczFdOworCQkJfSBlbHNlIHsKKwkJCQlyMT0gZlJlZnNbcG9zMV07CisJCQkJcjI9IHJlZnNbcG9zMl07CisJCQkJY29tcGFyZT0gcjIgLSByMTsKKwkJCX0KKwkJCWlmIChjb21wYXJlID4gMCkgeworCQkJCW5ld1JlZnNbcG9zTmV3XT0gcjE7CisJCQkJcG9zTmV3Kys7CisJCQkJcG9zMSsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocjIgIT0gMCkgeworCQkJCQluZXdSZWZzW3Bvc05ld109IHIyOworCQkJCQlwb3NOZXcrKzsKKwkJCQl9CisJCQkJcG9zMisrOworCQkJfQorCQl9CisJCWZSZWZzPSBuZXdSZWZzOworCQlmTnVtUmVmcz0gcG9zTmV3OworCQkvKmZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykKKwkJYWRkUmVmKHJlZnNbaV0pOworCQlpbnRbXSBuZXdSZWZzID0gbmV3IGludFtmTnVtUmVmc107CisJCVN5c3RlbS5hcnJheWNvcHkoZlJlZnMsIDAsIG5ld1JlZnMsIDAsIGZOdW1SZWZzKTsKKwkJZlJlZnMgPSBuZXdSZWZzOworCQlVdGlsLnNvcnQoZlJlZnMpOyovCisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHdvcmRFbnRyeQorCSAqLworCisJcHVibGljIGludCBmb290cHJpbnQoKSB7CisJCXJldHVybiA4ICsgKDMgKiA0KSArICg4ICsgZldvcmQubGVuZ3RoICogMikgKyAoOCArIGZSZWZzLmxlbmd0aCAqIDQpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcywgZS5nLiB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoaXMgd29yZCBhcHBlYXJzIGluLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtUmVmcygpIHsKKwkJcmV0dXJuIGZOdW1SZWZzOworCX0KKwkvKioKKwkgKiByZXR1cm5zIHRoZSBmaWxlIG51bWJlciBpbiB0aGUgaSBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVmKGludCBpKSB7CisJCWlmIChpIDwgZk51bVJlZnMpIHJldHVybiBmUmVmc1tpXTsKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgd29yZEVudHJ5ICh0aGUgbnVtYmVyIG9mIHRoZSBmaWxlcyBpdCBhcHBlYXJzIGluKS4KKwkgKi8KKworCXB1YmxpYyBpbnRbXSBnZXRSZWZzKCkgeworCQlpbnRbXSByZXN1bHQ9IG5ldyBpbnRbZk51bVJlZnNdOworCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWZzLCAwLCByZXN1bHQsIDAsIGZOdW1SZWZzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyoqCisJICogcmV0dXJucyB0aGUgd29yZCBvZiB0aGUgd29yZEVudHJ5LgorCSAqLworCisJcHVibGljIGNoYXJbXSBnZXRXb3JkKCkgeworCQlyZXR1cm4gZldvcmQ7CisJfQorCS8qKgorCSAqIENoYW5nZXMgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHdvcmRFbnRyeSB0byBtYXRjaCB0aGUgbWFwcGluZy4gRm9yIGV4YW1wbGUsPGJyPgorCSAqIGlmIHRoZSBjdXJyZW50IHJlZmVyZW5jZXMgYXJlIFsxIDMgNF08YnI+CisJICogYW5kIG1hcHBpbmcgaXMgWzEgMiAzIDQgNV08YnI+CisJICogaW4gcmVmZXJlbmNlcyAxIGJlY29tZXMgbWFwcGluZ1sxXSA9IDIsIDMtPjQsIGFuZCA0LT41PGJyPgorCSAqID0+IHJlZmVyZW5jZXMgPSBbMiA0IDVdLjxicj4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXBSZWZzKGludFtdIG1hcHBpbmdzKSB7CisJCWludCBwb3NpdGlvbj0gMDsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IGZOdW1SZWZzOyBpKyspIHsKKwkJCWludCBtYXA9IG1hcHBpbmdzW2ZSZWZzW2ldXTsKKwkJCWlmIChtYXAgIT0gLTEgJiYgbWFwICE9IDApCisJCQkJZlJlZnNbcG9zaXRpb24rK109IG1hcDsKKwkJfQorCQlmTnVtUmVmcz0gcG9zaXRpb247CisKKwkJLy90byBiZSBjaGFuZ2VkIQorCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWZzLCAwLCAoZlJlZnM9IG5ldyBpbnRbZk51bVJlZnNdKSwgMCwgZk51bVJlZnMpOworCQlVdGlsLnNvcnQoZlJlZnMpOworCX0KKwkvKioKKwkgKiBDbGVhcnMgdGhlIHdvcmRFbnRyeS4KKwkgKi8KKworCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSB3b3JkKSB7CisJCWZvciAoaW50IGk9IGZOdW1SZWZzOyBpLS0gPiAwOykgeworCQkJZlJlZnNbaV09IDA7CisJCX0KKwkJZk51bVJlZnM9IDA7CisJCWZXb3JkPSB3b3JkOworCX0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZyhmV29yZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5SGFzaGVkQXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1dvcmRFbnRyeUhhc2hlZEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzOTI4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1dvcmRFbnRyeUhhc2hlZEFycmF5LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JkRW50cnlIYXNoZWRBcnJheSB7CisKKy8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgb2JqZWN0cyBza2lwcGluZyBudWxscworcHVibGljIFdvcmRFbnRyeSBlbGVtZW50c1tdOworcHVibGljIGludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorcHVibGljIGludCB0aHJlc2hvbGQ7CisKK3B1YmxpYyBXb3JkRW50cnlIYXNoZWRBcnJheShpbnQgc2l6ZSkgeworCWlmIChzaXplIDwgNykgc2l6ZSA9IDc7CisJdGhpcy5lbGVtZW50cyA9IG5ldyBXb3JkRW50cnlbMiAqIHNpemUgKyAxXTsKKwl0aGlzLmVsZW1lbnRTaXplID0gMDsKKwl0aGlzLnRocmVzaG9sZCA9IHNpemUgKyAxOyAvLyBzaXplIGlzIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMKK30KKworcHVibGljIFdvcmRFbnRyeSBhZGQoV29yZEVudHJ5IGVudHJ5KSB7CisJaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKKwljaGFyW10gd29yZCA9IGVudHJ5LmdldFdvcmQoKTsKKwlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHdvcmQpICUgbGVuZ3RoOworCVdvcmRFbnRyeSBjdXJyZW50OworCXdoaWxlICgoY3VycmVudCA9IGVsZW1lbnRzW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudC5nZXRXb3JkKCksIHdvcmQpKSByZXR1cm4gZWxlbWVudHNbaW5kZXhdID0gZW50cnk7CisJCWlmICgrK2luZGV4ID09IGxlbmd0aCkgaW5kZXggPSAwOworCX0KKwllbGVtZW50c1tpbmRleF0gPSBlbnRyeTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkgZ3JvdygpOworCXJldHVybiBlbnRyeTsKK30KKworcHVibGljIFdvcmRFbnRyeVtdIGFzQXJyYXkoKSB7CisJV29yZEVudHJ5W10gYXJyYXkgPSBuZXcgV29yZEVudHJ5W2VsZW1lbnRTaXplXTsKKwlmb3IgKGludCBpID0gMCwgaiA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCVdvcmRFbnRyeSBjdXJyZW50ID0gZWxlbWVudHNbaV07CisJCWlmIChjdXJyZW50ICE9IG51bGwpIGFycmF5W2orK10gPSBjdXJyZW50OworCX0KKwlyZXR1cm4gYXJyYXk7Cit9CisKK3B1YmxpYyBXb3JkRW50cnkgZ2V0KGNoYXJbXSB3b3JkKSB7CisJaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKKwlpbnQgaW5kZXggPSBDaGFyT3BlcmF0aW9uLmhhc2hDb2RlKHdvcmQpICUgbGVuZ3RoOworCVdvcmRFbnRyeSBjdXJyZW50OworCXdoaWxlICgoY3VycmVudCA9IGVsZW1lbnRzW2luZGV4XSkgIT0gbnVsbCkgeworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY3VycmVudC5nZXRXb3JkKCksIHdvcmQpKSByZXR1cm4gY3VycmVudDsKKwkJaWYgKCsraW5kZXggPT0gbGVuZ3RoKSBpbmRleCA9IDA7CisJfQorCXJldHVybiBudWxsOworfQorCitwcml2YXRlIHZvaWQgZ3JvdygpIHsKKwlXb3JkRW50cnlIYXNoZWRBcnJheSBuZXdBcnJheSA9IG5ldyBXb3JkRW50cnlIYXNoZWRBcnJheShlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKGVsZW1lbnRzW2ldICE9IG51bGwpCisJCQluZXdBcnJheS5hZGQoZWxlbWVudHNbaV0pOworCisJdGhpcy5lbGVtZW50cyA9IG5ld0FycmF5LmVsZW1lbnRzOworCXRoaXMuZWxlbWVudFNpemUgPSBuZXdBcnJheS5lbGVtZW50U2l6ZTsKKwl0aGlzLnRocmVzaG9sZCA9IG5ld0FycmF5LnRocmVzaG9sZDsKK30KKworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCisJV29yZEVudHJ5W10gZW50cmllcyA9IGFzQXJyYXkoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJcyArPSBlbnRyaWVzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0xJAorCXJldHVybiBzOworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQWJzdHJhY3RTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzOTc3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvQWJzdHJhY3RTZWFyY2hTY29wZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2VhcmNoU2NvcGUgeworCisvKioKKyAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNpbmNsdWRlc0JpbmFyaWVzKCkKKyAqIEBkZXByZWNhdGVkCisgKi8KK3B1YmxpYyBib29sZWFuIGluY2x1ZGVzQmluYXJpZXMoKSB7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2luY2x1ZGVzQ2xhc3NwYXRocygpCisgKiBAZGVwcmVjYXRlZAorICovCitwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMoKSB7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIFByb2Nlc3MgdGhlIGdpdmVuIGRlbHRhIGFuZCByZWZyZXNoIGl0cyBpbnRlcm5hbCBzdGF0ZSBpZiBuZWVkZWQuCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGludGVybmFsIHN0YXRlIHdhcyByZWZyZXNoZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSk7CisKKy8qKgorICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI3NldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbikKKyAqIEBkZXByZWNhdGVkCisgKi8KK3B1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Cit9CisKKy8qKgorICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI3NldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuKQorICogQGRlcHJlY2F0ZWQKKyAqLworcHVibGljIHZvaWQgc2V0SW5jbHVkZXNDbGFzc3BhdGhzKGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKSB7Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAyOTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9IaWVyYXJjaHlTY29wZS5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeS5UeXBlSGllcmFyY2h5OworCisvKioKKyAqIFNjb3BlIGxpbWl0ZWQgdG8gdGhlIHN1YnR5cGUgYW5kIHN1cGVydHlwZSBoaWVyYXJjaHkgb2YgYSBnaXZlbiB0eXBlLgorICovCitwdWJsaWMgY2xhc3MgSGllcmFyY2h5U2NvcGUgZXh0ZW5kcyBBYnN0cmFjdFNlYXJjaFNjb3BlIHsKKworCXByaXZhdGUgSVR5cGVIaWVyYXJjaHkgZkhpZXJhcmNoeTsKKwlwcml2YXRlIElUeXBlW10gZlR5cGVzOworCXByaXZhdGUgSGFzaFNldCByZXNvdXJjZVBhdGhzOworCXByaXZhdGUgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnM7CisKKwlwcm90ZWN0ZWQgSVJlc291cmNlW10gZWxlbWVudHM7CisJcHJvdGVjdGVkIGludCBlbGVtZW50Q291bnQ7CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNSZWZyZXNoOworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEFkZHMgdGhlIGdpdmVuIHJlc291cmNlIHRvIHRoaXMgc2VhcmNoIHNjb3BlLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZChJUmVzb3VyY2UgZWxlbWVudCkgeworCQlpZiAodGhpcy5lbGVtZW50Q291bnQgPT0gdGhpcy5lbGVtZW50cy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy5lbGVtZW50cywKKwkJCQkwLAorCQkJCXRoaXMuZWxlbWVudHMgPSBuZXcgSVJlc291cmNlW3RoaXMuZWxlbWVudENvdW50ICogMl0sCisJCQkJMCwKKwkJCQl0aGlzLmVsZW1lbnRDb3VudCk7CisJCX0KKwkJZWxlbWVudHNbZWxlbWVudENvdW50KytdID0gZWxlbWVudDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIENyZWF0ZXMgYSBuZXcgaGllYXJjaHkgc2NvcGUgZm9yIHRoZSBnaXZlbiB0eXBlLgorCSAqLworCXB1YmxpYyBIaWVyYXJjaHlTY29wZShJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdGhpcy5pbml0aWFsaXplKCk7CisJCWZIaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7CisJCWJ1aWxkUmVzb3VyY2VWZWN0b3IoKTsKKwkJCQorCQkvL2Rpc2FibGVkIGZvciBub3cgYXMgdGhpcyBjb3VsZCBiZSBleHBlbnNpdmUKKwkJLy9KYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1lbWJlclNjb3BlKHRoaXMpOworCX0KKwlwcml2YXRlIHZvaWQgYnVpbGRSZXNvdXJjZVZlY3RvcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlIYXNoTWFwIHJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisJCUhhc2hNYXAgcGF0aHMgPSBuZXcgSGFzaE1hcCgpOworCQlmVHlwZXMgPSBmSGllcmFyY2h5LmdldEFsbFR5cGVzKCk7CisJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJSVR5cGUgdHlwZSA9IGZUeXBlc1tpXTsKKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZXMuZ2V0KHJlc291cmNlKSA9PSBudWxsKSB7CisJCQkJcmVzb3VyY2VzLnB1dChyZXNvdXJjZSwgcmVzb3VyY2UpOworCQkJCWFkZChyZXNvdXJjZSk7CisJCQl9CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0KKwkJCQkoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7CisJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCQkvLyB0eXBlIGluIGEgamFyCisJCQkJSmFyUGFja2FnZUZyYWdtZW50Um9vdCBqYXIgPSAoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdDsKKwkJCQlJUGF0aCBqYXJQYXRoID0gamFyLmdldFBhdGgoKTsKKwkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBqYXJQYXRoLCB0cnVlKTsKKwkJCQlTdHJpbmcgemlwRmlsZU5hbWU7CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCS8vIGludGVybmFsIGphcgorCQkJCQl6aXBGaWxlTmFtZSA9IGphclBhdGgudG9TdHJpbmcoKTsKKwkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKKwkJCQkJLy8gZXh0ZXJuYWwgamFyCisJCQkJCXppcEZpbGVOYW1lID0gKChGaWxlKXRhcmdldCkuZ2V0UGF0aCgpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbnRpbnVlOyAvLyB1bmtub3duIHRhcmdldAorCQkJCX0KKwkJCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0KKwkJCQkJemlwRmlsZU5hbWUKKwkJCQkJCSsgSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SCisJCQkJCQkrIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkucmVwbGFjZSgnLicsICcvJykKKwkJCQkJCSsgIi5jbGFzcyI7Ly8kTk9OLU5MUy0xJAorCQkJCQorCQkJCXRoaXMucmVzb3VyY2VQYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKKwkJCQlwYXRocy5wdXQoamFyUGF0aCwgdHlwZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIHR5cGUgaXMgYSBwcm9qZWN0CisJCQkJcGF0aHMucHV0KHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSwgdHlwZSk7CisJCQl9CisJCX0KKwkJdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMgPSBuZXcgSVBhdGhbcGF0aHMuc2l6ZSgpXTsKKwkJaW50IGkgPSAwOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXRocy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2krK10gPSAoSVBhdGgpIGl0ZXIubmV4dCgpOworCQl9CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zZXMoU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKwkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CisJCQl0cnkgeworCQkJCXRoaXMucmVmcmVzaCgpOworCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpbnQgc2VwYXJhdG9ySW5kZXggPSByZXNvdXJjZVBhdGguaW5kZXhPZihKQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IpOworCQlpZiAoc2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKKwkJCXJldHVybiB0aGlzLnJlc291cmNlUGF0aHMuY29udGFpbnMocmVzb3VyY2VQYXRoKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50Q291bnQ7IGkrKykgeworCQkJCWlmIChyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCh0aGlzLmVsZW1lbnRzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhJSmF2YUVsZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CisJCQl0cnkgeworCQkJCXRoaXMucmVmcmVzaCgpOworCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlJVHlwZSB0eXBlID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJdHlwZSA9IChJVHlwZSkgZWxlbWVudDsKKwkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgeworCQkJdHlwZSA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQl9CisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCWlmIChmSGllcmFyY2h5LmNvbnRhaW5zKHR5cGUpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCS8vIGJlIGZsZXhpYmxlOiBsb29rIGF0IG9yaWdpbmFsIGVsZW1lbnQgKHNlZSBidWcgMTQxMDYgRGVjbGFyYXRpb25zIGluIEhpZXJhcmNoeSBkb2VzIG5vdCBmaW5kIGRlY2xhcmF0aW9ucyBpbiBoaWVyYXJjaHkpCisJCQkJSVR5cGUgb3JpZ2luYWw7CisJCQkJaWYgKCF0eXBlLmlzQmluYXJ5KCkgCisJCQkJCQkmJiAob3JpZ2luYWwgPSAoSVR5cGUpdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRPcmlnaW5hbCh0eXBlKSkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gZkhpZXJhcmNoeS5jb250YWlucyhvcmlnaW5hbCk7CisJCQkJfQorCQkJfQorCQl9IAorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZWFyY2ggc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHJlc291cmNlLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVuY2xvc2VzKElSZXNvdXJjZSBlbGVtZW50KSB7CisJCUlQYXRoIGVsZW1lbnRQYXRoID0gZWxlbWVudC5nZXRGdWxsUGF0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRDb3VudDsgaSsrKSB7CisJCQlpZiAodGhpcy5lbGVtZW50c1tpXS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YoZWxlbWVudFBhdGgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpCisJICogQGRlcHJlY2F0ZWQKKwkgKi8KKwlwdWJsaWMgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKSB7CisJCWlmICh0aGlzLm5lZWRzUmVmcmVzaCkgeworCQkJdHJ5IHsKKwkJCQl0aGlzLnJlZnJlc2goKTsKKwkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbmV3IElQYXRoWzBdOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKKwl9CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJdGhpcy5yZXNvdXJjZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKKwkJdGhpcy5lbGVtZW50cyA9IG5ldyBJUmVzb3VyY2VbNV07CisJCXRoaXMuZWxlbWVudENvdW50ID0gMDsKKwkJdGhpcy5uZWVkc1JlZnJlc2ggPSBmYWxzZTsJCQorCX0KKwkvKgorCSAqIEBzZWUgQWJzdHJhY3RTZWFyY2hTY29wZSNwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEpCisJICovCisJcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCWlmICh0aGlzLm5lZWRzUmVmcmVzaCkgcmV0dXJuOworCQl0aGlzLm5lZWRzUmVmcmVzaCA9ICgoVHlwZUhpZXJhcmNoeSlmSGllcmFyY2h5KS5pc0FmZmVjdGVkKGRlbHRhKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aGlzLmluaXRpYWxpemUoKTsKKwkJZkhpZXJhcmNoeS5yZWZyZXNoKG51bGwpOworCQl0aGlzLmJ1aWxkUmVzb3VyY2VWZWN0b3IoKTsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJIaWVyYXJjaHlTY29wZSBvbiAiICsgKChKYXZhRWxlbWVudClmSGllcmFyY2h5LmdldFR5cGUoKSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCk7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lJbmRleFNlYXJjaFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5kZXhTZWFyY2hSZXF1ZXN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhjZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5kZXhTZWFyY2hSZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHsKKy8qKgorICogQWNjZXB0cyB0aGUgZGVjbGFyYXRpb24gb2YgYSBjbGFzcyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoLgorICogVGhlIGNsYXNzIGlzIGRlY2xhcmVkIGluIHRoZSBnaXZlbiBwYWNrYWdlIGFuZCB3aXRoIHRoZSBnaXZlbiB0eXBlIG5hbWUuIAorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlIHJlc291cmNlIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIHNlYXJjaCBxdWVyeSBkb2Vzbid0IHJlcXVpcmUgaXQgKGVnLiBnZXQgYWxsIGNsYXNzIG5hbWVzKS4KKyAqLwordm9pZCBhY2NlcHRDbGFzc0RlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBjaGFyW10gcGFja2FnZU5hbWUpOworLyoqCisgKiBBY2NlcHRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGNvbnN0cnVjdG9yIGluIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIHJlc291cmNlIHBhdGguCisgKiBUaGUgY29uc3RydWN0b3IgaXMgZGVjbGFyZWQgd2l0aCBhIGdpdmVuIG5hbWUgYW5kIG51bWJlciBvZiBhcmd1bWVudHMuCisgKi8KK3ZvaWQgYWNjZXB0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gdHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCk7CisvKioKKyAqIEFjY2VwdHMgdGhlIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGluIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIHJlc291cmNlIHBhdGguCisgKiBUaGUgY29uc3RydWN0b3IgaXMgcmVmZXJlbmNlZCB1c2luZyB0aGUgZ2l2ZW4gbmFtZSBhbmQgYSBudW1iZXIgb2YgYXJndW1lbnRzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcmVzb3VyY2UgcGF0aCBjYW4gYmUgbnVsbCBpZiB0aGUgc2VhcmNoIHF1ZXJ5IGRvZXNuJ3QgcmVxdWlyZSBpdC4KKyAqLwordm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gdHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCk7CisvKioKKyAqIEFjY2VwdHMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgZmllbGQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBwYXRoIGNhbiBiZSBudWxsIGlmIHRoZSBzZWFyY2ggcXVlcnkgZG9lc24ndCByZXF1aXJlIGl0IChlZy4gZ2V0IGFsbCBjbGFzcyBuYW1lcykuCisgKiBMaWtld2lzZSwgdGhlIGRlY2xhcmluZyBwYWNrYWdlIG5hbWUgYW5kIHRoZSBkZWNsYXJpbmcgdHlwZSBuYW1lcyBpZiB0aGUgcXVlcnkgZG9lc24ndCByZXF1aXJlIHRoZW0uCisgKi8KK3ZvaWQgYWNjZXB0RmllbGREZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gZmllbGROYW1lKTsKKy8qKgorICogQWNjZXB0cyB0aGUgcmVmZXJlbmNlIHRvIGEgZmllbGQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqIFRoZSBmaWVsZCBpcyByZWZlcmVuY2VkIHVzaW5nIHRoZSBnaXZlbiBuYW1lIAorICovCit2b2lkIGFjY2VwdEZpZWxkUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBmaWVsZE5hbWUpOworLyoqCisgKiBBY2NlcHRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBpbnRlcmZhY2UgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqIFRoZSBpbnRlcmZhY2UgaXMgZGVjbGFyZWQgaW4gdGhlIGdpdmVuIHBhY2thZ2UgYW5kIHdpdGggdGhlIGdpdmVuIHR5cGUgbmFtZS4gCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGUgcmVzb3VyY2UgcGF0aCBjYW4gYmUgbnVsbCBpZiB0aGUgc2VhcmNoIHF1ZXJ5IGRvZXNuJ3QgcmVxdWlyZSBpdCAoZWcuIGdldCBhbGwgaW50ZXJmYWNlIG5hbWVzKS4KKyAqLwordm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKTsKKy8qKgorICogQWNjZXB0cyB0aGUgZGVjbGFyYXRpb24gb2YgYSBtZXRob2QgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqIFRoZSBtZXRob2QgaXMgZGVjbGFyZWQgd2l0aCBhIGdpdmVuIG1ldGhvZCBuYW1lIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCit2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpOworLyoqCisgKiBBY2NlcHRzIHRoZSByZWZlcmVuY2UgdG8gYSBtZXRob2QgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aC4KKyAqIFRoZSBtZXRob2QgaXMgcmVmZXJlbmNlZCB1c2luZyB0aGUgZ2l2ZW4gc2VsZWN0b3IgYW5kIGEgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHJlc291cmNlIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIHNlYXJjaCBxdWVyeSBkb2Vzbid0IHJlcXVpcmUgaXQuCisgKi8KK3ZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpOworLyoqCisgKiBBY2NlcHRzIHRoZSByZWZlcmVuY2UgdG8gYSBwYWNrYWdlIGluIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIHJlc291cmNlIHBhdGguCisgKiBUaGUgcGFja2FnZSBpcyByZWZlcmVuY2VkIHVzaW5nIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCisgKgorICogTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBwYXRoIGNhbiBiZSBudWxsIGlmIHRoZSBzZWFyY2ggcXVlcnkgZG9lc24ndCByZXF1aXJlIGl0LgorICovCit2b2lkIGFjY2VwdFBhY2thZ2VSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHBhY2thZ2VOYW1lKTsKKy8qKgorICogQWNjZXB0cyB0aGUgcmVmZXJlbmNlIHRvIGEgc3VwZXJ0eXBlIGluIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIHJlc291cmNlIHBhdGguCisgKiBOb3RlIHRoYXQgdGhlIHJlc291cmNlIHBhdGggYW5kL29yIHRoZSBwYWNrYWdlIG5hbWUgY2FuIGJlIG51bGwuCisgKi8KK3ZvaWQgYWNjZXB0U3VwZXJUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSwgY2hhciBjbGFzc09ySW50ZXJmYWNlLCBjaGFyW10gc3VwZXJRdWFsaWZpY2F0aW9uLCBjaGFyW10gc3VwZXJUeXBlTmFtZSwgY2hhciBzdXBlckNsYXNzT3JJbnRlcmZhY2UsIGludCBtb2RpZmllcnMpOworLyoqCisgKiBBY2NlcHRzIHRoZSByZWZlcmVuY2UgdG8gYSBjbGFzcyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZSBwYXRoLgorICogVGhlIGNsYXNzIGlzIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGdpdmVuIHR5cGUgbmFtZS4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBwYXRoIGNhbiBiZSBudWxsIGlmIHRoZSBzZWFyY2ggcXVlcnkgZG9lc24ndCByZXF1aXJlIGl0LgorICovCit2b2lkIGFjY2VwdFR5cGVSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHR5cGVOYW1lKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSUluZm9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSUluZm9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjkyMTBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5mb0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworcHVibGljIGludGVyZmFjZSBJSW5mb0NvbnN0YW50cyB7CisJLyogZ3JhbnVsYXJpdHkgb2Ygc2VhcmNoIHJlc3VsdHMgKi8KKwlpbnQgTmFtZUluZm8gPSAxOworCWludCBQYXRoSW5mbyA9IDI7CisJaW50IFBvc2l0aW9uSW5mbyA9IDQ7CisJaW50IERlY2xhcmF0aW9uSW5mbyA9IDg7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VhcmNoQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlYXJjaEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA3MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlYXJjaEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CisKK3B1YmxpYyBjbGFzcyBJbmRleFNlYXJjaEFkYXB0ZXIgaW1wbGVtZW50cyBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgeworLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRDbGFzc0RlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gdHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkgeworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gdHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkgeworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZERlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBmaWVsZE5hbWUpIHsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGRSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIGZpZWxkTmFtZSkgeworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7Cit9CisvKioKKyAqIEBzZWUgSUluZGV4U2VhcmNoUmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0U3VwZXJUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSwgY2hhciBjbGFzc09ySW50ZXJmYWNlLCBjaGFyW10gc3VwZXJRdWFsaWZpY2F0aW9uLCBjaGFyW10gc3VwZXJUeXBlTmFtZSwgY2hhciBzdXBlckNsYXNzT3JJbnRlcmZhY2UsIGludCBtb2RpZmllcnMpeworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSB0eXBlTmFtZSkgeworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTBiZTFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CisKKy8qKgorICogU2VsZWN0cyB0aGUgaW5kZXhlcyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJvamVjdHMgaW4gYSBnaXZlbiBzZWFyY2ggc2NvcGUKKyAqIGFuZCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBnaXZlbiBmb2N1cyBlbGVtZW50LgorICovCitwdWJsaWMgY2xhc3MgSW5kZXhTZWxlY3RvciB7CisJSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZTsKKwlJSmF2YUVsZW1lbnQgZm9jdXM7CisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlcjsKKwlJSW5kZXhbXSBpbmRleGVzOworcHVibGljIEluZGV4U2VsZWN0b3IoCisJSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZSwKKwlJSmF2YUVsZW1lbnQgZm9jdXMsCisJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlcikgeworCXRoaXMuc2VhcmNoU2NvcGUgPSBzZWFyY2hTY29wZTsKKwl0aGlzLmZvY3VzID0gZm9jdXM7CisJdGhpcy5pbmRleE1hbmFnZXIgPSBpbmRleE1hbmFnZXI7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcHJvamVjdCBvciBqYXIgY2FuIHNlZSB0aGUgZm9jdXMgZWxlbWVudAorICogZWl0aGVyIGJlY2F1c2UgdGhlIGZvY3VzIGlzIHBhcnQgb2YgdGhlIHByb2plY3Qgb3IgdGhlIGphciwgb3IgYmVjYXVzZSBpdCBpcyAKKyAqIGFjY2Vzc2libGUgdGhyb3VnaHQgdGhlIHByb2plY3QncyBjbGFzc3BhdGgKKyAqLworcHJpdmF0ZSBib29sZWFuIGNhblNlZUZvY3VzKElQYXRoIHByb2plY3RPckphclBhdGgpIHsKKwkvLyBpZiBpdCBpcyBhIHdvcmtzcGFjZSBzY29wZSwgZm9jdXMgaXMgdmlzaWJsZSBmcm9tIGV2ZXJ5d2hlcmUKKwlpZiAodGhpcy5zZWFyY2hTY29wZSBpbnN0YW5jZW9mIEphdmFXb3Jrc3BhY2VTY29wZSkgcmV0dXJuIHRydWU7CisJCisJdHJ5IHsKKwkJd2hpbGUgKCEodGhpcy5mb2N1cyBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgJiYgISh0aGlzLmZvY3VzIGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkpIHsKKwkJCXRoaXMuZm9jdXMgPSB0aGlzLmZvY3VzLmdldFBhcmVudCgpOworCQl9CisJCUlKYXZhTW9kZWwgbW9kZWwgPSB0aGlzLmZvY3VzLmdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QocHJvamVjdE9ySmFyUGF0aCwgbW9kZWwpOworCQlpZiAodGhpcy5mb2N1cyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBqYXIKKwkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpdGhpcy5mb2N1czsKKwkJCUlQYXRoIGphclBhdGggPSBqYXIuZ2V0UGF0aCgpOworCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQkJCS8vIGNvbnNpZGVyIHRoYXQgYSBqYXIgY2FuIHNlZSBhbm90aGVyIGphciBvbmx5IHRoZXkgYXJlIGJvdGggcmVmZXJlbmNlZCBieSB0aGUgc2FtZSBwcm9qZWN0CisJCQkJcmV0dXJuIHRoaXMuaGF2ZVNhbWVQYXJlbnQocHJvamVjdE9ySmFyUGF0aCwgamFyUGF0aCwgbW9kZWwpOyAKKwkJCX0gZWxzZSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIAorCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhqYXJQYXRoKSkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBwcm9qZWN0CisJCQlJSmF2YVByb2plY3QgZm9jdXNQcm9qZWN0ID0gKElKYXZhUHJvamVjdCl0aGlzLmZvY3VzOworCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQkJCS8vIGNvbnNpZGVyIHRoYXQgYSBqYXIgY2FuIHNlZSBhIHByb2plY3Qgb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGJ5IHRoaXMgcHJvamVjdAorCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAoKEphdmFQcm9qZWN0KWZvY3VzUHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIAorCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhwcm9qZWN0T3JKYXJQYXRoKSkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZvY3VzUHJvamVjdC5lcXVhbHMocHJvamVjdCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJSVBhdGggZm9jdXNQYXRoID0gZm9jdXNQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gKChKYXZhUHJvamVjdClwcm9qZWN0KS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisJCQkJCQlpZiAoKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgCisJCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhmb2N1c1BhdGgpKSB7CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorcHJpdmF0ZSB2b2lkIGNvbXB1dGVJbmRleGVzKCkgeworCUFycmF5TGlzdCBpbmRleGVzSW5TY29wZSA9IG5ldyBBcnJheUxpc3QoKTsKKwlJUGF0aFtdIHByb2plY3RzQW5kSmFycyA9IHRoaXMuc2VhcmNoU2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7CisJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQkuZ2V0Um9vdCgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHNBbmRKYXJzLmxlbmd0aDsgaSsrKSB7CisJCUlQYXRoIGxvY2F0aW9uOworCQlJUGF0aCBwYXRoID0gcHJvamVjdHNBbmRKYXJzW2ldOworCQlpZiAoKCFyb290LmdldFByb2plY3QocGF0aC5sYXN0U2VnbWVudCgpKS5leGlzdHMoKSkgLy8gaWYgcHJvamVjdCBkb2VzIG5vdCBleGlzdAorCQkJJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEKKwkJCSYmICgobG9jYXRpb24gPSByb290LmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKSkgPT0gbnVsbAorCQkJCXx8ICFuZXcgamF2YS5pby5GaWxlKGxvY2F0aW9uLnRvT1NTdHJpbmcoKSkuZXhpc3RzKCkpIC8vIGFuZCBpbnRlcm5hbCBqYXIgZmlsZSBkb2VzIG5vdCBleGlzdAorCQkJJiYgIW5ldyBqYXZhLmlvLkZpbGUocGF0aC50b09TU3RyaW5nKCkpLmV4aXN0cygpKSB7IC8vIGFuZCBleHRlcm5hbCBqYXIgZmlsZSBkb2VzIG5vdCBleGlzdAorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0aGlzLmZvY3VzID09IG51bGwgfHwgdGhpcy5jYW5TZWVGb2N1cyhwYXRoKSkgeworCQkJSUluZGV4IGluZGV4ID0gdGhpcy5pbmRleE1hbmFnZXIuZ2V0SW5kZXgocGF0aCwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7CisJCQlpZiAoaW5kZXggIT0gbnVsbCAmJiBpbmRleGVzSW5TY29wZS5pbmRleE9mKGluZGV4KSA9PSAtMSkgeworCQkJCWluZGV4ZXNJblNjb3BlLmFkZChpbmRleCk7CisJCQl9CisJCX0KKwl9CisJdGhpcy5pbmRleGVzID0gbmV3IElJbmRleFtpbmRleGVzSW5TY29wZS5zaXplKCldOworCWluZGV4ZXNJblNjb3BlLnRvQXJyYXkodGhpcy5pbmRleGVzKTsKK30KK3B1YmxpYyBJSW5kZXhbXSBnZXRJbmRleGVzKCkgeworCWlmICh0aGlzLmluZGV4ZXMgPT0gbnVsbCkgeworCQl0aGlzLmNvbXB1dGVJbmRleGVzKCk7CisJfQorCXJldHVybiB0aGlzLmluZGV4ZXM7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGphdmEgcHJvamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBwYXRoLgorICogUmV0dXJucyBudWxsIGlmIHRoZSBwYXRoIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHByb2plY3QuCisgKi8KK3ByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQYXRoIHBhdGgsIElKYXZhTW9kZWwgbW9kZWwpIHsKKwlJSmF2YVByb2plY3QgcHJvamVjdCA9IG1vZGVsLmdldEphdmFQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSk7CisJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKKwkJcmV0dXJuIHByb2plY3Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGphcnMgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGNsYXNzcGF0aCBvZiB0aGUgc2FtZSBwcm9qZWN0LgorICovCitwcml2YXRlIGJvb2xlYW4gaGF2ZVNhbWVQYXJlbnQoSVBhdGggamFyUGF0aDEsIElQYXRoIGphclBhdGgyLCBJSmF2YU1vZGVsIG1vZGVsKSB7CisJaWYgKGphclBhdGgxLmVxdWFscyhqYXJQYXRoMikpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXRyeSB7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAoKEphdmFQcm9qZWN0KXByb2plY3QpLmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOworCQkJYm9vbGVhbiByZWZlcmVuY2VzSmFyMSA9IGZhbHNlOworCQkJYm9vbGVhbiByZWZlcmVuY2VzSmFyMiA9IGZhbHNlOworCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07CisJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJCWlmIChlbnRyeVBhdGguZXF1YWxzKGphclBhdGgxKSkgeworCQkJCQkJcmVmZXJlbmNlc0phcjEgPSB0cnVlOworCQkJCQl9IGVsc2UgaWYgKGVudHJ5UGF0aC5lcXVhbHMoamFyUGF0aDIpKSB7CisJCQkJCQlyZWZlcmVuY2VzSmFyMiA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocmVmZXJlbmNlc0phcjEgJiYgcmVmZXJlbmNlc0phcjIpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCisJCX0KKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0JCisJcmV0dXJuIGZhbHNlOworfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTExNzNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoU2NvcGUuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKKworLyoqCisgKiBBIEphdmEtc3BlY2lmaWMgc2NvcGUgZm9yIHNlYXJjaGluZyByZWxhdGl2ZSB0byBvbmUgb3IgbW9yZSBqYXZhIGVsZW1lbnRzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YVNlYXJjaFNjb3BlIGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hTY29wZSB7CisJCisJcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHM7CisKKwkvKiBUaGUgcGF0aHMgb2YgdGhlIHJlc291cmNlcyBpbiB0aGlzIHNlYXJjaCBzY29wZSAKKwkgICAob3IgdGhlIGNsYXNzcGF0aCBlbnRyaWVzJyBwYXRocyAKKwkgICBpZiB0aGUgcmVzb3VyY2VzIGFyZSBwcm9qZWN0cykgKi8KKwlwcml2YXRlIElQYXRoW10gcGF0aHM7CisJcHJpdmF0ZSBib29sZWFuW10gcGF0aFdpdGhTdWJGb2xkZXJzOworCXByaXZhdGUgaW50IHBhdGhzQ291bnQ7CisJCisJcHJpdmF0ZSBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKKwkKK3B1YmxpYyBKYXZhU2VhcmNoU2NvcGUoKSB7CisJdGhpcy5pbml0aWFsaXplKCk7CisJCisJLy9kaXNhYmxlZCBmb3Igbm93IGFzIHRoaXMgY291bGQgYmUgZXhwZW5zaXZlCisJLy9KYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1lbWJlclNjb3BlKHRoaXMpOworfQorCQorcHJpdmF0ZSB2b2lkIGFkZEVuY2xvc2luZ1Byb2plY3RPckphcihJUGF0aCBwYXRoKSB7CisJaW50IGxlbmd0aCA9IHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzLmxlbmd0aDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmICh0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyc1tpXS5lcXVhbHMocGF0aCkpIHJldHVybjsKKwl9CisJU3lzdGVtLmFycmF5Y29weSgKKwkJdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMsCisJCTAsCisJCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzID0gbmV3IElQYXRoW2xlbmd0aCsxXSwKKwkJMCwKKwkJbGVuZ3RoKTsKKwl0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyc1tsZW5ndGhdID0gcGF0aDsKK30KKworcHVibGljIHZvaWQgYWRkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiBpbmNsdWRlc1ByZXJlcVByb2plY3RzLCBIYXNoU2V0IHZpc2l0ZWRQcm9qZWN0cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkgfHwgIXZpc2l0ZWRQcm9qZWN0cy5hZGQocHJvamVjdCkpIHJldHVybjsKKworCXRoaXMuYWRkRW5jbG9zaW5nUHJvamVjdE9ySmFyKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7CisKKwlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJSUphdmFNb2RlbCBtb2RlbCA9IGphdmFQcm9qZWN0LmdldEphdmFNb2RlbCgpOworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgorCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJdGhpcy5hZGQocGF0aCwgdHJ1ZSk7CisJCQkJdGhpcy5hZGRFbmNsb3NpbmdQcm9qZWN0T3JKYXIocGF0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKKwkJCQlpZiAoaW5jbHVkZXNQcmVyZXFQcm9qZWN0cykgeworCQkJCQl0aGlzLmFkZChtb2RlbC5nZXRKYXZhUHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSksIHRydWUsIHZpc2l0ZWRQcm9qZWN0cyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRToKKwkJCQl0aGlzLmFkZChlbnRyeS5nZXRQYXRoKCksIHRydWUpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorcHVibGljIHZvaWQgYWRkKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gbnVsbDsKKwlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMOgorCQkJLy8gYSB3b3Jrc3BhY2Ugc29wZSBzaG91bGQgYmUgdXNlZAorCQkJYnJlYWs7IAorCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCQl0aGlzLmFkZCgoSUphdmFQcm9qZWN0KWVsZW1lbnQsIHRydWUsIG5ldyBIYXNoU2V0KDIpKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQlyb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7CisJCQl0aGlzLmFkZChyb290LmdldFBhdGgoKSwgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKKwkJCXJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJCWlmIChyb290LmlzQXJjaGl2ZSgpKSB7CisJCQkJdGhpcy5hZGQocm9vdC5nZXRQYXRoKCkuYXBwZW5kKG5ldyBQYXRoKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSkpLCBmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJdGhpcy5hZGQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgZmFsc2UpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLy8gcmVtZW1iZXIgc3ViLWN1IChvciBzdWItY2xhc3MgZmlsZSkgamF2YSBlbGVtZW50cworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7CisJCQkJaWYgKHRoaXMuZWxlbWVudHMgPT0gbnVsbCkgeworCQkJCQl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQkJCX0KKwkJCQl0aGlzLmVsZW1lbnRzLmFkZChlbGVtZW50KTsKKwkJCX0KKwkJCXRoaXMuYWRkKHRoaXMuZnVsbFBhdGgoZWxlbWVudCksIHRydWUpOworCQkJCisJCQkvLyBmaW5kIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpbmNsdWRpbmcgdGhpcyBqYXZhIGVsZW1lbnQKKwkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQkJfQorCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClwYXJlbnQ7CisJCQl9CisJfQorCQorCWlmIChyb290ICE9IG51bGwpIHsKKwkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKSB7CisJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihyb290LmdldFBhdGgoKSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmFkZEVuY2xvc2luZ1Byb2plY3RPckphcihyb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOworCQl9CisJfQorfQorCisvKioKKyAqIEFkZHMgdGhlIGdpdmVuIHBhdGggdG8gdGhpcyBzZWFyY2ggc2NvcGUuIFJlbWVtYmVyIGlmIHN1YmZvbGRlcnMgbmVlZCB0byBiZSBpbmNsdWRlZCBhcyB3ZWxsLgorICovCitwcml2YXRlIHZvaWQgYWRkKElQYXRoIHBhdGgsIGJvb2xlYW4gd2l0aFN1YkZvbGRlcnMpIHsKKwlpZiAodGhpcy5wYXRocy5sZW5ndGggPT0gdGhpcy5wYXRoc0NvdW50KSB7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0aGlzLnBhdGhzLAorCQkJMCwKKwkJCXRoaXMucGF0aHMgPSBuZXcgSVBhdGhbdGhpcy5wYXRoc0NvdW50ICogMl0sCisJCQkwLAorCQkJdGhpcy5wYXRoc0NvdW50KTsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMucGF0aFdpdGhTdWJGb2xkZXJzLAorCQkJMCwKKwkJCXRoaXMucGF0aFdpdGhTdWJGb2xkZXJzID0gbmV3IGJvb2xlYW5bdGhpcy5wYXRoc0NvdW50ICogMl0sCisJCQkwLAorCQkJdGhpcy5wYXRoc0NvdW50KTsKKwl9CisJdGhpcy5wYXRoc1t0aGlzLnBhdGhzQ291bnRdID0gcGF0aDsKKwl0aGlzLnBhdGhXaXRoU3ViRm9sZGVyc1t0aGlzLnBhdGhzQ291bnQrK10gPSB3aXRoU3ViRm9sZGVyczsgCit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhTdHJpbmcpCisgKi8KK3B1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKKwlJUGF0aCByZXNvdXJjZVBhdGg7CisJaW50IHNlcGFyYXRvckluZGV4ID0gcmVzb3VyY2VQYXRoU3RyaW5nLmluZGV4T2YoSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SKTsKKwlpZiAoc2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKKwkJcmVzb3VyY2VQYXRoID0gCisJCQluZXcgUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KSkuCisJCQkJYXBwZW5kKG5ldyBQYXRoKHJlc291cmNlUGF0aFN0cmluZy5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXgrMSkpKTsKKwl9IGVsc2UgeworCQkJcmVzb3VyY2VQYXRoID0gbmV3IFBhdGgocmVzb3VyY2VQYXRoU3RyaW5nKTsKKwl9CisJcmV0dXJuIHRoaXMuZW5jbG9zZXMocmVzb3VyY2VQYXRoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZWFyY2ggc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHBhdGguCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBlbmNsb3NlcyhJUGF0aCBwYXRoKSB7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnBhdGhzQ291bnQ7IGkrKykgeworCQlpZiAodGhpcy5wYXRoV2l0aFN1YkZvbGRlcnNbaV0pIHsKKwkJCWlmICh0aGlzLnBhdGhzW2ldLmlzUHJlZml4T2YocGF0aCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGlmIG5vdCBsb29raW5nIGF0IHN1YmZvbGRlcnMsIHRoaXMgc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHBhdGggCisJCQkvLyBpZiB0aGlzIHBhdGggaXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIHNjb3BlJ3MgcmVzc291cmNlCisJCQkvLyBvciBpZiB0aGlzIHBhdGggaXMgdGhlIHNjb3BlJ3MgcmVzb3VyY2UgKHNlZSBidWcgMTM5MTkgRGVjbGFyYXRpb24gZm9yIHBhY2thZ2Ugbm90IGZvdW5kIGlmIHNjb3BlIGlzIG5vdCBwcm9qZWN0KQorCQkJSVBhdGggc2NvcGVQYXRoID0gdGhpcy5wYXRoc1tpXTsKKwkJCWlmIChzY29wZVBhdGguaXNQcmVmaXhPZihwYXRoKSAKKwkJCQkmJiAoKHNjb3BlUGF0aC5zZWdtZW50Q291bnQoKSA9PSBwYXRoLnNlZ21lbnRDb3VudCgpIC0gMSkKKwkJCQkJfHwgKHNjb3BlUGF0aC5zZWdtZW50Q291bnQoKSA9PSBwYXRoLnNlZ21lbnRDb3VudCgpKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIChub24tSmF2YWRvYykKKyAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhJSmF2YUVsZW1lbnQpCisgKi8KK3B1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5lbGVtZW50cy5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFFbGVtZW50IHNjb3BlRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpdGhpcy5lbGVtZW50cy5nZXQoaSk7CisJCQlJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50ID0gZWxlbWVudDsKKwkJCXdoaWxlIChzZWFyY2hlZEVsZW1lbnQgIT0gbnVsbCkgeworCQkJCWlmIChzZWFyY2hlZEVsZW1lbnQuZXF1YWxzKHNjb3BlRWxlbWVudCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2VhcmNoZWRFbGVtZW50ID0gc2VhcmNoZWRFbGVtZW50LmdldFBhcmVudCgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMuZW5jbG9zZXModGhpcy5mdWxsUGF0aChlbGVtZW50KSk7CisJfQorfQorCisvKiAobm9uLUphdmFkb2MpCisgKiBAc2VlIElKYXZhU2VhcmNoU2NvcGUjZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkKKyAqLworcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgeworCXJldHVybiB0aGlzLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKK30KK3ByaXZhdGUgSVBhdGggZnVsbFBhdGgoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQpLmdldFBhdGgoKTsKKwl9IGVsc2UgCXsKKwkJSUphdmFFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCUlQYXRoIHBhcmVudFBhdGggPSBwYXJlbnQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmZ1bGxQYXRoKHBhcmVudCk7CisJCUlQYXRoIGNoaWxkUGF0aDsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CisJCQljaGlsZFBhdGggPSBuZXcgUGF0aChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpOworCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJT3BlbmFibGUpIHsKKwkJCWNoaWxkUGF0aCA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcGFyZW50UGF0aDsKKwkJfQorCQlyZXR1cm4gcGFyZW50UGF0aCA9PSBudWxsID8gY2hpbGRQYXRoIDogcGFyZW50UGF0aC5hcHBlbmQoY2hpbGRQYXRoKTsKKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJdGhpcy5wYXRocyA9IG5ldyBJUGF0aFsxXTsKKwl0aGlzLnBhdGhXaXRoU3ViRm9sZGVycyA9IG5ldyBib29sZWFuWzFdOworCXRoaXMucGF0aHNDb3VudCA9IDA7CisJdGhpcy5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMgPSBuZXcgSVBhdGhbMF07Cit9CisvKgorICogQHNlZSBBYnN0cmFjdFNlYXJjaFNjb3BlI3Byb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSkKKyAqLworcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgorCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlKYXZhRWxlbWVudERlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQkJdGhpcy5wcm9jZXNzRGVsdGEoY2hpbGQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRDoKKwkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOworCQkJaWYgKHRoaXMuZW5jbG9zZXMoZWxlbWVudCkpIHsKKwkJCQlpZiAodGhpcy5lbGVtZW50cyAhPSBudWxsKSB7CisJCQkJCXRoaXMuZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOworCQkJCX0gCisJCQkJSVBhdGggcGF0aCA9IG51bGw7CisJCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOgorCQkJCQkJcGF0aCA9ICgoSUphdmFQcm9qZWN0KWVsZW1lbnQpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOworCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQkJCQlpZiAocGF0aCA9PSBudWxsKSB7CisJCQkJCQkJcGF0aCA9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0UGF0aCgpOworCQkJCQkJfQorCQkJCQkJaW50IHRvUmVtb3ZlID0gLTE7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGF0aHNDb3VudDsgaSsrKSB7CisJCQkJCQkJaWYgKHRoaXMucGF0aHNbaV0uZXF1YWxzKHBhdGgpKSB7CisJCQkJCQkJCXRvUmVtb3ZlID0gaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKHRvUmVtb3ZlICE9IC0xKSB7CisJCQkJCQkJaW50IGxhc3QgPSB0aGlzLnBhdGhzQ291bnQtMTsKKwkJCQkJCQlpZiAodG9SZW1vdmUgIT0gbGFzdCkgeworCQkJCQkJCQl0aGlzLnBhdGhzW3RvUmVtb3ZlXSA9IHRoaXMucGF0aHNbbGFzdF07CisJCQkJCQkJCXRoaXMucGF0aFdpdGhTdWJGb2xkZXJzW3RvUmVtb3ZlXSA9IHRoaXMucGF0aFdpdGhTdWJGb2xkZXJzW2xhc3RdOworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLnBhdGhzQ291bnQtLTsKKwkJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJKYXZhU2VhcmNoU2NvcGUgb24gIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAodGhpcy5lbGVtZW50cyAhPSBudWxsKSB7CisJCXJlc3VsdC5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5lbGVtZW50cy5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSmF2YUVsZW1lbnQgZWxlbWVudCA9IChKYXZhRWxlbWVudCl0aGlzLmVsZW1lbnRzLmdldChpKTsKKwkJCXJlc3VsdC5hcHBlbmQoIlxuXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmVzdWx0LmFwcGVuZChlbGVtZW50LnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsKKwkJfQorCQlyZXN1bHQuYXBwZW5kKCJcbl0iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWlmICh0aGlzLnBhdGhzQ291bnQgPT0gMCkgeworCQkJcmVzdWx0LmFwcGVuZCgiW2VtcHR5IHNjb3BlXSIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlyZXN1bHQuYXBwZW5kKCJbIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYXRoc0NvdW50OyBpKyspIHsKKwkJCQlJUGF0aCBwYXRoID0gdGhpcy5wYXRoc1tpXTsKKwkJCQlyZXN1bHQuYXBwZW5kKCJcblx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXN1bHQuYXBwZW5kKHBhdGgudG9TdHJpbmcoKSk7CisJCQl9CisJCQlyZXN1bHQuYXBwZW5kKCJcbl0iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhV29ya3NwYWNlU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVdvcmtzcGFjZVNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNTdmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVdvcmtzcGFjZVNjb3BlLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CisKKy8qKgorICogQSBKYXZhLXNwZWNpZmljIHNjb3BlIGZvciBzZWFyY2hpbmcgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCisgKiBUaGUgc2NvcGUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gbm90IHNlYXJjaCBiaW5hcmllcy4gQnkgZGVmYXVsdCwgYmluYXJpZXMKKyAqIGFyZSBpbmNsdWRlZC4KKyAqLworcHVibGljIGNsYXNzIEphdmFXb3Jrc3BhY2VTY29wZSBleHRlbmRzIEphdmFTZWFyY2hTY29wZSB7CisJcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNJbml0aWFsaXplOworCQorcHVibGljIEphdmFXb3Jrc3BhY2VTY29wZSgpIHsKKwlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1lbWJlclNjb3BlKHRoaXMpOworfQorcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkvKgorCWlmICh0aGlzLm5lZWRzSW5pdGlhbGl6ZSkgeworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisJcmV0dXJuIHN1cGVyLmVuY2xvc2VzKGVsZW1lbnQpOworCSovCisJLypBIHdvcmtzcGFjZSBzY29wZSBlbmNsb3NlcyBhbGwgamF2YSBlbGVtZW50cyAodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGluZGV4IHNlbGVjdG9yCisJICogYW5kIHRodXMgZW5jbG9zaW5nUHJvamVjdEFuZEphcnMoKSByZXR1cm5zIGluZGV4ZXMgb24gdGhlIGNsYXNzcGF0aCBvbmx5IGFuZCB0aGF0IHRoZXNlCisJICogaW5kZXhlcyBhcmUgY29uc2lzdGVudC4pCisJICogTk9URTogUmV0dXJuaW5nIHRydWUgZ2FpbnMgMjAlIG9mIGEgaGllcmFyY2h5IGJ1aWxkIG9uIE9iamVjdAorCSAqLworCXJldHVybiB0cnVlOworfQorcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgeworCS8qCisJaWYgKHRoaXMubmVlZHNJbml0aWFsaXplKSB7CisJCXRoaXMuaW5pdGlhbGl6ZSgpOworCX0KKwlyZXR1cm4gc3VwZXIuZW5jbG9zZXMocmVzb3VyY2VQYXRoU3RyaW5nKTsKKwkqLworCS8qQSB3b3Jrc3BhY2Ugc2NvcGUgZW5jbG9zZXMgYWxsIHJlc291cmNlcyAodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGluZGV4IHNlbGVjdG9yCisJICogYW5kIHRodXMgZW5jbG9zaW5nUHJvamVjdEFuZEphcnMoKSByZXR1cm5zIGluZGV4ZXMgb24gdGhlIGNsYXNzcGF0aCBvbmx5IGFuZCB0aGF0IHRoZXNlCisJICogaW5kZXhlcyBhcmUgY29uc2lzdGVudC4pCisJICogTk9URTogUmV0dXJuaW5nIHRydWUgZ2FpbnMgMjAlIG9mIGEgaGllcmFyY2h5IGJ1aWxkIG9uIE9iamVjdAorCSAqLworCXJldHVybiB0cnVlOworfQorcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgeworCWlmICh0aGlzLm5lZWRzSW5pdGlhbGl6ZSkgeworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisJcmV0dXJuIHN1cGVyLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpOworfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgIHJldHVybiBvIGluc3RhbmNlb2YgSmF2YVdvcmtzcGFjZVNjb3BlOworfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gSmF2YVdvcmtzcGFjZVNjb3BlLmNsYXNzLmhhc2hDb2RlKCk7Cit9CisKKworcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwlzdXBlci5pbml0aWFsaXplKCk7CisJSmF2YUNvcmUgamF2YUNvcmUgPSBKYXZhQ29yZS5nZXRKYXZhQ29yZSgpOworCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCXRyeSB7CisJCQkJdGhpcy5hZGQoamF2YUNvcmUuY3JlYXRlKHByb2plY3QpLCBmYWxzZSwgbmV3IEhhc2hTZXQoMikpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCX0KKwl0aGlzLm5lZWRzSW5pdGlhbGl6ZSA9IGZhbHNlOworfQorcHVibGljIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJaWYgKHRoaXMubmVlZHNJbml0aWFsaXplKSByZXR1cm47CisJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7CisJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKKwkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCXRoaXMucHJvY2Vzc0RlbHRhKGNoaWxkKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6CisJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKKwkJCXN3aXRjaCAoa2luZCkgeworCQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQ6CisJCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEOgorCQkJCQl0aGlzLm5lZWRzSW5pdGlhbGl6ZSA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRDoKKwkJCQkJY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQkJCXRoaXMucHJvY2Vzc0RlbHRhKGNoaWxkKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQlraW5kID0gZGVsdGEuZ2V0S2luZCgpOworCQkJc3dpdGNoIChraW5kKSB7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKKwkJCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQ6CisJCQkJCXRoaXMubmVlZHNJbml0aWFsaXplID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOgorCQkJCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOworCQkJCQlpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpID4gMAorCQkJCQkJfHwgKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKKwkJCQkJCXRoaXMubmVlZHNJbml0aWFsaXplID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJKYXZhV29ya3NwYWNlU2NvcGUiOyAvLyROT04tTkxTLTEkCit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdGhDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvUGF0aENvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2VmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdGhDb2xsZWN0b3IuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CisKKy8qKgorICogQ29sbGVjdHMgdGhlIHJlc291cmNlIHBhdGhzIHJlcG9ydGVkIGJ5IGEgY2xpZW50IHRvIHRoaXMgc2VhcmNoIHJlcXVlc3Rvci4KKyAqLworcHVibGljIGNsYXNzIFBhdGhDb2xsZWN0b3IgaW1wbGVtZW50cyBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgeworCQorCS8qIGEgc2V0IG9mIHJlc291cmNlIHBhdGhzICovCisJcHVibGljIEhhc2hTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCg1KTsKKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q2xhc3NEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJdGhpcy5wYXRocy5hZGQoIHJlc291cmNlUGF0aCk7Cit9CisvKioKKyAqIEBzZWUgSUluZGV4U2VhcmNoUmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHR5cGVOYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwkJCisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHR5cGVOYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwkJCisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGREZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gZmllbGROYW1lKSB7CisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0RmllbGRSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIGZpZWxkTmFtZSkgeworCQkKKwl0aGlzLnBhdGhzLmFkZChyZXNvdXJjZVBhdGgpOworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCQorCXRoaXMucGF0aHMuYWRkKHJlc291cmNlUGF0aCk7Cit9CisvKioKKyAqIEBzZWUgSUluZGV4U2VhcmNoUmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwkJCisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwkJCisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKKwkJCisJdGhpcy5wYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKK30KKy8qKgorICogQHNlZSBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IKKyAqLworcHVibGljIHZvaWQgYWNjZXB0U3VwZXJUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBxdWFsaWZpY2F0aW9uLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSwgY2hhciBjbGFzc09ySW50ZXJmYWNlLCBjaGFyW10gc3VwZXJRdWFsaWZpY2F0aW9uLCBjaGFyW10gc3VwZXJUeXBlTmFtZSwgY2hhciBzdXBlckNsYXNzT3JJbnRlcmZhY2UsIGludCBtb2RpZmllcnMpIHsKKwl0aGlzLnBhdGhzLmFkZChyZXNvdXJjZVBhdGgpOworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRTdXBlclR5cGVSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSB0eXBlTmFtZSwgY2hhciBjbGFzc09ySW50ZXJmYWNlLCBjaGFyW10gc3VwZXJRdWFsaWZpY2F0aW9uLCBjaGFyW10gc3VwZXJUeXBlTmFtZSwgY2hhciBzdXBlckNsYXNzT3JJbnRlcmZhY2UsIGludCBtb2RpZmllcnMpIHsKKwl0aGlzLnBhdGhzLmFkZChyZXNvdXJjZVBhdGgpOworfQorLyoqCisgKiBAc2VlIElJbmRleFNlYXJjaFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSB0eXBlTmFtZSkgeworCXRoaXMucGF0aHMuYWRkKHJlc291cmNlUGF0aCk7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcGF0aHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkLgorICovCitwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcyhJV29ya3NwYWNlIHdvcmtzcGFjZSkgeworCUlGaWxlW10gcmVzdWx0ID0gbmV3IElGaWxlW3RoaXMucGF0aHMuc2l6ZSgpXTsKKwlpbnQgaSA9IDA7CisJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5wYXRocy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJU3RyaW5nIHJlc291cmNlUGF0aCA9IChTdHJpbmcpaXRlci5uZXh0KCk7CisJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXNvdXJjZVBhdGgpOworCQlyZXN1bHRbaSsrXSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgcGF0aHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkLgorICovCitwdWJsaWMgU3RyaW5nW10gZ2V0UGF0aHMoKSB7CisJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0aGlzLnBhdGhzLnNpemUoKV07CisJaW50IGkgPSAwOworCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMucGF0aHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCXJlc3VsdFtpKytdID0gKFN0cmluZylpdGVyLm5leHQoKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvUGF0dGVyblNlYXJjaEpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiODg2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvUGF0dGVyblNlYXJjaEpvYi5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuUmVhZFdyaXRlTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuU2VhcmNoUGF0dGVybjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5JSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBQYXR0ZXJuU2VhcmNoSm9iIGltcGxlbWVudHMgSUpvYiB7CisKKwlwcm90ZWN0ZWQgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOworCXByb3RlY3RlZCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOworCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZm9jdXM7CisJcHJvdGVjdGVkIElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3I7CisJcHJvdGVjdGVkIEluZGV4TWFuYWdlciBpbmRleE1hbmFnZXI7CisJcHJvdGVjdGVkIGludCBkZXRhaWxMZXZlbDsKKwlwcm90ZWN0ZWQgSW5kZXhTZWxlY3RvciBpbmRleFNlbGVjdG9yOworCXByb3RlY3RlZCBsb25nIGV4ZWN1dGlvblRpbWUgPSAwOworCQorCXB1YmxpYyBQYXR0ZXJuU2VhcmNoSm9iKAorCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCisJCWludCBkZXRhaWxMZXZlbCwKKwkJSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwKKwkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlcikgeworCisJCXRoaXMoCisJCQlwYXR0ZXJuLAorCQkJc2NvcGUsCisJCQludWxsLAorCQkJZGV0YWlsTGV2ZWwsCisJCQlyZXF1ZXN0b3IsCisJCQlpbmRleE1hbmFnZXIpOworCX0KKworCXB1YmxpYyBQYXR0ZXJuU2VhcmNoSm9iKAorCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sCisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCisJCUlKYXZhRWxlbWVudCBmb2N1cywKKwkJaW50IGRldGFpbExldmVsLAorCQlJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLAorCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyKSB7CisKKwkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKwkJdGhpcy5zY29wZSA9IHNjb3BlOworCQl0aGlzLmZvY3VzID0gZm9jdXM7CisJCXRoaXMuZGV0YWlsTGV2ZWwgPSBkZXRhaWxMZXZlbDsKKwkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisJCXRoaXMuaW5kZXhNYW5hZ2VyID0gaW5kZXhNYW5hZ2VyOworCX0KKworCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIGV4ZWN1dGUgbWV0aG9kIGNvbW1lbnQuCisJICovCisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCWJvb2xlYW4gaXNDb21wbGV0ZSA9IENPTVBMRVRFOworCQlleGVjdXRpb25UaW1lID0gMDsKKwkJaWYgKHRoaXMuaW5kZXhTZWxlY3RvciA9PSBudWxsKSB7CisJCQl0aGlzLmluZGV4U2VsZWN0b3IgPQorCQkJCW5ldyBJbmRleFNlbGVjdG9yKHRoaXMuc2NvcGUsIHRoaXMuZm9jdXMsIHRoaXMuaW5kZXhNYW5hZ2VyKTsKKwkJfQorCQlJSW5kZXhbXSBzZWFyY2hJbmRleGVzID0gdGhpcy5pbmRleFNlbGVjdG9yLmdldEluZGV4ZXMoKTsKKwkJdHJ5IHsKKwkJCWludCBtYXggPSBzZWFyY2hJbmRleGVzLmxlbmd0aDsKKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIG1heCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlpc0NvbXBsZXRlICY9IHNlYXJjaChzZWFyY2hJbmRleGVzW2ldLCBwcm9ncmVzc01vbml0b3IpOworCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgeworCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZXhlY3V0aW9uIHRpbWU6ICIgKyBleGVjdXRpb25UaW1lICsgIm1zIC0gIiArIHRoaXMpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl9CisJCQlyZXR1cm4gaXNDb21wbGV0ZTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBleGVjdXRlIG1ldGhvZCBjb21tZW50LgorCSAqLworCXB1YmxpYyBib29sZWFuIHNlYXJjaChJSW5kZXggaW5kZXgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCQlpZiAoaW5kZXggPT0gbnVsbCkKKwkJCXJldHVybiBDT01QTEVURTsKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gaW5kZXhNYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAorCQl0cnkgeworCQkJbW9uaXRvci5lbnRlclJlYWQoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gcmVhZAorCisJCQkvKiBpZiBpbmRleCBoYXMgY2hhbmdlZCwgY29tbWl0IHRoZXNlIGJlZm9yZSBxdWVyeWluZyAqLworCQkJaWYgKGluZGV4Lmhhc0NoYW5nZWQoKSkgeworCQkJCXRyeSB7CisJCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gbWVyZ2luZyBpbmRleCAiICsgaW5kZXguZ2V0SW5kZXhGaWxlKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWluZGV4LnNhdmUoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBGQUlMRUQ7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJbW9uaXRvci5leGl0V3JpdGVFbnRlclJlYWQoKTsgLy8gZmluaXNoZWQgd3JpdGluZyBhbmQgcmVhY3F1aXJlIHJlYWQgcGVybWlzc2lvbgorCQkJCX0KKwkJCX0KKwkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCXBhdHRlcm4uZmluZEluZGV4TWF0Y2hlcygKKwkJCQlpbmRleCwKKwkJCQlyZXF1ZXN0b3IsCisJCQkJZGV0YWlsTGV2ZWwsCisJCQkJcHJvZ3Jlc3NNb25pdG9yLAorCQkJCXRoaXMuc2NvcGUpOworCQkJZXhlY3V0aW9uVGltZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworCQkJcmV0dXJuIENPTVBMRVRFOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmaW5pc2hlZCByZWFkaW5nCisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gInNlYXJjaGluZyAiICsgcGF0dGVybi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJfQorCS8qCisJICogQHNlZSBJSm9iI2NhbmNlbCgpCisJICovCisJcHVibGljIHZvaWQgY2FuY2VsKCkgeworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9TdWJUeXBlU2VhcmNoSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3N2FmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkJsb2Nrc0luZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLlJlYWRXcml0ZU1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLlNlYXJjaFBhdHRlcm47CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKKworcHVibGljIGNsYXNzIFN1YlR5cGVTZWFyY2hKb2IgZXh0ZW5kcyBQYXR0ZXJuU2VhcmNoSm9iIHsKKworCU1hcCBpbnB1dHMgPSBuZXcgSGFzaE1hcCg1KTsKK3B1YmxpYyBTdWJUeXBlU2VhcmNoSm9iKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IGRldGFpbExldmVsLCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyKSB7CisJc3VwZXIocGF0dGVybiwgc2NvcGUsIGRldGFpbExldmVsLCByZXF1ZXN0b3IsIGluZGV4TWFuYWdlcik7Cit9CitwdWJsaWMgU3ViVHlwZVNlYXJjaEpvYihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElKYXZhRWxlbWVudCBmb2N1cywgaW50IGRldGFpbExldmVsLCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlcikgeworCXN1cGVyKHBhdHRlcm4sIHNjb3BlLCBmb2N1cywgZGV0YWlsTGV2ZWwsIHJlcXVlc3RvciwgaW5kZXhNYW5hZ2VyKTsKK30KK3B1YmxpYyB2b2lkIGNsb3NlQWxsKCl7CisKKwlJdGVyYXRvciBvcGVuZWRJbnB1dHMgPSBpbnB1dHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwl3aGlsZSAob3BlbmVkSW5wdXRzLmhhc05leHQoKSl7CisJCUluZGV4SW5wdXQgaW5wdXQgPSAoSW5kZXhJbnB1dCkgb3BlbmVkSW5wdXRzLm5leHQoKTsKKwkJdHJ5IHsKKwkJCWlucHV0LmNsb3NlKCk7CisJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7CisJCX0KKwl9IAorfQorLyoqCisgKiBleGVjdXRlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgYm9vbGVhbiBzZWFyY2goSUluZGV4IGluZGV4LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCisJaWYgKGluZGV4ID09IG51bGwpIHJldHVybiBDT01QTEVURTsJCQorCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IGluZGV4TWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKKwlpZiAobW9uaXRvciA9PSBudWxsKSByZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJdHJ5IHsKKwkJbW9uaXRvci5lbnRlclJlYWQoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gcmVhZAorCisJCS8qIGlmIGluZGV4IGhhcyBjaGFuZ2VkLCBjb21taXQgdGhlc2UgYmVmb3JlIHF1ZXJ5aW5nICovCisJCWlmIChpbmRleC5oYXNDaGFuZ2VkKCkpeworCQkJdHJ5IHsKKwkJCQltb25pdG9yLmV4aXRSZWFkKCk7IC8vIGZyZWUgcmVhZCBsb2NrCisJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSAKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbmRleC5zYXZlKCk7CisJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpeworCQkJCXJldHVybiBGQUlMRUQ7CisJCQl9IGZpbmFsbHkgeworCQkJCW1vbml0b3IuZXhpdFdyaXRlRW50ZXJSZWFkKCk7IC8vIGZpbmlzaGVkIHdyaXRpbmcgYW5kIHJlYWNxdWlyZSByZWFkIHBlcm1pc3Npb24KKwkJCX0KKwkJfQorCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJSW5kZXhJbnB1dCBpbnB1dDsKKwkJaWYgKChpbnB1dCA9IChJbmRleElucHV0KSBpbnB1dHMuZ2V0KGluZGV4KSkgPT0gbnVsbCl7CisJCQlpbnB1dCA9IG5ldyBCbG9ja3NJbmRleElucHV0KGluZGV4LmdldEluZGV4RmlsZSgpKTsKKwkJCWlucHV0Lm9wZW4oKTsKKwkJCWlucHV0cy5wdXQoaW5kZXgsIGlucHV0KTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJBY3F1aXJpbmcgSU5QVVQgZm9yICIraW5kZXgpOworCQl9CisJCXBhdHRlcm4uZmluZEluZGV4TWF0Y2hlcyhpbnB1dCwgcmVxdWVzdG9yLCBkZXRhaWxMZXZlbCwgcHJvZ3Jlc3NNb25pdG9yLCB0aGlzLnNjb3BlKTsKKwkJZXhlY3V0aW9uVGltZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworCQlyZXR1cm4gQ09NUExFVEU7CisJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IGZpbmFsbHkgeworCQltb25pdG9yLmV4aXRSZWFkKCk7IC8vIGZpbmlzaGVkIHJlYWRpbmcKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTIwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1V0aWwuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBVdGlsIHsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRE9VQkxFX1FVT1RFUyA9ICInJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBTSU5HTEVfUVVPVEUgPSAiJyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCisJLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJc3RhdGljIHsKKwkJcmVsb2NhbGl6ZSgpOworCX0KKy8qKgorICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKyAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5ncy4KKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nMSwgU3RyaW5nIGJpbmRpbmcyKSB7CisJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7YmluZGluZzEsIGJpbmRpbmcyfSk7Cit9CisvKioKKyAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCisgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZy4KKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nKSB7CisJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7YmluZGluZ30pOworfQorLyoqCisgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgorICovCitwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nW10gYmluZGluZ3MpIHsKKwlpZiAoaWQgPT0gbnVsbCkKKwkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisJdHJ5IHsKKwkJbWVzc2FnZSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQpOworCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCS8vIElmIHdlIGdvdCBhbiBleGNlcHRpb24gbG9va2luZyBmb3IgdGhlIG1lc3NhZ2UsIGZhaWwgZ3JhY2VmdWxseSBieSBqdXN0IHJldHVybmluZworCQkvLyB0aGUgaWQgd2Ugd2VyZSBsb29raW5nIGZvci4gIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBzZW1pLWluZm9ybWF0aXZlIHNvIGlzIG5vdCB0b28gYmFkLgorCQlyZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIiArIGlkICsgIiBpbjogIiArIGJ1bmRsZU5hbWU7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCX0KKwkvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1lc3NhZ2VGb3JtYXQgd2hpY2ggZWxpbWluYXRlcyBkb3VibGUgcXVvdGVzIGluIG9yaWdpbmFsIG1lc3NhZ2UKKwljaGFyW10gbWVzc2FnZVdpdGhOb0RvdWJsZVF1b3RlcyA9CisJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1lc3NhZ2UudG9DaGFyQXJyYXkoKSwgRE9VQkxFX1FVT1RFUywgU0lOR0xFX1FVT1RFKTsKKwltZXNzYWdlID0gbmV3IFN0cmluZyhtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzKTsKKworCWlmIChiaW5kaW5ncyA9PSBudWxsKQorCQlyZXR1cm4gbWVzc2FnZTsKKwlpbnQgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGgoKTsKKwlpbnQgc3RhcnQgPSAtMTsKKwlpbnQgZW5kID0gbGVuZ3RoOworCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKKwl3aGlsZSAodHJ1ZSkgeworCQlpZiAoKGVuZCA9IG1lc3NhZ2UuaW5kZXhPZigneycsIHN0YXJ0KSkgPiAtMSkgeworCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkpOworCQkJaWYgKChzdGFydCA9IG1lc3NhZ2UuaW5kZXhPZignfScsIGVuZCkpID4gLTEpIHsKKwkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQl0cnkgeworCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQobWVzc2FnZS5zdWJzdHJpbmcoZW5kICsgMSwgc3RhcnQpKTsKKwkJCQkJb3V0cHV0LmFwcGVuZChiaW5kaW5nc1tpbmRleF0pOworCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKwkJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCArIDEpKTsKKwkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlvdXRwdXQuYXBwZW5kKCJ7bWlzc2luZyAiICsgSW50ZWdlci50b1N0cmluZyhpbmRleCkgKyAifSIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoZW5kLCBsZW5ndGgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBsZW5ndGgpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKK30KKy8qKgorICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyAKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQpIHsKKwlyZXR1cm4gYmluZChpZCwgKFN0cmluZ1tdKW51bGwpOworfQorLyoqCisgKiBDcmVhdGVzIGEgTkxTIGNhdGFsb2cgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCisgKi8KK3B1YmxpYyBzdGF0aWMgdm9pZCByZWxvY2FsaXplKCkgeworCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKK30KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BYnN0cmFjdEluZGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWJzdHJhY3RJbmRleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0Y2FhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWJzdHJhY3RJbmRleGVyLmphdmEKQEAgLTAsMCArMSw1NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXJPdXRwdXQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluZGV4ZXIgaW1wbGVtZW50cyBJSW5kZXhlciwgSUluZGV4Q29uc3RhbnRzLCBJSmF2YVNlYXJjaENvbnN0YW50cyB7CisJSUluZGV4ZXJPdXRwdXQgb3V0cHV0OworCitwdWJsaWMgQWJzdHJhY3RJbmRleGVyKCkgeworCXN1cGVyKCk7Cit9CitwdWJsaWMgdm9pZCBhZGRDbGFzc0RlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gbmFtZSwgIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHN1cGVyY2xhc3MsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcyl7CisKKwl0aGlzLm91dHB1dC5hZGRSZWYoZW5jb2RlVHlwZUVudHJ5KHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIG5hbWUsIHRydWUpKTsKKwkKKwlhZGRTdXBlclR5cGVSZWZlcmVuY2UobW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBDTEFTU19TVUZGSVgsIHN1cGVyY2xhc3MsIENMQVNTX1NVRkZJWCk7CisJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsKXsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlhZGRTdXBlclR5cGVSZWZlcmVuY2UobW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBDTEFTU19TVUZGSVgsIHN1cGVyaW50ZXJmYWNlc1tpXSwgSU5URVJGQUNFX1NVRkZJWCk7CQkJCisJCX0KKwl9CisJCit9CitwdWJsaWMgdm9pZCBhZGRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKXsKKwkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdGhlIGNvbnN0cnVjdG9yCisJaW50IG51bWJlck9mQXJndW1lbnRzID0gMDsKKwlpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCl7CisJCW51bWJlck9mQXJndW1lbnRzID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQXJndW1lbnRzOyBpKyspeworCQkJdGhpcy5hZGRUeXBlUmVmZXJlbmNlKHBhcmFtZXRlclR5cGVzW2ldKTsKKwkJfQorCX0KKwkvL2NvbnZlcnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW50byBhIGNoYXIgYXJyYXkKKwljaGFyW10gY291bnRDaGFyczsKKwlpZiAobnVtYmVyT2ZBcmd1bWVudHMgPCAxMCkgeworCQljb3VudENoYXJzID0gQ09VTlRTW251bWJlck9mQXJndW1lbnRzXTsKKwl9IGVsc2UgeworCQljb3VudENoYXJzID0gU3RyaW5nLnZhbHVlT2YobnVtYmVyT2ZBcmd1bWVudHMpLnRvQ2hhckFycmF5KCk7CisJfQorCS8vYWRkIHRoZSByZWZlcmVuY2UKKwl0aGlzLm91dHB1dC5hZGRSZWYoY29uY2F0KENPTlNUUlVDVE9SX0RFQ0wsIENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodHlwZU5hbWUsJy4nKSwgY291bnRDaGFycywgU0VQQVJBVE9SKSk7CisKKwlpZiAoZXhjZXB0aW9uVHlwZXMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBleGNlcHRpb25UeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQl0aGlzLmFkZFR5cGVSZWZlcmVuY2UoZXhjZXB0aW9uVHlwZXNbaV0pOworCQl9CisJfQorfQorcHVibGljIHZvaWQgYWRkQ29uc3RydWN0b3JSZWZlcmVuY2UoY2hhcltdIHR5cGVOYW1lLCBpbnQgYXJnQ291bnQpeworCisJY2hhcltdIGNvdW50Q2hhcnM7CisJaWYgKGFyZ0NvdW50IDwgMTApIHsKKwkJY291bnRDaGFycyA9IENPVU5UU1thcmdDb3VudF07CisJfSBlbHNlIHsKKwkJY291bnRDaGFycyA9IFN0cmluZy52YWx1ZU9mKGFyZ0NvdW50KS50b0NoYXJBcnJheSgpOworCX0KKwl0aGlzLm91dHB1dC5hZGRSZWYoY29uY2F0KENPTlNUUlVDVE9SX1JFRiwgQ2hhck9wZXJhdGlvbi5sYXN0U2VnbWVudCh0eXBlTmFtZSwgJy4nKSwgY291bnRDaGFycywgU0VQQVJBVE9SKSk7CisJCit9CitwdWJsaWMgdm9pZCBhZGRGaWVsZERlY2xhcmF0aW9uKGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGZpZWxkTmFtZSl7CisJdGhpcy5vdXRwdXQuYWRkUmVmKENoYXJPcGVyYXRpb24uY29uY2F0KEZJRUxEX0RFQ0wsIGZpZWxkTmFtZSkpOworCXRoaXMuYWRkVHlwZVJlZmVyZW5jZSh0eXBlTmFtZSk7Cit9CitwdWJsaWMgdm9pZCBhZGRGaWVsZFJlZmVyZW5jZShjaGFyW10gZmllbGROYW1lKXsKKwl0aGlzLm91dHB1dC5hZGRSZWYoQ2hhck9wZXJhdGlvbi5jb25jYXQoRklFTERfUkVGLCBmaWVsZE5hbWUpKTsJCit9CitwdWJsaWMgdm9pZCBhZGRJbnRlcmZhY2VEZWNsYXJhdGlvbihpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcyl7CisKKwl0aGlzLm91dHB1dC5hZGRSZWYoZW5jb2RlVHlwZUVudHJ5KHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIG5hbWUsIGZhbHNlKSk7CisJCisJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsKXsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlhZGRTdXBlclR5cGVSZWZlcmVuY2UobW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBJTlRFUkZBQ0VfU1VGRklYLCBzdXBlcmludGVyZmFjZXNbaV0sIElOVEVSRkFDRV9TVUZGSVgpOwkJCQorCQl9CisJfQorCS8qIGlmIHdpbGxpbmcgdG8gY29ubmVjdCBpbnRlcmZhY2VzIHRvIE9iamVjdCBhcyBhIHN1cGVydHlwZSwgdGhlbiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyAKKwllbHNlIHsKKwkJYWRkU3VwZXJUeXBlUmVmZXJlbmNlKG1vZGlmaWVycywgcGFja2FnZU5hbWUsIG5hbWUsIElOVEVSRkFDRV9TVUZGSVgsIG51bGwsIENMQVNTX1NVRkZJWCk7IC8vIGV4dGVuZHMgT2JqZWN0IGJ5IGRlZmF1bHQKKwl9CisJKi8KK30KK3B1YmxpYyB2b2lkIGFkZE1ldGhvZERlY2xhcmF0aW9uKGNoYXJbXSBtZXRob2ROYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgY2hhcltdIHJldHVyblR5cGUsIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKXsKKwkvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorCWludCBudW1iZXJPZkFyZ3VtZW50cyA9IDA7CisJaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpeworCQludW1iZXJPZkFyZ3VtZW50cyA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkFyZ3VtZW50czsgaSsrKXsKKwkJCXRoaXMuYWRkVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXJUeXBlc1tpXSk7CisJCX0KKwl9CisJLy9jb252ZXJ0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGludG8gYSBjaGFyIGFycmF5CisJY2hhcltdIGNvdW50Q2hhcnM7CisJaWYgKG51bWJlck9mQXJndW1lbnRzIDwgMTApIHsKKwkJY291bnRDaGFycyA9IENPVU5UU1tudW1iZXJPZkFyZ3VtZW50c107CisJfSBlbHNlIHsKKwkJY291bnRDaGFycyA9IFN0cmluZy52YWx1ZU9mKG51bWJlck9mQXJndW1lbnRzKS50b0NoYXJBcnJheSgpOworCX0KKwkvL2FkZCB0aGUgcmVmZXJlbmNlCisJdGhpcy5vdXRwdXQuYWRkUmVmKGNvbmNhdChNRVRIT0RfREVDTCwgbWV0aG9kTmFtZSwgY291bnRDaGFycywgU0VQQVJBVE9SKSk7CisKKwlpZiAoZXhjZXB0aW9uVHlwZXMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBleGNlcHRpb25UeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQl0aGlzLmFkZFR5cGVSZWZlcmVuY2UoZXhjZXB0aW9uVHlwZXNbaV0pOworCQl9CisJfQorCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHRoaXMuYWRkVHlwZVJlZmVyZW5jZShyZXR1cm5UeXBlKTsKK30KK3B1YmxpYyB2b2lkIGFkZE1ldGhvZFJlZmVyZW5jZShjaGFyW10gbWV0aG9kTmFtZSwgaW50IGFyZ0NvdW50KXsKKwljaGFyW10gY291bnRDaGFyczsKKwlpZiAoYXJnQ291bnQgPCAxMCkgeworCQljb3VudENoYXJzID0gQ09VTlRTW2FyZ0NvdW50XTsKKwl9IGVsc2UgeworCQljb3VudENoYXJzID0gU3RyaW5nLnZhbHVlT2YoYXJnQ291bnQpLnRvQ2hhckFycmF5KCk7CisJfQorCXRoaXMub3V0cHV0LmFkZFJlZihjb25jYXQoTUVUSE9EX1JFRiwgbWV0aG9kTmFtZSwgY291bnRDaGFycywgU0VQQVJBVE9SKSk7CisJCit9CitwdWJsaWMgdm9pZCBhZGROYW1lUmVmZXJlbmNlKGNoYXJbXSBuYW1lKXsKKwl0aGlzLm91dHB1dC5hZGRSZWYoQ2hhck9wZXJhdGlvbi5jb25jYXQoUkVGLCBuYW1lKSk7Cit9Citwcml2YXRlIHZvaWQgYWRkU3VwZXJUeXBlUmVmZXJlbmNlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXIgY2xhc3NPckludGVyZmFjZSwgY2hhcltdIHN1cGVyVHlwZU5hbWUsIGNoYXIgc3VwZXJDbGFzc09ySW50ZXJmYWNlKXsKKworCWlmIChzdXBlclR5cGVOYW1lID09IG51bGwpIHN1cGVyVHlwZU5hbWUgPSBPQkpFQ1Q7CisKKwljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoZW5jbG9zaW5nVHlwZU5hbWVzLCAnJCcpOworCWNoYXJbXSB0eXBlU2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQodHlwZU5hbWUsICcuJyk7CisJY2hhcltdIHN1cGVyVHlwZVNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHN1cGVyVHlwZU5hbWUsICcuJyk7CisJY2hhcltdIHN1cGVyUXVhbGlmaWNhdGlvbjsKKwlpZiAoc3VwZXJUeXBlU2ltcGxlTmFtZSA9PSBzdXBlclR5cGVOYW1lKXsKKwkJc3VwZXJRdWFsaWZpY2F0aW9uID0gbnVsbDsKKwl9IGVsc2UgeworCQlpbnQgbGVuZ3RoID0gc3VwZXJUeXBlTmFtZS5sZW5ndGggLSBzdXBlclR5cGVTaW1wbGVOYW1lLmxlbmd0aCAtIDE7CisJCVN5c3RlbS5hcnJheWNvcHkoc3VwZXJUeXBlTmFtZSwgMCwgc3VwZXJRdWFsaWZpY2F0aW9uID0gbmV3IGNoYXJbbGVuZ3RoXSwgMCwgbGVuZ3RoKTsKKwl9CisJLy8gaWYgdGhlIHN1cGVydHlwZSBuYW1lIGNvbnRhaW5zIGEgJCwgdGhlbiBzcGxpdCBpdCBpbnRvOiBzb3VyY2UgbmFtZSBhbmQgYXBwZW5kIHRoZSAkIHByZWZpeCB0byB0aGUgcXVhbGlmaWNhdGlvbgorCS8vCWUuZy4gcC5BJEIgLS0tPiBwLkEkICsgQgorCWNoYXJbXSBzdXBlclR5cGVTb3VyY2VOYW1lID0gQ2hhck9wZXJhdGlvbi5sYXN0U2VnbWVudChzdXBlclR5cGVTaW1wbGVOYW1lLCAnJCcpOworCWlmIChzdXBlclR5cGVTb3VyY2VOYW1lICE9IHN1cGVyVHlwZVNpbXBsZU5hbWUpeworCQlpbnQgc3RhcnQgPSBzdXBlclF1YWxpZmljYXRpb24gPT0gbnVsbCA/IDAgOiBzdXBlclF1YWxpZmljYXRpb24ubGVuZ3RoKzE7CisJCWludCBwcmVmaXhMZW5ndGggPSBzdXBlclR5cGVTaW1wbGVOYW1lLmxlbmd0aCAtIHN1cGVyVHlwZVNvdXJjZU5hbWUubGVuZ3RoOworCQljaGFyW10gbWFuZ2xlZFF1YWxpZmljYXRpb24gPSBuZXcgY2hhcltzdGFydCArIHByZWZpeExlbmd0aF07CisJCWlmIChzdXBlclF1YWxpZmljYXRpb24gIT0gbnVsbCl7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyUXVhbGlmaWNhdGlvbiwgMCwgbWFuZ2xlZFF1YWxpZmljYXRpb24sIDAsIHN0YXJ0LTEpOworCQkJbWFuZ2xlZFF1YWxpZmljYXRpb25bc3RhcnQtMV0gPSAnLic7CisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShzdXBlclR5cGVTaW1wbGVOYW1lLCAwLCBtYW5nbGVkUXVhbGlmaWNhdGlvbiwgc3RhcnQsIHByZWZpeExlbmd0aCk7CisJCXN1cGVyUXVhbGlmaWNhdGlvbiA9IG1hbmdsZWRRdWFsaWZpY2F0aW9uOworCQlzdXBlclR5cGVTaW1wbGVOYW1lID0gc3VwZXJUeXBlU291cmNlTmFtZTsKKwl9IAorCXRoaXMub3V0cHV0LmFkZFJlZihjb25jYXQoU1VQRVJfUkVGLCBzdXBlclR5cGVTaW1wbGVOYW1lLCBzdXBlclF1YWxpZmljYXRpb24sIHN1cGVyQ2xhc3NPckludGVyZmFjZSwgdHlwZVNpbXBsZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lLCBwYWNrYWdlTmFtZSwgY2xhc3NPckludGVyZmFjZSwgKGNoYXIpbW9kaWZpZXJzLCBTRVBBUkFUT1IpKTsJCQorfQorcHVibGljIHZvaWQgYWRkVHlwZVJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUpeworCisJdGhpcy5vdXRwdXQuYWRkUmVmKENoYXJPcGVyYXRpb24uY29uY2F0KFRZUEVfUkVGLCBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHR5cGVOYW1lLCAnLicpKSk7Cit9CisvKioKKyAqIENvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGVudHJpZXMgYXJlIGVuY29kZWQgYXMgZm9sbG93OiAnY29uc3RydWN0b3JEZWNsLycgVHlwZU5hbWUgJy8nIEFyaXR5OgorICogCWUuZy4gJm5ic3A7Y29uc3RydWN0b3JEZWNsL1gvMCZuYnNwO2NvbnN0cnVjdG9yRGVjbC9ZLzEKKyAqCisgKi8KKyBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBiZXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvblByZWZpeChjaGFyW10gdHlwZU5hbWUsIGludCBhcml0eSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmICghaXNDYXNlU2Vuc2l0aXZlIHx8IHR5cGVOYW1lID09IG51bGwpIHJldHVybiBDT05TVFJVQ1RPUl9ERUNMOworCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCWlmIChhcml0eSA+PSAwKXsKKwkJCQljaGFyW10gY291bnRDaGFyczsKKwkJCQlpZiAoYXJpdHkgPCAxMCkgeworCQkJCQljb3VudENoYXJzID0gQ09VTlRTW2FyaXR5XTsKKwkJCQl9IGVsc2UgeworCQkJCQljb3VudENoYXJzID0gU3RyaW5nLnZhbHVlT2YoYXJpdHkpLnRvQ2hhckFycmF5KCk7CisJCQkJfQorCQkJCXJldHVybiBjb25jYXQoQ09OU1RSVUNUT1JfREVDTCwgdHlwZU5hbWUsIGNvdW50Q2hhcnMsIFNFUEFSQVRPUik7CisJCQl9CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChDT05TVFJVQ1RPUl9ERUNMLCB0eXBlTmFtZSk7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlpbnQgc3RhclBvcyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKicsIHR5cGVOYW1lKTsKKwkJCXN3aXRjaChzdGFyUG9zKSB7CisJCQkJY2FzZSAtMSA6CisJCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChDT05TVFJVQ1RPUl9ERUNMLCB0eXBlTmFtZSk7CisJCQkJZGVmYXVsdCA6IAorCQkJCQlpbnQgcmVmTGVuZ3RoID0gQ09OU1RSVUNUT1JfREVDTC5sZW5ndGg7CisJCQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZWZMZW5ndGgrc3RhclBvc107CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoQ09OU1RSVUNUT1JfREVDTCwgMCwgcmVzdWx0LCAwLCByZWZMZW5ndGgpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVOYW1lLCAwLCByZXN1bHQsIHJlZkxlbmd0aCwgc3RhclBvcyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSAwIDogLy8gZmFsbCB0aHJvdWdoCisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gQ09OU1RSVUNUT1JfREVDTDsKKwl9Cit9CisvKioKKyAqIENvbnN0cnVjdG9yIHJlZmVyZW5jZSBlbnRyaWVzIGFyZSBlbmNvZGVkIGFzIGZvbGxvdzogJ2NvbnN0cnVjdG9yUmVmLycgVHlwZU5hbWUgJy8nIEFyaXR5OgorICogCWUuZy4mbmJzcDtjb25zdHJ1Y3RvclJlZi9YLzAmbmJzcDtjb25zdHJ1Y3RvclJlZi9ZLzEKKyAqCisgKi8KKyBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBiZXN0Q29uc3RydWN0b3JSZWZlcmVuY2VQcmVmaXgoY2hhcltdIHR5cGVOYW1lLCBpbnQgYXJpdHksIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlpZiAoIWlzQ2FzZVNlbnNpdGl2ZSB8fCB0eXBlTmFtZSA9PSBudWxsKSByZXR1cm4gQ09OU1RSVUNUT1JfUkVGOworCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCWlmIChhcml0eSA+PSAwKXsKKwkJCQljaGFyW10gY291bnRDaGFyczsKKwkJCQlpZiAoYXJpdHkgPCAxMCkgeworCQkJCQljb3VudENoYXJzID0gQ09VTlRTW2FyaXR5XTsKKwkJCQl9IGVsc2UgeworCQkJCQljb3VudENoYXJzID0gU3RyaW5nLnZhbHVlT2YoYXJpdHkpLnRvQ2hhckFycmF5KCk7CisJCQkJfQorCQkJCXJldHVybiBjb25jYXQoQ09OU1RSVUNUT1JfUkVGLCB0eXBlTmFtZSwgY291bnRDaGFycywgU0VQQVJBVE9SKTsKKwkJCX0KKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KENPTlNUUlVDVE9SX1JFRiwgdHlwZU5hbWUpOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJaW50IHN0YXJQb3MgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyonLCB0eXBlTmFtZSk7CisJCQlzd2l0Y2goc3RhclBvcykgeworCQkJCWNhc2UgLTEgOgorCQkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ09OU1RSVUNUT1JfUkVGLCB0eXBlTmFtZSk7CisJCQkJZGVmYXVsdCA6IAorCQkJCQlpbnQgcmVmTGVuZ3RoID0gQ09OU1RSVUNUT1JfUkVGLmxlbmd0aDsKKwkJCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3JlZkxlbmd0aCtzdGFyUG9zXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShDT05TVFJVQ1RPUl9SRUYsIDAsIHJlc3VsdCwgMCwgcmVmTGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZSwgMCwgcmVzdWx0LCByZWZMZW5ndGgsIHN0YXJQb3MpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCWNhc2UgMCA6IC8vIGZhbGwgdGhyb3VnaAorCQkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIENPTlNUUlVDVE9SX1JFRjsKKwl9Cit9CisvKioKKyAqIE1ldGhvZCBkZWNsYXJhdGlvbiBlbnRyaWVzIGFyZSBlbmNvZGVkIGFzIGZvbGxvdzogJ2ZpZWxkRGVjbC8nIE5hbWUKKyAqIAllLmcuJm5ic3A7ZmllbGREZWNsL3gKKyAqCisgKi8KKyBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBiZXN0RmllbGREZWNsYXJhdGlvblByZWZpeChjaGFyW10gbmFtZSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmICghaXNDYXNlU2Vuc2l0aXZlIHx8IG5hbWUgPT0gbnVsbCkgcmV0dXJuIEZJRUxEX0RFQ0w7CisJc3dpdGNoKG1hdGNoTW9kZSl7CisJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoRklFTERfREVDTCwgbmFtZSk7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlpbnQgc3RhclBvcyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKicsIG5hbWUpOworCQkJc3dpdGNoKHN0YXJQb3MpIHsKKwkJCQljYXNlIC0xIDoKKwkJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KEZJRUxEX0RFQ0wsIG5hbWUpOworCQkJCWRlZmF1bHQgOiAKKwkJCQkJaW50IHJlZkxlbmd0aCA9IEZJRUxEX0RFQ0wubGVuZ3RoOworCQkJCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbcmVmTGVuZ3RoK3N0YXJQb3NdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KEZJRUxEX0RFQ0wsIDAsIHJlc3VsdCwgMCwgcmVmTGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCByZXN1bHQsIHJlZkxlbmd0aCwgc3RhclBvcyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSAwIDogLy8gZmFsbCB0aHJvdWdoCisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRklFTERfREVDTDsKKwl9Cit9CisvKioKKyAqIE1ldGhvZCBkZWNsYXJhdGlvbiBlbnRyaWVzIGFyZSBlbmNvZGVkIGFzIGZvbGxvdzogJ21ldGhvZERlY2wvJyBTZWxlY3RvciAnLycgQXJpdHkKKyAqIAllLmcuJm5ic3A7bWV0aG9kRGVjbC9jbG9uZS8wJm5ic3A7bWV0aG9kRGVjbC9hcHBlbmQvMQorICoKKyAqLworIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGJlc3RNZXRob2REZWNsYXJhdGlvblByZWZpeChjaGFyW10gc2VsZWN0b3IsIGludCBhcml0eSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmICghaXNDYXNlU2Vuc2l0aXZlIHx8IHNlbGVjdG9yID09IG51bGwpIHJldHVybiBNRVRIT0RfREVDTDsKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQlpZiAoYXJpdHkgPj0gMCl7CisJCQkJY2hhcltdIGNvdW50Q2hhcnM7CisJCQkJaWYgKGFyaXR5IDwgMTApIHsKKwkJCQkJY291bnRDaGFycyA9IENPVU5UU1thcml0eV07CisJCQkJfSBlbHNlIHsKKwkJCQkJY291bnRDaGFycyA9IFN0cmluZy52YWx1ZU9mKGFyaXR5KS50b0NoYXJBcnJheSgpOworCQkJCX0KKwkJCQlyZXR1cm4gY29uY2F0KE1FVEhPRF9ERUNMLCBzZWxlY3RvciwgY291bnRDaGFycywgU0VQQVJBVE9SKTsKKwkJCX0KKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KE1FVEhPRF9ERUNMLCBzZWxlY3Rvcik7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlpbnQgc3RhclBvcyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKicsIHNlbGVjdG9yKTsKKwkJCXN3aXRjaChzdGFyUG9zKSB7CisJCQkJY2FzZSAtMSA6CisJCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChNRVRIT0RfREVDTCwgc2VsZWN0b3IpOworCQkJCWRlZmF1bHQgOiAKKwkJCQkJaW50IHJlZkxlbmd0aCA9IE1FVEhPRF9ERUNMLmxlbmd0aDsKKwkJCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3JlZkxlbmd0aCtzdGFyUG9zXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShNRVRIT0RfREVDTCwgMCwgcmVzdWx0LCAwLCByZWZMZW5ndGgpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNlbGVjdG9yLCAwLCByZXN1bHQsIHJlZkxlbmd0aCwgc3RhclBvcyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSAwIDogLy8gZmFsbCB0aHJvdWdoCisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTUVUSE9EX0RFQ0w7CisJfQorfQorLyoqCisgKiBNZXRob2QgcmVmZXJlbmNlIGVudHJpZXMgYXJlIGVuY29kZWQgYXMgZm9sbG93OiAnbWV0aG9kUmVmLycgU2VsZWN0b3IgJy8nIEFyaXR5CisgKiAJZS5nLiZuYnNwO21ldGhvZFJlZi9jbG9uZS8wJm5ic3A7bWV0aG9kUmVmL2FwcGVuZC8xCisgKgorICovCisgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gYmVzdE1ldGhvZFJlZmVyZW5jZVByZWZpeChjaGFyW10gc2VsZWN0b3IsIGludCBhcml0eSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmICghaXNDYXNlU2Vuc2l0aXZlIHx8IHNlbGVjdG9yID09IG51bGwpIHJldHVybiBNRVRIT0RfUkVGOworCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCWlmIChhcml0eSA+PSAwKXsKKwkJCQljaGFyW10gY291bnRDaGFyczsKKwkJCQlpZiAoYXJpdHkgPCAxMCkgeworCQkJCQljb3VudENoYXJzID0gQ09VTlRTW2FyaXR5XTsKKwkJCQl9IGVsc2UgeworCQkJCQljb3VudENoYXJzID0gU3RyaW5nLnZhbHVlT2YoYXJpdHkpLnRvQ2hhckFycmF5KCk7CisJCQkJfQorCQkJCXJldHVybiBjb25jYXQoTUVUSE9EX1JFRiwgc2VsZWN0b3IsIGNvdW50Q2hhcnMsIFNFUEFSQVRPUik7CisJCQl9CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChNRVRIT0RfUkVGLCBzZWxlY3Rvcik7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlpbnQgc3RhclBvcyA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKicsIHNlbGVjdG9yKTsKKwkJCXN3aXRjaChzdGFyUG9zKSB7CisJCQkJY2FzZSAtMSA6CisJCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChNRVRIT0RfUkVGLCBzZWxlY3Rvcik7CisJCQkJZGVmYXVsdCA6IAorCQkJCQlpbnQgcmVmTGVuZ3RoID0gTUVUSE9EX1JFRi5sZW5ndGg7CisJCQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZWZMZW5ndGgrc3RhclBvc107CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoTUVUSE9EX1JFRiwgMCwgcmVzdWx0LCAwLCByZWZMZW5ndGgpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNlbGVjdG9yLCAwLCByZXN1bHQsIHJlZkxlbmd0aCwgc3RhclBvcyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJY2FzZSAwIDogLy8gZmFsbCB0aHJvdWdoCisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTUVUSE9EX1JFRjsKKwl9Cit9CisvKioKKyAqIFR5cGUgZW50cmllcyBhcmUgZW5jb2RlZCBhcyBmb2xsb3c6ICc8dGFnPi8nIE5hbWUgCisgKiAJZS5nLiZuYnNwO3JlZi9PYmplY3QmbmJzcDtyZWYveAorICovCisgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gYmVzdFJlZmVyZW5jZVByZWZpeChjaGFyW10gdGFnLCBjaGFyW10gbmFtZSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmICghaXNDYXNlU2Vuc2l0aXZlIHx8IG5hbWUgPT0gbnVsbCkgcmV0dXJuIHRhZzsKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0YWcsIG5hbWUpOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJaW50IHN0YXJQb3MgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyonLCBuYW1lKTsKKwkJCXN3aXRjaChzdGFyUG9zKSB7CisJCQkJY2FzZSAtMSA6CisJCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0YWcsIG5hbWUpOworCQkJCWRlZmF1bHQgOiAKKwkJCQkJaW50IHJlZkxlbmd0aCA9IHRhZy5sZW5ndGg7CisJCQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZWZMZW5ndGgrc3RhclBvc107CisJCQkJCVN5c3RlbS5hcnJheWNvcHkodGFnLCAwLCByZXN1bHQsIDAsIHJlZkxlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkobmFtZSwgMCwgcmVzdWx0LCByZWZMZW5ndGgsIHN0YXJQb3MpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCWNhc2UgMCA6IC8vIGZhbGwgdGhyb3VnaAorCQkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHRhZzsKKwl9Cit9CisvKioKKyAqIFR5cGUgZW50cmllcyBhcmUgZW5jb2RlZCBhcyBmb2xsb3c6ICd0eXBlRGVjbC8nICgnQycgfCAnSScpICcvJyBQYWNrYWdlTmFtZSAnLycgVHlwZU5hbWU6CisgKiAJZS5nLiZuYnNwO3R5cGVEZWNsL0MvamF2YS5sYW5nL09iamVjdCZuYnNwO3R5cGVEZWNsL0kvamF2YS5sYW5nL0Nsb25lYWJsZQorICoKKyAqIEN1cnJlbnQgZW5jb2RpbmcgaXMgb3B0aW1pemVkIGZvciBxdWVyaWVzOiBhbGwgY2xhc3Nlcy9pbnRlcmZhY2VzCisgKi8KKyBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBiZXN0VHlwZURlY2xhcmF0aW9uUHJlZml4KGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyIGNsYXNzT3JJbnRlcmZhY2UsIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJLy8gaW5kZXggaXMgY2FzZSBzZW5zaXRpdmUsIHRodXMgaW4gY2FzZSBhdHRlbXB0aW5nIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoLCBjYW5ub3QgY29uc2lkZXIKKwkvLyB0eXBlIG5hbWUuCisJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpeworCQlwYWNrYWdlTmFtZSA9IG51bGw7CisJCXR5cGVOYW1lID0gbnVsbDsKKwl9CisJc3dpdGNoKGNsYXNzT3JJbnRlcmZhY2UpeyAKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gVFlQRV9ERUNMOyAvLyBjYW5ub3QgZG8gYmV0dGVyIGdpdmVuIGVuY29kaW5nCisJCWNhc2UgQ0xBU1NfU1VGRklYIDoKKwkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSByZXR1cm4gQ0xBU1NfREVDTDsKKwkJCWJyZWFrOworCQljYXNlIElOVEVSRkFDRV9TVUZGSVggOgorCQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHJldHVybiBJTlRFUkZBQ0VfREVDTDsKKwkJCWJyZWFrOworCX0KKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJaWYgKHR5cGVOYW1lICE9IG51bGwpeworCQkJCWludCBzdGFyUG9zID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcqJywgdHlwZU5hbWUpOworCQkJCXN3aXRjaChzdGFyUG9zKSB7CisJCQkJCWNhc2UgLTEgOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMCA6CisJCQkJCQl0eXBlTmFtZSA9IG51bGw7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6IAorCQkJCQkJdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVOYW1lLCAwLCBzdGFyUG9zKTsKKwkJCQl9CisJCQl9CisJfQorCWludCBwYWNrYWdlTGVuZ3RoID0gcGFja2FnZU5hbWUubGVuZ3RoOworCWludCB0eXBlTGVuZ3RoID0gdHlwZU5hbWUgPT0gbnVsbCA/IDAgOiB0eXBlTmFtZS5sZW5ndGg7CisJaW50IHBvczsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbVFlQRV9ERUNMX0xFTkdUSCArIHBhY2thZ2VMZW5ndGggKyB0eXBlTGVuZ3RoICsgM107CisJU3lzdGVtLmFycmF5Y29weShUWVBFX0RFQ0wsIDAsIHJlc3VsdCwgMCwgcG9zID0gVFlQRV9ERUNMX0xFTkdUSCk7CisJcmVzdWx0W3BvcysrXSA9IGNsYXNzT3JJbnRlcmZhY2U7CisJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwlTeXN0ZW0uYXJyYXljb3B5KHBhY2thZ2VOYW1lLCAwLCByZXN1bHQsIHBvcywgcGFja2FnZUxlbmd0aCk7CisJcG9zICs9IHBhY2thZ2VMZW5ndGg7CisJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwlpZiAodHlwZUxlbmd0aCA+IDApeworCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVOYW1lLCAwLCByZXN1bHQsIHBvcywgdHlwZU5hbWUubGVuZ3RoKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogQ29uY2F0KGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3VydGgsIGZpZnRoLCBzZXApIC0tPiBbZmlyc3RdW3NlY29uZF1bc2VwXVt0aGlyZF1bc2VwXVtmb3VydGhdW3NlcF1bZmlmdGhdCisgKiBpLmUuIG5vIHNlcGFyYXRvciBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGZpcnN0IGFuZCBzZWNvbmQKKyAqLworcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdFdpdGhTZXBhcmF0b3IsIGNoYXJbXSBzZWNvbmQsIGNoYXJbXSB0aGlyZCwgY2hhcltdIGZvdXJ0aCwgY2hhcltdIGZpZnRoLCBjaGFyIHNlcGFyYXRvcikgeworCWludCBsZW5ndGgxPSBmaXJzdFdpdGhTZXBhcmF0b3IubGVuZ3RoOworCWludCBsZW5ndGgyPSBzZWNvbmQgPT0gbnVsbCA/IDAgOiBzZWNvbmQubGVuZ3RoOworCWludCBsZW5ndGgzPSB0aGlyZCA9PSBudWxsID8gMCA6IHRoaXJkLmxlbmd0aDsKKwlpbnQgbGVuZ3RoND0gZm91cnRoID09IG51bGwgPyAwIDogZm91cnRoLmxlbmd0aDsKKwlpbnQgbGVuZ3RoNT0gZmlmdGggPT0gbnVsbCA/IDAgOiBmaWZ0aC5sZW5ndGg7CisJY2hhcltdIHJlc3VsdD0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsgbGVuZ3RoNCArIGxlbmd0aDUgKyAzIF07CisJU3lzdGVtLmFycmF5Y29weShmaXJzdFdpdGhTZXBhcmF0b3IsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7CisJaWYgKHNlY29uZCAhPSBudWxsKSBTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxICwgbGVuZ3RoMik7CisJaW50IHBvcyA9IGxlbmd0aDEgKyBsZW5ndGgyOworCXJlc3VsdFtwb3NdPSBzZXBhcmF0b3I7CisJaWYgKHRoaXJkICE9IG51bGwpIFN5c3RlbS5hcnJheWNvcHkodGhpcmQsIDAsIHJlc3VsdCwgcG9zICsgMSwgbGVuZ3RoMyk7CisJcG9zICs9IGxlbmd0aDMrMTsKKwlyZXN1bHRbcG9zXT0gc2VwYXJhdG9yOworCWlmIChmb3VydGggIT0gbnVsbCkgU3lzdGVtLmFycmF5Y29weShmb3VydGgsIDAsIHJlc3VsdCwgcG9zICsgMSwgbGVuZ3RoNCk7CisJcG9zICs9IGxlbmd0aDQrMTsKKwlyZXN1bHRbcG9zXT0gc2VwYXJhdG9yOworCWlmIChmaWZ0aCAhPSBudWxsKSBTeXN0ZW0uYXJyYXljb3B5KGZpZnRoLCAwLCByZXN1bHQsIHBvcyArIDEsIGxlbmd0aDUpOworCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIENvbmNhdChmaXJzdCwgc2Vjb25kLCB0aGlyZCwgc2VwKSAtLT4gW2ZpcnN0XVtzZWNvbmRdW3NlcF1bdGhpcmRdCisgKiBpLmUuIG5vIHNlcGFyYXRvciBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGZpcnN0IGFuZCBzZWNvbmQKKyAqLworcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdFdpdGhTZXBhcmF0b3IsIGNoYXJbXSBzZWNvbmQsIGNoYXJbXSB0aGlyZCwgY2hhciBzZXBhcmF0b3IpIHsKKwlpbnQgbGVuZ3RoMT0gZmlyc3RXaXRoU2VwYXJhdG9yLmxlbmd0aDsKKwlpbnQgbGVuZ3RoMj0gc2Vjb25kID09IG51bGwgPyAwIDogc2Vjb25kLmxlbmd0aDsKKwlpbnQgbGVuZ3RoMz0gdGhpcmQgPT0gbnVsbCA/IDAgOiB0aGlyZC5sZW5ndGg7CisJY2hhcltdIHJlc3VsdD0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsgMV07CisJU3lzdGVtLmFycmF5Y29weShmaXJzdFdpdGhTZXBhcmF0b3IsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7CisJaWYgKHNlY29uZCAhPSBudWxsKSBTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxICwgbGVuZ3RoMik7CisJcmVzdWx0W2xlbmd0aDEgKyBsZW5ndGgyXT0gc2VwYXJhdG9yOworCWlmICh0aGlyZCAhPSBudWxsKSBTeXN0ZW0uYXJyYXljb3B5KHRoaXJkLCAwLCByZXN1bHQsIGxlbmd0aDEgKyBsZW5ndGgyICsgMSwgbGVuZ3RoMyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogQ29uY2F0KGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBjaGFyQWZ0ZXJUaGlyZCwgZm91cnRoLCBmaWZ0aCwgc2l4dGgsIGNoYXJBZnRlclNpeHRoLCBsYXN0LCBzZXApIC0tPiBbZmlyc3RdW3NlY29uZF1bc2VwXVt0aGlyZF1bc2VwXVtjaGFyQWZ0ZXJUaGlyZF1bc2VwXVtmb3VydGhdW3NlcF1bZmlmdGhdW3NlcF1bc2l4dGhdW3NlcF1bY2hhckFmdGVyU2l4dGhdW2xhc3RdCisgKiBpLmUuIG5vIHNlcGFyYXRvciBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGZpcnN0IGFuZCBzZWNvbmQKKyAqLworcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXJbXSBmaXJzdFdpdGhTZXBhcmF0b3IsIGNoYXJbXSBzZWNvbmQsIGNoYXJbXSB0aGlyZCwgY2hhciBjaGFyQWZ0ZXJUaGlyZCwgY2hhcltdIGZvdXJ0aCwgY2hhcltdIGZpZnRoLCBjaGFyW10gc2l4dGgsIGNoYXIgY2hhckFmdGVyU2l4dGgsIGNoYXIgbGFzdCwgY2hhciBzZXBhcmF0b3IpIHsKKwlpbnQgbGVuZ3RoMT0gZmlyc3RXaXRoU2VwYXJhdG9yLmxlbmd0aDsKKwlpbnQgbGVuZ3RoMj0gc2Vjb25kID09IG51bGwgPyAwIDogc2Vjb25kLmxlbmd0aDsKKwlpbnQgbGVuZ3RoMz0gdGhpcmQgPT0gbnVsbCA/IDAgOiB0aGlyZC5sZW5ndGg7CisJaW50IGxlbmd0aDQ9IGZvdXJ0aCA9PSBudWxsID8gMCA6IGZvdXJ0aC5sZW5ndGg7CisJaW50IGxlbmd0aDU9IGZpZnRoID09IG51bGwgPyAwIDogZmlmdGgubGVuZ3RoOworCWludCBsZW5ndGg2ID0gc2l4dGggPT0gbnVsbCA/IDAgOiBzaXh0aC5sZW5ndGg7CisJY2hhcltdIHJlc3VsdD0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsgbGVuZ3RoNCArIGxlbmd0aDUgKyBsZW5ndGg2ICsgOSBdOworCVN5c3RlbS5hcnJheWNvcHkoZmlyc3RXaXRoU2VwYXJhdG9yLCAwLCByZXN1bHQsIDAsIGxlbmd0aDEpOworCWlmIChzZWNvbmQgIT0gbnVsbCkgU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSAsIGxlbmd0aDIpOworCWludCBwb3MgPSBsZW5ndGgxICsgbGVuZ3RoMjsKKwlyZXN1bHRbcG9zXT0gc2VwYXJhdG9yOworCWlmICh0aGlyZCAhPSBudWxsKSBTeXN0ZW0uYXJyYXljb3B5KHRoaXJkLCAwLCByZXN1bHQsIHBvcyArIDEsIGxlbmd0aDMpOworCXBvcyArPSBsZW5ndGgzKzE7CisJcmVzdWx0W3Bvc109IHNlcGFyYXRvcjsKKwlyZXN1bHRbKytwb3NdID0gY2hhckFmdGVyVGhpcmQ7CisJcmVzdWx0WysrcG9zXSA9IHNlcGFyYXRvcjsKKwlpZiAoZm91cnRoICE9IG51bGwpIFN5c3RlbS5hcnJheWNvcHkoZm91cnRoLCAwLCByZXN1bHQsIHBvcyArIDEsIGxlbmd0aDQpOworCXBvcyArPSBsZW5ndGg0KzE7CisJcmVzdWx0W3Bvc109IHNlcGFyYXRvcjsKKwlpZiAoZmlmdGggIT0gbnVsbCkgU3lzdGVtLmFycmF5Y29weShmaWZ0aCwgMCwgcmVzdWx0LCBwb3MgKyAxLCBsZW5ndGg1KTsKKwlwb3MgKz0gbGVuZ3RoNSsxOworCXJlc3VsdFtwb3NdPSBzZXBhcmF0b3I7CisJaWYgKHNpeHRoICE9IG51bGwpIFN5c3RlbS5hcnJheWNvcHkoc2l4dGgsIDAsIHJlc3VsdCwgcG9zICsgMSwgbGVuZ3RoNik7CisJcG9zICs9IGxlbmd0aDYrMTsKKwlyZXN1bHRbcG9zXT0gc2VwYXJhdG9yOworCXJlc3VsdFsrK3Bvc10gPSBjaGFyQWZ0ZXJTaXh0aDsKKwlyZXN1bHRbKytwb3NdPWxhc3Q7CisJcmV0dXJuIHJlc3VsdDsKK30KKy8qKgorICogVHlwZSBlbnRyaWVzIGFyZSBlbmNvZGVkIGFzIGZvbGxvdzogJ3R5cGVEZWNsLycgKCdDJyB8ICdJJykgJy8nIFBhY2thZ2VOYW1lICcvJyBUeXBlTmFtZSAnLycgRW5jbG9zaW5nVHlwZU5hbWUKKyAqIAllLmcuPHVsPgorICogCTxsaT50eXBlRGVjbC9DL2phdmEubGFuZy9PYmplY3QvPC9saT4KKyAqCTxsaT50eXBlRGVjbC9JL2phdmEubGFuZy9DbG9uZWFibGUvPC9saT4KKyAqCTxsaT50eXBlRGVjbC9DL2phdmF4LnN3aW5nL0xhenlWYWx1ZS9VSURlZmF1bHRzPC9saT4KKyAqIEN1cnJlbnQgZW5jb2RpbmcgaXMgb3B0aW1pemVkIGZvciBxdWVyaWVzOiBhbGwgY2xhc3Nlcy9pbnRlcmZhY2VzCisgKi8KKyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBlbmNvZGVUeXBlRW50cnkoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXSB0eXBlTmFtZSwgYm9vbGVhbiBpc0NsYXNzKSB7CisJaW50IHBhY2thZ2VMZW5ndGggPSBwYWNrYWdlTmFtZSA9PSBudWxsID8gMCA6IHBhY2thZ2VOYW1lLmxlbmd0aDsKKwlpbnQgZW5jbG9zaW5nVHlwZU5hbWVzTGVuZ3RoID0gMDsKKwlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQllbmNsb3NpbmdUeXBlTmFtZXNMZW5ndGggKz0gZW5jbG9zaW5nVHlwZU5hbWVzW2ldLmxlbmd0aCArIDE7CisJCX0KKwl9CisJaW50IHBvczsKKwljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbVFlQRV9ERUNMX0xFTkdUSCArIHBhY2thZ2VMZW5ndGggKyB0eXBlTmFtZS5sZW5ndGggKyBlbmNsb3NpbmdUeXBlTmFtZXNMZW5ndGggKyA0XTsKKwlTeXN0ZW0uYXJyYXljb3B5KFRZUEVfREVDTCwgMCwgcmVzdWx0LCAwLCBwb3MgPSBUWVBFX0RFQ0xfTEVOR1RIKTsKKwlyZXN1bHRbcG9zKytdID0gaXNDbGFzcyA/IENMQVNTX1NVRkZJWCA6IElOVEVSRkFDRV9TVUZGSVg7CisJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCl7CisJCVN5c3RlbS5hcnJheWNvcHkocGFja2FnZU5hbWUsIDAsIHJlc3VsdCwgcG9zLCBwYWNrYWdlTGVuZ3RoKTsKKwkJcG9zICs9IHBhY2thZ2VMZW5ndGg7CisJfQorCXJlc3VsdFtwb3MrK10gPSBTRVBBUkFUT1I7CisJU3lzdGVtLmFycmF5Y29weSh0eXBlTmFtZSwgMCwgcmVzdWx0LCBwb3MsIHR5cGVOYW1lLmxlbmd0aCk7CisJcG9zICs9IHR5cGVOYW1lLmxlbmd0aDsKKwlyZXN1bHRbcG9zKytdID0gU0VQQVJBVE9SOworCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspeworCQkJaW50IGVuY2xvc2luZ1R5cGVOYW1lTGVuZ3RoID0gZW5jbG9zaW5nVHlwZU5hbWVzW2ldLmxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZW5jbG9zaW5nVHlwZU5hbWVzW2ldLCAwLCByZXN1bHQsIHBvcywgZW5jbG9zaW5nVHlwZU5hbWVMZW5ndGgpOworCQkJcG9zICs9IGVuY2xvc2luZ1R5cGVOYW1lTGVuZ3RoOworCQkJcmVzdWx0W3BvcysrXSA9IFNFUEFSQVRPUjsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBmaWxlIHR5cGVzIHRoZSA8Y29kZT5JSW5kZXhlcjwvY29kZT4gaGFuZGxlcy4KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RmlsZVR5cGVzKCk7CisvKioKKyAqIEBzZWUgSUluZGV4ZXIjaW5kZXgoSURvY3VtZW50IGRvY3VtZW50LCBJSW5kZXhlck91dHB1dCBvdXRwdXQpCisgKi8KK3B1YmxpYyB2b2lkIGluZGV4KElEb2N1bWVudCBkb2N1bWVudCwgSUluZGV4ZXJPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMub3V0cHV0ID0gb3V0cHV0OworCWlmIChzaG91bGRJbmRleChkb2N1bWVudCkpIGluZGV4RmlsZShkb2N1bWVudCk7Cit9Citwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbmRleEZpbGUoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb247CisvKioKKyAqIEBzZWUgSUluZGV4ZXIjc2hvdWxkSW5kZXgoSURvY3VtZW50IGRvY3VtZW50KQorICovCitwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRleChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwlTdHJpbmcgdHlwZSA9IGRvY3VtZW50LmdldFR5cGUoKTsKKwlTdHJpbmdbXSBzdXBwb3J0ZWRUeXBlcyA9IHRoaXMuZ2V0RmlsZVR5cGVzKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBwb3J0ZWRUeXBlcy5sZW5ndGg7ICsraSkgeworCQlpZiAoc3VwcG9ydGVkVHlwZXNbaV0uZXF1YWxzKHR5cGUpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDbGFzc0ZpbGVUb0luZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNzRjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSUZpbGVEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworCitjbGFzcyBBZGRDbGFzc0ZpbGVUb0luZGV4IGV4dGVuZHMgSW5kZXhSZXF1ZXN0IHsKKwlJRmlsZSByZXNvdXJjZTsKKwlJbmRleE1hbmFnZXIgbWFuYWdlcjsKKwlJUGF0aCBpbmRleGVkQ29udGFpbmVyOworCWJ5dGVbXSBjb250ZW50czsKKwlwdWJsaWMgQWRkQ2xhc3NGaWxlVG9JbmRleCgKKwkJSUZpbGUgcmVzb3VyY2UsCisJCUluZGV4TWFuYWdlciBtYW5hZ2VyLAorCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyKSB7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKwkJdGhpcy5pbmRleGVkQ29udGFpbmVyID0gaW5kZXhlZENvbnRhaW5lcjsKKwl9CisJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKFN0cmluZyBqb2JGYW1pbHkpIHsKKwkJcmV0dXJuIGpvYkZhbWlseS5lcXVhbHModGhpcy5pbmRleGVkQ29udGFpbmVyLnNlZ21lbnQoMCkpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCQorCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOworCQkKKwkJdHJ5IHsKKwkJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleGVkQ29udGFpbmVyLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCQkvKiBlbnN1cmUgbm8gY29uY3VycmVudCB3cml0ZSBhY2Nlc3MgdG8gaW5kZXggKi8KKwkJCWlmIChpbmRleCA9PSBudWxsKQorCQkJCXJldHVybiBDT01QTEVURTsKKwkJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJCXJldHVybiBDT01QTEVURTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKwkJCXRyeSB7CisJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQkJYnl0ZVtdIGNvbnRlbnRzID0gdGhpcy5nZXRDb250ZW50cygpOworCQkJCWlmIChjb250ZW50cyA9PSBudWxsKQorCQkJCQlyZXR1cm4gRkFJTEVEOworCQkJCWluZGV4LmFkZChuZXcgSUZpbGVEb2N1bWVudChyZXNvdXJjZSwgY29udGVudHMpLCBuZXcgQmluYXJ5SW5kZXhlcih0cnVlKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCW1vbml0b3IuZXhpdFdyaXRlKCk7IC8vIGZyZWUgd3JpdGUgbG9jaworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMucmVzb3VyY2UgKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJCXJldHVybiBDT01QTEVURTsKKwl9CisJcHJpdmF0ZSBieXRlW10gZ2V0Q29udGVudHMoKSB7CisJCWlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpCisJCQl0aGlzLmluaXRpYWxpemVDb250ZW50cygpOworCQlyZXR1cm4gdGhpcy5jb250ZW50czsKKwl9CisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgeworCQl0cnkgeworCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmNvbnRlbnRzID0KKwkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQoCisJCQkJCQlyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl9CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiaW5kZXhpbmcgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDb21waWxhdGlvblVuaXRUb0luZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzVhNmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDb21waWxhdGlvblVuaXRUb0luZGV4LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JRmlsZURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CisKK2NsYXNzIEFkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXggZXh0ZW5kcyBJbmRleFJlcXVlc3QgeworCUlGaWxlIHJlc291cmNlOworCUluZGV4TWFuYWdlciBtYW5hZ2VyOworCUlQYXRoIGluZGV4ZWRDb250YWluZXI7CisJY2hhcltdIGNvbnRlbnRzOworCXB1YmxpYyBBZGRDb21waWxhdGlvblVuaXRUb0luZGV4KAorCQlJRmlsZSByZXNvdXJjZSwKKwkJSW5kZXhNYW5hZ2VyIG1hbmFnZXIsCisJCUlQYXRoIGluZGV4ZWRDb250YWluZXIpIHsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCQl0aGlzLmluZGV4ZWRDb250YWluZXIgPSBpbmRleGVkQ29udGFpbmVyOworCX0KKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgeworCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyh0aGlzLmluZGV4ZWRDb250YWluZXIuc2VnbWVudCgwKSk7CisJfQorCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOworCQl0cnkgeworCQkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4ZWRDb250YWluZXIsIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKKworCQkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCisJCQlpZiAoaW5kZXggPT0gbnVsbCkKKwkJCQlyZXR1cm4gQ09NUExFVEU7CisJCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKKwkJCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJCQl0cnkgeworCQkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQorCQkJCWNoYXJbXSBjb250ZW50cyA9IHRoaXMuZ2V0Q29udGVudHMoKTsKKwkJCQlpZiAoY29udGVudHMgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQlpbmRleC5hZGQobmV3IElGaWxlRG9jdW1lbnQocmVzb3VyY2UsIGNvbnRlbnRzKSwgbmV3IFNvdXJjZUluZGV4ZXIoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCW1vbml0b3IuZXhpdFdyaXRlKCk7IC8vIGZyZWUgd3JpdGUgbG9jaworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMucmVzb3VyY2UgKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJCXJldHVybiBDT01QTEVURTsKKwl9CisJcHJpdmF0ZSBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJCWlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpCisJCQl0aGlzLmluaXRpYWxpemVDb250ZW50cygpOworCQlyZXR1cm4gY29udGVudHM7CisJfQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDb250ZW50cygpIHsKKworCQl0cnkgeworCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLmNvbnRlbnRzID0KKwkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQoCisJCQkJCQlsb2NhdGlvbi50b0ZpbGUoKSwgbnVsbCk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImluZGV4aW5nICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOyAvLyROT04tTkxTLTEkCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRkODI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRKYXJGaWxlVG9JbmRleC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5KYXJGaWxlRW50cnlEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworCitjbGFzcyBBZGRKYXJGaWxlVG9JbmRleCBleHRlbmRzIEluZGV4UmVxdWVzdCB7CisKKwlJbmRleE1hbmFnZXIgbWFuYWdlcjsKKwlTdHJpbmcgcHJvamVjdE5hbWU7CisJSUZpbGUgcmVzb3VyY2U7CisJcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmc7CisJSVBhdGggcGF0aDsKKworCXB1YmxpYyBBZGRKYXJGaWxlVG9JbmRleCgKKwkJSUZpbGUgcmVzb3VyY2UsCisJCUluZGV4TWFuYWdlciBtYW5hZ2VyLAorCQlTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLnBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOworCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisJfQorCS8vIGNhbiBiZSBmb3VuZCBlaXRoZXIgYnkgcHJvamVjdCBuYW1lIG9yIEpBUiBwYXRoIG5hbWUKKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgeworCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyhwcm9qZWN0TmFtZSkgfHwgdGhpcy5wYXRoLnRvU3RyaW5nKCkuZXF1YWxzKGpvYkZhbWlseSk7CisJfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJaWYgKCEobyBpbnN0YW5jZW9mIEFkZEphckZpbGVUb0luZGV4KSkgcmV0dXJuIGZhbHNlOworCWlmICh0aGlzLnJlc291cmNlICE9IG51bGwpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZXF1YWxzKCgoQWRkSmFyRmlsZVRvSW5kZXgpbykucmVzb3VyY2UpOworCX0KKwlpZiAodGhpcy5wYXRoICE9IG51bGwpIHsKKwkJcmV0dXJuIHRoaXMucGF0aC5lcXVhbHMoKChBZGRKYXJGaWxlVG9JbmRleClvKS5wYXRoKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlLmhhc2hDb2RlKCk7CisJfQorCWlmICh0aGlzLnBhdGggIT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5wYXRoLmhhc2hDb2RlKCk7CisJfQorCXJldHVybiAtMTsKK30JCisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBDT01QTEVURTsKKwkJdHJ5IHsKKwkJCUlQYXRoIGluZGV4ZWRQYXRoID0gdGhpcy5wYXRoOworCQkJLy8gaWYgaW5kZXggYWxyZWFkeSBjYWNoZWQsIHRoZW4gZG8gbm90IHBlcmZvcm0gYW55IGNoZWNrCisJCQlJSW5kZXggaW5kZXggPSAoSUluZGV4KSBtYW5hZ2VyLmdldEluZGV4KGluZGV4ZWRQYXRoLCBmYWxzZSAvKmRvIG5vdCByZXVzZSBpbmRleCBmaWxlKi8sIGZhbHNlIC8qZG8gbm90IGNyZWF0ZSBpZiBub25lKi8pOworCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKKwkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSAKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBubyBpbmRleGluZyByZXF1aXJlZCAoaW5kZXggYWxyZWFkeSBleGlzdHMpIGZvciAiICsgdGhpcy5wYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBDT01QTEVURTsKKwkJCX0KKworCQkJaW5kZXggPSBtYW5hZ2VyLmdldEluZGV4KGluZGV4ZWRQYXRoLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCQlpZiAoaW5kZXggPT0gbnVsbCkgeworCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIAorCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZvciAiICsgdGhpcy5wYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBDT01QTEVURTsKKwkJCX0KKwkJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7CisJCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgCisJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gaW5kZXggZm9yICIgKyB0aGlzLnBhdGggKyAiIGp1c3QgZ290IGRlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJCQl9CisJCQlaaXBGaWxlIHppcCA9IG51bGw7CisJCQl0cnkgeworCQkJCS8vIHRoaXMgcGF0aCB3aWxsIGJlIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgd29ya3NwYWNlIGluIGNhc2UgdGhlIHppcGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBhIHBhdGggaW4gdGhlCisJCQkJLy8gbG9jYWwgZmlsZSBzeXN0ZW0KKwkJCQlQYXRoIHppcEZpbGVQYXRoID0gbnVsbDsKKworCQkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQorCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCUlQYXRoIGxvY2F0aW9uID0gdGhpcy5yZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKKwkJCQkJCXJldHVybiBGQUlMRUQ7CisJCQkJCXppcCA9IG5ldyBaaXBGaWxlKGxvY2F0aW9uLnRvRmlsZSgpKTsKKwkJCQkJemlwRmlsZVBhdGggPSAoUGF0aCkgdGhpcy5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpOworCQkJCQkvLyBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UKKwkJCQl9IGVsc2UgeworCQkJCQl6aXAgPSBuZXcgWmlwRmlsZSh0aGlzLnBhdGgudG9GaWxlKCkpOworCQkJCQl6aXBGaWxlUGF0aCA9IChQYXRoKSB0aGlzLnBhdGg7CisJCQkJCS8vIHBhdGggaXMgYWxyZWFkeSBjYW5vbmljYWwgc2luY2UgY29taW5nIGZyb20gYSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeQorCQkJCX0KKworCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpCisJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gaW5kZXhpbmcgIiArIHppcC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJbG9uZyBpbml0aWFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCQkJZmluYWwgSGFzaFNldCBpbmRleGVkRmlsZU5hbWVzID0gbmV3IEhhc2hTZXQoMTAwKTsKKwkJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCisJCQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdHMgPT0gbnVsbCA/IDAgOiByZXN1bHRzLmxlbmd0aDsKKwkJCQlpZiAocmVzdWx0TGVuZ3RoICE9IDApIHsKKwkJCQkJLyogY2hlY2sgaW50ZWdyaXR5IG9mIHRoZSBleGlzdGluZyBpbmRleCBmaWxlCisJCQkJCSAqIGlmIHRoZSBsZW5ndGggaXMgZXF1YWwgdG8gMCwgd2Ugd2FudCB0byBpbmRleCB0aGUgd2hvbGUgamFyIGFnYWluCisJCQkJCSAqIElmIG5vdCwgdGhlbiB3ZSB3YW50IHRvIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gbWlzc2luZyBlbnRyeSwgaWYKKwkJCQkJICogb25lIGVudHJ5IGlzIG1pc3NpbmcgdGhlbiB3ZSAKKwkJCQkJICovCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKKwkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlc3VsdHNbaV0uZ2V0UGF0aCgpOworCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5hZGQoZmlsZU5hbWUpOworCQkJCQl9CisJCQkJCWJvb2xlYW4gbmVlZFRvUmVpbmRleCA9IGZhbHNlOworCQkJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB6aXAuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworCQkJCQkJLy8gaXRlcmF0ZSBlYWNoIGVudHJ5IHRvIGluZGV4IGl0CisJCQkJCQlaaXBFbnRyeSB6ZSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOworCQkJCQkJaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKHplLmdldE5hbWUoKSkpIHsKKwkJCQkJCQlKYXJGaWxlRW50cnlEb2N1bWVudCBlbnRyeURvY3VtZW50ID0KKwkJCQkJCQkJbmV3IEphckZpbGVFbnRyeURvY3VtZW50KHplLCBudWxsLCB6aXBGaWxlUGF0aCk7CisJCQkJCQkJaWYgKCFpbmRleGVkRmlsZU5hbWVzLnJlbW92ZShlbnRyeURvY3VtZW50LmdldE5hbWUoKSkpIHsKKwkJCQkJCQkJbmVlZFRvUmVpbmRleCA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIW5lZWRUb1JlaW5kZXggJiYgaW5kZXhlZEZpbGVOYW1lcy5zaXplKCkgPT0gMCkgeworCQkJCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoCisJCQkJCQkJCSItPiBubyBpbmRleGluZyByZXF1aXJlZCAoaW5kZXggaXMgY29uc2lzdGVudCB3aXRoIGxpYnJhcnkpIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyB6aXAuZ2V0TmFtZSgpICsgIiAoIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaW5pdGlhbFRpbWUpICsgIm1zKSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQlyZXR1cm4gQ09NUExFVEU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIEluZGV4IHRoZSBqYXIgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIHJlaW5kZXggdGhlIGphciBpbiBjYXNlIHRoZSBwcmV2aW91cyBpbmRleCBmaWxlIGhhcyBiZWVuIGNvcnJ1cHRlZAorCQkJCSAqLworCQkJCWlmIChpbmRleCAhPSBudWxsKSB7CisJCQkJCS8vIGluZGV4IGFscmVhZHkgZXhpc3RlZDogcmVjcmVhdGUgaXQgc28gdGhhdCB3ZSBmb3JnZXQgYWJvdXQgcHJldmlvdXMgZW50cmllcworCQkJCQlpbmRleCA9IG1hbmFnZXIucmVjcmVhdGVJbmRleChpbmRleGVkUGF0aCk7CisJCQkJfQorCQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisJCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7CisJCQkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKAorCQkJCQkJCQkiLT4gaW5kZXhpbmcgb2YgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgemlwLmdldE5hbWUoKSAKKwkJCQkJCQkJKyAiIGhhcyBiZWVuIGNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCQlyZXR1cm4gRkFJTEVEOworCQkJCQl9CisJCQkJCQorCQkJCQkvLyBpdGVyYXRlIGVhY2ggZW50cnkgdG8gaW5kZXggaXQKKwkJCQkJWmlwRW50cnkgemUgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKwkJCQkJaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKHplLmdldE5hbWUoKSkpIHsKKwkJCQkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcyA9CisJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRaaXBFbnRyeUJ5dGVDb250ZW50KHplLCB6aXApOworCQkJCQkJLy8gQWRkIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHRoZSBpbmRleAorCQkJCQkJaW5kZXguYWRkKAorCQkJCQkJCW5ldyBKYXJGaWxlRW50cnlEb2N1bWVudCh6ZSwgY2xhc3NGaWxlQnl0ZXMsIHppcEZpbGVQYXRoKSwKKwkJCQkJCQluZXcgQmluYXJ5SW5kZXhlcih0cnVlKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKAorCQkJCQkJIi0+IGRvbmUgaW5kZXhpbmcgb2YgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHppcC5nZXROYW1lKCkgKyAiICgiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaW5pdGlhbFRpbWUpICsgIm1zKSIpOyAvLyROT04tTkxTLTEkCisJCQl9IGZpbmFsbHkgeworCQkJCWlmICh6aXAgIT0gbnVsbCkKKwkJCQkJemlwLmNsb3NlKCk7CisJCQkJbW9uaXRvci5leGl0V3JpdGUoKTsgLy8gZnJlZSB3cml0ZSBsb2NrCisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKKwkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5wYXRoICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJbWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLnBhdGgpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCQlyZXR1cm4gQ09NUExFVEU7CisJfQorCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KKwkgKiBDcmVhdGlvbiBkYXRlOiAoMTAvMTAvMDAgMToyNzoxOCBQTSkKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAodG9TdHJpbmcgPT0gbnVsbCkgeworCQkJdG9TdHJpbmcgPSAiaW5kZXhpbmcgIiArIHRoaXMucGF0aC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHRvU3RyaW5nOworCX0KKworCXB1YmxpYyBBZGRKYXJGaWxlVG9JbmRleCgKKwkJSVBhdGggcGF0aCwKKwkJSW5kZXhNYW5hZ2VyIG1hbmFnZXIsCisJCVN0cmluZyBwcm9qZWN0TmFtZSkgeworCQkvLyBleHRlcm5hbCBKQVIgc2NlbmFyaW8gLSBubyByZXNvdXJjZQorCQl0aGlzLnBhdGggPSBwYXRoOworCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9CaW5hcnlJbmRleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyNDVlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhCkBAIC0wLDAgKzEsNTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlU3RydWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuRmllbGRJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5NZXRob2RJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OworCitwdWJsaWMgY2xhc3MgQmluYXJ5SW5kZXhlciBleHRlbmRzIEFic3RyYWN0SW5kZXhlciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGSUxFX1RZUEVTPSBuZXcgU3RyaW5nW10geyJjbGFzcyJ9OyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJZVEUgPSAiYnl0ZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBDSEFSID0gImNoYXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRE9VQkxFID0gImRvdWJsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGTE9BVCA9ICJmbG9hdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlQgPSAiaW50Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIExPTkcgPSAibG9uZyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTSE9SVCA9ICJzaG9ydCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCT09MRUFOID0gImJvb2xlYW4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVk9JRCA9ICJ2b2lkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIElOSVQgPSAiPGluaXQ+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIGJvb2xlYW4gbmVlZFJlZmVyZW5jZXM7CisvKioKKyAqIEJpbmFyeUluZGV4ZXIgY29uc3RydWN0b3IgY29tbWVudC4KKyAqLworcHVibGljIEJpbmFyeUluZGV4ZXIoKSB7CisJbmVlZFJlZmVyZW5jZXMgPSBmYWxzZTsKK30KKy8qKgorICogQmluYXJ5SW5kZXhlciBjb25zdHJ1Y3RvciBjb21tZW50LgorICovCitwdWJsaWMgQmluYXJ5SW5kZXhlcihib29sZWFuIHJldHJpZXZlUmVmZXJlbmNlcykgeworCW5lZWRSZWZlcmVuY2VzID0gcmV0cmlldmVSZWZlcmVuY2VzOworfQorLyoqCisgKiBGb3IgZXhhbXBsZToKKyAqICAgLSBpbnQgZm9vKFN0cmluZ1tdKSBpcyAoW0xqYXZhL2xhbmcvU3RyaW5nOylJID0+IGphdmEubGFuZy5TdHJpbmdbXSBpbiBhIGNoYXJbXVtdCisgKiAgIC0gdm9pZCBmb28oaW50KSBpcyAoSSlWID09PiBpbnQKKyAqLworcHJpdmF0ZSB2b2lkIGNvbnZlcnRUb0FycmF5VHlwZShjaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywgaW50IGNvdW50ZXIsIGludCBhcnJheURpbSkgeworCWludCBsZW5ndGggPSBwYXJhbWV0ZXJUeXBlc1tjb3VudGVyXS5sZW5ndGg7CisJY2hhcltdIGFycmF5VHlwZSA9IG5ldyBjaGFyW2xlbmd0aCArIGFycmF5RGltKjJdOworCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZXNbY291bnRlcl0sIDAsIGFycmF5VHlwZSwgMCwgbGVuZ3RoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5RGltOyBpKyspIHsKKwkJYXJyYXlUeXBlW2xlbmd0aCArIChpICogMildID0gJ1snOworCQlhcnJheVR5cGVbbGVuZ3RoICsgKGkgKiAyKSArIDFdID0gJ10nOworCX0KKwlwYXJhbWV0ZXJUeXBlc1tjb3VudGVyXSA9IGFycmF5VHlwZTsKK30KKy8qKgorICogRm9yIGV4YW1wbGU6CisgKiAgIC0gaW50IGZvbyhTdHJpbmdbXSkgaXMgKFtMamF2YS9sYW5nL1N0cmluZzspSSA9PiBqYXZhLmxhbmcuU3RyaW5nW10gaW4gYSBjaGFyW11bXQorICogICAtIHZvaWQgZm9vKGludCkgaXMgKEkpViA9PT4gaW50CisgKi8KK3ByaXZhdGUgY2hhcltdIGNvbnZlcnRUb0FycmF5VHlwZShjaGFyW10gdHlwZU5hbWUsIGludCBhcnJheURpbSkgeworCWludCBsZW5ndGggPSB0eXBlTmFtZS5sZW5ndGg7CisJY2hhcltdIGFycmF5VHlwZSA9IG5ldyBjaGFyW2xlbmd0aCArIGFycmF5RGltKjJdOworCVN5c3RlbS5hcnJheWNvcHkodHlwZU5hbWUsIDAsIGFycmF5VHlwZSwgMCwgbGVuZ3RoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5RGltOyBpKyspIHsKKwkJYXJyYXlUeXBlW2xlbmd0aCArIChpICogMildID0gJ1snOworCQlhcnJheVR5cGVbbGVuZ3RoICsgKGkgKiAyKSArIDFdID0gJ10nOworCX0KKwlyZXR1cm4gYXJyYXlUeXBlOworfQorcHJpdmF0ZSBjaGFyW10gZGVjb2RlRmllbGRUeXBlKGNoYXJbXSBzaWduYXR1cmUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJaWYgKHNpZ25hdHVyZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlpbnQgYXJyYXlEaW0gPSAwOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBzaWduYXR1cmUubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJc3dpdGNoKHNpZ25hdHVyZVtpXSkgeworCQkJY2FzZSAnQic6CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKEJZVEUsIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gQllURTsKKwkJCQl9CisJCQljYXNlICdDJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoQ0hBUiwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBDSEFSOworCQkJCX0KKwkJCWNhc2UgJ0QnOgorCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShET1VCTEUsIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gRE9VQkxFOworCQkJCX0KKwkJCWNhc2UgJ0YnOgorCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShGTE9BVCwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBGTE9BVDsKKwkJCQl9CisJCQljYXNlICdJJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoSU5ULCBhcnJheURpbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIElOVDsKKwkJCQl9CisJCQljYXNlICdKJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoTE9ORywgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBMT05HOworCQkJCX0KKwkJCWNhc2UgJ0wnOgorCQkJCWludCBpbmRleE9mU2VtaUNvbG9uID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnbmF0dXJlLCBpKzEpOworCQkJCWlmIChpbmRleE9mU2VtaUNvbG9uID09IC0xKSB0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJySW52YWxpZE1ldGhvZFNpZ25hdHVyZSk7CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKHJlcGxhY2UoJy8nLCcuJyxDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZ25hdHVyZSwgaSArIDEsIGluZGV4T2ZTZW1pQ29sb24pKSwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiByZXBsYWNlKCcvJywnLicsQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzaWduYXR1cmUsIGkgKyAxLCBpbmRleE9mU2VtaUNvbG9uKSk7CisJCQkJfQorCQkJY2FzZSAnUyc6CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKFNIT1JULCBhcnJheURpbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIFNIT1JUOworCQkJCX0KKwkJCWNhc2UgJ1onOgorCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShCT09MRUFOLCBhcnJheURpbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEJPT0xFQU47CisJCQkJfQorCQkJY2FzZSAnVic6CisJCQkJcmV0dXJuIFZPSUQ7CisJCQljYXNlICdbJzoKKwkJCQlhcnJheURpbSsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJySW52YWxpZE1ldGhvZFNpZ25hdHVyZSk7CisJCX0KKwl9CisJcmV0dXJuIG51bGw7Cit9CisvKioKKyAqIEZvciBleGFtcGxlOgorICogICAtIGludCBmb28oU3RyaW5nW10pIGlzIChbTGphdmEvbGFuZy9TdHJpbmc7KUkgPT4gamF2YS5sYW5nLlN0cmluZ1tdIGluIGEgY2hhcltdW10KKyAqICAgLSB2b2lkIGZvbyhpbnQpIGlzIChJKVYgPT0+IGludAorICovCitwcml2YXRlIGNoYXJbXVtdIGRlY29kZVBhcmFtZXRlclR5cGVzKGNoYXJbXSBzaWduYXR1cmUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJaWYgKHNpZ25hdHVyZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlpbnQgaW5kZXhPZkNsb3NpbmdQYXJlbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJyknLCBzaWduYXR1cmUpOworCWlmIChpbmRleE9mQ2xvc2luZ1BhcmVuID09IDEpIHsKKwkJLy8gdGhlcmUgaXMgbm8gcGFyYW1ldGVyCisJCXJldHVybiBudWxsOworCX0KKwlpZiAoaW5kZXhPZkNsb3NpbmdQYXJlbiA9PSAtMSkgeworCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJySW52YWxpZE1ldGhvZFNpZ25hdHVyZSk7CisJfQorCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IGNoYXJbM11bXTsKKwlpbnQgcGFyYW1ldGVyVHlwZXNDb3VudGVyID0gMDsKKwlpbnQgYXJyYXlEaW0gPSAwOworCWZvciAoaW50IGkgPSAxOyBpIDwgaW5kZXhPZkNsb3NpbmdQYXJlbjsgaSsrKSB7CisJCWlmIChwYXJhbWV0ZXJUeXBlc0NvdW50ZXIgPT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7CisJCQkvLyByZXNpemUKKwkJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZXMsIDAsIChwYXJhbWV0ZXJUeXBlcyA9IG5ldyBjaGFyW3BhcmFtZXRlclR5cGVzQ291bnRlciAqIDJdW10pLCAwLCBwYXJhbWV0ZXJUeXBlc0NvdW50ZXIpOworCQl9CisJCXN3aXRjaChzaWduYXR1cmVbaV0pIHsKKwkJCWNhc2UgJ0InOgorCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IEJZVEU7CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CisJCQkJfQorCQkJCWFycmF5RGltID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnOgorCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IENIQVI7CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CisJCQkJfQorCQkJCWFycmF5RGltID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0QnOgorCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IERPVUJMRTsKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCWNvbnZlcnRUb0FycmF5VHlwZShwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZXNDb3VudGVyLTEsIGFycmF5RGltKTsKKwkJCQl9CisJCQkJYXJyYXlEaW0gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnRic6CisJCQkJcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVyVHlwZXNDb3VudGVyKytdID0gRkxPQVQ7CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CisJCQkJfQorCQkJCWFycmF5RGltID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0knOgorCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IElOVDsKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCWNvbnZlcnRUb0FycmF5VHlwZShwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZXNDb3VudGVyLTEsIGFycmF5RGltKTsKKwkJCQl9CisJCQkJYXJyYXlEaW0gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnSic6CisJCQkJcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVyVHlwZXNDb3VudGVyKytdID0gTE9ORzsKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCWNvbnZlcnRUb0FycmF5VHlwZShwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVyVHlwZXNDb3VudGVyLTEsIGFycmF5RGltKTsKKwkJCQl9CisJCQkJYXJyYXlEaW0gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJaW50IGluZGV4T2ZTZW1pQ29sb24gPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCBzaWduYXR1cmUsIGkrMSk7CisJCQkJaWYgKGluZGV4T2ZTZW1pQ29sb24gPT0gLTEpIHRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJJbnZhbGlkTWV0aG9kU2lnbmF0dXJlKTsKKwkJCQlwYXJhbWV0ZXJUeXBlc1twYXJhbWV0ZXJUeXBlc0NvdW50ZXIrK10gPSByZXBsYWNlKCcvJywnLicsQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzaWduYXR1cmUsIGkgKyAxLCBpbmRleE9mU2VtaUNvbG9uKSk7CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQljb252ZXJ0VG9BcnJheVR5cGUocGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlclR5cGVzQ291bnRlci0xLCBhcnJheURpbSk7CisJCQkJfQorCQkJCWkgPSBpbmRleE9mU2VtaUNvbG9uOworCQkJCWFycmF5RGltID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlclR5cGVzQ291bnRlcisrXSA9IFNIT1JUOworCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJY29udmVydFRvQXJyYXlUeXBlKHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJUeXBlc0NvdW50ZXItMSwgYXJyYXlEaW0pOworCQkJCX0KKwkJCQlhcnJheURpbSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdaJzoKKwkJCQlwYXJhbWV0ZXJUeXBlc1twYXJhbWV0ZXJUeXBlc0NvdW50ZXIrK10gPSBCT09MRUFOOworCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJY29udmVydFRvQXJyYXlUeXBlKHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJUeXBlc0NvdW50ZXItMSwgYXJyYXlEaW0pOworCQkJCX0KKwkJCQlhcnJheURpbSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdbJzoKKwkJCQlhcnJheURpbSsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJySW52YWxpZE1ldGhvZFNpZ25hdHVyZSk7CisJCX0KKwl9CisJaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBwYXJhbWV0ZXJUeXBlc0NvdW50ZXIpIHsKKwkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJUeXBlcywgMCwgcGFyYW1ldGVyVHlwZXMgPSBuZXcgY2hhcltwYXJhbWV0ZXJUeXBlc0NvdW50ZXJdW10sIDAsIHBhcmFtZXRlclR5cGVzQ291bnRlcik7CisJfQorCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKK30KK3ByaXZhdGUgY2hhcltdIGRlY29kZVJldHVyblR5cGUoY2hhcltdIHNpZ25hdHVyZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKwlpZiAoc2lnbmF0dXJlID09IG51bGwpIHJldHVybiBudWxsOworCWludCBpbmRleE9mQ2xvc2luZ1BhcmVuID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignKScsIHNpZ25hdHVyZSk7CisJaWYgKGluZGV4T2ZDbG9zaW5nUGFyZW4gPT0gLTEpIHRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJJbnZhbGlkTWV0aG9kU2lnbmF0dXJlKTsKKwlpbnQgYXJyYXlEaW0gPSAwOworCWZvciAoaW50IGkgPSBpbmRleE9mQ2xvc2luZ1BhcmVuICsgMSwgbWF4ID0gc2lnbmF0dXJlLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCXN3aXRjaChzaWduYXR1cmVbaV0pIHsKKwkJCWNhc2UgJ0InOgorCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShCWVRFLCBhcnJheURpbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEJZVEU7CisJCQkJfQorCQkJY2FzZSAnQyc6CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKENIQVIsIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gQ0hBUjsKKwkJCQl9CisJCQljYXNlICdEJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoRE9VQkxFLCBhcnJheURpbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIERPVUJMRTsKKwkJCQl9CisJCQljYXNlICdGJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoRkxPQVQsIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gRkxPQVQ7CisJCQkJfQorCQkJY2FzZSAnSSc6CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKElOVCwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBJTlQ7CisJCQkJfQorCQkJY2FzZSAnSic6CisJCQkJaWYgKGFycmF5RGltID4gMCkgeworCQkJCQlyZXR1cm4gY29udmVydFRvQXJyYXlUeXBlKExPTkcsIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gTE9ORzsKKwkJCQl9CisJCQljYXNlICdMJzoKKwkJCQlpbnQgaW5kZXhPZlNlbWlDb2xvbiA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignOycsIHNpZ25hdHVyZSwgaSsxKTsKKwkJCQlpZiAoaW5kZXhPZlNlbWlDb2xvbiA9PSAtMSkgdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOworCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShyZXBsYWNlKCcvJywnLicsQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzaWduYXR1cmUsIGkgKyAxLCBpbmRleE9mU2VtaUNvbG9uKSksIGFycmF5RGltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gcmVwbGFjZSgnLycsJy4nLENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2lnbmF0dXJlLCBpICsgMSwgaW5kZXhPZlNlbWlDb2xvbikpOworCQkJCX0KKwkJCWNhc2UgJ1MnOgorCQkJCWlmIChhcnJheURpbSA+IDApIHsKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0FycmF5VHlwZShTSE9SVCwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBTSE9SVDsKKwkJCQl9CisJCQljYXNlICdaJzoKKwkJCQlpZiAoYXJyYXlEaW0gPiAwKSB7CisJCQkJCXJldHVybiBjb252ZXJ0VG9BcnJheVR5cGUoQk9PTEVBTiwgYXJyYXlEaW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBCT09MRUFOOworCQkJCX0KKwkJCWNhc2UgJ1YnOgorCQkJCXJldHVybiBWT0lEOworCQkJY2FzZSAnWyc6CisJCQkJYXJyYXlEaW0rKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOworCQl9CisJfQorCXJldHVybiBudWxsOworfQorcHJpdmF0ZSBpbnQgZXh0cmFjdEFyZ0NvdW50KGNoYXJbXSBzaWduYXR1cmUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJaW50IGluZGV4T2ZDbG9zaW5nUGFyZW4gPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcpJywgc2lnbmF0dXJlKTsKKwlpZiAoaW5kZXhPZkNsb3NpbmdQYXJlbiA9PSAxKSB7CisJCS8vIHRoZXJlIGlzIG5vIHBhcmFtZXRlcgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGluZGV4T2ZDbG9zaW5nUGFyZW4gPT0gLTEpIHsKKwkJdGhyb3cgbmV3IENsYXNzRm9ybWF0RXhjZXB0aW9uKENsYXNzRm9ybWF0RXhjZXB0aW9uLkVyckludmFsaWRNZXRob2RTaWduYXR1cmUpOworCX0KKwlpbnQgcGFyYW1ldGVyVHlwZXNDb3VudGVyID0gMDsKKwlmb3IgKGludCBpID0gMTsgaSA8IGluZGV4T2ZDbG9zaW5nUGFyZW47IGkrKykgeworCQlzd2l0Y2goc2lnbmF0dXJlW2ldKSB7CisJCQljYXNlICdCJzoKKwkJCWNhc2UgJ0MnOgorCQkJY2FzZSAnRCc6CisJCQljYXNlICdGJzoKKwkJCWNhc2UgJ0knOgorCQkJY2FzZSAnSic6CisJCQljYXNlICdTJzoKKwkJCWNhc2UgJ1onOgorCQkJCXBhcmFtZXRlclR5cGVzQ291bnRlcisrOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJaW50IGluZGV4T2ZTZW1pQ29sb24gPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJzsnLCBzaWduYXR1cmUsIGkrMSk7CisJCQkJaWYgKGluZGV4T2ZTZW1pQ29sb24gPT0gLTEpIHRocm93IG5ldyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbihDbGFzc0Zvcm1hdEV4Y2VwdGlvbi5FcnJJbnZhbGlkTWV0aG9kU2lnbmF0dXJlKTsKKwkJCQlwYXJhbWV0ZXJUeXBlc0NvdW50ZXIrKzsKKwkJCQlpID0gaW5kZXhPZlNlbWlDb2xvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1snOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFeGNlcHRpb24oQ2xhc3NGb3JtYXRFeGNlcHRpb24uRXJySW52YWxpZE1ldGhvZFNpZ25hdHVyZSk7CisJCX0KKwl9CisJcmV0dXJuIHBhcmFtZXRlclR5cGVzQ291bnRlcjsKK30KK3ByaXZhdGUgZmluYWwgY2hhcltdIGV4dHJhY3RDbGFzc05hbWUoaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cywgQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciwgaW50IGluZGV4KSB7CisJLy8gdGhlIGVudHJ5IGF0IGkgaGFzIHRvIGJlIGEgZmllbGQgcmVmIG9yIGEgbWV0aG9kL2ludGVyZmFjZSBtZXRob2QgcmVmLgorCWludCBjbGFzc19pbmRleCA9IHJlYWRlci51MkF0KGNvbnN0YW50UG9vbE9mZnNldHNbaW5kZXhdICsgMSk7CisJaW50IHV0ZjhPZmZzZXQgPSBjb25zdGFudFBvb2xPZmZzZXRzW3JlYWRlci51MkF0KGNvbnN0YW50UG9vbE9mZnNldHNbY2xhc3NfaW5kZXhdICsgMSldOworCXJldHVybiByZWFkZXIudXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCByZWFkZXIudTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworfQorcHJpdmF0ZSBmaW5hbCBjaGFyW10gZXh0cmFjdE5hbWUoaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cywgQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciwgaW50IGluZGV4KSB7CisJaW50IG5hbWVBbmRUeXBlSW5kZXggPSByZWFkZXIudTJBdChjb25zdGFudFBvb2xPZmZzZXRzW2luZGV4XSArIDMpOworCWludCB1dGY4T2Zmc2V0ID0gY29uc3RhbnRQb29sT2Zmc2V0c1tyZWFkZXIudTJBdChjb25zdGFudFBvb2xPZmZzZXRzW25hbWVBbmRUeXBlSW5kZXhdICsgMSldOworCXJldHVybiByZWFkZXIudXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCByZWFkZXIudTJBdCh1dGY4T2Zmc2V0ICsgMSkpOworfQorcHJpdmF0ZSBmaW5hbCBjaGFyW10gZXh0cmFjdENsYXNzUmVmZXJlbmNlKGludFtdIGNvbnN0YW50UG9vbE9mZnNldHMsIENsYXNzRmlsZVJlYWRlciByZWFkZXIsIGludCBpbmRleCkgeworCS8vIHRoZSBlbnRyeSBhdCBpIGhhcyB0byBiZSBhIGNsYXNzIHJlZi4KKwlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbcmVhZGVyLnUyQXQoY29uc3RhbnRQb29sT2Zmc2V0c1tpbmRleF0gKyAxKV07CisJcmV0dXJuIHJlYWRlci51dGY4QXQodXRmOE9mZnNldCArIDMsIHJlYWRlci51MkF0KHV0ZjhPZmZzZXQgKyAxKSk7Cit9CisvKioKKyAqIEV4dHJhY3QgYWxsIHR5cGUsIG1ldGhvZCwgZmllbGQgYW5kIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlcyBmcm9tIHRoZSBjb25zdGFudCBwb29sCisgKi8KK3ByaXZhdGUgdm9pZCBleHRyYWN0UmVmZXJlbmNlRnJvbUNvbnN0YW50UG9vbChieXRlW10gY29udGVudHMsIENsYXNzRmlsZVJlYWRlciByZWFkZXIpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7CisJaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cyA9IHJlYWRlci5nZXRDb25zdGFudFBvb2xPZmZzZXRzKCk7CisJaW50IGNvbnN0YW50UG9vbENvdW50ID0gY29uc3RhbnRQb29sT2Zmc2V0cy5sZW5ndGg7CisJZm9yIChpbnQgaSA9IDE7IGkgPCBjb25zdGFudFBvb2xDb3VudDsgaSsrKSB7CisJCWludCB0YWcgPSByZWFkZXIudTFBdChjb25zdGFudFBvb2xPZmZzZXRzW2ldKTsKKwkJLyoqCisJCSAqIHUxIHRhZworCQkgKiB1MiBjbGFzc19pbmRleAorCQkgKiB1MiBuYW1lX2FuZF90eXBlX2luZGV4CisJCSAqLworCQljaGFyW10gbmFtZSA9IG51bGw7CisJCWNoYXJbXSB0eXBlID0gbnVsbDsKKwkJc3dpdGNoICh0YWcpIHsKKwkJCWNhc2UgQ2xhc3NGaWxlU3RydWN0LkZpZWxkUmVmVGFnIDoKKwkJCQkvLyBhZGQgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcy9pbnRlcmZhY2UgYW5kIGZpZWxkIG5hbWUgYW5kIHR5cGUKKwkJCQluYW1lID0gZXh0cmFjdE5hbWUoY29uc3RhbnRQb29sT2Zmc2V0cywgcmVhZGVyLCBpKTsKKwkJCQlhZGRGaWVsZFJlZmVyZW5jZShuYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ2xhc3NGaWxlU3RydWN0Lk1ldGhvZFJlZlRhZyA6CisJCQkJLy8gYWRkIHJlZmVyZW5jZSB0byB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lIGFuZCB0eXBlCisJCQljYXNlIENsYXNzRmlsZVN0cnVjdC5JbnRlcmZhY2VNZXRob2RSZWZUYWcgOgorCQkJCS8vIGFkZCByZWZlcmVuY2UgdG8gdGhlIGludGVyZmFjZSBhbmQgbWV0aG9kIG5hbWUgYW5kIHR5cGUKKwkJCQluYW1lID0gZXh0cmFjdE5hbWUoY29uc3RhbnRQb29sT2Zmc2V0cywgcmVhZGVyLCBpKTsKKwkJCQl0eXBlID0gZXh0cmFjdFR5cGUoY29uc3RhbnRQb29sT2Zmc2V0cywgcmVhZGVyLCBpKTsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoSU5JVCwgbmFtZSkpIHsKKwkJCQkJLy8gYWRkIGEgY29uc3RydWN0b3IgcmVmZXJlbmNlCisJCQkJCWNoYXJbXSBjbGFzc05hbWUgPSByZXBsYWNlKCcvJywgJy4nLCBleHRyYWN0Q2xhc3NOYW1lKGNvbnN0YW50UG9vbE9mZnNldHMsIHJlYWRlciwgaSkpOyAvLyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgamF2YS5sYW5nLlN0cmluZworCQkJCQlhZGRDb25zdHJ1Y3RvclJlZmVyZW5jZShjbGFzc05hbWUsIGV4dHJhY3RBcmdDb3VudCh0eXBlKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gYWRkIGEgbWV0aG9kIHJlZmVyZW5jZQorCQkJCQlhZGRNZXRob2RSZWZlcmVuY2UobmFtZSwgZXh0cmFjdEFyZ0NvdW50KHR5cGUpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENsYXNzRmlsZVN0cnVjdC5DbGFzc1RhZyA6CisJCQkJbmFtZSA9IHJlcGxhY2UoJy8nLCAnLicsIGV4dHJhY3RDbGFzc1JlZmVyZW5jZShjb25zdGFudFBvb2xPZmZzZXRzLCByZWFkZXIsIGkpKTsgLy8gc28gdGhhdCBpdCBsb29rcyBsaWtlIGphdmEubGFuZy5TdHJpbmcKKwkJCQlhZGRUeXBlUmVmZXJlbmNlKG5hbWUpOworCQl9CisJfQorfQorcHJpdmF0ZSBmaW5hbCBjaGFyW10gZXh0cmFjdFR5cGUoaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cywgQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciwgaW50IGluZGV4KSB7CisJaW50IGNvbnN0YW50UG9vbEluZGV4ID0gcmVhZGVyLnUyQXQoY29uc3RhbnRQb29sT2Zmc2V0c1tpbmRleF0gKyAzKTsKKwlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbcmVhZGVyLnUyQXQoY29uc3RhbnRQb29sT2Zmc2V0c1tjb25zdGFudFBvb2xJbmRleF0gKyAzKV07CisJcmV0dXJuIHJlYWRlci51dGY4QXQodXRmOE9mZnNldCArIDMsIHJlYWRlci51MkF0KHV0ZjhPZmZzZXQgKyAxKSk7Cit9CisvKioKKyAqIGdldEZpbGVUeXBlcyBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIFN0cmluZ1tdIGdldEZpbGVUeXBlcygpIHsKKwlyZXR1cm4gRklMRV9UWVBFUzsKK30KK3ByaXZhdGUgdm9pZCBpbmRleENsYXNzRmlsZShieXRlW10gY29udGVudHMsIGNoYXJbXSBkb2N1bWVudE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBDbGFzc0ZpbGVSZWFkZXIoY29udGVudHMsIGRvY3VtZW50TmFtZSk7CisKKwkJLy8gZmlyc3QgYWRkIHR5cGUgcmVmZXJlbmNlcworCQljaGFyW10gY2xhc3NOYW1lID0gcmVwbGFjZSgnLycsICcuJywgcmVhZGVyLmdldE5hbWUoKSk7IC8vIGxvb2tzIGxpa2UgamF2YS9sYW5nL1N0cmluZworCQkvLyBuZWVkIHRvIGV4dHJhY3QgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdGhlIHNpbXBsZSBuYW1lCisJCWludCBwYWNrYWdlTmFtZUluZGV4ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIGNsYXNzTmFtZSk7CisJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IG51bGw7CisJCWNoYXJbXSBuYW1lID0gbnVsbDsKKwkJaWYgKHBhY2thZ2VOYW1lSW5kZXggPj0gMCkgeworCQkJcGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNsYXNzTmFtZSwgMCwgcGFja2FnZU5hbWVJbmRleCk7CisJCQluYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjbGFzc05hbWUsIHBhY2thZ2VOYW1lSW5kZXggKyAxLCBjbGFzc05hbWUubGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSBjbGFzc05hbWU7CisJCX0KKwkJY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lID0gbnVsbDsKKwkJaWYgKHJlYWRlci5pc05lc3RlZFR5cGUoKSkgeworCQkJaWYgKHJlYWRlci5pc0Fub255bW91cygpKSB7CisJCQkJbmFtZSA9IE5PX0NIQVI7CisJCQl9IGVsc2UgeworCQkJCW5hbWUgPSByZWFkZXIuZ2V0SW5uZXJTb3VyY2VOYW1lKCk7CisJCQl9CisJCQlpZiAocmVhZGVyLmlzTG9jYWwoKSB8fCByZWFkZXIuaXNBbm9ueW1vdXMoKSkgeworCQkJCWVuY2xvc2luZ1R5cGVOYW1lID0gT05FX1pFUk87CisJCQl9IGVsc2UgeworCQkJCWNoYXJbXSBmdWxsRW5jbG9zaW5nTmFtZSA9IHJlYWRlci5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpOworCQkJCWludCBuYW1lTGVuZ3RoID0gZnVsbEVuY2xvc2luZ05hbWUubGVuZ3RoIC0gcGFja2FnZU5hbWVJbmRleCAtIDE7CisJCQkJaWYgKG5hbWVMZW5ndGggPD0gMCkgeworCQkJCQkvLyBTZWUgUFIgMUdJUjM0NTogSVRQSkNPUkU6QUxMIC0gSW5kZXhlcjogTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQllbmNsb3NpbmdUeXBlTmFtZSA9IG5ldyBjaGFyW25hbWVMZW5ndGhdOyAKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGZ1bGxFbmNsb3NpbmdOYW1lLCBwYWNrYWdlTmFtZUluZGV4ICsgMSwgZW5jbG9zaW5nVHlwZU5hbWUsIDAsIG5hbWVMZW5ndGgpOworCQkJfQorCQl9CisJCS8vIGVsaW1pbmF0ZSBpbnZhbGlkIGlubmVyY2xhc3NlcyAoMUc0S0NGNykKKwkJaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuOworCQkKKwkJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzID0gcmVwbGFjZSgnLycsICcuJywgcmVhZGVyLmdldEludGVyZmFjZU5hbWVzKCkpOworCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMgPSBlbmNsb3NpbmdUeXBlTmFtZSA9PSBudWxsID8gbnVsbCA6IG5ldyBjaGFyW11bXSB7ZW5jbG9zaW5nVHlwZU5hbWV9OworCQlpZiAocmVhZGVyLmlzSW50ZXJmYWNlKCkpIHsKKwkJCWFkZEludGVyZmFjZURlY2xhcmF0aW9uKHJlYWRlci5nZXRNb2RpZmllcnMoKSwgcGFja2FnZU5hbWUsIG5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgc3VwZXJpbnRlcmZhY2VzKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXSBzdXBlcmNsYXNzID0gcmVwbGFjZSgnLycsICcuJywgcmVhZGVyLmdldFN1cGVyY2xhc3NOYW1lKCkpOworCQkJYWRkQ2xhc3NEZWNsYXJhdGlvbihyZWFkZXIuZ2V0TW9kaWZpZXJzKCksIHBhY2thZ2VOYW1lLCBuYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsIHN1cGVyY2xhc3MsIHN1cGVyaW50ZXJmYWNlcyk7CisJCX0KKworCQkvLyBmaXJzdCByZWZlcmVuY2UgYWxsIG1ldGhvZHMgZGVjbGFyYXRpb25zIGFuZCBmaWVsZCBkZWNsYXJhdGlvbnMKKwkJTWV0aG9kSW5mb1tdIG1ldGhvZHMgPSAoTWV0aG9kSW5mb1tdKSByZWFkZXIuZ2V0TWV0aG9kcygpOworCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCU1ldGhvZEluZm8gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCQljaGFyW10gZGVzY3JpcHRvciA9IG1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCk7CisJCQkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMgPSBkZWNvZGVQYXJhbWV0ZXJUeXBlcyhkZXNjcmlwdG9yKTsKKwkJCQljaGFyW10gcmV0dXJuVHlwZSA9IGRlY29kZVJldHVyblR5cGUoZGVzY3JpcHRvcik7CisJCQkJY2hhcltdW10gZXhjZXB0aW9uVHlwZXMgPSByZXBsYWNlKCcvJywgJy4nLCBtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZU5hbWVzKCkpOworCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7CisJCQkJCWFkZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgZXhjZXB0aW9uVHlwZXMpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghbWV0aG9kLmlzQ2xpbml0KCkpIHsKKwkJCQkJCWFkZE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZC5nZXRTZWxlY3RvcigpLCBwYXJhbWV0ZXJUeXBlcywgcmV0dXJuVHlwZSwgZXhjZXB0aW9uVHlwZXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCUZpZWxkSW5mb1tdIGZpZWxkcyA9IChGaWVsZEluZm9bXSkgcmVhZGVyLmdldEZpZWxkcygpOworCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlGaWVsZEluZm8gZmllbGQgPSBmaWVsZHNbaV07CisJCQkJY2hhcltdIGZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKKwkJCQljaGFyW10gZmllbGRUeXBlID0gZGVjb2RlRmllbGRUeXBlKHJlcGxhY2UoJy8nLCAnLicsIGZpZWxkLmdldFR5cGVOYW1lKCkpKTsKKwkJCQlhZGRGaWVsZERlY2xhcmF0aW9uKGZpZWxkVHlwZSwgZmllbGROYW1lKTsKKwkJCX0KKwkJfQorCisJCS8vIHJlY29yZCBhbGwgcmVmZXJlbmNlcyBmb3VuZCBpbnNpZGUgdGhlIC5jbGFzcyBmaWxlCisJCWlmIChuZWVkUmVmZXJlbmNlcykgeworCQkJZXh0cmFjdFJlZmVyZW5jZUZyb21Db25zdGFudFBvb2woY29udGVudHMsIHJlYWRlcik7CisJCX0KKwl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJfQorfQorLyoqCisgKiBpbmRleEZpbGUgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3Byb3RlY3RlZCB2b2lkIGluZGV4RmlsZShJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJLy8gQWRkIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHRoZSBpbmRleAorCW91dHB1dC5hZGREb2N1bWVudChkb2N1bWVudCk7CisJaW5kZXhDbGFzc0ZpbGUoZG9jdW1lbnQuZ2V0Qnl0ZUNvbnRlbnQoKSwgZG9jdW1lbnQuZ2V0TmFtZSgpLnRvQ2hhckFycmF5KCkpOworfQorLyoqCisgKiBNb2RpZnkgdGhlIGFycmF5IGJ5IHJlcGxhY2luZyBhbGwgb2NjdXJlbmNlcyBvZiB0b0JlUmVwbGFjZWQgd2l0aCBuZXdDaGFyCisgKi8KK3ByaXZhdGUgY2hhcltdW10gcmVwbGFjZShjaGFyIHRvQmVSZXBsYWNlZCwgY2hhciBuZXdDaGFyLCBjaGFyW11bXSBhcnJheSkgeworCWlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJyYXkubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJcmVwbGFjZSh0b0JlUmVwbGFjZWQsIG5ld0NoYXIsIGFycmF5W2ldKTsKKwl9CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBNb2RpZnkgdGhlIGFycmF5IGJ5IHJlcGxhY2luZyBhbGwgb2NjdXJlbmNlcyBvZiB0b0JlUmVwbGFjZWQgd2l0aCBuZXdDaGFyCisgKi8KK3ByaXZhdGUgY2hhcltdIHJlcGxhY2UoY2hhciB0b0JlUmVwbGFjZWQsIGNoYXIgbmV3Q2hhciwgY2hhcltdIGFycmF5KSB7CisJaWYgKGFycmF5ID09IG51bGwpIHJldHVybiBudWxsOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcnJheS5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlpZiAoYXJyYXlbaV0gPT0gdG9CZVJlcGxhY2VkKSB7CisJCQlhcnJheVtpXSA9IG5ld0NoYXI7CisJCX0KKwl9CisJcmV0dXJuIGFycmF5OworfQorLyoqCisgKiBzZXRGaWxlVHlwZXMgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIHNldEZpbGVUeXBlcyhTdHJpbmdbXSBmaWxlVHlwZXMpIHt9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JSW5kZXhDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSUluZGV4Q29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1YjhlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOworCitwdWJsaWMgaW50ZXJmYWNlIElJbmRleENvbnN0YW50cyB7CisKKwkvKiBpbmRleCBlbmNvZGluZyAqLworCWNoYXJbXSBSRUY9ICJyZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEZJRUxEX1JFRj0gImZpZWxkUmVmLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBNRVRIT0RfUkVGPSAibWV0aG9kUmVmLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBDT05TVFJVQ1RPUl9SRUY9ICJjb25zdHJ1Y3RvclJlZi8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gVFlQRV9SRUY9ICJ0eXBlUmVmLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBTVVBFUl9SRUYgPSAic3VwZXJSZWYvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFRZUEVfREVDTCA9ICJ0eXBlRGVjbC8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlpbnQgCVRZUEVfREVDTF9MRU5HVEggPSA5OworCWNoYXJbXSBDTEFTU19ERUNMPSAidHlwZURlY2wvQy8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gSU5URVJGQUNFX0RFQ0w9ICJ0eXBlRGVjbC9JLyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBNRVRIT0RfREVDTD0gIm1ldGhvZERlY2wvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIENPTlNUUlVDVE9SX0RFQ0w9ICJjb25zdHJ1Y3RvckRlY2wvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEZJRUxEX0RFQ0w9ICJmaWVsZERlY2wvIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIE9CSkVDVCA9ICJPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW11bXSBDT1VOVFM9IAorCQluZXcgY2hhcltdW10geyBuZXcgY2hhcltdIHsnMCd9LCBuZXcgY2hhcltdIHsnMSd9LCBuZXcgY2hhcltdIHsnMid9LCBuZXcgY2hhcltdIHsnMyd9LCBuZXcgY2hhcltdIHsnNCd9LCBuZXcgY2hhcltdIHsnNSd9LCBuZXcgY2hhcltdIHsnNid9LCBuZXcgY2hhcltdIHsnNyd9LCBuZXcgY2hhcltdIHsnOCd9LCBuZXcgY2hhcltdIHsnOSd9CisJfTsKKwljaGFyIENMQVNTX1NVRkZJWCA9ICdDJzsKKwljaGFyIElOVEVSRkFDRV9TVUZGSVggPSAnSSc7CisJY2hhciBUWVBFX1NVRkZJWCA9IDA7CisJY2hhciBTRVBBUkFUT1I9ICcvJzsKKworCWNoYXJbXSBPTkVfU1RBUiA9IG5ldyBjaGFyW10geycqJ307CisJY2hhcltdW10gT05FX1NUQVJfQ0hBUiA9IG5ldyBjaGFyW11bXSB7T05FX1NUQVJ9OworCWNoYXJbXSBOT19DSEFSID0gbmV3IGNoYXJbMF07CisJY2hhcltdW10gTk9fQ0hBUl9DSEFSID0gbmV3IGNoYXJbMF1bXTsKKworCS8vIHVzZWQgYXMgc3BlY2lhbCBtYXJrZXIgZm9yIGVuY2xvc2luZyB0eXBlIG5hbWUgb2YgbG9jYWwgYW5kIGFub255bW91cyBjbGFzc2VzCisJY2hhcltdIE9ORV9aRVJPID0gbmV3IGNoYXJbXSB7JzAnfTsgCisJY2hhcltdW10gT05FX1pFUk9fQ0hBUiA9IG5ldyBjaGFyW11bXSB7T05FX1pFUk99OworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEFsbFByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMTUxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLklGaWxlRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEluZGV4QWxsUHJvamVjdCBleHRlbmRzIEluZGV4UmVxdWVzdCBpbXBsZW1lbnRzIElSZXNvdXJjZVZpc2l0b3IgeworCUlQcm9qZWN0IHByb2plY3Q7CisJSW5kZXhNYW5hZ2VyIG1hbmFnZXI7CisJSGFzaHRhYmxlIGluZGV4ZWRGaWxlTmFtZXM7CisJZmluYWwgU3RyaW5nIE9LID0gIk9LIjsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCisJbG9uZyBpbmRleExhc3RNb2RpZmllZDsKKwlwdWJsaWMgSW5kZXhBbGxQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIEluZGV4TWFuYWdlciBtYW5hZ2VyKSB7CisJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisJfQorCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KSB7CisJCXJldHVybiBqb2JGYW1pbHkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKTsKKwl9CitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlpZiAoIShvIGluc3RhbmNlb2YgSW5kZXhBbGxQcm9qZWN0KSkgcmV0dXJuIGZhbHNlOworCXJldHVybiB0aGlzLnByb2plY3QuZXF1YWxzKCgoSW5kZXhBbGxQcm9qZWN0KW8pLnByb2plY3QpOworfQorcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlyZXR1cm4gdGhpcy5wcm9qZWN0Lmhhc2hDb2RlKCk7Cit9CQkKKwkvKioKKwkgKiBFbnN1cmUgY29uc2lzdGVuY3kgb2YgYSBwcm9qZWN0IGluZGV4LiBOZWVkIHRvIHdhbGsgYWxsIG5lc3RlZCByZXNvdXJjZXMsCisJICogYW5kIGRpc2NvdmVyIHJlc291cmNlcyB3aGljaCBoYXZlIGVpdGhlciBiZWVuIGNoYW5nZWQsIGFkZGVkIG9yIGRlbGV0ZWQKKwkgKiBzaW5jZSB0aGUgaW5kZXggd2FzIHByb2R1Y2VkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gQ09NUExFVEU7CisKKwkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKQorCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBub3RoaW5nIHRvIGRvCisKKwkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleChwcm9qZWN0LmdldEZ1bGxQYXRoKCksIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKKwkJaWYgKGluZGV4ID09IG51bGwpCisJCQlyZXR1cm4gQ09NUExFVEU7CisJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCWlmIChtb25pdG9yID09IG51bGwpCisJCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJCXRyeSB7CisJCQltb25pdG9yLmVudGVyUmVhZCgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byByZWFkCisKKwkJCS8qIGlmIGluZGV4IGhhcyBjaGFuZ2VkLCBjb21taXQgdGhlc2UgYmVmb3JlIHF1ZXJ5aW5nICovCisJCQlpZiAoaW5kZXguaGFzQ2hhbmdlZCgpKSB7CisJCQkJdHJ5IHsKKwkJCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jaworCQkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKKwkJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKQorCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaW5kZXguc2F2ZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQltb25pdG9yLmV4aXRXcml0ZUVudGVyUmVhZCgpOyAvLyBmaW5pc2hlZCB3cml0aW5nIGFuZCByZWFjcXVpcmUgcmVhZCBwZXJtaXNzaW9uCisJCQkJfQorCQkJfQorCQkJdGhpcy5pbmRleExhc3RNb2RpZmllZCA9IGluZGV4LmdldEluZGV4RmlsZSgpLmxhc3RNb2RpZmllZCgpOworCisJCQl0aGlzLmluZGV4ZWRGaWxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlKDEwMCk7CisJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXN1bHRzW2ldLmdldFBhdGgoKTsKKwkJCQl0aGlzLmluZGV4ZWRGaWxlTmFtZXMucHV0KGZpbGVOYW1lLCBERUxFVEVEKTsKKwkJCX0KKwkJCUphdmFDb3JlIGphdmFDb3JlID0gSmF2YUNvcmUuZ2V0SmF2YUNvcmUoKTsKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOworCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOyAvL29ubHkgaW50ZXJlc3RlZCBpbiBzb3VyY2UgZm9sZGVycworCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHRoaXMucHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gRkFJTEVEOworCQkJCQorCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisJCQkJLy8gSW5kZXggb25seSB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXJzLgorCQkJCS8vIEluZGV4aW5nIG9mIGxpYnJhcmllcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgam9iCisJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkpIHsKKwkJCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCQlJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5UGF0aCk7CisJCQkJCWlmIChzb3VyY2VGb2xkZXIgIT0gbnVsbCkgeworCQkJCQkJc291cmNlRm9sZGVyLmFjY2VwdCh0aGlzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJRW51bWVyYXRpb24gbmFtZXMgPSBpbmRleGVkRmlsZU5hbWVzLmtleXMoKTsKKwkJCXdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gRkFJTEVEOworCisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOworCQkJCU9iamVjdCB2YWx1ZSA9IGluZGV4ZWRGaWxlTmFtZXMuZ2V0KG5hbWUpOworCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCW1hbmFnZXIuYWRkU291cmNlKChJRmlsZSkgdmFsdWUsIHRoaXMucHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKKwkJCQl9IGVsc2UgaWYgKHZhbHVlID09IERFTEVURUQpIHsKKwkJCQkJbWFuYWdlci5yZW1vdmUobmFtZSwgdGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMucHJvamVjdCArICIgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCW1hbmFnZXIucmVtb3ZlSW5kZXgocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKKwkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5wcm9qZWN0ICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJbWFuYWdlci5yZW1vdmVJbmRleChwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJfQorCQlyZXR1cm4gQ09NUExFVEU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiaW5kZXhpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXRGdWxsUGF0aCgpOyAvLyROT04tTkxTLTEkCisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlpZiAodGhpcy5pc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCWlmICgiamF2YSIuZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKKwkJCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQkJCUZpbGUgcmVzb3VyY2VGaWxlID0gcGF0aC50b0ZpbGUoKTsKKwkJCQkJU3RyaW5nIG5hbWUgPSBuZXcgSUZpbGVEb2N1bWVudCgoSUZpbGUpIHJlc291cmNlKS5nZXROYW1lKCk7CisJCQkJCWlmICh0aGlzLmluZGV4ZWRGaWxlTmFtZXMuZ2V0KG5hbWUpID09IG51bGwpIHsKKwkJCQkJCXRoaXMuaW5kZXhlZEZpbGVOYW1lcy5wdXQobmFtZSwgcmVzb3VyY2UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGhpcy5pbmRleGVkRmlsZU5hbWVzLnB1dCgKKwkJCQkJCQluYW1lLAorCQkJCQkJCXJlc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRoaXMuaW5kZXhMYXN0TW9kaWZpZWQKKwkJCQkJCQkJPyAoT2JqZWN0KSByZXNvdXJjZQorCQkJCQkJCQk6IChPYmplY3QpIE9LKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEJpbmFyeUZvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEJpbmFyeUZvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzM2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QmluYXJ5Rm9sZGVyLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLklGaWxlRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEluZGV4QmluYXJ5Rm9sZGVyIGV4dGVuZHMgSW5kZXhSZXF1ZXN0IHsKKwlJRm9sZGVyIGZvbGRlcjsKKwlJbmRleE1hbmFnZXIgbWFuYWdlcjsKKwlJUHJvamVjdCBwcm9qZWN0OworCXB1YmxpYyBJbmRleEJpbmFyeUZvbGRlcigKKwkJSUZvbGRlciBmb2xkZXIsCisJCUluZGV4TWFuYWdlciBtYW5hZ2VyLAorCQlJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMuZm9sZGVyID0gZm9sZGVyOworCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCX0KKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgeworCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyh0aGlzLnByb2plY3QuZ2V0TmFtZSgpKTsKKwl9CitwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlpZiAoIShvIGluc3RhbmNlb2YgSW5kZXhCaW5hcnlGb2xkZXIpKSByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRoaXMuZm9sZGVyLmVxdWFscygoKEluZGV4QmluYXJ5Rm9sZGVyKW8pLmZvbGRlcik7Cit9CitwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCXJldHVybiB0aGlzLmZvbGRlci5oYXNoQ29kZSgpOworfQorCS8qKgorCSAqIEVuc3VyZSBjb25zaXN0ZW5jeSBvZiBhIGZvbGRlciBpbmRleC4gTmVlZCB0byB3YWxrIGFsbCBuZXN0ZWQgcmVzb3VyY2VzLAorCSAqIGFuZCBkaXNjb3ZlciByZXNvdXJjZXMgd2hpY2ggaGF2ZSBlaXRoZXIgYmVlbiBjaGFuZ2VkLCBhZGRlZCBvciBkZWxldGVkCisJICogc2luY2UgdGhlIGluZGV4IHdhcyBwcm9kdWNlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBDT01QTEVURTsKKworCQlpZiAoIXRoaXMuZm9sZGVyLmlzQWNjZXNzaWJsZSgpKQorCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBub3RoaW5nIHRvIGRvCisKKwkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmZvbGRlci5nZXRGdWxsUGF0aCgpLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCWlmIChpbmRleCA9PSBudWxsKQorCQkJcmV0dXJuIENPTVBMRVRFOworCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAorCQl0cnkgeworCQkJbW9uaXRvci5lbnRlclJlYWQoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gcmVhZAorCisJCQkvKiBpZiBpbmRleCBoYXMgY2hhbmdlZCwgY29tbWl0IHRoZXNlIGJlZm9yZSBxdWVyeWluZyAqLworCQkJaWYgKGluZGV4Lmhhc0NoYW5nZWQoKSkgeworCQkJCXRyeSB7CisJCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gbWVyZ2luZyBpbmRleCAiICsgaW5kZXguZ2V0SW5kZXhGaWxlKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWluZGV4LnNhdmUoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCXJldHVybiBGQUlMRUQ7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJbW9uaXRvci5leGl0V3JpdGVFbnRlclJlYWQoKTsgLy8gZmluaXNoZWQgd3JpdGluZyBhbmQgcmVhY3F1aXJlIHJlYWQgcGVybWlzc2lvbgorCQkJCX0KKwkJCX0KKwkJCWZpbmFsIFN0cmluZyBPSyA9ICJPSyI7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCisJCQlmaW5hbCBsb25nIGluZGV4TGFzdE1vZGlmaWVkID0gaW5kZXguZ2V0SW5kZXhGaWxlKCkubGFzdE1vZGlmaWVkKCk7CisKKwkJCWZpbmFsIEhhc2h0YWJsZSBpbmRleGVkRmlsZU5hbWVzID0gbmV3IEhhc2h0YWJsZSgxMDApOworCQkJSVF1ZXJ5UmVzdWx0W10gcmVzdWx0cyA9IGluZGV4LnF1ZXJ5SW5Eb2N1bWVudE5hbWVzKCIiKTsvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXN1bHRzW2ldLmdldFBhdGgoKTsKKwkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChmaWxlTmFtZSwgREVMRVRFRCk7CisJCQl9CisJCQl0aGlzLmZvbGRlci5hY2NlcHQobmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB7CisJCQkJCWlmIChpc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOworCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOworCQkJCQkJaWYgKChleHRlbnNpb24gIT0gbnVsbCkKKwkJCQkJCQkmJiBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7CisJCQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJCQkJCQlGaWxlIHJlc291cmNlRmlsZSA9IHBhdGgudG9GaWxlKCk7CisJCQkJCQkJCVN0cmluZyBuYW1lID0gbmV3IElGaWxlRG9jdW1lbnQoKElGaWxlKSByZXNvdXJjZSkuZ2V0TmFtZSgpOworCQkJCQkJCQlpZiAoaW5kZXhlZEZpbGVOYW1lcy5nZXQobmFtZSkgPT0gbnVsbCkgeworCQkJCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5wdXQobmFtZSwgcmVzb3VyY2UpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5wdXQoCisJCQkJCQkJCQkJbmFtZSwKKwkJCQkJCQkJCQlyZXNvdXJjZUZpbGUubGFzdE1vZGlmaWVkKCkgPiBpbmRleExhc3RNb2RpZmllZAorCQkJCQkJCQkJCQk/IChPYmplY3QpIHJlc291cmNlCisJCQkJCQkJCQkJCTogKE9iamVjdCkgT0spOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0pOworCQkJRW51bWVyYXRpb24gbmFtZXMgPSBpbmRleGVkRmlsZU5hbWVzLmtleXMoKTsKKwkJCXdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gRkFJTEVEOworCQkJCQorCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkJCQlPYmplY3QgdmFsdWUgPSBpbmRleGVkRmlsZU5hbWVzLmdldChuYW1lKTsKKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQltYW5hZ2VyLmFkZEJpbmFyeSgoSUZpbGUpIHZhbHVlLCB0aGlzLmZvbGRlci5nZXRGdWxsUGF0aCgpKTsKKwkJCQl9IGVsc2UgaWYgKHZhbHVlID09IERFTEVURUQpIHsKKwkJCQkJbWFuYWdlci5yZW1vdmUobmFtZSwgdGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMuZm9sZGVyICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJbWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmZvbGRlci5nZXRGdWxsUGF0aCgpKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKKwkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5mb2xkZXIgKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQltYW5hZ2VyLnJlbW92ZUluZGV4KHRoaXMuZm9sZGVyLmdldEZ1bGxQYXRoKCkpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJfQorCQlyZXR1cm4gQ09NUExFVEU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiaW5kZXhpbmcgYmluYXJ5IGZvbGRlciAiICsgdGhpcy5mb2xkZXIuZ2V0RnVsbFBhdGgoKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwNjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQ5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkRlbHRhUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JbmRleFNlbGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5KYXZhV29ya3NwYWNlU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSUpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgSW5kZXhNYW5hZ2VyIGV4dGVuZHMgSm9iTWFuYWdlciBpbXBsZW1lbnRzIElJbmRleENvbnN0YW50cyB7CisJLyogbnVtYmVyIG9mIGZpbGUgY29udGVudHMgaW4gbWVtb3J5ICovCisJcHVibGljIHN0YXRpYyBpbnQgTUFYX0ZJTEVTX0lOX01FTU9SWSA9IDA7CisJCisJcHVibGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlOworCisJLyogaW5kZXhlcyAqLworCU1hcCBpbmRleGVzID0gbmV3IEhhc2hNYXAoNSk7CisKKwkvKiByZWFkIHdyaXRlIG1vbml0b3JzICovCisJcHJpdmF0ZSBNYXAgbW9uaXRvcnMgPSBuZXcgSGFzaE1hcCg1KTsKKworCS8qIG5lZWQgdG8gc2F2ZSA/ICovCisJcHJpdmF0ZSBib29sZWFuIG5lZWRUb1NhdmUgPSBmYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDUkMzMiBjaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKKwlwcml2YXRlIElQYXRoIGphdmFQbHVnaW5Mb2NhdGlvbiA9IG51bGw7CisJCisJLyogcHJvamVjdHMgdG8gY2hlY2sgY29uc2lzdGVuY3kgZm9yICovCisJSVByb2plY3RbXSBwcm9qZWN0c1RvQ2hlY2sgPSBudWxsOworCQorLyoqCisgKiBCZWZvcmUgcHJvY2Vzc2luZyBhbGwgam9icywgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgaW5kZXhlcyBhcmUgdXAgdG8gZGF0ZS4KKyAqLworcHVibGljIHZvaWQgYWN0aXZhdGVQcm9jZXNzaW5nKCkgeworCXRyeSB7CisJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwMDApOyAvLyB3YWl0IDEwIHNlY29uZHMgc28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoIHBsdWdpbiBzdGFydHVwCisJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwl9CQorCWNoZWNrSW5kZXhDb25zaXN0ZW5jeSgpOworCXN1cGVyLmFjdGl2YXRlUHJvY2Vzc2luZygpOworfQorLyoqCisgKiBUcmlnZ2VyIGFkZGl0aW9uIG9mIGEgcmVzb3VyY2UgdG8gYW4gaW5kZXgKKyAqIE5vdGU6IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBiYWNrZ3JvdW5kCisgKi8KK3B1YmxpYyB2b2lkIGFkZFNvdXJjZShJRmlsZSByZXNvdXJjZSwgSVBhdGggaW5kZXhlZENvbnRhaW5lcil7CisJaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsJCisJQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleCBqb2IgPSBuZXcgQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleChyZXNvdXJjZSwgdGhpcywgaW5kZXhlZENvbnRhaW5lcik7CisJaWYgKHRoaXMuYXdhaXRpbmdKb2JzQ291bnQoKSA8IE1BWF9GSUxFU19JTl9NRU1PUlkpIHsKKwkJam9iLmluaXRpYWxpemVDb250ZW50cygpOworCX0KKwlyZXF1ZXN0KGpvYik7Cit9CisvKioKKyAqIFRyaWdnZXIgYWRkaXRpb24gb2YgYSByZXNvdXJjZSB0byBhbiBpbmRleAorICogTm90ZTogdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGJhY2tncm91bmQKKyAqLworcHVibGljIHZvaWQgYWRkQmluYXJ5KElGaWxlIHJlc291cmNlLCBJUGF0aCBpbmRleGVkQ29udGFpbmVyKXsKKwlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOwkKKwlBZGRDbGFzc0ZpbGVUb0luZGV4IGpvYiA9IG5ldyBBZGRDbGFzc0ZpbGVUb0luZGV4KHJlc291cmNlLCB0aGlzLCBpbmRleGVkQ29udGFpbmVyKTsKKwlpZiAodGhpcy5hd2FpdGluZ0pvYnNDb3VudCgpIDwgTUFYX0ZJTEVTX0lOX01FTU9SWSkgeworCQlqb2IuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7CisJfQorCXJlcXVlc3Qoam9iKTsKK30KKy8qKgorICogSW5kZXggdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBmb2xkZXIuCisgKi8KK3B1YmxpYyB2b2lkIGluZGV4U291cmNlRm9sZGVyKEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUGF0aCBzb3VyY2VGb2xkZXIpIHsKKwlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworCWZpbmFsIElQYXRoIGNvbnRhaW5lciA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKKwlJQ29udGFpbmVyIGZvbGRlcjsKKwlpZiAoY29udGFpbmVyLmVxdWFscyhzb3VyY2VGb2xkZXIpKSB7CisJCWZvbGRlciA9IHByb2plY3Q7CisJfSBlbHNlIHsKKwkJZm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIoc291cmNlRm9sZGVyKTsKKwl9CisJdHJ5IHsKKwkJZm9sZGVyLmFjY2VwdChuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKwkJCS8qCisJCQkgKiBAc2VlIElSZXNvdXJjZVZpc2l0b3IjdmlzaXQoSVJlc291cmNlKQorCQkJICovCisJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQlpZiAoImphdmEiLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAgLy8kTk9OLU5MUy0xJAorCQkJCQkJYWRkU291cmNlKChJRmlsZSlyZXNvdXJjZSwgY29udGFpbmVyKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJLy8gRm9sZGVyIGRvZXMgbm90IGV4aXN0LgorCQkvLyBJdCB3aWxsIGJlIGluZGV4ZWQgb25seSB3aGVuIERlbHRhUHJvY2Vzc29yIGRldGVjdHMgaXRzIGFkZGl0aW9uCisJfQorfQorLyoqCisgKiBFbnN1cmVzIHRoYXQgaW5kZXhlcyBhcmUgdXAgdG8gZGF0ZSB3aXRoIHdvcmtiZW5jaCBjb250ZW50LiBUeXBpY2FsbHkKKyAqIGl0IGlzIGludm9rZWQgaW4gYmFja2dyb3VuZCB3aGVuIGFjdGl2YXRlIHRoZSBqb2IgcHJvY2Vzc2luZy4KKyAqLworcHVibGljIHZvaWQgY2hlY2tJbmRleENvbnNpc3RlbmN5KCkgeworCisJaWYgKFZFUkJPU0UpIEpvYk1hbmFnZXIudmVyYm9zZSgiU1RBUlRJTkcgZW5zdXJpbmcgY29uc2lzdGVuY3kiKTsgLy8kTk9OLU5MUy0xJAorCisJYm9vbGVhbiB3YXNFbmFibGVkID0gaXNFbmFibGVkKCk7CQorCXRyeSB7CisJCWRpc2FibGUoKTsKKworCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9ICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCWlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgcmV0dXJuOyAvLyBOQjogd29ya3NwYWNlIGNhbiBiZSBudWxsIGlmIGl0IGhhcyBzaHV0IGRvd24gKHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTc1KQorCQlpZiAodGhpcy5wcm9qZWN0c1RvQ2hlY2sgIT0gbnVsbCl7CisJCQlJUHJvamVjdFtdIHByb2plY3RzID0gdGhpcy5wcm9qZWN0c1RvQ2hlY2s7CisJCQl0aGlzLnByb2plY3RzVG9DaGVjayA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCQkvLyBub3Qgb25seSBqYXZhIHByb2plY3QsIGdpdmVuIGF0IHN0YXJ0dXAgbmF0dXJlIG1heSBub3QgaGF2ZSBiZWVuIHNldCB5ZXQKKwkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgeyAKKwkJCQkJaW5kZXhBbGwocHJvamVjdCk7CisJCQkJfQorCQkJfQorCQl9CisJfSBmaW5hbGx5IHsKKwkJaWYgKHdhc0VuYWJsZWQpIGVuYWJsZSgpOworCQlpZiAoVkVSQk9TRSkgSm9iTWFuYWdlci52ZXJib3NlKCJET05FIGVuc3VyaW5nIGNvbnNpc3RlbmN5Iik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9Citwcml2YXRlIFN0cmluZyBjb21wdXRlSW5kZXhOYW1lKElQYXRoIHBhdGgpIHsKKwkKKwlTdHJpbmcgcGF0aFN0cmluZyA9IHBhdGgudG9PU1N0cmluZygpOworCWJ5dGVbXSBwYXRoQnl0ZXMgPSBwYXRoU3RyaW5nLmdldEJ5dGVzKCk7CisJY2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7CisJY2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoQnl0ZXMpOworCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5pbmRleCI7IC8vJE5PTi1OTFMtMSQKKwlpZiAoVkVSQk9TRSkgSm9iTWFuYWdlci52ZXJib3NlKCItPiBpbmRleCBuYW1lIGZvciAiICsgcGF0aFN0cmluZyArICIgaXMgIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJSVBhdGggaW5kZXhQYXRoID0gZ2V0SmF2YVBsdWdpbldvcmtpbmdMb2NhdGlvbigpOworCVN0cmluZyBpbmRleERpcmVjdG9yeSA9IGluZGV4UGF0aC50b09TU3RyaW5nKCk7CisJaWYgKGluZGV4RGlyZWN0b3J5LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworCQlyZXR1cm4gaW5kZXhEaXJlY3RvcnkgKyBmaWxlTmFtZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaW5kZXhEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOworCX0gCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gcHJvamVjdCwgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorICogLSBpZiBpbmRleCBpcyBhbHJlYWR5IGluIG1lbW9yeTogYW5zd2VycyB0aGlzIG9uZSBiYWNrCisgKiAtIGlmIChyZXVzZUV4aXN0aW5nRmlsZSkgdGhlbiByZWFkIGl0IGFuZCByZXR1cm4gdGhpcyBpbmRleCBhbmQgcmVjb3JkIGl0IGluIG1lbW9yeQorICogLSBpZiAoY3JlYXRlSWZNaXNzaW5nKSB0aGVuIGNyZWF0ZSBhIG5ldyBlbXB0eSBpbmRleCBhbmQgcmVjb3JkIGl0IGluIG1lbW9yeQorICogCisgKiBXYXJuaW5nOiBEb2VzIG5vdCBjaGVjayB3aGV0aGVyIGluZGV4IGlzIGNvbnNpc3RlbnQgKG5vdCBiZWluZyB1c2VkKQorICovCitwdWJsaWMgc3luY2hyb25pemVkIElJbmRleCBnZXRJbmRleChJUGF0aCBwYXRoLCBib29sZWFuIHJldXNlRXhpc3RpbmdGaWxlLCBib29sZWFuIGNyZWF0ZUlmTWlzc2luZykgeworCS8vIFBhdGggaXMgYWxyZWFkeSBjYW5vbmljYWwgcGVyIGNvbnN0cnVjdGlvbgorCUlJbmRleCBpbmRleCA9IChJSW5kZXgpIGluZGV4ZXMuZ2V0KHBhdGgpOworCWlmIChpbmRleCA9PSBudWxsKSB7CisJCXRyeSB7CisJCQlTdHJpbmcgaW5kZXhQYXRoID0gbnVsbDsKKwkJCQorCQkJLy8gaW5kZXggaXNuJ3QgY2FjaGVkLCBjb25zaWRlciByZXVzaW5nIGFuIGV4aXN0aW5nIGluZGV4IGZpbGUKKwkJCWlmIChyZXVzZUV4aXN0aW5nRmlsZSl7CisJCQkJaW5kZXhQYXRoID0gY29tcHV0ZUluZGV4TmFtZShwYXRoKTsKKwkJCQlGaWxlIGluZGV4RmlsZSA9IG5ldyBGaWxlKGluZGV4UGF0aCk7CisJCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSl7IC8vIGNoZWNrIGJlZm9yZSBjcmVhdGluZyBpbmRleCBzbyBhcyB0byBhdm9pZCBjcmVhdGluZyBhIG5ldyBlbXB0eSBpbmRleCBpZiBmaWxlIGlzIG1pc3NpbmcKKwkJCQkJaW5kZXggPSBuZXcgSW5kZXgoaW5kZXhQYXRoLCAiSW5kZXggZm9yICIgKyBwYXRoLnRvT1NTdHJpbmcoKSwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGluZGV4ICE9IG51bGwpeworCQkJCQkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOworCQkJCQkJbW9uaXRvcnMucHV0KGluZGV4LCBuZXcgUmVhZFdyaXRlTW9uaXRvcigpKTsKKwkJCQkJCXJldHVybiBpbmRleDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gCisJCQkvLyBpbmRleCB3YXNuJ3QgZm91bmQgb24gZGlzaywgY29uc2lkZXIgY3JlYXRpbmcgYW4gZW1wdHkgbmV3IG9uZQorCQkJaWYgKGNyZWF0ZUlmTWlzc2luZyl7CisJCQkJaWYgKGluZGV4UGF0aCA9PSBudWxsKSBpbmRleFBhdGggPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOworCQkJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4UGF0aCwgIkluZGV4IGZvciAiICsgcGF0aC50b09TU3RyaW5nKCksIGZhbHNlIC8qZG8gbm90IHJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoaW5kZXggIT0gbnVsbCl7CisJCQkJCWluZGV4ZXMucHV0KHBhdGgsIGluZGV4KTsKKwkJCQkJbW9uaXRvcnMucHV0KGluZGV4LCBuZXcgUmVhZFdyaXRlTW9uaXRvcigpKTsKKwkJCQkJcmV0dXJuIGluZGV4OworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBvc3NpYmxlIHJlYXNvbjogdGhlIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8vU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiA8LS0tLT4gIiArIGluZGV4LmdldEluZGV4RmlsZSgpLmdldE5hbWUoKSk7CQorCXJldHVybiBpbmRleDsKK30KK3ByaXZhdGUgSVBhdGggZ2V0SmF2YVBsdWdpbldvcmtpbmdMb2NhdGlvbigpIHsKKwlpZiAoamF2YVBsdWdpbkxvY2F0aW9uID09IG51bGwpIHsKKwkJamF2YVBsdWdpbkxvY2F0aW9uID0gSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCX0KKwlyZXR1cm4gamF2YVBsdWdpbkxvY2F0aW9uOworfQorLyoqCisgKiBJbmRleCBhY2Nlc3MgaXMgY29udHJvbGxlZCB0aHJvdWdoIGEgcmVhZC13cml0ZSBtb25pdG9yIHNvIGFzCisgKiB0byBlbnN1cmUgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zCisgKiAob25seSBjb25jdXJyZW50IHJlYWRpbmcgaXMgYWxsb3dlZCkuCisgKi8KK3B1YmxpYyBSZWFkV3JpdGVNb25pdG9yIGdldE1vbml0b3JGb3IoSUluZGV4IGluZGV4KXsKKwkKKwlyZXR1cm4gKFJlYWRXcml0ZU1vbml0b3IpbW9uaXRvcnMuZ2V0KGluZGV4KTsKK30KKy8qKgorICogVHJpZ2dlciBhZGRpdGlvbiBvZiB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBwcm9qZWN0CisgKiBOb3RlOiB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gYmFja2dyb3VuZCAKKyAqLworcHVibGljIHZvaWQgaW5kZXhBbGwoSVByb2plY3QgcHJvamVjdCkgeworCWlmIChKYXZhQ29yZS5nZXRQbHVnaW4oKSA9PSBudWxsKSByZXR1cm47CisKKwkvLyBBbHNvIHJlcXVlc3QgaW5kZXhpbmcgb2YgYmluYXJpZXMgb24gdGhlIGNsYXNzcGF0aAorCS8vIGRldGVybWluZSB0aGUgbmV3IGNoaWxkcmVuCisJdHJ5IHsKKwkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoKEphdmFNb2RlbCkgbW9kZWwpLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwkKKwkJLy8gb25seSBjb25zaWRlciBpbW1lZGlhdGUgbGlicmFyaWVzIC0gZWFjaCBwcm9qZWN0IHdpbGwgZG8gdGhlIHNhbWUKKwkJLy8gTk9URTogZm9yY2UgdG8gcmVzb2x2ZSBDUCB2YXJpYWJsZXMgYmVmb3JlIGNhbGxpbmcgaW5kZXhlciAtIDE5MzAzLCBzbyB0aGF0IGluaXRpYWxpemVycworCQkvLyB3aWxsIGJlIHJ1biBpbiB0aGUgY3VycmVudCB0aHJlYWQuCisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5PSBlbnRyaWVzW2ldOworCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCXRoaXMuaW5kZXhMaWJyYXJ5KGVudHJ5LmdldFBhdGgoKSwgcHJvamVjdCk7CisJCQl9CisJCX0KKwl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsgLy8gY2Fubm90IHJldHJpZXZlIGNsYXNzcGF0aCBpbmZvCisJfQkKKwl0aGlzLnJlcXVlc3QobmV3IEluZGV4QWxsUHJvamVjdChwcm9qZWN0LCB0aGlzKSk7Cit9CisKKworLyoqCisgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBqb2IsIG9uY2UgdGhlIGN1cnJlbnQgb25lIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAqIE5vdGU6IGNsaWVudHMgYXdhaXRpbmcgdW50aWwgdGhlIGpvYiBjb3VudCBpcyB6ZXJvIGFyZSBzdGlsbCB3YWl0aW5nIGF0IHRoaXMgcG9pbnQuCisgKi8KK3Byb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlVG9OZXh0Sm9iKCkgeworCisJLy8gcmVtZW1iZXIgdGhhdCBvbmUgam9iIHdhcyBleGVjdXRlZCwgYW5kIHdlIHdpbGwgbmVlZCB0byBzYXZlIGluZGV4ZXMgYXQgc29tZSBwb2ludAorCW5lZWRUb1NhdmUgPSB0cnVlOworCXN1cGVyLm1vdmVUb05leHRKb2IoKTsKK30KKy8qKgorICogTm8gbW9yZSBqb2IgYXdhaXRpbmcuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG5vdGlmeUlkbGUobG9uZyBpZGxpbmdUaW1lKXsKKwlpZiAoaWRsaW5nVGltZSA+IDEwMDAgJiYgbmVlZFRvU2F2ZSkgc2F2ZUluZGV4ZXMoKTsKK30KKy8qKgorICogTmFtZSBvZiB0aGUgYmFja2dyb3VuZCBwcm9jZXNzCisgKi8KK3B1YmxpYyBTdHJpbmcgcHJvY2Vzc05hbWUoKXsKKwlyZXR1cm4gVXRpbC5iaW5kKCJwcm9jZXNzLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAorfQorCisvKioKKyAqIFJlY3JlYXRlcyB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gcGF0aCwga2VlcGluZyB0aGUgc2FtZSByZWFkLXdyaXRlIG1vbml0b3IuCisgKiBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgaW5kZXggb3IgbnVsbCBpZiBpdCBkaWRuJ3QgZXhpc3QgYmVmb3JlLgorICogV2FybmluZzogRG9lcyBub3QgY2hlY2sgd2hldGhlciBpbmRleCBpcyBjb25zaXN0ZW50IChub3QgYmVpbmcgdXNlZCkKKyAqLworcHVibGljIHN5bmNocm9uaXplZCBJSW5kZXggcmVjcmVhdGVJbmRleChJUGF0aCBwYXRoKSB7CisJSUluZGV4IGluZGV4ID0gKElJbmRleCkgaW5kZXhlcy5nZXQocGF0aCk7CisJaWYgKGluZGV4ICE9IG51bGwpIHsKKwkJdHJ5IHsKKwkJCS8vIFBhdGggaXMgYWxyZWFkeSBjYW5vbmljYWwKKwkJCVN0cmluZyBpbmRleFBhdGggPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOworCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gKFJlYWRXcml0ZU1vbml0b3IpbW9uaXRvcnMucmVtb3ZlKGluZGV4KTsKKwkJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4UGF0aCwgIkluZGV4IGZvciAiICsgcGF0aC50b09TU3RyaW5nKCksIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8pOyAvLyROT04tTkxTLTEkCisJCQlpbmRleC5lbXB0eSgpOworCQkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOworCQkJbW9uaXRvcnMucHV0KGluZGV4LCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBvc3NpYmxlIHJlYXNvbjogdGhlIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8vU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiA8LS0tLT4gIiArIGluZGV4LmdldEluZGV4RmlsZSgpLmdldE5hbWUoKSk7CQorCXJldHVybiBpbmRleDsKK30KKy8qKgorICogVHJpZ2dlciByZW1vdmFsIG9mIGEgcmVzb3VyY2UgdG8gYW4gaW5kZXgKKyAqIE5vdGU6IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBiYWNrZ3JvdW5kCisgKi8KK3B1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBJUGF0aCBpbmRleGVkQ29udGFpbmVyKXsKKwlyZXF1ZXN0KG5ldyBSZW1vdmVGcm9tSW5kZXgocmVzb3VyY2VOYW1lLCBpbmRleGVkQ29udGFpbmVyLCB0aGlzKSk7Cit9CisvKioKKyAqIFJlbW92ZXMgdGhlIGluZGV4IGZvciBhIGdpdmVuIHBhdGguIAorICogVGhpcyBpcyBhIG5vLW9wIGlmIHRoZSBpbmRleCBkaWQgbm90IGV4aXN0LgorICovCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5kZXgoSVBhdGggcGF0aCkgeworCUlJbmRleCBpbmRleCA9IChJSW5kZXgpdGhpcy5pbmRleGVzLmdldChwYXRoKTsKKwlpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuOworCWluZGV4LmdldEluZGV4RmlsZSgpLmRlbGV0ZSgpOworCXRoaXMuaW5kZXhlcy5yZW1vdmUocGF0aCk7CisJdGhpcy5tb25pdG9ycy5yZW1vdmUoaW5kZXgpOworfQorLyoqCisgKiBSZW1vdmVzIGFsbCBpbmRleGVzIHdob3NlIHBhdGhzIHN0YXJ0IHdpdGggKG9yIGFyZSBlcXVhbCB0bykgdGhlIGdpdmVuIHBhdGguIAorICovCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5kZXhGYW1pbHkoSVBhdGggcGF0aCkgeworCUFycmF5TGlzdCB0b1JlbW92ZSA9IG51bGw7CisJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmluZGV4ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCUlQYXRoIGluZGV4UGF0aCA9IChJUGF0aClpdGVyYXRvci5uZXh0KCk7CisJCWlmIChwYXRoLmlzUHJlZml4T2YoaW5kZXhQYXRoKSkgeworCQkJaWYgKHRvUmVtb3ZlID09IG51bGwpIHsKKwkJCQl0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCX0KKwkJCXRvUmVtb3ZlLmFkZChpbmRleFBhdGgpOworCQl9CisJfQorCWlmICh0b1JlbW92ZSAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0b1JlbW92ZS5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJdGhpcy5yZW1vdmVJbmRleCgoSVBhdGgpdG9SZW1vdmUuZ2V0KGkpKTsKKwkJfQorCX0KK30KKy8qKgorICogUmVtb3ZlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVyIGZyb20gdGhlIGluZGV4LgorICovCitwdWJsaWMgdm9pZCByZW1vdmVTb3VyY2VGb2xkZXJGcm9tSW5kZXgoSmF2YVByb2plY3QgamF2YVByb2plY3QsIElQYXRoIHNvdXJjZUZvbGRlcikgeworCXRoaXMucmVxdWVzdChuZXcgUmVtb3ZlRm9sZGVyRnJvbUluZGV4KHNvdXJjZUZvbGRlci50b1N0cmluZygpLCBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSwgdGhpcykpOworfQorCisvKioKKyAqIEZsdXNoIGN1cnJlbnQgc3RhdGUKKyAqLworcHVibGljIHZvaWQgcmVzZXQoKXsKKworCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCWlmICh3b3Jrc3BhY2UgIT0gbnVsbCl7CisJCS8vIGZvcmNlIHRvIHJlc29sdmUgY2xhc3NwYXRocyBmb3IgcHJvamVjdHMgdG8gY2hlY2ssIHNvIGFzIHRvIGF2b2lkIHJ1bm5pbmcgQ1AgdmFyaWFibGUgaW5pdGlhbGl6ZXJzIGluIHRoZSBiYWNrZ3JvdW5kIHRocmVhZAorCQl0aGlzLnByb2plY3RzVG9DaGVjayA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMucHJvamVjdHNUb0NoZWNrID09IG51bGwgPyAwIDogdGhpcy5wcm9qZWN0c1RvQ2hlY2subGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodGhpcy5wcm9qZWN0c1RvQ2hlY2tbaV0pOworCQkJdHJ5IHsKKwkJCQkvLyBmb3JjZSB0byByZXNvbHZlIENQIHZhcmlhYmxlcyBiZWZvcmUgY2FsbGluZyBpbmRleGVyIC0gMTkzMDMgKGluZGlyZWN0bHkgdGhyb3VnaCBjb25zaXN0ZW5jeSBjaGVjaykKKwkJCQlwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfSAKKwl9CisJc3VwZXIucmVzZXQoKTsKKwlpZiAoaW5kZXhlcyAhPSBudWxsKXsKKwkJaW5kZXhlcyA9IG5ldyBIYXNoTWFwKDUpOworCQltb25pdG9ycyA9IG5ldyBIYXNoTWFwKDUpOworCX0KKwlqYXZhUGx1Z2luTG9jYXRpb24gPSBudWxsOworfQorLyoqCisgKiBDb21taXQgYWxsIGluZGV4IG1lbW9yeSBjaGFuZ2VzIHRvIGRpc2sKKyAqLworcHVibGljIHZvaWQgc2F2ZUluZGV4ZXMoKXsKKworCUFycmF5TGlzdCBpbmRleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJc3luY2hyb25pemVkKHRoaXMpeworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmRleGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7CisJCQlpbmRleExpc3QuYWRkKGl0ZXIubmV4dCgpKTsKKwkJfQorCX0KKworCWZvciAoSXRlcmF0b3IgaXRlciA9IGluZGV4TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewkJCisJCUlJbmRleCBpbmRleCA9IChJSW5kZXgpaXRlci5uZXh0KCk7CisJCWlmIChpbmRleCA9PSBudWxsKSBjb250aW51ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCWlmIChtb25pdG9yID09IG51bGwpIGNvbnRpbnVlOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAorCQl0cnkgeworCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7CisJCQlpZiAoSW5kZXhNYW5hZ2VyLlZFUkJPU0UpeworCQkJCWlmIChpbmRleC5oYXNDaGFuZ2VkKCkpeyAKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCQl0cnkgeworCQkJCWluZGV4LnNhdmUoKTsKKwkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7CisJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSB7CisJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZ290IHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHdoaWxlIG1lcmdpbmc6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQkJLy9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLmxvZyhlKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZXhpdFdyaXRlKCk7CisJCX0KKwl9CisJbmVlZFRvU2F2ZSA9IGZhbHNlOworfQorCitwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKwkKKwlIYXNoTWFwIGtlZXBpbmdJbmRleGVzUGF0aHMgPSBuZXcgSGFzaE1hcCgpOworCUluZGV4U2VsZWN0b3IgaW5kZXhTZWxlY3RvciA9IG5ldyBJbmRleFNlbGVjdG9yKG5ldyBKYXZhV29ya3NwYWNlU2NvcGUoKSwgbnVsbCwgdGhpcyk7CisJSUluZGV4W10gc2VsZWN0ZWRJbmRleGVzID0gaW5kZXhTZWxlY3Rvci5nZXRJbmRleGVzKCk7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHNlbGVjdGVkSW5kZXhlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlTdHJpbmcgcGF0aCA9IHNlbGVjdGVkSW5kZXhlc1tpXS5nZXRJbmRleEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJa2VlcGluZ0luZGV4ZXNQYXRocy5wdXQocGF0aCwgcGF0aCk7CisJfQorCUZpbGUgaW5kZXhlc0RpcmVjdG9yeSA9IG5ldyBGaWxlKHRoaXMuZ2V0SmF2YVBsdWdpbldvcmtpbmdMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7CisJaWYgKGluZGV4ZXNEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworCQlGaWxlW10gaW5kZXhlc0ZpbGVzID0gaW5kZXhlc0RpcmVjdG9yeS5saXN0RmlsZXMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGluZGV4ZXNGaWxlc0xlbmd0aCA9IGluZGV4ZXNGaWxlcy5sZW5ndGg7IGkgPCBpbmRleGVzRmlsZXNMZW5ndGg7IGkrKykgeworCQkJU3RyaW5nIGZpbGVOYW1lID0gaW5kZXhlc0ZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpOworCQkJaWYgKGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5pbmRleCIpICYmIGtlZXBpbmdJbmRleGVzUGF0aHMuZ2V0KGZpbGVOYW1lKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoVkVSQk9TRSkgeworCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkRlbGV0aW5nIGluZGV4IGZpbGUgIiArIGluZGV4ZXNGaWxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJaW5kZXhlc0ZpbGVzW2ldLmRlbGV0ZSgpOworCQkJfQorCQl9CisJCQorCX0KKwlzdXBlci5zaHV0ZG93bigpOwkJCit9CisKKy8qKgorICogVHJpZ2dlciBhZGRpdGlvbiBvZiBhIGxpYnJhcnkgdG8gYW4gaW5kZXgKKyAqIE5vdGU6IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBiYWNrZ3JvdW5kCisgKi8KK3B1YmxpYyB2b2lkIGluZGV4TGlicmFyeShJUGF0aCBwYXRoLCBJUHJvamVjdCByZWZlcmluZ1Byb2plY3QpIHsKKwlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOworCisJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgcGF0aCwgdHJ1ZSk7CisJCisJSW5kZXhSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOworCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRmlsZSkgeworCQlyZXF1ZXN0ID0gbmV3IEFkZEphckZpbGVUb0luZGV4KChJRmlsZSl0YXJnZXQsIHRoaXMsIHJlZmVyaW5nUHJvamVjdC5nZXROYW1lKCkpOworCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKSB7CisJCS8vIHJlbWVtYmVyIHRoZSB0aW1lc3RhbXAgb2YgdGhpcyBsaWJyYXJ5CisJCWxvbmcgdGltZXN0YW1wID0gRGVsdGFQcm9jZXNzb3IuZ2V0VGltZVN0YW1wKChqYXZhLmlvLkZpbGUpdGFyZ2V0KTsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFQcm9jZXNzb3IuZXh0ZXJuYWxUaW1lU3RhbXBzLnB1dChwYXRoLCBuZXcgTG9uZyh0aW1lc3RhbXApKTsKKwkJcmVxdWVzdCA9IG5ldyBBZGRKYXJGaWxlVG9JbmRleChwYXRoLCB0aGlzLCByZWZlcmluZ1Byb2plY3QuZ2V0TmFtZSgpKTsKKwl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJcmVxdWVzdCA9IG5ldyBJbmRleEJpbmFyeUZvbGRlcigoSUZvbGRlcil0YXJnZXQsIHRoaXMsIHJlZmVyaW5nUHJvamVjdCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKwkKKwkvLyBjaGVjayBpZiB0aGUgc2FtZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZQorCWZvciAoaW50IGkgPSB0aGlzLmpvYkVuZDsgaSA+PSB0aGlzLmpvYlN0YXJ0OyBpLS0pIHsKKwkJSUpvYiBhd2FpdGluZyA9IHRoaXMuYXdhaXRpbmdKb2JzW2ldOworCQlpZiAoYXdhaXRpbmcgIT0gbnVsbCAmJiByZXF1ZXN0LmVxdWFscyhhd2FpdGluZykpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXRoaXMucmVxdWVzdChyZXF1ZXN0KTsKK30KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleFJlcXVlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyYTk4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSUpvYjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEluZGV4UmVxdWVzdCBpbXBsZW1lbnRzIElKb2IgeworCQorCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxsZWQgPSBmYWxzZTsKKworCS8qCisJICogQHNlZSBJSm9iI2NhbmNlbCgpCisJICovCisJcHVibGljIHZvaWQgY2FuY2VsKCkgeworCQl0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVhZFdyaXRlTW9uaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZWFkV3JpdGVNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1NmVhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVhZFdyaXRlTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworLyoqCisgKiBNb25pdG9yIGVuc3VyaW5nIG5vIG1vcmUgdGhhbiBvbmUgd3JpdGVyIHdvcmtpbmcgY29uY3VycmVudGx5LgorICogTXVsdGlwbGUgcmVhZGVycyBhcmUgYWxsb3dlZCB0byBwZXJmb3JtIHNpbXVsdGFuZW91c2x5LgorICovCitwdWJsaWMgY2xhc3MgUmVhZFdyaXRlTW9uaXRvciB7CisKKwkvKioKKwkgKiA8MCA6IHdyaXRpbmcgKGNhbm5vdCBnbyBiZXlvbmQgLTEsIGkuZSBvbmUgY29uY3VycmVudCB3cml0ZXIpCisJICogPTAgOiBpZGxlCisJICogPjAgOiByZWFkaW5nIChudW1iZXIgb2YgY29uY3VycmVudCByZWFkZXJzKQorCSAqLworCXByaXZhdGUgaW50IHN0YXR1cyA9IDA7CisvKioKKyAqIENvbmN1cnJlbnQgcmVhZGluZyBpcyBhbGxvd2VkCisgKiBCbG9ja2luZyBvbmx5IHdoZW4gYWxyZWFkeSB3cml0aW5nLgorICovCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW50ZXJSZWFkKCkgeworCisJd2hpbGUgKHN0YXR1cyA8IDApeworCQl0cnkgeworCQkJd2FpdCgpOworCQl9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpeworCQl9CisJfQorCXN0YXR1cysrOworfQorLyoqCisgKiBPbmx5IG9uZSB3cml0ZXIgYXQgYSB0aW1lIGlzIGFsbG93ZWQgdG8gcGVyZm9ybQorICogQmxvY2tpbmcgb25seSB3aGVuIGFscmVhZHkgd3JpdGluZyBvciByZWFkaW5nLgorICovCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW50ZXJXcml0ZSgpIHsKKworCXdoaWxlIChzdGF0dXMgIT0gMCl7CisJCXRyeSB7CisJCQl3YWl0KCk7CisJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisJCX0KKwl9CisJc3RhdHVzLS07Cit9CisvKioKKyAqIE9ubHkgbm90aWZ5IHdhaXRpbmcgd3JpdGVyKHMpIGlmIGxhc3QgcmVhZGVyCisgKi8KK3B1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleGl0UmVhZCgpIHsKKworCWlmICgtLXN0YXR1cyA9PSAwKSBub3RpZnlBbGwoKTsKK30KKy8qKgorICogV2hlbiB3cml0aW5nIGlzIG92ZXIsIGFsbCByZWFkZXJzIGFuZCBwb3NzaWJsZQorICogd3JpdGVycyBhcmUgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIHJlc3RhcnQgY29uY3VycmVudGx5CisgKi8KK3B1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleGl0V3JpdGUoKSB7CisKKwlpZiAoKytzdGF0dXMgPT0gMCkgbm90aWZ5QWxsKCk7Cit9CisvKioKKyAqIEF0b21pYyBleGl0V3JpdGUvZW50ZXJSZWFkOiBBbGxvd3MgdG8ga2VlcCBtb25pdG9yIGluIGJldHdlZW4KKyAqIGV4aXQgd3JpdGUgYW5kIG5leHQgZW50ZXIgcmVhZC4KKyAqIFdoZW4gd3JpdGluZyBpcyBvdmVyLCBhbGwgcmVhZGVycyBhcmUgZ3JhbnRlZCBwZXJtaXNzaW5nIHRvIHJlc3RhcnQKKyAqIGNvbmN1cnJlbnRseS4KKyAqIFRoaXMgaXMgdGhlIHNhbWUgYXM6CisgKiA8cHJlPgorICogc3luY2hyb25pemVkKG1vbml0b3IpIHsKKyAqICAgbW9uaXRvci5leGl0V3JpdGUoKTsKKyAqICAgbW9uaXRvci5lbnRlclJlYWQoKTsKKyAqIH0KKyAqIDwvcHJlPgorICovCitwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZXhpdFdyaXRlRW50ZXJSZWFkKCkgeworCXRoaXMuZXhpdFdyaXRlKCk7CisJdGhpcy5lbnRlclJlYWQoKTsKK30gCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZvbGRlckZyb21JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY3NWNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSUpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworCitjbGFzcyBSZW1vdmVGb2xkZXJGcm9tSW5kZXggaW1wbGVtZW50cyBJSm9iIHsKKwlTdHJpbmcgZm9sZGVyUGF0aDsKKwlJUGF0aCBpbmRleGVkQ29udGFpbmVyOworCUluZGV4TWFuYWdlciBtYW5hZ2VyOworCXB1YmxpYyBSZW1vdmVGb2xkZXJGcm9tSW5kZXgoCisJCVN0cmluZyBmb2xkZXJQYXRoLAorCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyLAorCQlJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQl0aGlzLmZvbGRlclBhdGggPSBmb2xkZXJQYXRoOworCQl0aGlzLmluZGV4ZWRDb250YWluZXIgPSBpbmRleGVkQ29udGFpbmVyOworCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworCX0KKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgeworCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyhpbmRleGVkQ29udGFpbmVyLnNlZ21lbnQoMCkpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCQorCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOworCQkKKwkJdHJ5IHsKKwkJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleGVkQ29udGFpbmVyLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCQlpZiAoaW5kZXggPT0gbnVsbCkKKwkJCQlyZXR1cm4gQ09NUExFVEU7CisKKwkJCS8qIGVuc3VyZSBubyBjb25jdXJyZW50IHdyaXRlIGFjY2VzcyB0byBpbmRleCAqLworCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKKwkJCWlmIChtb25pdG9yID09IG51bGwpCisJCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAorCQkJdHJ5IHsKKwkJCQltb25pdG9yLmVudGVyUmVhZCgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byByZWFkCisJCQkJSVF1ZXJ5UmVzdWx0W10gcmVzdWx0cyA9IGluZGV4LnF1ZXJ5SW5Eb2N1bWVudE5hbWVzKHRoaXMuZm9sZGVyUGF0aCk7IC8vIGFsbCBmaWxlIG5hbWVzIGJlb25sb25naW5nIHRvIHRoZSBmb2xkZXIgb3IgaXRzIHN1YmZvbGRlcnMKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzdWx0c1tpXS5nZXRQYXRoKCk7CisJCQkJCW1hbmFnZXIucmVtb3ZlKGZpbGVOYW1lLCB0aGlzLmluZGV4ZWRDb250YWluZXIpOyAvLyB3cml0ZSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkgdGhlIHJlbW92ZSBvcGVyYXRpb24KKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgeworCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIHJlbW92ZSAiICsgdGhpcy5mb2xkZXJQYXRoICsgIiBmcm9tIGluZGV4IGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJCXJldHVybiBDT01QTEVURTsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJyZW1vdmluZyBmcm9tIGluZGV4ICIgKyB0aGlzLmZvbGRlclBhdGg7IC8vJE5PTi1OTFMtMSQKKwl9CisJLyoKKwkgKiBAc2VlIElKb2IjY2FuY2VsKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZyb21JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI3ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5JSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CisKK2NsYXNzIFJlbW92ZUZyb21JbmRleCBpbXBsZW1lbnRzIElKb2IgeworCVN0cmluZyByZXNvdXJjZU5hbWU7CisJSVBhdGggaW5kZXhlZENvbnRhaW5lcjsKKwlJbmRleE1hbmFnZXIgbWFuYWdlcjsKKwlwdWJsaWMgUmVtb3ZlRnJvbUluZGV4KAorCQlTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyLAorCQlJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQl0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKwkJdGhpcy5pbmRleGVkQ29udGFpbmVyID0gaW5kZXhlZENvbnRhaW5lcjsKKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKwl9CisJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKFN0cmluZyBqb2JGYW1pbHkpIHsKKwkJcmV0dXJuIGpvYkZhbWlseS5lcXVhbHMoaW5kZXhlZENvbnRhaW5lci5zZWdtZW50KDApKTsKKwl9CisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQkKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBDT01QTEVURTsKKwkJCisJCXRyeSB7CisJCQlJSW5kZXggaW5kZXggPSBtYW5hZ2VyLmdldEluZGV4KHRoaXMuaW5kZXhlZENvbnRhaW5lciwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgdHJ1ZSAvKmNyZWF0ZSBpZiBub25lKi8pOworCQkJaWYgKGluZGV4ID09IG51bGwpCisJCQkJcmV0dXJuIENPTVBMRVRFOworCisJCQkvKiBlbnN1cmUgbm8gY29uY3VycmVudCB3cml0ZSBhY2Nlc3MgdG8gaW5kZXggKi8KKwkJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJCXJldHVybiBDT01QTEVURTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKwkJCXRyeSB7CisJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQkJaW5kZXgucmVtb3ZlKHJlc291cmNlTmFtZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCW1vbml0b3IuZXhpdFdyaXRlKCk7IC8vIGZyZWUgd3JpdGUgbG9jaworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gcmVtb3ZlICIgKyB0aGlzLnJlc291cmNlTmFtZSArICIgZnJvbSBpbmRleCBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCQlyZXR1cm4gQ09NUExFVEU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAicmVtb3ZpbmcgZnJvbSBpbmRleCAiICsgcmVzb3VyY2VOYW1lOyAvLyROT04tTkxTLTEkCisJfQorCS8qCisJICogQHNlZSBJSm9iI2NhbmNlbCgpCisJICovCisJcHVibGljIHZvaWQgY2FuY2VsKCkgeworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwYWY1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb20uQ29tcGlsYXRpb25Vbml0OworCisvKioKKyAqIEEgU291cmNlSW5kZXhlciBpbmRleGVzIGphdmEgZmlsZXMgdXNpbmcgYSBqYXZhIHBhcnNlci4gVGhlIGZvbGxvd2luZyBpdGVtcyBhcmUgaW5kZXhlZDoKKyAqIERlY2xhcmF0aW9ucyBvZjoKKyAqIC0gQ2xhc3Nlczxicj4KKyAqIC0gSW50ZXJmYWNlczsgPGJyPgorICogLSBNZXRob2RzOzxicj4KKyAqIC0gRmllbGRzOzxicj4KKyAqIFJlZmVyZW5jZXMgdG86CisgKiAtIE1ldGhvZHMgKHdpdGggbnVtYmVyIG9mIGFyZ3VtZW50cyk7IDxicj4KKyAqIC0gRmllbGRzOzxicj4KKyAqIC0gVHlwZXM7PGJyPgorICogLSBDb25zdHJ1Y3RvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VJbmRleGVyIGV4dGVuZHMgQWJzdHJhY3RJbmRleGVyIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZJTEVfVFlQRVM9IG5ldyBTdHJpbmdbXSB7ImphdmEifTsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBEZWZhdWx0UHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3Rvcnk9IG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCisvKioKKyAqIFJldHVybnMgdGhlIGZpbGUgdHlwZXMgdGhlIDxjb2RlPklJbmRleGVyPC9jb2RlPiBoYW5kbGVzLgorICovCisKK3B1YmxpYyBTdHJpbmdbXSBnZXRGaWxlVHlwZXMoKXsKKwlyZXR1cm4gRklMRV9UWVBFUzsKK30KK3Byb3RlY3RlZCB2b2lkIGluZGV4RmlsZShJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkvLyBBZGQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdGhlIGluZGV4CisJb3V0cHV0LmFkZERvY3VtZW50KGRvY3VtZW50KTsKKworCS8vIENyZWF0ZSBhIG5ldyBQYXJzZXIKKwlTb3VyY2VJbmRleGVyUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yKHRoaXMsIGRvY3VtZW50KTsKKwlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSwgdHJ1ZSk7IC8vIGluZGV4IGxvY2FsIGRlY2xhcmF0aW9ucworCisJLy8gTGF1bmNoIHRoZSBwYXJzZXIKKwljaGFyW10gc291cmNlID0gbnVsbDsKKwljaGFyW10gbmFtZSA9IG51bGw7CisJdHJ5IHsKKwkJc291cmNlID0gZG9jdW1lbnQuZ2V0Q2hhckNvbnRlbnQoKTsKKwkJbmFtZSA9IGRvY3VtZW50LmdldE5hbWUoKS50b0NoYXJBcnJheSgpOworCX0gY2F0Y2goRXhjZXB0aW9uIGUpeworCX0KKwlpZiAoc291cmNlID09IG51bGwgfHwgbmFtZSA9PSBudWxsKSByZXR1cm47IC8vIGNvdWxkIG5vdCByZXRyaWV2ZSBkb2N1bWVudCBpbmZvIChlLmcuIHJlc291cmNlIHdhcyBkaXNjYXJkZWQpCisJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCBuYW1lKTsKKwl0cnkgeworCQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KK30KKy8qKgorICogU2V0cyB0aGUgZG9jdW1lbnQgdHlwZXMgdGhlIDxjb2RlPklJbmRleGVyPC9jb2RlPiBoYW5kbGVzLgorICovCisKK3B1YmxpYyB2b2lkIHNldEZpbGVUeXBlcyhTdHJpbmdbXSBmaWxlVHlwZXMpe30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9Tb3VyY2VJbmRleGVyUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlMzE2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSBKYXZhUGFyc2VySW5kZXhlci4gV2hlbiBwYXJzaW5nIHRoZSBqYXZhIGZpbGUsIHRoZSByZXF1ZXN0b3IKKyAqIHJlY29nbmlzZXMgdGhlIGphdmEgZWxlbWVudHMgKG1ldGhvZHMsIGZpZWxkcywgLi4uKSBhbmQgYWRkIHRoZW0gdG8gYW4gaW5kZXguCisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yIGltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IsIElJbmRleENvbnN0YW50cyB7CisJU291cmNlSW5kZXhlciBpbmRleGVyOworCUlEb2N1bWVudCBkb2N1bWVudDsKKworCWNoYXJbXSBwYWNrYWdlTmFtZTsKKwljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMgPSBuZXcgY2hhcls1XVtdOworCWludCBkZXB0aCA9IDA7CisJaW50IG1ldGhvZERlcHRoID0gMDsKKwkKK3B1YmxpYyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yKFNvdXJjZUluZGV4ZXIgaW5kZXhlciwgSURvY3VtZW50IGRvY3VtZW50KSB7CisJc3VwZXIoKTsKKwl0aGlzLmluZGV4ZXIgPSBpbmRleGVyOworCXRoaXMuZG9jdW1lbnQ9IGRvY3VtZW50OworfQorLyoqCisgKiBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UoY2hhcltdIHR5cGVOYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbikgeworCXRoaXMuaW5kZXhlci5hZGRDb25zdHJ1Y3RvclJlZmVyZW5jZSh0eXBlTmFtZSwgYXJnQ291bnQpOworCWludCBsYXN0RG90ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHR5cGVOYW1lKTsKKwlpZiAobGFzdERvdCAhPSAtMSkgeworCQljaGFyW11bXSBxdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0eXBlTmFtZSwgMCwgbGFzdERvdCkpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcXVhbGlmaWNhdGlvbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJdGhpcy5pbmRleGVyLmFkZE5hbWVSZWZlcmVuY2UocXVhbGlmaWNhdGlvbltpXSk7CisJCX0KKwl9Cit9CisvKioKKyAqIGFjY2VwdEZpZWxkUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZFJlZmVyZW5jZShjaGFyW10gZmllbGROYW1lLCBpbnQgc291cmNlUG9zaXRpb24pIHsKKwl0aGlzLmluZGV4ZXIuYWRkRmllbGRSZWZlcmVuY2UoZmllbGROYW1lKTsKK30KKy8qKgorICogYWNjZXB0SW1wb3J0IG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRJbXBvcnQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgY2hhcltdIG5hbWUsIGJvb2xlYW4gb25EZW1hbmQpIHsKKwljaGFyW11bXSBxdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCAwLCBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKCcuJywgbmFtZSkpKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcXVhbGlmaWNhdGlvbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQl0aGlzLmluZGV4ZXIuYWRkTmFtZVJlZmVyZW5jZShxdWFsaWZpY2F0aW9uW2ldKTsKKwl9Cit9CisvKioKKyAqIGFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoaW50W10gcG9zaXRpb25zKSB7Cit9CisvKioKKyAqIGFjY2VwdE1ldGhvZFJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbikgeworCXRoaXMuaW5kZXhlci5hZGRNZXRob2RSZWZlcmVuY2UobWV0aG9kTmFtZSwgYXJnQ291bnQpOworfQorLyoqCisgKiBhY2NlcHRQYWNrYWdlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lKSB7CisJdGhpcy5wYWNrYWdlTmFtZSA9IG5hbWU7Cit9CisvKioKKyAqIGFjY2VwdFByb2JsZW0gbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgeworfQorLyoqCisgKiBhY2NlcHRUeXBlUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHR5cGVOYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKQorCQlhY2NlcHRVbmtub3duUmVmZXJlbmNlKHR5cGVOYW1lW2ldLCAwKTsgLy8gPworCWFjY2VwdFR5cGVSZWZlcmVuY2UodHlwZU5hbWVbbGVuZ3RoIC0gMV0sIDApOworfQorLyoqCisgKiBhY2NlcHRUeXBlUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJdGhpcy5pbmRleGVyLmFkZFR5cGVSZWZlcmVuY2Uoc2ltcGxlVHlwZU5hbWUpOworfQorLyoqCisgKiBhY2NlcHRVbmtub3duUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBhY2NlcHRVbmtub3duUmVmZXJlbmNlKGNoYXJbXVtdIG5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgeworCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykgeworCQlhY2NlcHRVbmtub3duUmVmZXJlbmNlKG5hbWVbaV0sIDApOworCX0KK30KKy8qKgorICogYWNjZXB0VW5rbm93blJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgYWNjZXB0VW5rbm93blJlZmVyZW5jZShjaGFyW10gbmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7CisJdGhpcy5pbmRleGVyLmFkZE5hbWVSZWZlcmVuY2UobmFtZSk7Cit9CisvKgorICogUmVidWlsZCB0aGUgcHJvcGVyIHF1YWxpZmljYXRpb24gZm9yIHRoZSBjdXJyZW50IHNvdXJjZSB0eXBlOgorICoKKyAqIGphdmEubGFuZy5PYmplY3QgLS0tPiBudWxsCisgKiBqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5IC0tPiBbSGFzaHRhYmxlXQorICogeC55LkEkQiRDIC0tPiBbQSwgQl0KKyAqLworcHVibGljIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcygpeworCisJaWYgKGRlcHRoID09IDApIHJldHVybiBudWxsOworCisJY2hhcltdW10gcXVhbGlmaWNhdGlvbiA9IG5ldyBjaGFyW3RoaXMuZGVwdGhdW107CisJU3lzdGVtLmFycmF5Y29weSh0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcywgMCwgcXVhbGlmaWNhdGlvbiwgMCwgdGhpcy5kZXB0aCk7CisJcmV0dXJuIHF1YWxpZmljYXRpb247Cit9CisvKioKKyAqIGVudGVyQ2xhc3MgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ2xhc3MoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdIHN1cGVyY2xhc3MsIGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCisJLy8gZWxpbWluYXRlIHBvc3NpYmxlIHF1YWxpZmljYXRpb25zLCBnaXZlbiB0aGV5IG5lZWQgdG8gYmUgZnVsbHkgcmVzb2x2ZWQgYWdhaW4KKwlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKXsKKwkJc3VwZXJjbGFzcyA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQoc3VwZXJjbGFzcywgJy4nKTsKKwl9CisJaWYgKHN1cGVyaW50ZXJmYWNlcyAhPSBudWxsKXsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHN1cGVyaW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQlzdXBlcmludGVyZmFjZXNbaV0gPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHN1cGVyaW50ZXJmYWNlc1tpXSwgJy4nKTsKKwkJfQorCX0KKwljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXM7CisJaWYgKHRoaXMubWV0aG9kRGVwdGggPiAwKSB7CisJCWVuY2xvc2luZ1R5cGVOYW1lcyA9IE9ORV9aRVJPX0NIQVI7CisJfSBlbHNlIHsKKwkJZW5jbG9zaW5nVHlwZU5hbWVzID0gdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMoKTsKKwl9CisJdGhpcy5pbmRleGVyLmFkZENsYXNzRGVjbGFyYXRpb24obW9kaWZpZXJzLCBwYWNrYWdlTmFtZSwgbmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBzdXBlcmNsYXNzLCBzdXBlcmludGVyZmFjZXMpOworCXRoaXMucHVzaFR5cGVOYW1lKG5hbWUpOworfQorLyoqCisgKiBlbnRlckNvbXBpbGF0aW9uVW5pdCBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZW50ZXJDb21waWxhdGlvblVuaXQoKSB7Cit9CisvKioKKyAqIGVudGVyQ29uc3RydWN0b3IgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW11bXSBleGNlcHRpb25UeXBlcykgeworCXRoaXMuaW5kZXhlci5hZGRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBleGNlcHRpb25UeXBlcyk7CisJdGhpcy5tZXRob2REZXB0aCsrOworfQorLyoqCisgKiBlbnRlckZpZWxkIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBlbnRlckZpZWxkKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gdHlwZSwgY2hhcltdIG5hbWUsIGludCBuYW1lU291cmNlU3RhcnQsIGludCBuYW1lU291cmNlRW5kKSB7CisJdGhpcy5pbmRleGVyLmFkZEZpZWxkRGVjbGFyYXRpb24odHlwZSwgbmFtZSk7CisJdGhpcy5tZXRob2REZXB0aCsrOworfQorLyoqCisgKiBlbnRlckluaXRpYWxpemVyIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBlbnRlckluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBpbnQgbW9kaWZpZXJzKSB7CisJdGhpcy5tZXRob2REZXB0aCsrOworfQorLyoqCisgKiBlbnRlckludGVyZmFjZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZW50ZXJJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisJLy8gZWxpbWluYXRlIHBvc3NpYmxlIHF1YWxpZmljYXRpb25zLCBnaXZlbiB0aGV5IG5lZWQgdG8gYmUgZnVsbHkgcmVzb2x2ZWQgYWdhaW4KKwlpZiAoc3VwZXJpbnRlcmZhY2VzICE9IG51bGwpeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc3VwZXJpbnRlcmZhY2VzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJCXN1cGVyaW50ZXJmYWNlc1tpXSA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQoc3VwZXJpbnRlcmZhY2VzW2ldLCAnLicpOworCQl9CisJfQkKKwljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXM7CisJaWYgKHRoaXMubWV0aG9kRGVwdGggPiAwKSB7CisJCWVuY2xvc2luZ1R5cGVOYW1lcyA9IE9ORV9aRVJPX0NIQVI7CisJfSBlbHNlIHsKKwkJZW5jbG9zaW5nVHlwZU5hbWVzID0gdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMoKTsKKwl9CisJdGhpcy5pbmRleGVyLmFkZEludGVyZmFjZURlY2xhcmF0aW9uKG1vZGlmaWVycywgcGFja2FnZU5hbWUsIG5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgc3VwZXJpbnRlcmZhY2VzKTsKKwl0aGlzLnB1c2hUeXBlTmFtZShuYW1lKTsJCit9CisvKioKKyAqIGVudGVyTWV0aG9kIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBlbnRlck1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIHJldHVyblR5cGUsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW11bXSBleGNlcHRpb25UeXBlcykgeworCXRoaXMuaW5kZXhlci5hZGRNZXRob2REZWNsYXJhdGlvbihuYW1lLCBwYXJhbWV0ZXJUeXBlcywgcmV0dXJuVHlwZSwgZXhjZXB0aW9uVHlwZXMpOworCXRoaXMubWV0aG9kRGVwdGgrKzsKK30KKy8qKgorICogZXhpdENsYXNzIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBleGl0Q2xhc3MoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJcG9wVHlwZU5hbWUoKTsKK30KKy8qKgorICogZXhpdENvbXBpbGF0aW9uVW5pdCBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHsKK30KKy8qKgorICogZXhpdENvbnN0cnVjdG9yIG1ldGhvZCBjb21tZW50LgorICovCitwdWJsaWMgdm9pZCBleGl0Q29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJdGhpcy5tZXRob2REZXB0aC0tOworfQorLyoqCisgKiBleGl0RmllbGQgbWV0aG9kIGNvbW1lbnQuCisgKi8KK3B1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl0aGlzLm1ldGhvZERlcHRoLS07Cit9CisvKioKKyAqIGV4aXRJbml0aWFsaXplciBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZXhpdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvbkVuZCkgeworCXRoaXMubWV0aG9kRGVwdGgtLTsKK30KKy8qKgorICogZXhpdEludGVyZmFjZSBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwlwb3BUeXBlTmFtZSgpOwkKK30KKy8qKgorICogZXhpdE1ldGhvZCBtZXRob2QgY29tbWVudC4KKyAqLworcHVibGljIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwl0aGlzLm1ldGhvZERlcHRoLS07Cit9CitwdWJsaWMgdm9pZCBwb3BUeXBlTmFtZSgpeworCXRyeSB7CisJZW5jbG9zaW5nVHlwZU5hbWVzWy0tZGVwdGhdID0gbnVsbDsKKwl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQllLnByaW50U3RhY2tUcmFjZSgpOworCX0KK30KK3B1YmxpYyB2b2lkIHB1c2hUeXBlTmFtZShjaGFyW10gdHlwZU5hbWUpeworCWlmIChkZXB0aCA9PSBlbmNsb3NpbmdUeXBlTmFtZXMubGVuZ3RoKXsKKwkJU3lzdGVtLmFycmF5Y29weShlbmNsb3NpbmdUeXBlTmFtZXMsIDAsIGVuY2xvc2luZ1R5cGVOYW1lcyA9IG5ldyBjaGFyW2RlcHRoKjJdW10sIDAsIGRlcHRoKTsKKwl9CisJZW5jbG9zaW5nVHlwZU5hbWVzW2RlcHRoKytdID0gdHlwZU5hbWU7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQW5kUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDk2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CisKKy8qKgorICogUXVlcnkgdGhlIGluZGV4IG11bHRpcGxlIHRpbWVzIGFuZCBkbyBhbiAnYW5kJyBvbiB0aGUgcmVzdWx0cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFuZFBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuIHsKK3B1YmxpYyBBbmRQYXR0ZXJuKGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworfQorLyoqCisgKiBRdWVyeSBhIGdpdmVuIGluZGV4IGZvciBtYXRjaGluZyBlbnRyaWVzLiAKKyAqLworcHVibGljIHZvaWQgZmluZEluZGV4TWF0Y2hlcyhJbmRleElucHV0IGlucHV0LCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQorCS8qIG5hcnJvdyBkb3duIGEgc2V0IG9mIGVudHJpZXMgdXNpbmcgcHJlZml4IGNyaXRlcmlhICovCisJbG9uZ1tdIHBvdGVudGlhbFJlZnMgPSBudWxsOworCWludCBtYXhSZWZzID0gLTE7CisJdGhpcy5yZXNldFF1ZXJ5KCk7CisJZG8geworCQlJRW50cnlSZXN1bHRbXSBlbnRyaWVzID0gaW5wdXQucXVlcnlFbnRyaWVzUHJlZml4ZWRCeShpbmRleEVudHJ5UHJlZml4KCkpOworCQlpZiAoZW50cmllcyA9PSBudWxsKSBicmVhazsKKworCQlpbnQgbnVtRmlsZXMgPSBpbnB1dC5nZXROdW1GaWxlcygpOworCQlsb25nW10gcmVmZXJlbmNlcyA9IG51bGw7CisJCWludCByZWZlcmVuY2VzTGVuZ3RoID0gLTE7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKworCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCisJCQkvKiByZXRyaWV2ZSBhbmQgZGVjb2RlIGVudHJ5ICovCQorCQkJSUVudHJ5UmVzdWx0IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCWRlY29kZUluZGV4RW50cnkoZW50cnkpOworCQkJaWYgKG1hdGNoSW5kZXhFbnRyeSgpKSB7CisJCQkJLyogYWNjdW11bGF0ZSByZWZlcmVuY2VzIGluIGFuIGFycmF5IG9mIGJpdHMgOiAxIGlmIHRoZSByZWZlcmVuY2UgaXMgcHJlc2VudCwgMCBvdGhlcndpc2UgKi8KKwkJCQlpbnRbXSBmaWxlUmVmZXJlbmNlcyA9IGVudHJ5LmdldEZpbGVSZWZlcmVuY2VzKCk7CisJCQkJZm9yIChpbnQgaiA9IDAsIHJlZkxlbmd0aCA9IGZpbGVSZWZlcmVuY2VzLmxlbmd0aDsgaiA8IHJlZkxlbmd0aDsgaisrKSB7CisJCQkJCWludCBmaWxlUmVmZXJlbmNlID0gZmlsZVJlZmVyZW5jZXNbal07CisJCQkJCWludCB2ZWN0b3JJbmRleCA9IGZpbGVSZWZlcmVuY2UgLyA2NDsgLy8gYSBsb25nIGhhcyA2NCBiaXRzCisJCQkJCWlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKKwkJCQkJCXJlZmVyZW5jZXNMZW5ndGggPSAobnVtRmlsZXMgLyA2NCkgKyAxOworCQkJCQkJcmVmZXJlbmNlcyA9IG5ldyBsb25nW3JlZmVyZW5jZXNMZW5ndGhdOworCQkJCQl9CisJCQkJCWxvbmcgbWFzayA9IDFMIDw8IChmaWxlUmVmZXJlbmNlICUgNjQpOworCQkJCQlyZWZlcmVuY2VzW3ZlY3RvckluZGV4XSB8PSBtYXNrOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLyogb25seSBzZWxlY3QgZW50cmllcyB3aGljaCBhY3R1YWxseSBtYXRjaCB0aGUgZW50aXJlIHNlYXJjaCBwYXR0ZXJuICovCisJCWlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKKwkJCS8qIG5vIHJlZmVyZW5jZXMgKi8KKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwb3RlbnRpYWxSZWZzID09IG51bGwpIHsKKwkJCQkvKiBmaXJzdCBxdWVyeSA6IHRoZXNlIGFyZSB0aGUgcG90ZW50aWFsIHJlZmVyZW5jZXMgKi8KKwkJCQlwb3RlbnRpYWxSZWZzID0gcmVmZXJlbmNlczsKKwkJCQltYXhSZWZzID0gbnVtRmlsZXM7CisJCQl9IGVsc2UgeworCQkJCS8qIGVsaW1pbmF0ZSBwb3RlbnRpYWwgcmVmZXJlbmNlcyB0aGF0IGRvbid0IG1hdGNoIHRoZSBjdXJyZW50IHJlZmVyZW5jZXMgKi8KKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlpZiAoaSA8IHBvdGVudGlhbFJlZnMubGVuZ3RoKSB7CisJCQkJCQlwb3RlbnRpYWxSZWZzW2ldICY9IHJlZmVyZW5jZXNbaV07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwb3RlbnRpYWxSZWZzW2ldID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0JCQkJCisJCX0KKwl9IHdoaWxlICh0aGlzLmhhc05leHRRdWVyeSgpKTsKKworCS8qIHJlcG9ydCBwb3RlbnRpYWwgcmVmZXJlbmNlcyB0aGF0IHJlbWFpbiAqLworCWlmIChwb3RlbnRpYWxSZWZzICE9IG51bGwpIHsKKwkJaW50W10gcmVmcyA9IG5ldyBpbnRbbWF4UmVmc107CisJCWludCByZWZzTGVuZ3RoID0gMDsKKwkJZm9yIChpbnQgcmVmZXJlbmNlID0gMTsgcmVmZXJlbmNlIDw9IG1heFJlZnM7IHJlZmVyZW5jZSsrKSB7CisJCQlpbnQgdmVjdG9ySW5kZXggPSByZWZlcmVuY2UgLyA2NDsgLy8gYSBsb25nIGhhcyA2NCBiaXRzCisJCQlpZiAoKHBvdGVudGlhbFJlZnNbdmVjdG9ySW5kZXhdICYgKDFMIDw8IChyZWZlcmVuY2UgJSA2NCkpKSAhPSAwKSB7CisJCQkJcmVmc1tyZWZzTGVuZ3RoKytdID0gcmVmZXJlbmNlOworCQkJfQorCQkJCQkJCisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShyZWZzLCAwLCByZWZzID0gbmV3IGludFtyZWZzTGVuZ3RoXSwgMCwgcmVmc0xlbmd0aCk7CisJCXRoaXMuZmVlZEluZGV4UmVxdWVzdG9yKHJlcXVlc3RvciwgZGV0YWlsTGV2ZWwsIHJlZnMsIGlucHV0LCBzY29wZSk7CisJfQorfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYW5vdGhlciBxdWVyeSBtdXN0IGJlIGRvbmUuCisgKi8KK3Byb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc05leHRRdWVyeSgpOworLyoqCisgKiBSZXNldHMgdGhlIHF1ZXJ5IGFuZCBwcmVwYXJlcyB0aGlzIHBhdHRlcm4gdG8gYmUgcXVlcmllZC4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVzZXRRdWVyeSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzE3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5BYnN0cmFjdEluZGV4ZXI7CisKKy8qKgorICogVGhlIHNlbGVjdG9yIGlzIHVudXNlZCwgdGhlIGNvbnN0cnVjdG9yIG5hbWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlIHNpbXBsZSBuYW1lLgorICovIAorcHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuIHsKKworCXByaXZhdGUgY2hhcltdIGRlY29kZWRUeXBlTmFtZTsJCitwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvblBhdHRlcm4oY2hhcltdIGRlY2xhcmluZ1NpbXBsZU5hbWUsIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBjaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIGNoYXJbXVtdIHBhcmFtZXRlclNpbXBsZU5hbWVzKSB7CisJc3VwZXIobnVsbCwgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIGRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ1NpbXBsZU5hbWUsIG51bGwsIG51bGwsIHBhcmFtZXRlclF1YWxpZmljYXRpb25zLCBwYXJhbWV0ZXJTaW1wbGVOYW1lcyk7Cit9CitwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeVJlc3VsdCl7CisKKwljaGFyW10gd29yZCA9IGVudHJ5UmVzdWx0LmdldFdvcmQoKTsKKwlpbnQgc2l6ZSA9IHdvcmQubGVuZ3RoOworCWludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKFNFUEFSQVRPUiwgd29yZCk7CQorCisJZGVjb2RlZFBhcmFtZXRlckNvdW50ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKHdvcmQsIGxhc3RTZXBhcmF0b3JJbmRleCArIDEsIHNpemUgLSBsYXN0U2VwYXJhdG9ySW5kZXggLSAxKSk7CisJZGVjb2RlZFR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBDT05TVFJVQ1RPUl9ERUNMLmxlbmd0aCwgbGFzdFNlcGFyYXRvckluZGV4KTsKK30KKy8qKgorICogc2VlIFNlYXJjaFBhdHRlcm4uZmVlZEluZGV4UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGZlZWRJbmRleFJlcXVlc3RvcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIGludFtdIHJlZmVyZW5jZXMsIEluZGV4SW5wdXQgaW5wdXQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJSW5kZXhlZEZpbGUgZmlsZSA9IGlucHV0LmdldEluZGV4ZWRGaWxlKHJlZmVyZW5jZXNbaV0pOworCQlTdHJpbmcgcGF0aDsKKwkJaWYgKGZpbGUgIT0gbnVsbCAmJiBzY29wZS5lbmNsb3NlcyhwYXRoID0gSW5kZXhlZEZpbGUuY29udmVydFBhdGgoZmlsZS5nZXRQYXRoKCkpKSkgeworCQkJcmVxdWVzdG9yLmFjY2VwdENvbnN0cnVjdG9yRGVjbGFyYXRpb24ocGF0aCwgZGVjb2RlZFR5cGVOYW1lLCBkZWNvZGVkUGFyYW1ldGVyQ291bnQpOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jaW5kZXhFbnRyeVByZWZpeAorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKSB7CisKKwlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUHJlZml4KAorCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGgsIAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzQmluYXJ5KE9iamVjdCwgT2JqZWN0KQorICovCitwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQmluYXJ5KE9iamVjdCBiaW5hcnlJbmZvLCBPYmplY3QgZW5jbG9zaW5nQmluYXJ5SW5mbykgeworCWlmICghKGJpbmFyeUluZm8gaW5zdGFuY2VvZiBJQmluYXJ5TWV0aG9kKSkgcmV0dXJuIGZhbHNlOworCisJSUJpbmFyeU1ldGhvZCBtZXRob2QgPSAoSUJpbmFyeU1ldGhvZCliaW5hcnlJbmZvOworCQorCS8vIG11c3QgYmUgYSBjb25zdHJ1Y3RvcgorCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgcmV0dXJuIGZhbHNlOworCisJLy8gZGVjbGFyaW5nIHR5cGUKKwlJQmluYXJ5VHlwZSBkZWNsYXJpbmdUeXBlID0gKElCaW5hcnlUeXBlKWVuY2xvc2luZ0JpbmFyeUluZm87CisJaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgeworCQljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUgPSAoY2hhcltdKWRlY2xhcmluZ1R5cGUuZ2V0TmFtZSgpLmNsb25lKCk7CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShkZWNsYXJpbmdUeXBlTmFtZSwgJy8nLCAnLicpOworCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24sIGRlY2xhcmluZ1R5cGVOYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLy8gcGFyYW1ldGVyIHR5cGVzCisJaW50IHBhcmFtZXRlckNvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsKKwlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgeworCQlTdHJpbmcgbWV0aG9kRGVzY3JpcHRvciA9IG5ldyBTdHJpbmcobWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKSkucmVwbGFjZSgnLycsICcuJyk7CisJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhtZXRob2REZXNjcmlwdG9yKTsKKwkJaW50IGFyZ3VtZW50Q291bnQgPSBhcmd1bWVudHMubGVuZ3RoOworCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkKKwkJCXJldHVybiBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV07CisJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07CisJCQlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodHlwZSwgcXVhbGlmaWNhdGlvbiwgIFNpZ25hdHVyZS50b1N0cmluZyhhcmd1bWVudHNbaV0pLnRvQ2hhckFycmF5KCkpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIHNlbGVjdG9yIG1hdGNoZXMgKi8KKwlpZiAoZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKXsKKwkJc3dpdGNoKG1hdGNoTW9kZSl7CisJCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKGRlY2xhcmluZ1NpbXBsZU5hbWUsIGRlY29kZWRUeXBlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhkZWNsYXJpbmdTaW1wbGVOYW1lLCBkZWNvZGVkVHlwZU5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ubWF0Y2goZGVjbGFyaW5nU2ltcGxlTmFtZSwgZGVjb2RlZFR5cGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJfQorCX0KKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgIT0gbnVsbCl7CisJCWlmIChwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGggIT0gZGVjb2RlZFBhcmFtZXRlckNvdW50KSByZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOworCWJ1ZmZlci5hcHBlbmQoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7CisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKKworCWJ1ZmZlci5hcHBlbmQoJygnKTsKKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldKS5hcHBlbmQoJy4nKTsKKwkJCWlmIChwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9PSBudWxsKSBidWZmZXIuYXBwZW5kKCcqJyk7IGVsc2UgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSk7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgnKScpOworCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6IAorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJfQorCWlmIChpc0Nhc2VTZW5zaXRpdmUpCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoIShub2RlIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCisJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKW5vZGU7CisKKwlpZiAocmVzb2x2ZSkgeworCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKGNvbnN0cnVjdG9yLmJpbmRpbmcpOworCX0gZWxzZSB7CisJCS8vIGNvbnN0cnVjdG9yIG5hbWUgaXMgc3RvcmVkIGluIHNlbGVjdG9yIGZpZWxkCisJCWlmICh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCAKKwkJCQkmJiAhdGhpcy5tYXRjaGVzTmFtZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIGNvbnN0cnVjdG9yLnNlbGVjdG9yKSkKKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCisJCS8vIHBhcmFtZXRlciB0eXBlcworCQlpbnQgcGFyYW1ldGVyQ291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOworCQlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgeworCQkJaW50IGFyZ3VtZW50Q291bnQgPSBjb25zdHJ1Y3Rvci5hcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3Rvci5hcmd1bWVudHMubGVuZ3RoOworCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKworCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCX0KK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwlpbnQgbGV2ZWw7CisKKwlNZXRob2RCaW5kaW5nIGNvbnN0cnVjdG9yID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsKKwkKKwkvLyBtdXN0IGJlIGEgY29uc3RydWN0b3IKKwlpZiAoIWNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IoKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisKKwkvLyBkZWNsYXJpbmcgdHlwZQorCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nVHlwZSA9IGNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOworCWlmICghY29uc3RydWN0b3IuaXNTdGF0aWMoKSAmJiAhY29uc3RydWN0b3IuaXNQcml2YXRlKCkpIHsKKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxBc1N1YnR5cGUoZGVjbGFyaW5nVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pOworCX0gZWxzZSB7CisJCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nVHlwZSk7CisJfQorCWlmIChsZXZlbCA9PSBJTVBPU1NJQkxFX01BVENIKSB7CisJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0KKwkJCisJLy8gcGFyYW1ldGVyIHR5cGVzCisJaW50IHBhcmFtZXRlckNvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsKKwlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgeworCQlpbnQgYXJndW1lbnRDb3VudCA9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMgPT0gbnVsbCA/IDAgOiBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV07CisJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07CisJCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHR5cGUsIHF1YWxpZmljYXRpb24sIGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbaV0pOworCQkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoKKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbAorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSAorCQkJCQlsZXZlbCA9IG5ld0xldmVsOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBsZXZlbDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjM3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BbGxvY2F0aW9uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5BYnN0cmFjdEluZGV4ZXI7CisKKy8qKgorICogVGhlIHNlbGVjdG9yIGlzIHVudXNlZCwgdGhlIGNvbnN0cnVjdG9yIG5hbWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlIHNpbXBsZSBuYW1lLgorICovIAorcHVibGljIGNsYXNzIENvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIE1ldGhvZFJlZmVyZW5jZVBhdHRlcm4geworCisJcHJpdmF0ZSBjaGFyW10gZGVjb2RlZFR5cGVOYW1lOworCQorcHVibGljIENvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybigKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJaW50IG1hdGNoTW9kZSwgCisJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIAorCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKKwljaGFyW11bXSBwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJY2hhcltdW10gcGFyYW1ldGVyU2ltcGxlTmFtZXMsCisJSVR5cGUgZGVjbGFyaW5nVHlwZSkgeworCQkKKwlzdXBlcigKKwkJbnVsbCwgCisJCW1hdGNoTW9kZSwgCisJCWlzQ2FzZVNlbnNpdGl2ZSwgCisJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJbnVsbCwgCisJCW51bGwsIAorCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCXBhcmFtZXRlclNpbXBsZU5hbWVzLAorCQlkZWNsYXJpbmdUeXBlKTsKK30KK3B1YmxpYyB2b2lkIGRlY29kZUluZGV4RW50cnkoSUVudHJ5UmVzdWx0IGVudHJ5UmVzdWx0KXsKKworCWNoYXJbXSB3b3JkID0gZW50cnlSZXN1bHQuZ2V0V29yZCgpOworCWludCBzaXplID0gd29yZC5sZW5ndGg7CisJaW50IGxhc3RTZXBhcmF0b3JJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoU0VQQVJBVE9SLCB3b3JkKTsJCisKKwlkZWNvZGVkUGFyYW1ldGVyQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KG5ldyBTdHJpbmcod29yZCwgbGFzdFNlcGFyYXRvckluZGV4ICsgMSwgc2l6ZSAtIGxhc3RTZXBhcmF0b3JJbmRleCAtIDEpKTsKKwlkZWNvZGVkVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIENPTlNUUlVDVE9SX1JFRi5sZW5ndGgsIGxhc3RTZXBhcmF0b3JJbmRleCk7Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZlZWRJbmRleFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBmZWVkSW5kZXhSZXF1ZXN0b3IoSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBpbnRbXSByZWZlcmVuY2VzLCBJbmRleElucHV0IGlucHV0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWZvciAoaW50IGkgPSAwLCBtYXggPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCUluZGV4ZWRGaWxlIGZpbGUgPSBpbnB1dC5nZXRJbmRleGVkRmlsZShyZWZlcmVuY2VzW2ldKTsKKwkJU3RyaW5nIHBhdGg7CisJCWlmIChmaWxlICE9IG51bGwgJiYgc2NvcGUuZW5jbG9zZXMocGF0aCA9IEluZGV4ZWRGaWxlLmNvbnZlcnRQYXRoKGZpbGUuZ2V0UGF0aCgpKSkpIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShwYXRoLCBkZWNvZGVkVHlwZU5hbWUsIGRlY29kZWRQYXJhbWV0ZXJDb3VudCk7CisJCX0KKwl9Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNpbmRleEVudHJ5UHJlZml4CisgKi8KK3B1YmxpYyBjaGFyW10gaW5kZXhFbnRyeVByZWZpeCgpIHsKKworCXJldHVybiBBYnN0cmFjdEluZGV4ZXIuYmVzdENvbnN0cnVjdG9yUmVmZXJlbmNlUHJlZml4KAorCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGgsIAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaEluZGV4RW50cnkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCkgeworCisJLyogY2hlY2sgc2VsZWN0b3IgbWF0Y2hlcyAqLworCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpeworCQlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nU2ltcGxlTmFtZSwgZGVjb2RlZFR5cGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGRlY2xhcmluZ1NpbXBsZU5hbWUsIGRlY29kZWRUeXBlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaChkZWNsYXJpbmdTaW1wbGVOYW1lLCBkZWNvZGVkVHlwZU5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQl9CisJfQorCWlmIChwYXJhbWV0ZXJTaW1wbGVOYW1lcyAhPSBudWxsKXsKKwkJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aCAhPSBkZWNvZGVkUGFyYW1ldGVyQ291bnQpIHJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJYnVmZmVyLmFwcGVuZCgiQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7CisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCcoJyk7CisJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKKwl9IGVsc2UgeworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJaWYgKGkgPiAwKSBidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSkuYXBwZW5kKCcuJyk7CisJCQlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0gPT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgnKicpOyBlbHNlIGJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0pOworCQl9CisJfQorCWJ1ZmZlci5hcHBlbmQoJyknKTsKKwlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJc3dpdGNoKG1hdGNoTW9kZSl7CisJCWNhc2UgRVhBQ1RfTUFUQ0ggOiAKKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29uc3RydWN0b3IgcGF0dGVybiAgbWF0Y2hlcyB0aGUgZ2l2ZW4gYWxsb2NhdGlvbiBleHByZXNzaW9uLgorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4KKyAqLworcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uLCBib29sZWFuIHJlc29sdmUpIHsKKworCS8vIGNvbnN0cnVjdG9yIG5hbWUgaXMgc2ltcGxlIHR5cGUgbmFtZQorCWNoYXJbXVtdIHR5cGVOYW1lID0gYWxsb2NhdGlvbi50eXBlLmdldFR5cGVOYW1lKCk7CisJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsIAorCQkJJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0eXBlTmFtZVt0eXBlTmFtZS5sZW5ndGgtMV0pKQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCWlmIChyZXNvbHZlKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoYWxsb2NhdGlvbi5iaW5kaW5nKTsKKwl9IGVsc2UgeworCQkvLyBhcmd1bWVudCB0eXBlcworCQlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CisJCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsKKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IGFsbG9jYXRpb24uYXJndW1lbnRzID09IG51bGwgPyAwIDogYWxsb2NhdGlvbi5hcmd1bWVudHMubGVuZ3RoOworCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKwkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwl9Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7CisJaWYgKG5vZGUgaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgeworCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChBbGxvY2F0aW9uRXhwcmVzc2lvbilub2RlLCByZXNvbHZlKTsKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgeworCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbClub2RlLCByZXNvbHZlKTsKKwl9CisJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29uc3RydWN0b3IgcGF0dGVybiAgbWF0Y2hlcyB0aGUgZ2l2ZW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbC4KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuCisgKi8KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCwgYm9vbGVhbiByZXNvbHZlKSB7CisJLy8gVEJEOiBjb25zdHJ1Y3RvciBuYW1lIGlzIHN1cGVyIHNpbXBsZSB0eXBlIG5hbWUKKworCWlmIChyZXNvbHZlKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoY2FsbC5iaW5kaW5nKTsKKwl9IGVsc2UgeworCQkvLyBhcmd1bWVudCB0eXBlcworCQlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CisJCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsKKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IGNhbGwuYXJndW1lbnRzID09IG51bGwgPyAwIDogY2FsbC5hcmd1bWVudHMubGVuZ3RoOworCQkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpCisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKwkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwl9Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKS4KKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEJpbmRpbmcgYmluZGluZykgeworCWlmIChiaW5kaW5nID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBNZXRob2RCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJaW50IGxldmVsOworCisJLy8gZGVjbGFyaW5nIHR5cGUKKwlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IChNZXRob2RCaW5kaW5nKWJpbmRpbmc7CisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdCaW5kaW5nID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzOworCWxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgZGVjbGFyaW5nQmluZGluZyk7CisJaWYgKGxldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkKKwkvLyBhcmd1bWVudCB0eXBlcworCWludCBhcmd1bWVudENvdW50ID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzLmxlbmd0aDsKKwlpZiAoYXJndW1lbnRDb3VudCA+IC0xKSB7CisJCWlmIChtZXRob2QucGFyYW1ldGVycyA9PSBudWxsKSB7CisJCQlsZXZlbCA9IElOQUNDVVJBVEVfTUFUQ0g7CisJCX0gZWxzZSB7CisJCQlpbnQgcGFyYW1ldGVyQ291bnQgPSBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7CisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQkJY2hhcltdIHF1YWxpZmljYXRpb24gPSB0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldOworCQkJCWNoYXJbXSB0eXBlID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXTsKKwkJCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHR5cGUsIHF1YWxpZmljYXRpb24sIG1ldGhvZC5wYXJhbWV0ZXJzW2ldKTsKKwkJCQlzd2l0Y2ggKG5ld0xldmVsKSB7CisJCQkJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoKKwkJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCQljYXNlIEFDQ1VSQVRFX01BVENIOiAvLyBrZWVwIHByZXZpb3VzIGxldmVsCisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gKKwkJCQkJCWxldmVsID0gbmV3TGV2ZWw7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbGV2ZWw7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Mjk0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4uamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIERlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4gZXh0ZW5kcyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4geworCUhhc2hTZXQga25vd25GaWVsZHM7CisJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CitwdWJsaWMgRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybihJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCkgeworCXN1cGVyKAorCQludWxsLCAKKwkJUEFUVEVSTl9NQVRDSCwgCisJCWZhbHNlLCAKKwkJbnVsbCwgCisJCW51bGwsCisJCW51bGwsCisJCW51bGwsCisJCXRydWUsICAvLyByZWFkIGFjY2VzcworCQl0cnVlKTsgLy8gd3JpdGUgYWNjZXNzCisJdGhpcy5lbmNsb3NpbmdFbGVtZW50ID0gZW5jbG9zaW5nRWxlbWVudDsKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHRydWU7CisJdGhpcy5rbm93bkZpZWxkcyA9IG5ldyBIYXNoU2V0KCk7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0UmVmZXJlbmNlCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIG5lZWQgYWNjdXJhdGUgbWF0Y2ggdG8gYmUgYWJsZSB0byBvcGVuIG9uIHR5cGUgcmVmCisJaWYgKGFjY3VyYWN5ID09IElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCkgcmV0dXJuOworCQorCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBmaWVsZCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBlbmNsb3NpbmcgZWxlbWVudAorCXdoaWxlIChlbGVtZW50ICE9IG51bGwgJiYgIXRoaXMuZW5jbG9zaW5nRWxlbWVudC5lcXVhbHMoZWxlbWVudCkpIHsKKwkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJfQorCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjsKKwkKKwlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgRmllbGRSZWZlcmVuY2UpIHsKKwkJdGhpcy5yZXBvcnREZWNsYXJhdGlvbigoKEZpZWxkUmVmZXJlbmNlKXJlZmVyZW5jZSkuYmluZGluZywgbG9jYXRvcik7CisJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlyZWZlcmVuY2U7CisJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7CisJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CisJCQl0aGlzLnJlcG9ydERlY2xhcmF0aW9uKChGaWVsZEJpbmRpbmcpYmluZGluZywgbG9jYXRvcik7CisJCX0gCisJCWludCBvdGhlck1heCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlck1heDsgaSsrKXsKKwkJCXRoaXMucmVwb3J0RGVjbGFyYXRpb24ocU5hbWVSZWYub3RoZXJCaW5kaW5nc1tpXSwgbG9jYXRvcik7CisJCX0KKwl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKKwkJdGhpcy5yZXBvcnREZWNsYXJhdGlvbigKKwkJCShGaWVsZEJpbmRpbmcpKChTaW5nbGVOYW1lUmVmZXJlbmNlKXJlZmVyZW5jZSkuYmluZGluZywgCisJCQlsb2NhdG9yKTsKKwl9Cit9Citwcml2YXRlIHZvaWQgcmVwb3J0RGVjbGFyYXRpb24oRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZywgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBpZ25vcmUgbGVuZ3RoIGZpZWxkCisJaWYgKGZpZWxkQmluZGluZyA9PSBBcnJheUJpbmRpbmcuTGVuZ3RoRmllbGQpIHJldHVybjsKKwkKKwlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCUlUeXBlIHR5cGUgPSBsb2NhdG9yLmxvb2t1cFR5cGUoZGVjbGFyaW5nQ2xhc3MpOworCWlmICh0eXBlID09IG51bGwpIHJldHVybjsgLy8gY2FzZSBvZiBhIHNlY29uZGFyeSB0eXBlCisJY2hhcltdIG5hbWUgPSBmaWVsZEJpbmRpbmcubmFtZTsKKwlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKG5ldyBTdHJpbmcobmFtZSkpOworCWlmICh0aGlzLmtub3duRmllbGRzLmNvbnRhaW5zKGZpZWxkKSkgcmV0dXJuOworCXRoaXMua25vd25GaWVsZHMuYWRkKGZpZWxkKTsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCWJvb2xlYW4gaXNCaW5hcnkgPSB0eXBlLmlzQmluYXJ5KCk7CisJSUJpbmFyeVR5cGUgaW5mbyA9IG51bGw7CisJaWYgKGlzQmluYXJ5KSB7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisJCQlyZXNvdXJjZSA9IHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCX0KKwkJaW5mbyA9IGxvY2F0b3IuZ2V0QmluYXJ5SW5mbygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXR5cGUuZ2V0Q2xhc3NGaWxlKCksIHJlc291cmNlKTsKKwkJbG9jYXRvci5yZXBvcnRCaW5hcnlNYXRjaChyZXNvdXJjZSwgZmllbGQsIGluZm8sIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsKKwl9IGVsc2UgeworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoKFNvdXJjZVR5cGVCaW5kaW5nKWRlY2xhcmluZ0NsYXNzKS5zY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCA9IG51bGw7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xzID0gdHlwZURlY2wuZmllbGRzOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZmllbGREZWNscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG5hbWUsIGZpZWxkRGVjbHNbaV0ubmFtZSkpIHsKKwkJCQlmaWVsZERlY2wgPSBmaWVsZERlY2xzW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9IAorCQlpZiAoZmllbGREZWNsICE9IG51bGwpIHsKKwkJCWxvY2F0b3IucmVwb3J0KHJlc291cmNlLCBmaWVsZERlY2wuc291cmNlU3RhcnQsIGZpZWxkRGVjbC5zb3VyY2VFbmQsIGZpZWxkLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7CisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDQ1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybiBleHRlbmRzIE1ldGhvZFJlZmVyZW5jZVBhdHRlcm4geworCUhhc2hTZXQga25vd25NZXRob2RzOworCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50OworCQorcHVibGljIERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4oSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQpIHsKKwlzdXBlcigKKwkJbnVsbCwgCisJCVBBVFRFUk5fTUFUQ0gsIAorCQlmYWxzZSwgCisJCW51bGwsIAorCQludWxsLAorCQludWxsLAorCQludWxsLAorCQludWxsLAorCQludWxsLAorCQludWxsKTsKKwl0aGlzLmVuY2xvc2luZ0VsZW1lbnQgPSBlbmNsb3NpbmdFbGVtZW50OworCXRoaXMubmVlZHNSZXNvbHZlID0gdHJ1ZTsKKwl0aGlzLmtub3duTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0UmVmZXJlbmNlCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIG5lZWQgYWNjdXJhdGUgbWF0Y2ggdG8gYmUgYWJsZSB0byBvcGVuIG9uIHR5cGUgcmVmCisJaWYgKGFjY3VyYWN5ID09IElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCkgcmV0dXJuOworCQorCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBtZXRob2QgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQKKwl3aGlsZSAoZWxlbWVudCAhPSBudWxsICYmICF0aGlzLmVuY2xvc2luZ0VsZW1lbnQuZXF1YWxzKGVsZW1lbnQpKSB7CisJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCX0KKwlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm47CisKKwl0aGlzLnJlcG9ydERlY2xhcmF0aW9uKCgoTWVzc2FnZVNlbmQpcmVmZXJlbmNlKS5iaW5kaW5nLCBsb2NhdG9yKTsKK30KK3ByaXZhdGUgdm9pZCByZXBvcnREZWNsYXJhdGlvbihNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcsIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJSVR5cGUgdHlwZSA9IGxvY2F0b3IubG9va3VwVHlwZShkZWNsYXJpbmdDbGFzcyk7CisJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYXNlIG9mIGEgc2Vjb25kYXJ5IHR5cGUKKwljaGFyW10gc2VsZWN0b3IgPSBtZXRob2RCaW5kaW5nLnNlbGVjdG9yOworCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZEJpbmRpbmcucGFyYW1ldGVyczsKKwlpbnQgcGFyYW1ldGVyTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckxlbmd0aF07CisJZm9yIChpbnQgaSA9IDA7IGkgIDwgcGFyYW1ldGVyTGVuZ3RoOyBpKyspIHsKKwkJcGFyYW1ldGVyVHlwZXNbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShwYXJhbWV0ZXJzW2ldLnNvdXJjZU5hbWUoKSwgZmFsc2UpOworCX0KKwlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKG5ldyBTdHJpbmcoc2VsZWN0b3IpLCBwYXJhbWV0ZXJUeXBlcyk7CisJaWYgKHRoaXMua25vd25NZXRob2RzLmNvbnRhaW5zKG1ldGhvZCkpIHJldHVybjsKKwl0aGlzLmtub3duTWV0aG9kcy5hZGQobWV0aG9kKTsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCWJvb2xlYW4gaXNCaW5hcnkgPSB0eXBlLmlzQmluYXJ5KCk7CisJSUJpbmFyeVR5cGUgaW5mbyA9IG51bGw7CisJaWYgKGlzQmluYXJ5KSB7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisJCQlyZXNvdXJjZSA9IHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCX0KKwkJaW5mbyA9IGxvY2F0b3IuZ2V0QmluYXJ5SW5mbygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXR5cGUuZ2V0Q2xhc3NGaWxlKCksIHJlc291cmNlKTsKKwkJbG9jYXRvci5yZXBvcnRCaW5hcnlNYXRjaChyZXNvdXJjZSwgbWV0aG9kLCBpbmZvLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7CisJfSBlbHNlIHsKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKChTb3VyY2VUeXBlQmluZGluZylkZWNsYXJpbmdDbGFzcykuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gbnVsbDsKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0gdHlwZURlY2wubWV0aG9kczsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZERlY2xzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2VsZWN0b3IsIG1ldGhvZERlY2xzW2ldLnNlbGVjdG9yKSkgeworCQkJCW1ldGhvZERlY2wgPSBtZXRob2REZWNsc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSAKKwkJaWYgKG1ldGhvZERlY2wgIT0gbnVsbCkgeworCQkJbG9jYXRvci5yZXBvcnQocmVzb3VyY2UsIG1ldGhvZERlY2wuc291cmNlU3RhcnQsIG1ldGhvZERlY2wuc291cmNlRW5kLCBtZXRob2QsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJiNGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZE5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluYXJ5VHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuIGV4dGVuZHMgVHlwZVJlZmVyZW5jZVBhdHRlcm4geworCUhhc2hTZXQga25vd25UeXBlczsKKwlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudDsKK3B1YmxpYyBEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybihJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCkgeworCXN1cGVyKG51bGwsIG51bGwsIFBBVFRFUk5fTUFUQ0gsIGZhbHNlKTsKKwl0aGlzLmVuY2xvc2luZ0VsZW1lbnQgPSBlbmNsb3NpbmdFbGVtZW50OworCXRoaXMubmVlZHNSZXNvbHZlID0gdHJ1ZTsKKwl0aGlzLmtub3duVHlwZXMgPSBuZXcgSGFzaFNldCgpOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hSZXBvcnRJbXBvcnRSZWYoSW1wb3J0UmVmZXJlbmNlLCBCaW5kaW5nLCBJSmF2YUVsZW1lbnQsIGludCwgTWF0Y2hMb2NhdG9yKQorICovCitwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydEltcG9ydFJlZihJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBCaW5kaW5nIGJpbmRpbmcsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJLy8gbmVlZCBhY2N1cmF0ZSBtYXRjaCB0byBiZSBhYmxlIHRvIG9wZW4gb24gdHlwZSByZWYKKwlpZiAoYWNjdXJhY3kgPT0gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKSByZXR1cm47CisJCisJd2hpbGUgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nOworCQl0aGlzLnJlcG9ydERlY2xhcmF0aW9uKHR5cGVCaW5kaW5nLCAxLCBsb2NhdG9yKTsKKwkJYmluZGluZyA9IHR5cGVCaW5kaW5nLmVuY2xvc2luZ1R5cGUoKTsKKwl9Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0UmVmZXJlbmNlCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIG5lZWQgYWNjdXJhdGUgbWF0Y2ggdG8gYmUgYWJsZSB0byBvcGVuIG9uIHR5cGUgcmVmCisJaWYgKGFjY3VyYWN5ID09IElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCkgcmV0dXJuOworCQorCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSB0eXBlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGVuY2xvc2luZyBlbGVtZW50CisJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5lbmNsb3NpbmdFbGVtZW50LmVxdWFscyhlbGVtZW50KSkgeworCQllbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwl9CisJaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOworCisJaW50IG1heFR5cGUgPSAtMTsKKwlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG51bGw7CisJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFR5cGVSZWZlcmVuY2UpIHsKKwkJdHlwZUJpbmRpbmcgPSAoKFR5cGVSZWZlcmVuY2UpcmVmZXJlbmNlKS5iaW5kaW5nOworCQltYXhUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7CisJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlyZWZlcmVuY2U7CisJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7CisJCW1heFR5cGUgPSBxTmFtZVJlZi50b2tlbnMubGVuZ3RoLTE7CisJCXN3aXRjaCAocU5hbWVSZWYuYml0cyAmIEFzdE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBCaW5kaW5nSWRzLkZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCisJCQkJdHlwZUJpbmRpbmcgPSBxTmFtZVJlZi5hY3R1YWxSZWNlaXZlclR5cGU7CisJCQkJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsJCQkKKwkJCQltYXhUeXBlIC09IG90aGVyQmluZGluZ3NDb3VudCArIDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEJpbmRpbmdJZHMuVFlQRSA6IC8vPT09PT09PT09PT09PW9ubHkgdHlwZSA9PT09PT09PT09PT09PQorCQkJCXR5cGVCaW5kaW5nID0gKFR5cGVCaW5kaW5nKWJpbmRpbmc7CisJCQkJYnJlYWs7CisJCQljYXNlIEJpbmRpbmdJZHMuVkFSSUFCTEUgOiAvLz09PT09PT09PT09PXVuYm91bmQgY2FzZXM9PT09PT09PT09PQorCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgfCBCaW5kaW5nSWRzLlZBUklBQkxFIDoJCQkJCQkKKwkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1CaW5kaW5nKSB7CisJCQkJCVByb2JsZW1CaW5kaW5nIHBiQmluZGluZyA9IChQcm9ibGVtQmluZGluZykgYmluZGluZzsKKwkJCQkJdHlwZUJpbmRpbmcgPSBwYkJpbmRpbmcuc2VhcmNoVHlwZTsgLy8gc2Vjb25kIGNoYW5jZSB3aXRoIHJlY29yZGVkIHR5cGUgc28gZmFyCisJCQkJCWNoYXJbXSBwYXJ0aWFsUXVhbGlmaWVkTmFtZSA9IHBiQmluZGluZy5uYW1lOworCQkJCQltYXhUeXBlID0gQ2hhck9wZXJhdGlvbi5vY2N1cmVuY2VzT2YoJy4nLCBwYXJ0aWFsUXVhbGlmaWVkTmFtZSkgLSAxOyAvLyBpbmRleCBvZiBsYXN0IGJvdW5kIHRva2VuIGlzIG9uZSBiZWZvcmUgdGhlIHBiIHRva2VuCisJCQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsIHx8IG1heFR5cGUgPCAwKSByZXR1cm47CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCXR5cGVCaW5kaW5nID0gKFR5cGVCaW5kaW5nKSgoU2luZ2xlTmFtZVJlZmVyZW5jZSlyZWZlcmVuY2UpLmJpbmRpbmc7CisJCW1heFR5cGUgPSAxOworCX0KKwkKKwlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCB8fCB0eXBlQmluZGluZyBpbnN0YW5jZW9mIEJhc2VUeXBlQmluZGluZykgcmV0dXJuOworCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgeworCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKXR5cGVCaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZTsKKwl9CisJdGhpcy5yZXBvcnREZWNsYXJhdGlvbih0eXBlQmluZGluZywgbWF4VHlwZSwgbG9jYXRvcik7Cit9Citwcml2YXRlIHZvaWQgcmVwb3J0RGVjbGFyYXRpb24oVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGludCBtYXhUeXBlLCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlUeXBlIHR5cGUgPSBsb2NhdG9yLmxvb2t1cFR5cGUodHlwZUJpbmRpbmcpOworCWlmICh0eXBlID09IG51bGwpIHJldHVybjsgLy8gY2FzZSBvZiBhIHNlY29uZGFyeSB0eXBlCisJSVJlc291cmNlIHJlc291cmNlID0gdHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlib29sZWFuIGlzQmluYXJ5ID0gdHlwZS5pc0JpbmFyeSgpOworCUlCaW5hcnlUeXBlIGluZm8gPSBudWxsOworCWlmIChpc0JpbmFyeSkgeworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJcmVzb3VyY2UgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOworCQl9CisJCWluZm8gPSBsb2NhdG9yLmdldEJpbmFyeUluZm8oKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSl0eXBlLmdldENsYXNzRmlsZSgpLCByZXNvdXJjZSk7CisJfQorCXdoaWxlIChtYXhUeXBlID49IDAgJiYgdHlwZSAhPSBudWxsKSB7CisJCWlmICghdGhpcy5rbm93blR5cGVzLmNvbnRhaW5zKHR5cGUpKSB7CisJCQlpZiAoaXNCaW5hcnkpIHsKKwkJCQlsb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKHJlc291cmNlLCB0eXBlLCBpbmZvLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7CisJCQl9IGVsc2UgeworCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9ICgoU291cmNlVHlwZUJpbmRpbmcpdHlwZUJpbmRpbmcpLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQkJbG9jYXRvci5yZXBvcnQocmVzb3VyY2UsIHR5cGVEZWNsLnNvdXJjZVN0YXJ0LCB0eXBlRGVjbC5zb3VyY2VFbmQsIHR5cGUsIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsKKwkJCX0KKwkJCXRoaXMua25vd25UeXBlcy5hZGQodHlwZSk7CisJCX0KKwkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgQmluYXJ5VHlwZUJpbmRpbmcpIHsKKwkJCXR5cGVCaW5kaW5nID0gKChCaW5hcnlUeXBlQmluZGluZyl0eXBlQmluZGluZykuZW5jbG9zaW5nVHlwZSgpOworCQl9IGVsc2UgeworCQkJdHlwZUJpbmRpbmcgPSAoKFNvdXJjZVR5cGVCaW5kaW5nKXR5cGVCaW5kaW5nKS5lbmNsb3NpbmdUeXBlKCk7CisJCX0KKwkJSUphdmFFbGVtZW50IHBhcmVudCA9IHR5cGUuZ2V0UGFyZW50KCk7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJdHlwZSA9IChJVHlwZSlwYXJlbnQ7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gbnVsbDsKKwkJfQorCQltYXhUeXBlLS07CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjQ0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkFic3RyYWN0SW5kZXhlcjsKKworcHVibGljIGNsYXNzIEZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybiB7CisKKwkvLyBzZWxlY3RvcgkKKwlwcm90ZWN0ZWQgY2hhcltdIG5hbWU7CisJCisJLy8gZGVjbGFyaW5nIHR5cGUKKwlwcm90ZWN0ZWQgY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb247CisJcHJvdGVjdGVkIGNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lOworCisJLy8gdHlwZQorCXByb3RlY3RlZCBjaGFyW10gdHlwZVF1YWxpZmljYXRpb247CisJcHJvdGVjdGVkIGNoYXJbXSB0eXBlU2ltcGxlTmFtZTsKKworCXByb3RlY3RlZCBjaGFyW10gZGVjb2RlZE5hbWU7CitwdWJsaWMgRmllbGREZWNsYXJhdGlvblBhdHRlcm4oCisJY2hhcltdIG5hbWUsIAorCWludCBtYXRjaE1vZGUsIAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLAorCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwljaGFyW10gdHlwZVF1YWxpZmljYXRpb24sIAorCWNoYXJbXSB0eXBlU2ltcGxlTmFtZSkgeworCisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCisJdGhpcy5uYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gbmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UobmFtZSk7CisJdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJdGhpcy50eXBlUXVhbGlmaWNhdGlvbiA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHR5cGVRdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0eXBlUXVhbGlmaWNhdGlvbik7CisJdGhpcy50eXBlU2ltcGxlTmFtZSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHR5cGVTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0eXBlU2ltcGxlTmFtZSk7CisKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHRoaXMubmVlZHNSZXNvbHZlKCk7Cit9CitwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeVJlc3VsdCl7CisKKwljaGFyW10gd29yZCA9IGVudHJ5UmVzdWx0LmdldFdvcmQoKTsKKwlkZWNvZGVkTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgRklFTERfREVDTC5sZW5ndGgsIHdvcmQubGVuZ3RoKTsKK30KKy8qKgorICogc2VlIFNlYXJjaFBhdHRlcm4uZmVlZEluZGV4UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGZlZWRJbmRleFJlcXVlc3RvcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIGludFtdIHJlZmVyZW5jZXMsIEluZGV4SW5wdXQgaW5wdXQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJSW5kZXhlZEZpbGUgZmlsZSA9IGlucHV0LmdldEluZGV4ZWRGaWxlKHJlZmVyZW5jZXNbaV0pOworCQlTdHJpbmcgcGF0aDsKKwkJaWYgKGZpbGUgIT0gbnVsbCAmJiBzY29wZS5lbmNsb3NlcyhwYXRoID0gSW5kZXhlZEZpbGUuY29udmVydFBhdGgoZmlsZS5nZXRQYXRoKCkpKSkgeworCQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkRGVjbGFyYXRpb24ocGF0aCwgZGVjb2RlZE5hbWUpOworCQl9CisJfQorfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jaW5kZXhFbnRyeVByZWZpeAorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKSB7CisKKwlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RGaWVsZERlY2xhcmF0aW9uUHJlZml4KAorCQkJbmFtZSwgCisJCQltYXRjaE1vZGUsIAorCQkJaXNDYXNlU2Vuc2l0aXZlKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoQ29udGFpbmVyKCkKKyAqLworcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKKwlyZXR1cm4gQ0xBU1M7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzQmluYXJ5KE9iamVjdCwgT2JqZWN0KQorICovCitwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQmluYXJ5KE9iamVjdCBiaW5hcnlJbmZvLCBPYmplY3QgZW5jbG9zaW5nQmluYXJ5SW5mbykgeworCWlmICghKGJpbmFyeUluZm8gaW5zdGFuY2VvZiBJQmluYXJ5RmllbGQpKSByZXR1cm4gZmFsc2U7CisKKwlJQmluYXJ5RmllbGQgZmllbGQgPSAoSUJpbmFyeUZpZWxkKWJpbmFyeUluZm87CisJCisJLy8gZmllbGQgbmFtZQorCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLm5hbWUsIGZpZWxkLmdldE5hbWUoKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJSUJpbmFyeVR5cGUgZGVjbGFyaW5nVHlwZSA9IChJQmluYXJ5VHlwZSllbmNsb3NpbmdCaW5hcnlJbmZvOworCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lID0gKGNoYXJbXSlkZWNsYXJpbmdUeXBlLmdldE5hbWUoKS5jbG9uZSgpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZGVjbGFyaW5nVHlwZU5hbWUsICcvJywgJy4nKTsKKwkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdUeXBlTmFtZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8vIGZpZWxkIHR5cGUKKwlTdHJpbmcgZmllbGRUeXBlU2lnbmF0dXJlID0gbmV3IFN0cmluZyhmaWVsZC5nZXRUeXBlTmFtZSgpKS5yZXBsYWNlKCcvJywgJy4nKTsKKwlpZighdGhpcy5tYXRjaGVzVHlwZSh0aGlzLnR5cGVTaW1wbGVOYW1lLCB0aGlzLnR5cGVRdWFsaWZpY2F0aW9uLCBTaWduYXR1cmUudG9TdHJpbmcoZmllbGRUeXBlU2lnbmF0dXJlKS50b0NoYXJBcnJheSgpKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIG5hbWUgbWF0Y2hlcyAqLworCWlmIChuYW1lICE9IG51bGwpeworCQlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ubWF0Y2gobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQl9CisJfQorCXJldHVybiB0cnVlOworfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSBtZXRob2QgZGVjbGFyYXRpb24gb3IgbWVzc2FnZSBzZW5kIHdpbGwgbmVlZCB0byBiZSByZXNvbHZlZCB0byAKKyAqIGZpbmQgb3V0IGlmIHRoaXMgbWV0aG9kIHBhdHRlcm4gbWF0Y2hlcyBpdC4KKyAqLworcHJpdmF0ZSBib29sZWFuIG5lZWRzUmVzb2x2ZSgpIHsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCB8fCBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIHJldHVybiB0cnVlOworCisJLy8gcmV0dXJuIHR5cGUKKwlpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCB8fCB0eXBlUXVhbGlmaWNhdGlvbiAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsKKwlidWZmZXIuYXBwZW5kKCJGaWVsZERlY2xhcmF0aW9uUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1F1YWxpZmljYXRpb24pLmFwcGVuZCgnLicpOworCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpIAorCQlidWZmZXIuYXBwZW5kKGRlY2xhcmluZ1NpbXBsZU5hbWUpLmFwcGVuZCgnLicpOworCWVsc2UgaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKi4iKTsgLy8kTk9OLU5MUy0xJAorCWlmIChuYW1lID09IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZChuYW1lKTsKKwl9CisJaWYgKHR5cGVRdWFsaWZpY2F0aW9uICE9IG51bGwpIAorCQlidWZmZXIuYXBwZW5kKCIgLS0+ICIpLmFwcGVuZCh0eXBlUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7IC8vJE5PTi1OTFMtMSQKKwllbHNlIGlmICh0eXBlU2ltcGxlTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIgLS0+ICIpOyAvLyROT04tTkxTLTEkCisJaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwpIAorCQlidWZmZXIuYXBwZW5kKHR5cGVTaW1wbGVOYW1lKTsKKwllbHNlIGlmICh0eXBlUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKKwlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJc3dpdGNoKG1hdGNoTW9kZSl7CisJCWNhc2UgRVhBQ1RfTUFUQ0ggOiAKKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7CisJaWYgKCEobm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSAoRmllbGREZWNsYXJhdGlvbilub2RlOworCisJaWYgKHJlc29sdmUpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChmaWVsZC5iaW5kaW5nKTsKKwl9IGVsc2UgeworCQlpZiAoIWZpZWxkLmlzRmllbGQoKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7IC8vIGlnbm9yZSBmaWVsZCBpbml0aWFsaXplcnMKKwkJCisJCS8vIGZpZWxkIG5hbWUKKwkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGQubmFtZSkpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCQkvLyBmaWVsZCB0eXBlCisJCVR5cGVSZWZlcmVuY2UgZmllbGRUeXBlID0gZmllbGQudHlwZTsKKwkJY2hhcltdW10gZmllbGRUeXBlTmFtZSA9IGZpZWxkVHlwZS5nZXRUeXBlTmFtZSgpOworCQljaGFyW10gc291cmNlTmFtZSA9IHRoaXMudG9BcnJheU5hbWUoCisJCQlmaWVsZFR5cGVOYW1lW2ZpZWxkVHlwZU5hbWUubGVuZ3RoLTFdLCAKKwkJCWZpZWxkVHlwZS5kaW1lbnNpb25zKCkpOworCQlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy50eXBlU2ltcGxlTmFtZSwgc291cmNlTmFtZSkpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCX0KK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCWludCBsZXZlbDsKKworCUZpZWxkQmluZGluZyBmaWVsZCA9IChGaWVsZEJpbmRpbmcpYmluZGluZzsKKwkKKwkvLyBmaWVsZCBuYW1lCisJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGQucmVhZGFibGVOYW1lKCkpKQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdCaW5kaW5nID0gZmllbGQuZGVjbGFyaW5nQ2xhc3M7CisJaWYgKGRlY2xhcmluZ0JpbmRpbmcgPT0gbnVsbCApIHsKKwkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJfSBlbHNlIHsKKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdCaW5kaW5nKTsKKwkJaWYgKGxldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0KKworCS8vIGxvb2sgYXQgZmllbGQgdHlwZSBvbmx5IGlmIGRlY2xhcmluZyB0eXBlIGlzIG5vdCBzcGVjaWZpZWQKKwlpZiAodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwpIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnR5cGVTaW1wbGVOYW1lLCB0aGlzLnR5cGVRdWFsaWZpY2F0aW9uLCBmaWVsZC50eXBlKTsKKwkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbAorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gKKwkJCQlsZXZlbCA9IG5ld0xldmVsOworCQkJCWJyZWFrOworCQl9CisJfQorCQorCXJldHVybiBsZXZlbDsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkUmVmZXJlbmNlUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWNlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcG91bmRBc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZE5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5BYnN0cmFjdEluZGV4ZXI7CisKK3B1YmxpYyBjbGFzcyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBNdWx0aXBsZVNlYXJjaFBhdHRlcm4geworCisJLy8gc2VsZWN0b3IJCisJcHJvdGVjdGVkIGNoYXJbXSBuYW1lOworCQorCS8vIGRlY2xhcmluZyB0eXBlCisJcHJvdGVjdGVkIGNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uOworCXByb3RlY3RlZCBjaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZTsKKworCS8vIHR5cGUKKwlwcm90ZWN0ZWQgY2hhcltdIHR5cGVRdWFsaWZpY2F0aW9uOworCXByb3RlY3RlZCBjaGFyW10gdHlwZVNpbXBsZU5hbWU7CisJCisJLy8gcmVhZC93cml0ZSBhY2Nlc3MKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQWNjZXNzID0gdHJ1ZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB3cml0ZUFjY2VzcyA9IHRydWU7CisKKwlwcm90ZWN0ZWQgY2hhcltdIGRlY29kZWROYW1lOworCisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gUkVGX1RBR1MgPSB7IEZJRUxEX1JFRiwgUkVGIH07CisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gUkVGX0FORF9ERUNMX1RBR1MgPSB7IEZJRUxEX1JFRiwgUkVGLCBGSUVMRF9ERUNMIH07CisKK3B1YmxpYyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJY2hhcltdIG5hbWUsIAorCWludCBtYXRjaE1vZGUsIAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLAorCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwljaGFyW10gdHlwZVF1YWxpZmljYXRpb24sIAorCWNoYXJbXSB0eXBlU2ltcGxlTmFtZSwKKwlib29sZWFuIHJlYWRBY2Nlc3MsCisJYm9vbGVhbiB3cml0ZUFjY2VzcykgeworCisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCisJdGhpcy5uYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gbmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UobmFtZSk7CisJdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJdGhpcy50eXBlUXVhbGlmaWNhdGlvbiA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHR5cGVRdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0eXBlUXVhbGlmaWNhdGlvbik7CisJdGhpcy50eXBlU2ltcGxlTmFtZSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHR5cGVTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZSh0eXBlU2ltcGxlTmFtZSk7CisJdGhpcy5yZWFkQWNjZXNzID0gcmVhZEFjY2VzczsKKwl0aGlzLndyaXRlQWNjZXNzID0gd3JpdGVBY2Nlc3M7CisKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHRoaXMubmVlZHNSZXNvbHZlKCk7Cit9CisvKioKKyAqIEVpdGhlciBkZWNvZGUgcmVmL25hbWUsIGZpZWxkUmVmL25hbWUgCisgKi8gCitwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeVJlc3VsdCl7CisKKwljaGFyW10gd29yZCA9IGVudHJ5UmVzdWx0LmdldFdvcmQoKTsKKwlpbnQgc2l6ZSA9IHdvcmQubGVuZ3RoOworCWludCB0YWdMZW5ndGggPSBjdXJyZW50VGFnLmxlbmd0aDsKKwlpbnQgbmFtZUxlbmd0aCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIHdvcmQsIHRhZ0xlbmd0aCk7CisJaWYgKG5hbWVMZW5ndGggPCAwKSBuYW1lTGVuZ3RoID0gc2l6ZTsKKwlkZWNvZGVkTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgdGFnTGVuZ3RoLCBuYW1lTGVuZ3RoKTt9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZlZWRJbmRleFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBmZWVkSW5kZXhSZXF1ZXN0b3IoSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBpbnRbXSByZWZlcmVuY2VzLCBJbmRleElucHV0IGlucHV0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmIChjdXJyZW50VGFnID09IFJFRikgeworCQlmb3VuZEFtYmlndW91c0luZGV4TWF0Y2hlcyA9IHRydWU7CisJfQorCWZvciAoaW50IGkgPSAwLCBtYXggPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCWludCByZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldOworCQlpZiAocmVmZXJlbmNlICE9IC0xKSB7IC8vIGlmIHRoZSByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIGVsaW1pbmF0ZWQKKwkJCUluZGV4ZWRGaWxlIGZpbGUgPSBpbnB1dC5nZXRJbmRleGVkRmlsZShyZWZlcmVuY2UpOworCQkJU3RyaW5nIHBhdGg7CisJCQlpZiAoZmlsZSAhPSBudWxsICYmIHNjb3BlLmVuY2xvc2VzKHBhdGggPSBJbmRleGVkRmlsZS5jb252ZXJ0UGF0aChmaWxlLmdldFBhdGgoKSkpKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEZpZWxkUmVmZXJlbmNlKHBhdGgsIGRlY29kZWROYW1lKTsKKwkJCX0KKwkJfQorCX0KK30KK3Byb3RlY3RlZCBjaGFyW11bXSBnZXRQb3NzaWJsZVRhZ3MoKSB7CisJaWYgKHRoaXMud3JpdGVBY2Nlc3MgJiYgIXRoaXMucmVhZEFjY2VzcykgeworCQlyZXR1cm4gUkVGX0FORF9ERUNMX1RBR1M7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFJFRl9UQUdTOworCX0KK30KKy8qKgorICogQHNlZSBBbmRQYXR0ZXJuI2hhc05leHRRdWVyeQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0UXVlcnkoKSB7CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBzZWUgU2VhcmNoUGF0dGVybi5pbmRleEVudHJ5UHJlZml4KCkKKyAqLworcHVibGljIGNoYXJbXSBpbmRleEVudHJ5UHJlZml4KCl7CisKKwlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RSZWZlcmVuY2VQcmVmaXgoCisJCQljdXJyZW50VGFnLAorCQkJbmFtZSwKKwkJCW1hdGNoTW9kZSwgCisJCQlpc0Nhc2VTZW5zaXRpdmUpOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hDaGVjayhBc3ROb2RlLCBNYXRjaFNldCkKKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hDaGVjayhBc3ROb2RlIG5vZGUsIE1hdGNoU2V0IHNldCkgeworCWlmICh0aGlzLnJlYWRBY2Nlc3MpIHsKKwkJc3VwZXIubWF0Y2hDaGVjayhub2RlLCBzZXQpOworCX0KKwlpZiAobm9kZSBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKKwkJQXN0Tm9kZSBsaHMgPSAoKEFzc2lnbm1lbnQpbm9kZSkubGhzOworCQlpZiAodGhpcy53cml0ZUFjY2VzcykgeworCQkJc3VwZXIubWF0Y2hDaGVjayhsaHMsIHNldCk7CisJCX0gZWxzZSBpZiAoIShub2RlIGluc3RhbmNlb2YgQ29tcG91bmRBc3NpZ25tZW50KSl7CisJCQkvLyB0aGUgbGhzIG1heSBoYXZlIGJlZW4gYWRkZWQgd2hlbiBjaGVja2luZyBpZiBpdCB3YXMgYSByZWFkIGFjY2VzcworCQkJc2V0LnJlbW92ZVBvc3NpYmxlTWF0Y2gobGhzKTsKKwkJCXNldC5yZW1vdmVUcnVzdGVkTWF0Y2gobGhzKTsKKwkJfQkKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJCXN1cGVyLm1hdGNoQ2hlY2sobm9kZSwgc2V0KTsKKwl9Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJaW50IG1hdGNoQ29udGFpbmVyID0gTUVUSE9EIHwgRklFTEQ7CisJaWYgKHRoaXMud3JpdGVBY2Nlc3MgJiYgIXRoaXMucmVhZEFjY2VzcykgeworCQltYXRjaENvbnRhaW5lciB8PSBDTEFTUzsKKwl9CisJcmV0dXJuIG1hdGNoQ29udGFpbmVyOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIG5hbWUgbWF0Y2hlcyAqLworCWlmIChuYW1lICE9IG51bGwpeworCQlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ubWF0Y2gobmFtZSwgZGVjb2RlZE5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQl9CisJfQorCXJldHVybiB0cnVlOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hSZXBvcnRSZWZlcmVuY2UKKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQXN0Tm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKXJlZmVyZW5jZTsKKwkJaW50IGxlbmd0aCA9IHFOYW1lUmVmLnRva2Vucy5sZW5ndGg7CisJCWludFtdIGFjY3VyYWNpZXMgPSBuZXcgaW50W2xlbmd0aF07CisJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7CisJCWludCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPSBxTmFtZVJlZi5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAwID8gcU5hbWVSZWYuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nLTEgOiAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsgaSsrKSB7CisJCQlhY2N1cmFjaWVzW2ldID0gLTE7CisJCX0KKwkJLy8gZmlyc3QgdG9rZW4KKwkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCBxTmFtZVJlZi50b2tlbnNbaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nXSkKKwkJCQkmJiAhKGJpbmRpbmcgaW5zdGFuY2VvZiBMb2NhbFZhcmlhYmxlQmluZGluZykpIHsKKwkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPQorCQkJCWJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcgPworCQkJCQkgKEZpZWxkQmluZGluZyliaW5kaW5nIDoKKwkJCQkJIG51bGw7CisJCQlpZiAoZmllbGRCaW5kaW5nID09IG51bGwpIHsKKwkJCQlhY2N1cmFjaWVzW2luZGV4T2ZGaXJzdEZpZWxkQmluZGluZ10gPSBhY2N1cmFjeTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGxldmVsID0gdGhpcy5tYXRjaExldmVsKGZpZWxkQmluZGluZyk7CisJCQkJc3dpdGNoIChsZXZlbCkgeworCQkJCQljYXNlIEFDQ1VSQVRFX01BVENIOgorCQkJCQkJYWNjdXJhY2llc1tpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmddID0gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0g7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJTkFDQ1VSQVRFX01BVENIOgorCQkJCQkJYWNjdXJhY2llc1tpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmddID0gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlhY2N1cmFjaWVzW2luZGV4T2ZGaXJzdEZpZWxkQmluZGluZ10gPSAtMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlhY2N1cmFjaWVzW2luZGV4T2ZGaXJzdEZpZWxkQmluZGluZ10gPSAtMTsKKwkJfQorCQkvLyBvdGhlciB0b2tlbnMKKwkJZm9yIChpbnQgaSA9IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZysxOyBpIDwgbGVuZ3RoOyBpKyspeworCQkJY2hhcltdIHRva2VuID0gcU5hbWVSZWYudG9rZW5zW2ldOworCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCB0b2tlbikpIHsKKwkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gcU5hbWVSZWYub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gbnVsbCA6IHFOYW1lUmVmLm90aGVyQmluZGluZ3NbaS0oaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nKzEpXTsKKwkJCQlpZiAob3RoZXJCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJYWNjdXJhY2llc1tpXSA9IGFjY3VyYWN5OworCQkJCX0gZWxzZSB7CisJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbChvdGhlckJpbmRpbmcpOworCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisJCQkJCQljYXNlIEFDQ1VSQVRFX01BVENIOgorCQkJCQkJCWFjY3VyYWNpZXNbaV0gPSBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSU5BQ0NVUkFURV9NQVRDSDoKKwkJCQkJCQlhY2N1cmFjaWVzW2ldID0gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlhY2N1cmFjaWVzW2ldID0gLTE7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWFjY3VyYWNpZXNbaV0gPSAtMTsKKwkJCX0KKwkJfQorCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKAorCQkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCAKKwkJCXJlZmVyZW5jZS5zb3VyY2VFbmQsIAorCQkJcU5hbWVSZWYudG9rZW5zLCAKKwkJCWVsZW1lbnQsIAorCQkJYWNjdXJhY2llcyk7CisJfSBlbHNlIHsKKwkJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZSgKKwkJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwgCisJCQlyZWZlcmVuY2Uuc291cmNlRW5kLCAKKwkJCW5ldyBjaGFyW11bXSB7dGhpcy5uYW1lfSwgCisJCQllbGVtZW50LCAKKwkJCWFjY3VyYWN5KTsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciBhIGZpZWxkIHJlZmVyZW5jZSBvciBuYW1lIHJlZmVyZW5jZSB3aWxsIG5lZWQgdG8gYmUgcmVzb2x2ZWQgdG8gCisgKiBmaW5kIG91dCBpZiB0aGlzIG1ldGhvZCBwYXR0ZXJuIG1hdGNoZXMgaXQuCisgKi8KK3ByaXZhdGUgYm9vbGVhbiBuZWVkc1Jlc29sdmUoKSB7CisKKwkvLyBkZWNsYXJpbmcgdHlwZQorCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwgfHwgZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKworCS8vIHJldHVybiB0eXBlCisJaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwgfHwgdHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisvKioKKyAqIEBzZWUgQW5kUGF0dGVybiNyZXNldFF1ZXJ5CisgKi8KK3Byb3RlY3RlZCB2b2lkIHJlc2V0UXVlcnkoKSB7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJYnVmZmVyLmFwcGVuZCgiRmllbGRSZWZlcmVuY2VQYXR0ZXJuOiAiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7CisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSkuYXBwZW5kKCcuJyk7CisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqLiIpOyAvLyROT04tTkxTLTEkCisJaWYgKG5hbWUgIT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKG5hbWUpOworCX0gZWxzZSB7CisJCWJ1ZmZlci5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAodHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQoIiAtLT4gIikuYXBwZW5kKHR5cGVRdWFsaWZpY2F0aW9uKS5hcHBlbmQoJy4nKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UgaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIiAtLT4gIik7IC8vJE5PTi1OTFMtMSQKKwlpZiAodHlwZVNpbXBsZU5hbWUgIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQodHlwZVNpbXBsZU5hbWUpOworCWVsc2UgaWYgKHR5cGVRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6IAorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJfQorCWlmIChpc0Nhc2VTZW5zaXRpdmUpCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAobm9kZSBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKEZpZWxkUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOworCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoTmFtZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKEZpZWxkRGVjbGFyYXRpb24pbm9kZSwgcmVzb2x2ZSk7CisJfSAKKwlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCByZWZlcmVuY2UgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBmaWVsZCByZWZlcmVuY2UuCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLgorICovCitwcml2YXRlIGludCBtYXRjaExldmVsKEZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmLCBib29sZWFuIHJlc29sdmUpIHsJCisJLy8gZmllbGQgbmFtZQorCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLm5hbWUsIGZpZWxkUmVmLnRva2VuKSkKKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisKKwlpZiAocmVzb2x2ZSkgeworCQkvLyByZWNlaXZlciB0eXBlIGFuZCBmaWVsZCB0eXBlCisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoZmllbGRSZWYuYmluZGluZyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwl9Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGluCisgKiB3cml0ZSBhY2Nlc3MuCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLgorICovCitwcml2YXRlIGludCBtYXRjaExldmVsKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsLCBib29sZWFuIHJlc29sdmUpIHsKKwkvLyBuZWRkIHRvIGJlIGEgd3JpdGUgb25seSBhY2Nlc3MJCisJaWYgKCF0aGlzLndyaXRlQWNjZXNzIHx8IHRoaXMucmVhZEFjY2VzcykgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCisJLy8gbmVlZCBoYXZlIGFuIGluaXRpYWxpemF0aW9uCisJaWYgKGZpZWxkRGVjbC5pbml0aWFsaXphdGlvbiA9PSBudWxsKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkKKwkvLyBmaWVsZCBuYW1lCisJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgZmllbGREZWNsLm5hbWUpKQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCWlmIChyZXNvbHZlKSB7CisJCS8vIHJlY2VpdmVyIHR5cGUgYW5kIGZpZWxkIHR5cGUKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChmaWVsZERlY2wuYmluZGluZyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSByZWZlcmVuY2UuCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLgorICovCitwcml2YXRlIGludCBtYXRjaExldmVsKE5hbWVSZWZlcmVuY2UgbmFtZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7CQorCWlmICghcmVzb2x2ZSkgeworCQkvLyBmaWVsZCBuYW1lCisJCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgKChTaW5nbGVOYW1lUmVmZXJlbmNlKW5hbWVSZWYpLnRva2VuKSkgeworCQkJCQkvLyBjYW4gb25seSBiZSBhIHBvc3NpYmxlIG1hdGNoIHNpbmNlIHJlc29sdXRpb24gaXMgbmVlZGVkIAorCQkJCQkvLyB0byBmaW5kIG91dCBpZiBpdCBpcyBhIGZpZWxkIHJlZgorCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQorCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmOworCQkJCWNoYXJbXVtdIHRva2VucyA9IHFOYW1lUmVmLnRva2VuczsKKwkJCQlpZiAodGhpcy53cml0ZUFjY2VzcyAmJiAhdGhpcy5yZWFkQWNjZXNzKSB7CisJCQkJCS8vIGluIHRoZSBjYXNlIG9mIHRoZSBhc3NpZ21lbnQgb2YgYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UsIHRoZSBtYXRjaCBtdXN0IGJlIG9uIHRoZSBsYXN0IHRva2VuCisJCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0pKSB7CisJCQkJCQkvLyBjYW4gb25seSBiZSBhIHBvc3NpYmxlIG1hdGNoIHNpbmNlIHJlc29sdXRpb24gaXMgbmVlZGVkIAorCQkJCQkJLy8gdG8gZmluZCBvdXQgaWYgaXQgaXMgYSBmaWVsZCByZWYKKwkJCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCB0b2tlbnNbaV0pKSB7CisJCQkJCQkJLy8gY2FuIG9ubHkgYmUgYSBwb3NzaWJsZSBtYXRjaCBzaW5jZSByZXNvbHV0aW9uIGlzIG5lZWRlZCAKKwkJCQkJCQkvLyB0byBmaW5kIG91dCBpZiBpdCBpcyBhIGZpZWxkIHJlZgorCQkJCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCX0JCQkJCisJCX0gCisJfSBlbHNlIHsKKwkJQmluZGluZyBiaW5kaW5nID0gbmFtZVJlZi5iaW5kaW5nOworCQlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWlmIChuYW1lUmVmIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSl7CisJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpeworCQkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOyAvLyBtdXN0IGJlIGEgZmllbGQgYmluZGluZworCQkJCX0KKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UKKwkJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHFOYW1lUmVmID0gKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpbmFtZVJlZjsKKwkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gbnVsbDsKKwkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZyAmJiB0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpYmluZGluZykubmFtZSkpIHsKKwkJCQkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChmaWVsZEJpbmRpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBvdGhlckxldmVsID0gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJaW50IG90aGVyTWF4ID0gcU5hbWVSZWYub3RoZXJCaW5kaW5ncyA9PSBudWxsID8gMCA6IHFOYW1lUmVmLm90aGVyQmluZGluZ3MubGVuZ3RoOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyTWF4ICYmIChvdGhlckxldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpOyBpKyspeworCQkJCQkJY2hhcltdIHRva2VuID0gcU5hbWVSZWYudG9rZW5zW2kgKyBxTmFtZVJlZi5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmddOworCQkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCB0b2tlbikpIHsKKwkJCQkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gcU5hbWVSZWYub3RoZXJCaW5kaW5nc1tpXTsKKwkJCQkJCQlvdGhlckxldmVsID0gdGhpcy5tYXRjaExldmVsKG90aGVyQmluZGluZyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuIG90aGVyTGV2ZWw7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIGZpZWxkIGJpbmRpbmcuCisgKi8KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoRmllbGRCaW5kaW5nIGJpbmRpbmcpIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwlpbnQgbGV2ZWw7CisJCisJLy8gcmVjZWl2ZXIgdHlwZQorCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJCaW5kaW5nID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwlpZiAocmVjZWl2ZXJCaW5kaW5nID09IG51bGwpIHsKKwkJaWYgKGJpbmRpbmcgPT0gQXJyYXlCaW5kaW5nLkxlbmd0aEZpZWxkKSB7CisJCQkvLyBvcHRpbWl6ZWQgY2FzZSBmb3IgbGVuZ3RoIGZpZWxkIG9mIGFuIGFycmF5CisJCQlpZiAodGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uID09IG51bGwgJiYgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCX0KKwl9IGVsc2UgeworCQkvLyBOb3RlIHRoZXJlIGlzIG5vIGR5bmFtaWMgbG9va3VwIGZvciBmaWVsZCBhY2Nlc3MKKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCByZWNlaXZlckJpbmRpbmcpOworCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgeworCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKwl9CisKKwkvLyBsb29rIGF0IGZpZWxkIHR5cGUgb25seSBpZiBkZWNsYXJpbmcgdHlwZSBpcyBub3Qgc3BlY2lmaWVkCisJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCWludCBuZXdMZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy50eXBlU2ltcGxlTmFtZSwgdGhpcy50eXBlUXVhbGlmaWNhdGlvbiwgYmluZGluZy50eXBlKTsKKwkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbAorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gKKwkJCQlsZXZlbCA9IG5ld0xldmVsOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGxldmVsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWxlTmFtZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpbGVOYW1lRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzMwMDJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWxlTmFtZUVudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNsYXNzcGF0aEphcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgRmlsZU5hbWVFbnZpcm9ubWVudCBleHRlbmRzIEZpbGVTeXN0ZW0geworCQorcHVibGljIEZpbGVOYW1lRW52aXJvbm1lbnQoU3RyaW5nW10gY2xhc3NwYXRoTmFtZXMsIFN0cmluZyBlbmNvZGluZywgaW50W10gY2xhc3NwYXRoRGlyZWN0b3J5TW9kZXMpIHsKKwlzdXBlcihjbGFzc3BhdGhOYW1lcywgbmV3IFN0cmluZ1swXSwgZW5jb2RpbmcsIGNsYXNzcGF0aERpcmVjdG9yeU1vZGVzKTsKK30KKworcHVibGljIENsYXNzcGF0aEphciBnZXRDbGFzc3BhdGhKYXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRyeSB7CisJCVppcEZpbGUgemlwRmlsZSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFppcEZpbGUobmV3IFBhdGgoZmlsZS5nZXRQYXRoKCkpKTsKKwkJcmV0dXJuIG5ldyBDbGFzc3BhdGhKYXIoemlwRmlsZSwgZmFsc2UpOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q2xhc3NwYXRoSmFyKGZpbGUpOworCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjM3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsMTM0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guQ2xhc3NwYXRoRGlyZWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSVR5cGVSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5hcnlUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvb2t1cEVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5IYW5kbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuTmFtZUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5QYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZU1hcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlRWxlbWVudEluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworLyoqCisgKiBMb2NhdGUgbWF0Y2hlcyBpbiBjb21waWxhdGlvbiB1bml0cy4KKyAqLworcHVibGljIGNsYXNzIE1hdGNoTG9jYXRvciBpbXBsZW1lbnRzIElUeXBlUmVxdWVzdG9yIHsKKwlwdWJsaWMgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOworCXB1YmxpYyBpbnQgZGV0YWlsTGV2ZWw7CisJcHVibGljIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKwlwdWJsaWMgSUphdmFTZWFyY2hTY29wZSBzY29wZTsKKworCXB1YmxpYyBNYXRjaExvY2F0b3JQYXJzZXIgcGFyc2VyOworCXByaXZhdGUgSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQ7CisJcHVibGljIE5hbWVMb29rdXAgbmFtZUxvb2t1cDsKKwlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQ7CisJcHVibGljIEhhc2h0YWJsZU9mT2JqZWN0IHBhcnNlZFVuaXRzOworCXB1YmxpYyBNYXRjaGluZ09wZW5hYmxlU2V0IG1hdGNoaW5nT3BlbmFibGVzOworCXByaXZhdGUgTWF0Y2hpbmdPcGVuYWJsZSBjdXJyZW50TWF0Y2hpbmdPcGVuYWJsZTsKKwlwdWJsaWMgSGFuZGxlRmFjdG9yeSBoYW5kbGVGYWN0b3J5OworCXB1YmxpYyBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzOworCisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdIEVNUFRZX0ZJTEVfTkFNRSA9IG5ldyBjaGFyWzBdOworCisJcHVibGljIE1hdGNoTG9jYXRvcigKKwkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAorCQlpbnQgZGV0YWlsTGV2ZWwsCisJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSkgeworCisJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47CisJCXRoaXMuZGV0YWlsTGV2ZWwgPSBkZXRhaWxMZXZlbDsKKwkJdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisJCXRoaXMuc2NvcGUgPSBzY29wZTsKKwl9CisJCisJLyoqCisJICogQWRkIGFuIGFkZGl0aW9uYWwgYmluYXJ5IHR5cGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwkJQmluYXJ5VHlwZUJpbmRpbmcgYmluYXJ5QmluZGluZyA9ICBuZXcgQmluYXJ5VHlwZUJpbmRpbmcocGFja2FnZUJpbmRpbmcsIGJpbmFyeVR5cGUsIHRoaXMubG9va3VwRW52aXJvbm1lbnQpOworCQlSZWZlcmVuY2VCaW5kaW5nIGNhY2hlZFR5cGUgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmdldENhY2hlZFR5cGUoYmluYXJ5QmluZGluZy5jb21wb3VuZE5hbWUpOworCQlpZiAoY2FjaGVkVHlwZSA9PSBudWxsIHx8IGNhY2hlZFR5cGUgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgeyAvLyBOQjogY2FjaGVkVHlwZSBpcyBub3QgbnVsbCBpZiBhbHJlYWR5IGNhY2hlZCBhcyBhIHNvdXJjZSB0eXBlCisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNyZWF0ZUJpbmFyeVR5cGVGcm9tKGJpbmFyeVR5cGUsIHBhY2thZ2VCaW5kaW5nKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uIHVuaXQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgeworCQkvLyBkaWV0IHBhcnNlCisJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChuZXcgU3RyaW5nKHNvdXJjZVVuaXQuZ2V0RmlsZU5hbWUoKSkpKTsKKwkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpSmF2YUNvcmUuY3JlYXRlKGZpbGUpOworCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHRoaXMsIGZpbGUsIGNvbXBpbGF0aW9uVW5pdCk7CisKKwkJLy8gYnVpbGQgYmluZGluZ3MKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyhwYXJzZWRVbml0KTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyhwYXJzZWRVbml0LCB0cnVlKTsKKwkJCisJCS8vIHJlbWVtYmVyIHBhcnNlZCB1bml0CisJCUltcG9ydFJlZmVyZW5jZSBwa2cgPSBwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlOworCQljaGFyW11bXSBwYWNrYWdlTmFtZSA9IHBrZyA9PSBudWxsID8gbnVsbCA6IHBrZy50b2tlbnM7CisJCWNoYXJbXSBtYWluVHlwZU5hbWUgPSBzb3VyY2VVbml0LmdldE1haW5UeXBlTmFtZSgpOworCQljaGFyW10gcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lID09IG51bGwgPyBtYWluVHlwZU5hbWUgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIG1haW5UeXBlTmFtZSwgJy4nKTsKKwkJdGhpcy5wYXJzZWRVbml0cy5wdXQocXVhbGlmaWVkTmFtZSwgcGFyc2VkVW5pdCk7CisJfQorCisJLyoqCisJICogQWRkIGFuIGFkZGl0aW9uYWwgc291cmNlIHR5cGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwkJSVNvdXJjZVR5cGUgc291cmNlVHlwZSA9IHNvdXJjZVR5cGVzWzBdOworCQl3aGlsZSAoc291cmNlVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkKKwkJCXNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkJaWYgKHNvdXJjZVR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8pIHsKKwkJCS8vIGdldCBzb3VyY2UKKwkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBlbGVtZW50SW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pIHNvdXJjZVR5cGU7CisJCQlJVHlwZSB0eXBlID0gZWxlbWVudEluZm8uZ2V0SGFuZGxlKCk7CisJCQl0cnkgeworCQkJCXRoaXMuYnVpbGRCaW5kaW5ncyh0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gbm90aGluZyB3ZSBjYW4gZG8gaGVyZTogaWdub3JlCisJCQl9CisJCX0gZWxzZSB7CisJCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPQorCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlLmdldEZpbGVOYW1lKCksIDAsIDAsIDApOworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKKwkJCQkJc291cmNlVHlwZXMsCisJCQkJCXRydWUsCisJCQkJCXRydWUsCisJCQkJCWxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwKKwkJCQkJcmVzdWx0KTsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOworCQkJdGhpcy5wYXJzZWRVbml0cy5wdXQoc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCksIHVuaXQpOworCQl9CisJfQorCisvKgorICogUGFyc2UgdGhlIGdpdmVuIGNvbXBpYXRpb24gdW5pdCBhbmQgYnVpbGQgaXRzIHR5cGUgYmluZGluZ3MuCisgKiBSZW1lbWJlciB0aGUgcGFyc2VkIHVuaXQuCisgKi8KK3B1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBidWlsZEJpbmRpbmdzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlmaW5hbCBJRmlsZSBmaWxlID0gCisJCWNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkgPworCQkJKElGaWxlKWNvbXBpbGF0aW9uVW5pdC5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSA6CisJCQkoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOworCQorCS8vIGdldCBtYWluIHR5cGUgbmFtZQorCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOworCWZpbmFsIGNoYXJbXSBtYWluVHlwZU5hbWUgPQorCQlmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSA1KS50b0NoYXJBcnJheSgpOworCQorCS8vIGZpbmQgb3V0IGlmIHVuaXQgaXMgYWxyZWFkeSBrbm93bgorCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUobmV3IFN0cmluZyhtYWluVHlwZU5hbWUpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOworCXVuaXQgPSAoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pdGhpcy5wYXJzZWRVbml0cy5nZXQocXVhbGlmaWVkTmFtZSk7CisJaWYgKHVuaXQgIT0gbnVsbCkgcmV0dXJuIHVuaXQ7CisKKwkvLyBzb3VyY2UgdW5pdAorCUlCdWZmZXIgYnVmZmVyOworCWZpbmFsIGNoYXJbXSBzb3VyY2UgPSAKKwkJY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSA/CisJCQkoYnVmZmVyID0gY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpKSA9PSBudWxsID8gbnVsbCA6IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgOgorCQkJVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoZmlsZSk7CisJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IElDb21waWxhdGlvblVuaXQoKSB7CisJCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJCQlyZXR1cm4gc291cmNlOworCQl9CisJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJCQlyZXR1cm4gZmlsZU5hbWUudG9DaGFyQXJyYXkoKTsKKwkJfQorCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwkJCXJldHVybiBtYWluVHlwZU5hbWU7CisJCX0KKwkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworCQorCS8vIGRpZXQgcGFyc2UKKwl1bml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHRoaXMsIGZpbGUsIChDb21waWxhdGlvblVuaXQpY29tcGlsYXRpb25Vbml0KTsKKwlpZiAodW5pdCAhPSBudWxsKSB7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7CisJCXRoaXMucGFyc2VkVW5pdHMucHV0KHF1YWxpZmllZE5hbWUsIHVuaXQpOworCX0KKwlyZXR1cm4gdW5pdDsKK30KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gSUZpZWxkIGZyb20gdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCB0eXBlLiAKKwkgKi8KKwlwdWJsaWMgSUZpZWxkIGNyZWF0ZUZpZWxkSGFuZGxlKAorCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkLAorCQlJVHlwZSB0eXBlKSB7CisJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCQlyZXR1cm4gdHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkLm5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIElJbXBvcnREZWNsYXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBpbXBvcnQgc3RhdGVtZW50CisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBjcmVhdGVJbXBvcnRIYW5kbGUoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCQljaGFyW10gaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWYuZ2V0SW1wb3J0TmFtZSgpLCAnLicpOworCQlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSB7CisJCQlpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoaW1wb3J0TmFtZSwgIi4qIiAudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlPcGVuYWJsZSBjdXJyZW50T3BlbmFibGUgPSB0aGlzLmdldEN1cnJlbnRPcGVuYWJsZSgpOworCQlpZiAoY3VycmVudE9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisJCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXQpY3VycmVudE9wZW5hYmxlKS5nZXRJbXBvcnQoCisJCQkJbmV3IFN0cmluZyhpbXBvcnROYW1lKSk7CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSljdXJyZW50T3BlbmFibGUpLmdldFR5cGUoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIElJbml0aWFsaXplciBmcm9tIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiBhbmQgdHlwZS4gCisJICovCisJcHVibGljIElJbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplckhhbmRsZSgKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsLAorCQlGaWVsZERlY2xhcmF0aW9uIGluaXRpYWxpemVyLAorCQlJVHlwZSB0eXBlKSB7CisJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCisJCS8vIGZpbmQgb2NjdXJlbmNlIGNvdW50IG9mIHRoZSBnaXZlbiBpbml0aWFsaXplciBpbiBpdHMgdHlwZSBkZWNsYXJhdGlvbgorCQlpbnQgb2NjdXJyZW5jZUNvdW50ID0gMDsKKwkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGVEZWNsLmZpZWxkczsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKKwkJCWlmICghZmllbGQuaXNGaWVsZCgpKSB7CisJCQkJb2NjdXJyZW5jZUNvdW50Kys7CisJCQkJaWYgKGZpZWxkLmVxdWFscyhpbml0aWFsaXplcikpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHR5cGUuZ2V0SW5pdGlhbGl6ZXIob2NjdXJyZW5jZUNvdW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIElNZXRob2QgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCB0eXBlLiAKKwkgKi8KKwlwdWJsaWMgSU1ldGhvZCBjcmVhdGVNZXRob2RIYW5kbGUoCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLAorCQlJVHlwZSB0eXBlKSB7CisJCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCQlBcmd1bWVudFtdIGFyZ3VtZW50cyA9IG1ldGhvZC5hcmd1bWVudHM7CisJCWludCBsZW5ndGggPSBhcmd1bWVudHMgPT0gbnVsbCA/IDAgOiBhcmd1bWVudHMubGVuZ3RoOworCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7CisJCQkvLyBkb24ndCBjYWNoZSB0aGUgbWV0aG9kcyBvZiB0aGUgYmluYXJ5IHR5cGUKKwkJCUNsYXNzRmlsZVJlYWRlciByZWFkZXIgPSB0aGlzLmNsYXNzRmlsZVJlYWRlcih0eXBlKTsKKwkJCWlmIChyZWFkZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQlJQmluYXJ5TWV0aG9kW10gbWV0aG9kcyA9IHJlYWRlci5nZXRNZXRob2RzKCk7CisKKwkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMCwgbWV0aG9kc0xlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWV0aG9kc0xlbmd0aDsgaSsrKSB7CisJCQkJCUlCaW5hcnlNZXRob2QgYmluYXJ5TWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCQkJY2hhcltdIHNlbGVjdG9yID0gYmluYXJ5TWV0aG9kLmlzQ29uc3RydWN0b3IoKSA/IHR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpIDogYmluYXJ5TWV0aG9kLmdldFNlbGVjdG9yKCk7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgbWV0aG9kLnNlbGVjdG9yKSkgeworCQkJCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobmV3IFN0cmluZyhiaW5hcnlNZXRob2QuZ2V0TWV0aG9kRGVzY3JpcHRvcigpKSk7CisJCQkJCQlpZiAobGVuZ3RoICE9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCkgY29udGludWU7CisJCQkJCQlib29sZWFuIHNhbWVQYXJhbWV0ZXJzID0gdHJ1ZTsKKwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJCQlUeXBlUmVmZXJlbmNlIHBhcmFtZXRlclR5cGUgPSBhcmd1bWVudHNbal0udHlwZTsKKwkJCQkJCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFyYW1ldGVyVHlwZS5nZXRUeXBlTmFtZSgpLCAnLicpOworCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1ldGVyVHlwZS5kaW1lbnNpb25zKCk7IGsrKykgeworCQkJCQkJCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHR5cGVOYW1lLCAiW10iIC50b0NoYXJBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZU5hbWUgPSBwYXJhbWV0ZXJUeXBlc1tqXS5yZXBsYWNlKCcvJywgJy4nKTsKKwkJCQkJCQlpZiAoIVNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlTmFtZSkuZW5kc1dpdGgobmV3IFN0cmluZyh0eXBlTmFtZSkpKSB7CisJCQkJCQkJCXNhbWVQYXJhbWV0ZXJzID0gZmFsc2U7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXBhcmFtZXRlclR5cGVzW2pdID0gcGFyYW1ldGVyVHlwZU5hbWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKHNhbWVQYXJhbWV0ZXJzKSB7CisJCQkJCQkJcmV0dXJuIHR5cGUuZ2V0TWV0aG9kKG5ldyBTdHJpbmcoc2VsZWN0b3IpLCBwYXJhbWV0ZXJUeXBlcyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyVHlwZSA9IGFyZ3VtZW50c1tpXS50eXBlOworCQkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYXJhbWV0ZXJUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJUeXBlLmRpbWVuc2lvbnMoKTsgaisrKSB7CisJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsICJbXSIgLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXBhcmFtZXRlclR5cGVTaWduYXR1cmVzW2ldID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodHlwZU5hbWUsIGZhbHNlKTsKKwkJCX0KKwkJCXJldHVybiB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlclR5cGVTaWduYXR1cmVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlcihJVHlwZSB0eXBlKSB7CisJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdHlwZS5nZXRDbGFzc0ZpbGUoKTsgCisJCWlmICgoKElPcGVuYWJsZSljbGFzc0ZpbGUpLmlzT3BlbigpKSB7CisJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJCXN5bmNocm9uaXplZChtYW5hZ2VyKXsKKwkJCQlyZXR1cm4gKENsYXNzRmlsZVJlYWRlciltYW5hZ2VyLmdldEluZm8odHlwZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7CisJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXBrZy5nZXRQYXJlbnQoKTsKKwkJCXRyeSB7CisJCQkJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJCQkJSVBhdGggemlwUGF0aCA9IHJvb3QuaXNFeHRlcm5hbCgpID8gcm9vdC5nZXRQYXRoKCkgOiByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldExvY2F0aW9uKCk7CisJCQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7CisJCQkJCXRyeSB7CisJCQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwUGF0aC50b09TU3RyaW5nKCkpOworCQkJCQkJY2hhcltdIHBrZ1BhdGggPSBwa2cuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkJCQkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHBrZ1BhdGgsICcuJywgJy8nKTsKKwkJCQkJCWNoYXJbXSBjbGFzc0ZpbGVOYW1lID0gY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKKwkJCQkJCWNoYXJbXSBwYXRoID0gcGtnUGF0aC5sZW5ndGggPT0gMCA/IGNsYXNzRmlsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdChwa2dQYXRoLCBjbGFzc0ZpbGVOYW1lLCAnLycpOworCQkJCQkJcmV0dXJuIENsYXNzRmlsZVJlYWRlci5yZWFkKHppcEZpbGUsIG5ldyBTdHJpbmcocGF0aCkpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCXppcEZpbGUuY2xvc2UoKTsKKwkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIENsYXNzRmlsZVJlYWRlci5yZWFkKHR5cGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIElUeXBlIGZyb20gdGhlIGdpdmVuIHNpbXBsZSB0b3AgbGV2ZWwgdHlwZSBuYW1lLiAKKwkgKi8KKwlwdWJsaWMgSVR5cGUgY3JlYXRlVHlwZUhhbmRsZShjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKKwkJT3BlbmFibGUgY3VycmVudE9wZW5hYmxlID0gdGhpcy5nZXRDdXJyZW50T3BlbmFibGUoKTsKKwkJaWYgKGN1cnJlbnRPcGVuYWJsZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgeworCQkJLy8gY3JlYXRlcyBjb21waWxhdGlvbiB1bml0CisJCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpY3VycmVudE9wZW5hYmxlOworCQorCQkJLy8gY3JlYXRlIHR5cGUKKwkJCXJldHVybiB1bml0LmdldFR5cGUobmV3IFN0cmluZyhzaW1wbGVUeXBlTmFtZSkpOworCQl9IGVsc2UgeworCQkJSVR5cGUgdHlwZTsgCisJCQl0cnkgeworCQkJCXR5cGUgPSAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSljdXJyZW50T3BlbmFibGUpLmdldFR5cGUoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkvLyBlbnN1cmUgdGhpcyBpcyBhIHRvcCBsZXZlbCB0eXBlIChzZWUgYnVnIDIwMDExICBTZWFyY2hpbmcgZm9yIElubmVyIENsYXNzZXMgZ2l2ZXMgYmFkIHNlYXJjaCByZXN1bHRzKQorCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJd2hpbGUgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgeworCQkJCXR5cGUgPSBkZWNsYXJpbmdUeXBlOworCQkJCWRlY2xhcmluZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwkJCX0KKwkJCXJldHVybiB0eXBlOworCQl9CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gSVR5cGUgZnJvbSB0aGUgZ2l2ZW4gc2ltcGxlIGlubmVyIHR5cGUgbmFtZSBhbmQgcGFyZW50IHR5cGUuIAorCSAqLworCXB1YmxpYyBJVHlwZSBjcmVhdGVUeXBlSGFuZGxlKElUeXBlIHBhcmVudCwgY2hhcltdIHNpbXBsZVR5cGVOYW1lKSB7CisJCXJldHVybiBwYXJlbnQuZ2V0VHlwZShuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lKSk7CisJfQorCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0Q3VycmVudFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZS5yZXNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgU2Nhbm5lciBnZXRTY2FubmVyKCkgeworCQlyZXR1cm4gdGhpcy5wYXJzZXIgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnBhcnNlci5zY2FubmVyOworCX0KKworCisJLyoqCisJICogTG9jYXRlIHRoZSBtYXRjaGVzIGluIHRoZSBnaXZlbiBmaWxlcyBhbmQgcmVwb3J0IHRoZW0gdXNpbmcgdGhlIHNlYXJjaCByZXF1ZXN0b3IuIAorCSAqLworCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoCisJCVN0cmluZ1tdIGZpbGVQYXRocywgCisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlLAorCQlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLCAKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJCisJCWlmIChTZWFyY2hFbmdpbmUuVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGluZyBtYXRjaGVzIGluIGZpbGVzIFsiKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpbGVQYXRocy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBwYXRoID0gZmlsZVBhdGhzW2ldOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXSIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAod29ya2luZ0NvcGllcyAhPSBudWxsKSB7CisJCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGFuZCB3b3JraW5nIGNvcGllcyBbIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gd29ya2luZ0NvcGllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJV29ya2luZ0NvcHkgd2MgPSB3b3JraW5nQ29waWVzW2ldOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArICgoSmF2YUVsZW1lbnQpd2MpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCQorCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwkJdHJ5IHsKKwkJCS8vIG9wdGltaXplIGFjY2VzcyB0byB6aXAgZmlsZXMgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb24KKwkJCW1hbmFnZXIuY2FjaGVaaXBGaWxlcygpOworCQkJCQorCQkJLy8gaW5pdGlhbGl6ZSBoYW5kbGUgZmFjdG9yeSAodXNlZCBhcyBhIGNhY2hlIG9mIGhhbmRsZXMgc28gYXMgdG8gb3B0aW1pemUgc3BhY2UpCisJCQlpZiAodGhpcy5oYW5kbGVGYWN0b3J5ID09IG51bGwpIHsKKwkJCQl0aGlzLmhhbmRsZUZhY3RvcnkgPSBuZXcgSGFuZGxlRmFjdG9yeSh3b3Jrc3BhY2UpOworCQkJfQorCQkJCisJCQkvLyBpbml0aWFsaXplIGxvY2F0b3Igd2l0aCB3b3JraW5nIGNvcGllcworCQkJdGhpcy53b3JraW5nQ29waWVzID0gd29ya2luZ0NvcGllczsKKwkJCQorCQkJLy8gc3Vic3RpdHV0ZSBjb21waWxhdGlvbiB1bml0cyB3aXRoIHdvcmtpbmcgY29waWVzCisJCQlIYXNoTWFwIHdjUGF0aHMgPSBuZXcgSGFzaE1hcCgpOyAvLyBhIG1hcCBmcm9tIHBhdGggdG8gd29ya2luZyBjb3BpZXMKKwkJCWludCB3Y0xlbmd0aDsKKwkJCWlmICh3b3JraW5nQ29waWVzICE9IG51bGwgJiYgKHdjTGVuZ3RoID0gd29ya2luZ0NvcGllcy5sZW5ndGgpID4gMCkgeworCQkJCVN0cmluZ1tdIG5ld1BhdGhzID0gbmV3IFN0cmluZ1t3Y0xlbmd0aF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3Y0xlbmd0aDsgaSsrKSB7CisJCQkJCUlXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IHdvcmtpbmdDb3BpZXNbaV07CisJCQkJCVN0cmluZyBwYXRoID0gd29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisJCQkJCXdjUGF0aHMucHV0KHBhdGgsIHdvcmtpbmdDb3B5KTsKKwkJCQkJbmV3UGF0aHNbaV0gPSBwYXRoOworCQkJCX0KKwkJCQlpbnQgZmlsZVBhdGhzTGVuZ3RoID0gZmlsZVBhdGhzLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVQYXRocywgMCwgZmlsZVBhdGhzID0gbmV3IFN0cmluZ1tmaWxlUGF0aHNMZW5ndGgrd2NMZW5ndGhdLCAwLCBmaWxlUGF0aHNMZW5ndGgpOworCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3UGF0aHMsIDAsIGZpbGVQYXRocywgZmlsZVBhdGhzTGVuZ3RoLCB3Y0xlbmd0aCk7CisJCQl9CisJCQkKKwkJCWludCBsZW5ndGggPSBmaWxlUGF0aHMubGVuZ3RoOworCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMucGF0dGVybi5uZWVkc1Jlc29sdmUpIHsKKwkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgbGVuZ3RoICogMTApOyAvLyAxIGZvciBmaWxlIHBhdGgsIDMgZm9yIHBhcnNpbmcsIDYgZm9yIGJpbmRpbmcgcmVzb2x1dGlvbiAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgbGVuZ3RoICogNCk7IC8vIDEgZm9yIGZpbGUgcGF0aCwgMyBmb3IgcGFyc2luZyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQorCQkJLy8gc29ydCBmaWxlIHBhdGhzIHByb2plY3RzCisJCQlVdGlsLnNvcnQoZmlsZVBhdGhzKTsgCisJCQkKKwkJCS8vIGluaXRpYWxpemUgcGF0dGVybiBmb3IgcG9seW1vcnBoaWMgc2VhcmNoIChpZS4gbWV0aG9kIHJlZmVyZW5jZSBwYXR0ZXJuKQorCQkJdGhpcy5tYXRjaGluZ09wZW5hYmxlcyA9IG5ldyBNYXRjaGluZ09wZW5hYmxlU2V0KCk7CisJCQl0aGlzLnBhdHRlcm4uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKHRoaXMsIHByb2dyZXNzTW9uaXRvcik7CisJCQkKKwkJCUphdmFQcm9qZWN0IHByZXZpb3VzSmF2YVByb2plY3QgPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IGZpbGVQYXRoc1tpXTsKKwkJCQkKKwkJCQkvLyBza2lwIGR1cGxpY2F0ZSBwYXRocworCQkJCWlmIChpID4gMCAmJiBwYXRoU3RyaW5nLmVxdWFscyhmaWxlUGF0aHNbaS0xXSkpIGNvbnRpbnVlOworCQkJCQorCQkJCU9wZW5hYmxlIG9wZW5hYmxlOworCQkJCUlXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJV29ya2luZ0NvcHkpd2NQYXRocy5nZXQocGF0aFN0cmluZyk7CisJCQkJaWYgKHdvcmtpbmdDb3B5ICE9IG51bGwpIHsKKwkJCQkJb3BlbmFibGUgPSAoT3BlbmFibGUpd29ya2luZ0NvcHk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3BlbmFibGUgPSB0aGlzLmhhbmRsZUZhY3RvcnkuY3JlYXRlT3BlbmFibGUocGF0aFN0cmluZyk7CisJCQkJCWlmIChvcGVuYWJsZSA9PSBudWxsKQorCQkJCQkJY29udGludWU7IC8vIG1hdGNoIGlzIG91dHNpZGUgY2xhc3NwYXRoCisJCQkJfQorCQorCQkJCS8vIGNyZWF0ZSBuZXcgcGFyc2VyIGFuZCBsb29rdXAgZW52aXJvbm1lbnQgaWYgdGhpcyBpcyBhIG5ldyBwcm9qZWN0CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIG9wZW5hYmxlLmdldEphdmFQcm9qZWN0KCk7CisJCQkJCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7CisJCQkJCQlyZXNvdXJjZSA9IHdvcmtpbmdDb3B5LmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVzb3VyY2UgPSBvcGVuYWJsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCQkJfQorCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeyAvLyBjYXNlIG9mIGEgZmlsZSBpbiBhbiBleHRlcm5hbCBqYXIKKwkJCQkJCXJlc291cmNlID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworCQkJCQl9CisJCQkJCWlmICghamF2YVByb2plY3QuZXF1YWxzKHByZXZpb3VzSmF2YVByb2plY3QpKSB7CisJCQkJCQkvLyBsb2NhdGUgbWF0Y2hlcyBpbiBwcmV2aW91cyBwcm9qZWN0CisJCQkJCQlpZiAocHJldmlvdXNKYXZhUHJvamVjdCAhPSBudWxsKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJdGhpcy5sb2NhdGVNYXRjaGVzKHByZXZpb3VzSmF2YVByb2plY3QsIHByb2dyZXNzTW9uaXRvcik7CisJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJaWYgKGUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJCQkJCQl0aHJvdyBlOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzcGF0aCBpbiB0aGlzIHByb2plY3QgLT4gc2tpcCBpdAorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRoaXMubWF0Y2hpbmdPcGVuYWJsZXMgPSBuZXcgTWF0Y2hpbmdPcGVuYWJsZVNldCgpOworCQkJCQkJfQorCQorCQkJCQkJLy8gY3JlYXRlIHBhcnNlciBmb3IgdGhpcyBwcm9qZWN0CisJCQkJCQl0aGlzLmNyZWF0ZVBhcnNlcihqYXZhUHJvamVjdCk7CisJCQkJCQlwcmV2aW91c0phdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkvLyBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4gc2tpcCBpdAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCisJCQkJLy8gYWRkIG1hdGNoaW5nIG9wZW5hYmxlCisJCQkJdGhpcy5hZGRNYXRjaGluZ09wZW5hYmxlKHJlc291cmNlLCBvcGVuYWJsZSk7CisJCisJCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyBsYXN0IHByb2plY3QKKwkJCWlmIChwcmV2aW91c0phdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMocHJldmlvdXNKYXZhUHJvamVjdCwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlpZiAoZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCQkJCXRocm93IGU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3NwYXRoIGluIGxhc3QgcHJvamVjdCAtPiBza2lwIGl0CisJCQkJCX0KKwkJCQl9CisJCQkJdGhpcy5tYXRjaGluZ09wZW5hYmxlcyA9IG5ldyBNYXRjaGluZ09wZW5hYmxlU2V0KCk7CisJCQl9IAorCQkJCisJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKKwkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKHRoaXMubmFtZUVudmlyb25tZW50ICE9IG51bGwpIHsKKwkJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5jbGVhbnVwKCk7CisJCQl9CisJCQl0aGlzLnBhcnNlZFVuaXRzID0gbnVsbDsKKwkJCW1hbmFnZXIuZmx1c2haaXBGaWxlcygpOworCQl9CQorCX0KKworCS8qKgorCSAqIExvY2F0ZXMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsb2NhdG9yJ3MgcGF0dGVybi4gCisJICovCisJcHVibGljIHZvaWQgbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhJV29ya3NwYWNlIHdvcmtzcGFjZSkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyh0aGlzLnBhdHRlcm4sIHdvcmtzcGFjZSk7CisJfQorCisJLyoqCisJICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VhcmNoIHBhdHRlcm4uIAorCSAqLworCXByaXZhdGUgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKAorCQlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sCisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHNlYXJjaFBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pIHsKKwkJCU9yUGF0dGVybiBvclBhdHRlcm4gPSAoT3JQYXR0ZXJuKSBzZWFyY2hQYXR0ZXJuOworCQkJdGhpcy5sb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKG9yUGF0dGVybi5sZWZ0UGF0dGVybiwgd29ya3NwYWNlKTsKKwkJCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhvclBhdHRlcm4ucmlnaHRQYXR0ZXJuLCB3b3Jrc3BhY2UpOworCQl9IGVsc2UKKwkJCWlmIChzZWFyY2hQYXR0ZXJuIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybikgeworCQkJCVBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4gcGtnUGF0dGVybiA9CisJCQkJCShQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuKSBzZWFyY2hQYXR0ZXJuOworCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0KKwkJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHByb2plY3RzW2ldOworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIHJvb3RzTGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBqIDwgcm9vdHNMZW5ndGg7IGorKykgeworCQkJCQkJSUphdmFFbGVtZW50W10gcGtncyA9IHJvb3RzW2pdLmdldENoaWxkcmVuKCk7CisJCQkJCQlmb3IgKGludCBrID0gMCwgcGtzTGVuZ3RoID0gcGtncy5sZW5ndGg7IGsgPCBwa3NMZW5ndGg7IGsrKykgeworCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpcGtnc1trXTsKKwkJCQkJCQlpZiAocGtnLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCAKKwkJCQkJCQkJCSYmIHBrZ1BhdHRlcm4ubWF0Y2hlc05hbWUocGtnUGF0dGVybi5wa2dOYW1lLCBwa2cuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKSkgeworCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwa2cuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkJCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7IC8vIGNhc2Ugb2YgYSBmaWxlIGluIGFuIGV4dGVybmFsIGphcgorCQkJCQkJCQkJcmVzb3VyY2UgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZSA9IG5ldyBNYXRjaGluZ09wZW5hYmxlKHRoaXMsIHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCXRoaXMucmVwb3J0KC0xLCAtMiwgcGtnLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7CisJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQkJCQkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKSBlOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCX0KK3B1YmxpYyBJVHlwZSBsb29rdXBUeXBlKFR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJY2hhcltdIHBhY2thZ2VOYW1lID0gdHlwZUJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwljaGFyW10gdHlwZU5hbWUgPSB0eXBlQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCk7CisJCisJLy8gZmluZCBwYWNrYWdlIGZyYWdtZW50cworCUlQYWNrYWdlRnJhZ21lbnRbXSBwa2dzID0gCisJCXRoaXMubmFtZUxvb2t1cC5maW5kUGFja2FnZUZyYWdtZW50cygKKwkJCShwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKSA/IAorCQkJCUlQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUgOiAKKwkJCQluZXcgU3RyaW5nKHBhY2thZ2VOYW1lKSwgCisJCQlmYWxzZSk7CisJCQkKKwkvLyBpdGVyYXRlIHR5cGUgbG9va3VwIGluIGVhY2ggcGFja2FnZSBmcmFnbWVudAorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwa2dzID09IG51bGwgPyAwIDogcGtncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJVHlwZSB0eXBlID0gCisJCQl0aGlzLm5hbWVMb29rdXAuZmluZFR5cGUoCisJCQkJbmV3IFN0cmluZyh0eXBlTmFtZSksIAorCQkJCXBrZ3NbaV0sIAorCQkJCWZhbHNlLCAKKwkJCQl0eXBlQmluZGluZy5pc0NsYXNzKCkgPworCQkJCQlOYW1lTG9va3VwLkFDQ0VQVF9DTEFTU0VTOgorCQkJCQlOYW1lTG9va3VwLkFDQ0VQVF9JTlRFUkZBQ0VTKTsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CQorCX0KKwkKKwkvLyBzZWFyY2ggaW5zaWRlIGVuY2xvc2luZyBlbGVtZW50CisJY2hhcltdW10gcXVhbGlmaWVkTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lKTsKKwlpbnQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7CisJaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKKwlJVHlwZSB0eXBlID0gdGhpcy5jcmVhdGVUeXBlSGFuZGxlKHF1YWxpZmllZE5hbWVbMF0pOworCWlmICh0eXBlID09IG51bGwpIHJldHVybiBudWxsOworCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJdHlwZSA9IHRoaXMuY3JlYXRlVHlwZUhhbmRsZSh0eXBlLCBxdWFsaWZpZWROYW1lW2ldKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJfQorCWlmICh0eXBlLmV4aXN0cygpKSByZXR1cm4gdHlwZTsJCisJCisJcmV0dXJuIG51bGw7Cit9CisJcHVibGljIHZvaWQgcmVwb3J0KAorCQlpbnQgc291cmNlU3RhcnQsCisJCWludCBzb3VyY2VFbmQsCisJCUlKYXZhRWxlbWVudCBlbGVtZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAodGhpcy5zY29wZS5lbmNsb3NlcyhlbGVtZW50KSkgeworCQkJaWYgKFNlYXJjaEVuZ2luZS5WRVJCT1NFKSB7CisJCQkJSVJlc291cmNlIHJlcyA9IHRoaXMuZ2V0Q3VycmVudFJlc291cmNlKCk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBvcnRpbmcgbWF0Y2giKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRSZXNvdXJjZTogIiArIChyZXMgPT0gbnVsbCA/ICIgPHVua25vd24+ICIgOiByZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFBvc2l0aW9uczogWyIgKyBzb3VyY2VTdGFydCArICIsICIgKyBzb3VyY2VFbmQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRKYXZhIGVsZW1lbnQ6ICIgKyAoKEphdmFFbGVtZW50KWVsZW1lbnQpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChhY2N1cmFjeSA9PSBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0QWNjdXJhY3k6IEVYQUNUX01BVENIIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0QWNjdXJhY3k6IFBPVEVOVElBTF9NQVRDSCIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXBvcnQoCisJCQkJdGhpcy5nZXRDdXJyZW50UmVzb3VyY2UoKSwKKwkJCQlzb3VyY2VTdGFydCwKKwkJCQlzb3VyY2VFbmQsCisJCQkJZWxlbWVudCwKKwkJCQlhY2N1cmFjeSk7CisJCX0KKwl9CisJcHVibGljIHZvaWQgcmVwb3J0KAorCQlJUmVzb3VyY2UgcmVzb3VyY2UsCisJCWludCBzb3VyY2VTdGFydCwKKwkJaW50IHNvdXJjZUVuZCwKKwkJSUphdmFFbGVtZW50IGVsZW1lbnQsCisJCWludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCXRoaXMuY29sbGVjdG9yLmFjY2VwdCgKKwkJCXJlc291cmNlLAorCQkJc291cmNlU3RhcnQsCisJCQlzb3VyY2VFbmQgKyAxLAorCQkJZWxlbWVudCwKKwkJCWFjY3VyYWN5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBvcnRCaW5hcnlNYXRjaCgKKwkJSU1lbWJlciBiaW5hcnlNZW1iZXIsCisJCUlCaW5hcnlUeXBlIGluZm8sCisJCWludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkKKwkJdGhpcy5yZXBvcnRCaW5hcnlNYXRjaChudWxsLCBiaW5hcnlNZW1iZXIsIGluZm8sIGFjY3VyYWN5KTsKKwl9CisJcHVibGljIHZvaWQgcmVwb3J0QmluYXJ5TWF0Y2goCisJCUlSZXNvdXJjZSByZXNvdXJjZSwKKwkJSU1lbWJlciBiaW5hcnlNZW1iZXIsCisJCUlCaW5hcnlUeXBlIGluZm8sCisJCWludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlTb3VyY2VSYW5nZSByYW5nZSA9IGJpbmFyeU1lbWJlci5nZXROYW1lUmFuZ2UoKTsKKwkJaWYgKHJhbmdlLmdldE9mZnNldCgpID09IC0xKSB7CisJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgYmluYXJ5TWVtYmVyLmdldENsYXNzRmlsZSgpOworCQkJU291cmNlTWFwcGVyIG1hcHBlciA9IGNsYXNzRmlsZS5nZXRTb3VyY2VNYXBwZXIoKTsKKwkJCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOworCQkJCWNoYXJbXSBjb250ZW50cyA9IG1hcHBlci5maW5kU291cmNlKHR5cGUsIGluZm8pOworCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7CisJCQkJCXJhbmdlID0gbWFwcGVyLm1hcFNvdXJjZSh0eXBlLCBjb250ZW50cywgYmluYXJ5TWVtYmVyKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW50IHN0YXJ0SW5kZXggPSByYW5nZS5nZXRPZmZzZXQoKTsKKwkJaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHJhbmdlLmdldExlbmd0aCgpIC0gMTsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCXRoaXMucmVwb3J0KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBiaW5hcnlNZW1iZXIsIGFjY3VyYWN5KTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucmVwb3J0KHJlc291cmNlLCBzdGFydEluZGV4LCBlbmRJbmRleCwgYmluYXJ5TWVtYmVyLCBhY2N1cmFjeSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiBmaWVsZCBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRGaWVsZERlY2xhcmF0aW9uKAorCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sCisJCUlKYXZhRWxlbWVudCBwYXJlbnQsCisJCWludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGFjY2VwdCBmaWVsZCBkZWNsYXJhdGlvbgorCQl0aGlzLnJlcG9ydCgKKwkJCWZpZWxkRGVjbGFyYXRpb24uc291cmNlU3RhcnQsCisJCQlmaWVsZERlY2xhcmF0aW9uLnNvdXJjZUVuZCwKKwkJCShwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgPworCQkJCSgoSVR5cGUpcGFyZW50KS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkRGVjbGFyYXRpb24ubmFtZSkpIDoKKwkJCQlwYXJlbnQsCisJCQlhY2N1cmFjeSk7CisJfQorCisJLyoqCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gaW1wb3J0IHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydEltcG9ydChJbXBvcnRSZWZlcmVuY2UgcmVmZXJlbmNlLCBpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBjcmVhdGUgZGVmaW5pbmcgaW1wb3J0IGhhbmRsZQorCQlJSmF2YUVsZW1lbnQgaW1wb3J0SGFuZGxlID0gdGhpcy5jcmVhdGVJbXBvcnRIYW5kbGUocmVmZXJlbmNlKTsKKworCQkvLyBhY2NlcHQgcmVmZXJlbmNlCisJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydEltcG9ydFJlZihyZWZlcmVuY2UsIG51bGwsIGltcG9ydEhhbmRsZSwgYWNjdXJhY3ksIHRoaXMpOworCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRNZXRob2REZWNsYXJhdGlvbigKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKKwkJSUphdmFFbGVtZW50IHBhcmVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJLy8gY3JlYXRlIG1ldGhvZCBoYW5kbGUKKwkJCWVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU1ldGhvZEhhbmRsZShtZXRob2REZWNsYXJhdGlvbiwgKElUeXBlKXBhcmVudCk7CisJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCX0gZWxzZSB7CisJCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCQl9CisKKwkJLy8gY29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBzZWxlY3RvciAKKwkJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CisJCWludCBuYW1lU291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwkJc2Nhbm5lci5zZXRTb3VyY2UoCisJCQl0aGlzLmN1cnJlbnRNYXRjaGluZ09wZW5hYmxlLmdldFNvdXJjZSgpKTsKKwkJc2Nhbm5lci5yZXNldFRvKG5hbWVTb3VyY2VTdGFydCwgbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKTsKKwkJdHJ5IHsKKwkJCXNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJaW50IG5hbWVTb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisKKwkJLy8gYWNjZXB0IG1ldGhvZCBkZWNsYXJhdGlvbgorCQl0aGlzLnJlcG9ydChuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQsIGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5KTsKKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiBwYWNrYWdlIGRlY2xhcmF0aW9uIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydFBhY2thZ2VEZWNsYXJhdGlvbihJbXBvcnRSZWZlcmVuY2Ugbm9kZSkgeworCQkvLyBUQkQKKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiBwYWNrYWdlIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRQYWNrYWdlUmVmZXJlbmNlKEltcG9ydFJlZmVyZW5jZSBub2RlKSB7CisJCS8vIFRCRAorCX0KKworCS8qKgorCSAqIEZpbmRzIHRoZSBhY2N1cmF0ZSBwb3NpdGlvbnMgb2YgdGhlIHNlcXVlbmNlIG9mIHRva2VucyBnaXZlbiBieSBxdWFsaWZpZWROYW1lCisJICogaW4gdGhlIHNvdXJjZSBhbmQgcmVwb3J0cyBhIHJlZmVyZW5jZSB0byB0aGlzIHRoaXMgcXVhbGlmaWVkIG5hbWUKKwkgKiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZSgKKwkJaW50IHNvdXJjZVN0YXJ0LAorCQlpbnQgc291cmNlRW5kLAorCQljaGFyW11bXSBxdWFsaWZpZWROYW1lLAorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCisJCWlmIChhY2N1cmFjeSA9PSAtMSkgcmV0dXJuOworCQorCQkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UgCisJCVNjYW5uZXIgc2Nhbm5lciA9IHBhcnNlci5zY2FubmVyOworCQlzY2FubmVyLnNldFNvdXJjZSgKKwkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUuZ2V0U291cmNlKCkpOworCQlzY2FubmVyLnJlc2V0VG8oc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJCisJCWludCByZWZTb3VyY2VTdGFydCA9IC0xLCByZWZTb3VyY2VFbmQgPSAtMTsKKwkJaW50IHRva2VuTnVtYmVyID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7CisJCWludCB0b2tlbiA9IC0xOworCQlpbnQgcHJldmlvdXNWYWxpZCA9IC0xOworCQlpbnQgaSA9IDA7CisJCWludCBjdXJyZW50UG9zaXRpb247CisJCWRvIHsKKwkJCS8vIGZpbmQgZmlyc3QgdG9rZW4gdGhhdCBpcyBhbiBpZGVudGlmaWVyIChwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zIGluY2x1ZGUgcGFyZW50aGVzaXNlcyBpbiBzb3VyY2UgcmFuZ2UgLSBzZWUgYnVnIDIwNjkzIC0gRmluZGluZyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBkb2VzIG5vdCBmaW5kIGFsbCBvY2N1cnJlbmNlcyAgKQorCQkJZG8geworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0gd2hpbGUgKHRva2VuICE9ICBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXIgJiYgdG9rZW4gIT0gIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKTsKKwkKKwkJCWlmICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCWJvb2xlYW4gZXF1YWxzID0gZmFsc2U7CisJCQkJd2hpbGUgKGkgPCB0b2tlbk51bWJlcgorCQkJCQkmJiAhKGVxdWFscyA9IHRoaXMucGF0dGVybi5tYXRjaGVzTmFtZShxdWFsaWZpZWROYW1lW2krK10sIGN1cnJlbnRUb2tlblNvdXJjZSkpKSB7CisJCQkJfQorCQkJCWlmIChlcXVhbHMgJiYgKHByZXZpb3VzVmFsaWQgPT0gLTEgfHwgcHJldmlvdXNWYWxpZCA9PSBpIC0gMikpIHsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IGkgLSAxOworCQkJCQlpZiAocmVmU291cmNlU3RhcnQgPT0gLTEpIHsKKwkJCQkJCXJlZlNvdXJjZVN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOworCQkJCQl9CisJCQkJCXJlZlNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlpID0gMDsKKwkJCQkJcmVmU291cmNlU3RhcnQgPSAtMTsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IC0xOworCQkJCX0KKwkJCQkvLyByZWFkICcuJworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJCWlmIChpID09IHRva2VuTnVtYmVyKSB7CisJCQkJLy8gYWNjZXB0IHJlZmVyZW5jZQorCQkJCWlmIChyZWZTb3VyY2VTdGFydCAhPSAtMSkgeworCQkJCQl0aGlzLnJlcG9ydChyZWZTb3VyY2VTdGFydCwgcmVmU291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjeSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5yZXBvcnQoc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZWxlbWVudCwgYWNjdXJhY3kpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCX0gd2hpbGUgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKTsKKwkKKwl9CisJLyoqCisJICogRmluZHMgdGhlIGFjY3VyYXRlIHBvc2l0aW9ucyBvZiBlYWNoIHZhbGlkIHRva2VuIGluIHRoZSBzb3VyY2UgYW5kCisJICogcmVwb3J0cyBhIHJlZmVyZW5jZSB0byB0aGlzIHRva2VuIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqIEEgdG9rZW4gaXMgdmFsaWQgaWYgaXQgaGFzIGFuIGFjY3VycmFjeSB3aGljaCBpcyBub3QgLTEuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0QWNjdXJhdGVSZWZlcmVuY2UoCisJCWludCBzb3VyY2VTdGFydCwKKwkJaW50IHNvdXJjZUVuZCwKKwkJY2hhcltdW10gdG9rZW5zLAorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKKwkJaW50W10gYWNjdXJhY2llcykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNvbXB1dGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgcXVhbGlmaWVkIHJlZmVyZW5jZSAKKwkJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CisJCXNjYW5uZXIuc2V0U291cmNlKAorCQkJdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZS5nZXRTb3VyY2UoKSk7CisJCXNjYW5uZXIucmVzZXRUbyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKworCQlpbnQgcmVmU291cmNlU3RhcnQgPSAtMSwgcmVmU291cmNlRW5kID0gLTE7CisJCWludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQlpbnQgdG9rZW4gPSAtMTsKKwkJaW50IHByZXZpb3VzVmFsaWQgPSAtMTsKKwkJaW50IGkgPSAwOworCQlpbnQgYWNjdXJhY3lJbmRleCA9IDA7CisJCWRvIHsKKwkJCWludCBjdXJyZW50UG9zaXRpb24gPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCS8vIHJlYWQgdG9rZW4KKwkJCXRyeSB7CisJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJCWlmICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCWJvb2xlYW4gZXF1YWxzID0gZmFsc2U7CisJCQkJd2hpbGUgKGkgPCBsZW5ndGgKKwkJCQkJJiYgIShlcXVhbHMgPSB0aGlzLnBhdHRlcm4ubWF0Y2hlc05hbWUodG9rZW5zW2krK10sIGN1cnJlbnRUb2tlblNvdXJjZSkpKSB7CisJCQkJfQorCQkJCWlmIChlcXVhbHMgJiYgKHByZXZpb3VzVmFsaWQgPT0gLTEgfHwgcHJldmlvdXNWYWxpZCA9PSBpIC0gMikpIHsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IGkgLSAxOworCQkJCQlpZiAocmVmU291cmNlU3RhcnQgPT0gLTEpIHsKKwkJCQkJCXJlZlNvdXJjZVN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOworCQkJCQl9CisJCQkJCXJlZlNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlpID0gMDsKKwkJCQkJcmVmU291cmNlU3RhcnQgPSAtMTsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IC0xOworCQkJCX0KKwkJCQkvLyByZWFkICcuJworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJCWlmIChhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdICE9IC0xKSB7CisJCQkJLy8gYWNjZXB0IHJlZmVyZW5jZQorCQkJCWlmIChyZWZTb3VyY2VTdGFydCAhPSAtMSkgeworCQkJCQl0aGlzLnJlcG9ydChyZWZTb3VyY2VTdGFydCwgcmVmU291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnJlcG9ydChzb3VyY2VTdGFydCwgc291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdKTsKKwkJCQl9CisJCQkJaSA9IDA7CisJCQl9CisJCQlyZWZTb3VyY2VTdGFydCA9IC0xOworCQkJcHJldmlvdXNWYWxpZCA9IC0xOworCQkJaWYgKGFjY3VyYWN5SW5kZXggPCBhY2N1cmFjaWVzLmxlbmd0aC0xKSB7CisJCQkJYWNjdXJhY3lJbmRleCsrOworCQkJfQorCQl9IHdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRik7CisKKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuCisJICogSXQgaXMgZG9uZSBpbiB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCB0aGUgbWV0aG9kJ3MgZGVmaW5pbmcgdHlwZXMgCisJICogaGF2ZSB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydFJlZmVyZW5jZSgKKwkJQXN0Tm9kZSByZWZlcmVuY2UsCisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sCisJCUlKYXZhRWxlbWVudCBwYXJlbnQsCisJCWludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50OworCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJCS8vIGNyZWF0ZSBkZWZpbmluZyBtZXRob2QgaGFuZGxlCisJCQllbmNsb3NpbmdFbGVtZW50ID0gdGhpcy5jcmVhdGVNZXRob2RIYW5kbGUobWV0aG9kRGVjbGFyYXRpb24sIChJVHlwZSlwYXJlbnQpOworCQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYXNlIG9mIGEgbWF0Y2ggZm91bmQgaW4gYSB0eXBlIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgY2xhc3MgZmlsZQorCQl9IGVsc2UgeworCQkJZW5jbG9zaW5nRWxlbWVudCA9IHBhcmVudDsKKwkJfQorCisJCS8vIGFjY2VwdCByZWZlcmVuY2UKKwkJdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHJlZmVyZW5jZSwgZW5jbG9zaW5nRWxlbWVudCwgYWNjdXJhY3ksIHRoaXMpOworCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBmaWVsZCBhbmQgZ2l2ZW4gdHlwZS4KKwkgKiBUaGUgZmllbGQncyBkZWZpbmluZyB0eXBlcyBoYXZlIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0UmVmZXJlbmNlKAorCQlBc3ROb2RlIHJlZmVyZW5jZSwKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLAorCQlJSmF2YUVsZW1lbnQgcGFyZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudDsKKwkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaXNGaWVsZCgpKSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJCQkvLyBjcmVhdGUgZGVmaW5pbmcgZmllbGQgaGFuZGxlCisJCQkJZW5jbG9zaW5nRWxlbWVudCA9IHRoaXMuY3JlYXRlRmllbGRIYW5kbGUoZmllbGREZWNsYXJhdGlvbiwgKElUeXBlKXBhcmVudCk7CisJCQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCQkJfQorCisJCQkvLyBhY2NlcHQgcmVmZXJlbmNlCisJCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgdGhpcyk7CisJCX0gZWxzZSB7IC8vIGluaXRpYWxpemVyCisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJCQkvLyBjcmVhdGUgZGVmaW5pbmcgaW5pdGlhbGl6ZXIKKwkJCQllbmNsb3NpbmdFbGVtZW50ID0KKwkJCQkJdGhpcy5jcmVhdGVJbml0aWFsaXplckhhbmRsZSgKKwkJCQkJCXR5cGVEZWNsYXJhdGlvbiwKKwkJCQkJCWZpZWxkRGVjbGFyYXRpb24sCisJCQkJCQkoSVR5cGUpcGFyZW50KTsKKwkJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWVuY2xvc2luZ0VsZW1lbnQgPSBwYXJlbnQ7CisJCQl9CisKKwkJCS8vIGFjY2VwdCByZWZlcmVuY2UKKwkJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCB0aGlzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHN1cGVyIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqIEl0IGlzIGRvbmUgaW4gdGhlIGdpdmVuIGRlZmluaW5nIHR5cGUgKHdpdGggdGhlIGdpdmVuIHNpbXBsZSBuYW1lcykuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKAorCQlUeXBlUmVmZXJlbmNlIHR5cGVSZWYsCisJCUlKYXZhRWxlbWVudCB0eXBlLAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBhY2NlcHQgdHlwZSByZWZlcmVuY2UKKwkJdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0UmVmZXJlbmNlKHR5cGVSZWYsIHR5cGUsIGFjY3VyYWN5LCB0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydFR5cGVEZWNsYXJhdGlvbigKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKKwkJSUphdmFFbGVtZW50IHBhcmVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gYWNjZXB0IGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbgorCQl0aGlzLnJlcG9ydCgKKwkJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKKwkJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQsCisJCQkocGFyZW50ID09IG51bGwpID8KKwkJCQl0aGlzLmNyZWF0ZVR5cGVIYW5kbGUodHlwZURlY2xhcmF0aW9uLm5hbWUpIDoKKwkJCQkocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpID8KKwkJCQkJdGhpcy5jcmVhdGVUeXBlSGFuZGxlKChJVHlwZSlwYXJlbnQsIHR5cGVEZWNsYXJhdGlvbi5uYW1lKSA6CisJCQkJCXBhcmVudCwKKwkJCWFjY3VyYWN5KTsKKwl9CisKK3ByaXZhdGUgTWF0Y2hpbmdPcGVuYWJsZSBuZXdNYXRjaGluZ09wZW5hYmxlKElSZXNvdXJjZSByZXNvdXJjZSwgT3BlbmFibGUgb3BlbmFibGUpIHsKKwlNYXRjaGluZ09wZW5hYmxlIG1hdGNoaW5nT3BlbmFibGU7CisJdHJ5IHsKKwkJbWF0Y2hpbmdPcGVuYWJsZSA9IG5ldyBNYXRjaGluZ09wZW5hYmxlKHRoaXMsIHJlc291cmNlLCBvcGVuYWJsZSk7CisJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCS8vIHByb2JsZW0gd2l0aCBjbGFzcyBwYXRoOiBpZ25vcmUgdGhpcyBtYXRjaGluZyBvcGVuYWJsZQorCQlyZXR1cm4gbnVsbDsKKwl9CisJcmV0dXJuIG1hdGNoaW5nT3BlbmFibGU7Cit9CisKK3ByaXZhdGUgdm9pZCBhZGRNYXRjaGluZ09wZW5hYmxlKElSZXNvdXJjZSByZXNvdXJjZSwgT3BlbmFibGUgb3BlbmFibGUpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwlNYXRjaGluZ09wZW5hYmxlIG1hdGNoaW5nT3BlbmFibGUgPSB0aGlzLm5ld01hdGNoaW5nT3BlbmFibGUocmVzb3VyY2UsIG9wZW5hYmxlKTsKKwlpZiAobWF0Y2hpbmdPcGVuYWJsZSAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hpbmdPcGVuYWJsZXMuYWRkKG1hdGNoaW5nT3BlbmFibGUpOworCX0KK30KKworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHBhcnNlciBmb3IgdGhlIGdpdmVuIHByb2plY3QsIGFzIHdlbGwgYXMgYSBsb29rdXAgZW52aXJvbm1lbnQuCisJICogQXNrcyB0aGUgcGF0dGVybiB0byBpbml0aWFsaXplIGl0c2VsZiBmb3IgcG9seW1vcnBoaWMgc2VhcmNoLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnNlcihKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJLy8gY2xlYXVwIGFuZCByZWNyZWF0ZSBmaWxlIG5hbWUgZW52aXJvbm1lbnQKKwkJaWYgKHRoaXMubmFtZUVudmlyb25tZW50ICE9IG51bGwpIHsKKwkJCXRoaXMubmFtZUVudmlyb25tZW50LmNsZWFudXAoKTsKKwkJfQorCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IHRoaXMuZ2V0TmFtZUVudmlyb25tZW50KHByb2plY3QpOworCQkKKwkJLy8gY3JlYXRlIGxvb2t1cCBlbnZpcm9ubWVudAorCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9CisJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAorCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQkJCW9wdGlvbnMsCisJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsKKwkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CisJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgb3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCB0aGlzLm5hbWVFbnZpcm9ubWVudCk7CisJCQkKKwkJLy8gY3JlYXRlIHBhcnNlcgorCQl0aGlzLnBhcnNlciA9IG5ldyBNYXRjaExvY2F0b3JQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBvcHRpb25zLmFzc2VydE1vZGUpOworCQkKKwkJLy8gcmVzZXQgcGFyc2VkIHVuaXRzICh0aGV5IGNvdWxkIGhvbGQgb250byBvYnNvbGV0ZSBiaW5kaW5nczogc2VlIGJ1ZyAxNjA1MikKKwkJTWF0Y2hpbmdPcGVuYWJsZVtdIG9wZW5hYmxlcyA9IHRoaXMubWF0Y2hpbmdPcGVuYWJsZXMuZ2V0TWF0Y2hpbmdPcGVuYWJsZXMocHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9wZW5hYmxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJTWF0Y2hpbmdPcGVuYWJsZSBtYXRjaGluZ09wZW5hYmxlID0gb3BlbmFibGVzW2ldOworCQkJbWF0Y2hpbmdPcGVuYWJsZS5yZXNldCgpOworCQl9CisJCXRoaXMucGFyc2VkVW5pdHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoMTApOworCQkKKwkJLy8gcmVtZW1iZXIgcHJvamVjdCdzIG5hbWUgbG9va3VwCisJCXRoaXMubmFtZUxvb2t1cCA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpOworCX0KKworCXByaXZhdGUgSU5hbWVFbnZpcm9ubWVudCBnZXROYW1lRW52aXJvbm1lbnQoSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCS8vcmV0dXJuIHByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCQkKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IHByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJaW50IGxlbmd0aCA9IHJvb3RzLmxlbmd0aDsKKwkJU3RyaW5nW10gY2xhc3NwYXRoTmFtZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCWludCByb290TW9kZXNbXSA9IG5ldyBpbnRbbGVuZ3RoXTsKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJCUlQYXRoIHBhdGggPSByb290LmdldFBhdGgoKTsKKwkJCXJvb3RNb2Rlc1tpXSA9IChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgID8gQ2xhc3NwYXRoRGlyZWN0b3J5LlNPVVJDRSA6IENsYXNzcGF0aERpcmVjdG9yeS5CSU5BUlk7CisJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJCS8vIHBhc3MgaW4gYSByZWxhdGl2ZSBwYXRoIChmb3IgaW50ZXJuYWwgamFyKSBhcyB0aGlzIGlzIHdoYXQgaXMgbmVlZGVkIGJ5IEZpbGVOYW1ld0Vudmlyb21lbnQuZ2V0WmlwRmlsZShGaWxlKQorCQkJCWNsYXNzcGF0aE5hbWVzW2ldID0gcGF0aC50b09TU3RyaW5nKCk7CisJCQl9IGVsc2UgeworCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIGZhbHNlKTsKKwkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJCWNsYXNzcGF0aE5hbWVzW2ldID0gKChJUmVzb3VyY2UpdGFyZ2V0KS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKwkJCQl9IGVsc2UgeworCQkJCQljbGFzc3BhdGhOYW1lc1tpXSA9IHBhdGgudG9PU1N0cmluZygpOworCQkJCX0KKwkJCX0KKwkJfQorCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCXJldHVybiBuZXcgRmlsZU5hbWVFbnZpcm9ubWVudChjbGFzc3BhdGhOYW1lcywgZW5jb2RpbmcsIHJvb3RNb2Rlcyk7CisJCQorCX0KKworCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBkaWV0UGFyc2UoZmluYWwgY2hhcltdIHNvdXJjZSkgeworCQkvLyBzb3VyY2UgdW5pdAorCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgSUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJCQkJcmV0dXJuIHNvdXJjZTsKKwkJCX0KKwkJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJCQkJcmV0dXJuIEVNUFRZX0ZJTEVfTkFNRTsgLy8gbm90IHVzZWQKKwkJCX0KKwkJCXB1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgeworCQkJCXJldHVybiBudWxsOyAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIG1haW4gdHlwZSBuYW1lID09IGNvbXBpbGF0aW9uIHVuaXQgbmFtZQorCQkJfQorCQkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCQkKKwkJLy8gZGlldCBwYXJzZQorCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCAwKTsgIAorCQlyZXR1cm4gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKKwl9CisJCisJcHVibGljIGNoYXJbXSBmaW5kU291cmNlKENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwkJY2hhcltdIHNvdXJjZSA9IG51bGw7IAorCQl0cnkgeworCQkJU291cmNlTWFwcGVyIHNvdXJjZU1hcHBlciA9IGNsYXNzRmlsZS5nZXRTb3VyY2VNYXBwZXIoKTsKKwkJCWlmIChzb3VyY2VNYXBwZXIgIT0gbnVsbCkgeworCQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOworCQkJCWlmIChjbGFzc0ZpbGUuaXNPcGVuKCkgJiYgdHlwZS5nZXREZWNsYXJpbmdUeXBlKCkgPT0gbnVsbCkgeworCQkJCQlzb3VyY2UgPSBzb3VyY2VNYXBwZXIuZmluZFNvdXJjZSh0eXBlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gdGhpcy5jbGFzc0ZpbGVSZWFkZXIodHlwZSk7CisJCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgeworCQkJCQkJc291cmNlID0gc291cmNlTWFwcGVyLmZpbmRTb3VyY2UodHlwZSwgcmVhZGVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gc291cmNlOworCX0KK3B1YmxpYyBJQmluYXJ5VHlwZSBnZXRCaW5hcnlJbmZvKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSBjbGFzc0ZpbGUsIElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChCaW5hcnlUeXBlKWNsYXNzRmlsZS5nZXRUeXBlKCk7CisJaWYgKGNsYXNzRmlsZS5pc09wZW4oKSkgeworCQkvLyByZXVzZSB0aGUgaW5mbyBmcm9tIHRoZSBqYXZhIG1vZGVsIGNhY2hlCisJCXJldHVybiAoSUJpbmFyeVR5cGUpYmluYXJ5VHlwZS5nZXRSYXdJbmZvKCk7CisJfSBlbHNlIHsKKwkJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IGluZm8KKwkJSUJpbmFyeVR5cGUgaW5mbzsKKwkJdHJ5IHsKKwkJCUlKYXZhRWxlbWVudCBwa2cgPSBjbGFzc0ZpbGUuZ2V0UGFyZW50KCk7CisJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwa2cuZ2V0UGFyZW50KCk7CisJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBqYXIKKwkJCQlTdHJpbmcgcGtnUGF0aCA9IHBrZy5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworCQkJCVN0cmluZyBjbGFzc0ZpbGVQYXRoID0gCisJCQkJCShwa2dQYXRoLmxlbmd0aCgpID4gMCkgPworCQkJCQkJcGtnUGF0aCArICIvIiArIGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpIDogLy8kTk9OLU5MUy0xJAorCQkJCQkJY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCk7CisJCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQl6aXBGaWxlID0gKChKYXJQYWNrYWdlRnJhZ21lbnRSb290KXJvb3QpLmdldEphcigpOworCQkJCQlpbmZvID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlci5yZWFkKAorCQkJCQkJemlwRmlsZSwKKwkJCQkJCWNsYXNzRmlsZVBhdGgpOworCQkJCX0gZmluYWxseSB7CisJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBkaXJlY3RvcnkKKwkJCQlTdHJpbmcgb3NQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7CisJCQkJaW5mbyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXIucmVhZChvc1BhdGgpOworCQkJfQorCQkJcmV0dXJuIGluZm87CisJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJfQorCX0KK30KKwlwcm90ZWN0ZWQgT3BlbmFibGUgZ2V0Q3VycmVudE9wZW5hYmxlKCkgeworCQlyZXR1cm4gdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZS5vcGVuYWJsZTsKKwl9CisKKwkvKioKKwkgKiBMb2NhdGUgdGhlIG1hdGNoZXMgYW1vbmdzdCB0aGUgbWF0Y2hpbmcgb3BlbmFibGVzLgorCSAqLworCXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzKEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCU1hdGNoaW5nT3BlbmFibGVbXSBvcGVuYWJsZXMgPSB0aGlzLm1hdGNoaW5nT3BlbmFibGVzLmdldE1hdGNoaW5nT3BlbmFibGVzKGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOworCQorCQlib29sZWFuIGNvbXBpbGF0aW9uQWJvcnRlZCA9IGZhbHNlOworCisJCWlmICh0aGlzLnBhdHRlcm4ubmVlZHNSZXNvbHZlKSB7CisJCQkvLyBiaW5kaW5nIGNyZWF0aW9uCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3BlbmFibGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7IAorCQkJCW9wZW5hYmxlc1tpXS5idWlsZFR5cGVCaW5kaW5ncygpOworCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQorCQkJLy8gYmluZGluZyByZXNvbHV0aW9uCisJCQl0cnkgeworCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCS8vIHByb2JsZW0gd2l0aCBjbGFzcyBwYXRoOiBpdCBjb3VsZCBub3QgZmluZCBiYXNlIGNsYXNzZXMKKwkJCQkvLyBjb250aW51ZSByZXBvcnRpbmcgaW5uYWN1cmF0ZSBtYXRjaGVzIChzaW5jZSBiaW5kaW5ncyB3aWxsIGJlIG51bGwpCisJCQkJY29tcGlsYXRpb25BYm9ydGVkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCS8vIG1hdGNoaW5nIG9wZW5hYmxlIHJlc29sdXRpb24KKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9wZW5hYmxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeyAKKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQl9CisJCQkgCisJCQl0cnkgeworCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUgPSBvcGVuYWJsZXNbaV07CisJCQkJCisJCQkJaWYgKCF0aGlzLmN1cnJlbnRNYXRjaGluZ09wZW5hYmxlLmhhc0FscmVhZHlEZWZpbmVkVHlwZSgpKSB7CisJCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUuc2hvdWxkUmVzb2x2ZSA9ICFjb21waWxhdGlvbkFib3J0ZWQ7CisJCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUubG9jYXRlTWF0Y2hlcygpOworCQkJCX0gLy8gZWxzZSBza2lwIHR5cGUgaGFzIGl0IGlzIGhpZGRlbiBzbyBub3QgdmlzaWJsZQorCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGg6IGl0IGNvdWxkIG5vdCBmaW5kIGJhc2UgY2xhc3NlcworCQkJCS8vIGNvbnRpbnVlIGFuZCB0cnkgbmV4dCBtYXRjaGluZyBvcGVuYWJsZSByZXBvcnRpbmcgaW5uYWN1cmF0ZSBtYXRjaGVzIChzaW5jZSBiaW5kaW5ncyB3aWxsIGJlIG51bGwpCisJCQkJY29tcGlsYXRpb25BYm9ydGVkID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CisJCQkJCS8vIHByb2JsZW0gd2l0aCBjbGFzcyBwYXRoOiBpdCBjb3VsZCBub3QgZmluZCBiYXNlIGNsYXNzZXMKKwkJCQkJLy8gY29udGludWUgYW5kIHRyeSBuZXh0IG1hdGNoaW5nIG9wZW5hYmxlIHJlcG9ydGluZyBpbm5hY3VyYXRlIG1hdGNoZXMgKHNpbmNlIGJpbmRpbmdzIHdpbGwgYmUgbnVsbCkKKwkJCQkJY29tcGlsYXRpb25BYm9ydGVkID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBjb3JlIGV4Y2VwdGlvbiB0aHJvd24gYnkgY2xpZW50J3MgY29kZTogbGV0IGl0IHRocm91Z2gKKwkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUucmVzZXQoKTsKKwkJCX0KKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMyk7CisJCQl9CisJCX0KKwkJdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZSA9IG51bGw7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvclBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWRhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvclBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVtYmVyVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7CisKKy8qKgorICogQSBwYXJzZXIgdGhhdCBsb2NhdGVzIGFzdCBub2RlcyB0aGF0IG1hdGNoIGEgZ2l2ZW4gc2VhcmNoIHBhdHRlcm4uCisgKi8KK3B1YmxpYyBjbGFzcyBNYXRjaExvY2F0b3JQYXJzZXIgZXh0ZW5kcyBQYXJzZXIgeworCisJcHVibGljIE1hdGNoU2V0IG1hdGNoU2V0OworCXByaXZhdGUgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IoKTsKKwkKKy8qKgorICogQW4gYXN0IHZpc2l0b3IgdGhhdCB2aXNpdHMgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBleHRlbmRzIEFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyIHsKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGVEZWNsYXJhdGlvbiwKKwkJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJaWYgKChtYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7CisJCQltYXRjaFNldC5jaGVja01hdGNoaW5nKGFub255bW91c1R5cGVEZWNsYXJhdGlvbik7CisJCX0KKwkJcmV0dXJuIHRydWU7IAorCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwKKwkJCUNsYXNzU2NvcGUgc2NvcGUpIHsKKwkJaWYgKChtYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCW1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcoY29uc3RydWN0b3JEZWNsYXJhdGlvbik7CisJCX0KKwkJcmV0dXJuIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmJpdHMgJiBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0spICE9IDA7IC8vIGNvbnRpbnVlIG9ubHkgaWYgaXQgaGFzIGxvY2FsIHR5cGUKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBNZXRob2RTY29wZSBzY29wZSkgeworCQlpZiAoKG1hdGNoU2V0Lm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgeworCQkJbWF0Y2hTZXQuY2hlY2tNYXRjaGluZyhmaWVsZERlY2xhcmF0aW9uKTsKKwkJfQorCQlyZXR1cm4gKGZpZWxkRGVjbGFyYXRpb24uYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgIT0gMDsgLy8gY29udGludWUgb25seSBpZiBpdCBoYXMgbG9jYWwgdHlwZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJCWlmICgobWF0Y2hTZXQubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQltYXRjaFNldC5jaGVja01hdGNoaW5nKGluaXRpYWxpemVyKTsKKwkJfQorCQlyZXR1cm4gKGluaXRpYWxpemVyLmJpdHMgJiBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0spICE9IDA7IC8vIGNvbnRpbnVlIG9ubHkgaWYgaXQgaGFzIGxvY2FsIHR5cGUKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCQlMb2NhbFR5cGVEZWNsYXJhdGlvbiBsb2NhbFR5cGVEZWNsYXJhdGlvbiwKKwkJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJaWYgKChtYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7CisJCQltYXRjaFNldC5jaGVja01hdGNoaW5nKGxvY2FsVHlwZURlY2xhcmF0aW9uKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCQlNZW1iZXJUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLAorCQkJQ2xhc3NTY29wZSBzY29wZSkgeworCQlpZiAoKG1hdGNoU2V0Lm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgeworCQkJbWF0Y2hTZXQuY2hlY2tNYXRjaGluZyhtZW1iZXJUeXBlRGVjbGFyYXRpb24pOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlpZiAoKG1hdGNoU2V0Lm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgeworCQkJbWF0Y2hTZXQuY2hlY2tNYXRjaGluZyhtZXRob2REZWNsYXJhdGlvbik7CisJCX0KKwkJcmV0dXJuIChtZXRob2REZWNsYXJhdGlvbi5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwOyAvLyBjb250aW51ZSBvbmx5IGlmIGl0IGhhcyBsb2NhbCB0eXBlCisJfQorCQorfQorCitwdWJsaWMgTWF0Y2hMb2NhdG9yUGFyc2VyKFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIsIGJvb2xlYW4gYXNzZXJ0TW9kZSkgeworCXN1cGVyKHByb2JsZW1SZXBvcnRlciwgdHJ1ZSwgYXNzZXJ0TW9kZSk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjbGFzc0luc3RhbmNlQ3JlYXRpb24oYm9vbGVhbiBhbHdheXNRdWFsaWZpZWQpIHsKKwlzdXBlci5jbGFzc0luc3RhbmNlQ3JlYXRpb24oYWx3YXlzUXVhbGlmaWVkKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXNzaWdubWVudCgpIHsKKwlzdXBlci5jb25zdW1lQXNzaWdubWVudCgpOworCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOworCX0KK30KKwkKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpbnQgZmxhZywgaW50IHJlY0ZsYWcpIHsKKwlzdXBlci5jb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oZmxhZywgcmVjRmxhZyk7CisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgeworCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5hc3RTdGFja1t0aGlzLmFzdFB0cl0pOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGaWVsZEFjY2Vzcyhib29sZWFuIGlzU3VwZXJBY2Nlc3MpIHsKKwlzdXBlci5jb25zdW1lRmllbGRBY2Nlc3MoaXNTdXBlckFjY2Vzcyk7CisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgeworCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgeworCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOworCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpIHsKKwlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCkgeworCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpIHsKKwlzdXBlci5jb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSgpOworCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuYXN0U3RhY2tbdGhpcy5hc3RQdHJdKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCkgeworCXN1cGVyLmNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUoKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0aGlzLmFzdFN0YWNrW3RoaXMuYXN0UHRyXSk7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihpbnQgb3AsIGJvb2xlYW4gcG9zdCkgeworCXN1cGVyLmNvbnN1bWVVbmFyeUV4cHJlc3Npb24ob3AsIHBvc3QpOworCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl0pOworCX0KK30KK3Byb3RlY3RlZCBUeXBlUmVmZXJlbmNlIGNvcHlEaW1zKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgaW50IGRpbSkgeworCVR5cGVSZWZlcmVuY2UgcmVzdWx0ID0gc3VwZXIuY29weURpbXModHlwZVJlZiwgZGltKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCSBpZiAodGhpcy5tYXRjaFNldC5yZW1vdmVQb3NzaWJsZU1hdGNoKHR5cGVSZWYpICE9IG51bGwpIHsKKwkJCXRoaXMubWF0Y2hTZXQuYWRkUG9zc2libGVNYXRjaChyZXN1bHQpOworCQkgfSBlbHNlIGlmICh0aGlzLm1hdGNoU2V0LnJlbW92ZVRydXN0ZWRNYXRjaCh0eXBlUmVmKSAhPSBudWxsKSB7CisJCQl0aGlzLm1hdGNoU2V0LmFkZFRydXN0ZWRNYXRjaChyZXN1bHQpOworCQkgfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGRpZXRQYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIE1hdGNoTG9jYXRvciBsb2NhdG9yLCBJRmlsZSBmaWxlLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisJTWF0Y2hTZXQgb3JpZ2luYWxNYXRjaFNldCA9IHRoaXMubWF0Y2hTZXQ7CisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IG51bGw7CisJdHJ5IHsKKwkJdGhpcy5tYXRjaFNldCA9IG5ldyBNYXRjaFNldChsb2NhdG9yKTsKKwkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CisJCXVuaXQgPSB0aGlzLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7CisJfSBmaW5hbGx5IHsKKwkJaWYgKG9yaWdpbmFsTWF0Y2hTZXQgPT0gbnVsbCkgeworCQkJaWYgKCF0aGlzLm1hdGNoU2V0LmlzRW1wdHkoKSAKKwkJCQkJJiYgdW5pdCAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkgeworCQkJCS8vIHBvdGVudGlhbCBtYXRjaGVzIHdlcmUgZm91bmQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBzZWFyY2ggcGF0dGVybgorCQkJCS8vIGZyb20gdGhlIGxvb2t1cCBlbnZpcm9ubWVudDogYWRkIHRoZSBjb3JyZXNwb25kaW5nIG9wZW5hYmxlIGluIHRoZSBsaXN0CisJCQkJTWF0Y2hpbmdPcGVuYWJsZSBtYXRjaGluZ09wZW5hYmxlID0gCisJCQkJCW5ldyBNYXRjaGluZ09wZW5hYmxlKAorCQkJCQkJbG9jYXRvciwKKwkJCQkJCWZpbGUsIAorCQkJCQkJY29tcGlsYXRpb25Vbml0LCAKKwkJCQkJCXVuaXQsCisJCQkJCQl0aGlzLm1hdGNoU2V0KTsKKwkJCQlsb2NhdG9yLm1hdGNoaW5nT3BlbmFibGVzLmFkZChtYXRjaGluZ09wZW5hYmxlKTsKKwkJCX0KKwkJCXRoaXMubWF0Y2hTZXQgPSBudWxsOworCQl9IGVsc2UgeworCQkJdGhpcy5tYXRjaFNldCA9IG9yaWdpbmFsTWF0Y2hTZXQ7CisJCX0KKwl9CisJcmV0dXJuIHVuaXQ7Cit9Citwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZSBnZXRUeXBlUmVmZXJlbmNlKGludCBkaW0pIHsKKwlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSBzdXBlci5nZXRUeXBlUmVmZXJlbmNlKGRpbSk7CisJaWYgKHRoaXMubWF0Y2hTZXQgIT0gbnVsbCkgeyAKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKHR5cGVSZWYpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHR5cGUgcmVmZXJlbmNlIGNhbiBoYXBwZW4gYW55d2hlcmUKKwl9CisJcmV0dXJuIHR5cGVSZWY7Cit9Citwcm90ZWN0ZWQgTmFtZVJlZmVyZW5jZSBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpIHsKKwlOYW1lUmVmZXJlbmNlIG5hbWVSZWYgPSBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZSgpOworCWlmICh0aGlzLm1hdGNoU2V0ICE9IG51bGwpIHsKKwkJdGhpcy5tYXRjaFNldC5jaGVja01hdGNoaW5nKG5hbWVSZWYpOyAvLyBOQjogRG9uJ3QgY2hlY2sgY29udGFpbmVyIHNpbmNlIHVuc3BlY2lmaWVkIHJlZmVyZW5jZSBjYW4gaGFwcGVuIGFueXdoZXJlCisJfQorCXJldHVybiBuYW1lUmVmOworfQorcHJvdGVjdGVkIE5hbWVSZWZlcmVuY2UgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKSB7CisJTmFtZVJlZmVyZW5jZSBuYW1lUmVmID0gc3VwZXIuZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VPcHRpbWl6ZWQoKTsKKwlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CisJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyhuYW1lUmVmKTsgLy8gTkI6IERvbid0IGNoZWNrIGNvbnRhaW5lciBzaW5jZSB1bnNwZWNpZmllZCByZWZlcmVuY2UgY2FuIGhhcHBlbiBhbnl3aGVyZQorCX0KKwlyZXR1cm4gbmFtZVJlZjsKK30KKy8qKgorICogUGFyc2VzIHRoZSBtZXRob2QgYm9kaWVzIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0CisgKi8KK3B1YmxpYyB2b2lkIHBhcnNlQm9kaWVzKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwlUeXBlRGVjbGFyYXRpb25bXSB0eXBlcyA9IHVuaXQudHlwZXM7CisJaWYgKHR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSB0eXBlc1tpXTsKKwkJCWlmICgodGhpcy5tYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ09NUElMQVRJT05fVU5JVCkgIT0gMCAvLyB0eXBlIGRlY2xhcmF0aW9uIGluIGNvbXBpbGF0aW9uIHVuaXQKKwkJCQl8fCAodGhpcy5tYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDAJCQkvLyBvciBpbiBhbm90aGVyIHR5cGUKKwkJCQl8fCAodGhpcy5tYXRjaFNldC5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7CQkvLyBvciBpbiBhIGxvY2FsIGNsYXNzCisJCQkJCQorCQkJCXRoaXMubWF0Y2hTZXQuY2hlY2tNYXRjaGluZyh0eXBlKTsKKwkJCX0KKwkJCXRoaXMucGFyc2VCb2RpZXModHlwZSwgdW5pdCk7CisJCX0KKwl9Cit9CisvKioKKyAqIFBhcnNlcyB0aGUgbWVtYmVyIGJvZGllcyBpbiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworcHJpdmF0ZSB2b2lkIHBhcnNlQm9kaWVzKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0KSB7CisJLy8gZmllbGRzCisJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGUuZmllbGRzOworCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKKwkJCWlmIChmaWVsZCBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7IC8vIGluaXRpYWxpemVyIGJsb2NrCisJCQkJdGhpcy5wYXJzZSgoSW5pdGlhbGl6ZXIpZmllbGQsIHR5cGUsIHVuaXQpOwkJCisJCQl9CisJCQlmaWVsZC50cmF2ZXJzZShsb2NhbERlY2xhcmF0aW9uVmlzaXRvciwgbnVsbCk7CisJCX0KKwl9CisJCisJLy8gbWV0aG9kcworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZS5tZXRob2RzOworCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQlpZiAobWV0aG9kLnNvdXJjZVN0YXJ0ID49IHR5cGUuYm9keVN0YXJ0KSB7IC8vIGlmIG5vdCBzeW50aGV0aWMKKwkJCQlpZiAobWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pbWV0aG9kOworCQkJCQl0aGlzLnBhcnNlKG1ldGhvZERlY2xhcmF0aW9uLCB1bml0KTsKKwkJCQkJbWV0aG9kRGVjbGFyYXRpb24udHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKW51bGwpOworCQkJCX0gZWxzZSBpZiAobWV0aG9kIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgeworCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiltZXRob2Q7CisJCQkJCXRoaXMucGFyc2UoY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgdW5pdCk7CisJCQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24udHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKW51bGwpOworCQkJCX0KKwkJCX0JCisJCX0KKwl9CisKKwkvLyBtZW1iZXIgdHlwZXMKKwlNZW1iZXJUeXBlRGVjbGFyYXRpb25bXSBtZW1iZXJUeXBlcyA9IHR5cGUubWVtYmVyVHlwZXM7CisJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgeworCQkJTWVtYmVyVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGUgPSBtZW1iZXJUeXBlc1tpXTsKKwkJCXRoaXMucGFyc2VCb2RpZXMobWVtYmVyVHlwZSwgdW5pdCk7CisJCQltZW1iZXJUeXBlLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSludWxsKTsKKwkJfQorCX0KK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzk5ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaFNldC5qYXZhCkBAIC0wLDAgKzEsNTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZW1iZXJUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworLyoqCisgKiBBIHNldCBvZiBtYXRjaGVzIGFuZCBwb3RlbnRpYWwgbWF0Y2hlcy4KKyAqLworcHVibGljIGNsYXNzIE1hdGNoU2V0IHsKKwkKKwlwcml2YXRlIE1hdGNoTG9jYXRvciBsb2NhdG9yOworCWludCBtYXRjaENvbnRhaW5lcjsKKwlib29sZWFuIGN1SGFzQmVlblJlc29sdmVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBTZXQgb2YgbWF0Y2hpbmcgYXN0IG5vZGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSByZXNvbHZlZC4KKwkgKi8KKwlwcml2YXRlIE1hcCBtYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoNSk7CisKKwkvKioKKwkgKiBTZXQgb2YgcG90ZW50aWFsIG1hdGNoaW5nIGFzdCBub2Rlcy4gVGhleSBuZWVkIHRvIGJlIHJlc29sdmVkCisJICogdG8gZGV0ZXJtaW5lIGlmIHRoZXkgcmVhbGx5IG1hdGNoIHRoZSBzZWFyY2ggcGF0dGVybi4KKwkgKi8KKwlwcml2YXRlIE1hcCBwb3RlbnRpYWxNYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoNSk7CisJCisvKioKKyAqIEFuIGFzdCB2aXNpdG9yIHRoYXQgdmlzaXRzIGxvY2FsIHR5cGUgZGVjbGFyYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlciB7CisJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CisJcHVibGljIGJvb2xlYW4gdmlzaXQoCisJCQlBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24sCisJCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXRyeSB7CisJCQlyZXBvcnRNYXRjaGluZyhhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24sIGVuY2xvc2luZ0VsZW1lbnQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkQ29yZUV4Y2VwdGlvbihlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgcmVwb3J0TWF0Y2hpbmcoLi4uKQorCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChMb2NhbFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJdHJ5IHsKKwkJCXJlcG9ydE1hdGNoaW5nKHR5cGVEZWNsYXJhdGlvbiwgZW5jbG9zaW5nRWxlbWVudCk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgcmVwb3J0TWF0Y2hpbmcoLi4uKQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkQ29yZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXRyeSB7CisJCQlyZXBvcnRNYXRjaGluZyh0eXBlRGVjbGFyYXRpb24sIGVuY2xvc2luZ0VsZW1lbnQpOworCQkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCB2aXNpdCBtZW1iZXJzIGFzIHRoaXMgd2FzIGRvbmUgZHVyaW5nIHJlcG9ydE1hdGNoaW5nKC4uLikKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgV3JhcHBlZENvcmVFeGNlcHRpb24oZSk7CisJCX0KKwl9CisJCit9CQorCitwdWJsaWMgY2xhc3MgV3JhcHBlZENvcmVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwlwdWJsaWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uOworCXB1YmxpYyBXcmFwcGVkQ29yZUV4Y2VwdGlvbihDb3JlRXhjZXB0aW9uIGNvcmVFeGNlcHRpb24pIHsKKwkJdGhpcy5jb3JlRXhjZXB0aW9uID0gY29yZUV4Y2VwdGlvbjsKKwl9Cit9CisKK3B1YmxpYyBNYXRjaFNldChNYXRjaExvY2F0b3IgbG9jYXRvcikgeworCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisJdGhpcy5tYXRjaENvbnRhaW5lciA9IGxvY2F0b3IucGF0dGVybi5tYXRjaENvbnRhaW5lcigpOworfQorcHVibGljIHZvaWQgYWRkUG9zc2libGVNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uUE9TU0lCTEVfTUFUQ0gpKTsKK30KK3B1YmxpYyB2b2lkIGFkZFRydXN0ZWRNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwl0aGlzLm1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0gpKTsKK30KK3B1YmxpYyB2b2lkIGNoZWNrTWF0Y2hpbmcoQXN0Tm9kZSBub2RlKSB7CisJdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hDaGVjayhub2RlLCB0aGlzKTsKK30KK3B1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisJcmV0dXJuIAorCQl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMuc2l6ZSgpID09IDAgCisJCSYmIHRoaXMubWF0Y2hpbmdOb2Rlcy5zaXplKCkgPT0gMDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHJhbmdlLgorICovCitwcml2YXRlIEFzdE5vZGVbXSBtYXRjaGluZ05vZGVzKGludCBzdGFydCwgaW50IGVuZCkgeworCXJldHVybiB0aGlzLm5vZGVzSW5SYW5nZShzdGFydCwgZW5kLCB0aGlzLm1hdGNoaW5nTm9kZXMpOworfQorcHVibGljIGJvb2xlYW4gbmVlZHNSZXNvbHZlKCkgeworCXJldHVybiB0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMuc2l6ZSgpID4gMDsKK30KKy8qKgorICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHJhbmdlIGluIHRoZSBzb3VyY2Ugb3JkZXIuCisgKi8KK3ByaXZhdGUgQXN0Tm9kZVtdIG5vZGVzSW5SYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIE1hcCBzZXQpIHsKKwkvLyBjb2xsZWN0IG5vZGVzIGluIHRoZSBnaXZlbiByYW5nZQorCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlmb3IgKEl0ZXJhdG9yIGtleXMgPSBzZXQua2V5U2V0KCkuaXRlcmF0b3IoKTsga2V5cy5oYXNOZXh0KCk7KSB7CisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKWtleXMubmV4dCgpOworCQlpZiAoc3RhcnQgPD0gbm9kZS5zb3VyY2VTdGFydCAmJiBub2RlLnNvdXJjZUVuZCA8PSBlbmQpIHsKKwkJCW5vZGVzLmFkZChub2RlKTsKKwkJfQorCX0KKwlBc3ROb2RlW10gcmVzdWx0ID0gbmV3IEFzdE5vZGVbbm9kZXMuc2l6ZSgpXTsKKwlub2Rlcy50b0FycmF5KHJlc3VsdCk7CisKKwkvLyBzb3J0IG5vZGVzIGJ5IHNvdXJjZSBzdGFydHMKKwlVdGlsLkNvbXBhcmVyIGNvbXBhcmVyID0gbmV3IFV0aWwuQ29tcGFyZXIoKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworCQkJQXN0Tm9kZSBub2RlMSA9IChBc3ROb2RlKSBvMTsKKwkJCUFzdE5vZGUgbm9kZTIgPSAoQXN0Tm9kZSkgbzI7CisJCQlyZXR1cm4gbm9kZTEuc291cmNlU3RhcnQgLSBub2RlMi5zb3VyY2VTdGFydDsKKwkJfQorCX07CisJVXRpbC5zb3J0KHJlc3VsdCwgY29tcGFyZXIpOworCQkKKwlyZXR1cm4gcmVzdWx0OworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBwb3RlbnRpYWwgbWF0Y2hpbmcgbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHJhbmdlLgorICovCitwcml2YXRlIEFzdE5vZGVbXSBwb3RlbnRpYWxNYXRjaGluZ05vZGVzKGludCBzdGFydCwgaW50IGVuZCkgeworCXJldHVybiB0aGlzLm5vZGVzSW5SYW5nZShzdGFydCwgZW5kLCB0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMpOworfQorcHVibGljIEludGVnZXIgcmVtb3ZlUG9zc2libGVNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwlyZXR1cm4gKEludGVnZXIpdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsKK30KK3B1YmxpYyBJbnRlZ2VyIHJlbW92ZVRydXN0ZWRNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwlyZXR1cm4gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsKK30KKy8qKgorICogVmlzaXQgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCisgKiBzZWFyY2ggcGF0dGVybiAoaWUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCisgKiBOb3RlIHRoYXQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuCisgKi8KK3ByaXZhdGUgdm9pZCByZXBvcnRNYXRjaGluZyhBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIHJlZmVyZW5jZXMgaW4gdGhpcyBtZXRob2QKKwlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKKwkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7CisJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7CisJCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKAorCQkJCW5vZGUsIAorCQkJCW1ldGhvZCwgCisJCQkJcGFyZW50LCAKKwkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQl0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG5vZGUpOworCQl9CisJfQorCWlmICgobWV0aG9kLmJpdHMgJiBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0spICE9IDApIHsKKwkJTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBuZXcgTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IoKTsKKwkJbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IuZW5jbG9zaW5nRWxlbWVudCA9IAorCQkJKHBhcmVudCBpbnN0YW5jZW9mIElUeXBlKSA/CisJCQkJdGhpcy5sb2NhdG9yLmNyZWF0ZU1ldGhvZEhhbmRsZShtZXRob2QsIChJVHlwZSlwYXJlbnQpIDoKKwkJCQlwYXJlbnQ7CisJCXRyeSB7CisJCQltZXRob2QudHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChDbGFzc1Njb3BlKW51bGwpOworCQl9IGNhdGNoIChXcmFwcGVkQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBlLmNvcmVFeGNlcHRpb247CisJCX0KKwl9CisJaWYgKHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2RlcyhtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kKS5sZW5ndGggPT0gMCkgeworCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgdGhlIHN0YXRlbWVudHMgaW4gdGhlIG1ldGhvZAorCQltZXRob2Quc3RhdGVtZW50cyA9IG51bGw7CisJfQorfQorLyoqCisgKiBWaXNpdCB0aGUgZ2l2ZW4gcGFyc2UgdHJlZSBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCisgKiBzZWFyY2ggcGF0dGVybi4KKyAqLworcHVibGljIHZvaWQgcmVwb3J0TWF0Y2hpbmcoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmICh0aGlzLmN1SGFzQmVlblJlc29sdmVkKSB7CisJCS8vIG1vdmUgdGhlIHBvdGVudGlhbCBtYXRjaGluZyBub2RlcyB0aGF0IGV4YWN0bHkgbWF0Y2ggdGhlIHNlYXJjaCBwYXR0ZXJuIHRvIHRoZSBtYXRjaGluZyBub2RlcyBzZXQKKwkJZm9yIChJdGVyYXRvciBwb3RlbnRpYWxNYXRjaGVzID0gdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IHBvdGVudGlhbE1hdGNoZXMuaGFzTmV4dCgpOykgeworCQkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHBvdGVudGlhbE1hdGNoZXMubmV4dCgpOworCQkJaW50IGxldmVsOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsKKwkJCQkvLyBzcGVjaWFsIGNhc2UgZm9yIGltcG9ydCByZWZzOiB0aGV5IGRvbid0IGtub3cgdGhlaXIgYmluZGluZworCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYgPSAoSW1wb3J0UmVmZXJlbmNlKW5vZGU7CisJCQkJQmluZGluZyBiaW5kaW5nOworCQkJCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsKKwkJCQkJYmluZGluZyA9IHVuaXQuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGltcG9ydFJlZi50b2tlbnMsIDAsIGltcG9ydFJlZi50b2tlbnMubGVuZ3RoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmluZGluZyA9IHVuaXQuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShpbXBvcnRSZWYudG9rZW5zKTsKKwkJCQl9CisJCQkJbGV2ZWwgPSB0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaExldmVsKGJpbmRpbmcpOworCisJCQkJaWYgKGxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggfHwgbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIKSB7CisJCQkJCS8vIGNyZWF0ZSBkZWZpbmluZyBpbXBvcnQgaGFuZGxlCisJCQkJCUlKYXZhRWxlbWVudCBpbXBvcnRIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSW1wb3J0SGFuZGxlKGltcG9ydFJlZik7CisJCQkJCXRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoUmVwb3J0SW1wb3J0UmVmKAorCQkJCQkJaW1wb3J0UmVmLCAKKwkJCQkJCWJpbmRpbmcsIAorCQkJCQkJaW1wb3J0SGFuZGxlLCAKKwkJCQkJCWxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCwKKwkJCQkJCXRoaXMubG9jYXRvcik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsZXZlbCA9IHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgdHJ1ZSk7CisJCQkJaWYgKGxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggfHwgbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIKSB7CisJCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbmV3IEludGVnZXIobGV2ZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoKTsKKwl9CisJCisJLy8gcGFja2FnZSBkZWNsYXJhdGlvbgorCUltcG9ydFJlZmVyZW5jZSBwa2cgPSB1bml0LmN1cnJlbnRQYWNrYWdlOworCUludGVnZXIgbGV2ZWw7CisJaWYgKHBrZyAhPSBudWxsICYmIChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUocGtnKSkgIT0gbnVsbCkgeworCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNPTVBJTEFUSU9OX1VOSVQpICE9IDApIHsKKwkJCXRoaXMubG9jYXRvci5yZXBvcnRQYWNrYWdlRGVjbGFyYXRpb24ocGtnKTsKKwkJfQorCX0KKworCS8vIGltcG9ydCBkZWNsYXJhdGlvbnMKKwlpZiAoIXRoaXMuY3VIYXNCZWVuUmVzb2x2ZWQpIHsKKwkJSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0cyA9IHVuaXQuaW1wb3J0czsKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiA9IGltcG9ydHNbaV07CisJCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoaW1wb3J0UmVmKSkgIT0gbnVsbCkgeworCQkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNPTVBJTEFUSU9OX1VOSVQpICE9IDApIHsKKwkJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRJbXBvcnQoCisJCQkJCQkJaW1wb3J0UmVmLCAKKwkJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IC8vIGVsc2UgaW1wb3J0IGRlY2xhcmF0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYWJvdmUKKworCS8vIHR5cGVzCisJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOworCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gdHlwZXNbaV07CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZSh0eXBlKSkgIT0gbnVsbCkgeworCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ09NUElMQVRJT05fVU5JVCkgIT0gMCkgeworCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0VHlwZURlY2xhcmF0aW9uKAorCQkJCQkJdHlwZSwgCisJCQkJCQludWxsLCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXBvcnRNYXRjaGluZyh0eXBlLCBudWxsKTsKKwkJfQorCX0KK30KKy8qKgorICogVmlzaXQgdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCByZXBvcnQgdGhlIG5vZGVzIHRoYXQgbWF0Y2ggZXhhY3RseSB0aGUKKyAqIHNlYXJjaCBwYXR0ZXJuIChpZS4gdGhlIG9uZXMgaW4gdGhlIG1hdGNoaW5nIG5vZGVzIHNldCkKKyAqIE5vdGUgdGhhdCB0aGUgZmllbGQgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLgorICovCitwcml2YXRlIHZvaWQgcmVwb3J0TWF0Y2hpbmcoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgSUphdmFFbGVtZW50IHBhcmVudCwgVHlwZURlY2xhcmF0aW9uIHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJQXN0Tm9kZSBub2RlID0gbm9kZXNbaV07CisJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KG5vZGUpOworCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkZJRUxEKSAhPSAwKSB7CisJCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKAorCQkJCW5vZGUsIAorCQkJCXR5cGUsIAorCQkJCWZpZWxkLCAKKwkJCQlwYXJlbnQsIAorCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKKwkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7CisJCX0KKwl9CisJaWYgKChmaWVsZC5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwKSB7CisJCUxvY2FsRGVjbGFyYXRpb25WaXNpdG9yIGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yID0gbmV3IExvY2FsRGVjbGFyYXRpb25WaXNpdG9yKCk7CisJCWxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLmVuY2xvc2luZ0VsZW1lbnQgPSAKKwkJCShwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgPworCQkJCShmaWVsZC5pc0ZpZWxkKCkgPworCQkJCQkoSUphdmFFbGVtZW50KXRoaXMubG9jYXRvci5jcmVhdGVGaWVsZEhhbmRsZShmaWVsZCwgKElUeXBlKXBhcmVudCkgOgorCQkJCQkoSUphdmFFbGVtZW50KXRoaXMubG9jYXRvci5jcmVhdGVJbml0aWFsaXplckhhbmRsZSh0eXBlLCBmaWVsZCwgKElUeXBlKXBhcmVudCkpIDoKKwkJCQlwYXJlbnQ7CisJCXRyeSB7CisJCQlmaWVsZC50cmF2ZXJzZShsb2NhbERlY2xhcmF0aW9uVmlzaXRvciwgKEJsb2NrU2NvcGUpbnVsbCk7CisJCX0gY2F0Y2ggKFdyYXBwZWRDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGUuY29yZUV4Y2VwdGlvbjsKKwkJfQorCX0KK30KKy8qKgorICogVmlzaXQgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24gYW5kIHJlcG9ydCB0aGUgbm9kZXMgdGhhdCBtYXRjaCBleGFjdGx5IHRoZQorICogc2VhcmNoIHBhdHRlcm4gKGllLiB0aGUgb25lcyBpbiB0aGUgbWF0Y2hpbmcgbm9kZXMgc2V0KQorICogTm90ZSB0aGF0IHRoZSB0eXBlIGRlY2xhcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4KKyAqLworcHVibGljIHZvaWQgcmVwb3J0TWF0Y2hpbmcoVHlwZURlY2xhcmF0aW9uIHR5cGUsIElKYXZhRWxlbWVudCBwYXJlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudDsKKwlpZiAocGFyZW50ID09IG51bGwpIHsKKwkJZW5jbG9zaW5nRWxlbWVudCA9IHRoaXMubG9jYXRvci5jcmVhdGVUeXBlSGFuZGxlKHR5cGUubmFtZSk7CisJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQllbmNsb3NpbmdFbGVtZW50ID0gdGhpcy5sb2NhdG9yLmNyZWF0ZVR5cGVIYW5kbGUoKElUeXBlKXBhcmVudCwgdHlwZS5uYW1lKTsKKwkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOworCX0gZWxzZSB7CisJCWVuY2xvc2luZ0VsZW1lbnQgPSBwYXJlbnQ7CisJfQorCUludGVnZXIgbGV2ZWw7CisJCisJLy8gZmllbGRzCisJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkcyA9IHR5cGUuZmllbGRzOworCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IGZpZWxkc1tpXTsKKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKGZpZWxkKSkgIT0gbnVsbCkgeworCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEZpZWxkRGVjbGFyYXRpb24oCisJCQkJCQlmaWVsZCwgCisJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXBvcnRNYXRjaGluZyhmaWVsZCwgZW5jbG9zaW5nRWxlbWVudCwgdHlwZSk7CisJCX0KKwl9CisKKwkvLyBtZXRob2RzCisJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlLm1ldGhvZHM7CisJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG1ldGhvZCkpICE9IG51bGwpIHsKKwkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRNZXRob2REZWNsYXJhdGlvbigKKwkJCQkJCW1ldGhvZCwgCisJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXBvcnRNYXRjaGluZyhtZXRob2QsIGVuY2xvc2luZ0VsZW1lbnQpOworCQl9CisJfQorCisJLy8gbWVtYmVyIHR5cGVzCisJTWVtYmVyVHlwZURlY2xhcmF0aW9uW10gbWVtYmVyVHlwZXMgPSB0eXBlLm1lbWJlclR5cGVzOworCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCU1lbWJlclR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbaV07CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZW1iZXJUeXBlKSkgIT0gbnVsbCkgeworCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFR5cGVEZWNsYXJhdGlvbigKKwkJCQkJCW1lbWJlclR5cGUsIAorCQkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCisJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKKwkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJCX0KKwkJCX0KKwkJCXRoaXMucmVwb3J0TWF0Y2hpbmcobWVtYmVyVHlwZSwgZW5jbG9zaW5nRWxlbWVudCk7CisJCX0KKwl9CisKKwkvLyBzdXBlciB0eXBlcworCWlmICh0eXBlIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIHsKKwkJVHlwZVJlZmVyZW5jZSBzdXBlclR5cGUgPSAoKEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKXR5cGUpLmFsbG9jYXRpb24udHlwZTsKKwkJaWYgKHN1cGVyVHlwZSAhPSBudWxsICYmIChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoc3VwZXJUeXBlKSkgIT0gbnVsbCkgeworCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgeworCQkJCXRoaXMubG9jYXRvci5yZXBvcnRTdXBlclR5cGVSZWZlcmVuY2UoCisJCQkJCXN1cGVyVHlwZSwgCisJCQkJCWVuY2xvc2luZ0VsZW1lbnQsIAorCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCVR5cGVSZWZlcmVuY2Ugc3VwZXJDbGFzcyA9IHR5cGUuc3VwZXJjbGFzczsKKwkJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiAobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKHN1cGVyQ2xhc3MpKSAhPSBudWxsKSB7CisJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFN1cGVyVHlwZVJlZmVyZW5jZSgKKwkJCQkJc3VwZXJDbGFzcywgCisJCQkJCWVuY2xvc2luZ0VsZW1lbnQsIAorCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCX0KKwkJfQorCQlUeXBlUmVmZXJlbmNlW10gc3VwZXJJbnRlcmZhY2VzID0gdHlwZS5zdXBlckludGVyZmFjZXM7CisJCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlUeXBlUmVmZXJlbmNlIHN1cGVySW50ZXJmYWNlID0gc3VwZXJJbnRlcmZhY2VzW2ldOworCQkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KHN1cGVySW50ZXJmYWNlKSkgIT0gbnVsbCkgeworCQkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKAorCQkJCQkJCXN1cGVySW50ZXJmYWNlLCAKKwkJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKKwkJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJcmVzdWx0LmFwcGVuZCgiRXhhY3QgbWF0Y2hlczoiKTsgLy8kTk9OLU5MUy0xJAorCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubWF0Y2hpbmdOb2Rlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJcmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSlpdGVyLm5leHQoKTsKKwkJT2JqZWN0IHZhbHVlID0gdGhpcy5tYXRjaGluZ05vZGVzLmdldChub2RlKTsKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJcmVzdWx0LmFwcGVuZCgnXHQnKTsKKwkJCWludCBhY2N1cmFjeSA9ICgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKTsKKwkJCXN3aXRjaCAoYWNjdXJhY3kpIHsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU1QT1NTSUJMRV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiSU1QT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlBPU1NJQkxFX01BVENIOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJQT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0g6CisJCQkJCXJlc3VsdC5hcHBlbmQoIklOQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJfQorCQl9IAorCQlyZXN1bHQuYXBwZW5kKG5vZGUudG9TdHJpbmcoMCkpOworCX0KKwlyZXN1bHQuYXBwZW5kKCJcblBvdGVudGlhbCBtYXRjaGVzOiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKWl0ZXIubmV4dCgpOworCQlPYmplY3QgdmFsdWUgPSB0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMuZ2V0KG5vZGUpOworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQlyZXN1bHQuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCisJCQlpbnQgYWNjdXJhY3kgPSAoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCk7CisJCQlzd2l0Y2ggKGFjY3VyYWN5KSB7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklNUE9TU0lCTEVfTUFUQ0g6CisJCQkJCXJlc3VsdC5hcHBlbmQoIklNUE9TU0lCTEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5QT1NTSUJMRV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiUE9TU0lCTEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJJTkFDQ1VSQVRFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0g6CisJCQkJCXJlc3VsdC5hcHBlbmQoIkFDQ1VSQVRFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXN1bHQuYXBwZW5kKG5vZGUudG9TdHJpbmcoMCkpOworCX0KKwlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nT3BlbmFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hpbmdPcGVuYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTQ1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nT3BlbmFibGUuamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmFyeVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuV29ya2luZ0NvcHk7CisgCitwdWJsaWMgY2xhc3MgTWF0Y2hpbmdPcGVuYWJsZSB7CisJcHJpdmF0ZSBNYXRjaExvY2F0b3IgbG9jYXRvcjsKKwlwdWJsaWMgSVJlc291cmNlIHJlc291cmNlOworCXB1YmxpYyBPcGVuYWJsZSBvcGVuYWJsZTsKKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQ7CisJcHJpdmF0ZSBNYXRjaFNldCBtYXRjaFNldDsKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXNvbHZlID0gdHJ1ZTsKK3B1YmxpYyBNYXRjaGluZ09wZW5hYmxlKE1hdGNoTG9jYXRvciBsb2NhdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UsIE9wZW5hYmxlIG9wZW5hYmxlKSB7CisJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKwl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJdGhpcy5vcGVuYWJsZSA9IG9wZW5hYmxlOworfQorcHVibGljIE1hdGNoaW5nT3BlbmFibGUoCisJCU1hdGNoTG9jYXRvciBsb2NhdG9yLCAKKwkJSVJlc291cmNlIHJlc291cmNlLCAKKwkJT3BlbmFibGUgb3BlbmFibGUsCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQsCisJCU1hdGNoU2V0IG1hdGNoU2V0KSB7CisJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKwl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJdGhpcy5vcGVuYWJsZSA9IG9wZW5hYmxlOworCXRoaXMucGFyc2VkVW5pdCA9IHBhcnNlZFVuaXQ7CisJdGhpcy5tYXRjaFNldCA9IG1hdGNoU2V0OworfQorcHVibGljIHZvaWQgYnVpbGRUeXBlQmluZGluZ3MoKSB7CisJCisJLy8gaWYgYSBwYXJzZWQgdW5pdCBleGl0cywgaXRzIGJpbmRpbmdzIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0CisJaWYgKHRoaXMucGFyc2VkVW5pdCAhPSBudWxsKSByZXR1cm47CisJCisJY2hhcltdIHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKCk7CisJaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm47CisJdGhpcy5idWlsZFR5cGVCaW5kaW5ncyhzb3VyY2UpOworCQkJCisJaWYgKHRoaXMub3BlbmFibGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpIHsKKwkJLy8gdHJ5IHRvIHVzZSB0aGUgbWFpbiB0eXBlJ3MgY2xhc3MgZmlsZSBhcyB0aGUgb3BlbmFibGUKKwkJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB0aGlzLnBhcnNlZFVuaXQudHlwZXM7CisJCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCQlTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IG9wZW5hYmxlLmdldEVsZW1lbnROYW1lKCk7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdHlwZXNbaV07CisJCQkJU3RyaW5nIHNpbXBsZVR5cGVOYW1lID0gbmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSk7CisJCQkJaWYgKGNsYXNzRmlsZU5hbWUuc3RhcnRzV2l0aChzaW1wbGVUeXBlTmFtZSkpIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudCBwYXJlbnQgPSAoSVBhY2thZ2VGcmFnbWVudClvcGVuYWJsZS5nZXRQYXJlbnQoKTsKKwkJCQkJdGhpcy5vcGVuYWJsZSA9IChPcGVuYWJsZSlwYXJlbnQuZ2V0Q2xhc3NGaWxlKHNpbXBsZVR5cGVOYW1lICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gCisJCX0KKwl9Cit9Citwcml2YXRlIHZvaWQgYnVpbGRUeXBlQmluZGluZ3MoZmluYWwgY2hhcltdIHNvdXJjZSkgeworCS8vIGdldCBxdWFsaWZpZWQgbmFtZQorCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gdGhpcy5nZXRRdWFsaWZpZWROYW1lKCk7CisJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkgcmV0dXJuOworCisJLy8gY3JlYXRlIG1hdGNoIHNldAkKKwl0aGlzLm1hdGNoU2V0ID0gbmV3IE1hdGNoU2V0KHRoaXMubG9jYXRvcik7CisJCisJdHJ5IHsKKwkJdGhpcy5sb2NhdG9yLnBhcnNlci5tYXRjaFNldCA9IHRoaXMubWF0Y2hTZXQ7CisKKwkJdGhpcy5wYXJzZWRVbml0ID0gKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKXRoaXMubG9jYXRvci5wYXJzZWRVbml0cy5nZXQocXVhbGlmaWVkTmFtZSk7CisJCWlmICh0aGlzLnBhcnNlZFVuaXQgPT0gbnVsbCkgeworCQkJLy8gZGlldCBwYXJzZQorCQkJdGhpcy5wYXJzZWRVbml0ID0gdGhpcy5sb2NhdG9yLmRpZXRQYXJzZShzb3VyY2UpOworCQkJCisJCQkvLyBpbml0aWFsIHR5cGUgYmluZGluZyBjcmVhdGlvbgorCQkJdGhpcy5sb2NhdG9yLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHRoaXMucGFyc2VkVW5pdCk7CisJCX0gZWxzZSB7CisJCQkvLyBmcmVlIG1lbW9yeQorCQkJdGhpcy5sb2NhdG9yLnBhcnNlZFVuaXRzLnB1dChxdWFsaWZpZWROYW1lLCBudWxsKTsKKwkJfQorCX0gZmluYWxseSB7CisJCXRoaXMubG9jYXRvci5wYXJzZXIubWF0Y2hTZXQgPSBudWxsOworCX0KK30KK3ByaXZhdGUgY2hhcltdIGdldFF1YWxpZmllZE5hbWUoKSB7CisJaWYgKHRoaXMub3BlbmFibGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKKwkJLy8gZ2V0IGZpbGUgbmFtZQorCQlTdHJpbmcgZmlsZU5hbWUgPSB0aGlzLnJlc291cmNlLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKKwkJLy8gZ2V0IG1haW4gdHlwZSBuYW1lCisJCWNoYXJbXSBtYWluVHlwZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCktNSkudG9DaGFyQXJyYXkoKTsgCisJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpdGhpcy5vcGVuYWJsZTsKKwkJcmV0dXJuIGN1LmdldFR5cGUobmV3IFN0cmluZyhtYWluVHlwZU5hbWUpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOworCX0gZWxzZSB7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXRoaXMub3BlbmFibGU7CisJCXRyeSB7CisJCQlyZXR1cm4gY2xhc3NGaWxlLmdldFR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUKKwkJfQorCX0KK30KK3B1YmxpYyBjaGFyW10gZ2V0U291cmNlKCkgeworCXRyeSB7CisJCWlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgV29ya2luZ0NvcHkpIHsKKwkJCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5vcGVuYWJsZS5nZXRCdWZmZXIoKTsKKwkJCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJfSBlbHNlIGlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisJCQlyZXR1cm4gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoKElGaWxlKXRoaXMucmVzb3VyY2UpOworCQl9IGVsc2UgaWYgKHRoaXMub3BlbmFibGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXRoaXMub3BlbmFibGU7CisJCQlyZXR1cm4gdGhpcy5sb2NhdG9yLmZpbmRTb3VyY2UoY2xhc3NGaWxlKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQorcHVibGljIGJvb2xlYW4gaGFzQWxyZWFkeURlZmluZWRUeXBlKCkgeworCWlmICh0aGlzLnBhcnNlZFVuaXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IHRoaXMucGFyc2VkVW5pdC5jb21waWxhdGlvblJlc3VsdDsKKwlpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiBmYWxzZTsKKwlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5wcm9ibGVtQ291bnQ7IGkrKykgeworCQlJUHJvYmxlbSBwcm9ibGVtID0gcmVzdWx0LnByb2JsZW1zW2ldOworCQlpZiAocHJvYmxlbS5nZXRJRCgpID09IElQcm9ibGVtLkR1cGxpY2F0ZVR5cGVzKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3B1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJY2hhcltdIHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKCk7CisJaWYgKHNvdXJjZSA9PSBudWxsKSB7CisJCWlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKSB7CisJCQl0aGlzLmxvY2F0ZU1hdGNoZXNJbkNsYXNzRmlsZSgpOworCQl9CisJfSBlbHNlIHsKKwkJdGhpcy5sb2NhdGVNYXRjaGVzSW5Db21waWxhdGlvblVuaXQoc291cmNlKTsKKwl9Cit9CisvKioKKyAqIExvY2F0ZSBkZWNsYXJhdGlvbiBpbiB0aGUgY3VycmVudCBjbGFzcyBmaWxlLiBUaGlzIGNsYXNzIGZpbGUgaXMgYWx3YXlzIGluIGEgamFyLgorICovCitwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlc0luQ2xhc3NGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpdGhpcy5vcGVuYWJsZTsKKwlJQmluYXJ5VHlwZSBpbmZvID0gdGhpcy5sb2NhdG9yLmdldEJpbmFyeUluZm8oY2xhc3NGaWxlLCB0aGlzLnJlc291cmNlKTsKKwlpZiAoaW5mbyA9PSBudWxsKSAKKwkJcmV0dXJuOyAvLyB1bmFibGUgdG8gZ28gZnVydGhlcgorCisJLy8gY2hlY2sgY2xhc3MgZGVmaW5pdGlvbgorCUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChCaW5hcnlUeXBlKWNsYXNzRmlsZS5nZXRUeXBlKCk7CisJaWYgKHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoZXNCaW5hcnkoaW5mbywgbnVsbCkpIHsKKwkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKGJpbmFyeVR5cGUsIGluZm8sIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsKKwl9CisKKwlib29sZWFuIGNvbXBpbGF0aW9uQWJvcnRlZCA9IGZhbHNlOworCWlmICh0aGlzLmxvY2F0b3IucGF0dGVybi5uZWVkc1Jlc29sdmUpIHsKKwkJLy8gcmVzb2x2ZQorCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWJpbmRpbmcgPSB0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGluZm8pOworCQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeyAvLyBpdCB3YXMgYWxyZWFkeSBjYWNoZWQgYXMgYSByZXN1bHQgb2YgYSBwcmV2aW91cyBxdWVyeQorCQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGJpbmFyeVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gdGhpcy5sb2NhdG9yLmxvb2t1cEVudmlyb25tZW50LmdldENhY2hlZFR5cGUoY29tcG91bmROYW1lKTsKKwkJCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsICYmIChyZWZlcmVuY2VCaW5kaW5nIGluc3RhbmNlb2YgQmluYXJ5VHlwZUJpbmRpbmcpKSB7CisJCQkJCS8vIGlmIHRoZSBiaW5kaW5nIGNvdWxkIGJlIGZvdW5kIGFuZCBpZiBpdCBjb21lcyBmcm9tIGEgc291cmNlIHR5cGUsCisJCQkJCWJpbmRpbmcgPSAoQmluYXJ5VHlwZUJpbmRpbmcpcmVmZXJlbmNlQmluZGluZzsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGNoZWNrIG1ldGhvZHMKKwkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGJpbmRpbmcubWV0aG9kcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworCQkJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkJCWludCBsZXZlbCA9IHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoTGV2ZWwobWV0aG9kKTsKKwkJCQkJc3dpdGNoIChsZXZlbCkgeworCQkJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklNUE9TU0lCTEVfTUFUQ0g6CisJCQkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU5BQ0NVUkFURV9NQVRDSDoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJSU1ldGhvZCBtZXRob2RIYW5kbGUgPSAKKwkJCQkJCQkJYmluYXJ5VHlwZS5nZXRNZXRob2QoCisJCQkJCQkJCQluZXcgU3RyaW5nKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgPyBiaW5kaW5nLmNvbXBvdW5kTmFtZVtiaW5kaW5nLmNvbXBvdW5kTmFtZS5sZW5ndGgtMV0gOiBtZXRob2Quc2VsZWN0b3IpLAorCQkJCQkJCQkJU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG5ldyBTdHJpbmcobWV0aG9kLnNpZ25hdHVyZSgpKS5yZXBsYWNlKCcvJywgJy4nKSkKKwkJCQkJCQkJKTsKKwkJCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0QmluYXJ5TWF0Y2goCisJCQkJCQkJCW1ldGhvZEhhbmRsZSwgCisJCQkJCQkJCWluZm8sIAorCQkJCQkJCQlsZXZlbCA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8gCisJCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6IAorCQkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCisJCQkvLyBjaGVjayBmaWVsZHMKKwkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBiaW5kaW5nLmZpZWxkcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tpXTsKKwkJCQkJaW50IGxldmVsID0gdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hMZXZlbChmaWVsZCk7CisJCQkJCXN3aXRjaCAobGV2ZWwpIHsKKwkJCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTVBPU1NJQkxFX01BVENIOgorCQkJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0g6CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCUlGaWVsZCBmaWVsZEhhbmRsZSA9IGJpbmFyeVR5cGUuZ2V0RmllbGQobmV3IFN0cmluZyhmaWVsZC5uYW1lKSk7CisJCQkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKAorCQkJCQkJCQlmaWVsZEhhbmRsZSwgCisJCQkJCQkJCWluZm8sIAorCQkJCQkJCQlsZXZlbCA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8gCisJCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6IAorCQkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQliaW5kaW5nID0gbnVsbDsKKwkJfQorCisJCS8vIG5vIG5lZWQgdG8gY2hlY2sgYmluYXJ5IGluZm8gaWYgcmVzb2x2ZSB3YXMgc3VjY2Vzc2Z1bAorCQljb21waWxhdGlvbkFib3J0ZWQgPSBiaW5kaW5nID09IG51bGw7CisJCWlmICghY29tcGlsYXRpb25BYm9ydGVkKSByZXR1cm47CisJfQorCisJLy8gaWYgY29tcGlsYXRpb24gd2FzIGFib3J0ZWQgaXQgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGNsYXNzIHBhdGg6IAorCS8vIHJlcG9ydCBhcyBhIHBvdGVudGlhbCBtYXRjaCBpZiBiaW5hcnkgaW5mbyBtYXRjaGVzIHRoZSBwYXR0ZXJuCisJaW50IGFjY3VyYWN5ID0gY29tcGlsYXRpb25BYm9ydGVkID8gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIIDogSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0g7CisJCisJLy8gY2hlY2sgbWV0aG9kcworCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gaW5mby5nZXRNZXRob2RzKCk7CisJaW50IGxlbmd0aCA9IG1ldGhvZHMgPT0gbnVsbCA/IDAgOiBtZXRob2RzLmxlbmd0aDsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJaWYgKHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoZXNCaW5hcnkobWV0aG9kLCBpbmZvKSkgeworCQkJSU1ldGhvZCBtZXRob2RIYW5kbGUgPSAKKwkJCQliaW5hcnlUeXBlLmdldE1ldGhvZCgKKwkJCQkJbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gaW5mby5nZXROYW1lKCkgOiBtZXRob2QuZ2V0U2VsZWN0b3IoKSksCisJCQkJCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKG1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCkpLnJlcGxhY2UoJy8nLCAnLicpKQorCQkJCSk7CisJCQl0aGlzLmxvY2F0b3IucmVwb3J0QmluYXJ5TWF0Y2gobWV0aG9kSGFuZGxlLCBpbmZvLCBhY2N1cmFjeSk7CisJCX0KKwl9CisKKwkvLyBjaGVjayBmaWVsZHMKKwlJQmluYXJ5RmllbGRbXSBmaWVsZHMgPSBpbmZvLmdldEZpZWxkcygpOworCWxlbmd0aCA9IGZpZWxkcyA9PSBudWxsID8gMCA6IGZpZWxkcy5sZW5ndGg7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJQmluYXJ5RmllbGQgZmllbGQgPSBmaWVsZHNbaV07CisJCWlmICh0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaGVzQmluYXJ5KGZpZWxkLCBpbmZvKSkgeworCQkJSUZpZWxkIGZpZWxkSGFuZGxlID0gYmluYXJ5VHlwZS5nZXRGaWVsZChuZXcgU3RyaW5nKGZpZWxkLmdldE5hbWUoKSkpOworCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKGZpZWxkSGFuZGxlLCBpbmZvLCBhY2N1cmFjeSk7CisJCX0KKwl9Cit9Citwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlc0luQ29tcGlsYXRpb25Vbml0KGNoYXJbXSBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAodGhpcy5wYXJzZWRVbml0ID09IG51bGwpIHsgLy8gY2FzZSB3aGVyZSBubyBiaW5kaW5nIHJlc29sdXRpb24gaXMgbmVlZGVkCisJCS8vIGNyZWF0ZSBtYXRjaCBzZXQJCisJCXRoaXMubWF0Y2hTZXQgPSBuZXcgTWF0Y2hTZXQodGhpcy5sb2NhdG9yKTsKKwkJdGhpcy5sb2NhdG9yLnBhcnNlci5tYXRjaFNldCA9IHRoaXMubWF0Y2hTZXQ7CisJCQorCQkvLyBkaWV0IHBhcnNlCisJCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gdGhpcy5nZXRRdWFsaWZpZWROYW1lKCk7CisJCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwgfHwgKHRoaXMucGFyc2VkVW5pdCA9IChDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbil0aGlzLmxvY2F0b3IucGFyc2VkVW5pdHMuZ2V0KHF1YWxpZmllZE5hbWUpKSA9PSBudWxsKSB7CisJCQl0aGlzLnBhcnNlZFVuaXQgPSB0aGlzLmxvY2F0b3IuZGlldFBhcnNlKHNvdXJjZSk7CisJCX0KKwl9CisJaWYgKHRoaXMucGFyc2VkVW5pdCAhPSBudWxsKSB7CisJCXRyeSB7CisJCQl0aGlzLmxvY2F0b3IucGFyc2VyLm1hdGNoU2V0ID0gdGhpcy5tYXRjaFNldDsKKwkJCXRoaXMubG9jYXRvci5wYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKKwkJCXRoaXMubG9jYXRvci5wYXJzZXIucGFyc2VCb2RpZXModGhpcy5wYXJzZWRVbml0KTsKKwkJCS8vIHJlcG9ydCBtYXRjaGVzIHRoYXQgZG9uJ3QgbmVlZCByZXNvbHZlCisJCQl0aGlzLm1hdGNoU2V0LmN1SGFzQmVlblJlc29sdmVkID0gZmFsc2U7CisJCQl0aGlzLm1hdGNoU2V0LnJlcG9ydE1hdGNoaW5nKHBhcnNlZFVuaXQpOworCQkJCisJCQkvLyByZXNvbHZlIGlmIG5lZWRlZAorCQkJaWYgKHRoaXMubWF0Y2hTZXQubmVlZHNSZXNvbHZlKCkpIHsKKwkJCQlpZiAodGhpcy5wYXJzZWRVbml0LnR5cGVzICE9IG51bGwpIHsKKwkJCQkJaWYgKHRoaXMuc2hvdWxkUmVzb2x2ZSkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpZiAodGhpcy5wYXJzZWRVbml0LnNjb3BlID09IG51bGwpIHsKKwkJCQkJCQkJLy8gYmluZGluZ3Mgd2VyZSBub3QgY3JlYXRlZCAoY2FzZSBvZiBhIEZpZWxkUmVmZXJlbmNlUGF0dGVybiB0aGF0IGRvZXNuJ3QgbmVlZCByZXNvbHZlLCAKKwkJCQkJCQkJLy8gYnV0IHdlIG5lZWQgdG8gcmVzb2x2ZSBiZWNhdXNlIG9mIGEgU2luZ2xlTmFtZVJlZmVyZW5jZSBiZWluZyBhIHBvdGVudGlhbCBtYXRjaCkKKwkJCQkJCQkJdGhpcy5sb2NhdG9yLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHRoaXMucGFyc2VkVW5pdCk7CisJCQkJCQkJCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh0aGlzLnBhcnNlZFVuaXQsIHRydWUpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodGhpcy5wYXJzZWRVbml0LnNjb3BlICE9IG51bGwpIHsKKwkJCQkJCQkJdGhpcy5wYXJzZWRVbml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOworCQkJCQkJCQl0aGlzLnBhcnNlZFVuaXQucmVzb2x2ZSgpOworCQkJCQkJCX0KKwkJCQkJCQkvLyByZXBvcnQgbWF0Y2hlcyB0aGF0IG5lZWRlZCByZXNvbHZlCisJCQkJCQkJdGhpcy5tYXRjaFNldC5jdUhhc0JlZW5SZXNvbHZlZCA9IHRydWU7CisJCQkJCQkJdGhpcy5tYXRjaFNldC5yZXBvcnRNYXRjaGluZyh0aGlzLnBhcnNlZFVuaXQpOworCQkJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCQkJLy8gY291bGQgbm90IHJlc29sdmU6IHJlcG9ydCBpbm5hY3VyYXRlIG1hdGNoZXMKKwkJCQkJCQl0aGlzLm1hdGNoU2V0LmN1SGFzQmVlblJlc29sdmVkID0gdHJ1ZTsKKwkJCQkJCQl0aGlzLm1hdGNoU2V0LnJlcG9ydE1hdGNoaW5nKHRoaXMucGFyc2VkVW5pdCk7CisJCQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIEFib3J0Q29tcGlsYXRpb25Vbml0KSkgeworCQkJCQkJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3MgcGF0aAorCQkJCQkJCQl0aHJvdyBlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHByb2JsZW0gb2N1cmVkIHdoaWxlIGNvbXBsZXRpbmcgdGhlIGJpbmRpbmdzIGZvciB0aGUgYmFzZSBjbGFzc2VzCisJCQkJCQkvLyAtPiByZXBvcnQgaW5uYWN1cmF0ZSBtYXRjaGVzCisJCQkJCQl0aGlzLm1hdGNoU2V0LmN1SGFzQmVlblJlc29sdmVkID0gdHJ1ZTsKKwkJCQkJCXRoaXMubWF0Y2hTZXQucmVwb3J0TWF0Y2hpbmcodGhpcy5wYXJzZWRVbml0KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMubG9jYXRvci5wYXJzZXIubWF0Y2hTZXQgPSBudWxsOworCQl9CisJfQorfQorLyoqCisgKiBGcmVlIG1lbW9yeS4KKyAqLworcHVibGljIHZvaWQgcmVzZXQoKSB7CisJdGhpcy5sb2NhdG9yLnBhcnNlZFVuaXRzLnJlbW92ZUtleSh0aGlzLmdldFF1YWxpZmllZE5hbWUoKSk7CisJdGhpcy5wYXJzZWRVbml0ID0gbnVsbDsKKwl0aGlzLm1hdGNoU2V0ID0gbnVsbDsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuIHRoaXMub3BlbmFibGUudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hpbmdPcGVuYWJsZVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ09wZW5hYmxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzMGVhOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hpbmdPcGVuYWJsZVNldC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKKworLyoqCisgKiBBIHNldCBvZiBNYXRjaGluZ09QZW5hYmxlcyB0aGF0IGlzIHNvcnRlZCBieSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLgorICovCitwdWJsaWMgY2xhc3MgTWF0Y2hpbmdPcGVuYWJsZVNldCB7CisJcHJpdmF0ZSBIYXNodGFibGVPZk9iamVjdCByb290c1RvT3BlbmFibGUgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoNSk7CisJcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKKwkKKwlwdWJsaWMgdm9pZCBhZGQoTWF0Y2hpbmdPcGVuYWJsZSBtYXRjaGluZ09wZW5hYmxlKSB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBtYXRjaGluZ09wZW5hYmxlLm9wZW5hYmxlLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwkJY2hhcltdIHBhdGggPSByb290LmdldFBhdGgoKS50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CisJCU9iamVjdFZlY3RvciBvcGVuYWJsZXMgPSAoT2JqZWN0VmVjdG9yKXRoaXMucm9vdHNUb09wZW5hYmxlLmdldChwYXRoKTsKKwkJaWYgKG9wZW5hYmxlcyA9PSBudWxsKSB7CisJCQlvcGVuYWJsZXMgPSBuZXcgT2JqZWN0VmVjdG9yKCk7CisJCQl0aGlzLnJvb3RzVG9PcGVuYWJsZS5wdXQocGF0aCwgb3BlbmFibGVzKTsKKwkJCW9wZW5hYmxlcy5hZGQobWF0Y2hpbmdPcGVuYWJsZSk7CisJCQl0aGlzLmVsZW1lbnRDb3VudCsrOworCQl9IGVsc2UgaWYgKCFvcGVuYWJsZXMuY29udGFpbnMobWF0Y2hpbmdPcGVuYWJsZSkpIHsKKwkJCW9wZW5hYmxlcy5hZGQobWF0Y2hpbmdPcGVuYWJsZSk7CisJCQl0aGlzLmVsZW1lbnRDb3VudCsrOworCQl9CisJfQorCQorCXB1YmxpYyBNYXRjaGluZ09wZW5hYmxlW10gZ2V0TWF0Y2hpbmdPcGVuYWJsZXMoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cykgeworCQlNYXRjaGluZ09wZW5hYmxlW10gcmVzdWx0ID0gbmV3IE1hdGNoaW5nT3BlbmFibGVbdGhpcy5lbGVtZW50Q291bnRdOworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJCWNoYXJbXSBwYXRoID0gcm9vdC5nZXRQYXRoKCkudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJT2JqZWN0VmVjdG9yIG9wZW5hYmxlcyA9IChPYmplY3RWZWN0b3IpdGhpcy5yb290c1RvT3BlbmFibGUuZ2V0KHBhdGgpOworCQkJaWYgKG9wZW5hYmxlcyAhPSBudWxsKSB7CisJCQkJb3BlbmFibGVzLmNvcHlJbnRvKHJlc3VsdCwgaW5kZXgpOworCQkJCWluZGV4ICs9IG9wZW5hYmxlcy5zaXplKCk7CisJCQl9CisJCX0KKwkJaWYgKGluZGV4IDwgdGhpcy5lbGVtZW50Q291bnQpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJcmVzdWx0LCAKKwkJCQkwLCAKKwkJCQlyZXN1bHQgPSBuZXcgTWF0Y2hpbmdPcGVuYWJsZVtpbmRleF0sCisJCQkJMCwKKwkJCQlpbmRleCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTYxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5BYnN0cmFjdEluZGV4ZXI7CisKK3B1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvblBhdHRlcm4gZXh0ZW5kcyBNZXRob2RQYXR0ZXJuIHsKK3B1YmxpYyBNZXRob2REZWNsYXJhdGlvblBhdHRlcm4oCisJY2hhcltdIHNlbGVjdG9yLCAKKwlpbnQgbWF0Y2hNb2RlLCAKKwlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwKKwljaGFyW10gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSwJCisJY2hhcltdIHJldHVyblF1YWxpZmljYXRpb24sIAorCWNoYXJbXSByZXR1cm5TaW1wbGVOYW1lLAorCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwljaGFyW11bXSBwYXJhbWV0ZXJTaW1wbGVOYW1lcykgeworCisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCisJdGhpcy5zZWxlY3RvciA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHNlbGVjdG9yIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzZWxlY3Rvcik7CisJdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7CisJdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gZGVjbGFyaW5nU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UoZGVjbGFyaW5nU2ltcGxlTmFtZSk7CisJdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlID8gcmV0dXJuUXVhbGlmaWNhdGlvbiA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocmV0dXJuUXVhbGlmaWNhdGlvbik7CisJdGhpcy5yZXR1cm5TaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gcmV0dXJuU2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocmV0dXJuU2ltcGxlTmFtZSk7CisKKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgIT0gbnVsbCl7CisJCXRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMgPSBuZXcgY2hhcltwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGhdW107CisJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPSBuZXcgY2hhcltwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQl0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldID0gaXNDYXNlU2Vuc2l0aXZlID8gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldKTsKKwkJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0gPSBpc0Nhc2VTZW5zaXRpdmUgPyBwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0pOworCQl9CisJfQkKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHRoaXMubmVlZHNSZXNvbHZlKCk7Cit9CitwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeVJlc3VsdCl7CisKKwljaGFyW10gd29yZCA9IGVudHJ5UmVzdWx0LmdldFdvcmQoKTsKKwlpbnQgc2l6ZSA9IHdvcmQubGVuZ3RoOworCWludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKFNFUEFSQVRPUiwgd29yZCk7CQorCisJZGVjb2RlZFBhcmFtZXRlckNvdW50ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKHdvcmQsIGxhc3RTZXBhcmF0b3JJbmRleCArIDEsIHNpemUgLSBsYXN0U2VwYXJhdG9ySW5kZXggLSAxKSk7CisJZGVjb2RlZFNlbGVjdG9yID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBNRVRIT0RfREVDTC5sZW5ndGgsIGxhc3RTZXBhcmF0b3JJbmRleCk7Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZlZWRJbmRleFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBmZWVkSW5kZXhSZXF1ZXN0b3IoSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBpbnRbXSByZWZlcmVuY2VzLCBJbmRleElucHV0IGlucHV0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWZvciAoaW50IGkgPSAwLCBtYXggPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCUluZGV4ZWRGaWxlIGZpbGUgPSBpbnB1dC5nZXRJbmRleGVkRmlsZShyZWZlcmVuY2VzW2ldKTsKKwkJU3RyaW5nIHBhdGg7CisJCWlmIChmaWxlICE9IG51bGwgJiYgc2NvcGUuZW5jbG9zZXMocGF0aCA9IEluZGV4ZWRGaWxlLmNvbnZlcnRQYXRoKGZpbGUuZ2V0UGF0aCgpKSkpIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2REZWNsYXJhdGlvbihwYXRoLCBkZWNvZGVkU2VsZWN0b3IsIGRlY29kZWRQYXJhbWV0ZXJDb3VudCk7CisJCX0KKwl9Cit9CitwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCl7CisJcmV0dXJuICJNZXRob2REZWNsYXJhdGlvblBhdHRlcm46ICI7IC8vJE5PTi1OTFMtMSQKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI2luZGV4RW50cnlQcmVmaXgKKyAqLworcHVibGljIGNoYXJbXSBpbmRleEVudHJ5UHJlZml4KCkgeworCisJcmV0dXJuIEFic3RyYWN0SW5kZXhlci5iZXN0TWV0aG9kRGVjbGFyYXRpb25QcmVmaXgoCisJCQlzZWxlY3RvciwgCisJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGgsIAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIENMQVNTOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlc0JpbmFyeShPYmplY3QsIE9iamVjdCkKKyAqLworcHVibGljIGJvb2xlYW4gbWF0Y2hlc0JpbmFyeShPYmplY3QgYmluYXJ5SW5mbywgT2JqZWN0IGVuY2xvc2luZ0JpbmFyeUluZm8pIHsKKwlpZiAoIShiaW5hcnlJbmZvIGluc3RhbmNlb2YgSUJpbmFyeU1ldGhvZCkpIHJldHVybiBmYWxzZTsKKworCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gKElCaW5hcnlNZXRob2QpYmluYXJ5SW5mbzsKKwkKKwkvLyBzZWxlY3RvcgorCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNlbGVjdG9yLCBtZXRob2QuZ2V0U2VsZWN0b3IoKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJSUJpbmFyeVR5cGUgZGVjbGFyaW5nVHlwZSA9IChJQmluYXJ5VHlwZSllbmNsb3NpbmdCaW5hcnlJbmZvOworCWlmIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lID0gKGNoYXJbXSlkZWNsYXJpbmdUeXBlLmdldE5hbWUoKS5jbG9uZSgpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZGVjbGFyaW5nVHlwZU5hbWUsICcvJywgJy4nKTsKKwkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdUeXBlTmFtZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCVN0cmluZyBtZXRob2REZXNjcmlwdG9yID0gbmV3IFN0cmluZyhtZXRob2QuZ2V0TWV0aG9kRGVzY3JpcHRvcigpKS5yZXBsYWNlKCcvJywgJy4nKTsKKworCS8vIGxvb2sgYXQgcmV0dXJuIHR5cGUgb25seSBpZiBkZWNsYXJpbmcgdHlwZSBpcyBub3Qgc3BlY2lmaWVkCisJaWYgKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCVN0cmluZyByZXR1cm5UeXBlU2lnbmF0dXJlID0gU2lnbmF0dXJlLnRvU3RyaW5nKFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKG1ldGhvZERlc2NyaXB0b3IpKTsKKwkJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMucmV0dXJuU2ltcGxlTmFtZSwgdGhpcy5yZXR1cm5RdWFsaWZpY2F0aW9uLCByZXR1cm5UeXBlU2lnbmF0dXJlLnRvQ2hhckFycmF5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCQorCS8vIHBhcmFtZXRlciB0eXBlcworCWludCBwYXJhbWV0ZXJDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CisJaWYgKHBhcmFtZXRlckNvdW50ID4gLTEpIHsKKwkJU3RyaW5nW10gYXJndW1lbnRzID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG1ldGhvZERlc2NyaXB0b3IpOworCQlpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyBpKyspIHsKKwkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsKKwkJCWNoYXJbXSB0eXBlID0gdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXTsKKwkJCWlmICghdGhpcy5tYXRjaGVzVHlwZSh0eXBlLCBxdWFsaWZpY2F0aW9uLCBTaWduYXR1cmUudG9TdHJpbmcoYXJndW1lbnRzW2ldKS50b0NoYXJBcnJheSgpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoIShub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbilub2RlOworCisJaWYgKHJlc29sdmUpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChtZXRob2QuYmluZGluZyk7CisJfSBlbHNlIHsKKwkJLy8gc2VsZWN0b3IKKwkJaWYgKCF0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2VsZWN0b3IsIG1ldGhvZC5zZWxlY3RvcikpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCQkvLyByZXR1cm4gdHlwZQorCQlUeXBlUmVmZXJlbmNlIG1ldGhvZFJldHVyblR5cGUgPSBtZXRob2QucmV0dXJuVHlwZTsKKwkJaWYgKG1ldGhvZFJldHVyblR5cGUgIT0gbnVsbCkgeworCQkJY2hhcltdW10gbWV0aG9kUmV0dXJuVHlwZU5hbWUgPSBtZXRob2RSZXR1cm5UeXBlLmdldFR5cGVOYW1lKCk7CisJCQljaGFyW10gc291cmNlTmFtZSA9IHRoaXMudG9BcnJheU5hbWUoCisJCQkJbWV0aG9kUmV0dXJuVHlwZU5hbWVbbWV0aG9kUmV0dXJuVHlwZU5hbWUubGVuZ3RoLTFdLCAKKwkJCQltZXRob2RSZXR1cm5UeXBlLmRpbWVuc2lvbnMoKSk7CisJCQlpZiAoIXRoaXMubWF0Y2hlc05hbWUodGhpcy5yZXR1cm5TaW1wbGVOYW1lLCBzb3VyY2VOYW1lKSkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJfQorCQkJCisJCS8vIHBhcmFtZXRlciB0eXBlcworCQlpbnQgcGFyYW1ldGVyQ291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOworCQlpZiAocGFyYW1ldGVyQ291bnQgPiAtMSkgeworCQkJaW50IGFyZ3VtZW50Q291bnQgPSBtZXRob2QuYXJndW1lbnRzID09IG51bGwgPyAwIDogbWV0aG9kLmFyZ3VtZW50cy5sZW5ndGg7CisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJfQorCisJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJfQorfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcpCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgTWV0aG9kQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCWludCBsZXZlbDsKKworCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gKE1ldGhvZEJpbmRpbmcpYmluZGluZzsKKwkKKwkvLyBzZWxlY3RvcgorCWlmICghdGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNlbGVjdG9yLCBtZXRob2Quc2VsZWN0b3IpKQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdUeXBlID0gbWV0aG9kLmRlY2xhcmluZ0NsYXNzOworCWlmICghbWV0aG9kLmlzU3RhdGljKCkgJiYgIW1ldGhvZC5pc1ByaXZhdGUoKSkgeworCQlsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEFzU3VidHlwZShkZWNsYXJpbmdUeXBlLCB0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUsIHRoaXMuZGVjbGFyaW5nUXVhbGlmaWNhdGlvbik7CisJfSBlbHNlIHsKKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCBkZWNsYXJpbmdUeXBlKTsKKwl9CisJaWYgKGxldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJfQorCisJLy8gbG9vayBhdCByZXR1cm4gdHlwZSBvbmx5IGlmIGRlY2xhcmluZyB0eXBlIGlzIG5vdCBzcGVjaWZpZWQKKwlpZiAodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwpIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnJldHVyblNpbXBsZU5hbWUsIHRoaXMucmV0dXJuUXVhbGlmaWNhdGlvbiwgbWV0aG9kLnJldHVyblR5cGUpOworCQlzd2l0Y2ggKG5ld0xldmVsKSB7CisJCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6CisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQljYXNlIEFDQ1VSQVRFX01BVENIOiAvLyBrZWVwIHByZXZpb3VzIGxldmVsCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSAorCQkJCWxldmVsID0gbmV3TGV2ZWw7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJCQorCS8vIHBhcmFtZXRlciB0eXBlcworCWludCBwYXJhbWV0ZXJDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CisJaWYgKHBhcmFtZXRlckNvdW50ID4gLTEpIHsKKwkJaW50IGFyZ3VtZW50Q291bnQgPSBtZXRob2QucGFyYW1ldGVycyA9PSBudWxsID8gMCA6IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJaWYgKHBhcmFtZXRlckNvdW50ICE9IGFyZ3VtZW50Q291bnQpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKSB7CisJCQljaGFyW10gcXVhbGlmaWNhdGlvbiA9IHRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV07CisJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07CisJCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHR5cGUsIHF1YWxpZmljYXRpb24sIG1ldGhvZC5wYXJhbWV0ZXJzW2ldKTsKKwkJCXN3aXRjaCAobmV3TGV2ZWwpIHsKKwkJCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6CisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6IC8vIGtlZXAgcHJldmlvdXMgbGV2ZWwKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gKKwkJCQkJbGV2ZWwgPSBuZXdMZXZlbDsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbGV2ZWw7Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTQ3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFBhdHRlcm4uamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZFBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuIHsKKworCS8vIHNlbGVjdG9yCQorCXByb3RlY3RlZCBjaGFyW10gc2VsZWN0b3I7CisJCisJLy8gZGVjbGFyaW5nIHR5cGUKKwlwcm90ZWN0ZWQgY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb247CisJcHJvdGVjdGVkIGNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lOworCisJLy8gcmV0dXJuIHR5cGUKKwlwcm90ZWN0ZWQgY2hhcltdIHJldHVyblF1YWxpZmljYXRpb247CisJcHJvdGVjdGVkIGNoYXJbXSByZXR1cm5TaW1wbGVOYW1lOworCisJLy8gcGFyYW1ldGVyIHR5cGVzCisJcHJvdGVjdGVkIGNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zOworCXByb3RlY3RlZCBjaGFyW11bXSBwYXJhbWV0ZXJTaW1wbGVOYW1lczsKKworCXByb3RlY3RlZCBjaGFyW10gZGVjb2RlZFNlbGVjdG9yOworCXByb3RlY3RlZCBpbnQgZGVjb2RlZFBhcmFtZXRlckNvdW50OwkKK3B1YmxpYyBNZXRob2RQYXR0ZXJuKGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworfQorcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpOworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIHNlbGVjdG9yIG1hdGNoZXMgKi8KKwlpZiAoc2VsZWN0b3IgIT0gbnVsbCl7CisJCXN3aXRjaChtYXRjaE1vZGUpeworCQkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhzZWxlY3RvciwgZGVjb2RlZFNlbGVjdG9yLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHNlbGVjdG9yLCBkZWNvZGVkU2VsZWN0b3IsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ubWF0Y2goc2VsZWN0b3IsIGRlY29kZWRTZWxlY3RvciwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCX0KKwl9CisJaWYgKHBhcmFtZXRlclNpbXBsZU5hbWVzICE9IG51bGwpeworCQlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoICE9IGRlY29kZWRQYXJhbWV0ZXJDb3VudCkgcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG1lc3NhZ2Ugc2VuZCB3aWxsIG5lZWQgdG8gYmUgcmVzb2x2ZWQgdG8gCisgKiBmaW5kIG91dCBpZiB0aGlzIG1ldGhvZCBwYXR0ZXJuIG1hdGNoZXMgaXQuCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG5lZWRzUmVzb2x2ZSgpIHsKKworCS8vIGRlY2xhcmluZyB0eXBlCisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCB8fCBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIHJldHVybiB0cnVlOworCisJLy8gcmV0dXJuIHR5cGUKKwlpZiAocmV0dXJuU2ltcGxlTmFtZSAhPSBudWxsIHx8IHJldHVyblF1YWxpZmljYXRpb24gIT0gbnVsbCkgcmV0dXJuIHRydWU7CisKKwkvLyBwYXJhbWV0ZXIgdHlwZXMKKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgIT0gbnVsbCl7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAocGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gIT0gbnVsbCB8fCBwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJYnVmZmVyLmFwcGVuZCh0aGlzLmdldFBhdHRlcm5OYW1lKCkpOworCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbikuYXBwZW5kKCcuJyk7CisJaWYgKGRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCkgCisJCWJ1ZmZlci5hcHBlbmQoZGVjbGFyaW5nU2ltcGxlTmFtZSkuYXBwZW5kKCcuJyk7CisJZWxzZSBpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKCIqLiIpOyAvLyROT04tTkxTLTEkCisJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKKwkJYnVmZmVyLmFwcGVuZChzZWxlY3Rvcik7CisJfSBlbHNlIHsKKwkJYnVmZmVyLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCisJfQorCWJ1ZmZlci5hcHBlbmQoJygnKTsKKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCIuLi4iKTsgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAoaSA+IDApIGJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldKS5hcHBlbmQoJy4nKTsKKwkJCWlmIChwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA9PSBudWxsKSBidWZmZXIuYXBwZW5kKCcqJyk7IGVsc2UgYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSk7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgnKScpOworCWlmIChyZXR1cm5RdWFsaWZpY2F0aW9uICE9IG51bGwpIAorCQlidWZmZXIuYXBwZW5kKCIgLS0+ICIpLmFwcGVuZChyZXR1cm5RdWFsaWZpY2F0aW9uKS5hcHBlbmQoJy4nKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UgaWYgKHJldHVyblNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiIC0tPiAiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChyZXR1cm5TaW1wbGVOYW1lICE9IG51bGwpIAorCQlidWZmZXIuYXBwZW5kKHJldHVyblNpbXBsZU5hbWUpOworCWVsc2UgaWYgKHJldHVyblF1YWxpZmljYXRpb24gIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDogCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwl9CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFJlZmVyZW5jZVBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc0ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkFic3RyYWN0SW5kZXhlcjsKKworcHVibGljIGNsYXNzIE1ldGhvZFJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBNZXRob2RQYXR0ZXJuIHsKKwlJVHlwZSBkZWNsYXJpbmdUeXBlOworCXB1YmxpYyBjaGFyW11bXVtdIGFsbFN1cGVyRGVjbGFyaW5nVHlwZU5hbWVzOworCitwdWJsaWMgTWV0aG9kUmVmZXJlbmNlUGF0dGVybigKKwljaGFyW10gc2VsZWN0b3IsIAorCWludCBtYXRjaE1vZGUsIAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLAorCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBkZWNsYXJpbmdTaW1wbGVOYW1lLAkKKwljaGFyW10gcmV0dXJuUXVhbGlmaWNhdGlvbiwgCisJY2hhcltdIHJldHVyblNpbXBsZU5hbWUsCisJY2hhcltdW10gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCWNoYXJbXVtdIHBhcmFtZXRlclNpbXBsZU5hbWVzLAorCUlUeXBlIGRlY2xhcmluZ1R5cGUpIHsKKworCXN1cGVyKG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwkKKwl0aGlzLnNlbGVjdG9yID0gaXNDYXNlU2Vuc2l0aXZlID8gc2VsZWN0b3IgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNlbGVjdG9yKTsKKwl0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUgPyBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdRdWFsaWZpY2F0aW9uKTsKKwl0aGlzLmRlY2xhcmluZ1NpbXBsZU5hbWUgPSBpc0Nhc2VTZW5zaXRpdmUgPyBkZWNsYXJpbmdTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShkZWNsYXJpbmdTaW1wbGVOYW1lKTsKKwl0aGlzLnJldHVyblF1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUgPyByZXR1cm5RdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShyZXR1cm5RdWFsaWZpY2F0aW9uKTsKKwl0aGlzLnJldHVyblNpbXBsZU5hbWUgPSBpc0Nhc2VTZW5zaXRpdmUgPyByZXR1cm5TaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShyZXR1cm5TaW1wbGVOYW1lKTsKKwlpZiAocGFyYW1ldGVyU2ltcGxlTmFtZXMgIT0gbnVsbCl7CisJCXRoaXMucGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMgPSBuZXcgY2hhcltwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGhdW107CisJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPSBuZXcgY2hhcltwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQl0aGlzLnBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldID0gaXNDYXNlU2Vuc2l0aXZlID8gcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnNbaV0gOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldKTsKKwkJCXRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0gPSBpc0Nhc2VTZW5zaXRpdmUgPyBwYXJhbWV0ZXJTaW1wbGVOYW1lc1tpXSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGFyYW1ldGVyU2ltcGxlTmFtZXNbaV0pOworCQl9CisJfQorCXRoaXMuZGVjbGFyaW5nVHlwZSA9IGRlY2xhcmluZ1R5cGU7CisJdGhpcy5uZWVkc1Jlc29sdmUgPSB0aGlzLm5lZWRzUmVzb2x2ZSgpOworfQorcHVibGljIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpeworCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNpemUgPSB3b3JkLmxlbmd0aDsKKwlpbnQgbGFzdFNlcGFyYXRvckluZGV4ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZihTRVBBUkFUT1IsIHdvcmQpOwkKKworCWRlY29kZWRQYXJhbWV0ZXJDb3VudCA9IEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyh3b3JkLCBsYXN0U2VwYXJhdG9ySW5kZXggKyAxLCBzaXplIC0gbGFzdFNlcGFyYXRvckluZGV4IC0gMSkpOworCWRlY29kZWRTZWxlY3RvciA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgTUVUSE9EX1JFRi5sZW5ndGgsIGxhc3RTZXBhcmF0b3JJbmRleCk7Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZlZWRJbmRleFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBmZWVkSW5kZXhSZXF1ZXN0b3IoSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBpbnRbXSByZWZlcmVuY2VzLCBJbmRleElucHV0IGlucHV0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWZvciAoaW50IGkgPSAwLCBtYXggPSByZWZlcmVuY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCUluZGV4ZWRGaWxlIGZpbGUgPSBpbnB1dC5nZXRJbmRleGVkRmlsZShyZWZlcmVuY2VzW2ldKTsKKwkJU3RyaW5nIHBhdGg7CisJCWlmIChmaWxlICE9IG51bGwgJiYgc2NvcGUuZW5jbG9zZXMocGF0aCA9IEluZGV4ZWRGaWxlLmNvbnZlcnRQYXRoKGZpbGUuZ2V0UGF0aCgpKSkpIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UocGF0aCwgZGVjb2RlZFNlbGVjdG9yLCBkZWNvZGVkUGFyYW1ldGVyQ291bnQpOworCQl9CisJfQorfQorcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpeworCXJldHVybiAiTWV0aG9kUmVmZXJlbmNlUGF0dGVybjogIjsgLy8kTk9OLU5MUy0xJAorfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jaW5kZXhFbnRyeVByZWZpeAorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKSB7CisKKwlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RNZXRob2RSZWZlcmVuY2VQcmVmaXgoCisJCQlzZWxlY3RvciwgCisJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyA9PSBudWxsID8gLTEgOiBwYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGgsIAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIE1FVEhPRCB8IEZJRUxEOworfQorCitwdWJsaWMgdm9pZCBpbml0aWFsaXplUG9seW1vcnBoaWNTZWFyY2goTWF0Y2hMb2NhdG9yIGxvY2F0b3IsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJdHJ5IHsKKwkJdGhpcy5hbGxTdXBlckRlY2xhcmluZ1R5cGVOYW1lcyA9IAorCQkJbmV3IFN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yKAorCQkJCXRoaXMsIAorCQkJCWxvY2F0b3IsCisJCQkJdGhpcy5kZWNsYXJpbmdUeXBlLCAKKwkJCQlwcm9ncmVzc01vbml0b3IpLmNvbGxlY3QoKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkvLyBpbmFjY3VyYXRlIG1hdGNoZXMgd2lsbCBiZSBmb3VuZAorCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvZGUgZ2VuIHdpbGwgdXNlIGFuIGludm9rZSB2aXJ0dWFsIGZvciAKKyAqIHRoaXMgbWVzc2FnZSBzZW5kIG9yIG5vdC4KKyAqLworcHJpdmF0ZSBib29sZWFuIGlzVmlydHVhbEludm9rZShNZXRob2RCaW5kaW5nIG1ldGhvZCwgTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQpIHsKKwlyZXR1cm4gIW1ldGhvZC5pc1N0YXRpYygpICYmICFtZXNzYWdlU2VuZC5pc1N1cGVyQWNjZXNzKCkgJiYgIW1ldGhvZC5pc1ByaXZhdGUoKTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoIShub2RlIGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClub2RlOworCisJaWYgKHJlc29sdmUpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChtZXNzYWdlU2VuZC5iaW5kaW5nLCBtZXNzYWdlU2VuZCk7CisJfSBlbHNlIHsKKwkJLy8gc2VsZWN0b3IKKwkJaWYgKHRoaXMuc2VsZWN0b3IgIT0gbnVsbCAmJiAhdGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNlbGVjdG9yLCBtZXNzYWdlU2VuZC5zZWxlY3RvcikpCisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQorCQkvLyBhcmd1bWVudCB0eXBlcworCQlpbnQgYXJndW1lbnRDb3VudCA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMgPT0gbnVsbCA/IC0xIDogdGhpcy5wYXJhbWV0ZXJTaW1wbGVOYW1lcy5sZW5ndGg7CisJCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsKKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IG1lc3NhZ2VTZW5kLmFyZ3VtZW50cyA9PSBudWxsID8gMCA6IG1lc3NhZ2VTZW5kLmFyZ3VtZW50cy5sZW5ndGg7CisJCQlpZiAocGFyYW1ldGVyQ291bnQgIT0gYXJndW1lbnRDb3VudCkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJfQorCisJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJfQorfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcpCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcsIE1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kKSB7CisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwlpbnQgbGV2ZWw7CisKKwlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IChNZXRob2RCaW5kaW5nKWJpbmRpbmc7CisKKwkvLyBzZWxlY3RvcgorCWlmICh0aGlzLnNlbGVjdG9yICE9IG51bGwgJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5zZWxlY3RvciwgbWV0aG9kLnNlbGVjdG9yKSkKKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisKKwkvLyByZWNlaXZlciB0eXBlCisJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUgPSAKKwkJYmluZGluZyA9PSBudWxsID8gCisJCQludWxsIDogCisJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3M7CisJaWYgKHRoaXMuaXNWaXJ0dWFsSW52b2tlKG1ldGhvZCwgbWVzc2FnZVNlbmQpICYmICghKG1lc3NhZ2VTZW5kLnJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIEFycmF5QmluZGluZykpKSB7CisJCWxldmVsID0gdGhpcy5tYXRjaExldmVsQXNTdWJ0eXBlKHJlY2VpdmVyVHlwZSwgdGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lLCB0aGlzLmRlY2xhcmluZ1F1YWxpZmljYXRpb24pOworCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgeworCQkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuYWxsU3VwZXJEZWNsYXJpbmdUeXBlTmFtZXMsIHJlY2VpdmVyVHlwZSk7CisJCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgeworCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuZGVjbGFyaW5nU2ltcGxlTmFtZSwgdGhpcy5kZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCByZWNlaXZlclR5cGUpOworCQlpZiAobGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJfQorCisJLy8gbG9vayBhdCByZXR1cm4gdHlwZSBvbmx5IGlmIGRlY2xhcmluZyB0eXBlIGlzIG5vdCBzcGVjaWZpZWQKKwlpZiAodGhpcy5kZWNsYXJpbmdTaW1wbGVOYW1lID09IG51bGwpIHsKKwkJaW50IG5ld0xldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnJldHVyblNpbXBsZU5hbWUsIHRoaXMucmV0dXJuUXVhbGlmaWNhdGlvbiwgbWV0aG9kLnJldHVyblR5cGUpOworCQlzd2l0Y2ggKG5ld0xldmVsKSB7CisJCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6CisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQljYXNlIEFDQ1VSQVRFX01BVENIOiAvLyBrZWVwIHByZXZpb3VzIGxldmVsCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSAorCQkJCWxldmVsID0gbmV3TGV2ZWw7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJCQorCS8vIGFyZ3VtZW50IHR5cGVzCisJaW50IGFyZ3VtZW50Q291bnQgPSB0aGlzLnBhcmFtZXRlclNpbXBsZU5hbWVzID09IG51bGwgPyAtMSA6IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXMubGVuZ3RoOworCWlmIChhcmd1bWVudENvdW50ID4gLTEpIHsKKwkJaWYgKG1ldGhvZC5wYXJhbWV0ZXJzID09IG51bGwpIHsKKwkJCWxldmVsID0gSU5BQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWludCBwYXJhbWV0ZXJDb3VudCA9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCWlmIChwYXJhbWV0ZXJDb3VudCAhPSBhcmd1bWVudENvdW50KSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgeworCQkJCWNoYXJbXSBxdWFsaWZpY2F0aW9uID0gdGhpcy5wYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXTsKKwkJCQljaGFyW10gdHlwZSA9IHRoaXMucGFyYW1ldGVyU2ltcGxlTmFtZXNbaV07CisJCQkJaW50IG5ld0xldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0eXBlLCBxdWFsaWZpY2F0aW9uLCBtZXRob2QucGFyYW1ldGVyc1tpXSk7CisJCQkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJCQljYXNlIElNUE9TU0lCTEVfTUFUQ0g6CisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDogLy8ga2VlcCBwcmV2aW91cyBsZXZlbAorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6IC8vIGllLiBJTkFDQ1VSQVRFX01BVENICisJCQkJCQlsZXZlbCA9IG5ld0xldmVsOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGxldmVsOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hSZXBvcnRSZWZlcmVuY2UKKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQXN0Tm9kZSByZWZlcmVuY2UsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCS8vIG1lc3NhZ2UgcmVmIGFyZSBzdGFydGluZyBhdCB0aGUgc2VsZWN0b3Igc3RhcnQKKwkJbG9jYXRvci5yZXBvcnQoCisJCQkoaW50KSAoKChNZXNzYWdlU2VuZCkgcmVmZXJlbmNlKS5uYW1lU291cmNlUG9zaXRpb24gPj4gMzIpLAorCQkJcmVmZXJlbmNlLnNvdXJjZUVuZCwKKwkJCWVsZW1lbnQsCisJCQlhY2N1cmFjeSk7CisJfSBlbHNlIHsKKwkJc3VwZXIubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7CisJfQorCQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NdWx0aXBsZVNlYXJjaFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlwbGVTZWFyY2hQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyOTczNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlwbGVTZWFyY2hQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpcGxlU2VhcmNoUGF0dGVybiBleHRlbmRzIEFuZFBhdHRlcm4geworCisJcHJvdGVjdGVkIGNoYXJbXSBjdXJyZW50VGFnOworCXB1YmxpYyBib29sZWFuIGZvdW5kQW1iaWd1b3VzSW5kZXhNYXRjaGVzID0gZmFsc2U7CQorcHVibGljIE11bHRpcGxlU2VhcmNoUGF0dGVybihpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCXN1cGVyKG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKK30KKy8qKgorICogUXVlcnkgYSBnaXZlbiBpbmRleCBmb3IgbWF0Y2hpbmcgZW50cmllcy4gCisgKi8KK3B1YmxpYyB2b2lkIGZpbmRJbmRleE1hdGNoZXMoSW5kZXhJbnB1dCBpbnB1dCwgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWNoYXJbXVtdIHBvc3NpYmxlVGFncyA9IGdldFBvc3NpYmxlVGFncygpOworCQorCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCS8qIG5hcnJvdyBkb3duIGEgc2V0IG9mIGVudHJpZXMgdXNpbmcgcHJlZml4IGNyaXRlcmlhICovCisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBvc3NpYmxlVGFncy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCWN1cnJlbnRUYWcgPSBwb3NzaWJsZVRhZ3NbaV07CisJCXN1cGVyLmZpbmRJbmRleE1hdGNoZXMoaW5wdXQsIHJlcXVlc3RvciwgZGV0YWlsTGV2ZWwsIHByb2dyZXNzTW9uaXRvciwgc2NvcGUpOworCX0KK30KK3Byb3RlY3RlZCBhYnN0cmFjdCBjaGFyW11bXSBnZXRQb3NzaWJsZVRhZ3MoKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JOYW1lQ29tYmluZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JOYW1lQ29tYmluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRmY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Pck5hbWVDb21iaW5lci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKKworcHVibGljIGNsYXNzIE9yTmFtZUNvbWJpbmVyIGltcGxlbWVudHMgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHsKKworCUlJbmRleFNlYXJjaFJlcXVlc3RvciB0YXJnZXRSZXF1ZXN0b3I7CisJSGFzaHRhYmxlT2ZPYmplY3QgYWNjZXB0ZWRBbnN3ZXJzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDUpOworCQkKK3B1YmxpYyBPck5hbWVDb21iaW5lcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgdGFyZ2V0UmVxdWVzdG9yKXsKKwl0aGlzLnRhcmdldFJlcXVlc3RvciA9IHRhcmdldFJlcXVlc3RvcjsKK30KK3B1YmxpYyB2b2lkIGFjY2VwdENsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXSBwYWNrYWdlTmFtZSl7CisKKwlpZiAoIXRoaXMuYWNjZXB0ZWRBbnN3ZXJzLmNvbnRhaW5zS2V5KENoYXJPcGVyYXRpb24uY29uY2F0KHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgJy4nKSkpeworCQl0aGlzLnRhcmdldFJlcXVlc3Rvci5hY2NlcHRDbGFzc0RlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgcGFja2FnZU5hbWUpOworCX0KK30KK3B1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHR5cGVOYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHt9CitwdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gdHlwZU5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkge30KK3B1YmxpYyB2b2lkIGFjY2VwdEZpZWxkRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIGZpZWxkTmFtZSkge30KK3B1YmxpYyB2b2lkIGFjY2VwdEZpZWxkUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBmaWVsZE5hbWUpIHt9CitwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7fQorcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIG1ldGhvZE5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkge30KK3B1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZFJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gbWV0aG9kTmFtZSwgaW50IHBhcmFtZXRlckNvdW50KSB7fQorcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcGFja2FnZU5hbWUpIHt9CitwdWJsaWMgdm9pZCBhY2NlcHRTdXBlclR5cGVSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lLCBjaGFyIGNsYXNzT3JJbnRlcmZhY2UsIGNoYXJbXSBzdXBlclF1YWxpZmljYXRpb24sIGNoYXJbXSBzdXBlclR5cGVOYW1lLCBjaGFyIHN1cGVyQ2xhc3NPckludGVyZmFjZSwgaW50IG1vZGlmaWVycyl7Cit9CitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSB0eXBlTmFtZSkge30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXRoQ29tYmluZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXRoQ29tYmluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWYxOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdGhDb21iaW5lci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKKworcHVibGljIGNsYXNzIE9yUGF0aENvbWJpbmVyIGltcGxlbWVudHMgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHsKKworCUlJbmRleFNlYXJjaFJlcXVlc3RvciB0YXJnZXRSZXF1ZXN0b3I7CisJSGFzaFNldCBhY2NlcHRlZEFuc3dlcnMgPSBuZXcgSGFzaFNldCg1KTsKK3B1YmxpYyBPclBhdGhDb21iaW5lcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgdGFyZ2V0UmVxdWVzdG9yKXsKKwl0aGlzLnRhcmdldFJlcXVlc3RvciA9IHRhcmdldFJlcXVlc3RvcjsKK30KK3B1YmxpYyB2b2lkIGFjY2VwdENsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXSBwYWNrYWdlTmFtZSl7CisKKwlpZiAodGhpcy5hY2NlcHRlZEFuc3dlcnMuYWRkKHJlc291cmNlUGF0aCkpeworCQl0aGlzLnRhcmdldFJlcXVlc3Rvci5hY2NlcHRDbGFzc0RlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgcGFja2FnZU5hbWUpOworCX0KK30KK3B1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHR5cGVOYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwlpZiAodGhpcy5hY2NlcHRlZEFuc3dlcnMuYWRkKHJlc291cmNlUGF0aCkpeworCQl0aGlzLnRhcmdldFJlcXVlc3Rvci5hY2NlcHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgdHlwZU5hbWUsIHBhcmFtZXRlckNvdW50KTsKKwl9CQkKK30KK3B1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSB0eXBlTmFtZSwgaW50IHBhcmFtZXRlckNvdW50KSB7CisJaWYgKHRoaXMuYWNjZXB0ZWRBbnN3ZXJzLmFkZChyZXNvdXJjZVBhdGgpKXsKKwkJdGhpcy50YXJnZXRSZXF1ZXN0b3IuYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UocmVzb3VyY2VQYXRoLCB0eXBlTmFtZSwgcGFyYW1ldGVyQ291bnQpOworCX0JCQkKK30KK3B1YmxpYyB2b2lkIGFjY2VwdEZpZWxkRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIGZpZWxkTmFtZSkgeworCWlmICh0aGlzLmFjY2VwdGVkQW5zd2Vycy5hZGQocmVzb3VyY2VQYXRoKSl7CisJCXRoaXMudGFyZ2V0UmVxdWVzdG9yLmFjY2VwdEZpZWxkRGVjbGFyYXRpb24ocmVzb3VyY2VQYXRoLCBmaWVsZE5hbWUpOworCX0JCit9CitwdWJsaWMgdm9pZCBhY2NlcHRGaWVsZFJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gZmllbGROYW1lKSB7CisJaWYgKHRoaXMuYWNjZXB0ZWRBbnN3ZXJzLmFkZChyZXNvdXJjZVBhdGgpKXsKKwkJdGhpcy50YXJnZXRSZXF1ZXN0b3IuYWNjZXB0RmllbGRSZWZlcmVuY2UocmVzb3VyY2VQYXRoLCBmaWVsZE5hbWUpOworCX0JCQorfQorcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIGNoYXJbXSBwYWNrYWdlTmFtZSkgeworCWlmICh0aGlzLmFjY2VwdGVkQW5zd2Vycy5hZGQocmVzb3VyY2VQYXRoKSl7CisJCXRoaXMudGFyZ2V0UmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZURlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgcGFja2FnZU5hbWUpOworCX0JCQorfQorcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIG1ldGhvZE5hbWUsIGludCBwYXJhbWV0ZXJDb3VudCkgeworCWlmICh0aGlzLmFjY2VwdGVkQW5zd2Vycy5hZGQocmVzb3VyY2VQYXRoKSl7CisJCXRoaXMudGFyZ2V0UmVxdWVzdG9yLmFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyQ291bnQpOworCX0JCQorfQorcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgcGFyYW1ldGVyQ291bnQpIHsKKwlpZiAodGhpcy5hY2NlcHRlZEFuc3dlcnMuYWRkKHJlc291cmNlUGF0aCkpeworCQl0aGlzLnRhcmdldFJlcXVlc3Rvci5hY2NlcHRNZXRob2RSZWZlcmVuY2UocmVzb3VyY2VQYXRoLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJDb3VudCk7CisJfQkJCQorfQorcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZVJlZmVyZW5jZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKKwlpZiAodGhpcy5hY2NlcHRlZEFuc3dlcnMuYWRkKHJlc291cmNlUGF0aCkpeworCQl0aGlzLnRhcmdldFJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlUmVmZXJlbmNlKHJlc291cmNlUGF0aCwgcGFja2FnZU5hbWUpOworCX0JCit9CitwdWJsaWMgdm9pZCBhY2NlcHRTdXBlclR5cGVSZWZlcmVuY2UoU3RyaW5nIHJlc291cmNlUGF0aCwgY2hhcltdIHF1YWxpZmljYXRpb24sIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lLCBjaGFyIGNsYXNzT3JJbnRlcmZhY2UsIGNoYXJbXSBzdXBlclF1YWxpZmljYXRpb24sIGNoYXJbXSBzdXBlclR5cGVOYW1lLCBjaGFyIHN1cGVyQ2xhc3NPckludGVyZmFjZSwgaW50IG1vZGlmaWVycyl7CisJaWYgKHRoaXMuYWNjZXB0ZWRBbnN3ZXJzLmFkZChyZXNvdXJjZVBhdGgpKXsKKwkJdGhpcy50YXJnZXRSZXF1ZXN0b3IuYWNjZXB0U3VwZXJUeXBlUmVmZXJlbmNlKHJlc291cmNlUGF0aCwgcXVhbGlmaWNhdGlvbiwgdHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lLCBjbGFzc09ySW50ZXJmYWNlLCBzdXBlclF1YWxpZmljYXRpb24sIHN1cGVyVHlwZU5hbWUsIHN1cGVyQ2xhc3NPckludGVyZmFjZSwgbW9kaWZpZXJzKTsKKwl9Cit9CitwdWJsaWMgdm9pZCBhY2NlcHRUeXBlUmVmZXJlbmNlKFN0cmluZyByZXNvdXJjZVBhdGgsIGNoYXJbXSB0eXBlTmFtZSkgeworCWlmICh0aGlzLmFjY2VwdGVkQW5zd2Vycy5hZGQocmVzb3VyY2VQYXRoKSl7CisJCXRoaXMudGFyZ2V0UmVxdWVzdG9yLmFjY2VwdFR5cGVSZWZlcmVuY2UocmVzb3VyY2VQYXRoLCB0eXBlTmFtZSk7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YzBjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5mb0NvbnN0YW50czsKKworcHVibGljIGNsYXNzIE9yUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4geworCisJcHVibGljIFNlYXJjaFBhdHRlcm4gbGVmdFBhdHRlcm47CisJcHVibGljIFNlYXJjaFBhdHRlcm4gcmlnaHRQYXR0ZXJuOworcHVibGljIE9yUGF0dGVybihTZWFyY2hQYXR0ZXJuIGxlZnRQYXR0ZXJuLCBTZWFyY2hQYXR0ZXJuIHJpZ2h0UGF0dGVybikgeworCXN1cGVyKC0xLCBmYWxzZSk7IC8vIHZhbHVlcyBpZ25vcmVkIGZvciBhIE9yUGF0dGVybgorCQkKKwl0aGlzLmxlZnRQYXR0ZXJuID0gbGVmdFBhdHRlcm47CisJdGhpcy5yaWdodFBhdHRlcm4gPSByaWdodFBhdHRlcm47CisKKwl0aGlzLm1hdGNoTW9kZSA9IE1hdGgubWluKGxlZnRQYXR0ZXJuLm1hdGNoTW9kZSwgcmlnaHRQYXR0ZXJuLm1hdGNoTW9kZSk7CisJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBsZWZ0UGF0dGVybi5pc0Nhc2VTZW5zaXRpdmUgfHwgcmlnaHRQYXR0ZXJuLmlzQ2FzZVNlbnNpdGl2ZTsKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IGxlZnRQYXR0ZXJuLm5lZWRzUmVzb2x2ZSB8fCByaWdodFBhdHRlcm4ubmVlZHNSZXNvbHZlOworfQorLyoqCisgKiBzZWUgU2VhcmNoUGF0dGVybi5kZWNvZGVkSW5kZXhFbnRyeQorICovCitwcm90ZWN0ZWQgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeSkgeworCisJLy8gd2lsbCBuZXZlciBiZSBkaXJlY3RseSBpbnZva2VkIG9uIGEgY29tcG9zaXRlIHBhdHRlcm4KK30KKy8qKgorICogc2VlIFNlYXJjaFBhdHRlcm4uZmVlZEluZGV4UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGZlZWRJbmRleFJlcXVlc3RvcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIGludFtdIHJlZmVyZW5jZXMsIEluZGV4SW5wdXQgaW5wdXQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpICB0aHJvd3MgSU9FeGNlcHRpb24geworCS8vIHdpbGwgbmV2ZXIgYmUgZGlyZWN0bHkgaW52b2tlZCBvbiBhIGNvbXBvc2l0ZSBwYXR0ZXJuCit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZpbmRNYXRjaGVzCisgKi8KK3B1YmxpYyB2b2lkIGZpbmRJbmRleE1hdGNoZXMoSW5kZXhJbnB1dCBpbnB1dCwgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCUlJbmRleFNlYXJjaFJlcXVlc3RvciBvckNvbWJpbmVyOworCWlmIChkZXRhaWxMZXZlbCA9PSBJSW5mb0NvbnN0YW50cy5OYW1lSW5mbykgeworCQlvckNvbWJpbmVyID0gbmV3IE9yTmFtZUNvbWJpbmVyKHJlcXVlc3Rvcik7CisJfSBlbHNlIHsKKwkJb3JDb21iaW5lciA9IG5ldyBPclBhdGhDb21iaW5lcihyZXF1ZXN0b3IpOworCX0KKwlsZWZ0UGF0dGVybi5maW5kSW5kZXhNYXRjaGVzKGlucHV0LCBvckNvbWJpbmVyLCBkZXRhaWxMZXZlbCwgcHJvZ3Jlc3NNb25pdG9yLCBzY29wZSk7CisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCXJpZ2h0UGF0dGVybi5maW5kSW5kZXhNYXRjaGVzKGlucHV0LCBvckNvbWJpbmVyLCBkZXRhaWxMZXZlbCwgcHJvZ3Jlc3NNb25pdG9yLCBzY29wZSk7Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmluZGV4RW50cnlQcmVmaXgKKyAqLworcHVibGljIGNoYXJbXSBpbmRleEVudHJ5UHJlZml4KCkgeworCisJLy8gd2lsbCBuZXZlciBiZSBkaXJlY3RseSBpbnZva2VkIG9uIGEgY29tcG9zaXRlIHBhdHRlcm4KKwlyZXR1cm4gbnVsbDsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoQ29udGFpbmVyKCkKKyAqLworcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKKwlyZXR1cm4gbGVmdFBhdHRlcm4ubWF0Y2hDb250YWluZXIoKQorCQkJfCByaWdodFBhdHRlcm4ubWF0Y2hDb250YWluZXIoKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXNCaW5hcnkKKyAqLworcHVibGljIGJvb2xlYW4gbWF0Y2hlc0JpbmFyeShPYmplY3QgYmluYXJ5SW5mbywgT2JqZWN0IGVuY2xvc2luZ0JpbmFyeUluZm8pIHsKKwlyZXR1cm4gdGhpcy5sZWZ0UGF0dGVybi5tYXRjaGVzQmluYXJ5KGJpbmFyeUluZm8sIGVuY2xvc2luZ0JpbmFyeUluZm8pIAorCQl8fCB0aGlzLnJpZ2h0UGF0dGVybi5tYXRjaGVzQmluYXJ5KGJpbmFyeUluZm8sIGVuY2xvc2luZ0JpbmFyeUluZm8pOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCXJldHVybiB0aGlzLmxlZnRQYXR0ZXJuLm1hdGNoSW5kZXhFbnRyeSgpCisJCQl8fCB0aGlzLnJpZ2h0UGF0dGVybi5tYXRjaEluZGV4RW50cnkoKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0UmVmZXJlbmNlCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWludCBsZWZ0TGV2ZWwgPSB0aGlzLmxlZnRQYXR0ZXJuLm1hdGNoTGV2ZWwocmVmZXJlbmNlLCB0cnVlKTsKKwlpZiAobGVmdExldmVsID09IEFDQ1VSQVRFX01BVENIIHx8IGxlZnRMZXZlbCA9PSBJTkFDQ1VSQVRFX01BVENIKSB7CisJCXRoaXMubGVmdFBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7CisJfSBlbHNlIHsKKwkJdGhpcy5yaWdodFBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7CisJfQorfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCXJldHVybiB0aGlzLmxlZnRQYXR0ZXJuLnRvU3RyaW5nKCkgKyAiXG58ICIgKyB0aGlzLnJpZ2h0UGF0dGVybi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCit9CisKKy8qKgorICogc2VlIFNlYXJjaFBhdHRlcm4uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoCisgKi8KK3B1YmxpYyB2b2lkIGluaXRpYWxpemVQb2x5bW9ycGhpY1NlYXJjaChNYXRjaExvY2F0b3IgbG9jYXRvciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKworCXRoaXMubGVmdFBhdHRlcm4uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKGxvY2F0b3IsIHByb2dyZXNzTW9uaXRvcik7CisJdGhpcy5yaWdodFBhdHRlcm4uaW5pdGlhbGl6ZVBvbHltb3JwaGljU2VhcmNoKGxvY2F0b3IsIHByb2dyZXNzTW9uaXRvcik7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7CisJc3dpdGNoICh0aGlzLmxlZnRQYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgcmVzb2x2ZSkpIHsKKwkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJcmV0dXJuIHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgcmVzb2x2ZSk7CisJCWNhc2UgUE9TU0lCTEVfTUFUQ0g6CisJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCWNhc2UgSU5BQ0NVUkFURV9NQVRDSDoKKwkJCWludCByaWdodExldmVsID0gdGhpcy5yaWdodFBhdHRlcm4ubWF0Y2hMZXZlbChub2RlLCByZXNvbHZlKTsKKwkJCWlmIChyaWdodExldmVsICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQlyZXR1cm4gcmlnaHRMZXZlbDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQl9CisJCWNhc2UgQUNDVVJBVEVfTUFUQ0g6CisJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwl9Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQmluZGluZykKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEJpbmRpbmcgYmluZGluZykgeworCXN3aXRjaCAodGhpcy5sZWZ0UGF0dGVybi5tYXRjaExldmVsKGJpbmRpbmcpKSB7CisJCWNhc2UgSU1QT1NTSUJMRV9NQVRDSDoKKwkJCXJldHVybiB0aGlzLnJpZ2h0UGF0dGVybi5tYXRjaExldmVsKGJpbmRpbmcpOworCQljYXNlIFBPU1NJQkxFX01BVENIOgorCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQljYXNlIElOQUNDVVJBVEVfTUFUQ0g6CisJCQlpbnQgcmlnaHRMZXZlbCA9IHRoaXMucmlnaHRQYXR0ZXJuLm1hdGNoTGV2ZWwoYmluZGluZyk7CisJCQlpZiAocmlnaHRMZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7CisJCQkJcmV0dXJuIHJpZ2h0TGV2ZWw7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCQkJfQorCQljYXNlIEFDQ1VSQVRFX01BVENIOgorCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTcxMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CisKK3B1YmxpYyBjbGFzcyBQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybiB7CisJY2hhcltdIHBrZ05hbWU7CitwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybihjaGFyW10gcGtnTmFtZSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKwlzdXBlcihtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CisJdGhpcy5wa2dOYW1lID0gcGtnTmFtZTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI2RlY29kZUluZGV4RW50cnkKKyAqLworcHJvdGVjdGVkIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpIHsKKwkvLyBub3QgdXNlZAorfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jZmVlZEluZGV4UmVxdWVzdG9yCisgKi8KK3B1YmxpYyB2b2lkIGZlZWRJbmRleFJlcXVlc3RvcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIGludFtdIHJlZmVyZW5jZXMsIEluZGV4SW5wdXQgaW5wdXQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwkvLyBub3QgdXNlZAorfQorLyoqCisgKiBzZWUgU2VhcmNoUGF0dGVybiNmaW5kTWF0Y2hlcworICovCitwdWJsaWMgdm9pZCBmaW5kSW5kZXhNYXRjaGVzKEluZGV4SW5wdXQgaW5wdXQsIElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBkZXRhaWxMZXZlbCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJLy8gcGFja2FnZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBpbmRleGVkCit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNpbmRleEVudHJ5UHJlZml4CisgKi8KK3B1YmxpYyBjaGFyW10gaW5kZXhFbnRyeVByZWZpeCgpIHsKKwkvLyBub3QgdXNlZAorCXJldHVybiBudWxsOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hDb250YWluZXIKKyAqLworcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKKwkvLyB1c2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBPclBhdHRlcm4KKwlyZXR1cm4gMDsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7CisJLy8gdXNlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgT3JQYXR0ZXJuCisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOworCWJ1ZmZlci5hcHBlbmQoIlBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm46IDwiKTsgLy8kTk9OLU5MUy0xJAorCWlmICh0aGlzLnBrZ05hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZCh0aGlzLnBrZ05hbWUpOworCWJ1ZmZlci5hcHBlbmQoIj4sICIpOyAvLyROT04tTkxTLTEkCisJc3dpdGNoKG1hdGNoTW9kZSl7CisJCWNhc2UgRVhBQ1RfTUFUQ0ggOiAKKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7CisJLy8gdXNlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgT3JQYXR0ZXJuCisJcmV0dXJuIEFDQ1VSQVRFX01BVENIOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWFhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSw0NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkltcG9ydEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkFic3RyYWN0SW5kZXhlcjsKKworcHVibGljIGNsYXNzIFBhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgQW5kUGF0dGVybiB7CisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gVEFHUyA9IHsgUkVGIH07CisJcHJpdmF0ZSBjaGFyW10gcGtnTmFtZTsKKworCXByaXZhdGUgY2hhcltdW10gc2VnbWVudHM7CisJcHJpdmF0ZSBpbnQgY3VycmVudFNlZ21lbnQ7CisJcHJpdmF0ZSBjaGFyW10gZGVjb2RlZFNlZ21lbnQ7CisJCitwdWJsaWMgUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4oY2hhcltdIHBrZ05hbWUsIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCXRoaXMucGtnTmFtZSA9IHBrZ05hbWU7CisJY2hhcltdW10gc3BsaXR0ZWROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcGtnTmFtZSk7CisJdGhpcy5zZWdtZW50cyA9IHNwbGl0dGVkTmFtZSA9PSBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXIgPyBuZXcgY2hhcltdW117IHBrZ05hbWUgfSA6IHNwbGl0dGVkTmFtZTsKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHBrZ05hbWUgIT0gbnVsbDsKK30KKy8qKgorICogcmVmL25hbWUgKHdoZXJlIG5hbWUgaXMgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcGFja2FnZSBuYW1lKQorICovIAorcHVibGljIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpeworCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNpemUgPSB3b3JkLmxlbmd0aDsKKwlpbnQgdGFnTGVuZ3RoID0gUkVGLmxlbmd0aDsKKwlpbnQgbmFtZUxlbmd0aCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIHdvcmQsIHRhZ0xlbmd0aCk7CisJaWYgKG5hbWVMZW5ndGggPCAwKSBuYW1lTGVuZ3RoID0gc2l6ZTsKKwl0aGlzLmRlY29kZWRTZWdtZW50ID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCB0YWdMZW5ndGgsIG5hbWVMZW5ndGgpOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jZmVlZEluZGV4UmVxdWVzdG9yKElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBkZXRhaWxMZXZlbCwgaW50W10gcmVmZXJlbmNlcywgSW5kZXhJbnB1dCBpbnB1dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkKKyAqLworcHVibGljIHZvaWQgZmVlZEluZGV4UmVxdWVzdG9yKElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBkZXRhaWxMZXZlbCwgaW50W10gcmVmZXJlbmNlcywgSW5kZXhJbnB1dCBpbnB1dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlpbnQgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsKKwkJaWYgKHJlZmVyZW5jZSAhPSAtMSkgeyAvLyBpZiB0aGUgcmVmZXJlbmNlIGhhcyBub3QgYmVlbiBlbGltaW5hdGVkCisJCQlJbmRleGVkRmlsZSBmaWxlID0gaW5wdXQuZ2V0SW5kZXhlZEZpbGUocmVmZXJlbmNlKTsKKwkJCVN0cmluZyBwYXRoOworCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBzY29wZS5lbmNsb3NlcyhwYXRoID0gSW5kZXhlZEZpbGUuY29udmVydFBhdGgoZmlsZS5nZXRQYXRoKCkpKSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlUmVmZXJlbmNlKHBhdGgsIHRoaXMucGtnTmFtZSk7CisJCQl9CisJCX0KKwl9Cit9Citwcm90ZWN0ZWQgY2hhcltdW10gZ2V0UG9zc2libGVUYWdzKCkgeworCXJldHVybiBUQUdTOworfQorLyoqCisgKiBAc2VlIEFuZFBhdHRlcm4jaGFzTmV4dFF1ZXJ5KCkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dFF1ZXJ5KCkgeworCWlmICh0aGlzLnNlZ21lbnRzLmxlbmd0aCA+IDIpIHsKKwkJLy8gaWYgcGFja2FnZSBoYXMgbW9yZSB0aGFuIDIgc2VnbWVudHMsIGRvbid0IGxvb2sgYXQgdGhlIGZpcnN0IDIgc2luY2UgdGhleSBhcmUgbW9zdGx5CisJCS8vIHJlZHVuZGFudCAoZWcuIGluICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJyAnb3JnLmVjbGlwc2UnIGlzIHVzZWQgYWxsIHRoZSB0aW1lKQorCQlyZXR1cm4gLS10aGlzLmN1cnJlbnRTZWdtZW50ID49IDI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0tdGhpcy5jdXJyZW50U2VnbWVudCA+PSAwOworCX0KK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI2luZGV4RW50cnlQcmVmaXgoKQorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKSB7CisJcmV0dXJuIEFic3RyYWN0SW5kZXhlci5iZXN0UmVmZXJlbmNlUHJlZml4KAorCQlSRUYsCisJCXRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF0sCisJCW1hdGNoTW9kZSwKKwkJaXNDYXNlU2Vuc2l0aXZlKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoQ29udGFpbmVyKCkKKyAqLworcHJvdGVjdGVkIGludCBtYXRjaENvbnRhaW5lcigpIHsKKwlyZXR1cm4gQ09NUElMQVRJT05fVU5JVCB8IENMQVNTIHwgTUVUSE9EIHwgRklFTEQ7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gdG9rZW5zLgorICovCitwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW11bXSB0b2tlbnMpIHsKKwljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJyk7CisJcmV0dXJuIHRoaXMubWF0Y2hlc05hbWUodGhpcy5wa2dOYW1lLCBuYW1lKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeSgpCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF0sIHRoaXMuZGVjb2RlZFNlZ21lbnQsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF0sIHRoaXMuZGVjb2RlZFNlZ21lbnQsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJaWYgKCFDaGFyT3BlcmF0aW9uLm1hdGNoKHRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF0sIHRoaXMuZGVjb2RlZFNlZ21lbnQsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaFJlcG9ydFJlZmVyZW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWNoYXJbXVtdIHRva2VucyA9IG51bGw7CisJaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgeworCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmID0gKEltcG9ydFJlZmVyZW5jZSlyZWZlcmVuY2U7CisJCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsKKwkJCXRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gaW1wb3J0UmVmLnRva2Vucy5sZW5ndGggLSAxOworCQkJdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJU3lzdGVtLmFycmF5Y29weShpbXBvcnRSZWYudG9rZW5zLCAwLCB0b2tlbnMsIDAsIGxlbmd0aCk7CisJCX0KKwl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKXJlZmVyZW5jZTsKKwkJQmluZGluZyBiaW5kaW5nID0gcU5hbWVSZWYuYmluZGluZzsKKwkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOworCQlzd2l0Y2ggKHFOYW1lUmVmLmJpdHMgJiBBc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCWNhc2UgQmluZGluZ0lkcy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJCXR5cGVCaW5kaW5nID0gcU5hbWVSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJCWJyZWFrOworCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KKwkJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOworCQkJCWJyZWFrOworCQkJY2FzZSBCaW5kaW5nSWRzLlZBUklBQkxFIDogLy89PT09PT09PT09PT11bmJvdW5kIGNhc2VzPT09PT09PT09PT0KKwkJCWNhc2UgQmluZGluZ0lkcy5UWVBFIHwgQmluZGluZ0lkcy5WQVJJQUJMRSA6CQkJCQkJCisJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZykgeworCQkJCQlQcm9ibGVtQmluZGluZyBwYkJpbmRpbmcgPSAoUHJvYmxlbUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCXR5cGVCaW5kaW5nID0gcGJCaW5kaW5nLnNlYXJjaFR5cGU7IC8vIHNlY29uZCBjaGFuY2Ugd2l0aCByZWNvcmRlZCB0eXBlIHNvIGZhcgorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlQYWNrYWdlQmluZGluZyBwa2dCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVCaW5kaW5nKS5mUGFja2FnZTsKKwkJCWlmIChwa2dCaW5kaW5nICE9IG51bGwpIHsKKwkJCQl0b2tlbnMgPSBwa2dCaW5kaW5nLmNvbXBvdW5kTmFtZTsKKwkJCX0KKwkJfSAKKwkJaWYgKHRva2VucyA9PSBudWxsKSB7CisJCQl0b2tlbnMgPSBxTmFtZVJlZi50b2tlbnM7CisJCX0KKwl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxVHlwZVJlZiA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXJlZmVyZW5jZTsKKwkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBxVHlwZVJlZi5iaW5kaW5nOworCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHsKKwkJCXR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOworCQl9CisJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCVBhY2thZ2VCaW5kaW5nIHBrZ0JpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmZQYWNrYWdlOworCQkJaWYgKHBrZ0JpbmRpbmcgIT0gbnVsbCkgeworCQkJCXRva2VucyA9IHBrZ0JpbmRpbmcuY29tcG91bmROYW1lOworCQkJfQorCQl9IAorCQlpZiAodG9rZW5zID09IG51bGwpIHsKKwkJCXRva2VucyA9IHFUeXBlUmVmLnRva2VuczsKKwkJfQorCX0KKwlpZiAodG9rZW5zID09IG51bGwpIHRva2VucyA9IE5PX0NIQVJfQ0hBUjsKKwlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCwgdG9rZW5zLCBlbGVtZW50LCBhY2N1cmFjeSk7Cit9CisvKioKKyAqIEBzZWUgQW5kUGF0dGVybiNyZXNldFF1ZXJ5KCkKKyAqLworcHJvdGVjdGVkIHZvaWQgcmVzZXRRdWVyeSgpIHsKKwkvKiB3YWxrIHRoZSBzZWdtZW50cyBmcm9tIGVuZCB0byBzdGFydCBhcyBpdCB3aWxsIGZpbmQgbGVzcyBwb3RlbnRpYWwgcmVmZXJlbmNlcyB1c2luZyAnbGFuZycgdGhhbiAnamF2YScgKi8KKwl0aGlzLmN1cnJlbnRTZWdtZW50ID0gdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsKKwlidWZmZXIuYXBwZW5kKCJQYWNrYWdlUmVmZXJlbmNlUGF0dGVybjogPCIpOyAvLyROT04tTkxTLTEkCisJaWYgKHRoaXMucGtnTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHRoaXMucGtnTmFtZSk7CisJYnVmZmVyLmFwcGVuZCgiPiwgIik7IC8vJE5PTi1OTFMtMSQKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6IAorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJfQorCWlmIChpc0Nhc2VTZW5zaXRpdmUpCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoSW1wb3J0UmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOworCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlub2RlLCByZXNvbHZlKTsKKwl9CisJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSByZWZlcmVuY2UgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBpbXBvcnQgcmVmZXJlbmNlLgorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4KKyAqLworcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSB7CisJCWlmICh0aGlzLm1hdGNoZXMoaW1wb3J0UmVmLnRva2VucykpIHsKKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQl9CisJfSBlbHNlIHsKKwkJY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGltcG9ydFJlZi50b2tlbnMsICcuJyk7CisJCXN3aXRjaCAodGhpcy5tYXRjaE1vZGUpIHsKKwkJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLnBrZ05hbWUsIHF1YWxpZmllZFR5cGVOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJCX0gCisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHRoaXMucGtnTmFtZSwgcXVhbGlmaWVkVHlwZU5hbWUsIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYWNrYWdlIHJlZmVyZW5jZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZS4KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuCisgKi8KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxTmFtZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7CisJaWYgKCFyZXNvbHZlKSB7CisJCWlmICh0aGlzLnBrZ05hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAodGhpcy5tYXRjaE1vZGUpIHsKKwkJCQljYXNlIEVYQUNUX01BVENIOgorCQkJCWNhc2UgUFJFRklYX01BVENIOgorCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5wa2dOYW1lLCBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocU5hbWVSZWYudG9rZW5zLCAnLicpLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQkJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJfQorCQkJCWNhc2UgUEFUVEVSTl9NQVRDSDoKKwkJCQkJY2hhcltdIHBhdHRlcm4gPSB0aGlzLnBrZ05hbWVbdGhpcy5wa2dOYW1lLmxlbmd0aC0xXSA9PSAnKicgPyB0aGlzLnBrZ05hbWUgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLnBrZ05hbWUsICIuKiIudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybiwgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHFOYW1lUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCUJpbmRpbmcgYmluZGluZyA9IHFOYW1lUmVmLmJpbmRpbmc7CisJCWlmIChiaW5kaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCQl9IGVsc2UgeworCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOworCQkJY2hhcltdW10gdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOworCQkJaW50IGxhc3RJbmRleCA9IHRva2Vucy5sZW5ndGgtMTsKKwkJCXN3aXRjaCAocU5hbWVSZWYuYml0cyAmIEFzdE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJCWNhc2UgQmluZGluZ0lkcy5GSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJCQl0eXBlQmluZGluZyA9IHFOYW1lUmVmLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCQkJLy8gbm8gdmFsaWQgbWF0Y2ggYW1vbmdzdCBmaWVsZHMKKwkJCQkJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsJCQkKKwkJCQkJbGFzdEluZGV4IC09IG90aGVyQmluZGluZ3NDb3VudCArIDE7CisJCQkJCWlmIChsYXN0SW5kZXggPCAwKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nSWRzLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOyAvLyBubyBwYWNrYWdlIG1hdGNoIGluIGl0CisJCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KKwkJCQkJdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKwkJCQkJYnJlYWs7CisJCQkJLyoKKwkJCQkgKiBIYW5kbGluZyBvZiB1bmJvdW5kIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZXMuIFRoZSBtYXRjaCBtYXkgcmVzaWRlIGluIHRoZSByZXNvbHZlZCBmcmFnbWVudCwKKwkJCQkgKiB3aGljaCBpcyByZWNvcmRlZCBpbnNpZGUgdGhlIHByb2JsZW0gYmluZGluZywgYWxvbmcgd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZSB1bnRpbCBpdCBiZWNhbWUgYSBwcm9ibGVtLgorCQkJCSAqLworCQkJCWNhc2UgQmluZGluZ0lkcy5WQVJJQUJMRSA6IC8vPT09PT09PT09PT09dW5ib3VuZCBjYXNlcz09PT09PT09PT09CisJCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgfCBCaW5kaW5nSWRzLlZBUklBQkxFIDoJCQkJCQkKKwkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZykgeworCQkJCQkJUHJvYmxlbUJpbmRpbmcgcGJCaW5kaW5nID0gKFByb2JsZW1CaW5kaW5nKSBiaW5kaW5nOworCQkJCQkJdHlwZUJpbmRpbmcgPSBwYkJpbmRpbmcuc2VhcmNoVHlwZTsgLy8gc2Vjb25kIGNoYW5jZSB3aXRoIHJlY29yZGVkIHR5cGUgc28gZmFyCisJCQkJCQljaGFyW10gcGFydGlhbFF1YWxpZmllZE5hbWUgPSBwYkJpbmRpbmcubmFtZTsKKwkJCQkJCWxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcuJywgcGFydGlhbFF1YWxpZmllZE5hbWUpIC0gMTsgLy8gaW5kZXggb2YgbGFzdCBib3VuZCB0b2tlbiBpcyBvbmUgYmVmb3JlIHRoZSBwYiB0b2tlbgorCQkJCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgbGFzdEluZGV4IDwgMCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQkJCX0KKwkJCQkJYnJlYWs7CQkJCQkKKwkJCX0KKwkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgeworCQkJCXR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOworCQkJfQorCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCQlQYWNrYWdlQmluZGluZyBwa2dCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVCaW5kaW5nKS5mUGFja2FnZTsKKwkJCQkJaWYgKHBrZ0JpbmRpbmcgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQkJCX0gZWxzZSBpZiAodGhpcy5tYXRjaGVzKHBrZ0JpbmRpbmcuY29tcG91bmROYW1lKSkgeworCQkJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSByZWZlcmVuY2UgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiB0eXBlIHJlZmVyZW5jZS4KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuCisgKi8KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB0eXBlUmVmLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoIXJlc29sdmUpIHsKKwkJaWYgKHRoaXMucGtnTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQl9IGVsc2UgeworCQkJc3dpdGNoICh0aGlzLm1hdGNoTW9kZSkgeworCQkJCWNhc2UgRVhBQ1RfTUFUQ0g6CisJCQkJY2FzZSBQUkVGSVhfTUFUQ0g6CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0aGlzLnBrZ05hbWUsIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJCX0KKwkJCQljYXNlIFBBVFRFUk5fTUFUQ0g6CisJCQkJCWNoYXJbXSBwYXR0ZXJuID0gdGhpcy5wa2dOYW1lW3RoaXMucGtnTmFtZS5sZW5ndGgtMV0gPT0gJyonID8gdGhpcy5wa2dOYW1lIDogQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5wa2dOYW1lLCAiLioiLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm4sIENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0eXBlUmVmLnRva2VucywgJy4nKSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwodHlwZVJlZi5iaW5kaW5nKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaFJlcG9ydEltcG9ydFJlZihJbXBvcnRSZWZlcmVuY2UsIEJpbmRpbmcsIElKYXZhRWxlbWVudCwgaW50LCBNYXRjaExvY2F0b3IpCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0SW1wb3J0UmVmKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYsIEJpbmRpbmcgYmluZGluZywgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCXRoaXMubWF0Y2hSZXBvcnRSZWZlcmVuY2UoaW1wb3J0UmVmLCBlbGVtZW50LCBhY2N1cmFjeSwgbG9jYXRvcik7CisJfSBlbHNlIHsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBJbXBvcnRCaW5kaW5nKSB7CisJCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKGltcG9ydFJlZi5zb3VyY2VTdGFydCwgaW1wb3J0UmVmLnNvdXJjZUVuZCwgaW1wb3J0UmVmLnRva2VucywgZWxlbWVudCwgYWNjdXJhY3kpOworCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlQYWNrYWdlQmluZGluZyBwa2dCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLmZQYWNrYWdlOworCQkJaWYgKHBrZ0JpbmRpbmcgIT0gbnVsbCkgeworCQkJCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVSZWZlcmVuY2UoaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LCBpbXBvcnRSZWYuc291cmNlRW5kLCBwa2dCaW5kaW5nLmNvbXBvdW5kTmFtZSwgZWxlbWVudCwgYWNjdXJhY3kpOworCQkJfSBlbHNlIHsKKwkJCQlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKGltcG9ydFJlZi5zb3VyY2VTdGFydCwgaW1wb3J0UmVmLnNvdXJjZUVuZCwgaW1wb3J0UmVmLnRva2VucywgZWxlbWVudCwgYWNjdXJhY3kpOworCQkJfQorCQl9IAorCX0KK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBJbXBvcnRCaW5kaW5nKSB7CisJCWlmICh0aGlzLm1hdGNoZXMoKChJbXBvcnRCaW5kaW5nKWJpbmRpbmcpLmNvbXBvdW5kTmFtZSkpIHsKKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQl9CisJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsKKwkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKwkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgdHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgeworCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHsKKwkJCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKXR5cGVCaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZTsKKwkJCX0KKwkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQl9IGVsc2UgaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCVBhY2thZ2VCaW5kaW5nIHBrZ0JpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmZQYWNrYWdlOworCQkJCWlmICh0aGlzLm1hdGNoZXMocGtnQmluZGluZy5jb21wb3VuZE5hbWUpKSB7CisJCQkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9RdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1F1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI0NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9RdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBRdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uUGF0dGVybiB7CisJCisJcHJpdmF0ZSBjaGFyW10gcXVhbGlmaWNhdGlvbjsKKwlwcml2YXRlIGNoYXJbXSBkZWNvZGVkUXVhbGlmaWNhdGlvbjsKKwkKK3B1YmxpYyBRdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuKAorCWNoYXJbXSBxdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBzaW1wbGVOYW1lLAorCWNoYXIgY2xhc3NPckludGVyZmFjZSwKKwlpbnQgbWF0Y2hNb2RlLCAKKwlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCQkKKwlzdXBlcihtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CisKKwl0aGlzLnF1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUgPyBxdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShxdWFsaWZpY2F0aW9uKTsKKwl0aGlzLnNpbXBsZU5hbWUgPSBpc0Nhc2VTZW5zaXRpdmUgPyBzaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzaW1wbGVOYW1lKTsKKwl0aGlzLmNsYXNzT3JJbnRlcmZhY2UgPSBjbGFzc09ySW50ZXJmYWNlOworCQorCXRoaXMubmVlZHNSZXNvbHZlID0gcXVhbGlmaWNhdGlvbiAhPSBudWxsOworfQorCitwdWJsaWMgdm9pZCBkZWNvZGVJbmRleEVudHJ5KElFbnRyeVJlc3VsdCBlbnRyeVJlc3VsdCl7CisJCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNpemUgPSB3b3JkLmxlbmd0aDsKKworCXRoaXMuZGVjb2RlZENsYXNzT3JJbnRlcmZhY2UgPSB3b3JkW1RZUEVfREVDTF9MRU5HVEhdOworCWludCBvbGRTbGFzaCA9IFRZUEVfREVDTF9MRU5HVEgrMTsKKwlpbnQgc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCBvbGRTbGFzaCsxKTsKKwljaGFyW10gcGtnTmFtZTsKKwlpZiAoc2xhc2ggPT0gb2xkU2xhc2grMSl7IAorCQlwa2dOYW1lID0gTk9fQ0hBUjsKKwl9IGVsc2UgeworCQlwa2dOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBvbGRTbGFzaCsxLCBzbGFzaCk7CisJfQorCXRoaXMuZGVjb2RlZFNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHNsYXNoKzEsIHNsYXNoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNFUEFSQVRPUiwgd29yZCwgc2xhc2grMSkpOworCisJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzOworCWlmIChzbGFzaCsxIDwgc2l6ZSl7CisJCWlmIChzbGFzaCszID09IHNpemUgJiYgd29yZFtzbGFzaCsxXSA9PSBPTkVfWkVST1swXSkgeworCQkJZW5jbG9zaW5nVHlwZU5hbWVzID0gT05FX1pFUk9fQ0hBUjsKKwkJfSBlbHNlIHsKKwkJCWVuY2xvc2luZ1R5cGVOYW1lcyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLycsIENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgc2xhc2grMSwgc2l6ZS0xKSk7CisJCX0KKwl9IGVsc2UgeworCQllbmNsb3NpbmdUeXBlTmFtZXMgPSBOT19DSEFSX0NIQVI7CisJfQorCXRoaXMuZGVjb2RlZFF1YWxpZmljYXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGtnTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCAnLicpOworfQorCisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoZXNCaW5hcnkoT2JqZWN0LCBPYmplY3QpCisgKi8KK3B1YmxpYyBib29sZWFuIG1hdGNoZXNCaW5hcnkoT2JqZWN0IGJpbmFyeUluZm8sIE9iamVjdCBlbmNsb3NpbmdCaW5hcnlJbmZvKSB7CisJaWYgKCEoYmluYXJ5SW5mbyBpbnN0YW5jZW9mIElCaW5hcnlUeXBlKSkgcmV0dXJuIGZhbHNlOworCisJSUJpbmFyeVR5cGUgdHlwZSA9IChJQmluYXJ5VHlwZSliaW5hcnlJbmZvOworCisJLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUKKwljaGFyW10gdHlwZU5hbWUgPSAoY2hhcltdKXR5cGUuZ2V0TmFtZSgpLmNsb25lKCk7CisJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHR5cGVOYW1lLCAnLycsICcuJyk7CisJaWYgKCF0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCB0eXBlTmFtZSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIGNsYXNzIG9yIGludGVyZmFjZQorCXN3aXRjaCAodGhpcy5jbGFzc09ySW50ZXJmYWNlKSB7CisJCWNhc2UgQ0xBU1NfU1VGRklYOgorCQkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSBJTlRFUkZBQ0VfU1VGRklYOgorCQkJaWYgKCF0eXBlLmlzSW50ZXJmYWNlKCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJYnJlYWs7CisJfQorCQorCXJldHVybiB0cnVlOworfQorLyoqCisgKiBzZWUgU2VhcmNoUGF0dGVybi5tYXRjaEluZGV4RW50cnkKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCl7CisKKwkvKiBjaGVjayBjbGFzcy9pbnRlcmZhY2UgbmF0dXJlICovCisJc3dpdGNoKGNsYXNzT3JJbnRlcmZhY2UpeworCQljYXNlIENMQVNTX1NVRkZJWCA6CisJCWNhc2UgSU5URVJGQUNFX1NVRkZJWCA6CisJCQlpZiAoY2xhc3NPckludGVyZmFjZSAhPSBkZWNvZGVkQ2xhc3NPckludGVyZmFjZSkgcmV0dXJuIGZhbHNlOworCQlkZWZhdWx0IDoKKwl9CisJLyogY2hlY2sgcXVhbGlmaWNhdGlvbiAqLworCWlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwpIHsKKwkJc3dpdGNoKG1hdGNoTW9kZSl7CisJCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHF1YWxpZmljYXRpb24sIGRlY29kZWRRdWFsaWZpY2F0aW9uLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHF1YWxpZmljYXRpb24sIGRlY29kZWRRdWFsaWZpY2F0aW9uLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLm1hdGNoKHF1YWxpZmljYXRpb24sIGRlY29kZWRRdWFsaWZpY2F0aW9uLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJfQorCX0KKwkvKiBjaGVjayBzaW1wbGUgbmFtZSBtYXRjaGVzICovCisJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCl7CisJCXN3aXRjaChtYXRjaE1vZGUpeworCQkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaChzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcpCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCVR5cGVCaW5kaW5nIHR5cGUgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKworCS8vIGNsYXNzIG9yIGludGVyZmFjZQorCXN3aXRjaCAodGhpcy5jbGFzc09ySW50ZXJmYWNlKSB7CisJCWNhc2UgQ0xBU1NfU1VGRklYOgorCQkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCWJyZWFrOworCQljYXNlIElOVEVSRkFDRV9TVUZGSVg6CisJCQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCWJyZWFrOworCX0KKworCS8vIGZ1bGx5IHF1YWxpZmllZCBuYW1lCisJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGUpOworfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwKTsKKwlzd2l0Y2ggKGNsYXNzT3JJbnRlcmZhY2UpeworCQljYXNlIENMQVNTX1NVRkZJWCA6CisJCQlidWZmZXIuYXBwZW5kKCJDbGFzc0RlY2xhcmF0aW9uUGF0dGVybjogcXVhbGlmaWNhdGlvbjwiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgSU5URVJGQUNFX1NVRkZJWCA6CisJCQlidWZmZXIuYXBwZW5kKCJJbnRlcmZhY2VEZWNsYXJhdGlvblBhdHRlcm46IHF1YWxpZmljYXRpb248Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWJ1ZmZlci5hcHBlbmQoIlR5cGVEZWNsYXJhdGlvblBhdHRlcm46IHF1YWxpZmljYXRpb248Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQodGhpcy5xdWFsaWZpY2F0aW9uKTsKKwlidWZmZXIuYXBwZW5kKCI+LCB0eXBlPCIpOyAvLyROT04tTkxTLTEkCisJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChzaW1wbGVOYW1lKTsKKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDogCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwl9CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWFyY2hQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1NlYXJjaFBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU5N2NmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TZWFyY2hQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwxNTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSVNlYXJjaFBhdHRlcm47CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5CbG9ja3NJbmRleElucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JSW5kZXhDb25zdGFudHM7IAorCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGF0dGVybiBpbXBsZW1lbnRzIElTZWFyY2hQYXR0ZXJuLCBJSW5kZXhDb25zdGFudHMsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKKworCXByb3RlY3RlZCBpbnQgbWF0Y2hNb2RlOworCXByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1Jlc29sdmUgPSB0cnVlOworCisJLyogbWF0Y2ggbGV2ZWwgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPU1NJQkxFX01BVENIID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NTSUJMRV9NQVRDSCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDVVJBVEVfTUFUQ0ggPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQUNDVVJBVEVfTUFUQ0ggPSAzOworCisJLyogbWF0Y2ggY29udGFpbmVyICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUElMQVRJT05fVU5JVCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1MgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSA4OworCQorCisKK3B1YmxpYyBTZWFyY2hQYXR0ZXJuKGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJdGhpcy5tYXRjaE1vZGUgPSBtYXRjaE1vZGU7CisJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Cit9CisvKioKKyAqIENvbnN0cnVjdG9yIHBhdHRlcm4gYXJlIGZvcm1lZCBieSBbZGVjbGFyaW5nUXVhbGlmaWNhdGlvbi5ddHlwZVsocGFyYW1ldGVyVHlwZXMpXQorICogZS5nLiBqYXZhLmxhbmcuT2JqZWN0KCkKKyAqCQlNYWluKCopCisgKi8KK3ByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlQ29uc3RydWN0b3JQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlLCB0cnVlKTsgLy8gdG9rZW5pemUgd2hpdGUgc3BhY2VzCisJc2Nhbm5lci5zZXRTb3VyY2UocGF0dGVyblN0cmluZy50b0NoYXJBcnJheSgpKTsKKwlmaW5hbCBpbnQgSW5zaWRlTmFtZSA9IDE7CisJZmluYWwgaW50IEluc2lkZVBhcmFtZXRlciA9IDI7CisJCisJU3RyaW5nIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBudWxsLCB0eXBlTmFtZSA9IG51bGwsIHBhcmFtZXRlclR5cGUgPSBudWxsOworCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbnVsbDsKKwlpbnQgcGFyYW1ldGVyQ291bnQgPSAtMTsKKwlib29sZWFuIGZvdW5kQ2xvc2luZ1BhcmVudGhlc2lzID0gZmFsc2U7CisJaW50IG1vZGUgPSBJbnNpZGVOYW1lOworCWludCB0b2tlbjsKKwl0cnkgeworCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRil7CisJCXN3aXRjaChtb2RlKXsKKworCQkJLy8gcmVhZCBkZWNsYXJpbmcgdHlwZSBhbmQgc2VsZWN0b3IKKwkJCWNhc2UgSW5zaWRlTmFtZSA6CisJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgorCQkJCQkJaWYgKGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPT0gbnVsbCl7CisJCQkJCQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHJldHVybiBudWxsOworCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSB0eXBlTmFtZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJU3RyaW5nIHRva2VuU291cmNlID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICs9IHRva2VuU291cmNlICsgdHlwZU5hbWU7CisJCQkJCQl9CisJCQkJCQl0eXBlTmFtZSA9IG51bGw7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxQQVJFTjoKKwkJCQkJCXBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1s1XTsKKwkJCQkJCXBhcmFtZXRlckNvdW50ID0gMDsKKwkJCQkJCW1vZGUgPSBJbnNpZGVQYXJhbWV0ZXI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXI6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVNVUxUSVBMWToKKwkJCQkJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CisJCQkJCQkJdHlwZU5hbWUgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0eXBlTmFtZSArPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkvLyByZWFkIHBhcmFtZXRlciB0eXBlcworCQkJY2FzZSBJbnNpZGVQYXJhbWV0ZXIgOgorCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1BOgorCQkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyQ291bnQqMl0sIDAsIHBhcmFtZXRlckNvdW50KTsKKwkJCQkJCX0KKwkJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsKKwkJCQkJCXBhcmFtZXRlclR5cGUgPSBudWxsOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSUEFSRU46CisJCQkJCQlmb3VuZENsb3NpbmdQYXJlbnRoZXNpcyA9IHRydWU7CisJCQkJCQlpZiAocGFyYW1ldGVyVHlwZSAhPSBudWxsKXsKKwkJCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJUeXBlcywgMCwgcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckNvdW50KjJdLCAwLCBwYXJhbWV0ZXJDb3VudCk7CisJCQkJCQkJfQorCQkJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0tFVDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVieXRlOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY2hhcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWZsb2F0OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1laW50OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXNob3J0OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldm9pZDoKKwkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpeworCQkJCQkJCXBhcmFtZXRlclR5cGUgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwYXJhbWV0ZXJUeXBlICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQl0cnkgeworCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJLy8gcGFyZW50aGVzaXMgbWlzbWF0Y2gKKwlpZiAocGFyYW1ldGVyQ291bnQ+MCAmJiAhZm91bmRDbG9zaW5nUGFyZW50aGVzaXMpIHJldHVybiBudWxsOworCWlmICh0eXBlTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCWNoYXJbXSB0eXBlTmFtZUNoYXJzID0gdHlwZU5hbWUudG9DaGFyQXJyYXkoKTsKKwlpZiAodHlwZU5hbWVDaGFycy5sZW5ndGggPT0gMSAmJiB0eXBlTmFtZUNoYXJzWzBdID09ICcqJykgdHlwZU5hbWVDaGFycyA9IG51bGw7CisJCQorCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uQ2hhcnMgPSBudWxsOworCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwpIGRlY2xhcmluZ1F1YWxpZmljYXRpb25DaGFycyA9IGRlY2xhcmluZ1F1YWxpZmljYXRpb24udG9DaGFyQXJyYXkoKTsKKwljaGFyW11bXSBwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnMgPSBudWxsLCBwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXMgPSBudWxsOworCisJLy8gZXh0cmFjdCBwYXJhbWV0ZXIgdHlwZXMgaW5mb3MKKwlpZiAocGFyYW1ldGVyQ291bnQgPj0gMCl7CisJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucyA9IG5ldyBjaGFyW3BhcmFtZXRlckNvdW50XVtdOworCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXMgPSBuZXcgY2hhcltwYXJhbWV0ZXJDb3VudF1bXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgaSsrKXsKKwkJCWNoYXJbXSBwYXJhbWV0ZXJUeXBlUGFydCA9IHBhcmFtZXRlclR5cGVzW2ldLnRvQ2hhckFycmF5KCk7CisJCQlpbnQgbGFzdERvdFBvc2l0aW9uID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHBhcmFtZXRlclR5cGVQYXJ0KTsKKwkJCWlmIChsYXN0RG90UG9zaXRpb24gPj0gMCl7CisJCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zW2ldID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShwYXJhbWV0ZXJUeXBlUGFydCwgMCwgbGFzdERvdFBvc2l0aW9uKTsKKwkJCQlpZiAocGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zW2ldLmxlbmd0aCA9PSAxICYmIHBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXVswXSA9PSAnKicpIHsKKwkJCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zW2ldID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBwcmVmaXggd2l0aCBhICcqJyBhcyB0aGUgZnVsbCBxdWFsaWZpY2F0aW9uIGNvdWxkIGJlIGJpZ2dlciAKKwkJCQkJLy8gKGkuZS4gYmVjYXVzZSBvZiBhbiBpbXBvcnQpCisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXSA9IENoYXJPcGVyYXRpb24uY29uY2F0KE9ORV9TVEFSLCBwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnNbaV0pOworCQkJCX0KKwkJCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHBhcmFtZXRlclR5cGVQYXJ0LCBsYXN0RG90UG9zaXRpb24rMSwgcGFyYW1ldGVyVHlwZVBhcnQubGVuZ3RoKTsKKwkJCX0gZWxzZSB7CisJCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zW2ldID0gbnVsbDsKKwkJCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXNbaV0gPSBwYXJhbWV0ZXJUeXBlUGFydDsKKwkJCX0KKwkJCWlmIChwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXNbaV0ubGVuZ3RoID09IDEgJiYgcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldWzBdID09ICcqJykgcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldID0gbnVsbDsKKwkJfQorCX0JCisJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gbnVsbDsKKwlzd2l0Y2ggKGxpbWl0VG8peworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuKAorCQkJCQl0eXBlTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbkNoYXJzLCAKKwkJCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zLCAKKwkJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBDb25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCXR5cGVOYW1lQ2hhcnMsIAorCQkJCQltYXRjaE1vZGUsIAorCQkJCQlpc0Nhc2VTZW5zaXRpdmUsIAorCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uQ2hhcnMsIAorCQkJCQlwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnMsIAorCQkJCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXMsCisJCQkJCW51bGwpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCW5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybigKKwkJCQkJdHlwZU5hbWVDaGFycywgCisJCQkJCW1hdGNoTW9kZSwgCisJCQkJCWlzQ2FzZVNlbnNpdGl2ZSwgCisJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb25DaGFycywgCisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucywgCisJCQkJCXBhcmFtZXRlclR5cGVTaW1wbGVOYW1lcyksCisJCQkJbmV3IENvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybigKKwkJCQkJdHlwZU5hbWVDaGFycywgCisJCQkJCW1hdGNoTW9kZSwgCisJCQkJCWlzQ2FzZVNlbnNpdGl2ZSwgCisJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb25DaGFycywgCisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucywgCisJCQkJCXBhcmFtZXRlclR5cGVTaW1wbGVOYW1lcywKKwkJCQkJbnVsbCkpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBzZWFyY2hQYXR0ZXJuOworCit9CisvKioKKyAqIEZpZWxkIHBhdHRlcm4gYXJlIGZvcm1lZCBieSBbZGVjbGFyaW5nVHlwZS5dbmFtZVt0eXBlXQorICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLnNlcmlhbFZlcnNpb25VSUQgbG9uZworICoJCWZpZWxkKgorICovCitwcml2YXRlIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZUZpZWxkUGF0dGVybihTdHJpbmcgcGF0dGVyblN0cmluZywgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgdHJ1ZSk7IC8vIHRva2VuaXplIHdoaXRlIHNwYWNlcworCXNjYW5uZXIuc2V0U291cmNlKHBhdHRlcm5TdHJpbmcudG9DaGFyQXJyYXkoKSk7CisJZmluYWwgaW50IEluc2lkZURlY2xhcmluZ1BhcnQgPSAxOworCWZpbmFsIGludCBJbnNpZGVUeXBlID0gMjsKKwlpbnQgbGFzdFRva2VuID0gLTE7CisJCisJU3RyaW5nIGRlY2xhcmluZ1R5cGUgPSBudWxsLCBmaWVsZE5hbWUgPSBudWxsOworCVN0cmluZyB0eXBlID0gbnVsbDsKKwlpbnQgbW9kZSA9IEluc2lkZURlY2xhcmluZ1BhcnQ7CisJaW50IHRva2VuOworCXRyeSB7CisJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJd2hpbGUgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKXsKKwkJc3dpdGNoKG1vZGUpeworCisJCQkvLyByZWFkIGRlY2xhcmluZyB0eXBlIGFuZCBmaWVsZE5hbWUKKwkJCWNhc2UgSW5zaWRlRGVjbGFyaW5nUGFydCA6CisJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgorCQkJCQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCl7CisJCQkJCQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQkJCQlkZWNsYXJpbmdUeXBlID0gZmllbGROYW1lOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTdHJpbmcgdG9rZW5Tb3VyY2UgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJCWRlY2xhcmluZ1R5cGUgKz0gdG9rZW5Tb3VyY2UgKyBmaWVsZE5hbWU7CisJCQkJCQl9CisJCQkJCQlmaWVsZE5hbWUgPSBudWxsOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJaWYgKCEoU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFID09IGxhc3RUb2tlbiAKKwkJCQkJCQl8fCBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVCA9PSBsYXN0VG9rZW4pKXsKKwkJCQkJCQltb2RlID0gSW5zaWRlVHlwZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSB7CisJCQkJCQkJZmllbGROYW1lID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZmllbGROYW1lICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCS8vIHJlYWQgdHlwZSAKKwkJCWNhc2UgSW5zaWRlVHlwZToKKwkJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1Q6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTVVMVElQTFk6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0tFVDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VUOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYm9vbGVhbjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJ5dGU6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVjaGFyOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZG91YmxlOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZmxvYXQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbnQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVsb25nOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc2hvcnQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV2b2lkOgorCQkJCQkJaWYgKHR5cGUgPT0gbnVsbCl7CisJCQkJCQkJdHlwZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXR5cGUgKz0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCWxhc3RUb2tlbiA9IHRva2VuOworCQl0cnkgeworCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCWNoYXJbXSBmaWVsZE5hbWVDaGFycyA9IGZpZWxkTmFtZS50b0NoYXJBcnJheSgpOworCWlmIChmaWVsZE5hbWVDaGFycy5sZW5ndGggPT0gMSAmJiBmaWVsZE5hbWVDaGFyc1swXSA9PSAnKicpIGZpZWxkTmFtZUNoYXJzID0gbnVsbDsKKwkJCisJY2hhcltdIGRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uID0gbnVsbCwgZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUgPSBudWxsOworCWNoYXJbXSB0eXBlUXVhbGlmaWNhdGlvbiA9IG51bGwsIHR5cGVTaW1wbGVOYW1lID0gbnVsbDsKKworCS8vIGV4dHJhY3QgZGVjbGFyaW5nIHR5cGUgaW5mb3MKKwlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKXsKKwkJY2hhcltdIGRlY2xhcmluZ1R5cGVQYXJ0ID0gZGVjbGFyaW5nVHlwZS50b0NoYXJBcnJheSgpOworCQlpbnQgbGFzdERvdFBvc2l0aW9uID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIGRlY2xhcmluZ1R5cGVQYXJ0KTsKKwkJaWYgKGxhc3REb3RQb3NpdGlvbiA+PSAwKXsKKwkJCWRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShkZWNsYXJpbmdUeXBlUGFydCwgMCwgbGFzdERvdFBvc2l0aW9uKTsKKwkJCWlmIChkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbi5sZW5ndGggPT0gMSAmJiBkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvblswXSA9PSAnKicpIGRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uID0gbnVsbDsKKwkJCWRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShkZWNsYXJpbmdUeXBlUGFydCwgbGFzdERvdFBvc2l0aW9uKzEsIGRlY2xhcmluZ1R5cGVQYXJ0Lmxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiA9IG51bGw7CisJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSA9IGRlY2xhcmluZ1R5cGVQYXJ0OworCQl9CisJCWlmIChkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZS5sZW5ndGggPT0gMSAmJiBkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZVswXSA9PSAnKicpIGRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lID0gbnVsbDsKKwl9CisJLy8gZXh0cmFjdCB0eXBlIGluZm9zCisJaWYgKHR5cGUgIT0gbnVsbCl7CisJCWNoYXJbXSB0eXBlUGFydCA9IHR5cGUudG9DaGFyQXJyYXkoKTsKKwkJaW50IGxhc3REb3RQb3NpdGlvbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCB0eXBlUGFydCk7CisJCWlmIChsYXN0RG90UG9zaXRpb24gPj0gMCl7CisJCQl0eXBlUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZVBhcnQsIDAsIGxhc3REb3RQb3NpdGlvbik7CisJCQlpZiAodHlwZVF1YWxpZmljYXRpb24ubGVuZ3RoID09IDEgJiYgdHlwZVF1YWxpZmljYXRpb25bMF0gPT0gJyonKSB7CisJCQkJdHlwZVF1YWxpZmljYXRpb24gPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQkvLyBwcmVmaXggd2l0aCBhICcqJyBhcyB0aGUgZnVsbCBxdWFsaWZpY2F0aW9uIGNvdWxkIGJlIGJpZ2dlciAKKwkJCQkvLyAoaS5lLiBiZWNhdXNlIG9mIGFuIGltcG9ydCkKKwkJCQl0eXBlUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KE9ORV9TVEFSLCB0eXBlUXVhbGlmaWNhdGlvbik7CisJCQl9CisJCQl0eXBlU2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZVBhcnQsIGxhc3REb3RQb3NpdGlvbisxLCB0eXBlUGFydC5sZW5ndGgpOworCQl9IGVsc2UgeworCQkJdHlwZVF1YWxpZmljYXRpb24gPSBudWxsOworCQkJdHlwZVNpbXBsZU5hbWUgPSB0eXBlUGFydDsKKwkJfQorCQlpZiAodHlwZVNpbXBsZU5hbWUubGVuZ3RoID09IDEgJiYgdHlwZVNpbXBsZU5hbWVbMF0gPT0gJyonKSB0eXBlU2ltcGxlTmFtZSA9IG51bGw7CisJfQorCVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IG51bGw7CisJc3dpdGNoIChsaW1pdFRvKXsKKwkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBGaWVsZERlY2xhcmF0aW9uUGF0dGVybigKKwkJCQlmaWVsZE5hbWVDaGFycywgCisJCQkJbWF0Y2hNb2RlLCAKKwkJCQlpc0Nhc2VTZW5zaXRpdmUsIAorCQkJCWRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCXR5cGVTaW1wbGVOYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCWZpZWxkTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJdHlwZVNpbXBsZU5hbWUsCisJCQkJCXRydWUsIC8vIHJlYWQgYWNjZXNzCisJCQkJCXRydWUpOyAvLyB3cml0ZSBhY2Nlc3MKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFQURfQUNDRVNTRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCWZpZWxkTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJdHlwZVNpbXBsZU5hbWUsCisJCQkJCXRydWUsIC8vIHJlYWQgYWNjZXNzIG9ubHkKKwkJCQkJZmFsc2UpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV1JJVEVfQUNDRVNTRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCWZpZWxkTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJdHlwZVNpbXBsZU5hbWUsCisJCQkJCWZhbHNlLAorCQkJCQl0cnVlKTsgLy8gd3JpdGUgYWNjZXNzIG9ubHkKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6CisJCQlzZWFyY2hQYXR0ZXJuID0gbmV3IE9yUGF0dGVybigKKwkJCQluZXcgRmllbGREZWNsYXJhdGlvblBhdHRlcm4oCisJCQkJCWZpZWxkTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJdHlwZVNpbXBsZU5hbWUpLAorCQkJCW5ldyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCWZpZWxkTmFtZUNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJdHlwZVNpbXBsZU5hbWUsCisJCQkJCXRydWUsIC8vIHJlYWQgYWNjZXNzCisJCQkJCXRydWUpKTsgLy8gd3JpdGUgYWNjZXNzCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNlYXJjaFBhdHRlcm47CisKK30KKy8qKgorICogTWV0aG9kIHBhdHRlcm4gYXJlIGZvcm1lZCBieSBbZGVjbGFyaW5nVHlwZS5dc2VsZWN0b3JbKHBhcmFtZXRlclR5cGVzKV1bcmV0dXJuVHlwZV0KKyAqIGUuZy4gamF2YS5sYW5nLlJ1bm5hYmxlLnJ1bigpIHZvaWQKKyAqCQltYWluKCopCisgKi8KK3ByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlTWV0aG9kUGF0dGVybihTdHJpbmcgcGF0dGVyblN0cmluZywgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgdHJ1ZSk7IC8vIHRva2VuaXplIHdoaXRlIHNwYWNlcworCXNjYW5uZXIuc2V0U291cmNlKHBhdHRlcm5TdHJpbmcudG9DaGFyQXJyYXkoKSk7CisJZmluYWwgaW50IEluc2lkZVNlbGVjdG9yID0gMTsKKwlmaW5hbCBpbnQgSW5zaWRlUGFyYW1ldGVyID0gMjsKKwlmaW5hbCBpbnQgSW5zaWRlUmV0dXJuVHlwZSA9IDM7CisJaW50IGxhc3RUb2tlbiA9IC0xOworCQorCVN0cmluZyBkZWNsYXJpbmdUeXBlID0gbnVsbCwgc2VsZWN0b3IgPSBudWxsLCBwYXJhbWV0ZXJUeXBlID0gbnVsbDsKKwlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG51bGw7CisJaW50IHBhcmFtZXRlckNvdW50ID0gLTE7CisJU3RyaW5nIHJldHVyblR5cGUgPSBudWxsOworCWJvb2xlYW4gZm91bmRDbG9zaW5nUGFyZW50aGVzaXMgPSBmYWxzZTsKKwlpbnQgbW9kZSA9IEluc2lkZVNlbGVjdG9yOworCWludCB0b2tlbjsKKwl0cnkgeworCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRil7CisJCXN3aXRjaChtb2RlKXsKKworCQkJLy8gcmVhZCBkZWNsYXJpbmcgdHlwZSBhbmQgc2VsZWN0b3IKKwkJCWNhc2UgSW5zaWRlU2VsZWN0b3IgOgorCQkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKKwkJCQkJCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpeworCQkJCQkJCWlmIChzZWxlY3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQkJCQlkZWNsYXJpbmdUeXBlID0gc2VsZWN0b3I7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVN0cmluZyB0b2tlblNvdXJjZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQkJZGVjbGFyaW5nVHlwZSArPSB0b2tlblNvdXJjZSArIHNlbGVjdG9yOworCQkJCQkJfQorCQkJCQkJc2VsZWN0b3IgPSBudWxsOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMUEFSRU46CisJCQkJCQlwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbNV07CisJCQkJCQlwYXJhbWV0ZXJDb3VudCA9IDA7CisJCQkJCQltb2RlID0gSW5zaWRlUGFyYW1ldGVyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCQkJaWYgKCEoU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFID09IGxhc3RUb2tlbiAKKwkJCQkJCQl8fCBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVCA9PSBsYXN0VG9rZW4pKXsKKwkJCQkJCQltb2RlID0gSW5zaWRlUmV0dXJuVHlwZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQkJaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKwkJCQkJCQlzZWxlY3RvciA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXNlbGVjdG9yICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCS8vIHJlYWQgcGFyYW1ldGVyIHR5cGVzCisJCQljYXNlIEluc2lkZVBhcmFtZXRlciA6CisJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRToKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lQ09NTUE6CisJCQkJCQlpZiAocGFyYW1ldGVyVHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gcGFyYW1ldGVyQ291bnQpeworCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZXMsIDAsIHBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJDb3VudCoyXSwgMCwgcGFyYW1ldGVyQ291bnQpOworCQkJCQkJfQorCQkJCQkJcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVyQ291bnQrK10gPSBwYXJhbWV0ZXJUeXBlOworCQkJCQkJcGFyYW1ldGVyVHlwZSA9IG51bGw7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJQQVJFTjoKKwkJCQkJCWZvdW5kQ2xvc2luZ1BhcmVudGhlc2lzID0gdHJ1ZTsKKwkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlICE9IG51bGwpeworCQkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gcGFyYW1ldGVyQ291bnQpeworCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyQ291bnQqMl0sIDAsIHBhcmFtZXRlckNvdW50KTsKKwkJCQkJCQl9CisJCQkJCQkJcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVyQ291bnQrK10gPSBwYXJhbWV0ZXJUeXBlOworCQkJCQkJfQorCQkJCQkJbW9kZSA9IEluc2lkZVJldHVyblR5cGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXI6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVNVUxUSVBMWToKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDS0VUOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNLRVQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVib29sZWFuOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYnl0ZToKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWNoYXI6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVkb3VibGU6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmbG9hdDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWludDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWxvbmc6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzaG9ydDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXZvaWQ6CisJCQkJCQlpZiAocGFyYW1ldGVyVHlwZSA9PSBudWxsKXsKKwkJCQkJCQlwYXJhbWV0ZXJUeXBlID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcGFyYW1ldGVyVHlwZSArPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkvLyByZWFkIHJldHVybiB0eXBlCisJCQljYXNlIEluc2lkZVJldHVyblR5cGU6CisJCQkJc3dpdGNoICh0b2tlbikgeworCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRToKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0tFVDoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46CisJCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVieXRlOgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY2hhcjoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWZsb2F0OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1laW50OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKKwkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXNob3J0OgorCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldm9pZDoKKwkJCQkJCWlmIChyZXR1cm5UeXBlID09IG51bGwpeworCQkJCQkJCXJldHVyblR5cGUgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXR1cm5UeXBlICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlsYXN0VG9rZW4gPSB0b2tlbjsKKwkJdHJ5IHsKKwkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCS8vIHBhcmVudGhlc2lzIG1pc21hdGNoCisJaWYgKHBhcmFtZXRlckNvdW50PjAgJiYgIWZvdW5kQ2xvc2luZ1BhcmVudGhlc2lzKSByZXR1cm4gbnVsbDsKKwlpZiAoc2VsZWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwljaGFyW10gc2VsZWN0b3JDaGFycyA9IHNlbGVjdG9yLnRvQ2hhckFycmF5KCk7CisJaWYgKHNlbGVjdG9yQ2hhcnMubGVuZ3RoID09IDEgJiYgc2VsZWN0b3JDaGFyc1swXSA9PSAnKicpIHNlbGVjdG9yQ2hhcnMgPSBudWxsOworCQkKKwljaGFyW10gZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24gPSBudWxsLCBkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSA9IG51bGw7CisJY2hhcltdIHJldHVyblR5cGVRdWFsaWZpY2F0aW9uID0gbnVsbCwgcmV0dXJuVHlwZVNpbXBsZU5hbWUgPSBudWxsOworCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucyA9IG51bGwsIHBhcmFtZXRlclR5cGVTaW1wbGVOYW1lcyA9IG51bGw7CisKKwkvLyBleHRyYWN0IGRlY2xhcmluZyB0eXBlIGluZm9zCisJaWYgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCl7CisJCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFydCA9IGRlY2xhcmluZ1R5cGUudG9DaGFyQXJyYXkoKTsKKwkJaW50IGxhc3REb3RQb3NpdGlvbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBkZWNsYXJpbmdUeXBlUGFydCk7CisJCWlmIChsYXN0RG90UG9zaXRpb24gPj0gMCl7CisJCQlkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZGVjbGFyaW5nVHlwZVBhcnQsIDAsIGxhc3REb3RQb3NpdGlvbik7CisJCQlpZiAoZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24ubGVuZ3RoID09IDEgJiYgZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb25bMF0gPT0gJyonKSBkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiA9IG51bGw7CisJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZGVjbGFyaW5nVHlwZVBhcnQsIGxhc3REb3RQb3NpdGlvbisxLCBkZWNsYXJpbmdUeXBlUGFydC5sZW5ndGgpOworCQl9IGVsc2UgeworCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24gPSBudWxsOworCQkJZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUgPSBkZWNsYXJpbmdUeXBlUGFydDsKKwkJfQorCQlpZiAoZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUubGVuZ3RoID09IDEgJiYgZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWVbMF0gPT0gJyonKSBkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSA9IG51bGw7CisJfQorCS8vIGV4dHJhY3QgcGFyYW1ldGVyIHR5cGVzIGluZm9zCisJaWYgKHBhcmFtZXRlckNvdW50ID49IDApeworCQlwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnMgPSBuZXcgY2hhcltwYXJhbWV0ZXJDb3VudF1bXTsKKwkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1ldGVyQ291bnRdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKyl7CisJCQljaGFyW10gcGFyYW1ldGVyVHlwZVBhcnQgPSBwYXJhbWV0ZXJUeXBlc1tpXS50b0NoYXJBcnJheSgpOworCQkJaW50IGxhc3REb3RQb3NpdGlvbiA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy4nLCBwYXJhbWV0ZXJUeXBlUGFydCk7CisJCQlpZiAobGFzdERvdFBvc2l0aW9uID49IDApeworCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkocGFyYW1ldGVyVHlwZVBhcnQsIDAsIGxhc3REb3RQb3NpdGlvbik7CisJCQkJaWYgKHBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXS5sZW5ndGggPT0gMSAmJiBwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnNbaV1bMF0gPT0gJyonKSB7CisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXSA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gcHJlZml4IHdpdGggYSAnKicgYXMgdGhlIGZ1bGwgcXVhbGlmaWNhdGlvbiBjb3VsZCBiZSBiaWdnZXIgCisJCQkJCS8vIChpLmUuIGJlY2F1c2Ugb2YgYW4gaW1wb3J0KQorCQkJCQlwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnNbaV0gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChPTkVfU1RBUiwgcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zW2ldKTsKKwkJCQl9CisJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShwYXJhbWV0ZXJUeXBlUGFydCwgbGFzdERvdFBvc2l0aW9uKzEsIHBhcmFtZXRlclR5cGVQYXJ0Lmxlbmd0aCk7CisJCQl9IGVsc2UgeworCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9uc1tpXSA9IG51bGw7CisJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZVBhcnQ7CisJCQl9CisJCQlpZiAocGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzW2ldLmxlbmd0aCA9PSAxICYmIHBhcmFtZXRlclR5cGVTaW1wbGVOYW1lc1tpXVswXSA9PSAnKicpIHBhcmFtZXRlclR5cGVTaW1wbGVOYW1lc1tpXSA9IG51bGw7CisJCX0KKwl9CQorCS8vIGV4dHJhY3QgcmV0dXJuIHR5cGUgaW5mb3MKKwlpZiAocmV0dXJuVHlwZSAhPSBudWxsKXsKKwkJY2hhcltdIHJldHVyblR5cGVQYXJ0ID0gcmV0dXJuVHlwZS50b0NoYXJBcnJheSgpOworCQlpbnQgbGFzdERvdFBvc2l0aW9uID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHJldHVyblR5cGVQYXJ0KTsKKwkJaWYgKGxhc3REb3RQb3NpdGlvbiA+PSAwKXsKKwkJCXJldHVyblR5cGVRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShyZXR1cm5UeXBlUGFydCwgMCwgbGFzdERvdFBvc2l0aW9uKTsKKwkJCWlmIChyZXR1cm5UeXBlUXVhbGlmaWNhdGlvbi5sZW5ndGggPT0gMSAmJiByZXR1cm5UeXBlUXVhbGlmaWNhdGlvblswXSA9PSAnKicpIHsKKwkJCQlyZXR1cm5UeXBlUXVhbGlmaWNhdGlvbiA9IG51bGw7CisJCQl9IGVsc2UgeworCQkJCS8vIChpLmUuIGJlY2F1c2Ugb2YgYW4gaW1wb3J0KQorCQkJCXJldHVyblR5cGVRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoT05FX1NUQVIsIHJldHVyblR5cGVRdWFsaWZpY2F0aW9uKTsKKwkJCX0JCQkKKwkJCXJldHVyblR5cGVTaW1wbGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShyZXR1cm5UeXBlUGFydCwgbGFzdERvdFBvc2l0aW9uKzEsIHJldHVyblR5cGVQYXJ0Lmxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm5UeXBlUXVhbGlmaWNhdGlvbiA9IG51bGw7CisJCQlyZXR1cm5UeXBlU2ltcGxlTmFtZSA9IHJldHVyblR5cGVQYXJ0OworCQl9CisJCWlmIChyZXR1cm5UeXBlU2ltcGxlTmFtZS5sZW5ndGggPT0gMSAmJiByZXR1cm5UeXBlU2ltcGxlTmFtZVswXSA9PSAnKicpIHJldHVyblR5cGVTaW1wbGVOYW1lID0gbnVsbDsKKwl9CisJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gbnVsbDsKKwlzd2l0Y2ggKGxpbWl0VG8peworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJbmV3IE1ldGhvZERlY2xhcmF0aW9uUGF0dGVybigKKwkJCQkJc2VsZWN0b3JDaGFycywgCisJCQkJCW1hdGNoTW9kZSwgCisJCQkJCWlzQ2FzZVNlbnNpdGl2ZSwgCisJCQkJCWRlY2xhcmluZ1R5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVNpbXBsZU5hbWUsIAorCQkJCQlyZXR1cm5UeXBlUXVhbGlmaWNhdGlvbiwgCisJCQkJCXJldHVyblR5cGVTaW1wbGVOYW1lLCAKKwkJCQkJcGFyYW1ldGVyVHlwZVF1YWxpZmljYXRpb25zLCAKKwkJCQkJcGFyYW1ldGVyVHlwZVNpbXBsZU5hbWVzKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBNZXRob2RSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQlzZWxlY3RvckNoYXJzLCAKKwkJCQkJbWF0Y2hNb2RlLCAKKwkJCQkJaXNDYXNlU2Vuc2l0aXZlLCAKKwkJCQkJZGVjbGFyaW5nVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlkZWNsYXJpbmdUeXBlU2ltcGxlTmFtZSwgCisJCQkJCXJldHVyblR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJcmV0dXJuVHlwZVNpbXBsZU5hbWUsIAorCQkJCQlwYXJhbWV0ZXJUeXBlUXVhbGlmaWNhdGlvbnMsIAorCQkJCQlwYXJhbWV0ZXJUeXBlU2ltcGxlTmFtZXMsCisJCQkJCW51bGwpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCW5ldyBNZXRob2REZWNsYXJhdGlvblBhdHRlcm4oCisJCQkJCXNlbGVjdG9yQ2hhcnMsIAorCQkJCQltYXRjaE1vZGUsIAorCQkJCQlpc0Nhc2VTZW5zaXRpdmUsIAorCQkJCQlkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiwgCisJCQkJCWRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lLCAKKwkJCQkJcmV0dXJuVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlyZXR1cm5UeXBlU2ltcGxlTmFtZSwgCisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucywgCisJCQkJCXBhcmFtZXRlclR5cGVTaW1wbGVOYW1lcyksCisJCQkJbmV3IE1ldGhvZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCXNlbGVjdG9yQ2hhcnMsIAorCQkJCQltYXRjaE1vZGUsIAorCQkJCQlpc0Nhc2VTZW5zaXRpdmUsIAorCQkJCQlkZWNsYXJpbmdUeXBlUXVhbGlmaWNhdGlvbiwgCisJCQkJCWRlY2xhcmluZ1R5cGVTaW1wbGVOYW1lLCAKKwkJCQkJcmV0dXJuVHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQlyZXR1cm5UeXBlU2ltcGxlTmFtZSwgCisJCQkJCXBhcmFtZXRlclR5cGVRdWFsaWZpY2F0aW9ucywgCisJCQkJCXBhcmFtZXRlclR5cGVTaW1wbGVOYW1lcywKKwkJCQkJbnVsbCkpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBzZWFyY2hQYXR0ZXJuOworCit9Citwcml2YXRlIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVBhY2thZ2VQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKwlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBudWxsOworCXN3aXRjaCAobGltaXRUbyl7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TIDoKKwkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybihwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCksIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IG5ldyBQYWNrYWdlUmVmZXJlbmNlUGF0dGVybihwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCksIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6CisJCQlzZWFyY2hQYXR0ZXJuID0gbmV3IE9yUGF0dGVybigKKwkJCQluZXcgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybihwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCksIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKSwKKwkJCQluZXcgUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4ocGF0dGVyblN0cmluZy50b0NoYXJBcnJheSgpLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSkKKwkJCSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNlYXJjaFBhdHRlcm47CisKK30KK3B1YmxpYyBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCWlmIChwYXR0ZXJuU3RyaW5nID09IG51bGwgfHwgcGF0dGVyblN0cmluZy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gbnVsbDsKKworCVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IG51bGw7CisJc3dpdGNoIChzZWFyY2hGb3IpIHsKKworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEU6CisJCQlzZWFyY2hQYXR0ZXJuID0gY3JlYXRlVHlwZVBhdHRlcm4ocGF0dGVyblN0cmluZywgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuTUVUSE9EOgorCQkJc2VhcmNoUGF0dGVybiA9IGNyZWF0ZU1ldGhvZFBhdHRlcm4ocGF0dGVyblN0cmluZywgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCQkJYnJlYWs7CQkJCisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ09OU1RSVUNUT1I6CisJCQlzZWFyY2hQYXR0ZXJuID0gY3JlYXRlQ29uc3RydWN0b3JQYXR0ZXJuKHBhdHRlcm5TdHJpbmcsIGxpbWl0VG8sIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwkJCWJyZWFrOwkJCQorCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkZJRUxEOgorCQkJc2VhcmNoUGF0dGVybiA9IGNyZWF0ZUZpZWxkUGF0dGVybihwYXR0ZXJuU3RyaW5nLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5QQUNLQUdFOgorCQkJc2VhcmNoUGF0dGVybiA9IGNyZWF0ZVBhY2thZ2VQYXR0ZXJuKHBhdHRlcm5TdHJpbmcsIGxpbWl0VG8sIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwl9CisJcmV0dXJuIHNlYXJjaFBhdHRlcm47Cit9CitwdWJsaWMgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlUGF0dGVybihJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGxpbWl0VG8pIHsKKwlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBudWxsOworCWludCBsYXN0RG90OworCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEIDoKKwkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpIGVsZW1lbnQ7IAorCQkJU3RyaW5nIGZ1bGxEZWNsYXJpbmdOYW1lID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworCQkJbGFzdERvdCA9IGZ1bGxEZWNsYXJpbmdOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCQljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSA9IChsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKSA6IGZ1bGxEZWNsYXJpbmdOYW1lKS50b0NoYXJBcnJheSgpOworCQkJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkgOiBOT19DSEFSOworCQkJY2hhcltdIG5hbWUgPSBmaWVsZC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQljaGFyW10gdHlwZVNpbXBsZU5hbWU7CisJCQljaGFyW10gdHlwZVF1YWxpZmljYXRpb247CisJCQl0cnkgeworCQkJCVN0cmluZyB0eXBlU2lnbmF0dXJlID0gU2lnbmF0dXJlLnRvU3RyaW5nKGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKSkucmVwbGFjZSgnJCcsICcuJyk7CisJCQkJbGFzdERvdCA9IHR5cGVTaWduYXR1cmUubGFzdEluZGV4T2YoJy4nKTsKKwkJCQl0eXBlU2ltcGxlTmFtZSA9IChsYXN0RG90ICE9IC0xID8gdHlwZVNpZ25hdHVyZS5zdWJzdHJpbmcobGFzdERvdCArIDEpIDogdHlwZVNpZ25hdHVyZSkudG9DaGFyQXJyYXkoKTsKKwkJCQl0eXBlUXVhbGlmaWNhdGlvbiA9IAorCQkJCQlsYXN0RG90ICE9IC0xID8gCisJCQkJCQkvLyBwcmVmaXggd2l0aCBhICcqJyBhcyB0aGUgZnVsbCBxdWFsaWZpY2F0aW9uIGNvdWxkIGJlIGJpZ2dlciAKKwkJCQkJCS8vIChpLmUuIGJlY2F1c2Ugb2YgYW4gaW1wb3J0KQorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoT05FX1NUQVIsIHR5cGVTaWduYXR1cmUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkpIDogCisJCQkJCQludWxsOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXN3aXRjaCAobGltaXRUbykgeworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TIDoKKwkJCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCQkJbmV3IEZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuKAorCQkJCQkJCW5hbWUsIAorCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQkJCXR5cGVTaW1wbGVOYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKKwkJCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCQkJbmV3IEZpZWxkUmVmZXJlbmNlUGF0dGVybigKKwkJCQkJCQluYW1lLCAKKwkJCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCQkJQ0FTRV9TRU5TSVRJVkUsIAorCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQkJCWRlY2xhcmluZ1NpbXBsZU5hbWUsIAorCQkJCQkJCXR5cGVRdWFsaWZpY2F0aW9uLCAKKwkJCQkJCQl0eXBlU2ltcGxlTmFtZSwKKwkJCQkJCQl0cnVlLCAgLy8gcmVhZCBhY2Nlc3MKKwkJCQkJCQl0cnVlKTsgLy8gd3JpdGUgYWNjZXNzCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuUkVBRF9BQ0NFU1NFUyA6CisJCQkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQkJCW5ldyBGaWVsZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCQkJbmFtZSwgCisJCQkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQkJCUNBU0VfU0VOU0lUSVZFLCAKKwkJCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKKwkJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJCQkJCQl0eXBlUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJdHlwZVNpbXBsZU5hbWUsCisJCQkJCQkJdHJ1ZSwgIC8vIHJlYWQgYWNjZXNzIG9ubHkKKwkJCQkJCQlmYWxzZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuV1JJVEVfQUNDRVNTRVMgOgorCQkJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJCQluZXcgRmllbGRSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQkJCW5hbWUsIAorCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQkJCXR5cGVTaW1wbGVOYW1lLAorCQkJCQkJCWZhbHNlLAorCQkJCQkJCXRydWUpOyAvLyB3cml0ZSBhY2Nlc3Mgb25seQorCQkJCQlicmVhazsKKwkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6CisJCQkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCQkJbmV3IEZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuKAorCQkJCQkJCW5hbWUsIAorCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQkJCXR5cGVTaW1wbGVOYW1lKSwgCisJCQkJCQluZXcgRmllbGRSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQkJCW5hbWUsIAorCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJdHlwZVF1YWxpZmljYXRpb24sIAorCQkJCQkJCXR5cGVTaW1wbGVOYW1lLAorCQkJCQkJCXRydWUsICAvLyByZWFkIGFjY2VzcworCQkJCQkJCXRydWUpKTsgLy8gd3JpdGUgYWNjZXNzCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTiA6CisJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7CisJCQlsYXN0RG90ID0gZWxlbWVudE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCWlmIChsYXN0RG90ID09IC0xKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBpbXBvcnQgZGVjbGFyYXRpb24KKwkJCUlJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsID0gKElJbXBvcnREZWNsYXJhdGlvbillbGVtZW50OworCQkJaWYgKGltcG9ydERlY2wuaXNPbkRlbWFuZCgpKSB7CisJCQkJc2VhcmNoUGF0dGVybiA9IGNyZWF0ZVBhY2thZ2VQYXR0ZXJuKGVsZW1lbnROYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KSwgbGltaXRUbywgRVhBQ1RfTUFUQ0gsIENBU0VfU0VOU0lUSVZFKTsKKwkJCX0gZWxzZSB7CisJCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCQljcmVhdGVUeXBlUGF0dGVybigKKwkJCQkJCWVsZW1lbnROYW1lLnN1YnN0cmluZyhsYXN0RG90KzEpLnRvQ2hhckFycmF5KCksCisJCQkJCQllbGVtZW50TmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkudG9DaGFyQXJyYXkoKSwKKwkJCQkJCW51bGwsCisJCQkJCQlsaW1pdFRvKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0QgOgorCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgZWxlbWVudDsKKwkJCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcjsKKwkJCXRyeSB7CisJCQkJaXNDb25zdHJ1Y3RvciA9IG1ldGhvZC5pc0NvbnN0cnVjdG9yKCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJZnVsbERlY2xhcmluZ05hbWUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworCQkJbGFzdERvdCA9IGZ1bGxEZWNsYXJpbmdOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCQlkZWNsYXJpbmdTaW1wbGVOYW1lID0gKGxhc3REb3QgIT0gLTEgPyBmdWxsRGVjbGFyaW5nTmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpIDogZnVsbERlY2xhcmluZ05hbWUpLnRvQ2hhckFycmF5KCk7CisJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gbGFzdERvdCAhPSAtMSA/IGZ1bGxEZWNsYXJpbmdOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KS50b0NoYXJBcnJheSgpIDogTk9fQ0hBUjsKKwkJCWNoYXJbXSBzZWxlY3RvciA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQljaGFyW10gcmV0dXJuU2ltcGxlTmFtZTsKKwkJCWNoYXJbXSByZXR1cm5RdWFsaWZpY2F0aW9uOworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgcmV0dXJuVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKS5yZXBsYWNlKCckJywgJy4nKTsKKwkJCQlsYXN0RG90ID0gcmV0dXJuVHlwZS5sYXN0SW5kZXhPZignLicpOworCQkJCXJldHVyblNpbXBsZU5hbWUgPSAobGFzdERvdCAhPSAtMSA/IHJldHVyblR5cGUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKSA6IHJldHVyblR5cGUpLnRvQ2hhckFycmF5KCk7CisJCQkJcmV0dXJuUXVhbGlmaWNhdGlvbiA9IAorCQkJCQlsYXN0RG90ICE9IC0xID8gCisJCQkJCQkvLyBwcmVmaXggd2l0aCBhICcqJyBhcyB0aGUgZnVsbCBxdWFsaWZpY2F0aW9uIGNvdWxkIGJlIGJpZ2dlciAKKwkJCQkJCS8vIChpLmUuIGJlY2F1c2Ugb2YgYW4gaW1wb3J0KQorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoT05FX1NUQVIsIHJldHVyblR5cGUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkpIDogCisJCQkJCQludWxsOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCQlpbnQgcGFyYW1Db3VudCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclNpbXBsZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1Db3VudF1bXTsKKwkJCWNoYXJbXVtdIHBhcmFtZXRlclF1YWxpZmljYXRpb25zID0gbmV3IGNoYXJbcGFyYW1Db3VudF1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7CisJCQkJU3RyaW5nIHNpZ25hdHVyZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSkucmVwbGFjZSgnJCcsICcuJyk7CisJCQkJbGFzdERvdCA9IHNpZ25hdHVyZS5sYXN0SW5kZXhPZignLicpOworCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzW2ldID0gKGxhc3REb3QgIT0gLTEgPyBzaWduYXR1cmUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKSA6IHNpZ25hdHVyZSkudG9DaGFyQXJyYXkoKTsKKwkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9uc1tpXSA9IAorCQkJCQlsYXN0RG90ICE9IC0xID8gCisJCQkJCQkvLyBwcmVmaXggd2l0aCBhICcqJyBhcyB0aGUgZnVsbCBxdWFsaWZpY2F0aW9uIGNvdWxkIGJlIGJpZ2dlciAKKwkJCQkJCS8vIChpLmUuIGJlY2F1c2Ugb2YgYW4gaW1wb3J0KQorCQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoT05FX1NUQVIsIHNpZ25hdHVyZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkudG9DaGFyQXJyYXkoKSkgOiAKKwkJCQkJCW51bGw7CisJCQl9CisJCQlzd2l0Y2ggKGxpbWl0VG8pIHsKKwkJCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUyA6CisJCQkJCWlmIChpc0NvbnN0cnVjdG9yKSB7CisJCQkJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJCQkJbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuKAorCQkJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJCQkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCQkJCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQkJCQluZXcgTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuKAorCQkJCQkJCQlzZWxlY3RvciwgCisJCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQkJQ0FTRV9TRU5TSVRJVkUsIAorCQkJCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKKwkJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJCXJldHVyblF1YWxpZmljYXRpb24sIAorCQkJCQkJCQlyZXR1cm5TaW1wbGVOYW1lLCAKKwkJCQkJCQkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCQkJCQkJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTIDoKKwkJCQkJaWYgKGlzQ29uc3RydWN0b3IpIHsKKwkJCQkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQkJCQluZXcgQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJCQkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCQkJCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzLAorCQkJCQkJCQltZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQkJCQluZXcgTWV0aG9kUmVmZXJlbmNlUGF0dGVybigKKwkJCQkJCQkJc2VsZWN0b3IsIAorCQkJCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCQkJCUNBU0VfU0VOU0lUSVZFLCAKKwkJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJCWRlY2xhcmluZ1NpbXBsZU5hbWUsIAorCQkJCQkJCQlyZXR1cm5RdWFsaWZpY2F0aW9uLCAKKwkJCQkJCQkJcmV0dXJuU2ltcGxlTmFtZSwgCisJCQkJCQkJCXBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwkJCQkJCQkJcGFyYW1ldGVyU2ltcGxlTmFtZXMsCisJCQkJCQkJCW1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCQkJaWYgKGlzQ29uc3RydWN0b3IpIHsKKwkJCQkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCQkJCW5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybigKKwkJCQkJCQkJZGVjbGFyaW5nU2ltcGxlTmFtZSwgCisJCQkJCQkJCUVYQUNUX01BVENILCAKKwkJCQkJCQkJQ0FTRV9TRU5TSVRJVkUsIAorCQkJCQkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKKwkJCQkJCQkJcGFyYW1ldGVyUXVhbGlmaWNhdGlvbnMsIAorCQkJCQkJCQlwYXJhbWV0ZXJTaW1wbGVOYW1lcyksIAorCQkJCQkJCW5ldyBDb25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCQkJCWRlY2xhcmluZ1NpbXBsZU5hbWUsIAorCQkJCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCQkJCUNBU0VfU0VOU0lUSVZFLCAKKwkJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJCXBhcmFtZXRlclF1YWxpZmljYXRpb25zLCAKKwkJCQkJCQkJcGFyYW1ldGVyU2ltcGxlTmFtZXMsCisJCQkJCQkJCW1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCQkJCW5ldyBNZXRob2REZWNsYXJhdGlvblBhdHRlcm4oCisJCQkJCQkJCXNlbGVjdG9yLCAKKwkJCQkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJCQkJCQkJcmV0dXJuUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJCXJldHVyblNpbXBsZU5hbWUsIAorCQkJCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCQkJCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzKSwgCisJCQkJCQkJbmV3IE1ldGhvZFJlZmVyZW5jZVBhdHRlcm4oCisJCQkJCQkJCXNlbGVjdG9yLCAKKwkJCQkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQkJCQlDQVNFX1NFTlNJVElWRSwgCisJCQkJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQkJCQlkZWNsYXJpbmdTaW1wbGVOYW1lLCAKKwkJCQkJCQkJcmV0dXJuUXVhbGlmaWNhdGlvbiwgCisJCQkJCQkJCXJldHVyblNpbXBsZU5hbWUsIAorCQkJCQkJCQlwYXJhbWV0ZXJRdWFsaWZpY2F0aW9ucywgCisJCQkJCQkJCXBhcmFtZXRlclNpbXBsZU5hbWVzLAorCQkJCQkJCQltZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6CisJCQlJVHlwZSB0eXBlID0gKElUeXBlKWVsZW1lbnQ7CisJCQlzZWFyY2hQYXR0ZXJuID0gCisJCQkJY3JlYXRlVHlwZVBhdHRlcm4oCisJCQkJCXR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpLCAKKwkJCQkJdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCksCisJCQkJCWVuY2xvc2luZ1R5cGVOYW1lcyh0eXBlKSwKKwkJCQkJbGltaXRUbyk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTiA6CisJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJc2VhcmNoUGF0dGVybiA9IGNyZWF0ZVBhY2thZ2VQYXR0ZXJuKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgbGltaXRUbywgRVhBQ1RfTUFUQ0gsIENBU0VfU0VOU0lUSVZFKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VhcmNoUGF0dGVybjsKK30KK3ByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlVHlwZVBhdHRlcm4oY2hhcltdIHNpbXBsZU5hbWUsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBpbnQgbGltaXRUbykgeworCVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IG51bGw7CisJc3dpdGNoIChsaW1pdFRvKSB7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TIDoKKwkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQluZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKKwkJCQkJcGFja2FnZU5hbWUsIAorCQkJCQllbmNsb3NpbmdUeXBlTmFtZXMsIAorCQkJCQlzaW1wbGVOYW1lLCAKKwkJCQkJVFlQRV9TVUZGSVgsIAorCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCUNBU0VfU0VOU0lUSVZFKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IAorCQkJCW5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybigKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyksIAorCQkJCQlzaW1wbGVOYW1lLCAKKwkJCQkJRVhBQ1RfTUFUQ0gsIAorCQkJCQlDQVNFX1NFTlNJVElWRSk7CisJCQlicmVhazsKKwkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMgOiAKKwkJCXNlYXJjaFBhdHRlcm4gPSAKKwkJCQluZXcgU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSwgCisJCQkJCXNpbXBsZU5hbWUsIAorCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCUNBU0VfU0VOU0lUSVZFKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyA6CisJCQlzZWFyY2hQYXR0ZXJuID0gbmV3IE9yUGF0dGVybigKKwkJCQluZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKKwkJCQkJcGFja2FnZU5hbWUsIAorCQkJCQllbmNsb3NpbmdUeXBlTmFtZXMsIAorCQkJCQlzaW1wbGVOYW1lLCAKKwkJCQkJVFlQRV9TVUZGSVgsIAorCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCUNBU0VfU0VOU0lUSVZFKSwgCisJCQkJbmV3IFR5cGVSZWZlcmVuY2VQYXR0ZXJuKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocGFja2FnZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKSwgCisJCQkJCXNpbXBsZU5hbWUsIAorCQkJCQlFWEFDVF9NQVRDSCwgCisJCQkJCUNBU0VfU0VOU0lUSVZFKSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNlYXJjaFBhdHRlcm47Cit9CisvKioKKyAqIFR5cGUgcGF0dGVybiBhcmUgZm9ybWVkIGJ5IFtxdWFsaWZpY2F0aW9uLl10eXBlCisgKiBlLmcuIGphdmEubGFuZy5PYmplY3QKKyAqCQlSdW5uYWJsZQorICoKKyAqLworcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVUeXBlUGF0dGVybihTdHJpbmcgcGF0dGVyblN0cmluZywgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgdHJ1ZSk7IC8vIHRva2VuaXplIHdoaXRlIHNwYWNlcworCXNjYW5uZXIuc2V0U291cmNlKHBhdHRlcm5TdHJpbmcudG9DaGFyQXJyYXkoKSk7CisJU3RyaW5nIHR5cGUgPSBudWxsOworCWludCB0b2tlbjsKKwl0cnkgeworCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCXdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRil7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgorCQkJCWJyZWFrOworCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyOgorCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDS0VUOgorCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VUOgorCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46CisJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYnl0ZToKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVjaGFyOgorCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmbG9hdDoKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbnQ6CisJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzaG9ydDoKKwkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV2b2lkOgorCQkJCWlmICh0eXBlID09IG51bGwpeworCQkJCQl0eXBlID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0eXBlICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQl0cnkgeworCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKwljaGFyW10gcXVhbGlmaWNhdGlvbkNoYXJzID0gbnVsbCwgdHlwZUNoYXJzID0gbnVsbDsKKworCS8vIGV4dHJhY3QgZGVjbGFyaW5nIHR5cGUgaW5mb3MKKwlpZiAodHlwZSAhPSBudWxsKXsKKwkJY2hhcltdIHR5cGVQYXJ0ID0gdHlwZS50b0NoYXJBcnJheSgpOworCQlpbnQgbGFzdERvdFBvc2l0aW9uID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIHR5cGVQYXJ0KTsKKwkJaWYgKGxhc3REb3RQb3NpdGlvbiA+PSAwKXsKKwkJCXF1YWxpZmljYXRpb25DaGFycyA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZVBhcnQsIDAsIGxhc3REb3RQb3NpdGlvbik7CisJCQlpZiAocXVhbGlmaWNhdGlvbkNoYXJzLmxlbmd0aCA9PSAxICYmIHF1YWxpZmljYXRpb25DaGFyc1swXSA9PSAnKicpIHF1YWxpZmljYXRpb25DaGFycyA9IG51bGw7CisJCQl0eXBlQ2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHR5cGVQYXJ0LCBsYXN0RG90UG9zaXRpb24rMSwgdHlwZVBhcnQubGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXF1YWxpZmljYXRpb25DaGFycyA9IG51bGw7CisJCQl0eXBlQ2hhcnMgPSB0eXBlUGFydDsKKwkJfQorCQlpZiAodHlwZUNoYXJzLmxlbmd0aCA9PSAxICYmIHR5cGVDaGFyc1swXSA9PSAnKicpIHR5cGVDaGFycyA9IG51bGw7CisJfQorCVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IG51bGw7CisJc3dpdGNoIChsaW1pdFRvKXsKKwkJY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMgOiAvLyBjYW5ub3Qgc2VhcmNoIGZvciBleHBsaWNpdCBtZW1iZXIgdHlwZXMKKwkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgVFlQRV9TVUZGSVgsIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKwkJCWJyZWFrOworCQljYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMgOgorCQkJc2VhcmNoUGF0dGVybiA9IG5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTIDogCisJCQlzZWFyY2hQYXR0ZXJuID0gbmV3IFN1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCQkJYnJlYWs7CisJCWNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTIDoKKwkJCXNlYXJjaFBhdHRlcm4gPSBuZXcgT3JQYXR0ZXJuKAorCQkJCW5ldyBRdWFsaWZpZWRUeXBlRGVjbGFyYXRpb25QYXR0ZXJuKHF1YWxpZmljYXRpb25DaGFycywgdHlwZUNoYXJzLCBUWVBFX1NVRkZJWCwgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpLC8vIGNhbm5vdCBzZWFyY2ggZm9yIGV4cGxpY2l0IG1lbWJlciB0eXBlcworCQkJCW5ldyBUeXBlUmVmZXJlbmNlUGF0dGVybihxdWFsaWZpY2F0aW9uQ2hhcnMsIHR5cGVDaGFycywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VhcmNoUGF0dGVybjsKKworfQorcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpOworLyoqCisgKiBSZXR1cm5zIHRoZSBlbmNsb3NpbmcgdHlwZSBuYW1lcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzKElUeXBlIHR5cGUpIHsKKwlJSmF2YUVsZW1lbnQgcGFyZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKKwlzd2l0Y2ggKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6CisJCQkvLyBGb3IgYSBiaW5hcnkgdHlwZSwgdGhlIHBhcmVudCBpcyBub3QgdGhlIGVuY2xvc2luZyB0eXBlLCBidXQgdGhlIGRlY2xhcmluZyB0eXBlIGlzLgorCQkJLy8gKHNlZSBidWcgMjA1MzIgIERlY2xhcmF0aW9uIG9mIG1lbWJlciBiaW5hcnkgdHlwZSBub3QgZm91bmQpCisJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CisJCQlpZiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIE5PX0NIQVJfQ0hBUjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uYXJyYXlDb25jYXQoCisJCQkJCWVuY2xvc2luZ1R5cGVOYW1lcyhkZWNsYXJpbmdUeXBlKSwgCisJCQkJCWRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCX0KKwkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKKwkJCXJldHVybiAJTk9fQ0hBUl9DSEFSOworCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgorCQkJcmV0dXJuIAlDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KAorCQkJCWVuY2xvc2luZ1R5cGVOYW1lcygoSVR5cGUpcGFyZW50KSwgCisJCQkJcGFyZW50LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gbnVsbDsKKwl9Cit9CisvKioKKyAqIEZlZWQgdGhlIHJlcXVlc3RvciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VhcmNoIHBhdHRlcm4KKyAqLworcHVibGljIGFic3RyYWN0IHZvaWQgZmVlZEluZGV4UmVxdWVzdG9yKElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBkZXRhaWxMZXZlbCwgaW50W10gcmVmZXJlbmNlcywgSW5kZXhJbnB1dCBpbnB1dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgIHRocm93cyBJT0V4Y2VwdGlvbiA7CisvKioKKyAqIFF1ZXJ5IGEgZ2l2ZW4gaW5kZXggZm9yIG1hdGNoaW5nIGVudHJpZXMuIAorICovCitwdWJsaWMgdm9pZCBmaW5kSW5kZXhNYXRjaGVzKElJbmRleCBpbmRleCwgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCUluZGV4SW5wdXQgaW5wdXQgPSBuZXcgQmxvY2tzSW5kZXhJbnB1dChpbmRleC5nZXRJbmRleEZpbGUoKSk7CisJdHJ5IHsKKwkJaW5wdXQub3BlbigpOworCQlmaW5kSW5kZXhNYXRjaGVzKGlucHV0LCByZXF1ZXN0b3IsIGRldGFpbExldmVsLCBwcm9ncmVzc01vbml0b3Isc2NvcGUpOworCX0gZmluYWxseSB7CisJCWlucHV0LmNsb3NlKCk7CisJfQorfQorLyoqCisgKiBRdWVyeSBhIGdpdmVuIGluZGV4IGZvciBtYXRjaGluZyBlbnRyaWVzLiAKKyAqLworcHVibGljIHZvaWQgZmluZEluZGV4TWF0Y2hlcyhJbmRleElucHV0IGlucHV0LCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQorCS8qIG5hcnJvdyBkb3duIGEgc2V0IG9mIGVudHJpZXMgdXNpbmcgcHJlZml4IGNyaXRlcmlhICovCisJSUVudHJ5UmVzdWx0W10gZW50cmllcyA9IGlucHV0LnF1ZXJ5RW50cmllc1ByZWZpeGVkQnkoaW5kZXhFbnRyeVByZWZpeCgpKTsKKwlpZiAoZW50cmllcyA9PSBudWxsKSByZXR1cm47CisJCisJLyogb25seSBzZWxlY3QgZW50cmllcyB3aGljaCBhY3R1YWxseSBtYXRjaCB0aGUgZW50aXJlIHNlYXJjaCBwYXR0ZXJuICovCisJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKworCQkvKiByZXRyaWV2ZSBhbmQgZGVjb2RlIGVudHJ5ICovCQorCQlJRW50cnlSZXN1bHQgZW50cnkgPSBlbnRyaWVzW2ldOworCQlkZWNvZGVJbmRleEVudHJ5KGVudHJ5KTsKKwkJaWYgKG1hdGNoSW5kZXhFbnRyeSgpKXsKKwkJCWZlZWRJbmRleFJlcXVlc3RvcihyZXF1ZXN0b3IsIGRldGFpbExldmVsLCBlbnRyeS5nZXRGaWxlUmVmZXJlbmNlcygpLCBpbnB1dCwgc2NvcGUpOworCQl9CisJfQorfQorLyoqCisgKiBBbnN3ZXJzIHRoZSBzdWl0YWJsZSBwcmVmaXggdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBvcmRlcgorICogdG8gcXVlcnkgaW5kZXhlcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4KKyAqIFRoZSBtb3JlIGFjY3VyYXRlIHRoZSBwcmVmaXggYW5kIHRoZSBsZXNzIGZhbHNlIGhpdHMgd2lsbCBoYXZlCisgKiB0byBiZSBlbGltaW5hdGVkIGxhdGVyIG9uLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKTsKKy8qKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGFzdCBub2RlIHN5bnRhY3RpY2FsbHkgbWF0Y2hlcyB0aGlzIHBhdHRlcm4uCisgKiBJZiBpdCBkb2VzLCBhZGQgaXQgdG8gdGhlIG1hdGNoIHNldC4KKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hDaGVjayhBc3ROb2RlIG5vZGUsIE1hdGNoU2V0IHNldCkgeworCWludCBtYXRjaExldmVsID0gdGhpcy5tYXRjaExldmVsKG5vZGUsIGZhbHNlKTsKKwlzd2l0Y2ggKG1hdGNoTGV2ZWwpIHsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLlBPU1NJQkxFX01BVENIOgorCQkJc2V0LmFkZFBvc3NpYmxlTWF0Y2gobm9kZSk7CisJCQlicmVhazsKKwkJY2FzZSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIOgorCQkJc2V0LmFkZFRydXN0ZWRNYXRjaChub2RlKTsKKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdHlwZSBvZiBjb250YWluZXIgb2YgdGhpcyBwYXR0ZXJuLCBpLmUuIGlzIGl0IGluIGNvbXBpbGF0aW9uIHVuaXQsCisgKiBpbiBjbGFzcyBkZWNsYXJhdGlvbnMsIGZpZWxkIGRlY2xhcmF0aW9ucywgb3IgaW4gbWV0aG9kIGRlY2xhcmF0aW9ucy4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IGludCBtYXRjaENvbnRhaW5lcigpOworLyoqCisgKiBGaW5kcyBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gYmluYXJ5IGluZm8gbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLgorICogRGVmYXVsdCBpcyB0byByZXR1cm4gZmFsc2UuCisgKi8KK3B1YmxpYyBib29sZWFuIG1hdGNoZXNCaW5hcnkoT2JqZWN0IGJpbmFyeUluZm8sIE9iamVjdCBlbmNsb3NpbmdCaW5hcnlJbmZvKSB7CisJcmV0dXJuIGZhbHNlOworfQorLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gcGF0dGVybi4KKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc05hbWUoY2hhcltdIHBhdHRlcm4sIGNoYXJbXSBuYW1lKSB7CisJaWYgKG5hbWUgIT0gbnVsbCl7CisJCXN3aXRjaCAodGhpcy5tYXRjaE1vZGUpIHsKKwkJCWNhc2UgRVhBQ1RfTUFUQ0ggOgorCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmVxdWFscyhwYXR0ZXJuLCBuYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHBhdHRlcm4sIG5hbWUsIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKTsKKwkJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQkJcmV0dXJuIENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybiwgbmFtZSwgdGhpcy5pc0Nhc2VTZW5zaXRpdmUpOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGJpbmRpbmcgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2ltcGxlIG5hbWUgcGF0dGVybiAKKyAqIGFuZCBxdWFsaWZpY2F0aW9uIHBhdHRlcm4uCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoZXNUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuLCBjaGFyW10gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgeworCWNoYXJbXSBwYXR0ZXJuOworCWlmIChzaW1wbGVOYW1lUGF0dGVybiA9PSBudWxsKSB7CisJCWlmIChxdWFsaWZpY2F0aW9uUGF0dGVybiA9PSBudWxsKSB7CisJCQlwYXR0ZXJuID0gT05FX1NUQVI7CisJCX0gZWxzZSB7CisJCQlwYXR0ZXJuID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWNhdGlvblBhdHRlcm4sIE9ORV9TVEFSLCAnLicpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHF1YWxpZmljYXRpb25QYXR0ZXJuID09IG51bGwpIHsKKwkJCXBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChPTkVfU1RBUiwgc2ltcGxlTmFtZVBhdHRlcm4pOworCQl9IGVsc2UgeworCQkJcGF0dGVybiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHF1YWxpZmljYXRpb25QYXR0ZXJuLCBzaW1wbGVOYW1lUGF0dGVybiwgJy4nKTsKKwkJfQorCX0KKwlyZXR1cm4gCisJCUNoYXJPcGVyYXRpb24ubWF0Y2goCisJCQlwYXR0ZXJuLAorCQkJZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSwKKwkJCXRoaXMuaXNDYXNlU2Vuc2l0aXZlCisJCSk7Cit9CisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGFuIGVudHJ5IG1hdGNoZXMgdGhlIGN1cnJlbnQgc2VhcmNoIHBhdHRlcm4KKyAqLworcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hJbmRleEVudHJ5KCk7CisvKioKKyAqIFJlcG9ydCB0aGUgbWF0Y2ggb2YgdGhlIGdpdmVuIGltcG9ydCByZWZlcmVuY2UKKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRJbXBvcnRSZWYoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQmluZGluZyBiaW5kaW5nLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIGRlZmF1bHQgaXMgdG8gcmVwb3J0IGEgbWF0Y2ggYXMgYSByZWd1bGFyIHJlZi4KKwl0aGlzLm1hdGNoUmVwb3J0UmVmZXJlbmNlKGltcG9ydFJlZiwgZWxlbWVudCwgYWNjdXJhY3ksIGxvY2F0b3IpOworfQorLyoqCisgKiBSZXBvcnRzIHRoZSBtYXRjaCBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgorICovCitwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkvLyBkZWZhdWx0IGlzIHRvIHJlcG9ydCBhIG1hdGNoIG9uIHRoZSB3aG9sZSBub2RlLgorCWxvY2F0b3IucmVwb3J0KHJlZmVyZW5jZS5zb3VyY2VTdGFydCwgcmVmZXJlbmNlLnNvdXJjZUVuZCwgZWxlbWVudCwgYWNjdXJhY3kpOworfQorCisvKioKKyAqIEFkZCBzcXVhcmUgYnJhY2tldHMgdG8gdGhlIGdpdmVuIHNpbXBsZSBuYW1lCisgKi8KK3Byb3RlY3RlZCBjaGFyW10gdG9BcnJheU5hbWUoY2hhcltdIHNpbXBsZU5hbWUsIGludCBkaW1lbnNpb25zKSB7CisJaWYgKGRpbWVuc2lvbnMgPT0gMCkgcmV0dXJuIHNpbXBsZU5hbWU7CisJaW50IGxlbmd0aCA9IHNpbXBsZU5hbWUubGVuZ3RoOworCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggKyBkaW1lbnNpb25zICogMl07CisJU3lzdGVtLmFycmF5Y29weShzaW1wbGVOYW1lLCAwLCByZXN1bHQsIDAsIGxlbmd0aCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKwkJcmVzdWx0W3NpbXBsZU5hbWUubGVuZ3RoICsgaSoyXSA9ICdbJzsKKwkJcmVzdWx0W3NpbXBsZU5hbWUubGVuZ3RoICsgaSoyICsgMV0gPSAnXSc7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJcmV0dXJuICJTZWFyY2hQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAorfQorCisKKworCisKKworCisvKioKKyAqIEluaXRpYWxpemVzIHRoaXMgc2VhcmNoIHBhdHRlcm4gc28gdGhhdCBwb2x5bW9ycGhpYyBzZWFyY2ggY2FuIGJlIHBlcmZvcm1lZC4KKyAqLyAKK3B1YmxpYyB2b2lkIGluaXRpYWxpemVQb2x5bW9ycGhpY1NlYXJjaChNYXRjaExvY2F0b3IgbG9jYXRvciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKK30KKworLyoqCisgKiBGaW5kcyBvdXQgd2hldGhlciB0aGUgZ2l2ZW4gYXN0IG5vZGUgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLgorICogUmV0dXJucyBJTVBPU1NJQkxFX01BVENIIGlmIGl0IGRvZXNuJ3QuCisgKiBSZXR1cm5zIFBPU1NJQkxFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IG1hdGNoZXMgdGhpcyBzZWFyY2ggcGF0dGVybiAKKyAqIGFuZCBpdCBoYXMgbm90IGJlZW4gcmVvbHZlZCwgYW5kIGl0IG5lZWRzIHRvIGJlIHJlc29sdmVkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLgorICogUmV0dXJucyBBQ0NVUkFURV9NQVRDSCBpZiBpdCBtYXRjaGVzIGV4YWN0bHkgdGhpcyBzZWFyY2ggcGF0dGVybiAoaWUuIAorICogaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlc29sdmVkIG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuKQorICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIGl0IHBvdGVudGlhbGx5IGV4YWN0bHkgdGhpcyBzZWFyY2ggcGF0dGVybiAoaWUuIAorICogaXQgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZCBidXQgcmVzb2x2aW5nIGZhaWxlZC4pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSk7CisKKy8qKgorICogRmluZHMgb3V0IHdoZXRoZXIgdGhlIGdpdmVuIGJpbmRpbmcgbWF0Y2hlcyB0aGlzIHNlYXJjaCBwYXR0ZXJuLgorICogUmV0dXJucyBBQ0NVUkFURV9NQVRDSCBpZiBpdCBkb2VzLgorICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIHJlc29sdmUgZmFpbGVkIGJ1dCBtYXRjaCBpcyBzdGlsbCBwb3NzaWJsZS4KKyAqIFJldHVucnMgSU1QT1NTSUJMRV9NQVRDSCBvdGhlcndpc2UuCisgKiBEZWZhdWx0IGlzIHRvIHJldHVybiBJTkFDQ1VSQVRFX01BVENILgorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiByZWZlcmVuY2UgdHlwZSBiaW5kaW5nIG1hdGNoZXMgb3IgaXMgYSBzdWJ0eXBlIG9mIGEgdHlwZQorICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIGFuZCBxdWFsaWZpY2F0aW9uIHBhdHRlcm4uCisgKiBSZXR1cm5zIEFDQ1VSQVRFX01BVENIIGlmIGl0IGRvZXMuCisgKiBSZXR1cm5zIElOQUNDVVJBVEVfTUFUQ0ggaWYgcmVzb2x2ZSBmYWlscworICogUmV0dXJucyBJTVBPU1NJQkxFX01BVENIIGlmIGl0IGRvZXNuJ3QuCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hMZXZlbEFzU3VidHlwZShSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuKSB7CisJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCisJaW50IGxldmVsOworCQorCS8vIG1hdGNoZXMgdHlwZQorCWlmICgobGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybiwgdHlwZSkpICE9IElNUE9TU0lCTEVfTUFUQ0gpCisJCXJldHVybiBsZXZlbDsKKwkKKwkvLyBtYXRjaGVzIHN1cGVyY2xhc3MKKwlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSAmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZS5jb21wb3VuZE5hbWUsIFR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVCkpIHsKKwkJaWYgKChsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEFzU3VidHlwZSh0eXBlLnN1cGVyY2xhc3MoKSwgc2ltcGxlTmFtZVBhdHRlcm4sIHF1YWxpZmljYXRpb25QYXR0ZXJuKSkgIT0gSU1QT1NTSUJMRV9NQVRDSCkgeworCQkJcmV0dXJuIGxldmVsOworCQl9CisJfQorCisJLy8gbWF0Y2hlcyBpbnRlcmZhY2VzCisJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOworCWlmIChpbnRlcmZhY2VzID09IG51bGwpIHsKKwkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoKGxldmVsID0gdGhpcy5tYXRjaExldmVsQXNTdWJ0eXBlKGludGVyZmFjZXNbaV0sIHNpbXBsZU5hbWVQYXR0ZXJuLCBxdWFsaWZpY2F0aW9uUGF0dGVybikpICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQlyZXR1cm4gbGV2ZWw7CisJCQl9OworCQl9CisJfQorCisJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIG9uZSBvZiB0aGUgZ2l2ZW4gZGVjbGFyaW5nIHR5cGVzIGlzIHRoZSBnaXZlbiByZWNlaXZlciB0eXBlLgorICogUmV0dXJucyBBQ0NVUkFURV9NQVRDSCBpZiBpdCBkb2VzLgorICogUmV0dXJucyBJTkFDQ1VSQVRFX01BVENIIGlmIHJlc29sdmUgZmFpbGVkLgorICogUmV0dXJucyBJTVBPU1NJQkxFX01BVENIIGlmIGl0IGRvZXNuJ3QuCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hMZXZlbEZvclR5cGUoY2hhcltdW11bXSBkZWNsYXJpbmdUeXBlcywgUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUpIHsKKwlpZiAocmVjZWl2ZXJUeXBlID09IG51bGwpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCWlmIChkZWNsYXJpbmdUeXBlcyA9PSBudWxsKSB7CisJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOyAvLyB3ZSB3ZXJlIG5vdCBhYmxlIHRvIGNvbXB1dGUgdGhlIGRlY2xhcmluZyB0eXBlcywgZGVmYXVsdCB0byBpbmFjY3VyYXRlCisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGRlY2xhcmluZ1R5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZGVjbGFyaW5nVHlwZXNbaV0sIHJlY2VpdmVyVHlwZS5jb21wb3VuZE5hbWUpKSB7CisJCQkJcmV0dXJuIEFDQ1VSQVRFX01BVENIOworCQkJfQorCQl9CisJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0KK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgYmluZGluZyBtYXRjaGVzIHRoZSBnaXZlbiBzaW1wbGUgbmFtZSBwYXR0ZXJuIAorICogYW5kIHF1YWxpZmljYXRpb24gcGF0dGVybi4KKyAqIFJldHVybnMgQUNDVVJBVEVfTUFUQ0ggaWYgaXQgZG9lcy4KKyAqIFJldHVybnMgSU5BQ0NVUkFURV9NQVRDSCBpZiByZXNvbHZlIGZhaWxlZC4KKyAqIFJldHVybnMgSU1QT1NTSUJMRV9NQVRDSCBpZiBpdCBkb2Vzbid0LgorICovCitwcm90ZWN0ZWQgaW50IG1hdGNoTGV2ZWxGb3JUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHF1YWxpZmljYXRpb25QYXR0ZXJuLCBUeXBlQmluZGluZyB0eXBlKSB7CisJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJY2hhcltdIHF1YWxpZmllZFBhY2thZ2VOYW1lID0gdHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpOworCWNoYXJbXSBxdWFsaWZpZWRTb3VyY2VOYW1lID0gCisJCXR5cGUgaW5zdGFuY2VvZiBMb2NhbFR5cGVCaW5kaW5nID8KKwkJCUNoYXJPcGVyYXRpb24uY29uY2F0KCIxIi50b0NoYXJBcnJheSgpLCB0eXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgJy4nKSA6IC8vJE5PTi1OTFMtMSQKKwkJCXR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCWlmICh0aGlzLm1hdGNoZXNUeXBlKAorCQkJc2ltcGxlTmFtZVBhdHRlcm4sIAorCQkJcXVhbGlmaWNhdGlvblBhdHRlcm4sIAorCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUubGVuZ3RoID09IDAgPyAKKwkJCQlxdWFsaWZpZWRTb3VyY2VOYW1lIDogCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIHF1YWxpZmllZFNvdXJjZU5hbWUsICcuJykpKSB7CisJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwl9IGVsc2UgeworCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlckludGVyZmFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY3ZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlckludGVyZmFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybiB7CitwdWJsaWMgU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuKGNoYXJbXSBzdXBlclF1YWxpZmljYXRpb24sIGNoYXJbXSBzdXBlclNpbXBsZU5hbWUsIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisJc3VwZXIoc3VwZXJRdWFsaWZpY2F0aW9uLCBzdXBlclNpbXBsZU5hbWUsIG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7CisJcmV0dXJuCisJCXRoaXMuZGVjb2RlZFN1cGVyQ2xhc3NPckludGVyZmFjZSA9PSBJSW5kZXhDb25zdGFudHMuSU5URVJGQUNFX1NVRkZJWAorCQkmJiBzdXBlci5tYXRjaEluZGV4RW50cnkoKTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJYnVmZmVyLmFwcGVuZCgiU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuOiA8Iik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoc3VwZXJTaW1wbGVOYW1lICE9IG51bGwpIGJ1ZmZlci5hcHBlbmQoc3VwZXJTaW1wbGVOYW1lKTsKKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDogCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwl9CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaGVzQmluYXJ5CisgKi8KK3B1YmxpYyBib29sZWFuIG1hdGNoZXNCaW5hcnkoT2JqZWN0IGJpbmFyeUluZm8sIE9iamVjdCBlbmNsb3NpbmdCaW5hcnlJbmZvKSB7CisJaWYgKCEoYmluYXJ5SW5mbyBpbnN0YW5jZW9mIElCaW5hcnlUeXBlKSkgcmV0dXJuIGZhbHNlOworCUlCaW5hcnlUeXBlIHR5cGUgPSAoSUJpbmFyeVR5cGUpYmluYXJ5SW5mbzsKKworCWNoYXJbXVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhcltdIHN1cGVySW50ZXJmYWNlTmFtZSA9IChjaGFyW10pc3VwZXJJbnRlcmZhY2VzW2ldLmNsb25lKCk7CisJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uoc3VwZXJJbnRlcmZhY2VOYW1lLCAnLycsICcuJyk7CisJCQlpZiAodGhpcy5tYXRjaGVzVHlwZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdGhpcy5zdXBlclF1YWxpZmljYXRpb24sIHN1cGVySW50ZXJmYWNlTmFtZSkpeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCS8vIHN1cGVyIGludGVyZmFjZXMKKwlpbnQgbGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOworCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSBiaW5kaW5nOworCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJJbnRlcmZhY2VzW2ldKTsKKwkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoKKwkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSAorCQkJCWxldmVsID0gbmV3TGV2ZWw7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzRkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5JVHlwZVJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmFyeVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU291cmNlVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZm9Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkluZGV4U2VhcmNoQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guUGF0aENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guUGF0dGVyblNlYXJjaEpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CisKKy8qKgorICogQ29sbGVjdHMgdGhlIHN1cGVyIHR5cGUgbmFtZXMgb2YgYSBnaXZlbiBkZWNsYXJpbmcgdHlwZS4KKyAqIFJldHVybnMgTk9UX0ZPVU5EX0RFQ0xBUklOR19UWVBFIGlmIHRoZSBkZWNsYXJpbmcgdHlwZSB3YXMgbm90IGZvdW5kLgorICogUmV0dXJucyBudWxsIGlmIHRoZSBkZWNsYXJpbmcgdHlwZSBwYXR0ZXJuIGRvZXNuJ3QgcmVxdWlyZSBhbiBleGFjdCBtYXRjaC4KKyAqLworcHVibGljIGNsYXNzIFN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3IgeworCU1ldGhvZFJlZmVyZW5jZVBhdHRlcm4gcGF0dGVybjsKKwlNYXRjaExvY2F0b3IgbG9jYXRvcjsKKwlJVHlwZSB0eXBlOyAKKwlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKKwljaGFyW11bXVtdIHJlc3VsdDsKKwlpbnQgcmVzdWx0SW5kZXg7CisJCisJCisvKioKKyAqIEFuIGFzdCB2aXNpdG9yIHRoYXQgdmlzaXRzIHR5cGUgZGVjbGFyYXRpb25zIGFuZCBtZW1iZXIgdHlwZSBkZWNsYXJhdGlvbnMKKyAqIGNvbGxlY3RpbmcgdGhlaXIgc3VwZXIgdHlwZSBuYW1lcy4KKyAqLworcHVibGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlciB7CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTG9jYWxUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nOworCQlpZiAoU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5tYXRjaGVzKHR5cGUpKSB7CisJCQlTdXBlclR5cGVOYW1lc0NvbGxlY3Rvci50aGlzLmNvbGxlY3RTdXBlclR5cGVOYW1lcyh0eXBlKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nOworCQlpZiAoU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5tYXRjaGVzKHR5cGUpKSB7CisJCQlTdXBlclR5cGVOYW1lc0NvbGxlY3Rvci50aGlzLmNvbGxlY3RTdXBlclR5cGVOYW1lcyh0eXBlKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0U2NvcGUgc2NvcGUpIHsKKwkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CisJCWlmIChTdXBlclR5cGVOYW1lc0NvbGxlY3Rvci50aGlzLm1hdGNoZXModHlwZSkpIHsKKwkJCVN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLnRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKHR5cGUpOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZURlY2xhcmF0aW9uLCAJQ2xhc3NTY29wZSBzY29wZSkgeworCQlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSBtZW1iZXJUeXBlRGVjbGFyYXRpb24uYmluZGluZzsKKwkJaWYgKFN1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLnRoaXMubWF0Y2hlcyh0eXBlKSkgeworCQkJU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IudGhpcy5jb2xsZWN0U3VwZXJUeXBlTmFtZXModHlwZSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgTWV0aG9kU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCB2aXNpdCBmaWVsZCBkZWNsYXJhdGlvbnMKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsIE1ldGhvZFNjb3BlIHNjb3BlKSB7CisJCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgaW5pdGlhbGl6ZXJzCisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1ldGhvZCBkZWNsYXJhdGlvbnMKKwl9Cit9CisJCitwdWJsaWMgU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IoCisJTWV0aG9kUmVmZXJlbmNlUGF0dGVybiBwYXR0ZXJuLAorCU1hdGNoTG9jYXRvciBsb2NhdG9yLAorCUlUeXBlIHR5cGUsIAorCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCQorCXRoaXMucGF0dGVybiA9IHBhdHRlcm47CisJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKwl0aGlzLnR5cGUgPSB0eXBlOworCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOworfQorCisvKgorICogUGFyc2UgdGhlIGdpdmVuIGNvbXBpYXRpb24gdW5pdCBhbmQgYnVpbGQgaXRzIHR5cGUgYmluZGluZ3MuCisgKiBEb24ndCBidWlsZCBtZXRob2RzIGFuZCBmaWVsZHMuCisgKi8KK3ByaXZhdGUgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gYnVpbGRCaW5kaW5ncyhJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJZmluYWwgSUZpbGUgZmlsZSA9IAorCQljb21waWxhdGlvblVuaXQuaXNXb3JraW5nQ29weSgpID8KKwkJCShJRmlsZSljb21waWxhdGlvblVuaXQuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgOgorCQkJKElGaWxlKWNvbXBpbGF0aW9uVW5pdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkKKwkvLyBnZXQgbWFpbiB0eXBlIG5hbWUKKwlmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKKwlmaW5hbCBjaGFyW10gbWFpblR5cGVOYW1lID0KKwkJZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gNSkudG9DaGFyQXJyYXkoKTsKKwkKKwkvLyBzb3VyY2UgdW5pdAorCUlCdWZmZXIgYnVmZmVyOworCWZpbmFsIGNoYXJbXSBzb3VyY2UgPSAKKwkJY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSA/CisJCQkoYnVmZmVyID0gY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpKSA9PSBudWxsID8gbnVsbCA6IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgOgorCQkJVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoZmlsZSk7CisJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAKKwkJbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7CisJCQkJcmV0dXJuIHNvdXJjZTsKKwkJCX0KKwkJCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJCQkJcmV0dXJuIGZpbGVOYW1lLnRvQ2hhckFycmF5KCk7CisJCQl9CisJCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwkJCQlyZXR1cm4gbWFpblR5cGVOYW1lOworCQkJfQorCQkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCQorCS8vIGRpZXQgcGFyc2UKKwlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCAwKTsKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gdGhpcy5sb2NhdG9yLnBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQpOworCWlmICh1bml0ICE9IG51bGwpIHsKKwkJdGhpcy5sb2NhdG9yLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOworCQl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgZmFsc2UpOworCX0KKwlyZXR1cm4gdW5pdDsKK30KK3ByaXZhdGUgQmluYXJ5VHlwZUJpbmRpbmcgY2FjaGVCaW5hcnlUeXBlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCUlUeXBlIGVuY2xvc2luZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7CisJCS8vIGZvcmNlIGNhY2hpbmcgb2YgZW5jbG9zaW5nIHR5cGVzIGZpcnN0LCBzbyB0aGF0IGJpbmFyeSB0eXBlIGNhbiBiZSBmb3VuZCBpbiBsb29rdXAgZW52aXJvbWVudAorCQl0aGlzLmNhY2hlQmluYXJ5VHlwZShlbmNsb3NpbmdUeXBlKTsKKwl9CisJSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChJQmluYXJ5VHlwZSkoKEJpbmFyeVR5cGUpdHlwZSkuZ2V0UmF3SW5mbygpOworCXJldHVybiB0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGJpbmFyeVR5cGUpOworfQorCitwcm90ZWN0ZWQgY2hhcltdW11bXSBjb2xsZWN0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCisJaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7CisJCS8vIENvbGxlY3QgdGhlIHBhdGhzIG9mIHRoZSBjdXMgdGhhdCBhcmUgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgZ2l2ZW4gdHlwZQorCQl0aGlzLnJlc3VsdCA9IG5ldyBjaGFyWzFdW11bXTsKKwkJdGhpcy5yZXN1bHRJbmRleCA9IDA7CisJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KXRoaXMudHlwZS5nZXRKYXZhUHJvamVjdCgpOworCQl0aGlzLmxvY2F0b3IuY3JlYXRlUGFyc2VyKGphdmFQcm9qZWN0KTsKKwkJc3luY2hyb25pemVkKHRoaXMubG9jYXRvci5uYW1lTG9va3VwKSB7IC8vIHByZXZlbnQgMiBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIG5hbWUgbG9va3VwIHdoaWxlIHRoZSB3b3JraW5nIGNvcGllcyBhcmUgc2V0CisJCQl0aGlzLmxvY2F0b3IubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZSh0aGlzLmxvY2F0b3Iud29ya2luZ0NvcGllcyk7CisJCQl0cnkgeworCQkJCWlmICh0aGlzLnR5cGUuaXNCaW5hcnkoKSkgeworCQkJCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5jYWNoZUJpbmFyeVR5cGUodGhpcy50eXBlKTsKKwkJCQkJdGhpcy5jb2xsZWN0U3VwZXJUeXBlTmFtZXMoYmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gdGhpcy50eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdGhpcy5idWlsZEJpbmRpbmdzKHVuaXQpOworCQkJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CisJCQkJCQlwYXJzZWRVbml0LnRyYXZlcnNlKG5ldyBUeXBlRGVjbGFyYXRpb25WaXNpdG9yKCksIHBhcnNlZFVuaXQuc2NvcGUpOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzcGF0aDogcmVwb3J0IGluYWN1cnJhdGUgbWF0Y2hlcworCQkJCXJldHVybiBudWxsOworCQkJfSBmaW5hbGx5IHsKKwkJCQl0aGlzLmxvY2F0b3IubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZShudWxsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5yZXN1bHQ7CisJfSBlbHNlIHsJCisJCS8vIENvbGxlY3QgdGhlIHBhdGhzIG9mIHRoZSBjdXMgdGhhdCBkZWNsYXJlIGEgdHlwZSB3aGljaCBtYXRjaGVzIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gKyBkZWNsYXJpbmdTaW1wbGVOYW1lCisJCVN0cmluZ1tdIHBhdGhzID0gdGhpcy5nZXRQYXRoc09mRGVjbGFyaW5nVHlwZSgpOworCQkKKwkJLy8gQ3JlYXRlIGJpbmRpbmdzIGZyb20gc291cmNlIHR5cGVzIGFuZCBiaW5hcnkgdHlwZXMKKwkJLy8gYW5kIGNvbGxlY3Qgc3VwZXIgdHlwZSBuYW1lcyBvZiB0aGUgdHlwZSBkZWNsYXJhdGlvbiAKKwkJLy8gdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gZGVjbGFyaW5nIHR5cGUKKwkJaWYgKHBhdGhzICE9IG51bGwpIHsKKwkJCVV0aWwuc29ydChwYXRocyk7IC8vIHNvcnQgYnkgcHJvamVjdHMKKwkJCUphdmFQcm9qZWN0IHByZXZpb3VzUHJvamVjdCA9IG51bGw7CisJCQl0aGlzLnJlc3VsdCA9IG5ldyBjaGFyWzFdW11bXTsKKwkJCXRoaXMucmVzdWx0SW5kZXggPSAwOworCQkJdHJ5IHsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGF0aHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCU9wZW5hYmxlIG9wZW5hYmxlID0gdGhpcy5sb2NhdG9yLmhhbmRsZUZhY3RvcnkuY3JlYXRlT3BlbmFibGUocGF0aHNbaV0pOworCQkJCQkJaWYgKG9wZW5hYmxlID09IG51bGwpCisJCQkJCQkJY29udGludWU7IC8vIG91dHNpZGUgY2xhc3NwYXRoCisJCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IG9wZW5hYmxlLmdldEphdmFQcm9qZWN0KCk7CisJCQkJCQlpZiAoIXByb2plY3QuZXF1YWxzKHByZXZpb3VzUHJvamVjdCkpIHsKKwkJCQkJCQlpZiAocHJldmlvdXNQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJdGhpcy5sb2NhdG9yLm5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobnVsbCk7CisJCQkJCQkJfQorCQkJCQkJCXByZXZpb3VzUHJvamVjdCA9IChKYXZhUHJvamVjdClwcm9qZWN0OworCQkJCQkJCXRoaXMubG9jYXRvci5jcmVhdGVQYXJzZXIocHJldmlvdXNQcm9qZWN0KTsKKwkJCQkJCQl0aGlzLmxvY2F0b3IubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZSh0aGlzLmxvY2F0b3Iud29ya2luZ0NvcGllcyk7CisJCQkJCQl9CisJCQkJCQlpZiAob3BlbmFibGUgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7CisJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKElDb21waWxhdGlvblVuaXQpb3BlbmFibGU7CisJCQkJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHRoaXMuYnVpbGRCaW5kaW5ncyh1bml0KTsKKwkJCQkJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CisJCQkJCQkJCXBhcnNlZFVuaXQudHJhdmVyc2UobmV3IFR5cGVEZWNsYXJhdGlvblZpc2l0b3IoKSwgcGFyc2VkVW5pdC5zY29wZSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChvcGVuYWJsZSBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpIHsKKwkJCQkJCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChJQ2xhc3NGaWxlKW9wZW5hYmxlOworCQkJCQkJCUJpbmFyeVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmNhY2hlQmluYXJ5VHlwZShjbGFzc0ZpbGUuZ2V0VHlwZSgpKTsKKwkJCQkJCQlpZiAodGhpcy5tYXRjaGVzKGJpbmRpbmcpKSB7CisJCQkJCQkJCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCQkvLyBpZ25vcmU6IGNvbnRpbnVlIHdpdGggbmV4dCBlbGVtZW50CisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBpZ25vcmU6IGNvbnRpbnVlIHdpdGggbmV4dCBlbGVtZW50CisJCQkJCX0KKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChwcmV2aW91c1Byb2plY3QgIT0gbnVsbCkgeworCQkJCQl0aGlzLmxvY2F0b3IubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZShudWxsKTsKKwkJCQl9CisJCQl9CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMucmVzdWx0LCAwLCB0aGlzLnJlc3VsdCA9IG5ldyBjaGFyW3RoaXMucmVzdWx0SW5kZXhdW11bXSwgMCwgdGhpcy5yZXN1bHRJbmRleCk7CisJCQlyZXR1cm4gdGhpcy5yZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoZXMoUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7CisJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmNvbXBvdW5kTmFtZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRoaXMubWF0Y2hlcyh0eXBlLmNvbXBvdW5kTmFtZSk7Cit9Citwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCWludCBsZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOworCWNoYXJbXSBzaW1wbGVOYW1lID0gY29tcG91bmROYW1lW2xlbmd0aC0xXTsKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSA9IHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lOworCWNoYXJbXSBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gdGhpcy5wYXR0ZXJuLmRlY2xhcmluZ1F1YWxpZmljYXRpb247CisJaW50IGxhc3QgPSBsZW5ndGggLSAxOworCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwpIHsKKwkJLy8gbW9zdCBmcmVxdWVudCBjYXNlOiBzaW1wbGUgbmFtZSBlcXVhbHMgbGFzdCBzZWdtZW50IG9mIGNvbXBvdW5kTmFtZQorCQlpZiAodGhpcy5wYXR0ZXJuLm1hdGNoZXNOYW1lKHNpbXBsZU5hbWUsIGRlY2xhcmluZ1NpbXBsZU5hbWUpKSB7CisJCQljaGFyW11bXSBxdWFsaWZpY2F0aW9uID0gbmV3IGNoYXJbbGFzdF1bXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkoY29tcG91bmROYW1lLCAwLCBxdWFsaWZpY2F0aW9uLCAwLCBsYXN0KTsKKwkJCXJldHVybiAKKwkJCQl0aGlzLnBhdHRlcm4ubWF0Y2hlc05hbWUoCisJCQkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24sIAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocXVhbGlmaWNhdGlvbiwgJy4nKSk7CisJCX0gZWxzZSBpZiAoIUNoYXJPcGVyYXRpb24uZW5kc1dpdGgoc2ltcGxlTmFtZSwgZGVjbGFyaW5nU2ltcGxlTmFtZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8vIG1lbWJlciB0eXBlIC0+IHRyYW5zZm9ybSBBLkIuQyREIGludG8gQS5CLkMuRAorCQkJU3lzdGVtLmFycmF5Y29weShjb21wb3VuZE5hbWUsIDAsIGNvbXBvdW5kTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCsxXVtdLCAwLCBsYXN0KTsKKwkJCWludCBkb2xsYXIgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJyQnLCBzaW1wbGVOYW1lKTsKKwkJCWlmIChkb2xsYXIgPT0gLTEpIHJldHVybiBmYWxzZTsKKwkJCWNvbXBvdW5kTmFtZVtsYXN0XSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2ltcGxlTmFtZSwgMCwgZG9sbGFyKTsKKwkJCWNvbXBvdW5kTmFtZVtsZW5ndGhdID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzaW1wbGVOYW1lLCBkb2xsYXIrMSwgc2ltcGxlTmFtZS5sZW5ndGgpOyAKKwkJCXJldHVybiB0aGlzLm1hdGNoZXMoY29tcG91bmROYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWNoYXJbXVtdIHF1YWxpZmljYXRpb24gPSBuZXcgY2hhcltsYXN0XVtdOworCQlTeXN0ZW0uYXJyYXljb3B5KGNvbXBvdW5kTmFtZSwgMCwgcXVhbGlmaWNhdGlvbiwgMCwgbGFzdCk7CisJCXJldHVybiAKKwkJCXRoaXMucGF0dGVybi5tYXRjaGVzTmFtZSgKKwkJCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAKKwkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgocXVhbGlmaWNhdGlvbiwgJy4nKSk7CisJfQorfQorcHJpdmF0ZSB2b2lkIGFkZFRvUmVzdWx0KGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgeworCWludCByZXN1bHRMZW5ndGggPSB0aGlzLnJlc3VsdC5sZW5ndGg7CisJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgeworCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5yZXN1bHRbaV0sIGNvbXBvdW5kTmFtZSkpIHsKKwkJCS8vIGFscmVhZHkga25vd24KKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAocmVzdWx0TGVuZ3RoID09IHRoaXMucmVzdWx0SW5kZXgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXRoaXMucmVzdWx0LCAKKwkJCTAsIAorCQkJdGhpcy5yZXN1bHQgPSBuZXcgY2hhcltyZXN1bHRMZW5ndGgqMl1bXVtdLCAKKwkJCTAsIAorCQkJcmVzdWx0TGVuZ3RoKTsKKwl9CisJdGhpcy5yZXN1bHRbdGhpcy5yZXN1bHRJbmRleCsrXSA9IGNvbXBvdW5kTmFtZTsKK30KKy8qKgorICogQ29sbGVjdHMgdGhlIG5hbWVzIG9mIGFsbCB0aGUgc3VwZXJ0eXBlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworcHJvdGVjdGVkIHZvaWQgY29sbGVjdFN1cGVyVHlwZU5hbWVzKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSkgeworCisJLy8gc3VwZXJjbGFzcworCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHR5cGUuc3VwZXJjbGFzcygpOworCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJdGhpcy5hZGRUb1Jlc3VsdChzdXBlcmNsYXNzLmNvbXBvdW5kTmFtZSk7CisJCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKHN1cGVyY2xhc3MpOworCX0KKworCS8vIGludGVyZmFjZXMKKwlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IHR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgaW50ZXJmYXNlID0gaW50ZXJmYWNlc1tpXTsKKwkJCXRoaXMuYWRkVG9SZXN1bHQoaW50ZXJmYXNlLmNvbXBvdW5kTmFtZSk7CisJCQl0aGlzLmNvbGxlY3RTdXBlclR5cGVOYW1lcyhpbnRlcmZhc2UpOworCQl9CisJfQorfQorCisKK3ByaXZhdGUgU3RyaW5nW10gZ2V0UGF0aHNPZkRlY2xhcmluZ1R5cGUoKSB7CisJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSB0aGlzLnBhdHRlcm4uZGVjbGFyaW5nUXVhbGlmaWNhdGlvbjsKKwljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSA9IHRoaXMucGF0dGVybi5kZWNsYXJpbmdTaW1wbGVOYW1lOworCWlmIChkZWNsYXJpbmdRdWFsaWZpY2F0aW9uICE9IG51bGwgfHwgZGVjbGFyaW5nU2ltcGxlTmFtZSAhPSBudWxsKSB7CisJCWZpbmFsIFBhdGhDb2xsZWN0b3IgcGF0aENvbGxlY3RvciA9IG5ldyBQYXRoQ29sbGVjdG9yKCk7CisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKTsKKwkKKwkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9ICgoSmF2YU1vZGVsTWFuYWdlcilKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKSkKKwkJCQkJCQkJCQkuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCWludCBkZXRhaWxMZXZlbCA9IElJbmZvQ29uc3RhbnRzLlBhdGhJbmZvOworCQlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBuZXcgVHlwZURlY2xhcmF0aW9uUGF0dGVybigKKwkJCWRlY2xhcmluZ1NpbXBsZU5hbWUgIT0gbnVsbCA/IG51bGwgOiBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCAvLyB1c2UgdGhlIHF1YWxpZmljYXRpb24gb25seSBpZiBubyBzaW1wbGUgbmFtZQorCQkJbnVsbCwgLy8gZG8gZmluZCBtZW1iZXIgdHlwZXMKKwkJCWRlY2xhcmluZ1NpbXBsZU5hbWUsCisJCQlJSW5kZXhDb25zdGFudHMuVFlQRV9TVUZGSVgsCisJCQl0aGlzLnBhdHRlcm4ubWF0Y2hNb2RlLCAKKwkJCXRydWUpOworCQlJSW5kZXhTZWFyY2hSZXF1ZXN0b3Igc2VhcmNoUmVxdWVzdG9yID0gbmV3IEluZGV4U2VhcmNoQWRhcHRlcigpeworCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3NEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCQkJaWYgKGVuY2xvc2luZ1R5cGVOYW1lcyAhPSBJSW5kZXhDb25zdGFudHMuT05FX1pFUk9fQ0hBUikgeyAvLyBmaWx0ZXIgb3V0IGxvY2FsIGFuZCBhbm9ueW1vdXMgY2xhc3NlcworCQkJCQlwYXRoQ29sbGVjdG9yLmFjY2VwdENsYXNzRGVjbGFyYXRpb24ocmVzb3VyY2VQYXRoLCBzaW1wbGVUeXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzLCBwYWNrYWdlTmFtZSk7CisJCQkJfQorCQkJfQkJCisJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJpbmcgcmVzb3VyY2VQYXRoLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisJCQkJaWYgKGVuY2xvc2luZ1R5cGVOYW1lcyAhPSBJSW5kZXhDb25zdGFudHMuT05FX1pFUk9fQ0hBUikgeyAvLyBmaWx0ZXIgb3V0IGxvY2FsIGFuZCBhbm9ueW1vdXMgY2xhc3NlcworCQkJCQlwYXRoQ29sbGVjdG9yLmFjY2VwdEludGVyZmFjZURlY2xhcmF0aW9uKHJlc291cmNlUGF0aCwgc2ltcGxlVHlwZU5hbWUsIGVuY2xvc2luZ1R5cGVOYW1lcywgcGFja2FnZU5hbWUpOworCQkJCX0KKwkJCX0JCQorCQl9OwkJCisKKwkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKAorCQkJbmV3IFBhdHRlcm5TZWFyY2hKb2IoCisJCQkJc2VhcmNoUGF0dGVybiwgCisJCQkJc2NvcGUsIAorCQkJCWRldGFpbExldmVsLCAKKwkJCQlzZWFyY2hSZXF1ZXN0b3IsIAorCQkJCWluZGV4TWFuYWdlciksCisJCQlJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwKKwkJCXByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxMDApKTsKKwkJcmV0dXJuIHBhdGhDb2xsZWN0b3IuZ2V0UGF0aHMoKTsKKworCX0KKwlyZXR1cm4gbnVsbDsKK30KKy8qCisgKiBAc2VlIElUeXBlUmVxdWVzdG9yI2FjY2VwdChJQmluYXJ5VHlwZSwgUGFja2FnZUJpbmRpbmcpCisgKi8KK3B1YmxpYyB2b2lkIGFjY2VwdChJQmluYXJ5VHlwZSBiaW5hcnlUeXBlLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgeworCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5jcmVhdGVCaW5hcnlUeXBlRnJvbShiaW5hcnlUeXBlLCBwYWNrYWdlQmluZGluZyk7Cit9CisKKy8qCisgKiBAc2VlIElUeXBlUmVxdWVzdG9yI2FjY2VwdChJQ29tcGlsYXRpb25Vbml0KQorICovCitwdWJsaWMgdm9pZCBhY2NlcHQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQpIHsKKwl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLmFib3J0RHVlVG9JbnRlcm5hbEVycm9yKAorCQluZXcgU3RyaW5nQnVmZmVyKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuYmluZCgiYWNjZXB0LmNhbm5vdCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKHNvdXJjZVVuaXQuZ2V0RmlsZU5hbWUoKSkKKwkJCS50b1N0cmluZygpKTsKK30KKworLyoKKyAqIEBzZWUgSVR5cGVSZXF1ZXN0b3IjYWNjZXB0KElTb3VyY2VUeXBlW10sIFBhY2thZ2VCaW5kaW5nKQorICovCitwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVHlwZXNbMF0uZ2V0RmlsZU5hbWUoKSwgMSwgMSwgMCk7CisJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoc291cmNlVHlwZXMsIGZhbHNlLCB0cnVlLCB0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCByZXN1bHQpOworCisJaWYgKHVuaXQgIT0gbnVsbCkgeworCQl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CisJCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncyh1bml0LCBmYWxzZSk7CisJfQorfQorCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkMzhhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworCitwdWJsaWMgY2xhc3MgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4geworCisJcHVibGljIGNoYXJbXSBzdXBlclF1YWxpZmljYXRpb247CisJcHVibGljIGNoYXJbXSBzdXBlclNpbXBsZU5hbWU7CisKKwlwcm90ZWN0ZWQgY2hhcltdIGRlY29kZWRTdXBlclF1YWxpZmljYXRpb247CisJcHJvdGVjdGVkIGNoYXJbXSBkZWNvZGVkU3VwZXJTaW1wbGVOYW1lOworCXByb3RlY3RlZCBjaGFyIGRlY29kZWRTdXBlckNsYXNzT3JJbnRlcmZhY2U7CisJcHJvdGVjdGVkIGNoYXJbXSBkZWNvZGVkUXVhbGlmaWNhdGlvbjsKKwlwcm90ZWN0ZWQgY2hhcltdIGRlY29kZWRTaW1wbGVOYW1lOworCXByb3RlY3RlZCBjaGFyW10gZGVjb2RlZEVuY2xvc2luZ1R5cGVOYW1lOworCXByb3RlY3RlZCBjaGFyIGRlY29kZWRDbGFzc09ySW50ZXJmYWNlOworCXByb3RlY3RlZCBpbnQgZGVjb2RlZE1vZGlmaWVyczsKKwkKKwkvKioKKwkgKiBBIG1hcCBmcm9tIEluZGV4SW5wdXRzIHRvIElFbnRyeVJlc3VsdFtdCisJICovCisJcHVibGljIEhhc2hNYXAgZW50cnlSZXN1bHRzOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIElFbnRyeVJlc3VsdFtdIE5PX0VOVFJZX1JFU1VMVCA9IG5ldyBJRW50cnlSZXN1bHRbMF07CisJCitwdWJsaWMgU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybigKKwljaGFyW10gc3VwZXJRdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBzdXBlclNpbXBsZU5hbWUsCisJaW50IG1hdGNoTW9kZSwgCisJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCXN1cGVyKG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKKworCXRoaXMuc3VwZXJRdWFsaWZpY2F0aW9uID0gaXNDYXNlU2Vuc2l0aXZlID8gc3VwZXJRdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzdXBlclF1YWxpZmljYXRpb24pOworCXRoaXMuc3VwZXJTaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gc3VwZXJTaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzdXBlclNpbXBsZU5hbWUpOworCQorCXRoaXMubmVlZHNSZXNvbHZlID0gc3VwZXJRdWFsaWZpY2F0aW9uICE9IG51bGw7Cit9CisvKgorICogc3VwZXJSZWYvT2JqZWN0L2phdmEubGFuZy9YL3AgKGkuZS4gY2xhc3MgcC5YIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCkKKyAqIHN1cGVyUmVmL0V4Y2VwdGlvbi8vWC9wIChpLmUuIGNsYXNzIHAuWCBleHRlbmRzIEV4Y2VwdGlvbikKKyAqLworcHVibGljIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpeworCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNsYXNoID0gU1VQRVJfUkVGLmxlbmd0aCAtIDE7CisJZGVjb2RlZFN1cGVyU2ltcGxlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgc2xhc2grMSwgc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCBzbGFzaCsxKSk7CisJaW50IG9sZFNsYXNoID0gc2xhc2g7CisJc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCBzbGFzaCsxKTsKKwlpZiAoc2xhc2ggPT0gb2xkU2xhc2grMSl7IC8vIGNvdWxkIG5vdCBoYXZlIGJlZW4ga25vd24gYXQgaW5kZXggdGltZQorCQlkZWNvZGVkU3VwZXJRdWFsaWZpY2F0aW9uID0gbnVsbDsKKwl9IGVsc2UgeworCQlkZWNvZGVkU3VwZXJRdWFsaWZpY2F0aW9uID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBvbGRTbGFzaCsxLCBzbGFzaCk7CisJfQorCWRlY29kZWRTdXBlckNsYXNzT3JJbnRlcmZhY2UgPSB3b3JkW3NsYXNoKzFdOworCXNsYXNoICs9IDI7CisJZGVjb2RlZFNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHNsYXNoKzEsIHNsYXNoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNFUEFSQVRPUiwgd29yZCwgc2xhc2grMSkpOworCW9sZFNsYXNoID0gc2xhc2g7CisJc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCBzbGFzaCsxKTsKKwlpZiAoc2xhc2ggPT0gb2xkU2xhc2grMSl7IC8vIGNvdWxkIG5vdCBoYXZlIGJlZW4ga25vd24gYXQgaW5kZXggdGltZQorCQlkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWUgPSBudWxsOworCX0gZWxzZSB7CisJCWlmIChzbGFzaCA9PSBvbGRTbGFzaCsyICYmIHdvcmRbb2xkU2xhc2grMV0gPT0gT05FX1pFUk9bMF0pIHsKKwkJCWRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZSA9IE9ORV9aRVJPOworCQl9IGVsc2UgeworCQkJZGVjb2RlZEVuY2xvc2luZ1R5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBvbGRTbGFzaCsxLCBzbGFzaCk7CisJCX0KKwl9CisJb2xkU2xhc2ggPSBzbGFzaDsKKwlzbGFzaCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIHdvcmQsIHNsYXNoKzEpOworCWlmIChzbGFzaCA9PSBvbGRTbGFzaCsxKXsgLy8gY291bGQgbm90IGhhdmUgYmVlbiBrbm93biBhdCBpbmRleCB0aW1lCisJCWRlY29kZWRRdWFsaWZpY2F0aW9uID0gbnVsbDsKKwl9IGVsc2UgeworCQlkZWNvZGVkUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkod29yZCwgb2xkU2xhc2grMSwgc2xhc2gpOworCX0KKwkKKwlkZWNvZGVkQ2xhc3NPckludGVyZmFjZSA9IHdvcmRbc2xhc2grMV07CisJZGVjb2RlZE1vZGlmaWVycyA9IChpbnQpd29yZFtzbGFzaCsyXTsKK30KK3B1YmxpYyB2b2lkIGZlZWRJbmRleFJlcXVlc3RvcihJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIGludFtdIHJlZmVyZW5jZXMsIEluZGV4SW5wdXQgaW5wdXQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlZmVyZW5jZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJSW5kZXhlZEZpbGUgZmlsZSA9IGlucHV0LmdldEluZGV4ZWRGaWxlKHJlZmVyZW5jZXNbaV0pOworCQlTdHJpbmcgcGF0aDsKKwkJaWYgKGZpbGUgIT0gbnVsbCAmJiBzY29wZS5lbmNsb3NlcyhwYXRoID0gSW5kZXhlZEZpbGUuY29udmVydFBhdGgoZmlsZS5nZXRQYXRoKCkpKSkgeworCQkJcmVxdWVzdG9yLmFjY2VwdFN1cGVyVHlwZVJlZmVyZW5jZShwYXRoLCBkZWNvZGVkUXVhbGlmaWNhdGlvbiwgZGVjb2RlZFNpbXBsZU5hbWUsIGRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZSwgZGVjb2RlZENsYXNzT3JJbnRlcmZhY2UsIGRlY29kZWRTdXBlclF1YWxpZmljYXRpb24sIGRlY29kZWRTdXBlclNpbXBsZU5hbWUsIGRlY29kZWRTdXBlckNsYXNzT3JJbnRlcmZhY2UsIGRlY29kZWRNb2RpZmllcnMpOworCQl9CisJfQorfQorLyoqCisgKiBRdWVyeSBhIGdpdmVuIGluZGV4IGZvciBtYXRjaGluZyBlbnRyaWVzLiAKKyAqLworcHVibGljIHZvaWQgZmluZEluZGV4TWF0Y2hlcyhJbmRleElucHV0IGlucHV0LCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBpbnQgZGV0YWlsTGV2ZWwsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmICh0aGlzLmVudHJ5UmVzdWx0cyA9PSBudWxsKSB7CisJCS8vIG5vbi1vcHRpbWl6ZWQgY2FzZQorCQlzdXBlci5maW5kSW5kZXhNYXRjaGVzKGlucHV0LCByZXF1ZXN0b3IsIGRldGFpbExldmVsLCBwcm9ncmVzc01vbml0b3IsIHNjb3BlKTsJCisJCXJldHVybjsKKwl9CisJCisJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQorCS8qIG5hcnJvdyBkb3duIGEgc2V0IG9mIGVudHJpZXMgdXNpbmcgcHJlZml4IGNyaXRlcmlhICovCisJSUVudHJ5UmVzdWx0W10gZW50cmllcyA9IChJRW50cnlSZXN1bHRbXSl0aGlzLmVudHJ5UmVzdWx0cy5nZXQoaW5wdXQpOworCWlmIChlbnRyaWVzID09IG51bGwpIHsKKwkJZW50cmllcyA9IGlucHV0LnF1ZXJ5RW50cmllc1ByZWZpeGVkQnkoU1VQRVJfUkVGKTsKKwkJaWYgKGVudHJpZXMgPT0gbnVsbCkgeworCQkJZW50cmllcyA9IE5PX0VOVFJZX1JFU1VMVDsKKwkJfQorCQl0aGlzLmVudHJ5UmVzdWx0cy5wdXQoaW5wdXQsIGVudHJpZXMpOworCX0KKwkKKwkvKiBvbmx5IHNlbGVjdCBlbnRyaWVzIHdoaWNoIGFjdHVhbGx5IG1hdGNoIHRoZSBlbnRpcmUgc2VhcmNoIHBhdHRlcm4gKi8KKwlpbnQgc2xhc2ggPSBTVVBFUl9SRUYubGVuZ3RoOworCWNoYXJbXSBzaW1wbGVOYW1lID0gdGhpcy5zdXBlclNpbXBsZU5hbWU7CisJaW50IGxlbmd0aCA9IHNpbXBsZU5hbWUgPT0gbnVsbCA/IDAgOiBzaW1wbGVOYW1lLmxlbmd0aDsKKwluZXh0RW50cnk6IGZvciAoaW50IGkgPSAwLCBtYXggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKwkJLyogY2hlY2sgdGhhdCB0aGUgZW50cnkgaXMgYSBzdXBlciByZWYgdG8gdGhlIHN1cGVyIHNpbXBsZSBuYW1lICovCisJCUlFbnRyeVJlc3VsdCBlbnRyeSA9IGVudHJpZXNbaV07CisJCWlmIChzaW1wbGVOYW1lICE9IG51bGwpIHsKKwkJCWNoYXJbXSB3b3JkID0gZW50cnkuZ2V0V29yZCgpOworCQkJaWYgKHNsYXNoICsgbGVuZ3RoID49IHdvcmQubGVuZ3RoKSBjb250aW51ZTsKKwkJCQorCQkJLy8gZW5zdXJlIHRoYXQncyB0aGUgZW5kIG9mIHRoZSByZWYgKGkuZS4gc2ltcGxlIG5hbWUgaXMgbm90IGEgcHJlZml4IG9mIHJlZikKKwkJCWlmICh3b3JkW2xlbmd0aCtzbGFzaF0gIT0gJy8nKSBjb250aW51ZTsgCisJCQkKKwkJCS8vIGNvbXBhcmUgcmVmIHRvIHNpbXBsZSBuYW1lCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJY2hhciB2YWx1ZSA9IHdvcmRbaitzbGFzaF07CisJCQkJaWYgKHZhbHVlICE9IHNpbXBsZU5hbWVbal0pIGNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCX0KKwkJfQorCQkKKwkJLyogcmV0cmlldmUgYW5kIGRlY29kZSBlbnRyeSAqLwkKKwkJdGhpcy5kZWNvZGVJbmRleEVudHJ5KGVudHJ5KTsKKwkJZmVlZEluZGV4UmVxdWVzdG9yKHJlcXVlc3RvciwgZGV0YWlsTGV2ZWwsIGVudHJ5LmdldEZpbGVSZWZlcmVuY2VzKCksIGlucHV0LCBzY29wZSk7CisJfQorfQorCisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmluZGV4RW50cnlQcmVmaXgoKQorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKXsKKwlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RSZWZlcmVuY2VQcmVmaXgoCisJCQlTVVBFUl9SRUYsCisJCQlzdXBlclNpbXBsZU5hbWUsIAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIENMQVNTOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIHR5cGUgbmFtZSBtYXRjaGVzICovCisJaWYgKHN1cGVyU2ltcGxlTmFtZSAhPSBudWxsKXsKKwkJc3dpdGNoKG1hdGNoTW9kZSl7CisJCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHN1cGVyU2ltcGxlTmFtZSwgZGVjb2RlZFN1cGVyU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhzdXBlclNpbXBsZU5hbWUsIGRlY29kZWRTdXBlclNpbXBsZU5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24ubWF0Y2goc3VwZXJTaW1wbGVOYW1lLCBkZWNvZGVkU3VwZXJTaW1wbGVOYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7CisJYnVmZmVyLmFwcGVuZCgiU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybjogPCIpOyAvLyROT04tTkxTLTEkCisJaWYgKHN1cGVyU2ltcGxlTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHN1cGVyU2ltcGxlTmFtZSk7CisJYnVmZmVyLmFwcGVuZCgiPiwgIik7IC8vJE5PTi1OTFMtMSQKKwlzd2l0Y2gobWF0Y2hNb2RlKXsKKwkJY2FzZSBFWEFDVF9NQVRDSCA6IAorCQkJYnVmZmVyLmFwcGVuZCgiZXhhY3QgbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicHJlZml4IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwYXR0ZXJuIG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJfQorCWlmIChpc0Nhc2VTZW5zaXRpdmUpCisJCWJ1ZmZlci5hcHBlbmQoImNhc2Ugc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwllbHNlCisJCWJ1ZmZlci5hcHBlbmQoImNhc2UgaW5zZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlc0JpbmFyeQorICovCitwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQmluYXJ5KE9iamVjdCBiaW5hcnlJbmZvLCBPYmplY3QgZW5jbG9zaW5nQmluYXJ5SW5mbykgeworCWlmICghKGJpbmFyeUluZm8gaW5zdGFuY2VvZiBJQmluYXJ5VHlwZSkpIHJldHVybiBmYWxzZTsKKwlJQmluYXJ5VHlwZSB0eXBlID0gKElCaW5hcnlUeXBlKWJpbmFyeUluZm87CisKKwljaGFyW10gdm1OYW1lID0gdHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpOworCWlmICh2bU5hbWUgIT0gbnVsbCkgeworCQljaGFyW10gc3VwZXJjbGFzc05hbWUgPSAoY2hhcltdKXZtTmFtZS5jbG9uZSgpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uodm1OYW1lLCAnLycsICcuJyk7CisJCWlmICh0aGlzLm1hdGNoZXNUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJjbGFzc05hbWUpKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCQorCWNoYXJbXVtdIHN1cGVySW50ZXJmYWNlcyA9IHR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKTsKKwlpZiAoc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJY2hhcltdIHN1cGVySW50ZXJmYWNlTmFtZSA9IChjaGFyW10pc3VwZXJJbnRlcmZhY2VzW2ldLmNsb25lKCk7CisJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uoc3VwZXJJbnRlcmZhY2VOYW1lLCAnLycsICcuJyk7CisJCQlpZiAodGhpcy5tYXRjaGVzVHlwZSh0aGlzLnN1cGVyU2ltcGxlTmFtZSwgdGhpcy5zdXBlclF1YWxpZmljYXRpb24sIHN1cGVySW50ZXJmYWNlTmFtZSkpeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAoIShub2RlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCisJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gKFR5cGVSZWZlcmVuY2Upbm9kZTsKKwlpZiAocmVzb2x2ZSkgeworCQlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZVJlZi5iaW5kaW5nOworCQlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgYmluZGluZyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGhpcy5zdXBlclNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXSB0eXBlUmVmU2ltcGxlTmFtZSA9IG51bGw7CisJCQlpZiAodHlwZVJlZiBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpIHsKKwkJCQl0eXBlUmVmU2ltcGxlTmFtZSA9ICgoU2luZ2xlVHlwZVJlZmVyZW5jZSl0eXBlUmVmKS50b2tlbjsKKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UKKwkJCQljaGFyW11bXSB0b2tlbnMgPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpdHlwZVJlZikudG9rZW5zOworCQkJCXR5cGVSZWZTaW1wbGVOYW1lID0gdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV07CisJCQl9CQkJCQorCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zdXBlclNpbXBsZU5hbWUsIHR5cGVSZWZTaW1wbGVOYW1lKSkKKwkJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJZWxzZQorCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQl9CisJfQorfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcpCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCisJLy8gc3VwZXIgY2xhc3MKKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgYmluZGluZzsKKwlpbnQgbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgdHlwZS5zdXBlcmNsYXNzKCkpOworCXN3aXRjaCAobGV2ZWwpIHsKKwkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJYnJlYWs7IC8vIHRyeSB0byBmaW5kIG1hdGNoIGluIHN1cGVyIGludGVyZmFjZXMKKwkJY2FzZSBBQ0NVUkFURV9NQVRDSDoKKwkJCXJldHVybiBBQ0NVUkFURV9NQVRDSDsKKwkJZGVmYXVsdDogLy8gaWUuIElOQUNDVVJBVEVfTUFUQ0gKKwkJCWJyZWFrOyAvLyB0cnkgdG8gZmluZCBhY2N1cmF0ZSBtYXRjaCBpbiBzdXBlciBpbnRlcmZhY2VzCisJfQorCisJLy8gc3VwZXIgaW50ZXJmYWNlcworCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOworCWZvciAoaW50IGkgPSAwLCBtYXggPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQlpbnQgbmV3TGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc3VwZXJTaW1wbGVOYW1lLCB0aGlzLnN1cGVyUXVhbGlmaWNhdGlvbiwgc3VwZXJJbnRlcmZhY2VzW2ldKTsKKwkJc3dpdGNoIChuZXdMZXZlbCkgeworCQkJY2FzZSBJTVBPU1NJQkxFX01BVENIOgorCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NVUkFURV9NQVRDSDoKKwkJCQlyZXR1cm4gQUNDVVJBVEVfTUFUQ0g7CisJCQlkZWZhdWx0OiAvLyBpZS4gSU5BQ0NVUkFURV9NQVRDSAorCQkJCWxldmVsID0gbmV3TGV2ZWw7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGxldmVsOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U4N2MzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwzMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5BYnN0cmFjdEluZGV4ZXI7CisKK3B1YmxpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybiB7CisKKwlwcml2YXRlIGNoYXJbXSBwa2c7CisJcHJpdmF0ZSBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXM7CisJcHJvdGVjdGVkIGNoYXJbXSBzaW1wbGVOYW1lOworCisJLy8gc2V0IHRvIENMQVNTX1NVRkZJWCBmb3Igb25seSBtYXRjaGluZyBjbGFzc2VzIAorCS8vIHNldCB0byBJTlRFUkZBQ0VfU1VGRklYIGZvciBvbmx5IG1hdGNoaW5nIGludGVyZmFjZXMKKwkvLyBzZXQgdG8gVFlQRV9TVUZGSVggZm9yIG1hdGNoaW5nIGJvdGggY2xhc3NlcyBhbmQgaW50ZXJmYWNlcworCXByb3RlY3RlZCBjaGFyIGNsYXNzT3JJbnRlcmZhY2U7IAorCisJcHJpdmF0ZSBjaGFyW10gZGVjb2RlZFBhY2thZ2U7CisJcHJpdmF0ZSBjaGFyW11bXSBkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzOworCXByb3RlY3RlZCBjaGFyW10gZGVjb2RlZFNpbXBsZU5hbWU7CisJcHJvdGVjdGVkIGNoYXIgZGVjb2RlZENsYXNzT3JJbnRlcmZhY2U7CisJCitwdWJsaWMgVHlwZURlY2xhcmF0aW9uUGF0dGVybihpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCXN1cGVyKG1hdGNoTW9kZSwgaXNDYXNlU2Vuc2l0aXZlKTsKK30KK3B1YmxpYyBUeXBlRGVjbGFyYXRpb25QYXR0ZXJuKAorCWNoYXJbXSBwa2csCisJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAorCWNoYXJbXSBzaW1wbGVOYW1lLAorCWNoYXIgY2xhc3NPckludGVyZmFjZSwKKwlpbnQgbWF0Y2hNb2RlLCAKKwlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJc3VwZXIobWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUpOworCisJdGhpcy5wa2cgPSBpc0Nhc2VTZW5zaXRpdmUgPyBwa2cgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHBrZyk7CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSB8fCBlbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCkgeworCQl0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcyA9IGVuY2xvc2luZ1R5cGVOYW1lczsKKwl9IGVsc2UgeworCQlpbnQgbGVuZ3RoID0gZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aDsKKwkJdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQkJdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXNbaV0gPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKGVuY2xvc2luZ1R5cGVOYW1lc1tpXSk7CisJCX0KKwl9CisJdGhpcy5zaW1wbGVOYW1lID0gaXNDYXNlU2Vuc2l0aXZlID8gc2ltcGxlTmFtZSA6IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc2ltcGxlTmFtZSk7CisJdGhpcy5jbGFzc09ySW50ZXJmYWNlID0gY2xhc3NPckludGVyZmFjZTsKKwkKKwl0aGlzLm5lZWRzUmVzb2x2ZSA9IHBrZyAhPSBudWxsICYmIGVuY2xvc2luZ1R5cGVOYW1lcyAhPSBudWxsOworfQorcHVibGljIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpeworCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNpemUgPSB3b3JkLmxlbmd0aDsKKworCXRoaXMuZGVjb2RlZENsYXNzT3JJbnRlcmZhY2UgPSB3b3JkW1RZUEVfREVDTF9MRU5HVEhdOworCWludCBvbGRTbGFzaCA9IFRZUEVfREVDTF9MRU5HVEgrMTsKKwlpbnQgc2xhc2ggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCBvbGRTbGFzaCsxKTsKKwlpZiAoc2xhc2ggPT0gb2xkU2xhc2grMSl7IAorCQl0aGlzLmRlY29kZWRQYWNrYWdlID0gTk9fQ0hBUjsKKwl9IGVsc2UgeworCQl0aGlzLmRlY29kZWRQYWNrYWdlID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBvbGRTbGFzaCsxLCBzbGFzaCk7CisJfQorCXRoaXMuZGVjb2RlZFNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHNsYXNoKzEsIHNsYXNoID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKFNFUEFSQVRPUiwgd29yZCwgc2xhc2grMSkpOworCisJaWYgKHNsYXNoKzEgPCBzaXplKXsKKwkJaWYgKHNsYXNoKzMgPT0gc2l6ZSAmJiB3b3JkW3NsYXNoKzFdID09IE9ORV9aRVJPWzBdKSB7CisJCQl0aGlzLmRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMgPSBPTkVfWkVST19DSEFSOworCQl9IGVsc2UgeworCQkJdGhpcy5kZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCBzbGFzaCsxLCBzaXplLTEpKTsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXMuZGVjb2RlZEVuY2xvc2luZ1R5cGVOYW1lcyA9IE5PX0NIQVJfQ0hBUjsKKwl9Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmZlZWRJbmRleFJlcXVlc3RvcgorICovCitwdWJsaWMgdm9pZCBmZWVkSW5kZXhSZXF1ZXN0b3IoSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgaW50IGRldGFpbExldmVsLCBpbnRbXSByZWZlcmVuY2VzLCBJbmRleElucHV0IGlucHV0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWJvb2xlYW4gaXNDbGFzcyA9IGRlY29kZWRDbGFzc09ySW50ZXJmYWNlID09IENMQVNTX1NVRkZJWDsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlJbmRleGVkRmlsZSBmaWxlID0gaW5wdXQuZ2V0SW5kZXhlZEZpbGUocmVmZXJlbmNlc1tpXSk7CisJCVN0cmluZyBwYXRoOworCQlpZiAoZmlsZSAhPSBudWxsICYmIHNjb3BlLmVuY2xvc2VzKHBhdGggPUluZGV4ZWRGaWxlLmNvbnZlcnRQYXRoKGZpbGUuZ2V0UGF0aCgpKSkpIHsKKwkJCWlmIChpc0NsYXNzKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzRGVjbGFyYXRpb24ocGF0aCwgZGVjb2RlZFNpbXBsZU5hbWUsIGRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMsIGRlY29kZWRQYWNrYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZURlY2xhcmF0aW9uKHBhdGgsIGRlY29kZWRTaW1wbGVOYW1lLCBkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzLCBkZWNvZGVkUGFja2FnZSk7CisJCQl9CisJCX0KKwl9Cit9CisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLmluZGV4RW50cnlQcmVmaXgoKQorICovCitwdWJsaWMgY2hhcltdIGluZGV4RW50cnlQcmVmaXgoKXsKKworCXJldHVybiBBYnN0cmFjdEluZGV4ZXIuYmVzdFR5cGVEZWNsYXJhdGlvblByZWZpeCgKKwkJCXBrZywKKwkJCXNpbXBsZU5hbWUsCisJCQljbGFzc09ySW50ZXJmYWNlLAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIENPTVBJTEFUSU9OX1VOSVQgfCBDTEFTUyB8IE1FVEhPRCB8IEZJRUxEOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hlc0JpbmFyeShPYmplY3QsIE9iamVjdCkKKyAqLworcHVibGljIGJvb2xlYW4gbWF0Y2hlc0JpbmFyeShPYmplY3QgYmluYXJ5SW5mbywgT2JqZWN0IGVuY2xvc2luZ0JpbmFyeUluZm8pIHsKKwlpZiAoIShiaW5hcnlJbmZvIGluc3RhbmNlb2YgSUJpbmFyeVR5cGUpKSByZXR1cm4gZmFsc2U7CisKKwlJQmluYXJ5VHlwZSB0eXBlID0gKElCaW5hcnlUeXBlKWJpbmFyeUluZm87CisKKwkvLyBmdWxseSBxdWFsaWZpZWQgbmFtZQorCWNoYXJbXSB0eXBlTmFtZSA9IChjaGFyW10pdHlwZS5nZXROYW1lKCkuY2xvbmUoKTsKKwlDaGFyT3BlcmF0aW9uLnJlcGxhY2UodHlwZU5hbWUsICcvJywgJy4nKTsKKwljaGFyW10gZW5jbG9zaW5nVHlwZU5hbWUgPSB0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcyA9PSBudWxsID8gbnVsbCA6IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLmVuY2xvc2luZ1R5cGVOYW1lcywgJy4nKTsKKwlpZiAoIXRoaXMubWF0Y2hlc1R5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnBrZywgZW5jbG9zaW5nVHlwZU5hbWUsIHR5cGVOYW1lKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8gY2xhc3Mgb3IgaW50ZXJmYWNlCisJc3dpdGNoICh0aGlzLmNsYXNzT3JJbnRlcmZhY2UpIHsKKwkJY2FzZSBDTEFTU19TVUZGSVg6CisJCQlpZiAodHlwZS5pc0ludGVyZmFjZSgpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIElOVEVSRkFDRV9TVUZGSVg6CisJCQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlicmVhazsKKwl9CisJCisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBiaW5kaW5nIG1hdGNoZXMgdGhlIGdpdmVuIHNpbXBsZSBuYW1lIHBhdHRlcm4gCisgKiBwYWNrYWdlIHBhdHRlcm4gYW5kIGVuY2xvc2luZyBuYW1lIHBhdHRlcm4uCisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoZXNUeXBlKGNoYXJbXSBzaW1wbGVOYW1lUGF0dGVybiwgY2hhcltdIHBrZ1BhdHRlcm4sIGNoYXJbXSBlbmNsb3NpbmdOYW1lUGF0dGVybiwgY2hhcltdIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKKwlpZiAoZW5jbG9zaW5nTmFtZVBhdHRlcm4gPT0gbnVsbCkgeworCQlyZXR1cm4gdGhpcy5tYXRjaGVzVHlwZShzaW1wbGVOYW1lUGF0dGVybiwgcGtnUGF0dGVybiwgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJfSBlbHNlIHsKKwkJY2hhcltdIHBhdHRlcm47CisJCWlmIChwa2dQYXR0ZXJuID09IG51bGwpIHsKKwkJCXBhdHRlcm4gPSBlbmNsb3NpbmdOYW1lUGF0dGVybjsKKwkJfSBlbHNlIHsKKwkJCXBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwa2dQYXR0ZXJuLCBlbmNsb3NpbmdOYW1lUGF0dGVybiwgJy4nKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5tYXRjaGVzVHlwZShzaW1wbGVOYW1lUGF0dGVybiwgcGF0dGVybiwgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJfQorfQorCisvKioKKyAqIHNlZSBTZWFyY2hQYXR0ZXJuLm1hdGNoSW5kZXhFbnRyeQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKXsKKworCS8qIGNoZWNrIGNsYXNzL2ludGVyZmFjZSBuYXR1cmUgKi8KKwlzd2l0Y2goY2xhc3NPckludGVyZmFjZSl7CisJCWNhc2UgQ0xBU1NfU1VGRklYIDoKKwkJY2FzZSBJTlRFUkZBQ0VfU1VGRklYIDoKKwkJCWlmIChjbGFzc09ySW50ZXJmYWNlICE9IGRlY29kZWRDbGFzc09ySW50ZXJmYWNlKSByZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQgOgorCX0KKwkvKiBjaGVjayBxdWFsaWZpY2F0aW9uIC0gZXhhY3QgbWF0Y2ggb25seSAqLworCWlmIChwa2cgIT0gbnVsbCAmJiAhQ2hhck9wZXJhdGlvbi5lcXVhbHMocGtnLCBkZWNvZGVkUGFja2FnZSwgaXNDYXNlU2Vuc2l0aXZlKSkKKwkJcmV0dXJuIGZhbHNlOworCS8qIGNoZWNrIGVuY2xvc2luZ1R5cGVOYW1lIC0gZXhhY3QgbWF0Y2ggb25seSAqLworCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCl7CisJCS8vIGVtcHR5IGNoYXJbXVtdIG1lYW5zIG5vIGVuY2xvc2luZyB0eXBlLCBpLmUuIHRoZSBkZWNvZGVkIG9uZSBpcyB0aGUgZW1wdHkgY2hhciBhcnJheQorCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA9PSAwKXsKKwkJCWlmIChkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzICE9IE5PX0NIQVJfQ0hBUikgcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhlbmNsb3NpbmdUeXBlTmFtZXMsIGRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMsIGlzQ2FzZVNlbnNpdGl2ZSkpIHJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkvKiBjaGVjayBzaW1wbGUgbmFtZSBtYXRjaGVzICovCisJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCl7CisJCXN3aXRjaChtYXRjaE1vZGUpeworCQkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaChzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOworCXN3aXRjaCAoY2xhc3NPckludGVyZmFjZSl7CisJCWNhc2UgQ0xBU1NfU1VGRklYIDoKKwkJCWJ1ZmZlci5hcHBlbmQoIkNsYXNzRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIElOVEVSRkFDRV9TVUZGSVggOgorCQkJYnVmZmVyLmFwcGVuZCgiSW50ZXJmYWNlRGVjbGFyYXRpb25QYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCWJ1ZmZlci5hcHBlbmQoIlR5cGVEZWNsYXJhdGlvblBhdHRlcm46IHBrZzwiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJfQorCWlmIChwa2cgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChwa2cpOworCWJ1ZmZlci5hcHBlbmQoIj4sIGVuY2xvc2luZzwiKTsgLy8kTk9OLU5MUy0xJAorCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGg7IGkrKyl7CisJCQlidWZmZXIuYXBwZW5kKGVuY2xvc2luZ1R5cGVOYW1lc1tpXSk7CisJCQlpZiAoaSA8IGVuY2xvc2luZ1R5cGVOYW1lcy5sZW5ndGggLSAxKQorCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKCI+LCB0eXBlPCIpOyAvLyROT04tTkxTLTEkCisJaWYgKHNpbXBsZU5hbWUgIT0gbnVsbCkgYnVmZmVyLmFwcGVuZChzaW1wbGVOYW1lKTsKKwlidWZmZXIuYXBwZW5kKCI+LCAiKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaChtYXRjaE1vZGUpeworCQljYXNlIEVYQUNUX01BVENIIDogCisJCQlidWZmZXIuYXBwZW5kKCJleGFjdCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQlidWZmZXIuYXBwZW5kKCJwcmVmaXggbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInBhdHRlcm4gbWF0Y2gsICIpOyAvLyROT04tTkxTLTEkCisJCQlicmVhazsKKwl9CisJaWYgKGlzQ2FzZVNlbnNpdGl2ZSkKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBzZW5zaXRpdmUiKTsgLy8kTk9OLU5MUy0xJAorCWVsc2UKKwkJYnVmZmVyLmFwcGVuZCgiY2FzZSBpbnNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEFzdE5vZGUsIGJvb2xlYW4pCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChBc3ROb2RlIG5vZGUsIGJvb2xlYW4gcmVzb2x2ZSkgeworCWlmICghKG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbilub2RlOworCisJaWYgKHJlc29sdmUpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCh0eXBlLmJpbmRpbmcpOworCX0gZWxzZSB7CisJCS8vIHR5cGUgbmFtZQorCQlpZiAodGhpcy5zaW1wbGVOYW1lICE9IG51bGwgJiYgIXRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0eXBlLm5hbWUpKQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCWVsc2UKKwkJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJfQorfQorCisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcpCisgKi8KK3B1YmxpYyBpbnQgbWF0Y2hMZXZlbChCaW5kaW5nIGJpbmRpbmcpIHsKKwlpZiAoYmluZGluZyA9PSBudWxsKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKwlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKworCVR5cGVCaW5kaW5nIHR5cGUgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKworCS8vIGNsYXNzIG9yIGludGVyZmFjZQorCXN3aXRjaCAodGhpcy5jbGFzc09ySW50ZXJmYWNlKSB7CisJCWNhc2UgQ0xBU1NfU1VGRklYOgorCQkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCWJyZWFrOworCQljYXNlIElOVEVSRkFDRV9TVUZGSVg6CisJCQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSkKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCWJyZWFrOworCX0KKworCS8vIGZ1bGx5IHF1YWxpZmllZCBuYW1lCisJY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lID0gdGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMgPT0gbnVsbCA/IG51bGwgOiBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodGhpcy5lbmNsb3NpbmdUeXBlTmFtZXMsICcuJyk7CisJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnBrZywgZW5jbG9zaW5nVHlwZU5hbWUsIHR5cGUpOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBiaW5kaW5nIG1hdGNoZXMgdGhlIGdpdmVuIHNpbXBsZSBuYW1lIHBhdHRlcm4gCisgKiBxdWFsaWZpY2F0aW9uIHBhdHRlcm4gYW5kIGVuY2xvc2luZyB0eXBlIG5hbWUgcGF0dGVybi4KKyAqLworcHJvdGVjdGVkIGludCBtYXRjaExldmVsRm9yVHlwZShjaGFyW10gc2ltcGxlTmFtZVBhdHRlcm4sIGNoYXJbXSBxdWFsaWZpY2F0aW9uUGF0dGVybiwgY2hhcltdIGVuY2xvc2luZ05hbWVQYXR0ZXJuLCBUeXBlQmluZGluZyB0eXBlKSB7CisJaWYgKGVuY2xvc2luZ05hbWVQYXR0ZXJuID09IG51bGwpIHsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUoc2ltcGxlTmFtZVBhdHRlcm4sIHF1YWxpZmljYXRpb25QYXR0ZXJuLCB0eXBlKTsKKwl9IGVsc2UgeworCQlpZiAocXVhbGlmaWNhdGlvblBhdHRlcm4gPT0gbnVsbCkgeworCQkJcmV0dXJuIG1hdGNoTGV2ZWxGb3JUeXBlKHNpbXBsZU5hbWVQYXR0ZXJuLCBlbmNsb3NpbmdOYW1lUGF0dGVybiwgdHlwZSk7CisJCX0gZWxzZSB7CisJCQkvLyBwYXR0ZXJuIHdhcyBjcmVhdGVkIGZyb20gYSBKYXZhIGVsZW1lbnQ6IHF1YWxpZmljYXRpb24gaXMgdGhlIHBhY2thZ2UgbmFtZS4KKwkJCWNoYXJbXSBmdWxsUXVhbGlmaWNhdGlvblBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChxdWFsaWZpY2F0aW9uUGF0dGVybiwgZW5jbG9zaW5nTmFtZVBhdHRlcm4sICcuJyk7CisJCQlpZiAoIENoYXJPcGVyYXRpb24uZXF1YWxzKHBrZywgQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHR5cGUuZ2V0UGFja2FnZSgpLmNvbXBvdW5kTmFtZSwgJy4nKSkpIHsKKwkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZShzaW1wbGVOYW1lUGF0dGVybiwgZnVsbFF1YWxpZmljYXRpb25QYXR0ZXJuLCB0eXBlKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQl9CisJCX0KKwl9Cit9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1YjA0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMCwwICsxLDY0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVOYW1lUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU2luZ2xlVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhlZEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuQWJzdHJhY3RJbmRleGVyOworCitwdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBNdWx0aXBsZVNlYXJjaFBhdHRlcm4geworCisJcHJpdmF0ZSBjaGFyW10gcXVhbGlmaWNhdGlvbjsKKwlwcml2YXRlIGNoYXJbXSBzaW1wbGVOYW1lOworCisJcHJpdmF0ZSBjaGFyW10gZGVjb2RlZFF1YWxpZmljYXRpb247CisJcHJpdmF0ZSBjaGFyW10gZGVjb2RlZFNpbXBsZU5hbWU7CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBUQUdTID0geyBUWVBFX1JFRiwgU1VQRVJfUkVGLCBSRUYsIENPTlNUUlVDVE9SX1JFRiB9OworCXByaXZhdGUgc3RhdGljIGNoYXJbXVtdIFJFRl9UQUdTID0geyBSRUYgfTsKKworCS8qIE9wdGltaXphdGlvbjogY2FzZSB3aGVyZSBzaW1wbGVOYW1lID09IG51bGwgKi8KKwlwcml2YXRlIGNoYXJbXVtdIHNlZ21lbnRzOworCXByaXZhdGUgaW50IGN1cnJlbnRTZWdtZW50OworCXByaXZhdGUgY2hhcltdIGRlY29kZWRTZWdtZW50OworCQorcHVibGljIFR5cGVSZWZlcmVuY2VQYXR0ZXJuKAorCWNoYXJbXSBxdWFsaWZpY2F0aW9uLAorCWNoYXJbXSBzaW1wbGVOYW1lLAorCWludCBtYXRjaE1vZGUsIAorCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisKKwlzdXBlcihtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CisKKwl0aGlzLnF1YWxpZmljYXRpb24gPSBpc0Nhc2VTZW5zaXRpdmUgPyBxdWFsaWZpY2F0aW9uIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShxdWFsaWZpY2F0aW9uKTsKKwl0aGlzLnNpbXBsZU5hbWUgPSBpc0Nhc2VTZW5zaXRpdmUgPyBzaW1wbGVOYW1lIDogQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzaW1wbGVOYW1lKTsKKworCWlmIChzaW1wbGVOYW1lID09IG51bGwpIHsKKwkJdGhpcy5zZWdtZW50cyA9IHF1YWxpZmljYXRpb24gPT0gbnVsbCA/IE9ORV9TVEFSX0NIQVIgOiBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBxdWFsaWZpY2F0aW9uKTsKKwl9CisJCisJdGhpcy5uZWVkc1Jlc29sdmUgPSBxdWFsaWZpY2F0aW9uICE9IG51bGw7Cit9CisvKioKKyAqIEVpdGhlciBkZWNvZGUgcmVmL25hbWUsIHR5cGVSZWYvbmFtZSBvciBzdXBlclJlZi9zdXBlck5hbWUvbmFtZQorICovIAorcHVibGljIHZvaWQgZGVjb2RlSW5kZXhFbnRyeShJRW50cnlSZXN1bHQgZW50cnlSZXN1bHQpeworCisJY2hhcltdIHdvcmQgPSBlbnRyeVJlc3VsdC5nZXRXb3JkKCk7CisJaW50IHNpemUgPSB3b3JkLmxlbmd0aDsKKwlpbnQgdGFnTGVuZ3RoID0gY3VycmVudFRhZy5sZW5ndGg7CisJaW50IG5hbWVMZW5ndGggPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoU0VQQVJBVE9SLCB3b3JkLCB0YWdMZW5ndGgpOworCWlmIChuYW1lTGVuZ3RoIDwgMCkgbmFtZUxlbmd0aCA9IHNpemU7CisJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCS8vIE9wdGltaXphdGlvbiwgZWcuIHR5cGUgcmVmZXJlbmNlIGlzICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJworCQl0aGlzLmRlY29kZWRTZWdtZW50ID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh3b3JkLCB0YWdMZW5ndGgsIG5hbWVMZW5ndGgpOworCX0gZWxzZSB7CisJCXRoaXMuZGVjb2RlZFNpbXBsZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHRhZ0xlbmd0aCwgbmFtZUxlbmd0aCk7CisJfQorfQorcHVibGljIHZvaWQgZmVlZEluZGV4UmVxdWVzdG9yKElJbmRleFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIGludCBkZXRhaWxMZXZlbCwgaW50W10gcmVmZXJlbmNlcywgSW5kZXhJbnB1dCBpbnB1dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAoY3VycmVudFRhZyA9PSBSRUYpIHsKKwkJZm91bmRBbWJpZ3VvdXNJbmRleE1hdGNoZXMgPSB0cnVlOworCX0KKwlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQlpbnQgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsKKwkJaWYgKHJlZmVyZW5jZSAhPSAtMSkgeyAvLyBpZiB0aGUgcmVmZXJlbmNlIGhhcyBub3QgYmVlbiBlbGltaW5hdGVkCisJCQlJbmRleGVkRmlsZSBmaWxlID0gaW5wdXQuZ2V0SW5kZXhlZEZpbGUocmVmZXJlbmNlKTsKKwkJCVN0cmluZyBwYXRoOworCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBzY29wZS5lbmNsb3NlcyhwYXRoID0gSW5kZXhlZEZpbGUuY29udmVydFBhdGgoZmlsZS5nZXRQYXRoKCkpKSkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRUeXBlUmVmZXJlbmNlKHBhdGgsIGRlY29kZWRTaW1wbGVOYW1lKTsKKwkJCX0KKwkJfQorCX0KK30KK3Byb3RlY3RlZCBjaGFyW11bXSBnZXRQb3NzaWJsZVRhZ3MoKXsKKwlpZiAodGhpcy5zaW1wbGVOYW1lID09IG51bGwpIHsKKwkJcmV0dXJuIFJFRl9UQUdTOworCX0gZWxzZSB7CisJCXJldHVybiBUQUdTOworCX0KK30KKy8qKgorICogQHNlZSBBbmRQYXR0ZXJuI2hhc05leHRRdWVyeQorICovCitwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0UXVlcnkoKSB7CisJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCS8vIE9wdGltaXphdGlvbiwgZWcuIHR5cGUgcmVmZXJlbmNlIGlzICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJworCQlpZiAodGhpcy5zZWdtZW50cy5sZW5ndGggPiAyKSB7CisJCQkvLyBpZiBwYWNrYWdlIGhhcyBtb3JlIHRoYW4gMiBzZWdtZW50cywgZG9uJ3QgbG9vayBhdCB0aGUgZmlyc3QgMiBzaW5jZSB0aGV5IGFyZSBtb3N0bHkKKwkJCS8vIHJlZHVuZGFudCAoZWcuIGluICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJywgJ29yZy5lY2xpcHNlIGlzIHVzZWQgYWxsIHRoZSB0aW1lKQorCQkJcmV0dXJuIC0tdGhpcy5jdXJyZW50U2VnbWVudCA+PSAyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC0tdGhpcy5jdXJyZW50U2VnbWVudCA+PSAwOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKy8qKgorICogc2VlIFNlYXJjaFBhdHRlcm4uaW5kZXhFbnRyeVByZWZpeCgpCisgKi8KK3B1YmxpYyBjaGFyW10gaW5kZXhFbnRyeVByZWZpeCgpeworCisJaWYgKHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsKSB7CisJCS8vIE9wdGltaXphdGlvbiwgZWcuIHR5cGUgcmVmZXJlbmNlIGlzICdvcmcuZWNsaXBzZS5qZHQuY29yZS4qJworCQlyZXR1cm4gQWJzdHJhY3RJbmRleGVyLmJlc3RSZWZlcmVuY2VQcmVmaXgoCisJCQlSRUYsCisJCQl0aGlzLnNlZ21lbnRzW3RoaXMuY3VycmVudFNlZ21lbnRdLAorCQkJbWF0Y2hNb2RlLCAKKwkJCWlzQ2FzZVNlbnNpdGl2ZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEFic3RyYWN0SW5kZXhlci5iZXN0UmVmZXJlbmNlUHJlZml4KAorCQkJY3VycmVudFRhZywKKwkJCXNpbXBsZU5hbWUsCisJCQltYXRjaE1vZGUsIAorCQkJaXNDYXNlU2Vuc2l0aXZlKTsKKwl9Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIENPTVBJTEFUSU9OX1VOSVQgfCBDTEFTUyB8IE1FVEhPRCB8IEZJRUxEOworfQorLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hJbmRleEVudHJ5CisgKi8KK3Byb3RlY3RlZCBib29sZWFuIG1hdGNoSW5kZXhFbnRyeSgpIHsKKworCS8qIGNoZWNrIHR5cGUgbmFtZSBtYXRjaGVzICovCisJaWYgKHNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkvLyBPcHRpbWl6YXRpb24sIGVnLiB0eXBlIHJlZmVyZW5jZSBpcyAnb3JnLmVjbGlwc2UuamR0LmNvcmUuKicKKwkJc3dpdGNoKG1hdGNoTW9kZSl7CisJCQljYXNlIEVYQUNUX01BVENIIDoKKwkJCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2VnbWVudHNbdGhpcy5jdXJyZW50U2VnbWVudF0sIHRoaXMuZGVjb2RlZFNlZ21lbnQsIGlzQ2FzZVNlbnNpdGl2ZSkpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQUkVGSVhfTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModGhpcy5zZWdtZW50c1t0aGlzLmN1cnJlbnRTZWdtZW50XSwgdGhpcy5kZWNvZGVkU2VnbWVudCwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaCh0aGlzLnNlZ21lbnRzW3RoaXMuY3VycmVudFNlZ21lbnRdLCB0aGlzLmRlY29kZWRTZWdtZW50LCBpc0Nhc2VTZW5zaXRpdmUpKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaChtYXRjaE1vZGUpeworCQkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaChzaW1wbGVOYW1lLCBkZWNvZGVkU2ltcGxlTmFtZSwgaXNDYXNlU2Vuc2l0aXZlKSl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaFJlcG9ydFJlZmVyZW5jZQorICovCitwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgeworCQl0aGlzLm1hdGNoUmVwb3J0UmVmZXJlbmNlKChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKXJlZmVyZW5jZSwgZWxlbWVudCwgYWNjdXJhY3ksIGxvY2F0b3IpOworCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQl0aGlzLm1hdGNoUmVwb3J0UmVmZXJlbmNlKChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXJlZmVyZW5jZSwgZWxlbWVudCwgYWNjdXJhY3ksIGxvY2F0b3IpOworCX0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgQXJyYXlUeXBlUmVmZXJlbmNlKSB7CisJCXRoaXMubWF0Y2hSZXBvcnRSZWZlcmVuY2UoKEFycmF5VHlwZVJlZmVyZW5jZSlyZWZlcmVuY2UsIGVsZW1lbnQsIGFjY3VyYWN5LCBsb2NhdG9yKTsKKwl9IGVsc2UgeworCQlzdXBlci5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVsZW1lbnQsIGFjY3VyYWN5LCBsb2NhdG9yKTsKKwl9Cit9CisvKioKKyAqIFJlcG9ydHMgdGhlIG1hdGNoIG9mIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UuCisgKi8KK3Byb3RlY3RlZCB2b2lkIG1hdGNoUmVwb3J0UmVmZXJlbmNlKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJY2hhcltdW10gdG9rZW5zID0gbnVsbDsKKwlCaW5kaW5nIGJpbmRpbmcgPSBxTmFtZVJlZi5iaW5kaW5nOworCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbDsKKwljaGFyW11bXSBuYW1lVG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOworCWludCBsYXN0SW5kZXggPSBuYW1lVG9rZW5zLmxlbmd0aC0xOworCXN3aXRjaCAocU5hbWVSZWYuYml0cyAmIEFzdE5vZGUuUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQljYXNlIEJpbmRpbmdJZHMuRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKKwkJCXR5cGVCaW5kaW5nID0gcU5hbWVSZWYuYWN0dWFsUmVjZWl2ZXJUeXBlOworCQkJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsJCQkKKwkJCWxhc3RJbmRleCAtPSBvdGhlckJpbmRpbmdzQ291bnQgKyAxOworCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZ0lkcy5UWVBFIDogLy89PT09PT09PT09PT09b25seSB0eXBlID09PT09PT09PT09PT09CisJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOworCQkJYnJlYWs7CisJCWNhc2UgQmluZGluZ0lkcy5WQVJJQUJMRSA6IC8vPT09PT09PT09PT09dW5ib3VuZCBjYXNlcz09PT09PT09PT09CisJCWNhc2UgQmluZGluZ0lkcy5UWVBFIHwgQmluZGluZ0lkcy5WQVJJQUJMRSA6CQkJCQkJCisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1CaW5kaW5nKSB7CisJCQkJUHJvYmxlbUJpbmRpbmcgcGJCaW5kaW5nID0gKFByb2JsZW1CaW5kaW5nKSBiaW5kaW5nOworCQkJCXR5cGVCaW5kaW5nID0gcGJCaW5kaW5nLnNlYXJjaFR5cGU7IC8vIHNlY29uZCBjaGFuY2Ugd2l0aCByZWNvcmRlZCB0eXBlIHNvIGZhcgorCQkJCWNoYXJbXSBwYXJ0aWFsUXVhbGlmaWVkTmFtZSA9IHBiQmluZGluZy5uYW1lOworCQkJCWxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcuJywgcGFydGlhbFF1YWxpZmllZE5hbWUpIC0gMTsgLy8gaW5kZXggb2YgbGFzdCBib3VuZCB0b2tlbiBpcyBvbmUgYmVmb3JlIHRoZSBwYiB0b2tlbgorCQkJfQorCQkJYnJlYWs7CisJfQorCS8vIHRyeSB0byBtYXRjaCBhbGwgZW5jbG9zaW5nIHR5cGVzIGZvciB3aGljaCB0aGUgdG9rZW4gbWF0Y2hlcyBhcyB3ZWxsLgorCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsICYmIGxhc3RJbmRleCA+PSAwKXsKKwkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCBuYW1lVG9rZW5zW2xhc3RJbmRleC0tXSkpIHsKKwkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKKwkJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7CisJCQkJdG9rZW5zID0gbmV3IGNoYXJbbGFzdEluZGV4KzJdW107CisJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lVG9rZW5zLCAwLCB0b2tlbnMsIDAsIGxhc3RJbmRleCsyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKXsKKwkJCXR5cGVCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVCaW5kaW5nKS5lbmNsb3NpbmdUeXBlKCk7CisJCX0gZWxzZSB7CisJCQl0eXBlQmluZGluZyA9IG51bGw7CisJCX0KKwl9IAorCWlmICh0b2tlbnMgPT0gbnVsbCkgeworCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZykgeworCQkJdG9rZW5zID0gbmV3IGNoYXJbXVtdIHt0aGlzLnNpbXBsZU5hbWV9OworCQl9IGVsc2UgeworCQkJdG9rZW5zID0gcU5hbWVSZWYudG9rZW5zOworCQl9CisJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCWludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQkJY2hhcltdW10gbG93ZXJDYXNlVG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXSB0b2tlbiA9IHRva2Vuc1tpXTsKKwkJCQlsb3dlckNhc2VUb2tlbnNbaV0gPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHRva2VuKTsKKwkJCX0KKwkJCXRva2VucyA9IGxvd2VyQ2FzZVRva2VuczsKKwkJfQorCX0KKwlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKHFOYW1lUmVmLnNvdXJjZVN0YXJ0LCBxTmFtZVJlZi5zb3VyY2VFbmQsIHRva2VucywgZWxlbWVudCwgYWNjdXJhY3kpOworfQorLyoqCisgKiBSZXBvcnRzIHRoZSBtYXRjaCBvZiB0aGUgZ2l2ZW4gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlLgorICovCitwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHFUeXBlUmVmLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWNoYXJbXVtdIHRva2VucyA9IG51bGw7CisJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBxVHlwZVJlZi5iaW5kaW5nOworCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgeworCQl0eXBlQmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKXR5cGVCaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZTsKKwl9CisJY2hhcltdW10gdHlwZVRva2VucyA9IHFUeXBlUmVmLnRva2VuczsKKwlpbnQgbGFzdEluZGV4ID0gdHlwZVRva2Vucy5sZW5ndGgtMTsKKwkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4KKwl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCl7CisJCWlmIChtYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHR5cGVUb2tlbnNbbGFzdEluZGV4LS1dKSkgeworCQkJaW50IGxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOworCQkJaWYgKGxldmVsICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQl0b2tlbnMgPSBuZXcgY2hhcltsYXN0SW5kZXgrMl1bXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVUb2tlbnMsIDAsIHRva2VucywgMCwgbGFzdEluZGV4KzIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpeworCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsKKwkJfSBlbHNlIHsKKwkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJfQorCX0KKwlpZiAodG9rZW5zID09IG51bGwpIHsKKwkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgdHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtUmVmZXJlbmNlQmluZGluZykgeworCQkJdG9rZW5zID0gbmV3IGNoYXJbXVtdIHt0aGlzLnNpbXBsZU5hbWV9OworCQl9IGVsc2UgeworCQkJdG9rZW5zID0gcVR5cGVSZWYudG9rZW5zOworCQl9CisJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCWludCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQkJY2hhcltdW10gbG93ZXJDYXNlVG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWNoYXJbXSB0b2tlbiA9IHRva2Vuc1tpXTsKKwkJCQlsb3dlckNhc2VUb2tlbnNbaV0gPSBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHRva2VuKTsKKwkJCX0KKwkJCXRva2VucyA9IGxvd2VyQ2FzZVRva2VuczsKKwkJfQorCX0KKwlsb2NhdG9yLnJlcG9ydEFjY3VyYXRlUmVmZXJlbmNlKHFUeXBlUmVmLnNvdXJjZVN0YXJ0LCBxVHlwZVJlZi5zb3VyY2VFbmQsIHRva2VucywgZWxlbWVudCwgYWNjdXJhY3kpOworfQorLyoqCisgKiBAc2VlIEFuZFBhdHRlcm4jcmVzZXRRdWVyeQorICovCitwcm90ZWN0ZWQgdm9pZCByZXNldFF1ZXJ5KCkgeworCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkvKiB3YWxrIHRoZSBzZWdtZW50cyBmcm9tIGVuZCB0byBzdGFydCBhcyBpdCB3aWxsIGZpbmQgbGVzcyBwb3RlbnRpYWwgcmVmZXJlbmNlcyB1c2luZyAnbGFuZycgdGhhbiAnamF2YScgKi8KKwkJdGhpcy5jdXJyZW50U2VnbWVudCA9IHRoaXMuc2VnbWVudHMubGVuZ3RoIC0gMTsKKwl9Cit9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjApOworCWJ1ZmZlci5hcHBlbmQoIlR5cGVSZWZlcmVuY2VQYXR0ZXJuOiBwa2c8Iik7IC8vJE5PTi1OTFMtMSQKKwlpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHF1YWxpZmljYXRpb24pOworCWJ1ZmZlci5hcHBlbmQoIj4sIHR5cGU8Iik7IC8vJE5PTi1OTFMtMSQKKwlpZiAoc2ltcGxlTmFtZSAhPSBudWxsKSBidWZmZXIuYXBwZW5kKHNpbXBsZU5hbWUpOworCWJ1ZmZlci5hcHBlbmQoIj4sICIpOyAvLyROT04tTkxTLTEkCisJc3dpdGNoKG1hdGNoTW9kZSl7CisJCWNhc2UgRVhBQ1RfTUFUQ0ggOiAKKwkJCWJ1ZmZlci5hcHBlbmQoImV4YWN0IG1hdGNoLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgUFJFRklYX01BVENIIDoKKwkJCWJ1ZmZlci5hcHBlbmQoInByZWZpeCBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJYnVmZmVyLmFwcGVuZCgicGF0dGVybiBtYXRjaCwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCWJyZWFrOworCX0KKwlpZiAoaXNDYXNlU2Vuc2l0aXZlKQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIHNlbnNpdGl2ZSIpOyAvLyROT04tTkxTLTEkCisJZWxzZQorCQlidWZmZXIuYXBwZW5kKCJjYXNlIGluc2Vuc2l0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoTGV2ZWwoQXN0Tm9kZSwgYm9vbGVhbikKKyAqLworcHVibGljIGludCBtYXRjaExldmVsKEFzdE5vZGUgbm9kZSwgYm9vbGVhbiByZXNvbHZlKSB7CisJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKFR5cGVSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7CisJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgeworCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChOYW1lUmVmZXJlbmNlKW5vZGUsIHJlc29sdmUpOworCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgeworCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChJbXBvcnRSZWZlcmVuY2Upbm9kZSwgcmVzb2x2ZSk7CisJfQorCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBpbXBvcnQgcmVmZXJlbmNlLgorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4KKyAqLworcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmLCBib29sZWFuIHJlc29sdmUpIHsKKworCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHJldHVybiBJTVBPU1NJQkxFX01BVENIOworCisJY2hhcltdW10gdG9rZW5zID0gaW1wb3J0UmVmLnRva2VuczsKKwlpbnQgaW1wb3J0TGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKKwkKKwlpZiAodGhpcy5xdWFsaWZpY2F0aW9uICE9IG51bGwpIHsKKwkJY2hhcltdIHBhdHRlcm47CisJCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkJcGF0dGVybiA9IHRoaXMucXVhbGlmaWNhdGlvbjsKKwkJfSBlbHNlIHsKKwkJCXBhdHRlcm4gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0aGlzLnF1YWxpZmljYXRpb24sIHRoaXMuc2ltcGxlTmFtZSwgJy4nKTsKKwkJfQorCQljaGFyW10gcXVhbGlmaWVkVHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoaW1wb3J0UmVmLnRva2VucywgJy4nKTsKKwkJc3dpdGNoICh0aGlzLm1hdGNoTW9kZSkgeworCQkJY2FzZSBFWEFDVF9NQVRDSCA6CisJCQljYXNlIFBSRUZJWF9NQVRDSCA6CisJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHBhdHRlcm4sIHF1YWxpZmllZFR5cGVOYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQkJcmV0dXJuIFBPU1NJQkxFX01BVENIOworCQkJCX0gCisJCQkJYnJlYWs7CisJCQljYXNlIFBBVFRFUk5fTUFUQ0g6CisJCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2gocGF0dGVybiwgcXVhbGlmaWVkVHlwZU5hbWUsIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCX0gZWxzZSB7CisJCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0TGVuZ3RoOyBpKyspeworCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2ldKSl7CisJCQkJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKwl9Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdHlwZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgcmVmZXJlbmNlLgorICogTG9vayBhdCByZXNvbHZlZCBpbmZvcm1hdGlvbiBvbmx5IGlmIHNwZWNpZmllZC4KKyAqLworcHJpdmF0ZSBpbnQgbWF0Y2hMZXZlbChOYW1lUmVmZXJlbmNlIG5hbWVSZWYsIGJvb2xlYW4gcmVzb2x2ZSkgeworCWlmICghcmVzb2x2ZSkgeworCQlpZiAodGhpcy5zaW1wbGVOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJCX0gZWxzZSB7CisJCQlpZiAobmFtZVJlZiBpbnN0YW5jZW9mIFNpbmdsZU5hbWVSZWZlcmVuY2UpIHsKKwkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsICgoU2luZ2xlTmFtZVJlZmVyZW5jZSluYW1lUmVmKS50b2tlbikpIHsKKwkJCQkJLy8gY2FuIG9ubHkgYmUgYSBwb3NzaWJsZSBtYXRjaCBzaW5jZSByZXNvbHV0aW9uIGlzIG5lZWRlZCAKKwkJCQkJLy8gdG8gZmluZCBvdXQgaWYgaXQgaXMgYSB0eXBlIHJlZgorCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQkJfQorCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQorCQkJCWNoYXJbXVtdIHRva2VucyA9ICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmKS50b2tlbnM7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRva2Vucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2ldKSkgeworCQkJCQkJLy8gY2FuIG9ubHkgYmUgYSBwb3NzaWJsZSBtYXRjaCBzaW5jZSByZXNvbHV0aW9uIGlzIG5lZWRlZCAKKwkJCQkJCS8vIHRvIGZpbmQgb3V0IGlmIGl0IGlzIGEgdHlwZSByZWYKKwkJCQkJCXJldHVybiBQT1NTSUJMRV9NQVRDSDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCX0JCQkJCisJCX0KKwl9IGVsc2UgeworCQlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lUmVmLmJpbmRpbmc7CisKKwkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZyl7CisJCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykgeworCQkJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCAoVHlwZUJpbmRpbmcpIGJpbmRpbmcpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsgLy8gbXVzdCBiZSBhIHR5cGUgYmluZGluZworCQkJfQorCQl9IGVsc2UgeyAvLyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlCisJCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG51bGw7CisJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHFOYW1lUmVmID0gKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpbmFtZVJlZjsKKwkJCWNoYXJbXVtdIHRva2VucyA9IHFOYW1lUmVmLnRva2VuczsKKwkJCWludCBsYXN0SW5kZXggPSB0b2tlbnMubGVuZ3RoLTE7CisJCQlzd2l0Y2ggKHFOYW1lUmVmLmJpdHMgJiBBc3ROb2RlLlJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCQljYXNlIEJpbmRpbmdJZHMuRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKKwkJCQkJdHlwZUJpbmRpbmcgPSBuYW1lUmVmLmFjdHVhbFJlY2VpdmVyVHlwZTsKKwkJCQkJLy8gbm8gdmFsaWQgbWF0Y2ggYW1vbmdzdCBmaWVsZHMKKwkJCQkJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsJCQkKKwkJCQkJbGFzdEluZGV4IC09IG90aGVyQmluZGluZ3NDb3VudCArIDE7CisJCQkJCWlmIChsYXN0SW5kZXggPCAwKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBCaW5kaW5nSWRzLkxPQ0FMIDogLy8gcmVhZGluZyBhIGxvY2FsIHZhcmlhYmxlCisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOyAvLyBubyB0eXBlIG1hdGNoIGluIGl0CisJCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KKwkJCQkJdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKwkJCQkJYnJlYWs7CisJCQkJLyoKKwkJCQkgKiBIYW5kbGluZyBvZiB1bmJvdW5kIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZXMuIFRoZSBtYXRjaCBtYXkgcmVzaWRlIGluIHRoZSByZXNvbHZlZCBmcmFnbWVudCwKKwkJCQkgKiB3aGljaCBpcyByZWNvcmRlZCBpbnNpZGUgdGhlIHByb2JsZW0gYmluZGluZywgYWxvbmcgd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgbmFtZSB1bnRpbCBpdCBiZWNhbWUgYSBwcm9ibGVtLgorCQkJCSAqLworCQkJCWNhc2UgQmluZGluZ0lkcy5WQVJJQUJMRSA6IC8vPT09PT09PT09PT09dW5ib3VuZCBjYXNlcz09PT09PT09PT09CisJCQkJY2FzZSBCaW5kaW5nSWRzLlRZUEUgfCBCaW5kaW5nSWRzLlZBUklBQkxFIDoJCQkJCQkKKwkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZykgeworCQkJCQkJUHJvYmxlbUJpbmRpbmcgcGJCaW5kaW5nID0gKFByb2JsZW1CaW5kaW5nKSBiaW5kaW5nOworCQkJCQkJdHlwZUJpbmRpbmcgPSBwYkJpbmRpbmcuc2VhcmNoVHlwZTsgLy8gc2Vjb25kIGNoYW5jZSB3aXRoIHJlY29yZGVkIHR5cGUgc28gZmFyCisJCQkJCQljaGFyW10gcGFydGlhbFF1YWxpZmllZE5hbWUgPSBwYkJpbmRpbmcubmFtZTsKKwkJCQkJCWxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcuJywgcGFydGlhbFF1YWxpZmllZE5hbWUpIC0gMTsgLy8gaW5kZXggb2YgbGFzdCBib3VuZCB0b2tlbiBpcyBvbmUgYmVmb3JlIHRoZSBwYiB0b2tlbgorCQkJCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgbGFzdEluZGV4IDwgMCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLyB0cnkgdG8gbWF0Y2ggYWxsIGVuY2xvc2luZyB0eXBlcyBmb3Igd2hpY2ggdGhlIHRva2VuIG1hdGNoZXMgYXMgd2VsbC4KKwkJCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsICYmIGxhc3RJbmRleCA+PSAwKXsKKwkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHRva2Vuc1tsYXN0SW5kZXgtLV0pKSB7CisJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKKwkJCQkJaWYgKGxldmVsICE9IElNUE9TU0lCTEVfTUFUQ0gpIHsKKwkJCQkJCXJldHVybiBsZXZlbDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKXsKKwkJCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0eXBlQmluZGluZyA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCX0KKwl9Cit9CisKKy8qKgorICogUmVwb3J0cyB0aGUgbWF0Y2ggb2YgdGhlIGdpdmVuIGFycmF5IHR5cGUgcmVmZXJlbmNlLgorICovCitwcm90ZWN0ZWQgdm9pZCBtYXRjaFJlcG9ydFJlZmVyZW5jZShBcnJheVR5cGVSZWZlcmVuY2UgYXJyYXlSZWYsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3ksIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJY2hhcltdW10gdG9rZW5zID0gdGhpcy5zaW1wbGVOYW1lID09IG51bGwgPyBOT19DSEFSX0NIQVIgOiBuZXcgY2hhcltdW10ge3RoaXMuc2ltcGxlTmFtZX07CisJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZShhcnJheVJlZi5zb3VyY2VTdGFydCwgYXJyYXlSZWYuc291cmNlRW5kLCB0b2tlbnMsIGVsZW1lbnQsIGFjY3VyYWN5KTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gdHlwZSByZWZlcmVuY2UuCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLgorICovCitwcml2YXRlIGludCBtYXRjaExldmVsKFR5cGVSZWZlcmVuY2UgdHlwZVJlZiwgYm9vbGVhbiByZXNvbHZlKSB7CisJaWYgKCFyZXNvbHZlKSB7CisJCWlmICh0aGlzLnNpbXBsZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubmVlZHNSZXNvbHZlID8gUE9TU0lCTEVfTUFUQ0ggOiBBQ0NVUkFURV9NQVRDSDsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlUmVmIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgKChTaW5nbGVUeXBlUmVmZXJlbmNlKXR5cGVSZWYpLnRva2VuKSkgeworCQkJCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJCX0KKwkJCX0gZWxzZSB7IC8vIFF1YWxpZmllZFR5cGVSZWZlcmVuY2UKKwkJCQljaGFyW11bXSB0b2tlbnMgPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpdHlwZVJlZikudG9rZW5zOworCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0b2tlbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLnNpbXBsZU5hbWUsIHRva2Vuc1tpXSkpIHsKKwkJCQkJCS8vIGNhbiBvbmx5IGJlIGEgcG9zc2libGUgbWF0Y2ggc2luY2UgcmVzb2x1dGlvbiBpcyBuZWVkZWQgCisJCQkJCQkvLyB0byBmaW5kIG91dCBpZiBpdCBpcyBhIHR5cGUgcmVmCisJCQkJCQlyZXR1cm4gUE9TU0lCTEVfTUFUQ0g7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJCQl9CQkJCQorCQl9IAorCX0gZWxzZSB7CisJCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZVJlZi5iaW5kaW5nOworCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOworCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKXsKKwkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOworCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkVHlwZVJlZmVyZW5jZQorCQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcVR5cGVSZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSl0eXBlUmVmOworCQkJCWNoYXJbXVtdIHRva2VucyA9IHFUeXBlUmVmLnRva2VuczsKKwkJCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOworCQkJCS8vIHRyeSB0byBtYXRjaCBhbGwgZW5jbG9zaW5nIHR5cGVzIGZvciB3aGljaCB0aGUgdG9rZW4gbWF0Y2hlcyBhcyB3ZWxsLgorCQkJCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsICYmIGxhc3RJbmRleCA+PSAwKXsKKwkJCQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2xhc3RJbmRleC0tXSkpIHsKKwkJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKKwkJCQkJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7CisJCQkJCQkJcmV0dXJuIGxldmVsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpeworCQkJCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJCX0gCisJCX0KKwkJCQorCX0KK30KKy8qKgorICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoUmVwb3J0SW1wb3J0UmVmKEltcG9ydFJlZmVyZW5jZSwgQmluZGluZywgSUphdmFFbGVtZW50LCBpbnQsIE1hdGNoTG9jYXRvcikKKyAqLworcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRJbXBvcnRSZWYoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgQmluZGluZyBiaW5kaW5nLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOworCWNoYXJbXVtdIHRva2VucyA9IG51bGw7CisJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCXR5cGVCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpYmluZGluZzsKKwl9CisJY2hhcltdW10gdHlwZVRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7CisJaW50IGxhc3RJbmRleCA9IHR5cGVUb2tlbnMubGVuZ3RoLTE7CisJLy8gdHJ5IHRvIG1hdGNoIGFsbCBlbmNsb3NpbmcgdHlwZXMgZm9yIHdoaWNoIHRoZSB0b2tlbiBtYXRjaGVzIGFzIHdlbGwuCisJd2hpbGUgKHR5cGVCaW5kaW5nICE9IG51bGwgJiYgbGFzdEluZGV4ID49IDApeworCQlpZiAobWF0Y2hlc05hbWUodGhpcy5zaW1wbGVOYW1lLCB0eXBlVG9rZW5zW2xhc3RJbmRleC0tXSkpIHsKKwkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKKwkJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7CisJCQkJdG9rZW5zID0gbmV3IGNoYXJbbGFzdEluZGV4KzJdW107CisJCQkJU3lzdGVtLmFycmF5Y29weSh0eXBlVG9rZW5zLCAwLCB0b2tlbnMsIDAsIGxhc3RJbmRleCsyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKXsKKwkJCXR5cGVCaW5kaW5nID0gKChSZWZlcmVuY2VCaW5kaW5nKXR5cGVCaW5kaW5nKS5lbmNsb3NpbmdUeXBlKCk7CisJCX0gZWxzZSB7CisJCQl0eXBlQmluZGluZyA9IG51bGw7CisJCX0KKwl9CisJaWYgKHRva2VucyA9PSBudWxsKSB7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsIHx8IHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCXRva2VucyA9IG5ldyBjaGFyW11bXSB7dGhpcy5zaW1wbGVOYW1lfTsKKwkJfSBlbHNlIHsKKwkJCXRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7CisJCX0KKwkJaWYgKCF0aGlzLmlzQ2FzZVNlbnNpdGl2ZSkgeworCQkJaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CisJCQljaGFyW11bXSBsb3dlckNhc2VUb2tlbnMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJY2hhcltdIHRva2VuID0gdG9rZW5zW2ldOworCQkJCWxvd2VyQ2FzZVRva2Vuc1tpXSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UodG9rZW4pOworCQkJfQorCQkJdG9rZW5zID0gbG93ZXJDYXNlVG9rZW5zOworCQl9CisJfQorCWxvY2F0b3IucmVwb3J0QWNjdXJhdGVSZWZlcmVuY2UoaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LCBpbXBvcnRSZWYuc291cmNlRW5kLCB0b2tlbnMsIGVsZW1lbnQsIGFjY3VyYWN5KTsKK30KKworLyoqCisgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChCaW5kaW5nKQorICovCitwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQmluZGluZyBiaW5kaW5nKSB7CisJaWYgKGJpbmRpbmcgPT0gbnVsbCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJaWYgKCEoYmluZGluZyBpbnN0YW5jZW9mIFR5cGVCaW5kaW5nKSkgcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpYmluZGluZzsKKwlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOworCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSByZXR1cm4gSU5BQ0NVUkFURV9NQVRDSDsKKworCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsICkgeworCQlpbnQgbGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWxGb3JUeXBlKHRoaXMuc2ltcGxlTmFtZSwgdGhpcy5xdWFsaWZpY2F0aW9uLCB0eXBlQmluZGluZyk7CisJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7CisJCQlyZXR1cm4gbGV2ZWw7CisJCX0KKwkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZyl7CisJCQl0eXBlQmluZGluZyA9ICgoUmVmZXJlbmNlQmluZGluZyl0eXBlQmluZGluZykuZW5jbG9zaW5nVHlwZSgpOworCQl9IGVsc2UgeworCQkJdHlwZUJpbmRpbmcgPSBudWxsOworCQl9CisJfQorCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTE4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2IEBACisjIyMgRWNsaXBzZSBKYXZhIENvcmUgU2VhcmNoIG1lc3NhZ2VzLgorCitlbmdpbmUuc2VhcmNoaW5nID0gU2VhcmNoaW5nLi4uCitleGNlcHRpb24ud3JvbmdGb3JtYXQgPSBXcm9uZyBmb3JtYXQKK3Byb2Nlc3MubmFtZSA9IEphdmEgaW5kZXhpbmcKK21hbmFnZXIuZmlsZXNUb0luZGV4ID0gezB9IGZpbGVzIHRvIGluZGV4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0lKb2IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9JSm9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZDRlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9JSm9iLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3Npbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKKworcHVibGljIGludGVyZmFjZSBJSm9iIHsKKworCS8qIFdhaXRpbmcgcG9saWNpZXMgKi8KKwlpbnQgRm9yY2VJbW1lZGlhdGUgPSAxOworCWludCBDYW5jZWxJZk5vdFJlYWR5ID0gMjsKKwlpbnQgV2FpdFVudGlsUmVhZHkgPSAzOworCisJLyogSm9iJ3MgcmVzdWx0ICovCisJYm9vbGVhbiBGQUlMRUQgPSBmYWxzZTsKKwlib29sZWFuIENPTVBMRVRFID0gdHJ1ZTsKKworCS8qKgorCSAqIEFuc3dlciB0cnVlIGlmIHRoZSBqb2IgYmVsb25ncyB0byBhIGdpdmVuIGZhbWlseSAodGFnKQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KTsKKwkvKioKKwkgKiBBc2tzIHRoaXMgam9iIHRvIGNhbmNlbCBpdHMgZXhlY3V0aW9uLiBUaGUgY2FuY2VsbGF0aW9uCisJICogY2FuIHRha2UgYW4gdW5kZXJ0ZXJtaW5lZCBhbW91bnQgb2YgdGltZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjYW5jZWwoKTsKKwkKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBjdXJyZW50IGpvYiwgYW5zd2VyaW5nOgorCSAqICAgICAgUkVTQ0hFRFVMRSBpZiB0aGUgam9iIHNob3VsZCBiZSByZXNjaGVkdWxlZCBsYXRlciBvbgorCSAqICAgICAgQ09NUExFVEUgaWYgdGhlIGpvYiBpcyBvdmVyCisJICovCisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhNzFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3Npbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEpvYk1hbmFnZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwkvKiBxdWV1ZSBvZiBqb2JzIHRvIGV4ZWN1dGUgKi8KKwlwcm90ZWN0ZWQgSUpvYltdIGF3YWl0aW5nSm9icyA9IG5ldyBJSm9iWzEwXTsKKwlwcm90ZWN0ZWQgaW50IGpvYlN0YXJ0ID0gMDsKKwlwcm90ZWN0ZWQgaW50IGpvYkVuZCA9IC0xOworCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGluZyA9IGZhbHNlOworCisJLyogYmFja2dyb3VuZCBwcm9jZXNzaW5nICovCisJcHJvdGVjdGVkIFRocmVhZCB0aHJlYWQ7CisKKwkvKiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBqb2IgZXhlY3V0aW9uIGlzIGVuYWJsZWQgb3Igbm90ICovCisJcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworCisJcHVibGljIHN0YXRpYyBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKKwkvKiBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0aXZhdGlvbiBoYXMgY29tcGxldGVkICovCisJcHVibGljIGJvb2xlYW4gYWN0aXZhdGVkID0gZmFsc2U7CisJCisJcHJpdmF0ZSBpbnQgYXdhaXRpbmdDbGllbnRzID0gMDsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJib3NlKFN0cmluZyBsb2cpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSAiICsgbG9nKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIGV4YWN0bHkgb25jZSwgaW4gYmFja2dyb3VuZCwgYmVmb3JlIHN0YXJ0aW5nIHByb2Nlc3NpbmcgYW55IGpvYgorCSAqLworCXB1YmxpYyB2b2lkIGFjdGl2YXRlUHJvY2Vzc2luZygpIHsKKwkJdGhpcy5hY3RpdmF0ZWQgPSB0cnVlOworCX0KKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGFtb3VudCBvZiBhd2FpdGluZyBqb2JzLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF3YWl0aW5nSm9ic0NvdW50KCkgeworCisJCS8vIHByZXRlbmQgYnVzeSBpbiBjYXNlIGNvbmN1cnJlbnQgam9iIGF0dGVtcHRzIHBlcmZvcm1pbmcgYmVmb3JlIGFjdGl2YXRlZAorCQlpZiAoIWFjdGl2YXRlZCkKKwkJCXJldHVybiAxOworCisJCXJldHVybiBqb2JFbmQgLSBqb2JTdGFydCArIDE7CisKKwl9CisJLyoqCisJICogQW5zd2VycyB0aGUgZmlyc3Qgam9iIGluIHRoZSBxdWV1ZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBqb2IgYXZhaWxhYmxlCisJICogVW50aWwgdGhlIGpvYiBoYXMgY29tcGxldGVkLCB0aGUgam9iIG1hbmFnZXIgd2lsbCBrZWVwIGFuc3dlcmluZyB0aGUgc2FtZSBqb2IuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBJSm9iIGN1cnJlbnRKb2IoKSB7CisKKwkJaWYgKCFlbmFibGVkKQorCQkJcmV0dXJuIG51bGw7CisKKwkJaWYgKGpvYlN0YXJ0IDw9IGpvYkVuZCkgeworCQkJcmV0dXJuIGF3YWl0aW5nSm9ic1tqb2JTdGFydF07CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNhYmxlKCkgeworCQllbmFibGVkID0gZmFsc2U7CisJfQorCS8qKgorCSAqIFJlbW92ZSB0aGUgaW5kZXggZnJvbSBjYWNoZSBmb3IgYSBnaXZlbiBwcm9qZWN0LgorCSAqIFBhc3NpbmcgbnVsbCBhcyBhIGpvYiBmYW1pbHkgZGlzY2FyZHMgdGhlbSBhbGwuCisJICovCisJcHVibGljIHZvaWQgZGlzY2FyZEpvYnMoU3RyaW5nIGpvYkZhbWlseSkgeworCQlib29sZWFuIHdhc0VuYWJsZWQgPSBpc0VuYWJsZWQoKTsKKwkJdHJ5IHsKKwkJCUlKb2IgY3VycmVudEpvYjsKKwkJCS8vIGNhbmNlbCBjdXJyZW50IGpvYiBpZiBpdCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBmYW1pbHkKKwkJCXN5bmNocm9uaXplZCh0aGlzKXsKKwkJCQljdXJyZW50Sm9iID0gdGhpcy5jdXJyZW50Sm9iKCk7CisJCQkJZGlzYWJsZSgpOworCQkJfQorCQkJaWYgKGN1cnJlbnRKb2IgIT0gbnVsbCAKKwkJCQkJJiYgKGpvYkZhbWlseSA9PSBudWxsIHx8IGN1cnJlbnRKb2IuYmVsb25nc1RvKGpvYkZhbWlseSkpKSB7CisJCisJCQkJY3VycmVudEpvYi5jYW5jZWwoKTsKKwkJCQorCQkJCS8vIHdhaXQgdW50aWwgY3VycmVudCBhY3RpdmUgam9iIGhhcyBmaW5pc2hlZAorCQkJCXdoaWxlICh0aHJlYWQgIT0gbnVsbCAmJiBleGVjdXRpbmcpeworCQkJCQl0cnkgeworCQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MCk7CisJCQkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCisJCQkvLyBmbHVzaCBhbmQgY29tcGFjdCBhd2FpdGluZyBqb2JzCisJCQlpbnQgbG9jID0gLTE7CisJCQlzeW5jaHJvbml6ZWQodGhpcykgeworCQkJCWZvciAoaW50IGkgPSBqb2JTdGFydDsgaSA8PSBqb2JFbmQ7IGkrKykgeworCQkJCQljdXJyZW50Sm9iID0gYXdhaXRpbmdKb2JzW2ldOworCQkJCQlhd2FpdGluZ0pvYnNbaV0gPSBudWxsOworCQkJCQlpZiAoIShqb2JGYW1pbHkgPT0gbnVsbAorCQkJCQkJfHwgY3VycmVudEpvYi5iZWxvbmdzVG8oam9iRmFtaWx5KSkpIHsgLy8gY29weSBkb3duLCBjb21wYWN0aW5nCisJCQkJCQlhd2FpdGluZ0pvYnNbKytsb2NdID0gY3VycmVudEpvYjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWN1cnJlbnRKb2IuY2FuY2VsKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJam9iU3RhcnQgPSAwOworCQkJCWpvYkVuZCA9IGxvYzsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh3YXNFbmFibGVkKQorCQkJCWVuYWJsZSgpOworCQl9CisJfQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmFibGUoKSB7CisJCWVuYWJsZWQgPSB0cnVlOworCX0KKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQlyZXR1cm4gZW5hYmxlZDsKKwl9CisJLyoqCisJICogQWR2YW5jZSB0byB0aGUgbmV4dCBhdmFpbGFibGUgam9iLCBvbmNlIHRoZSBjdXJyZW50IG9uZSBoYXMgYmVlbiBjb21wbGV0ZWQuCisJICogTm90ZTogY2xpZW50cyBhd2FpdGluZyB1bnRpbCB0aGUgam9iIGNvdW50IGlzIHplcm8gYXJlIHN0aWxsIHdhaXRpbmcgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbW92ZVRvTmV4dEpvYigpIHsKKworCQkvL2lmICghZW5hYmxlZCkgcmV0dXJuOworCisJCWlmIChqb2JTdGFydCA8PSBqb2JFbmQpIHsKKwkJCWF3YWl0aW5nSm9ic1tqb2JTdGFydCsrXSA9IG51bGw7CisJCQlpZiAoam9iU3RhcnQgPiBqb2JFbmQpIHsKKwkJCQlqb2JTdGFydCA9IDA7CisJCQkJam9iRW5kID0gLTE7CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogV2hlbiBpZGxlLCBnaXZlIGNoYW5jZSB0byBkbyBzb21ldGhpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlJZGxlKGxvbmcgaWRsaW5nVGltZSkgeworCX0KKwkvKioKKwkgKiBUaGlzIEFQSSBpcyBhbGxvd2luZyB0byBydW4gb25lIGpvYiBpbiBjb25jdXJyZW5jZSB3aXRoIGJhY2tncm91bmQgcHJvY2Vzc2luZy4KKwkgKiBJbmRlZWQgc2luY2Ugb3RoZXIgam9icyBhcmUgcGVyZm9ybWVkIGluIGJhY2tncm91bmQsIHJlc291cmNlIHNoYXJpbmcgbWlnaHQgYmUgCisJICogYW4gaXNzdWUuVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uYWxpdHkgYWxsb3dzIGEgZ2l2ZW4gam9iIHRvIGJlIHJ1biB3aXRob3V0CisJICogY29sbGlkaW5nIHdpdGggYmFja2dyb3VuZCBvbmVzLgorCSAqIE5vdGU6IG11bHRpcGxlIHRocmVhZCBtaWdodCBhdHRlbXB0IHRvIHBlcmZvcm0gY29uY3VycmVudCBqb2JzIGF0IHRoZSBzYW1lIHRpbWUsCisJICogCQkJYW5kIHNob3VkIHN5bmNocm9uaXplIChpdCBpcyBkZWxpYmVyYXRlbHkgbGVmdCB0byBjbGllbnRzIHRvIGRlY2lkZSB3aGV0aGVyCisJICoJCQljb25jdXJyZW50IGpvYnMgbWlnaHQgaW50ZXJmZXJlIG9yIG5vdCwgaS5lLiBtdWx0aXBsZSByZWFkIGpvYnMgYXJlIG9rKS4KKwkgKgorCSAqIFdhaXRpbmcgcG9saWN5IGNhbiBiZToKKwkgKiAJCUlKb2JDb25zdGFudHMuRm9yY2VJbW1lZGlhdGVTZWFyY2gKKwkgKiAJCUlKb2JDb25zdGFudHMuQ2FuY2VsSWZOb3RSZWFkeVRvU2VhcmNoCisJICogCQlJSm9iQ29uc3RhbnRzLldhaXRVbnRpbFJlYWR5VG9TZWFyY2gKKwkgKgorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1Db25jdXJyZW50Sm9iKAorCQlJSm9iIHNlYXJjaEpvYiwKKwkJaW50IHdhaXRpbmdQb2xpY3ksCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKKworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiU1RBUlRJTkcgY29uY3VycmVudCBqb2IgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJAorCQlpbnQgY29uY3VycmVudEpvYldvcmsgPSAxMDA7CisJCWlmIChwcm9ncmVzcyAhPSBudWxsKSB7CisJCQlwcm9ncmVzcy5iZWdpblRhc2soIiIsIGNvbmN1cnJlbnRKb2JXb3JrKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWJvb2xlYW4gc3RhdHVzID0gSUpvYi5GQUlMRUQ7CisJCWlmIChhd2FpdGluZ0pvYnNDb3VudCgpID4gMCkgeworCQkJc3dpdGNoICh3YWl0aW5nUG9saWN5KSB7CisKKwkJCQljYXNlIElKb2IuRm9yY2VJbW1lZGlhdGUgOgorCQkJCQlpZiAoVkVSQk9TRSkKKwkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gRm9yY2luZyBpbW1lZGlhdGUgLSAiICsgc2VhcmNoSm9iKTsvLyROT04tTkxTLTEkCisJCQkJCWJvb2xlYW4gd2FzRW5hYmxlZCA9IGlzRW5hYmxlZCgpOworCQkJCQl0cnkgeworCQkJCQkJZGlzYWJsZSgpOyAvLyBwYXVzZSBpbmRleGluZworCQkJCQkJc3RhdHVzID0gc2VhcmNoSm9iLmV4ZWN1dGUocHJvZ3Jlc3MgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzLCBjb25jdXJyZW50Sm9iV29yaykpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWYgKHdhc0VuYWJsZWQpCisJCQkJCQkJZW5hYmxlKCk7CisJCQkJCX0KKwkJCQkJaWYgKFZFUkJPU0UpCisJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkRPTkUgY29uY3VycmVudCBqb2IgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCWNhc2UgSUpvYi5DYW5jZWxJZk5vdFJlYWR5IDoKKwkJCQkJaWYgKFZFUkJPU0UpCisJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IE5PVCBSRUFEWSAtIENhbmNlbGxpbmcgLSAiICsgc2VhcmNoSm9iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlwcm9ncmVzcy5zZXRDYW5jZWxlZCh0cnVlKTsKKwkJCQkJaWYgKFZFUkJPU0UpCisJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkNBTkNFTExFRCBjb25jdXJyZW50IGpvYiAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJSm9iLldhaXRVbnRpbFJlYWR5IDoKKwkJCQkJaW50IGF3YWl0aW5nV29yazsKKwkJCQkJSUpvYiBwcmV2aW91c0pvYiA9IG51bGw7CisJCQkJCUlKb2IgY3VycmVudEpvYjsKKwkJCQkJSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzcyA9IG51bGw7CisJCQkJCWludCB0b3RhbFdvcmsgPSB0aGlzLmF3YWl0aW5nSm9ic0NvdW50KCk7CisJCQkJCWlmIChwcm9ncmVzcyAhPSBudWxsICYmIHRvdGFsV29yayA+IDApIHsKKwkJCQkJCXN1YlByb2dyZXNzID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzcywgY29uY3VycmVudEpvYldvcmsgLyAyKTsKKwkJCQkJCXN1YlByb2dyZXNzLmJlZ2luVGFzaygiIiwgdG90YWxXb3JrKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJY29uY3VycmVudEpvYldvcmsgPSBjb25jdXJyZW50Sm9iV29yayAvIDI7CisJCQkJCX0KKwkJCQkJaW50IG9yaWdpbmFsUHJpb3JpdHkgPSB0aGlzLnRocmVhZC5nZXRQcmlvcml0eSgpOworCQkJCQl0cnkgeworCQkJCQkJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJCQkJCQlpZiAodGhpcy50aHJlYWQgIT0gbnVsbCkgeworCQkJCQkJCQl0aGlzLnRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFByaW9yaXR5KCkpOworCQkJCQkJCX0KKwkJCQkJCQl0aGlzLmF3YWl0aW5nQ2xpZW50cysrOworCQkJCQkJfQorCQkJCQkJd2hpbGUgKChhd2FpdGluZ1dvcmsgPSBhd2FpdGluZ0pvYnNDb3VudCgpKSA+IDApIHsKKwkJCQkJCQlpZiAoc3ViUHJvZ3Jlc3MgIT0gbnVsbCAmJiBzdWJQcm9ncmVzcy5pc0NhbmNlbGVkKCkpCisJCQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJCQkJCWN1cnJlbnRKb2IgPSBjdXJyZW50Sm9iKCk7CisJCQkJCQkJLy8gY3VycmVudEpvYiBjYW4gYmUgbnVsbCB3aGVuIGpvYnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZSBidXQgam9iIG1hbmFnZXIgaXMgbm90IGVuYWJsZWQKKwkJCQkJCQlpZiAoY3VycmVudEpvYiAhPSBudWxsICYmIGN1cnJlbnRKb2IgIT0gcHJldmlvdXNKb2IpIHsKKwkJCQkJCQkJaWYgKFZFUkJPU0UpCisJCQkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IE5PVCBSRUFEWSAtIFdhaXRpbmcgdW50aWwgcmVhZHkgLSAiICsgc2VhcmNoSm9iKTsvLyROT04tTkxTLTEkCisJCQkJCQkJCWlmIChzdWJQcm9ncmVzcyAhPSBudWxsKSB7CisJCQkJCQkJCQlzdWJQcm9ncmVzcy5zdWJUYXNrKAorCQkJCQkJCQkJCVV0aWwuYmluZCgibWFuYWdlci5maWxlc1RvSW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKGF3YWl0aW5nV29yaykpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJc3ViUHJvZ3Jlc3Mud29ya2VkKDEpOworCQkJCQkJCQl9CisJCQkJCQkJCXByZXZpb3VzSm9iID0gY3VycmVudEpvYjsKKwkJCQkJCQl9CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsKKwkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJCQkJCQl0aGlzLmF3YWl0aW5nQ2xpZW50cy0tOworCQkJCQkJCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKSB7CisJCQkJCQkJCXRoaXMudGhyZWFkLnNldFByaW9yaXR5KG9yaWdpbmFsUHJpb3JpdHkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoc3ViUHJvZ3Jlc3MgIT0gbnVsbCkgeworCQkJCQkJc3ViUHJvZ3Jlc3MuZG9uZSgpOworCQkJCQl9CisJCQl9CisJCX0KKwkJc3RhdHVzID0gc2VhcmNoSm9iLmV4ZWN1dGUocHJvZ3Jlc3MgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzLCBjb25jdXJyZW50Sm9iV29yaykpOworCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgeworCQkJcHJvZ3Jlc3MuZG9uZSgpOworCQl9CisJCWlmIChWRVJCT1NFKQorCQkJSm9iTWFuYWdlci52ZXJib3NlKCJET05FIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcHVibGljIGFic3RyYWN0IFN0cmluZyBwcm9jZXNzTmFtZSgpOworCQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXF1ZXN0KElKb2Igam9iKSB7CisKKwkJLy8gYXBwZW5kIHRoZSBqb2IgdG8gdGhlIGxpc3Qgb2Ygb25lcyB0byBwcm9jZXNzIGxhdGVyIG9uCisJCWludCBzaXplID0gYXdhaXRpbmdKb2JzLmxlbmd0aDsKKwkJaWYgKCsram9iRW5kID09IHNpemUpIHsgLy8gd2hlbiBncm93aW5nLCByZWxvY2F0ZSBqb2JzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDAKKwkJCWpvYkVuZCAtPSBqb2JTdGFydDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYXdhaXRpbmdKb2JzLAorCQkJCWpvYlN0YXJ0LAorCQkJCShhd2FpdGluZ0pvYnMgPSBuZXcgSUpvYltzaXplICogMl0pLAorCQkJCTAsCisJCQkJam9iRW5kKTsKKwkJCWpvYlN0YXJ0ID0gMDsKKwkJfQorCQlhd2FpdGluZ0pvYnNbam9iRW5kXSA9IGpvYjsKKwkJaWYgKFZFUkJPU0UpCisJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIlJFUVVFU1RJTkcgam9iIC0gIiArIGpvYik7IC8vJE5PTi1OTFMtMSQKKworCX0KKwkvKioKKwkgKiBGbHVzaCBjdXJyZW50IHN0YXRlCisJICovCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisKKwkJaWYgKHRocmVhZCAhPSBudWxsKSB7CisJCQlkaXNjYXJkSm9icyhudWxsKTsgLy8gZGlzY2FyZCBhbGwgam9icworCQl9IGVsc2UgeworCQkJLyogaW5pdGlhdGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nICovCisJCQl0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsIHRoaXMucHJvY2Vzc05hbWUoKSk7CisJCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworCQkJLy8gbGVzcyBwcmlvcml0YXJ5IGJ5IGRlZmF1bHQsIHByaW9yaXR5IGlzIHJhaXNlZCBpZiBjbGllbnRzIGFyZSBhY3RpdmVseSB3YWl0aW5nIG9uIGl0CisJCQl0aHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFktMSk7IAorCQkJdGhyZWFkLnN0YXJ0KCk7CisJCX0KKwl9CisJLyoqCisJICogSW5maW5pdGUgbG9vcCBwZXJmb3JtaW5nIHJlc291cmNlIGluZGV4aW5nCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCisJCWxvbmcgaWRsaW5nU3RhcnQgPSAtMTsKKwkJYWN0aXZhdGVQcm9jZXNzaW5nKCk7CisJCXRyeSB7CisJCQl3aGlsZSAodGhpcy50aHJlYWQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCUlKb2Igam9iOworCQkJCQlpZiAoKGpvYiA9IGN1cnJlbnRKb2IoKSkgPT0gbnVsbCkgeworCQkJCQkJaWYgKGlkbGluZ1N0YXJ0IDwgMCkKKwkJCQkJCQlpZGxpbmdTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQkJbm90aWZ5SWRsZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGlkbGluZ1N0YXJ0KTsKKwkJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoNTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWRsaW5nU3RhcnQgPSAtMTsKKwkJCQkJfQorCQkJCQlpZiAoVkVSQk9TRSkgeworCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKGF3YWl0aW5nSm9ic0NvdW50KCkgKyAiIGF3YWl0aW5nIGpvYnMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCJTVEFSVElORyB0byBleGVjdXRlIC0gIiArIGpvYik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQl0cnkgeworCQkJCQkJZXhlY3V0aW5nID0gdHJ1ZTsKKwkJCQkJCS8qYm9vbGVhbiBzdGF0dXMgPSAqL2pvYi5leGVjdXRlKG51bGwpOworCQkJCQkJLy9pZiAoc3RhdHVzID09IEZBSUxFRCkgcmVxdWVzdChqb2IpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJZXhlY3V0aW5nID0gZmFsc2U7CisJCQkJCQlpZiAoVkVSQk9TRSkgeworCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRE9ORSBleGVjdXRpbmcgLSAiICsgam9iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJbW92ZVRvTmV4dEpvYigpOworCQkJCQkJaWYgKHRoaXMuYXdhaXRpbmdDbGllbnRzID09IDApIHsKKwkJCQkJCQlUaHJlYWQuc2xlZXAoNTApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeyAvLyBiYWNrZ3JvdW5kIGluZGV4aW5nIHdhcyBpbnRlcnJ1cHRlZAorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAodGhpcy50aHJlYWQgIT0gbnVsbCkgeyAvLyBpZiBub3Qgc2h1dHRpbmcgZG93bgorCQkJCS8vIGxvZyBleGNlcHRpb24KKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLmxvZyhlLCAiQmFja2dyb3VuZCBJbmRleGVyIENyYXNoIFJlY292ZXJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkKKwkJCQkvLyBrZWVwIGpvYiBtYW5hZ2VyIGFsaXZlCisJCQkJdGhpcy5kaXNjYXJkSm9icyhudWxsKTsKKwkJCQl0aGlzLnRocmVhZCA9IG51bGw7CisJCQkJdGhpcy5yZXNldCgpOyAvLyB0aGlzIHdpbGwgZm9yayBhIG5ldyB0aHJlYWQKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9CisJfQorCS8qKgorCSAqIFN0b3AgYmFja2dyb3VuZCBwcm9jZXNzaW5nLCBhbmQgd2FpdCB1bnRpbCB0aGUgY3VycmVudCBqb2IgaXMgY29tcGxldGVkIGJlZm9yZSByZXR1cm5pbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKworCQlkaXNhYmxlKCk7CisJCWRpc2NhcmRKb2JzKG51bGwpOyAvLyB3aWxsIHdhaXQgdW50aWwgY3VycmVudCBleGVjdXRpbmcgam9iIGhhcyBjb21wbGV0ZWQKKwkJVGhyZWFkIHRocmVhZCA9IHRoaXMudGhyZWFkOworCQl0aGlzLnRocmVhZCA9IG51bGw7IC8vIG1hcmsgdGhlIGpvYiBtYW5hZ2VyIGFzIHNodXR0aW5nIGRvd24gc28gdGhhdCB0aGUgdGhyZWFkIHdpbGwgc3RvcCBieSBpdHNlbGYKKwkJdHJ5IHsKKwkJCXRocmVhZC5qb2luKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==